MoarVM-2018.03/MANIFEST0000644000175000017510000021127613253601361014345 0ustar samanthasamanthaMANIFEST .appveyor.yml .dir-locals.el .editorconfig .gitignore .gitmodules .travis.yml 3rdparty/README.md 3rdparty/freebsd/memmem.c 3rdparty/libatomic_ops/.travis.yml 3rdparty/libatomic_ops/AUTHORS 3rdparty/libatomic_ops/COPYING 3rdparty/libatomic_ops/ChangeLog 3rdparty/libatomic_ops/README.md 3rdparty/libatomic_ops/aclocal.m4 3rdparty/libatomic_ops/appveyor.yml 3rdparty/libatomic_ops/autogen.sh 3rdparty/libatomic_ops/compile 3rdparty/libatomic_ops/config.guess 3rdparty/libatomic_ops/config.sub 3rdparty/libatomic_ops/configure 3rdparty/libatomic_ops/configure.ac 3rdparty/libatomic_ops/depcomp 3rdparty/libatomic_ops/doc/LICENSING.txt 3rdparty/libatomic_ops/doc/README.txt 3rdparty/libatomic_ops/doc/README_malloc.txt 3rdparty/libatomic_ops/doc/README_stack.txt 3rdparty/libatomic_ops/doc/README_win32.txt 3rdparty/libatomic_ops/install-sh 3rdparty/libatomic_ops/missing 3rdparty/libatomic_ops/src/Makefile.am 3rdparty/libatomic_ops/src/Makefile.in 3rdparty/libatomic_ops/src/atomic_ops.c 3rdparty/libatomic_ops/src/atomic_ops.h 3rdparty/libatomic_ops/src/atomic_ops/ao_version.h 3rdparty/libatomic_ops/src/atomic_ops/generalize-arithm.h 3rdparty/libatomic_ops/src/atomic_ops/generalize-arithm.template 3rdparty/libatomic_ops/src/atomic_ops/generalize-small.h 3rdparty/libatomic_ops/src/atomic_ops/generalize-small.template 3rdparty/libatomic_ops/src/atomic_ops/generalize.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/README 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/all_acquire_release_volatile.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/all_aligned_atomic_load_store.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/all_atomic_load_store.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/all_atomic_only_load.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/ao_t_is_int.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/ao_t_is_int.template 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/armcc/arm_v6.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/emul_cas.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/aarch64.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/alpha.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/arm.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/avr32.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/cris.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-arithm.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-arithm.template 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-small.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-small.template 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/generic.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/hexagon.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/hppa.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/ia64.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/m68k.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/mips.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/nios2.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/powerpc.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/s390.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/sh.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/sparc.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/tile.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/x86.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/generic_pthread.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/hpc/hppa.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/hpc/ia64.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/ibmc/powerpc.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/icc/ia64.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/acquire_release_volatile.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/acquire_release_volatile.template 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_load.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_load.template 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_store.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/atomic_store.template 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/char_acquire_release_volatile.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/char_atomic_load.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/char_atomic_store.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/double_atomic_load_store.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/int_acquire_release_volatile.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/int_atomic_load.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/int_atomic_store.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_loads_only.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_loads_only.template 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_stores_only.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/ordered_stores_only.template 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/short_acquire_release_volatile.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/short_atomic_load.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/short_atomic_store.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/msftc/arm.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/msftc/common32_defs.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/msftc/x86.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/msftc/x86_64.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/ordered.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/ordered_except_wr.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/read_ordered.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/standard_ao_double_t.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/sunc/sparc.S 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/sunc/sparc.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/sunc/x86.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/test_and_set_t_is_ao_t.h 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/test_and_set_t_is_char.h 3rdparty/libatomic_ops/src/atomic_ops_malloc.c 3rdparty/libatomic_ops/src/atomic_ops_malloc.h 3rdparty/libatomic_ops/src/atomic_ops_stack.c 3rdparty/libatomic_ops/src/atomic_ops_stack.h 3rdparty/libatomic_ops/src/atomic_ops_sysdeps.S 3rdparty/libatomic_ops/src/config.h.in 3rdparty/msinttypes/inttypes.h 3rdparty/msinttypes/stdint.h 3rdparty/sha1/sha1.c 3rdparty/sha1/sha1.h 3rdparty/tinymt/LICENSE.txt 3rdparty/tinymt/README.txt 3rdparty/tinymt/tinymt64.c 3rdparty/tinymt/tinymt64.h 3rdparty/uthash.h Artistic2.txt CREDITS Configure.pl LICENSE README.markdown VERSION build/Makefile.in build/README.md build/auto.pm build/check.mk.in build/config.c.in build/config.h.in build/gen.list build/help.txt build/mk-moar-pc.in build/probe.pm build/setup.pm build/test.txt check.todo docs/6model-parametric-extensions.markdown docs/ChangeLog docs/README.md docs/arg-passing.markdown docs/bootstrap.markdown docs/bytecode.markdown docs/collation.asciidoc docs/debug-server-protocol.md docs/exceptions.markdown docs/extops.markdown docs/gc.markdown docs/interpreter.markdown docs/japhb-todo.txt docs/jit/ir.md docs/jit/overview.org docs/jit/runtime.md docs/jit/tiles.md docs/jit/todo.org docs/moar.pod docs/release_guide.md docs/reveal.md docs/strings.asciidoc lib/MAST/Nodes.nqp lib/MAST/Ops.nqp lib/MAST/Ops.p6 lib/README.md ports/macports/Portfile ports/macports/README.md src/6model/6model.c src/6model/6model.h src/6model/README.md src/6model/bootstrap.c src/6model/bootstrap.h src/6model/containers.c src/6model/containers.h src/6model/parametric.c src/6model/parametric.h src/6model/reprconv.c src/6model/reprconv.h src/6model/reprs.c src/6model/reprs.h src/6model/reprs/CArray.c src/6model/reprs/CArray.h src/6model/reprs/CPPStruct.c src/6model/reprs/CPPStruct.h src/6model/reprs/CPointer.c src/6model/reprs/CPointer.h src/6model/reprs/CStr.c src/6model/reprs/CStr.h src/6model/reprs/CStruct.c src/6model/reprs/CStruct.h src/6model/reprs/CUnion.c src/6model/reprs/CUnion.h src/6model/reprs/ConcBlockingQueue.c src/6model/reprs/ConcBlockingQueue.h src/6model/reprs/ConditionVariable.c src/6model/reprs/ConditionVariable.h src/6model/reprs/Decoder.c src/6model/reprs/Decoder.h src/6model/reprs/HashAttrStore.c src/6model/reprs/HashAttrStore.h src/6model/reprs/KnowHOWAttributeREPR.c src/6model/reprs/KnowHOWAttributeREPR.h src/6model/reprs/KnowHOWREPR.c src/6model/reprs/KnowHOWREPR.h src/6model/reprs/MVMAsyncTask.c src/6model/reprs/MVMAsyncTask.h src/6model/reprs/MVMCFunction.c src/6model/reprs/MVMCFunction.h src/6model/reprs/MVMCallCapture.c src/6model/reprs/MVMCallCapture.h src/6model/reprs/MVMCode.c src/6model/reprs/MVMCode.h src/6model/reprs/MVMCompUnit.c src/6model/reprs/MVMCompUnit.h src/6model/reprs/MVMContext.c src/6model/reprs/MVMContext.h src/6model/reprs/MVMContinuation.c src/6model/reprs/MVMContinuation.h src/6model/reprs/MVMDLLSym.c src/6model/reprs/MVMDLLSym.h src/6model/reprs/MVMException.c src/6model/reprs/MVMException.h src/6model/reprs/MVMHash.c src/6model/reprs/MVMHash.h src/6model/reprs/MVMIter.c src/6model/reprs/MVMIter.h src/6model/reprs/MVMMultiCache.c src/6model/reprs/MVMMultiCache.h src/6model/reprs/MVMNull.c src/6model/reprs/MVMNull.h src/6model/reprs/MVMOSHandle.c src/6model/reprs/MVMOSHandle.h src/6model/reprs/MVMSpeshLog.c src/6model/reprs/MVMSpeshLog.h src/6model/reprs/MVMStaticFrame.c src/6model/reprs/MVMStaticFrame.h src/6model/reprs/MVMStaticFrameSpesh.c src/6model/reprs/MVMStaticFrameSpesh.h src/6model/reprs/MVMString.c src/6model/reprs/MVMString.h src/6model/reprs/MVMThread.c src/6model/reprs/MVMThread.h src/6model/reprs/MultiDimArray.c src/6model/reprs/MultiDimArray.h src/6model/reprs/NFA.c src/6model/reprs/NFA.h src/6model/reprs/NativeCall.c src/6model/reprs/NativeCall.h src/6model/reprs/NativeRef.c src/6model/reprs/NativeRef.h src/6model/reprs/P6bigint.c src/6model/reprs/P6bigint.h src/6model/reprs/P6int.c src/6model/reprs/P6int.h src/6model/reprs/P6num.c src/6model/reprs/P6num.h src/6model/reprs/P6opaque.c src/6model/reprs/P6opaque.h src/6model/reprs/P6str.c src/6model/reprs/P6str.h src/6model/reprs/README.md src/6model/reprs/ReentrantMutex.c src/6model/reprs/ReentrantMutex.h src/6model/reprs/SCRef.c src/6model/reprs/SCRef.h src/6model/reprs/Semaphore.c src/6model/reprs/Semaphore.h src/6model/reprs/Uninstantiable.c src/6model/reprs/Uninstantiable.h src/6model/reprs/VMArray.c src/6model/reprs/VMArray.h src/6model/sc.c src/6model/sc.h src/6model/serialization.c src/6model/serialization.h src/README.md src/bithacks.h src/core/alloc.h src/core/args.c src/core/args.h src/core/bitmap.h src/core/bytecode.c src/core/bytecode.h src/core/bytecodedump.c src/core/bytecodedump.h src/core/callsite.c src/core/callsite.h src/core/callstack.c src/core/callstack.h src/core/coerce.c src/core/coerce.h src/core/compunit.c src/core/compunit.h src/core/continuation.c src/core/continuation.h src/core/dll.c src/core/dll.h src/core/exceptions.c src/core/exceptions.h src/core/ext.c src/core/ext.h src/core/fixedsizealloc.c src/core/fixedsizealloc.h src/core/frame.c src/core/frame.h src/core/hll.c src/core/hll.h src/core/instance.h src/core/intcache.c src/core/intcache.h src/core/interp.c src/core/interp.h src/core/loadbytecode.c src/core/loadbytecode.h src/core/nativecall.c src/core/nativecall.h src/core/nativecall_dyncall.c src/core/nativecall_dyncall.h src/core/nativecall_libffi.c src/core/nativecall_libffi.h src/core/oplabels.h src/core/oplist src/core/ops.c src/core/ops.h src/core/regionalloc.c src/core/regionalloc.h src/core/threadcontext.c src/core/threadcontext.h src/core/threads.c src/core/threads.h src/core/validation.c src/core/validation.h src/core/vector.h src/debug/debugserver.c src/debug/debugserver.h src/gc/allocation.c src/gc/allocation.h src/gc/collect.c src/gc/collect.h src/gc/debug.c src/gc/debug.h src/gc/finalize.c src/gc/finalize.h src/gc/gen2.c src/gc/gen2.h src/gc/objectid.c src/gc/objectid.h src/gc/orchestrate.c src/gc/orchestrate.h src/gc/roots.c src/gc/roots.h src/gc/wb.c src/gc/wb.h src/gc/worklist.c src/gc/worklist.h src/gcc_diag.h src/gen/IGNOREME src/instrument/crossthreadwrite.c src/instrument/crossthreadwrite.h src/instrument/line_coverage.c src/instrument/line_coverage.h src/io/asyncsocket.c src/io/asyncsocket.h src/io/asyncsocketudp.c src/io/asyncsocketudp.h src/io/dirops.c src/io/dirops.h src/io/eventloop.c src/io/eventloop.h src/io/fileops.c src/io/fileops.h src/io/filewatchers.c src/io/filewatchers.h src/io/io.c src/io/io.h src/io/procops.c src/io/procops.h src/io/signals.c src/io/signals.h src/io/syncfile.c src/io/syncfile.h src/io/syncsocket.c src/io/syncsocket.h src/io/timers.c src/io/timers.h src/jit/compile.c src/jit/compile.h src/jit/core_templates.expr src/jit/expr.c src/jit/expr.h src/jit/expr_ops.h src/jit/graph.c src/jit/graph.h src/jit/internal.h src/jit/label.c src/jit/label.h src/jit/linear_scan.c src/jit/log.c src/jit/log.h src/jit/macro.expr src/jit/register.h src/jit/stub.c src/jit/tile.c src/jit/tile.h src/jit/unsafe.expr src/jit/x64/arch.c src/jit/x64/arch.h src/jit/x64/emit.dasc src/jit/x64/tile_decl.h src/jit/x64/tile_pattern.tile src/jit/x64/tiles.dasc src/main.c src/mast/compiler.c src/mast/compiler.h src/mast/driver.c src/mast/driver.h src/mast/nodes.h src/math/bigintops.c src/math/bigintops.h src/math/num.c src/math/num.h src/memdebug.h src/moar.c src/moar.h src/platform/inttypes.h src/platform/io.h src/platform/memmem.h src/platform/mmap.h src/platform/posix/io.c src/platform/posix/mmap.c src/platform/posix/time.c src/platform/setjmp.h src/platform/stdint.h src/platform/sys.c src/platform/sys.h src/platform/threads.h src/platform/time.h src/platform/win32/io.c src/platform/win32/mmap.c src/platform/win32/time.c src/profiler/heapsnapshot.c src/profiler/heapsnapshot.h src/profiler/instrument.c src/profiler/instrument.h src/profiler/log.c src/profiler/log.h src/profiler/profile.c src/profiler/profile.h src/profiler/telemeh.c src/profiler/telemeh.h src/spesh/arg_guard.c src/spesh/arg_guard.h src/spesh/args.c src/spesh/args.h src/spesh/candidate.c src/spesh/candidate.h src/spesh/codegen.c src/spesh/codegen.h src/spesh/dead_bb_elimination.c src/spesh/dead_bb_elimination.h src/spesh/deopt.c src/spesh/deopt.h src/spesh/dump.c src/spesh/dump.h src/spesh/facts.c src/spesh/facts.h src/spesh/graph.c src/spesh/graph.h src/spesh/inline.c src/spesh/inline.h src/spesh/iterator.c src/spesh/iterator.h src/spesh/log.c src/spesh/log.h src/spesh/lookup.c src/spesh/lookup.h src/spesh/manipulate.c src/spesh/manipulate.h src/spesh/optimize.c src/spesh/optimize.h src/spesh/osr.c src/spesh/osr.h src/spesh/plan.c src/spesh/plan.h src/spesh/stats.c src/spesh/stats.h src/spesh/threshold.c src/spesh/threshold.h src/spesh/worker.c src/spesh/worker.h src/strings/ascii.c src/strings/ascii.h src/strings/decode_stream.c src/strings/decode_stream.h src/strings/iter.h src/strings/latin1.c src/strings/latin1.h src/strings/nfg.c src/strings/nfg.h src/strings/normalize.c src/strings/normalize.h src/strings/ops.c src/strings/ops.h src/strings/parse_num.c src/strings/parse_num.h src/strings/unicode.h src/strings/unicode_db.c src/strings/unicode_gen.h src/strings/unicode_ops.c src/strings/unicode_ops.h src/strings/unicode_uca.c src/strings/utf16.c src/strings/utf16.h src/strings/utf8.c src/strings/utf8.h src/strings/utf8_c8.c src/strings/utf8_c8.h src/strings/windows1252.c src/strings/windows1252.h src/types.h tools/Generate-Collation-Data.p6 tools/UCD-download.p6 tools/colorize_spesh.p6 tools/count-jit-bail-ops.p6 tools/dynvarcost tools/expr-template-compiler.pl tools/expr_ops.pm tools/generate_encoding_codetables.p6 tools/gh-pages-deploy_key.enc tools/graph_spesh.p6 tools/interp_backtrace_enhancer.p6 tools/jit-bisect.pl tools/jit-comparify-asm.pl tools/jit-dump.pl tools/lib/ArrayCompose.pm6 tools/lib/BitfieldPacking.pm6 tools/lib/Collation-Gram.pm6 tools/lib/MAST/.empty tools/make-index.sh tools/moar-gdb.py tools/moarvm.org_releases.pl tools/parse_coverage_report.p6 tools/parse_jitgraph.p6 tools/release.sh tools/sexpr.pm tools/spesh-bisect.pl tools/spesh-time.p6 tools/spesh_diff.p6 tools/tiler-table-generator.pl tools/timeout.pm tools/trace_spesh_optimizer.gdb tools/ucd2c.pl tools/update-gh-pages.sh tools/update_ops.p6 3rdparty/dyncall/.gitignore 3rdparty/dyncall/AUTHORS 3rdparty/dyncall/BUGS 3rdparty/dyncall/CMakeLists.txt 3rdparty/dyncall/ChangeLog 3rdparty/dyncall/LICENSE 3rdparty/dyncall/Makefile.M 3rdparty/dyncall/Makefile.embedded 3rdparty/dyncall/Makefile.generic 3rdparty/dyncall/Nmakefile 3rdparty/dyncall/README 3rdparty/dyncall/ToDo 3rdparty/dyncall/autovar/LICENSE.txt 3rdparty/dyncall/autovar/README.txt 3rdparty/dyncall/autovar/autovar_ABI.h 3rdparty/dyncall/autovar/autovar_ARCH.h 3rdparty/dyncall/autovar/autovar_CC.h 3rdparty/dyncall/autovar/autovar_OS.h 3rdparty/dyncall/autovar/autovar_OSFAMILY.h 3rdparty/dyncall/buildsys/cmake/Modules/FindDynCall.cmake 3rdparty/dyncall/buildsys/cmake/Modules/FindDynCallback.cmake 3rdparty/dyncall/buildsys/cmake/Modules/FindDynLoad.cmake 3rdparty/dyncall/buildsys/cmake/Modules/UseLATEX.cmake 3rdparty/dyncall/buildsys/dynmake/Makefile.base.M 3rdparty/dyncall/buildsys/dynmake/dynmake.bat 3rdparty/dyncall/buildsys/dynmake/dynmake.sh 3rdparty/dyncall/buildsys/lua/Makefile 3rdparty/dyncall/buildsys/lua/README.txt 3rdparty/dyncall/buildsys/lua/bootstrap.sh 3rdparty/dyncall/buildsys/lua/cleanup.sh 3rdparty/dyncall/buildsys/lua/mkfile 3rdparty/dyncall/buildsys/lua/setenv.sh 3rdparty/dyncall/buildsys/mk/app.mk 3rdparty/dyncall/buildsys/mk/dirs.mk 3rdparty/dyncall/buildsys/mk/epilog.mk 3rdparty/dyncall/buildsys/mk/lib.mk 3rdparty/dyncall/buildsys/mk/pcc.mk 3rdparty/dyncall/buildsys/mk/prolog.mk 3rdparty/dyncall/buildsys/nmake/common.nmake 3rdparty/dyncall/buildsys/nmake/epilog.nmake 3rdparty/dyncall/buildsys/nmake/prolog.nmake 3rdparty/dyncall/buildsys/nmake/tool_gcc.nmake 3rdparty/dyncall/buildsys/nmake/tool_msvc.nmake 3rdparty/dyncall/buildsys/scripts/batch-build-linux.sh 3rdparty/dyncall/buildsys/scripts/batch-build-minix.sh 3rdparty/dyncall/buildsys/scripts/batch-build-psp.sh 3rdparty/dyncall/buildsys/scripts/conf-nds.bat 3rdparty/dyncall/buildsys/scripts/setenv-cross-ios.sh 3rdparty/dyncall/buildsys/scripts/setenv-sdk-ios.sh 3rdparty/dyncall/buildsys/vs2005/dyncall/dyncall.vcproj 3rdparty/dyncall/buildsys/vs2005/test_plain/test_plain.vcproj 3rdparty/dyncall/buildsys/vs2005/vs2005.sln 3rdparty/dyncall/configure 3rdparty/dyncall/configure.bat 3rdparty/dyncall/configure.rc 3rdparty/dyncall/doc/Description.txt 3rdparty/dyncall/doc/License.txt 3rdparty/dyncall/doc/Makefile.generic 3rdparty/dyncall/doc/README-Cross.txt 3rdparty/dyncall/doc/README.CMake 3rdparty/dyncall/doc/README.Generic 3rdparty/dyncall/doc/README.MacOSX 3rdparty/dyncall/doc/README.Minix 3rdparty/dyncall/doc/README.NDS 3rdparty/dyncall/doc/README.PSP 3rdparty/dyncall/doc/README.SunOS 3rdparty/dyncall/doc/README.Windows 3rdparty/dyncall/doc/README.embedded 3rdparty/dyncall/doc/README.iOS 3rdparty/dyncall/doc/manual/CMakeLists.txt 3rdparty/dyncall/doc/manual/Makefile.generic 3rdparty/dyncall/doc/manual/Nmakefile 3rdparty/dyncall/doc/manual/callconvs/callconv_arm32.tex 3rdparty/dyncall/doc/manual/callconvs/callconv_arm64.tex 3rdparty/dyncall/doc/manual/callconvs/callconv_mips.tex 3rdparty/dyncall/doc/manual/callconvs/callconv_mips64.tex 3rdparty/dyncall/doc/manual/callconvs/callconv_ppc32.tex 3rdparty/dyncall/doc/manual/callconvs/callconv_ppc64.tex 3rdparty/dyncall/doc/manual/callconvs/callconv_sparc.tex 3rdparty/dyncall/doc/manual/callconvs/callconv_sparc64.tex 3rdparty/dyncall/doc/manual/callconvs/callconv_x64.tex 3rdparty/dyncall/doc/manual/callconvs/callconv_x86.tex 3rdparty/dyncall/doc/manual/dyncall_logo.eps 3rdparty/dyncall/doc/manual/dyncall_logo.pdf 3rdparty/dyncall/doc/manual/dyncall_logo.svg 3rdparty/dyncall/doc/manual/dyncall_watermark.eps 3rdparty/dyncall/doc/manual/dyncall_watermark.pdf 3rdparty/dyncall/doc/manual/dyncall_watermark.svg 3rdparty/dyncall/doc/manual/manual.tex 3rdparty/dyncall/doc/manual/manual_bindings.tex 3rdparty/dyncall/doc/manual/manual_build.tex 3rdparty/dyncall/doc/manual/manual_cc.tex 3rdparty/dyncall/doc/manual/manual_design.tex 3rdparty/dyncall/doc/manual/manual_devel.tex 3rdparty/dyncall/doc/manual/manual_dyncall_api.tex 3rdparty/dyncall/doc/manual/manual_dyncallback_api.tex 3rdparty/dyncall/doc/manual/manual_dynload_api.tex 3rdparty/dyncall/doc/manual/manual_epilog.tex 3rdparty/dyncall/doc/manual/manual_literature.tex 3rdparty/dyncall/doc/manual/manual_motivation.tex 3rdparty/dyncall/doc/manual/manual_overview.tex 3rdparty/dyncall/doc/manual/manual_tex4ht.cfg 3rdparty/dyncall/doc/manual/manual_title.tex 3rdparty/dyncall/dynMakefile 3rdparty/dyncall/dyncall/CMakeLists.txt 3rdparty/dyncall/dyncall/DynCallConfig.cmake 3rdparty/dyncall/dyncall/Makefile.M 3rdparty/dyncall/dyncall/Makefile.embedded 3rdparty/dyncall/dyncall/Makefile.generic 3rdparty/dyncall/dyncall/Nmakefile 3rdparty/dyncall/dyncall/README-Developer.txt 3rdparty/dyncall/dyncall/README.txt 3rdparty/dyncall/dyncall/TODO 3rdparty/dyncall/dyncall/dynMakefile 3rdparty/dyncall/dyncall/dyncall.3 3rdparty/dyncall/dyncall/dyncall.h 3rdparty/dyncall/dyncall/dyncall_alloc.h 3rdparty/dyncall/dyncall/dyncall_api.c 3rdparty/dyncall/dyncall/dyncall_call.S 3rdparty/dyncall/dyncall/dyncall_call_arm32_arm.S 3rdparty/dyncall/dyncall/dyncall_call_arm32_arm.h 3rdparty/dyncall/dyncall/dyncall_call_arm32_arm_armhf.S 3rdparty/dyncall/dyncall/dyncall_call_arm32_arm_armhf.h 3rdparty/dyncall/dyncall/dyncall_call_arm32_thumb.h 3rdparty/dyncall/dyncall/dyncall_call_arm32_thumb_apple.s 3rdparty/dyncall/dyncall/dyncall_call_arm32_thumb_armhf.S 3rdparty/dyncall/dyncall/dyncall_call_arm32_thumb_gas.s 3rdparty/dyncall/dyncall/dyncall_call_arm64.S 3rdparty/dyncall/dyncall/dyncall_call_arm64.h 3rdparty/dyncall/dyncall/dyncall_call_mips.h 3rdparty/dyncall/dyncall/dyncall_call_mips_eabi.h 3rdparty/dyncall/dyncall/dyncall_call_mips_eabi_gas.s 3rdparty/dyncall/dyncall/dyncall_call_mips_gas.S 3rdparty/dyncall/dyncall/dyncall_call_mips_n32.h 3rdparty/dyncall/dyncall/dyncall_call_mips_n32_gas.s 3rdparty/dyncall/dyncall/dyncall_call_mips_n64.h 3rdparty/dyncall/dyncall/dyncall_call_mips_n64_gas.s 3rdparty/dyncall/dyncall/dyncall_call_mips_o32.h 3rdparty/dyncall/dyncall/dyncall_call_mips_o32_gas.s 3rdparty/dyncall/dyncall/dyncall_call_ppc32.S 3rdparty/dyncall/dyncall/dyncall_call_ppc32.h 3rdparty/dyncall/dyncall/dyncall_call_ppc64.S 3rdparty/dyncall/dyncall/dyncall_call_ppc64.h 3rdparty/dyncall/dyncall/dyncall_call_sparc.S 3rdparty/dyncall/dyncall/dyncall_call_sparc.h 3rdparty/dyncall/dyncall/dyncall_call_sparc64.S 3rdparty/dyncall/dyncall/dyncall_call_sparc64.h 3rdparty/dyncall/dyncall/dyncall_call_sparc_v9.S 3rdparty/dyncall/dyncall/dyncall_call_sparc_v9.h 3rdparty/dyncall/dyncall/dyncall_call_x64-att.S 3rdparty/dyncall/dyncall/dyncall_call_x64.S 3rdparty/dyncall/dyncall/dyncall_call_x64.h 3rdparty/dyncall/dyncall/dyncall_call_x64_generic_masm.asm 3rdparty/dyncall/dyncall/dyncall_call_x86.S 3rdparty/dyncall/dyncall/dyncall_call_x86.h 3rdparty/dyncall/dyncall/dyncall_call_x86_8a.s 3rdparty/dyncall/dyncall/dyncall_call_x86_generic_masm.asm 3rdparty/dyncall/dyncall/dyncall_call_x86_nasm.asm 3rdparty/dyncall/dyncall/dyncall_callf.c 3rdparty/dyncall/dyncall/dyncall_callf.h 3rdparty/dyncall/dyncall/dyncall_callvm.c 3rdparty/dyncall/dyncall/dyncall_callvm.h 3rdparty/dyncall/dyncall/dyncall_callvm_arm32_arm.c 3rdparty/dyncall/dyncall/dyncall_callvm_arm32_arm.h 3rdparty/dyncall/dyncall/dyncall_callvm_arm32_arm_armhf.c 3rdparty/dyncall/dyncall/dyncall_callvm_arm32_arm_armhf.h 3rdparty/dyncall/dyncall/dyncall_callvm_arm32_thumb.c 3rdparty/dyncall/dyncall/dyncall_callvm_arm32_thumb.h 3rdparty/dyncall/dyncall/dyncall_callvm_arm64.c 3rdparty/dyncall/dyncall/dyncall_callvm_arm64.h 3rdparty/dyncall/dyncall/dyncall_callvm_base.c 3rdparty/dyncall/dyncall/dyncall_callvm_mips.c 3rdparty/dyncall/dyncall/dyncall_callvm_mips.h 3rdparty/dyncall/dyncall/dyncall_callvm_mips_eabi.c 3rdparty/dyncall/dyncall/dyncall_callvm_mips_eabi.h 3rdparty/dyncall/dyncall/dyncall_callvm_mips_n32.c 3rdparty/dyncall/dyncall/dyncall_callvm_mips_n64.c 3rdparty/dyncall/dyncall/dyncall_callvm_mips_n64.h 3rdparty/dyncall/dyncall/dyncall_callvm_mips_o32.c 3rdparty/dyncall/dyncall/dyncall_callvm_mips_o32.h 3rdparty/dyncall/dyncall/dyncall_callvm_ppc32.c 3rdparty/dyncall/dyncall/dyncall_callvm_ppc32.h 3rdparty/dyncall/dyncall/dyncall_callvm_ppc64.c 3rdparty/dyncall/dyncall/dyncall_callvm_ppc64.h 3rdparty/dyncall/dyncall/dyncall_callvm_sparc.c 3rdparty/dyncall/dyncall/dyncall_callvm_sparc.h 3rdparty/dyncall/dyncall/dyncall_callvm_sparc64.c 3rdparty/dyncall/dyncall/dyncall_callvm_sparc64.h 3rdparty/dyncall/dyncall/dyncall_callvm_sparc_v9.c 3rdparty/dyncall/dyncall/dyncall_callvm_sparc_v9.h 3rdparty/dyncall/dyncall/dyncall_callvm_x64.c 3rdparty/dyncall/dyncall/dyncall_callvm_x64.h 3rdparty/dyncall/dyncall/dyncall_callvm_x86.c 3rdparty/dyncall/dyncall/dyncall_callvm_x86.h 3rdparty/dyncall/dyncall/dyncall_config.h 3rdparty/dyncall/dyncall/dyncall_macros.h 3rdparty/dyncall/dyncall/dyncall_signature.h 3rdparty/dyncall/dyncall/dyncall_struct.c 3rdparty/dyncall/dyncall/dyncall_struct.h 3rdparty/dyncall/dyncall/dyncall_types.h 3rdparty/dyncall/dyncall/dyncall_utils.h 3rdparty/dyncall/dyncall/dyncall_value.h 3rdparty/dyncall/dyncall/dyncall_vector.c 3rdparty/dyncall/dyncall/dyncall_vector.h 3rdparty/dyncall/dyncall/gen-masm.sh 3rdparty/dyncall/dyncall/mkfile 3rdparty/dyncall/dyncallback/CMakeLists.txt 3rdparty/dyncall/dyncallback/DynCallbackConfig.cmake 3rdparty/dyncall/dyncallback/Makefile.M 3rdparty/dyncall/dyncallback/Makefile.embedded 3rdparty/dyncall/dyncallback/Makefile.generic 3rdparty/dyncall/dyncallback/Nmakefile 3rdparty/dyncall/dyncallback/README.txt 3rdparty/dyncall/dyncallback/TODO 3rdparty/dyncall/dyncallback/dynMakefile 3rdparty/dyncall/dyncallback/dyncall_alloc_wx.c 3rdparty/dyncall/dyncallback/dyncall_alloc_wx.h 3rdparty/dyncall/dyncallback/dyncall_alloc_wx_malloc.c 3rdparty/dyncall/dyncallback/dyncall_alloc_wx_mmap.c 3rdparty/dyncall/dyncallback/dyncall_alloc_wx_win32.c 3rdparty/dyncall/dyncallback/dyncall_args.c 3rdparty/dyncall/dyncallback/dyncall_args.h 3rdparty/dyncall/dyncallback/dyncall_args_arm32_arm.c 3rdparty/dyncall/dyncallback/dyncall_args_arm32_arm.h 3rdparty/dyncall/dyncallback/dyncall_args_arm32_thumb.c 3rdparty/dyncall/dyncallback/dyncall_args_arm32_thumb.h 3rdparty/dyncall/dyncallback/dyncall_args_arm64.c 3rdparty/dyncall/dyncallback/dyncall_args_mips.c 3rdparty/dyncall/dyncallback/dyncall_args_mips.h 3rdparty/dyncall/dyncallback/dyncall_args_ppc32.c 3rdparty/dyncall/dyncallback/dyncall_args_ppc32.h 3rdparty/dyncall/dyncallback/dyncall_args_ppc32_sysv.c 3rdparty/dyncall/dyncallback/dyncall_args_ppc64.c 3rdparty/dyncall/dyncallback/dyncall_args_ppc64.h 3rdparty/dyncall/dyncallback/dyncall_args_sparc32.c 3rdparty/dyncall/dyncallback/dyncall_args_sparc32.h 3rdparty/dyncall/dyncallback/dyncall_args_sparc64.c 3rdparty/dyncall/dyncallback/dyncall_args_sparc64.h 3rdparty/dyncall/dyncallback/dyncall_args_x64.c 3rdparty/dyncall/dyncallback/dyncall_args_x64.h 3rdparty/dyncall/dyncallback/dyncall_args_x86.c 3rdparty/dyncall/dyncallback/dyncall_args_x86.h 3rdparty/dyncall/dyncallback/dyncall_callback.c 3rdparty/dyncall/dyncallback/dyncall_callback.h 3rdparty/dyncall/dyncallback/dyncall_callback_arch.S 3rdparty/dyncall/dyncallback/dyncall_callback_arm32_arm.c 3rdparty/dyncall/dyncallback/dyncall_callback_arm32_arm.h 3rdparty/dyncall/dyncallback/dyncall_callback_arm32_arm_apple.s 3rdparty/dyncall/dyncallback/dyncall_callback_arm32_arm_gas.s 3rdparty/dyncall/dyncallback/dyncall_callback_arm32_thumb.c 3rdparty/dyncall/dyncallback/dyncall_callback_arm32_thumb.h 3rdparty/dyncall/dyncallback/dyncall_callback_arm32_thumb_apple.s 3rdparty/dyncall/dyncallback/dyncall_callback_arm32_thumb_gas.s 3rdparty/dyncall/dyncallback/dyncall_callback_arm64.c 3rdparty/dyncall/dyncallback/dyncall_callback_arm64.s 3rdparty/dyncall/dyncallback/dyncall_callback_mips.c 3rdparty/dyncall/dyncallback/dyncall_callback_mips.h 3rdparty/dyncall/dyncallback/dyncall_callback_ppc32.S 3rdparty/dyncall/dyncallback/dyncall_callback_ppc32.c 3rdparty/dyncall/dyncallback/dyncall_callback_ppc32.h 3rdparty/dyncall/dyncallback/dyncall_callback_ppc32_apple.s 3rdparty/dyncall/dyncallback/dyncall_callback_ppc64.S 3rdparty/dyncall/dyncallback/dyncall_callback_ppc64.c 3rdparty/dyncall/dyncallback/dyncall_callback_ppc64.h 3rdparty/dyncall/dyncallback/dyncall_callback_sparc32.c 3rdparty/dyncall/dyncallback/dyncall_callback_sparc32.h 3rdparty/dyncall/dyncallback/dyncall_callback_sparc32.s 3rdparty/dyncall/dyncallback/dyncall_callback_sparc64.c 3rdparty/dyncall/dyncallback/dyncall_callback_sparc64.s 3rdparty/dyncall/dyncallback/dyncall_callback_x64.S 3rdparty/dyncall/dyncallback/dyncall_callback_x64.c 3rdparty/dyncall/dyncallback/dyncall_callback_x64.h 3rdparty/dyncall/dyncallback/dyncall_callback_x64_masm.asm 3rdparty/dyncall/dyncallback/dyncall_callback_x86.S 3rdparty/dyncall/dyncallback/dyncall_callback_x86.c 3rdparty/dyncall/dyncallback/dyncall_callback_x86.h 3rdparty/dyncall/dyncallback/dyncall_callback_x86_8a.s 3rdparty/dyncall/dyncallback/dyncall_callback_x86_masm.asm 3rdparty/dyncall/dyncallback/dyncall_thunk.c 3rdparty/dyncall/dyncallback/dyncall_thunk.h 3rdparty/dyncall/dyncallback/dyncall_thunk_arm32_arm.c 3rdparty/dyncall/dyncallback/dyncall_thunk_arm32_arm.h 3rdparty/dyncall/dyncallback/dyncall_thunk_arm32_thumb.c 3rdparty/dyncall/dyncallback/dyncall_thunk_arm32_thumb.h 3rdparty/dyncall/dyncallback/dyncall_thunk_arm64.c 3rdparty/dyncall/dyncallback/dyncall_thunk_arm64.h 3rdparty/dyncall/dyncallback/dyncall_thunk_mips.c 3rdparty/dyncall/dyncallback/dyncall_thunk_mips.h 3rdparty/dyncall/dyncallback/dyncall_thunk_ppc32.c 3rdparty/dyncall/dyncallback/dyncall_thunk_ppc32.h 3rdparty/dyncall/dyncallback/dyncall_thunk_ppc32_sysv.c 3rdparty/dyncall/dyncallback/dyncall_thunk_ppc64.c 3rdparty/dyncall/dyncallback/dyncall_thunk_ppc64.h 3rdparty/dyncall/dyncallback/dyncall_thunk_sparc32.c 3rdparty/dyncall/dyncallback/dyncall_thunk_sparc32.h 3rdparty/dyncall/dyncallback/dyncall_thunk_sparc64.c 3rdparty/dyncall/dyncallback/dyncall_thunk_sparc64.h 3rdparty/dyncall/dyncallback/dyncall_thunk_x64.c 3rdparty/dyncall/dyncallback/dyncall_thunk_x64.h 3rdparty/dyncall/dyncallback/dyncall_thunk_x86.c 3rdparty/dyncall/dyncallback/dyncall_thunk_x86.h 3rdparty/dyncall/dyncallback/dyncallback.3 3rdparty/dyncall/dyncallback/gen-masm.sh 3rdparty/dyncall/dyncallback/mkfile 3rdparty/dyncall/dynload/CMakeLists.txt 3rdparty/dyncall/dynload/DynLoadConfig.cmake 3rdparty/dyncall/dynload/Makefile.M 3rdparty/dyncall/dynload/Makefile.embedded 3rdparty/dyncall/dynload/Makefile.generic 3rdparty/dyncall/dynload/Nmakefile 3rdparty/dyncall/dynload/README.txt 3rdparty/dyncall/dynload/TODO 3rdparty/dyncall/dynload/dynMakefile 3rdparty/dyncall/dynload/dynload.3 3rdparty/dyncall/dynload/dynload.c 3rdparty/dyncall/dynload/dynload.h 3rdparty/dyncall/dynload/dynload_alloc.h 3rdparty/dyncall/dynload/dynload_darwin.c 3rdparty/dyncall/dynload/dynload_syms.c 3rdparty/dyncall/dynload/dynload_syms_elf.c 3rdparty/dyncall/dynload/dynload_syms_mach-o.c 3rdparty/dyncall/dynload/dynload_syms_pe.c 3rdparty/dyncall/dynload/dynload_unix.c 3rdparty/dyncall/dynload/dynload_windows.c 3rdparty/dyncall/mkfile 3rdparty/dyncall/portasm/README.txt 3rdparty/dyncall/portasm/gen-masm.sh 3rdparty/dyncall/portasm/portasm-arm.S 3rdparty/dyncall/portasm/portasm-ppc.S 3rdparty/dyncall/portasm/portasm-x64-att.S 3rdparty/dyncall/portasm/portasm-x86.S 3rdparty/dyncall/test/CMakeLists.txt 3rdparty/dyncall/test/Makefile.M 3rdparty/dyncall/test/Makefile.embedded 3rdparty/dyncall/test/Makefile.generic 3rdparty/dyncall/test/Nmakefile 3rdparty/dyncall/test/arm-thumb-interwork/Makefile-default.config 3rdparty/dyncall/test/arm-thumb-interwork/Makefile-thumb.config 3rdparty/dyncall/test/arm-thumb-interwork/README.txt 3rdparty/dyncall/test/arm-thumb-interwork/build.sh 3rdparty/dyncall/test/call_suite/Makefile.M 3rdparty/dyncall/test/call_suite/Makefile.embedded 3rdparty/dyncall/test/call_suite/Makefile.generic 3rdparty/dyncall/test/call_suite/Nmakefile 3rdparty/dyncall/test/call_suite/README.txt 3rdparty/dyncall/test/call_suite/cases.c 3rdparty/dyncall/test/call_suite/cases.h 3rdparty/dyncall/test/call_suite/cases.txt 3rdparty/dyncall/test/call_suite/config.lua 3rdparty/dyncall/test/call_suite/design.txt 3rdparty/dyncall/test/call_suite/dynMakefile 3rdparty/dyncall/test/call_suite/globals.c 3rdparty/dyncall/test/call_suite/globals.h 3rdparty/dyncall/test/call_suite/invoke.c 3rdparty/dyncall/test/call_suite/main.c 3rdparty/dyncall/test/call_suite/mk-cases.lua 3rdparty/dyncall/test/call_suite/mkfile 3rdparty/dyncall/test/call_suite/rand-sig.lua 3rdparty/dyncall/test/callback_plain/CMakeLists.txt 3rdparty/dyncall/test/callback_plain/Makefile.M 3rdparty/dyncall/test/callback_plain/Makefile.embedded 3rdparty/dyncall/test/callback_plain/Makefile.generic 3rdparty/dyncall/test/callback_plain/Nmakefile 3rdparty/dyncall/test/callback_plain/callback_plain.c 3rdparty/dyncall/test/callback_plain/dynMakefile 3rdparty/dyncall/test/callback_plain/mkfile 3rdparty/dyncall/test/callback_suite/CMakeLists.txt 3rdparty/dyncall/test/callback_suite/Makefile.M 3rdparty/dyncall/test/callback_suite/Makefile.embedded 3rdparty/dyncall/test/callback_suite/Makefile.generic 3rdparty/dyncall/test/callback_suite/Nmakefile 3rdparty/dyncall/test/callback_suite/README.txt 3rdparty/dyncall/test/callback_suite/_auto_config.h 3rdparty/dyncall/test/callback_suite/_auto_invoke_macros.h 3rdparty/dyncall/test/callback_suite/_auto_invoke_table.h 3rdparty/dyncall/test/callback_suite/_auto_invokers.h 3rdparty/dyncall/test/callback_suite/_auto_signatures.txt 3rdparty/dyncall/test/callback_suite/_auto_sigstrings.h 3rdparty/dyncall/test/callback_suite/config-random.lua 3rdparty/dyncall/test/callback_suite/config-stress1.lua 3rdparty/dyncall/test/callback_suite/config.lua 3rdparty/dyncall/test/callback_suite/do_test.c 3rdparty/dyncall/test/callback_suite/dynMakefile 3rdparty/dyncall/test/callback_suite/dyncall_value_set.h 3rdparty/dyncall/test/callback_suite/env.c 3rdparty/dyncall/test/callback_suite/env.h 3rdparty/dyncall/test/callback_suite/handler.c 3rdparty/dyncall/test/callback_suite/invokers.c 3rdparty/dyncall/test/callback_suite/invokers.h 3rdparty/dyncall/test/callback_suite/main.c 3rdparty/dyncall/test/callback_suite/make-config.lua 3rdparty/dyncall/test/callback_suite/make-cstrings.lua 3rdparty/dyncall/test/callback_suite/make-invoke-macros.lua 3rdparty/dyncall/test/callback_suite/make-invoke-table.lua 3rdparty/dyncall/test/callback_suite/make-invokers.lua 3rdparty/dyncall/test/callback_suite/make-signatures.lua 3rdparty/dyncall/test/callback_suite/mkfile 3rdparty/dyncall/test/callback_suite/print.c 3rdparty/dyncall/test/callback_suite/print.h 3rdparty/dyncall/test/callback_suite/signature_utils.c 3rdparty/dyncall/test/callback_suite/signature_utils.h 3rdparty/dyncall/test/callback_suite/sigstrings.c 3rdparty/dyncall/test/callback_suite/sigstrings.h 3rdparty/dyncall/test/callback_suite/stress1.cfg 3rdparty/dyncall/test/callf/CMakeLists.txt 3rdparty/dyncall/test/callf/Makefile.M 3rdparty/dyncall/test/callf/Makefile.embedded 3rdparty/dyncall/test/callf/Makefile.generic 3rdparty/dyncall/test/callf/Nmakefile 3rdparty/dyncall/test/callf/dynMakefile 3rdparty/dyncall/test/callf/main.c 3rdparty/dyncall/test/callf/mkfile 3rdparty/dyncall/test/common/platformInit.h 3rdparty/dyncall/test/dynMakefile 3rdparty/dyncall/test/ellipsis/CMakeLists.txt 3rdparty/dyncall/test/ellipsis/Makefile.M 3rdparty/dyncall/test/ellipsis/Makefile.embedded 3rdparty/dyncall/test/ellipsis/Makefile.generic 3rdparty/dyncall/test/ellipsis/Nmakefile 3rdparty/dyncall/test/ellipsis/README.txt 3rdparty/dyncall/test/ellipsis/case.h 3rdparty/dyncall/test/ellipsis/config.h 3rdparty/dyncall/test/ellipsis/dynMakefile 3rdparty/dyncall/test/ellipsis/ellipsis.cc 3rdparty/dyncall/test/ellipsis/main.cc 3rdparty/dyncall/test/ellipsis/mkcase.py 3rdparty/dyncall/test/gen-masm/Makefile 3rdparty/dyncall/test/gen-masm/call_x64.S 3rdparty/dyncall/test/gen-masm/call_x64.masm 3rdparty/dyncall/test/gen-masm/call_x86.S 3rdparty/dyncall/test/gen-masm/call_x86.masm 3rdparty/dyncall/test/gen-masm/gen_masm.sh 3rdparty/dyncall/test/hacking-arm-thumb-interwork/Makefile 3rdparty/dyncall/test/hacking-arm-thumb-interwork/Makefile.darwin 3rdparty/dyncall/test/hacking-arm-thumb-interwork/Makefile.linux 3rdparty/dyncall/test/hacking-arm-thumb-interwork/README.txt 3rdparty/dyncall/test/hacking-arm-thumb-interwork/arm.c 3rdparty/dyncall/test/hacking-arm-thumb-interwork/diff-gcc-defs/Makefile 3rdparty/dyncall/test/hacking-arm-thumb-interwork/diff-gcc-defs/diff-generic.sh 3rdparty/dyncall/test/hacking-arm-thumb-interwork/diff-gcc-defs/empty.S 3rdparty/dyncall/test/hacking-arm-thumb-interwork/diff-gcc-defs/empty.c 3rdparty/dyncall/test/hacking-arm-thumb-interwork/test.c 3rdparty/dyncall/test/hacking-arm-thumb-interwork/thumb.c 3rdparty/dyncall/test/hacking-mips/Makefile 3rdparty/dyncall/test/hacking-mips/README.txt 3rdparty/dyncall/test/hacking-mips/call.c 3rdparty/dyncall/test/hacking-mips/calls.c 3rdparty/dyncall/test/hacking-mips/common.h 3rdparty/dyncall/test/hacking-mips/dispatch.c 3rdparty/dyncall/test/hacking-mips/f.c 3rdparty/dyncall/test/hacking-mips/f0.c 3rdparty/dyncall/test/hacking-mips/funs.c 3rdparty/dyncall/test/hacking-mips/main.c 3rdparty/dyncall/test/hacking-mips/node.c 3rdparty/dyncall/test/hacking-mips/prolog.c 3rdparty/dyncall/test/hacking-mips/retn.c 3rdparty/dyncall/test/makepkg.sh 3rdparty/dyncall/test/malloc_wx/CMakeLists.txt 3rdparty/dyncall/test/malloc_wx/Makefile.M 3rdparty/dyncall/test/malloc_wx/Makefile.embedded 3rdparty/dyncall/test/malloc_wx/Makefile.generic 3rdparty/dyncall/test/malloc_wx/Nmakefile 3rdparty/dyncall/test/malloc_wx/dynMakefile 3rdparty/dyncall/test/malloc_wx/mkfile 3rdparty/dyncall/test/malloc_wx/test_wx.c 3rdparty/dyncall/test/mkfile 3rdparty/dyncall/test/nm/CMakeLists.txt 3rdparty/dyncall/test/nm/Makefile.M 3rdparty/dyncall/test/nm/Makefile.embedded 3rdparty/dyncall/test/nm/Makefile.generic 3rdparty/dyncall/test/nm/Nmakefile 3rdparty/dyncall/test/nm/dynMakefile 3rdparty/dyncall/test/nm/nm.c 3rdparty/dyncall/test/plain/CMakeLists.txt 3rdparty/dyncall/test/plain/Makefile.M 3rdparty/dyncall/test/plain/Makefile.embedded 3rdparty/dyncall/test/plain/Makefile.generic 3rdparty/dyncall/test/plain/Nmakefile 3rdparty/dyncall/test/plain/dynMakefile 3rdparty/dyncall/test/plain/mkfile 3rdparty/dyncall/test/plain/test_framework.h 3rdparty/dyncall/test/plain/test_main.c 3rdparty/dyncall/test/plain/test_structs.c 3rdparty/dyncall/test/plain_c++/CMakeLists.txt 3rdparty/dyncall/test/plain_c++/Makefile.M 3rdparty/dyncall/test/plain_c++/Makefile.embedded 3rdparty/dyncall/test/plain_c++/Makefile.generic 3rdparty/dyncall/test/plain_c++/Nmakefile 3rdparty/dyncall/test/plain_c++/dynMakefile 3rdparty/dyncall/test/plain_c++/mkfile 3rdparty/dyncall/test/plain_c++/test_framework.h 3rdparty/dyncall/test/plain_c++/test_main.cc 3rdparty/dyncall/test/resolve_self/Makefile.M 3rdparty/dyncall/test/resolve_self/Makefile.embedded 3rdparty/dyncall/test/resolve_self/Makefile.generic 3rdparty/dyncall/test/resolve_self/Nmakefile 3rdparty/dyncall/test/resolve_self/README.txt 3rdparty/dyncall/test/resolve_self/dynMakefile 3rdparty/dyncall/test/resolve_self/main.c 3rdparty/dyncall/test/runalltests.bat 3rdparty/dyncall/test/runalltests.sh 3rdparty/dyncall/test/samples/calls/d16.c 3rdparty/dyncall/test/samples/calls/d20.c 3rdparty/dyncall/test/samples/calls/d40.c 3rdparty/dyncall/test/samples/calls/f16.c 3rdparty/dyncall/test/samples/calls/f20.c 3rdparty/dyncall/test/samples/calls/f40.c 3rdparty/dyncall/test/samples/calls/fd40.c 3rdparty/dyncall/test/samples/calls/i3.c 3rdparty/dyncall/test/samples/calls/i7.c 3rdparty/dyncall/test/samples/calls/id40.c 3rdparty/dyncall/test/samples/calls/l16.c 3rdparty/dyncall/test/samples/calls/many.c 3rdparty/dyncall/test/samples/composite/args.asm 3rdparty/dyncall/test/samples/composite/args.c 3rdparty/dyncall/test/samples/composite/args.s 3rdparty/dyncall/test/samples/composite/build.bat 3rdparty/dyncall/test/samples/composite/makefile 3rdparty/dyncall/test/sharedlib/CMakeLists.txt 3rdparty/dyncall/test/sharedlib/Makefile.embedded 3rdparty/dyncall/test/sharedlib/sharedlib.c 3rdparty/dyncall/test/sign/Makefile.generic 3rdparty/dyncall/test/sign/sign.c 3rdparty/dyncall/test/suite/CMakeLists.txt 3rdparty/dyncall/test/suite/Makefile.M 3rdparty/dyncall/test/suite/Makefile.embedded 3rdparty/dyncall/test/suite/Makefile.generic 3rdparty/dyncall/test/suite/Nmakefile 3rdparty/dyncall/test/suite/README.txt 3rdparty/dyncall/test/suite/case.c 3rdparty/dyncall/test/suite/case.h 3rdparty/dyncall/test/suite/config.h 3rdparty/dyncall/test/suite/dynMakefile 3rdparty/dyncall/test/suite/main.c 3rdparty/dyncall/test/suite/mkcase.py 3rdparty/dyncall/test/suite/mkfile 3rdparty/dyncall/test/suite2/CMakeLists.txt 3rdparty/dyncall/test/suite2/Makefile.M 3rdparty/dyncall/test/suite2/Makefile.embedded 3rdparty/dyncall/test/suite2/Makefile.generic 3rdparty/dyncall/test/suite2/Nmakefile 3rdparty/dyncall/test/suite2/case.cc 3rdparty/dyncall/test/suite2/case.h 3rdparty/dyncall/test/suite2/config.h 3rdparty/dyncall/test/suite2/design.cfg 3rdparty/dyncall/test/suite2/dynMakefile 3rdparty/dyncall/test/suite2/funcinfo.h 3rdparty/dyncall/test/suite2/ints.cfg 3rdparty/dyncall/test/suite2/main.cc 3rdparty/dyncall/test/suite2/mkcase.py 3rdparty/dyncall/test/suite2/rand.py 3rdparty/dyncall/test/suite2/stress1.cfg 3rdparty/dyncall/test/suite2_x86win32fast/CMakeLists.txt 3rdparty/dyncall/test/suite2_x86win32fast/Makefile.M 3rdparty/dyncall/test/suite2_x86win32fast/Makefile.generic 3rdparty/dyncall/test/suite2_x86win32fast/Nmakefile 3rdparty/dyncall/test/suite2_x86win32fast/case.cc 3rdparty/dyncall/test/suite2_x86win32fast/case.h 3rdparty/dyncall/test/suite2_x86win32fast/config.h 3rdparty/dyncall/test/suite2_x86win32fast/design.cfg 3rdparty/dyncall/test/suite2_x86win32fast/dynMakefile 3rdparty/dyncall/test/suite2_x86win32fast/funcinfo.h 3rdparty/dyncall/test/suite2_x86win32fast/main.cc 3rdparty/dyncall/test/suite2_x86win32fast/mkcase.py 3rdparty/dyncall/test/suite2_x86win32fast/rand.py 3rdparty/dyncall/test/suite2_x86win32std/CMakeLists.txt 3rdparty/dyncall/test/suite2_x86win32std/Makefile.M 3rdparty/dyncall/test/suite2_x86win32std/Makefile.generic 3rdparty/dyncall/test/suite2_x86win32std/Nmakefile 3rdparty/dyncall/test/suite2_x86win32std/case.cc 3rdparty/dyncall/test/suite2_x86win32std/case.h 3rdparty/dyncall/test/suite2_x86win32std/config.h 3rdparty/dyncall/test/suite2_x86win32std/design.cfg 3rdparty/dyncall/test/suite2_x86win32std/dynMakefile 3rdparty/dyncall/test/suite2_x86win32std/funcinfo.h 3rdparty/dyncall/test/suite2_x86win32std/main.cc 3rdparty/dyncall/test/suite2_x86win32std/mkcase.py 3rdparty/dyncall/test/suite2_x86win32std/rand.py 3rdparty/dyncall/test/suite3/CMakeLists.txt 3rdparty/dyncall/test/suite3/Makefile.M 3rdparty/dyncall/test/suite3/Makefile.embedded 3rdparty/dyncall/test/suite3/Makefile.generic 3rdparty/dyncall/test/suite3/Nmakefile 3rdparty/dyncall/test/suite3/README.txt 3rdparty/dyncall/test/suite3/case.cc 3rdparty/dyncall/test/suite3/case.h 3rdparty/dyncall/test/suite3/config.h 3rdparty/dyncall/test/suite3/dynMakefile 3rdparty/dyncall/test/suite3/main.cc 3rdparty/dyncall/test/suite3/mkcase.py 3rdparty/dyncall/test/suite_floats/CMakeLists.txt 3rdparty/dyncall/test/suite_floats/Makefile.M 3rdparty/dyncall/test/suite_floats/Makefile.embedded 3rdparty/dyncall/test/suite_floats/Makefile.generic 3rdparty/dyncall/test/suite_floats/Nmakefile 3rdparty/dyncall/test/suite_floats/README.txt 3rdparty/dyncall/test/suite_floats/case.cc 3rdparty/dyncall/test/suite_floats/case.h 3rdparty/dyncall/test/suite_floats/config.h 3rdparty/dyncall/test/suite_floats/dynMakefile 3rdparty/dyncall/test/suite_floats/main.cc 3rdparty/dyncall/test/suite_floats/mkcase.py 3rdparty/dyncall/test/suite_x86win32fast/CMakeLists.txt 3rdparty/dyncall/test/suite_x86win32fast/Makefile.M 3rdparty/dyncall/test/suite_x86win32fast/Makefile.generic 3rdparty/dyncall/test/suite_x86win32fast/Nmakefile 3rdparty/dyncall/test/suite_x86win32fast/README.txt 3rdparty/dyncall/test/suite_x86win32fast/case.cc 3rdparty/dyncall/test/suite_x86win32fast/case.h 3rdparty/dyncall/test/suite_x86win32fast/config.h 3rdparty/dyncall/test/suite_x86win32fast/dynMakefile 3rdparty/dyncall/test/suite_x86win32fast/main.cc 3rdparty/dyncall/test/suite_x86win32fast/mkcase.py 3rdparty/dyncall/test/suite_x86win32std/CMakeLists.txt 3rdparty/dyncall/test/suite_x86win32std/Makefile.M 3rdparty/dyncall/test/suite_x86win32std/Makefile.generic 3rdparty/dyncall/test/suite_x86win32std/Nmakefile 3rdparty/dyncall/test/suite_x86win32std/README.txt 3rdparty/dyncall/test/suite_x86win32std/case.cc 3rdparty/dyncall/test/suite_x86win32std/case.h 3rdparty/dyncall/test/suite_x86win32std/config.h 3rdparty/dyncall/test/suite_x86win32std/dynMakefile 3rdparty/dyncall/test/suite_x86win32std/main.cc 3rdparty/dyncall/test/suite_x86win32std/mkcase.py 3rdparty/dyncall/test/syscall/CMakeLists.txt 3rdparty/dyncall/test/syscall/Makefile.M 3rdparty/dyncall/test/syscall/Makefile.embedded 3rdparty/dyncall/test/syscall/Makefile.generic 3rdparty/dyncall/test/syscall/dynMakefile 3rdparty/dyncall/test/syscall/syscall.c 3rdparty/dyncall/test/thunk/CMakeLists.txt 3rdparty/dyncall/test/thunk/Makefile.M 3rdparty/dyncall/test/thunk/Makefile.embedded 3rdparty/dyncall/test/thunk/Makefile.generic 3rdparty/dyncall/test/thunk/Nmakefile 3rdparty/dyncall/test/thunk/dynMakefile 3rdparty/dyncall/test/thunk/mkfile 3rdparty/dyncall/test/thunk/test_thunk.c 3rdparty/libuv/.github/ISSUE_TEMPLATE.md 3rdparty/libuv/.gitignore 3rdparty/libuv/.mailmap 3rdparty/libuv/AUTHORS 3rdparty/libuv/CONTRIBUTING.md 3rdparty/libuv/ChangeLog 3rdparty/libuv/LICENSE 3rdparty/libuv/LICENSE-docs 3rdparty/libuv/MAINTAINERS.md 3rdparty/libuv/Makefile.am 3rdparty/libuv/Makefile.mingw 3rdparty/libuv/README.md 3rdparty/libuv/SUPPORTED_PLATFORMS.md 3rdparty/libuv/android-configure 3rdparty/libuv/appveyor.yml 3rdparty/libuv/autogen.sh 3rdparty/libuv/checksparse.sh 3rdparty/libuv/common.gypi 3rdparty/libuv/configure.ac 3rdparty/libuv/docs/Makefile 3rdparty/libuv/docs/code/cgi/main.c 3rdparty/libuv/docs/code/cgi/tick.c 3rdparty/libuv/docs/code/detach/main.c 3rdparty/libuv/docs/code/dns/main.c 3rdparty/libuv/docs/code/helloworld/main.c 3rdparty/libuv/docs/code/idle-basic/main.c 3rdparty/libuv/docs/code/idle-compute/main.c 3rdparty/libuv/docs/code/interfaces/main.c 3rdparty/libuv/docs/code/locks/main.c 3rdparty/libuv/docs/code/multi-echo-server/hammer.js 3rdparty/libuv/docs/code/multi-echo-server/main.c 3rdparty/libuv/docs/code/multi-echo-server/worker.c 3rdparty/libuv/docs/code/onchange/main.c 3rdparty/libuv/docs/code/pipe-echo-server/main.c 3rdparty/libuv/docs/code/plugin/hello.c 3rdparty/libuv/docs/code/plugin/main.c 3rdparty/libuv/docs/code/plugin/plugin.h 3rdparty/libuv/docs/code/proc-streams/main.c 3rdparty/libuv/docs/code/proc-streams/test.c 3rdparty/libuv/docs/code/progress/main.c 3rdparty/libuv/docs/code/queue-cancel/main.c 3rdparty/libuv/docs/code/queue-work/main.c 3rdparty/libuv/docs/code/ref-timer/main.c 3rdparty/libuv/docs/code/signal/main.c 3rdparty/libuv/docs/code/spawn/main.c 3rdparty/libuv/docs/code/tcp-echo-server/main.c 3rdparty/libuv/docs/code/thread-create/main.c 3rdparty/libuv/docs/code/tty-gravity/main.c 3rdparty/libuv/docs/code/tty/main.c 3rdparty/libuv/docs/code/udp-dhcp/main.c 3rdparty/libuv/docs/code/uvcat/main.c 3rdparty/libuv/docs/code/uvstop/main.c 3rdparty/libuv/docs/code/uvtee/main.c 3rdparty/libuv/docs/code/uvwget/main.c 3rdparty/libuv/docs/make.bat 3rdparty/libuv/docs/src/api.rst 3rdparty/libuv/docs/src/async.rst 3rdparty/libuv/docs/src/check.rst 3rdparty/libuv/docs/src/conf.py 3rdparty/libuv/docs/src/design.rst 3rdparty/libuv/docs/src/dll.rst 3rdparty/libuv/docs/src/dns.rst 3rdparty/libuv/docs/src/errors.rst 3rdparty/libuv/docs/src/fs.rst 3rdparty/libuv/docs/src/fs_event.rst 3rdparty/libuv/docs/src/fs_poll.rst 3rdparty/libuv/docs/src/guide.rst 3rdparty/libuv/docs/src/guide/about.rst 3rdparty/libuv/docs/src/guide/basics.rst 3rdparty/libuv/docs/src/guide/eventloops.rst 3rdparty/libuv/docs/src/guide/filesystem.rst 3rdparty/libuv/docs/src/guide/introduction.rst 3rdparty/libuv/docs/src/guide/networking.rst 3rdparty/libuv/docs/src/guide/processes.rst 3rdparty/libuv/docs/src/guide/threads.rst 3rdparty/libuv/docs/src/guide/utilities.rst 3rdparty/libuv/docs/src/handle.rst 3rdparty/libuv/docs/src/idle.rst 3rdparty/libuv/docs/src/index.rst 3rdparty/libuv/docs/src/loop.rst 3rdparty/libuv/docs/src/migration_010_100.rst 3rdparty/libuv/docs/src/misc.rst 3rdparty/libuv/docs/src/pipe.rst 3rdparty/libuv/docs/src/poll.rst 3rdparty/libuv/docs/src/prepare.rst 3rdparty/libuv/docs/src/process.rst 3rdparty/libuv/docs/src/request.rst 3rdparty/libuv/docs/src/signal.rst 3rdparty/libuv/docs/src/sphinx-plugins/manpage.py 3rdparty/libuv/docs/src/static/architecture.png 3rdparty/libuv/docs/src/static/diagrams.key/Data/st0-311.jpg 3rdparty/libuv/docs/src/static/diagrams.key/Data/st1-475.jpg 3rdparty/libuv/docs/src/static/diagrams.key/Index.zip 3rdparty/libuv/docs/src/static/diagrams.key/Metadata/BuildVersionHistory.plist 3rdparty/libuv/docs/src/static/diagrams.key/Metadata/DocumentIdentifier 3rdparty/libuv/docs/src/static/diagrams.key/Metadata/Properties.plist 3rdparty/libuv/docs/src/static/diagrams.key/preview-micro.jpg 3rdparty/libuv/docs/src/static/diagrams.key/preview-web.jpg 3rdparty/libuv/docs/src/static/diagrams.key/preview.jpg 3rdparty/libuv/docs/src/static/favicon.ico 3rdparty/libuv/docs/src/static/logo.png 3rdparty/libuv/docs/src/static/loop_iteration.png 3rdparty/libuv/docs/src/stream.rst 3rdparty/libuv/docs/src/tcp.rst 3rdparty/libuv/docs/src/threading.rst 3rdparty/libuv/docs/src/threadpool.rst 3rdparty/libuv/docs/src/timer.rst 3rdparty/libuv/docs/src/tty.rst 3rdparty/libuv/docs/src/udp.rst 3rdparty/libuv/docs/src/upgrading.rst 3rdparty/libuv/docs/src/version.rst 3rdparty/libuv/gyp_uv.py 3rdparty/libuv/img/banner.png 3rdparty/libuv/img/logos.svg 3rdparty/libuv/include/android-ifaddrs.h 3rdparty/libuv/include/pthread-barrier.h 3rdparty/libuv/include/stdint-msvc2008.h 3rdparty/libuv/include/tree.h 3rdparty/libuv/include/uv-aix.h 3rdparty/libuv/include/uv-bsd.h 3rdparty/libuv/include/uv-darwin.h 3rdparty/libuv/include/uv-errno.h 3rdparty/libuv/include/uv-linux.h 3rdparty/libuv/include/uv-os390.h 3rdparty/libuv/include/uv-posix.h 3rdparty/libuv/include/uv-sunos.h 3rdparty/libuv/include/uv-threadpool.h 3rdparty/libuv/include/uv-unix.h 3rdparty/libuv/include/uv-version.h 3rdparty/libuv/include/uv-win.h 3rdparty/libuv/include/uv.h 3rdparty/libuv/libuv.pc.in 3rdparty/libuv/m4/.gitignore 3rdparty/libuv/m4/as_case.m4 3rdparty/libuv/m4/libuv-check-flags.m4 3rdparty/libuv/samples/.gitignore 3rdparty/libuv/samples/socks5-proxy/.gitignore 3rdparty/libuv/samples/socks5-proxy/LICENSE 3rdparty/libuv/samples/socks5-proxy/Makefile 3rdparty/libuv/samples/socks5-proxy/build.gyp 3rdparty/libuv/samples/socks5-proxy/client.c 3rdparty/libuv/samples/socks5-proxy/defs.h 3rdparty/libuv/samples/socks5-proxy/getopt.c 3rdparty/libuv/samples/socks5-proxy/main.c 3rdparty/libuv/samples/socks5-proxy/s5.c 3rdparty/libuv/samples/socks5-proxy/s5.h 3rdparty/libuv/samples/socks5-proxy/server.c 3rdparty/libuv/samples/socks5-proxy/util.c 3rdparty/libuv/src/fs-poll.c 3rdparty/libuv/src/heap-inl.h 3rdparty/libuv/src/inet.c 3rdparty/libuv/src/queue.h 3rdparty/libuv/src/threadpool.c 3rdparty/libuv/src/unix/aix-common.c 3rdparty/libuv/src/unix/aix.c 3rdparty/libuv/src/unix/android-ifaddrs.c 3rdparty/libuv/src/unix/async.c 3rdparty/libuv/src/unix/atomic-ops.h 3rdparty/libuv/src/unix/bsd-ifaddrs.c 3rdparty/libuv/src/unix/core.c 3rdparty/libuv/src/unix/cygwin.c 3rdparty/libuv/src/unix/darwin-proctitle.c 3rdparty/libuv/src/unix/darwin.c 3rdparty/libuv/src/unix/dl.c 3rdparty/libuv/src/unix/freebsd.c 3rdparty/libuv/src/unix/fs.c 3rdparty/libuv/src/unix/fsevents.c 3rdparty/libuv/src/unix/getaddrinfo.c 3rdparty/libuv/src/unix/getnameinfo.c 3rdparty/libuv/src/unix/ibmi.c 3rdparty/libuv/src/unix/internal.h 3rdparty/libuv/src/unix/kqueue.c 3rdparty/libuv/src/unix/linux-core.c 3rdparty/libuv/src/unix/linux-inotify.c 3rdparty/libuv/src/unix/linux-syscalls.c 3rdparty/libuv/src/unix/linux-syscalls.h 3rdparty/libuv/src/unix/loop-watcher.c 3rdparty/libuv/src/unix/loop.c 3rdparty/libuv/src/unix/netbsd.c 3rdparty/libuv/src/unix/no-fsevents.c 3rdparty/libuv/src/unix/no-proctitle.c 3rdparty/libuv/src/unix/openbsd.c 3rdparty/libuv/src/unix/os390-syscalls.c 3rdparty/libuv/src/unix/os390-syscalls.h 3rdparty/libuv/src/unix/os390.c 3rdparty/libuv/src/unix/pipe.c 3rdparty/libuv/src/unix/poll.c 3rdparty/libuv/src/unix/posix-hrtime.c 3rdparty/libuv/src/unix/posix-poll.c 3rdparty/libuv/src/unix/process.c 3rdparty/libuv/src/unix/procfs-exepath.c 3rdparty/libuv/src/unix/proctitle.c 3rdparty/libuv/src/unix/pthread-fixes.c 3rdparty/libuv/src/unix/signal.c 3rdparty/libuv/src/unix/spinlock.h 3rdparty/libuv/src/unix/stream.c 3rdparty/libuv/src/unix/sunos.c 3rdparty/libuv/src/unix/sysinfo-loadavg.c 3rdparty/libuv/src/unix/sysinfo-memory.c 3rdparty/libuv/src/unix/tcp.c 3rdparty/libuv/src/unix/thread.c 3rdparty/libuv/src/unix/timer.c 3rdparty/libuv/src/unix/tty.c 3rdparty/libuv/src/unix/udp.c 3rdparty/libuv/src/uv-common.c 3rdparty/libuv/src/uv-common.h 3rdparty/libuv/src/uv-data-getter-setters.c 3rdparty/libuv/src/version.c 3rdparty/libuv/src/win/async.c 3rdparty/libuv/src/win/atomicops-inl.h 3rdparty/libuv/src/win/core.c 3rdparty/libuv/src/win/detect-wakeup.c 3rdparty/libuv/src/win/dl.c 3rdparty/libuv/src/win/error.c 3rdparty/libuv/src/win/fs-event.c 3rdparty/libuv/src/win/fs.c 3rdparty/libuv/src/win/getaddrinfo.c 3rdparty/libuv/src/win/getnameinfo.c 3rdparty/libuv/src/win/handle-inl.h 3rdparty/libuv/src/win/handle.c 3rdparty/libuv/src/win/internal.h 3rdparty/libuv/src/win/loop-watcher.c 3rdparty/libuv/src/win/pipe.c 3rdparty/libuv/src/win/poll.c 3rdparty/libuv/src/win/process-stdio.c 3rdparty/libuv/src/win/process.c 3rdparty/libuv/src/win/req-inl.h 3rdparty/libuv/src/win/req.c 3rdparty/libuv/src/win/signal.c 3rdparty/libuv/src/win/snprintf.c 3rdparty/libuv/src/win/stream-inl.h 3rdparty/libuv/src/win/stream.c 3rdparty/libuv/src/win/tcp.c 3rdparty/libuv/src/win/thread.c 3rdparty/libuv/src/win/timer.c 3rdparty/libuv/src/win/tty.c 3rdparty/libuv/src/win/udp.c 3rdparty/libuv/src/win/util.c 3rdparty/libuv/src/win/winapi.c 3rdparty/libuv/src/win/winapi.h 3rdparty/libuv/src/win/winsock.c 3rdparty/libuv/src/win/winsock.h 3rdparty/libuv/test/benchmark-async-pummel.c 3rdparty/libuv/test/benchmark-async.c 3rdparty/libuv/test/benchmark-fs-stat.c 3rdparty/libuv/test/benchmark-getaddrinfo.c 3rdparty/libuv/test/benchmark-list.h 3rdparty/libuv/test/benchmark-loop-count.c 3rdparty/libuv/test/benchmark-million-async.c 3rdparty/libuv/test/benchmark-million-timers.c 3rdparty/libuv/test/benchmark-multi-accept.c 3rdparty/libuv/test/benchmark-ping-pongs.c 3rdparty/libuv/test/benchmark-pound.c 3rdparty/libuv/test/benchmark-pump.c 3rdparty/libuv/test/benchmark-sizes.c 3rdparty/libuv/test/benchmark-spawn.c 3rdparty/libuv/test/benchmark-tcp-write-batch.c 3rdparty/libuv/test/benchmark-thread.c 3rdparty/libuv/test/benchmark-udp-pummel.c 3rdparty/libuv/test/blackhole-server.c 3rdparty/libuv/test/dns-server.c 3rdparty/libuv/test/echo-server.c 3rdparty/libuv/test/fixtures/empty_file 3rdparty/libuv/test/fixtures/load_error.node 3rdparty/libuv/test/run-benchmarks.c 3rdparty/libuv/test/run-tests.c 3rdparty/libuv/test/runner-unix.c 3rdparty/libuv/test/runner-unix.h 3rdparty/libuv/test/runner-win.c 3rdparty/libuv/test/runner-win.h 3rdparty/libuv/test/runner.c 3rdparty/libuv/test/runner.h 3rdparty/libuv/test/task.h 3rdparty/libuv/test/test-active.c 3rdparty/libuv/test/test-async-null-cb.c 3rdparty/libuv/test/test-async.c 3rdparty/libuv/test/test-barrier.c 3rdparty/libuv/test/test-callback-order.c 3rdparty/libuv/test/test-callback-stack.c 3rdparty/libuv/test/test-close-fd.c 3rdparty/libuv/test/test-close-order.c 3rdparty/libuv/test/test-condvar.c 3rdparty/libuv/test/test-connect-unspecified.c 3rdparty/libuv/test/test-connection-fail.c 3rdparty/libuv/test/test-cwd-and-chdir.c 3rdparty/libuv/test/test-default-loop-close.c 3rdparty/libuv/test/test-delayed-accept.c 3rdparty/libuv/test/test-dlerror.c 3rdparty/libuv/test/test-eintr-handling.c 3rdparty/libuv/test/test-embed.c 3rdparty/libuv/test/test-emfile.c 3rdparty/libuv/test/test-env-vars.c 3rdparty/libuv/test/test-error.c 3rdparty/libuv/test/test-fail-always.c 3rdparty/libuv/test/test-fork.c 3rdparty/libuv/test/test-fs-copyfile.c 3rdparty/libuv/test/test-fs-event.c 3rdparty/libuv/test/test-fs-poll.c 3rdparty/libuv/test/test-fs.c 3rdparty/libuv/test/test-get-currentexe.c 3rdparty/libuv/test/test-get-loadavg.c 3rdparty/libuv/test/test-get-memory.c 3rdparty/libuv/test/test-get-passwd.c 3rdparty/libuv/test/test-getaddrinfo.c 3rdparty/libuv/test/test-gethostname.c 3rdparty/libuv/test/test-getnameinfo.c 3rdparty/libuv/test/test-getsockname.c 3rdparty/libuv/test/test-getters-setters.c 3rdparty/libuv/test/test-handle-fileno.c 3rdparty/libuv/test/test-homedir.c 3rdparty/libuv/test/test-hrtime.c 3rdparty/libuv/test/test-idle.c 3rdparty/libuv/test/test-ip4-addr.c 3rdparty/libuv/test/test-ip6-addr.c 3rdparty/libuv/test/test-ipc-send-recv.c 3rdparty/libuv/test/test-ipc.c 3rdparty/libuv/test/test-list.h 3rdparty/libuv/test/test-loop-alive.c 3rdparty/libuv/test/test-loop-close.c 3rdparty/libuv/test/test-loop-configure.c 3rdparty/libuv/test/test-loop-handles.c 3rdparty/libuv/test/test-loop-stop.c 3rdparty/libuv/test/test-loop-time.c 3rdparty/libuv/test/test-multiple-listen.c 3rdparty/libuv/test/test-mutexes.c 3rdparty/libuv/test/test-osx-select.c 3rdparty/libuv/test/test-pass-always.c 3rdparty/libuv/test/test-ping-pong.c 3rdparty/libuv/test/test-pipe-bind-error.c 3rdparty/libuv/test/test-pipe-close-stdout-read-stdin.c 3rdparty/libuv/test/test-pipe-connect-error.c 3rdparty/libuv/test/test-pipe-connect-multiple.c 3rdparty/libuv/test/test-pipe-connect-prepare.c 3rdparty/libuv/test/test-pipe-getsockname.c 3rdparty/libuv/test/test-pipe-pending-instances.c 3rdparty/libuv/test/test-pipe-sendmsg.c 3rdparty/libuv/test/test-pipe-server-close.c 3rdparty/libuv/test/test-pipe-set-fchmod.c 3rdparty/libuv/test/test-pipe-set-non-blocking.c 3rdparty/libuv/test/test-platform-output.c 3rdparty/libuv/test/test-poll-close-doesnt-corrupt-stack.c 3rdparty/libuv/test/test-poll-close.c 3rdparty/libuv/test/test-poll-closesocket.c 3rdparty/libuv/test/test-poll-oob.c 3rdparty/libuv/test/test-poll.c 3rdparty/libuv/test/test-process-title-threadsafe.c 3rdparty/libuv/test/test-process-title.c 3rdparty/libuv/test/test-queue-foreach-delete.c 3rdparty/libuv/test/test-ref.c 3rdparty/libuv/test/test-run-nowait.c 3rdparty/libuv/test/test-run-once.c 3rdparty/libuv/test/test-semaphore.c 3rdparty/libuv/test/test-shutdown-close.c 3rdparty/libuv/test/test-shutdown-eof.c 3rdparty/libuv/test/test-shutdown-twice.c 3rdparty/libuv/test/test-signal-multiple-loops.c 3rdparty/libuv/test/test-signal.c 3rdparty/libuv/test/test-socket-buffer-size.c 3rdparty/libuv/test/test-spawn.c 3rdparty/libuv/test/test-stdio-over-pipes.c 3rdparty/libuv/test/test-tcp-alloc-cb-fail.c 3rdparty/libuv/test/test-tcp-bind-error.c 3rdparty/libuv/test/test-tcp-bind6-error.c 3rdparty/libuv/test/test-tcp-close-accept.c 3rdparty/libuv/test/test-tcp-close-while-connecting.c 3rdparty/libuv/test/test-tcp-close.c 3rdparty/libuv/test/test-tcp-connect-error-after-write.c 3rdparty/libuv/test/test-tcp-connect-error.c 3rdparty/libuv/test/test-tcp-connect-timeout.c 3rdparty/libuv/test/test-tcp-connect6-error.c 3rdparty/libuv/test/test-tcp-create-socket-early.c 3rdparty/libuv/test/test-tcp-flags.c 3rdparty/libuv/test/test-tcp-oob.c 3rdparty/libuv/test/test-tcp-open.c 3rdparty/libuv/test/test-tcp-read-stop.c 3rdparty/libuv/test/test-tcp-shutdown-after-write.c 3rdparty/libuv/test/test-tcp-try-write.c 3rdparty/libuv/test/test-tcp-unexpected-read.c 3rdparty/libuv/test/test-tcp-write-after-connect.c 3rdparty/libuv/test/test-tcp-write-fail.c 3rdparty/libuv/test/test-tcp-write-queue-order.c 3rdparty/libuv/test/test-tcp-write-to-half-open-connection.c 3rdparty/libuv/test/test-tcp-writealot.c 3rdparty/libuv/test/test-thread-equal.c 3rdparty/libuv/test/test-thread.c 3rdparty/libuv/test/test-threadpool-cancel.c 3rdparty/libuv/test/test-threadpool.c 3rdparty/libuv/test/test-timer-again.c 3rdparty/libuv/test/test-timer-from-check.c 3rdparty/libuv/test/test-timer.c 3rdparty/libuv/test/test-tmpdir.c 3rdparty/libuv/test/test-tty.c 3rdparty/libuv/test/test-udp-alloc-cb-fail.c 3rdparty/libuv/test/test-udp-bind.c 3rdparty/libuv/test/test-udp-create-socket-early.c 3rdparty/libuv/test/test-udp-dgram-too-big.c 3rdparty/libuv/test/test-udp-ipv6.c 3rdparty/libuv/test/test-udp-multicast-interface.c 3rdparty/libuv/test/test-udp-multicast-interface6.c 3rdparty/libuv/test/test-udp-multicast-join.c 3rdparty/libuv/test/test-udp-multicast-join6.c 3rdparty/libuv/test/test-udp-multicast-ttl.c 3rdparty/libuv/test/test-udp-open.c 3rdparty/libuv/test/test-udp-options.c 3rdparty/libuv/test/test-udp-send-and-recv.c 3rdparty/libuv/test/test-udp-send-hang-loop.c 3rdparty/libuv/test/test-udp-send-immediate.c 3rdparty/libuv/test/test-udp-send-unreachable.c 3rdparty/libuv/test/test-udp-try-send.c 3rdparty/libuv/test/test-walk-handles.c 3rdparty/libuv/test/test-watcher-cross-stop.c 3rdparty/libuv/test/test.gyp 3rdparty/libuv/tools/make_dist_html.py 3rdparty/libuv/tools/vswhere_usability_wrapper.cmd 3rdparty/libuv/uv.gyp 3rdparty/libuv/vcbuild.bat 3rdparty/dynasm/.gitignore 3rdparty/dynasm/COPYRIGHT 3rdparty/dynasm/dasm_arm.h 3rdparty/dynasm/dasm_arm.lua 3rdparty/dynasm/dasm_mips.h 3rdparty/dynasm/dasm_mips.lua 3rdparty/dynasm/dasm_ppc.h 3rdparty/dynasm/dasm_ppc.lua 3rdparty/dynasm/dasm_proto.h 3rdparty/dynasm/dasm_x64.lua 3rdparty/dynasm/dasm_x86.h 3rdparty/dynasm/dasm_x86.lua 3rdparty/dynasm/dynasm.lua 3rdparty/dynasm/minilua.c 3rdparty/libtommath/.gitignore 3rdparty/libtommath/.travis.yml 3rdparty/libtommath/LICENSE 3rdparty/libtommath/README.md 3rdparty/libtommath/bn.tex 3rdparty/libtommath/bn_error.c 3rdparty/libtommath/bn_fast_mp_invmod.c 3rdparty/libtommath/bn_fast_mp_montgomery_reduce.c 3rdparty/libtommath/bn_fast_s_mp_mul_digs.c 3rdparty/libtommath/bn_fast_s_mp_mul_high_digs.c 3rdparty/libtommath/bn_fast_s_mp_sqr.c 3rdparty/libtommath/bn_mp_2expt.c 3rdparty/libtommath/bn_mp_abs.c 3rdparty/libtommath/bn_mp_add.c 3rdparty/libtommath/bn_mp_add_d.c 3rdparty/libtommath/bn_mp_addmod.c 3rdparty/libtommath/bn_mp_and.c 3rdparty/libtommath/bn_mp_clamp.c 3rdparty/libtommath/bn_mp_clear.c 3rdparty/libtommath/bn_mp_clear_multi.c 3rdparty/libtommath/bn_mp_cmp.c 3rdparty/libtommath/bn_mp_cmp_d.c 3rdparty/libtommath/bn_mp_cmp_mag.c 3rdparty/libtommath/bn_mp_cnt_lsb.c 3rdparty/libtommath/bn_mp_copy.c 3rdparty/libtommath/bn_mp_count_bits.c 3rdparty/libtommath/bn_mp_div.c 3rdparty/libtommath/bn_mp_div_2.c 3rdparty/libtommath/bn_mp_div_2d.c 3rdparty/libtommath/bn_mp_div_3.c 3rdparty/libtommath/bn_mp_div_d.c 3rdparty/libtommath/bn_mp_dr_is_modulus.c 3rdparty/libtommath/bn_mp_dr_reduce.c 3rdparty/libtommath/bn_mp_dr_setup.c 3rdparty/libtommath/bn_mp_exch.c 3rdparty/libtommath/bn_mp_export.c 3rdparty/libtommath/bn_mp_expt_d.c 3rdparty/libtommath/bn_mp_expt_d_ex.c 3rdparty/libtommath/bn_mp_exptmod.c 3rdparty/libtommath/bn_mp_exptmod_fast.c 3rdparty/libtommath/bn_mp_exteuclid.c 3rdparty/libtommath/bn_mp_fread.c 3rdparty/libtommath/bn_mp_fwrite.c 3rdparty/libtommath/bn_mp_gcd.c 3rdparty/libtommath/bn_mp_get_int.c 3rdparty/libtommath/bn_mp_get_long.c 3rdparty/libtommath/bn_mp_get_long_long.c 3rdparty/libtommath/bn_mp_grow.c 3rdparty/libtommath/bn_mp_import.c 3rdparty/libtommath/bn_mp_init.c 3rdparty/libtommath/bn_mp_init_copy.c 3rdparty/libtommath/bn_mp_init_multi.c 3rdparty/libtommath/bn_mp_init_set.c 3rdparty/libtommath/bn_mp_init_set_int.c 3rdparty/libtommath/bn_mp_init_size.c 3rdparty/libtommath/bn_mp_invmod.c 3rdparty/libtommath/bn_mp_invmod_slow.c 3rdparty/libtommath/bn_mp_is_square.c 3rdparty/libtommath/bn_mp_jacobi.c 3rdparty/libtommath/bn_mp_karatsuba_mul.c 3rdparty/libtommath/bn_mp_karatsuba_sqr.c 3rdparty/libtommath/bn_mp_lcm.c 3rdparty/libtommath/bn_mp_lshd.c 3rdparty/libtommath/bn_mp_mod.c 3rdparty/libtommath/bn_mp_mod_2d.c 3rdparty/libtommath/bn_mp_mod_d.c 3rdparty/libtommath/bn_mp_montgomery_calc_normalization.c 3rdparty/libtommath/bn_mp_montgomery_reduce.c 3rdparty/libtommath/bn_mp_montgomery_setup.c 3rdparty/libtommath/bn_mp_mul.c 3rdparty/libtommath/bn_mp_mul_2.c 3rdparty/libtommath/bn_mp_mul_2d.c 3rdparty/libtommath/bn_mp_mul_d.c 3rdparty/libtommath/bn_mp_mulmod.c 3rdparty/libtommath/bn_mp_n_root.c 3rdparty/libtommath/bn_mp_n_root_ex.c 3rdparty/libtommath/bn_mp_neg.c 3rdparty/libtommath/bn_mp_or.c 3rdparty/libtommath/bn_mp_prime_fermat.c 3rdparty/libtommath/bn_mp_prime_is_divisible.c 3rdparty/libtommath/bn_mp_prime_is_prime.c 3rdparty/libtommath/bn_mp_prime_miller_rabin.c 3rdparty/libtommath/bn_mp_prime_next_prime.c 3rdparty/libtommath/bn_mp_prime_rabin_miller_trials.c 3rdparty/libtommath/bn_mp_prime_random_ex.c 3rdparty/libtommath/bn_mp_radix_size.c 3rdparty/libtommath/bn_mp_radix_smap.c 3rdparty/libtommath/bn_mp_rand.c 3rdparty/libtommath/bn_mp_read_radix.c 3rdparty/libtommath/bn_mp_read_signed_bin.c 3rdparty/libtommath/bn_mp_read_unsigned_bin.c 3rdparty/libtommath/bn_mp_reduce.c 3rdparty/libtommath/bn_mp_reduce_2k.c 3rdparty/libtommath/bn_mp_reduce_2k_l.c 3rdparty/libtommath/bn_mp_reduce_2k_setup.c 3rdparty/libtommath/bn_mp_reduce_2k_setup_l.c 3rdparty/libtommath/bn_mp_reduce_is_2k.c 3rdparty/libtommath/bn_mp_reduce_is_2k_l.c 3rdparty/libtommath/bn_mp_reduce_setup.c 3rdparty/libtommath/bn_mp_rshd.c 3rdparty/libtommath/bn_mp_set.c 3rdparty/libtommath/bn_mp_set_int.c 3rdparty/libtommath/bn_mp_set_long.c 3rdparty/libtommath/bn_mp_set_long_long.c 3rdparty/libtommath/bn_mp_shrink.c 3rdparty/libtommath/bn_mp_signed_bin_size.c 3rdparty/libtommath/bn_mp_sqr.c 3rdparty/libtommath/bn_mp_sqrmod.c 3rdparty/libtommath/bn_mp_sqrt.c 3rdparty/libtommath/bn_mp_sqrtmod_prime.c 3rdparty/libtommath/bn_mp_sub.c 3rdparty/libtommath/bn_mp_sub_d.c 3rdparty/libtommath/bn_mp_submod.c 3rdparty/libtommath/bn_mp_to_signed_bin.c 3rdparty/libtommath/bn_mp_to_signed_bin_n.c 3rdparty/libtommath/bn_mp_to_unsigned_bin.c 3rdparty/libtommath/bn_mp_to_unsigned_bin_n.c 3rdparty/libtommath/bn_mp_toom_mul.c 3rdparty/libtommath/bn_mp_toom_sqr.c 3rdparty/libtommath/bn_mp_toradix.c 3rdparty/libtommath/bn_mp_toradix_n.c 3rdparty/libtommath/bn_mp_unsigned_bin_size.c 3rdparty/libtommath/bn_mp_xor.c 3rdparty/libtommath/bn_mp_zero.c 3rdparty/libtommath/bn_prime_tab.c 3rdparty/libtommath/bn_reverse.c 3rdparty/libtommath/bn_s_mp_add.c 3rdparty/libtommath/bn_s_mp_exptmod.c 3rdparty/libtommath/bn_s_mp_mul_digs.c 3rdparty/libtommath/bn_s_mp_mul_high_digs.c 3rdparty/libtommath/bn_s_mp_sqr.c 3rdparty/libtommath/bn_s_mp_sub.c 3rdparty/libtommath/bncore.c 3rdparty/libtommath/booker.pl 3rdparty/libtommath/callgraph.txt 3rdparty/libtommath/changes.txt 3rdparty/libtommath/demo/demo.c 3rdparty/libtommath/demo/timing.c 3rdparty/libtommath/dep.pl 3rdparty/libtommath/etc/2kprime.1 3rdparty/libtommath/etc/2kprime.c 3rdparty/libtommath/etc/drprime.c 3rdparty/libtommath/etc/drprimes.28 3rdparty/libtommath/etc/drprimes.txt 3rdparty/libtommath/etc/makefile 3rdparty/libtommath/etc/makefile.icc 3rdparty/libtommath/etc/makefile.msvc 3rdparty/libtommath/etc/mersenne.c 3rdparty/libtommath/etc/mont.c 3rdparty/libtommath/etc/pprime.c 3rdparty/libtommath/etc/prime.1024 3rdparty/libtommath/etc/prime.512 3rdparty/libtommath/etc/timer.asm 3rdparty/libtommath/etc/tune.c 3rdparty/libtommath/filter.pl 3rdparty/libtommath/gen.pl 3rdparty/libtommath/genlist.sh 3rdparty/libtommath/libtommath.dsp 3rdparty/libtommath/libtommath_VS2005.sln 3rdparty/libtommath/libtommath_VS2005.vcproj 3rdparty/libtommath/libtommath_VS2008.sln 3rdparty/libtommath/libtommath_VS2008.vcproj 3rdparty/libtommath/logs/README 3rdparty/libtommath/logs/add.log 3rdparty/libtommath/logs/addsub.png 3rdparty/libtommath/logs/expt.log 3rdparty/libtommath/logs/expt.png 3rdparty/libtommath/logs/expt_2k.log 3rdparty/libtommath/logs/expt_2kl.log 3rdparty/libtommath/logs/expt_dr.log 3rdparty/libtommath/logs/graphs.dem 3rdparty/libtommath/logs/index.html 3rdparty/libtommath/logs/invmod.log 3rdparty/libtommath/logs/invmod.png 3rdparty/libtommath/logs/mult.log 3rdparty/libtommath/logs/mult.png 3rdparty/libtommath/logs/mult_kara.log 3rdparty/libtommath/logs/sqr.log 3rdparty/libtommath/logs/sqr_kara.log 3rdparty/libtommath/logs/sub.log 3rdparty/libtommath/makefile 3rdparty/libtommath/makefile.bcc 3rdparty/libtommath/makefile.cygwin_dll 3rdparty/libtommath/makefile.icc 3rdparty/libtommath/makefile.include 3rdparty/libtommath/makefile.msvc 3rdparty/libtommath/makefile.shared 3rdparty/libtommath/mess.sh 3rdparty/libtommath/mtest/logtab.h 3rdparty/libtommath/mtest/mpi-config.h 3rdparty/libtommath/mtest/mpi-types.h 3rdparty/libtommath/mtest/mpi.c 3rdparty/libtommath/mtest/mpi.h 3rdparty/libtommath/mtest/mtest.c 3rdparty/libtommath/parsenames.pl 3rdparty/libtommath/pics/design_process.sxd 3rdparty/libtommath/pics/design_process.tif 3rdparty/libtommath/pics/expt_state.sxd 3rdparty/libtommath/pics/expt_state.tif 3rdparty/libtommath/pics/makefile 3rdparty/libtommath/pics/primality.tif 3rdparty/libtommath/pics/radix.sxd 3rdparty/libtommath/pics/sliding_window.sxd 3rdparty/libtommath/pics/sliding_window.tif 3rdparty/libtommath/poster.tex 3rdparty/libtommath/pre_gen/mpi.c 3rdparty/libtommath/pretty.build 3rdparty/libtommath/testme.sh 3rdparty/libtommath/tombc/grammar.txt 3rdparty/libtommath/tommath.h 3rdparty/libtommath/tommath.src 3rdparty/libtommath/tommath_class.h 3rdparty/libtommath/tommath_private.h 3rdparty/libtommath/tommath_superclass.h 3rdparty/libtommath/updatemakes.sh 3rdparty/cmp/.gitignore 3rdparty/cmp/.travis.yml 3rdparty/cmp/CODE_OF_CONDUCT.md 3rdparty/cmp/LICENSE 3rdparty/cmp/Makefile 3rdparty/cmp/README.md 3rdparty/cmp/TODO.md 3rdparty/cmp/cmp.c 3rdparty/cmp/cmp.h 3rdparty/cmp/examples/cmp_data.dat 3rdparty/cmp/examples/example1.c 3rdparty/cmp/examples/example2.c 3rdparty/cmp/test/buf.c 3rdparty/cmp/test/buf.h 3rdparty/cmp/test/cases.mpac 3rdparty/cmp/test/test.c 3rdparty/cmp/test/utils.c 3rdparty/cmp/test/utils.h MoarVM-2018.03/.appveyor.yml0000644000175000017510000000201313202647036015650 0ustar samanthasamantha## Appveyor configuration for MoarVM # We manually build and don't use MSVC's build process so disable it build: off platform: - x64 - x86 install: - dir "C:\Program Files\Microsoft SDKs\Windows" - '"C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" /x64' - appveyor-retry choco install strawberryperl --version 5.20.1.1 --allow-empty-checksums - SET PATH=C:\strawberry\c\bin;C:\strawberry\perl\site\bin;C:\strawberry\perl\bin;%PATH% - perl Configure.pl --prefix=%APPVEYOR_BUILD_FOLDER%\buildprefix - nmake install - git clone https://github.com/perl6/nqp %APPVEYOR_BUILD_FOLDER%\nqp - cd %APPVEYOR_BUILD_FOLDER%\nqp - perl Configure.pl --prefix=%APPVEYOR_BUILD_FOLDER%\buildprefix - nmake - nmake install environment: matrix: - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 # Wasn't able to determine where SetEnv.cmd is for VS2017 # - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 branches: only: - master #test_script: # - cd %APPVEYOR_BUILD_FOLDER%\nqp # - nmake m-test MoarVM-2018.03/.dir-locals.el0000644000175000017510000000024713237701071015640 0ustar samanthasamantha((c-mode . ((c-basic-offset . 4) (c-file-style . "bsd") (fill-column . 80) (indent-tabs-mode . nil) (tab-width . 8)))) MoarVM-2018.03/.editorconfig0000644000175000017510000000043613237701105015662 0ustar samanthasamantha# EditorConfig is awesome: http://EditorConfig.org # Unix-style newlines with a newline ending every file [*] end_of_line = lf insert_final_newline = true indent_style = space indent_size = 4 trim_trailing_whitespace = true [*.yml] indent_size = 2 [update-gh-pages.sh] indent_size = 2 MoarVM-2018.03/.gitignore0000644000175000017510000000242513237701105015175 0ustar samanthasamantha# Editor backups *~ *.bak *.swp # Emacs specfic in-use files \#*\# .#* # clangcheck files .clangcheck .gcccheck tools/check.mk # Releases MoarVM-* # Generated files Makefile 3rdparty/libatomic_ops/autom4te.cache/ 3rdparty/libatomic_ops/config.log 3rdparty/libatomic_ops/config.status 3rdparty/libatomic_ops/pkgconfig/atomic_ops-uninstalled.pc 3rdparty/libatomic_ops/pkgconfig/atomic_ops.pc 3rdparty/libatomic_ops/src/.deps/ 3rdparty/libatomic_ops/src/config.h 3rdparty/libatomic_ops/src/libatomic_ops.a 3rdparty/libatomic_ops/src/stamp-h1 3rdparty/libatomic_ops/tests/.deps/ 3rdparty/libatomic_ops/tests/list_atomic.i 3rdparty/dyncall/ConfigVars 3rdparty/dyncall/Makefile.config src/gen/ *.la *.obj *.exe *.o *.a *.lib *.dll *.pdb *.exp *.suo *.ilk *.lo *.so *.dylib # Coverage files when built with --coverage *.gcno *.gcda # Clang coverage generated raw datafiles *.profraw # Clang processed coverage datafiles *.profdata # GCC Gcov files *.gcov # Callgrind files callgrind.out.* moar *.vsp *.psess /nmake.cmd UNIDATA/* /src/strings/unicode.c *.class tags install/ pkgconfig/ build/mk-moar-pc.pl # jit files jit-log.txt jit-*.bin # dynasm emitted files src/jit/x64/emit.c # jit expression table file src/jit/core_templates.h src/jit/x64/tile_pattern.h # generated code tools/lib/MAST/Ops.pm MoarVM-2018.03/.gitmodules0000644000175000017510000000075013252330426015362 0ustar samanthasamantha[submodule "3rdparty/libuv"] path = 3rdparty/libuv url = https://github.com/libuv/libuv.git [submodule "3rdparty/dyncall"] path = 3rdparty/dyncall url = https://github.com/MoarVM/dyncall.git [submodule "3rdparty/dynasm"] path = 3rdparty/dynasm url = https://github.com/MoarVM/dynasm.git [submodule "3rdparty/libtommath"] path = 3rdparty/libtommath url = https://github.com/MoarVM/libtommath [submodule "3rdparty/cmp"] path = 3rdparty/cmp url = https://github.com/MoarVM/cmp.git MoarVM-2018.03/.travis.yml0000644000175000017510000001521413243116442015317 0ustar samanthasamanthalanguage: "perl" os: - linux - osx perl: - "5.10" before_install: |- echo "Begin ‘before_install’ section of .travis.yml" # If we aren't on MoarVM/MoarVM or it's a pull request we can't decode the deploy key if [ ! "$TRAVIS_REPO_SLUG" = 'MoarVM/MoarVM' ] || [ ! "$TRAVIS_PULL_REQUEST" = "false" ]; then export COVERAGE=''; export MOCK_COVERAGE=1; fi if [ "$COVERAGE" ]; then # Put github's into known_hosts /* may not need this */ printf "github.com,192.30.255.112 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==\n" >> ~/.ssh/known_hosts # Decrypt deploy_key using Travis *magic* variables eval 'openssl aes-256-cbc -K $encrypted_b77ce3a1cc5c_key -iv $encrypted_b77ce3a1cc5c_iv -in ./tools/gh-pages-deploy_key.enc -out deploy_key -d' # Now that it's decrypted, clear the keys so it can't leak export encrypted_b77ce3a1cc5c_key="" export encrypted_b77ce3a1cc5c_iv="" chmod 600 deploy_key # Change perms or ssh-agent will get mad at us eval $(ssh-agent -s) # Run the code that ssh-agent -s gives back to setup ENV # Decrypted key has no password, but it will still ask for one. Use expect program to interact with it non-interactively expect -c 'spawn ssh-add ./deploy_key; expect "enter passphrase for"; send "\n"; expect "Identity added:"; interact' fi install: - echo "Begin ‘install’ section of .travis.yml" addons: apt: sources: - sourceline: 'ppa:ubuntu-toolchain-r/test' - sourceline: 'deb http://apt.llvm.org/precise/ llvm-toolchain-precise main' packages: - clang-5.0 - llvm-5.0 - expect - libffi-dev - gdb before_script: - echo "Begin ‘before_script’ section of .travis.yml" - uname -a - gcc --version - clang --version # Fun function that finds files in /usr/bin naming as foo-4.2 for example # and returns the highest version. Travis CI installs newer versions under # their own verison numbers. - find_latest_version () { ls /usr/bin | grep -Ee "^$1(\-[0-9.]+)?$" | sort -r | head -n 1; } # MacOS's readlink doesn't support -f, so use our own solution - resolve_folder () { O="$(pwd -P)"; D="$(dirname $1)"; T="$(basename $1)"; cd -- "$D" && cd -- "$T" && pwd -P; cd -- "$O" > /dev/null; } - find_latest_version llvm-profdata - find_latest_version llvm-cov # Find the latest clang that is on the system - CLANG_LATEST=$(find_latest_version clang) - if [ ! "$CLANG_LATEST" = 'clang' ]; then eval "$CLANG_LATEST --version"; fi - if [ "$USE_CLANG_LATEST" ]; then echo "Using $CLANG_LATEST due to build setting"; CC="$CLANG_LATEST"; fi # Generic debug and optimization settings that are used for all builds except # the coverage builds - MVM_debug="--debug"; MVM_optimize="--optimize" - if [ "$COVERAGE" ] || [ "$MOCK_COVERAGE" ]; then MVM_debug="--debug=3"; MVM_optimize="--optimize=0"; fi - if [ "$TRAVIS_OS_NAME" == "linux" ] ; then sudo apt-get update -qq || sudo apt-get update -qq ; fi - git fetch --unshallow - git clone --depth 1 git://github.com/perl6/nqp script: - echo "Begin ‘script’ section of .travis.yml" # Enable coredumps - if [ "$TRAVIS_OS_NAME" == "linux" ]; then ulimit -c unlimited; fi - export MOAR_PREFIX="/tmp/moar"; export MOAR_FOLDER="$TRAVIS_BUILD_DIR" - export NQP_FOLDER="$(resolve_folder ./nqp)" # Set location for core dumps - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo bash -c "echo \"${MOAR_PREFIX}/core.%p.%E\" > /proc/sys/kernel/core_pattern"; sudo cat /proc/sys/kernel/core_pattern; fi - echo "perl Configure.pl --prefix=$MOAR_PREFIX $MVM_OPTIONS --cc=\"$CC\" $MVM_debug $MVM_optimize;" - perl Configure.pl --prefix=$MOAR_PREFIX $MVM_OPTIONS --cc="$CC" $MVM_debug $MVM_optimize; - make -j2 install; - cd -- "$NQP_FOLDER"; - echo "perl Configure.pl --prefix=$MOAR_PREFIX --backends=moar;" - perl Configure.pl --prefix=$MOAR_PREFIX --backends=moar; - make - make test; - cd -- "$MOAR_FOLDER" - if [ "$COVERAGE" ]; then git clone --depth 1 'https://github.com/samcv/MoarVM-cover.git' && cp -v MoarVM-cover/html-cover.sh . && cp -v MoarVM-cover/nqp-profile ./nqp/ && cp -v MoarVM-cover/merge-profraw.sh ./nqp/ && ./html-cover.sh 2; fi after_success: - echo "Begin ‘after_success’ section of .travis.yml" - cd "$TRAVIS_BUILD_DIR" - if [ "$COVERAGE" ]; then ./tools/update-gh-pages.sh; fi after_failure: # On failure, dump all ENV vars, in case we need to look at them (doesn't print if our secrets are defined) - if [ ! "$encrypted_b77ce3a1cc5c_key" ] && [ ! "$encrypted_b77ce3a1cc5c_iv" ]; then printenv; fi # If we have any coredumps, print out the traces with gdb - for i in $(find "${MOAR_PREFIX}" -maxdepth 1 -name 'core*' -print); do gdb "${MOAR_PREFIX}/bin/moar" "${i}" -ex "thread apply all bt" -ex "set pagination 0" -batch; done; branches: only: - master - coverage - /smoke-me/ notifications: irc: branches: except: - gh-pages channels: - "irc.freenode.net#moarvm" on_success: change on_failure: always template: - "MoarVM build %{result}. %{author} '%{commit_message}'" - "%{build_url} %{compare_url}" env: matrix: - MVM_OPTIONS="--no-jit" CC='gcc' - MVM_OPTIONS="" CC='gcc' - MVM_OPTIONS="--no-jit" CC='clang' - MVM_OPTIONS="" CC='clang' - MVM_OPTIONS="--has-libffi --no-jit" CC='gcc' - MVM_OPTIONS="--has-libffi" CC='gcc' - MVM_OPTIONS="--has-libffi --no-jit" CC='clang' - MVM_OPTIONS="--has-libffi" CC='clang' - MVM_OPTIONS="--compiler=clang --coverage --optimize=0 --debug=3" COVERAGE=1 USE_CLANG_LATEST=1 CC='clang' matrix: exclude: - os: osx env: MVM_OPTIONS="--has-libffi --no-jit" CC='gcc' - os: osx env: MVM_OPTIONS="--has-libffi" CC='gcc' # - os: osx # env: MVM_OPTIONS="--no-jit" CC='gcc' # - os: osx # env: MVM_OPTIONS="" CC='gcc' - os: osx env: MVM_OPTIONS="--has-libffi --no-jit" CC='clang' - os: osx env: MVM_OPTIONS="--has-libffi" CC='clang' - os: osx env: MVM_OPTIONS="--compiler=clang --coverage --optimize=0 --debug=3" COVERAGE=1 USE_CLANG_LATEST=1 CC='clang' allow_failures: - os: linux env: MVM_OPTIONS="--compiler=clang --coverage --optimize=0 --debug=3" COVERAGE=1 USE_CLANG_LATEST=1 CC='clang' MoarVM-2018.03/3rdparty/README.md0000644000175000017510000000127113237701103016230 0ustar samanthasamantha## 3rd party libraries These are imported forks of external library projects. Their source redistribution licenses are for the most part as permissive or more permissive than MoarVM's itself. We have imported them here because we needed to make extensive modifications to their capabilities or exposed API, and so couldn't use system packages, or available system packages are too far out of date. Note: you may find that libatomic_ops has some GPL-licensed files in the repo. These are NOT included in any built binaries; they are merely tools for configuring, building, and testing, and should be disregarded when considering the redistributability of MoarVM in source form or binary form. MoarVM-2018.03/3rdparty/freebsd/memmem.c0000644000175000017510000001143013237701236020011 0ustar samanthasamantha/*- * Copyright (c) 2005-2014 Rich Felker, et al. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*#include __FBSDID("$FreeBSD$");*/ #include #include static char *twobyte_memmem(const unsigned char *h, size_t k, const unsigned char *n) { uint16_t nw = n[0]<<8 | n[1], hw = h[0]<<8 | h[1]; for (h++, k--; k; k--, hw = hw<<8 | *++h) if (hw == nw) return (char *)h-1; return 0; } static char *threebyte_memmem(const unsigned char *h, size_t k, const unsigned char *n) { uint32_t nw = n[0]<<24 | n[1]<<16 | n[2]<<8; uint32_t hw = h[0]<<24 | h[1]<<16 | h[2]<<8; for (h+=2, k-=2; k; k--, hw = (hw|*++h)<<8) if (hw == nw) return (char *)h-2; return 0; } static char *fourbyte_memmem(const unsigned char *h, size_t k, const unsigned char *n) { uint32_t nw = n[0]<<24 | n[1]<<16 | n[2]<<8 | n[3]; uint32_t hw = h[0]<<24 | h[1]<<16 | h[2]<<8 | h[3]; for (h+=3, k-=3; k; k--, hw = hw<<8 | *++h) if (hw == nw) return (char *)h-3; return 0; } #define MAX(a,b) ((a)>(b)?(a):(b)) #define MIN(a,b) ((a)<(b)?(a):(b)) #define BITOP(a,b,op) \ ((a)[(size_t)(b)/(8*sizeof *(a))] op (size_t)1<<((size_t)(b)%(8*sizeof *(a)))) /* * Two Way string search algorithm, with a bad shift table applied to the last * byte of the window. A bit array marks which entries in the shift table are * initialized to avoid fully initializing a 1kb/2kb table. * * Reference: CROCHEMORE M., PERRIN D., 1991, Two-way string-matching, * Journal of the ACM 38(3):651-675 */ static char *twoway_memmem(const unsigned char *h, const unsigned char *z, const unsigned char *n, size_t l) { size_t i, ip, jp, k, p, ms, p0, mem, mem0; size_t byteset[32 / sizeof(size_t)] = { 0 }; size_t shift[256]; /* Computing length of needle and fill shift table */ for (i=0; i n[jp+k]) { jp += k; k = 1; p = jp - ip; } else { ip = jp++; k = p = 1; } } ms = ip; p0 = p; /* And with the opposite comparison */ ip = -1; jp = 0; k = p = 1; while (jp+k ms+1) ms = ip; else p = p0; /* Periodic needle? */ if (memcmp(n, n+p, ms+1)) { mem0 = 0; p = MAX(ms, l-ms-1) + 1; } else mem0 = l-p; mem = 0; /* Search loop */ for (;;) { /* If remainder of haystack is shorter than needle, done */ if (z-h < l) return 0; /* Check last byte first; advance by shift on mismatch */ if (BITOP(byteset, h[l-1], &)) { k = l-shift[h[l-1]]; if (k) { if (mem0 && mem && k < p) k = l-p; h += k; mem = 0; continue; } } else { h += l; mem = 0; continue; } /* Compare right half */ for (k=MAX(ms+1,mem); kmem && n[k-1] == h[k-1]; k--); if (k <= mem) return (char *)h; h += p; mem = mem0; } } void *memmem(const void *h0, size_t k, const void *n0, size_t l) { const unsigned char *h = h0, *n = n0; /* Return immediately on empty needle */ if (!l) return (void *)h; /* Return immediately when needle is longer than haystack */ if (k 1000 #pragma once #endif #include "stdint.h" // 7.8 Format conversion of integer types typedef struct { intmax_t quot; intmax_t rem; } imaxdiv_t; // 7.8.1 Macros for format specifiers #if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [ See footnote 185 at page 198 // The fprintf macros for signed integers are: #define PRId8 "d" #define PRIi8 "i" #define PRIdLEAST8 "d" #define PRIiLEAST8 "i" #define PRIdFAST8 "d" #define PRIiFAST8 "i" #define PRId16 "hd" #define PRIi16 "hi" #define PRIdLEAST16 "hd" #define PRIiLEAST16 "hi" #define PRIdFAST16 "hd" #define PRIiFAST16 "hi" #define PRId32 "I32d" #define PRIi32 "I32i" #define PRIdLEAST32 "I32d" #define PRIiLEAST32 "I32i" #define PRIdFAST32 "I32d" #define PRIiFAST32 "I32i" #define PRId64 "I64d" #define PRIi64 "I64i" #define PRIdLEAST64 "I64d" #define PRIiLEAST64 "I64i" #define PRIdFAST64 "I64d" #define PRIiFAST64 "I64i" #define PRIdMAX "I64d" #define PRIiMAX "I64i" #define PRIdPTR "Id" #define PRIiPTR "Ii" // The fprintf macros for unsigned integers are: #define PRIo8 "o" #define PRIu8 "u" #define PRIx8 "x" #define PRIX8 "X" #define PRIoLEAST8 "o" #define PRIuLEAST8 "u" #define PRIxLEAST8 "x" #define PRIXLEAST8 "X" #define PRIoFAST8 "o" #define PRIuFAST8 "u" #define PRIxFAST8 "x" #define PRIXFAST8 "X" #define PRIo16 "ho" #define PRIu16 "hu" #define PRIx16 "hx" #define PRIX16 "hX" #define PRIoLEAST16 "ho" #define PRIuLEAST16 "hu" #define PRIxLEAST16 "hx" #define PRIXLEAST16 "hX" #define PRIoFAST16 "ho" #define PRIuFAST16 "hu" #define PRIxFAST16 "hx" #define PRIXFAST16 "hX" #define PRIo32 "I32o" #define PRIu32 "I32u" #define PRIx32 "I32x" #define PRIX32 "I32X" #define PRIoLEAST32 "I32o" #define PRIuLEAST32 "I32u" #define PRIxLEAST32 "I32x" #define PRIXLEAST32 "I32X" #define PRIoFAST32 "I32o" #define PRIuFAST32 "I32u" #define PRIxFAST32 "I32x" #define PRIXFAST32 "I32X" #define PRIo64 "I64o" #define PRIu64 "I64u" #define PRIx64 "I64x" #define PRIX64 "I64X" #define PRIoLEAST64 "I64o" #define PRIuLEAST64 "I64u" #define PRIxLEAST64 "I64x" #define PRIXLEAST64 "I64X" #define PRIoFAST64 "I64o" #define PRIuFAST64 "I64u" #define PRIxFAST64 "I64x" #define PRIXFAST64 "I64X" #define PRIoMAX "I64o" #define PRIuMAX "I64u" #define PRIxMAX "I64x" #define PRIXMAX "I64X" #define PRIoPTR "Io" #define PRIuPTR "Iu" #define PRIxPTR "Ix" #define PRIXPTR "IX" // The fscanf macros for signed integers are: #define SCNd8 "d" #define SCNi8 "i" #define SCNdLEAST8 "d" #define SCNiLEAST8 "i" #define SCNdFAST8 "d" #define SCNiFAST8 "i" #define SCNd16 "hd" #define SCNi16 "hi" #define SCNdLEAST16 "hd" #define SCNiLEAST16 "hi" #define SCNdFAST16 "hd" #define SCNiFAST16 "hi" #define SCNd32 "ld" #define SCNi32 "li" #define SCNdLEAST32 "ld" #define SCNiLEAST32 "li" #define SCNdFAST32 "ld" #define SCNiFAST32 "li" #define SCNd64 "I64d" #define SCNi64 "I64i" #define SCNdLEAST64 "I64d" #define SCNiLEAST64 "I64i" #define SCNdFAST64 "I64d" #define SCNiFAST64 "I64i" #define SCNdMAX "I64d" #define SCNiMAX "I64i" #ifdef _WIN64 // [ # define SCNdPTR "I64d" # define SCNiPTR "I64i" #else // _WIN64 ][ # define SCNdPTR "ld" # define SCNiPTR "li" #endif // _WIN64 ] // The fscanf macros for unsigned integers are: #define SCNo8 "o" #define SCNu8 "u" #define SCNx8 "x" #define SCNX8 "X" #define SCNoLEAST8 "o" #define SCNuLEAST8 "u" #define SCNxLEAST8 "x" #define SCNXLEAST8 "X" #define SCNoFAST8 "o" #define SCNuFAST8 "u" #define SCNxFAST8 "x" #define SCNXFAST8 "X" #define SCNo16 "ho" #define SCNu16 "hu" #define SCNx16 "hx" #define SCNX16 "hX" #define SCNoLEAST16 "ho" #define SCNuLEAST16 "hu" #define SCNxLEAST16 "hx" #define SCNXLEAST16 "hX" #define SCNoFAST16 "ho" #define SCNuFAST16 "hu" #define SCNxFAST16 "hx" #define SCNXFAST16 "hX" #define SCNo32 "lo" #define SCNu32 "lu" #define SCNx32 "lx" #define SCNX32 "lX" #define SCNoLEAST32 "lo" #define SCNuLEAST32 "lu" #define SCNxLEAST32 "lx" #define SCNXLEAST32 "lX" #define SCNoFAST32 "lo" #define SCNuFAST32 "lu" #define SCNxFAST32 "lx" #define SCNXFAST32 "lX" #define SCNo64 "I64o" #define SCNu64 "I64u" #define SCNx64 "I64x" #define SCNX64 "I64X" #define SCNoLEAST64 "I64o" #define SCNuLEAST64 "I64u" #define SCNxLEAST64 "I64x" #define SCNXLEAST64 "I64X" #define SCNoFAST64 "I64o" #define SCNuFAST64 "I64u" #define SCNxFAST64 "I64x" #define SCNXFAST64 "I64X" #define SCNoMAX "I64o" #define SCNuMAX "I64u" #define SCNxMAX "I64x" #define SCNXMAX "I64X" #ifdef _WIN64 // [ # define SCNoPTR "I64o" # define SCNuPTR "I64u" # define SCNxPTR "I64x" # define SCNXPTR "I64X" #else // _WIN64 ][ # define SCNoPTR "lo" # define SCNuPTR "lu" # define SCNxPTR "lx" # define SCNXPTR "lX" #endif // _WIN64 ] #endif // __STDC_FORMAT_MACROS ] // 7.8.2 Functions for greatest-width integer types // 7.8.2.1 The imaxabs function #define imaxabs _abs64 // 7.8.2.2 The imaxdiv function // This is modified version of div() function from Microsoft's div.c found // in %MSVC.NET%\crt\src\div.c #ifdef STATIC_IMAXDIV // [ static #else // STATIC_IMAXDIV ][ _inline #endif // STATIC_IMAXDIV ] imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom) { imaxdiv_t result; result.quot = numer / denom; result.rem = numer % denom; if (numer < 0 && result.rem > 0) { // did division wrong; must fix up ++result.quot; result.rem -= denom; } return result; } // 7.8.2.3 The strtoimax and strtoumax functions #define strtoimax _strtoi64 #define strtoumax _strtoui64 // 7.8.2.4 The wcstoimax and wcstoumax functions #define wcstoimax _wcstoi64 #define wcstoumax _wcstoui64 #endif // _MSC_INTTYPES_H_ ] MoarVM-2018.03/3rdparty/msinttypes/stdint.h0000644000175000017510000001763413237701235020666 0ustar samanthasamantha// ISO C9x compliant stdint.h for Microsoft Visual Studio // Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 // // Copyright (c) 2006-2013 Alexander Chemeris // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // 3. Neither the name of the product nor the names of its contributors may // be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO // EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////////// #ifndef _MSC_VER // [ #error "Use this header only with Microsoft Visual C++ compilers!" #endif // _MSC_VER ] #ifndef _MSC_STDINT_H_ // [ #define _MSC_STDINT_H_ #if _MSC_VER > 1000 #pragma once #endif #if _MSC_VER >= 1600 // [ #include #else // ] _MSC_VER >= 1600 [ #include // For Visual Studio 6 in C++ mode and for many Visual Studio versions when // compiling for ARM we should wrap include with 'extern "C++" {}' // or compiler give many errors like this: // error C2733: second C linkage of overloaded function 'wmemchr' not allowed #ifdef __cplusplus extern "C" { #endif # include #ifdef __cplusplus } #endif // Define _W64 macros to mark types changing their size, like intptr_t. #ifndef _W64 # if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 # define _W64 __w64 # else # define _W64 # endif #endif // 7.18.1 Integer types // 7.18.1.1 Exact-width integer types // Visual Studio 6 and Embedded Visual C++ 4 doesn't // realize that, e.g. char has the same size as __int8 // so we give up on __intX for them. #if (_MSC_VER < 1300) typedef signed char int8_t; typedef signed short int16_t; typedef signed int int32_t; typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; #else typedef signed __int8 int8_t; typedef signed __int16 int16_t; typedef signed __int32 int32_t; typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; #endif typedef signed __int64 int64_t; typedef unsigned __int64 uint64_t; // 7.18.1.2 Minimum-width integer types typedef int8_t int_least8_t; typedef int16_t int_least16_t; typedef int32_t int_least32_t; typedef int64_t int_least64_t; typedef uint8_t uint_least8_t; typedef uint16_t uint_least16_t; typedef uint32_t uint_least32_t; typedef uint64_t uint_least64_t; // 7.18.1.3 Fastest minimum-width integer types typedef int8_t int_fast8_t; typedef int16_t int_fast16_t; typedef int32_t int_fast32_t; typedef int64_t int_fast64_t; typedef uint8_t uint_fast8_t; typedef uint16_t uint_fast16_t; typedef uint32_t uint_fast32_t; typedef uint64_t uint_fast64_t; // 7.18.1.4 Integer types capable of holding object pointers #ifdef _WIN64 // [ typedef signed __int64 intptr_t; typedef unsigned __int64 uintptr_t; #else // _WIN64 ][ typedef _W64 signed int intptr_t; typedef _W64 unsigned int uintptr_t; #endif // _WIN64 ] // 7.18.1.5 Greatest-width integer types typedef int64_t intmax_t; typedef uint64_t uintmax_t; // 7.18.2 Limits of specified-width integer types #if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 // 7.18.2.1 Limits of exact-width integer types #define INT8_MIN ((int8_t)_I8_MIN) #define INT8_MAX _I8_MAX #define INT16_MIN ((int16_t)_I16_MIN) #define INT16_MAX _I16_MAX #define INT32_MIN ((int32_t)_I32_MIN) #define INT32_MAX _I32_MAX #define INT64_MIN ((int64_t)_I64_MIN) #define INT64_MAX _I64_MAX #define UINT8_MAX _UI8_MAX #define UINT16_MAX _UI16_MAX #define UINT32_MAX _UI32_MAX #define UINT64_MAX _UI64_MAX // 7.18.2.2 Limits of minimum-width integer types #define INT_LEAST8_MIN INT8_MIN #define INT_LEAST8_MAX INT8_MAX #define INT_LEAST16_MIN INT16_MIN #define INT_LEAST16_MAX INT16_MAX #define INT_LEAST32_MIN INT32_MIN #define INT_LEAST32_MAX INT32_MAX #define INT_LEAST64_MIN INT64_MIN #define INT_LEAST64_MAX INT64_MAX #define UINT_LEAST8_MAX UINT8_MAX #define UINT_LEAST16_MAX UINT16_MAX #define UINT_LEAST32_MAX UINT32_MAX #define UINT_LEAST64_MAX UINT64_MAX // 7.18.2.3 Limits of fastest minimum-width integer types #define INT_FAST8_MIN INT8_MIN #define INT_FAST8_MAX INT8_MAX #define INT_FAST16_MIN INT16_MIN #define INT_FAST16_MAX INT16_MAX #define INT_FAST32_MIN INT32_MIN #define INT_FAST32_MAX INT32_MAX #define INT_FAST64_MIN INT64_MIN #define INT_FAST64_MAX INT64_MAX #define UINT_FAST8_MAX UINT8_MAX #define UINT_FAST16_MAX UINT16_MAX #define UINT_FAST32_MAX UINT32_MAX #define UINT_FAST64_MAX UINT64_MAX // 7.18.2.4 Limits of integer types capable of holding object pointers #ifdef _WIN64 // [ # define INTPTR_MIN INT64_MIN # define INTPTR_MAX INT64_MAX # define UINTPTR_MAX UINT64_MAX #else // _WIN64 ][ # define INTPTR_MIN INT32_MIN # define INTPTR_MAX INT32_MAX # define UINTPTR_MAX UINT32_MAX #endif // _WIN64 ] // 7.18.2.5 Limits of greatest-width integer types #define INTMAX_MIN INT64_MIN #define INTMAX_MAX INT64_MAX #define UINTMAX_MAX UINT64_MAX // 7.18.3 Limits of other integer types #ifdef _WIN64 // [ # define PTRDIFF_MIN _I64_MIN # define PTRDIFF_MAX _I64_MAX #else // _WIN64 ][ # define PTRDIFF_MIN _I32_MIN # define PTRDIFF_MAX _I32_MAX #endif // _WIN64 ] #define SIG_ATOMIC_MIN INT_MIN #define SIG_ATOMIC_MAX INT_MAX #ifndef SIZE_MAX // [ # ifdef _WIN64 // [ # define SIZE_MAX _UI64_MAX # else // _WIN64 ][ # define SIZE_MAX _UI32_MAX # endif // _WIN64 ] #endif // SIZE_MAX ] // WCHAR_MIN and WCHAR_MAX are also defined in #ifndef WCHAR_MIN // [ # define WCHAR_MIN 0 #endif // WCHAR_MIN ] #ifndef WCHAR_MAX // [ # define WCHAR_MAX _UI16_MAX #endif // WCHAR_MAX ] #define WINT_MIN 0 #define WINT_MAX _UI16_MAX #endif // __STDC_LIMIT_MACROS ] // 7.18.4 Limits of other integer types #if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 // 7.18.4.1 Macros for minimum-width integer constants #define INT8_C(val) val##i8 #define INT16_C(val) val##i16 #define INT32_C(val) val##i32 #define INT64_C(val) val##i64 #define UINT8_C(val) val##ui8 #define UINT16_C(val) val##ui16 #define UINT32_C(val) val##ui32 #define UINT64_C(val) val##ui64 // 7.18.4.2 Macros for greatest-width integer constants // These #ifndef's are needed to prevent collisions with . // Check out Issue 9 for the details. #ifndef INTMAX_C // [ # define INTMAX_C INT64_C #endif // INTMAX_C ] #ifndef UINTMAX_C // [ # define UINTMAX_C UINT64_C #endif // UINTMAX_C ] #endif // __STDC_CONSTANT_MACROS ] #endif // _MSC_VER >= 1600 ] #endif // _MSC_STDINT_H_ ] MoarVM-2018.03/3rdparty/sha1/sha1.c0000644000175000017510000001773413237701235016626 0ustar samanthasamantha/* SHA-1 in C By Steve Reid 100% Public Domain ----------------- Modified 7/98 By James H. Brown Still 100% Public Domain Corrected a problem which generated improper hash values on 16 bit machines Routine SHA1Update changed from void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int len) to void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned long len) The 'len' parameter was declared an int which works fine on 32 bit machines. However, on 16 bit machines an int is too small for the shifts being done against it. This caused the hash function to generate incorrect values if len was greater than 8191 (8K - 1) due to the 'len << 3' on line 3 of SHA1Update(). Since the file IO in main() reads 16K at a time, any file 8K or larger would be guaranteed to generate the wrong hash (e.g. Test Vector #3, a million "a"s). I also changed the declaration of variables i & j in SHA1Update to unsigned long from unsigned int for the same reason. These changes should make no difference to any 32 bit implementations since an int and a long are the same size in those environments. -- I also corrected a few compiler warnings generated by Borland C. 1. Added #include for exit() prototype 2. Removed unused variable 'j' in SHA1Final 3. Changed exit(0) to return(0) at end of main. ALL changes I made can be located by searching for comments containing 'JHB' ----------------- Modified 8/98 By Steve Reid Still 100% public domain 1- Removed #include and used return() instead of exit() 2- Fixed overwriting of finalcount in SHA1Final() (discovered by Chris Hall) 3- Changed email address from steve@edmweb.com to sreid@sea-to-sky.net ----------------- Modified 4/01 By Saul Kravitz Still 100% PD Modified to run on Compaq Alpha hardware. ----------------- Modified 07/2002 By Ralph Giles Still 100% public domain modified for use with stdint types, autoconf code cleanup, removed attribution comments switched SHA1Final() argument order for consistency use SHA1_ prefix for public api move public api to sha1.h ----------------- Modified 07/2002 By Ralph Giles Still 100% public domain ----------------- Modified 12/2011 By Jonathan Worthington Still 100% public domain Strip out various test code, twiddle digest to ASCII code a bit. */ #include #include #include "sha1.h" void SHA1_Transform(unsigned int state[5], const unsigned char buffer[64]); #define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) /* blk0() and blk() perform the initial expand. */ /* I got the idea of expanding during the round function from SSLeay */ /* FIXME: can we do this in an endian-proof way? */ #ifdef WORDS_BIGENDIAN #define blk0(i) block->l[i] #else #define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \ |(rol(block->l[i],8)&0x00FF00FF)) #endif #define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \ ^block->l[(i+2)&15]^block->l[i&15],1)) /* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ #define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30); #define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30); #define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30); #define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30); #define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30); /* Hash a single 512-bit block. This is the core of the algorithm. */ void SHA1_Transform(unsigned int state[5], const unsigned char buffer[64]) { unsigned int a, b, c, d, e; typedef union { unsigned char c[64]; unsigned int l[16]; } CHAR64LONG16; CHAR64LONG16* block; block = (CHAR64LONG16*)buffer; /* Copy context->state[] to working vars */ a = state[0]; b = state[1]; c = state[2]; d = state[3]; e = state[4]; /* 4 rounds of 20 operations each. Loop unrolled. */ R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3); R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7); R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11); R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15); R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19); R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23); R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27); R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31); R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35); R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39); R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43); R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47); R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51); R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55); R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59); R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63); R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67); R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71); R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75); R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79); /* Add the working vars back into context.state[] */ state[0] += a; state[1] += b; state[2] += c; state[3] += d; state[4] += e; /* Wipe variables */ a = b = c = d = e = 0; } /* SHA1Init - Initialize new context */ void SHA1Init(SHA1Context* context) { /* SHA1 initialization constants */ context->state[0] = 0x67452301; context->state[1] = 0xEFCDAB89; context->state[2] = 0x98BADCFE; context->state[3] = 0x10325476; context->state[4] = 0xC3D2E1F0; context->count[0] = context->count[1] = 0; } /* Run your data through this. */ void SHA1Update(SHA1Context* context, const unsigned char* data, const size_t len) { size_t i, j; j = (context->count[0] >> 3) & 63; if ((context->count[0] += len << 3) < (len << 3)) context->count[1]++; context->count[1] += (len >> 29); if ((j + len) > 63) { memcpy(&context->buffer[j], data, (i = 64-j)); SHA1_Transform(context->state, context->buffer); for ( ; i + 63 < len; i += 64) { SHA1_Transform(context->state, data + i); } j = 0; } else i = 0; memcpy(&context->buffer[j], &data[i], len - i); } /* Add padding and return the message digest. */ void SHA1_Digest(SHA1Context* context, unsigned char digest[SHA1_DIGEST_SIZE]) { unsigned int i; unsigned char finalcount[8]; for (i = 0; i < 8; i++) { finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)] >> ((3-(i & 3)) * 8) ) & 255); /* Endian independent */ } SHA1Update(context, (unsigned char *)"\200", 1); while ((context->count[0] & 504) != 448) { SHA1Update(context, (unsigned char *)"\0", 1); } SHA1Update(context, finalcount, 8); /* Should cause a SHA1_Transform() */ for (i = 0; i < SHA1_DIGEST_SIZE; i++) { digest[i] = (unsigned char) ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255); } /* Wipe variables */ i = 0; memset(context->buffer, 0, 64); memset(context->state, 0, 20); memset(context->count, 0, 8); memset(finalcount, 0, 8); /* SWR */ } /* Produces a hex output of the digest. */ void SHA1Final(SHA1Context *context, char *output) { unsigned char digest[20]; int i,j; char *c = output; SHA1_Digest(context, digest); for (i = 0; i < SHA1_DIGEST_SIZE/4; i++) { for (j = 0; j < 4; j++) { sprintf(c,"%02X", digest[i*4+j]); c += 2; } } } MoarVM-2018.03/3rdparty/sha1/sha1.h0000644000175000017510000000117613237701235016624 0ustar samanthasamantha/* public api for steve reid's public domain SHA-1 implementation */ /* this file is in the public domain */ #ifndef __SHA1_H #define __SHA1_H #ifdef __cplusplus extern "C" { #endif typedef struct { unsigned int state[5]; unsigned int count[2]; unsigned char buffer[64]; } SHA1Context; #define SHA1_DIGEST_SIZE 20 void SHA1Init(SHA1Context* context); void SHA1Update(SHA1Context* context, const unsigned char* data, const size_t len); void SHA1_Digest(SHA1Context* context, unsigned char digest[SHA1_DIGEST_SIZE]); void SHA1Final(SHA1Context* context, char *output); #ifdef __cplusplus } #endif #endif /* __SHA1_H */ MoarVM-2018.03/3rdparty/tinymt/LICENSE.txt0000644000175000017510000000311113237701103020113 0ustar samanthasamanthaCopyright (c) 2011, 2013 Mutsuo Saito, Makoto Matsumoto, Hiroshima University and The University of Tokyo. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the Hiroshima University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. MoarVM-2018.03/3rdparty/tinymt/README.txt0000644000175000017510000000051313237701103017771 0ustar samanthasamantha64-bit version of TinyMT[1] as used by MoarVM[2] Original code published by Mutsuo Saito, (saito@math.sci.hiroshima-u.ac.jp) Hiroshima University Makoto Matsumoto, The University of Tokyo under the 3-clause BSD license. [1] http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/TINYMT/ [2] https://github.com/MoarVM/MoarVM/ MoarVM-2018.03/3rdparty/tinymt/tinymt64.c0000644000175000017510000000702113237701235020144 0ustar samanthasamantha/** * @file tinymt64.h * * @brief Tiny Mersenne Twister only 127 bit internal state * * @author Mutsuo Saito (Hiroshima University) * @author Makoto Matsumoto (The University of Tokyo) * * Copyright (C) 2011 Mutsuo Saito, Makoto Matsumoto, * Hiroshima University and The University of Tokyo. * All rights reserved. * * The 3-clause BSD License is applied to this software, see * LICENSE.txt * * @file tinymt64.c * * @brief 64-bit Tiny Mersenne Twister only 127 bit internal state * * @author Mutsuo Saito (Hiroshima University) * @author Makoto Matsumoto (The University of Tokyo) * * Copyright (C) 2011 Mutsuo Saito, Makoto Matsumoto, * Hiroshima University and The University of Tokyo. * All rights reserved. * * The 3-clause BSD License is applied to this software, see * LICENSE.txt */ #include #include "tinymt64.h" #define TINYMT64_SH0 12 #define TINYMT64_SH1 11 #define TINYMT64_SH8 8 #define TINYMT64_MASK UINT64_C(0x7fffffffffffffff) #define TINYMT64_MUL (1.0 / 9007199254740992.0) /* * tinymt64 default parameters */ #ifndef TINYMT64_MAT1 # define TINYMT64_MAT1 0x7a840f50 #endif #ifndef TINYMT64_MAT2 # define TINYMT64_MAT2 0xf3d8fcf6 #endif #ifndef TINYMT64_TMAT # define TINYMT64_TMAT 0x9746beffffbffffe #endif /* * Initialization loop */ #define MIN_LOOP 8 static const uint32_t mat1 = TINYMT64_MAT1; static const uint32_t mat2 = TINYMT64_MAT2; static const uint64_t tmat = TINYMT64_TMAT; /** * This function changes internal state of tinymt64. * Users should not call this function directly. * @param random tinymt internal status */ static void tinymt64_next_state(uint64_t * random) { uint64_t x; random[0] &= TINYMT64_MASK; x = random[0] ^ random[1]; x ^= x << TINYMT64_SH0; x ^= x >> 32; x ^= x << 32; x ^= x << TINYMT64_SH1; random[0] = random[1]; random[1] = x; random[0] ^= -((int64_t)(x & 1)) & mat1; random[1] ^= -((int64_t)(x & 1)) & (((uint64_t)mat2) << 32); } /** * This function outputs 64-bit unsigned integer from internal state. * Users should not call this function directly. * @param random tinymt internal status * @return 64-bit unsigned pseudorandom number */ static uint64_t uint64_temper(uint64_t * random) { uint64_t x; x = random[0] + random[1]; x ^= random[0] >> TINYMT64_SH8; x ^= -((int64_t)(x & 1)) & tmat; return x; } /** * This function outputs 64-bit unsigned integer from internal state. * @param random tinymt internal status * @return 64-bit unsigned integer r (0 <= r < 2^64) */ uint64_t tinymt64_generate_uint64(uint64_t * random) { tinymt64_next_state(random); return uint64_temper(random); } /** * This function outputs floating point number from internal state. * This function is implemented using multiplying by 1 / 2^64. * @param random tinymt internal status * @return floating point number r (0.0 <= r < 1.0) */ double tinymt64_generate_double(uint64_t * random) { tinymt64_next_state(random); return (uint64_temper(random) >> 11) * TINYMT64_MUL; } /** * This function initializes the internal state array with a 64-bit * unsigned integer seed. * @param random tinymt state vector. * @param seed a 64-bit unsigned integer used as a seed. */ void tinymt64_init(uint64_t * random, uint64_t seed) { int i; random[0] = seed ^ ((uint64_t)mat1 << 32); random[1] = mat2 ^ tmat; for (i = 1; i < MIN_LOOP; i++) { random[i & 1] ^= i + UINT64_C(6364136223846793005) * (random[(i - 1) & 1] ^ (random[(i - 1) & 1] >> 62)); } } MoarVM-2018.03/3rdparty/tinymt/tinymt64.h0000644000175000017510000000023213237701235020146 0ustar samanthasamanthavoid tinymt64_init(uint64_t *state, uint64_t seed); uint64_t tinymt64_generate_uint64(uint64_t *state); double tinymt64_generate_double(uint64_t *state); MoarVM-2018.03/3rdparty/uthash.h0000644000175000017510000010610313237701235016424 0ustar samanthasamantha/* Copyright (c) 2003-2014, Troy D. Hanson http://troydhanson.github.com/uthash/ All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* NOTE: While this started out as a stock uthash.h, by now it has * undergone numerous changes to more closely integrate it with MoarVM * strings, remove things MoarVM doesn't need, and not remember the * insertion order (resulting in changes to iteration code - and a * memory saving). */ #ifndef UTHASH_H #define UTHASH_H #include /* memcmp,strlen */ #include /* ptrdiff_t */ #include /* exit() */ /* These macros use decltype or the earlier __typeof GNU extension. As decltype is only available in newer compilers (VS2010 or gcc 4.3+ when compiling c++ source) this code uses whatever method is needed or, for VS2008 where neither is available, uses casting workarounds. */ #ifdef _MSC_VER /* MS compiler */ #if _MSC_VER >= 1600 && defined(__cplusplus) /* VS2010 or newer in C++ mode */ #define DECLTYPE(x) (decltype(x)) #else /* VS2008 or older (or VS2010 in C mode) */ #define NO_DECLTYPE #define DECLTYPE(x) #endif #else /* GNU, Sun and other compilers */ #define DECLTYPE(x) (__typeof(x)) #endif #ifdef NO_DECLTYPE #define DECLTYPE_ASSIGN(dst,src) \ do { \ char **_da_dst = (char**)(&(dst)); \ *_da_dst = (char*)(src); \ } while(0) #else #define DECLTYPE_ASSIGN(dst,src) \ do { \ (dst) = DECLTYPE(dst)(src); \ } while(0) #endif /* a number of the hash function use uint32_t which isn't defined on win32 */ #ifdef _MSC_VER typedef unsigned int uint32_t; typedef unsigned char uint8_t; #else #include /* uint32_t */ #endif #define UTHASH_VERSION 1.9.9 #ifndef uthash_fatal #define uthash_fatal(msg) exit(-1) /* fatal error (out of memory,etc) */ #endif #ifndef uthash_malloc #define uthash_malloc(sz) malloc(sz) /* malloc fcn */ #endif #ifndef uthash_free #define uthash_free(ptr,sz) free(ptr) /* free fcn */ #endif #ifndef uthash_noexpand_fyi #define uthash_noexpand_fyi(tbl) /* can be defined to log noexpand */ #endif #ifndef uthash_expand_fyi #define uthash_expand_fyi(tbl) /* can be defined to log expands */ #endif /* initial number of buckets */ #define HASH_INITIAL_NUM_BUCKETS 8 /* initial number of buckets */ #define HASH_INITIAL_NUM_BUCKETS_LOG2 3 /* lg2 of initial number of buckets */ #define HASH_BKT_CAPACITY_THRESH 10 /* expand when bucket count reaches */ /* calculate the element whose hash handle address is hhe */ #define ELMT_FROM_HH(tbl,hhp) ((void*)(((char*)(hhp)) - ((tbl)->hho))) #define HASH_FIND(hh,head,keyptr,keylen,out) \ do { \ unsigned _hf_bkt,_hf_hashv; \ out=NULL; \ if (head) { \ HASH_FCN(keyptr,keylen, (head)->hh.tbl->num_buckets, _hf_hashv, _hf_bkt); \ HASH_FIND_IN_BKT((head)->hh.tbl, hh, (head)->hh.tbl->buckets[ _hf_bkt ], \ keyptr,keylen,out); \ } \ } while (0) #define HASH_FIND_VM_STR(tc,hh,head,key,out) \ do { \ unsigned _hf_bkt,_hf_hashv; \ out=NULL; \ if (head) { \ unsigned cached_hash = (key)->body.cached_hash_code; \ if (cached_hash) { \ _hf_hashv = cached_hash; \ _hf_bkt = ((_hf_hashv) & (((head)->hh.tbl->num_buckets) - 1)); \ } \ else { \ HASH_FCN_VM_STR(tc, key, (head)->hh.tbl->num_buckets, _hf_hashv, _hf_bkt); \ } \ HASH_FIND_IN_BKT_VM_STR(tc, (head)->hh.tbl, hh, \ (head)->hh.tbl->buckets[ _hf_bkt ], key, out); \ } \ } while (0) #define HASH_MAKE_TABLE(hh,head) \ do { \ (head)->hh.tbl = (UT_hash_table*)uthash_malloc( \ sizeof(UT_hash_table)); \ if (!((head)->hh.tbl)) { uthash_fatal( "out of memory"); } \ memset((head)->hh.tbl, 0, sizeof(UT_hash_table)); \ (head)->hh.tbl->num_buckets = HASH_INITIAL_NUM_BUCKETS; \ (head)->hh.tbl->log2_num_buckets = HASH_INITIAL_NUM_BUCKETS_LOG2; \ (head)->hh.tbl->hho = (char*)(&(head)->hh) - (char*)(head); \ (head)->hh.tbl->buckets = (UT_hash_bucket*)uthash_malloc( \ HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket)); \ if (! (head)->hh.tbl->buckets) { uthash_fatal( "out of memory"); } \ memset((head)->hh.tbl->buckets, 0, \ HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket)); \ } while(0) #define HASH_ADD_KEYPTR(hh,head,keyptr,keylen_in,add) \ do { \ unsigned _ha_bkt; \ (add)->hh.key = (char*)(keyptr); \ (add)->hh.keylen = (unsigned)(keylen_in); \ if (!(head)) { \ head = (add); \ HASH_MAKE_TABLE(hh,head); \ } \ (head)->hh.tbl->num_items++; \ (add)->hh.tbl = (head)->hh.tbl; \ HASH_FCN(keyptr,keylen_in, (head)->hh.tbl->num_buckets, \ (add)->hh.hashv, _ha_bkt); \ HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt],&(add)->hh); \ HASH_FSCK(hh,head); \ } while(0) #define HASH_ADD_KEYPTR_VM_STR(tc,hh,head,key_in,add) \ do { \ unsigned _ha_bkt; \ unsigned cached_hash = (key_in)->body.cached_hash_code; \ (add)->hh.key = (key_in); \ if (!(head)) { \ head = (add); \ HASH_MAKE_TABLE(hh,head); \ } \ (head)->hh.tbl->num_items++; \ (add)->hh.tbl = (head)->hh.tbl; \ if (cached_hash) { \ (add)->hh.hashv = cached_hash; \ _ha_bkt = ((cached_hash) & (((head)->hh.tbl->num_buckets) - 1)); \ } \ else { \ HASH_FCN_VM_STR(tc, key_in, (head)->hh.tbl->num_buckets, \ (add)->hh.hashv, _ha_bkt); \ } \ HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt],&(add)->hh); \ HASH_FSCK(hh,head); \ } while(0) #define HASH_TO_BKT( hashv, num_bkts, bkt ) \ do { \ bkt = ((hashv) & ((num_bkts) - 1)); \ } while(0) /* delete "delptr" from the hash table. * The use of _hd_hh_del below deserves special explanation. * These used to be expressed using (delptr) but that led to a bug * if someone used the same symbol for the head and deletee, like * HASH_DELETE(hh,users,users); * We want that to work, but by changing the head (users) below * we were forfeiting our ability to further refer to the deletee (users) * in the patch-up process. Solution: use scratch space to * copy the deletee pointer, then the latter references are via that * scratch pointer rather than through the repointed (users) symbol. */ #define HASH_DELETE(hh,head,delptr) \ do { \ unsigned _hd_bkt; \ struct UT_hash_handle *_hd_hh_del; \ if ( (head)->hh.tbl->num_items == 1 ) { \ uthash_free((head)->hh.tbl->buckets, \ (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket) ); \ uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \ (head) = NULL; \ } else { \ _hd_hh_del = &((delptr)->hh); \ if ((delptr) == (head)) { \ unsigned cur = 0; \ while (cur < (head)->hh.tbl->num_buckets) { \ UT_hash_handle *cand = (head)->hh.tbl->buckets[cur].hh_head; \ while (cand) { \ if (cand && cand != &((delptr)->hh)) { \ DECLTYPE_ASSIGN((head), ELMT_FROM_HH((head)->hh.tbl,cand)); \ goto REPLACED_HEAD; \ } \ cand = cand->hh_next; \ } \ cur++; \ } \ uthash_fatal("Failed to replace deleted head"); \ REPLACED_HEAD: ; \ } \ HASH_TO_BKT( _hd_hh_del->hashv, (head)->hh.tbl->num_buckets, _hd_bkt); \ HASH_DEL_IN_BKT(hh,(head)->hh.tbl->buckets[_hd_bkt], _hd_hh_del); \ (head)->hh.tbl->num_items--; \ } \ HASH_FSCK(hh,head); \ } while (0) /* HASH_FSCK checks hash integrity on every add/delete when HASH_DEBUG is defined. * This is for uthash developer only; it compiles away if HASH_DEBUG isn't defined. */ #ifdef HASH_DEBUG #define HASH_OOPS(...) do { fprintf(stderr,__VA_ARGS__); exit(-1); } while (0) #define HASH_FSCK(hh,head) \ do { \ unsigned _bkt_i; \ unsigned _count, _bkt_count; \ char *_prev; \ struct UT_hash_handle *_thh; \ if (head) { \ _count = 0; \ for( _bkt_i = 0; _bkt_i < (head)->hh.tbl->num_buckets; _bkt_i++) { \ _bkt_count = 0; \ _thh = (head)->hh.tbl->buckets[_bkt_i].hh_head; \ _prev = NULL; \ while (_thh) { \ if (_prev != (char*)(_thh->hh_prev)) { \ HASH_OOPS("invalid hh_prev %p, actual %p\n", \ _thh->hh_prev, _prev ); \ } \ _bkt_count++; \ _prev = (char*)(_thh); \ _thh = _thh->hh_next; \ } \ _count += _bkt_count; \ if ((head)->hh.tbl->buckets[_bkt_i].count != _bkt_count) { \ HASH_OOPS("invalid bucket count %d, actual %d\n", \ (head)->hh.tbl->buckets[_bkt_i].count, _bkt_count); \ } \ } \ if (_count != (head)->hh.tbl->num_items) { \ HASH_OOPS("invalid hh item count %d, actual %d\n", \ (head)->hh.tbl->num_items, _count ); \ } \ } \ } while (0) #else #define HASH_FSCK(hh,head) #endif /* Use Jenkin's hash as the hash function. */ #define HASH_FCN HASH_JEN #define HASH_FCN_VM_STR HASH_JEN_VM_STR #define HASH_JEN_MIX(a,b,c) \ do { \ a -= b; a -= c; a ^= ( c >> 13 ); \ b -= c; b -= a; b ^= ( a << 8 ); \ c -= a; c -= b; c ^= ( b >> 13 ); \ a -= b; a -= c; a ^= ( c >> 12 ); \ b -= c; b -= a; b ^= ( a << 16 ); \ c -= a; c -= b; c ^= ( b >> 5 ); \ a -= b; a -= c; a ^= ( c >> 3 ); \ b -= c; b -= a; b ^= ( a << 10 ); \ c -= a; c -= b; c ^= ( b >> 15 ); \ } while (0) #define HASH_JEN(key,keylen,num_bkts,hashv,bkt) \ do { \ unsigned _hj_i,_hj_j,_hj_k; \ unsigned char *_hj_key=(unsigned char*)(key); \ hashv = 0xfeedbeef; \ _hj_i = _hj_j = 0x9e3779b9; \ _hj_k = (unsigned)(keylen); \ while (_hj_k >= 12) { \ _hj_i += (_hj_key[0] + ( (unsigned)_hj_key[1] << 8 ) \ + ( (unsigned)_hj_key[2] << 16 ) \ + ( (unsigned)_hj_key[3] << 24 ) ); \ _hj_j += (_hj_key[4] + ( (unsigned)_hj_key[5] << 8 ) \ + ( (unsigned)_hj_key[6] << 16 ) \ + ( (unsigned)_hj_key[7] << 24 ) ); \ hashv += (_hj_key[8] + ( (unsigned)_hj_key[9] << 8 ) \ + ( (unsigned)_hj_key[10] << 16 ) \ + ( (unsigned)_hj_key[11] << 24 ) ); \ \ HASH_JEN_MIX(_hj_i, _hj_j, hashv); \ \ _hj_key += 12; \ _hj_k -= 12; \ } \ hashv += keylen; \ switch ( _hj_k ) { \ case 11: hashv += ( (unsigned)_hj_key[10] << 24 ); \ case 10: hashv += ( (unsigned)_hj_key[9] << 16 ); \ case 9: hashv += ( (unsigned)_hj_key[8] << 8 ); \ case 8: _hj_j += ( (unsigned)_hj_key[7] << 24 ); \ case 7: _hj_j += ( (unsigned)_hj_key[6] << 16 ); \ case 6: _hj_j += ( (unsigned)_hj_key[5] << 8 ); \ case 5: _hj_j += _hj_key[4]; \ case 4: _hj_i += ( (unsigned)_hj_key[3] << 24 ); \ case 3: _hj_i += ( (unsigned)_hj_key[2] << 16 ); \ case 2: _hj_i += ( (unsigned)_hj_key[1] << 8 ); \ case 1: _hj_i += _hj_key[0]; \ } \ HASH_JEN_MIX(_hj_i, _hj_j, hashv); \ bkt = hashv & (num_bkts-1); \ } while(0) #define HASH_JEN_VM_STR(tc,key,num_bkts,hashv,bkt) \ do { \ MVM_string_compute_hash_code(tc, key); \ hashv = (key)->body.cached_hash_code; \ bkt = hashv & (num_bkts-1); \ } while(0) /* key comparison function; return 0 if keys equal */ #define HASH_KEYCMP(a,b,len) memcmp(a,b,len) /* iterate over items in a known bucket to find desired item */ #define HASH_FIND_IN_BKT(tbl,hh,head,keyptr,keylen_in,out) \ do { \ if (head.hh_head) DECLTYPE_ASSIGN(out,ELMT_FROM_HH(tbl,head.hh_head)); \ else out=NULL; \ while (out) { \ if ((out)->hh.keylen == keylen_in) { \ if ((HASH_KEYCMP((out)->hh.key,keyptr,keylen_in)) == 0) break; \ } \ if ((out)->hh.hh_next) DECLTYPE_ASSIGN(out,ELMT_FROM_HH(tbl,(out)->hh.hh_next)); \ else out = NULL; \ } \ } while(0) /* iterate over items in a known bucket to find desired item */ #define HASH_FIND_IN_BKT_VM_STR(tc,tbl,hh,head,key_in,out) \ do { \ if (head.hh_head) DECLTYPE_ASSIGN(out,ELMT_FROM_HH(tbl,head.hh_head)); \ else out=NULL; \ while (out) { \ if (MVM_string_equal(tc, (key_in), (MVMString *)((out)->hh.key))) \ break; \ if ((out)->hh.hh_next) \ DECLTYPE_ASSIGN(out,ELMT_FROM_HH(tbl,(out)->hh.hh_next)); \ else \ out = NULL; \ } \ } while(0) /* add an item to a bucket */ #define HASH_ADD_TO_BKT(head,addhh) \ do { \ head.count++; \ (addhh)->hh_next = head.hh_head; \ (addhh)->hh_prev = NULL; \ if (head.hh_head) { (head).hh_head->hh_prev = (addhh); } \ (head).hh_head=addhh; \ if (head.count >= ((head.expand_mult+1) * HASH_BKT_CAPACITY_THRESH) \ && (addhh)->tbl->noexpand != 1) { \ HASH_EXPAND_BUCKETS((addhh)->tbl); \ } \ } while(0) /* remove an item from a given bucket */ #define HASH_DEL_IN_BKT(hh,head,hh_del) \ (head).count--; \ if ((head).hh_head == hh_del) { \ (head).hh_head = hh_del->hh_next; \ } \ if (hh_del->hh_prev) { \ hh_del->hh_prev->hh_next = hh_del->hh_next; \ } \ if (hh_del->hh_next) { \ hh_del->hh_next->hh_prev = hh_del->hh_prev; \ } /* Bucket expansion has the effect of doubling the number of buckets * and redistributing the items into the new buckets. Ideally the * items will distribute more or less evenly into the new buckets * (the extent to which this is true is a measure of the quality of * the hash function as it applies to the key domain). * * With the items distributed into more buckets, the chain length * (item count) in each bucket is reduced. Thus by expanding buckets * the hash keeps a bound on the chain length. This bounded chain * length is the essence of how a hash provides constant time lookup. * * The calculation of tbl->ideal_chain_maxlen below deserves some * explanation. First, keep in mind that we're calculating the ideal * maximum chain length based on the *new* (doubled) bucket count. * In fractions this is just n/b (n=number of items,b=new num buckets). * Since the ideal chain length is an integer, we want to calculate * ceil(n/b). We don't depend on floating point arithmetic in this * hash, so to calculate ceil(n/b) with integers we could write * * ceil(n/b) = (n/b) + ((n%b)?1:0) * * and in fact a previous version of this hash did just that. * But now we have improved things a bit by recognizing that b is * always a power of two. We keep its base 2 log handy (call it lb), * so now we can write this with a bit shift and logical AND: * * ceil(n/b) = (n>>lb) + ( (n & (b-1)) ? 1:0) * */ #define HASH_EXPAND_BUCKETS(tbl) \ do { \ unsigned _he_bkt; \ unsigned _he_bkt_i; \ struct UT_hash_handle *_he_thh, *_he_hh_nxt; \ UT_hash_bucket *_he_new_buckets, *_he_newbkt; \ _he_new_buckets = (UT_hash_bucket*)uthash_malloc( \ 2 * tbl->num_buckets * sizeof(struct UT_hash_bucket)); \ if (!_he_new_buckets) { uthash_fatal( "out of memory"); } \ memset(_he_new_buckets, 0, \ 2 * tbl->num_buckets * sizeof(struct UT_hash_bucket)); \ tbl->ideal_chain_maxlen = \ (tbl->num_items >> (tbl->log2_num_buckets+1)) + \ ((tbl->num_items & ((tbl->num_buckets*2)-1)) ? 1 : 0); \ tbl->nonideal_items = 0; \ for(_he_bkt_i = 0; _he_bkt_i < tbl->num_buckets; _he_bkt_i++) \ { \ _he_thh = tbl->buckets[ _he_bkt_i ].hh_head; \ while (_he_thh) { \ _he_hh_nxt = _he_thh->hh_next; \ HASH_TO_BKT( _he_thh->hashv, tbl->num_buckets*2, _he_bkt); \ _he_newbkt = &(_he_new_buckets[ _he_bkt ]); \ if (++(_he_newbkt->count) > tbl->ideal_chain_maxlen) { \ tbl->nonideal_items++; \ _he_newbkt->expand_mult = _he_newbkt->count / \ tbl->ideal_chain_maxlen; \ } \ _he_thh->hh_prev = NULL; \ _he_thh->hh_next = _he_newbkt->hh_head; \ if (_he_newbkt->hh_head) _he_newbkt->hh_head->hh_prev = \ _he_thh; \ _he_newbkt->hh_head = _he_thh; \ _he_thh = _he_hh_nxt; \ } \ } \ uthash_free( tbl->buckets, tbl->num_buckets*sizeof(struct UT_hash_bucket) ); \ tbl->num_buckets *= 2; \ tbl->log2_num_buckets++; \ tbl->buckets = _he_new_buckets; \ tbl->ineff_expands = (tbl->nonideal_items > (tbl->num_items >> 1)) ? \ (tbl->ineff_expands+1) : 0; \ if (tbl->ineff_expands > 1) { \ tbl->noexpand=1; \ uthash_noexpand_fyi(tbl); \ } \ uthash_expand_fyi(tbl); \ } while(0) #define HASH_CLEAR(hh,head) \ do { \ if (head) { \ uthash_free((head)->hh.tbl->buckets, \ (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket)); \ uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \ (head)=NULL; \ } \ } while(0) /* obtain a count of items in the hash */ #define HASH_CNT(hh,head) ((head)?((head)->hh.tbl->num_items):0) typedef struct UT_hash_bucket { struct UT_hash_handle *hh_head; unsigned count; /* expand_mult is normally set to 0. In this situation, the max chain length * threshold is enforced at its default value, HASH_BKT_CAPACITY_THRESH. (If * the bucket's chain exceeds this length, bucket expansion is triggered). * However, setting expand_mult to a non-zero value delays bucket expansion * (that would be triggered by additions to this particular bucket) * until its chain length reaches a *multiple* of HASH_BKT_CAPACITY_THRESH. * (The multiplier is simply expand_mult+1). The whole idea of this * multiplier is to reduce bucket expansions, since they are expensive, in * situations where we know that a particular bucket tends to be overused. * It is better to let its chain length grow to a longer yet-still-bounded * value, than to do an O(n) bucket expansion too often. */ unsigned expand_mult; } UT_hash_bucket; typedef struct UT_hash_table { UT_hash_bucket *buckets; unsigned num_buckets, log2_num_buckets; unsigned num_items; ptrdiff_t hho; /* hash handle offset (byte pos of hash handle in element */ /* in an ideal situation (all buckets used equally), no bucket would have * more than ceil(#items/#buckets) items. that's the ideal chain length. */ unsigned ideal_chain_maxlen; /* nonideal_items is the number of items in the hash whose chain position * exceeds the ideal chain maxlen. these items pay the penalty for an uneven * hash distribution; reaching them in a chain traversal takes >ideal steps */ unsigned nonideal_items; /* ineffective expands occur when a bucket doubling was performed, but * afterward, more than half the items in the hash had nonideal chain * positions. If this happens on two consecutive expansions we inhibit any * further expansion, as it's not helping; this happens when the hash * function isn't a good fit for the key domain. When expansion is inhibited * the hash will still work, albeit no longer in constant time. */ unsigned ineff_expands, noexpand; } UT_hash_table; typedef struct UT_hash_handle { struct UT_hash_table *tbl; struct UT_hash_handle *hh_prev; /* previous hh in bucket order */ struct UT_hash_handle *hh_next; /* next hh in bucket order */ void *key; /* ptr to enclosing struct's key (char * for * low-level hashes, MVMString * for high level * hashes) */ unsigned keylen; /* enclosing struct's key len */ unsigned hashv; /* result of hash-fcn(key) */ } UT_hash_handle; MVM_STATIC_INLINE void * HASH_ITER_FIRST_ITEM( struct UT_hash_table *ht, unsigned *bucket_tmp) { if (!ht) return NULL; while (*bucket_tmp < ht->num_buckets) { struct UT_hash_handle *hh_head = ht->buckets[*bucket_tmp].hh_head; if (hh_head) return ELMT_FROM_HH(ht, hh_head); (*bucket_tmp)++; } return NULL; } MVM_STATIC_INLINE void * HASH_ITER_NEXT_ITEM( struct UT_hash_handle *cur_handle, unsigned *bucket_tmp) { struct UT_hash_table *ht = cur_handle->tbl; if (cur_handle->hh_next) return ELMT_FROM_HH(ht, cur_handle->hh_next); (*bucket_tmp)++; while (*bucket_tmp < ht->num_buckets) { struct UT_hash_handle *hh_head = ht->buckets[*bucket_tmp].hh_head; if (hh_head) return ELMT_FROM_HH(ht, hh_head); (*bucket_tmp)++; } return NULL; } #define HASH_ITER(hh,head,el,tmp,bucket_tmp) \ for((bucket_tmp) = 0, \ (el) = HASH_ITER_FIRST_ITEM((head) ? (head)->hh.tbl : NULL, &(bucket_tmp)), \ (tmp) = ((el) ? HASH_ITER_NEXT_ITEM(&((el)->hh), &(bucket_tmp)) : NULL); \ (el); \ (el) = (tmp), \ (tmp) = ((tmp) ? HASH_ITER_NEXT_ITEM(&((tmp)->hh), &(bucket_tmp)) : NULL)) #endif /* UTHASH_H */ MoarVM-2018.03/Artistic2.txt0000644000175000017510000002130613237701124015612 0ustar samanthasamantha The Artistic License 2.0 Copyright (c) 2000-2006, The Perl Foundation. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble This license establishes the terms under which a given free software Package may be copied, modified, distributed, and/or redistributed. The intent is that the Copyright Holder maintains some artistic control over the development of that Package while still keeping the Package available as open source and free software. You are always permitted to make arrangements wholly outside of this license directly with the Copyright Holder of a given Package. If the terms of this license do not permit the full use that you propose to make of the Package, you should contact the Copyright Holder and seek a different licensing arrangement. Definitions "Copyright Holder" means the individual(s) or organization(s) named in the copyright notice for the entire Package. "Contributor" means any party that has contributed code or other material to the Package, in accordance with the Copyright Holder's procedures. "You" and "your" means any person who would like to copy, distribute, or modify the Package. "Package" means the collection of files distributed by the Copyright Holder, and derivatives of that collection and/or of those files. A given Package may consist of either the Standard Version, or a Modified Version. "Distribute" means providing a copy of the Package or making it accessible to anyone else, or in the case of a company or organization, to others outside of your company or organization. "Distributor Fee" means any fee that you charge for Distributing this Package or providing support for this Package to another party. It does not mean licensing fees. "Standard Version" refers to the Package if it has not been modified, or has been modified only in ways explicitly requested by the Copyright Holder. "Modified Version" means the Package, if it has been changed, and such changes were not explicitly requested by the Copyright Holder. "Original License" means this Artistic License as Distributed with the Standard Version of the Package, in its current version or as it may be modified by The Perl Foundation in the future. "Source" form means the source code, documentation source, and configuration files for the Package. "Compiled" form means the compiled bytecode, object code, binary, or any other form resulting from mechanical transformation or translation of the Source form. Permission for Use and Modification Without Distribution (1) You are permitted to use the Standard Version and create and use Modified Versions for any purpose without restriction, provided that you do not Distribute the Modified Version. Permissions for Redistribution of the Standard Version (2) You may Distribute verbatim copies of the Source form of the Standard Version of this Package in any medium without restriction, either gratis or for a Distributor Fee, provided that you duplicate all of the original copyright notices and associated disclaimers. At your discretion, such verbatim copies may or may not include a Compiled form of the Package. (3) You may apply any bug fixes, portability changes, and other modifications made available from the Copyright Holder. The resulting Package will still be considered the Standard Version, and as such will be subject to the Original License. Distribution of Modified Versions of the Package as Source (4) You may Distribute your Modified Version as Source (either gratis or for a Distributor Fee, and with or without a Compiled form of the Modified Version) provided that you clearly document how it differs from the Standard Version, including, but not limited to, documenting any non-standard features, executables, or modules, and provided that you do at least ONE of the following: (a) make the Modified Version available to the Copyright Holder of the Standard Version, under the Original License, so that the Copyright Holder may include your modifications in the Standard Version. (b) ensure that installation of your Modified Version does not prevent the user installing or running the Standard Version. In addition, the Modified Version must bear a name that is different from the name of the Standard Version. (c) allow anyone who receives a copy of the Modified Version to make the Source form of the Modified Version available to others under (i) the Original License or (ii) a license that permits the licensee to freely copy, modify and redistribute the Modified Version using the same licensing terms that apply to the copy that the licensee received, and requires that the Source form of the Modified Version, and of any works derived from it, be made freely available in that license fees are prohibited but Distributor Fees are allowed. Distribution of Compiled Forms of the Standard Version or Modified Versions without the Source (5) You may Distribute Compiled forms of the Standard Version without the Source, provided that you include complete instructions on how to get the Source of the Standard Version. Such instructions must be valid at the time of your distribution. If these instructions, at any time while you are carrying out such distribution, become invalid, you must provide new instructions on demand or cease further distribution. If you provide valid instructions or cease distribution within thirty days after you become aware that the instructions are invalid, then you do not forfeit any of your rights under this license. (6) You may Distribute a Modified Version in Compiled form without the Source, provided that you comply with Section 4 with respect to the Source of the Modified Version. Aggregating or Linking the Package (7) You may aggregate the Package (either the Standard Version or Modified Version) with other packages and Distribute the resulting aggregation provided that you do not charge a licensing fee for the Package. Distributor Fees are permitted, and licensing fees for other components in the aggregation are permitted. The terms of this license apply to the use and Distribution of the Standard or Modified Versions as included in the aggregation. (8) You are permitted to link Modified and Standard Versions with other works, to embed the Package in a larger work of your own, or to build stand-alone binary or bytecode versions of applications that include the Package, and Distribute the result without restriction, provided the result does not expose a direct interface to the Package. Items That are Not Considered Part of a Modified Version (9) Works (including, but not limited to, modules and scripts) that merely extend or make use of the Package, do not, by themselves, cause the Package to be a Modified Version. In addition, such works are not considered parts of the Package itself, and are not subject to the terms of this license. General Provisions (10) Any use, modification, and distribution of the Standard or Modified Versions is governed by this Artistic License. By using, modifying or distributing the Package, you accept this license. Do not use, modify, or distribute the Package, if you do not accept this license. (11) If your Modified Version has been derived from a Modified Version made by someone other than you, you are nevertheless required to ensure that your Modified Version complies with the requirements of this license. (12) This license does not grant you the right to use any trademark, service mark, tradename, or logo of the Copyright Holder. (13) This license includes the non-exclusive, worldwide, free-of-charge patent license to make, have made, use, offer to sell, sell, import and otherwise transfer the Package with respect to any patent claims licensable by the Copyright Holder that are necessarily infringed by the Package. If you institute patent litigation (including a cross-claim or counterclaim) against any party alleging that the Package constitutes direct or contributory patent infringement, then this Artistic License to you shall terminate on the date that such litigation is filed. (14) Disclaimer of Warranty: THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. MoarVM-2018.03/CREDITS0000644000175000017510000000330713237701105014225 0ustar samanthasamanthaHere is the partial list of people who have contributed to MoarVM. It is sorted by name and formatted to allow easy grepping and beautification by scripts. The fields are: name (N), email (E), web-address (W), description (D) and GitHub username (U). Thanks, The MoarVM Team PS: Yes, this looks remarkably like the Linux CREDITS format PPS: This file is encoded in UTF-8 ---------- N: Andy Dougherty D: Many portability and build improvements N: Brian Gernhardt D: Build system and IO patches N: Carl Mäsak E: cmasak@gmail.com U: masak D: Code cleanups and refactors N: Chris 'BinGOs' Williams D: BSD porting N: Dagur Valberg Johannsson D: Core fixes N: Geoff Broadwell U: japhb E: geoff@broadwell.org D: Big integer support, porting, many code and build improvements N: Gerhard R U: not_gerd D: Extension ops, bytecode validation, cgoto interpreter, RNG, build, and more U: grondilu D: Typo fix N: Jimmy Zhuo D: libuv integration, numerous core contributions and bug fixes N: Jonathan Worthington U: jnthn D: Project co-founder, lead architect, object model, GC, other bits N: Marc Chantreux D: Build tweaks N: Matthew Wilson U: diakopter D: Project co-founder, Unicode, GC, and much more N: Moritz Lenz E: moritz@faui2k3.org U: moritz D: Various build and ops improvements N: Nicholas Clark E: nick@ccl4.org D: Epic GC bug hunting and fixing N: Norbert Buchmuller D: Build fix N: Timo Paulssen U: timo E: timonator@perpetuum-immobile.de D: Various string and big integer fixes N: Tobias Leich U: FROGGS E: email@froggs.de D: Many contributions to core ops, IO, strings, and build system N: Tokuhiro Matsuno D: Documentation patch N: Will "Coke" Coleda U: coke E: will@coleda.com D: Basic Darwin build support MoarVM-2018.03/Configure.pl0000755000175000017510000007727513242626641015514 0ustar samanthasamantha#!/usr/bin/env perl use strict; use warnings; use Config; use Getopt::Long; use Pod::Usage; use File::Spec; use lib '.'; use build::setup; use build::auto; use build::probe; # This allows us to run on ancient perls. sub defined_or($$) { defined $_[0] ? $_[0] : $_[1] } my $NAME = 'moar'; my $GENLIST = 'build/gen.list'; # configuration logic my $failed = 0; my %args; my %defaults; my %config; my @args = @ARGV; GetOptions(\%args, qw( help|? debug:s optimize:s instrument! coverage os=s shell=s toolchain=s compiler=s ar=s cc=s ld=s make=s has-sha has-libuv static has-libtommath has-libatomic_ops has-dyncall has-libffi pkgconfig=s build=s host=s big-endian jit! enable-jit prefix=s bindir=s libdir=s mastdir=s make-install asan ubsan valgrind telemeh), 'no-optimize|nooptimize' => sub { $args{optimize} = 0 }, 'no-debug|nodebug' => sub { $args{debug} = 0 }, 'no-telemeh|notelemeh' => sub { $args{telemeh} = 0 } ) or die "See --help for further information\n"; pod2usage(1) if $args{help}; print "Welcome to MoarVM!\n\n"; $config{prefix} = File::Spec->rel2abs(defined_or $args{prefix}, 'install'); # don't install to cwd, as this would clash with lib/MAST/*.nqp if (-e 'README.markdown' && -e "$config{prefix}/README.markdown" && -s 'README.markdown' == -s "$config{prefix}/README.markdown") { die <&1}; if ($? >> 8 == 0) { print "OK\n" } else { softfail("git error: $msg") } } # fiddle with flags $args{optimize} = 3 if not defined $args{optimize} or $args{optimize} eq ""; $args{debug} = 3 if defined $args{debug} and $args{debug} eq ""; for (qw(coverage instrument static big-endian has-libtommath has-sha has-libuv has-libatomic_ops asan ubsan valgrind)) { $args{$_} = 0 unless defined $args{$_}; } # jit is default $args{jit} = 1 unless defined $args{jit}; # fill in C<%defaults> if (exists $args{build} || exists $args{host}) { setup_cross($args{build}, $args{host}); } else { setup_native(defined_or $args{os}, $^O); } $config{name} = $NAME; $config{perl} = $^X; $config{config} = join ' ', map { / / ? "\"$_\"" : $_ } @args; $config{osname} = $^O; $config{osvers} = $Config{osvers}; $config{pkgconfig} = defined_or $args{pkgconfig}, '/usr/bin/pkg-config'; # set options that take priority over all others my @keys = qw( ar cc ld make ); @config{@keys} = @args{@keys}; for (keys %defaults) { next if /^-/; $config{$_} = $defaults{$_} unless defined $config{$_}; } my $VERSION = '0.0-0'; # get version if (open(my $fh, '<', 'VERSION')) { $VERSION = <$fh>; close($fh); } # .git is a file and not a directory in submodule if (-e '.git' && open(my $GIT, '-|', "git describe")) { $VERSION = <$GIT>; close($GIT); } chomp $VERSION; $config{version} = $VERSION; $config{versionmajor} = $VERSION =~ /^(\d+)/ ? $1 : 0; $config{versionminor} = $VERSION =~ /^\d+\.(\d+)/ ? $1 : 0; $config{versionpatch} = $VERSION =~ /^\d+\.\d+\-(\d+)/ ? $1 : 0; # misc defaults $config{exe} = '' unless defined $config{exe}; $config{defs} = [] unless defined $config{defs}; $config{syslibs} = [] unless defined $config{syslibs}; $config{usrlibs} = [] unless defined $config{usrlibs}; $config{platform} = '' unless defined $config{platform}; $config{crossconf} = '' unless defined $config{crossconf}; $config{dllimport} = '' unless defined $config{dllimport}; $config{dllexport} = '' unless defined $config{dllexport}; $config{dlllocal} = '' unless defined $config{dlllocal}; $config{translate_newline_output} = 0 unless defined $config{translate_newline_output}; # assume the compiler can be used as linker frontend $config{ld} = $config{cc} unless defined $config{ld}; $config{ldout} = $config{ccout} unless defined $config{ldout}; $config{ldsys} = $config{ldusr} unless defined $config{ldsys}; $config{ldoptiflags} = $config{ccoptiflags} unless defined $config{ldoptiflags}; $config{lddebugflags} = $config{ccdebugflags} unless defined $config{lddebugflags}; $config{ldinstflags} = $config{ccinstflags} unless defined $config{ldinstflags}; # Probe the compiler. build::probe::compiler_usability(\%config, \%defaults); # Remove unsupported -Werror=* gcc flags if gcc doesn't support them. build::probe::specific_werror(\%config, \%defaults); if ($config{cc} eq 'gcc' && !$config{can_specific_werror}) { $config{ccmiscflags} =~ s/-Werror=[^ ]+//g; $config{ccmiscflags} =~ s/ +/ /g; $config{ccmiscflags} =~ s/^ +$//; } # Set the remaining ldmiscflags. Do this after probing for gcc -Werror probe to not miss that change for the linker. $config{ldmiscflags} = $config{ccmiscflags} unless defined $config{ldmiscflags}; if ($args{'has-sha'}) { $config{shaincludedir} = '/usr/include/sha'; $defaults{-thirdparty}->{sha} = undef; unshift @{$config{usrlibs}}, 'sha'; } else { $config{shaincludedir} = '3rdparty/sha1' } # After upgrading from libuv from 0.11.18 to 0.11.29 we see very weird erros # when the old libuv files are still around. Running a `make realclean` in # case we spot an old file and the Makefile is already there. if (-e '3rdparty/libuv/src/unix/threadpool' . $defaults{obj} && -e 'Makefile') { print("\nMaking realclean after libuv version upgrade.\n" . "Outdated files were detected.\n"); system($defaults{make}, 'realclean') } # test whether pkg-config works if (-e "$config{pkgconfig}") { print dots(" Testing pkgconfig"); system("$config{pkgconfig}", "--version"); if ( $? == 0 ) { $config{pkgconfig_works} = 1; } else { $config{pkgconfig_works} = 0; } } # conditionally set include dirs and install rules $config{cincludes} = '' unless defined $config{cincludes}; $config{install} = '' unless defined $config{install}; if ($args{'has-libuv'}) { $defaults{-thirdparty}->{uv} = undef; unshift @{$config{usrlibs}}, 'uv'; if ($config{pkgconfig_works}) { my $result = `$config{pkgconfig} --cflags libuv`; if ( $? == 0 ) { $result =~ s/\n/ /g; $config{cincludes} .= ' ' . "$result"; print("Adding extra include for libuv: $result\n"); } else { print("Error occured when running $config{pkgconfig} --cflags libuv.\n"); } } } else { $config{cincludes} .= ' ' . $defaults{ccinc} . '3rdparty/libuv/include' . ' ' . $defaults{ccinc} . '3rdparty/libuv/src'; $config{install} .= "\t\$(MKPATH) \$(DESTDIR)\$(PREFIX)/include/libuv\n" . "\t\$(CP) 3rdparty/libuv/include/*.h \$(DESTDIR)\$(PREFIX)/include/libuv\n"; } if ($args{'has-libatomic_ops'}) { $defaults{-thirdparty}->{lao} = undef; unshift @{$config{usrlibs}}, 'atomic_ops'; if ($config{pkgconfig_works}) { my $result = `$config{pkgconfig} --cflags atomic_ops`; if ( $? == 0 ) { $result =~ s/\n/ /g; $config{cincludes} .= ' ' . "$result"; print("Adding extra include for atomic_ops: $result\n"); } else { print("Error occured when running $config{pkgconfig} --cflags atomic_ops.\n"); } } } else { $config{cincludes} .= ' ' . $defaults{ccinc} . '3rdparty/libatomic_ops/src'; my $lao = '$(DESTDIR)$(PREFIX)/include/libatomic_ops'; $config{install} .= "\t\$(MKPATH) $lao/atomic_ops/sysdeps/armcc\n" . "\t\$(MKPATH) $lao/atomic_ops/sysdeps/gcc\n" . "\t\$(MKPATH) $lao/atomic_ops/sysdeps/hpc\n" . "\t\$(MKPATH) $lao/atomic_ops/sysdeps/ibmc\n" . "\t\$(MKPATH) $lao/atomic_ops/sysdeps/icc\n" . "\t\$(MKPATH) $lao/atomic_ops/sysdeps/loadstore\n" . "\t\$(MKPATH) $lao/atomic_ops/sysdeps/msftc\n" . "\t\$(MKPATH) $lao/atomic_ops/sysdeps/sunc\n" . "\t\$(CP) 3rdparty/libatomic_ops/src/*.h $lao\n" . "\t\$(CP) 3rdparty/libatomic_ops/src/atomic_ops/*.h $lao/atomic_ops\n" . "\t\$(CP) 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/*.h $lao/atomic_ops/sysdeps\n" . "\t\$(CP) 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/armcc/*.h $lao/atomic_ops/sysdeps/armcc\n" . "\t\$(CP) 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/gcc/*.h $lao/atomic_ops/sysdeps/gcc\n" . "\t\$(CP) 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/hpc/*.h $lao/atomic_ops/sysdeps/hpc\n" . "\t\$(CP) 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/ibmc/*.h $lao/atomic_ops/sysdeps/ibmc\n" . "\t\$(CP) 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/icc/*.h $lao/atomic_ops/sysdeps/icc\n" . "\t\$(CP) 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/loadstore/*.h $lao/atomic_ops/sysdeps/loadstore\n" . "\t\$(CP) 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/msftc/*.h $lao/atomic_ops/sysdeps/msftc\n" . "\t\$(CP) 3rdparty/libatomic_ops/src/atomic_ops/sysdeps/sunc/*.h $lao/atomic_ops/sysdeps/sunc\n"; } if ($args{'has-libtommath'}) { $defaults{-thirdparty}->{tom} = undef; unshift @{$config{usrlibs}}, 'tommath'; } else { $config{cincludes} .= ' ' . $defaults{ccinc} . '3rdparty/libtommath'; $config{install} .= "\t\$(MKPATH) \$(DESTDIR)\$(PREFIX)/include/libtommath\n" . "\t\$(CP) 3rdparty/libtommath/*.h \$(DESTDIR)\$(PREFIX)/include/libtommath\n"; } if ($args{'has-libffi'}) { $config{nativecall_backend} = 'libffi'; unshift @{$config{usrlibs}}, 'ffi'; push @{$config{defs}}, 'HAVE_LIBFFI'; $defaults{-thirdparty}->{dc} = undef; $defaults{-thirdparty}->{dcb} = undef; $defaults{-thirdparty}->{dl} = undef; if ($config{pkgconfig_works}) { my $result_cflags = `$config{pkgconfig} --cflags libffi`; if ( $? == 0 ) { $result_cflags =~ s/\n/ /g; $config{cincludes} .= " $result_cflags"; print("Adding extra include for libffi: $result_cflags\n"); } else { print("Error occured when running $config{pkgconfig} --cflags libffi.\n"); } my $result_libs = `$config{pkgconfig} --libs libffi`; if ( $? == 0 ) { $result_libs =~ s/\n/ /g; $config{ldusr} .= " $result_libs"; print("Adding extra libs for libffi: $result_libs\n"); } else { print("Error occured when running $config{pkgconfig} --libs libffi.\n"); } } elsif ($^O eq 'solaris') { my ($first) = map { m,(.+)/ffi\.h$, && "/$1" } grep { m,/ffi\.h$, } `pkg contents libffi`; if ($first) { $config{cincludes} .= " -I$first"; print("Adding extra include for libffi: $first\n"); } else { print("Unable to find ffi.h. Please install libffi by doing: 'sudo pkg install libffi'\n"); } } } elsif ($args{'has-dyncall'}) { unshift @{$config{usrlibs}}, 'dyncall_s', 'dyncallback_s', 'dynload_s'; $defaults{-thirdparty}->{dc} = undef; $defaults{-thirdparty}->{dcb} = undef; $defaults{-thirdparty}->{dl} = undef; $config{nativecall_backend} = 'dyncall'; } else { $config{nativecall_backend} = 'dyncall'; $config{cincludes} .= ' ' . $defaults{ccinc} . '3rdparty/dyncall/dynload' . ' ' . $defaults{ccinc} . '3rdparty/dyncall/dyncall' . ' ' . $defaults{ccinc} . '3rdparty/dyncall/dyncallback'; $config{install} .= "\t\$(MKPATH) \$(DESTDIR)\$(PREFIX)/include/dyncall\n" . "\t\$(CP) 3rdparty/dyncall/dynload/*.h \$(DESTDIR)\$(PREFIX)/include/dyncall\n" . "\t\$(CP) 3rdparty/dyncall/dyncall/*.h \$(DESTDIR)\$(PREFIX)/include/dyncall\n" . "\t\$(CP) 3rdparty/dyncall/dyncallback/*.h \$(DESTDIR)\$(PREFIX)/include/dyncall\n"; } # mangle library names $config{ldlibs} = join ' ', (map { sprintf $config{ldusr}, $_; } @{$config{usrlibs}}), (map { sprintf $config{ldsys}, $_; } @{$config{syslibs}}); $config{ldlibs} = ' -lasan ' . $config{ldlibs} if $args{asan} and $^O ne 'darwin'; $config{ldlibs} = ' -lubsan ' . $config{ldlibs} if $args{ubsan} and $^O ne 'darwin'; # macro defs $config{ccdefflags} = join ' ', map { $config{ccdef} . $_ } @{$config{defs}}; $config{ccoptiflags} = sprintf $config{ccoptiflags}, defined_or $args{optimize}, 1 if $config{ccoptiflags} =~ /%s/; $config{ccdebugflags} = sprintf $config{ccdebugflags}, defined_or $args{debug}, 3 if $config{ccdebugflags} =~ /%s/; $config{ldoptiflags} = sprintf $config{ldoptiflags}, defined_or $args{optimize}, 1 if $config{ldoptiflags} =~ /%s/; $config{lddebugflags} = sprintf $config{lddebugflags}, defined_or $args{debug}, 3 if $config{lddebugflags} =~ /%s/; # generate CFLAGS my @cflags; push @cflags, $config{ccmiscflags}; push @cflags, $config{ccoptiflags} if $args{optimize}; push @cflags, $config{ccdebugflags} if $args{debug}; push @cflags, $config{ccinstflags} if $args{instrument}; push @cflags, $config{ld_covflags} if $args{coverage}; push @cflags, $config{ccwarnflags}; push @cflags, $config{ccdefflags}; push @cflags, $config{ccshared} unless $args{static}; push @cflags, '-fno-omit-frame-pointer' if $args{asan} or $args{ubsan}; push @cflags, '-fsanitize=address' if $args{asan}; push @cflags, '-fsanitize=undefined' if $args{ubsan}; push @cflags, '-DWSL_BASH_ON_WIN' if wsl_bash_on_win(); push @cflags, '-DDEBUG_HELPERS' if $args{debug}; push @cflags, '-DMVM_VALGRIND_SUPPORT' if $args{valgrind}; push @cflags, '-DHAVE_TELEMEH' if $args{telemeh}; push @cflags, '-DWORDS_BIGENDIAN' if $config{be}; # 3rdparty/sha1 needs it and it isnt set on mips; push @cflags, $ENV{CFLAGS} if $ENV{CFLAGS}; push @cflags, $ENV{CPPFLAGS} if $ENV{CPPFLAGS}; $config{cflags} = join ' ', @cflags; # generate LDFLAGS my @ldflags = ($config{ldmiscflags}); push @ldflags, $config{ldoptiflags} if $args{optimize}; push @ldflags, $config{lddebugflags} if $args{debug}; push @ldflags, $config{ldinstflags} if $args{instrument}; push @ldflags, $config{ld_covflags} if $args{coverage}; push @ldflags, $config{ldrpath} if not $args{static} and $config{prefix} ne '/usr'; push @ldflags, '-fsanitize=address' if $args{asan}; push @ldflags, $ENV{LDFLAGS} if $ENV{LDFLAGS}; $config{ldflags} = join ' ', @ldflags; # setup library names $config{moarlib} = sprintf $config{lib}, $NAME; $config{moardll} = sprintf $config{dll}, $NAME; # setup flags for shared builds unless ($args{static}) { $config{objflags} = '@ccdef@MVM_BUILD_SHARED @ccshared@'; $config{mainflags} = '@ccdef@MVM_SHARED'; $config{moar} = '@moardll@'; $config{impinst} = $config{sharedlib}, $config{mainlibs} = '@lddir@. ' . sprintf(defined_or($config{ldimp}, $config{ldusr}), $NAME); } else { $config{objflags} = ''; $config{mainflags} = ''; $config{moar} = '@moarlib@'; $config{impinst} = $config{staticlib}; $config{mainlibs} = '@moarlib@ @thirdpartylibs@ $(LDLIBS)'; # Install static library in default location $config{libdir} = '@prefix@/lib' if ! $args{libdir}; } $config{mainlibs} = '-lubsan ' . $config{mainlibs} if $args{ubsan}; # some toolchains generate garbage my @auxfiles = @{ $defaults{-auxfiles} }; $config{auxclean} = @auxfiles ? '$(RM) ' . join ' ', @auxfiles : '@:'; print "OK\n\n"; if ($config{crossconf}) { build::auto::detect_cross(\%config, \%defaults); build::probe::static_inline_cross(\%config, \%defaults); build::probe::unaligned_access_cross(\%config, \%defaults); build::probe::ptr_size_cross(\%config, \%defaults); } else { build::auto::detect_native(\%config, \%defaults); build::probe::static_inline_native(\%config, \%defaults); build::probe::unaligned_access(\%config, \%defaults); build::probe::ptr_size_native(\%config, \%defaults); } if ($args{'jit'}) { if ($config{ptr_size} != 8) { print "JIT isn't supported on platforms with $config{ptr_size} byte pointers.\n"; } elsif ($Config{archname} =~ m/^x86_64|^amd64|^darwin(-thread)?(-multi)?-2level/) { $config{jit_obj} = '$(JIT_OBJECTS) $(JIT_ARCH_X64)'; $config{dasm_flags} = '-D POSIX=1'; $config{jit_arch} = 'MVM_JIT_ARCH_X64'; $config{jit_platform} = 'MVM_JIT_PLATFORM_POSIX'; } elsif ($Config{archname} =~ /^MSWin32-x64/) { $config{jit_obj} = '$(JIT_OBJECTS) $(JIT_ARCH_X64)'; $config{dasm_flags} = '-D WIN32=1'; $config{jit_arch} = 'MVM_JIT_ARCH_X64'; $config{jit_platform} = 'MVM_JIT_PLATFORM_WIN32'; } else { print "JIT isn't supported on $Config{archname} yet.\n"; } } # fallback unless (defined $config{jit_obj}) { $config{jit_obj} = '$(JIT_STUB)'; $config{jit_arch} = 'MVM_JIT_ARCH_NONE'; $config{jit_platform} = 'MVM_JIT_PLATFORM_NONE'; $config{dasm_flags} = ''; } if ($config{cc} eq 'cl') { $config{install} .= "\t\$(MKPATH) \$(DESTDIR)\$(PREFIX)/include/msinttypes\n" . "\t\$(CP) 3rdparty/msinttypes/*.h \$(DESTDIR)\$(PREFIX)/include/msinttypes\n"; } build::probe::C_type_bool(\%config, \%defaults); build::probe::computed_goto(\%config, \%defaults); build::probe::pthread_yield(\%config, \%defaults); build::probe::rdtscp(\%config, \%defaults); my $order = $config{be} ? 'big endian' : 'little endian'; # dump configuration print "\n", <{$_}; my @keys = ( "${_}lib", "${_}objects", "${_}rule", "${_}clean"); # don't build the library (libatomic_ops can be header-only) unless (defined $current) { @config{@keys} = ("__${_}__", '', '@:', '@:'); next; } my ($lib, $objects, $rule, $clean); $lib = sprintf "%s/$config{lib}", $current->{path}, $current->{name}; # C and C can be used to augment all build types $rule = $current->{rule}; $clean = $current->{clean}; # select type of build # dummy build - nothing to do if (exists $current->{dummy}) { $clean = sprintf '$(RM) %s', $lib unless defined $clean; } # use explicit object list elsif (exists $current->{objects}) { $objects = $current->{objects}; $rule = sprintf '$(AR) $(ARFLAGS) @arout@$@ @%sobjects@', $_ unless defined $rule; $clean = sprintf '$(RM) @%slib@ @%sobjects@', $_, $_ unless defined $clean; } # find *.c files and build objects for those elsif (exists $current->{src}) { my @sources = map { glob "$_/*.c" } @{ $current->{src} }; my $globs = join ' ', map { $_ . '/*@obj@' } @{ $current->{src} }; $objects = join ' ', map { s/\.c$/\@obj\@/; $_ } @sources; $rule = sprintf '$(AR) $(ARFLAGS) @arout@$@ %s', $globs unless defined $rule; $clean = sprintf '$(RM) %s %s', $lib, $globs unless defined $clean; } # use an explicit rule (which has already been set) elsif (exists $current->{rule}) {} # give up else { softfail("no idea how to build '$lib'"); print dots(' continuing anyway'); } @config{@keys} = ($lib, defined_or($objects, ''), defined_or($rule, '@:'), defined_or($clean, '@:')); push @thirdpartylibs, $config{"${_}lib"}; } $config{thirdpartylibs} = join ' ', @thirdpartylibs; my $thirdpartylibs = join "\n" . ' ' x 12, sort @thirdpartylibs; print "OK\n"; write_backend_config(); # dump 3rdparty libs we need to build print "\n", <) { s/^\s+|\s+$//; next if /^#|^$/; $target = $_, next unless defined $target; generate($target, $_); $target = undef; } close $listfile; # configuration completed if ($args{'enable-jit'}) { print("\nThe --enable-jit flag is obsolete, as jit is enabled by default.\n"); print("You can use --no-jit to build without jit."); } print "\n", $failed ? <{-compiler} }; set_defaults($toolchain, $compiler); } if (exists $args{compiler}) { $compiler = $args{compiler}; hardfail("unsupported compiler '$compiler'") unless exists $::COMPILERS{$compiler}; $compiler = $::COMPILERS{$compiler}; unless (exists $args{toolchain}) { $toolchain = $::TOOLCHAINS{ $compiler->{-toolchain} }; set_defaults($toolchain); } set_defaults($compiler); } my $order = $Config{byteorder}; if ($order eq '1234' || $order eq '12345678') { $defaults{be} = 0; } elsif ($order eq '4321' || $order eq '87654321') { $defaults{be} = 1; } else { ::hardfail("unsupported byte order $order"); } } # fill in defaults for cross builds sub setup_cross { my ($build, $host) = @_; print dots("Configuring cross build environment"); hardfail("both --build and --host need to be specified") unless defined $build && defined $host; my $cc = "$host-gcc"; my $ar = "$host-ar"; my $crossconf = "--build=$build --host=$host"; for (\$build, \$host) { if ($$_ =~ /-(\w+)-\w+$/) { $$_ = $1; if (!exists $::SYSTEMS{$1}) { softfail("unknown OS '$1'"); print dots(" assuming GNU userland"); $$_ = 'posix'; } } else { hardfail("failed to parse triple '$$_'") } } $defaults{os} = $host; $build = $::SYSTEMS{$build}; $host = $::SYSTEMS{$host}; my $shell = $::SHELLS{ $build->[0] }; my $toolchain = $::TOOLCHAINS{gnu}; my $compiler = $::COMPILERS{gcc}; my $overrides = $host->[3]; set_defaults($shell, $toolchain, $compiler, $overrides); $defaults{cc} = $cc; $defaults{ar} = $ar; $defaults{crossconf} = $crossconf; $defaults{be} = $args{'big-endian'}; } # sets C<%defaults> from C<@_> sub set_defaults { # getting the correct 3rdparty information is somewhat tricky my $thirdparty = defined_or $defaults{-thirdparty}, \%::THIRDPARTY; @defaults{ keys %$_ } = values %$_ for @_; $defaults{-thirdparty} = { %$thirdparty, map{ %{ defined_or $_->{-thirdparty}, {} } } @_ }; } # fill in config values sub configure { my ($template) = @_; while ($template =~ /@(\w+)@/) { my $key = $1; unless (exists $config{$key}) { return (undef, "unknown configuration key '$key'\n known keys: " . join(', ', sort keys %config)); } $template =~ s/@\Q$key\E@/$config{$key}/; } return $template; } # generate files sub generate { my ($dest, $src) = @_; print dots("Generating $dest"); open my $srcfile, '<', $src or hardfail($!); open my $destfile, '>', $dest or hardfail($!); while (<$srcfile>) { my ($line, $error) = configure($_); hardfail($error) unless defined $line; if ($config{sh} eq 'cmd' && $dest =~ /Makefile|config\.c/) { # In-between slashes in makefiles need to be backslashes on Windows. # Double backslashes in config.c, beause these are in qq-strings. my $bs = $dest =~ /Makefile/ ? '\\' : '\\\\'; $line =~ s/(\w|\.|\w\:|\$\(PREFIX\))\/(?=\w|\.|\*)/$1$bs/g; $line =~ s/(\w|\.|\w\:|\$\(PREFIX\))\\(?=\w|\.|\*)/$1$bs/g if $bs eq '\\\\'; # gmake doesn't like \* $line =~ s/(\w|\.|\w\:|\$\(PREFIX\))\\\*/$1\\\\\*/g if $config{make} eq 'gmake'; } print $destfile $line; } close $srcfile; close $destfile; print "OK\n"; } # some dots sub dots { my $message = shift; my $length = shift || 55; my $dot_count = $length - length $message; $dot_count = 0 if $dot_count < 0; return "$message " . '.' x $dot_count . ' '; } # fail but continue sub softfail { my ($msg) = @_; $failed = 1; print "FAIL\n"; warn " $msg\n"; } # fail and don't continue sub hardfail { softfail(@_); die "\nConfiguration PANIC. A Makefile could not be generated.\n"; } sub write_backend_config { $config{backendconfig} = ''; for my $k (sort keys %config) { next if $k eq 'backendconfig'; my $v = $config{$k}; if (ref($v) eq 'ARRAY') { my $i = 0; for (@$v) { $config{backendconfig} .= qq/ add_entry(tc, config, "$k\[$i]", "$_");\n/; $i++; } } elsif (ref($v) eq 'HASH') { # should not be there } else { $v = '' unless defined $v; $v =~ s/"/\\"/g; $v =~ s/\n/\\\n/g; $config{backendconfig} .= qq/ add_entry(tc, config, "$k", "$v");\n/; } } } sub wsl_bash_on_win { open my $fh, '<', '/proc/sys/kernel/osrelease' or return 0; return ((readline $fh) =~ /\A\d\.\d\.\d-\d+-Microsoft\s*\z/) ? 1 : 0; } __END__ =head1 SYNOPSIS ./Configure.pl -?|--help ./Configure.pl [--os ] [--shell ] [--toolchain ] [--compiler ] [--ar ] [--cc ] [--ld ] [--make ] [--debug] [--optimize] [--instrument] [--static] [--prefix] [--has-libtommath] [--has-sha] [--has-libuv] [--has-libatomic_ops] [--asan] [--ubsan] [--no-jit] [--telemeh] ./Configure.pl --build --host [--ar ] [--cc ] [--ld ] [--make ] [--debug] [--optimize] [--instrument] [--static] [--big-endian] [--prefix] [--make-install] =head2 Use of environment variables Compiler and linker flags can be extended with environment variables. CFLAGS="..." LDFLAGS="..." ./Configure.pl =head1 OPTIONS =over 4 =item -? =item --help Show this help information. =item --debug =item --no-debug Toggle debugging flags during compile and link. Debugging is off by default. =item --optimize =item --no-optimize Toggle optimization and debug flags during compile and link. If nothing is specified the default is to optimize. =item --instrument =item --no-instrument Toggle extra instrumentation flags during compile and link; for example, turns on Address Sanitizer when compiling with C. Defaults to off. =item --os Set the operating system name which you are compiling to. Currently supported operating systems are C, C, C, C, C, C, C, C, and C. If not explicitly set, the option will be provided by the Perl runtime. In case of unknown operating systems, a POSIX userland is assumed. =item --shell Currently supported shells are C and C. =item --toolchain Currently supported toolchains are C, C, C and C. =item --compiler Currently supported compilers are C, C and C. =item --ar Explicitly set the archiver without affecting other configuration options. =item --cc Explicitly set the compiler without affecting other configuration options. =item --asan Build with AddressSanitizer (ASAN) support. Requires clang and LLVM 3.1 or newer. See L You can use C to configure ASAN at runtime; for example, to disable memory leak checking (which can make Rakudo fail to build), you can set the following: export ASAN_OPTIONS=detect_leaks=0 A full list of options is displayed if you set C to C. =item --ubsan Build with Undefined Behaviour sanitizer support. =item --valgrind Include Valgrind Client Requests for moarvm's own memory allocators. =item --ld Explicitly set the linker without affecting other configuration options. =item --make Explicitly set the make tool without affecting other configuration options. =item --static Build MoarVM as a static library instead of a shared one. =item --build --host Set up cross-compilation. =item --big-endian Set byte order of host system in case of cross compilation. With native builds, the byte order is auto-detected. =item --prefix Install files in subdirectory /bin, /lib and /include of the supplied path. The default prefix is "install" if this option is not passed. =item --bindir Install executable files in the supplied path. The default is "@prefix@/bin" if this option is not passed. =item --libdir Install library in the supplied path. The default is "@prefix@/lib" for POSIX toolchain and "@bindir@" for MSVC if this option is not passed. =item --mastdir Install NQP libraries in the supplied path. The default is "@prefix@/share/nqp/lib/MAST" if this option is not passed. =item --make-install Build and install MoarVM in addition to configuring it. =item --has-libtommath =item --has-sha =item --has-libuv =item --has-libatomic_ops =item --has-dyncall =item --has-libffi =item --pkgconfig=/path/to/pkgconfig/executable Provide path to the pkgconfig executable. Default: /usr/bin/pkg-config =item --no-jit Disable JIT compiler, which is enabled by default to JIT-compile hot frames. =item --telemeh Build support for the fine-grained internal event logger. =back MoarVM-2018.03/LICENSE0000644000175000017510000000205113237701102014202 0ustar samanthasamanthaSoftware Copyright and License This software is copyright 2012-2015 by Jonathan Worthington and others. The Artistic License 2.0 (see Artistic2.txt) applies to this project, but some portions are redistributed under other licenses and are marked as such. Unofficial summary of the intended application of the Artistic License 2.0: - All the source code is available for anyone to read and to submit patches. - You may "take" and re-use large portions of the source code at will. - There is a "Standard Version" of this software to protect its name and namespace as it's used in redistributions by package maintainers. - "Downstream" package maintainers allow us to use their bug fixes/patches. - You may bundle it with software you sell, or you may link/embed it. - You may fork and release modified builds if you thoroughly rename it. -- 3rdparty/ license information - dynasm MIT - dyncall MIT - libtommath Public Domain - libuv MIT,BSD,ISC - msinttypes MIT - sha1 Public Domain - tinymt MIT - uthash.h MIT - freebsd MIT MoarVM-2018.03/README.markdown0000644000175000017510000000730713242626641015721 0ustar samanthasamantha# MoarVM MoarVM (short for Metamodel On A Runtime Virtual Machine) is a runtime built for the 6model object system. It is primarily aimed at running NQP and Rakudo Perl 6, but should be able to serve as a backend for any compilers built using the NQP compiler toolchain. ## Get It Either download it from [the MoarVM site](https://www.moarvm.org/) or clone it from GitHub: ``` git clone https://github.com/MoarVM/MoarVM.git ``` If you use the automatically generated release tarballs or zip files please note that they don't contain the third party libraries needed to successfully build MoarVM. ## Build It [![Build Status](https://travis-ci.org/MoarVM/MoarVM.svg?branch=master)](https://travis-ci.org/MoarVM/MoarVM) Building the VM itself takes just: perl Configure.pl make (Or `nmake`/`gmake` on Windows). Currently it is known to build on Windows with MSVC and gcc, and with `gcc` and `clang` on Linux & MacOS X. We're expanding this with time. Type `perl Configure.pl --help` to see the configure-time options, as well as some descriptions of the make-time options/targets. ## Building an NQP with MoarVM After installing MoarVM, you can clone the NQP repository or grab a source tarball and use the Configure.pl script in it like so: perl Configure.pl --backend=moar --prefix=where_your_moarvm_install_lives Alternatively, the same Configure.pl script in NQP is able to clone, build and install a copy of MoarVM on its own if you supply the `--gen-moar` flag. ## Building a Rakudo with MoarVM When pointing the `Configure.pl` script in rakudo's repository at a `--prefix` that has an `nqp-m` installed in it, it will automatically detect and configure the MoarVM backend. Alternatively, `--backend=moar,jvm` can be used to force it to build the MoarVM and JVM backends, for example. Just like in the NQP `Configure.pl` script, you have the option to supply a `--gen-moar` flag that will do all the work for you, including creating an `nqp-m`. ## Status MoarVM is currently in development. It can run all of the NQP test suite, all of the Rakudo sanity tests, and passes more spectests than any other Rakudo Perl 6 backend (though some backends pass tests that it does not). Unlike the JVM backend of NQP, the MoarVM repo is not currently planned to be integrated into the main NQP source repo http://github.com/perl6/nqp but instead can be pulled in by `Configure.pl --gen-moar` configure script in the NQP repo, same as it can `--gen-parrot`. ## Feature overview Some key features provided by MoarVM include: * Meta-object programming, using the 6model design * Precise, generational, and parallel GC * Unicode 10.0 support (Unicode Character Database, encodings, normalization) * First-class code objects, lexical variables and closures * Exceptions * Continuations * Bounded serialization * Code generation from MAST (MoarVM AST) * Runtime loading of code * Big integers * A range of IO and process support, including asynchronous sockets, signals, timers, and processes * Native calling and native pointer manipulation * Threads, mutexes, condition variables, semaphores, and blocking queues * Bytecode specialization by type, and numerous optimizations (including resolution of method calls and multiple dispatch, dead code elimination, inlining, and on stack replacement) * JIT compilation * Instrumentation-based profiling of call frames and allocations ## Contributing Contributions by pull request are accepted. Commit bits are given to those who contribute quality work. If you are interested in contributing, drop by the `#moarvm` channel on freenode.org, or email jnthn@jnthn.net if you're averse to IRC. See the LICENSE file in the root directory for information on the license of the source code in the MoarVM repository. MoarVM-2018.03/VERSION0000644000175000017510000000001013253601143014240 0ustar samanthasamantha2018.03 MoarVM-2018.03/build/Makefile.in0000644000175000017510000005535313252330426016362 0ustar samanthasamanthaCC = @cc@ LD = @ld@ AR = @ar@ MAKE = @make@ @mkflags@ PERL = @perl@ RM = @rm@ CAT = @cat@ SHELL = @sh@ CP = $(PERL) -MExtUtils::Command -e cp MKPATH = $(PERL) -MExtUtils::Command -e mkpath CHMOD = $(PERL) -MExtUtils::Command -e chmod RM_RF = $(PERL) -MExtUtils::Command -e rm_rf RM_F = $(PERL) -MExtUtils::Command -e rm_f MINGW_UNICODE = @mingw_unicode@ CONFIG = @config@ ADDCONFIG = TRACING = 0 CGOTO = @cancgoto@ RDTSCP = @canrdtscp@ NOISY = 0 MSG = @: CMD = NOOUT = NOERR = @mknoisy@ PREFIX = @prefix@ BINDIR = @bindir@ LIBDIR = @libdir@ MASTDIR = @mastdir@ PKGCONFIGDIR = @prefix@/share/pkgconfig CFLAGS = @cflags@ @ccdef@MVM_TRACING=$(TRACING) @ccdef@MVM_CGOTO=$(CGOTO) @ccdef@MVM_RDTSCP=$(RDTSCP) CINCLUDES = @cincludes@ \ @ccinc@@shaincludedir@ \ @ccinc@3rdparty/tinymt \ @ccinc@3rdparty/dynasm \ @ccinc@3rdparty/cmp \ @ccinc@3rdparty \ @ccinc@src LDFLAGS = @ldflags@ LDLIBS = @ldlibs@ MAIN_LIBS = @mainlibs@ DLL_LIBS = @thirdpartylibs@ $(LDLIBS) ARFLAGS = @arflags@ PLATFORM_WIN32 = src/platform/win32/mmap@obj@ \ src/platform/win32/time@obj@ \ src/platform/win32/io@obj@ PLATFORM_POSIX = src/platform/posix/mmap@obj@ \ src/platform/posix/time@obj@ \ src/platform/posix/io@obj@ DASM_FLAGS = @dasm_flags@ JIT_ARCH_X64 = src/jit/x64/emit@obj@ src/jit/x64/arch@obj@ JIT_STUB = src/jit/stub@obj@ JIT_OBJECTS = src/jit/graph@obj@ \ src/jit/label@obj@ \ src/jit/compile@obj@ \ src/jit/log@obj@ \ src/jit/expr@obj@ \ src/jit/tile@obj@ \ src/jit/linear_scan@obj@ # JIT intermediate files which clean should remove JIT_INTERMEDIATES = src/jit/x64/emit.c \ src/jit/x64/tile_pattern.h \ src/jit/core_templates.h MAIN_OBJECTS = src/main@obj@ OBJECTS = src/core/callsite@obj@ \ src/core/args@obj@ \ src/core/exceptions@obj@ \ src/core/interp@obj@ \ src/core/threadcontext@obj@ \ src/core/compunit@obj@ \ src/core/bytecode@obj@ \ src/core/frame@obj@ \ src/core/callstack@obj@ \ src/core/validation@obj@ \ src/core/bytecodedump@obj@ \ src/core/threads@obj@ \ src/core/ops@obj@ \ src/core/hll@obj@ \ src/core/loadbytecode@obj@ \ src/math/num@obj@ \ src/core/coerce@obj@ \ src/core/dll@obj@ \ src/core/ext@obj@ \ src/core/nativecall@obj@ \ src/core/nativecall_@nativecall_backend@@obj@ \ src/core/continuation@obj@ \ src/core/intcache@obj@ \ src/core/fixedsizealloc@obj@ \ src/core/regionalloc@obj@ \ src/debug/debugserver@obj@ \ src/gen/config@obj@ \ src/gc/orchestrate@obj@ \ src/gc/allocation@obj@ \ src/gc/worklist@obj@ \ src/gc/roots@obj@ \ src/gc/collect@obj@ \ src/gc/gen2@obj@ \ src/gc/wb@obj@ \ src/gc/objectid@obj@ \ src/gc/finalize@obj@ \ src/gc/debug@obj@ \ src/io/io@obj@ \ src/io/eventloop@obj@ \ src/io/syncfile@obj@ \ src/io/syncsocket@obj@ \ src/io/fileops@obj@ \ src/io/dirops@obj@ \ src/io/procops@obj@ \ src/io/timers@obj@ \ src/io/filewatchers@obj@ \ src/io/signals@obj@ \ src/io/asyncsocket@obj@ \ src/io/asyncsocketudp@obj@ \ src/6model/reprs@obj@ \ src/6model/reprconv@obj@ \ src/6model/containers@obj@ \ src/6model/parametric@obj@ \ src/6model/reprs/MVMString@obj@ \ src/6model/reprs/VMArray@obj@ \ src/6model/reprs/MVMHash@obj@ \ src/6model/reprs/MVMCFunction@obj@ \ src/6model/reprs/KnowHOWREPR@obj@ \ src/6model/reprs/KnowHOWAttributeREPR@obj@ \ src/6model/reprs/P6str@obj@ \ src/6model/reprs/P6opaque@obj@ \ src/6model/reprs/MVMCode@obj@ \ src/6model/reprs/MVMOSHandle@obj@ \ src/6model/reprs/MVMCompUnit@obj@ \ src/6model/reprs/MVMStaticFrame@obj@ \ src/6model/reprs/P6int@obj@ \ src/6model/reprs/P6num@obj@ \ src/6model/reprs/Uninstantiable@obj@ \ src/6model/reprs/HashAttrStore@obj@ \ src/6model/reprs/MVMThread@obj@ \ src/6model/reprs/MVMIter@obj@ \ src/6model/reprs/MVMContext@obj@ \ src/6model/reprs/SCRef@obj@ \ src/6model/reprs/MVMCallCapture@obj@ \ src/6model/reprs/P6bigint@obj@ \ src/6model/reprs/NFA@obj@ \ src/6model/reprs/MVMException@obj@ \ src/6model/reprs/MVMDLLSym@obj@ \ src/6model/reprs/MVMMultiCache@obj@ \ src/6model/reprs/MVMContinuation@obj@ \ src/6model/reprs/NativeCall@obj@ \ src/6model/reprs/CPointer@obj@ \ src/6model/reprs/CStr@obj@ \ src/6model/reprs/CArray@obj@ \ src/6model/reprs/CStruct@obj@ \ src/6model/reprs/CUnion@obj@ \ src/6model/reprs/ReentrantMutex@obj@ \ src/6model/reprs/ConditionVariable@obj@ \ src/6model/reprs/Semaphore@obj@ \ src/6model/reprs/ConcBlockingQueue@obj@ \ src/6model/reprs/MVMAsyncTask@obj@ \ src/6model/reprs/MVMNull@obj@ \ src/6model/reprs/CPPStruct@obj@ \ src/6model/reprs/NativeRef@obj@ \ src/6model/reprs/MultiDimArray@obj@ \ src/6model/reprs/Decoder@obj@ \ src/6model/reprs/MVMSpeshLog@obj@ \ src/6model/reprs/MVMStaticFrameSpesh@obj@ \ src/6model/6model@obj@ \ src/6model/bootstrap@obj@ \ src/6model/sc@obj@ \ src/6model/serialization@obj@ \ src/mast/compiler@obj@ \ src/mast/driver@obj@ \ src/spesh/dump@obj@ \ src/spesh/graph@obj@ \ src/spesh/codegen@obj@ \ src/spesh/candidate@obj@ \ src/spesh/manipulate@obj@ \ src/spesh/args@obj@ \ src/spesh/facts@obj@ \ src/spesh/optimize@obj@ \ src/spesh/dead_bb_elimination@obj@ \ src/spesh/deopt@obj@ \ src/spesh/log@obj@ \ src/spesh/threshold@obj@ \ src/spesh/inline@obj@ \ src/spesh/osr@obj@ \ src/spesh/lookup@obj@ \ src/spesh/iterator@obj@ \ src/spesh/worker@obj@ \ src/spesh/stats@obj@ \ src/spesh/plan@obj@ \ src/spesh/arg_guard@obj@ \ src/strings/decode_stream@obj@ \ src/strings/ascii@obj@ \ src/strings/parse_num@obj@ \ src/strings/utf8@obj@ \ src/strings/utf8_c8@obj@ \ src/strings/nfg@obj@ \ src/strings/ops@obj@ \ src/strings/unicode@obj@ \ src/strings/normalize@obj@ \ src/strings/latin1@obj@ \ src/strings/utf16@obj@ \ src/strings/windows1252@obj@ \ src/math/bigintops@obj@ \ src/profiler/instrument@obj@ \ src/profiler/log@obj@ \ src/profiler/profile@obj@ \ src/profiler/heapsnapshot@obj@ \ src/profiler/telemeh@obj@ \ src/instrument/crossthreadwrite@obj@ \ src/instrument/line_coverage@obj@ \ src/platform/sys@obj@ \ src/moar@obj@ \ @platform@ \ @jit_obj@ HEADERS = src/moar.h \ src/types.h \ src/bithacks.h \ src/6model/6model.h \ src/core/instance.h \ src/core/threadcontext.h \ src/core/callsite.h \ src/core/args.h \ src/core/exceptions.h \ src/core/interp.h \ src/core/alloc.h \ src/core/vector.h \ src/core/frame.h \ src/core/callstack.h \ src/core/compunit.h \ src/core/bytecode.h \ src/core/ops.h \ src/core/validation.h \ src/core/bytecodedump.h \ src/core/threads.h \ src/core/hll.h \ src/core/loadbytecode.h \ src/core/bitmap.h \ src/math/num.h \ src/core/coerce.h \ src/core/dll.h \ src/core/ext.h \ src/core/nativecall.h \ src/core/continuation.h \ src/core/intcache.h \ src/core/fixedsizealloc.h \ src/core/regionalloc.h \ src/debug/debugserver.h \ src/io/io.h \ src/io/eventloop.h \ src/io/syncfile.h \ src/io/syncsocket.h \ src/io/fileops.h \ src/io/dirops.h \ src/io/procops.h \ src/io/timers.h \ src/io/filewatchers.h \ src/io/signals.h \ src/io/asyncsocket.h \ src/io/asyncsocketudp.h \ src/gc/orchestrate.h \ src/gc/allocation.h \ src/gc/worklist.h \ src/gc/collect.h \ src/gc/roots.h \ src/gc/gen2.h \ src/gc/wb.h \ src/gc/objectid.h \ src/gc/finalize.h \ src/gc/debug.h \ src/6model/reprs.h \ src/6model/reprconv.h \ src/6model/bootstrap.h \ src/6model/serialization.h \ src/6model/containers.h \ src/6model/parametric.h \ src/6model/reprs/MVMString.h \ src/6model/reprs/VMArray.h \ src/6model/reprs/MVMHash.h \ src/6model/reprs/MVMCFunction.h \ src/6model/reprs/KnowHOWREPR.h \ src/6model/reprs/KnowHOWAttributeREPR.h \ src/6model/reprs/P6opaque.h \ src/6model/reprs/MVMCode.h \ src/6model/reprs/P6str.h \ src/6model/reprs/MVMOSHandle.h \ src/6model/reprs/P6int.h \ src/6model/reprs/P6num.h \ src/6model/reprs/Uninstantiable.h \ src/6model/reprs/HashAttrStore.h \ src/6model/reprs/MVMThread.h \ src/6model/reprs/MVMIter.h \ src/6model/reprs/MVMContext.h \ src/6model/reprs/SCRef.h \ src/6model/reprs/MVMCallCapture.h \ src/6model/reprs/P6bigint.h \ src/6model/reprs/NFA.h \ src/6model/reprs/MVMException.h \ src/6model/reprs/MVMCompUnit.h \ src/6model/reprs/MVMDLLSym.h \ src/6model/reprs/MVMMultiCache.h \ src/6model/reprs/MVMContinuation.h \ src/6model/reprs/NativeCall.h \ src/6model/reprs/CPointer.h \ src/6model/reprs/CStr.h \ src/6model/reprs/CArray.h \ src/6model/reprs/CStruct.h \ src/6model/reprs/CUnion.h \ src/6model/reprs/ReentrantMutex.h \ src/6model/reprs/ConditionVariable.h \ src/6model/reprs/Semaphore.h \ src/6model/reprs/ConcBlockingQueue.h \ src/6model/reprs/MVMAsyncTask.h \ src/6model/reprs/MVMNull.h \ src/6model/reprs/CPPStruct.h \ src/6model/reprs/NativeRef.h \ src/6model/reprs/MultiDimArray.h \ src/6model/reprs/Decoder.h \ src/6model/reprs/MVMSpeshLog.h \ src/6model/reprs/MVMStaticFrameSpesh.h \ src/6model/sc.h \ src/mast/compiler.h \ src/mast/driver.h \ src/mast/nodes.h \ src/spesh/dump.h \ src/spesh/graph.h \ src/spesh/codegen.h \ src/spesh/candidate.h \ src/spesh/manipulate.h \ src/spesh/args.h \ src/spesh/facts.h \ src/spesh/optimize.h \ src/spesh/dead_bb_elimination.h \ src/spesh/deopt.h \ src/spesh/log.h \ src/spesh/threshold.h \ src/spesh/inline.h \ src/spesh/osr.h \ src/spesh/lookup.h \ src/spesh/iterator.h \ src/spesh/worker.h \ src/spesh/stats.h \ src/spesh/plan.h \ src/spesh/arg_guard.h \ src/strings/unicode_gen.h \ src/strings/normalize.h \ src/strings/decode_stream.h \ src/strings/ascii.h \ src/strings/parse_num.h \ src/strings/utf8.h \ src/strings/utf8_c8.h \ src/strings/iter.h \ src/strings/nfg.h \ src/strings/ops.h \ src/strings/unicode.h \ src/strings/latin1.h \ src/strings/utf16.h \ src/strings/windows1252.h \ src/math/bigintops.h \ src/profiler/instrument.h \ src/profiler/log.h \ src/profiler/profile.h \ src/profiler/heapsnapshot.h \ src/profiler/telemeh.h \ src/platform/mmap.h \ src/platform/time.h \ src/platform/threads.h \ src/platform/io.h \ src/platform/sys.h \ src/platform/setjmp.h \ src/platform/memmem.h \ src/jit/graph.h \ src/jit/label.h \ src/jit/expr.h \ src/jit/expr_ops.h \ src/jit/compile.h \ src/jit/tile.h \ src/jit/register.h \ src/jit/log.h \ src/instrument/crossthreadwrite.h \ src/instrument/line_coverage.h \ src/gen/config.h \ src/debug/debugserver.h \ 3rdparty/uthash.h \ 3rdparty/cmp/cmp.h UV_UNIX = 3rdparty/libuv/src/fs-poll@obj@ \ 3rdparty/libuv/src/inet@obj@ \ 3rdparty/libuv/src/uv-common@obj@ \ 3rdparty/libuv/src/version@obj@ \ 3rdparty/libuv/src/unix/async@obj@ \ 3rdparty/libuv/src/unix/core@obj@ \ 3rdparty/libuv/src/unix/dl@obj@ \ 3rdparty/libuv/src/unix/fs@obj@ \ 3rdparty/libuv/src/unix/getaddrinfo@obj@ \ 3rdparty/libuv/src/unix/loop-watcher@obj@ \ 3rdparty/libuv/src/unix/loop@obj@ \ 3rdparty/libuv/src/unix/pipe@obj@ \ 3rdparty/libuv/src/unix/poll@obj@ \ 3rdparty/libuv/src/unix/process@obj@ \ 3rdparty/libuv/src/unix/signal@obj@ \ 3rdparty/libuv/src/unix/stream@obj@ \ 3rdparty/libuv/src/unix/tcp@obj@ \ 3rdparty/libuv/src/unix/thread@obj@ \ 3rdparty/libuv/src/threadpool@obj@ \ 3rdparty/libuv/src/unix/timer@obj@ \ 3rdparty/libuv/src/unix/tty@obj@ \ 3rdparty/libuv/src/unix/udp@obj@ UV_LINUX = 3rdparty/libuv/src/unix/linux-core@obj@ \ 3rdparty/libuv/src/unix/linux-inotify@obj@ \ 3rdparty/libuv/src/unix/linux-syscalls@obj@ \ 3rdparty/libuv/src/unix/proctitle@obj@ \ $(UV_UNIX) UV_OPENBSD = 3rdparty/libuv/src/unix/openbsd@obj@ \ 3rdparty/libuv/src/unix/kqueue@obj@ \ 3rdparty/libuv/src/unix/posix-hrtime@obj@ \ $(UV_UNIX) UV_NETBSD = 3rdparty/libuv/src/unix/netbsd@obj@ \ 3rdparty/libuv/src/unix/kqueue@obj@ \ 3rdparty/libuv/src/unix/posix-hrtime@obj@ \ $(UV_UNIX) UV_FREEBSD = 3rdparty/libuv/src/unix/freebsd@obj@ \ 3rdparty/libuv/src/unix/kqueue@obj@ \ 3rdparty/libuv/src/unix/posix-hrtime@obj@ \ $(UV_UNIX) UV_DARWIN = 3rdparty/libuv/src/unix/darwin@obj@ \ 3rdparty/libuv/src/unix/darwin-proctitle@obj@ \ 3rdparty/libuv/src/unix/fsevents@obj@ \ 3rdparty/libuv/src/unix/kqueue@obj@ \ 3rdparty/libuv/src/unix/proctitle@obj@ \ $(UV_UNIX) UV_SOLARIS = 3rdparty/libuv/src/unix/sunos@obj@ \ $(UV_UNIX) UV_AIX = 3rdparty/libuv/src/unix/aix@obj@ \ $(UV_UNIX) UV_OBJECTS = @uvobjects@ TOM_OBJECTS = @tomobjects@ THIRDPARTY = @thirdpartylibs@ MINILUA = 3rdparty/dynasm/minilua@exe@ DYNASM = $(MINILUA) 3rdparty/dynasm/dynasm.lua DYNASM_SCRIPTS = 3rdparty/dynasm/dynasm.lua 3rdparty/dynasm/dasm_x86.lua DYNASM_HEADERS = 3rdparty/dynasm/dasm_proto.h 3rdparty/dynasm/dasm_x86.h .SUFFIXES: .c @obj@ .i @asm@ .dasc .expr .tile all: moar@exe@ pkgconfig/moar.pc install: all $(MKPATH) "$(DESTDIR)$(BINDIR)" $(CP) moar@exe@ "$(DESTDIR)$(BINDIR)" $(CHMOD) 755 "$(DESTDIR)$(BINDIR)/moar@exe@" $(MKPATH) "$(DESTDIR)$(LIBDIR)" $(RM_F) "$(DESTDIR)$(LIBDIR)/@moar@" $(CP) @moar@ @impinst@ "$(DESTDIR)$(LIBDIR)" $(MKPATH) "$(DESTDIR)$(MASTDIR)" $(CP) lib/MAST/Nodes.nqp "$(DESTDIR)$(MASTDIR)" $(CP) lib/MAST/Ops.nqp "$(DESTDIR)$(MASTDIR)" $(MKPATH) "$(DESTDIR)$(PKGCONFIGDIR)" $(CP) pkgconfig/moar.pc "$(DESTDIR)$(PKGCONFIGDIR)" $(MKPATH) "$(DESTDIR)$(PREFIX)/include/moar" $(CP) src/gen/config.h "$(DESTDIR)$(PREFIX)/include/moar" $(MKPATH) "$(DESTDIR)$(PREFIX)/include/moar/6model/reprs" $(MKPATH) "$(DESTDIR)$(PREFIX)/include/moar/core" $(MKPATH) "$(DESTDIR)$(PREFIX)/include/moar/gc" $(MKPATH) "$(DESTDIR)$(PREFIX)/include/moar/gen" $(MKPATH) "$(DESTDIR)$(PREFIX)/include/moar/io" $(MKPATH) "$(DESTDIR)$(PREFIX)/include/moar/mast" $(MKPATH) "$(DESTDIR)$(PREFIX)/include/moar/math" $(MKPATH) "$(DESTDIR)$(PREFIX)/include/moar/platform" $(MKPATH) "$(DESTDIR)$(PREFIX)/include/moar/profiler" $(MKPATH) "$(DESTDIR)$(PREFIX)/include/moar/spesh" $(MKPATH) "$(DESTDIR)$(PREFIX)/include/moar/debug" $(MKPATH) "$(DESTDIR)$(PREFIX)/include/moar/strings" $(MKPATH) "$(DESTDIR)$(PREFIX)/include/moar/jit" $(MKPATH) "$(DESTDIR)$(PREFIX)/include/moar/instrument" $(CP) 3rdparty/*.h "$(DESTDIR)$(PREFIX)/include/moar" $(CP) src/*.h "$(DESTDIR)$(PREFIX)/include/moar" $(CP) src/6model/*.h "$(DESTDIR)$(PREFIX)/include/moar/6model" $(CP) src/6model/reprs/*.h "$(DESTDIR)$(PREFIX)/include/moar/6model/reprs" $(CP) src/core/*.h "$(DESTDIR)$(PREFIX)/include/moar/core" $(CP) src/gc/*.h "$(DESTDIR)$(PREFIX)/include/moar/gc" $(CP) src/gen/*.h "$(DESTDIR)$(PREFIX)/include/moar/gen" $(CP) src/io/*.h "$(DESTDIR)$(PREFIX)/include/moar/io" $(CP) src/mast/*.h "$(DESTDIR)$(PREFIX)/include/moar/mast" $(CP) src/math/*.h "$(DESTDIR)$(PREFIX)/include/moar/math" $(CP) src/platform/*.h "$(DESTDIR)$(PREFIX)/include/moar/platform" $(CP) src/profiler/*.h "$(DESTDIR)$(PREFIX)/include/moar/profiler" $(CP) src/spesh/*.h "$(DESTDIR)$(PREFIX)/include/moar/spesh" $(CP) src/debug/*.h "$(DESTDIR)$(PREFIX)/include/moar/debug" $(CP) src/strings/*.h "$(DESTDIR)$(PREFIX)/include/moar/strings" $(CP) src/jit/*.h "$(DESTDIR)$(PREFIX)/include/moar/jit" $(CP) src/instrument/*.h "$(DESTDIR)$(PREFIX)/include/moar/instrument" @install@ lib: @moar@ help: @$(CAT) build/help.txt test: @$(CAT) build/test.txt reconfig: realclean $(MSG) reconfiguring with [ $(CONFIG) $(ADDCONFIG) ] $(CMD)$(PERL) Configure.pl $(CONFIG) $(ADDCONFIG) clangcheck gcccheck: @$(MAKE) --no-print-directory -f tools/check.mk $@ moar@exe@: $(MAIN_OBJECTS) @moar@ $(MSG) linking $@ $(CMD)$(LD) @ldout@$@ $(LDFLAGS) $(MINGW_UNICODE) $(MAIN_OBJECTS) $(MAIN_LIBS) @moarlib@: $(OBJECTS) $(THIRDPARTY) $(MSG) linking $@ $(CMD)$(AR) $(ARFLAGS) @arout@$@ $(OBJECTS) $(NOOUT) @moardll@: $(OBJECTS) $(THIRDPARTY) $(MSG) linking $@ $(CMD)$(LD) @ldout@$@ $(LDFLAGS) @ldshared@ @moarshared@ $(OBJECTS) $(DLL_LIBS) libuv: @uvlib@ $(MAIN_OBJECTS) $(OBJECTS): $(HEADERS) tracing: $(MSG) enable tracing dispatch -$(CMD)$(RM) src/main@obj@ src/core/interp@obj@ $(CMD)$(MAKE) TRACING=1 CGOTO=0 NOISY="$(NOISY)" cgoto: $(MSG) enable computed-goto dispatch -$(CMD)$(RM) src/main@obj@ src/core/interp@obj@ $(CMD)$(MAKE) TRACING=0 CGOTO=1 NOISY="$(NOISY)" switch no-tracing no-cgoto: $(MSG) enable regular dispatch -$(CMD)$(RM) src/main@obj@ src/core/interp@obj@ $(CMD)$(MAKE) TRACING=0 CGOTO=0 NOISY="$(NOISY)" # objflags can include -DMVM_BUILD_SHARED which affects pre-processed source .c.i: $(MSG) pre-processing $@ $(CMD)$(CC) @cppswitch@ $(CFLAGS) @objflags@ $(CINCLUDES) @cppout@$@ $*.c .c@asm@: $(MSG) generating assembler for $@ $(CMD)$(CC) @asmswitch@ $(CFLAGS) @objflags@ $(CINCLUDES) @asmout@$@ $*.c .c@obj@: $(MSG) compiling $@ $(CMD)$(CC) @ccswitch@ $(CFLAGS) @objflags@ $(CINCLUDES) @ccout@$@ $*.c src/main@obj@: src/main.c $(MSG) compiling $@ $(CMD)$(CC) @ccswitch@ $(CFLAGS) @mainflags@ $(CINCLUDES) @ccout@$@ $*.c src/strings/unicode.c: src/strings/unicode_db.c src/strings/unicode_uca.c src/strings/unicode_ops.c $(MSG) generating $@ $(CMD) $(CAT) src/strings/unicode_db.c src/strings/unicode_uca.c src/strings/unicode_ops.c > $@ $(NOERR) $(MINILUA): 3rdparty/dynasm/minilua.c $(CC) $(CFLAGS) $(LDFLAGS) 3rdparty/dynasm/minilua.c -o $@ $(LDLIBS) .dasc.c: $(MSG) preprocessing $< $(CMD)$(DYNASM) $(DASM_FLAGS) -o $@ $< .expr.h: $(MSG) Precompiling templates from $< $(CMD)$(PERL) -Itools/ tools/expr-template-compiler.pl -o $@ $< .tile.h: $(MSG) Building tile tables from $< $(CMD)$(PERL) -Itools/ tools/tiler-table-generator.pl -o $@ $< src/jit/x64/emit@obj@: src/jit/x64/emit.c $(DYNASM_HEADERS) src/jit/x64/emit.c: src/jit/x64/emit.dasc src/jit/x64/tiles.dasc $(MINILUA) $(DYNASM_SCRIPTS) # Expression list tables src/jit/core_templates.h: src/jit/core_templates.expr src/jit/macro.expr tools/expr-template-compiler.pl src/core/oplist src/jit/expr_ops.h # Architecture-specific tiles src/jit/x64/tile_pattern.h: src/jit/x64/tile_pattern.tile tools/tiler-table-generator.pl src/jit/expr_ops.h src/jit/expr@obj@: src/jit/core_templates.h src/jit/tile@obj@: src/jit/x64/tile_pattern.h src/jit/x64/tile_decl.h src/jit/compile@obj@ src/jit/linear_scan@obj@ src/jit/x64/arch@obj@ @jit_obj@: src/jit/internal.h src/jit/x64/arch.h @uvlib@: $(UV_OBJECTS) $(MSG) linking $@ $(CMD)@uvrule@ $(NOOUT) @laolib@: $(MSG) linking $@ $(CMD)@laorule@ $(NOOUT) @tomlib@: $(TOM_OBJECTS) $(MSG) linking $@ $(CMD)@tomrule@ $(NOOUT) @shalib@: @shaobjects@ $(MSG) linking $@ $(CMD)@sharule@ $(NOOUT) @mtlib@: @mtobjects@ $(MSG) linking $@ $(CMD)@mtrule@ $(NOOUT) @cmplib@: @cmpobjects@ $(MSG) linking $@ $(CMD)@cmprule@ $(NOOUT) @dclib@: $(MSG) building dyncall... $(CMD)@dcrule@ $(NOOUT) $(MSG) done. @dcblib@ @dllib@: @dclib@ pkgconfig/moar.pc: build/mk-moar-pc.pl $(PERL) build/mk-moar-pc.pl $@ clean: $(MSG) remove build files -$(CMD)$(RM) $(MAIN_OBJECTS) $(OBJECTS) $(JIT_INTERMEDIATES) $(NOOUT) $(NOERR) realclean: clean $(MSG) remove auxiliary files -$(CMD)@auxclean@ $(NOOUT) $(NOERR) $(MSG) remove 3rdparty files -$(CMD)@uvclean@ $(NOOUT) $(NOERR) -$(CMD)@laoclean@ $(NOOUT) $(NOERR) -$(CMD)@tomclean@ $(NOOUT) $(NOERR) -$(CMD)@shaclean@ $(NOOUT) $(NOERR) -$(CMD)@mtclean@ $(NOOUT) $(NOERR) -$(CMD)@dcclean@ $(NOOUT) $(NOERR) distclean: realclean $(MSG) remove executable and libraries -$(CMD)$(RM) moar@exe@ @moarlib@ @moardll@ $(NOOUT) $(NOERR) $(MSG) remove configuration and generated files -$(CMD)$(RM) Makefile src/gen/config.h src/gen/config.c src/strings/unicode.c \ tools/check.mk 3rdparty/libatomic_ops/config.log 3rdparty/libatomic_ops/config.status $(NOOUT) $(NOERR) -$(CMD)$(RM_RF) build/mk-moar-pc.pl pkgconfig/ $(NOOUT) $(NOERR) release: [ -n "$(VERSION)" ] || ( echo "\nTry 'make release VERSION=yyyy.mm'\n\n"; exit 1 ) bash -c 'if [[ $$(git status --untracked=no --porcelain) ]]; then echo "Dirty work trees will make broken releases; maybe git stash?"; exit 1; fi' ./tools/release.sh $(VERSION) sandwich: @echo What? Make it yourself. MoarVM-2018.03/build/README.md0000644000175000017510000000024313111771622015561 0ustar samanthasamantha## Configure- and Build-time Tools and Templates These tools and templates abstract away platform and target differences when it comes to building the software. MoarVM-2018.03/build/auto.pm0000755000175000017510000000266313111771622015623 0ustar samanthasamanthapackage build::auto; use strict; use warnings; sub detect_native { my ($config, $defaults) = @_; # detect x64 on Windows so we can build the correct dyncall version if ($config->{cc} eq 'cl') { print ::dots(' auto-detecting x64 toolchain'); my $msg = `cl 2>&1`; if (defined $msg) { if ($msg =~ /x64/) { print "YES\n"; $defaults->{-thirdparty}->{dc}->{rule} = 'cd 3rdparty/dyncall && configure.bat /target-x64 && $(MAKE) -f Nmakefile'; } else { print "NO\n" } } else { ::softfail("could not run 'cl'"); print ::dots(' assuming x86'), "OK\n"; } } elsif ($defaults->{os} eq 'mingw32' && $defaults->{-toolchain} eq 'gnu') { print ::dots(' auto-detecting x64 toolchain'); my $cc = $config->{cc}; my $msg = `$cc -dumpmachine 2>&1`; if (defined $msg) { if ($msg =~ /x86_64/) { print "YES\n"; $defaults->{-thirdparty}->{dc}->{rule} = 'cd 3rdparty/dyncall && ./configure.bat /target-x64 /tool-gcc && $(MAKE) COMPILE.C=$$(COMPILE.c) -f Makefile.embedded mingw32'; } else { print "NO\n" } } else { ::softfail("could not run 'cl'"); print ::dots(' assuming x86'), "OK\n"; } } } sub detect_cross {} 42; MoarVM-2018.03/build/check.mk.in0000644000175000017510000000303013111771622016312 0ustar samanthasamanthaCINCLUDES := -Isrc \ -isystem 3rdparty/libuv/include \ -isystem 3rdparty/libatomic_ops/src \ -isystem 3rdparty/libtommath \ -isystem 3rdparty/sha1 \ -isystem 3rdparty/dynasm \ -isystem 3rdparty/dyncall/dynload \ -isystem 3rdparty/dyncall/dyncall \ -isystem 3rdparty/dyncall/dyncallback \ -isystem 3rdparty CFLAGS := @ccdefflags@ -DMVM_TRACING=1 SRCDIRS := src \ src/6model \ src/6model/reprs \ src/core \ src/gc \ src/gen \ src/io \ src/mast \ src/math \ src/platform \ src/platform/posix \ src/platform/win32 \ src/strings SOURCES := $(wildcard $(SRCDIRS:%=%/*.c)) CLANGDIRS := $(SRCDIRS:src%=.clangcheck%/) GCCDIRS := $(SRCDIRS:src%=.gcccheck%/) NOCLANG := c11-extensions padded NOGCC := clangcheck: $(SOURCES:src/%=.clangcheck/%) gcccheck: $(SOURCES:src/%=.gcccheck/%) .clangcheck: $(CLANGDIRS) .gcccheck: $(GCCDIRS) $(CLANGDIRS) $(GCCDIRS): -@cd $(dir $(patsubst %/,%,$@)) && mkdir $(notdir $(patsubst %/,%,$@)) > @nul@ 2>&1 $(SOURCES:src/%=.clangcheck/%): .clangcheck/%: src/% .clangcheck clang -fsyntax-only -Werror -Weverything $(NOCLANG:%=-Wno-%) $(CFLAGS) $(CINCLUDES) $< @@cat@ @nul@ > $@ $(SOURCES:src/%=.gcccheck/%): .gcccheck/%: src/% .gcccheck gcc -fsyntax-only -std=c99 -Werror -Wall -Wextra $(NOGCC:%=-Wno-%) $(CFLAGS) $(CINCLUDES) $< @@cat@ @nul@ > $@ include check.todo MoarVM-2018.03/build/config.c.in0000644000175000017510000000211213111771622016315 0ustar samanthasamantha/* !!! * If you're looking at config.c and thinking of editing - this is a * generated file. See build/config.c.in, unless you're just twiddling * to get things to work on your platform before updating Configure, * in which case go right ahead. :-) * !!! */ #include "moar.h" #define add_entry(tc, hash, name, value) do { \ MVMString * const key = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, (name)); \ MVMROOT(tc, key, { \ MVMString * const value_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, (value)); \ MVMObject * const boxed_value = MVM_repr_box_str(tc, MVM_hll_current(tc)->str_box_type, value_str); \ MVM_repr_bind_key_o(tc, hash, key, boxed_value); \ }); \ } while (0) MVMObject *MVM_backend_config(MVMThreadContext *tc) { MVMObject *config = tc->instance->cached_backend_config; if (config) return config; config = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTHash); MVMROOT(tc, config, { @backendconfig@ }); tc->instance->cached_backend_config = config; return config; } MoarVM-2018.03/build/config.h.in0000644000175000017510000000304613202645655016340 0ustar samanthasamantha/* !!! * If you're looking at config.h and thinking of editing - this is a * generated file. See build/config.h.in, unless you're just twiddling * to get things to work on your platform before updating Configure, * in which case go right ahead. :-) * !!! */ /* Version information. */ #define MVM_VERSION "@version@" #define MVM_VERSION_MAJOR @versionmajor@ #define MVM_VERSION_MINOR @versionminor@ #define MVM_VERSION_PATCH @versionpatch@ /* Various compiler-specific pragmii. */ #define MVM_NO_RETURN @noreturnspecifier@ #define MVM_NO_RETURN_GCC @noreturnattribute@ #define MVM_FORMAT(X, Y, Z) @formatattribute@ /* DLL interface definitions. */ #define MVM_DLL_IMPORT @dllimport@ #define MVM_DLL_EXPORT @dllexport@ #define MVM_DLL_LOCAL @dlllocal@ /* Set in case of big-endian sytems. * The default byte order is little-endian. */ #if @be@ #define MVM_BIGENDIAN @be@ #endif /* pthread_yield() detection */ #if @has_pthread_yield@ #define MVM_HAS_PTHREAD_YIELD @has_pthread_yield@ #endif /* How this compiler does static inline functions. */ #define MVM_STATIC_INLINE @static_inline@ #if @can_unaligned_int32@ #define MVM_CAN_UNALIGNED_INT32 #endif #if @can_unaligned_int64@ #define MVM_CAN_UNALIGNED_INT64 #endif #if @can_unaligned_num64@ #define MVM_CAN_UNALIGNED_NUM64 #endif #define MVM_PTR_SIZE @ptr_size@ #if @havebooltype@ #define MVM_BOOL @booltype@ #endif /* Should we translate \n to \r\n on output? */ #define MVM_TRANSLATE_NEWLINE_OUTPUT @translate_newline_output@ #define MVM_JIT_ARCH @jit_arch@ #define MVM_JIT_PLATFORM @jit_platform@ MoarVM-2018.03/build/gen.list0000644000175000017510000000025613111771622015754 0ustar samanthasamanthasrc/gen/config.c build/config.c.in src/gen/config.h build/config.h.in Makefile build/Makefile.in tools/check.mk build/check.mk.in build/mk-moar-pc.pl build/mk-moar-pc.in MoarVM-2018.03/build/help.txt0000644000175000017510000000231413111771622015774 0ustar samanthasamanthaMakefile targets: help display this message all build library and MoarVM executable [default] lib build library only test dummy target ( use the nqp-cc test suite instead ) switch rebuild executable with switch dispatch [default] tracing rebuild executable with tracing dispatch cgoto rebuild executable with computed goto dispatch no-tracing alias for switch no-cgoto alias for switch clean remove build files realclean additionally remove auxiliary and 3rdparty files ( needs to be called when switching between shared and static library builds ) distclean additionally remove executable, library and configuration files ( should remove all generated files ) reconfig calls Configure.pl after doing a realclean ( use CONFIG and ADDCONFIG to control options ) Makefile options: NOISY=1 show actual commands instead of descriptions CONFIG=? passed to Configure.pl by reconfig ADDCONFIG=? passed to Configure.pl by reconfig in addition to the previously passed arguments MoarVM-2018.03/build/mk-moar-pc.in0000644000175000017510000000332713111771622016603 0ustar samanthasamantha#! @perl@ ## --------------------------------------------------------------------- ## mk-moar-pc.in -- Describe MoarVM configuration ## ## Copyright © 2014 Daniel Dehennin ## ## use strict; use warnings; use File::Basename; use File::Path qw{mkpath}; my @args = @ARGV; die "Missing target filename argument" if @args < 1; my $prefix = '@prefix@'; my $bindir = '@bindir@'; my $libdir = '@libdir@'; my $mastdir = '@mastdir@'; my $includedir = "${prefix}/include"; my $package = '@name@'; my $version = '@version@'; my $exeext = '@exe@'; my $moar = "${bindir}/${package}${exeext}"; my $ldopts = '@ldflags@'; my $ldflags = "-L${libdir} -l${package}"; my $libs = "${ldflags}"; my $cflags = "-I${includedir}"; my $static_libs = ''; if ('@config@' =~ m/--static/) { my $static_libs = "${libdir}/lib${package}.a"; } else { my $static_libs = ''; } if ($libdir =~ m{^/(?:usr/)?lib(?:64)?}) { $ldopts = ''; $ldflags = "-l$package"; } else { $ldflags = "${ldopts} ${ldflags}"; } $libs = "${ldflags}"; $cflags = '' if ${includedir} eq "/usr/include"; my $dirname = dirname $args[0]; if ( ! -d $dirname ) { mkpath($dirname); } open my $pcfile, '>', "$args[0]" or die "Can not open > $args[0]: $!"; print $pcfile <new(); chdir $probe_dir or die "Can't chir $probe_dir: $!"; return $restore; } sub compile { my ($config, $leaf, $defines, $files) = @_; my $restore = _to_probe_dir(); my $cl_define = join ' ', map {$config->{ccdef} . $_} @$defines; my @objs; foreach my $file ("$leaf.c", @$files) { (my $obj = $file) =~ s/\.c/$config->{obj}/; my $command = "$config->{cc} $ENV{CFLAGS} $cl_define $config->{ccout}$obj $config->{ccswitch} $file >$devnull 2>&1"; system $command and return; push @objs, $obj; } my $command = "$config->{ld} $ENV{LDFLAGS} $config->{ldout}$leaf @objs $config->{ldlibs} >$devnull 2>&1"; system $command and return; return 1; } sub _spew { my ($filename, $content) = @_; open my $fh, '>', $filename or die "Can't open $filename: $!"; print $fh $content or die "Can't write to $filename: $!"; close $fh or die "Can't close $filename: $!"; } sub compiler_usability { my ($config) = @_; my $restore = _to_probe_dir(); my $leaf = 'try'; my $file = "$leaf.c"; _spew('try.c', <<'EOT'); #include int main(int argc, char **argv) { return EXIT_SUCCESS; } EOT print ::dots(' trying to compile a simple C program'); my ($can_compile, $can_link, $command_errored, $error_message); (my $obj = $file) =~ s/\.c/$config->{obj}/; $ENV{CFLAGS} //= ''; my $command = "$config->{cc} $ENV{CFLAGS} $config->{ccout}$obj $config->{ccswitch} $file 2>&1"; my $output = `$command` || $!; if ($? >> 8 == 0) { $can_compile = 1; } else { $command_errored = $command; $error_message = $output; } if ($can_compile) { $ENV{LDFLAGS} //= ''; $command = "$config->{ld} $ENV{LDFLAGS} $config->{ldout}$leaf $obj 2>&1"; $output = `$command` || $!; if ($? >> 8 == 0) { $can_link = 1; } else { $command_errored = $command; $error_message = $output; } } if (!$can_compile || !$can_link) { die "ERROR\n\n" . " Can't " . ($can_compile ? 'link' : 'compile') . " simple C program.\n" . " Failing command: $command_errored\n" . " Error: $error_message\n\n" . "Cannot continue after this error.\n" . "On linux, maybe you need something like 'sudo apt-get install build-essential'.\n" . "On macOS, maybe you need to install XCode and accept the XCode EULA.\n"; } print "YES\n"; } sub static_inline_native { my ($config) = @_; my $restore = _to_probe_dir(); _spew('try.c', <<'EOT'); #include int main(int argc, char **argv) { #ifdef __GNUC__ return EXIT_SUCCESS; #else return EXIT_FAILURE; #endif } EOT print ::dots(' probing whether your compiler thinks that it is gcc'); compile($config, 'try') or die "Can't compile simple gcc probe, so something is badly wrong"; my $gcc = !system './try'; print $gcc ? "YES\n": "NO\n"; print ::dots(' probing how your compiler does static inline'); _spew('inline.c', <<'EOCP'); #include extern int f_via_a(int x); extern int f_via_b(int x); int main(int argc, char **argv) { int y; y = f_via_a(0); #ifdef USE_B y = f_via_b(0); #endif if (y == 42) { return EXIT_SUCCESS; } else { return EXIT_FAILURE; } } EOCP _spew('a.c', <<'EOCP'); static INLINE int f(int x) { int y; y = x + 42; return y; } int f_via_a(int x) { return f(x); } EOCP _spew('b.c', <<'EOCP'); extern int f(int x); int f_via_b(int x) { return f(x); } EOCP # For gcc, prefer __inline__, which permits the cflags to add -ansi my @try = $gcc ? qw(__inline__ inline __inline _inline) : qw(inline __inline__ __inline _inline); my $s_i; while (my $try = shift @try) { next unless compile($config, 'inline', ["INLINE=$try"], ['a.c']); next if system "./inline"; # Now make sure there is no external linkage of static functions if(!compile($config, 'inline', ["INLINE=$try", "USE_B"], ['a.c', 'b.c']) || system "./inline") { $s_i = "static $try"; last; } } if ($s_i) { print "$s_i\n"; } else { print "none, so falling back to static\n"; $s_i = 'static'; } $config->{static_inline} = $s_i; } sub static_inline_cross { my ($config) = @_; # FIXME. Needs testing, but might be robust enough to do what the native # code does, but just skip the system() to run the executable. Although this # might get confused by link time optimisations that only fail at run time, # which the system test does detect. $config->{static_inline} = 'static'; } sub specific_werror { my ($config) = @_; my $restore = _to_probe_dir(); if ($config->{cc} ne 'gcc') { $config->{can_err_decl_after_stmt} = 1; return; } my $file = 'try.c'; _spew($file, <<'EOT'); #include int main(int argc, char **argv) { return EXIT_SUCCESS; } EOT print ::dots(' probing support of -Werror=*'); (my $obj = $file) =~ s/\.c/$config->{obj}/; my $command = "gcc -Werror=declaration-after-statement $config->{ccout}$obj try.c >$devnull 2>&1"; my $can_specific_werror = !( system $command ); print $can_specific_werror ? "YES\n": "NO\n"; $config->{can_specific_werror} = $can_specific_werror || 0 } sub _gen_unaligned_access { my ($config, $can) = @_; my @align = qw(int32 int64 num64); my $no_msg = "your CPU can't"; if ($config->{cflags} =~ /\B-fsanitize=undefined\b/) { $can = ''; $no_msg = "with UBSAN we won't"; } if ($can eq 'all') { ++$config->{"can_unaligned_$_"} foreach @align; print " your CPU can read unaligned values for all of @align\n"; } else { my %can; ++$can{$_} for split ' ', $can; $config->{"can_unaligned_$_"} = $can{$_} || 0 foreach @align; if ($can) { print " your CPU can read unaligned values for only $can\n"; } else { print " $no_msg read unaligned values for any of @align\n"; } } } sub unaligned_access { my ($config) = @_; if ($^O eq 'MSWin32') { # Needs FIXME for Windows on ARM, but not sure how to detect that _gen_unaligned_access($config, 'all'); } else { # AIX: # uname -m: 00F84C0C4C00 # uname -p: powerpc # HP/UX # uname -m: 9000/800 # (but will be ia64 on Itanium) # uname -p illegal # Solaris # uname -m: i86pc # uname -p: i386 # FreeBSD # uname -m: amd64 # uname -p: amd64 # NetBSD # uname -m: amd64 # uname -p: x86_64 # OpenBSD # uname -m: amd64 # uname -p: amd64 # Assuming that the 50 other *BSD variants are forks of the 3 above # Linux # uname -p can return 'unknown' my $flag; if ($^O eq 'aix' || $^O eq 'solaris') { $flag = '-p'; } else { $flag = '-m'; } my $command = "uname $flag"; my $arch = `$command`; if (defined $arch) { chomp $arch; if ($arch =~ /^(?:x86_64|amd64|i[0-9]86)$/) { # Don't know alignment constraints for ARMv8 _gen_unaligned_access($config, 'all'); } elsif ($arch =~ /armv(?:6|7)/) { _gen_unaligned_access($config, 'int32'); } else { # ARMv5 and earlier do "interesting" things on unaligned 32 bit # For other architectures, play it safe by default. # Updates welcome. _gen_unaligned_access($config, ''); } } else { print STDERR "Problem running $command, so assuming no unaligned access\n"; } } } sub unaligned_access_cross { my ($config) = @_; _gen_unaligned_access($config, ''); } sub ptr_size_native { my ($config) = @_; my $restore = _to_probe_dir(); _spew('try.c', <<'EOT'); #include #include int main(int argc, char **argv) { printf("%u\n", (unsigned int) sizeof(void *)); return EXIT_SUCCESS; } EOT print ::dots(' probing the size of pointers'); compile($config, 'try') or die "Can't compile simple probe, so something is badly wrong"; my $size = `./try`; die "Unable to run probe, so something is badly wrong" unless defined $size; chomp $size; die "Probe gave nonsensical answer '$size', so something it badly wrong" unless $size =~ /\A[0-9]+\z/; print "$size\n"; $config->{ptr_size} = $size; } # It would be good to find a robust way to do this without needing to *run* the # compiled code. At which point we could also use it for the native build. sub ptr_size_cross { my ($config) = @_; warn "Guessing :-("; $config->{ptr_size} = 4; } sub computed_goto { my ($config) = @_; my $restore = _to_probe_dir(); _spew('try.c', <<'EOT'); #include #include int main(int argc, char **argv) { void *cgoto_ptr; cgoto_ptr = &&cgoto_label; goto *cgoto_ptr; return EXIT_FAILURE; cgoto_label: return EXIT_SUCCESS; } EOT print ::dots(' probing computed goto support'); my $can_cgoto = compile($config, 'try'); unless ($config->{crossconf}) { $can_cgoto &&= !system './try'; } print $can_cgoto ? "YES\n": "NO\n"; $config->{cancgoto} = $can_cgoto || 0 } sub C_type_bool { my ($config) = @_; my $restore = _to_probe_dir(); my $template = <<'EOT'; #include #include #include int main(int argc, char **argv) { %s foo = false; foo = true; return foo ? EXIT_SUCCESS : EXIT_FAILURE; } EOT print ::dots(' probing C type support for: _Bool, bool'); my %have; for my $type (qw(_Bool bool)) { _spew('try.c', sprintf $template, $type); $have{$type} = compile($config, 'try'); $have{$type} &&= !system './try' unless $config->{crossconf}; delete $have{$type} unless $have{$type} } print %have ? "YES: " . join(',', sort keys %have) . "\n": "NO: none\n"; $config->{havebooltype} = %have ? 1 : 0; $config->{booltype} = (sort keys %have)[0] || 0; } sub pthread_yield { my ($config) = @_; my $restore = _to_probe_dir(); _spew('try.c', <<'EOT'); #include #include #include int main(int argc, char **argv) { #ifdef _POSIX_PRIORITY_SCHEDULING /* hide pthread_yield so we fall back to the recommended sched_yield() */ return EXIT_FAILURE; #else pthread_yield(); return EXIT_SUCCESS; #endif } EOT print ::dots(' probing pthread_yield support'); my $has_pthread_yield = compile($config, 'try') && system('./try') == 0; print $has_pthread_yield ? "YES\n": "NO\n"; $config->{has_pthread_yield} = $has_pthread_yield || 0 } sub win32_compiler_toolchain { my ($config) = @_; my $has_nmake = 0 == system('nmake /? >NUL 2>&1'); my $has_cl = `cl 2>&1` =~ /Microsoft Corporation/; my $has_gmake = 0 == system('gmake --version >NUL 2>&1'); my $has_gcc = 0 == system('gcc --version >NUL 2>&1'); if ($has_nmake && $has_cl) { $config->{win32_compiler_toolchain} = 'win32'; } elsif ($has_gmake && $has_gcc) { $config->{win32_compiler_toolchain} = 'mingw32'; } else { $config->{win32_compiler_toolchain} = '' } $config->{win32_compiler_toolchain} } sub rdtscp { my ($config) = @_; my $restore = _to_probe_dir(); _spew('try.c', <<'EOT'); #include #include #ifdef _WIN32 #include #else #include #endif int main(int argc, char **argv) { unsigned int _tsc_aux; unsigned int tscValue; tscValue = __rdtscp(&_tsc_aux); if (tscValue > 1) return EXIT_SUCCESS; return EXIT_FAILURE; } EOT print ::dots(' probing support of rdtscp intrinsic'); my $can_rdtscp = compile($config, 'try'); unless ($config->{crossconf}) { $can_rdtscp &&= !system './try'; } print $can_rdtscp ? "YES\n": "NO\n"; $config->{canrdtscp} = $can_rdtscp || 0 } '00'; MoarVM-2018.03/build/setup.pm0000644000175000017510000003056213252330426016006 0ustar samanthasamanthapackage main; use strict; use warnings; use File::Spec::Functions qw(devnull); my $devnull = devnull(); # 3rdparty library configuration our %TP_LAO = ( name => 'atomic_ops', path => '3rdparty/libatomic_ops/src', rule => 'cd 3rdparty/libatomic_ops && CC=\'$(CC)\' CFLAGS=\'$(CFLAGS)\' ./configure @crossconf@ && cd src && $(MAKE) && cd ..', clean => 'cd 3rdparty/libatomic_ops/src && $(MAKE) distclean', ); our %TP_SHA = ( name => 'sha1', path => '3rdparty/sha1', src => [ '3rdparty/sha1' ], ); our %TP_TOM = ( name => 'tommath', path => '3rdparty/libtommath', src => [ '3rdparty/libtommath' ], ); our %TP_MT = ( name => 'tinymt', path => '3rdparty/tinymt', src => [ '3rdparty/tinymt' ], ); our %TP_DC = ( name => 'dyncall_s', path => '3rdparty/dyncall/dyncall', rule => 'cd 3rdparty/dyncall && ./configure && CC=\'$(CC)\' CFLAGS=\'-fPIC\' $(MAKE) -f Makefile ', clean => 'cd 3rdparty/dyncall && $(MAKE) -f Makefile clean', ); our %TP_DCB = ( name => 'dyncallback_s', path => '3rdparty/dyncall/dyncallback', dummy => 1, # created as part of dyncall build ); our %TP_DL = ( name => 'dynload_s', path => '3rdparty/dyncall/dynload', dummy => 1, # created as part of dyncall build ); our %TP_CMP = ( name => 'cmp', path => '3rdparty/cmp', src => [ '3rdparty/cmp' ], ); our %TP_UVDUMMY = ( name => 'uv', path => '3rdparty/libuv', # no default rule # building libuv is always OS-specific ); our %TP_UV = ( %TP_UVDUMMY, rule => '$(AR) $(ARFLAGS) @arout@$@ $(UV_OBJECTS)', clean => '$(RM) @uvlib@ $(UV_OBJECTS)', # actually insufficient to build libuv # the OS needs to provide a C or C setting ); our %THIRDPARTY = ( lao => { %TP_LAO }, tom => { %TP_TOM }, sha => { %TP_SHA }, mt => { %TP_MT }, dc => { %TP_DC }, dcb => { %TP_DCB }, dl => { %TP_DL }, uv => { %TP_UVDUMMY }, cmp => { %TP_CMP }, ); # shell configuration # selected by C<--shell> our %SHELLS = ( posix => { sh => '/bin/sh', cat => 'cat', rm => 'rm -f', nul => '/dev/null', }, win32 => { sh => 'cmd', cat => 'type', rm => 'del', nul => 'NUL', }, ); # toolchain configuration # selected by C<--toolchain> our %TC_POSIX = ( -compiler => 'cc', make => 'make', ar => 'ar', ccswitch => '-c', ccout => '-o ', ccinc => '-I', ccdef => '-D', cppswitch => '-E', cppout => '> ', asmswitch => '-S', asmout => '-o ', ldout => undef, lddir => '-L', ldusr => '-l%s', ldsys => undef, ldimp => undef, ccshared => '-fPIC', ldshared => '-shared @ccshared@', moarshared => '', ldrpath => '-Wl,-rpath,"/@libdir@"', arflags => 'rcs', arout => '', mkflags => '', mknoisy => '', obj => '.o', lib => 'lib%s.a', dll => 'lib%s.so', asm => '.s', bindir => '@prefix@/bin', libdir => '@prefix@/lib', mastdir => '@prefix@/share/nqp/lib/MAST', sharedlib => '', staticlib => '', -auxfiles => [], ); our %TC_GNU = ( %TC_POSIX, -compiler => 'gcc', mknoisy => <<'TERM', ifneq ($(NOISY), 1) MSG = @echo CMD = @ NOOUT = > @nul@ NOERR = 2> @nul@ endif TERM dllimport => '__attribute__ ((visibility ("default")))', dllexport => '__attribute__ ((visibility ("default")))', dlllocal => '__attribute__ ((visibility ("hidden")))', ); our %TC_BSD = ( %TC_POSIX, mknoisy => <<'TERM', .if $(NOISY) != 1 MSG = @echo CMD = @ NOOUT = > @nul@ NOERR = 2> @nul@ .endif TERM ); our %TC_MSVC = ( -compiler => 'cl', make => 'nmake', ar => 'lib', ccswitch => '/c', ccout => '/Fo', ccinc => '/I', ccdef => '/D', cppswitch => '/P', cppout => '/Fi', asmswitch => '/c /FAs', asmout => '/Fa', ldout => '/out:', lddir => '/libpath:', ldusr => '%s.lib', ldsys => undef, ldimp => '%s.dll.lib', ccshared => '', ldshared => '/dll', moarshared => '/implib:@moardll@.lib', ldrpath => '', arflags => '/nologo', arout => '/out:', mkflags => '/nologo', mknoisy => <<'TERM', !IF $(NOISY) != 1 MSG = @echo CMD = @ NOOUT = > @nul@ NOERR = 2> @nul@ !ENDIF TERM obj => '.obj', lib => '%s.lib', dll => '%s.dll', asm => '.asm', bindir => '@prefix@/bin', libdir => '@bindir@', mastdir => '@prefix@/share/nqp/lib/MAST', sharedlib => '@moardll@.lib', staticlib => '', -auxfiles => [ qw( @name@.ilk @name@.pdb @moardll@.lib @moardll@.exp vc100.pdb ) ], -thirdparty => { dc => { %TP_DC, name => 'libdyncall_s', rule => 'cd 3rdparty/dyncall && configure.bat /target-x86 && $(MAKE) -f Nmakefile', clean => '$(RM) 3rdparty/dyncall/ConfigVars @dclib@ @dcblib@ @dllib@ 3rdparty/dyncall/dyncall/*@obj@ 3rdparty/dyncall/dyncallback/*@obj@ 3rdparty/dyncall/dynload/*@obj@', }, dcb => { %TP_DCB, name => 'libdyncallback_s' }, dl => { %TP_DL, name => 'libdynload_s' }, }, ); our %TOOLCHAINS = ( posix => { %TC_POSIX }, gnu => { %TC_GNU }, bsd => { %TC_BSD }, msvc => { %TC_MSVC }, ); # compiler configuration # selected by C<--compiler> our %COMPILERS = ( gcc => { -toolchain => 'gnu', cc => 'gcc', ld => undef, ccmiscflags => '-Werror=declaration-after-statement -Werror=pointer-arith', ccwarnflags => '', ccoptiflags => '-O%s -DNDEBUG', ccdebugflags => '-g%s', ccinstflags => '-pg', ldmiscflags => '', ldoptiflags => undef, lddebugflags => undef, ldinstflags => undef, noreturnspecifier => '', noreturnattribute => '__attribute__((noreturn))', formatattribute => '__attribute__((format(X, Y, Z)))', }, clang => { -toolchain => 'gnu', cc => 'clang', ld => undef, ccmiscflags => '-fno-omit-frame-pointer -fno-optimize-sibling-calls', ccwarnflags => '-Wno-logical-op-parentheses', ccoptiflags => '-O%s -DNDEBUG', ccdebugflags => '-g%s', ccinstflags => '-fsanitize=address', cc_covflags => '-fprofile-instr-generate -fcoverage-mapping', ldmiscflags => '', ldoptiflags => undef, lddebugflags => undef, ldinstflags => undef, ld_covflags => '-fprofile-instr-generate -fcoverage-mapping', noreturnspecifier => '', noreturnattribute => '__attribute__((noreturn))', formatattribute => '__attribute__((format(X, Y, Z)))', }, cl => { -toolchain => 'msvc', cc => 'cl', ld => 'link', ccmiscflags => '/nologo /MT', ccwarnflags => '', ccoptiflags => '/Ox /GL /DNDEBUG', ccdebugflags => '/Zi', ccinstflags => '', ldmiscflags => '/nologo', ldoptiflags => '/LTCG', lddebugflags => '/debug /pdb:$@.pdb', ldinstflags => '/Profile', noreturnspecifier => '__declspec(noreturn)', noreturnattribute => '', formatattribute => '', # TODO }, cc => { -toolchain => 'posix', cc => 'cc', ld => undef, ccmiscflags => '', ccwarnflags => '', ccoptiflags => '-O -DNDEBUG', ccdebugflags => '-g', ccinstflags => '', ldmiscflags => '', ldoptiflags => undef, lddebugflags => undef, ldinstflags => undef, noreturnspecifier => '', noreturnattribute => '', formatattribute => '', }, ); # OS configuration # selected by C<--os> or taken from C<$^O> our %OS_WIN32 = ( exe => '.exe', defs => [ qw( WIN32 AO_ASSUME_WINDOWS98 ) ], syslibs => [ qw( shell32 ws2_32 mswsock rpcrt4 advapi32 psapi iphlpapi userenv user32 ) ], platform => '$(PLATFORM_WIN32)', dllimport => '__declspec(dllimport)', dllexport => '__declspec(dllexport)', dlllocal => '', translate_newline_output => 1, -thirdparty => { # header only, no need to build anything lao => undef, uv => { %TP_UVDUMMY, src => [ qw( 3rdparty/libuv/src 3rdparty/libuv/src/win ) ], }, }, ); our %OS_MINGW32 = ( %OS_WIN32, make => 'gmake', defs => [ @{$OS_WIN32{defs}}, qw( _WIN32_WINNT=0x0600 ) ], dll => '%s.dll', ldimp => '-l%s.dll', libdir => '@bindir@', ccshared => '', ldshared => '-shared -Wl,--out-implib,lib$(notdir $@).a', moarshared => '', ldrpath => '', sharedlib => 'lib@moardll@.a', translate_newline_output => 1, -thirdparty => { %{$OS_WIN32{-thirdparty}}, dc => { %TP_DC, rule => 'cd 3rdparty/dyncall && ./configure.bat /target-x86 /tool-gcc && $(MAKE) -f Makefile.embedded mingw32', clean => $TC_MSVC{-thirdparty}->{dc}->{clean}, }, }, ); our %OS_POSIX = ( defs => [ qw( _REENTRANT _FILE_OFFSET_BITS=64 ) ], syslibs => [ qw( m pthread ) ], platform => '$(PLATFORM_POSIX)', ); our %OS_AIX = ( %OS_POSIX, defs => [ qw( _ALL_SOURCE _XOPEN_SOURCE=500 _LINUX_SOURCE_COMPAT ) ], syslibs => [ @{$OS_POSIX{syslibs}}, qw( rt dl perfstat ) ], ldmiscflags => '-Wl,-brtl', ldrpath => '-L"/@libdir@"', -thirdparty => { uv => { %TP_UVDUMMY, objects => '$(UV_AIX)' }, }, ); our %OS_LINUX = ( %OS_POSIX, syslibs => [ @{$OS_POSIX{syslibs}}, qw( rt dl ) ], -thirdparty => { uv => { %TP_UVDUMMY, objects => '$(UV_LINUX)' }, }, ); our %OS_OPENBSD = ( %OS_POSIX, syslibs => [ @{$OS_POSIX{syslibs}}, qw( kvm ) ], -thirdparty => { uv => { %TP_UVDUMMY, objects => '$(UV_OPENBSD)' }, }, ); our %OS_NETBSD = ( %OS_POSIX, syslibs => [ @{$OS_POSIX{syslibs}}, qw( kvm ) ], -thirdparty => { uv => { %TP_UVDUMMY, objects => '$(UV_NETBSD)' }, }, ); our %OS_FREEBSD = ( %OS_POSIX, cc => (qx!cc -v 2>&1 >$devnull! !~ 'clang') ? 'gcc' : 'clang', syslibs => [ @{$OS_POSIX{syslibs}}, qw( kvm ) ], -thirdparty => { uv => { %TP_UVDUMMY, objects => '$(UV_FREEBSD)' }, }, ); our %OS_DRAGONFLY = ( %OS_POSIX, syslibs => [ @{$OS_POSIX{syslibs}}, qw( kvm ) ], -thirdparty => { uv => { %TP_UVDUMMY, objects => '$(UV_FREEBSD)' }, }, ); our %OS_GNUKFREEBSD = ( %OS_FREEBSD, syslibs => [ @{$OS_FREEBSD{syslibs}}, qw( rt dl ) ], ); our %OS_SOLARIS = ( %OS_POSIX, defs => [ qw( _XOPEN_SOURCE=500 _XOPEN_SOURCE_EXTENDED=1 __EXTENSIONS__=1 _POSIX_PTHREAD_SEMANTICS _REENTRANT _FILE_OFFSET_BITS=64 ) ], syslibs => [ qw( socket sendfile nsl pthread kstat m rt ) ], mknoisy => '', -thirdparty => { dc => { %TP_DC, rule => 'cd 3rdparty/dyncall && CC=\'$(CC)\' CFLAGS=\'$(CFLAGS)\' $(MAKE) -f Makefile.embedded sun', clean => 'cd 3rdparty/dyncall && CC=\'$(CC)\' CFLAGS=\'$(CFLAGS)\' $(MAKE) -f Makefile.embedded clean', }, uv => { %TP_UVDUMMY, objects => '$(UV_SOLARIS)' }, }, ); our %OS_DARWIN = ( %OS_POSIX, defs => [ qw( _DARWIN_USE_64_BIT_INODE=1 ) ], syslibs => [], usrlibs => [ qw( pthread ) ], dll => 'lib%s.dylib', ccshared => '', ldshared => '-dynamiclib', moarshared => '-install_name "@prefix@/lib/libmoar.dylib"', sharedlib => 'libmoar.dylib', -thirdparty => { uv => { %TP_UVDUMMY, objects => '$(UV_DARWIN)' }, }, ); our %SYSTEMS = ( posix => [ qw( posix posix cc ), { %OS_POSIX } ], linux => [ qw( posix gnu gcc ), { %OS_LINUX } ], aix => [ qw( posix gnu gcc ), { %OS_AIX } ], darwin => [ qw( posix gnu clang ), { %OS_DARWIN } ], openbsd => [ qw( posix bsd gcc ), { %OS_OPENBSD} ], netbsd => [ qw( posix bsd gcc ), { %OS_NETBSD } ], dragonfly => [ qw( posix bsd gcc ), { %OS_DRAGONFLY } ], freebsd => [ qw( posix bsd), $OS_FREEBSD{cc} , { %OS_FREEBSD } ], gnukfreebsd => [ qw( posix gnu gcc ), { %OS_GNUKFREEBSD } ], solaris => [ qw( posix posix gcc ), { %OS_SOLARIS } ], win32 => [ qw( win32 msvc cl ), { %OS_WIN32 } ], cygwin => [ qw( posix gnu gcc ), { %OS_WIN32 } ], mingw32 => [ qw( win32 gnu gcc ), { %OS_MINGW32 } ], ); 42; MoarVM-2018.03/build/test.txt0000644000175000017510000000015213111771622016021 0ustar samanthasamantha MoarVM does not come with its own test suite Build NQP with the Moar backend and test from there. MoarVM-2018.03/check.todo0000644000175000017510000000057213237701105015152 0ustar samanthasamantha.clangcheck/6model/serialization.c: NOCLANG += sign-conversion unused-macros unused-function .clangcheck/6model/bootstrap.c: NOCLANG += sign-conversion unused-variable shorten-64-to-32 .clangcheck/6model/6model.c: NOCLANG += missing-noreturn .clangcheck/6model/reprs.c: NOCLANG += missing-noreturn .gcccheck/6model/bootstrap.c: NOGCC += unused-variable unused-but-set-variable MoarVM-2018.03/docs/6model-parametric-extensions.markdown0000644000175000017510000000626413111771622023420 0ustar samanthasamantha# 6model parametric extensions in MoarVM ## Overview The 6model parametric extensions add parametric type support at the VM level. A type may configure itself as supporting parameterization. Parameterizations each have a unique key, which is used to intern them. This ensures each of the parameterizations exists only once. In the case that two modules both produce and serialize a parameterization, that from the second module may be freely disregarded, and the existing deserialization of the parameterized type may be used. This ensures unique type objects per parameterization are upheld even in the case of precompilation. Each parameterization will have a unique STable and type object. It is up to the meta-object whether the HOW is shared between parameterizations. For example, parametric roles reify the methods within them with concrete type parameters, so a separate HOW is required. By contrast, CoerceHOW, the meta-object for coercion types, can store all that is distinctive about it within the type's parameters. Since a given parameteriation can be queried for its parameters, it is possible for all Perl 6 coercion types to share a single meta-object. ## STable extensions The mode flags on an STable get two new additions: * Parametric (this type can be parameterized) * Parameterization (this type is the parameterization of some parametric type) A type cannot be both parametric and a parameterization, meaning we can use a union to store parametrics-related data. union { struct { MVMObject *parameterizer; /* Thing to invoke) MVMParameterizationLookup *lookup; /* Known parameterizations */ } parametric; struct { MVMObject *parametric_type; /* The parameterized type */ MVMObject *parameters; /* The parameters. */ } parameterized; } ## New ops The VM op additions match the nqp::op additions for parametric types: ### nqp::setparameterizer(type, parameterizer) Makes a type as being parametric, and configures the code needed to parameterize it. ### nqp::parameterizetype(type, parameter_array) Takes a parameterizable type and an array of parameters. Looks up and returns any existing matching parameterization. If it does not exist, invokes the parameterization producer for the parametric type, installs that in the lookup, and returns it. Note that the array is snapshotted, for the benefits of the type specializer. ### nqp::typeparameterized(type) If the type specified is a parameterization of some other type, then returns that type. Otherwise, returns null. ### nqp::typeparameters(type) Gets the type parameters used to parameterize the type. Throws an exception if the type is not parametric. ### nqp::typeparameterat(type, idx) Equivalent to nqp::atpos(nqp::typeparameters(type), idx), except much easier for type specialization to understand and deal with and avoids an array construction. ## Interaction with spesh Specializations can take place per parameterization of a type. This means that uses of nqp::typeparameterat(...) can become constants at specialization time, which opens up numerous optimization possibilities. ## Deserialize-time interning XXX To define MoarVM-2018.03/docs/ChangeLog0000644000175000017510000031576413253601104015720 0ustar samanthasamanthaSee https://github.com/MoarVM/MoarVM/wiki/ChangeLog-Draft for the draft changelog since the previous release. New in 2018.03 Miscellaneous + Add remote debugging support, optionally enabled with the --debug-port option to MoarVM. This uses the MessagePack and allows: + Suspending and resuming all threads, or individual threads + Enumerating threads and, when they are suspended, getting their stack traces + Reading the lexical variables of a callframe + Setting breakpoints and getting notified if they are hit (and, optionally, suspending execution) + Stepping + Fetching object attributes, array elements, and hash keys/values + Add getppid op. Allows a child process to get the parent process id, and thus guess if it has become orphaned. + Panic when Dyncall fails to allocate native callbacks + Use uv_fs_copyfile API in MVM_file_copy + Make IO signal handlers cancellable + Add an tryfindmethod op which evaluates to null in the event that the method cannot be found Network: + Ignore libuv-caused "fake" empty datagrams + Expose both hostname and port of received datagrams Encodings: + Change arguments for windows1252/1 decodestream ops + Add proper support for replacements in decodestream for windows1252/1 + Add ops for strict decoding of windows-1251/1252, decoderepconfig, encodeconfig, decodeconfig and encoderepconfig + Add support for replacements with more than one character for windows-1251 and windows-1252 + Add some string consts in MVMStringConsts for MVMDecodeStream Spesh: + optimize eq_s and ne_s against empty string in spesh Tooling: + Bump libuv version 1.19.2 + Move moarvm.org tool into proper folder. Add more release guide info + Add CMP library to ./3rdparty which is used for supporting the debug server + Add debug server protocol documentation JIT: + Add JIT template for ne_s, const_n64, not_i, is(int|num|str|list), existskey, eqat_s, concat_s, isnull_s, isfalse, istrue, ishash + Enable box_i and box_s templates + Release only spill slots without active overlap + Warn for things that should be a size but may not be in the expr JIT compiler + Create store_write_barrier macro Profiler: + Support for threaded profiling has been added, although it is not fully stable yet + Record thread id in profile data + Record if a thread is responsible for a gc + Count spesh time properly + Record when gc happens (msecs since start) + Fix for gigantic and wrong spesh time in profiles New in 2018.02 Miscellaneous: + Clean up one-shot timers after firing + Fix SEGV in profiler by testing the current thread's frame in heap snapshot + Fix missing argument to syncsocket error message + Fix EOF detection on zero-size files Strings: + Add windows-1251 (Cyrillic) decode/encode support + Refactor so code is shared between windows-1251 & 1252 + Fix a bug causing encoding of ›, Ëœ, Å“, ž, Ÿ, â„¢ and Å¡ with windows-1252 (Latin) to throw or fail encoding Spesh: + Make MVM_spesh_manipulate_remove_handler_successors() public + Move annotations to istrue when split from if_o + Always split if_o into istrue and if_i + Fix MVM_spesh_log_decont not logging anything + Don't spesh log if we have a spesh_cand + Don't optimize getattr unless known concrete + Implement unmanaged_size in MVMSpeshLog repr + Run basic facts discovery on inlined code + Clean up handler successors after throwish ops become non-throwing + Put inlined blocks between their caller and its successor + Fix an off-by-one in uninline + Remove superfluous DEOPT_ONE_INS annotation on some deconts + Work around a segfault caused by type tuple without type information + Revive removal of dead instructions after the first inlined function + Fix SEGV when opening MVM_*_LOG files JIT: + Add JIT templates for more than 44 ops + Disable getlexstatic_o for the time being for stability reasons + Fix segfault in JIT bytecode dumper on code without static frame + Add NOOP expr JIT operator + Don't output PHI in expr JIT log + Better error in boxed ref for repr_id mismatch + Add tiles for binary XOR and NOT + Fix a miscompile in sp_p6ogetvt_o + Only BAIL on DEOPT_ONE annotations on actual guard ops in expr JIT + Merge non-control-flow basic blocks so expr JIT has more code to optimize Tooling: + Update release_guide.md with info on generating releases.html + Add script that generates moarvm.org/releases.html + Edit the ChangeLog to include the original release + Add script to generate Windows-1251 and 1252 codetables New in 2018.01 Miscellaneous: + Refuse to `make release` with dirty work tree + Fix off-by-one error when checking inline boundaries in MVM_frame_find_contextual_by_name() + Make it more clear where new ops are meant to go to in src/core/optlist + Fix leak when args bind error would unwind rather than return + On Windows (not using Visual Studio), print size_t with %Iu. + Fix crash in TTY flushing on WSL (Bash on Win10) + Do less work in zeroing out VMArray + Zero out cut off elements when downsizing VMarray + Fix incorrect EOF detection on seek'ed handles Unicode: + ucd2c.pl: Fix White_Space/space Unicode property and several other property aliases + ucd2c.pl: code cleanup and refactoring JIT: + jit isprime_I + Un-bitrot tools/parse_jitgraph.p6 + Refactor search_frame_handlers_lex for readability + Implement tile for OR operator Spesh: + Mark sp_rebless as :noinline + Fix off-by-one error in uninline + Pay attention to return op in cross-HLL inlines + Optimize not_i when its input is a known value + Add some missing fact dependencies + Remove bogus comment and known value fact tweak + Make instruction deletion within dead BBs a no-op + Make log facts tolerate the odd outlier + Place facts on a `clone` op + New spesh-bisect.pl tool + Fix OSR of thread entry frame + Allow some cross-HLL inlining, this means we can inline bits of NQP (usually guts like Block.clone) into Perl 6 routines that call them. Garbage Collection/Memory: + Fix memory leaks reported by ASAN + The string stream decoder separator specification buffer(s) + The static frame spesh body statistics buffer + The spesh plan type stats buffer + The spesh plan, when the static frame could not be added + In MVM_unicode_name_to_property_value_code() + Debug log fixes: + Fix spelling typos in GC debug log + Remove strange segfault-inducing debug code New in 2017.12 Miscellaneous: + Fix ASAN flags for Darwin platform + Fix implementation of the new inline boundary indicators to set action Unicode: + Fix it so Line_Break property returns XX as the default value, instead of incorrectly returning BK + Fix it so Numeric_Type property doesn't return an empty string for codepoints with the Digit property value + Make Bidi_Mirrored_Glyph an enum instead of storing the full codepoint value in the bitfield + Make error messages consistent which refer to synthetic codepoints + Many, many fixes and changes to ucd2c.pl, which generates the Unicode database. Most changes are not user visible but will be the foundation for making sure we return the correct property values for codepoints not in UnicodeData.txt (Primary Unicode Data source file) + Note, we have the correct values for most of these other codepoints, but the goal is the get even these currently reserved characters working. Main pluses for this are: 1. Correctness 2. Unicode sometimes sets properties for codepoints based on likely future usage. This would allow better correctness if an older version of MoarVM is used with codepoints from a future versions of Unicode codepoints (as could be the case with OS distributions lagging behind current releases) JIT: + Lexical handler lookups no longer prevent a lot of inlines + jit-bisect.pl now uses MVM_SPESH_LIMIT when trying to find pesky spesh bugs + Fixed issue with taking a pointer-pointer to a moving object and don't read a NULL struct Spesh: + Extend jit-bisect.pl to use MVM_SPESH_LIMIT New in 2017.11 Miscellaneous: + Show the actual type when "no such attribute" errors occur + In MVM_fixed_size_free and MVM_fixed_size_free_at_safepoint debug/error messages use %lu instead of %d, put in missing output in one case + Harden event loop against fast cancellations + Remove dependency on Perl 5 autodie for compilation (expression engine) + Remove duplicate env variable usage line from moar --help + Update our internal release guide to include steps for signing tags + Profiler: Fix integer literal form for 1LL << 32 + Add support for a block noinline flag. Used to indicate that a block may never be inlined; will bet set by Rakudo upon spotting uses of things that need the dispatcher + Fix occasional old reads in ConcBlockingQueue + Put coerce_II op in same order relative to oplist + Retry in certain cases of EINTR in mvm_fileno, read_bytes, read_one_packet, socket_write_bytes, socket_connect and socket_accept Unicode: + Fix uppercase letters not giving Lu for the General_Category + collapse_strands with memcpy if all strands are same type (4x faster for strands of same type) + Fix bug causing utf8-c8 synthetics to combine with other codepoints + Optimize MVM_string_concat when the RHS is a single strand that's equal to the LHS's final strand + Fix+add comments for strand concat optimization + Speed up join of longer strings by a significant amount by concating multiple times if there are more than 300 graphemes per string on average or there are less than 4 pieces and more than 150 graphemes per string. + join: factor code into join_get_str_from_pos() function + Make sure General_Category 'Cn' codepoints match with C enum + Resolve unassigned codepoints as the default property values in MVM_unicode_get_property_str + Add an additional check that the "bases" of the strands are the same length before checking if they're equal in string_from_strand_at_index. + Error message improvements to MVM_DEBUG_NFG #ifdef for synthetics JIT: + JIT compile getarg_*, trunc_i16, param_rp_s, getrusage, coerce_II op, getexcategory + Fix labeling off-by-one causing try/catch on some frames to fail + Mark nativeinvoke_* noinline to enable JIT compilation + Treat NULL strings correctly in JIT compiled native subs + JIT compile native calls with up to 3 UTF-8 string arguments + JIT compile native calls with integer rw arguments Iter: + Don't segfault when MVM_iter on type object + Handle unsigned types to switch in MVM_iter() Spesh: + Fix spesh dropping MVM_SPESH_ANN_DEOPT_ONE_INS annotations + Include reason when we cannot inline in the debug output Math: + If dividing by 1 in MVM_bigint_div, just return the numerator + Make sure both objects are the same type when short-cutting division by 1 in MVM_bigint_div + Move assignment after MVMROOT in MVM_bigint_from_bigint libuv: + Use uv_fs_copyfile in MVM_file_copy instead of manually opening a handle and using and using uv_fs_sendfile to copy + Bump libuv to version 1.15.0 + Make sure to close uv_timer handles after they are canceled Garbage Collection/Memory + Fix unneeded GC blocking in loop + Fix pointer arithmetic in MVM_fixed_size_realloc_at_safepoint with a cast + Convert realloc plus memset 0 to recalloc in MVM_sc_set_object + FSA size debug: cooperate better with valgrind + Support FSA_SIZE_DEBUG in MVM_fixed_size_realloc and *realloc_at_safepoint MVMROOT: + Add MVMROOT2..MVMROOT5 macros to make rooting multiple variables easier + Add a missing MVMROOT to MVM_bigint_from_bigint + Fix HLL representations of CArray elements out of sync after native calls + Add missing MVMROOTs to MVM_bytecode_finish_frame and prepare_and_verify_static_frame + Add missing MVMROOTs around managed mutex acquire in MVM_serialization_demand_code, MVM_serialization_finish_deserialize_method_cache, MVM_serialization_demand_object and MVM_serialization_finish_deserialize_method_cache New in 2017.10 + Unix socket support has been added + Add new DynASM version as submodule + Removal of Configure.pl --lua and --has-dynasm options, compiling with these included 3rdparty libs is now required + Remove build dependency on Perl 5 Test::Exception module + Make a fast path for VMArray splice using memcpy + Add a few missing casts to MVMObject * + Cache the ENV var hash after first access + Improve MVM_dir_cwd() error message + Fix missing rooting/barriering in C[PP]Struct + Fix missing MVMROOTs in type parameterization handling + Fix returned tcp port values for async sockets (ntohs). See RT#132135. + Probe for gcc -Werror=* support. This allows building MoarVM on older GCCs. + Fix issues with FreeBSD build, including adding new libuv file to Makefile.in + Protect parameterization additions with a mutex and fix for parametric type race + Bump libuv to ver. 1.14.1 + Add MVM_fixed_size_realloc() and MVM_fixed_size_realloc_at_safepoint() + Fix a segfault when trying to bind a p6bigint to a matching attribute in a p6opaque + Include the type of unhandled register in error messages NativeCall: + Factor out callback thread finding so code is now shared between libffi and dyncall backends + Make native callback thread finding more robust + Stash native thread ID after GC unblock + Many NativeCall functions can now be JIT'd JIT: + JIT compile native calls with VMArray arguments + Basic JIT of lock/unlock + Support unsigned ints when JIT compiling native calls + Move null check into getdynlex func and remove bare null from getlexrel and getlexreldyn + Don't allow low-level null from getdynlex + Remove duplicate typedef for MVMJitCompiler + getlex_o now returns VNMull rather than null + Merge the 'expression tree' JIT compiler backend. + Document the expression template syntax and IR structure + Document tiles + Add jit-bisect tool to help us bisect JIT issues + Add jit-dump tool to compare JIT output between runs + Process annotations on PHI nodes Frame: + Ensure ->caller/->static_info can't get outdated + Check caller chain before promotion + Set frame->caller up earlier + Add missing MVMROOT of outer/code_ref + Set frame->static_info in allocate_frame + Skip stats for frames beyond spesh max bytecode size + Don't generate log entries for huge frames Spesh: + Fix possible access to moved object body + Add missing MVMROOT of return value for spesh logging + Don't give internal workers a spesh log + Make "Can't find nc_site value on spesh ins" non-fatal GC: + Add more GC debug checks to help find ->caller bug + Add debug assert in remove_one_frame + GC block pow_I thread due to it potentially being an expensive call + Mark thread GC blocked when locking file + Update GC debug code for growing nurseries + Avoid a thread yield loop in mark_thread_unlocked + Catch frame worklist adds with NULL static_info + Make thread GC nurseries scale to need Build: + Sort the flags for MAST::Ops before generating them Strings: + join: factor the concat stability checks into their own function and simplify conditionals + join: special case 8bit flat pieces/separator. 3x faster for joining 8bit flat strings + join: If only one item is to be joined, just return it + join: When everything to be joined is made up of strands, copy strands instead of making one flat string + Fix quaternary collation level's. Fixes RT#132216 + collation: simplify quaternary and use define's for the bitmask + Speed up codes op by 10% for synthetic graphemes + In KMP based index set max stack alloca to 3000 bytes (used to be 4096) + Deduplicate the while loops into a #define in KMP based index + Fix utfc-c8 encoding for values > 0x10FFFF and unicode surrogates + Fix concat bug with utf8c8 strings, flattening utf8c8 synths + Use the FSA for a temp alloc in MVM_string_join + Use FSA to allocate memory in NFA + Change realloc condition in MVM_string_utf8_decode to avoid unneeded reallocs + Add hex digits to the end of non-unique Unicode names (i.e. ) + Update Unicode Emoji to version 5 + Download all emoji files and generate UCD for Emoji 4 and onward + Since Emoji names in Unicode are not guaranteed to be 100% stable, we read from version 4 onward to ensure full compatibility with older MoarVM versions and Emoji versions + Add info about planned features to Collation docs (Language/natural sort) Windows: + Fix ->seekable detection on TTY handles + Fix definition of MIN causing Windows issue + Pass user32 lib to build on Windows + #include ws2tcpip.h in syncsocket.c MacOS: + Only include libuv posix-hrtime on *BSD not Darwin, was causing some versions of MacOS not to build + Fix seekability detection on MacOS Solaris: + Solaris doesn't have memmem() so use the 3rdparty/FreeBSD one + Fix segfault on Solaris due to the undefined behavior of passing NULL to print FreeBSD: + + Fix getaddrinfo failing with EAI_HINTS on FreeBSD New in 2017.09.1 + Assign variable in optimize_bb loop on its own line for clarity + Revert "Fix errors when running `make realclean" to unbreak build using nmake New in 2017.09 + Allocate async process read buffer based on amount last read, with a minimum size limit + Implement the Knuth-Morris-Pratt string search algorithm + Add error string to 'failed to resolve' exception + Fix usage of ARG5 in JIT on Windows to use stack instead + JIT param_rp_i and param_rp_o + Fix calculation for maximum array size + Correct ==/= mistake in container optimization + Ensure strings created with MVM_string_repeat are in NFG form + Avoid evaluating arguments to MVM_ASSERT_NOT_FROMSPACE when it's disabled + Add up to date string documentation + Remove old strings.markdown documentation file + Speed up `index` 9x when Haystack is strand, needle is 1 long + Add new cached grapheme iterator + Always cache even for flat haystacks with KMP + Generate stacktraces on Travis CI when getting a segfault + Add MVM_DEBUG_NFG in more places + MVM_string_utf8_decodestream: free the buffer on malformed UTF-8 + Only run NFG_CHECK on concat result that *should* be normalized + Revise some comments in MVM_string_is_control_full() + Make sure MVMROOT'd pointer is initialized as NULL + Align MVM_TELEMETRY_LOG usage statement + Align --tracing usage statement + Update Unicode database for Unicode 10 + MVM_IS_32BIT_INT(i) with explicit casts + JIT eqat(ic|im|icim) + Building .dasc files depends on dynasm version + Add minimal 'dynamic array' library using macros + Make the JIT Graph use dynamic arrays + Cleanup JIT graph after use + Replace explicit JIT function return frame check + Wrap dasm_State in MVMJitComiler structure + Fix unlikely but possible stack overflow from user input + Allow MVM_string_get_grapheme_at_nocheck to be inlined + Make `eqat` 1.7x-2.5x faster + Fix indentation of switch in substrings_equal_nocheck + Use PRIi64 macro instead of %lld in MVM_coerce_i_s + Replace all uses of sprintf with snprintf + Consistently use MVMuint16 for was_multi + Add some explanation of GET_REG and cur_op to interp.c + Use < or <= sign for all conditionals in strings/ops.c + Rework MVMNFGSynthetic to not store base separately + Only use MVMGraphemeIter_cached for strands in KMP index + Split out JIT compiler init/deinit + Organise architecture-specific JIT source files + Check return status of DynASM + Remove JIT intermediates in make clean + Add 'POP' dynamic array method + Flush log on oops + Refactor labelling in JIT + Add spesh iterator and replace JitGraphBuilder + Fix leak of JIT graph + Simple fix for duplicated labels + Use VECTOR macro arguments only once if possible + Add vector SHIFT method + Enable JIT breakpoint insertion + Use single DynASM build target + Compile less with --no-jit + Add old-style suffix rule for dynasm compilation + Atomic increment not required for JIT sequence nr + Move size check into COPY_ARRAY + Correct buffer handling in UTF-8 fast->slow path + UCD: For sequences, convert from \x{ } to the Unicode codepoints + Flush standard handles at exit + Flush output buffer where needed + Ensure write to unwritable handle fails right off + Don't try and sync when flushing is enough + Better if_o/unless_o optimization in some cases + Do dead BB elimination pass after branch deletion + Optimize MVM_string_gi_move_to + Don't decont native refs when spesh logging + Handle native refs better in spesh stats + Support spesh multi resolution involving nativeref + Set facts on nativeref deconts + A little refactoring of second optimization pass + Remove fact copy we most likely don't now need + Re-flow and better explain set elimination code + Fix bug in gi_move_to if not starting at 0 + Introduce a binary format for heapsnapshot, wtih snapshots at the beginning of the file + Immediately write heap snapshots to file instead of keeping them around in memory + Write parts of types/static frames/strings incrementally into heap snapshot file + Add gc_describe functions for new spesh data structures + Use grapheme iterator cached for ignorecase/ignoremark index ops + Take more care when eliminating set inside inline + Re-compute dominance tree before stage 2 opts + Add a reliable locals count for inlines + Move throw -> goto optimization to second pass + Mark GC blocked when acquiring I/O mutex + Only use grapheme iter cached if the Haystack is a strand for index* + Don't try to duplicate unreachable handlers on inline + Ensure gi->start is set to 0 for flat strings in MVM_string_gi_init + Fix a leak in CArray REPR + Merge Full Unicode Collation Algorithm Implementation + Remove unneeded file from UCA implementation + Nativecall: fix invalid pointer creation + Fix ignoremark with Prepend characters and ordbaseat op + For degenerate Synth's with Prepend and Extend set base cp to 1st cp + Fix case change when base cp isn't the first cp in synthetic + Fix elems of ConcBlockingQueue REPR + Implement getrusage op + Add documentation on UCA collation implementation + Include debug names in some wrong REPR errors + Fix MVMROOT in socket port/host code added in last release + In README, note that release tarballs won't work out of the box and point to where to get working ones + Expose number of locks held by a thread through an op + Add missing concreteness checks in thread ops + Fix errors when running `make realclean + Store smallint value in 64bit if we negate them later + Fix segfault when compiling nqp with musl as libc + Avoid recursion in optimize_bb() when only 1 child node New in 2017.08.1 + Fix regression in Windows JIT build + Remove broken JIT of parameter operations New in 2017.08 + Dynamic optimization moved to a worker thread + Threads now write sequential logs into a log buffer, and send it to the worker thread in a concurrent queue + Quota of logs to avoid excessive memory use, with a boost when entering a new compilation unit for the sake of OSR + Added MVM_SPESH_BLOCKING environment variable to allow for reproducible specialization results when debugging + Reworked installation of specializations + Reworked OSR implementation to account for specialization being done on a worker thread + New statistics model for making better specialization decisions + Frames carry a correlation ID to allow reconstruction of call stack and analysis on the specialization worker thread + Produce specializations based upon most common occurring types, not just those sampled immediately after passing a threshold + Megamorphic code gets a non-type specialization and may be JIT-compiled + Remove hard limit on spesh candidate count + MVM_SPESH_DUMP updated to show statistics and planned specializations + Updated log analysis and guard insertion to use the new statistics model + New argument guard, based around a tree, which means less checks need to be performed when deciding on with specialization to run + Add dumping of new argument guard structure + Log time that specialization work consumes + Add a script to sum up logged spesh times + Better organization of MVMInstance and MVMThreadContext fields + Removed now-unused cur_usecapture field + Avoid passing a real NULL as an object argument in stack unwind handling + Disable spesh in initial load/deserialize; there's no useful data at this point + Add thread ID range check to GC debug mode + Deduplicate code from MVM_string_indexing_optimized + Start off collapsing strands as 8bit instead of 32bit + Concatenation improvements + When concat needs normalization only normalize one section + Don't trigger re_nfg on concat for base character + combiner + Add functions for iterating the codepoints of a grapheme + Don't re_nfg when last_a or first_b are synthetics in concat + Don't take the no re_nfg shortcut if a repetition contains a synthetic + Don't do re_nfg shortcut if either a or b are repeats + Use MVM_string_graphs_nocheck when able in concat + Fix conditional to check first instead of last strand of string b + Enable native callbacks on different threads + Fix double-decrement of unused args in inlining + More detailed dump of spesh slots + Don't NULL out spesh slots; they may be re-used + Make JIT include SC write barriers + Stronger validation of code objects in optimizer + Refactor code into iterate_gi_into_string() to reduce code duplication + Move collapse_strands() after iterate_gi_into_string() + NULL out registers on re-OSR + Only devirtualize REPR funcs in JIT when concreteness is known + Fix JIT of nqp::ordat and nqp::ordfirst + Update TinyMT to version 1.1 + We always have threads now (thanks to specializer worker), so remove single threaded VM instance lock avoidance paths + Improve GC thread sync-up + Simplify handling of the thread list + Introduce GC orchestration mutex/condvars, and use them to avoid busy waiting when synchronizing threads for GC + Avoid many array searches for SC code refs + JIT param_sp and param_sn + Inability to open telemeh log shall not be fatal + Output spesh worker info on telemetry channel + Size of MVMFrame reduced + Eliminate effective_handlers field in MVMFrame + Eliminate effective_bytecode field in MVMFrame + Add function to encapsulate special return setup + Move special return into a frame extras + Move continuation tags into frame extras + Move invoked_call_capture to frame extras + Move dynamic lexical cache to frame extras + Eliminate throw_address from frames + Force MVMReturnType to be a single byte + Toss never-used nameds re-use logic + Eliminate need to memset MVMFrame + Remove historical, now-unrequired, nullings + Use a bit field for named args used when possible + Improve NFA memory performance + Small optimization to string_equal, remove repeated checks + Remove two invoke handler functions we don't need + Remove long-unused newlexotic/lexoticresult ops + Remove now-dead newlexotic functions + Remove now-unused pool_index in MVMStaticFrame + Eliminate now-unused Lexotic REPR, lexotic cache + Remove a dead field + Remove unused gotolexotic function + Move spesh data into a separate object from MVMStaticFrame, for less memory use and better GC performance + Break MVM_sc_get_sc into inline and slow path + Delete unused var in MVM_string_ascii_encode_substr + Avoid range check on every SC object access + Delete unused var in MVM_string_latin1_encode_substr + Fix MVM_string_compare to support deterministic comparing of synthetics + Disable JIT when we're not allowed to make memory executable + Have MVM_string_codes iterate the string with codepoint iterator + Speed up attribute reads during invocation + Document the various op adverbs + Reduce duplication and simplify logic in invoke + Move checking part of force_to_heap into an inline + Allocate frames on heap that tend to need promotion anyway + Improve deopt logging output + Append, not prepend, moved deopt one annotations + Turn decont into a deoptonepoint and insert guards after decont + Store deopt one target directly in bytecode rather than calculating it each time + Implement speculative pre-selection of specializations and inlining based on guarding against the invocation target + When inlining, replace receive instruction instead of send instruction, to better cope with register re-use + JIT pow_I + Validate range of branch target in spesh code-gen + Anchor inlinee handlers to inliner entry + Fix and expand dead basic block removal + Remove duplicate use of named arg checking + More sophisticated named arg handling in spesh, removing sp_namedarg_used op + Make it possible to cancel an async socket reader + JIT rand_I and also give it a smallbigint path + Ensure that serialized padding bytes are 0 + Avoid uninitialized bytes in default tables + Avoid uninitialized bytes at the end of serialized tables + Add -Werror=pointer-arith for gcc + Put hard upper limit on bytecode size to optimize + Move annotations multiple basic blocks if needed + Eliminate "blocked by alias" propagation checks + End basic blocks after all throwish/invokish + Extra fflush so spesh log is written before crash + Ensure frame handler start/ends are BB boundaries + Don't explode on spesh dump when no facts + Cope with extra successors when inlining + Factor out and re-use dead BB elimination + Allow for GOTO handler to become unreachable + More precise CFGs for control exception handlers + Add indexim_s op and improve/fix bugs in eqatim_s + Further harden against removed handlers + Add debugging aid for spesh preselection + Make rebless deopt stack top frame also + Bump usage of writers in deopt instructions + Start storing/using static frame in inline table + Use register holding code ref for deopt purposes + Can never inline frames declaring state vars + Correct handler order when inlining + Implement inlining of basic lexical lookups + Tune the inline size + The listen callback shall also push socket and peer IP and port + Don't set a bit we're meant to be clearing in GC gen2 promotion + Harden listen_cancel against dupe calls + JIT nativecallcast, trunc_i32, extend_i32 + Make sure the libffi callback can be reused + JIT the create op + Check ffi_closure_alloc() return value + Implement atomic ops + Provide a way to have an int type sized to the architecture's atomic size + Implement cas for Scalar references and native integer references + Implement atomic load and store for Scalar references and native integer references + Implement atomic increment, decrement, and add for native integer references + Provide an op for doing a full memory barrier + JIT of the new atomic ops + Fix a bug in index/eqat(im) and in ord_getbasechar + Add nqp::coveragecontrol op + Remove two more unneeded strlen from nativecall.c + Only foldcase the needle for ignorecase operations + Remove impossible less than zero checks on unsigneds + Add GC debug check on frame heap promotion + Correct an MVM_ASSIGN to barrier the right target in continuation invocation + Root thread object while creating thread context + Correct invokewithcapture GC handling + Extra GC debug checks after frame promotion + Blacklist unhandled param ops in spesh args handling + Add hostname to failed to resolve error + JIT param_rp_o and param_rp_i + Introduce NFG_CHECK which checks string is in NFG form + Fix concatenation bug when renormalization needed + JIT setcodeobj and captureinnerlex New in 2017.07 + Full Unicode 9.0 and Emoji 4.0 text segmentation support + Improvements to segmentation of Emoji w/ GCB=Other + Use GCB instead of HST to avoid property lookup for Hangul + Reorder conditional in maybe_hangul() to be more clear + Work Hangul grapheme segmentation into GCB switches + Don't break after ZWJ for Emoji=True + GCB=Other + Make string_index 16% faster for non-identical string types + Greatly reduce the cases when string concatenation needs renormalization + Use normalize_should_break to decide if concat needs normalization + Rename should_break to MVM_unicode_normalize_should_break + Fix memory leak in MVM_nfg_is_concat_stable + If both last_a and first_b during concat are non-0 CCC, re-NFG + Improve the speed of normalization. Improves speed of slurping non-ASCII Unicode files + Speed up ccc by making ccc_relative using integer prop lookup + Rename is_control_beyond_latin1 to is_control_full + Use MVM_string_graphs_nocheck in more places throughout strings/ops.c + Rename relative_ccc to MVM_unicode_relative_ccc + Remove arbitrary string repeat limit + unicmp_s improvements + unicmp_s can now reverse any of the collation levels + Handle additional possible cases in collation + Store collation levels in an array not a single value + Handle quaternary collation level being both enabled and reversed + Improved instruction and basic block deletion handling to allow further code elimination + Only compile in \n -> \r\n on Windows + JIT-compile write_fhb and encode ops + Include return type facts for the encode op + Implement setbuffersize_fh op, which sets up output buffering for synchronous file handles + Fix error message for decodersetlineseps getting non-decoder + JIT open_fh, close_fh, read_fhb, decoderaddbytes, fc, chr, getcp_s, and objectid + Remove synchronous process support + Add new asynchronous permit mechanism, which can be used to provide delayed starting of reads and back-pressure + Implement permits handling for asynchronous processes + Convey file descriptors of stdout/stderr pipes when spawning an asynchronous process + Add debug helpers: MVM_dump_bytecode, MVM_dump_bytecode_stackframe and MVM_dump_bytecode_staticframe + Add gdb command to give a history of spesh optimization decisions + Improve specialization dump: less trailing spaces, chop up facts list by register + Empty out instruction list of removed basic blocks + Eliminate duplicate code in utf8 decoder + Fix overflow in uniprop lookups + Fix ASCII streaming decode error handling + Make illegal synthetic an oops, not a panic + Make some fixes to the Unicode data file downloader + Use MVMint64 for MVM_string_chr (oplist/function mismatch) + Fix an accidental nested redeclaration in process handling + Tweak the format of oops messages + Improved debug output for serialization errors + Fix ARM build + Clear cached dynamics when taking continuation + Missing MVMROOT during an allocation + Remove never-assinged use_mode_frame field from CallCapture + Remove now-unused cur_usecapture per thread + Eliminate mode flag from CallCapture + Fix invokewithcapture to keep the used capture alive + Always copy callsite into an MVMCallCapture unless it's interned + Remove now-unrequired effective_callsite + Add decodertakecharseof op + Copy correct length in get_all_in_buffer + Fix ctxcode op to not leak a NULL + Fix decoder typos New in 2017.06 + Make coerce_s_n work more like the Perl 6 Str.Num method + Eliminate socket string I/O + Re-implement synchronous sockets without using libuv, enabling them to be passed between threads + Add ability to get port from already bind-ed socket + Add cpucores op to get the number of CPU cores + Fix inconsistency in decode stream take bytes API, so it returns null if that number of bytes is not available + Fix memory leak in syncpipe + Removed unsed header file in threads.c * Remove unused args to bind_stdio_handle + Remove char-level I/O ops and the functions they called + Remove char-level I/O from synchronous I/O vtables + Remove unused encoding option in dir handle + Re-implement print/say debug output ops to encode and then use binary I/O + Eliminate use of libuv in synchronous file handles + Switch standard handles to use the new synchronous file handle code, which means they can now be safely used from multiple threads also + Remove unused ->filename slot of syncfile + Debugging aid for introspecting P6opaque objects + Support merge_bytes in async proc ops, for reading STDOUT and STDERR together + Support binding handles to file descriptors in async procs + Fix off-by-one in profiler node GC + Add string eqat/index ignorecase+ignoremark functions + Add new eqaticim_s and indexicim_s ops ignorecase+ignoremark + Use norm instead of n for the normalizer variable + Add improved support for GCB=Prepend + Improve Regional Indicators support during normalization + Serialize a Decoder REPR object into null, so incidental file handle serialization in Perl 6 does not blow up + Improve named argument optimization, so we can specialize and throw out instructions in more cases + JIT decodertakeline + Fix missed opportunity to run JITted code + Have inline log note what couldn't inline also + Remove successor when optional named argument is passed, so default code can be eliminated + Flag writers that die when a basic block is eliminated, and disregard them in PHI node analysis, provide more precise type information + Make a basic block elimination pre-pass before the main optimization work + Set dead writer when deleting instructions also, to further aid PHI merges + Track which basic blocks are part of a jump list + Delete pointless goto instructions (those at the end of a basic block that simply go to the next block) + Remove bad Windows quoting option async proc code + Actually log inlines to stderr as the comment up top claims + Make find_separator only look at the last chars, which is far cheaper + Add help text for environment variables to Configure + Move NFG initialization into nfg.c + Cache CRLF grapheme value + Cache maximum separator length, to save recomputing it for every line that is read + Cache a list of final separator graphemes, for faster stopper detection in streaming decoders + Introduce a max final grapheme codepoint filter, for faster stopper detection in streaming decoders + Add a UTF-8 decoding fast-path that doesn't need to go through the full normalizer + Keep last freed chars buffer handy for re-use in streaming decoder + Make a smarter guess at decode result buffer size in streaming decoder + Don't copy when we can steal decoder output, saving a memory copy in most line reading operations + Various micro-optimizations to UTF-8 decoding fast path + Fix newline translation in various encoding's streaming decoder New in 2017.05 + Mark profiler call graphs iteratively instead of recursively + Keep around line number annotations in spesh, for more accurate source position information for coverage data in specialized code + Introduce "telemeh", a high-precision-time low-impact logger + Fix error reporting in chdir + Fix memory leak on error in chdir + Travis: readlink doesn't have `-f` on MacOS so make our own solution + Fix bug in index ignorecase and equal at ignorecase + Fix all known remaining bugs in indexic and eqatic + Zero slot when popping a VMArray, to avoid junk reads if it grows again later + Add can_fit_into_8bit funct, put logic used many places into one function + Use -1 instead of 0 when long right-shifting negative smallints + Remove workaround for tommath issue #56, which is now fixed upstream + Don't crash on reading a closed dir handle + Remove deprecated async string I/O ops New in 2017.04 + Shorten the nursery when creating large bigints, to bring GC forward and resolve excessive memory use + Use correct format for repeat/concat errors + Fix bug in indexic_s if expanding codepoint is the last codepoint + Special case "\r\n" in MVM_nfg_is_concat_stable for performance reasons + Further optimize MVM_nfg_is_concat_stable to speed up concatenation + Do not set use rpath if installing into proper system locations + Optimize passes_quickcheck_and_zero_ccc to be much faster + Give this_repr constants more meaningful names to aid debugging + Streamline MVM_bigint_radix and MVM_radix for Nd Unicode #'s + Fix case-insensitive string compare bug when synthetics are in the haystack + Improve description for "should eventually be unreachable" error + Correctly detect and handle overflow in mp_get_int64 + Split into mp_get_int64 and mp_get_uint64 + Only allocate and normalize for cp's that require it in MVM_string_chr, and short-circuit Unicode property test for codepoints below 0x300 + Provide a better error when failing to encode surrogates in UTF-8 + Add a cast to suppress a compiler warning in strings/ops.c + Factor out code from equal_at_ignore_case for use in index_ignore_case also + Use both hex and decimal for UTF8 encoding error messages + Add parentheses in various places to suppress compiler warnings + Use PRIu64 in fprintf's to fix compiler warning about incorrect types + Add a check that introspection->is_tty is not NULL, avoiding a crash + Mention debug_name in errors about uncomposed repr + Add new --coverage option for Configure.pl + First prototype of a per-line coverage reporter, enabled by setting MVM_COVERAGE_LOG + Cope with a native type with no nativesize, but signedness + Remove two functions in normalize.c that have been superseded + Give collapse_strands a 5.4% speed boost under some workloads + Add MVM_string_graphs_nocheck funct, use it in places we previously already checked + Have a two-part loop in collapse strands to make loop tighter when possible + Implement serialize/deserialize in VMHash REPR. + Use memmem in string index. Uses Knuth-Morris-Pratt on glibc, and adds the FreeBSD memmem.c for use on Windows + Fix a join NFG bug when there was an empty string and an empty seperator + Reorder MVMStaticFrameBody to save 16 bytes according to pahole; similarly save 16 bytes in MVMCompUnitBody, 24 bytes in MVMJitCode, 8 bytes in MVMIOSyncStreamData, SerializationRoot and SerializationReader + Remove arbitrary and small length range check for reading bytes from a file + Remove unused defines in threadcontext.h + Greatly reduce contention in the fixed-size allocator for multi-threaded programs, giving up to 40% speedup in some cases + Add continuous coverage analysis to Travis builds, along with other Travis improvements + Mark thread GC blocked when doing synchronous writes + Add missing MVMROOT when reading bytes, which could result in occasional data loss New in 2017.03 + Fix some missing variable initializations + Set effective_handlers in context-only frame + Streamline code in hash computation, hopefully fixing a Coverity warning + Detect and throw on over-size array + Put in a limit for codepoints in a grapheme, to avoid various overflows + Fix a missing NULL check at end of profiling + Panic when a new thread context can't create an uv_loop + Better handling of out of memory when creating a thread + Another attempt at silencing the pthread_yield warnings + Missing GC block marking in event loop starting, fixing a deadlock + Fix CArray marshalling of type objects + Provide a way to put Decoder in nl-translate mode + Ensure Decoder REPR never sees concurrent use + Debug option to detect concurrent VMArray use + Encode strings as UTF-8 in MVM_unicode_string_from_name + Reword exception message for read() outside original thread + Check that results of repeat/concat fit in an MVMString + Fix div_i JIT round to negative infinity + Ignore SIGPIPE by default + Only start readers if a process spawned OK + Remove deprecated char-mode async proc reading + Signal error to stdout/stderr on spawn failure + Do gen2 sweep before letting stolen threads go, fixing occasional SEGVs + Turn libtommath dependency into a submodule, use a MoarVM fork + Update libtommath fork to have expmod hang fix + Change MVM_string_equal_at_ignore_case to use fc + Fix MVM_string_equal_at_ignore_case when folding the haystack changes length + MVM_string_equal_at_ignore_case no longer applies a case changing operation to the entire haystack. It now only changes case for as much of the haystack length as is needed. ~30%+ or faster depending on on haystack length. + Mention debug name and REPR name in "requires obj with repr X" errors + Remove unneeded variable in MVM_string_index + Add MVM_string_index_ignore_case function and indexic_s op + A range of improvements to the MoarVM GDB plug-in New in 2017.02 + Fix format strings that warn during compile + Implement missing cleanup of async task handles, fixing a memory leak + Make Unicode sequence and codepoint name lookup case-insensitive + Add Unicode sequences from NamedSequences.txt in the Unicode database + Remove second declaration of MVM_frame_destroy + JIT MVM_radix() + Make radix and radix_I 50% faster with Unicode Nd + Add East_Asian_Width prop + Fix memory leaks in synchronous sockets + Fix crashes in socket connect error handling + Don't leak memory in STable repossession + Missing MVMROOT around a lock acquisition + Refuse to form an NFA with a zeroed to-state + Add data section for JIT code, and use it for extop 'fake' registers + Correct typo in NFG trie node struct name + Fix overflow in div_i op + Implement support for synthetic graphemes in MVM_unicode_string_compare + Implement configurable collation_mode for MVM_unicode_string_compare + Use LDFLAGS in ld invocations + On Windows, create UTF-8 encoded argv upon program entry + On Windows, populate environment hash from Unicode environment + Some additional heuristics to cut down on cross-thread write log output + Fix abs_n op for negative zeros + Sort out semantics of closed async sockets + Fix overflow on 32-bit systems in is_full_collection() + Rename MVMArray file and constant to VMArray + Remove bogus indication that MoarVM builds on `cygwin` + Use utf8 for unicode_db files + Fix invalid read when GC was triggered in the string repeat op + Don't call MVM_string_graphs twice in indexing op, plus cleanup New in 2017.01 + Extract spesh block allocator from spesh, for wider use + Add a number of missing MVMROOTs, which could lead to outdated pointers; also removed some unrequired MVMROOTs + Fix arg_flags allocation sizes + Remove an obsolete path from ldrpath + Check lexical accesses in GC debug mode 2 also + Add a #define to turn on inline logging + Fix callstack reset bug, which could corrupt deeply recursing callstacks + Don't allow re-compose of a P6opaque + Add a new unicmp_s op, which compares using the Unicode Collation Algorithm + Make sure we generate all values of the Line_Break property + Re-implement utf8-c8 encoding, fixing bugs and ensuring that non-NFC input will round-trip properly also + Implement Bidi_Mirroring_Glyph as an integer property + Implement Emoji grapheme breaking and other combined codes + Add support for Grapheme_Cluster_Break=Prepend from Unicode 9.0 + Make sure we break after Prepend if it's a control character + Add a script to download the latest version of all of the Unicode data + Missing rooting GC in rare exit handler case + Implement new setdispatcherfor op and add JIT for it + Use much faster atoi function in normalizer; 14% less CPU use when slurping a file in UTF-8 encoding + For Decompose_Type, use int lookup instead of str for better performance + Fix heap snapshot crash on eventloop thread + Use /usr/bin/env perl for ./Configure.pl + Don't break after ZWJ or for MALE SIGN and FEMALE SIGN + Take into account actual allocated size of I/O buffers in gen2 promotion statistics + Tweak full collection criteria in heap profiling + Free up spesh log slots after specialization, avoiding some leaks + Removed the getregref_ ops (unused by NQP or Perl 6) + Removed the continuationclone op (unused by Perl 6) + Enforce one-shot invocation of continuations + Greatly simplify handling of call frame working register lifetimes, leading to consistently shorter lifetimes, less memory pressure, and faster calling + Eliminate now-unused `tc` field in MVMFrame, saving a pointer per callframe + Simplify args cleanup functions + Reduce number of checks in call frame marking, making it faster + Implement getstrfromname op, to get named Unicode sequences + Fix GC in spesh triggered by managed mutex use + Fix data race in inlining extop fixup + Fix data race in callsite fixup during inlining + Fix data race in string fixup during inlining + Fix charname lookups of LINE FEED and CARRIAGE RETURN + Remove Unicode 1 names and add Unicode Name Aliases + Convert MVM_malloc+memset to MVM_calloc + Clean out ancient "remove after rebootstrap" line + Fix typo in MVM_CALLSTACK_REGIONS_SIZE's name + Fix missing cleanup of managed DecodeStream + Have DecodeStrem clean leftover char buffers + Fix a typo in decode stream destroy function New in 2016.12 + Decode Latin-1 and UTF-8 strings to 8-bit width when possible + Teach a few string functions to compress results into 8-bit storage + Fix for AIX's INFINITY not being a constant + Unlink libmoar before (re)installing it + Add configuration for AIX + Support Perl older than 5.10 for Configure.pl + Use "pkgconfig --libs libffi" additionally to --cflags + Fix powerpc detection on AIX (gcc) + Make multidim error messages say they are multidim + Add comment about where to find UNIDATA + Implement captureinnerlex op, for fixing QUIT/LAST phaser scoping in Perl 6 + Fix mis-sized free in the NFG trie that only showed up in 32-bit + Add GC debug helper to "find" a pointer in nurseries/gen2 bins + Make ASSERT_NOT_FROMSPACE check fromspaces of all threads + Fix missing MVMROOT around an allocation + Fix typo in nfg.h comment + Fix native callback and GC interaction when embedded + Add GC block management functions to the public API + Mark throwpayload* as :throwish in oplist + Optimize the check for negative bignums + Remove useless mp_neg calls + Fix premature free of UV socket handles + Fix premature handle free in async UDP sockets + Add a "check every register access" GC debug mode + Provide a #define to disable dynlex caching + Provide a #define for deopt logging + Invalidate dynlex caches during deopt + Fix pow_I when it takes an exponent larger than 2**32 + Only do MVM_ASSERT_NOT_FROMSPACE in GC debug mode + Add a fromspace assertion in finalize + Avoid a number of spesh GC invariant violations + Panic if we try to GC when speshing/JITing + Ensure we don't leak partially deserialized objects + Fix unrooted frame around SC object lookup + Remove some GC debug code + Avoid reading nativerefs in spesh, since it can cause boxing and thus GC + Cope with push being used on concurrent queues + MVMROOT around putting work on concurrent queue + MVMROOT eventloop queue when polling it + Do MVM_ASSIGN_REF after block/unblock in concurrent queue + Fix more unrooted frame around SC object lookup New in 2016.11 + Workaround tommath issue #56 which affects random bigint numbers > 32 bits + Fix memory leaks in nqp_nfa_run + Fix a sizeof arg that allocated a much-too-big buffer for callsite arg names + Add missing breaks in MVMString's copy_to + Prevent null deref when calling MVM_string_utf16_encode + Corrections to mkdir on Windows + Introduce MVM_SPESH_LIMIT, which limits how many specializations will be performed; this is useful for debugging which specialized block is to blame for a bug + Make sure we never box a NULL filename when creating backtraces + Fix the nativecall attribute error messages + Remove (non-existent) num16 from error message + Make the fixed size allocator provide useful information to Valgrind + Implement serialization of SCRef + Include file/line of unserializable closure, to aid debugging + Add type info when failing to bind an attribute + Use ffi_arg type for libffi nativecall return types + Handle libffi return type more correctly + Work around missing libatomic_ops prototype on s390x + Panic when trying to GC a locked mutex + Make VM panic output state that a panic occurred + Fix JIT code generation bug in nqp::exception + Add missing rooting of value pushed to concurrent queue + Add src/gc/debug.h dependency to Makefile + Mark a thread GC-blocked while it is in native code + Have "Cannot * a type object" also outputs the type's debug name + Don't reveal partially deserialized method cache + Give a bunch of exception ops REPR and debug name output + Prevent segfault when null string used as hash key + Request POSIX.1.c compliance on solaris + Change to use readdir insteal of readdir_r + Use GCC on solaris by default + give diagnostic output when compiling fails + Handle current Solaris compiler not understanding -mt + Fixed readdir so it won't check old errno + Work around clock_gettime issue on OSX + Refactor hashes to no longer need to flatten ropes in string keys + Save 8 (64-bit) or 4 (32-bit) bytes per entry in the MVMHash REPR + Remove the deprecated flattenropes op + Remove now-unused MVM_string_flatten function + Don't treat an nread of 0 in libuv read callbacks as an error + Bump to latest libatomic_ops New in 2016.10 + Fix build without libtommath source + Make MVM_file_open_fh() throw if the file we opened was a directory + Fix bug and memory leaks in MVM_file_open_fh() + Add error message for likely MacOS build failure + Don't set inheriting process on inherited pipe, fixing a segfault + Update to the Unicode 9 database + Die on CStruct without any fields + Constant-fold unipropcode and unipvalcode + Use PRId64 instead of %d for 64 bit int format string args + "Cannot unbox type object" error gets debugname and native type info + Fix uninitialized arg_names of an MVMCallsite + Handle C++ constructors on libffi + Fix CUnion get_attribute treating inlined attrs as pointers + Fix 32 bit issue with rw args in NativeCall callbacks + Use better throw-away type for void nativecalls + Gracefully handle a 0 RSS reported by the Linux kernel + Fix "Invalid free()" in empty repossessed arrays + Make sure we mean "signed char" when we say "char" + Fix calculating structure sizes for arm64 and others + Disable JIT on x32, since it has a different calling convention + Fix pointer size unit in configure message + Use set_uint64 in from_num, otherwise we overflow on x32 + Rewrite mkdir_p api, no function changes + Improve nativecall attribute error messages + Include debug_name in crossthreadwritelog and serialization errors + Deprecate async string I/O ops + Deprecate flattenropes op + Implement indexingoptimized op (replaces flattenropes, but is not in-place) + Fix memory leadk in ord_basechar_at + Ensure errno is grabbed before MVM_free is called + Make extra sure unlock only happens if lock happened New in 2016.09 + Do not crash when the container configuration can't be read + Correctly calculate the work_size when inlining between compilation units + Validate indices of param_ ops and require checkarity before param_* + Fix tautological comprison; snprintf returns an int, not a size_t + Fix tell for files that haven't been read from + Don't allow zero alignment in P6opaque storage spec + Index check lexicals when reading static flags + Add Decoder REPR and a number of ops that provide access to VM-backed streaming decoding + Don't segfault when serializing an uncomposed p6opaque + Don't read_int into a size_t which is unsigned + Never leak sym_name from nativecall_build + Fix a couple of potential leaks in heap snapshots + Kick arg_ and argconst_ ops from the correct basic block when inlining + Use HASH_FIND_CACHE instead of HASH_FIND in MVMHash + Correct wording of named arguments error + Bounds check for hints in get_attribute and bind_attribute + Use hints for is_attribute_initialized, and null-check repr_data + Clean up various unused variables + Mark thread GC blocked while accepting a socket to prevent deadlocks + Configure.pl now has an explicit use lib "." + Fix missing finalization queue cleanup at thread exit + Mark SC used in bytecode loading as claimed to avoid keeping them around for too long + Fix an error in multi caching of named arguments that could cause lookups to fail and the cache to keep growing New in 2016.08 + Don't crash in P6opaque on NULL name_to_index_mapping + Fix off-by-one in grapheme iterator + Block/unblock thread for GC on semaphore wait + Mark blocked around some more lock acquisitions + Fix various cases of out-dated pointer reads on concurrency control constructs + Hold uv_sem_t at a level of indirection, so it won't move in memory + Add a flag for PIPE_MERGED_OUT_ERR; fix stdio setup for merge + Fix EOF detection when reading files from /proc and similar + Fix lost socket listen errors + Implement async cancellation completion notifications + Add some missing fact dependencies in spesh, fixing some wrong guard eliminations + Avoid use of possibly-invalidated decont facts in spesh + Remove keep_caller from MVMFrame + Correctly NULL-terminate the buffer in MVM_vm_dump_file New in 2016.07 + Implement a new multi-dispatch cache, structured as a tree, able to hold more entries more memory-compactly, and able to cache dispatches involving named parameters + JIT read_fhs op + Implement elems REPR function for MVMContext + Implement a BB-splitting manipulation function in the optimizer + Fix sha1 op to work with null bytes + Fix bad interaction between profiling and dead allocation elimination; the presence of allocation logging would prevent the optimization, leading to misleading profiler output results New in 2016.06 + Serialize the HLL role field of STables + Avoid VMNull setup memcpy/loop in specialized frame initialization + Stop caching MVMContext on a frame + Use frames directly when serializing closures, rather than having to create an MVMContext wrapper for every one + Write SC index when deserializing, repossessing, and preparing to serialize, saving a huge amount of linear scanning + Only used cached SC index if SC itself matches + Remove an unrequired memset to clear the args buffer + Inline args preparation into interpreter, and JIT it directly instead of making a call to a tiny function + Mark getlexcaller as :noinline + Don't lose handlers during multi-level inlines + Eliminate loop in P6opaque's get_boxed_ref function, decreasing cost + Implement payload throw/handler support + Implement callerlex throwing mode + Make moar-gdb.py source-able, instead of only autoloadable + Fix inlining causing wrong lexical handler lookup + Make build in dir containing space work + Allow HLL handler for unhandled lexical exception + Add debug_name to "cannot iterate X with Y REPR" message + Give "this is not a X iterator" more info, too New in 2016.05 + Use MSVC-provided stdint.h and inttypes.h when possible + Improved various error messages to include the debug type name + Eliminate call frame reference counts, instead using a linear call stack for frames that never become heap-referenced and using the garbage collector to manage those that do + Tune number of gen2 sized bins + Improve error reporting in P6opaque's compose function + Improved GC debugging support to catch more problems + Fix a race between serialization context resolution and garbage collection + Add a missing MVMROOT in shell/spawn + Fix segfault when trying to serialize an uncomposed P6opaque type + Update the build system to autodetect system provided libs + Add missing rooting, since the instrumentation level barrier may allocate + Fix cleanup of temp roots at thread exit + Add missing rooting of exception message in `die` + Fix CUnion layout computation GC issues + Fix data race in clearing of "in inter-gen set" flag + Various improvements and fixes to the spesh_graph tool + Add missing optimization of decont_s and decont_u ops + Eliminate duplicate MVMContext creation code + Fix full cleanup crash: the NFG uses the FSA, so have to destroy NFG first + Close dynvar log filehandle in instance destroy + Clean up cross-thread write logging mutex + Free debug names in STables + Free the string_heap_fast_table in CompUnit bodies + Free permroot descriptions + Free thread's finalization queue in tc destruction + Add docs about MVMROOT + Fix crash when GCing an ended thread + Implement loadbytecodebuffer and loadbytecodefh ops + Speed up initialization of non-specialized frames + Use varints to make serialization of various integers more compact, reducing size of compiled output + Ensure we always produce at least one snapshot when heap profiling + Remove debug output when taking heap snapshots New in 2016.04 + Implement heap snapshots support, exposed through the profiling API + Don't mark tc->cur_frame twice during GC + Move thread object mark into thread root mark, removing a special case in the main collector + Add API for adding a permanent root together with a description + Mark thread blocked for GC when doing synchronous reads + Make MVM_bigint_from_num jit-friendly + JIT coerce_nI as a call to bigint_from_num + Set debug_name on a few more built-in types + Add REPR API for getting unmanaged size, implement it for many REPRs + Fix compile on FreeBSD 9 + Handle single-char build directory names by changing capture to lookahead + Fix performance of reading very long lines + Fix utf8-c8 decode crash caused by off-by-1 + Fix a full vs. partial collection detection bug + Factor unmanaged size into promoted bytes. + Enhance scheme for deciding when to do a full collect + Bail out if HLL name string index is invalid in bytecode unpack + Don't try to set flags beyond num_lexicals when reading in call frames + Adjust byte count when UTF-16 BOM marker consumed + Fix buffer overrun in utf8-c8 decoding + Initialize object registers with VMNull when allocating frames, to avoid a number of possible segfaults + Fix incorrect boolification of "" under mode MODE_UNBOX_STR_NOT_EMPTY_OR_ZERO + Utilize debug_name in nativecall error messages New in 2016.03 + Fix the build when not bundling libtommath + Updates to moar-gdb.py (MoarVM GDB plug-in) + Add serialize and deserialize to CPointer REPR + Don't do cross-HLL inlining + Fix missing call optimization/inlining of non-multis in some cases + Remove dangerous/broken usecapture optimization, fixing a big memory leak + Lazily decode the string heap, improving startup time and reducing memory + JIT the atposref_* ops + All the ref ops now properly set up facts in spesh + Fix dyncall on raspberrypi for calls > 4 params + Don't allocate a thread's second GC semi-space until needed + Don't keep an MVMStaticFrame array in MVMCompUnit, saving memory + Fix primary composite table generation, in turn fixing a SEGV + Measure slurpy param and param autoboxing allocations in the profiler + Implement native descriptor introspection for pipes + Further support for function pointers in native calling + Add debug_name field to STable struct and setdebugtypename, to allow easier debugging and analysis + Get directory listing in utf8-c8 encoding + Fix JIT compiler bug in string le/ge ops + Handle nonblocking stdout properly for --dump + Fix linelocs buffer overflow in bytecode dumping + Include type info of wval/wval_wide referenced objects in spesh log + Don't keep around barely-used bytecode maps, saving memory + Only allocate instrumentation state if needed, saving memory + Boost size of the multi-dispatch cache New in 2016.02 + Numerous fixes for places where --full-cleanup leaked + Free per-thread NFA evaluation memory and lexotic cache + Free SC root objects and dependencies array when freeing SC + Free arg_names when interning callsites + Free deserialization work index lists + Clean up decode stream separators on handles + Don't leak a replaced boolification spec + Fully clean up callsite re-use hash in assembler + Fix leak involving inlining handlers + Fix a couple of leaks when decoding strings + JITted calls to functions with MVMRegister argument don't want float calling conventions + Fix leak in type parameterization. + Don't create partly-initialized callsites in nativecall callback handlers + Check for NULL in exception payload and return VMNull in getexpayload + Fix bug for inlined structures in strutures in nativecall code + Fix structure size calculation when other structures are inlined + Plug memory leak when shelling out without capturing + Fix leak on out-of-bounds multi-dim access + Make sure unused continuation tags get freed New in 2016.01 + Assorted code cleanups (unreachable code, duplicated includes, etc.) + Various update to MacPorts portfile and instructions + Only optimize istrue to unbox_i when known concrete + Bump libuv to 1.8 + Add submodule sync before update in Configure.pl + Suggest build-essential if no gcc + Various fixes/updates to graph_spesh.p6 + Don't install sha1 and tinymt headers; they're only used internally + Only install msinttypes on MS platform + Fix a gc bug in string concatenation + Add subsecond file time ops stat_time and lstat_time + Fix stat CREATETIME return value + Note graphs_s will be deprecated; dupe of chars + Re-order ops in interp.c to match oplist + Add compile-time platform check for JIT support, to handle universal binaries New in 2015.12 + Allow the backlog arg for socket listening to be set + Resize buffers as needed when taking a UTF-16 substring + Context-captured frames should remember caller + Re-use MVM_frame_context_wrapper for ctx op, to reduce code duplication + Fix bug with dynvar lookups when we fall out of JITted code + Clean up callsites in comp unit objects + Clean up interned callsites on interpreter shutdown + Clean up memory allocated by FSA + Copy callsites when inlining + Cleanup Unicode property lookups on shutdown + When async streams are done, emit sequence number but no data + Force SC initialization to allocate in gen2, fixing a deadlock + Add a sanity check for gen2 allocation flag + Allow NativeRef to spesh assign_i and decont_i + Implement sp_deref_bind/get_i64/n in the JIT + Handle "is rw" pointers in native routines + Teach our guard op generator about NativeRef + Fix ordbaseat interaction with synthetics, and end of string semantics + make ordfirst and ordat consistent with ordbaseat + Add casts to resolve type warnings + Add UBSAN support to Configure.pl + Support native references to multi-dimensional indexes + Implement fileno_fh op + Implement async UDP sockets + Probe for _Bool, and expose bool/size_t to nativecall + Implement input newline translation, and translation on output on Win32 + Validate lexical types properly + Implement truncate/extend ops for sized natives + Init cd->arg_flags so callsites_equal wont complain + Avoid memcpy(x, NULL, 0) in spesh + Ops to introspect type bits/unsignedness + Disable unaligned reads under UBSAN + Align bytecode sections to 8 bytes + Dump "known to be RW container" flag to speshlog + Add missing unsigned operand types; clean up unsigned int ops + Add box unsigned to REPR boxing API + A handful of extra unsigned int related ops + Teach assembler about unsigneds + JIT captureposprimspec, sized getlexref_, captureposelems, capturehasnameds + JIT jit eof_fh, readline[chomp]_fh, replace, gethllsym, objprimbits, say_fhs + JIT typeparameters, typeparameterized, typeparameterat + Coercion between num and unsigned int + Support boxing unsigneds in P6int REPR. + Recognize unsigned extop operands + Cheating native ref ops for unsigneds + Somewhat cheating unsigned parameter ops. + Kick out remaining unused arg_*/argconst_* ops after inlining + Fix bug that made Win32 throw on deleting nonexistent files New in 2015.11 + Fix const warnings about pointers to Unicode case table + Elide a few key-values from profiler data for default values + All Latin-1 controls are normalization terminators + NFG now uses Unicode Grapheme Cluster algorithm; "\r\n" is now one grapheme + Fix a canonical composition bug + Fix SEGV on nqp::chars on a null string. + Support multiple line separators on I/O handles + Support multi-grapheme line separators on I/O handles + Include \r\n synthetic in default line separators + Serialization writes string offsets as 2 bytes if possible + Used varints in a few more places in the serialization format + Serialize the STable mode flags in a single byte + Serialize the STABLE boolification_spec mode in 1 byte + Serialize the container and invocation spec flag bits with the bool spec + Implement readlinechomp_fh op, for reading lines without line ending + Fix moar build on DragonFly BSD + Fix join NFG bug when separator is empty + Improve normalizer performance on paths needing canonical combining class + Boost number of fixed size allocation bins, to handle more allocations + Fix encoding/decoding \r\n grapheme in all encodings + Make radix ops not blow up over synthetics + Fix normalizer to never re-normalize what was already considered + Encoders now throw exceptions on unencodeable characters by default + Allow specifying a replacement string for unencodeable characters + New UTF-8 Clean-8bit encoding for strings we exchange with the OS + Make escape handle \r\n properly + Handle files where stat falseley reports 0 bytes size + Provide a way for NFA to be given synthetics, not just codepoints + Teach NFA about ignoremark charrange case + Make MVMMultiCache container aware, including spesh/JIT gurd updates + isrwcont can now be jit-compiled + We can spesh isrwcont into a const now + Document ASAN_OPTIONS + Fix possible SEGV in getlex and bindlex when walking scopes + Release mutex in MVM_load_bytecode on exception + Allow named flattening args to show up amongst named args in callsites + Make later named args that are flattened in override earlier ones + Override setjmp to two-argument version on mingw64 + fix a callsite memory leak + Fix ordfist/ordat JIT + JIT bigint ops or, and, xor, brshift, blshift and bnot + JIT hintfor op + Fix native call struct size calculation bug + Implement istty_fh op New in 2015.10 + Profiling: fix data collection when exiting + Profiling: improve timing calculation + NFG: Strip BOM from UTF-8 + NFG: Implement casefolding + NFG: handle SpecialCasing + JIT: fix devirtualized REPR ops; devirt more ops + JIT: improve logging + Misc: Improve handling of state when spawning child processes + Code: Throw better exceptions in several cases + Code: linting, consting, avoid segfaults, etc. New in 2015.09 + Fix write to null handle on async socket + Add C++ support to native calling functionality + Make thread join force a GC run, preventing start/join loops eating memory + Remove more config and generated files in distclean target + Add MVM_CROSS_THREAD_WRITE_LOG to usage message + Try to get PC on valid instruction for cross thread write logging + JIT continuationreset and continuationcontrol + JIT string comparison ops + Don't devirtualize push_n or unshift_n for now + Async sockets: handle close,close and close,write + Differeniate when nativecasting to intN/uintN + Fix data race in frame reference count handling + Make findcclass and findnotcclass return one past end of string on non-match + Fix buffer overrun in assembler for labelled exception handlers + Free STables in a safer place, fixing a parallel finalization data race + Fix alignment of inlined structs/unions New in 2015.08 + Removed multiple internal data races + Add ctxcode op to get the code object of a context + Inlining in spesh will now check post-optimization size of code + Use a binary search in unicode block lookup + Unicode database file now compilable with newer MSVC + Lots of fixes for problems reported by linter software + Support for parsing Unicode numbers + Some potential segfaults fixed + New control exceptions "await", "emit" and "done" + Trying to unbox a bigint larger than 64 bit now throws + Fix "merge facts at phi" opt in spesh forgetting the first argument + Many memory leaks fixed + Properly close stdin handle when an async process dies + Async processes now have a "ready" callback + Sleep API now split into sleep and nanosleep New in 2015.07 + Support for multi-dimensional arrays + Improved support for pipes + Updated to Unicode 8 + Die when we try to accept() or read() outside an originating thread (used to silently not work) + Instrumentation for findings writes without locks to objects originating from another thread + The profiler will now also show natively called functions + Support for libffi as an alternative to dyncall + exists_pos is no longer part of the REPR API + Accessing an object's HOW is now part of the API + libuv will now autoquote cmdline arguments on windows + Fixed some code object related ops that could segfault + New openpipe implementation that allows to read from and write to stdin/stdout/stderr + spesh will now track facts across BB nodes even through PHI + Fixed numerous memory leaks when C strings were included in exceptions + Implemented "free at next safepoint" mechanism for safely freeing memory from internal data structures in a threaded context, thus fixing NFG table growth in multi-threaded applications + Fix compile on FreeBSD 8.4 and probably earlier by detecting gcc + Fixes for build repeatability + Optimization of can op fixed and fully enabled + Fix async process handle closing + Numerous warning cleanups for various compilers New in 2015.06 + No longer use up a full core in some async situations. + Errors from nativecall include dlerror() output for clarity. + More verbose and aligned output in MVM_SPESH_LOG. + Several ops added to the jit. + Throwing and resuming ops for exceptions supported in the jit. + More places now go through the Int cache. + Support for str attributes in CUnion and CStruct. + Non-characters now correctly considered valid for UTF-8 encoding. + Fix exception handler resolution bug. + Introduced MVM_SPESH_NODELAY to set spesh thresholds very low. + Support for building with gmake and gcc on windows. + Support for GNU/kFreeBSD. New in 2015.05 + Add missing C prototype for MVM_string_windows1252_decodestream + Fix uniname out of range error reporting. + Fix SSA crash when huge number of basic blocks. + Implement normalization buffer grwoth handling. + Add missing frees on invalid UTF-8 decoding. + Integrate NFG with UTF-16 non-stream decode. + Remove linenoise/readline + Give a decode stream a normalizer. + Further integrate normalizer with decode stream. + Fix chr for our brave new NFG world. + Update macportfile to 2015.04 release + Make \n a "normalization terminator". + Ensure concatenation is closed under NFG. + Don't leak synthetics from ord. + Integrate NFG with UTF-8 non-stream decode. + Implement NFG for decode stream case of UTF-8. + Fix use-after-free in open file error reporting. + Display exactly what thread ID was passed. + Release allocated resources before returning + Free resources for **pieces before returning + Release 'signature' before returning from unmarshal_callback() + Free leaked resource `buffer` before returning + Remove fragile assumption about buffer size. + Fix UTF-8 encoder to handle NFG. + More robust NULL string checking. + Ensure we get NULL-terminated strings if needed. + Bytecode file stores Latin-1 when possible. + Optimize temporary root handling. + Cache and mark the backend config hash. + Dual-purpose comp unit string heap as SC one. + Re-order bytecode read struct to be smaller. + Don't repeatedly calculate limit in bytecode read. + Toss some bits of ut_hash we don't use. + Toss hash bloom test bits we don't use. + Optimize at level 3 by default. + Toss even more hash bits we don't use. + Re-implement MVMIter on hashes using buckets. + Toss HASH_FSCK addition order check. + Use a simpler "deleting the last item" check. + Eliminate double-linked-list in hashes. + Fix use-after-free if hash iter block frees nodes. + Be consistent with paren-ing in macro. + Eliminate a single-use macro. + Correct head replacement logic. + Re-implement simple say/print using MoarVM I/O. + Thread ID handling cleanup. + Fix an ABA bug in the fixed size allocator. + At least do a spinlock rather than a mutex. + Factor out code to avoid a "magic value" all over. + Concurrency control on multi-cache additions. + Show line numbers for deopt annotations + Give every BB in the spesh log a line number + Devirtualize bindkey and bindpos ops + Implement MVM_op_elems for devirtualization + Implement getattr_* and getattrs_* devirtualization + Implement pop_* and shift_* for devirt + Implement bindattr and bindattrs ops for devirt + Fix a control flow thinko for logging + When failing from consume_reprop, do it loudly + No longer bail from many unhandled repr ops + Devirtualize setelemspos, existspos and existskey + Implement ordbaseat and eqatim_s ops for ignoremark + Silence warnings about pointer type mismatch + Increase stack space for call arguments. + More compact jit for add, sub, bor, band and bxor + Add lib install dir to rpath + Display "Inlined" flag in the spesh log + Add a missing barrier in multi-dispatch cache + Tweak error reporting of wrong outer frame + Include cuuid of invokee in error message. + Remove the frame pool + Spesh dump shows little words for fact flags + Spesh dump coderefs as filename + line number and "(closure)" + Handle LTM for ignorecase+ignoremark + Fix ref-count management of deserialized contexts. + Provide a "never repossess this" mechanism. + Fix a GC marking bug in parametric type setup. + Implement exception object creation from category. + Emit add, sub, bor, band, bxor with constant if possible + Kill duplicate getspeshslot ins for the same register + Formally bump minimum bytecode version to 5 + JIT - check if constant value fits in 32 bit + Fix format type error in JIT logging + Add MVM_oops() function to panic with backtrace, used in spesh and JIT + Add op for disclaiming all objects of an serialization context (SC) + Check that owning object wasn't disclaimed by an SC. + Add support for CUnion repr to use with NativeCall + Add support for inlined CStructs and CUnions New in 2015.04 + Re-enabled lazy deserialization, decreasing Rakudo startup time and memory + Fix a possible buffer-overrun in MVMArray's existspos + Fix for ARMv5 + Configure: add an option --ar + Mark existspos op as pure to allow better optimization + Tweak dynamic optimization and OSR thresholds to tune startup performance + Implement bounded serialization of parameterized types + Include file names in some deserialization errors + Clean up some unused functions and variables + Add __attribute__((format())) where appropriate + Correct some format strings + Allow nativecast from VMArray e.g. Blob/Buf + Output callsites in spesh log + Implement unsigned int types for native calls + Upgrade Unicode DB to Unicode 7.0 + Include module that asked for stale dependency in error message + Handle 'is rw' params in native calls + Make some hot functions at startup time as always being inlined + Fix exception message when utf8 string is invalid from the start + Implement NFC/NFD/NFKC/NFKD Unicode normalization algorithms + Add op to normalize buffers of codepoints + Remove unused Unicode database script + Support cross-compiling with computed goto + Refactor pthread_yield detection + Add op "getcodelocation"; gets file and line of a MVMCode + Tweak istrue_s; every non-empty string is true now + Bump minimum serialization format version; remove code for old versions + Implement a more efficient varint serialization format + Remove the vestigial serialized 0 that used to be v-table length + Re-order struct MVMCollectable to slightly reduce L1 cache misses + Store the serialized reference type discriminator in 1 byte, not 2 + Add missing IS_CONCRETE checks in serialization + Make unbox int/num/str functions test IS_CONCRETE always + Fix conflict with splice from bits/fcntl-linux.h + Fix missing frees of bytecode annotations + Serialize object headers more compactly + Serialize object references more compactly + Split codepoint iterator from grapheme iterator + Implement grapheme normalization algorithm (aka. "NFG") + Implement encoding of grapheme-level strings to bytes + Implement retrieving codepoints in different normal forms from NFG strings + Fake POSIX exit codes consequently on windows + Remove extra call to uv_run when closing a pipe + Loop over waitpid to get correct exit code for closed pipe + Basic implementation of case change with NFG + Make character class check on NFG synthetic uses base codepoint + Make Unicode property checks on NFG synthetics use base codepoint New in 2015.03 + Add a macports Portfile + Implement nativecallsizeof op + Rewrite MVM_file_copy so it handles files larger than 2GB + Mostly quiet MSVC warnings when compiling the JIT emitter + Chase libuv thread ID API change, and fix thread ID lookup on Windows + Teach profiler about native ref taking ops + Fix allocating an empty (no members) CStruct + JIT compilation for native reference related operations + Implement native register references + Support references to sized int and num lexicals + Fix missing GC rooting of callback object arguments + Fix big endian bug in if/unless optimization + Simplify known value handling in the optimizer + Make graph_spesh.p6 also show the dominance tree + Fix bugs in string_index_from_end + Bump dyncall revision + Fix big endian bug in the P6bigint REPR + Fix system detection in triple for cross compilation + Stop fiddling with slashes in openpipe on Windows + Make index('foo','') return 0, and handle null needle when start > 0 + Type specialization for the bindattrs_s op + Optimize out many set instructions + Add helper functions so embedders won't need to poke into MVMInstance so much + Use CFLAGS, CPPFLAGS, and LDFLAGS from the environment, if set + Re-use allocated PHI node descriptors, to reduce allocations during optimization + Improve optimizer memory allocation block scheme to decrease waste + Allow STable changes in repossessed objects + Fix JIT of bindpos_n + Fix bogus pointer casts and libc name clashes to fix MinGW build + Fix a bug in iter optimization + Better armv6 and v7 detection New in 2015.02 * Fix memory leak in P6bigint * -O2 is now the default optimization level in clang/GCC * Improve performance of SSA form calculation * Dyncall dependency is now at version 0.9 * Better error messages in NativeCall * CArrays are now zero-filled by default * MVMArrays can now be casted and passed to native functions * Addition of readlink and lstat ops, and general symlink compatibility * libuv dependency is now at version 1.0.0 * P6int and P6num can now be "C sized" * Implemented native references to lexicals, attributes, and array elements * Added native_ref container specification * Added iscont_[ins] and decont_[ins] ops * Make multi-dispatch cache aware of native containers * Mixin prefix test in P6opaque now disregards attribute-free parents * Fix buffer overflow when trying to inline calls with many args * Handle argconst_[ins] instructions in inlining * Fix a crash from trying to unbox type objects passed to native args * Decrement usage counts in some optimizations, killing more dead code New in 2015.01 * Decrement usage of class type for setattr ops, enabling wval elimination * Add missing concreteness checks in concurrency ops * First operand of sp_guard* is r(obj) not int16 * Make ReentrantMutex not prevent serialization * Fix various ops that could return real NULL pointers and cause SEGVs * Spesh gethow (can be spesh slot lookup) * Start documenting the parametric 6model design * Implement parametric 6model ops * Avoid calling MVM_callsite_get_common twice in many situations * Use labs instead of abs to avoid truncation on 64-bit values * Fix signed/unsigned warnings in bytecode handling * Big signed/unsigned cleanup in string/buffer handling * Fix leak when join returns early * Fix missing free in args spesh * Tweak fixed size alloc configuration for a small memory saving * Improve missing SC code ref error reporting * Start integrating 6model parametrics with serialization * Don't delete BBs with handler annotations * Handle assigning Str to a CArray[Str] slot (to assign NULL) * Simplify and optimize varint serialization/deserialization New in 2014.12 + Various warnings produced by clang fixed + Fixed ceil_n and floor_n to return n64, not i64 + Pass -faddress-sanitizer when --asan is set + Eliminate various unneeded set instructions + Properly update successors for non-passed optional parameters + Optimize can operations + When bindlex fails, we should report "bindlex", not "getlex" + Mark takeclosure as an popular allocating op in the profiler + Expose callsite interning for extops + JIT randscale_n + Dump lexical names when dumping spesh graph + Only look at MVM_NFA_DEB environment variable once, not every NFA run + Implement longest literal tie-breaker in NFA + JIT cmp_i + JIT isnanorinf + JIT cmp_n + Handle sometimes-allocating ops in the profiler + JIT invokewithcapture + Count allocs in spesh'd/jitted frames separately in profiler + Turn a bunch of can_s ops into can ops instead. + Give graph_spesh.p6 a little introduction text + Avoid a pointer getting outdated on the stack in environment access + Replace quicksort with insertion sort in NFA fate sorting + Fix MVMROOT of a non-collectable in state variable handling + Detect useless SUBRULE edges in NFA, and trap epsilons to 0 + Mark callback Str parameters as not to be freed + Record size of gen2_roots list after each GC when profiling + Do not call srand() if not using rand() + Don't use filename to determine EOFness + Allow passing of length = -1 to MVM_string_utf16_encode_substr + Don't resolve symlinks by hand + Avoid some duplicate work in inter-gen root processing + Fix a use-after-free in openpipe, which occurred quite often on OSX + Don't include PHIs when rendering spesh graph diagrams New in 2014.11 + JIT multicacheadd, multicachefind, radix_I, bindpos_n, bindpos_s, escape, blshift_i, brshift_i, write_fhs, cmp_I + Optimize out a bunch of unnecessary "set" instructions + Turn a bunch of const_s + findmeth_s into cheaper findmeth + Implement nqp::closefh_i which retuns the exit code of a pipe + Allow nativecasting a CStruct to another CStruct + Fix temp register usage in optimize_istrue_isfalse + Fix a regression by eagerly deserializing stables/objects + Added tool to colorize registers in spesh logs and another to turn spesh logs into a data-flow and control-flow graph. + Let update_ops.p6 also write a perl6 module with ops data + Add --bindir, --libdir and --mastdir as Configure options + Create pkgconfig file as pkgconfig/moar.pc New in 2014.10 + Added op nativecallglobal + Update DynASM + [Configure] document --asan option, Implement --has-linenoise, --has-dyncall and --has-dynasm + Build and install libatomic_ops conditionally + Improve usage, include environment variables. + Document bytecode directory environment flag + Add beginnings of a manual page in docs/moar.pod + Don't mark inlined locals for logging frames. + Fix crash upon trying to clone a type object. + Fix concreteness test for the reprconv + Fix handling of command line args on Win32 + Build with jit by default, add --no-jit option + Prettify --enable-jit obsoletion notice + JIT savecapture, usecapture, getobjsc, sin, cos, tan, asin, acos, atan. atan2_n, time_n, pow_n and sqrt_n, nativecallinvoke and numeric negation + Added MVM_calloc function + Make "cannot invoke" errors consistent. + Improve err msg about oob in io_read_bytes + Optimize out non-interned static callsites + Attempt interning the callsites we use in nativecall callbacks + Implement set_separator for syncfiles + Panic if MVM_platform_alloc_pages failed on posix system New in 2014.09 + Add an instrumenting profiler, recording profiling information at routine level and tracking use of specialized/JITted code and inlinings + Support profiling allocations and GC runs + Use arc4random on platforms that support it + Fix numerous warnings + JIT more big integer ops: div_I, div_In, mod_I, gcd_I, coerce_In, and bool_I + Specialization and JIT-compilation of various iteration-related instructions + JIT curcode and getcodeobj + Include filename in spesh log + Fix negative division in JIT + Mark getlexouter as not inlinable + Add mechanism for objects to get a persistent ID, used in Perl 6's .WHICH + Fix regression on PowerPC + Add missing SC write barrier to MVM_repr_bind_attr_* + JIT getattrs_* and bindattrs_* ops + JIT more string operations: indexat, findcclass, and findnotcclass + Add JIT logging of inlines + Cleanly panic if allocation fails, rather than crashing + Fix the build on ARM 32 + gcc 4.8.2 + Better style on arg count errors + Avoid unaligned reads on ARMv7 + Conditionally set include dirs and install rules (e.g. --has-libuv) + Add type finalizer support to the GC + Update libuv from 0.11.18 to 0.11.29 + Base full collections off promotion rate, often reducing full collections + Add force_gc instruction + Set up travis continuous integration + Fix mis-use of libuv: we are not supposed to open a child's pipe to our stdin + Fix pointer to pointer native cast + conditionally use/install our libtommath headers + Don't try to serialize file handles New in 2014.08 + Add support for JIT compilation on x64 (when configured with --enable-jit); supports basic arithmetic and logical operations, branching, method finding, invocation with argument passing, basic parameter handling, boxing/unboxing, attribute access, array and hash access, some big integer operations, some string operations, type checks, and more. Integrated with deoptimization, OSR (On Stack Replacement), extension ops, and exception handling. + Specialize various cases of istrue/isfalse to remove some indirections + Add charrange handling to the NFA evaluator + Update Unicode database generation script with latest string API + Add char name lookup aliases (LF, FF, CR and NEL) as line separators + Update moar-gdb.py for new structure of MVMString + Add Configure support for ASAN + Fix multi cache bug for no positionals, some nameds case + Make spesh dump show numeric literals and lexicals properly + Assorted OSR fixes for frames that deoptimized, then hit OSR points + Fix a number of SSA/dominance memory leaks + Fix memory leak in inlining + Make dead code elimination not cause unrequired guards to be kept + Add an API for extops to be involved in fact discovery and specialization + Add type and no-container facts for bigint ops + Support inlining of frames with handlers + Enable inlining of lexotic (return) handlers + Allow addition of temporary registers when specializing + Specialize boxing and unboxing of args, both named and positional + Avoid repeatedly allocating memory for NFAs + Cache frame index in MAST assembly, to avoid a linear scan + Fix various dynamic variable and inlining interaction bugs + Add a dynamic variable lookup cache + Devirtualize serialization read/write functions + Make full frame deserialization lazy, reducing memory and startup time + Handle static lexical values far more efficiently + Identify MAST nodes in assembler by exact type, cheapening assembly + Specialize smart stringify/numify into simpler ops in some cases + MAST::Label works on identify now, not name matching + Make "allocate in gen2" mode reentrant + Support lazy deserialization of static lexical values, method caches, and meta-objects + Remove some unused fields from STable + Optimize some simple control exceptions into gotos + Don't redo dead instruction elim on inlinees + Make sure inlined args are always marked as used, fixing a bug + Add an int -> str cache for 0..^64 + Add asynchronous process spawning, I/O, and killing + Check dll cache before searching through libpath, saving many stats + Make a better guess at MAST assembly output buffer sizes + Add a mechanism for debugging strand issues + Fix bug in string repeat of an already repeated strand + Complain properly about missing late-bound methods + Clear special return data more eagerly, fixing a double-free + Refactor get_storage_spec + Fix P6bigint unbox portability bug New in 2014.07 + Make default file mode 0666 + Auto-detect computed goto support and enable it when available + Implement On Stack Replacement for hot loops + Fix and enable isconcrete optimization + Use const_i64_16 in spesh-produced code for more compact output + Fix bug where [work|env]_alloc were not cleared, leading to mis-frees + Support inlining frames that use with extops + Add missing decl in header to quiet warnings + Fix logical bug in fixed-size-allocator + Fix capturelex race condition + Add missing MVMROOT in ConditionVariable setup + Don't share cached Lexotics over threads + Re-order code to avoid race on event loop startup + Add a bunch of missing MVMROOTing in asyncsocket + Make exit get out quickly + Close async sockets on event loop thread to avoid corruption + Make --no-optimize and --no-debug work in Configure + Implement (de)serializing of Array[uint] + Specialize getlexperinvtype_o (enables better roles optimization) + Allow pointer math using CPointer repr + Fix typo in CArray.elems error message + Add a cast to get rid of a warning in nativecall.c + Fix merging of inline table entries + Eliminate unused guard instructions at end of specialization + Update uthash to latest version + Correct computation of lexical vivifications + Add nativecallcast operation + Fix use-after-free bug with thread entry callsite + Cope with cross-deopt-point usage analysis + Give ContainerSpec a spesh function, use it for decont + Make various spesh things available publicly, for VM extensions + Significantly overhaul the strings code, fixing many performance issues + Optimize find_cclass and find_not_cclass New in 2014.06 + Correct closure semantics of native callbacks + Add ops for 2-possibility named parameter handling. + Start storing named argument names in callsite objects + Start interning callsites with named arguments + Specializer can turn named arg resolution to indexed lookups + Specializer can optimize named args + Specializer adds facts and guards for named args + Implement cancelling listening on a socket + Implement async bytes reads from sockets + Optimize invocation by pre-selecting callee spesh cand if possible + Pick a spesh threshold by bytecode size rather than a constant + Mark ops that are not suitable for inlining + Add an operand type for spesh slots + Implement basic inlining + Implement deoptimization of inlined calls, which uninlines + Make interp trace output more useful; include op + Have invoke/return end a basic block + Add a thread-safe fixed-size allocator + Use fixed-size allocator for frames/work/env. + Use fixed-size allocator for hash entries + Use fixed-size allocator for named used flags. + Don't refuse to spesh if we've a slurpy positional + Can do coerce_in of literals at spesh-time + Fix spesh frame handler end annotation motion in instruction deletion + Fix spesh fact marking bug New in 2014.05 + Add a libuv-managed event loop thread + Implement timers + Implement nqp::signal; support various signals + Add async read/write sections to IO op table + Implement async socket listen/connect + Implement async read/write ops + Implement chars case of async socket reads + Fix HLL mapping of type objects + Implement file watchers + Add infrastructure for cancellation + Implement cancellation of timers + stat the target of a symlink when we query for filesize + Dump deopt instruction spesh annotations + stat file descriptor in eof() when filename is unset + Serialize CStruct repr_data + Add MVMNull REPR and a singleton VMNull instance + Teach various parts of the VM about VMNull + Lazily allocate lexical containers + Optimize frame allocation + Remove BOM-discarding code from MVM_string_utf8_decode() + MVM_string_utf8_decode() should take a MVMuint8 *, not a char * + P6opaque now handles C structure member alignment, just like CStruct does + Steal P5's unlink magic for Windows; clear readonly flag when needed + Add lexical lookup lifetime hinting ops + Re-organize spesh to have log/specialize phases + Use spesh logging to emit guards into code + getlexstatic_o optimization in spesh + Better error on handler fixup failure in spesh + Implement op execname, which stores the path of the runner + Implement all vs. one deopt + Fix moving of handler annotations + Basic dumping of facts in spesh + Cope with annotations being moved to a phi + Make sure we don't clobber block handler setting in spesh + Iterate to fixed point when finding unused instructions, giving better results + Pre-invalidate all deopt target addresses, to catch fixup failures + Optimize simple calls and multi-dispatch at spesh time if possible + Add Makefile rules to generate pre-processed source + Add Makefile rules to generate assembler + Support for ARMv6. Don't try to read unaligned doubles or long longs + Ensure that MVMCompUnit can correctly free data_start + MVMStaticFrame now supports bytecode pointing to a private malloc()ed copy. + Do proper endian correction on bytecode + Add Ops for 32/16 bit 64 int literals + isnonnull op for use in spesh + turn islist/... into either isnonnull or a literal 0. + Teach spesh_diff.p6 about the new output of spesh dump + Teach spesh_diff.p6 about Facts + improve run time performance of spesh_diff.p6 + Avoid using an uninitialized variable. + Harvest strings in facts discovery process + Specialise can and can_s ops into const_i64 when possible + Change the way we store SCs in object headers to allow faster lookups of indexes + Fix bigint bitops + Ensure spesh_alloc aligns on platforms needing it + Include SC identifiers in bytecode dump + Make dump_backtrace more widely available. + Merge the bodies of MVM_sc_get_{obj,stable}_sc and *_set_* + Change serialization context indexes to be unsigned. Use ~0 as a sentinel. + Add inline functions to wrap accesses to sc.sc_idx and sc.idx + Add struct MVMSerializationIndex to hold large STable indexes + Free any allocated MVMSerializationIndex structs + Add a probe to determine the pointer size + Conditionally compile the MVMSerializationIndex for 32 bit platforms only + Allocate a MVMSerializationIndex if sc_idx would overflow in the union + Specialize getattr_[ins] on P6opaque + Fix bigint upgrade check + Optimize object attribute accesses in spesh + Spesh indirect form of attr ops with known names + Rakudo Bug #121273 fixed - losing a 0 from end of exponent + Re-arrange various structures for memory saving + Add handler infrastructure for supporting labeled loop exceptions New in 2014.04 + Brought thread ops in line with nqp:: op API + No longer inherit caller chain when starting a new thread + Fix a range of parallel garbage collection bugs + Block/unblock threads for GC while sleeping + Implement reentrant mutexes + Implemented semaphores + Implemented concurrent blocking queue support + Implement condition variables + Main thread has ID 1 now + Move nursery corruption check to after inter-thread work passing + Fix a gen2roots compaction optimization bug + Add flag '--has-sha' option to Configure to use a system SHA-1 library + GC orchestration cleanups and extra logging + Compact the gen2 overflows list + Fix decodestream_bytes_to_buf eating too much data + Added some missing MVMROOTs on config setup + Removed duplicate gen2 root cleanup call + Small cleanups to serialization + Avoid an extra level of function call in various REPR allocate functions + Add locking for IO handles + Add the Configure flags '--has-libuv and '--has-libatomic_ops' + Shortcut shr when we have a small lhs but rhs is >= 32 + Add logic to turn bytecode into SSA form, and from SSA back to bytecode + Added infrastructure for "spesh ops", to use in type-specialized bytecode + Start interning positional callsites + Keep a rough call count per static frame + Add bytecdoe specialization infrastructure + Optimize simple positional arg fetch in specialized bytecode + Resolve methods at specialization time when type is known + Add a monomorphic method cache + If MVM_SPESH_LOG is in env, log spesh work to it + Turn known-unrequired decont into set + Make MVM_SPESH_DISABLE env var disable spesh + Add :pure annotations to side-effect-free ops; eliminate dead code + Add a tool for splitting and diffing spesh log output + Add setmultispec mechanism for optimizing away only-star proto + Optimize optional positoin arguments in bytecode specialization + Optimize out istype for a spesh-time-known value or type + Optimize if_i and unless_i for known values + Corrected atan2 op signature. + Implement de-optimization on mixins + Don't lose HLL owner during serialization + Optimize away hllize when possible + Optimize away assertparamcheck when possible + Infrastructure to allow REPRs to participate in spesh + Optimize object creation in common cases with known types + Small fixes to MVM_string_(latin1|windows1252)_encode_substr + Optimize bindattr_o on P6opaque when possible. + Change the way lexotic is handled to avoid the need for allocation + Specialize empty named slurpy args. + Add a way to flag a frame as a "thunk". + Add ctx[outer|caller]skipthunks ops. + Make backtrace generation ignore thunks. + When readline/linenoise see EOF, mark handle EOF + Set hint for invokespec and multispec, improving invocation performance + Improve the VM exit strategy, so non-app-lifetime threads are waited on + Correctly handle temp roots stack in callbacks + add sched_yield for NetBSD + Fix callsite size calculation in tweak_cs + Fix buffer overflow in UTF-16 encoding + Trigger repossession on OP(push_*) + Fake up a final entry off the end of Unicode, fixing some lookup bugs New in 2014.03 + Implement a fast-path for string strand flattening + Fix character lookup by name sometimes giving wrong result + Control and printable now know about Latin-1 control characters + Fix bug in Latin-1 handling + Fix and optimize various character property lookups + Implement lookup of non-boolean Unicode properties + Implement character code to name lookup + Implement lookup of enum/stringy Unicode properties + Fix memory leak of active handlers in continuations + Clear up gen2 memory at exit + Clear up frame pool at exit + Don't leak static frame instruction offsets + Fix memory leak in MVMHash + Simplified/optimized frame reference count handling in continuations + Fixed missing exception resume reference count decrement + Correct "on stack" continuation reference count handling + Add missing cleanup in MAST assembler + Fixed used named args tracking memory leak + Fixed SEGV in eof of non-file-based filehandle + Pass STDIN to subprocess in shell() + Fixed resolution of IPv6 host names + Implemented native calling + Implemented CPointer representation + Implemented CArray representation + Implemented CStruct representation + Improve GDB plug-in string usage analysis + Make GDB plug-in aware of gen2 overflows + Clean-up and optimization of many REPR allocate functions + Fixed over-eager / to \ conversion in nqp::shell on Windows + Implemented native callbacks + Correct copy size of args buffer, avoiding reading unmapped memory + Updated to new liblinenoise and re-instated usage of it + Bump dyncall to latest version + Add --has-libtommath option to Configure for using system libtommath New in 2014.02 + Increased precision of num => str coercion + Mechanism for per-HLL handling of method resolution errors + Gave can the same null-check semantics as findmethod + Fixed various "not found" lexical lookup semantics + Use a more efficient encoding for integers in the serialization blob + Implemented reposession conflict resolution handling for objects + Optimized GC worklist processing to avoid unrequired barriers + Added a GDB plugin to help analyse VM data structures, heap use, etc. + Zeroed memory in a few places, to avoid reading junk and quiet Valgrind + Simplified and fixed UTF-16 encoding + Implemented unsigned native integer array support + Added various missing write barriers on STables + Added openpipe functionality, to support qx/qqx in Perl 6 + Corrected accidental and potentially explosive use of REPR(...) on STables + Switched to using flag bits to mark liveness in GC + GC forwarder pointer used in nursery now overwrites existing object body, saving 4 or 8 bytes on every collectable object + Added various GC sanity checking asserts to aid debugging + Encapsulated all serialization context accesses + Defined NDEBUG in optimized builds + P6bigint no longer uses libtommath for integers fitting within 32 bits + Optimized serialization of P6bigints fitting within 32 bits + Implemented link and symlink + Fixed mod_n op's behavior on negatives + Implemented floating point fallback case of the pow_I op + Fixed srand op to also control rand_I + Initialize the random seed at startup + Properly clean up active handlers that we unwind over + Radix parsing now returns an array of integers, not floating point + Huge refactor of I/O, fixing many bugs and leading to cleaner code + Proper handling of characters split over byte buffer boundaries in I/O + Corrected Latin-1 to be Latin-1, and added Windows-1252 encoding + Added a constant cache for boxing integers 0 through 15 + Properly implemented synchronous client and server TCP socket support + Better estimate and perhaps shrink string memory for UTF-8 decode + Added probing to Configure to learn how the compiler does 'static inline' + Switched many macros over to static inline functions New in 2014.01 The first official MoarVM release! Capable of running the 2014.01 release of Rakudo Perl 6, the first one with MoarVM support. (No change log for this initial release, since it's basically "all the things".) MoarVM-2018.03/docs/README.md0000644000175000017510000000120213202647036015410 0ustar samanthasamantha# Documentation ## Current Docs The below linked documents are current. ## Strings ### [String Representation Overview](strings.asciidoc) ### [Collation](collation.asciidoc) ## JIT ### [JIT compiler overview](jit/overview.org) ### [Expression 'Tree' Intermediate Representation](jit/ir.md) ### [Runtime Configuration](jit/runtime.md) ### [JIT Todo](jit/todo.org) ## Other ### [MoarVM Release Guide](release_guide.md) ### [Changelog](ChangeLog) ## Historical Design Docs The other documents are mostly of historical interest for the heavy design phases of MoarVM, but may also be useful for understanding its current operation. MoarVM-2018.03/docs/arg-passing.markdown0000644000175000017510000001155713111771622020124 0ustar samanthasamantha# Argument Passing Every invocation in MoarVM consists of two pieces: * A static Callsite descriptor (MVMCallsite), which incorporates the number of arguments along with a set of flags about what is being passed. * A contiguous group of MVMRegister, which is a union type. This contains the actual arguments being passed. The static descriptor indicates how to process the registers. As they are registers, they really are just a chunk of the register space in the caller, thus anything that wants the args for a longer period of time must work to keep them. ## Memory management Callsite descriptors are kept at a compilation unit level, and thus their lifetimes are simply that of the compilation unit. (An alternative way would be to keep a global store of these and intern them, fixing up all of the references to them at bytecode loading time.) The argument data itself is more subtle. A simple approach would be to allocate the argument data array per call, but that's too much allocation for the common case. Thus each callframe, along with its working space, also allocates an amount of space equal to that required by the most demanding callsite (that is, the one that implies the most storage). This space is populated with arguments per call, and a pointer passed to the invocation target. This area of memory will clearly never be safe to consider beyond the point that the callee yields control. Control is yielded by: * Returning * Yielding co-routine style * Calling anything that will potentially do co-routine or continuation stuff Typically, though, an argument processor immediately copies what was passed into locals, lexicals and so forth. It may need to make its own copy of the original arguments if: * It wants to keep them around and present them "first class" (a bit like Perl 6 does with Captures, in order to do nextsame et al.) * Part way through processing them, some other code needs to be run in order to obtain default values, build up data structures, etc. A language that doesn't need to worry about such matters will generally be able to avoid any of the copying. A language like NQP will be able to avoid it perhaps entirely, by handling default values after the initial binding. A language like Perl 6 will generally need to default to copying, but a decent optimizer should be able to whitelist routines where it's OK not to. Many simple built-in operators should make the cut, which will take the edge off the cases where compile-time inlining isn't possible. ## Call Code Generation A call looks something like: prepargs callsite # set the callsite argconst_i 0, 42 # set arg slot 0 to native int arg 42 arg_o 1, r0 # set arg slot 1 to object in register 0 call r1 # invoke the object in r1 The bytecode loader will analyse the callsite info, and ensure that between it and the call all of the required slots are given values, and that these are of the correct types. This is verified once when the bytecode is loaded, and at execution time needs no further consideration. Note that there's no reason you can't have things like: prepargs callsite # set the callsite argconst_i 0, 42 # set arg slot 0 to native int arg 42 get_lex_named r0, '$x' # load lexical "$x" by name into register 0 arg_o 1, r0) # set arg slot 1 to object in register 0 call r1 # invoke the object in r1 That is, do lookups or computations of arguments while building the callsite. However, it is NOT allowable to nest prepargs/call sequences in the bytecode. There is only one chunk of memory available to store the arguments. Thus a call like: foo(bar(42)) Will have to store the result of bar(42) in a register, then prepargs..call for foo(...) afterwards. # Parameter Handling While some languages may have their own binding support driven by their own signature objects, the core instruction set provides a mechanism that should handle most needs. Parameter handling may start with a use of the checkarity op, specifying the minimum and maximum number of positional arguments that may be passed. checkarity 1, 1 # require 1 argument checkarity 2, 3 # require 2 arguments, accept up to 3 (1 optional) Required positional arguments can then be obtained by type: param_rp_o r0, 0 # get 1st positional argument, which is an object param_rp_s r1, 1 # get 2nd positional argument, which is a string Optional positional arguments are fetched by a range of similar ops, except that they include a branch offset (that is, a label). If the argument is present, it is put into the register and we jump to the branch offset. If not, the next instruction is executed, which presumably is code to populate the register with a default value. param_op_i r2, 2, L1 const_i64 r2, 0 L1: The handling of named arguments is similar, with both required and optional variants of the ops. MoarVM-2018.03/docs/bootstrap.markdown0000644000175000017510000000323313111771622017716 0ustar samanthasamantha# 6model Bootstrap (run-time) MoarVM is based around the 6model object system. This must be bootstrapped as pretty much the first thing that the VM does after startup. ## Bootstrap Procedure The bootstrap is done something like this. * Create a type object that will become VMString, the VM's core string type. It will have no meta-object yet, and the STable will not be filled out. It will use the MVMString representation. * Populate the representations table and name to ID hash. This includes setting up all of the representation function tables. We needed the VMString first, as representation function tables contain the representation name in string form. * Create a type object BOOTArray, the VM's core array type. It will have the MVMObjectArray representation. Again, there's no meta-object just yet. * Create a type object BOOTHash, the VM's core hash type. It will have the MVMHash representation. Still no meta-objects. * Create a type object BOOTCCode, the VM's core code type for things implemented inside the VM in C (typically, just a very small number of bootstrap things). It will have the MVMCFunction representation. Still no...yeah, you got it. :-) * At this point, we finally have enough to bootstrap KnowHOW, the most primitive object type. This involves the KnowHOWREPR representation. * Finally, the various BOOT type objects get meta-objects pieced together, which are KnowHOWs. Note that it almost certainly doesn't offer any real functionality; the point is just to get a clean bootstrap with nothing left dangling. Beyond that, there's nothing left to do in the VM core; all other objects are set up from code running atop of the VM. MoarVM-2018.03/docs/bytecode.markdown0000644000175000017510000004365413242626641017517 0ustar samanthasamantha# Bytecode This document describes the bytecode that the VM interprets or JIT compiles. Note that this is just one part of an input file to the VM; along with it will also be a bunch of serialized objects, and some container. This just describes the way the executable segment of things looks. (In a sense, this is the low-level reification of the Actions/World distinction at the level of the compiler). ## Endianness All integer values are stored in little endian format. ## Floats Floating point numbers are represented according to IEEE 754. ## Header The header appears at the start of the MoarVM bytecode file, and indicates what it contains. +---------------------------------------------------------+ | "MOARVM\r\n" | | 8-byte magic string; includes \r\n to catch mangling | | of line endings | +---------------------------------------------------------+ | Version | | 32-bit unsigned integer; since we'll never reach a | | huge number of versions, this also doubles up as a | | check that no weird big/little endian issues keep us | | from reading the bytecode. | +---------------------------------------------------------+ | Offset (from start of file) of the SC dependencies | | table | | 32-bit unsigned integer | +---------------------------------------------------------+ | Number of entries in the SC dependencies table | | 32-bit unsigned integer | +---------------------------------------------------------+ | Offset (from start of file) of the extension ops table | | 32-bit unsigned integer | +---------------------------------------------------------+ | Number of entries in the extension ops table | | 32-bit unsigned integer | +---------------------------------------------------------+ | Offset (from start of file) of the frames data segment | | 32-bit unsigned integer | +---------------------------------------------------------+ | Number of frames we should end up finding in the frames | | data segment | | 32-bit unsigned integer | +---------------------------------------------------------+ | Offset (from start of file) of the callsites data | | segment | | 32-bit unsigned integer | +---------------------------------------------------------+ | Number of callsites we should end up finding in the | | callsites data segment | | 32-bit unsigned integer | +---------------------------------------------------------+ | Offset (from start of file) of the strings heap | | 32-bit unsigned integer | +---------------------------------------------------------+ | Number of entries in the strings heap | | 32-bit unsigned integer | +---------------------------------------------------------+ | Offset (from start of file) of the SC data segment | | 32-bit unsigned integer | +---------------------------------------------------------+ | Length of the SC data segment | | 32-bit unsigned integer | +---------------------------------------------------------+ | Offset (from start of file) of the bytecode segment | | 32-bit unsigned integer | +---------------------------------------------------------+ | Length of the bytecode segment | | 32-bit unsigned integer | +---------------------------------------------------------+ | Offset (from start of file) of the annotation segment | | 32-bit unsigned integer | +---------------------------------------------------------+ | Length of the annotation segment | | 32-bit unsigned integer | +---------------------------------------------------------+ | HLL Name | | 32-bit unsigned integer index into the string heap, | | providing the name of the HLL this compilation unit | | was compiled from. May be the empty string. | +---------------------------------------------------------+ | Main entry point frame index + 1; 0 if no main frame | | 32-bit unsigned integer | +---------------------------------------------------------+ | Library load frame index + 1; 0 if no load frame | | 32-bit unsigned integer | +---------------------------------------------------------+ | Deserialization frame index + 1; 0 if none | | 32-bit unsigned integer | +---------------------------------------------------------+ ## Strings heap This segment contains a bunch of string data. Each string is laid out as: +---------------------------------------------------------+ | String length in bytes | | 32-bit unsigned integer | +---------------------------------------------------------+ | String data encoded as UTF-8 | | Bunch of bytes, padded at end to 32 bit boundary | +---------------------------------------------------------+ ## SC Dependencies Table This table describes the SCs that the bytecode in this file references objects from. The wval opcode specifies an index in this table and and index in the SC itself. When the bytecode file is first loaded, we look in the known SCs table and resolve all that we can. Then, the deserialize code for the compilation unit is run. Whenever the SC creation opcode is used, we search all known compilation units to see if they have any unresolved SCs, and fill in any gaps that correspond to the newly created SC. By the time the deserialize phase for a compilation unit is over, we expect that all SCs have been resolved. Thus, the lifetime of an SC is equal to the lifetimes of all the compilation units that reference it, since their code depends on it. Note that the primary way an SC is rooted is through a compilation unit, and that these roots are established as soon as it is created, and before it's returned to userspace (which could allocate more) are the way we make sure it isn't collected too early. +---------------------------------------------------------+ | Index into the string heap of the SC unique ID | | 32-bit unsigned integer | +---------------------------------------------------------+ ## Extension ops table +---------------------------------------------------------+ | Index into the string heap of the extension op ID | | 32-bit unsigned integer | +---------------------------------------------------------+ | Operand descriptor | | Bunch of bytes describing a single operand each, | | zero-padded to 8 bytes | +---------------------------------------------------------+ The operand descriptor follows the same format as used by MVMOpInfo. The 8 bytes limit corresponds to MVM_MAX_OPERANDS. ## Frames Data The frames data segment contains data that describes all of the frames in the compilation unit. It also points into the bytecode segment, which contains the bytecode we will execute for this frame. This is stored elsewhere at least partly for the sake of demand paging and CPU cache efficiency; once we processed the static data, it's not very interesting at runtime, so there's no real reason for it to stay in memory, let alone be cached by the CPU. The actual bytecode itself, on the other hand, is (at least until JIT happens) of interest for execution. Each frame starts with the following data. +---------------------------------------------------------+ | Bytecode segment offset | | 32-bit unsigned integer | +---------------------------------------------------------+ | Bytecode length in bytes | | 32-bit unsigned integer | +---------------------------------------------------------+ | Number of locals/registers | | 32-bit unsigned integer | +---------------------------------------------------------+ | Number of lexicals | | 32-bit unsigned integer | +---------------------------------------------------------+ | Compilation unit unique ID | | 32-bit string heap index | +---------------------------------------------------------+ | Name | | 32-bit string heap index | +---------------------------------------------------------+ | Outer | | 16-bit frame index of the outer frame. For no outer, | | this is set to the current frame index. | +---------------------------------------------------------+ | Annotation segment offset | | 32-bit unsigned integer | +---------------------------------------------------------+ | Number of annotations | | 32-bit unsigned integer | +---------------------------------------------------------+ | Number of handlers | | 32-bit unsigned integer | +---------------------------------------------------------+ | Frame flag bits | | 16-bit integer | | 1 = frame has an exit handler | | 2 = frame is a thunk | | Remaining values reserved | | [NEW IN VERSION 2] | +---------------------------------------------------------+ | Number of entries in static lexical values table | | 16-bit integer | | [NEW IN VERSION 4] | +---------------------------------------------------------+ | Code object SC dependency index + 1; 0 if none | | 32-bit unsigned integer | | [NEW IN VERSION 4] | +---------------------------------------------------------+ | SC object index; ignored if above is 0 | | 32-bit unsigned integer | | [NEW IN VERSION 4] | +---------------------------------------------------------+ This is followed, for each local, by a number indicating what kind of local it is. These are stored as 16-bit unsigned integers. int8 1 int16 2 int32 3 int64 4 num32 5 num64 6 str 7 obj 8 Lexicals are similar, apart from each entry is preceded by a 32-bit unsigned index into the string heap, which gives the name of the lexical. [Conjectural: a future MoarVM may instead do these in terms of REPRs.] Next comes the handlers table. Each handler has an entry as follows: +---------------------------------------------------------+ | Start of protected region. Inclusive offset from start | | of the frame's bytecode | | 32-bit unsigned integer | +---------------------------------------------------------+ | End of protected region. Exclusive offset from start of | | the frame's bytecode | | 32-bit unsigned integer | +---------------------------------------------------------+ | Handler category mask bitfield | | 32-bit unsigned integer | +---------------------------------------------------------+ | Handler action (see exceptions spec for values) | | 16-bit unsigned integer | +---------------------------------------------------------+ | Register number containing the block to invoke, for a | | block handler. | | 16-bit unsigned integer | +---------------------------------------------------------+ | Handler address to go to, or where to unwind to after | | an invoked handler. Offset from start of the frame's | | bytecode. | | 32-bit unsigned integer | +---------------------------------------------------------+ From version 4 and up, this is followed by a static lexical values table. Each entry is as follows: +---------------------------------------------------------+ | Lexical index | | 16-bit unsigned integer | +---------------------------------------------------------+ | Flag | | 16-bit unsigned integer | | 0 = static lexical value | | 1 = container var (cloned per frame) | | 2 = state var (cloned per closure) | +---------------------------------------------------------+ | SC dependency index | | 32-bit unsigned integer | +---------------------------------------------------------+ | SC object index | | 32-bit unsigned integer | +---------------------------------------------------------+ ## Callsites Data This data blob contains all of the callsite descriptors that are used in the compilation unit. At the point of loading the bytecode, they will be set up, and a table pointing to them created. This means that a callsite descriptor will always be a pointer + offset away. Each callsite consists of a 16-bit unsigned integer indicating the number of argument flags. This is followed by the flags, taking 8 bits each. If the number of argument flags is odd, then an extra padding byte will be written afterwards. Since version 3, this is then followed with one index to the string heap (in the form of a 32-bit integer) for each argument flag that has the `MVM_CALLSITE_ARG_NAMED` bit set. ## Bytecode segment This consists of a sequence of instructions. Instruction codes are always 16 bits in length. The first 8 bits describe an instruction "bank", and the following 8 bits identify the instruction within that bank. Instruction banks 0 through 127 are reserved for MoarVM core ops or future needs. Instruction banks 128 through 255 are mappable per compilation unit, and are used for "plug-in" ops. Opcodes may be followed by zero or more operands. The instruction set will have the needed operands described by the following set of descriptors. r local variable index being read, 16 bits unsigned w local variable index being written, 16 bits unsigned rl lexical variable being read, 16 bits unsigned for the index within a frame and 16 bits for how many frames out to go to locate it wl lexical variable being written, 16 bits unsigned for the index within a frame and 16 bits for how many frames out to go to locate it i16 16-bit integer constant i32 32-bit integer constant i64 64-bit integer constant n32 32-bit floating point constant n64 64-bit floating point constant si Strings table index, 32 bits unsigned sci Serialization Context object table index, 16 bits unsigned csi Callsite table index, 16 bits unsigned ins Instruction offset from frame start (for goto), 32 bits unsigned Note that this ensures we always keep at least 16-bit alignment for ops. Some instructions place demands on the type of value in the register. This is perhaps most noticable when it comes to integers of different sizes; all computations are done on them in full-width (64-bit) form, and loading/storing them to registers representing locals of more constrained sizes needs explict sign extension and truncate ops. Wherever a register is specified, the kind of value in it is also indicated. These are typechecked *once*, either at bytecode load time or (perhaps better) on the first execution. After that, all future interpreter executions can just plow through the instructions without ever having to do checks. The set of ops is listed in src/core/oplist. ## Annotation segment This consists of a number of 10-byte records, composed of: * 32-bit unsigned integer offset into the bytecode segment * 32-bit unsigned integer strings heap index (filename) * 32-bit unsigned integer (line number) MoarVM-2018.03/docs/collation.asciidoc0000644000175000017510000002611413202647036017626 0ustar samanthasamantha= Collation (Unicode Collation Algorithm) = :author: Samantha McVey :toc: :tip-caption: :bulb: :note-caption: :information_source: :important-caption: :heavy_exclamation_mark: :caution-caption: :fire: :warning-caption: :warning: [abstract] == Abstract == With Unicode applications widely deployed, multilingual data is the rule, not the exception. Even when there was only ASCII, a pure sort by codepoint will cause a capital `Z` to sort before a lowercase `a`x. With Unicode the number of codepoints makes it even more clear that we cannot rely on the integer assigned to each codepoint as a basis for how it should be sorted for text to be presented to the user. NOTE: The only op that uses the UCA is the `unicmp_s` op. Other forms of string compare such as `cmp_s` go based on codepoint differences In addition, due to Grapheme Cluster's, there may be multiple codepoints to represent a single user visible character. It becomes clear that there must be a solution for us to be able to sort this text in a way that makes sense to the user. The Unicode Collation Algorithm was created to solve this problem. It decouples both the _value_ and the _quantity_ of codepoints from the sort. The form of the data in the UCA consists of <> consisting of **Primary**, **Secondary** and **Tertiary** values of the form `[* Primary | Secondary | Tertiary ]`. The `*` represents whether it is something like punctuation that can be skipped over. MoarVM does not yet support the ability to skip punctuation and spaces using that value, although it supports customized sorting of each of the three levels (Primary, Secondary, Tertiary). Levels can be enabled, reversed or disabled. **Primary** level is the collation value for the character itself, so `a` and `A` have the same Primary value. **Secondary** is used for diacritics and their counterparts based on the script. **Tertiary** is for case as well as minor character variations. This is a slight simplification, but this holds true for almost all `Latin` script codepoints. == Data Examples == === DUCET Values === For example: with the UCA we are able to sort `æ` following `ae` and `ï¬` following `fi` despite them being a different number of codepoints. While most codepoints map to only one Collation Array Element, some single codepoints map to multiple. For example: `㌀` maps to 5: ``` ㌀` [.3E71.0020.001C][.3E8B.0020.001C][.0000.0038.001C][.1C73.0020.001C][.3E85.0020.001C] ``` Compare this to the collation elements for the characters which are visually in this “boxed†character: ``` ã‚¢ U+30A2 [.3E71.0020.0011] # KATAKANA LETTER A パ U+30D1 [.3E8B.0020.0011][.0000.0038.0002] # KATAKANA LETTER PA ー U+30FC [.1C73.0020.0002] # KATAKANA-HIRAGANA PROLONGED SOUND MARK ト U+30C8 [.3E85.0020.0011] # KATAKANA LETTER TO ``` As you may have guessed, this allows them to sort right next to each other, with the exception of the tertiary collation values (as it is a letter variation). *Multiple* codepoints can be assigned to a *single value* (as well as *multiple* as well): ``` ꪵꪦ U+AAB5, U+AAA6 [.2EB6.0020.0002][.2EC5.0020.0002] # ``` === Computed Collation Values === Some characters are on the other hand computed. This would include Unified Ideographs, Tangut, Nushu and Unassigned. == Implementation == This is an implementation of the Unicode Collation Algorithm using DUCET values. We implement the standard “Non-ignorable†sort, as it does not ignore punctuation or spaces while sorting. We iterate by codepoint and put this into a ring buffer. The ring buffers hold the exact number of codepoints which comprise the longest sequence of codepoints which map to its own collation keys in the Unicode Collation Algorithm. As of Unicode 9.0 this number was 3. In case future versions contain longer series of codepoints, `Generate-Collation-Data.p6` updates this number when generating the C data. The iteration into the ringbuffer stops as soon as a non-matching codepoint, is found. Whether the two codepoints are Less/More/Same compared to each other is saved in a variable for later in case we end up needing to break a tie by codepoint. #Vast majority of the time we only need to use what is in the ring buffer to . The elements in the ringbuffer are either passed into our function which finds and pushes the collation arrays onto the stack or reordered to be first to last and then pushed. We then compare by primary levels, all the keys pushed so far. If all the primaries match then we iterate more codepoints and push the collation array elements onto a stack. This stack is malloced and can expand as needed, but this should practically never be the case. === The Stack === The stack lets us do is a modified version of the UCA which lets us not have to push all primaries from start to end of the string onto a one dimensional array, and then after that push all the secondary, then all the tertiary. So: `[.3E8B.0020.0011][.0000.0038.0002]` would become `3E8B 0000 | 0020 0038 | 0011 0002` (`|` shown between the different levels). Doing it like this would cause us to have to start pushing from our starting position to the very end of the string if we flattened the collation arrays. Instead we keep track of both are position in the stack, but also which level we are on, moving further on the stack then pushing more arrays as needed. If the primary values all tie, we wrap and go to the beginning of the stack but on the subsequent level. String a and b are not necessarily on the same position in the stack, or on the same collation level. === The Data === Codepoints which have single collation array elements get the data from the MVM UCD database created with `ucd2c.pl`. Any codepoints which have more than one collation array element or if it is a sequence of codepoints, that uses the data in `src/strings/unicode_uca.c`. The data in `unicode_uca.c` is this: `main_nodes` contains a linked list representation. Although all the nodes are in the same `main_nodes` struct array, we `#define` how many root nodes there are, and this number lets us do a binary search of the root nodes. If we get a match, we check if there are any sub node elements, and if none, we then use the `collation_link` and collation_elems` values to push the specified number of collation elements from the correct location in the `special_collation` struct array onto the stack. If there _are_ more possibilities, if we don't have anymore codepoints passed to `collation_push_cp`, we grab more and then use `sub_node_link` and `sub_node_elems` to do a linear search, stopping if we see any codepointns which are higher than the one we are looking for. The reason linear search is used is because we have 1-18 or so subnodes from each parent node, and binary search is slower for small numbers of elements. Tangut, Ideographs, Nushu and Unassigned codepoints have collation values which are generated algorithmically based on their codepoint. Hangul characters decompose before they are pushed onto the array. === Configuration === We support the ability to configure collation so you can reverse or disable levels as you wish. The trick to this is knowing that for all collation values: `_tertiary_ *<* _secondary_ *<* _primary_` We use `level_eval_settings` to store the settings for each level, which we set up based on the bitmask of the collation_mode argument to the function. If the two levels are the same we are able to compare them based on the setting. If the levels are not equal, we do not need to do this, since tertiary < secondary < primary for all values. Some info on our collation values. They are all 1 higher than those listed for DUCET (Default Unicode Collation Element Table). The reason for this is that a 0 counts as 0 while a 1 is skipped and ignorable. This corresponds to things listed as 0 in DUCET, which our implementation gives a value of 1. We only use 0 for the tertiary value of the level separator to ensure that longer strings win (though we also have a fallback to ensure this happens in certain cases which this isn't enough). == Return Value/Bitmask == MoarVM function: `MVM_unicode_string_compare` [source,c] MVMint64 MVM_unicode_string_compare(MVMThreadContext *tc, MVMString *a, MVMString *b, MVMint64 collation_mode, MVMint64 lang_mode, MVMint64 country_mode) Op: `unicmp_s` [source,perl6] unicmp_s(str a, str b, int collation_mode, int lang_mode, int country_mode) .Return values: [width="75",cols="0,1"] |============== | 0 | The strings are identical for the collation levels requested | -1/1 | String a is less than string b/String a is greater than string b |============== `collation_mode` acts like a bitmask. Each of primary, secondary and tertiary collation levels can be either: disabled, enabled, reversed. In the table below, where + designates sorting normal direction and - indicates reversed sorting for that collation level. [options="header",width="0"] |================== |Collation level | bitfield value | Primary+ | 1 | Primary− | 2 | Secondary+ | 4 | Secondary− | 8 | Tertiary+ | 16 | Tertiary− | 32 | Quaternary+ | 64 | Quaternary- | 128 |================== == The Future == === Language Specific Sort === :CLDRlatest: http://unicode.org/Public/cldr/latest :CLDRcore: http://unicode.org/Public/cldr/latest/core.zip In the future we may support language specific sort. This data will have to be taken from the Unicode CLDR (Common Language Data Repository), as it is not part of DUCET. {CLDRcore}[`core.zip`] contains a folder `./core/collation` which contains XML files with notes for different languages. To read the specs of how to interpret these files, see the {CLDRSpec}[CLDR Spec page]. === Natural Sorting/Number based sorting === :nat-sort: https://en.wikipedia.org/wiki/Natural_sort_order This is another possible addition, called {nat-sort}[Natural Sorting]. We can sort `<12 9>` as `9, 12` instead of `12, 9`. Since we use a ring buffer to find where codepoints differ. I think we will not have to backtrack any, we only have to care about codepoints _including_ and _after_ the differing codepoint. Since we know all codepoints before must have matched before this point, we should only have to see how long each number is from that point on. [glossary] == Glossary == [[CAE]] Collation Array Element:: Made up of primary, secondary, tertiary and a boolean for ignorable (whether it should be ignored when ignoring punctuation is wanted). DUCET:: Default Unicode Collation Element Table. This data is provided by Unicode and provides us with the collation arrays we use. See <> for more information. Grapheme:: Short for Grapheme Cluster. See <> for more information. Synthetic:: In MoarVM, a special representative to store a grapheme containing more than one codepoint using the same space as a standard codepoint. Internally stored using negative numbers in the C string data array. [bibliography] == References - [[[TR10]]] **Unicode Technical Report 10**. _Unicode Collation Algorithm_. http://unicode.org/reports/tr10/ - [[[TR29]]] **Unicode Technical Report 29**. _Unicode Text Segmentation_. http://unicode.org/reports/tr29/ MoarVM-2018.03/docs/debug-server-protocol.md0000644000175000017510000006735713252330426020730 0ustar samanthasamantha# MoarVM Remote Debug Protocol Design The MoarVM Remote Debug Protocol is used to control a MoarVM instance over a socket, for the purposes of debugging. The VM must have been started in debug mode for this capability to be available. This document defines the debug protocol's wire format. ## The wire format Rather than invent Yet Another Custom Binary Protocol, the MoarVM remote debug protocol uses [MessagePack](https://msgpack.org/). This has the advantage of easy future extensibility and existing support from other languages. The only thing that is not MessagePack is the initial handshake, leaving the freedom to move away from MessagePack in a future version, should there ever be cause to do so. Since MessagePack is largely just a more compact way to specify JSON, all of the messages in this document are demonstrated with JSON syntax. This is just for ease of reading; JSON is not used at all on the wire. ### Initial Handshake Upon receving a connection, MoarVM will immediately send the following 24 bytes if it is willing and able to accept the connection: * The string "MOARVM-REMOTE-DEBUG\0" encoded in ASCII * A big endian, unsigned, 16-bit major protocol version number * A big endian, unsigned, 16-bit minor protocol version number Otherwise, it will send the following response, explaining why it cannot, and then close the connection: * The string "MOARVM-REMOTE-DEBUG!" encoded in ASCII * A big endian, unsigned, 16-bit length for an error string explaining the rejection (length in bytes) * The error string, encoded in UTF-8 A client that receives anything other than a response of this form must close the connection and report an error. A client that receives an error response must report the error. Otherwise, the client should check if it is able to support the version of the protocol that the server speaks. The onus is on clients to support multiple versions of the protocol should the need arise. See versioning below for more. If the client does not wish to proceed, it should simply close the connection. If the client is statisfied with the version, it should send: * The string "MOARVM-REMOTE-CLIENT-OK\0" encoded in ASCII For the versions of the protocol defined in this document, all further communication will be in terms of MessagePack messages. ## MessagePack envelope Every exchange using MessagePack must be an object at the top level. The object must always have the following keys: * `type`, which must have an integer value. This specifies the type of the message. Failing to include this field or failing to have its value be an integer is a protocol error, and any side receiving such a message should terminate the connection. * `id`, which must have an integer value. This is used to associate a response with a request, where required. Any interaction initiated by the client should have an odd `id`, starting from 1. Any interaction initiated by the server should have an even `id`, starting from 2. The object may contain further keys, which will be determined by message type. ## Versioning Backwards-incompatible changes, if needed, will be made by incrementing the major version number. A client seeing a major version number it does not recognize or support must close the connection and not attempt any further interaction, and report an error. The minor version number is incremented for backwards-compatible changes. A client may proceed safely with a higher minor version number of the protocol than it knows about. However, it should be prepared to accept and disregard message types that it does not recognize, as well as any keys in an object (encoded using MessagePack) that it does not recognize. The client can use the minor version number to understand what features are supported by the remote MoarVM instance. The MoarVM instance must disregard keys in a MessagePack object that it does not understand. For message types that it does not recognize, it must send a message of type "not recognized" (format defined below); the connection should be left intact by MoarVM, and the client can decide how to proceed. ## Security considerations Any client connected to the debug protocol will be able to perform remote code execution using the running MoarVM instance. Therefore, MoarVM must only bind to `localhost` by default. It may expose an option to bind to further interfaces, but should display a warning about the dangers of this option. Remote debugging should be performed by establishing a secure tunnel from the client to the server, for example using SSH port forwarding. This provides both authentication and protection against tampering with messages. ## Message types All messages defined here, unless stated otherwise, are supported in major version 1, minor version 0, of the protocol (also known as `1.0`). ### Message Type Not Understood (0) Sent only by MoarVM to indicate that a message type was not understood. The ID correlates it with the message that was not understood. { "type": 0, "id": $id } ### Error Processing Message (1) Sent only by MoarVM to indicate that a problem occurred with processing a message. The ID correlates it with the message that was not understood. This should not be sent when a message type is recognized but the object lacks required keys, or when the requested operation could not be performed. The `reason` key should be a string explaining why. { "type": 1, "id": $id, "reason": "Program already terminated" } ### Operation Successful (2) This is a generic message sent by the MoarVM instance to acknowledge that an operation was successfully performed. This is sent in response to commands, when there is no further information to return. The ID correlates it with the message from the client that was successfully processed. { "type": 2, "id": $id } ### Is Execution Suspended Request (3) Sent by the client to ask the MoarVM instance if execution is currently suspended. { "type": 3, "id": $id } ### Is Execution Suspended Response (4) Response from the MoarVM instance, with the `suspended` key set to `true` if execution is currently suspended and `false` otherwise. { "type": 4, "id": $id, "suspended": true } ### Suspend All (5) Requests that all threads be suspended. Once this has happened, an Operation Successful message will be sent. If all threads were already suspended, then nothing happens and an Operation Successful message will be sent. { "type": 5, "id": $id } ### Resume All (6) Requests that all suspended threads be resumed. Once this has happened, an Operation Successful message will be sent. If no threads were suspended, then nothing happens and an Operation Successful message will be sent. { "type": 6, "id": $id } ### Suspend One (7) Requests that a specific thread be suspended, with the thread ID specified by the `thread` key. Once this has happened, an Operation Successful message will be sent. If the threads was already suspended, then nothing happens and an Operation Successful message will also be sent. An error will be reported if the thread ID is not recognized. { "type": 7, "id": $id, "thread": 1 } ### Resume One (8) Requests that a specific thread be resumed, with the thread ID specified by the `thread` key. Once this has happened, an Operation Successful message will be sent. If the thread was not suspended, then nothing happens and an Operation Successful message will be sent. { "type": 8, "id": $id, "thread": 1 } ### Thread Started (9) This message is sent by MoarVM whenever a new thread is started. The client can simply disregard it if it has no interest in this information. { "type": 9, "id": $id, "thread": 3, "native_id": 1020, "app_lifetime": true } ### Thread Ended (10) This message is sent by MoarVM whenever a thread terminates. The client can simply disregard it if it has no interest in this information. { "type": 10, "id": $id, "thread": 3 } ### Thread List Request (11) This message is sent by the client to request a list of all threads, with some information about each one. This may be sent at any time, whether or not the threads are suspended. { "type": 11, "id": $id } ### Thread List Response (12) This message is sent as a response to a Thread List Request. It contains an array of objects, with one entry per running threads, providing information about that thread. It also contains an indication of whether the threads was suspended, and the number of locks it is currently holding. { "type": 12, "id": $id, "threads": [ { "thread": 1, "native_id": 1010, "app_lifetime": false, "suspended": true, "num_locks": 1 }, { "thread": 3, "native_id": 1020, "app_lifetime": true, "suspended": false, "num_locks": 0 } ] } ### Thread Stack Trace Request (13) This message is sent by the client to request the stack trace of a thread. This is only allowed if that thread is suspended; an error will be returned otherwise. { "type": 13, "id": $id, "thread": 3 } ### Thread Stack Trace Response (14) This message is sent by MoarVM in response to a Thread Stack Trace Request. It contains an array of stack frames, topmost first, that are currently on the call stack of that thread. Each stack frame is represented by an object. The `bytecode_file` key will be either a string or `nil` if the bytecode only exists "in memory" (for example, due to an `EVAL`). The `name` key will be an empty string in the case that the code for that frame has no name. The `type` field is the debug name of the type of the code object, or `nil` if there is none. { "type": 14, "id": $id, "frames": [ { "file": "path/to/source/file", "line": 22, "bytecode_file": "path/to/bytecode/file", "name": "some-method", "type": "Method" }, { "file": "path/to/source/file", "line": 12, "bytecode_file": "path/to/bytecode/file", "name": "", "type": "Block" }, { "file": "path/to/another/source/file", "line": 123, "bytecode_file": "path/to/another/bytecode/file", "name": "foo", "type": nil } ] } ### Set Breakpoint Request (15) Sent by the client to set a breakpoint at the specified location, or the closest possible location to it. The file refers to the source file. If `suspend` is set to `true` then execution of all threads will be suspended when the breakpoint is hit. In either case, the client will be notified. The use of non-suspend breakpoints is for simply counting the number of times a certain point is crossed. If the `stacktrace` option is set to `true` then a stack trace of the location where the breakpoint was hit will be included. This can be used both with and without `suspend`; with `suspend` it can save an extra round-trip to reqeust the stack location, while without `suspend` it can be useful for features like "capture a stack trace every time foo is called". { "type": 15, "id": $id, "file": "path/to/source/file", "line": 123, "suspend": true, "stacktrace": false } ### Set Breakpoint Confirmation (16) Sent by MoarVM to confirm that a breakpoint has been set. The `line` key indicates the actual line that the breakpoint was placed on, if there was no exactly annotation match. This message must be sent before any breakpoint notifications; the ID will match the breakpoint request. { "type": 16, "id": $id, "line": 123 } ### Breakpoint Notification (17) Sent by MoarVM whenever a breakpoint is hit. The ID will match that of the breakpoint request. The `frames` key will be `nil` if the `stacktrace` key of the breakpoint request was `false`. Otherwise, it will contain an arrary of objects describing the stack frames, formatted as in the Thread Stack Trace Response message type. { "type": 17, "id": $id, "thread": 1, "frames": nil } ### Clear Breakpoint (18) Clears a breakpoint. The line number must be the one the breakpoint was really set on (indicated in the Set Breakpoint Confirmation message). After clearing the breakpoint, MoarVM will send an Operation Successful response. { "type": 18, "id": $id, "file": "path/to/source/file", "line": 123 } ### Clear All Breakpoints (19) Clears all breakpoints that have been set. Once they have been cleared, MoarVM will respond with an Operation Successful message. { "type": 19, "id": $id } ### Single Step (aka. Step Into) (20) Runs until the next program point, where program points are determined by either a change of frame or a change of line number in the bytecode annotation table. The thread this is invoked on must be suspended, and will be returned to suspended state after the step has taken place. A Step Completed message will be sent by MoarVM at that point. { "type": 20, "id": $id, "thread": 1 } ### Step Over (21) Runs until the next program point either in the same frame or in a calling frame, but not in any called frames below this point. The thread this is invoked on must be suspended, and will be returned to suspended state after the step has taken place. A Step Completed message will be sent by MoarVM at that point. { "type": 21, "id": $id, "thread": 1 } ### Step Out (22) Runs until the program returns into the specified frame. The thread this is invoked on must be suspended, and will be returned to suspended state after the step has taken place. A Step Completed message will be sent by MoarVM at that point. The client has to specify the frame to return to, because whether a calling frame should be skipped or not depends on whether it is a Block or Routine or similar. The client has to have this knowledge. { "type": 22, "id": $id, "thread": 1, "frame": 4321 } ### Step Completed (23) Sent by MoarVM to acknowledge that a stepping operation was completed. The ID matches that of the step request. The `frames` array contains the stacktrace after stepping; the `file` and `line` of the current location being in the topmost frame. { "type": 23, "id": $id, "thread": 1, "frames": [ ... ] } ### Release Handles (24) Handles are integers that are mapped to an object living inside of the VM. For so long as the handle is alive, the object will be kept alive by being in the handles mapping table. Therefore, it is important that, when using any instructions that involve handles, they are released afterwards. Otherwise, the debug client can induce a managed memory leak. This command is confirmed with an Operation Successful message. { "type": 24, "id": $id, "handles": [42, 100] } ### Handle Result (25) This is a common response message send by MoarVM for requests that ask for an object handle. The ID will match that of the request. Remember to release handles when the debug client no longer needs them by sending a Release Handles message. The `0` handle represents the VM Null value. { "type": 25, "id": $id, "handle": 42 } ### Context Handle (26) Sent by the client to allocate a context object handle for the specified frame (indicated by the depth relative to the topmost frame on the callstack, which is frame 0) and thread. This can only be used on a thread that is suspended. A context handle is just an object handle, where the object happens to have the MVMContext REPR, and the result is delivered as a Handle Result message. { "type": 26, "id": $id, "thread": 1, "frame": 0 } ### Context Lexicals Request (27) Sent by the client to request the values of lexicals in a given context. The `handle` key must be a context handle. The response comes as a Context Lexicals Response message. { "type": 27, "id": $id, "handle": 1234 } ### Context Lexicals Respone (28) Contains the results of introspecting a context. For natively typed values, the value is included directly in the response. For object lexicals, an object handle will be allocated for each one. This will allow for further introspection of the object; take care to release it. The debug name of the type is directly included, along with whether it's concrete (as opposed to a type object) and a container type that could be decontainerized. The `kind` key may be one of `obj`, `int`, `num`, or `str`. { "type": 28, "id": $id, "lexicals": { "$x": { "kind": "obj", "handle": 1234, "type": "Scalar", "concrete": true, "container": true }, "$i": { "kind": "int", "value": 42 }, "$s": { "kind": "str", "value": "Bibimbap" } } } ### Outer Context Request (29) Used by the client to gets a handle to the outer context of the one passed. A Handle Result message will be sent in response. The null handle (0) will be sent if there is no outer. { "type": 29, "id": $id, "handle": 1234 } ### Caller Context Request (30) Used by the client to gets a handle to the outer context of the one passed. A Handle Result message will be sent in response. The null handle (0) will be returned if there is no caller. { "type": 30, "id": $id, "handle": 1234 } ### Code Object Handle (31) Sent by the client to allocate a handle for the code object of the specified frame (indicated by the depth relative to the topmost frame on the callstack, which is frame 0) and thread. This can only be used on a thread that is suspended. If there is no high-level code object associated with the frame, then the null handle (0) will be returned. The response is delivered as a Handle Result message. { "type": 31, "id": $id, "thread": 1, "frame": 0 } ### Object Attributes Request (32) Used by the client to introspect the attributes of an object. The response comes as an Object Attributes Response message. { "type": 32, "id": $id, "handle": 1234 } ### Object Attributes Response (33) Contains the results of introspecting the attributes of an object. If the object cannot have any attributes, the `attributes` key will be an empty array. For natively typed attributes, the value is included directly in the response. For object attributes, an object handle will be allocated for each one. This will allow for further introspection of the object; take care to release it. The debug name of the type is directly included, along with whether it's concrete (as opposed to a type object) and a container type that could be decontainerized. The `kind` key may be one of `obj`, `int`, `num`, or `str`. Since attributes with the same name may exist at multiple inheritance levels, an array is returned with the debug name of the type at that level under the `class` key. { "type": 33, "id": $id, "attributes": [ { "name": "$!x", "class": "FooBase" "kind": "obj", "handle": 1234, "type": "Scalar", "concrete": true, "container": true }, { "name": "$!i", "class": "Foo", "kind": "int", "value": 42 } ] } ### Decontainerize Handle (34) Used to decontainerize a value in a container (such as a Perl 6 `Scalar`). The handle to the object that results is returned in a Handle Result message. If this is not a container type, or if an exception occurs when trying to do the decontainerization, an Error Processing Message response will be sent by MoarVM instead. A target thread to perform this operation on is required, since it may be required to run code (such as a `Proxy`); the thread must be suspended at the point this request is issued, and will be returned to suspended state again after the decontainerization has taken place. Note that breakpoints may be hit and will be fired during this operation. { "type": 34, "id": $id, "thread": 1, "handle": 1234 } ### Find Method (35) Used by the client to find a method on an object that it has a handle to. The handle to the method that results is returned in a Handle Result message, with the null object handle (0) indicating no method found. If an exception occurs when trying to do the method resolution, an Error Processing Message response will be sent by MoarVM instead. A target thread to perform this operation on is required, since it may be required to run code (such as `find_method`) in a custom meta-object); the thread must be suspended at the point this request is issued, and will be returned to suspended state again after the lookup has taken place. Note that breakpoints may be hit and will be fired during this operation. { "type": 35, "id": $id, "thread": 1, "handle": 1234 } ### Invoke (36) Used by the client to invoke an object that it has a handle to, which should be some kind of code object. The arguments may be natives or other objects that the client has a handle for. The results will be returned in an Invoke Result message. A target thread to perform this operation on is required. The thread must be suspended at the point this request is issued, and will be returned to suspended state again after the lookup has taken place. Note that breakpoints may be hit and will be fired during this operation. { "type": 36, "id": $id, "thread": 1, "handle": 1235, "arguments": [ { "kind": "obj", "handle": 1234 }, { "kind": "str", "value": "Bulgogi" } ] } ### Invoke Result (37) Contains the result of an Invoke message. If the result was of an object type then a handle to it will be returned. If the invoke resulted in an exception, then the `crashed` key will be set to a true value, and the `result` handle will point to the exception object instead. Object result example: { "type": 37, "id": $id, "crashed": false, "kind": "obj", "handle": 1234, "type": "Int", "concrete": true, "container": false } Native int result example: { "type": 37, "id": $id, "crashed": false, "kind": "int", "value": 42 } Exception result: { "type": 37, "id": $id, "crashed": true, "kind": "obj", "handle": 1234, "type": "X::AdHoc", "concrete": true, "container": false } ### Unhandled Exception (38) This message is sent by MoarVM when an unhandled exception occurs. All threads will be suspended. A handle to the exception object is included, together with the thread it occurred on and the stack trace of that thread. So far as it is able to do so, MoarVM will allow operations such as introspecting the context, resolving methods, decontainerizing values, and invoking code. { "type": 38, "id": $id, "thread": 1, "handle": 1234, "frames": [ { "file": "path/to/source/file", "line": 22, "bytecode_file": "path/to/bytecode/file", "name": "some-method", "type": "Method" }, { "file": "path/to/source/file", "line": 12, "bytecode_file": "path/to/bytecode/file", "name": "", "type": "Block" } ] } ### Operation Unsuccessful (39) A generic message sent by MoarVM if something went wrong while handling a request. { "type": 39, "id": $id } ### Object Metadata Request (40) Used by the client to get additional information about an object that goes beyond its actual attributes. Can include miscellaneous details from the REPRData and the object's internal state if it's concrete. Additionally, all objects that have positional, associative, or attribute features will point that out in their response. { "type": 40, "id": $id, "handle": 1234 } ### Object Metadata Response (41) Contains the results of introspecting the metadata of an object. Every object has `reprname`. All concrete objects have `size` and `unmanaged_size` fields. Objects also include `positional_elems` and `associative_elems` for objects that have positional and/or associative features. `pos_features`, `ass_features`, and `attr_features` inform the client which of the requests 42 ("Object Positionals Request"), 44 ("Object Associatives Request"), or 32 ("Object Attributes Request") will give useful results. { "type": 41, "id": $id, "metadata": { "reprname": "VMArray", "size": 128, "unmanaged_size": 1024, "vmarray_slot_type": "num32", "vmarray_elem_size": 4, "vmarray_allocated": 128, "vmarray_offset": 40, "positional_elems": 12, "pos_features": true, "ass_features": false, "attr_features": false, }, } ### Object Positionals Request (42) Used by the client to get the contents of an object that has positional features, like an array. { "type": 42, "id": $id } ### Object Positionals Response (43) The `kind` field can be "int", "num", "str" for native arrays, or "obj" for object arrays. In the case of an object array, every entry in the `contents` field will be a map with keys `type`, `handle`, `concrete`, and `container`. For native arrays, the array contents are sent as their corresponding messagepack types. Native contents: { "type": 43, "id": $id, "kind": "int", "start": 0, "contents": [ 1, 2, 3, 4, 5, 6 ] } Object contents: { "type": 43, "id": $id, "kind": "obj", "start": 0, "contents": [ { "type": "Potato", "handle": 9999, "concrete": true, "container": false }, { "type": "Noodles", "handle": 10000, "concrete": false, "container": false } ] } ### Associatives Request (44) Used by the client to get the contents of an object that has associative features, like a hash. { "type": 44, "id": $id, "handle": 12345 } ### Associative Response (45) { "type": 45, "id": $id, "kind": "obj" "contents": { "Hello": { "type": "Poodle", "handle": 4242, "concrete": true, "container": false }, "Goodbye": { "type": "Poodle", "handle": 4242, "concrete": true, "container": false } } } MoarVM-2018.03/docs/exceptions.markdown0000644000175000017510000002343713111771622020072 0ustar samanthasamantha# Exceptions Exceptions in MoarVM need to handle a range of cases. There exist both control exceptions (last/next/redo) where we want to reach the handler in the most expedient way possible, unwinding the stack as we go, and probably just do a goto instruction. In these cases, we don't expect to need any kind of exception object. At the other end of the scale, there are Perl 6 exceptions. These want to run the handler in the dynamic scope of the exception, and potentially resume rather than unwinding. These differences are properties of the handler rather than the exception; a CONTROL is interested in being run on the stack top when a "next" reaches it, whereas a while loop's handler for that just wants control delivered to the appropriate place. ## Handlers Handlers are associated with (static) frames. A handler consists of: * The start of the protected region (an offset from the frame's bytecode start) * The end of the protected region (an offset from the frame's bytecode start) * An exception category filter: * 1 = Catch Exception * 2 = Control Exception * 4 = Next * 8 = Redo * 16 = Last * 32 = Return * 64 = Unwind (triggers if we unwind out of it due to an exception being thrown; normal block exits do not cause this) * A handler action * 0 = Unwind any required frames, then goto the specified address. It is not possible to get any exception object or do any kind of rethrow. * 1 = Unwind any required frames, then goto the specified address. An exception object is available. This kind of handler leaves a handler record active on the stack, which the handler should remove by doing a rethrow or making the exception handled. * 2 = Invoke the specified block, and unwind unless it chooses to resume. Once the block returns, the handler is over. * In the case of a goto address handler, the offset of the handler * In the case of a block handler, the register in the frame that holds the block to invoke. The block should take no parameters. A bitwise `and` between the category filter and the category of the exception being thrown is used to check if the handler is applicable. Note that an Unwind handler is never actually set as the category of an exception; these are just for triggering actions during unwinds due to other exceptions. In the case of an unwind handler, the current exception is thus the one to blame for the unwinding. It is expected that an unwind handler will always rethrow once it's done what is needed. ## Handler representation in MAST The MAST::HandlerScope node indicates the instructions covered by handler and details of the kind of handler it is. See the MAST node definitions for more. ## Handler representation in bytecode Handlers are stored per frame and listed in a table. It is important that more deeply nested handlers appear in the table earlier than those lexically outer to them. This is really a job for the MAST to Bytecode compiler, since the MAST encodes the structure as nested nodes. Really, though, it's just a case of writing an entry into the frame's table after the node has been processed. See the bytecode specification for details. ## Exception Objects Some opcodes exist for creating exception objects and working with them. An exception object is anything with the VMException representation. Note that most HLLs will wish to attach their own objects as the payload. ### exception w(obj) Gets the exception currently being handled. Only valid in the scope of handler. ### handled r(obj) Marks the specified exception as handled. Only valid in the scope of a handler for the specified exception. Also, only required for goto handlers that also include an exception object. ### newexception w(obj) Creates a new exception object, based on the current HLL's configured exception type object or using BOOTException otherwise. By default it has an empty message and a category of 1 (a catch exception). ### bindexmessage r(obj), r(str) Sets the exception object's string message. ### bindexpayload r(obj), r(obj) Sets the exception object's payload (some other object). ### bindexcategory r(obj), r(int64) Sets the exception object's category ### getexmessage w(str), r(obj) Gets the exception object's string message. ### getexpayload W(obj), r(obj) Gets the exception object's payload. ### getexcategory w(int64), r(obj) Gets the exception object's category ## Throwing Exceptions There are various instructions for throwing a new exception object. throwdyn w(obj) r(obj) throwlex w(obj) r(obj) throwlexotic w(obj) r(obj) There are also instructions for throwing a particular category of exception without first creating an exception object. throwcatdyn w(obj) int64 throwcatlex w(obj) int64 throwcatlexotic w(obj) int64 These will only produce an exception object for handlers that need it. The object that is produced will have a null message and payload, so only its category will be of interest. These are mostly intended for control exceptions. Finally, for convenience, there is also: die w(obj) r(str) Which creates a catch exception with a string message and throws it. One may wonder why all of these throw instructions take a register to write into. This is because a handler that invokes in the dynamic scope of the throw has the option to prevent stack unwinding by instead indicating that execution be resumed. When it does so, it specifies an argument for the resumption; this argument is then written into the register should resumption take place. As for the dyn/lex/lexotic difference: * dyn means "search caller" * lex means "search outer", with the caveat that the outer must also be on the caller chain too * lexotic combines the two; for each entry in the dynamic scope, we scan all outers from that point; note that such an outer should also be in the call chain ## Rethrowing Sometimes, a handler may want to look at an exception, see if it's what it expects to handle, and if not pass it along as if the handler never saw it. This is the job of rethrow. A rethrow may only be used on the exception currently being handled. It is a simple instruction: rethrow Since it's always about the exception for the current handler, there's no need to say what should be rethrown. ## Goto handlers that access exception objects and may rethrow A goto handler that is allowed to get the exception object and/or rethrow it must mark the point they consider the handler over in the case they do not rethrow. The op for this is simply: handled r(obj) Note that if, while the handler is active, another exception is thrown and unwinds the stack past this handler, that's fine. ## Overall mechanism A stack of current handlers is maintained. Note that this is handlers we've actually invoked as the result of an exception being thrown (there may be many handler scopes that we are in, but only those that are presently handling exceptions get an entry on the stack). When we search for handlers to invoke, any active handler is automatically skipped, so that a handler can never catch an exception thrown within it. Otherwise, you can easily imagine a mass of hangs. When an exception is thrown, some pieces of information are initially needed: * The category, CAT * The exception object, OBJ * How to search (dyn, lex, lexotic), MODE * The current scope, SCOPE * The curent thread's active handler stack, HSTACK Here is the overall algorithm in pseudo-code. XXX TODO: Finish this up. :-) search_frame_handlers(f, cat): for h in f.handlers if h.category_mask & cat if f.pc >= h.from && f.pc < h.to if !in_handler_stack(HSTACK, h) return h return NULL search_for_handler_from(f, mode, cat) if mode == LEXOTIC while f != NULL h = search_for_handler_from(f, LEX, cat) if h != NULL return h f = f.caller else while f != NULL h = search_frame_handlers(f, cat) if h != NULL return h if mode == DYN f = f.caller else if f == LEX f_maybe = f.outer while f_maybe != NULL && !is_in_caller_chain(f, f_maybe) f_maybe = f_maybe.outer f = f_maybe return NULL run_handler(h, target_scope) if h.mode == 0 unwind_to(target_scope) pc = h.goto return_to_runloop if h.mode == 1 unwind_to(target_scope) pc = h.goto push_handler(h, target_scope) return_to_runloop if h.mode == 2 unwind_to(target_scope) push_handler(h, target_scope) SCOPE.return_special = ... SCOPE.return_special_data = ... invoke(get_reg(target_scope, h.local_idx)) return_to_runloop if h.mode == 3 push_handler(h, target_scope) SCOPE.return_special = ... SCOPE.return_special_data = ... invoke(get_reg(target_scope, h.local_idx)) return_to_runloop panic_unhandled(scope, obj): note "Unahndled exception: " + obj.message note backtrace(scope) exit 1 panic_unhandled_cat(scope, cat): note "Unahndled exception of category " + category_name(cat) note backtrace(scope) exit 1 throw(mode): (h, target_scope) = search_for_handler_from(SCOPE, mode, CAT) if h == NULL panic_unhandled_cat(SCOPE, CAT) run_handler_(h, target_scope, obj) throwcat(mode): (h, target_scope) = search_for_handler_from(SCOPE, mode, CAT) if h == NULL panic_unhandled_cat(SCOPE, CAT) run_handler_(h, target_scope, NULL) handled(): HSTACK.pop() MoarVM-2018.03/docs/extops.markdown0000644000175000017510000003077613111771622017237 0ustar samanthasamantha## Extensions and Extension Ops [proposed/tentative] #### The MoarVM Opcodes Overview The MoarVM interpreter uses 16-bit opcodes. There are currently around 470 built-in ops, and it'll probably be around 500 once Rakudo's bootstrapped and passing spectest. The interpreter loop currently dispatches by op number, either using switch/case or cgoto where available. Many opcodes are self-contained (they don't call other C functions, and some don't even make system calls), but lots and lots of them do call functions. Since the ./moar binary is statically-linked (mostly), the link-time code generation and optimization by modern compilers should do a pretty good job of making such things optimal [please excuse the truism]. However, in the case of dynamically loaded extensions to the VM that need to dynamically load native libraries with a C ABI (nearly all native libraries have a build that exposes such a thing), the function pointers must be resolved at runtime after the library is loaded. Perl 6's NativeCall module (using dyncall on parrot) can load libraries by name and enumerate/locate entry points and functions by name. I propose to use the dyncall functionality to load MoarVM extensions and resolve function pointers. The following is a draft design/spec doc for how that might look: ---------------------------------------------------------------- #### Representing Extension Op Calls on Disk and in Memory In a table in the .moarvm disk representation of the bytecode, each extension op invoked from that compilation unit has an entry with: 1. a (16-bit) index into the string heap representing the fully-qualified (namespace included) name of the op, and 2. the op signature, a byte for each operand, zer-padded to 8 bytes. In the in-memory (deserialized) representation of the compilation unit, each record also has room to store the cache of the function pointer representing the C function to which the op was resolved. Each distinct op called from that compilation unit is encoded in the executable bytecode as its index in the extension op table plus 1024 (the first 1024 being reserved for MoarVM itself). #### Loading Code That Calls Extension Ops During bytecode validation (on-demand upon first invocation of a frame), when the validator comes across an opcode >= 1024, it subtracts 1024 and checks that the resulting index is less than the number of extension op calls proscribed by the compunit. Then it gets that extop call record (MVMExtOpCall) from the table, and if the record has a function pointer, it calls it with the sole arg (MVMThreadContext tc). If the function call slot is NULL, it means the function pointer hasn't been resolved for this compunit, but also that the signature hasn't yet been validated against the version of that opcode that was loaded by its dependencies (if it was!). First the validator does a hash lookup to check whether the extop has been loaded at all (this requires a mutex protection, unless we're by then using a lock-free HLL hash for this), then if it hasn't, it throws a bytecode validation exception. If it has been loaded (by itself or by a dependency), it compares the signatures of the call in the compunit whose frame is being validated against the signature of the loaded op by that name, and if they don't match, throw a bytecode validation exception: "extension op call signature mismatch - the op's old signature (xxxx) was deprecated? You tried to load a call with signature ." If the signatures matched, operand type validation of the actual passed parameters (register indexes) proceeds normally, using the extop's signature. The validator copies the function pointer from the process-wide registry into the in-memory record of the extop call in that compunit. #### Loading Extensions When a compilation unit is loaded, its "load" entry point routine calls its INIT block (if it has one), which does something like the example below, registering the native function pointers and their signatures with the runtime. It communicates with the runtime via the currently-compiling compiler (as there is generally a World-aware HLL compiler calling ModuleLoader). To start, it simply uses NativeCall to fetch each function pointer (but there are plenty of optimization opportunities there). #### Examples The below example purports to show the contents of a skeleton extension as it would look to a developer. (please excuse incorrect syntax; it's pseudo- code in some places. ;) helper package (part of the MoarVM/NQP runtime) - MoarVM/CustomOps.p6: ```Perl package MoarVM::CustomOps; use NativeCall; # If we're compiling the innermost layer (and not just loading it at INIT time) # at *compile-time* of the compilation unit surrounding the INIT block we # assume we are in, inject the symbol into the innermost World outside of us. # ALSO, do the same thing at INIT-time (using nqp::extop_install) when we have # already been compiled, as well as when we're compiling. sub install_ops($library_file, $c_prefix, $op_prefix, $names_sigs) is export { my $world = nqp::hllcompilerworld; my $opslib = native_lib($library_file); -> $name, $sig { my $fqon = "$op_prefix::$name"; nqp::extop_install($opslib, $fqon, "$c_prefix$name", $sig); $world.extop_compile($fqon, $sig) if $world.is_compiling; } for $names_sigs; } ``` Above, the nqp::hllcompilerworld op simply retrieves an appropriately named dynamic lexical of the current in-flight World object. That class will have an HLL method named extop_compile, detailed below. Notice the helper package uses NativeCall to find the function pointers via the native_function (or whatever it's named) routine. When each function pointer is passed to the extop_compile method of the in-flight World object, that method in the HLL compiler will pass the function pointer to a special internal opcode (nqp::extop_install) that takes the NativeCall library object, the fully qualified name of the op as it will appear in the HLL source code (namespace ::opname), and a string representing the register signature (a la parrot's op signatures), so the bytecode validator knows how to validate its register args. ```Perl class World { # NQP snippet # at *compile-time* of the compilation unit surrounding the INIT block # we assume we are in, inject the symbol into the innermost World outside of # us. method extop_compile($fqon, $addr, $sig) { my $cu := self.current_compunit; my %extops := $cu.extop_calls; nqp::die("op $fqon already installed!") if nqp::has_key(%extops, $fqon); nqp::push($cu.extop_table, $fqon); %extops{$fqon} := $cu.next_extop++; } ``` Since the custom ops are resolved "by name" (sort of) upon bytecode loading, we don't have to worry about Rakudo bootstrapping, since in order to install the custom ops for Rakudo, we can simply rely on the compiler (in NQP) to generate the appropriate loading/installing code. core/bytecode.c excerpt - nqp::extop_install: ```C #include "moar.h" typedef struct _MVMExtOpRecord { /* name of the op, including namespace:: prefix */ MVMString *opname; /* string representing signature */ MVMString *signature; /* the function pointer (see below for signature/macro) */ MVMCustomOp *function_ptr; /* number of bytes the interpreter should advance the cur_op pointer */ MVMint32 op_size; /* (speculative/future) function pointer to the code in C that the JIT can call to generate an AST for the operation, for super-ultra-awesome optimization possibilities (when pigs fly! ;) */ /* MVMCustomOpJITtoMAST * jittomast_ptr; */ /* so the record can be in a hash too (so a compiler or JIT can access the upper code at runtime in order to inline or optimize stuff) */ UT_hash_handle hash_handle; } MVMExtOpRecord; /* Resolve the function pointer and nstall the op at runtime. */ void MVM_bytecode_extop_install(MVMThreadContext *tc, MVMObject *library, MVMString *opname, MVMString *funcname, MVMString *signature) { /* TODO: protect with a mutex */ /* must also grab thread creation mutex b/c we have to update the tc->interp_customops pointer of all the threads */ MVMCustomOp *function_ptr = NULL; MVMExtOpRecord *customops, *customop; MVMuint16 opidx = tc->instance->nextcustomop++; void *kdata; size_t klen; MVM_HASH_GET(tc, tc->instance->customops_hash, opname, customop); if (customop) MVM_panic(tc, "already installed custom op by this name"); customops = tc->instance->customops; if (customops == NULL) { customops = tc->instance->customops = calloc( sizeof(MVMExtOpRecord), (tc->instance->customops_size = 256)); } else if (opidx == tc->instance->customops_size) { customops = tc->instance->customops = realloc(tc->instance->customops, (tc->instance->customops_size *= 2)); memset(tc->instance->customops + tc->instance->customops_size/2, 0, tc->instance->customops_size / 2 * sizeof(MVMExtOpRecord)); } customop = customops + opidx; customop->opname = opname; customop->signature = signature; customop->op_size = MVM_bytecode_extop_compute_opsize(tc, signature); /* use the NativeCall API directly to grab the function pointer using the cached library object */ customop->function_ptr = MVM_nativecall_function_ptr(tc, library, funcname); /* the name strings should always be in a string heap already, so don't need GC root */ HASH_ADD_KEYPTR(hash_handle, tc->instance->customops_hash, kdata, klen, customop); } ``` core/interp.c excerpt - the invocation of nqp::customopcall's replacements: ```C MVMExtOpRecord *customops = tc->instance->customops; tc->interp_customops = &customops; #define EXTOP_OFFSET 4096 case MVM_OP_BANK_16: case MVM_OP_BANK_17: ... case MVM_OP_BANK_126: case MVM_OP_BANK_127: { MVMExtOpRecord *op_record = &customops[*(MVMuint16 *)cur_op++ - EXTOP_OFFSET]; MVMCustomOp *function_ptr = op_record->function_ptr; function_ptr(tc); cur_op += op_record->op_size; break; } ``` example extension (loading the rakudo ops dynamically) - Rakudo/Ops.p6 (or NQP): ```Perl package Rakudo::Ops; INIT { use MoarVM::CustomOps; install_ops('rakudo_ops.lib', 'MVM_rakudo_op_', 'rakudo', [ 'additivitation', 'iii', 'concatenationize', 'sss', ]); } # Both at compile-time and run-time of the below code, INIT will have run # and the following ops are installed the right namespaces and such. my $z = rakudo::concatenationize(rakudo::additivitation(44, 66), "blah"); # note: since the types of the custom ops' operands are known to the # HLL compiler, it just does its normal thing of generating code to # auto-coerce the resulting integer from the addition to a string # for the concat custom op. ``` moar.h excerpt (note the injecting of 1 offset if it's not the result reg): ```C #define REG(idx) \ (reg_base[*((MVMuint16 *)(cur_op + ((idx) > 0 ? idx + 1 : 0)))]) ``` Note: The type checks should be compile-time optimized-away by all but the stupidest of C compilers. Though they fail at runtime, I consider that "fail fast" enough, as this is simply a best-effort attempt at a coder convenience type-check, not a rigorous one to actually enforce that the register type signature passed to the runtime opcode installation routine in the HLL code actually matches the one defined/used in the C source code. moar.h excerpt (continued): ```C #define MVM_CUSTOM_OP(opname, block) \ \ void opname(MVMThreadContext *tc) { \ MVMuint8 *cur_op = *tc->interp_cur_op; \ MVMRegister *reg_base = *tc->interp_reg_base; \ MVMCompUnit *cu = *tc->interp_cu; \ block; \ } typedef MVM_CUSTOM_OP((*MVMCustomOp)); ``` rakudo_ops.c ```C #include "moar.h" MVM_CUSTOM_OP(MVM_rakudo_op_additivitation, { REG(0).i = REG(1).i + REG(2).i; }) MVM_CUSTOM_OP(MVM_rakudo_op_concatenationize, { REG(0).s = MVM_string_concatenate(tc, REG(1).s, REG(2).s); }) ``` validation.c excerpt (verify extop arg types and inline the real oprecord offsets): ```C /* similar to the actual interpreter, grab the MVMExtOpRecord, but simply validate each operand type specified for the extop with the types and count of the registers specified in the bytecode, by enumerating each character in the signature. If it hasn't been checked already, compare the signature of the loaded extop by that name against the signature of the extop by that name that was stored in the compilation unit when it was loaded from disk, if it was. Cache the function pointer if it wasn't already. */ ``` MoarVM-2018.03/docs/gc.markdown0000644000175000017510000001042613111771622016274 0ustar samanthasamantha# Garbage Collection in MoarVM Garbage collection in MoarVM can be characterized as: * Generational (two generations, the young one being know as the nursery) * Parallel (multiple threads may participate in GC) * Semi-space copying (only in the young generation) * Stop the world (all threads are paused while collection takes place) * Precise (we always know what is a pointer and what is not) Finalization calls to free non-garbage-collectable resources happen asynchronously with mutator execution. ## Thread Locality Every thread has its own semi-space nursery and generation 2 size-separated area. This is so it can do bump-pointer allocation and promotion to gen-2 without the need for synchronization during execution, and also as most objects will be thread-local. This doesn't mean objects cannot be accessed by other threads or have their only living reference known just by an object in another thread's memory space. ## How Objects Support Collection Each object has space for flags, some of which are used for GC-related purposes. Additionally, objects all have space for a forwarding pointer, which is used by the GC as it goes about copying. ## How Collection Is Started For collection to begin, all threads must be paused. The thread that wishes to initiate a collection races to set the in_gc flag in the MVM_Instance struct. If it succeeds, it then visits all other threads and flags that they must suspend execution and do a GC run. If it fails, then it was at a GC-safe point anyway, so it just waits for everyone else to be. At each GC-safe point, threads check in their thread-context struct to see if a GC run needs to be started. It indicates that it has paused, and then proceeds to add any relevant thread-local roots to the thread's work list. Note that any roots that could possibly be touched by another thread must NOT be scanned at this point, as another mutator thread could still be running and modify them, creating potential for lost references. Once all threads indicate they have stopped execution, the GC run can go ahead. ## Nursery Collections Processing the worklist involves: * Taking an item from the list * Ensuring it didn't already get copied; if so, ignore it * Racing to write a busy value into the forwarding pointer * If we lose the race, go to the next object in the list * Scanning the object and putting any nursery pointers found and not yet copied into our work list * If it has survived a previous nursery collection, move it into the older generation * Otherwise, copy it to tospace (needs to care if the target tospace is not ours - since we expect most objects not to survive, probably OK to do synchronized operations to bump the tospace pointer) * Finally, update any pointers we discovered that point to the now-moved objects ## Full Collections Every N GC runs will be a full collection, and generation 2 will be collected as well as generation 1. ## Write Barrier All writes into an object in the second generation from an object in the nursery must be added to a remembered set. This is done through a write barrier. ## MVMROOT Being able to move objects relies on being able to find and update all of the references to them. And, since MoarVM is written in C, that includes those references on the C stack. Consider this bit of code, which is the (general, unoptimized) path for boxing strings: MVMObject * MVM_repr_box_str( MVMThreadContext *tc, MVMObject *type, MVMString *val ) { MVMObject *res; MVMROOT(tc, val, { res = MVM_repr_alloc_init(tc, type); MVM_repr_set_str(tc, res, val); }); return res; } It receives val, which is a string to box. Note that strings are garbage- collectable objects in MoarVM, and so may move. It then allocates a box of the specified type (for example, Perl 6’s Str), and puts the string inside of it. Since MVM_repr_alloc_init allocates an object, it may trigger garbage collection. And that in turn may move the object pointed to by val – meaning that the val pointer needs updating. The MVMROOT macro is used in order to add the memory address of val on the C stack to the set of roots that the GC considers and updates, thus ensuring that even if the allocation of the box triggers garbage collection, this code won’t end up with an old val pointer. MoarVM-2018.03/docs/interpreter.markdown0000644000175000017510000000173713111771622020253 0ustar samanthasamantha# MoarVM Intepreter ## Ops and Op Banks The interpreter first dispatches on op bank, then on the code within that. For the core and primitive operations, that is done through a switch that is inlined directly inside of the interpreter. The list of ops is held in src/core/oplist. This is processed by the tools/update_ops_h.p6 tool to generate src/core/ops.h and ops.c, which contain all of the metadata about the operations and operation banks. ## Nested Runloops - Just Say No There is no notion of "nested runloop"; any call into C land that wants to call back into the interpreter must persist enough information to allow it to continue its work later. It does this by saving that info into a frame and specifying a callback to resume the work. In essence, it needs to be written out as a state machine. That state machine will be called back into when a C frame is returned to. This is not particularly fun. Nested runloops and continuation barrier issues are even less fun, though. MoarVM-2018.03/docs/japhb-todo.txt0000644000175000017510000000317413111771622016731 0ustar samanthasamantha* Build improvements + Add a make realclean to cross compiler Makefile to nuke debug files * WIP: gcc warnings cleanup + WIP: -Wall - DONE: -Wparentheses - DONE: -Wreturn-type . All are in src/6model/reprs.c, because of exception-throwing stubs; may have to explicitly ignore this using the second (granular) method of: http://dbp-consulting.com/tutorials/SuppressingGCCWarnings.html - -Wpointer-sign . A lot of this is in correct handling of encoded string buffers; use MVMuint8* for this - -Wimplicit-function-declaration . Header fixes? - -Wunused-but-set-variable - -Wunused-function - -Wunused-variable + -Wall -Wextra + -Wall -Wextra -pedantic + Turn on -Werror -pedantic-error * Make sure that all visible names have an MVM or MVM_ prefix, except for those intended to be the same across all NQP backends * Review type checking of MoarVM bytecode validator * Document ops + Write oplist / docs merging program - =op copies oplist info into doc - multiple ops can (e.g. type variants) can have one description - checks for undocumented ops or no-longer-supported ops + Document, document, document .... * Compare interpreter performance v. SSVM: + Original SSVM version: - my $a = 100_000_000; my $b = 3; my $c = 6; while ($a--) { $c += $b }; say $c; - MoarVM is 1.96x -> 4.16x slower at tight loop raw opt dispatch, depending on gcc opt settings (-O3 -> no opt) - compare with and without 'inc' and other SSVM tricks + jnthn++'s 2013-01-28 version: - nqp -e "sub foo() { }; my $i := 0; while $i++ < 100000000 { foo() }; say($i)" MoarVM-2018.03/docs/jit/ir.md0000644000175000017510000002561413202647036015670 0ustar samanthasamantha# Expression 'Tree' Intermediate Representation The 'expression tree' IR has been developed to support low-level optimization and advanced code generation. This document describes this representation, the way it is generated, and the way it is consumed. You may need this document in order to develop specialised JIT support for a graph, add support for newly developed VM opcodes, or to help in debugging. ## Template Syntax Expression trees are built from the MoarVM bytecode using tree templates, which are defined in a textual format. This textual format has been designed for (implementation) simplicity rather than for convenience. It's not very difficult, but it is very rigid - mistakes are not tolerated. These templates are defined in a expression list file. This file is then compiled to a C header file that supplies the expression tree builder with templates The expression template compiler is located in 'tools/expr-template-compiler.pl' and can be invoked as such: perl -Itools/ tools/expr-template-compiler.pl \ -o output-header-file.h input-file.expr Note that expression list elements are always translated to (constant) expressions in a C array and are subject to the limits of such constant expressions. A single *list* opens with a '(' and closes with ')'. Between the parentheses there can be words, numbers, and nested lists. A syntactically correct (but meaningless)n list is: (foo 32 (bar baz)) A template definition is a list that starts with the keyword *template:* followed by the *opcode name* for which the template is defined, and finally the *template list*. An especially simple template that yields constants NULL pointer is: (template: null_s (const 0 ptr_sz)) A template list consists of *node name*, zero or more *child nodes*, and zero or more *arguments*. The const node above has zero child nodes and two arguments, first the constant value and second the value size. A simple example of a nested template list would be inc_i: (template: inc_i (add $0 (const 1 int_sz))) **Words** are defined in the usual way (alphanumeric characters interleaved with underscores), except that they may have *sigils* attached to them, modifying their meaning. Words without sigils attached are rendered uppercased and prefixed with **'MVM\_JIT\_'**. Thus, const is rendered as **MVM\_JIT\_CONST**, ptr_sz as **MVM\_JIT\_PTR\_SZ**, etc. These names should refer to constants declared at compile time. A node name must be an unmodified word. **Substitutions** are indicated by a '$' prefix. In the inc\_i template, '$0' is a substition refering to the first operand of the inc\_i VM opcode. The substitution '$1' refers to the second operand, if any, '$2' to the third etc. Operand trees are constructed and linked into the template during expression tree construction. It is possible to create your own substitutions using the *let:* statement: (template: sp_p6oget_o (let: (($val (load (add (^p6obody $1) $2) ptr_sz)) (if (nz $val) $val (vmnull)))) The first subtree of the 'let:' statement is the *definition list*. A single *definition* consists of the *substitution name* and the template list that it defines. Definition lists are evaluated in left-to-right order, meaning that textually later definitions can refer to earlier definition ames. An important side effect of 'let:' is that *let: guarantees the evaluation order of defintions*. That is, the tree node represented by '$val' is computed before its reference in the 'if' expression following it. (This is not the case for operand nodes). Finally, note that 'let:' statements declare definitions in a single expression-wide scope and that redefinitions are not allowed. **Statement macros** are lists of which the node name start with an ampersand '&'. These lists are compiled to C-macro invocations. Arguments to the macro (the other elements in the list) are reproduced verbatim, and nested lists are NOT supported. For example: (&MACRO_NAME foo bar 3) Is translated to: MACRO_NAME(foo, bar, 3) The most common use of this is actually to use the sizeof() and offsetof() expressions in field access, but it can also be used to generate a constant pointer or a message string, provided you use the appropriate C macro hackery. **Tree macros** are a facility implemented by the template preprocessor to aid in developing templates. Tree macros are indicated by a '^' prefix. For instance, the '(^p6obody $1)' list above is the invocation of a tree macro. A tree macro is substituted directly into the invoking expression while the template is being compiled. They differ from substitutions in two respects: * substitutions are local (only valid within the scope of a let: expression), while macros are globally defined. Thus, macros can be used as a building block for templates, and substitutions can only be used within a template. * substitutions are *linked* into the resulting tree, thus two references of the same substitution refer to the same IR tree nodes. Tree macros are *spliced* into the tree, so two invocations refer to two different trees. (These trees may be resolved to be equal when using common subexpression evaluation, but that's a separate issue). A tree macro is defined using the 'macro:' keyword, followed by the macro name (including the '^' prefix), a list of macro arguments, and the actual macro list. For example, the '^spesh_slot' macro is implemented as: (macro: ^spesh_slot (,a) (idx (load (addr (frame) (&offsetof MVMFrame effective_spesh_slots))) ,a ptr_sz)) For visual clarity, macro arguments are indicated by a ',' prefix, like ,a. The arguments given to the macro (words, operands, numbers, substitution names, or entire trees) are spliced directly into the macro. In short, *tree macros are a syntax-level facility*, and you should expect no more of them. Finally, **comments** are lines starting with the '#' sign. Space or text before this sign is not allowed. ## Stores MoarVM opcodes typically imply the storage of a computed value into a VM-level register. In most cases, this store operation is implicit into the template, and the expression tree builder inserts these stores as needed. For some opcodes, this does not work, because (for example) their VM-level implementation does not directly yield a value. An example would be the 'atpos' group of opcodes, which store their result directly into VM local memory: (template: atpos_o! (let: (($addr (copy $0))) (if (^is_type_obj $1) (store $addr (vmnull) ptr_sz) (call (load (addr (^repr $1) (&offsetof MVMREPROps pos_funcs.at_pos)) ptr_sz) (arglist 7 (carg (tc) ptr) (carg (^stable $1) ptr) (carg $1 ptr) (carg (^body $1) ptr) (carg $2 int) (carg $addr ptr) (carg (const ("E MVM_reg_obj_sz) int)) void)))) The $addr value refers to the address of output node. The template is marked with a '!' postfix to signal that the expression yields no value and takes care of storing the result itself. Because it yields no value, it cannot be used as an intermediate result in the expression. (Because it also emits a function call, it also invalidates the current register context, but that is another problem). # Tree Structure As noted above, the expression tree consists of *nodes*, which have *children* and *arguments*. Children must always be references to other nodes. Arguments on the other hand are intepreted directly as integers. The file 'src/jit/expr.h' defines all node types supported by the JIT compiler. Some node types take a variable number of children, which is indicated by a negative number in their node definition. For example, the **ALL** node type may take any number of expressions that yield a truth value (a **FLAG** value in JIT nomenclature), and yields true only when all of them do (much like C-style boolean '&&'). The *first chld* of any variadic node must be a constant number indicating the number of children. As a rule, variadic nodes do not take arguments, although that rule is not really strictly enforced. Some other variadic nodes are **DO**, **ANY** and **ARGLIST**. ## Roots The compilation order of the expression tree is determined by the tree *roots*. Roots are simply ordered indices into the tree that correspond (in principle) to the order of instructions in MoarVM bytecode, although we reserve the right to reorder them in a consistent way. (It is by adding roots that the 'let:' statement ensures an evaluation order). ## Traversal The Expression Tree IR exposes a mechanism using for preorder, inorder and postorder traversal. This is achieved by defining a MVMJitTreeTraverser structure and starting MVM\_jit\_expr\_tree\_traverse(). struct MVMJitTreeTraverser { void (*preorder)(MVMThreadContext *tc, MVMJitTreeTraverser *traverser, MVMJitExprTree *tree, MVMint32 node); void (*inorder)(MVMThreadContext *tc, MVMJitTreeTraverser *traverser, MVMJitExprTree *tree, MVMint32 node, MVMint32 child); void (*postorder)(MVMThreadContext *tc, MVMJitTreeTraverser *traverser, MVMJitExprTree *tree, MVMint32 node); void *data; MVMint32 *visits; }; The data pointer is supposed to point to a user-supplied data structure. The visits array is filled with the number of times a certain node is visited. (Because the tree is really a DAG, a node can be visited many times). It is suggested you use this to decide whether to reevaluate your code. In most cases, I find that you don't want revisiting behaviour. ## Node information The default tree structure does not supply much information beyond the structure of the graph. Additional knowledge is encoded in the tree->info array, which is populated during various passes through the code. I reserve the right to add and remove fields at will, but some significant fields are: * **value** - the MVMJitExprValue structure that holds information related to the value of this node (i.e. what register it is compiled too, the size of the value, or the memory address it refers too). * **tile** - the MVMJitTile* that defines how this value will be compiled to machine code. * **op_info** - Static information on this JIT node, e.g. the number of args and number of children. * **spesh_ins** - The MVMSpeshIns* of which this value is the root, which is probably useful information for optimization, because it can include type and usage information. ## Value types The JIT IR defines a non-strict and overlapping set of value types, most importantly REG, MEM, LBL, FLAG, and VOID - the primary tile result types - and INT, NUM, and PTR which are mostly useful to indicate C function arguments. It is quite essential that C function arguments are given their correct class to ensure that they are placed in the correct registers. MoarVM-2018.03/docs/jit/overview.org0000644000175000017510000007605613202647036017321 0ustar samanthasamantha#+TITLE: MoarVM JIT compiler overview * Introduction This document attempts to describe the structure of the MoarVM JIT compiler and document some of the design decisions that shape it. * Components ** Dynamic optimizer This part is noteworthy because it is not, in fact, part of the JIT compiler at all. It is a separate subsystem that handles all of the type logging, graph construction and rewriting, call inlining - in short, all of the interesting optimizations of a dynamic language system. The JIT (legacy and 'expression') is a code-generation backend for this system. MoarVM is rather unique in this since in most systems, the order is reversed. In contrast to what might be called 'language-level' optimizations implemented by spesh, the objective of the JIT is to remove intepreter-level inefficiencies. ** 'Lego' JIT compiler The legacy or 'lego' JIT compiler was the first to be developed back in 2014. It has this name because it works by emitting independent fragments of machine code that are stitched together. These fragments are mapped directly from the 'spesh graph' (representing a MoarVM subroutine or 'frame') that is the input to the compiler. There are very few optimizations applied by the legacy compiler (one notable optimization is the inlining of a polymorphic REPR function pointer if the type of the object is known). The lego JIT produces a structure called the 'JIT graph', which, while a technically correct name, is a bit of a misnomer since it is really a singly-linked list. It uses labels rather than an explicit control flow graph (like spesh does) to indicate internal structure. The JIT graph is then compiled to JIT code. There is in fact little reason to maintain this two-phase setup; the legacy JIT could work just as well in a single phase. Even for the new JIT, the legacy JIT provides the necessary scaffolding to integrate with the interpreter (such as a proper function prologue and epilogue, support for exceptions and invokish operators, and the various bits and pieces required for correct deoptimization. ** DynASM assembler DynASM is a third-party library from the [[http://www.luajit.org/][luajit]] project that we've modified to support register addressing on the x86-64 architecture. It allows you to interleave the assembly code you'd like to emit with the C code that does the regular compiling business. DynASM has two parts: + A lua script to preprocess a 'dasc' (which is C interleaved with assembly code) file and output a C file. + A C header to #include into the generated C file that contains all the functions to assemble and link the machine code at runtime DynASM source files are architecture-specific. ** Expression trees The expression 'tree' is the intermediate format of the new 'expression' JIT compiler. The tree is a technically incorrect misnomer - it actually represents a graph. The expression tree is built from a spesh graph by mapping MoarVM instructions to templates. These templates are written in a textual format by a human (or perhaps a script), that is /precompiled/ to a header file during MoarVM compilation. Take note that while the expression templates look a bit like a high-level language some may be familiar with, the concepts it expresses are decidedly 'low-level' and can be mapped more-or-less directly to the machine code of a hypothetical RISC CPU. *** Syntax The syntax used for expression templates is derived from LISP. + Lists are the basic constructs of the language. A list is delimited by opening ='('= and closing =')'= parentheses. Lists can be nested. Items in the lists are separated by whitespace. + A word is anything that matches the perl regular expression of =[^\s\(\)#"']=. + A word that consists only of alphanumeric symbols (and possibly underline) is called a /symbol/: =sp_p6oget_o=. The first symbol in a list is generally it's /operator/. + Suffixed by =:= is generally a /keyword/, e.g. =let:= + Prefixed by =$= is a /reference/, either to a MoarVM instruction operand (=$1=, =$2=) or to a declared name (=$val=). + Prefixed by =^= invokes a /list macro/, which can be declared with the =macro:= keyword. + Macro /parameters/ are prefixed by =,= (e.g. =,obj=), and they are replaced with whatever symbol or list is 'bound' to them when the macro is invoked. + Parameter macro's are indicated by a prefix =&=, e.g. =&sizeof=. They are always substituted with a function macro: =(&sizeof foo)= becomes =sizeof(foo)=. These /must/ form constant expressions at compilation time. + A string is anything delimited by ="= - but note that /escape sequences/ are not supported, so ="foo \" bar"= doesn't do what you might think it does An example of a template definition would be as follows: #+BEGIN_SRC scheme (template: sp_p6oget_o (let: (($val (load (add (^p6obody $1) $2) ptr_sz))) (if (nz $val) $val (^vmnull)))) #+END_SRC The =let:= keyword is not an operator but a special construct for the template precompiler. It allows the declaration of names for values that are computed and reused in further operators. And an example of a macro definition would be: #+BEGIN_SRC scheme (macro: ^getf (,object ,type ,field) (load (addr ,object (&offsetof ,type ,field)) (&SIZEOF_MEMBER ,type ,field))) #+END_SRC *** Operators These are all the operators that are known by the expression language as of today (<2017-09-25 Mon>). | Operator | Shape | Type | Semantics | |-----------+----------------------------------+----------+--------------------------------------------------------| | =LOAD= | =(load reg $size)= | =reg= | Load a value from a memory address | | =STORE= | =(store reg reg $size)= | =void= | Store a value to a memory address | | =CONST= | =(const $value $size)= | =reg= | Load a constant value to a register | | =ADDR= | =(addr reg $ofs)= | =reg= | Add a constant offset to a pointer | | =IDX= | =(idx reg reg $scale)= | =reg= | Compute a pointer for an index in an array | | =COPY= | =(copy reg)= | =reg= | Copy this value (opaque to tiling) | |-----------+----------------------------------+----------+--------------------------------------------------------| | =LT= | =(lt reg reg)= | =flag= | First operand is smaller than second | | =LE= | =(le reg reg)= | =flag= | First operand is smaller than or equal to second | | =EQ= | =(eq reg reg)= | =flag= | First operand is equal to second | | =NE= | =(ne reg reg)= | =flag= | First operand is not equal to second | | =GE= | =(ge reg reg)= | =flag= | First operand is larger than or equal to second | | =GT= | =(gt reg reg)= | =flag= | First operand is larger than second | | =NZ= | =(nz reg)= | =flag= | Operand is nonzero | | =ZR= | =(zr reg)= | =flag= | Operand equals zero | |-----------+----------------------------------+----------+--------------------------------------------------------| | =CAST= | =(cast reg $from $to $sign)= | =reg= | Convert a value from smaller to larger representation | | =FLAGVAL= | =(flagval flag)= | =reg= | Binary value of comparison operator | | =DISCARD= | =(discard reg)= | =void= | Discard value of child operator | |-----------+----------------------------------+----------+--------------------------------------------------------| | =ADD= | =(add reg reg)= | =reg= | Add two integer values | | =SUB= | =(sub reg reg)= | =reg= | Subtract second operand from first | | =AND= | =(and reg reg)= | =reg= | Binary AND (intersection) of two operands | | =OR= | =(or reg reg)= | =reg= | Binary OR (union) of two operands | | =XOR= | =(xor reg reg)= | =reg= | Binary XOR of two operands | | =NOT= | =(not reg)= | =reg= | Binary negation of operand | |-----------+----------------------------------+----------+--------------------------------------------------------| | =ALL= | =(all flag+)= | =flag= | Variadic short-circuit logical AND | | =ANY= | =(any flag+)= | =flag= | Variadic short-circuit logical OR | |-----------+----------------------------------+----------+--------------------------------------------------------| | =DO= | =(do void* reg)= | =reg= | Execute multiple statements and return last expression | | =DOV= | =(do void+)= | =void= | Execute multiple statements | | =WHEN= | =(when flag void)= | =void= | Execute statement if condition is met | | =IF= | =(if flag reg reg)= | =reg= | Yield value of conditional expression | | =IFV= | =(ifv flag void void)= | =void= | Conditionally execute one of two statements | |-----------+----------------------------------+----------+--------------------------------------------------------| | =BRANCH= | =(branch reg)= | =void= | Jump to code position | | =LABEL= | =(label $label)= | =reg= | Load position of code | | =MARK= | =(mark (label $label))= | =void= | Mark this position | |-----------+----------------------------------+----------+--------------------------------------------------------| | =CALL= | =(call reg (arglist ...) $size)= | =reg= | Call a function and return a value | | =CALLV= | =(call reg (arglist ...))= | =void= | Call a function without a return value | | =ARGLIST= | =(arglist (carg reg $type)+)= | =c_args= | Setup function call arguments | | =CARG= | =(carg reg $type)= | =void= | Annotate value with 'parameter type' | |-----------+----------------------------------+----------+--------------------------------------------------------| | =GUARD= | =(guard void $before $after)= | =void= | Wrap a statement with code before and after | |-----------+----------------------------------+----------+--------------------------------------------------------| | =TC= | =(tc)= | =reg= | Refer to MoarVM thread context | | =CU= | =(cu)= | =reg= | Refer to current compilation unit | | =LOCAL= | =(local)= | =reg= | Refer to current frame working memory | | =STACK= | =(stack)= | =reg= | Refer to top of C frame stack | *** Tree iteration and manipulation ** Instruction selection (tiler) Next to the register allocator, the instruction selection algorithm (or the 'tiler') is the most complex part of the JIT. It is fortunately fairly stable. The goal of tiling is to match the intermediate representation (the expression tree/graph) to the cheapest sequence of instructions on the target architecture (x86-64) that implements the semantics of the expression tree. The implementation is heavily based on the paper by [[http://dl.acm.org/citation.cfm?id=75700][Aho et al]] - and in fact, the expression tree IR was designed mostly to accomodate it. *** How tiling works The following is a necessarily incomplete description of the actual process - much better described by either the paper linked above or the source code that implements it. A 'tile' in the expression JIT describes a number of overlapping concepts, for which I rely on the reader to disambiguate by context. (Humans are good at that). + A /pattern/ that can be matched against an expression tree and which is defined textually, much like the expression templates. + An /object/ for the JIT compiler to represent a machine instruction, and + A /function/ that emits the machine code to the compiler buffer, with parameters substituted The textual 'tile definition' contains the name of the function that implements it (in the example below =store_addr= and =test_addr_const=), the /pattern/ that the tile matches, the /symbol/ that is substituted for the pattern in a succesful match, and the /cost/ of doing so (in terms of compiled code). #+BEGIN_SRC scheme (tile: store_addr (store (addr reg $ofs) reg $size) void 5) (tile: test_addr_const (nz (and (load (addr reg $ofs) $size) (const $val $size))) flag 4) #+END_SRC Conceptually, tiling is a process of /reducing/ the tree structure by replacing nodes by the /symbols/ defined by the tiles. The following example may serve as an illustration. Given the following set of tiles: | Tile | Pattern | Symbol | Assembly code | |---------+-------------------------+--------+--------------------------| | =local= | =(local)= | =reg= | =rbx= | | =const= | =(const $value)= | =reg= | =mov reg, $value= | | =addr= | =(addr reg $offset)= | =reg= | =lea reg, [reg+$offset]= | | =load= | =(load reg $size)= | =reg= | =mov out, [reg]= | | =add= | =(add reg reg)= | =reg= | =add reg1, reg2= | | =store= | =(store reg reg $size)= | =void= | =mov [reg1], reg2= | We can reduce a tree and generate code as follows (note that the order of reducing is bottom-up / postorder from left-to-right): | Tree | Tile | Code | |----------------------------------------------+----------------+----------------------| | =(add (load (addr (local) 0x8)) (const 17))= | =local -> reg= | | | =(add (load (addr reg 0x8)) (const 17))= | =addr -> reg= | =lea rax, [rbx+0x8]= | | =(add (load reg) (const 17))= | =load -> reg= | =mov rcx, [rax]= | | =(add reg (const 17))= | =const -> reg= | =mov rdx, 17= | | =(add reg reg)= | =add -> reg= | =add rcx, rdx= | Tiling /never/ takes constant parameters into account, which is a severe limitation - some operators are radically different between 8-bit and 64 bit sizes on x86-64. Maybe we can implement architecture-specific templates to optimize our way out of this. *** Picking tiles The difference between the model above and the real implementation are: + A tile can cover more complex expression trees (see the example tiles above) + A given subtree may be reduced by different sets of tiles, and + We'd like to choose the cheapest such set, and we'd like to do that efficiently. Before going further, be warned: the following is rather complex and even now it makes my head hurt. Feel free to skip this section. In order to figure out if a certain tile can be applied to a given tree, we'd need to know if it's pattern matches. The pattern matches if it's structure matches /and/ if the expressions 'below' it can be matched to the symbols at its leafs. Because the tiler uses postorder iteration, we can ensure that symbols have been assigned to the leafs when we consider the head operator of the tile. To avoid having to traverse the tree to find out if the leafs match to the pattern, during precompilation the tile patterns are 'flattened' and the nested lists replaced with 'synthetic symbols'. From the sublist a new (partial) tile pattern is generated that reduces to this generated symbol and compiles to nothing). See for some examples the table below. Because the resulting patterns are flat, they can be matched by inspecting only the symbols of the direct children of the operator. | Original | Flat | |--------------------------------------+-----------------------------| | =(load (addr reg)) -> reg= | =(load @sym1) -> reg= | | | =(addr reg) -> @sym1= | | =(store (addr reg) reg) -> void= | =(store @sym2 reg) -> void= | | | =(addr reg) -> @sym2= | | =(add reg (const)) -> reg= | =(add reg @sym3)= | | | =(const) -> @sym3= | | =(add reg (load (addr reg))) -> reg= | =(add reg @sym4) -> reg= | | | =(load @sym5) -> @sym4= | | | =(addr reg) -> @sym5= | From the table it is possible to see that a single tile list pattern (like '(addr reg)') can be reduced to many different symbols. In fact, given a set of tiles and their associated costs, we can compute all possible combinations of symbols (symbol sets) that a tile pattern can be reduced to /and/ we can also compute which tile would be the most efficient implementation of that operator given the symbol sets of it's children. By precomputing this information selecting the optimal tile for an operator can be reduced to a table lookup at runtime. For completeness I'll try to describe how the precomputation process works. The central concept it is based on is that of 'symbol sets' (symsets). We begin by initializing a map of all symbol sets, which are initially just the individual symbols that are generated by all tile patterns (called =@rules=). #+BEGIN_SRC perl $sets{$_->{sym}} = [$_->{sym}] for @rules; #+END_SRC And a reverse lookup table is also generated, from all symbols within a set, to all symbol sets that they occur in. Again, initially this is just the symbol itself. #+BEGIN_SRC perl while (my ($k, $v) = each %sets) { # Use a nested hash for set semantics $lookup{$_}{$k} = 1 for @$v; } #+END_SRC Then for each tile pattern, we lookup all symbols that could be combined with the symbols in the patterns, and we store the symbol that this reduces to. The name '%trie' is also kind of inaccurate, but it gets the picture accross, which is that this is a nested associated lookup table. The purpose is to /combine/ all tiles (and their associated symbols) that map to the *same symbol sets* together - because that means that these tiles can cover the same tree structures. #+BEGIN_SRC perl for my $s_k1 (keys %{$lookup{$sym1}}) { for my $s_k2 (keys %{$lookup{$sym2}}) { $trie{$head, $s_k1, $s_k2}{$rule_nr} = $rule->{sym}; } } #+END_SRC Having done that, we generate new symbol sets from this lookup table - all the values of the generated hashes are symbols that can be produced by tiles that map to the same trees: #+BEGIN_SRC perl my %new_sets; for my $gen (values %trie) { my @set = sort(main::uniq(values %$gen)); my $key = join(':', @set); $new_sets{$key} = [@set]; } #+END_SRC In general, we run this process multiple iterations with the new sets of symbols, because the symbolsets that exist influence the tile patterns that are considered to be equivalent. For instance, in the table above the tile patterns generating =@sym1=, =@sym2= and =@sym5= are equivalent, and so after a single iteration there will be only a single set containing those symbols. This means that the patterns of =(load @sym1)= and =(load @sym5)= are equivalent, and hence that =@sym4= is always combined with =reg=. So this process has to iterate until there are no more change in the sets, at which point it can read (from the same table) the all possible combinations of sets. Having this, it is a small matter to compute the cheapest tile of the set to cover a given tree [fn:cost]. #+BEGIN_SRC perl my (%seen, @rulesets); for my $symset (values %trie) { my @rule_nrs = main::sortn(keys %$symset); my $key = join $;, @rule_nrs; push @rulesets, [@rule_nrs] unless $seen{$key}++; } return @rulesets; #+END_SRC ** Register allocation The legacy JIT compiler did not require register allocation, because it never persisted values in registers between fragments. The expression JIT compiler does, that's the whole purpose of it. *** Earlier attempts There have been three attempts at implementing a register allocator for the expression JIT. Ironically, all of them have been based on the same algorithm, which is [[https://c9x.me/compile/bib/Wimmer10a.pdf][linear scan register allocation on SSA form]]. The first attempt tried to do register allocation 'online' with code generation, i.e. during tree walking. This does not work because you'll need to know the live range of the values your allocating, otherwise you don't know when a register can be freed, and you'll either run out or you might be incorrect when freeing them. Furthermore, you'll need to manage /aliases/, i.e. values that are the same (created by =COPY= operators) and nodes that 'merge' (created by =IF= opreators). Never mind the case where we compile a =CALL= node in a conditional block. The second attempt improved on that in two ways: + It made a real attempt to compute the live range extents of values. Initally based on tree iteration order; however, after introducing the tile list, based on tile list position (which is what we use now). + It used a 'cross-linked-list' to identify values that either shared a location or a definition. This was used to deal with aliases and merged values. However, this proved still not quite sufficient. It had inherited from the earlier online algorithm the design of /allocating/ a register for a value at the first instance it is encountered, and /assigning/ that register to instructions that use the value when they'd be encountered. Hence it required the ability to determine the 'current' position for a value, including if that value is spilled or not. This is somewhat complicated when a value is represented by multiple different things (due to aliasing and merging, in a cross-linked list). What is more, it would only try to resolve aliases at register-assignment time, i.e. when it'd encounter the relevant =COPY= or =IF= operator. So that would actually change the extent of the live range while it was 'under operation', which further complicates several key functionalities such as deciding when a register can be freed. *** Current implementation The third attempt is the current one and departs from the previous two attempts in the following crucial ways: + Rather than have a *value* be synonymous with its *definition* (the instruction and operator that created it) it represents a *set* of definitions and *uses* , that are joined together by aliases and merges. It uses a separate phase and a [[https://en.wikipedia.org/wiki/Disjoint-set_data_structure][union-find]] data structure to implement these values (which are called 'live ranges' consistently). This ensures that all uses of the 'same' value use the same register location for it. + During the allocation phase, it iterates over the *values* in ascending order (i.e. by first definition), rather than over the /instructions/ as the second version did or over the /tree/ as the first. A register can be reused only after its value has expired, which is when the algorithm iterates past its last use. This means that at a single point in the program, no two values can be allocated to the same register, which is /the/ essential correctness property for a register allocator. + Whenever a register is allocated, it is directly /assigned/ to the instructions that use its value. When that register is changed for whatever reason, we update it as well. Thus we never have to query 'what is the current location of the value of $x', which gets tricky to answer in case of spilling, and the register assigned to an instruction is always 'up to date'. + It is sometimes necessary to 'spill' a value from a register to memory, either because we need more registers or because the ABI forces us to - this is true for all register allocation algorithms. At any point in the program where it is necessary to spil a value, all instructions that define or use that value are wrapped with instructions to move that value between register and memory. (This ensures that the value is spilled to the same position in all possible code paths). The single live range that covered all these uses is then split into 'atomic' live ranges that cover only the instruction to load or store the value and the original instruction that would use or define it. The upshot is that a live range that is processed always refers to a value that resides in a register. + Because of value merging and aliasing, it is sometimes possible for a value to be undefined within its own life range. This can be demonstrated by code below. In it, =$a= is first defined as 10, then conditionally redefined as the result of =$a * 2 - 3=. So between the definition of =$b= and the assignment of the 'new' value of =$a=, the 'old' value of =$a = 10= is no longer valid. Hence, it should *not* be stored to memory at that point. Such undefined ranges are called 'live range holes', and they are an of example of the 'complexity waterbed' of compiling - SSA form code doesn't have them, but makes it really complicated to ensure the same register is allocated for all the separate uses of a value. #+BEGIN_SRC perl my $a = 10; if (rand < 0.5) { my $b = $a * 2; $a = $b - 3; } printf "\$a = %d\n", $a; #+END_SRC *** Function call ABI It is (unfortunately) necessary to have the register allocator handle the C function call ABI. This is because certain function arguments are supposed to be passed by in specific registers (meaning they have to be placed there) and some registers can be overwritten by the function that is called (in fact, all of them). So in the general case, the JIT needs to: + Place values in the correct registers and/or stack positions, making sure not to overwrite values that are still necessary for the call. + Load values from memory if they are not present in registers. Note that a function call can have more arguments than registers, so it is not always possible to load all values into registers prior to the call. So we cannot rely on the normal register allocator mechanisms to ensure a value is present. + Ensure all values that 'survive' the call are spilled to memory. This is currently implemented by a function =prepare_arglist_and_call= that is over 144 lines long and implements topological sort, cycle-breaking and register-conflict resolution with values used by the =CALL= operator itself (e.g. in dynamic dispatch). I feel like this functionality - rearranging registers to deal with register requirements of specific operators - could be generalized, but I'm not sure if it is worth it. The x86-64 instruction set has plenty of 'irregular' instructions that have specific register requirements however, virtually all of them use just the single =rax= register, which I've decided to keep as the spare register anyway. So I'm not sure what the value of generalizing would be, and I'm fairly sure it would introduce even more complexity. *** Challenges What is still necessary for completeness is the ability to allocate multiple register /classes/, specifically floating point registers. The suggested way of handling that is by giving out different number ranges per class, and letting the tiles sort out the details of getting the correct number. Another thing that is not necessary but certainly nice-to-have is a way to ensure that the register assignment actually meets the constraints of the target architecture. Specifically, while the expression JIT assumes a system that operates as follows: #+BEGIN_EXAMPLE a = operator(b, c) #+END_EXAMPLE What we actually have is on x86-64 is more like: #+BEGIN_EXAMPLE a = operator(a, b) #+END_EXAMPLE The situation is actually considerably more complex due to the many addressing modes that are possible. (For instance, indexed memory access uses a third register 'c'.). Currently we handle that in tiles by moving values arround, but it would be much nicer if the register allocator could enforce this constraint. (The allocator keeps a 'scratch' register free at all times for this purpose). Finally, the live range hole finding algorithm iterates over the basic blocks of the JIT code in backwards linear order, which is fine so long as there are no loops (the tile list control flow always flows forward), which is true so long as we only ever try to compile single basic blocks, but that is an assumption I'm explicitly trying to break. So I'll need to find a better, more general iteration order. ** Logging To aid debugging, the JIT compiler logs to file. This logging is adhoc and line-based (for the most part). It is not currently useful for general consumption or instrumentation. Adding to that, the linear scan allocator has numerous debug logging statements that are conditionally compiled in. It would probably be a nice improvement to write 'structural' logging information to the JIT or spesh log (that could be useful for instrumentation), and use conditionally compiled 'adhoc' logging statements solely for debugging. And it'd be nicer still to have conditional compilation on the section of JIT output that you'd really be interested in (e.g. expression building or register allocation). The JIT log is setup at initialization time in =src/moar.c=, based on the environment variable =MVM_JIT_LOG=. This is arguably not a good design for embedding; then again, for embedding, this is not a file you'd want to expose anyway. Expression trees and tile lists have their own loggers, which implement a more structured format. An expression tree log represents the tree as a directed graph in the 'dot' language. There's probably still some formatting we could apply to that, but on the whole I'm satisfied with that approach. The tile list logger represents each tile with a debug string, which is stored when the tiler table generator processes the tile pttern definitions. It also lists the basic block structure of the program. * Tools * Notes ** Memory management The JIT uses three different strategies for memory management: + Spesh region allocation for the JIT graph. + Dynamically allocated vectors for the expression tree, tile lists and related structures. + Anonymous memory pages for the generated machine code. *** Spesh region allocation The =spesh= dynamic optimization framework contains a region allocator that is bound to the spesh graph. *** Dynamic vectors *** Memory pages Operating systems that try to provide some measure of security to C programs generally do not allow execution of heap-allocated memory. [fn:cost] Actually, it is not very simple at all, and this is mostly because we've 'flattened' the tile list, so we somehow have to 'reconstruct' the cost of a tile set that is equivalent to the tree matched by the original. This part really needs to be revisited at some point. MoarVM-2018.03/docs/jit/runtime.md0000644000175000017510000000125213202647036016731 0ustar samanthasamantha# Runtime Configuration The JIT compiler can be switched off using the environment variable: MVM_JIT_DISABLE=1 The JIT compiler can write a log file, which is useful only for debugging JIT problems. The path to the log file can be given as an environment variable: MVM_JIT_LOG=path/to/logfile.txt Finally, the JIT compiler can write binary dumps of compiled frames in a directory. These binaries are also primarily useful as a debugging aid. MVM_JIT_BYTECODE_DIR=a/dir The following command serves to disassemable a JIT compiled frame (assuming you have GNU objdump installed as objdump): objdump -b binary -D -m i386:x86-64 -M intel $frame-name-jit-code.bin MoarVM-2018.03/docs/jit/tiles.md0000644000175000017510000003007713202647036016375 0ustar samanthasamantha# Tiles This document describes the role of tiles and how to implement additional tiles for an architecture. ## What is a tile? A tile is the combination of a *tree pattern* and a *code generation rule*. The patterns are defined in a tile list file. Tiles are architecture-specific, unlike expression templates. The path for the x64 tile list is 'src/jit/x64/tiles.list'. If and when someone chooses to port the JIT compiler, other architectures will need to define their own tile list files. The textual format used for tiles is, as in the expression templates, symbolic expressions (s-expressions). They are described in some detail in that document (expr.md). A pattern is matched and replaced with the *nonterminal*, which are then used in other pattern matches. For instance, given the following tree: (add (load (addr (local) 8 ) int_sz ) (const 16 int_sz ) ) Which, by the way, stands for: = LOCAL[8] + 16 And the following simplified set of patterns: (add reg reg) -> reg (local) -> reg (load reg sz) -> reg (addr reg ofs) -> reg We can do the following bottom-up transformation:

(add (load (addr (local) 8) int_sz) (const 16 int_sz))
(add (load (addr reg 8) int_sz) (const 16 int_sz))
(add (load reg int_sz) (const 16 int_sz))
(add reg (const 16 int_sz))
(add reg reg)
reg
In this fashion tile patterns are used to succesively simplify the input tree to a final terminal symbol. The actual process to implement this is complicated and beside the point of this article. The reason to care about it is that when using a complex instruction set (CISC) architecture any instruction can typically implement a large part of any expression tree, and doing so is often worth it. ## How to Write a Tile As I'm writing this documentation, the tile library is not yet complete, nor will it be for the foreseeable future. This is primarily because the instruction set provided by x64 processors is large; there are many possible sets of instructions for any given computation. So my aim is to help interested parties in completing the tile library, which I hope should be a rewarding passtime. I warn you that a little (but not a lot) assembly language knowledge is required. A tile requires a pattern description in the tile list file. Say I'm writing a tile for the hardware implementation of the binary XOR operator. In x64 we have a number of options, including but not limited too: xor rax, rcx /* register-to-register */ xor rax, 0x0ba1 /* constant to register */ xor rax, [rcx+ofs] /* memory with offset to register */ xor rax, [rcx+rdx*8] /* indexed memory to register */ xor [rax+ofs], rcx /* register to memory */ xor [rax+ofs], 0x12 /* constant to memory */ Let's focus on the first three, since it is my suspicion that these will be the most common (the latter two imply a STORE and a LOAD from the same operand, which is not directly supported in the memory model of the compiler, although it may be in the future). A tile description is a list that starts with the keyword `tile:`, followed by the tile *name*, the pattern proper, the *symbol* that it generates, and the (estimated) tile *cost*. There are three supported symbols, namely __reg__, __flag__ and __void__. The __flag__ symbol refers to the output of a comparison or 'testing' operation and is in general only useful in conditional operations such as IF and WHEN. The __reg__ symbol refers to a physical register and is what we'll be using for the xor implementations. (This is again not future-exclusive, because I may want to add different symbols for numeric and/or SIMD registers). The __void__ symbol represents operations which yield no results. (NB: in the past there was a __mem__ symbol that stood for (compound) memory access. This approach has been abandoned after it was clear The first version of `xor` corresponds to the following pattern: (tile: xor (xor reg reg) reg 2) Meaning it is a tile called 'xor', matching the expression tree node `XOR` (or `MVM_JIT_XOR`) and two register arguments, yields a register, and has a cost of 2. The derrivation of costs is explained below. By constrast, the second and third version correspond to these patterns: (tile: xor_consst (xor reg (const)) reg 3) (tile: xor_addr (xor reg (load (addr reg))) reg 6) You may notice that the `(const)` and `(addr reg)` nodes are stripped from their argument values. That is because argument values do not take part in tile matching. As a consequence, tiles should be written to accept (or reject) any arguments they will encounter. By the way, it is by no means necessary that a tile represents a single machine code instruction, although this is the case for most tiles currently implemented. Finally, I note that the symbol names you choose in your tile must have an analogue defined somewhere in a suitable C header file, like `MVM_JIT_REG` and `MVM_JIT_FLAG` which are defined in src/jit/expr.h; and also that all values marked `reg` are managed by the register allocator (and only those values). I'm still looking for a good way to represent constraints on registers, so expect some changes in the future. More details on the interaction of tiles with the register allocator are described below. ## Calculating costs Calculating the proper cost of a tile is something of a dark art form because there are many different factors to take into account. Some of the more important ones are: * Code size - the machine code cache is pretty small I've heard, so smaller code is generally better for performance * Memory access - memory access is often unavoidable from the point of view of the tiler, but memory reads and writes are expensive and this cost should be reflected in the tile. * Register use - registers are a limited resource and spilling them involves memory traffic, so the (temporary) use of a register should receive a cost penalty. With that in mind, I use the following scheme to calculate costs: * Per instruction issued, I count 1. Per constant stored in the instruction stream, I also count 1. Hence `(xor reg (const))` is more expensive than `(xor reg reg)`. * Per register used as output or as temporary variable space, I count 1. This is irrelevant for 'call' nodes which spill values. Note that using *input* registers is free, since their costs are calculated elsewhere. Hence `(xor reg (const))` (total cost 3) is cheaper than `(const) + (xor reg reg)` (total cost 4), because the second version uses 2 instructions and two registers. In contrast, operations yielding `flag` values don't pay for registers - the cost of converting flags to register values if necessary is paid by other operations. * Per memory access operation, I count a cost of 4. To be fair, this isn't completely relevant since memory-access operations do not usually compete with non-memory-access operations (the memory traffic is either explicitly required by the code or implicitly by the register allocator, and not very often optional). Still, by using the same cost values consistently the tiler can generate correct tables. ## Interaction with the register allocator The basic memory model of the new JIT is register to register operations. (By the way at, this is at odds with the rest of the VM, which uses memory-to-memory operations, which is unavoidable if you're developing a *virtual* machine.). Operations are generally expected to write values to registers and to read values, ultimately from registers. Thus, the expression tree format that we are tiling is deliberately closer to the CPU architecture. The important bit about tiles and registers is that as long as you do not need any temporary registers or any specific registers, you don't need to bother with the register allocator at all. Registers will be automatically allocated to write values to and your register operands will be equally automatically loaded if ever spilled. Temporary register allocations cannot cause any 'in-use' register to be unloaded, nor can temporary registers themselves be accidentally freed. Also, *do not try to free registers yourself*, the register allocator will handle that quite adequately and a double free can wreak havoc in the same way it can do in malloc. There is no reason to ever do so since the register allocator will free registers as soon as it is possible to do so. ## Implementing tile code The tile implementation is responsible for the output of suitable machine code for it's architecture. For machine code output we use the [DynASM](http://corsix.github.io/dynasm-doc/tutorial.html) library. Please read that link for detailed information on DynASM. With DynASM, tile implementation becomes simple. For x64, the tile name is declared in `src/jit/x64/tile_decl.h`. This is necessary as the tiler tables (which themselves reside in the generated header file `src/jit/x64/tile_tables.h` refer to the tile function symbol, and so require the name to be predeclared. Because the tile function signature is rather long, I use a macro to define the function: /* in src/jit/x64/tile_decl.h */ MVM_JIT_TILE_DECL(xor); MVM_JIT_TILE_DECL(xor_const); MVM_JIT_TILE_DECL(xor_addr); The implementation is defined in `src/jit/x64/tiles.dasc`. This file is included from `src/jit/x64/emit.dasc`, which is the file that includes the original JIT architecture-specific code. A tile implementation looks much like this: /* in src/jit/x64/tiles.dasc, supposing we only care about 8 byte xor */ MVM_JIT_TILE_DECL(xor) { int dst = tile->values[0]; int src_a = tile->values[1]; int src_b = tile->values[2]; if (values[0]->size < 8) MVM_oops(tc, "oops!"); if (src_a != dst) { | mov Rq(dst), Rq(src_a); } | xor Rq(dst), Rq(src_b); } The lines starting with a '|' are machine code that is to be emitted to the compiler. Of note is that in the expression model a node takes any number of input nodes (typically zero, one or two) and yields an output node (typically a value into a register). Hence the destination and source nodes are different. However, in x64 (and indeed all modes of x86) only two operands per instruction are supported, one of which typically acts as destination operand (as well as a source operand). Hence the xor operation here described overwrites the first operand. In case the first operand wil be used later, this is of course unacceptable. Hence the mov on the 9th line. However, in case the first operand *isn't* used later, reusing the register can serve as a minor but significant optimization. The register allocator tries to ensure that this is the case for all relevant tiles, and tile writers should try to take advantage of this if possible. Note that architectures which use more standard (and sane) three-operand instructions do not have to take this into account. Note also that the size of the operands is a parameter; usually you should use the biggest of the child operand sizes as definitive. Please, please, please check and fail on sizes you do not expect to handle, because bugs in emitted code are much more difficult to debug than bugs in the code generator. It is probably of interest what the exact argument list definition of a tile really is. A tile function receives the following arguments in order: * `MVMThreadContext *tc` - the current thread context passed to all MVM functions * `MVMJitCompiler *compiler` - the compiler object, which is aliased via macro magically to a DynASM handle object, which magically ensures that the dynasm statements work. Also the general manager of labels and registers etc. * `MVMJitTile *tile` - the tile object that holds the values and parameter arguments. * `MVMJitExprTree *tree` - the tree object that is being compiled. Contains pretty much all data relevant to the compilation that is not kept in the compiler structure; however in tiles it's mostly used to extract argument data, since other data is made available in more convenient ways. MoarVM-2018.03/docs/jit/todo.org0000644000175000017510000003445613247173402016416 0ustar samanthasamantha#+TITLE: JIT Compiler TODO list * VM integration ** Stack walker for current position Currently we mark the 'current position' in the JIT entry label at the start of every basic block, the start-and-end of frame handlers, and the start-and-end of inlines. This is major code bloat, for a feature that is only necessary in exceptional cases, Concept of stack walker is very simple: #+BEGIN_SRC asm mov rcx, 1 ; rsp = [] call foo ; rsp = [label:], label: mov rcx, rax; rsp = [] ... foo: ; stack (from rsp) looks like: [label:] push rbp ; [label:,rbp] mov rbp, rsp ; rbp is now top of stack, so that add rsp, 0xff; rsp = [label:,rbp, ? x 1] ... sub rsp, 0xff ; rsp = [label:,rbp] pop rbp ; rsp = [label:] ret ; rsp = [] #+END_SRC - On POSIX, arg 0 = rdi, arg 1 = rsi, arg2 = rdx. - On Windows, arg0 = rcx, arg1 = rdx, arg2 = r8. - On linux, names are generally used as-is, mac wants them prefixed by an underscore. Desirable thing: limit the depth of stack walking to some reasonable number (say, 5 or so) #+BEGIN_SRC asm walk_stack_posix: _walk_stack_posix: mov rcx, rdi ; base pointer mov r8, rdx ; maximum number of steps mov rdx, rsi ; end pointer _walk_stack_win64: # rdi = base pointer, rsi = end pointer push rbp mov r9, rsp loop: dec r8 ; counter jz done mov rax, qword ptr [r9+0x8] mov r9, qword ptr [r9] cmp rax, rcx jl loop cmp rax, rdx jg loop done: ## rax is now within range by definition, or, we're to deep pop rbp ret #+END_SRC There are three things to do: This doesn't have to start in the expr JIT though. - Figure out where we need it. As far as I can tell, this is separate from the jit_entry_label thing, and we will never *set* the jit_entry_label with the result of this value, as that might lead to a jump right behind the handler, and in the case of a THROWISH_POST, an infinite loop. Indeed throwish_pre and throwish_post don't change. - src/exceptions.c: search_frame_handlers (we compare the current jit label, but we're interested in the current position); other than that, the only updates are to the goto_handlers, and/or setting the resum labels, but that only ever happens with throwobj, and that one is explicitly throwish anyway, so the jit_entry_label will be set correct.y - src/core/frame.c: assignments from predefined labels, but, also, MVM_frame_find_contextual_by_name, which uses it as a location marker. For frames higher in the callstack, that is correct, though, so we need to distinguish the top frame from the rest. - src/spesh/deopt.c: for upper frames, we use jit_entry_label as current location marker.... which is correct as it relies on exact matches, and anything invoking anything that could deopt_all must set the label anyway. - Finally, configure our toolchain so they have -fno-omit-frame-pointer portably, this is spelled [[https://msdn.microsoft.com/en-us/library/2kxx5t2c.aspx][/Oy]] in microsoft land. - Integrate this in the build system. clang and gcc can build this just fine (clang is ... whiney about comment syntax). Microsoft has: [[https://docs.microsoft.com/en-us/cpp/assembler/masm/masm-for-x64-ml64-exe][ml64]]. It also supports intel syntax. It can be a bit fuzzy about directives. I don't want to ask our users to install another assembler, but what I can do is use the C preprocessor to smoothen out the differences (with $(CC) -E or whatever is the equivalent for windows). * Tools ** Make jit-dump work on windows This should be doable, really, if rather than pipe-and-fork, we simply use a temporary file and use that as an intermediate. * Expression Tree ** REPR-Specialized expression code Parts needed: + A hook for instructions with operands of known repr type to insert a template + So how do we know which instruction/operand this is? (Hardcode with a switch, maybe) + Runtime hook should be similar to spesh hook + We should probably pass the tree and let the repr do manipulations itself for maximum flexibility + and have a default hook which attempts to apply a template + return root if succesful, otherwise -1 (in which case we can fallback to the normal mode) + should have a separate jit flags entry which is also settable by the specializer (for jittivity, template destructiveness, possibly other things) + operands loading must be public / template apply must become 'public methods' + Compile-time support for arbitrary templates in the expression templates + I think adding to a makefile list is acceptable, in general, but it would be nice if we could have a substitution rule that would make sure the expression templates are compiled 'automatically' #+BEGIN_SRC makefile EPXR_TEMPLATES=src/jit/core_expr.h \ src/6model/reprs/MMArray_expr.h \ src/6model/reprs/NativeRef_expr.h \ src/6model/reprs/MultiDimArray_expr.h \ # preferefably, we'd match the .expr with the file name automatically src/6model/reprs/%.c: src/6model/reprs/%_expr.h # would be ideal, but this is not automatically picked up # Expression list tables %_expr_tables.h: %.expr tools/expr-template-compiler.pl src/core/oplist src/jit/expr_ops.h $(PERL) -Itools/ tools/expr-template-compiler.pl -o $@ $< #+END_SRC ** FLAGVAL ALL/ANY Basically, flagval all/any is legal according to the type system, it will just never work. We should translate it to (IF (ALL|ANY ..) (CONST 1 1) (CONST 0 1)) The problem is, replacing all references to the node. (This is common with the optimizer, which also needs it). We don't actually need this yet, but we don't guard against it either. (So maybe install an oops in analyze first). ** Reduce tree node size to 32 bits Tree nodes are currently 64 bits wide to allow them to coexist with constant pointers. This is handy, but not really required, since we could use a lookup table to get the pointers (as long as we can declare pointers, for which I think we can still use the '@' sigil, e.g: #+BEGIN_EXAMPLE (template: say (call (const @MVM_string_say ptr_sz) (arglist 2 (carg (tc) ptr) (carg $0 ptr)) #+END_EXAMPLE The @MVM_string_say pointer can be stashed in an array: #+BEGIN_SRC C static const void *MVM_jit_expr_ptrs[] = { ... MVM_string_say, ... }; #+END_SRC And the pointer itself replaced by the index. We could argue against dealing with 64 bit constants in general, but unfortunately, const_i64 prevents us from doing that.... Ways of dealing with that: + A 'large constants' table per tree (into which we could copy both the i64 constants and the function pointer constants) + We could store this entire table in the data section, too + A 'large constants' op, which could take the space to store the 64 bit constant directly; one of the advantages of that is that we could specialise tiling to that (e.g. there is no advantage to including a very large constant in the ADD tile since the underlying 'add' instruction cannot handle it). + Or both: have a large_const op and a large_const table, and only have the large_const op refer to the large_const table (i.e. not the regular const) ** Use explicit stack for tree walking Simple, mechanical transformation. I wonder if we can have a maximum depth; probably not, if we can allow revisits. More importantly, this should allow for some control on the iteration order ** Right-to-left evaluation E.g. (STORE addr value sz) - it usually makes sense to calculate value before address. There are a bunch of these things, and then again, a bunch of things that rely on left-to-right evaluation: + IF/IFV + ALL/ANY + DO/DOV So the thing is probably to: + store a preference per op + add a policy for the traverser (default,left-to-right,right-to-left) * Register Allocator ** Switch to storing register numbers in a stack rather than in a ring Using a ring has the disadvantage that register values are 'continuously moving', even when they do not need to be. ** Dump register allocator graph I think it should be possible to dump the (result) of register allocation. That is to say, create a graph that displays all tiles, their basic block structure, the live range structure, and their spills. ** Support multiple register classes I want to distinguish register classes using ranges, i.e. on x86-64, 0-15 are GPR, 16-31 would be FPR. The trick is mostly: *** Find out if register selection for FPRs is supported *** Support register buffers per class ** Generalized 3-operand to 2-operand conversion Already implemented for direct-memory binary ops, but needs to be extended to take into account indirect-access ops and memory base + indexed ops. More to the point, I'd like this to be a restriction we can build into the allocator itself, so it doesn't need last-minute patchup. *** Use register stack rather than ring buffer Ring buffers register allocation 'cycle' through registers and thereby cause more moves than a stack would. ** Reduce spills *** Maintain memory backed positions Currently, when we need to spill a value, we always treat it as if it were a temporary, i.e. we store it to a *new* location in the local memory buffer. We increment the local memory buffer, too. This is suboptimal for values that are not temporaries, i.e. values that are stored to the local value buffer anyway. + stored to a local value + directly retrieved from a local value There are two classes of such values: There is no need to ever spill such values to memory. #+BEGIN_SRC c /* Return -1 if not a local store, 0 <= i <= frame->work_size if it is */ MVMint32 is_local_store(MVMJitExprTree *tree, MVMint32 node) { if (tree->nodes[node] != MVM_JIT_STORE) return -1; node = tree->nodes[node + 1]; if (tree->nodes[node] != MVM_JIT_ADDR) return -1; if (tree->nodes[tree->nodes[node + 1]] != MVM_JIT_LOCAL) return -1; return tree->nodes[node+2]; } MVMint32 has_local_location(MVMJitExprTree *tree, MVMint32 node) { MVMSpeshIns *ins = tree->info[node].spesh_ins; if (ins == NULL || ins->op_info->num_operands == 0 || (ins->info->operands[0] & MVM_operand_rw_mask) != MVM_operand_write_reg) return -1; return ins->op_info->operands[0].reg.orig; } #+END_SRC *** Don't spill-and-load directly between definition and use Or rather, if we can prove that there can be no 'spills' inbetween a definition and use (and they are in the same basic block), let's 'merge' the atomic live ranges. *** Don't spill constants - We can either do that as part of the optimizer, or as part of the allocator, or both. - It is *simpler* to do it for the allocator (if a value we're spilling has a single definition, and that definition is a constant, copy it) - It might be more effective to do it in the expression optimizer ** Generalized register requirements Bunch of options possible: - it's a requirement for an output register - the register is allocatable - which is /free/, in which case we can just take it (how I do I know it's free? by a register map, which we need to make) - which is /not free/, in which case we need to /spill/ the current register - the register is not allocatable (e.g. %rax) - I'm going to go ahead and assume that it is free nevertheless, otherwise we'd have to record the set of non-allocatable registers clobbered - However, if the value is to live, it's probably best to copy it to an allocatable register - it is a requirement for an input register - that is not yet a problem I have (because I made %rax the spare register), but most of the considerations of clobbering described below apply - it is an existing problem for ARGLIST compilation, but there it is handled seprately (although it is fairly similar, and might generalize!) - it clobbers a register (not necessarily one it uses), e.g. div which clobbers %rdx to store the modulo (and %rax for the quotient). - if free, no problem whatever - if non-free, we again need to start moving registers, but I'm not sure this requires the full shuffling requirements of ARGLIST. *** Precoloring I'd like to try and figure out if we can add 'prefered registers' to tiles based on definition or use in tile requirements. ** Try to use 'holes' for allocation. Not 100% sure this is worth the additional complexity since it means that a register can have multiple occupants, which means you'll want to use a linked list, and a heap for maintaining the first-to-expire set, or a double-ended priority queue, etc. Simplest thing to do is try and prove that the live range will be 'embedded' within the hole in all cases. But this is tricky when there might be a spill inbetween. ** Support loops in lifetime hole finding Note that Wimmer's paper describes computing holes and live range extents are implemented in a single step, so we might implement that as well. * Optimizer Not implemented at all, so we need some new things. ** DONE An equivalence function ** TODO A replacement 'function' Basically we require the possibility to update all uses of a node with another one, including roots, if necessary. Now, there will never be more uses than nodes, so we can build a 'usage' table-of-linked-list from a single block of memory. Walks should be single-visit. ** TODO Example optimizations - common subexpression elimination - idea: (hash) table of expr, node - table is created bottom-up - all children are replaced with equivalent (according to the table) - then parent is itself 'hashed' to a record, an potentially replaced - IDX CONST to ADDR conversion - Uses one register less, simpler operation - ADD CONST to ADDR conversion - only allowed if user is pointerlike (e.g. LOAD) - COPY insertion - Values that are LOAD-ed and used from multiple operations might benefit from inserting a COPY, so they don't use indirect operations, e.g. - Basic idea: count number of users of 'load', if > 1, insert the COPY node and replace the refs - Possibly a pessimization because it requires more registers! - COPY elimination - possibly the first step, removing redundant copies - CONST copying - A const never needs to be kept in memory, and it is just as well to keep just a single reference to it. MoarVM-2018.03/docs/moar.pod0000644000175000017510000000267113111771622015604 0ustar samanthasamantha=encoding UTF-8 =head1 NAME moar - a runtime for Perl 6 =head1 SYNOPSIS moar --version moar [--dump] [--crash] [--libpath=...] [--full-cleanup] inputfile =head1 DESCRIPTION C is the binary of MoarVM, (short for Metamodel On A Runtime Virtual Machine). It can be used to execute C<.moarvm> bytecode files. =head1 ENVIRONMENT VARIABLES moar respects the following environment variables: =over =item MVM_JIT_DISABLE Disables the just-in-time compiler (JIT). This is ignored if MoarVM was built without JIT support. =item MVM_SPESH_DISABLE Disables the runtime bytecode specializer / optimizer. =item MVM_SPESH_INLINE_DISABLE Disables inlining of call frames inside the bytecode specializer. =item MVM_SPESH_OSR_DISABLE Disables the on-stack replacement feature of the bytecode specializer. =item MVM_CROSS_THREAD_WRITE_LOG Tells MoarVM to insert instrumentation to detect when a thread does a write to an object it didn't allocate and doesn't have a lock for. =item MVM_CROSS_THREAD_WRITE_LOG_INCLUDE_LOCKED Same as MVM_CROSS_THREAD_WRITE_LOG, except objects that are locked are included as well. =back =head1 REPORTING BUGS Please use the issue tracker at L to report bugs. =head1 COPYRIGHT Copyright (C) 2012-2014 by the MoarVM contributors. See the F file for a list of contributors. License: Artistic License 2.0. See the file F for more information. =cut MoarVM-2018.03/docs/release_guide.md0000644000175000017510000000517213243116442017257 0ustar samanthasamantha# MoarVM Release Guide ## Versions MoarVM currently has a monthly release cycle, with releases made in time for the month's NQP and Rakudo release. Version numbers are simply YYYY.MM. For example, the January 2014 release is 2014.01. If any bugfix releases need to be made, they should be numbered as 2041.01.1, 2041.01.2, etc. ## Making a release 1. Make sure that you are on the MoarVM commit you want to make a release from, and that your status is clean. 2. Ensure that NQP and Rakudo will build and that `make test` in each is clean. Also run `make spectest` in Rakudo; discuss any failures you see with the Rakudo developers. 3. If possible, run NQP and Rakudo `make test` and Rakudo `make spectest` when `#define MVM_DEBUG_NFG 1` and `#define MVM_DEBUG_NFG_STRICT 1` in src/strings/ops.h after recompiling to make sure there have been no normalization bugs introduced. 4. Update docs/ChangeLog with any significant changes since the previous release. 5. Update the VERSION file with the release name. 6. Run `make release VERSION=2017.10`, substituting the correct version name. 7. Take the MoarVM-2017.10.tar.gz file generated by step 6, copy it to a separate directory, extract it, and then in that directory do: perl Configure.pl --prefix=install make install install/bin/moar --version 8. Provided step 5 and 6 work, you have a release! You need to setup git to be able to sign your commits. The -a option adds a tag while the -s makes sure the tag is signed. Even if your commits are signed by default, you will need the -s option as well. git tag -as 2017.10 9. Run git verify-tag 2017.10 to make sure the signature is valid and the tag was actually signed. 10. Upload it by committing the tar file to https://github.com/MoarVM/moarvm.org/ in the releases directory. 11. Make sure you have the Text::Markdown Perl 5 module and run: ./tools/moarvm.org_releases.pl > ../moarvm.org/releases.html It should output to STDERR all the versions it found in ChangeLog make sure the most recent release appears first and all releases going back to 2014.01 appear. 12. Manually edit moarvm.org/index.html to have the DL link and mention the most recent release. Changes need to be made on lines: - 36: Large text - 38: Description text - 41: Download link 13. Optionally, update the ports/macports/Portfile to reflect this latest version, and open a ticket at https://trac.macports.org/newticket to get the macport updated. (For now, just make Coke do it.) 13. Do something fun to celebrate. Like watching nyan cat, or having a beer. Or why not both? MoarVM-2018.03/docs/reveal.md0000644000175000017510000002133113111771622015734 0ustar samanthasamantha# MoarVM: A virtual machine for NQP and Rakudo Over the course of the last year, we've been working to make both NQP and Rakudo more portable. This has primarily been done to enable the JVM porting work. While the JVM is an important platform to target, and initial work suggests it can give us a faster and more stable Rakudo, there are some use cases, or users, that the JVM will not cater to so well. Startup time will likely remain a little high for one-liners and quick scripts. Other potential users simply don't want to use the JVM, for whatever reason. That's fine: there's more than one way to do it, and our strategy has been to enable that by adding support for the JVM without breaking support for Parrot. Additionally, pmurias will be working on a JavaScript backend for a GSoC project. Today I'd like to introduce some work that, all being well, will lead to an additional "way to do it" arriving over the next several months. A small team, composed of myself, diakopter, japhb and masak, have been quietly working on taking the design of the 6model object system and building a runtime around it. Thus, we've created the "Metamodel On A Runtime" Virtual Machine, or the "MOAR VM", which we've taken to writing as "MoarVM". This is not a release announcement. At present, MoarVM runs neither NQP nor Rakudo, though a cross-compiler exists that allows translating and passing much of the NQP test suite. We're revealing it ahead of YAPC::NA, so it can be openly discussed by the Perl 6 team. The goal from the start has been to run NQP, then run Rakudo. The JVM porting work has established the set of steps that such an effort takes, namely: 1. Build an NQP cross-compiler that targets the desired platform. Make it good enough to compile the MOP, built-ins and the classes at the heart of the regex/grammar engine. Make it pass most of the NQP test suite. 2. Make the cross-compiler good enough to cross-compile NQP itself. 3. Close the bootstrap loop, making NQP self host on the new platform. 4. Do the Rakudo port. At the moment, the JVM work is well into the final step. For MoarVM, we've reached the second step. That is to say, we already have a cross-compiler that compiles a substantial range of NQP language constructs into MoarVM bytecode, including the MOP, built-ins and regex-related classes. Around 51 of the NQP test files (out of a total of 62) pass. Work towards getting the rest of NQP to cross-compile is ongoing. Since anybody who has read this far into the post probably has already got a whole bunch of questions, I'm going to write the rest of it in a question-and-answer style. ## What are the main goals? To create a VM backend for Rakudo Perl 6 that: * Is **lightweight and focused** on doing exactly what Rakudo needs, without any prior technical or domain debt to pay off. * **Supports 6model** and various other needs natively and, hopefully, efficiently. * Is a **quick and easy build**, with few dependencies. I was rather impressed with how quick LuaJIT can be built, and took that as an inspiration. * Enable the **near-term exploration of JIT compilation in 6model** (exploring this through invokedynamic on the JVM is already underway too). ## What's on the inside? So far, MoarVM has: * An **implementation of 6model**. In fact, the VM uses 6model as its core object system. Even strings, arrays and hashes are really 6model objects (which in reality means we have representations for arrays and hashes, which can be re-used by high-level types). This is the first time 6model has been built up from scratch without re-using existing VM data structures. * Enough in place to support **a sizable subset of the `nqp::` op space**. The tests from the NQP test suite that can be translated by the cross-compiler cover a relatively diverse range of features: the boring easy stuff (variables, conditionals, loops, subs), OO stuff (classes, methods, roles, mixins, and, naturally, meta-programming), multiple dispatch, most of grammars (including LTM), and various other bits. * **Unicode strings**, designed with future NFG support in mind. The VM includes the Unicode Character Database, meaning that character name and property lookups, case changing and so forth can be supported without any external dependencies. Encoding of strings takes place only at the point of I/O or when a Buf rather than a Str is requested; the rest of the time, strings are opaque (we're working towards NFG and also ropes). * **Precise, generational GC**. The nursery is managed through semi-space copying, with objects that are seen a second time in the nursery being promoted to a second generation, which is broken up into sized heaps. Allocations in the nursery are thus "bump the pointer", the copying dealing with the resulting fragmentation. * **Bytecode assembly done from an AST**, not from a textual format. MoarVM has no textual assembly language or intermediate language. Of course, there's a way to dump bytecode to something human-readable for debugging, but nothing to go in the opposite direction. This saves us from producing text, only to parse it to produce bytecode. * **IO and other platform stuff** provided by the Apache Portable Runtime, big integer support provided by libtommath, and re-use of existing atomic ops and hash implementations. We will likely replace the APR with libuv in the future. The general principle is to re-use things that we're unlikely to be able to recreate ourselves to the same level of quality or on an acceptable time scale, enabling us to focus on the core domain. ## What does this mean for the Rakudo on JVM work? Relatively little. Being on the JVM is an important goal in its own right. The JVM has a great number of things in its favor: it's a mature, well-optimized, widely deployed technology, and in some organizations the platform of choice ("use what you like, so long as it runs on the JVM"). No matter how well Moar turns out, the JVM still has a couple of decades head start. Additionally, a working NQP on JVM implementation and a fledgling Rakudo on JVM already exist. Work on making Rakudo run, then run fast, on the JVM will continue at the same kind of pace. After all, it's already been taking place concurrently with building MoarVM. :-) ## What does this mean for Rakudo on Parrot? In the short term, until MoarVM runs Rakudo well, this shouldn't really impact Rakudo on Parrot. Beyond that is a more interesting question. The JVM is widely deployed and battle-hardened, and so is interesting in its own right whatever else Rakudo runs on. That's still not the case for Parrot. Provided MoarVM gets to a point where it runs Rakudo more efficiently and is at least as stable and feature complete, it's fairly likely to end up as a more popular choice of backend. There are no plans to break support for Rakudo on Parrot. ## Why do the initial work in private? There were a bunch of reasons for doing so. First and foremost, because it was hard to gauge how long it would take to get anywhere interesting, if indeed it did. As such, it didn't seem constructive to raise expectations or discourage work on other paths that may have led somewhere better, sooner. Secondly, this had to be done on a fairly limited time budget. I certainly didn't have time for every bit of the design to be bikeshedded and rehashed 10 times, which is most certainly a risk when design is done in a very public way. Good designs often come from a single designer. For better or worse, MoarVM gets me. ## Why not keep it private until point X? The most immediate reason for making this work public now is because a large number of Perl 6 core developers will be at YAPC::NA, and I want us to be able to openly discuss MoarVM as part of the larger discussions and planning with regard to Perl 6, NQP and Rakudo. It's not in any sense "ready" for use in the real world yet. The benefits of the work being publicly known just hit the point of outweighing the costs. ## What's the rough timeline? My current aim is to have the MoarVM backend supported in NQP by the July or August release of NQP, with Rakudo support to come in the Rakudo compiler release in August or September. A "Star" distribution release, with modules and tools, would come after that. For now, the NQP cross-compiler lives in the MoarVM repository. After we get Rakudo running and stabilized on MoarVM, the focus will move towards 6model-aware JIT compilation, improving the stability of the threads implementation (the parallel GC exists, but needs some love still), asynchronous IO and full NFG string/rope support. We'll have a bunch of the right people in the same room at YAPC::NA, so we'll work on trying to get a more concrete roadmap together there. ## Where is... * The Git repository: https://github.com/MoarVM/MoarVM * The IRC channel: #moarvm on freenode.org MoarVM-2018.03/docs/strings.asciidoc0000644000175000017510000001106113202646314017324 0ustar samanthasamantha= Strings in MoarVM = :author: Samantha McVey :toc: :tip-caption: :bulb: :note-caption: :information_source: :important-caption: :heavy_exclamation_mark: :caution-caption: :fire: :warning-caption: :warning: [abstract] == Abstract == MoarVM implements strings using NFG (Normalization Form Grapheme). This is an extension on Unicode NFC (Normalization Form Canonical). Strings have either a 32-bit signed or 8-bit signed fixed width representation, with negative numbers used to represent graphemes which contain more than one codepoint per grapheme (<> graphemes) TIP: Remember, all input text is normalized by default. == MVMString == Strings are represented by the `MVMString` `struct` (link:../src/6model/reprs/MVMString.h[source]). A string’s length is stored as a 32-bit unsigned integer, so the maximum number of graphemes allowed in a string is *32³² - 1* (4,294,967,295). For a given string `MVMString *string`, `string->body.storage_type` can be one of the following types: .MVMString types: 1. `MVM_STRING_GRAPHEME_32` 2. `MVM_STRING_GRAPHEME_ASCII` 3. `MVM_STRING_GRAPHEME_8` 4. `MVM_STRING_STRAND` [options=header] |================= |Type | Storage | Notes |`MVM_STRING_GRAPHEME_32` |32-bit signed |Can contain any Synthetic |`MVM_STRING_GRAPHEME_ASCII`|8-bit signed |Can contain the CRLF Synthetic |`MVM_STRING_GRAPHEME_8` |8-bit signed | |`MVM_STRING_STRAND` |References other strings |Created by: concatenation, substring ops & string repeat op |================= === Strands === Strands are a type of `MVMString` which instead of being a flat string with contiguous data, actually contains references to other strings. Strands are created during concatenation or substring operations. When two flat strings are concatenated together, a Strand with references to both string a and string b is created. If string a and string b were strands themselves, the references of string a and references of string b are copied one after another into the Strand. == Grapheme Segmentation == Graphemes are segmented (which codepoints are apart of which graphemes) follow Unicode’s Text Segmentation rules for Grapheme Clusters _Technical Report 29_ <>. === Synthetic’s === Synthetics are graphemes which contain multiple codepoints. In MoarVM these are stored and accessed using a trie, while the actual data itself stores the base character seprately and then the combiners are stored in an array. We also store whether or not it is a UTF8-C8 synthetic. The struct’s source is in link:../src/strings/nfg.h[src/strings/nfg.h]. NOTE: Currently the maximum number of combiners in a synthetic is 1024. MoarVM will throw an exception if you attempt to create a grapheme with more than 1024 codepoints in it. (https://github.com/MoarVM/MoarVM/blob/master/src/strings/nfg.h#L83[source]) Synthetic’s codepoints are stored in a single array, with the base character pointed to by storing the location of its index in the array. The reason for this is for compatibility with Prepend characters. === Prepend === Before Unicode 9.0, base characters were always the first codepoint in the grapheme. The `Prepend` property was added in Unicode 9.0, which does the opposite of the `Extend` property. Codepoints with the `Prepend` property combine with the codepoint which comes immediately afterward. MoarVM supports both segmentation, as well as getting the base codepoint out of a synthetic that starts with one or more Prepend codepoint(s). == Normalization == MoarVM normalizes into NFG form all input text. This can cause the data to change as normalization takes place. Developers and users may be used to systems which treat strings as "bags of bytes" and do not ensure they are valid Unicode (or any other encoding for that matter). MoarVM goes beyond ensuring correct Unicode and also ensures correct normalization in NFC form. [glossary] == Glossary == MVMString:: The C type used to represent strings NFG:: Normalization Form Grapheme. Similar to NFC except graphemes which contain multiple codepoints are stored in Synthetic graphemes. NFC:: Normalization Form Canonical Grapheme:: Short for Grapheme Cluster. See <> for more information. [[Synthetic]] Synthetic:: In MoarVM, a special representative to store a grapheme containing more than one codepoint using the same space as a standard codepoint. Internally stored using negative numbers in the C string data array. [bibliography] == References - [[[TR29]]] **Unicode Technical Report 29**. _Unicode Text Segmentation_. http://unicode.org/reports/tr29/ MoarVM-2018.03/lib/MAST/Nodes.nqp0000644000175000017510000005237713242626641016331 0ustar samanthasamanthause MASTOps; # MoarVM AST nodes # This file contains a set of nodes that are compiled into MoarVM # bytecode. These nodes constitute the official high-level interface # to the VM. At some point, the bytecode itself will be declared # official also. Note that no text-based mapping to/from these nodes # will ever be official, however. # Extension op name/signature registry; keeps track of all the known extension # ops and their signatures. class MAST::ExtOpRegistry { my %extop_sigs; # Registers an extension op, specifying a name and type expected types of # each of the operands. method register_extop($name, *@sig) { if nqp::existskey(%extop_sigs, $name) { nqp::die("MoarVM extension op '$name' already registered"); } my @sig_i := nqp::list_i(); for @sig { nqp::push_i(@sig_i, $_); } %extop_sigs{$name} := @sig_i; } # Checks if an extop is registered. method extop_known($name) { nqp::existskey(%extop_sigs, $name) } # Gets the signature of an extop, which we can rely on to be a list of # native integers. method extop_signature($name) { unless nqp::existskey(%extop_sigs, $name) { nqp::die("MoarVM extension op '$name' is not known"); } %extop_sigs{$name} } } # The extension of base number (everything below is internal). my int $EXTOP_BASE := 1024; # The base class for all nodes. class MAST::Node { method dump($indent = "") { my @lines := nqp::list(); self.dump_lines(@lines, $indent); nqp::join("\n", @lines); } method dump_lines(@lines, $indent) { nqp::push(@lines, $indent~"MAST::Node "); } } # Everything lives within a compilation unit. Note that this may # or may not map to a HLL notion of compilation unit; it is always # a set of things that we're going to compile "in one go". The # input to the AST to bytecode convertor should always be one of # these. class MAST::CompUnit is MAST::Node { # The set of frames that make up this compilation unit. has @!frames; # The HLL name. has str $!hll; # The frame for the main entry point, if any. has $!main_frame; # The frame for the library-load entry point, if any. has $!load_frame; # The frame containing the deserialization code, if any. has $!deserialize_frame; # SC handles that we depend on. has @!sc_handles; # Mapping of SC handle names to indexes, for faster lookup. has %!sc_lookup; # List of extops that we are using. For each extop used in this compunit, # this list contains its signature. has @!extop_sigs; # Mapping of extop names to extop signature indexes (in the @!extop_sigs # array). has %!extop_idx; # String list of extop names. has @!extop_names; method add_frame($frame) { my int $idx := nqp::elems(@!frames); $frame.set_index($idx); nqp::push(@!frames, $frame); } method dump_lines(@lines, $indent) { nqp::push(@lines, $_.dump($indent)) for @!frames; } method hll($hll?) { nqp::defined($hll) ?? ($!hll := $hll) !! $!hll } method main_frame($frame?) { nqp::defined($frame) ?? ($!main_frame := $frame) !! $!main_frame } method load_frame($frame?) { nqp::defined($frame) ?? ($!load_frame := $frame) !! $!load_frame } method deserialize_frame($frame?) { nqp::defined($frame) ?? ($!deserialize_frame := $frame) !! $!deserialize_frame } method sc_idx($sc) { my str $handle := nqp::scgethandle($sc); if nqp::existskey(%!sc_lookup, $handle) { nqp::atkey(%!sc_lookup, $handle) } else { my $id := nqp::elems(@!sc_handles); nqp::push(@!sc_handles, $handle); nqp::bindkey(%!sc_lookup, $handle, $id); $id } } # Gets the opcode for an extop in the current compilation unit. If this is # the first use of the extop, gives it an index for this compilation unit. method get_extop_code(str $name) { if nqp::existskey(%!extop_idx, $name) { %!extop_idx{$name} + $EXTOP_BASE } else { my int $idx := +@!extop_sigs; @!extop_names[$idx] := $name; @!extop_sigs[$idx] := MAST::ExtOpRegistry.extop_signature($name); %!extop_idx{$name} := $idx; $idx + $EXTOP_BASE } } } sub get_typename($type) { ["obj","int","num","str"][nqp::objprimspec($type)] } # Represents a frame, which is a unit of invocation. This captures the # static aspects of a frame. class MAST::Frame is MAST::Node { # A compilation-unit unique identifier for the frame. has str $!cuuid; # A name (need not be unique) for the frame. has str $!name; # The set of lexicals that we allocate space for and keep until # nothing references an "instance" of the frame. This is the # list of lexical types, the index being significant. Any type # that has a flattening representation will be "flattened" in to # the frame itself. has @!lexical_types; # Mapping of lexical names to slot indexes. has @!lexical_names; # The set of locals we allocate, but don't need once the frame # has finished executing. This is the set of types. Note that # they do not get a name. has @!local_types; # The instructions for this frame. has @!instructions; # The outer frame, if any. has $!outer; # Mapping of lexical names to lexical index, for lookups. has %!lexical_map; # Flag bits. my int $FRAME_FLAG_EXIT_HANDLER := 1; my int $FRAME_FLAG_IS_THUNK := 2; my int $FRAME_FLAG_HAS_CODE_OBJ := 4; my int $FRAME_FLAG_NO_INLINE := 8; my int $FRAME_FLAG_HAS_INDEX := 32768; # Can go after a rebootstrap. my int $FRAME_FLAG_HAS_SLV := 65536; # Can go after a rebootstrap. has int $!flags; # The frame index in the compilation unit (cached to aid assembly). has int $!frame_idx; # Integer array with 4 entries per static lexical value: # - The lexical index in the frame # - A flag (0 = static, 1 = container var, 2 = state var) # - SC index in this compilation unit # - Index of the object within that SC has @!static_lex_values; # Code object SC dependency index and SC index. has int $!code_obj_sc_dep_idx; has int $!code_obj_sc_idx; my int $cuuid_src := 0; sub fresh_id() { $cuuid_src++; "!MVM_CUUID_$cuuid_src" } method new(:$cuuid = fresh_id(), :$name = '') { my $obj := nqp::create(self); $obj.BUILD($cuuid, $name); $obj } method BUILD($cuuid, $name) { $!cuuid := $cuuid; $!name := $name; @!lexical_types := nqp::list(); @!lexical_names := nqp::list(); @!local_types := nqp::list(); @!instructions := nqp::list(); $!outer := MAST::Node; %!lexical_map := nqp::hash(); @!static_lex_values := nqp::list_i(); } method set_index(int $idx) { $!frame_idx := $idx; $!flags := nqp::bitor_i($!flags, $FRAME_FLAG_HAS_INDEX); } method add_lexical($type, $name) { my $index := +@!lexical_types; @!lexical_types[$index] := $type; @!lexical_names[$index] := $name; %!lexical_map{$name} := $index; $index } method lexical_index($name) { nqp::existskey(%!lexical_map, $name) ?? %!lexical_map{$name} !! nqp::die("No such lexical '$name'") } method add_static_lex_value($index, $flags, $sc_idx, $idx) { my @slv := @!static_lex_values; nqp::push_i(@slv, $index); nqp::push_i(@slv, $flags); nqp::push_i(@slv, $sc_idx); nqp::push_i(@slv, $idx); $!flags := nqp::bitor_i($!flags, $FRAME_FLAG_HAS_SLV); } method add_local($type) { my $index := +@!local_types; @!local_types[$index] := $type; $index } method instructions() { @!instructions } method set_outer($outer) { if nqp::istype($outer, MAST::Frame) { $!outer := $outer; } else { nqp::die("set_outer expects a MAST::Frame"); } } method cuuid() { $!cuuid } method name() { $!name } method has_exit_handler($value = -1) { if $value > 0 { $!flags := nqp::bitor_i($!flags, $FRAME_FLAG_EXIT_HANDLER); } nqp::bitand_i($!flags, $FRAME_FLAG_EXIT_HANDLER) } method is_thunk($value = -1) { if $value > 0 { $!flags := nqp::bitor_i($!flags, $FRAME_FLAG_IS_THUNK); } nqp::bitand_i($!flags, $FRAME_FLAG_IS_THUNK) } method no_inline($value = -1) { if $value > 0 { $!flags := nqp::bitor_i($!flags, $FRAME_FLAG_NO_INLINE); } nqp::bitand_i($!flags, $FRAME_FLAG_NO_INLINE) } method set_code_object_idxs(int $sc_dep_idx, int $sc_idx) { $!code_obj_sc_dep_idx := $sc_dep_idx; $!code_obj_sc_idx := $sc_idx; $!flags := nqp::bitor_i($!flags, $FRAME_FLAG_HAS_CODE_OBJ); } method dump_lines(@lines, $indent) { nqp::push(@lines, $indent~"MAST::Frame name<$!name>, cuuid<$!cuuid>"); if !nqp::chars($indent) { my $lex; my $x := 0; my $locals := "$indent Local types: "; $locals := $locals ~ $x++ ~ "<" ~ get_typename($_) ~ ">, " for @!local_types; nqp::push(@lines, $locals); if nqp::elems(@!lexical_types) { $x := 0; $lex := "$indent Lexical types: "; $lex := $lex ~ $x++ ~ "<" ~ get_typename($_) ~ ">, " for @!lexical_types; nqp::push(@lines, $lex); } if nqp::elems(@!lexical_names) { $x := 0; $lex := "$indent Lexical names: "; $lex := $lex ~ $x++ ~ "<$_>, " for @!lexical_names; nqp::push(@lines, $lex); } if nqp::elems(%!lexical_map) { $lex := "$indent Lexical map: "; $lex := "$lex$_" ~ '<' ~ %!lexical_map{$_} ~ '>, ' for %!lexical_map; nqp::push(@lines, $lex); } nqp::push(@lines, "$indent Outer: " ~ ( $!outer && $!outer.cuuid ne $!cuuid ?? "name<" ~ $!outer.name ~ ">, cuuid<"~$!outer.cuuid ~ '>' !! "" )); nqp::push(@lines, "$indent Instructions:"); $x := 0; for @!instructions { my $prefix := $indent ~ ' [' ~ $x++ ~ '] '; nqp::push(@lines, $prefix ~ $_.dump($indent)); } nqp::push(@lines, ''); } } } # An operation to be executed. The operands must be either registers, # literals or labels (depending on what the instruction needs). class MAST::Op is MAST::Node { has int $!op; has @!operands; my %op_codes := MAST::Ops.WHO<%codes>; my @op_names := MAST::Ops.WHO<@names>; method new(str :$op!, *@operands) { my $obj := nqp::create(self); nqp::bindattr_i($obj, MAST::Op, '$!op', %op_codes{$op}); nqp::bindattr($obj, MAST::Op, '@!operands', @operands); $obj } method new_with_operand_array(@operands, str :$op!) { my $obj := nqp::create(self); nqp::bindattr_i($obj, MAST::Op, '$!op', %op_codes{$op}); nqp::bindattr($obj, MAST::Op, '@!operands', @operands); $obj } method op() { $!op } method operands() { @!operands } method dump_lines(@lines, $indent) { my str $opname := nqp::atpos_s(@op_names, $!op); nqp::push(@lines, $indent ~ "MAST::Op $opname"); nqp::push(@lines, $_.dump($indent ~ ' ')) for @!operands; } } # An extension operation to be executed. The operands must be either # registers, literals or labels (depending on what the instruction needs). class MAST::ExtOp is MAST::Node { has int $!op; has @!operands; has str $!name; method new(str :$op!, :$cu!, *@operands) { my $obj := nqp::create(self); nqp::bindattr_i($obj, MAST::ExtOp, '$!op', $cu.get_extop_code($op)); nqp::bindattr($obj, MAST::ExtOp, '@!operands', @operands); nqp::bindattr_s($obj, MAST::ExtOp, '$!name', $op); $obj } method new_with_operand_array(@operands, str :$op!, :$cu!) { my $obj := nqp::create(self); nqp::bindattr_i($obj, MAST::ExtOp, '$!op', $cu.get_extop_code($op)); nqp::bindattr($obj, MAST::ExtOp, '@!operands', @operands); nqp::bindattr_s($obj, MAST::ExtOp, '$!name', $op); $obj } method op() { $!op } method operands() { @!operands } method dump_lines(@lines, $indent) { nqp::push(@lines, $indent ~ "MAST::ExtOp $!name"); nqp::push(@lines, $_.dump($indent ~ ' ')) for @!operands; } } # Literal values. class MAST::SVal is MAST::Node { has str $!value; method new(:$value!) { my $obj := nqp::create(self); nqp::bindattr_s($obj, MAST::SVal, '$!value', $value); $obj } method dump_lines(@lines, $indent) { # XXX: escape line breaks and such... nqp::push(@lines, $indent~"MAST::SVal value<$!value>"); } } class MAST::IVal is MAST::Node { # The integer value. has int $!value; # Size in bits (8, 16, 32, 64). has int $!size; # Whether or not it's signed. has int $!signed; method new(:$value!, :$size = 64, :$signed = 1) { my $obj := nqp::create(self); nqp::bindattr_i($obj, MAST::IVal, '$!value', $value); nqp::bindattr_i($obj, MAST::IVal, '$!size', $size); nqp::bindattr_i($obj, MAST::IVal, '$!signed', $signed); $obj } method dump_lines(@lines, $indent) { nqp::push(@lines, $indent~"MAST::IVal value<$!value>, size<$!size>, signed<$!signed>"); } } class MAST::NVal is MAST::Node { # The floating point value. has num $!value; # Size in bits (32, 64). has int $!size; method new(:$value!, :$size = 64) { my $obj := nqp::create(self); nqp::bindattr_n($obj, MAST::NVal, '$!value', $value); nqp::bindattr_i($obj, MAST::NVal, '$!size', $size); $obj } method dump_lines(@lines, $indent) { nqp::push(@lines, $indent~"MAST::NVal value<$!value>, size<$!size>"); } } # Labels (used directly in the instruction stream indicates where the # label goes; can also be used as an instruction operand). class MAST::Label is MAST::Node { method new() { nqp::create(self) } method dump_lines(@lines, $indent) { my int $addr := nqp::where(self); nqp::push(@lines, $indent ~ "MAST::Label <$addr>"); } } # A local lookup. class MAST::Local is MAST::Node { has int $!index; method new(:$index!) { my $obj := nqp::create(self); nqp::bindattr_i($obj, MAST::Local, '$!index', $index); $obj } method index() { $!index } method dump_lines(@lines, $indent) { nqp::push(@lines, $indent~"MAST::Local index<$!index>"); } } # A lexical lookup. class MAST::Lexical is MAST::Node { has int $!index; has int $!frames_out; method new(:$index!, :$frames_out = 0) { my $obj := nqp::create(self); nqp::bindattr_i($obj, MAST::Lexical, '$!index', $index); nqp::bindattr_i($obj, MAST::Lexical, '$!frames_out', $frames_out); $obj } method index() { $!index } method dump_lines(@lines, $indent) { nqp::push(@lines, $indent~"MAST::Lexical index<$!index>, frames_out<$!frames_out>"); } } # Argument flags. module Arg { our $obj := 1; our $int := 2; our $num := 4; our $str := 8; our $named := 32; our $flat := 64; our $flatnamed := 128; } # A call. A register holding the thing to call should be specified, along # with a set of flags describing the call site, followed by the arguments # themselves, which may be constants or come from registers. There is also # a set of flags, describing each argument. Some flags need two actual # arguments, one specifying the name, the next the actual value. class MAST::Call is MAST::Node { has $!target; has @!flags; has @!args; has $!result; has int $!op; method new(:$target!, :@flags!, :$result = MAST::Node, :$op = 0, *@args) { sanity_check(@flags, @args); my $obj := nqp::create(self); nqp::bindattr($obj, MAST::Call, '$!target', $target); nqp::bindattr($obj, MAST::Call, '@!flags', @flags); nqp::bindattr($obj, MAST::Call, '@!args', @args); nqp::bindattr($obj, MAST::Call, '$!result', $result); nqp::bindattr_i($obj, MAST::Call, '$!op', $op); $obj } sub sanity_check(@flags, @args) { my $flag_needed_args := 0; for @flags { $flag_needed_args := $flag_needed_args + ($_ +& $Arg::named ?? 2 !! 1); } if +@args < $flag_needed_args { nqp::die("Flags indicated there should be $flag_needed_args args, but have " ~ +@args); } } method dump_lines(@lines, $indent) { nqp::push(@lines, $indent~"MAST::Call"); nqp::push(@lines, "$indent target:"); nqp::push(@lines, $!target.dump($indent ~ ' ')); nqp::push(@lines, "$indent result:"); nqp::push(@lines, $!result.dump($indent ~ ' ')); nqp::push(@lines, "$indent flags:"); for @!flags -> $flag { my $str := "$indent "; if $flag +& $Arg::named { $str := $str ~ " named"; } elsif $flag +& $Arg::flat { $str := $str ~ " flat"; } elsif $flag +& $Arg::flatnamed { $str := $str ~ " flat/named"; } else { $str := $str ~ " positional" ; } $str := $str ~ " obj" if $flag +& $Arg::obj; $str := $str ~ " int" if $flag +& $Arg::int; $str := $str ~ " num" if $flag +& $Arg::num; $str := $str ~ " str" if $flag +& $Arg::str; nqp::push(@lines, $str); } nqp::push(@lines, "$indent args:"); nqp::push(@lines, $_.dump($indent ~ ' ')) for @!args; } } # A series of instructions that fall on a particular line in a particular source file class MAST::Annotated is MAST::Node { has str $!file; has int $!line; has @!instructions; method new(:$file = '', :$line!, :@instructions!) { my $obj := nqp::create(self); nqp::bindattr_s($obj, MAST::Annotated, '$!file', $file); nqp::bindattr_i($obj, MAST::Annotated, '$!line', $line); nqp::bindattr($obj, MAST::Annotated, '@!instructions', @instructions); $obj } method dump_lines(@lines, $indent) { nqp::push(@lines, $indent~"MAST::Annotated: file: $!file, line: $!line, instructions:"); nqp::push(@lines, $_.dump($indent ~ ' ')) for @!instructions; } } # Handler constants. module HandlerAction { our $unwind_and_goto := 0; our $unwind_and_goto_with_payload := 1; our $invoke_and_we'll_see := 2; } # Category constants. module HandlerCategory { our $catch := 1; our $control := 2; our $next := 4; our $redo := 8; our $last := 16; our $return := 32; our $unwind := 64; our $take := 128; our $warn := 256; our $succeed := 512; our $proceed := 1024; our $labeled := 4096; our $await := 8192; our $emit := 16384; our $done := 32768; } # A region with a handler. class MAST::HandlerScope is MAST::Node { has @!instructions; has int $!category_mask; has int $!action; has $!goto_label; has $!block_local; has $!label_local; method new(:@instructions!, :$category_mask!, :$action!, :$goto!, :$block, :$label) { my $obj := nqp::create(self); nqp::bindattr($obj, MAST::HandlerScope, '@!instructions', @instructions); nqp::bindattr_i($obj, MAST::HandlerScope, '$!category_mask', $category_mask); nqp::bindattr_i($obj, MAST::HandlerScope, '$!action', $action); if nqp::istype($goto, MAST::Label) { nqp::bindattr($obj, MAST::HandlerScope, '$!goto_label', $goto); } else { nqp::die("Handler needs a MAST::Label to unwind to"); } if $action == $HandlerAction::invoke_and_we'll_see { if nqp::istype($block, MAST::Local) { nqp::bindattr($obj, MAST::HandlerScope, '$!block_local', $block); } else { nqp::die("Handler action invoke-and-we'll-see needs a MAST::Local to invoke"); } } elsif $action != $HandlerAction::unwind_and_goto && $action != $HandlerAction::unwind_and_goto_with_payload { nqp::die("Unknown handler action"); } if $category_mask +& $HandlerCategory::labeled { if nqp::istype($label, MAST::Local) { nqp::bindattr($obj, MAST::HandlerScope, '$!label_local', $label); } else { nqp::die("Handler category 'labeled' needs a MAST::Local"); } } $obj } } MoarVM-2018.03/lib/MAST/Ops.nqp0000644000175000017510000020155513252330426016006 0ustar samanthasamantha# This file is generated from src/core/oplist by tools/update_ops.p6. class MAST::Ops {} BEGIN { MAST::Ops.WHO<@offsets> := nqp::list_i(0, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 99, 102, 103, 104, 105, 106, 106, 109, 112, 115, 118, 121, 124, 127, 130, 133, 136, 139, 142, 145, 148, 150, 152, 153, 154, 155, 156, 159, 162, 165, 167, 170, 173, 176, 178, 181, 184, 187, 190, 193, 196, 199, 202, 205, 208, 211, 214, 217, 220, 222, 224, 227, 229, 231, 233, 235, 237, 239, 241, 243, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 281, 283, 285, 287, 289, 291, 293, 295, 296, 298, 300, 302, 304, 306, 308, 310, 312, 314, 317, 320, 323, 326, 328, 330, 332, 334, 337, 340, 343, 346, 348, 349, 351, 353, 354, 356, 357, 359, 361, 363, 365, 367, 369, 371, 373, 375, 377, 379, 381, 383, 384, 385, 386, 388, 390, 392, 393, 394, 396, 399, 402, 405, 408, 411, 414, 416, 419, 423, 426, 427, 429, 432, 435, 438, 441, 444, 447, 450, 454, 458, 464, 467, 470, 474, 478, 480, 482, 485, 488, 490, 492, 494, 497, 500, 502, 506, 510, 512, 515, 520, 525, 527, 529, 531, 534, 538, 540, 542, 544, 548, 553, 558, 561, 565, 571, 576, 580, 583, 585, 587, 588, 590, 592, 595, 598, 601, 604, 606, 608, 610, 613, 616, 618, 620, 622, 624, 627, 629, 631, 634, 639, 644, 649, 654, 658, 662, 666, 670, 675, 680, 685, 690, 694, 698, 702, 706, 710, 713, 716, 719, 721, 723, 725, 728, 731, 734, 737, 740, 743, 746, 749, 751, 753, 755, 757, 759, 761, 763, 765, 767, 769, 771, 773, 775, 777, 779, 781, 785, 787, 790, 793, 796, 799, 802, 805, 808, 811, 814, 817, 819, 821, 822, 823, 826, 829, 831, 833, 835, 837, 840, 842, 844, 845, 846, 847, 848, 849, 850, 851, 852, 854, 856, 858, 860, 862, 864, 865, 866, 867, 868, 869, 871, 874, 876, 879, 882, 885, 887, 889, 891, 894, 894, 894, 896, 898, 900, 902, 904, 906, 908, 910, 912, 916, 918, 920, 921, 922, 924, 926, 927, 928, 930, 932, 934, 936, 939, 941, 943, 946, 949, 952, 954, 957, 959, 961, 963, 965, 968, 973, 976, 979, 980, 981, 982, 983, 985, 987, 990, 993, 995, 997, 999, 1000, 1002, 1004, 1006, 1007, 1008, 1012, 1016, 1020, 1024, 1028, 1031, 1034, 1037, 1040, 1043, 1046, 1049, 1052, 1055, 1059, 1063, 1067, 1070, 1074, 1078, 1083, 1087, 1091, 1096, 1099, 1102, 1104, 1106, 1109, 1112, 1114, 1116, 1119, 1125, 1128, 1130, 1132, 1134, 1135, 1137, 1139, 1141, 1142, 1144, 1146, 1147, 1150, 1151, 1154, 1157, 1160, 1163, 1166, 1169, 1170, 1171, 1173, 1175, 1176, 1177, 1178, 1181, 1183, 1187, 1189, 1191, 1195, 1198, 1200, 1201, 1202, 1204, 1206, 1209, 1212, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1224, 1225, 1226, 1227, 1235, 1236, 1237, 1238, 1240, 1241, 1244, 1245, 1247, 1248, 1250, 1253, 1256, 1259, 1261, 1264, 1267, 1270, 1272, 1273, 1274, 1275, 1276, 1284, 1286, 1288, 1290, 1293, 1295, 1298, 1300, 1305, 1306, 1309, 1311, 1313, 1315, 1316, 1317, 1319, 1322, 1326, 1329, 1331, 1335, 1336, 1339, 1339, 1341, 1344, 1347, 1350, 1354, 1361, 1365, 1366, 1367, 1369, 1369, 1370, 1371, 1372, 1373, 1375, 1376, 1379, 1380, 1381, 1382, 1384, 1388, 1390, 1392, 1398, 1399, 1404, 1409, 1415, 1422, 1428, 1434, 1439, 1445, 1447, 1449, 1450, 1452, 1454, 1456, 1459, 1462, 1465, 1468, 1472, 1476, 1480, 1484, 1484, 1488, 1494, 1496, 1497, 1498, 1500, 1502, 1502, 1507, 1509, 1511, 1514, 1516, 1518, 1521, 1523, 1526, 1528, 1530, 1532, 1534, 1536, 1538, 1540, 1542, 1544, 1545, 1547, 1549, 1551, 1553, 1555, 1557, 1559, 1561, 1564, 1567, 1570, 1575, 1580, 1585, 1589, 1593, 1597, 1599, 1603, 1606, 1608, 1611, 1613, 1617, 1620, 1621, 1622, 1623, 1627, 1631, 1635, 1639, 1644, 1649, 1654, 1659, 1662, 1665, 1668, 1671, 1675, 1679, 1683, 1687, 1692, 1697, 1702, 1707, 1710, 1713, 1716, 1719, 1721, 1723, 1725, 1727, 1729, 1731, 1733, 1735, 1740, 1742, 1745, 1748, 1751, 1753, 1760, 1768, 1776, 1778, 1780, 1782, 1784, 1786, 1788, 1790, 1792, 1794, 1796, 1799, 1801, 1803, 1805, 1807, 1809, 1811, 1813, 1815, 1817, 1819, 1821, 1823, 1825, 1827, 1829, 1832, 1834, 1837, 1840, 1844, 1847, 1850, 1852, 1853, 1855, 1858, 1861, 1862, 1865, 1868, 1870, 1872, 1875, 1877, 1879, 1883, 1885, 1889, 1891, 1893, 1894, 1900, 1902, 1904, 1908, 1910, 1911, 1915, 1919, 1922, 1926, 1930, 1934, 1936, 1938, 1941, 1943, 1945, 1947, 1949, 1949, 1950, 1952, 1955, 1958, 1961, 1964, 1966, 1968, 1970, 1972, 1975, 1981, 1986, 1990, 1995, 1996, 1999, 2002, 2005, 2008, 2011, 2015, 2017, 2019, 2021, 2023, 2025, 2027, 2029, 2031, 2033, 2035, 2038, 2041, 2044, 2047, 2048, 2050, 2054, 2057, 2060, 2063, 2066, 2069, 2072, 2075, 2078, 2081, 2084, 2087, 2090, 2093, 2096, 2099, 2102, 2106, 2110, 2113, 2116, 2119, 2122, 2125, 2128, 2131, 2134, 2137, 2140, 2143, 2147, 2151, 2152, 2154, 2156, 2158, 2162, 2164, 2166, 2166, 2166, 2167, 2168, 2168, 2169, 2171, 2175); MAST::Ops.WHO<@counts> := nqp::list_i(0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 3, 1, 1, 1, 1, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 2, 1, 2, 2, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 1, 1, 2, 3, 3, 3, 3, 3, 3, 2, 3, 4, 3, 1, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 6, 3, 3, 4, 4, 2, 2, 3, 3, 2, 2, 2, 3, 3, 2, 4, 4, 2, 3, 5, 5, 2, 2, 2, 3, 4, 2, 2, 2, 4, 5, 5, 3, 4, 6, 5, 4, 3, 2, 2, 1, 2, 2, 3, 3, 3, 3, 2, 2, 2, 3, 3, 2, 2, 2, 2, 3, 2, 2, 3, 5, 5, 5, 5, 4, 4, 4, 4, 5, 5, 5, 5, 4, 4, 4, 4, 4, 3, 3, 3, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 1, 1, 3, 3, 2, 2, 2, 2, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 3, 2, 3, 3, 3, 2, 2, 2, 3, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 2, 2, 3, 2, 2, 3, 3, 3, 2, 3, 2, 2, 2, 2, 3, 5, 3, 3, 1, 1, 1, 1, 2, 2, 3, 3, 2, 2, 2, 1, 2, 2, 2, 1, 1, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 4, 4, 5, 4, 4, 5, 3, 3, 2, 2, 3, 3, 2, 2, 3, 6, 3, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 1, 3, 1, 3, 3, 3, 3, 3, 3, 1, 1, 2, 2, 1, 1, 1, 3, 2, 4, 2, 2, 4, 3, 2, 1, 1, 2, 2, 3, 3, 3, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 8, 1, 1, 1, 2, 1, 3, 1, 2, 1, 2, 3, 3, 3, 2, 3, 3, 3, 2, 1, 1, 1, 1, 8, 2, 2, 2, 3, 2, 3, 2, 5, 1, 3, 2, 2, 2, 1, 1, 2, 3, 4, 3, 2, 4, 1, 3, 0, 2, 3, 3, 3, 4, 7, 4, 1, 1, 2, 0, 1, 1, 1, 1, 2, 1, 3, 1, 1, 1, 2, 4, 2, 2, 6, 1, 5, 5, 6, 7, 6, 6, 5, 6, 2, 2, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 0, 4, 6, 2, 1, 1, 2, 2, 0, 5, 2, 2, 3, 2, 2, 3, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 5, 5, 5, 4, 4, 4, 2, 4, 3, 2, 3, 2, 4, 3, 1, 1, 1, 4, 4, 4, 4, 5, 5, 5, 5, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 3, 3, 3, 2, 7, 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 3, 3, 4, 3, 3, 2, 1, 2, 3, 3, 1, 3, 3, 2, 2, 3, 2, 2, 4, 2, 4, 2, 2, 1, 6, 2, 2, 4, 2, 1, 4, 4, 3, 4, 4, 4, 2, 2, 3, 2, 2, 2, 2, 0, 1, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 6, 5, 4, 5, 1, 3, 3, 3, 3, 3, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 1, 2, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 1, 2, 2, 2, 4, 2, 2, 0, 0, 1, 1, 0, 1, 2, 4, 2); MAST::Ops.WHO<@values> := nqp::list_i(10, 8, 18, 16, 26, 24, 34, 32, 42, 40, 50, 48, 58, 56, 82, 81, 162, 137, 162, 145, 162, 153, 34, 9, 34, 17, 34, 25, 138, 161, 146, 161, 154, 161, 10, 33, 18, 33, 26, 33, 50, 41, 42, 49, 72, 33, 72, 33, 72, 49, 72, 49, 72, 57, 72, 57, 72, 57, 72, 57, 72, 65, 72, 65, 72, 32, 33, 82, 83, 84, 81, 34, 56, 50, 56, 58, 56, 66, 56, 56, 33, 56, 49, 56, 57, 56, 65, 66, 57, 57, 65, 66, 57, 57, 65, 65, 56, 65, 16, 34, 65, 57, 33, 49, 57, 65, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 162, 161, 161, 34, 33, 33, 162, 161, 161, 34, 33, 34, 33, 34, 162, 34, 162, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 34, 33, 33, 34, 33, 33, 34, 49, 49, 34, 49, 49, 34, 49, 49, 34, 49, 49, 34, 49, 49, 34, 49, 49, 34, 49, 49, 50, 49, 49, 50, 49, 49, 50, 49, 49, 50, 49, 49, 50, 49, 49, 50, 49, 50, 49, 50, 49, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 33, 34, 49, 58, 33, 58, 49, 34, 57, 50, 57, 50, 65, 58, 65, 104, 16, 33, 16, 49, 16, 57, 16, 65, 16, 32, 16, 48, 16, 56, 65, 34, 65, 50, 65, 58, 65, 66, 65, 16, 16, 34, 16, 50, 16, 58, 16, 66, 16, 34, 16, 72, 50, 16, 72, 58, 16, 72, 66, 16, 72, 34, 56, 50, 56, 58, 56, 66, 56, 34, 56, 72, 50, 56, 72, 58, 56, 72, 66, 56, 72, 66, 16, 66, 66, 96, 66, 33, 65, 66, 65, 66, 65, 57, 65, 65, 65, 33, 58, 65, 66, 65, 34, 65, 66, 65, 66, 65, 66, 65, 66, 32, 66, 32, 66, 32, 66, 57, 65, 65, 66, 66, 72, 66, 65, 66, 65, 66, 66, 34, 65, 66, 65, 33, 34, 65, 33, 50, 65, 33, 58, 65, 33, 34, 65, 33, 34, 65, 57, 34, 65, 66, 65, 65, 66, 65, 65, 65, 66, 65, 65, 58, 34, 57, 34, 57, 57, 34, 57, 57, 34, 57, 57, 34, 57, 57, 34, 57, 57, 34, 57, 57, 34, 57, 57, 34, 57, 57, 33, 34, 57, 57, 33, 34, 57, 33, 33, 57, 33, 58, 57, 57, 58, 57, 33, 58, 57, 33, 33, 34, 57, 57, 33, 34, 57, 34, 57, 34, 57, 33, 34, 57, 33, 58, 57, 58, 57, 58, 57, 66, 57, 57, 58, 57, 65, 34, 57, 57, 33, 56, 72, 57, 33, 56, 72, 34, 57, 34, 33, 57, 34, 57, 33, 33, 33, 34, 57, 33, 16, 16, 34, 57, 58, 33, 34, 57, 34, 57, 33, 34, 57, 57, 33, 58, 57, 58, 57, 65, 33, 34, 33, 57, 33, 34, 33, 57, 33, 33, 34, 33, 57, 33, 33, 66, 65, 65, 66, 65, 57, 33, 65, 57, 33, 65, 65, 65, 66, 33, 57, 33, 33, 66, 57, 57, 65, 58, 65, 57, 34, 57, 34, 57, 66, 34, 65, 65, 72, 66, 65, 56, 66, 65, 57, 34, 65, 56, 34, 65, 57, 66, 65, 66, 65, 34, 65, 66, 65, 65, 34, 65, 65, 34, 65, 66, 65, 66, 65, 66, 65, 66, 65, 65, 58, 65, 34, 65, 34, 65, 65, 65, 65, 56, 33, 16, 65, 65, 56, 49, 16, 65, 65, 56, 57, 16, 65, 65, 56, 65, 16, 65, 65, 57, 33, 65, 65, 57, 49, 65, 65, 57, 57, 65, 65, 57, 65, 34, 65, 65, 56, 16, 50, 65, 65, 56, 16, 58, 65, 65, 56, 16, 66, 65, 65, 56, 16, 34, 65, 65, 57, 50, 65, 65, 57, 58, 65, 65, 57, 66, 65, 65, 57, 34, 65, 65, 57, 66, 33, 65, 66, 49, 65, 66, 57, 65, 34, 65, 50, 65, 58, 65, 34, 65, 33, 50, 65, 33, 58, 65, 33, 66, 65, 33, 65, 33, 33, 65, 33, 49, 65, 33, 57, 65, 33, 65, 65, 33, 65, 49, 65, 57, 65, 65, 34, 65, 50, 65, 58, 65, 66, 65, 34, 65, 50, 65, 58, 65, 66, 65, 65, 33, 65, 49, 65, 57, 65, 65, 65, 65, 33, 33, 65, 33, 34, 65, 33, 34, 65, 57, 50, 65, 57, 58, 65, 57, 66, 65, 57, 65, 57, 33, 65, 57, 49, 65, 57, 57, 65, 57, 65, 34, 65, 57, 65, 57, 34, 65, 66, 66, 66, 65, 57, 66, 65, 65, 65, 65, 65, 33, 65, 65, 65, 33, 65, 33, 65, 34, 65, 34, 65, 66, 66, 66, 66, 66, 66, 66, 66, 34, 65, 34, 65, 34, 65, 34, 65, 34, 65, 57, 65, 66, 66, 66, 66, 66, 66, 57, 66, 57, 65, 66, 57, 66, 57, 65, 66, 57, 57, 57, 57, 65, 65, 57, 65, 33, 66, 65, 66, 65, 57, 66, 65, 58, 65, 66, 65, 58, 65, 34, 65, 66, 65, 65, 65, 65, 57, 65, 65, 65, 65, 57, 65, 34, 65, 66, 65, 65, 65, 66, 65, 58, 65, 65, 66, 65, 65, 65, 65, 34, 65, 66, 65, 65, 57, 65, 58, 57, 66, 57, 65, 33, 65, 65, 33, 65, 66, 65, 33, 58, 65, 34, 65, 65, 65, 57, 34, 65, 65, 65, 66, 65, 58, 65, 65, 57, 65, 65, 65, 65, 66, 16, 16, 66, 16, 32, 34, 34, 65, 66, 58, 65, 58, 57, 65, 65, 57, 66, 65, 65, 34, 65, 66, 65, 66, 65, 66, 66, 65, 66, 65, 66, 65, 66, 66, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 66, 65, 65, 34, 65, 65, 34, 65, 65, 34, 65, 65, 34, 65, 65, 34, 65, 65, 34, 65, 65, 34, 65, 65, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 66, 65, 33, 65, 66, 65, 33, 65, 66, 65, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 65, 65, 34, 65, 33, 66, 65, 65, 50, 65, 58, 65, 66, 49, 65, 66, 57, 65, 34, 65, 34, 65, 58, 65, 33, 66, 33, 57, 33, 33, 65, 50, 65, 65, 57, 57, 57, 57, 57, 57, 57, 57, 33, 34, 57, 57, 33, 57, 66, 57, 58, 65, 65, 66, 57, 57, 65, 58, 65, 33, 58, 57, 57, 57, 57, 57, 34, 65, 57, 65, 33, 33, 34, 65, 33, 65, 65, 65, 33, 34, 65, 66, 66, 66, 65, 57, 33, 66, 33, 65, 57, 33, 33, 65, 57, 66, 65, 65, 57, 33, 65, 65, 57, 65, 65, 57, 57, 57, 58, 65, 34, 65, 34, 57, 33, 66, 65, 56, 66, 65, 57, 57, 33, 34, 50, 34, 49, 66, 65, 33, 65, 50, 33, 34, 57, 57, 65, 65, 65, 65, 33, 58, 66, 66, 57, 57, 57, 66, 57, 57, 65, 57, 57, 66, 66, 57, 66, 65, 57, 66, 65, 57, 66, 65, 57, 66, 57, 58, 57, 57, 58, 57, 57, 58, 57, 57, 34, 49, 50, 50, 50, 34, 34, 65, 57, 65, 65, 65, 65, 33, 34, 57, 34, 57, 34, 57, 34, 65, 57, 66, 65, 65, 65, 33, 65, 65, 58, 57, 33, 33, 57, 66, 65, 33, 33, 66, 65, 57, 57, 57, 57, 58, 65, 66, 65, 66, 65, 65, 66, 33, 65, 65, 66, 65, 65, 50, 49, 34, 57, 33, 57, 33, 34, 65, 57, 58, 33, 34, 33, 33, 34, 33, 33, 58, 33, 33, 34, 33, 33, 33, 34, 65, 57, 57, 57, 65, 65, 66, 65, 65, 65, 65, 65, 34, 65, 66, 65, 65, 65, 34, 65, 65, 66, 65, 65, 65, 65, 65, 66, 65, 65, 65, 57, 57, 66, 65, 66, 65, 66, 65, 65, 33, 33, 65, 65, 66, 65, 65, 33, 65, 66, 65, 65, 57, 65, 66, 65, 65, 57, 33, 65, 66, 65, 65, 57, 33, 33, 65, 66, 65, 65, 65, 57, 65, 66, 65, 65, 65, 65, 65, 66, 65, 65, 65, 65, 66, 65, 65, 65, 65, 65, 66, 57, 66, 57, 58, 34, 16, 34, 24, 34, 65, 34, 56, 56, 50, 56, 56, 58, 56, 56, 66, 56, 56, 34, 56, 56, 72, 50, 56, 56, 72, 58, 56, 56, 72, 66, 56, 56, 72, 66, 65, 65, 65, 66, 65, 65, 57, 65, 65, 65, 33, 65, 66, 34, 65, 65, 33, 66, 57, 57, 65, 65, 34, 65, 65, 65, 66, 65, 65, 66, 65, 66, 65, 66, 65, 33, 58, 57, 34, 57, 33, 34, 65, 34, 65, 34, 65, 65, 33, 65, 49, 65, 57, 34, 65, 50, 65, 58, 65, 66, 34, 65, 66, 57, 66, 35, 66, 51, 66, 59, 66, 56, 66, 56, 66, 56, 66, 65, 33, 66, 65, 33, 66, 65, 33, 66, 65, 65, 56, 16, 66, 65, 65, 56, 16, 66, 65, 65, 56, 16, 66, 65, 65, 57, 66, 65, 65, 57, 66, 65, 65, 57, 34, 65, 57, 57, 33, 65, 65, 33, 65, 58, 65, 57, 33, 65, 66, 65, 34, 57, 57, 33, 34, 57, 33, 65, 65, 66, 34, 65, 33, 33, 50, 65, 33, 33, 58, 65, 33, 33, 66, 65, 33, 33, 34, 65, 33, 33, 33, 50, 65, 33, 33, 33, 58, 65, 33, 33, 33, 66, 65, 33, 33, 33, 34, 65, 65, 50, 65, 65, 58, 65, 65, 66, 65, 65, 65, 33, 33, 33, 65, 33, 33, 49, 65, 33, 33, 57, 65, 33, 33, 65, 65, 33, 33, 33, 33, 65, 33, 33, 33, 49, 65, 33, 33, 33, 57, 65, 33, 33, 33, 65, 65, 65, 33, 65, 65, 49, 65, 65, 57, 65, 65, 65, 66, 65, 65, 65, 34, 65, 66, 65, 34, 65, 58, 57, 65, 65, 58, 65, 66, 57, 57, 57, 65, 34, 65, 66, 65, 65, 66, 65, 65, 66, 65, 65, 34, 65, 66, 65, 65, 57, 33, 33, 65, 66, 65, 65, 65, 57, 65, 57, 33, 66, 65, 65, 65, 65, 65, 57, 33, 34, 65, 34, 65, 66, 25, 66, 17, 66, 9, 66, 41, 66, 27, 66, 19, 66, 11, 66, 43, 66, 161, 65, 162, 65, 162, 33, 34, 161, 162, 49, 50, 161, 162, 65, 66, 161, 66, 153, 66, 145, 66, 137, 66, 163, 66, 155, 66, 147, 66, 139, 162, 16, 162, 16, 72, 162, 56, 162, 56, 72, 162, 56, 56, 162, 56, 56, 72, 50, 57, 33, 50, 57, 33, 65, 57, 65, 65, 57, 66, 32, 65, 66, 32, 65, 66, 65, 65, 65, 65, 57, 65, 65, 65, 65, 65, 58, 65, 33, 58, 65, 58, 65, 58, 65, 33, 33, 34, 65, 66, 65, 65, 33, 34, 65, 58, 57, 65, 34, 57, 57, 33, 33, 33, 65, 65, 58, 57, 34, 57, 57, 33, 34, 65, 34, 34, 57, 57, 33, 34, 57, 57, 33, 58, 65, 33, 34, 57, 57, 33, 66, 65, 65, 65, 34, 65, 33, 33, 34, 65, 34, 65, 34, 65, 33, 66, 65, 34, 65, 65, 65, 65, 33, 33, 65, 65, 34, 65, 65, 50, 65, 65, 58, 65, 65, 66, 65, 65, 34, 17, 50, 17, 58, 17, 66, 17, 66, 65, 65, 66, 57, 57, 57, 65, 33, 66, 57, 57, 65, 33, 58, 65, 57, 33, 58, 65, 57, 57, 33, 34, 65, 128, 152, 65, 128, 152, 65, 128, 152, 65, 128, 152, 65, 128, 152, 66, 65, 65, 152, 66, 65, 66, 65, 66, 67, 82, 83, 66, 56, 66, 16, 66, 16, 66, 16, 66, 16, 65, 16, 34, 65, 16, 50, 65, 16, 58, 65, 16, 66, 65, 16, 128, 66, 128, 66, 65, 56, 128, 66, 16, 128, 66, 65, 16, 34, 65, 16, 34, 65, 16, 34, 65, 16, 34, 65, 16, 50, 65, 16, 58, 65, 16, 65, 16, 65, 65, 16, 33, 65, 16, 33, 65, 16, 33, 65, 16, 33, 65, 16, 49, 65, 16, 57, 66, 65, 16, 66, 65, 16, 128, 66, 65, 16, 128, 34, 65, 16, 50, 65, 16, 58, 65, 16, 65, 16, 65, 65, 16, 33, 65, 16, 49, 65, 16, 57, 34, 65, 16, 50, 65, 16, 65, 33, 16, 65, 49, 16, 66, 16, 16, 65, 82, 16, 16, 65, 66, 34, 65, 34, 65, 34, 65, 66, 65, 65, 65, 66, 65, 65, 65, 128, 65, 65, 65, 16, 56, 24, 24, 32, 24, 24); MAST::Ops.WHO<%codes> := nqp::hash('no_op', 0, 'const_i8', 1, 'const_i16', 2, 'const_i32', 3, 'const_i64', 4, 'const_n32', 5, 'const_n64', 6, 'const_s', 7, 'set', 8, 'extend_u8', 9, 'extend_u16', 10, 'extend_u32', 11, 'extend_i8', 12, 'extend_i16', 13, 'extend_i32', 14, 'trunc_u8', 15, 'trunc_u16', 16, 'trunc_u32', 17, 'trunc_i8', 18, 'trunc_i16', 19, 'trunc_i32', 20, 'extend_n32', 21, 'trunc_n32', 22, 'goto', 23, 'if_i', 24, 'unless_i', 25, 'if_n', 26, 'unless_n', 27, 'if_s', 28, 'unless_s', 29, 'if_s0', 30, 'unless_s0', 31, 'if_o', 32, 'unless_o', 33, 'jumplist', 34, 'getlex', 35, 'bindlex', 36, 'getlex_ni', 37, 'getlex_nn', 38, 'getlex_ns', 39, 'getlex_no', 40, 'bindlex_ni', 41, 'bindlex_nn', 42, 'bindlex_ns', 43, 'bindlex_no', 44, 'getlex_ng', 45, 'bindlex_ng', 46, 'getdynlex', 47, 'binddynlex', 48, 'setlexvalue', 49, 'lexprimspec', 50, 'return_i', 51, 'return_n', 52, 'return_s', 53, 'return_o', 54, 'return', 55, 'eq_i', 56, 'ne_i', 57, 'lt_i', 58, 'le_i', 59, 'gt_i', 60, 'ge_i', 61, 'cmp_i', 62, 'add_i', 63, 'sub_i', 64, 'mul_i', 65, 'div_i', 66, 'div_u', 67, 'mod_i', 68, 'mod_u', 69, 'neg_i', 70, 'abs_i', 71, 'inc_i', 72, 'inc_u', 73, 'dec_i', 74, 'dec_u', 75, 'band_i', 76, 'bor_i', 77, 'bxor_i', 78, 'bnot_i', 79, 'blshift_i', 80, 'brshift_i', 81, 'pow_i', 82, 'not_i', 83, 'gcd_i', 84, 'lcm_i', 85, 'eq_n', 86, 'ne_n', 87, 'lt_n', 88, 'le_n', 89, 'gt_n', 90, 'ge_n', 91, 'cmp_n', 92, 'add_n', 93, 'sub_n', 94, 'mul_n', 95, 'div_n', 96, 'mod_n', 97, 'neg_n', 98, 'abs_n', 99, 'pow_n', 100, 'ceil_n', 101, 'floor_n', 102, 'sin_n', 103, 'asin_n', 104, 'cos_n', 105, 'acos_n', 106, 'tan_n', 107, 'atan_n', 108, 'atan2_n', 109, 'sec_n', 110, 'asec_n', 111, 'sinh_n', 112, 'cosh_n', 113, 'tanh_n', 114, 'sech_n', 115, 'sqrt_n', 116, 'log_n', 117, 'exp_n', 118, 'coerce_in', 119, 'coerce_ni', 120, 'coerce_is', 121, 'coerce_ns', 122, 'coerce_si', 123, 'coerce_sn', 124, 'smrt_numify', 125, 'smrt_strify', 126, 'prepargs', 127, 'arg_i', 128, 'arg_n', 129, 'arg_s', 130, 'arg_o', 131, 'argconst_i', 132, 'argconst_n', 133, 'argconst_s', 134, 'invoke_v', 135, 'invoke_i', 136, 'invoke_n', 137, 'invoke_s', 138, 'invoke_o', 139, 'checkarity', 140, 'param_rp_i', 141, 'param_rp_n', 142, 'param_rp_s', 143, 'param_rp_o', 144, 'param_op_i', 145, 'param_op_n', 146, 'param_op_s', 147, 'param_op_o', 148, 'param_rn_i', 149, 'param_rn_n', 150, 'param_rn_s', 151, 'param_rn_o', 152, 'param_on_i', 153, 'param_on_n', 154, 'param_on_s', 155, 'param_on_o', 156, 'param_sp', 157, 'param_sn', 158, 'getcode', 159, 'caller', 160, 'capturelex', 161, 'takeclosure', 162, 'exception', 163, 'bindexmessage', 164, 'bindexpayload', 165, 'bindexcategory', 166, 'getexmessage', 167, 'getexpayload', 168, 'getexcategory', 169, 'throwdyn', 170, 'throwlex', 171, 'throwlexotic', 172, 'throwcatdyn', 173, 'throwcatlex', 174, 'throwcatlexotic', 175, 'die', 176, 'rethrow', 177, 'resume', 178, 'takehandlerresult', 179, 'DEPRECATED_33', 180, 'DEPRECATED_34', 181, 'backtracestrings', 182, 'usecapture', 183, 'savecapture', 184, 'captureposelems', 185, 'captureposarg', 186, 'captureposarg_i', 187, 'captureposarg_n', 188, 'captureposarg_s', 189, 'captureposprimspec', 190, 'captureexistsnamed', 191, 'capturehasnameds', 192, 'invokewithcapture', 193, 'multicacheadd', 194, 'multicachefind', 195, 'null_s', 196, 'isnull_s', 197, 'eq_s', 198, 'ne_s', 199, 'gt_s', 200, 'ge_s', 201, 'lt_s', 202, 'le_s', 203, 'cmp_s', 204, 'eqat_s', 205, 'eqatic_s', 206, 'haveat_s', 207, 'concat_s', 208, 'repeat_s', 209, 'substr_s', 210, 'index_s', 211, 'graphs_s', 212, 'codes_s', 213, 'getcp_s', 214, 'indexcp_s', 215, 'uc', 216, 'lc', 217, 'tc', 218, 'split', 219, 'join', 220, 'getcpbyname', 221, 'indexat', 222, 'indexnat', 223, 'unipropcode', 224, 'unipvalcode', 225, 'hasuniprop', 226, 'hasunipropc', 227, 'chars', 228, 'chr', 229, 'ordfirst', 230, 'ordat', 231, 'rindexfrom', 232, 'escape', 233, 'flip', 234, 'setbuffersize_fh', 235, 'iscclass', 236, 'findcclass', 237, 'findnotcclass', 238, 'nfafromstatelist', 239, 'nfarunproto', 240, 'nfarunalt', 241, 'radix', 242, 'encode', 243, 'decode', 244, 'istrue_s', 245, 'isfalse_s', 246, 'null', 247, 'isnull', 248, 'ifnonnull', 249, 'findmeth', 250, 'findmeth_s', 251, 'can', 252, 'can_s', 253, 'create', 254, 'clone', 255, 'isconcrete', 256, 'rebless', 257, 'istype', 258, 'objprimspec', 259, 'gethow', 260, 'getwhat', 261, 'getwho', 262, 'setwho', 263, 'reprname', 264, 'getwhere', 265, 'eqaddr', 266, 'bindattr_i', 267, 'bindattr_n', 268, 'bindattr_s', 269, 'bindattr_o', 270, 'bindattrs_i', 271, 'bindattrs_n', 272, 'bindattrs_s', 273, 'bindattrs_o', 274, 'getattr_i', 275, 'getattr_n', 276, 'getattr_s', 277, 'getattr_o', 278, 'getattrs_i', 279, 'getattrs_n', 280, 'getattrs_s', 281, 'getattrs_o', 282, 'attrinited', 283, 'box_i', 284, 'box_n', 285, 'box_s', 286, 'unbox_i', 287, 'unbox_n', 288, 'unbox_s', 289, 'atpos_i', 290, 'atpos_n', 291, 'atpos_s', 292, 'atpos_o', 293, 'bindpos_i', 294, 'bindpos_n', 295, 'bindpos_s', 296, 'bindpos_o', 297, 'push_i', 298, 'push_n', 299, 'push_s', 300, 'push_o', 301, 'pop_i', 302, 'pop_n', 303, 'pop_s', 304, 'pop_o', 305, 'shift_i', 306, 'shift_n', 307, 'shift_s', 308, 'shift_o', 309, 'unshift_i', 310, 'unshift_n', 311, 'unshift_s', 312, 'unshift_o', 313, 'splice', 314, 'setelemspos', 315, 'existspos', 316, 'atkey_i', 317, 'atkey_n', 318, 'atkey_s', 319, 'atkey_o', 320, 'bindkey_i', 321, 'bindkey_n', 322, 'bindkey_s', 323, 'bindkey_o', 324, 'existskey', 325, 'deletekey', 326, 'elems', 327, 'knowhow', 328, 'knowhowattr', 329, 'newtype', 330, 'composetype', 331, 'setmethcache', 332, 'setmethcacheauth', 333, 'settypecache', 334, 'settypecheckmode', 335, 'setboolspec', 336, 'istrue', 337, 'isfalse', 338, 'bootint', 339, 'bootnum', 340, 'bootstr', 341, 'bootarray', 342, 'bootintarray', 343, 'bootnumarray', 344, 'bootstrarray', 345, 'boothash', 346, 'isint', 347, 'isnum', 348, 'isstr', 349, 'islist', 350, 'ishash', 351, 'sethllconfig', 352, 'hllboxtype_i', 353, 'hllboxtype_n', 354, 'hllboxtype_s', 355, 'hlllist', 356, 'hllhash', 357, 'getcomp', 358, 'bindcomp', 359, 'getcurhllsym', 360, 'bindcurhllsym', 361, 'gethllsym', 362, 'bindhllsym', 363, 'settypehll', 364, 'settypehllrole', 365, 'hllize', 366, 'hllizefor', 367, 'usecompileehllconfig', 368, 'usecompilerhllconfig', 369, 'iter', 370, 'iterkey_s', 371, 'iterval', 372, 'getcodename', 373, 'iscoderef', 374, 'getcodeobj', 375, 'setcodeobj', 376, 'setcodename', 377, 'forceouterctx', 378, 'setinvokespec', 379, 'isinvokable', 380, 'freshcoderef', 381, 'markcodestatic', 382, 'markcodestub', 383, 'getstaticcode', 384, 'getcodecuid', 385, 'setdispatcher', 386, 'takedispatcher', 387, 'assign', 388, 'assignunchecked', 389, 'iscont', 390, 'decont', 391, 'setcontspec', 392, 'sha1', 393, 'createsc', 394, 'scsetobj', 395, 'scsetcode', 396, 'scgetobj', 397, 'scgethandle', 398, 'scgetobjidx', 399, 'scsetdesc', 400, 'scobjcount', 401, 'setobjsc', 402, 'getobjsc', 403, 'serialize', 404, 'deserialize', 405, 'wval', 406, 'wval_wide', 407, 'scwbdisable', 408, 'scwbenable', 409, 'pushcompsc', 410, 'popcompsc', 411, 'scgetdesc', 412, 'loadbytecode', 413, 'masttofile', 414, 'masttocu', 415, 'iscompunit', 416, 'compunitmainline', 417, 'compunitcodes', 418, 'ctx', 419, 'ctxouter', 420, 'ctxcaller', 421, 'ctxlexpad', 422, 'curcode', 423, 'callercode', 424, 'add_I', 425, 'sub_I', 426, 'mul_I', 427, 'div_I', 428, 'mod_I', 429, 'neg_I', 430, 'abs_I', 431, 'cmp_I', 432, 'eq_I', 433, 'ne_I', 434, 'lt_I', 435, 'le_I', 436, 'gt_I', 437, 'ge_I', 438, 'bor_I', 439, 'bxor_I', 440, 'band_I', 441, 'bnot_I', 442, 'blshift_I', 443, 'brshift_I', 444, 'pow_I', 445, 'gcd_I', 446, 'lcm_I', 447, 'expmod_I', 448, 'isprime_I', 449, 'rand_I', 450, 'coerce_In', 451, 'coerce_Is', 452, 'coerce_nI', 453, 'coerce_sI', 454, 'isbig_I', 455, 'bool_I', 456, 'base_I', 457, 'radix_I', 458, 'div_In', 459, 'copy_f', 460, 'append_f', 461, 'rename_f', 462, 'delete_f', 463, 'chmod_f', 464, 'exists_f', 465, 'mkdir', 466, 'rmdir', 467, 'open_dir', 468, 'read_dir', 469, 'close_dir', 470, 'open_fh', 471, 'close_fh', 472, 'DEPRECATED_23', 473, 'DEPRECATED_27', 474, 'DEPRECATED_28', 475, 'DEPRECATED_18', 476, 'seek_fh', 477, 'lock_fh', 478, 'unlock_fh', 479, 'sync_fh', 480, 'trunc_fh', 481, 'eof_fh', 482, 'getstdin', 483, 'getstdout', 484, 'getstderr', 485, 'connect_sk', 486, 'socket', 487, 'bind_sk', 488, 'DEPRECATED_24', 489, 'accept_sk', 490, 'decodetocodes', 491, 'encodefromcodes', 492, 'DEPRECATED_17', 493, 'print', 494, 'say', 495, 'DEPRECATED_22', 496, 'tell_fh', 497, 'stat', 498, 'tryfindmeth', 499, 'tryfindmeth_s', 500, 'chdir', 501, 'srand', 502, 'rand_i', 503, 'rand_n', 504, 'time_i', 505, 'sleep', 506, 'newthread', 507, 'threadjoin', 508, 'time_n', 509, 'exit', 510, 'DEPRECATED_30', 511, 'cwd', 512, 'clargs', 513, 'getenvhash', 514, 'loadlib', 515, 'freelib', 516, 'findsym', 517, 'dropsym', 518, 'loadext', 519, 'backendconfig', 520, 'getlexouter', 521, 'getlexrel', 522, 'getlexreldyn', 523, 'getlexrelcaller', 524, 'getlexcaller', 525, 'bitand_s', 526, 'bitor_s', 527, 'bitxor_s', 528, 'isnanorinf', 529, 'inf', 530, 'neginf', 531, 'nan', 532, 'getpid', 533, 'DEPRECATED_29', 534, 'filereadable', 535, 'filewritable', 536, 'fileexecutable', 537, 'DEPRECATED_19', 538, 'capturenamedshash', 539, 'read_fhb', 540, 'write_fhb', 541, 'replace', 542, 'newexception', 543, 'permit', 544, 'backtrace', 545, 'symlink', 546, 'link', 547, 'gethostname', 548, 'exreturnafterunwind', 549, 'DEPRECATED_13', 550, 'continuationreset', 551, 'continuationcontrol', 552, 'continuationinvoke', 553, 'randscale_n', 554, 'uniisblock', 555, 'assertparamcheck', 556, 'hintfor', 557, 'paramnamesused', 558, 'getuniname', 559, 'getuniprop_int', 560, 'getuniprop_bool', 561, 'getuniprop_str', 562, 'matchuniprop', 563, 'nativecallbuild', 564, 'nativecallinvoke', 565, 'nativecallrefresh', 566, 'threadrun', 567, 'threadid', 568, 'threadyield', 569, 'currentthread', 570, 'lock', 571, 'unlock', 572, 'semacquire', 573, 'semtryacquire', 574, 'semrelease', 575, 'getlockcondvar', 576, 'condwait', 577, 'condsignalone', 578, 'condsignalall', 579, 'queuepoll', 580, 'setmultispec', 581, 'ctxouterskipthunks', 582, 'ctxcallerskipthunks', 583, 'timer', 584, 'cancel', 585, 'signal', 586, 'watchfile', 587, 'asyncconnect', 588, 'asynclisten', 589, 'DEPRECATED_14', 590, 'asyncwritebytes', 591, 'DEPRECATED_16', 592, 'asyncreadbytes', 593, 'getlexstatic_o', 594, 'getlexperinvtype_o', 595, 'execname', 596, 'const_i64_16', 597, 'const_i64_32', 598, 'isnonnull', 599, 'param_rn2_i', 600, 'param_rn2_n', 601, 'param_rn2_s', 602, 'param_rn2_o', 603, 'param_on2_i', 604, 'param_on2_n', 605, 'param_on2_s', 606, 'param_on2_o', 607, 'osrpoint', 608, 'nativecallcast', 609, 'spawnprocasync', 610, 'killprocasync', 611, 'startprofile', 612, 'endprofile', 613, 'objectid', 614, 'settypefinalize', 615, 'force_gc', 616, 'nativecallglobal', 617, 'DEPRECATED_32', 618, 'setparameterizer', 619, 'parameterizetype', 620, 'typeparameterized', 621, 'typeparameters', 622, 'typeparameterat', 623, 'readlink', 624, 'lstat', 625, 'iscont_i', 626, 'iscont_n', 627, 'iscont_s', 628, 'assign_i', 629, 'assign_n', 630, 'assign_s', 631, 'decont_i', 632, 'decont_n', 633, 'decont_s', 634, 'getrusage', 635, 'threadlockcount', 636, 'DEPRECATED_4', 637, 'getlexref_i', 638, 'getlexref_n', 639, 'getlexref_s', 640, 'getlexref_ni', 641, 'getlexref_nn', 642, 'getlexref_ns', 643, 'atposref_i', 644, 'atposref_n', 645, 'atposref_s', 646, 'getattrref_i', 647, 'getattrref_n', 648, 'getattrref_s', 649, 'getattrsref_i', 650, 'getattrsref_n', 651, 'getattrsref_s', 652, 'nativecallsizeof', 653, 'encodenorm', 654, 'normalizecodes', 655, 'strfromcodes', 656, 'strtocodes', 657, 'getcodelocation', 658, 'eqatim_s', 659, 'ordbaseat', 660, 'neverrepossess', 661, 'scdisclaim', 662, 'DEPRECATED_31', 663, 'atpos2d_i', 664, 'atpos2d_n', 665, 'atpos2d_s', 666, 'atpos2d_o', 667, 'atpos3d_i', 668, 'atpos3d_n', 669, 'atpos3d_s', 670, 'atpos3d_o', 671, 'atposnd_i', 672, 'atposnd_n', 673, 'atposnd_s', 674, 'atposnd_o', 675, 'bindpos2d_i', 676, 'bindpos2d_n', 677, 'bindpos2d_s', 678, 'bindpos2d_o', 679, 'bindpos3d_i', 680, 'bindpos3d_n', 681, 'bindpos3d_s', 682, 'bindpos3d_o', 683, 'bindposnd_i', 684, 'bindposnd_n', 685, 'bindposnd_s', 686, 'bindposnd_o', 687, 'dimensions', 688, 'setdimensions', 689, 'numdimensions', 690, 'ctxcode', 691, 'isrwcont', 692, 'fc', 693, 'DEPRECATED_25', 694, 'DEPRECATED_21', 695, 'encoderep', 696, 'istty_fh', 697, 'multidimref_i', 698, 'multidimref_n', 699, 'multidimref_s', 700, 'fileno_fh', 701, 'asyncudp', 702, 'DEPRECATED_15', 703, 'asyncwritebytesto', 704, 'objprimbits', 705, 'objprimunsigned', 706, 'DEPRECATED_5', 707, 'DEPRECATED_6', 708, 'DEPRECATED_7', 709, 'DEPRECATED_8', 710, 'getlexref_i32', 711, 'getlexref_i16', 712, 'getlexref_i8', 713, 'getlexref_n32', 714, 'box_u', 715, 'unbox_u', 716, 'coerce_iu', 717, 'coerce_ui', 718, 'coerce_nu', 719, 'coerce_un', 720, 'decont_u', 721, 'DEPRECATED_9', 722, 'DEPRECATED_10', 723, 'DEPRECATED_11', 724, 'DEPRECATED_12', 725, 'getlexref_u', 726, 'getlexref_u32', 727, 'getlexref_u16', 728, 'getlexref_u8', 729, 'param_rp_u', 730, 'param_op_u', 731, 'param_rn_u', 732, 'param_on_u', 733, 'param_rn2_u', 734, 'param_on2_u', 735, 'stat_time', 736, 'lstat_time', 737, 'setdebugtypename', 738, 'loadbytecodebuffer', 739, 'loadbytecodefh', 740, 'throwpayloadlex', 741, 'throwpayloadlexcaller', 742, 'lastexpayload', 743, 'cancelnotify', 744, 'decoderconfigure', 745, 'decodersetlineseps', 746, 'decoderaddbytes', 747, 'decodertakechars', 748, 'decodertakeallchars', 749, 'decodertakeavailablechars', 750, 'decodertakeline', 751, 'decoderbytesavailable', 752, 'decodertakebytes', 753, 'decoderempty', 754, 'indexingoptimized', 755, 'captureinnerlex', 756, 'unicmp_s', 757, 'setdispatcherfor', 758, 'getstrfromname', 759, 'indexic_s', 760, 'getport_sk', 761, 'cpucores', 762, 'eqaticim_s', 763, 'indexicim_s', 764, 'decodertakecharseof', 765, 'indexim_s', 766, 'cas_o', 767, 'cas_i', 768, 'atomicinc_i', 769, 'atomicdec_i', 770, 'atomicadd_i', 771, 'atomicload_o', 772, 'atomicload_i', 773, 'atomicstore_o', 774, 'atomicstore_i', 775, 'barrierfull', 776, 'coveragecontrol', 777, 'nativeinvoke_v', 778, 'nativeinvoke_i', 779, 'nativeinvoke_n', 780, 'nativeinvoke_s', 781, 'nativeinvoke_o', 782, 'getarg_i', 783, 'getarg_n', 784, 'getarg_s', 785, 'getarg_o', 786, 'coerce_II', 787, 'encoderepconf', 788, 'encodeconf', 789, 'decodeconf', 790, 'decoderepconf', 791, 'getppid', 792, 'sp_guard', 793, 'sp_guardconc', 794, 'sp_guardtype', 795, 'sp_guardsf', 796, 'sp_guardsfouter', 797, 'sp_rebless', 798, 'sp_resolvecode', 799, 'sp_decont', 800, 'sp_getlex_o', 801, 'sp_getlex_ins', 802, 'sp_getlex_no', 803, 'sp_getarg_o', 804, 'sp_getarg_i', 805, 'sp_getarg_n', 806, 'sp_getarg_s', 807, 'sp_fastinvoke_v', 808, 'sp_fastinvoke_i', 809, 'sp_fastinvoke_n', 810, 'sp_fastinvoke_s', 811, 'sp_fastinvoke_o', 812, 'sp_paramnamesused', 813, 'sp_getspeshslot', 814, 'sp_findmeth', 815, 'sp_fastcreate', 816, 'sp_get_o', 817, 'sp_get_i64', 818, 'sp_get_i32', 819, 'sp_get_i16', 820, 'sp_get_i8', 821, 'sp_get_n', 822, 'sp_get_s', 823, 'sp_bind_o', 824, 'sp_bind_i64', 825, 'sp_bind_i32', 826, 'sp_bind_i16', 827, 'sp_bind_i8', 828, 'sp_bind_n', 829, 'sp_bind_s', 830, 'sp_p6oget_o', 831, 'sp_p6ogetvt_o', 832, 'sp_p6ogetvc_o', 833, 'sp_p6oget_i', 834, 'sp_p6oget_n', 835, 'sp_p6oget_s', 836, 'sp_p6obind_o', 837, 'sp_p6obind_i', 838, 'sp_p6obind_n', 839, 'sp_p6obind_s', 840, 'sp_deref_get_i64', 841, 'sp_deref_get_n', 842, 'sp_deref_bind_i64', 843, 'sp_deref_bind_n', 844, 'sp_getlexvia_o', 845, 'sp_getlexvia_ins', 846, 'sp_jit_enter', 847, 'sp_boolify_iter', 848, 'sp_boolify_iter_arr', 849, 'sp_boolify_iter_hash', 850, 'sp_cas_o', 851, 'sp_atomicload_o', 852, 'sp_atomicstore_o', 853, 'prof_enter', 854, 'prof_enterspesh', 855, 'prof_enterinline', 856, 'prof_enternative', 857, 'prof_exit', 858, 'prof_allocated', 859, 'ctw_check', 860, 'coverage_log', 861, 'breakpoint', 862); MAST::Ops.WHO<@names> := nqp::list_s('no_op', 'const_i8', 'const_i16', 'const_i32', 'const_i64', 'const_n32', 'const_n64', 'const_s', 'set', 'extend_u8', 'extend_u16', 'extend_u32', 'extend_i8', 'extend_i16', 'extend_i32', 'trunc_u8', 'trunc_u16', 'trunc_u32', 'trunc_i8', 'trunc_i16', 'trunc_i32', 'extend_n32', 'trunc_n32', 'goto', 'if_i', 'unless_i', 'if_n', 'unless_n', 'if_s', 'unless_s', 'if_s0', 'unless_s0', 'if_o', 'unless_o', 'jumplist', 'getlex', 'bindlex', 'getlex_ni', 'getlex_nn', 'getlex_ns', 'getlex_no', 'bindlex_ni', 'bindlex_nn', 'bindlex_ns', 'bindlex_no', 'getlex_ng', 'bindlex_ng', 'getdynlex', 'binddynlex', 'setlexvalue', 'lexprimspec', 'return_i', 'return_n', 'return_s', 'return_o', 'return', 'eq_i', 'ne_i', 'lt_i', 'le_i', 'gt_i', 'ge_i', 'cmp_i', 'add_i', 'sub_i', 'mul_i', 'div_i', 'div_u', 'mod_i', 'mod_u', 'neg_i', 'abs_i', 'inc_i', 'inc_u', 'dec_i', 'dec_u', 'band_i', 'bor_i', 'bxor_i', 'bnot_i', 'blshift_i', 'brshift_i', 'pow_i', 'not_i', 'gcd_i', 'lcm_i', 'eq_n', 'ne_n', 'lt_n', 'le_n', 'gt_n', 'ge_n', 'cmp_n', 'add_n', 'sub_n', 'mul_n', 'div_n', 'mod_n', 'neg_n', 'abs_n', 'pow_n', 'ceil_n', 'floor_n', 'sin_n', 'asin_n', 'cos_n', 'acos_n', 'tan_n', 'atan_n', 'atan2_n', 'sec_n', 'asec_n', 'sinh_n', 'cosh_n', 'tanh_n', 'sech_n', 'sqrt_n', 'log_n', 'exp_n', 'coerce_in', 'coerce_ni', 'coerce_is', 'coerce_ns', 'coerce_si', 'coerce_sn', 'smrt_numify', 'smrt_strify', 'prepargs', 'arg_i', 'arg_n', 'arg_s', 'arg_o', 'argconst_i', 'argconst_n', 'argconst_s', 'invoke_v', 'invoke_i', 'invoke_n', 'invoke_s', 'invoke_o', 'checkarity', 'param_rp_i', 'param_rp_n', 'param_rp_s', 'param_rp_o', 'param_op_i', 'param_op_n', 'param_op_s', 'param_op_o', 'param_rn_i', 'param_rn_n', 'param_rn_s', 'param_rn_o', 'param_on_i', 'param_on_n', 'param_on_s', 'param_on_o', 'param_sp', 'param_sn', 'getcode', 'caller', 'capturelex', 'takeclosure', 'exception', 'bindexmessage', 'bindexpayload', 'bindexcategory', 'getexmessage', 'getexpayload', 'getexcategory', 'throwdyn', 'throwlex', 'throwlexotic', 'throwcatdyn', 'throwcatlex', 'throwcatlexotic', 'die', 'rethrow', 'resume', 'takehandlerresult', 'DEPRECATED_33', 'DEPRECATED_34', 'backtracestrings', 'usecapture', 'savecapture', 'captureposelems', 'captureposarg', 'captureposarg_i', 'captureposarg_n', 'captureposarg_s', 'captureposprimspec', 'captureexistsnamed', 'capturehasnameds', 'invokewithcapture', 'multicacheadd', 'multicachefind', 'null_s', 'isnull_s', 'eq_s', 'ne_s', 'gt_s', 'ge_s', 'lt_s', 'le_s', 'cmp_s', 'eqat_s', 'eqatic_s', 'haveat_s', 'concat_s', 'repeat_s', 'substr_s', 'index_s', 'graphs_s', 'codes_s', 'getcp_s', 'indexcp_s', 'uc', 'lc', 'tc', 'split', 'join', 'getcpbyname', 'indexat', 'indexnat', 'unipropcode', 'unipvalcode', 'hasuniprop', 'hasunipropc', 'chars', 'chr', 'ordfirst', 'ordat', 'rindexfrom', 'escape', 'flip', 'setbuffersize_fh', 'iscclass', 'findcclass', 'findnotcclass', 'nfafromstatelist', 'nfarunproto', 'nfarunalt', 'radix', 'encode', 'decode', 'istrue_s', 'isfalse_s', 'null', 'isnull', 'ifnonnull', 'findmeth', 'findmeth_s', 'can', 'can_s', 'create', 'clone', 'isconcrete', 'rebless', 'istype', 'objprimspec', 'gethow', 'getwhat', 'getwho', 'setwho', 'reprname', 'getwhere', 'eqaddr', 'bindattr_i', 'bindattr_n', 'bindattr_s', 'bindattr_o', 'bindattrs_i', 'bindattrs_n', 'bindattrs_s', 'bindattrs_o', 'getattr_i', 'getattr_n', 'getattr_s', 'getattr_o', 'getattrs_i', 'getattrs_n', 'getattrs_s', 'getattrs_o', 'attrinited', 'box_i', 'box_n', 'box_s', 'unbox_i', 'unbox_n', 'unbox_s', 'atpos_i', 'atpos_n', 'atpos_s', 'atpos_o', 'bindpos_i', 'bindpos_n', 'bindpos_s', 'bindpos_o', 'push_i', 'push_n', 'push_s', 'push_o', 'pop_i', 'pop_n', 'pop_s', 'pop_o', 'shift_i', 'shift_n', 'shift_s', 'shift_o', 'unshift_i', 'unshift_n', 'unshift_s', 'unshift_o', 'splice', 'setelemspos', 'existspos', 'atkey_i', 'atkey_n', 'atkey_s', 'atkey_o', 'bindkey_i', 'bindkey_n', 'bindkey_s', 'bindkey_o', 'existskey', 'deletekey', 'elems', 'knowhow', 'knowhowattr', 'newtype', 'composetype', 'setmethcache', 'setmethcacheauth', 'settypecache', 'settypecheckmode', 'setboolspec', 'istrue', 'isfalse', 'bootint', 'bootnum', 'bootstr', 'bootarray', 'bootintarray', 'bootnumarray', 'bootstrarray', 'boothash', 'isint', 'isnum', 'isstr', 'islist', 'ishash', 'sethllconfig', 'hllboxtype_i', 'hllboxtype_n', 'hllboxtype_s', 'hlllist', 'hllhash', 'getcomp', 'bindcomp', 'getcurhllsym', 'bindcurhllsym', 'gethllsym', 'bindhllsym', 'settypehll', 'settypehllrole', 'hllize', 'hllizefor', 'usecompileehllconfig', 'usecompilerhllconfig', 'iter', 'iterkey_s', 'iterval', 'getcodename', 'iscoderef', 'getcodeobj', 'setcodeobj', 'setcodename', 'forceouterctx', 'setinvokespec', 'isinvokable', 'freshcoderef', 'markcodestatic', 'markcodestub', 'getstaticcode', 'getcodecuid', 'setdispatcher', 'takedispatcher', 'assign', 'assignunchecked', 'iscont', 'decont', 'setcontspec', 'sha1', 'createsc', 'scsetobj', 'scsetcode', 'scgetobj', 'scgethandle', 'scgetobjidx', 'scsetdesc', 'scobjcount', 'setobjsc', 'getobjsc', 'serialize', 'deserialize', 'wval', 'wval_wide', 'scwbdisable', 'scwbenable', 'pushcompsc', 'popcompsc', 'scgetdesc', 'loadbytecode', 'masttofile', 'masttocu', 'iscompunit', 'compunitmainline', 'compunitcodes', 'ctx', 'ctxouter', 'ctxcaller', 'ctxlexpad', 'curcode', 'callercode', 'add_I', 'sub_I', 'mul_I', 'div_I', 'mod_I', 'neg_I', 'abs_I', 'cmp_I', 'eq_I', 'ne_I', 'lt_I', 'le_I', 'gt_I', 'ge_I', 'bor_I', 'bxor_I', 'band_I', 'bnot_I', 'blshift_I', 'brshift_I', 'pow_I', 'gcd_I', 'lcm_I', 'expmod_I', 'isprime_I', 'rand_I', 'coerce_In', 'coerce_Is', 'coerce_nI', 'coerce_sI', 'isbig_I', 'bool_I', 'base_I', 'radix_I', 'div_In', 'copy_f', 'append_f', 'rename_f', 'delete_f', 'chmod_f', 'exists_f', 'mkdir', 'rmdir', 'open_dir', 'read_dir', 'close_dir', 'open_fh', 'close_fh', 'DEPRECATED_23', 'DEPRECATED_27', 'DEPRECATED_28', 'DEPRECATED_18', 'seek_fh', 'lock_fh', 'unlock_fh', 'sync_fh', 'trunc_fh', 'eof_fh', 'getstdin', 'getstdout', 'getstderr', 'connect_sk', 'socket', 'bind_sk', 'DEPRECATED_24', 'accept_sk', 'decodetocodes', 'encodefromcodes', 'DEPRECATED_17', 'print', 'say', 'DEPRECATED_22', 'tell_fh', 'stat', 'tryfindmeth', 'tryfindmeth_s', 'chdir', 'srand', 'rand_i', 'rand_n', 'time_i', 'sleep', 'newthread', 'threadjoin', 'time_n', 'exit', 'DEPRECATED_30', 'cwd', 'clargs', 'getenvhash', 'loadlib', 'freelib', 'findsym', 'dropsym', 'loadext', 'backendconfig', 'getlexouter', 'getlexrel', 'getlexreldyn', 'getlexrelcaller', 'getlexcaller', 'bitand_s', 'bitor_s', 'bitxor_s', 'isnanorinf', 'inf', 'neginf', 'nan', 'getpid', 'DEPRECATED_29', 'filereadable', 'filewritable', 'fileexecutable', 'DEPRECATED_19', 'capturenamedshash', 'read_fhb', 'write_fhb', 'replace', 'newexception', 'permit', 'backtrace', 'symlink', 'link', 'gethostname', 'exreturnafterunwind', 'DEPRECATED_13', 'continuationreset', 'continuationcontrol', 'continuationinvoke', 'randscale_n', 'uniisblock', 'assertparamcheck', 'hintfor', 'paramnamesused', 'getuniname', 'getuniprop_int', 'getuniprop_bool', 'getuniprop_str', 'matchuniprop', 'nativecallbuild', 'nativecallinvoke', 'nativecallrefresh', 'threadrun', 'threadid', 'threadyield', 'currentthread', 'lock', 'unlock', 'semacquire', 'semtryacquire', 'semrelease', 'getlockcondvar', 'condwait', 'condsignalone', 'condsignalall', 'queuepoll', 'setmultispec', 'ctxouterskipthunks', 'ctxcallerskipthunks', 'timer', 'cancel', 'signal', 'watchfile', 'asyncconnect', 'asynclisten', 'DEPRECATED_14', 'asyncwritebytes', 'DEPRECATED_16', 'asyncreadbytes', 'getlexstatic_o', 'getlexperinvtype_o', 'execname', 'const_i64_16', 'const_i64_32', 'isnonnull', 'param_rn2_i', 'param_rn2_n', 'param_rn2_s', 'param_rn2_o', 'param_on2_i', 'param_on2_n', 'param_on2_s', 'param_on2_o', 'osrpoint', 'nativecallcast', 'spawnprocasync', 'killprocasync', 'startprofile', 'endprofile', 'objectid', 'settypefinalize', 'force_gc', 'nativecallglobal', 'DEPRECATED_32', 'setparameterizer', 'parameterizetype', 'typeparameterized', 'typeparameters', 'typeparameterat', 'readlink', 'lstat', 'iscont_i', 'iscont_n', 'iscont_s', 'assign_i', 'assign_n', 'assign_s', 'decont_i', 'decont_n', 'decont_s', 'getrusage', 'threadlockcount', 'DEPRECATED_4', 'getlexref_i', 'getlexref_n', 'getlexref_s', 'getlexref_ni', 'getlexref_nn', 'getlexref_ns', 'atposref_i', 'atposref_n', 'atposref_s', 'getattrref_i', 'getattrref_n', 'getattrref_s', 'getattrsref_i', 'getattrsref_n', 'getattrsref_s', 'nativecallsizeof', 'encodenorm', 'normalizecodes', 'strfromcodes', 'strtocodes', 'getcodelocation', 'eqatim_s', 'ordbaseat', 'neverrepossess', 'scdisclaim', 'DEPRECATED_31', 'atpos2d_i', 'atpos2d_n', 'atpos2d_s', 'atpos2d_o', 'atpos3d_i', 'atpos3d_n', 'atpos3d_s', 'atpos3d_o', 'atposnd_i', 'atposnd_n', 'atposnd_s', 'atposnd_o', 'bindpos2d_i', 'bindpos2d_n', 'bindpos2d_s', 'bindpos2d_o', 'bindpos3d_i', 'bindpos3d_n', 'bindpos3d_s', 'bindpos3d_o', 'bindposnd_i', 'bindposnd_n', 'bindposnd_s', 'bindposnd_o', 'dimensions', 'setdimensions', 'numdimensions', 'ctxcode', 'isrwcont', 'fc', 'DEPRECATED_25', 'DEPRECATED_21', 'encoderep', 'istty_fh', 'multidimref_i', 'multidimref_n', 'multidimref_s', 'fileno_fh', 'asyncudp', 'DEPRECATED_15', 'asyncwritebytesto', 'objprimbits', 'objprimunsigned', 'DEPRECATED_5', 'DEPRECATED_6', 'DEPRECATED_7', 'DEPRECATED_8', 'getlexref_i32', 'getlexref_i16', 'getlexref_i8', 'getlexref_n32', 'box_u', 'unbox_u', 'coerce_iu', 'coerce_ui', 'coerce_nu', 'coerce_un', 'decont_u', 'DEPRECATED_9', 'DEPRECATED_10', 'DEPRECATED_11', 'DEPRECATED_12', 'getlexref_u', 'getlexref_u32', 'getlexref_u16', 'getlexref_u8', 'param_rp_u', 'param_op_u', 'param_rn_u', 'param_on_u', 'param_rn2_u', 'param_on2_u', 'stat_time', 'lstat_time', 'setdebugtypename', 'loadbytecodebuffer', 'loadbytecodefh', 'throwpayloadlex', 'throwpayloadlexcaller', 'lastexpayload', 'cancelnotify', 'decoderconfigure', 'decodersetlineseps', 'decoderaddbytes', 'decodertakechars', 'decodertakeallchars', 'decodertakeavailablechars', 'decodertakeline', 'decoderbytesavailable', 'decodertakebytes', 'decoderempty', 'indexingoptimized', 'captureinnerlex', 'unicmp_s', 'setdispatcherfor', 'getstrfromname', 'indexic_s', 'getport_sk', 'cpucores', 'eqaticim_s', 'indexicim_s', 'decodertakecharseof', 'indexim_s', 'cas_o', 'cas_i', 'atomicinc_i', 'atomicdec_i', 'atomicadd_i', 'atomicload_o', 'atomicload_i', 'atomicstore_o', 'atomicstore_i', 'barrierfull', 'coveragecontrol', 'nativeinvoke_v', 'nativeinvoke_i', 'nativeinvoke_n', 'nativeinvoke_s', 'nativeinvoke_o', 'getarg_i', 'getarg_n', 'getarg_s', 'getarg_o', 'coerce_II', 'encoderepconf', 'encodeconf', 'decodeconf', 'decoderepconf', 'getppid', 'sp_guard', 'sp_guardconc', 'sp_guardtype', 'sp_guardsf', 'sp_guardsfouter', 'sp_rebless', 'sp_resolvecode', 'sp_decont', 'sp_getlex_o', 'sp_getlex_ins', 'sp_getlex_no', 'sp_getarg_o', 'sp_getarg_i', 'sp_getarg_n', 'sp_getarg_s', 'sp_fastinvoke_v', 'sp_fastinvoke_i', 'sp_fastinvoke_n', 'sp_fastinvoke_s', 'sp_fastinvoke_o', 'sp_paramnamesused', 'sp_getspeshslot', 'sp_findmeth', 'sp_fastcreate', 'sp_get_o', 'sp_get_i64', 'sp_get_i32', 'sp_get_i16', 'sp_get_i8', 'sp_get_n', 'sp_get_s', 'sp_bind_o', 'sp_bind_i64', 'sp_bind_i32', 'sp_bind_i16', 'sp_bind_i8', 'sp_bind_n', 'sp_bind_s', 'sp_p6oget_o', 'sp_p6ogetvt_o', 'sp_p6ogetvc_o', 'sp_p6oget_i', 'sp_p6oget_n', 'sp_p6oget_s', 'sp_p6obind_o', 'sp_p6obind_i', 'sp_p6obind_n', 'sp_p6obind_s', 'sp_deref_get_i64', 'sp_deref_get_n', 'sp_deref_bind_i64', 'sp_deref_bind_n', 'sp_getlexvia_o', 'sp_getlexvia_ins', 'sp_jit_enter', 'sp_boolify_iter', 'sp_boolify_iter_arr', 'sp_boolify_iter_hash', 'sp_cas_o', 'sp_atomicload_o', 'sp_atomicstore_o', 'prof_enter', 'prof_enterspesh', 'prof_enterinline', 'prof_enternative', 'prof_exit', 'prof_allocated', 'ctw_check', 'coverage_log', 'breakpoint'); } MoarVM-2018.03/lib/MAST/Ops.p60000644000175000017510000014041013111771623015527 0ustar samanthasamantha# This file is generated from src/core/oplist by tools/update_ops.p6. module MASTOps; our @offsets is export = 0, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 99, 102, 103, 104, 105, 106, 106, 109, 112, 115, 118, 121, 124, 127, 130, 133, 136, 139, 142, 145, 148, 150, 152, 153, 154, 155, 156, 159, 162, 165, 167, 170, 173, 176, 178, 181, 184, 187, 190, 193, 196, 199, 202, 205, 208, 211, 214, 217, 220, 222, 224, 227, 229, 231, 233, 235, 237, 239, 241, 243, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 281, 283, 285, 287, 289, 291, 293, 295, 296, 298, 300, 302, 304, 306, 308, 310, 312, 314, 317, 320, 323, 326, 328, 330, 332, 334, 337, 340, 343, 346, 348, 349, 351, 353, 354, 356, 357, 359, 361, 363, 365, 367, 369, 371, 373, 375, 377, 379, 381, 383, 384, 385, 386, 388, 390, 392, 393, 394, 396, 399, 402, 405, 408, 411, 414, 416, 419, 423, 426, 427, 429, 432, 435, 438, 441, 444, 447, 450, 454, 458, 464, 467, 470, 474, 478, 480, 482, 485, 488, 490, 492, 494, 497, 500, 502, 506, 510, 512, 515, 520, 525, 527, 529, 531, 534, 538, 540, 542, 543, 547, 552, 557, 560, 564, 570, 575, 579, 582, 584, 586, 587, 589, 591, 594, 597, 600, 603, 605, 607, 609, 612, 615, 617, 619, 621, 623, 626, 628, 630, 633, 638, 643, 648, 653, 657, 661, 665, 669, 674, 679, 684, 689, 693, 697, 701, 705, 709, 712, 715, 718, 720, 722, 724, 727, 730, 733, 736, 739, 742, 745, 748, 750, 752, 754, 756, 758, 760, 762, 764, 766, 768, 770, 772, 774, 776, 778, 780, 784, 786, 789, 792, 795, 798, 801, 804, 807, 810, 813, 816, 818, 820, 821, 822, 825, 828, 830, 832, 834, 836, 839, 841, 843, 844, 845, 846, 847, 848, 849, 850, 851, 853, 855, 857, 859, 861, 863, 864, 865, 866, 867, 868, 870, 873, 875, 878, 881, 884, 886, 888, 890, 893, 893, 893, 895, 897, 899, 901, 903, 905, 907, 909, 911, 915, 917, 919, 920, 921, 923, 925, 926, 927, 929, 931, 933, 935, 938, 940, 942, 945, 948, 951, 953, 956, 958, 960, 962, 964, 967, 972, 975, 978, 979, 980, 981, 982, 984, 986, 989, 992, 994, 996, 998, 999, 1001, 1003, 1005, 1006, 1007, 1011, 1015, 1019, 1023, 1027, 1030, 1033, 1036, 1039, 1042, 1045, 1048, 1051, 1054, 1058, 1062, 1066, 1069, 1073, 1077, 1082, 1086, 1090, 1095, 1098, 1101, 1103, 1105, 1108, 1111, 1113, 1115, 1118, 1124, 1127, 1129, 1131, 1133, 1134, 1136, 1138, 1140, 1141, 1143, 1145, 1146, 1149, 1150, 1153, 1156, 1159, 1162, 1165, 1168, 1169, 1170, 1172, 1174, 1175, 1176, 1177, 1180, 1182, 1185, 1187, 1189, 1189, 1189, 1191, 1192, 1193, 1195, 1197, 1200, 1202, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1214, 1215, 1216, 1217, 1221, 1222, 1223, 1224, 1226, 1227, 1230, 1231, 1233, 1234, 1236, 1239, 1242, 1245, 1247, 1250, 1253, 1256, 1258, 1259, 1260, 1261, 1262, 1266, 1268, 1270, 1272, 1275, 1277, 1280, 1282, 1287, 1288, 1293, 1295, 1297, 1299, 1300, 1301, 1303, 1306, 1310, 1313, 1315, 1319, 1320, 1323, 1323, 1325, 1328, 1331, 1334, 1338, 1344, 1348, 1349, 1350, 1352, 1352, 1353, 1354, 1355, 1356, 1358, 1359, 1362, 1363, 1364, 1365, 1367, 1371, 1373, 1375, 1381, 1382, 1387, 1392, 1398, 1404, 1410, 1416, 1421, 1427, 1429, 1431, 1432, 1434, 1436, 1438, 1441, 1444, 1447, 1450, 1454, 1458, 1462, 1466, 1466, 1470, 1476, 1478, 1479, 1480, 1482, 1484, 1484, 1489, 1491, 1493, 1493, 1495, 1497, 1500, 1503, 1505, 1507, 1509, 1511, 1513, 1516, 1519, 1522, 1525, 1526, 1528, 1532, 1535, 1538, 1541, 1544, 1547, 1550, 1553, 1556, 1559, 1562, 1566, 1570, 1573, 1576, 1579, 1582, 1585, 1588, 1591, 1592, 1594, 1596, 1598, 1598, 1598, 1599, 1599; our @counts = 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 3, 1, 1, 1, 1, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 2, 1, 2, 2, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 1, 1, 2, 3, 3, 3, 3, 3, 3, 2, 3, 4, 3, 1, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 6, 3, 3, 4, 4, 2, 2, 3, 3, 2, 2, 2, 3, 3, 2, 4, 4, 2, 3, 5, 5, 2, 2, 2, 3, 4, 2, 2, 1, 4, 5, 5, 3, 4, 6, 5, 4, 3, 2, 2, 1, 2, 2, 3, 3, 3, 3, 2, 2, 2, 3, 3, 2, 2, 2, 2, 3, 2, 2, 3, 5, 5, 5, 5, 4, 4, 4, 4, 5, 5, 5, 5, 4, 4, 4, 4, 4, 3, 3, 3, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 1, 1, 3, 3, 2, 2, 2, 2, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 3, 2, 3, 3, 3, 2, 2, 2, 3, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 2, 2, 3, 2, 2, 3, 3, 3, 2, 3, 2, 2, 2, 2, 3, 5, 3, 3, 1, 1, 1, 1, 2, 2, 3, 3, 2, 2, 2, 1, 2, 2, 2, 1, 1, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 4, 4, 5, 4, 4, 5, 3, 3, 2, 2, 3, 3, 2, 2, 3, 6, 3, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 1, 3, 1, 3, 3, 3, 3, 3, 3, 1, 1, 2, 2, 1, 1, 1, 3, 2, 3, 2, 2, 0, 0, 2, 1, 1, 2, 2, 3, 2, 3, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 4, 1, 1, 1, 2, 1, 3, 1, 2, 1, 2, 3, 3, 3, 2, 3, 3, 3, 2, 1, 1, 1, 1, 4, 2, 2, 2, 3, 2, 3, 2, 5, 1, 5, 2, 2, 2, 1, 1, 2, 3, 4, 3, 2, 4, 1, 3, 0, 2, 3, 3, 3, 4, 6, 4, 1, 1, 2, 0, 1, 1, 1, 1, 2, 1, 3, 1, 1, 1, 2, 4, 2, 2, 6, 1, 5, 5, 6, 6, 6, 6, 5, 6, 2, 2, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 0, 4, 6, 2, 1, 1, 2, 2, 0, 5, 2, 2, 0, 2, 2, 3, 3, 2, 2, 2, 2, 2, 3, 3, 3, 3, 1, 2, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 3, 3, 3, 3, 3, 3, 3, 1, 2, 2, 2, 0, 0, 1, 0, 1; our @values is export = 10, 8, 18, 16, 26, 24, 34, 32, 42, 40, 50, 48, 58, 56, 82, 81, 34, 9, 34, 17, 34, 25, 34, 9, 34, 17, 34, 25, 10, 33, 18, 33, 26, 33, 10, 33, 18, 33, 26, 33, 50, 41, 42, 49, 72, 33, 72, 33, 72, 49, 72, 49, 72, 57, 72, 57, 72, 57, 72, 57, 72, 65, 72, 65, 72, 32, 33, 82, 83, 84, 81, 34, 56, 50, 56, 58, 56, 66, 56, 56, 33, 56, 49, 56, 57, 56, 65, 66, 57, 57, 65, 66, 57, 57, 65, 65, 56, 65, 16, 34, 65, 57, 33, 49, 57, 65, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 34, 33, 34, 34, 34, 34, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 34, 33, 34, 33, 33, 34, 33, 33, 34, 49, 49, 34, 49, 49, 34, 49, 49, 34, 49, 49, 34, 49, 49, 34, 49, 49, 34, 49, 49, 50, 49, 49, 50, 49, 49, 50, 49, 49, 50, 49, 49, 50, 49, 49, 50, 49, 50, 49, 50, 49, 49, 34, 49, 34, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 33, 34, 49, 58, 33, 58, 49, 34, 57, 50, 57, 50, 65, 58, 65, 104, 16, 33, 16, 49, 16, 57, 16, 65, 16, 32, 16, 48, 16, 56, 65, 34, 65, 50, 65, 58, 65, 66, 65, 16, 16, 34, 16, 50, 16, 58, 16, 66, 16, 34, 16, 72, 50, 16, 72, 58, 16, 72, 66, 16, 72, 34, 56, 50, 56, 58, 56, 66, 56, 34, 56, 72, 50, 56, 72, 58, 56, 72, 66, 56, 72, 66, 16, 66, 66, 96, 66, 33, 65, 66, 65, 66, 65, 57, 65, 65, 65, 33, 58, 65, 66, 65, 34, 65, 66, 65, 66, 65, 66, 65, 66, 32, 66, 32, 66, 32, 66, 57, 65, 65, 66, 66, 72, 66, 65, 66, 65, 66, 66, 34, 65, 66, 65, 33, 34, 65, 33, 50, 65, 33, 58, 65, 33, 34, 65, 33, 34, 65, 57, 34, 65, 66, 65, 65, 66, 65, 65, 65, 66, 65, 65, 58, 34, 57, 34, 57, 57, 34, 57, 57, 34, 57, 57, 34, 57, 57, 34, 57, 57, 34, 57, 57, 34, 57, 57, 34, 57, 57, 33, 34, 57, 57, 33, 34, 57, 33, 33, 57, 33, 58, 57, 57, 58, 57, 33, 58, 57, 33, 33, 34, 57, 57, 33, 34, 57, 34, 57, 34, 57, 33, 34, 57, 33, 58, 57, 58, 57, 58, 57, 66, 57, 57, 58, 57, 65, 34, 57, 57, 33, 56, 72, 57, 33, 56, 72, 34, 57, 34, 33, 57, 34, 57, 33, 33, 33, 34, 57, 33, 16, 16, 34, 57, 58, 33, 34, 57, 34, 57, 33, 34, 57, 57, 33, 58, 57, 58, 57, 57, 34, 33, 57, 33, 34, 33, 57, 33, 33, 34, 33, 57, 33, 33, 66, 65, 65, 66, 65, 57, 33, 65, 57, 33, 65, 65, 65, 66, 33, 57, 33, 33, 66, 57, 57, 65, 58, 65, 57, 34, 57, 34, 57, 66, 34, 65, 65, 72, 66, 65, 56, 66, 65, 57, 34, 65, 56, 34, 65, 57, 66, 65, 66, 65, 34, 65, 66, 65, 65, 34, 65, 65, 34, 65, 66, 65, 66, 65, 66, 65, 66, 65, 65, 58, 65, 34, 65, 34, 65, 65, 65, 65, 56, 33, 16, 65, 65, 56, 49, 16, 65, 65, 56, 57, 16, 65, 65, 56, 65, 16, 65, 65, 57, 33, 65, 65, 57, 49, 65, 65, 57, 57, 65, 65, 57, 65, 34, 65, 65, 56, 16, 50, 65, 65, 56, 16, 58, 65, 65, 56, 16, 66, 65, 65, 56, 16, 34, 65, 65, 57, 50, 65, 65, 57, 58, 65, 65, 57, 66, 65, 65, 57, 34, 65, 65, 57, 66, 33, 65, 66, 49, 65, 66, 57, 65, 34, 65, 50, 65, 58, 65, 34, 65, 33, 50, 65, 33, 58, 65, 33, 66, 65, 33, 65, 33, 33, 65, 33, 49, 65, 33, 57, 65, 33, 65, 65, 33, 65, 49, 65, 57, 65, 65, 34, 65, 50, 65, 58, 65, 66, 65, 34, 65, 50, 65, 58, 65, 66, 65, 65, 33, 65, 49, 65, 57, 65, 65, 65, 65, 33, 33, 65, 33, 34, 65, 33, 34, 65, 57, 50, 65, 57, 58, 65, 57, 66, 65, 57, 65, 57, 33, 65, 57, 49, 65, 57, 57, 65, 57, 65, 34, 65, 57, 65, 57, 34, 65, 66, 66, 66, 65, 57, 66, 65, 65, 65, 65, 65, 33, 65, 65, 65, 33, 65, 33, 65, 34, 65, 34, 65, 66, 66, 66, 66, 66, 66, 66, 66, 34, 65, 34, 65, 34, 65, 34, 65, 34, 65, 57, 65, 66, 66, 66, 66, 66, 66, 57, 66, 57, 65, 66, 57, 66, 57, 65, 66, 57, 57, 57, 57, 65, 65, 57, 65, 33, 66, 65, 66, 65, 57, 66, 65, 58, 65, 66, 65, 58, 65, 34, 65, 66, 65, 65, 65, 65, 57, 65, 65, 65, 65, 57, 65, 34, 65, 66, 65, 65, 65, 66, 65, 58, 65, 65, 66, 65, 65, 65, 65, 34, 65, 66, 65, 65, 57, 65, 58, 57, 66, 57, 65, 33, 65, 65, 33, 65, 66, 65, 33, 58, 65, 34, 65, 65, 65, 57, 34, 65, 65, 65, 66, 65, 58, 65, 65, 57, 65, 65, 65, 65, 66, 16, 16, 66, 16, 32, 34, 34, 65, 66, 58, 65, 58, 57, 65, 65, 57, 66, 65, 65, 34, 65, 66, 65, 66, 65, 66, 66, 65, 66, 65, 66, 65, 66, 66, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 66, 65, 65, 34, 65, 65, 34, 65, 65, 34, 65, 65, 34, 65, 65, 34, 65, 65, 34, 65, 65, 34, 65, 65, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 66, 65, 33, 65, 66, 65, 33, 65, 66, 65, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, 65, 65, 65, 34, 65, 33, 66, 65, 65, 50, 65, 58, 65, 66, 49, 65, 66, 57, 65, 34, 65, 34, 65, 58, 65, 33, 66, 33, 57, 33, 33, 65, 50, 65, 65, 57, 57, 57, 57, 57, 57, 57, 57, 33, 34, 57, 57, 33, 57, 66, 57, 58, 65, 65, 66, 57, 57, 65, 58, 65, 33, 58, 57, 57, 57, 57, 57, 34, 65, 57, 65, 33, 33, 34, 65, 33, 65, 65, 65, 33, 34, 65, 66, 66, 66, 65, 57, 33, 66, 33, 65, 57, 33, 65, 57, 66, 65, 65, 57, 57, 57, 58, 65, 34, 65, 34, 57, 33, 58, 65, 58, 65, 57, 57, 33, 34, 50, 34, 49, 66, 65, 33, 65, 50, 33, 34, 57, 57, 65, 58, 66, 66, 57, 57, 57, 66, 57, 57, 65, 57, 57, 66, 66, 57, 66, 65, 57, 66, 65, 57, 66, 65, 57, 66, 57, 58, 57, 57, 58, 57, 57, 58, 57, 57, 34, 49, 50, 50, 50, 34, 34, 65, 57, 65, 34, 57, 34, 57, 34, 57, 34, 65, 57, 66, 65, 65, 65, 33, 65, 65, 58, 57, 33, 33, 57, 66, 66, 57, 57, 65, 57, 66, 65, 57, 57, 57, 57, 58, 65, 66, 65, 66, 65, 65, 66, 33, 65, 65, 66, 65, 65, 50, 49, 34, 57, 33, 57, 33, 34, 65, 57, 58, 33, 34, 33, 33, 34, 33, 33, 58, 33, 33, 34, 33, 33, 33, 65, 57, 57, 57, 65, 65, 66, 65, 65, 65, 65, 65, 34, 65, 66, 65, 65, 65, 34, 65, 65, 66, 65, 65, 65, 65, 65, 66, 65, 65, 65, 57, 57, 66, 65, 66, 65, 66, 65, 65, 33, 33, 65, 65, 66, 65, 65, 33, 65, 66, 65, 65, 57, 65, 66, 65, 65, 57, 33, 65, 66, 65, 65, 57, 33, 65, 66, 65, 65, 65, 57, 65, 66, 65, 65, 65, 65, 65, 66, 65, 65, 65, 65, 66, 65, 65, 65, 65, 65, 66, 57, 66, 57, 58, 34, 16, 34, 24, 34, 65, 34, 56, 56, 50, 56, 56, 58, 56, 56, 66, 56, 56, 34, 56, 56, 72, 50, 56, 56, 72, 58, 56, 56, 72, 66, 56, 56, 72, 66, 65, 65, 65, 66, 65, 65, 57, 65, 65, 65, 33, 65, 66, 34, 65, 65, 33, 66, 57, 57, 65, 65, 34, 65, 65, 128, 65, 128, 65, 128, 65, 128, 128, 65, 128, 128, 66, 16, 66, 16, 66, 16, 66, 16, 65, 16, 34, 65, 16, 50, 65, 16, 58, 65, 16, 66, 65, 16, 16, 66, 128, 66, 65, 56, 128, 66, 16, 128, 66, 65, 16, 34, 65, 16, 50, 65, 16, 58, 65, 16, 65, 16, 65, 65, 16, 33, 65, 16, 49, 65, 16, 57, 66, 65, 16, 66, 65, 16, 128, 66, 65, 16, 128, 34, 65, 16, 50, 65, 16, 58, 65, 16, 65, 16, 65, 65, 16, 33, 65, 16, 49, 65, 16, 57, 66, 34, 65, 34, 65, 34, 65, 128, 65; our %codes is export = 'no_op', 0, 'const_i8', 1, 'const_i16', 2, 'const_i32', 3, 'const_i64', 4, 'const_n32', 5, 'const_n64', 6, 'const_s', 7, 'set', 8, 'extend_u8', 9, 'extend_u16', 10, 'extend_u32', 11, 'extend_i8', 12, 'extend_i16', 13, 'extend_i32', 14, 'trunc_u8', 15, 'trunc_u16', 16, 'trunc_u32', 17, 'trunc_i8', 18, 'trunc_i16', 19, 'trunc_i32', 20, 'extend_n32', 21, 'trunc_n32', 22, 'goto', 23, 'if_i', 24, 'unless_i', 25, 'if_n', 26, 'unless_n', 27, 'if_s', 28, 'unless_s', 29, 'if_s0', 30, 'unless_s0', 31, 'if_o', 32, 'unless_o', 33, 'jumplist', 34, 'getlex', 35, 'bindlex', 36, 'getlex_ni', 37, 'getlex_nn', 38, 'getlex_ns', 39, 'getlex_no', 40, 'bindlex_ni', 41, 'bindlex_nn', 42, 'bindlex_ns', 43, 'bindlex_no', 44, 'getlex_ng', 45, 'bindlex_ng', 46, 'getdynlex', 47, 'binddynlex', 48, 'setlexvalue', 49, 'lexprimspec', 50, 'return_i', 51, 'return_n', 52, 'return_s', 53, 'return_o', 54, 'return', 55, 'eq_i', 56, 'ne_i', 57, 'lt_i', 58, 'le_i', 59, 'gt_i', 60, 'ge_i', 61, 'cmp_i', 62, 'add_i', 63, 'sub_i', 64, 'mul_i', 65, 'div_i', 66, 'div_u', 67, 'mod_i', 68, 'mod_u', 69, 'neg_i', 70, 'abs_i', 71, 'inc_i', 72, 'inc_u', 73, 'dec_i', 74, 'dec_u', 75, 'band_i', 76, 'bor_i', 77, 'bxor_i', 78, 'bnot_i', 79, 'blshift_i', 80, 'brshift_i', 81, 'pow_i', 82, 'not_i', 83, 'gcd_i', 84, 'lcm_i', 85, 'eq_n', 86, 'ne_n', 87, 'lt_n', 88, 'le_n', 89, 'gt_n', 90, 'ge_n', 91, 'cmp_n', 92, 'add_n', 93, 'sub_n', 94, 'mul_n', 95, 'div_n', 96, 'mod_n', 97, 'neg_n', 98, 'abs_n', 99, 'pow_n', 100, 'ceil_n', 101, 'floor_n', 102, 'sin_n', 103, 'asin_n', 104, 'cos_n', 105, 'acos_n', 106, 'tan_n', 107, 'atan_n', 108, 'atan2_n', 109, 'sec_n', 110, 'asec_n', 111, 'sinh_n', 112, 'cosh_n', 113, 'tanh_n', 114, 'sech_n', 115, 'sqrt_n', 116, 'log_n', 117, 'exp_n', 118, 'coerce_in', 119, 'coerce_ni', 120, 'coerce_is', 121, 'coerce_ns', 122, 'coerce_si', 123, 'coerce_sn', 124, 'smrt_numify', 125, 'smrt_strify', 126, 'prepargs', 127, 'arg_i', 128, 'arg_n', 129, 'arg_s', 130, 'arg_o', 131, 'argconst_i', 132, 'argconst_n', 133, 'argconst_s', 134, 'invoke_v', 135, 'invoke_i', 136, 'invoke_n', 137, 'invoke_s', 138, 'invoke_o', 139, 'checkarity', 140, 'param_rp_i', 141, 'param_rp_n', 142, 'param_rp_s', 143, 'param_rp_o', 144, 'param_op_i', 145, 'param_op_n', 146, 'param_op_s', 147, 'param_op_o', 148, 'param_rn_i', 149, 'param_rn_n', 150, 'param_rn_s', 151, 'param_rn_o', 152, 'param_on_i', 153, 'param_on_n', 154, 'param_on_s', 155, 'param_on_o', 156, 'param_sp', 157, 'param_sn', 158, 'getcode', 159, 'caller', 160, 'capturelex', 161, 'takeclosure', 162, 'exception', 163, 'bindexmessage', 164, 'bindexpayload', 165, 'bindexcategory', 166, 'getexmessage', 167, 'getexpayload', 168, 'getexcategory', 169, 'throwdyn', 170, 'throwlex', 171, 'throwlexotic', 172, 'throwcatdyn', 173, 'throwcatlex', 174, 'throwcatlexotic', 175, 'die', 176, 'rethrow', 177, 'resume', 178, 'takehandlerresult', 179, 'newlexotic', 180, 'lexoticresult', 181, 'backtracestrings', 182, 'usecapture', 183, 'savecapture', 184, 'captureposelems', 185, 'captureposarg', 186, 'captureposarg_i', 187, 'captureposarg_n', 188, 'captureposarg_s', 189, 'captureposprimspec', 190, 'captureexistsnamed', 191, 'capturehasnameds', 192, 'invokewithcapture', 193, 'multicacheadd', 194, 'multicachefind', 195, 'null_s', 196, 'isnull_s', 197, 'eq_s', 198, 'ne_s', 199, 'gt_s', 200, 'ge_s', 201, 'lt_s', 202, 'le_s', 203, 'cmp_s', 204, 'eqat_s', 205, 'eqatic_s', 206, 'haveat_s', 207, 'concat_s', 208, 'repeat_s', 209, 'substr_s', 210, 'index_s', 211, 'graphs_s', 212, 'codes_s', 213, 'getcp_s', 214, 'indexcp_s', 215, 'uc', 216, 'lc', 217, 'tc', 218, 'split', 219, 'join', 220, 'getcpbyname', 221, 'indexat', 222, 'indexnat', 223, 'unipropcode', 224, 'unipvalcode', 225, 'hasuniprop', 226, 'hasunipropc', 227, 'chars', 228, 'chr', 229, 'ordfirst', 230, 'ordat', 231, 'rindexfrom', 232, 'escape', 233, 'flip', 234, 'flattenropes', 235, 'iscclass', 236, 'findcclass', 237, 'findnotcclass', 238, 'nfafromstatelist', 239, 'nfarunproto', 240, 'nfarunalt', 241, 'radix', 242, 'encode', 243, 'decode', 244, 'istrue_s', 245, 'isfalse_s', 246, 'null', 247, 'isnull', 248, 'ifnonnull', 249, 'findmeth', 250, 'findmeth_s', 251, 'can', 252, 'can_s', 253, 'create', 254, 'clone', 255, 'isconcrete', 256, 'rebless', 257, 'istype', 258, 'objprimspec', 259, 'gethow', 260, 'getwhat', 261, 'getwho', 262, 'setwho', 263, 'reprname', 264, 'getwhere', 265, 'eqaddr', 266, 'bindattr_i', 267, 'bindattr_n', 268, 'bindattr_s', 269, 'bindattr_o', 270, 'bindattrs_i', 271, 'bindattrs_n', 272, 'bindattrs_s', 273, 'bindattrs_o', 274, 'getattr_i', 275, 'getattr_n', 276, 'getattr_s', 277, 'getattr_o', 278, 'getattrs_i', 279, 'getattrs_n', 280, 'getattrs_s', 281, 'getattrs_o', 282, 'attrinited', 283, 'box_i', 284, 'box_n', 285, 'box_s', 286, 'unbox_i', 287, 'unbox_n', 288, 'unbox_s', 289, 'atpos_i', 290, 'atpos_n', 291, 'atpos_s', 292, 'atpos_o', 293, 'bindpos_i', 294, 'bindpos_n', 295, 'bindpos_s', 296, 'bindpos_o', 297, 'push_i', 298, 'push_n', 299, 'push_s', 300, 'push_o', 301, 'pop_i', 302, 'pop_n', 303, 'pop_s', 304, 'pop_o', 305, 'shift_i', 306, 'shift_n', 307, 'shift_s', 308, 'shift_o', 309, 'unshift_i', 310, 'unshift_n', 311, 'unshift_s', 312, 'unshift_o', 313, 'splice', 314, 'setelemspos', 315, 'existspos', 316, 'atkey_i', 317, 'atkey_n', 318, 'atkey_s', 319, 'atkey_o', 320, 'bindkey_i', 321, 'bindkey_n', 322, 'bindkey_s', 323, 'bindkey_o', 324, 'existskey', 325, 'deletekey', 326, 'elems', 327, 'knowhow', 328, 'knowhowattr', 329, 'newtype', 330, 'composetype', 331, 'setmethcache', 332, 'setmethcacheauth', 333, 'settypecache', 334, 'settypecheckmode', 335, 'setboolspec', 336, 'istrue', 337, 'isfalse', 338, 'bootint', 339, 'bootnum', 340, 'bootstr', 341, 'bootarray', 342, 'bootintarray', 343, 'bootnumarray', 344, 'bootstrarray', 345, 'boothash', 346, 'isint', 347, 'isnum', 348, 'isstr', 349, 'islist', 350, 'ishash', 351, 'sethllconfig', 352, 'hllboxtype_i', 353, 'hllboxtype_n', 354, 'hllboxtype_s', 355, 'hlllist', 356, 'hllhash', 357, 'getcomp', 358, 'bindcomp', 359, 'getcurhllsym', 360, 'bindcurhllsym', 361, 'gethllsym', 362, 'bindhllsym', 363, 'settypehll', 364, 'settypehllrole', 365, 'hllize', 366, 'hllizefor', 367, 'usecompileehllconfig', 368, 'usecompilerhllconfig', 369, 'iter', 370, 'iterkey_s', 371, 'iterval', 372, 'getcodename', 373, 'iscoderef', 374, 'getcodeobj', 375, 'setcodeobj', 376, 'setcodename', 377, 'forceouterctx', 378, 'setinvokespec', 379, 'isinvokable', 380, 'freshcoderef', 381, 'markcodestatic', 382, 'markcodestub', 383, 'getstaticcode', 384, 'getcodecuid', 385, 'setdispatcher', 386, 'takedispatcher', 387, 'assign', 388, 'assignunchecked', 389, 'iscont', 390, 'decont', 391, 'setcontspec', 392, 'sha1', 393, 'createsc', 394, 'scsetobj', 395, 'scsetcode', 396, 'scgetobj', 397, 'scgethandle', 398, 'scgetobjidx', 399, 'scsetdesc', 400, 'scobjcount', 401, 'setobjsc', 402, 'getobjsc', 403, 'serialize', 404, 'deserialize', 405, 'wval', 406, 'wval_wide', 407, 'scwbdisable', 408, 'scwbenable', 409, 'pushcompsc', 410, 'popcompsc', 411, 'scgetdesc', 412, 'loadbytecode', 413, 'masttofile', 414, 'masttocu', 415, 'iscompunit', 416, 'compunitmainline', 417, 'compunitcodes', 418, 'ctx', 419, 'ctxouter', 420, 'ctxcaller', 421, 'ctxlexpad', 422, 'curcode', 423, 'callercode', 424, 'add_I', 425, 'sub_I', 426, 'mul_I', 427, 'div_I', 428, 'mod_I', 429, 'neg_I', 430, 'abs_I', 431, 'cmp_I', 432, 'eq_I', 433, 'ne_I', 434, 'lt_I', 435, 'le_I', 436, 'gt_I', 437, 'ge_I', 438, 'bor_I', 439, 'bxor_I', 440, 'band_I', 441, 'bnot_I', 442, 'blshift_I', 443, 'brshift_I', 444, 'pow_I', 445, 'gcd_I', 446, 'lcm_I', 447, 'expmod_I', 448, 'isprime_I', 449, 'rand_I', 450, 'coerce_In', 451, 'coerce_Is', 452, 'coerce_nI', 453, 'coerce_sI', 454, 'isbig_I', 455, 'bool_I', 456, 'base_I', 457, 'radix_I', 458, 'div_In', 459, 'copy_f', 460, 'append_f', 461, 'rename_f', 462, 'delete_f', 463, 'chmod_f', 464, 'exists_f', 465, 'mkdir', 466, 'rmdir', 467, 'open_dir', 468, 'read_dir', 469, 'close_dir', 470, 'open_fh', 471, 'close_fh', 472, 'read_fhs', 473, 'slurp', 474, 'spew', 475, 'write_fhs', 476, 'seek_fh', 477, 'lock_fh', 478, 'unlock_fh', 479, 'sync_fh', 480, 'trunc_fh', 481, 'eof_fh', 482, 'getstdin', 483, 'getstdout', 484, 'getstderr', 485, 'connect_sk', 486, 'socket', 487, 'bind_sk', 488, 'setinputlinesep_fh', 489, 'accept_sk', 490, 'DEPRECATED_1', 491, 'DEPRECATED_2', 492, 'setencoding', 493, 'print', 494, 'say', 495, 'readall_fh', 496, 'tell_fh', 497, 'stat', 498, 'readline_fh', 499, 'readlineint_fh', 500, 'chdir', 501, 'srand', 502, 'rand_i', 503, 'rand_n', 504, 'time_i', 505, 'sleep', 506, 'newthread', 507, 'threadjoin', 508, 'time_n', 509, 'exit', 510, 'shell', 511, 'cwd', 512, 'clargs', 513, 'getenvhash', 514, 'loadlib', 515, 'freelib', 516, 'findsym', 517, 'dropsym', 518, 'loadext', 519, 'backendconfig', 520, 'getlexouter', 521, 'getlexrel', 522, 'getlexreldyn', 523, 'getlexrelcaller', 524, 'getlexcaller', 525, 'bitand_s', 526, 'bitor_s', 527, 'bitxor_s', 528, 'isnanorinf', 529, 'inf', 530, 'neginf', 531, 'nan', 532, 'getpid', 533, 'spawn', 534, 'filereadable', 535, 'filewritable', 536, 'fileexecutable', 537, 'say_fhs', 538, 'capturenamedshash', 539, 'read_fhb', 540, 'write_fhb', 541, 'replace', 542, 'newexception', 543, 'openpipe', 544, 'backtrace', 545, 'symlink', 546, 'link', 547, 'gethostname', 548, 'exreturnafterunwind', 549, 'continuationclone', 550, 'continuationreset', 551, 'continuationcontrol', 552, 'continuationinvoke', 553, 'randscale_n', 554, 'uniisblock', 555, 'assertparamcheck', 556, 'hintfor', 557, 'paramnamesused', 558, 'getuniname', 559, 'getuniprop_int', 560, 'getuniprop_bool', 561, 'getuniprop_str', 562, 'matchuniprop', 563, 'nativecallbuild', 564, 'nativecallinvoke', 565, 'nativecallrefresh', 566, 'threadrun', 567, 'threadid', 568, 'threadyield', 569, 'currentthread', 570, 'lock', 571, 'unlock', 572, 'semacquire', 573, 'semtryacquire', 574, 'semrelease', 575, 'getlockcondvar', 576, 'condwait', 577, 'condsignalone', 578, 'condsignalall', 579, 'queuepoll', 580, 'setmultispec', 581, 'ctxouterskipthunks', 582, 'ctxcallerskipthunks', 583, 'timer', 584, 'cancel', 585, 'signal', 586, 'watchfile', 587, 'asyncconnect', 588, 'asynclisten', 589, 'asyncwritestr', 590, 'asyncwritebytes', 591, 'asyncreadchars', 592, 'asyncreadbytes', 593, 'getlexstatic_o', 594, 'getlexperinvtype_o', 595, 'execname', 596, 'const_i64_16', 597, 'const_i64_32', 598, 'isnonnull', 599, 'param_rn2_i', 600, 'param_rn2_n', 601, 'param_rn2_s', 602, 'param_rn2_o', 603, 'param_on2_i', 604, 'param_on2_n', 605, 'param_on2_s', 606, 'param_on2_o', 607, 'osrpoint', 608, 'nativecallcast', 609, 'spawnprocasync', 610, 'killprocasync', 611, 'startprofile', 612, 'endprofile', 613, 'objectid', 614, 'settypefinalize', 615, 'force_gc', 616, 'nativecallglobal', 617, 'close_fhi', 618, 'sp_log', 619, 'sp_osrfinalize', 620, 'sp_guardconc', 621, 'sp_guardtype', 622, 'sp_guardcontconc', 623, 'sp_guardconttype', 624, 'sp_getarg_o', 625, 'sp_getarg_i', 626, 'sp_getarg_n', 627, 'sp_getarg_s', 628, 'sp_fastinvoke_v', 629, 'sp_fastinvoke_i', 630, 'sp_fastinvoke_n', 631, 'sp_fastinvoke_s', 632, 'sp_fastinvoke_o', 633, 'sp_namedarg_used', 634, 'sp_getspeshslot', 635, 'sp_findmeth', 636, 'sp_fastcreate', 637, 'sp_get_o', 638, 'sp_get_i', 639, 'sp_get_n', 640, 'sp_get_s', 641, 'sp_bind_o', 642, 'sp_bind_i', 643, 'sp_bind_n', 644, 'sp_bind_s', 645, 'sp_p6oget_o', 646, 'sp_p6ogetvt_o', 647, 'sp_p6ogetvc_o', 648, 'sp_p6oget_i', 649, 'sp_p6oget_n', 650, 'sp_p6oget_s', 651, 'sp_p6obind_o', 652, 'sp_p6obind_i', 653, 'sp_p6obind_n', 654, 'sp_p6obind_s', 655, 'sp_jit_enter', 656, 'sp_boolify_iter', 657, 'sp_boolify_iter_arr', 658, 'sp_boolify_iter_hash', 659, 'prof_enter', 660, 'prof_enterspesh', 661, 'prof_enterinline', 662, 'prof_exit', 663, 'prof_allocated', 664; our @names is export = 'no_op', 'const_i8', 'const_i16', 'const_i32', 'const_i64', 'const_n32', 'const_n64', 'const_s', 'set', 'extend_u8', 'extend_u16', 'extend_u32', 'extend_i8', 'extend_i16', 'extend_i32', 'trunc_u8', 'trunc_u16', 'trunc_u32', 'trunc_i8', 'trunc_i16', 'trunc_i32', 'extend_n32', 'trunc_n32', 'goto', 'if_i', 'unless_i', 'if_n', 'unless_n', 'if_s', 'unless_s', 'if_s0', 'unless_s0', 'if_o', 'unless_o', 'jumplist', 'getlex', 'bindlex', 'getlex_ni', 'getlex_nn', 'getlex_ns', 'getlex_no', 'bindlex_ni', 'bindlex_nn', 'bindlex_ns', 'bindlex_no', 'getlex_ng', 'bindlex_ng', 'getdynlex', 'binddynlex', 'setlexvalue', 'lexprimspec', 'return_i', 'return_n', 'return_s', 'return_o', 'return', 'eq_i', 'ne_i', 'lt_i', 'le_i', 'gt_i', 'ge_i', 'cmp_i', 'add_i', 'sub_i', 'mul_i', 'div_i', 'div_u', 'mod_i', 'mod_u', 'neg_i', 'abs_i', 'inc_i', 'inc_u', 'dec_i', 'dec_u', 'band_i', 'bor_i', 'bxor_i', 'bnot_i', 'blshift_i', 'brshift_i', 'pow_i', 'not_i', 'gcd_i', 'lcm_i', 'eq_n', 'ne_n', 'lt_n', 'le_n', 'gt_n', 'ge_n', 'cmp_n', 'add_n', 'sub_n', 'mul_n', 'div_n', 'mod_n', 'neg_n', 'abs_n', 'pow_n', 'ceil_n', 'floor_n', 'sin_n', 'asin_n', 'cos_n', 'acos_n', 'tan_n', 'atan_n', 'atan2_n', 'sec_n', 'asec_n', 'sinh_n', 'cosh_n', 'tanh_n', 'sech_n', 'sqrt_n', 'log_n', 'exp_n', 'coerce_in', 'coerce_ni', 'coerce_is', 'coerce_ns', 'coerce_si', 'coerce_sn', 'smrt_numify', 'smrt_strify', 'prepargs', 'arg_i', 'arg_n', 'arg_s', 'arg_o', 'argconst_i', 'argconst_n', 'argconst_s', 'invoke_v', 'invoke_i', 'invoke_n', 'invoke_s', 'invoke_o', 'checkarity', 'param_rp_i', 'param_rp_n', 'param_rp_s', 'param_rp_o', 'param_op_i', 'param_op_n', 'param_op_s', 'param_op_o', 'param_rn_i', 'param_rn_n', 'param_rn_s', 'param_rn_o', 'param_on_i', 'param_on_n', 'param_on_s', 'param_on_o', 'param_sp', 'param_sn', 'getcode', 'caller', 'capturelex', 'takeclosure', 'exception', 'bindexmessage', 'bindexpayload', 'bindexcategory', 'getexmessage', 'getexpayload', 'getexcategory', 'throwdyn', 'throwlex', 'throwlexotic', 'throwcatdyn', 'throwcatlex', 'throwcatlexotic', 'die', 'rethrow', 'resume', 'takehandlerresult', 'newlexotic', 'lexoticresult', 'backtracestrings', 'usecapture', 'savecapture', 'captureposelems', 'captureposarg', 'captureposarg_i', 'captureposarg_n', 'captureposarg_s', 'captureposprimspec', 'captureexistsnamed', 'capturehasnameds', 'invokewithcapture', 'multicacheadd', 'multicachefind', 'null_s', 'isnull_s', 'eq_s', 'ne_s', 'gt_s', 'ge_s', 'lt_s', 'le_s', 'cmp_s', 'eqat_s', 'eqatic_s', 'haveat_s', 'concat_s', 'repeat_s', 'substr_s', 'index_s', 'graphs_s', 'codes_s', 'getcp_s', 'indexcp_s', 'uc', 'lc', 'tc', 'split', 'join', 'getcpbyname', 'indexat', 'indexnat', 'unipropcode', 'unipvalcode', 'hasuniprop', 'hasunipropc', 'chars', 'chr', 'ordfirst', 'ordat', 'rindexfrom', 'escape', 'flip', 'flattenropes', 'iscclass', 'findcclass', 'findnotcclass', 'nfafromstatelist', 'nfarunproto', 'nfarunalt', 'radix', 'encode', 'decode', 'istrue_s', 'isfalse_s', 'null', 'isnull', 'ifnonnull', 'findmeth', 'findmeth_s', 'can', 'can_s', 'create', 'clone', 'isconcrete', 'rebless', 'istype', 'objprimspec', 'gethow', 'getwhat', 'getwho', 'setwho', 'reprname', 'getwhere', 'eqaddr', 'bindattr_i', 'bindattr_n', 'bindattr_s', 'bindattr_o', 'bindattrs_i', 'bindattrs_n', 'bindattrs_s', 'bindattrs_o', 'getattr_i', 'getattr_n', 'getattr_s', 'getattr_o', 'getattrs_i', 'getattrs_n', 'getattrs_s', 'getattrs_o', 'attrinited', 'box_i', 'box_n', 'box_s', 'unbox_i', 'unbox_n', 'unbox_s', 'atpos_i', 'atpos_n', 'atpos_s', 'atpos_o', 'bindpos_i', 'bindpos_n', 'bindpos_s', 'bindpos_o', 'push_i', 'push_n', 'push_s', 'push_o', 'pop_i', 'pop_n', 'pop_s', 'pop_o', 'shift_i', 'shift_n', 'shift_s', 'shift_o', 'unshift_i', 'unshift_n', 'unshift_s', 'unshift_o', 'splice', 'setelemspos', 'existspos', 'atkey_i', 'atkey_n', 'atkey_s', 'atkey_o', 'bindkey_i', 'bindkey_n', 'bindkey_s', 'bindkey_o', 'existskey', 'deletekey', 'elems', 'knowhow', 'knowhowattr', 'newtype', 'composetype', 'setmethcache', 'setmethcacheauth', 'settypecache', 'settypecheckmode', 'setboolspec', 'istrue', 'isfalse', 'bootint', 'bootnum', 'bootstr', 'bootarray', 'bootintarray', 'bootnumarray', 'bootstrarray', 'boothash', 'isint', 'isnum', 'isstr', 'islist', 'ishash', 'sethllconfig', 'hllboxtype_i', 'hllboxtype_n', 'hllboxtype_s', 'hlllist', 'hllhash', 'getcomp', 'bindcomp', 'getcurhllsym', 'bindcurhllsym', 'gethllsym', 'bindhllsym', 'settypehll', 'settypehllrole', 'hllize', 'hllizefor', 'usecompileehllconfig', 'usecompilerhllconfig', 'iter', 'iterkey_s', 'iterval', 'getcodename', 'iscoderef', 'getcodeobj', 'setcodeobj', 'setcodename', 'forceouterctx', 'setinvokespec', 'isinvokable', 'freshcoderef', 'markcodestatic', 'markcodestub', 'getstaticcode', 'getcodecuid', 'setdispatcher', 'takedispatcher', 'assign', 'assignunchecked', 'iscont', 'decont', 'setcontspec', 'sha1', 'createsc', 'scsetobj', 'scsetcode', 'scgetobj', 'scgethandle', 'scgetobjidx', 'scsetdesc', 'scobjcount', 'setobjsc', 'getobjsc', 'serialize', 'deserialize', 'wval', 'wval_wide', 'scwbdisable', 'scwbenable', 'pushcompsc', 'popcompsc', 'scgetdesc', 'loadbytecode', 'masttofile', 'masttocu', 'iscompunit', 'compunitmainline', 'compunitcodes', 'ctx', 'ctxouter', 'ctxcaller', 'ctxlexpad', 'curcode', 'callercode', 'add_I', 'sub_I', 'mul_I', 'div_I', 'mod_I', 'neg_I', 'abs_I', 'cmp_I', 'eq_I', 'ne_I', 'lt_I', 'le_I', 'gt_I', 'ge_I', 'bor_I', 'bxor_I', 'band_I', 'bnot_I', 'blshift_I', 'brshift_I', 'pow_I', 'gcd_I', 'lcm_I', 'expmod_I', 'isprime_I', 'rand_I', 'coerce_In', 'coerce_Is', 'coerce_nI', 'coerce_sI', 'isbig_I', 'bool_I', 'base_I', 'radix_I', 'div_In', 'copy_f', 'append_f', 'rename_f', 'delete_f', 'chmod_f', 'exists_f', 'mkdir', 'rmdir', 'open_dir', 'read_dir', 'close_dir', 'open_fh', 'close_fh', 'read_fhs', 'slurp', 'spew', 'write_fhs', 'seek_fh', 'lock_fh', 'unlock_fh', 'sync_fh', 'trunc_fh', 'eof_fh', 'getstdin', 'getstdout', 'getstderr', 'connect_sk', 'socket', 'bind_sk', 'setinputlinesep_fh', 'accept_sk', 'DEPRECATED_1', 'DEPRECATED_2', 'setencoding', 'print', 'say', 'readall_fh', 'tell_fh', 'stat', 'readline_fh', 'readlineint_fh', 'chdir', 'srand', 'rand_i', 'rand_n', 'time_i', 'sleep', 'newthread', 'threadjoin', 'time_n', 'exit', 'shell', 'cwd', 'clargs', 'getenvhash', 'loadlib', 'freelib', 'findsym', 'dropsym', 'loadext', 'backendconfig', 'getlexouter', 'getlexrel', 'getlexreldyn', 'getlexrelcaller', 'getlexcaller', 'bitand_s', 'bitor_s', 'bitxor_s', 'isnanorinf', 'inf', 'neginf', 'nan', 'getpid', 'spawn', 'filereadable', 'filewritable', 'fileexecutable', 'say_fhs', 'capturenamedshash', 'read_fhb', 'write_fhb', 'replace', 'newexception', 'openpipe', 'backtrace', 'symlink', 'link', 'gethostname', 'exreturnafterunwind', 'continuationclone', 'continuationreset', 'continuationcontrol', 'continuationinvoke', 'randscale_n', 'uniisblock', 'assertparamcheck', 'hintfor', 'paramnamesused', 'getuniname', 'getuniprop_int', 'getuniprop_bool', 'getuniprop_str', 'matchuniprop', 'nativecallbuild', 'nativecallinvoke', 'nativecallrefresh', 'threadrun', 'threadid', 'threadyield', 'currentthread', 'lock', 'unlock', 'semacquire', 'semtryacquire', 'semrelease', 'getlockcondvar', 'condwait', 'condsignalone', 'condsignalall', 'queuepoll', 'setmultispec', 'ctxouterskipthunks', 'ctxcallerskipthunks', 'timer', 'cancel', 'signal', 'watchfile', 'asyncconnect', 'asynclisten', 'asyncwritestr', 'asyncwritebytes', 'asyncreadchars', 'asyncreadbytes', 'getlexstatic_o', 'getlexperinvtype_o', 'execname', 'const_i64_16', 'const_i64_32', 'isnonnull', 'param_rn2_i', 'param_rn2_n', 'param_rn2_s', 'param_rn2_o', 'param_on2_i', 'param_on2_n', 'param_on2_s', 'param_on2_o', 'osrpoint', 'nativecallcast', 'spawnprocasync', 'killprocasync', 'startprofile', 'endprofile', 'objectid', 'settypefinalize', 'force_gc', 'nativecallglobal', 'close_fhi', 'sp_log', 'sp_osrfinalize', 'sp_guardconc', 'sp_guardtype', 'sp_guardcontconc', 'sp_guardconttype', 'sp_getarg_o', 'sp_getarg_i', 'sp_getarg_n', 'sp_getarg_s', 'sp_fastinvoke_v', 'sp_fastinvoke_i', 'sp_fastinvoke_n', 'sp_fastinvoke_s', 'sp_fastinvoke_o', 'sp_namedarg_used', 'sp_getspeshslot', 'sp_findmeth', 'sp_fastcreate', 'sp_get_o', 'sp_get_i', 'sp_get_n', 'sp_get_s', 'sp_bind_o', 'sp_bind_i', 'sp_bind_n', 'sp_bind_s', 'sp_p6oget_o', 'sp_p6ogetvt_o', 'sp_p6ogetvc_o', 'sp_p6oget_i', 'sp_p6oget_n', 'sp_p6oget_s', 'sp_p6obind_o', 'sp_p6obind_i', 'sp_p6obind_n', 'sp_p6obind_s', 'sp_jit_enter', 'sp_boolify_iter', 'sp_boolify_iter_arr', 'sp_boolify_iter_hash', 'prof_enter', 'prof_enterspesh', 'prof_enterinline', 'prof_exit', 'prof_allocated'; } MoarVM-2018.03/lib/README.md0000644000175000017510000000100213111771623015223 0ustar samanthasamantha## MAST Libraries (written in NQP) MAST stands for Moar Abstract Syntax Tree, and is akin to the other NQP backends' VM-specific AST systems (PIRT for Parrot VM and JAST for JVM). Nodes.nqp contains the NQP classes that define the AST nodes, which map closely to the various components of MoarVM's bytecode format. Ops.nqp is generated by tools/update_ops.p6 from src/core/oplist. For the bootstrap, it is concatenated with the other MAST-related NQP files to be compiled to a single .moarvm bytecode library. MoarVM-2018.03/ports/macports/Portfile0000644000175000017510000000213213237701075017714 0ustar samanthasamantha# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:filetype=tcl:et:sw=4:ts=4:sts=4 # $Id$ PortSystem 1.0 name MoarVM version 2015.12 categories lang devel platforms darwin license Artistic-2 MIT BSD ISC public-domain maintainers coleda.com:will mojca openmaintainer description A virtual machine for Perl 6 long_description MoarVM is a virtual machine built especially for \ Rakudo Perl 6 and the NQP Compiler Toolchain. homepage http://moarvm.org/ master_sites http://moarvm.org/releases/ checksums rmd160 372b3dacee231c371730ba6e8089e315ee8e3687 \ sha256 4e4f106ec0802dfda5206fea811d260cc1111fe4cfa13b038af9077d8ad56826 # TODO: https://github.com/MoarVM/MoarVM/issues/321 conflicts dyncall libtommath libuv depends_build port:perl5 # Unsupported by configure.pl. configure.universal_args-delete --disable-dependency-tracking configure.cmd ${prefix}/bin/perl Configure.pl MoarVM-2018.03/ports/macports/README.md0000644000175000017510000000505713237701075017475 0ustar samanthasamanthaWhen updating the `Portfile` to reflect the new release: 1. Setup a [local portfile directory](https://guide.macports.org/chunked/development.local-repositories.html) * Checkout the latest version from [SVN](http://trac.macports.org/browser/trunk/dports/lang/MoarVM) (or run `svn up` if you have done that already to make sure that you start with the latest version from the MacPorts repository). export MYDIR=/your/path cd $MYDIR svn co --depth=empty https://svn.macports.org/repository/macports/trunk/dports macports && cd macports svn up --depth=emtpy lang && cd lang svn up MoarVM nqp rakudo * Run `portindex`, so that MacPorts will be able to find the port: cd $MYDIR/macports && portindex * Edit `/opt/local/etc/macports/sources.conf`, adding a reference to a local directory, like: `file:///your/path/macports/` * Verify that `port dir MoarVM` returns `/your/path/macports/lang/MoarVM`. 2. Edit the `Portfile`: * Update the `version` field to the latest version. * Remove the `revision` (if any revision is present). * Save. * Run `sudo port -v checksum MoarVM` from the shell. This will generate a bunch of output, including replacement checksum lines; copy them back into the `Portfile`, replacing the original versions. Save. (If you generate the tarballs yourself, you might want to double-check the checksums with `openssl dgst -sha256 ` or with any similar technique.) 3. Test the changes: port info MoarVM # should give you the latest version sudo port -v -t test MoarVM sudo port -v -t install MoarVM 4. Open a ticket to update the portfile * Create a unified diff with cd $(port dir MoarVM) svn diff > /tmp/MoarVM-x.y.Portfile.diff * Open a new ticket on http://trac.macports.org/ (you'll need a trac account first). * **summary**: `MoarVM: update to version x.y` * **version**: `(none)` * **type**: update * **CC**: add (co)maintainers (you get full emails with `port info MoarVM`) and potentially other developers that might be interested * **keywoords**: `haspatch` (or `haspatch maintainer` if you are also listed as maintainer) * **port**: `MoarVM` * Make sure to attach the diff. * Hang out in `#macports` on freenode and mention the ticket or write to the macports-dev mailing list with URL to the ticket and a descriptive subject if there is no response for a while. 5. Push the updated `Portfile` also to git. MoarVM-2018.03/src/6model/6model.c0000644000175000017510000004170013243117024016511 0ustar samanthasamantha#include "moar.h" /* Gets the HOW (meta-object), which may be lazily deserialized. */ MVMObject * MVM_6model_get_how(MVMThreadContext *tc, MVMSTable *st) { MVMObject *HOW = st->HOW; if (!HOW) st->HOW = HOW = MVM_sc_get_object(tc, st->HOW_sc, st->HOW_idx); return HOW; } /* Gets the HOW (meta-object), which may be lazily deserialized, through the * STable of the passed object. */ MVMObject * MVM_6model_get_how_obj(MVMThreadContext *tc, MVMObject *obj) { return MVM_6model_get_how(tc, STABLE(obj)); } /* Obtains the method cache, lazily deserializing if it needed. */ static MVMObject * get_method_cache(MVMThreadContext *tc, MVMSTable *st) { if (!st->method_cache) MVM_serialization_finish_deserialize_method_cache(tc, st); return st->method_cache; } /* Locates a method by name, checking in the method cache only. */ MVMObject * MVM_6model_find_method_cache_only(MVMThreadContext *tc, MVMObject *obj, MVMString *name) { MVMObject *cache; MVMROOT(tc, name, { cache = get_method_cache(tc, STABLE(obj)); }); if (cache && IS_CONCRETE(cache)) return MVM_repr_at_key_o(tc, cache, name); return NULL; } /* Locates a method by name. Returns the method if it exists, or throws an * exception if it can not be found. */ typedef struct { MVMObject *obj; MVMString *name; MVMRegister *res; MVMint64 throw_if_not_found; } FindMethodSRData; static void die_over_missing_method(MVMThreadContext *tc, MVMObject *obj, MVMString *name) { MVMObject *handler = MVM_hll_current(tc)->method_not_found_error; if (!MVM_is_null(tc, handler)) { MVMCallsite *methnotfound_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_METH_NOT_FOUND); handler = MVM_frame_find_invokee(tc, handler, NULL); MVM_args_setup_thunk(tc, NULL, MVM_RETURN_VOID, methnotfound_callsite); tc->cur_frame->args[0].o = obj; tc->cur_frame->args[1].s = name; STABLE(handler)->invoke(tc, handler, methnotfound_callsite, tc->cur_frame->args); return; } else { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Cannot find method '%s' on object of type %s", c_name, MVM_6model_get_debug_name(tc, obj)); } } static void late_bound_find_method_return(MVMThreadContext *tc, void *sr_data) { FindMethodSRData *fm = (FindMethodSRData *)sr_data; if (MVM_is_null(tc, fm->res->o) || !IS_CONCRETE(fm->res->o)) { if (fm->throw_if_not_found) { MVMObject *obj = fm->obj; MVMString *name = fm->name; MVM_free(fm); die_over_missing_method(tc, obj, name); } else { fm->res->o = tc->instance->VMNull; MVM_free(fm); } } else { MVM_free(fm); } } static void mark_find_method_sr_data(MVMThreadContext *tc, MVMFrame *frame, MVMGCWorklist *worklist) { FindMethodSRData *fm = (FindMethodSRData *)frame->extra->special_return_data; MVM_gc_worklist_add(tc, worklist, &fm->obj); MVM_gc_worklist_add(tc, worklist, &fm->name); } void MVM_6model_find_method(MVMThreadContext *tc, MVMObject *obj, MVMString *name, MVMRegister *res, MVMint64 throw_if_not_found) { MVMObject *cache = NULL, *HOW = NULL, *find_method = NULL, *code = NULL; MVMCallsite *findmeth_callsite = NULL; if (MVM_is_null(tc, obj)) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Cannot call method '%s' on a null object", c_name); } /* First try to find it in the cache. If we find it, we have a result. * If we don't find it, but the cache is authoritative, then error. */ MVMROOT2(tc, obj, name, { cache = get_method_cache(tc, STABLE(obj)); }); if (cache && IS_CONCRETE(cache)) { MVMObject *meth = MVM_repr_at_key_o(tc, cache, name); if (!MVM_is_null(tc, meth)) { res->o = meth; return; } if (STABLE(obj)->mode_flags & MVM_METHOD_CACHE_AUTHORITATIVE) { if (throw_if_not_found) die_over_missing_method(tc, obj, name); else res->o = tc->instance->VMNull; return; } } /* Otherwise, need to call the find_method method. We make the assumption * that the invocant's meta-object's type is composed. */ MVMROOT3(tc, obj, name, HOW, { HOW = MVM_6model_get_how(tc, STABLE(obj)); find_method = MVM_6model_find_method_cache_only(tc, HOW, tc->instance->str_consts.find_method); }); if (MVM_is_null(tc, find_method)) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Cannot find method '%s': no method cache and no .^find_method", c_name); } /* Set up the call, using the result register as the target. */ code = MVM_frame_find_invokee(tc, find_method, NULL); findmeth_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_FIND_METHOD); MVM_args_setup_thunk(tc, res, MVM_RETURN_OBJ, findmeth_callsite); { FindMethodSRData *fm = MVM_malloc(sizeof(FindMethodSRData)); fm->obj = obj; fm->name = name; fm->res = res; fm->throw_if_not_found = throw_if_not_found; MVM_frame_special_return(tc, tc->cur_frame, late_bound_find_method_return, NULL, fm, mark_find_method_sr_data); } tc->cur_frame->args[0].o = HOW; tc->cur_frame->args[1].o = obj; tc->cur_frame->args[2].s = name; STABLE(code)->invoke(tc, code, findmeth_callsite, tc->cur_frame->args); } MVMint32 MVM_6model_find_method_spesh(MVMThreadContext *tc, MVMObject *obj, MVMString *name, MVMint32 ss_idx, MVMRegister *res) { MVMObject *meth; /* Missed mono-morph; try cache-only lookup. */ MVMROOT2(tc, obj, name, { meth = MVM_6model_find_method_cache_only(tc, obj, name); }); if (!MVM_is_null(tc, meth)) { /* Got it; cache. Must be careful due to threads * reading, races, etc. */ MVMStaticFrame *sf = tc->cur_frame->static_info; uv_mutex_lock(&tc->instance->mutex_spesh_install); if (!tc->cur_frame->effective_spesh_slots[ss_idx + 1]) { MVMStaticFrameSpesh *spesh = sf->body.spesh; MVM_ASSIGN_REF(tc, &(spesh->common.header), tc->cur_frame->effective_spesh_slots[ss_idx + 1], (MVMCollectable *)meth); MVM_barrier(); MVM_ASSIGN_REF(tc, &(spesh->common.header), tc->cur_frame->effective_spesh_slots[ss_idx], (MVMCollectable *)STABLE(obj)); } uv_mutex_unlock(&tc->instance->mutex_spesh_install); res->o = meth; return 0; } else { /* Fully late-bound. */ MVM_6model_find_method(tc, obj, name, res, 1); return 1; } } /* Locates a method by name. Returns 1 if it exists; otherwise 0. */ static void late_bound_can_return(MVMThreadContext *tc, void *sr_data) { /* Transform to an integer result. */ MVMRegister *reg = (MVMRegister *)sr_data; reg->i64 = !MVM_is_null(tc, reg->o) && IS_CONCRETE(reg->o) ? 1 : 0; } MVMint64 MVM_6model_can_method_cache_only(MVMThreadContext *tc, MVMObject *obj, MVMString *name) { MVMObject *cache; if (MVM_is_null(tc, obj)) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Cannot look for method '%s' on a null object", c_name); } /* Consider the method cache. */ MVMROOT2(tc, obj, name, { cache = get_method_cache(tc, STABLE(obj)); }); if (cache && IS_CONCRETE(cache)) { MVMObject *meth = MVM_repr_at_key_o(tc, cache, name); if (!MVM_is_null(tc, meth)) { return 1; } if (STABLE(obj)->mode_flags & MVM_METHOD_CACHE_AUTHORITATIVE) { return 0; } } return -1; } void MVM_6model_can_method(MVMThreadContext *tc, MVMObject *obj, MVMString *name, MVMRegister *res) { MVMObject *HOW = NULL, *find_method = NULL, *code = NULL; MVMCallsite *findmeth_callsite = NULL; MVMint64 can_cached; MVMROOT2(tc, obj, name, { can_cached = MVM_6model_can_method_cache_only(tc, obj, name); }); if (can_cached == 0 || can_cached == 1) { res->i64 = can_cached; return; } /* If no method in cache and the cache is not authoritative, need to make * a late-bound call to find_method. */ MVMROOT3(tc, obj, name, HOW, { HOW = MVM_6model_get_how(tc, STABLE(obj)); find_method = MVM_6model_find_method_cache_only(tc, HOW, tc->instance->str_consts.find_method); }); if (MVM_is_null(tc, find_method)) { /* This'll count as a "no"... */ res->i64 = 0; return; } /* Set up the call, using the result register as the target. A little bad * as we're really talking about */ code = MVM_frame_find_invokee(tc, find_method, NULL); findmeth_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_FIND_METHOD); MVM_args_setup_thunk(tc, res, MVM_RETURN_OBJ, findmeth_callsite); MVM_frame_special_return(tc, tc->cur_frame, late_bound_can_return, NULL, res, NULL); tc->cur_frame->args[0].o = HOW; tc->cur_frame->args[1].o = obj; tc->cur_frame->args[2].s = name; STABLE(code)->invoke(tc, code, findmeth_callsite, tc->cur_frame->args); } /* Checks if an object has a given type, delegating to the type_check or * accepts_type methods as needed. */ static void do_accepts_type_check(MVMThreadContext *tc, MVMObject *obj, MVMObject *type, MVMRegister *res) { MVMObject *HOW = NULL, *meth = NULL; MVMROOT3(tc, obj, type, HOW, { HOW = MVM_6model_get_how(tc, STABLE(type)); meth = MVM_6model_find_method_cache_only(tc, HOW, tc->instance->str_consts.accepts_type); }); if (!MVM_is_null(tc, meth)) { /* Set up the call, using the result register as the target. */ MVMObject *code = MVM_frame_find_invokee(tc, meth, NULL); MVMCallsite *typecheck_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_TYPECHECK); MVM_args_setup_thunk(tc, res, MVM_RETURN_INT, typecheck_callsite); tc->cur_frame->args[0].o = HOW; tc->cur_frame->args[1].o = type; tc->cur_frame->args[2].o = obj; STABLE(code)->invoke(tc, code, typecheck_callsite, tc->cur_frame->args); return; } else { MVM_exception_throw_adhoc(tc, "Expected 'accepts_type' method, but none found in meta-object"); } } typedef struct { MVMObject *obj; MVMObject *type; MVMRegister *res; } AcceptsTypeSRData; static void accepts_type_sr(MVMThreadContext *tc, void *sr_data) { AcceptsTypeSRData *atd = (AcceptsTypeSRData *)sr_data; MVMObject *obj = atd->obj; MVMObject *type = atd->type; MVMRegister *res = atd->res; MVM_free(atd); if (!res->i64) do_accepts_type_check(tc, obj, type, res); } static void mark_sr_data(MVMThreadContext *tc, MVMFrame *frame, MVMGCWorklist *worklist) { AcceptsTypeSRData *atd = (AcceptsTypeSRData *)frame->extra->special_return_data; MVM_gc_worklist_add(tc, worklist, &atd->obj); MVM_gc_worklist_add(tc, worklist, &atd->type); } void MVM_6model_istype(MVMThreadContext *tc, MVMObject *obj, MVMObject *type, MVMRegister *res) { MVMObject **cache; MVMSTable *st; MVMint64 mode; /* Null never type-checks. */ if (MVM_is_null(tc, obj)) { res->i64 = 0; return; } st = STABLE(obj); mode = STABLE(type)->mode_flags & MVM_TYPE_CHECK_CACHE_FLAG_MASK; cache = st->type_check_cache; if (cache) { /* We have the cache, so just look for the type object we * want to be in there. */ MVMint64 elems = STABLE(obj)->type_check_cache_length; MVMint64 i; for (i = 0; i < elems; i++) { if (cache[i] == type) { res->i64 = 1; return; } } /* If the type check cache is definitive, we're done. */ if ((mode & MVM_TYPE_CHECK_CACHE_THEN_METHOD) == 0 && (mode & MVM_TYPE_CHECK_NEEDS_ACCEPTS) == 0) { res->i64 = 0; return; } } /* If we get here, need to call .^type_check on the value we're * checking, unless it's an accepts check. */ if (!cache || (mode & MVM_TYPE_CHECK_CACHE_THEN_METHOD)) { MVMObject *HOW = NULL, *meth = NULL; MVMROOT3(tc, obj, type, HOW, { HOW = MVM_6model_get_how(tc, st); meth = MVM_6model_find_method_cache_only(tc, HOW, tc->instance->str_consts.type_check); }); if (!MVM_is_null(tc, meth)) { /* Set up the call, using the result register as the target. */ MVMObject *code = MVM_frame_find_invokee(tc, meth, NULL); MVMCallsite *typecheck_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_TYPECHECK); MVM_args_setup_thunk(tc, res, MVM_RETURN_INT, typecheck_callsite); tc->cur_frame->args[0].o = HOW; tc->cur_frame->args[1].o = obj; tc->cur_frame->args[2].o = type; if (mode & MVM_TYPE_CHECK_NEEDS_ACCEPTS) { AcceptsTypeSRData *atd = MVM_malloc(sizeof(AcceptsTypeSRData)); atd->obj = obj; atd->type = type; atd->res = res; MVM_frame_special_return(tc, tc->cur_frame, accepts_type_sr, NULL, atd, mark_sr_data); } STABLE(code)->invoke(tc, code, typecheck_callsite, tc->cur_frame->args); return; } } /* If the flag to call .accepts_type on the target value is set, do so. */ if (mode & MVM_TYPE_CHECK_NEEDS_ACCEPTS) { do_accepts_type_check(tc, obj, type, res); } else { /* If all else fails... */ res->i64 = 0; } } /* Checks if an object has a given type, using the cache only. */ MVMint64 MVM_6model_istype_cache_only(MVMThreadContext *tc, MVMObject *obj, MVMObject *type) { if (!MVM_is_null(tc, obj)) { MVMuint16 i, elems = STABLE(obj)->type_check_cache_length; MVMObject **cache = STABLE(obj)->type_check_cache; if (cache) for (i = 0; i < elems; i++) { if (cache[i] == type) return 1; } } return 0; } /* Tries to do a type check using the cache. If the type is in the cache, then * result will be set to a true value and a true value will be returned. If it * is not in the cache and the cache is authoritative, then we know the answer * too; result is set to zero and a true value is returned. Otherwise, we can * not tell and a false value is returned and result is undefined. */ MVMint64 MVM_6model_try_cache_type_check(MVMThreadContext *tc, MVMObject *obj, MVMObject *type, MVMint32 *result) { if (!MVM_is_null(tc, obj)) { MVMuint16 i, elems = STABLE(obj)->type_check_cache_length; MVMObject **cache = STABLE(obj)->type_check_cache; if (cache) { for (i = 0; i < elems; i++) { if (cache[i] == type) { *result = 1; return 1; } } if ((STABLE(obj)->mode_flags & MVM_TYPE_CHECK_CACHE_THEN_METHOD) == 0 && (STABLE(type)->mode_flags & MVM_TYPE_CHECK_NEEDS_ACCEPTS) == 0) { *result = 0; return 1; } } } return 0; } /* Default invoke function on STables; for non-invokable objects */ void MVM_6model_invoke_default(MVMThreadContext *tc, MVMObject *invokee, MVMCallsite *callsite, MVMRegister *args) { MVM_exception_throw_adhoc(tc, "Cannot invoke this object (REPR: %s; %s)", REPR(invokee)->name, MVM_6model_get_debug_name(tc, invokee)); } /* Clean up STable memory. */ void MVM_6model_stable_gc_free(MVMThreadContext *tc, MVMSTable *st) { /* First have it free its repr_data if it wants. */ if (st->REPR->gc_free_repr_data) st->REPR->gc_free_repr_data(tc, st); /* free various storage. */ MVM_free(st->type_check_cache); if (st->container_spec && st->container_spec->gc_free_data) st->container_spec->gc_free_data(tc, st); MVM_free(st->invocation_spec); MVM_free(st->boolification_spec); MVM_free(st->debug_name); } /* Get the next type cache ID for a newly created STable. */ MVMuint64 MVM_6model_next_type_cache_id(MVMThreadContext *tc) { return (MVMuint64)MVM_add(&tc->instance->cur_type_cache_id, MVM_TYPE_CACHE_ID_INCR) + MVM_TYPE_CACHE_ID_INCR; } void MVM_6model_never_repossess(MVMThreadContext *tc, MVMObject *obj) { obj->header.flags |= MVM_CF_NEVER_REPOSSESS; } MoarVM-2018.03/src/6model/6model.h0000644000175000017510000007171113243117024016523 0ustar samanthasamantha/* Boolification mode flags. */ #define MVM_BOOL_MODE_CALL_METHOD 0 #define MVM_BOOL_MODE_UNBOX_INT 1 #define MVM_BOOL_MODE_UNBOX_NUM 2 #define MVM_BOOL_MODE_UNBOX_STR_NOT_EMPTY 3 #define MVM_BOOL_MODE_UNBOX_STR_NOT_EMPTY_OR_ZERO 4 #define MVM_BOOL_MODE_NOT_TYPE_OBJECT 5 #define MVM_BOOL_MODE_BIGINT 6 #define MVM_BOOL_MODE_ITER 7 #define MVM_BOOL_MODE_HAS_ELEMS 8 /* Controls the way that type checks are performed. By default, if there is * a type check cache we treat it as definitive. However, it's possible to * declare that in the case the type check cache has no entry we should fall * back to asking the .HOW.type_check method (set TYPE_CHECK_CACHE_THEN_METHOD). * While a normal type check asks a value if it supports another type, the * TYPE_CHECK_NEEDS_ACCEPTS flag results in a call to .accepts_type on the * HOW of the thing we're checking the value against, giving it a chance to * decide answer. These are set as the lower bits of mode_flags in MVMSTable. */ #define MVM_TYPE_CHECK_CACHE_DEFINITIVE 0 #define MVM_TYPE_CHECK_CACHE_THEN_METHOD 1 #define MVM_TYPE_CHECK_NEEDS_ACCEPTS 2 #define MVM_TYPE_CHECK_CACHE_FLAG_MASK 3 /* This STable mode flag is set if we consider the method cache authoritative. */ #define MVM_METHOD_CACHE_AUTHORITATIVE 4 /* This STable mode flag is set if the type needs finalization. */ #define MVM_FINALIZE_TYPE 8 /* This STable mode flag is set if the type is parametric (and so can be * parameterized). */ #define MVM_PARAMETRIC_TYPE 16 /* This STable mode flag is set if the type is a parameterization of some * parametric type. */ #define MVM_PARAMETERIZED_TYPE 32 /* HLL type roles. */ #define MVM_HLL_ROLE_NONE 0 #define MVM_HLL_ROLE_INT 1 #define MVM_HLL_ROLE_NUM 2 #define MVM_HLL_ROLE_STR 3 #define MVM_HLL_ROLE_ARRAY 4 #define MVM_HLL_ROLE_HASH 5 #define MVM_HLL_ROLE_CODE 6 /* Hint value to indicate the absence of an attribute lookup or method * dispatch hint. */ #define MVM_NO_HINT -1 /* This data structure describes what storage a given representation * needs if something of that representation is to be embedded in * another place. For any representation that expects to be used * as a kind of reference type, it will just want to be a pointer. * But for other things, they would prefer to be "inlined" into * the object. */ struct MVMStorageSpec { /* 0 if this is to be referenced, anything else otherwise. */ MVMuint16 inlineable; /* For things that want to be inlined, the number of bits of * storage they need and what kind of byte-boundary they want to * be aligned to. Ignored otherwise. */ MVMuint16 bits; MVMuint16 align; /* For things that are inlined, if they are just storage of a * primitive type and can unbox, this says what primitive type * that they unbox to. */ MVMuint16 boxed_primitive; /* The types that this one can box/unbox to. */ MVMuint16 can_box; /* For ints, whether it's an unsigned value. */ MVMuint8 is_unsigned; }; /* Inlined or not. */ #define MVM_STORAGE_SPEC_REFERENCE 0 #define MVM_STORAGE_SPEC_INLINED 1 /* Possible options for boxed primitives. */ #define MVM_STORAGE_SPEC_BP_NONE 0 #define MVM_STORAGE_SPEC_BP_INT 1 #define MVM_STORAGE_SPEC_BP_NUM 2 #define MVM_STORAGE_SPEC_BP_STR 3 /* can_box bit field values. */ #define MVM_STORAGE_SPEC_CAN_BOX_INT 1 #define MVM_STORAGE_SPEC_CAN_BOX_NUM 2 #define MVM_STORAGE_SPEC_CAN_BOX_STR 4 #define MVM_STORAGE_SPEC_CAN_BOX_MASK 7 /* Flags that may be set on any collectable. */ typedef enum { /* Is a type object (and thus not a concrete instance). */ MVM_CF_TYPE_OBJECT = 1, /* Is an STable. */ MVM_CF_STABLE = 2, /* Is a heap-promoted call frame. */ MVM_CF_FRAME = 4, /* Has already been seen once in GC nursery. */ MVM_CF_NURSERY_SEEN = 8, /* Has been promoted to the old generation. */ MVM_CF_SECOND_GEN = 16, /* Is shared - that is, more than one thread knows about it. */ MVM_CF_SHARED = 32, /* Has already been added to the gen2 aggregates pointing to nursery * objects list. */ MVM_CF_IN_GEN2_ROOT_LIST = 64, /* A full GC run has found this object to be live. */ MVM_CF_GEN2_LIVE = 128, /* This object in fromspace is live with a valid forwarder. */ /* TODO - should be possible to use the same bit for this and GEN2_LIVE. */ MVM_CF_FORWARDER_VALID = 256, /* Have we allocated memory to store a serialization index? */ MVM_CF_SERIALZATION_INDEX_ALLOCATED = 512, /* Have we arranged a persistent object ID for this object? */ MVM_CF_HAS_OBJECT_ID = 1024, /* Have we flagged this object as something we must never repossess? */ /* Note: if you're hunting for a flag, some day in the future when we * have used them all, this one is easy enough to eliminate by having the * tiny number of objects marked this way in a remembered set. */ MVM_CF_NEVER_REPOSSESS = 2048 } MVMCollectableFlags; #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX struct MVMSerializationIndex { MVMuint32 sc_idx; MVMuint32 idx; }; #endif /* Things that every GC-collectable entity has. These fall into two * categories: * * MVMObject - objects. Almost everything is one of these. * * MVMSTable - shared tables; one per (HOW, REPR) pairing. * Only the first can vary in size, and even then only if it's not a * type object. */ struct MVMCollectable { /* Put this union first, as these pointers/indexes are relatively "cold", whereas "flags" is accessed relatively frequently, as are the fields that follow in the structures into which MVMCollectable is embedded. Shrinking the size of the active part of the structure slightly increases the chance that it fits into the CPU's L1 cache, which is a "free" performance win. */ union { /* Forwarding pointer, for copying/compacting GC purposes. */ MVMCollectable *forwarder; /* Index of the serialization context this collectable lives in, if * any, and then location within that. */ #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX struct { MVMuint16 sc_idx; MVMuint16 idx; } sc; struct MVMSerializationIndex *sci; #else struct { MVMuint32 sc_idx; MVMuint32 idx; } sc; #endif /* Used to chain STables queued to be freed. */ MVMSTable *st; } sc_forward_u; /* Identifier of the thread that currently owns the object, if any. If the * object is unshared, then this is always the creating thread. If it is * shared then it's whoever currently holds the mutex on it, or 0 if there * is no held mutex. */ MVMuint32 owner; /* Collectable flags (see MVMCollectableFlags). */ MVMuint16 flags; /* Object size, in bytes. */ MVMuint16 size; }; #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX # define MVM_DIRECT_SC_IDX_SENTINEL 0xFFFF #else # define MVM_DIRECT_SC_IDX_SENTINEL ~0 #endif /* The common things every object has. * * NB - the assumption that MVMObject* can be safely cast into * MVMCollectable* is spread throughout the codebase, as well * as used directly in JIT. Thus, nothing may preceed the header! */ struct MVMObject { /* Commonalities that all collectable entities have. */ MVMCollectable header; /* The s-table for the object. */ MVMSTable *st; }; /* An dummy object, mostly used to compute the offset of the data part of * a 6model object. */ struct MVMObjectStooge { MVMObject common; void *data; }; /* This is used to identify an attribute for various types of cache. */ struct MVMAttributeIdentifier { MVMObject *class_handle; /* Class handle */ MVMString *attr_name; /* Name of the attribute. */ MVMint64 hint; /* Hint for use in static/gradual typing. */ }; /* How do we turn something of this type into a boolean? */ struct MVMBoolificationSpec { MVMObject *method; MVMuint32 mode; }; /* Constant for incrementing the type cache ID for new STables. This leaves * the lowest bits free for caches to attach flags (of note, the multi * dispatch cache). */ #define MVM_TYPE_CACHE_ID_INCR 256 /* S-table, representing a meta-object/representation pairing. Note that the * items are grouped in hope that it will pack decently and do decently in * terms of cache lines. */ struct MVMSTable { /* Commonalities that all collectable entities have. */ MVMCollectable header; /* The representation operation table. */ const MVMREPROps *REPR; /* Any data specific to this type that the REPR wants to keep. */ void *REPR_data; /* The size of an object of this type in bytes, including the * header. */ MVMuint32 size; /* The length of the type check cache. */ MVMuint16 type_check_cache_length; /* The type checking mode and method cache mode (see flags for this * above). */ MVMuint16 mode_flags; /* Array of type objects. If this is set, then it is expected to contain * the type objects of all types that this type is equivalent to (e.g. * all the things it isa and all the things it does). */ MVMObject **type_check_cache; /* By-name method dispatch cache. */ MVMObject *method_cache; /* An ID solely for use in caches that last a VM instance. Thus it * should never, ever be serialized and you should NEVER make a * type directory based upon this ID. Otherwise you'll create memory * leaks for anonymous types, and other such screwups. */ MVMuint64 type_cache_id; /* If this is a container, then this contains information needed in * order to fetch the value in it. If not, it'll be null, which can * be taken as a "not a container" indication. */ const MVMContainerSpec *container_spec; /* Data that the container spec may need to function. */ /* Any data specific to this type that the REPR wants to keep. */ void *container_data; /* Information - if any - about how we can turn something of this type * into a boolean. */ MVMBoolificationSpec *boolification_spec; /* The HLL that this type is owned by, if any. */ MVMHLLConfig *hll_owner; /* The role that the type plays in the HLL, if any. */ MVMint64 hll_role; /* Invocation handler. If something tries to invoke this object, * whatever hangs off this function pointer gets invoked to handle * the invocation. If it's a call into C code it may do stuff right * off the bat. However, normally it will do whatever is needed to * arrange for setting up a callframe, twiddle the interpreter's * PC as needed and return. */ void (*invoke) (MVMThreadContext *tc, MVMObject *invokee, MVMCallsite *callsite, MVMRegister *args); /* * If this is invokable, then this contains information needed to * figure out how to invoke it. If not, it'll be null. */ MVMInvocationSpec *invocation_spec; /* The type-object. */ MVMObject *WHAT; /* The underlying package stash. */ MVMObject *WHO; /* The meta-object. */ MVMObject *HOW; /* Parametricity. Mode flags indicate what, if any, of this union is valid. */ union { struct { /* The code object to use to produce a new parameterization. */ MVMObject *parameterizer; /* Lookup table of existing parameterizations. For now, just a VM * array with alternating pairs of [arg array], object. Could in * the future we something lower level or hashy; we've yet to see * how hot-path lookups end up being in reality. */ MVMObject *lookup; } ric; struct { /* The type that we are a parameterization of. */ MVMObject *parametric_type; /* Our type parameters. */ MVMObject *parameters; } erized; } paramet; /* We lazily deserialize HOW; this is the SC and index if needed. */ MVMSerializationContext *HOW_sc; MVMuint32 HOW_idx; /* Also info we need to lazily deserialize the method cache. */ MVMuint32 method_cache_offset; MVMSerializationContext *method_cache_sc; /* A string associated with this STable for debugging purposes. * Usually the name of the class this belongs to. */ char *debug_name; /* If this STable is currently in the process of being repossessed. Used * to trigger clearup of memory pre-repossession. */ MVMuint8 being_repossessed; }; /* The representation operations table. Note that representations are not * classes - there's no inheritance, so there's no polymorphism. If you know * a representation statically, you can statically dereference the call to * the representation op in question. In the dynamic case, you have to go * following the pointer, however. */ struct MVMREPROps_Attribute { /* Gets the current value for an attribute and places it in the passed * location (specified as a register). Expects to be passed a kind flag * that matches the kind of the attribute that is being fetched. */ void (*get_attribute) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister *result, MVMuint16 kind); /* Binds the given object or value to the specified attribute. The * kind flag specifies the type of value being passed to be bound.*/ void (*bind_attribute) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister value, MVMuint16 kind); /* Gets the hint for the given attribute ID. */ MVMint64 (*hint_for) (MVMThreadContext *tc, MVMSTable *st, MVMObject *class_handle, MVMString *name); /* Checks if an attribute has been initialized. */ MVMint64 (*is_attribute_initialized) (MVMThreadContext *tc, MVMSTable *st, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint); /* Provided the attribute is a native integer of the architecture's atomic * size, returns an AO_t * referencing it. This is only valid until the * next safepoint. If rebless is called on the object, updates may be lost * although memory safety must not be violated. */ AO_t * (*attribute_as_atomic) (MVMThreadContext *tc, MVMSTable *st, void *data, MVMObject *class_handle, MVMString *name); }; struct MVMREPROps_Boxing { /* Used with boxing. Sets an integer value, for representations that * can hold one. */ void (*set_int) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 value); /* Used with boxing. Gets an integer value, for representations that * can hold one. */ MVMint64 (*get_int) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data); /* Used with boxing. Sets a floating point value, for representations that * can hold one. */ void (*set_num) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMnum64 value); /* Used with boxing. Gets a floating point value, for representations that * can hold one. */ MVMnum64 (*get_num) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data); /* Used with boxing. Sets a string value, for representations that * can hold one. */ void (*set_str) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMString *value); /* Used with boxing. Gets a string value, for representations that * can hold one. */ MVMString * (*get_str) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data); /* Used with boxing. Sets an unsinged integer value, for representations * that can hold one. */ void (*set_uint) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMuint64 value); /* Used with boxing. Gets an unsigned integer value, for representations * that can hold one. */ MVMuint64 (*get_uint) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data); /* Some objects serve primarily as boxes of others, inlining them. This gets * gets the reference to such things, using the representation ID to distinguish * them. */ void * (*get_boxed_ref) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMuint32 repr_id); }; struct MVMREPROps_Positional { /* Gets the element and the specified index and places it in the passed * location (specified as a register). Expects to be passed a kind flag * that matches the kind of the attribute that is being fetched. */ void (*at_pos) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister *result, MVMuint16 kind); /* Binds the given object or value to the specified index. The * kind flag specifies the type of value being passed to be bound.*/ void (*bind_pos) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister value, MVMuint16 kind); /* Sets the element count of the array, expanding or shrinking * it as needed. */ void (*set_elems) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMuint64 count); /* Pushes the specified value onto the array. */ void (*push) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister value, MVMuint16 kind); /* Pops the value at the end of the array off it. */ void (*pop) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind); /* Unshifts the value onto the array. */ void (*unshift) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister value, MVMuint16 kind); /* Gets the value at the start of the array, and moves the starting point of * the array so that the next element is element zero. */ void (*shift) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind); /* Splices the specified array into this one. Representations may optimize if * they know the type of the passed array, otherwise they should use the REPR * API. */ void (*splice) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *target_array, MVMint64 offset, MVMuint64 elems); /* Multi-dimensional array read. */ void (*at_pos_multidim) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_indices, MVMint64 *indices, MVMRegister *result, MVMuint16 kind); /* Multi-dimensional array write. */ void (*bind_pos_multidim) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_indices, MVMint64 *indices, MVMRegister value, MVMuint16 kind); /* Gets the number of dimensions along with a C-level array of them. The * second two parameters are "out"s. The caller must not mutate dimensions, * nor persist it such that it lasts longer than the next VM safepoint. */ void (*dimensions) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 *num_dimensions, MVMint64 **dimensions); /* Sets the number of dimensions. The caller is responsible for freeing * the array passed in dimensions. */ void (*set_dimensions) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_dimensions, MVMint64 *dimensions); /* Gets the STable representing the declared element type. */ MVMStorageSpec (*get_elem_storage_spec) (MVMThreadContext *tc, MVMSTable *st); /* Provided the array consists of integers of the architecture's atomic * size, gets an AO_t * pointing to that element and valid until the next * safepoint. */ AO_t * (*pos_as_atomic) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index); /* Multi-dim version of as_atomic. */ AO_t * (*pos_as_atomic_multidim) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_indices, MVMint64 *indices); }; struct MVMREPROps_Associative { /* Gets the value at the specified key and places it in the passed * location (specified as a register). Expects to be passed a kind flag * that matches the kind of the attribute that is being fetched. */ void (*at_key) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key, MVMRegister *result, MVMuint16 kind); /* Binds the object at the specified address into the hash at the specified * key. */ void (*bind_key) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key, MVMRegister value, MVMuint16 kind); /* Returns a true value of the key exists, and a false one if not. */ MVMint64 (*exists_key) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key); /* Deletes the specified key. */ void (*delete_key) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key); /* Gets the storage spec of the hash value type. */ MVMStorageSpec (*get_value_storage_spec) (MVMThreadContext *tc, MVMSTable *st); }; struct MVMREPROps { /* Creates a new type object of this representation, and * associates it with the given HOW. Also sets up a new * representation instance if needed. */ MVMObject * (*type_object_for) (MVMThreadContext *tc, MVMObject *HOW); /* Allocates a new, but uninitialized object, based on the * specified s-table. */ MVMObject * (*allocate) (MVMThreadContext *tc, MVMSTable *st); /* Used to initialize the body of an object representing the type * describe by the specified s-table. DATA points to the body. It * may recursively call initialize for any flattened objects. */ void (*initialize) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data); /* For the given type, copies the object data from the source memory * location to the destination one. Note that it may actually be more * involved than a straightforward bit of copying; what's important is * that the representation knows about that. Note that it may have to * call copy_to recursively on representations of any flattened objects * within its body. */ void (*copy_to) (MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest); /* Attribute access REPR function table. */ MVMREPROps_Attribute attr_funcs; /* Boxing REPR function table. */ MVMREPROps_Boxing box_funcs; /* Positional indexing REPR function table. */ MVMREPROps_Positional pos_funcs; /* Associative indexing REPR function table. */ MVMREPROps_Associative ass_funcs; /* Gets the number of elements, for any aggregate types. */ MVMuint64 (*elems) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data); /* Gets the storage specification for this representation. */ const MVMStorageSpec * (*get_storage_spec) (MVMThreadContext *tc, MVMSTable *st); /* Handles an object changing its type. The representation is responsible * for doing any changes to the underlying data structure, and may reject * changes that it's not willing to do (for example, a representation may * choose to only handle switching to a subclass). It is also left to update * the S-Table pointer as needed; while in theory this could be factored * out, the representation probably knows more about timing issues and * thread safety requirements. */ void (*change_type) (MVMThreadContext *tc, MVMObject *object, MVMObject *new_type); /* Object serialization. Writes the object's body out using the passed * serialization writer. */ void (*serialize) (MVMThreadContext *tc, MVMSTable *st, void *data, MVMSerializationWriter *writer); /* Object deserialization. Reads the object's body in using the passed * serialization reader. */ void (*deserialize) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMSerializationReader *reader); /* REPR data serialization. Serializes the per-type representation data that * is attached to the supplied STable. */ void (*serialize_repr_data) (MVMThreadContext *tc, MVMSTable *st, MVMSerializationWriter *writer); /* REPR data deserialization. Deserializes the per-type representation data and * attaches it to the supplied STable. */ void (*deserialize_repr_data) (MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader); /* Deserialization of STable size. */ void (*deserialize_stable_size) (MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader); /* MoarVM-specific REPR API addition used to mark an object. This involves * adding all pointers it contains to the worklist. */ void (*gc_mark) (MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist); /* MoarVM-specific REPR API addition used to free an object. */ void (*gc_free) (MVMThreadContext *tc, MVMObject *object); /* This is called to do any cleanup of resources when an object gets * embedded inside another one. Never called on a top-level object. */ void (*gc_cleanup) (MVMThreadContext *tc, MVMSTable *st, void *data); /* MoarVM-specific REPR API addition used to mark a REPR instance. */ void (*gc_mark_repr_data) (MVMThreadContext *tc, MVMSTable *st, MVMGCWorklist *worklist); /* MoarVM-specific REPR API addition used to free a REPR instance. */ void (*gc_free_repr_data) (MVMThreadContext *tc, MVMSTable *st); /* Causes the representation to be composed. Composition involves * passing the representation information that it needs in order * to compute memory layout. */ void (*compose) (MVMThreadContext *tc, MVMSTable *st, MVMObject *info); /* Allows the REPR to produce specialized bytecode versions of various * instructions, when we know some of the types involved. */ void (*spesh) (MVMThreadContext *tc, MVMSTable *st, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins); /* The representation's name. */ const char *name; /* The representation's ID. */ MVMuint32 ID; /* Optional API, for representations that allocate additonal memory and * want to report its size for debugging purposes. */ MVMuint64 (*unmanaged_size) (MVMThreadContext *tc, MVMSTable *st, void *data); /* Optional API to describe references to other Collectables either by * index or by name, i.E. names of attributes or lexicals. */ void (*describe_refs) (MVMThreadContext *tc, MVMHeapSnapshotState *ss, MVMSTable *st, void *data); }; /* Various handy macros for getting at important stuff. */ #define STABLE(o) (((MVMObject *)(o))->st) #define REPR(o) (STABLE((o))->REPR) #define OBJECT_BODY(o) (&(((MVMObjectStooge *)(o))->data)) /* Macros for getting/setting type-objectness. */ #define IS_CONCRETE(o) (!(((MVMObject *)o)->header.flags & MVM_CF_TYPE_OBJECT)) /* Some functions related to 6model core functionality. */ MVM_PUBLIC MVMObject * MVM_6model_get_how(MVMThreadContext *tc, MVMSTable *st); MVM_PUBLIC MVMObject * MVM_6model_get_how_obj(MVMThreadContext *tc, MVMObject *obj); void MVM_6model_find_method(MVMThreadContext *tc, MVMObject *obj, MVMString *name, MVMRegister *res, MVMint64 throw_if_not_found); MVM_PUBLIC MVMObject * MVM_6model_find_method_cache_only(MVMThreadContext *tc, MVMObject *obj, MVMString *name); MVMint32 MVM_6model_find_method_spesh(MVMThreadContext *tc, MVMObject *obj, MVMString *name, MVMint32 ss_idx, MVMRegister *res); MVMint64 MVM_6model_can_method_cache_only(MVMThreadContext *tc, MVMObject *obj, MVMString *name); void MVM_6model_can_method(MVMThreadContext *tc, MVMObject *obj, MVMString *name, MVMRegister *res); void MVM_6model_istype(MVMThreadContext *tc, MVMObject *obj, MVMObject *type, MVMRegister *res); MVM_PUBLIC MVMint64 MVM_6model_istype_cache_only(MVMThreadContext *tc, MVMObject *obj, MVMObject *type); MVMint64 MVM_6model_try_cache_type_check(MVMThreadContext *tc, MVMObject *obj, MVMObject *type, MVMint32 *result); void MVM_6model_invoke_default(MVMThreadContext *tc, MVMObject *invokee, MVMCallsite *callsite, MVMRegister *args); void MVM_6model_stable_gc_free(MVMThreadContext *tc, MVMSTable *st); MVMuint64 MVM_6model_next_type_cache_id(MVMThreadContext *tc); void MVM_6model_never_repossess(MVMThreadContext *tc, MVMObject *obj); MVM_STATIC_INLINE char *MVM_6model_get_debug_name(MVMThreadContext *tc, MVMObject *obj) { return STABLE(obj)->debug_name ? STABLE(obj)->debug_name : ""; } MVM_STATIC_INLINE char *MVM_6model_get_stable_debug_name(MVMThreadContext *tc, MVMSTable *stable) { return stable->debug_name ? stable->debug_name : ""; } MoarVM-2018.03/src/6model/README.md0000644000175000017510000000226713237701112016443 0ustar samanthasamantha## 6model A great introduction to the 6model system is available here: http://jnthn.net/papers/2013-yapceu-moarvm.pdf Here are some highlights from the text on those slides: 6model provides primitives for building an object system. Every object in MoarVM is a 6model object - one object system for the whole VM. By object, we mean what you think of as objects (Arrays, Hashes, Boxed integers, floats, etc., Threads, handles)... ### Inside 6model An object has a header - STable, Flags, owner, slots for GC stuff... Which points to an STable (Shared Table, representing a type). It contains the HOW (Meta-object), REPR, WHAT (type object), WHO (stash), Method cache, and Type check cache..., which are objects important to the type. Which has a "representation" (REPR) that manages the object's body. ### Representations All about the use of memory by an object REPR API has a common part (allocation, GC marking) along with several sub-protocols for different ways of using memory: Attributes Boxing Positional Associative Representations are orthogonal to type (and thus disinterested in method dispatch, type check, etc.) and also non-virtual (if you know the REPR, can inline stuff). MoarVM-2018.03/src/6model/bootstrap.c0000644000175000017510000010203513252330426017342 0ustar samanthasamantha#include "moar.h" /* This file implements the various steps involved in getting 6model * bootstrapped from the ground up - that is, getting to having a * KnowHOW meta-object type so that userland can start building up * more interesting meta-objects. Mostly it just has to make objects * with some "holes", and later go back and fill them out. This is * due to the circular nature of things. */ /* Creates a stub VMString. Note we didn't initialize the * representation yet, so have to do this somewhat pokily. */ static void create_stub_VMString(MVMThreadContext *tc) { /* Need to create the REPR function table "in advance". */ const MVMREPROps *repr = MVMString_initialize(tc); /* Now we can create a type object; note we have no HOW yet, * though. */ tc->instance->VMString = repr->type_object_for(tc, NULL); } /* KnowHOW.new_type method. Creates a new type with this HOW as its meta-object. */ static void new_type(MVMThreadContext *tc, MVMCallsite *callsite, MVMRegister *args) { MVMObject *self, *HOW, *type_object, *BOOTHash, *stash; MVMArgInfo repr_arg, name_arg; MVMString *repr_name, *name; const MVMREPROps *repr_to_use; MVMInstance *instance = tc->instance; /* Get arguments. */ MVMArgProcContext arg_ctx; MVM_args_proc_init(tc, &arg_ctx, callsite, args); MVM_args_checkarity(tc, &arg_ctx, 1, 1); self = MVM_args_get_required_pos_obj(tc, &arg_ctx, 0); repr_arg = MVM_args_get_named_str(tc, &arg_ctx, instance->str_consts.repr, MVM_ARG_OPTIONAL); name_arg = MVM_args_get_named_str(tc, &arg_ctx, instance->str_consts.name, MVM_ARG_OPTIONAL); MVM_args_proc_cleanup(tc, &arg_ctx); if (REPR(self)->ID != MVM_REPR_ID_KnowHOWREPR) MVM_exception_throw_adhoc(tc, "KnowHOW methods must be called on object with REPR KnowHOWREPR"); /* See if we have a representation name; if not default to P6opaque. */ repr_name = repr_arg.exists ? repr_arg.arg.s : instance->str_consts.P6opaque; repr_to_use = MVM_repr_get_by_name(tc, repr_name); MVM_gc_root_temp_push(tc, (MVMCollectable **)&name_arg); /* We first create a new HOW instance. */ HOW = REPR(self)->allocate(tc, STABLE(self)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&HOW); /* Create a new type object of the desired REPR. (Note that we can't * default to KnowHOWREPR here, since it doesn't know how to actually * store attributes, it's just for bootstrapping knowhow's. */ type_object = repr_to_use->type_object_for(tc, HOW); MVM_gc_root_temp_push(tc, (MVMCollectable **)&type_object); /* This may move name_arg.arg.s so do it first: */ REPR(HOW)->initialize(tc, STABLE(HOW), HOW, OBJECT_BODY(HOW)); /* See if we were given a name; put it into the meta-object if so. */ name = name_arg.exists ? name_arg.arg.s : instance->str_consts.anon; MVM_ASSIGN_REF(tc, &(HOW->header), ((MVMKnowHOWREPR *)HOW)->body.name, name); type_object->st->debug_name = MVM_string_utf8_encode_C_string(tc, name); /* Set .WHO to an empty hash. */ BOOTHash = tc->instance->boot_types.BOOTHash; stash = REPR(BOOTHash)->allocate(tc, STABLE(BOOTHash)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&stash); MVM_ASSIGN_REF(tc, &(STABLE(type_object)->header), STABLE(type_object)->WHO, stash); /* Return the type object. */ MVM_args_set_result_obj(tc, type_object, MVM_RETURN_CURRENT_FRAME); MVM_gc_root_temp_pop_n(tc, 4); } /* Adds a method. */ static void add_method(MVMThreadContext *tc, MVMCallsite *callsite, MVMRegister *args) { MVMObject *self, *method, *method_table; MVMString *name; /* Get arguments. */ MVMArgProcContext arg_ctx; MVM_args_proc_init(tc, &arg_ctx, callsite, args); MVM_args_checkarity(tc, &arg_ctx, 4, 4); self = MVM_args_get_required_pos_obj(tc, &arg_ctx, 0); name = MVM_args_get_required_pos_str(tc, &arg_ctx, 2); method = MVM_args_get_required_pos_obj(tc, &arg_ctx, 3); MVM_args_proc_cleanup(tc, &arg_ctx); if (!self || !IS_CONCRETE(self) || REPR(self)->ID != MVM_REPR_ID_KnowHOWREPR) MVM_exception_throw_adhoc(tc, "KnowHOW methods must be called on object instance with REPR KnowHOWREPR"); /* Add to method table. */ method_table = ((MVMKnowHOWREPR *)self)->body.methods; MVM_repr_bind_key_o(tc, method_table, name, method); /* Return added method as result. */ MVM_args_set_result_obj(tc, method, MVM_RETURN_CURRENT_FRAME); } /* Adds an method. */ static void add_attribute(MVMThreadContext *tc, MVMCallsite *callsite, MVMRegister *args) { MVMObject *self, *attr, *attributes; /* Get arguments. */ MVMArgProcContext arg_ctx; MVM_args_proc_init(tc, &arg_ctx, callsite, args); MVM_args_checkarity(tc, &arg_ctx, 3, 3); self = MVM_args_get_required_pos_obj(tc, &arg_ctx, 0); attr = MVM_args_get_required_pos_obj(tc, &arg_ctx, 2); MVM_args_proc_cleanup(tc, &arg_ctx); /* Ensure we have the required representations. */ if (!self || !IS_CONCRETE(self) || REPR(self)->ID != MVM_REPR_ID_KnowHOWREPR) MVM_exception_throw_adhoc(tc, "KnowHOW methods must be called on object instance with REPR KnowHOWREPR"); if (REPR(attr)->ID != MVM_REPR_ID_KnowHOWAttributeREPR) MVM_exception_throw_adhoc(tc, "KnowHOW attributes must use KnowHOWAttributeREPR"); /* Add to method table. */ attributes = ((MVMKnowHOWREPR *)self)->body.attributes; MVM_repr_push_o(tc, attributes, attr); /* Return added attribute as result. */ MVM_args_set_result_obj(tc, attr, MVM_RETURN_CURRENT_FRAME); } /* Composes the meta-object. */ static void compose(MVMThreadContext *tc, MVMCallsite *callsite, MVMRegister *args) { MVMObject *self, *type_obj, *method_table, *attributes, *BOOTArray, *BOOTHash, *repr_info_hash, *repr_info, *type_info, *attr_info_list, *parent_info; MVMuint64 num_attrs, i; MVMInstance *instance = tc->instance; /* Get arguments. */ MVMArgProcContext arg_ctx; MVM_args_proc_init(tc, &arg_ctx, callsite, args); MVM_args_checkarity(tc, &arg_ctx, 2, 2); self = MVM_args_get_required_pos_obj(tc, &arg_ctx, 0); type_obj = MVM_args_get_required_pos_obj(tc, &arg_ctx, 1); MVM_args_proc_cleanup(tc, &arg_ctx); if (!self || !IS_CONCRETE(self) || REPR(self)->ID != MVM_REPR_ID_KnowHOWREPR) MVM_exception_throw_adhoc(tc, "KnowHOW methods must be called on object instance with REPR KnowHOWREPR"); /* Fill out STable. */ method_table = ((MVMKnowHOWREPR *)self)->body.methods; MVM_ASSIGN_REF(tc, &(STABLE(type_obj)->header), STABLE(type_obj)->method_cache, method_table); STABLE(type_obj)->mode_flags = MVM_METHOD_CACHE_AUTHORITATIVE; STABLE(type_obj)->type_check_cache_length = 1; STABLE(type_obj)->type_check_cache = MVM_malloc(sizeof(MVMObject *)); MVM_ASSIGN_REF(tc, &(STABLE(type_obj)->header), STABLE(type_obj)->type_check_cache[0], type_obj); attributes = ((MVMKnowHOWREPR *)self)->body.attributes; /* Next steps will allocate, so make sure we keep hold of the type * object and ourself. */ MVM_gc_root_temp_push(tc, (MVMCollectable **)&attributes); MVM_gc_root_temp_push(tc, (MVMCollectable **)&type_obj); /* Use any attribute information to produce attribute protocol * data. The protocol consists of an array... */ BOOTArray = instance->boot_types.BOOTArray; BOOTHash = instance->boot_types.BOOTHash; MVM_gc_root_temp_push(tc, (MVMCollectable **)&BOOTArray); MVM_gc_root_temp_push(tc, (MVMCollectable **)&BOOTHash); repr_info = REPR(BOOTArray)->allocate(tc, STABLE(BOOTArray)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&repr_info); /* ...which contains an array per MRO entry (just us)... */ type_info = REPR(BOOTArray)->allocate(tc, STABLE(BOOTArray)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&type_info); MVM_repr_push_o(tc, repr_info, type_info); /* ...which in turn contains this type... */ MVM_repr_push_o(tc, type_info, type_obj); /* ...then an array of hashes per attribute... */ attr_info_list = REPR(BOOTArray)->allocate(tc, STABLE(BOOTArray)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&attr_info_list); MVM_repr_push_o(tc, type_info, attr_info_list); num_attrs = REPR(attributes)->elems(tc, STABLE(attributes), attributes, OBJECT_BODY(attributes)); for (i = 0; i < num_attrs; i++) { MVMObject *attr_info = REPR(BOOTHash)->allocate(tc, STABLE(BOOTHash)); MVMKnowHOWAttributeREPR *attribute = (MVMKnowHOWAttributeREPR *) MVM_repr_at_pos_o(tc, attributes, i); MVMROOT2(tc, attr_info, attribute, { if (REPR((MVMObject *)attribute)->ID != MVM_REPR_ID_KnowHOWAttributeREPR) MVM_exception_throw_adhoc(tc, "KnowHOW attributes must use KnowHOWAttributeREPR"); MVM_repr_init(tc, attr_info); MVM_repr_bind_key_o(tc, attr_info, instance->str_consts.name, (MVMObject *)attribute->body.name); MVM_repr_bind_key_o(tc, attr_info, instance->str_consts.type, attribute->body.type); if (attribute->body.box_target) { /* Merely having the key serves as a "yes". */ MVM_repr_bind_key_o(tc, attr_info, instance->str_consts.box_target, attr_info); } MVM_repr_push_o(tc, attr_info_list, attr_info); }); } /* ...followed by a list of parents (none). */ parent_info = REPR(BOOTArray)->allocate(tc, STABLE(BOOTArray)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&parent_info); MVM_repr_init(tc, parent_info); MVM_repr_push_o(tc, type_info, parent_info); /* Finally, this all goes in a hash under the key 'attribute'. */ repr_info_hash = REPR(BOOTHash)->allocate(tc, STABLE(BOOTHash)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&repr_info_hash); MVM_repr_init(tc, repr_info_hash); MVM_repr_bind_key_o(tc, repr_info_hash, instance->str_consts.attribute, repr_info); /* Compose the representation using it. */ MVM_repr_compose(tc, type_obj, repr_info_hash); /* Clear temporary roots. */ MVM_gc_root_temp_pop_n(tc, 9); /* Return type object. */ MVM_args_set_result_obj(tc, type_obj, MVM_RETURN_CURRENT_FRAME); } #define introspect_member(member, set_result, result) \ static void member(MVMThreadContext *tc, MVMCallsite *callsite, MVMRegister *args) { \ MVMObject *self, *type_obj, *member; \ MVMArgProcContext arg_ctx; \ MVM_args_proc_init(tc, &arg_ctx, callsite, args); \ MVM_args_checkarity(tc, &arg_ctx, 2, 2); \ self = MVM_args_get_required_pos_obj(tc, &arg_ctx, 0); \ type_obj = MVM_args_get_required_pos_obj(tc, &arg_ctx, 1); \ MVM_args_proc_cleanup(tc, &arg_ctx); \ if (!self || !IS_CONCRETE(self) || REPR(self)->ID != MVM_REPR_ID_KnowHOWREPR) \ MVM_exception_throw_adhoc(tc, "KnowHOW methods must be called on object instance with REPR KnowHOWREPR"); \ member = (MVMObject *)((MVMKnowHOWREPR *)self)->body.member; \ set_result(tc, result, MVM_RETURN_CURRENT_FRAME); \ } /* Introspects the attributes. For now just hand back real list. */ introspect_member(attributes, MVM_args_set_result_obj, attributes) /* Introspects the methods. */ introspect_member(methods, MVM_args_set_result_obj, methods) /* Introspects the name. */ introspect_member(name, MVM_args_set_result_str, (MVMString *)name) /* Adds a method into the KnowHOW.HOW method table. */ static void add_knowhow_how_method(MVMThreadContext *tc, MVMKnowHOWREPR *knowhow_how, char *name, void (*func) (MVMThreadContext *, MVMCallsite *, MVMRegister *)) { MVMObject *BOOTCCode, *code_obj, *method_table; MVMString *name_str; /* Create string for name. */ name_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, name); /* Allocate a BOOTCCode and put pointer in. */ BOOTCCode = tc->instance->boot_types.BOOTCCode; code_obj = REPR(BOOTCCode)->allocate(tc, STABLE(BOOTCCode)); ((MVMCFunction *)code_obj)->body.func = func; /* Add into the table. */ method_table = knowhow_how->body.methods; MVM_repr_bind_key_o(tc, method_table, name_str, code_obj); } /* Bootstraps the KnowHOW type. */ static void bootstrap_KnowHOW(MVMThreadContext *tc) { MVMObject *VMString = tc->instance->VMString; /* Create our KnowHOW type object. Note we don't have a HOW just yet, so * pass in NULL. */ const MVMREPROps *REPR = MVM_repr_get_by_id(tc, MVM_REPR_ID_KnowHOWREPR); MVMObject *knowhow = REPR->type_object_for(tc, NULL); /* We create a KnowHOW instance that can describe itself. This means * (once we tie the knot) that .HOW.HOW.HOW.HOW etc will always return * that, which closes the model up. Note that the STable for it must * be allocated first, since that holds the allocation size. */ MVMKnowHOWREPR *knowhow_how; MVMSTable *st = MVM_gc_allocate_stable(tc, REPR, NULL); st->WHAT = (MVMObject *)knowhow; st->size = sizeof(MVMKnowHOWREPR); knowhow_how = (MVMKnowHOWREPR *)REPR->allocate(tc, st); st->HOW = (MVMObject *)knowhow_how; knowhow_how->common.st = st; /* Add various methods to the KnowHOW's HOW. */ REPR->initialize(tc, NULL, (MVMObject *)knowhow_how, &knowhow_how->body); add_knowhow_how_method(tc, knowhow_how, "new_type", new_type); add_knowhow_how_method(tc, knowhow_how, "add_method", add_method); add_knowhow_how_method(tc, knowhow_how, "add_attribute", add_attribute); add_knowhow_how_method(tc, knowhow_how, "compose", compose); add_knowhow_how_method(tc, knowhow_how, "attributes", attributes); add_knowhow_how_method(tc, knowhow_how, "methods", methods); add_knowhow_how_method(tc, knowhow_how, "name", name); /* Set name KnowHOW for the KnowHOW's HOW. */ knowhow_how->body.name = MVM_string_ascii_decode_nt(tc, VMString, "KnowHOW"); /* Set this built up HOW as the KnowHOW's HOW. */ STABLE(knowhow)->HOW = (MVMObject *)knowhow_how; /* Give it an authoritative method cache; this in turn will make the * method dispatch bottom out. */ STABLE(knowhow)->method_cache = knowhow_how->body.methods; STABLE(knowhow)->mode_flags = MVM_METHOD_CACHE_AUTHORITATIVE; STABLE(knowhow_how)->method_cache = knowhow_how->body.methods; STABLE(knowhow_how)->mode_flags = MVM_METHOD_CACHE_AUTHORITATIVE; /* Stash the created KnowHOW. */ tc->instance->KnowHOW = (MVMObject *)knowhow; MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&tc->instance->KnowHOW, "KnowHOW"); } /* Takes a stub object that existed before we had bootstrapped things and * gives it a meta-object. */ static void add_meta_object(MVMThreadContext *tc, MVMObject *type_obj, char *name) { MVMObject *meta_obj; MVMString *name_str; /* Create meta-object. */ meta_obj = MVM_repr_alloc_init(tc, STABLE(tc->instance->KnowHOW)->HOW); MVMROOT(tc, meta_obj, { /* Put it in place. */ MVM_ASSIGN_REF(tc, &(STABLE(type_obj)->header), STABLE(type_obj)->HOW, meta_obj); /* Set name. */ name_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, name); MVM_ASSIGN_REF(tc, &(meta_obj->header), ((MVMKnowHOWREPR *)meta_obj)->body.name, name_str); type_obj->st->debug_name = strdup(name); }); } /* Creates a new attribute meta-object. */ static void attr_new(MVMThreadContext *tc, MVMCallsite *callsite, MVMRegister *args) { MVMObject *self, *obj; MVMArgInfo type_arg, name_arg, bt_arg; const MVMREPROps *repr; MVMInstance *instance = tc->instance; /* Process arguments. */ MVMArgProcContext arg_ctx; MVM_args_proc_init(tc, &arg_ctx, callsite, args); MVM_args_checkarity(tc, &arg_ctx, 1, 1); self = MVM_args_get_required_pos_obj(tc, &arg_ctx, 0); name_arg = MVM_args_get_named_str(tc, &arg_ctx, instance->str_consts.name, MVM_ARG_REQUIRED); type_arg = MVM_args_get_named_obj(tc, &arg_ctx, instance->str_consts.type, MVM_ARG_OPTIONAL); bt_arg = MVM_args_get_named_int(tc, &arg_ctx, instance->str_consts.box_target, MVM_ARG_OPTIONAL); MVM_args_proc_cleanup(tc, &arg_ctx); /* Anchor all the things. */ MVM_gc_root_temp_push(tc, (MVMCollectable **)&name_arg); MVM_gc_root_temp_push(tc, (MVMCollectable **)&type_arg); /* Allocate attribute object. */ repr = MVM_repr_get_by_id(tc, MVM_REPR_ID_KnowHOWAttributeREPR); obj = repr->allocate(tc, STABLE(self)); /* Populate it. */ MVM_ASSIGN_REF(tc, &(obj->header), ((MVMKnowHOWAttributeREPR *)obj)->body.name, name_arg.arg.s); MVM_ASSIGN_REF(tc, &(obj->header), ((MVMKnowHOWAttributeREPR *)obj)->body.type, type_arg.exists ? type_arg.arg.o : tc->instance->KnowHOW); ((MVMKnowHOWAttributeREPR *)obj)->body.box_target = bt_arg.exists ? bt_arg.arg.i64 : 0; /* Return produced object. */ MVM_gc_root_temp_pop_n(tc, 2); MVM_args_set_result_obj(tc, obj, MVM_RETURN_CURRENT_FRAME); } /* Composes the attribute; actually, nothing to do really. */ static void attr_compose(MVMThreadContext *tc, MVMCallsite *callsite, MVMRegister *args) { MVMObject *self; MVMArgProcContext arg_ctx; MVM_args_proc_init(tc, &arg_ctx, callsite, args); MVM_args_checkarity(tc, &arg_ctx, 1, 1); self = MVM_args_get_required_pos_obj(tc, &arg_ctx, 0); MVM_args_proc_cleanup(tc, &arg_ctx); MVM_args_set_result_obj(tc, self, MVM_RETURN_CURRENT_FRAME); } /* Introspects the attribute's name. */ static void attr_name(MVMThreadContext *tc, MVMCallsite *callsite, MVMRegister *args) { MVMObject *self; MVMString *name; MVMArgProcContext arg_ctx; MVM_args_proc_init(tc, &arg_ctx, callsite, args); MVM_args_checkarity(tc, &arg_ctx, 1, 1); self = MVM_args_get_required_pos_obj(tc, &arg_ctx, 0); MVM_args_proc_cleanup(tc, &arg_ctx); name = ((MVMKnowHOWAttributeREPR *)self)->body.name; MVM_args_set_result_str(tc, name, MVM_RETURN_CURRENT_FRAME); } /* Introspects the attribute's type. */ static void attr_type(MVMThreadContext *tc, MVMCallsite *callsite, MVMRegister *args) { MVMObject *self, *type; MVMArgProcContext arg_ctx; MVM_args_proc_init(tc, &arg_ctx, callsite, args); MVM_args_checkarity(tc, &arg_ctx, 1, 1); self = MVM_args_get_required_pos_obj(tc, &arg_ctx, 0); MVM_args_proc_cleanup(tc, &arg_ctx); type = ((MVMKnowHOWAttributeREPR *)self)->body.type; MVM_args_set_result_obj(tc, type, MVM_RETURN_CURRENT_FRAME); } /* Introspects the attribute's box target flag. */ static void attr_box_target(MVMThreadContext *tc, MVMCallsite *callsite, MVMRegister *args) { MVMObject *self; MVMint64 box_target; MVMArgProcContext arg_ctx; MVM_args_proc_init(tc, &arg_ctx, callsite, args); MVM_args_checkarity(tc, &arg_ctx, 1, 1); self = MVM_args_get_required_pos_obj(tc, &arg_ctx, 0); MVM_args_proc_cleanup(tc, &arg_ctx); box_target = ((MVMKnowHOWAttributeREPR *)self)->body.box_target; MVM_args_set_result_int(tc, box_target, MVM_RETURN_CURRENT_FRAME); } /* Creates and installs the KnowHOWAttribute type. */ static void create_KnowHOWAttribute(MVMThreadContext *tc) { MVMObject *meta_obj, *type_obj; MVMString *name_str; const MVMREPROps *repr; /* Create meta-object. */ meta_obj = MVM_repr_alloc_init(tc, STABLE(tc->instance->KnowHOW)->HOW); MVMROOT(tc, meta_obj, { /* Add methods. */ add_knowhow_how_method(tc, (MVMKnowHOWREPR *)meta_obj, "new", attr_new); add_knowhow_how_method(tc, (MVMKnowHOWREPR *)meta_obj, "compose", attr_compose); add_knowhow_how_method(tc, (MVMKnowHOWREPR *)meta_obj, "name", attr_name); add_knowhow_how_method(tc, (MVMKnowHOWREPR *)meta_obj, "type", attr_type); add_knowhow_how_method(tc, (MVMKnowHOWREPR *)meta_obj, "box_target", attr_box_target); /* Set name. */ name_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "KnowHOWAttribute"); MVM_ASSIGN_REF(tc, &(meta_obj->header), ((MVMKnowHOWREPR *)meta_obj)->body.name, name_str); /* Create a new type object with the correct REPR. */ repr = MVM_repr_get_by_id(tc, MVM_REPR_ID_KnowHOWAttributeREPR); type_obj = repr->type_object_for(tc, meta_obj); /* Set up method dispatch cache. */ STABLE(type_obj)->method_cache = ((MVMKnowHOWREPR *)meta_obj)->body.methods; STABLE(type_obj)->mode_flags = MVM_METHOD_CACHE_AUTHORITATIVE; /* Stash the created type object. */ tc->instance->KnowHOWAttribute = (MVMObject *)type_obj; MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&tc->instance->KnowHOWAttribute, "KnowHOWAttribute"); }); } /* Bootstraps a typed array. */ static MVMObject * boot_typed_array(MVMThreadContext *tc, char *name, MVMObject *type) { MVMBoolificationSpec *bs; MVMObject *repr_info; MVMInstance *instance = tc->instance; const MVMREPROps *repr = MVM_repr_get_by_id(tc, MVM_REPR_ID_VMArray); MVMObject *array = repr->type_object_for(tc, NULL); MVMROOT(tc, array, { /* Give it a meta-object. */ add_meta_object(tc, array, name); /* Now need to compose it with the specified type. */ repr_info = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTHash); MVMROOT(tc, repr_info, { MVMObject *arr_info = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTHash); MVM_repr_bind_key_o(tc, arr_info, instance->str_consts.type, type); MVM_repr_bind_key_o(tc, repr_info, instance->str_consts.array, arr_info); MVM_repr_compose(tc, array, repr_info); }); /* Also give it a boolification spec. */ bs = MVM_malloc(sizeof(MVMBoolificationSpec)); bs->mode = MVM_BOOL_MODE_HAS_ELEMS; bs->method = NULL; array->st->boolification_spec = bs; }); return array; } /* Sets up the core serialization context. It is marked as the SC of various * rooted objects, which means in turn it will never be collected. */ static void setup_core_sc(MVMThreadContext *tc) { MVMString *handle = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "__6MODEL_CORE__"); MVMSerializationContext * const sc = (MVMSerializationContext *)MVM_sc_create(tc, handle); MVMint32 obj_index = 0; MVMint32 st_index = 0; #define add_to_sc_with_st(tc, sc, variable) do { \ MVM_sc_set_object(tc, sc, obj_index++, variable); \ MVM_sc_set_obj_sc(tc, variable, sc); \ MVM_sc_set_stable(tc, sc, st_index++, STABLE(variable)); \ MVM_sc_set_stable_sc(tc, STABLE(variable), sc); \ } while (0) #define add_to_sc_with_st_and_mo(tc, sc, variable) do { \ add_to_sc_with_st(tc, sc, variable); \ MVM_sc_set_object(tc, sc, obj_index++, STABLE(variable)->HOW); \ MVM_sc_set_obj_sc(tc, STABLE(variable)->HOW, sc); \ } while (0) /* KnowHOW */ add_to_sc_with_st(tc, sc, tc->instance->KnowHOW); /* KnowHOW.HOW */ add_to_sc_with_st(tc, sc, STABLE(tc->instance->KnowHOW)->HOW); /* KnowHOWAttribute */ add_to_sc_with_st(tc, sc, tc->instance->KnowHOWAttribute); /* BOOT* */ add_to_sc_with_st_and_mo(tc, sc, tc->instance->boot_types.BOOTArray); add_to_sc_with_st_and_mo(tc, sc, tc->instance->boot_types.BOOTHash); add_to_sc_with_st_and_mo(tc, sc, tc->instance->boot_types.BOOTIter); add_to_sc_with_st_and_mo(tc, sc, tc->instance->boot_types.BOOTInt); add_to_sc_with_st_and_mo(tc, sc, tc->instance->boot_types.BOOTNum); add_to_sc_with_st_and_mo(tc, sc, tc->instance->boot_types.BOOTStr); add_to_sc_with_st_and_mo(tc, sc, tc->instance->boot_types.BOOTCode); } /* Sets up some string constants. */ static void string_consts(MVMThreadContext *tc) { MVMInstance * const instance = tc->instance; /* Set up some strings. */ #define string_creator(variable, name) do { \ instance->str_consts.variable = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, (name)); \ MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&(instance->str_consts.variable), "VM string constant"); \ } while (0) string_creator(empty, ""); string_creator(Str, "Str"); string_creator(Num, "Num"); string_creator(integer, "integer"); string_creator(float_str, "float"); string_creator(bits, "bits"); string_creator(unsigned_str, "unsigned"); string_creator(find_method, "find_method"); string_creator(type_check, "type_check"); string_creator(accepts_type, "accepts_type"); string_creator(name, "name"); string_creator(attribute, "attribute"); string_creator(of, "of"); string_creator(rw, "rw"); string_creator(type, "type"); string_creator(typeobj, "typeobj"); string_creator(free_str, "free_str"); string_creator(callback_args, "callback_args"); string_creator(encoding, "encoding"); string_creator(inlined, "inlined"); string_creator(repr, "repr"); string_creator(anon, ""); string_creator(P6opaque, "P6opaque"); string_creator(box_target, "box_target"); string_creator(array, "array"); string_creator(positional_delegate, "positional_delegate"); string_creator(associative_delegate, "associative_delegate"); string_creator(auto_viv_container, "auto_viv_container"); string_creator(done, "done"); string_creator(error, "error"); string_creator(stdout_bytes, "stdout_bytes"); string_creator(stderr_bytes, "stderr_bytes"); string_creator(merge_bytes, "merge_bytes"); string_creator(buf_type, "buf_type"); string_creator(write, "write"); string_creator(stdin_fd, "stdin_fd"); string_creator(stdout_fd, "stdout_fd"); string_creator(stderr_fd, "stderr_fd"); string_creator(nativeref, "nativeref"); string_creator(refkind, "refkind"); string_creator(positional, "positional"); string_creator(lexical, "lexical"); string_creator(dimensions, "dimensions"); string_creator(ready, "ready"); string_creator(multidim, "multidim"); string_creator(entry_point, "entry_point"); string_creator(kind, "kind"); string_creator(instrumented, "instrumented"); string_creator(heap, "heap"); string_creator(translate_newlines, "translate_newlines"); string_creator(platform_newline, MVM_TRANSLATE_NEWLINE_OUTPUT ? "\r\n" : "\n"); string_creator(path, "path"); string_creator(config, "config"); string_creator(replacement, "replacement"); } /* Drives the overall bootstrap process. */ void MVM_6model_bootstrap(MVMThreadContext *tc) { /* First, we have to get the VMString type to exist; this has to * come even before REPR registry setup because it relies on * being able to create strings. */ create_stub_VMString(tc); /* Set up some string constants commonly used. */ string_consts(tc); /* Now we've enough to actually create the REPR registry. */ MVM_repr_initialize_registry(tc); /* Create stub VMNull, BOOTInt, BOOTNum, BOOTStr, BOOTArray, BOOTHash, * BOOTCCode, BOOTCode, BOOTThread, BOOTIter, BOOTContext, SCRef, * CallCapture, BOOTIO, BOOTException, BOOTQueue, BOOTAsync, * and BOOTReentrantMutex types. */ #define create_stub_boot_type(tc, reprid, slot, makeboolspec, boolspec) do { \ const MVMREPROps *repr = MVM_repr_get_by_id(tc, reprid); \ MVMObject *type = tc->instance->slot = repr->type_object_for(tc, NULL); \ if (makeboolspec) { \ MVMBoolificationSpec *bs; \ bs = MVM_malloc(sizeof(MVMBoolificationSpec)); \ bs->mode = boolspec; \ bs->method = NULL; \ type->st->boolification_spec = bs; \ } \ } while (0) create_stub_boot_type(tc, MVM_REPR_ID_MVMNull, VMNull, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_P6int, boot_types.BOOTInt, 1, MVM_BOOL_MODE_UNBOX_INT); create_stub_boot_type(tc, MVM_REPR_ID_P6num, boot_types.BOOTNum, 1, MVM_BOOL_MODE_UNBOX_NUM); create_stub_boot_type(tc, MVM_REPR_ID_P6str, boot_types.BOOTStr, 1, MVM_BOOL_MODE_UNBOX_STR_NOT_EMPTY); create_stub_boot_type(tc, MVM_REPR_ID_VMArray, boot_types.BOOTArray, 1, MVM_BOOL_MODE_HAS_ELEMS); create_stub_boot_type(tc, MVM_REPR_ID_MVMHash, boot_types.BOOTHash, 1, MVM_BOOL_MODE_HAS_ELEMS); create_stub_boot_type(tc, MVM_REPR_ID_MVMCFunction, boot_types.BOOTCCode, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_MVMCode, boot_types.BOOTCode, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_MVMThread, boot_types.BOOTThread, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_MVMIter, boot_types.BOOTIter, 1, MVM_BOOL_MODE_ITER); create_stub_boot_type(tc, MVM_REPR_ID_MVMContext, boot_types.BOOTContext, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_SCRef, SCRef, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_MVMCallCapture, CallCapture, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_MVMOSHandle, boot_types.BOOTIO, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_MVMException, boot_types.BOOTException, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_MVMStaticFrame, boot_types.BOOTStaticFrame, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_MVMCompUnit, boot_types.BOOTCompUnit, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_MVMMultiCache, boot_types.BOOTMultiCache, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_MVMContinuation, boot_types.BOOTContinuation, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_MVMThread, Thread, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_ConcBlockingQueue, boot_types.BOOTQueue, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_MVMAsyncTask, boot_types.BOOTAsync, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_ReentrantMutex, boot_types.BOOTReentrantMutex, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_MVMSpeshLog, SpeshLog, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); create_stub_boot_type(tc, MVM_REPR_ID_MVMStaticFrameSpesh, StaticFrameSpesh, 0, MVM_BOOL_MODE_NOT_TYPE_OBJECT); /* Bootstrap the KnowHOW type, giving it a meta-object. */ bootstrap_KnowHOW(tc); /* Give stub types meta-objects. */ #define meta_objectifier(tc, slot, name) do { \ add_meta_object((tc), (tc)->instance->slot, (name)); \ MVM_gc_root_add_permanent_desc((tc), (MVMCollectable **)&(tc)->instance->slot, name); \ } while (0) meta_objectifier(tc, VMString, "VMString"); meta_objectifier(tc, VMNull, "VMNull"); meta_objectifier(tc, boot_types.BOOTInt, "BOOTInt"); meta_objectifier(tc, boot_types.BOOTNum, "BOOTNum"); meta_objectifier(tc, boot_types.BOOTStr, "BOOTStr"); meta_objectifier(tc, boot_types.BOOTArray, "BOOTArray"); meta_objectifier(tc, boot_types.BOOTHash, "BOOTHash"); meta_objectifier(tc, boot_types.BOOTCCode, "BOOTCCode"); meta_objectifier(tc, boot_types.BOOTCode, "BOOTCode"); meta_objectifier(tc, boot_types.BOOTThread, "BOOTThread"); meta_objectifier(tc, boot_types.BOOTIter, "BOOTIter"); meta_objectifier(tc, boot_types.BOOTContext, "BOOTContext"); meta_objectifier(tc, SCRef, "SCRef"); meta_objectifier(tc, CallCapture, "CallCapture"); meta_objectifier(tc, boot_types.BOOTIO, "BOOTIO"); meta_objectifier(tc, boot_types.BOOTException, "BOOTException"); meta_objectifier(tc, boot_types.BOOTStaticFrame, "BOOTStaticFrame"); meta_objectifier(tc, boot_types.BOOTCompUnit, "BOOTCompUnit"); meta_objectifier(tc, boot_types.BOOTMultiCache, "BOOTMultiCache"); meta_objectifier(tc, boot_types.BOOTContinuation, "BOOTContinuation"); meta_objectifier(tc, Thread, "Thread"); meta_objectifier(tc, boot_types.BOOTQueue, "BOOTQueue"); meta_objectifier(tc, boot_types.BOOTAsync, "BOOTAsync"); meta_objectifier(tc, boot_types.BOOTReentrantMutex, "BOOTReentrantMutex"); /* Create the KnowHOWAttribute type. */ create_KnowHOWAttribute(tc); /* Bootstrap typed arrays. */ tc->instance->boot_types.BOOTIntArray = boot_typed_array(tc, "BOOTIntArray", tc->instance->boot_types.BOOTInt); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&tc->instance->boot_types.BOOTIntArray, "BOOTIntArray"); tc->instance->boot_types.BOOTNumArray = boot_typed_array(tc, "BOOTNumArray", tc->instance->boot_types.BOOTNum); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&tc->instance->boot_types.BOOTNumArray, "BOOTNumArray"); tc->instance->boot_types.BOOTStrArray = boot_typed_array(tc, "BOOTStrArray", tc->instance->boot_types.BOOTStr); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&tc->instance->boot_types.BOOTStrArray, "BOOTStrArray"); /* Set up HLL roles. */ STABLE(tc->instance->boot_types.BOOTInt)->hll_role = MVM_HLL_ROLE_INT; STABLE(tc->instance->boot_types.BOOTNum)->hll_role = MVM_HLL_ROLE_NUM; STABLE(tc->instance->boot_types.BOOTStr)->hll_role = MVM_HLL_ROLE_STR; STABLE(tc->instance->boot_types.BOOTArray)->hll_role = MVM_HLL_ROLE_ARRAY; STABLE(tc->instance->boot_types.BOOTHash)->hll_role = MVM_HLL_ROLE_HASH; STABLE(tc->instance->boot_types.BOOTCode)->hll_role = MVM_HLL_ROLE_CODE; /* Get initial __6MODEL_CORE__ serialization context set up. */ setup_core_sc(tc); MVM_6model_containers_setup(tc); MVM_intcache_for(tc, tc->instance->boot_types.BOOTInt); } MoarVM-2018.03/src/6model/bootstrap.h0000644000175000017510000000006113237701240017342 0ustar samanthasamanthavoid MVM_6model_bootstrap(MVMThreadContext *tc); MoarVM-2018.03/src/6model/containers.c0000644000175000017510000006300713237701240017476 0ustar samanthasamantha#include "moar.h" MVMint64 MVM_6model_container_iscont_rw(MVMThreadContext *tc, MVMObject *cont) { if (cont && IS_CONCRETE(cont)) { const MVMContainerSpec *cs = STABLE(cont)->container_spec; if (cs && cs->can_store(tc, cont)) { return 1; } } return 0; } /* *************************************************************************** * CodePair container configuration: container with FETCH/STORE code refs * ***************************************************************************/ typedef struct { MVMObject *fetch_code; MVMObject *store_code; } CodePairContData; static void code_pair_fetch_internal(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res, MVMReturnType res_type) { CodePairContData *data = (CodePairContData *)STABLE(cont)->container_data; MVMObject *code = MVM_frame_find_invokee(tc, data->fetch_code, NULL); MVMCallsite *inv_arg_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_INV_ARG); MVM_args_setup_thunk(tc, res, res_type, inv_arg_callsite); tc->cur_frame->args[0].o = cont; STABLE(code)->invoke(tc, code, inv_arg_callsite, tc->cur_frame->args); } static void code_pair_fetch(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res) { code_pair_fetch_internal(tc, cont, res, MVM_RETURN_OBJ); } static void code_pair_fetch_i(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res) { code_pair_fetch_internal(tc, cont, res, MVM_RETURN_INT); } static void code_pair_fetch_n(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res) { code_pair_fetch_internal(tc, cont, res, MVM_RETURN_NUM); } static void code_pair_fetch_s(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res) { code_pair_fetch_internal(tc, cont, res, MVM_RETURN_STR); } static void code_pair_store_internal(MVMThreadContext *tc, MVMObject *cont, MVMRegister value, MVMCallsite *cs) { CodePairContData *data = (CodePairContData *)STABLE(cont)->container_data; MVMObject *code = MVM_frame_find_invokee(tc, data->store_code, NULL); MVM_args_setup_thunk(tc, NULL, MVM_RETURN_VOID, cs); tc->cur_frame->args[0].o = cont; tc->cur_frame->args[1] = value; STABLE(code)->invoke(tc, code, cs, tc->cur_frame->args); } static void code_pair_store(MVMThreadContext *tc, MVMObject *cont, MVMObject *obj) { MVMRegister r; r.o = obj; code_pair_store_internal(tc, cont, r, MVM_callsite_get_common(tc, MVM_CALLSITE_ID_TWO_OBJ)); } static void code_pair_store_i(MVMThreadContext *tc, MVMObject *cont, MVMint64 value) { MVMRegister r; r.i64 = value; code_pair_store_internal(tc, cont, r, MVM_callsite_get_common(tc, MVM_CALLSITE_ID_OBJ_INT)); } static void code_pair_store_n(MVMThreadContext *tc, MVMObject *cont, MVMnum64 value) { MVMRegister r; r.n64 = value; code_pair_store_internal(tc, cont, r, MVM_callsite_get_common(tc, MVM_CALLSITE_ID_OBJ_NUM)); } static void code_pair_store_s(MVMThreadContext *tc, MVMObject *cont, MVMString *value) { MVMRegister r; r.s = value; code_pair_store_internal(tc, cont, r, MVM_callsite_get_common(tc, MVM_CALLSITE_ID_OBJ_STR)); } static void code_pair_gc_mark_data(MVMThreadContext *tc, MVMSTable *st, MVMGCWorklist *worklist) { CodePairContData *data = (CodePairContData *)st->container_data; MVM_gc_worklist_add(tc, worklist, &data->fetch_code); MVM_gc_worklist_add(tc, worklist, &data->store_code); } static void code_pair_gc_free_data(MVMThreadContext *tc, MVMSTable *st) { MVM_free_null(st->container_data); } static void code_pair_serialize(MVMThreadContext *tc, MVMSTable *st, MVMSerializationWriter *writer) { CodePairContData *data = (CodePairContData *)st->container_data; MVM_serialization_write_ref(tc, writer, data->fetch_code); MVM_serialization_write_ref(tc, writer, data->store_code); } static void code_pair_deserialize(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { CodePairContData *data = (CodePairContData *)st->container_data; MVM_ASSIGN_REF(tc, &(st->header), data->fetch_code, MVM_serialization_read_ref(tc, reader)); MVM_ASSIGN_REF(tc, &(st->header), data->store_code, MVM_serialization_read_ref(tc, reader)); } static MVMint32 code_pair_can_store(MVMThreadContext *tc, MVMObject *cont) { return 1; } static const MVMContainerSpec code_pair_spec = { "code_pair", code_pair_fetch, code_pair_fetch_i, code_pair_fetch_n, code_pair_fetch_s, code_pair_store, code_pair_store_i, code_pair_store_n, code_pair_store_s, code_pair_store, NULL, /* spesh */ code_pair_gc_mark_data, code_pair_gc_free_data, code_pair_serialize, code_pair_deserialize, code_pair_can_store, NULL, /* cas */ NULL, /* atomic_load */ NULL, /* atomic_store */ 0 }; static void code_pair_set_container_spec(MVMThreadContext *tc, MVMSTable *st) { CodePairContData *data = MVM_malloc(sizeof(CodePairContData)); data->fetch_code = NULL; data->store_code = NULL; st->container_data = data; st->container_spec = &code_pair_spec; } static void code_pair_configure_container_spec(MVMThreadContext *tc, MVMSTable *st, MVMObject *config) { CodePairContData *data = (CodePairContData *)st->container_data; MVMROOT(tc, config, { MVMString *fetch = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "fetch"); MVMString *store; if (!MVM_repr_exists_key(tc, config, fetch)) MVM_exception_throw_adhoc(tc, "Container spec 'code_pair' must be configured with a fetch"); MVM_ASSIGN_REF(tc, &(st->header), data->fetch_code, MVM_repr_at_key_o(tc, config, fetch)); store = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "store"); if (!MVM_repr_exists_key(tc, config, store)) MVM_exception_throw_adhoc(tc, "Container spec 'code_pair' must be configured with a store"); MVM_ASSIGN_REF(tc, &(st->header), data->store_code, MVM_repr_at_key_o(tc, config, store)); }); } static const MVMContainerConfigurer CodePairContainerConfigurer = { code_pair_set_container_spec, code_pair_configure_container_spec }; /* *************************************************************************** * Native reference container configuration * ***************************************************************************/ static void native_ref_fetch_i(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res) { MVMNativeRefREPRData *repr_data = (MVMNativeRefREPRData *)STABLE(cont)->REPR_data; if (repr_data->primitive_type != MVM_STORAGE_SPEC_BP_INT) MVM_exception_throw_adhoc(tc, "This container does not reference a native integer"); switch (repr_data->ref_kind) { case MVM_NATIVEREF_LEX: res->i64 = MVM_nativeref_read_lex_i(tc, cont); break; case MVM_NATIVEREF_ATTRIBUTE: res->i64 = MVM_nativeref_read_attribute_i(tc, cont); break; case MVM_NATIVEREF_POSITIONAL: res->i64 = MVM_nativeref_read_positional_i(tc, cont); break; case MVM_NATIVEREF_MULTIDIM: res->i64 = MVM_nativeref_read_multidim_i(tc, cont); break; default: MVM_exception_throw_adhoc(tc, "Unknown native int reference kind"); } } static void native_ref_fetch_n(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res) { MVMNativeRefREPRData *repr_data = (MVMNativeRefREPRData *)STABLE(cont)->REPR_data; if (repr_data->primitive_type != MVM_STORAGE_SPEC_BP_NUM) MVM_exception_throw_adhoc(tc, "This container does not reference a native number"); switch (repr_data->ref_kind) { case MVM_NATIVEREF_LEX: res->n64 = MVM_nativeref_read_lex_n(tc, cont); break; case MVM_NATIVEREF_ATTRIBUTE: res->n64 = MVM_nativeref_read_attribute_n(tc, cont); break; case MVM_NATIVEREF_POSITIONAL: res->n64 = MVM_nativeref_read_positional_n(tc, cont); break; case MVM_NATIVEREF_MULTIDIM: res->n64 = MVM_nativeref_read_multidim_n(tc, cont); break; default: MVM_exception_throw_adhoc(tc, "Unknown native num reference kind"); } } static void native_ref_fetch_s(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res) { MVMNativeRefREPRData *repr_data = (MVMNativeRefREPRData *)STABLE(cont)->REPR_data; if (repr_data->primitive_type != MVM_STORAGE_SPEC_BP_STR) MVM_exception_throw_adhoc(tc, "This container does not reference a native string"); switch (repr_data->ref_kind) { case MVM_NATIVEREF_LEX: res->s = MVM_nativeref_read_lex_s(tc, cont); break; case MVM_NATIVEREF_ATTRIBUTE: res->s = MVM_nativeref_read_attribute_s(tc, cont); break; case MVM_NATIVEREF_POSITIONAL: res->s = MVM_nativeref_read_positional_s(tc, cont); break; case MVM_NATIVEREF_MULTIDIM: res->s = MVM_nativeref_read_multidim_s(tc, cont); break; default: MVM_exception_throw_adhoc(tc, "Unknown native str reference kind"); } } static void native_ref_fetch(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res) { MVMNativeRefREPRData *repr_data = (MVMNativeRefREPRData *)STABLE(cont)->REPR_data; MVMHLLConfig *hll = STABLE(cont)->hll_owner; MVMRegister tmp; if (!hll) hll = MVM_hll_current(tc); switch (repr_data->primitive_type) { case MVM_STORAGE_SPEC_BP_INT: native_ref_fetch_i(tc, cont, &tmp); res->o = MVM_repr_box_int(tc, hll->int_box_type, tmp.i64); break; case MVM_STORAGE_SPEC_BP_NUM: native_ref_fetch_n(tc, cont, &tmp); res->o = MVM_repr_box_num(tc, hll->num_box_type, tmp.n64); break; case MVM_STORAGE_SPEC_BP_STR: native_ref_fetch_s(tc, cont, &tmp); res->o = MVM_repr_box_str(tc, hll->str_box_type, tmp.s); break; default: MVM_exception_throw_adhoc(tc, "Unknown native reference primitive type"); } } static void native_ref_store_i(MVMThreadContext *tc, MVMObject *cont, MVMint64 value) { MVMNativeRefREPRData *repr_data = (MVMNativeRefREPRData *)STABLE(cont)->REPR_data; if (repr_data->primitive_type != MVM_STORAGE_SPEC_BP_INT) MVM_exception_throw_adhoc(tc, "This container does not reference a native integer"); switch (repr_data->ref_kind) { case MVM_NATIVEREF_LEX: MVM_nativeref_write_lex_i(tc, cont, value); break; case MVM_NATIVEREF_ATTRIBUTE: MVM_nativeref_write_attribute_i(tc, cont, value); break; case MVM_NATIVEREF_POSITIONAL: MVM_nativeref_write_positional_i(tc, cont, value); break; case MVM_NATIVEREF_MULTIDIM: MVM_nativeref_write_multidim_i(tc, cont, value); break; default: MVM_exception_throw_adhoc(tc, "Unknown native int reference kind"); } } static void native_ref_store_n(MVMThreadContext *tc, MVMObject *cont, MVMnum64 value) { MVMNativeRefREPRData *repr_data = (MVMNativeRefREPRData *)STABLE(cont)->REPR_data; if (repr_data->primitive_type != MVM_STORAGE_SPEC_BP_NUM) MVM_exception_throw_adhoc(tc, "This container does not reference a native number"); switch (repr_data->ref_kind) { case MVM_NATIVEREF_LEX: MVM_nativeref_write_lex_n(tc, cont, value); break; case MVM_NATIVEREF_ATTRIBUTE: MVM_nativeref_write_attribute_n(tc, cont, value); break; case MVM_NATIVEREF_POSITIONAL: MVM_nativeref_write_positional_n(tc, cont, value); break; case MVM_NATIVEREF_MULTIDIM: MVM_nativeref_write_multidim_n(tc, cont, value); break; default: MVM_exception_throw_adhoc(tc, "Unknown native num reference kind"); } } static void native_ref_store_s(MVMThreadContext *tc, MVMObject *cont, MVMString *value) { MVMNativeRefREPRData *repr_data = (MVMNativeRefREPRData *)STABLE(cont)->REPR_data; if (repr_data->primitive_type != MVM_STORAGE_SPEC_BP_STR) MVM_exception_throw_adhoc(tc, "This container does not reference a native string"); switch (repr_data->ref_kind) { case MVM_NATIVEREF_LEX: MVM_nativeref_write_lex_s(tc, cont, value); break; case MVM_NATIVEREF_ATTRIBUTE: MVM_nativeref_write_attribute_s(tc, cont, value); break; case MVM_NATIVEREF_POSITIONAL: MVM_nativeref_write_positional_s(tc, cont, value); break; case MVM_NATIVEREF_MULTIDIM: MVM_nativeref_write_multidim_s(tc, cont, value); break; default: MVM_exception_throw_adhoc(tc, "Unknown native str reference kind"); } } static void native_ref_store(MVMThreadContext *tc, MVMObject *cont, MVMObject *obj) { MVMNativeRefREPRData *repr_data = (MVMNativeRefREPRData *)STABLE(cont)->REPR_data; switch (repr_data->primitive_type) { case MVM_STORAGE_SPEC_BP_INT: native_ref_store_i(tc, cont, MVM_repr_get_int(tc, obj)); break; case MVM_STORAGE_SPEC_BP_NUM: native_ref_store_n(tc, cont, MVM_repr_get_num(tc, obj)); break; case MVM_STORAGE_SPEC_BP_STR: native_ref_store_s(tc, cont, MVM_repr_get_str(tc, obj)); break; default: MVM_exception_throw_adhoc(tc, "Unknown native reference primitive type"); } } static void native_ref_serialize(MVMThreadContext *tc, MVMSTable *st, MVMSerializationWriter *writer) { /* Nothing to do. */ } static void native_ref_deserialize(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { /* Nothing to do. */ } static MVMint32 native_ref_can_store(MVMThreadContext *tc, MVMObject *cont) { return 1; } static const MVMContainerSpec native_ref_spec = { "native_ref", native_ref_fetch, native_ref_fetch_i, native_ref_fetch_n, native_ref_fetch_s, native_ref_store, native_ref_store_i, native_ref_store_n, native_ref_store_s, native_ref_store, NULL, /* spesh */ NULL, /* gc_mark_data */ NULL, /* gc_free_data */ native_ref_serialize, native_ref_deserialize, native_ref_can_store, NULL, /* cas */ NULL, /* atomic_load */ NULL, /* atomic_store */ 1 }; static void native_ref_set_container_spec(MVMThreadContext *tc, MVMSTable *st) { st->container_spec = &native_ref_spec; } static void native_ref_configure_container_spec(MVMThreadContext *tc, MVMSTable *st, MVMObject *config) { /* Nothing to do. */ } static const MVMContainerConfigurer NativeRefContainerConfigurer = { native_ref_set_container_spec, native_ref_configure_container_spec }; /* *************************************************************************** * Container registry and configuration * ***************************************************************************/ /* Adds a container configurer to the registry. */ void MVM_6model_add_container_config(MVMThreadContext *tc, MVMString *name, const MVMContainerConfigurer *configurer) { MVMContainerRegistry *entry; uv_mutex_lock(&tc->instance->mutex_container_registry); MVM_HASH_GET(tc, tc->instance->container_registry, name, entry); if (!entry) { entry = MVM_malloc(sizeof(MVMContainerRegistry)); entry->name = name; entry->configurer = configurer; MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->name, "Container configuration name"); MVM_HASH_BIND(tc, tc->instance->container_registry, name, entry); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->hash_handle.key, "Container configuration hash key"); } uv_mutex_unlock(&tc->instance->mutex_container_registry); } /* Gets a container configurer from the registry. */ const MVMContainerConfigurer * MVM_6model_get_container_config(MVMThreadContext *tc, MVMString *name) { MVMContainerRegistry *entry; MVM_HASH_GET(tc, tc->instance->container_registry, name, entry); return entry != NULL ? entry->configurer : NULL; } /* Does initial setup work of the container registry, including registering * the various built-in container types. */ void MVM_6model_containers_setup(MVMThreadContext *tc) { /* Add built-in configurations. */ MVM_6model_add_container_config(tc, MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "code_pair"), &CodePairContainerConfigurer); MVM_6model_add_container_config(tc, MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "native_ref"), &NativeRefContainerConfigurer); } /* *************************************************************************** * Native container/reference operations * ***************************************************************************/ /* Check if this is a container referencing a given native. */ static MVMint64 get_container_primitive(MVMThreadContext *tc, MVMObject *cont) { if (cont && IS_CONCRETE(cont)) { const MVMContainerSpec *cs = STABLE(cont)->container_spec; if (cs == &native_ref_spec && REPR(cont)->ID == MVM_REPR_ID_NativeRef) return ((MVMNativeRefREPRData *)STABLE(cont)->REPR_data)->primitive_type; } return MVM_STORAGE_SPEC_BP_NONE; } MVMint64 MVM_6model_container_iscont_i(MVMThreadContext *tc, MVMObject *cont) { return get_container_primitive(tc, cont) == MVM_STORAGE_SPEC_BP_INT; } MVMint64 MVM_6model_container_iscont_n(MVMThreadContext *tc, MVMObject *cont) { return get_container_primitive(tc, cont) == MVM_STORAGE_SPEC_BP_NUM; } MVMint64 MVM_6model_container_iscont_s(MVMThreadContext *tc, MVMObject *cont) { return get_container_primitive(tc, cont) == MVM_STORAGE_SPEC_BP_STR; } /* If it's a container, do a fetch_i. Otherwise, try to unbox the received * value as a native integer. */ void MVM_6model_container_decont_i(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res) { const MVMContainerSpec *cs = STABLE(cont)->container_spec; if (cs && IS_CONCRETE(cont)) cs->fetch_i(tc, cont, res); else res->i64 = MVM_repr_get_int(tc, cont); } /* If it's a container, do a fetch_n. Otherwise, try to unbox the received * value as a native number. */ void MVM_6model_container_decont_n(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res) { const MVMContainerSpec *cs = STABLE(cont)->container_spec; if (cs && IS_CONCRETE(cont)) cs->fetch_n(tc, cont, res); else res->n64 = MVM_repr_get_num(tc, cont); } /* If it's a container, do a fetch_s. Otherwise, try to unbox the received * value as a native string. */ void MVM_6model_container_decont_s(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res) { const MVMContainerSpec *cs = STABLE(cont)->container_spec; if (cs && IS_CONCRETE(cont)) cs->fetch_s(tc, cont, res); else res->s = MVM_repr_get_str(tc, cont); } /* If it's a container, do a fetch_i. Otherwise, try to unbox the received * value as a native unsigned integer. */ void MVM_6model_container_decont_u(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res) { const MVMContainerSpec *cs = STABLE(cont)->container_spec; if (cs && IS_CONCRETE(cont)) /* XXX We need a fetch_u at some point. */ cs->fetch_i(tc, cont, res); else res->u64 = MVM_repr_get_uint(tc, cont); } /* Checks we have a container, and provided we do, assigns an int into it. */ void MVM_6model_container_assign_i(MVMThreadContext *tc, MVMObject *cont, MVMint64 value) { const MVMContainerSpec *cs = STABLE(cont)->container_spec; if (cs && IS_CONCRETE(cont)) cs->store_i(tc, cont, value); else MVM_exception_throw_adhoc(tc, "Cannot assign to an immutable value"); } /* Checks we have a container, and provided we do, assigns a num into it. */ void MVM_6model_container_assign_n(MVMThreadContext *tc, MVMObject *cont, MVMnum64 value) { const MVMContainerSpec *cs = STABLE(cont)->container_spec; if (cs && IS_CONCRETE(cont)) cs->store_n(tc, cont, value); else MVM_exception_throw_adhoc(tc, "Cannot assign to an immutable value"); } /* Checks we have a container, and provided we do, assigns a str into it. */ void MVM_6model_container_assign_s(MVMThreadContext *tc, MVMObject *cont, MVMString *value) { const MVMContainerSpec *cs = STABLE(cont)->container_spec; if (cs && IS_CONCRETE(cont)) cs->store_s(tc, cont, value); else MVM_exception_throw_adhoc(tc, "Cannot assign to an immutable value"); } /* *************************************************************************** * Container atomic operations * ***************************************************************************/ void MVM_6model_container_cas(MVMThreadContext *tc, MVMObject *cont, MVMObject *expected, MVMObject *value, MVMRegister *result) { if (IS_CONCRETE(cont)) { MVMContainerSpec const *cs = cont->st->container_spec; if (cs) { if (cs->cas) cs->cas(tc, cont, expected, value, result); else MVM_exception_throw_adhoc(tc, "A %s container does not know how to do atomic compare and swap", MVM_6model_get_stable_debug_name(tc, cont->st)); } else { MVM_exception_throw_adhoc(tc, "Cannot perform atomic compare and swap on non-container value of type %s", MVM_6model_get_stable_debug_name(tc, cont->st)); } } else { MVM_exception_throw_adhoc(tc, "Cannot perform atomic compare and swap on %s type object", MVM_6model_get_stable_debug_name(tc, cont->st)); } } MVMObject * MVM_6model_container_atomic_load(MVMThreadContext *tc, MVMObject *cont) { if (IS_CONCRETE(cont)) { MVMContainerSpec const *cs = cont->st->container_spec; if (cs) { if (cs->atomic_load) return cs->atomic_load(tc, cont); else MVM_exception_throw_adhoc(tc, "A %s container does not know how to do an atomic load", MVM_6model_get_stable_debug_name(tc, cont->st)); } else { MVM_exception_throw_adhoc(tc, "Cannot perform atomic load from a non-container value of type %s", MVM_6model_get_stable_debug_name(tc, cont->st)); } } else { MVM_exception_throw_adhoc(tc, "Cannot perform atomic load from %s type object", MVM_6model_get_stable_debug_name(tc, cont->st)); } } void MVM_6model_container_atomic_store(MVMThreadContext *tc, MVMObject *cont, MVMObject *value) { if (IS_CONCRETE(cont)) { MVMContainerSpec const *cs = cont->st->container_spec; if (cs) { if (cs->atomic_store) cs->atomic_store(tc, cont, value); else MVM_exception_throw_adhoc(tc, "A %s container does not know how to do an atomic store", MVM_6model_get_stable_debug_name(tc, cont->st)); } else { MVM_exception_throw_adhoc(tc, "Cannot perform atomic store to a non-container value of type %s", MVM_6model_get_stable_debug_name(tc, cont->st)); } } else { MVM_exception_throw_adhoc(tc, "Cannot perform atomic store to %s type object", MVM_6model_get_stable_debug_name(tc, cont->st)); } } static AO_t * native_ref_as_atomic_i(MVMThreadContext *tc, MVMObject *cont) { if (REPR(cont)->ID == MVM_REPR_ID_NativeRef && IS_CONCRETE(cont)) { MVMNativeRefREPRData *repr_data = (MVMNativeRefREPRData *)STABLE(cont)->REPR_data; if (repr_data->primitive_type == MVM_STORAGE_SPEC_BP_INT) { switch (repr_data->ref_kind) { case MVM_NATIVEREF_LEX: return MVM_nativeref_as_atomic_lex_i(tc, cont); case MVM_NATIVEREF_ATTRIBUTE: return MVM_nativeref_as_atomic_attribute_i(tc, cont); case MVM_NATIVEREF_POSITIONAL: return MVM_nativeref_as_atomic_positional_i(tc, cont); case MVM_NATIVEREF_MULTIDIM: return MVM_nativeref_as_atomic_multidim_i(tc, cont); default: MVM_exception_throw_adhoc(tc, "Unknown native int reference kind"); } } } MVM_exception_throw_adhoc(tc, "Can only do integer atomic operations on a container referencing a native integer"); } MVMint64 MVM_6model_container_cas_i(MVMThreadContext *tc, MVMObject *cont, MVMint64 expected, MVMint64 value) { return (MVMint64)MVM_cas(native_ref_as_atomic_i(tc, cont), (AO_t)expected, (AO_t)value); } MVMint64 MVM_6model_container_atomic_load_i(MVMThreadContext *tc, MVMObject *cont) { return (MVMint64)MVM_load(native_ref_as_atomic_i(tc, cont)); } void MVM_6model_container_atomic_store_i(MVMThreadContext *tc, MVMObject *cont, MVMint64 value) { MVM_store(native_ref_as_atomic_i(tc, cont), value); } MVMint64 MVM_6model_container_atomic_inc(MVMThreadContext *tc, MVMObject *cont) { return (MVMint64)MVM_incr(native_ref_as_atomic_i(tc, cont)); } MVMint64 MVM_6model_container_atomic_dec(MVMThreadContext *tc, MVMObject *cont) { return (MVMint64)MVM_decr(native_ref_as_atomic_i(tc, cont)); } MVMint64 MVM_6model_container_atomic_add(MVMThreadContext *tc, MVMObject *cont, MVMint64 value) { return (MVMint64)MVM_add(native_ref_as_atomic_i(tc, cont), (AO_t)value); } MoarVM-2018.03/src/6model/containers.h0000644000175000017510000001343613237701240017504 0ustar samanthasamantha/* Container specification information, for types that serve as containers. * A container is something that can be assigned into. It may be some kind * of container object (like Perl 6's Scalar) or it may be a reference to a * native lexical or object field. The function table determines the way it * behaves. */ struct MVMContainerSpec { /* Name of this container specification. */ char *name; /* Fetches a value out of a container. Used for decontainerization. */ void (*fetch) (MVMThreadContext *tc, MVMObject *cont, MVMRegister *res); /* Native value fetches. */ void (*fetch_i) (MVMThreadContext *tc, MVMObject *cont, MVMRegister *res); void (*fetch_n) (MVMThreadContext *tc, MVMObject *cont, MVMRegister *res); void (*fetch_s) (MVMThreadContext *tc, MVMObject *cont, MVMRegister *res); /* Stores a value in a container. Used for assignment. */ void (*store) (MVMThreadContext *tc, MVMObject *cont, MVMObject *obj); /* Native container stores. */ void (*store_i) (MVMThreadContext *tc, MVMObject *cont, MVMint64 value); void (*store_n) (MVMThreadContext *tc, MVMObject *cont, MVMnum64 value); void (*store_s) (MVMThreadContext *tc, MVMObject *cont, MVMString *value); /* Stores a value in a container, without any checking of it (this * assumes an optimizer or something else already did it). Used for * assignment. */ void (*store_unchecked) (MVMThreadContext *tc, MVMObject *cont, MVMObject *obj); /* Allow the Container Spec to emit better bytecode, for example for * a decont operation. */ void (*spesh) (MVMThreadContext *tc, MVMSTable *st, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins); /* Marks container data, if any. */ void (*gc_mark_data) (MVMThreadContext *tc, MVMSTable *st, MVMGCWorklist *worklist); /* Frees container data, if any. */ void (*gc_free_data) (MVMThreadContext *tc, MVMSTable *st); /* Serializes the container data, if any. */ void (*serialize) (MVMThreadContext *tc, MVMSTable *st, MVMSerializationWriter *writer); /* Deserializes the container data, if any. */ void (*deserialize) (MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader); /* Returns a non-zero value if we can store to the container. */ MVMint32 (*can_store) (MVMThreadContext *tc, MVMObject *cont); /* If available, reference atomic compare and swap operation, atomic load * operation, and atomic store operation. */ void (*cas) (MVMThreadContext *tc, MVMObject *cont, MVMObject *expected, MVMObject *value, MVMRegister *result); MVMObject * (*atomic_load) (MVMThreadContext *tc, MVMObject *cont); void (*atomic_store) (MVMThreadContext *tc, MVMObject *cont, MVMObject *value); /* Set this to a non-zero value if a fetch promises to never invoke any * code. This means the VM knows it can safely decontainerize in places * it would not be safe or practical to return to the interpreter. */ MVMuint8 fetch_never_invokes; }; /* A container configurer knows how to attach a certain type of container * to an STable and configure it. */ struct MVMContainerConfigurer { /* Sets this container spec in place for the specified STable. */ void (*set_container_spec) (MVMThreadContext *tc, MVMSTable *st); /* Configures the container spec with the specified info. */ void (*configure_container_spec) (MVMThreadContext *tc, MVMSTable *st, MVMObject *config); }; /* Container registry is a hash mapping names of container configurations * to function tables. */ struct MVMContainerRegistry { MVMString *name; const MVMContainerConfigurer *configurer; /* Inline handle to the hash in which this is stored. */ UT_hash_handle hash_handle; }; MVM_PUBLIC void MVM_6model_add_container_config(MVMThreadContext *tc, MVMString *name, const MVMContainerConfigurer *configurer); const MVMContainerConfigurer * MVM_6model_get_container_config(MVMThreadContext *tc, MVMString *name); void MVM_6model_containers_setup(MVMThreadContext *tc); MVMint64 MVM_6model_container_iscont_rw(MVMThreadContext *tc, MVMObject *cont); MVMint64 MVM_6model_container_iscont_i(MVMThreadContext *tc, MVMObject *cont); MVMint64 MVM_6model_container_iscont_n(MVMThreadContext *tc, MVMObject *cont); MVMint64 MVM_6model_container_iscont_s(MVMThreadContext *tc, MVMObject *cont); void MVM_6model_container_decont_i(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res); void MVM_6model_container_decont_n(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res); void MVM_6model_container_decont_s(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res); void MVM_6model_container_decont_u(MVMThreadContext *tc, MVMObject *cont, MVMRegister *res); void MVM_6model_container_assign_i(MVMThreadContext *tc, MVMObject *cont, MVMint64 value); void MVM_6model_container_assign_n(MVMThreadContext *tc, MVMObject *cont, MVMnum64 value); void MVM_6model_container_assign_s(MVMThreadContext *tc, MVMObject *cont, MVMString *value); void MVM_6model_container_cas(MVMThreadContext *tc, MVMObject *cont, MVMObject *expected, MVMObject *value, MVMRegister *result); MVMObject * MVM_6model_container_atomic_load(MVMThreadContext *tc, MVMObject *cont); void MVM_6model_container_atomic_store(MVMThreadContext *tc, MVMObject *cont, MVMObject *value); MVMint64 MVM_6model_container_cas_i(MVMThreadContext *tc, MVMObject *cont, MVMint64 expected, MVMint64 value); MVMint64 MVM_6model_container_atomic_load_i(MVMThreadContext *tc, MVMObject *cont); void MVM_6model_container_atomic_store_i(MVMThreadContext *tc, MVMObject *cont, MVMint64 value); MVMint64 MVM_6model_container_atomic_inc(MVMThreadContext *tc, MVMObject *cont); MVMint64 MVM_6model_container_atomic_dec(MVMThreadContext *tc, MVMObject *cont); MVMint64 MVM_6model_container_atomic_add(MVMThreadContext *tc, MVMObject *cont, MVMint64 value); MoarVM-2018.03/src/6model/parametric.c0000644000175000017510000001641013242626641017463 0ustar samanthasamantha#include "moar.h" /* Takes a type and sets it up as a parametric type, provided it's OK to do so. */ void MVM_6model_parametric_setup(MVMThreadContext *tc, MVMObject *type, MVMObject *parameterizer) { MVMSTable *st = STABLE(type); /* Ensure that the type is not already parametric or parameterized. */ if (st->mode_flags & MVM_PARAMETRIC_TYPE) MVM_exception_throw_adhoc(tc, "This type is already parametric"); if (st->mode_flags & MVM_PARAMETERIZED_TYPE) MVM_exception_throw_adhoc(tc, "Cannot make a parameterized type also be parametric"); /* For now, we use a simple pairwise array, with parameters and the type * that is based on those parameters interleaved. It does make resolution * O(n), so we might like to do some hash in the future. */ MVMROOT2(tc, st, parameterizer, { MVMObject *lookup = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVM_ASSIGN_REF(tc, &(st->header), st->paramet.ric.lookup, lookup); }); /* Store the parameterizer. (Note, we do this after the allocation * above, since the array allocation may cause GC, but we didn't mark * it as a parametric type yet so it wouldn't mark the parameterizer.) */ MVM_ASSIGN_REF(tc, &(st->header), st->paramet.ric.parameterizer, parameterizer); /* Mark the type as parameterized. */ st->mode_flags |= MVM_PARAMETRIC_TYPE; } /* Parameterize a type. Re-use an existing parameterization of there is one that * matches. Otherwise, run the parameterization creator. */ typedef struct { MVMObject *parametric_type; MVMObject *parameters; MVMRegister *result; } ParameterizeReturnData; static void finish_parameterizing(MVMThreadContext *tc, void *sr_data) { ParameterizeReturnData *prd = (ParameterizeReturnData *)sr_data; MVMObject *found; /* Mark parametric and stash required data. */ MVMSTable *new_stable = STABLE(prd->result->o); MVM_ASSIGN_REF(tc, &(new_stable->header), new_stable->paramet.erized.parametric_type, prd->parametric_type); MVM_ASSIGN_REF(tc, &(new_stable->header), new_stable->paramet.erized.parameters, prd->parameters); new_stable->mode_flags |= MVM_PARAMETERIZED_TYPE; /* Add to lookup table. Multiple threads may race to do this, so after * taking the lock to serialize additions we re-check for a match. If we * don't find one, do a defensive copy here so that existing readers of * the table won't be bitten. */ uv_mutex_lock(&tc->instance->mutex_parameterization_add); found = MVM_6model_parametric_try_find_parameterization(tc, prd->parametric_type->st, prd->parameters); if (found) { prd->result->o = found; } else { MVMObject *parameters = prd->parameters; MVMObject *parametric_type = prd->parametric_type; MVMROOT2(tc, parameters, parametric_type, { MVMObject *copy = MVM_repr_clone(tc, parametric_type->st->paramet.ric.lookup); MVM_repr_push_o(tc, copy, parameters); MVM_repr_push_o(tc, copy, prd->result->o); MVM_ASSIGN_REF(tc, &(parametric_type->st->header), parametric_type->st->paramet.ric.lookup, copy); }); } uv_mutex_unlock(&tc->instance->mutex_parameterization_add); /* Clean up parametric return data, now we're finished with it. */ MVM_free(prd); } static void mark_parameterize_sr_data(MVMThreadContext *tc, MVMFrame *frame, MVMGCWorklist *worklist) { ParameterizeReturnData *prd = (ParameterizeReturnData *)frame->extra->special_return_data; MVM_gc_worklist_add(tc, worklist, &(prd->parametric_type)); MVM_gc_worklist_add(tc, worklist, &(prd->parameters)); } void MVM_6model_parametric_parameterize(MVMThreadContext *tc, MVMObject *type, MVMObject *params, MVMRegister *result) { ParameterizeReturnData *prd; MVMObject *code, *found; /* Ensure we have a parametric type. */ MVMSTable *st = STABLE(type); if (!(st->mode_flags & MVM_PARAMETRIC_TYPE)) MVM_exception_throw_adhoc(tc, "This type is not parametric"); /* Use an existing parameterization if we have it. */ found = MVM_6model_parametric_try_find_parameterization(tc, st, params); if (found) { result->o = found; return; } /* It wasn't found; run parameterizer. */ code = MVM_frame_find_invokee(tc, st->paramet.ric.parameterizer, NULL); prd = MVM_malloc(sizeof(ParameterizeReturnData)); prd->parametric_type = type; prd->parameters = params; prd->result = result; MVM_frame_special_return(tc, tc->cur_frame, finish_parameterizing, NULL, prd, mark_parameterize_sr_data); MVM_args_setup_thunk(tc, result, MVM_RETURN_OBJ, MVM_callsite_get_common(tc, MVM_CALLSITE_ID_TWO_OBJ)); tc->cur_frame->args[0].o = st->WHAT; tc->cur_frame->args[1].o = params; STABLE(code)->invoke(tc, code, MVM_callsite_get_common(tc, MVM_CALLSITE_ID_TWO_OBJ), tc->cur_frame->args); } /* Try to find an existing parameterization of the specified type and * parameters. If none is found, returns NULL. */ MVMObject * MVM_6model_parametric_try_find_parameterization(MVMThreadContext *tc, MVMSTable *st, MVMObject *params) { MVMint64 i, j, num_lookups, params_elems; num_lookups = MVM_repr_elems(tc, st->paramet.ric.lookup); params_elems = MVM_repr_elems(tc, params); for (i = 0; i < num_lookups; i += 2) { MVMObject *compare = MVM_repr_at_pos_o(tc, st->paramet.ric.lookup, i); MVMint64 compare_elems = MVM_repr_elems(tc, compare); if (params_elems == compare_elems) { MVMint64 match = 1; for (j = 0; j < params_elems; j++) { MVMObject *want = MVM_repr_at_pos_o(tc, params, j); MVMObject *got = MVM_repr_at_pos_o(tc, compare, j); if (want != got) { match = 0; break; } } if (match) return MVM_repr_at_pos_o(tc, st->paramet.ric.lookup, i + 1); } } return NULL; } /* If the passed type is a parameterized type, then returns the parametric * type it is based on. Otherwise, returns null. */ MVMObject * MVM_6model_parametric_type_parameterized(MVMThreadContext *tc, MVMObject *type) { MVMSTable *st = STABLE(type); if (st->mode_flags & MVM_PARAMETERIZED_TYPE) return st->paramet.erized.parametric_type; else return tc->instance->VMNull; } /* Provided this is a parameterized type, returns the array of type parameters. */ MVMObject * MVM_6model_parametric_type_parameters(MVMThreadContext *tc, MVMObject *type) { MVMSTable *st = STABLE(type); if (!(st->mode_flags & MVM_PARAMETERIZED_TYPE)) MVM_exception_throw_adhoc(tc, "This type is not parameterized"); return st->paramet.erized.parameters; } /* Provided this is a parameterized type, returns the type parameter at the specified index. */ MVMObject * MVM_6model_parametric_type_parameter_at(MVMThreadContext *tc, MVMObject *type, MVMint64 idx) { MVMSTable *st = STABLE(type); if (!(st->mode_flags & MVM_PARAMETERIZED_TYPE)) MVM_exception_throw_adhoc(tc, "This type is not parameterized"); return MVM_repr_at_pos_o(tc, st->paramet.erized.parameters, idx); } MoarVM-2018.03/src/6model/parametric.h0000644000175000017510000000116513237701240017462 0ustar samanthasamanthavoid MVM_6model_parametric_setup(MVMThreadContext *tc, MVMObject *type, MVMObject *parameterizer); void MVM_6model_parametric_parameterize(MVMThreadContext *tc, MVMObject *type, MVMObject *params, MVMRegister *result); MVMObject * MVM_6model_parametric_try_find_parameterization(MVMThreadContext *tc, MVMSTable *st, MVMObject *params); MVMObject * MVM_6model_parametric_type_parameterized(MVMThreadContext *tc, MVMObject *type); MVMObject * MVM_6model_parametric_type_parameters(MVMThreadContext *tc, MVMObject *type); MVMObject * MVM_6model_parametric_type_parameter_at(MVMThreadContext *tc, MVMObject *type, MVMint64 idx); MoarVM-2018.03/src/6model/reprconv.c0000644000175000017510000006213713237701240017172 0ustar samanthasamantha#include "moar.h" /* Representation function convenience accessors. Could potentially be made into * macros in the future, but hopefully the compiler is smart enough to inline * them anyway. */ void MVM_repr_init(MVMThreadContext *tc, MVMObject *obj) { if (REPR(obj)->initialize) REPR(obj)->initialize(tc, STABLE(obj), obj, OBJECT_BODY(obj)); } MVMObject * MVM_repr_alloc(MVMThreadContext *tc, MVMObject *type) { return REPR(type)->allocate(tc, STABLE(type)); } MVMObject * MVM_repr_alloc_init(MVMThreadContext *tc, MVMObject *type) { MVMObject *obj = REPR(type)->allocate(tc, STABLE(type)); if (REPR(obj)->initialize) { MVMROOT(tc, obj, { REPR(obj)->initialize(tc, STABLE(obj), obj, OBJECT_BODY(obj)); }); } return obj; } MVMObject * MVM_repr_clone(MVMThreadContext *tc, MVMObject *obj) { MVMObject *res; if (IS_CONCRETE(obj)) { MVM_gc_root_temp_push(tc, (MVMCollectable **)&obj); res = REPR(obj)->allocate(tc, STABLE(obj)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&res); REPR(obj)->copy_to(tc, STABLE(obj), OBJECT_BODY(obj), res, OBJECT_BODY(res)); MVM_gc_root_temp_pop_n(tc, 2); } else { res = obj; } return res; } void MVM_repr_compose(MVMThreadContext *tc, MVMObject *type, MVMObject *obj) { REPR(type)->compose(tc, STABLE(type), obj); } MVM_PUBLIC void MVM_repr_pos_set_elems(MVMThreadContext *tc, MVMObject *obj, MVMint64 elems) { REPR(obj)->pos_funcs.set_elems(tc, STABLE(obj), obj, OBJECT_BODY(obj), elems); } void MVM_repr_populate_indices_array(MVMThreadContext *tc, MVMObject *arr, MVMint64 *elems) { MVMint64 i; *elems = MVM_repr_elems(tc, arr); if (*elems > tc->num_multi_dim_indices) tc->multi_dim_indices = MVM_realloc(tc->multi_dim_indices, *elems * sizeof(MVMint64)); for (i = 0; i < *elems; i++) tc->multi_dim_indices[i] = MVM_repr_at_pos_i(tc, arr, i); } void MVM_repr_set_dimensions(MVMThreadContext *tc, MVMObject *obj, MVMObject *dims) { if (IS_CONCRETE(obj)) { MVMint64 num_dims; MVM_repr_populate_indices_array(tc, dims, &num_dims); REPR(obj)->pos_funcs.set_dimensions(tc, STABLE(obj), obj, OBJECT_BODY(obj), num_dims, tc->multi_dim_indices); } else { MVM_exception_throw_adhoc(tc, "Cannot set dimensions on a type object"); } } MVM_PUBLIC void MVM_repr_pos_splice(MVMThreadContext *tc, MVMObject *obj, MVMObject *replacement, MVMint64 offset, MVMint64 count) { REPR(obj)->pos_funcs.splice(tc, STABLE(obj), obj, OBJECT_BODY(obj), replacement, offset, count); } MVM_PUBLIC MVMint64 MVM_repr_exists_pos(MVMThreadContext *tc, MVMObject *obj, MVMint64 index) { MVMint64 elems = REPR(obj)->elems(tc, STABLE(obj), obj, OBJECT_BODY(obj)); if (index < 0) index += elems; return index >= 0 && index < elems && !MVM_is_null(tc, MVM_repr_at_pos_o(tc, obj, index)); } MVMint64 MVM_repr_at_pos_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx) { MVMRegister value; REPR(obj)->pos_funcs.at_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), idx, &value, MVM_reg_int64); return value.i64; } MVMnum64 MVM_repr_at_pos_n(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx) { MVMRegister value; REPR(obj)->pos_funcs.at_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), idx, &value, MVM_reg_num64); return value.n64; } MVMString * MVM_repr_at_pos_s(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx) { MVMRegister value; REPR(obj)->pos_funcs.at_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), idx, &value, MVM_reg_str); return value.s; } MVMObject * MVM_repr_at_pos_o(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx) { if (IS_CONCRETE(obj)) { MVMRegister value; REPR(obj)->pos_funcs.at_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), idx, &value, MVM_reg_obj); return value.o; } return tc->instance->VMNull; } static void at_pos_multidim(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices, MVMRegister *value, MVMuint16 kind) { MVMint64 num_indices; MVM_repr_populate_indices_array(tc, indices, &num_indices); REPR(obj)->pos_funcs.at_pos_multidim(tc, STABLE(obj), obj, OBJECT_BODY(obj), num_indices, tc->multi_dim_indices, value, kind); } MVMint64 MVM_repr_at_pos_multidim_i(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices) { MVMRegister r; at_pos_multidim(tc, obj, indices, &r, MVM_reg_int64); return r.i64; } MVMnum64 MVM_repr_at_pos_multidim_n(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices) { MVMRegister r; at_pos_multidim(tc, obj, indices, &r, MVM_reg_num64); return r.n64; } MVMString * MVM_repr_at_pos_multidim_s(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices) { MVMRegister r; at_pos_multidim(tc, obj, indices, &r, MVM_reg_str); return r.s; } MVMObject * MVM_repr_at_pos_multidim_o(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices) { MVMRegister r; at_pos_multidim(tc, obj, indices, &r, MVM_reg_obj); return r.o; } static void at_pos_2d(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMRegister *value, MVMuint16 kind) { MVMint64 c_indices[2] = { idx1, idx2 }; REPR(obj)->pos_funcs.at_pos_multidim(tc, STABLE(obj), obj, OBJECT_BODY(obj), 2, c_indices, value, kind); } MVMint64 MVM_repr_at_pos_2d_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2) { MVMRegister r; at_pos_2d(tc, obj, idx1, idx2, &r, MVM_reg_int64); return r.i64; } MVMnum64 MVM_repr_at_pos_2d_n(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2) { MVMRegister r; at_pos_2d(tc, obj, idx1, idx2, &r, MVM_reg_num64); return r.n64; } MVMString * MVM_repr_at_pos_2d_s(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2) { MVMRegister r; at_pos_2d(tc, obj, idx1, idx2, &r, MVM_reg_str); return r.s; } MVMObject * MVM_repr_at_pos_2d_o(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2) { MVMRegister r; at_pos_2d(tc, obj, idx1, idx2, &r, MVM_reg_obj); return r.o; } static void at_pos_3d(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3, MVMRegister *value, MVMuint16 kind) { MVMint64 c_indices[3] = { idx1, idx2, idx3 }; REPR(obj)->pos_funcs.at_pos_multidim(tc, STABLE(obj), obj, OBJECT_BODY(obj), 3, c_indices, value, kind); } MVMint64 MVM_repr_at_pos_3d_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3) { MVMRegister r; at_pos_3d(tc, obj, idx1, idx2, idx3, &r, MVM_reg_int64); return r.i64; } MVMnum64 MVM_repr_at_pos_3d_n(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3) { MVMRegister r; at_pos_3d(tc, obj, idx1, idx2, idx3, &r, MVM_reg_num64); return r.n64; } MVMString * MVM_repr_at_pos_3d_s(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3) { MVMRegister r; at_pos_3d(tc, obj, idx1, idx2, idx3, &r, MVM_reg_str); return r.s; } MVMObject * MVM_repr_at_pos_3d_o(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3) { MVMRegister r; at_pos_3d(tc, obj, idx1, idx2, idx3, &r, MVM_reg_obj); return r.o; } void MVM_repr_bind_pos_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx, MVMint64 value) { MVMRegister val; val.i64 = value; REPR(obj)->pos_funcs.bind_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), idx, val, MVM_reg_int64); } void MVM_repr_bind_pos_n(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx, MVMnum64 value) { MVMRegister val; val.n64 = value; REPR(obj)->pos_funcs.bind_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), idx, val, MVM_reg_num64); } void MVM_repr_bind_pos_s(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx, MVMString *value) { MVMRegister val; val.s = value; REPR(obj)->pos_funcs.bind_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), idx, val, MVM_reg_str); } void MVM_repr_bind_pos_o(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx, MVMObject *value) { MVMRegister val; val.o = value; REPR(obj)->pos_funcs.bind_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), idx, val, MVM_reg_obj); } static void bind_pos_multidim(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices, MVMRegister value, MVMuint16 kind) { MVMint64 num_indices; MVM_repr_populate_indices_array(tc, indices, &num_indices); REPR(obj)->pos_funcs.bind_pos_multidim(tc, STABLE(obj), obj, OBJECT_BODY(obj), num_indices, tc->multi_dim_indices, value, kind); } void MVM_repr_bind_pos_multidim_i(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices, MVMint64 value) { MVMRegister r; r.i64 = value; bind_pos_multidim(tc, obj, indices, r, MVM_reg_int64); } void MVM_repr_bind_pos_multidim_n(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices, MVMnum64 value) { MVMRegister r; r.n64 = value; bind_pos_multidim(tc, obj, indices, r, MVM_reg_num64); } void MVM_repr_bind_pos_multidim_s(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices, MVMString *value) { MVMRegister r; r.s = value; bind_pos_multidim(tc, obj, indices, r, MVM_reg_str); } void MVM_repr_bind_pos_multidim_o(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices, MVMObject *value) { MVMRegister r; r.o = value; bind_pos_multidim(tc, obj, indices, r, MVM_reg_obj); } static void bind_pos_2d(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMRegister value, MVMuint16 kind) { MVMint64 c_indices[2] = { idx1, idx2 }; REPR(obj)->pos_funcs.bind_pos_multidim(tc, STABLE(obj), obj, OBJECT_BODY(obj), 2, c_indices, value, kind); } void MVM_repr_bind_pos_2d_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 value) { MVMRegister r; r.i64 = value; bind_pos_2d(tc, obj, idx1, idx2, r, MVM_reg_int64); } void MVM_repr_bind_pos_2d_n(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMnum64 value) { MVMRegister r; r.n64 = value; bind_pos_2d(tc, obj, idx1, idx2, r, MVM_reg_num64); } void MVM_repr_bind_pos_2d_s(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMString *value) { MVMRegister r; r.s = value; bind_pos_2d(tc, obj, idx1, idx2, r, MVM_reg_str); } void MVM_repr_bind_pos_2d_o(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMObject *value) { MVMRegister r; r.o = value; bind_pos_2d(tc, obj, idx1, idx2, r, MVM_reg_obj); } static void bind_pos_3d(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3, MVMRegister value, MVMuint16 kind) { MVMint64 c_indices[3] = { idx1, idx2, idx3 }; REPR(obj)->pos_funcs.bind_pos_multidim(tc, STABLE(obj), obj, OBJECT_BODY(obj), 3, c_indices, value, kind); } void MVM_repr_bind_pos_3d_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3, MVMint64 value) { MVMRegister r; r.i64 = value; bind_pos_3d(tc, obj, idx1, idx2, idx3, r, MVM_reg_int64); } void MVM_repr_bind_pos_3d_n(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3, MVMnum64 value) { MVMRegister r; r.n64 = value; bind_pos_3d(tc, obj, idx1, idx2, idx3, r, MVM_reg_num64); } void MVM_repr_bind_pos_3d_s(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3, MVMString *value) { MVMRegister r; r.s = value; bind_pos_3d(tc, obj, idx1, idx2, idx3, r, MVM_reg_str); } void MVM_repr_bind_pos_3d_o(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3, MVMObject *value) { MVMRegister r; r.o = value; bind_pos_3d(tc, obj, idx1, idx2, idx3, r, MVM_reg_obj); } void MVM_repr_push_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 pushee) { MVMRegister value; value.i64 = pushee; REPR(obj)->pos_funcs.push(tc, STABLE(obj), obj, OBJECT_BODY(obj), value, MVM_reg_int64); } void MVM_repr_push_n(MVMThreadContext *tc, MVMObject *obj, MVMnum64 pushee) { MVMRegister value; value.n64 = pushee; REPR(obj)->pos_funcs.push(tc, STABLE(obj), obj, OBJECT_BODY(obj), value, MVM_reg_num64); } void MVM_repr_push_s(MVMThreadContext *tc, MVMObject *obj, MVMString *pushee) { MVMRegister value; value.s = pushee; REPR(obj)->pos_funcs.push(tc, STABLE(obj), obj, OBJECT_BODY(obj), value, MVM_reg_str); } void MVM_repr_push_o(MVMThreadContext *tc, MVMObject *obj, MVMObject *pushee) { MVMRegister value; value.o = pushee; REPR(obj)->pos_funcs.push(tc, STABLE(obj), obj, OBJECT_BODY(obj), value, MVM_reg_obj); } void MVM_repr_unshift_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 unshiftee) { MVMRegister value; value.i64 = unshiftee; REPR(obj)->pos_funcs.unshift(tc, STABLE(obj), obj, OBJECT_BODY(obj), value, MVM_reg_int64); } void MVM_repr_unshift_n(MVMThreadContext *tc, MVMObject *obj, MVMnum64 unshiftee) { MVMRegister value; value.n64 = unshiftee; REPR(obj)->pos_funcs.unshift(tc, STABLE(obj), obj, OBJECT_BODY(obj), value, MVM_reg_num64); } void MVM_repr_unshift_s(MVMThreadContext *tc, MVMObject *obj, MVMString *unshiftee) { MVMRegister value; value.s = unshiftee; REPR(obj)->pos_funcs.unshift(tc, STABLE(obj), obj, OBJECT_BODY(obj), value, MVM_reg_str); } void MVM_repr_unshift_o(MVMThreadContext *tc, MVMObject *obj, MVMObject *unshiftee) { MVMRegister value; value.o = unshiftee; REPR(obj)->pos_funcs.unshift(tc, STABLE(obj), obj, OBJECT_BODY(obj), value, MVM_reg_obj); } MVMint64 MVM_repr_pop_i(MVMThreadContext *tc, MVMObject *obj) { MVMRegister value; REPR(obj)->pos_funcs.pop(tc, STABLE(obj), obj, OBJECT_BODY(obj), &value, MVM_reg_int64); return value.i64; } MVMnum64 MVM_repr_pop_n(MVMThreadContext *tc, MVMObject *obj) { MVMRegister value; REPR(obj)->pos_funcs.pop(tc, STABLE(obj), obj, OBJECT_BODY(obj), &value, MVM_reg_num64); return value.n64; } MVMString * MVM_repr_pop_s(MVMThreadContext *tc, MVMObject *obj) { MVMRegister value; REPR(obj)->pos_funcs.pop(tc, STABLE(obj), obj, OBJECT_BODY(obj), &value, MVM_reg_str); return value.s; } MVMObject * MVM_repr_pop_o(MVMThreadContext *tc, MVMObject *obj) { MVMRegister value; REPR(obj)->pos_funcs.pop(tc, STABLE(obj), obj, OBJECT_BODY(obj), &value, MVM_reg_obj); return value.o; } MVMint64 MVM_repr_shift_i(MVMThreadContext *tc, MVMObject *obj) { MVMRegister value; REPR(obj)->pos_funcs.shift(tc, STABLE(obj), obj, OBJECT_BODY(obj), &value, MVM_reg_int64); return value.i64; } MVMnum64 MVM_repr_shift_n(MVMThreadContext *tc, MVMObject *obj) { MVMRegister value; REPR(obj)->pos_funcs.shift(tc, STABLE(obj), obj, OBJECT_BODY(obj), &value, MVM_reg_num64); return value.n64; } MVMString * MVM_repr_shift_s(MVMThreadContext *tc, MVMObject *obj) { MVMRegister value; REPR(obj)->pos_funcs.shift(tc, STABLE(obj), obj, OBJECT_BODY(obj), &value, MVM_reg_str); return value.s; } MVMObject * MVM_repr_shift_o(MVMThreadContext *tc, MVMObject *obj) { MVMRegister value; REPR(obj)->pos_funcs.shift(tc, STABLE(obj), obj, OBJECT_BODY(obj), &value, MVM_reg_obj); return value.o; } MVMint64 MVM_repr_at_key_i(MVMThreadContext *tc, MVMObject *obj, MVMString *key) { MVMRegister value; REPR(obj)->ass_funcs.at_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)key, &value, MVM_reg_int64); return value.i64; } MVMnum64 MVM_repr_at_key_n(MVMThreadContext *tc, MVMObject *obj, MVMString *key) { MVMRegister value; REPR(obj)->ass_funcs.at_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)key, &value, MVM_reg_num64); return value.n64; } MVMString * MVM_repr_at_key_s(MVMThreadContext *tc, MVMObject *obj, MVMString *key) { MVMRegister value; REPR(obj)->ass_funcs.at_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)key, &value, MVM_reg_str); return value.s; } MVMObject * MVM_repr_at_key_o(MVMThreadContext *tc, MVMObject *obj, MVMString *key) { if (IS_CONCRETE(obj)) { MVMRegister value; REPR(obj)->ass_funcs.at_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)key, &value, MVM_reg_obj); return value.o; } return tc->instance->VMNull; } void MVM_repr_bind_key_i(MVMThreadContext *tc, MVMObject *obj, MVMString *key, MVMint64 val) { MVMRegister value; value.i64 = val; REPR(obj)->ass_funcs.bind_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)key, value, MVM_reg_int64); } void MVM_repr_bind_key_n(MVMThreadContext *tc, MVMObject *obj, MVMString *key, MVMnum64 val) { MVMRegister value; value.n64 = val; REPR(obj)->ass_funcs.bind_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)key, value, MVM_reg_num64); } void MVM_repr_bind_key_s(MVMThreadContext *tc, MVMObject *obj, MVMString *key, MVMString *val) { MVMRegister value; value.s = val; REPR(obj)->ass_funcs.bind_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)key, value, MVM_reg_str); } void MVM_repr_bind_key_o(MVMThreadContext *tc, MVMObject *obj, MVMString *key, MVMObject *val) { MVMRegister value; value.o = val; REPR(obj)->ass_funcs.bind_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)key, value, MVM_reg_obj); } MVMint64 MVM_repr_exists_key(MVMThreadContext *tc, MVMObject *obj, MVMString *key) { return REPR(obj)->ass_funcs.exists_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)key); } void MVM_repr_delete_key(MVMThreadContext *tc, MVMObject *obj, MVMString *key) { REPR(obj)->ass_funcs.delete_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)key); } MVMuint64 MVM_repr_elems(MVMThreadContext *tc, MVMObject *obj) { return REPR(obj)->elems(tc, STABLE(obj), obj, OBJECT_BODY(obj)); } MVMObject * MVM_repr_dimensions(MVMThreadContext *tc, MVMObject *obj) { if (IS_CONCRETE(obj)) { MVMint64 num_dims, i; MVMint64 *dims; MVMObject *result = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTIntArray); REPR(obj)->pos_funcs.dimensions(tc, STABLE(obj), obj, OBJECT_BODY(obj), &num_dims, &dims); for (i = 0; i < num_dims; i++) MVM_repr_bind_pos_i(tc, result, i, dims[i]); return result; } else { MVM_exception_throw_adhoc(tc, "Cannot get dimensions of a type object"); } } MVMint64 MVM_repr_num_dimensions(MVMThreadContext *tc, MVMObject *obj) { if (IS_CONCRETE(obj)) { MVMint64 num_dims; MVMint64 *_; REPR(obj)->pos_funcs.dimensions(tc, STABLE(obj), obj, OBJECT_BODY(obj), &num_dims, &_); return num_dims; } else { MVM_exception_throw_adhoc(tc, "Cannot get number of dimensions of a type object"); } } MVMint64 MVM_repr_get_int(MVMThreadContext *tc, MVMObject *obj) { if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot unbox a type object (%s) to int.", MVM_6model_get_debug_name(tc, obj)); return REPR(obj)->box_funcs.get_int(tc, STABLE(obj), obj, OBJECT_BODY(obj)); } MVMnum64 MVM_repr_get_num(MVMThreadContext *tc, MVMObject *obj) { if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot unbox a type object (%s) to a num.", MVM_6model_get_debug_name(tc, obj)); return REPR(obj)->box_funcs.get_num(tc, STABLE(obj), obj, OBJECT_BODY(obj)); } MVMString * MVM_repr_get_str(MVMThreadContext *tc, MVMObject *obj) { if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot unbox a type object (%s) to a str.", MVM_6model_get_debug_name(tc, obj)); return REPR(obj)->box_funcs.get_str(tc, STABLE(obj), obj, OBJECT_BODY(obj)); } MVMuint64 MVM_repr_get_uint(MVMThreadContext *tc, MVMObject *obj) { if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot unbox a type object (%s) to an unsigned int.", MVM_6model_get_debug_name(tc, obj)); return REPR(obj)->box_funcs.get_uint(tc, STABLE(obj), obj, OBJECT_BODY(obj)); } void MVM_repr_set_int(MVMThreadContext *tc, MVMObject *obj, MVMint64 val) { REPR(obj)->box_funcs.set_int(tc, STABLE(obj), obj, OBJECT_BODY(obj), val); } void MVM_repr_set_num(MVMThreadContext *tc, MVMObject *obj, MVMnum64 val) { REPR(obj)->box_funcs.set_num(tc, STABLE(obj), obj, OBJECT_BODY(obj), val); } void MVM_repr_set_str(MVMThreadContext *tc, MVMObject *obj, MVMString *val) { REPR(obj)->box_funcs.set_str(tc, STABLE(obj), obj, OBJECT_BODY(obj), val); } void MVM_repr_set_uint(MVMThreadContext *tc, MVMObject *obj, MVMuint64 val) { REPR(obj)->box_funcs.set_uint(tc, STABLE(obj), obj, OBJECT_BODY(obj), val); } MVMObject * MVM_repr_box_int(MVMThreadContext *tc, MVMObject *type, MVMint64 val) { MVMObject *res; res = MVM_intcache_get(tc, type, val); if (res == 0) { res = MVM_repr_alloc_init(tc, type); MVM_repr_set_int(tc, res, val); } return res; } MVMObject * MVM_repr_box_num(MVMThreadContext *tc, MVMObject *type, MVMnum64 val) { MVMObject *res = MVM_repr_alloc_init(tc, type); MVM_repr_set_num(tc, res, val); return res; } MVMObject * MVM_repr_box_str(MVMThreadContext *tc, MVMObject *type, MVMString *val) { MVMObject *res; MVMROOT(tc, val, { res = MVM_repr_alloc_init(tc, type); MVM_repr_set_str(tc, res, val); }); return res; } MVMObject * MVM_repr_box_uint(MVMThreadContext *tc, MVMObject *type, MVMuint64 val) { MVMObject *res = MVM_repr_alloc_init(tc, type); MVM_repr_set_uint(tc, res, val); return res; } MVM_PUBLIC MVMint64 MVM_repr_get_attr_i(MVMThreadContext *tc, MVMObject *object, MVMObject *type, MVMString *name, MVMint16 hint) { MVMRegister result_reg; if (!IS_CONCRETE(object)) MVM_exception_throw_adhoc(tc, "Cannot look up attributes in a %s type object", MVM_6model_get_debug_name(tc, object)); REPR(object)->attr_funcs.get_attribute(tc, STABLE(object), object, OBJECT_BODY(object), type, name, hint, &result_reg, MVM_reg_int64); return result_reg.i64; } MVM_PUBLIC MVMnum64 MVM_repr_get_attr_n(MVMThreadContext *tc, MVMObject *object, MVMObject *type, MVMString *name, MVMint16 hint) { MVMRegister result_reg; if (!IS_CONCRETE(object)) MVM_exception_throw_adhoc(tc, "Cannot look up attributes in a %s type object", MVM_6model_get_debug_name(tc, object)); REPR(object)->attr_funcs.get_attribute(tc, STABLE(object), object, OBJECT_BODY(object), type, name, hint, &result_reg, MVM_reg_num64); return result_reg.n64; } MVM_PUBLIC MVMString * MVM_repr_get_attr_s(MVMThreadContext *tc, MVMObject *object, MVMObject *type, MVMString *name, MVMint16 hint) { MVMRegister result_reg; if (!IS_CONCRETE(object)) MVM_exception_throw_adhoc(tc, "Cannot look up attributes in a %s type object", MVM_6model_get_debug_name(tc, object)); REPR(object)->attr_funcs.get_attribute(tc, STABLE(object), object, OBJECT_BODY(object), type, name, hint, &result_reg, MVM_reg_str); return result_reg.s; } MVM_PUBLIC MVMObject * MVM_repr_get_attr_o(MVMThreadContext *tc, MVMObject *object, MVMObject *type, MVMString *name, MVMint16 hint) { MVMRegister result_reg; if (!IS_CONCRETE(object)) MVM_exception_throw_adhoc(tc, "Cannot look up attributes in a %s type object", MVM_6model_get_debug_name(tc, object)); REPR(object)->attr_funcs.get_attribute(tc, STABLE(object), object, OBJECT_BODY(object), type, name, hint, &result_reg, MVM_reg_obj); return result_reg.o; } MVM_PUBLIC void MVM_repr_bind_attr_inso(MVMThreadContext *tc, MVMObject *object, MVMObject *type, MVMString *name, MVMint16 hint, MVMRegister value_reg, MVMuint16 kind) { if (!IS_CONCRETE(object)) MVM_exception_throw_adhoc(tc, "Cannot bind attributes in a %s type object", MVM_6model_get_debug_name(tc, object)); REPR(object)->attr_funcs.bind_attribute(tc, STABLE(object), object, OBJECT_BODY(object), type, name, hint, value_reg, kind); MVM_SC_WB_OBJ(tc, object); } MVM_PUBLIC MVMint64 MVM_repr_attribute_inited(MVMThreadContext *tc, MVMObject *obj, MVMObject *type, MVMString *name) { if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot look up attributes in a %s type object", MVM_6model_get_debug_name(tc, obj)); return REPR(obj)->attr_funcs.is_attribute_initialized(tc, STABLE(obj), OBJECT_BODY(obj), type, name, MVM_NO_HINT); } MVM_PUBLIC MVMint64 MVM_repr_compare_repr_id(MVMThreadContext *tc, MVMObject *object, MVMuint32 REPRId) { return object && REPR(object)->ID == REPRId ? 1 : 0; } MVM_PUBLIC MVMint64 MVM_repr_hint_for(MVMThreadContext *tc, MVMObject *object, MVMString *attrname) { return REPR(object)->attr_funcs.hint_for(tc, STABLE(object), object, attrname); } MoarVM-2018.03/src/6model/reprconv.h0000644000175000017510000002460113237701240017171 0ustar samanthasamanthavoid MVM_repr_init(MVMThreadContext *tc, MVMObject *obj); MVM_PUBLIC MVMObject * MVM_repr_alloc(MVMThreadContext *tc, MVMObject *type); MVM_PUBLIC MVMObject * MVM_repr_alloc_init(MVMThreadContext *tc, MVMObject *type); MVM_PUBLIC MVMObject * MVM_repr_clone(MVMThreadContext *tc, MVMObject *obj); void MVM_repr_compose(MVMThreadContext *tc, MVMObject *type, MVMObject *obj); MVM_PUBLIC void MVM_repr_pos_set_elems(MVMThreadContext *tc, MVMObject *obj, MVMint64 elems); void MVM_repr_populate_indices_array(MVMThreadContext *tc, MVMObject *arr, MVMint64 *elems); MVM_PUBLIC void MVM_repr_set_dimensions(MVMThreadContext *tc, MVMObject *obj, MVMObject *dims); MVM_PUBLIC void MVM_repr_pos_splice(MVMThreadContext *tc, MVMObject *obj, MVMObject *replacement, MVMint64 offset, MVMint64 count); MVM_PUBLIC MVMint64 MVM_repr_at_pos_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx); MVM_PUBLIC MVMnum64 MVM_repr_at_pos_n(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx); MVM_PUBLIC MVMString * MVM_repr_at_pos_s(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx); MVM_PUBLIC MVMObject * MVM_repr_at_pos_o(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx); MVM_PUBLIC MVMint64 MVM_repr_at_pos_multidim_i(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices); MVM_PUBLIC MVMnum64 MVM_repr_at_pos_multidim_n(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices); MVM_PUBLIC MVMString * MVM_repr_at_pos_multidim_s(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices); MVM_PUBLIC MVMObject * MVM_repr_at_pos_multidim_o(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices); MVM_PUBLIC MVMint64 MVM_repr_at_pos_2d_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2); MVM_PUBLIC MVMnum64 MVM_repr_at_pos_2d_n(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2); MVM_PUBLIC MVMString * MVM_repr_at_pos_2d_s(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2); MVM_PUBLIC MVMObject * MVM_repr_at_pos_2d_o(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2); MVM_PUBLIC MVMint64 MVM_repr_at_pos_3d_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3); MVM_PUBLIC MVMnum64 MVM_repr_at_pos_3d_n(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3); MVM_PUBLIC MVMString * MVM_repr_at_pos_3d_s(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3); MVM_PUBLIC MVMObject * MVM_repr_at_pos_3d_o(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3); MVM_PUBLIC MVMint64 MVM_repr_exists_pos(MVMThreadContext *tc, MVMObject *obj, MVMint64 index); MVM_PUBLIC void MVM_repr_bind_pos_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx, MVMint64 value); MVM_PUBLIC void MVM_repr_bind_pos_n(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx, MVMnum64 value); MVM_PUBLIC void MVM_repr_bind_pos_s(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx, MVMString *value); MVM_PUBLIC void MVM_repr_bind_pos_o(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx, MVMObject *value); MVM_PUBLIC void MVM_repr_bind_pos_multidim_i(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices, MVMint64 value); MVM_PUBLIC void MVM_repr_bind_pos_multidim_n(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices, MVMnum64 value); MVM_PUBLIC void MVM_repr_bind_pos_multidim_s(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices, MVMString *value); MVM_PUBLIC void MVM_repr_bind_pos_multidim_o(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices, MVMObject *value); MVM_PUBLIC void MVM_repr_bind_pos_2d_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 value); MVM_PUBLIC void MVM_repr_bind_pos_2d_n(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMnum64 value); MVM_PUBLIC void MVM_repr_bind_pos_2d_s(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMString *value); MVM_PUBLIC void MVM_repr_bind_pos_2d_o(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMObject *value); MVM_PUBLIC void MVM_repr_bind_pos_3d_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3, MVMint64 value); MVM_PUBLIC void MVM_repr_bind_pos_3d_n(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3, MVMnum64 value); MVM_PUBLIC void MVM_repr_bind_pos_3d_s(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3, MVMString *value); MVM_PUBLIC void MVM_repr_bind_pos_3d_o(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx1, MVMint64 idx2, MVMint64 idx3, MVMObject *value); MVM_PUBLIC void MVM_repr_push_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 pushee); MVM_PUBLIC void MVM_repr_push_n(MVMThreadContext *tc, MVMObject *obj, MVMnum64 pushee); MVM_PUBLIC void MVM_repr_push_s(MVMThreadContext *tc, MVMObject *obj, MVMString *pushee); MVM_PUBLIC void MVM_repr_push_o(MVMThreadContext *tc, MVMObject *obj, MVMObject *pushee); MVM_PUBLIC void MVM_repr_unshift_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 unshiftee); MVM_PUBLIC void MVM_repr_unshift_n(MVMThreadContext *tc, MVMObject *obj, MVMnum64 unshiftee); MVM_PUBLIC void MVM_repr_unshift_s(MVMThreadContext *tc, MVMObject *obj, MVMString *unshiftee); MVM_PUBLIC void MVM_repr_unshift_o(MVMThreadContext *tc, MVMObject *obj, MVMObject *unshiftee); MVM_PUBLIC MVMint64 MVM_repr_pop_i(MVMThreadContext *tc, MVMObject *obj); MVM_PUBLIC MVMnum64 MVM_repr_pop_n(MVMThreadContext *tc, MVMObject *obj); MVM_PUBLIC MVMString * MVM_repr_pop_s(MVMThreadContext *tc, MVMObject *obj); MVM_PUBLIC MVMObject * MVM_repr_pop_o(MVMThreadContext *tc, MVMObject *obj); MVM_PUBLIC MVMint64 MVM_repr_shift_i(MVMThreadContext *tc, MVMObject *obj); MVM_PUBLIC MVMnum64 MVM_repr_shift_n(MVMThreadContext *tc, MVMObject *obj); MVM_PUBLIC MVMString * MVM_repr_shift_s(MVMThreadContext *tc, MVMObject *obj); MVM_PUBLIC MVMObject * MVM_repr_shift_o(MVMThreadContext *tc, MVMObject *obj); MVM_PUBLIC MVMint64 MVM_repr_at_key_i(MVMThreadContext *tc, MVMObject *obj, MVMString *key); MVM_PUBLIC MVMnum64 MVM_repr_at_key_n(MVMThreadContext *tc, MVMObject *obj, MVMString *key); MVM_PUBLIC MVMString * MVM_repr_at_key_s(MVMThreadContext *tc, MVMObject *obj, MVMString *key); MVM_PUBLIC MVMObject * MVM_repr_at_key_o(MVMThreadContext *tc, MVMObject *obj, MVMString *key); MVM_PUBLIC void MVM_repr_bind_key_i(MVMThreadContext *tc, MVMObject *obj, MVMString *key, MVMint64 val); MVM_PUBLIC void MVM_repr_bind_key_n(MVMThreadContext *tc, MVMObject *obj, MVMString *key, MVMnum64 val); MVM_PUBLIC void MVM_repr_bind_key_s(MVMThreadContext *tc, MVMObject *obj, MVMString *key, MVMString *val); MVM_PUBLIC void MVM_repr_bind_key_o(MVMThreadContext *tc, MVMObject *obj, MVMString *key, MVMObject *val); MVM_PUBLIC MVMint64 MVM_repr_exists_key(MVMThreadContext *tc, MVMObject *obj, MVMString *key); MVM_PUBLIC void MVM_repr_delete_key(MVMThreadContext *tc, MVMObject *obj, MVMString *key); MVM_PUBLIC MVMuint64 MVM_repr_elems(MVMThreadContext *tc, MVMObject *obj); MVM_PUBLIC MVMObject * MVM_repr_dimensions(MVMThreadContext *tc, MVMObject *obj); MVM_PUBLIC MVMint64 MVM_repr_num_dimensions(MVMThreadContext *tc, MVMObject *obj); MVM_PUBLIC MVMint64 MVM_repr_get_int(MVMThreadContext *tc, MVMObject *obj); MVM_PUBLIC MVMnum64 MVM_repr_get_num(MVMThreadContext *tc, MVMObject *obj); MVM_PUBLIC MVMString * MVM_repr_get_str(MVMThreadContext *tc, MVMObject *obj); MVM_PUBLIC MVMuint64 MVM_repr_get_uint(MVMThreadContext *tc, MVMObject *obj); MVM_PUBLIC void MVM_repr_set_int(MVMThreadContext *tc, MVMObject *obj, MVMint64 val); MVM_PUBLIC void MVM_repr_set_num(MVMThreadContext *tc, MVMObject *obj, MVMnum64 val); MVM_PUBLIC void MVM_repr_set_str(MVMThreadContext *tc, MVMObject *obj, MVMString *val); MVM_PUBLIC void MVM_repr_set_uint(MVMThreadContext *tc, MVMObject *obj, MVMuint64 val); MVM_PUBLIC MVMObject * MVM_repr_box_int(MVMThreadContext *tc, MVMObject *type, MVMint64 val); MVM_PUBLIC MVMObject * MVM_repr_box_num(MVMThreadContext *tc, MVMObject *type, MVMnum64 val); MVM_PUBLIC MVMObject * MVM_repr_box_str(MVMThreadContext *tc, MVMObject *type, MVMString *val); MVM_PUBLIC MVMObject * MVM_repr_box_uint(MVMThreadContext *tc, MVMObject *type, MVMuint64 val); MVM_PUBLIC MVMint64 MVM_repr_get_attr_i(MVMThreadContext *tc, MVMObject *object, MVMObject *type, MVMString *name, MVMint16 hint); MVM_PUBLIC MVMnum64 MVM_repr_get_attr_n(MVMThreadContext *tc, MVMObject *object, MVMObject *type, MVMString *name, MVMint16 hint); MVM_PUBLIC MVMString * MVM_repr_get_attr_s(MVMThreadContext *tc, MVMObject *object, MVMObject *type, MVMString *name, MVMint16 hint); MVM_PUBLIC MVMObject * MVM_repr_get_attr_o(MVMThreadContext *tc, MVMObject *object, MVMObject *type, MVMString *name, MVMint16 hint); MVM_PUBLIC void MVM_repr_bind_attr_inso(MVMThreadContext *tc, MVMObject *object, MVMObject *type, MVMString *name, MVMint16 hint, MVMRegister value_reg, MVMuint16 kind); MVM_PUBLIC MVMint64 MVM_repr_attribute_inited(MVMThreadContext *tc, MVMObject *object, MVMObject *type, MVMString *name); MVM_PUBLIC MVMint64 MVM_repr_compare_repr_id(MVMThreadContext *tc, MVMObject *object, MVMuint32 REPRId); MVM_PUBLIC MVMint64 MVM_repr_hint_for(MVMThreadContext *tc, MVMObject *object, MVMString *attrname); #define MVM_repr_at_key_int(tc, obj, key) \ MVM_repr_get_int((tc), MVM_repr_at_key_o((tc), (obj), (key))) #define MVM_repr_at_key_num(tc, obj, key) \ MVM_repr_get_num((tc), MVM_repr_at_key_o((tc), (obj), (key))) #define MVM_repr_at_key_str(tc, obj, key) \ MVM_repr_get_str((tc), MVM_repr_at_key_o((tc), (obj), (key))) #define MVM_repr_bind_key_int(tc, obj, key, val) do { \ MVMObject *boxed = MVM_repr_box_int((tc), (*((tc)->interp_cu))->body.hll_config->int_box_type, (val)); \ MVM_repr_bind_key_o((tc), (obj), (key), boxed); \ } while (0) #define MVM_repr_bind_key_num(tc, obj, key, val) do {\ MVMObject *boxed = MVM_repr_box_int((tc), (*((tc)->interp_cu))->body.hll_config->num_box_type, (val)); \ MVM_repr_bind_key_o((tc), (obj), (key), boxed); \ } while (0) #define MVM_repr_bind_key_str(tc, obj, key, val) do {\ MVMObject *boxed = MVM_repr_box_int((tc), (*((tc)->interp_cu))->body.hll_config->str_box_type, (val)); \ MVM_repr_bind_key_o((tc), (obj), (key), boxed); \ } while (0) MoarVM-2018.03/src/6model/reprs.c0000644000175000017510000003467213237701240016472 0ustar samanthasamantha#include "moar.h" #include "gcc_diag.h" /* Default REPR function handlers. */ GCC_DIAG_OFF(return-type) MVMuint64 MVM_REPR_DEFAULT_ELEMS(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVM_exception_throw_adhoc(tc, "This representation (%s) does not support elems (for type %s)", st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } GCC_DIAG_ON(return-type) MVM_NO_RETURN static void die_no_attrs(MVMThreadContext *tc, const char *repr_name, const char *debug_name) MVM_NO_RETURN_GCC; static void die_no_attrs(MVMThreadContext *tc, const char *repr_name, const char *debug_name) { MVM_exception_throw_adhoc(tc, "This representation (%s) does not support attribute storage (for type %s)", repr_name, debug_name); } void MVM_REPR_DEFAULT_GET_ATTRIBUTE(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister *result, MVMuint16 kind) { die_no_attrs(tc, st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } void MVM_REPR_DEFAULT_BIND_ATTRIBUTE(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister value, MVMuint16 kind) { die_no_attrs(tc, st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } GCC_DIAG_OFF(return-type) MVMint64 MVM_REPR_DEFAULT_IS_ATTRIBUTE_INITIALIZED(MVMThreadContext *tc, MVMSTable *st, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint) { die_no_attrs(tc, st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } AO_t * MVM_REPR_DEFAULT_ATTRIBUTE_AS_ATOMIC(MVMThreadContext *tc, MVMSTable *st, void *data, MVMObject *class_handle, MVMString *name) { die_no_attrs(tc, st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } GCC_DIAG_ON(return-type) MVMint64 MVM_REPR_DEFAULT_HINT_FOR(MVMThreadContext *tc, MVMSTable *st, MVMObject *class_handle, MVMString *name) { return MVM_NO_HINT; } void MVM_REPR_DEFAULT_SET_INT(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 value) { MVM_exception_throw_adhoc(tc, "This representation (%s) cannot box a native int (for type %s)", st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } MVMint64 MVM_REPR_DEFAULT_GET_INT(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVM_exception_throw_adhoc(tc, "This representation (%s) cannot unbox to a native int (for type %s)", st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } void MVM_REPR_DEFAULT_SET_NUM(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMnum64 value) { MVM_exception_throw_adhoc(tc, "This representation (%s) cannot box a native num (for type %s)", st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } MVMnum64 MVM_REPR_DEFAULT_GET_NUM(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVM_exception_throw_adhoc(tc, "This representation (%s) cannot unbox to a native num (for type %s)", st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } void MVM_REPR_DEFAULT_SET_STR(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMString *value) { MVM_exception_throw_adhoc(tc, "This representation (%s) cannot box a native string (for type %s)", st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } MVMString * MVM_REPR_DEFAULT_GET_STR(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVM_exception_throw_adhoc(tc, "This representation (%s) cannot unbox to a native string (for type %s)", st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } void MVM_REPR_DEFAULT_SET_UINT(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMuint64 value) { MVM_exception_throw_adhoc(tc, "This representation (%s) cannot box an unsigned native int (for type %s)", st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } MVMuint64 MVM_REPR_DEFAULT_GET_UINT(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVM_exception_throw_adhoc(tc, "This representation (%s) cannot unbox to an unsigned native int (for type %s)", st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } void * MVM_REPR_DEFAULT_GET_BOXED_REF(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMuint32 repr_id) { MVM_exception_throw_adhoc(tc, "This representation (%s) cannot unbox to other types (for type %s)", st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } MVM_NO_RETURN static void die_no_pos(MVMThreadContext *tc, const char *repr_name, const char *debug_name) MVM_NO_RETURN_GCC; static void die_no_pos(MVMThreadContext *tc, const char *repr_name, const char *debug_name) { MVM_exception_throw_adhoc(tc, "This representation (%s) does not support positional access (for type %s)", repr_name, debug_name); } void MVM_REPR_DEFAULT_AT_POS(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister *value, MVMuint16 kind) { die_no_pos(tc, st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } void MVM_REPR_DEFAULT_BIND_POS(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister value, MVMuint16 kind) { die_no_pos(tc, st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } void MVM_REPR_DEFAULT_SET_ELEMS(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMuint64 count) { die_no_pos(tc, st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } void MVM_REPR_DEFAULT_PUSH(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister value, MVMuint16 kind) { die_no_pos(tc, st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } void MVM_REPR_DEFAULT_POP(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind) { die_no_pos(tc, st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } void MVM_REPR_DEFAULT_UNSHIFT(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister value, MVMuint16 kind) { die_no_pos(tc, st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } void MVM_REPR_DEFAULT_SHIFT(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind) { die_no_pos(tc, st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } void MVM_REPR_DEFAULT_AT_POS_MULTIDIM(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_indices, MVMint64 *indices, MVMRegister *value, MVMuint16 kind) { die_no_pos(tc, st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } void MVM_REPR_DEFAULT_BIND_POS_MULTIDIM(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_indices, MVMint64 *indices, MVMRegister value, MVMuint16 kind) { die_no_pos(tc, st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } void MVM_REPR_DEFAULT_DIMENSIONS(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 *num_dimensions, MVMint64 **dimensions) { die_no_pos(tc, st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } void MVM_REPR_DEFAULT_SET_DIMENSIONS(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_dimensions, MVMint64 *dimensions) { die_no_pos(tc, st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } GCC_DIAG_OFF(return-type) MVMStorageSpec MVM_REPR_DEFAULT_GET_ELEM_STORAGE_SPEC(MVMThreadContext *tc, MVMSTable *st) { die_no_pos(tc, st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } AO_t * MVM_REPR_DEFAULT_POS_AS_ATOMIC(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index) { die_no_pos(tc, st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } AO_t * MVM_REPR_DEFAULT_POS_AS_ATOMIC_MULTIDIM(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_indices, MVMint64 *indices) { die_no_pos(tc, st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } GCC_DIAG_ON(return-type) void MVM_REPR_DEFAULT_SPLICE(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *target_array, MVMint64 offset, MVMuint64 elems) { die_no_pos(tc, st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } MVM_NO_RETURN static void die_no_ass(MVMThreadContext *tc, const char *repr_name, const char *debug_name) MVM_NO_RETURN_GCC; static void die_no_ass(MVMThreadContext *tc, const char *repr_name, const char *debug_name) { MVM_exception_throw_adhoc(tc, "This representation (%s) does not support associative access (for type %s)", repr_name, debug_name); } void MVM_REPR_DEFAULT_AT_KEY(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key, MVMRegister *result, MVMuint16 kind) { die_no_ass(tc, st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } void MVM_REPR_DEFAULT_BIND_KEY(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key, MVMRegister value, MVMuint16 kind) { die_no_ass(tc, st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } GCC_DIAG_OFF(return-type) MVMint64 MVM_REPR_DEFAULT_EXISTS_KEY(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key) { die_no_ass(tc, st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } GCC_DIAG_ON(return-type) void MVM_REPR_DEFAULT_DELETE_KEY(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key) { die_no_ass(tc, st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } GCC_DIAG_OFF(return-type) MVMStorageSpec MVM_REPR_DEFAULT_GET_VALUE_STORAGE_SPEC(MVMThreadContext *tc, MVMSTable *st) { die_no_ass(tc, st->REPR->name, MVM_6model_get_stable_debug_name(tc, st)); } GCC_DIAG_ON(return-type) /* Registers a representation. */ static void register_repr(MVMThreadContext *tc, const MVMREPROps *repr, MVMString *name) { MVMReprRegistry *entry; if (!name) name = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, repr->name); /* Fill a registry entry. */ entry = MVM_malloc(sizeof(MVMReprRegistry)); entry->name = name; entry->repr = repr; /* Enter into registry. */ tc->instance->repr_list[repr->ID] = entry; MVM_HASH_BIND(tc, tc->instance->repr_hash, name, entry); /* Name and hash key should become a permanent GC root. */ MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->name, "REPR name"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->hash_handle.key, "REPR registry hash key"); } int MVM_repr_register_dynamic_repr(MVMThreadContext *tc, MVMREPROps *repr) { MVMReprRegistry *entry; MVMString *name; uv_mutex_lock(&tc->instance->mutex_repr_registry); name = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, repr->name); MVM_HASH_GET(tc, tc->instance->repr_hash, name, entry); if (entry) { uv_mutex_unlock(&tc->instance->mutex_repr_registry); return 0; } if (!(tc->instance->num_reprs < MVM_REPR_MAX_COUNT)) { uv_mutex_unlock(&tc->instance->mutex_repr_registry); MVM_exception_throw_adhoc(tc, "Cannot register more than %u representations", MVM_REPR_MAX_COUNT); } repr->ID = tc->instance->num_reprs++; register_repr(tc, repr, name); uv_mutex_unlock(&tc->instance->mutex_repr_registry); return 1; } #define register_core_repr(name) \ register_repr(tc, MVM##name##_initialize(tc), NULL) /* Initializes the representations registry, building up all of the various * representations. */ void MVM_repr_initialize_registry(MVMThreadContext *tc) { tc->instance->repr_list = MVM_malloc( MVM_REPR_MAX_COUNT * sizeof *tc->instance->repr_list); /* Add all core representations. */ register_core_repr(String); register_core_repr(Array); register_core_repr(Hash); register_core_repr(CFunction); register_core_repr(KnowHOWREPR); register_core_repr(P6opaque); register_core_repr(Code); register_core_repr(OSHandle); register_core_repr(P6int); register_core_repr(P6num); register_core_repr(Uninstantiable); register_core_repr(HashAttrStore); register_core_repr(KnowHOWAttributeREPR); register_core_repr(P6str); register_core_repr(Thread); register_core_repr(Iter); register_core_repr(Context); register_core_repr(SCRef); register_core_repr(CallCapture); register_core_repr(P6bigint); register_core_repr(NFA); register_core_repr(Exception); register_core_repr(StaticFrame); register_core_repr(CompUnit); register_core_repr(DLLSym); register_core_repr(MultiCache); register_core_repr(Continuation); register_core_repr(NativeCall); register_core_repr(CPointer); register_core_repr(CStr); register_core_repr(CArray); register_core_repr(CStruct); register_core_repr(CUnion); register_core_repr(ReentrantMutex); register_core_repr(ConditionVariable); register_core_repr(Semaphore); register_core_repr(ConcBlockingQueue); register_core_repr(AsyncTask); register_core_repr(Null); register_core_repr(CPPStruct); register_core_repr(NativeRef); register_core_repr(MultiDimArray); register_core_repr(Decoder); register_core_repr(SpeshLog); register_core_repr(StaticFrameSpesh); tc->instance->num_reprs = MVM_REPR_CORE_COUNT; } static MVMReprRegistry * find_repr_by_name(MVMThreadContext *tc, MVMString *name) { MVMReprRegistry *entry; MVM_HASH_GET(tc, tc->instance->repr_hash, name, entry) if (entry == NULL) { char *c_name = MVM_string_ascii_encode_any(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Lookup by name of unknown REPR: %s", c_name); } return entry; } /* Get a representation's ID from its name. Note that the IDs may change so * it's best not to store references to them in e.g. the bytecode stream. */ MVMuint32 MVM_repr_name_to_id(MVMThreadContext *tc, MVMString *name) { return find_repr_by_name(tc, name)->repr->ID; } /* Gets a representation by ID. */ const MVMREPROps * MVM_repr_get_by_id(MVMThreadContext *tc, MVMuint32 id) { if (id >= tc->instance->num_reprs) MVM_exception_throw_adhoc(tc, "REPR lookup by invalid ID %" PRIu32, id); return tc->instance->repr_list[id]->repr; } /* Gets a representation by name. */ const MVMREPROps * MVM_repr_get_by_name(MVMThreadContext *tc, MVMString *name) { return find_repr_by_name(tc, name)->repr; } MoarVM-2018.03/src/6model/reprs.h0000644000175000017510000002611313237701240016466 0ustar samanthasamantha/* Pull in all of the core REPRs. */ #include "6model/reprs/MVMString.h" #include "6model/reprs/VMArray.h" #include "6model/reprs/MVMHash.h" #include "6model/reprs/MVMCFunction.h" #include "6model/reprs/KnowHOWREPR.h" #include "6model/reprs/P6opaque.h" #include "6model/reprs/MVMCode.h" #include "6model/reprs/MVMOSHandle.h" #include "6model/reprs/P6int.h" #include "6model/reprs/P6num.h" #include "6model/reprs/Uninstantiable.h" #include "6model/reprs/HashAttrStore.h" #include "6model/reprs/KnowHOWAttributeREPR.h" #include "6model/reprs/P6str.h" #include "6model/reprs/MVMThread.h" #include "6model/reprs/MVMIter.h" #include "6model/reprs/MVMContext.h" #include "6model/reprs/SCRef.h" #include "6model/reprs/MVMCallCapture.h" #include "6model/reprs/P6bigint.h" #include "6model/reprs/NFA.h" #include "6model/reprs/MVMException.h" #include "6model/reprs/MVMStaticFrame.h" #include "6model/reprs/MVMCompUnit.h" #include "6model/reprs/MVMDLLSym.h" #include "6model/reprs/MVMMultiCache.h" #include "6model/reprs/MVMContinuation.h" #include "6model/reprs/NativeCall.h" #include "6model/reprs/CPointer.h" #include "6model/reprs/CStr.h" #include "6model/reprs/CArray.h" #include "6model/reprs/CStruct.h" #include "6model/reprs/CUnion.h" #include "6model/reprs/ReentrantMutex.h" #include "6model/reprs/ConditionVariable.h" #include "6model/reprs/Semaphore.h" #include "6model/reprs/ConcBlockingQueue.h" #include "6model/reprs/MVMAsyncTask.h" #include "6model/reprs/MVMNull.h" #include "6model/reprs/CPPStruct.h" #include "6model/reprs/NativeRef.h" #include "6model/reprs/MultiDimArray.h" #include "6model/reprs/Decoder.h" #include "6model/reprs/MVMSpeshLog.h" #include "6model/reprs/MVMStaticFrameSpesh.h" /* REPR related functions. */ void MVM_repr_initialize_registry(MVMThreadContext *tc); MVMuint32 MVM_repr_name_to_id(MVMThreadContext *tc, MVMString *name); const MVMREPROps * MVM_repr_get_by_id(MVMThreadContext *tc, MVMuint32 id); const MVMREPROps * MVM_repr_get_by_name(MVMThreadContext *tc, MVMString *name); /* Core representation IDs (determined by the order we add them * to the registery in reprs.c). */ #define MVM_REPR_ID_MVMString 0 #define MVM_REPR_ID_VMArray 1 #define MVM_REPR_ID_MVMHash 2 #define MVM_REPR_ID_MVMCFunction 3 #define MVM_REPR_ID_KnowHOWREPR 4 #define MVM_REPR_ID_P6opaque 5 #define MVM_REPR_ID_MVMCode 6 #define MVM_REPR_ID_MVMOSHandle 7 #define MVM_REPR_ID_P6int 8 #define MVM_REPR_ID_P6num 9 #define MVM_REPR_ID_Uninstantiable 10 #define MVM_REPR_ID_HashAttrStore 11 #define MVM_REPR_ID_KnowHOWAttributeREPR 12 #define MVM_REPR_ID_P6str 13 #define MVM_REPR_ID_MVMThread 14 #define MVM_REPR_ID_MVMIter 15 #define MVM_REPR_ID_MVMContext 16 #define MVM_REPR_ID_SCRef 17 #define MVM_REPR_ID_MVMSpeshLog 18 #define MVM_REPR_ID_MVMCallCapture 19 #define MVM_REPR_ID_P6bigint 20 #define MVM_REPR_ID_NFA 21 #define MVM_REPR_ID_MVMException 22 #define MVM_REPR_ID_MVMStaticFrame 23 #define MVM_REPR_ID_MVMCompUnit 24 #define MVM_REPR_ID_MVMDLLSym 25 #define MVM_REPR_ID_MVMMultiCache 26 #define MVM_REPR_ID_MVMContinuation 27 #define MVM_REPR_ID_MVMNativeCall 28 #define MVM_REPR_ID_MVMCPointer 29 #define MVM_REPR_ID_MVMCStr 30 #define MVM_REPR_ID_MVMCArray 31 #define MVM_REPR_ID_MVMCStruct 32 #define MVM_REPR_ID_ReentrantMutex 33 #define MVM_REPR_ID_ConditionVariable 34 #define MVM_REPR_ID_Semaphore 35 #define MVM_REPR_ID_ConcBlockingQueue 36 #define MVM_REPR_ID_MVMAsyncTask 37 #define MVM_REPR_ID_MVMNull 38 #define MVM_REPR_ID_NativeRef 39 #define MVM_REPR_ID_MVMCUnion 40 #define MVM_REPR_ID_MultiDimArray 41 #define MVM_REPR_ID_MVMCPPStruct 42 #define MVM_REPR_ID_Decoder 43 #define MVM_REPR_ID_MVMStaticFrameSpesh 44 #define MVM_REPR_CORE_COUNT 45 #define MVM_REPR_MAX_COUNT 64 /* Default attribute functions for a REPR that lacks them. */ #define MVM_REPR_DEFAULT_ATTR_FUNCS \ { \ MVM_REPR_DEFAULT_GET_ATTRIBUTE, \ MVM_REPR_DEFAULT_BIND_ATTRIBUTE, \ MVM_REPR_DEFAULT_HINT_FOR, \ MVM_REPR_DEFAULT_IS_ATTRIBUTE_INITIALIZED, \ MVM_REPR_DEFAULT_ATTRIBUTE_AS_ATOMIC \ } /* Default boxing functions for a REPR that lacks them. */ #define MVM_REPR_DEFAULT_BOX_FUNCS \ { \ MVM_REPR_DEFAULT_SET_INT, \ MVM_REPR_DEFAULT_GET_INT, \ MVM_REPR_DEFAULT_SET_NUM, \ MVM_REPR_DEFAULT_GET_NUM, \ MVM_REPR_DEFAULT_SET_STR, \ MVM_REPR_DEFAULT_GET_STR, \ MVM_REPR_DEFAULT_SET_UINT, \ MVM_REPR_DEFAULT_GET_UINT, \ MVM_REPR_DEFAULT_GET_BOXED_REF \ } /* Default positional functions for a REPR that lacks them. */ #define MVM_REPR_DEFAULT_POS_FUNCS \ { \ MVM_REPR_DEFAULT_AT_POS, \ MVM_REPR_DEFAULT_BIND_POS, \ MVM_REPR_DEFAULT_SET_ELEMS, \ MVM_REPR_DEFAULT_PUSH, \ MVM_REPR_DEFAULT_POP, \ MVM_REPR_DEFAULT_UNSHIFT, \ MVM_REPR_DEFAULT_SHIFT, \ MVM_REPR_DEFAULT_SPLICE, \ MVM_REPR_DEFAULT_AT_POS_MULTIDIM, \ MVM_REPR_DEFAULT_BIND_POS_MULTIDIM, \ MVM_REPR_DEFAULT_DIMENSIONS, \ MVM_REPR_DEFAULT_SET_DIMENSIONS, \ MVM_REPR_DEFAULT_GET_ELEM_STORAGE_SPEC, \ MVM_REPR_DEFAULT_POS_AS_ATOMIC, \ MVM_REPR_DEFAULT_POS_AS_ATOMIC_MULTIDIM \ } /* Default associative functions for a REPR that lacks them. */ #define MVM_REPR_DEFAULT_ASS_FUNCS \ { \ MVM_REPR_DEFAULT_AT_KEY, \ MVM_REPR_DEFAULT_BIND_KEY, \ MVM_REPR_DEFAULT_EXISTS_KEY, \ MVM_REPR_DEFAULT_DELETE_KEY, \ MVM_REPR_DEFAULT_GET_VALUE_STORAGE_SPEC \ } /* Register a representation at runtime, setting repr->ID to a dynamically * assigned value. * * Returns nonzero if the representation has been added successfully and * zero if a representation with the same name is already present. * In that case, the MVMREPROps structure is unused and may be deallocated. */ int MVM_repr_register_dynamic_repr(MVMThreadContext *tc, MVMREPROps *repr); /* Default elems REPR function for a REPR that lacks it. */ MVMuint64 MVM_REPR_DEFAULT_ELEMS(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data); /* Default attribute access REPR function for a REPR that lacks it. */ void MVM_REPR_DEFAULT_GET_ATTRIBUTE(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister *result, MVMuint16 kind); void MVM_REPR_DEFAULT_BIND_ATTRIBUTE(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister value, MVMuint16 kind); MVMint64 MVM_REPR_DEFAULT_IS_ATTRIBUTE_INITIALIZED(MVMThreadContext *tc, MVMSTable *st, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint); MVMint64 MVM_REPR_DEFAULT_HINT_FOR(MVMThreadContext *tc, MVMSTable *st, MVMObject *class_handle, MVMString *name); AO_t * MVM_REPR_DEFAULT_ATTRIBUTE_AS_ATOMIC(MVMThreadContext *tc, MVMSTable *st, void *data, MVMObject *class_handle, MVMString *name); /* Default boxing REPR function for a REPR that lacks it. */ void MVM_REPR_DEFAULT_SET_INT(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 value); MVMint64 MVM_REPR_DEFAULT_GET_INT(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data); void MVM_REPR_DEFAULT_SET_NUM(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMnum64 value); MVMnum64 MVM_REPR_DEFAULT_GET_NUM(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data); void MVM_REPR_DEFAULT_SET_STR(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMString *value); MVMString * MVM_REPR_DEFAULT_GET_STR(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data); void MVM_REPR_DEFAULT_SET_UINT(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMuint64 value); MVMuint64 MVM_REPR_DEFAULT_GET_UINT(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data); void * MVM_REPR_DEFAULT_GET_BOXED_REF(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMuint32 repr_id); /* Default positional indexing REPR function for a REPR that lacks it. */ void MVM_REPR_DEFAULT_AT_POS(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister *value, MVMuint16 kind); void MVM_REPR_DEFAULT_BIND_POS(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister value, MVMuint16 kind); void MVM_REPR_DEFAULT_SET_ELEMS(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMuint64 count); void MVM_REPR_DEFAULT_PUSH(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister value, MVMuint16 kind); void MVM_REPR_DEFAULT_POP(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind); void MVM_REPR_DEFAULT_UNSHIFT(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister value, MVMuint16 kind); void MVM_REPR_DEFAULT_SHIFT(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind); void MVM_REPR_DEFAULT_AT_POS_MULTIDIM(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_indices, MVMint64 *indices, MVMRegister *value, MVMuint16 kind); void MVM_REPR_DEFAULT_BIND_POS_MULTIDIM(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_indices, MVMint64 *indices, MVMRegister value, MVMuint16 kind); void MVM_REPR_DEFAULT_DIMENSIONS(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 *num_dimensions, MVMint64 **dimensions); void MVM_REPR_DEFAULT_SET_DIMENSIONS(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_dimensions, MVMint64 *dimensions); MVMStorageSpec MVM_REPR_DEFAULT_GET_ELEM_STORAGE_SPEC(MVMThreadContext *tc, MVMSTable *st); AO_t * MVM_REPR_DEFAULT_POS_AS_ATOMIC(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index); AO_t * MVM_REPR_DEFAULT_POS_AS_ATOMIC_MULTIDIM(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_indices, MVMint64 *indices); /* Default associative indexing REPR function for a REPR that lacks it. */ void MVM_REPR_DEFAULT_SPLICE(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *target_array, MVMint64 offset, MVMuint64 elems); void MVM_REPR_DEFAULT_AT_KEY(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key, MVMRegister *result, MVMuint16 kind); void MVM_REPR_DEFAULT_BIND_KEY(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key, MVMRegister value, MVMuint16 kind); MVMint64 MVM_REPR_DEFAULT_EXISTS_KEY(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key); void MVM_REPR_DEFAULT_DELETE_KEY(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key); MVMStorageSpec MVM_REPR_DEFAULT_GET_VALUE_STORAGE_SPEC(MVMThreadContext *tc, MVMSTable *st); MoarVM-2018.03/src/6model/reprs/CArray.c0000644000175000017510000004600113237701240017640 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps CArray_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &CArray_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMCArray); }); return st->WHAT; } /* Composes the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info_hash) { MVMStringConsts str_consts = tc->instance->str_consts; MVMObject *info = MVM_repr_at_key_o(tc, info_hash, str_consts.array); if (!MVM_is_null(tc, info)) { MVMCArrayREPRData *repr_data = MVM_malloc(sizeof(MVMCArrayREPRData)); MVMObject *type = MVM_repr_at_key_o(tc, info, str_consts.type); const MVMStorageSpec *ss = REPR(type)->get_storage_spec(tc, STABLE(type)); MVMint32 type_id = REPR(type)->ID; MVM_ASSIGN_REF(tc, &(st->header), repr_data->elem_type, type); st->REPR_data = repr_data; if (ss->boxed_primitive == MVM_STORAGE_SPEC_BP_INT) { if (ss->bits == 8 || ss->bits == 16 || ss->bits == 32 || ss->bits == 64) repr_data->elem_size = ss->bits / 8; else MVM_exception_throw_adhoc(tc, "CArray representation can only have 8, 16, 32 or 64 bit integer elements"); repr_data->elem_kind = MVM_CARRAY_ELEM_KIND_NUMERIC; } else if (ss->boxed_primitive == MVM_STORAGE_SPEC_BP_NUM) { if (ss->bits == 32 || ss->bits == 64) repr_data->elem_size = ss->bits / 8; else MVM_exception_throw_adhoc(tc, "CArray representation can only have 32 or 64 bit floating point elements"); repr_data->elem_kind = MVM_CARRAY_ELEM_KIND_NUMERIC; } else if (ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_STR) { repr_data->elem_size = sizeof(MVMObject *); repr_data->elem_kind = MVM_CARRAY_ELEM_KIND_STRING; } else if (type_id == MVM_REPR_ID_MVMCArray) { repr_data->elem_kind = MVM_CARRAY_ELEM_KIND_CARRAY; repr_data->elem_size = sizeof(void *); } else if (type_id == MVM_REPR_ID_MVMCStruct) { repr_data->elem_kind = MVM_CARRAY_ELEM_KIND_CSTRUCT; repr_data->elem_size = sizeof(void *); } else if (type_id == MVM_REPR_ID_MVMCPointer) { repr_data->elem_kind = MVM_CARRAY_ELEM_KIND_CPOINTER; repr_data->elem_size = sizeof(void *); } else { MVM_exception_throw_adhoc(tc, "CArray representation only handles attributes of type:\n" " (u)int8, (u)int16, (u)int32, (u)int64, (u)long, (u)longlong, num32, num64, (s)size_t, bool, Str\n" " and types with representation: CArray, CPointer, CStruct, CPPStruct and CUnion"); } } else { MVM_exception_throw_adhoc(tc, "CArray representation requires a typed array"); } } /* Initialize a new instance. */ static void initialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { /* If we're initialized, presumably we're going to be * managing the memory in this array ourself. */ MVMCArrayREPRData *repr_data = (MVMCArrayREPRData *)st->REPR_data; MVMCArrayBody *body = (MVMCArrayBody *)data; if (!repr_data) MVM_exception_throw_adhoc(tc, "CArray type must be composed before use"); body->storage = MVM_calloc(4, repr_data->elem_size); body->managed = 1; /* Don't need child_objs for numerics. */ if (repr_data->elem_kind == MVM_CARRAY_ELEM_KIND_NUMERIC) body->child_objs = NULL; else body->child_objs = (MVMObject **) MVM_calloc(4, sizeof(MVMObject *)); body->allocated = 4; body->elems = 0; } /* Copies to the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMCArrayREPRData *repr_data = (MVMCArrayREPRData *)st->REPR_data; MVMCArrayBody *src_body = (MVMCArrayBody *)src; MVMCArrayBody *dest_body = (MVMCArrayBody *)dest; if (src_body->managed) { MVMint32 alsize = src_body->allocated * repr_data->elem_size; dest_body->storage = MVM_malloc(alsize); memcpy(dest_body->storage, src_body->storage, alsize); } else { dest_body->storage = src_body->storage; } dest_body->managed = src_body->managed; dest_body->allocated = src_body->allocated; dest_body->elems = src_body->elems; } /* This is called to do any cleanup of resources when an object gets * embedded inside another one. Never called on a top-level object. */ static void gc_cleanup(MVMThreadContext *tc, MVMSTable *st, void *data) { MVMCArrayBody *body = (MVMCArrayBody *)data; if (body->managed) MVM_free(body->storage); if (body->child_objs) MVM_free(body->child_objs); } static void gc_free(MVMThreadContext *tc, MVMObject *obj) { gc_cleanup(tc, STABLE(obj), OBJECT_BODY(obj)); } static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMCArrayBody *body = (MVMCArrayBody *)data; const MVMint32 elems = body->elems; MVMint32 i; /* Don't traverse child_objs list if there isn't one. */ if (!body->child_objs) return; for (i = 0; i < elems; i++) if (body->child_objs[i]) MVM_gc_worklist_add(tc, worklist, &body->child_objs[i]); } /* Marks the representation data in an STable.*/ static void gc_mark_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMGCWorklist *worklist) { MVMCArrayREPRData *repr_data = (MVMCArrayREPRData *)st->REPR_data; if (repr_data) MVM_gc_worklist_add(tc, worklist, &repr_data->elem_type); } /* Free representation data. */ static void gc_free_repr_data(MVMThreadContext *tc, MVMSTable *st) { MVM_free(st->REPR_data); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ sizeof(void *) * 8, /* bits */ ALIGNOF(void *), /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } MVM_NO_RETURN static void die_pos_nyi(MVMThreadContext *tc) MVM_NO_RETURN_GCC; static void die_pos_nyi(MVMThreadContext *tc) { MVM_exception_throw_adhoc(tc, "CArray representation does not fully positional storage yet"); } static void expand(MVMThreadContext *tc, MVMCArrayREPRData *repr_data, MVMCArrayBody *body, MVMint32 min_size) { MVMint8 is_complex; MVMint32 next_size = body->allocated? 2 * body->allocated: 4; if (min_size > next_size) next_size = min_size; if (body->managed) { const size_t old_size = body->allocated * repr_data->elem_size; const size_t new_size = next_size * repr_data->elem_size; body->storage = MVM_realloc(body->storage, new_size); memset((char *)body->storage + old_size, 0, new_size - old_size); } is_complex = (repr_data->elem_kind == MVM_CARRAY_ELEM_KIND_CARRAY || repr_data->elem_kind == MVM_CARRAY_ELEM_KIND_CPOINTER || repr_data->elem_kind == MVM_CARRAY_ELEM_KIND_CSTRUCT || repr_data->elem_kind == MVM_CARRAY_ELEM_KIND_STRING); if (is_complex) { const size_t old_size = body->allocated * sizeof(MVMObject *); const size_t new_size = next_size * sizeof(MVMObject *); body->child_objs = (MVMObject **) MVM_realloc(body->child_objs, new_size); memset((char *)body->child_objs + old_size, 0, new_size - old_size); } body->allocated = next_size; } static MVMObject * make_wrapper(MVMThreadContext *tc, MVMSTable *st, void *data) { MVMCArrayREPRData *repr_data = (MVMCArrayREPRData *)st->REPR_data; switch (repr_data->elem_kind) { case MVM_CARRAY_ELEM_KIND_STRING: { MVMString *str = MVM_string_utf8_decode(tc, tc->instance->VMString, (char *)data, strlen((char *)data)); return MVM_repr_box_str(tc, repr_data->elem_type, str); } case MVM_CARRAY_ELEM_KIND_CPOINTER: return MVM_nativecall_make_cpointer(tc, repr_data->elem_type, data); case MVM_CARRAY_ELEM_KIND_CARRAY: return MVM_nativecall_make_carray(tc, repr_data->elem_type, data); case MVM_CARRAY_ELEM_KIND_CSTRUCT: return MVM_nativecall_make_cstruct(tc, repr_data->elem_type, data); default: MVM_exception_throw_adhoc(tc, "Unknown element type in CArray"); } } static void at_pos(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister *value, MVMuint16 kind) { MVMCArrayREPRData *repr_data = (MVMCArrayREPRData *)st->REPR_data; MVMCArrayBody *body = (MVMCArrayBody *)data; void *ptr = ((char *)body->storage) + index * repr_data->elem_size; switch (repr_data->elem_kind) { case MVM_CARRAY_ELEM_KIND_NUMERIC: if (kind == MVM_reg_int64) value->i64 = body->managed && index >= body->elems ? 0 : REPR(repr_data->elem_type)->box_funcs.get_int(tc, STABLE(repr_data->elem_type), root, ptr); else if (kind == MVM_reg_num64) value->n64 = body->managed && index >= body->elems ? 0.0 : REPR(repr_data->elem_type)->box_funcs.get_num(tc, STABLE(repr_data->elem_type), root, ptr); else MVM_exception_throw_adhoc(tc, "Wrong kind of access to numeric CArray"); break; case MVM_CARRAY_ELEM_KIND_STRING: case MVM_CARRAY_ELEM_KIND_CPOINTER: case MVM_CARRAY_ELEM_KIND_CARRAY: case MVM_CARRAY_ELEM_KIND_CSTRUCT: { if (kind != MVM_reg_obj) MVM_exception_throw_adhoc(tc, "Wrong kind of access to object CArray"); if (body->managed) { /* We manage this array. If we're out of range, just use type object. */ if (index >= body->elems) { value->o = repr_data->elem_type; } /* Otherwise we may have a cached object result. */ else if (body->child_objs[index]) { value->o = body->child_objs[index]; } /* If not, we need to produce and cache it. */ else { void **storage = (void **)body->storage; MVMROOT(tc, root, { MVMObject **child_objs = body->child_objs; MVMObject *wrapped = make_wrapper(tc, st, storage[index]); MVM_ASSIGN_REF(tc, &(root->header), child_objs[index], wrapped); value->o = wrapped; }); } } else { void **storage; /* Array comes from C. Enlarge child_objs if needed. */ if (index >= body->allocated) expand(tc, repr_data, body, index + 1); if (index >= body->elems) body->elems = index + 1; storage = (void **)body->storage; /* We've already fetched this object; use cached one. */ if (storage[index] && body->child_objs[index]) { value->o = body->child_objs[index]; } /* No cached object, but non-NULL pointer in array. Construct object, * put it in the cache and return it. */ else if (storage[index]) { MVMROOT(tc, root, { MVMObject **child_objs = body->child_objs; MVMObject *wrapped = make_wrapper(tc, st, storage[index]); MVM_ASSIGN_REF(tc, &(root->header), child_objs[index], wrapped); value->o = wrapped; }); } /* NULL pointer in the array; result is the type object. */ else { value->o = repr_data->elem_type; } } break; } default: MVM_exception_throw_adhoc(tc, "Unknown element type in CArray"); } } static void bind_wrapper_and_ptr(MVMThreadContext *tc, MVMObject *root, MVMCArrayBody *body, MVMint64 index, MVMObject *wrapper, void *cptr) { if (index >= body->allocated) expand(tc, STABLE(root)->REPR_data, body, index + 1); if (index >= body->elems) body->elems = index + 1; MVM_ASSIGN_REF(tc, &(root->header), body->child_objs[index], wrapper); ((void **)body->storage)[index] = cptr; } static void bind_pos(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister value, MVMuint16 kind) { MVMCArrayREPRData *repr_data = (MVMCArrayREPRData *)st->REPR_data; MVMCArrayBody *body = (MVMCArrayBody *)data; void *ptr; if (body->managed && index >= body->allocated) expand(tc, repr_data, body, index + 1); if (index >= body->elems) body->elems = index + 1; ptr = ((char *)body->storage) + index * repr_data->elem_size; switch (repr_data->elem_kind) { case MVM_CARRAY_ELEM_KIND_NUMERIC: if (kind == MVM_reg_int64) REPR(repr_data->elem_type)->box_funcs.set_int(tc, STABLE(repr_data->elem_type), root, ptr, value.i64); else if (kind == MVM_reg_num64) REPR(repr_data->elem_type)->box_funcs.set_num(tc, STABLE(repr_data->elem_type), root, ptr, value.n64); else MVM_exception_throw_adhoc(tc, "Wrong kind of access to numeric CArray"); break; case MVM_CARRAY_ELEM_KIND_STRING: { char *string = IS_CONCRETE(value.o) ? MVM_string_utf8_encode_C_string(tc, MVM_repr_get_str(tc, value.o)) : NULL; bind_wrapper_and_ptr(tc, root, body, index, value.o, string); break; } case MVM_CARRAY_ELEM_KIND_CPOINTER: if (REPR(value.o)->ID != MVM_REPR_ID_MVMCPointer) MVM_exception_throw_adhoc(tc, "CArray of CPointer passed non-CPointer object"); bind_wrapper_and_ptr(tc, root, body, index, value.o, IS_CONCRETE(value.o) ? ((MVMCPointer *)value.o)->body.ptr : NULL); break; case MVM_CARRAY_ELEM_KIND_CARRAY: if (REPR(value.o)->ID != MVM_REPR_ID_MVMCArray) MVM_exception_throw_adhoc(tc, "CArray of CArray passed non-CArray object"); bind_wrapper_and_ptr(tc, root, body, index, value.o, IS_CONCRETE(value.o) ? ((MVMCArray *)value.o)->body.storage : NULL); break; case MVM_CARRAY_ELEM_KIND_CSTRUCT: if (REPR(value.o)->ID != MVM_REPR_ID_MVMCStruct) MVM_exception_throw_adhoc(tc, "CArray of CStruct passed non-CStruct object"); bind_wrapper_and_ptr(tc, root, body, index, value.o, IS_CONCRETE(value.o) ? ((MVMCStruct *)value.o)->body.cstruct : NULL); break; default: MVM_exception_throw_adhoc(tc, "Unknown element type in CArray"); } } static void push(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister value, MVMuint16 kind) { die_pos_nyi(tc); } static void pop(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind) { die_pos_nyi(tc); } static void unshift(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister value, MVMuint16 kind) { die_pos_nyi(tc); } static void shift(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind) { die_pos_nyi(tc); } static MVMuint64 elems(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMCArrayBody *body = (MVMCArrayBody *)data; if (body->managed) return body->elems; MVM_exception_throw_adhoc(tc, "Don't know how many elements a C array returned from a library"); } static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMCArray); } /* Serializes the REPR data. */ static void serialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationWriter *writer) { MVMCArrayREPRData *repr_data = (MVMCArrayREPRData *)st->REPR_data; MVM_serialization_write_int(tc, writer, repr_data->elem_size); MVM_serialization_write_ref(tc, writer, repr_data->elem_type); MVM_serialization_write_int(tc, writer, repr_data->elem_kind); } /* Deserializes the REPR data. */ static void deserialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { MVMCArrayREPRData *repr_data = (MVMCArrayREPRData *) MVM_malloc(sizeof(MVMCArrayREPRData)); if (reader->root.version >= 19) { repr_data->elem_size = MVM_serialization_read_int(tc, reader); } else { repr_data->elem_size = MVM_serialization_read_int64(tc, reader); } repr_data->elem_type = MVM_serialization_read_ref(tc, reader); if (reader->root.version >= 19) { repr_data->elem_kind = MVM_serialization_read_int(tc, reader); } else { repr_data->elem_kind = MVM_serialization_read_int64(tc, reader); } st->REPR_data = repr_data; } /* Initializes the CArray representation. */ const MVMREPROps * MVMCArray_initialize(MVMThreadContext *tc) { return &CArray_this_repr; } static const MVMREPROps CArray_this_repr = { type_object_for, MVM_gc_allocate_object, initialize, copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, { at_pos, bind_pos, MVM_REPR_DEFAULT_SET_ELEMS, push, pop, unshift, shift, MVM_REPR_DEFAULT_SPLICE, MVM_REPR_DEFAULT_AT_POS_MULTIDIM, MVM_REPR_DEFAULT_BIND_POS_MULTIDIM, MVM_REPR_DEFAULT_DIMENSIONS, MVM_REPR_DEFAULT_SET_DIMENSIONS, MVM_REPR_DEFAULT_GET_ELEM_STORAGE_SPEC, MVM_REPR_DEFAULT_POS_AS_ATOMIC, MVM_REPR_DEFAULT_POS_AS_ATOMIC_MULTIDIM }, /* pos_funcs */ MVM_REPR_DEFAULT_ASS_FUNCS, elems, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ serialize_repr_data, deserialize_repr_data, deserialize_stable_size, gc_mark, gc_free, gc_cleanup, gc_mark_repr_data, gc_free_repr_data, compose, NULL, /* spesh */ "CArray", /* name */ MVM_REPR_ID_MVMCArray, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; MoarVM-2018.03/src/6model/reprs/CArray.h0000644000175000017510000000270413237701240017647 0ustar samanthasamantha/* Body of a CArray. */ struct MVMCArrayBody { /* The storage of C-land elements. */ void *storage; /* The storage of Perl-land elements */ MVMObject **child_objs; /* Are we managing the memory for this array ourselves, or does it come * from C? */ MVMint32 managed; /* The number of elements we've allocated. If we do not know, * because the array was returned to us from elsewhere and we * are not managing it's memory, this is 0. */ MVMint32 allocated; /* The number of elements we have, if known. Invalid if we * are not managing the array. */ MVMint32 elems; }; struct MVMCArray { MVMObject common; MVMCArrayBody body; }; /* What kind of element do we have? */ #define MVM_CARRAY_ELEM_KIND_NUMERIC 1 #define MVM_CARRAY_ELEM_KIND_STRING 2 #define MVM_CARRAY_ELEM_KIND_CPOINTER 3 #define MVM_CARRAY_ELEM_KIND_CARRAY 4 #define MVM_CARRAY_ELEM_KIND_CSTRUCT 5 #define MVM_CARRAY_ELEM_KIND_CUNION 6 /* The CArray REPR data contains a little info about the type of array * that we have. */ struct MVMCArrayREPRData { /* The number of bytes in size that an element is. */ MVMint32 elem_size; /* The type of an element. */ MVMObject *elem_type; /* What kind of element is it (lets us quickly know how to handle access * to it). */ MVMint32 elem_kind; }; /* Initializes the CArray REPR. */ const MVMREPROps * MVMCArray_initialize(MVMThreadContext *tc); MoarVM-2018.03/src/6model/reprs/CPPStruct.c0000644000175000017510000011270713237701240020315 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps CPPStruct_this_repr; /* Locates all of the attributes. Puts them onto a flattened, ordered * list of attributes (populating the passed flat_list). Also builds * the index mapping for doing named lookups. Note index is not related * to the storage position. */ static MVMObject * index_mapping_and_flat_list(MVMThreadContext *tc, MVMObject *mro, MVMCPPStructREPRData *repr_data) { MVMInstance *instance = tc->instance; MVMObject *flat_list, *class_list, *attr_map_list; MVMint32 num_classes, i, current_slot = 0; MVMCPPStructNameMap *result; MVMint32 mro_idx = MVM_repr_elems(tc, mro); MVM_gc_root_temp_push(tc, (MVMCollectable **)&mro); flat_list = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_array_type); MVM_gc_root_temp_push(tc, (MVMCollectable **)&flat_list); class_list = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_array_type); MVM_gc_root_temp_push(tc, (MVMCollectable **)&class_list); attr_map_list = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_array_type); MVM_gc_root_temp_push(tc, (MVMCollectable **)&attr_map_list); /* Walk through the parents list. */ while (mro_idx) { /* Get current class in MRO. */ MVMObject *type_info = MVM_repr_at_pos_o(tc, mro, --mro_idx); MVMObject *current_class = MVM_repr_at_pos_o(tc, type_info, 0); /* Get its local parents; make sure we're not doing MI. */ MVMObject *parents = MVM_repr_at_pos_o(tc, type_info, 2); MVMint32 num_parents = MVM_repr_elems(tc, parents); if (num_parents <= 1) { /* Get attributes and iterate over them. */ MVMObject *attributes = MVM_repr_at_pos_o(tc, type_info, 1); MVMIter * const attr_iter = (MVMIter *)MVM_iter(tc, attributes); MVMObject *attr_map = NULL; if (MVM_iter_istrue(tc, attr_iter)) { MVM_gc_root_temp_push(tc, (MVMCollectable **)&attr_iter); attr_map = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_hash_type); MVM_gc_root_temp_push(tc, (MVMCollectable **)&attr_map); } while (MVM_iter_istrue(tc, attr_iter)) { MVMObject *current_slot_obj = MVM_repr_box_int(tc, MVM_hll_current(tc)->int_box_type, current_slot); MVMObject *attr, *name_obj; MVMString *name; MVM_repr_shift_o(tc, (MVMObject *)attr_iter); /* Get attribute. */ attr = MVM_iterval(tc, attr_iter); /* Get its name. */ name_obj = MVM_repr_at_key_o(tc, attr, instance->str_consts.name); name = MVM_repr_get_str(tc, name_obj); MVM_repr_bind_key_o(tc, attr_map, name, current_slot_obj); current_slot++; /* Push attr onto the flat list. */ MVM_repr_push_o(tc, flat_list, attr); } if (attr_map) { MVM_gc_root_temp_pop_n(tc, 2); } /* Add to class list and map list. */ MVM_repr_push_o(tc, class_list, current_class); MVM_repr_push_o(tc, attr_map_list, attr_map); } else { MVM_exception_throw_adhoc(tc, "CPPStruct representation does not support multiple inheritance"); } } MVM_gc_root_temp_pop_n(tc, 4); /* We can now form the name map. */ num_classes = MVM_repr_elems(tc, class_list); result = (MVMCPPStructNameMap *) MVM_malloc(sizeof(MVMCPPStructNameMap) * (1 + num_classes)); for (i = 0; i < num_classes; i++) { result[i].class_key = MVM_repr_at_pos_o(tc, class_list, i); result[i].name_map = MVM_repr_at_pos_o(tc, attr_map_list, i); } /* set the end to be NULL, it's useful for iteration. */ result[i].class_key = NULL; repr_data->name_to_index_mapping = result; return flat_list; } static MVMint32 round_up_to_multi(MVMint32 i, MVMint32 m) { return (MVMint32)((i + m - 1) / m) * m; } /* This works out an allocation strategy for the object. It takes care of * "inlining" storage of attributes that are natively typed, as well as * noting unbox targets. */ static void compute_allocation_strategy(MVMThreadContext *tc, MVMSTable *st, MVMObject *repr_info, MVMCPPStructREPRData *repr_data) { /* Compute index mapping table and get flat list of attributes. */ MVMObject *flat_list; MVMROOT(tc, st, { flat_list = index_mapping_and_flat_list(tc, repr_info, repr_data); }); /* If we have no attributes in the index mapping, then just the header. */ if (repr_data->name_to_index_mapping[0].class_key == NULL) { repr_data->struct_size = 1; /* avoid 0-byte malloc */ repr_data->struct_align = ALIGNOF(void *); } /* Otherwise, we need to compute the allocation strategy. */ else { /* We track the size of the struct, which is what we'll want offsets into. */ MVMint32 cur_size = 0; MVMint32 struct_size = 0; /* Get number of attributes and set up various counters. */ MVMint32 num_attrs = MVM_repr_elems(tc, flat_list); MVMint32 info_alloc = num_attrs == 0 ? 1 : num_attrs; MVMint32 cur_obj_attr = 0; MVMint32 cur_init_slot = 0; MVMint32 i; /* Allocate location/offset arrays and GC mark info arrays. */ repr_data->num_attributes = num_attrs; repr_data->attribute_locations = (MVMint32 *) MVM_malloc(info_alloc * sizeof(MVMint32)); repr_data->struct_offsets = (MVMint32 *) MVM_malloc(info_alloc * sizeof(MVMint32)); repr_data->flattened_stables = (MVMSTable **) MVM_calloc(info_alloc, sizeof(MVMObject *)); repr_data->member_types = (MVMObject **) MVM_calloc(info_alloc, sizeof(MVMObject *)); repr_data->struct_align = 0; /* Go over the attributes and arrange their allocation. */ for (i = 0; i < num_attrs; i++) { /* Fetch its type; see if it's some kind of unboxed type. */ MVMObject *attr = MVM_repr_at_pos_o(tc, flat_list, i); MVMObject *type = MVM_repr_at_key_o(tc, attr, tc->instance->str_consts.type); MVMObject *inlined_val = MVM_repr_at_key_o(tc, attr, tc->instance->str_consts.inlined); MVMint64 inlined = !MVM_is_null(tc, inlined_val) && MVM_repr_get_int(tc, inlined_val); MVMint32 bits = sizeof(void *) * 8; MVMint32 align = ALIGNOF(void *); if (!MVM_is_null(tc, type)) { /* See if it's a type that we know how to handle in a C struct. */ const MVMStorageSpec *spec = REPR(type)->get_storage_spec(tc, STABLE(type)); MVMint32 type_id = REPR(type)->ID; if (spec->inlineable == MVM_STORAGE_SPEC_INLINED && (spec->boxed_primitive == MVM_STORAGE_SPEC_BP_INT || spec->boxed_primitive == MVM_STORAGE_SPEC_BP_NUM)) { /* It's a boxed int or num; pretty easy. It'll just live in the * body of the struct. Instead of masking in i here (which * would be the parallel to how we handle boxed types) we * repurpose it to store the bit-width of the type, so * that get_attribute_ref can find it later. */ bits = spec->bits; align = spec->align; repr_data->attribute_locations[i] = (bits << MVM_CPPSTRUCT_ATTR_SHIFT) | MVM_CPPSTRUCT_ATTR_IN_STRUCT; MVM_ASSIGN_REF(tc, &(st->header), repr_data->flattened_stables[i], STABLE(type)); if (REPR(type)->initialize) { if (!repr_data->initialize_slots) repr_data->initialize_slots = (MVMint32 *) MVM_calloc( info_alloc + 1, sizeof(MVMint32)); repr_data->initialize_slots[cur_init_slot] = i; cur_init_slot++; } } else if (spec->can_box & MVM_STORAGE_SPEC_CAN_BOX_STR) { /* It's a string of some kind. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CPPSTRUCT_ATTR_SHIFT) | MVM_CPPSTRUCT_ATTR_STRING; MVM_ASSIGN_REF(tc, &(st->header), repr_data->member_types[i], type); MVM_ASSIGN_REF(tc, &(st->header), repr_data->flattened_stables[i], STABLE(type)); if (REPR(type)->initialize) { if (!repr_data->initialize_slots) repr_data->initialize_slots = (MVMint32 *) MVM_calloc(info_alloc + 1, sizeof(MVMint32)); repr_data->initialize_slots[cur_init_slot] = i; cur_init_slot++; } } else if (type_id == MVM_REPR_ID_MVMCArray) { /* It's a CArray of some kind. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CPPSTRUCT_ATTR_SHIFT) | MVM_CPPSTRUCT_ATTR_CARRAY; MVM_ASSIGN_REF(tc, &(st->header), repr_data->member_types[i], type); } else if (type_id == MVM_REPR_ID_MVMCStruct) { /* It's a CStruct. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CPPSTRUCT_ATTR_SHIFT) | MVM_CPPSTRUCT_ATTR_CSTRUCT; MVM_ASSIGN_REF(tc, &(st->header), repr_data->member_types[i], type); if (inlined) { MVMCStructREPRData *cstruct_repr_data = (MVMCStructREPRData *)STABLE(type)->REPR_data; bits = cstruct_repr_data->struct_size * 8; align = cstruct_repr_data->struct_align; repr_data->attribute_locations[i] |= MVM_CSTRUCT_ATTR_INLINED; } } else if (type_id == MVM_REPR_ID_MVMCPPStruct) { /* It's a CPPStruct. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CPPSTRUCT_ATTR_SHIFT) | MVM_CPPSTRUCT_ATTR_CPPSTRUCT; MVM_ASSIGN_REF(tc, &(st->header), repr_data->member_types[i], type); if (inlined) { MVMCPPStructREPRData *cppstruct_repr_data = (MVMCPPStructREPRData *)STABLE(type)->REPR_data; bits = cppstruct_repr_data->struct_size * 8; align = cppstruct_repr_data->struct_align; repr_data->attribute_locations[i] |= MVM_CPPSTRUCT_ATTR_INLINED; } } else if (type_id == MVM_REPR_ID_MVMCUnion) { /* It's a CUnion. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CSTRUCT_ATTR_SHIFT) | MVM_CSTRUCT_ATTR_CUNION; MVM_ASSIGN_REF(tc, &(st->header), repr_data->member_types[i], type); if (inlined) { MVMCUnionREPRData *cunion_repr_data = (MVMCUnionREPRData *)STABLE(type)->REPR_data; bits = cunion_repr_data->struct_size * 8; align = cunion_repr_data->struct_align; repr_data->attribute_locations[i] |= MVM_CSTRUCT_ATTR_INLINED; } } else if (type_id == MVM_REPR_ID_MVMCPointer) { /* It's a CPointer. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CPPSTRUCT_ATTR_SHIFT) | MVM_CPPSTRUCT_ATTR_CPTR; MVM_ASSIGN_REF(tc, &(st->header), repr_data->member_types[i], type); } else { MVM_exception_throw_adhoc(tc, "CPPStruct representation only handles attributes of type:\n" " (u)int8, (u)int16, (u)int32, (u)int64, (u)long, (u)longlong, num32, num64, (s)size_t, bool, Str\n" " and types with representation: CArray, CPointer, CStruct, CPPStruct and CUnion"); } } else { MVM_exception_throw_adhoc(tc, "CPPStruct representation requires the types of all attributes to be specified"); } if (bits % 8) { MVM_exception_throw_adhoc(tc, "CPPStruct only supports native types that are a multiple of 8 bits wide (was passed: %"PRId32")", bits); } /* Do allocation. */ /* C structure needs careful alignment. If cur_size is not aligned * to align bytes (cur_size % align), make sure it is before we * add the next element. */ if (cur_size % align) { cur_size += align - cur_size % align; } if (align > repr_data->struct_align) repr_data->struct_align = align; repr_data->struct_offsets[i] = cur_size; cur_size += bits / 8; struct_size = round_up_to_multi(struct_size, align) + bits/8; } /* Finally, put computed allocation size in place; it's body size plus * header size. Also number of markables and sentinels. */ repr_data->struct_size = round_up_to_multi(struct_size, repr_data->struct_align); if (repr_data->initialize_slots) repr_data->initialize_slots[cur_init_slot] = -1; } } /* Helper for reading a pointer at the specified offset. */ static void * get_ptr_at_offset(void *data, MVMint32 offset) { void *location = (char *)data + offset; return *((void **)location); } /* Helper for writing a pointer at the specified offset. */ static void set_ptr_at_offset(void *data, MVMint32 offset, void *value) { void *location = (char *)data + offset; *((void **)location) = value; } /* Helper for finding a slot number. */ static MVMint32 try_get_slot(MVMThreadContext *tc, MVMCPPStructREPRData *repr_data, MVMObject *class_key, MVMString *name) { if (repr_data->name_to_index_mapping) { MVMCPPStructNameMap *cur_map_entry = repr_data->name_to_index_mapping; while (cur_map_entry->class_key != NULL) { if (cur_map_entry->class_key == class_key) { MVMObject *slot_obj = MVM_repr_at_key_o(tc, cur_map_entry->name_map, name); if (IS_CONCRETE(slot_obj)) return MVM_repr_get_int(tc, slot_obj); break; } cur_map_entry++; } } return -1; } /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &CPPStruct_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMCPPStruct); }); return st->WHAT; } /* Composes the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *repr_info) { /* Compute allocation strategy. */ MVMCPPStructREPRData *repr_data = MVM_calloc(1, sizeof(MVMCPPStructREPRData)); MVMObject *attr_info = MVM_repr_at_key_o(tc, repr_info, tc->instance->str_consts.attribute); compute_allocation_strategy(tc, st, attr_info, repr_data); st->REPR_data = repr_data; } /* Initialize a new instance. */ static void initialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMCPPStructREPRData * repr_data = (MVMCPPStructREPRData *)st->REPR_data; /* Allocate object body. */ MVMCPPStructBody *body = (MVMCPPStructBody *)data; body->cppstruct = MVM_calloc(1, repr_data->struct_size > 0 ? repr_data->struct_size : 1); /* Allocate child obj array. */ if (repr_data->num_child_objs > 0) body->child_objs = (MVMObject **)MVM_calloc(repr_data->num_child_objs, sizeof(MVMObject *)); /* Initialize the slots. */ if (repr_data->initialize_slots) { MVMint32 i; for (i = 0; repr_data->initialize_slots[i] >= 0; i++) { MVMint32 offset = repr_data->struct_offsets[repr_data->initialize_slots[i]]; MVMSTable *st = repr_data->flattened_stables[repr_data->initialize_slots[i]]; st->REPR->initialize(tc, st, root, (char *)body->cppstruct + offset); } } } /* Copies to the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "cloning a CPPStruct is NYI"); } /* Helper for complaining about attribute access errors. */ MVM_NO_RETURN static void no_such_attribute(MVMThreadContext *tc, const char *action, MVMObject *class_handle, MVMString *name) MVM_NO_RETURN_GCC; static void no_such_attribute(MVMThreadContext *tc, const char *action, MVMObject *class_handle, MVMString *name) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Can not %s non-existent attribute '%s'", action, c_name); } /* Helper to die because this type doesn't support attributes. */ MVM_NO_RETURN static void die_no_attrs(MVMThreadContext *tc) MVM_NO_RETURN_GCC; static void die_no_attrs(MVMThreadContext *tc) { MVM_exception_throw_adhoc(tc, "CPPStruct representation attribute not yet fully implemented"); } static void get_attribute(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister *result_reg, MVMuint16 kind) { MVMCPPStructREPRData *repr_data = (MVMCPPStructREPRData *)st->REPR_data; MVMCPPStructBody *body = (MVMCPPStructBody *)data; MVMint64 slot; if (!repr_data) MVM_exception_throw_adhoc(tc, "CPPStruct: must compose before using get_attribute"); slot = hint >= 0 ? hint : try_get_slot(tc, repr_data, class_handle, name); if (slot >= 0) { MVMSTable *attr_st = repr_data->flattened_stables[slot]; switch (kind) { case MVM_reg_obj: { MVMint32 type = repr_data->attribute_locations[slot] & MVM_CPPSTRUCT_ATTR_MASK; MVMint32 real_slot = repr_data->attribute_locations[slot] >> MVM_CPPSTRUCT_ATTR_SHIFT; if (type == MVM_CPPSTRUCT_ATTR_IN_STRUCT) { MVM_exception_throw_adhoc(tc, "CPPStruct can't perform boxed get on flattened attributes yet"); } else { MVMObject *typeobj = repr_data->member_types[slot]; MVMObject *obj = body->child_objs[real_slot]; if (!obj) { /* No cached object. */ void *cobj = get_ptr_at_offset(body->cppstruct, repr_data->struct_offsets[slot]); if (cobj) { MVMObject **child_objs = body->child_objs; if (type == MVM_CPPSTRUCT_ATTR_CARRAY) { obj = MVM_nativecall_make_carray(tc, typeobj, cobj); } else if(type == MVM_CPPSTRUCT_ATTR_CSTRUCT) { if (repr_data->attribute_locations[slot] & MVM_CPPSTRUCT_ATTR_INLINED) obj = MVM_nativecall_make_cstruct(tc, typeobj, (char *)body->cppstruct + repr_data->struct_offsets[slot]); else obj = MVM_nativecall_make_cstruct(tc, typeobj, cobj); } else if(type == MVM_CPPSTRUCT_ATTR_CPPSTRUCT) { if (repr_data->attribute_locations[slot] & MVM_CPPSTRUCT_ATTR_INLINED) obj = MVM_nativecall_make_cppstruct(tc, typeobj, (char *)body->cppstruct + repr_data->struct_offsets[slot]); else obj = MVM_nativecall_make_cppstruct(tc, typeobj, cobj); } else if(type == MVM_CPPSTRUCT_ATTR_CUNION) { if (repr_data->attribute_locations[slot] & MVM_CPPSTRUCT_ATTR_INLINED) obj = MVM_nativecall_make_cunion(tc, typeobj, (char *)body->cppstruct + repr_data->struct_offsets[slot]); else obj = MVM_nativecall_make_cunion(tc, typeobj, cobj); } else if(type == MVM_CPPSTRUCT_ATTR_CPTR) { obj = MVM_nativecall_make_cpointer(tc, typeobj, cobj); } else if(type == MVM_CPPSTRUCT_ATTR_STRING) { MVMROOT(tc, typeobj, { MVMString *str = MVM_string_utf8_decode(tc, tc->instance->VMString, cobj, strlen(cobj)); obj = MVM_repr_box_str(tc, typeobj, str); }); } child_objs[real_slot] = obj; } else { obj = typeobj; } } result_reg->o = obj; } break; } case MVM_reg_int64: { if (attr_st) result_reg->i64 = attr_st->REPR->box_funcs.get_int(tc, attr_st, root, ((char *)body->cppstruct) + repr_data->struct_offsets[slot]); else MVM_exception_throw_adhoc(tc, "CPPStruct: invalid native get of object attribute"); break; } case MVM_reg_num64: { if (attr_st) result_reg->n64 = attr_st->REPR->box_funcs.get_num(tc, attr_st, root, ((char *)body->cppstruct) + repr_data->struct_offsets[slot]); else MVM_exception_throw_adhoc(tc, "CPPStruct: invalid native get of object attribute"); break; } case MVM_reg_str: { if (attr_st) result_reg->s = attr_st->REPR->box_funcs.get_str(tc, attr_st, root, ((char *)body->cppstruct) + repr_data->struct_offsets[slot]); else MVM_exception_throw_adhoc(tc, "CPPStruct: invalid native get of object attribute"); if (!result_reg->s) result_reg->s = tc->instance->str_consts.empty; break; } default: MVM_exception_throw_adhoc(tc, "CPPStruct: invalid kind in attribute get"); } } else { no_such_attribute(tc, "bind", class_handle, name); } } /* Binds the given value to the specified attribute. */ static void bind_attribute(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister value_reg, MVMuint16 kind) { MVMCPPStructREPRData *repr_data = (MVMCPPStructREPRData *)st->REPR_data; MVMCPPStructBody *body = (MVMCPPStructBody *)data; MVMint64 slot; if (!repr_data) MVM_exception_throw_adhoc(tc, "CPPStruct: must compose before using bind_attribute"); slot = hint >= 0 ? hint : try_get_slot(tc, repr_data, class_handle, name); if (slot >= 0) { MVMSTable *attr_st = repr_data->flattened_stables[slot]; switch (kind) { case MVM_reg_obj: { MVMObject *value = value_reg.o; MVMint32 type = repr_data->attribute_locations[slot] & MVM_CPPSTRUCT_ATTR_MASK; if (type == MVM_CPPSTRUCT_ATTR_IN_STRUCT) { MVM_exception_throw_adhoc(tc, "CPPStruct can't perform boxed bind on flattened attributes yet"); } else { MVMint32 real_slot = repr_data->attribute_locations[slot] >> MVM_CPPSTRUCT_ATTR_SHIFT; if (IS_CONCRETE(value)) { void *cobj = NULL; MVM_ASSIGN_REF(tc, &(root->header), body->child_objs[real_slot], value); /* Set cobj to correct pointer based on type of value. */ if (type == MVM_CPPSTRUCT_ATTR_CARRAY) { if (REPR(value)->ID != MVM_REPR_ID_MVMCArray) MVM_exception_throw_adhoc(tc, "Can only store CArray attribute in CArray slot in CPPStruct"); cobj = ((MVMCArray *)value)->body.storage; } else if (type == MVM_CPPSTRUCT_ATTR_CSTRUCT) { if (REPR(value)->ID != MVM_REPR_ID_MVMCStruct) MVM_exception_throw_adhoc(tc, "Can only store CStruct attribute in CStruct slot in CPPStruct"); cobj = ((MVMCStruct *)value)->body.cstruct; } else if (type == MVM_CPPSTRUCT_ATTR_CPPSTRUCT) { if (REPR(value)->ID != MVM_REPR_ID_MVMCPPStruct) MVM_exception_throw_adhoc(tc, "Can only store CPPStruct attribute in CPPStruct slot in CPPStruct"); cobj = ((MVMCPPStruct *)value)->body.cppstruct; } else if (type == MVM_CPPSTRUCT_ATTR_CUNION) { if (REPR(value)->ID != MVM_REPR_ID_MVMCUnion) MVM_exception_throw_adhoc(tc, "Can only store CUnion attribute in CUnion slot in CPPStruct"); cobj = ((MVMCUnion *)value)->body.cunion; } else if (type == MVM_CPPSTRUCT_ATTR_CPTR) { if (REPR(value)->ID != MVM_REPR_ID_MVMCPointer) MVM_exception_throw_adhoc(tc, "Can only store CPointer attribute in CPointer slot in CPPStruct"); cobj = ((MVMCPointer *)value)->body.ptr; } else if (type == MVM_CPPSTRUCT_ATTR_STRING) { MVMString *str = MVM_repr_get_str(tc, value); cobj = MVM_string_utf8_encode_C_string(tc, str); } set_ptr_at_offset(body->cppstruct, repr_data->struct_offsets[slot], cobj); } else { body->child_objs[real_slot] = NULL; set_ptr_at_offset(body->cppstruct, repr_data->struct_offsets[slot], NULL); } } break; } case MVM_reg_int64: { if (attr_st) attr_st->REPR->box_funcs.set_int(tc, attr_st, root, ((char *)body->cppstruct) + repr_data->struct_offsets[slot], value_reg.i64); else MVM_exception_throw_adhoc(tc, "CPPStruct: invalid native binding to object attribute"); break; } case MVM_reg_num64: { if (attr_st) attr_st->REPR->box_funcs.set_num(tc, attr_st, root, ((char *)body->cppstruct) + repr_data->struct_offsets[slot], value_reg.n64); else MVM_exception_throw_adhoc(tc, "CPPStruct: invalid native binding to object attribute"); break; } case MVM_reg_str: { if (attr_st) attr_st->REPR->box_funcs.set_str(tc, attr_st, root, ((char *)body->cppstruct) + repr_data->struct_offsets[slot], value_reg.s); else MVM_exception_throw_adhoc(tc, "CPPStruct: invalid native binding to object attribute"); break; } default: MVM_exception_throw_adhoc(tc, "CPPStruct: invalid kind in attribute bind"); } } else { no_such_attribute(tc, "bind", class_handle, name); } } /* Checks if an attribute has been initialized. */ static MVMint64 is_attribute_initialized(MVMThreadContext *tc, MVMSTable *st, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint) { die_no_attrs(tc); } /* Gets the hint for the given attribute ID. */ static MVMint64 hint_for(MVMThreadContext *tc, MVMSTable *st, MVMObject *class_handle, MVMString *name) { return MVM_NO_HINT; } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMCPPStructREPRData *repr_data = (MVMCPPStructREPRData *) st->REPR_data; MVMCPPStructBody *body = (MVMCPPStructBody *)data; MVMint32 i; for (i = 0; i < repr_data->num_child_objs; i++) MVM_gc_worklist_add(tc, worklist, &body->child_objs[i]); } /* Marks the representation data in an STable.*/ static void gc_mark_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMGCWorklist *worklist) { MVMCPPStructREPRData *repr_data = (MVMCPPStructREPRData *)st->REPR_data; if (repr_data) { MVMint32 i; if (repr_data->name_to_index_mapping) { MVMCPPStructNameMap *map = repr_data->name_to_index_mapping; for (i = 0; map[i].class_key; i++) { MVM_gc_worklist_add(tc, worklist, &map[i].class_key); MVM_gc_worklist_add(tc, worklist, &map[i].name_map); } } if (repr_data->flattened_stables) { MVMSTable **flattened_stables = repr_data->flattened_stables; for (i = 0; i < repr_data->num_attributes; i++) MVM_gc_worklist_add(tc, worklist, &flattened_stables[i]); } if (repr_data->member_types) { MVMObject **member_types = repr_data->member_types; for (i = 0; i < repr_data->num_attributes; i++) MVM_gc_worklist_add(tc, worklist, &member_types[i]); } } } /* Free representation data. */ static void gc_free_repr_data(MVMThreadContext *tc, MVMSTable *st) { MVMCPPStructREPRData *repr_data = (MVMCPPStructREPRData *)st->REPR_data; /* May not have survived to composition. */ if (repr_data == NULL) return; if (repr_data->name_to_index_mapping) { MVM_free(repr_data->name_to_index_mapping); MVM_free(repr_data->attribute_locations); MVM_free(repr_data->struct_offsets); MVM_free(repr_data->flattened_stables); MVM_free(repr_data->member_types); MVM_free(repr_data->initialize_slots); } MVM_free(st->REPR_data); } /* This is called to do any cleanup of resources when an object gets * embedded inside another one. Never called on a top-level object. */ static void gc_cleanup(MVMThreadContext *tc, MVMSTable *st, void *data) { MVMCPPStructBody *body = (MVMCPPStructBody *)data; if (body->child_objs) MVM_free(body->child_objs); /* XXX For some reason, this causes crashes at the moment. Need to * work out why. */ /*if (body->cppstruct) MVM_free(body->cppstruct);*/ } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { gc_cleanup(tc, STABLE(obj), OBJECT_BODY(obj)); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ sizeof(void*) * 8, /* bits */ ALIGNOF(void*), /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Serializes the REPR data. */ static void serialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationWriter *writer) { MVMCPPStructREPRData *repr_data = (MVMCPPStructREPRData *)st->REPR_data; MVMint32 i, num_classes, num_slots; MVM_serialization_write_int(tc, writer, repr_data->struct_size); MVM_serialization_write_int(tc, writer, repr_data->struct_align); MVM_serialization_write_int(tc, writer, repr_data->num_attributes); MVM_serialization_write_int(tc, writer, repr_data->num_child_objs); for(i = 0; i < repr_data->num_attributes; i++){ MVM_serialization_write_int(tc, writer, repr_data->attribute_locations[i]); MVM_serialization_write_int(tc, writer, repr_data->struct_offsets[i]); MVM_serialization_write_int(tc, writer, repr_data->flattened_stables[i] != NULL); if (repr_data->flattened_stables[i]) MVM_serialization_write_stable_ref(tc, writer, repr_data->flattened_stables[i]); MVM_serialization_write_ref(tc, writer, repr_data->member_types[i]); } i=0; while (repr_data->name_to_index_mapping[i].class_key) i++; num_classes = i; MVM_serialization_write_int(tc, writer, num_classes); for(i = 0; i < num_classes; i++){ MVM_serialization_write_ref(tc, writer, repr_data->name_to_index_mapping[i].class_key); MVM_serialization_write_ref(tc, writer, repr_data->name_to_index_mapping[i].name_map); } i=0; while(repr_data->initialize_slots && repr_data->initialize_slots[i] != -1) i++; num_slots = i; MVM_serialization_write_int(tc, writer, num_slots); for(i = 0; i < num_slots; i++){ MVM_serialization_write_int(tc, writer, repr_data->initialize_slots[i]); } } /* Deserializes the REPR data. */ static void deserialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { MVMCPPStructREPRData *repr_data = (MVMCPPStructREPRData *) MVM_malloc(sizeof(MVMCPPStructREPRData)); MVMint32 i, num_classes, num_slots; repr_data->struct_size = MVM_serialization_read_int(tc, reader); if (reader->root.version >= 17) { repr_data->struct_align = MVM_serialization_read_int(tc, reader); } repr_data->num_attributes = MVM_serialization_read_int(tc, reader); repr_data->num_child_objs = MVM_serialization_read_int(tc, reader); repr_data->attribute_locations = (MVMint32 *)MVM_malloc(sizeof(MVMint32) * repr_data->num_attributes); repr_data->struct_offsets = (MVMint32 *)MVM_malloc(sizeof(MVMint32) * repr_data->num_attributes); repr_data->flattened_stables = (MVMSTable **)MVM_malloc(repr_data->num_attributes * sizeof(MVMSTable *)); repr_data->member_types = (MVMObject **)MVM_malloc(repr_data->num_attributes * sizeof(MVMObject *)); for(i = 0; i < repr_data->num_attributes; i++) { repr_data->attribute_locations[i] = MVM_serialization_read_int(tc, reader); repr_data->struct_offsets[i] = MVM_serialization_read_int(tc, reader); if(MVM_serialization_read_int(tc, reader)){ MVM_ASSIGN_REF(tc, &(st->header), repr_data->flattened_stables[i], MVM_serialization_read_stable_ref(tc, reader)); } else { repr_data->flattened_stables[i] = NULL; } repr_data->member_types[i] = MVM_serialization_read_ref(tc, reader); } num_classes = MVM_serialization_read_int(tc, reader); repr_data->name_to_index_mapping = (MVMCPPStructNameMap *)MVM_malloc(sizeof(MVMCPPStructNameMap) * (1 + num_classes)); for(i = 0; i < num_classes; i++){ repr_data->name_to_index_mapping[i].class_key = MVM_serialization_read_ref(tc, reader); repr_data->name_to_index_mapping[i].name_map = MVM_serialization_read_ref(tc, reader); } repr_data->name_to_index_mapping[i].class_key = NULL; repr_data->name_to_index_mapping[i].name_map = NULL; num_slots = MVM_serialization_read_int(tc, reader); repr_data->initialize_slots = (MVMint32 *)MVM_malloc(sizeof(MVMint32) * (1 + num_slots)); for(i = 0; i < num_slots; i++){ repr_data->initialize_slots[i] = MVM_serialization_read_int(tc, reader); } repr_data->initialize_slots[i] = -1; st->REPR_data = repr_data; } static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMCPPStruct); } /* Initializes the representation. */ const MVMREPROps * MVMCPPStruct_initialize(MVMThreadContext *tc) { return &CPPStruct_this_repr; } static const MVMREPROps CPPStruct_this_repr = { type_object_for, MVM_gc_allocate_object, initialize, copy_to, { get_attribute, bind_attribute, hint_for, is_attribute_initialized, MVM_REPR_DEFAULT_ATTRIBUTE_AS_ATOMIC }, /* attr_funcs */ MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ serialize_repr_data, deserialize_repr_data, deserialize_stable_size, gc_mark, gc_free, gc_cleanup, gc_mark_repr_data, gc_free_repr_data, compose, NULL, /* spesh */ "CPPStruct", /* name */ MVM_REPR_ID_MVMCPPStruct, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; MoarVM-2018.03/src/6model/reprs/CPPStruct.h0000644000175000017510000000620613237701240020316 0ustar samanthasamantha/* Attribute location flags. */ #define MVM_CPPSTRUCT_ATTR_IN_STRUCT 0 #define MVM_CPPSTRUCT_ATTR_CSTRUCT 1 #define MVM_CPPSTRUCT_ATTR_CARRAY 2 #define MVM_CPPSTRUCT_ATTR_CPTR 3 #define MVM_CPPSTRUCT_ATTR_STRING 4 #define MVM_CPPSTRUCT_ATTR_CPPSTRUCT 5 #define MVM_CPPSTRUCT_ATTR_CUNION 6 #define MVM_CPPSTRUCT_ATTR_MASK 7 #define MVM_CPPSTRUCT_ATTR_INLINED 8 /* Bits to shift a slot position to make room for MVM_CPPSTRUCT_ATTR_*. */ #define MVM_CPPSTRUCT_ATTR_SHIFT 4 /* The CPPStruct representation maintains a chunk of memory that it can * always pass off to C land. If we in turn embed any strings, pointers * to other CPPStruct REPR objects and so forth, we need to both keep the * C-friendly bit of memory and a copy to the GC-able, 6model objects in * sync. */ struct MVMCPPStructBody { /* GC-marked objects that our C structure points into. */ MVMObject **child_objs; /* Pointer to the actual C structure memory; we don't inline it * directly in the body, since it doesn't work so well if we get * something returned and are wrapping it. */ void *cppstruct; }; struct MVMCPPStruct { MVMObject common; MVMCPPStructBody body; }; /* This is used in the name to class mapping. */ struct MVMCPPStructNameMap { MVMObject *class_key; MVMObject *name_map; }; /* The CPPStruct REPR data contains info we need to do allocations, look up * attributes and so forth. */ struct MVMCPPStructREPRData { /* The size and alignment of the structure in bytes. */ MVMint32 struct_size; MVMint32 struct_align; /* The number of attributes we have allocated slots for. Note that * slots can vary in size. */ MVMint32 num_attributes; /* Number of child objects we store. */ MVMint32 num_child_objs; /* Lower bits are flags indicating what kind of attribute we have; * whether it's one that is just a simple value that we can always * access directly in the C struct body, or a more complex one that * we need to maintain in the C struct and in the GC-able list. Upper * bits say where to find it. */ MVMint32 *attribute_locations; /* Maps attribute position numbers to their location in the C struct. * Note that this will not be the only place we need to update for * any reference type. */ MVMint32 *struct_offsets; /* If the attribute was actually flattened in to this object from another * representation, this is the s-table of the type of that attribute. NULL * for attributes that are reference types. */ MVMSTable **flattened_stables; /* For reference type members, we cache the relevant type objects. * Flattened types have NULL here. */ MVMObject **member_types; /* A table mapping attribute names to indexes (which can then be looked * up in the offset table). Uses a final null entry as a sentinel. */ MVMCPPStructNameMap *name_to_index_mapping; /* Slots holding flattened objects that need another REPR to initialize * them; terminated with -1. */ MVMint32 *initialize_slots; }; /* Initializes the CPPStruct REPR. */ const MVMREPROps * MVMCPPStruct_initialize(MVMThreadContext *tc); MoarVM-2018.03/src/6model/reprs/CPointer.c0000644000175000017510000001127313237701240020205 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps CPointer_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &CPointer_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMCPointer); }); return st->WHAT; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { } /* Copies to the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMCPointerBody *src_body = (MVMCPointerBody *)src; MVMCPointerBody *dest_body = (MVMCPointerBody *)dest; dest_body->ptr = src_body->ptr; } static void set_int(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 value) { MVMCPointerBody *body = (MVMCPointerBody *)OBJECT_BODY(root); #if MVM_PTR_SIZE == 4 body->ptr = (void *)(MVMint32)value; #else body->ptr = (void *)value; #endif } static MVMint64 get_int(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMCPointerBody *body = (MVMCPointerBody *)OBJECT_BODY(root); #if MVM_PTR_SIZE == 4 return (MVMint64)(MVMint32)body->ptr; #else return (MVMint64)body->ptr; #endif } static void set_uint(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMuint64 value) { MVMCPointerBody *body = (MVMCPointerBody *)OBJECT_BODY(root); #if MVM_PTR_SIZE == 4 body->ptr = (void *)(MVMuint32)value; #else body->ptr = (void *)value; #endif } static MVMuint64 get_uint(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMCPointerBody *body = (MVMCPointerBody *)OBJECT_BODY(root); #if MVM_PTR_SIZE == 4 return (MVMuint64)(MVMuint32)body->ptr; #else return (MVMuint64)body->ptr; #endif } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ sizeof(void *) * 8, /* bits */ ALIGNOF(void *), /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMCPointer); } static void deserialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMSerializationReader *reader) { MVMCPointerBody *body = (MVMCPointerBody *)data; MVMint64 value; if (reader->root.version >= 19) { value = MVM_serialization_read_int(tc, reader); } else { value = MVM_serialization_read_int64(tc, reader); } #if MVM_PTR_SIZE == 4 body->ptr = (void *)(MVMuint32)value; #else body->ptr = (void *)value; #endif } static void serialize(MVMThreadContext *tc, MVMSTable *st, void *data, MVMSerializationWriter *writer) { MVMCPointerBody *body = (MVMCPointerBody *)data; MVM_serialization_write_int(tc, writer, #if MVM_PTR_SIZE == 4 (MVMuint64)(MVMuint32)body->ptr #else (MVMuint64)body->ptr #endif ); } /* Initializes the representation. */ const MVMREPROps * MVMCPointer_initialize(MVMThreadContext *tc) { return &CPointer_this_repr; } static const MVMREPROps CPointer_this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, { set_int, get_int, MVM_REPR_DEFAULT_SET_NUM, MVM_REPR_DEFAULT_GET_NUM, MVM_REPR_DEFAULT_SET_STR, MVM_REPR_DEFAULT_GET_STR, set_uint, get_uint, MVM_REPR_DEFAULT_GET_BOXED_REF }, /* box_funcs */ MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ serialize, /* serialize */ deserialize, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, NULL, /* gc_mark */ NULL, /* gc_free */ NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "CPointer", /* name */ MVM_REPR_ID_MVMCPointer, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; MoarVM-2018.03/src/6model/reprs/CPointer.h0000644000175000017510000000037713237701240020215 0ustar samanthasamantha/* Representation for C Pointer. */ struct MVMCPointerBody { void *ptr; }; struct MVMCPointer { MVMObject common; MVMCPointerBody body; }; /* Initializes the CPointer REPR. */ const MVMREPROps * MVMCPointer_initialize(MVMThreadContext *tc); MoarVM-2018.03/src/6model/reprs/CStr.c0000644000175000017510000000716613237701240017343 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps CStr_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &CStr_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMCStr); }); return st->WHAT; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* TODO: move encoding stuff into here */ } /* Copies to the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMCPointerBody *src_body = (MVMCPointerBody *)src; MVMCPointerBody *dest_body = (MVMCPointerBody *)dest; dest_body->ptr = src_body->ptr; } static void set_str(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMString *value) { MVMCStrBody *body = (MVMCStrBody *)data; MVM_ASSIGN_REF(tc, &(root->header), body->orig, value); body->cstr = MVM_string_utf8_encode_C_string(tc, value); } static MVMString * get_str(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMCStrBody *body = (MVMCStrBody *)data; return body->orig; } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ sizeof(void *) * 8, /* bits */ ALIGNOF(void *), /* align */ MVM_STORAGE_SPEC_BP_STR, /* boxed_primitive */ MVM_STORAGE_SPEC_CAN_BOX_STR, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMCStrBody *body = (MVMCStrBody *)data; MVM_gc_worklist_add(tc, worklist, &body->orig); } static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMCStr *cstr = (MVMCStr *)obj; if (obj && cstr->body.cstr) MVM_free(cstr->body.cstr); } static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMCStr); } /* Initializes the representation. */ const MVMREPROps * MVMCStr_initialize(MVMThreadContext *tc) { return &CStr_this_repr; } static const MVMREPROps CStr_this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, { MVM_REPR_DEFAULT_SET_INT, MVM_REPR_DEFAULT_GET_INT, MVM_REPR_DEFAULT_SET_NUM, MVM_REPR_DEFAULT_GET_NUM, set_str, get_str, MVM_REPR_DEFAULT_SET_UINT, MVM_REPR_DEFAULT_GET_UINT, MVM_REPR_DEFAULT_GET_BOXED_REF }, /* box_funcs */ MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "CStr", /* name */ MVM_REPR_ID_MVMCStr, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; MoarVM-2018.03/src/6model/reprs/CStr.h0000644000175000017510000000040213237701240017332 0ustar samanthasamantha/* Representation for C Str. */ struct MVMCStrBody { MVMString *orig; char *cstr; }; struct MVMCStr { MVMObject common; MVMCStrBody body; }; /* Initializes the CStr REPR. */ const MVMREPROps * MVMCStr_initialize(MVMThreadContext *tc); MoarVM-2018.03/src/6model/reprs/CStruct.c0000644000175000017510000011260313237701240020050 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps CStruct_this_repr; /* Locates all of the attributes. Puts them onto a flattened, ordered * list of attributes (populating the passed flat_list). Also builds * the index mapping for doing named lookups. Note index is not related * to the storage position. */ static MVMObject * index_mapping_and_flat_list(MVMThreadContext *tc, MVMObject *mro, MVMCStructREPRData *repr_data) { MVMInstance *instance = tc->instance; MVMObject *flat_list, *class_list, *attr_map_list; MVMint32 num_classes, i, current_slot = 0; MVMCStructNameMap *result; MVMint32 mro_idx = MVM_repr_elems(tc, mro); MVM_gc_root_temp_push(tc, (MVMCollectable **)&mro); flat_list = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_array_type); MVM_gc_root_temp_push(tc, (MVMCollectable **)&flat_list); class_list = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_array_type); MVM_gc_root_temp_push(tc, (MVMCollectable **)&class_list); attr_map_list = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_array_type); MVM_gc_root_temp_push(tc, (MVMCollectable **)&attr_map_list); /* Walk through the parents list. */ while (mro_idx) { /* Get current class in MRO. */ MVMObject *type_info = MVM_repr_at_pos_o(tc, mro, --mro_idx); MVMObject *current_class = MVM_repr_at_pos_o(tc, type_info, 0); /* Get its local parents; make sure we're not doing MI. */ MVMObject *parents = MVM_repr_at_pos_o(tc, type_info, 2); MVMint32 num_parents = MVM_repr_elems(tc, parents); MVM_gc_root_temp_push(tc, (MVMCollectable **)¤t_class); if (num_parents <= 1) { /* Get attributes and iterate over them. */ MVMObject *attributes = MVM_repr_at_pos_o(tc, type_info, 1); MVMIter * const attr_iter = (MVMIter *)MVM_iter(tc, attributes); MVMObject *attr_map = NULL; if (MVM_iter_istrue(tc, attr_iter)) { MVM_gc_root_temp_push(tc, (MVMCollectable **)&attr_iter); attr_map = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_hash_type); MVM_gc_root_temp_push(tc, (MVMCollectable **)&attr_map); } while (MVM_iter_istrue(tc, attr_iter)) { MVMObject *current_slot_obj = MVM_repr_box_int(tc, MVM_hll_current(tc)->int_box_type, current_slot); MVMObject *attr, *name_obj; MVMString *name; MVM_repr_shift_o(tc, (MVMObject *)attr_iter); /* Get attribute. */ attr = MVM_iterval(tc, attr_iter); /* Get its name. */ name_obj = MVM_repr_at_key_o(tc, attr, instance->str_consts.name); name = MVM_repr_get_str(tc, name_obj); MVM_repr_bind_key_o(tc, attr_map, name, current_slot_obj); current_slot++; /* Push attr onto the flat list. */ MVM_repr_push_o(tc, flat_list, attr); } if (attr_map) { MVM_gc_root_temp_pop_n(tc, 2); } /* Add to class list and map list. */ MVM_repr_push_o(tc, class_list, current_class); MVM_repr_push_o(tc, attr_map_list, attr_map); } else { MVM_exception_throw_adhoc(tc, "CStruct representation does not support multiple inheritance"); } MVM_gc_root_temp_pop(tc); /* current_class */ } MVM_gc_root_temp_pop_n(tc, 4); /* We can now form the name map. */ num_classes = MVM_repr_elems(tc, class_list); result = (MVMCStructNameMap *) MVM_malloc(sizeof(MVMCStructNameMap) * (1 + num_classes)); for (i = 0; i < num_classes; i++) { result[i].class_key = MVM_repr_at_pos_o(tc, class_list, i); result[i].name_map = MVM_repr_at_pos_o(tc, attr_map_list, i); } /* set the end to be NULL, it's useful for iteration. */ result[i].class_key = NULL; repr_data->name_to_index_mapping = result; return flat_list; } static MVMint32 round_up_to_multi(MVMint32 i, MVMint32 m) { return (MVMint32)((i + m - 1) / m) * m; } /* This works out an allocation strategy for the object. It takes care of * "inlining" storage of attributes that are natively typed, as well as * noting unbox targets. */ static void compute_allocation_strategy(MVMThreadContext *tc, MVMObject *repr_info, MVMCStructREPRData *repr_data, MVMSTable *st) { /* Compute index mapping table and get flat list of attributes. */ MVMObject *flat_list; MVMROOT(tc, st, { flat_list = index_mapping_and_flat_list(tc, repr_info, repr_data); }); /* If we have no attributes in the index mapping, then just the header. */ if (repr_data->name_to_index_mapping[0].class_key == NULL) { repr_data->struct_size = 1; /* avoid 0-byte malloc */ repr_data->struct_align = ALIGNOF(void *); } /* Otherwise, we need to compute the allocation strategy. */ else { /* We track the size of the struct, which is what we'll want offsets into. */ MVMint32 cur_size = 0; MVMint32 struct_size = 0; /* Get number of attributes and set up various counters. */ MVMint32 num_attrs = MVM_repr_elems(tc, flat_list); MVMint32 info_alloc = num_attrs; MVMint32 cur_obj_attr = 0; MVMint32 cur_init_slot = 0; MVMint32 i; if (info_alloc == 0) MVM_exception_throw_adhoc(tc, "Class %s has no attributes, which is illegal with the CStruct representation.", MVM_6model_get_stable_debug_name(tc, st)); /* Allocate location/offset arrays and GC mark info arrays. */ repr_data->num_attributes = num_attrs; repr_data->attribute_locations = (MVMint32 *) MVM_malloc(info_alloc * sizeof(MVMint32)); repr_data->struct_offsets = (MVMint32 *) MVM_malloc(info_alloc * sizeof(MVMint32)); repr_data->flattened_stables = (MVMSTable **) MVM_calloc(info_alloc, sizeof(MVMObject *)); repr_data->member_types = (MVMObject **) MVM_calloc(info_alloc, sizeof(MVMObject *)); repr_data->struct_align = 0; /* Go over the attributes and arrange their allocation. */ for (i = 0; i < num_attrs; i++) { /* Fetch its type; see if it's some kind of unboxed type. */ MVMObject *attr = MVM_repr_at_pos_o(tc, flat_list, i); MVMObject *type = MVM_repr_at_key_o(tc, attr, tc->instance->str_consts.type); MVMObject *inlined_val = MVM_repr_at_key_o(tc, attr, tc->instance->str_consts.inlined); MVMint64 inlined = !MVM_is_null(tc, inlined_val) && MVM_repr_get_int(tc, inlined_val); MVMint32 bits = sizeof(void *) * 8; MVMint32 align = ALIGNOF(void *); if (!MVM_is_null(tc, type)) { /* See if it's a type that we know how to handle in a C struct. */ const MVMStorageSpec *spec = REPR(type)->get_storage_spec(tc, STABLE(type)); MVMint32 type_id = REPR(type)->ID; if (spec->inlineable == MVM_STORAGE_SPEC_INLINED && (spec->boxed_primitive == MVM_STORAGE_SPEC_BP_INT || spec->boxed_primitive == MVM_STORAGE_SPEC_BP_NUM)) { /* It's a boxed int or num; pretty easy. It'll just live in the * body of the struct. Instead of masking in i here (which * would be the parallel to how we handle boxed types) we * repurpose it to store the bit-width of the type, so * that get_attribute_ref can find it later. */ bits = spec->bits; align = spec->align; repr_data->attribute_locations[i] = (bits << MVM_CSTRUCT_ATTR_SHIFT) | MVM_CSTRUCT_ATTR_IN_STRUCT; repr_data->flattened_stables[i] = STABLE(type); if (REPR(type)->initialize) { if (!repr_data->initialize_slots) repr_data->initialize_slots = (MVMint32 *) MVM_calloc(info_alloc + 1, sizeof(MVMint32)); repr_data->initialize_slots[cur_init_slot] = i; cur_init_slot++; } } else if (spec->can_box & MVM_STORAGE_SPEC_CAN_BOX_STR) { /* It's a string of some kind. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CSTRUCT_ATTR_SHIFT) | MVM_CSTRUCT_ATTR_STRING; MVM_ASSIGN_REF(tc, &(st->header), repr_data->member_types[i], type); MVM_ASSIGN_REF(tc, &(st->header), repr_data->flattened_stables[i], STABLE(type)); if (REPR(type)->initialize) { if (!repr_data->initialize_slots) repr_data->initialize_slots = (MVMint32 *) MVM_calloc(info_alloc + 1, sizeof(MVMint32)); repr_data->initialize_slots[cur_init_slot] = i; cur_init_slot++; } } else if (type_id == MVM_REPR_ID_MVMCArray) { /* It's a CArray of some kind. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CSTRUCT_ATTR_SHIFT) | MVM_CSTRUCT_ATTR_CARRAY; MVM_ASSIGN_REF(tc, &(st->header), repr_data->member_types[i], type); } else if (type_id == MVM_REPR_ID_MVMCStruct) { /* It's a CStruct. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CSTRUCT_ATTR_SHIFT) | MVM_CSTRUCT_ATTR_CSTRUCT; MVM_ASSIGN_REF(tc, &(st->header), repr_data->member_types[i], type); if (inlined) { MVMCStructREPRData *cstruct_repr_data = (MVMCStructREPRData *)STABLE(type)->REPR_data; bits = cstruct_repr_data->struct_size * 8; align = cstruct_repr_data->struct_align; repr_data->attribute_locations[i] |= MVM_CSTRUCT_ATTR_INLINED; } } else if (type_id == MVM_REPR_ID_MVMCPPStruct) { /* It's a CPPStruct. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CSTRUCT_ATTR_SHIFT) | MVM_CSTRUCT_ATTR_CPPSTRUCT; MVM_ASSIGN_REF(tc, &(st->header), repr_data->member_types[i], type); if (inlined) { MVMCPPStructREPRData *cppstruct_repr_data = (MVMCPPStructREPRData *)STABLE(type)->REPR_data; bits = cppstruct_repr_data->struct_size * 8; align = cppstruct_repr_data->struct_align; repr_data->attribute_locations[i] |= MVM_CSTRUCT_ATTR_INLINED; } } else if (type_id == MVM_REPR_ID_MVMCUnion) { /* It's a CUnion. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CSTRUCT_ATTR_SHIFT) | MVM_CSTRUCT_ATTR_CUNION; MVM_ASSIGN_REF(tc, &(st->header), repr_data->member_types[i], type); if (inlined) { MVMCUnionREPRData *cunion_repr_data = (MVMCUnionREPRData *)STABLE(type)->REPR_data; bits = cunion_repr_data->struct_size * 8; align = cunion_repr_data->struct_align; repr_data->attribute_locations[i] |= MVM_CSTRUCT_ATTR_INLINED; } } else if (type_id == MVM_REPR_ID_MVMCPointer) { /* It's a CPointer. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CSTRUCT_ATTR_SHIFT) | MVM_CSTRUCT_ATTR_CPTR; MVM_ASSIGN_REF(tc, &(st->header), repr_data->member_types[i], type); } else { MVM_exception_throw_adhoc(tc, "CStruct representation only handles attributes of type:\n" " (u)int8, (u)int16, (u)int32, (u)int64, (u)long, (u)longlong, num32, num64, (s)size_t, bool, Str\n" " and types with representation: CArray, CPointer, CStruct, CPPStruct and CUnion"); } } else { MVM_exception_throw_adhoc(tc, "CStruct representation requires the types of all attributes to be specified"); } if (bits % 8) { MVM_exception_throw_adhoc(tc, "CStruct only supports native types that are a multiple of 8 bits wide (was passed: %"PRId32")", bits); } /* Do allocation. */ /* C structure needs careful alignment. If cur_size is not aligned * to align bytes (cur_size % align), make sure it is before we * add the next element. */ if (cur_size % align) { cur_size += align - cur_size % align; } if (align > repr_data->struct_align) repr_data->struct_align = align; repr_data->struct_offsets[i] = cur_size; cur_size += bits / 8; struct_size = round_up_to_multi(struct_size, align) + bits/8; } /* Finally, put computed allocation size in place; it's body size plus * header size. Also number of markables and sentinels. */ repr_data->struct_size = round_up_to_multi(struct_size, repr_data->struct_align); if (repr_data->initialize_slots) repr_data->initialize_slots[cur_init_slot] = -1; } } /* Helper for reading a pointer at the specified offset. */ static void * get_ptr_at_offset(void *data, MVMint32 offset) { void *location = (char *)data + offset; return *((void **)location); } /* Helper for writing a pointer at the specified offset. */ static void set_ptr_at_offset(void *data, MVMint32 offset, void *value) { void *location = (char *)data + offset; *((void **)location) = value; } /* Helper for finding a slot number. */ static MVMint32 try_get_slot(MVMThreadContext *tc, MVMCStructREPRData *repr_data, MVMObject *class_key, MVMString *name) { if (repr_data->name_to_index_mapping) { MVMCStructNameMap *cur_map_entry = repr_data->name_to_index_mapping; while (cur_map_entry->class_key != NULL) { if (cur_map_entry->class_key == class_key) { MVMObject *slot_obj = MVM_repr_at_key_o(tc, cur_map_entry->name_map, name); if (slot_obj && IS_CONCRETE(slot_obj)) return MVM_repr_get_int(tc, slot_obj); break; } cur_map_entry++; } } return -1; } /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &CStruct_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMCStruct); }); return st->WHAT; } /* Composes the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *repr_info) { /* Compute allocation strategy. */ MVMCStructREPRData *repr_data = MVM_calloc(1, sizeof(MVMCStructREPRData)); MVMObject *attr_info = MVM_repr_at_key_o(tc, repr_info, tc->instance->str_consts.attribute); compute_allocation_strategy(tc, attr_info, repr_data, st); st->REPR_data = repr_data; } /* Initialize a new instance. */ static void initialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMCStructREPRData * repr_data = (MVMCStructREPRData *)st->REPR_data; /* Allocate object body. */ MVMCStructBody *body = (MVMCStructBody *)data; body->cstruct = MVM_calloc(1, repr_data->struct_size > 0 ? repr_data->struct_size : 1); /* Allocate child obj array. */ if (repr_data->num_child_objs > 0) body->child_objs = (MVMObject **)MVM_calloc(repr_data->num_child_objs, sizeof(MVMObject *)); /* Initialize the slots. */ if (repr_data->initialize_slots) { MVMint32 i; for (i = 0; repr_data->initialize_slots[i] >= 0; i++) { MVMint32 offset = repr_data->struct_offsets[repr_data->initialize_slots[i]]; MVMSTable *st = repr_data->flattened_stables[repr_data->initialize_slots[i]]; st->REPR->initialize(tc, st, root, (char *)body->cstruct + offset); } } } /* Copies to the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "cloning a CStruct is NYI"); } /* Helper for complaining about attribute access errors. */ MVM_NO_RETURN static void no_such_attribute(MVMThreadContext *tc, const char *action, MVMObject *class_handle, MVMString *name) MVM_NO_RETURN_GCC; static void no_such_attribute(MVMThreadContext *tc, const char *action, MVMObject *class_handle, MVMString *name) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Can not %s non-existent attribute '%s'", action, c_name); } /* Helper to die because this type doesn't support attributes. */ MVM_NO_RETURN static void die_no_attrs(MVMThreadContext *tc) MVM_NO_RETURN_GCC; static void die_no_attrs(MVMThreadContext *tc) { MVM_exception_throw_adhoc(tc, "CStruct representation attribute not yet fully implemented"); } static void get_attribute(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister *result_reg, MVMuint16 kind) { MVMCStructREPRData *repr_data = (MVMCStructREPRData *)st->REPR_data; MVMCStructBody *body = (MVMCStructBody *)data; MVMint64 slot; if (!repr_data) MVM_exception_throw_adhoc(tc, "CStruct: must compose before using get_attribute"); slot = hint >= 0 ? hint : try_get_slot(tc, repr_data, class_handle, name); if (slot >= 0) { MVMSTable *attr_st = repr_data->flattened_stables[slot]; switch (kind) { case MVM_reg_obj: { MVMint32 type = repr_data->attribute_locations[slot] & MVM_CSTRUCT_ATTR_MASK; MVMint32 real_slot = repr_data->attribute_locations[slot] >> MVM_CSTRUCT_ATTR_SHIFT; if (type == MVM_CSTRUCT_ATTR_IN_STRUCT) { MVM_exception_throw_adhoc(tc, "CStruct can't perform boxed get on flattened attributes yet"); } else { MVMObject *typeobj = repr_data->member_types[slot]; MVMObject *obj = body->child_objs[real_slot]; if (!obj) { /* No cached object. */ void *cobj = get_ptr_at_offset(body->cstruct, repr_data->struct_offsets[slot]); if (cobj) { MVMObject **child_objs = body->child_objs; if (type == MVM_CSTRUCT_ATTR_CARRAY) { obj = MVM_nativecall_make_carray(tc, typeobj, cobj); } else if(type == MVM_CSTRUCT_ATTR_CSTRUCT) { if (repr_data->attribute_locations[slot] & MVM_CSTRUCT_ATTR_INLINED) obj = MVM_nativecall_make_cstruct(tc, typeobj, (char *)body->cstruct + repr_data->struct_offsets[slot]); else obj = MVM_nativecall_make_cstruct(tc, typeobj, cobj); } else if(type == MVM_CSTRUCT_ATTR_CPPSTRUCT) { if (repr_data->attribute_locations[slot] & MVM_CSTRUCT_ATTR_INLINED) obj = MVM_nativecall_make_cppstruct(tc, typeobj, (char *)body->cstruct + repr_data->struct_offsets[slot]); else obj = MVM_nativecall_make_cppstruct(tc, typeobj, cobj); } else if(type == MVM_CSTRUCT_ATTR_CUNION) { if (repr_data->attribute_locations[slot] & MVM_CSTRUCT_ATTR_INLINED) obj = MVM_nativecall_make_cunion(tc, typeobj, (char *)body->cstruct + repr_data->struct_offsets[slot]); else obj = MVM_nativecall_make_cunion(tc, typeobj, cobj); } else if(type == MVM_CSTRUCT_ATTR_CPTR) { obj = MVM_nativecall_make_cpointer(tc, typeobj, cobj); } else if(type == MVM_CSTRUCT_ATTR_STRING) { MVMROOT(tc, typeobj, { MVMString *str = MVM_string_utf8_decode(tc, tc->instance->VMString, cobj, strlen(cobj)); obj = MVM_repr_box_str(tc, typeobj, str); }); } child_objs[real_slot] = obj; } else { obj = typeobj; } } result_reg->o = obj; } break; } case MVM_reg_int64: { if (attr_st) result_reg->i64 = attr_st->REPR->box_funcs.get_int(tc, attr_st, root, ((char *)body->cstruct) + repr_data->struct_offsets[slot]); else MVM_exception_throw_adhoc(tc, "CStruct: invalid native get of object attribute"); break; } case MVM_reg_num64: { if (attr_st) result_reg->n64 = attr_st->REPR->box_funcs.get_num(tc, attr_st, root, ((char *)body->cstruct) + repr_data->struct_offsets[slot]); else MVM_exception_throw_adhoc(tc, "CStruct: invalid native get of object attribute"); break; } case MVM_reg_str: { if (attr_st) result_reg->s = attr_st->REPR->box_funcs.get_str(tc, attr_st, root, ((char *)body->cstruct) + repr_data->struct_offsets[slot]); else MVM_exception_throw_adhoc(tc, "CStruct: invalid native get of object attribute"); if (!result_reg->s) result_reg->s = tc->instance->str_consts.empty; break; } default: MVM_exception_throw_adhoc(tc, "CStruct: invalid kind in attribute get for '%s'", MVM_reg_get_debug_name(tc, kind)); } } else { no_such_attribute(tc, "bind", class_handle, name); } } /* Binds the given value to the specified attribute. */ static void bind_attribute(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister value_reg, MVMuint16 kind) { MVMCStructREPRData *repr_data = (MVMCStructREPRData *)st->REPR_data; MVMCStructBody *body = (MVMCStructBody *)data; MVMint64 slot; if (!repr_data) MVM_exception_throw_adhoc(tc, "CStruct: must compose before using bind_attribute"); slot = hint >= 0 ? hint : try_get_slot(tc, repr_data, class_handle, name); if (slot >= 0) { MVMSTable *attr_st = repr_data->flattened_stables[slot]; switch (kind) { case MVM_reg_obj: { MVMObject *value = value_reg.o; MVMint32 type = repr_data->attribute_locations[slot] & MVM_CSTRUCT_ATTR_MASK; if (type == MVM_CSTRUCT_ATTR_IN_STRUCT) { MVM_exception_throw_adhoc(tc, "CStruct can't perform boxed bind on flattened attributes yet"); } else { MVMint32 real_slot = repr_data->attribute_locations[slot] >> MVM_CSTRUCT_ATTR_SHIFT; if (IS_CONCRETE(value)) { void *cobj = NULL; MVM_ASSIGN_REF(tc, &(root->header), body->child_objs[real_slot], value); /* Set cobj to correct pointer based on type of value. */ if (type == MVM_CSTRUCT_ATTR_CARRAY) { if (REPR(value)->ID != MVM_REPR_ID_MVMCArray) MVM_exception_throw_adhoc(tc, "Can only store CArray attribute in CArray slot in CStruct"); cobj = ((MVMCArray *)value)->body.storage; } else if (type == MVM_CSTRUCT_ATTR_CSTRUCT) { if (REPR(value)->ID != MVM_REPR_ID_MVMCStruct) MVM_exception_throw_adhoc(tc, "Can only store CStruct attribute in CStruct slot in CStruct"); cobj = ((MVMCStruct *)value)->body.cstruct; } else if (type == MVM_CSTRUCT_ATTR_CPPSTRUCT) { if (REPR(value)->ID != MVM_REPR_ID_MVMCPPStruct) MVM_exception_throw_adhoc(tc, "Can only store CPPStruct attribute in CPPStruct slot in CStruct"); cobj = ((MVMCPPStruct *)value)->body.cppstruct; } else if (type == MVM_CSTRUCT_ATTR_CUNION) { if (REPR(value)->ID != MVM_REPR_ID_MVMCUnion) MVM_exception_throw_adhoc(tc, "Can only store CUnion attribute in CUnion slot in CStruct"); cobj = ((MVMCUnion *)value)->body.cunion; } else if (type == MVM_CSTRUCT_ATTR_CPTR) { if (REPR(value)->ID != MVM_REPR_ID_MVMCPointer) MVM_exception_throw_adhoc(tc, "Can only store CPointer attribute in CPointer slot in CStruct"); cobj = ((MVMCPointer *)value)->body.ptr; } else if (type == MVM_CSTRUCT_ATTR_STRING) { MVMString *str = MVM_repr_get_str(tc, value); cobj = MVM_string_utf8_encode_C_string(tc, str); } set_ptr_at_offset(body->cstruct, repr_data->struct_offsets[slot], cobj); } else { body->child_objs[real_slot] = NULL; set_ptr_at_offset(body->cstruct, repr_data->struct_offsets[slot], NULL); } } break; } case MVM_reg_int64: { if (attr_st) attr_st->REPR->box_funcs.set_int(tc, attr_st, root, ((char *)body->cstruct) + repr_data->struct_offsets[slot], value_reg.i64); else MVM_exception_throw_adhoc(tc, "CStruct: invalid native binding to object attribute"); break; } case MVM_reg_num64: { if (attr_st) attr_st->REPR->box_funcs.set_num(tc, attr_st, root, ((char *)body->cstruct) + repr_data->struct_offsets[slot], value_reg.n64); else MVM_exception_throw_adhoc(tc, "CStruct: invalid native binding to object attribute"); break; } case MVM_reg_str: { if (attr_st) attr_st->REPR->box_funcs.set_str(tc, attr_st, root, ((char *)body->cstruct) + repr_data->struct_offsets[slot], value_reg.s); else MVM_exception_throw_adhoc(tc, "CStruct: invalid native binding to object attribute"); break; } default: MVM_exception_throw_adhoc(tc, "CStruct: invalid kind in attribute bind"); } } else { no_such_attribute(tc, "bind", class_handle, name); } } /* Checks if an attribute has been initialized. */ static MVMint64 is_attribute_initialized(MVMThreadContext *tc, MVMSTable *st, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint) { die_no_attrs(tc); } /* Gets the hint for the given attribute ID. */ static MVMint64 hint_for(MVMThreadContext *tc, MVMSTable *st, MVMObject *class_handle, MVMString *name) { return MVM_NO_HINT; } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMCStructREPRData *repr_data = (MVMCStructREPRData *) st->REPR_data; MVMCStructBody *body = (MVMCStructBody *)data; MVMint32 i; for (i = 0; i < repr_data->num_child_objs; i++) MVM_gc_worklist_add(tc, worklist, &body->child_objs[i]); } /* Marks the representation data in an STable.*/ static void gc_mark_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMGCWorklist *worklist) { MVMCStructREPRData *repr_data = (MVMCStructREPRData *)st->REPR_data; if (repr_data) { MVMint32 i; if (repr_data->name_to_index_mapping) { MVMCStructNameMap *map = repr_data->name_to_index_mapping; for (i = 0; map[i].class_key; i++) { MVM_gc_worklist_add(tc, worklist, &map[i].class_key); MVM_gc_worklist_add(tc, worklist, &map[i].name_map); } } if (repr_data->flattened_stables) { MVMSTable **flattened_stables = repr_data->flattened_stables; for (i = 0; i < repr_data->num_attributes; i++) MVM_gc_worklist_add(tc, worklist, &flattened_stables[i]); } if (repr_data->member_types) { MVMObject **member_types = repr_data->member_types; for (i = 0; i < repr_data->num_attributes; i++) MVM_gc_worklist_add(tc, worklist, &member_types[i]); } } } /* Free representation data. */ static void gc_free_repr_data(MVMThreadContext *tc, MVMSTable *st) { MVMCStructREPRData *repr_data = (MVMCStructREPRData *)st->REPR_data; /* May not have survived to composition. */ if (repr_data == NULL) return; if (repr_data->name_to_index_mapping) { MVM_free(repr_data->name_to_index_mapping); MVM_free(repr_data->attribute_locations); MVM_free(repr_data->struct_offsets); MVM_free(repr_data->flattened_stables); MVM_free(repr_data->member_types); MVM_free(repr_data->initialize_slots); } MVM_free(st->REPR_data); } /* This is called to do any cleanup of resources when an object gets * embedded inside another one. Never called on a top-level object. */ static void gc_cleanup(MVMThreadContext *tc, MVMSTable *st, void *data) { MVMCStructBody *body = (MVMCStructBody *)data; if (body->child_objs) MVM_free(body->child_objs); /* XXX For some reason, this causes crashes at the moment. Need to * work out why. */ /*if (body->cstruct) MVM_free(body->cstruct);*/ } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { gc_cleanup(tc, STABLE(obj), OBJECT_BODY(obj)); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ sizeof(void*) * 8, /* bits */ ALIGNOF(void*), /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Serializes the REPR data. */ static void serialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationWriter *writer) { MVMCStructREPRData *repr_data = (MVMCStructREPRData *)st->REPR_data; MVMint32 i, num_classes, num_slots; MVM_serialization_write_int(tc, writer, repr_data->struct_size); MVM_serialization_write_int(tc, writer, repr_data->struct_align); MVM_serialization_write_int(tc, writer, repr_data->num_attributes); MVM_serialization_write_int(tc, writer, repr_data->num_child_objs); for(i = 0; i < repr_data->num_attributes; i++){ MVM_serialization_write_int(tc, writer, repr_data->attribute_locations[i]); MVM_serialization_write_int(tc, writer, repr_data->struct_offsets[i]); MVM_serialization_write_int(tc, writer, repr_data->flattened_stables[i] != NULL); if (repr_data->flattened_stables[i]) MVM_serialization_write_stable_ref(tc, writer, repr_data->flattened_stables[i]); MVM_serialization_write_ref(tc, writer, repr_data->member_types[i]); } i=0; while (repr_data->name_to_index_mapping[i].class_key) i++; num_classes = i; MVM_serialization_write_int(tc, writer, num_classes); for(i = 0; i < num_classes; i++){ MVM_serialization_write_ref(tc, writer, repr_data->name_to_index_mapping[i].class_key); MVM_serialization_write_ref(tc, writer, repr_data->name_to_index_mapping[i].name_map); } i=0; while(repr_data->initialize_slots && repr_data->initialize_slots[i] != -1) i++; num_slots = i; MVM_serialization_write_int(tc, writer, num_slots); for(i = 0; i < num_slots; i++){ MVM_serialization_write_int(tc, writer, repr_data->initialize_slots[i]); } } /* Deserializes the REPR data. */ static void deserialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { MVMCStructREPRData *repr_data = (MVMCStructREPRData *) MVM_malloc(sizeof(MVMCStructREPRData)); MVMint32 i, num_classes, num_slots; repr_data->struct_size = MVM_serialization_read_int(tc, reader); if (reader->root.version >= 17) { repr_data->struct_align = MVM_serialization_read_int(tc, reader); } repr_data->num_attributes = MVM_serialization_read_int(tc, reader); repr_data->num_child_objs = MVM_serialization_read_int(tc, reader); repr_data->attribute_locations = (MVMint32 *)MVM_malloc(sizeof(MVMint32) * repr_data->num_attributes); repr_data->struct_offsets = (MVMint32 *)MVM_malloc(sizeof(MVMint32) * repr_data->num_attributes); repr_data->flattened_stables = (MVMSTable **)MVM_malloc(repr_data->num_attributes * sizeof(MVMSTable *)); repr_data->member_types = (MVMObject **)MVM_malloc(repr_data->num_attributes * sizeof(MVMObject *)); for(i = 0; i < repr_data->num_attributes; i++) { repr_data->attribute_locations[i] = MVM_serialization_read_int(tc, reader); repr_data->struct_offsets[i] = MVM_serialization_read_int(tc, reader); if(MVM_serialization_read_int(tc, reader)){ MVM_ASSIGN_REF(tc, &(st->header), repr_data->flattened_stables[i], MVM_serialization_read_stable_ref(tc, reader)); } else { repr_data->flattened_stables[i] = NULL; } repr_data->member_types[i] = MVM_serialization_read_ref(tc, reader); } num_classes = MVM_serialization_read_int(tc, reader); repr_data->name_to_index_mapping = (MVMCStructNameMap *)MVM_malloc(sizeof(MVMCStructNameMap) * (1 + num_classes)); for(i = 0; i < num_classes; i++){ repr_data->name_to_index_mapping[i].class_key = MVM_serialization_read_ref(tc, reader); repr_data->name_to_index_mapping[i].name_map = MVM_serialization_read_ref(tc, reader); } repr_data->name_to_index_mapping[i].class_key = NULL; repr_data->name_to_index_mapping[i].name_map = NULL; num_slots = MVM_serialization_read_int(tc, reader); repr_data->initialize_slots = (MVMint32 *)MVM_malloc(sizeof(MVMint32) * (1 + num_slots)); for(i = 0; i < num_slots; i++){ repr_data->initialize_slots[i] = MVM_serialization_read_int(tc, reader); } repr_data->initialize_slots[i] = -1; st->REPR_data = repr_data; } static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMCStruct); } /* Initializes the representation. */ const MVMREPROps * MVMCStruct_initialize(MVMThreadContext *tc) { return &CStruct_this_repr; } static const MVMREPROps CStruct_this_repr = { type_object_for, MVM_gc_allocate_object, initialize, copy_to, { get_attribute, bind_attribute, hint_for, is_attribute_initialized, MVM_REPR_DEFAULT_ATTRIBUTE_AS_ATOMIC }, /* attr_funcs */ MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ serialize_repr_data, deserialize_repr_data, deserialize_stable_size, gc_mark, gc_free, gc_cleanup, gc_mark_repr_data, gc_free_repr_data, compose, NULL, /* spesh */ "CStruct", /* name */ MVM_REPR_ID_MVMCStruct, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; MoarVM-2018.03/src/6model/reprs/CStruct.h0000644000175000017510000000613013237701240020052 0ustar samanthasamantha/* Attribute location flags. */ #define MVM_CSTRUCT_ATTR_IN_STRUCT 0 #define MVM_CSTRUCT_ATTR_CSTRUCT 1 #define MVM_CSTRUCT_ATTR_CARRAY 2 #define MVM_CSTRUCT_ATTR_CPTR 3 #define MVM_CSTRUCT_ATTR_STRING 4 #define MVM_CSTRUCT_ATTR_CUNION 5 #define MVM_CSTRUCT_ATTR_CPPSTRUCT 6 #define MVM_CSTRUCT_ATTR_MASK 7 #define MVM_CSTRUCT_ATTR_INLINED 8 /* Bits to shift a slot position to make room for MVM_CSTRUCT_ATTR_*. */ #define MVM_CSTRUCT_ATTR_SHIFT 4 /* The CStruct representation maintains a chunk of memory that it can * always pass off to C land. If we in turn embed any strings, pointers * to other CStruct REPR objects and so forth, we need to both keep the * C-friendly bit of memory and a copy to the GC-able, 6model objects in * sync. */ struct MVMCStructBody { /* GC-marked objects that our C structure points into. */ MVMObject **child_objs; /* Pointer to the actual C structure memory; we don't inline it * directly in the body, since it doesn't work so well if we get * something returned and are wrapping it. */ void *cstruct; }; struct MVMCStruct { MVMObject common; MVMCStructBody body; }; /* This is used in the name to class mapping. */ struct MVMCStructNameMap { MVMObject *class_key; MVMObject *name_map; }; /* The CStruct REPR data contains info we need to do allocations, look up * attributes and so forth. */ struct MVMCStructREPRData { /* The size and alignment of the structure in bytes. */ MVMint32 struct_size; MVMint32 struct_align; /* The number of attributes we have allocated slots for. Note that * slots can vary in size. */ MVMint32 num_attributes; /* Number of child objects we store. */ MVMint32 num_child_objs; /* Lower bits are flags indicating what kind of attribute we have; * whether it's one that is just a simple value that we can always * access directly in the C struct body, or a more complex one that * we need to maintain in the C struct and in the GC-able list. Upper * bits say where to find it. */ MVMint32 *attribute_locations; /* Maps attribute position numbers to their location in the C struct. * Note that this will not be the only place we need to update for * any reference type. */ MVMint32 *struct_offsets; /* If the attribute was actually flattened in to this object from another * representation, this is the s-table of the type of that attribute. NULL * for attributes that are reference types. */ MVMSTable **flattened_stables; /* For reference type members, we cache the relevant type objects. * Flattened types have NULL here. */ MVMObject **member_types; /* A table mapping attribute names to indexes (which can then be looked * up in the offset table). Uses a final null entry as a sentinel. */ MVMCStructNameMap *name_to_index_mapping; /* Slots holding flattened objects that need another REPR to initialize * them; terminated with -1. */ MVMint32 *initialize_slots; }; /* Initializes the CStruct REPR. */ const MVMREPROps * MVMCStruct_initialize(MVMThreadContext *tc); MoarVM-2018.03/src/6model/reprs/CUnion.c0000644000175000017510000010704313237701240017656 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps CUnion_this_repr; /* Locates all of the attributes. Puts them onto a flattened, ordered * list of attributes (populating the passed flat_list). Also builds * the index mapping for doing named lookups. Note index is not related * to the storage position. */ static MVMObject * index_mapping_and_flat_list(MVMThreadContext *tc, MVMObject *mro, MVMCUnionREPRData *repr_data) { MVMInstance *instance = tc->instance; MVMObject *flat_list, *class_list, *attr_map_list; MVMint32 num_classes, i, current_slot = 0; MVMCUnionNameMap *result; MVMint32 mro_idx = MVM_repr_elems(tc, mro); flat_list = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_array_type); class_list = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_array_type); attr_map_list = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_array_type); /* Walk through the parents list. */ while (mro_idx) { /* Get current class in MRO. */ MVMObject *type_info = MVM_repr_at_pos_o(tc, mro, --mro_idx); MVMObject *current_class = MVM_repr_at_pos_o(tc, type_info, 0); /* Get its local parents; make sure we're not doing MI. */ MVMObject *parents = MVM_repr_at_pos_o(tc, type_info, 2); MVMint32 num_parents = MVM_repr_elems(tc, parents); if (num_parents <= 1) { /* Get attributes and iterate over them. */ MVMObject *attributes = MVM_repr_at_pos_o(tc, type_info, 1); MVMIter * const attr_iter = (MVMIter *)MVM_iter(tc, attributes); MVMObject *attr_map = NULL; if (MVM_iter_istrue(tc, attr_iter)) attr_map = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_hash_type); while (MVM_iter_istrue(tc, attr_iter)) { MVMObject *current_slot_obj = MVM_repr_box_int(tc, MVM_hll_current(tc)->int_box_type, current_slot); MVMObject *attr, *name_obj; MVMString *name; MVM_repr_shift_o(tc, (MVMObject *)attr_iter); /* Get attribute. */ attr = MVM_iterval(tc, attr_iter); /* Get its name. */ name_obj = MVM_repr_at_key_o(tc, attr, instance->str_consts.name); name = MVM_repr_get_str(tc, name_obj); MVM_repr_bind_key_o(tc, attr_map, name, current_slot_obj); current_slot++; /* Push attr onto the flat list. */ MVM_repr_push_o(tc, flat_list, attr); } /* Add to class list and map list. */ MVM_repr_push_o(tc, class_list, current_class); MVM_repr_push_o(tc, attr_map_list, attr_map); } else { MVM_exception_throw_adhoc(tc, "CUnion representation does not support multiple inheritance"); } } /* We can now form the name map. */ num_classes = MVM_repr_elems(tc, class_list); result = (MVMCUnionNameMap *) MVM_malloc(sizeof(MVMCUnionNameMap) * (1 + num_classes)); for (i = 0; i < num_classes; i++) { result[i].class_key = MVM_repr_at_pos_o(tc, class_list, i); result[i].name_map = MVM_repr_at_pos_o(tc, attr_map_list, i); } /* set the end to be NULL, it's useful for iteration. */ result[i].class_key = NULL; repr_data->name_to_index_mapping = result; return flat_list; } /* This works out an allocation strategy for the object. It takes care of * "inlining" storage of attributes that are natively typed, as well as * noting unbox targets. */ static void compute_allocation_strategy(MVMThreadContext *tc, MVMObject *repr_info, MVMCUnionREPRData *repr_data) { /* Compute index mapping table and get flat list of attributes. */ MVMObject *flat_list = index_mapping_and_flat_list(tc, repr_info, repr_data); /* If we have no attributes in the index mapping, then just the header. */ if (repr_data->name_to_index_mapping[0].class_key == NULL) { repr_data->struct_size = 1; /* avoid 0-byte malloc */ repr_data->struct_align = ALIGNOF(void *); } /* Otherwise, we need to compute the allocation strategy. */ else { /* The structure itself will as big as the biggest element. * So we keep track of that biggest element. */ MVMint32 total_size = 0; /* Get number of attributes and set up various counters. */ MVMint32 num_attrs = MVM_repr_elems(tc, flat_list); MVMint32 info_alloc = num_attrs == 0 ? 1 : num_attrs; MVMint32 cur_obj_attr = 0; MVMint32 cur_init_slot = 0; MVMint32 i; /* Allocate location/offset arrays and GC mark info arrays. */ repr_data->num_attributes = num_attrs; repr_data->attribute_locations = (MVMint32 *) MVM_malloc(info_alloc * sizeof(MVMint32)); repr_data->struct_offsets = (MVMint32 *) MVM_malloc(info_alloc * sizeof(MVMint32)); repr_data->flattened_stables = (MVMSTable **) MVM_calloc(info_alloc, sizeof(MVMObject *)); repr_data->member_types = (MVMObject **) MVM_calloc(info_alloc, sizeof(MVMObject *)); repr_data->struct_align = 0; /* Go over the attributes and arrange their allocation. */ for (i = 0; i < num_attrs; i++) { /* Fetch its type; see if it's some kind of unboxed type. */ MVMObject *attr = MVM_repr_at_pos_o(tc, flat_list, i); MVMObject *type = MVM_repr_at_key_o(tc, attr, tc->instance->str_consts.type); MVMObject *inlined_val = MVM_repr_at_key_o(tc, attr, tc->instance->str_consts.inlined); MVMint64 inlined = !MVM_is_null(tc, inlined_val) && MVM_repr_get_int(tc, inlined_val); MVMint32 bits = sizeof(void *) * 8; MVMint32 align = ALIGNOF(void *); if (!MVM_is_null(tc, type)) { /* See if it's a type that we know how to handle in a C struct. */ const MVMStorageSpec *spec = REPR(type)->get_storage_spec(tc, STABLE(type)); MVMint32 type_id = REPR(type)->ID; if (spec->inlineable == MVM_STORAGE_SPEC_INLINED && (spec->boxed_primitive == MVM_STORAGE_SPEC_BP_INT || spec->boxed_primitive == MVM_STORAGE_SPEC_BP_NUM)) { /* It's a boxed int or num; pretty easy. It'll just live in the * body of the struct. Instead of masking in i here (which * would be the parallel to how we handle boxed types) we * repurpose it to store the bit-width of the type, so * that get_attribute_ref can find it later. */ bits = spec->bits; align = spec->align; repr_data->attribute_locations[i] = (bits << MVM_CUNION_ATTR_SHIFT) | MVM_CUNION_ATTR_IN_STRUCT; repr_data->flattened_stables[i] = STABLE(type); if (REPR(type)->initialize) { if (!repr_data->initialize_slots) repr_data->initialize_slots = (MVMint32 *) MVM_calloc(info_alloc + 1, sizeof(MVMint32)); repr_data->initialize_slots[cur_init_slot] = i; cur_init_slot++; } } else if (spec->can_box & MVM_STORAGE_SPEC_CAN_BOX_STR) { /* It's a string of some kind. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CUNION_ATTR_SHIFT) | MVM_CUNION_ATTR_STRING; repr_data->member_types[i] = type; repr_data->flattened_stables[i] = STABLE(type); if (REPR(type)->initialize) { if (!repr_data->initialize_slots) repr_data->initialize_slots = (MVMint32 *) MVM_calloc(info_alloc + 1, sizeof(MVMint32)); repr_data->initialize_slots[cur_init_slot] = i; cur_init_slot++; } } else if (type_id == MVM_REPR_ID_MVMCArray) { /* It's a CArray of some kind. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CUNION_ATTR_SHIFT) | MVM_CUNION_ATTR_CARRAY; repr_data->member_types[i] = type; } else if (type_id == MVM_REPR_ID_MVMCStruct) { /* It's a CStruct. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CUNION_ATTR_SHIFT) | MVM_CUNION_ATTR_CSTRUCT; repr_data->member_types[i] = type; if (inlined) { MVMCStructREPRData *cstruct_repr_data = (MVMCStructREPRData *)STABLE(type)->REPR_data; bits = cstruct_repr_data->struct_size * 8; align = cstruct_repr_data->struct_align; repr_data->attribute_locations[i] |= MVM_CUNION_ATTR_INLINED; } } else if (type_id == MVM_REPR_ID_MVMCPPStruct) { /* It's a CPPStruct. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CUNION_ATTR_SHIFT) | MVM_CUNION_ATTR_CPPSTRUCT; repr_data->member_types[i] = type; if (inlined) { MVMCPPStructREPRData *cppstruct_repr_data = (MVMCPPStructREPRData *)STABLE(type)->REPR_data; bits = cppstruct_repr_data->struct_size * 8; align = cppstruct_repr_data->struct_align; repr_data->attribute_locations[i] |= MVM_CUNION_ATTR_INLINED; } } else if (type_id == MVM_REPR_ID_MVMCUnion) { /* It's a CUnion. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CUNION_ATTR_SHIFT) | MVM_CUNION_ATTR_CUNION; repr_data->member_types[i] = type; if (inlined) { MVMCUnionREPRData *cunion_repr_data = (MVMCUnionREPRData *)STABLE(type)->REPR_data; bits = cunion_repr_data->struct_size * 8; align = cunion_repr_data->struct_align; repr_data->attribute_locations[i] |= MVM_CUNION_ATTR_INLINED; } } else if (type_id == MVM_REPR_ID_MVMCPointer) { /* It's a CPointer. */ repr_data->num_child_objs++; repr_data->attribute_locations[i] = (cur_obj_attr++ << MVM_CUNION_ATTR_SHIFT) | MVM_CUNION_ATTR_CPTR; repr_data->member_types[i] = type; } else { MVM_exception_throw_adhoc(tc, "CUnion representation only handles attributes of type:\n" " (u)int8, (u)int16, (u)int32, (u)int64, (u)long, (u)longlong, num32, num64, (s)size_t, bool, Str\n" " and types with representation: CArray, CPointer, CStruct, CPPStruct and CUnion"); } } else { MVM_exception_throw_adhoc(tc, "CUnion representation requires the types of all attributes to be specified"); } if (bits % 8) { MVM_exception_throw_adhoc(tc, "CUnion only supports native types that are a multiple of 8 bits wide (was passed: %"PRId32")", bits); } if (align > repr_data->struct_align) repr_data->struct_align = align; repr_data->struct_offsets[i] = 0; if (bits / 8 > total_size) total_size = bits / 8; } /* Finally, put computed allocation size in place; it's body size plus * header size. Also number of markables and sentinels. */ repr_data->struct_size = total_size; if (repr_data->initialize_slots) repr_data->initialize_slots[cur_init_slot] = -1; } } /* Helper for reading an int at the specified offset. */ static MVMint32 get_int_at_offset(void *data, MVMint32 offset) { void *location = (char *)data + offset; return *((MVMint32 *)location); } /* Helper for writing an int at the specified offset. */ static void set_int_at_offset(void *data, MVMint32 offset, MVMint32 value) { void *location = (char *)data + offset; *((MVMint32 *)location) = value; } /* Helper for reading a num at the specified offset. */ static MVMnum32 get_num_at_offset(void *data, MVMint32 offset) { void *location = (char *)data + offset; return *((MVMnum32 *)location); } /* Helper for writing a num at the specified offset. */ static void set_num_at_offset(void *data, MVMint32 offset, MVMnum32 value) { void *location = (char *)data + offset; *((MVMnum32 *)location) = value; } /* Helper for reading a pointer at the specified offset. */ static void * get_ptr_at_offset(void *data, MVMint32 offset) { void *location = (char *)data + offset; return *((void **)location); } /* Helper for writing a pointer at the specified offset. */ static void set_ptr_at_offset(void *data, MVMint32 offset, void *value) { void *location = (char *)data + offset; *((void **)location) = value; } /* Helper for finding a slot number. */ static MVMint32 try_get_slot(MVMThreadContext *tc, MVMCUnionREPRData *repr_data, MVMObject *class_key, MVMString *name) { if (repr_data->name_to_index_mapping) { MVMCUnionNameMap *cur_map_entry = repr_data->name_to_index_mapping; while (cur_map_entry->class_key != NULL) { if (cur_map_entry->class_key == class_key) { MVMObject *slot_obj = MVM_repr_at_key_o(tc, cur_map_entry->name_map, name); if (IS_CONCRETE(slot_obj)) return MVM_repr_get_int(tc, slot_obj); break; } cur_map_entry++; } } return -1; } /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &CUnion_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMCUnion); }); return st->WHAT; } /* Composes the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *repr_info) { /* Compute allocation strategy. */ MVMCUnionREPRData *repr_data = MVM_calloc(1, sizeof(MVMCUnionREPRData)); MVMObject *attr_info = MVM_repr_at_key_o(tc, repr_info, tc->instance->str_consts.attribute); MVM_gc_allocate_gen2_default_set(tc); compute_allocation_strategy(tc, attr_info, repr_data); MVM_gc_allocate_gen2_default_clear(tc); st->REPR_data = repr_data; } /* Initialize a new instance. */ static void initialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMCUnionREPRData * repr_data = (MVMCUnionREPRData *)st->REPR_data; /* Allocate object body. */ MVMCUnionBody *body = (MVMCUnionBody *)data; body->cunion = MVM_calloc(1, repr_data->struct_size > 0 ? repr_data->struct_size : 1); /* Allocate child obj array. */ if (repr_data->num_child_objs > 0) body->child_objs = (MVMObject **)MVM_calloc(repr_data->num_child_objs, sizeof(MVMObject *)); /* Initialize the slots. */ if (repr_data->initialize_slots) { MVMint32 i; for (i = 0; repr_data->initialize_slots[i] >= 0; i++) { MVMint32 offset = repr_data->struct_offsets[repr_data->initialize_slots[i]]; MVMSTable *st = repr_data->flattened_stables[repr_data->initialize_slots[i]]; st->REPR->initialize(tc, st, root, (char *)body->cunion + offset); } } } /* Copies to the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMCUnionREPRData * repr_data = (MVMCUnionREPRData *) st->REPR_data; MVMCUnionBody *src_body = (MVMCUnionBody *)src; MVMCUnionBody *dest_body = (MVMCUnionBody *)dest; MVM_exception_throw_adhoc(tc, "cloning a CUnion is NYI"); } /* Helper for complaining about attribute access errors. */ MVM_NO_RETURN static void no_such_attribute(MVMThreadContext *tc, const char *action, MVMObject *class_handle, MVMString *name) MVM_NO_RETURN_GCC; static void no_such_attribute(MVMThreadContext *tc, const char *action, MVMObject *class_handle, MVMString *name) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Can not %s non-existent attribute '%s'", action, c_name); } /* Helper to die because this type doesn't support attributes. */ MVM_NO_RETURN static void die_no_attrs(MVMThreadContext *tc) MVM_NO_RETURN_GCC; static void die_no_attrs(MVMThreadContext *tc) { MVM_exception_throw_adhoc(tc, "CUnion representation attribute not yet fully implemented"); } static void get_attribute(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister *result_reg, MVMuint16 kind) { MVMCUnionREPRData *repr_data = (MVMCUnionREPRData *)st->REPR_data; MVMCUnionBody *body = (MVMCUnionBody *)data; MVMint64 slot; if (!repr_data) MVM_exception_throw_adhoc(tc, "CUnion: must compose before using get_attribute"); slot = hint >= 0 ? hint : try_get_slot(tc, repr_data, class_handle, name); if (slot >= 0) { MVMSTable *attr_st = repr_data->flattened_stables[slot]; switch (kind) { case MVM_reg_obj: { MVMint32 type = repr_data->attribute_locations[slot] & MVM_CUNION_ATTR_MASK; MVMint32 real_slot = repr_data->attribute_locations[slot] >> MVM_CUNION_ATTR_SHIFT; if (type == MVM_CUNION_ATTR_IN_STRUCT) { MVM_exception_throw_adhoc(tc, "CUnion can't perform boxed get on flattened attributes yet"); } else { MVMObject *typeobj = repr_data->member_types[slot]; MVMObject *obj = body->child_objs[real_slot]; if (!obj) { /* No cached object. */ if (repr_data->attribute_locations[slot] & MVM_CUNION_ATTR_INLINED) { if (type == MVM_CUNION_ATTR_CSTRUCT) { obj = MVM_nativecall_make_cstruct(tc, typeobj, (char *)body->cunion + repr_data->struct_offsets[slot]); } else if (type == MVM_CUNION_ATTR_CPPSTRUCT) { obj = MVM_nativecall_make_cppstruct(tc, typeobj, (char *)body->cunion + repr_data->struct_offsets[slot]); } else if (type == MVM_CUNION_ATTR_CUNION) { obj = MVM_nativecall_make_cunion(tc, typeobj, (char *)body->cunion + repr_data->struct_offsets[slot]); } } else { void *cobj = get_ptr_at_offset(body->cunion, repr_data->struct_offsets[slot]); if (cobj) { MVMObject **child_objs = body->child_objs; if (type == MVM_CUNION_ATTR_CARRAY) { obj = MVM_nativecall_make_carray(tc, typeobj, cobj); } else if(type == MVM_CUNION_ATTR_CSTRUCT) { obj = MVM_nativecall_make_cstruct(tc, typeobj, cobj); } else if(type == MVM_CUNION_ATTR_CPPSTRUCT) { obj = MVM_nativecall_make_cppstruct(tc, typeobj, cobj); } else if(type == MVM_CUNION_ATTR_CUNION) { obj = MVM_nativecall_make_cunion(tc, typeobj, cobj); } else if(type == MVM_CUNION_ATTR_CPTR) { obj = MVM_nativecall_make_cpointer(tc, typeobj, cobj); } else if(type == MVM_CUNION_ATTR_STRING) { MVMROOT(tc, typeobj, { MVMString *str = MVM_string_utf8_decode(tc, tc->instance->VMString, cobj, strlen(cobj)); obj = MVM_repr_box_str(tc, typeobj, str); }); } child_objs[real_slot] = obj; } else { obj = typeobj; } } } result_reg->o = obj; } break; } case MVM_reg_int64: { if (attr_st) result_reg->i64 = attr_st->REPR->box_funcs.get_int(tc, attr_st, root, ((char *)body->cunion) + repr_data->struct_offsets[slot]); else MVM_exception_throw_adhoc(tc, "CUnion: invalid native get of object attribute"); break; } case MVM_reg_num64: { if (attr_st) result_reg->n64 = attr_st->REPR->box_funcs.get_num(tc, attr_st, root, ((char *)body->cunion) + repr_data->struct_offsets[slot]); else MVM_exception_throw_adhoc(tc, "CUnion: invalid native get of object attribute"); break; } case MVM_reg_str: { if (attr_st) result_reg->s = attr_st->REPR->box_funcs.get_str(tc, attr_st, root, ((char *)body->cunion) + repr_data->struct_offsets[slot]); else MVM_exception_throw_adhoc(tc, "CUnion: invalid native get of object attribute"); if (!result_reg->s) result_reg->s = tc->instance->str_consts.empty; break; } default: MVM_exception_throw_adhoc(tc, "CUnion: invalid kind in attribute get"); } } else { no_such_attribute(tc, "bind", class_handle, name); } } /* Binds the given value to the specified attribute. */ static void bind_attribute(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister value_reg, MVMuint16 kind) { MVMCUnionREPRData *repr_data = (MVMCUnionREPRData *)st->REPR_data; MVMCUnionBody *body = (MVMCUnionBody *)data; MVMint64 slot; if (!repr_data) MVM_exception_throw_adhoc(tc, "CUnion: must compose before using bind_attribute"); slot = hint >= 0 ? hint : try_get_slot(tc, repr_data, class_handle, name); if (slot >= 0) { MVMSTable *attr_st = repr_data->flattened_stables[slot]; switch (kind) { case MVM_reg_obj: { MVMObject *value = value_reg.o; MVMint32 type = repr_data->attribute_locations[slot] & MVM_CUNION_ATTR_MASK; if (type == MVM_CUNION_ATTR_IN_STRUCT) { MVM_exception_throw_adhoc(tc, "CUnion can't perform boxed bind on flattened attributes yet"); } else { MVMint32 real_slot = repr_data->attribute_locations[slot] >> MVM_CUNION_ATTR_SHIFT; if (IS_CONCRETE(value)) { void *cobj = NULL; MVM_ASSIGN_REF(tc, &(root->header), body->child_objs[real_slot], value); /* Set cobj to correct pointer based on type of value. */ if (type == MVM_CUNION_ATTR_CARRAY) { if (REPR(value)->ID != MVM_REPR_ID_MVMCArray) MVM_exception_throw_adhoc(tc, "Can only store CArray attribute in CArray slot in CUnion"); cobj = ((MVMCArray *)value)->body.storage; } else if (type == MVM_CUNION_ATTR_CSTRUCT) { if (REPR(value)->ID != MVM_REPR_ID_MVMCStruct) MVM_exception_throw_adhoc(tc, "Can only store CStruct attribute in CStruct slot in CUnion"); cobj = ((MVMCStruct *)value)->body.cstruct; } else if (type == MVM_CUNION_ATTR_CPTR) { if (REPR(value)->ID != MVM_REPR_ID_MVMCPointer) MVM_exception_throw_adhoc(tc, "Can only store CPointer attribute in CPointer slot in CUnion"); cobj = ((MVMCPointer *)value)->body.ptr; } else if (type == MVM_CUNION_ATTR_STRING) { MVMString *str = MVM_repr_get_str(tc, value); cobj = MVM_string_utf8_encode_C_string(tc, str); } set_ptr_at_offset(body->cunion, repr_data->struct_offsets[slot], cobj); } else { body->child_objs[real_slot] = NULL; set_ptr_at_offset(body->cunion, repr_data->struct_offsets[slot], NULL); } } break; } case MVM_reg_int64: { if (attr_st) attr_st->REPR->box_funcs.set_int(tc, attr_st, root, ((char *)body->cunion) + repr_data->struct_offsets[slot], value_reg.i64); else MVM_exception_throw_adhoc(tc, "CUnion: invalid native binding to object attribute"); break; } case MVM_reg_num64: { if (attr_st) attr_st->REPR->box_funcs.set_num(tc, attr_st, root, ((char *)body->cunion) + repr_data->struct_offsets[slot], value_reg.n64); else MVM_exception_throw_adhoc(tc, "CUnion: invalid native binding to object attribute"); break; } case MVM_reg_str: { if (attr_st) attr_st->REPR->box_funcs.set_str(tc, attr_st, root, ((char *)body->cunion) + repr_data->struct_offsets[slot], value_reg.s); else MVM_exception_throw_adhoc(tc, "CUnion: invalid native binding to object attribute"); break; } default: MVM_exception_throw_adhoc(tc, "CUnion: invalid kind in attribute bind"); } } else { no_such_attribute(tc, "bind", class_handle, name); } } /* Checks if an attribute has been initialized. */ static MVMint64 is_attribute_initialized(MVMThreadContext *tc, MVMSTable *st, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint) { die_no_attrs(tc); } /* Gets the hint for the given attribute ID. */ static MVMint64 hint_for(MVMThreadContext *tc, MVMSTable *st, MVMObject *class_handle, MVMString *name) { return MVM_NO_HINT; } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMCUnionREPRData *repr_data = (MVMCUnionREPRData *) st->REPR_data; MVMCUnionBody *body = (MVMCUnionBody *)data; MVMint32 i; for (i = 0; i < repr_data->num_child_objs; i++) MVM_gc_worklist_add(tc, worklist, &body->child_objs[i]); } /* Marks the representation data in an STable.*/ static void gc_mark_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMGCWorklist *worklist) { MVMCUnionREPRData *repr_data = (MVMCUnionREPRData *)st->REPR_data; if (repr_data) { MVMint32 i; if (repr_data->name_to_index_mapping) { MVMCUnionNameMap *map = repr_data->name_to_index_mapping; for (i = 0; map[i].class_key; i++) { MVM_gc_worklist_add(tc, worklist, &map[i].class_key); MVM_gc_worklist_add(tc, worklist, &map[i].name_map); } } if (repr_data->flattened_stables) { MVMSTable **flattened_stables = repr_data->flattened_stables; for (i = 0; i < repr_data->num_attributes; i++) MVM_gc_worklist_add(tc, worklist, &flattened_stables[i]); } if (repr_data->member_types) { MVMObject **member_types = repr_data->member_types; for (i = 0; i < repr_data->num_attributes; i++) MVM_gc_worklist_add(tc, worklist, &member_types[i]); } } } /* Free representation data. */ static void gc_free_repr_data(MVMThreadContext *tc, MVMSTable *st) { MVM_free(st->REPR_data); } /* This is called to do any cleanup of resources when an object gets * embedded inside another one. Never called on a top-level object. */ static void gc_cleanup(MVMThreadContext *tc, MVMSTable *st, void *data) { MVMCUnionBody *body = (MVMCUnionBody *)data; if (body->child_objs) MVM_free(body->child_objs); /* XXX For some reason, this causes crashes at the moment. Need to * work out why. */ /*if (body->cunion) MVM_free(body->cunion);*/ } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { gc_cleanup(tc, STABLE(obj), OBJECT_BODY(obj)); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ sizeof(void*) * 8, /* bits */ ALIGNOF(void*), /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Serializes the REPR data. */ static void serialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationWriter *writer) { MVMCUnionREPRData *repr_data = (MVMCUnionREPRData *)st->REPR_data; MVMint32 i, num_classes, num_slots; MVM_serialization_write_int(tc, writer, repr_data->struct_size); MVM_serialization_write_int(tc, writer, repr_data->struct_align); MVM_serialization_write_int(tc, writer, repr_data->num_attributes); MVM_serialization_write_int(tc, writer, repr_data->num_child_objs); for(i = 0; i < repr_data->num_attributes; i++){ MVM_serialization_write_int(tc, writer, repr_data->attribute_locations[i]); MVM_serialization_write_int(tc, writer, repr_data->struct_offsets[i]); MVM_serialization_write_int(tc, writer, repr_data->flattened_stables[i] != NULL); if (repr_data->flattened_stables[i]) MVM_serialization_write_stable_ref(tc, writer, repr_data->flattened_stables[i]); MVM_serialization_write_ref(tc, writer, repr_data->member_types[i]); } i=0; while (repr_data->name_to_index_mapping[i].class_key) i++; num_classes = i; MVM_serialization_write_int(tc, writer, num_classes); for(i = 0; i < num_classes; i++){ MVM_serialization_write_ref(tc, writer, repr_data->name_to_index_mapping[i].class_key); MVM_serialization_write_ref(tc, writer, repr_data->name_to_index_mapping[i].name_map); } i=0; while(repr_data->initialize_slots && repr_data->initialize_slots[i] != -1) i++; num_slots = i; MVM_serialization_write_int(tc, writer, num_slots); for(i = 0; i < num_slots; i++){ MVM_serialization_write_int(tc, writer, repr_data->initialize_slots[i]); } } /* Deserializes the REPR data. */ static void deserialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { MVMCUnionREPRData *repr_data = (MVMCUnionREPRData *) MVM_malloc(sizeof(MVMCUnionREPRData)); MVMint32 i, num_classes, num_slots; repr_data->struct_size = MVM_serialization_read_int(tc, reader); if (reader->root.version >= 17) { repr_data->struct_align = MVM_serialization_read_int(tc, reader); } repr_data->num_attributes = MVM_serialization_read_int(tc, reader); repr_data->num_child_objs = MVM_serialization_read_int(tc, reader); repr_data->attribute_locations = (MVMint32 *)MVM_malloc(sizeof(MVMint32) * repr_data->num_attributes); repr_data->struct_offsets = (MVMint32 *)MVM_malloc(sizeof(MVMint32) * repr_data->num_attributes); repr_data->flattened_stables = (MVMSTable **)MVM_malloc(repr_data->num_attributes * sizeof(MVMSTable *)); repr_data->member_types = (MVMObject **)MVM_malloc(repr_data->num_attributes * sizeof(MVMObject *)); for(i = 0; i < repr_data->num_attributes; i++) { repr_data->attribute_locations[i] = MVM_serialization_read_int(tc, reader); repr_data->struct_offsets[i] = MVM_serialization_read_int(tc, reader); if(MVM_serialization_read_int(tc, reader)){ MVM_ASSIGN_REF(tc, &(st->header), repr_data->flattened_stables[i], MVM_serialization_read_stable_ref(tc, reader)); } else { repr_data->flattened_stables[i] = NULL; } repr_data->member_types[i] = MVM_serialization_read_ref(tc, reader); } num_classes = MVM_serialization_read_int(tc, reader); repr_data->name_to_index_mapping = (MVMCUnionNameMap *)MVM_malloc(sizeof(MVMCUnionNameMap) * (1 + num_classes)); for(i = 0; i < num_classes; i++){ repr_data->name_to_index_mapping[i].class_key = MVM_serialization_read_ref(tc, reader); repr_data->name_to_index_mapping[i].name_map = MVM_serialization_read_ref(tc, reader); } repr_data->name_to_index_mapping[i].class_key = NULL; repr_data->name_to_index_mapping[i].name_map = NULL; num_slots = MVM_serialization_read_int(tc, reader); repr_data->initialize_slots = (MVMint32 *)MVM_malloc(sizeof(MVMint32) * (1 + num_slots)); for(i = 0; i < num_slots; i++){ repr_data->initialize_slots[i] = MVM_serialization_read_int(tc, reader); } repr_data->initialize_slots[i] = -1; st->REPR_data = repr_data; } static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMCUnion); } /* Initializes the representation. */ const MVMREPROps * MVMCUnion_initialize(MVMThreadContext *tc) { return &CUnion_this_repr; } static const MVMREPROps CUnion_this_repr = { type_object_for, MVM_gc_allocate_object, initialize, copy_to, { get_attribute, bind_attribute, hint_for, is_attribute_initialized, MVM_REPR_DEFAULT_ATTRIBUTE_AS_ATOMIC }, /* attr_funcs */ MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ serialize_repr_data, deserialize_repr_data, deserialize_stable_size, gc_mark, gc_free, gc_cleanup, gc_mark_repr_data, gc_free_repr_data, compose, NULL, /* spesh */ "CUnion", /* name */ MVM_REPR_ID_MVMCUnion, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; MoarVM-2018.03/src/6model/reprs/CUnion.h0000644000175000017510000000610113237701240017654 0ustar samanthasamantha/* Attribute location flags. */ #define MVM_CUNION_ATTR_IN_STRUCT 0 #define MVM_CUNION_ATTR_CSTRUCT 1 #define MVM_CUNION_ATTR_CARRAY 2 #define MVM_CUNION_ATTR_CPTR 3 #define MVM_CUNION_ATTR_STRING 4 #define MVM_CUNION_ATTR_CUNION 5 #define MVM_CUNION_ATTR_CPPSTRUCT 6 #define MVM_CUNION_ATTR_MASK 7 #define MVM_CUNION_ATTR_INLINED 8 /* Bits to shift a slot position to make room for MVM_CUNION_ATTR_*. */ #define MVM_CUNION_ATTR_SHIFT 4 /* The CUnion representation maintains a chunk of memory that it can * always pass off to C land. If we in turn embed any strings, pointers * to other CUnion REPR objects and so forth, we need to both keep the * C-friendly bit of memory and a copy to the GC-able, 6model objects in * sync. */ struct MVMCUnionBody { /* GC-marked objects that our C structure points into. */ MVMObject **child_objs; /* Pointer to the actual C structure memory; we don't inline it * directly in the body, since it doesn't work so well if we get * something returned and are wrapping it. */ void *cunion; }; struct MVMCUnion { MVMObject common; MVMCUnionBody body; }; /* This is used in the name to class mapping. */ struct MVMCUnionNameMap { MVMObject *class_key; MVMObject *name_map; }; /* The CUnion REPR data contains info we need to do allocations, look up * attributes and so forth. */ struct MVMCUnionREPRData { /* The size and alignment of the structure in bytes. */ MVMint32 struct_size; MVMint32 struct_align; /* The number of attributes we have allocated slots for. Note that * slots can vary in size. */ MVMint32 num_attributes; /* Number of child objects we store. */ MVMint32 num_child_objs; /* Lower bits are flags indicating what kind of attribute we have; * whether it's one that is just a simple value that we can always * access directly in the C struct body, or a more complex one that * we need to maintain in the C struct and in the GC-able list. Upper * bits say where to find it. */ MVMint32 *attribute_locations; /* Maps attribute position numbers to their location in the C struct. * Note that this will not be the only place we need to update for * any reference type. */ MVMint32 *struct_offsets; /* If the attribute was actually flattened in to this object from another * representation, this is the s-table of the type of that attribute. NULL * for attributes that are reference types. */ MVMSTable **flattened_stables; /* For reference type members, we cache the relevant type objects. * Flattened types have NULL here. */ MVMObject **member_types; /* A table mapping attribute names to indexes (which can then be looked * up in the offset table). Uses a final null entry as a sentinel. */ MVMCUnionNameMap *name_to_index_mapping; /* Slots holding flattened objects that need another REPR to initialize * them; terminated with -1. */ MVMint32 *initialize_slots; }; /* Initializes the CUnion REPR. */ const MVMREPROps * MVMCUnion_initialize(MVMThreadContext *tc); MoarVM-2018.03/src/6model/reprs/ConcBlockingQueue.c0000644000175000017510000002615313242626641022034 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps ConcBlockingQueue_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &ConcBlockingQueue_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMConcBlockingQueue); }); return st->WHAT; } /* Initializes a new instance. */ static void initialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMConcBlockingQueueBody *cbq = (MVMConcBlockingQueueBody *)data; /* Initialize locks. */ int init_stat; cbq->locks = MVM_calloc(1, sizeof(MVMConcBlockingQueueLocks)); if ((init_stat = uv_mutex_init(&cbq->locks->head_lock)) < 0) MVM_exception_throw_adhoc(tc, "Failed to initialize mutex: %s", uv_strerror(init_stat)); if ((init_stat = uv_mutex_init(&cbq->locks->tail_lock)) < 0) MVM_exception_throw_adhoc(tc, "Failed to initialize mutex: %s", uv_strerror(init_stat)); if ((init_stat = uv_cond_init(&cbq->locks->head_cond)) < 0) MVM_exception_throw_adhoc(tc, "Failed to initialize condition variable: %s", uv_strerror(init_stat)); /* Head and tail point to a null node. */ cbq->tail = cbq->head = MVM_calloc(1, sizeof(MVMConcBlockingQueueNode)); } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "Cannot copy object with representation ConcBlockingQueue"); } /* Called by the VM to mark any GCable items. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { /* At this point we know the world is stopped, and thus we can safely do a * traversal of the data structure without needing locks. */ MVMConcBlockingQueueBody *cbq = (MVMConcBlockingQueueBody *)data; MVMConcBlockingQueueNode *cur = cbq->head; while (cur) { MVM_gc_worklist_add(tc, worklist, &cur->value); cur = cur->next; } } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMConcBlockingQueue *cbq = (MVMConcBlockingQueue *)obj; /* First, free all the nodes. */ MVMConcBlockingQueueNode *cur = cbq->body.head; while (cur) { MVMConcBlockingQueueNode *next = cur->next; MVM_free(cur); cur = next; } cbq->body.head = cbq->body.tail = NULL; /* Clean up locks. */ uv_mutex_destroy(&cbq->body.locks->head_lock); uv_mutex_destroy(&cbq->body.locks->tail_lock); uv_cond_destroy(&cbq->body.locks->head_cond); MVM_free(cbq->body.locks); cbq->body.locks = NULL; } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } static void at_pos(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister *value, MVMuint16 kind) { MVMConcBlockingQueueBody *cbq = (MVMConcBlockingQueueBody *)data; if (index != 0) MVM_exception_throw_adhoc(tc, "Can only request (peek) head of a concurrent blocking queue"); if (kind != MVM_reg_obj) MVM_exception_throw_adhoc(tc, "Can only get objects from a concurrent blocking queue"); if (MVM_load(&cbq->elems) > 0) { MVMConcBlockingQueueNode *peeked; unsigned int interval_id; interval_id = MVM_telemetry_interval_start(tc, "ConcBlockingQueue.at_pos"); MVMROOT(tc, root, { MVM_gc_mark_thread_blocked(tc); data = OBJECT_BODY(root); cbq = (MVMConcBlockingQueueBody *)data; uv_mutex_lock(&cbq->locks->head_lock); MVM_gc_mark_thread_unblocked(tc); data = OBJECT_BODY(root); cbq = (MVMConcBlockingQueueBody *)data; }); peeked = cbq->head->next; value->o = peeked ? peeked->value : tc->instance->VMNull; uv_mutex_unlock(&cbq->locks->head_lock); MVM_telemetry_interval_stop(tc, interval_id, "ConcBlockingQueue.at_pos"); } else { value->o = tc->instance->VMNull; } } static MVMuint64 elems(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMConcBlockingQueueBody *cbq = (MVMConcBlockingQueueBody *)data; return MVM_load(&(cbq->elems)); } static void push(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister value, MVMuint16 kind) { MVMConcBlockingQueueBody *cbq = (MVMConcBlockingQueueBody *)data; MVMConcBlockingQueueNode *add; AO_t orig_elems; MVMObject *to_add = value.o; unsigned int interval_id; if (kind != MVM_reg_obj) MVM_exception_throw_adhoc(tc, "Can only push objects to a concurrent blocking queue"); if (value.o == NULL) MVM_exception_throw_adhoc(tc, "Cannot store a null value in a concurrent blocking queue"); add = MVM_calloc(1, sizeof(MVMConcBlockingQueueNode)); interval_id = MVM_telemetry_interval_start(tc, "ConcBlockingQueue.push"); MVMROOT2(tc, root, to_add, { MVM_gc_mark_thread_blocked(tc); data = OBJECT_BODY(root); cbq = (MVMConcBlockingQueueBody *)data; uv_mutex_lock(&cbq->locks->tail_lock); MVM_gc_mark_thread_unblocked(tc); data = OBJECT_BODY(root); cbq = (MVMConcBlockingQueueBody *)data; }); MVM_ASSIGN_REF(tc, &(root->header), add->value, to_add); cbq->tail->next = add; cbq->tail = add; orig_elems = MVM_incr(&cbq->elems); uv_mutex_unlock(&cbq->locks->tail_lock); if (orig_elems == 0) { MVMROOT(tc, root, { MVM_gc_mark_thread_blocked(tc); data = OBJECT_BODY(root); cbq = (MVMConcBlockingQueueBody *)data; uv_mutex_lock(&cbq->locks->head_lock); MVM_gc_mark_thread_unblocked(tc); data = OBJECT_BODY(root); cbq = (MVMConcBlockingQueueBody *)data; }); uv_cond_signal(&cbq->locks->head_cond); uv_mutex_unlock(&cbq->locks->head_lock); } MVM_telemetry_interval_stop(tc, interval_id, "ConcBlockingQueue.push"); } static void shift(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind) { MVMConcBlockingQueueBody *cbq = (MVMConcBlockingQueueBody *)data; MVMConcBlockingQueueNode *taken; unsigned int interval_id; if (kind != MVM_reg_obj) MVM_exception_throw_adhoc(tc, "Can only shift objects from a ConcBlockingQueue"); interval_id = MVM_telemetry_interval_start(tc, "ConcBlockingQueue.shift"); MVMROOT(tc, root, { MVM_gc_mark_thread_blocked(tc); data = OBJECT_BODY(root); cbq = (MVMConcBlockingQueueBody *)data; uv_mutex_lock(&cbq->locks->head_lock); MVM_gc_mark_thread_unblocked(tc); data = OBJECT_BODY(root); cbq = (MVMConcBlockingQueueBody *)data; while (MVM_load(&cbq->elems) == 0) { MVM_gc_mark_thread_blocked(tc); data = OBJECT_BODY(root); cbq = (MVMConcBlockingQueueBody *)data; uv_cond_wait(&cbq->locks->head_cond, &cbq->locks->head_lock); MVM_gc_mark_thread_unblocked(tc); data = OBJECT_BODY(root); cbq = (MVMConcBlockingQueueBody *)data; } }); taken = cbq->head->next; MVM_free(cbq->head); cbq->head = taken; MVM_barrier(); value->o = taken->value; taken->value = NULL; MVM_barrier(); if (MVM_decr(&cbq->elems) > 1) uv_cond_signal(&cbq->locks->head_cond); uv_mutex_unlock(&cbq->locks->head_lock); MVM_telemetry_interval_stop(tc, interval_id, "ConcBlockingQueue.shift"); } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMConcBlockingQueue); } /* Initializes the representation. */ const MVMREPROps * MVMConcBlockingQueue_initialize(MVMThreadContext *tc) { return &ConcBlockingQueue_this_repr; } static const MVMREPROps ConcBlockingQueue_this_repr = { type_object_for, MVM_gc_allocate_object, initialize, copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, { at_pos, MVM_REPR_DEFAULT_BIND_POS, MVM_REPR_DEFAULT_SET_ELEMS, push, MVM_REPR_DEFAULT_POP, MVM_REPR_DEFAULT_UNSHIFT, shift, MVM_REPR_DEFAULT_SPLICE, MVM_REPR_DEFAULT_AT_POS_MULTIDIM, MVM_REPR_DEFAULT_BIND_POS_MULTIDIM, MVM_REPR_DEFAULT_DIMENSIONS, MVM_REPR_DEFAULT_SET_DIMENSIONS, MVM_REPR_DEFAULT_GET_ELEM_STORAGE_SPEC, MVM_REPR_DEFAULT_POS_AS_ATOMIC, MVM_REPR_DEFAULT_POS_AS_ATOMIC_MULTIDIM }, /* pos_funcs */ MVM_REPR_DEFAULT_ASS_FUNCS, elems, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "ConcBlockingQueue", /* name */ MVM_REPR_ID_ConcBlockingQueue, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; /* Polls a queue for a value, returning NULL if none is available. */ MVMObject * MVM_concblockingqueue_poll(MVMThreadContext *tc, MVMConcBlockingQueue *queue) { MVMConcBlockingQueue *cbq = (MVMConcBlockingQueue *)queue; MVMConcBlockingQueueNode *taken; MVMObject *result = tc->instance->VMNull; unsigned int interval_id; interval_id = MVM_telemetry_interval_start(tc, "ConcBlockingQueue.poll"); MVMROOT(tc, cbq, { MVM_gc_mark_thread_blocked(tc); uv_mutex_lock(&cbq->body.locks->head_lock); MVM_gc_mark_thread_unblocked(tc); }); if (MVM_load(&cbq->body.elems) > 0) { taken = cbq->body.head->next; MVM_free(cbq->body.head); cbq->body.head = taken; MVM_barrier(); result = taken->value; taken->value = NULL; MVM_barrier(); if (MVM_decr(&cbq->body.elems) > 1) uv_cond_signal(&cbq->body.locks->head_cond); } uv_mutex_unlock(&cbq->body.locks->head_lock); MVM_telemetry_interval_stop(tc, interval_id, "ConcBlockingQueue.poll"); return result; } MoarVM-2018.03/src/6model/reprs/ConcBlockingQueue.h0000644000175000017510000000230313237701240022021 0ustar samanthasamantha/* A single node in the concurrent blocking queue. */ struct MVMConcBlockingQueueNode { MVMObject *value; MVMConcBlockingQueueNode *next; }; /* Memory used for mutexes and cond vars; these can't live in the object body * directly as they are sensitive to being moved, but putting them together in * a single struct means we can malloc a single bit of memory to hold them. */ struct MVMConcBlockingQueueLocks { uv_mutex_t head_lock; uv_mutex_t tail_lock; uv_cond_t head_cond; }; /* Representation used for concurrent blocking queue. */ struct MVMConcBlockingQueueBody { /* Head and tail of the queue. */ MVMConcBlockingQueueNode *head; MVMConcBlockingQueueNode *tail; /* Number of elements currently in the queue. */ AO_t elems; /* Locks and condition variables storage. */ MVMConcBlockingQueueLocks *locks; }; struct MVMConcBlockingQueue { MVMObject common; MVMConcBlockingQueueBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMConcBlockingQueue_initialize(MVMThreadContext *tc); /* Operations on concurrent blocking queues. */ MVMObject * MVM_concblockingqueue_poll(MVMThreadContext *tc, MVMConcBlockingQueue *queue); MoarVM-2018.03/src/6model/reprs/ConditionVariable.c0000644000175000017510000001325013242626641022062 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps ConditionVariable_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &ConditionVariable_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMConditionVariable); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "Cannot copy object with representation ConditionVariable"); } /* Called by the VM to mark any GCable items. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMConditionVariableBody *cv = (MVMConditionVariableBody *)data; MVM_gc_worklist_add(tc, worklist, &cv->mutex); } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMConditionVariable *cv = (MVMConditionVariable *)obj; if (cv->body.condvar) { uv_cond_destroy(cv->body.condvar); MVM_free(cv->body.condvar); cv->body.condvar = NULL; } } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMConditionVariable); } /* Initializes the representation. */ const MVMREPROps * MVMConditionVariable_initialize(MVMThreadContext *tc) { return &ConditionVariable_this_repr; } static const MVMREPROps ConditionVariable_this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "ConditionVariable", /* name */ MVM_REPR_ID_ConditionVariable, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; /* Given a reentrant mutex, produces an associated condition variable. */ MVMObject * MVM_conditionvariable_from_lock(MVMThreadContext *tc, MVMReentrantMutex *lock, MVMObject *type) { MVMConditionVariable *cv; int init_stat; if (REPR(type)->ID != MVM_REPR_ID_ConditionVariable) MVM_exception_throw_adhoc(tc, "Condition variable must have ConditionVariable REPR"); MVMROOT(tc, lock, { cv = (MVMConditionVariable *)MVM_gc_allocate_object(tc, STABLE(type)); }); cv->body.condvar = MVM_malloc(sizeof(uv_cond_t)); if ((init_stat = uv_cond_init(cv->body.condvar)) < 0) MVM_exception_throw_adhoc(tc, "Failed to initialize condition variable: %s", uv_strerror(init_stat)); MVM_ASSIGN_REF(tc, &(cv->common.header), cv->body.mutex, (MVMObject *)lock); return (MVMObject *)cv; } /* Adds the current thread to the queue of waiters on the condition variable, * releasing, waiting, and then re-acquiring the lock. */ void MVM_conditionvariable_wait(MVMThreadContext *tc, MVMConditionVariable *cv) { MVMReentrantMutex *rm = (MVMReentrantMutex *)cv->body.mutex; AO_t orig_rec_level; unsigned int interval_id; if (MVM_load(&rm->body.holder_id) != tc->thread_id) MVM_exception_throw_adhoc(tc, "Can only wait on a condition variable when holding mutex"); interval_id = MVM_telemetry_interval_start(tc, "ConditionVariable.wait"); MVM_telemetry_interval_annotate((uintptr_t)cv->body.condvar, interval_id, "this condition variable"); orig_rec_level = MVM_load(&rm->body.lock_count); MVM_store(&rm->body.holder_id, 0); MVM_store(&rm->body.lock_count, 0); MVMROOT2(tc, cv, rm, { MVM_gc_mark_thread_blocked(tc); uv_cond_wait(cv->body.condvar, rm->body.mutex); MVM_gc_mark_thread_unblocked(tc); }); MVM_store(&rm->body.holder_id, tc->thread_id); MVM_store(&rm->body.lock_count, orig_rec_level); MVM_telemetry_interval_stop(tc, interval_id, "ConditionVariable.wait"); } /* Signals one thread waiting on the condition. */ void MVM_conditionvariable_signal_one(MVMThreadContext *tc, MVMConditionVariable *cv) { MVM_telemetry_timestamp(tc, "ConditionVariable.signal_one"); uv_cond_signal(cv->body.condvar); } /* Signals all threads waiting on the condition. */ void MVM_conditionvariable_signal_all(MVMThreadContext *tc, MVMConditionVariable *cv) { MVM_telemetry_timestamp(tc, "ConditionVariable.signal_all"); uv_cond_broadcast(cv->body.condvar); } MoarVM-2018.03/src/6model/reprs/ConditionVariable.h0000644000175000017510000000166213237701240022064 0ustar samanthasamantha/* Representation used for condition variables. */ struct MVMConditionVariableBody { /* The ReentrantMutex this condition variable is associated with. */ MVMObject *mutex; /* The condition variable itself, held at a level of indirection to keep * OSes that wouldn't like it moving around happy. */ uv_cond_t *condvar; }; struct MVMConditionVariable { MVMObject common; MVMConditionVariableBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMConditionVariable_initialize(MVMThreadContext *tc); /* Operations on a condition variable. */ MVMObject * MVM_conditionvariable_from_lock(MVMThreadContext *tc, MVMReentrantMutex *lock, MVMObject *type); void MVM_conditionvariable_wait(MVMThreadContext *tc, MVMConditionVariable *cv); void MVM_conditionvariable_signal_one(MVMThreadContext *tc, MVMConditionVariable *cv); void MVM_conditionvariable_signal_all(MVMThreadContext *tc, MVMConditionVariable *cv); MoarVM-2018.03/src/6model/reprs/Decoder.c0000644000175000017510000003217213252330426020031 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps Decoder_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &Decoder_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMDecoder); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "Cannot copy object with representation Decoder"); } /* Called by the VM to mark any GCable items. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMDecoderBody *decoder = (MVMDecoderBody*)data; if (decoder->ds) { MVM_gc_worklist_add(tc, worklist, &(decoder->ds->replacement)); } } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMDecoder *decoder = (MVMDecoder *)obj; if (decoder->body.ds) MVM_string_decodestream_destroy(tc, decoder->body.ds); if (decoder->body.sep_spec) MVM_string_decode_stream_sep_destroy(tc, decoder->body.sep_spec); MVM_free(decoder->body.sep_spec); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMDecoder); } /* Initializes the representation. */ const MVMREPROps * MVMDecoder_initialize(MVMThreadContext *tc) { return &Decoder_this_repr; } static const MVMREPROps Decoder_this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "Decoder", /* name */ MVM_REPR_ID_Decoder, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; /* Assert that the passed object really is a decoder; throw if not. */ void MVM_decoder_ensure_decoder(MVMThreadContext *tc, MVMObject *decoder, const char *op) { if (REPR(decoder)->ID != MVM_REPR_ID_Decoder || !IS_CONCRETE(decoder)) MVM_exception_throw_adhoc(tc, "Operation '%s' can only work on an object with the Decoder representation", op); } /* Checks and sets the decoder single-user sanity check flag. */ static void enter_single_user(MVMThreadContext *tc, MVMDecoder *decoder) { if (!MVM_trycas(&(decoder->body.in_use), 0, 1)) MVM_exception_throw_adhoc(tc, "Decoder may not be used concurrently"); } /* Releases the decoder single-user sanity check flag. */ static void exit_single_user(MVMThreadContext *tc, MVMDecoder *decoder) { decoder->body.in_use = 0; } /* Configures the decoder with the specified encoding and other configuration. */ static int should_translate_newlines(MVMThreadContext *tc, MVMObject *config) { if (IS_CONCRETE(config) && REPR(config)->ID == MVM_REPR_ID_MVMHash) { MVMObject *value = MVM_repr_at_key_o(tc, config, tc->instance->str_consts.translate_newlines); return IS_CONCRETE(value) && MVM_repr_get_int(tc, value) != 0; } return 0; } static MVMString * has_replacement(MVMThreadContext *tc, MVMObject *config) { if (IS_CONCRETE(config) && REPR(config)->ID == MVM_REPR_ID_MVMHash) { MVMObject *value = MVM_repr_at_key_o(tc, config, tc->instance->str_consts.replacement); return IS_CONCRETE(value) ? MVM_repr_get_str(tc, value) : NULL; } return NULL; } static int has_config(MVMThreadContext *tc, MVMObject *config) { if (IS_CONCRETE(config) && REPR(config)->ID == MVM_REPR_ID_MVMHash) { MVMObject *value = MVM_repr_at_key_o(tc, config, tc->instance->str_consts.config); return IS_CONCRETE(value) ? MVM_repr_get_int(tc, value) : 0; } return 0; } void MVM_decoder_configure(MVMThreadContext *tc, MVMDecoder *decoder, MVMString *encoding, MVMObject *config) { if (!decoder->body.ds) { MVMuint8 encid = MVM_string_find_encoding(tc, encoding); enter_single_user(tc, decoder); decoder->body.ds = MVM_string_decodestream_create(tc, encid, 0, should_translate_newlines(tc, config)); decoder->body.sep_spec = MVM_malloc(sizeof(MVMDecodeStreamSeparators)); MVM_string_decode_stream_sep_default(tc, decoder->body.sep_spec); MVM_ASSIGN_REF(tc, &(decoder->common.header), decoder->body.ds->replacement, has_replacement(tc, config)); decoder->body.ds->config = has_config(tc, config); exit_single_user(tc, decoder); } else { MVM_exception_throw_adhoc(tc, "Decoder already configured"); } } /* Obtains the DecodeStream object provided it's initialized, throwing if not. */ static MVMDecodeStream * get_ds(MVMThreadContext *tc, MVMDecoder *decoder) { MVMDecodeStream *ds = decoder->body.ds; if (!ds) MVM_exception_throw_adhoc(tc, "Decoder not yet configured"); return ds; } /* Gets the separators specification for the decoder. */ MVM_STATIC_INLINE MVMDecodeStreamSeparators * get_sep_spec(MVMThreadContext *tc, MVMDecoder *decoder) { return decoder->body.sep_spec; } /* Sets the separators to be used by this decode stream. */ void MVM_decoder_set_separators(MVMThreadContext *tc, MVMDecoder *decoder, MVMObject *seps) { MVMint32 is_str_array = REPR(seps)->pos_funcs.get_elem_storage_spec(tc, STABLE(seps)).boxed_primitive == MVM_STORAGE_SPEC_BP_STR; get_ds(tc, decoder); /* Ensure we're sufficiently initialized. */ if (is_str_array) { MVMString **c_seps = NULL; MVMuint64 i; MVMuint64 num_seps = MVM_repr_elems(tc, seps); if (num_seps > 0xFFFFFF) MVM_exception_throw_adhoc(tc, "Too many line separators"); c_seps = MVM_malloc((num_seps ? num_seps : 1) * sizeof(MVMString *)); for (i = 0; i < num_seps; i++) c_seps[i] = MVM_repr_at_pos_s(tc, seps, i); enter_single_user(tc, decoder); MVM_string_decode_stream_sep_from_strings(tc, get_sep_spec(tc, decoder), c_seps, num_seps); exit_single_user(tc, decoder); MVM_free(c_seps); } else { MVM_exception_throw_adhoc(tc, "Set separators requires a native string array"); } } /* Adds bytes to the decode stream. */ void MVM_decoder_add_bytes(MVMThreadContext *tc, MVMDecoder *decoder, MVMObject *buffer) { MVMDecodeStream *ds = get_ds(tc, decoder); if (REPR(buffer)->ID == MVM_REPR_ID_VMArray) { /* To be safe, we need to make a copy of data in a resizable array; it * may change/move under us. */ char *output = NULL, *copy = NULL; MVMint64 output_size; switch (((MVMArrayREPRData *)STABLE(buffer)->REPR_data)->slot_type) { case MVM_ARRAY_U8: case MVM_ARRAY_I8: output = (char *)(((MVMArray *)buffer)->body.slots.i8 + ((MVMArray *)buffer)->body.start); output_size = ((MVMArray *)buffer)->body.elems; break; case MVM_ARRAY_U16: case MVM_ARRAY_I16: output = (char *)(((MVMArray *)buffer)->body.slots.i16 + ((MVMArray *)buffer)->body.start); output_size = ((MVMArray *)buffer)->body.elems * 2; break; case MVM_ARRAY_U32: case MVM_ARRAY_I32: output = (char *)(((MVMArray *)buffer)->body.slots.i32 + ((MVMArray *)buffer)->body.start); output_size = ((MVMArray *)buffer)->body.elems * 4; break; default: MVM_exception_throw_adhoc(tc, "Can only add bytes from an int array to a decoder"); } copy = MVM_malloc(output_size); memcpy(copy, output, output_size); enter_single_user(tc, decoder); MVM_string_decodestream_add_bytes(tc, ds, copy, output_size); exit_single_user(tc, decoder); } else { MVM_exception_throw_adhoc(tc, "Cannot add bytes to a decoder with a %s", REPR(buffer)->name); } } /* Takes the specified number of chars from the decoder, or all if there * is not enough. */ MVMString * MVM_decoder_take_chars(MVMThreadContext *tc, MVMDecoder *decoder, MVMint64 chars, MVMint64 eof) { MVMString *result = NULL; enter_single_user(tc, decoder); MVMROOT(tc, decoder, { result = MVM_string_decodestream_get_chars(tc, get_ds(tc, decoder), (MVMint32)chars, eof); }); exit_single_user(tc, decoder); return result; } /* Takes all chars from the decoder. */ MVMString * MVM_decoder_take_all_chars(MVMThreadContext *tc, MVMDecoder *decoder) { MVMString *result = NULL; enter_single_user(tc, decoder); MVMROOT(tc, decoder, { result = MVM_string_decodestream_get_all(tc, get_ds(tc, decoder)); }); exit_single_user(tc, decoder); return result; } /* Takes all available chars from the decoder. */ MVMString * MVM_decoder_take_available_chars(MVMThreadContext *tc, MVMDecoder *decoder) { MVMString *result = NULL; enter_single_user(tc, decoder); MVMROOT(tc, decoder, { result = MVM_string_decodestream_get_available(tc, get_ds(tc, decoder)); }); exit_single_user(tc, decoder); return result; } /* Takes a line from the decoder. */ MVMString * MVM_decoder_take_line(MVMThreadContext *tc, MVMDecoder *decoder, MVMint64 chomp, MVMint64 incomplete_ok) { MVMDecodeStream *ds = get_ds(tc, decoder); MVMDecodeStreamSeparators *sep_spec = get_sep_spec(tc, decoder); MVMString *result = NULL; enter_single_user(tc, decoder); MVMROOT(tc, decoder, { result = incomplete_ok ? MVM_string_decodestream_get_until_sep_eof(tc, ds, sep_spec, (MVMint32)chomp) : MVM_string_decodestream_get_until_sep(tc, ds, sep_spec, (MVMint32)chomp); }); exit_single_user(tc, decoder); return result; } /* Returns true if the decoder is empty. */ MVMint64 MVM_decoder_empty(MVMThreadContext *tc, MVMDecoder *decoder) { return MVM_string_decodestream_is_empty(tc, get_ds(tc, decoder)); } /* Gets the number of (undecoded) bytes available in the decoder. */ MVMint64 MVM_decoder_bytes_available(MVMThreadContext *tc, MVMDecoder *decoder) { return MVM_string_decodestream_bytes_available(tc, get_ds(tc, decoder)); } /* Takes bytes from the decode stream and places them into a buffer. If there * are less available than requested, hand back null. */ MVMObject * MVM_decoder_take_bytes(MVMThreadContext *tc, MVMDecoder *decoder, MVMObject *buf_type, MVMint64 bytes) { MVMDecodeStream *ds = get_ds(tc, decoder); char *buf = NULL; MVMint64 read; MVMObject *result = NULL; /* Ensure the target is in the correct form. */ if (REPR(buf_type)->ID != MVM_REPR_ID_VMArray) MVM_exception_throw_adhoc(tc, "decodertakebytes requires a native array type"); if (((MVMArrayREPRData *)STABLE(buf_type)->REPR_data)->slot_type != MVM_ARRAY_U8 && ((MVMArrayREPRData *)STABLE(buf_type)->REPR_data)->slot_type != MVM_ARRAY_I8) MVM_exception_throw_adhoc(tc, "decodertakebytes requires a native array type of uint8 or int8"); if (bytes < 0 || bytes > 0x7FFFFFFF) MVM_exception_throw_adhoc(tc, "Out of range: attempted to read %"PRId64" bytes from decoder", bytes); if (MVM_string_decodestream_bytes_available(tc, ds) < bytes) return tc->instance->VMNull; result = MVM_repr_alloc_init(tc, buf_type); enter_single_user(tc, decoder); read = MVM_string_decodestream_bytes_to_buf(tc, ds, &buf, bytes); exit_single_user(tc, decoder); ((MVMArray *)result)->body.slots.i8 = (MVMint8 *)buf; ((MVMArray *)result)->body.start = 0; ((MVMArray *)result)->body.ssize = read; ((MVMArray *)result)->body.elems = read; return result; } MoarVM-2018.03/src/6model/reprs/Decoder.h0000644000175000017510000000302413251140336020026 0ustar samanthasamantha/* Representation used for a VM-provided decoder. */ struct MVMDecoderBody { AO_t in_use; MVMDecodeStream *ds; MVMDecodeStreamSeparators *sep_spec; }; struct MVMDecoder { MVMObject common; MVMDecoderBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMDecoder_initialize(MVMThreadContext *tc); /* Operations on a Decoder object. */ void MVM_decoder_ensure_decoder(MVMThreadContext *tc, MVMObject *decoder, const char *op); void MVM_decoder_configure(MVMThreadContext *tc, MVMDecoder *decoder, MVMString *encoding, MVMObject *config); void MVM_decoder_set_separators(MVMThreadContext *tc, MVMDecoder *decoder, MVMObject *sep_strings); MVMint64 MVM_decoder_empty(MVMThreadContext *tc, MVMDecoder *decoder); void MVM_decoder_add_bytes(MVMThreadContext *tc, MVMDecoder *decoder, MVMObject *blob); MVMString * MVM_decoder_take_all_chars(MVMThreadContext *tc, MVMDecoder *decoder); MVMString * MVM_decoder_take_available_chars(MVMThreadContext *tc, MVMDecoder *decoder); MVMString * MVM_decoder_take_chars(MVMThreadContext *tc, MVMDecoder *decoder, MVMint64 chars, MVMint64 eof); MVMString * MVM_decoder_take_line(MVMThreadContext *tc, MVMDecoder *decoder, MVMint64 chomp, MVMint64 incomplete_ok); MVMint64 MVM_decoder_bytes_available(MVMThreadContext *tc, MVMDecoder *decoder); MVMObject * MVM_decoder_take_bytes(MVMThreadContext *tc, MVMDecoder *decoder, MVMObject *buf_type, MVMint64 bytes); MoarVM-2018.03/src/6model/reprs/HashAttrStore.c0000644000175000017510000001355413237701240021221 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps HashAttrStore_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &HashAttrStore_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMHashAttrStore); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMHashAttrStoreBody *src_body = (MVMHashAttrStoreBody *)src; MVMHashAttrStoreBody *dest_body = (MVMHashAttrStoreBody *)dest; MVMHashEntry *current, *tmp; unsigned bucket_tmp; /* NOTE: if we really wanted to, we could avoid rehashing... */ HASH_ITER(hash_handle, src_body->hash_head, current, tmp, bucket_tmp) { MVMHashEntry *new_entry = MVM_malloc(sizeof(MVMHashEntry)); MVM_ASSIGN_REF(tc, &(dest_root->header), new_entry->value, current->value); MVM_HASH_BIND(tc, dest_body->hash_head, MVM_HASH_KEY(current), new_entry); } } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMHashAttrStoreBody *body = (MVMHashAttrStoreBody *)data; MVMHashEntry *current, *tmp; unsigned bucket_tmp; HASH_ITER(hash_handle, body->hash_head, current, tmp, bucket_tmp) { MVM_gc_worklist_add(tc, worklist, ¤t->hash_handle.key); MVM_gc_worklist_add(tc, worklist, ¤t->value); } } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMHashAttrStore *h = (MVMHashAttrStore *)obj; MVM_HASH_DESTROY(hash_handle, MVMHashEntry, h->body.hash_head); } static void get_attribute(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister *result_reg, MVMuint16 kind) { MVMHashAttrStoreBody *body = (MVMHashAttrStoreBody *)data; if (kind == MVM_reg_obj) { MVMHashEntry *entry; MVM_HASH_GET(tc, body->hash_head, name, entry); result_reg->o = entry != NULL ? entry->value : tc->instance->VMNull; } else { MVM_exception_throw_adhoc(tc, "HashAttrStore representation does not support native attribute storage"); } } static void bind_attribute(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister value_reg, MVMuint16 kind) { MVMHashAttrStoreBody *body = (MVMHashAttrStoreBody *)data; if (kind == MVM_reg_obj) { MVMHashEntry *entry; MVM_HASH_GET(tc, body->hash_head, name, entry); if (!entry) { entry = MVM_malloc(sizeof(MVMHashEntry)); MVM_ASSIGN_REF(tc, &(root->header), entry->value, value_reg.o); MVM_HASH_BIND(tc, body->hash_head, name, entry); MVM_gc_write_barrier(tc, &(root->header), &(name->common.header)); } else { MVM_ASSIGN_REF(tc, &(root->header), entry->value, value_reg.o); } } else { MVM_exception_throw_adhoc(tc, "HashAttrStore representation does not support native attribute storage"); } } static MVMint64 is_attribute_initialized(MVMThreadContext *tc, MVMSTable *st, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint) { MVMHashAttrStoreBody *body = (MVMHashAttrStoreBody *)data; MVMHashEntry *entry; MVM_HASH_GET(tc, body->hash_head, name, entry); return entry != NULL; } static MVMint64 hint_for(MVMThreadContext *tc, MVMSTable *st, MVMObject *class_handle, MVMString *name) { return MVM_NO_HINT; } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMHashAttrStore); } /* Initializes the representation. */ const MVMREPROps * MVMHashAttrStore_initialize(MVMThreadContext *tc) { return &HashAttrStore_this_repr; } static const MVMREPROps HashAttrStore_this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, { get_attribute, bind_attribute, hint_for, is_attribute_initialized, MVM_REPR_DEFAULT_ATTRIBUTE_AS_ATOMIC }, /* attr_funcs */ MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "HashAttrStore", /* name */ MVM_REPR_ID_HashAttrStore, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; MoarVM-2018.03/src/6model/reprs/HashAttrStore.h0000644000175000017510000000063013237701240021215 0ustar samanthasamantha/* Representation used by HashAttrStore. */ struct MVMHashAttrStoreBody { /* The head of the hash, or null if the hash is empty. * The UT_HASH macros update this pointer directly. */ MVMHashEntry *hash_head; }; struct MVMHashAttrStore { MVMObject common; MVMHashAttrStoreBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMHashAttrStore_initialize(MVMThreadContext *tc); MoarVM-2018.03/src/6model/reprs/KnowHOWAttributeREPR.c0000644000175000017510000000756013237701240022337 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps KnowHOWAttributeREPR_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &KnowHOWAttributeREPR_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMKnowHOWAttributeREPR); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMKnowHOWAttributeREPRBody *src_body = (MVMKnowHOWAttributeREPRBody *)src; MVMKnowHOWAttributeREPRBody *dest_body = (MVMKnowHOWAttributeREPRBody *)dest; MVM_ASSIGN_REF(tc, &(dest_root->header), dest_body->name, src_body->name); MVM_ASSIGN_REF(tc, &(dest_root->header), dest_body->type, src_body->type); dest_body->box_target = src_body->box_target; } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMKnowHOWAttributeREPRBody *body = (MVMKnowHOWAttributeREPRBody *)data; MVM_gc_worklist_add(tc, worklist, &body->name); MVM_gc_worklist_add(tc, worklist, &body->type); } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMKnowHOWAttributeREPR); } /* Serializes the data. */ static void serialize(MVMThreadContext *tc, MVMSTable *st, void *data, MVMSerializationWriter *writer) { MVMKnowHOWAttributeREPRBody *body = (MVMKnowHOWAttributeREPRBody *)data; MVM_serialization_write_str(tc, writer, body->name); } /* Deserializes the data. */ static void deserialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMSerializationReader *reader) { MVMKnowHOWAttributeREPRBody *body = (MVMKnowHOWAttributeREPRBody *)data; MVM_ASSIGN_REF(tc, &(root->header), body->name, MVM_serialization_read_str(tc, reader)); MVM_ASSIGN_REF(tc, &(root->header), body->type, tc->instance->KnowHOW); } /* Initializes the representation. */ const MVMREPROps * MVMKnowHOWAttributeREPR_initialize(MVMThreadContext *tc) { return &KnowHOWAttributeREPR_this_repr; } static const MVMREPROps KnowHOWAttributeREPR_this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ serialize, deserialize, NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, gc_mark, NULL, /* gc_free */ NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "KnowHOWAttributeREPR", /* name */ MVM_REPR_ID_KnowHOWAttributeREPR, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; MoarVM-2018.03/src/6model/reprs/KnowHOWAttributeREPR.h0000644000175000017510000000075313237701240022341 0ustar samanthasamantha/* Representation used for bootstrapping attributes. */ struct MVMKnowHOWAttributeREPRBody { /* The attribute's name. */ MVMString *name; /* The attribute's type. */ MVMObject *type; /* Whether the attribute serves as a box target. */ MVMuint32 box_target; }; struct MVMKnowHOWAttributeREPR { MVMObject common; MVMKnowHOWAttributeREPRBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMKnowHOWAttributeREPR_initialize(MVMThreadContext *tc); MoarVM-2018.03/src/6model/reprs/KnowHOWREPR.c0000644000175000017510000001143313237701240020445 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps KnowHOWREPR_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &KnowHOWREPR_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMKnowHOWREPR); }); return st->WHAT; } /* Initializes a new instance. */ static void initialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMObject *methods, *attributes, *BOOTArray; MVMObject * const BOOTHash = tc->instance->boot_types.BOOTHash; MVM_gc_root_temp_push(tc, (MVMCollectable **)&root); methods = REPR(BOOTHash)->allocate(tc, STABLE(BOOTHash)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&methods); MVM_ASSIGN_REF(tc, &(root->header), ((MVMKnowHOWREPR *)root)->body.methods, methods); BOOTArray = tc->instance->boot_types.BOOTArray; attributes = REPR(BOOTArray)->allocate(tc, STABLE(BOOTArray)); MVM_ASSIGN_REF(tc, &(root->header), ((MVMKnowHOWREPR *)root)->body.attributes, attributes); MVM_gc_root_temp_pop_n(tc, 2); } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMKnowHOWREPRBody *src_body = (MVMKnowHOWREPRBody *)src; MVMKnowHOWREPRBody *dest_body = (MVMKnowHOWREPRBody *)dest; MVM_ASSIGN_REF(tc, &(dest_root->header), dest_body->methods, src_body->methods); MVM_ASSIGN_REF(tc, &(dest_root->header), dest_body->attributes, src_body->attributes); MVM_ASSIGN_REF(tc, &(dest_root->header), dest_body->name, src_body->name); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMKnowHOWREPRBody *body = (MVMKnowHOWREPRBody *)data; MVM_gc_worklist_add(tc, worklist, &body->methods); MVM_gc_worklist_add(tc, worklist, &body->attributes); MVM_gc_worklist_add(tc, worklist, &body->name); } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMKnowHOWREPR); } /* Serializes the data. */ static void serialize(MVMThreadContext *tc, MVMSTable *st, void *data, MVMSerializationWriter *writer) { MVMKnowHOWREPRBody *body = (MVMKnowHOWREPRBody *)data; MVM_serialization_write_str(tc, writer, body->name); MVM_serialization_write_ref(tc, writer, body->attributes); MVM_serialization_write_ref(tc, writer, body->methods); } /* Deserializes the data. */ static void deserialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMSerializationReader *reader) { MVMKnowHOWREPRBody *body = (MVMKnowHOWREPRBody *)data; MVM_ASSIGN_REF(tc, &(root->header), body->name, MVM_serialization_read_str(tc, reader)); MVM_ASSIGN_REF(tc, &(root->header), body->attributes, MVM_serialization_read_ref(tc, reader)); MVM_ASSIGN_REF(tc, &(root->header), body->methods, MVM_serialization_read_ref(tc, reader)); } /* Initializes the representation. */ const MVMREPROps * MVMKnowHOWREPR_initialize(MVMThreadContext *tc) { return &KnowHOWREPR_this_repr; } static const MVMREPROps KnowHOWREPR_this_repr = { type_object_for, MVM_gc_allocate_object, initialize, copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ serialize, deserialize, NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, gc_mark, NULL, /* gc_free */ NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "KnowHOWREPR", /* name */ MVM_REPR_ID_KnowHOWREPR, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; MoarVM-2018.03/src/6model/reprs/KnowHOWREPR.h0000644000175000017510000000070113237701240020446 0ustar samanthasamantha/* Representation used for bootstrapping the KnowHOW type. */ struct MVMKnowHOWREPRBody { /* Methods table; a hash. */ MVMObject *methods; /* Array of attribute meta-objects. */ MVMObject *attributes; /* Name of the type. */ MVMString *name; }; struct MVMKnowHOWREPR { MVMObject common; MVMKnowHOWREPRBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMKnowHOWREPR_initialize(MVMThreadContext *tc); MoarVM-2018.03/src/6model/reprs/MVMAsyncTask.c0000644000175000017510000000651213237701240020742 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps MVMAsyncTask_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &MVMAsyncTask_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMAsyncTask); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "Cannot copy object with repr MVMAsyncTask"); } static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMAsyncTask); } /* Called by the VM to mark any GCable items. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMAsyncTaskBody *task = (MVMAsyncTaskBody *)data; MVM_gc_worklist_add(tc, worklist, &task->queue); MVM_gc_worklist_add(tc, worklist, &task->schedulee); MVM_gc_worklist_add(tc, worklist, &task->cancel_notify_queue); MVM_gc_worklist_add(tc, worklist, &task->cancel_notify_schedulee); if (task->ops && task->ops->gc_mark) task->ops->gc_mark(tc, task->data, worklist); } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMAsyncTask *task = (MVMAsyncTask *)obj; if (task->body.ops && task->body.ops->gc_free) task->body.ops->gc_free(tc, obj, task->body.data); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Initializes the representation. */ const MVMREPROps * MVMAsyncTask_initialize(MVMThreadContext *tc) { return &MVMAsyncTask_this_repr; } static const MVMREPROps MVMAsyncTask_this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "AsyncTask", /* name */ MVM_REPR_ID_MVMAsyncTask, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; MoarVM-2018.03/src/6model/reprs/MVMAsyncTask.h0000644000175000017510000000171613242626641020757 0ustar samanthasamantha/* States an async task can be in. */ #define MVM_ASYNC_TASK_STATE_NEW 0 #define MVM_ASYNC_TASK_STATE_SETUP 1 #define MVM_ASYNC_TASK_STATE_CANCELLED 2 /* Representation serving as a handle to an asynchronous task. */ struct MVMAsyncTaskBody { /* The queue to schedule a result handler on. */ MVMObject *queue; /* The result handler to schedule. */ MVMObject *schedulee; /* Async task operation table. */ const MVMAsyncTaskOps *ops; /* Data stored by operation type. */ void *data; /* The queue to schedule a cancellation notification on, if any. */ MVMObject *cancel_notify_queue; /* The cancellation notification handler, if any. */ MVMObject *cancel_notify_schedulee; /* The current state of the task. */ MVMint32 state; }; struct MVMAsyncTask { MVMObject common; MVMAsyncTaskBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMAsyncTask_initialize(MVMThreadContext *tc); MoarVM-2018.03/src/6model/reprs/MVMCFunction.c0000644000175000017510000000561413237701240020734 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps MVMCFunction_this_repr; /* Invocation protocol handler. */ static void invoke_handler(MVMThreadContext *tc, MVMObject *invokee, MVMCallsite *callsite, MVMRegister *args) { if (IS_CONCRETE(invokee)) ((MVMCFunction *)invokee)->body.func(tc, callsite, args); else MVM_exception_throw_adhoc(tc, "Cannot invoke C function type object"); } /* Creates a new type object of this representation, and associates it with * the given HOW. Also sets the invocation protocol handler in the STable. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &MVMCFunction_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->invoke = invoke_handler; st->size = sizeof(MVMCFunction); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMCFunctionBody *src_body = (MVMCFunctionBody *)src; MVMCFunctionBody *dest_body = (MVMCFunctionBody *)dest; dest_body->func = src_body->func; } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Initializes the representation. */ const MVMREPROps * MVMCFunction_initialize(MVMThreadContext *tc) { return &MVMCFunction_this_repr; } static const MVMREPROps MVMCFunction_this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ NULL, /* deserialize_stable_size */ NULL, /* gc_mark */ NULL, /* gc_free */ NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "MVMCFunction", /* name */ MVM_REPR_ID_MVMCFunction, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; MoarVM-2018.03/src/6model/reprs/MVMCFunction.h0000644000175000017510000000103113237701240020726 0ustar samanthasamantha/* Representation holding a pointer to a C function, which is * passed a callsite descriptor and an argument list as well as * the current thread context. Used for the handful of things * that are implemented as C functions inside the VM. */ struct MVMCFunctionBody { void (*func) (MVMThreadContext *tc, MVMCallsite *callsite, MVMRegister *args); }; struct MVMCFunction { MVMObject common; MVMCFunctionBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMCFunction_initialize(MVMThreadContext *tc); MoarVM-2018.03/src/6model/reprs/MVMCallCapture.c0000644000175000017510000001302413237701240021235 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps MVMCallCapture_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. Also sets the invocation protocol handler in the STable. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &MVMCallCapture_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMCallCapture); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMCallCaptureBody *src_body = (MVMCallCaptureBody *)src; MVMCallCaptureBody *dest_body = (MVMCallCaptureBody *)dest; MVMuint32 arg_size = src_body->apc->arg_count * sizeof(MVMRegister); MVMRegister *args = MVM_malloc(arg_size); memcpy(args, src_body->apc->args, arg_size); dest_body->apc = (MVMArgProcContext *)MVM_calloc(1, sizeof(MVMArgProcContext)); MVM_args_proc_init(tc, dest_body->apc, MVM_args_copy_uninterned_callsite(tc, src_body->apc), args); } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMCallCaptureBody *body = (MVMCallCaptureBody *)data; MVMArgProcContext *ctx = body->apc; MVMuint8 *flag_map = body->apc->callsite->arg_flags; MVMuint16 count = ctx->arg_count; MVMuint16 i, flag; for (i = 0, flag = 0; i < count; i++, flag++) { if (flag_map[flag] & MVM_CALLSITE_ARG_NAMED) { /* Current position is name, then next is value. */ MVM_gc_worklist_add(tc, worklist, &ctx->args[i].s); i++; } if (flag_map[flag] & MVM_CALLSITE_ARG_STR || flag_map[flag] & MVM_CALLSITE_ARG_OBJ) MVM_gc_worklist_add(tc, worklist, &ctx->args[i].o); } } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMCallCapture *ctx = (MVMCallCapture *)obj; /* We made our own copy of the callsite, args buffer and processing * context, so free them all. */ if (ctx->body.apc) { MVMCallsite *cs = ctx->body.apc->callsite; if (cs && !cs->is_interned) { MVM_free(cs->arg_flags); MVM_free(cs); } if (ctx->body.apc->named_used_size > 64) MVM_fixed_size_free(tc, tc->instance->fsa, ctx->body.apc->named_used_size, ctx->body.apc->named_used.byte_array); MVM_free(ctx->body.apc->args); MVM_free(ctx->body.apc); } } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Initializes the representation. */ const MVMREPROps * MVMCallCapture_initialize(MVMThreadContext *tc) { return &MVMCallCapture_this_repr; } static const MVMREPROps MVMCallCapture_this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ NULL, /* deserialize_stable_size */ gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "MVMCallCapture", /* name */ MVM_REPR_ID_MVMCallCapture, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; /* This function was only introduced for the benefit of the JIT. */ MVMint64 MVM_capture_pos_primspec(MVMThreadContext *tc, MVMObject *obj, MVMint64 i) { if (IS_CONCRETE(obj) && REPR(obj)->ID == MVM_REPR_ID_MVMCallCapture) { MVMCallCapture *cc = (MVMCallCapture *)obj; if (i >= 0 && i < cc->body.apc->num_pos) { MVMCallsiteEntry *arg_flags = cc->body.apc->arg_flags ? cc->body.apc->arg_flags : cc->body.apc->callsite->arg_flags; switch (arg_flags[i] & MVM_CALLSITE_ARG_MASK) { case MVM_CALLSITE_ARG_INT: return MVM_STORAGE_SPEC_BP_INT; case MVM_CALLSITE_ARG_NUM: return MVM_STORAGE_SPEC_BP_NUM; case MVM_CALLSITE_ARG_STR: return MVM_STORAGE_SPEC_BP_STR; default: return MVM_STORAGE_SPEC_BP_NONE; } } else { MVM_exception_throw_adhoc(tc, "Bad argument index given to captureposprimspec"); } } else { MVM_exception_throw_adhoc(tc, "captureposprimspec needs a MVMCallCapture"); } } MoarVM-2018.03/src/6model/reprs/MVMCallCapture.h0000644000175000017510000000063113237701240021242 0ustar samanthasamantha/* Representation for an argument capture, with argument processing state. */ struct MVMCallCaptureBody { MVMArgProcContext *apc; }; struct MVMCallCapture { MVMObject common; MVMCallCaptureBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMCallCapture_initialize(MVMThreadContext *tc); MVMint64 MVM_capture_pos_primspec(MVMThreadContext *tc, MVMObject *capture, MVMint64 index); MoarVM-2018.03/src/6model/reprs/MVMCode.c0000644000175000017510000001463413237701240017720 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps MVMCode_this_repr; /* Invocation protocol handler. */ static void invoke_handler(MVMThreadContext *tc, MVMObject *invokee, MVMCallsite *callsite, MVMRegister *args) { if (IS_CONCRETE(invokee)) { MVMCode *code = (MVMCode *)invokee; MVM_frame_invoke(tc, code->body.sf, callsite, args, code->body.outer, invokee, -1); } else { MVM_exception_throw_adhoc(tc, "Cannot invoke code type object"); } } /* Creates a new type object of this representation, and associates it with * the given HOW. Also sets the invocation protocol handler in the STable. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &MVMCode_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->invoke = invoke_handler; st->size = sizeof(MVMCode); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMCodeBody *src_body = (MVMCodeBody *)src; MVMCodeBody *dest_body = (MVMCodeBody *)dest; MVM_ASSIGN_REF(tc, &(dest_root->header), dest_body->sf, src_body->sf); if (src_body->outer) { MVM_ASSIGN_REF(tc, &(dest_root->header), dest_body->outer, src_body->outer); } MVM_ASSIGN_REF(tc, &(dest_root->header), dest_body->name, src_body->name); /* Explicitly do *not* copy state vars in a (presumably closure) clone. */ } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMCodeBody *body = (MVMCodeBody *)data; MVM_gc_worklist_add(tc, worklist, &body->outer); MVM_gc_worklist_add(tc, worklist, &body->code_object); MVM_gc_worklist_add(tc, worklist, &body->sf); MVM_gc_worklist_add(tc, worklist, &body->name); if (body->state_vars) { MVMuint8 *flags = body->sf->body.static_env_flags; MVMuint16 *types = body->sf->body.lexical_types; MVMint64 numlex = body->sf->body.num_lexicals; MVMint64 i; for (i = 0; i < numlex; i++) { if (flags[i] == 2) { if (types[i] == MVM_reg_obj) MVM_gc_worklist_add(tc, worklist, &body->state_vars[i].o); else if (types[i] == MVM_reg_str) MVM_gc_worklist_add(tc, worklist, &body->state_vars[i].s); } } } } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMCode *code_obj = (MVMCode *)obj; MVM_free(code_obj->body.state_vars); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Initializes the representation. */ const MVMREPROps * MVMCode_initialize(MVMThreadContext *tc) { return &MVMCode_this_repr; } static const MVMREPROps MVMCode_this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ NULL, /* deserialize_stable_size */ gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "MVMCode", /* name */ MVM_REPR_ID_MVMCode, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; MVM_PUBLIC MVMObject * MVM_code_location(MVMThreadContext *tc, MVMObject *code) { MVMObject *BOOTHash = tc->instance->boot_types.BOOTHash; MVMObject *result = REPR(BOOTHash)->allocate(tc, STABLE(BOOTHash)); MVMString *file; MVMint32 line; MVMObject *filename_boxed; MVMObject *linenumber_boxed; MVMString *filename_key, *linenumber_key; MVM_code_location_out(tc, code, &file, &line); MVM_gc_root_temp_push(tc, (MVMCollectable **)&file); MVM_gc_root_temp_push(tc, (MVMCollectable **)&result); filename_key = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "file"); MVM_gc_root_temp_push(tc, (MVMCollectable **)&filename_key); linenumber_key = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "line"); MVM_gc_root_temp_push(tc, (MVMCollectable **)&linenumber_key); filename_boxed = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, file); MVM_repr_bind_key_o(tc, result, filename_key, filename_boxed); linenumber_boxed = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, line); MVM_repr_bind_key_o(tc, result, linenumber_key, linenumber_boxed); MVM_gc_root_temp_pop_n(tc, 4); return result; } void MVM_code_location_out(MVMThreadContext *tc, MVMObject *code, MVMString **file_out, MVMint32 *line_out) { if (REPR(code)->ID != MVM_REPR_ID_MVMCode) { MVM_exception_throw_adhoc(tc, "getcodelocation needs an object of MVMCode REPR, got %s instead", REPR(code)->name); } else { MVMCodeBody *body = &((MVMCode*)code)->body; MVMBytecodeAnnotation *ann = MVM_bytecode_resolve_annotation(tc, &body->sf->body, 0); MVMCompUnit *cu = body->sf->body.cu; MVMint32 str_idx = ann ? ann->filename_string_heap_index : 0; *line_out = ann ? ann->line_number : 1; if (ann && str_idx < cu->body.num_strings) { *file_out = MVM_cu_string(tc, cu, str_idx); } else { *file_out = cu->body.filename; } MVM_free(ann); } } MoarVM-2018.03/src/6model/reprs/MVMCode.h0000644000175000017510000000134113237701240017714 0ustar samanthasamantha/* Representation for code in the VM. Holds an MVMStaticFrame along * with an optional outer pointer if this is a closure. */ struct MVMCodeBody { MVMStaticFrame *sf; MVMFrame *outer; MVMObject *code_object; MVMString *name; MVMRegister *state_vars; MVMuint16 is_static; MVMuint16 is_compiler_stub; }; struct MVMCode { MVMObject common; MVMCodeBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMCode_initialize(MVMThreadContext *tc); MVM_PUBLIC MVMObject * MVM_code_location(MVMThreadContext *tc, MVMObject *code); void MVM_code_location_out(MVMThreadContext *tc, MVMObject *code, MVMString **file_out, MVMint32 *line_out); MoarVM-2018.03/src/6model/reprs/MVMCompUnit.c0000644000175000017510000002075313237701240020603 0ustar samanthasamantha#include "moar.h" #include "platform/mmap.h" /* This representation's function pointer table. */ static const MVMREPROps MVMCompUnit_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. Also sets the invocation protocol handler in the STable. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &MVMCompUnit_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMCompUnit); }); return st->WHAT; } /* Initializes a new instance. */ static void initialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMCompUnit *cu = (MVMCompUnit *)root; MVMROOT(tc, cu, { MVMObject *rm = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTReentrantMutex); MVM_ASSIGN_REF(tc, &(root->header), cu->body.deserialize_frame_mutex, rm); cu->body.inline_tweak_mutex = MVM_malloc(sizeof(uv_mutex_t)); uv_mutex_init(cu->body.inline_tweak_mutex); }); } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "this representation (CompUnit) cannot be cloned"); } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMCompUnitBody *body = (MVMCompUnitBody *)data; MVMuint32 i; /* Add code refs to the worklists. */ for (i = 0; i < body->num_frames; i++) MVM_gc_worklist_add(tc, worklist, &body->coderefs[i]); /* Add extop names to the worklist. */ for (i = 0; i < body->num_extops; i++) MVM_gc_worklist_add(tc, worklist, &body->extops[i].name); /* Add strings to the worklists. */ for (i = 0; i < body->num_strings; i++) MVM_gc_worklist_add(tc, worklist, &body->strings[i]); /* Add serialization contexts to the worklist. */ for (i = 0; i < body->num_scs; i++) { if (body->scs[i]) { MVM_gc_worklist_add(tc, worklist, &body->scs[i]); } /* Unresolved sc bodies' handles are marked by the GC instance root marking. */ } MVM_gc_worklist_add(tc, worklist, &body->deserialize_frame_mutex); /* Add various other referenced strings, etc. */ MVM_gc_worklist_add(tc, worklist, &body->hll_name); MVM_gc_worklist_add(tc, worklist, &body->filename); } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMCompUnitBody *body = &((MVMCompUnit *)obj)->body; int i; for (i = 0; i < body->num_callsites; i++) { MVMCallsite *cs = body->callsites[i]; if (!cs->is_interned) MVM_callsite_destroy(cs); } uv_mutex_destroy(body->inline_tweak_mutex); MVM_free(body->inline_tweak_mutex); MVM_free(body->coderefs); if (body->callsites) MVM_fixed_size_free(tc, tc->instance->fsa, body->num_callsites * sizeof(MVMCallsite *), body->callsites); if (body->extops) MVM_fixed_size_free(tc, tc->instance->fsa, body->num_extops * sizeof(MVMExtOpRecord), body->extops); if (body->strings) MVM_fixed_size_free(tc, tc->instance->fsa, body->num_strings * sizeof(MVMString *), body->strings); MVM_free(body->scs); MVM_free(body->scs_to_resolve); MVM_free(body->sc_handle_idxs); MVM_free(body->string_heap_fast_table); switch (body->deallocate) { case MVM_DEALLOCATE_NOOP: break; case MVM_DEALLOCATE_FREE: MVM_free(body->data_start); break; case MVM_DEALLOCATE_UNMAP: MVM_platform_unmap_file(body->data_start, body->handle, body->data_size); break; default: MVM_panic(MVM_exitcode_NYI, "Invalid deallocate of %u during MVMCompUnit gc_free", body->deallocate); } } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { /* XXX in the end we'll support inlining of this... */ return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Calculates the non-GC-managed memory we hold on to. */ static MVMuint64 unmanaged_size(MVMThreadContext *tc, MVMSTable *st, void *data) { MVMCompUnitBody *body = (MVMCompUnitBody *)data; MVMuint64 size = 0; MVMuint32 index; size += sizeof(MVMCallsite *) * body->num_callsites; for (index = 0; index < body->num_callsites; index++) { MVMCallsite *cs = body->callsites[index]; if (cs && !cs->is_interned) { size += sizeof(MVMCallsite); size += sizeof(MVMCallsiteEntry) * cs->flag_count; size += sizeof(MVMString *) * MVM_callsite_num_nameds(tc, cs); } } if (body->deallocate == MVM_DEALLOCATE_FREE) { /* XXX do we want to count mmapped data for the bytecode segment, too? */ size += body->data_size; } size += sizeof(MVMObject *) * body->num_frames; size += sizeof(MVMExtOpRecord *) * body->num_extops; size += sizeof(MVMString *) * body->num_strings; size += body->serialized_size; /* since SCs are GC-managed themselves, only the array containing them * is added to the unmanaged size here. */ size += body->num_scs * ( sizeof(MVMSerializationContext *) + /* scs */ sizeof(MVMSerializationContextBody *) + /* scs_to_resolve */ sizeof(MVMint32) /* sc_handle_idxs */ ); return size; } static void describe_refs(MVMThreadContext *tc, MVMHeapSnapshotState *ss, MVMSTable *st, void *data) { MVMCompUnitBody *body = (MVMCompUnitBody *)data; MVMuint32 i; /* Add code refs to the worklists. */ for (i = 0; i < body->num_frames; i++) MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->coderefs[i], "Code refs array entry"); /* Add extop names to the worklist. */ for (i = 0; i < body->num_extops; i++) MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->extops[i].name, "Ext-op names list entry"); /* Add strings to the worklists. */ for (i = 0; i < body->num_strings; i++) MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->strings[i], "Strings heap entry"); /* Add serialization contexts to the worklist. */ for (i = 0; i < body->num_scs; i++) MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->scs[i], "Serialization context dependency"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->deserialize_frame_mutex, "Update_mutex"); /* Add various other referenced strings, etc. */ MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->hll_name, "HLL name"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->filename, "Filename"); } /* Initializes the representation. */ const MVMREPROps * MVMCompUnit_initialize(MVMThreadContext *tc) { return &MVMCompUnit_this_repr; } static const MVMREPROps MVMCompUnit_this_repr = { type_object_for, MVM_gc_allocate_object, initialize, copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ NULL, /* deserialize_stable_size */ gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "MVMCompUnit", /* name */ MVM_REPR_ID_MVMCompUnit, unmanaged_size, describe_refs, }; MoarVM-2018.03/src/6model/reprs/MVMCompUnit.h0000644000175000017510000001353313237701240020606 0ustar samanthasamanthastruct MVMExtOpRecord { /* Used to query the extop registry. */ MVMString *name; /* Resolved by the validator. */ MVMOpInfo *info; /* The actual function executed by the interpreter. * Resolved by the validator. */ MVMExtOpFunc *func; /* Tells the interpreter by how much to increment * the instruction pointer. */ MVMuint16 operand_bytes; /* Indicates the JIT should not emit a call to this op, because it needs * to be used in an interpreter context. */ MVMuint16 no_jit; /* Indicates the extop allocates and that its output is some allocated * object. Used by allocation profiling. */ MVMuint16 allocating; /* Read from the bytecode stream. */ MVMuint8 operand_descriptor[MVM_MAX_OPERANDS]; /* Specialization function. */ MVMExtOpSpesh *spesh; /* Discover facts for spesh. */ MVMExtOpFactDiscover *discover; }; /* How to release memory. */ typedef enum { MVM_DEALLOCATE_NOOP, MVM_DEALLOCATE_FREE, MVM_DEALLOCATE_UNMAP } MVMDeallocate; /* Representation for a compilation unit in the VM. */ struct MVMCompUnitBody { /* The start and size of the raw data for this compilation unit. */ MVMuint8 *data_start; MVMuint32 data_size; /* Refers to the extops pointer below. Lives here for struct layout */ MVMuint16 num_extops; /* See callsites, num_callsites, and orig_callsites below. */ MVMuint16 max_callsite_size; /* The code objects for each frame, along with counts of frames. */ MVMObject **coderefs; MVMuint32 num_frames; /* Total, inc. added by inliner. */ MVMuint32 orig_frames; /* Original from loading comp unit. */ /* Special frames. */ MVMStaticFrame *main_frame; MVMStaticFrame *load_frame; MVMStaticFrame *deserialize_frame; /* The callsites in the compilation unit. */ MVMCallsite **callsites; MVMuint32 num_callsites; MVMuint32 orig_callsites; /* The extension ops used by the compilation unit. */ MVMExtOpRecord *extops; /* The string heap and number of strings. */ MVMString **strings; MVMuint32 num_strings; MVMuint32 orig_strings; /* We decode strings on first use. Scanning through the string heap every * time to find where a string lives, however, would be extremely time * consuming. So, we keep a table that has the offsets into the string heap * every MVM_STRING_FAST_TABLE_SPAN strings. For example, were it 16, then * string_heap_fast_table[1] is where we'd look to find out how to locate * strings 16..31, then scanning through the string blob itself to get to * the string within that region. string_heap_fast_table_top contains the * top location in string_heap_fast_table that has been initialized so far. * It starts out at 0, which is safe even if we don't do anything since the * first string will be at the start of the blob anyway. Finally, we don't * do any concurrency control over this table, since all threads will be * working towards the same result anyway. Duplicate work occasionally will * almost always be cheaper than unrequired synchronization every time. A * memory barrier before updating string_heap_fast_table_top makes sure we * never have its update getting moved ahead of writes into the table. */ MVMuint32 *string_heap_fast_table; MVMuint32 string_heap_fast_table_top; /* Refers to serialized below. sneaked in here to optimize struct layout */ MVMint32 serialized_size; MVMuint8 *string_heap_start; MVMuint8 *string_heap_read_limit; /* Serialized data, if any. */ /* For its size, see serialized_size above. */ MVMuint8 *serialized; /* Array of the resolved serialization contexts, and how many we * have. A null in the list indicates not yet resolved */ MVMSerializationContext **scs; MVMuint32 num_scs; /* How we should deallocate data_start. */ MVMDeallocate deallocate; /* List of serialization contexts in need of resolution. This is an * array of string handles; its length is determined by num_scs above. * once an SC has been resolved, the entry on this list is NULLed. If * all are resolved, this pointer itself becomes NULL. */ MVMSerializationContextBody **scs_to_resolve; /* List of SC handle string indexes. */ MVMint32 *sc_handle_idxs; /* HLL configuration for this compilation unit. */ MVMHLLConfig *hll_config; MVMString *hll_name; /* Filename, if any, that we loaded it from. */ MVMString *filename; /* Handle, if any, associated with a mapped file. */ void *handle; /* Unmanaged (so not GC-aware) mutex taken if we want to add extra string, * callsite, extop, or coderef constants to the pools. This is done in * some cases of cross-compilation-unit inlining. We are never at risk of * recursion on this mutex, and since spesh can never GC it's important we * do not use a GC-aware mutex, which could trigger GC. */ uv_mutex_t *inline_tweak_mutex; /* MVMReentrantLock to be taken when we want to finish deserializing a * frame inside of the compilation unit. */ MVMObject *deserialize_frame_mutex; /* Version of the bytecode format we deserialized this comp unit from. */ MVMuint16 bytecode_version; /* Was a frame in this compilation unit invoked yet? */ MVMuint8 invoked; }; struct MVMCompUnit { MVMObject common; MVMCompUnitBody body; }; /* Strings per entry in the fast table; see above for details. */ #define MVM_STRING_FAST_TABLE_SPAN 16 struct MVMLoadedCompUnitName { /* Loaded filename. */ MVMString *filename; /* Inline handle to the loaded filenames hash (in MVMInstance). */ UT_hash_handle hash_handle; }; /* Function for REPR setup. */ const MVMREPROps * MVMCompUnit_initialize(MVMThreadContext *tc); MoarVM-2018.03/src/6model/reprs/MVMContext.c0000644000175000017510000001601513237701240020465 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps MVMContext_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. Also sets the invocation protocol handler in the STable. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &MVMContext_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMContext); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_panic(MVM_exitcode_NYI, "MVMContext copy_to NYI"); } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMContextBody *body = (MVMContextBody *)data; MVM_gc_worklist_add(tc, worklist, &body->context); } static void at_key(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key, MVMRegister *result, MVMuint16 kind) { MVMString *name = (MVMString *)key; MVMContextBody *body = (MVMContextBody *)data; MVMFrame *frame = body->context; MVMLexicalRegistry *lexical_names = frame->static_info->body.lexical_names, *entry; if (!lexical_names) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Lexical with name '%s' does not exist in this frame", c_name); } MVM_HASH_GET(tc, lexical_names, name, entry); if (!entry) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Lexical with name '%s' does not exist in this frame", c_name); } if (frame->static_info->body.lexical_types[entry->value] != kind) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Lexical with name '%s' has a different type in this frame", c_name); } *result = frame->env[entry->value]; if (kind == MVM_reg_obj && !result->o) result->o = MVM_frame_vivify_lexical(tc, frame, entry->value); } static void bind_key(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key, MVMRegister value, MVMuint16 kind) { MVMString *name = (MVMString *)key; MVMContextBody *body = (MVMContextBody *)data; MVMFrame *frame = body->context; MVMLexicalRegistry *lexical_names = frame->static_info->body.lexical_names, *entry; MVMuint16 got_kind; if (!lexical_names) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Lexical with name '%s' does not exist in this frame", c_name); } MVM_HASH_GET(tc, lexical_names, name, entry); if (!entry) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Lexical with name '%s' does not exist in this frame", c_name); } got_kind = frame->static_info->body.lexical_types[entry->value]; if (got_kind != kind) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Lexical with name '%s' has a different type in this frame", c_name); } if (got_kind == MVM_reg_obj || got_kind == MVM_reg_str) { MVM_ASSIGN_REF(tc, &(frame->header), frame->env[entry->value].o, value.o); } else { frame->env[entry->value] = value; } } static MVMuint64 elems(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMContextBody *body = (MVMContextBody *)data; MVMFrame *frame = body->context; MVMLexicalRegistry *lexical_names = frame->static_info->body.lexical_names; return (MVMuint64) HASH_CNT(hash_handle, lexical_names); } static MVMint64 exists_key(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key) { MVMContextBody *body = (MVMContextBody *)data; MVMFrame *frame = body->context; MVMLexicalRegistry *lexical_names = frame->static_info->body.lexical_names, *entry; MVMString *name = (MVMString *)key; if (!lexical_names) return 0; MVM_HASH_GET(tc, lexical_names, name, entry); return entry ? 1 : 0; } static void delete_key(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key) { MVM_exception_throw_adhoc(tc, "MVMContext representation does not support delete key"); } static MVMStorageSpec get_value_storage_spec(MVMThreadContext *tc, MVMSTable *st) { MVMStorageSpec spec; spec.inlineable = MVM_STORAGE_SPEC_REFERENCE; spec.boxed_primitive = MVM_STORAGE_SPEC_BP_NONE; spec.can_box = 0; spec.bits = 0; spec.align = 0; spec.is_unsigned = 0; return spec; } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Initializes the representation. */ const MVMREPROps * MVMContext_initialize(MVMThreadContext *tc) { return &MVMContext_this_repr; } static const MVMREPROps MVMContext_this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, { at_key, bind_key, exists_key, delete_key, get_value_storage_spec }, /* ass_funcs */ elems, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ NULL, /* deserialize_stable_size */ gc_mark, NULL, /* gc_free */ NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "MVMContext", /* name */ MVM_REPR_ID_MVMContext, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; MoarVM-2018.03/src/6model/reprs/MVMContext.h0000644000175000017510000000043113237701240020465 0ustar samanthasamantha/* Representation for a context in the VM. Holds an MVMFrame. */ struct MVMContextBody { MVMFrame *context; }; struct MVMContext { MVMObject common; MVMContextBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMContext_initialize(MVMThreadContext *tc); MoarVM-2018.03/src/6model/reprs/MVMContinuation.c0000644000175000017510000000734613237701240021522 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps MVMContinuation_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. Also sets the invocation protocol handler in the STable. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &MVMContinuation_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMContinuation); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_panic(MVM_exitcode_NYI, "MVMContinuation copy_to NYI"); } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMContinuationBody *body = (MVMContinuationBody *)data; MVM_gc_worklist_add(tc, worklist, &body->top); MVM_gc_worklist_add(tc, worklist, &body->root); if (body->active_handlers) { MVMActiveHandler *cur_ah = body->active_handlers; while (cur_ah != NULL) { MVM_gc_worklist_add(tc, worklist, &cur_ah->ex_obj); MVM_gc_worklist_add(tc, worklist, &cur_ah->frame); cur_ah = cur_ah->next_handler; } } if (body->prof_cont) { MVMuint64 i; for (i = 0; i < body->prof_cont->num_sfs; i++) MVM_gc_worklist_add(tc, worklist, &(body->prof_cont->sfs[i])); } } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMContinuation *ctx = (MVMContinuation *)obj; if (ctx->body.active_handlers) { MVMActiveHandler *cur_ah = ctx->body.active_handlers; while (cur_ah != NULL) { MVMActiveHandler *next_ah = cur_ah->next_handler; MVM_free(cur_ah); cur_ah = next_ah; } } if (ctx->body.prof_cont) MVM_free(ctx->body.prof_cont); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Initializes the representation. */ const MVMREPROps * MVMContinuation_initialize(MVMThreadContext *tc) { return &MVMContinuation_this_repr; } static const MVMREPROps MVMContinuation_this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, NULL, /* elems */ get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ NULL, /* deserialize_stable_size */ gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "MVMContinuation", /* name */ MVM_REPR_ID_MVMContinuation, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; MoarVM-2018.03/src/6model/reprs/MVMContinuation.h0000644000175000017510000000212413237701240021514 0ustar samanthasamantha/* Representation for a continuation in the VM. */ struct MVMContinuationBody { /* Top frame of the continuation. */ MVMFrame *top; /* Address to resume execution at when the continuation is invoked. */ MVMuint8 *addr; /* Register to put invoke argument into after resume. */ MVMRegister *res_reg; /* Root of the continuation. */ MVMFrame *root; /* Active exception handler(s) to restore. */ MVMActiveHandler *active_handlers; /* Flag to check we never invoke this continuation more than once (we rely * on continuations being one-shot, for example to know ->work can really * be cleared safely and that we'll never be running the same continuation * re-invocation on two threads at once). */ AO_t invoked; /* If we're profiling, then data needed to cope with the continuation * being invoked again. */ MVMProfileContinuationData *prof_cont; }; struct MVMContinuation { MVMObject common; MVMContinuationBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMContinuation_initialize(MVMThreadContext *tc); MoarVM-2018.03/src/6model/reprs/MVMDLLSym.c0000644000175000017510000000505013237701240020142 0ustar samanthasamantha#include "moar.h" static const MVMREPROps MVMDLLSym_this_repr; static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &MVMDLLSym_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMDLLSym); }); return st->WHAT; } static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMDLLSymBody *src_body = src; MVMDLLSymBody *dest_body = dest; *dest_body = *src_body; if (dest_body->dll) MVM_incr(&dest_body->dll->refcount); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* noop */ } const MVMREPROps * MVMDLLSym_initialize(MVMThreadContext *tc) { MVMSTable *st = MVM_gc_allocate_stable(tc, &MVMDLLSym_this_repr, NULL); MVMROOT(tc, st, { MVMObject *WHAT = MVM_gc_allocate_type_object(tc, st); tc->instance->raw_types.RawDLLSym = WHAT; MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, WHAT); st->size = sizeof(MVMDLLSym); }); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&tc->instance->raw_types.RawDLLSym, "RawDLLSym"); return &MVMDLLSym_this_repr; } static const MVMREPROps MVMDLLSym_this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ NULL, /* deserialize_stable_size */ NULL, /* gc_mark */ NULL, /* gc_free */ NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "MVMDLLSym", MVM_REPR_ID_MVMDLLSym, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; MoarVM-2018.03/src/6model/reprs/MVMDLLSym.h0000644000175000017510000000031313237701240020144 0ustar samanthasamanthastruct MVMDLLSymBody { void *address; MVMDLLRegistry *dll; }; struct MVMDLLSym { MVMObject common; MVMDLLSymBody body; }; const MVMREPROps * MVMDLLSym_initialize(MVMThreadContext *tc); MoarVM-2018.03/src/6model/reprs/MVMException.c0000644000175000017510000000542513237701240021002 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps MVMException_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. Also sets the invocation protocol handler in the STable. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &MVMException_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMException); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_panic(MVM_exitcode_NYI, "MVMException copy_to NYI"); } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMExceptionBody *body = (MVMExceptionBody *)data; MVM_gc_worklist_add(tc, worklist, &body->message); MVM_gc_worklist_add(tc, worklist, &body->payload); MVM_gc_worklist_add(tc, worklist, &body->origin); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Initializes the representation. */ const MVMREPROps * MVMException_initialize(MVMThreadContext *tc) { return &MVMException_this_repr; } static const MVMREPROps MVMException_this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ NULL, /* deserialize_stable_size */ gc_mark, NULL, /* gc_free */ NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "VMException", /* name */ MVM_REPR_ID_MVMException, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; MoarVM-2018.03/src/6model/reprs/MVMException.h0000644000175000017510000000137013237701240021002 0ustar samanthasamantha/* Representation for an exception in MoarVM. */ struct MVMExceptionBody { /* The exception message. */ MVMString *message; /* The payload (object thrown with the exception). */ MVMObject *payload; /* The exception category. */ MVMint32 category; /* Flag indicating if we should return after unwinding. */ MVMuint8 return_after_unwind; /* Where was the exception thrown from? */ MVMFrame *origin; MVMuint8 *throw_address; /* Where should we resume to, if it's possible? */ MVMuint8 *resume_addr; void *jit_resume_label; }; struct MVMException { MVMObject common; MVMExceptionBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMException_initialize(MVMThreadContext *tc); MoarVM-2018.03/src/6model/reprs/MVMHash.c0000644000175000017510000002305113237701240017722 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps MVMHash_this_repr; MVM_STATIC_INLINE MVMString * get_string_key(MVMThreadContext *tc, MVMObject *key) { if (!key || REPR(key)->ID != MVM_REPR_ID_MVMString || !IS_CONCRETE(key)) MVM_exception_throw_adhoc(tc, "MVMHash representation requires MVMString keys"); return (MVMString *)key; } /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &MVMHash_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMHash); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMHashBody *src_body = (MVMHashBody *)src; MVMHashBody *dest_body = (MVMHashBody *)dest; MVMHashEntry *current = NULL, *tmp = NULL; unsigned bucket_tmp; /* NOTE: if we really wanted to, we could avoid rehashing... */ HASH_ITER(hash_handle, src_body->hash_head, current, tmp, bucket_tmp) { MVMHashEntry *new_entry = MVM_fixed_size_alloc(tc, tc->instance->fsa, sizeof(MVMHashEntry)); MVMString *key = MVM_HASH_KEY(current); MVM_ASSIGN_REF(tc, &(dest_root->header), new_entry->value, current->value); MVM_HASH_BIND(tc, dest_body->hash_head, key, new_entry); MVM_gc_write_barrier(tc, &(dest_root->header), &(key->common.header)); } } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMHashBody *body = (MVMHashBody *)data; MVMHashEntry *current = NULL, *tmp = NULL; unsigned bucket_tmp; HASH_ITER(hash_handle, body->hash_head, current, tmp, bucket_tmp) { MVM_gc_worklist_add(tc, worklist, ¤t->hash_handle.key); MVM_gc_worklist_add(tc, worklist, ¤t->value); } } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMHash *h = (MVMHash *)obj; MVMHashEntry *current = NULL, *tmp = NULL; unsigned bucket_tmp; HASH_ITER(hash_handle, h->body.hash_head, current, tmp, bucket_tmp) { if (current != h->body.hash_head) MVM_fixed_size_free(tc, tc->instance->fsa, sizeof(MVMHashEntry), current); } tmp = h->body.hash_head; HASH_CLEAR(hash_handle, h->body.hash_head); if (tmp) MVM_fixed_size_free(tc, tc->instance->fsa, sizeof(MVMHashEntry), tmp); } static void at_key(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key_obj, MVMRegister *result, MVMuint16 kind) { MVMHashBody *body = (MVMHashBody *)data; MVMHashEntry *entry = NULL; MVM_HASH_GET(tc, body->hash_head, get_string_key(tc, key_obj), entry); if (kind == MVM_reg_obj) result->o = entry != NULL ? entry->value : tc->instance->VMNull; else MVM_exception_throw_adhoc(tc, "MVMHash representation does not support native type storage"); } static void bind_key(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key_obj, MVMRegister value, MVMuint16 kind) { MVMHashBody *body = (MVMHashBody *)data; MVMHashEntry *entry = NULL; MVMString *key = get_string_key(tc, key_obj); if (kind != MVM_reg_obj) MVM_exception_throw_adhoc(tc, "MVMHash representation does not support native type storage"); /* first check whether we can must update the old entry. */ MVM_HASH_GET(tc, body->hash_head, key, entry); if (!entry) { entry = MVM_fixed_size_alloc(tc, tc->instance->fsa, sizeof(MVMHashEntry)); MVM_ASSIGN_REF(tc, &(root->header), entry->value, value.o); MVM_HASH_BIND(tc, body->hash_head, key, entry); MVM_gc_write_barrier(tc, &(root->header), &(key->common.header)); } else { MVM_ASSIGN_REF(tc, &(root->header), entry->value, value.o); } } static MVMuint64 elems(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMHashBody *body = (MVMHashBody *)data; return HASH_CNT(hash_handle, body->hash_head); } static MVMint64 exists_key(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key_obj) { MVMHashBody *body = (MVMHashBody *)data; MVMHashEntry *entry = NULL; MVM_HASH_GET(tc, body->hash_head, get_string_key(tc, key_obj), entry); return entry != NULL; } static void delete_key(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key_obj) { MVMHashBody *body = (MVMHashBody *)data; MVMString *key = get_string_key(tc, key_obj); MVMHashEntry *old_entry = NULL; MVM_HASH_GET(tc, body->hash_head, key, old_entry); if (old_entry) { HASH_DELETE(hash_handle, body->hash_head, old_entry); MVM_fixed_size_free(tc, tc->instance->fsa, sizeof(MVMHashEntry), old_entry); } } static MVMStorageSpec get_value_storage_spec(MVMThreadContext *tc, MVMSTable *st) { MVMStorageSpec spec; spec.inlineable = MVM_STORAGE_SPEC_REFERENCE; spec.boxed_primitive = MVM_STORAGE_SPEC_BP_NONE; spec.can_box = 0; spec.bits = 0; spec.align = 0; spec.is_unsigned = 0; return spec; } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* XXX key and value types will be communicated here */ } /* Deserialize the representation. */ static void deserialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMSerializationReader *reader) { MVMHashBody *body = (MVMHashBody *)data; MVMint64 elems = MVM_serialization_read_int(tc, reader); MVMint64 i; for (i = 0; i < elems; i++) { MVMString *key = MVM_serialization_read_str(tc, reader); MVMObject *value = MVM_serialization_read_ref(tc, reader); MVMHashEntry *entry = MVM_fixed_size_alloc(tc, tc->instance->fsa, sizeof(MVMHashEntry)); MVM_ASSIGN_REF(tc, &(root->header), entry->value, value); MVM_HASH_BIND(tc, body->hash_head, key, entry); } } /* Serialize the representation. */ static void serialize(MVMThreadContext *tc, MVMSTable *st, void *data, MVMSerializationWriter *writer) { MVMHashBody *body = (MVMHashBody *)data; MVMHashEntry *current = NULL, *tmp = NULL; unsigned bucket_tmp; MVM_serialization_write_int(tc, writer, HASH_CNT(hash_handle, body->hash_head)); HASH_ITER(hash_handle, body->hash_head, current, tmp, bucket_tmp) { MVMString *key = MVM_HASH_KEY(current); MVM_serialization_write_str(tc, writer, key); MVM_serialization_write_ref(tc, writer, current->value); } } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMHash); } /* Bytecode specialization for this REPR. */ static void spesh(MVMThreadContext *tc, MVMSTable *st, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { switch (ins->info->opcode) { case MVM_OP_create: { if (!(st->mode_flags & MVM_FINALIZE_TYPE)) { MVMSpeshOperand target = ins->operands[0]; MVMSpeshOperand type = ins->operands[1]; ins->info = MVM_op_get_op(MVM_OP_sp_fastcreate); ins->operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand)); ins->operands[0] = target; ins->operands[1].lit_i16 = sizeof(MVMHash); ins->operands[2].lit_i16 = MVM_spesh_add_spesh_slot(tc, g, (MVMCollectable *)st); MVM_spesh_get_facts(tc, g, type)->usages--; } break; } } } static MVMuint64 unmanaged_size(MVMThreadContext *tc, MVMSTable *st, void *data) { MVMHashBody *body = (MVMHashBody *)data; return sizeof(MVMHashEntry) * HASH_CNT(hash_handle, body->hash_head); } /* Initializes the representation. */ const MVMREPROps * MVMHash_initialize(MVMThreadContext *tc) { return &MVMHash_this_repr; } static const MVMREPROps MVMHash_this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, { at_key, bind_key, exists_key, delete_key, get_value_storage_spec }, /* ass_funcs */ elems, get_storage_spec, NULL, /* change_type */ serialize, deserialize, NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, spesh, "VMHash", /* name */ MVM_REPR_ID_MVMHash, unmanaged_size, /* unmanaged_size */ NULL, /* describe_refs */ }; MoarVM-2018.03/src/6model/reprs/MVMHash.h0000644000175000017510000000327613237701240017736 0ustar samanthasamantha/* Representation used by VM-level hashes. */ struct MVMHashEntry { /* value object */ MVMObject *value; /* the uthash hash handle inline struct, including the key. */ UT_hash_handle hash_handle; }; struct MVMHashBody { /* uthash updates this pointer directly. */ MVMHashEntry *hash_head; }; struct MVMHash { MVMObject common; MVMHashBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMHash_initialize(MVMThreadContext *tc); #define MVM_HASH_BIND(tc, hash, key, value) \ do { \ if (!MVM_is_null(tc, (MVMObject *)key) && REPR(key)->ID == MVM_REPR_ID_MVMString \ && IS_CONCRETE(key)) { \ HASH_ADD_KEYPTR_VM_STR(tc, hash_handle, hash, key, value); \ } \ else { \ MVM_exception_throw_adhoc(tc, "Hash keys must be concrete strings"); \ } \ } while (0); #define MVM_HASH_GET(tc, hash, key, value) \ do { \ if (!MVM_is_null(tc, (MVMObject *)key) && REPR(key)->ID == MVM_REPR_ID_MVMString \ && IS_CONCRETE(key)) { \ HASH_FIND_VM_STR(tc, hash_handle, hash, key, value); \ } \ else { \ MVM_exception_throw_adhoc(tc, "Hash keys must be concrete strings"); \ } \ } while (0); #define MVM_HASH_KEY(entry) ((MVMString *)(entry)->hash_handle.key) #define MVM_HASH_DESTROY(hash_handle, hashentry_type, head_node) do { \ hashentry_type *current, *tmp; \ unsigned bucket_tmp; \ HASH_ITER(hash_handle, head_node, current, tmp, bucket_tmp) { \ if (current != head_node) \ MVM_free(current); \ } \ tmp = head_node; \ HASH_CLEAR(hash_handle, head_node); \ MVM_free(tmp); \ } while (0) MoarVM-2018.03/src/6model/reprs/MVMIter.c0000644000175000017510000004316013242626641017754 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps MVMIter_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &MVMIter_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMIter); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "Cannot copy object with representation VMIter"); } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMIterBody *body = (MVMIterBody *)data; MVM_gc_worklist_add(tc, worklist, &body->target); } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } static void shift(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind) { MVMIterBody *body = (MVMIterBody *)data; MVMObject *target = body->target; switch (body->mode) { case MVM_ITER_MODE_ARRAY: body->array_state.index++; if (body->array_state.index >= body->array_state.limit) MVM_exception_throw_adhoc(tc, "Iteration past end of iterator"); REPR(target)->pos_funcs.at_pos(tc, STABLE(target), target, OBJECT_BODY(target), body->array_state.index, value, kind); return; case MVM_ITER_MODE_ARRAY_INT: body->array_state.index++; if (body->array_state.index >= body->array_state.limit) MVM_exception_throw_adhoc(tc, "Iteration past end of iterator"); if (kind == MVM_reg_int64) { REPR(target)->pos_funcs.at_pos(tc, STABLE(target), target, OBJECT_BODY(target), body->array_state.index, value, kind); } else if (kind == MVM_reg_obj) { MVMRegister tmp; REPR(target)->pos_funcs.at_pos(tc, STABLE(target), target, OBJECT_BODY(target), body->array_state.index, &tmp, MVM_reg_int64); value->o = MVM_repr_box_int(tc, MVM_hll_current(tc)->int_box_type, tmp.i64); } else { MVM_exception_throw_adhoc(tc, "Wrong register kind in iteration"); } return; case MVM_ITER_MODE_ARRAY_NUM: body->array_state.index++; if (body->array_state.index >= body->array_state.limit) MVM_exception_throw_adhoc(tc, "Iteration past end of iterator"); if (kind == MVM_reg_num64) { REPR(target)->pos_funcs.at_pos(tc, STABLE(target), target, OBJECT_BODY(target), body->array_state.index, value, kind); } else if (kind == MVM_reg_obj) { MVMRegister tmp; REPR(target)->pos_funcs.at_pos(tc, STABLE(target), target, OBJECT_BODY(target), body->array_state.index, &tmp, MVM_reg_num64); value->o = MVM_repr_box_num(tc, MVM_hll_current(tc)->num_box_type, tmp.n64); } else { MVM_exception_throw_adhoc(tc, "Wrong register kind in iteration"); } return; case MVM_ITER_MODE_ARRAY_STR: body->array_state.index++; if (body->array_state.index >= body->array_state.limit) MVM_exception_throw_adhoc(tc, "Iteration past end of iterator"); if (kind == MVM_reg_str) { REPR(target)->pos_funcs.at_pos(tc, STABLE(target), target, OBJECT_BODY(target), body->array_state.index, value, kind); } else if (kind == MVM_reg_obj) { MVMRegister tmp; REPR(target)->pos_funcs.at_pos(tc, STABLE(target), target, OBJECT_BODY(target), body->array_state.index, &tmp, MVM_reg_str); value->o = MVM_repr_box_str(tc, MVM_hll_current(tc)->str_box_type, tmp.s); } else { MVM_exception_throw_adhoc(tc, "Wrong register kind in iteration"); } return; case MVM_ITER_MODE_HASH: body->hash_state.curr = body->hash_state.next; if (!body->hash_state.curr) MVM_exception_throw_adhoc(tc, "Iteration past end of iterator"); body->hash_state.next = HASH_ITER_NEXT_ITEM( &(body->hash_state.next->hash_handle), &(body->hash_state.bucket_state)); value->o = root; return; default: MVM_exception_throw_adhoc(tc, "Unknown iteration mode"); } } /* This whole splice optimization can be optimized for the case we have two * MVMIter representation objects. */ static void isplice(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *from, MVMint64 offset, MVMuint64 count) { } static MVMStorageSpec get_elem_storage_spec(MVMThreadContext *tc, MVMSTable *st) { MVMStorageSpec spec; spec.inlineable = MVM_STORAGE_SPEC_REFERENCE; spec.boxed_primitive = MVM_STORAGE_SPEC_BP_NONE; spec.can_box = 0; spec.bits = 0; spec.align = 0; spec.is_unsigned = 0; return spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* XXX element type supplied through this... */ } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMIter); } /* Initializes the representation. */ const MVMREPROps * MVMIter_initialize(MVMThreadContext *tc) { return &MVMIter_this_repr; } static const MVMREPROps MVMIter_this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, { MVM_REPR_DEFAULT_AT_POS, MVM_REPR_DEFAULT_BIND_POS, MVM_REPR_DEFAULT_SET_ELEMS, MVM_REPR_DEFAULT_PUSH, MVM_REPR_DEFAULT_POP, MVM_REPR_DEFAULT_UNSHIFT, shift, isplice, MVM_REPR_DEFAULT_AT_POS_MULTIDIM, MVM_REPR_DEFAULT_BIND_POS_MULTIDIM, MVM_REPR_DEFAULT_DIMENSIONS, MVM_REPR_DEFAULT_SET_DIMENSIONS, get_elem_storage_spec, MVM_REPR_DEFAULT_POS_AS_ATOMIC, MVM_REPR_DEFAULT_POS_AS_ATOMIC_MULTIDIM }, /* pos_funcs */ MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "VMIter", /* name */ MVM_REPR_ID_MVMIter, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; MVMObject * MVM_iter(MVMThreadContext *tc, MVMObject *target) { MVMIter *iterator; if (!IS_CONCRETE(target)) { MVM_exception_throw_adhoc(tc, "Cannot iterate over a %s type object", MVM_6model_get_debug_name(tc, target)); } MVMROOT(tc, target, { if (REPR(target)->ID == MVM_REPR_ID_VMArray) { iterator = (MVMIter *)MVM_repr_alloc_init(tc, MVM_hll_current(tc)->array_iterator_type); iterator->body.array_state.index = -1; iterator->body.array_state.limit = REPR(target)->elems(tc, STABLE(target), target, OBJECT_BODY(target)); MVM_ASSIGN_REF(tc, &(iterator->common.header), iterator->body.target, target); switch (REPR(target)->pos_funcs.get_elem_storage_spec(tc, STABLE(target)).boxed_primitive) { case MVM_STORAGE_SPEC_BP_INT: iterator->body.mode = MVM_ITER_MODE_ARRAY_INT; break; case MVM_STORAGE_SPEC_BP_NUM: iterator->body.mode = MVM_ITER_MODE_ARRAY_NUM; break; case MVM_STORAGE_SPEC_BP_STR: iterator->body.mode = MVM_ITER_MODE_ARRAY_STR; break; default: iterator->body.mode = MVM_ITER_MODE_ARRAY; break; } } else if (REPR(target)->ID == MVM_REPR_ID_MVMHash) { iterator = (MVMIter *)MVM_repr_alloc_init(tc, MVM_hll_current(tc)->hash_iterator_type); iterator->body.mode = MVM_ITER_MODE_HASH; iterator->body.hash_state.bucket_state = 0; iterator->body.hash_state.curr = NULL; iterator->body.hash_state.next = HASH_ITER_FIRST_ITEM( ((MVMHash *)target)->body.hash_head ? ((MVMHash *)target)->body.hash_head->hash_handle.tbl : NULL, &(iterator->body.hash_state.bucket_state)); MVM_ASSIGN_REF(tc, &(iterator->common.header), iterator->body.target, target); } else if (REPR(target)->ID == MVM_REPR_ID_MVMContext) { /* Turn the context into a VMHash and then iterate that. */ MVMHLLConfig *hll = MVM_hll_current(tc); MVMObject *ctx_hash = MVM_repr_alloc_init(tc, hll->slurpy_hash_type); MVMROOT(tc, ctx_hash, { MVMContext *ctx = (MVMContext *)target; MVMFrame *frame = ctx->body.context; MVMStaticFrame *sf = frame->static_info; MVMLexicalRegistry **lexreg = sf->body.lexical_names_list; MVMuint32 i; MVMROOT2(tc, frame, sf, { for (i = 0; i < sf->body.num_lexicals; i++) { MVMuint32 idx = lexreg[i]->value; MVMuint16 type = sf->body.lexical_types[idx]; switch (type) { case MVM_reg_obj: { MVMObject *obj = frame->env[idx].o; if (!obj) obj = MVM_frame_vivify_lexical(tc, frame, idx); MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, obj); break; } case MVM_reg_str: { MVMObject *bs = MVM_repr_box_str(tc, hll->str_box_type, frame->env[idx].s); MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bs); break; } case MVM_reg_int8: { MVMObject *bi = MVM_repr_box_int(tc, hll->int_box_type, frame->env[idx].i8); MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bi); break; } case MVM_reg_uint8: { MVMObject *bi = MVM_repr_box_int(tc, hll->int_box_type, frame->env[idx].u8); MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bi); break; } case MVM_reg_int16: { MVMObject *bi = MVM_repr_box_int(tc, hll->int_box_type, frame->env[idx].i16); MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bi); break; } case MVM_reg_uint16: { MVMObject *bi = MVM_repr_box_int(tc, hll->int_box_type, frame->env[idx].u16); MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bi); break; } case MVM_reg_int32: { MVMObject *bi = MVM_repr_box_int(tc, hll->int_box_type, frame->env[idx].i32); MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bi); break; } case MVM_reg_uint32: { MVMObject *bi = MVM_repr_box_int(tc, hll->int_box_type, frame->env[idx].u32); MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bi); break; } case MVM_reg_int64: { MVMObject *bi = MVM_repr_box_int(tc, hll->int_box_type, frame->env[idx].i64); MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bi); break; } case MVM_reg_uint64: { MVMObject *bi = MVM_repr_box_int(tc, hll->int_box_type, frame->env[idx].u64); MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bi); break; } case MVM_reg_num32: { MVMObject *bn = MVM_repr_box_num(tc, hll->num_box_type, frame->env[idx].n32); MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bn); break; } case MVM_reg_num64: { MVMObject *bn = MVM_repr_box_num(tc, hll->num_box_type, frame->env[idx].n64); MVM_repr_bind_key_o(tc, ctx_hash, lexreg[i]->key, bn); break; } default: MVM_exception_throw_adhoc(tc, "%s lexical type encountered while building context iterator", MVM_reg_get_debug_name(tc, type)); } } }); }); /* Call ourselves recursively to get the iterator for this * hash. */ iterator = (MVMIter *)MVM_iter(tc, ctx_hash); } else { MVM_exception_throw_adhoc(tc, "Cannot iterate object with %s representation (%s)", REPR(target)->name, MVM_6model_get_debug_name(tc, target)); } }); return (MVMObject *)iterator; } MVMint64 MVM_iter_istrue(MVMThreadContext *tc, MVMIter *iter) { switch (iter->body.mode) { case MVM_ITER_MODE_ARRAY: case MVM_ITER_MODE_ARRAY_INT: case MVM_ITER_MODE_ARRAY_NUM: case MVM_ITER_MODE_ARRAY_STR: return iter->body.array_state.index + 1 < iter->body.array_state.limit ? 1 : 0; break; case MVM_ITER_MODE_HASH: return iter->body.hash_state.next != NULL ? 1 : 0; break; default: MVM_exception_throw_adhoc(tc, "Invalid iteration mode used"); } } MVMString * MVM_iterkey_s(MVMThreadContext *tc, MVMIter *iterator) { if (REPR(iterator)->ID != MVM_REPR_ID_MVMIter || iterator->body.mode != MVM_ITER_MODE_HASH) MVM_exception_throw_adhoc(tc, "This is not a hash iterator, it's a %s (%s)", REPR(iterator)->name, MVM_6model_get_debug_name(tc, (MVMObject *)iterator)); if (!iterator->body.hash_state.curr) MVM_exception_throw_adhoc(tc, "You have not advanced to the first item of the hash iterator, or have gone past the end"); return MVM_HASH_KEY(iterator->body.hash_state.curr); } MVMObject * MVM_iterval(MVMThreadContext *tc, MVMIter *iterator) { MVMIterBody *body; MVMObject *target; MVMRegister result; if (REPR(iterator)->ID != MVM_REPR_ID_MVMIter) MVM_exception_throw_adhoc(tc, "This is not an iterator, it's a %s (%s)", REPR(iterator)->name, MVM_6model_get_debug_name(tc, (MVMObject *)iterator)); if (iterator->body.mode == MVM_ITER_MODE_ARRAY) { body = &iterator->body; if (body->array_state.index == -1) MVM_exception_throw_adhoc(tc, "You have not yet advanced in the array iterator"); target = body->target; REPR(target)->pos_funcs.at_pos(tc, STABLE(target), target, OBJECT_BODY(target), body->array_state.index, &result, MVM_reg_obj); } else if (iterator->body.mode == MVM_ITER_MODE_HASH) { if (!iterator->body.hash_state.curr) MVM_exception_throw_adhoc(tc, "You have not advanced to the first item of the hash iterator, or have gone past the end"); result.o = iterator->body.hash_state.curr->value; if (!result.o) result.o = tc->instance->VMNull; } else { MVM_exception_throw_adhoc(tc, "Unknown iterator mode in iterval"); } return result.o; } MoarVM-2018.03/src/6model/reprs/MVMIter.h0000644000175000017510000000207513237701240017752 0ustar samanthasamantha/* Representation used by VM-level iterators. */ #define MVM_ITER_MODE_ARRAY 0 #define MVM_ITER_MODE_ARRAY_INT 1 #define MVM_ITER_MODE_ARRAY_NUM 2 #define MVM_ITER_MODE_ARRAY_STR 3 #define MVM_ITER_MODE_HASH 4 struct MVMIterBody { /* whether hash or array */ MVMuint32 mode; /* array or hash being iterated */ MVMObject *target; /* next hash item to give or next array index */ union { struct { MVMHashEntry *curr, *next; unsigned bucket_state; } hash_state; struct { MVMint64 index; MVMint64 limit; } array_state; }; }; struct MVMIter { MVMObject common; MVMIterBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMIter_initialize(MVMThreadContext *tc); MVMObject * MVM_iter(MVMThreadContext *tc, MVMObject *target); MVMint64 MVM_iter_istrue(MVMThreadContext *tc, MVMIter *iter); MVMString * MVM_iterkey_s(MVMThreadContext *tc, MVMIter *iterator); MVMObject * MVM_iterval(MVMThreadContext *tc, MVMIter *iterator); MoarVM-2018.03/src/6model/reprs/MVMMultiCache.c0000644000175000017510000005361013243116442021062 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps MVMMultiCache_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &MVMMultiCache_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMMultiCache); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "Cannot copy object with representation MultiCache"); } /* Called by the VM to mark any GCable items. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMMultiCacheBody *mc = (MVMMultiCacheBody *)data; size_t i; for (i = 0; i < mc->num_results; i++) MVM_gc_worklist_add(tc, worklist, &(mc->results[i])); } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMMultiCache *mc = (MVMMultiCache *)obj; if (mc->body.node_hash_head) MVM_fixed_size_free(tc, tc->instance->fsa, mc->body.cache_memory_size, mc->body.node_hash_head); if (mc->body.results) MVM_fixed_size_free(tc, tc->instance->fsa, mc->body.num_results * sizeof(MVMObject *), mc->body.results); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Calculates the non-GC-managed memory we hold on to. */ static MVMuint64 unmanaged_size(MVMThreadContext *tc, MVMSTable *st, void *data) { MVMMultiCacheBody *body = (MVMMultiCacheBody *)data; return body->num_results * sizeof(MVMObject *) + body->cache_memory_size; } /* Initializes the representation. */ const MVMREPROps * MVMMultiCache_initialize(MVMThreadContext *tc) { return &MVMMultiCache_this_repr; } static const MVMREPROps MVMMultiCache_this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ NULL, /* deserialize_stable_size */ gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "MVMMultiCache", /* name */ MVM_REPR_ID_MVMMultiCache, unmanaged_size, /* unmanaged_size */ NULL, /* describe_refs */ }; /* Filters for various parts of action.arg_match. */ #define MVM_MULTICACHE_ARG_IDX_FILTER (2 * MVM_INTERN_ARITY_LIMIT - 1) #define MVM_MULTICACHE_ARG_CONC_FILTER 0x10 #define MVM_MULTICACHE_ARG_RW_FILTER 0x20 #define MVM_MULTICACHE_TYPE_ID_FILTER (0xFFFFFFFFFFFFFFFFULL ^ (MVM_TYPE_CACHE_ID_INCR - 1)) /* Debug support dumps the tree after each addition. */ #define MVM_MULTICACHE_DEBUG 0 #if MVM_MULTICACHE_DEBUG static void dump_cache(MVMThreadContext *tc, MVMMultiCacheBody *cache) { MVMint32 num_nodes = cache->cache_memory_size / sizeof(MVMMultiCacheNode); MVMint32 i; printf("Multi cache at %p (%d nodes, %d results)\n", cache, num_nodes, cache->num_results); for (i = 0; i < num_nodes; i++) printf(" - %p -> (Y: %d, N: %d)\n", cache->node_hash_head[i].action.cs, cache->node_hash_head[i].match, cache->node_hash_head[i].no_match); printf("\n"); } #endif /* Big cache profiling. */ #define MVM_MULTICACHE_BIG_PROFILE 0 #if MVM_MULTICACHE_BIG_PROFILE static MVMint32 is_power_of_2(MVMint32 value) { return ((value != 0) && !(value & (value - 1))); } #endif /* Takes a pointer to a callsite and turns it into an index into the multi cache * keyed by callsite. We don't do anything too clever here: just shift away the * bits of the pointer we know will be zero, and the take the least significant * few bits of it. Hopefully the distribution of memory addresses over time will * be sufficient. */ MVM_STATIC_INLINE size_t hash_callsite(MVMThreadContext *tc, MVMCallsite *cs) { return ((size_t)cs >> 3) & MVM_MULTICACHE_HASH_FILTER; } /* Adds an entry to the multi-dispatch cache. */ MVMObject * MVM_multi_cache_add(MVMThreadContext *tc, MVMObject *cache_obj, MVMObject *capture, MVMObject *result) { MVMMultiCacheBody *cache; MVMCallsite *cs; MVMArgProcContext *apc; MVMuint64 match_flags[2 * MVM_INTERN_ARITY_LIMIT]; size_t match_arg_idx[MVM_INTERN_ARITY_LIMIT]; MVMuint32 flag, i, num_obj_args, have_head, have_tree, have_callsite, matched_args, unmatched_arg, tweak_node, insert_node; size_t new_size; MVMMultiCacheNode *new_head; MVMObject **new_results; /* Allocate a cache if needed. */ if (MVM_is_null(tc, cache_obj) || !IS_CONCRETE(cache_obj) || REPR(cache_obj)->ID != MVM_REPR_ID_MVMMultiCache) { MVMROOT2(tc, capture, result, { cache_obj = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTMultiCache); }); } cache = &((MVMMultiCache *)cache_obj)->body; /* Ensure we got a capture in to cache on; bail if not interned. */ if (REPR(capture)->ID == MVM_REPR_ID_MVMCallCapture) { apc = ((MVMCallCapture *)capture)->body.apc; cs = apc->callsite; if (!cs->is_interned) return cache_obj; } else { MVM_exception_throw_adhoc(tc, "Multi cache addition requires an MVMCallCapture"); } /* Calculate matcher flags for all the object arguments. */ num_obj_args = 0; for (i = 0, flag = 0; flag < cs->flag_count; i++, flag++) { if (cs->arg_flags[flag] & MVM_CALLSITE_ARG_NAMED) i++; if ((cs->arg_flags[flag] & MVM_CALLSITE_ARG_MASK) == MVM_CALLSITE_ARG_OBJ) { MVMRegister arg = apc->args[i]; MVMSTable *st = STABLE(arg.o); MVMuint32 is_rw = 0; if (st->container_spec && IS_CONCRETE(arg.o)) { MVMContainerSpec const *contspec = st->container_spec; if (!contspec->fetch_never_invokes) return cache_obj; /* Impossible to cache. */ if (REPR(arg.o)->ID != MVM_REPR_ID_NativeRef) { is_rw = contspec->can_store(tc, arg.o); contspec->fetch(tc, arg.o, &arg); } else { is_rw = 1; } } match_flags[i] = STABLE(arg.o)->type_cache_id | (is_rw ? MVM_MULTICACHE_ARG_RW_FILTER : 0) | (IS_CONCRETE(arg.o) ? MVM_MULTICACHE_ARG_CONC_FILTER : 0); match_arg_idx[num_obj_args] = i; num_obj_args++; } } /* Oobtain the cache addition lock, and then do another lookup to ensure * nobody beat us to making this entry. */ uv_mutex_lock(&(tc->instance->mutex_multi_cache_add)); if (MVM_multi_cache_find(tc, cache_obj, capture)) goto DONE; /* We're now udner the insertion lock and know nobody else can tweak the * cache. First, see if there's even a current version and search tree. */ have_head = 0; have_tree = 0; have_callsite = 0; matched_args = 0; unmatched_arg = 0; tweak_node = hash_callsite(tc, cs); if (cache->node_hash_head) { MVMMultiCacheNode *tree = cache->node_hash_head; MVMint32 cur_node = tweak_node; have_head = 1; if (tree[cur_node].action.cs) have_tree = 1; /* Now see if we already have this callsite. */ do { if (tree[cur_node].action.cs == cs) { have_callsite = 1; cur_node = tree[cur_node].match; break; } tweak_node = cur_node; cur_node = tree[cur_node].no_match; } while (cur_node > 0); /* Chase until we reach an arg we don't match. */ while (cur_node > 0) { MVMuint64 arg_match = tree[cur_node].action.arg_match; MVMuint64 arg_idx = arg_match & MVM_MULTICACHE_ARG_IDX_FILTER; tweak_node = cur_node; if ((match_flags[arg_idx] | arg_idx) == arg_match) { matched_args++; unmatched_arg = 0; cur_node = tree[cur_node].match; } else { unmatched_arg = 1; cur_node = tree[cur_node].no_match; } } /* If we found a candidate, something inconsistent, as we * checked for non-entry above. */ if (cur_node != 0) MVM_panic(1, "Corrupt multi dispatch cache: cur_node == 0"); } /* Now calculate the new size we'll need to allocate. */ new_size = cache->cache_memory_size; if (!have_head) new_size += MVM_MULTICACHE_HASH_SIZE * sizeof(MVMMultiCacheNode); else if (!have_callsite) new_size += sizeof(MVMMultiCacheNode); new_size += (num_obj_args - matched_args) * sizeof(MVMMultiCacheNode); /* Allocate and copy existing cache. */ new_head = MVM_fixed_size_alloc(tc, tc->instance->fsa, new_size); memcpy(new_head, cache->node_hash_head, cache->cache_memory_size); /* If we had no head, set it up. */ if (!have_head) memset(new_head, 0, MVM_MULTICACHE_HASH_SIZE * sizeof(MVMMultiCacheNode)); /* Calculate storage location of new nodes. */ insert_node = have_head ? cache->cache_memory_size / sizeof(MVMMultiCacheNode) : MVM_MULTICACHE_HASH_SIZE; /* If we had no callsite, add a node for it. */ if (!have_callsite) { if (!have_tree) { /* We'll put it in the tree root. */ new_head[tweak_node].action.cs = cs; } else { /* We'll insert a new node and chain it from the tweak node. */ new_head[insert_node].action.cs = cs; new_head[insert_node].no_match = 0; new_head[tweak_node].no_match = insert_node; tweak_node = insert_node; insert_node++; } } /* Now insert any needed arg matchers. */ for (i = matched_args; i < num_obj_args; i++) { MVMuint32 arg_idx = match_arg_idx[i]; new_head[insert_node].action.arg_match = match_flags[arg_idx] | arg_idx; new_head[insert_node].no_match = 0; if (unmatched_arg) { new_head[tweak_node].no_match = insert_node; unmatched_arg = 0; } else { new_head[tweak_node].match = insert_node; } tweak_node = insert_node; insert_node++; } /* Make a copy of the results, or allocate new (first result is NULL * always) and insert the new result. Schedule old results for freeing. */ if (cache->num_results) { new_results = MVM_fixed_size_alloc(tc, tc->instance->fsa, (cache->num_results + 1) * sizeof(MVMObject *)); memcpy(new_results, cache->results, cache->num_results * sizeof(MVMObject *)); MVM_ASSIGN_REF(tc, &(cache_obj->header), new_results[cache->num_results], result); MVM_fixed_size_free_at_safepoint(tc, tc->instance->fsa, cache->num_results * sizeof(MVMObject *), cache->results); cache->results = new_results; cache->num_results++; } else { new_results = MVM_fixed_size_alloc(tc, tc->instance->fsa, 2 * sizeof(MVMObject *)); new_results[0] = NULL; /* Sentinel */ MVM_ASSIGN_REF(tc, &(cache_obj->header), new_results[1], result); cache->results = new_results; cache->num_results = 2; } MVM_barrier(); /* Associate final node with result index. */ new_head[tweak_node].match = -(cache->num_results - 1); /* Update the rest. */ if (cache->node_hash_head) MVM_fixed_size_free_at_safepoint(tc, tc->instance->fsa, cache->cache_memory_size, cache->node_hash_head); cache->node_hash_head = new_head; cache->cache_memory_size = new_size; #if MVM_MULTICACHE_DEBUG printf("Made new entry for callsite with %d object arguments\n", num_obj_args); dump_cache(tc, cache); #endif #if MVM_MULTICACHE_BIG_PROFILE if (cache->num_results >= 32 && is_power_of_2(cache->num_results)) { MVMCode *code = (MVMCode *)MVM_frame_find_invokee(tc, result, NULL); char *name = MVM_string_utf8_encode_C_string(tc, code->body.sf->body.name); printf("Multi cache for %s reached %d entries\n", name, cache->num_results); MVM_free(name); } #endif /* Release lock. */ DONE: uv_mutex_unlock(&(tc->instance->mutex_multi_cache_add)); /* Hand back the created/updated cache. */ return cache_obj; } /* Does a lookup in a multi-dispatch cache using a capture. */ MVMObject * MVM_multi_cache_find(MVMThreadContext *tc, MVMObject *cache_obj, MVMObject *capture) { if (REPR(capture)->ID == MVM_REPR_ID_MVMCallCapture) { MVMArgProcContext *apc = ((MVMCallCapture *)capture)->body.apc; MVMCallsite *cs = apc->callsite; return MVM_multi_cache_find_callsite_args(tc, cache_obj, cs, apc->args); } else { MVM_exception_throw_adhoc(tc, "Multi cache lookup requires an MVMCallCapture"); } } /* Does a lookup in the multi-dispatch cache using a callsite and args. */ MVMObject * MVM_multi_cache_find_callsite_args(MVMThreadContext *tc, MVMObject *cache_obj, MVMCallsite *cs, MVMRegister *args) { MVMMultiCacheBody *cache; MVMMultiCacheNode *tree; MVMint32 cur_node; /* Bail if callsite not interned. */ if (!cs->is_interned) return NULL; /* If no cache, no result. */ if (MVM_is_null(tc, cache_obj) || !IS_CONCRETE(cache_obj) || REPR(cache_obj)->ID != MVM_REPR_ID_MVMMultiCache) return NULL; cache = &((MVMMultiCache *)cache_obj)->body; if (!cache->node_hash_head) return NULL; /* Use hashed callsite to find the node to start with. */ cur_node = hash_callsite(tc, cs); /* Walk tree until we match callsite. */ tree = cache->node_hash_head; do { if (tree[cur_node].action.cs == cs) { cur_node = tree[cur_node].match; break; } cur_node = tree[cur_node].no_match; } while (cur_node > 0); /* Now walk until we match argument type/concreteness/rw. */ while (cur_node > 0) { MVMuint64 arg_match = tree[cur_node].action.arg_match; MVMuint64 arg_idx = arg_match & MVM_MULTICACHE_ARG_IDX_FILTER; MVMuint64 type_id = arg_match & MVM_MULTICACHE_TYPE_ID_FILTER; MVMRegister arg = args[arg_idx]; MVMSTable *st = STABLE(arg.o); MVMuint64 is_rw = 0; if (st->container_spec && IS_CONCRETE(arg.o)) { MVMContainerSpec const *contspec = st->container_spec; if (!contspec->fetch_never_invokes) return NULL; if (REPR(arg.o)->ID != MVM_REPR_ID_NativeRef) { is_rw = contspec->can_store(tc, arg.o); contspec->fetch(tc, arg.o, &arg); } else { is_rw = 1; } } if (STABLE(arg.o)->type_cache_id == type_id) { MVMuint32 need_concrete = (arg_match & MVM_MULTICACHE_ARG_CONC_FILTER) ? 1 : 0; if (IS_CONCRETE(arg.o) == need_concrete) { MVMuint32 need_rw = (arg_match & MVM_MULTICACHE_ARG_RW_FILTER) ? 1 : 0; if (need_rw == is_rw) { cur_node = tree[cur_node].match; continue; } } } cur_node = tree[cur_node].no_match; } /* Negate result and index into results (the first result is always NULL * to save flow control around "no match"). */ return cache->results[-cur_node]; } /* Do a multi cache lookup based upon spesh arg facts. */ MVMObject * MVM_multi_cache_find_spesh(MVMThreadContext *tc, MVMObject *cache_obj, MVMSpeshCallInfo *arg_info, MVMSpeshStatsType *type_tuple) { MVMMultiCacheBody *cache; MVMMultiCacheNode *tree; MVMint32 cur_node; /* Bail if callsite not interned. */ if (!arg_info->cs->is_interned) return NULL; /* If no cache, no result. */ if (MVM_is_null(tc, cache_obj) || !IS_CONCRETE(cache_obj) || REPR(cache_obj)->ID != MVM_REPR_ID_MVMMultiCache) return NULL; cache = &((MVMMultiCache *)cache_obj)->body; if (!cache->node_hash_head) return NULL; /* Use hashed callsite to find the node to start with. */ cur_node = hash_callsite(tc, arg_info->cs); /* Walk tree until we match callsite. */ tree = cache->node_hash_head; do { if (tree[cur_node].action.cs == arg_info->cs) { cur_node = tree[cur_node].match; break; } cur_node = tree[cur_node].no_match; } while (cur_node > 0); /* Now walk until we match argument type/concreteness/rw. */ while (cur_node > 0) { MVMuint64 arg_match = tree[cur_node].action.arg_match; MVMuint64 arg_idx = arg_match & MVM_MULTICACHE_ARG_IDX_FILTER; MVMuint64 type_id = arg_match & MVM_MULTICACHE_TYPE_ID_FILTER; MVMSpeshFacts *facts = arg_idx < MAX_ARGS_FOR_OPT ? arg_info->arg_facts[arg_idx] : NULL; if (type_tuple) { MVMuint64 tt_offset = arg_idx >= arg_info->cs->num_pos ? (arg_idx - arg_info->cs->num_pos) / 2 : arg_idx; MVMuint32 is_rw = type_tuple[tt_offset].rw_cont; MVMSTable *known_type_st; MVMuint32 is_conc; if (type_tuple[tt_offset].decont_type) { known_type_st = type_tuple[tt_offset].decont_type->st; is_conc = type_tuple[tt_offset].decont_type_concrete; } else if (type_tuple[tt_offset].type) { /* FIXME: tuples with neither decont_type nor type shouldn't appear */ known_type_st = type_tuple[tt_offset].type->st; is_conc = type_tuple[tt_offset].type_concrete; } /* Now check if what we have matches what we need. */ if (known_type_st && known_type_st->type_cache_id == type_id) { MVMuint32 need_concrete = (arg_match & MVM_MULTICACHE_ARG_CONC_FILTER) ? 1 : 0; if (is_conc == need_concrete) { MVMuint32 need_rw = (arg_match & MVM_MULTICACHE_ARG_RW_FILTER) ? 1 : 0; if (need_rw == is_rw) { cur_node = tree[cur_node].match; continue; } } } cur_node = tree[cur_node].no_match; } else if (facts) { /* Figure out type, concreteness, and rw-ness from facts. */ MVMSTable *known_type_st; MVMuint32 is_conc; MVMuint32 is_rw; /* Must know type. */ if (!(facts->flags & MVM_SPESH_FACT_KNOWN_TYPE)) return NULL; /* Must know if it's concrete or not. */ if (!(facts->flags & (MVM_SPESH_FACT_CONCRETE | MVM_SPESH_FACT_TYPEOBJ))) return NULL; /* If it's a container, must know what's inside it. Otherwise, * we're already good on type info. */ if ((facts->flags & MVM_SPESH_FACT_CONCRETE) && STABLE(facts->type)->container_spec) { /* Again, need to know type and concreteness. */ if (!(facts->flags & MVM_SPESH_FACT_KNOWN_DECONT_TYPE)) return NULL; if (!(facts->flags & (MVM_SPESH_FACT_DECONT_CONCRETE | MVM_SPESH_FACT_DECONT_TYPEOBJ))) return NULL; known_type_st = STABLE(facts->decont_type); is_conc = (facts->flags & MVM_SPESH_FACT_DECONT_CONCRETE) ? 1 : 0; is_rw = (facts->flags & MVM_SPESH_FACT_RW_CONT) ? 1 : 0; } else { known_type_st = STABLE(facts->type); is_conc = (facts->flags & MVM_SPESH_FACT_CONCRETE) ? 1 : 0; is_rw = is_conc && REPR(facts->type)->ID == MVM_REPR_ID_NativeRef; } /* Now check if what we have matches what we need. */ if (known_type_st->type_cache_id == type_id) { MVMuint32 need_concrete = (arg_match & MVM_MULTICACHE_ARG_CONC_FILTER) ? 1 : 0; if (is_conc == need_concrete) { MVMuint32 need_rw = (arg_match & MVM_MULTICACHE_ARG_RW_FILTER) ? 1 : 0; if (need_rw == is_rw) { cur_node = tree[cur_node].match; continue; } } } cur_node = tree[cur_node].no_match; } else { /* No facts about this argument available from analysis, so * can't resolve the dispatch. */ return NULL; } } /* Negate result and index into results (the first result is always NULL * to save flow control around "no match"). */ return cache->results[-cur_node]; } MoarVM-2018.03/src/6model/reprs/MVMMultiCache.h0000644000175000017510000000731613237701240021070 0ustar samanthasamantha/* The multi-dispatch cache is a set of trees keyed on the address of * an interned callsite. The tree is represented as an array of triples, * each having the form (action, match, no-match). The match and no-match * are either: * * Positive, and an index into the array for what to check next * * Zero, meaning we failed to find a match * * Negative, meaning we found a match, and should negate the index * to get a the resulting candidate * * The first MVM_MULTICACHE_HASH_SIZE entries in the array are tree roots. * They are all set to have a NULL callsite matcher when there's no tree * there, implying an immediate match failure. * * The matcher starts in callsite match mode, meaning that the matcher is * the memory address of a callsite. This naturally handles hash collisions. * * Once we have a matching callsite, it flips into argument matching mode. * The lowermost bits of the action represent the index into the arguments * buffer for the argument we need to test. The next bit is for concrete or * not. The bit after it is rw or not. The remaining bits correspond to the * STable's type cache ID. * * The construction of the tree is such that we only have to test the first * argument until we get a match, then the second, etc. This means that common * prefixes are factored out, keeping the tree smaller. The use of a single * block of memory is also aimed at getting good CPU cache hit rates. * * The tree array is immutable, and so can safely be read by many threads, and * kept in thier CPU caches. Upon a new entry, the cache will be copied, and the * tweaks made. The cache head pointer will then be set to the new cache, and the * old cache memory scheduled for freeeing at the next safepoint. */ /* A node in the cache. */ struct MVMMultiCacheNode { union { MVMCallsite *cs; MVMuint64 arg_match; } action; MVMint32 match; MVMint32 no_match; }; /* Body of a multi-dispatch cache. */ struct MVMMultiCacheBody { /* Pointer to the an array of nodes, which we can initially index * into using a hahsed calsite. Replaced in whole whenever there is * a change. */ MVMMultiCacheNode *node_hash_head; /* Array of results we may return from the cache. Note that this is * replaced entirely whenever we update the cache. It is append only, * and so will be valid for older versions of the cache too. We must * replace this and do a memory barrier before replacing node_hash_head * with its new version on update. Conversely, readers must read the * node_hash_head and *then* read results here, so it will always have * been udpated in time. */ MVMObject **results; /* The number of results, so we can GC mark and free. */ size_t num_results; /* The amount of memory the cache uses. Used for freeing with the fixed * size allocator. */ size_t cache_memory_size; }; /* Hash table size. Must be a power of 2. */ #define MVM_MULTICACHE_HASH_SIZE 8 #define MVM_MULTICACHE_HASH_FILTER (MVM_MULTICACHE_HASH_SIZE - 1) struct MVMMultiCache { MVMObject common; MVMMultiCacheBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMMultiCache_initialize(MVMThreadContext *tc); /* Functions relating to multi-dispatch cache usage. */ MVMObject * MVM_multi_cache_add(MVMThreadContext *tc, MVMObject *cache, MVMObject *capture, MVMObject *result); MVMObject * MVM_multi_cache_find(MVMThreadContext *tc, MVMObject *cache, MVMObject *capture); MVMObject * MVM_multi_cache_find_callsite_args(MVMThreadContext *tc, MVMObject *cache, MVMCallsite *cs, MVMRegister *args); MVMObject * MVM_multi_cache_find_spesh(MVMThreadContext *tc, MVMObject *cache, MVMSpeshCallInfo *arg_info, MVMSpeshStatsType *type_tuple); MoarVM-2018.03/src/6model/reprs/MVMNull.c0000644000175000017510000000531413237701240017753 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps MVMNull_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &MVMNull_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMNull); }); return st->WHAT; } /* Creates a new instance based on the type object. */ static MVMObject * allocate(MVMThreadContext *tc, MVMSTable *st) { MVM_exception_throw_adhoc(tc, "Cannot create an instance of null type"); } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "Cannot clone null type"); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { MVM_exception_throw_adhoc(tc, "Cannot compose null type"); } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMNull); } /* Initializes the representation. */ const MVMREPROps * MVMNull_initialize(MVMThreadContext *tc) { return &MVMNull_this_repr; } static const MVMREPROps MVMNull_this_repr = { type_object_for, allocate, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, NULL, /* gc_mark */ NULL, /* gc_free */ NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "Null", /* name */ MVM_REPR_ID_MVMNull, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; MoarVM-2018.03/src/6model/reprs/MVMNull.h0000644000175000017510000000053313237701240017756 0ustar samanthasamantha/* Representation used by the null REPR. */ struct MVMNull { MVMObject common; }; /* Function for REPR setup. */ const MVMREPROps * MVMNull_initialize(MVMThreadContext *tc); /* Macro for VM null checks. */ MVM_STATIC_INLINE MVMint64 MVM_is_null(MVMThreadContext *tc, MVMObject *check) { return !check || check == tc->instance->VMNull; } MoarVM-2018.03/src/6model/reprs/MVMOSHandle.c0000644000175000017510000000737313237701240020505 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps MVMOSHandle_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &MVMOSHandle_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMOSHandle); }); return st->WHAT; } /* Initializes the handle with the mutex all handles need. */ static void initialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMOSHandleBody *handle = (MVMOSHandleBody *)data; handle->mutex = MVM_malloc(sizeof(uv_mutex_t)); uv_mutex_init(handle->mutex); } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { /* can't be copied because then we could never know when gc_free should * close the handle (unless we did some refcounting on a shared container). * note - 12:25 I mean, Perl 6 will has an attribute which * is the MoarVM handle, so a .clone() on a Perl 6 IO object * won't trigger cloning of the underlying handle. */ MVM_exception_throw_adhoc(tc, "Cannot copy object with repr OSHandle"); } /* Called by the VM to mark any GCable items. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMOSHandleBody *handle = (MVMOSHandleBody *)data; if (handle->ops && handle->ops->gc_mark) handle->ops->gc_mark(tc, handle->data, worklist); } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMOSHandle *handle = (MVMOSHandle *)obj; if (handle->body.ops && handle->body.ops->gc_free) { handle->body.ops->gc_free(tc, obj, handle->body.data); handle->body.data = NULL; } if (handle->body.mutex) { uv_mutex_destroy(handle->body.mutex); MVM_free(handle->body.mutex); } } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Initializes the representation. */ const MVMREPROps * MVMOSHandle_initialize(MVMThreadContext *tc) { return &MVMOSHandle_this_repr; } static const MVMREPROps MVMOSHandle_this_repr = { type_object_for, MVM_gc_allocate_object, initialize, copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ NULL, /* deserialize_stable_size */ gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "MVMOSHandle", /* name */ MVM_REPR_ID_MVMOSHandle, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; MoarVM-2018.03/src/6model/reprs/MVMOSHandle.h0000644000175000017510000000106313237701240020500 0ustar samanthasamantha/* Representation used by VM-level OS handles. */ struct MVMOSHandleBody { /* The function table for this handle, determining how it will process * various kinds of I/O related operations. */ const MVMIOOps *ops; /* Any data a particular set of I/O functions wishes to store. */ void *data; /* Mutex protecting access to this I/O handle. */ uv_mutex_t *mutex; }; struct MVMOSHandle { MVMObject common; MVMOSHandleBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMOSHandle_initialize(MVMThreadContext *tc); MoarVM-2018.03/src/6model/reprs/MVMSpeshLog.c0000644000175000017510000001114413243116442020564 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps SpeshLog_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &SpeshLog_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMSpeshLog); }); return st->WHAT; } /* Initializes the log. */ static void initialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMSpeshLogBody *log = (MVMSpeshLogBody *)data; log->entries = MVM_malloc(sizeof(MVMSpeshLogEntry) * MVM_SPESH_LOG_DEFAULT_ENTRIES); log->limit = MVM_SPESH_LOG_DEFAULT_ENTRIES; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "Cannot copy object with representation SpeshLog"); } /* Called by the VM to mark any GCable items. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMSpeshLogBody *log = (MVMSpeshLogBody *)data; MVMuint32 i; MVM_gc_worklist_add(tc, worklist, &(log->thread)); for (i = 0; i < log->used; i++) { switch (log->entries[i].kind) { case MVM_SPESH_LOG_ENTRY: MVM_gc_worklist_add(tc, worklist, &(log->entries[i].entry.sf)); break; case MVM_SPESH_LOG_PARAMETER: case MVM_SPESH_LOG_PARAMETER_DECONT: MVM_gc_worklist_add(tc, worklist, &(log->entries[i].param.type)); break; case MVM_SPESH_LOG_TYPE: case MVM_SPESH_LOG_RETURN: MVM_gc_worklist_add(tc, worklist, &(log->entries[i].type.type)); break; case MVM_SPESH_LOG_STATIC: MVM_gc_worklist_add(tc, worklist, &(log->entries[i].value.value)); break; case MVM_SPESH_LOG_INVOKE: MVM_gc_worklist_add(tc, worklist, &(log->entries[i].invoke.sf)); break; } } } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMSpeshLog *log = (MVMSpeshLog *)obj; MVM_free(log->body.entries); if (log->body.block_condvar) { uv_cond_destroy(log->body.block_condvar); MVM_free(log->body.block_condvar); } if (log->body.block_mutex) { uv_mutex_destroy(log->body.block_mutex); MVM_free(log->body.block_mutex); } } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMSpeshLog); } static MVMuint64 unmanaged_size(MVMThreadContext *tc, MVMSTable *st, void *data) { MVMSpeshLogBody *log = (MVMSpeshLogBody *)data; return log->limit * sizeof(MVMSpeshLogEntry); } /* Initializes the representation. */ const MVMREPROps * MVMSpeshLog_initialize(MVMThreadContext *tc) { return &SpeshLog_this_repr; } static const MVMREPROps SpeshLog_this_repr = { type_object_for, MVM_gc_allocate_object, initialize, copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "MVMSpeshLog", /* name */ MVM_REPR_ID_MVMSpeshLog, unmanaged_size, NULL, /* describe_refs */ }; MoarVM-2018.03/src/6model/reprs/MVMSpeshLog.h0000644000175000017510000000604313237701240020572 0ustar samanthasamantha/* Representation used for holding data logged by the interpreter for the * purpose of producing specializations. */ /* The kind of log entry we have. */ typedef enum { /* Entry to a callframe. */ MVM_SPESH_LOG_ENTRY, /* Parameter type information. */ MVM_SPESH_LOG_PARAMETER, /* Parameter type if we were to decontainerize the parameter. Recorded * when the parameter is a container type. */ MVM_SPESH_LOG_PARAMETER_DECONT, /* Decont, attribute lookup, or lexical lookup type information. */ MVM_SPESH_LOG_TYPE, /* Static lexical lookup (bytecode says we can cache the result). */ MVM_SPESH_LOG_STATIC, /* Invoked static frame, and whether we are its outer. */ MVM_SPESH_LOG_INVOKE, /* OSR point. */ MVM_SPESH_LOG_OSR, /* Return from a callframe, possibly with a logged type. */ MVM_SPESH_LOG_RETURN } MVMSpeshLogEntryKind; /* Flags on types. */ #define MVM_SPESH_LOG_TYPE_FLAG_CONCRETE 1 #define MVM_SPESH_LOG_TYPE_FLAG_RW_CONT 2 /* An entry in the spesh log. */ struct MVMSpeshLogEntry { /* The kind of log entry it is; discriminator for the union. */ MVMint32 kind; /* Call frame correlation ID. */ MVMint32 id; union { /* Entry to a call frame (ENTRY). */ struct { MVMStaticFrame *sf; MVMCallsite *cs; } entry; /* Observed parameter type (PARAMETER, PARAMETER_DECONT). */ struct { MVMObject *type; MVMint32 flags; MVMuint16 arg_idx; } param; /* Observed type (TYPE, RETURN). */ struct { MVMObject *type; MVMint32 flags; MVMint32 bytecode_offset; } type; /* Observed value (STATIC). */ struct { MVMObject *value; MVMint32 bytecode_offset; } value; /* Observed invocation (INVOKE). */ struct { MVMStaticFrame *sf; MVMint16 caller_is_outer; MVMuint16 was_multi; MVMint32 bytecode_offset; } invoke; /* Observed OSR point (OSR). */ struct { MVMint32 bytecode_offset; } osr; }; }; /* The spesh log representation itself. */ struct MVMSpeshLogBody { /* The sending thread. */ MVMThread *thread; /* Array of log entries. */ MVMSpeshLogEntry *entries; /* Number of log entries so far and limit. */ MVMuint32 used; MVMuint32 limit; /* If this was created due to a new compilation unit (heuristic to do * better at outer-loop OSR); we go over-quota for those, and this is * to help us restore it again. */ MVMuint8 was_compunit_bumped; /* When in debug mode, mutex and condition variable used to block the * thread sending a log until the spesh worker has processed it. */ uv_mutex_t *block_mutex; uv_cond_t *block_condvar; AO_t completed; }; struct MVMSpeshLog { MVMObject common; MVMSpeshLogBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMSpeshLog_initialize(MVMThreadContext *tc); MoarVM-2018.03/src/6model/reprs/MVMStaticFrame.c0000644000175000017510000003004413237701240021241 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps MVMStaticFrame_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. Also sets the invocation protocol handler in the STable. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &MVMStaticFrame_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMStaticFrame); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMStaticFrameBody *src_body = (MVMStaticFrameBody *)src; MVMStaticFrameBody *dest_body = (MVMStaticFrameBody *)dest; if (!src_body->fully_deserialized) MVM_exception_throw_adhoc(tc, "Can only clone a fully deserialized MVMFrame"); dest_body->orig_bytecode = src_body->orig_bytecode; dest_body->bytecode_size = src_body->bytecode_size; if (src_body->bytecode == src_body->orig_bytecode) { /* Easy - the source MVMStaticFrameBody doesn't own the memory. */ dest_body->bytecode = src_body->bytecode; } else { /* We're going to need to make a copy, in case the source object gets GC'd before we do, and so they free memory we point to. */ /* If this gets to be a resource hog, then implement something more sophisticated. The easiest thing would be to bump the allocated size and value stored in bytecode by sizeof(MVMuint64), and use the extra space to store a reference count. */ dest_body->bytecode = MVM_malloc(src_body->bytecode_size); memcpy(dest_body->bytecode, src_body->bytecode, src_body->bytecode_size); } MVM_ASSIGN_REF(tc, &(dest_root->header), dest_body->cu, src_body->cu); MVM_ASSIGN_REF(tc, &(dest_root->header), dest_body->cuuid, src_body->cuuid); MVM_ASSIGN_REF(tc, &(dest_root->header), dest_body->name, src_body->name); MVM_ASSIGN_REF(tc, &(dest_root->header), dest_body->static_code, src_body->static_code); dest_body->num_locals = src_body->num_locals; dest_body->num_lexicals = src_body->num_lexicals; { MVMuint16 *local_types = MVM_malloc(sizeof(MVMuint16) * src_body->num_locals); MVMuint16 *lexical_types = MVM_malloc(sizeof(MVMuint16) * src_body->num_lexicals); memcpy(local_types, src_body->local_types, sizeof(MVMuint16) * src_body->num_locals); if (src_body->num_lexicals) memcpy(lexical_types, src_body->lexical_types, sizeof(MVMuint16) * src_body->num_lexicals); dest_body->local_types = local_types; dest_body->lexical_types = lexical_types; } { MVMLexicalRegistry *current, *tmp; unsigned bucket_tmp; /* NOTE: if we really wanted to, we could avoid rehashing... */ HASH_ITER(hash_handle, src_body->lexical_names, current, tmp, bucket_tmp) { MVMLexicalRegistry *new_entry = MVM_malloc(sizeof(MVMLexicalRegistry)); /* don't need to clone the string */ MVM_ASSIGN_REF(tc, &(dest_root->header), new_entry->key, current->key); new_entry->value = current->value; MVM_HASH_BIND(tc, dest_body->lexical_names, current->key, new_entry); } } /* Static environment needs to be copied, and any objects WB'd. */ if (src_body->env_size) { MVMuint16 *type_map = src_body->lexical_types; MVMuint16 count = src_body->num_lexicals; MVMuint16 i; dest_body->static_env = MVM_malloc(src_body->env_size); memcpy(dest_body->static_env, src_body->static_env, src_body->env_size); dest_body->static_env_flags = MVM_malloc(src_body->num_lexicals); memcpy(dest_body->static_env_flags, src_body->static_env_flags, src_body->num_lexicals); for (i = 0; i < count; i++) { if (type_map[i] == MVM_reg_str) { MVM_gc_write_barrier(tc, (MVMCollectable *)dest_root, (MVMCollectable *)dest_body->static_env[i].s); } else if (type_map[i] == MVM_reg_obj) { MVM_gc_write_barrier(tc, (MVMCollectable *)dest_root, (MVMCollectable *)dest_body->static_env[i].o); } } } dest_body->env_size = src_body->env_size; dest_body->work_size = src_body->work_size; if (src_body->outer) MVM_ASSIGN_REF(tc, &(dest_root->header), dest_body->outer, src_body->outer); dest_body->num_handlers = src_body->num_handlers; dest_body->handlers = MVM_malloc(src_body->num_handlers * sizeof(MVMFrameHandler)); if (src_body->num_handlers) memcpy(dest_body->handlers, src_body->handlers, src_body->num_handlers * sizeof(MVMFrameHandler)); dest_body->instrumentation_level = 0; dest_body->num_annotations = src_body->num_annotations; dest_body->annotations_data = src_body->annotations_data; dest_body->fully_deserialized = 1; } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMStaticFrameBody *body = (MVMStaticFrameBody *)data; MVMLexicalRegistry *current, *tmp; unsigned bucket_tmp; /* mvmobjects */ MVM_gc_worklist_add(tc, worklist, &body->cu); MVM_gc_worklist_add(tc, worklist, &body->cuuid); MVM_gc_worklist_add(tc, worklist, &body->name); MVM_gc_worklist_add(tc, worklist, &body->outer); MVM_gc_worklist_add(tc, worklist, &body->static_code); /* If it's not fully deserialized, none of the following can apply. */ if (!body->fully_deserialized) return; /* lexical names hash keys */ HASH_ITER(hash_handle, body->lexical_names, current, tmp, bucket_tmp) { MVM_gc_worklist_add(tc, worklist, ¤t->hash_handle.key); MVM_gc_worklist_add(tc, worklist, ¤t->key); } /* static env */ if (body->static_env) { MVMuint16 *type_map = body->lexical_types; MVMuint16 count = body->num_lexicals; MVMuint16 i; for (i = 0; i < count; i++) if (type_map[i] == MVM_reg_str || type_map[i] == MVM_reg_obj) MVM_gc_worklist_add(tc, worklist, &body->static_env[i].o); } /* Spesh. */ MVM_gc_worklist_add(tc, worklist, &body->spesh); } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMStaticFrame *sf = (MVMStaticFrame *)obj; MVMStaticFrameBody *body = &sf->body; if (body->orig_bytecode != body->bytecode) { MVM_free(body->bytecode); body->bytecode = body->orig_bytecode; } /* If it's not fully deserialized, none of the following can apply. */ if (!body->fully_deserialized) return; MVM_free(body->handlers); MVM_free(body->work_initial); MVM_free(body->static_env); MVM_free(body->static_env_flags); MVM_free(body->local_types); MVM_free(body->lexical_types); MVM_free(body->lexical_names_list); MVM_HASH_DESTROY(hash_handle, MVMLexicalRegistry, body->lexical_names); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { /* XXX in the end we'll support inlining of this... */ return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Calculates the non-GC-managed memory we hold on to. */ static MVMuint64 unmanaged_size(MVMThreadContext *tc, MVMSTable *st, void *data) { MVMStaticFrameBody *body = (MVMStaticFrameBody *)data; MVMuint64 size = 0; if (body->fully_deserialized) { size += sizeof(MVMuint16) * body->num_locals; size += sizeof(MVMuint16) * body->num_lexicals; if (body->bytecode != body->orig_bytecode) size += body->bytecode_size; size += sizeof(MVMLexicalRegistry *) * body->num_lexicals; size += sizeof(MVMLexicalRegistry) * HASH_CNT(hash_handle, body->lexical_names); size += sizeof(MVMFrameHandler) * body->num_handlers; /* XXX i *think* the annotations are just a pointer into the serialized * blob, so don't actually count it towards the unmanaged size. */ /* size += sizeof(MVMuint8) * body->num_annotations */ size += body->env_size; /* static_env */ size += body->num_lexicals; /* static_env_flags */ if (body->instrumentation) { size += body->instrumentation->uninstrumented_bytecode_size; size += body->instrumentation->instrumented_bytecode_size; /* XXX not 100% sure if num_handlers from the body is also the * number of handlers in instrumented version. should be, though. */ size += sizeof(MVMFrameHandler) * body->num_handlers * 2; } } return size; } static void describe_refs(MVMThreadContext *tc, MVMHeapSnapshotState *ss, MVMSTable *st, void *data) { MVMStaticFrameBody *body = (MVMStaticFrameBody *)data; MVMLexicalRegistry *current, *tmp; unsigned bucket_tmp; MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->cu, "Compilation Unit"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->cuuid, "Compilation Unit Unique ID"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->name, "Name"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->outer, "Outer static frame"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->static_code, "Static code object"); /* If it's not fully deserialized, none of the following can apply. */ if (!body->fully_deserialized) return; /* lexical names hash keys */ HASH_ITER(hash_handle, body->lexical_names, current, tmp, bucket_tmp) { MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)current->key, "Lexical name"); } /* static env */ if (body->static_env) { MVMuint16 *type_map = body->lexical_types; MVMuint16 count = body->num_lexicals; MVMuint16 i; for (i = 0; i < count; i++) if (type_map[i] == MVM_reg_str || type_map[i] == MVM_reg_obj) MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->static_env[i].o, "Static Environment Entry"); } /* Spesh data */ MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->spesh, "Specializer Data"); } /* Initializes the representation. */ const MVMREPROps * MVMStaticFrame_initialize(MVMThreadContext *tc) { return &MVMStaticFrame_this_repr; } static const MVMREPROps MVMStaticFrame_this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ NULL, /* deserialize_stable_size */ gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "MVMStaticFrame", /* name */ MVM_REPR_ID_MVMStaticFrame, unmanaged_size, /* unmanaged_size */ describe_refs, }; MoarVM-2018.03/src/6model/reprs/MVMStaticFrame.h0000644000175000017510000001077713242626641021270 0ustar samanthasamantha/* Representation for static code in the VM. Partially populated on first * call or usage. */ struct MVMStaticFrameBody { /* The start of the stream of bytecode for this routine. */ MVMuint8 *bytecode; /* The compilation unit this frame belongs to. */ MVMCompUnit *cu; /* The list of local types. */ MVMuint16 *local_types; /* The list of lexical types. */ MVMuint16 *lexical_types; /* Lexicals name map. */ MVMLexicalRegistry *lexical_names; MVMLexicalRegistry **lexical_names_list; /* Defaults for lexicals upon new frame creation. */ MVMRegister *static_env; /* Flags for static environment (0 = static, 1 = clone, 2 = state). */ MVMuint8 *static_env_flags; /* If the frame has state variables. */ MVMuint32 has_state_vars; /* Zero if the frame was never invoked. Above zero is the instrumentation * level the VM was atlast time the frame was invoked. See MVMInstance for * the VM instance wide field for this. */ MVMuint32 instrumentation_level; /* Specialization-related information. Attached when a frame is first * verified. Held in a separate object rather than the MVMStaticFrame * itself partly to decrease the size of this object for frames that * we never even call, but also because we sample nursery objects and * they end up in the statistics; forcing the static frame into the * inter-generational roots leads to a lot more marking work. */ MVMStaticFrameSpesh *spesh; /* The size in bytes to allocate for the lexical environment. */ MVMuint32 env_size; /* The size in bytes to allocate for the work and arguments area. */ MVMuint32 work_size; /* Count of lexicals. */ MVMuint32 num_lexicals; /* Inital contents of the work area, copied into place to make sure we have * VMNulls in all the object slots. */ MVMRegister *work_initial; /* The size of the bytecode. */ MVMuint32 bytecode_size; /* Count of locals. */ MVMuint32 num_locals; /* Frame exception handlers information. */ MVMFrameHandler *handlers; /* The number of exception handlers this frame has. */ MVMuint32 num_handlers; /* Is the frame full deserialized? */ MVMuint8 fully_deserialized; /* Is the frame a thunk, and thus hidden to caller/outer? */ MVMuint8 is_thunk; /* Does the frame have an exit handler we need to run? */ MVMuint8 has_exit_handler; /* Should we allocate the frame directly on the heap? Doing so may avoid * needing to promote it there later. Set by measuring the number of times * the frame is promoted to the heap relative to the number of times it is * invoked, and then only pre-specialization. */ MVMuint8 allocate_on_heap; /* Is the frame marked as not being allowed to inline? */ MVMuint8 no_inline; /* The compilation unit unique ID of this frame. */ MVMString *cuuid; /* The name of this frame. */ MVMString *name; /* This frame's static outer frame. */ MVMStaticFrame *outer; /* the static coderef */ MVMCode *static_code; /* Annotation details */ MVMuint32 num_annotations; MVMuint8 *annotations_data; /* The original bytecode for this frame (before endian swapping). */ MVMuint8 *orig_bytecode; /* The serialized data about this frame, used to set up the things above * marked (lazy). Also, once we've done that, the static lexical wvals * data pos; we may be able to re-use the same slot for these to. */ MVMuint8 *frame_data_pos; MVMuint8 *frame_static_lex_pos; /* Off-by-one SC dependency index (zero indicates invalid) for the code * object, plus the index of it within that SC. This is relevant for the * static_code only. */ MVMint32 code_obj_sc_dep_idx; MVMint32 code_obj_sc_idx; /* Extra profiling/instrumentation state. */ MVMStaticFrameInstrumentation *instrumentation; }; struct MVMStaticFrame { MVMObject common; MVMStaticFrameBody body; }; /* Extra state that static frames carry when instrumented, so that the * can later be removed again. */ struct MVMStaticFrameInstrumentation { MVMuint8 *instrumented_bytecode; MVMuint8 *uninstrumented_bytecode; MVMFrameHandler *instrumented_handlers; MVMFrameHandler *uninstrumented_handlers; MVMuint32 uninstrumented_bytecode_size; MVMuint32 instrumented_bytecode_size; }; /* Function for REPR setup. */ const MVMREPROps * MVMStaticFrame_initialize(MVMThreadContext *tc); MoarVM-2018.03/src/6model/reprs/MVMStaticFrameSpesh.c0000644000175000017510000001473713242626641022266 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps StaticFrameSpesh_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &StaticFrameSpesh_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMStaticFrameSpesh); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "Cannot copy object with representation StaticFrameSpesh"); } /* Called by the VM to mark any GCable items. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMStaticFrameSpeshBody *body = (MVMStaticFrameSpeshBody *)data; MVM_spesh_stats_gc_mark(tc, body->spesh_stats, worklist); MVM_spesh_arg_guard_gc_mark(tc, body->spesh_arg_guard, worklist); if (body->num_spesh_candidates) { MVMint32 i, j; for (i = 0; i < body->num_spesh_candidates; i++) { for (j = 0; j < body->spesh_candidates[i]->num_spesh_slots; j++) MVM_gc_worklist_add(tc, worklist, &body->spesh_candidates[i]->spesh_slots[j]); for (j = 0; j < body->spesh_candidates[i]->num_inlines; j++) MVM_gc_worklist_add(tc, worklist, &body->spesh_candidates[i]->inlines[j].sf); } } } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMStaticFrameSpesh *sfs = (MVMStaticFrameSpesh *)obj; MVMint32 i; MVM_spesh_stats_destroy(tc, sfs->body.spesh_stats); MVM_free(sfs->body.spesh_stats); MVM_spesh_arg_guard_destroy(tc, sfs->body.spesh_arg_guard, 0); for (i = 0; i < sfs->body.num_spesh_candidates; i++) MVM_spesh_candidate_destroy(tc, sfs->body.spesh_candidates[i]); if (sfs->body.spesh_candidates) MVM_fixed_size_free(tc, tc->instance->fsa, sfs->body.num_spesh_candidates * sizeof(MVMSpeshCandidate *), sfs->body.spesh_candidates); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMStaticFrameSpesh); } /* Calculates the non-GC-managed memory we hold on to. */ static MVMuint64 unmanaged_size(MVMThreadContext *tc, MVMSTable *st, void *data) { MVMStaticFrameSpeshBody *body = (MVMStaticFrameSpeshBody *)data; MVMuint64 size = 0; MVMuint32 spesh_idx; for (spesh_idx = 0; spesh_idx < body->num_spesh_candidates; spesh_idx++) { MVMSpeshCandidate *cand = body->spesh_candidates[spesh_idx]; size += cand->bytecode_size; size += sizeof(MVMFrameHandler) * cand->num_handlers; size += sizeof(MVMCollectable *) * cand->num_spesh_slots; size += sizeof(MVMint32) * cand->num_deopts; size += sizeof(MVMSpeshInline) * cand->num_inlines; size += sizeof(MVMuint16) * (cand->num_locals + cand->num_lexicals); /* XXX probably don't need to measure the bytecode size here, * as it's probably just a pointer to the same bytecode we have in * the static frame anyway. */ /* Dive into the jit code */ if (cand->jitcode) { MVMJitCode *code = cand->jitcode; size += sizeof(MVMJitCode); size += sizeof(void *) * code->num_labels; size += sizeof(MVMJitDeopt) * code->num_deopts; size += sizeof(MVMJitInline) * code->num_inlines; size += sizeof(MVMJitHandler) * code->num_handlers; if (code->local_types) size += sizeof(MVMuint16) * code->num_locals; } } return size; } static void describe_refs(MVMThreadContext *tc, MVMHeapSnapshotState *ss, MVMSTable *st, void *data) { MVMStaticFrameSpeshBody *body = (MVMStaticFrameSpeshBody *)data; MVM_spesh_stats_gc_describe(tc, ss, body->spesh_stats); MVM_spesh_arg_guard_gc_describe(tc, ss, body->spesh_arg_guard); if (body->num_spesh_candidates) { MVMint32 i, j; for (i = 0; i < body->num_spesh_candidates; i++) { for (j = 0; j < body->spesh_candidates[i]->num_spesh_slots; j++) MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->spesh_candidates[i]->spesh_slots[j], "Spesh slot entry"); for (j = 0; j < body->spesh_candidates[i]->num_inlines; j++) MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->spesh_candidates[i]->inlines[j].sf, "Spesh inlined static frame"); } } } /* Initializes the representation. */ const MVMREPROps * MVMStaticFrameSpesh_initialize(MVMThreadContext *tc) { return &StaticFrameSpesh_this_repr; } static const MVMREPROps StaticFrameSpesh_this_repr = { type_object_for, MVM_gc_allocate_object, NULL, copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "MVMStaticFrameSpesh", /* name */ MVM_REPR_ID_MVMStaticFrameSpesh, unmanaged_size, describe_refs }; MoarVM-2018.03/src/6model/reprs/MVMStaticFrameSpesh.h0000644000175000017510000000276213237701240022257 0ustar samanthasamantha/* Representation used for holding specializer (dynamic optimization) data * about a static frame (logged statistics, generated specializations, and * so forth). */ struct MVMStaticFrameSpeshBody { /* Specialization argument guard tree, for selecting a specialization. */ MVMSpeshArgGuard *spesh_arg_guard; /* Specializations array, if there are any. Candidates themselves never * move in memory; the array of pointers to them is managed using the * fixed size allocator and freed at the next safepoint. */ MVMSpeshCandidate **spesh_candidates; MVMuint32 num_spesh_candidates; /* Recorded count for data recording for the specializer. Incremented * until the recording threshold is reached, and may be cleared by the * specialization worker later if it wants more data recorded. Allowed * to be a bit racey between threads; it's not a problem if we get an * extra recording or so. */ MVMuint32 spesh_entries_recorded; /* Specialization statistics assembled by the specialization worker thread * from logs. */ MVMSpeshStats *spesh_stats; /* Number of times the frame was promoted to the heap, when it was not * specialized. Used to decide whether we'll directly allocate this frame * on the heap. */ MVMuint32 num_heap_promotions; }; struct MVMStaticFrameSpesh { MVMObject common; MVMStaticFrameSpeshBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMStaticFrameSpesh_initialize(MVMThreadContext *tc); MoarVM-2018.03/src/6model/reprs/MVMString.c0000644000175000017510000001160513237701240020307 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps MVMString_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &MVMString_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMString); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMStringBody *src_body = (MVMStringBody *)src; MVMStringBody *dest_body = (MVMStringBody *)dest; dest_body->storage_type = src_body->storage_type; dest_body->num_strands = src_body->num_strands; dest_body->num_graphs = src_body->num_graphs; dest_body->cached_hash_code = src_body->cached_hash_code; switch (dest_body->storage_type) { case MVM_STRING_GRAPHEME_32: if (dest_body->num_graphs) { dest_body->storage.blob_32 = MVM_malloc(dest_body->num_graphs * sizeof(MVMGrapheme32)); memcpy(dest_body->storage.blob_32, src_body->storage.blob_32, dest_body->num_graphs * sizeof(MVMGrapheme32)); } break; case MVM_STRING_GRAPHEME_ASCII: case MVM_STRING_GRAPHEME_8: if (dest_body->num_graphs) { dest_body->storage.blob_8 = MVM_malloc(dest_body->num_graphs); memcpy(dest_body->storage.blob_8, src_body->storage.blob_8, dest_body->num_graphs); } break; case MVM_STRING_STRAND: dest_body->storage.strands = MVM_malloc(dest_body->num_strands * sizeof(MVMStringStrand)); memcpy(dest_body->storage.strands, src_body->storage.strands, dest_body->num_strands * sizeof(MVMStringStrand)); break; default: MVM_exception_throw_adhoc(tc, "Internal string corruption"); } } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMStringBody *body = (MVMStringBody *)data; if (body->storage_type == MVM_STRING_STRAND) { MVMStringStrand *strands = body->storage.strands; MVMuint16 i; for (i = 0; i < body->num_strands; i++) MVM_gc_worklist_add(tc, worklist, &(strands[i].blob_string)); } } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMString *str = (MVMString *)obj; MVM_free(str->body.storage.any); str->body.num_graphs = str->body.num_strands = 0; } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Calculates the non-GC-managed memory we hold on to. */ static MVMuint64 unmanaged_size(MVMThreadContext *tc, MVMSTable *st, void *data) { MVMStringBody *body = (MVMStringBody *)data; switch (body->storage_type) { case MVM_STRING_GRAPHEME_32: return sizeof(MVMGrapheme32) * body->num_graphs; case MVM_STRING_STRAND: return sizeof(MVMStringStrand) * body->num_strands; default: return body->num_graphs; } } /* Initializes the representation. */ const MVMREPROps * MVMString_initialize(MVMThreadContext *tc) { return &MVMString_this_repr; } static const MVMREPROps MVMString_this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ NULL, /* deserialize_stable_size */ gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "MVMString", /* name */ MVM_REPR_ID_MVMString, unmanaged_size, NULL, /* describe_refs */ }; MoarVM-2018.03/src/6model/reprs/MVMString.h0000644000175000017510000000445513237701240020321 0ustar samanthasamantha/* Representation used by VM-level strings. * * Strings come in one of 3 forms today, with 1 expected future form: * - 32-bit buffer of graphemes (Unicode codepoints or synthetic codepoints) * - 8-bit buffer of codepoints that all fall in the ASCII range * - Buffer of strands * - (LATER) 8-bit buffer of codepoints with negatives as synthetics (we * draw out a distinction with the ASCII range buffer because we can do * some I/O simplifications when we know all is in the ASCII range). * * A buffer of strands represents a string made up of other non-strand * strings. That is, there's no recursive strands. This simplifies the * process of iteration enormously. A strand may refer to just part of * another string by specifying offsets. Furthermore, it may specify a * repetition count. */ /* Kinds of grapheme we may hold in a string. */ typedef MVMint32 MVMGrapheme32; typedef MVMint8 MVMGraphemeASCII; typedef MVMint8 MVMGrapheme8; /* Future use */ /* What kind of data is a string storing? */ #define MVM_STRING_GRAPHEME_32 0 #define MVM_STRING_GRAPHEME_ASCII 1 #define MVM_STRING_GRAPHEME_8 2 #define MVM_STRING_STRAND 3 /* String index data type, for when we talk about indexes. */ typedef MVMuint32 MVMStringIndex; /* Data type for a Unicode codepoint. */ typedef MVMint32 MVMCodepoint; /* Maximum number of strands we will have. */ #define MVM_STRING_MAX_STRANDS 64 /* The body of a string. */ struct MVMStringBody { union { MVMGrapheme32 *blob_32; MVMGraphemeASCII *blob_ascii; MVMGrapheme8 *blob_8; MVMStringStrand *strands; void *any; } storage; MVMuint16 storage_type; MVMuint16 num_strands; MVMuint32 num_graphs; MVMint32 cached_hash_code; }; /* A strand of a string. */ struct MVMStringStrand { /* Another string that must be some kind of grapheme string. */ MVMString *blob_string; /* Start and end indexes we refer to in the blob string. */ MVMStringIndex start; MVMStringIndex end; /* Number of repetitions. */ MVMuint32 repetitions; }; /* The MVMString, with header and body. */ struct MVMString { MVMObject common; MVMStringBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMString_initialize(MVMThreadContext *tc); MoarVM-2018.03/src/6model/reprs/MVMThread.c0000644000175000017510000000636513237701240020257 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps MVMThread_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &MVMThread_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMThread); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "Cannot copy object with representation MVMThread"); } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMThreadBody *body = (MVMThreadBody *)data; MVM_gc_worklist_add(tc, worklist, &body->invokee); MVM_gc_worklist_add(tc, worklist, &body->next); /* Unstarted threads are not yet in the running threads list, so their TC * needs marking here. The rest of the time, it's marked due to being in * the running threads list. */ if (MVM_load(&(body->stage)) == MVM_thread_stage_unstarted) MVM_gc_root_add_tc_roots_to_worklist(body->tc, worklist, NULL); } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { /* The ThreadContext has already been destroyed by the GC. */ MVMThread *thread = (MVMThread *)obj; thread->body.invokee = NULL; } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Initializes the representation. */ const MVMREPROps * MVMThread_initialize(MVMThreadContext *tc) { return &MVMThread_this_repr; } static const MVMREPROps MVMThread_this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ NULL, /* deserialize_stable_size */ gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "VMThread", /* name */ MVM_REPR_ID_MVMThread, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; MoarVM-2018.03/src/6model/reprs/MVMThread.h0000644000175000017510000000244513237701240020257 0ustar samanthasamantha/* Various stages a thread can be in. */ typedef enum { MVM_thread_stage_unstarted = 0, MVM_thread_stage_starting = 1, MVM_thread_stage_waiting = 2, MVM_thread_stage_started = 3, MVM_thread_stage_exited = 4, MVM_thread_stage_clearing_nursery = 5, MVM_thread_stage_destroyed = 6 } MVMThreadStages; /* Representation used for VM thread handles. */ struct MVMThreadBody { /* The code object we will invoke to start the thread.. */ MVMObject *invokee; /* The underlying OS thread handle. */ uv_thread_t thread; /* The thread context for the thread. */ MVMThreadContext *tc; /* Next in tc's threads list. */ MVMThread *next; /* The current stage the thread is in (one of MVMThreadStages). */ AO_t stage; /* Thread's OS-level thread ID. */ MVMint64 native_thread_id; /* Copy of the VM-level thread ID (also stored in the ThreadContext while * the thread is alive). */ MVMuint32 thread_id; /* Non-zero if the thread should not block shutdown of the VM (those with * zero in here will be joined when the main thread ends). */ MVMint32 app_lifetime; }; struct MVMThread { MVMObject common; MVMThreadBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMThread_initialize(MVMThreadContext *tc); MoarVM-2018.03/src/6model/reprs/MultiDimArray.c0000644000175000017510000010523113237701240021203 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps MultiDimArray_this_repr; /* Computes the flat number of elements from the given dimension list. */ static MVMint64 flat_elements(MVMint64 num_dimensions, MVMint64 *dimensions) { MVMint64 result = dimensions[0]; MVMint64 i; for (i = 1; i < num_dimensions; i++) result *= dimensions[i]; return result; } /* Computes the flat size from representation data. */ static size_t flat_size(MVMMultiDimArrayREPRData *repr_data, MVMint64 *dimensions) { return repr_data->elem_size * flat_elements(repr_data->num_dimensions, dimensions); } /* Takes a number of dimensions, indices we were passed, and dimension sizes. * Computes the offset into flat space. */ MVM_STATIC_INLINE size_t indices_to_flat_index(MVMThreadContext *tc, MVMint64 num_dimensions, MVMint64 *dimensions, MVMint64 *indices) { MVMint64 multiplier = 1; size_t result = 0; MVMint64 i; for (i = num_dimensions - 1; i >= 0; i--) { MVMint64 dim_size = dimensions[i]; MVMint64 index = indices[i]; if (index >= 0 && index < dim_size) { result += index * multiplier; multiplier *= dim_size; } else { MVM_exception_throw_adhoc(tc, "Index %"PRId64" for dimension %"PRId64" out of range (must be 0..%"PRId64")", index, i + 1, dim_size - 1); } } return result; } /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &MultiDimArray_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMMultiDimArray); }); return st->WHAT; } /* Allocates the mutli-dimensional array and sets up its dimensions array with * all zeroes, for later filling. */ static MVMObject * allocate(MVMThreadContext *tc, MVMSTable *st) { MVMMultiDimArrayREPRData *repr_data = (MVMMultiDimArrayREPRData *)st->REPR_data; if (repr_data) { MVMObject *obj = MVM_gc_allocate_object(tc, st); ((MVMMultiDimArray *)obj)->body.dimensions = MVM_fixed_size_alloc_zeroed(tc, tc->instance->fsa, repr_data->num_dimensions * sizeof(MVMint64)); return obj; } else { MVM_exception_throw_adhoc(tc, "Cannot allocate a multi-dim array type before it is composed"); } } /* Composes the representation. */ static void spec_to_repr_data(MVMThreadContext *tc, MVMMultiDimArrayREPRData *repr_data, const MVMStorageSpec *spec) { switch (spec->boxed_primitive) { case MVM_STORAGE_SPEC_BP_INT: if (spec->is_unsigned) { switch (spec->bits) { case 64: repr_data->slot_type = MVM_ARRAY_U64; repr_data->elem_size = sizeof(MVMuint64); break; case 32: repr_data->slot_type = MVM_ARRAY_U32; repr_data->elem_size = sizeof(MVMuint32); break; case 16: repr_data->slot_type = MVM_ARRAY_U16; repr_data->elem_size = sizeof(MVMuint16); break; case 8: repr_data->slot_type = MVM_ARRAY_U8; repr_data->elem_size = sizeof(MVMuint8); break; case 4: repr_data->slot_type = MVM_ARRAY_U4; repr_data->elem_size = 0; break; case 2: repr_data->slot_type = MVM_ARRAY_U2; repr_data->elem_size = 0; break; case 1: repr_data->slot_type = MVM_ARRAY_U1; repr_data->elem_size = 0; break; default: MVM_exception_throw_adhoc(tc, "MVMMultiDimArray: Unsupported uint size"); } } else { switch (spec->bits) { case 64: repr_data->slot_type = MVM_ARRAY_I64; repr_data->elem_size = sizeof(MVMint64); break; case 32: repr_data->slot_type = MVM_ARRAY_I32; repr_data->elem_size = sizeof(MVMint32); break; case 16: repr_data->slot_type = MVM_ARRAY_I16; repr_data->elem_size = sizeof(MVMint16); break; case 8: repr_data->slot_type = MVM_ARRAY_I8; repr_data->elem_size = sizeof(MVMint8); break; case 4: repr_data->slot_type = MVM_ARRAY_I4; repr_data->elem_size = 0; break; case 2: repr_data->slot_type = MVM_ARRAY_I2; repr_data->elem_size = 0; break; case 1: repr_data->slot_type = MVM_ARRAY_I1; repr_data->elem_size = 0; break; default: MVM_exception_throw_adhoc(tc, "MVMMultiDimArray: Unsupported int size"); } } break; case MVM_STORAGE_SPEC_BP_NUM: switch (spec->bits) { case 64: repr_data->slot_type = MVM_ARRAY_N64; repr_data->elem_size = sizeof(MVMnum64); break; case 32: repr_data->slot_type = MVM_ARRAY_N32; repr_data->elem_size = sizeof(MVMnum32); break; default: MVM_exception_throw_adhoc(tc, "MVMMultiDimArray: Unsupported num size"); } break; case MVM_STORAGE_SPEC_BP_STR: repr_data->slot_type = MVM_ARRAY_STR; repr_data->elem_size = sizeof(MVMString *); break; default: repr_data->slot_type = MVM_ARRAY_OBJ; repr_data->elem_size = sizeof(MVMObject *); } } static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *repr_info) { MVMStringConsts *str_consts = &(tc->instance->str_consts); MVMMultiDimArrayREPRData *repr_data; MVMObject *info = MVM_repr_at_key_o(tc, repr_info, str_consts->array); if (!MVM_is_null(tc, info)) { MVMObject *dims = MVM_repr_at_key_o(tc, info, str_consts->dimensions); MVMObject *type = MVM_repr_at_key_o(tc, info, str_consts->type); MVMint64 dimensions; if (!MVM_is_null(tc, dims)) { dimensions = MVM_repr_get_int(tc, dims); if (dimensions < 1) MVM_exception_throw_adhoc(tc, "MultiDimArray REPR must be composed with at least 1 dimension"); repr_data = MVM_calloc(1, sizeof(MVMMultiDimArrayREPRData)); repr_data->num_dimensions = dimensions; } else { MVM_exception_throw_adhoc(tc, "MultiDimArray REPR must be composed with a number of dimensions"); } if (!MVM_is_null(tc, type)) { const MVMStorageSpec *spec = REPR(type)->get_storage_spec(tc, STABLE(type)); MVM_ASSIGN_REF(tc, &(st->header), repr_data->elem_type, type); spec_to_repr_data(tc, repr_data, spec); } else { repr_data->slot_type = MVM_ARRAY_OBJ; repr_data->elem_size = sizeof(MVMObject *); } st->REPR_data = repr_data; } else { MVM_exception_throw_adhoc(tc, "MultiDimArray REPR must be composed with array information"); } } /* Copies to the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMMultiDimArrayREPRData *repr_data = (MVMMultiDimArrayREPRData *)st->REPR_data; MVMMultiDimArrayBody *src_body = (MVMMultiDimArrayBody *)src; MVMMultiDimArrayBody *dest_body = (MVMMultiDimArrayBody *)dest; if (src_body->slots.any) { size_t dim_size = repr_data->num_dimensions * sizeof(MVMint64); size_t data_size = flat_size(repr_data, src_body->dimensions); dest_body->dimensions = MVM_fixed_size_alloc(tc, tc->instance->fsa, dim_size); dest_body->slots.any = MVM_fixed_size_alloc(tc, tc->instance->fsa, data_size); memcpy(dest_body->dimensions, src_body->dimensions, dim_size); memcpy(dest_body->slots.any, src_body->slots.any, data_size); } } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMMultiDimArrayBody *body = (MVMMultiDimArrayBody *)data; if (body->slots.any) { MVMMultiDimArrayREPRData *repr_data = (MVMMultiDimArrayREPRData *)st->REPR_data; MVMint64 flat_elems = flat_elements(repr_data->num_dimensions, body->dimensions); MVMint64 i; switch (repr_data->slot_type) { case MVM_ARRAY_OBJ: { MVMObject **slots = body->slots.o; for (i = 0; i < flat_elems; i++) MVM_gc_worklist_add(tc, worklist, &slots[i]); break; } case MVM_ARRAY_STR: { MVMString **slots = body->slots.s; for (i = 0; i < flat_elems; i++) MVM_gc_worklist_add(tc, worklist, &slots[i]); break; } } } } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMMultiDimArray *arr = (MVMMultiDimArray *)obj; MVMMultiDimArrayREPRData *repr_data = (MVMMultiDimArrayREPRData *)STABLE(obj)->REPR_data; if (arr->body.slots.any) MVM_fixed_size_free(tc, tc->instance->fsa, flat_size(repr_data, arr->body.dimensions), arr->body.slots.any); MVM_fixed_size_free(tc, tc->instance->fsa, repr_data->num_dimensions * sizeof(MVMint64), arr->body.dimensions); } /* Marks the representation data in an STable.*/ static void gc_mark_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMGCWorklist *worklist) { MVMMultiDimArrayREPRData *repr_data = (MVMMultiDimArrayREPRData *)st->REPR_data; if (repr_data == NULL) return; MVM_gc_worklist_add(tc, worklist, &repr_data->elem_type); } /* Free representation data. */ static void gc_free_repr_data(MVMThreadContext *tc, MVMSTable *st) { MVM_free(st->REPR_data); } /* Gets the storage specification for this representation. */ static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Serializes the data held in the array. */ static void serialize(MVMThreadContext *tc, MVMSTable *st, void *data, MVMSerializationWriter *writer) { MVMMultiDimArrayREPRData *repr_data = (MVMMultiDimArrayREPRData *)st->REPR_data; MVMMultiDimArrayBody *body = (MVMMultiDimArrayBody *)data; MVMint64 i, flat_elems; /* Write out dimensions. */ for (i = 0; i < repr_data->num_dimensions; i++) MVM_serialization_write_int(tc, writer, body->dimensions[i]); /* Write out values. */ flat_elems = flat_elements(repr_data->num_dimensions, body->dimensions); for (i = 0; i < flat_elems; i++) { switch (repr_data->slot_type) { case MVM_ARRAY_OBJ: MVM_serialization_write_ref(tc, writer, body->slots.o[i]); break; case MVM_ARRAY_STR: MVM_serialization_write_str(tc, writer, body->slots.s[i]); break; case MVM_ARRAY_I64: MVM_serialization_write_int(tc, writer, (MVMint64)body->slots.i64[i]); break; case MVM_ARRAY_I32: MVM_serialization_write_int(tc, writer, (MVMint64)body->slots.i32[i]); break; case MVM_ARRAY_I16: MVM_serialization_write_int(tc, writer, (MVMint64)body->slots.i16[i]); break; case MVM_ARRAY_I8: MVM_serialization_write_int(tc, writer, (MVMint64)body->slots.i8[i]); break; case MVM_ARRAY_U64: MVM_serialization_write_int(tc, writer, (MVMint64)body->slots.u64[i]); break; case MVM_ARRAY_U32: MVM_serialization_write_int(tc, writer, (MVMint64)body->slots.u32[i]); break; case MVM_ARRAY_U16: MVM_serialization_write_int(tc, writer, (MVMint64)body->slots.u16[i]); break; case MVM_ARRAY_U8: MVM_serialization_write_int(tc, writer, (MVMint64)body->slots.u8[i]); break; case MVM_ARRAY_N64: MVM_serialization_write_num(tc, writer, (MVMnum64)body->slots.n64[i]); break; case MVM_ARRAY_N32: MVM_serialization_write_num(tc, writer, (MVMnum64)body->slots.n32[i]); break; default: MVM_exception_throw_adhoc(tc, "MVMMultiDimArray: Unhandled slot type"); } } } /* Deserializes the data held in the array. */ static void deserialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMSerializationReader *reader) { MVMMultiDimArrayREPRData *repr_data = (MVMMultiDimArrayREPRData *)st->REPR_data; MVMMultiDimArrayBody *body = (MVMMultiDimArrayBody *)data; MVMint64 i, flat_elems; /* Read in dimensions. */ for (i = 0; i < repr_data->num_dimensions; i++) body->dimensions[i] = MVM_serialization_read_int(tc, reader); /* Allocate storage. */ body->slots.any = MVM_fixed_size_alloc_zeroed(tc, tc->instance->fsa, flat_size(repr_data, body->dimensions)); /* Read in elements. */ flat_elems = flat_elements(repr_data->num_dimensions, body->dimensions); for (i = 0; i < flat_elems; i++) { switch (repr_data->slot_type) { case MVM_ARRAY_OBJ: MVM_ASSIGN_REF(tc, &(root->header), body->slots.o[i], MVM_serialization_read_ref(tc, reader)); break; case MVM_ARRAY_STR: MVM_ASSIGN_REF(tc, &(root->header), body->slots.s[i], MVM_serialization_read_str(tc, reader)); break; case MVM_ARRAY_I64: body->slots.i64[i] = MVM_serialization_read_int(tc, reader); break; case MVM_ARRAY_I32: body->slots.i32[i] = (MVMint32)MVM_serialization_read_int(tc, reader); break; case MVM_ARRAY_I16: body->slots.i16[i] = (MVMint16)MVM_serialization_read_int(tc, reader); break; case MVM_ARRAY_I8: body->slots.i8[i] = (MVMint8)MVM_serialization_read_int(tc, reader); break; case MVM_ARRAY_U64: body->slots.i64[i] = MVM_serialization_read_int(tc, reader); break; case MVM_ARRAY_U32: body->slots.i32[i] = (MVMuint32)MVM_serialization_read_int(tc, reader); break; case MVM_ARRAY_U16: body->slots.i16[i] = (MVMuint16)MVM_serialization_read_int(tc, reader); break; case MVM_ARRAY_U8: body->slots.i8[i] = (MVMuint8)MVM_serialization_read_int(tc, reader); break; case MVM_ARRAY_N64: body->slots.n64[i] = MVM_serialization_read_num(tc, reader); break; case MVM_ARRAY_N32: body->slots.n32[i] = (MVMnum32)MVM_serialization_read_num(tc, reader); break; default: MVM_exception_throw_adhoc(tc, "MVMMultiDimArray: Unhandled slot type"); } } } /* Serializes the REPR data. */ static void serialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationWriter *writer) { MVMMultiDimArrayREPRData *repr_data = (MVMMultiDimArrayREPRData *)st->REPR_data; if (repr_data) { MVM_serialization_write_int(tc, writer, repr_data->num_dimensions); MVM_serialization_write_ref(tc, writer, repr_data->elem_type); } else { MVM_serialization_write_int(tc, writer, 0); } } /* Deserializes the REPR data. */ static void deserialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { MVMint64 num_dims; if (reader->root.version >= 19) { num_dims = MVM_serialization_read_int(tc, reader); } else { num_dims = MVM_serialization_read_int64(tc, reader); } if (num_dims > 0) { MVMMultiDimArrayREPRData *repr_data = (MVMMultiDimArrayREPRData *)MVM_malloc(sizeof(MVMMultiDimArrayREPRData)); MVMObject *type; repr_data->num_dimensions = num_dims; type = MVM_serialization_read_ref(tc, reader); MVM_ASSIGN_REF(tc, &(st->header), repr_data->elem_type, type); if (type) { MVM_serialization_force_stable(tc, reader, STABLE(type)); spec_to_repr_data(tc, repr_data, REPR(type)->get_storage_spec(tc, STABLE(type))); } else { repr_data->slot_type = MVM_ARRAY_OBJ; repr_data->elem_size = sizeof(MVMObject *); } st->REPR_data = repr_data; } } static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMMultiDimArray); } static void push(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister value, MVMuint16 kind) { MVM_exception_throw_adhoc(tc, "Cannot push onto a fixed dimension array"); } static void pop(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind) { MVM_exception_throw_adhoc(tc, "Cannot pop a fixed dimension array"); } static void unshift(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister value, MVMuint16 kind) { MVM_exception_throw_adhoc(tc, "Cannot unshift onto a fixed dimension array"); } static void shift(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind) { MVM_exception_throw_adhoc(tc, "Cannot shift a fixed dimension array"); } static void asplice(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *from, MVMint64 offset, MVMuint64 count) { MVM_exception_throw_adhoc(tc, "Cannot splice a fixed dimension array"); } static void at_pos_multidim(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_indices, MVMint64 *indices, MVMRegister *value, MVMuint16 kind) { MVMMultiDimArrayREPRData *repr_data = (MVMMultiDimArrayREPRData *)st->REPR_data; if (num_indices == repr_data->num_dimensions) { MVMMultiDimArrayBody *body = (MVMMultiDimArrayBody *)data; size_t flat_index = indices_to_flat_index(tc, repr_data->num_dimensions, body->dimensions, indices); switch (repr_data->slot_type) { case MVM_ARRAY_OBJ: if (kind == MVM_reg_obj) { MVMObject *found = body->slots.o[flat_index]; value->o = found ? found : tc->instance->VMNull; } else { MVM_exception_throw_adhoc(tc, "MultiDimArray: atpos expected object register"); } break; case MVM_ARRAY_STR: if (kind == MVM_reg_str) value->s = body->slots.s[flat_index]; else MVM_exception_throw_adhoc(tc, "MultiDimArray: atpos expected string register"); break; case MVM_ARRAY_I64: if (kind == MVM_reg_int64) value->i64 = (MVMint64)body->slots.i64[flat_index]; else MVM_exception_throw_adhoc(tc, "MultiDimArray: atpos expected int register"); break; case MVM_ARRAY_I32: if (kind == MVM_reg_int64) value->i64 = (MVMint64)body->slots.i32[flat_index]; else MVM_exception_throw_adhoc(tc, "MultiDimArray: atpos expected int register"); break; case MVM_ARRAY_I16: if (kind == MVM_reg_int64) value->i64 = (MVMint64)body->slots.i16[flat_index]; else MVM_exception_throw_adhoc(tc, "MultiDimArray: atpos expected int register"); break; case MVM_ARRAY_I8: if (kind == MVM_reg_int64) value->i64 = (MVMint64)body->slots.i8[flat_index]; else MVM_exception_throw_adhoc(tc, "MultiDimArray: atpos expected int register"); break; case MVM_ARRAY_N64: if (kind == MVM_reg_num64) value->n64 = (MVMnum64)body->slots.n64[flat_index]; else MVM_exception_throw_adhoc(tc, "MultiDimArray: atpos expected num register"); break; case MVM_ARRAY_N32: if (kind == MVM_reg_num64) value->n64 = (MVMnum64)body->slots.n32[flat_index]; else MVM_exception_throw_adhoc(tc, "MultiDimArray: atpos expected num register"); break; case MVM_ARRAY_U64: if (kind == MVM_reg_int64) value->i64 = (MVMint64)body->slots.u64[flat_index]; else MVM_exception_throw_adhoc(tc, "MultiDimArray: atpos expected int register"); break; case MVM_ARRAY_U32: if (kind == MVM_reg_int64) value->i64 = (MVMint64)body->slots.u32[flat_index]; else MVM_exception_throw_adhoc(tc, "MultiDimArray: atpos expected int register"); break; case MVM_ARRAY_U16: if (kind == MVM_reg_int64) value->i64 = (MVMint64)body->slots.u16[flat_index]; else MVM_exception_throw_adhoc(tc, "MultiDimArray: atpos expected int register"); break; case MVM_ARRAY_U8: if (kind == MVM_reg_int64) value->i64 = (MVMint64)body->slots.u8[flat_index]; else MVM_exception_throw_adhoc(tc, "MultiDimArray: atpos expected int register"); break; default: MVM_exception_throw_adhoc(tc, "MultiDimArray: Unhandled slot type"); } } else { MVM_exception_throw_adhoc(tc, "Cannot access %"PRId64" dimension array with %"PRId64" indices", repr_data->num_dimensions, num_indices); } } static void bind_pos_multidim(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_indices, MVMint64 *indices, MVMRegister value, MVMuint16 kind) { MVMMultiDimArrayREPRData *repr_data = (MVMMultiDimArrayREPRData *)st->REPR_data; if (num_indices == repr_data->num_dimensions) { MVMMultiDimArrayBody *body = (MVMMultiDimArrayBody *)data; size_t flat_index = indices_to_flat_index(tc, repr_data->num_dimensions, body->dimensions, indices); switch (repr_data->slot_type) { case MVM_ARRAY_OBJ: if (kind == MVM_reg_obj) { MVM_ASSIGN_REF(tc, &(root->header), body->slots.o[flat_index], value.o); } else { MVM_exception_throw_adhoc(tc, "MultiDimArray: bindpos expected object register"); } break; case MVM_ARRAY_STR: if (kind == MVM_reg_str) { MVM_ASSIGN_REF(tc, &(root->header), body->slots.s[flat_index], value.s); } else { MVM_exception_throw_adhoc(tc, "MultiDimArray: bindpos expected string register"); } break; case MVM_ARRAY_I64: if (kind == MVM_reg_int64) body->slots.i64[flat_index] = value.i64; else MVM_exception_throw_adhoc(tc, "MultiDimArray: bindpos expected int register"); break; case MVM_ARRAY_I32: if (kind == MVM_reg_int64) body->slots.i32[flat_index] = (MVMint32)value.i64; else MVM_exception_throw_adhoc(tc, "MultiDimArray: bindpos expected int register"); break; case MVM_ARRAY_I16: if (kind == MVM_reg_int64) body->slots.i16[flat_index] = (MVMint16)value.i64; else MVM_exception_throw_adhoc(tc, "MultiDimArray: bindpos expected int register"); break; case MVM_ARRAY_I8: if (kind == MVM_reg_int64) body->slots.i8[flat_index] = (MVMint8)value.i64; else MVM_exception_throw_adhoc(tc, "MultiDimArray: bindpos expected int register"); break; case MVM_ARRAY_N64: if (kind == MVM_reg_num64) body->slots.n64[flat_index] = value.n64; else MVM_exception_throw_adhoc(tc, "MultiDimArray: bindpos expected num register"); break; case MVM_ARRAY_N32: if (kind == MVM_reg_num64) body->slots.n32[flat_index] = (MVMnum32)value.n64; else MVM_exception_throw_adhoc(tc, "MultiDimArray: bindpos expected num register"); break; case MVM_ARRAY_U64: if (kind == MVM_reg_int64) body->slots.u64[flat_index] = value.i64; else MVM_exception_throw_adhoc(tc, "MultiDimArray: bindpos expected int register"); break; case MVM_ARRAY_U32: if (kind == MVM_reg_int64) body->slots.u32[flat_index] = (MVMuint32)value.i64; else MVM_exception_throw_adhoc(tc, "MultiDimArray: bindpos expected int register"); break; case MVM_ARRAY_U16: if (kind == MVM_reg_int64) body->slots.u16[flat_index] = (MVMuint16)value.i64; else MVM_exception_throw_adhoc(tc, "MultiDimArray: bindpos expected int register"); break; case MVM_ARRAY_U8: if (kind == MVM_reg_int64) body->slots.u8[flat_index] = (MVMuint8)value.i64; else MVM_exception_throw_adhoc(tc, "MultiDimArray: bindpos expected int register"); break; default: MVM_exception_throw_adhoc(tc, "MultiDimArray: Unhandled slot type"); } } else { MVM_exception_throw_adhoc(tc, "Cannot access %"PRId64" dimension array with %"PRId64" indices", repr_data->num_dimensions, num_indices); } } static void dimensions(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 *num_dimensions, MVMint64 **dimensions) { MVMMultiDimArrayREPRData *repr_data = (MVMMultiDimArrayREPRData *)st->REPR_data; if (repr_data) { MVMMultiDimArrayBody *body = (MVMMultiDimArrayBody *)data; *num_dimensions = repr_data->num_dimensions; *dimensions = body->dimensions; } else { MVM_exception_throw_adhoc(tc, "Cannot query a multi-dim array's dimensionality before it is composed"); } } static void set_dimensions(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_dimensions, MVMint64 *dimensions) { MVMMultiDimArrayREPRData *repr_data = (MVMMultiDimArrayREPRData *)st->REPR_data; if (num_dimensions == repr_data->num_dimensions) { /* Note that we use an atomic operation at the point of allocation. * This means we can be leak-free and memory safe in the face of * multiple threads competing to set dimensions (unlikely in any * real world use case, but we should ensure the VM is memory safe). */ MVMMultiDimArrayBody *body = (MVMMultiDimArrayBody *)data; size_t size = flat_size(repr_data, dimensions); void *storage = MVM_fixed_size_alloc_zeroed(tc, tc->instance->fsa, size); if (MVM_trycas(&(body->slots.any), NULL, storage)) { /* Now memory is in place, safe to un-zero dimensions. */ memcpy(body->dimensions, dimensions, num_dimensions * sizeof(MVMint64)); } else { MVM_exception_throw_adhoc(tc, "MultiDimArray: can only set dimensions once"); } } else { MVM_exception_throw_adhoc(tc, "Array type of %"PRId64" dimensions cannot be initialized with %"PRId64" dimensions", repr_data->num_dimensions, num_dimensions); } } static void at_pos(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister *value, MVMuint16 kind) { at_pos_multidim(tc, st, root, data, 1, &index, value, kind); } static void bind_pos(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister value, MVMuint16 kind) { bind_pos_multidim(tc, st, root, data, 1, &index, value, kind); } static void set_elems(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMuint64 count) { set_dimensions(tc, st, root, data, 1, (MVMint64 *)&count); } static MVMuint64 elems(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMint64 _; MVMint64 *dims; dimensions(tc, st, root, data, &_, &dims); return (MVMuint64)dims[0]; } static MVMStorageSpec get_elem_storage_spec(MVMThreadContext *tc, MVMSTable *st) { MVMMultiDimArrayREPRData *repr_data = (MVMMultiDimArrayREPRData *)st->REPR_data; MVMStorageSpec spec; /* initialise storage spec to default values */ spec.bits = 0; spec.align = 0; spec.is_unsigned = 0; switch (repr_data->slot_type) { case MVM_ARRAY_STR: spec.inlineable = MVM_STORAGE_SPEC_INLINED; spec.boxed_primitive = MVM_STORAGE_SPEC_BP_STR; spec.can_box = MVM_STORAGE_SPEC_CAN_BOX_STR; break; case MVM_ARRAY_I64: case MVM_ARRAY_I32: case MVM_ARRAY_I16: case MVM_ARRAY_I8: spec.inlineable = MVM_STORAGE_SPEC_INLINED; spec.boxed_primitive = MVM_STORAGE_SPEC_BP_INT; spec.can_box = MVM_STORAGE_SPEC_CAN_BOX_INT; break; case MVM_ARRAY_N64: case MVM_ARRAY_N32: spec.inlineable = MVM_STORAGE_SPEC_INLINED; spec.boxed_primitive = MVM_STORAGE_SPEC_BP_NUM; spec.can_box = MVM_STORAGE_SPEC_CAN_BOX_NUM; break; case MVM_ARRAY_U64: case MVM_ARRAY_U32: case MVM_ARRAY_U16: case MVM_ARRAY_U8: spec.inlineable = MVM_STORAGE_SPEC_INLINED; spec.boxed_primitive = MVM_STORAGE_SPEC_BP_INT; spec.can_box = MVM_STORAGE_SPEC_CAN_BOX_INT; spec.is_unsigned = 1; break; default: spec.inlineable = MVM_STORAGE_SPEC_REFERENCE; spec.boxed_primitive = MVM_STORAGE_SPEC_BP_NONE; spec.can_box = 0; break; } return spec; } AO_t * pos_as_atomic_multidim(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_indices, MVMint64 *indices) { MVMMultiDimArrayREPRData *repr_data = (MVMMultiDimArrayREPRData *)st->REPR_data; if (num_indices == repr_data->num_dimensions) { MVMMultiDimArrayBody *body = (MVMMultiDimArrayBody *)data; size_t flat_index = indices_to_flat_index(tc, repr_data->num_dimensions, body->dimensions, indices); if (sizeof(AO_t) == 8 && (repr_data->slot_type == MVM_ARRAY_I64 || repr_data->slot_type == MVM_ARRAY_U64)) return (AO_t *)&(body->slots.i64[flat_index]); if (sizeof(AO_t) == 4 && (repr_data->slot_type == MVM_ARRAY_I32 || repr_data->slot_type == MVM_ARRAY_U32)) return (AO_t *)&(body->slots.i32[flat_index]); MVM_exception_throw_adhoc(tc, "Can only do integer atomic operation on native integer array element of atomic size"); } else { MVM_exception_throw_adhoc(tc, "Cannot access %"PRId64" dimension array with %"PRId64" indices", repr_data->num_dimensions, num_indices); } } static AO_t * pos_as_atomic(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index) { return pos_as_atomic_multidim(tc, st, root, data, 1, &index); } /* Initializes the representation. */ const MVMREPROps * MVMMultiDimArray_initialize(MVMThreadContext *tc) { return &MultiDimArray_this_repr; } static const MVMREPROps MultiDimArray_this_repr = { type_object_for, allocate, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, { at_pos, bind_pos, set_elems, push, pop, unshift, shift, asplice, at_pos_multidim, bind_pos_multidim, dimensions, set_dimensions, get_elem_storage_spec, pos_as_atomic, pos_as_atomic_multidim }, MVM_REPR_DEFAULT_ASS_FUNCS, elems, get_storage_spec, NULL, /* change_type */ serialize, deserialize, serialize_repr_data, deserialize_repr_data, deserialize_stable_size, gc_mark, gc_free, NULL, /* gc_cleanup */ gc_mark_repr_data, gc_free_repr_data, compose, NULL, /* spesh */ "MultiDimArray", /* name */ MVM_REPR_ID_MultiDimArray, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; MoarVM-2018.03/src/6model/reprs/MultiDimArray.h0000644000175000017510000000271313237701240021211 0ustar samanthasamantha/* Body of a multi-dim array is two blobs of memory: one holding the sizes of * the dimensions, and another holding the storage. The number of dimensions * is part of the type. */ struct MVMMultiDimArrayBody { /* The sizes of the dimensions. */ MVMint64 *dimensions; /* 1D array of slots, which is the storage. We do the math on the * dimensions to get a mapping into here. Note that this memory is * fixed in size and never reallocated over the life of the array. */ union { MVMObject **o; MVMString **s; MVMint64 *i64; MVMint32 *i32; MVMint16 *i16; MVMint8 *i8; MVMnum64 *n64; MVMnum32 *n32; MVMuint64 *u64; MVMuint32 *u32; MVMuint16 *u16; MVMuint8 *u8; void *any; } slots; }; struct MVMMultiDimArray { MVMObject common; MVMMultiDimArrayBody body; }; /* REPR data specifies the type of array elements and number of dimensions we * have (the actual size of the dimensions is part of the value). */ struct MVMMultiDimArrayREPRData { /* Number of dimensions we have. */ MVMint64 num_dimensions; /* The size of each element. */ size_t elem_size; /* What type of slots we have. */ MVMuint8 slot_type; /* Type object for the element type. */ MVMObject *elem_type; }; /* Initializes the MultiDimArray REPR. */ const MVMREPROps * MVMMultiDimArray_initialize(MVMThreadContext *tc); MoarVM-2018.03/src/6model/reprs/NFA.c0000644000175000017510000010640113242626641017073 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps NFA_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &NFA_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMNFA); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "Cannot copy object with representation NFA"); } /* Called by the VM to mark any GCable items. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMNFABody *lb = (MVMNFABody *)data; MVMint64 i, j; MVM_gc_worklist_add(tc, worklist, &lb->fates); for (i = 0; i < lb->num_states; i++) { MVMint64 edges = lb->num_state_edges[i]; for (j = 0; j < edges; j++) { switch (lb->states[i][j].act) { case MVM_NFA_EDGE_CHARLIST: case MVM_NFA_EDGE_CHARLIST_NEG: MVM_gc_worklist_add(tc, worklist, &lb->states[i][j].arg.s); } } } } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMNFA *nfa = (MVMNFA *)obj; MVMint64 i; for (i = 0; i < nfa->body.num_states; i++) if (nfa->body.num_state_edges[i]) MVM_fixed_size_free(tc, tc->instance->fsa, nfa->body.num_state_edges[i] * sizeof(MVMNFAStateInfo), nfa->body.states[i]); MVM_fixed_size_free(tc, tc->instance->fsa, nfa->body.num_states * sizeof(MVMNFAStateInfo *), nfa->body.states); MVM_fixed_size_free(tc, tc->instance->fsa, nfa->body.num_states * sizeof(MVMint64), nfa->body.num_state_edges); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Serializes the data. */ static void serialize(MVMThreadContext *tc, MVMSTable *st, void *data, MVMSerializationWriter *writer) { MVMNFABody *body = (MVMNFABody *)data; MVMint64 i, j; /* Write fates. */ MVM_serialization_write_ref(tc, writer, body->fates); /* Write number of states. */ MVM_serialization_write_int(tc, writer, body->num_states); /* Write state edge list counts. */ for (i = 0; i < body->num_states; i++) MVM_serialization_write_int(tc, writer, body->num_state_edges[i]); /* Write state graph. */ for (i = 0; i < body->num_states; i++) { for (j = 0; j < body->num_state_edges[i]; j++) { MVM_serialization_write_int(tc, writer, body->states[i][j].act); MVM_serialization_write_int(tc, writer, body->states[i][j].to); switch (body->states[i][j].act & 0xff) { case MVM_NFA_EDGE_FATE: MVM_serialization_write_int(tc, writer, body->states[i][j].arg.i); break; case MVM_NFA_EDGE_CODEPOINT: case MVM_NFA_EDGE_CODEPOINT_LL: case MVM_NFA_EDGE_CODEPOINT_NEG: case MVM_NFA_EDGE_CODEPOINT_M: case MVM_NFA_EDGE_CODEPOINT_M_NEG: { MVMGrapheme32 g = body->states[i][j].arg.g; if (g >= 0) { /* Non-synthetic. */ MVM_serialization_write_int(tc, writer, g); } else { /* Synthetic. Write the number of codepoints negated, * and then each of the codepoints. */ MVMNFGSynthetic *si = MVM_nfg_get_synthetic_info(tc, g); MVMint32 k; MVM_serialization_write_int(tc, writer, -(si->num_codes)); for (k = 0; k < si->num_codes; k++) MVM_serialization_write_int(tc, writer, si->codes[k]); } break; } case MVM_NFA_EDGE_CHARCLASS: case MVM_NFA_EDGE_CHARCLASS_NEG: MVM_serialization_write_int(tc, writer, body->states[i][j].arg.i); break; case MVM_NFA_EDGE_CHARLIST: case MVM_NFA_EDGE_CHARLIST_NEG: MVM_serialization_write_str(tc, writer, body->states[i][j].arg.s); break; case MVM_NFA_EDGE_CODEPOINT_I: case MVM_NFA_EDGE_CODEPOINT_I_LL: case MVM_NFA_EDGE_CODEPOINT_I_NEG: case MVM_NFA_EDGE_CODEPOINT_IM: case MVM_NFA_EDGE_CODEPOINT_IM_NEG: case MVM_NFA_EDGE_CHARRANGE: case MVM_NFA_EDGE_CHARRANGE_NEG: case MVM_NFA_EDGE_CHARRANGE_M: case MVM_NFA_EDGE_CHARRANGE_M_NEG: { MVM_serialization_write_int(tc, writer, body->states[i][j].arg.uclc.lc); MVM_serialization_write_int(tc, writer, body->states[i][j].arg.uclc.uc); break; } } } } } /* Deserializes the data. */ static void deserialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMSerializationReader *reader) { MVMNFABody *body = (MVMNFABody *)data; MVMint64 i, j; /* Read fates. */ body->fates = MVM_serialization_read_ref(tc, reader); /* Read number of states. */ body->num_states = MVM_serialization_read_int(tc, reader); if (body->num_states > 0) { /* Read state edge list counts. */ body->num_state_edges = MVM_fixed_size_alloc(tc, tc->instance->fsa, body->num_states * sizeof(MVMint64)); for (i = 0; i < body->num_states; i++) body->num_state_edges[i] = MVM_serialization_read_int(tc, reader); /* Read state graph. */ body->states = MVM_fixed_size_alloc(tc, tc->instance->fsa, body->num_states * sizeof(MVMNFAStateInfo *)); for (i = 0; i < body->num_states; i++) { MVMint64 edges = body->num_state_edges[i]; if (edges > 0) { body->states[i] = MVM_fixed_size_alloc(tc, tc->instance->fsa, edges * sizeof(MVMNFAStateInfo)); } for (j = 0; j < edges; j++) { body->states[i][j].act = MVM_serialization_read_int(tc, reader); body->states[i][j].to = MVM_serialization_read_int(tc, reader); switch (body->states[i][j].act & 0xff) { case MVM_NFA_EDGE_FATE: body->states[i][j].arg.i = MVM_serialization_read_int(tc, reader); break; case MVM_NFA_EDGE_CODEPOINT: case MVM_NFA_EDGE_CODEPOINT_LL: case MVM_NFA_EDGE_CODEPOINT_NEG: case MVM_NFA_EDGE_CODEPOINT_M: case MVM_NFA_EDGE_CODEPOINT_M_NEG: { MVMint64 cp_or_synth_count = MVM_serialization_read_int(tc, reader); if (cp_or_synth_count >= 0) { body->states[i][j].arg.g = (MVMGrapheme32)cp_or_synth_count; } else { MVMint32 num_codes = -cp_or_synth_count; MVMCodepoint *codes = MVM_fixed_size_alloc(tc, tc->instance->fsa, num_codes * sizeof(MVMCodepoint)); MVMint32 k; for (k = 0; k < num_codes; k++) codes[k] = (MVMCodepoint)MVM_serialization_read_int(tc, reader); body->states[i][j].arg.g = MVM_nfg_codes_to_grapheme(tc, codes, num_codes); MVM_fixed_size_free(tc, tc->instance->fsa, num_codes * sizeof(MVMCodepoint), codes); } break; } case MVM_NFA_EDGE_CHARCLASS: case MVM_NFA_EDGE_CHARCLASS_NEG: body->states[i][j].arg.i = MVM_serialization_read_int(tc, reader); break; case MVM_NFA_EDGE_CHARLIST: case MVM_NFA_EDGE_CHARLIST_NEG: MVM_ASSIGN_REF(tc, &(root->header), body->states[i][j].arg.s, MVM_serialization_read_str(tc, reader)); break; case MVM_NFA_EDGE_CODEPOINT_I: case MVM_NFA_EDGE_CODEPOINT_I_LL: case MVM_NFA_EDGE_CODEPOINT_I_NEG: case MVM_NFA_EDGE_CODEPOINT_IM: case MVM_NFA_EDGE_CODEPOINT_IM_NEG: case MVM_NFA_EDGE_CHARRANGE: case MVM_NFA_EDGE_CHARRANGE_NEG: case MVM_NFA_EDGE_CHARRANGE_M: case MVM_NFA_EDGE_CHARRANGE_M_NEG: { body->states[i][j].arg.uclc.lc = MVM_serialization_read_int(tc, reader); body->states[i][j].arg.uclc.uc = MVM_serialization_read_int(tc, reader); break; } } } } } } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMNFA); } /* Calculates the non-GC-managed memory we hold on to. */ static MVMuint64 unmanaged_size(MVMThreadContext *tc, MVMSTable *st, void *data) { MVMNFABody *body = (MVMNFABody *)data; MVMuint64 total; MVMint64 i; total = body->num_states * sizeof(MVMint64); /* for num_state_edges */ total += body->num_states * sizeof(MVMNFAStateInfo *); /* for states level 1 */ for (i = 0; i < body->num_states; i++) total += body->num_state_edges[i] * sizeof(MVMNFAStateInfo); return total; } /* Initializes the representation. */ const MVMREPROps * MVMNFA_initialize(MVMThreadContext *tc) { return &NFA_this_repr; } static const MVMREPROps NFA_this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ serialize, deserialize, NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "NFA", /* name */ MVM_REPR_ID_NFA, unmanaged_size, NULL, /* describe_refs */ }; /* We may be provided a grapheme as a codepoint for non-synthetics, or as a * 1-char string for synthetics. */ static MVMGrapheme32 get_grapheme(MVMThreadContext *tc, MVMObject *obj) { /* Handle null and non-concrete case. */ if (MVM_is_null(tc, obj) || !IS_CONCRETE(obj)) { MVM_exception_throw_adhoc(tc, "NFA must be provided with a concrete string or integer for graphemes"); } /* Otherwise, guess something appropriate. */ else { const MVMStorageSpec *ss = REPR(obj)->get_storage_spec(tc, STABLE(obj)); if (ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_INT) return REPR(obj)->box_funcs.get_int(tc, STABLE(obj), obj, OBJECT_BODY(obj)); else if (ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_STR) return MVM_string_get_grapheme_at(tc, REPR(obj)->box_funcs.get_str(tc, STABLE(obj), obj, OBJECT_BODY(obj)), 0); else MVM_exception_throw_adhoc(tc, "NFA must be provided with a string or integer for graphemes"); } } MVMObject * MVM_nfa_from_statelist(MVMThreadContext *tc, MVMObject *states, MVMObject *nfa_type) { MVMObject *nfa_obj; MVMNFABody *nfa; MVMint64 i, j, num_states; MVMROOT2(tc, states, nfa_type, { /* Create NFA object. */ nfa_obj = MVM_repr_alloc_init(tc, nfa_type); nfa = (MVMNFABody *)OBJECT_BODY(nfa_obj); /* The first state entry is the fates list. */ nfa->fates = MVM_repr_at_pos_o(tc, states, 0); /* Go over the rest and convert to the NFA. */ num_states = MVM_repr_elems(tc, states) - 1; nfa->num_states = num_states; if (num_states > 0) { nfa->num_state_edges = MVM_fixed_size_alloc_zeroed(tc, tc->instance->fsa, num_states * sizeof(MVMint64)); nfa->states = MVM_fixed_size_alloc_zeroed(tc, tc->instance->fsa, num_states * sizeof(MVMNFAStateInfo *)); } for (i = 0; i < num_states; i++) { MVMObject *edge_info = MVM_repr_at_pos_o(tc, states, i + 1); MVMint64 elems = MVM_repr_elems(tc, edge_info); MVMint64 edges = elems / 3; MVMint64 cur_edge = 0; nfa->num_state_edges[i] = edges; if (edges > 0) { nfa->states[i] = MVM_fixed_size_alloc(tc, tc->instance->fsa, edges * sizeof(MVMNFAStateInfo)); } for (j = 0; j < elems; j += 3) { MVMint64 act = MVM_coerce_simple_intify(tc, MVM_repr_at_pos_o(tc, edge_info, j)); MVMint64 to = MVM_coerce_simple_intify(tc, MVM_repr_at_pos_o(tc, edge_info, j + 2)); if (to <= 0 && act != MVM_NFA_EDGE_FATE) MVM_exception_throw_adhoc(tc, "Invalid to edge %"PRId64" in NFA statelist", to); nfa->states[i][cur_edge].act = act; nfa->states[i][cur_edge].to = to; switch (act & 0xff) { case MVM_NFA_EDGE_FATE: nfa->states[i][cur_edge].arg.i = MVM_coerce_simple_intify(tc, MVM_repr_at_pos_o(tc, edge_info, j + 1)); break; case MVM_NFA_EDGE_CODEPOINT: case MVM_NFA_EDGE_CODEPOINT_LL: case MVM_NFA_EDGE_CODEPOINT_NEG: case MVM_NFA_EDGE_CODEPOINT_M: case MVM_NFA_EDGE_CODEPOINT_M_NEG: nfa->states[i][cur_edge].arg.g = get_grapheme(tc, MVM_repr_at_pos_o(tc, edge_info, j + 1)); break; case MVM_NFA_EDGE_CHARCLASS: case MVM_NFA_EDGE_CHARCLASS_NEG: nfa->states[i][cur_edge].arg.i = MVM_coerce_simple_intify(tc, MVM_repr_at_pos_o(tc, edge_info, j + 1)); break; case MVM_NFA_EDGE_CHARLIST: case MVM_NFA_EDGE_CHARLIST_NEG: MVM_ASSIGN_REF(tc, &(nfa_obj->header), nfa->states[i][cur_edge].arg.s, MVM_repr_get_str(tc, MVM_repr_at_pos_o(tc, edge_info, j + 1))); break; case MVM_NFA_EDGE_CODEPOINT_I: case MVM_NFA_EDGE_CODEPOINT_I_LL: case MVM_NFA_EDGE_CODEPOINT_I_NEG: case MVM_NFA_EDGE_CODEPOINT_IM: case MVM_NFA_EDGE_CODEPOINT_IM_NEG: /* That is not about uppercase/lowercase here, but lower and upper bounds of our range. */ case MVM_NFA_EDGE_CHARRANGE: case MVM_NFA_EDGE_CHARRANGE_NEG: case MVM_NFA_EDGE_CHARRANGE_M: case MVM_NFA_EDGE_CHARRANGE_M_NEG: { MVMObject *arg = MVM_repr_at_pos_o(tc, edge_info, j + 1); nfa->states[i][cur_edge].arg.uclc.lc = MVM_coerce_simple_intify(tc, MVM_repr_at_pos_o(tc, arg, 0)); nfa->states[i][cur_edge].arg.uclc.uc = MVM_coerce_simple_intify(tc, MVM_repr_at_pos_o(tc, arg, 1)); break; } } cur_edge++; } } }); return nfa_obj; } /* Does a run of the NFA. Produces a list of integers indicating the * chosen ordering. */ static MVMint32 in_done(MVMuint32 *done, MVMuint32 numdone, MVMuint32 st) { MVMuint32 i = 0; for (i = 0; i < numdone; i++) if (done[i] == st) return 1; return 0; } static MVMint64 * nqp_nfa_run(MVMThreadContext *tc, MVMNFABody *nfa, MVMString *target, MVMint64 offset, MVMint64 *total_fates_out) { MVMint64 eos = MVM_string_graphs(tc, target); MVMuint32 gen = 1; MVMint64 numcur = 0; MVMint64 numnext = 0; MVMint64 numdone = 0; MVMuint32 *done, *curst, *nextst; MVMint64 *fates, *longlit; MVMint64 i, fate_arr_len, num_states, total_fates, prev_fates, usedlonglit; MVMint64 orig_offset = offset; int nfadeb = tc->instance->nfa_debug_enabled; /* Obtain or (re)allocate "done states", "current states" and "next * states" arrays. */ num_states = nfa->num_states; if (tc->nfa_alloc_states < num_states) { size_t alloc = (num_states + 1) * sizeof(MVMuint32); tc->nfa_done = (MVMuint32 *)MVM_realloc(tc->nfa_done, alloc); tc->nfa_curst = (MVMuint32 *)MVM_realloc(tc->nfa_curst, alloc); tc->nfa_nextst = (MVMuint32 *)MVM_realloc(tc->nfa_nextst, alloc); tc->nfa_alloc_states = num_states; } done = tc->nfa_done; curst = tc->nfa_curst; nextst = tc->nfa_nextst; /* Allocate fates array. */ fate_arr_len = 1 + MVM_repr_elems(tc, nfa->fates); if (tc->nfa_fates_len < fate_arr_len) { tc->nfa_fates = (MVMint64 *)MVM_realloc(tc->nfa_fates, sizeof(MVMint64) * fate_arr_len); tc->nfa_fates_len = fate_arr_len; } fates = tc->nfa_fates; total_fates = 0; if (nfadeb) fprintf(stderr,"======================================\nStarting with %d fates in %d states\n", (int)fate_arr_len, (int)num_states) ; /* longlit will be updated on a fate whenever NFA passes through final char of a literal. */ /* These edges are specially marked to indicate which fate they influence the fate of. */ if (tc->nfa_longlit_len < fate_arr_len) { tc->nfa_longlit = (MVMint64 *)MVM_realloc(tc->nfa_longlit, sizeof(MVMint64) * fate_arr_len); tc->nfa_longlit_len = fate_arr_len; } longlit = tc->nfa_longlit; usedlonglit = 0; nextst[numnext++] = 1; while (numnext && offset <= eos) { /* Swap next and current */ MVMuint32 *temp = curst; curst = nextst; nextst = temp; numcur = numnext; numnext = 0; numdone = 0; /* Save how many fates we have before this position is considered. */ prev_fates = total_fates; if (nfadeb) { if (offset < eos) { MVMGrapheme32 cp = MVM_string_get_grapheme_at_nocheck(tc, target, offset); fprintf(stderr,"%c with %ds target %lx offset %"PRId64"\n",cp,(int)numcur, (long)target, offset); } else { fprintf(stderr,"EOS with %ds\n",(int)numcur); } } while (numcur) { MVMNFAStateInfo *edge_info; MVMint64 edge_info_elems; MVMint64 st = curst[--numcur]; if (st <= num_states) { if (in_done(done, numdone, st)) continue; done[numdone++] = st; } edge_info = nfa->states[st - 1]; edge_info_elems = nfa->num_state_edges[st - 1]; if (nfadeb) fprintf(stderr,"\t%d\t%d\t",(int)st, (int)edge_info_elems); for (i = 0; i < edge_info_elems; i++) { MVMint64 act = edge_info[i].act; MVMint64 to = edge_info[i].to; /* All the special cases are under one test. */ if (act <= MVM_NFA_EDGE_EPSILON) { if (act < 0) { /* Negative indicates a fate is encoded in the act of the codepoint edge. */ /* These will redispatch to one of the _LL cases below */ act &= 0xff; } else if (act == MVM_NFA_EDGE_FATE) { /* Crossed a fate edge. Check if we already saw this fate, and * if so remove the entry so we can re-add at the new token length. */ MVMint64 arg = edge_info[i].arg.i; MVMint64 j; MVMint64 found_fate = 0; if (nfadeb) fprintf(stderr, "fate(%016llx) ", (long long unsigned int)arg); for (j = 0; j < total_fates; j++) { if (found_fate) fates[j - found_fate] = fates[j]; if ((fates[j] & 0xffffff) == arg) { found_fate++; if (j < prev_fates) prev_fates--; } } total_fates -= found_fate; if (arg < usedlonglit) arg -= longlit[arg] << 24; if (++total_fates > fate_arr_len) { /* should never happen if nfa->fates is correct and dedup above works right */ fprintf(stderr, "oops adding %016llx to\n", (long long unsigned int)arg); for (j = 0; j < total_fates - 1; j++) { fprintf(stderr, " %016llx\n", (long long unsigned int)fates[j]); } fate_arr_len = total_fates + 10; tc->nfa_fates = (MVMint64 *)MVM_realloc(tc->nfa_fates, sizeof(MVMint64) * fate_arr_len); tc->nfa_fates_len = fate_arr_len; fates = tc->nfa_fates; } /* a small insertion sort */ j = total_fates - 1; while (--j >= prev_fates && fates[j] < arg) { fates[j + 1] = fates[j]; } fates[++j] = arg; continue; } else if (act == MVM_NFA_EDGE_EPSILON && to <= num_states && !in_done(done, numdone, to)) { if (to) curst[numcur++] = to; else if (nfadeb) /* XXX should turn into a "can't happen" after rebootstrap */ fprintf(stderr, " oops, ignoring epsilon to 0\n"); continue; } } if (offset >= eos) { /* Can't match, so drop state. */ continue; } else { switch (act) { case MVM_NFA_EDGE_CODEPOINT_LL: { MVMGrapheme32 arg = edge_info[i].arg.g; if (MVM_string_get_grapheme_at_nocheck(tc, target, offset) == arg) { MVMint64 fate = (edge_info[i].act >> 8) & 0xfffff; nextst[numnext++] = to; while (usedlonglit <= fate) longlit[usedlonglit++] = 0; longlit[fate] = offset - orig_offset + 1; if (nfadeb) fprintf(stderr, "%d->%d ", (int)i, (int)to); } continue; } case MVM_NFA_EDGE_CODEPOINT: { MVMGrapheme32 arg = edge_info[i].arg.g; if (MVM_string_get_grapheme_at_nocheck(tc, target, offset) == arg) { nextst[numnext++] = to; if (nfadeb) fprintf(stderr, "%d->%d ", (int)i, (int)to); } continue; } case MVM_NFA_EDGE_CODEPOINT_NEG: { MVMGrapheme32 arg = edge_info[i].arg.g; if (MVM_string_get_grapheme_at_nocheck(tc, target, offset) != arg) nextst[numnext++] = to; continue; } case MVM_NFA_EDGE_CHARCLASS: { MVMint64 arg = edge_info[i].arg.i; if (MVM_string_is_cclass(tc, arg, target, offset)) nextst[numnext++] = to; continue; } case MVM_NFA_EDGE_CHARCLASS_NEG: { MVMint64 arg = edge_info[i].arg.i; if (!MVM_string_is_cclass(tc, arg, target, offset)) nextst[numnext++] = to; continue; } case MVM_NFA_EDGE_CHARLIST: { MVMString *arg = edge_info[i].arg.s; MVMGrapheme32 cp = MVM_string_get_grapheme_at_nocheck(tc, target, offset); if (MVM_string_index_of_grapheme(tc, arg, cp) >= 0) nextst[numnext++] = to; continue; } case MVM_NFA_EDGE_CHARLIST_NEG: { MVMString *arg = edge_info[i].arg.s; MVMGrapheme32 cp = MVM_string_get_grapheme_at_nocheck(tc, target, offset); if (MVM_string_index_of_grapheme(tc, arg, cp) < 0) nextst[numnext++] = to; continue; } case MVM_NFA_EDGE_CODEPOINT_I_LL: { MVMGrapheme32 uc_arg = edge_info[i].arg.uclc.uc; MVMGrapheme32 lc_arg = edge_info[i].arg.uclc.lc; MVMGrapheme32 ord = MVM_string_get_grapheme_at_nocheck(tc, target, offset); if (ord == lc_arg || ord == uc_arg) { MVMint64 fate = (edge_info[i].act >> 8) & 0xfffff; nextst[numnext++] = to; while (usedlonglit <= fate) longlit[usedlonglit++] = 0; longlit[fate] = offset - orig_offset + 1; } continue; } case MVM_NFA_EDGE_CODEPOINT_I: { MVMGrapheme32 uc_arg = edge_info[i].arg.uclc.uc; MVMGrapheme32 lc_arg = edge_info[i].arg.uclc.lc; MVMGrapheme32 ord = MVM_string_get_grapheme_at_nocheck(tc, target, offset); if (ord == lc_arg || ord == uc_arg) nextst[numnext++] = to; continue; } case MVM_NFA_EDGE_CODEPOINT_I_NEG: { MVMGrapheme32 uc_arg = edge_info[i].arg.uclc.uc; MVMGrapheme32 lc_arg = edge_info[i].arg.uclc.lc; MVMGrapheme32 ord = MVM_string_get_grapheme_at_nocheck(tc, target, offset); if (ord != lc_arg && ord != uc_arg) nextst[numnext++] = to; continue; } case MVM_NFA_EDGE_CHARRANGE: { MVMGrapheme32 uc_arg = edge_info[i].arg.uclc.uc; MVMGrapheme32 lc_arg = edge_info[i].arg.uclc.lc; MVMGrapheme32 ord = MVM_string_get_grapheme_at_nocheck(tc, target, offset); if (ord >= lc_arg && ord <= uc_arg) nextst[numnext++] = to; continue; } case MVM_NFA_EDGE_CHARRANGE_NEG: { MVMGrapheme32 uc_arg = edge_info[i].arg.uclc.uc; MVMGrapheme32 lc_arg = edge_info[i].arg.uclc.lc; MVMGrapheme32 ord = MVM_string_get_grapheme_at_nocheck(tc, target, offset); if (ord < lc_arg || ord > uc_arg) nextst[numnext++] = to; continue; } case MVM_NFA_EDGE_SUBRULE: if (nfadeb) fprintf(stderr, "IGNORING SUBRULE\n"); continue; case MVM_NFA_EDGE_CODEPOINT_M: case MVM_NFA_EDGE_CODEPOINT_M_NEG: { MVMNormalizer norm; MVMint32 ready; MVMGrapheme32 ga = edge_info[i].arg.g; MVMGrapheme32 gb = MVM_string_ord_basechar_at(tc, target, offset); MVM_unicode_normalizer_init(tc, &norm, MVM_NORMALIZE_NFD); ready = MVM_unicode_normalizer_process_codepoint_to_grapheme(tc, &norm, ga, &ga); MVM_unicode_normalizer_eof(tc, &norm); if (!ready) ga = MVM_unicode_normalizer_get_grapheme(tc, &norm); if (((act == MVM_NFA_EDGE_CODEPOINT_M) && (ga == gb)) || ((act == MVM_NFA_EDGE_CODEPOINT_M_NEG) && (ga != gb))) nextst[numnext++] = to; MVM_unicode_normalizer_cleanup(tc, &norm); continue; } case MVM_NFA_EDGE_CODEPOINT_IM: case MVM_NFA_EDGE_CODEPOINT_IM_NEG: { MVMNormalizer norm; MVMint32 ready; MVMGrapheme32 uc_arg = edge_info[i].arg.uclc.uc; MVMGrapheme32 lc_arg = edge_info[i].arg.uclc.lc; MVMGrapheme32 ord = MVM_string_ord_basechar_at(tc, target, offset); MVM_unicode_normalizer_init(tc, &norm, MVM_NORMALIZE_NFD); ready = MVM_unicode_normalizer_process_codepoint_to_grapheme(tc, &norm, uc_arg, &uc_arg); MVM_unicode_normalizer_eof(tc, &norm); if (!ready) uc_arg = MVM_unicode_normalizer_get_grapheme(tc, &norm); MVM_unicode_normalizer_cleanup(tc, &norm); MVM_unicode_normalizer_init(tc, &norm, MVM_NORMALIZE_NFD); ready = MVM_unicode_normalizer_process_codepoint_to_grapheme(tc, &norm, lc_arg, &lc_arg); MVM_unicode_normalizer_eof(tc, &norm); if (!ready) lc_arg = MVM_unicode_normalizer_get_grapheme(tc, &norm); if (((act == MVM_NFA_EDGE_CODEPOINT_IM) && (ord == lc_arg || ord == uc_arg)) || ((act == MVM_NFA_EDGE_CODEPOINT_IM_NEG) && (ord != lc_arg && ord != uc_arg))) nextst[numnext++] = to; MVM_unicode_normalizer_cleanup(tc, &norm); continue; } case MVM_NFA_EDGE_CHARRANGE_M: { MVMGrapheme32 uc_arg = edge_info[i].arg.uclc.uc; MVMGrapheme32 lc_arg = edge_info[i].arg.uclc.lc; MVMGrapheme32 ord = MVM_string_ord_basechar_at(tc, target, offset); if (ord >= lc_arg && ord <= uc_arg) nextst[numnext++] = to; continue; } case MVM_NFA_EDGE_CHARRANGE_M_NEG: { MVMGrapheme32 uc_arg = edge_info[i].arg.uclc.uc; MVMGrapheme32 lc_arg = edge_info[i].arg.uclc.lc; MVMGrapheme32 ord = MVM_string_ord_basechar_at(tc, target, offset); if (ord < lc_arg || ord > uc_arg) nextst[numnext++] = to; continue; } } } } if (nfadeb) fprintf(stderr,"\n"); } /* Move to next character and generation. */ offset++; gen++; } /* strip any literal lengths, leaving only fates */ if (usedlonglit || nfadeb) { if (nfadeb) fprintf(stderr,"Final\n"); for (i = 0; i < total_fates; i++) { if (nfadeb) fprintf(stderr, " %08llx\n", (long long unsigned int)fates[i]); fates[i] &= 0xffffff; } } *total_fates_out = total_fates; return fates; } /* Takes an NFA, a target string in and an offset. Runs the NFA and returns * the order to try the fates in. */ MVMObject * MVM_nfa_run_proto(MVMThreadContext *tc, MVMObject *nfa, MVMString *target, MVMint64 offset) { /* Run the NFA. */ MVMint64 total_fates, i; MVMint64 *fates = nqp_nfa_run(tc, (MVMNFABody *)OBJECT_BODY(nfa), target, offset, &total_fates); /* Copy results into an integer array. */ MVMObject *fateres = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTIntArray); for (i = 0; i < total_fates; i++) MVM_repr_bind_pos_i(tc, fateres, i, fates[i]); return fateres; } /* Takes an NFA, target string and offset. Runs the NFA, and uses the output * to update the bstack with backtracking points to try the alternation * branches in the correct order. The current capture stack is needed for its * height. */ void MVM_nfa_run_alt(MVMThreadContext *tc, MVMObject *nfa, MVMString *target, MVMint64 offset, MVMObject *bstack, MVMObject *cstack, MVMObject *labels) { /* Run the NFA. */ MVMint64 total_fates, i; MVMint64 *fates = nqp_nfa_run(tc, (MVMNFABody *)OBJECT_BODY(nfa), target, offset, &total_fates); /* Push the results onto the bstack. */ MVMint64 caps = cstack && IS_CONCRETE(cstack) ? MVM_repr_elems(tc, cstack) : 0; for (i = 0; i < total_fates; i++) { MVM_repr_push_i(tc, bstack, MVM_repr_at_pos_i(tc, labels, fates[i])); MVM_repr_push_i(tc, bstack, offset); MVM_repr_push_i(tc, bstack, 0); MVM_repr_push_i(tc, bstack, caps); } } MoarVM-2018.03/src/6model/reprs/NFA.h0000644000175000017510000000375113237701240017075 0ustar samanthasamantha/* NFA constants. */ #define MVM_NFA_EDGE_FATE 0 #define MVM_NFA_EDGE_EPSILON 1 #define MVM_NFA_EDGE_CODEPOINT 2 #define MVM_NFA_EDGE_CODEPOINT_NEG 3 #define MVM_NFA_EDGE_CHARCLASS 4 #define MVM_NFA_EDGE_CHARCLASS_NEG 5 #define MVM_NFA_EDGE_CHARLIST 6 #define MVM_NFA_EDGE_CHARLIST_NEG 7 #define MVM_NFA_EDGE_SUBRULE 8 #define MVM_NFA_EDGE_CODEPOINT_I 9 #define MVM_NFA_EDGE_CODEPOINT_I_NEG 10 #define MVM_NFA_EDGE_GENERIC_VAR 11 #define MVM_NFA_EDGE_CHARRANGE 12 #define MVM_NFA_EDGE_CHARRANGE_NEG 13 #define MVM_NFA_EDGE_CODEPOINT_LL 14 #define MVM_NFA_EDGE_CODEPOINT_I_LL 15 #define MVM_NFA_EDGE_CODEPOINT_M 16 #define MVM_NFA_EDGE_CODEPOINT_M_NEG 17 #define MVM_NFA_EDGE_CODEPOINT_M_LL 18 #define MVM_NFA_EDGE_CODEPOINT_IM 19 #define MVM_NFA_EDGE_CODEPOINT_IM_NEG 20 #define MVM_NFA_EDGE_CODEPOINT_IM_LL 21 #define MVM_NFA_EDGE_CHARRANGE_M 22 #define MVM_NFA_EDGE_CHARRANGE_M_NEG 23 /* State entry. */ struct MVMNFAStateInfo { MVMint64 act; MVMint64 to; union { MVMGrapheme32 g; MVMint64 i; MVMString *s; struct { MVMGrapheme32 uc; MVMGrapheme32 lc; } uclc; } arg; }; /* Body of an NFA. */ struct MVMNFABody { MVMObject *fates; MVMint64 num_states; MVMint64 *num_state_edges; MVMNFAStateInfo **states; }; struct MVMNFA { MVMObject common; MVMNFABody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMNFA_initialize(MVMThreadContext *tc); /* Other NFA related functions. */ MVMObject * MVM_nfa_from_statelist(MVMThreadContext *tc, MVMObject *states, MVMObject *nfa_type); MVMObject * MVM_nfa_run_proto(MVMThreadContext *tc, MVMObject *nfa, MVMString *target, MVMint64 offset); void MVM_nfa_run_alt(MVMThreadContext *tc, MVMObject *nfa, MVMString *target, MVMint64 offset, MVMObject *bstack, MVMObject *cstack, MVMObject *labels); MoarVM-2018.03/src/6model/reprs/NativeCall.c0000644000175000017510000001135513237701240020505 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps NativeCall_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. Also sets the invocation protocol handler in the STable. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &NativeCall_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMNativeCall); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMNativeCallBody *src_body = (MVMNativeCallBody *)src; MVMNativeCallBody *dest_body = (MVMNativeCallBody *)dest; /* Need a fresh handle for resource management purposes. */ if (src_body->lib_name) { dest_body->lib_name = MVM_malloc(strlen(src_body->lib_name) + 1); strcpy(dest_body->lib_name, src_body->lib_name); dest_body->lib_handle = MVM_nativecall_load_lib(dest_body->lib_name); } /* Rest is just simple copying. */ dest_body->entry_point = src_body->entry_point; dest_body->convention = src_body->convention; dest_body->num_args = src_body->num_args; if (src_body->arg_types) { dest_body->arg_types = MVM_malloc(sizeof(MVMint16) * (src_body->num_args ? src_body->num_args : 1)); memcpy(dest_body->arg_types, src_body->arg_types, src_body->num_args * sizeof(MVMint16)); } dest_body->ret_type = src_body->ret_type; dest_body->jitcode = src_body->jitcode; } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_INLINED, /* inlineable */ sizeof(MVMNativeCallBody) * 8, /* bits */ ALIGNOF(MVMNativeCallBody), /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* We can't actually serialize the handle, but since this REPR gets inlined * we just do nothing here since it may well have never been opened. Various * more involved approaches are possible. */ static void serialize(MVMThreadContext *tc, MVMSTable *st, void *data, MVMSerializationWriter *writer) { } static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMNativeCall); } static void deserialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMSerializationReader *reader) { } static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMNativeCallBody *body = (MVMNativeCallBody *)data; if (body->arg_info) { MVMint16 i; for (i = 0; i < body->num_args; i++) if (body->arg_info[i]) MVM_gc_worklist_add(tc, worklist, &body->arg_info[i]); } } static void gc_cleanup(MVMThreadContext *tc, MVMSTable *st, void *data) { MVMNativeCallBody *body = (MVMNativeCallBody *)data; if (body->lib_name) MVM_free(body->lib_name); if (body->lib_handle) MVM_nativecall_free_lib(body->lib_handle); if (body->arg_types) MVM_free(body->arg_types); if (body->arg_info) MVM_free(body->arg_info); if (body->jitcode) MVM_jit_destroy_code(tc, body->jitcode); } static void gc_free(MVMThreadContext *tc, MVMObject *obj) { gc_cleanup(tc, STABLE(obj), OBJECT_BODY(obj)); } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Initializes the representation. */ const MVMREPROps * MVMNativeCall_initialize(MVMThreadContext *tc) { return &NativeCall_this_repr; } static const MVMREPROps NativeCall_this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ serialize, deserialize, NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, gc_mark, gc_free, gc_cleanup, NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "NativeCall", /* name */ MVM_REPR_ID_MVMNativeCall, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; MoarVM-2018.03/src/6model/reprs/NativeCall.h0000644000175000017510000000117613237701240020512 0ustar samanthasamantha/* Representation for a native callsite. */ struct MVMNativeCallBody { char *lib_name; DLLib *lib_handle; char *sym_name; void *entry_point; #ifdef HAVE_LIBFFI ffi_abi convention; ffi_type **ffi_arg_types; ffi_type *ffi_ret_type; #else MVMint16 convention; #endif MVMint16 num_args; MVMint16 ret_type; MVMint16 *arg_types; MVMObject **arg_info; MVMJitCode *jitcode; }; struct MVMNativeCall { MVMObject common; MVMNativeCallBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMNativeCall_initialize(MVMThreadContext *tc); MoarVM-2018.03/src/6model/reprs/NativeRef.c0000644000175000017510000006607313242626641020364 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps NativeRef_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &NativeRef_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMNativeRef); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "Cannot copy object with repr MVMNativeRef"); } /* Set the size of objects on the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMNativeRef); } /* Serializes the REPR data. */ static void serialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationWriter *writer) { MVMNativeRefREPRData *repr_data = (MVMNativeRefREPRData *)st->REPR_data; if (repr_data) { MVM_serialization_write_int(tc, writer, repr_data->primitive_type); MVM_serialization_write_int(tc, writer, repr_data->ref_kind); } else { MVM_serialization_write_int(tc, writer, 0); MVM_serialization_write_int(tc, writer, 0); } } /* Deserializes REPR data. */ static void deserialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { MVMNativeRefREPRData *repr_data = MVM_malloc(sizeof(MVMNativeRefREPRData)); repr_data->primitive_type = MVM_serialization_read_int(tc, reader); repr_data->ref_kind = MVM_serialization_read_int(tc, reader); st->REPR_data = repr_data; } /* Called by the VM to mark any GCable items. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMNativeRefBody *ref = (MVMNativeRefBody *)data; MVMNativeRefREPRData *repr_data = (MVMNativeRefREPRData *)st->REPR_data; switch (repr_data->ref_kind) { case MVM_NATIVEREF_LEX: MVM_gc_worklist_add(tc, worklist, &ref->u.lex.frame); break; case MVM_NATIVEREF_ATTRIBUTE: MVM_gc_worklist_add(tc, worklist, &ref->u.attribute.obj); MVM_gc_worklist_add(tc, worklist, &ref->u.attribute.class_handle); MVM_gc_worklist_add(tc, worklist, &ref->u.attribute.name); break; case MVM_NATIVEREF_POSITIONAL: MVM_gc_worklist_add(tc, worklist, &ref->u.positional.obj); break; case MVM_NATIVEREF_MULTIDIM: MVM_gc_worklist_add(tc, worklist, &ref->u.multidim.obj); MVM_gc_worklist_add(tc, worklist, &ref->u.multidim.indices); break; } } /* Frees the representation data, if any. */ static void gc_free_repr_data(MVMThreadContext *tc, MVMSTable *st) { MVM_free(st->REPR_data); } /* Gets the storage specification for this representation. */ static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info_hash) { MVMStringConsts *str_consts = &(tc->instance->str_consts); MVMObject *info = MVM_repr_at_key_o(tc, info_hash, str_consts->nativeref); if (IS_CONCRETE(info)) { MVMObject *type = MVM_repr_at_key_o(tc, info, str_consts->type); MVMuint16 prim = REPR(type)->get_storage_spec(tc, STABLE(type))->boxed_primitive; if (prim != MVM_STORAGE_SPEC_BP_NONE) { MVMObject *refkind = MVM_repr_at_key_o(tc, info, str_consts->refkind); if (IS_CONCRETE(refkind)) { MVMNativeRefREPRData *repr_data; MVMuint16 kind; MVMString *refkind_s = MVM_repr_get_str(tc, refkind); if (MVM_string_equal(tc, refkind_s, str_consts->lexical)) { kind = MVM_NATIVEREF_LEX; } else if (MVM_string_equal(tc, refkind_s, str_consts->attribute)) { kind = MVM_NATIVEREF_ATTRIBUTE; } else if (MVM_string_equal(tc, refkind_s, str_consts->positional)) { kind = MVM_NATIVEREF_POSITIONAL; } else if (MVM_string_equal(tc, refkind_s, str_consts->multidim)) { kind = MVM_NATIVEREF_MULTIDIM; } else { MVM_exception_throw_adhoc(tc, "NativeRef: invalid refkind in compose"); } repr_data = MVM_malloc(sizeof(MVMNativeRefREPRData)); repr_data->primitive_type = prim; repr_data->ref_kind = kind; st->REPR_data = repr_data; } else { MVM_exception_throw_adhoc(tc, "NativeRef: missing refkind in compose"); } } else { MVM_exception_throw_adhoc(tc, "NativeRef: non-native type supplied in compose"); } } else { MVM_exception_throw_adhoc(tc, "NativeRef: missing nativeref protocol in compose"); } } /* Initializes the representation. */ const MVMREPROps * MVMNativeRef_initialize(MVMThreadContext *tc) { return &NativeRef_this_repr; } static void spesh(MVMThreadContext *tc, MVMSTable *st, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMNativeRefREPRData * repr_data = (MVMNativeRefREPRData *)st->REPR_data; MVMuint16 opcode = ins->info->opcode; if (!repr_data) return; /* TODO re-implement spesh for this; lost due to native ref refactors */ } static const MVMREPROps NativeRef_this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ serialize_repr_data, deserialize_repr_data, deserialize_stable_size, gc_mark, NULL, /* gc_free */ NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ gc_free_repr_data, compose, spesh, /* spesh */ "NativeRef", /* name */ MVM_REPR_ID_NativeRef, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; /* Validates the given type is a native reference of the required primitive * type and reference kind. */ void MVM_nativeref_ensure(MVMThreadContext *tc, MVMObject *type, MVMuint16 wantprim, MVMuint16 wantkind, char *guilty) { if (REPR(type)->ID == MVM_REPR_ID_NativeRef) { MVMNativeRefREPRData *repr_data = (MVMNativeRefREPRData *)STABLE(type)->REPR_data; if (!repr_data) MVM_exception_throw_adhoc(tc, "%s set to NativeRef that is not yet composed", guilty); if (repr_data->primitive_type != wantprim) MVM_exception_throw_adhoc(tc, "%s set to NativeRef of wrong primitive type", guilty); if (repr_data->ref_kind != wantkind) MVM_exception_throw_adhoc(tc, "%s set to NativeRef of wrong reference kind", guilty); } else { MVM_exception_throw_adhoc(tc, "%s requires a type with REPR NativeRef", guilty); } } /* Creation of native references for lexicals. */ static MVMObject * lex_ref(MVMThreadContext *tc, MVMObject *type, MVMFrame *f, MVMuint16 env_idx, MVMuint16 reg_type) { MVMNativeRef *ref; MVMROOT(tc, f, { ref = (MVMNativeRef *)MVM_gc_allocate_object(tc, STABLE(type)); }); MVM_ASSIGN_REF(tc, &(ref->common.header), ref->body.u.lex.frame, f); ref->body.u.lex.env_idx = env_idx; ref->body.u.lex.type = reg_type; return (MVMObject *)ref; } /* Creation of native references for lexicals. */ static MVMFrame * get_lexical_outer(MVMThreadContext *tc, MVMuint16 outers) { MVMFrame *f = tc->cur_frame; while (outers) { if (!f) MVM_exception_throw_adhoc(tc, "getlexref_*: outer index out of range"); f = f->outer; outers--; } return f; } MVMObject * MVM_nativeref_lex_i(MVMThreadContext *tc, MVMuint16 outers, MVMuint16 idx) { MVMObject *ref_type; MVM_frame_force_to_heap(tc, tc->cur_frame); ref_type = MVM_hll_current(tc)->int_lex_ref; if (ref_type) { MVMFrame *f = get_lexical_outer(tc, outers); MVMuint16 *lexical_types = f->spesh_cand && f->spesh_cand->lexical_types ? f->spesh_cand->lexical_types : f->static_info->body.lexical_types; MVMuint16 type = lexical_types[idx]; if (type != MVM_reg_int64 && type != MVM_reg_int32 && type != MVM_reg_int16 && type != MVM_reg_int8 && type != MVM_reg_uint64 && type != MVM_reg_uint32 && type != MVM_reg_uint16 && type != MVM_reg_uint8) MVM_exception_throw_adhoc(tc, "getlexref_i: lexical is not an int"); return lex_ref(tc, ref_type, f, idx, type); } MVM_exception_throw_adhoc(tc, "No int lexical reference type registered for current HLL"); } MVMObject * MVM_nativeref_lex_n(MVMThreadContext *tc, MVMuint16 outers, MVMuint16 idx) { MVMObject *ref_type; MVM_frame_force_to_heap(tc, tc->cur_frame); ref_type = MVM_hll_current(tc)->num_lex_ref; if (ref_type) { MVMFrame *f = get_lexical_outer(tc, outers); MVMuint16 *lexical_types = f->spesh_cand && f->spesh_cand->lexical_types ? f->spesh_cand->lexical_types : f->static_info->body.lexical_types; MVMuint16 type = lexical_types[idx]; if (type != MVM_reg_num64 && type != MVM_reg_num32) MVM_exception_throw_adhoc(tc, "getlexref_n: lexical is not a num"); return lex_ref(tc, ref_type, f, idx, type); } MVM_exception_throw_adhoc(tc, "No num lexical reference type registered for current HLL"); } MVMObject * MVM_nativeref_lex_s(MVMThreadContext *tc, MVMuint16 outers, MVMuint16 idx) { MVMObject *ref_type; MVM_frame_force_to_heap(tc, tc->cur_frame); ref_type = MVM_hll_current(tc)->str_lex_ref; if (ref_type) { MVMFrame *f = get_lexical_outer(tc, outers); MVMuint16 *lexical_types = f->spesh_cand && f->spesh_cand->lexical_types ? f->spesh_cand->lexical_types : f->static_info->body.lexical_types; if (lexical_types[idx] != MVM_reg_str) MVM_exception_throw_adhoc(tc, "getlexref_s: lexical is not a str (%d, %d)", outers, idx); return lex_ref(tc, ref_type, f, idx, MVM_reg_str); } MVM_exception_throw_adhoc(tc, "No str lexical reference type registered for current HLL"); } static MVMObject * lexref_by_name(MVMThreadContext *tc, MVMObject *type, MVMString *name, MVMuint16 kind) { MVMFrame *cur_frame = tc->cur_frame; while (cur_frame != NULL) { MVMLexicalRegistry *lexical_names = cur_frame->static_info->body.lexical_names; if (lexical_names) { MVMLexicalRegistry *entry; MVM_HASH_GET(tc, lexical_names, name, entry) if (entry) { if (cur_frame->static_info->body.lexical_types[entry->value] == kind) { return lex_ref(tc, type, cur_frame, entry->value, kind); } else { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Lexical with name '%s' has wrong type", c_name); } } } cur_frame = cur_frame->outer; } { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "No lexical found with name '%s'", c_name); } } MVMObject * MVM_nativeref_lex_name_i(MVMThreadContext *tc, MVMString *name) { MVMObject *ref_type; MVMROOT(tc, name, { MVM_frame_force_to_heap(tc, tc->cur_frame); }); ref_type = MVM_hll_current(tc)->int_lex_ref; if (ref_type) return lexref_by_name(tc, ref_type, name, MVM_reg_int64); MVM_exception_throw_adhoc(tc, "No int lexical reference type registered for current HLL"); } MVMObject * MVM_nativeref_lex_name_n(MVMThreadContext *tc, MVMString *name) { MVMObject *ref_type; MVMROOT(tc, name, { MVM_frame_force_to_heap(tc, tc->cur_frame); }); ref_type = MVM_hll_current(tc)->num_lex_ref; if (ref_type) return lexref_by_name(tc, ref_type, name, MVM_reg_num64); MVM_exception_throw_adhoc(tc, "No num lexical reference type registered for current HLL"); } MVMObject * MVM_nativeref_lex_name_s(MVMThreadContext *tc, MVMString *name) { MVMObject *ref_type; MVMROOT(tc, name, { MVM_frame_force_to_heap(tc, tc->cur_frame); }); ref_type = MVM_hll_current(tc)->str_lex_ref; if (ref_type) return lexref_by_name(tc, ref_type, name, MVM_reg_str); MVM_exception_throw_adhoc(tc, "No str lexical reference type registered for current HLL"); } /* Creation of native references for attributes. */ static MVMObject * attrref(MVMThreadContext *tc, MVMObject *type, MVMObject *obj, MVMObject *class_handle, MVMString *name) { MVMNativeRef *ref; MVMROOT3(tc, obj, class_handle, name, { ref = (MVMNativeRef *)MVM_gc_allocate_object(tc, STABLE(type)); MVM_ASSIGN_REF(tc, &(ref->common.header), ref->body.u.attribute.obj, obj); MVM_ASSIGN_REF(tc, &(ref->common.header), ref->body.u.attribute.class_handle, class_handle); MVM_ASSIGN_REF(tc, &(ref->common.header), ref->body.u.attribute.name, name); }); return (MVMObject *)ref; } MVMObject * MVM_nativeref_attr_i(MVMThreadContext *tc, MVMObject *obj, MVMObject *class_handle, MVMString *name) { MVMObject *ref_type = MVM_hll_current(tc)->int_attr_ref; if (ref_type) return attrref(tc, ref_type, obj, class_handle, name); MVM_exception_throw_adhoc(tc, "No int attribute reference type registered for current HLL"); } MVMObject * MVM_nativeref_attr_n(MVMThreadContext *tc, MVMObject *obj, MVMObject *class_handle, MVMString *name) { MVMObject *ref_type = MVM_hll_current(tc)->num_attr_ref; if (ref_type) return attrref(tc, ref_type, obj, class_handle, name); MVM_exception_throw_adhoc(tc, "No num attribute reference type registered for current HLL"); } MVMObject * MVM_nativeref_attr_s(MVMThreadContext *tc, MVMObject *obj, MVMObject *class_handle, MVMString *name) { MVMObject *ref_type = MVM_hll_current(tc)->str_attr_ref; if (ref_type) return attrref(tc, ref_type, obj, class_handle, name); MVM_exception_throw_adhoc(tc, "No str attribute reference type registered for current HLL"); } /* Creation of native references for positionals. */ static MVMObject * posref(MVMThreadContext *tc, MVMObject *type, MVMObject *obj, MVMint64 idx) { MVMNativeRef *ref; MVMROOT(tc, obj, { ref = (MVMNativeRef *)MVM_gc_allocate_object(tc, STABLE(type)); MVM_ASSIGN_REF(tc, &(ref->common.header), ref->body.u.positional.obj, obj); ref->body.u.positional.idx = idx; }); return (MVMObject *)ref; } MVMObject * MVM_nativeref_pos_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx) { MVMObject *ref_type = MVM_hll_current(tc)->int_pos_ref; if (ref_type) return posref(tc, ref_type, obj, idx); MVM_exception_throw_adhoc(tc, "No int positional reference type registered for current HLL"); } MVMObject * MVM_nativeref_pos_n(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx) { MVMObject *ref_type = MVM_hll_current(tc)->num_pos_ref; if (ref_type) return posref(tc, ref_type, obj, idx); MVM_exception_throw_adhoc(tc, "No num positional reference type registered for current HLL"); } MVMObject * MVM_nativeref_pos_s(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx) { MVMObject *ref_type = MVM_hll_current(tc)->str_pos_ref; if (ref_type) return posref(tc, ref_type, obj, idx); MVM_exception_throw_adhoc(tc, "No str positional reference type registered for current HLL"); } /* Creation of native references for multi-dimensional positionals. */ static MVMObject * md_posref(MVMThreadContext *tc, MVMObject *type, MVMObject *obj, MVMObject *indices) { MVMNativeRef *ref; MVMROOT2(tc, obj, indices, { ref = (MVMNativeRef *)MVM_gc_allocate_object(tc, STABLE(type)); MVM_ASSIGN_REF(tc, &(ref->common.header), ref->body.u.multidim.obj, obj); MVM_ASSIGN_REF(tc, &(ref->common.header), ref->body.u.multidim.indices, indices); }); return (MVMObject *)ref; } MVMObject * MVM_nativeref_multidim_i(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices) { MVMObject *ref_type = MVM_hll_current(tc)->int_multidim_ref; if (ref_type) return md_posref(tc, ref_type, obj, indices); MVM_exception_throw_adhoc(tc, "No int multidim positional reference type registered for current HLL"); } MVMObject * MVM_nativeref_multidim_n(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices) { MVMObject *ref_type = MVM_hll_current(tc)->num_multidim_ref; if (ref_type) return md_posref(tc, ref_type, obj, indices); MVM_exception_throw_adhoc(tc, "No num multidim positional reference type registered for current HLL"); } MVMObject * MVM_nativeref_multidim_s(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices) { MVMObject *ref_type = MVM_hll_current(tc)->str_multidim_ref; if (ref_type) return md_posref(tc, ref_type, obj, indices); MVM_exception_throw_adhoc(tc, "No str multidim positional reference type registered for current HLL"); } /* Reference read functions. These do no checks that the reference is of the * right kind and primitive type, they just go ahead and do the read. Thus * they are more suited to calling from optimized code. The checking path is * in the native ref container implementation, in containers.c; after checks, * they delegate here. */ MVMint64 MVM_nativeref_read_lex_i(MVMThreadContext *tc, MVMObject *ref_obj) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; MVMRegister *var = &(ref->body.u.lex.frame->env[ref->body.u.lex.env_idx]); switch (ref->body.u.lex.type) { case MVM_reg_int8: return var->i8; case MVM_reg_int16: return var->i16; case MVM_reg_int32: return var->i32; default: return var->i64; } } MVMnum64 MVM_nativeref_read_lex_n(MVMThreadContext *tc, MVMObject *ref_obj) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; MVMRegister *var = &(ref->body.u.lex.frame->env[ref->body.u.lex.env_idx]); switch (ref->body.u.lex.type) { case MVM_reg_num32: return var->n32; default: return var->n64; } } MVMString * MVM_nativeref_read_lex_s(MVMThreadContext *tc, MVMObject *ref_obj) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; return ref->body.u.lex.frame->env[ref->body.u.lex.env_idx].s; } MVMint64 MVM_nativeref_read_attribute_i(MVMThreadContext *tc, MVMObject *ref_obj) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; return MVM_repr_get_attr_i(tc, ref->body.u.attribute.obj, ref->body.u.attribute.class_handle, ref->body.u.attribute.name, MVM_NO_HINT); } MVMnum64 MVM_nativeref_read_attribute_n(MVMThreadContext *tc, MVMObject *ref_obj) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; return MVM_repr_get_attr_n(tc, ref->body.u.attribute.obj, ref->body.u.attribute.class_handle, ref->body.u.attribute.name, MVM_NO_HINT); } MVMString * MVM_nativeref_read_attribute_s(MVMThreadContext *tc, MVMObject *ref_obj) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; return MVM_repr_get_attr_s(tc, ref->body.u.attribute.obj, ref->body.u.attribute.class_handle, ref->body.u.attribute.name, MVM_NO_HINT); } MVMint64 MVM_nativeref_read_positional_i(MVMThreadContext *tc, MVMObject *ref_obj) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; return MVM_repr_at_pos_i(tc, ref->body.u.positional.obj, ref->body.u.positional.idx); } MVMnum64 MVM_nativeref_read_positional_n(MVMThreadContext *tc, MVMObject *ref_obj) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; return MVM_repr_at_pos_n(tc, ref->body.u.positional.obj, ref->body.u.positional.idx); } MVMString * MVM_nativeref_read_positional_s(MVMThreadContext *tc, MVMObject *ref_obj) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; return MVM_repr_at_pos_s(tc, ref->body.u.positional.obj, ref->body.u.positional.idx); } MVMint64 MVM_nativeref_read_multidim_i(MVMThreadContext *tc, MVMObject *ref_obj) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; return MVM_repr_at_pos_multidim_i(tc, ref->body.u.multidim.obj, ref->body.u.multidim.indices); } MVMnum64 MVM_nativeref_read_multidim_n(MVMThreadContext *tc, MVMObject *ref_obj) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; return MVM_repr_at_pos_multidim_n(tc, ref->body.u.multidim.obj, ref->body.u.multidim.indices); } MVMString * MVM_nativeref_read_multidim_s(MVMThreadContext *tc, MVMObject *ref_obj) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; return MVM_repr_at_pos_multidim_s(tc, ref->body.u.multidim.obj, ref->body.u.multidim.indices); } /* Reference write functions. Same (non-checking) rules as the reads above. */ void MVM_nativeref_write_lex_i(MVMThreadContext *tc, MVMObject *ref_obj, MVMint64 value) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; MVMRegister *var = &(ref->body.u.lex.frame->env[ref->body.u.lex.env_idx]); switch (ref->body.u.lex.type) { case MVM_reg_int8: var->i8 = (MVMint8)value; break; case MVM_reg_int16: var->i16 = (MVMint16)value; break; case MVM_reg_int32: var->i32 = (MVMint32)value; break; default: var->i64 = value; break; } } void MVM_nativeref_write_lex_n(MVMThreadContext *tc, MVMObject *ref_obj, MVMnum64 value) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; MVMRegister *var = &(ref->body.u.lex.frame->env[ref->body.u.lex.env_idx]); switch (ref->body.u.lex.type) { case MVM_reg_num32: var->n32 = (MVMnum32)value; break; default: var->n64 = value; break; } } void MVM_nativeref_write_lex_s(MVMThreadContext *tc, MVMObject *ref_obj, MVMString *value) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; MVM_ASSIGN_REF(tc, &(ref->body.u.lex.frame->header), ref->body.u.lex.frame->env[ref->body.u.lex.env_idx].s, value); } void MVM_nativeref_write_attribute_i(MVMThreadContext *tc, MVMObject *ref_obj, MVMint64 value) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; MVMRegister r; r.i64 = value; MVM_repr_bind_attr_inso(tc, ref->body.u.attribute.obj, ref->body.u.attribute.class_handle, ref->body.u.attribute.name, MVM_NO_HINT, r, MVM_reg_int64); } void MVM_nativeref_write_attribute_n(MVMThreadContext *tc, MVMObject *ref_obj, MVMnum64 value) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; MVMRegister r; r.n64 = value; MVM_repr_bind_attr_inso(tc, ref->body.u.attribute.obj, ref->body.u.attribute.class_handle, ref->body.u.attribute.name, MVM_NO_HINT, r, MVM_reg_num64); } void MVM_nativeref_write_attribute_s(MVMThreadContext *tc, MVMObject *ref_obj, MVMString *value) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; MVMRegister r; r.s = value; MVM_repr_bind_attr_inso(tc, ref->body.u.attribute.obj, ref->body.u.attribute.class_handle, ref->body.u.attribute.name, MVM_NO_HINT, r, MVM_reg_str); } void MVM_nativeref_write_positional_i(MVMThreadContext *tc, MVMObject *ref_obj, MVMint64 value) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; MVM_repr_bind_pos_i(tc, ref->body.u.positional.obj, ref->body.u.positional.idx, value); } void MVM_nativeref_write_positional_n(MVMThreadContext *tc, MVMObject *ref_obj, MVMnum64 value) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; MVM_repr_bind_pos_n(tc, ref->body.u.positional.obj, ref->body.u.positional.idx, value); } void MVM_nativeref_write_positional_s(MVMThreadContext *tc, MVMObject *ref_obj, MVMString *value) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; MVM_repr_bind_pos_s(tc, ref->body.u.positional.obj, ref->body.u.positional.idx, value); } void MVM_nativeref_write_multidim_i(MVMThreadContext *tc, MVMObject *ref_obj, MVMint64 value) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; MVM_repr_bind_pos_multidim_i(tc, ref->body.u.multidim.obj, ref->body.u.multidim.indices, value); } void MVM_nativeref_write_multidim_n(MVMThreadContext *tc, MVMObject *ref_obj, MVMnum64 value) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; MVM_repr_bind_pos_multidim_n(tc, ref->body.u.multidim.obj, ref->body.u.multidim.indices, value); } void MVM_nativeref_write_multidim_s(MVMThreadContext *tc, MVMObject *ref_obj, MVMString *value) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; MVM_repr_bind_pos_multidim_s(tc, ref->body.u.multidim.obj, ref->body.u.multidim.indices, value); } /* Functions to turn native integer references into an AO_t * that can be used * in an atomic operation. The reference *must* be used and discarded *before* * the next safepoint, after which it could become invalidated. */ AO_t * MVM_nativeref_as_atomic_lex_i(MVMThreadContext *tc, MVMObject *ref_obj) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; MVMRegister *var = &(ref->body.u.lex.frame->env[ref->body.u.lex.env_idx]); if (sizeof(AO_t) == 8 && ref->body.u.lex.type == MVM_reg_int64) return (AO_t *)&(var->i64); if (sizeof(AO_t) == 4 && ref->body.u.lex.type == MVM_reg_int32) return (AO_t *)&(var->i32); MVM_exception_throw_adhoc(tc, "Cannot atomic load from an integer lexical not of the machine's native size"); } AO_t * MVM_nativeref_as_atomic_attribute_i(MVMThreadContext *tc, MVMObject *ref_obj) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; MVMObject *obj = ref->body.u.attribute.obj; return REPR(obj)->attr_funcs.attribute_as_atomic(tc, STABLE(obj), OBJECT_BODY(obj), ref->body.u.attribute.class_handle, ref->body.u.attribute.name); } AO_t * MVM_nativeref_as_atomic_positional_i(MVMThreadContext *tc, MVMObject *ref_obj) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; MVMObject *obj = ref->body.u.positional.obj; return REPR(obj)->pos_funcs.pos_as_atomic(tc, STABLE(obj), obj, OBJECT_BODY(obj), ref->body.u.positional.idx); } AO_t * MVM_nativeref_as_atomic_multidim_i(MVMThreadContext *tc, MVMObject *ref_obj) { MVMNativeRef *ref = (MVMNativeRef *)ref_obj; MVMObject *obj = ref->body.u.multidim.obj; MVMint64 num_indices; MVM_repr_populate_indices_array(tc, ref->body.u.multidim.indices, &num_indices); return REPR(obj)->pos_funcs.pos_as_atomic_multidim(tc, STABLE(obj), obj, OBJECT_BODY(obj), num_indices, tc->multi_dim_indices); } MoarVM-2018.03/src/6model/reprs/NativeRef.h0000644000175000017510000001200113237701240020340 0ustar samanthasamantha/* Representation of a reference to a native value. */ struct MVMNativeRefBody { union { struct { MVMFrame *frame; MVMuint16 env_idx; MVMuint16 type; } lex; struct { MVMObject *obj; MVMObject *class_handle; MVMString *name; } attribute; struct { MVMObject *obj; MVMint64 idx; } positional; struct { MVMObject *obj; MVMObject *indices; } multidim; } u; }; struct MVMNativeRef { MVMObject common; MVMNativeRefBody body; }; /* Kinds of native reference. */ #define MVM_NATIVEREF_LEX 1 #define MVM_NATIVEREF_ATTRIBUTE 2 #define MVM_NATIVEREF_POSITIONAL 3 #define MVM_NATIVEREF_MULTIDIM 4 /* REPR data for a native reference. */ struct MVMNativeRefREPRData { /* The primitive type of native reference this is (one of the values that * is valid for MVMStorageSpec.boxed_primitive). */ MVMuint16 primitive_type; /* The kind of reference this is. */ MVMuint16 ref_kind; }; /* Function for REPR setup. */ const MVMREPROps * MVMNativeRef_initialize(MVMThreadContext *tc); /* Operations on a nativeref REPR. */ void MVM_nativeref_ensure(MVMThreadContext *tc, MVMObject *val, MVMuint16 wantprim, MVMuint16 wantkind, char *guilty); MVMObject * MVM_nativeref_lex_i(MVMThreadContext *tc, MVMuint16 outers, MVMuint16 idx); MVMObject * MVM_nativeref_lex_n(MVMThreadContext *tc, MVMuint16 outers, MVMuint16 idx); MVMObject * MVM_nativeref_lex_s(MVMThreadContext *tc, MVMuint16 outers, MVMuint16 idx); MVMObject * MVM_nativeref_lex_name_i(MVMThreadContext *tc, MVMString *name); MVMObject * MVM_nativeref_lex_name_n(MVMThreadContext *tc, MVMString *name); MVMObject * MVM_nativeref_lex_name_s(MVMThreadContext *tc, MVMString *name); MVMObject * MVM_nativeref_attr_i(MVMThreadContext *tc, MVMObject *obj, MVMObject *class_handle, MVMString *name); MVMObject * MVM_nativeref_attr_n(MVMThreadContext *tc, MVMObject *obj, MVMObject *class_handle, MVMString *name); MVMObject * MVM_nativeref_attr_s(MVMThreadContext *tc, MVMObject *obj, MVMObject *class_handle, MVMString *name); MVMObject * MVM_nativeref_pos_i(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx); MVMObject * MVM_nativeref_pos_n(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx); MVMObject * MVM_nativeref_pos_s(MVMThreadContext *tc, MVMObject *obj, MVMint64 idx); MVMObject * MVM_nativeref_multidim_i(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices); MVMObject * MVM_nativeref_multidim_n(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices); MVMObject * MVM_nativeref_multidim_s(MVMThreadContext *tc, MVMObject *obj, MVMObject *indices); MVMint64 MVM_nativeref_read_lex_i(MVMThreadContext *tc, MVMObject *ref); MVMnum64 MVM_nativeref_read_lex_n(MVMThreadContext *tc, MVMObject *ref); MVMString * MVM_nativeref_read_lex_s(MVMThreadContext *tc, MVMObject *ref); MVMint64 MVM_nativeref_read_attribute_i(MVMThreadContext *tc, MVMObject *ref); MVMnum64 MVM_nativeref_read_attribute_n(MVMThreadContext *tc, MVMObject *ref); MVMString * MVM_nativeref_read_attribute_s(MVMThreadContext *tc, MVMObject *ref); MVMint64 MVM_nativeref_read_positional_i(MVMThreadContext *tc, MVMObject *ref); MVMnum64 MVM_nativeref_read_positional_n(MVMThreadContext *tc, MVMObject *ref); MVMString * MVM_nativeref_read_positional_s(MVMThreadContext *tc, MVMObject *ref); MVMint64 MVM_nativeref_read_multidim_i(MVMThreadContext *tc, MVMObject *ref); MVMnum64 MVM_nativeref_read_multidim_n(MVMThreadContext *tc, MVMObject *ref); MVMString * MVM_nativeref_read_multidim_s(MVMThreadContext *tc, MVMObject *ref); void MVM_nativeref_write_lex_i(MVMThreadContext *tc, MVMObject *ref, MVMint64 value); void MVM_nativeref_write_lex_n(MVMThreadContext *tc, MVMObject *ref, MVMnum64 value); void MVM_nativeref_write_lex_s(MVMThreadContext *tc, MVMObject *ref, MVMString *value); void MVM_nativeref_write_attribute_i(MVMThreadContext *tc, MVMObject *ref, MVMint64 value); void MVM_nativeref_write_attribute_n(MVMThreadContext *tc, MVMObject *ref, MVMnum64 value); void MVM_nativeref_write_attribute_s(MVMThreadContext *tc, MVMObject *ref, MVMString *value); void MVM_nativeref_write_positional_i(MVMThreadContext *tc, MVMObject *ref, MVMint64 value); void MVM_nativeref_write_positional_n(MVMThreadContext *tc, MVMObject *ref, MVMnum64 value); void MVM_nativeref_write_positional_s(MVMThreadContext *tc, MVMObject *ref, MVMString *value); void MVM_nativeref_write_multidim_i(MVMThreadContext *tc, MVMObject *ref, MVMint64 value); void MVM_nativeref_write_multidim_n(MVMThreadContext *tc, MVMObject *ref, MVMnum64 value); void MVM_nativeref_write_multidim_s(MVMThreadContext *tc, MVMObject *ref, MVMString *value); AO_t * MVM_nativeref_as_atomic_lex_i(MVMThreadContext *tc, MVMObject *ref_obj); AO_t * MVM_nativeref_as_atomic_attribute_i(MVMThreadContext *tc, MVMObject *ref_obj); AO_t * MVM_nativeref_as_atomic_positional_i(MVMThreadContext *tc, MVMObject *ref_obj); AO_t * MVM_nativeref_as_atomic_multidim_i(MVMThreadContext *tc, MVMObject *ref_obj); MoarVM-2018.03/src/6model/reprs/P6bigint.c0000644000175000017510000002214413242626641020152 0ustar samanthasamantha#include "moar.h" #ifndef MIN #define MIN(x,y) ((x)<(y)?(x):(y)) #endif /* Get a native int64 from an mp_int. */ static MVMint64 mp_get_int64(MVMThreadContext *tc, mp_int * a) { MVMuint64 res; MVMuint64 signed_max = 9223372036854775807ULL; const int bits = mp_count_bits(a); /* For 64-bit 2's complement numbers the positive max is 2**63-1, which is 63 bits, * but the negative max is -(2**63), which is 64 bits. */ if (MP_NEG == SIGN(a)) { if (bits > 64) { MVM_exception_throw_adhoc(tc, "Cannot unbox %d bit wide bigint into native integer", bits); } ++signed_max; } else { if (bits > 63) { MVM_exception_throw_adhoc(tc, "Cannot unbox %d bit wide bigint into native integer", bits); } } res = mp_get_long_long(a); if (res > signed_max) { /* The mp_int was bigger than a signed result could be. */ MVM_exception_throw_adhoc(tc, "Cannot unbox %d bit wide bigint into native integer", bits); } return MP_NEG == SIGN(a) ? -res : res; } /* Get a native uint64 from an mp_int. */ static MVMuint64 mp_get_uint64(MVMThreadContext *tc, mp_int * a) { const int bits = mp_count_bits(a); if (bits > 64) { MVM_exception_throw_adhoc(tc, "Cannot unbox %d bit wide bigint into native integer", bits); } return mp_get_long_long(a); } /* This representation's function pointer table. */ static const MVMREPROps P6bigint_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &P6bigint_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMP6bigint); }); return st->WHAT; } /* Initializes a new instance. */ static void initialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMP6bigintBody *body = (MVMP6bigintBody *)data; body->u.smallint.flag = MVM_BIGINT_32_FLAG; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMP6bigintBody *src_body = (MVMP6bigintBody *)src; MVMP6bigintBody *dest_body = (MVMP6bigintBody *)dest; if (MVM_BIGINT_IS_BIG(src_body)) { dest_body->u.bigint = MVM_malloc(sizeof(mp_int)); mp_init_copy(dest_body->u.bigint, src_body->u.bigint); } else { dest_body->u.smallint.flag = src_body->u.smallint.flag; dest_body->u.smallint.value = src_body->u.smallint.value; } } static void set_int(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 value) { MVMP6bigintBody *body = (MVMP6bigintBody *)data; if (MVM_IS_32BIT_INT(value)) { body->u.smallint.flag = MVM_BIGINT_32_FLAG; body->u.smallint.value = (MVMint32)value; } else { mp_int *i = MVM_malloc(sizeof(mp_int)); mp_init(i); if (value >= 0) { MVM_bigint_mp_set_uint64(i, (MVMuint64)value); } else { MVM_bigint_mp_set_uint64(i, (MVMuint64)-value); mp_neg(i, i); } body->u.bigint = i; } } static MVMint64 get_int(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMP6bigintBody *body = (MVMP6bigintBody *)data; if (MVM_BIGINT_IS_BIG(body)) { mp_int *i = body->u.bigint; return mp_get_int64(tc, i); } else { return body->u.smallint.value; } } static void set_uint(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMuint64 value) { MVMP6bigintBody *body = (MVMP6bigintBody *)data; if (value < 2147483647ULL) { body->u.smallint.flag = MVM_BIGINT_32_FLAG; body->u.smallint.value = (MVMint32)value; } else { mp_int *i = MVM_malloc(sizeof(mp_int)); mp_init(i); MVM_bigint_mp_set_uint64(i, value); body->u.bigint = i; } } static MVMuint64 get_uint(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMP6bigintBody *body = (MVMP6bigintBody *)data; if (MVM_BIGINT_IS_BIG(body)) { mp_int *i = body->u.bigint; if (MP_NEG == SIGN(i)) MVM_exception_throw_adhoc(tc, "Cannot unbox negative bigint into native unsigned integer"); else return mp_get_uint64(tc, i); } else { return body->u.smallint.value; } } static void * get_boxed_ref(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMuint32 repr_id) { if (repr_id == MVM_REPR_ID_P6bigint) return data; MVM_exception_throw_adhoc(tc, "P6bigint representation cannot unbox to representation %s", MVM_repr_get_by_id(tc, repr_id)->name); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_INLINED, /* inlineable */ sizeof(MVMP6bigintBody) * 8, /* bits */ ALIGNOF(MVMP6bigintBody), /* align */ MVM_STORAGE_SPEC_BP_INT, /* boxed_primitive */ MVM_STORAGE_SPEC_CAN_BOX_INT, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } static void gc_cleanup(MVMThreadContext *tc, MVMSTable *st, void *data) { MVMP6bigintBody *body = (MVMP6bigintBody *)data; if (MVM_BIGINT_IS_BIG(body)) { mp_clear(body->u.bigint); MVM_free(body->u.bigint); } } static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMP6bigintBody *body = &((MVMP6bigint *)obj)->body; if (MVM_BIGINT_IS_BIG(body)) { mp_clear(body->u.bigint); MVM_free(body->u.bigint); } } /* Serializes the bigint. */ static void serialize(MVMThreadContext *tc, MVMSTable *st, void *data, MVMSerializationWriter *writer) { MVMP6bigintBody *body = (MVMP6bigintBody *)data; if (MVM_BIGINT_IS_BIG(body)) { mp_int *i = body->u.bigint; int len; char *buf; MVMString *str; mp_radix_size(i, 10, &len); buf = (char *)MVM_malloc(len); mp_toradix(i, buf, 10); /* len - 1 because buf is \0-terminated */ str = MVM_string_ascii_decode(tc, tc->instance->VMString, buf, len - 1); /* write the "is small" flag */ MVM_serialization_write_int(tc, writer, 0); MVM_serialization_write_str(tc, writer, str); MVM_free(buf); } else { /* write the "is small" flag */ MVM_serialization_write_int(tc, writer, 1); MVM_serialization_write_int(tc, writer, body->u.smallint.value); } } /* Set the size on the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMP6bigint); } /* Deserializes the bigint. */ static void deserialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMSerializationReader *reader) { MVMP6bigintBody *body = (MVMP6bigintBody *)data; if (MVM_serialization_read_int(tc, reader) == 1) { /* Is it small int? */ body->u.smallint.flag = MVM_BIGINT_32_FLAG; body->u.smallint.value = MVM_serialization_read_int(tc, reader); } else { /* big int */ char *buf = MVM_string_ascii_encode(tc, MVM_serialization_read_str(tc, reader), NULL, 0); body->u.bigint = MVM_malloc(sizeof(mp_int)); mp_init(body->u.bigint); mp_read_radix(body->u.bigint, buf, 10); MVM_free(buf); } } /* Calculates the non-GC-managed memory we hold on to. */ static MVMuint64 unmanaged_size(MVMThreadContext *tc, MVMSTable *st, void *data) { MVMP6bigintBody *body = (MVMP6bigintBody *)data; if (MVM_BIGINT_IS_BIG(body)) return body->u.bigint->alloc; else return 0; } /* Initializes the representation. */ const MVMREPROps * MVMP6bigint_initialize(MVMThreadContext *tc) { return &P6bigint_this_repr; } static const MVMREPROps P6bigint_this_repr = { type_object_for, MVM_gc_allocate_object, initialize, copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, { set_int, get_int, MVM_REPR_DEFAULT_SET_NUM, MVM_REPR_DEFAULT_GET_NUM, MVM_REPR_DEFAULT_SET_STR, MVM_REPR_DEFAULT_GET_STR, set_uint, get_uint, get_boxed_ref }, /* box_funcs */ MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ serialize, deserialize, NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, NULL, /* gc_mark */ gc_free, gc_cleanup, NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "P6bigint", /* name */ MVM_REPR_ID_P6bigint, unmanaged_size, /* unmanaged_size */ NULL, /* describe_refs */ }; MoarVM-2018.03/src/6model/reprs/P6bigint.h0000644000175000017510000000225213237701240020146 0ustar samanthasamantha#include "tommath.h" #define MVM_BIGINT_32_FLAG 0xFFFFFFFF #define MVM_BIGINT_IS_BIG(body) ((body)->u.smallint.flag != 0xFFFFFFFF) #define MVM_IS_32BIT_INT(i) ((long long)(i) >= -2147483648LL && (long long)(i) <= 2147483647LL) /* Representation used by big integers; inlined into P6bigint. We store any * values in 32-bit signed range without using the big integer library. */ struct MVMP6bigintBody { union { /* A 32-bit integer and a flag indicating this is not a pointer to a * big integer, but instead the 32-bit value should be read. Stored * so that the flag sets the lower bits of any 64-bit pointer, which * should never happen in a real pointer due to alignment. */ struct { #if defined(MVM_BIGENDIAN) && MVM_PTR_SIZE > 4 MVMint32 value; MVMuint32 flag; #else MVMuint32 flag; MVMint32 value; #endif } smallint; /* Pointer to a libtommath big integer. */ mp_int *bigint; } u; }; struct MVMP6bigint { MVMObject common; MVMP6bigintBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMP6bigint_initialize(MVMThreadContext *tc); MoarVM-2018.03/src/6model/reprs/P6int.c0000644000175000017510000002333013237701240017457 0ustar samanthasamantha#include "moar.h" #ifdef MVM_BOOL #include #endif /* This representation's function pointer table. */ static const MVMREPROps P6int_this_repr; static void mk_storage_spec(MVMThreadContext *tc, MVMuint16 bits, MVMuint16 is_unsigned, MVMStorageSpec *spec) { /* create storage spec */ spec->inlineable = MVM_STORAGE_SPEC_INLINED; spec->boxed_primitive = MVM_STORAGE_SPEC_BP_INT; spec->can_box = MVM_STORAGE_SPEC_CAN_BOX_INT; spec->bits = bits; spec->is_unsigned = is_unsigned; switch (bits) { case 64: spec->align = ALIGNOF(MVMint64); break; case 32: spec->align = ALIGNOF(MVMint32); break; case 16: spec->align = ALIGNOF(MVMint16); break; default: spec->align = ALIGNOF(MVMint8); break; } } /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &P6int_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVMP6intREPRData *repr_data = (MVMP6intREPRData *)MVM_malloc(sizeof(MVMP6intREPRData)); repr_data->bits = sizeof(MVMint64) * 8; repr_data->is_unsigned = 0; mk_storage_spec(tc, repr_data->bits, repr_data->is_unsigned, &repr_data->storage_spec); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMP6int); st->REPR_data = repr_data; }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMP6intREPRData *repr_data = (MVMP6intREPRData *)st->REPR_data; MVMP6intBody *src_body = (MVMP6intBody *)src; MVMP6intBody *dest_body = (MVMP6intBody *)dest; switch (repr_data->bits) { case 64: dest_body->value.i64 = src_body->value.i64; break; case 32: dest_body->value.i32 = src_body->value.i32; break; case 16: dest_body->value.i16 = src_body->value.i16; break; default: dest_body->value.i8 = src_body->value.i8; break; } } static void set_uint(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMuint64 value) { MVMP6intREPRData *repr_data = (MVMP6intREPRData *)st->REPR_data; switch (repr_data->bits) { case 64: ((MVMP6intBody *)data)->value.u64 = value; break; case 32: ((MVMP6intBody *)data)->value.u32 = (MVMuint32)value; break; case 16: ((MVMP6intBody *)data)->value.u16 = (MVMuint16)value; break; default: ((MVMP6intBody *)data)->value.u8 = (MVMuint8)value; break; } } static MVMuint64 get_uint(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMP6intREPRData *repr_data = (MVMP6intREPRData *)st->REPR_data; switch (repr_data->bits) { case 64: return ((MVMP6intBody *)data)->value.u64; case 32: return ((MVMP6intBody *)data)->value.u32; case 16: return ((MVMP6intBody *)data)->value.u16; default: return ((MVMP6intBody *)data)->value.u8; } } static void set_int(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 value) { MVMP6intREPRData *repr_data = (MVMP6intREPRData *)st->REPR_data; switch (repr_data->bits) { case 64: ((MVMP6intBody *)data)->value.i64 = value; break; case 32: ((MVMP6intBody *)data)->value.i32 = (MVMint32)value; break; case 16: ((MVMP6intBody *)data)->value.i16 = (MVMint16)value; break; default: ((MVMP6intBody *)data)->value.i8 = (MVMint8)value; break; } } static MVMint64 get_int(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMP6intREPRData *repr_data = (MVMP6intREPRData *)st->REPR_data; switch (repr_data->bits) { case 64: return ((MVMP6intBody *)data)->value.i64; case 32: return ((MVMP6intBody *)data)->value.i32; case 16: return ((MVMP6intBody *)data)->value.i16; default: return ((MVMP6intBody *)data)->value.i8; } } /* Marks the representation data in an STable.*/ static void gc_free_repr_data(MVMThreadContext *tc, MVMSTable *st) { MVM_free(st->REPR_data); } static const MVMStorageSpec default_storage_spec = { MVM_STORAGE_SPEC_INLINED, /* inlineable */ sizeof(MVMint64) * 8, /* bits */ ALIGNOF(MVMint64), /* align */ MVM_STORAGE_SPEC_BP_INT, /* boxed_primitive */ MVM_STORAGE_SPEC_CAN_BOX_INT, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { MVMP6intREPRData *repr_data = (MVMP6intREPRData *)st->REPR_data; if (repr_data && repr_data->bits) return &repr_data->storage_spec; return &default_storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info_hash) { MVMP6intREPRData *repr_data = (MVMP6intREPRData *)st->REPR_data; MVMStringConsts str_consts = tc->instance->str_consts; MVMObject *info = MVM_repr_at_key_o(tc, info_hash, str_consts.integer); if (!MVM_is_null(tc, info)) { MVMObject *bits_o = MVM_repr_at_key_o(tc, info, str_consts.bits); MVMObject *is_unsigned_o = MVM_repr_at_key_o(tc, info, str_consts.unsigned_str); if (!MVM_is_null(tc, bits_o)) { repr_data->bits = MVM_repr_get_int(tc, bits_o); switch (repr_data->bits) { case MVM_P6INT_C_TYPE_CHAR: repr_data->bits = 8 * sizeof(char); break; case MVM_P6INT_C_TYPE_SHORT: repr_data->bits = 8 * sizeof(short); break; case MVM_P6INT_C_TYPE_INT: repr_data->bits = 8 * sizeof(int); break; case MVM_P6INT_C_TYPE_LONG: repr_data->bits = 8 * sizeof(long); break; case MVM_P6INT_C_TYPE_LONGLONG: repr_data->bits = 8 * sizeof(long long); break; case MVM_P6INT_C_TYPE_SIZE_T: repr_data->bits = 8 * sizeof(size_t); break; #ifdef MVM_BOOL case MVM_P6INT_C_TYPE_BOOL: repr_data->bits = 8 * sizeof(MVM_BOOL); break; #else case MVM_P6INT_C_TYPE_BOOL: repr_data->bits = 8 * sizeof(char); break; #endif case MVM_P6INT_C_TYPE_ATOMIC: repr_data->bits = 8 * sizeof(AO_t); break; } if (repr_data->bits != 1 && repr_data->bits != 2 && repr_data->bits != 4 && repr_data->bits != 8 && repr_data->bits != 16 && repr_data->bits != 32 && repr_data->bits != 64) MVM_exception_throw_adhoc(tc, "MVMP6int: Unsupported int size (%dbit)", repr_data->bits); } else { repr_data->bits = default_storage_spec.bits; } if (!MVM_is_null(tc, is_unsigned_o)) { repr_data->is_unsigned = MVM_repr_get_int(tc, is_unsigned_o); } } if (repr_data->bits) mk_storage_spec(tc, repr_data->bits, repr_data->is_unsigned, &repr_data->storage_spec); } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMP6int); } /* Serializes the REPR data. */ static void serialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationWriter *writer) { MVMP6intREPRData *repr_data = (MVMP6intREPRData *)st->REPR_data; MVM_serialization_write_int(tc, writer, repr_data->bits); MVM_serialization_write_int(tc, writer, repr_data->is_unsigned); } /* Deserializes representation data. */ static void deserialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { MVMP6intREPRData *repr_data = (MVMP6intREPRData *)MVM_malloc(sizeof(MVMP6intREPRData)); repr_data->bits = MVM_serialization_read_int(tc, reader); repr_data->is_unsigned = MVM_serialization_read_int(tc, reader); if (repr_data->bits != 1 && repr_data->bits != 2 && repr_data->bits != 4 && repr_data->bits != 8 && repr_data->bits != 16 && repr_data->bits != 32 && repr_data->bits != 64) MVM_exception_throw_adhoc(tc, "MVMP6int: Unsupported int size (%dbit)", repr_data->bits); mk_storage_spec(tc, repr_data->bits, repr_data->is_unsigned, &repr_data->storage_spec); st->REPR_data = repr_data; } static void deserialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMSerializationReader *reader) { set_int(tc, st, root, data, MVM_serialization_read_int(tc, reader)); } static void serialize(MVMThreadContext *tc, MVMSTable *st, void *data, MVMSerializationWriter *writer) { MVM_serialization_write_int(tc, writer, get_int(tc, st, NULL, data)); } /* Initializes the representation. */ const MVMREPROps * MVMP6int_initialize(MVMThreadContext *tc) { return &P6int_this_repr; } static const MVMREPROps P6int_this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, { set_int, get_int, MVM_REPR_DEFAULT_SET_NUM, MVM_REPR_DEFAULT_GET_NUM, MVM_REPR_DEFAULT_SET_STR, MVM_REPR_DEFAULT_GET_STR, set_uint, get_uint, MVM_REPR_DEFAULT_GET_BOXED_REF }, /* box_funcs */ MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ serialize, deserialize, serialize_repr_data, deserialize_repr_data, deserialize_stable_size, NULL, /* gc_mark */ NULL, /* gc_free */ NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ gc_free_repr_data, compose, NULL, /* spesh */ "P6int", /* name */ MVM_REPR_ID_P6int, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; MoarVM-2018.03/src/6model/reprs/P6int.h0000644000175000017510000000171413237701240017466 0ustar samanthasamantha#define MVM_P6INT_C_TYPE_CHAR -1 #define MVM_P6INT_C_TYPE_SHORT -2 #define MVM_P6INT_C_TYPE_INT -3 #define MVM_P6INT_C_TYPE_LONG -4 #define MVM_P6INT_C_TYPE_LONGLONG -5 #define MVM_P6INT_C_TYPE_SIZE_T -6 #define MVM_P6INT_C_TYPE_BOOL -7 #define MVM_P6INT_C_TYPE_ATOMIC -8 /* Representation used by P6 native ints. */ struct MVMP6intBody { /* Integer storage slot. */ union { MVMint64 i64; MVMint32 i32; MVMint16 i16; MVMint8 i8; MVMuint64 u64; MVMuint32 u32; MVMuint16 u16; MVMuint8 u8; } value; }; struct MVMP6int { MVMObject common; MVMP6intBody body; }; /* The bit width requirement is shared for all instances of the same type. */ struct MVMP6intREPRData { MVMint16 bits; MVMint16 is_unsigned; MVMStorageSpec storage_spec; }; /* Function for REPR setup. */ const MVMREPROps * MVMP6int_initialize(MVMThreadContext *tc); MoarVM-2018.03/src/6model/reprs/P6num.c0000644000175000017510000001606313237701240017471 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps P6num_this_repr; static void mk_storage_spec(MVMThreadContext *tc, MVMuint16 bits, MVMStorageSpec *spec) { spec->bits = bits; spec->inlineable = MVM_STORAGE_SPEC_INLINED; spec->boxed_primitive = MVM_STORAGE_SPEC_BP_NUM; spec->can_box = MVM_STORAGE_SPEC_CAN_BOX_NUM; switch (bits) { case 64: spec->align = ALIGNOF(MVMnum64); break; case 32: spec->align = ALIGNOF(MVMnum32); break; default: spec->align = ALIGNOF(MVMnum64); break; } } /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &P6num_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVMP6numREPRData *repr_data = (MVMP6numREPRData *)MVM_malloc(sizeof(MVMP6numREPRData)); repr_data->bits = sizeof(MVMnum64) * 8; mk_storage_spec(tc, repr_data->bits, &repr_data->storage_spec); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMP6num); st->REPR_data = repr_data; }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMP6numREPRData *repr_data = (MVMP6numREPRData *)st->REPR_data; MVMP6numBody *src_body = (MVMP6numBody *)src; MVMP6numBody *dest_body = (MVMP6numBody *)dest; switch (repr_data->bits) { case 32: dest_body->value.n32 = src_body->value.n32; break; default: dest_body->value.n64 = src_body->value.n64; break; } } static void set_num(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMnum64 value) { MVMP6numREPRData *repr_data = (MVMP6numREPRData *)st->REPR_data; switch (repr_data->bits) { case 32: ((MVMP6numBody *)data)->value.n32 = (MVMnum32)value; break; default: ((MVMP6numBody *)data)->value.n64 = value; break; } } static MVMnum64 get_num(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMP6numREPRData *repr_data = (MVMP6numREPRData *)st->REPR_data; switch (repr_data->bits) { case 32: return ((MVMP6numBody *)data)->value.n32; default: return ((MVMP6numBody *)data)->value.n64; } } /* Marks the representation data in an STable.*/ static void gc_free_repr_data(MVMThreadContext *tc, MVMSTable *st) { MVM_free(st->REPR_data); } static const MVMStorageSpec default_storage_spec = { MVM_STORAGE_SPEC_INLINED, /* inlineable */ sizeof(MVMnum64) * 8, /* bits */ ALIGNOF(MVMnum64), /* align */ MVM_STORAGE_SPEC_BP_NUM, /* boxed_primitive */ MVM_STORAGE_SPEC_CAN_BOX_NUM, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { MVMP6numREPRData *repr_data = (MVMP6numREPRData *)st->REPR_data; if (repr_data && repr_data->bits) return &repr_data->storage_spec; return &default_storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info_hash) { MVMP6numREPRData *repr_data = (MVMP6numREPRData *)st->REPR_data; MVMStringConsts str_consts = tc->instance->str_consts; MVMObject *info = MVM_repr_at_key_o(tc, info_hash, str_consts.float_str); if (!MVM_is_null(tc, info)) { MVMObject *bits_o = MVM_repr_at_key_o(tc, info, str_consts.bits); if (!MVM_is_null(tc, bits_o)) { repr_data->bits = MVM_repr_get_int(tc, bits_o); switch (repr_data->bits) { case MVM_P6NUM_C_TYPE_FLOAT: repr_data->bits = 8 * sizeof(float); break; case MVM_P6NUM_C_TYPE_DOUBLE: repr_data->bits = 8 * sizeof(double); break; case MVM_P6NUM_C_TYPE_LONGDOUBLE: repr_data->bits = 8 * sizeof(long double); break; } if (repr_data->bits != 32 && repr_data->bits != 64) MVM_exception_throw_adhoc(tc, "MVMP6num: Unsupported num size (%dbit)", repr_data->bits); } } if (repr_data->bits) mk_storage_spec(tc, repr_data->bits, &repr_data->storage_spec); } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMP6num); } /* Serializes the REPR data. */ static void serialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationWriter *writer) { MVMP6numREPRData *repr_data = (MVMP6numREPRData *)st->REPR_data; MVM_serialization_write_int(tc, writer, repr_data->bits); } /* Deserializes representation data. */ static void deserialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { MVMP6numREPRData *repr_data = (MVMP6numREPRData *)MVM_malloc(sizeof(MVMP6numREPRData)); repr_data->bits = MVM_serialization_read_int(tc, reader); if (repr_data->bits != 1 && repr_data->bits != 2 && repr_data->bits != 4 && repr_data->bits != 8 && repr_data->bits != 16 && repr_data->bits != 32 && repr_data->bits != 64) MVM_exception_throw_adhoc(tc, "MVMP6num: Unsupported int size (%dbit)", repr_data->bits); if (repr_data->bits) mk_storage_spec(tc, repr_data->bits, &repr_data->storage_spec); st->REPR_data = repr_data; } static void deserialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMSerializationReader *reader) { MVMnum64 value = MVM_serialization_read_num(tc, reader); set_num(tc, st, root, data, value); } static void serialize(MVMThreadContext *tc, MVMSTable *st, void *data, MVMSerializationWriter *writer) { MVM_serialization_write_num(tc, writer, get_num(tc, st, NULL, data)); } /* Initializes the representation. */ const MVMREPROps * MVMP6num_initialize(MVMThreadContext *tc) { return &P6num_this_repr; } static const MVMREPROps P6num_this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, { MVM_REPR_DEFAULT_SET_INT, MVM_REPR_DEFAULT_GET_INT, set_num, get_num, MVM_REPR_DEFAULT_SET_STR, MVM_REPR_DEFAULT_GET_STR, MVM_REPR_DEFAULT_SET_UINT, MVM_REPR_DEFAULT_GET_UINT, MVM_REPR_DEFAULT_GET_BOXED_REF }, /* box_funcs */ MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ serialize, deserialize, serialize_repr_data, deserialize_repr_data, deserialize_stable_size, NULL, /* gc_mark */ NULL, /* gc_free */ NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ gc_free_repr_data, compose, NULL, /* spesh */ "P6num", /* name */ MVM_REPR_ID_P6num, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; MoarVM-2018.03/src/6model/reprs/P6num.h0000644000175000017510000000114113237701240017465 0ustar samanthasamantha#define MVM_P6NUM_C_TYPE_FLOAT -1 #define MVM_P6NUM_C_TYPE_DOUBLE -2 #define MVM_P6NUM_C_TYPE_LONGDOUBLE -3 /* Representation used by P6 nums. */ struct MVMP6numBody { /* Float storage slot. */ union { MVMnum64 n64; MVMnum32 n32; } value; }; struct MVMP6num { MVMObject common; MVMP6numBody body; }; /* The bit width requirement is shared for all instances of the same type. */ struct MVMP6numREPRData { MVMint16 bits; MVMStorageSpec storage_spec; }; /* Function for REPR setup. */ const MVMREPROps * MVMP6num_initialize(MVMThreadContext *tc); MoarVM-2018.03/src/6model/reprs/P6opaque.c0000644000175000017510000023466513247173402020202 0ustar samanthasamantha#include "moar.h" #ifndef MAX #define MAX(x,y) ((x)>(y)?(x):(y)) #endif #define P6OMAX(x, y) ((y) > (x) ? (y) : (x)) #define REFVAR_VM_HASH_STR_VAR 10 #define MVM_P6OPAQUE_NO_UNBOX_SLOT 0xFFFF /* This representation's function pointer table. */ static const MVMREPROps P6opaque_this_repr; /* Helpers for reading/writing values. */ MVM_STATIC_INLINE MVMObject * get_obj_at_offset(void *data, MVMint64 offset) { void *location = (char *)data + offset; return *((MVMObject **)location); } MVM_STATIC_INLINE void set_obj_at_offset(MVMThreadContext *tc, MVMObject *root, void *data, MVMint64 offset, MVMObject *value) { void *location = (char *)data + offset; MVM_ASSIGN_REF(tc, &(root->header), *((MVMObject **)location), value); } /* Helper for finding a slot number. */ static MVMint64 try_get_slot(MVMThreadContext *tc, MVMP6opaqueREPRData *repr_data, MVMObject *class_key, MVMString *name) { if (repr_data->name_to_index_mapping) { MVMP6opaqueNameMap *cur_map_entry = repr_data->name_to_index_mapping; while (cur_map_entry->class_key != NULL) { if (cur_map_entry->class_key == class_key) { MVMint16 i; for (i = 0; i < cur_map_entry->num_attrs; i++) { if (MVM_string_equal(tc, cur_map_entry->names[i], name)) { return cur_map_entry->slots[i]; } } } cur_map_entry++; } } return -1; } /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &P6opaque_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = 0; /* Is updated later. */ }); return st->WHAT; } /* Creates a new instance based on the type object. */ static MVMObject * allocate(MVMThreadContext *tc, MVMSTable *st) { if (st->size) return MVM_gc_allocate_object(tc, st); else MVM_exception_throw_adhoc(tc, "P6opaque: must compose %s before allocating", MVM_6model_get_stable_debug_name(tc, st)); } /* Initializes a new instance. */ static void initialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMP6opaqueREPRData * repr_data = (MVMP6opaqueREPRData *)st->REPR_data; data = MVM_p6opaque_real_data(tc, data); if (repr_data) { MVMint64 i; for (i = 0; repr_data->initialize_slots[i] >= 0; i++) { MVMint64 offset = repr_data->attribute_offsets[repr_data->initialize_slots[i]]; MVMSTable *st = repr_data->flattened_stables[repr_data->initialize_slots[i]]; st->REPR->initialize(tc, st, root, (char *)data + offset); } } else { MVM_exception_throw_adhoc(tc, "P6opaque: must compose %s before using initialize", MVM_6model_get_stable_debug_name(tc, st)); } } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMuint16 i; src = MVM_p6opaque_real_data(tc, src); /* Flattened in REPRs need a chance to copy 'emselves. */ for (i = 0; i < repr_data->num_attributes; i++) { MVMSTable *st_copy = repr_data->flattened_stables[i]; MVMuint16 offset = repr_data->attribute_offsets[i]; if (st_copy) { st_copy->REPR->copy_to(tc, st_copy, (char*)src + offset, dest_root, (char*)dest + offset); } else { MVMObject *ref = get_obj_at_offset(src, offset); if (ref) set_obj_at_offset(tc, dest_root, dest, offset, ref); } } } /* Called by the VM to mark any GCable items. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMint64 i; data = MVM_p6opaque_real_data(tc, data); /* Mark objects. */ for (i = 0; i < repr_data->gc_obj_mark_offsets_count; i++) { MVMuint16 offset = repr_data->gc_obj_mark_offsets[i]; MVM_gc_worklist_add(tc, worklist, (char *)data + offset); } /* Mark any nested reprs that need it. */ for (i = 0; repr_data->gc_mark_slots[i] >= 0; i++) { MVMuint16 offset = repr_data->attribute_offsets[repr_data->gc_mark_slots[i]]; MVMSTable *st = repr_data->flattened_stables[repr_data->gc_mark_slots[i]]; st->REPR->gc_mark(tc, st, (char *)data + offset, worklist); } } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)STABLE(obj)->REPR_data; MVMint64 i; void *data = MVM_p6opaque_real_data(tc, OBJECT_BODY(obj)); /* Cleanup any nested reprs that need it. */ for (i = 0; repr_data->gc_cleanup_slots[i] >= 0; i++) { MVMuint16 offset = repr_data->attribute_offsets[repr_data->gc_cleanup_slots[i]]; MVMSTable *st = repr_data->flattened_stables[repr_data->gc_cleanup_slots[i]]; st->REPR->gc_cleanup(tc, st, (char *)data + offset); } /* If we replaced the object body, free the replacement. */ MVM_free(((MVMP6opaque *)obj)->body.replaced); } /* Marks the representation data in an STable.*/ static void gc_mark_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMGCWorklist *worklist) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; /* May not be composed yet. */ if (repr_data == NULL) return; if (repr_data->flattened_stables) { int i; for (i = 0; i < repr_data->num_attributes; i++) if (repr_data->flattened_stables[i]) MVM_gc_worklist_add(tc, worklist, &repr_data->flattened_stables[i]); } if (repr_data->auto_viv_values) { int i; for (i = 0; i < repr_data->num_attributes; i++) if (repr_data->auto_viv_values[i]) MVM_gc_worklist_add(tc, worklist, &repr_data->auto_viv_values[i]); } if (repr_data->name_to_index_mapping) { MVMP6opaqueNameMap *cur_map_entry = repr_data->name_to_index_mapping; while (cur_map_entry->class_key != NULL) { MVMint16 i; for (i = 0; i < cur_map_entry->num_attrs; i++) { MVM_gc_worklist_add(tc, worklist, &cur_map_entry->names[i]); } MVM_gc_worklist_add(tc, worklist, &cur_map_entry->class_key); cur_map_entry++; } } } /* Marks the representation data in an STable.*/ static void gc_free_repr_data(MVMThreadContext *tc, MVMSTable *st) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; /* May not have survived to composition. */ if (repr_data == NULL) return; if (repr_data->name_to_index_mapping) { MVMP6opaqueNameMap *cur_map_entry = repr_data->name_to_index_mapping; while (cur_map_entry->class_key != NULL) { MVM_free(cur_map_entry->names); MVM_free(cur_map_entry->slots); cur_map_entry++; } MVM_free(repr_data->name_to_index_mapping); } MVM_free(repr_data->attribute_offsets); MVM_free(repr_data->flattened_stables); MVM_free(repr_data->auto_viv_values); MVM_free(repr_data->unbox_slots); MVM_free(repr_data->gc_obj_mark_offsets); MVM_free(repr_data->initialize_slots); MVM_free(repr_data->gc_mark_slots); MVM_free(repr_data->gc_cleanup_slots); MVM_free(st->REPR_data); } /* Helper for complaining about attribute access errors. */ MVM_NO_RETURN static void no_such_attribute(MVMThreadContext *tc, const char *action, MVMObject *class_handle, MVMString *name, MVMSTable *target_type) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "P6opaque: no such attribute '%s' on type %s in a %s when trying to %s", c_name, MVM_6model_get_debug_name(tc, class_handle), MVM_6model_get_stable_debug_name(tc, target_type), action); } MVM_NO_RETURN static void invalid_access_kind(MVMThreadContext *tc, const char *action, MVMObject *class_handle, MVMString *name, const char *kind_desc) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "P6opaque: invalid %s attribute '%s' in type %s for kind %s", action, c_name, MVM_6model_get_debug_name(tc, class_handle), kind_desc); } /* Gets the current value for an attribute. */ static void get_attribute(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister *result_reg, MVMuint16 kind) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMint64 slot; data = MVM_p6opaque_real_data(tc, data); if (!repr_data) MVM_exception_throw_adhoc(tc, "P6opaque: must compose %s before using get_attribute", MVM_6model_get_stable_debug_name(tc, st)); /* Try the slot allocation first. */ slot = hint >= 0 && hint < repr_data->num_attributes && !(repr_data->mi) ? hint : try_get_slot(tc, repr_data, class_handle, name); if (slot >= 0) { MVMSTable *attr_st = repr_data->flattened_stables[slot]; switch (kind) { case MVM_reg_obj: { if (!attr_st) { MVMObject *result = get_obj_at_offset(data, repr_data->attribute_offsets[slot]); if (result) { result_reg->o = result; } else { /* Maybe we know how to auto-viv it to a container. */ if (repr_data->auto_viv_values) { MVMObject *value = repr_data->auto_viv_values[slot]; if (value != NULL) { if (IS_CONCRETE(value)) { MVMROOT2(tc, value, root, { MVMObject *cloned = REPR(value)->allocate(tc, STABLE(value)); /* Ordering here matters. We write the object into the * register before calling copy_to. This is because * if copy_to allocates, obj may have moved after * we called it. This saves us having to put things on * the temporary stack. The GC will know to update it * in the register if it moved. */ result_reg->o = cloned; REPR(value)->copy_to(tc, STABLE(value), OBJECT_BODY(value), cloned, OBJECT_BODY(cloned)); set_obj_at_offset(tc, root, MVM_p6opaque_real_data(tc, OBJECT_BODY(root)), repr_data->attribute_offsets[slot], result_reg->o); }); } else { set_obj_at_offset(tc, root, data, repr_data->attribute_offsets[slot], value); result_reg->o = value; } } else { result_reg->o = tc->instance->VMNull; } } else { result_reg->o = tc->instance->VMNull; } } } else { MVMROOT2(tc, root, attr_st, { /* Need to produce a boxed version of this attribute. */ MVMObject *cloned = attr_st->REPR->allocate(tc, attr_st); /* Ordering here matters too. see comments above */ result_reg->o = cloned; attr_st->REPR->copy_to(tc, attr_st, (char *)MVM_p6opaque_real_data(tc, OBJECT_BODY(root)) + repr_data->attribute_offsets[slot], cloned, OBJECT_BODY(cloned)); }); } break; } case MVM_reg_int64: { if (attr_st) result_reg->i64 = attr_st->REPR->box_funcs.get_int(tc, attr_st, root, (char *)data + repr_data->attribute_offsets[slot]); else invalid_access_kind(tc, "native access", class_handle, name, "int64"); break; } case MVM_reg_num64: { if (attr_st) result_reg->n64 = attr_st->REPR->box_funcs.get_num(tc, attr_st, root, (char *)data + repr_data->attribute_offsets[slot]); else invalid_access_kind(tc, "native access", class_handle, name, "num64"); break; } case MVM_reg_str: { if (attr_st) result_reg->s = attr_st->REPR->box_funcs.get_str(tc, attr_st, root, (char *)data + repr_data->attribute_offsets[slot]); else invalid_access_kind(tc, "native access", class_handle, name, "str"); break; } default: { MVM_exception_throw_adhoc(tc, "P6opaque: invalid kind in attribute lookup in %s", MVM_6model_get_stable_debug_name(tc, st)); } } } else { /* Otherwise, complain that the attribute doesn't exist. */ no_such_attribute(tc, "get a value", class_handle, name, st); } } /* Binds the given value to the specified attribute. */ static void bind_attribute(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, MVMRegister value_reg, MVMuint16 kind) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMint64 slot; data = MVM_p6opaque_real_data(tc, data); if (!repr_data) MVM_exception_throw_adhoc(tc, "P6opaque: must compose %s before using bind_attribute_boxed", MVM_6model_get_stable_debug_name(tc, st)); /* Try the slot allocation first. */ slot = hint >= 0 && hint < repr_data->num_attributes && !(repr_data->mi) ? hint : try_get_slot(tc, repr_data, class_handle, name); if (slot >= 0) { MVMSTable *attr_st = repr_data->flattened_stables[slot]; switch (kind) { case MVM_reg_obj: { MVMObject *value = value_reg.o; if (attr_st) { MVMSTable *value_st = STABLE(value); if (attr_st == value_st) value_st->REPR->copy_to(tc, attr_st, OBJECT_BODY(value), root, (char *)data + repr_data->attribute_offsets[slot]); else MVM_exception_throw_adhoc(tc, "P6opaque: representation mismatch when storing value (of type %s) to attribute (of type %s)", MVM_6model_get_stable_debug_name(tc, value_st), MVM_6model_get_stable_debug_name(tc, attr_st)); } else { set_obj_at_offset(tc, root, data, repr_data->attribute_offsets[slot], value); } break; } case MVM_reg_int64: { if (attr_st) attr_st->REPR->box_funcs.set_int(tc, attr_st, root, (char *)data + repr_data->attribute_offsets[slot], value_reg.i64); else invalid_access_kind(tc, "native bind to", class_handle, name, "int64"); break; } case MVM_reg_num64: { if (attr_st) attr_st->REPR->box_funcs.set_num(tc, attr_st, root, (char *)data + repr_data->attribute_offsets[slot], value_reg.n64); else invalid_access_kind(tc, "native bind to", class_handle, name, "num64"); break; } case MVM_reg_str: { if (attr_st) attr_st->REPR->box_funcs.set_str(tc, attr_st, root, (char *)data + repr_data->attribute_offsets[slot], value_reg.s); else invalid_access_kind(tc, "native bind to", class_handle, name, "str"); break; } default: { MVM_exception_throw_adhoc(tc, "P6opaque: invalid kind in attribute bind in %s", MVM_6model_get_stable_debug_name(tc, st)); } } } else { /* Otherwise, complain that the attribute doesn't exist. */ no_such_attribute(tc, "bind a value", class_handle, name, st); } } /* Checks if an attribute has been initialized. */ static MVMint64 is_attribute_initialized(MVMThreadContext *tc, MVMSTable *st, void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMint64 slot; if (!repr_data) MVM_exception_throw_adhoc(tc, "P6opaque: must compose %s before using bind_attribute_boxed", MVM_6model_get_stable_debug_name(tc, st)); data = MVM_p6opaque_real_data(tc, data); /* This can stay commented out until we actually pass something other than NO_HINT slot = hint >= 0 && hint < repr_data->num_attributes && !(repr_data->mi) ? hint : try_get_slot(tc, repr_data, class_handle, name); */ slot = try_get_slot(tc, repr_data, class_handle, name); if (slot >= 0) return NULL != get_obj_at_offset(data, repr_data->attribute_offsets[slot]); else no_such_attribute(tc, "check if it's initialized", class_handle, name, st); return 0; } /* Gets the hint for the given attribute ID. */ static MVMint64 hint_for(MVMThreadContext *tc, MVMSTable *st, MVMObject *class_key, MVMString *name) { MVMint64 slot; MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; if (!repr_data) return MVM_NO_HINT; slot = try_get_slot(tc, repr_data, class_key, name); return slot >= 0 ? slot : MVM_NO_HINT; } /* Gets an architecture atomic sized native integer attribute as an atomic * reference. */ static AO_t * attribute_as_atomic(MVMThreadContext *tc, MVMSTable *st, void *data, MVMObject *class_handle, MVMString *name) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMint64 slot; data = MVM_p6opaque_real_data(tc, data); if (!repr_data) MVM_exception_throw_adhoc(tc, "P6opaque: must compose %s before using get_attribute", MVM_6model_get_stable_debug_name(tc, st)); slot = try_get_slot(tc, repr_data, class_handle, name); if (slot >= 0) { MVMSTable *attr_st = repr_data->flattened_stables[slot]; if (attr_st) { const MVMStorageSpec *ss = attr_st->REPR->get_storage_spec(tc, attr_st); if (ss->inlineable && ss->boxed_primitive == MVM_STORAGE_SPEC_BP_INT && ss->bits / 8 == sizeof(AO_t)) return (AO_t *)((char *)data + repr_data->attribute_offsets[slot]); } MVM_exception_throw_adhoc(tc, "Can only do an atomic integer operation on an atomicint attribute"); } else { no_such_attribute(tc, "get atomic reference to", class_handle, name, st); } } /* Used with boxing. Sets an integer value, for representations that can hold * one. */ static void set_int(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 value) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; data = MVM_p6opaque_real_data(tc, data); if (repr_data->unbox_int_slot >= 0) { MVMSTable *st = repr_data->flattened_stables[repr_data->unbox_int_slot]; st->REPR->box_funcs.set_int(tc, st, root, (char *)data + repr_data->attribute_offsets[repr_data->unbox_int_slot], value); } else { MVM_exception_throw_adhoc(tc, "This type cannot box a native integer: P6opaque, %s", MVM_6model_get_stable_debug_name(tc, st)); } } /* Used with boxing. Gets an integer value, for representations that can * hold one. */ static MVMint64 get_int(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; data = MVM_p6opaque_real_data(tc, data); if (repr_data->unbox_int_slot >= 0) { MVMSTable *st = repr_data->flattened_stables[repr_data->unbox_int_slot]; return st->REPR->box_funcs.get_int(tc, st, root, (char *)data + repr_data->attribute_offsets[repr_data->unbox_int_slot]); } else { MVM_exception_throw_adhoc(tc, "This type cannot unbox to a native integer: P6opaque, %s", MVM_6model_get_stable_debug_name(tc, st)); } } /* Used with boxing. Sets a floating point value, for representations that can * hold one. */ static void set_num(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMnum64 value) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; data = MVM_p6opaque_real_data(tc, data); if (repr_data->unbox_num_slot >= 0) { MVMSTable *st = repr_data->flattened_stables[repr_data->unbox_num_slot]; st->REPR->box_funcs.set_num(tc, st, root, (char *)data + repr_data->attribute_offsets[repr_data->unbox_num_slot], value); } else { MVM_exception_throw_adhoc(tc, "This type cannot box a native number: P6opaque, %s", MVM_6model_get_stable_debug_name(tc, st)); } } /* Used with boxing. Gets a floating point value, for representations that can * hold one. */ static MVMnum64 get_num(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; data = MVM_p6opaque_real_data(tc, data); if (repr_data->unbox_num_slot >= 0) { MVMSTable *st = repr_data->flattened_stables[repr_data->unbox_num_slot]; return st->REPR->box_funcs.get_num(tc, st, root, (char *)data + repr_data->attribute_offsets[repr_data->unbox_num_slot]); } else { MVM_exception_throw_adhoc(tc, "This type cannot unbox to a native number: P6opaque, %s", MVM_6model_get_stable_debug_name(tc, st)); } } /* Used with boxing. Sets a string value, for representations that can hold * one. */ static void set_str(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMString *value) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; data = MVM_p6opaque_real_data(tc, data); if (repr_data->unbox_str_slot >= 0) { MVMSTable *st = repr_data->flattened_stables[repr_data->unbox_str_slot]; st->REPR->box_funcs.set_str(tc, st, root, (char *)data + repr_data->attribute_offsets[repr_data->unbox_str_slot], value); } else { MVM_exception_throw_adhoc(tc, "This type cannot box a native string: P6opaque, %s", MVM_6model_get_stable_debug_name(tc, st)); } } /* Used with boxing. Gets a string value, for representations that can hold * one. */ static MVMString * get_str(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; data = MVM_p6opaque_real_data(tc, data); if (repr_data->unbox_str_slot >= 0) { MVMSTable *st = repr_data->flattened_stables[repr_data->unbox_str_slot]; return st->REPR->box_funcs.get_str(tc, st, root, (char *)data + repr_data->attribute_offsets[repr_data->unbox_str_slot]); } else { MVM_exception_throw_adhoc(tc, "This type cannot unbox to a native string: P6opaque, %s", MVM_6model_get_stable_debug_name(tc, st)); } } /* Used with boxing. Sets an unsigned integer value, for representations that can hold * one. */ static void set_uint(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMuint64 value) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; data = MVM_p6opaque_real_data(tc, data); if (repr_data->unbox_int_slot >= 0) { MVMSTable *st = repr_data->flattened_stables[repr_data->unbox_int_slot]; st->REPR->box_funcs.set_uint(tc, st, root, (char *)data + repr_data->attribute_offsets[repr_data->unbox_int_slot], value); } else { MVM_exception_throw_adhoc(tc, "This type cannot box a native integer: P6opaque, %s", MVM_6model_get_stable_debug_name(tc, st)); } } /* Used with boxing. Gets an unsigned integer value, for representations that can * hold one. */ static MVMuint64 get_uint(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; data = MVM_p6opaque_real_data(tc, data); if (repr_data->unbox_int_slot >= 0) { MVMSTable *st = repr_data->flattened_stables[repr_data->unbox_int_slot]; return st->REPR->box_funcs.get_uint(tc, st, root, (char *)data + repr_data->attribute_offsets[repr_data->unbox_int_slot]); } else { MVM_exception_throw_adhoc(tc, "This type cannot unbox to a native integer: P6opaque, %s", MVM_6model_get_stable_debug_name(tc, st)); } } static void * get_boxed_ref(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMuint32 repr_id) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; data = MVM_p6opaque_real_data(tc, data); if (repr_data->unbox_slots) { MVMuint16 offset = repr_data->unbox_slots[repr_id]; if (offset != MVM_P6OPAQUE_NO_UNBOX_SLOT) return (char *)data + repr_data->attribute_offsets[offset]; } MVM_exception_throw_adhoc(tc, "P6opaque: get_boxed_ref could not unbox for the representation '%s' of type %s", MVM_repr_get_by_id(tc, repr_id)->name, MVM_6model_get_stable_debug_name(tc, st)); } static const MVMStorageSpec default_storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ ALIGNOF(void *), /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; if (repr_data) return &repr_data->storage_spec; return &default_storage_spec; } static void mk_storage_spec(MVMThreadContext *tc, MVMP6opaqueREPRData * repr_data, MVMStorageSpec *spec) { spec->inlineable = MVM_STORAGE_SPEC_REFERENCE; spec->boxed_primitive = MVM_STORAGE_SPEC_BP_NONE; spec->can_box = 0; if (repr_data->unbox_int_slot >= 0) spec->can_box += MVM_STORAGE_SPEC_CAN_BOX_INT; if (repr_data->unbox_num_slot >= 0) spec->can_box += MVM_STORAGE_SPEC_CAN_BOX_NUM; if (repr_data->unbox_str_slot >= 0) spec->can_box += MVM_STORAGE_SPEC_CAN_BOX_STR; } /* Compose the representation. */ static MVMuint16 * allocate_unbox_slots() { MVMuint16 *slots = MVM_malloc(MVM_REPR_MAX_COUNT * sizeof(MVMuint16)); MVMuint16 i; for (i = 0; i < MVM_REPR_MAX_COUNT; i++) slots[i] = MVM_P6OPAQUE_NO_UNBOX_SLOT; return slots; } static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info_hash) { MVMint64 mro_pos, mro_count, num_parents, total_attrs, num_attrs, cur_slot, cur_type, cur_alloc_addr, cur_obj_attr, cur_init_slot, cur_mark_slot, cur_cleanup_slot, unboxed_type, i; MVMObject *info; MVMP6opaqueREPRData *repr_data; MVMStringConsts str_consts = tc->instance->str_consts; MVMString * const str_avc = str_consts.auto_viv_container; MVMString * const str_name = str_consts.name; MVMString * const str_type = str_consts.type; MVMString * const str_ass_del = str_consts.associative_delegate; MVMString * const str_pos_del = str_consts.positional_delegate; MVMString * const str_attribute = str_consts.attribute; MVMString * const str_box_target = str_consts.box_target; /* Check not already composed. */ if (st->REPR_data) MVM_exception_throw_adhoc(tc, "Type %s is already composed", MVM_6model_get_stable_debug_name(tc, st)); /* Allocate the representation data. */ repr_data = (MVMP6opaqueREPRData *)MVM_calloc(1, sizeof(MVMP6opaqueREPRData)); /* Find attribute information. */ info = MVM_repr_at_key_o(tc, info_hash, str_attribute); if (MVM_is_null(tc, info)) MVM_exception_throw_adhoc(tc, "P6opaque: missing attribute protocol in compose of %s", MVM_6model_get_stable_debug_name(tc, st)); /* In this first pass, we'll loop over the MRO entries, looking for * if there is any multiple inheritance and counting the number of * attributes. */ mro_count = REPR(info)->elems(tc, STABLE(info), info, OBJECT_BODY(info)); mro_pos = mro_count; total_attrs = 0; while (mro_pos--) { /* Get info for the class at the current position. */ MVMObject *class_info = MVM_repr_at_pos_o(tc, info, mro_pos); /* Get its list of attributes and parents. */ MVMObject *attr_list = MVM_repr_at_pos_o(tc, class_info, 1); MVMObject *parent_list = MVM_repr_at_pos_o(tc, class_info, 2); /* If there's more than one parent, set the multiple inheritance * flag (this means we have non-linear layout). */ num_parents = REPR(parent_list)->elems(tc, STABLE(parent_list), parent_list, OBJECT_BODY(parent_list)); if (num_parents > 1) repr_data->mi = 1; /* Add attribute count to the running total. */ total_attrs += REPR(attr_list)->elems(tc, STABLE(attr_list), attr_list, OBJECT_BODY(attr_list)); } /* Fill out and allocate other things we now can. */ repr_data->num_attributes = total_attrs; if (total_attrs) { repr_data->attribute_offsets = MVM_malloc(total_attrs * sizeof(MVMuint16)); repr_data->flattened_stables = (MVMSTable **)MVM_calloc(total_attrs, sizeof(MVMSTable *)); repr_data->auto_viv_values = (MVMObject **)MVM_calloc(total_attrs, sizeof(MVMObject *)); repr_data->gc_obj_mark_offsets = MVM_malloc(total_attrs * sizeof(MVMuint16)); } repr_data->name_to_index_mapping = (MVMP6opaqueNameMap *)MVM_calloc((mro_count + 1), sizeof(MVMP6opaqueNameMap)); repr_data->initialize_slots = MVM_malloc((total_attrs + 1) * sizeof(MVMuint16)); repr_data->gc_mark_slots = MVM_malloc((total_attrs + 1) * sizeof(MVMuint16)); repr_data->gc_cleanup_slots = MVM_malloc((total_attrs + 1) * sizeof(MVMuint16)); /* -1 indicates no unboxing or delegate possible for a type. */ repr_data->unbox_int_slot = -1; repr_data->unbox_num_slot = -1; repr_data->unbox_str_slot = -1; repr_data->pos_del_slot = -1; repr_data->ass_del_slot = -1; /* Second pass populates the rest of the REPR data. */ mro_pos = mro_count; cur_slot = 0; cur_type = 0; cur_alloc_addr = sizeof(MVMP6opaqueBody); cur_obj_attr = 0; cur_init_slot = 0; cur_mark_slot = 0; cur_cleanup_slot = 0; while (mro_pos--) { /* Get info for the class at the current position. */ MVMObject *class_info = MVM_repr_at_pos_o(tc, info, mro_pos); MVMObject *type_obj = MVM_repr_at_pos_o(tc, class_info, 0); MVMObject *attr_list = MVM_repr_at_pos_o(tc, class_info, 1); /* Set up name map entry. */ MVMP6opaqueNameMap *name_map = &repr_data->name_to_index_mapping[cur_type]; num_attrs = REPR(attr_list)->elems(tc, STABLE(attr_list), attr_list, OBJECT_BODY(attr_list)); MVM_ASSIGN_REF(tc, &(st->header), name_map->class_key, type_obj); name_map->num_attrs = num_attrs; if (num_attrs) { name_map->names = MVM_malloc(num_attrs * sizeof(MVMString *)); name_map->slots = MVM_malloc(num_attrs * sizeof(MVMuint16)); } /* Go over the attributes. */ for (i = 0; i < num_attrs; i++) { MVMObject *attr_info = MVM_repr_at_pos_o(tc, attr_list, i); /* Extract name, type and if it's a box target. */ MVMObject *name_obj = MVM_repr_at_key_o(tc, attr_info, str_name); MVMObject *type = MVM_repr_at_key_o(tc, attr_info, str_type); MVMint64 is_box_target = REPR(attr_info)->ass_funcs.exists_key(tc, STABLE(attr_info), attr_info, OBJECT_BODY(attr_info), (MVMObject *)str_box_target); MVMint8 inlined = 0; MVMuint32 bits; MVMuint32 align; /* Ensure we have a name. */ if (MVM_is_null(tc, name_obj)) MVM_exception_throw_adhoc(tc, "P6opaque: %s missing attribute name for attribute %"PRId64, MVM_6model_get_stable_debug_name(tc, st), i); if (REPR(name_obj)->ID == MVM_REPR_ID_MVMString) { MVM_ASSIGN_REF(tc, &(st->header), name_map->names[i], (MVMString *)name_obj); } else { MVM_ASSIGN_REF(tc, &(st->header), name_map->names[i], MVM_repr_get_str(tc, name_obj)); } name_map->slots[i] = cur_slot; /* Consider the type. */ unboxed_type = MVM_STORAGE_SPEC_BP_NONE; bits = sizeof(MVMObject *) * 8; align = ALIGNOF(void *); if (!MVM_is_null(tc, type)) { /* Get the storage spec of the type and see what it wants. */ const MVMStorageSpec *spec = REPR(type)->get_storage_spec(tc, STABLE(type)); if (spec->inlineable == MVM_STORAGE_SPEC_INLINED) { /* Yes, it's something we'll flatten. */ unboxed_type = spec->boxed_primitive; bits = spec->bits; align = spec->align; MVM_ASSIGN_REF(tc, &(st->header), repr_data->flattened_stables[cur_slot], STABLE(type)); inlined = 1; /* Does it need special initialization? */ if (REPR(type)->initialize) { repr_data->initialize_slots[cur_init_slot] = cur_slot; cur_init_slot++; } /* Does it have special GC needs? */ if (REPR(type)->gc_mark) { repr_data->gc_mark_slots[cur_mark_slot] = cur_slot; cur_mark_slot++; } if (REPR(type)->gc_cleanup) { repr_data->gc_cleanup_slots[cur_cleanup_slot] = cur_slot; cur_cleanup_slot++; } /* Is it a target for box/unbox operations? */ if (is_box_target) { /* If it boxes a primitive, note that. */ switch (unboxed_type) { case MVM_STORAGE_SPEC_BP_INT: if (repr_data->unbox_int_slot >= 0) MVM_exception_throw_adhoc(tc, "While composing %s: Duplicate box_target for native int: attributes %d and %"PRId64, MVM_6model_get_stable_debug_name(tc, st), repr_data->unbox_int_slot, i); repr_data->unbox_int_slot = cur_slot; break; case MVM_STORAGE_SPEC_BP_NUM: if (repr_data->unbox_num_slot >= 0) MVM_exception_throw_adhoc(tc, "While composing %s: Duplicate box_target for native num: attributes %d and %"PRId64, MVM_6model_get_stable_debug_name(tc, st), repr_data->unbox_num_slot, i); repr_data->unbox_num_slot = cur_slot; break; case MVM_STORAGE_SPEC_BP_STR: if (repr_data->unbox_str_slot >= 0) MVM_exception_throw_adhoc(tc, "While composing %s: Duplicate box_target for native str: attributes %d and %"PRId64, MVM_6model_get_stable_debug_name(tc, st), repr_data->unbox_str_slot, i); repr_data->unbox_str_slot = cur_slot; break; default: /* nothing, just suppress 'missing default' warning */ break; } /* Also list in the by-repr unbox list. */ if (repr_data->unbox_slots == NULL) repr_data->unbox_slots = allocate_unbox_slots(); repr_data->unbox_slots[REPR(type)->ID] = cur_slot; } } } /* C structure needs careful alignment. If cur_alloc_addr is not * aligned to align bytes (cur_alloc_addr % align), make sure it is * before we add the next element. */ if (cur_alloc_addr % align) { cur_alloc_addr += align - cur_alloc_addr % align; } /* Attribute will live at the current position in the object. */ repr_data->attribute_offsets[cur_slot] = cur_alloc_addr; /* Handle object attributes, which need marking and may have auto-viv needs. */ if (!inlined) { repr_data->gc_obj_mark_offsets[cur_obj_attr] = cur_alloc_addr; if (MVM_repr_exists_key(tc, attr_info, str_avc)) MVM_ASSIGN_REF(tc, &(st->header), repr_data->auto_viv_values[cur_slot], MVM_repr_at_key_o(tc, attr_info, str_avc)); cur_obj_attr++; } /* Is it a positional or associative delegate? */ if (MVM_repr_exists_key(tc, attr_info, str_pos_del)) { if (repr_data->pos_del_slot != -1) MVM_exception_throw_adhoc(tc, "While composing %s: Duplicate positional delegate attributes: %d and %"PRId64"", MVM_6model_get_stable_debug_name(tc, st), repr_data->pos_del_slot, cur_slot); if (unboxed_type == MVM_STORAGE_SPEC_BP_NONE) repr_data->pos_del_slot = cur_slot; else MVM_exception_throw_adhoc(tc, "While composing %s: Positional delegate attribute must be a reference type", MVM_6model_get_stable_debug_name(tc, st)); } if (MVM_repr_exists_key(tc, attr_info, str_ass_del)) { if (repr_data->ass_del_slot != -1) MVM_exception_throw_adhoc(tc, "While composing %s: Duplicate associative delegate attributes: %d and %"PRId64, MVM_6model_get_stable_debug_name(tc, st), repr_data->pos_del_slot, cur_slot); if (unboxed_type == MVM_STORAGE_SPEC_BP_NONE) repr_data->ass_del_slot = cur_slot; else MVM_exception_throw_adhoc(tc, "While composing %s: Associative delegate attribute must be a reference type", MVM_6model_get_stable_debug_name(tc, st)); } /* Add the required space for this type. */ cur_alloc_addr += bits / 8; /* Increment slot count. */ cur_slot++; } /* Increment name map type index. */ cur_type++; } /* Add allocated amount for body to have total object size. */ st->size = sizeof(MVMP6opaque) + (cur_alloc_addr - sizeof(MVMP6opaqueBody)); /* Add sentinels/counts. */ repr_data->gc_obj_mark_offsets_count = cur_obj_attr; repr_data->initialize_slots[cur_init_slot] = -1; repr_data->gc_mark_slots[cur_mark_slot] = -1; repr_data->gc_cleanup_slots[cur_cleanup_slot] = -1; /* Add storage spec */ mk_storage_spec(tc, repr_data, &repr_data->storage_spec); /* Install representation data. */ st->REPR_data = repr_data; } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { /* To calculate size, we need number of attributes and to know about * anything flattend in. */ MVMint64 num_attributes = MVM_serialization_read_int(tc, reader); MVMuint32 cur_offset = sizeof(MVMP6opaque); MVMint64 i; for (i = 0; i < num_attributes; i++) { if (MVM_serialization_read_int(tc, reader)) { MVMSTable *st = MVM_serialization_read_stable_ref(tc, reader); const MVMStorageSpec *ss = st->REPR->get_storage_spec(tc, st); if (ss->inlineable) { /* TODO: Review if/when we get sub-byte things. */ if (cur_offset % ss->align) { cur_offset += ss->align - cur_offset % ss->align; } cur_offset += ss->bits / 8; } else cur_offset += sizeof(MVMObject *); } else { cur_offset += sizeof(MVMObject *); } } st->size = cur_offset; } /* Serializes the REPR data. */ static void serialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationWriter *writer) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMuint16 i, num_classes; if (!repr_data) MVM_exception_throw_adhoc(tc, "Representation for %s must be composed before it can be serialized", MVM_6model_get_stable_debug_name(tc, st)); MVM_serialization_write_int(tc, writer, repr_data->num_attributes); for (i = 0; i < repr_data->num_attributes; i++) { MVM_serialization_write_int(tc, writer, repr_data->flattened_stables[i] != NULL); if (repr_data->flattened_stables[i]) MVM_serialization_write_stable_ref(tc, writer, repr_data->flattened_stables[i]); } MVM_serialization_write_int(tc, writer, repr_data->mi); if (repr_data->auto_viv_values) { MVM_serialization_write_int(tc, writer, 1); for (i = 0; i < repr_data->num_attributes; i++) MVM_serialization_write_ref(tc, writer, repr_data->auto_viv_values[i]); } else { MVM_serialization_write_int(tc, writer, 0); } MVM_serialization_write_int(tc, writer, repr_data->unbox_int_slot); MVM_serialization_write_int(tc, writer, repr_data->unbox_num_slot); MVM_serialization_write_int(tc, writer, repr_data->unbox_str_slot); if (repr_data->unbox_slots) { MVMuint32 num_written = 0; MVM_serialization_write_int(tc, writer, 1); for (i = 0; i < MVM_REPR_MAX_COUNT; i++) { if (repr_data->unbox_slots[i] != MVM_P6OPAQUE_NO_UNBOX_SLOT) { MVM_serialization_write_int(tc, writer, i); MVM_serialization_write_int(tc, writer, repr_data->unbox_slots[i]); num_written++; } } for (i = num_written; i < repr_data->num_attributes; i++) { MVM_serialization_write_int(tc, writer, 0); MVM_serialization_write_int(tc, writer, 0); } } else { MVM_serialization_write_int(tc, writer, 0); } i = 0; while (repr_data->name_to_index_mapping[i].class_key) i++; num_classes = i; MVM_serialization_write_int(tc, writer, num_classes); for (i = 0; i < num_classes; i++) { const MVMuint32 num_attrs = repr_data->name_to_index_mapping[i].num_attrs; MVMuint32 j; MVM_serialization_write_ref(tc, writer, repr_data->name_to_index_mapping[i].class_key); MVM_serialization_write_int(tc, writer, num_attrs); for (j = 0; j < num_attrs; j++) { MVM_serialization_write_str(tc, writer, repr_data->name_to_index_mapping[i].names[j]); MVM_serialization_write_int(tc, writer, repr_data->name_to_index_mapping[i].slots[j]); } } MVM_serialization_write_int(tc, writer, repr_data->pos_del_slot); MVM_serialization_write_int(tc, writer, repr_data->ass_del_slot); } /* Deserializes representation data. */ static void deserialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { MVMuint16 i, j, num_classes, cur_offset; MVMint16 cur_initialize_slot, cur_gc_mark_slot, cur_gc_cleanup_slot; MVMP6opaqueREPRData *repr_data = MVM_malloc(sizeof(MVMP6opaqueREPRData)); repr_data->num_attributes = (MVMuint16)MVM_serialization_read_int(tc, reader); repr_data->flattened_stables = (MVMSTable **)MVM_malloc(P6OMAX(repr_data->num_attributes, 1) * sizeof(MVMSTable *)); for (i = 0; i < repr_data->num_attributes; i++) if (MVM_serialization_read_int(tc, reader)) { MVM_ASSIGN_REF(tc, &(st->header), repr_data->flattened_stables[i], MVM_serialization_read_stable_ref(tc, reader)); } else { repr_data->flattened_stables[i] = NULL; } repr_data->mi = MVM_serialization_read_int(tc, reader); if (MVM_serialization_read_int(tc, reader)) { repr_data->auto_viv_values = (MVMObject **)MVM_malloc(P6OMAX(repr_data->num_attributes, 1) * sizeof(MVMObject *)); for (i = 0; i < repr_data->num_attributes; i++) MVM_ASSIGN_REF(tc, &(st->header), repr_data->auto_viv_values[i], MVM_serialization_read_ref(tc, reader)); } else { repr_data->auto_viv_values = NULL; } repr_data->unbox_int_slot = MVM_serialization_read_int(tc, reader); repr_data->unbox_num_slot = MVM_serialization_read_int(tc, reader); repr_data->unbox_str_slot = MVM_serialization_read_int(tc, reader); if (MVM_serialization_read_int(tc, reader)) { repr_data->unbox_slots = allocate_unbox_slots(); for (i = 0; i < repr_data->num_attributes; i++) { MVMuint16 repr_id = MVM_serialization_read_int(tc, reader); MVMuint16 slot = MVM_serialization_read_int(tc, reader); if (repr_id) repr_data->unbox_slots[repr_id] = slot; } } else { repr_data->unbox_slots = NULL; } num_classes = (MVMuint16)MVM_serialization_read_int(tc, reader); repr_data->name_to_index_mapping = (MVMP6opaqueNameMap *)MVM_malloc((num_classes + 1) * sizeof(MVMP6opaqueNameMap)); for (i = 0; i < num_classes; i++) { MVMint32 num_attrs = 0; MVM_ASSIGN_REF(tc, &(st->header), repr_data->name_to_index_mapping[i].class_key, MVM_serialization_read_ref(tc, reader)); num_attrs = MVM_serialization_read_int(tc, reader); repr_data->name_to_index_mapping[i].names = (MVMString **)MVM_malloc(P6OMAX(num_attrs, 1) * sizeof(MVMString *)); repr_data->name_to_index_mapping[i].slots = (MVMuint16 *)MVM_malloc(P6OMAX(num_attrs, 1) * sizeof(MVMuint16)); for (j = 0; j < num_attrs; j++) { MVM_ASSIGN_REF(tc, &(st->header), repr_data->name_to_index_mapping[i].names[j], MVM_serialization_read_str(tc, reader)); repr_data->name_to_index_mapping[i].slots[j] = (MVMuint16)MVM_serialization_read_int(tc, reader); } repr_data->name_to_index_mapping[i].num_attrs = num_attrs; } /* set the last one to be NULL */ repr_data->name_to_index_mapping[i].class_key = NULL; repr_data->pos_del_slot = (MVMint16)MVM_serialization_read_int(tc, reader); repr_data->ass_del_slot = (MVMint16)MVM_serialization_read_int(tc, reader); /* Re-calculate the remaining info, which is platform specific or * derived information. */ repr_data->attribute_offsets = (MVMuint16 *)MVM_malloc(P6OMAX(repr_data->num_attributes, 1) * sizeof(MVMuint16)); repr_data->gc_obj_mark_offsets = (MVMuint16 *)MVM_malloc(P6OMAX(repr_data->num_attributes, 1) * sizeof(MVMuint16)); repr_data->initialize_slots = (MVMint16 *)MVM_malloc((repr_data->num_attributes + 1) * sizeof(MVMint16)); repr_data->gc_mark_slots = (MVMint16 *)MVM_malloc((repr_data->num_attributes + 1) * sizeof(MVMint16)); repr_data->gc_cleanup_slots = (MVMint16 *)MVM_malloc((repr_data->num_attributes + 1) * sizeof(MVMint16)); repr_data->gc_obj_mark_offsets_count = 0; cur_offset = sizeof(MVMP6opaqueBody); cur_initialize_slot = 0; cur_gc_mark_slot = 0; cur_gc_cleanup_slot = 0; for (i = 0; i < repr_data->num_attributes; i++) { if (repr_data->flattened_stables[i] == NULL) { /* Store position. */ repr_data->attribute_offsets[i] = cur_offset; /* Reference type. Needs marking. */ repr_data->gc_obj_mark_offsets[repr_data->gc_obj_mark_offsets_count] = cur_offset; repr_data->gc_obj_mark_offsets_count++; /* Increment by pointer size. */ cur_offset += sizeof(MVMObject *); } else { /* Store position. */ MVMSTable *cur_st = repr_data->flattened_stables[i]; const MVMStorageSpec *spec = cur_st->REPR->get_storage_spec(tc, cur_st); /* Set up flags for initialization and GC. */ if (cur_st->REPR->initialize) repr_data->initialize_slots[cur_initialize_slot++] = i; if (cur_st->REPR->gc_mark) repr_data->gc_mark_slots[cur_gc_mark_slot++] = i; if (cur_st->REPR->gc_cleanup) repr_data->gc_cleanup_slots[cur_gc_cleanup_slot++] = i; if (spec->align == 0) { MVM_exception_throw_adhoc(tc, "Serialization error: Storage Spec of P6opaque must not have align set to 0."); } if (cur_offset % spec->align) { cur_offset += spec->align - cur_offset % spec->align; } repr_data->attribute_offsets[i] = cur_offset; /* Increment by size reported by representation. */ cur_offset += spec->bits / 8; } } repr_data->initialize_slots[cur_initialize_slot] = -1; repr_data->gc_mark_slots[cur_gc_mark_slot] = -1; repr_data->gc_cleanup_slots[cur_gc_cleanup_slot] = -1; mk_storage_spec(tc, repr_data, &repr_data->storage_spec); st->REPR_data = repr_data; } /* Deserializes the data. */ static void deserialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMSerializationReader *reader) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMuint16 num_attributes = repr_data->num_attributes; MVMuint16 i; for (i = 0; i < num_attributes; i++) { MVMuint16 a_offset = repr_data->attribute_offsets[i]; MVMSTable *a_st = repr_data->flattened_stables[i]; if (a_st) a_st->REPR->deserialize(tc, a_st, root, (char *)data + a_offset, reader); else set_obj_at_offset(tc, root, data, a_offset, MVM_serialization_read_ref(tc, reader)); } } /* Serializes the object's body. */ static void serialize(MVMThreadContext *tc, MVMSTable *st, void *data, MVMSerializationWriter *writer) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMuint16 num_attributes; MVMuint16 i; if (!repr_data) MVM_exception_throw_adhoc(tc, "Representation of %s must be composed before it can be serialized", MVM_6model_get_stable_debug_name(tc, st)); num_attributes = repr_data->num_attributes; data = MVM_p6opaque_real_data(tc, data); for (i = 0; i < num_attributes; i++) { MVMuint16 a_offset = repr_data->attribute_offsets[i]; MVMSTable *a_st = repr_data->flattened_stables[i]; if (a_st) { if (a_st->REPR->serialize) a_st->REPR->serialize(tc, a_st, (char *)data + a_offset, writer); else MVM_exception_throw_adhoc(tc, "Missing serialize REPR function for REPR %s in type %s", a_st->REPR->name, MVM_6model_get_stable_debug_name(tc, a_st)); } else MVM_serialization_write_ref(tc, writer, get_obj_at_offset(data, a_offset)); } } /* Performs a change of type, where possible. */ static void change_type(MVMThreadContext *tc, MVMObject *obj, MVMObject *new_type) { MVMP6opaqueREPRData *cur_repr_data = (MVMP6opaqueREPRData *)STABLE(obj)->REPR_data; MVMP6opaqueREPRData *new_repr_data = (MVMP6opaqueREPRData *)STABLE(new_type)->REPR_data; MVMP6opaqueNameMap *cur_map_entry, *new_map_entry; /* Ensure we don't have a type object. */ if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot change the type of a %s type object", MVM_6model_get_debug_name(tc, obj)); /* Ensure that the REPR of the new type is also P6opaque. */ if (REPR(new_type)->ID != REPR(obj)->ID) MVM_exception_throw_adhoc(tc, "New type for %s must have a matching representation (P6opaque vs %s)", MVM_6model_get_debug_name(tc, obj), REPR(new_type)->name); /* Ensure the MRO prefixes match up. */ cur_map_entry = cur_repr_data->name_to_index_mapping; new_map_entry = new_repr_data->name_to_index_mapping; while (cur_map_entry->class_key != NULL && cur_map_entry->num_attrs == 0) cur_map_entry++; while (new_map_entry->class_key != NULL && new_map_entry->num_attrs == 0) new_map_entry++; while (cur_map_entry->class_key != NULL) { if (new_map_entry->class_key == NULL || new_map_entry->class_key != cur_map_entry->class_key) MVM_exception_throw_adhoc(tc, "Incompatible MROs in P6opaque rebless for types %s and %s", MVM_6model_get_debug_name(tc, obj), MVM_6model_get_debug_name(tc, new_type)); cur_map_entry++; new_map_entry++; } /* Resize if needed. */ if (STABLE(obj)->size != STABLE(new_type)->size) { /* Get current object body. */ MVMP6opaqueBody *body = (MVMP6opaqueBody *)OBJECT_BODY(obj); void *old = body->replaced ? body->replaced : body; /* Allocate new memory. */ size_t new_size = STABLE(new_type)->size - sizeof(MVMObject); void *new = MVM_malloc(new_size); memset((char *)new + (STABLE(obj)->size - sizeof(MVMObject)), 0, new_size - (STABLE(obj)->size - sizeof(MVMObject))); /* Copy existing to new. * XXX Need more care here, as may have to re-barrier pointers. */ memcpy(new, old, STABLE(obj)->size - sizeof(MVMObject)); /* Pointer switch, taking care of existing body issues. */ if (body->replaced) { body->replaced = new; MVM_free(old); } else { body->replaced = new; } } /* Finally, ready to switch over the STable. */ MVM_ASSIGN_REF(tc, &(obj->header), obj->st, STABLE(new_type)); } static void die_no_pos_del(MVMThreadContext *tc, MVMSTable *st) { MVM_exception_throw_adhoc(tc, "This type (%s) does not support positional operations", MVM_6model_get_stable_debug_name(tc, st)); } static void at_pos(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister *value, MVMuint16 kind) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMObject *del; if (repr_data->pos_del_slot == -1) die_no_pos_del(tc, st); data = MVM_p6opaque_real_data(tc, data); del = get_obj_at_offset(data, repr_data->attribute_offsets[repr_data->pos_del_slot]); REPR(del)->pos_funcs.at_pos(tc, STABLE(del), del, OBJECT_BODY(del), index, value, kind); } static void bind_pos(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister value, MVMuint16 kind) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMObject *del; if (repr_data->pos_del_slot == -1) die_no_pos_del(tc, st); data = MVM_p6opaque_real_data(tc, data); del = get_obj_at_offset(data, repr_data->attribute_offsets[repr_data->pos_del_slot]); REPR(del)->pos_funcs.bind_pos(tc, STABLE(del), del, OBJECT_BODY(del), index, value, kind); } static void set_elems(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMuint64 count) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMObject *del; if (repr_data->pos_del_slot == -1) die_no_pos_del(tc, st); data = MVM_p6opaque_real_data(tc, data); del = get_obj_at_offset(data, repr_data->attribute_offsets[repr_data->pos_del_slot]); REPR(del)->pos_funcs.set_elems(tc, STABLE(del), del, OBJECT_BODY(del), count); } static void push(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister value, MVMuint16 kind) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMObject *del; if (repr_data->pos_del_slot == -1) die_no_pos_del(tc, st); data = MVM_p6opaque_real_data(tc, data); del = get_obj_at_offset(data, repr_data->attribute_offsets[repr_data->pos_del_slot]); REPR(del)->pos_funcs.push(tc, STABLE(del), del, OBJECT_BODY(del), value, kind); } static void pop(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMObject *del; if (repr_data->pos_del_slot == -1) die_no_pos_del(tc, st); data = MVM_p6opaque_real_data(tc, data); del = get_obj_at_offset(data, repr_data->attribute_offsets[repr_data->pos_del_slot]); REPR(del)->pos_funcs.pop(tc, STABLE(del), del, OBJECT_BODY(del), value, kind); } static void unshift(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister value, MVMuint16 kind) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMObject *del; if (repr_data->pos_del_slot == -1) die_no_pos_del(tc, st); data = MVM_p6opaque_real_data(tc, data); del = get_obj_at_offset(data, repr_data->attribute_offsets[repr_data->pos_del_slot]); REPR(del)->pos_funcs.unshift(tc, STABLE(del), del, OBJECT_BODY(del), value, kind); } static void shift(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMObject *del; if (repr_data->pos_del_slot == -1) die_no_pos_del(tc, st); data = MVM_p6opaque_real_data(tc, data); del = get_obj_at_offset(data, repr_data->attribute_offsets[repr_data->pos_del_slot]); REPR(del)->pos_funcs.shift(tc, STABLE(del), del, OBJECT_BODY(del), value, kind); } static void osplice(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *target_array, MVMint64 offset, MVMuint64 elems) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMObject *del; if (repr_data->pos_del_slot == -1) die_no_pos_del(tc, st); data = MVM_p6opaque_real_data(tc, data); del = get_obj_at_offset(data, repr_data->attribute_offsets[repr_data->pos_del_slot]); REPR(del)->pos_funcs.splice(tc, STABLE(del), del, OBJECT_BODY(del), target_array, offset, elems); } static void die_no_ass_del(MVMThreadContext *tc, MVMSTable *st) { MVM_exception_throw_adhoc(tc, "This type (%s) does not support associative operations", MVM_6model_get_stable_debug_name(tc, st)); } static void at_key(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key, MVMRegister *result, MVMuint16 kind) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMObject *del; if (repr_data->ass_del_slot == -1) die_no_ass_del(tc, st); data = MVM_p6opaque_real_data(tc, data); del = get_obj_at_offset(data, repr_data->attribute_offsets[repr_data->ass_del_slot]); REPR(del)->ass_funcs.at_key(tc, STABLE(del), del, OBJECT_BODY(del), key, result, kind); } static void bind_key(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key, MVMRegister value, MVMuint16 kind) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMObject *del; if (repr_data->ass_del_slot == -1) die_no_ass_del(tc, st); data = MVM_p6opaque_real_data(tc, data); del = get_obj_at_offset(data, repr_data->attribute_offsets[repr_data->ass_del_slot]); REPR(del)->ass_funcs.bind_key(tc, STABLE(del), del, OBJECT_BODY(del), key, value, kind); } static MVMint64 exists_key(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMObject *del; if (repr_data->ass_del_slot == -1) die_no_ass_del(tc, st); data = MVM_p6opaque_real_data(tc, data); del = get_obj_at_offset(data, repr_data->attribute_offsets[repr_data->ass_del_slot]); return REPR(del)->ass_funcs.exists_key(tc, STABLE(del), del, OBJECT_BODY(del), key); } static void delete_key(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMObject *del; if (repr_data->ass_del_slot == -1) die_no_ass_del(tc, st); data = MVM_p6opaque_real_data(tc, data); del = get_obj_at_offset(data, repr_data->attribute_offsets[repr_data->ass_del_slot]); REPR(del)->ass_funcs.delete_key(tc, STABLE(del), del, OBJECT_BODY(del), key); } static MVMuint64 elems(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)st->REPR_data; data = MVM_p6opaque_real_data(tc, data); if (repr_data->pos_del_slot >= 0) { MVMObject *del = get_obj_at_offset(data, repr_data->attribute_offsets[repr_data->pos_del_slot]); return REPR(del)->elems(tc, STABLE(del), del, OBJECT_BODY(del)); } else if (repr_data->ass_del_slot >= 0) { MVMObject *del = get_obj_at_offset(data, repr_data->attribute_offsets[repr_data->ass_del_slot]); return REPR(del)->elems(tc, STABLE(del), del, OBJECT_BODY(del)); } else { MVM_exception_throw_adhoc(tc, "This type (%s) does not support elems", MVM_6model_get_stable_debug_name(tc, st)); } } /* Bytecode specialization for this REPR. */ static MVMString * spesh_attr_name(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshOperand o, MVMint32 indirect) { if (indirect) { MVMSpeshFacts *name_facts = MVM_spesh_get_and_use_facts(tc, g, o); if (name_facts->flags & MVM_SPESH_FACT_KNOWN_VALUE) return name_facts->value.s; else return NULL; } else { return MVM_spesh_get_string(tc, g, o); } } static void spesh(MVMThreadContext *tc, MVMSTable *st, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMP6opaqueREPRData * repr_data = (MVMP6opaqueREPRData *)st->REPR_data; MVMuint16 opcode = ins->info->opcode; if (!repr_data) return; switch (opcode) { case MVM_OP_create: { /* Create can be optimized if there are no initialization slots. */ if (repr_data->initialize_slots[0] < 0 && !(st->mode_flags & MVM_FINALIZE_TYPE)) { MVMSpeshOperand target = ins->operands[0]; MVMSpeshOperand type = ins->operands[1]; ins->info = MVM_op_get_op(MVM_OP_sp_fastcreate); ins->operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand)); ins->operands[0] = target; ins->operands[1].lit_i16 = st->size; ins->operands[2].lit_i16 = MVM_spesh_add_spesh_slot(tc, g, (MVMCollectable *)st); MVM_spesh_get_facts(tc, g, type)->usages--; } break; } case MVM_OP_getattr_o: case MVM_OP_getattrs_o: { MVMSpeshFacts *obj_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[1]); MVMSpeshFacts *ch_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[2]); MVMString *name = spesh_attr_name(tc, g, ins->operands[3], opcode == MVM_OP_getattrs_o); if (name && ch_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && ch_facts->type && obj_facts->flags & MVM_SPESH_FACT_CONCRETE) { MVMint64 slot = try_get_slot(tc, repr_data, ch_facts->type, name); if (slot >= 0 && !repr_data->flattened_stables[slot]) { if (repr_data->auto_viv_values && repr_data->auto_viv_values[slot]) { MVMObject *av_value = repr_data->auto_viv_values[slot]; if (IS_CONCRETE(av_value)) { ins->info = MVM_op_get_op(MVM_OP_sp_p6ogetvc_o); } else { ins->info = MVM_op_get_op(MVM_OP_sp_p6ogetvt_o); } if (opcode == MVM_OP_getattrs_o) MVM_spesh_get_facts(tc, g, ins->operands[3])->usages--; MVM_spesh_get_facts(tc, g, ins->operands[2])->usages--; ins->operands[2].lit_i16 = repr_data->attribute_offsets[slot]; ins->operands[3].lit_i16 = MVM_spesh_add_spesh_slot(tc, g, (MVMCollectable *)av_value); } else { if (opcode == MVM_OP_getattrs_o) MVM_spesh_get_facts(tc, g, ins->operands[3])->usages--; MVM_spesh_get_facts(tc, g, ins->operands[2])->usages--; ins->info = MVM_op_get_op(MVM_OP_sp_p6oget_o); ins->operands[2].lit_i16 = repr_data->attribute_offsets[slot]; MVM_spesh_manipulate_remove_handler_successors(tc, bb); } } } break; } case MVM_OP_getattr_i: case MVM_OP_getattrs_i: { MVMSpeshFacts *obj_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[1]); MVMSpeshFacts *ch_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[2]); MVMString *name = spesh_attr_name(tc, g, ins->operands[3], opcode == MVM_OP_getattrs_i); if (name && ch_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && ch_facts->type && obj_facts->flags & MVM_SPESH_FACT_CONCRETE) { MVMint64 slot = try_get_slot(tc, repr_data, ch_facts->type, name); if (slot >= 0 && repr_data->flattened_stables[slot]) { MVMSTable *flat_st = repr_data->flattened_stables[slot]; const MVMStorageSpec *flat_ss = flat_st->REPR->get_storage_spec(tc, flat_st); if (flat_st->REPR->ID == MVM_REPR_ID_P6int && flat_ss->bits == 64) { if (opcode == MVM_OP_getattrs_i) MVM_spesh_get_facts(tc, g, ins->operands[3])->usages--; MVM_spesh_get_facts(tc, g, ins->operands[2])->usages--; ins->info = MVM_op_get_op(MVM_OP_sp_p6oget_i); ins->operands[2].lit_i16 = repr_data->attribute_offsets[slot]; } } } break; } case MVM_OP_getattr_n: case MVM_OP_getattrs_n: { MVMSpeshFacts *obj_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[1]); MVMSpeshFacts *ch_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[2]); MVMString *name = spesh_attr_name(tc, g, ins->operands[3], opcode == MVM_OP_getattrs_n); if (name && ch_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && ch_facts->type && obj_facts->flags & MVM_SPESH_FACT_CONCRETE) { MVMint64 slot = try_get_slot(tc, repr_data, ch_facts->type, name); if (slot >= 0 && repr_data->flattened_stables[slot]) { MVMSTable *flat_st = repr_data->flattened_stables[slot]; const MVMStorageSpec *flat_ss = flat_st->REPR->get_storage_spec(tc, flat_st); if (flat_st->REPR->ID == MVM_REPR_ID_P6num && flat_ss->bits == 64) { if (opcode == MVM_OP_getattrs_n) MVM_spesh_get_facts(tc, g, ins->operands[3])->usages--; MVM_spesh_get_facts(tc, g, ins->operands[2])->usages--; ins->info = MVM_op_get_op(MVM_OP_sp_p6oget_n); ins->operands[2].lit_i16 = repr_data->attribute_offsets[slot]; } } } break; } case MVM_OP_getattr_s: case MVM_OP_getattrs_s: { MVMSpeshFacts *obj_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[1]); MVMSpeshFacts *ch_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[2]); MVMString *name = spesh_attr_name(tc, g, ins->operands[3], opcode == MVM_OP_getattrs_s); if (name && ch_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && ch_facts->type && obj_facts->flags & MVM_SPESH_FACT_CONCRETE) { MVMint64 slot = try_get_slot(tc, repr_data, ch_facts->type, name); if (slot >= 0 && repr_data->flattened_stables[slot]) { MVMSTable *flat_st = repr_data->flattened_stables[slot]; if (flat_st->REPR->ID == MVM_REPR_ID_P6str) { if (opcode == MVM_OP_getattrs_s) MVM_spesh_get_facts(tc, g, ins->operands[3])->usages--; MVM_spesh_get_facts(tc, g, ins->operands[2])->usages--; ins->info = MVM_op_get_op(MVM_OP_sp_p6oget_s); ins->operands[2].lit_i16 = repr_data->attribute_offsets[slot]; } } } break; } case MVM_OP_bindattr_o: case MVM_OP_bindattrs_o: { MVMSpeshFacts *obj_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[0]); MVMSpeshFacts *ch_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[1]); MVMString *name = spesh_attr_name(tc, g, ins->operands[2], opcode == MVM_OP_bindattrs_o); if (name && ch_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && ch_facts->type && obj_facts->flags & MVM_SPESH_FACT_CONCRETE) { MVMint64 slot = try_get_slot(tc, repr_data, ch_facts->type, name); if (slot >= 0 && !repr_data->flattened_stables[slot]) { if (opcode == MVM_OP_bindattrs_o) MVM_spesh_get_facts(tc, g, ins->operands[2])->usages--; MVM_spesh_get_facts(tc, g, ins->operands[1])->usages--; ins->info = MVM_op_get_op(MVM_OP_sp_p6obind_o); ins->operands[1].lit_i16 = repr_data->attribute_offsets[slot]; ins->operands[2] = ins->operands[3]; } } break; } case MVM_OP_bindattr_i: case MVM_OP_bindattrs_i: { MVMSpeshFacts *obj_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[0]); MVMSpeshFacts *ch_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[1]); MVMString *name = spesh_attr_name(tc, g, ins->operands[2], opcode == MVM_OP_bindattrs_i); if (name && ch_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && ch_facts->type && obj_facts->flags & MVM_SPESH_FACT_CONCRETE) { MVMint64 slot = try_get_slot(tc, repr_data, ch_facts->type, name); if (slot >= 0 && repr_data->flattened_stables[slot]) { MVMSTable *flat_st = repr_data->flattened_stables[slot]; const MVMStorageSpec *flat_ss = flat_st->REPR->get_storage_spec(tc, flat_st); if (flat_st->REPR->ID == MVM_REPR_ID_P6int && flat_ss->bits == 64) { if (opcode == MVM_OP_bindattrs_i) MVM_spesh_get_facts(tc, g, ins->operands[2])->usages--; MVM_spesh_get_facts(tc, g, ins->operands[1])->usages--; ins->info = MVM_op_get_op(MVM_OP_sp_p6obind_i); ins->operands[1].lit_i16 = repr_data->attribute_offsets[slot]; ins->operands[2] = ins->operands[3]; } } } break; } case MVM_OP_bindattr_n: case MVM_OP_bindattrs_n: { MVMSpeshFacts *obj_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[0]); MVMSpeshFacts *ch_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[1]); MVMString *name = spesh_attr_name(tc, g, ins->operands[2], opcode == MVM_OP_bindattrs_n); if (name && ch_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && ch_facts->type && obj_facts->flags & MVM_SPESH_FACT_CONCRETE) { MVMint64 slot = try_get_slot(tc, repr_data, ch_facts->type, name); if (slot >= 0 && repr_data->flattened_stables[slot]) { MVMSTable *flat_st = repr_data->flattened_stables[slot]; const MVMStorageSpec *flat_ss = flat_st->REPR->get_storage_spec(tc, flat_st); if (flat_st->REPR->ID == MVM_REPR_ID_P6num && flat_ss->bits == 64) { if (opcode == MVM_OP_bindattrs_n) MVM_spesh_get_facts(tc, g, ins->operands[2])->usages--; MVM_spesh_get_facts(tc, g, ins->operands[1])->usages--; ins->info = MVM_op_get_op(MVM_OP_sp_p6obind_n); ins->operands[1].lit_i16 = repr_data->attribute_offsets[slot]; ins->operands[2] = ins->operands[3]; } } } break; } case MVM_OP_bindattr_s: case MVM_OP_bindattrs_s: { MVMSpeshFacts *obj_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[0]); MVMSpeshFacts *ch_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[1]); MVMString *name = spesh_attr_name(tc, g, ins->operands[2], opcode == MVM_OP_bindattrs_s); if (name && ch_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && ch_facts->type && obj_facts->flags & MVM_SPESH_FACT_CONCRETE) { MVMint64 slot = try_get_slot(tc, repr_data, ch_facts->type, name); if (slot >= 0 && repr_data->flattened_stables[slot]) { MVMSTable *flat_st = repr_data->flattened_stables[slot]; if (flat_st->REPR->ID == MVM_REPR_ID_P6str) { if (opcode == MVM_OP_bindattrs_s) MVM_spesh_get_facts(tc, g, ins->operands[2])->usages--; MVM_spesh_get_facts(tc, g, ins->operands[1])->usages--; ins->info = MVM_op_get_op(MVM_OP_sp_p6obind_s); ins->operands[1].lit_i16 = repr_data->attribute_offsets[slot]; ins->operands[2] = ins->operands[3]; } } } break; } } } /* Initializes the representation. */ const MVMREPROps * MVMP6opaque_initialize(MVMThreadContext *tc) { return &P6opaque_this_repr; } static const MVMREPROps P6opaque_this_repr = { type_object_for, allocate, initialize, copy_to, { get_attribute, bind_attribute, hint_for, is_attribute_initialized, attribute_as_atomic }, /* attr_funcs */ { set_int, get_int, set_num, get_num, set_str, get_str, set_uint, get_uint, get_boxed_ref }, /* box_funcs */ { at_pos, bind_pos, set_elems, push, pop, unshift, shift, osplice, MVM_REPR_DEFAULT_AT_POS_MULTIDIM, MVM_REPR_DEFAULT_BIND_POS_MULTIDIM, MVM_REPR_DEFAULT_DIMENSIONS, MVM_REPR_DEFAULT_SET_DIMENSIONS, MVM_REPR_DEFAULT_GET_ELEM_STORAGE_SPEC, MVM_REPR_DEFAULT_POS_AS_ATOMIC, MVM_REPR_DEFAULT_POS_AS_ATOMIC_MULTIDIM }, /* pos_funcs */ { at_key, bind_key, exists_key, delete_key, NULL }, /* ass_funcs */ elems, get_storage_spec, change_type, serialize, deserialize, /* deserialize */ serialize_repr_data, deserialize_repr_data, deserialize_stable_size, gc_mark, gc_free, NULL, /* gc_cleanup */ gc_mark_repr_data, gc_free_repr_data, compose, spesh, "P6opaque", /* name */ MVM_REPR_ID_P6opaque, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; /* Get the pointer offset of an attribute. Used for optimizing access to it on * precisely known types. */ size_t MVM_p6opaque_attr_offset(MVMThreadContext *tc, MVMObject *type, MVMObject *class_handle, MVMString *name) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)type->st->REPR_data; size_t slot = try_get_slot(tc, repr_data, class_handle, name); return repr_data->attribute_offsets[slot]; } #ifdef DEBUG_HELPERS /* This is meant to be called in a debugging session and not used anywhere else. * Plese don't delete. */ static void dump_p6opaque(MVMThreadContext *tc, MVMObject *obj, int nested) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)STABLE(obj)->REPR_data; MVMP6opaqueBody *data = MVM_p6opaque_real_data(tc, OBJECT_BODY(obj)); if (repr_data) { MVMint16 const num_attributes = repr_data->num_attributes; MVMint16 cur_attribute = 0; MVMP6opaqueNameMap * const name_to_index_mapping = repr_data->name_to_index_mapping; fprintf(stderr, "%s.new(", MVM_6model_get_debug_name(tc, obj)); if (name_to_index_mapping != NULL) { MVMint16 i; MVMP6opaqueNameMap *cur_map_entry = name_to_index_mapping; while (cur_map_entry->class_key != NULL) { MVMint16 i; MVMint64 slot; if (cur_map_entry->num_attrs > 0) { fprintf(stderr, "#`(from %s) ", MVM_6model_get_stable_debug_name(tc, cur_map_entry->class_key->st)); } for (i = 0; i < cur_map_entry->num_attrs; i++) { char * name = MVM_string_utf8_encode_C_string(tc, cur_map_entry->names[i]); fprintf(stderr, "%s", name); MVM_free(name); slot = cur_map_entry->slots[i]; if (slot >= 0) { MVMuint16 const offset = repr_data->attribute_offsets[slot]; MVMSTable * const attr_st = repr_data->flattened_stables[slot]; if (attr_st == NULL) { MVMObject *value = get_obj_at_offset(data, offset); if (value != NULL) { fprintf(stderr, "="); dump_p6opaque(tc, value, 1); } } else { MVMString * const s = attr_st->REPR->box_funcs.get_str(tc, attr_st, obj, (char *)data + offset); char * const str = MVM_string_utf8_encode_C_string(tc, s); fprintf(stderr, "='%s'", str); MVM_free(str); } } if (cur_attribute++ < num_attributes - 1) fprintf(stderr, ", "); } cur_map_entry++; } } fprintf(stderr, nested ? ")" : ")\n"); } else { fprintf(stderr, "%s%s", MVM_6model_get_debug_name(tc, obj), nested ? "" : "\n"); } } void MVM_dump_p6opaque(MVMThreadContext *tc, MVMObject *obj) { dump_p6opaque(tc, obj, 0); } #endif MoarVM-2018.03/src/6model/reprs/P6opaque.h0000644000175000017510000001164613237701240020173 0ustar samanthasamantha/* This is how an instance with the P6opaque representation starts. However, what * follows on from this depends on the declaration. For object attributes, it will * be a pointer size and point to another MVMObject. For native integers and * numbers, it will be the appropriate sized piece of memory to store them * right there in the object. Note that P6opaque does not do packed storage, so * an int2 gets as much space as an int. */ struct MVMP6opaqueBody { /* If we get mixed into, we may change size. If so, we can't really resize * the object, so instead we hang its post-resize form off this pointer. * In the future, more clever things are possible (like only putting the * new fields into this object). */ void *replaced; }; struct MVMP6opaque { MVMObject common; MVMP6opaqueBody body; }; /* This is used in the name to slot mapping. Indicates the class key that * we have the mappings for, followed by arrays of names and slots. (Yeah, * could use a hash, but much code will resolve these statically to the * slots). */ struct MVMP6opaqueNameMap { MVMObject *class_key; MVMString **names; MVMuint16 *slots; MVMuint32 num_attrs; }; /* The P6opaque REPR data has the slot mapping, allocation size and * various other bits of info. It hangs off the REPR_data pointer * in the s-table. */ struct MVMP6opaqueREPRData { /* The number of attributes we have allocated slots for. Note that * slots can vary in size. */ MVMuint16 num_attributes; /* Slot containing object to delegate for positional things. */ MVMint16 pos_del_slot; /* Slot containing object to delegate for associative things. */ MVMint16 ass_del_slot; /* Flags if we are MI or not. */ MVMuint16 mi; /* Slot to delegate to when we need to unbox to a native integer. */ MVMint16 unbox_int_slot; /* Slot to delegate to when we need to unbox to a native number. */ MVMint16 unbox_num_slot; /* Slot to delegate to when we need to unbox to a native string. */ MVMint16 unbox_str_slot; /* Offsets into the object that are eligible for GC marking, and how * many of them we have. */ MVMuint16 gc_obj_mark_offsets_count; MVMuint16 *gc_obj_mark_offsets; /* Maps attribute position numbers to the byte offset in the object. */ MVMuint16 *attribute_offsets; /* If the attribute was actually flattened in to this object from another * representation, this is the s-table of the type of that attribute. NULL * for attributes that are just reference types. */ MVMSTable **flattened_stables; /* Instantiated objects are just a blank piece of memory that needs to * be set up. However, in some cases we'd like them to magically turn in * to some container type. */ MVMObject **auto_viv_values; /* If we have any other flattened boxings, this array can be indexed by * REPR ID to find the slot in the object where it is embedded. */ MVMuint16 *unbox_slots; /* A table mapping attribute names to indexes (which can then be looked * up in the offset table). Uses a final null entry as a sentinel. */ MVMP6opaqueNameMap *name_to_index_mapping; /* Slots holding flattened objects that need another REPR to initialize * them; terminated with -1. */ MVMint16 *initialize_slots; /* Slots holding flattened objects that need another REPR to mark them; * terminated with -1. */ MVMint16 *gc_mark_slots; /* Slots holding flattened objects that need another REPR to clean them; * terminated with -1. */ MVMint16 *gc_cleanup_slots; /* Hold the storage spec */ MVMStorageSpec storage_spec; }; /* Function for REPR setup. */ const MVMREPROps * MVMP6opaque_initialize(MVMThreadContext *tc); /* If an object gets mixed in to, we need to be sure we look at its real body, * which may have been moved to hang off the specified pointer. * * NB: This has been hardcoded into the jit compilation. Thus, consider it * set into stone :-). That is the price you pay for disintermediation. */ MVM_STATIC_INLINE void * MVM_p6opaque_real_data(MVMThreadContext *tc, void *data) { MVMP6opaqueBody *body = (MVMP6opaqueBody *)data; return body->replaced ? body->replaced : data; } /* Reads an attribute using an offset. This is only safe on an exact type * match. */ MVM_STATIC_INLINE MVMObject * MVM_p6opaque_read_object(MVMThreadContext *tc, MVMObject *o, size_t offset) { char *data = MVM_p6opaque_real_data(tc, OBJECT_BODY(o)); return *((MVMObject **)(data + offset)); } MVM_STATIC_INLINE MVMint64 MVM_p6opaque_read_int64(MVMThreadContext *tc, MVMObject *o, size_t offset) { char *data = MVM_p6opaque_real_data(tc, OBJECT_BODY(o)); return *((MVMint64 *)(data + offset)); } size_t MVM_p6opaque_attr_offset(MVMThreadContext *tc, MVMObject *type, MVMObject *class_handle, MVMString *name); MoarVM-2018.03/src/6model/reprs/P6str.c0000644000175000017510000000744513237701240017506 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps P6str_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &P6str_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMP6str); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMP6strBody *src_body = (MVMP6strBody *)src; MVMP6strBody *dest_body = (MVMP6strBody *)dest; MVM_ASSIGN_REF(tc, &(dest_root->header), dest_body->value, src_body->value); } static void set_str(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMString *value) { MVM_ASSIGN_REF(tc, &(root->header), ((MVMP6strBody *)data)->value, value); } static MVMString * get_str(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { return ((MVMP6strBody *)data)->value; } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_INLINED, /* inlineable */ sizeof(MVMString*) * 8, /* bits */ ALIGNOF(void *), /* align */ MVM_STORAGE_SPEC_BP_STR, /* boxed_primitive */ MVM_STORAGE_SPEC_CAN_BOX_STR, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { } /* Called by the VM to mark any GCable items. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVM_gc_worklist_add(tc, worklist, &((MVMP6strBody *)data)->value); } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMP6str); } static void deserialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMSerializationReader *reader) { MVM_ASSIGN_REF(tc, &(root->header), ((MVMP6strBody *)data)->value, MVM_serialization_read_str(tc, reader)); } static void serialize(MVMThreadContext *tc, MVMSTable *st, void *data, MVMSerializationWriter *writer) { MVM_serialization_write_str(tc, writer, ((MVMP6strBody *)data)->value); } /* Initializes the representation. */ const MVMREPROps * MVMP6str_initialize(MVMThreadContext *tc) { return &P6str_this_repr; } static const MVMREPROps P6str_this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, { MVM_REPR_DEFAULT_SET_INT, MVM_REPR_DEFAULT_GET_INT, MVM_REPR_DEFAULT_SET_NUM, MVM_REPR_DEFAULT_GET_NUM, set_str, get_str, MVM_REPR_DEFAULT_SET_UINT, MVM_REPR_DEFAULT_GET_UINT, MVM_REPR_DEFAULT_GET_BOXED_REF }, /* box_funcs */ MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ serialize, deserialize, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, gc_mark, NULL, /* gc_free */ NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "P6str", /* name */ MVM_REPR_ID_P6str, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; MoarVM-2018.03/src/6model/reprs/P6str.h0000644000175000017510000000037713237701240017510 0ustar samanthasamantha/* Representation used by P6 native strings. */ struct MVMP6strBody { MVMString *value; }; struct MVMP6str { MVMObject common; MVMP6strBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMP6str_initialize(MVMThreadContext *tc); MoarVM-2018.03/src/6model/reprs/README.md0000644000175000017510000000007113237701112017565 0ustar samanthasamantha## Representations *summary of each representation here*MoarVM-2018.03/src/6model/reprs/ReentrantMutex.c0000644000175000017510000001424413237701240021450 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps ReentrantMutex_this_repr; /* Populates the object body with a mutex. */ static void initialize_mutex(MVMThreadContext *tc, MVMReentrantMutexBody *rm) { int init_stat; rm->mutex = MVM_malloc(sizeof(uv_mutex_t)); if ((init_stat = uv_mutex_init(rm->mutex)) < 0) MVM_exception_throw_adhoc(tc, "Failed to initialize mutex: %s", uv_strerror(init_stat)); } /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &ReentrantMutex_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMReentrantMutex); }); return st->WHAT; } /* Initializes a new instance. */ static void initialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { initialize_mutex(tc, (MVMReentrantMutexBody *)data); } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "Cannot copy object with representation ReentrantMutex"); } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { /* The ThreadContext has already been destroyed by the GC. */ MVMReentrantMutex *rm = (MVMReentrantMutex *)obj; if (rm->body.lock_count) MVM_panic(1, "Tried to garbage-collect a locked mutex"); uv_mutex_destroy(rm->body.mutex); MVM_free(rm->body.mutex); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMReentrantMutex); } /* Serializing a mutex doesn't save anything; we will re-create it upon * deserialization. Makes data structures that just happen to have a lock in * them serializable. */ static void serialize(MVMThreadContext *tc, MVMSTable *st, void *data, MVMSerializationWriter *writer) { } static void deserialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMSerializationReader *reader) { initialize_mutex(tc, (MVMReentrantMutexBody *)data); } /* Initializes the representation. */ const MVMREPROps * MVMReentrantMutex_initialize(MVMThreadContext *tc) { return &ReentrantMutex_this_repr; } static const MVMREPROps ReentrantMutex_this_repr = { type_object_for, MVM_gc_allocate_object, initialize, copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ serialize, deserialize, NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, NULL, /* gc_mark */ gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "ReentrantMutex", /* name */ MVM_REPR_ID_ReentrantMutex, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; /* Locks the mutex. */ void MVM_reentrantmutex_lock_checked(MVMThreadContext *tc, MVMObject *lock) { if (REPR(lock)->ID == MVM_REPR_ID_ReentrantMutex && IS_CONCRETE(lock)) MVM_reentrantmutex_lock(tc, (MVMReentrantMutex *)lock); else MVM_exception_throw_adhoc(tc, "lock requires a concrete object with REPR ReentrantMutex"); } void MVM_reentrantmutex_lock(MVMThreadContext *tc, MVMReentrantMutex *rm) { unsigned int interval_id; if (MVM_load(&rm->body.holder_id) == tc->thread_id) { /* We already hold the lock; bump the count. */ MVM_incr(&rm->body.lock_count); } else { /* Not holding the lock; obtain it. */ /*interval_id = MVM_telemetry_interval_start(tc, "ReentrantMutex obtains lock");*/ /*MVM_telemetry_interval_annotate(rm->body.mutex, interval_id, "lock in question");*/ MVMROOT(tc, rm, { MVM_gc_mark_thread_blocked(tc); uv_mutex_lock(rm->body.mutex); MVM_gc_mark_thread_unblocked(tc); }); MVM_store(&rm->body.holder_id, tc->thread_id); MVM_store(&rm->body.lock_count, 1); tc->num_locks++; /*MVM_telemetry_interval_stop(tc, interval_id, "ReentrantMutex obtained lock");*/ } } /* Unlocks the mutex. */ void MVM_reentrantmutex_unlock_checked(MVMThreadContext *tc, MVMObject *lock) { if (REPR(lock)->ID == MVM_REPR_ID_ReentrantMutex && IS_CONCRETE(lock)) MVM_reentrantmutex_unlock(tc, (MVMReentrantMutex *)lock); else MVM_exception_throw_adhoc(tc, "unlock requires a concrete object with REPR ReentrantMutex"); } void MVM_reentrantmutex_unlock(MVMThreadContext *tc, MVMReentrantMutex *rm) { /* Ensure we hold the lock. */ if (MVM_load(&rm->body.holder_id) == tc->thread_id) { if (MVM_decr(&rm->body.lock_count) == 1) { /* Decremented the last recursion count; really unlock. */ MVM_store(&rm->body.holder_id, 0); uv_mutex_unlock(rm->body.mutex); tc->num_locks--; /*MVM_telemetry_timestamp(rm->body.mutex, "this ReentrantMutex unlocked");*/ } } else { MVM_exception_throw_adhoc(tc, "Attempt to unlock mutex by thread not holding it"); } } MoarVM-2018.03/src/6model/reprs/ReentrantMutex.h0000644000175000017510000000171613237701240021455 0ustar samanthasamantha/* Representation used for VM thread handles. */ struct MVMReentrantMutexBody { /* The (non-reentrant) mutex supplied by libuv. Sadly, we have to hold it * at a level of indirection - at least on Windows - because if the object * is moved it causes confusion. */ uv_mutex_t *mutex; /* Who currently holds the mutex, if anyone. */ AO_t holder_id; /* How many times we've taken the lock. */ AO_t lock_count; }; struct MVMReentrantMutex { MVMObject common; MVMReentrantMutexBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMReentrantMutex_initialize(MVMThreadContext *tc); /* Lock and unlock functions. */ void MVM_reentrantmutex_lock_checked(MVMThreadContext *tc, MVMObject *lock); void MVM_reentrantmutex_lock(MVMThreadContext *tc, MVMReentrantMutex *rm); void MVM_reentrantmutex_unlock_checked(MVMThreadContext *tc, MVMObject *lock); void MVM_reentrantmutex_unlock(MVMThreadContext *tc, MVMReentrantMutex *rm); MoarVM-2018.03/src/6model/reprs/SCRef.c0000644000175000017510000002216513237701240017426 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps SCRef_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &SCRef_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMSerializationContext); }); return st->WHAT; } /* Initializes a new instance. */ static void initialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMObject *root_codes, *rep_indexes, *rep_scs, *owned_objects, *rm; MVMInstance *instance = tc->instance; MVMObject *BOOTIntArray = instance->boot_types.BOOTIntArray; MVMSerializationContextBody *sc = ((MVMSerializationContext *)root)->body; MVM_gc_root_temp_push(tc, (MVMCollectable **)&root); rep_indexes = REPR(BOOTIntArray)->allocate(tc, STABLE(BOOTIntArray)); MVM_ASSIGN_REF(tc, &(root->header), sc->rep_indexes, rep_indexes); rm = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTReentrantMutex); MVM_ASSIGN_REF(tc, &(root->header), sc->mutex, rm); root_codes = REPR(instance->boot_types.BOOTArray)->allocate(tc, STABLE(instance->boot_types.BOOTArray)); MVM_ASSIGN_REF(tc, &(root->header), sc->root_codes, root_codes); rep_scs = REPR(instance->boot_types.BOOTArray)->allocate(tc, STABLE(instance->boot_types.BOOTArray)); MVM_ASSIGN_REF(tc, &(root->header), sc->rep_scs, rep_scs); owned_objects = REPR(instance->boot_types.BOOTArray)->allocate(tc, STABLE(instance->boot_types.BOOTArray)); MVM_ASSIGN_REF(tc, &(root->header), sc->owned_objects, owned_objects); MVM_gc_root_temp_pop(tc); } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "Cannot copy object with representation SCRef"); } /* Called by the VM to mark any GCable items. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMSerializationContextBody *sc = ((MVMSerializationContextBody **)data)[0]; MVMuint64 i; MVM_gc_worklist_add(tc, worklist, &sc->handle); MVM_gc_worklist_add(tc, worklist, &sc->description); MVM_gc_worklist_add(tc, worklist, &sc->root_codes); MVM_gc_worklist_add(tc, worklist, &sc->rep_indexes); MVM_gc_worklist_add(tc, worklist, &sc->rep_scs); MVM_gc_worklist_add(tc, worklist, &sc->owned_objects); for (i = 0; i < sc->num_objects; i++) MVM_gc_worklist_add(tc, worklist, &sc->root_objects[i]); for (i = 0; i < sc->num_stables; i++) MVM_gc_worklist_add(tc, worklist, &sc->root_stables[i]); MVM_gc_worklist_add(tc, worklist, &sc->sc); MVM_gc_worklist_add(tc, worklist, &sc->mutex); /* Mark serialization reader, if we have one. */ if (sc->sr) { MVM_gc_worklist_add(tc, worklist, &(sc->sr->root.sc)); for (i = 0; i < sc->sr->root.num_dependencies; i++) MVM_gc_worklist_add(tc, worklist, &(sc->sr->root.dependent_scs[i])); MVM_gc_worklist_add(tc, worklist, &(sc->sr->root.string_heap)); MVM_gc_worklist_add(tc, worklist, &(sc->sr->root.string_comp_unit)); MVM_gc_worklist_add(tc, worklist, &(sc->sr->codes_list)); MVM_gc_worklist_add(tc, worklist, &(sc->sr->current_object)); } } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMSerializationContext *sc = (MVMSerializationContext *)obj; if (sc->body == NULL) return; /* Remove from weakref lookup hash (which doesn't count as a root). */ uv_mutex_lock(&tc->instance->mutex_sc_weakhash); HASH_DELETE(hash_handle, tc->instance->sc_weakhash, sc->body); tc->instance->all_scs[sc->body->sc_idx] = NULL; uv_mutex_unlock(&tc->instance->mutex_sc_weakhash); /* Free manually managed object and STable root list memory. */ MVM_free(sc->body->root_objects); MVM_free(sc->body->root_stables); /* If we have a serialization reader, clean that up too. */ if (sc->body->sr) { if (sc->body->sr->data_needs_free) MVM_free(sc->body->sr->data); MVM_free(sc->body->sr->root.dependent_scs); MVM_free(sc->body->sr->contexts); MVM_free(sc->body->sr->wl_objects.indexes); MVM_free(sc->body->sr->wl_stables.indexes); MVM_free(sc->body->sr); } /* Free body. */ MVM_free(sc->body); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } static MVMuint64 unmanaged_size(MVMThreadContext *tc, MVMSTable *st, void *data) { MVMSerializationContextBody *body = ((MVMSerializationContextBody **)data)[0]; MVMuint64 size = 0; size += sizeof(MVMObject *) * body->num_objects; size += sizeof(MVMSTable *) * body->num_stables; /* XXX probably have to measure the MVMSerializationReader, too */ return size; } static void describe_refs(MVMThreadContext *tc, MVMHeapSnapshotState *ss, MVMSTable *st, void *data) { MVMSerializationContextBody *body = ((MVMSerializationContextBody **)data)[0]; MVMuint64 index; if (body->sr) return; for (index = 0; index < body->num_objects; index++) MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->root_objects[index], "Object root set"); for (index = 0; index < body->num_stables; index++) MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->root_stables[index], "STable root set"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->root_codes, "Root code refs"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->rep_indexes, "Repossession indices"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->rep_scs, "Repossession SCs"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->owned_objects, "Owned Objects"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->handle, "Handle"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->description, "Description"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->sc, "SC"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->mutex, "Mutex"); /* Mark serialization reader, if we have one. */ if (body->sr) { MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->sr->root.sc, "Reader Root SC"); for (index = 0; index < body->sr->root.num_dependencies; index++) MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->sr->root.dependent_scs[index], "SC Dependency (Reader)"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->sr->root.string_heap, "String heap (Reader)"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->sr->root.string_comp_unit, "String compilation unit (Reader)"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->sr->codes_list, "Code objects list (Reader)"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)body->sr->current_object, "Current object (Reader)"); } } /* Initializes the representation. */ const MVMREPROps * MVMSCRef_initialize(MVMThreadContext *tc) { return &SCRef_this_repr; } static const MVMREPROps SCRef_this_repr = { type_object_for, MVM_gc_allocate_object, initialize, copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ NULL, /* deserialize_stable_size */ gc_mark, gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "SCRef", /* name */ MVM_REPR_ID_SCRef, unmanaged_size, describe_refs, }; MoarVM-2018.03/src/6model/reprs/SCRef.h0000644000175000017510000000433413237701240017431 0ustar samanthasamantha/* A serialization context exists (optionally) per compilation unit. * It contains the declarative objects for the compilation unit, and * they are serialized if code is pre-compiled. */ struct MVMSerializationContextBody { /* The handle of this SC. */ MVMString *handle; /* Description (probably the file name) if any. */ MVMString *description; /* The root set of objects that live in this SC. */ MVMuint64 num_objects; MVMuint64 alloc_objects; MVMObject **root_objects; /* The root set of STables that live in this SC. */ MVMSTable **root_stables; MVMuint64 num_stables; MVMuint64 alloc_stables; /* The root set of code refs that live in this SC. */ MVMObject *root_codes; /* Repossession info. The following lists have matching indexes, each * representing the integer of an object in our root set along with the SC * that the object was originally from. */ MVMObject *rep_indexes; MVMObject *rep_scs; /* Some things we deserialize are not directly in an SC root set, but * rather are owned by others. This is mostly thanks to Parrot legacy, * where not everything was a 6model object. This is an array in twos, * mapping an object to its owner. */ MVMObject *owned_objects; /* Backlink to the (memory-managed) SC itself. If * this is null, it is unresolved. */ MVMSerializationContext *sc; /* Inline handle to the SCs hash (in MVMInstance). */ UT_hash_handle hash_handle; /* SC's index in the all_scs list in instance. */ MVMuint32 sc_idx; /* Set to be true once some compilation unit claims the SC during resolution. */ MVMuint32 claimed; /* Reference to the SerializationReader we'll use to deserialize objects, * if this is an SC that we loaded. */ MVMSerializationReader *sr; /* Reentrant mutex protecting lazy deserialization of the SC. */ MVMObject *mutex; }; struct MVMSerializationContext { /* Normal header. */ MVMObject common; /* Body is a level of indirection away to ease memory management of the * weak hash. */ MVMSerializationContextBody *body; }; /* Function for REPR setup. */ const MVMREPROps * MVMSCRef_initialize(MVMThreadContext *tc); MoarVM-2018.03/src/6model/reprs/Semaphore.c0000644000175000017510000001052513237701240020404 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps Semaphore_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &Semaphore_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMSemaphore); }); return st->WHAT; } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVM_exception_throw_adhoc(tc, "Cannot copy object with representation Semaphore"); } /* Set up the Semaphore with its initial value. */ static void set_int(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 value) { MVMSemaphoreBody *body = (MVMSemaphoreBody *)data; int r; body->sem = MVM_malloc(sizeof(uv_sem_t)); if ((r = uv_sem_init(body->sem, (MVMuint32) value)) < 0) { MVM_free(body->sem); body->sem = NULL; MVM_exception_throw_adhoc(tc, "Failed to initialize Semaphore: %s", uv_strerror(r)); } } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMSemaphore *sem = (MVMSemaphore *)obj; if (sem->body.sem) { uv_sem_destroy(sem->body.sem); MVM_free(sem->body.sem); } } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMSemaphore); } /* Initializes the representation. */ const MVMREPROps * MVMSemaphore_initialize(MVMThreadContext *tc) { return &Semaphore_this_repr; } static const MVMREPROps Semaphore_this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, { set_int, MVM_REPR_DEFAULT_GET_INT, MVM_REPR_DEFAULT_SET_NUM, MVM_REPR_DEFAULT_GET_NUM, MVM_REPR_DEFAULT_SET_STR, MVM_REPR_DEFAULT_GET_STR, MVM_REPR_DEFAULT_SET_UINT, MVM_REPR_DEFAULT_GET_UINT, MVM_REPR_DEFAULT_GET_BOXED_REF }, /* box_funcs */ MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, NULL, /* gc_mark */ gc_free, NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "Semaphore", /* name */ MVM_REPR_ID_Semaphore, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; MVMint64 MVM_semaphore_tryacquire(MVMThreadContext *tc, MVMSemaphore *sem) { int r; MVM_telemetry_timestamp(tc, "Semaphore.tryAcquire"); r = uv_sem_trywait(sem->body.sem); return !r; } void MVM_semaphore_acquire(MVMThreadContext *tc, MVMSemaphore *sem) { unsigned int interval_id; interval_id = MVM_telemetry_interval_start(tc, "Semaphore.acquire"); MVMROOT(tc, sem, { MVM_gc_mark_thread_blocked(tc); uv_sem_wait(sem->body.sem); MVM_gc_mark_thread_unblocked(tc); }); MVM_telemetry_interval_stop(tc, interval_id, "Semaphore.acquire"); } void MVM_semaphore_release(MVMThreadContext *tc, MVMSemaphore *sem) { MVM_telemetry_timestamp(tc, "Semaphore.release"); uv_sem_post(sem->body.sem); } MoarVM-2018.03/src/6model/reprs/Semaphore.h0000644000175000017510000000101113237701240020377 0ustar samanthasamantha/* Representation used for VM thread handles. */ struct MVMSemaphoreBody { uv_sem_t *sem; }; struct MVMSemaphore { MVMObject common; MVMSemaphoreBody body; }; /* Function for REPR setup. */ const MVMREPROps * MVMSemaphore_initialize(MVMThreadContext *tc); /* Acquire and release functions. */ MVMint64 MVM_semaphore_tryacquire(MVMThreadContext *tc, MVMSemaphore *sem); void MVM_semaphore_acquire(MVMThreadContext *tc, MVMSemaphore *sem); void MVM_semaphore_release(MVMThreadContext *tc, MVMSemaphore *sem); MoarVM-2018.03/src/6model/reprs/Uninstantiable.c0000644000175000017510000000543113237701240021441 0ustar samanthasamantha#include "moar.h" /* This representation's function pointer table. */ static const MVMREPROps Uninstantiable_this_repr; /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &Uninstantiable_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMUninstantiable); }); return st->WHAT; } /* Creates a new instance based on the type object. */ static MVMObject * allocate(MVMThreadContext *tc, MVMSTable *st) { MVM_exception_throw_adhoc(tc, "You cannot create an instance of this type (%s)", MVM_6model_get_stable_debug_name(tc, st)); } /* Copies the body of one object to another. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { /* Nothing to copy. */ } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } /* Compose the representation. */ static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info) { /* Nothing to do for this REPR. */ } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMUninstantiable); } /* Initializes the representation. */ const MVMREPROps * MVMUninstantiable_initialize(MVMThreadContext *tc) { return &Uninstantiable_this_repr; } static const MVMREPROps Uninstantiable_this_repr = { type_object_for, allocate, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, MVM_REPR_DEFAULT_POS_FUNCS, MVM_REPR_DEFAULT_ASS_FUNCS, MVM_REPR_DEFAULT_ELEMS, get_storage_spec, NULL, /* change_type */ NULL, /* serialize */ NULL, /* deserialize */ NULL, /* serialize_repr_data */ NULL, /* deserialize_repr_data */ deserialize_stable_size, NULL, /* gc_mark */ NULL, /* gc_free */ NULL, /* gc_cleanup */ NULL, /* gc_mark_repr_data */ NULL, /* gc_free_repr_data */ compose, NULL, /* spesh */ "Uninstantiable", /* name */ MVM_REPR_ID_Uninstantiable, NULL, /* unmanaged_size */ NULL, /* describe_refs */ }; MoarVM-2018.03/src/6model/reprs/Uninstantiable.h0000644000175000017510000000031113237701240021436 0ustar samanthasamantha/* Representation used by Uninstantiables. */ struct MVMUninstantiable { MVMObject common; }; /* Function for REPR setup. */ const MVMREPROps * MVMUninstantiable_initialize(MVMThreadContext *tc); MoarVM-2018.03/src/6model/reprs/VMArray.c0000644000175000017510000015521213242626641020014 0ustar samanthasamantha#include "moar.h" #include "limits.h" /* This representation's function pointer table. */ static const MVMREPROps VMArray_this_repr; MVM_STATIC_INLINE void enter_single_user(MVMThreadContext *tc, MVMArrayBody *arr) { #if MVM_ARRAY_CONC_DEBUG if (!MVM_trycas(&(arr->in_use), 0, 1)) { MVM_dump_backtrace(tc); MVM_exception_throw_adhoc(tc, "Array may not be used concurrently"); } #endif } static void exit_single_user(MVMThreadContext *tc, MVMArrayBody *arr) { #if MVM_ARRAY_CONC_DEBUG arr->in_use = 0; #endif } /* Creates a new type object of this representation, and associates it with * the given HOW. */ static MVMObject * type_object_for(MVMThreadContext *tc, MVMObject *HOW) { MVMSTable *st = MVM_gc_allocate_stable(tc, &VMArray_this_repr, HOW); MVMROOT(tc, st, { MVMObject *obj = MVM_gc_allocate_type_object(tc, st); MVMArrayREPRData *repr_data = (MVMArrayREPRData *)MVM_malloc(sizeof(MVMArrayREPRData)); repr_data->slot_type = MVM_ARRAY_OBJ; repr_data->elem_size = sizeof(MVMObject *); repr_data->elem_type = NULL; MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, obj); st->size = sizeof(MVMArray); st->REPR_data = repr_data; }); return st->WHAT; } /* Copies the body of one object to another. The result has the space * needed for the current number of elements, which may not be the * entire allocated slot size. */ static void copy_to(MVMThreadContext *tc, MVMSTable *st, void *src, MVMObject *dest_root, void *dest) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *)st->REPR_data; MVMArrayBody *src_body = (MVMArrayBody *)src; MVMArrayBody *dest_body = (MVMArrayBody *)dest; dest_body->elems = src_body->elems; dest_body->ssize = src_body->elems; dest_body->start = 0; if (dest_body->elems > 0) { size_t mem_size = dest_body->ssize * repr_data->elem_size; size_t start_pos = src_body->start * repr_data->elem_size; char *copy_start = ((char *)src_body->slots.any) + start_pos; dest_body->slots.any = MVM_malloc(mem_size); memcpy(dest_body->slots.any, copy_start, mem_size); } else { dest_body->slots.any = NULL; } } /* Adds held objects to the GC worklist. */ static void gc_mark(MVMThreadContext *tc, MVMSTable *st, void *data, MVMGCWorklist *worklist) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *)st->REPR_data; MVMArrayBody *body = (MVMArrayBody *)data; MVMuint64 elems = body->elems; MVMuint64 start = body->start; MVMuint64 i = 0; switch (repr_data->slot_type) { case MVM_ARRAY_OBJ: { MVMObject **slots = body->slots.o; slots += start; while (i < elems) { MVM_gc_worklist_add(tc, worklist, &slots[i]); i++; } break; } case MVM_ARRAY_STR: { MVMString **slots = body->slots.s; slots += start; while (i < elems) { MVM_gc_worklist_add(tc, worklist, &slots[i]); i++; } break; } } } /* Called by the VM in order to free memory associated with this object. */ static void gc_free(MVMThreadContext *tc, MVMObject *obj) { MVMArray *arr = (MVMArray *)obj; MVM_free(arr->body.slots.any); } /* Marks the representation data in an STable.*/ static void gc_mark_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMGCWorklist *worklist) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *)st->REPR_data; if (repr_data == NULL) return; MVM_gc_worklist_add(tc, worklist, &repr_data->elem_type); } /* Frees the representation data in an STable.*/ static void gc_free_repr_data(MVMThreadContext *tc, MVMSTable *st) { MVM_free(st->REPR_data); } static const MVMStorageSpec storage_spec = { MVM_STORAGE_SPEC_REFERENCE, /* inlineable */ 0, /* bits */ 0, /* align */ MVM_STORAGE_SPEC_BP_NONE, /* boxed_primitive */ 0, /* can_box */ 0, /* is_unsigned */ }; /* Gets the storage specification for this representation. */ static const MVMStorageSpec * get_storage_spec(MVMThreadContext *tc, MVMSTable *st) { return &storage_spec; } static void at_pos(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister *value, MVMuint16 kind) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *)st->REPR_data; MVMArrayBody *body = (MVMArrayBody *)data; /* Handle negative indexes. */ if (index < 0) { index += body->elems; if (index < 0) MVM_exception_throw_adhoc(tc, "MVMArray: Index out of bounds"); } /* Go by type. */ switch (repr_data->slot_type) { case MVM_ARRAY_OBJ: if (kind != MVM_reg_obj) MVM_exception_throw_adhoc(tc, "MVMArray: atpos expected object register"); if (index >= body->elems) { value->o = tc->instance->VMNull; } else { MVMObject *found = body->slots.o[body->start + index]; value->o = found ? found : tc->instance->VMNull; } break; case MVM_ARRAY_STR: if (kind != MVM_reg_str) MVM_exception_throw_adhoc(tc, "MVMArray: atpos expected string register"); if (index >= body->elems) value->s = NULL; else value->s = body->slots.s[body->start + index]; break; case MVM_ARRAY_I64: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: atpos expected int register"); if (index >= body->elems) value->i64 = 0; else value->i64 = (MVMint64)body->slots.i64[body->start + index]; break; case MVM_ARRAY_I32: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: atpos expected int register"); if (index >= body->elems) value->i64 = 0; else value->i64 = (MVMint64)body->slots.i32[body->start + index]; break; case MVM_ARRAY_I16: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: atpos expected int register"); if (index >= body->elems) value->i64 = 0; else value->i64 = (MVMint64)body->slots.i16[body->start + index]; break; case MVM_ARRAY_I8: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: atpos expected int register"); if (index >= body->elems) value->i64 = 0; else value->i64 = (MVMint64)body->slots.i8[body->start + index]; break; case MVM_ARRAY_N64: if (kind != MVM_reg_num64) MVM_exception_throw_adhoc(tc, "MVMArray: atpos expected num register"); if (index >= body->elems) value->n64 = 0.0; else value->n64 = (MVMnum64)body->slots.n64[body->start + index]; break; case MVM_ARRAY_N32: if (kind != MVM_reg_num64) MVM_exception_throw_adhoc(tc, "MVMArray: atpos expected num register"); if (index >= body->elems) value->n64 = 0.0; else value->n64 = (MVMnum64)body->slots.n32[body->start + index]; break; case MVM_ARRAY_U64: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: atpos expected int register"); if (index >= body->elems) value->i64 = 0; else value->i64 = (MVMint64)body->slots.u64[body->start + index]; break; case MVM_ARRAY_U32: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: atpos expected int register"); if (index >= body->elems) value->i64 = 0; else value->i64 = (MVMint64)body->slots.u32[body->start + index]; break; case MVM_ARRAY_U16: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: atpos expected int register"); if (index >= body->elems) value->i64 = 0; else value->i64 = (MVMint64)body->slots.u16[body->start + index]; break; case MVM_ARRAY_U8: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: atpos expected int register"); if (index >= body->elems) value->i64 = 0; else value->i64 = (MVMint64)body->slots.u8[body->start + index]; break; default: MVM_exception_throw_adhoc(tc, "MVMArray: Unhandled slot type, got '%s'", MVM_reg_get_debug_name(tc, repr_data->slot_type)); } } static MVMuint64 zero_slots(MVMThreadContext *tc, MVMArrayBody *body, MVMuint64 elems, MVMuint64 ssize, MVMuint8 slot_type) { switch (slot_type) { case MVM_ARRAY_OBJ: while (elems < ssize) body->slots.o[elems++] = NULL; break; case MVM_ARRAY_STR: while (elems < ssize) body->slots.s[elems++] = NULL; break; case MVM_ARRAY_I64: while (elems < ssize) body->slots.i64[elems++] = 0; break; case MVM_ARRAY_I32: while (elems < ssize) body->slots.i32[elems++] = 0; break; case MVM_ARRAY_I16: while (elems < ssize) body->slots.i16[elems++] = 0; break; case MVM_ARRAY_I8: while (elems < ssize) body->slots.i8[elems++] = 0; break; case MVM_ARRAY_N64: while (elems < ssize) body->slots.n64[elems++] = 0.0; break; case MVM_ARRAY_N32: while (elems < ssize) body->slots.n32[elems++] = 0.0; break; case MVM_ARRAY_U64: while (elems < ssize) body->slots.u64[elems++] = 0; break; case MVM_ARRAY_U32: while (elems < ssize) body->slots.u32[elems++] = 0; break; case MVM_ARRAY_U16: while (elems < ssize) body->slots.u16[elems++] = 0; break; case MVM_ARRAY_U8: while (elems < ssize) body->slots.u8[elems++] = 0; break; default: MVM_exception_throw_adhoc(tc, "MVMArray: Unhandled slot type"); } return elems; } static void set_size_internal(MVMThreadContext *tc, MVMArrayBody *body, MVMuint64 n, MVMArrayREPRData *repr_data) { MVMuint64 elems = body->elems; MVMuint64 start = body->start; MVMuint64 ssize = body->ssize; void *slots = body->slots.any; if (n == elems) return; if (start > 0 && n + start > ssize) { /* if there aren't enough slots at the end, shift off empty slots * from the beginning first */ if (elems > 0) memmove(slots, (char *)slots + start * repr_data->elem_size, elems * repr_data->elem_size); body->start = 0; /* fill out any unused slots with NULL pointers or zero values */ zero_slots(tc, body, elems, start+elems, repr_data->slot_type); elems = ssize; /* we'll use this as a point to clear from later */ } else if (n < elems) { /* we're downsizing; clear off extra slots */ zero_slots(tc, body, n+start, start+elems, repr_data->slot_type); } body->elems = n; if (n <= ssize) { /* we already have n slots available, we can just return */ return; } /* We need more slots. If the current slot size is less * than 8K, use the larger of twice the current slot size * or the actual number of elements needed. Otherwise, * grow the slots to the next multiple of 4096 (0x1000). */ if (ssize < 8192) { ssize *= 2; if (n > ssize) ssize = n; if (ssize < 8) ssize = 8; } else { ssize = (n + 0x1000) & ~0xfffUL; } { /* Our budget is 2^( * * - * ) */ size_t const elem_addr_size = repr_data->elem_size == 8 ? 4 : repr_data->elem_size == 4 ? 3 : repr_data->elem_size == 2 ? 2 : 1; if (ssize > (1ULL << (CHAR_BIT * sizeof(size_t) - elem_addr_size))) MVM_exception_throw_adhoc(tc, "Unable to allocate an array of %"PRIu64" elements", ssize); } /* now allocate the new slot buffer */ slots = (slots) ? MVM_realloc(slots, ssize * repr_data->elem_size) : MVM_malloc(ssize * repr_data->elem_size); /* fill out any unused slots with NULL pointers or zero values */ body->slots.any = slots; zero_slots(tc, body, elems, ssize, repr_data->slot_type); body->ssize = ssize; } static void bind_pos(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister value, MVMuint16 kind) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *)st->REPR_data; MVMArrayBody *body = (MVMArrayBody *)data; /* Handle negative indexes and resizing if needed. */ enter_single_user(tc, body); if (index < 0) { index += body->elems; if (index < 0) MVM_exception_throw_adhoc(tc, "MVMArray: Index out of bounds"); } else if (index >= body->elems) set_size_internal(tc, body, index + 1, repr_data); /* Go by type. */ switch (repr_data->slot_type) { case MVM_ARRAY_OBJ: if (kind != MVM_reg_obj) MVM_exception_throw_adhoc(tc, "MVMArray: bindpos expected object register"); MVM_ASSIGN_REF(tc, &(root->header), body->slots.o[body->start + index], value.o); break; case MVM_ARRAY_STR: if (kind != MVM_reg_str) MVM_exception_throw_adhoc(tc, "MVMArray: bindpos expected string register"); MVM_ASSIGN_REF(tc, &(root->header), body->slots.s[body->start + index], value.s); break; case MVM_ARRAY_I64: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: bindpos expected int register"); body->slots.i64[body->start + index] = value.i64; break; case MVM_ARRAY_I32: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: bindpos expected int register"); body->slots.i32[body->start + index] = (MVMint32)value.i64; break; case MVM_ARRAY_I16: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: bindpos expected int register"); body->slots.i16[body->start + index] = (MVMint16)value.i64; break; case MVM_ARRAY_I8: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: bindpos expected int register"); body->slots.i8[body->start + index] = (MVMint8)value.i64; break; case MVM_ARRAY_N64: if (kind != MVM_reg_num64) MVM_exception_throw_adhoc(tc, "MVMArray: bindpos expected num register"); body->slots.n64[body->start + index] = value.n64; break; case MVM_ARRAY_N32: if (kind != MVM_reg_num64) MVM_exception_throw_adhoc(tc, "MVMArray: bindpos expected num register"); body->slots.n32[body->start + index] = (MVMnum32)value.n64; break; case MVM_ARRAY_U64: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: bindpos expected int register"); body->slots.u64[body->start + index] = value.i64; break; case MVM_ARRAY_U32: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: bindpos expected int register"); body->slots.u32[body->start + index] = (MVMuint32)value.i64; break; case MVM_ARRAY_U16: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: bindpos expected int register"); body->slots.u16[body->start + index] = (MVMuint16)value.i64; break; case MVM_ARRAY_U8: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: bindpos expected int register"); body->slots.u8[body->start + index] = (MVMuint8)value.i64; break; default: MVM_exception_throw_adhoc(tc, "MVMArray: Unhandled slot type"); } exit_single_user(tc, body); } static MVMuint64 elems(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data) { MVMArrayBody *body = (MVMArrayBody *)data; return body->elems; } static void set_elems(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMuint64 count) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *)st->REPR_data; MVMArrayBody *body = (MVMArrayBody *)data; enter_single_user(tc, body); set_size_internal(tc, body, count, repr_data); exit_single_user(tc, body); } static void push(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister value, MVMuint16 kind) { MVMArrayBody *body = (MVMArrayBody *)data; MVMArrayREPRData *repr_data = (MVMArrayREPRData *)st->REPR_data; enter_single_user(tc, body); set_size_internal(tc, body, body->elems + 1, repr_data); switch (repr_data->slot_type) { case MVM_ARRAY_OBJ: if (kind != MVM_reg_obj) MVM_exception_throw_adhoc(tc, "MVMArray: push expected object register"); MVM_ASSIGN_REF(tc, &(root->header), body->slots.o[body->start + body->elems - 1], value.o); break; case MVM_ARRAY_STR: if (kind != MVM_reg_str) MVM_exception_throw_adhoc(tc, "MVMArray: push expected string register"); MVM_ASSIGN_REF(tc, &(root->header), body->slots.s[body->start + body->elems - 1], value.s); break; case MVM_ARRAY_I64: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: push expected int register"); body->slots.i64[body->start + body->elems - 1] = value.i64; break; case MVM_ARRAY_I32: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: push expected int register"); body->slots.i32[body->start + body->elems - 1] = (MVMint32)value.i64; break; case MVM_ARRAY_I16: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: push expected int register"); body->slots.i16[body->start + body->elems - 1] = (MVMint16)value.i64; break; case MVM_ARRAY_I8: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: push expected int register"); body->slots.i8[body->start + body->elems - 1] = (MVMint8)value.i64; break; case MVM_ARRAY_N64: if (kind != MVM_reg_num64) MVM_exception_throw_adhoc(tc, "MVMArray: push expected num register"); body->slots.n64[body->start + body->elems - 1] = value.n64; break; case MVM_ARRAY_N32: if (kind != MVM_reg_num64) MVM_exception_throw_adhoc(tc, "MVMArray: push expected num register"); body->slots.n32[body->start + body->elems - 1] = (MVMnum32)value.n64; break; case MVM_ARRAY_U64: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: push expected int register"); body->slots.u64[body->start + body->elems - 1] = (MVMuint64)value.i64; break; case MVM_ARRAY_U32: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: push expected int register"); body->slots.u32[body->start + body->elems - 1] = (MVMuint32)value.i64; break; case MVM_ARRAY_U16: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: push expected int register"); body->slots.u16[body->start + body->elems - 1] = (MVMuint16)value.i64; break; case MVM_ARRAY_U8: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: push expected int register"); body->slots.u8[body->start + body->elems - 1] = (MVMuint8)value.i64; break; default: MVM_exception_throw_adhoc(tc, "MVMArray: Unhandled slot type"); } exit_single_user(tc, body); } static void pop(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *)st->REPR_data; MVMArrayBody *body = (MVMArrayBody *)data; const MVMuint64 slot = body->start + body->elems - 1; if (body->elems < 1) MVM_exception_throw_adhoc(tc, "MVMArray: Can't pop from an empty array"); enter_single_user(tc, body); body->elems--; switch (repr_data->slot_type) { case MVM_ARRAY_OBJ: if (kind != MVM_reg_obj) MVM_exception_throw_adhoc(tc, "MVMArray: pop expected object register"); value->o = body->slots.o[slot]; break; case MVM_ARRAY_STR: if (kind != MVM_reg_str) MVM_exception_throw_adhoc(tc, "MVMArray: pop expected string register"); value->s = body->slots.s[slot]; break; case MVM_ARRAY_I64: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: pop expected int register"); value->i64 = (MVMint64)body->slots.i64[slot]; break; case MVM_ARRAY_I32: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: pop expected int register"); value->i64 = (MVMint64)body->slots.i32[slot]; break; case MVM_ARRAY_I16: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: pop expected int register"); value->i64 = (MVMint64)body->slots.i16[slot]; break; case MVM_ARRAY_I8: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: pop expected int register"); value->i64 = (MVMint64)body->slots.i8[slot]; break; case MVM_ARRAY_N64: if (kind != MVM_reg_num64) MVM_exception_throw_adhoc(tc, "MVMArray: pop expected num register"); value->n64 = (MVMnum64)body->slots.n64[slot]; break; case MVM_ARRAY_N32: if (kind != MVM_reg_num64) MVM_exception_throw_adhoc(tc, "MVMArray: pop expected num register"); value->n64 = (MVMnum64)body->slots.n32[slot]; break; case MVM_ARRAY_U64: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: pop expected int register"); value->i64 = (MVMint64)body->slots.u64[slot]; break; case MVM_ARRAY_U32: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: pop expected int register"); value->i64 = (MVMint64)body->slots.u32[slot]; break; case MVM_ARRAY_U16: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: pop expected int register"); value->i64 = (MVMint64)body->slots.u16[slot]; break; case MVM_ARRAY_U8: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: pop expected int register"); value->i64 = (MVMint64)body->slots.u8[slot]; break; default: MVM_exception_throw_adhoc(tc, "MVMArray: Unhandled slot type"); } zero_slots(tc, body, slot, slot + 1, repr_data->slot_type); exit_single_user(tc, body); } static void unshift(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister value, MVMuint16 kind) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *)st->REPR_data; MVMArrayBody *body = (MVMArrayBody *)data; /* If we don't have room at the beginning of the slots, * make some room (8 slots) for unshifting */ enter_single_user(tc, body); if (body->start < 1) { MVMuint64 n = 8; MVMuint64 elems = body->elems; /* grow the array */ set_size_internal(tc, body, elems + n, repr_data); /* move elements and set start */ memmove( (char *)body->slots.any + n * repr_data->elem_size, body->slots.any, elems * repr_data->elem_size); body->start = n; body->elems = elems; /* clear out beginning elements */ zero_slots(tc, body, 0, n, repr_data->slot_type); } /* Now do the unshift */ body->start--; switch (repr_data->slot_type) { case MVM_ARRAY_OBJ: if (kind != MVM_reg_obj) MVM_exception_throw_adhoc(tc, "MVMArray: unshift expected object register"); MVM_ASSIGN_REF(tc, &(root->header), body->slots.o[body->start], value.o); break; case MVM_ARRAY_STR: if (kind != MVM_reg_str) MVM_exception_throw_adhoc(tc, "MVMArray: unshift expected string register"); MVM_ASSIGN_REF(tc, &(root->header), body->slots.s[body->start], value.s); break; case MVM_ARRAY_I64: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: unshift expected int register"); body->slots.i64[body->start] = value.i64; break; case MVM_ARRAY_I32: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: unshift expected int register"); body->slots.i32[body->start] = (MVMint32)value.i64; break; case MVM_ARRAY_I16: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: unshift expected int register"); body->slots.i16[body->start] = (MVMint16)value.i64; break; case MVM_ARRAY_I8: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: unshift expected int register"); body->slots.i8[body->start] = (MVMint8)value.i64; break; case MVM_ARRAY_N64: if (kind != MVM_reg_num64) MVM_exception_throw_adhoc(tc, "MVMArray: unshift expected num register"); body->slots.n64[body->start] = value.n64; break; case MVM_ARRAY_N32: if (kind != MVM_reg_num64) MVM_exception_throw_adhoc(tc, "MVMArray: unshift expected num register"); body->slots.n32[body->start] = (MVMnum32)value.n64; break; case MVM_ARRAY_U64: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: unshift expected int register"); body->slots.u64[body->start] = (MVMuint64)value.i64; break; case MVM_ARRAY_U32: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: unshift expected int register"); body->slots.u32[body->start] = (MVMuint32)value.i64; break; case MVM_ARRAY_U16: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: unshift expected int register"); body->slots.u16[body->start] = (MVMuint16)value.i64; break; case MVM_ARRAY_U8: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: unshift expected int register"); body->slots.u8[body->start] = (MVMuint8)value.i64; break; default: MVM_exception_throw_adhoc(tc, "MVMArray: Unhandled slot type"); } body->elems++; exit_single_user(tc, body); } static void shift(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMRegister *value, MVMuint16 kind) { MVMArrayBody *body = (MVMArrayBody *)data; MVMArrayREPRData *repr_data = (MVMArrayREPRData *)st->REPR_data; if (body->elems < 1) MVM_exception_throw_adhoc(tc, "MVMArray: Can't shift from an empty array"); enter_single_user(tc, body); switch (repr_data->slot_type) { case MVM_ARRAY_OBJ: if (kind != MVM_reg_obj) MVM_exception_throw_adhoc(tc, "MVMArray: shift expected object register"); value->o = body->slots.o[body->start]; break; case MVM_ARRAY_STR: if (kind != MVM_reg_str) MVM_exception_throw_adhoc(tc, "MVMArray: shift expected string register"); value->s = body->slots.s[body->start]; break; case MVM_ARRAY_I64: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: shift expected int register"); value->i64 = (MVMint64)body->slots.i64[body->start]; break; case MVM_ARRAY_I32: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: shift expected int register"); value->i64 = (MVMint64)body->slots.i32[body->start]; break; case MVM_ARRAY_I16: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: shift expected int register"); value->i64 = (MVMint64)body->slots.i16[body->start]; break; case MVM_ARRAY_I8: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: shift expected int register"); value->i64 = (MVMint64)body->slots.i8[body->start]; break; case MVM_ARRAY_N64: if (kind != MVM_reg_num64) MVM_exception_throw_adhoc(tc, "MVMArray: shift expected num register"); value->n64 = (MVMnum64)body->slots.n64[body->start]; break; case MVM_ARRAY_N32: if (kind != MVM_reg_num64) MVM_exception_throw_adhoc(tc, "MVMArray: shift expected num register"); value->n64 = (MVMnum64)body->slots.n32[body->start]; break; case MVM_ARRAY_U64: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: shift expected int register"); value->i64 = (MVMint64)body->slots.u64[body->start]; break; case MVM_ARRAY_U32: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: shift expected int register"); value->i64 = (MVMint64)body->slots.u32[body->start]; break; case MVM_ARRAY_U16: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: shift expected int register"); value->i64 = (MVMint64)body->slots.u16[body->start]; break; case MVM_ARRAY_U8: if (kind != MVM_reg_int64) MVM_exception_throw_adhoc(tc, "MVMArray: shift expected int register"); value->i64 = (MVMint64)body->slots.u8[body->start]; break; default: MVM_exception_throw_adhoc(tc, "MVMArray: Unhandled slot type"); } body->start++; body->elems--; exit_single_user(tc, body); } /* This whole splice optimization can be optimized for the case we have two * MVMArray representation objects. */ static void asplice(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *from, MVMint64 offset, MVMuint64 count) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *)st->REPR_data; MVMArrayBody *body = (MVMArrayBody *)data; const MVMREPROps *source_repr = REPR(from); MVMArrayREPRData *source_repr_data = source_repr->ID == MVM_REPR_ID_VMArray ? STABLE(from)->REPR_data : NULL; MVMint64 elems0 = body->elems; MVMint64 elems1 = REPR(from)->elems(tc, STABLE(from), from, OBJECT_BODY(from)); MVMint64 start; MVMint64 tail; /* start from end? */ if (offset < 0) { offset += elems0; if (offset < 0) MVM_exception_throw_adhoc(tc, "MVMArray: Illegal splice offset"); } enter_single_user(tc, body); /* When offset == 0, then we may be able to reduce the memmove * calls and reallocs by adjusting SELF's start, elems0, and * count to better match the incoming splice. In particular, * we're seeking to adjust C to as close to C * as we can. */ if (offset == 0) { MVMint64 n = elems1 - count; start = body->start; if (n > start) n = start; if (n <= -elems0) { elems0 = 0; count = 0; body->start = 0; body->elems = elems0; } else if (n != 0) { elems0 += n; count += n; body->start = start - n; body->elems = elems0; } } /* if count == 0 and elems1 == 0, there's nothing left * to copy or remove, so the splice is done! */ if (count == 0 && elems1 == 0) { exit_single_user(tc, body); return; } /* number of elements to right of splice (the "tail") */ tail = elems0 - offset - count; if (tail < 0) tail = 0; else if (tail > 0 && count > elems1) { /* We're shrinking the array, so first move the tail left */ start = body->start; memmove( (char *)body->slots.any + (start + offset + elems1) * repr_data->elem_size, (char *)body->slots.any + (start + offset + count) * repr_data->elem_size, tail * repr_data->elem_size); } /* now resize the array */ set_size_internal(tc, body, offset + elems1 + tail, repr_data); start = body->start; if (tail > 0 && count < elems1) { /* The array grew, so move the tail to the right */ memmove( (char *)body->slots.any + (start + offset + elems1) * repr_data->elem_size, (char *)body->slots.any + (start + offset + count) * repr_data->elem_size, tail * repr_data->elem_size); } exit_single_user(tc, body); /* now copy C's elements into SELF */ if (elems1 > 0) { MVMint64 i; MVMuint16 kind; MVMuint8 needs_barrier = root->header.flags & MVM_CF_SECOND_GEN; if (source_repr_data && repr_data->slot_type == source_repr_data->slot_type && repr_data->elem_size == source_repr_data->elem_size && (repr_data->slot_type != MVM_ARRAY_OBJ || !needs_barrier) && repr_data->slot_type != MVM_ARRAY_STR) { /* Optimized for copying from a VMArray with same slot type */ MVMArrayBody *from_body = (MVMArrayBody *)OBJECT_BODY(from); start = body->start; memcpy(body->slots.u8 + (start + offset) * repr_data->elem_size, from_body->slots.u8 + from_body->start * source_repr_data->elem_size, repr_data->elem_size * elems1); } else { switch (repr_data->slot_type) { case MVM_ARRAY_OBJ: kind = MVM_reg_obj; break; case MVM_ARRAY_STR: kind = MVM_reg_str; break; case MVM_ARRAY_I64: case MVM_ARRAY_I32: case MVM_ARRAY_I16: case MVM_ARRAY_I8: kind = MVM_reg_int64; break; case MVM_ARRAY_N64: case MVM_ARRAY_N32: kind = MVM_reg_num64; break; case MVM_ARRAY_U64: case MVM_ARRAY_U32: case MVM_ARRAY_U16: case MVM_ARRAY_U8: kind = MVM_reg_int64; break; default: abort(); /* never reached, silence compiler warnings */ } for (i = 0; i < elems1; i++) { MVMRegister to_copy; REPR(from)->pos_funcs.at_pos(tc, STABLE(from), from, OBJECT_BODY(from), i, &to_copy, kind); bind_pos(tc, st, root, data, offset + i, to_copy, kind); } } } } static void at_pos_multidim(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_indices, MVMint64 *indices, MVMRegister *result, MVMuint16 kind) { if (num_indices != 1) MVM_exception_throw_adhoc(tc, "A dynamic array can only be indexed with a single dimension"); at_pos(tc, st, root, data, indices[0], result, kind); } static void bind_pos_multidim(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_indices, MVMint64 *indices, MVMRegister value, MVMuint16 kind) { if (num_indices != 1) MVM_exception_throw_adhoc(tc, "A dynamic array can only be indexed with a single dimension"); bind_pos(tc, st, root, data, indices[0], value, kind); } static void dimensions(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 *num_dimensions, MVMint64 **dimensions) { MVMArrayBody *body = (MVMArrayBody *)data; *num_dimensions = 1; *dimensions = (MVMint64 *) &(body->elems); } static void set_dimensions(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_dimensions, MVMint64 *dimensions) { if (num_dimensions != 1) MVM_exception_throw_adhoc(tc, "A dynamic array can only have a single dimension"); set_elems(tc, st, root, data, dimensions[0]); } static MVMStorageSpec get_elem_storage_spec(MVMThreadContext *tc, MVMSTable *st) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *)st->REPR_data; MVMStorageSpec spec; /* initialise storage spec to default values */ spec.bits = 0; spec.align = 0; spec.is_unsigned = 0; switch (repr_data->slot_type) { case MVM_ARRAY_STR: spec.inlineable = MVM_STORAGE_SPEC_INLINED; spec.boxed_primitive = MVM_STORAGE_SPEC_BP_STR; spec.can_box = MVM_STORAGE_SPEC_CAN_BOX_STR; break; case MVM_ARRAY_I64: case MVM_ARRAY_I32: case MVM_ARRAY_I16: case MVM_ARRAY_I8: spec.inlineable = MVM_STORAGE_SPEC_INLINED; spec.boxed_primitive = MVM_STORAGE_SPEC_BP_INT; spec.can_box = MVM_STORAGE_SPEC_CAN_BOX_INT; break; case MVM_ARRAY_N64: case MVM_ARRAY_N32: spec.inlineable = MVM_STORAGE_SPEC_INLINED; spec.boxed_primitive = MVM_STORAGE_SPEC_BP_NUM; spec.can_box = MVM_STORAGE_SPEC_CAN_BOX_NUM; break; case MVM_ARRAY_U64: case MVM_ARRAY_U32: case MVM_ARRAY_U16: case MVM_ARRAY_U8: spec.inlineable = MVM_STORAGE_SPEC_INLINED; spec.boxed_primitive = MVM_STORAGE_SPEC_BP_INT; spec.can_box = MVM_STORAGE_SPEC_CAN_BOX_INT; spec.is_unsigned = 1; break; default: spec.inlineable = MVM_STORAGE_SPEC_REFERENCE; spec.boxed_primitive = MVM_STORAGE_SPEC_BP_NONE; spec.can_box = 0; break; } return spec; } static AO_t * pos_as_atomic(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *)st->REPR_data; MVMArrayBody *body = (MVMArrayBody *)data; /* Handle negative indexes and require in bounds. */ if (index < 0) index += body->elems; if (index < 0 || index >= body->elems) MVM_exception_throw_adhoc(tc, "Index out of bounds in atomic operation on array"); if (sizeof(AO_t) == 8 && (repr_data->slot_type == MVM_ARRAY_I64 || repr_data->slot_type == MVM_ARRAY_U64)) return (AO_t *)&(body->slots.i64[body->start + index]); if (sizeof(AO_t) == 4 && (repr_data->slot_type == MVM_ARRAY_I32 || repr_data->slot_type == MVM_ARRAY_U32)) return (AO_t *)&(body->slots.i32[body->start + index]); MVM_exception_throw_adhoc(tc, "Can only do integer atomic operation on native integer array element of atomic size"); } static AO_t * pos_as_atomic_multidim(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 num_indices, MVMint64 *indices) { if (num_indices != 1) MVM_exception_throw_adhoc(tc, "A dynamic array can only be indexed with a single dimension"); return pos_as_atomic(tc, st, root, data, indices[0]); } /* Compose the representation. */ static void spec_to_repr_data(MVMThreadContext *tc, MVMArrayREPRData *repr_data, const MVMStorageSpec *spec) { switch (spec->boxed_primitive) { case MVM_STORAGE_SPEC_BP_INT: if (spec->is_unsigned) { switch (spec->bits) { case 64: repr_data->slot_type = MVM_ARRAY_U64; repr_data->elem_size = sizeof(MVMuint64); break; case 32: repr_data->slot_type = MVM_ARRAY_U32; repr_data->elem_size = sizeof(MVMuint32); break; case 16: repr_data->slot_type = MVM_ARRAY_U16; repr_data->elem_size = sizeof(MVMuint16); break; case 8: repr_data->slot_type = MVM_ARRAY_U8; repr_data->elem_size = sizeof(MVMuint8); break; case 4: repr_data->slot_type = MVM_ARRAY_U4; repr_data->elem_size = 0; break; case 2: repr_data->slot_type = MVM_ARRAY_U2; repr_data->elem_size = 0; break; case 1: repr_data->slot_type = MVM_ARRAY_U1; repr_data->elem_size = 0; break; default: MVM_exception_throw_adhoc(tc, "MVMArray: Unsupported uint size"); } } else { switch (spec->bits) { case 64: repr_data->slot_type = MVM_ARRAY_I64; repr_data->elem_size = sizeof(MVMint64); break; case 32: repr_data->slot_type = MVM_ARRAY_I32; repr_data->elem_size = sizeof(MVMint32); break; case 16: repr_data->slot_type = MVM_ARRAY_I16; repr_data->elem_size = sizeof(MVMint16); break; case 8: repr_data->slot_type = MVM_ARRAY_I8; repr_data->elem_size = sizeof(MVMint8); break; case 4: repr_data->slot_type = MVM_ARRAY_I4; repr_data->elem_size = 0; break; case 2: repr_data->slot_type = MVM_ARRAY_I2; repr_data->elem_size = 0; break; case 1: repr_data->slot_type = MVM_ARRAY_I1; repr_data->elem_size = 0; break; default: MVM_exception_throw_adhoc(tc, "MVMArray: Unsupported int size"); } } break; case MVM_STORAGE_SPEC_BP_NUM: switch (spec->bits) { case 64: repr_data->slot_type = MVM_ARRAY_N64; repr_data->elem_size = sizeof(MVMnum64); break; case 32: repr_data->slot_type = MVM_ARRAY_N32; repr_data->elem_size = sizeof(MVMnum32); break; default: MVM_exception_throw_adhoc(tc, "MVMArray: Unsupported num size"); } break; case MVM_STORAGE_SPEC_BP_STR: repr_data->slot_type = MVM_ARRAY_STR; repr_data->elem_size = sizeof(MVMString *); break; } } static void compose(MVMThreadContext *tc, MVMSTable *st, MVMObject *info_hash) { MVMStringConsts str_consts = tc->instance->str_consts; MVMArrayREPRData * const repr_data = (MVMArrayREPRData *)st->REPR_data; MVMObject *info = MVM_repr_at_key_o(tc, info_hash, str_consts.array); if (!MVM_is_null(tc, info)) { MVMObject *type = MVM_repr_at_key_o(tc, info, str_consts.type); if (!MVM_is_null(tc, type)) { const MVMStorageSpec *spec = REPR(type)->get_storage_spec(tc, STABLE(type)); MVM_ASSIGN_REF(tc, &(st->header), repr_data->elem_type, type); spec_to_repr_data(tc, repr_data, spec); } } } /* Set the size of the STable. */ static void deserialize_stable_size(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { st->size = sizeof(MVMArray); } /* Serializes the REPR data. */ static void serialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationWriter *writer) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *)st->REPR_data; MVM_serialization_write_ref(tc, writer, repr_data->elem_type); } /* Deserializes representation data. */ static void deserialize_repr_data(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *)MVM_malloc(sizeof(MVMArrayREPRData)); MVMObject *type = MVM_serialization_read_ref(tc, reader); MVM_ASSIGN_REF(tc, &(st->header), repr_data->elem_type, type); repr_data->slot_type = MVM_ARRAY_OBJ; repr_data->elem_size = sizeof(MVMObject *); st->REPR_data = repr_data; if (type) { const MVMStorageSpec *spec; MVM_serialization_force_stable(tc, reader, STABLE(type)); spec = REPR(type)->get_storage_spec(tc, STABLE(type)); spec_to_repr_data(tc, repr_data, spec); } } static void deserialize(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMSerializationReader *reader) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *) st->REPR_data; MVMArrayBody *body = (MVMArrayBody *)data; MVMint64 i; body->elems = MVM_serialization_read_int(tc, reader); body->ssize = body->elems; if (body->ssize) body->slots.any = MVM_malloc(body->ssize * repr_data->elem_size); for (i = 0; i < body->elems; i++) { switch (repr_data->slot_type) { case MVM_ARRAY_OBJ: MVM_ASSIGN_REF(tc, &(root->header), body->slots.o[i], MVM_serialization_read_ref(tc, reader)); break; case MVM_ARRAY_STR: MVM_ASSIGN_REF(tc, &(root->header), body->slots.s[i], MVM_serialization_read_str(tc, reader)); break; case MVM_ARRAY_I64: body->slots.i64[i] = MVM_serialization_read_int(tc, reader); break; case MVM_ARRAY_I32: body->slots.i32[i] = (MVMint32)MVM_serialization_read_int(tc, reader); break; case MVM_ARRAY_I16: body->slots.i16[i] = (MVMint16)MVM_serialization_read_int(tc, reader); break; case MVM_ARRAY_I8: body->slots.i8[i] = (MVMint8)MVM_serialization_read_int(tc, reader); break; case MVM_ARRAY_U64: body->slots.i64[i] = MVM_serialization_read_int(tc, reader); break; case MVM_ARRAY_U32: body->slots.i32[i] = (MVMuint32)MVM_serialization_read_int(tc, reader); break; case MVM_ARRAY_U16: body->slots.i16[i] = (MVMuint16)MVM_serialization_read_int(tc, reader); break; case MVM_ARRAY_U8: body->slots.i8[i] = (MVMuint8)MVM_serialization_read_int(tc, reader); break; case MVM_ARRAY_N64: body->slots.n64[i] = MVM_serialization_read_num(tc, reader); break; case MVM_ARRAY_N32: body->slots.n32[i] = (MVMnum32)MVM_serialization_read_num(tc, reader); break; default: MVM_exception_throw_adhoc(tc, "MVMArray: Unhandled slot type"); } } } static void serialize(MVMThreadContext *tc, MVMSTable *st, void *data, MVMSerializationWriter *writer) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *) st->REPR_data; MVMArrayBody *body = (MVMArrayBody *)data; MVMint64 i; MVM_serialization_write_int(tc, writer, body->elems); for (i = 0; i < body->elems; i++) { switch (repr_data->slot_type) { case MVM_ARRAY_OBJ: MVM_serialization_write_ref(tc, writer, body->slots.o[body->start + i]); break; case MVM_ARRAY_STR: MVM_serialization_write_str(tc, writer, body->slots.s[body->start + i]); break; case MVM_ARRAY_I64: MVM_serialization_write_int(tc, writer, (MVMint64)body->slots.i64[body->start + i]); break; case MVM_ARRAY_I32: MVM_serialization_write_int(tc, writer, (MVMint64)body->slots.i32[body->start + i]); break; case MVM_ARRAY_I16: MVM_serialization_write_int(tc, writer, (MVMint64)body->slots.i16[body->start + i]); break; case MVM_ARRAY_I8: MVM_serialization_write_int(tc, writer, (MVMint64)body->slots.i8[body->start + i]); break; case MVM_ARRAY_U64: MVM_serialization_write_int(tc, writer, (MVMint64)body->slots.u64[body->start + i]); break; case MVM_ARRAY_U32: MVM_serialization_write_int(tc, writer, (MVMint64)body->slots.u32[body->start + i]); break; case MVM_ARRAY_U16: MVM_serialization_write_int(tc, writer, (MVMint64)body->slots.u16[body->start + i]); break; case MVM_ARRAY_U8: MVM_serialization_write_int(tc, writer, (MVMint64)body->slots.u8[body->start + i]); break; case MVM_ARRAY_N64: MVM_serialization_write_num(tc, writer, (MVMnum64)body->slots.n64[body->start + i]); break; case MVM_ARRAY_N32: MVM_serialization_write_num(tc, writer, (MVMnum64)body->slots.n32[body->start + i]); break; default: MVM_exception_throw_adhoc(tc, "MVMArray: Unhandled slot type"); } } } /* Bytecode specialization for this REPR. */ static void spesh(MVMThreadContext *tc, MVMSTable *st, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { switch (ins->info->opcode) { case MVM_OP_create: { if (!(st->mode_flags & MVM_FINALIZE_TYPE)) { MVMSpeshOperand target = ins->operands[0]; MVMSpeshOperand type = ins->operands[1]; ins->info = MVM_op_get_op(MVM_OP_sp_fastcreate); ins->operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand)); ins->operands[0] = target; ins->operands[1].lit_i16 = sizeof(MVMArray); ins->operands[2].lit_i16 = MVM_spesh_add_spesh_slot(tc, g, (MVMCollectable *)st); MVM_spesh_get_facts(tc, g, type)->usages--; } break; } } } /* Calculates the non-GC-managed memory we hold on to. */ static MVMuint64 unmanaged_size(MVMThreadContext *tc, MVMSTable *st, void *data) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *) st->REPR_data; MVMArrayBody *body = (MVMArrayBody *)data; return body->ssize * repr_data->elem_size; } static void describe_refs (MVMThreadContext *tc, MVMHeapSnapshotState *ss, MVMSTable *st, void *data) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *) st->REPR_data; MVMArrayBody *body = (MVMArrayBody *)data; MVMuint64 elems = body->elems; MVMuint64 start = body->start; MVMuint64 i = 0; switch (repr_data->slot_type) { case MVM_ARRAY_OBJ: { MVMObject **slots = body->slots.o; slots += start; while (i < elems) { MVM_profile_heap_add_collectable_rel_idx(tc, ss, (MVMCollectable *)slots[i], i); i++; } break; } case MVM_ARRAY_STR: { MVMString **slots = body->slots.s; slots += start; while (i < elems) { MVM_profile_heap_add_collectable_rel_idx(tc, ss, (MVMCollectable *)slots[i], i); i++; } break; } } } /* Initializes the representation. */ const MVMREPROps * MVMArray_initialize(MVMThreadContext *tc) { return &VMArray_this_repr; } static const MVMREPROps VMArray_this_repr = { type_object_for, MVM_gc_allocate_object, NULL, /* initialize */ copy_to, MVM_REPR_DEFAULT_ATTR_FUNCS, MVM_REPR_DEFAULT_BOX_FUNCS, { at_pos, bind_pos, set_elems, push, pop, unshift, shift, asplice, at_pos_multidim, bind_pos_multidim, dimensions, set_dimensions, get_elem_storage_spec, pos_as_atomic, pos_as_atomic_multidim }, /* pos_funcs */ MVM_REPR_DEFAULT_ASS_FUNCS, elems, get_storage_spec, NULL, /* change_type */ serialize, deserialize, serialize_repr_data, deserialize_repr_data, deserialize_stable_size, gc_mark, gc_free, NULL, /* gc_cleanup */ gc_mark_repr_data, gc_free_repr_data, compose, spesh, "VMArray", /* name */ MVM_REPR_ID_VMArray, unmanaged_size, describe_refs, }; MoarVM-2018.03/src/6model/reprs/VMArray.h0000644000175000017510000000362413237701240020011 0ustar samanthasamantha/* Concurrent use of a VMArray is erroneous. This debugging option will * catch bad usages. (Eventually, we will refactor VMArray to not have * this issue.) */ #define MVM_ARRAY_CONC_DEBUG 0 /* Representation used by VM-level arrays. Adopted from QRPA work by * Patrick Michaud. */ struct MVMArrayBody { /* number of elements (from user's point of view) */ MVMuint64 elems; /* slot index of first element */ MVMuint64 start; /* size of slots array */ MVMuint64 ssize; /* slot array; union of various types of storage we may have. */ union { MVMObject **o; MVMString **s; MVMint64 *i64; MVMint32 *i32; MVMint16 *i16; MVMint8 *i8; MVMnum64 *n64; MVMnum32 *n32; MVMuint64 *u64; MVMuint32 *u32; MVMuint16 *u16; MVMuint8 *u8; void *any; } slots; #if MVM_ARRAY_CONC_DEBUG AO_t in_use; #endif }; struct MVMArray { MVMObject common; MVMArrayBody body; }; /* Types of things we may be storing. */ #define MVM_ARRAY_OBJ 0 #define MVM_ARRAY_STR 1 #define MVM_ARRAY_I64 2 #define MVM_ARRAY_I32 3 #define MVM_ARRAY_I16 4 #define MVM_ARRAY_I8 5 #define MVM_ARRAY_N64 6 #define MVM_ARRAY_N32 7 #define MVM_ARRAY_U64 8 #define MVM_ARRAY_U32 9 #define MVM_ARRAY_U16 10 #define MVM_ARRAY_U8 11 #define MVM_ARRAY_U4 12 #define MVM_ARRAY_U2 13 #define MVM_ARRAY_U1 14 #define MVM_ARRAY_I4 15 #define MVM_ARRAY_I2 16 #define MVM_ARRAY_I1 17 /* Function for REPR setup. */ const MVMREPROps * MVMArray_initialize(MVMThreadContext *tc); /* Array REPR data specifies the type of array elements we have. */ struct MVMArrayREPRData { /* The size of each element. */ size_t elem_size; /* What type of slots we have. */ MVMuint8 slot_type; /* Type object for the element type. */ MVMObject *elem_type; }; MoarVM-2018.03/src/6model/sc.c0000644000175000017510000004657313237701240015747 0ustar samanthasamantha#include "moar.h" /* Creates a new serialization context with the specified handle. If any * compilation units are waiting for an SC with this handle, removes it from * their to-resolve list after installing itself in the appropriate slot. */ MVMObject * MVM_sc_create(MVMThreadContext *tc, MVMString *handle) { MVMSerializationContext *sc; MVMSerializationContextBody *scb = NULL; /* Allocate. */ MVMROOT(tc, handle, { sc = (MVMSerializationContext *)REPR(tc->instance->SCRef)->allocate(tc, STABLE(tc->instance->SCRef)); MVMROOT(tc, sc, { /* Add to weak lookup hash. */ uv_mutex_lock(&tc->instance->mutex_sc_weakhash); MVM_HASH_GET(tc, tc->instance->sc_weakhash, handle, scb); if (!scb) { sc->body = scb = MVM_calloc(1, sizeof(MVMSerializationContextBody)); MVM_ASSIGN_REF(tc, &(sc->common.header), scb->handle, handle); MVM_HASH_BIND(tc, tc->instance->sc_weakhash, handle, scb); /* Calling repr_init will allocate, BUT if it does so, and we * get unlucky, the GC will try to acquire mutex_sc_weakhash. * This deadlocks. Thus, we force allocation in gen2, which * can never trigger GC. Note that releasing the mutex early * is not a good way to fix this, as it leaves a race to * test/set scb->sc (between the line doing it in this block, * and in the else clauses beneath it). */ MVM_gc_allocate_gen2_default_set(tc); MVM_repr_init(tc, (MVMObject *)sc); MVM_gc_allocate_gen2_default_clear(tc); scb->sc = sc; MVM_sc_add_all_scs_entry(tc, scb); } else if (scb->sc) { /* we lost a race to create it! */ sc = scb->sc; } else { scb->sc = sc; sc->body = scb; MVM_ASSIGN_REF(tc, &(sc->common.header), scb->handle, handle); MVM_gc_allocate_gen2_default_set(tc); MVM_repr_init(tc, (MVMObject *)sc); MVM_gc_allocate_gen2_default_clear(tc); } uv_mutex_unlock(&tc->instance->mutex_sc_weakhash); }); }); return (MVMObject *)sc; } /* Makes an entry in all SCs list, the index of which is used to refer to * SCs in object headers. */ void MVM_sc_add_all_scs_entry(MVMThreadContext *tc, MVMSerializationContextBody *scb) { if (tc->instance->all_scs_next_idx == tc->instance->all_scs_alloc) { tc->instance->all_scs_alloc += 32; if (tc->instance->all_scs_next_idx == 0) { /* First time; allocate, and NULL first slot as it is * the "no SC" sentinel value. */ tc->instance->all_scs = MVM_malloc(tc->instance->all_scs_alloc * sizeof(MVMSerializationContextBody *)); tc->instance->all_scs[0] = NULL; tc->instance->all_scs_next_idx++; } else { tc->instance->all_scs = MVM_realloc(tc->instance->all_scs, tc->instance->all_scs_alloc * sizeof(MVMSerializationContextBody *)); } } scb->sc_idx = tc->instance->all_scs_next_idx; tc->instance->all_scs[tc->instance->all_scs_next_idx] = scb; tc->instance->all_scs_next_idx++; } /* Given an SC, returns its unique handle. */ MVMString * MVM_sc_get_handle(MVMThreadContext *tc, MVMSerializationContext *sc) { return sc->body->handle; } /* Given an SC, returns its description. */ MVMString * MVM_sc_get_description(MVMThreadContext *tc, MVMSerializationContext *sc) { return sc->body->description; } /* Given an SC, sets its description. */ void MVM_sc_set_description(MVMThreadContext *tc, MVMSerializationContext *sc, MVMString *desc) { MVM_ASSIGN_REF(tc, &(sc->common.header), sc->body->description, desc); } /* Given an SC, looks up the index of an object that is in its root set. */ MVMint64 MVM_sc_find_object_idx(MVMThreadContext *tc, MVMSerializationContext *sc, MVMObject *obj) { MVMObject **roots; MVMint64 i, count; MVMuint32 cached = MVM_sc_get_idx_in_sc(&obj->header); if (cached != ~0 && MVM_sc_get_collectable_sc(tc, &obj->header) == sc) return cached; roots = sc->body->root_objects; count = sc->body->num_objects; for (i = 0; i < count; i++) if (roots[i] == obj) return i; MVM_exception_throw_adhoc(tc, "Object does not exist in serialization context"); } /* Calls MVM_sc_find_object_idx, but first checks if the sc is actually an SCRef. */ MVMint64 MVM_sc_find_object_idx_jit(MVMThreadContext *tc, MVMObject *sc, MVMObject *obj) { if (REPR(sc)->ID != MVM_REPR_ID_SCRef) MVM_exception_throw_adhoc(tc, "Must provide an SCRef operand to scgetobjidx"); return MVM_sc_find_object_idx(tc, (MVMSerializationContext *)sc, obj); } /* Given an SC, looks up the index of an STable that is in its root set. */ MVMint64 MVM_sc_find_stable_idx(MVMThreadContext *tc, MVMSerializationContext *sc, MVMSTable *st) { MVMuint64 i; MVMuint32 cached = MVM_sc_get_idx_in_sc(&st->header); if (cached != ~0 && MVM_sc_get_collectable_sc(tc, &st->header) == sc) return cached; for (i = 0; i < sc->body->num_stables; i++) if (sc->body->root_stables[i] == st) return i; MVM_exception_throw_adhoc(tc, "STable %s does not exist in serialization context", MVM_6model_get_stable_debug_name(tc, st)); } /* Given an SC, looks up the index of a code ref that is in its root set. */ MVMint64 MVM_sc_find_code_idx(MVMThreadContext *tc, MVMSerializationContext *sc, MVMObject *obj) { MVMObject *roots; MVMint64 i, count; MVMuint32 cached = MVM_sc_get_idx_in_sc(&obj->header); if (cached != ~0 && MVM_sc_get_collectable_sc(tc, &obj->header) == sc) return cached; roots = sc->body->root_codes; count = MVM_repr_elems(tc, roots); for (i = 0; i < count; i++) { MVMObject *test = MVM_repr_at_pos_o(tc, roots, i); if (test == obj) return i; } if (REPR(obj)->ID == MVM_REPR_ID_MVMCode) { char *c_name = MVM_string_utf8_encode_C_string(tc, ((MVMCode *)obj)->body.name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Code ref '%s' does not exist in serialization context", c_name); } else { MVM_exception_throw_adhoc(tc, "Code ref '' does not exist in serialization context"); } } /* Given a compilation unit and dependency index, returns that SC. Slow path * for when the SC may be NULL. */ MVMSerializationContext * MVM_sc_get_sc_slow(MVMThreadContext *tc, MVMCompUnit *cu, MVMint16 dep) { MVMSerializationContext *sc = cu->body.scs[dep]; if (sc == NULL) { MVMSerializationContextBody *scb = cu->body.scs_to_resolve[dep]; if (!scb) MVM_exception_throw_adhoc(tc, "SC resolution: internal error"); sc = scb->sc; if (sc == NULL) return NULL; MVM_ASSIGN_REF(tc, &(cu->common.header), cu->body.scs[dep], sc); scb->claimed = 1; } return sc; } /* Checks if an SC is currently in the process of doing deserialization work. */ MVM_STATIC_INLINE MVMint64 sc_working(MVMSerializationContext *sc) { MVMSerializationReader *sr = sc->body->sr; return sr && sr->working; } /* Given an SC and an index, fetch the object stored there. */ MVMObject * MVM_sc_get_object(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx) { MVMObject **roots = sc->body->root_objects; MVMint64 count = sc->body->num_objects; if (idx >= 0 && idx < count) return roots[idx] && !sc_working(sc) ? roots[idx] : MVM_serialization_demand_object(tc, sc, idx); else { char *c_description = MVM_string_utf8_encode_C_string(tc, sc->body->description); char *waste[] = { c_description, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Probable version skew in pre-compiled '%s' (cause: no object at index %"PRId64")", c_description, idx); } } MVMObject * MVM_sc_get_sc_object(MVMThreadContext *tc, MVMCompUnit *cu, MVMuint16 dep, MVMuint64 idx) { MVMSerializationContext *sc = MVM_sc_get_sc(tc, cu, dep); if (sc == NULL) MVM_exception_throw_adhoc(tc, "SC not yet resolved; lookup failed"); return MVM_sc_get_object(tc, sc, idx); } /* Given an SC and an index, fetch the object stored there, or return NULL if * there is none. Does not cause lazy deserialization. */ MVMObject * MVM_sc_try_get_object(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx) { MVMObject **roots = sc->body->root_objects; MVMint64 count = sc->body->num_objects; if (idx > 0 && idx < count && !sc_working(sc)) return roots[idx]; else return NULL; } /* Given an SC, an index, and an object, store the object at that index. */ void MVM_sc_set_object(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx, MVMObject *obj) { if (idx < 0) MVM_exception_throw_adhoc(tc, "Invalid (negative) object root index %"PRId64"", idx); if (idx < sc->body->num_objects) { /* Just updating an existing one. */ MVM_ASSIGN_REF(tc, &(sc->common.header), sc->body->root_objects[idx], obj); } else { if (idx >= sc->body->alloc_objects) { MVMint64 orig_size = sc->body->alloc_objects; sc->body->alloc_objects *= 2; if (sc->body->alloc_objects < idx + 1) sc->body->alloc_objects = idx + 1; sc->body->root_objects = MVM_recalloc(sc->body->root_objects, orig_size * sizeof(MVMObject *), sc->body->alloc_objects * sizeof(MVMObject *)); } MVM_ASSIGN_REF(tc, &(sc->common.header), sc->body->root_objects[idx], obj); sc->body->num_objects = idx + 1; } MVM_sc_set_idx_in_sc(&obj->header, idx); } /* Given an SC and an index, fetch the STable stored there. */ MVMSTable * MVM_sc_get_stable(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx) { if (idx >= 0 && idx < sc->body->num_stables) { MVMSTable *got = sc->body->root_stables[idx]; return got && !sc_working(sc) ? got : MVM_serialization_demand_stable(tc, sc, idx); } else { char *c_description = MVM_string_utf8_encode_C_string(tc, sc->body->description); char *waste[] = { c_description, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Probable version skew in pre-compiled '%s' (cause: no STable at index %"PRId64")", c_description, idx); } } /* Given an SC and an index, fetch the STable stored there, or return NULL if there * is none. Does not cause lazy deserialization. */ MVMSTable * MVM_sc_try_get_stable(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx) { if (idx >= 0 && idx < sc->body->num_stables) return sc->body->root_stables[idx]; else return NULL; } /* Given an SC, an index, and an STable, store the STable at the index. */ void MVM_sc_set_stable(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx, MVMSTable *st) { if (idx < 0) MVM_exception_throw_adhoc(tc, "Invalid (negative) STable index %"PRId64, idx); if (idx < sc->body->num_stables) { /* Just updating an existing one. */ MVM_ASSIGN_REF(tc, &(sc->common.header), sc->body->root_stables[idx], st); } else { if (idx >= sc->body->alloc_stables) { MVMint64 orig_size = sc->body->alloc_stables; sc->body->alloc_stables += 32; if (sc->body->alloc_stables < idx + 1) sc->body->alloc_stables = idx + 1; sc->body->root_stables = MVM_realloc(sc->body->root_stables, sc->body->alloc_stables * sizeof(MVMSTable *)); memset(sc->body->root_stables + orig_size, 0, (sc->body->alloc_stables - orig_size) * sizeof(MVMSTable *)); } MVM_ASSIGN_REF(tc, &(sc->common.header), sc->body->root_stables[idx], st); sc->body->num_stables = idx + 1; } } /* Given an SC and an STable, pushes the STable to the end of the root list. */ void MVM_sc_push_stable(MVMThreadContext *tc, MVMSerializationContext *sc, MVMSTable *st) { MVMint64 idx = sc->body->num_stables; if (idx == sc->body->alloc_stables) { sc->body->alloc_stables += 16; sc->body->root_stables = MVM_realloc(sc->body->root_stables, sc->body->alloc_stables * sizeof(MVMSTable *)); } MVM_ASSIGN_REF(tc, &(sc->common.header), sc->body->root_stables[idx], st); sc->body->num_stables++; } /* Given an SC and an index, fetch the code ref stored there. */ MVMObject * MVM_sc_get_code(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx) { MVMObject *roots = sc->body->root_codes; MVMuint64 count = MVM_repr_elems(tc, roots); if (idx < count) { MVMObject *found = MVM_repr_at_pos_o(tc, roots, idx); return MVM_is_null(tc, found) || sc_working(sc) ? MVM_serialization_demand_code(tc, sc, idx) : found; } else { char *c_description = MVM_string_utf8_encode_C_string(tc, sc->body->description); char *waste[] = { c_description, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Probable version skew in pre-compiled '%s' (cause: no code ref at index %"PRId64")", c_description, idx); } } /* Resolves an SC handle using the SC weakhash. */ MVMSerializationContext * MVM_sc_find_by_handle(MVMThreadContext *tc, MVMString *handle) { MVMSerializationContextBody *scb; uv_mutex_lock(&tc->instance->mutex_sc_weakhash); MVM_HASH_GET(tc, tc->instance->sc_weakhash, handle, scb); uv_mutex_unlock(&tc->instance->mutex_sc_weakhash); return scb && scb->sc ? scb->sc : NULL; } /* Marks all objects, stables and codes that belong to this SC as free to be taken by another. */ void MVM_sc_disclaim(MVMThreadContext *tc, MVMSerializationContext *sc) { MVMObject **root_objects, *root_codes, *obj; MVMSTable **root_stables, *stable; MVMint64 i, count; MVMCollectable *col; if (REPR(sc)->ID != MVM_REPR_ID_SCRef) MVM_exception_throw_adhoc(tc, "Must provide an SCRef operand to scdisclaim"); root_objects = sc->body->root_objects; count = sc->body->num_objects; for (i = 0; i < count; i++) { obj = root_objects[i]; col = &obj->header; #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX if (col->flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED) { struct MVMSerializationIndex *const sci = col->sc_forward_u.sci; col->sc_forward_u.sci = NULL; MVM_free(sci); } col->sc_forward_u.sc.sc_idx = 0; col->sc_forward_u.sc.idx = 0; #else col->sc_forward_u.sc.sc_idx = 0; col->sc_forward_u.sc.idx = 0; #endif } sc->body->num_objects = 0; root_stables = sc->body->root_stables; count = sc->body->num_stables; for (i = 0; i < count; i++) { stable = root_stables[i]; col = &stable->header; col->sc_forward_u.sc.sc_idx = 0; } sc->body->num_stables = 0; root_codes = sc->body->root_codes; count = MVM_repr_elems(tc, root_codes); for (i = 0; i < count; i++) { obj = MVM_repr_at_pos_o(tc, root_codes, i); if (MVM_is_null(tc, obj)) obj = MVM_serialization_demand_code(tc, sc, i); col = &obj->header; col->sc_forward_u.sc.sc_idx = 0; } sc->body->root_codes = NULL; } /* SC repossession barrier. */ void MVM_SC_WB_OBJ(MVMThreadContext *tc, MVMObject *obj) { assert(!(obj->header.flags & MVM_CF_FORWARDER_VALID)); assert(MVM_sc_get_idx_of_sc(&obj->header) != ~0); if (MVM_sc_get_idx_of_sc(&obj->header) > 0) MVM_sc_wb_hit_obj(tc, obj); } /* Called when an object triggers the SC repossession write barrier. */ void MVM_sc_wb_hit_obj(MVMThreadContext *tc, MVMObject *obj) { MVMSerializationContext *comp_sc; /* If the WB is disabled or we're not compiling, can exit quickly. */ if (tc->sc_wb_disable_depth) return; if (!tc->compiling_scs || !MVM_repr_elems(tc, tc->compiling_scs)) return; /* Same if the object is flagged as one to never repossess. */ if (obj->header.flags & MVM_CF_NEVER_REPOSSESS) return; /* Otherwise, check that the object's SC is different from the SC * of the compilation we're currently in. Repossess if so. */ comp_sc = (MVMSerializationContext *)MVM_repr_at_pos_o(tc, tc->compiling_scs, 0); if (MVM_sc_get_obj_sc(tc, obj) != comp_sc) { /* Get new slot ID. */ MVMint64 new_slot = comp_sc->body->num_objects; /* See if the object is actually owned by another, and it's the * owner we need to repossess. */ if (obj->st->WHAT == tc->instance->boot_types.BOOTArray || obj->st->WHAT == tc->instance->boot_types.BOOTHash) { MVMObject *owned_objects = MVM_sc_get_obj_sc(tc, obj)->body->owned_objects; MVMint64 n = MVM_repr_elems(tc, owned_objects); MVMint64 found = 0; MVMint64 i; for (i = 0; i < n; i += 2) { if (MVM_repr_at_pos_o(tc, owned_objects, i) == obj) { MVMSerializationContext *real_sc; obj = MVM_repr_at_pos_o(tc, owned_objects, i + 1); real_sc = MVM_sc_get_obj_sc(tc, obj); if (!real_sc) return; /* Probably disclaimed. */ if (real_sc == comp_sc) return; found = 1; break; } } if (!found) return; } /* Add to root set. */ MVM_sc_set_object(tc, comp_sc, new_slot, obj); /* Add repossession entry. */ MVM_repr_push_i(tc, comp_sc->body->rep_indexes, new_slot << 1); MVM_repr_push_o(tc, comp_sc->body->rep_scs, (MVMObject *)MVM_sc_get_obj_sc(tc, obj)); /* Update SC of the object, claiming it, and update index too. */ MVM_sc_set_obj_sc(tc, obj, comp_sc); MVM_sc_set_idx_in_sc(&(obj->header), new_slot); } } /* Called when an STable triggers the SC repossession write barrier. */ void MVM_sc_wb_hit_st(MVMThreadContext *tc, MVMSTable *st) { MVMSerializationContext *comp_sc; /* If the WB is disabled or we're not compiling, can exit quickly. */ if (tc->sc_wb_disable_depth) return; if (!tc->compiling_scs || !MVM_repr_elems(tc, tc->compiling_scs)) return; /* Otherwise, check that the STable's SC is different from the SC * of the compilation we're currently in. Repossess if so. */ comp_sc = (MVMSerializationContext *)MVM_repr_at_pos_o(tc, tc->compiling_scs, 0); if (MVM_sc_get_stable_sc(tc, st) != comp_sc) { /* Add to root set. */ MVMint64 new_slot = comp_sc->body->num_stables; MVM_sc_push_stable(tc, comp_sc, st); /* Add repossession entry. */ MVM_repr_push_i(tc, comp_sc->body->rep_indexes, (new_slot << 1) | 1); MVM_repr_push_o(tc, comp_sc->body->rep_scs, (MVMObject *)MVM_sc_get_stable_sc(tc, st)); /* Update SC of the STable, claiming it. */ MVM_sc_set_stable_sc(tc, st, comp_sc); MVM_sc_set_idx_in_sc(&(st->header), new_slot); } } MoarVM-2018.03/src/6model/sc.h0000644000175000017510000001735213237701240015745 0ustar samanthasamantha/* SC manipulation functions. */ MVMObject * MVM_sc_create(MVMThreadContext *tc, MVMString *handle); void MVM_sc_add_all_scs_entry(MVMThreadContext *tc, MVMSerializationContextBody *scb); MVMString * MVM_sc_get_handle(MVMThreadContext *tc, MVMSerializationContext *sc); MVMString * MVM_sc_get_description(MVMThreadContext *tc, MVMSerializationContext *sc); void MVM_sc_set_description(MVMThreadContext *tc, MVMSerializationContext *sc, MVMString *desc); MVMint64 MVM_sc_find_object_idx(MVMThreadContext *tc, MVMSerializationContext *sc, MVMObject *obj); MVMint64 MVM_sc_find_object_idx_jit(MVMThreadContext *tc, MVMObject *sc, MVMObject *obj); MVMint64 MVM_sc_find_stable_idx(MVMThreadContext *tc, MVMSerializationContext *sc, MVMSTable *st); MVMint64 MVM_sc_find_code_idx(MVMThreadContext *tc, MVMSerializationContext *sc, MVMObject *obj); MVMObject * MVM_sc_get_object(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx); MVMObject * MVM_sc_try_get_object(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx); void MVM_sc_set_object(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx, MVMObject *obj); MVMSTable * MVM_sc_get_stable(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx); MVMSTable * MVM_sc_try_get_stable(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx); void MVM_sc_set_stable(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx, MVMSTable *st); void MVM_sc_push_stable(MVMThreadContext *tc, MVMSerializationContext *sc, MVMSTable *st); MVMObject * MVM_sc_get_code(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx); MVMSerializationContext * MVM_sc_find_by_handle(MVMThreadContext *tc, MVMString *handle); MVMSerializationContext * MVM_sc_get_sc_slow(MVMThreadContext *tc, MVMCompUnit *cu, MVMint16 dep); MVMObject * MVM_sc_get_sc_object(MVMThreadContext *tc, MVMCompUnit *cu, MVMuint16 dep, MVMuint64 idx); void MVM_sc_disclaim(MVMThreadContext *tc, MVMSerializationContext *sc); MVM_STATIC_INLINE MVMSerializationContext * MVM_sc_get_sc(MVMThreadContext *tc, MVMCompUnit *cu, MVMint16 dep) { MVMSerializationContext *sc = cu->body.scs[dep]; return sc ? sc : MVM_sc_get_sc_slow(tc, cu, dep); } MVM_STATIC_INLINE MVMuint32 MVM_sc_get_idx_of_sc(MVMCollectable *col) { assert(!(col->flags & MVM_CF_FORWARDER_VALID)); #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX if (col->flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED) return col->sc_forward_u.sci->sc_idx; #endif return col->sc_forward_u.sc.sc_idx; } MVM_STATIC_INLINE MVMuint32 MVM_sc_get_idx_in_sc(MVMCollectable *col) { assert(!(col->flags & MVM_CF_FORWARDER_VALID)); #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX if (col->flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED) return col->sc_forward_u.sci->idx; if (col->sc_forward_u.sc.idx == MVM_DIRECT_SC_IDX_SENTINEL) return ~0; #endif return col->sc_forward_u.sc.idx; } MVM_STATIC_INLINE void MVM_sc_set_idx_in_sc(MVMCollectable *col, MVMuint32 i) { assert(!(col->flags & MVM_CF_FORWARDER_VALID)); assert(i >= 0); #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX if (col->flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED) { col->sc_forward_u.sci->idx = i; } else if (i >= MVM_DIRECT_SC_IDX_SENTINEL) { struct MVMSerializationIndex *const sci = MVM_malloc(sizeof(struct MVMSerializationIndex)); sci->sc_idx = col->sc_forward_u.sc.sc_idx; sci->idx = i; col->sc_forward_u.sci = sci; col->flags |= MVM_CF_SERIALZATION_INDEX_ALLOCATED; } else #endif { col->sc_forward_u.sc.idx = i; } } /* Gets a collectable's SC. */ MVM_STATIC_INLINE MVMSerializationContext * MVM_sc_get_collectable_sc(MVMThreadContext *tc, MVMCollectable *col) { MVMuint32 sc_idx; assert(!(col->flags & MVM_CF_FORWARDER_VALID)); sc_idx = MVM_sc_get_idx_of_sc(col); assert(sc_idx != ~0); return sc_idx > 0 ? tc->instance->all_scs[sc_idx]->sc : NULL; } /* Gets an object's SC. */ MVM_STATIC_INLINE MVMSerializationContext * MVM_sc_get_obj_sc(MVMThreadContext *tc, MVMObject *obj) { return MVM_sc_get_collectable_sc(tc, &obj->header); } /* Gets a frame's SC. */ MVM_STATIC_INLINE MVMSerializationContext * MVM_sc_get_frame_sc(MVMThreadContext *tc, MVMFrame *f) { return MVM_sc_get_collectable_sc(tc, &f->header); } /* Gets an STables's SC. */ MVM_STATIC_INLINE MVMSerializationContext * MVM_sc_get_stable_sc(MVMThreadContext *tc, MVMSTable *st) { return MVM_sc_get_collectable_sc(tc, &st->header); } /* Sets a collectable's SC. */ MVM_STATIC_INLINE void MVM_sc_set_collectable_sc(MVMThreadContext *tc, MVMCollectable *col, MVMSerializationContext *sc) { assert(!(col->flags & MVM_CF_FORWARDER_VALID)); #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX if (col->flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED) { col->sc_forward_u.sci->sc_idx = sc->body->sc_idx; col->sc_forward_u.sci->idx = ~0; } else #endif { col->sc_forward_u.sc.sc_idx = sc->body->sc_idx; #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX if (col->sc_forward_u.sc.sc_idx != sc->body->sc_idx) { struct MVMSerializationIndex *const sci = MVM_malloc(sizeof(struct MVMSerializationIndex)); sci->sc_idx = sc->body->sc_idx; sci->idx = ~0; col->sc_forward_u.sci = sci; col->flags |= MVM_CF_SERIALZATION_INDEX_ALLOCATED; } else #endif { col->sc_forward_u.sc.idx = MVM_DIRECT_SC_IDX_SENTINEL; } } } /* Sets an object's SC. */ MVM_STATIC_INLINE void MVM_sc_set_obj_sc(MVMThreadContext *tc, MVMObject *obj, MVMSerializationContext *sc) { MVM_sc_set_collectable_sc(tc, &obj->header, sc); } /* Sets an frame's SC. */ MVM_STATIC_INLINE void MVM_sc_set_frame_sc(MVMThreadContext *tc, MVMFrame *f, MVMSerializationContext *sc) { MVM_sc_set_collectable_sc(tc, &f->header, sc); } /* Sets an STable's SC. */ MVM_STATIC_INLINE void MVM_sc_set_stable_sc(MVMThreadContext *tc, MVMSTable *st, MVMSerializationContext *sc) { MVM_sc_set_collectable_sc(tc, &st->header, sc); } /* Given an SC, an index and a code ref, store it and the index. */ MVM_STATIC_INLINE void MVM_sc_set_code(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx, MVMObject *code) { MVMObject *roots = sc->body->root_codes; MVM_repr_bind_pos_o(tc, roots, idx, code); if (MVM_sc_get_idx_of_sc(&code->header) == sc->body->sc_idx) MVM_sc_set_idx_in_sc(&code->header, idx); } /* Sets the full list of code refs. */ MVM_STATIC_INLINE void MVM_sc_set_code_list(MVMThreadContext *tc, MVMSerializationContext *sc, MVMObject *code_list) { MVM_ASSIGN_REF(tc, &(sc->common.header), sc->body->root_codes, code_list); } /* Gets the number of objects in the SC. */ MVM_STATIC_INLINE MVMuint64 MVM_sc_get_object_count(MVMThreadContext *tc, MVMSerializationContext *sc) { return sc->body->num_objects; } /* Given an SC and an object, push it onto the SC. */ MVM_STATIC_INLINE void MVM_sc_push_object(MVMThreadContext *tc, MVMSerializationContext *sc, MVMObject *obj) { MVMuint32 idx = sc->body->num_objects; MVM_sc_set_object(tc, sc, idx, obj); if (MVM_sc_get_idx_of_sc(&obj->header) == sc->body->sc_idx) MVM_sc_set_idx_in_sc(&obj->header, idx); } /* SC repossession write barriers. */ void MVM_sc_wb_hit_obj(MVMThreadContext *tc, MVMObject *obj); void MVM_sc_wb_hit_st(MVMThreadContext *tc, MVMSTable *st); void MVM_SC_WB_OBJ(MVMThreadContext *tc, MVMObject *obj); MVM_STATIC_INLINE void MVM_SC_WB_ST(MVMThreadContext *tc, MVMSTable *st) { assert(!(st->header.flags & MVM_CF_FORWARDER_VALID)); assert(MVM_sc_get_idx_of_sc(&st->header) != ~0); if (MVM_sc_get_idx_of_sc(&st->header) > 0) MVM_sc_wb_hit_st(tc, st); } MoarVM-2018.03/src/6model/serialization.c0000644000175000017510000040026013242626641020211 0ustar samanthasamantha#include #include #ifndef MAX #define MAX(x, y) ((y) > (x) ? (y) : (x)) #endif /* Whether we deserialize lazily or not. */ #define MVM_SERIALIZATION_LAZY 1 /* Version of the serialization format that we are currently at and lowest * version we support. */ #define CURRENT_VERSION 20 #define MIN_VERSION 16 /* Various sizes (in bytes). */ #define HEADER_SIZE (4 * 18) #define DEP_TABLE_ENTRY_SIZE 8 #define STABLES_TABLE_ENTRY_SIZE 12 #define OBJECTS_TABLE_ENTRY_SIZE 8 #define CLOSURES_TABLE_ENTRY_SIZE 24 #define CONTEXTS_TABLE_ENTRY_SIZE 16 #define REPOS_TABLE_ENTRY_SIZE 16 /* Some guesses. */ #define DEFAULT_STABLE_DATA_SIZE 4096 #define STABLES_TABLE_ENTRIES_GUESS 16 #define OBJECT_SIZE_GUESS 8 #define CLOSURES_TABLE_ENTRIES_GUESS 16 #define CONTEXTS_TABLE_ENTRIES_GUESS 4 #define DEFAULT_CONTEXTS_DATA_SIZE 1024 #define DEFAULT_PARAM_INTERNS_DATA_SIZE 128 /* Possible reference types we can serialize. */ #define REFVAR_NULL 1 #define REFVAR_OBJECT 2 #define REFVAR_VM_NULL 3 #define REFVAR_VM_INT 4 #define REFVAR_VM_NUM 5 #define REFVAR_VM_STR 6 #define REFVAR_VM_ARR_VAR 7 #define REFVAR_VM_ARR_STR 8 #define REFVAR_VM_ARR_INT 9 #define REFVAR_VM_HASH_STR_VAR 10 #define REFVAR_STATIC_CODEREF 11 #define REFVAR_CLONED_CODEREF 12 #define REFVAR_SC_REF 13 /* For the packed format, for "small" values of si and idx */ #define OBJECTS_TABLE_ENTRY_SC_MASK 0x7FF #define OBJECTS_TABLE_ENTRY_SC_IDX_MASK 0x000FFFFF #define OBJECTS_TABLE_ENTRY_SC_MAX 0x7FE #define OBJECTS_TABLE_ENTRY_SC_IDX_MAX 0x000FFFFF #define OBJECTS_TABLE_ENTRY_SC_SHIFT 20 #define OBJECTS_TABLE_ENTRY_SC_OVERFLOW 0x7FF #define OBJECTS_TABLE_ENTRY_IS_CONCRETE 0x80000000 /* In the main serialization data blobs we have 1 more bit to play with. The format is either 32 bits, with a packed value. or 32 bits with an overflow flag, 32 bits of ID, and 32 bits of index. The packed ID could be in the range 0..4094, the packed index 0..1048575. With these ranges, overflow isn't even needed for compiling the setting. An alternative format would be 8 bits of ID (so 0..254) and then 32 bits of index (0..65535), or 8 bits for an overflow flag, then 32 and 32. For this format, it turns out that currently for the setting, 296046 entries would pack into 3 bytes, and 59757 would overflow and need 9. 296046 * 3 + 59757 * 9 == 1425951 (296046 + 59757) * 4 == 1423212 Hence that format is not quite as space efficient. */ #define PACKED_SC_IDX_MASK 0x000FFFFF #define PACKED_SC_MAX 0xFFE #define PACKED_SC_IDX_MAX 0x000FFFFF #define PACKED_SC_SHIFT 20 #define PACKED_SC_OVERFLOW 0xFFF #define STRING_HEAP_LOC_MAX 0x7FFFFFFF #define STRING_HEAP_LOC_PACKED_MAX 0x00007FFF #define STRING_HEAP_LOC_PACKED_OVERFLOW 0x00008000 #define STRING_HEAP_LOC_PACKED_LOW_MASK 0x0000FFFF #define STRING_HEAP_LOC_PACKED_SHIFT 16 #define STABLE_BOOLIFICATION_SPEC_MODE_MASK 0x0F #define STABLE_HAS_CONTAINER_SPEC 0x10 #define STABLE_HAS_INVOCATION_SPEC 0x20 #define STABLE_HAS_HLL_OWNER 0x40 #define STABLE_HAS_HLL_ROLE 0x80 #define GROW_TABLE(table, alloc) \ table = (char *)MVM_recalloc( \ table, \ alloc, \ alloc * 2 \ ); \ alloc *= 2; /* Endian translation (file format is little endian, so on big endian we need * to twiddle. */ #ifdef MVM_BIGENDIAN static void switch_endian(char *bytes, size_t size) { size_t low = 0; size_t high = size - 1; while (high > low) { char tmp = bytes[low]; bytes[low] = bytes[high]; bytes[high] = tmp; low++; high--; } } #endif /* Base64 encoding */ static char * base64_encode(const void *buf, size_t size) { static const char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; char* str = (char*) MVM_malloc((size+3)*4/3 + 1); char* p = str; const unsigned char* q = (const unsigned char*) buf; size_t i = 0; while (i < size) { int c = q[i++]; c *= 256; if (i < size) c += q[i]; i++; c *= 256; if (i < size) c += q[i]; i++; *p++ = base64[(c & 0x00fc0000) >> 18]; *p++ = base64[(c & 0x0003f000) >> 12]; if (i > size + 1) *p++ = '='; else *p++ = base64[(c & 0x00000fc0) >> 6]; if (i > size) *p++ = '='; else *p++ = base64[c & 0x0000003f]; } *p = 0; return str; } /* Base64 decoding */ static int POS(char c) { /* XXX TODO: investigate whether enumerating all 256 cases of * this in a switch/case can help the compiler turn it into a * jump table instead of a bunch of comparisons (if it doesn't * already, of course!)... */ if (c>='A' && c<='Z') return c - 'A'; if (c>='a' && c<='z') return c - 'a' + 26; if (c>='0' && c<='9') return c - '0' + 52; if (c == '+') return 62; if (c == '/') return 63; if (c == '=') return -1; return -2; } static void * base64_decode(const char *s, size_t *data_len) { const char *p; unsigned char *q, *data; /* XXX TODO: investigate whether putting these n[4] into 4 * separate locals helps the compiler optimize them better.. */ int n[4] = {-1, -1, -1, -1}; size_t len = strlen(s); if (len % 4) { *data_len = 0; return NULL; } data = (unsigned char*) MVM_malloc(len/4*3); q = (unsigned char*) data; for (p = s; *p; ) { n[0] = POS(*p++); n[1] = POS(*p++); n[2] = POS(*p++); n[3] = POS(*p++); /* XXX TODO: investigate jump table possibility here too, * or at least collapse some of the branches... */ if (n[0] == -2 || n[1] == -2 || n[2] == -2 || n[3] == -2 || n[0] == -1 || n[1] == -1 || (n[2] == -1 && n[3] != -1)) { MVM_free(data); return NULL; } q[0] = (n[0] << 2) + (n[1] >> 4); if (n[2] != -1) q[1] = ((n[1] & 15) << 4) + (n[2] >> 2); if (n[3] != -1) q[2] = ((n[2] & 3) << 6) + n[3]; q += 3; } *data_len = q-data - (n[2]==-1) - (n[3]==-1); return data; } /* *************************************************************************** * Serialization (writing related) * ***************************************************************************/ /* Writes an int32 into a buffer. */ static void write_int32(char *buffer, size_t offset, MVMint32 value) { memcpy(buffer + offset, &value, 4); #ifdef MVM_BIGENDIAN switch_endian(buffer + offset, 4); #endif } /* Writes a uint16 into a buffer. */ static void write_uint16(char *buffer, size_t offset, MVMuint16 value) { memcpy(buffer + offset, &value, 2); #if MVM_BIGENDIAN switch_endian(buffer + offset, 2); #endif } /* Writes an double into a buffer. */ static void write_double(char *buffer, size_t offset, double value) { memcpy(buffer + offset, &value, 8); #ifdef MVM_BIGENDIAN switch_endian(buffer + offset, 8); #endif } /* Adds an item to the MVMString heap if needed, and returns the index where * it may be found. */ static MVMint32 add_string_to_heap(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMString *s) { if (s == NULL) { /* We ensured that the first entry in the heap represents the null MVMString, * so can just hand back 0 here. */ return 0; } else if (MVM_repr_exists_key(tc, writer->seen_strings, s)) { return (MVMint32)MVM_repr_at_key_int(tc, writer->seen_strings, s); } else { MVMint64 next_idx = MVM_repr_elems(tc, writer->root.string_heap); MVM_repr_bind_pos_s(tc, writer->root.string_heap, next_idx, s); MVM_repr_bind_key_int(tc, writer->seen_strings, s, next_idx); return (MVMint32)next_idx; } } /* Gets the ID of a serialization context. Returns 0 if it's the current * one, or its dependency table offset (base-1) otherwise. Note that if * it is not yet in the dependency table, it will be added. */ static MVMuint32 get_sc_id(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMSerializationContext *sc) { MVMint64 i, num_deps, offset; /* Easy if it's in the current SC. */ if (writer->root.sc == sc) return 0; /* Otherwise, find it in our dependencies list. */ num_deps = writer->root.num_dependencies; for (i = 0; i < num_deps; i++) if (writer->root.dependent_scs[i] == sc) return (MVMuint32)i + 1; /* Otherwise, need to add it to our dependencies list. Ensure there's * space in the dependencies table; grow if not. */ offset = num_deps * DEP_TABLE_ENTRY_SIZE; if (offset + DEP_TABLE_ENTRY_SIZE > writer->dependencies_table_alloc) { GROW_TABLE(writer->root.dependencies_table, writer->dependencies_table_alloc); } /* Add dependency. */ writer->root.dependent_scs = MVM_realloc(writer->root.dependent_scs, sizeof(MVMSerializationContext *) * (writer->root.num_dependencies + 1)); writer->root.dependent_scs[writer->root.num_dependencies] = sc; write_int32(writer->root.dependencies_table, offset, add_string_to_heap(tc, writer, MVM_sc_get_handle(tc, sc))); write_int32(writer->root.dependencies_table, offset + 4, add_string_to_heap(tc, writer, MVM_sc_get_description(tc, sc))); writer->root.num_dependencies++; return writer->root.num_dependencies; /* Deliberately index + 1. */ } #define OBJ_IS_NULL(obj) ((obj) == NULL) /* Takes an STable. If it's already in an SC, returns information on how * to reference it. Otherwise, adds it to the current SC, effectively * placing it onto the work list. */ static void get_stable_ref_info(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMSTable *st, MVMuint32 *sc, MVMuint32 *sc_idx) { /* Add to this SC if needed. */ if (MVM_sc_get_stable_sc(tc, st) == NULL) { MVM_sc_set_stable_sc(tc, st, writer->root.sc); MVM_sc_push_stable(tc, writer->root.sc, st); } /* Work out SC reference. */ *sc = get_sc_id(tc, writer, MVM_sc_get_stable_sc(tc, st)); *sc_idx = (MVMuint32)MVM_sc_find_stable_idx(tc, MVM_sc_get_stable_sc(tc, st), st); } /* Expands current target storage as needed. */ static void expand_storage_if_needed(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMint64 need) { if (*(writer->cur_write_offset) + need > *(writer->cur_write_limit)) { *(writer->cur_write_limit) *= 2; *(writer->cur_write_buffer) = (char *)MVM_realloc(*(writer->cur_write_buffer), *(writer->cur_write_limit)); } } /* Writing function for null-terminated char array strings */ void MVM_serialization_write_cstr(MVMThreadContext *tc, MVMSerializationWriter *writer, char *string) { size_t len; if (string) len = strlen(string); else len = 0; if (len) { MVM_serialization_write_int(tc, writer, len); expand_storage_if_needed(tc, writer, len); memcpy(*(writer->cur_write_buffer) + *(writer->cur_write_offset), string, len); *(writer->cur_write_offset) += len; } else { MVM_serialization_write_int(tc, writer, 0); } } /* Writing function for variable sized integers. Writes out a 64 bit value using between 1 and 9 bytes. */ void MVM_serialization_write_int(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMint64 value) { MVMuint8 storage_needed; char *buffer; size_t offset; if (value >= -1 && value <= 126) { storage_needed = 1; } else { const MVMint64 abs_val = value < 0 ? -value - 1 : value; if (abs_val <= 0x7FF) storage_needed = 2; else if (abs_val <= 0x000000000007FFFF) storage_needed = 3; else if (abs_val <= 0x0000000007FFFFFF) storage_needed = 4; else if (abs_val <= 0x00000007FFFFFFFF) storage_needed = 5; else if (abs_val <= 0x000007FFFFFFFFFFLL) storage_needed = 6; else if (abs_val <= 0x0007FFFFFFFFFFFFLL) storage_needed = 7; else if (abs_val <= 0x07FFFFFFFFFFFFFFLL) storage_needed = 8; else storage_needed = 9; } expand_storage_if_needed(tc, writer, storage_needed); buffer = *(writer->cur_write_buffer); offset = *(writer->cur_write_offset); if (storage_needed == 1) { buffer[offset] = 0x80 | (value + 129); } else if (storage_needed == 9) { buffer[offset++] = 0x00; memcpy(buffer + offset, &value, 8); #ifdef MVM_BIGENDIAN switch_endian(buffer + offset, 8); #endif } else { MVMuint8 rest = storage_needed - 1; MVMint64 nybble = value >> 8 * rest; /* All the other high bits should be the same as the top bit of the nybble we keep. Or we have a bug. */ assert((nybble >> 3) == 0 || (nybble >> 3) == ~(MVMuint64)0); buffer[offset++] = (rest << 4) | (nybble & 0xF); #ifdef MVM_BIGENDIAN memcpy(buffer + offset, (char *)&value + 8 - rest, rest); switch_endian(buffer + offset, rest); #else memcpy(buffer + offset, &value, rest); #endif } *(writer->cur_write_offset) += storage_needed; } /* Writing function for native numbers. */ void MVM_serialization_write_num(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMnum64 value) { expand_storage_if_needed(tc, writer, 8); write_double(*(writer->cur_write_buffer), *(writer->cur_write_offset), value); *(writer->cur_write_offset) += 8; } /* Writing function for native strings. */ void MVM_serialization_write_str(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMString *value) { MVMint32 heap_loc = add_string_to_heap(tc, writer, value); /* avoid warnings that heap_loc > STRING_HEAP_LOC_MAX is always false */ if (!(heap_loc >= 0 && heap_loc <= STRING_HEAP_LOC_MAX)) MVM_exception_throw_adhoc(tc, "Serialization error: string offset %d can't be serialized", heap_loc); if (heap_loc <= STRING_HEAP_LOC_PACKED_MAX) { expand_storage_if_needed(tc, writer, 2); write_uint16(*(writer->cur_write_buffer), *(writer->cur_write_offset), heap_loc); *(writer->cur_write_offset) += 2; } else { expand_storage_if_needed(tc, writer, 4); write_uint16(*(writer->cur_write_buffer), *(writer->cur_write_offset), (heap_loc >> STRING_HEAP_LOC_PACKED_SHIFT) | STRING_HEAP_LOC_PACKED_OVERFLOW); *(writer->cur_write_offset) += 2; write_uint16(*(writer->cur_write_buffer), *(writer->cur_write_offset), heap_loc & STRING_HEAP_LOC_PACKED_LOW_MASK); *(writer->cur_write_offset) += 2; } } /* Writes the ID, index pair that identifies an entry in a Serialization context. */ static void write_locate_sc_and_index(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMint32 sc_id, MVMint32 idx) { if (sc_id <= PACKED_SC_MAX && idx <= PACKED_SC_IDX_MAX) { MVMuint32 packed = (sc_id << PACKED_SC_SHIFT) | (idx & PACKED_SC_IDX_MASK); MVM_serialization_write_int(tc, writer, packed); } else { MVMuint32 packed = PACKED_SC_OVERFLOW << PACKED_SC_SHIFT; MVM_serialization_write_int(tc, writer, packed); MVM_serialization_write_int(tc, writer, sc_id); MVM_serialization_write_int(tc, writer, idx); } } /* Writes an object reference. */ static void write_obj_ref(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMObject *ref) { MVMint32 sc_id, idx; if (OBJ_IS_NULL(MVM_sc_get_obj_sc(tc, ref))) { /* This object doesn't belong to an SC yet, so it must be serialized as part of * this compilation unit. Add it to the work list. */ MVM_sc_set_obj_sc(tc, ref, writer->root.sc); MVM_sc_push_object(tc, writer->root.sc, ref); } sc_id = get_sc_id(tc, writer, MVM_sc_get_obj_sc(tc, ref)); idx = (MVMint32)MVM_sc_find_object_idx(tc, MVM_sc_get_obj_sc(tc, ref), ref); write_locate_sc_and_index(tc, writer, sc_id, idx); } /* Writes an array where each item is a variant reference. */ static void write_array_var(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMObject *arr) { MVMint32 elems = (MVMint32)MVM_repr_elems(tc, arr); MVMint32 i; /* Write out element count. */ MVM_serialization_write_int(tc, writer, elems); /* Write elements. */ for (i = 0; i < elems; i++) MVM_serialization_write_ref(tc, writer, MVM_repr_at_pos_o(tc, arr, i)); } /* Writes an array where each item is an integer. */ static void write_array_int(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMObject *arr) { MVMint32 elems = (MVMint32)MVM_repr_elems(tc, arr); MVMint32 i; /* Write out element count. */ MVM_serialization_write_int(tc, writer, elems); /* Write elements. */ for (i = 0; i < elems; i++) MVM_serialization_write_int(tc, writer, MVM_repr_at_pos_i(tc, arr, i)); } /* Writes an array where each item is a MVMString. */ static void write_array_str(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMObject *arr) { MVMint32 elems = (MVMint32)MVM_repr_elems(tc, arr); MVMint32 i; /* Write out element count. */ MVM_serialization_write_int(tc, writer, elems); /* Write elements. */ for (i = 0; i < elems; i++) MVM_serialization_write_str(tc, writer, MVM_repr_at_pos_s(tc, arr, i)); } /* Writes a hash where each key is a MVMString and each value a variant reference. */ static void write_hash_str_var(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMObject *hash) { MVMint32 elems = (MVMint32)MVM_repr_elems(tc, hash); MVMObject *iter = MVM_iter(tc, hash); /* Write out element count. */ MVM_serialization_write_int(tc, writer, elems); /* Write elements, as key,value,key,value etc. */ while (MVM_iter_istrue(tc, (MVMIter *)iter)) { MVM_repr_shift_o(tc, iter); MVM_serialization_write_str(tc, writer, MVM_iterkey_s(tc, (MVMIter *)iter)); MVM_serialization_write_ref(tc, writer, MVM_iterval(tc, (MVMIter *)iter)); } } /* Writes a reference to a code object in some SC. */ static void write_code_ref(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMObject *code) { MVMSerializationContext *sc = MVM_sc_get_obj_sc(tc, code); MVMint32 sc_id = get_sc_id(tc, writer, sc); MVMint32 idx = (MVMint32)MVM_sc_find_code_idx(tc, sc, code); write_locate_sc_and_index(tc, writer, sc_id, idx); } void throw_closure_serialization_error(MVMThreadContext *tc, MVMCode *closure, const char *message) { MVMString *file; MVMint32 line; MVM_gc_enter_from_allocator(tc); /* opportunity for creating a heap snapshot for debugging */ MVM_code_location_out(tc, (MVMObject *)closure, &file, &line); { char *c_name = MVM_string_utf8_encode_C_string(tc, (closure->body.sf)->body.name); char *c_file = MVM_string_utf8_encode_C_string(tc, file); char *waste[] = { c_name, c_file, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Serialization Error: %s '%s' (%s:%d)", message, c_name, c_file, line); } } /* Given a closure, locate the static code reference it was originally cloned * from. */ static MVMObject * closure_to_static_code_ref(MVMThreadContext *tc, MVMObject *closure, MVMint64 fatal) { MVMObject *scr = (MVMObject *)(((MVMCode *)closure)->body.sf)->body.static_code; if (scr == NULL || MVM_sc_get_obj_sc(tc, scr) == NULL) { if (fatal) { throw_closure_serialization_error( tc, (MVMCode *)closure, "missing static code ref for closure" ); } return NULL; } return scr; } /* Takes an outer context that is potentially to be serialized. Checks if it * is of interest, and if so sets it up to be serialized. */ static MVMint32 get_serialized_context_idx(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMFrame *ctx, MVMCode *closure) { if (OBJ_IS_NULL(MVM_sc_get_frame_sc(tc, ctx))) { /* Make sure we should chase a level down. */ if (OBJ_IS_NULL(closure_to_static_code_ref(tc, ctx->code_ref, 0))) { return 0; } else { if (writer->num_contexts == writer->alloc_contexts) { writer->alloc_contexts += 256; writer->contexts_list = MVM_realloc(writer->contexts_list, writer->alloc_contexts * sizeof(MVMFrame *)); } writer->contexts_list[writer->num_contexts++] = ctx; MVM_sc_set_frame_sc(tc, ctx, writer->root.sc); return (MVMint32)writer->num_contexts; } } else { MVMint64 i, c; if (MVM_sc_get_frame_sc(tc, ctx) != writer->root.sc) throw_closure_serialization_error(tc, closure, "reference to context outside of SC for" ); c = writer->num_contexts; for (i = 0; i < c; i++) if (writer->contexts_list[i] == ctx) return (MVMint32)i + 1; throw_closure_serialization_error( tc, closure, "could not locate outer context in current SC for" ); } } /* Takes a closure, that is to be serialized. Checks if it has an outer that is * of interest, and if so sets it up to be serialized. */ static MVMint32 get_serialized_outer_context_idx(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMObject *closure) { if (((MVMCode *)closure)->body.is_compiler_stub) return 0; if (((MVMCode *)closure)->body.outer == NULL) return 0; return get_serialized_context_idx(tc, writer, ((MVMCode *)closure)->body.outer, (MVMCode *)closure); } /* Takes a closure that needs to be serialized. Makes an entry in the closures * table for it. Also adds it to this SC's code refs set and tags it with the * current SC. */ static void serialize_closure(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMObject *closure) { MVMint32 static_sc_id, static_idx, context_idx; /* Locate the static code object. */ MVMObject *static_code_ref = closure_to_static_code_ref(tc, closure, 1); MVMSerializationContext *static_code_sc = MVM_sc_get_obj_sc(tc, static_code_ref); /* Ensure there's space in the closures table; grow if not. */ MVMint32 offset = writer->root.num_closures * CLOSURES_TABLE_ENTRY_SIZE; if (offset + CLOSURES_TABLE_ENTRY_SIZE > writer->closures_table_alloc) { GROW_TABLE(writer->root.closures_table, writer->closures_table_alloc); } /* Get the index of the context (which will add it to the todo list if * needed). */ context_idx = get_serialized_outer_context_idx(tc, writer, closure); /* Add an entry to the closures table. */ static_sc_id = get_sc_id(tc, writer, static_code_sc); static_idx = (MVMint32)MVM_sc_find_code_idx(tc, static_code_sc, static_code_ref); write_int32(writer->root.closures_table, offset, static_sc_id); write_int32(writer->root.closures_table, offset + 4, static_idx); write_int32(writer->root.closures_table, offset + 8, context_idx); /* Check if it has a static code object. */ if (((MVMCode *)closure)->body.code_object) { MVMObject *code_obj = (MVMObject *)((MVMCode *)closure)->body.code_object; write_int32(writer->root.closures_table, offset + 12, 1); if (!MVM_sc_get_obj_sc(tc, code_obj)) { MVM_sc_set_obj_sc(tc, code_obj, writer->root.sc); MVM_sc_push_object(tc, writer->root.sc, code_obj); } write_int32(writer->root.closures_table, offset + 16, get_sc_id(tc, writer, MVM_sc_get_obj_sc(tc, code_obj))); write_int32(writer->root.closures_table, offset + 20, (MVMint32)MVM_sc_find_object_idx(tc, MVM_sc_get_obj_sc(tc, code_obj), code_obj)); } else { write_int32(writer->root.closures_table, offset + 12, 0); } /* Increment count of closures in the table. */ writer->root.num_closures++; /* Add the closure to this SC, and mark it as as being in it. */ MVM_repr_push_o(tc, writer->codes_list, closure); MVM_sc_set_obj_sc(tc, closure, writer->root.sc); } /* Writing function for references to things. */ void MVM_serialization_write_ref(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMObject *ref) { /* Work out what kind of thing we have and determine the discriminator. */ /* Note, we could use 0xFF as the sentinel value, and 0 as a "valid" value. */ MVMuint8 discrim = 0; if (ref == NULL) { discrim = REFVAR_NULL; } else if (ref == tc->instance->VMNull) { discrim = REFVAR_VM_NULL; } else if (REPR(ref)->ID == MVM_REPR_ID_MVMMultiCache) { discrim = REFVAR_VM_NULL; } else if (REPR(ref)->ID == MVM_REPR_ID_MVMOSHandle) { discrim = REFVAR_VM_NULL; } else if (REPR(ref)->ID == MVM_REPR_ID_Decoder && IS_CONCRETE(ref)) { discrim = REFVAR_VM_NULL; } else if (STABLE(ref) == STABLE(tc->instance->boot_types.BOOTInt) && IS_CONCRETE(ref)) { discrim = REFVAR_VM_INT; } else if (STABLE(ref) == STABLE(tc->instance->boot_types.BOOTNum) && IS_CONCRETE(ref)) { discrim = REFVAR_VM_NUM; } else if (STABLE(ref) == STABLE(tc->instance->boot_types.BOOTStr) && IS_CONCRETE(ref)) { discrim = REFVAR_VM_STR; } else if (STABLE(ref) == STABLE(tc->instance->boot_types.BOOTArray) && IS_CONCRETE(ref)) { discrim = REFVAR_VM_ARR_VAR; } else if (STABLE(ref) == STABLE(tc->instance->boot_types.BOOTIntArray) && IS_CONCRETE(ref)) { discrim = REFVAR_VM_ARR_INT; } else if (STABLE(ref) == STABLE(tc->instance->boot_types.BOOTStrArray) && IS_CONCRETE(ref)) { discrim = REFVAR_VM_ARR_STR; } else if (STABLE(ref) == STABLE(tc->instance->boot_types.BOOTHash) && IS_CONCRETE(ref)) { discrim = REFVAR_VM_HASH_STR_VAR; } else if (REPR(ref)->ID == MVM_REPR_ID_MVMCode && IS_CONCRETE(ref)) { if (MVM_sc_get_obj_sc(tc, ref) && ((MVMCode *)ref)->body.is_static) { /* Static code reference. */ discrim = REFVAR_STATIC_CODEREF; } else if (MVM_sc_get_obj_sc(tc, ref)) { /* Closure, but already seen and serialization already handled. */ discrim = REFVAR_CLONED_CODEREF; } else { /* Closure but didn't see it yet. Take care of its serialization, which * gets it marked with this SC. Then it's just a normal code ref that * needs serializing. */ serialize_closure(tc, writer, ref); discrim = REFVAR_CLONED_CODEREF; } } else if (REPR(ref)->ID == MVM_REPR_ID_SCRef && IS_CONCRETE(ref)) { discrim = REFVAR_SC_REF; } else { discrim = REFVAR_OBJECT; } /* Write the discriminator. */ expand_storage_if_needed(tc, writer, 1); *(*(writer->cur_write_buffer) + *(writer->cur_write_offset)) = discrim; ++*(writer->cur_write_offset); /* Now take appropriate action. */ switch (discrim) { case REFVAR_NULL: break; case REFVAR_OBJECT: write_obj_ref(tc, writer, ref); break; case REFVAR_VM_NULL: /* Nothing to do for these. */ break; case REFVAR_VM_INT: MVM_serialization_write_int(tc, writer, MVM_repr_get_int(tc, ref)); break; case REFVAR_VM_NUM: MVM_serialization_write_num(tc, writer, MVM_repr_get_num(tc, ref)); break; case REFVAR_VM_STR: MVM_serialization_write_str(tc, writer, MVM_repr_get_str(tc, ref)); break; case REFVAR_VM_ARR_VAR: write_array_var(tc, writer, ref); break; case REFVAR_VM_ARR_STR: write_array_str(tc, writer, ref); break; case REFVAR_VM_ARR_INT: write_array_int(tc, writer, ref); break; case REFVAR_VM_HASH_STR_VAR: write_hash_str_var(tc, writer, ref); break; case REFVAR_STATIC_CODEREF: case REFVAR_CLONED_CODEREF: write_code_ref(tc, writer, ref); break; case REFVAR_SC_REF: { MVMString *handle = MVM_sc_get_handle(tc, (MVMSerializationContext *)ref); MVM_serialization_write_str(tc, writer, handle); break; } default: MVM_exception_throw_adhoc(tc, "Serialization Error: Unimplemented discriminator %d in MVM_serialization_read_ref", discrim); } } /* Writing function for references to STables. */ void MVM_serialization_write_stable_ref(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMSTable *st) { MVMuint32 sc_id, idx; get_stable_ref_info(tc, writer, st, &sc_id, &idx); write_locate_sc_and_index(tc, writer, sc_id, idx); } /* Concatenates the various output segments into a single binary MVMString. */ static MVMString * concatenate_outputs(MVMThreadContext *tc, MVMSerializationWriter *writer) { char *output = NULL; char *output_b64 = NULL; MVMuint32 output_size = 0; MVMuint32 offset = 0; MVMString *result; /* Calculate total size. */ output_size += MVM_ALIGN_SECTION(HEADER_SIZE); output_size += MVM_ALIGN_SECTION(writer->root.num_dependencies * DEP_TABLE_ENTRY_SIZE); output_size += MVM_ALIGN_SECTION(writer->root.num_stables * STABLES_TABLE_ENTRY_SIZE); output_size += MVM_ALIGN_SECTION(writer->stables_data_offset); output_size += MVM_ALIGN_SECTION(writer->root.num_objects * OBJECTS_TABLE_ENTRY_SIZE); output_size += MVM_ALIGN_SECTION(writer->objects_data_offset); output_size += MVM_ALIGN_SECTION(writer->root.num_closures * CLOSURES_TABLE_ENTRY_SIZE); output_size += MVM_ALIGN_SECTION(writer->root.num_contexts * CONTEXTS_TABLE_ENTRY_SIZE); output_size += MVM_ALIGN_SECTION(writer->contexts_data_offset); output_size += MVM_ALIGN_SECTION(writer->root.num_repos * REPOS_TABLE_ENTRY_SIZE); output_size += MVM_ALIGN_SECTION(writer->param_interns_data_offset); /* Allocate a buffer that size. */ output = (char *)MVM_calloc(1, output_size); /* Write version into header. */ write_int32(output, 0, CURRENT_VERSION); offset += MVM_ALIGN_SECTION(HEADER_SIZE); /* Put dependencies table in place and set location/rows in header. */ write_int32(output, 4, offset); write_int32(output, 8, writer->root.num_dependencies); memcpy(output + offset, writer->root.dependencies_table, writer->root.num_dependencies * DEP_TABLE_ENTRY_SIZE); offset += MVM_ALIGN_SECTION(writer->root.num_dependencies * DEP_TABLE_ENTRY_SIZE); /* Put STables table in place, and set location/rows in header. */ write_int32(output, 12, offset); write_int32(output, 16, writer->root.num_stables); memcpy(output + offset, writer->root.stables_table, writer->root.num_stables * STABLES_TABLE_ENTRY_SIZE); offset += MVM_ALIGN_SECTION(writer->root.num_stables * STABLES_TABLE_ENTRY_SIZE); /* Put STables data in place. */ write_int32(output, 20, offset); memcpy(output + offset, writer->root.stables_data, writer->stables_data_offset); offset += MVM_ALIGN_SECTION(writer->stables_data_offset); /* Put objects table in place, and set location/rows in header. */ write_int32(output, 24, offset); write_int32(output, 28, writer->root.num_objects); memcpy(output + offset, writer->root.objects_table, writer->root.num_objects * OBJECTS_TABLE_ENTRY_SIZE); offset += MVM_ALIGN_SECTION(writer->root.num_objects * OBJECTS_TABLE_ENTRY_SIZE); /* Put objects data in place. */ write_int32(output, 32, offset); memcpy(output + offset, writer->root.objects_data, writer->objects_data_offset); offset += MVM_ALIGN_SECTION(writer->objects_data_offset); /* Put closures table in place, and set location/rows in header. */ write_int32(output, 36, offset); write_int32(output, 40, writer->root.num_closures); memcpy(output + offset, writer->root.closures_table, writer->root.num_closures * CLOSURES_TABLE_ENTRY_SIZE); offset += MVM_ALIGN_SECTION(writer->root.num_closures * CLOSURES_TABLE_ENTRY_SIZE); /* Put contexts table in place, and set location/rows in header. */ write_int32(output, 44, offset); write_int32(output, 48, writer->root.num_contexts); memcpy(output + offset, writer->root.contexts_table, writer->root.num_contexts * CONTEXTS_TABLE_ENTRY_SIZE); offset += MVM_ALIGN_SECTION(writer->root.num_contexts * CONTEXTS_TABLE_ENTRY_SIZE); /* Put contexts data in place. */ write_int32(output, 52, offset); memcpy(output + offset, writer->root.contexts_data, writer->contexts_data_offset); offset += MVM_ALIGN_SECTION(writer->contexts_data_offset); /* Put repossessions table in place, and set location/rows in header. */ write_int32(output, 56, offset); write_int32(output, 60, writer->root.num_repos); memcpy(output + offset, writer->root.repos_table, writer->root.num_repos * REPOS_TABLE_ENTRY_SIZE); offset += MVM_ALIGN_SECTION(writer->root.num_repos * REPOS_TABLE_ENTRY_SIZE); /* Put parameterized type intern data in place. */ write_int32(output, 64, offset); write_int32(output, 68, writer->root.num_param_interns); memcpy(output + offset, writer->root.param_interns_data, writer->param_interns_data_offset); offset += MVM_ALIGN_SECTION(writer->param_interns_data_offset); /* Sanity check. */ if (offset != output_size) MVM_exception_throw_adhoc(tc, "Serialization sanity check failed: offset != output_size"); /* If we are compiling at present, then just stash the output for later * incorporation into the bytecode file. */ if (tc->compiling_scs && MVM_repr_elems(tc, tc->compiling_scs) && MVM_repr_at_pos_o(tc, tc->compiling_scs, 0) == (MVMObject *)writer->root.sc) { if (tc->serialized) MVM_free(tc->serialized); tc->serialized = output; tc->serialized_size = output_size; tc->serialized_string_heap = writer->root.string_heap; return NULL; } /* Base 64 encode. */ output_b64 = base64_encode(output, output_size); MVM_free(output); if (output_b64 == NULL) MVM_exception_throw_adhoc(tc, "Serialization error: failed to convert to base64"); /* Make a MVMString containing it. */ result = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, output_b64); MVM_free(output_b64); return result; } /* Serializes the possibly-not-deserialized HOW. */ static void serialize_how_lazy(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMSTable *st) { if (st->HOW) { write_obj_ref(tc, writer, st->HOW); } else { MVMint32 sc_id = get_sc_id(tc, writer, st->HOW_sc); write_locate_sc_and_index(tc, writer, sc_id, st->HOW_idx); } } /* Adds an entry to the parameterized type intern section. */ static void add_param_intern(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMObject *type, MVMObject *ptype, MVMObject *params) { MVMint64 num_params, i; /* Save previous write buffer. */ char **orig_write_buffer = writer->cur_write_buffer; MVMuint32 *orig_write_offset = writer->cur_write_offset; MVMuint32 *orig_write_limit = writer->cur_write_limit; /* Switch to intern data buffer. */ writer->cur_write_buffer = &(writer->root.param_interns_data); writer->cur_write_offset = &(writer->param_interns_data_offset); writer->cur_write_limit = &(writer->param_interns_data_alloc); /* Parametric type object reference. */ write_obj_ref(tc, writer, ptype); /* Indexes in this SC of type object and STable. */ expand_storage_if_needed(tc, writer, 12); if (MVM_sc_get_obj_sc(tc, type) != writer->root.sc) MVM_exception_throw_adhoc(tc, "Serialization error: parameterized type to intern not in current SC"); write_int32(*(writer->cur_write_buffer), *(writer->cur_write_offset), MVM_sc_find_object_idx(tc, writer->root.sc, type)); *(writer->cur_write_offset) += 4; if (MVM_sc_get_stable_sc(tc, STABLE(type)) != writer->root.sc) MVM_exception_throw_adhoc(tc, "Serialization error: STable of parameterized type to intern not in current SC"); write_int32(*(writer->cur_write_buffer), *(writer->cur_write_offset), MVM_sc_find_stable_idx(tc, writer->root.sc, STABLE(type))); *(writer->cur_write_offset) += 4; /* Write parameter count and parameter object refs. */ num_params = MVM_repr_elems(tc, params); write_int32(*(writer->cur_write_buffer), *(writer->cur_write_offset), (MVMint32)num_params); *(writer->cur_write_offset) += 4; for (i = 0; i < num_params; i++) write_obj_ref(tc, writer, MVM_repr_at_pos_o(tc, params, i)); /* Increment number of parameterization interns. */ writer->root.num_param_interns++; /* Restore original output buffer. */ writer->cur_write_buffer = orig_write_buffer; writer->cur_write_offset = orig_write_offset; writer->cur_write_limit = orig_write_limit; } /* This handles the serialization of an STable, and calls off to serialize * its representation data also. */ static void serialize_stable(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMSTable *st) { MVMint64 i; MVMuint8 flags; /* Ensure there's space in the STables table; grow if not. */ MVMint32 offset = writer->root.num_stables * STABLES_TABLE_ENTRY_SIZE; if (offset + STABLES_TABLE_ENTRY_SIZE > writer->stables_table_alloc) { GROW_TABLE(writer->root.stables_table, writer->stables_table_alloc); } /* Make STables table entry. */ write_int32(writer->root.stables_table, offset, add_string_to_heap(tc, writer, tc->instance->repr_list[st->REPR->ID]->name)); write_int32(writer->root.stables_table, offset + 4, writer->stables_data_offset); /* Increment count of stables in the table. */ writer->root.num_stables++; /* Make sure we're going to write to the correct place. */ writer->cur_write_buffer = &(writer->root.stables_data); writer->cur_write_offset = &(writer->stables_data_offset); writer->cur_write_limit = &(writer->stables_data_alloc); /* Write HOW, WHAT and WHO. */ serialize_how_lazy(tc, writer, st); write_obj_ref(tc, writer, st->WHAT); MVM_serialization_write_ref(tc, writer, st->WHO); /* Method cache and v-table. */ if (!st->method_cache) MVM_serialization_finish_deserialize_method_cache(tc, st); MVM_serialization_write_ref(tc, writer, st->method_cache); /* Type check cache. */ MVM_serialization_write_int(tc, writer, st->type_check_cache_length); for (i = 0; i < st->type_check_cache_length; i++) MVM_serialization_write_ref(tc, writer, st->type_check_cache[i]); /* Mode flags. These are stored as MVMuint16, but currently only the bottom 6 bits are used. Whilst we could store these as 2 bytes, we don't actually gain any future-proofing from that, because if we start assigning meaning to currently unused bits, then we have to bump the serialisation version *anyway*. If we didn't, older readers would encounter files with the newly used bits, but ignore whatever semantics those bits were meant to convey, and hence show buggy behaviour. And if we're bumping the serialisation version, then we can increase the storage size. */ if (st->mode_flags > 255) { MVM_exception_throw_adhoc(tc, "Serialization error: mode_flags %u out of range and can't be serialized", st->mode_flags); } expand_storage_if_needed(tc, writer, 1); *(*(writer->cur_write_buffer) + *(writer->cur_write_offset)) = st->mode_flags; ++*(writer->cur_write_offset); /* Boolification spec. */ /* As this only needs 4 bits, also use the same byte to store various NULL/not-NULL flag bits. */ if (st->boolification_spec) { if (st->boolification_spec->mode >= 0xF) { MVM_exception_throw_adhoc(tc, "Serialization error: boolification spec mode %u out of range and can't be serialized", st->boolification_spec->mode); } flags = st->boolification_spec->mode; } else { flags = 0xF; } if (st->container_spec != NULL) flags |= STABLE_HAS_CONTAINER_SPEC; if (st->invocation_spec != NULL) flags |= STABLE_HAS_INVOCATION_SPEC; if (st->hll_owner != NULL) flags |= STABLE_HAS_HLL_OWNER; if (st->hll_role != MVM_HLL_ROLE_NONE) flags |= STABLE_HAS_HLL_ROLE; expand_storage_if_needed(tc, writer, 1); *(*(writer->cur_write_buffer) + *(writer->cur_write_offset)) = flags; ++*(writer->cur_write_offset); if (st->boolification_spec) { MVM_serialization_write_ref(tc, writer, st->boolification_spec->method); } /* Container spec. */ if (st->container_spec) { /* Write container spec name. */ MVM_serialization_write_str(tc, writer, MVM_string_ascii_decode_nt(tc, tc->instance->VMString, st->container_spec->name)); /* Give container spec a chance to serialize any data it wishes. */ st->container_spec->serialize(tc, st, writer); } /* Invocation spec. */ if (st->invocation_spec) { MVM_serialization_write_ref(tc, writer, st->invocation_spec->class_handle); MVM_serialization_write_str(tc, writer, st->invocation_spec->attr_name); MVM_serialization_write_int(tc, writer, st->invocation_spec->hint); MVM_serialization_write_ref(tc, writer, st->invocation_spec->invocation_handler); MVM_serialization_write_ref(tc, writer, st->invocation_spec->md_class_handle); MVM_serialization_write_str(tc, writer, st->invocation_spec->md_cache_attr_name); MVM_serialization_write_int(tc, writer, st->invocation_spec->md_cache_hint); MVM_serialization_write_str(tc, writer, st->invocation_spec->md_valid_attr_name); MVM_serialization_write_int(tc, writer, st->invocation_spec->md_valid_hint); } /* HLL owner. */ if (st->hll_owner) MVM_serialization_write_str(tc, writer, st->hll_owner->name); /* HLL role */ if (st->hll_role != MVM_HLL_ROLE_NONE) { MVM_serialization_write_int(tc, writer, st->hll_role); } /* If it's a parametric type, save parameterizer. */ if (st->mode_flags & MVM_PARAMETRIC_TYPE) MVM_serialization_write_ref(tc, writer, st->paramet.ric.parameterizer); /* If it's a parameterized type, we may also need to make an intern table * entry as well as writing out the parameter details. */ if (st->mode_flags & MVM_PARAMETERIZED_TYPE) { MVMint64 i, num_params; /* To deserve an entry in the intern table, we need that both the type * being parameterized and all of the arguments are from an SC other * than the one we're currently serializing. Otherwise, there is no * way the parameterized type in question could have been produced by * another compilation unit. We keep a counter of things, which should * add up to parameters + 1 if we need the intern entry. */ MVMuint32 internability = 0; /* Write a reference to the type being parameterized, and increment the * internability if it's from a different SC (easier to check that after, * as writing the ref will be sure to mark it as being in this one if it * has no SC yet). */ MVMObject *ptype = st->paramet.erized.parametric_type; MVMObject *params = st->paramet.erized.parameters; MVM_serialization_write_ref(tc, writer, ptype); if (MVM_sc_get_obj_sc(tc, ptype) != writer->root.sc) internability++; /* Write the parameters. We write them like an array, but an element at a * time so we can check if an intern table entry is needed. */ num_params = MVM_repr_elems(tc, params); /* This typically seems to have values between 1 and 3: */ MVM_serialization_write_int(tc, writer, num_params); for (i = 0; i < num_params; i++) { /* Save where we were before writing this parameter. */ size_t pre_write_mark = *(writer->cur_write_offset); /* Write parameter. */ MVMObject *parameter = MVM_repr_at_pos_o(tc, params, i); MVM_serialization_write_ref(tc, writer, parameter); /* If what we write was an object reference and it's from another * SC, add to the internability count. */ if (*(*(writer->cur_write_buffer) + pre_write_mark) == REFVAR_OBJECT) if (MVM_sc_get_obj_sc(tc, parameter) != writer->root.sc) internability++; } /* Make intern table entry if needed. */ if (internability == num_params + 1) add_param_intern(tc, writer, st->WHAT, ptype, params); } MVM_serialization_write_cstr(tc, writer, MVM_6model_get_stable_debug_name(tc, st)); /* Store offset we save REPR data at. */ write_int32(writer->root.stables_table, offset + 8, writer->stables_data_offset); /* If the REPR has a function to serialize representation data, call it. */ if (st->REPR->serialize_repr_data) st->REPR->serialize_repr_data(tc, st, writer); } /* This handles the serialization of an object, which largely involves a * delegation to its representation. */ static void serialize_object(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMObject *obj) { MVMint32 offset; /* Get index of SC that holds the STable and its index. */ MVMuint32 sc; MVMuint32 sc_idx; MVMuint32 packed; get_stable_ref_info(tc, writer, STABLE(obj), &sc, &sc_idx); /* Ensure there's space in the objects table; grow if not. */ offset = writer->root.num_objects * OBJECTS_TABLE_ENTRY_SIZE; if (offset + OBJECTS_TABLE_ENTRY_SIZE > writer->objects_table_alloc) { GROW_TABLE(writer->root.objects_table, writer->objects_table_alloc); } /* Increment count of objects in the table. */ writer->root.num_objects++; /* Make sure we're going to write repr data to the correct place. */ writer->cur_write_buffer = &(writer->root.objects_data); writer->cur_write_offset = &(writer->objects_data_offset); writer->cur_write_limit = &(writer->objects_data_alloc); packed = IS_CONCRETE(obj) ? OBJECTS_TABLE_ENTRY_IS_CONCRETE : 0; if (sc <= OBJECTS_TABLE_ENTRY_SC_MAX && sc_idx <= OBJECTS_TABLE_ENTRY_SC_IDX_MAX) { packed |= (sc << OBJECTS_TABLE_ENTRY_SC_SHIFT) | sc_idx; } else { packed |= OBJECTS_TABLE_ENTRY_SC_OVERFLOW << OBJECTS_TABLE_ENTRY_SC_SHIFT; expand_storage_if_needed(tc, writer, 8); write_int32(*(writer->cur_write_buffer), *(writer->cur_write_offset), sc); *(writer->cur_write_offset) += 4; write_int32(*(writer->cur_write_buffer), *(writer->cur_write_offset), sc_idx); *(writer->cur_write_offset) += 4; } /* Make objects table entry. */ write_int32(writer->root.objects_table, offset + 0, packed); write_int32(writer->root.objects_table, offset + 4, writer->objects_data_offset); /* Delegate to its serialization REPR function. */ if (IS_CONCRETE(obj)) { if (REPR(obj)->serialize) REPR(obj)->serialize(tc, STABLE(obj), OBJECT_BODY(obj), writer); else MVM_exception_throw_adhoc(tc, "Missing serialize REPR function for REPR %s (%s)", REPR(obj)->name, MVM_6model_get_debug_name(tc, obj)); } } /* This handles the serialization of a context, which means serializing * the stuff in its lexpad. */ static void serialize_context(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMFrame *frame) { MVMint32 i, offset, static_sc_id, static_idx; /* Grab lexpad, which we'll serialize later on. */ MVMStaticFrame *sf = frame->static_info; MVMLexicalRegistry **lexnames = sf->body.lexical_names_list; /* Locate the static code ref this context points to. */ MVMObject *static_code_ref = closure_to_static_code_ref(tc, frame->code_ref, 1); MVMSerializationContext *static_code_sc = MVM_sc_get_obj_sc(tc, static_code_ref); if (OBJ_IS_NULL(static_code_sc)) MVM_exception_throw_adhoc(tc, "Serialization Error: closure outer is a code object not in an SC"); static_sc_id = get_sc_id(tc, writer, static_code_sc); static_idx = (MVMint32)MVM_sc_find_code_idx(tc, static_code_sc, static_code_ref); /* Ensure there's space in the STables table; grow if not. */ offset = writer->root.num_contexts * CONTEXTS_TABLE_ENTRY_SIZE; if (offset + CONTEXTS_TABLE_ENTRY_SIZE > writer->contexts_table_alloc) { GROW_TABLE(writer->root.contexts_table, writer->contexts_table_alloc); } /* Make contexts table entry. */ write_int32(writer->root.contexts_table, offset, static_sc_id); write_int32(writer->root.contexts_table, offset + 4, static_idx); write_int32(writer->root.contexts_table, offset + 8, writer->contexts_data_offset); /* See if there's any relevant outer context, and if so set it up to * be serialized. */ if (frame->outer) write_int32(writer->root.contexts_table, offset + 12, get_serialized_context_idx(tc, writer, frame->outer, NULL)); else write_int32(writer->root.contexts_table, offset + 12, 0); /* Increment count of stables in the table. */ writer->root.num_contexts++; /* Set up writer. */ writer->cur_write_buffer = &(writer->root.contexts_data); writer->cur_write_offset = &(writer->contexts_data_offset); writer->cur_write_limit = &(writer->contexts_data_alloc); /* Serialize lexicals. */ MVM_serialization_write_int(tc, writer, sf->body.num_lexicals); for (i = 0; i < sf->body.num_lexicals; i++) { MVM_serialization_write_str(tc, writer, lexnames[i]->key); switch (sf->body.lexical_types[i]) { case MVM_reg_int8: case MVM_reg_int16: case MVM_reg_int32: MVM_exception_throw_adhoc(tc, "unsupported lexical type %s", MVM_reg_get_debug_name(tc, sf->body.lexical_types[i])); break; case MVM_reg_int64: MVM_serialization_write_int(tc, writer, frame->env[i].i64); break; case MVM_reg_num32: MVM_exception_throw_adhoc(tc, "unsupported lexical type %s", MVM_reg_get_debug_name(tc, sf->body.lexical_types[i])); break; case MVM_reg_num64: MVM_serialization_write_num(tc, writer, frame->env[i].n64); break; case MVM_reg_str: MVM_serialization_write_str(tc, writer, frame->env[i].s); break; case MVM_reg_obj: MVM_serialization_write_ref(tc, writer, frame->env[i].o); break; default: MVM_exception_throw_adhoc(tc, "unsupported lexical type %s", MVM_reg_get_debug_name(tc, sf->body.lexical_types[i])); break; } } } /* Goes through the list of repossessions and serializes them all. */ static void serialize_repossessions(MVMThreadContext *tc, MVMSerializationWriter *writer) { MVMint64 i; /* Obtain list of repossession object indexes and original SCs. */ MVMObject *rep_indexes = writer->root.sc->body->rep_indexes; MVMObject *rep_scs = writer->root.sc->body->rep_scs; /* Allocate table space, provided we've actually something to do. */ writer->root.num_repos = MVM_repr_elems(tc, rep_indexes); if (writer->root.num_repos == 0) return; writer->root.repos_table = (char *)MVM_malloc(writer->root.num_repos * REPOS_TABLE_ENTRY_SIZE); /* Make entries. */ for (i = 0; i < writer->root.num_repos; i++) { MVMint32 offset = (MVMint32)(i * REPOS_TABLE_ENTRY_SIZE); MVMint32 obj_idx = (MVMint32)(MVM_repr_at_pos_i(tc, rep_indexes, i) >> 1); MVMint32 is_st = MVM_repr_at_pos_i(tc, rep_indexes, i) & 1; MVMSerializationContext *orig_sc = (MVMSerializationContext *)MVM_repr_at_pos_o(tc, rep_scs, i); /* Work out original object's SC location. */ MVMint32 orig_sc_id = get_sc_id(tc, writer, orig_sc); MVMint32 orig_idx = (MVMint32)(is_st ? MVM_sc_find_stable_idx(tc, orig_sc, writer->root.sc->body->root_stables[obj_idx]) : MVM_sc_find_object_idx(tc, orig_sc, writer->root.sc->body->root_objects[obj_idx])); /* Write table row. */ write_int32(writer->root.repos_table, offset, is_st); write_int32(writer->root.repos_table, offset + 4, obj_idx); write_int32(writer->root.repos_table, offset + 8, orig_sc_id); write_int32(writer->root.repos_table, offset + 12, orig_idx); } } static void serialize(MVMThreadContext *tc, MVMSerializationWriter *writer) { MVMuint32 work_todo; do { /* Current work list sizes. */ MVMuint64 stables_todo = writer->root.sc->body->num_stables; MVMuint64 objects_todo = writer->root.sc->body->num_objects; MVMuint64 contexts_todo = writer->num_contexts; /* Reset todo flag - if we do some work we'll go round again as it * may have generated more. */ work_todo = 0; /* Serialize any STables on the todo list. */ while (writer->stables_list_pos < stables_todo) { serialize_stable(tc, writer, writer->root.sc->body->root_stables[writer->stables_list_pos]); writer->stables_list_pos++; work_todo = 1; } /* Serialize any objects on the todo list. */ while (writer->objects_list_pos < objects_todo) { serialize_object(tc, writer, writer->root.sc->body->root_objects[writer->objects_list_pos]); writer->objects_list_pos++; work_todo = 1; } /* Serialize any contexts on the todo list. */ while (writer->contexts_list_pos < contexts_todo) { serialize_context(tc, writer, writer->contexts_list[writer->contexts_list_pos]); writer->contexts_list_pos++; work_todo = 1; } } while (work_todo); /* Finally, serialize repossessions table (this can't make any more * work, so is done as a separate step here at the end). */ serialize_repossessions(tc, writer); } MVMString * MVM_serialization_serialize(MVMThreadContext *tc, MVMSerializationContext *sc, MVMObject *empty_string_heap) { MVMSerializationWriter *writer; MVMString *result = NULL; MVMint32 sc_elems = (MVMint32)sc->body->num_objects; /* We don't sufficiently root things in here for the GC, so enforce gen2 * allocation. */ MVM_gc_allocate_gen2_default_set(tc); /* Set up writer with some initial settings. */ writer = MVM_calloc(1, sizeof(MVMSerializationWriter)); writer->root.version = CURRENT_VERSION; writer->root.sc = sc; writer->codes_list = sc->body->root_codes; writer->root.string_heap = empty_string_heap; writer->root.dependent_scs = MVM_calloc(1, sizeof(MVMSerializationContext *)); writer->seen_strings = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTHash); /* Allocate initial memory space for storing serialized tables and data. */ writer->dependencies_table_alloc = DEP_TABLE_ENTRY_SIZE * 4; writer->root.dependencies_table = (char *)MVM_calloc(1, writer->dependencies_table_alloc); writer->stables_table_alloc = STABLES_TABLE_ENTRY_SIZE * STABLES_TABLE_ENTRIES_GUESS; writer->root.stables_table = (char *)MVM_calloc(1, writer->stables_table_alloc); writer->objects_table_alloc = OBJECTS_TABLE_ENTRY_SIZE * MAX(sc_elems, 1); writer->root.objects_table = (char *)MVM_calloc(1, writer->objects_table_alloc); writer->stables_data_alloc = DEFAULT_STABLE_DATA_SIZE; writer->root.stables_data = (char *)MVM_calloc(1, writer->stables_data_alloc); writer->objects_data_alloc = OBJECT_SIZE_GUESS * MAX(sc_elems, 1); writer->root.objects_data = (char *)MVM_calloc(1, writer->objects_data_alloc); writer->closures_table_alloc = CLOSURES_TABLE_ENTRY_SIZE * CLOSURES_TABLE_ENTRIES_GUESS; writer->root.closures_table = (char *)MVM_calloc(1, writer->closures_table_alloc); writer->contexts_table_alloc = CONTEXTS_TABLE_ENTRY_SIZE * CONTEXTS_TABLE_ENTRIES_GUESS; writer->root.contexts_table = (char *)MVM_calloc(1, writer->contexts_table_alloc); writer->contexts_data_alloc = DEFAULT_CONTEXTS_DATA_SIZE; writer->root.contexts_data = (char *)MVM_calloc(1, writer->contexts_data_alloc); writer->param_interns_data_alloc = DEFAULT_PARAM_INTERNS_DATA_SIZE; writer->root.param_interns_data = (char *)MVM_calloc(1, writer->param_interns_data_alloc); /* Initialize MVMString heap so first entry is the NULL MVMString. */ MVM_repr_push_s(tc, empty_string_heap, NULL); /* Start serializing. */ serialize(tc, writer); /* Build a single result out of the serialized data; note if we're in the * compiler pipeline this will return null and stash the output to write * to a bytecode file later. */ result = concatenate_outputs(tc, writer); /* Clear up afterwards. */ MVM_free(writer->contexts_list); MVM_free(writer->root.dependent_scs); MVM_free(writer->root.dependencies_table); MVM_free(writer->root.stables_table); MVM_free(writer->root.stables_data); MVM_free(writer->root.objects_table); MVM_free(writer->root.objects_data); MVM_free(writer->root.closures_table); MVM_free(writer->root.contexts_table); MVM_free(writer->root.contexts_data); MVM_free(writer->root.param_interns_data); MVM_free(writer->root.repos_table); MVM_free(writer); /* Exit gen2 allocation. */ MVM_gc_allocate_gen2_default_clear(tc); return result; } /* *************************************************************************** * Deserialization (reading related) * ***************************************************************************/ /* Reads an int64 from a buffer. */ static MVMint64 read_int64(const char *buffer, size_t offset) { MVMint64 value; memcpy(&value, buffer + offset, 8); #ifdef MVM_BIGENDIAN switch_endian(&value, 8); #endif return value; } /* Reads an int32 from a buffer. */ static MVMint32 read_int32(const char *buffer, size_t offset) { MVMint32 value; memcpy(&value, buffer + offset, 4); #ifdef MVM_BIGENDIAN switch_endian(&value, 4); #endif return value; } static MVMuint16 read_uint16(const char *buffer, size_t offset) { MVMuint16 value; memcpy(&value, buffer + offset, 2); #ifdef MVM_BIGENDIAN switch_endian(&value, 2); #endif return value; } /* Reads double from a buffer. */ static MVMnum64 read_double(const char *buffer, size_t offset) { MVMnum64 value; memcpy(&value, buffer + offset, 8); #ifdef MVM_BIGENDIAN switch_endian(&value, 8); #endif return value; } /* If deserialization should fail, cleans up before throwing an exception. */ MVM_NO_RETURN static void fail_deserialize(MVMThreadContext *tc, MVMSerializationReader *reader, const char *messageFormat, ...) MVM_NO_RETURN_GCC MVM_FORMAT(printf, 3, 4); MVM_NO_RETURN static void fail_deserialize(MVMThreadContext *tc, MVMSerializationReader *reader, const char *messageFormat, ...) { va_list args; if (reader->data_needs_free && reader->data) MVM_free(reader->data); if (reader->contexts) MVM_free(reader->contexts); if (reader->root.sc) reader->root.sc->body->sr = NULL; MVM_free(reader); MVM_gc_allocate_gen2_default_clear(tc); va_start(args, messageFormat); MVM_exception_throw_adhoc_va(tc, messageFormat, args); va_end(args); } /* Reads the item from the string heap at the specified index. */ static MVMString * read_string_from_heap(MVMThreadContext *tc, MVMSerializationReader *reader, MVMuint32 idx) { if (reader->root.string_heap) { if (idx < MVM_repr_elems(tc, reader->root.string_heap)) return MVM_repr_at_pos_s(tc, reader->root.string_heap, idx); else fail_deserialize(tc, reader, "Attempt to read past end of string heap (index %d)", idx); } else { MVMCompUnit *cu = reader->root.string_comp_unit; if (idx == 0) return NULL; idx--; if (idx < cu->body.num_strings) return MVM_cu_string(tc, cu, idx); else fail_deserialize(tc, reader, "Attempt to read past end of compilation unit string heap (index %d)", idx); } } /* Locates a serialization context; 0 is the current one, otherwise see the * dependencies table. */ static MVMSerializationContext * locate_sc(MVMThreadContext *tc, MVMSerializationReader *reader, MVMint32 sc_id) { MVMSerializationContext *sc; if (sc_id == 0) sc = reader->root.sc; else if (sc_id > 0 && sc_id - 1 < reader->root.num_dependencies) sc = reader->root.dependent_scs[sc_id - 1]; else fail_deserialize(tc, reader, "Invalid dependencies table index encountered (index %d)", sc_id); return sc; } /* Ensure that we aren't going to read off the end of the buffer. */ MVM_STATIC_INLINE void assert_can_read(MVMThreadContext *tc, MVMSerializationReader *reader, MVMint32 amount) { char *read_end = *(reader->cur_read_buffer) + *(reader->cur_read_offset) + amount; if (read_end > *(reader->cur_read_end)) fail_deserialize(tc, reader, "Read past end of serialization data buffer"); } /* Reading function for native integers. */ MVMint64 MVM_serialization_read_int64(MVMThreadContext *tc, MVMSerializationReader *reader) { MVMint64 result; assert_can_read(tc, reader, 8); result = read_int64(*(reader->cur_read_buffer), *(reader->cur_read_offset)); *(reader->cur_read_offset) += 8; return result; } /* Reading function for variable-sized integers, using between 1 and 9 bytes of * storage for an int64. * * The format chosen may not be quite the most space efficient for the values * that we store, but the intent it is that close to smallest whilst very * efficient to read. In particular, it doesn't require any looping, and * has at most two length overrun checks. */ MVMint64 MVM_serialization_read_int(MVMThreadContext *tc, MVMSerializationReader *reader) { MVMint64 result; const MVMuint8 *read_at = (MVMuint8 *) *(reader->cur_read_buffer) + *(reader->cur_read_offset); MVMuint8 *const read_end = (MVMuint8 *) *(reader->cur_read_end); MVMuint8 first; MVMuint8 need; if (read_at >= read_end) fail_deserialize(tc, reader, "Read past end of serialization data buffer"); first = *read_at++; /* Top bit set means remaining 7 bits are a value between -1 and 126. (That turns out to be the most common 7 bit range that we serialize.) */ if (first & 0x80) { *(reader->cur_read_offset) += 1; /* Value we have is 128 to 255. Map it back to the range we need: */ return (MVMint64) first - 129; } /* Otherwise next 3 bits indicate how many more bytes follow. */ need = first >> 4; if (!need) { /* Have to read all 8 bytes. Ignore the bottom nybble. In future, we may want to use it to also store 15 possible "common" values. Not clear if that whould be best as a fixed table, a single table sent as part of the serialization blob, or multiple tables for different contexts (int32, int64, nativeint, others?) */ if (read_at + 8 > read_end) fail_deserialize(tc, reader, "Read past end of serialization data buffer"); memcpy(&result, read_at, 8); #ifdef MVM_BIGENDIAN switch_endian(&result, 8); #endif *(reader->cur_read_offset) += 9; return result; } if (read_at + need > read_end) fail_deserialize(tc, reader, "Read past end of serialization data buffer"); /* The bottom nybble of the first byte is the highest byte of the final value with any bits set. Right now the top nybble is garbage, but it gets flushed away with the sign extension shifting later. */ result = (MVMint64)first << 8 * need; /* The remaining 1 to 7 lower bytes follow next in the serialization stream. */ #ifdef MVM_BIGENDIAN { MVMuint8 *write_to = (MVMuint8 *)&result + 8 - need; memcpy(write_to, read_at, need); switch_endian(write_to, need); } #else memcpy(&result, read_at, need); #endif /* Having pieced the (unsigned) value back together, sign extend it: */ result = result << (64 - 4 - 8 * need); result = result >> (64 - 4 - 8 * need); *(reader->cur_read_offset) += need + 1; return result; } /* Reading function for native numbers. */ MVMnum64 MVM_serialization_read_num(MVMThreadContext *tc, MVMSerializationReader *reader) { MVMnum64 result; assert_can_read(tc, reader, 8); result = read_double(*(reader->cur_read_buffer), *(reader->cur_read_offset)); *(reader->cur_read_offset) += 8; return result; } /* Reading function for native strings. * * BEWARE - logic in this function is partly duplicated in the skip calculations * of deserialize_method_cache_lazy(). See the note before * MVM_serialization_read_ref(). */ MVMString * MVM_serialization_read_str(MVMThreadContext *tc, MVMSerializationReader *reader) { MVMint32 offset; assert_can_read(tc, reader, 2); offset = read_uint16(*(reader->cur_read_buffer), *(reader->cur_read_offset)); *(reader->cur_read_offset) += 2; if (offset & STRING_HEAP_LOC_PACKED_OVERFLOW) { assert_can_read(tc, reader, 2); offset ^= STRING_HEAP_LOC_PACKED_OVERFLOW; offset <<= STRING_HEAP_LOC_PACKED_SHIFT; offset |= read_uint16(*(reader->cur_read_buffer), *(reader->cur_read_offset)); *(reader->cur_read_offset) += 2; } return read_string_from_heap(tc, reader, offset); } /* Reading function for null-terminated char array strings */ char *MVM_serialization_read_cstr(MVMThreadContext *tc, MVMSerializationReader *reader) { MVMint64 len = MVM_serialization_read_int(tc, reader); char *strbuf = 0; if (len > 0) { const MVMuint8 *read_at = (MVMuint8 *) *(reader->cur_read_buffer) + *(reader->cur_read_offset); assert_can_read(tc, reader, len); strbuf = MVM_malloc(len + 1); if (strbuf == 0) fail_deserialize(tc, reader, "Cannot read a c string: malloc failed."); memcpy(strbuf, read_at, len); strbuf[len] = 0; *(reader->cur_read_offset) += len; } else if (len < 0) { fail_deserialize(tc, reader, "Cannot read a c string with negative length %"PRIi64".", len); } return strbuf; } /* The SC id,idx pair is used in various ways, but common to them all is to look up the SC, then use the index to call some other function. Putting the common parts into one function permits the serialized representation to be changed, but frustratingly it requires two return values, which is a bit of a pain in (real) C. Hence this rather ungainly function. BEWARE - logic in this function is partly duplicated in the skip calculations of deserialize_method_cache_lazy(). See the note before MVM_serialization_read_ref(). */ MVM_STATIC_INLINE MVMSerializationContext * read_locate_sc_and_index(MVMThreadContext *tc, MVMSerializationReader *reader, MVMint32 *idx) { MVMint32 sc_id; MVMuint32 packed; if (reader->root.version >= 19) { packed = MVM_serialization_read_int(tc, reader); } else { assert_can_read(tc, reader, 4); packed = read_int32(*(reader->cur_read_buffer), *(reader->cur_read_offset)); *(reader->cur_read_offset) += 4; } sc_id = packed >> PACKED_SC_SHIFT; if (sc_id != PACKED_SC_OVERFLOW) { *idx = packed & PACKED_SC_IDX_MASK; } else { if (reader->root.version >= 19) { sc_id = MVM_serialization_read_int(tc, reader); *idx = MVM_serialization_read_int(tc, reader); } else { assert_can_read(tc, reader, 8); sc_id = read_int32(*(reader->cur_read_buffer), *(reader->cur_read_offset)); *(reader->cur_read_offset) += 4; *idx = read_int32(*(reader->cur_read_buffer), *(reader->cur_read_offset)); *(reader->cur_read_offset) += 4; } } return locate_sc(tc, reader, sc_id); } /* Reads in and resolves an object references. * * BEWARE - logic in this function is partly duplicated in the skip calculations * of deserialize_method_cache_lazy(). See the note before * MVM_serialization_read_ref(). */ static MVMObject * read_obj_ref(MVMThreadContext *tc, MVMSerializationReader *reader) { MVMint32 idx; MVMSerializationContext *sc = read_locate_sc_and_index(tc, reader, &idx); /* sequence point... */ return MVM_sc_get_object(tc, sc, idx); } /* Reads in an array of variant references. */ static MVMObject * read_array_var(MVMThreadContext *tc, MVMSerializationReader *reader) { MVMObject *result = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMint32 elems, i; /* Read the element count. */ elems = MVM_serialization_read_int(tc, reader); /* Read in the elements. */ for (i = 0; i < elems; i++) MVM_repr_bind_pos_o(tc, result, i, MVM_serialization_read_ref(tc, reader)); /* Set the SC. */ MVM_sc_set_obj_sc(tc, result, reader->root.sc); return result; } /* Reads in an hash with string keys and variant references. * * BEWARE - logic in this function is partly duplicated in the skip calculations * of deserialize_method_cache_lazy(). See the note before * MVM_serialization_read_ref(). */ static MVMObject * read_hash_str_var(MVMThreadContext *tc, MVMSerializationReader *reader) { MVMObject *result = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTHash); MVMint32 elems, i; /* Read the element count. */ if (reader->root.version >= 19) { elems = MVM_serialization_read_int(tc, reader); } else { assert_can_read(tc, reader, 4); elems = read_int32(*(reader->cur_read_buffer), *(reader->cur_read_offset)); *(reader->cur_read_offset) += 4; } /* Read in the elements. */ for (i = 0; i < elems; i++) { MVMString *key = MVM_serialization_read_str(tc, reader); MVM_repr_bind_key_o(tc, result, key, MVM_serialization_read_ref(tc, reader)); } /* Set the SC. */ MVM_sc_set_obj_sc(tc, result, reader->root.sc); return result; } /* Reads in an array of integers. */ static MVMObject * read_array_int(MVMThreadContext *tc, MVMSerializationReader *reader) { MVMObject *result = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTIntArray); MVMint64 elems, i; /* Read the element count. */ elems = MVM_serialization_read_int(tc, reader); /* Read in the elements. */ for (i = 0; i < elems; i++) MVM_repr_bind_pos_i(tc, result, i, MVM_serialization_read_int(tc, reader)); return result; } /* Reads in an array of strings. */ static MVMObject * read_array_str(MVMThreadContext *tc, MVMSerializationReader *reader) { MVMObject *result = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTStrArray); MVMint32 elems, i; /* Read the element count. */ if (reader->root.version >= 19) { elems = MVM_serialization_read_int(tc, reader); } else { assert_can_read(tc, reader, 4); elems = read_int32(*(reader->cur_read_buffer), *(reader->cur_read_offset)); *(reader->cur_read_offset) += 4; } /* Read in the elements. */ for (i = 0; i < elems; i++) MVM_repr_bind_pos_s(tc, result, i, MVM_serialization_read_str(tc, reader)); return result; } /* Reads in a code reference. * * BEWARE - logic in this function is partly duplicated in the skip calculations * of deserialize_method_cache_lazy(). See the note before * MVM_serialization_read_ref(). */ static MVMObject * read_code_ref(MVMThreadContext *tc, MVMSerializationReader *reader) { MVMint32 idx; MVMSerializationContext *sc = read_locate_sc_and_index(tc, reader, &idx); return MVM_sc_get_code(tc, sc, idx); } /* Read the reference type discriminator from the buffer. */ MVM_STATIC_INLINE MVMuint8 read_discrim(MVMThreadContext *tc, MVMSerializationReader *reader) { assert_can_read(tc, reader, 1); return *(*(reader->cur_read_buffer) + *(reader->cur_read_offset)); } /* Reading function for references. * * BEWARE - logic in this function is partly duplicated in * deserialize_method_cache_lazy(). If you change the format (or sizes) of * things read here (including of course, things read down the calltree) you may * need to update the corresponding skip count logic in * deserialize_method_cache_lazy(). */ MVMObject * MVM_serialization_read_ref(MVMThreadContext *tc, MVMSerializationReader *reader) { MVMObject *result; /* Read the discriminator. */ const int discrim_size = 1; const MVMuint8 discrim = read_discrim(tc, reader); *(reader->cur_read_offset) += discrim_size; /* Decide what to do based on it. */ switch (discrim) { case REFVAR_NULL: return NULL; case REFVAR_OBJECT: return read_obj_ref(tc, reader); case REFVAR_VM_NULL: return tc->instance->VMNull; case REFVAR_VM_INT: { MVMint64 value; value = MVM_serialization_read_int(tc, reader); result = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, value); return result; } case REFVAR_VM_NUM: result = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTNum); MVM_repr_set_num(tc, result, MVM_serialization_read_num(tc, reader)); return result; case REFVAR_VM_STR: result = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTStr); MVM_repr_set_str(tc, result, MVM_serialization_read_str(tc, reader)); return result; case REFVAR_VM_ARR_VAR: result = read_array_var(tc, reader); if (reader->current_object) { MVM_repr_push_o(tc, reader->root.sc->body->owned_objects, result); MVM_repr_push_o(tc, reader->root.sc->body->owned_objects, reader->current_object); } return result; case REFVAR_VM_ARR_STR: return read_array_str(tc, reader); case REFVAR_VM_ARR_INT: return read_array_int(tc, reader); case REFVAR_VM_HASH_STR_VAR: result = read_hash_str_var(tc, reader); if (reader->current_object) { MVM_repr_push_o(tc, reader->root.sc->body->owned_objects, result); MVM_repr_push_o(tc, reader->root.sc->body->owned_objects, reader->current_object); } return result; case REFVAR_STATIC_CODEREF: case REFVAR_CLONED_CODEREF: return read_code_ref(tc, reader); case REFVAR_SC_REF: return (MVMObject *)MVM_sc_find_by_handle(tc, MVM_serialization_read_str(tc, reader)); default: fail_deserialize(tc, reader, "Serialization Error: Unimplemented case of read_ref"); } } /* Reading function for STable references. */ MVMSTable * MVM_serialization_read_stable_ref(MVMThreadContext *tc, MVMSerializationReader *reader) { MVMint32 idx; MVMSerializationContext *sc = read_locate_sc_and_index(tc, reader, &idx); return MVM_sc_get_stable(tc, sc, idx); } /* Checks the header looks sane and all of the places it points to make sense. * Also dissects the input string into the tables and data segments and populates * the reader data structure more fully. */ static void check_and_dissect_input(MVMThreadContext *tc, MVMSerializationReader *reader, MVMString *data_str) { size_t data_len; size_t header_size; char *data; char *prov_pos; char *data_end; if (data_str) { /* Grab data from string. */ char *data_b64 = (char *)MVM_string_ascii_encode(tc, data_str, NULL, 0); data = (char *)base64_decode(data_b64, &data_len); MVM_free(data_b64); reader->data_needs_free = 1; } else { /* Try to get it from the current compilation unit. */ data = (char *)(*tc->interp_cu)->body.serialized; if (!data) fail_deserialize(tc, reader, "Failed to find deserialization data in compilation unit"); data_len = (*tc->interp_cu)->body.serialized_size; } prov_pos = data; data_end = data + data_len; /* Ensure we got the data. */ if (data == NULL) fail_deserialize(tc, reader, "Failed to decode base64-encoded serialization data"); reader->data = data; /* Ensure that we have enough space to read a version number and check it. */ if (data_len < 4) fail_deserialize(tc, reader, "Serialized data too short to read a version number (< 4 bytes)"); reader->root.version = read_int32(data, 0); if (reader->root.version < MIN_VERSION || reader->root.version > CURRENT_VERSION) fail_deserialize(tc, reader, "Unsupported serialization format version %d (current version is %d)", reader->root.version, CURRENT_VERSION); /* Pick header size by version. */ /* See blame history for the next line if you change the header size: */ header_size = HEADER_SIZE; /* Ensure that the data is at least as long as the header is expected to be. */ if (data_len < header_size) fail_deserialize(tc, reader, "Serialized data shorter than header (< %"MVM_PRSz" bytes)", header_size); prov_pos += header_size; /* Get size and location of dependencies table. */ reader->root.dependencies_table = data + read_int32(data, 4); reader->root.num_dependencies = read_int32(data, 8); if (reader->root.dependencies_table < prov_pos) fail_deserialize(tc, reader, "Corruption detected (dependencies table starts before header ends)"); prov_pos = reader->root.dependencies_table + reader->root.num_dependencies * DEP_TABLE_ENTRY_SIZE; if (prov_pos > data_end) fail_deserialize(tc, reader, "Corruption detected (dependencies table overruns end of data)"); /* Get size and location of STables table. */ reader->root.stables_table = data + read_int32(data, 12); reader->root.num_stables = read_int32(data, 16); if (reader->root.stables_table < prov_pos) fail_deserialize(tc, reader, "Corruption detected (STables table starts before dependencies table ends)"); prov_pos = reader->root.stables_table + reader->root.num_stables * STABLES_TABLE_ENTRY_SIZE; if (prov_pos > data_end) fail_deserialize(tc, reader, "Corruption detected (STables table overruns end of data)"); /* Get location of STables data. */ reader->root.stables_data = data + read_int32(data, 20); if (reader->root.stables_data < prov_pos) fail_deserialize(tc, reader, "Corruption detected (STables data starts before STables table ends)"); prov_pos = reader->root.stables_data; if (prov_pos > data_end) fail_deserialize(tc, reader, "Corruption detected (STables data starts after end of data)"); /* Get size and location of objects table. */ reader->root.objects_table = data + read_int32(data, 24); reader->root.num_objects = read_int32(data, 28); if (reader->root.objects_table < prov_pos) fail_deserialize(tc, reader, "Corruption detected (objects table starts before STables data ends)"); prov_pos = reader->root.objects_table + reader->root.num_objects * OBJECTS_TABLE_ENTRY_SIZE; if (prov_pos > data_end) fail_deserialize(tc, reader, "Corruption detected (objects table overruns end of data)"); /* Get location of objects data. */ reader->root.objects_data = data + read_int32(data, 32); if (reader->root.objects_data < prov_pos) fail_deserialize(tc, reader, "Corruption detected (objects data starts before objects table ends)"); prov_pos = reader->root.objects_data; if (prov_pos > data_end) fail_deserialize(tc, reader, "Corruption detected (objects data starts after end of data)"); /* Get size and location of closures table. */ reader->root.closures_table = data + read_int32(data, 36); reader->root.num_closures = read_int32(data, 40); if (reader->root.closures_table < prov_pos) fail_deserialize(tc, reader, "Corruption detected (Closures table starts before objects data ends)"); prov_pos = reader->root.closures_table + reader->root.num_closures * CLOSURES_TABLE_ENTRY_SIZE; if (prov_pos > data_end) fail_deserialize(tc, reader, "Corruption detected (Closures table overruns end of data)"); /* Get size and location of contexts table. */ reader->root.contexts_table = data + read_int32(data, 44); reader->root.num_contexts = read_int32(data, 48); if (reader->root.contexts_table < prov_pos) fail_deserialize(tc, reader, "Corruption detected (contexts table starts before closures table ends)"); prov_pos = reader->root.contexts_table + reader->root.num_contexts * CONTEXTS_TABLE_ENTRY_SIZE; if (prov_pos > data_end) fail_deserialize(tc, reader, "Corruption detected (contexts table overruns end of data)"); /* Get location of contexts data. */ reader->root.contexts_data = data + read_int32(data, 52); if (reader->root.contexts_data < prov_pos) fail_deserialize(tc, reader, "Corruption detected (contexts data starts before contexts table ends)"); prov_pos = reader->root.contexts_data; if (prov_pos > data_end) fail_deserialize(tc, reader, "Corruption detected (contexts data starts after end of data)"); /* Get size and location of repossessions table. */ reader->root.repos_table = data + read_int32(data, 56); reader->root.num_repos = read_int32(data, 60); if (reader->root.repos_table < prov_pos) fail_deserialize(tc, reader, "Corruption detected (repossessions table starts before contexts data ends)"); prov_pos = reader->root.repos_table + reader->root.num_repos * REPOS_TABLE_ENTRY_SIZE; if (prov_pos > data_end) fail_deserialize(tc, reader, "Corruption detected (repossessions table overruns end of data)"); /* Get location and number of entries in the interns data section. */ reader->root.param_interns_data = data + read_int32(data, 64); reader->root.num_param_interns = read_int32(data, 68); if (reader->root.param_interns_data < prov_pos) fail_deserialize(tc, reader, "Corruption detected (parameterization interns data starts before repossessions table ends)"); prov_pos = reader->root.param_interns_data; if (prov_pos > data_end) fail_deserialize(tc, reader, "Corruption detected (parameterization interns data overruns end of data)"); /* Set reading limits for data chunks. */ reader->stables_data_end = reader->root.objects_table; reader->objects_data_end = reader->root.closures_table; reader->contexts_data_end = reader->root.repos_table; reader->param_interns_data_end = data_end; } /* Goes through the dependencies table and resolves the dependencies that it * contains to SerializationContexts. */ static void resolve_dependencies(MVMThreadContext *tc, MVMSerializationReader *reader) { char *table_pos = reader->root.dependencies_table; MVMuint32 num_deps = reader->root.num_dependencies; MVMuint32 i; reader->root.dependent_scs = MVM_malloc(MAX(num_deps, 1) * sizeof(MVMSerializationContext *)); for (i = 0; i < num_deps; i++) { MVMString *handle = read_string_from_heap(tc, reader, read_int32(table_pos, 0)); MVMSerializationContext *sc; sc = MVM_sc_find_by_handle(tc, handle); if (sc == NULL) { MVMString *desc = read_string_from_heap(tc, reader, read_int32(table_pos, 4)); if (!desc) desc = handle; fail_deserialize(tc, reader, "Missing or wrong version of dependency '%s' (from '%s')", MVM_string_ascii_encode(tc, desc, NULL, 0), reader->root.sc->body->description ? MVM_string_ascii_encode(tc, reader->root.sc->body->description, NULL, 0) : ""); } reader->root.dependent_scs[i] = sc; table_pos += 8; } } /* Allocates and STables that we need to deserialize, associating it with its * REPR and getting its allocation size set up. */ static void stub_stable(MVMThreadContext *tc, MVMSerializationReader *reader, MVMuint32 i) { /* Save last read positions. */ MVMint32 orig_stables_data_offset = reader->stables_data_offset; char **orig_read_buffer = reader->cur_read_buffer; MVMint32 *orig_read_offset = reader->cur_read_offset; char **orig_read_end = reader->cur_read_end; char *orig_read_buffer_val = reader->cur_read_buffer ? *(reader->cur_read_buffer) : NULL; MVMint32 orig_read_offset_val = reader->cur_read_offset ? *(reader->cur_read_offset) : 0; char *orig_read_end_val = reader->cur_read_end ? *(reader->cur_read_end) : NULL; /* Calculate location of STable's table row. */ char *st_table_row = reader->root.stables_table + i * STABLES_TABLE_ENTRY_SIZE; /* Check we don't already have the STable (due to repossession). */ MVMSTable *st = MVM_sc_try_get_stable(tc, reader->root.sc, i); if (!st) { /* Read in and look up representation. */ const MVMREPROps *repr = MVM_repr_get_by_name(tc, read_string_from_heap(tc, reader, read_int32(st_table_row, 0))); /* Allocate and store stub STable. */ st = MVM_gc_allocate_stable(tc, repr, NULL); MVM_sc_set_stable(tc, reader->root.sc, i, st); } /* Set the STable's SC. */ MVM_sc_set_stable_sc(tc, st, reader->root.sc); /* Set STable read position, and set current read buffer to the * location of the REPR data. */ reader->stables_data_offset = read_int32(st_table_row, 8); reader->cur_read_buffer = &(reader->root.stables_data); reader->cur_read_offset = &(reader->stables_data_offset); reader->cur_read_end = &(reader->stables_data_end); if (st->REPR->deserialize_stable_size) st->REPR->deserialize_stable_size(tc, st, reader); else fail_deserialize(tc, reader, "Missing deserialize_stable_size"); if (st->size == 0) fail_deserialize(tc, reader, "STable with size zero after deserialization"); /* Restore original read positions. */ reader->stables_data_offset = orig_stables_data_offset; reader->cur_read_buffer = orig_read_buffer; reader->cur_read_offset = orig_read_offset; reader->cur_read_end = orig_read_end; if (reader->cur_read_buffer) { *(reader->cur_read_buffer) = orig_read_buffer_val; *(reader->cur_read_offset) = orig_read_offset_val; *(reader->cur_read_end) = orig_read_end_val; } } /* This is slightly misnamed because it doesn't read objects_data_offset. However, we never need that at the same time as we need the other data, so it makes sense not to over generalise this code. */ static MVMSTable *read_object_table_entry(MVMThreadContext *tc, MVMSerializationReader *reader, MVMuint32 i, MVMint32 *concrete) { MVMint32 si; /* The SC in the dependencies table, + 1 */ MVMint32 si_idx; /* The index in that SC */ /* Calculate location of object's table row. */ const char *const obj_table_row = reader->root.objects_table + i * OBJECTS_TABLE_ENTRY_SIZE; const MVMuint32 packed = read_int32(obj_table_row, 0); if (concrete) *concrete = packed & OBJECTS_TABLE_ENTRY_IS_CONCRETE; si = (packed >> OBJECTS_TABLE_ENTRY_SC_SHIFT) & OBJECTS_TABLE_ENTRY_SC_MASK; if (si == OBJECTS_TABLE_ENTRY_SC_OVERFLOW) { const char *const overflow_data = reader->root.objects_data + read_int32(obj_table_row, 4) - 8; si = read_int32(overflow_data, 0); si_idx = read_int32(overflow_data, 4); } else { si_idx = packed & OBJECTS_TABLE_ENTRY_SC_IDX_MASK; } /* Resolve the STable. */ return MVM_sc_get_stable(tc, locate_sc(tc, reader, si), si_idx); } /* Stubs an object we need to deserialize, setting their REPR and type object * flag. */ static void stub_object(MVMThreadContext *tc, MVMSerializationReader *reader, MVMuint32 i) { MVMint32 concrete; MVMSTable *st = read_object_table_entry(tc, reader, i, &concrete); /* Allocate and store stub object, unless it's already there due to a * repossession. */ MVMObject *obj = MVM_sc_try_get_object(tc, reader->root.sc, i); if (!obj) { if (concrete) obj = st->REPR->allocate(tc, st); else obj = MVM_gc_allocate_type_object(tc, st); MVM_sc_set_object(tc, reader->root.sc, i, obj); } /* Set the object's SC. */ MVM_sc_set_obj_sc(tc, obj, reader->root.sc); } /* Deserializes a context. */ static void deserialize_context(MVMThreadContext *tc, MVMSerializationReader *reader, MVMint32 row) { MVMStaticFrame *sf; MVMFrame *f; MVMint64 i, syms; /* Save last read positions. */ MVMint32 orig_contexts_data_offset = reader->stables_data_offset; char **orig_read_buffer = reader->cur_read_buffer; MVMint32 *orig_read_offset = reader->cur_read_offset; char **orig_read_end = reader->cur_read_end; /* Calculate location of context's table row. */ char *table_row = reader->root.contexts_table + row * CONTEXTS_TABLE_ENTRY_SIZE; /* Resolve the reference to the static code object this context is for. */ MVMuint32 static_sc_id = read_int32(table_row, 0); MVMuint32 static_idx = read_int32(table_row, 4); MVMuint32 outer_idx = read_int32(table_row, 12); MVMObject *static_code = MVM_sc_get_code(tc, locate_sc(tc, reader, static_sc_id), static_idx); /* Create context. */ sf = ((MVMCode *)static_code)->body.sf; f = MVM_frame_create_context_only(tc, sf, static_code); /* Set context data read position, and set current read buffer to the correct thing. */ reader->contexts_data_offset = read_int32(table_row, 8); reader->cur_read_buffer = &(reader->root.contexts_data); reader->cur_read_offset = &(reader->contexts_data_offset); reader->cur_read_end = &(reader->contexts_data_end); /* Deserialize lexicals. */ if (reader->root.version >= 19) { syms = MVM_serialization_read_int(tc, reader); } else { syms = MVM_serialization_read_int64(tc, reader); } for (i = 0; i < syms; i++) { MVMString *sym = MVM_serialization_read_str(tc, reader); MVMRegister *lex = MVM_frame_lexical(tc, f, sym); switch (MVM_frame_lexical_primspec(tc, f, sym)) { case MVM_STORAGE_SPEC_BP_INT: if (reader->root.version >= 19) { lex->i64 = MVM_serialization_read_int(tc, reader); } else { lex->i64 = MVM_serialization_read_int64(tc, reader); } break; case MVM_STORAGE_SPEC_BP_NUM: lex->n64 = MVM_serialization_read_num(tc, reader); break; case MVM_STORAGE_SPEC_BP_STR: MVM_ASSIGN_REF(tc, &(f->header), lex->s, MVM_serialization_read_str(tc, reader)); break; default: MVM_ASSIGN_REF(tc, &(f->header), lex->o, MVM_serialization_read_ref(tc, reader)); } } /* Put context into contexts array (will be attached in a later pass). */ reader->contexts[row] = f; /* Restore original read positions. */ reader->contexts_data_offset = orig_contexts_data_offset; reader->cur_read_buffer = orig_read_buffer; reader->cur_read_offset = orig_read_offset; reader->cur_read_end = orig_read_end; /* If we have an outer context... */ if (outer_idx) { /* Deserialize it if we don't already have it. */ if (!reader->contexts[outer_idx - 1]) deserialize_context(tc, reader, outer_idx - 1); /* Attach it. */ MVM_ASSIGN_REF(tc, &(f->header), f->outer, reader->contexts[outer_idx - 1]); } } /* Deserializes a closure, though without attaching outer (that comes in a * later step). */ static void deserialize_closure(MVMThreadContext *tc, MVMSerializationReader *reader, MVMint32 i) { /* Calculate location of closure's table row. */ char *table_row = reader->root.closures_table + i * CLOSURES_TABLE_ENTRY_SIZE; /* Resolve the reference to the static code object. */ MVMuint32 static_sc_id = read_int32(table_row, 0); MVMuint32 static_idx = read_int32(table_row, 4); MVMuint32 context_idx = read_int32(table_row, 8); MVMObject *static_code = MVM_sc_get_code(tc, locate_sc(tc, reader, static_sc_id), static_idx); /* Clone it and add it to the SC's code refs list. */ MVMObject *closure = MVM_repr_clone(tc, static_code); MVM_repr_bind_pos_o(tc, reader->codes_list, reader->num_static_codes + i, closure); /* Tag it as being in this SC. */ MVM_sc_set_obj_sc(tc, closure, reader->root.sc); /* See if there's a code object we need to attach. */ if (read_int32(table_row, 12)) { MVMObject *obj = MVM_sc_get_object(tc, locate_sc(tc, reader, read_int32(table_row, 16)), read_int32(table_row, 20)); MVM_ASSIGN_REF(tc, &(closure->header), ((MVMCode *)closure)->body.code_object, obj); } /* If we have an outer context... */ if (context_idx) { /* Deserialize it if we don't already have it. */ if (!reader->contexts[context_idx - 1]) deserialize_context(tc, reader, context_idx - 1); /* Attach it. */ MVM_ASSIGN_REF(tc, &(closure->header), ((MVMCode *)closure)->body.outer, reader->contexts[context_idx - 1]); } } /* Reads in what we need to lazily deserialize ->HOW later. */ static void deserialize_how_lazy(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { MVMSerializationContext *sc = read_locate_sc_and_index(tc, reader, (MVMint32 *) &st->HOW_idx); MVM_ASSIGN_REF(tc, &(st->header), st->HOW_sc, sc); } /* calculate needed bytes for int, it is a simple version of MVM_serialization_read_int. */ static MVMuint8 calculate_int_bytes(MVMThreadContext *tc, MVMSerializationReader *reader) { const MVMuint8 *read_at = (MVMuint8 *) *(reader->cur_read_buffer) + *(reader->cur_read_offset); MVMuint8 *const read_end = (MVMuint8 *) *(reader->cur_read_end); MVMuint8 first; MVMuint8 need; if (read_at >= read_end) fail_deserialize(tc, reader, "Read past end of serialization data buffer"); first = *read_at++; /* Top bit set means remaining 7 bits are a value between -1 and 126. (That turns out to be the most common 7 bit range that we serialize.) */ if (first & 0x80) { return 1; } /* Otherwise next 3 bits indicate how many more bytes follow. */ need = first >> 4; if (!need) { return 9; } if (read_at + need > read_end) fail_deserialize(tc, reader, "Read past end of serialization data buffer"); return need + 1; } /* Stashes what we need to deserialize the method cache lazily later, and then * skips over it. * * This function is cruel and unforgiving if you change other parts of the * serialization format, but don't remember (or realise) that you need to update * its idea of sizes. Its "failure" mode is silent, and everything still passes * tests. Only if you benchmark do you realise that everything takes longer, * because the lazy paths are now no longer taken. */ static void deserialize_method_cache_lazy(MVMThreadContext *tc, MVMSTable *st, MVMSerializationReader *reader) { /* Peek ahead at the discriminator. */ const int discrim_size = 1; const MVMuint8 discrim = read_discrim(tc, reader); /* We only know how to lazily handle a hash of code refs or code objects; * for anything else, don't do it lazily. */ if (discrim == REFVAR_VM_HASH_STR_VAR) { MVMint32 elems, i, valid; /* Save the offset, then skip past discriminator. */ MVMint32 before = *(reader->cur_read_offset); *(reader->cur_read_offset) += discrim_size; /* Check the elements are as expected. */ if (reader->root.version >= 19) { elems = MVM_serialization_read_int(tc, reader); } else { assert_can_read(tc, reader, 4); elems = read_int32(*(reader->cur_read_buffer), *(reader->cur_read_offset)); *(reader->cur_read_offset) += 4; } valid = 1; for (i = 0; i < elems; i++) { MVMuint32 packed; MVMuint8 inner_discrim; MVMint32 offset; /* Skip string. */ assert_can_read(tc, reader, 2); offset = read_uint16(*(reader->cur_read_buffer), *(reader->cur_read_offset)); *(reader->cur_read_offset) += 2; if (offset & STRING_HEAP_LOC_PACKED_OVERFLOW) { assert_can_read(tc, reader, 2); *(reader->cur_read_offset) += 2; } /* Ensure we've a coderef or code object. */ assert_can_read(tc, reader, discrim_size); inner_discrim = read_discrim(tc, reader); *(reader->cur_read_offset) += discrim_size; switch (inner_discrim) { case REFVAR_OBJECT: case REFVAR_STATIC_CODEREF: case REFVAR_CLONED_CODEREF: if (reader->root.version >= 19) { packed = MVM_serialization_read_int(tc, reader); } else { assert_can_read(tc, reader, 4); packed = read_int32(*(reader->cur_read_buffer), *(reader->cur_read_offset) ); } if(packed == (PACKED_SC_OVERFLOW << PACKED_SC_SHIFT)) { if (reader->root.version >= 19) { *(reader->cur_read_offset) += calculate_int_bytes(tc, reader); /* for sc_id */ *(reader->cur_read_offset) += calculate_int_bytes(tc, reader); /* for idx */ } else { assert_can_read(tc, reader, 12); *(reader->cur_read_offset) += 12; } } else { if (reader->root.version >= 19) { } else { *(reader->cur_read_offset) += 4; } } break; case REFVAR_NULL: case REFVAR_VM_NULL: case REFVAR_VM_INT: case REFVAR_VM_NUM: case REFVAR_VM_STR: case REFVAR_VM_ARR_VAR: case REFVAR_VM_ARR_STR: case REFVAR_VM_ARR_INT: case REFVAR_VM_HASH_STR_VAR: valid = 0; *(reader->cur_read_offset) = before; break; default: MVM_exception_throw_adhoc(tc, "Serialization Error: Unimplemented discriminator %d in inner loop in deserialize_method_cache_lazy", inner_discrim); } if (!valid) break; } /* If all was valid then just stash what we need for later. */ if (valid) { st->method_cache = NULL; MVM_ASSIGN_REF(tc, &(st->header), st->method_cache_sc, reader->root.sc); st->method_cache_offset = before; return; } } else { switch (discrim) { case REFVAR_OBJECT: case REFVAR_STATIC_CODEREF: case REFVAR_CLONED_CODEREF: case REFVAR_NULL: case REFVAR_VM_NULL: case REFVAR_VM_INT: case REFVAR_VM_NUM: case REFVAR_VM_STR: case REFVAR_VM_ARR_VAR: case REFVAR_VM_ARR_STR: case REFVAR_VM_ARR_INT: case REFVAR_VM_HASH_STR_VAR: break; default: MVM_exception_throw_adhoc(tc, "Serialization Error: Unimplemented discriminator %d in deserialize_method_cache_lazy", discrim); } } /* If we get here, fall back to eager deserialization. */ MVM_ASSIGN_REF(tc, &(st->header), st->method_cache, MVM_serialization_read_ref(tc, reader)); } /* Deserializes a single STable, along with its REPR data. */ static void deserialize_stable(MVMThreadContext *tc, MVMSerializationReader *reader, MVMint32 i, MVMSTable *st) { /* Save last read positions. */ MVMint32 orig_stables_data_offset = reader->stables_data_offset; char **orig_read_buffer = reader->cur_read_buffer; MVMint32 *orig_read_offset = reader->cur_read_offset; char **orig_read_end = reader->cur_read_end; char *orig_read_buffer_val = reader->cur_read_buffer ? *(reader->cur_read_buffer) : NULL; MVMint32 orig_read_offset_val = reader->cur_read_offset ? *(reader->cur_read_offset) : 0; char *orig_read_end_val = reader->cur_read_end ? *(reader->cur_read_end) : NULL; /* Calculate location of STable's table row. */ char *st_table_row = reader->root.stables_table + i * STABLES_TABLE_ENTRY_SIZE; MVMuint8 flags; MVMuint8 mode; /* Set STable read position, and set current read buffer to the correct thing. */ reader->stables_data_offset = read_int32(st_table_row, 4); reader->cur_read_buffer = &(reader->root.stables_data); reader->cur_read_offset = &(reader->stables_data_offset); reader->cur_read_end = &(reader->stables_data_end); /* If the STable is being repossessed, clean up its existing data before we * write over it. */ if (st->being_repossessed) { if (st->REPR->gc_free_repr_data) st->REPR->gc_free_repr_data(tc, st); MVM_free(st->type_check_cache); st->type_check_cache = NULL; MVM_free(st->boolification_spec); st->boolification_spec = NULL; MVM_free(st->invocation_spec); st->invocation_spec = NULL; MVM_free(st->debug_name); st->debug_name = NULL; st->being_repossessed = 0; } /* Read the HOW, WHAT and WHO. */ deserialize_how_lazy(tc, st, reader); MVM_ASSIGN_REF(tc, &(st->header), st->WHAT, read_obj_ref(tc, reader)); MVM_ASSIGN_REF(tc, &(st->header), st->WHO, MVM_serialization_read_ref(tc, reader)); /* Method cache. */ deserialize_method_cache_lazy(tc, st, reader); /* Type check cache. */ st->type_check_cache_length = MVM_serialization_read_int(tc, reader); if (st->type_check_cache_length > 0) { st->type_check_cache = (MVMObject **)MVM_malloc(st->type_check_cache_length * sizeof(MVMObject *)); for (i = 0; i < st->type_check_cache_length; i++) MVM_ASSIGN_REF(tc, &(st->header), st->type_check_cache[i], MVM_serialization_read_ref(tc, reader)); } /* Mode flags. */ assert_can_read(tc, reader, 1); st->mode_flags = *(*(reader->cur_read_buffer) + *(reader->cur_read_offset)); *(reader->cur_read_offset) += 1; if (st->mode_flags & MVM_PARAMETRIC_TYPE && st->mode_flags & MVM_PARAMETERIZED_TYPE) fail_deserialize(tc, reader, "STable mode flags cannot indicate both parametric and parameterized"); /* Boolification spec. */ assert_can_read(tc, reader, 1); flags = *(*(reader->cur_read_buffer) + *(reader->cur_read_offset)); *(reader->cur_read_offset) += 1; mode = flags & 0xF; if (mode != 0xF) { st->boolification_spec = (MVMBoolificationSpec *)MVM_malloc(sizeof(MVMBoolificationSpec)); st->boolification_spec->mode = mode; MVM_ASSIGN_REF(tc, &(st->header), st->boolification_spec->method, MVM_serialization_read_ref(tc, reader)); } /* Container spec. */ if (flags & STABLE_HAS_CONTAINER_SPEC) { MVMString *name = MVM_serialization_read_str(tc, reader); const MVMContainerConfigurer *cc = MVM_6model_get_container_config(tc, name); if (!cc) fail_deserialize(tc, reader, "Could not look up the container config for '%s'", MVM_string_ascii_encode(tc, name, NULL, 0)); cc->set_container_spec(tc, st); st->container_spec->deserialize(tc, st, reader); } /* Invocation spec. */ if (flags & STABLE_HAS_INVOCATION_SPEC) { st->invocation_spec = (MVMInvocationSpec *)MVM_calloc(1, sizeof(MVMInvocationSpec)); MVM_ASSIGN_REF(tc, &(st->header), st->invocation_spec->class_handle, MVM_serialization_read_ref(tc, reader)); MVM_ASSIGN_REF(tc, &(st->header), st->invocation_spec->attr_name, MVM_serialization_read_str(tc, reader)); st->invocation_spec->hint = MVM_serialization_read_int(tc, reader); MVM_ASSIGN_REF(tc, &(st->header), st->invocation_spec->invocation_handler, MVM_serialization_read_ref(tc, reader)); MVM_ASSIGN_REF(tc, &(st->header), st->invocation_spec->md_class_handle, MVM_serialization_read_ref(tc, reader)); MVM_ASSIGN_REF(tc, &(st->header), st->invocation_spec->md_cache_attr_name, MVM_serialization_read_str(tc, reader)); st->invocation_spec->md_cache_hint = MVM_serialization_read_int(tc, reader); MVM_ASSIGN_REF(tc, &(st->header), st->invocation_spec->md_valid_attr_name, MVM_serialization_read_str(tc, reader)); st->invocation_spec->md_valid_hint = MVM_serialization_read_int(tc, reader); } /* HLL owner. */ if (flags & STABLE_HAS_HLL_OWNER) { st->hll_owner = MVM_hll_get_config_for(tc, MVM_serialization_read_str(tc, reader)); } /* HLL role. */ if (flags & STABLE_HAS_HLL_ROLE) { st->hll_role = MVM_serialization_read_int(tc, reader); } /* If it's a parametric type... */ if (st->mode_flags & MVM_PARAMETRIC_TYPE) { /* Create empty lookup table, unless we were beat to it. */ if (!st->paramet.ric.lookup) { MVMObject *lookup = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVM_ASSIGN_REF(tc, &(st->header), st->paramet.ric.lookup, lookup); } /* Deserialize parameterizer. */ MVM_ASSIGN_REF(tc, &(st->header), st->paramet.ric.parameterizer, MVM_serialization_read_ref(tc, reader)); } /* If it's a parameterized type... */ if (st->mode_flags & MVM_PARAMETERIZED_TYPE) { MVMObject *lookup; /* Deserialize parametric type and parameters. */ MVMObject *ptype = MVM_serialization_read_ref(tc, reader); MVMObject *params = read_array_var(tc, reader); /* Attach them to the STable. */ MVM_ASSIGN_REF(tc, &(st->header), st->paramet.erized.parametric_type, ptype); MVM_ASSIGN_REF(tc, &(st->header), st->paramet.erized.parameters, params); /* Add a mapping into the lookup list of the parameteric type. */ lookup = STABLE(ptype)->paramet.ric.lookup; if (!lookup) { lookup = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVM_ASSIGN_REF(tc, &(STABLE(ptype)->header), STABLE(ptype)->paramet.ric.lookup, lookup); } MVM_repr_push_o(tc, lookup, params); MVM_repr_push_o(tc, lookup, st->WHAT); } if (reader->root.version >= 18) { st->debug_name = MVM_serialization_read_cstr(tc, reader); } else { st->debug_name = 0; } /* If the REPR has a function to deserialize representation data, call it. */ if (st->REPR->deserialize_repr_data) st->REPR->deserialize_repr_data(tc, st, reader); /* Restore original read positions. */ reader->stables_data_offset = orig_stables_data_offset; reader->cur_read_buffer = orig_read_buffer; reader->cur_read_offset = orig_read_offset; reader->cur_read_end = orig_read_end; if (reader->cur_read_buffer) { *(reader->cur_read_buffer) = orig_read_buffer_val; *(reader->cur_read_offset) = orig_read_offset_val; *(reader->cur_read_end) = orig_read_end_val; } } /* Deserializes a single object. */ static void deserialize_object(MVMThreadContext *tc, MVMSerializationReader *reader, MVMint32 i, MVMObject *obj) { /* We've no more to do for type objects. */ if (IS_CONCRETE(obj)) { /* Calculate location of object's table row. */ char *obj_table_row = reader->root.objects_table + i * OBJECTS_TABLE_ENTRY_SIZE; /* Set current read buffer to the correct thing. */ reader->cur_read_buffer = &(reader->root.objects_data); reader->cur_read_offset = &(reader->objects_data_offset); reader->cur_read_end = &(reader->objects_data_end); /* Delegate to its deserialization REPR function. */ reader->current_object = obj; reader->objects_data_offset = read_int32(obj_table_row, 4); if (REPR(obj)->deserialize) REPR(obj)->deserialize(tc, STABLE(obj), obj, OBJECT_BODY(obj), reader); else fail_deserialize(tc, reader, "Missing deserialize REPR function for %s (%s)", REPR(obj)->name, MVM_6model_get_debug_name(tc, obj)); reader->current_object = NULL; } } /* Worklist manipulation functions. */ static void worklist_add_index(MVMThreadContext *tc, MVMDeserializeWorklist *wl, MVMuint32 index) { if (wl->num_indexes == wl->alloc_indexes) { if (wl->alloc_indexes) wl->alloc_indexes *= 2; else wl->alloc_indexes = 128; wl->indexes = MVM_realloc(wl->indexes, wl->alloc_indexes * sizeof(MVMuint32)); } wl->indexes[wl->num_indexes] = index; wl->num_indexes++; } static MVMuint32 worklist_has_work(MVMThreadContext *tc, MVMDeserializeWorklist *wl) { return wl->num_indexes > 0; } static MVMuint32 worklist_take_index(MVMThreadContext *tc, MVMDeserializeWorklist *wl) { wl->num_indexes--; return wl->indexes[wl->num_indexes]; } /* Evaluates work lists until they are all empty. */ static void work_loop(MVMThreadContext *tc, MVMSerializationReader *sr) { MVMuint32 worked = 1; while (worked) { worked = 0; while (worklist_has_work(tc, &(sr->wl_stables))) { MVMuint32 index = worklist_take_index(tc, &(sr->wl_stables)); deserialize_stable(tc, sr, index, sr->root.sc->body->root_stables[index]); worked = 1; } while (worklist_has_work(tc, &(sr->wl_objects)) && !worklist_has_work(tc, &(sr->wl_stables))) { MVMuint32 index = worklist_take_index(tc, &(sr->wl_objects)); deserialize_object(tc, sr, index, sr->root.sc->body->root_objects[index]); worked = 1; } } } /* Demands that we finish deserializing an object. */ MVMObject * MVM_serialization_demand_object(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx) { /* Obtain lock and check we didn't lose a race to deserialize this * object. */ MVMSerializationReader *sr = sc->body->sr; MVMROOT(tc, sc, { MVM_reentrantmutex_lock(tc, (MVMReentrantMutex *)sc->body->mutex); }); if (sc->body->root_objects[idx]) { MVM_reentrantmutex_unlock(tc, (MVMReentrantMutex *)sc->body->mutex); return sc->body->root_objects[idx]; } /* Flag that we're working on some deserialization (and so will run the * loop). */ sr->working++; MVM_gc_allocate_gen2_default_set(tc); /* Stub the object. */ stub_object(tc, sr, idx); /* Add to worklist and process as needed. */ worklist_add_index(tc, &(sr->wl_objects), idx); if (sr->working == 1) work_loop(tc, sr); /* Clear up. */ MVM_gc_allocate_gen2_default_clear(tc); sr->working--; MVM_reentrantmutex_unlock(tc, (MVMReentrantMutex *)sc->body->mutex); /* Return the (perhaps just stubbed) object. */ return sc->body->root_objects[idx]; } /* Demands that we finish deserializing an STable. */ MVMSTable * MVM_serialization_demand_stable(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx) { /* Obtain lock and ensure we didn't lose a race to deserialize this * STable. */ MVMSerializationReader *sr = sc->body->sr; MVMROOT(tc, sc, { MVM_reentrantmutex_lock(tc, (MVMReentrantMutex *)sc->body->mutex); }); if (sc->body->root_stables[idx]) { MVM_reentrantmutex_unlock(tc, (MVMReentrantMutex *)sc->body->mutex); return sc->body->root_stables[idx]; } /* Flag that we're working on some deserialization (and so will run the * loop). */ sr->working++; MVM_gc_allocate_gen2_default_set(tc); /* Stub the STable. */ stub_stable(tc, sr, idx); /* Add to worklist and process as needed. */ worklist_add_index(tc, &(sr->wl_stables), idx); if (sr->working == 1) work_loop(tc, sr); /* Clear up. */ MVM_gc_allocate_gen2_default_clear(tc); sr->working--; MVM_reentrantmutex_unlock(tc, (MVMReentrantMutex *)sc->body->mutex); /* Return the (perhaps just stubbed) STable. */ return sc->body->root_stables[idx]; } /* Demands that we finish deserializing a coderef. */ MVMObject * MVM_serialization_demand_code(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx) { /* Obtain lock and ensure we didn't lose a race to deserialize this * code object. */ MVMSerializationReader *sr = sc->body->sr; MVMROOT(tc, sc, { MVM_reentrantmutex_lock(tc, (MVMReentrantMutex *)sc->body->mutex); }); if (!MVM_is_null(tc, MVM_repr_at_pos_o(tc, sr->codes_list, idx))) { MVM_reentrantmutex_unlock(tc, (MVMReentrantMutex *)sc->body->mutex); return MVM_repr_at_pos_o(tc, sr->codes_list, idx); } /* Flag that we're working on some deserialization (and so will run the * loop). */ sr->working++; MVM_gc_allocate_gen2_default_set(tc); /* Deserialize the code object. */ deserialize_closure(tc, sr, idx - sr->num_static_codes); /* Add to worklist and process as needed. */ if (sr->working == 1) work_loop(tc, sr); /* Clear up. */ MVM_gc_allocate_gen2_default_clear(tc); sr->working--; MVM_reentrantmutex_unlock(tc, (MVMReentrantMutex *)sc->body->mutex); /* Return the (perhaps just stubbed) STable. */ return MVM_repr_at_pos_o(tc, sr->codes_list, idx); } /* Forces us to complete deserialization of a particular STable before work * can go on. */ void MVM_serialization_force_stable(MVMThreadContext *tc, MVMSerializationReader *sr, MVMSTable *st) { /* We'll always have the WHAT if we finished deserializing. */ if (!st->WHAT) { /* Not finished. Try to find the index. */ MVMDeserializeWorklist *wl = &(sr->wl_stables); MVMint32 found = 0; MVMuint32 i; for (i = 0; i < wl->num_indexes; i++) { MVMuint32 index = wl->indexes[i]; if (!found) { if (sr->root.sc->body->root_stables[index] == st) { /* Found it; finish deserialize. */ deserialize_stable(tc, sr, index, sr->root.sc->body->root_stables[index]); found = 1; } } else { /* After the found index; steal from list. */ wl->indexes[i - 1] = index; } } if (found) wl->num_indexes--; } } /* Finishes deserializing the method cache. */ void MVM_serialization_finish_deserialize_method_cache(MVMThreadContext *tc, MVMSTable *st) { MVMSerializationContext *sc = st->method_cache_sc; if (sc && sc->body->sr) { /* Acquire mutex and ensure we didn't lose a race to do this. */ MVMSerializationReader *sr = sc->body->sr; MVMROOT2(tc, st, sc, { MVM_reentrantmutex_lock(tc, (MVMReentrantMutex *)sc->body->mutex); }); if (st->method_cache_sc) { MVMObject *cache; /* Set reader's position. */ sr->stables_data_offset = st->method_cache_offset; sr->cur_read_buffer = &(sr->root.stables_data); sr->cur_read_offset = &(sr->stables_data_offset); sr->cur_read_end = &(sr->stables_data_end); /* Flag that we're working on some deserialization (and so will run the * loop). */ sr->working++; MVM_gc_allocate_gen2_default_set(tc); /* Deserialize what we need. */ cache = MVM_serialization_read_ref(tc, sr); if (sr->working == 1) work_loop(tc, sr); MVM_ASSIGN_REF(tc, &(st->header), st->method_cache, cache); /* Clear up. */ MVM_gc_allocate_gen2_default_clear(tc); sr->working--; st->method_cache_sc = NULL; } MVM_reentrantmutex_unlock(tc, (MVMReentrantMutex *)sc->body->mutex); } } /* Repossess an object or STable. Ignores those not matching the specified * type (where 0 = object, 1 = STable). */ static void repossess(MVMThreadContext *tc, MVMSerializationReader *reader, MVMint64 i, MVMObject *repo_conflicts, MVMint32 type) { MVMuint32 slot; /* Calculate location of table row. */ char *table_row = reader->root.repos_table + i * REPOS_TABLE_ENTRY_SIZE; /* Do appropriate type of repossession, provided it matches the type of * thing we're current repossessing. */ MVMint32 repo_type = read_int32(table_row, 0); if (repo_type != type) return; if (repo_type == 0) { MVMSTable *updated_st; /* Get object to repossess. */ MVMSerializationContext *orig_sc = locate_sc(tc, reader, read_int32(table_row, 8)); MVMObject *orig_obj = MVM_sc_get_object(tc, orig_sc, read_int32(table_row, 12)); /* If we have a reposession conflict, make a copy of the original object * and reference it from the conflicts list. Push the original (about to * be overwritten) object reference too. */ if (MVM_sc_get_obj_sc(tc, orig_obj) != orig_sc) { MVMROOT(tc, orig_obj, { MVMObject *backup = NULL; MVMROOT(tc, backup, { if (IS_CONCRETE(orig_obj)) { backup = REPR(orig_obj)->allocate(tc, STABLE(orig_obj)); REPR(orig_obj)->copy_to(tc, STABLE(orig_obj), OBJECT_BODY(orig_obj), backup, OBJECT_BODY(backup)); } else backup = MVM_gc_allocate_type_object(tc, STABLE(orig_obj)); }); MVM_SC_WB_OBJ(tc, backup); MVM_repr_push_o(tc, repo_conflicts, backup); MVM_repr_push_o(tc, repo_conflicts, orig_obj); }); } /* Put it into objects root set at the apporpriate slot. */ slot = read_int32(table_row, 4); MVM_sc_set_object(tc, reader->root.sc, slot, orig_obj); MVM_sc_set_obj_sc(tc, orig_obj, reader->root.sc); MVM_sc_set_idx_in_sc(&(orig_obj->header), slot); /* Clear it up, since we'll re-allocate all the bits inside * it on deserialization. */ if (REPR(orig_obj)->gc_free) { REPR(orig_obj)->gc_free(tc, orig_obj); /* Ensure the object is clean in case the deserialization never happens */ memset(OBJECT_BODY(orig_obj), 0, orig_obj->header.size - sizeof(MVMObject)); } /* The object's STable may have changed as a result of the * repossession (perhaps due to mixing in to it), so put the * STable it should now have in place. */ updated_st = read_object_table_entry(tc, reader, slot, NULL); MVM_ASSIGN_REF(tc, &(orig_obj->header), orig_obj->st, updated_st); /* Put this on the list of things we should deserialize right away. */ worklist_add_index(tc, &(reader->wl_objects), slot); } else if (repo_type == 1) { /* Get STable to repossess. */ MVMSerializationContext *orig_sc = locate_sc(tc, reader, read_int32(table_row, 8)); MVMSTable *orig_st = MVM_sc_get_stable(tc, orig_sc, read_int32(table_row, 12)); /* Make sure we don't have a reposession conflict. */ if (MVM_sc_get_stable_sc(tc, orig_st) != orig_sc) fail_deserialize(tc, reader, "STable conflict detected during deserialization.\n" "(Probable attempt to load a mutated module or modules that cannot be loaded together)."); /* Put it into STables root set at the apporpriate slot. */ slot = read_int32(table_row, 4); MVM_sc_set_stable(tc, reader->root.sc, slot, orig_st); MVM_sc_set_stable_sc(tc, orig_st, reader->root.sc); MVM_sc_set_idx_in_sc(&(orig_st->header), slot); /* Flag as being repossessed, so we can clear up memory at the point * we replaced the STable data with the updated data. */ orig_st->being_repossessed = 1; /* Put this on the list of things we should deserialize right away. */ worklist_add_index(tc, &(reader->wl_stables), slot); } else { fail_deserialize(tc, reader, "Unknown repossession type"); } } /* This goes through the entries in the parameterized types interning section, * if any. For each, if we already deserialized the parameterization from a * different compilation unit or created it in something we already compiled, * we just use that existing parameterization. */ static void resolve_param_interns(MVMThreadContext *tc, MVMSerializationReader *reader) { MVMint32 iidx; /* Switch to reading the parameterization segment. */ reader->cur_read_buffer = &(reader->root.param_interns_data); reader->cur_read_offset = &(reader->param_interns_data_offset); reader->cur_read_end = &(reader->param_interns_data_end); /* Go over all the interns we have. */ for (iidx = 0; iidx < reader->root.num_param_interns; iidx++) { MVMObject *params, *matching; MVMint32 num_params, i; /* Resolve the parametric type. */ MVMObject *ptype = read_obj_ref(tc, reader); /* Read indexes where type object and STable will get placed if a * matching intern is found. */ MVMint32 type_idx = read_int32(*(reader->cur_read_buffer), *(reader->cur_read_offset)); MVMint32 st_idx = read_int32(*(reader->cur_read_buffer), *(reader->cur_read_offset) + 4); *(reader->cur_read_offset) += 8; /* Read parameters and push into array. */ num_params = read_int32(*(reader->cur_read_buffer), *(reader->cur_read_offset)); *(reader->cur_read_offset) += 4; params = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); for (i = 0; i < num_params; i++) MVM_repr_push_o(tc, params, read_obj_ref(tc, reader)); /* Try to find a matching parameterization. */ matching = MVM_6model_parametric_try_find_parameterization(tc, STABLE(ptype), params); if (matching) { MVM_sc_set_object(tc, reader->root.sc, type_idx, matching); MVM_sc_set_stable(tc, reader->root.sc, st_idx, STABLE(matching)); } } } /* Takes serialized data, an empty SerializationContext to deserialize it into, * a strings heap and the set of static code refs for the compilation unit. * Deserializes the data into the required objects and STables. */ void MVM_serialization_deserialize(MVMThreadContext *tc, MVMSerializationContext *sc, MVMObject *string_heap, MVMObject *codes_static, MVMObject *repo_conflicts, MVMString *data) { MVMint32 scodes, i; /* Allocate and set up reader. */ MVMSerializationReader *reader = MVM_calloc(1, sizeof(MVMSerializationReader)); reader->root.sc = sc; /* If we've been given a NULL string heap, use that of the current * compilation unit. */ if (MVM_is_null(tc, string_heap)) reader->root.string_comp_unit = *(tc->interp_cu); else reader->root.string_heap = string_heap; /* Store reader inside serialization context; it'll need it for lazy * deserialization. */ sc->body->sr = reader; /* Put code root list into SC. We'll end up mutating it, but that's * probably fine. */ MVM_sc_set_code_list(tc, sc, codes_static); reader->codes_list = codes_static; scodes = (MVMint32)MVM_repr_elems(tc, codes_static); reader->num_static_codes = scodes; /* Mark all the static code refs we've been provided with as static. */ for (i = 0; i < scodes; i++) { MVMObject *scr = MVM_repr_at_pos_o(tc, reader->codes_list, i); ((MVMCode *)scr)->body.is_static = 1; MVM_sc_set_obj_sc(tc, scr, sc); } /* During deserialization, we allocate directly in generation 2. This * is because these objects are almost certainly going to be long lived, * but also because if we know that we won't end up moving the objects * we are working on during a deserialization run, it's a bunch easier * to have those partially constructed objects floating around. */ MVM_gc_allocate_gen2_default_set(tc); /* Read header and dissect the data into its parts. */ check_and_dissect_input(tc, reader, data); /* Resolve the SCs in the dependencies table. */ resolve_dependencies(tc, reader); /* Size objects, STables, and contexts arrays. */ if (sc->body->root_objects) MVM_free(sc->body->root_objects); if (sc->body->root_stables) MVM_free(sc->body->root_stables); sc->body->root_objects = MVM_calloc(reader->root.num_objects, sizeof(MVMObject *)); sc->body->num_objects = reader->root.num_objects; sc->body->alloc_objects = reader->root.num_objects; sc->body->root_stables = MVM_calloc(reader->root.num_stables, sizeof(MVMSTable *)); sc->body->num_stables = reader->root.num_stables; sc->body->alloc_stables = reader->root.num_stables; reader->contexts = MVM_calloc(reader->root.num_contexts, sizeof(MVMFrame *)); /* Increase size of code refs list to include closures we'll later * deserialize. */ REPR(codes_static)->pos_funcs.set_elems(tc, STABLE(codes_static), codes_static, OBJECT_BODY(codes_static), scodes + reader->root.num_closures); /* Handle any type parameterization interning, menaing we should not * deserialize our own versions of things. */ resolve_param_interns(tc, reader); /* If we're repossessing STables and objects from other SCs, then first * get those raw objects into our root set. Note we do all the STables, * then all the objects, since the objects may, post-repossession, refer * to a repossessed STable. */ for (i = 0; i < reader->root.num_repos; i++) repossess(tc, reader, i, repo_conflicts, 1); for (i = 0; i < reader->root.num_repos; i++) repossess(tc, reader, i, repo_conflicts, 0); /* Enter the work loop to deal with the things we immediately need to * handle in order to complete repossession object deserialization. */ reader->working = 1; work_loop(tc, reader); reader->working = 0; /* Clear serialized data reference in CU. */ if ((*tc->interp_cu)->body.serialized) { (*tc->interp_cu)->body.serialized = NULL; (*tc->interp_cu)->body.serialized_size = 0; } /* If lazy deserialization is disabled, deserialize everything. */ #if !MVM_SERIALIZATION_LAZY for (i = 0; i < sc->body->num_objects; i++) MVM_serialization_demand_object(tc, sc, i); for (i = 0; i < sc->body->num_stables; i++) MVM_serialization_demand_stable(tc, sc, i); #endif /* Restore normal GC allocation. */ MVM_gc_allocate_gen2_default_clear(tc); } /* =item sha1 Computes the SHA-1 hash of string. =cut */ MVMString * MVM_sha1(MVMThreadContext *tc, MVMString *str) { /* Grab the string as UTF8 bytes. */ MVMuint64 output_size; char *utf8_string = MVM_string_utf8_encode(tc, str, &output_size, 0); /* Compute its SHA-1 and encode it. */ SHA1Context context; char output[80]; SHA1Init(&context); SHA1Update(&context, (unsigned char*) utf8_string, (size_t) output_size); SHA1Final(&context, output); /* Free the C-MVMString and put result into a new MVMString. */ MVM_free(utf8_string); return MVM_string_ascii_decode(tc, tc->instance->VMString, output, 40); } MoarVM-2018.03/src/6model/serialization.h0000644000175000017510000001770213237701240020214 0ustar samanthasamantha/* This represents the root of the serialization data; everything hangs * off this. In read mode, we don't do much besides populate and then * read this. In write mode, however, the tables and data chunks will be * filled out and grown as needed. */ struct MVMSerializationRoot { /* The version of the serialization format. */ MVMint32 version; /* How many parameterized type intern entries we have */ MVMint32 num_param_interns; /* The SC we're serializing/deserializing. */ MVMSerializationContext *sc; /* List of the serialization context objects that we depend on. */ MVMSerializationContext **dependent_scs; /* The number of dependencies, as well as a pointer to the * dependencies table. */ char *dependencies_table; MVMint32 num_dependencies; /* The number of STables, as well as pointers to the STables * table and data chunk. */ MVMint32 num_stables; char *stables_table; char *stables_data; /* The number of objects, as well as pointers to the objects * table and data chunk. */ char *objects_table; char *objects_data; MVMint32 num_objects; /* The number of closures, as we as a pointer to the closures * table. */ MVMint32 num_closures; char *closures_table; /* The number of contexts (e.g. frames), as well as pointers to * the contexts table and data chunk. */ char *contexts_table; char *contexts_data; MVMint32 num_contexts; /* The number of repossessions and pointer to repossessions table. */ MVMint32 num_repos; char *repos_table; /* The the data segment containing them parameterized type intern entries */ char *param_interns_data; /* Array of strings making up the string heap we are constructing. If we * are reading, this will either contain a string heap array or be NULL * and the next field will be set. */ MVMObject *string_heap; /* The compilation unit whose string heap we will use to locate strings. * This must be set of string_heap about is set to NULL. */ MVMCompUnit *string_comp_unit; }; /* Indexes the deserializer still has to work on. */ struct MVMDeserializeWorklist { MVMuint32 *indexes; MVMuint32 num_indexes; MVMuint32 alloc_indexes; }; /* Represents the serialization reader and the various functions available * on it. */ struct MVMSerializationReader { /* Serialization root data. */ MVMSerializationRoot root; /* Current offsets for the data chunks (also correspond to the amount of * data written in to them). */ MVMint32 stables_data_offset; MVMint32 objects_data_offset; MVMint32 contexts_data_offset; MVMint32 param_interns_data_offset; /* Limits up to where we can read stables, objects and contexts data. */ char *stables_data_end; char *objects_data_end; char *contexts_data_end; char *param_interns_data_end; /* Where to find details related to the current buffer we're reading from: * the buffer pointer itself, the current offset and the amount that is * allocated. These are all pointers back into this data structure. */ char **cur_read_buffer; MVMint32 *cur_read_offset; char **cur_read_end; /* List of code objects (static first, then all the closures). */ MVMObject *codes_list; /* Number of static code objects. */ MVMuint32 num_static_codes; /* Whether we're already working on these worklists. */ MVMuint32 working; /* Array of contexts (num_contexts in length). */ MVMFrame **contexts; /* Set of current worklists, for things we need to fully desrialize. When * they are all empty, the current (usually lazy) deserialization work is * done, and we have the required object graph. */ MVMDeserializeWorklist wl_objects; MVMDeserializeWorklist wl_stables; /* The current object we're deserializing. */ MVMObject *current_object; /* The data, which we may want to free when the SC goes away; a flag * indicates when it should be. */ char *data; MVMuint32 data_needs_free; }; /* Represents the serialization writer and the various functions available * on it. */ struct MVMSerializationWriter { /* Serialization root data. */ MVMSerializationRoot root; /* The code refs we're working through/adding to. */ MVMObject *codes_list; /* Frames that we're to serialize, along with memory management. */ MVMFrame **contexts_list; MVMuint32 num_contexts; MVMuint32 alloc_contexts; /* Current position in the stables, objects and contexts lists. */ MVMint64 stables_list_pos; MVMint64 objects_list_pos; MVMint64 contexts_list_pos; /* Hash of strings we've already seen while serializing to the index they * are placed at in the string heap. */ MVMObject *seen_strings; /* Amount of memory allocated for various things. */ MVMuint32 dependencies_table_alloc; MVMuint32 stables_table_alloc; MVMuint32 stables_data_alloc; MVMuint32 objects_table_alloc; MVMuint32 objects_data_alloc; MVMuint32 closures_table_alloc; MVMuint32 contexts_table_alloc; MVMuint32 contexts_data_alloc; MVMuint32 repos_table_alloc; MVMuint32 param_interns_data_alloc; /* Current offsets for the data chunks (also correspond to the amount of * data written in to them). */ MVMuint32 stables_data_offset; MVMuint32 objects_data_offset; MVMuint32 contexts_data_offset; MVMuint32 param_interns_data_offset; /* Where to find details related to the current buffer we're writing in * to: the buffer pointer itself, the current offset and the amount that * is allocated. These are all pointers back into this data structure. */ char **cur_write_buffer; MVMuint32 *cur_write_offset; MVMuint32 *cur_write_limit; }; /* Core serialize and deserialize functions. */ void MVM_serialization_deserialize(MVMThreadContext *tc, MVMSerializationContext *sc, MVMObject *string_heap, MVMObject *codes_static, MVMObject *repo_conflicts, MVMString *data); MVMString * MVM_sha1(MVMThreadContext *tc, MVMString *str); MVMString * MVM_serialization_serialize(MVMThreadContext *tc, MVMSerializationContext *sc, MVMObject *empty_string_heap); /* Functions for demanding an object/STable/code be made available (that is, * by lazily deserializing it). */ MVMObject * MVM_serialization_demand_object(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx); MVMSTable * MVM_serialization_demand_stable(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx); MVMObject * MVM_serialization_demand_code(MVMThreadContext *tc, MVMSerializationContext *sc, MVMint64 idx); void MVM_serialization_finish_deserialize_method_cache(MVMThreadContext *tc, MVMSTable *st); /* Reader/writer functions. */ MVMint64 MVM_serialization_read_int64(MVMThreadContext *tc, MVMSerializationReader *reader); MVMint64 MVM_serialization_read_int(MVMThreadContext *tc, MVMSerializationReader *reader); MVMnum64 MVM_serialization_read_num(MVMThreadContext *tc, MVMSerializationReader *reader); MVMString * MVM_serialization_read_str(MVMThreadContext *tc, MVMSerializationReader *reader); MVMObject * MVM_serialization_read_ref(MVMThreadContext *tc, MVMSerializationReader *reader); MVMSTable * MVM_serialization_read_stable_ref(MVMThreadContext *tc, MVMSerializationReader *reader); void MVM_serialization_force_stable(MVMThreadContext *tc, MVMSerializationReader *reader, MVMSTable *st); void MVM_serialization_write_int(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMint64 value); void MVM_serialization_write_num(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMnum64 value); void MVM_serialization_write_str(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMString *value); void MVM_serialization_write_ref(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMObject *ref); void MVM_serialization_write_stable_ref(MVMThreadContext *tc, MVMSerializationWriter *writer, MVMSTable *st); MoarVM-2018.03/src/README.md0000644000175000017510000000223113237701112015244 0ustar samanthasamantha## MoarVM Source Code MoarVM is written in C, and is designed to (eventually) have a couple of build targets: a dynamic library (so it can be loaded by other VMs or programs that embed it) with a small executable front-end wrapper, but also a fully statically-built standalone executable that can run .moarvm files only. Another option could be for incorporating programs (such as a perl6 build) to statically link the moar library so it can be self-contained itself. moar.c will contain the main embedding API, and main.c will utilize that API. This is not yet fully realized. It will eventually be compiled to libmoar, or similar. moar.h is the primary header file that embedders should include to gain access to the publicly exported MVM_ routines and macros. It includes all the other .h in the src/ tree. Some individual .c files also include other .h files, but the symbols from those files aren't necessarily intended to be part of MoarVM's public API. main.c is currently compiled to the ./moar executable, which is able to run or dump .moarvm bytecode files only. Use the --help flag to see the options available to the moar (moar.exe on Windows) executable. MoarVM-2018.03/src/bithacks.h0000644000175000017510000000073113237701240015733 0ustar samanthasamanthastatic MVMuint32 MVM_bithacks_count_bits(MVMuint64 value) { MVMuint32 count; for (count = 0; value; count++) value &= value - 1; return count; } static int MVM_bithacks_is_pow2z(MVMuint64 value) { return (value & (value - 1)) == 0; } static MVMuint64 MVM_bithacks_next_greater_pow2(MVMuint64 value) { enum { BITS = 64 }; int exp; for(exp = 0; (1 << exp) < BITS; exp++) value |= value >> (1 << exp); return value + 1; } MoarVM-2018.03/src/core/alloc.h0000644000175000017510000000166313237701240016172 0ustar samanthasamanthaMVM_STATIC_INLINE void * MVM_malloc(size_t size) { void *ptr = malloc(size); if (!ptr) MVM_panic_allocation_failed(size); return ptr; } MVM_STATIC_INLINE void * MVM_calloc(size_t num, size_t size) { void *ptr = calloc(num, size); if (!ptr) MVM_panic_allocation_failed(num * size); return ptr; } MVM_STATIC_INLINE void * MVM_realloc(void *p, size_t size) { void *ptr = realloc(p, size); if (!ptr && size > 0) MVM_panic_allocation_failed(size); return ptr; } MVM_STATIC_INLINE void * MVM_recalloc(void *p, size_t old_size, size_t size) { void *ptr = realloc(p, size); if (!ptr && size > 0) MVM_panic_allocation_failed(size); memset((char *)ptr + old_size, 0, size - old_size); return ptr; } MVM_STATIC_INLINE void MVM_free(void *p) { free(p); } #define MVM_free_null(addr) do { \ MVM_free((void *)(addr)); \ (addr) = NULL; \ } while (0) MoarVM-2018.03/src/core/args.c0000644000175000017510000011234013242626641016031 0ustar samanthasamantha#include "moar.h" MVM_STATIC_INLINE MVMint32 is_named_used(MVMArgProcContext *ctx, MVMuint32 idx) { return ctx->named_used_size > 64 ? ctx->named_used.byte_array[idx] : ctx->named_used.bit_field & ((MVMuint64)1 << idx); } MVM_STATIC_INLINE void mark_named_used(MVMArgProcContext *ctx, MVMuint32 idx) { if (ctx->named_used_size > 64) ctx->named_used.byte_array[idx] = 1; else ctx->named_used.bit_field |= (MVMuint64)1 << idx; } /* Marks a named used in the current callframe. */ void MVM_args_marked_named_used(MVMThreadContext *tc, MVMuint32 idx) { mark_named_used(&(tc->cur_frame->params), idx); } static void init_named_used(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint16 num) { ctx->named_used_size = num; if (num > 64) ctx->named_used.byte_array = MVM_fixed_size_alloc_zeroed(tc, tc->instance->fsa, num); else ctx->named_used.bit_field = 0; } /* Initialize arguments processing context. */ void MVM_args_proc_init(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMCallsite *callsite, MVMRegister *args) { /* Stash callsite and argument counts/pointers. */ ctx->callsite = callsite; /* initial counts and values; can be altered by flatteners */ init_named_used(tc, ctx, MVM_callsite_num_nameds(tc, callsite)); ctx->args = args; ctx->num_pos = callsite->num_pos; ctx->arg_count = callsite->arg_count; ctx->arg_flags = NULL; /* will be populated by flattener if needed */ } /* Clean up an arguments processing context. */ void MVM_args_proc_cleanup(MVMThreadContext *tc, MVMArgProcContext *ctx) { if (ctx->arg_flags) { MVM_free(ctx->arg_flags); MVM_free(ctx->args); } if (ctx->named_used_size > 64) { MVM_fixed_size_free(tc, tc->instance->fsa, ctx->named_used_size, ctx->named_used.byte_array); ctx->named_used_size = 0; } } /* Make a copy of the callsite. */ MVMCallsite * MVM_args_copy_callsite(MVMThreadContext *tc, MVMArgProcContext *ctx) { MVMCallsite *res = MVM_calloc(1, sizeof(MVMCallsite)); MVMCallsiteEntry *flags = NULL; MVMCallsiteEntry *src_flags; MVMint32 fsize; if (ctx->arg_flags) { fsize = ctx->flag_count; src_flags = ctx->arg_flags; } else { fsize = ctx->callsite->flag_count; src_flags = ctx->callsite->arg_flags; } if (fsize) { flags = MVM_malloc(fsize * sizeof(MVMCallsiteEntry)); memcpy(flags, src_flags, fsize * sizeof(MVMCallsiteEntry)); } res->flag_count = fsize; res->arg_flags = flags; res->arg_count = ctx->arg_count; res->num_pos = ctx->num_pos; return res; } /* Copy a callsite unless it is interned. */ MVMCallsite * MVM_args_copy_uninterned_callsite(MVMThreadContext *tc, MVMArgProcContext *ctx) { return ctx->callsite->is_interned && !ctx->arg_flags ? ctx->callsite : MVM_args_copy_callsite(tc, ctx); } MVMObject * MVM_args_use_capture(MVMThreadContext *tc, MVMFrame *f) { /* We used to try and avoid some GC churn by keeping one call capture per * thread that was mutated. However, its lifetime was difficult to manage, * leading to leaks and subtle bugs. So, we use save_capture always now * for this; we may later eliminate it using escape analysis, or treat * it differently in the optimizer. */ return MVM_args_save_capture(tc, f); } MVMObject * MVM_args_save_capture(MVMThreadContext *tc, MVMFrame *frame) { MVMObject *cc_obj; MVMROOT(tc, frame, { MVMCallCapture *cc = (MVMCallCapture *) (cc_obj = MVM_repr_alloc_init(tc, tc->instance->CallCapture)); /* Copy the arguments. */ MVMuint32 arg_size = frame->params.arg_count * sizeof(MVMRegister); MVMRegister *args = MVM_malloc(arg_size); memcpy(args, frame->params.args, arg_size); /* Set up the call capture, copying the callsite. */ cc->body.apc = (MVMArgProcContext *)MVM_calloc(1, sizeof(MVMArgProcContext)); MVM_args_proc_init(tc, cc->body.apc, MVM_args_copy_uninterned_callsite(tc, &frame->params), args); }); return cc_obj; } static void flatten_args(MVMThreadContext *tc, MVMArgProcContext *ctx); /* Checks that the passed arguments fall within the expected arity. */ static void arity_fail(MVMThreadContext *tc, MVMuint16 got, MVMuint16 min, MVMuint16 max) { char *problem = got > max ? "Too many" : "Too few"; if (min == max) MVM_exception_throw_adhoc(tc, "%s positionals passed; expected %d argument%s but got %d", problem, min, (min == 1 ? "" : "s"), got); else if (max == 0xFFFF) MVM_exception_throw_adhoc(tc, "%s positionals passed; expected at least %d arguments but got only %d", problem, min, got); else MVM_exception_throw_adhoc(tc, "%s positionals passed; expected %d %s %d arguments but got %d", problem, min, (min + 1 == max ? "or" : "to"), max, got); } void MVM_args_checkarity(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint16 min, MVMuint16 max) { MVMuint16 num_pos; flatten_args(tc, ctx); num_pos = ctx->num_pos; if (num_pos < min || num_pos > max) arity_fail(tc, num_pos, min, max); } /* Get positional arguments. */ #define find_pos_arg(ctx, pos, result) do { \ if (pos < ctx->num_pos) { \ result.arg = ctx->args[pos]; \ result.flags = (ctx->arg_flags ? ctx->arg_flags : ctx->callsite->arg_flags)[pos]; \ result.exists = 1; \ } \ else { \ result.arg.s = NULL; \ result.exists = 0; \ } \ } while (0) static MVMObject * decont_arg(MVMThreadContext *tc, MVMObject *arg) { MVMContainerSpec const *contspec = STABLE(arg)->container_spec; if (contspec) { if (contspec->fetch_never_invokes) { MVMRegister r; contspec->fetch(tc, arg, &r); return r.o; } else { MVM_exception_throw_adhoc(tc, "Cannot auto-decontainerize argument"); } } else { return arg; } } #define autounbox(tc, type_flag, expected, result) do { \ if (result.exists && !(result.flags & type_flag)) { \ if (result.flags & MVM_CALLSITE_ARG_OBJ) { \ MVMObject *obj = decont_arg(tc, result.arg.o); \ switch (type_flag) { \ case MVM_CALLSITE_ARG_INT: \ result.arg.i64 = MVM_repr_get_int(tc, obj); \ result.flags = MVM_CALLSITE_ARG_INT; \ break; \ case MVM_CALLSITE_ARG_NUM: \ result.arg.n64 = MVM_repr_get_num(tc, obj); \ result.flags = MVM_CALLSITE_ARG_NUM; \ break; \ case MVM_CALLSITE_ARG_STR: \ result.arg.s = MVM_repr_get_str(tc, obj); \ result.flags = MVM_CALLSITE_ARG_STR; \ break; \ default: \ MVM_exception_throw_adhoc(tc, "Failed to unbox object to " expected); \ } \ } \ if (!(result.flags & type_flag)) { \ switch (type_flag) { \ case MVM_CALLSITE_ARG_INT: \ switch (result.flags & MVM_CALLSITE_ARG_MASK) { \ case MVM_CALLSITE_ARG_NUM: \ MVM_exception_throw_adhoc(tc, "Expected native int argument, but got num"); \ case MVM_CALLSITE_ARG_STR: \ MVM_exception_throw_adhoc(tc, "Expected native int argument, but got str"); \ default: \ MVM_exception_throw_adhoc(tc, "unreachable unbox 1"); \ } \ break; \ case MVM_CALLSITE_ARG_NUM: \ switch (result.flags & MVM_CALLSITE_ARG_MASK) { \ case MVM_CALLSITE_ARG_INT: \ MVM_exception_throw_adhoc(tc, "Expected native num argument, but got int"); \ case MVM_CALLSITE_ARG_STR: \ MVM_exception_throw_adhoc(tc, "Expected native num argument, but got str"); \ default: \ MVM_exception_throw_adhoc(tc, "unreachable unbox 2"); \ } \ break; \ case MVM_CALLSITE_ARG_STR: \ switch (result.flags & MVM_CALLSITE_ARG_MASK) { \ case MVM_CALLSITE_ARG_INT: \ MVM_exception_throw_adhoc(tc, "Expected native str argument, but got int"); \ case MVM_CALLSITE_ARG_NUM: \ MVM_exception_throw_adhoc(tc, "Expected native str argument, but got num"); \ default: \ MVM_exception_throw_adhoc(tc, "unreachable unbox 3"); \ } \ break; \ default: \ MVM_exception_throw_adhoc(tc, "unreachable unbox 4"); \ } \ } \ } \ } while (0) #define args_get_pos(tc, ctx, pos, required, result) do { \ find_pos_arg(ctx, pos, result); \ if (!result.exists && required) { \ MVM_exception_throw_adhoc(tc, "Not enough positional arguments; needed at least %u", pos + 1); \ } \ } while (0) #define autobox(tc, target, result, box_type_obj, is_object, set_func, dest) do { \ MVMObject *box, *box_type; \ if (is_object) MVM_gc_root_temp_push(tc, (MVMCollectable **)&result); \ box_type = target->static_info->body.cu->body.hll_config->box_type_obj; \ box = REPR(box_type)->allocate(tc, STABLE(box_type)); \ MVM_gc_root_temp_push(tc, (MVMCollectable **)&box); \ if (REPR(box)->initialize) \ REPR(box)->initialize(tc, STABLE(box), box, OBJECT_BODY(box)); \ REPR(box)->box_funcs.set_func(tc, STABLE(box), box, OBJECT_BODY(box), result); \ if (is_object) MVM_gc_root_temp_pop_n(tc, 2); \ else MVM_gc_root_temp_pop(tc); \ dest = box; \ } while (0) #define autobox_int(tc, target, result, dest) do { \ MVMObject *box, *box_type; \ MVMint64 result_int = result; \ box_type = target->static_info->body.cu->body.hll_config->int_box_type; \ dest = MVM_intcache_get(tc, box_type, result_int); \ if (!dest) { \ box = REPR(box_type)->allocate(tc, STABLE(box_type)); \ MVM_gc_root_temp_push(tc, (MVMCollectable **)&box); \ if (REPR(box)->initialize) \ REPR(box)->initialize(tc, STABLE(box), box, OBJECT_BODY(box)); \ REPR(box)->box_funcs.set_int(tc, STABLE(box), box, OBJECT_BODY(box), result_int); \ MVM_gc_root_temp_pop(tc); \ dest = box; \ } \ } while (0) #define autobox_switch(tc, result) do { \ if (result.exists) { \ switch (result.flags & MVM_CALLSITE_ARG_MASK) { \ case MVM_CALLSITE_ARG_OBJ: \ break; \ case MVM_CALLSITE_ARG_INT: \ autobox_int(tc, tc->cur_frame, result.arg.i64, result.arg.o); \ break; \ case MVM_CALLSITE_ARG_NUM: \ autobox(tc, tc->cur_frame, result.arg.n64, num_box_type, 0, set_num, result.arg.o); \ break; \ case MVM_CALLSITE_ARG_STR: \ autobox(tc, tc->cur_frame, result.arg.s, str_box_type, 1, set_str, result.arg.o); \ break; \ default: \ MVM_exception_throw_adhoc(tc, "invalid type flag"); \ } \ } \ } while (0) MVMObject * MVM_args_get_required_pos_obj(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint32 pos) { MVMArgInfo result; args_get_pos(tc, ctx, pos, MVM_ARG_REQUIRED, result); autobox_switch(tc, result); return result.arg.o; } MVMArgInfo MVM_args_get_optional_pos_obj(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint32 pos) { MVMArgInfo result; args_get_pos(tc, ctx, pos, MVM_ARG_OPTIONAL, result); autobox_switch(tc, result); return result; } MVMint64 MVM_args_get_required_pos_int(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint32 pos) { MVMArgInfo result; args_get_pos(tc, ctx, pos, MVM_ARG_REQUIRED, result); autounbox(tc, MVM_CALLSITE_ARG_INT, "integer", result); return result.arg.i64; } MVMArgInfo MVM_args_get_optional_pos_int(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint32 pos) { MVMArgInfo result; args_get_pos(tc, ctx, pos, MVM_ARG_OPTIONAL, result); autounbox(tc, MVM_CALLSITE_ARG_INT, "integer", result); return result; } MVMArgInfo MVM_args_get_pos_num(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint32 pos, MVMuint8 required) { MVMArgInfo result; args_get_pos(tc, ctx, pos, required, result); autounbox(tc, MVM_CALLSITE_ARG_NUM, "number", result); return result; } MVMString * MVM_args_get_required_pos_str(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint32 pos) { MVMArgInfo result; args_get_pos(tc, ctx, pos, MVM_ARG_REQUIRED, result); autounbox(tc, MVM_CALLSITE_ARG_STR, "string", result); return result.arg.s; } MVMArgInfo MVM_args_get_optional_pos_str(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint32 pos) { MVMArgInfo result; args_get_pos(tc, ctx, pos, MVM_ARG_OPTIONAL, result); autounbox(tc, MVM_CALLSITE_ARG_STR, "string", result); return result; } MVMArgInfo MVM_args_get_pos_uint(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint32 pos, MVMuint8 required) { MVMArgInfo result; args_get_pos(tc, ctx, pos, required, result); autounbox(tc, MVM_CALLSITE_ARG_INT, "unsigned integer", result); return result; } #define args_get_named(tc, ctx, name, required) do { \ \ MVMuint32 flag_pos, arg_pos; \ result.arg.s = NULL; \ result.exists = 0; \ \ for (flag_pos = arg_pos = ctx->num_pos; arg_pos < ctx->arg_count; flag_pos++, arg_pos += 2) { \ if (MVM_string_equal(tc, ctx->args[arg_pos].s, name)) { \ result.arg = ctx->args[arg_pos + 1]; \ result.flags = (ctx->arg_flags ? ctx->arg_flags : ctx->callsite->arg_flags)[flag_pos]; \ result.exists = 1; \ result.arg_idx = arg_pos + 1; \ mark_named_used(ctx, (arg_pos - ctx->num_pos)/2); \ break; \ } \ } \ if (!result.exists && required) { \ char *c_name = MVM_string_utf8_encode_C_string(tc, name); \ char *waste[] = { c_name, NULL }; \ MVM_exception_throw_adhoc_free(tc, waste, "Required named parameter '%s' not passed", c_name); \ } \ } while (0) MVMArgInfo MVM_args_get_named_obj(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMString *name, MVMuint8 required) { MVMArgInfo result; args_get_named(tc, ctx, name, required); autobox_switch(tc, result); return result; } MVMArgInfo MVM_args_get_named_int(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMString *name, MVMuint8 required) { MVMArgInfo result; args_get_named(tc, ctx, name, required); autounbox(tc, MVM_CALLSITE_ARG_INT, "integer", result); return result; } MVMArgInfo MVM_args_get_named_num(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMString *name, MVMuint8 required) { MVMArgInfo result; args_get_named(tc, ctx, name, required); autounbox(tc, MVM_CALLSITE_ARG_NUM, "number", result); return result; } MVMArgInfo MVM_args_get_named_str(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMString *name, MVMuint8 required) { MVMArgInfo result; args_get_named(tc, ctx, name, required); autounbox(tc, MVM_CALLSITE_ARG_STR, "string", result); return result; } MVMArgInfo MVM_args_get_named_uint(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMString *name, MVMuint8 required) { MVMArgInfo result; args_get_named(tc, ctx, name, required); autounbox(tc, MVM_CALLSITE_ARG_INT, "unsigned integer", result); return result; } MVMint64 MVM_args_has_named(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMString *name) { MVMuint32 flag_pos, arg_pos; for (flag_pos = arg_pos = ctx->num_pos; arg_pos < ctx->arg_count; flag_pos++, arg_pos += 2) if (MVM_string_equal(tc, ctx->args[arg_pos].s, name)) return 1; return 0; } void MVM_args_assert_nameds_used(MVMThreadContext *tc, MVMArgProcContext *ctx) { MVMuint16 size = ctx->named_used_size; MVMuint16 i; if (size > 64) { for (i = 0; i < size; i++) if (!ctx->named_used.byte_array[i]) { char *c_param = MVM_string_utf8_encode_C_string(tc, ctx->args[ctx->num_pos + 2 * i].s); char *waste[] = { c_param, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Unexpected named argument '%s' passed", c_param); } } else { for (i = 0; i < size; i++) if (!(ctx->named_used.bit_field & ((MVMuint64)1 << i))) { char *c_param = MVM_string_utf8_encode_C_string(tc, ctx->args[ctx->num_pos + 2 * i].s); char *waste[] = { c_param, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Unexpected named argument '%s' passed", c_param); } } } void MVM_args_throw_named_unused_error(MVMThreadContext *tc, MVMString *name) { char *c_param = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_param, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Unexpected named argument '%s' passed", c_param); } /* Result setting. The frameless flag indicates that the currently * executing code does not have a MVMFrame of its own. */ static MVMObject * decont_result(MVMThreadContext *tc, MVMObject *result) { MVMContainerSpec const *contspec = STABLE(result)->container_spec; if (contspec) { if (contspec->fetch_never_invokes) { MVMRegister r; contspec->fetch(tc, result, &r); return r.o; } else { MVM_exception_throw_adhoc(tc, "Cannot auto-decontainerize return value"); } } else { return result; } } void MVM_args_set_result_obj(MVMThreadContext *tc, MVMObject *result, MVMint32 frameless) { MVMFrame *target = frameless ? tc->cur_frame : tc->cur_frame->caller; if (target) { switch (target->return_type) { case MVM_RETURN_VOID: break; case MVM_RETURN_OBJ: target->return_value->o = result; break; case MVM_RETURN_INT: target->return_value->i64 = MVM_repr_get_int(tc, decont_result(tc, result)); break; case MVM_RETURN_NUM: target->return_value->n64 = MVM_repr_get_num(tc, decont_result(tc, result)); break; case MVM_RETURN_STR: target->return_value->s = MVM_repr_get_str(tc, decont_result(tc, result)); break; default: MVM_exception_throw_adhoc(tc, "Result return coercion from obj NYI; expects type %u", target->return_type); } } } void MVM_args_set_result_int(MVMThreadContext *tc, MVMint64 result, MVMint32 frameless) { MVMFrame *target = frameless ? tc->cur_frame : tc->cur_frame->caller; if (target) { switch (target->return_type) { case MVM_RETURN_VOID: break; case MVM_RETURN_INT: target->return_value->i64 = result; break; case MVM_RETURN_NUM: target->return_value->n64 = (MVMnum64)result; break; case MVM_RETURN_OBJ: autobox(tc, target, result, int_box_type, 0, set_int, target->return_value->o); break; default: MVM_exception_throw_adhoc(tc, "Result return coercion from int NYI; expects type %u", target->return_type); } } } void MVM_args_set_result_num(MVMThreadContext *tc, MVMnum64 result, MVMint32 frameless) { MVMFrame *target = frameless ? tc->cur_frame : tc->cur_frame->caller; if (target) { switch (target->return_type) { case MVM_RETURN_VOID: break; case MVM_RETURN_NUM: target->return_value->n64 = result; break; case MVM_RETURN_INT: target->return_value->i64 = (MVMint64)result; break; case MVM_RETURN_OBJ: autobox(tc, target, result, num_box_type, 0, set_num, target->return_value->o); break; default: MVM_exception_throw_adhoc(tc, "Result return coercion from num NYI; expects type %u", target->return_type); } } } void MVM_args_set_result_str(MVMThreadContext *tc, MVMString *result, MVMint32 frameless) { MVMFrame *target = frameless ? tc->cur_frame : tc->cur_frame->caller; if (target) { switch (target->return_type) { case MVM_RETURN_VOID: break; case MVM_RETURN_STR: target->return_value->s = result; break; case MVM_RETURN_OBJ: autobox(tc, target, result, str_box_type, 1, set_str, target->return_value->o); break; default: MVM_exception_throw_adhoc(tc, "Result return coercion from str NYI; expects type %u", target->return_type); } } } void MVM_args_assert_void_return_ok(MVMThreadContext *tc, MVMint32 frameless) { MVMFrame *target = frameless ? tc->cur_frame : tc->cur_frame->caller; if (target && target->return_type != MVM_RETURN_VOID && tc->cur_frame != tc->thread_entry_frame) MVM_exception_throw_adhoc(tc, "Void return not allowed to context requiring a return value"); } #define box_slurpy_pos(tc, type, result, box, value, reg, box_type_obj, name, set_func) do { \ type = (*(tc->interp_cu))->body.hll_config->box_type_obj; \ if (!type || IS_CONCRETE(type)) { \ MVM_exception_throw_adhoc(tc, "Missing hll " name " box type"); \ } \ box = REPR(type)->allocate(tc, STABLE(type)); \ if (REPR(box)->initialize) \ REPR(box)->initialize(tc, STABLE(box), box, OBJECT_BODY(box)); \ REPR(box)->box_funcs.set_func(tc, STABLE(box), box, \ OBJECT_BODY(box), value); \ reg.o = box; \ REPR(result)->pos_funcs.push(tc, STABLE(result), result, \ OBJECT_BODY(result), reg, MVM_reg_obj); \ } while (0) #define box_slurpy_pos_int(tc, type, result, box, value, reg, box_type_obj, name, set_func) do { \ type = (*(tc->interp_cu))->body.hll_config->box_type_obj; \ if (!type || IS_CONCRETE(type)) { \ MVM_exception_throw_adhoc(tc, "Missing hll " name " box type"); \ } \ box = MVM_intcache_get(tc, type, value); \ if (!box) { \ box = REPR(type)->allocate(tc, STABLE(type)); \ if (REPR(box)->initialize) \ REPR(box)->initialize(tc, STABLE(box), box, OBJECT_BODY(box)); \ REPR(box)->box_funcs.set_func(tc, STABLE(box), box, \ OBJECT_BODY(box), value); \ } \ reg.o = box; \ REPR(result)->pos_funcs.push(tc, STABLE(result), result, \ OBJECT_BODY(result), reg, MVM_reg_obj); \ } while (0) MVMObject * MVM_args_slurpy_positional(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint16 pos) { MVMObject *type = (*(tc->interp_cu))->body.hll_config->slurpy_array_type, *result = NULL, *box = NULL; MVMArgInfo arg_info; MVMRegister reg; if (!type || IS_CONCRETE(type)) { MVM_exception_throw_adhoc(tc, "Missing hll slurpy array type"); } MVM_gc_root_temp_push(tc, (MVMCollectable **)&type); result = REPR(type)->allocate(tc, STABLE(type)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&result); if (REPR(result)->initialize) REPR(result)->initialize(tc, STABLE(result), result, OBJECT_BODY(result)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&box); find_pos_arg(ctx, pos, arg_info); pos++; while (arg_info.exists) { if (arg_info.flags & MVM_CALLSITE_ARG_FLAT) { MVM_exception_throw_adhoc(tc, "Arg has not been flattened in slurpy_positional"); } /* XXX theoretically needs to handle native arrays I guess */ switch (arg_info.flags & MVM_CALLSITE_ARG_MASK) { case MVM_CALLSITE_ARG_OBJ: { MVM_repr_push_o(tc, result, arg_info.arg.o); break; } case MVM_CALLSITE_ARG_INT:{ box_slurpy_pos_int(tc, type, result, box, arg_info.arg.i64, reg, int_box_type, "int", set_int); break; } case MVM_CALLSITE_ARG_NUM: { box_slurpy_pos(tc, type, result, box, arg_info.arg.n64, reg, num_box_type, "num", set_num); break; } case MVM_CALLSITE_ARG_STR: { MVM_gc_root_temp_push(tc, (MVMCollectable **)&arg_info.arg.s); box_slurpy_pos(tc, type, result, box, arg_info.arg.s, reg, str_box_type, "str", set_str); MVM_gc_root_temp_pop(tc); break; } default: MVM_exception_throw_adhoc(tc, "arg flag is empty in slurpy positional"); } find_pos_arg(ctx, pos, arg_info); pos++; if (pos == 1) break; /* overflow?! */ } MVM_gc_root_temp_pop_n(tc, 3); return result; } #define box_slurpy_named(tc, type, result, box, value, reg, box_type_obj, name, set_func, key) do { \ type = (*(tc->interp_cu))->body.hll_config->box_type_obj; \ if (!type || IS_CONCRETE(type)) { \ MVM_exception_throw_adhoc(tc, "Missing hll " name " box type"); \ } \ box = REPR(type)->allocate(tc, STABLE(type)); \ if (REPR(box)->initialize) \ REPR(box)->initialize(tc, STABLE(box), box, OBJECT_BODY(box)); \ REPR(box)->box_funcs.set_func(tc, STABLE(box), box, \ OBJECT_BODY(box), value); \ reg.o = box; \ REPR(result)->ass_funcs.bind_key(tc, STABLE(result), result, \ OBJECT_BODY(result), (MVMObject *)key, reg, MVM_reg_obj); \ } while (0) MVMObject * MVM_args_slurpy_named(MVMThreadContext *tc, MVMArgProcContext *ctx) { MVMObject *type = (*(tc->interp_cu))->body.hll_config->slurpy_hash_type, *result = NULL, *box = NULL; MVMArgInfo arg_info; MVMuint32 flag_pos, arg_pos; MVMRegister reg; arg_info.exists = 0; if (!type || IS_CONCRETE(type)) { MVM_exception_throw_adhoc(tc, "Missing hll slurpy hash type"); } result = REPR(type)->allocate(tc, STABLE(type)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&result); if (REPR(result)->initialize) REPR(result)->initialize(tc, STABLE(result), result, OBJECT_BODY(result)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&box); for (flag_pos = arg_pos = ctx->num_pos; arg_pos < ctx->arg_count; flag_pos++, arg_pos += 2) { MVMString *key; if (is_named_used(ctx, flag_pos - ctx->num_pos)) continue; key = ctx->args[arg_pos].s; if (!key || !IS_CONCRETE(key)) { MVM_exception_throw_adhoc(tc, "slurpy hash needs concrete key"); } arg_info.arg = ctx->args[arg_pos + 1]; arg_info.flags = (ctx->arg_flags ? ctx->arg_flags : ctx->callsite->arg_flags)[flag_pos]; arg_info.exists = 1; if (arg_info.flags & MVM_CALLSITE_ARG_FLAT) { MVM_exception_throw_adhoc(tc, "Arg has not been flattened in slurpy_named"); } switch (arg_info.flags & MVM_CALLSITE_ARG_MASK) { case MVM_CALLSITE_ARG_OBJ: { REPR(result)->ass_funcs.bind_key(tc, STABLE(result), result, OBJECT_BODY(result), (MVMObject *)key, arg_info.arg, MVM_reg_obj); break; } case MVM_CALLSITE_ARG_INT: { MVM_gc_root_temp_push(tc, (MVMCollectable **)&key); box_slurpy_named(tc, type, result, box, arg_info.arg.i64, reg, int_box_type, "int", set_int, key); MVM_gc_root_temp_pop(tc); break; } case MVM_CALLSITE_ARG_NUM: { MVM_gc_root_temp_push(tc, (MVMCollectable **)&key); box_slurpy_named(tc, type, result, box, arg_info.arg.n64, reg, num_box_type, "num", set_num, key); MVM_gc_root_temp_pop(tc); break; } case MVM_CALLSITE_ARG_STR: { MVM_gc_root_temp_push(tc, (MVMCollectable **)&key); MVM_gc_root_temp_push(tc, (MVMCollectable **)&arg_info.arg.s); box_slurpy_named(tc, type, result, box, arg_info.arg.s, reg, str_box_type, "str", set_str, key); MVM_gc_root_temp_pop_n(tc, 2); break; } default: MVM_exception_throw_adhoc(tc, "arg flag is empty in slurpy named"); } } MVM_gc_root_temp_pop_n(tc, 2); return result; } static MVMint32 seen_name(MVMThreadContext *tc, MVMString *name, MVMRegister *new_args, MVMint32 first_named, MVMint32 num_new_args) { MVMint32 j; for (j = first_named; j < num_new_args; j += 2) if (MVM_string_equal(tc, new_args[j].s, name)) return 1; return 0; } static void flatten_args(MVMThreadContext *tc, MVMArgProcContext *ctx) { MVMArgInfo arg_info; MVMint32 flag_pos = 0, arg_pos = 0, new_arg_pos = 0, new_arg_flags_size = ctx->arg_count > 0x7FFF ? ctx->arg_count : ctx->arg_count * 2, new_args_size = new_arg_flags_size, i, new_flag_pos = 0, new_num_pos = 0; MVMCallsiteEntry *new_arg_flags; MVMRegister *new_args; if (!ctx->callsite->has_flattening) return; new_arg_flags = MVM_malloc(new_arg_flags_size * sizeof(MVMCallsiteEntry)); new_args = MVM_malloc(new_args_size * sizeof(MVMRegister)); /* First flatten any positionals in amongst any non-flattening * positionals. */ for ( ; arg_pos < ctx->num_pos; arg_pos++) { arg_info.arg = ctx->args[arg_pos]; arg_info.flags = ctx->callsite->arg_flags[arg_pos]; arg_info.exists = 1; /* Skip it if it's not flattening or is null. The bytecode loader * verifies it's a MVM_CALLSITE_ARG_OBJ. */ if ((arg_info.flags & MVM_CALLSITE_ARG_FLAT) && arg_info.arg.o) { MVMObject *list = arg_info.arg.o; MVMint64 count = REPR(list)->elems(tc, STABLE(list), list, OBJECT_BODY(list)); MVMStorageSpec lss = REPR(list)->pos_funcs.get_elem_storage_spec(tc, STABLE(list)); if ((MVMint64)new_arg_pos + count > 0xFFFF) { MVM_exception_throw_adhoc(tc, "Too many arguments in flattening array."); } for (i = 0; i < count; i++) { if (new_arg_pos == new_args_size) { new_args = MVM_realloc(new_args, (new_args_size *= 2) * sizeof(MVMRegister)); } if (new_flag_pos == new_arg_flags_size) { new_arg_flags = MVM_realloc(new_arg_flags, (new_arg_flags_size *= 2) * sizeof(MVMCallsiteEntry)); } switch (lss.inlineable ? lss.boxed_primitive : 0) { case MVM_STORAGE_SPEC_BP_INT: (new_args + new_arg_pos++)->i64 = MVM_repr_at_pos_i(tc, list, i); new_arg_flags[new_flag_pos++] = MVM_CALLSITE_ARG_INT; break; case MVM_STORAGE_SPEC_BP_NUM: (new_args + new_arg_pos++)->n64 = MVM_repr_at_pos_n(tc, list, i); new_arg_flags[new_flag_pos++] = MVM_CALLSITE_ARG_NUM; break; case MVM_STORAGE_SPEC_BP_STR: (new_args + new_arg_pos++)->s = MVM_repr_at_pos_s(tc, list, i); new_arg_flags[new_flag_pos++] = MVM_CALLSITE_ARG_STR; break; default: (new_args + new_arg_pos++)->o = MVM_repr_at_pos_o(tc, list, i); new_arg_flags[new_flag_pos++] = MVM_CALLSITE_ARG_OBJ; break; } } } else { if (new_arg_pos == new_args_size) { new_args = MVM_realloc(new_args, (new_args_size *= 2) * sizeof(MVMRegister)); } if (new_flag_pos == new_arg_flags_size) { new_arg_flags = MVM_realloc(new_arg_flags, (new_arg_flags_size *= 2) * sizeof(MVMCallsiteEntry)); } *(new_args + new_arg_pos++) = arg_info.arg; new_arg_flags[new_flag_pos++] = arg_info.flags; } } new_num_pos = new_arg_pos; /* Then flatten in any nameds, amongst non-flattening nameds, starting * from the right and skipping duplicates. */ flag_pos = ctx->callsite->flag_count; arg_pos = ctx->arg_count; while (flag_pos > ctx->num_pos) { flag_pos--; if (ctx->callsite->arg_flags[flag_pos] & MVM_CALLSITE_ARG_FLAT_NAMED) { arg_info.flags = ctx->callsite->arg_flags[flag_pos]; arg_pos--; arg_info.arg = ctx->args[arg_pos]; if (arg_info.arg.o && REPR(arg_info.arg.o)->ID == MVM_REPR_ID_MVMHash) { MVMHashBody *body = &((MVMHash *)arg_info.arg.o)->body; MVMHashEntry *current, *tmp; unsigned bucket_tmp; HASH_ITER(hash_handle, body->hash_head, current, tmp, bucket_tmp) { MVMString *arg_name = MVM_HASH_KEY(current); if (!seen_name(tc, arg_name, new_args, new_num_pos, new_arg_pos)) { if (new_arg_pos + 1 >= new_args_size) { new_args = MVM_realloc(new_args, (new_args_size *= 2) * sizeof(MVMRegister)); } if (new_flag_pos == new_arg_flags_size) { new_arg_flags = MVM_realloc(new_arg_flags, (new_arg_flags_size *= 2) * sizeof(MVMCallsiteEntry)); } (new_args + new_arg_pos++)->s = arg_name; (new_args + new_arg_pos++)->o = current->value; new_arg_flags[new_flag_pos++] = MVM_CALLSITE_ARG_NAMED | MVM_CALLSITE_ARG_OBJ; } } } else if (arg_info.arg.o) { MVM_exception_throw_adhoc(tc, "flattening of other hash reprs NYI."); } } else { arg_pos -= 2; if (!seen_name(tc, (ctx->args + arg_pos)->s, new_args, new_num_pos, new_arg_pos)) { if (new_arg_pos + 1 >= new_args_size) { new_args = MVM_realloc(new_args, (new_args_size *= 2) * sizeof(MVMRegister)); } if (new_flag_pos == new_arg_flags_size) { new_arg_flags = MVM_realloc(new_arg_flags, (new_arg_flags_size *= 2) * sizeof(MVMCallsiteEntry)); } (new_args + new_arg_pos++)->s = (ctx->args + arg_pos)->s; *(new_args + new_arg_pos++) = *(ctx->args + arg_pos + 1); new_arg_flags[new_flag_pos++] = ctx->callsite->arg_flags[flag_pos]; } } } if (ctx->named_used_size > 64) MVM_fixed_size_free(tc, tc->instance->fsa, ctx->named_used_size, ctx->named_used.byte_array); init_named_used(tc, ctx, (new_arg_pos - new_num_pos) / 2); ctx->args = new_args; ctx->arg_count = new_arg_pos; ctx->num_pos = new_num_pos; ctx->arg_flags = new_arg_flags; ctx->flag_count = new_flag_pos; } /* Does the common setup work when we jump the interpreter into a chosen * call from C-land. */ void MVM_args_setup_thunk(MVMThreadContext *tc, MVMRegister *res_reg, MVMReturnType return_type, MVMCallsite *callsite) { MVMFrame *cur_frame = tc->cur_frame; cur_frame->return_value = res_reg; cur_frame->return_type = return_type; cur_frame->return_address = *(tc->interp_cur_op); cur_frame->cur_args_callsite = callsite; } /* Custom bind failure handling. Invokes the HLL's bind failure handler, with * an argument capture */ static void bind_error_return(MVMThreadContext *tc, void *sr_data) { MVMRegister *r = (MVMRegister *)sr_data; MVMObject *res = r->o; MVM_free(r); if (tc->cur_frame->caller) MVM_args_set_result_obj(tc, res, 0); else MVM_exception_throw_adhoc(tc, "No caller to return to after bind_error"); MVM_frame_try_return(tc); } static void bind_error_unwind(MVMThreadContext *tc, void *sr_data) { MVM_free(sr_data); } static void mark_sr_data(MVMThreadContext *tc, MVMFrame *frame, MVMGCWorklist *worklist) { MVMRegister *r = (MVMRegister *)frame->extra->special_return_data; MVM_gc_worklist_add(tc, worklist, &r->o); } void MVM_args_bind_failed(MVMThreadContext *tc) { MVMRegister *res; MVMCallsite *inv_arg_callsite; /* Capture arguments into a call capture, to pass off for analysis. */ MVMObject *cc_obj = MVM_args_save_capture(tc, tc->cur_frame); /* Invoke the HLL's bind failure handler. */ MVMFrame *cur_frame = tc->cur_frame; MVMObject *bind_error = MVM_hll_current(tc)->bind_error; if (!bind_error) MVM_exception_throw_adhoc(tc, "Bind error occurred, but HLL has no handler"); bind_error = MVM_frame_find_invokee(tc, bind_error, NULL); res = MVM_calloc(1, sizeof(MVMRegister)); inv_arg_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_INV_ARG); MVM_args_setup_thunk(tc, res, MVM_RETURN_OBJ, inv_arg_callsite); MVM_frame_special_return(tc, cur_frame, bind_error_return, bind_error_unwind, res, mark_sr_data); cur_frame->args[0].o = cc_obj; STABLE(bind_error)->invoke(tc, bind_error, inv_arg_callsite, cur_frame->args); } MoarVM-2018.03/src/core/args.h0000644000175000017510000001164213237701240016032 0ustar samanthasamantha/* Argument processing context. */ struct MVMArgProcContext { /* The callsite we're processing. */ MVMCallsite *callsite; /* The set of flags (only set if we flattened, otherwise we use the ones * from callsite). */ MVMCallsiteEntry *arg_flags; /* The arguments. */ MVMRegister *args; /* Indexes of used nameds. If named_used_size is less than or equal to * 64, it will be a bit field. Otherwise, it will be a pointer to a * byte array. */ union { MVMuint8 *byte_array; MVMuint64 bit_field; } named_used; MVMuint16 named_used_size; /* The total argument count (including 2 for each * named arg). */ MVMuint16 arg_count; /* Number of positionals. */ MVMuint16 num_pos; /* The number of arg flags; only valid if arg_flags isn't NULL. */ MVMuint16 flag_count; }; /* Expected return type flags. */ typedef MVMuint8 MVMReturnType; #define MVM_RETURN_VOID 0 #define MVM_RETURN_OBJ 1 #define MVM_RETURN_INT 2 #define MVM_RETURN_NUM 4 #define MVM_RETURN_STR 8 /* Struct used for returning information about an argument. */ struct MVMArgInfo { MVMRegister arg; MVMCallsiteEntry flags; MVMuint8 exists; MVMuint16 arg_idx; /* Set only for nameds, obvious for pos */ }; /* Argument processing context handling. */ void MVM_args_proc_init(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMCallsite *callsite, MVMRegister *args); void MVM_args_proc_cleanup(MVMThreadContext *tc, MVMArgProcContext *ctx); void MVM_args_checkarity(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint16 min, MVMuint16 max); void MVM_args_checkarity_for_jit(MVMThreadContext *tc, MVMuint16 min, MVMuint16 max); MVMCallsite * MVM_args_copy_callsite(MVMThreadContext *tc, MVMArgProcContext *ctx); MVMCallsite * MVM_args_copy_uninterned_callsite(MVMThreadContext *tc, MVMArgProcContext *ctx); MVM_PUBLIC MVMObject * MVM_args_use_capture(MVMThreadContext *tc, MVMFrame *f); MVM_PUBLIC MVMObject * MVM_args_save_capture(MVMThreadContext *tc, MVMFrame *f); void MVM_args_marked_named_used(MVMThreadContext *tc, MVMuint32 idx); void MVM_args_throw_named_unused_error(MVMThreadContext *tc, MVMString *name); /* Argument access by position. */ MVMObject * MVM_args_get_required_pos_obj(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint32 pos); MVMArgInfo MVM_args_get_optional_pos_obj(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint32 pos); MVMint64 MVM_args_get_required_pos_int(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint32 pos); MVMArgInfo MVM_args_get_optional_pos_int(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint32 pos); MVMArgInfo MVM_args_get_pos_num(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint32 pos, MVMuint8 required); MVMString * MVM_args_get_required_pos_str(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint32 pos); MVMArgInfo MVM_args_get_optional_pos_str(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint32 pos); MVMArgInfo MVM_args_get_pos_uint(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint32 pos, MVMuint8 required); MVMObject * MVM_args_slurpy_positional(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMuint16 pos); /* Argument access by name. */ MVMArgInfo MVM_args_get_named_obj(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMString *name, MVMuint8 required); MVMArgInfo MVM_args_get_named_int(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMString *name, MVMuint8 required); MVMArgInfo MVM_args_get_named_num(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMString *name, MVMuint8 required); MVMArgInfo MVM_args_get_named_str(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMString *name, MVMuint8 required); MVMArgInfo MVM_args_get_named_uint(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMString *name, MVMuint8 required); MVMObject * MVM_args_slurpy_named(MVMThreadContext *tc, MVMArgProcContext *ctx); MVMint64 MVM_args_has_named(MVMThreadContext *tc, MVMArgProcContext *ctx, MVMString *name); void MVM_args_assert_nameds_used(MVMThreadContext *tc, MVMArgProcContext *ctx); /* Result setting. */ void MVM_args_set_result_obj(MVMThreadContext *tc, MVMObject *result, MVMint32 frameless); void MVM_args_set_result_int(MVMThreadContext *tc, MVMint64 result, MVMint32 frameless); void MVM_args_set_result_num(MVMThreadContext *tc, MVMnum64 result, MVMint32 frameless); void MVM_args_set_result_str(MVMThreadContext *tc, MVMString *result, MVMint32 frameless); void MVM_args_assert_void_return_ok(MVMThreadContext *tc, MVMint32 frameless); /* Setting up calls from C-land. */ MVM_PUBLIC void MVM_args_setup_thunk(MVMThreadContext *tc, MVMRegister *return_value, MVMReturnType return_type, MVMCallsite *callsite); /* Custom bind failure handling. */ void MVM_args_bind_failed(MVMThreadContext *tc); /* Result setting frame constants. */ #define MVM_RETURN_CALLER_FRAME 0 #define MVM_RETURN_CURRENT_FRAME 1 /* Required/optional constants. */ #define MVM_ARG_OPTIONAL 0 #define MVM_ARG_REQUIRED 1 MoarVM-2018.03/src/core/bitmap.h0000644000175000017510000000332713237701240016353 0ustar samanthasamantha/* basic bitmap implementation */ typedef MVMuint64 MVMBitmap; /* Efficient find-first-set; on x86, using `bsf` primitive operation; something * else on other architectures. */ #ifdef __GNUC__ /* also works for clang and friends */ #define MVM_FFS(x) __builtin_ffsll(x) #elif defined(_MSC_VER) MVM_STATIC_INLINE MVMuint32 MVM_FFS(MVMBitmap x) { MVMuint32 i = 0; if (_BitScanForward64(&i, x) == 0) return 0; return i + 1; } #else /* fallback, note that i=0 if no bits are set */ MVM_STATIC_INLINE MVMuint32 MVM_FFS(MVMBitmap x) { MVMuint32 i = 0; while (x) { if (x & (1 << i++)) break; } return i; } #endif /* NB - make this a separate 'library', use it for register bitmap */ /* Witness the elegance of the bitmap for our purposes. */ MVM_STATIC_INLINE void MVM_bitmap_set(MVMBitmap *bits, MVMint32 idx) { bits[idx >> 6] |= (UINT64_C(1) << (idx & 0x3f)); } MVM_STATIC_INLINE MVMuint64 MVM_bitmap_get(MVMBitmap *bits, MVMint32 idx) { return bits[idx >> 6] & (UINT64_C(1) << (idx & 0x3f)); } MVM_STATIC_INLINE void MVM_bitmap_delete(MVMBitmap *bits, MVMint32 idx) { bits[idx >> 6] &= ~(UINT64_C(1) << (idx & 0x3f)); } MVM_STATIC_INLINE void MVM_bitmap_union(MVMBitmap *out, MVMBitmap *a, MVMBitmap *b, MVMint32 n) { MVMint32 i; for (i = 0; i < n; i++) { out[i] = a[i] | b[i]; } } MVM_STATIC_INLINE void MVM_bitmap_difference(MVMBitmap *out, MVMBitmap *a, MVMBitmap *b, MVMint32 n) { MVMint32 i; for (i = 0; i < n; i++) { out[i] = a[i] ^ b[i]; } } MVM_STATIC_INLINE void MVM_bitmap_intersection(MVMBitmap *out, MVMBitmap *a, MVMBitmap *b, MVMint32 n) { MVMint32 i; for (i = 0; i < n; i++) { out[i] = a[i] & b[i]; } } MoarVM-2018.03/src/core/bytecode.c0000644000175000017510000010721313242626641016676 0ustar samanthasamantha#include "moar.h" /* Some constants. */ #define HEADER_SIZE 92 #define MIN_BYTECODE_VERSION 5 #define MAX_BYTECODE_VERSION 5 #define FRAME_HEADER_SIZE (11 * 4 + 3 * 2) #define FRAME_HANDLER_SIZE (4 * 4 + 2 * 2) #define FRAME_SLV_SIZE (2 * 2 + 2 * 4) #define SCDEP_HEADER_OFFSET 12 #define EXTOP_HEADER_OFFSET 20 #define FRAME_HEADER_OFFSET 28 #define CALLSITE_HEADER_OFFSET 36 #define STRING_HEADER_OFFSET 44 #define SCDATA_HEADER_OFFSET 52 #define BYTECODE_HEADER_OFFSET 60 #define ANNOTATION_HEADER_OFFSET 68 #define HLL_NAME_HEADER_OFFSET 76 #define SPECIAL_FRAME_HEADER_OFFSET 80 /* Frame flags. */ #define FRAME_FLAG_EXIT_HANDLER 1 #define FRAME_FLAG_IS_THUNK 2 #define FRAME_FLAG_NO_INLINE 8 /* Describes the current reader state. */ typedef struct { /* General info. */ MVMuint32 version; /* The string heap. */ MVMuint8 *string_seg; MVMuint32 expected_strings; /* The SC dependencies segment. */ MVMuint32 expected_scs; MVMuint8 *sc_seg; /* The extension ops segment. */ MVMuint8 *extop_seg; MVMuint32 expected_extops; /* The frame segment. */ MVMuint32 expected_frames; MVMuint8 *frame_seg; MVMuint16 *frame_outer_fixups; /* The callsites segment. */ MVMuint8 *callsite_seg; MVMuint32 expected_callsites; /* The bytecode segment. */ MVMuint32 bytecode_size; MVMuint8 *bytecode_seg; /* The annotations segment */ MVMuint8 *annotation_seg; MVMuint32 annotation_size; /* HLL name string index */ MVMuint32 hll_str_idx; /* The limit we can not read beyond. */ MVMuint8 *read_limit; /* Array of frames. */ MVMStaticFrame **frames; /* Special frame indexes */ MVMuint32 main_frame; MVMuint32 load_frame; MVMuint32 deserialize_frame; } ReaderState; /* copies memory dependent on endianness */ static void memcpy_endian(void *dest, MVMuint8 *src, size_t size) { #ifdef MVM_BIGENDIAN size_t i; MVMuint8 *destbytes = (MVMuint8 *)dest; for (i = 0; i < size; i++) destbytes[size - i - 1] = src[i]; #else memcpy(dest, src, size); #endif } /* Reads a uint32 from a buffer. */ static MVMuint32 read_int32(MVMuint8 *buffer, size_t offset) { MVMuint32 value; memcpy_endian(&value, buffer + offset, 4); return value; } /* Reads an uint16 from a buffer. */ static MVMuint16 read_int16(MVMuint8 *buffer, size_t offset) { MVMuint16 value; memcpy_endian(&value, buffer + offset, 2); return value; } /* Reads an uint8 from a buffer. */ static MVMuint8 read_int8(MVMuint8 *buffer, size_t offset) { return buffer[offset]; } /* Cleans up reader state. */ static void cleanup_all(MVMThreadContext *tc, ReaderState *rs) { MVM_free(rs->frames); MVM_free(rs->frame_outer_fixups); MVM_free(rs); } /* Ensures we can read a certain amount of bytes without overrunning the end * of the stream. */ MVM_STATIC_INLINE void ensure_can_read(MVMThreadContext *tc, MVMCompUnit *cu, ReaderState *rs, MVMuint8 *pos, MVMuint32 size) { if (pos + size > rs->read_limit) { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "Read past end of bytecode stream"); } } /* Reads a string index, looks up the string and returns it. Bounds * checks the string heap index too. */ static MVMString * get_heap_string(MVMThreadContext *tc, MVMCompUnit *cu, ReaderState *rs, MVMuint8 *buffer, size_t offset) { MVMuint32 heap_index = read_int32(buffer, offset); if (heap_index >= cu->body.num_strings) { if (rs) cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "String heap index beyond end of string heap"); } return MVM_cu_string(tc, cu, heap_index); } /* Dissects the bytecode stream and hands back a reader pointing to the * various parts of it. */ static ReaderState * dissect_bytecode(MVMThreadContext *tc, MVMCompUnit *cu) { MVMCompUnitBody *cu_body = &cu->body; ReaderState *rs = NULL; MVMuint32 version, offset, size; /* Sanity checks. */ if (cu_body->data_size < HEADER_SIZE) MVM_exception_throw_adhoc(tc, "Bytecode stream shorter than header"); if (memcmp(cu_body->data_start, "MOARVM\r\n", 8) != 0) MVM_exception_throw_adhoc(tc, "Bytecode stream corrupt (missing magic string)"); version = read_int32(cu_body->data_start, 8); if (version < MIN_BYTECODE_VERSION) MVM_exception_throw_adhoc(tc, "Bytecode stream version too low"); if (version > MAX_BYTECODE_VERSION) MVM_exception_throw_adhoc(tc, "Bytecode stream version too high"); /* Allocate reader state. */ rs = (ReaderState *)MVM_calloc(1, sizeof(ReaderState)); rs->version = version; rs->read_limit = cu_body->data_start + cu_body->data_size; cu->body.bytecode_version = version; /* Locate SC dependencies segment. */ offset = read_int32(cu_body->data_start, SCDEP_HEADER_OFFSET); if (offset > cu_body->data_size) { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "Serialization contexts segment starts after end of stream"); } rs->sc_seg = cu_body->data_start + offset; rs->expected_scs = read_int32(cu_body->data_start, SCDEP_HEADER_OFFSET + 4); /* Locate extension ops segment. */ offset = read_int32(cu_body->data_start, EXTOP_HEADER_OFFSET); if (offset > cu_body->data_size) { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "Extension ops segment starts after end of stream"); } rs->extop_seg = cu_body->data_start + offset; rs->expected_extops = read_int32(cu_body->data_start, EXTOP_HEADER_OFFSET + 4); /* Locate frames segment. */ offset = read_int32(cu_body->data_start, FRAME_HEADER_OFFSET); if (offset > cu_body->data_size) { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "Frames segment starts after end of stream"); } rs->frame_seg = cu_body->data_start + offset; rs->expected_frames = read_int32(cu_body->data_start, FRAME_HEADER_OFFSET + 4); /* Locate callsites segment. */ offset = read_int32(cu_body->data_start, CALLSITE_HEADER_OFFSET); if (offset > cu_body->data_size) { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "Callsites segment starts after end of stream"); } rs->callsite_seg = cu_body->data_start + offset; rs->expected_callsites = read_int32(cu_body->data_start, CALLSITE_HEADER_OFFSET + 4); /* Locate strings segment. */ offset = read_int32(cu_body->data_start, STRING_HEADER_OFFSET); if (offset > cu_body->data_size) { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "Strings segment starts after end of stream"); } rs->string_seg = cu_body->data_start + offset; rs->expected_strings = read_int32(cu_body->data_start, STRING_HEADER_OFFSET + 4); /* Get SC data, if any. */ offset = read_int32(cu_body->data_start, SCDATA_HEADER_OFFSET); size = read_int32(cu_body->data_start, SCDATA_HEADER_OFFSET + 4); if (offset > cu_body->data_size || offset + size > cu_body->data_size) { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "Serialized data segment overflows end of stream"); } if (offset) { cu_body->serialized = cu_body->data_start + offset; cu_body->serialized_size = size; } /* Locate bytecode segment. */ offset = read_int32(cu_body->data_start, BYTECODE_HEADER_OFFSET); size = read_int32(cu_body->data_start, BYTECODE_HEADER_OFFSET + 4); if (offset > cu_body->data_size || offset + size > cu_body->data_size) { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "Bytecode segment overflows end of stream"); } rs->bytecode_seg = cu_body->data_start + offset; rs->bytecode_size = size; /* Locate annotations segment. */ offset = read_int32(cu_body->data_start, ANNOTATION_HEADER_OFFSET); size = read_int32(cu_body->data_start, ANNOTATION_HEADER_OFFSET + 4); if (offset > cu_body->data_size || offset + size > cu_body->data_size) { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "Annotation segment overflows end of stream"); } rs->annotation_seg = cu_body->data_start + offset; rs->annotation_size = size; /* Locate HLL name */ rs->hll_str_idx = read_int32(cu_body->data_start, HLL_NAME_HEADER_OFFSET); /* Locate special frame indexes. Note, they are 0 for none, and the * index + 1 if there is one. */ rs->main_frame = read_int32(cu_body->data_start, SPECIAL_FRAME_HEADER_OFFSET); rs->load_frame = read_int32(cu_body->data_start, SPECIAL_FRAME_HEADER_OFFSET + 4); rs->deserialize_frame = read_int32(cu_body->data_start, SPECIAL_FRAME_HEADER_OFFSET + 8); if (rs->main_frame > rs->expected_frames || rs->load_frame > rs->expected_frames || rs->deserialize_frame > rs->expected_frames) { MVM_exception_throw_adhoc(tc, "Special frame index out of bounds"); } return rs; } /* Loads the SC dependencies list. */ static void deserialize_sc_deps(MVMThreadContext *tc, MVMCompUnit *cu, ReaderState *rs) { MVMCompUnitBody *cu_body = &cu->body; MVMuint32 i, sh_idx; MVMuint8 *pos; /* Allocate SC lists in compilation unit. */ cu_body->scs = MVM_malloc(rs->expected_scs * sizeof(MVMSerializationContext *)); cu_body->scs_to_resolve = MVM_malloc(rs->expected_scs * sizeof(MVMSerializationContextBody *)); cu_body->sc_handle_idxs = MVM_malloc(rs->expected_scs * sizeof(MVMint32)); cu_body->num_scs = rs->expected_scs; /* Resolve all the things. */ pos = rs->sc_seg; for (i = 0; i < rs->expected_scs; i++) { MVMSerializationContextBody *scb; MVMString *handle; /* Grab string heap index. */ ensure_can_read(tc, cu, rs, pos, 4); sh_idx = read_int32(pos, 0); pos += 4; /* Resolve to string. */ if (sh_idx >= cu_body->num_strings) { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "String heap index beyond end of string heap"); } cu_body->sc_handle_idxs[i] = sh_idx; handle = MVM_cu_string(tc, cu, sh_idx); /* See if we can resolve it. */ uv_mutex_lock(&tc->instance->mutex_sc_weakhash); MVM_HASH_GET(tc, tc->instance->sc_weakhash, handle, scb); if (scb && scb->sc) { cu_body->scs_to_resolve[i] = NULL; MVM_ASSIGN_REF(tc, &(cu->common.header), cu_body->scs[i], scb->sc); scb->claimed = 1; } else { if (!scb) { scb = MVM_calloc(1, sizeof(MVMSerializationContextBody)); scb->handle = handle; MVM_HASH_BIND(tc, tc->instance->sc_weakhash, handle, scb); MVM_sc_add_all_scs_entry(tc, scb); } cu_body->scs_to_resolve[i] = scb; cu_body->scs[i] = NULL; } uv_mutex_unlock(&tc->instance->mutex_sc_weakhash); } } /* Loads the extension op records. */ static MVMExtOpRecord * deserialize_extop_records(MVMThreadContext *tc, MVMCompUnit *cu, ReaderState *rs) { MVMExtOpRecord *extops; MVMuint32 num = rs->expected_extops; MVMuint8 *pos; MVMuint32 i; if (num == 0) return NULL; extops = MVM_fixed_size_alloc_zeroed(tc, tc->instance->fsa, num * sizeof(MVMExtOpRecord)); pos = rs->extop_seg; for (i = 0; i < num; i++) { MVMuint32 name_idx; MVMuint16 operand_bytes = 0; MVMuint8 *operand_descriptor = extops[i].operand_descriptor; /* Read name string index. */ ensure_can_read(tc, cu, rs, pos, 4); name_idx = read_int32(pos, 0); pos += 4; /* Lookup name string. */ if (name_idx >= cu->body.num_strings) { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "String heap index beyond end of string heap"); } extops[i].name = MVM_cu_string(tc, cu, name_idx); /* Read operand descriptor. */ ensure_can_read(tc, cu, rs, pos, 8); memcpy(operand_descriptor, pos, 8); pos += 8; /* Validate operand descriptor. * TODO: Unify with validation in MVM_ext_register_extop? */ { MVMuint8 j = 0; for(; j < 8; j++) { MVMuint8 flags = operand_descriptor[j]; if (!flags) break; switch (flags & MVM_operand_rw_mask) { case MVM_operand_literal: goto check_literal; case MVM_operand_read_reg: case MVM_operand_write_reg: operand_bytes += 2; goto check_reg; case MVM_operand_read_lex: case MVM_operand_write_lex: operand_bytes += 4; goto check_reg; default: goto fail; } check_literal: switch (flags & MVM_operand_type_mask) { case MVM_operand_int8: operand_bytes += 1; continue; case MVM_operand_int16: operand_bytes += 2; continue; case MVM_operand_int32: operand_bytes += 4; continue; case MVM_operand_int64: operand_bytes += 8; continue; case MVM_operand_num32: operand_bytes += 4; continue; case MVM_operand_num64: operand_bytes += 8; continue; case MVM_operand_str: operand_bytes += 2; continue; case MVM_operand_coderef: operand_bytes += 2; continue; case MVM_operand_ins: case MVM_operand_callsite: default: goto fail; } check_reg: switch (flags & MVM_operand_type_mask) { case MVM_operand_int8: case MVM_operand_int16: case MVM_operand_int32: case MVM_operand_int64: case MVM_operand_num32: case MVM_operand_num64: case MVM_operand_str: case MVM_operand_obj: case MVM_operand_type_var: case MVM_operand_uint8: case MVM_operand_uint16: case MVM_operand_uint32: case MVM_operand_uint64: continue; default: goto fail; } fail: cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "Invalid operand descriptor"); } } extops[i].operand_bytes = operand_bytes; } return extops; } /* Loads the static frame information (what locals we have, bytecode offset, * lexicals, etc.) and returns a list of them. */ static MVMStaticFrame ** deserialize_frames(MVMThreadContext *tc, MVMCompUnit *cu, ReaderState *rs) { MVMStaticFrame **frames; MVMuint8 *pos; MVMuint32 bytecode_pos, bytecode_size, i, j; /* Allocate frames array. */ if (rs->expected_frames == 0) { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "Bytecode file must have at least one frame"); } frames = MVM_malloc(sizeof(MVMStaticFrame *) * rs->expected_frames); /* Allocate outer fixup list for frames. */ rs->frame_outer_fixups = MVM_malloc(sizeof(MVMuint16) * rs->expected_frames); /* Load frames. */ pos = rs->frame_seg; for (i = 0; i < rs->expected_frames; i++) { MVMStaticFrame *static_frame; MVMStaticFrameBody *static_frame_body; /* Ensure we can read a frame here. */ ensure_can_read(tc, cu, rs, pos, FRAME_HEADER_SIZE); /* Allocate frame and get/check bytecode start/length. */ static_frame = (MVMStaticFrame *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTStaticFrame); MVM_ASSIGN_REF(tc, &(cu->common.header), frames[i], static_frame); static_frame_body = &static_frame->body; bytecode_pos = read_int32(pos, 0); bytecode_size = read_int32(pos, 4); if (bytecode_pos >= rs->bytecode_size) { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "Frame has invalid bytecode start point"); } if (bytecode_pos + bytecode_size > rs->bytecode_size) { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "Frame bytecode overflows bytecode stream"); } static_frame_body->bytecode = rs->bytecode_seg + bytecode_pos; static_frame_body->bytecode_size = bytecode_size; static_frame_body->orig_bytecode = static_frame_body->bytecode; /* Get number of locals and lexicals. */ static_frame_body->num_locals = read_int32(pos, 8); static_frame_body->num_lexicals = read_int32(pos, 12); /* Get compilation unit unique ID and name. */ MVM_ASSIGN_REF(tc, &(static_frame->common.header), static_frame_body->cuuid, get_heap_string(tc, cu, rs, pos, 16)); MVM_ASSIGN_REF(tc, &(static_frame->common.header), static_frame_body->name, get_heap_string(tc, cu, rs, pos, 20)); /* Add frame outer fixup to fixup list. */ rs->frame_outer_fixups[i] = read_int16(pos, 24); /* Get annotations details */ { MVMuint32 annot_offset = read_int32(pos, 26); MVMuint32 num_annotations = read_int32(pos, 30); if (annot_offset + num_annotations * 12 > rs->annotation_size) { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "Frame annotation segment overflows bytecode stream"); } static_frame_body->annotations_data = rs->annotation_seg + annot_offset; static_frame_body->num_annotations = num_annotations; } /* Read number of handlers. */ static_frame_body->num_handlers = read_int32(pos, 34); /* Read exit handler flag (version 2 and higher). */ if (rs->version >= 2) { MVMint16 flags = read_int16(pos, 38); static_frame_body->has_exit_handler = flags & FRAME_FLAG_EXIT_HANDLER; static_frame_body->is_thunk = flags & FRAME_FLAG_IS_THUNK; static_frame_body->no_inline = flags & FRAME_FLAG_NO_INLINE; } /* Read code object SC indexes (version 4 and higher). */ if (rs->version >= 4) { static_frame_body->code_obj_sc_dep_idx = read_int32(pos, 42); static_frame_body->code_obj_sc_idx = read_int32(pos, 46); } /* Associate frame with compilation unit. */ MVM_ASSIGN_REF(tc, &(static_frame->common.header), static_frame_body->cu, cu); /* Stash position for lazy deserialization of the rest. */ static_frame_body->frame_data_pos = pos; /* Skip over the rest, making sure it's readable. */ { MVMuint32 skip = 2 * static_frame_body->num_locals + 6 * static_frame_body->num_lexicals; MVMuint16 slvs = read_int16(pos, 40); pos += FRAME_HEADER_SIZE; ensure_can_read(tc, cu, rs, pos, skip); pos += skip; for (j = 0; j < static_frame_body->num_handlers; j++) { ensure_can_read(tc, cu, rs, pos, FRAME_HANDLER_SIZE); if (read_int32(pos, 8) & MVM_EX_CAT_LABELED) { pos += FRAME_HANDLER_SIZE; ensure_can_read(tc, cu, rs, pos, 2); pos += 2; } else { pos += FRAME_HANDLER_SIZE; } } ensure_can_read(tc, cu, rs, pos, slvs * FRAME_SLV_SIZE); pos += slvs * FRAME_SLV_SIZE; } } /* Fixup outers. */ for (i = 0; i < rs->expected_frames; i++) { if (rs->frame_outer_fixups[i] != i) { if (rs->frame_outer_fixups[i] < rs->expected_frames) { MVM_ASSIGN_REF(tc, &(frames[i]->common.header), frames[i]->body.outer, frames[rs->frame_outer_fixups[i]]); } else { cleanup_all(tc, rs); MVM_exception_throw_adhoc(tc, "Invalid frame outer index; cannot fixup"); } } } return frames; } /* Finishes up reading and exploding of a frame. */ void MVM_bytecode_finish_frame(MVMThreadContext *tc, MVMCompUnit *cu, MVMStaticFrame *sf, MVMint32 dump_only) { MVMuint32 j; MVMuint8 *pos; MVMuint16 slvs; /* Ensure we've not already done this. */ if (sf->body.fully_deserialized) return; /* Acquire the update mutex on the CompUnit. */ MVMROOT(tc, cu, { MVMROOT(tc, sf, { MVM_reentrantmutex_lock(tc, (MVMReentrantMutex *)cu->body.deserialize_frame_mutex); }); }); /* Ensure no other thread has done this for us in the mean time. */ if (sf->body.fully_deserialized) { MVM_reentrantmutex_unlock(tc, (MVMReentrantMutex *)cu->body.deserialize_frame_mutex); return; } /* Locate start of frame body. */ pos = sf->body.frame_data_pos; /* Get the number of static lex values we'll need to apply. */ slvs = read_int16(pos, 40); /* Skip past header. */ pos += FRAME_HEADER_SIZE; /* Read the local types. */ if (sf->body.num_locals) { sf->body.local_types = MVM_malloc(sizeof(MVMuint16) * sf->body.num_locals); for (j = 0; j < sf->body.num_locals; j++) sf->body.local_types[j] = read_int16(pos, 2 * j); pos += 2 * sf->body.num_locals; } /* Read the lexical types. */ if (sf->body.num_lexicals) { /* Allocate names hash and types list. */ sf->body.lexical_types = MVM_malloc(sizeof(MVMuint16) * sf->body.num_lexicals); /* Read in data. */ if (sf->body.num_lexicals) { sf->body.lexical_names_list = MVM_malloc(sizeof(MVMLexicalRegistry *) * sf->body.num_lexicals); } for (j = 0; j < sf->body.num_lexicals; j++) { MVMString *name = get_heap_string(tc, cu, NULL, pos, 6 * j + 2); MVMLexicalRegistry *entry = MVM_calloc(1, sizeof(MVMLexicalRegistry)); MVM_ASSIGN_REF(tc, &(sf->common.header), entry->key, name); sf->body.lexical_names_list[j] = entry; entry->value = j; sf->body.lexical_types[j] = read_int16(pos, 6 * j); MVM_HASH_BIND(tc, sf->body.lexical_names, name, entry) } pos += 6 * sf->body.num_lexicals; } /* Read in handlers. */ if (sf->body.num_handlers) { /* Allocate space for handler data. */ sf->body.handlers = MVM_malloc(sf->body.num_handlers * sizeof(MVMFrameHandler)); /* Read each handler. */ for (j = 0; j < sf->body.num_handlers; j++) { sf->body.handlers[j].start_offset = read_int32(pos, 0); sf->body.handlers[j].end_offset = read_int32(pos, 4); sf->body.handlers[j].category_mask = read_int32(pos, 8); sf->body.handlers[j].action = read_int16(pos, 12); sf->body.handlers[j].block_reg = read_int16(pos, 14); sf->body.handlers[j].goto_offset = read_int32(pos, 16); pos += FRAME_HANDLER_SIZE; if (sf->body.handlers[j].category_mask & MVM_EX_CAT_LABELED) { sf->body.handlers[j].label_reg = read_int16(pos, 0); pos += 2; } sf->body.handlers[j].inlinee = -1; } } /* Allocate default lexical environment storage. */ sf->body.env_size = sf->body.num_lexicals * sizeof(MVMRegister); sf->body.static_env = MVM_calloc(1, sf->body.env_size); sf->body.static_env_flags = MVM_calloc(1, sf->body.num_lexicals); /* Stash static lexical segment offset, so we can easily locate it to * resolve them later. */ sf->body.frame_static_lex_pos = slvs ? pos : NULL; /* Read in static lexical flags. */ for (j = 0; j < slvs; j++) { MVMuint16 lex_idx = read_int16(pos, 0); MVMuint16 flags = read_int16(pos, 2); if (lex_idx >= sf->body.num_lexicals) { MVM_reentrantmutex_unlock(tc, (MVMReentrantMutex *)cu->body.deserialize_frame_mutex); MVM_exception_throw_adhoc(tc, "Lexical index out of bounds: %d > %d", lex_idx, sf->body.num_lexicals); } sf->body.static_env_flags[lex_idx] = flags; if (flags == 2 && !dump_only) { /* State variable; need to resolve wval immediately. Other kinds * can wait. */ MVMSerializationContext *sc = MVM_sc_get_sc(tc, cu, read_int32(pos, 4)); if (sc == NULL) { MVM_reentrantmutex_unlock(tc, (MVMReentrantMutex *)cu->body.deserialize_frame_mutex); MVM_exception_throw_adhoc(tc, "SC not yet resolved; lookup failed"); } MVM_ASSIGN_REF(tc, &(sf->common.header), sf->body.static_env[lex_idx].o, MVM_sc_get_object(tc, sc, read_int32(pos, 8))); } pos += FRAME_SLV_SIZE; } /* Mark the frame fully deserialized. */ sf->body.fully_deserialized = 1; /* Release the update mutex again */ MVM_reentrantmutex_unlock(tc, (MVMReentrantMutex *)cu->body.deserialize_frame_mutex); } /* Gets the SC reference for a given static lexical var for * vivification purposes */ MVMuint8 MVM_bytecode_find_static_lexical_scref(MVMThreadContext *tc, MVMCompUnit *cu, MVMStaticFrame *sf, MVMuint16 index, MVMint32 *sc, MVMint32 *id) { MVMuint16 slvs, i; MVMuint8 *pos = sf->body.frame_static_lex_pos; if (!pos) return 0; slvs = read_int16(sf->body.frame_data_pos, 40); for (i = 0; i < slvs; i++) { if (read_int16(pos, 0) == index) { *sc = read_int32(pos, 4); *id = read_int32(pos, 8); return 1; } pos += FRAME_SLV_SIZE; } return 0; } /* Loads the callsites. */ static MVMCallsite ** deserialize_callsites(MVMThreadContext *tc, MVMCompUnit *cu, ReaderState *rs) { MVMCallsite **callsites; MVMuint8 *pos; MVMuint32 i, j, elems; MVMCompUnitBody *cu_body = &cu->body; /* Allocate space for callsites. */ if (rs->expected_callsites == 0) return NULL; callsites = MVM_fixed_size_alloc(tc, tc->instance->fsa, sizeof(MVMCallsite *) * rs->expected_callsites); /* Load callsites. */ pos = rs->callsite_seg; for (i = 0; i < rs->expected_callsites; i++) { MVMuint8 has_flattening = 0; MVMuint32 positionals = 0; MVMuint32 nameds_slots = 0; MVMuint32 nameds_non_flattening = 0; /* Ensure we can read at least an element count. */ ensure_can_read(tc, cu, rs, pos, 2); elems = read_int16(pos, 0); pos += 2; /* Allocate space for the callsite. */ callsites[i] = MVM_malloc(sizeof(MVMCallsite)); callsites[i]->flag_count = elems; if (elems) callsites[i]->arg_flags = MVM_malloc(elems * sizeof(MVMCallsiteEntry)); else callsites[i]->arg_flags = NULL; /* Ensure we can read in a callsite of this size, and do so. */ ensure_can_read(tc, cu, rs, pos, elems); for (j = 0; j < elems; j++) callsites[i]->arg_flags[j] = read_int8(pos, j); pos += elems; /* Add alignment. */ pos += elems % 2; /* Count positional arguments, and validate that all positionals come * before all nameds (flattening named counts as named). */ for (j = 0; j < elems; j++) { if (callsites[i]->arg_flags[j] & MVM_CALLSITE_ARG_FLAT) { if (!(callsites[i]->arg_flags[j] & MVM_CALLSITE_ARG_OBJ)) MVM_exception_throw_adhoc(tc, "Flattened positional args must be objects"); if (nameds_slots) MVM_exception_throw_adhoc(tc, "Flattened positional args must appear before named args"); has_flattening = 1; positionals++; } else if (callsites[i]->arg_flags[j] & MVM_CALLSITE_ARG_FLAT_NAMED) { if (!(callsites[i]->arg_flags[j] & MVM_CALLSITE_ARG_OBJ)) MVM_exception_throw_adhoc(tc, "Flattened named args must be objects"); has_flattening = 1; nameds_slots++; } else if (callsites[i]->arg_flags[j] & MVM_CALLSITE_ARG_NAMED) { nameds_slots += 2; nameds_non_flattening++; } else if (nameds_slots) { MVM_exception_throw_adhoc(tc, "All positional args must appear before named args"); } else { positionals++; } } callsites[i]->num_pos = positionals; callsites[i]->arg_count = positionals + nameds_slots; callsites[i]->has_flattening = has_flattening; callsites[i]->is_interned = 0; callsites[i]->with_invocant = NULL; if (rs->version >= 3 && nameds_non_flattening) { ensure_can_read(tc, cu, rs, pos, nameds_non_flattening * 4); callsites[i]->arg_names = MVM_malloc(nameds_non_flattening * sizeof(MVMString*)); for (j = 0; j < nameds_non_flattening; j++) { callsites[i]->arg_names[j] = get_heap_string(tc, cu, rs, pos, 0); pos += 4; } } else { callsites[i]->arg_names = NULL; } /* Track maximum callsite size we've seen. (Used for now, though * in the end we probably should calculate it by frame.) */ if (callsites[i]->arg_count > cu_body->max_callsite_size) cu_body->max_callsite_size = callsites[i]->arg_count; /* Try to intern the callsite (that is, see if it matches one the * VM already knows about). If it does, it will free the memory * associated and replace it with the interned one. Otherwise it * will store this one, provided it meets the interning rules. */ MVM_callsite_try_intern(tc, &(callsites[i])); } /* Add one on to the maximum, to allow space for unshifting an extra * arg in the "supply invoked code object" case. */ cu_body->max_callsite_size++; return callsites; } /* Creates code objects to go with each of the static frames. */ static void create_code_objects(MVMThreadContext *tc, MVMCompUnit *cu, ReaderState *rs) { MVMuint32 i; MVMObject *code_type; MVMCompUnitBody *cu_body = &cu->body; cu_body->coderefs = MVM_malloc(cu_body->num_frames * sizeof(MVMObject *)); code_type = tc->instance->boot_types.BOOTCode; for (i = 0; i < cu_body->num_frames; i++) { MVMCode *coderef = (MVMCode *)REPR(code_type)->allocate(tc, STABLE(code_type)); MVM_ASSIGN_REF(tc, &(cu->common.header), cu_body->coderefs[i], coderef); MVM_ASSIGN_REF(tc, &(coderef->common.header), coderef->body.sf, rs->frames[i]); MVM_ASSIGN_REF(tc, &(coderef->common.header), coderef->body.name, rs->frames[i]->body.name); MVM_ASSIGN_REF(tc, &(rs->frames[i]->common.header), rs->frames[i]->body.static_code, coderef); } } /* Takes a compilation unit pointing at a bytecode stream (which actually * has more than just the executive bytecode, but also various declarations, * like frames). Unpacks it and populates the compilation unit. */ void MVM_bytecode_unpack(MVMThreadContext *tc, MVMCompUnit *cu) { ReaderState *rs; MVMCompUnitBody *cu_body = &cu->body; /* Allocate directly in generation 2 so the object is not moving around. */ MVM_gc_allocate_gen2_default_set(tc); /* Dissect the bytecode into its parts. */ rs = dissect_bytecode(tc, cu); /* Allocate space for the strings heap; we deserialize it lazily. */ cu_body->strings = MVM_fixed_size_alloc_zeroed(tc, tc->instance->fsa, rs->expected_strings * sizeof(MVMString *)); cu_body->num_strings = rs->expected_strings; cu_body->orig_strings = rs->expected_strings; cu_body->string_heap_fast_table = MVM_calloc( (rs->expected_strings / MVM_STRING_FAST_TABLE_SPAN) + 1, sizeof(MVMuint32)); cu_body->string_heap_start = rs->string_seg; cu_body->string_heap_read_limit = rs->read_limit; /* Load SC dependencies. */ deserialize_sc_deps(tc, cu, rs); /* Load the extension op records. */ cu_body->extops = deserialize_extop_records(tc, cu, rs); cu_body->num_extops = rs->expected_extops; /* Load the static frame info and give each one a code reference. */ rs->frames = deserialize_frames(tc, cu, rs); cu_body->num_frames = rs->expected_frames; cu_body->orig_frames = rs->expected_frames; create_code_objects(tc, cu, rs); /* Load callsites. */ cu_body->max_callsite_size = MVM_MIN_CALLSITE_SIZE; cu_body->callsites = deserialize_callsites(tc, cu, rs); cu_body->num_callsites = rs->expected_callsites; cu_body->orig_callsites = rs->expected_callsites; if (rs->hll_str_idx > rs->expected_strings) MVM_exception_throw_adhoc(tc, "Unpacking bytecode: HLL name string index out of range: %d > %d", rs->hll_str_idx, rs->expected_strings); /* Resolve HLL name. */ MVM_ASSIGN_REF(tc, &(cu->common.header), cu_body->hll_name, MVM_cu_string(tc, cu, rs->hll_str_idx)); /* Resolve special frames. */ MVM_ASSIGN_REF(tc, &(cu->common.header), cu_body->main_frame, rs->main_frame ? rs->frames[rs->main_frame - 1] : rs->frames[0]); if (rs->load_frame) MVM_ASSIGN_REF(tc, &(cu->common.header), cu_body->load_frame, rs->frames[rs->load_frame - 1]); if (rs->deserialize_frame) MVM_ASSIGN_REF(tc, &(cu->common.header), cu_body->deserialize_frame, rs->frames[rs->deserialize_frame - 1]); /* Clean up reader state. */ cleanup_all(tc, rs); /* Restore normal GC allocation. */ MVM_gc_allocate_gen2_default_clear(tc); } /* returns the annotation for that bytecode offset */ MVMBytecodeAnnotation * MVM_bytecode_resolve_annotation(MVMThreadContext *tc, MVMStaticFrameBody *sfb, MVMuint32 offset) { MVMBytecodeAnnotation *ba = NULL; MVMuint32 i; if (sfb->num_annotations && offset < sfb->bytecode_size) { MVMuint8 *cur_anno = sfb->annotations_data; for (i = 0; i < sfb->num_annotations; i++) { MVMint32 ann_offset = read_int32(cur_anno, 0); if (ann_offset > offset) break; cur_anno += 12; } if (i) cur_anno -= 12; ba = MVM_malloc(sizeof(MVMBytecodeAnnotation)); ba->bytecode_offset = read_int32(cur_anno, 0); ba->filename_string_heap_index = read_int32(cur_anno, 4); ba->line_number = read_int32(cur_anno, 8); ba->ann_offset = cur_anno - sfb->annotations_data; ba->ann_index = i; } return ba; } void MVM_bytecode_advance_annotation(MVMThreadContext *tc, MVMStaticFrameBody *sfb, MVMBytecodeAnnotation *ba) { MVMuint32 i = ba->ann_index + 1; MVMuint8 *cur_anno = sfb->annotations_data + ba->ann_offset; cur_anno += 12; if (i >= sfb->num_annotations) { ba->bytecode_offset = -1; ba->filename_string_heap_index = 0; ba->line_number = 0; ba->ann_offset = -1; ba->ann_index = -1; } else { ba->bytecode_offset = read_int32(cur_anno, 0); ba->filename_string_heap_index = read_int32(cur_anno, 4); ba->line_number = read_int32(cur_anno, 8); ba->ann_offset = cur_anno - sfb->annotations_data; ba->ann_index = i; } } MoarVM-2018.03/src/core/bytecode.h0000644000175000017510000000143113237701240016667 0ustar samanthasamantha/* Bytecode annotation, post-resolution. */ struct MVMBytecodeAnnotation { MVMuint32 bytecode_offset; MVMuint32 filename_string_heap_index; MVMuint32 line_number; MVMuint32 ann_offset; MVMuint32 ann_index; }; void MVM_bytecode_unpack(MVMThreadContext *tc, MVMCompUnit *cu); MVMBytecodeAnnotation * MVM_bytecode_resolve_annotation(MVMThreadContext *tc, MVMStaticFrameBody *sfb, MVMuint32 offset); void MVM_bytecode_advance_annotation(MVMThreadContext *tc, MVMStaticFrameBody *sfb, MVMBytecodeAnnotation *ba); void MVM_bytecode_finish_frame(MVMThreadContext *tc, MVMCompUnit *cu, MVMStaticFrame *sf, MVMint32 dump_only); MVMuint8 MVM_bytecode_find_static_lexical_scref(MVMThreadContext *tc, MVMCompUnit *cu, MVMStaticFrame *sf, MVMuint16 index, MVMint32 *sc, MVMint32 *id); MoarVM-2018.03/src/core/bytecodedump.c0000644000175000017510000004656313237701240017567 0ustar samanthasamantha#include "moar.h" #define line_length 1024 MVM_FORMAT(printf, 4, 5) static void append_string(char **out, MVMuint32 *size, MVMuint32 *length, char *str, ...) { char string[line_length]; MVMuint32 len; va_list args; va_start(args, str); vsnprintf(string, line_length, str, args); va_end(args); len = strlen(string); if (*length + len > *size) { while (*length + len > *size) *size = *size * 2; *out = MVM_realloc(*out, *size); } memcpy(*out + *length, string, len); *length = *length + len; } static const char * get_typename(MVMuint16 type) { switch(type) { case MVM_reg_int8 : return "int8"; case MVM_reg_int16: return "int16"; case MVM_reg_int32: return "int32"; case MVM_reg_int64: return "int"; case MVM_reg_num32: return "num32"; case MVM_reg_num64: return "num"; case MVM_reg_str : return "str"; case MVM_reg_obj : return "obj"; case MVM_reg_uint8 : return "uint8"; case MVM_reg_uint16: return "uint16"; case MVM_reg_uint32: return "uint32"; case MVM_reg_uint64: return "uint"; default : return "UNKNOWN"; } } #define a(...) append_string(&o,&s,&l, __VA_ARGS__) /* Macros for getting things from the bytecode stream. */ /* GET_REG is defined differently here from interp.c */ #define GET_I8(pc, idx) *((MVMint8 *)((pc) + (idx))) #define GET_REG(pc, idx) *((MVMuint16 *)((pc) + (idx))) #define GET_I16(pc, idx) *((MVMint16 *)((pc) + (idx))) #define GET_UI16(pc, idx) *((MVMuint16 *)((pc) + (idx))) #define GET_I32(pc, idx) *((MVMint32 *)((pc) + (idx))) #define GET_UI32(pc, idx) *((MVMuint32 *)((pc) + (idx))) #define GET_N32(pc, idx) *((MVMnum32 *)((pc) + (idx))) enum { MVM_val_branch_target = 1, MVM_val_op_boundary = 2 }; static MVMStaticFrame * get_frame(MVMThreadContext *tc, MVMCompUnit *cu, int idx) { return ((MVMCode *)cu->body.coderefs[idx])->body.sf; } static void bytecode_dump_frame_internal(MVMThreadContext *tc, MVMStaticFrame *frame, MVMSpeshCandidate *maybe_candidate, MVMuint8 *frame_cur_op, char ***frame_lexicals, char **oo, MVMuint32 *os, MVMuint32 *ol) { /* since "references" are not a thing in C, keep a local copy of these * and update the passed-in pointers at the end of the function */ char *o = *oo; MVMuint32 s = *os; MVMuint32 l = *ol; MVMuint32 i, j, k; /* mostly stolen from validation.c */ MVMStaticFrame *static_frame = frame; MVMuint32 bytecode_size = maybe_candidate ? maybe_candidate->bytecode_size : static_frame->body.bytecode_size; MVMuint8 *bytecode_start = maybe_candidate ? maybe_candidate->bytecode : static_frame->body.bytecode; MVMuint8 *bytecode_end = bytecode_start + bytecode_size; /* current position in the bytestream */ MVMuint8 *cur_op = bytecode_start; /* positions in the bytestream that are starts of ops and goto targets */ MVMuint8 *labels = MVM_calloc(1, bytecode_size); MVMuint32 *jumps = MVM_calloc(1, sizeof(MVMuint32) * bytecode_size); char **lines = MVM_malloc(sizeof(char *) * bytecode_size); MVMuint32 *linelocs = MVM_malloc(sizeof(MVMuint32) * bytecode_size); MVMuint32 lineno = 0; MVMuint32 lineloc; MVMuint16 op_num; const MVMOpInfo *op_info; MVMuint32 operand_size = 0; unsigned char op_rw; unsigned char op_type; unsigned char op_flags; MVMOpInfo tmp_extop_info; /* stash the outer output buffer */ MVMuint32 sP = s; MVMuint32 lP = l; char *oP = o; char *tmpstr; char mark_this_line = 0; MVMCompUnit *cu = static_frame->body.cu; while (cur_op < bytecode_end - 1) { /* allocate a line buffer */ s = 200; l = 0; o = MVM_calloc(s, sizeof(char)); lineloc = cur_op - bytecode_start; /* mark that this line starts at this point in the bytestream */ linelocs[lineno] = lineloc; /* mark that this point in the bytestream is an op boundary */ labels[lineloc] |= MVM_val_op_boundary; mark_this_line = 0; if (frame_cur_op) { if (frame_cur_op == cur_op || frame_cur_op == cur_op + 2) { mark_this_line = 1; } } if (mark_this_line) { a("-> "); } else { a(" "); } op_num = *((MVMint16 *)cur_op); cur_op += 2; if (op_num < MVM_OP_EXT_BASE) { op_info = MVM_op_get_op(op_num); a("%-12s ", op_info->name); } else { MVMint16 ext_op_num = op_num - MVM_OP_EXT_BASE; if (ext_op_num < cu->body.num_extops) { MVMExtOpRecord r = cu->body.extops[ext_op_num]; MVMuint8 j; memset(&tmp_extop_info, 0, sizeof(MVMOpInfo)); tmp_extop_info.name = MVM_string_utf8_encode_C_string(tc, r.name); memcpy(tmp_extop_info.operands, r.operand_descriptor, 8); for (j = 0; j < 8; j++) if (tmp_extop_info.operands[j]) tmp_extop_info.num_operands++; else break; op_info = &tmp_extop_info; a("%-12s ", tmp_extop_info.name); MVM_free((void *)tmp_extop_info.name); tmp_extop_info.name = NULL; } else { MVM_exception_throw_adhoc(tc, "Extension op %d out of range", (int)op_num); } } for (i = 0; i < op_info->num_operands; i++) { if (i) a(", "); op_flags = op_info->operands[i]; op_rw = op_flags & MVM_operand_rw_mask; op_type = op_flags & MVM_operand_type_mask; if (op_rw == MVM_operand_literal) { switch (op_type) { case MVM_operand_int8: operand_size = 1; a("%"PRId8, GET_I8(cur_op, 0)); break; case MVM_operand_int16: operand_size = 2; a("%"PRId16, GET_I16(cur_op, 0)); break; case MVM_operand_int32: operand_size = 4; a("%"PRId32, GET_I32(cur_op, 0)); break; case MVM_operand_int64: operand_size = 8; a("%"PRId64, MVM_BC_get_I64(cur_op, 0)); break; case MVM_operand_num32: operand_size = 4; a("%f", GET_N32(cur_op, 0)); break; case MVM_operand_num64: operand_size = 8; a("%f", MVM_BC_get_N64(cur_op, 0)); break; case MVM_operand_callsite: operand_size = 2; a("Callsite_%"PRIu16, GET_UI16(cur_op, 0)); break; case MVM_operand_coderef: operand_size = 2; a("Frame_%"PRIu16, GET_UI16(cur_op, 0)); break; case MVM_operand_str: operand_size = 4; tmpstr = MVM_string_utf8_encode_C_string( tc, MVM_cu_string(tc, cu, GET_UI32(cur_op, 0))); /* XXX C-string-literal escape the \ and ' and line breaks and non-ascii someday */ a("'%s'", tmpstr); MVM_free(tmpstr); break; case MVM_operand_ins: operand_size = 4; /* luckily all the ins operands are at the end of op operands, so I can wait to resolve the label to the end. */ labels[GET_UI32(cur_op, 0)] |= MVM_val_branch_target; jumps[lineno] = GET_UI32(cur_op, 0); break; case MVM_operand_obj: /* not sure what a literal object is */ operand_size = 4; break; case MVM_operand_spesh_slot: operand_size = 2; a("sslot(%d)", GET_UI16(cur_op, 0)); break; default: abort(); /* never reached, silence compiler warnings */ } } else if (op_rw == MVM_operand_read_reg || op_rw == MVM_operand_write_reg) { /* register operand */ operand_size = 2; a("loc_%u_%s", GET_REG(cur_op, 0), get_typename(frame->body.local_types[GET_REG(cur_op, 0)])); } else if (op_rw == MVM_operand_read_lex || op_rw == MVM_operand_write_lex) { /* lexical operand */ MVMuint16 idx, frames, m; MVMStaticFrame *applicable_frame = static_frame; operand_size = 4; idx = GET_UI16(cur_op, 0); frames = GET_UI16(cur_op, 2); m = frames; while (m > 0) { applicable_frame = applicable_frame->body.outer; m--; } /* inefficient, I know. should use a hash. */ for (m = 0; m < cu->body.num_frames; m++) { if (get_frame(tc, cu, m) == applicable_frame) { char *lexname = frame_lexicals ? frame_lexicals[m][idx] : "lex??"; a("lex_Frame_%u_%s_%s", m, lexname, get_typename(applicable_frame->body.lexical_types[idx])); } } } cur_op += operand_size; } lines[lineno++] = o; } { MVMuint32 *linelabels = MVM_calloc(lineno, sizeof(MVMuint32)); MVMuint32 byte_offset = 0; MVMuint32 line_number = 0; MVMuint32 label_number = 1; MVMuint32 *annotations = MVM_calloc(lineno, sizeof(MVMuint32)); for (; byte_offset < bytecode_size; byte_offset++) { if (labels[byte_offset] & MVM_val_branch_target) { /* found a byte_offset where a label should be. now crawl up through the lines to find which line starts there */ while (linelocs[line_number] != byte_offset) line_number++; linelabels[line_number] = label_number++; } } o = oP; l = lP; s = sP; i = 0; /* resolve annotation line numbers */ for (j = 0; j < frame->body.num_annotations; j++) { MVMuint32 ann_offset = GET_UI32(frame->body.annotations_data, j*12); for (; i < lineno; i++) { if (linelocs[i] == ann_offset) { annotations[i] = j + 1; break; } } } for (j = 0; j < lineno; j++) { if (annotations[j]) { MVMuint16 shi = GET_UI16(frame->body.annotations_data + 4, (annotations[j] - 1)*12); tmpstr = MVM_string_utf8_encode_C_string( tc, MVM_cu_string(tc, cu, shi < cu->body.num_strings ? shi : 0)); a(" annotation: %s:%u\n", tmpstr, GET_UI32(frame->body.annotations_data, (annotations[j] - 1)*12 + 8)); MVM_free(tmpstr); } if (linelabels[j]) a(" label_%u:\n", linelabels[j]); a("%05d %s", j, lines[j]); MVM_free(lines[j]); if (jumps[j]) { /* horribly inefficient for large frames. again, should use a hash */ line_number = 0; while (linelocs[line_number] != jumps[j]) line_number++; a("label_%u(%05u)", linelabels[line_number], line_number); } a("\n"); } MVM_free(lines); MVM_free(jumps); MVM_free(linelocs); MVM_free(linelabels); MVM_free(labels); MVM_free(annotations); } *oo = o; *os = s; *ol = l; } char * MVM_bytecode_dump(MVMThreadContext *tc, MVMCompUnit *cu) { MVMuint32 s = 1024; MVMuint32 l = 0; MVMuint32 i, j, k; char *o = MVM_calloc(s, sizeof(char)); char ***frame_lexicals = MVM_malloc(sizeof(char **) * cu->body.num_frames); MVMString *name = MVM_string_utf8_decode(tc, tc->instance->VMString, "", 0); a("\nMoarVM dump of binary compilation unit:\n\n"); for (k = 0; k < cu->body.num_scs; k++) { char *tmpstr = MVM_string_utf8_encode_C_string( tc, MVM_cu_string(tc, cu, cu->body.sc_handle_idxs[k])); a(" SC_%u : %s\n", k, tmpstr); MVM_free(tmpstr); } for (k = 0; k < cu->body.num_callsites; k++) { MVMCallsite *callsite = cu->body.callsites[k]; MVMuint16 arg_count = callsite->arg_count; MVMuint16 nameds_count = 0; a(" Callsite_%u :\n", k); a(" num_pos: %d\n", callsite->num_pos); a(" arg_count: %u\n", arg_count); for (j = 0, i = 0; j < arg_count; j++) { MVMCallsiteEntry csitee = callsite->arg_flags[i++]; a(" Arg %u :", i); if (csitee & MVM_CALLSITE_ARG_NAMED) { if (callsite->arg_names) { char *arg_name = MVM_string_utf8_encode_C_string(tc, callsite->arg_names[nameds_count++]); a(" named(%s)", arg_name); MVM_free(arg_name); } else { a(" named"); } j++; } else if (csitee & MVM_CALLSITE_ARG_FLAT_NAMED) { a(" flatnamed"); } else if (csitee & MVM_CALLSITE_ARG_FLAT) { a(" flat"); } else a(" positional"); if (csitee & MVM_CALLSITE_ARG_OBJ) a(" obj"); else if (csitee & MVM_CALLSITE_ARG_INT) a(" int"); else if (csitee & MVM_CALLSITE_ARG_NUM) a(" num"); else if (csitee & MVM_CALLSITE_ARG_STR) a(" str"); if (csitee & MVM_CALLSITE_ARG_FLAT) a(" flat"); a("\n"); } } for (k = 0; k < cu->body.num_frames; k++) MVM_bytecode_finish_frame(tc, cu, get_frame(tc, cu, k), 1); for (k = 0; k < cu->body.num_frames; k++) { MVMStaticFrame *frame = get_frame(tc, cu, k); MVMLexicalRegistry *current, *tmp; unsigned bucket_tmp; char **lexicals; if (!frame->body.fully_deserialized) { MVM_bytecode_finish_frame(tc, cu, frame, 1); } lexicals = (char **)MVM_malloc(sizeof(char *) * frame->body.num_lexicals); frame_lexicals[k] = lexicals; HASH_ITER(hash_handle, frame->body.lexical_names, current, tmp, bucket_tmp) { name->body.storage.blob_32 = (MVMint32 *)current->hash_handle.key; name->body.num_graphs = (MVMuint32)current->hash_handle.keylen / sizeof(MVMGrapheme32); lexicals[current->value] = MVM_string_utf8_encode_C_string(tc, name); } } for (k = 0; k < cu->body.num_frames; k++) { MVMStaticFrame *frame = get_frame(tc, cu, k); char *cuuid; char *fname; cuuid = MVM_string_utf8_encode_C_string(tc, frame->body.cuuid); fname = MVM_string_utf8_encode_C_string(tc, frame->body.name); a(" Frame_%u :\n", k); a(" cuuid : %s\n", cuuid); MVM_free(cuuid); a(" name : %s\n", fname); MVM_free(fname); for (j = 0; j < cu->body.num_frames; j++) { if (get_frame(tc, cu, j) == frame->body.outer) a(" outer : Frame_%u\n", j); } for (j = 0; j < frame->body.num_locals; j++) { if (!j) a(" Locals :\n"); a(" %6u: loc_%u_%s\n", j, j, get_typename(frame->body.local_types[j])); } for (j = 0; j < frame->body.num_lexicals; j++) { if (!j) a(" Lexicals :\n"); a(" %6u: lex_Frame_%u_%s_%s\n", j, k, frame_lexicals[k][j], get_typename(frame->body.lexical_types[j])); } a(" Instructions :\n"); { bytecode_dump_frame_internal(tc, frame, NULL, NULL, frame_lexicals, &o, &s, &l); } } o[l] = '\0'; for (k = 0; k < cu->body.num_frames; k++) { for (j = 0; j < get_frame(tc, cu, k)->body.num_lexicals; j++) { MVM_free(frame_lexicals[k][j]); } MVM_free(frame_lexicals[k]); } MVM_free(frame_lexicals); return o; } #ifdef DEBUG_HELPERS void MVM_dump_bytecode_of(MVMThreadContext *tc, MVMFrame *frame, MVMSpeshCandidate *maybe_candidate) { MVMuint32 s = 1024; MVMuint32 l = 0; char *o = MVM_calloc(s, sizeof(char)); MVMuint8 *addr; if (!frame) { frame = tc->cur_frame; addr = *tc->interp_cur_op; } else { addr = frame->return_address; if (!addr) { addr = *tc->interp_cur_op; } } bytecode_dump_frame_internal(tc, frame->static_info, maybe_candidate, addr, NULL, &o, &s, &l); o[l] = 0; fprintf(stderr, "%s", o); } void MVM_dump_bytecode_staticframe(MVMThreadContext *tc, MVMStaticFrame *frame) { MVMuint32 s = 1024; MVMuint32 l = 0; char *o = MVM_calloc(s, sizeof(char)); bytecode_dump_frame_internal(tc, frame, NULL, NULL, NULL, &o, &s, &l); o[l] = 0; fprintf(stderr, "%s", o); } void MVM_dump_bytecode(MVMThreadContext *tc) { MVMStaticFrame *sf = tc->cur_frame->static_info; MVMuint8 *effective_bytecode = MVM_frame_effective_bytecode(tc->cur_frame); if (effective_bytecode == sf->body.bytecode) { MVM_dump_bytecode_of(tc, tc->cur_frame, NULL); } else { MVM_dump_bytecode_of(tc, tc->cur_frame, tc->cur_frame->spesh_cand); /*MVMint32 spesh_cand_idx;*/ /*MVMuint8 found = 0;*/ /*for (spesh_cand_idx = 0; spesh_cand_idx < sf->body.num_spesh_candidates; spesh_cand_idx++) {*/ /*MVMSpeshCandidate *cand = sf->body.spesh_candidates[spesh_cand_idx];*/ /*if (cand->bytecode == effective_bytecode) {*/ /*MVM_dump_bytecode_of(tc, tc->cur_frame, cand);*/ /*found = 1;*/ /*}*/ /*}*/ /*if (!found) {*/ /* It's likely the MAGIC_BYTECODE from the jit? * in that case we just grab tc->cur_frame->spesh_cand apparently */ /*}*/ } } void MVM_dump_bytecode_stackframe(MVMThreadContext *tc, MVMint32 depth) { MVMStaticFrame *sf; MVMuint8 *effective_bytecode; MVMFrame *frame = tc->cur_frame; for (;depth > 0; depth--) { frame = frame->caller; } sf = frame->static_info; effective_bytecode = MVM_frame_effective_bytecode(frame); if (effective_bytecode == sf->body.bytecode) { MVM_dump_bytecode_of(tc, frame, NULL); } else { MVMint32 spesh_cand_idx; MVMStaticFrameSpesh *spesh = sf->body.spesh; for (spesh_cand_idx = 0; spesh_cand_idx < spesh->body.num_spesh_candidates; spesh_cand_idx++) { MVMSpeshCandidate *cand = spesh->body.spesh_candidates[spesh_cand_idx]; if (cand->bytecode == effective_bytecode) { MVM_dump_bytecode_of(tc, frame, cand); } } } } #endif MoarVM-2018.03/src/core/bytecodedump.h0000644000175000017510000000010213237701240017547 0ustar samanthasamantha char * MVM_bytecode_dump(MVMThreadContext *tc, MVMCompUnit *cu); MoarVM-2018.03/src/core/callsite.c0000644000175000017510000001725413237701240016676 0ustar samanthasamantha#include "moar.h" /* Checks if two callsiates are equal. */ static MVMint32 callsites_equal(MVMThreadContext *tc, MVMCallsite *cs1, MVMCallsite *cs2, MVMint32 num_flags, MVMint32 num_nameds) { MVMint32 i; if (num_flags && memcmp(cs1->arg_flags, cs2->arg_flags, num_flags)) return 0; for (i = 0; i < num_nameds; i++) if (!MVM_string_equal(tc, cs1->arg_names[i], cs2->arg_names[i])) return 0; return 1; } static MVMCallsite null_args_callsite = { NULL, 0, 0, 0, 0, 0, 0, 0 }; static MVMCallsiteEntry obj_arg_flags[] = { MVM_CALLSITE_ARG_OBJ }; static MVMCallsite inv_arg_callsite = { obj_arg_flags, 1, 1, 1, 0, 0, 0, 0 }; static MVMCallsiteEntry two_obj_arg_flags[] = { MVM_CALLSITE_ARG_OBJ, MVM_CALLSITE_ARG_OBJ }; static MVMCallsite two_args_callsite = { two_obj_arg_flags, 2, 2, 2, 0, 0, 0 }; static MVMCallsiteEntry mnfe_flags[] = { MVM_CALLSITE_ARG_OBJ, MVM_CALLSITE_ARG_STR }; static MVMCallsite methnotfound_callsite = { mnfe_flags, 2, 2, 2, 0 }; static MVMCallsiteEntry fm_flags[] = { MVM_CALLSITE_ARG_OBJ, MVM_CALLSITE_ARG_OBJ, MVM_CALLSITE_ARG_STR }; static MVMCallsite findmeth_callsite = { fm_flags, 3, 3, 3, 0 }; static MVMCallsiteEntry tc_flags[] = { MVM_CALLSITE_ARG_OBJ, MVM_CALLSITE_ARG_OBJ, MVM_CALLSITE_ARG_OBJ }; static MVMCallsite typecheck_callsite = { tc_flags, 3, 3, 3, 0 }; static MVMCallsiteEntry obj_int_flags[] = { MVM_CALLSITE_ARG_OBJ, MVM_CALLSITE_ARG_INT }; static MVMCallsite obj_int_callsite = { obj_int_flags, 2, 2, 2, 0, 0, 0 }; static MVMCallsiteEntry obj_num_flags[] = { MVM_CALLSITE_ARG_OBJ, MVM_CALLSITE_ARG_NUM }; static MVMCallsite obj_num_callsite = { obj_num_flags, 2, 2, 2, 0, 0, 0 }; static MVMCallsiteEntry obj_str_flags[] = { MVM_CALLSITE_ARG_OBJ, MVM_CALLSITE_ARG_STR }; static MVMCallsite obj_str_callsite = { obj_str_flags, 2, 2, 2, 0, 0, 0 }; static MVMCallsiteEntry int_int_arg_flags[] = { MVM_CALLSITE_ARG_INT, MVM_CALLSITE_ARG_INT }; static MVMCallsite int_int_arg_callsite = { int_int_arg_flags, 2, 2, 2, 0, 0, 0, 0 }; MVM_PUBLIC MVMCallsite *MVM_callsite_get_common(MVMThreadContext *tc, MVMCommonCallsiteID id) { switch (id) { case MVM_CALLSITE_ID_NULL_ARGS: return &null_args_callsite; case MVM_CALLSITE_ID_INV_ARG: return &inv_arg_callsite; case MVM_CALLSITE_ID_TWO_OBJ: return &two_args_callsite; case MVM_CALLSITE_ID_METH_NOT_FOUND: return &methnotfound_callsite; case MVM_CALLSITE_ID_FIND_METHOD: return &findmeth_callsite; case MVM_CALLSITE_ID_TYPECHECK: return &typecheck_callsite; case MVM_CALLSITE_ID_OBJ_INT: return &obj_int_callsite; case MVM_CALLSITE_ID_OBJ_NUM: return &obj_num_callsite; case MVM_CALLSITE_ID_OBJ_STR: return &obj_str_callsite; case MVM_CALLSITE_ID_INT_INT: return &int_int_arg_callsite; default: MVM_exception_throw_adhoc(tc, "get_common_callsite: id %d unknown", id); } } int MVM_callsite_is_common(MVMCallsite *cs) { return cs == &null_args_callsite || cs == &inv_arg_callsite || cs == &two_args_callsite || cs == &methnotfound_callsite || cs == &findmeth_callsite || cs == &typecheck_callsite || cs == &obj_int_callsite || cs == &obj_num_callsite || cs == &obj_str_callsite; } void MVM_callsite_destroy(MVMCallsite *cs) { if (cs->flag_count) { MVM_free(cs->arg_flags); } if (cs->arg_names) { MVM_free(cs->arg_names); } if (cs->with_invocant) { MVM_callsite_destroy(cs->with_invocant); } MVM_free(cs); } MVMCallsite *MVM_callsite_copy(MVMThreadContext *tc, const MVMCallsite *cs) { MVMCallsite *copy = MVM_malloc(sizeof(MVMCallsite)); if (cs->flag_count) { copy->arg_flags = MVM_malloc(cs->flag_count); memcpy(copy->arg_flags, cs->arg_flags, cs->flag_count); } if (cs->arg_names) { MVMint32 num_named = MVM_callsite_num_nameds(tc, cs); copy->arg_names = MVM_malloc(num_named * sizeof(MVMString *)); memcpy(copy->arg_names, cs->arg_names, num_named * sizeof(MVMString *)); } else { copy->arg_names = NULL; } if (cs->with_invocant) { copy->with_invocant = MVM_callsite_copy(tc, cs->with_invocant); } else { copy->with_invocant = NULL; } copy->flag_count = cs->flag_count; copy->arg_count = cs->arg_count; copy->num_pos = cs->num_pos; copy->has_flattening = cs->has_flattening; copy->is_interned = cs->is_interned; return copy; } void MVM_callsite_initialize_common(MVMThreadContext *tc) { MVMCallsite *ptr; ptr = &inv_arg_callsite; MVM_callsite_try_intern(tc, &ptr); ptr = &null_args_callsite; MVM_callsite_try_intern(tc, &ptr); ptr = &methnotfound_callsite; MVM_callsite_try_intern(tc, &ptr); ptr = &two_args_callsite; MVM_callsite_try_intern(tc, &ptr); ptr = &findmeth_callsite; MVM_callsite_try_intern(tc, &ptr); ptr = &typecheck_callsite; MVM_callsite_try_intern(tc, &ptr); } /* Tries to intern the callsite, freeing and updating the one passed in and * replacing it with an already interned one if we find it. */ MVM_PUBLIC void MVM_callsite_try_intern(MVMThreadContext *tc, MVMCallsite **cs_ptr) { MVMCallsiteInterns *interns = tc->instance->callsite_interns; MVMCallsite *cs = *cs_ptr; MVMint32 num_flags = cs->flag_count; MVMint32 num_nameds = MVM_callsite_num_nameds(tc, cs); MVMint32 i, found; /* Can't intern anything with flattening. */ if (cs->has_flattening) return; /* Also can't intern past the max arity. */ if (num_flags >= MVM_INTERN_ARITY_LIMIT) return; /* Can intern things with nameds, provided we know the names. */ if (num_nameds > 0 && !cs->arg_names) return; /* Obtain mutex protecting interns store. */ uv_mutex_lock(&tc->instance->mutex_callsite_interns); /* Search for a match. */ found = 0; for (i = 0; i < interns->num_by_arity[num_flags]; i++) { if (callsites_equal(tc, interns->by_arity[num_flags][i], cs, num_flags, num_nameds)) { /* Got a match! Free the one we were passed and replace it with * the interned one. */ if (num_flags) MVM_free(cs->arg_flags); MVM_free(cs->arg_names); MVM_free(cs); *cs_ptr = interns->by_arity[num_flags][i]; found = 1; break; } } /* If it wasn't found, store it for the future. */ if (!found) { if (interns->num_by_arity[num_flags] % 8 == 0) { if (interns->num_by_arity[num_flags]) interns->by_arity[num_flags] = MVM_realloc( interns->by_arity[num_flags], sizeof(MVMCallsite *) * (interns->num_by_arity[num_flags] + 8)); else interns->by_arity[num_flags] = MVM_malloc(sizeof(MVMCallsite *) * 8); } interns->by_arity[num_flags][interns->num_by_arity[num_flags]++] = cs; cs->is_interned = 1; } /* Finally, release mutex. */ uv_mutex_unlock(&tc->instance->mutex_callsite_interns); } MoarVM-2018.03/src/core/callsite.h0000644000175000017510000001042713237701240016676 0ustar samanthasamantha/* Callsite argument flags. */ #define MVM_CALLSITE_ARG_MASK 31 typedef enum { /* Argument is an object. */ MVM_CALLSITE_ARG_OBJ = 1, /* Argument is a native integer, signed. */ MVM_CALLSITE_ARG_INT = 2, /* Argument is a native floating point number. */ MVM_CALLSITE_ARG_NUM = 4, /* Argument is a native NFG string (MVMString REPR). */ MVM_CALLSITE_ARG_STR = 8, /* Argument is named. The name is placed in the MVMCallsite. */ MVM_CALLSITE_ARG_NAMED = 32, /* Argument is flattened. What this means is up to the target. */ MVM_CALLSITE_ARG_FLAT = 64, /* Argument is flattened and named. */ MVM_CALLSITE_ARG_FLAT_NAMED = 128 } MVMCallsiteFlags; typedef enum { /* Zero argument callsite. */ MVM_CALLSITE_ID_NULL_ARGS, /* Dummy, invocant-arg callsite. Taken from coerce.c; * OBJ */ MVM_CALLSITE_ID_INV_ARG, /* Callsite for container store. Taken from containers.c; * OBJ, OBJ */ MVM_CALLSITE_ID_TWO_OBJ, /* Callsite for method not found errors. Taken from 6model.c; * OBJ, STR */ MVM_CALLSITE_ID_METH_NOT_FOUND, /* Callsite for finding methods. Taken from 6model.c; * OBJ, OBJ, STR */ MVM_CALLSITE_ID_FIND_METHOD, /* Callsite for typechecks. Taken from 6model.c; * OBJ, OBJ, OBJ */ MVM_CALLSITE_ID_TYPECHECK, /* Callsite OBJ, INT */ MVM_CALLSITE_ID_OBJ_INT, /* Callsite OBJ, INT */ MVM_CALLSITE_ID_OBJ_NUM, /* Callsite OBJ, STR */ MVM_CALLSITE_ID_OBJ_STR, /* Callsite INT, INT */ MVM_CALLSITE_ID_INT_INT, } MVMCommonCallsiteID; /* A callsite entry is just one of the above flags. */ typedef MVMuint8 MVMCallsiteEntry; /* A callsite is an argument count, a bunch of flags, and names of named * arguments (excluding any flattening ones). Note that it does not contain * the argument values; this is the *statically known* things about the * callsite and is immutable. It describes how to process the callsite * memory buffer. */ struct MVMCallsite { /* The set of flags. */ MVMCallsiteEntry *arg_flags; /* The number of arg flags. */ MVMuint16 flag_count; /* The total argument count (including 2 for each named arg). */ MVMuint16 arg_count; /* Number of positionals, including flattening positionals but * excluding named positionals. */ MVMuint16 num_pos; /* Whether it has any flattening args. */ MVMuint8 has_flattening; /* Whether it has been interned (which means it is suitable for using in * specialization). */ MVMuint8 is_interned; /* Cached version of this callsite with an extra invocant arg. */ MVMCallsite *with_invocant; /* Names of named arguments, in the order that they are passed (and thus * matching the flags). Note that named flattening args do not have an * entry here, even though they come in the nameds section. */ MVMString **arg_names; }; /* Minimum callsite size is due to certain things internally expecting us to * have that many slots available (e.g. find_method(how, obj, name)). */ #define MVM_MIN_CALLSITE_SIZE 3 /* Maximum arity + 1 that we'll intern callsites by. */ #define MVM_INTERN_ARITY_LIMIT 8 /* Interned callsites data structure. */ struct MVMCallsiteInterns { /* Array of callsites, by arity. */ MVMCallsite **by_arity[MVM_INTERN_ARITY_LIMIT]; /* Number of callsites we have interned by arity. */ MVMint32 num_by_arity[MVM_INTERN_ARITY_LIMIT]; }; /* Initialize the "common" callsites */ void MVM_callsite_initialize_common(MVMThreadContext *tc); /* Get any of the "common" callsites */ MVM_PUBLIC MVMCallsite *MVM_callsite_get_common(MVMThreadContext *tc, MVMCommonCallsiteID id); int MVM_callsite_is_common(MVMCallsite *cs); void MVM_callsite_destroy(MVMCallsite *cs); MVMCallsite *MVM_callsite_copy(MVMThreadContext *tc, const MVMCallsite *cs); /* Callsite interning function. */ MVM_PUBLIC void MVM_callsite_try_intern(MVMThreadContext *tc, MVMCallsite **cs); /* Count the number of nameds (excluding flattening). */ MVM_STATIC_INLINE MVMuint16 MVM_callsite_num_nameds(MVMThreadContext *tc, const MVMCallsite *cs) { MVMuint16 i = cs->num_pos; MVMuint16 nameds = 0; while (i < cs->flag_count) { if (!(cs->arg_flags[i] & MVM_CALLSITE_ARG_FLAT_NAMED)) nameds++; i++; } return nameds; } MoarVM-2018.03/src/core/callstack.c0000644000175000017510000000432513237701240017032 0ustar samanthasamantha#include "moar.h" /* Allocates a new call stack region, not incorporated into the regions double * linked list yet. */ static MVMCallStackRegion * create_region() { MVMCallStackRegion *region = MVM_malloc(MVM_CALLSTACK_REGION_SIZE); region->prev = region->next = NULL; region->alloc = (char *)region + sizeof(MVMCallStackRegion); region->alloc_limit = (char *)region + MVM_CALLSTACK_REGION_SIZE; return region; } /* Called upon thread creation to set up an initial callstack region for the * thread. */ void MVM_callstack_region_init(MVMThreadContext *tc) { tc->stack_first = tc->stack_current = create_region(); } /* Moves the current call stack region we're allocating/freeing in along to * the next one in the region chain, allocating that next one if needed. */ MVMCallStackRegion * MVM_callstack_region_next(MVMThreadContext *tc) { MVMCallStackRegion *next_region = tc->stack_current->next; if (!next_region) { next_region = create_region(); tc->stack_current->next = next_region; next_region->prev = tc->stack_current; } tc->stack_current = next_region; return next_region; } /* Switches to the previous call stack region, if any. Otherwise, stays in * the current region. */ MVMCallStackRegion * MVM_callstack_region_prev(MVMThreadContext *tc) { MVMCallStackRegion *prev_region = tc->stack_current->prev; if (prev_region) tc->stack_current = prev_region; else prev_region = tc->stack_current; return prev_region; } /* Resets a threads's callstack to be empty. Used when its contents has been * promoted to the heap. */ void MVM_callstack_reset(MVMThreadContext *tc) { MVMCallStackRegion *cur_region = tc->stack_current; while (cur_region) { cur_region->alloc = (char *)cur_region + sizeof(MVMCallStackRegion); cur_region = cur_region->prev; } tc->stack_current = tc->stack_first; } /* Called at thread exit to destroy all callstack regions the thread has. */ void MVM_callstack_region_destroy_all(MVMThreadContext *tc) { MVMCallStackRegion *cur = tc->stack_first; while (cur) { MVMCallStackRegion *next = cur->next; MVM_free(cur); cur = next; } tc->stack_first = NULL; } MoarVM-2018.03/src/core/callstack.h0000644000175000017510000000165713237701240017044 0ustar samanthasamantha/* A region of the call stack, used for call frames that have not escaped to * the heap. */ struct MVMCallStackRegion { /* Next call stack region, which we start allocating in if this one is * full. NULL if none has been allocated yet. */ MVMCallStackRegion *next; /* Previous call stack region, if any. */ MVMCallStackRegion *prev; /* The place we'll allocate the next frame. */ char *alloc; /* The end of the allocatable region. */ char *alloc_limit; }; /* The default size of a call stack region. */ #define MVM_CALLSTACK_REGION_SIZE 131072 /* Functions for working with call stack regions. */ void MVM_callstack_region_init(MVMThreadContext *tc); MVMCallStackRegion * MVM_callstack_region_next(MVMThreadContext *tc); MVMCallStackRegion * MVM_callstack_region_prev(MVMThreadContext *tc); void MVM_callstack_reset(MVMThreadContext *tc); void MVM_callstack_region_destroy_all(MVMThreadContext *tc); MoarVM-2018.03/src/core/coerce.c0000644000175000017510000004340413237701240016332 0ustar samanthasamantha#include "moar.h" #if defined(_MSC_VER) #define strtoll _strtoi64 #define snprintf _snprintf #endif /* Special return structure for boolification handling. */ typedef struct { MVMuint8 *true_addr; MVMuint8 *false_addr; MVMuint8 flip; MVMRegister res_reg; } BoolMethReturnData; MVMint64 MVM_coerce_istrue_s(MVMThreadContext *tc, MVMString *str) { return str == NULL || !IS_CONCRETE(str) || MVM_string_graphs_nocheck(tc, str) == 0 ? 0 : 1; } /* Tries to do the boolification. It may be that a method call is needed. In * this case, a return hook is set up to handle doing the right thing. The * result register to put the result in should be indicated in res_reg, or * alternatively the true/false addresses to set the PC to should be set. * In the register case, expects that the current PC is already at the * next instruction before this is called. */ static void boolify_return(MVMThreadContext *tc, void *sr_data); static void flip_return(MVMThreadContext *tc, void *sr_data); void MVM_coerce_istrue(MVMThreadContext *tc, MVMObject *obj, MVMRegister *res_reg, MVMuint8 *true_addr, MVMuint8 *false_addr, MVMuint8 flip) { MVMint64 result = 0; if (!MVM_is_null(tc, obj)) { MVMBoolificationSpec *bs = obj->st->boolification_spec; switch (bs == NULL ? MVM_BOOL_MODE_NOT_TYPE_OBJECT : bs->mode) { case MVM_BOOL_MODE_CALL_METHOD: { MVMObject *code = MVM_frame_find_invokee(tc, bs->method, NULL); MVMCallsite *inv_arg_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_INV_ARG); if (res_reg) { /* We need to do the invocation, and set this register * the result. Then we just do the call. For the flip * case, just set up special return handler to flip * the register. */ MVM_args_setup_thunk(tc, res_reg, MVM_RETURN_INT, inv_arg_callsite); tc->cur_frame->args[0].o = obj; if (flip) MVM_frame_special_return(tc, tc->cur_frame, flip_return, NULL, res_reg, NULL); STABLE(code)->invoke(tc, code, inv_arg_callsite, tc->cur_frame->args); } else { /* Need to set up special return hook. */ BoolMethReturnData *data = MVM_malloc(sizeof(BoolMethReturnData)); data->true_addr = true_addr; data->false_addr = false_addr; data->flip = flip; MVM_frame_special_return(tc, tc->cur_frame, boolify_return, NULL, data, NULL); MVM_args_setup_thunk(tc, &data->res_reg, MVM_RETURN_INT, inv_arg_callsite); tc->cur_frame->args[0].o = obj; STABLE(code)->invoke(tc, code, inv_arg_callsite, tc->cur_frame->args); } return; } case MVM_BOOL_MODE_UNBOX_INT: result = !IS_CONCRETE(obj) || REPR(obj)->box_funcs.get_int(tc, STABLE(obj), obj, OBJECT_BODY(obj)) == 0 ? 0 : 1; break; case MVM_BOOL_MODE_UNBOX_NUM: result = !IS_CONCRETE(obj) || REPR(obj)->box_funcs.get_num(tc, STABLE(obj), obj, OBJECT_BODY(obj)) == 0.0 ? 0 : 1; break; case MVM_BOOL_MODE_UNBOX_STR_NOT_EMPTY: { MVMString *str; if (!IS_CONCRETE(obj)) { result = 0; break; } str = REPR(obj)->box_funcs.get_str(tc, STABLE(obj), obj, OBJECT_BODY(obj)); result = MVM_coerce_istrue_s(tc, str); break; } case MVM_BOOL_MODE_UNBOX_STR_NOT_EMPTY_OR_ZERO: { MVMString *str; MVMint64 chars; if (!IS_CONCRETE(obj)) { result = 0; break; } str = REPR(obj)->box_funcs.get_str(tc, STABLE(obj), obj, OBJECT_BODY(obj)); if (str == NULL || !IS_CONCRETE(str)) { result = 0; break; } chars = MVM_string_graphs_nocheck(tc, str); result = chars == 0 || (chars == 1 && MVM_string_get_grapheme_at_nocheck(tc, str, 0) == 48) ? 0 : 1; break; } case MVM_BOOL_MODE_NOT_TYPE_OBJECT: result = !IS_CONCRETE(obj) ? 0 : 1; break; case MVM_BOOL_MODE_BIGINT: result = IS_CONCRETE(obj) ? MVM_bigint_bool(tc, obj) : 0; break; case MVM_BOOL_MODE_ITER: result = IS_CONCRETE(obj) ? MVM_iter_istrue(tc, (MVMIter *)obj) : 0; break; case MVM_BOOL_MODE_HAS_ELEMS: result = IS_CONCRETE(obj) ? MVM_repr_elems(tc, obj) != 0 : 0; break; default: MVM_exception_throw_adhoc(tc, "Invalid boolification spec mode used"); } } if (flip) result = result ? 0 : 1; if (res_reg) { res_reg->i64 = result; } else { if (result) *(tc->interp_cur_op) = true_addr; else *(tc->interp_cur_op) = false_addr; } } /* Callback after running boolification method. */ static void boolify_return(MVMThreadContext *tc, void *sr_data) { BoolMethReturnData *data = (BoolMethReturnData *)sr_data; MVMint64 result = data->res_reg.i64; if (data->flip) result = result ? 0 : 1; if (result) *(tc->interp_cur_op) = data->true_addr; else *(tc->interp_cur_op) = data->false_addr; MVM_free(data); } /* Callback to flip result. */ static void flip_return(MVMThreadContext *tc, void *sr_data) { MVMRegister *r = (MVMRegister *)sr_data; r->i64 = r->i64 ? 0 : 1; } MVMString * MVM_coerce_i_s(MVMThreadContext *tc, MVMint64 i) { char buffer[64]; int len; /* See if we can hit the cache. */ int cache = 0 <= i && i < MVM_INT_TO_STR_CACHE_SIZE; if (cache) { MVMString *cached = tc->instance->int_to_str_cache[i]; if (cached) return cached; } /* Otherwise, need to do the work; cache it if in range. */ len = snprintf(buffer, 64, "%"PRIi64"", i); if (0 <= len) { MVMString *result = MVM_string_ascii_decode(tc, tc->instance->VMString, buffer, len); if (cache) tc->instance->int_to_str_cache[i] = result; return result; } else { MVM_exception_throw_adhoc(tc, "Could not stringify integer"); } } MVMString * MVM_coerce_n_s(MVMThreadContext *tc, MVMnum64 n) { if (n == MVM_num_posinf(tc)) { return MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "Inf"); } else if (n == MVM_num_neginf(tc)) { return MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "-Inf"); } else if (n != n) { return MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "NaN"); } else { char buf[64]; int i; if (snprintf(buf, 64, "%.15g", n) < 0) MVM_exception_throw_adhoc(tc, "Could not stringify number"); if (strstr(buf, ".")) { MVMint64 is_not_scientific = !strstr(buf, "e"); i = strlen(buf); while (i > 1 && ((buf[--i] == '0' && is_not_scientific) || buf[i] == ' ')) buf[i] = '\0'; if (buf[i] == '.') buf[i] = '\0'; } return MVM_string_ascii_decode(tc, tc->instance->VMString, buf, strlen(buf)); } } void MVM_coerce_smart_stringify(MVMThreadContext *tc, MVMObject *obj, MVMRegister *res_reg) { MVMObject *strmeth; const MVMStorageSpec *ss; /* Handle null case. */ if (MVM_is_null(tc, obj)) { res_reg->s = tc->instance->str_consts.empty; return; } /* If it can unbox as a string, that wins right off. */ ss = REPR(obj)->get_storage_spec(tc, STABLE(obj)); if (ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_STR && IS_CONCRETE(obj)) { res_reg->s = REPR(obj)->box_funcs.get_str(tc, STABLE(obj), obj, OBJECT_BODY(obj)); return; } /* Check if there is a Str method. */ MVMROOT(tc, obj, { strmeth = MVM_6model_find_method_cache_only(tc, obj, tc->instance->str_consts.Str); }); if (!MVM_is_null(tc, strmeth)) { /* We need to do the invocation; just set it up with our result reg as * the one for the call. */ MVMObject *code = MVM_frame_find_invokee(tc, strmeth, NULL); MVMCallsite *inv_arg_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_INV_ARG); MVM_args_setup_thunk(tc, res_reg, MVM_RETURN_STR, inv_arg_callsite); tc->cur_frame->args[0].o = obj; STABLE(code)->invoke(tc, code, inv_arg_callsite, tc->cur_frame->args); return; } /* Otherwise, guess something appropriate. */ if (!IS_CONCRETE(obj)) res_reg->s = tc->instance->str_consts.empty; else { if (REPR(obj)->ID == MVM_REPR_ID_MVMException) res_reg->s = ((MVMException *)obj)->body.message; else if (ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_INT) res_reg->s = MVM_coerce_i_s(tc, REPR(obj)->box_funcs.get_int(tc, STABLE(obj), obj, OBJECT_BODY(obj))); else if (ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_NUM) res_reg->s = MVM_coerce_n_s(tc, REPR(obj)->box_funcs.get_num(tc, STABLE(obj), obj, OBJECT_BODY(obj))); else MVM_exception_throw_adhoc(tc, "cannot stringify this"); } } MVMint64 MVM_coerce_s_i(MVMThreadContext *tc, MVMString *s) { char *enc = MVM_string_ascii_encode(tc, s, NULL, 0); MVMint64 i = strtoll(enc, NULL, 10); MVM_free(enc); return i; } void MVM_coerce_smart_numify(MVMThreadContext *tc, MVMObject *obj, MVMRegister *res_reg) { MVMObject *nummeth; /* Handle null case. */ if (MVM_is_null(tc, obj)) { res_reg->n64 = 0.0; return; } /* Check if there is a Num method. */ MVMROOT(tc, obj, { nummeth = MVM_6model_find_method_cache_only(tc, obj, tc->instance->str_consts.Num); }); if (!MVM_is_null(tc, nummeth)) { /* We need to do the invocation; just set it up with our result reg as * the one for the call. */ MVMObject *code = MVM_frame_find_invokee(tc, nummeth, NULL); MVMCallsite *inv_arg_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_INV_ARG); MVM_args_setup_thunk(tc, res_reg, MVM_RETURN_NUM, inv_arg_callsite); tc->cur_frame->args[0].o = obj; STABLE(code)->invoke(tc, code, inv_arg_callsite, tc->cur_frame->args); return; } /* Otherwise, guess something appropriate. */ if (!IS_CONCRETE(obj)) { res_reg->n64 = 0.0; } else { const MVMStorageSpec *ss = REPR(obj)->get_storage_spec(tc, STABLE(obj)); if (ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_INT) res_reg->n64 = (MVMnum64)REPR(obj)->box_funcs.get_int(tc, STABLE(obj), obj, OBJECT_BODY(obj)); else if (ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_NUM) res_reg->n64 = REPR(obj)->box_funcs.get_num(tc, STABLE(obj), obj, OBJECT_BODY(obj)); else if (ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_STR) res_reg->n64 = MVM_coerce_s_n(tc, REPR(obj)->box_funcs.get_str(tc, STABLE(obj), obj, OBJECT_BODY(obj))); else if (REPR(obj)->ID == MVM_REPR_ID_VMArray) res_reg->n64 = (MVMnum64)REPR(obj)->elems(tc, STABLE(obj), obj, OBJECT_BODY(obj)); else if (REPR(obj)->ID == MVM_REPR_ID_MVMHash) res_reg->n64 = (MVMnum64)REPR(obj)->elems(tc, STABLE(obj), obj, OBJECT_BODY(obj)); else MVM_exception_throw_adhoc(tc, "cannot numify this"); } } MVMint64 MVM_coerce_simple_intify(MVMThreadContext *tc, MVMObject *obj) { /* Handle null and non-concrete case. */ if (MVM_is_null(tc, obj) || !IS_CONCRETE(obj)) { return 0; } /* Otherwise, guess something appropriate. */ else { const MVMStorageSpec *ss = REPR(obj)->get_storage_spec(tc, STABLE(obj)); if (ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_INT) return REPR(obj)->box_funcs.get_int(tc, STABLE(obj), obj, OBJECT_BODY(obj)); else if (ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_NUM) return (MVMint64)REPR(obj)->box_funcs.get_num(tc, STABLE(obj), obj, OBJECT_BODY(obj)); else if (ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_STR) return MVM_coerce_s_i(tc, REPR(obj)->box_funcs.get_str(tc, STABLE(obj), obj, OBJECT_BODY(obj))); else if (REPR(obj)->ID == MVM_REPR_ID_VMArray) return REPR(obj)->elems(tc, STABLE(obj), obj, OBJECT_BODY(obj)); else if (REPR(obj)->ID == MVM_REPR_ID_MVMHash) return REPR(obj)->elems(tc, STABLE(obj), obj, OBJECT_BODY(obj)); else MVM_exception_throw_adhoc(tc, "cannot intify this"); } } /* concatenating with "" ensures that only literal strings are accepted as argument. */ #define STR_WITH_LEN(str) ("" str ""), (sizeof(str) - 1) MVMObject * MVM_radix(MVMThreadContext *tc, MVMint64 radix, MVMString *str, MVMint64 offset, MVMint64 flag) { MVMObject *result; MVMint64 zvalue = 0; MVMint64 zbase = 1; MVMint64 chars = MVM_string_graphs(tc, str); MVMint64 value = zvalue; MVMint64 base = zbase; MVMint64 pos = -1; MVMuint16 neg = 0; MVMint64 ch; if (radix > 36) { MVM_exception_throw_adhoc(tc, "Cannot convert radix of %"PRId64" (max 36)", radix); } ch = (offset < chars) ? MVM_string_get_grapheme_at_nocheck(tc, str, offset) : 0; if ((flag & 0x02) && (ch == '+' || ch == '-')) { neg = (ch == '-'); offset++; ch = (offset < chars) ? MVM_string_get_grapheme_at_nocheck(tc, str, offset) : 0; } while (offset < chars) { if (ch >= '0' && ch <= '9') ch = ch - '0'; /* fast-path for ASCII 0..9 */ else if (ch >= 'a' && ch <= 'z') ch = ch - 'a' + 10; else if (ch >= 'A' && ch <= 'Z') ch = ch - 'A' + 10; else if (ch >= 0xFF21 && ch <= 0xFF3A) ch = ch - 0xFF21 + 10; /* uppercase fullwidth */ else if (ch >= 0xFF41 && ch <= 0xFF5A) ch = ch - 0xFF41 + 10; /* lowercase fullwidth */ else if (ch > 0 && MVM_unicode_codepoint_get_property_int(tc, ch, MVM_UNICODE_PROPERTY_NUMERIC_TYPE) == MVM_UNICODE_PVALUE_Numeric_Type_DECIMAL) { /* as of Unicode 9.0.0, characters with the 'de' Numeric Type (and are * thus also of General Category Nd, since 4.0.0) are contiguous * sequences of 10 chars whose Numeric Values ascend from 0 through 9. */ /* the string returned for NUMERIC_VALUE_NUMERATOR contains an integer * value. We can use numerator because they all are from 0-9 and have * denominator of 1 */ ch = fast_atoi(MVM_unicode_codepoint_get_property_cstr(tc, ch, MVM_UNICODE_PROPERTY_NUMERIC_VALUE_NUMERATOR)); } else break; if (ch >= radix) break; zvalue = zvalue * radix + ch; zbase = zbase * radix; offset++; pos = offset; if (ch != 0 || !(flag & 0x04)) { value=zvalue; base=zbase; } if (offset >= chars) break; ch = MVM_string_get_grapheme_at_nocheck(tc, str, offset); if (ch != '_') continue; offset++; if (offset >= chars) break; ch = MVM_string_get_grapheme_at_nocheck(tc, str, offset); } if (neg || flag & 0x01) { value = -value; } /* initialize the object */ result = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_array_type); MVMROOT(tc, result, { MVMObject *box_type = MVM_hll_current(tc)->int_box_type; MVMROOT(tc, box_type, { MVMObject *boxed = MVM_repr_box_int(tc, box_type, value); MVM_repr_push_o(tc, result, boxed); boxed = MVM_repr_box_int(tc, box_type, base); MVM_repr_push_o(tc, result, boxed); boxed = MVM_repr_box_int(tc, box_type, pos); MVM_repr_push_o(tc, result, boxed); }); }); return result; } void MVM_box_int(MVMThreadContext *tc, MVMint64 value, MVMObject *type, MVMRegister * dst) { MVMObject *box = MVM_intcache_get(tc, type, value); if (box == 0) { box = REPR(type)->allocate(tc, STABLE(type)); if (REPR(box)->initialize) REPR(box)->initialize(tc, STABLE(box), box, OBJECT_BODY(box)); REPR(box)->box_funcs.set_int(tc, STABLE(box), box, OBJECT_BODY(box), value); } dst->o = box; } void MVM_box_num(MVMThreadContext *tc, MVMnum64 value, MVMObject *type, MVMRegister * dst) { MVMObject *box = REPR(type)->allocate(tc, STABLE(type)); if (REPR(box)->initialize) REPR(box)->initialize(tc, STABLE(box), box, OBJECT_BODY(box)); REPR(box)->box_funcs.set_num(tc, STABLE(box), box, OBJECT_BODY(box), value); dst->o = box; } void MVM_box_str(MVMThreadContext *tc, MVMString *value, MVMObject *type, MVMRegister * dst) { MVMObject *box; MVMROOT(tc, value, { box = REPR(type)->allocate(tc, STABLE(type)); if (REPR(box)->initialize) REPR(box)->initialize(tc, STABLE(box), box, OBJECT_BODY(box)); REPR(box)->box_funcs.set_str(tc, STABLE(box), box, OBJECT_BODY(box), value); dst->o = box; }); } void MVM_box_uint(MVMThreadContext *tc, MVMuint64 value, MVMObject *type, MVMRegister * dst) { MVMObject *box = REPR(type)->allocate(tc, STABLE(type)); if (REPR(box)->initialize) REPR(box)->initialize(tc, STABLE(box), box, OBJECT_BODY(box)); REPR(box)->box_funcs.set_uint(tc, STABLE(box), box, OBJECT_BODY(box), value); dst->o = box; } MoarVM-2018.03/src/core/coerce.h0000644000175000017510000000245513237701240016340 0ustar samanthasamantha/* Boolification. */ MVMint64 MVM_coerce_istrue_s(MVMThreadContext *tc, MVMString *str); void MVM_coerce_istrue(MVMThreadContext *tc, MVMObject *obj, MVMRegister *res_reg, MVMuint8 *true_addr, MVMuint8 *false_addr, MVMuint8 flip); /* Stringification. */ MVMString * MVM_coerce_i_s(MVMThreadContext *tc, MVMint64 i); MVMString * MVM_coerce_n_s(MVMThreadContext *tc, MVMnum64 n); void MVM_coerce_smart_stringify(MVMThreadContext *tc, MVMObject *obj, MVMRegister *res_reg); /* Numification. */ MVMint64 MVM_coerce_s_i(MVMThreadContext *tc, MVMString *s); void MVM_coerce_smart_numify(MVMThreadContext *tc, MVMObject *obj, MVMRegister *res_reg); MVMint64 MVM_coerce_simple_intify(MVMThreadContext *tc, MVMObject *obj); MVMObject* MVM_radix(MVMThreadContext *tc, MVMint64 radix, MVMString *str, MVMint64 offset, MVMint64 flag); /* Size of the int to string coercion cache (we cache 0 ..^ this). */ #define MVM_INT_TO_STR_CACHE_SIZE 64 /* Objification */ void MVM_box_int(MVMThreadContext *tc, MVMint64 value, MVMObject *type, MVMRegister *dst); void MVM_box_num(MVMThreadContext *tc, MVMnum64 value, MVMObject *type, MVMRegister *dst); void MVM_box_str(MVMThreadContext *tc, MVMString *value, MVMObject *type, MVMRegister *dst); void MVM_box_uint(MVMThreadContext *tc, MVMuint64 value, MVMObject *type, MVMRegister *dst); MoarVM-2018.03/src/core/compunit.c0000644000175000017510000002233213237701240016725 0ustar samanthasamantha#include "moar.h" #include "platform/mmap.h" #ifdef _WIN32 #include #define O_RDONLY _O_RDONLY #endif /* Creates a compilation unit from a byte array. */ MVMCompUnit * MVM_cu_from_bytes(MVMThreadContext *tc, MVMuint8 *bytes, MVMuint32 size) { /* Create compilation unit data structure. Allocate it in gen2 always, so * it will never move (the JIT relies on this). */ MVMCompUnit *cu; MVM_gc_allocate_gen2_default_set(tc); cu = (MVMCompUnit *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTCompUnit); cu->body.data_start = bytes; cu->body.data_size = size; MVM_gc_allocate_gen2_default_clear(tc); /* Process the input. */ MVMROOT(tc, cu, { MVM_bytecode_unpack(tc, cu); }); /* Resolve HLL config. It may contain nursery pointers, so fire write * barrier on it. */ cu->body.hll_config = MVM_hll_get_config_for(tc, cu->body.hll_name); MVM_gc_write_barrier_hit(tc, (MVMCollectable *)cu); return cu; } /* Loads a compilation unit from a bytecode file, mapping it into memory. */ MVMCompUnit * MVM_cu_map_from_file(MVMThreadContext *tc, const char *filename) { MVMCompUnit *cu = NULL; void *block = NULL; void *handle = NULL; uv_file fd; MVMuint64 size; uv_fs_t req; /* Ensure the file exists, and get its size. */ if (uv_fs_stat(tc->loop, &req, filename, NULL) < 0) { MVM_exception_throw_adhoc(tc, "While looking for '%s': %s", filename, uv_strerror(req.result)); } size = req.statbuf.st_size; /* Map the bytecode file into memory. */ if ((fd = uv_fs_open(tc->loop, &req, filename, O_RDONLY, 0, NULL)) < 0) { MVM_exception_throw_adhoc(tc, "While trying to open '%s': %s", filename, uv_strerror(req.result)); } if ((block = MVM_platform_map_file(fd, &handle, (size_t)size, 0)) == NULL) { /* FIXME: check errno or GetLastError() */ MVM_exception_throw_adhoc(tc, "Could not map file '%s' into memory: %s", filename, "FIXME"); } if (uv_fs_close(tc->loop, &req, fd, NULL) < 0) { MVM_exception_throw_adhoc(tc, "Failed to close filehandle: %s", uv_strerror(req.result)); } /* Turn it into a compilation unit. */ cu = MVM_cu_from_bytes(tc, (MVMuint8 *)block, (MVMuint32)size); cu->body.handle = handle; cu->body.deallocate = MVM_DEALLOCATE_UNMAP; return cu; } /* Loads a compilation unit from a bytecode file handle, mapping it into memory. */ MVMCompUnit * MVM_cu_map_from_file_handle(MVMThreadContext *tc, uv_file fd, MVMuint64 pos) { MVMCompUnit *cu = NULL; void *block = NULL; void *handle = NULL; MVMuint64 size; uv_fs_t req; /* Ensure the file exists, and get its size. */ if (uv_fs_fstat(tc->loop, &req, fd, NULL) < 0) { MVM_exception_throw_adhoc(tc, "Trying to stat: %s", uv_strerror(req.result)); } size = req.statbuf.st_size; if ((block = MVM_platform_map_file(fd, &handle, (size_t)size, 0)) == NULL) { /* FIXME: check errno or GetLastError() */ MVM_exception_throw_adhoc(tc, "Could not map file into memory: %s", "FIXME"); } block = ((char*)block) + pos; /* Turn it into a compilation unit. */ cu = MVM_cu_from_bytes(tc, (MVMuint8 *)block, (MVMuint32)size); cu->body.handle = handle; cu->body.deallocate = MVM_DEALLOCATE_UNMAP; return cu; } /* Adds an extra callsite, needed due to an inlining, and returns its index. */ MVMuint16 MVM_cu_callsite_add(MVMThreadContext *tc, MVMCompUnit *cu, MVMCallsite *cs) { MVMuint16 found = 0; MVMuint16 idx; uv_mutex_lock(cu->body.inline_tweak_mutex); /* See if we already know this callsite. */ for (idx = 0; idx < cu->body.num_callsites; idx++) if (cu->body.callsites[idx] == cs) { found = 1; break; } if (!found) { /* Not known; let's add it. */ size_t orig_size = cu->body.num_callsites * sizeof(MVMCallsite *); size_t new_size = (cu->body.num_callsites + 1) * sizeof(MVMCallsite *); MVMCallsite **new_callsites = MVM_fixed_size_alloc(tc, tc->instance->fsa, new_size); memcpy(new_callsites, cu->body.callsites, orig_size); idx = cu->body.num_callsites; new_callsites[idx] = MVM_callsite_copy(tc, cs); if (cu->body.callsites) MVM_fixed_size_free_at_safepoint(tc, tc->instance->fsa, orig_size, cu->body.callsites); cu->body.callsites = new_callsites; cu->body.num_callsites++; } uv_mutex_unlock(cu->body.inline_tweak_mutex); return idx; } /* Adds an extra string, needed due to an inlining, and returns its index. */ MVMuint32 MVM_cu_string_add(MVMThreadContext *tc, MVMCompUnit *cu, MVMString *str) { MVMuint32 found = 0; MVMuint32 idx; uv_mutex_lock(cu->body.inline_tweak_mutex); /* See if we already know this string; only consider those added already by * inline, since we don't intern and don't want this to be costly to hunt. */ for (idx = cu->body.orig_strings; idx < cu->body.num_strings; idx++) if (MVM_cu_string(tc, cu, idx) == str) { found = 1; break; } if (!found) { /* Not known; let's add it. */ size_t orig_size = cu->body.num_strings * sizeof(MVMString *); size_t new_size = (cu->body.num_strings + 1) * sizeof(MVMString *); MVMString **new_strings = MVM_fixed_size_alloc(tc, tc->instance->fsa, new_size); memcpy(new_strings, cu->body.strings, orig_size); idx = cu->body.num_strings; new_strings[idx] = str; if (cu->body.strings) MVM_fixed_size_free_at_safepoint(tc, tc->instance->fsa, orig_size, cu->body.strings); cu->body.strings = new_strings; cu->body.num_strings++; } uv_mutex_unlock(cu->body.inline_tweak_mutex); return idx; } /* Used when we try to read a string from the string heap, but it's not there. * Decodes it "on-demand" and stores it in the string heap. */ static MVMuint32 read_uint32(MVMuint8 *src) { #ifdef MVM_BIGENDIAN MVMuint32 value; size_t i; MVMuint8 *destbytes = (MVMuint8 *)&value; for (i = 0; i < 4; i++) destbytes[4 - i - 1] = src[i]; return value; #else return *((MVMuint32 *)src); #endif } static void compute_fast_table_upto(MVMThreadContext *tc, MVMCompUnit *cu, MVMuint32 end_bin) { MVMuint32 cur_bin = cu->body.string_heap_fast_table_top; MVMuint8 *cur_pos = cu->body.string_heap_start + cu->body.string_heap_fast_table[cur_bin]; MVMuint8 *limit = cu->body.string_heap_read_limit; while (cur_bin < end_bin) { MVMuint32 i; for (i = 0; i < MVM_STRING_FAST_TABLE_SPAN; i++) { if (cur_pos + 4 < limit) { MVMuint32 bytes = read_uint32(cur_pos) >> 1; cur_pos += 4 + bytes + (bytes & 3 ? 4 - (bytes & 3) : 0); } else { MVM_exception_throw_adhoc(tc, "Attempt to read past end of string heap when locating string"); } } cur_bin++; cu->body.string_heap_fast_table[cur_bin] = (MVMuint32) (cur_pos - cu->body.string_heap_start); } MVM_barrier(); cu->body.string_heap_fast_table_top = end_bin; } MVMString * MVM_cu_obtain_string(MVMThreadContext *tc, MVMCompUnit *cu, MVMuint32 idx) { MVMuint32 cur_idx; MVMuint8 *cur_pos; MVMuint8 *limit = cu->body.string_heap_read_limit; /* Make sure we've enough entries in the fast table to jump close to where * the string will be. */ MVMuint32 fast_bin = idx / MVM_STRING_FAST_TABLE_SPAN; if (fast_bin > cu->body.string_heap_fast_table_top) compute_fast_table_upto(tc, cu, fast_bin); /* Scan from that position to find the string we need. */ cur_idx = fast_bin * MVM_STRING_FAST_TABLE_SPAN; cur_pos = cu->body.string_heap_start + cu->body.string_heap_fast_table[fast_bin]; while (cur_idx != idx) { if (cur_pos + 4 < limit) { MVMuint32 bytes = read_uint32(cur_pos) >> 1; cur_pos += 4 + bytes + (bytes & 3 ? 4 - (bytes & 3) : 0); } else { MVM_exception_throw_adhoc(tc, "Attempt to read past end of string heap when locating string"); } cur_idx++; } /* Read the string. */ if (cur_pos + 4 < limit) { MVMuint32 ss = read_uint32(cur_pos); MVMuint32 bytes = ss >> 1; MVMuint32 decode_utf8 = ss & 1; cur_pos += 4; if (cur_pos + bytes < limit) { MVMString *s; MVM_gc_allocate_gen2_default_set(tc); s = decode_utf8 ? MVM_string_utf8_decode(tc, tc->instance->VMString, (char *)cur_pos, bytes) : MVM_string_latin1_decode(tc, tc->instance->VMString, (char *)cur_pos, bytes); MVM_ASSIGN_REF(tc, &(cu->common.header), cu->body.strings[idx], s); MVM_gc_allocate_gen2_default_clear(tc); return s; } else { MVM_exception_throw_adhoc(tc, "Attempt to read past end of string heap when reading string"); } } else { MVM_exception_throw_adhoc(tc, "Attempt to read past end of string heap when reading string length"); } } MoarVM-2018.03/src/core/compunit.h0000644000175000017510000000161013237701240016726 0ustar samanthasamanthaMVMCompUnit * MVM_cu_from_bytes(MVMThreadContext *tc, MVMuint8 *bytes, MVMuint32 size); MVMCompUnit * MVM_cu_map_from_file(MVMThreadContext *tc, const char *filename); MVMCompUnit * MVM_cu_map_from_file_handle(MVMThreadContext *tc, uv_file fd, MVMuint64 pos); MVMuint16 MVM_cu_callsite_add(MVMThreadContext *tc, MVMCompUnit *cu, MVMCallsite *cs); MVMuint32 MVM_cu_string_add(MVMThreadContext *tc, MVMCompUnit *cu, MVMString *str); MVMString * MVM_cu_obtain_string(MVMThreadContext *tc, MVMCompUnit *cu, MVMuint32 idx); MVM_STATIC_INLINE MVMString * MVM_cu_string(MVMThreadContext *tc, MVMCompUnit *cu, MVMuint32 idx) { MVMString *s = cu->body.strings[idx]; return s ? s : MVM_cu_obtain_string(tc, cu, idx); } MVM_STATIC_INLINE void MVM_cu_ensure_string_decoded(MVMThreadContext *tc, MVMCompUnit *cu, MVMuint32 idx) { if (!cu->body.strings[idx]) MVM_cu_obtain_string(tc, cu, idx); } MoarVM-2018.03/src/core/continuation.c0000644000175000017510000002035013242626641017606 0ustar samanthasamantha#include "moar.h" static void clear_tag(MVMThreadContext *tc, void *sr_data) { MVMContinuationTag **update = &tc->cur_frame->extra->continuation_tags; while (*update) { if (*update == sr_data) { *update = (*update)->next; MVM_free(sr_data); return; } update = &((*update)->next); } MVM_exception_throw_adhoc(tc, "Internal error: failed to clear continuation tag"); } void MVM_continuation_reset(MVMThreadContext *tc, MVMObject *tag, MVMObject *code, MVMRegister *res_reg) { /* Save the tag. */ MVMFrameExtra *e = MVM_frame_extra(tc, tc->cur_frame); MVMContinuationTag *tag_record = MVM_malloc(sizeof(MVMContinuationTag)); tag_record->tag = tag; tag_record->active_handlers = tc->active_handlers; tag_record->next = e->continuation_tags; e->continuation_tags = tag_record; /* Were we passed code or a continuation? */ if (REPR(code)->ID == MVM_REPR_ID_MVMContinuation) { /* Continuation; invoke it. */ MVM_continuation_invoke(tc, (MVMContinuation *)code, NULL, res_reg); } else { /* Run the passed code. */ MVMCallsite *null_args_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_NULL_ARGS); code = MVM_frame_find_invokee(tc, code, NULL); MVM_args_setup_thunk(tc, res_reg, MVM_RETURN_OBJ, null_args_callsite); MVM_frame_special_return(tc, tc->cur_frame, clear_tag, NULL, tag_record, NULL); STABLE(code)->invoke(tc, code, null_args_callsite, tc->cur_frame->args); } MVM_CHECK_CALLER_CHAIN(tc, tc->cur_frame); } void MVM_continuation_control(MVMThreadContext *tc, MVMint64 protect, MVMObject *tag, MVMObject *code, MVMRegister *res_reg) { MVMObject *cont; MVMCallsite *inv_arg_callsite; /* Hunt the tag on the stack. Also toss any dynamic variable cache * entries, as they may be invalid once the continuation is invoked (the * Perl 6 $*THREAD is a good example of a problematic one). */ MVMFrame *root_frame = NULL; MVMContinuationTag *tag_record = NULL; MVMFrame *jump_frame; MVMROOT2(tc, tag, code, { jump_frame = MVM_frame_force_to_heap(tc, tc->cur_frame); }); while (jump_frame) { MVMFrameExtra *e = jump_frame->extra; if (e) { e->dynlex_cache_name = NULL; tag_record = e->continuation_tags; while (tag_record) { if (MVM_is_null(tc, tag) || tag_record->tag == tag) break; tag_record = tag_record->next; } if (tag_record) break; } root_frame = jump_frame; jump_frame = jump_frame->caller; } if (!tag_record) MVM_exception_throw_adhoc(tc, "No matching continuation reset found"); if (!root_frame) MVM_exception_throw_adhoc(tc, "No continuation root frame found"); /* Create continuation. */ MVMROOT3(tc, code, jump_frame, root_frame, { cont = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTContinuation); MVM_ASSIGN_REF(tc, &(cont->header), ((MVMContinuation *)cont)->body.top, tc->cur_frame); MVM_ASSIGN_REF(tc, &(cont->header), ((MVMContinuation *)cont)->body.root, root_frame); ((MVMContinuation *)cont)->body.addr = *tc->interp_cur_op; ((MVMContinuation *)cont)->body.res_reg = res_reg; if (tc->instance->profiling) ((MVMContinuation *)cont)->body.prof_cont = MVM_profile_log_continuation_control(tc, root_frame); }); /* Save and clear any active exception handler(s) added since reset. */ if (tc->active_handlers != tag_record->active_handlers) { MVMActiveHandler *ah = tc->active_handlers; while (ah) { if (ah->next_handler == tag_record->active_handlers) { /* Found the handler at the point of reset. Slice off the more * recent ones. */ ((MVMContinuation *)cont)->body.active_handlers = tc->active_handlers; tc->active_handlers = ah->next_handler; ah->next_handler = NULL; break; } ah = ah->next_handler; } } /* Move back to the frame with the reset in it. */ tc->cur_frame = jump_frame; tc->current_frame_nr = jump_frame->sequence_nr; *(tc->interp_cur_op) = tc->cur_frame->return_address; *(tc->interp_bytecode_start) = MVM_frame_effective_bytecode(tc->cur_frame); *(tc->interp_reg_base) = tc->cur_frame->work; *(tc->interp_cu) = tc->cur_frame->static_info->body.cu; /* Clear special return handler, given we didn't just fall out of the * reset. */ MVM_frame_clear_special_return(tc, tc->cur_frame); /* If we're not protecting the follow-up call, remove the tag record. */ if (!protect) clear_tag(tc, tag_record); /* Invoke specified code, passing the continuation. We return to * interpreter to run this, which then returns control to the * original reset or invoke. */ code = MVM_frame_find_invokee(tc, code, NULL); inv_arg_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_INV_ARG); MVM_args_setup_thunk(tc, tc->cur_frame->return_value, tc->cur_frame->return_type, inv_arg_callsite); tc->cur_frame->args[0].o = cont; STABLE(code)->invoke(tc, code, inv_arg_callsite, tc->cur_frame->args); MVM_CHECK_CALLER_CHAIN(tc, tc->cur_frame); } void MVM_continuation_invoke(MVMThreadContext *tc, MVMContinuation *cont, MVMObject *code, MVMRegister *res_reg) { /* Ensure we are the only invoker of the continuation. */ if (!MVM_trycas(&(cont->body.invoked), 0, 1)) MVM_exception_throw_adhoc(tc, "This continuation has already been invoked"); /* Switch caller of the root to current invoker. */ MVMROOT2(tc, cont, code, { MVM_frame_force_to_heap(tc, tc->cur_frame); }); MVM_ASSIGN_REF(tc, &(cont->body.root->header), cont->body.root->caller, tc->cur_frame); /* Set up current frame to receive result. */ tc->cur_frame->return_value = res_reg; tc->cur_frame->return_type = MVM_RETURN_OBJ; tc->cur_frame->return_address = *(tc->interp_cur_op); /* Switch to the target frame. */ tc->cur_frame = cont->body.top; tc->current_frame_nr = cont->body.top->sequence_nr; *(tc->interp_cur_op) = cont->body.addr; *(tc->interp_bytecode_start) = MVM_frame_effective_bytecode(tc->cur_frame); *(tc->interp_reg_base) = tc->cur_frame->work; *(tc->interp_cu) = tc->cur_frame->static_info->body.cu; /* Put saved active handlers list in place. */ /* TODO: if we really need to support double-shot, this needs a re-visit. * As it is, Rakudo's gather/take only needs single-invoke continuations, * so we'll punt on the issue for now. */ if (cont->body.active_handlers) { MVMActiveHandler *ah = cont->body.active_handlers; while (ah->next_handler) ah = ah->next_handler; ah->next_handler = tc->active_handlers; tc->active_handlers = cont->body.active_handlers; cont->body.active_handlers = NULL; } /* If we're profiling, get it back in sync. */ if (cont->body.prof_cont && tc->instance->profiling) MVM_profile_log_continuation_invoke(tc, cont->body.prof_cont); /* Provided we have it, invoke the specified code, putting its result in * the specified result register. Otherwise, put a NULL there. */ if (MVM_is_null(tc, code)) { cont->body.res_reg->o = tc->instance->VMNull; } else { MVMCallsite *null_args_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_NULL_ARGS); code = MVM_frame_find_invokee(tc, code, NULL); MVM_args_setup_thunk(tc, cont->body.res_reg, MVM_RETURN_OBJ, null_args_callsite); STABLE(code)->invoke(tc, code, null_args_callsite, tc->cur_frame->args); } MVM_CHECK_CALLER_CHAIN(tc, tc->cur_frame); } void MVM_continuation_free_tags(MVMThreadContext *tc, MVMFrame *f) { MVMContinuationTag *tag = f->extra->continuation_tags; while (tag) { MVMContinuationTag *next = tag->next; MVM_free(tag); tag = next; } f->extra->continuation_tags = NULL; } MoarVM-2018.03/src/core/continuation.h0000644000175000017510000000102313237701240017600 0ustar samanthasamanthavoid MVM_continuation_reset(MVMThreadContext *tc, MVMObject *tag, MVMObject *code, MVMRegister *res_reg); void MVM_continuation_control(MVMThreadContext *tc, MVMint64 protect, MVMObject *tag, MVMObject *code, MVMRegister *res_reg); void MVM_continuation_invoke(MVMThreadContext *tc, MVMContinuation *cont, MVMObject *code, MVMRegister *res_reg); void MVM_continuation_free_tags(MVMThreadContext *tc, MVMFrame *f); MoarVM-2018.03/src/core/dll.c0000644000175000017510000000727613242626641015663 0ustar samanthasamantha#include "moar.h" int MVM_dll_load(MVMThreadContext *tc, MVMString *name, MVMString *path) { MVMDLLRegistry *entry; char *cpath; DLLib *lib; uv_mutex_lock(&tc->instance->mutex_dll_registry); MVM_HASH_GET(tc, tc->instance->dll_registry, name, entry); /* already loaded */ if (entry && entry->lib) { uv_mutex_unlock(&tc->instance->mutex_dll_registry); return 0; } MVMROOT2(tc, name, path, { path = MVM_file_in_libpath(tc, path); }); cpath = MVM_string_utf8_c8_encode_C_string(tc, path); lib = MVM_nativecall_load_lib(cpath); if (!lib) { char *waste[] = { cpath, NULL }; uv_mutex_unlock(&tc->instance->mutex_dll_registry); MVM_exception_throw_adhoc_free(tc, waste, "failed to load library '%s'", cpath); } MVM_free(cpath); if (!entry) { entry = MVM_malloc(sizeof *entry); entry->name = name; entry->refcount = 0; MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->name, "DLL name"); MVM_HASH_BIND(tc, tc->instance->dll_registry, name, entry); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->hash_handle.key, "DLL name hash key"); } entry->lib = lib; uv_mutex_unlock(&tc->instance->mutex_dll_registry); return 1; } int MVM_dll_free(MVMThreadContext *tc, MVMString *name) { MVMDLLRegistry *entry; uv_mutex_lock(&tc->instance->mutex_dll_registry); MVM_HASH_GET(tc, tc->instance->dll_registry, name, entry); if (!entry) { uv_mutex_unlock(&tc->instance->mutex_dll_registry); MVM_exception_throw_adhoc(tc, "cannot free non-existent library"); } /* already freed */ if (!entry->lib) { uv_mutex_unlock(&tc->instance->mutex_dll_registry); return 0; } if (entry->refcount > 0) { uv_mutex_unlock(&tc->instance->mutex_dll_registry); MVM_exception_throw_adhoc(tc, "cannot free in-use library"); } MVM_nativecall_free_lib(entry->lib); entry->lib = NULL; uv_mutex_unlock(&tc->instance->mutex_dll_registry); return 1; } MVMObject * MVM_dll_find_symbol(MVMThreadContext *tc, MVMString *lib, MVMString *sym) { MVMDLLRegistry *entry; MVMDLLSym *obj; char *csym; void *address; uv_mutex_lock(&tc->instance->mutex_dll_registry); MVM_HASH_GET(tc, tc->instance->dll_registry, lib, entry); if (!entry) { uv_mutex_unlock(&tc->instance->mutex_dll_registry); MVM_exception_throw_adhoc(tc, "cannot find symbol in non-existent library"); } if (!entry->lib) { uv_mutex_unlock(&tc->instance->mutex_dll_registry); MVM_exception_throw_adhoc(tc, "cannot find symbol in unloaded library"); } csym = MVM_string_utf8_c8_encode_C_string(tc, sym); address = MVM_nativecall_find_sym(entry->lib, csym); MVM_free(csym); if (!address) { uv_mutex_unlock(&tc->instance->mutex_dll_registry); return NULL; } obj = (MVMDLLSym *)MVM_repr_alloc_init(tc, tc->instance->raw_types.RawDLLSym); obj->body.address = address; obj->body.dll = entry; entry->refcount++; uv_mutex_unlock(&tc->instance->mutex_dll_registry); return (MVMObject *)obj; } void MVM_dll_drop_symbol(MVMThreadContext *tc, MVMObject *obj) { MVMDLLSym *sym; MVMDLLRegistry *dll; if (REPR(obj)->ID != MVM_REPR_ID_MVMDLLSym) MVM_exception_throw_adhoc(tc, "unexpected object with REPR other than MVMDLLSym"); sym = (MVMDLLSym *)obj; dll = sym->body.dll; if (!dll) return; MVM_decr(&dll->refcount); sym->body.address = NULL; sym->body.dll = NULL; } MoarVM-2018.03/src/core/dll.h0000644000175000017510000000061613237701240015650 0ustar samanthasamanthastruct MVMDLLRegistry { DLLib *lib; MVMString *name; AO_t refcount; UT_hash_handle hash_handle; }; int MVM_dll_load(MVMThreadContext *tc, MVMString *name, MVMString *path); int MVM_dll_free(MVMThreadContext *tc, MVMString *name); MVMObject * MVM_dll_find_symbol(MVMThreadContext *tc, MVMString *lib, MVMString *sym); void MVM_dll_drop_symbol(MVMThreadContext *tc, MVMObject *obj); MoarVM-2018.03/src/core/exceptions.c0000644000175000017510000012057213252330426017256 0ustar samanthasamantha#include "moar.h" #ifdef _MSC_VER #define snprintf _snprintf #define vsnprintf _vsnprintf #endif static int crash_on_error = 0; /* Function for getting effective (specialized or not) frame handlers. */ MVM_STATIC_INLINE MVMFrameHandler * MVM_frame_effective_handlers(MVMFrame *f) { MVMSpeshCandidate *spesh_cand = f->spesh_cand; return spesh_cand ? spesh_cand->handlers : f->static_info->body.handlers; } /* Maps ID of exception category to its name. */ static const char * cat_name(MVMThreadContext *tc, MVMint32 cat) { switch (cat) { case MVM_EX_CAT_CATCH: return "catch"; case MVM_EX_CAT_CONTROL: return "control"; case MVM_EX_CAT_NEXT: return "next"; case MVM_EX_CAT_REDO: return "redo"; case MVM_EX_CAT_LAST: return "last"; case MVM_EX_CAT_RETURN: return "return"; case MVM_EX_CAT_TAKE: return "take"; case MVM_EX_CAT_WARN: return "warn"; case MVM_EX_CAT_SUCCEED: return "succeed"; case MVM_EX_CAT_PROCEED: return "proceed"; case MVM_EX_CAT_NEXT | MVM_EX_CAT_LABELED: return "next_label"; case MVM_EX_CAT_REDO | MVM_EX_CAT_LABELED: return "redo_label"; case MVM_EX_CAT_LAST | MVM_EX_CAT_LABELED: return "last_label"; default: return "unknown"; } } /* Checks if an exception handler is already on the active handler stack, * so we don't re-trigger the same exception handler. Note: We have static * handlers that get reused, so also check for the same handler being in * the same frame, otherwise we consider the handler as being another one. */ static MVMuint8 in_handler_stack(MVMThreadContext *tc, MVMFrameHandler *fh, MVMFrame *f) { if (tc->active_handlers) { MVMActiveHandler *ah = tc->active_handlers; while (ah) { if (ah->handler == fh && ah->frame == f) return 1; ah = ah->next_handler; } } return 0; } /* Checks if a frame is still active. Naively, we could scan the call stack * for it, but since we always clean up ->work when a frame is removed from * the call stack we can do it in O(1) that way. */ static MVMuint8 in_caller_chain(MVMThreadContext *tc, MVMFrame *f_maybe) { return f_maybe->work ? 1 : 0; } /* Information about a located handler. */ typedef struct { MVMFrame *frame; MVMFrameHandler *handler; MVMJitHandler *jit_handler; MVMint32 handler_out_of_dynamic_scope; } LocatedHandler; static MVMint32 handler_can_handle(MVMFrame *f, MVMFrameHandler *fh, MVMint32 cat, MVMObject *payload) { MVMuint32 category_mask = fh->category_mask; MVMuint64 block_has_label = category_mask & MVM_EX_CAT_LABELED; MVMuint64 block_label = block_has_label ? (MVMuint64)(f->work[fh->label_reg].o) : 0; MVMuint64 thrown_label = payload ? (MVMuint64)payload : 0; MVMuint64 identical_label_found = thrown_label == block_label; return ((cat & category_mask) == cat && (!(cat & MVM_EX_CAT_LABELED) || identical_label_found)) || ((category_mask & MVM_EX_CAT_CONTROL) && cat != MVM_EX_CAT_CATCH); } /* Looks through the handlers of a particular frame, including inlines in * dynamic scope, and sees if one will match what we're looking for. Returns * 1 to it if so, and 0 if not; in the case 1 is returned the *lh will be * populated with details of the located handler. Since upon inlining, the * dynamic scope becomes lexical so far as the optimized bytecode is * concerned, then this just needs a scan of the table without any further * checks being needed. */ static MVMint32 search_frame_handlers_dyn(MVMThreadContext *tc, MVMFrame *f, MVMuint32 cat, MVMObject *payload, LocatedHandler *lh) { MVMuint32 i; if (f->spesh_cand && f->spesh_cand->jitcode && f->jit_entry_label) { MVMJitHandler *jhs = f->spesh_cand->jitcode->handlers; MVMFrameHandler *fhs = MVM_frame_effective_handlers(f); MVMint32 num_handlers = f->spesh_cand->jitcode->num_handlers; void **labels = f->spesh_cand->jitcode->labels; void *cur_label = f->jit_entry_label; for (i = 0; i < num_handlers; i++) { if (!handler_can_handle(f, &fhs[i], cat, payload)) continue; if (cur_label >= labels[jhs[i].start_label] && cur_label <= labels[jhs[i].end_label] && !in_handler_stack(tc, &fhs[i], f)) { lh->handler = &fhs[i]; lh->jit_handler = &jhs[i]; return 1; } } } else { MVMint32 num_handlers = f->spesh_cand ? f->spesh_cand->num_handlers : f->static_info->body.num_handlers; MVMint32 pc; if (f == tc->cur_frame) pc = (MVMuint32)(*tc->interp_cur_op - *tc->interp_bytecode_start); else pc = (MVMuint32)(f->return_address - MVM_frame_effective_bytecode(f)); for (i = 0; i < num_handlers; i++) { MVMFrameHandler *fh = &(MVM_frame_effective_handlers(f)[i]); if (!handler_can_handle(f, fh, cat, payload)) continue; if (pc >= fh->start_offset && pc <= fh->end_offset && !in_handler_stack(tc, fh, f)) { lh->handler = fh; return 1; } } } return 0; } /* Looks for lexically applicable handlers in the current frame, accounting * for any inlines. The skip_first_inlinee flag indicates that we should skip * looking until we have encountered an inline boundary indicator saying that * we have crossed from an inlinee to its inliner's handlers; this is used to * handle the THROW_LEX_CALLER mode. If we never encounter an inline boundary * when skip_first_inlinee is true then we'll always return 0. * * If skip_first_inlinee is false or we already saw an inline boundary, then * we start looking for a matching handler. If one is found before seeing * another inline boundary, then it is applicable; the data pointed to by lh * will be updated with the frame handler details and 1 will be returned. * * Upon reaching an (or, in the case of skip_first_inlinee, a second) inline * boundary indicator, there are two cases that apply. We take the inline * that we are leaving, and look up the code ref using the code_ref_reg in * the inline. We know that we can never inline a frame that was closed over * (due to capturelex or takeclosure being marked :noinline). Thus, either: * 1. The outer of the inlinee is actually the current frame f. In this case, * we skip all inlined handlers and just consider those of f itself. * 2. The next frame we should search in is the ->outer of the inlinee, and * thus all the rest of the handlers in this frame should be ignored. In * this case, the MVMFrame **next_outer will be populated with a pointer * to that frame. * * The skip_all_inlinees flag is set once we are below the frame on the stack * to where the search started. Again, this is because a frame that did a * lexical capture may not be inlined, so we only need to consider the topmost * frame's handlers, not anything it might have inlined into it. */ static MVMint32 search_frame_handlers_lex(MVMThreadContext *tc, MVMFrame *f, MVMuint32 cat, MVMObject *payload, LocatedHandler *lh, MVMuint32 *skip_first_inlinee, MVMuint32 skip_all_inlinees, MVMFrame **next_outer) { MVMuint32 i; MVMuint32 skipping = *skip_first_inlinee; MVMFrameHandler *fhs = MVM_frame_effective_handlers(f); if (f->spesh_cand && f->spesh_cand->jitcode && f->jit_entry_label) { MVMJitHandler *jhs = f->spesh_cand->jitcode->handlers; MVMint32 num_handlers = f->spesh_cand->jitcode->num_handlers; void **labels = f->spesh_cand->jitcode->labels; void *cur_label = f->jit_entry_label; for (i = 0; i < num_handlers; i++) { MVMFrameHandler *fh = &(fhs[i]); if (skip_all_inlinees && fh->inlinee >= 0) continue; if (fh->category_mask == MVM_EX_INLINE_BOUNDARY) { if (cur_label >= labels[jhs[i].start_label] && cur_label <= labels[jhs[i].end_label]) { if (skipping) { skipping = 0; *skip_first_inlinee = 0; } else { MVMuint16 cr_reg = f->spesh_cand->inlines[fh->inlinee].code_ref_reg; MVMFrame *inline_outer = ((MVMCode *)f->work[cr_reg].o)->body.outer; if (inline_outer == f) { skip_all_inlinees = 1; } else { *next_outer = inline_outer; return 0; } } } continue; } if (skipping || !handler_can_handle(f, fh, cat, payload)) continue; if (cur_label >= labels[jhs[i].start_label] && cur_label <= labels[jhs[i].end_label] && !in_handler_stack(tc, fh, f)) { if (skipping && f->static_info->body.is_thunk) return 0; lh->handler = fh; lh->jit_handler = &jhs[i]; return 1; } } } else { MVMint32 num_handlers = f->spesh_cand ? f->spesh_cand->num_handlers : f->static_info->body.num_handlers; MVMint32 pc; if (f == tc->cur_frame) pc = (MVMuint32)(*tc->interp_cur_op - *tc->interp_bytecode_start); else pc = (MVMuint32)(f->return_address - MVM_frame_effective_bytecode(f)); for (i = 0; i < num_handlers; i++) { MVMFrameHandler *fh = &(fhs[i]); if (skip_all_inlinees && fh->inlinee >= 0) continue; if (fh->category_mask == MVM_EX_INLINE_BOUNDARY) { if (pc >= fh->start_offset && pc <= fh->end_offset) { if (skipping) { skipping = 0; *skip_first_inlinee = 0; } else { MVMuint16 cr_reg = f->spesh_cand->inlines[fh->inlinee].code_ref_reg; MVMFrame *inline_outer = ((MVMCode *)f->work[cr_reg].o)->body.outer; if (inline_outer == f) { skip_all_inlinees = 1; } else { *next_outer = inline_outer; return 0; } } } continue; } if (skipping || !handler_can_handle(f, fh, cat, payload)) continue; if (pc >= fh->start_offset && pc <= fh->end_offset && !in_handler_stack(tc, fh, f)) { if (skipping && f->static_info->body.is_thunk) return 0; lh->handler = fh; return 1; } } } return 0; } /* Searches for a handler of the specified category, relative to the given * starting frame, searching according to the chosen mode. */ static LocatedHandler search_for_handler_from(MVMThreadContext *tc, MVMFrame *f, MVMuint8 mode, MVMuint32 cat, MVMObject *payload) { MVMuint32 skip_first_inlinee = 0; LocatedHandler lh; lh.frame = NULL; lh.handler = NULL; lh.jit_handler = NULL; lh.handler_out_of_dynamic_scope = 0; switch (mode) { case MVM_EX_THROW_LEX_CALLER: skip_first_inlinee = 1; case MVM_EX_THROW_LEX: { MVMint32 skip_all_inlinees = 0; while (f != NULL) { MVMFrame *outer_from_inlinee = NULL; if (search_frame_handlers_lex(tc, f, cat, payload, &lh, &skip_first_inlinee, skip_all_inlinees, &outer_from_inlinee)) { if (in_caller_chain(tc, f)) lh.frame = f; else lh.handler_out_of_dynamic_scope = 1; return lh; } if (skip_first_inlinee) { /* If this is still set, it means that the topmost frame * had no inlines, so we didn't already reach a chain of * outers to traverse. In this case, skip over any thunks * and continue the search. */ skip_first_inlinee = 0; f = f->caller; while (f && f->static_info->body.is_thunk) f = f->caller; } else { f = outer_from_inlinee ? outer_from_inlinee : f->outer; skip_all_inlinees = 1; } } return lh; } case MVM_EX_THROW_DYN: while (f != NULL) { if (search_frame_handlers_dyn(tc, f, cat, payload, &lh)) { lh.frame = f; return lh; } f = f->caller; } return lh; case MVM_EX_THROW_LEXOTIC: while (f != NULL) { lh = search_for_handler_from(tc, f, MVM_EX_THROW_LEX, cat, payload); if (lh.frame != NULL) return lh; f = f->caller; } return lh; default: MVM_panic(1, "Unhandled exception throw mode %d", (int)mode); } } /* Runs an exception handler (which really means updating interpreter state * so that when we return to the runloop, we're in the handler). If there is * an exception object already, it will be used; NULL can be passed if there * is not one, meaning it will be created if needed (based on the category * parameter; if ex_obj is passed, the category is not used). */ static void unwind_after_handler(MVMThreadContext *tc, void *sr_data); static void cleanup_active_handler(MVMThreadContext *tc, void *sr_data); static void run_handler(MVMThreadContext *tc, LocatedHandler lh, MVMObject *ex_obj, MVMuint32 category, MVMObject *payload) { switch (lh.handler->action) { case MVM_EX_ACTION_GOTO_WITH_PAYLOAD: if (payload) tc->last_payload = payload; else if (ex_obj && ((MVMException *)ex_obj)->body.payload) tc->last_payload = ((MVMException *)ex_obj)->body.payload; else tc->last_payload = tc->instance->VMNull; /* Deliberate fallthrough to unwind below. */ case MVM_EX_ACTION_GOTO: if (lh.jit_handler) { void **labels = lh.frame->spesh_cand->jitcode->labels; MVMuint8 *pc = lh.frame->spesh_cand->jitcode->bytecode; lh.frame->jit_entry_label = labels[lh.jit_handler->goto_label]; MVM_frame_unwind_to(tc, lh.frame, pc, 0, NULL); } else { MVM_frame_unwind_to(tc, lh.frame, NULL, lh.handler->goto_offset, NULL); } break; case MVM_EX_ACTION_INVOKE: { /* Create active handler record. */ MVMActiveHandler *ah = MVM_malloc(sizeof(MVMActiveHandler)); MVMFrame *cur_frame = tc->cur_frame; MVMObject *handler_code; /* Ensure we have an exception object. */ if (ex_obj == NULL) { MVMROOT3(tc, cur_frame, lh.frame, payload, { ex_obj = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTException); }); ((MVMException *)ex_obj)->body.category = category; MVM_ASSIGN_REF(tc, &(ex_obj->header), ((MVMException *)ex_obj)->body.payload, payload); } /* Find frame to invoke. */ handler_code = MVM_frame_find_invokee(tc, lh.frame->work[lh.handler->block_reg].o, NULL); /* Install active handler record. */ ah->frame = lh.frame; ah->handler = lh.handler; ah->jit_handler = lh.jit_handler; ah->ex_obj = ex_obj; ah->next_handler = tc->active_handlers; tc->active_handlers = ah; /* Set up special return to unwinding after running the * handler. */ cur_frame->return_value = (MVMRegister *)&tc->last_handler_result; cur_frame->return_type = MVM_RETURN_OBJ; MVM_frame_special_return(tc, cur_frame, unwind_after_handler, cleanup_active_handler, ah, NULL); /* Invoke the handler frame and return to runloop. */ STABLE(handler_code)->invoke(tc, handler_code, MVM_callsite_get_common(tc, MVM_CALLSITE_ID_NULL_ARGS), cur_frame->args); break; } default: MVM_panic(1, "Unimplemented handler action"); } } /* Unwinds after a handler. */ static void unwind_after_handler(MVMThreadContext *tc, void *sr_data) { MVMFrame *frame; MVMException *exception; MVMuint32 goto_offset; MVMuint8 *abs_address; /* Get active handler; sanity check (though it's possible other cases * should be supported). */ MVMActiveHandler *ah = (MVMActiveHandler *)sr_data; if (tc->active_handlers != ah) MVM_panic(1, "Trying to unwind from wrong handler"); /* Grab info we'll need to unwind. */ frame = ah->frame; exception = (MVMException *)ah->ex_obj; if (ah->jit_handler) { void **labels = frame->spesh_cand->jitcode->labels; frame->jit_entry_label = labels[ah->jit_handler->goto_label]; abs_address = frame->spesh_cand->jitcode->bytecode; goto_offset = 0; } else { goto_offset = ah->handler->goto_offset; abs_address = NULL; } /* Clean up. */ tc->active_handlers = ah->next_handler; MVM_free(ah); /* Do the unwinding as needed. */ if (exception && exception->body.return_after_unwind) { MVM_frame_unwind_to(tc, frame->caller, NULL, 0, tc->last_handler_result); } else { MVM_frame_unwind_to(tc, frame, abs_address, goto_offset, NULL); } } /* Cleans up an active handler record if we unwind over it. */ static void cleanup_active_handler(MVMThreadContext *tc, void *sr_data) { /* Get active handler; sanity check (though it's possible other cases * should be supported). */ MVMActiveHandler *ah = (MVMActiveHandler *)sr_data; if (tc->active_handlers != ah) MVM_panic(1, "Trying to unwind over wrong handler"); /* Clean up. */ tc->active_handlers = ah->next_handler; MVM_free(ah); } char * MVM_exception_backtrace_line(MVMThreadContext *tc, MVMFrame *cur_frame, MVMuint16 not_top, MVMuint8 *throw_address) { MVMString *filename = cur_frame->static_info->body.cu->body.filename; MVMString *name = cur_frame->static_info->body.name; /* XXX TODO: make the caller pass in a char ** and a length pointer so * we can update it if necessary, and the caller can cache it. */ char *o = MVM_malloc(1024); MVMuint8 *cur_op = not_top ? cur_frame->return_address : throw_address; MVMuint32 offset = cur_op - MVM_frame_effective_bytecode(cur_frame); MVMBytecodeAnnotation *annot = MVM_bytecode_resolve_annotation(tc, &cur_frame->static_info->body, offset > 0 ? offset - 1 : 0); MVMuint32 line_number = annot ? annot->line_number : 1; MVMuint16 string_heap_index = annot ? annot->filename_string_heap_index : 0; char *tmp1 = annot && string_heap_index < cur_frame->static_info->body.cu->body.num_strings ? MVM_string_utf8_encode_C_string(tc, MVM_cu_string(tc, cur_frame->static_info->body.cu, string_heap_index)) : NULL; char *filename_c = filename ? MVM_string_utf8_encode_C_string(tc, filename) : ""; char *name_c = name ? MVM_string_utf8_encode_C_string(tc, name) : ""; snprintf(o, 1024, " %s %s:%u (%s:%s)", not_top ? "from" : " at", tmp1 ? tmp1 : "", line_number, filename_c, name_c ); if (filename) MVM_free(filename_c); if (name) MVM_free(name_c); if (tmp1) MVM_free(tmp1); if (annot) MVM_free(annot); return o; } /* Returns a list of hashes containing file, line, sub and annotations. */ MVMObject * MVM_exception_backtrace(MVMThreadContext *tc, MVMObject *ex_obj) { MVMFrame *cur_frame; MVMObject *arr = NULL, *annotations = NULL, *row = NULL, *value = NULL; MVMuint32 count = 0; MVMString *k_file = NULL, *k_line = NULL, *k_sub = NULL, *k_anno = NULL; MVMuint8 *throw_address; if (IS_CONCRETE(ex_obj) && REPR(ex_obj)->ID == MVM_REPR_ID_MVMException) { cur_frame = ((MVMException *)ex_obj)->body.origin; throw_address = ((MVMException *)ex_obj)->body.throw_address; } else { MVM_exception_throw_adhoc(tc, "Op 'backtrace' needs an exception object"); } MVM_gc_root_temp_push(tc, (MVMCollectable **)&arr); MVM_gc_root_temp_push(tc, (MVMCollectable **)&annotations); MVM_gc_root_temp_push(tc, (MVMCollectable **)&row); MVM_gc_root_temp_push(tc, (MVMCollectable **)&value); MVM_gc_root_temp_push(tc, (MVMCollectable **)&k_file); MVM_gc_root_temp_push(tc, (MVMCollectable **)&k_line); MVM_gc_root_temp_push(tc, (MVMCollectable **)&k_sub); MVM_gc_root_temp_push(tc, (MVMCollectable **)&k_anno); MVM_gc_root_temp_push(tc, (MVMCollectable **)&cur_frame); k_file = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "file"); k_line = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "line"); k_sub = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "sub"); k_anno = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "annotations"); arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); while (cur_frame != NULL) { MVMuint8 *cur_op = count ? cur_frame->return_address : throw_address; MVMuint32 offset = cur_op - MVM_frame_effective_bytecode(cur_frame); MVMBytecodeAnnotation *annot = MVM_bytecode_resolve_annotation(tc, &cur_frame->static_info->body, offset > 0 ? offset - 1 : 0); MVMint32 fshi = annot ? (MVMint32)annot->filename_string_heap_index : -1; char *line_number = MVM_malloc(16); MVMString *filename_str; snprintf(line_number, 16, "%d", annot ? annot->line_number : 1); /* annotations hash will contain "file" and "line" */ annotations = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTHash); /* file */ filename_str = fshi >= 0 && fshi < cur_frame->static_info->body.cu->body.num_strings ? MVM_cu_string(tc, cur_frame->static_info->body.cu, fshi) : cur_frame->static_info->body.cu->body.filename; value = MVM_repr_box_str(tc, MVM_hll_current(tc)->str_box_type, filename_str ? filename_str : tc->instance->str_consts.empty); MVM_repr_bind_key_o(tc, annotations, k_file, value); /* line */ value = (MVMObject *)MVM_string_ascii_decode_nt(tc, tc->instance->VMString, line_number); value = MVM_repr_box_str(tc, MVM_hll_current(tc)->str_box_type, (MVMString *)value); MVM_repr_bind_key_o(tc, annotations, k_line, value); MVM_free(line_number); /* row will contain "sub" and "annotations" */ row = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTHash); MVM_repr_bind_key_o(tc, row, k_sub, cur_frame->code_ref); MVM_repr_bind_key_o(tc, row, k_anno, annotations); MVM_repr_push_o(tc, arr, row); MVM_free(annot); cur_frame = cur_frame->caller; while (cur_frame && cur_frame->static_info->body.is_thunk) cur_frame = cur_frame->caller; count++; } MVM_gc_root_temp_pop_n(tc, 9); return arr; } /* Returns the lines (backtrace) of an exception-object as an array. */ MVMObject * MVM_exception_backtrace_strings(MVMThreadContext *tc, MVMObject *ex_obj) { MVMException *ex; MVMFrame *cur_frame; MVMObject *arr; if (IS_CONCRETE(ex_obj) && REPR(ex_obj)->ID == MVM_REPR_ID_MVMException) ex = (MVMException *)ex_obj; else MVM_exception_throw_adhoc(tc, "Op 'backtracestrings' needs an exception object"); arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); cur_frame = ex->body.origin; MVMROOT2(tc, arr, cur_frame, { MVMuint32 count = 0; while (cur_frame != NULL) { char *line = MVM_exception_backtrace_line(tc, cur_frame, count++, ex->body.throw_address); MVMString *line_str = MVM_string_utf8_decode(tc, tc->instance->VMString, line, strlen(line)); MVMObject *line_obj = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, line_str); MVM_repr_push_o(tc, arr, line_obj); cur_frame = cur_frame->caller; MVM_free(line); } }); return arr; } /* Dumps a backtrace relative to the current frame to stderr. */ void MVM_dump_backtrace(MVMThreadContext *tc) { MVMFrame *cur_frame = tc->cur_frame; MVMuint32 count = 0; MVMROOT(tc, cur_frame, { while (cur_frame != NULL) { char *line = MVM_exception_backtrace_line(tc, cur_frame, count++, *(tc->interp_cur_op)); fprintf(stderr, "%s\n", line); MVM_free(line); cur_frame = cur_frame->caller; } }); } /* Panic over an unhandled exception throw by category. */ static void panic_unhandled_cat(MVMThreadContext *tc, MVMuint32 cat) { /* If it's a control exception, try promoting it to a catch one. */ if (cat != MVM_EX_CAT_CATCH) { MVM_exception_throw_adhoc(tc, "No exception handler located for %s", cat_name(tc, cat)); } else { fprintf(stderr, "No exception handler located for %s\n", cat_name(tc, cat)); MVM_dump_backtrace(tc); if (crash_on_error) abort(); else exit(1); } } /* Panic over an unhandled exception object. */ static void panic_unhandled_ex(MVMThreadContext *tc, MVMException *ex) { char *backtrace; /* If a debug session is running, notify the client. */ MVM_debugserver_notify_unhandled_exception(tc, ex); /* If it's a control exception, try promoting it to a catch one; use * the category name. */ if (ex->body.category != MVM_EX_CAT_CATCH) panic_unhandled_cat(tc, ex->body.category); /* If there's no message, fall back to category also. */ if (!ex->body.message) panic_unhandled_cat(tc, ex->body.category); /* Otherwise, dump message and a backtrace. */ backtrace = MVM_string_utf8_encode_C_string(tc, ex->body.message); fprintf(stderr, "Unhandled exception: %s\n", backtrace); MVM_free(backtrace); MVM_dump_backtrace(tc); if (crash_on_error) abort(); else exit(1); } /* Checks if we're throwing lexically, and - if yes - if the current HLL has * a handler for unlocated lexical handlers. */ static MVMint32 use_lexical_handler_hll_error(MVMThreadContext *tc, MVMuint8 mode) { return (mode == MVM_EX_THROW_LEX || mode == MVM_EX_THROW_LEX_CALLER) && !MVM_is_null(tc, MVM_hll_current(tc)->lexical_handler_not_found_error); } /* Invokes the HLL's handler for unresolved lexical throws. */ static void invoke_lexical_handler_hll_error(MVMThreadContext *tc, MVMint64 cat, LocatedHandler lh) { MVMObject *handler = MVM_hll_current(tc)->lexical_handler_not_found_error; MVMCallsite *callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_INT_INT); handler = MVM_frame_find_invokee(tc, handler, NULL); MVM_args_setup_thunk(tc, NULL, MVM_RETURN_VOID, callsite); tc->cur_frame->args[0].i64 = cat; tc->cur_frame->args[1].i64 = lh.handler_out_of_dynamic_scope; STABLE(handler)->invoke(tc, handler, callsite, tc->cur_frame->args); } /* Throws an exception by category, searching for a handler according to * the specified mode. If the handler resumes, the resumption result will * be put into resume_result. Leaves the interpreter in a state where it * will next run the instruction of the handler. If there is no handler, * it will panic and exit with a backtrace. */ void MVM_exception_throwcat(MVMThreadContext *tc, MVMuint8 mode, MVMuint32 cat, MVMRegister *resume_result) { LocatedHandler lh = search_for_handler_from(tc, tc->cur_frame, mode, cat, NULL); if (lh.frame == NULL) { if (use_lexical_handler_hll_error(tc, mode)) { invoke_lexical_handler_hll_error(tc, cat, lh); return; } panic_unhandled_cat(tc, cat); } run_handler(tc, lh, NULL, cat, NULL); } void MVM_exception_die(MVMThreadContext *tc, MVMString *str, MVMRegister *rr) { MVMException *ex; MVMROOT(tc, str, { ex = (MVMException *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTException); }); ex->body.category = MVM_EX_CAT_CATCH; MVM_ASSIGN_REF(tc, &(ex->common.header), ex->body.message, str); MVM_exception_throwobj(tc, MVM_EX_THROW_DYN, (MVMObject *)ex, rr); } /* Throws the specified exception object, taking the category from it. If * the handler resumes, the resumption result will be put into resume_result. * Leaves the interpreter in a state where it will next run the instruction of * the handler. If there is no handler, it will panic and exit with a backtrace. */ void MVM_exception_throwobj(MVMThreadContext *tc, MVMuint8 mode, MVMObject *ex_obj, MVMRegister *resume_result) { LocatedHandler lh; MVMException *ex; /* The current frame will be assigned as the thrower of the exception, so * force it onto the heap before we begin (promoting it later would mean * outer handler search result would be outdated). */ MVMROOT(tc, ex_obj, { MVM_frame_force_to_heap(tc, tc->cur_frame); }); if (IS_CONCRETE(ex_obj) && REPR(ex_obj)->ID == MVM_REPR_ID_MVMException) ex = (MVMException *)ex_obj; else MVM_exception_throw_adhoc(tc, "Can only throw an exception object"); if (!ex->body.category) ex->body.category = MVM_EX_CAT_CATCH; if (resume_result) { ex->body.resume_addr = *tc->interp_cur_op; /* Ensure that the jit resume label is stored. The throwish * control guard should ensure that the jit entry label point to * a position just after throwing. */ ex->body.jit_resume_label = tc->cur_frame->jit_entry_label; } lh = search_for_handler_from(tc, tc->cur_frame, mode, ex->body.category, ex->body.payload); if (lh.frame == NULL) { if (use_lexical_handler_hll_error(tc, mode)) { invoke_lexical_handler_hll_error(tc, ex->body.category, lh); return; } panic_unhandled_ex(tc, ex); } if (!ex->body.origin) { MVM_ASSIGN_REF(tc, &(ex->common.header), ex->body.origin, tc->cur_frame); ex->body.throw_address = *(tc->interp_cur_op); } run_handler(tc, lh, ex_obj, 0, NULL); } /* Throws an exception of the specified category and with the specified payload. * If a goto or payload handler exists, then no exception object will be created. */ void MVM_exception_throwpayload(MVMThreadContext *tc, MVMuint8 mode, MVMuint32 cat, MVMObject *payload, MVMRegister *resume_result) { LocatedHandler lh = search_for_handler_from(tc, tc->cur_frame, mode, cat, NULL); if (lh.frame == NULL) { if (use_lexical_handler_hll_error(tc, mode)) { invoke_lexical_handler_hll_error(tc, cat, lh); return; } panic_unhandled_cat(tc, cat); } run_handler(tc, lh, NULL, cat, payload); } void MVM_exception_resume(MVMThreadContext *tc, MVMObject *ex_obj) { MVMException *ex; MVMFrame *target; MVMActiveHandler *ah; if (IS_CONCRETE(ex_obj) && REPR(ex_obj)->ID == MVM_REPR_ID_MVMException) ex = (MVMException *)ex_obj; else MVM_exception_throw_adhoc(tc, "Can only resume an exception object"); /* Check that everything is in place to do the resumption. */ if (!ex->body.resume_addr) MVM_exception_throw_adhoc(tc, "This exception is not resumable"); target = ex->body.origin; if (!target) MVM_exception_throw_adhoc(tc, "This exception is not resumable"); if (!target->extra || target->extra->special_return != unwind_after_handler) MVM_exception_throw_adhoc(tc, "This exception is not resumable"); if (!in_caller_chain(tc, target)) MVM_exception_throw_adhoc(tc, "Too late to resume this exception"); /* Check that this is the exception we're currently handling. */ if (!tc->active_handlers) MVM_exception_throw_adhoc(tc, "Can only resume an exception in its handler"); if (tc->active_handlers->ex_obj != ex_obj) MVM_exception_throw_adhoc(tc, "Can only resume the current exception"); /* Clear special return handler; we'll do its work here. */ MVM_frame_clear_special_return(tc, target); /* Clear the current active handler. */ ah = tc->active_handlers; tc->active_handlers = ah->next_handler; MVM_free(ah); /* Unwind to the thrower of the exception; set PC and jit entry label. */ target->jit_entry_label = ex->body.jit_resume_label; MVM_frame_unwind_to(tc, target, ex->body.resume_addr, 0, NULL); } /* Panics and shuts down the VM. Don't do this unless it's something quite * unrecoverable, and a thread context is either not available or stands a * good chance of being too corrupt to print (or is not relevant information). * Use MVM_oops in the case a thread context is available. * TODO: Some hook for embedders. */ MVM_NO_RETURN void MVM_panic(MVMint32 exitCode, const char *messageFormat, ...) { va_list args; fprintf(stderr, "MoarVM panic: "); va_start(args, messageFormat); vfprintf(stderr, messageFormat, args); va_end(args); fwrite("\n", 1, 1, stderr); if (crash_on_error) abort(); else exit(exitCode); } MVM_NO_RETURN void MVM_panic_allocation_failed(size_t len) { MVM_panic(1, "Memory allocation failed; could not allocate %"MVM_PRSz" bytes", len); } /* A kinder MVM_panic() that doesn't assume our memory is corrupted (but does kill the * process to indicate that we've made an error */ MVM_NO_RETURN void MVM_oops(MVMThreadContext *tc, const char *messageFormat, ...) { va_list args; fprintf(stderr, "MoarVM oops: "); va_start(args, messageFormat); vfprintf(stderr, messageFormat, args); va_end(args); fprintf(stderr, "\n"); MVM_dump_backtrace(tc); fprintf(stderr, "\n"); if (tc->instance->jit_log_fh) fflush(tc->instance->jit_log_fh); exit(1); } /* Throws an ad-hoc (untyped) exception. */ MVM_NO_RETURN void MVM_exception_throw_adhoc(MVMThreadContext *tc, const char *messageFormat, ...) { va_list args; va_start(args, messageFormat); MVM_exception_throw_adhoc_free_va(tc, NULL, messageFormat, args); va_end(args); } /* Throws an ad-hoc (untyped) exception. */ MVM_NO_RETURN void MVM_exception_throw_adhoc_va(MVMThreadContext *tc, const char *messageFormat, va_list args) { MVM_exception_throw_adhoc_free_va(tc, NULL, messageFormat, args); } /* Throws an ad-hoc (untyped) exception, taking a NULL-terminated array of * char pointers to deallocate after message construction. */ MVM_NO_RETURN void MVM_exception_throw_adhoc_free(MVMThreadContext *tc, char **waste, const char *messageFormat, ...) { va_list args; va_start(args, messageFormat); MVM_exception_throw_adhoc_free_va(tc, waste, messageFormat, args); va_end(args); } /* Throws an ad-hoc (untyped) exception, taking a NULL-terminated array of * char pointers to deallocate after message construction. */ MVM_NO_RETURN void MVM_exception_throw_adhoc_free_va(MVMThreadContext *tc, char **waste, const char *messageFormat, va_list args) { LocatedHandler lh; MVMException *ex; /* The current frame will be assigned as the thrower of the exception, so * force it onto the heap before we begin. */ if (tc->cur_frame) MVM_frame_force_to_heap(tc, tc->cur_frame); /* Create and set up an exception object. */ ex = (MVMException *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTException); MVMROOT(tc, ex, { char *c_message = MVM_malloc(1024); int bytes = vsnprintf(c_message, 1024, messageFormat, args); int to_encode = bytes > 1024 ? 1024 : bytes; MVMString *message = MVM_string_utf8_decode(tc, tc->instance->VMString, c_message, to_encode); MVM_free(c_message); /* Clean up after ourselves to avoid leaking C strings. */ if (waste) { while(*waste) MVM_free(*waste++); } MVM_ASSIGN_REF(tc, &(ex->common.header), ex->body.message, message); if (tc->cur_frame) { ex->body.origin = tc->cur_frame; ex->body.throw_address = *(tc->interp_cur_op); } else { ex->body.origin = NULL; } ex->body.category = MVM_EX_CAT_CATCH; }); /* Try to locate a handler, so long as we're in the interpreter. */ if (tc->interp_cur_op) lh = search_for_handler_from(tc, tc->cur_frame, MVM_EX_THROW_DYN, ex->body.category, NULL); else lh.frame = NULL; /* Do we have a handler to unwind to? */ if (lh.frame == NULL) { /* No handler. Should we crash on these? */ if (crash_on_error) { /* Yes, abort. */ vfprintf(stderr, messageFormat, args); fwrite("\n", 1, 1, stderr); MVM_dump_backtrace(tc); abort(); } else { /* No, just the usual panic. */ panic_unhandled_ex(tc, ex); } } /* Run the handler, which doesn't actually run it but rather sets up the * interpreter so that when we return to it, we'll be at the handler. */ run_handler(tc, lh, (MVMObject *)ex, MVM_EX_CAT_CATCH, NULL); /* Clear any C stack temporaries that code may have pushed before throwing * the exception, and release any needed mutex. */ MVM_gc_root_temp_pop_all(tc); MVM_tc_release_ex_release_mutex(tc); /* Jump back into the interpreter. */ longjmp(tc->interp_jump, 1); } void MVM_crash_on_error(void) { crash_on_error = 1; } MVMint32 MVM_get_exception_category(MVMThreadContext *tc, MVMObject *ex) { if (IS_CONCRETE(ex) && REPR(ex)->ID == MVM_REPR_ID_MVMException) return ((MVMException *)ex)->body.category; else MVM_exception_throw_adhoc(tc, "getexcategory needs a VMException, got %s (%s)", REPR(ex)->name, MVM_6model_get_debug_name(tc, ex)); } MVMObject * MVM_get_exception_payload(MVMThreadContext *tc, MVMObject *ex) { MVMObject *result; if (IS_CONCRETE(ex) && REPR(ex)->ID == MVM_REPR_ID_MVMException) result = ((MVMException *)ex)->body.payload; else MVM_exception_throw_adhoc(tc, "getexpayload needs a VMException, got %s (%s)", REPR(ex)->name, MVM_6model_get_debug_name(tc, ex)); if (!result) result = tc->instance->VMNull; return result; } void MVM_bind_exception_payload(MVMThreadContext *tc, MVMObject *ex, MVMObject *payload) { if (IS_CONCRETE(ex) && REPR(ex)->ID == MVM_REPR_ID_MVMException) { MVM_ASSIGN_REF(tc, &(ex->header), ((MVMException *)ex)->body.payload, payload); } else { MVM_exception_throw_adhoc(tc, "bindexpayload needs a VMException, got %s (%s)", REPR(ex)->name, MVM_6model_get_debug_name(tc, ex)); } } void MVM_bind_exception_category(MVMThreadContext *tc, MVMObject *ex, MVMint32 category) { if (IS_CONCRETE(ex) && REPR(ex)->ID == MVM_REPR_ID_MVMException) ((MVMException *)ex)->body.category = category; else MVM_exception_throw_adhoc(tc, "bindexcategory needs a VMException, got %s (%s)", REPR(ex)->name, MVM_6model_get_debug_name(tc, ex)); } void MVM_exception_returnafterunwind(MVMThreadContext *tc, MVMObject *ex) { if (IS_CONCRETE(ex) && REPR(ex)->ID == MVM_REPR_ID_MVMException) ((MVMException *)ex)->body.return_after_unwind = 1; else MVM_exception_throw_adhoc(tc, "exreturnafterunwind needs a VMException, got %s (%s)", REPR(ex)->name, MVM_6model_get_debug_name(tc, ex)); } MoarVM-2018.03/src/core/exceptions.h0000644000175000017510000001215713242626641017270 0ustar samanthasamantha/* Exception handler actions. */ #define MVM_EX_ACTION_GOTO 0 #define MVM_EX_ACTION_GOTO_WITH_PAYLOAD 1 #define MVM_EX_ACTION_INVOKE 2 /* Exception categories. */ #define MVM_EX_CAT_CATCH 1 #define MVM_EX_CAT_CONTROL 2 #define MVM_EX_CAT_NEXT 4 #define MVM_EX_CAT_REDO 8 #define MVM_EX_CAT_LAST 16 #define MVM_EX_CAT_RETURN 32 #define MVM_EX_CAT_UNWIND 64 #define MVM_EX_CAT_TAKE 128 #define MVM_EX_CAT_WARN 256 #define MVM_EX_CAT_SUCCEED 512 #define MVM_EX_CAT_PROCEED 1024 #define MVM_EX_CAT_LABELED 4096 #define MVM_EX_CAT_AWAIT 8192 #define MVM_EX_CAT_EMIT 16384 #define MVM_EX_CAT_DONE 32768 /* Not a real category, but marks an inline boundary. */ #define MVM_EX_INLINE_BOUNDARY 2147483648 /* Ways to throw an exception. */ #define MVM_EX_THROW_DYN 0 #define MVM_EX_THROW_LEX 1 #define MVM_EX_THROW_LEXOTIC 2 #define MVM_EX_THROW_LEX_CALLER 3 /* Information associated with an exception handler. */ struct MVMFrameHandler { /* Start offset into the frame's bytecode for the handler, inclusive. */ MVMuint32 start_offset; /* End offset into the frame's bytecode for the handler, exclusive. */ MVMuint32 end_offset; /* Category mask or inline boundary indicator. */ MVMuint32 category_mask; /* The kind of handler it is. */ MVMuint16 action; /* Register containing block to invoke, for invokey handlers. */ MVMuint16 block_reg; /* Offset into the frame's bytecode of the handler, for goto handlers. */ MVMuint32 goto_offset; /* Register containing a label in case we have a labeled loop. We need to * be able to check for its identity when handling e.g. `next LABEL`. */ MVMuint16 label_reg; /* The inlinee that this handler is associated with. Set to -1 for the * top-level handlers of a frame. Used both to skip non-top-level * handlers, but also to indicate, for a inline boundary indicator * entry in the table, the inline whose handlers end at this point. */ MVMint16 inlinee; }; /* An active (currently executing) exception handler. */ struct MVMActiveHandler { /* The frame the handler was found in. */ MVMFrame *frame; /* The handler information itself. */ MVMFrameHandler *handler; /* Handler information for a JITted handler */ MVMJitHandler *jit_handler; /* The exception object. */ MVMObject *ex_obj; /* The next active handler in the chain. */ MVMActiveHandler *next_handler; }; /* Exception related functions. */ MVMObject * MVM_exception_backtrace(MVMThreadContext *tc, MVMObject *ex_obj); MVMObject * MVM_exception_backtrace_strings(MVMThreadContext *tc, MVMObject *exObj); void MVM_dump_backtrace(MVMThreadContext *tc); void MVM_exception_throwcat(MVMThreadContext *tc, MVMuint8 mode, MVMuint32 cat, MVMRegister *resume_result); void MVM_exception_die(MVMThreadContext *tc, MVMString *str, MVMRegister *rr); void MVM_exception_throwobj(MVMThreadContext *tc, MVMuint8 mode, MVMObject *exObj, MVMRegister *resume_result); void MVM_exception_throwpayload(MVMThreadContext *tc, MVMuint8 mode, MVMuint32 cat, MVMObject *payload, MVMRegister *resume_result); void MVM_exception_resume(MVMThreadContext *tc, MVMObject *exObj); MVM_PUBLIC MVM_NO_RETURN void MVM_panic_allocation_failed(size_t len) MVM_NO_RETURN_GCC; MVM_PUBLIC MVM_NO_RETURN void MVM_panic(MVMint32 exitCode, const char *messageFormat, ...) MVM_NO_RETURN_GCC MVM_FORMAT(printf, 2, 3); MVM_PUBLIC MVM_NO_RETURN void MVM_oops(MVMThreadContext *tc, const char *messageFormat, ...) MVM_NO_RETURN_GCC MVM_FORMAT(printf, 2, 3); MVM_PUBLIC MVM_NO_RETURN void MVM_exception_throw_adhoc(MVMThreadContext *tc, const char *messageFormat, ...) MVM_NO_RETURN_GCC MVM_FORMAT(printf, 2, 3); MVM_NO_RETURN void MVM_exception_throw_adhoc_va(MVMThreadContext *tc, const char *messageFormat, va_list args) MVM_NO_RETURN_GCC; MVM_PUBLIC MVM_NO_RETURN void MVM_exception_throw_adhoc_free(MVMThreadContext *tc, char **waste, const char *messageFormat, ...) MVM_NO_RETURN_GCC MVM_FORMAT(printf, 3, 4); MVM_NO_RETURN void MVM_exception_throw_adhoc_free_va(MVMThreadContext *tc, char **waste, const char *messageFormat, va_list args) MVM_NO_RETURN_GCC; MVM_PUBLIC void MVM_crash_on_error(void); char * MVM_exception_backtrace_line(MVMThreadContext *tc, MVMFrame *cur_frame, MVMuint16 not_top, MVMuint8 *throw_address); MVMint32 MVM_get_exception_category(MVMThreadContext *tc, MVMObject *ex); MVMObject * MVM_get_exception_payload(MVMThreadContext *tc, MVMObject *ex); void MVM_bind_exception_payload(MVMThreadContext *tc, MVMObject *ex, MVMObject *payload); void MVM_bind_exception_category(MVMThreadContext *tc, MVMObject *ex, MVMint32 category); void MVM_exception_returnafterunwind(MVMThreadContext *tc, MVMObject *ex); /* Exit codes for panic. */ #define MVM_exitcode_NYI 12 #define MVM_exitcode_compunit 13 #define MVM_exitcode_invalidopcode 14 #define MVM_exitcode_gcalloc 15 #define MVM_exitcode_gcroots 16 #define MVM_exitcode_gcnursery 17 #define MVM_exitcode_threads 18 #define MVM_exitcode_gcorch 19 MoarVM-2018.03/src/core/ext.c0000644000175000017510000001533213242626641015700 0ustar samanthasamantha#include "moar.h" int MVM_ext_load(MVMThreadContext *tc, MVMString *lib, MVMString *ext) { MVMString *colon, *prefix, *name; MVMExtRegistry *entry; MVMDLLSym *sym; void (*init)(MVMThreadContext *); MVMROOT2(tc, lib, ext, { colon = MVM_string_ascii_decode_nt( tc, tc->instance->VMString, ":"); prefix = MVM_string_concatenate(tc, lib, colon); name = MVM_string_concatenate(tc, prefix, ext); }); uv_mutex_lock(&tc->instance->mutex_ext_registry); MVM_HASH_GET(tc, tc->instance->ext_registry, name, entry); /* Extension already loaded. */ if (entry) { uv_mutex_unlock(&tc->instance->mutex_ext_registry); return 0; } MVMROOT(tc, name, { sym = (MVMDLLSym *)MVM_dll_find_symbol(tc, lib, ext); }); if (!sym) { uv_mutex_unlock(&tc->instance->mutex_ext_registry); MVM_exception_throw_adhoc(tc, "extension symbol not found"); } entry = MVM_malloc(sizeof *entry); entry->sym = sym; entry->name = name; MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->name, "Extension name"); MVM_HASH_BIND(tc, tc->instance->ext_registry, name, entry); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->hash_handle.key, "Extension name hash key"); uv_mutex_unlock(&tc->instance->mutex_ext_registry); /* Call extension's initializer */ init = (void (*)(MVMThreadContext *))sym->body.address; init(tc); return 1; } int MVM_ext_register_extop(MVMThreadContext *tc, const char *cname, MVMExtOpFunc func, MVMuint8 num_operands, MVMuint8 operands[], MVMExtOpSpesh *spesh, MVMExtOpFactDiscover *discover, MVMuint32 flags) { MVMExtOpRegistry *entry; MVMString *name = MVM_string_ascii_decode_nt( tc, tc->instance->VMString, cname); uv_mutex_lock(&tc->instance->mutex_extop_registry); MVM_HASH_GET(tc, tc->instance->extop_registry, name, entry); /* Op already registered, so just verify its signature. */ if (entry) { uv_mutex_unlock(&tc->instance->mutex_extop_registry); if (num_operands != entry->info.num_operands || memcmp(operands, entry->info.operands, num_operands) != 0) MVM_exception_throw_adhoc(tc, "signature mismatch when re-registering extension op %s", cname); return 0; } /* Sanity-check signature. */ if (num_operands > MVM_MAX_OPERANDS) { uv_mutex_unlock(&tc->instance->mutex_extop_registry); MVM_exception_throw_adhoc(tc, "cannot register extension op with more than %u operands", MVM_MAX_OPERANDS); } { MVMuint8 i = 0; for(; i < num_operands; i++) { MVMuint8 flags = operands[i]; switch (flags & MVM_operand_rw_mask) { case MVM_operand_literal: goto check_literal; case MVM_operand_read_reg: case MVM_operand_write_reg: case MVM_operand_read_lex: case MVM_operand_write_lex: goto check_reg; default: goto fail; } check_literal: switch (flags & MVM_operand_type_mask) { case MVM_operand_int8: case MVM_operand_int16: case MVM_operand_int32: case MVM_operand_int64: case MVM_operand_num32: case MVM_operand_num64: case MVM_operand_str: case MVM_operand_coderef: continue; case MVM_operand_ins: case MVM_operand_callsite: default: goto fail; } check_reg: switch (flags & MVM_operand_type_mask) { case MVM_operand_int8: case MVM_operand_int16: case MVM_operand_int32: case MVM_operand_int64: case MVM_operand_num32: case MVM_operand_num64: case MVM_operand_str: case MVM_operand_obj: case MVM_operand_type_var: case MVM_operand_uint8: case MVM_operand_uint16: case MVM_operand_uint32: case MVM_operand_uint64: continue; default: goto fail; } fail: uv_mutex_unlock(&tc->instance->mutex_extop_registry); MVM_exception_throw_adhoc(tc, "extension op %s has illegal signature", cname); } } entry = MVM_malloc(sizeof *entry); entry->name = name; entry->func = func; entry->info.name = cname; entry->info.opcode = (MVMuint16)-1; entry->info.mark[0] = '.'; entry->info.mark[1] = 'x'; entry->info.num_operands = num_operands; entry->info.pure = flags & MVM_EXTOP_PURE; entry->info.deopt_point = 0; entry->info.logged = 0; entry->info.no_inline = flags & MVM_EXTOP_NOINLINE; entry->info.jittivity = (flags & MVM_EXTOP_INVOKISH) ? MVM_JIT_INFO_INVOKISH : 0; entry->info.uses_hll = 0; memcpy(entry->info.operands, operands, num_operands); memset(entry->info.operands + num_operands, 0, MVM_MAX_OPERANDS - num_operands); entry->spesh = spesh; entry->discover = discover; entry->no_jit = flags & MVM_EXTOP_NO_JIT; entry->allocating = flags & MVM_EXTOP_ALLOCATING; MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->name, "Extension op name"); MVM_HASH_BIND(tc, tc->instance->extop_registry, name, entry); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->hash_handle.key, "Extension op name hash key"); uv_mutex_unlock(&tc->instance->mutex_extop_registry); return 1; } const MVMOpInfo * MVM_ext_resolve_extop_record(MVMThreadContext *tc, MVMExtOpRecord *record) { MVMExtOpRegistry *entry; /* Already resolved. */ if (record->info) return record->info; uv_mutex_lock(&tc->instance->mutex_extop_registry); MVM_HASH_GET(tc, tc->instance->extop_registry, record->name, entry); if (!entry) { uv_mutex_unlock(&tc->instance->mutex_extop_registry); return NULL; } /* Resolve record. */ record->info = &entry->info; record->func = entry->func; record->spesh = entry->spesh; record->discover = entry->discover; record->no_jit = entry->no_jit; record->allocating = entry->allocating; uv_mutex_unlock(&tc->instance->mutex_extop_registry); return record->info; } MoarVM-2018.03/src/core/ext.h0000644000175000017510000000234113237701240015672 0ustar samanthasamanthatypedef void MVMExtOpFunc(MVMThreadContext *tc, MVMuint8 *cur_op); typedef void MVMExtOpSpesh(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins); typedef void MVMExtOpFactDiscover(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins); /* Flags we might put on an extension op to indicate its properties. */ #define MVM_EXTOP_PURE 1 #define MVM_EXTOP_NOINLINE 2 #define MVM_EXTOP_INVOKISH 4 #define MVM_EXTOP_NO_JIT 8 #define MVM_EXTOP_ALLOCATING 16 struct MVMExtRegistry { MVMDLLSym *sym; MVMString *name; UT_hash_handle hash_handle; }; struct MVMExtOpRegistry { MVMString *name; MVMExtOpFunc *func; MVMOpInfo info; MVMExtOpSpesh *spesh; MVMExtOpFactDiscover *discover; MVMuint32 no_jit; MVMuint32 allocating; UT_hash_handle hash_handle; }; int MVM_ext_load(MVMThreadContext *tc, MVMString *lib, MVMString *ext); MVM_PUBLIC int MVM_ext_register_extop(MVMThreadContext *tc, const char *cname, MVMExtOpFunc func, MVMuint8 num_operands, MVMuint8 operands[], MVMExtOpSpesh *spesh, MVMExtOpFactDiscover *discover, MVMuint32 flags); const MVMOpInfo * MVM_ext_resolve_extop_record(MVMThreadContext *tc, MVMExtOpRecord *record); MoarVM-2018.03/src/core/fixedsizealloc.c0000644000175000017510000004031513242626641020104 0ustar samanthasamantha#include "moar.h" #include "memdebug.h" /* The fixed size allocator provides a thread-safe mechanism for getting and * releasing fixed-size chunks of memory. Requests larger blocks from the * operating system, and then allocates out of them. Can certainly be further * improved. The free list works like a stack, so you get the most recently * freed piece of memory of a given size, which should give good cache * behavior. */ /* Turn this on to switch to a mode where we debug by size. */ #define FSA_SIZE_DEBUG 0 #if FSA_SIZE_DEBUG typedef struct { MVMuint64 alloc_size; void *memory; } MVMFixedSizeAllocDebug; #endif /* Creates the allocator data structure with bins. */ MVMFixedSizeAlloc * MVM_fixed_size_create(MVMThreadContext *tc) { int init_stat; #ifdef MVM_VALGRIND_SUPPORT int bin_no; #endif MVMFixedSizeAlloc *al = MVM_malloc(sizeof(MVMFixedSizeAlloc)); al->size_classes = MVM_calloc(MVM_FSA_BINS, sizeof(MVMFixedSizeAllocSizeClass)); if ((init_stat = uv_mutex_init(&(al->complex_alloc_mutex))) < 0) MVM_exception_throw_adhoc(tc, "Failed to initialize mutex: %s", uv_strerror(init_stat)); al->freelist_spin = 0; al->free_at_next_safepoint_overflows = NULL; /* All other places where we use valgrind macros are very likely * thrown out by dead code elimination. Not 100% sure about this, * so we ifdef it out. */ #ifdef MVM_VALGRIND_SUPPORT for (bin_no = 0; bin_no < MVM_FSA_BINS; bin_no++) VALGRIND_CREATE_MEMPOOL(&al->size_classes[bin_no], MVM_FSA_REDZONE_BYTES, 0); #endif return al; } /* Creates the per-thread fixed size allocator state. */ void MVM_fixed_size_create_thread(MVMThreadContext *tc) { MVMFixedSizeAllocThread *al = MVM_malloc(sizeof(MVMFixedSizeAllocThread)); al->size_classes = MVM_calloc(MVM_FSA_BINS, sizeof(MVMFixedSizeAllocThreadSizeClass)); tc->thread_fsa = al; } /* Destroys the global fixed size allocator data structure and all of * the memory held within it. */ void MVM_fixed_size_destroy(MVMFixedSizeAlloc *al) { int bin_no; for (bin_no = 0; bin_no < MVM_FSA_BINS; bin_no++) { int page_no; int num_pages = al->size_classes[bin_no].num_pages; VALGRIND_DESTROY_MEMPOOL(&al->size_classes[bin_no]); for (page_no = 0; page_no < num_pages; page_no++) { MVM_free(al->size_classes[bin_no].pages[page_no]); } MVM_free(al->size_classes[bin_no].pages); } uv_mutex_destroy(&(al->complex_alloc_mutex)); MVM_free(al->size_classes); MVM_free(al); } /* Determine the bin. If we hit a bin exactly then it's off-by-one, * since the bins list is base-0. Otherwise we've some extra bits, * which round us up to the next bin, but that's a no-op. */ static MVMuint32 bin_for(size_t bytes) { MVMuint32 bin = (MVMuint32)(bytes >> MVM_FSA_BIN_BITS); if ((bytes & MVM_FSA_BIN_MASK) == 0) bin--; return bin; } /* Sets up a size class bin in the second generation. */ static void setup_bin(MVMFixedSizeAlloc *al, MVMuint32 bin) { /* Work out page size we want. */ MVMuint32 page_size = MVM_FSA_PAGE_ITEMS * ((bin + 1) << MVM_FSA_BIN_BITS) + MVM_FSA_REDZONE_BYTES * 2 * MVM_FSA_PAGE_ITEMS; /* We'll just allocate a single page to start off with. */ al->size_classes[bin].num_pages = 1; al->size_classes[bin].pages = MVM_malloc(sizeof(void *) * al->size_classes[bin].num_pages); al->size_classes[bin].pages[0] = MVM_malloc(page_size); /* Set up allocation position and limit. */ al->size_classes[bin].alloc_pos = al->size_classes[bin].pages[0]; al->size_classes[bin].alloc_limit = al->size_classes[bin].alloc_pos + page_size; } /* Adds a new page to a size class bin. */ static void add_page(MVMFixedSizeAlloc *al, MVMuint32 bin) { /* Work out page size. */ MVMuint32 page_size = MVM_FSA_PAGE_ITEMS * ((bin + 1) << MVM_FSA_BIN_BITS) + MVM_FSA_REDZONE_BYTES * 2 * MVM_FSA_PAGE_ITEMS; /* Add the extra page. */ MVMuint32 cur_page = al->size_classes[bin].num_pages; al->size_classes[bin].num_pages++; al->size_classes[bin].pages = MVM_realloc(al->size_classes[bin].pages, sizeof(void *) * al->size_classes[bin].num_pages); al->size_classes[bin].pages[cur_page] = MVM_malloc(page_size); /* Set up allocation position and limit. */ al->size_classes[bin].alloc_pos = al->size_classes[bin].pages[cur_page]; al->size_classes[bin].alloc_limit = al->size_classes[bin].alloc_pos + page_size; /* set the cur_page to a proper value */ al->size_classes[bin].cur_page = cur_page; } /* Allocates a piece of memory of the specified size, using the FSA. */ static void * alloc_slow_path(MVMThreadContext *tc, MVMFixedSizeAlloc *al, MVMuint32 bin) { void *result; /* Lock. */ uv_mutex_lock(&(al->complex_alloc_mutex)); /* If we've no pages yet, never encountered this bin; set it up. */ if (al->size_classes[bin].pages == NULL) setup_bin(al, bin); /* If we're at the page limit, add a new page. */ if (al->size_classes[bin].alloc_pos == al->size_classes[bin].alloc_limit) { add_page(al, bin); } /* Now we can allocate. */ result = (void *)(al->size_classes[bin].alloc_pos + MVM_FSA_REDZONE_BYTES); al->size_classes[bin].alloc_pos += ((bin + 1) << MVM_FSA_BIN_BITS) + 2 * MVM_FSA_REDZONE_BYTES; VALGRIND_MEMPOOL_ALLOC(&al->size_classes[bin], result, (bin + 1) << MVM_FSA_BIN_BITS); /* Unlock. */ uv_mutex_unlock(&(al->complex_alloc_mutex)); return result; } static void * alloc_from_global(MVMThreadContext *tc, MVMFixedSizeAlloc *al, MVMuint32 bin) { /* Try and take from the global free list (fast path). */ MVMFixedSizeAllocSizeClass *bin_ptr = &(al->size_classes[bin]); MVMFixedSizeAllocFreeListEntry *fle = NULL; /* Multi-threaded, so take a lock. Note that the lock is needed in * addition to the atomic operations: the atomics allow us to add * to the free list in a lock-free way, and the lock allows us to * avoid the ABA issue we'd have with only the atomics. */ while (!MVM_trycas(&(al->freelist_spin), 0, 1)) { MVMint32 i = 0; while (i < 1024) i++; } do { fle = bin_ptr->free_list; if (!fle) break; } while (!MVM_trycas(&(bin_ptr->free_list), fle, fle->next)); MVM_barrier(); al->freelist_spin = 0; if (fle) { VALGRIND_MEMPOOL_ALLOC(&al->size_classes[bin], ((void *)fle), (bin + 1) << MVM_FSA_BIN_BITS); return (void *)fle; } /* Failed to take from free list; slow path with the lock. */ return alloc_slow_path(tc, al, bin); } void * MVM_fixed_size_alloc(MVMThreadContext *tc, MVMFixedSizeAlloc *al, size_t bytes) { #if FSA_SIZE_DEBUG MVMFixedSizeAllocDebug *dbg = MVM_malloc(bytes + sizeof(MVMuint64)); dbg->alloc_size = bytes; return &(dbg->memory); #else MVMuint32 bin = bin_for(bytes); if (bin < MVM_FSA_BINS) { /* Try and take from the per-thread free list. */ MVMFixedSizeAllocThreadSizeClass *bin_ptr = &(tc->thread_fsa->size_classes[bin]); MVMFixedSizeAllocFreeListEntry *fle = bin_ptr->free_list; if (fle) { bin_ptr->free_list = fle->next; bin_ptr->items--; return (void *)fle; } return alloc_from_global(tc, al, bin); } return MVM_malloc(bytes); #endif } /* Allocates a piece of memory of the specified size, using the FSA. Promises * it will be zeroed. */ void * MVM_fixed_size_alloc_zeroed(MVMThreadContext *tc, MVMFixedSizeAlloc *al, size_t bytes) { void *allocd = MVM_fixed_size_alloc(tc, al, bytes); memset(allocd, 0, bytes); return allocd; } /* Reallocs a piece of memory to the specified size, using the FSA. */ void * MVM_fixed_size_realloc(MVMThreadContext *tc, MVMFixedSizeAlloc *al, void * p, size_t old_bytes, size_t new_bytes) { #if FSA_SIZE_DEBUG MVMFixedSizeAllocDebug *dbg = MVM_realloc((char *)p - 8, new_bytes + sizeof(MVMuint64)); dbg->alloc_size = new_bytes; return &(dbg->memory); #else MVMuint32 old_bin = bin_for(old_bytes); MVMuint32 new_bin = bin_for(new_bytes); if (old_bin == new_bin) { return p; } else if (old_bin < MVM_FSA_BINS || new_bin < MVM_FSA_BINS) { void *allocd = MVM_fixed_size_alloc(tc, al, new_bytes); memcpy(allocd, p, new_bin > old_bin ? old_bytes : new_bytes); MVM_fixed_size_free(tc, al, old_bytes, p); return allocd; } else { return MVM_realloc(p, new_bytes); } #endif } /* Reallocs a piece of memory to the specified size, using the FSA. */ void * MVM_fixed_size_realloc_at_safepoint(MVMThreadContext *tc, MVMFixedSizeAlloc *al, void * p, size_t old_bytes, size_t new_bytes) { #if FSA_SIZE_DEBUG MVMFixedSizeAllocDebug *dbg = MVM_fixed_size_alloc(tc, al, new_bytes); memcpy(dbg->memory, (char *)p + sizeof(MVMuint64), new_bytes > old_bytes ? old_bytes : new_bytes); MVM_fixed_size_free_at_safepoint(tc, al, old_bytes, p); dbg->alloc_size = new_bytes; return &(dbg->memory); #else MVMuint32 old_bin = bin_for(old_bytes); MVMuint32 new_bin = bin_for(new_bytes); if (old_bin == new_bin) { return p; } else { void *allocd = MVM_fixed_size_alloc(tc, al, new_bytes); memcpy(allocd, p, new_bin > old_bin ? old_bytes : new_bytes); MVM_fixed_size_free_at_safepoint(tc, al, old_bytes, p); return allocd; } #endif } /* Frees a piece of memory of the specified size, using the FSA. */ static void add_to_global_bin_freelist(MVMThreadContext *tc, MVMFixedSizeAlloc *al, MVMint32 bin, void *to_free) { MVMFixedSizeAllocSizeClass *bin_ptr = &(al->size_classes[bin]); MVMFixedSizeAllocFreeListEntry *to_add = (MVMFixedSizeAllocFreeListEntry *)to_free; MVMFixedSizeAllocFreeListEntry *orig; VALGRIND_MEMPOOL_FREE(bin_ptr, to_add); VALGRIND_MAKE_MEM_DEFINED(to_add, sizeof(MVMFixedSizeAllocFreeListEntry)); /* Multi-threaded; race to add it. */ do { orig = bin_ptr->free_list; to_add->next = orig; } while (!MVM_trycas(&(bin_ptr->free_list), orig, to_add)); } static void add_to_bin_freelist(MVMThreadContext *tc, MVMFixedSizeAlloc *al, MVMint32 bin, void *to_free) { MVMFixedSizeAllocThreadSizeClass *bin_ptr = &(tc->thread_fsa->size_classes[bin]); if (bin_ptr->items < MVM_FSA_THREAD_FREELIST_LIMIT) { MVMFixedSizeAllocFreeListEntry *to_add = (MVMFixedSizeAllocFreeListEntry *)to_free; to_add->next = bin_ptr->free_list; bin_ptr->free_list = to_add; bin_ptr->items++; } else { add_to_global_bin_freelist(tc, al, bin, to_free); } } void MVM_fixed_size_free(MVMThreadContext *tc, MVMFixedSizeAlloc *al, size_t bytes, void *to_free) { #if FSA_SIZE_DEBUG MVMFixedSizeAllocDebug *dbg = (MVMFixedSizeAllocDebug *)((char *)to_free - 8); if (dbg->alloc_size != bytes) { #ifdef MVM_VALGRIND_SUPPORT if (RUNNING_ON_VALGRIND) { char command[128]; snprintf(&command, 128, "check_memory defined %p %d", dbg, bytes + 8); VALGRIND_MONITOR_COMMAND(command); VALGRIND_PRINTF_BACKTRACE("Fixed size allocator: wrong size in free: expected %lu, got %lu", dbg->alloc_size, bytes); } else { MVM_panic(1, "Fixed size allocator: wrong size in free: expected %lu, got %lu", dbg->alloc_size, bytes); } #else MVM_panic(1, "Fixed size allocator: wrong size in free: expected %lu, got %lu", dbg->alloc_size, bytes); #endif } MVM_free(dbg); #else MVMuint32 bin = bin_for(bytes); if (bin < MVM_FSA_BINS) { /* Add to freelist chained through a bin. */ add_to_bin_freelist(tc, al, bin, to_free); } else { /* Was malloc'd due to being oversize, so just free it. */ MVM_free(to_free); } #endif } /* Race to add to the "free at next safe point" overflows list. */ static void add_to_overflows_safepoint_free_list(MVMThreadContext *tc, MVMFixedSizeAlloc *al, void *to_free) { MVMFixedSizeAllocSafepointFreeListEntry *orig; MVMFixedSizeAllocSafepointFreeListEntry *to_add = MVM_fixed_size_alloc( tc, al, sizeof(MVMFixedSizeAllocSafepointFreeListEntry)); to_add->to_free = to_free; do { orig = al->free_at_next_safepoint_overflows; to_add->next = orig; } while (!MVM_trycas(&(al->free_at_next_safepoint_overflows), orig, to_add)); } /* Queues a piece of memory of the specified size to be freed at the next * global safe point, using the FSA. A global safe point is defined as one in * which all threads, since we requested the freeing of the memory, have * reached a safe point. */ void MVM_fixed_size_free_at_safepoint(MVMThreadContext *tc, MVMFixedSizeAlloc *al, size_t bytes, void *to_free) { #if FSA_SIZE_DEBUG MVMFixedSizeAllocDebug *dbg = (MVMFixedSizeAllocDebug *)((char *)to_free - 8); if (dbg->alloc_size != bytes) { #ifdef MVM_VALGRIND_SUPPORT if (RUNNING_ON_VALGRIND) { char command[128]; snprintf(&command, 128, "check_memory defined %p %lu", dbg, bytes + 8); VALGRIND_MONITOR_COMMAND(command); VALGRIND_PRINTF_BACKTRACE("Fixed size allocator: wrong size in free: expected %lu, got %lu", dbg->alloc_size, bytes); } else { MVM_panic(1, "Fixed size allocator: wrong size in free: expected %lu, got %lu", dbg->alloc_size, bytes); } #else MVM_panic(1, "Fixed size allocator: wrong size in free: expected %lu, got %lu", dbg->alloc_size, bytes); #endif MVM_panic(1, "Fixed size allocator: wrong size in free: expected %lu, got %lu", dbg->alloc_size, bytes); } add_to_overflows_safepoint_free_list(tc, al, dbg); #else MVMuint32 bin = bin_for(bytes); if (bin < MVM_FSA_BINS) { /* Came from a bin; race to add it to the "free at next safe point" * list. */ MVMFixedSizeAllocSizeClass *bin_ptr = &(al->size_classes[bin]); MVMFixedSizeAllocSafepointFreeListEntry *orig; MVMFixedSizeAllocSafepointFreeListEntry *to_add = MVM_fixed_size_alloc( tc, al, sizeof(MVMFixedSizeAllocSafepointFreeListEntry)); to_add->to_free = to_free; do { orig = bin_ptr->free_at_next_safepoint_list; to_add->next = orig; } while (!MVM_trycas(&(bin_ptr->free_at_next_safepoint_list), orig, to_add)); } else { /* Was malloc'd due to being oversize. */ add_to_overflows_safepoint_free_list(tc, al, to_free); } #endif } /* Called when we're at a safepoint, to free everything queued up to be freed * at the next safepoint. Assumes that it is only called on one thread at a * time, while the world is stopped. */ void MVM_fixed_size_safepoint(MVMThreadContext *tc, MVMFixedSizeAlloc *al) { /* Go through bins and process any safepoint free lists. */ MVMFixedSizeAllocSafepointFreeListEntry *cur, *next; MVMint32 bin; for (bin = 0; bin < MVM_FSA_BINS; bin++) { cur = al->size_classes[bin].free_at_next_safepoint_list; while (cur) { next = cur->next; add_to_bin_freelist(tc, al, bin, cur->to_free); MVM_fixed_size_free(tc, al, sizeof(MVMFixedSizeAllocSafepointFreeListEntry), cur); cur = next; } al->size_classes[bin].free_at_next_safepoint_list = NULL; } /* Free overflows. */ cur = al->free_at_next_safepoint_overflows; while (cur) { next = cur->next; MVM_free(cur->to_free); MVM_fixed_size_free(tc, al, sizeof(MVMFixedSizeAllocSafepointFreeListEntry), cur); cur = next; } al->free_at_next_safepoint_overflows = NULL; } /* Destroys per-thread fixed size allocator state. All freelists will be * contributed back to the global freelists for the bin size. */ void MVM_fixed_size_destroy_thread(MVMThreadContext *tc) { MVMFixedSizeAllocThread *al = tc->thread_fsa; int bin; for (bin = 0; bin < MVM_FSA_BINS; bin++) { MVMFixedSizeAllocThreadSizeClass *bin_ptr = &(al->size_classes[bin]); MVMFixedSizeAllocFreeListEntry *fle = bin_ptr->free_list; while (fle) { MVMFixedSizeAllocFreeListEntry *next = fle->next; add_to_global_bin_freelist(tc, tc->instance->fsa, bin, (void *)fle); fle = next; } } MVM_free(al->size_classes); MVM_free(al); } MoarVM-2018.03/src/core/fixedsizealloc.h0000644000175000017510000001073613237701240020106 0ustar samanthasamantha/* The global, top-level data structure for the fixed size allocator. */ struct MVMFixedSizeAlloc { /* Size classes for the fixed size allocator. Each one represents a bunch * of objects of the same size. The allocated sizes are rounded and then * one of these buckets is used (more size classes are allocated if a * need arises). */ MVMFixedSizeAllocSizeClass *size_classes; /* Spin lock used for reading from the free list, to avoid ABA. */ AO_t freelist_spin; /* Mutex for when we can't do a cheap/simple allocation. */ uv_mutex_t complex_alloc_mutex; /* Head of the "free at next safepoint" list of overflows (that is, * items that don't fit in a fixed size allocator bin). */ MVMFixedSizeAllocSafepointFreeListEntry *free_at_next_safepoint_overflows; }; /* Free list entry. Must be no bigger than the smallest size class. */ struct MVMFixedSizeAllocFreeListEntry { void *next; }; /* Entry in the "free at next safe point" linked list. */ struct MVMFixedSizeAllocSafepointFreeListEntry { void *to_free; MVMFixedSizeAllocSafepointFreeListEntry *next; }; /* Pages of objects of a particular size class. */ struct MVMFixedSizeAllocSizeClass { /* Each page holds allocated chunks of memory. */ char **pages; /* Head of the free list. */ MVMFixedSizeAllocFreeListEntry *free_list; /* The current allocation position if we've nothing on the * free list. */ char *alloc_pos; /* The current page allocation limit (once we hit this, we need * to go to the next page) Also just used when no free list. */ char *alloc_limit; /* The current page number that we're allocating in. */ MVMuint32 cur_page; /* The number of pages allocated. */ MVMuint32 num_pages; /* Head of the "free at next safepoint" list. */ MVMFixedSizeAllocSafepointFreeListEntry *free_at_next_safepoint_list; }; /* The per-thread data structure for the fixed size allocator, hung off the * thread context. Holds a free list per size bin. Allocations on the thread * will preferentially use the thread free list, and threads will free to * their own free lists, up to a length limit. On hitting the limit, they * will free back to the global allocator. This helps ensure patterns like * producer/consumer don't end up with a "leak". */ struct MVMFixedSizeAllocThread { MVMFixedSizeAllocThreadSizeClass *size_classes; }; struct MVMFixedSizeAllocThreadSizeClass { /* Head of the free list. */ MVMFixedSizeAllocFreeListEntry *free_list; /* How many items are on this thread's free list. */ MVMuint32 items; }; /* The number of bits we discard from the requested size when binning * the allocation request into a size class. For example, if this is * 3 bits then: * Request for 2 bytes ==> bin 0 (objects 0 - 8 bytes) * Request for 4 bytes ==> bin 0 (objects 0 - 8 bytes) * Request for 8 bytes ==> bin 0 (objects 0 - 8 bytes) * Request for 12 bytes ==> bin 1 (objects 9 - 16 bytes) * Request for 16 bytes ==> bin 1 (objects 9 - 16 bytes) */ #define MVM_FSA_BIN_BITS 3 /* Mask used to know if we hit a size class exactly or have to round up. */ #define MVM_FSA_BIN_MASK ((1 << MVM_FSA_BIN_BITS) - 1) /* Number of bins in the FSA. Beyond this, we just degrade to malloc/free. */ #define MVM_FSA_BINS 96 /* The number of items that go into each page. */ #define MVM_FSA_PAGE_ITEMS 128 /* The length limit for the per-thread free list. */ #define MVM_FSA_THREAD_FREELIST_LIMIT 1024 /* Functions. */ MVMFixedSizeAlloc * MVM_fixed_size_create(MVMThreadContext *tc); void MVM_fixed_size_create_thread(MVMThreadContext *tc); void * MVM_fixed_size_alloc(MVMThreadContext *tc, MVMFixedSizeAlloc *fsa, size_t bytes); void * MVM_fixed_size_alloc_zeroed(MVMThreadContext *tc, MVMFixedSizeAlloc *fsa, size_t bytes); void * MVM_fixed_size_realloc(MVMThreadContext *tc, MVMFixedSizeAlloc *al, void * p, size_t old_bytes, size_t new_bytes); void * MVM_fixed_size_realloc_at_safepoint(MVMThreadContext *tc, MVMFixedSizeAlloc *al, void * p, size_t old_bytes, size_t new_bytes); void MVM_fixed_size_destroy(MVMFixedSizeAlloc *al); void MVM_fixed_size_destroy_thread(MVMThreadContext *tc); void MVM_fixed_size_free(MVMThreadContext *tc, MVMFixedSizeAlloc *fsa, size_t bytes, void *free); void MVM_fixed_size_free_at_safepoint(MVMThreadContext *tc, MVMFixedSizeAlloc *fsa, size_t bytes, void *free); void MVM_fixed_size_safepoint(MVMThreadContext *tc, MVMFixedSizeAlloc *al); MoarVM-2018.03/src/core/frame.c0000644000175000017510000024350113252357700016171 0ustar samanthasamantha#include "moar.h" /* This allows the dynlex cache to be disabled when bug hunting, if needed. */ #define MVM_DYNLEX_CACHE_ENABLED 1 /* Check spesh candidate pre-selections match the guards. */ #define MVM_SPESH_CHECK_PRESELECTION 0 /* Computes the initial work area for a frame or a specialization of a frame. */ MVMRegister * MVM_frame_initial_work(MVMThreadContext *tc, MVMuint16 *local_types, MVMuint16 num_locals) { MVMuint16 i; MVMRegister *work_initial = MVM_calloc(num_locals, sizeof(MVMRegister)); for (i = 0; i < num_locals; i++) if (local_types[i] == MVM_reg_obj) work_initial[i].o = tc->instance->VMNull; return work_initial; } /* Takes a static frame and does various one-off calculations about what * space it shall need. Also triggers bytecode verification of the frame's * bytecode. */ static void prepare_and_verify_static_frame(MVMThreadContext *tc, MVMStaticFrame *static_frame) { MVMStaticFrameBody *static_frame_body = &static_frame->body; MVMCompUnit *cu = static_frame_body->cu; /* Ensure the frame is fully deserialized. */ if (!static_frame_body->fully_deserialized) MVM_bytecode_finish_frame(tc, cu, static_frame, 0); /* If we never invoked this compilation unit before, and we have spesh * enabled, we might either have no spesh log or a nearly full one. This * will cause problems with gathering data to OSR hot loops. */ if (!cu->body.invoked) { cu->body.invoked = 1; if (tc->instance->spesh_enabled) MVM_spesh_log_new_compunit(tc); } /* Take compilation unit lock, to make sure we don't race to do the * frame preparation/verification work. */ MVMROOT(tc, cu, { MVMROOT(tc, static_frame, { MVM_reentrantmutex_lock(tc, (MVMReentrantMutex *)cu->body.deserialize_frame_mutex); }); }); if (static_frame->body.instrumentation_level == 0) { /* Work size is number of locals/registers plus size of the maximum * call site argument list. */ static_frame_body->work_size = sizeof(MVMRegister) * (static_frame_body->num_locals + static_frame_body->cu->body.max_callsite_size); /* Validate the bytecode. */ MVM_validate_static_frame(tc, static_frame); /* Compute work area initial state that we can memcpy into place each * time. */ if (static_frame_body->num_locals) static_frame_body->work_initial = MVM_frame_initial_work(tc, static_frame_body->local_types, static_frame_body->num_locals); /* Check if we have any state var lexicals. */ if (static_frame_body->static_env_flags) { MVMuint8 *flags = static_frame_body->static_env_flags; MVMint64 numlex = static_frame_body->num_lexicals; MVMint64 i; for (i = 0; i < numlex; i++) if (flags[i] == 2) { static_frame_body->has_state_vars = 1; break; } } /* Allocate the frame's spesh data structure; do it in gen2, both for * the sake of not triggering GC here to avoid a deadlock risk, but * also because then it can be ssigned into the gen2 static frame * without causing it to become an inter-gen root. */ MVM_gc_allocate_gen2_default_set(tc); MVM_ASSIGN_REF(tc, &(static_frame->common.header), static_frame_body->spesh, MVM_repr_alloc_init(tc, tc->instance->StaticFrameSpesh)); MVM_gc_allocate_gen2_default_clear(tc); } /* Unlock, now we're finished. */ MVM_reentrantmutex_unlock(tc, (MVMReentrantMutex *)cu->body.deserialize_frame_mutex); } /* When we don't match the current instrumentation level, we hit this. It may * simply be that we never invoked the frame, in which case we prepare and * verify it. It may also be because we need to instrument the code for * profiling. */ static void instrumentation_level_barrier(MVMThreadContext *tc, MVMStaticFrame *static_frame) { /* Prepare and verify if needed. */ if (static_frame->body.instrumentation_level == 0) prepare_and_verify_static_frame(tc, static_frame); /* Mark frame as being at the current instrumentation level. */ static_frame->body.instrumentation_level = tc->instance->instrumentation_level; /* Add profiling instrumentation if needed. */ if (tc->instance->profiling) MVM_profile_instrument(tc, static_frame); else if (tc->instance->cross_thread_write_logging) MVM_cross_thread_write_instrument(tc, static_frame); else if (tc->instance->coverage_logging) MVM_line_coverage_instrument(tc, static_frame); else if (tc->instance->debugserver) MVM_breakpoint_instrument(tc, static_frame); else MVM_profile_ensure_uninstrumented(tc, static_frame); } /* Called when the GC destroys a frame. Since the frame may have been alive as * part of a continuation that was taken but never invoked, we should check * things normally cleaned up on return don't need cleaning up also. */ void MVM_frame_destroy(MVMThreadContext *tc, MVMFrame *frame) { if (frame->work) { MVM_args_proc_cleanup(tc, &frame->params); MVM_fixed_size_free(tc, tc->instance->fsa, frame->allocd_work, frame->work); if (frame->extra) { MVMFrameExtra *e = frame->extra; if (e->continuation_tags) MVM_continuation_free_tags(tc, frame); MVM_fixed_size_free(tc, tc->instance->fsa, sizeof(MVMFrameExtra), e); } } if (frame->env) MVM_fixed_size_free(tc, tc->instance->fsa, frame->allocd_env, frame->env); } /* Creates a frame for usage as a context only, possibly forcing all of the * static lexicals to be deserialized if it's used for auto-close purposes. */ static MVMFrame * create_context_only(MVMThreadContext *tc, MVMStaticFrame *static_frame, MVMObject *code_ref, MVMint32 autoclose) { MVMFrame *frame; MVMROOT2(tc, static_frame, code_ref, { /* If the frame was never invoked before, need initial calculations * and verification. */ if (static_frame->body.instrumentation_level == 0) instrumentation_level_barrier(tc, static_frame); frame = MVM_gc_allocate_frame(tc); }); /* Set static frame and code ref. */ MVM_ASSIGN_REF(tc, &(frame->header), frame->static_info, static_frame); MVM_ASSIGN_REF(tc, &(frame->header), frame->code_ref, code_ref); /* Allocate space for lexicals, copying the default lexical environment * into place and, if we're auto-closing, making sure anything we'd clone * is vivified to prevent the clone (which is what creates the correct * BEGIN/INIT semantics). */ if (static_frame->body.env_size) { frame->env = MVM_fixed_size_alloc(tc, tc->instance->fsa, static_frame->body.env_size); frame->allocd_env = static_frame->body.env_size; if (autoclose) { MVMuint16 i, num_lexicals = static_frame->body.num_lexicals; MVM_gc_root_temp_push(tc, (MVMCollectable **)&static_frame); for (i = 0; i < num_lexicals; i++) { if (!static_frame->body.static_env[i].o && static_frame->body.static_env_flags[i] == 1) { MVMint32 scid, objid; if (MVM_bytecode_find_static_lexical_scref(tc, static_frame->body.cu, static_frame, i, &scid, &objid)) { MVMObject *resolved; MVMSerializationContext *sc = MVM_sc_get_sc(tc, static_frame->body.cu, scid); if (sc == NULL) MVM_exception_throw_adhoc(tc, "SC not yet resolved; lookup failed"); resolved = MVM_sc_get_object(tc, sc, objid); MVM_ASSIGN_REF(tc, &(static_frame->common.header), static_frame->body.static_env[i].o, resolved); } } } MVM_gc_root_temp_pop(tc); } memcpy(frame->env, static_frame->body.static_env, static_frame->body.env_size); } return frame; } /* Creates a frame that is suitable for deserializing a context into. Starts * with a ref count of 1 due to being held by an SC. */ MVMFrame * MVM_frame_create_context_only(MVMThreadContext *tc, MVMStaticFrame *static_frame, MVMObject *code_ref) { return create_context_only(tc, static_frame, code_ref, 0); } /* Provides auto-close functionality, for the handful of cases where we have * not ever been in the outer frame of something we're invoking. In this case, * we fake up a frame based on the static lexical environment. */ static MVMFrame * autoclose(MVMThreadContext *tc, MVMStaticFrame *needed) { MVMFrame *result; /* First, see if we can find one on the call stack; return it if so. */ MVMFrame *candidate = tc->cur_frame; while (candidate) { if (candidate->static_info->body.bytecode == needed->body.bytecode) return candidate; candidate = candidate->caller; } /* If not, fake up a frame See if it also needs an outer. */ MVMROOT(tc, needed, { result = create_context_only(tc, needed, (MVMObject *)needed->body.static_code, 1); }); if (needed->body.outer) { /* See if the static code object has an outer. */ MVMCode *outer_code = needed->body.outer->body.static_code; if (outer_code->body.outer && outer_code->body.outer->static_info->body.bytecode == needed->body.bytecode) { /* Yes, just take it. */ MVM_ASSIGN_REF(tc, &(result->header), result->outer, outer_code->body.outer); } else { /* Otherwise, recursively auto-close. */ MVMROOT(tc, result, { MVMFrame *ac = autoclose(tc, needed->body.outer); MVM_ASSIGN_REF(tc, &(result->header), result->outer, ac); }); } } return result; } /* Obtains memory for a frame on the thread-local call stack. */ static MVMFrame * allocate_frame(MVMThreadContext *tc, MVMStaticFrame *static_frame, MVMSpeshCandidate *spesh_cand, MVMint32 heap) { MVMFrame *frame; MVMint32 env_size, work_size, num_locals; MVMStaticFrameBody *static_frame_body; MVMJitCode *jitcode; if (heap) { /* Allocate frame on the heap. We know it's already zeroed. */ MVMROOT(tc, static_frame, { if (tc->cur_frame) MVM_frame_force_to_heap(tc, tc->cur_frame); frame = MVM_gc_allocate_frame(tc); }); } else { /* Allocate the frame on the call stack. */ MVMCallStackRegion *stack = tc->stack_current; if (stack->alloc + sizeof(MVMFrame) >= stack->alloc_limit) stack = MVM_callstack_region_next(tc); frame = (MVMFrame *)stack->alloc; stack->alloc += sizeof(MVMFrame); /* Ensure collectable header flags and owner are zeroed, which means we'll * never try to mark or root the frame. */ frame->header.flags = 0; frame->header.owner = 0; /* Current arguments callsite must be NULL as it's used in GC. Extra must * be NULL so we know we don't have it. Flags should be zeroed. */ frame->cur_args_callsite = NULL; frame->extra = NULL; frame->flags = 0; } /* Allocate space for lexicals and work area. */ static_frame_body = &(static_frame->body); env_size = spesh_cand ? spesh_cand->env_size : static_frame_body->env_size; jitcode = spesh_cand ? spesh_cand->jitcode : NULL; num_locals = jitcode && jitcode->local_types ? jitcode->num_locals : (spesh_cand ? spesh_cand->num_locals : static_frame_body->num_locals); if (env_size) { frame->env = MVM_fixed_size_alloc_zeroed(tc, tc->instance->fsa, env_size); frame->allocd_env = env_size; } else { frame->env = NULL; frame->allocd_env = 0; } work_size = spesh_cand ? spesh_cand->work_size : static_frame_body->work_size; if (work_size) { if (spesh_cand) { /* Allocate zeroed memory. Spesh makes sure we have VMNull setup in * the places we need it. */ frame->work = MVM_fixed_size_alloc_zeroed(tc, tc->instance->fsa, work_size); } else { /* Copy frame template with VMNulls in to place. */ frame->work = MVM_fixed_size_alloc(tc, tc->instance->fsa, work_size); memcpy(frame->work, static_frame_body->work_initial, sizeof(MVMRegister) * static_frame_body->num_locals); } frame->allocd_work = work_size; /* Calculate args buffer position. */ frame->args = frame->work + num_locals; } else { frame->work = NULL; frame->allocd_work = 0; } /* Set static frame and caller before we let this frame escape and the GC * see it. */ frame->static_info = static_frame; frame->caller = tc->cur_frame; /* Assign a sequence nr */ frame->sequence_nr = tc->next_frame_nr++; return frame; } /* Obtains memory for a frame on the heap. */ static MVMFrame * allocate_heap_frame(MVMThreadContext *tc, MVMStaticFrame *static_frame, MVMSpeshCandidate *spesh_cand) { MVMFrame *frame; MVMint32 env_size, work_size; MVMStaticFrameBody *static_frame_body; /* Allocate the frame. */ MVMROOT(tc, static_frame, { frame = MVM_gc_allocate_frame(tc); }); /* Allocate space for lexicals and work area. */ static_frame_body = &(static_frame->body); env_size = spesh_cand ? spesh_cand->env_size : static_frame_body->env_size; if (env_size) { frame->env = MVM_fixed_size_alloc_zeroed(tc, tc->instance->fsa, env_size); frame->allocd_env = env_size; } work_size = spesh_cand ? spesh_cand->work_size : static_frame_body->work_size; if (work_size) { /* Fill up all object registers with a pointer to our VMNull object */ if (spesh_cand && spesh_cand->local_types) { MVMuint32 num_locals = spesh_cand->num_locals; MVMuint16 *local_types = spesh_cand->local_types; MVMuint32 i; frame->work = MVM_fixed_size_alloc_zeroed(tc, tc->instance->fsa, work_size); for (i = 0; i < num_locals; i++) if (local_types[i] == MVM_reg_obj) frame->work[i].o = tc->instance->VMNull; } else { frame->work = MVM_fixed_size_alloc(tc, tc->instance->fsa, work_size); memcpy(frame->work, static_frame_body->work_initial, sizeof(MVMRegister) * static_frame_body->num_locals); } frame->allocd_work = work_size; /* Calculate args buffer position. */ frame->args = frame->work + (spesh_cand ? spesh_cand->num_locals : static_frame_body->num_locals); } return frame; } /* This exists to reduce the amount of pointer-fiddling that has to be * done by the JIT */ void MVM_frame_invoke_code(MVMThreadContext *tc, MVMCode *code, MVMCallsite *callsite, MVMint32 spesh_cand) { MVM_frame_invoke(tc, code->body.sf, callsite, tc->cur_frame->args, code->body.outer, (MVMObject*)code, spesh_cand); } /* Takes a static frame and a thread context. Invokes the static frame. */ void MVM_frame_invoke(MVMThreadContext *tc, MVMStaticFrame *static_frame, MVMCallsite *callsite, MVMRegister *args, MVMFrame *outer, MVMObject *code_ref, MVMint32 spesh_cand) { MVMFrame *frame; MVMuint8 *chosen_bytecode; MVMStaticFrameSpesh *spesh; /* If the frame was never invoked before, or never before at the current * instrumentation level, we need to trigger the instrumentation level * barrier. */ if (static_frame->body.instrumentation_level != tc->instance->instrumentation_level) { MVMROOT3(tc, static_frame, code_ref, outer, { instrumentation_level_barrier(tc, static_frame); }); } /* Ensure we have an outer if needed. This is done ahead of allocating the * new frame, since an autoclose will force the callstack on to the heap. */ if (outer) { /* We were provided with an outer frame and it will already have had * its reference count incremented; just ensure that it is based on the * correct static frame (compare on bytecode address to cope with * nqp::freshcoderef). */ if (outer->static_info->body.orig_bytecode != static_frame->body.outer->body.orig_bytecode) { char *frame_cuuid = MVM_string_utf8_encode_C_string(tc, static_frame->body.cuuid); char *frame_name; char *outer_cuuid = MVM_string_utf8_encode_C_string(tc, outer->static_info->body.cuuid); char *outer_name; char *frame_outer_cuuid = MVM_string_utf8_encode_C_string(tc, static_frame->body.outer->body.cuuid); char *frame_outer_name; char *waste[7] = { frame_cuuid, outer_cuuid, frame_outer_cuuid, NULL, NULL, NULL, NULL }; int waste_counter = 3; if (static_frame->body.name) { frame_name = MVM_string_utf8_encode_C_string(tc, static_frame->body.name); waste[waste_counter++] = frame_name; } else { frame_name = ""; } if (outer->static_info->body.name) { outer_name = MVM_string_utf8_encode_C_string(tc, outer->static_info->body.name); waste[waste_counter++] = outer_name; } else { outer_name = ""; } if (static_frame->body.outer->body.name) { frame_outer_name = MVM_string_utf8_encode_C_string(tc, static_frame->body.outer->body.name); waste[waste_counter++] = frame_outer_name; } else { frame_outer_name = ""; } MVM_exception_throw_adhoc_free(tc, waste, "When invoking %s '%s', provided outer frame %p (%s '%s') does not match expected static frame %p (%s '%s')", frame_cuuid, frame_name, outer->static_info, outer_cuuid, outer_name, static_frame->body.outer, frame_outer_cuuid, frame_outer_name); } } else if (static_frame->body.static_code) { MVMCode *static_code = static_frame->body.static_code; if (static_code->body.outer) { /* We're lacking an outer, but our static code object may have one. * This comes up in the case of cloned protoregexes, for example. */ outer = static_code->body.outer; } else if (static_frame->body.outer) { /* Auto-close, and cache it in the static frame. */ MVMROOT2(tc, static_frame, code_ref, { MVM_frame_force_to_heap(tc, tc->cur_frame); outer = autoclose(tc, static_frame->body.outer); MVM_ASSIGN_REF(tc, &(static_code->common.header), static_code->body.outer, outer); }); } else { outer = NULL; } } /* See if any specializations apply. */ spesh = static_frame->body.spesh; if (spesh_cand < 0) spesh_cand = MVM_spesh_arg_guard_run(tc, spesh->body.spesh_arg_guard, callsite, args, NULL); #if MVM_SPESH_CHECK_PRESELECTION else { MVMint32 certain = -1; MVMint32 correct = MVM_spesh_arg_guard_run(tc, spesh->body.spesh_arg_guard, callsite, args, &certain); if (spesh_cand != correct && spesh_cand != certain) { fprintf(stderr, "Inconsistent spesh preselection of '%s' (%s): got %d, not %d\n", MVM_string_utf8_encode_C_string(tc, static_frame->body.name), MVM_string_utf8_encode_C_string(tc, static_frame->body.cuuid), spesh_cand, correct); MVM_dump_backtrace(tc); } } #endif if (spesh_cand >= 0) { MVMSpeshCandidate *chosen_cand = spesh->body.spesh_candidates[spesh_cand]; if (static_frame->body.allocate_on_heap) { MVMROOT3(tc, static_frame, code_ref, outer, { frame = allocate_frame(tc, static_frame, chosen_cand, 1); }); } else { frame = allocate_frame(tc, static_frame, chosen_cand, 0); frame->spesh_correlation_id = 0; } if (chosen_cand->jitcode) { chosen_bytecode = chosen_cand->jitcode->bytecode; frame->jit_entry_label = chosen_cand->jitcode->labels[0]; } else { chosen_bytecode = chosen_cand->bytecode; } frame->effective_spesh_slots = chosen_cand->spesh_slots; frame->spesh_cand = chosen_cand; } else { MVMint32 on_heap = static_frame->body.allocate_on_heap; if (on_heap) { MVMROOT3(tc, static_frame, code_ref, outer, { frame = allocate_frame(tc, static_frame, NULL, 1); }); } else { frame = allocate_frame(tc, static_frame, NULL, 0); frame->spesh_cand = NULL; frame->effective_spesh_slots = NULL; frame->spesh_correlation_id = 0; } chosen_bytecode = static_frame->body.bytecode; /* If we should be spesh logging, set the correlation ID. */ if (tc->instance->spesh_enabled && tc->spesh_log && static_frame->body.bytecode_size < MVM_SPESH_MAX_BYTECODE_SIZE) { if (spesh->body.spesh_entries_recorded++ < MVM_SPESH_LOG_LOGGED_ENOUGH) { MVMint32 id = ++tc->spesh_cid; frame->spesh_correlation_id = id; MVMROOT3(tc, static_frame, code_ref, outer, { if (on_heap) { MVMROOT(tc, frame, { MVM_spesh_log_entry(tc, id, static_frame, callsite); }); } else { MVMROOT2(tc, frame->caller, frame->static_info, { MVM_spesh_log_entry(tc, id, static_frame, callsite); }); } }); } } } /* Store the code ref (NULL at the top-level). */ frame->code_ref = code_ref; /* Outer. */ frame->outer = outer; /* Initialize argument processing. */ MVM_args_proc_init(tc, &frame->params, callsite, args); /* Update interpreter and thread context, so next execution will use this * frame. */ tc->cur_frame = frame; tc->current_frame_nr = frame->sequence_nr; *(tc->interp_cur_op) = chosen_bytecode; *(tc->interp_bytecode_start) = chosen_bytecode; *(tc->interp_reg_base) = frame->work; *(tc->interp_cu) = static_frame->body.cu; /* If we need to do so, make clones of things in the lexical environment * that need it. Note that we do this after tc->cur_frame became the * current frame, to make sure these new objects will certainly get * marked if GC is triggered along the way. */ if (static_frame->body.has_state_vars) { /* Drag everything out of static_frame_body before we start, * as GC action may invalidate it. */ MVMRegister *env = static_frame->body.static_env; MVMuint8 *flags = static_frame->body.static_env_flags; MVMint64 numlex = static_frame->body.num_lexicals; MVMRegister *state = NULL; MVMint64 state_act = 0; /* 0 = none so far, 1 = first time, 2 = later */ MVMint64 i; MVMROOT(tc, frame, { for (i = 0; i < numlex; i++) { if (flags[i] == 2) { redo_state: switch (state_act) { case 0: if (!frame->code_ref) MVM_exception_throw_adhoc(tc, "Frame must have code-ref to have state variables"); state = ((MVMCode *)frame->code_ref)->body.state_vars; if (state) { /* Already have state vars; pull them from this. */ state_act = 2; } else { /* Allocate storage for state vars. */ state = (MVMRegister *)MVM_calloc(1, frame->static_info->body.env_size); ((MVMCode *)frame->code_ref)->body.state_vars = state; state_act = 1; /* Note that this frame should run state init code. */ frame->flags |= MVM_FRAME_FLAG_STATE_INIT; } goto redo_state; case 1: { MVMObject *cloned = MVM_repr_clone(tc, env[i].o); frame->env[i].o = cloned; MVM_ASSIGN_REF(tc, &(frame->code_ref->header), state[i].o, cloned); break; } case 2: frame->env[i].o = state[i].o; break; } } } }); } } /* Moves the specified frame from the stack and on to the heap. Must only * be called if the frame is not already there. Use MVM_frame_force_to_heap * when not sure. */ MVMFrame * MVM_frame_move_to_heap(MVMThreadContext *tc, MVMFrame *frame) { /* To keep things simple, we'll promote the entire stack. */ MVMFrame *cur_to_promote = tc->cur_frame; MVMFrame *new_cur_frame = NULL; MVMFrame *update_caller = NULL; MVMFrame *result = NULL; MVM_CHECK_CALLER_CHAIN(tc, cur_to_promote); MVMROOT3(tc, new_cur_frame, update_caller, result, { while (cur_to_promote) { /* Allocate a heap frame. */ MVMFrame *promoted = MVM_gc_allocate_frame(tc); /* Bump heap promotion counter, to encourage allocating this kind * of frame directly on the heap in the future. If the frame was * entered at least 50 times, and over 80% of the entries lead to * an eventual heap promotion, them we'll mark it to be allocated * right away on the heap. Note that entries is only bumped when * spesh logging is taking place, so we only bump the number of * heap promotions in that case too. */ MVMStaticFrame *sf = cur_to_promote->static_info; if (!sf->body.allocate_on_heap && cur_to_promote->spesh_correlation_id) { MVMuint32 promos = sf->body.spesh->body.num_heap_promotions++; MVMuint32 entries = sf->body.spesh->body.spesh_entries_recorded; if (entries > 50 && promos > (4 * entries) / 5) sf->body.allocate_on_heap = 1; } /* Copy current frame's body to it. */ memcpy( (char *)promoted + sizeof(MVMCollectable), (char *)cur_to_promote + sizeof(MVMCollectable), sizeof(MVMFrame) - sizeof(MVMCollectable)); /* Update caller of previously promoted frame, if any. This is the * only reference that might point to a non-heap frame. */ if (update_caller) { MVM_ASSIGN_REF(tc, &(update_caller->header), update_caller->caller, promoted); } /* If we're the first time through the lopo, then we're instead * replacing the current stack top. Note we do it at the end, * so that the GC can still walk unpromoted frames if it runs * in this loop. */ else { new_cur_frame = promoted; } /* If the frame we're promoting was in the active handlers list, * update the address there. */ if (tc->active_handlers) { MVMActiveHandler *ah = tc->active_handlers; while (ah) { if (ah->frame == cur_to_promote) ah->frame = promoted; ah = ah->next_handler; } } /* If we're replacing the frame we were asked to promote, that will * become our result. */ if (cur_to_promote == frame) result = promoted; /* Check if there's a caller, or if we reached the end of the * chain. */ if (cur_to_promote->caller) { /* If the caller is on the stack then it needs promotion too. * If not, we're done. */ if (MVM_FRAME_IS_ON_CALLSTACK(tc, cur_to_promote->caller)) { /* Clear caller in promoted frame, to avoid a heap -> stack * reference if we GC during this loop. */ promoted->caller = NULL; update_caller = promoted; cur_to_promote = cur_to_promote->caller; } else { if (cur_to_promote == tc->thread_entry_frame) tc->thread_entry_frame = promoted; cur_to_promote = NULL; } } else { /* End of caller chain; check if we promoted the entry * frame */ if (cur_to_promote == tc->thread_entry_frame) tc->thread_entry_frame = promoted; cur_to_promote = NULL; } } }); MVM_CHECK_CALLER_CHAIN(tc, new_cur_frame); /* All is promoted. Update thread's current frame and reset the thread * local callstack. */ tc->cur_frame = new_cur_frame; MVM_callstack_reset(tc); /* Hand back new location of promoted frame. */ if (!result) MVM_panic(1, "Failed to find frame to promote on call stack"); return result; } /* This function is to be used by the debugserver if a thread is currently * blocked. */ MVMFrame * MVM_frame_debugserver_move_to_heap(MVMThreadContext *tc, MVMThreadContext *owner, MVMFrame *frame) { /* To keep things simple, we'll promote the entire stack. */ MVMFrame *cur_to_promote = owner->cur_frame; MVMFrame *new_cur_frame = NULL; MVMFrame *update_caller = NULL; MVMFrame *result = NULL; MVM_CHECK_CALLER_CHAIN(tc, cur_to_promote); MVMROOT3(tc, new_cur_frame, update_caller, result, { while (cur_to_promote) { /* Allocate a heap frame. */ MVMFrame *promoted = MVM_gc_allocate_frame(tc); /* Bump heap promotion counter, to encourage allocating this kind * of frame directly on the heap in the future. If the frame was * entered at least 50 times, and over 80% of the entries lead to * an eventual heap promotion, them we'll mark it to be allocated * right away on the heap. Note that entries is only bumped when * spesh logging is taking place, so we only bump the number of * heap promotions in that case too. */ MVMStaticFrame *sf = cur_to_promote->static_info; if (!sf->body.allocate_on_heap && cur_to_promote->spesh_correlation_id) { MVMuint32 promos = sf->body.spesh->body.num_heap_promotions++; MVMuint32 entries = sf->body.spesh->body.spesh_entries_recorded; if (entries > 50 && promos > (4 * entries) / 5) sf->body.allocate_on_heap = 1; } /* Copy current frame's body to it. */ memcpy( (char *)promoted + sizeof(MVMCollectable), (char *)cur_to_promote + sizeof(MVMCollectable), sizeof(MVMFrame) - sizeof(MVMCollectable)); /* Update caller of previously promoted frame, if any. This is the * only reference that might point to a non-heap frame. */ if (update_caller) { MVM_ASSIGN_REF(tc, &(update_caller->header), update_caller->caller, promoted); } /* If we're the first time through the lopo, then we're instead * replacing the current stack top. Note we do it at the end, * so that the GC can still walk unpromoted frames if it runs * in this loop. */ else { new_cur_frame = promoted; } /* If the frame we're promoting was in the active handlers list, * update the address there. */ if (owner->active_handlers) { MVMActiveHandler *ah = owner->active_handlers; while (ah) { if (ah->frame == cur_to_promote) ah->frame = promoted; ah = ah->next_handler; } } /* If we're replacing the frame we were asked to promote, that will * become our result. */ if (cur_to_promote == frame) result = promoted; /* Check if there's a caller, or if we reached the end of the * chain. */ if (cur_to_promote->caller) { /* If the caller is on the stack then it needs promotion too. * If not, we're done. */ if (MVM_FRAME_IS_ON_CALLSTACK(tc, cur_to_promote->caller)) { /* Clear caller in promoted frame, to avoid a heap -> stack * reference if we GC during this loop. */ promoted->caller = NULL; update_caller = promoted; cur_to_promote = cur_to_promote->caller; } else { if (cur_to_promote == owner->thread_entry_frame) owner->thread_entry_frame = promoted; cur_to_promote = NULL; } } else { /* End of caller chain; check if we promoted the entry * frame */ if (cur_to_promote == owner->thread_entry_frame) owner->thread_entry_frame = promoted; cur_to_promote = NULL; } } }); MVM_CHECK_CALLER_CHAIN(tc, new_cur_frame); /* All is promoted. Update thread's current frame and reset the thread * local callstack. */ owner->cur_frame = new_cur_frame; MVM_callstack_reset(owner); /* Hand back new location of promoted frame. */ if (!result) MVM_panic(1, "Failed to find frame to promote on foreign thread's call stack"); return result; } /* Creates a frame for de-optimization purposes. */ MVMFrame * MVM_frame_create_for_deopt(MVMThreadContext *tc, MVMStaticFrame *static_frame, MVMCode *code_ref) { MVMFrame *frame; MVMROOT2(tc, static_frame, code_ref, { frame = allocate_heap_frame(tc, static_frame, NULL); }); MVM_ASSIGN_REF(tc, &(frame->header), frame->static_info, static_frame); MVM_ASSIGN_REF(tc, &(frame->header), frame->code_ref, code_ref); MVM_ASSIGN_REF(tc, &(frame->header), frame->outer, code_ref->body.outer); return frame; } /* Removes a single frame, as part of a return or unwind. Done after any exit * handler has already been run. */ static MVMuint64 remove_one_frame(MVMThreadContext *tc, MVMuint8 unwind) { MVMFrame *returner = tc->cur_frame; MVMFrame *caller = returner->caller; MVM_ASSERT_NOT_FROMSPACE(tc, caller); /* Clear up any extra frame data. */ if (returner->extra) { MVMFrameExtra *e = returner->extra; if (e->continuation_tags) MVM_continuation_free_tags(tc, returner); MVM_fixed_size_free(tc, tc->instance->fsa, sizeof(MVMFrameExtra), e); returner->extra = NULL; } /* Clean up frame working space. */ if (returner->work) { MVM_args_proc_cleanup(tc, &returner->params); MVM_fixed_size_free(tc, tc->instance->fsa, returner->allocd_work, returner->work); } /* If it's a call stack frame, remove it from the stack. */ if (MVM_FRAME_IS_ON_CALLSTACK(tc, returner)) { MVMCallStackRegion *stack = tc->stack_current; stack->alloc = (char *)returner; if ((char *)stack->alloc - sizeof(MVMCallStackRegion) == (char *)stack) MVM_callstack_region_prev(tc); if (returner->env) MVM_fixed_size_free(tc, tc->instance->fsa, returner->allocd_env, returner->env); } /* Otherwise, NULL out ->work, to indicate the frame is no longer in * dynamic scope. This is used by the GC to avoid marking stuff (this is * needed for safety as otherwise we'd read freed memory), as well as by * exceptions to ensure the target of an exception throw is indeed still * in dynamic scope. */ else { returner->work = NULL; } /* Switch back to the caller frame if there is one. */ if (caller && returner != tc->thread_entry_frame) { tc->cur_frame = caller; tc->current_frame_nr = caller->sequence_nr; *(tc->interp_cur_op) = caller->return_address; *(tc->interp_bytecode_start) = MVM_frame_effective_bytecode(caller); *(tc->interp_reg_base) = caller->work; *(tc->interp_cu) = caller->static_info->body.cu; /* Handle any special return hooks. */ if (caller->extra) { MVMFrameExtra *e = caller->extra; if (e->special_return || e->special_unwind) { MVMSpecialReturn sr = e->special_return; MVMSpecialReturn su = e->special_unwind; void *srd = e->special_return_data; e->special_return = NULL; e->special_unwind = NULL; e->special_return_data = NULL; e->mark_special_return_data = NULL; if (unwind && su) su(tc, srd); else if (!unwind && sr) sr(tc, srd); } } return 1; } else { tc->cur_frame = NULL; return 0; } } /* Attempt to return from the current frame. Returns non-zero if we can, * and zero if there is nowhere to return to (which would signal the exit * of the interpreter). */ static void remove_after_handler(MVMThreadContext *tc, void *sr_data) { remove_one_frame(tc, 0); } MVMuint64 MVM_frame_try_return(MVMThreadContext *tc) { MVMFrame *cur_frame = tc->cur_frame; if (cur_frame->static_info->body.has_exit_handler && !(cur_frame->flags & MVM_FRAME_FLAG_EXIT_HAND_RUN)) { /* Set us up to run exit handler, and make it so we'll really exit the * frame when that has been done. */ MVMFrame *caller = cur_frame->caller; MVMHLLConfig *hll = MVM_hll_current(tc); MVMObject *handler; MVMObject *result; MVMCallsite *two_args_callsite; if (!caller) MVM_exception_throw_adhoc(tc, "Entry point frame cannot have an exit handler"); if (tc->cur_frame == tc->thread_entry_frame) MVM_exception_throw_adhoc(tc, "Thread entry point frame cannot have an exit handler"); if (caller->return_type == MVM_RETURN_OBJ) { result = caller->return_value->o; if (!result) result = tc->instance->VMNull; } else { MVMROOT(tc, cur_frame, { switch (caller->return_type) { case MVM_RETURN_INT: result = MVM_repr_box_int(tc, hll->int_box_type, caller->return_value->i64); break; case MVM_RETURN_NUM: result = MVM_repr_box_num(tc, hll->num_box_type, caller->return_value->n64); break; case MVM_RETURN_STR: result = MVM_repr_box_str(tc, hll->str_box_type, caller->return_value->s); break; default: result = tc->instance->VMNull; } }); } handler = MVM_frame_find_invokee(tc, hll->exit_handler, NULL); two_args_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_TWO_OBJ); MVM_args_setup_thunk(tc, NULL, MVM_RETURN_VOID, two_args_callsite); cur_frame->args[0].o = cur_frame->code_ref; cur_frame->args[1].o = result; MVM_frame_special_return(tc, cur_frame, remove_after_handler, NULL, NULL, NULL); cur_frame->flags |= MVM_FRAME_FLAG_EXIT_HAND_RUN; STABLE(handler)->invoke(tc, handler, two_args_callsite, cur_frame->args); return 1; } else { /* No exit handler, so a straight return. */ return remove_one_frame(tc, 0); } } /* Try a return from the current frame; skip running any exit handlers. */ MVMuint64 MVM_frame_try_return_no_exit_handlers(MVMThreadContext *tc) { return remove_one_frame(tc, 0); } /* Unwinds execution state to the specified frame, placing control flow at either * an absolute or relative (to start of target frame) address and optionally * setting a returned result. */ typedef struct { MVMFrame *frame; MVMuint8 *abs_addr; MVMuint32 rel_addr; } MVMUnwindData; static void mark_unwind_data(MVMThreadContext *tc, MVMFrame *frame, MVMGCWorklist *worklist) { MVMUnwindData *ud = (MVMUnwindData *)frame->extra->special_return_data; MVM_gc_worklist_add(tc, worklist, &(ud->frame)); } static void continue_unwind(MVMThreadContext *tc, void *sr_data) { MVMUnwindData *ud = (MVMUnwindData *)sr_data; MVMFrame *frame = ud->frame; MVMuint8 *abs_addr = ud->abs_addr; MVMuint32 rel_addr = ud->rel_addr; MVM_free(sr_data); MVM_frame_unwind_to(tc, frame, abs_addr, rel_addr, NULL); } void MVM_frame_unwind_to(MVMThreadContext *tc, MVMFrame *frame, MVMuint8 *abs_addr, MVMuint32 rel_addr, MVMObject *return_value) { while (tc->cur_frame != frame) { MVMFrame *cur_frame = tc->cur_frame; if (cur_frame->static_info->body.has_exit_handler && !(cur_frame->flags & MVM_FRAME_FLAG_EXIT_HAND_RUN)) { /* We're unwinding a frame with an exit handler. Thus we need to * pause the unwind, run the exit handler, and keep enough info * around in order to finish up the unwind afterwards. */ MVMHLLConfig *hll = MVM_hll_current(tc); MVMFrame *caller; MVMObject *handler; MVMCallsite *two_args_callsite; /* Force the frame onto the heap, since we'll reference it from the * unwind data. */ MVMROOT3(tc, frame, cur_frame, return_value, { frame = MVM_frame_force_to_heap(tc, frame); cur_frame = tc->cur_frame; }); caller = cur_frame->caller; if (!caller) MVM_exception_throw_adhoc(tc, "Entry point frame cannot have an exit handler"); if (cur_frame == tc->thread_entry_frame) MVM_exception_throw_adhoc(tc, "Thread entry point frame cannot have an exit handler"); handler = MVM_frame_find_invokee(tc, hll->exit_handler, NULL); two_args_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_TWO_OBJ); MVM_args_setup_thunk(tc, NULL, MVM_RETURN_VOID, two_args_callsite); cur_frame->args[0].o = cur_frame->code_ref; cur_frame->args[1].o = tc->instance->VMNull; { MVMUnwindData *ud = MVM_malloc(sizeof(MVMUnwindData)); ud->frame = frame; ud->abs_addr = abs_addr; ud->rel_addr = rel_addr; if (return_value) MVM_exception_throw_adhoc(tc, "return_value + exit_handler case NYI"); MVM_frame_special_return(tc, cur_frame, continue_unwind, NULL, ud, mark_unwind_data); } cur_frame->flags |= MVM_FRAME_FLAG_EXIT_HAND_RUN; STABLE(handler)->invoke(tc, handler, two_args_callsite, cur_frame->args); return; } else { /* If we're profiling, log an exit. */ if (tc->instance->profiling) MVM_profile_log_unwind(tc); /* No exit handler, so just remove the frame. */ if (!remove_one_frame(tc, 1)) MVM_panic(1, "Internal error: Unwound entire stack and missed handler"); } } if (abs_addr) *tc->interp_cur_op = abs_addr; else if (rel_addr) *tc->interp_cur_op = *tc->interp_bytecode_start + rel_addr; if (return_value) MVM_args_set_result_obj(tc, return_value, 1); } /* Gets a code object for a frame, lazily deserializing it if needed. */ MVMObject * MVM_frame_get_code_object(MVMThreadContext *tc, MVMCode *code) { if (REPR(code)->ID != MVM_REPR_ID_MVMCode) MVM_exception_throw_adhoc(tc, "getcodeobj needs a code ref"); if (!code->body.code_object) { MVMStaticFrame *sf = code->body.sf; if (sf->body.code_obj_sc_dep_idx > 0) { MVMObject *resolved; MVMSerializationContext *sc = MVM_sc_get_sc(tc, sf->body.cu, sf->body.code_obj_sc_dep_idx - 1); if (sc == NULL) MVM_exception_throw_adhoc(tc, "SC not yet resolved; lookup failed"); MVMROOT(tc, code, { resolved = MVM_sc_get_object(tc, sc, sf->body.code_obj_sc_idx); }); MVM_ASSIGN_REF(tc, &(code->common.header), code->body.code_object, resolved); } } return code->body.code_object; } /* Given the specified code object, sets its outer to the current scope. */ void MVM_frame_capturelex(MVMThreadContext *tc, MVMObject *code) { MVMCode *code_obj = (MVMCode *)code; MVMFrame *captured; if (REPR(code)->ID != MVM_REPR_ID_MVMCode) MVM_exception_throw_adhoc(tc, "Can only perform capturelex on object with representation MVMCode"); MVMROOT(tc, code, { captured = MVM_frame_force_to_heap(tc, tc->cur_frame); }); MVM_ASSIGN_REF(tc, &(code->header), code_obj->body.outer, captured); } /* This is used for situations in Perl 6 like: * supply { * my $x = something(); * whenever $supply { * QUIT { $x.foo() } * } * } * Here, the QUIT may be called without an invocation of the whenever ever * having taken place. At the point we closure-clone the whenever block, we * will capture_inner the QUIT phaser. This creates a fake outer for the * QUIT, but makes *its* outer point to the nearest instance of the relevant * static frame on the call stack, so that the QUIT will disocver the correct * $x. */ void MVM_frame_capture_inner(MVMThreadContext *tc, MVMObject *code) { MVMCode *code_obj = (MVMCode *)code; MVMFrame *outer; MVMROOT(tc, code, { MVMStaticFrame *sf_outer = code_obj->body.sf->body.outer; MVMROOT(tc, sf_outer, { outer = create_context_only(tc, sf_outer, (MVMObject *)sf_outer->body.static_code, 1); }); MVMROOT(tc, outer, { MVMFrame *outer_outer = autoclose(tc, sf_outer->body.outer); MVM_ASSIGN_REF(tc, &(outer->header), outer->outer, outer_outer); }); }); MVM_ASSIGN_REF(tc, &(code->header), code_obj->body.outer, outer); } /* Given the specified code object, copies it and returns a copy which * captures a closure over the current scope. */ MVMObject * MVM_frame_takeclosure(MVMThreadContext *tc, MVMObject *code) { MVMCode *closure; MVMFrame *captured; if (REPR(code)->ID != MVM_REPR_ID_MVMCode) MVM_exception_throw_adhoc(tc, "Can only perform takeclosure on object with representation MVMCode"); MVMROOT(tc, code, { closure = (MVMCode *)REPR(code)->allocate(tc, STABLE(code)); MVMROOT(tc, closure, { captured = MVM_frame_force_to_heap(tc, tc->cur_frame); }); }); MVM_ASSIGN_REF(tc, &(closure->common.header), closure->body.sf, ((MVMCode *)code)->body.sf); MVM_ASSIGN_REF(tc, &(closure->common.header), closure->body.name, ((MVMCode *)code)->body.name); MVM_ASSIGN_REF(tc, &(closure->common.header), closure->body.outer, captured); MVM_ASSIGN_REF(tc, &(closure->common.header), closure->body.code_object, ((MVMCode *)code)->body.code_object); return (MVMObject *)closure; } /* Vivifies a lexical in a frame. */ MVMObject * MVM_frame_vivify_lexical(MVMThreadContext *tc, MVMFrame *f, MVMuint16 idx) { MVMuint8 *flags; MVMint16 flag; MVMRegister *static_env; MVMuint16 effective_idx = 0; MVMStaticFrame *effective_sf; if (idx < f->static_info->body.num_lexicals) { flags = f->static_info->body.static_env_flags; static_env = f->static_info->body.static_env; effective_idx = idx; effective_sf = f->static_info; } else if (f->spesh_cand) { MVMint32 i; flags = NULL; for (i = 0; i < f->spesh_cand->num_inlines; i++) { MVMStaticFrame *isf = f->spesh_cand->inlines[i].sf; effective_idx = idx - f->spesh_cand->inlines[i].lexicals_start; if (effective_idx < isf->body.num_lexicals) { flags = isf->body.static_env_flags; static_env = isf->body.static_env; effective_sf = isf; break; } } } else { flags = NULL; } flag = flags ? flags[effective_idx] : -1; if (flag != -1 && static_env[effective_idx].o == NULL) { MVMint32 scid, objid; if (MVM_bytecode_find_static_lexical_scref(tc, effective_sf->body.cu, effective_sf, effective_idx, &scid, &objid)) { MVMSerializationContext *sc = MVM_sc_get_sc(tc, effective_sf->body.cu, scid); MVMObject *resolved; if (sc == NULL) MVM_exception_throw_adhoc(tc, "SC not yet resolved; lookup failed"); MVMROOT(tc, f, { resolved = MVM_sc_get_object(tc, sc, objid); }); MVM_ASSIGN_REF(tc, &(f->static_info->common.header), f->static_info->body.static_env[effective_idx].o, resolved); } } if (flag == 0) { MVMObject *viv = static_env[effective_idx].o; if (!viv) viv = tc->instance->VMNull; MVM_ASSIGN_REF(tc, &(f->header), f->env[idx].o, viv); return viv; } else if (flag == 1) { MVMObject *viv; MVMROOT(tc, f, { viv = MVM_repr_clone(tc, static_env[effective_idx].o); MVM_ASSIGN_REF(tc, &(f->header), f->env[idx].o, viv); }); return viv; } else { return tc->instance->VMNull; } } /* Looks up the address of the lexical with the specified name and the * specified type. Non-existing object lexicals produce NULL, expected * (for better or worse) by various things. Otherwise, an error is thrown * if it does not exist. Incorrect type always throws. */ MVMRegister * MVM_frame_find_lexical_by_name(MVMThreadContext *tc, MVMString *name, MVMuint16 type) { MVMFrame *cur_frame = tc->cur_frame; while (cur_frame != NULL) { MVMLexicalRegistry *lexical_names = cur_frame->static_info->body.lexical_names; if (lexical_names) { /* Indexes were formerly stored off-by-one to avoid semi-predicate issue. */ MVMLexicalRegistry *entry; MVM_HASH_GET(tc, lexical_names, name, entry) if (entry) { if (cur_frame->static_info->body.lexical_types[entry->value] == type) { MVMRegister *result = &cur_frame->env[entry->value]; if (type == MVM_reg_obj && !result->o) MVM_frame_vivify_lexical(tc, cur_frame, entry->value); return result; } else { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Lexical with name '%s' has wrong type", c_name); } } } cur_frame = cur_frame->outer; } if (type != MVM_reg_obj) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "No lexical found with name '%s'", c_name); } return NULL; } /* Binds the specified value to the given lexical, finding it along the static * chain. */ MVM_PUBLIC void MVM_frame_bind_lexical_by_name(MVMThreadContext *tc, MVMString *name, MVMuint16 type, MVMRegister *value) { MVMFrame *cur_frame = tc->cur_frame; while (cur_frame != NULL) { MVMLexicalRegistry *lexical_names = cur_frame->static_info->body.lexical_names; if (lexical_names) { MVMLexicalRegistry *entry; MVM_HASH_GET(tc, lexical_names, name, entry) if (entry) { if (cur_frame->static_info->body.lexical_types[entry->value] == type) { if (type == MVM_reg_obj || type == MVM_reg_str) { MVM_ASSIGN_REF(tc, &(cur_frame->header), cur_frame->env[entry->value].o, value->o); } else { cur_frame->env[entry->value] = *value; } return; } else { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Lexical with name '%s' has wrong type", c_name); } } } cur_frame = cur_frame->outer; } { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "No lexical found with name '%s'", c_name); } } /* Finds a lexical in the outer frame, throwing if it's not there. */ MVMObject * MVM_frame_find_lexical_by_name_outer(MVMThreadContext *tc, MVMString *name) { MVMRegister *r = MVM_frame_find_lexical_by_name_rel(tc, name, tc->cur_frame->outer); if (r) return r->o; else { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "No lexical found with name '%s'", c_name); } } /* Looks up the address of the lexical with the specified name, starting with * the specified frame. Only works if it's an object lexical. */ MVMRegister * MVM_frame_find_lexical_by_name_rel(MVMThreadContext *tc, MVMString *name, MVMFrame *cur_frame) { while (cur_frame != NULL) { MVMLexicalRegistry *lexical_names = cur_frame->static_info->body.lexical_names; if (lexical_names) { /* Indexes were formerly stored off-by-one to avoid semi-predicate issue. */ MVMLexicalRegistry *entry; MVM_HASH_GET(tc, lexical_names, name, entry) if (entry) { if (cur_frame->static_info->body.lexical_types[entry->value] == MVM_reg_obj) { MVMRegister *result = &cur_frame->env[entry->value]; if (!result->o) MVM_frame_vivify_lexical(tc, cur_frame, entry->value); return result; } else { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Lexical with name '%s' has wrong type", c_name); } } } cur_frame = cur_frame->outer; } return NULL; } /* Looks up the address of the lexical with the specified name, starting with * the specified frame. It checks all outer frames of the caller frame chain. */ MVMRegister * MVM_frame_find_lexical_by_name_rel_caller(MVMThreadContext *tc, MVMString *name, MVMFrame *cur_caller_frame) { while (cur_caller_frame != NULL) { MVMFrame *cur_frame = cur_caller_frame; while (cur_frame != NULL) { MVMLexicalRegistry *lexical_names = cur_frame->static_info->body.lexical_names; if (lexical_names) { /* Indexes were formerly stored off-by-one to avoid semi-predicate issue. */ MVMLexicalRegistry *entry; MVM_HASH_GET(tc, lexical_names, name, entry) if (entry) { if (cur_frame->static_info->body.lexical_types[entry->value] == MVM_reg_obj) { MVMRegister *result = &cur_frame->env[entry->value]; if (!result->o) MVM_frame_vivify_lexical(tc, cur_frame, entry->value); return result; } else { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Lexical with name '%s' has wrong type", c_name); } } } cur_frame = cur_frame->outer; } cur_caller_frame = cur_caller_frame->caller; } return NULL; } /* Looks up the address of the lexical with the specified name and the * specified type. Returns null if it does not exist. */ static void try_cache_dynlex(MVMThreadContext *tc, MVMFrame *from, MVMFrame *to, MVMString *name, MVMRegister *reg, MVMuint16 type, MVMuint32 fcost, MVMuint32 icost) { #if MVM_DYNLEX_CACHE_ENABLED MVMint32 next = 0; MVMint32 frames = 0; MVMuint32 desperation = 0; if (fcost+icost > 20) desperation = 1; while (from && from != to) { frames++; if (frames >= next) { if (!from->extra || !from->extra->dynlex_cache_name || (desperation && frames > 1)) { MVMFrameExtra *e = MVM_frame_extra(tc, from); MVM_ASSIGN_REF(tc, &(from->header), e->dynlex_cache_name, name); e->dynlex_cache_reg = reg; e->dynlex_cache_type = type; if (desperation && next == 3) { next = fcost / 2; } else { if (next) return; next = 3; } } } from = from->caller; } #endif } MVMRegister * MVM_frame_find_contextual_by_name(MVMThreadContext *tc, MVMString *name, MVMuint16 *type, MVMFrame *cur_frame, MVMint32 vivify, MVMFrame **found_frame) { FILE *dlog = tc->instance->dynvar_log_fh; MVMuint32 fcost = 0; /* frames traversed */ MVMuint32 icost = 0; /* inlines traversed */ MVMuint32 ecost = 0; /* frames traversed with empty cache */ MVMuint32 xcost = 0; /* frames traversed with wrong name */ char *c_name; MVMuint64 start_time; MVMuint64 last_time; MVMFrame *initial_frame = cur_frame; if (!name) MVM_exception_throw_adhoc(tc, "Contextual name cannot be null"); if (dlog) { c_name = MVM_string_utf8_encode_C_string(tc, name); start_time = uv_hrtime(); last_time = tc->instance->dynvar_log_lasttime; } while (cur_frame != NULL) { MVMLexicalRegistry *lexical_names; MVMSpeshCandidate *cand = cur_frame->spesh_cand; MVMFrameExtra *e; /* See if we are inside an inline. Note that this isn't actually * correct for a leaf frame, but those aren't inlined and don't * use getdynlex for their own lexicals since the compiler already * knows where to find them */ if (cand && cand->num_inlines) { if (cand->jitcode) { void **labels = cand->jitcode->labels; void *return_label = cur_frame->jit_entry_label; MVMJitInline *inls = cand->jitcode->inlines; MVMint32 i; if (return_label == NULL) MVM_oops(tc, "Return label is NULL!\n"); for (i = 0; i < cand->jitcode->num_inlines; i++) { icost++; if (return_label >= labels[inls[i].start_label] && return_label <= labels[inls[i].end_label]) { MVMStaticFrame *isf = cand->inlines[i].sf; if ((lexical_names = isf->body.lexical_names)) { MVMLexicalRegistry *entry; MVM_HASH_GET(tc, lexical_names, name, entry); if (entry) { MVMuint16 lexidx = cand->inlines[i].lexicals_start + entry->value; MVMRegister *result = &cur_frame->env[lexidx]; *type = cand->lexical_types[lexidx]; if (vivify && *type == MVM_reg_obj && !result->o) { MVMROOT3(tc, cur_frame, initial_frame, name, { MVM_frame_vivify_lexical(tc, cur_frame, lexidx); }); } if (fcost+icost > 1) try_cache_dynlex(tc, initial_frame, cur_frame, name, result, *type, fcost, icost); if (dlog) { fprintf(dlog, "I %s %d %d %d %d %"PRIu64" %"PRIu64" %"PRIu64"\n", c_name, fcost, icost, ecost, xcost, last_time, start_time, uv_hrtime()); fflush(dlog); MVM_free(c_name); tc->instance->dynvar_log_lasttime = uv_hrtime(); } *found_frame = cur_frame; return result; } } } } } else { MVMint32 ret_offset = cur_frame->return_address - MVM_frame_effective_bytecode(cur_frame); MVMint32 i; for (i = 0; i < cand->num_inlines; i++) { icost++; if (ret_offset >= cand->inlines[i].start && ret_offset <= cand->inlines[i].end) { MVMStaticFrame *isf = cand->inlines[i].sf; if ((lexical_names = isf->body.lexical_names)) { MVMLexicalRegistry *entry; MVM_HASH_GET(tc, lexical_names, name, entry); if (entry) { MVMuint16 lexidx = cand->inlines[i].lexicals_start + entry->value; MVMRegister *result = &cur_frame->env[lexidx]; *type = cand->lexical_types[lexidx]; if (vivify && *type == MVM_reg_obj && !result->o) { MVMROOT3(tc, cur_frame, initial_frame, name, { MVM_frame_vivify_lexical(tc, cur_frame, lexidx); }); } if (fcost+icost > 1) try_cache_dynlex(tc, initial_frame, cur_frame, name, result, *type, fcost, icost); if (dlog) { fprintf(dlog, "I %s %d %d %d %d %"PRIu64" %"PRIu64" %"PRIu64"\n", c_name, fcost, icost, ecost, xcost, last_time, start_time, uv_hrtime()); fflush(dlog); MVM_free(c_name); tc->instance->dynvar_log_lasttime = uv_hrtime(); } *found_frame = cur_frame; return result; } } } } } } /* See if we've got it cached at this level. */ e = cur_frame->extra; if (e && e->dynlex_cache_name) { if (MVM_string_equal(tc, name, e->dynlex_cache_name)) { MVMRegister *result = e->dynlex_cache_reg; *type = e->dynlex_cache_type; if (fcost+icost > 5) try_cache_dynlex(tc, initial_frame, cur_frame, name, result, *type, fcost, icost); if (dlog) { fprintf(dlog, "C %s %d %d %d %d %"PRIu64" %"PRIu64" %"PRIu64"\n", c_name, fcost, icost, ecost, xcost, last_time, start_time, uv_hrtime()); fflush(dlog); MVM_free(c_name); tc->instance->dynvar_log_lasttime = uv_hrtime(); } *found_frame = cur_frame; return result; } else xcost++; } else ecost++; /* Now look in the frame itself. */ if ((lexical_names = cur_frame->static_info->body.lexical_names)) { MVMLexicalRegistry *entry; MVM_HASH_GET(tc, lexical_names, name, entry) if (entry) { MVMRegister *result = &cur_frame->env[entry->value]; *type = cur_frame->static_info->body.lexical_types[entry->value]; if (vivify && *type == MVM_reg_obj && !result->o) { MVMROOT3(tc, cur_frame, initial_frame, name, { MVM_frame_vivify_lexical(tc, cur_frame, entry->value); }); } if (dlog) { fprintf(dlog, "F %s %d %d %d %d %"PRIu64" %"PRIu64" %"PRIu64"\n", c_name, fcost, icost, ecost, xcost, last_time, start_time, uv_hrtime()); fflush(dlog); MVM_free(c_name); tc->instance->dynvar_log_lasttime = uv_hrtime(); } if (fcost+icost > 1) try_cache_dynlex(tc, initial_frame, cur_frame, name, result, *type, fcost, icost); *found_frame = cur_frame; return result; } } fcost++; cur_frame = cur_frame->caller; } if (dlog) { fprintf(dlog, "N %s %d %d %d %d %"PRIu64" %"PRIu64" %"PRIu64"\n", c_name, fcost, icost, ecost, xcost, last_time, start_time, uv_hrtime()); fflush(dlog); MVM_free(c_name); tc->instance->dynvar_log_lasttime = uv_hrtime(); } *found_frame = NULL; return NULL; } MVMObject * MVM_frame_getdynlex(MVMThreadContext *tc, MVMString *name, MVMFrame *cur_frame) { MVMuint16 type; MVMFrame *found_frame; MVMRegister *lex_reg = MVM_frame_find_contextual_by_name(tc, name, &type, cur_frame, 1, &found_frame); MVMObject *result = NULL, *result_type = NULL; if (lex_reg) { switch (type) { case MVM_reg_int64: result_type = (*tc->interp_cu)->body.hll_config->int_box_type; if (!result_type) MVM_exception_throw_adhoc(tc, "missing int box type"); result = REPR(result_type)->allocate(tc, STABLE(result_type)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&result); if (REPR(result)->initialize) REPR(result)->initialize(tc, STABLE(result), result, OBJECT_BODY(result)); REPR(result)->box_funcs.set_int(tc, STABLE(result), result, OBJECT_BODY(result), lex_reg->i64); MVM_gc_root_temp_pop(tc); break; case MVM_reg_num64: result_type = (*tc->interp_cu)->body.hll_config->num_box_type; if (!result_type) MVM_exception_throw_adhoc(tc, "missing num box type"); result = REPR(result_type)->allocate(tc, STABLE(result_type)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&result); if (REPR(result)->initialize) REPR(result)->initialize(tc, STABLE(result), result, OBJECT_BODY(result)); REPR(result)->box_funcs.set_num(tc, STABLE(result), result, OBJECT_BODY(result), lex_reg->n64); MVM_gc_root_temp_pop(tc); break; case MVM_reg_str: result_type = (*tc->interp_cu)->body.hll_config->str_box_type; if (!result_type) MVM_exception_throw_adhoc(tc, "missing str box type"); result = REPR(result_type)->allocate(tc, STABLE(result_type)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&result); if (REPR(result)->initialize) REPR(result)->initialize(tc, STABLE(result), result, OBJECT_BODY(result)); REPR(result)->box_funcs.set_str(tc, STABLE(result), result, OBJECT_BODY(result), lex_reg->s); MVM_gc_root_temp_pop(tc); break; case MVM_reg_obj: result = lex_reg->o; break; default: MVM_exception_throw_adhoc(tc, "invalid register type in getdynlex: %d", type); } } return result ? result : tc->instance->VMNull; } void MVM_frame_binddynlex(MVMThreadContext *tc, MVMString *name, MVMObject *value, MVMFrame *cur_frame) { MVMuint16 type; MVMFrame *found_frame; MVMRegister *lex_reg = MVM_frame_find_contextual_by_name(tc, name, &type, cur_frame, 0, &found_frame); if (!lex_reg) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "No contextual found with name '%s'", c_name); } switch (type) { case MVM_reg_int64: lex_reg->i64 = REPR(value)->box_funcs.get_int(tc, STABLE(value), value, OBJECT_BODY(value)); break; case MVM_reg_num64: lex_reg->n64 = REPR(value)->box_funcs.get_num(tc, STABLE(value), value, OBJECT_BODY(value)); break; case MVM_reg_str: MVM_ASSIGN_REF(tc, &(found_frame->header), lex_reg->s, REPR(value)->box_funcs.get_str(tc, STABLE(value), value, OBJECT_BODY(value))); break; case MVM_reg_obj: MVM_ASSIGN_REF(tc, &(found_frame->header), lex_reg->o, value); break; default: MVM_exception_throw_adhoc(tc, "invalid register type in binddynlex"); } } /* Returns the storage unit for the lexical in the specified frame. Does not * try to vivify anything - gets exactly what is there. */ MVMRegister * MVM_frame_lexical(MVMThreadContext *tc, MVMFrame *f, MVMString *name) { MVMLexicalRegistry *lexical_names = f->static_info->body.lexical_names; if (lexical_names) { MVMLexicalRegistry *entry; MVM_HASH_GET(tc, lexical_names, name, entry) if (entry) return &f->env[entry->value]; } { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Frame has no lexical with name '%s'", c_name); } } /* Returns the storage unit for the lexical in the specified frame. */ MVMRegister * MVM_frame_try_get_lexical(MVMThreadContext *tc, MVMFrame *f, MVMString *name, MVMuint16 type) { MVMLexicalRegistry *lexical_names = f->static_info->body.lexical_names; if (lexical_names) { MVMLexicalRegistry *entry; MVM_HASH_GET(tc, lexical_names, name, entry) if (entry && f->static_info->body.lexical_types[entry->value] == type) { MVMRegister *result = &f->env[entry->value]; if (type == MVM_reg_obj && !result->o) MVM_frame_vivify_lexical(tc, f, entry->value); return result; } } return NULL; } /* Returns the primitive type specification for a lexical. */ MVMuint16 MVM_frame_lexical_primspec(MVMThreadContext *tc, MVMFrame *f, MVMString *name) { MVMLexicalRegistry *lexical_names = f->static_info->body.lexical_names; if (lexical_names) { MVMLexicalRegistry *entry; MVM_HASH_GET(tc, lexical_names, name, entry) if (entry) { switch (f->static_info->body.lexical_types[entry->value]) { case MVM_reg_int64: return MVM_STORAGE_SPEC_BP_INT; case MVM_reg_num64: return MVM_STORAGE_SPEC_BP_NUM; case MVM_reg_str: return MVM_STORAGE_SPEC_BP_STR; case MVM_reg_obj: return MVM_STORAGE_SPEC_BP_NONE; default: { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Unhandled lexical type '%s' in lexprimspec for '%s'", MVM_reg_get_debug_name(tc, f->static_info->body.lexical_types[entry->value]), c_name); } } } } { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Frame has no lexical with name '%s'", c_name); } } static MVMObject * find_invokee_internal(MVMThreadContext *tc, MVMObject *code, MVMCallsite **tweak_cs, MVMInvocationSpec *is) { /* Fast path when we have an offset directly into a P6opaque. */ if (is->code_ref_offset) { if (!IS_CONCRETE(code)) MVM_exception_throw_adhoc(tc, "Can not invoke a code type object"); code = MVM_p6opaque_read_object(tc, code, is->code_ref_offset); } /* Otherwise, if there is a class handle, fall back to the slow path * lookup, but set up code_ref_offset if applicable. */ else if (!MVM_is_null(tc, is->class_handle)) { MVMRegister dest; if (!IS_CONCRETE(code)) MVM_exception_throw_adhoc(tc, "Can not invoke a code type object"); if (code->st->REPR->ID == MVM_REPR_ID_P6opaque) is->code_ref_offset = MVM_p6opaque_attr_offset(tc, code->st->WHAT, is->class_handle, is->attr_name); REPR(code)->attr_funcs.get_attribute(tc, STABLE(code), code, OBJECT_BODY(code), is->class_handle, is->attr_name, is->hint, &dest, MVM_reg_obj); code = dest.o; } /* Failing that, it must be an invocation handler. */ else { /* Need to tweak the callsite and args to include the code object * being invoked. */ if (tweak_cs) { MVMCallsite *orig = *tweak_cs; if (orig->with_invocant) { *tweak_cs = orig->with_invocant; } else { MVMCallsite *new = MVM_calloc(1, sizeof(MVMCallsite)); MVMint32 fsize = orig->flag_count; new->flag_count = fsize + 1; new->arg_flags = MVM_malloc(new->flag_count * sizeof(MVMCallsiteEntry)); new->arg_flags[0] = MVM_CALLSITE_ARG_OBJ; memcpy(new->arg_flags + 1, orig->arg_flags, fsize); new->arg_count = orig->arg_count + 1; new->num_pos = orig->num_pos + 1; new->has_flattening = orig->has_flattening; new->is_interned = 0; new->with_invocant = NULL; *tweak_cs = orig->with_invocant = new; } memmove(tc->cur_frame->args + 1, tc->cur_frame->args, orig->arg_count * sizeof(MVMRegister)); tc->cur_frame->args[0].o = code; tc->cur_frame->cur_args_callsite = *tweak_cs; /* Keep in sync. */ } else { MVM_exception_throw_adhoc(tc, "Cannot invoke object with invocation handler in this context"); } code = is->invocation_handler; } return code; } MVMObject * MVM_frame_find_invokee(MVMThreadContext *tc, MVMObject *code, MVMCallsite **tweak_cs) { if (MVM_is_null(tc, code)) MVM_exception_throw_adhoc(tc, "Cannot invoke null object"); if (STABLE(code)->invoke == MVM_6model_invoke_default) { MVMInvocationSpec *is = STABLE(code)->invocation_spec; if (!is) { MVM_exception_throw_adhoc(tc, "Cannot invoke this object (REPR: %s; %s)", REPR(code)->name, MVM_6model_get_debug_name(tc, code)); } code = find_invokee_internal(tc, code, tweak_cs, is); } return code; } MVM_USED_BY_JIT MVMObject * MVM_frame_find_invokee_multi_ok(MVMThreadContext *tc, MVMObject *code, MVMCallsite **tweak_cs, MVMRegister *args, MVMuint16 *was_multi) { if (!code) MVM_exception_throw_adhoc(tc, "Cannot invoke null object"); if (STABLE(code)->invoke == MVM_6model_invoke_default) { MVMInvocationSpec *is = STABLE(code)->invocation_spec; if (!is) { MVM_exception_throw_adhoc(tc, "Cannot invoke this object (REPR: %s; %s)", REPR(code)->name, MVM_6model_get_debug_name(tc, code)); } if (is->md_cache_offset && is->md_valid_offset) { if (!IS_CONCRETE(code)) MVM_exception_throw_adhoc(tc, "Can not invoke a code type object"); if (MVM_p6opaque_read_int64(tc, code, is->md_valid_offset)) { MVMObject *md_cache = MVM_p6opaque_read_object(tc, code, is->md_cache_offset); if (was_multi) *was_multi = 1; if (!MVM_is_null(tc, md_cache)) { MVMObject *result = MVM_multi_cache_find_callsite_args(tc, md_cache, *tweak_cs, args); if (result) return MVM_frame_find_invokee(tc, result, tweak_cs); } } } else if (!MVM_is_null(tc, is->md_class_handle)) { /* We might be able to dig straight into the multi cache and not * have to invoke the proto. Also on this path set up the offsets * so we can be faster in the future. */ MVMRegister dest; if (!IS_CONCRETE(code)) MVM_exception_throw_adhoc(tc, "Can not invoke a code type object"); if (code->st->REPR->ID == MVM_REPR_ID_P6opaque) { is->md_valid_offset = MVM_p6opaque_attr_offset(tc, code->st->WHAT, is->md_class_handle, is->md_valid_attr_name); is->md_cache_offset = MVM_p6opaque_attr_offset(tc, code->st->WHAT, is->md_class_handle, is->md_cache_attr_name); } REPR(code)->attr_funcs.get_attribute(tc, STABLE(code), code, OBJECT_BODY(code), is->md_class_handle, is->md_valid_attr_name, is->md_valid_hint, &dest, MVM_reg_int64); if (dest.i64) { if (was_multi) *was_multi = 1; REPR(code)->attr_funcs.get_attribute(tc, STABLE(code), code, OBJECT_BODY(code), is->md_class_handle, is->md_cache_attr_name, is->md_cache_hint, &dest, MVM_reg_obj); if (!MVM_is_null(tc, dest.o)) { MVMObject *result = MVM_multi_cache_find_callsite_args(tc, dest.o, *tweak_cs, args); if (result) return MVM_frame_find_invokee(tc, result, tweak_cs); } } } code = find_invokee_internal(tc, code, tweak_cs, is); } return code; } /* Rapid resolution of an invokee. Used by the specialized resolve code op. */ MVMObject * MVM_frame_resolve_invokee_spesh(MVMThreadContext *tc, MVMObject *invokee) { if (REPR(invokee)->ID == MVM_REPR_ID_MVMCode) { return invokee; } else { MVMInvocationSpec *is = STABLE(invokee)->invocation_spec; if (is && is->code_ref_offset && IS_CONCRETE(invokee)) return MVM_p6opaque_read_object(tc, invokee, is->code_ref_offset); } return tc->instance->VMNull; } /* Creates a MVMContent wrapper object around an MVMFrame. */ MVMObject * MVM_frame_context_wrapper(MVMThreadContext *tc, MVMFrame *f) { MVMObject *ctx; f = MVM_frame_force_to_heap(tc, f); MVMROOT(tc, f, { ctx = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTContext); MVM_ASSIGN_REF(tc, &(ctx->header), ((MVMContext *)ctx)->body.context, f); }); return ctx; } /* Gets, allocating if needed, the frame extra data structure for the given * frame. This is used to hold data that only a handful of frames need. */ MVMFrameExtra * MVM_frame_extra(MVMThreadContext *tc, MVMFrame *f) { if (!f->extra) f->extra = MVM_fixed_size_alloc_zeroed(tc, tc->instance->fsa, sizeof(MVMFrameExtra)); return f->extra; } /* Set up special return data on a frame. */ void MVM_frame_special_return(MVMThreadContext *tc, MVMFrame *f, MVMSpecialReturn special_return, MVMSpecialReturn special_unwind, void *special_return_data, MVMSpecialReturnDataMark mark_special_return_data) { MVMFrameExtra *e = MVM_frame_extra(tc, f); e->special_return = special_return; e->special_unwind = special_unwind; e->special_return_data = special_return_data; e->mark_special_return_data = mark_special_return_data; } /* Clears any special return data on a frame. */ void MVM_frame_clear_special_return(MVMThreadContext *tc, MVMFrame *f) { if (f->extra) { f->extra->special_return = NULL; f->extra->special_unwind = NULL; f->extra->special_return_data = NULL; f->extra->mark_special_return_data = NULL; } } MoarVM-2018.03/src/core/frame.h0000644000175000017510000002515513252357700016201 0ustar samanthasamantha/* Frame flags; provide some HLLs can alias. */ #define MVM_FRAME_FLAG_STATE_INIT 1 << 0 #define MVM_FRAME_FLAG_EXIT_HAND_RUN 1 << 1 #define MVM_FRAME_FLAG_HLL_1 1 << 3 #define MVM_FRAME_FLAG_HLL_2 1 << 4 #define MVM_FRAME_FLAG_HLL_3 1 << 5 #define MVM_FRAME_FLAG_HLL_4 1 << 6 /* Lexical hash entry for ->lexical_names on a frame. */ struct MVMLexicalRegistry { /* key string */ MVMString *key; /* index of the lexical entry. */ MVMuint32 value; /* the uthash hash handle inline struct. */ UT_hash_handle hash_handle; }; /* Entry in the linked list of continuation tags for the frame. */ struct MVMContinuationTag { /* The tag itself. */ MVMObject *tag; /* The active exception handler at the point the tag was taken. */ MVMActiveHandler *active_handlers; /* The next continuation tag entry. */ MVMContinuationTag *next; }; /* Function pointer type of special return handler. These are used to allow * return to be intercepted in some way, for things that need to do multiple * calls into the runloop in some C-managed process. Essentially, instead of * nested runloops, you just re-work the C code in question into CPS. */ typedef void (* MVMSpecialReturn)(MVMThreadContext *tc, void *data); /* Function pointer for marking the special return handler data. */ typedef void (* MVMSpecialReturnDataMark)(MVMThreadContext *tc, MVMFrame *frame, MVMGCWorklist *worklist); /* This represents an call frame, aka invocation record. It may exist either on * the heap, in which case its header will have the MVM_CF_FRAME flag set, or * in on a thread-local stack, in which case the collectable header will be * fully zeroed. */ struct MVMFrame { /* Commonalities that all collectable entities have. */ MVMCollectable header; /* The environment for this frame, which lives beyond its execution. * Has space for, for instance, lexicals. */ MVMRegister *env; /* The temporary work space for this frame. After a call is over, this * can be freed up. Must be NULLed out when this happens. */ MVMRegister *work; /* The args buffer. Actually a pointer into an area inside of *work, to * decrease number of allocations. */ MVMRegister *args; /* Callsite that indicates how the current args buffer is being used, if * it is. */ MVMCallsite *cur_args_callsite; /* The outer frame, thus forming the static chain. */ MVMFrame *outer; /* The caller frame, thus forming the dynamic chain. */ MVMFrame *caller; /* The static frame information. Holds all we statically know about * this kind of frame, including information needed to GC-trace it. */ MVMStaticFrame *static_info; /* The code ref object for this frame. */ MVMObject *code_ref; /* Parameters received by this frame. */ MVMArgProcContext params; /* Effective set of spesh slots, if any. */ MVMCollectable **effective_spesh_slots; /* The spesh candidate information, if we're in one. */ MVMSpeshCandidate *spesh_cand; /* Address of the next op to execute if we return to this frame. */ MVMuint8 *return_address; /* The register we should store the return value in, if any. */ MVMRegister *return_value; /* The type of return value that is expected. */ MVMReturnType return_type; /* Assorted frame flags. */ MVMuint8 flags; /* The allocated work/env sizes. */ MVMuint16 allocd_work; MVMuint16 allocd_env; /* The current spesh correlation ID, if we're interpreting code and * recording logs. Zero if interpreting unspecialized and not recording. * Junk if running specialized code. */ MVMint32 spesh_correlation_id; /* A sequence number to indicate our place in the call stack */ MVMint32 sequence_nr; /* The 'entry label' is a sort of indirect return address for the JIT */ void * jit_entry_label; /* Extra data that some frames need, allocated on demand. If allocated, * lives for the dynamic scope of the frame. */ MVMFrameExtra *extra; }; /* Extra data that a handful of call frames optionally need. It is needed * only while the frame is in dynamic scope; after that it can go away. */ struct MVMFrameExtra { /* If we want to invoke a special handler upon a return to this * frame, this function pointer is set. */ MVMSpecialReturn special_return; /* If we want to invoke a special handler upon unwinding past a * frame, this function pointer is set. */ MVMSpecialReturn special_unwind; /* Data slot for the special return handler function. */ void *special_return_data; /* Flag for if special_return_data need to be GC marked. */ MVMSpecialReturnDataMark mark_special_return_data; /* Linked list of any continuation tags we have. */ MVMContinuationTag *continuation_tags; /* If we were invoked with a call capture, that call capture, so we can * keep its callsite alive. */ MVMObject *invoked_call_capture; /* Cache for dynlex lookup; if the name is non-null, the cache is valid * and the register can be accessed directly to find the contextual. */ MVMString *dynlex_cache_name; MVMRegister *dynlex_cache_reg; MVMuint16 dynlex_cache_type; }; /* How do we invoke this thing? Specifies either an attribute to look at for * an invokable thing, a method to call, and maybe a multi-dispatch cache to * look in first for an answer. */ struct MVMInvocationSpec { /* Offsets for fast access; placed first as they are what will be most * often needed. */ size_t code_ref_offset; size_t md_cache_offset; size_t md_valid_offset; /* Function that handles invocation, if any. */ MVMObject *invocation_handler; /* Class handle, name and hint for attribute holding code to invoke. */ MVMObject *class_handle; MVMString *attr_name; MVMint64 hint; /* Multi-dispatch info class handle, and name/hint of attribute that * holds the cache itself and a flag to check if it's allowed to * consider the cache. */ MVMObject *md_class_handle; MVMString *md_cache_attr_name; MVMint64 md_cache_hint; MVMint64 md_valid_hint; MVMString *md_valid_attr_name; }; /* Checks if a frame is allocated on a call stack or on the heap. If it is on * the call stack, then it will have zeroed flags (since heap-allocated frames * always have the "I'm a heap frame" bit set). */ MVM_STATIC_INLINE MVMuint32 MVM_FRAME_IS_ON_CALLSTACK(MVMThreadContext *tc, MVMFrame *frame) { return frame->header.flags == 0; } /* Forces a frame to the callstack if needed. Done as a static inline to make * the quite common case where nothing is needed cheaper. */ MVM_PUBLIC MVMFrame * MVM_frame_move_to_heap(MVMThreadContext *tc, MVMFrame *frame); MVM_STATIC_INLINE MVMFrame * MVM_frame_force_to_heap(MVMThreadContext *tc, MVMFrame *frame) { return MVM_FRAME_IS_ON_CALLSTACK(tc, frame) ? MVM_frame_move_to_heap(tc, frame) : frame; } MVMFrame * MVM_frame_debugserver_move_to_heap(MVMThreadContext *tc, MVMThreadContext *owner, MVMFrame *frame); MVMRegister * MVM_frame_initial_work(MVMThreadContext *tc, MVMuint16 *local_types, MVMuint16 num_locals); void MVM_frame_invoke_code(MVMThreadContext *tc, MVMCode *code, MVMCallsite *callsite, MVMint32 spesh_cand); void MVM_frame_invoke(MVMThreadContext *tc, MVMStaticFrame *static_frame, MVMCallsite *callsite, MVMRegister *args, MVMFrame *outer, MVMObject *code_ref, MVMint32 spesh_cand); MVMFrame * MVM_frame_create_context_only(MVMThreadContext *tc, MVMStaticFrame *static_frame, MVMObject *code_ref); MVMFrame * MVM_frame_create_for_deopt(MVMThreadContext *tc, MVMStaticFrame *static_frame, MVMCode *code_ref); MVM_PUBLIC MVMuint64 MVM_frame_try_return(MVMThreadContext *tc); MVM_PUBLIC MVMuint64 MVM_frame_try_return_no_exit_handlers(MVMThreadContext *tc); void MVM_frame_unwind_to(MVMThreadContext *tc, MVMFrame *frame, MVMuint8 *abs_addr, MVMuint32 rel_addr, MVMObject *return_value); MVM_PUBLIC void MVM_frame_destroy(MVMThreadContext *tc, MVMFrame *frame); MVM_PUBLIC MVMObject * MVM_frame_get_code_object(MVMThreadContext *tc, MVMCode *code); MVM_PUBLIC void MVM_frame_capturelex(MVMThreadContext *tc, MVMObject *code); MVM_PUBLIC void MVM_frame_capture_inner(MVMThreadContext *tc, MVMObject *code); MVM_PUBLIC MVMObject * MVM_frame_takeclosure(MVMThreadContext *tc, MVMObject *code); MVM_PUBLIC MVMObject * MVM_frame_vivify_lexical(MVMThreadContext *tc, MVMFrame *f, MVMuint16 idx); MVM_PUBLIC MVMRegister * MVM_frame_find_lexical_by_name(MVMThreadContext *tc, MVMString *name, MVMuint16 type); MVM_PUBLIC void MVM_frame_bind_lexical_by_name(MVMThreadContext *tc, MVMString *name, MVMuint16 type, MVMRegister *value); MVMObject * MVM_frame_find_lexical_by_name_outer(MVMThreadContext *tc, MVMString *name); MVM_PUBLIC MVMRegister * MVM_frame_find_lexical_by_name_rel(MVMThreadContext *tc, MVMString *name, MVMFrame *cur_frame); MVM_PUBLIC MVMRegister * MVM_frame_find_lexical_by_name_rel_caller(MVMThreadContext *tc, MVMString *name, MVMFrame *cur_caller_frame); MVMRegister * MVM_frame_find_contextual_by_name(MVMThreadContext *tc, MVMString *name, MVMuint16 *type, MVMFrame *cur_frame, MVMint32 vivify, MVMFrame **found_frame); MVMObject * MVM_frame_getdynlex(MVMThreadContext *tc, MVMString *name, MVMFrame *cur_frame); void MVM_frame_binddynlex(MVMThreadContext *tc, MVMString *name, MVMObject *value, MVMFrame *cur_frame); MVMRegister * MVM_frame_lexical(MVMThreadContext *tc, MVMFrame *f, MVMString *name); MVM_PUBLIC MVMRegister * MVM_frame_try_get_lexical(MVMThreadContext *tc, MVMFrame *f, MVMString *name, MVMuint16 type); MVMuint16 MVM_frame_lexical_primspec(MVMThreadContext *tc, MVMFrame *f, MVMString *name); MVM_PUBLIC MVMObject * MVM_frame_find_invokee(MVMThreadContext *tc, MVMObject *code, MVMCallsite **tweak_cs); MVMObject * MVM_frame_find_invokee_multi_ok(MVMThreadContext *tc, MVMObject *code, MVMCallsite **tweak_cs, MVMRegister *args, MVMuint16 *was_multi); MVMObject * MVM_frame_resolve_invokee_spesh(MVMThreadContext *tc, MVMObject *invokee); MVM_PUBLIC MVMObject * MVM_frame_context_wrapper(MVMThreadContext *tc, MVMFrame *f); MVMFrameExtra * MVM_frame_extra(MVMThreadContext *tc, MVMFrame *f); MVM_PUBLIC void MVM_frame_special_return(MVMThreadContext *tc, MVMFrame *f, MVMSpecialReturn special_return, MVMSpecialReturn special_unwind, void *special_return_data, MVMSpecialReturnDataMark mark_special_return_data); MVM_PUBLIC void MVM_frame_clear_special_return(MVMThreadContext *tc, MVMFrame *f); MoarVM-2018.03/src/core/hll.c0000644000175000017510000003571613242626641015667 0ustar samanthasamantha#include "moar.h" MVMHLLConfig *MVM_hll_get_config_for(MVMThreadContext *tc, MVMString *name) { MVMHLLConfig *entry; uv_mutex_lock(&tc->instance->mutex_hllconfigs); if (tc->instance->hll_compilee_depth) { MVM_HASH_GET(tc, tc->instance->compilee_hll_configs, name, entry); } else { MVM_HASH_GET(tc, tc->instance->compiler_hll_configs, name, entry); } if (!entry) { entry = MVM_calloc(1, sizeof(MVMHLLConfig)); entry->name = name; entry->int_box_type = tc->instance->boot_types.BOOTInt; entry->num_box_type = tc->instance->boot_types.BOOTNum; entry->str_box_type = tc->instance->boot_types.BOOTStr; entry->slurpy_array_type = tc->instance->boot_types.BOOTArray; entry->slurpy_hash_type = tc->instance->boot_types.BOOTHash; entry->array_iterator_type = tc->instance->boot_types.BOOTIter; entry->hash_iterator_type = tc->instance->boot_types.BOOTIter; entry->foreign_type_int = tc->instance->boot_types.BOOTInt; entry->foreign_type_num = tc->instance->boot_types.BOOTNum; entry->foreign_type_str = tc->instance->boot_types.BOOTStr; if (tc->instance->hll_compilee_depth) { MVM_HASH_BIND(tc, tc->instance->compilee_hll_configs, name, entry); } else { MVM_HASH_BIND(tc, tc->instance->compiler_hll_configs, name, entry); } MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->int_box_type, "HLL int_box_type"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->num_box_type, "HLL num_box_type"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->str_box_type, "HLL str_box_type"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->slurpy_array_type, "HLL slurpy_array_type"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->slurpy_hash_type, "HLL slurpy_hash_type"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->array_iterator_type, "HLL array_iterator_type"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->hash_iterator_type, "HLL hash_iterator_type"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->foreign_type_int, "HLL foreign_type_int"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->foreign_type_num, "HLL foreign_type_num"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->foreign_type_str, "HLL foreign_type_str"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->foreign_transform_array, "HLL foreign_transform_array"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->foreign_transform_hash, "HLL foreign_transform_hash"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->foreign_transform_code, "HLL foreign_transform_code"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->null_value, "HLL null_value"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->exit_handler, "HLL exit_handler"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->finalize_handler, "HLL finalize_handler"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->bind_error, "HLL bind_error"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->method_not_found_error, "HLL method_not_found_error"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->lexical_handler_not_found_error, "HLL lexical_handler_not_found_error"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->int_lex_ref, "HLL int_lex_ref"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->num_lex_ref, "HLL num_lex_ref"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->str_lex_ref, "HLL str_lex_ref"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->int_attr_ref, "HLL int_attr_ref"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->num_attr_ref, "HLL num_attr_ref"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->str_attr_ref, "HLL str_attr_ref"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->int_pos_ref, "HLL int_pos_ref"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->num_pos_ref, "HLL num_pos_ref"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->str_pos_ref, "HLL str_pos_ref"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->int_multidim_ref, "HLL int_multidim_ref"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->num_multidim_ref, "HLL num_multidim_ref"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->str_multidim_ref, "HLL str_multidim_ref"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->name, "HLL name"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&entry->hash_handle.key, "HLL hash key"); } uv_mutex_unlock(&tc->instance->mutex_hllconfigs); return entry; } #define check_config_key(tc, hash, name, member, config) do { \ MVMString *key = MVM_string_utf8_decode((tc), (tc)->instance->VMString, (name), strlen((name))); \ MVMObject *val = MVM_repr_at_key_o((tc), (hash), key); \ if (!MVM_is_null(tc, val)) (config)->member = val; \ } while (0) #define check_config_key_reftype(tc, hash, name, member, config, wantprim, wantkind) do { \ MVMString *key = MVM_string_utf8_decode((tc), (tc)->instance->VMString, (name), strlen((name))); \ MVMObject *val = MVM_repr_at_key_o((tc), (hash), key); \ if (!MVM_is_null(tc, val)) { \ MVM_nativeref_ensure(tc, val, wantprim, wantkind, name); \ (config)->member = val; \ }\ } while (0) MVMObject * MVM_hll_set_config(MVMThreadContext *tc, MVMString *name, MVMObject *config_hash) { MVMHLLConfig *config; config = MVM_hll_get_config_for(tc, name); if (!config_hash || REPR(config_hash)->ID != MVM_REPR_ID_MVMHash || !IS_CONCRETE(config_hash)) { MVM_exception_throw_adhoc(tc, "set hll config needs concrete hash"); } /* MVM_string_utf8_decode() can potentially allocate, and hence gc. */ MVMROOT(tc, config_hash, { check_config_key(tc, config_hash, "int_box", int_box_type, config); check_config_key(tc, config_hash, "num_box", num_box_type, config); check_config_key(tc, config_hash, "str_box", str_box_type, config); check_config_key(tc, config_hash, "slurpy_array", slurpy_array_type, config); check_config_key(tc, config_hash, "slurpy_hash", slurpy_hash_type, config); check_config_key(tc, config_hash, "array_iter", array_iterator_type, config); check_config_key(tc, config_hash, "hash_iter", hash_iterator_type, config); check_config_key(tc, config_hash, "foreign_type_int", foreign_type_int, config); check_config_key(tc, config_hash, "foreign_type_num", foreign_type_num, config); check_config_key(tc, config_hash, "foreign_type_str", foreign_type_str, config); check_config_key(tc, config_hash, "foreign_transform_array", foreign_transform_array, config); check_config_key(tc, config_hash, "foreign_transform_hash", foreign_transform_hash, config); check_config_key(tc, config_hash, "foreign_transform_code", foreign_transform_code, config); check_config_key(tc, config_hash, "null_value", null_value, config); check_config_key(tc, config_hash, "exit_handler", exit_handler, config); check_config_key(tc, config_hash, "finalize_handler", finalize_handler, config); check_config_key(tc, config_hash, "bind_error", bind_error, config); check_config_key(tc, config_hash, "method_not_found_error", method_not_found_error, config); check_config_key(tc, config_hash, "lexical_handler_not_found_error", lexical_handler_not_found_error, config); check_config_key_reftype(tc, config_hash, "int_lex_ref", int_lex_ref, config, MVM_STORAGE_SPEC_BP_INT, MVM_NATIVEREF_LEX); check_config_key_reftype(tc, config_hash, "num_lex_ref", num_lex_ref, config, MVM_STORAGE_SPEC_BP_NUM, MVM_NATIVEREF_LEX); check_config_key_reftype(tc, config_hash, "str_lex_ref", str_lex_ref, config, MVM_STORAGE_SPEC_BP_STR, MVM_NATIVEREF_LEX); check_config_key_reftype(tc, config_hash, "int_attr_ref", int_attr_ref, config, MVM_STORAGE_SPEC_BP_INT, MVM_NATIVEREF_ATTRIBUTE); check_config_key_reftype(tc, config_hash, "num_attr_ref", num_attr_ref, config, MVM_STORAGE_SPEC_BP_NUM, MVM_NATIVEREF_ATTRIBUTE); check_config_key_reftype(tc, config_hash, "str_attr_ref", str_attr_ref, config, MVM_STORAGE_SPEC_BP_STR, MVM_NATIVEREF_ATTRIBUTE); check_config_key_reftype(tc, config_hash, "int_pos_ref", int_pos_ref, config, MVM_STORAGE_SPEC_BP_INT, MVM_NATIVEREF_POSITIONAL); check_config_key_reftype(tc, config_hash, "num_pos_ref", num_pos_ref, config, MVM_STORAGE_SPEC_BP_NUM, MVM_NATIVEREF_POSITIONAL); check_config_key_reftype(tc, config_hash, "str_pos_ref", str_pos_ref, config, MVM_STORAGE_SPEC_BP_STR, MVM_NATIVEREF_POSITIONAL); check_config_key_reftype(tc, config_hash, "int_multidim_ref", int_multidim_ref, config, MVM_STORAGE_SPEC_BP_INT, MVM_NATIVEREF_MULTIDIM); check_config_key_reftype(tc, config_hash, "num_multidim_ref", num_multidim_ref, config, MVM_STORAGE_SPEC_BP_NUM, MVM_NATIVEREF_MULTIDIM); check_config_key_reftype(tc, config_hash, "str_multidim_ref", str_multidim_ref, config, MVM_STORAGE_SPEC_BP_STR, MVM_NATIVEREF_MULTIDIM); }); MVM_intcache_for(tc, config->int_box_type); return config_hash; } /* Gets the current HLL configuration. */ MVMHLLConfig *MVM_hll_current(MVMThreadContext *tc) { return (*tc->interp_cu)->body.hll_config; } /* Enter a level of compilee HLL configuration mode. */ void MVM_hll_enter_compilee_mode(MVMThreadContext *tc) { uv_mutex_lock(&tc->instance->mutex_hllconfigs); tc->instance->hll_compilee_depth++; uv_mutex_unlock(&tc->instance->mutex_hllconfigs); } /* Leave a level of compilee HLL configuration mode. */ void MVM_hll_leave_compilee_mode(MVMThreadContext *tc) { uv_mutex_lock(&tc->instance->mutex_hllconfigs); tc->instance->hll_compilee_depth--; uv_mutex_unlock(&tc->instance->mutex_hllconfigs); } /* Checks if an object belongs to the correct HLL, and does a type mapping * of it if not. */ void MVM_hll_map(MVMThreadContext *tc, MVMObject *obj, MVMHLLConfig *hll, MVMRegister *res_reg) { /* Null objects get mapped to null_value. */ if (MVM_is_null(tc, obj)) { res_reg->o = hll->null_value; } /* If the object belongs to the current HLL, we're done. */ else if (STABLE(obj)->hll_owner == hll) { res_reg->o = obj; } /* Otherwise, need to try a mapping. */ else { switch (STABLE(obj)->hll_role) { case MVM_HLL_ROLE_INT: if (hll->foreign_type_int) res_reg->o = IS_CONCRETE(obj) ? MVM_repr_box_int(tc, hll->foreign_type_int, MVM_repr_get_int(tc, obj)) : hll->foreign_type_int; else res_reg->o = obj; break; case MVM_HLL_ROLE_NUM: if (hll->foreign_type_num) res_reg->o = IS_CONCRETE(obj) ? MVM_repr_box_num(tc, hll->foreign_type_num, MVM_repr_get_num(tc, obj)) : hll->foreign_type_num; else res_reg->o = obj; break; case MVM_HLL_ROLE_STR: if (hll->foreign_type_str) res_reg->o = IS_CONCRETE(obj) ? MVM_repr_box_str(tc, hll->foreign_type_str, MVM_repr_get_str(tc, obj)) : hll->foreign_type_str; else res_reg->o = obj; break; case MVM_HLL_ROLE_ARRAY: if (hll->foreign_transform_array) { /* Invoke and set result register as return location. */ MVMObject *code = MVM_frame_find_invokee(tc, hll->foreign_transform_array, NULL); MVMCallsite *inv_arg_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_INV_ARG); MVM_args_setup_thunk(tc, res_reg, MVM_RETURN_OBJ, inv_arg_callsite); tc->cur_frame->args[0].o = obj; STABLE(code)->invoke(tc, code, inv_arg_callsite, tc->cur_frame->args); } else { res_reg->o = obj; } break; case MVM_HLL_ROLE_HASH: if (hll->foreign_transform_hash) { /* Invoke and set result register as return location. */ MVMObject *code = MVM_frame_find_invokee(tc, hll->foreign_transform_hash, NULL); MVMCallsite *inv_arg_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_INV_ARG); MVM_args_setup_thunk(tc, res_reg, MVM_RETURN_OBJ, inv_arg_callsite); tc->cur_frame->args[0].o = obj; STABLE(code)->invoke(tc, code, inv_arg_callsite, tc->cur_frame->args); } else { res_reg->o = obj; } break; case MVM_HLL_ROLE_CODE: if (hll->foreign_transform_code) { /* Invoke and set result register as return location. */ MVMObject *code = MVM_frame_find_invokee(tc, hll->foreign_transform_code, NULL); MVMCallsite *inv_arg_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_INV_ARG); MVM_args_setup_thunk(tc, res_reg, MVM_RETURN_OBJ, inv_arg_callsite); tc->cur_frame->args[0].o = obj; STABLE(code)->invoke(tc, code, inv_arg_callsite, tc->cur_frame->args); } else { res_reg->o = obj; } break; default: res_reg->o = obj; } } } /* Looks up an object in the HLL symbols stash. */ MVMObject * MVM_hll_sym_get(MVMThreadContext *tc, MVMString *hll, MVMString *sym) { MVMObject *syms = tc->instance->hll_syms, *hash, *result; uv_mutex_lock(&tc->instance->mutex_hll_syms); hash = MVM_repr_at_key_o(tc, syms, hll); if (MVM_is_null(tc, hash)) { MVMROOT2(tc, hll, syms, { hash = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTHash); }); MVM_repr_bind_key_o(tc, syms, hll, hash); result = tc->instance->VMNull; } else { result = MVM_repr_at_key_o(tc, hash, sym); } uv_mutex_unlock(&tc->instance->mutex_hll_syms); return result; } MoarVM-2018.03/src/core/hll.h0000644000175000017510000000515513237701240015657 0ustar samanthasamantha/* The configuration for a particular High Level Language. Of note, this * indicates the types to use in various situations. */ struct MVMHLLConfig { /* The types the language wishes to get things boxed as. */ MVMObject *int_box_type; MVMObject *num_box_type; MVMObject *str_box_type; /* The type to use for slurpy arrays. */ MVMObject *slurpy_array_type; /* The type to use for slurpy hashes. */ MVMObject *slurpy_hash_type; /* The type to use for array iteration (should have VMIter REPR). */ MVMObject *array_iterator_type; /* The type to use for hash iteration (should have VMIter REPR). */ MVMObject *hash_iterator_type; /* HLL mapping types for cross-HLL boundary for int/num/str. */ MVMObject *foreign_type_int; MVMObject *foreign_type_num; MVMObject *foreign_type_str; /* HLL mapping transforms for array/hash/code. */ MVMObject *foreign_transform_array; MVMObject *foreign_transform_hash; MVMObject *foreign_transform_code; /* The value to substitute for null. */ MVMObject *null_value; /* Language's handler to run at a block's exit time, if needed. */ MVMObject *exit_handler; /* Language's object finalize handler, which can take a list of objects * which need to have a finalizer run. */ MVMObject *finalize_handler; /* Language's handler for various errors, if needed. */ MVMObject *bind_error; MVMObject *method_not_found_error; MVMObject *lexical_handler_not_found_error; /* Native reference types. */ MVMObject *int_lex_ref; MVMObject *num_lex_ref; MVMObject *str_lex_ref; MVMObject *int_attr_ref; MVMObject *num_attr_ref; MVMObject *str_attr_ref; MVMObject *int_pos_ref; MVMObject *num_pos_ref; MVMObject *str_pos_ref; MVMObject *int_multidim_ref; MVMObject *num_multidim_ref; MVMObject *str_multidim_ref; /* Array of types to pass to compiler.c */ MVMObject *mast_types; /* HLL name. */ MVMString *name; /* Inline handle to the hash in which this is stored. */ UT_hash_handle hash_handle; }; MVMHLLConfig * MVM_hll_get_config_for(MVMThreadContext *tc, MVMString *name); MVMObject * MVM_hll_set_config(MVMThreadContext *tc, MVMString *name, MVMObject *config_hash); MVM_PUBLIC MVMHLLConfig * MVM_hll_current(MVMThreadContext *tc); void MVM_hll_enter_compilee_mode(MVMThreadContext *tc); void MVM_hll_leave_compilee_mode(MVMThreadContext *tc); void MVM_hll_map(MVMThreadContext *tc, MVMObject *obj, MVMHLLConfig *hll, MVMRegister *res_reg); MVM_PUBLIC MVMObject * MVM_hll_sym_get(MVMThreadContext *tc, MVMString *hll, MVMString *sym); MoarVM-2018.03/src/core/instance.h0000644000175000017510000004170713252330426016710 0ustar samanthasamantha/* The various "bootstrap" types, based straight off of some core * representations. They are used during the 6model bootstrap. */ struct MVMBootTypes { MVMObject *BOOTInt; MVMObject *BOOTNum; MVMObject *BOOTStr; MVMObject *BOOTArray; MVMObject *BOOTHash; MVMObject *BOOTCCode; MVMObject *BOOTCode; MVMObject *BOOTThread; MVMObject *BOOTIter; MVMObject *BOOTContext; MVMObject *BOOTIntArray; MVMObject *BOOTNumArray; MVMObject *BOOTStrArray; MVMObject *BOOTIO; MVMObject *BOOTException; MVMObject *BOOTStaticFrame; MVMObject *BOOTCompUnit; MVMObject *BOOTMultiCache; MVMObject *BOOTContinuation; MVMObject *BOOTQueue; MVMObject *BOOTAsync; MVMObject *BOOTReentrantMutex; }; /* Various raw types that don't need a HOW */ typedef struct { MVMObject *RawDLLSym; } MVMRawTypes; /* Various common string constants. */ struct MVMStringConsts { MVMString *empty; MVMString *Str; MVMString *Num; MVMString *integer; MVMString *float_str; MVMString *bits; MVMString *unsigned_str; MVMString *find_method; MVMString *type_check; MVMString *accepts_type; MVMString *name; MVMString *attribute; MVMString *of; MVMString *rw; MVMString *type; MVMString *typeobj; MVMString *free_str; MVMString *callback_args; MVMString *encoding; MVMString *inlined; MVMString *repr; MVMString *anon; MVMString *P6opaque; MVMString *array; MVMString *box_target; MVMString *positional_delegate; MVMString *associative_delegate; MVMString *auto_viv_container; MVMString *done; MVMString *error; MVMString *stdout_bytes; MVMString *stderr_bytes; MVMString *merge_bytes; MVMString *buf_type; MVMString *write; MVMString *stdin_fd; MVMString *stdout_fd; MVMString *stderr_fd; MVMString *nativeref; MVMString *refkind; MVMString *positional; MVMString *lexical; MVMString *dimensions; MVMString *ready; MVMString *multidim; MVMString *entry_point; MVMString *kind; MVMString *instrumented; MVMString *heap; MVMString *translate_newlines; MVMString *platform_newline; MVMString *path; MVMString *config; MVMString *replacement; }; /* An entry in the representations registry. */ struct MVMReprRegistry { /* name of the REPR */ MVMString *name; /* the REPR vtable */ const MVMREPROps *repr; /* the uthash hash handle inline struct. */ UT_hash_handle hash_handle; }; /* An entry in the persistent object IDs hash, used to give still-movable * objects a lifetime-unique ID. */ struct MVMObjectId { /* The current object address. */ MVMObject *current; /* Then gen2 address that forms the persistent ID, and where we'll move * the object to if it lives long enough. */ MVMCollectable *gen2_addr; /* Hash handle. */ UT_hash_handle hash_handle; }; /* Represents a MoarVM instance. */ struct MVMInstance { /************************************************************************ * Threads ************************************************************************/ /* The main thread. */ MVMThreadContext *main_thread; /* The ID to allocate the next-created thread. */ AO_t next_user_thread_id; /* MVMThreads completed starting, running, and/or exited. Modifications * and walks that need an accurate picture of it protected by mutex. */ MVMThread *threads; uv_mutex_t mutex_threads; /************************************************************************ * Garbage collection and memory management ************************************************************************/ /* Number of permanent GC roots we've got, allocated space for, and * a list of the addresses to them. The mutex controls writing to the * list, just in case multiple threads somehow end up doing so. Note * that during a GC the world is stopped so reading is safe. We also * keep a list of names for these, for the purpose of heap debugging * and heap profiling. */ MVMuint32 num_permroots; MVMuint32 alloc_permroots; MVMCollectable ***permroots; char **permroot_descriptions; uv_mutex_t mutex_permroots; /* The current GC run sequence number. May wrap around over time; that * is fine since only equality ever matters. */ AO_t gc_seq_number; /* Mutex used to protect GC orchestration state, and held to wait on or * signal condition variable changes. */ uv_mutex_t mutex_gc_orchestrate; /* The number of threads that vote for starting GC, and condition variable * for when it changes. */ AO_t gc_start; uv_cond_t cond_gc_start; /* The number of threads that still need to vote for considering GC done, * and condition variable for when it changes. */ AO_t gc_finish; uv_cond_t cond_gc_finish; /* Whether the coordinator considers all in-trays clear, and condition * variable for when it changes. */ AO_t gc_intrays_clearing; uv_cond_t cond_gc_intrays_clearing; /* Condition variable for threads that were marked blocked for GC, but * that wake up while GC is still running. It's not possible for them to * join in, but this lets them wait efficieintly. */ uv_cond_t cond_blocked_can_continue; /* The number of threads that have yet to acknowledge the finish. */ AO_t gc_ack; /* Linked list (via forwarder) of STables to free. */ MVMSTable *stables_to_free; /* Whether the current GC run is a full collection. */ MVMuint32 gc_full_collect; /* Are we in GC? Set by the coordinator at entry/exit of GC, and used by * native callback handling to decide if it should wait before trying to * lookup the current thread as the thread list may move under it. */ MVMuint32 in_gc; /* How many bytes of data have we promoted from the nursery to gen2 * since we last did a full collection? */ AO_t gc_promoted_bytes_since_last_full; /* The thread that is "to blame" for the current GC run (e.g. the one * that filled its nursery fastest). */ MVMThreadContext *thread_to_blame_for_gc; /* Persistent object ID hash, used to give nursery objects a lifetime * unique ID. Plus a lock to protect it. */ MVMObjectId *object_ids; uv_mutex_t mutex_object_ids; /* Fixed size allocator. */ MVMFixedSizeAlloc *fsa; /************************************************************************ * Object system ************************************************************************/ /* Number of representations registered so far. */ MVMuint32 num_reprs; /* An array mapping representation IDs to registry entries. */ MVMReprRegistry **repr_list; /* A hash mapping representation names to registry entries. */ MVMReprRegistry *repr_hash; /* Mutex for REPR registration. */ uv_mutex_t mutex_repr_registry; /* Container type registry and mutex to protect it. */ MVMContainerRegistry *container_registry; uv_mutex_t mutex_container_registry; /* Hash of all known serialization contexts. Marked for GC iff * the item is unresolved. Also, array of all SCs, used for the * index stored in object headers. When an SC goes away this is * simply nulled. That makes it a small memory leak if a lot of * SCs are created and go away over time. */ MVMSerializationContextBody *sc_weakhash; uv_mutex_t mutex_sc_weakhash; MVMSerializationContextBody **all_scs; MVMuint32 all_scs_next_idx; MVMuint32 all_scs_alloc; /* Mutex to serialize additions of type parameterizations. Global rather * than per STable, as this doesn't happen often. */ uv_mutex_t mutex_parameterization_add; /************************************************************************ * Specializer (dynamic optimization) ************************************************************************/ /* Log file for specializations, if we're to log them. */ FILE *spesh_log_fh; /* Flag for if spesh (and certain spesh features) are enabled. */ MVMint8 spesh_enabled; MVMint8 spesh_inline_enabled; MVMint8 spesh_osr_enabled; MVMint8 spesh_nodelay; MVMint8 spesh_blocking; /* Number of specializations produced, and limit on number of * specializations (zero if no limit). */ MVMint32 spesh_produced; MVMint32 spesh_limit; /* Mutex taken when install specializations. */ uv_mutex_t mutex_spesh_install; /* The concurrent queue used to send logs to spesh_thread, provided it * is enabled. */ MVMObject *spesh_queue; /* The current specialization plan; hung off here so we can mark it. */ MVMSpeshPlan *spesh_plan; /* The latest statistics version (incremented each time a spesh log is * received by the worker thread). */ MVMuint32 spesh_stats_version; /* Lock and condition variable for when something needs to wait for the * specialization worker to finish what it's doing before continuing. * Used by the profiler, which doesn't want the specializer tripping over * frame bytecode changing to instrumented versions. */ uv_mutex_t mutex_spesh_sync; uv_cond_t cond_spesh_sync; MVMuint32 spesh_working; /************************************************************************ * JIT compilation ************************************************************************/ /* Flag for if jit is enabled */ MVMint32 jit_enabled; MVMint32 jit_expr_enabled; /* bisection flags, to stop the JIT from using the expression compiler above * certain frame seq nr / basic blocks nrs, allowing a debugger to figure * out where a particular piece of code breaks */ MVMint32 jit_expr_last_frame; MVMint32 jit_expr_last_bb; /* File for JIT logging */ FILE *jit_log_fh; /* Directory name for JIT bytecode dumps */ char *jit_bytecode_dir; /* File for map of frame information for bytecode dumps */ FILE *jit_bytecode_map; /* sequence number for JIT compiled frames */ MVMint32 jit_seq_nr; /* array of places we want the JIT to insert (hard) breakpoints */ MVM_VECTOR_DECL(struct { MVMint32 frame_nr; MVMint32 block_nr; }, jit_breakpoints); /************************************************************************ * I/O and process state ************************************************************************/ /* The event loop thread, a mutex to avoid start-races, a concurrent * queue of tasks that need to be processed by the event loop thread * and an array of active tasks, for the purpose of keeping them GC * marked. */ MVMThreadContext *event_loop_thread; uv_mutex_t mutex_event_loop_start; uv_sem_t sem_event_loop_started; MVMObject *event_loop_todo_queue; MVMObject *event_loop_permit_queue; MVMObject *event_loop_cancel_queue; MVMObject *event_loop_active; uv_async_t *event_loop_wakeup; /* Standard file handles. */ MVMObject *stdin_handle; MVMObject *stdout_handle; MVMObject *stderr_handle; /* Raw command line args */ char **raw_clargs; /* Number of passed command-line args */ MVMint64 num_clargs; /* executable name */ const char *exec_name; /* program name; becomes first clargs entry */ const char *prog_name; /* cached parsed command line args */ MVMObject *clargs; /* Any --libpath=... options, to prefix in loadbytecode lookups. */ const char *lib_path[8]; /* Cache the environment hash */ MVMObject *env_hash; /************************************************************************ * Caching and interning ************************************************************************/ /* int -> str cache */ MVMString **int_to_str_cache; /* By far the most common integers are between 0 and 8, but we cache up to 15 * so that it lines up properly. */ MVMIntConstCache *int_const_cache; uv_mutex_t mutex_int_const_cache; /* Multi-dispatch cache addition mutex (additions are relatively * rare, so little motivation to have it more fine-grained). */ uv_mutex_t mutex_multi_cache_add; /* Next type cache ID, to go in STable. */ AO_t cur_type_cache_id; /* Cached backend config hash. */ MVMObject *cached_backend_config; /* Interned callsites. */ MVMCallsiteInterns *callsite_interns; uv_mutex_t mutex_callsite_interns; /* Normal Form Grapheme state (synthetics table, lookup, etc.). */ MVMNFGState *nfg; /************************************************************************ * Type objects for built-in types and special values ************************************************************************/ /* The KnowHOW meta-object; all other meta-objects (which are * built in user-space) are built out of this. */ MVMObject *KnowHOW; /* The KnowHOWAttribute meta-object; used for declaring attributes * on a KnowHOW. */ MVMObject *KnowHOWAttribute; /* The VM's native string type, using MVMString. Note that this is a * native string, not an object boxing one. */ MVMObject *VMString; /* Serialization context type (known as SCRef, but it's actually the * serialization context itself). */ MVMObject *SCRef; /* CallCapture type, used by custom dispatchers. */ MVMObject *CallCapture; /* Thread type, representing a VM-level thread. */ MVMObject *Thread; /* SpeshLog type, for passing specialization logs between threads, and * StaticFrameSpesh type for hanging spesh data off frames. */ MVMObject *SpeshLog; MVMObject *StaticFrameSpesh; /* Set of bootstrapping types. */ MVMBootTypes boot_types; /* Set of raw types. */ MVMRawTypes raw_types; /* The VM null object. */ MVMObject *VMNull; /* Set of string constants. */ MVMStringConsts str_consts; /************************************************************************ * Per-language state, compiler registry, and VM extensions ************************************************************************/ /* Hashes of HLLConfig objects. compiler_hll_configs is those for the * running compiler, and the default. compilee_hll_configs is used if * hll_compilee_depth is > 0. */ MVMHLLConfig *compiler_hll_configs; MVMHLLConfig *compilee_hll_configs; MVMint64 hll_compilee_depth; uv_mutex_t mutex_hllconfigs; /* Hash of hashes of symbol tables per hll. */ MVMObject *hll_syms; uv_mutex_t mutex_hll_syms; /* Hash of compiler objects keyed by name */ MVMObject *compiler_registry; uv_mutex_t mutex_compiler_registry; /* Hash of filenames of compunits loaded from disk. */ MVMLoadedCompUnitName *loaded_compunits; uv_mutex_t mutex_loaded_compunits; /* Hash of all loaded DLLs. */ MVMDLLRegistry *dll_registry; uv_mutex_t mutex_dll_registry; /* Hash of all loaded extensions. */ MVMExtRegistry *ext_registry; uv_mutex_t mutex_ext_registry; /* Hash of all registered extension ops. */ MVMExtOpRegistry *extop_registry; uv_mutex_t mutex_extop_registry; /************************************************************************ * Bytecode instrumentations (profiler, coverage, etc.) ************************************************************************/ /* The current instrumentation level. Each time we turn on/off some kind * of instrumentation, such as profiling, this is incremented. The next * entry to a frame then knows it should instrument or switch back to an * uninstrumented version. As a special case, when we start up this is set * to 1 which also triggers frame verification. */ MVMuint32 instrumentation_level; /* Whether instrumented profiling is turned on or not. */ MVMuint32 profiling; /* Heap snapshots, if we're doing heap snapshotting. */ MVMHeapSnapshotCollection *heap_snapshots; /* Whether cross-thread write logging is turned on or not, and an output * mutex for it. */ MVMuint32 cross_thread_write_logging; MVMuint32 cross_thread_write_logging_include_locked; uv_mutex_t mutex_cross_thread_write_logging; /* Log file for coverage logging. */ MVMuint32 coverage_logging; FILE *coverage_log_fh; MVMuint32 coverage_control; /************************************************************************ * Debugging ************************************************************************/ MVMDebugServerData *debugserver; MVMuint32 speshworker_thread_id; /* Log file for dynamic var performance, if we're to log it. */ FILE *dynvar_log_fh; MVMint64 dynvar_log_lasttime; /* Flag for if NFA debugging is enabled. */ MVMint8 nfa_debug_enabled; }; MoarVM-2018.03/src/core/intcache.c0000644000175000017510000000350313237701240016644 0ustar samanthasamantha#include "moar.h" void MVM_intcache_for(MVMThreadContext *tc, MVMObject *type) { int type_index; int right_slot = -1; uv_mutex_lock(&tc->instance->mutex_int_const_cache); for (type_index = 0; type_index < 4; type_index++) { if (tc->instance->int_const_cache->types[type_index] == NULL) { right_slot = type_index; break; } else if (tc->instance->int_const_cache->types[type_index] == type) { uv_mutex_unlock(&tc->instance->mutex_int_const_cache); return; } } if (right_slot != -1) { int val; for (val = -1; val < 15; val++) { MVMObject *obj; obj = MVM_repr_alloc_init(tc, type); MVM_repr_set_int(tc, obj, val); tc->instance->int_const_cache->cache[type_index][val + 1] = obj; MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&tc->instance->int_const_cache->cache[type_index][val + 1], "Boxed integer cache entry"); } tc->instance->int_const_cache->types[type_index] = type; MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&tc->instance->int_const_cache->types[type_index], "Boxed integer cache type"); } uv_mutex_unlock(&tc->instance->mutex_int_const_cache); } MVMObject *MVM_intcache_get(MVMThreadContext *tc, MVMObject *type, MVMint64 value) { int type_index; int right_slot = -1; if (value < -1 || value >= 15) return NULL; for (type_index = 0; type_index < 4; type_index++) { if (tc->instance->int_const_cache->types[type_index] == type) { right_slot = type_index; break; } } if (right_slot != -1) { return tc->instance->int_const_cache->cache[right_slot][value + 1]; } return NULL; } MoarVM-2018.03/src/core/intcache.h0000644000175000017510000000034613237701240016653 0ustar samanthasamanthastruct MVMIntConstCache { MVMObject *types[4]; MVMObject *cache[4][16]; }; void MVM_intcache_for(MVMThreadContext *tc, MVMObject *type); MVMObject *MVM_intcache_get(MVMThreadContext *tc, MVMObject *type, MVMint64 value); MoarVM-2018.03/src/core/interp.c0000644000175000017510000100542113252330426016372 0ustar samanthasamantha#include "moar.h" #include #include "platform/time.h" #include "platform/sys.h" #include "strings/unicode_ops.h" /* Macros for getting things from the bytecode stream. */ #if MVM_GC_DEBUG == 2 MVM_STATIC_INLINE MVMuint16 check_reg(MVMThreadContext *tc, MVMRegister *reg_base, MVMuint16 idx) { MVMFrame *f = tc->cur_frame; MVMuint16 kind = f->spesh_cand && f->spesh_cand->local_types ? f->spesh_cand->local_types[idx] : f->static_info->body.local_types[idx]; if (kind == MVM_reg_obj || kind == MVM_reg_str) MVM_ASSERT_NOT_FROMSPACE(tc, reg_base[idx].o); return idx; } /* The bytecode stream is OPs (16 bit numbers) followed by the (16 bit numbers) of the registers * the OP needs (return register + argument registers. The pc will point to the first place after * the current op, i.e. the first 16 bit register number. We add the requested number to that and * use the result as index into the reg_base array which stores the frame's locals. */ #define GET_REG(pc, idx) reg_base[check_reg(tc, reg_base, *((MVMuint16 *)(pc + idx)))] #else #define GET_REG(pc, idx) reg_base[*((MVMuint16 *)(pc + idx))] #endif #if MVM_GC_DEBUG == 2 MVM_STATIC_INLINE MVMuint16 check_lex(MVMThreadContext *tc, MVMFrame *f, MVMuint16 idx) { MVMuint16 kind = f->spesh_cand && f->spesh_cand->lexical_types ? f->spesh_cand->lexical_types[idx] : f->static_info->body.lexical_types[idx]; if (kind == MVM_reg_obj || kind == MVM_reg_str) MVM_ASSERT_NOT_FROMSPACE(tc, f->env[idx].o); return idx; } #define GET_LEX(pc, idx, f) f->env[check_lex(tc, f, *((MVMuint16 *)(pc + idx)))] #else #define GET_LEX(pc, idx, f) f->env[*((MVMuint16 *)(pc + idx))] #endif #define GET_I16(pc, idx) *((MVMint16 *)(pc + idx)) #define GET_UI16(pc, idx) *((MVMuint16 *)(pc + idx)) #define GET_I32(pc, idx) *((MVMint32 *)(pc + idx)) #define GET_UI32(pc, idx) *((MVMuint32 *)(pc + idx)) #define GET_N32(pc, idx) *((MVMnum32 *)(pc + idx)) #define NEXT_OP (op = *(MVMuint16 *)(cur_op), cur_op += 2, op) #if MVM_CGOTO #define DISPATCH(op) #define OP(name) OP_ ## name #define NEXT *LABELS[NEXT_OP] #else #define DISPATCH(op) switch (op) #define OP(name) case MVM_OP_ ## name #define NEXT runloop #endif static int tracing_enabled = 0; /* This is the interpreter run loop. We have one of these per thread. */ void MVM_interp_run(MVMThreadContext *tc, void (*initial_invoke)(MVMThreadContext *, void *), void *invoke_data) { #if MVM_CGOTO #include "oplabels.h" #endif /* Points to the place in the bytecode right after the current opcode. */ /* See the NEXT_OP macro for making sense of this */ MVMuint8 *cur_op = NULL; /* The current frame's bytecode start. */ MVMuint8 *bytecode_start = NULL; /* Points to the base of the current register set for the frame we * are presently in. */ MVMRegister *reg_base = NULL; /* Points to the current compilation unit. */ MVMCompUnit *cu = NULL; /* The current call site we're constructing. */ MVMCallsite *cur_callsite = NULL; /* Stash addresses of current op, register base and SC deref base * in the TC; this will be used by anything that needs to switch * the current place we're interpreting. */ tc->interp_cur_op = &cur_op; tc->interp_bytecode_start = &bytecode_start; tc->interp_reg_base = ®_base; tc->interp_cu = &cu; /* With everything set up, do the initial invocation (exactly what this does * varies depending on if this is starting a new thread or is the top-level * program entry point). */ initial_invoke(tc, invoke_data); /* Set jump point, for if we arrive back in the interpreter from an * exception thrown from C code. */ setjmp(tc->interp_jump); /* Enter runloop. */ runloop: { MVMuint16 op; #if MVM_TRACING if (tracing_enabled) { char *trace_line; trace_line = MVM_exception_backtrace_line(tc, tc->cur_frame, 0, cur_op); fprintf(stderr, "Op %d%s\n", (int)*((MVMuint16 *)cur_op), trace_line); /* slow tracing is slow. Feel free to speed it. */ MVM_free(trace_line); } #endif /* The ops should be in the same order here as in the oplist file, so * the compiler can can optimise the switch properly */ DISPATCH(NEXT_OP) { OP(no_op): goto NEXT; OP(const_i8): OP(const_i16): OP(const_i32): MVM_exception_throw_adhoc(tc, "const_iX NYI"); OP(const_i64): GET_REG(cur_op, 0).i64 = MVM_BC_get_I64(cur_op, 2); cur_op += 10; goto NEXT; OP(const_n32): MVM_exception_throw_adhoc(tc, "const_n32 NYI"); OP(const_n64): GET_REG(cur_op, 0).n64 = MVM_BC_get_N64(cur_op, 2); cur_op += 10; goto NEXT; OP(const_s): GET_REG(cur_op, 0).s = MVM_cu_string(tc, cu, GET_UI32(cur_op, 2)); cur_op += 6; goto NEXT; OP(set): GET_REG(cur_op, 0) = GET_REG(cur_op, 2); cur_op += 4; goto NEXT; OP(extend_u8): GET_REG(cur_op, 0).u64 = (MVMuint64)GET_REG(cur_op, 2).u8; cur_op += 4; goto NEXT; OP(extend_u16): GET_REG(cur_op, 0).u64 = (MVMuint64)GET_REG(cur_op, 2).u16; cur_op += 4; goto NEXT; OP(extend_u32): GET_REG(cur_op, 0).u64 = (MVMuint64)GET_REG(cur_op, 2).u32; cur_op += 4; goto NEXT; OP(extend_i8): GET_REG(cur_op, 0).i64 = (MVMint64)GET_REG(cur_op, 2).i8; cur_op += 4; goto NEXT; OP(extend_i16): GET_REG(cur_op, 0).i64 = (MVMint64)GET_REG(cur_op, 2).i16; cur_op += 4; goto NEXT; OP(extend_i32): GET_REG(cur_op, 0).i64 = (MVMint64)GET_REG(cur_op, 2).i32; cur_op += 4; goto NEXT; OP(trunc_u8): GET_REG(cur_op, 0).u8 = (MVMuint8)GET_REG(cur_op, 2).u64; cur_op += 4; goto NEXT; OP(trunc_u16): GET_REG(cur_op, 0).u16 = (MVMuint16)GET_REG(cur_op, 2).u64; cur_op += 4; goto NEXT; OP(trunc_u32): GET_REG(cur_op, 0).u32 = (MVMuint32)GET_REG(cur_op, 2).u64; cur_op += 4; goto NEXT; OP(trunc_i8): GET_REG(cur_op, 0).i8 = (MVMint8)GET_REG(cur_op, 2).i64; cur_op += 4; goto NEXT; OP(trunc_i16): GET_REG(cur_op, 0).i16 = (MVMint16)GET_REG(cur_op, 2).i64; cur_op += 4; goto NEXT; OP(trunc_i32): GET_REG(cur_op, 0).i32 = (MVMint32)GET_REG(cur_op, 2).i64; cur_op += 4; goto NEXT; OP(extend_n32): GET_REG(cur_op, 0).n64 = (MVMnum64)GET_REG(cur_op, 2).n32; cur_op += 4; goto NEXT; OP(trunc_n32): GET_REG(cur_op, 0).n32 = (MVMnum32)GET_REG(cur_op, 2).n64; cur_op += 4; goto NEXT; OP(goto): cur_op = bytecode_start + GET_UI32(cur_op, 0); GC_SYNC_POINT(tc); goto NEXT; OP(if_i): if (GET_REG(cur_op, 0).i64) cur_op = bytecode_start + GET_UI32(cur_op, 2); else cur_op += 6; GC_SYNC_POINT(tc); goto NEXT; OP(unless_i): if (GET_REG(cur_op, 0).i64) cur_op += 6; else cur_op = bytecode_start + GET_UI32(cur_op, 2); GC_SYNC_POINT(tc); goto NEXT; OP(if_n): if (GET_REG(cur_op, 0).n64 != 0.0) cur_op = bytecode_start + GET_UI32(cur_op, 2); else cur_op += 6; GC_SYNC_POINT(tc); goto NEXT; OP(unless_n): if (GET_REG(cur_op, 0).n64 != 0.0) cur_op += 6; else cur_op = bytecode_start + GET_UI32(cur_op, 2); GC_SYNC_POINT(tc); goto NEXT; OP(if_s): { MVMString *str = GET_REG(cur_op, 0).s; if (!str || MVM_string_graphs(tc, str) == 0) cur_op += 6; else cur_op = bytecode_start + GET_UI32(cur_op, 2); GC_SYNC_POINT(tc); goto NEXT; } OP(unless_s): { MVMString *str = GET_REG(cur_op, 0).s; if (!str || MVM_string_graphs(tc, str) == 0) cur_op = bytecode_start + GET_UI32(cur_op, 2); else cur_op += 6; GC_SYNC_POINT(tc); goto NEXT; } OP(if_s0): { MVMString *str = GET_REG(cur_op, 0).s; if (!MVM_coerce_istrue_s(tc, str)) cur_op += 6; else cur_op = bytecode_start + GET_UI32(cur_op, 2); GC_SYNC_POINT(tc); goto NEXT; } OP(unless_s0): { MVMString *str = GET_REG(cur_op, 0).s; if (!MVM_coerce_istrue_s(tc, str)) cur_op = bytecode_start + GET_UI32(cur_op, 2); else cur_op += 6; GC_SYNC_POINT(tc); goto NEXT; } OP(if_o): GC_SYNC_POINT(tc); MVM_coerce_istrue(tc, GET_REG(cur_op, 0).o, NULL, bytecode_start + GET_UI32(cur_op, 2), cur_op + 6, 0); goto NEXT; OP(unless_o): GC_SYNC_POINT(tc); MVM_coerce_istrue(tc, GET_REG(cur_op, 0).o, NULL, bytecode_start + GET_UI32(cur_op, 2), cur_op + 6, 1); goto NEXT; OP(jumplist): { MVMint64 num_labels = MVM_BC_get_I64(cur_op, 0); MVMint64 input = GET_REG(cur_op, 8).i64; cur_op += 10; /* the goto ops are guaranteed valid/existent by validation.c */ if (input < 0 || input >= num_labels) { /* implicitly covers num_labels == 0 */ /* skip the entire goto list block */ cur_op += (6 /* size of each goto op */) * num_labels; } else { /* delve directly into the selected goto op */ cur_op = bytecode_start + GET_UI32(cur_op, input * (6 /* size of each goto op */) + (2 /* size of the goto instruction itself */)); } GC_SYNC_POINT(tc); goto NEXT; } OP(getlex): { MVMFrame *f = tc->cur_frame; MVMuint16 idx = GET_UI16(cur_op, 2); MVMuint16 outers = GET_UI16(cur_op, 4); MVMuint16 *lexical_types; while (outers) { if (!f->outer) MVM_exception_throw_adhoc(tc, "getlex: outer index out of range"); f = f->outer; outers--; } lexical_types = f->spesh_cand && f->spesh_cand->lexical_types ? f->spesh_cand->lexical_types : f->static_info->body.lexical_types; if (lexical_types[idx] == MVM_reg_obj) { MVMRegister found = GET_LEX(cur_op, 2, f); MVMObject *value = found.o == NULL ? MVM_frame_vivify_lexical(tc, f, idx) : found.o; GET_REG(cur_op, 0).o = value; if (MVM_spesh_log_is_logging(tc)) MVM_spesh_log_type(tc, value); } else { GET_REG(cur_op, 0) = GET_LEX(cur_op, 2, f); } cur_op += 6; goto NEXT; } OP(bindlex): { MVMFrame *f = tc->cur_frame; MVMuint16 outers = GET_UI16(cur_op, 2); MVMuint16 kind = f->spesh_cand && f->spesh_cand->local_types ? f->spesh_cand->local_types[GET_UI16(cur_op, 4)] : f->static_info->body.local_types[GET_UI16(cur_op, 4)]; while (outers) { if (!f->outer) MVM_exception_throw_adhoc(tc, "bindlex: outer index out of range"); f = f->outer; outers--; } if (kind == MVM_reg_obj || kind == MVM_reg_str) { #if MVM_GC_DEGUG MVM_ASSERT_NOT_FROMSPACE(tc, GET_REG(cur_op, 4).o); #endif MVM_ASSIGN_REF(tc, &(f->header), GET_LEX(cur_op, 0, f).o, GET_REG(cur_op, 4).o); } else { GET_LEX(cur_op, 0, f) = GET_REG(cur_op, 4); } cur_op += 6; goto NEXT; } OP(getlex_ni): GET_REG(cur_op, 0).i64 = MVM_frame_find_lexical_by_name(tc, MVM_cu_string(tc, cu, GET_UI32(cur_op, 2)), MVM_reg_int64)->i64; cur_op += 6; goto NEXT; OP(getlex_nn): GET_REG(cur_op, 0).n64 = MVM_frame_find_lexical_by_name(tc, MVM_cu_string(tc, cu, GET_UI32(cur_op, 2)), MVM_reg_num64)->n64; cur_op += 6; goto NEXT; OP(getlex_ns): GET_REG(cur_op, 0).s = MVM_frame_find_lexical_by_name(tc, MVM_cu_string(tc, cu, GET_UI32(cur_op, 2)), MVM_reg_str)->s; cur_op += 6; goto NEXT; OP(getlex_no): { MVMRegister *found = MVM_frame_find_lexical_by_name(tc, MVM_cu_string(tc, cu, GET_UI32(cur_op, 2)), MVM_reg_obj); if (found) { GET_REG(cur_op, 0).o = found->o; if (MVM_spesh_log_is_logging(tc)) MVM_spesh_log_type(tc, found->o); } else { GET_REG(cur_op, 0).o = tc->instance->VMNull; } cur_op += 6; goto NEXT; } OP(bindlex_ni): MVM_frame_bind_lexical_by_name(tc, MVM_cu_string(tc, cu, GET_UI32(cur_op, 0)), MVM_reg_int64, &(GET_REG(cur_op, 4))); cur_op += 6; goto NEXT; OP(bindlex_nn): MVM_frame_bind_lexical_by_name(tc, MVM_cu_string(tc, cu, GET_UI32(cur_op, 0)), MVM_reg_num64, &(GET_REG(cur_op, 4))); cur_op += 6; goto NEXT; OP(bindlex_ns): MVM_frame_bind_lexical_by_name(tc, MVM_cu_string(tc, cu, GET_UI32(cur_op, 0)), MVM_reg_str, &(GET_REG(cur_op, 4))); cur_op += 6; goto NEXT; OP(bindlex_no): MVM_frame_bind_lexical_by_name(tc, MVM_cu_string(tc, cu, GET_UI32(cur_op, 0)), MVM_reg_obj, &(GET_REG(cur_op, 4))); cur_op += 6; goto NEXT; OP(getlex_ng): OP(bindlex_ng): MVM_exception_throw_adhoc(tc, "get/bindlex_ng NYI"); OP(getdynlex): { GET_REG(cur_op, 0).o = MVM_frame_getdynlex(tc, GET_REG(cur_op, 2).s, tc->cur_frame->caller); cur_op += 4; goto NEXT; } OP(binddynlex): { MVM_frame_binddynlex(tc, GET_REG(cur_op, 0).s, GET_REG(cur_op, 2).o, tc->cur_frame->caller); cur_op += 4; goto NEXT; } OP(setlexvalue): { MVMObject *code = GET_REG(cur_op, 0).o; MVMString *name = MVM_cu_string(tc, cu, GET_UI32(cur_op, 2)); MVMObject *val = GET_REG(cur_op, 6).o; MVMint16 flag = GET_I16(cur_op, 8); if (flag < 0 || flag > 2) MVM_exception_throw_adhoc(tc, "setlexvalue provided with invalid flag"); if (IS_CONCRETE(code) && REPR(code)->ID == MVM_REPR_ID_MVMCode) { MVMStaticFrame *sf = ((MVMCode *)code)->body.sf; MVMuint8 found = 0; if (!sf->body.fully_deserialized) MVM_bytecode_finish_frame(tc, sf->body.cu, sf, 0); if (sf->body.lexical_names) { MVMLexicalRegistry *entry; MVM_HASH_GET(tc, sf->body.lexical_names, name, entry); if (entry && sf->body.lexical_types[entry->value] == MVM_reg_obj) { MVM_ASSIGN_REF(tc, &(sf->common.header), sf->body.static_env[entry->value].o, val); sf->body.static_env_flags[entry->value] = (MVMuint8)flag; found = 1; } } if (!found) MVM_exception_throw_adhoc(tc, "setstaticlex given invalid lexical name"); } else { MVM_exception_throw_adhoc(tc, "setstaticlex needs a code ref"); } cur_op += 10; goto NEXT; } OP(lexprimspec): { MVMObject *ctx = GET_REG(cur_op, 2).o; MVMString *name = GET_REG(cur_op, 4).s; if (REPR(ctx)->ID != MVM_REPR_ID_MVMContext || !IS_CONCRETE(ctx)) MVM_exception_throw_adhoc(tc, "lexprimspec needs a context"); GET_REG(cur_op, 0).i64 = MVM_frame_lexical_primspec(tc, ((MVMContext *)ctx)->body.context, name); cur_op += 6; goto NEXT; } OP(return_i): if (MVM_spesh_log_is_logging(tc)) MVM_spesh_log_return_type(tc, NULL); MVM_args_set_result_int(tc, GET_REG(cur_op, 0).i64, MVM_RETURN_CALLER_FRAME); if (MVM_frame_try_return(tc) == 0) goto return_label; goto NEXT; OP(return_n): if (MVM_spesh_log_is_logging(tc)) MVM_spesh_log_return_type(tc, NULL); MVM_args_set_result_num(tc, GET_REG(cur_op, 0).n64, MVM_RETURN_CALLER_FRAME); if (MVM_frame_try_return(tc) == 0) goto return_label; goto NEXT; OP(return_s): if (MVM_spesh_log_is_logging(tc)) MVM_spesh_log_return_type(tc, NULL); MVM_args_set_result_str(tc, GET_REG(cur_op, 0).s, MVM_RETURN_CALLER_FRAME); if (MVM_frame_try_return(tc) == 0) goto return_label; goto NEXT; OP(return_o): { MVMObject *value = GET_REG(cur_op, 0).o; if (MVM_spesh_log_is_logging(tc)) { MVMROOT(tc, value, { MVM_spesh_log_return_type(tc, value); }); } MVM_args_set_result_obj(tc, value, MVM_RETURN_CALLER_FRAME); if (MVM_frame_try_return(tc) == 0) goto return_label; goto NEXT; } OP(return): if (MVM_spesh_log_is_logging(tc)) MVM_spesh_log_return_type(tc, NULL); MVM_args_assert_void_return_ok(tc, MVM_RETURN_CALLER_FRAME); if (MVM_frame_try_return(tc) == 0) goto return_label; goto NEXT; OP(eq_i): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 == GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; OP(ne_i): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 != GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; OP(lt_i): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 < GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; OP(le_i): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 <= GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; OP(gt_i): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 > GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; OP(ge_i): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 >= GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; OP(cmp_i): { MVMint64 a = GET_REG(cur_op, 2).i64, b = GET_REG(cur_op, 4).i64; GET_REG(cur_op, 0).i64 = (a > b) - (a < b); cur_op += 6; goto NEXT; } OP(add_i): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 + GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; OP(sub_i): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 - GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; OP(mul_i): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 * GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; OP(div_i): { MVMint64 num = GET_REG(cur_op, 2).i64; MVMint64 denom = GET_REG(cur_op, 4).i64; /* if we have a negative result, make sure we floor rather * than rounding towards zero. */ if (denom == 0) MVM_exception_throw_adhoc(tc, "Division by zero"); if ((num < 0) ^ (denom < 0)) { if ((num % denom) != 0) { GET_REG(cur_op, 0).i64 = num / denom - 1; } else { GET_REG(cur_op, 0).i64 = num / denom; } } else { GET_REG(cur_op, 0).i64 = num / denom; } cur_op += 6; goto NEXT; } OP(div_u): GET_REG(cur_op, 0).u64 = GET_REG(cur_op, 2).u64 / GET_REG(cur_op, 4).u64; cur_op += 6; goto NEXT; OP(mod_i): { MVMint64 numer = GET_REG(cur_op, 2).i64; MVMint64 denom = GET_REG(cur_op, 4).i64; if (denom == 0) MVM_exception_throw_adhoc(tc, "Modulation by zero"); GET_REG(cur_op, 0).i64 = numer % denom; cur_op += 6; goto NEXT; } OP(mod_u): GET_REG(cur_op, 0).u64 = GET_REG(cur_op, 2).u64 % GET_REG(cur_op, 4).u64; cur_op += 6; goto NEXT; OP(neg_i): GET_REG(cur_op, 0).i64 = -GET_REG(cur_op, 2).i64; cur_op += 4; goto NEXT; OP(abs_i): { MVMint64 v = GET_REG(cur_op, 2).i64, mask = v >> 63; GET_REG(cur_op, 0).i64 = (v + mask) ^ mask; cur_op += 4; goto NEXT; } OP(inc_i): GET_REG(cur_op, 0).i64++; cur_op += 2; goto NEXT; OP(inc_u): GET_REG(cur_op, 0).u64++; cur_op += 2; goto NEXT; OP(dec_i): GET_REG(cur_op, 0).i64--; cur_op += 2; goto NEXT; OP(dec_u): GET_REG(cur_op, 0).u64--; cur_op += 2; goto NEXT; OP(band_i): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 & GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; OP(bor_i): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 | GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; OP(bxor_i): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 ^ GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; OP(bnot_i): GET_REG(cur_op, 0).i64 = ~GET_REG(cur_op, 2).i64; cur_op += 4; goto NEXT; OP(blshift_i): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 << GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; OP(brshift_i): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 >> GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; OP(pow_i): { MVMint64 base = GET_REG(cur_op, 2).i64; MVMint64 exp = GET_REG(cur_op, 4).i64; MVMint64 result = 1; /* "Exponentiation by squaring" */ if (exp < 0) { result = 0; /* because 1/base**-exp is between 0 and 1 */ } else { while (exp) { if (exp & 1) result *= base; exp >>= 1; base *= base; } } GET_REG(cur_op, 0).i64 = result; } cur_op += 6; goto NEXT; OP(not_i): { GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).i64 ? 0 : 1; cur_op += 4; goto NEXT; } OP(gcd_i): { MVMint64 a = labs(GET_REG(cur_op, 2).i64), b = labs(GET_REG(cur_op, 4).i64), c; while ( b != 0 ) { c = a % b; a = b; b = c; } GET_REG(cur_op, 0).i64 = a; cur_op += 6; goto NEXT; } OP(lcm_i): { MVMint64 a = GET_REG(cur_op, 2).i64, b = GET_REG(cur_op, 4).i64, c, a_ = a, b_ = b; while ( b != 0 ) { c = a % b; a = b; b = c; } c = a; GET_REG(cur_op, 0).i64 = a_ / c * b_; cur_op += 6; goto NEXT; } OP(eq_n): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).n64 == GET_REG(cur_op, 4).n64; cur_op += 6; goto NEXT; OP(ne_n): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).n64 != GET_REG(cur_op, 4).n64; cur_op += 6; goto NEXT; OP(lt_n): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).n64 < GET_REG(cur_op, 4).n64; cur_op += 6; goto NEXT; OP(le_n): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).n64 <= GET_REG(cur_op, 4).n64; cur_op += 6; goto NEXT; OP(gt_n): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).n64 > GET_REG(cur_op, 4).n64; cur_op += 6; goto NEXT; OP(ge_n): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).n64 >= GET_REG(cur_op, 4).n64; cur_op += 6; goto NEXT; OP(cmp_n): { MVMnum64 a = GET_REG(cur_op, 2).n64, b = GET_REG(cur_op, 4).n64; GET_REG(cur_op, 0).i64 = (a > b) - (a < b); cur_op += 6; goto NEXT; } OP(add_n): GET_REG(cur_op, 0).n64 = GET_REG(cur_op, 2).n64 + GET_REG(cur_op, 4).n64; cur_op += 6; goto NEXT; OP(sub_n): GET_REG(cur_op, 0).n64 = GET_REG(cur_op, 2).n64 - GET_REG(cur_op, 4).n64; cur_op += 6; goto NEXT; OP(mul_n): GET_REG(cur_op, 0).n64 = GET_REG(cur_op, 2).n64 * GET_REG(cur_op, 4).n64; cur_op += 6; goto NEXT; OP(div_n): GET_REG(cur_op, 0).n64 = GET_REG(cur_op, 2).n64 / GET_REG(cur_op, 4).n64; cur_op += 6; goto NEXT; OP(mod_n): { MVMnum64 a = GET_REG(cur_op, 2).n64; MVMnum64 b = GET_REG(cur_op, 4).n64; GET_REG(cur_op, 0).n64 = b == 0 ? a : a - b * floor(a / b); cur_op += 6; goto NEXT; } OP(neg_n): GET_REG(cur_op, 0).n64 = -GET_REG(cur_op, 2).n64; cur_op += 4; goto NEXT; OP(abs_n): { MVMnum64 num = GET_REG(cur_op, 2).n64; /* The 1.0/num logic checks for a negative zero */ if (num < 0 || (num == 0 && 1.0/num < 0) ) num = num * -1; GET_REG(cur_op, 0).n64 = num; cur_op += 4; } goto NEXT; OP(pow_n): GET_REG(cur_op, 0).n64 = pow(GET_REG(cur_op, 2).n64, GET_REG(cur_op, 4).n64); cur_op += 6; goto NEXT; OP(ceil_n):{ GET_REG(cur_op, 0).n64 = ceil(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; } OP(floor_n): { GET_REG(cur_op, 0).n64 = floor(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; } OP(sin_n): GET_REG(cur_op, 0).n64 = sin(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(asin_n): GET_REG(cur_op, 0).n64 = asin(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(cos_n): GET_REG(cur_op, 0).n64 = cos(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(acos_n): GET_REG(cur_op, 0).n64 = acos(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(tan_n): GET_REG(cur_op, 0).n64 = tan(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(atan_n): GET_REG(cur_op, 0).n64 = atan(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(atan2_n): GET_REG(cur_op, 0).n64 = atan2(GET_REG(cur_op, 2).n64, GET_REG(cur_op, 4).n64); cur_op += 6; goto NEXT; OP(sec_n): /* XXX TODO) handle edge cases */ GET_REG(cur_op, 0).n64 = 1.0 / cos(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(asec_n): /* XXX TODO) handle edge cases */ GET_REG(cur_op, 0).n64 = acos(1.0 / GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(sinh_n): GET_REG(cur_op, 0).n64 = sinh(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(cosh_n): GET_REG(cur_op, 0).n64 = cosh(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(tanh_n): GET_REG(cur_op, 0).n64 = tanh(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(sech_n): /* XXX TODO) handle edge cases */ GET_REG(cur_op, 0).n64 = 1.0 / cosh(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(sqrt_n): GET_REG(cur_op, 0).n64 = sqrt(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(log_n): GET_REG(cur_op, 0).n64 = log(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(exp_n): GET_REG(cur_op, 0).n64 = exp(GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(coerce_in): GET_REG(cur_op, 0).n64 = (MVMnum64)GET_REG(cur_op, 2).i64; cur_op += 4; goto NEXT; OP(coerce_ni): GET_REG(cur_op, 0).i64 = (MVMint64)GET_REG(cur_op, 2).n64; cur_op += 4; goto NEXT; OP(coerce_is): { GET_REG(cur_op, 0).s = MVM_coerce_i_s(tc, GET_REG(cur_op, 2).i64); cur_op += 4; goto NEXT; } OP(coerce_ns): { GET_REG(cur_op, 0).s = MVM_coerce_n_s(tc, GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; } OP(coerce_si): GET_REG(cur_op, 0).i64 = MVM_coerce_s_i(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(coerce_sn): GET_REG(cur_op, 0).n64 = MVM_coerce_s_n(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(smrt_numify): { /* Increment PC before calling coercer, as it may make * a method call to get the result. */ MVMObject *obj = GET_REG(cur_op, 2).o; MVMRegister *res = &GET_REG(cur_op, 0); cur_op += 4; MVM_coerce_smart_numify(tc, obj, res); goto NEXT; } OP(smrt_strify): { /* Increment PC before calling coercer, as it may make * a method call to get the result. */ MVMObject *obj = GET_REG(cur_op, 2).o; MVMRegister *res = &GET_REG(cur_op, 0); cur_op += 4; MVM_coerce_smart_stringify(tc, obj, res); goto NEXT; } OP(prepargs): /* Store callsite in the frame so that the GC knows how to mark * any arguments. Note that since none of the arg-setting ops can * trigger GC, there's no way the setup can be interrupted, so we * don't need to clear the args buffer before we start. */ cur_callsite = cu->body.callsites[GET_UI16(cur_op, 0)]; tc->cur_frame->cur_args_callsite = cur_callsite; cur_op += 2; goto NEXT; OP(arg_i): tc->cur_frame->args[GET_UI16(cur_op, 0)].i64 = GET_REG(cur_op, 2).i64; cur_op += 4; goto NEXT; OP(arg_n): tc->cur_frame->args[GET_UI16(cur_op, 0)].n64 = GET_REG(cur_op, 2).n64; cur_op += 4; goto NEXT; OP(arg_s): tc->cur_frame->args[GET_UI16(cur_op, 0)].s = GET_REG(cur_op, 2).s; cur_op += 4; goto NEXT; OP(arg_o): tc->cur_frame->args[GET_UI16(cur_op, 0)].o = GET_REG(cur_op, 2).o; cur_op += 4; goto NEXT; OP(argconst_i): tc->cur_frame->args[GET_UI16(cur_op, 0)].i64 = MVM_BC_get_I64(cur_op, 2); cur_op += 10; goto NEXT; OP(argconst_n): tc->cur_frame->args[GET_UI16(cur_op, 0)].n64 = MVM_BC_get_N64(cur_op, 2); cur_op += 10; goto NEXT; OP(argconst_s): tc->cur_frame->args[GET_UI16(cur_op, 0)].s = MVM_cu_string(tc, cu, GET_UI32(cur_op, 2)); cur_op += 6; goto NEXT; OP(invoke_v): { MVMObject *code = GET_REG(cur_op, 0).o; MVMRegister *args = tc->cur_frame->args; MVMuint16 was_multi = 0; /* was_multi argument is MVMuint16* */ code = MVM_frame_find_invokee_multi_ok(tc, code, &cur_callsite, args, &was_multi); if (MVM_spesh_log_is_logging(tc)) { MVMROOT(tc, code, { /* was_multi is MVMint16 */ MVM_spesh_log_invoke_target(tc, code, was_multi); }); } tc->cur_frame->return_value = NULL; tc->cur_frame->return_type = MVM_RETURN_VOID; cur_op += 2; tc->cur_frame->return_address = cur_op; STABLE(code)->invoke(tc, code, cur_callsite, args); } goto NEXT; OP(invoke_i): { MVMObject *code = GET_REG(cur_op, 2).o; MVMRegister *args = tc->cur_frame->args; MVMuint16 was_multi = 0; code = MVM_frame_find_invokee_multi_ok(tc, code, &cur_callsite, args, &was_multi); if (MVM_spesh_log_is_logging(tc)) { MVMROOT(tc, code, { MVM_spesh_log_invoke_target(tc, code, was_multi); }); } tc->cur_frame->return_value = &GET_REG(cur_op, 0); tc->cur_frame->return_type = MVM_RETURN_INT; cur_op += 4; tc->cur_frame->return_address = cur_op; STABLE(code)->invoke(tc, code, cur_callsite, args); } goto NEXT; OP(invoke_n): { MVMObject *code = GET_REG(cur_op, 2).o; MVMRegister *args = tc->cur_frame->args; MVMuint16 was_multi = 0; code = MVM_frame_find_invokee_multi_ok(tc, code, &cur_callsite, args, &was_multi); if (MVM_spesh_log_is_logging(tc)) { MVMROOT(tc, code, { MVM_spesh_log_invoke_target(tc, code, was_multi); }); } tc->cur_frame->return_value = &GET_REG(cur_op, 0); tc->cur_frame->return_type = MVM_RETURN_NUM; cur_op += 4; tc->cur_frame->return_address = cur_op; STABLE(code)->invoke(tc, code, cur_callsite, args); } goto NEXT; OP(invoke_s): { MVMObject *code = GET_REG(cur_op, 2).o; MVMRegister *args = tc->cur_frame->args; MVMuint16 was_multi = 0; code = MVM_frame_find_invokee_multi_ok(tc, code, &cur_callsite, args, &was_multi); if (MVM_spesh_log_is_logging(tc)) { MVMROOT(tc, code, { MVM_spesh_log_invoke_target(tc, code, was_multi); }); } tc->cur_frame->return_value = &GET_REG(cur_op, 0); tc->cur_frame->return_type = MVM_RETURN_STR; cur_op += 4; tc->cur_frame->return_address = cur_op; STABLE(code)->invoke(tc, code, cur_callsite, args); } goto NEXT; OP(invoke_o): { MVMObject *code = GET_REG(cur_op, 2).o; MVMRegister *args = tc->cur_frame->args; MVMuint16 was_multi = 0; code = MVM_frame_find_invokee_multi_ok(tc, code, &cur_callsite, args, &was_multi); if (MVM_spesh_log_is_logging(tc)) { MVMROOT(tc, code, { MVM_spesh_log_invoke_target(tc, code, was_multi); }); } tc->cur_frame->return_value = &GET_REG(cur_op, 0); tc->cur_frame->return_type = MVM_RETURN_OBJ; cur_op += 4; tc->cur_frame->return_address = cur_op; STABLE(code)->invoke(tc, code, cur_callsite, args); } goto NEXT; OP(checkarity): MVM_args_checkarity(tc, &tc->cur_frame->params, GET_UI16(cur_op, 0), GET_UI16(cur_op, 2)); cur_op += 4; goto NEXT; OP(param_rp_i): GET_REG(cur_op, 0).i64 = MVM_args_get_required_pos_int(tc, &tc->cur_frame->params, GET_UI16(cur_op, 2)); cur_op += 4; goto NEXT; OP(param_rp_n): GET_REG(cur_op, 0).n64 = MVM_args_get_pos_num(tc, &tc->cur_frame->params, GET_UI16(cur_op, 2), MVM_ARG_REQUIRED).arg.n64; cur_op += 4; goto NEXT; OP(param_rp_s): GET_REG(cur_op, 0).s = MVM_args_get_required_pos_str(tc, &tc->cur_frame->params, GET_UI16(cur_op, 2)); cur_op += 4; goto NEXT; OP(param_rp_o): { MVMuint16 arg_idx = GET_UI16(cur_op, 2); MVMObject *param = MVM_args_get_required_pos_obj(tc, &tc->cur_frame->params, arg_idx); GET_REG(cur_op, 0).o = param; if (MVM_spesh_log_is_logging(tc)) MVM_spesh_log_parameter(tc, arg_idx, param); cur_op += 4; goto NEXT; } OP(param_op_i): { MVMArgInfo param = MVM_args_get_optional_pos_int(tc, &tc->cur_frame->params, GET_UI16(cur_op, 2)); if (param.exists) { GET_REG(cur_op, 0).i64 = param.arg.i64; cur_op = bytecode_start + GET_UI32(cur_op, 4); } else { cur_op += 8; } goto NEXT; } OP(param_op_n): { MVMArgInfo param = MVM_args_get_pos_num(tc, &tc->cur_frame->params, GET_UI16(cur_op, 2), MVM_ARG_OPTIONAL); if (param.exists) { GET_REG(cur_op, 0).n64 = param.arg.n64; cur_op = bytecode_start + GET_UI32(cur_op, 4); } else { cur_op += 8; } goto NEXT; } OP(param_op_s): { MVMArgInfo param = MVM_args_get_optional_pos_str(tc, &tc->cur_frame->params, GET_UI16(cur_op, 2)); if (param.exists) { GET_REG(cur_op, 0).s = param.arg.s; cur_op = bytecode_start + GET_UI32(cur_op, 4); } else { cur_op += 8; } goto NEXT; } OP(param_op_o): { MVMuint16 arg_idx = GET_UI16(cur_op, 2); MVMArgInfo param = MVM_args_get_optional_pos_obj(tc, &tc->cur_frame->params, arg_idx); if (param.exists) { GET_REG(cur_op, 0).o = param.arg.o; if (MVM_spesh_log_is_logging(tc)) MVM_spesh_log_parameter(tc, arg_idx, param.arg.o); cur_op = bytecode_start + GET_UI32(cur_op, 4); } else { cur_op += 8; } goto NEXT; } OP(param_rn_i): GET_REG(cur_op, 0).i64 = MVM_args_get_named_int(tc, &tc->cur_frame->params, MVM_cu_string(tc, cu, GET_UI32(cur_op, 2)), MVM_ARG_REQUIRED).arg.i64; cur_op += 6; goto NEXT; OP(param_rn_n): GET_REG(cur_op, 0).n64 = MVM_args_get_named_num(tc, &tc->cur_frame->params, MVM_cu_string(tc, cu, GET_UI32(cur_op, 2)), MVM_ARG_REQUIRED).arg.n64; cur_op += 6; goto NEXT; OP(param_rn_s): GET_REG(cur_op, 0).s = MVM_args_get_named_str(tc, &tc->cur_frame->params, MVM_cu_string(tc, cu, GET_UI32(cur_op, 2)), MVM_ARG_REQUIRED).arg.s; cur_op += 6; goto NEXT; OP(param_rn_o): { MVMArgInfo param = MVM_args_get_named_obj(tc, &tc->cur_frame->params, MVM_cu_string(tc, cu, GET_UI32(cur_op, 2)), MVM_ARG_REQUIRED); GET_REG(cur_op, 0).o = param.arg.o; if (MVM_spesh_log_is_logging(tc)) MVM_spesh_log_parameter(tc, param.arg_idx, param.arg.o); cur_op += 6; goto NEXT; } OP(param_on_i): { MVMArgInfo param = MVM_args_get_named_int(tc, &tc->cur_frame->params, MVM_cu_string(tc, cu, GET_UI32(cur_op, 2)), MVM_ARG_OPTIONAL); if (param.exists) { GET_REG(cur_op, 0).i64 = param.arg.i64; cur_op = bytecode_start + GET_UI32(cur_op, 6); } else { cur_op += 10; } goto NEXT; } OP(param_on_n): { MVMArgInfo param = MVM_args_get_named_num(tc, &tc->cur_frame->params, MVM_cu_string(tc, cu, GET_UI32(cur_op, 2)), MVM_ARG_OPTIONAL); if (param.exists) { GET_REG(cur_op, 0).n64 = param.arg.n64; cur_op = bytecode_start + GET_UI32(cur_op, 6); } else { cur_op += 10; } goto NEXT; } OP(param_on_s): { MVMArgInfo param = MVM_args_get_named_str(tc, &tc->cur_frame->params, MVM_cu_string(tc, cu, GET_UI32(cur_op, 2)), MVM_ARG_OPTIONAL); if (param.exists) { GET_REG(cur_op, 0).s = param.arg.s; cur_op = bytecode_start + GET_UI32(cur_op, 6); } else { cur_op += 10; } goto NEXT; } OP(param_on_o): { MVMArgInfo param = MVM_args_get_named_obj(tc, &tc->cur_frame->params, MVM_cu_string(tc, cu, GET_UI32(cur_op, 2)), MVM_ARG_OPTIONAL); if (param.exists) { GET_REG(cur_op, 0).o = param.arg.o; if (MVM_spesh_log_is_logging(tc)) MVM_spesh_log_parameter(tc, param.arg_idx, param.arg.o); cur_op = bytecode_start + GET_UI32(cur_op, 6); } else { cur_op += 10; } goto NEXT; } OP(param_sp): GET_REG(cur_op, 0).o = MVM_args_slurpy_positional(tc, &tc->cur_frame->params, GET_UI16(cur_op, 2)); cur_op += 4; goto NEXT; OP(param_sn): GET_REG(cur_op, 0).o = MVM_args_slurpy_named(tc, &tc->cur_frame->params); cur_op += 2; goto NEXT; OP(getcode): GET_REG(cur_op, 0).o = cu->body.coderefs[GET_UI16(cur_op, 2)]; cur_op += 4; goto NEXT; OP(caller): { MVMFrame *caller = tc->cur_frame; MVMint64 depth = GET_REG(cur_op, 2).i64; while (caller && depth-- > 0) /* keep the > 0. */ caller = caller->caller; GET_REG(cur_op, 0).o = caller ? caller->code_ref : tc->instance->VMNull; cur_op += 4; goto NEXT; } OP(capturelex): MVM_frame_capturelex(tc, GET_REG(cur_op, 0).o); cur_op += 2; goto NEXT; OP(takeclosure): GET_REG(cur_op, 0).o = MVM_frame_takeclosure(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(exception): GET_REG(cur_op, 0).o = tc->active_handlers ? tc->active_handlers->ex_obj : tc->instance->VMNull; cur_op += 2; goto NEXT; OP(bindexmessage): { MVMObject *ex = GET_REG(cur_op, 0).o; if (IS_CONCRETE(ex) && REPR(ex)->ID == MVM_REPR_ID_MVMException) { MVM_ASSIGN_REF(tc, &(ex->header), ((MVMException *)ex)->body.message, GET_REG(cur_op, 2).s); } else { MVM_exception_throw_adhoc(tc, "bindexmessage needs a VMException, got %s (%s)", REPR(ex)->name, MVM_6model_get_debug_name(tc, ex)); } cur_op += 4; goto NEXT; } OP(bindexpayload): { MVMObject *ex = GET_REG(cur_op, 0).o; MVM_bind_exception_payload(tc, ex, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; } OP(bindexcategory): { MVMObject *ex = GET_REG(cur_op, 0).o; MVM_bind_exception_category(tc, ex, GET_REG(cur_op, 2).i64); cur_op += 4; goto NEXT; } OP(getexmessage): { MVMObject *ex = GET_REG(cur_op, 2).o; if (IS_CONCRETE(ex) && REPR(ex)->ID == MVM_REPR_ID_MVMException) GET_REG(cur_op, 0).s = ((MVMException *)ex)->body.message; else MVM_exception_throw_adhoc(tc, "getexmessage needs a VMException, got %s (%s)", REPR(ex)->name, MVM_6model_get_debug_name(tc, ex)); cur_op += 4; goto NEXT; } OP(getexpayload): { MVMObject *ex = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).o = MVM_get_exception_payload(tc, ex); cur_op += 4; goto NEXT; } OP(getexcategory): { GET_REG(cur_op, 0).i64 = MVM_get_exception_category(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; } OP(throwdyn): { MVMRegister *rr = &GET_REG(cur_op, 0); MVMObject *ex_obj = GET_REG(cur_op, 2).o; cur_op += 4; MVM_exception_throwobj(tc, MVM_EX_THROW_DYN, ex_obj, rr); goto NEXT; } OP(throwlex): { MVMRegister *rr = &GET_REG(cur_op, 0); MVMObject *ex_obj = GET_REG(cur_op, 2).o; cur_op += 4; MVM_exception_throwobj(tc, MVM_EX_THROW_LEX, ex_obj, rr); goto NEXT; } OP(throwlexotic): { MVMRegister *rr = &GET_REG(cur_op, 0); MVMObject *ex_obj = GET_REG(cur_op, 2).o; cur_op += 4; MVM_exception_throwobj(tc, MVM_EX_THROW_LEXOTIC, ex_obj, rr); goto NEXT; } OP(throwcatdyn): { MVMRegister *rr = &GET_REG(cur_op, 0); MVMuint32 cat = (MVMuint32)MVM_BC_get_I64(cur_op, 2); cur_op += 4; MVM_exception_throwcat(tc, MVM_EX_THROW_DYN, cat, rr); goto NEXT; } OP(throwcatlex): { MVMRegister *rr = &GET_REG(cur_op, 0); MVMuint32 cat = (MVMuint32)MVM_BC_get_I64(cur_op, 2); cur_op += 4; MVM_exception_throwcat(tc, MVM_EX_THROW_LEX, cat, rr); goto NEXT; } OP(throwcatlexotic): { MVMRegister *rr = &GET_REG(cur_op, 0); MVMuint32 cat = (MVMuint32)MVM_BC_get_I64(cur_op, 2); cur_op += 4; MVM_exception_throwcat(tc, MVM_EX_THROW_LEXOTIC, cat, rr); goto NEXT; } OP(die): { MVMRegister *rr = &GET_REG(cur_op, 0); MVMString *str = GET_REG(cur_op, 2).s; cur_op += 4; MVM_exception_die(tc, str, rr); goto NEXT; } OP(rethrow): { MVM_exception_throwobj(tc, MVM_EX_THROW_DYN, GET_REG(cur_op, 0).o, NULL); goto NEXT; } OP(resume): /* Expect that resume will set the PC, so don't update cur_op * here. */ MVM_exception_resume(tc, GET_REG(cur_op, 0).o); goto NEXT; OP(takehandlerresult): { GET_REG(cur_op, 0).o = tc->last_handler_result ? tc->last_handler_result : tc->instance->VMNull; tc->last_handler_result = NULL; cur_op += 2; goto NEXT; } OP(backtracestrings): GET_REG(cur_op, 0).o = MVM_exception_backtrace_strings(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(usecapture): GET_REG(cur_op, 0).o = MVM_args_use_capture(tc, tc->cur_frame); cur_op += 2; goto NEXT; OP(savecapture): { /* Create a new call capture object. */ GET_REG(cur_op, 0).o = MVM_args_save_capture(tc, tc->cur_frame); cur_op += 2; goto NEXT; } OP(captureposelems): { MVMObject *obj = GET_REG(cur_op, 2).o; if (IS_CONCRETE(obj) && REPR(obj)->ID == MVM_REPR_ID_MVMCallCapture) { MVMCallCapture *cc = (MVMCallCapture *)obj; GET_REG(cur_op, 0).i64 = cc->body.apc->num_pos; } else { MVM_exception_throw_adhoc(tc, "captureposelems needs a MVMCallCapture"); } cur_op += 4; goto NEXT; } OP(captureposarg): { MVMObject *obj = GET_REG(cur_op, 2).o; if (IS_CONCRETE(obj) && REPR(obj)->ID == MVM_REPR_ID_MVMCallCapture) { MVMCallCapture *cc = (MVMCallCapture *)obj; GET_REG(cur_op, 0).o = MVM_args_get_required_pos_obj(tc, cc->body.apc, (MVMuint32)GET_REG(cur_op, 4).i64); } else { MVM_exception_throw_adhoc(tc, "captureposarg needs a MVMCallCapture"); } cur_op += 6; goto NEXT; } OP(captureposarg_i): { MVMObject *obj = GET_REG(cur_op, 2).o; if (IS_CONCRETE(obj) && REPR(obj)->ID == MVM_REPR_ID_MVMCallCapture) { MVMCallCapture *cc = (MVMCallCapture *)obj; GET_REG(cur_op, 0).i64 = MVM_args_get_required_pos_int(tc, cc->body.apc, (MVMuint32)GET_REG(cur_op, 4).i64); } else { MVM_exception_throw_adhoc(tc, "captureposarg_i needs a MVMCallCapture"); } cur_op += 6; goto NEXT; } OP(captureposarg_n): { MVMObject *obj = GET_REG(cur_op, 2).o; if (IS_CONCRETE(obj) && REPR(obj)->ID == MVM_REPR_ID_MVMCallCapture) { MVMCallCapture *cc = (MVMCallCapture *)obj; GET_REG(cur_op, 0).n64 = MVM_args_get_pos_num(tc, cc->body.apc, (MVMuint32)GET_REG(cur_op, 4).i64, MVM_ARG_REQUIRED).arg.n64; } else { MVM_exception_throw_adhoc(tc, "captureposarg_n needs a MVMCallCapture"); } cur_op += 6; goto NEXT; } OP(captureposarg_s): { MVMObject *obj = GET_REG(cur_op, 2).o; if (IS_CONCRETE(obj) && REPR(obj)->ID == MVM_REPR_ID_MVMCallCapture) { MVMCallCapture *cc = (MVMCallCapture *)obj; GET_REG(cur_op, 0).s = MVM_args_get_required_pos_str(tc, cc->body.apc, (MVMuint32)GET_REG(cur_op, 4).i64); } else { MVM_exception_throw_adhoc(tc, "captureposarg_s needs a MVMCallCapture"); } cur_op += 6; goto NEXT; } OP(captureposprimspec): { MVMObject *obj = GET_REG(cur_op, 2).o; MVMint64 i = GET_REG(cur_op, 4).i64; if (IS_CONCRETE(obj) && REPR(obj)->ID == MVM_REPR_ID_MVMCallCapture) { MVMCallCapture *cc = (MVMCallCapture *)obj; if (i >= 0 && i < cc->body.apc->num_pos) { MVMCallsiteEntry *arg_flags = cc->body.apc->arg_flags ? cc->body.apc->arg_flags : cc->body.apc->callsite->arg_flags; switch (arg_flags[i] & MVM_CALLSITE_ARG_MASK) { case MVM_CALLSITE_ARG_INT: GET_REG(cur_op, 0).i64 = MVM_STORAGE_SPEC_BP_INT; break; case MVM_CALLSITE_ARG_NUM: GET_REG(cur_op, 0).i64 = MVM_STORAGE_SPEC_BP_NUM; break; case MVM_CALLSITE_ARG_STR: GET_REG(cur_op, 0).i64 = MVM_STORAGE_SPEC_BP_STR; break; default: GET_REG(cur_op, 0).i64 = MVM_STORAGE_SPEC_BP_NONE; break; } } else { MVM_exception_throw_adhoc(tc, "Bad argument index given to captureposprimspec"); } } else { MVM_exception_throw_adhoc(tc, "captureposprimspec needs a MVMCallCapture"); } cur_op += 6; goto NEXT; } OP(captureexistsnamed): { MVMObject *obj = GET_REG(cur_op, 2).o; if (IS_CONCRETE(obj) && REPR(obj)->ID == MVM_REPR_ID_MVMCallCapture) { MVMCallCapture *cc = (MVMCallCapture *)obj; GET_REG(cur_op, 0).i64 = MVM_args_has_named(tc, cc->body.apc, GET_REG(cur_op, 4).s); } else { MVM_exception_throw_adhoc(tc, "captureexistsnamed needs a MVMCallCapture"); } cur_op += 6; goto NEXT; } OP(capturehasnameds): { MVMObject *obj = GET_REG(cur_op, 2).o; if (IS_CONCRETE(obj) && REPR(obj)->ID == MVM_REPR_ID_MVMCallCapture) { /* If positionals count doesn't match arg count, we must * have some named args. */ MVMCallCapture *cc = (MVMCallCapture *)obj; GET_REG(cur_op, 0).i64 = cc->body.apc->arg_count != cc->body.apc->num_pos; } else { MVM_exception_throw_adhoc(tc, "capturehasnameds needs a MVMCallCapture"); } cur_op += 4; goto NEXT; } OP(invokewithcapture): { MVMObject *cobj = GET_REG(cur_op, 4).o; if (IS_CONCRETE(cobj) && REPR(cobj)->ID == MVM_REPR_ID_MVMCallCapture) { MVMObject *code = GET_REG(cur_op, 2).o; MVMCallCapture *cc = (MVMCallCapture *)cobj; MVMFrameExtra *e = MVM_frame_extra(tc, tc->cur_frame); code = MVM_frame_find_invokee(tc, code, NULL); tc->cur_frame->return_value = &GET_REG(cur_op, 0); tc->cur_frame->return_type = MVM_RETURN_OBJ; cur_op += 6; tc->cur_frame->return_address = cur_op; MVMROOT(tc, cobj, { STABLE(code)->invoke(tc, code, cc->body.apc->callsite, cc->body.apc->args); }); if (MVM_FRAME_IS_ON_CALLSTACK(tc, tc->cur_frame)) { e->invoked_call_capture = cobj; } else { MVM_ASSIGN_REF(tc, &(tc->cur_frame->header), e->invoked_call_capture, cobj); } goto NEXT; } else { MVM_exception_throw_adhoc(tc, "invokewithcapture needs a MVMCallCapture"); } } OP(multicacheadd): GET_REG(cur_op, 0).o = MVM_multi_cache_add(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).o); cur_op += 8; goto NEXT; OP(multicachefind): GET_REG(cur_op, 0).o = MVM_multi_cache_find(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 6; goto NEXT; OP(null_s): GET_REG(cur_op, 0).s = NULL; cur_op += 2; goto NEXT; OP(isnull_s): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).s ? 0 : 1; cur_op += 4; goto NEXT; OP(eq_s): GET_REG(cur_op, 0).i64 = MVM_string_equal(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; OP(ne_s): GET_REG(cur_op, 0).i64 = (MVMint64)(MVM_string_equal(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s)? 0 : 1); cur_op += 6; goto NEXT; OP(gt_s): GET_REG(cur_op, 0).i64 = MVM_string_compare(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s) == 1; cur_op += 6; goto NEXT; OP(ge_s): GET_REG(cur_op, 0).i64 = MVM_string_compare(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s) >= 0; cur_op += 6; goto NEXT; OP(lt_s): GET_REG(cur_op, 0).i64 = MVM_string_compare(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s) == -1; cur_op += 6; goto NEXT; OP(le_s): GET_REG(cur_op, 0).i64 = MVM_string_compare(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s) <= 0; cur_op += 6; goto NEXT; OP(cmp_s): GET_REG(cur_op, 0).i64 = MVM_string_compare(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; OP(unicmp_s): GET_REG(cur_op, 0).i64 = MVM_unicode_string_compare(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).i64, GET_REG(cur_op, 10).i64); cur_op += 12; goto NEXT; OP(eqat_s): GET_REG(cur_op, 0).i64 = MVM_string_equal_at(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(eqatic_s): GET_REG(cur_op, 0).i64 = MVM_string_equal_at_ignore_case(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(eqaticim_s): GET_REG(cur_op, 0).i64 = MVM_string_equal_at_ignore_case_ignore_mark(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(haveat_s): GET_REG(cur_op, 0).i64 = MVM_string_have_at(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).s, GET_REG(cur_op, 10).i64); cur_op += 12; goto NEXT; OP(concat_s): GET_REG(cur_op, 0).s = MVM_string_concatenate(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; OP(repeat_s): GET_REG(cur_op, 0).s = MVM_string_repeat(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(substr_s): GET_REG(cur_op, 0).s = MVM_string_substring(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(index_s): GET_REG(cur_op, 0).i64 = MVM_string_index(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(indexic_s): GET_REG(cur_op, 0).i64 = MVM_string_index_ignore_case(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(indexicim_s): GET_REG(cur_op, 0).i64 = MVM_string_index_ignore_case_ignore_mark(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(graphs_s): GET_REG(cur_op, 0).i64 = MVM_string_graphs(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(codes_s): GET_REG(cur_op, 0).i64 = MVM_string_codes(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(getcp_s): GET_REG(cur_op, 0).i64 = MVM_string_get_grapheme_at(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(indexcp_s): GET_REG(cur_op, 0).i64 = MVM_string_index_of_grapheme(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(uc): GET_REG(cur_op, 0).s = MVM_string_uc(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(lc): GET_REG(cur_op, 0).s = MVM_string_lc(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(tc): GET_REG(cur_op, 0).s = MVM_string_tc(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(split): GET_REG(cur_op, 0).o = MVM_string_split(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; OP(join): GET_REG(cur_op, 0).s = MVM_string_join(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).o); cur_op += 6; goto NEXT; OP(getcpbyname): GET_REG(cur_op, 0).i64 = MVM_unicode_lookup_by_name(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(getstrfromname): GET_REG(cur_op, 0).s = MVM_unicode_string_from_name(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(indexat): /* branches on *failure* to match in the constant string, to save an instruction in regexes */ if (MVM_string_char_at_in_string(tc, GET_REG(cur_op, 0).s, GET_REG(cur_op, 2).i64, MVM_cu_string(tc, cu, GET_UI32(cur_op, 4))) >= 0) cur_op += 12; else cur_op = bytecode_start + GET_UI32(cur_op, 8); GC_SYNC_POINT(tc); goto NEXT; OP(indexnat): /* branches on *failure* to match in the constant string, to save an instruction in regexes */ if (MVM_string_char_at_in_string(tc, GET_REG(cur_op, 0).s, GET_REG(cur_op, 2).i64, MVM_cu_string(tc, cu, GET_UI32(cur_op, 4))) == -1) cur_op += 12; else cur_op = bytecode_start + GET_UI32(cur_op, 8); GC_SYNC_POINT(tc); goto NEXT; OP(unipropcode): GET_REG(cur_op, 0).i64 = (MVMint64)MVM_unicode_name_to_property_code(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(unipvalcode): GET_REG(cur_op, 0).i64 = (MVMint64)MVM_unicode_name_to_property_value_code(tc, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; OP(hasuniprop): GET_REG(cur_op, 0).i64 = MVM_string_offset_has_unicode_property_value(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).i64); cur_op += 10; goto NEXT; OP(hasunipropc): GET_REG(cur_op, 0).i64 = MVM_string_offset_has_unicode_property_value(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64, (MVMint64)GET_UI16(cur_op, 6), (MVMint64)GET_UI16(cur_op, 8)); cur_op += 10; goto NEXT; OP(chars): GET_REG(cur_op, 0).i64 = MVM_string_graphs(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(chr): GET_REG(cur_op, 0).s = MVM_string_chr(tc, (MVMCodepoint)GET_REG(cur_op, 2).i64); cur_op += 4; goto NEXT; OP(ordfirst): { GET_REG(cur_op, 0).i64 = MVM_string_ord_at(tc, GET_REG(cur_op, 2).s, 0); cur_op += 4; goto NEXT; } OP(ordat): { GET_REG(cur_op, 0).i64 = MVM_string_ord_at(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; } OP(rindexfrom): GET_REG(cur_op, 0).i64 = MVM_string_index_from_end(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(escape): GET_REG(cur_op, 0).s = MVM_string_escape(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(flip): GET_REG(cur_op, 0).s = MVM_string_flip(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(setbuffersize_fh): MVM_io_set_buffer_size(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).i64); cur_op += 4; goto NEXT; OP(iscclass): GET_REG(cur_op, 0).i64 = MVM_string_is_cclass(tc, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(findcclass): GET_REG(cur_op, 0).i64 = MVM_string_find_cclass(tc, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).i64); cur_op += 10; goto NEXT; OP(findnotcclass): GET_REG(cur_op, 0).i64 = MVM_string_find_not_cclass(tc, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).i64); cur_op += 10; goto NEXT; OP(nfafromstatelist): GET_REG(cur_op, 0).o = MVM_nfa_from_statelist(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 6; goto NEXT; OP(nfarunproto): GET_REG(cur_op, 0).o = MVM_nfa_run_proto(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(nfarunalt): MVM_nfa_run_alt(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).o, GET_REG(cur_op, 8).o, GET_REG(cur_op, 10).o); cur_op += 12; goto NEXT; OP(radix): GET_REG(cur_op, 0).o = MVM_radix(tc, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).i64); cur_op += 10; goto NEXT; OP(encode): GET_REG(cur_op, 0).o = MVM_string_encode_to_buf(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).o, NULL); cur_op += 8; goto NEXT; OP(decode): GET_REG(cur_op, 0).s = MVM_string_decode_from_buf(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; OP(istrue_s): GET_REG(cur_op, 0).i64 = MVM_coerce_istrue_s(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(isfalse_s): GET_REG(cur_op, 0).i64 = MVM_coerce_istrue_s(tc, GET_REG(cur_op, 2).s) ? 0 : 1; cur_op += 4; goto NEXT; OP(null): GET_REG(cur_op, 0).o = tc->instance->VMNull; cur_op += 2; goto NEXT; OP(isnull): { MVMObject *obj = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).i64 = MVM_is_null(tc, obj); cur_op += 4; goto NEXT; } OP(ifnonnull): if (MVM_is_null(tc, GET_REG(cur_op, 0).o)) cur_op += 6; else cur_op = bytecode_start + GET_UI32(cur_op, 2); GC_SYNC_POINT(tc); goto NEXT; OP(findmeth): { /* Increment PC first, as we may make a method call. */ MVMRegister *res = &GET_REG(cur_op, 0); MVMObject *obj = GET_REG(cur_op, 2).o; MVMString *name = MVM_cu_string(tc, cu, GET_UI32(cur_op, 4)); cur_op += 8; MVM_6model_find_method(tc, obj, name, res, 1); goto NEXT; } OP(findmeth_s): { /* Increment PC first, as we may make a method call. */ MVMRegister *res = &GET_REG(cur_op, 0); MVMObject *obj = GET_REG(cur_op, 2).o; MVMString *name = GET_REG(cur_op, 4).s; cur_op += 6; MVM_6model_find_method(tc, obj, name, res, 1); goto NEXT; } OP(can): { /* Increment PC first, as we may make a method call. */ MVMRegister *res = &GET_REG(cur_op, 0); MVMObject *obj = GET_REG(cur_op, 2).o; MVMString *name = MVM_cu_string(tc, cu, GET_UI32(cur_op, 4)); cur_op += 8; MVM_6model_can_method(tc, obj, name, res); goto NEXT; } OP(can_s): { /* Increment PC first, as we may make a method call. */ MVMRegister *res = &GET_REG(cur_op, 0); MVMObject *obj = GET_REG(cur_op, 2).o; MVMString *name = GET_REG(cur_op, 4).s; cur_op += 6; MVM_6model_can_method(tc, obj, name, res); goto NEXT; } OP(create): { /* Ordering here matters. We write the object into the * register before calling initialize. This is because * if initialize allocates, obj may have moved after * we called it. Note that type is never used after * the initial allocate call also. This saves us having * to put things on the temporary stack. The GC will * know to update it in the register if it moved. */ MVMObject *type = GET_REG(cur_op, 2).o; MVMObject *obj = REPR(type)->allocate(tc, STABLE(type)); GET_REG(cur_op, 0).o = obj; if (REPR(obj)->initialize) REPR(obj)->initialize(tc, STABLE(obj), obj, OBJECT_BODY(obj)); cur_op += 4; goto NEXT; } OP(clone): { MVMObject *value = GET_REG(cur_op, 2).o; if (IS_CONCRETE(value)) { MVMROOT(tc, value, { MVMObject *cloned = REPR(value)->allocate(tc, STABLE(value)); /* Ordering here matters. We write the object into the * register before calling copy_to. This is because * if copy_to allocates, obj may have moved after * we called it. This saves us having to put things on * the temporary stack. The GC will know to update it * in the register if it moved. */ GET_REG(cur_op, 0).o = cloned; REPR(value)->copy_to(tc, STABLE(value), OBJECT_BODY(value), cloned, OBJECT_BODY(cloned)); }); } else { GET_REG(cur_op, 0).o = value; } cur_op += 4; goto NEXT; } OP(isconcrete): { MVMObject *obj = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).i64 = obj && IS_CONCRETE(obj) ? 1 : 0; cur_op += 4; goto NEXT; } OP(rebless): if (!REPR(GET_REG(cur_op, 2).o)->change_type) { MVM_exception_throw_adhoc(tc, "This REPR cannot change type"); } REPR(GET_REG(cur_op, 2).o)->change_type(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); GET_REG(cur_op, 0).o = GET_REG(cur_op, 2).o; MVM_SC_WB_OBJ(tc, GET_REG(cur_op, 0).o); cur_op += 6; MVM_spesh_deopt_all(tc); goto NEXT; OP(istype): { /* Increment PC first, as we may make a method call. */ MVMRegister *res = &GET_REG(cur_op, 0); MVMObject *obj = GET_REG(cur_op, 2).o; MVMObject *type = GET_REG(cur_op, 4).o; cur_op += 6; MVM_6model_istype(tc, obj, type, res); goto NEXT; } OP(objprimspec): { MVMObject *type = GET_REG(cur_op, 2).o; if (type) { const MVMStorageSpec *ss = REPR(type)->get_storage_spec(tc, STABLE(type)); GET_REG(cur_op, 0).i64 = ss->boxed_primitive; } else { GET_REG(cur_op, 0).i64 = 0; } cur_op += 4; goto NEXT; } OP(gethow): GET_REG(cur_op, 0).o = MVM_6model_get_how(tc, STABLE(GET_REG(cur_op, 2).o)); cur_op += 4; goto NEXT; OP(getwhat): GET_REG(cur_op, 0).o = STABLE(GET_REG(cur_op, 2).o)->WHAT; cur_op += 4; goto NEXT; OP(getwho): { MVMObject *who = STABLE(GET_REG(cur_op, 2).o)->WHO; GET_REG(cur_op, 0).o = who ? who : tc->instance->VMNull; cur_op += 4; goto NEXT; } OP(setwho): { MVMSTable *st = STABLE(GET_REG(cur_op, 2).o); MVM_ASSIGN_REF(tc, &(st->header), st->WHO, GET_REG(cur_op, 4).o); GET_REG(cur_op, 0).o = GET_REG(cur_op, 2).o; cur_op += 6; goto NEXT; } OP(reprname): { const MVMREPROps *repr = REPR(GET_REG(cur_op, 2).o); GET_REG(cur_op, 0).s = tc->instance->repr_list[repr->ID]->name; cur_op += 4; goto NEXT; } OP(getwhere): GET_REG(cur_op, 0).i64 = (MVMint64)GET_REG(cur_op, 2).o; cur_op += 4; goto NEXT; OP(eqaddr): GET_REG(cur_op, 0).i64 = GET_REG(cur_op, 2).o == GET_REG(cur_op, 4).o ? 1 : 0; cur_op += 6; goto NEXT; OP(bindattr_i): { MVMObject *obj = GET_REG(cur_op, 0).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot bind attributes in a %s type object", MVM_6model_get_debug_name(tc, obj)); REPR(obj)->attr_funcs.bind_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2).o, MVM_cu_string(tc, cu, GET_UI32(cur_op, 4)), GET_I16(cur_op, 10), GET_REG(cur_op, 8), MVM_reg_int64); MVM_SC_WB_OBJ(tc, obj); cur_op += 12; goto NEXT; } OP(bindattr_n): { MVMObject *obj = GET_REG(cur_op, 0).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot bind attributes in a %s type object", MVM_6model_get_debug_name(tc, obj)); REPR(obj)->attr_funcs.bind_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2).o, MVM_cu_string(tc, cu, GET_UI32(cur_op, 4)), GET_I16(cur_op, 10), GET_REG(cur_op, 8), MVM_reg_num64); MVM_SC_WB_OBJ(tc, obj); cur_op += 12; goto NEXT; } OP(bindattr_s): { MVMObject *obj = GET_REG(cur_op, 0).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot bind attributes in a %s type object", MVM_6model_get_debug_name(tc, obj)); REPR(obj)->attr_funcs.bind_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2).o, MVM_cu_string(tc, cu, GET_UI32(cur_op, 4)), GET_I16(cur_op, 10), GET_REG(cur_op, 8), MVM_reg_str); MVM_SC_WB_OBJ(tc, obj); cur_op += 12; goto NEXT; } OP(bindattr_o): { MVMObject *obj = GET_REG(cur_op, 0).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot bind attributes in a %s type object", MVM_6model_get_debug_name(tc, obj)); REPR(obj)->attr_funcs.bind_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2).o, MVM_cu_string(tc, cu, GET_UI32(cur_op, 4)), GET_I16(cur_op, 10), GET_REG(cur_op, 8), MVM_reg_obj); MVM_SC_WB_OBJ(tc, obj); cur_op += 12; goto NEXT; } OP(bindattrs_i): { MVMObject *obj = GET_REG(cur_op, 0).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot bind attributes in a %s type object", MVM_6model_get_debug_name(tc, obj)); REPR(obj)->attr_funcs.bind_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).s, -1, GET_REG(cur_op, 6), MVM_reg_int64); MVM_SC_WB_OBJ(tc, obj); cur_op += 8; goto NEXT; } OP(bindattrs_n): { MVMObject *obj = GET_REG(cur_op, 0).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot bind attributes in a %s type object", MVM_6model_get_debug_name(tc, obj)); REPR(obj)->attr_funcs.bind_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).s, -1, GET_REG(cur_op, 6), MVM_reg_num64); MVM_SC_WB_OBJ(tc, obj); cur_op += 8; goto NEXT; } OP(bindattrs_s): { MVMObject *obj = GET_REG(cur_op, 0).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot bind attributes in a %s type object", MVM_6model_get_debug_name(tc, obj)); REPR(obj)->attr_funcs.bind_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).s, -1, GET_REG(cur_op, 6), MVM_reg_str); MVM_SC_WB_OBJ(tc, obj); cur_op += 8; goto NEXT; } OP(bindattrs_o): { MVMObject *obj = GET_REG(cur_op, 0).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot bind attributes in a %s type object", MVM_6model_get_debug_name(tc, obj)); REPR(obj)->attr_funcs.bind_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).s, -1, GET_REG(cur_op, 6), MVM_reg_obj); MVM_SC_WB_OBJ(tc, obj); cur_op += 8; goto NEXT; } OP(getattr_i): { MVMObject *obj = GET_REG(cur_op, 2).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot look up attributes in a %s type object", MVM_6model_get_debug_name(tc, obj)); REPR(obj)->attr_funcs.get_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 4).o, MVM_cu_string(tc, cu, GET_UI32(cur_op, 6)), GET_I16(cur_op, 10), &GET_REG(cur_op, 0), MVM_reg_int64); cur_op += 12; goto NEXT; } OP(getattr_n): { MVMObject *obj = GET_REG(cur_op, 2).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot look up attributes in a %s type object", MVM_6model_get_debug_name(tc, obj)); REPR(obj)->attr_funcs.get_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 4).o, MVM_cu_string(tc, cu, GET_UI32(cur_op, 6)), GET_I16(cur_op, 10), &GET_REG(cur_op, 0), MVM_reg_num64); cur_op += 12; goto NEXT; } OP(getattr_s): { MVMObject *obj = GET_REG(cur_op, 2).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot look up attributes in a %s type object", MVM_6model_get_debug_name(tc, obj)); REPR(obj)->attr_funcs.get_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 4).o, MVM_cu_string(tc, cu, GET_UI32(cur_op, 6)), GET_I16(cur_op, 10), &GET_REG(cur_op, 0), MVM_reg_str); cur_op += 12; goto NEXT; } OP(getattr_o): { MVMObject *obj = GET_REG(cur_op, 2).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot look up attributes in a %s type object", MVM_6model_get_debug_name(tc, obj)); REPR(obj)->attr_funcs.get_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 4).o, MVM_cu_string(tc, cu, GET_UI32(cur_op, 6)), GET_I16(cur_op, 10), &GET_REG(cur_op, 0), MVM_reg_obj); if (MVM_spesh_log_is_logging(tc)) MVM_spesh_log_type(tc, GET_REG(cur_op, 0).o); cur_op += 12; goto NEXT; } OP(getattrs_i): { MVMObject *obj = GET_REG(cur_op, 2).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot look up attributes in a %s type object", MVM_6model_get_debug_name(tc, obj)); REPR(obj)->attr_funcs.get_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).s, -1, &GET_REG(cur_op, 0), MVM_reg_int64); cur_op += 8; goto NEXT; } OP(getattrs_n): { MVMObject *obj = GET_REG(cur_op, 2).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot look up attributes in a %s type object", MVM_6model_get_debug_name(tc, obj)); REPR(obj)->attr_funcs.get_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).s, -1, &GET_REG(cur_op, 0), MVM_reg_num64); cur_op += 8; goto NEXT; } OP(getattrs_s): { MVMObject *obj = GET_REG(cur_op, 2).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot look up attributes in a %s type object", MVM_6model_get_debug_name(tc, obj)); REPR(obj)->attr_funcs.get_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).s, -1, &GET_REG(cur_op, 0), MVM_reg_str); cur_op += 8; goto NEXT; } OP(getattrs_o): { MVMObject *obj = GET_REG(cur_op, 2).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot look up attributes in a %s type object", MVM_6model_get_debug_name(tc, obj)); REPR(obj)->attr_funcs.get_attribute(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).s, -1, &GET_REG(cur_op, 0), MVM_reg_obj); if (MVM_spesh_log_is_logging(tc)) MVM_spesh_log_type(tc, GET_REG(cur_op, 0).o); cur_op += 8; goto NEXT; } OP(attrinited): { MVMObject *obj = GET_REG(cur_op, 2).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot look up attributes in a %s type object", MVM_6model_get_debug_name(tc, obj)); GET_REG(cur_op, 0).i64 = REPR(obj)->attr_funcs.is_attribute_initialized(tc, STABLE(obj), OBJECT_BODY(obj), GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).s, MVM_NO_HINT); cur_op += 8; goto NEXT; } OP(box_i): { MVM_box_int(tc, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).o, &GET_REG(cur_op, 0)); cur_op += 6; goto NEXT; } OP(box_n): { MVM_box_num(tc, GET_REG(cur_op, 2).n64, GET_REG(cur_op, 4).o, &GET_REG(cur_op, 0)); cur_op += 6; goto NEXT; } OP(box_s): { MVM_box_str(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).o, &GET_REG(cur_op, 0)); cur_op += 6; goto NEXT; } OP(unbox_i): { MVMObject *obj = GET_REG(cur_op, 2).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot unbox a type object (%s) to an int.", MVM_6model_get_debug_name(tc, obj)); GET_REG(cur_op, 0).i64 = REPR(obj)->box_funcs.get_int(tc, STABLE(obj), obj, OBJECT_BODY(obj)); cur_op += 4; goto NEXT; } OP(unbox_n): { MVMObject *obj = GET_REG(cur_op, 2).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot unbox a type object (%s) to a num.", MVM_6model_get_debug_name(tc, obj)); GET_REG(cur_op, 0).n64 = REPR(obj)->box_funcs.get_num(tc, STABLE(obj), obj, OBJECT_BODY(obj)); cur_op += 4; goto NEXT; } OP(unbox_s): { MVMObject *obj = GET_REG(cur_op, 2).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot unbox a type object (%s) to a str.", MVM_6model_get_debug_name(tc, obj)); GET_REG(cur_op, 0).s = REPR(obj)->box_funcs.get_str(tc, STABLE(obj), obj, OBJECT_BODY(obj)); cur_op += 4; goto NEXT; } OP(atpos_i): { MVMObject *obj = GET_REG(cur_op, 2).o; REPR(obj)->pos_funcs.at_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 4).i64, &GET_REG(cur_op, 0), MVM_reg_int64); cur_op += 6; goto NEXT; } OP(atpos_n): { MVMObject *obj = GET_REG(cur_op, 2).o; REPR(obj)->pos_funcs.at_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 4).i64, &GET_REG(cur_op, 0), MVM_reg_num64); cur_op += 6; goto NEXT; } OP(atpos_s): { MVMObject *obj = GET_REG(cur_op, 2).o; REPR(obj)->pos_funcs.at_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 4).i64, &GET_REG(cur_op, 0), MVM_reg_str); cur_op += 6; goto NEXT; } OP(atpos_o): { MVMObject *obj = GET_REG(cur_op, 2).o; if (IS_CONCRETE(obj)) REPR(obj)->pos_funcs.at_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 4).i64, &GET_REG(cur_op, 0), MVM_reg_obj); else GET_REG(cur_op, 0).o = tc->instance->VMNull; cur_op += 6; goto NEXT; } OP(bindpos_i): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->pos_funcs.bind_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4), MVM_reg_int64); MVM_SC_WB_OBJ(tc, obj); cur_op += 6; goto NEXT; } OP(bindpos_n): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->pos_funcs.bind_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4), MVM_reg_num64); MVM_SC_WB_OBJ(tc, obj); cur_op += 6; goto NEXT; } OP(bindpos_s): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->pos_funcs.bind_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4), MVM_reg_str); MVM_SC_WB_OBJ(tc, obj); cur_op += 6; goto NEXT; } OP(bindpos_o): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->pos_funcs.bind_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4), MVM_reg_obj); MVM_SC_WB_OBJ(tc, obj); cur_op += 6; goto NEXT; } OP(push_i): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->pos_funcs.push(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2), MVM_reg_int64); MVM_SC_WB_OBJ(tc, GET_REG(cur_op, 0).o); cur_op += 4; goto NEXT; } OP(push_n): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->pos_funcs.push(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2), MVM_reg_num64); MVM_SC_WB_OBJ(tc, GET_REG(cur_op, 0).o); cur_op += 4; goto NEXT; } OP(push_s): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->pos_funcs.push(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2), MVM_reg_str); MVM_SC_WB_OBJ(tc, GET_REG(cur_op, 0).o); cur_op += 4; goto NEXT; } OP(push_o): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->pos_funcs.push(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2), MVM_reg_obj); MVM_SC_WB_OBJ(tc, GET_REG(cur_op, 0).o); cur_op += 4; goto NEXT; } OP(pop_i): { MVMObject *obj = GET_REG(cur_op, 2).o; REPR(obj)->pos_funcs.pop(tc, STABLE(obj), obj, OBJECT_BODY(obj), &GET_REG(cur_op, 0), MVM_reg_int64); cur_op += 4; goto NEXT; } OP(pop_n): { MVMObject *obj = GET_REG(cur_op, 2).o; REPR(obj)->pos_funcs.pop(tc, STABLE(obj), obj, OBJECT_BODY(obj), &GET_REG(cur_op, 0), MVM_reg_num64); cur_op += 4; goto NEXT; } OP(pop_s): { MVMObject *obj = GET_REG(cur_op, 2).o; REPR(obj)->pos_funcs.pop(tc, STABLE(obj), obj, OBJECT_BODY(obj), &GET_REG(cur_op, 0), MVM_reg_str); cur_op += 4; goto NEXT; } OP(pop_o): { MVMObject *obj = GET_REG(cur_op, 2).o; REPR(obj)->pos_funcs.pop(tc, STABLE(obj), obj, OBJECT_BODY(obj), &GET_REG(cur_op, 0), MVM_reg_obj); cur_op += 4; goto NEXT; } OP(shift_i): { MVMObject *obj = GET_REG(cur_op, 2).o; REPR(obj)->pos_funcs.shift(tc, STABLE(obj), obj, OBJECT_BODY(obj), &GET_REG(cur_op, 0), MVM_reg_int64); cur_op += 4; goto NEXT; } OP(shift_n): { MVMObject *obj = GET_REG(cur_op, 2).o; REPR(obj)->pos_funcs.shift(tc, STABLE(obj), obj, OBJECT_BODY(obj), &GET_REG(cur_op, 0), MVM_reg_num64); cur_op += 4; goto NEXT; } OP(shift_s): { MVMObject *obj = GET_REG(cur_op, 2).o; REPR(obj)->pos_funcs.shift(tc, STABLE(obj), obj, OBJECT_BODY(obj), &GET_REG(cur_op, 0), MVM_reg_str); cur_op += 4; goto NEXT; } OP(shift_o): { MVMObject *obj = GET_REG(cur_op, 2).o; REPR(obj)->pos_funcs.shift(tc, STABLE(obj), obj, OBJECT_BODY(obj), &GET_REG(cur_op, 0), MVM_reg_obj); cur_op += 4; goto NEXT; } OP(unshift_i): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->pos_funcs.unshift(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2), MVM_reg_int64); cur_op += 4; goto NEXT; } OP(unshift_n): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->pos_funcs.unshift(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2), MVM_reg_num64); cur_op += 4; goto NEXT; } OP(unshift_s): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->pos_funcs.unshift(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2), MVM_reg_str); cur_op += 4; goto NEXT; } OP(unshift_o): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->pos_funcs.unshift(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2), MVM_reg_obj); cur_op += 4; goto NEXT; } OP(splice): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->pos_funcs.splice(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; } OP(setelemspos): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->pos_funcs.set_elems(tc, STABLE(obj), obj, OBJECT_BODY(obj), GET_REG(cur_op, 2).i64); cur_op += 4; goto NEXT; } OP(existspos): GET_REG(cur_op, 0).i64 = MVM_repr_exists_pos(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(atkey_i): { MVMObject *obj = GET_REG(cur_op, 2).o; REPR(obj)->ass_funcs.at_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)GET_REG(cur_op, 4).s, &GET_REG(cur_op, 0), MVM_reg_int64); cur_op += 6; goto NEXT; } OP(atkey_n): { MVMObject *obj = GET_REG(cur_op, 2).o; REPR(obj)->ass_funcs.at_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)GET_REG(cur_op, 4).s, &GET_REG(cur_op, 0), MVM_reg_num64); cur_op += 6; goto NEXT; } OP(atkey_s): { MVMObject *obj = GET_REG(cur_op, 2).o; REPR(obj)->ass_funcs.at_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)GET_REG(cur_op, 4).s, &GET_REG(cur_op, 0), MVM_reg_str); cur_op += 6; goto NEXT; } OP(atkey_o): { MVMObject *obj = GET_REG(cur_op, 2).o; if (IS_CONCRETE(obj)) REPR(obj)->ass_funcs.at_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)GET_REG(cur_op, 4).s, &GET_REG(cur_op, 0), MVM_reg_obj); else GET_REG(cur_op, 0).o = tc->instance->VMNull; cur_op += 6; goto NEXT; } OP(bindkey_i): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->ass_funcs.bind_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)GET_REG(cur_op, 2).s, GET_REG(cur_op, 4), MVM_reg_int64); MVM_SC_WB_OBJ(tc, obj); cur_op += 6; goto NEXT; } OP(bindkey_n): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->ass_funcs.bind_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)GET_REG(cur_op, 2).s, GET_REG(cur_op, 4), MVM_reg_num64); MVM_SC_WB_OBJ(tc, obj); cur_op += 6; goto NEXT; } OP(bindkey_s): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->ass_funcs.bind_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)GET_REG(cur_op, 2).s, GET_REG(cur_op, 4), MVM_reg_str); MVM_SC_WB_OBJ(tc, obj); cur_op += 6; goto NEXT; } OP(bindkey_o): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->ass_funcs.bind_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)GET_REG(cur_op, 2).s, GET_REG(cur_op, 4), MVM_reg_obj); MVM_SC_WB_OBJ(tc, obj); cur_op += 6; goto NEXT; } OP(existskey): { MVMObject *obj = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).i64 = REPR(obj)->ass_funcs.exists_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; } OP(deletekey): { MVMObject *obj = GET_REG(cur_op, 0).o; REPR(obj)->ass_funcs.delete_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)GET_REG(cur_op, 2).s); MVM_SC_WB_OBJ(tc, obj); cur_op += 4; goto NEXT; } OP(elems): { MVMObject *obj = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).i64 = (MVMint64)REPR(obj)->elems(tc, STABLE(obj), obj, OBJECT_BODY(obj)); cur_op += 4; goto NEXT; } OP(knowhow): GET_REG(cur_op, 0).o = tc->instance->KnowHOW; cur_op += 2; goto NEXT; OP(knowhowattr): GET_REG(cur_op, 0).o = tc->instance->KnowHOWAttribute; cur_op += 2; goto NEXT; OP(newtype): { MVMObject *how = GET_REG(cur_op, 2).o; MVMString *repr_name = GET_REG(cur_op, 4).s; const MVMREPROps *repr = MVM_repr_get_by_name(tc, repr_name); GET_REG(cur_op, 0).o = repr->type_object_for(tc, how); cur_op += 6; goto NEXT; } OP(composetype): { MVMObject *obj = GET_REG(cur_op, 2).o; REPR(obj)->compose(tc, STABLE(obj), GET_REG(cur_op, 4).o); GET_REG(cur_op, 0).o = GET_REG(cur_op, 2).o; cur_op += 6; goto NEXT; } OP(setmethcache): { MVMObject *iter = MVM_iter(tc, GET_REG(cur_op, 2).o); MVMObject *cache; MVMSTable *stable; MVMROOT(tc, iter, { cache = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTHash); }); while (MVM_iter_istrue(tc, (MVMIter *)iter)) { MVMRegister result; REPR(iter)->pos_funcs.shift(tc, STABLE(iter), iter, OBJECT_BODY(iter), &result, MVM_reg_obj); MVM_repr_bind_key_o(tc, cache, MVM_iterkey_s(tc, (MVMIter *)iter), MVM_iterval(tc, (MVMIter *)iter)); } stable = STABLE(GET_REG(cur_op, 0).o); MVM_ASSIGN_REF(tc, &(stable->header), stable->method_cache, cache); stable->method_cache_sc = NULL; MVM_SC_WB_ST(tc, stable); cur_op += 4; goto NEXT; } OP(setmethcacheauth): { MVMObject *obj = GET_REG(cur_op, 0).o; MVMint64 new_flags = STABLE(obj)->mode_flags & (~MVM_METHOD_CACHE_AUTHORITATIVE); MVMint64 flag = GET_REG(cur_op, 2).i64; if (flag != 0) new_flags |= MVM_METHOD_CACHE_AUTHORITATIVE; STABLE(obj)->mode_flags = new_flags; MVM_SC_WB_ST(tc, STABLE(obj)); cur_op += 4; goto NEXT; } OP(settypecache): { MVMObject *obj = GET_REG(cur_op, 0).o; MVMObject *types = GET_REG(cur_op, 2).o; MVMSTable *st = STABLE(obj); MVMint64 i, elems = REPR(types)->elems(tc, STABLE(types), types, OBJECT_BODY(types)); MVMObject **cache = MVM_malloc(sizeof(MVMObject *) * elems); for (i = 0; i < elems; i++) { MVM_ASSIGN_REF(tc, &(st->header), cache[i], MVM_repr_at_pos_o(tc, types, i)); } /* technically this free isn't thread safe */ if (st->type_check_cache) MVM_free(st->type_check_cache); st->type_check_cache = cache; st->type_check_cache_length = (MVMuint16)elems; MVM_SC_WB_ST(tc, st); cur_op += 4; goto NEXT; } OP(settypecheckmode): { MVMSTable *st = STABLE(GET_REG(cur_op, 0).o); st->mode_flags = GET_REG(cur_op, 2).i64 | (st->mode_flags & (~MVM_TYPE_CHECK_CACHE_FLAG_MASK)); MVM_SC_WB_ST(tc, st); cur_op += 4; goto NEXT; } OP(setboolspec): { MVMSTable *st = GET_REG(cur_op, 0).o->st; MVMBoolificationSpec *bs = MVM_malloc(sizeof(MVMBoolificationSpec)); MVMBoolificationSpec *orig_bs = st->boolification_spec; bs->mode = (MVMuint32)GET_REG(cur_op, 2).i64; MVM_ASSIGN_REF(tc, &(st->header), bs->method, GET_REG(cur_op, 4).o); st->boolification_spec = bs; MVM_free(orig_bs); cur_op += 6; goto NEXT; } OP(istrue): { /* Increment PC first then call coerce, since it may want to * do an invocation. */ MVMObject *obj = GET_REG(cur_op, 2).o; MVMRegister *res = &GET_REG(cur_op, 0); cur_op += 4; MVM_coerce_istrue(tc, obj, res, NULL, NULL, 0); goto NEXT; } OP(isfalse): { /* Increment PC first then call coerce, since it may want to * do an invocation. */ MVMObject *obj = GET_REG(cur_op, 2).o; MVMRegister *res = &GET_REG(cur_op, 0); cur_op += 4; MVM_coerce_istrue(tc, obj, res, NULL, NULL, 1); goto NEXT; } OP(bootint): GET_REG(cur_op, 0).o = tc->instance->boot_types.BOOTInt; cur_op += 2; goto NEXT; OP(bootnum): GET_REG(cur_op, 0).o = tc->instance->boot_types.BOOTNum; cur_op += 2; goto NEXT; OP(bootstr): GET_REG(cur_op, 0).o = tc->instance->boot_types.BOOTStr; cur_op += 2; goto NEXT; OP(bootarray): GET_REG(cur_op, 0).o = tc->instance->boot_types.BOOTArray; cur_op += 2; goto NEXT; OP(bootintarray): GET_REG(cur_op, 0).o = tc->instance->boot_types.BOOTIntArray; cur_op += 2; goto NEXT; OP(bootnumarray): GET_REG(cur_op, 0).o = tc->instance->boot_types.BOOTNumArray; cur_op += 2; goto NEXT; OP(bootstrarray): GET_REG(cur_op, 0).o = tc->instance->boot_types.BOOTStrArray; cur_op += 2; goto NEXT; OP(boothash): GET_REG(cur_op, 0).o = tc->instance->boot_types.BOOTHash; cur_op += 2; goto NEXT; OP(isint): { MVMObject *obj = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).i64 = obj && REPR(obj)->ID == MVM_REPR_ID_P6int ? 1 : 0; cur_op += 4; goto NEXT; } OP(isnum): { MVMObject *obj = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).i64 = obj && REPR(obj)->ID == MVM_REPR_ID_P6num ? 1 : 0; cur_op += 4; goto NEXT; } OP(isstr): { MVMObject *obj = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).i64 = obj && REPR(obj)->ID == MVM_REPR_ID_P6str ? 1 : 0; cur_op += 4; goto NEXT; } OP(islist): { MVMObject *obj = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).i64 = obj && REPR(obj)->ID == MVM_REPR_ID_VMArray ? 1 : 0; cur_op += 4; goto NEXT; } OP(ishash): { MVMObject *obj = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).i64 = obj && REPR(obj)->ID == MVM_REPR_ID_MVMHash ? 1 : 0; cur_op += 4; goto NEXT; } OP(sethllconfig): MVM_hll_set_config(tc, GET_REG(cur_op, 0).s, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(hllboxtype_i): GET_REG(cur_op, 0).o = cu->body.hll_config->int_box_type; cur_op += 2; goto NEXT; OP(hllboxtype_n): GET_REG(cur_op, 0).o = cu->body.hll_config->num_box_type; cur_op += 2; goto NEXT; OP(hllboxtype_s): GET_REG(cur_op, 0).o = cu->body.hll_config->str_box_type; cur_op += 2; goto NEXT; OP(hlllist): GET_REG(cur_op, 0).o = cu->body.hll_config->slurpy_array_type; cur_op += 2; goto NEXT; OP(hllhash): GET_REG(cur_op, 0).o = cu->body.hll_config->slurpy_hash_type; cur_op += 2; goto NEXT; OP(getcomp): { MVMObject *obj = tc->instance->compiler_registry; uv_mutex_lock(&tc->instance->mutex_compiler_registry); GET_REG(cur_op, 0).o = MVM_repr_at_key_o(tc, obj, GET_REG(cur_op, 2).s); uv_mutex_unlock(&tc->instance->mutex_compiler_registry); cur_op += 4; goto NEXT; } OP(bindcomp): { MVMObject *obj = tc->instance->compiler_registry; uv_mutex_lock(&tc->instance->mutex_compiler_registry); REPR(obj)->ass_funcs.bind_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), (MVMObject *)GET_REG(cur_op, 2).s, GET_REG(cur_op, 4), MVM_reg_obj); uv_mutex_unlock(&tc->instance->mutex_compiler_registry); GET_REG(cur_op, 0).o = GET_REG(cur_op, 4).o; cur_op += 6; goto NEXT; } OP(getcurhllsym): { MVMString *hll_name = tc->cur_frame->static_info->body.cu->body.hll_name; GET_REG(cur_op, 0).o = MVM_hll_sym_get(tc, hll_name, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; } OP(bindcurhllsym): { MVMObject *syms = tc->instance->hll_syms, *hash; MVMString *hll_name = tc->cur_frame->static_info->body.cu->body.hll_name; uv_mutex_lock(&tc->instance->mutex_hll_syms); hash = MVM_repr_at_key_o(tc, syms, hll_name); if (MVM_is_null(tc, hash)) { hash = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTHash); /* must re-get syms in case it moved */ syms = tc->instance->hll_syms; hll_name = tc->cur_frame->static_info->body.cu->body.hll_name; MVM_repr_bind_key_o(tc, syms, hll_name, hash); } MVM_repr_bind_key_o(tc, hash, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).o); GET_REG(cur_op, 0).o = GET_REG(cur_op, 4).o; uv_mutex_unlock(&tc->instance->mutex_hll_syms); cur_op += 6; goto NEXT; } OP(gethllsym): GET_REG(cur_op, 0).o = MVM_hll_sym_get(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; OP(bindhllsym): { MVMObject *syms = tc->instance->hll_syms; MVMString *hll_name = GET_REG(cur_op, 0).s; MVMObject *hash; uv_mutex_lock(&tc->instance->mutex_hll_syms); hash = MVM_repr_at_key_o(tc, syms, hll_name); if (MVM_is_null(tc, hash)) { hash = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTHash); /* must re-get syms and HLL name in case it moved */ syms = tc->instance->hll_syms; hll_name = GET_REG(cur_op, 0).s; MVM_repr_bind_key_o(tc, syms, hll_name, hash); } MVM_repr_bind_key_o(tc, hash, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).o); uv_mutex_unlock(&tc->instance->mutex_hll_syms); cur_op += 6; goto NEXT; } OP(settypehll): STABLE(GET_REG(cur_op, 0).o)->hll_owner = MVM_hll_get_config_for(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(settypehllrole): STABLE(GET_REG(cur_op, 0).o)->hll_role = GET_REG(cur_op, 2).i64; cur_op += 4; goto NEXT; OP(hllize): { /* Increment PC before mapping, as it may invoke. */ MVMRegister *res_reg = &GET_REG(cur_op, 0); MVMObject *mapee = GET_REG(cur_op, 2).o; cur_op += 4; MVM_hll_map(tc, mapee, MVM_hll_current(tc), res_reg); goto NEXT; } OP(hllizefor): { /* Increment PC before mapping, as it may invoke. */ MVMRegister *res_reg = &GET_REG(cur_op, 0); MVMObject *mapee = GET_REG(cur_op, 2).o; MVMString *hll = GET_REG(cur_op, 4).s; cur_op += 6; MVM_hll_map(tc, mapee, MVM_hll_get_config_for(tc, hll), res_reg); goto NEXT; } OP(usecompileehllconfig): MVM_hll_enter_compilee_mode(tc); goto NEXT; OP(usecompilerhllconfig): MVM_hll_leave_compilee_mode(tc); goto NEXT; OP(iter): { GET_REG(cur_op, 0).o = MVM_iter(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; } OP(iterkey_s): { GET_REG(cur_op, 0).s = MVM_iterkey_s(tc, (MVMIter *)GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; } OP(iterval): { GET_REG(cur_op, 0).o = MVM_iterval(tc, (MVMIter *)GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; } OP(getcodename): { MVMObject *co = GET_REG(cur_op, 2).o; if (REPR(co)->ID != MVM_REPR_ID_MVMCode || !IS_CONCRETE(co)) MVM_exception_throw_adhoc(tc, "getcodename requires a concrete code object"); GET_REG(cur_op, 0).s = ((MVMCode *)co)->body.name; cur_op += 4; goto NEXT; } OP(iscoderef): GET_REG(cur_op, 0).i64 = !GET_REG(cur_op, 2).o || STABLE(GET_REG(cur_op, 2).o)->invoke == MVM_6model_invoke_default ? 0 : 1; cur_op += 4; goto NEXT; OP(getcodeobj): { MVMObject *obj = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).o = MVM_frame_get_code_object(tc, (MVMCode *)obj); cur_op += 4; goto NEXT; } OP(setcodeobj): { MVMObject *obj = GET_REG(cur_op, 0).o; if (REPR(obj)->ID == MVM_REPR_ID_MVMCode) { MVM_ASSIGN_REF(tc, &(obj->header), ((MVMCode *)obj)->body.code_object, GET_REG(cur_op, 2).o); } else { MVM_exception_throw_adhoc(tc, "setcodeobj needs a code ref"); } cur_op += 4; goto NEXT; } OP(setcodename): { MVMObject *obj = GET_REG(cur_op, 0).o; if (REPR(obj)->ID == MVM_REPR_ID_MVMCode) { MVM_ASSIGN_REF(tc, &(obj->header), ((MVMCode *)obj)->body.name, GET_REG(cur_op, 2).s); } else { MVM_exception_throw_adhoc(tc, "setcodename needs a code ref"); } cur_op += 4; goto NEXT; } OP(forceouterctx): { MVMObject *obj = GET_REG(cur_op, 0).o, *ctx = GET_REG(cur_op, 2).o; MVMFrame *orig; MVMFrame *context; MVMStaticFrame *sf; if (REPR(obj)->ID != MVM_REPR_ID_MVMCode || !IS_CONCRETE(obj)) { MVM_exception_throw_adhoc(tc, "forceouterctx needs a code ref"); } if (REPR(ctx)->ID != MVM_REPR_ID_MVMContext || !IS_CONCRETE(ctx)) { MVM_exception_throw_adhoc(tc, "forceouterctx needs a context"); } orig = ((MVMCode *)obj)->body.outer; sf = ((MVMCode *)obj)->body.sf; context = ((MVMContext *)ctx)->body.context; MVM_ASSIGN_REF(tc, &(((MVMObject *)sf)->header), sf->body.outer, context->static_info); if (orig != context) MVM_ASSIGN_REF(tc, &(obj->header), ((MVMCode *)obj)->body.outer, context); cur_op += 4; goto NEXT; } OP(setinvokespec): { MVMObject *obj = GET_REG(cur_op, 0).o, *ch = GET_REG(cur_op, 2).o, *invocation_handler = GET_REG(cur_op, 6).o; MVMString *name = GET_REG(cur_op, 4).s; MVMInvocationSpec *is = MVM_calloc(1, sizeof(MVMInvocationSpec)); MVMSTable *st = STABLE(obj); MVM_ASSIGN_REF(tc, &(st->header), is->class_handle, ch); MVM_ASSIGN_REF(tc, &(st->header), is->attr_name, name); if (ch && name) is->hint = REPR(ch)->attr_funcs.hint_for(tc, STABLE(ch), ch, name); MVM_ASSIGN_REF(tc, &(st->header), is->invocation_handler, invocation_handler); /* XXX not thread safe, but this should occur on non-shared objects anyway... */ if (st->invocation_spec) MVM_free(st->invocation_spec); st->invocation_spec = is; cur_op += 8; goto NEXT; } OP(isinvokable): { MVMSTable *st = STABLE(GET_REG(cur_op, 2).o); GET_REG(cur_op, 0).i64 = st->invoke == MVM_6model_invoke_default ? (st->invocation_spec ? 1 : 0) : 1; cur_op += 4; goto NEXT; } OP(freshcoderef): { MVMObject * const cr = GET_REG(cur_op, 2).o; MVMCode *ncr; if (REPR(cr)->ID != MVM_REPR_ID_MVMCode) MVM_exception_throw_adhoc(tc, "freshcoderef requires a coderef"); ncr = (MVMCode *)(GET_REG(cur_op, 0).o = MVM_repr_clone(tc, cr)); MVMROOT(tc, ncr, { MVMStaticFrame *nsf; if (!ncr->body.sf->body.fully_deserialized) MVM_bytecode_finish_frame(tc, ncr->body.sf->body.cu, ncr->body.sf, 0); nsf = (MVMStaticFrame *)MVM_repr_clone(tc, (MVMObject *)ncr->body.sf); MVM_ASSIGN_REF(tc, &(ncr->common.header), ncr->body.sf, nsf); MVM_ASSIGN_REF(tc, &(ncr->common.header), ncr->body.sf->body.static_code, ncr); }); cur_op += 4; goto NEXT; } OP(markcodestatic): { MVMObject * const cr = GET_REG(cur_op, 0).o; if (REPR(cr)->ID != MVM_REPR_ID_MVMCode) MVM_exception_throw_adhoc(tc, "markcodestatic requires a coderef"); ((MVMCode *)cr)->body.is_static = 1; cur_op += 2; goto NEXT; } OP(markcodestub): { MVMObject * const cr = GET_REG(cur_op, 0).o; if (REPR(cr)->ID != MVM_REPR_ID_MVMCode) MVM_exception_throw_adhoc(tc, "markcodestub requires a coderef"); ((MVMCode *)cr)->body.is_compiler_stub = 1; cur_op += 2; goto NEXT; } OP(getstaticcode): { MVMObject * const cr = GET_REG(cur_op, 2).o; if (REPR(cr)->ID != MVM_REPR_ID_MVMCode) MVM_exception_throw_adhoc(tc, "getstaticcode requires a static coderef"); GET_REG(cur_op, 0).o = (MVMObject *)((MVMCode *)cr)->body.sf->body.static_code; cur_op += 4; goto NEXT; } OP(getcodecuid): { MVMObject * const cr = GET_REG(cur_op, 2).o; if (REPR(cr)->ID != MVM_REPR_ID_MVMCode || !IS_CONCRETE(cr)) MVM_exception_throw_adhoc(tc, "getcodecuid requires a static coderef"); GET_REG(cur_op, 0).s = ((MVMCode *)cr)->body.sf->body.cuuid; cur_op += 4; goto NEXT; } OP(setdispatcher): tc->cur_dispatcher = GET_REG(cur_op, 0).o; tc->cur_dispatcher_for = NULL; cur_op += 2; goto NEXT; OP(takedispatcher): { MVMObject *disp = tc->cur_dispatcher; MVMObject *disp_for = tc->cur_dispatcher_for; MVMObject *cur_code = tc->cur_frame->code_ref; if (disp && (!disp_for || disp_for == cur_code)) { GET_REG(cur_op, 0).o = disp; tc->cur_dispatcher = NULL; } else { GET_REG(cur_op, 0).o = tc->instance->VMNull; } cur_op += 2; goto NEXT; } OP(assign): { MVMObject *cont = GET_REG(cur_op, 0).o; MVMObject *obj = GET_REG(cur_op, 2).o; const MVMContainerSpec *spec = STABLE(cont)->container_spec; cur_op += 4; if (spec) { spec->store(tc, cont, obj); } else { MVM_exception_throw_adhoc(tc, "Cannot assign to an immutable value"); } goto NEXT; } OP(assignunchecked): { MVMObject *cont = GET_REG(cur_op, 0).o; MVMObject *obj = GET_REG(cur_op, 2).o; const MVMContainerSpec *spec = STABLE(cont)->container_spec; cur_op += 4; if (spec) { spec->store_unchecked(tc, cont, obj); } else { MVM_exception_throw_adhoc(tc, "Cannot assign to an immutable value"); } goto NEXT; } OP(iscont): { MVMObject *obj = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).i64 = MVM_is_null(tc, obj) || STABLE(obj)->container_spec == NULL ? 0 : 1; cur_op += 4; goto NEXT; } OP(decont): { MVMuint8 *prev_op = cur_op; MVMObject *obj = GET_REG(cur_op, 2).o; MVMRegister *r = &GET_REG(cur_op, 0); cur_op += 4; if (obj && IS_CONCRETE(obj) && STABLE(obj)->container_spec) { STABLE(obj)->container_spec->fetch(tc, obj, r); if (MVM_spesh_log_is_logging(tc)) MVM_spesh_log_decont(tc, prev_op, r->o); } else { r->o = obj; } goto NEXT; } OP(setcontspec): { MVMSTable *st = STABLE(GET_REG(cur_op, 0).o); MVMString *name = GET_REG(cur_op, 2).s; const MVMContainerConfigurer *cc = MVM_6model_get_container_config(tc, name); if (cc == NULL) { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Cannot use unknown container spec %s", c_name); } if (st->container_spec) MVM_exception_throw_adhoc(tc, "Cannot change a type's container specification"); cc->set_container_spec(tc, st); cc->configure_container_spec(tc, st, GET_REG(cur_op, 4).o); cur_op += 6; goto NEXT; } OP(sha1): GET_REG(cur_op, 0).s = MVM_sha1(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(createsc): GET_REG(cur_op, 0).o = MVM_sc_create(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(scsetobj): { MVMObject *sc = GET_REG(cur_op, 0).o; MVMObject *obj = GET_REG(cur_op, 4).o; if (REPR(sc)->ID != MVM_REPR_ID_SCRef) MVM_exception_throw_adhoc(tc, "Must provide an SCRef operand to scsetobj"); MVM_sc_set_object(tc, (MVMSerializationContext *)sc, GET_REG(cur_op, 2).i64, obj); if (MVM_sc_get_stable_sc(tc, STABLE(obj)) == NULL) { /* Need to claim the SC also; typical case for new type objects. */ MVMSTable *st = STABLE(obj); MVM_sc_set_stable_sc(tc, st, (MVMSerializationContext *)sc); MVM_sc_push_stable(tc, (MVMSerializationContext *)sc, st); } cur_op += 6; goto NEXT; } OP(scsetcode): { MVMObject *sc = GET_REG(cur_op, 0).o; MVMObject *code = GET_REG(cur_op, 4).o; if (REPR(sc)->ID != MVM_REPR_ID_SCRef) MVM_exception_throw_adhoc(tc, "Must provide an SCRef operand to scsetcode"); MVM_sc_set_obj_sc(tc, code, (MVMSerializationContext *)sc); MVM_sc_set_code(tc, (MVMSerializationContext *)sc, GET_REG(cur_op, 2).i64, code); cur_op += 6; goto NEXT; } OP(scgetobj): { MVMObject *sc = GET_REG(cur_op, 2).o; if (REPR(sc)->ID != MVM_REPR_ID_SCRef) MVM_exception_throw_adhoc(tc, "Must provide an SCRef operand to scgetobj"); GET_REG(cur_op, 0).o = MVM_sc_get_object(tc, (MVMSerializationContext *)sc, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; } OP(scgethandle): { MVMObject *sc = GET_REG(cur_op, 2).o; if (REPR(sc)->ID != MVM_REPR_ID_SCRef) MVM_exception_throw_adhoc(tc, "Must provide an SCRef operand to scgethandle"); GET_REG(cur_op, 0).s = MVM_sc_get_handle(tc, (MVMSerializationContext *)sc); cur_op += 4; goto NEXT; } OP(scgetobjidx): { MVMObject *sc = GET_REG(cur_op, 2).o; if (REPR(sc)->ID != MVM_REPR_ID_SCRef) MVM_exception_throw_adhoc(tc, "Must provide an SCRef operand to scgetobjidx"); GET_REG(cur_op, 0).i64 = MVM_sc_find_object_idx(tc, (MVMSerializationContext *)sc, GET_REG(cur_op, 4).o); cur_op += 6; goto NEXT; } OP(scsetdesc): { MVMObject *sc = GET_REG(cur_op, 0).o; MVMString *desc = GET_REG(cur_op, 2).s; if (REPR(sc)->ID != MVM_REPR_ID_SCRef) MVM_exception_throw_adhoc(tc, "Must provide an SCRef operand to scsetdesc"); MVM_sc_set_description(tc, (MVMSerializationContext *)sc, desc); cur_op += 4; goto NEXT; } OP(scobjcount): { MVMObject *sc = GET_REG(cur_op, 2).o; if (REPR(sc)->ID != MVM_REPR_ID_SCRef) MVM_exception_throw_adhoc(tc, "Must provide an SCRef operand to scobjcount"); GET_REG(cur_op, 0).i64 = MVM_sc_get_object_count(tc, (MVMSerializationContext *)sc); cur_op += 4; goto NEXT; } OP(setobjsc): { MVMObject *obj = GET_REG(cur_op, 0).o; MVMObject *sc = GET_REG(cur_op, 2).o; if (REPR(sc)->ID != MVM_REPR_ID_SCRef) MVM_exception_throw_adhoc(tc, "Must provide an SCRef operand to setobjsc"); MVM_sc_set_obj_sc(tc, obj, (MVMSerializationContext *)sc); cur_op += 4; goto NEXT; } OP(getobjsc): GET_REG(cur_op, 0).o = (MVMObject *)MVM_sc_get_obj_sc(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(serialize): { MVMObject *sc = GET_REG(cur_op, 2).o; MVMObject *obj = GET_REG(cur_op, 4).o; if (REPR(sc)->ID != MVM_REPR_ID_SCRef) MVM_exception_throw_adhoc(tc, "Must provide an SCRef operand to serialize"); GET_REG(cur_op, 0).s = MVM_serialization_serialize(tc, (MVMSerializationContext *)sc, obj); cur_op += 6; goto NEXT; } OP(deserialize): { MVMString *blob = GET_REG(cur_op, 0).s; MVMObject *sc = GET_REG(cur_op, 2).o; MVMObject *sh = GET_REG(cur_op, 4).o; MVMObject *cr = GET_REG(cur_op, 6).o; MVMObject *conf = GET_REG(cur_op, 8).o; if (REPR(sc)->ID != MVM_REPR_ID_SCRef) MVM_exception_throw_adhoc(tc, "Must provide an SCRef operand to deserialize"); MVM_serialization_deserialize(tc, (MVMSerializationContext *)sc, sh, cr, conf, blob); cur_op += 10; goto NEXT; } OP(wval): { MVMuint16 dep = GET_UI16(cur_op, 2); MVMuint16 idx = GET_UI16(cur_op, 4); GET_REG(cur_op, 0).o = MVM_sc_get_sc_object(tc, cu, dep, idx); cur_op += 6; goto NEXT; } OP(wval_wide): { MVMuint16 dep = GET_UI16(cur_op, 2); MVMuint64 idx = MVM_BC_get_I64(cur_op, 4); GET_REG(cur_op, 0).o = MVM_sc_get_sc_object(tc, cu, dep, idx); cur_op += 12; goto NEXT; } OP(scwbdisable): GET_REG(cur_op, 0).i64 = ++tc->sc_wb_disable_depth; cur_op += 2; goto NEXT; OP(scwbenable): GET_REG(cur_op, 0).i64 = --tc->sc_wb_disable_depth; cur_op += 2; goto NEXT; OP(pushcompsc): { MVMObject * const sc = GET_REG(cur_op, 0).o; if (REPR(sc)->ID != MVM_REPR_ID_SCRef) MVM_exception_throw_adhoc(tc, "Can only push an SCRef with pushcompsc"); if (MVM_is_null(tc, tc->compiling_scs)) { MVMROOT(tc, sc, { tc->compiling_scs = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); }); } MVM_repr_unshift_o(tc, tc->compiling_scs, sc); cur_op += 2; goto NEXT; } OP(popcompsc): { MVMObject * const scs = tc->compiling_scs; if (MVM_is_null(tc, scs) || MVM_repr_elems(tc, scs) == 0) MVM_exception_throw_adhoc(tc, "No current compiling SC"); GET_REG(cur_op, 0).o = MVM_repr_shift_o(tc, tc->compiling_scs); cur_op += 2; goto NEXT; } OP(scgetdesc): { MVMObject *sc = GET_REG(cur_op, 2).o; if (REPR(sc)->ID != MVM_REPR_ID_SCRef) MVM_exception_throw_adhoc(tc, "Must provide an SCRef operand to scgetdesc"); GET_REG(cur_op, 0).s = MVM_sc_get_description(tc, (MVMSerializationContext *)sc); cur_op += 4; goto NEXT; } OP(loadbytecode): { /* This op will end up returning into the runloop to run * deserialization and load code, so make sure we're done * processing this op really. */ MVMString *filename = GET_REG(cur_op, 2).s; GET_REG(cur_op, 0).s = filename; cur_op += 4; /* Set up return (really continuation after load) address * and enter bytecode loading process. */ tc->cur_frame->return_address = cur_op; MVM_load_bytecode(tc, filename); goto NEXT; } OP(loadbytecodebuffer): { /* This op will end up returning into the runloop to run * deserialization and load code, so make sure we're done * processing this op really. */ MVMObject *buffer = GET_REG(cur_op, 0).o; cur_op += 2; /* Set up return (really continuation after load) address * and enter bytecode loading process. */ tc->cur_frame->return_address = cur_op; MVM_load_bytecode_buffer(tc, buffer); goto NEXT; } OP(loadbytecodefh): { /* This op will end up returning into the runloop to run * deserialization and load code, so make sure we're done * processing this op really. */ MVMObject *file = GET_REG(cur_op, 0).o; MVMString *filename = GET_REG(cur_op, 2).s; cur_op += 4; /* Set up return (really continuation after load) address * and enter bytecode loading process. */ tc->cur_frame->return_address = cur_op; MVM_load_bytecode_fh(tc, file, filename); goto NEXT; } OP(masttofile): MVM_mast_to_file(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; OP(masttocu): { /* This op will end up returning into the runloop to run * deserialization and load code, so make sure we're done * processing this op really. */ MVMObject *node = GET_REG(cur_op, 2).o; MVMObject *types = GET_REG(cur_op, 4).o; MVMRegister *result_reg = &GET_REG(cur_op, 0); cur_op += 6; /* Set up return (really continuation after load) address * and enter bytecode loading process. */ tc->cur_frame->return_address = cur_op; MVM_mast_to_cu(tc, node, types, result_reg); goto NEXT; } OP(iscompunit): { MVMObject *maybe_cu = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).i64 = REPR(maybe_cu)->ID == MVM_REPR_ID_MVMCompUnit; cur_op += 4; goto NEXT; } OP(compunitmainline): { MVMObject *maybe_cu = GET_REG(cur_op, 2).o; if (REPR(maybe_cu)->ID == MVM_REPR_ID_MVMCompUnit) { MVMCompUnit *cu = (MVMCompUnit *)maybe_cu; GET_REG(cur_op, 0).o = cu->body.coderefs[0]; } else { MVM_exception_throw_adhoc(tc, "compunitmainline requires an MVMCompUnit"); } cur_op += 4; goto NEXT; } OP(compunitcodes): { MVMObject * const result = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_array_type); MVMCompUnit * const maybe_cu = (MVMCompUnit *)GET_REG(cur_op, 2).o; if (REPR(maybe_cu)->ID == MVM_REPR_ID_MVMCompUnit) { const MVMuint32 num_frames = maybe_cu->body.num_frames; MVMObject ** const coderefs = maybe_cu->body.coderefs; MVMuint32 i; for (i = 0; i < num_frames; i++) { MVM_repr_push_o(tc, result, coderefs[i]); } GET_REG(cur_op, 0).o = result; } else { MVM_exception_throw_adhoc(tc, "compunitcodes requires an MVMCompUnit"); } cur_op += 4; goto NEXT; } OP(ctx): { GET_REG(cur_op, 0).o = MVM_frame_context_wrapper(tc, tc->cur_frame); cur_op += 2; goto NEXT; } OP(ctxouter): { MVMObject *this_ctx = GET_REG(cur_op, 2).o; MVMFrame *frame; if (!IS_CONCRETE(this_ctx) || REPR(this_ctx)->ID != MVM_REPR_ID_MVMContext) { MVM_exception_throw_adhoc(tc, "ctxouter needs an MVMContext"); } if ((frame = ((MVMContext *)this_ctx)->body.context->outer)) GET_REG(cur_op, 0).o = MVM_frame_context_wrapper(tc, frame); else GET_REG(cur_op, 0).o = tc->instance->VMNull; cur_op += 4; goto NEXT; } OP(ctxcaller): { MVMObject *this_ctx = GET_REG(cur_op, 2).o, *ctx = NULL; MVMFrame *frame; if (!IS_CONCRETE(this_ctx) || REPR(this_ctx)->ID != MVM_REPR_ID_MVMContext) { MVM_exception_throw_adhoc(tc, "ctxcaller needs an MVMContext"); } if ((frame = ((MVMContext *)this_ctx)->body.context->caller)) ctx = MVM_frame_context_wrapper(tc, frame); GET_REG(cur_op, 0).o = ctx ? ctx : tc->instance->VMNull; cur_op += 4; goto NEXT; } OP(ctxlexpad): { MVMObject *this_ctx = GET_REG(cur_op, 2).o; if (!IS_CONCRETE(this_ctx) || REPR(this_ctx)->ID != MVM_REPR_ID_MVMContext) { MVM_exception_throw_adhoc(tc, "ctxlexpad needs an MVMContext"); } GET_REG(cur_op, 0).o = this_ctx; cur_op += 4; goto NEXT; } OP(curcode): GET_REG(cur_op, 0).o = tc->cur_frame->code_ref; cur_op += 2; goto NEXT; OP(callercode): { GET_REG(cur_op, 0).o = tc->cur_frame->caller ? tc->cur_frame->caller->code_ref : tc->instance->VMNull; cur_op += 2; goto NEXT; } OP(add_I): GET_REG(cur_op, 0).o = MVM_bigint_add(tc, GET_REG(cur_op, 6).o, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 8; goto NEXT; OP(sub_I): GET_REG(cur_op, 0).o = MVM_bigint_sub(tc, GET_REG(cur_op, 6).o, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 8; goto NEXT; OP(mul_I): GET_REG(cur_op, 0).o = MVM_bigint_mul(tc, GET_REG(cur_op, 6).o, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 8; goto NEXT; OP(div_I): { MVMObject * const type = GET_REG(cur_op, 6).o; GET_REG(cur_op, 0).o = MVM_bigint_div(tc, type, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 8; goto NEXT; } OP(mod_I): { MVMObject * const type = GET_REG(cur_op, 6).o; GET_REG(cur_op, 0).o = MVM_bigint_mod(tc, type, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 8; goto NEXT; } OP(neg_I): { MVMObject * const type = GET_REG(cur_op, 4).o; MVMObject * const result = MVM_repr_alloc_init(tc, type); MVM_bigint_neg(tc, result, GET_REG(cur_op, 2).o); GET_REG(cur_op, 0).o = result; cur_op += 6; goto NEXT; } OP(abs_I): { MVMObject * const type = GET_REG(cur_op, 4).o; MVMObject * const result = MVM_repr_alloc_init(tc, type); MVM_bigint_abs(tc, result, GET_REG(cur_op, 2).o); GET_REG(cur_op, 0).o = result; cur_op += 6; goto NEXT; } OP(cmp_I): { MVMObject *a = GET_REG(cur_op, 2).o, *b = GET_REG(cur_op, 4).o; GET_REG(cur_op, 0).i64 = MVM_bigint_cmp(tc, a, b); cur_op += 6; goto NEXT; } OP(eq_I): { MVMObject *a = GET_REG(cur_op, 2).o, *b = GET_REG(cur_op, 4).o; GET_REG(cur_op, 0).i64 = MP_EQ == MVM_bigint_cmp(tc, a, b); cur_op += 6; goto NEXT; } OP(ne_I): { MVMObject *a = GET_REG(cur_op, 2).o, *b = GET_REG(cur_op, 4).o; GET_REG(cur_op, 0).i64 = MP_EQ != MVM_bigint_cmp(tc, a, b); cur_op += 6; goto NEXT; } OP(lt_I): { MVMObject *a = GET_REG(cur_op, 2).o, *b = GET_REG(cur_op, 4).o; GET_REG(cur_op, 0).i64 = MP_LT == MVM_bigint_cmp(tc, a, b); cur_op += 6; goto NEXT; } OP(le_I): { MVMObject *a = GET_REG(cur_op, 2).o, *b = GET_REG(cur_op, 4).o; GET_REG(cur_op, 0).i64 = MP_GT != MVM_bigint_cmp(tc, a, b); cur_op += 6; goto NEXT; } OP(gt_I): { MVMObject *a = GET_REG(cur_op, 2).o, *b = GET_REG(cur_op, 4).o; GET_REG(cur_op, 0).i64 = MP_GT == MVM_bigint_cmp(tc, a, b); cur_op += 6; goto NEXT; } OP(ge_I): { MVMObject *a = GET_REG(cur_op, 2).o, *b = GET_REG(cur_op, 4).o; GET_REG(cur_op, 0).i64 = MP_LT != MVM_bigint_cmp(tc, a, b); cur_op += 6; goto NEXT; } OP(bor_I): { MVMObject * const type = GET_REG(cur_op, 6).o; GET_REG(cur_op, 0).o = MVM_bigint_or(tc, type, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 8; goto NEXT; } OP(bxor_I): { MVMObject * const type = GET_REG(cur_op, 6).o; GET_REG(cur_op, 0).o = MVM_bigint_xor(tc, type, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 8; goto NEXT; } OP(band_I): { MVMObject * const type = GET_REG(cur_op, 6).o; GET_REG(cur_op, 0).o = MVM_bigint_and(tc, type, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 8; goto NEXT; } OP(bnot_I): { MVMObject * const type = GET_REG(cur_op, 4).o; GET_REG(cur_op, 0).o = MVM_bigint_not(tc, type, GET_REG(cur_op, 2).o); cur_op += 6; goto NEXT; } OP(blshift_I): { MVMObject * const type = GET_REG(cur_op, 6).o; GET_REG(cur_op, 0).o = MVM_bigint_shl(tc, type, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64); cur_op += 8; goto NEXT; } OP(brshift_I): { MVMObject * const type = GET_REG(cur_op, 6).o; GET_REG(cur_op, 0).o = MVM_bigint_shr(tc, type, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64); cur_op += 8; goto NEXT; } OP(pow_I): GET_REG(cur_op, 0).o = MVM_bigint_pow(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).o, GET_REG(cur_op, 8).o); cur_op += 10; goto NEXT; OP(gcd_I): { GET_REG(cur_op, 0).o = MVM_bigint_gcd(tc, GET_REG(cur_op, 6).o, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 8; goto NEXT; } OP(lcm_I): GET_REG(cur_op, 0).o = MVM_bigint_lcm(tc, GET_REG(cur_op, 6).o, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 8; goto NEXT; OP(expmod_I): { MVMObject * const type = GET_REG(cur_op, 8).o; MVMObject * const result = MVM_repr_alloc_init(tc, type); MVM_bigint_expmod(tc, result, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).o); GET_REG(cur_op, 0).o = result; cur_op += 10; goto NEXT; } OP(isprime_I): { MVMObject *a = GET_REG(cur_op, 2).o; MVMint64 b = GET_REG(cur_op, 4).i64; GET_REG(cur_op, 0).i64 = MVM_bigint_is_prime(tc, a, b); cur_op += 6; goto NEXT; } OP(rand_I): { MVMObject * const type = GET_REG(cur_op, 4).o; GET_REG(cur_op, 0).o = MVM_bigint_rand(tc, type, GET_REG(cur_op, 2).o); cur_op += 6; goto NEXT; } OP(coerce_In): { MVMObject *a = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).n64 = MVM_bigint_to_num(tc, a); cur_op += 4; goto NEXT; } OP(coerce_Is): { GET_REG(cur_op, 0).s = MVM_bigint_to_str(tc, GET_REG(cur_op, 2).o, 10); cur_op += 4; goto NEXT; } OP(coerce_nI): { MVMObject * const type = GET_REG(cur_op, 4).o; GET_REG(cur_op, 0).o = MVM_bigint_from_num(tc, type, GET_REG(cur_op, 2).n64); cur_op += 6; goto NEXT; } OP(coerce_sI): { MVMString *s = GET_REG(cur_op, 2).s; MVMObject *type = GET_REG(cur_op, 4).o; char *buf = MVM_string_ascii_encode(tc, s, NULL, 0); MVMObject *a = MVM_repr_alloc_init(tc, type); MVM_bigint_from_str(tc, a, buf); MVM_free(buf); GET_REG(cur_op, 0).o = a; cur_op += 6; goto NEXT; } OP(isbig_I): { GET_REG(cur_op, 0).i64 = MVM_bigint_is_big(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; } OP(bool_I): GET_REG(cur_op, 0).i64 = MVM_bigint_bool(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(base_I): { GET_REG(cur_op, 0).s = MVM_bigint_to_str(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; } OP(radix_I): GET_REG(cur_op, 0).o = MVM_bigint_radix(tc, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).i64, GET_REG(cur_op, 10).o); cur_op += 12; goto NEXT; OP(div_In): { MVMObject *a = GET_REG(cur_op, 2).o, *b = GET_REG(cur_op, 4).o; GET_REG(cur_op, 0).n64 = MVM_bigint_div_num(tc, a, b); cur_op += 6; goto NEXT; } OP(copy_f): MVM_file_copy(tc, GET_REG(cur_op, 0).s, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(append_f): MVM_exception_throw_adhoc(tc, "append is not supported"); goto NEXT; OP(rename_f): MVM_file_rename(tc, GET_REG(cur_op, 0).s, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(delete_f): MVM_file_delete(tc, GET_REG(cur_op, 0).s); cur_op += 2; goto NEXT; OP(chmod_f): MVM_file_chmod(tc, GET_REG(cur_op, 0).s, GET_REG(cur_op, 2).i64); cur_op += 4; goto NEXT; OP(exists_f): GET_REG(cur_op, 0).i64 = MVM_file_exists(tc, GET_REG(cur_op, 2).s, 0); cur_op += 4; goto NEXT; OP(mkdir): MVM_dir_mkdir(tc, GET_REG(cur_op, 0).s, GET_REG(cur_op, 2).i64); cur_op += 4; goto NEXT; OP(rmdir): MVM_dir_rmdir(tc, GET_REG(cur_op, 0).s); cur_op += 2; goto NEXT; OP(open_dir): GET_REG(cur_op, 0).o = MVM_dir_open(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(read_dir): GET_REG(cur_op, 0).s = MVM_dir_read(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(close_dir): MVM_dir_close(tc, GET_REG(cur_op, 0).o); cur_op += 2; goto NEXT; OP(open_fh): GET_REG(cur_op, 0).o = MVM_file_open_fh(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; OP(close_fh): MVM_io_close(tc, GET_REG(cur_op, 0).o); cur_op += 2; goto NEXT; OP(seek_fh): MVM_io_seek(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(lock_fh): GET_REG(cur_op, 0).i64 = MVM_io_lock(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(unlock_fh): MVM_io_unlock(tc, GET_REG(cur_op, 0).o); cur_op += 2; goto NEXT; OP(sync_fh): MVM_io_flush(tc, GET_REG(cur_op, 0).o, 1); cur_op += 2; goto NEXT; OP(trunc_fh): MVM_io_truncate(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).i64); cur_op += 4; goto NEXT; OP(eof_fh): GET_REG(cur_op, 0).i64 = MVM_io_eof(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(getstdin): if (MVM_is_null(tc, tc->instance->stdin_handle)) MVM_exception_throw_adhoc(tc, "STDIN filehandle was never initialized"); GET_REG(cur_op, 0).o = tc->instance->stdin_handle; cur_op += 2; goto NEXT; OP(getstdout): if (MVM_is_null(tc, tc->instance->stdout_handle)) MVM_exception_throw_adhoc(tc, "STDOUT filehandle was never initialized"); GET_REG(cur_op, 0).o = tc->instance->stdout_handle; cur_op += 2; goto NEXT; OP(getstderr): if (MVM_is_null(tc, tc->instance->stderr_handle)) MVM_exception_throw_adhoc(tc, "STDERR filehandle was never initialized"); GET_REG(cur_op, 0).o = tc->instance->stderr_handle; cur_op += 2; goto NEXT; OP(connect_sk): MVM_io_connect(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(socket): GET_REG(cur_op, 0).o = MVM_io_socket_create(tc, GET_REG(cur_op, 2).i64); cur_op += 4; goto NEXT; OP(getport_sk): GET_REG(cur_op, 0).i64 = MVM_io_getport(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(bind_sk): MVM_io_bind(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64, (int)GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(accept_sk): GET_REG(cur_op, 0).o = MVM_io_accept(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(decodetocodes): OP(encodefromcodes): MVM_exception_throw_adhoc(tc, "NYI"); OP(print): MVM_string_print(tc, GET_REG(cur_op, 0).s); cur_op += 2; goto NEXT; OP(say): MVM_string_say(tc, GET_REG(cur_op, 0).s); cur_op += 2; goto NEXT; OP(tell_fh): GET_REG(cur_op, 0).i64 = MVM_io_tell(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(stat): GET_REG(cur_op, 0).i64 = MVM_file_stat(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64, 0); cur_op += 6; goto NEXT; OP(tryfindmeth): { MVMRegister *res = &GET_REG(cur_op, 0); MVMObject *obj = GET_REG(cur_op, 2).o; MVMString *name = MVM_cu_string(tc, cu, GET_UI32(cur_op, 4)); cur_op += 8; MVM_6model_find_method(tc, obj, name, res, 0); goto NEXT; } OP(tryfindmeth_s): { MVMRegister *res = &GET_REG(cur_op, 0); MVMObject *obj = GET_REG(cur_op, 2).o; MVMString *name = GET_REG(cur_op, 4).s; cur_op += 6; MVM_6model_find_method(tc, obj, name, res, 0); goto NEXT; } OP(chdir): MVM_dir_chdir(tc, GET_REG(cur_op, 0).s); cur_op += 2; goto NEXT; OP(srand): MVM_proc_seed(tc, GET_REG(cur_op, 0).i64); cur_op += 2; goto NEXT; OP(rand_i): GET_REG(cur_op, 0).i64 = MVM_proc_rand_i(tc); cur_op += 2; goto NEXT; OP(rand_n): GET_REG(cur_op, 0).n64 = MVM_proc_rand_n(tc); cur_op += 2; goto NEXT; OP(time_i): GET_REG(cur_op, 0).i64 = MVM_proc_time_i(tc); cur_op += 2; goto NEXT; OP(sleep): { MVM_gc_mark_thread_blocked(tc); MVM_platform_sleep(GET_REG(cur_op, 0).n64); MVM_gc_mark_thread_unblocked(tc); cur_op += 2; goto NEXT; } OP(newthread): GET_REG(cur_op, 0).o = MVM_thread_new(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(threadjoin): MVM_thread_join(tc, GET_REG(cur_op, 0).o); cur_op += 2; goto NEXT; OP(time_n): GET_REG(cur_op, 0).n64 = MVM_proc_time_n(tc); cur_op += 2; goto NEXT; OP(exit): { MVMint64 exit_code = GET_REG(cur_op, 0).i64; MVM_io_flush_standard_handles(tc); exit(exit_code); } OP(cwd): GET_REG(cur_op, 0).s = MVM_dir_cwd(tc); cur_op += 2; goto NEXT; OP(clargs): GET_REG(cur_op, 0).o = MVM_proc_clargs(tc); cur_op += 2; goto NEXT; OP(getenvhash): GET_REG(cur_op, 0).o = MVM_proc_getenvhash(tc); cur_op += 2; goto NEXT; OP(loadlib): { MVMString *name = GET_REG(cur_op, 0).s; MVMString *path = GET_REG(cur_op, 2).s; MVM_dll_load(tc, name, path); cur_op += 4; goto NEXT; } OP(freelib): { MVMString *name = GET_REG(cur_op, 0).s; MVM_dll_free(tc, name); cur_op += 2; goto NEXT; } OP(findsym): { MVMString *lib = GET_REG(cur_op, 2).s; MVMString *sym = GET_REG(cur_op, 4).s; MVMObject *obj = MVM_dll_find_symbol(tc, lib, sym); if (MVM_is_null(tc, obj)) MVM_exception_throw_adhoc(tc, "symbol not found in DLL"); GET_REG(cur_op, 0).o = obj; cur_op += 6; goto NEXT; } OP(dropsym): { MVM_dll_drop_symbol(tc, GET_REG(cur_op, 0).o); cur_op += 2; goto NEXT; } OP(loadext): { MVMString *lib = GET_REG(cur_op, 0).s; MVMString *ext = GET_REG(cur_op, 2).s; MVM_ext_load(tc, lib, ext); cur_op += 4; goto NEXT; } OP(backendconfig): GET_REG(cur_op, 0).o = MVM_backend_config(tc); cur_op += 2; goto NEXT; OP(getlexouter): { GET_REG(cur_op, 0).o = MVM_frame_find_lexical_by_name_outer(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; } OP(getlexrel): { MVMObject *ctx = GET_REG(cur_op, 2).o; MVMRegister *r; if (REPR(ctx)->ID != MVM_REPR_ID_MVMContext || !IS_CONCRETE(ctx)) MVM_exception_throw_adhoc(tc, "getlexrel needs a context"); r = MVM_frame_find_lexical_by_name_rel(tc, GET_REG(cur_op, 4).s, ((MVMContext *)ctx)->body.context); GET_REG(cur_op, 0).o = r ? r->o : tc->instance->VMNull; cur_op += 6; goto NEXT; } OP(getlexreldyn): { MVMObject *ctx = GET_REG(cur_op, 2).o; if (REPR(ctx)->ID != MVM_REPR_ID_MVMContext || !IS_CONCRETE(ctx)) MVM_exception_throw_adhoc(tc, "getlexreldyn needs a context"); GET_REG(cur_op, 0).o = MVM_frame_getdynlex(tc, GET_REG(cur_op, 4).s, ((MVMContext *)ctx)->body.context); cur_op += 6; goto NEXT; } OP(getlexrelcaller): { MVMObject *ctx = GET_REG(cur_op, 2).o; MVMRegister *res; if (REPR(ctx)->ID != MVM_REPR_ID_MVMContext || !IS_CONCRETE(ctx)) MVM_exception_throw_adhoc(tc, "getlexrelcaller needs a context"); res = MVM_frame_find_lexical_by_name_rel_caller(tc, GET_REG(cur_op, 4).s, ((MVMContext *)ctx)->body.context); GET_REG(cur_op, 0).o = res ? res->o : tc->instance->VMNull; cur_op += 6; goto NEXT; } OP(getlexcaller): { MVMRegister *res = MVM_frame_find_lexical_by_name_rel_caller(tc, GET_REG(cur_op, 2).s, tc->cur_frame->caller); GET_REG(cur_op, 0).o = res ? res->o : tc->instance->VMNull; cur_op += 4; goto NEXT; } OP(bitand_s): GET_REG(cur_op, 0).s = MVM_string_bitand(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; OP(bitor_s): GET_REG(cur_op, 0).s = MVM_string_bitor(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; OP(bitxor_s): GET_REG(cur_op, 0).s = MVM_string_bitxor(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; OP(isnanorinf): GET_REG(cur_op, 0).i64 = MVM_num_isnanorinf(tc, GET_REG(cur_op, 2).n64); cur_op += 4; goto NEXT; OP(inf): GET_REG(cur_op, 0).n64 = MVM_num_posinf(tc); cur_op += 2; goto NEXT; OP(neginf): GET_REG(cur_op, 0).n64 = MVM_num_neginf(tc); cur_op += 2; goto NEXT; OP(nan): GET_REG(cur_op, 0).n64 = MVM_num_nan(tc); cur_op += 2; goto NEXT; OP(getpid): GET_REG(cur_op, 0).i64 = MVM_proc_getpid(tc); cur_op += 2; goto NEXT; OP(filereadable): GET_REG(cur_op, 0).i64 = MVM_file_isreadable(tc, GET_REG(cur_op, 2).s,0); cur_op += 4; goto NEXT; OP(filewritable): GET_REG(cur_op, 0).i64 = MVM_file_iswritable(tc, GET_REG(cur_op, 2).s,0); cur_op += 4; goto NEXT; OP(fileexecutable): GET_REG(cur_op, 0).i64 = MVM_file_isexecutable(tc, GET_REG(cur_op, 2).s,0); cur_op += 4; goto NEXT; OP(capturenamedshash): { MVMObject *obj = GET_REG(cur_op, 2).o; if (IS_CONCRETE(obj) && REPR(obj)->ID == MVM_REPR_ID_MVMCallCapture) { MVMCallCapture *cc = (MVMCallCapture *)obj; GET_REG(cur_op, 0).o = MVM_args_slurpy_named(tc, cc->body.apc); } else { MVM_exception_throw_adhoc(tc, "capturehasnameds needs a MVMCallCapture"); } cur_op += 4; goto NEXT; } OP(read_fhb): MVM_io_read_bytes(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(write_fhb): MVM_io_write_bytes(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(replace): GET_REG(cur_op, 0).s = MVM_string_replace(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).s); cur_op += 10; goto NEXT; OP(newexception): GET_REG(cur_op, 0).o = (MVMObject *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTException); cur_op += 2; goto NEXT; OP(permit): MVM_io_eventloop_permit(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(backtrace): GET_REG(cur_op, 0).o = MVM_exception_backtrace(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(symlink): MVM_file_symlink(tc, GET_REG(cur_op, 0).s, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(link): MVM_file_link(tc, GET_REG(cur_op, 0).s, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(gethostname): GET_REG(cur_op, 0).s = MVM_io_get_hostname(tc); cur_op += 2; goto NEXT; OP(exreturnafterunwind): { MVMObject *ex = GET_REG(cur_op, 0).o; MVM_exception_returnafterunwind(tc, ex); cur_op += 2; goto NEXT; } OP(continuationreset): { MVMRegister *res = &GET_REG(cur_op, 0); MVMObject *tag = GET_REG(cur_op, 2).o; MVMObject *code = GET_REG(cur_op, 4).o; cur_op += 6; MVM_continuation_reset(tc, tag, code, res); goto NEXT; } OP(continuationcontrol): { MVMRegister *res = &GET_REG(cur_op, 0); MVMint64 protect = GET_REG(cur_op, 2).i64; MVMObject *tag = GET_REG(cur_op, 4).o; MVMObject *code = GET_REG(cur_op, 6).o; cur_op += 8; MVM_continuation_control(tc, protect, tag, code, res); goto NEXT; } OP(continuationinvoke): { MVMRegister *res = &GET_REG(cur_op, 0); MVMObject *cont = GET_REG(cur_op, 2).o; MVMObject *code = GET_REG(cur_op, 4).o; cur_op += 6; if (REPR(cont)->ID == MVM_REPR_ID_MVMContinuation) MVM_continuation_invoke(tc, (MVMContinuation *)cont, code, res); else MVM_exception_throw_adhoc(tc, "continuationinvoke expects an MVMContinuation"); goto NEXT; } OP(randscale_n): GET_REG(cur_op, 0).n64 = MVM_proc_rand_n(tc) * GET_REG(cur_op, 2).n64; cur_op += 4; goto NEXT; OP(uniisblock): GET_REG(cur_op, 0).i64 = (MVMint64)MVM_unicode_is_in_block(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).s); cur_op += 8; goto NEXT; OP(assertparamcheck): { MVMint64 ok = GET_REG(cur_op, 0).i64; cur_op += 2; if (!ok) MVM_args_bind_failed(tc); goto NEXT; } OP(hintfor): { MVMObject *obj = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).i64 = REPR(obj)->attr_funcs.hint_for(tc, STABLE(obj), obj, GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; } OP(paramnamesused): { MVMArgProcContext *ctx = &tc->cur_frame->params; if (ctx->callsite->num_pos != ctx->callsite->arg_count) MVM_args_assert_nameds_used(tc, ctx); goto NEXT; } OP(getuniname): { GET_REG(cur_op, 0).s = MVM_unicode_get_name(tc, GET_REG(cur_op, 2).i64); cur_op += 4; goto NEXT; } OP(getuniprop_int): GET_REG(cur_op, 0).i64 = MVM_unicode_codepoint_get_property_int(tc, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(getuniprop_bool): GET_REG(cur_op, 0).i64 = MVM_unicode_codepoint_get_property_bool(tc, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(getuniprop_str): GET_REG(cur_op, 0).s = MVM_unicode_codepoint_get_property_str(tc, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(matchuniprop): GET_REG(cur_op, 0).i64 = MVM_unicode_codepoint_has_property_value(tc, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(nativecallbuild): GET_REG(cur_op, 0).i64 = MVM_nativecall_build(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).s, GET_REG(cur_op, 8).s, GET_REG(cur_op, 10).o, GET_REG(cur_op, 12).o); cur_op += 14; goto NEXT; OP(nativecallinvoke): GET_REG(cur_op, 0).o = MVM_nativecall_invoke(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).o); cur_op += 8; goto NEXT; OP(nativecallrefresh): MVM_nativecall_refresh(tc, GET_REG(cur_op, 0).o); cur_op += 2; goto NEXT; OP(threadrun): MVM_thread_run(tc, GET_REG(cur_op, 0).o); cur_op += 2; goto NEXT; OP(threadid): GET_REG(cur_op, 0).i64 = MVM_thread_id(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(threadyield): MVM_thread_yield(tc); goto NEXT; OP(currentthread): GET_REG(cur_op, 0).o = MVM_thread_current(tc); cur_op += 2; goto NEXT; OP(lock): MVM_reentrantmutex_lock_checked(tc, GET_REG(cur_op, 0).o); cur_op += 2; goto NEXT; OP(unlock): MVM_reentrantmutex_unlock_checked(tc, GET_REG(cur_op, 0).o); cur_op += 2; goto NEXT; OP(semacquire): { MVMObject *sem = GET_REG(cur_op, 0).o; if (REPR(sem)->ID == MVM_REPR_ID_Semaphore && IS_CONCRETE(sem)) MVM_semaphore_acquire(tc, (MVMSemaphore *)sem); else MVM_exception_throw_adhoc(tc, "semacquire requires a concrete object with REPR Semaphore"); cur_op += 2; goto NEXT; } OP(semtryacquire): { MVMObject *sem = GET_REG(cur_op, 2).o; if (REPR(sem)->ID == MVM_REPR_ID_Semaphore && IS_CONCRETE(sem)) GET_REG(cur_op, 0).i64 = MVM_semaphore_tryacquire(tc, (MVMSemaphore *)sem); else MVM_exception_throw_adhoc(tc, "semtryacquire requires a concrete object with REPR Semaphore"); cur_op += 4; goto NEXT; } OP(semrelease): { MVMObject *sem = GET_REG(cur_op, 0).o; if (REPR(sem)->ID == MVM_REPR_ID_Semaphore && IS_CONCRETE(sem)) MVM_semaphore_release(tc, (MVMSemaphore *)sem); else MVM_exception_throw_adhoc(tc, "semrelease requires a concrete object with REPR Semaphore"); cur_op += 2; goto NEXT; } OP(getlockcondvar): { MVMObject *lock = GET_REG(cur_op, 2).o; if (REPR(lock)->ID == MVM_REPR_ID_ReentrantMutex && IS_CONCRETE(lock)) GET_REG(cur_op, 0).o = MVM_conditionvariable_from_lock(tc, (MVMReentrantMutex *)lock, GET_REG(cur_op, 4).o); else MVM_exception_throw_adhoc(tc, "getlockcondvar requires a concrete object with REPR ReentrantMutex"); cur_op += 6; goto NEXT; } OP(condwait): { MVMObject *cv = GET_REG(cur_op, 0).o; if (REPR(cv)->ID == MVM_REPR_ID_ConditionVariable && IS_CONCRETE(cv)) MVM_conditionvariable_wait(tc, (MVMConditionVariable *)cv); else MVM_exception_throw_adhoc(tc, "condwait requires a concrete object with REPR ConditionVariable"); cur_op += 2; goto NEXT; } OP(condsignalone): { MVMObject *cv = GET_REG(cur_op, 0).o; if (REPR(cv)->ID == MVM_REPR_ID_ConditionVariable && IS_CONCRETE(cv)) MVM_conditionvariable_signal_one(tc, (MVMConditionVariable *)cv); else MVM_exception_throw_adhoc(tc, "condsignalone requires a concrete object with REPR ConditionVariable"); cur_op += 2; goto NEXT; } OP(condsignalall): { MVMObject *cv = GET_REG(cur_op, 0).o; if (REPR(cv)->ID == MVM_REPR_ID_ConditionVariable && IS_CONCRETE(cv)) MVM_conditionvariable_signal_all(tc, (MVMConditionVariable *)cv); else MVM_exception_throw_adhoc(tc, "condsignalall requires a concrete object with REPR ConditionVariable"); cur_op += 2; goto NEXT; } OP(queuepoll): { MVMObject *queue = GET_REG(cur_op, 2).o; if (REPR(queue)->ID == MVM_REPR_ID_ConcBlockingQueue && IS_CONCRETE(queue)) GET_REG(cur_op, 0).o = MVM_concblockingqueue_poll(tc, (MVMConcBlockingQueue *)queue); else MVM_exception_throw_adhoc(tc, "queuepoll requires a concrete object with REPR ConcBlockingQueue"); cur_op += 4; goto NEXT; } OP(setmultispec): { MVMObject *obj = GET_REG(cur_op, 0).o; MVMObject *ch = GET_REG(cur_op, 2).o; MVMString *valid_attr = GET_REG(cur_op, 4).s; MVMString *cache_attr = GET_REG(cur_op, 6).s; MVMSTable *st = STABLE(obj); MVMInvocationSpec *is = st->invocation_spec; if (!is) MVM_exception_throw_adhoc(tc, "Can only use setmultispec after setinvokespec"); MVM_ASSIGN_REF(tc, &(st->header), is->md_class_handle, ch); MVM_ASSIGN_REF(tc, &(st->header), is->md_valid_attr_name, valid_attr); MVM_ASSIGN_REF(tc, &(st->header), is->md_cache_attr_name, cache_attr); is->md_valid_hint = REPR(ch)->attr_funcs.hint_for(tc, STABLE(ch), ch, valid_attr); is->md_cache_hint = REPR(ch)->attr_funcs.hint_for(tc, STABLE(ch), ch, cache_attr); cur_op += 8; goto NEXT; } OP(ctxouterskipthunks): { MVMObject *this_ctx = GET_REG(cur_op, 2).o; MVMFrame *frame; if (!IS_CONCRETE(this_ctx) || REPR(this_ctx)->ID != MVM_REPR_ID_MVMContext) { MVM_exception_throw_adhoc(tc, "ctxouter needs an MVMContext"); } frame = ((MVMContext *)this_ctx)->body.context->outer; while (frame && frame->static_info->body.is_thunk) frame = frame->caller; if (frame) GET_REG(cur_op, 0).o = MVM_frame_context_wrapper(tc, frame); else GET_REG(cur_op, 0).o = tc->instance->VMNull; cur_op += 4; goto NEXT; } OP(ctxcallerskipthunks): { MVMObject *this_ctx = GET_REG(cur_op, 2).o, *ctx = NULL; MVMFrame *frame; if (!IS_CONCRETE(this_ctx) || REPR(this_ctx)->ID != MVM_REPR_ID_MVMContext) { MVM_exception_throw_adhoc(tc, "ctxcaller needs an MVMContext"); } frame = ((MVMContext *)this_ctx)->body.context->caller; while (frame && frame->static_info->body.is_thunk) frame = frame->caller; if (frame) ctx = MVM_frame_context_wrapper(tc, frame); GET_REG(cur_op, 0).o = ctx ? ctx : tc->instance->VMNull; cur_op += 4; goto NEXT; } OP(timer): GET_REG(cur_op, 0).o = MVM_io_timer_create(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).i64, GET_REG(cur_op, 10).o); cur_op += 12; goto NEXT; OP(cancel): MVM_io_eventloop_cancel_work(tc, GET_REG(cur_op, 0).o, NULL, NULL); cur_op += 2; goto NEXT; OP(signal): GET_REG(cur_op, 0).o = MVM_io_signal_handle(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).o); cur_op += 10; goto NEXT; OP(watchfile): GET_REG(cur_op, 0).o = MVM_io_file_watch(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).s, GET_REG(cur_op, 8).o); cur_op += 10; goto NEXT; OP(asyncconnect): GET_REG(cur_op, 0).o = MVM_io_socket_connect_async(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).s, GET_REG(cur_op, 8).i64, GET_REG(cur_op, 10).o); cur_op += 12; goto NEXT; OP(asynclisten): GET_REG(cur_op, 0).o = MVM_io_socket_listen_async(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).s, GET_REG(cur_op, 8).i64, (int)GET_REG(cur_op, 10).i64, GET_REG(cur_op, 12).o); cur_op += 14; goto NEXT; OP(asyncwritebytes): GET_REG(cur_op, 0).o = MVM_io_write_bytes_async(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).o, GET_REG(cur_op, 8).o, GET_REG(cur_op, 10).o); cur_op += 12; goto NEXT; OP(asyncreadbytes): GET_REG(cur_op, 0).o = MVM_io_read_bytes_async(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).o, GET_REG(cur_op, 8).o, GET_REG(cur_op, 10).o); cur_op += 12; goto NEXT; OP(getlexstatic_o): { MVMRegister *found = MVM_frame_find_lexical_by_name(tc, GET_REG(cur_op, 2).s, MVM_reg_obj); if (found) { GET_REG(cur_op, 0).o = found->o; if (MVM_spesh_log_is_logging(tc)) MVM_spesh_log_static(tc, found->o); } else { GET_REG(cur_op, 0).o = tc->instance->VMNull; } cur_op += 4; goto NEXT; } OP(getlexperinvtype_o): { MVMRegister *found = MVM_frame_find_lexical_by_name(tc, GET_REG(cur_op, 2).s, MVM_reg_obj); if (found) { GET_REG(cur_op, 0).o = found->o; if (MVM_spesh_log_is_logging(tc)) MVM_spesh_log_type(tc, found->o); } else { GET_REG(cur_op, 0).o = tc->instance->VMNull; } cur_op += 4; goto NEXT; } OP(execname): GET_REG(cur_op, 0).s = MVM_executable_name(tc); cur_op += 2; goto NEXT; OP(const_i64_16): GET_REG(cur_op, 0).i64 = GET_I16(cur_op, 2); cur_op += 4; goto NEXT; OP(const_i64_32): GET_REG(cur_op, 0).i64 = GET_I32(cur_op, 2); cur_op += 6; goto NEXT; OP(isnonnull): { MVMObject *obj = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).i64 = !MVM_is_null(tc, obj); cur_op += 4; goto NEXT; } OP(param_rn2_i): { MVMArgInfo param = MVM_args_get_named_int(tc, &tc->cur_frame->params, MVM_cu_string(tc, cu, GET_UI32(cur_op, 2)), MVM_ARG_OPTIONAL); if (param.exists) GET_REG(cur_op, 0).i64 = param.arg.i64; else GET_REG(cur_op, 0).i64 = MVM_args_get_named_int(tc, &tc->cur_frame->params, MVM_cu_string(tc, cu, GET_UI32(cur_op, 6)), MVM_ARG_REQUIRED).arg.i64; cur_op += 10; goto NEXT; } OP(param_rn2_n): { MVMArgInfo param = MVM_args_get_named_num(tc, &tc->cur_frame->params, MVM_cu_string(tc, cu, GET_UI32(cur_op, 2)), MVM_ARG_OPTIONAL); if (param.exists) GET_REG(cur_op, 0).n64 = param.arg.n64; else GET_REG(cur_op, 0).n64 = MVM_args_get_named_num(tc, &tc->cur_frame->params, MVM_cu_string(tc, cu, GET_UI32(cur_op, 6)), MVM_ARG_REQUIRED).arg.n64; cur_op += 10; goto NEXT; } OP(param_rn2_s): { MVMArgInfo param = MVM_args_get_named_str(tc, &tc->cur_frame->params, MVM_cu_string(tc, cu, GET_UI32(cur_op, 2)), MVM_ARG_OPTIONAL); if (param.exists) GET_REG(cur_op, 0).s = param.arg.s; else GET_REG(cur_op, 0).s = MVM_args_get_named_str(tc, &tc->cur_frame->params, MVM_cu_string(tc, cu, GET_UI32(cur_op, 6)), MVM_ARG_REQUIRED).arg.s; cur_op += 10; goto NEXT; } OP(param_rn2_o): { MVMArgInfo param = MVM_args_get_named_obj(tc, &tc->cur_frame->params, MVM_cu_string(tc, cu, GET_UI32(cur_op, 2)), MVM_ARG_OPTIONAL); if (!param.exists) param = MVM_args_get_named_obj(tc, &tc->cur_frame->params, MVM_cu_string(tc, cu, GET_UI32(cur_op, 6)), MVM_ARG_REQUIRED); GET_REG(cur_op, 0).o = param.arg.o; if (MVM_spesh_log_is_logging(tc)) MVM_spesh_log_parameter(tc, param.arg_idx, param.arg.o); cur_op += 10; goto NEXT; } OP(param_on2_i): { MVMArgInfo param = MVM_args_get_named_int(tc, &tc->cur_frame->params, MVM_cu_string(tc, cu, GET_UI32(cur_op, 2)), MVM_ARG_OPTIONAL); if (!param.exists) param = MVM_args_get_named_int(tc, &tc->cur_frame->params, MVM_cu_string(tc, cu, GET_UI32(cur_op, 6)), MVM_ARG_OPTIONAL); if (param.exists) { GET_REG(cur_op, 0).i64 = param.arg.i64; cur_op = bytecode_start + GET_UI32(cur_op, 10); } else { cur_op += 14; } goto NEXT; } OP(param_on2_n): { MVMArgInfo param = MVM_args_get_named_num(tc, &tc->cur_frame->params, MVM_cu_string(tc, cu, GET_UI32(cur_op, 2)), MVM_ARG_OPTIONAL); if (!param.exists) param = MVM_args_get_named_num(tc, &tc->cur_frame->params, MVM_cu_string(tc, cu, GET_UI32(cur_op, 6)), MVM_ARG_OPTIONAL); if (param.exists) { GET_REG(cur_op, 0).n64 = param.arg.n64; cur_op = bytecode_start + GET_UI32(cur_op, 10); } else { cur_op += 14; } goto NEXT; } OP(param_on2_s): { MVMArgInfo param = MVM_args_get_named_str(tc, &tc->cur_frame->params, MVM_cu_string(tc, cu, GET_UI32(cur_op, 2)), MVM_ARG_OPTIONAL); if (!param.exists) param = MVM_args_get_named_str(tc, &tc->cur_frame->params, MVM_cu_string(tc, cu, GET_UI32(cur_op, 6)), MVM_ARG_OPTIONAL); if (param.exists) { GET_REG(cur_op, 0).s = param.arg.s; cur_op = bytecode_start + GET_UI32(cur_op, 10); } else { cur_op += 14; } goto NEXT; } OP(param_on2_o): { MVMArgInfo param = MVM_args_get_named_obj(tc, &tc->cur_frame->params, MVM_cu_string(tc, cu, GET_UI32(cur_op, 2)), MVM_ARG_OPTIONAL); if (!param.exists) param = MVM_args_get_named_obj(tc, &tc->cur_frame->params, MVM_cu_string(tc, cu, GET_UI32(cur_op, 6)), MVM_ARG_OPTIONAL); if (param.exists) { GET_REG(cur_op, 0).o = param.arg.o; if (MVM_spesh_log_is_logging(tc)) MVM_spesh_log_parameter(tc, param.arg_idx, param.arg.o); cur_op = bytecode_start + GET_UI32(cur_op, 10); } else { cur_op += 14; } goto NEXT; } OP(osrpoint): if (MVM_spesh_log_is_logging(tc)) MVM_spesh_log_osr(tc); MVM_spesh_osr_poll_for_result(tc); goto NEXT; OP(nativecallcast): GET_REG(cur_op, 0).o = MVM_nativecall_cast(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).o); cur_op += 8; goto NEXT; OP(spawnprocasync): GET_REG(cur_op, 0).o = MVM_proc_spawn_async(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).s, GET_REG(cur_op, 8).o, GET_REG(cur_op, 10).o); cur_op += 12; goto NEXT; OP(killprocasync): MVM_proc_kill_async(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).i64); cur_op += 4; goto NEXT; OP(startprofile): MVM_profile_start(tc, GET_REG(cur_op, 0).o); cur_op += 2; goto NEXT; OP(endprofile): GET_REG(cur_op, 0).o = MVM_profile_end(tc); cur_op += 2; goto NEXT; OP(objectid): GET_REG(cur_op, 0).i64 = (MVMint64)MVM_gc_object_id(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(settypefinalize): MVM_gc_finalize_set(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).i64); cur_op += 4; goto NEXT; OP(force_gc): MVM_gc_enter_from_allocator(tc); goto NEXT; OP(nativecallglobal): GET_REG(cur_op, 0).o = MVM_nativecall_global(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).o, GET_REG(cur_op, 8).o); cur_op += 10; goto NEXT; OP(setparameterizer): MVM_6model_parametric_setup(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(parameterizetype): { MVMObject *type = GET_REG(cur_op, 2).o; MVMObject *params = GET_REG(cur_op, 4).o; MVMRegister *result = &(GET_REG(cur_op, 0)); cur_op += 6; MVM_6model_parametric_parameterize(tc, type, params, result); goto NEXT; } OP(typeparameterized): GET_REG(cur_op, 0).o = MVM_6model_parametric_type_parameterized(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(typeparameters): GET_REG(cur_op, 0).o = MVM_6model_parametric_type_parameters(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(typeparameterat): GET_REG(cur_op, 0).o = MVM_6model_parametric_type_parameter_at(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(readlink): GET_REG(cur_op, 0).s = MVM_file_readlink(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(lstat): GET_REG(cur_op, 0).i64 = MVM_file_stat(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64, 1); cur_op += 6; goto NEXT; OP(iscont_i): GET_REG(cur_op, 0).i64 = MVM_6model_container_iscont_i(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(iscont_n): GET_REG(cur_op, 0).i64 = MVM_6model_container_iscont_n(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(iscont_s): GET_REG(cur_op, 0).i64 = MVM_6model_container_iscont_s(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(assign_i): { MVMObject *cont = GET_REG(cur_op, 0).o; MVMint64 value = GET_REG(cur_op, 2).i64; cur_op += 4; MVM_6model_container_assign_i(tc, cont, value); goto NEXT; } OP(assign_n): { MVMObject *cont = GET_REG(cur_op, 0).o; MVMnum64 value = GET_REG(cur_op, 2).n64; cur_op += 4; MVM_6model_container_assign_n(tc, cont, value); goto NEXT; } OP(assign_s): { MVMObject *cont = GET_REG(cur_op, 0).o; MVMString *value = GET_REG(cur_op, 2).s; cur_op += 4; MVM_6model_container_assign_s(tc, cont, value); goto NEXT; } OP(decont_i): { MVMObject *obj = GET_REG(cur_op, 2).o; MVMRegister *r = &GET_REG(cur_op, 0); cur_op += 4; MVM_6model_container_decont_i(tc, obj, r); goto NEXT; } OP(decont_n): { MVMObject *obj = GET_REG(cur_op, 2).o; MVMRegister *r = &GET_REG(cur_op, 0); cur_op += 4; MVM_6model_container_decont_n(tc, obj, r); goto NEXT; } OP(decont_s): { MVMObject *obj = GET_REG(cur_op, 2).o; MVMRegister *r = &GET_REG(cur_op, 0); cur_op += 4; MVM_6model_container_decont_s(tc, obj, r); goto NEXT; } OP(getrusage): GET_REG(cur_op, 0).o = MVM_proc_getrusage(tc); cur_op += 2; goto NEXT; OP(threadlockcount): GET_REG(cur_op, 0).i64 = MVM_thread_lock_count(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(getlexref_i): GET_REG(cur_op, 0).o = MVM_nativeref_lex_i(tc, GET_UI16(cur_op, 4), GET_UI16(cur_op, 2)); cur_op += 6; goto NEXT; OP(getlexref_n): GET_REG(cur_op, 0).o = MVM_nativeref_lex_n(tc, GET_UI16(cur_op, 4), GET_UI16(cur_op, 2)); cur_op += 6; goto NEXT; OP(getlexref_s): GET_REG(cur_op, 0).o = MVM_nativeref_lex_s(tc, GET_UI16(cur_op, 4), GET_UI16(cur_op, 2)); cur_op += 6; goto NEXT; OP(getlexref_ni): GET_REG(cur_op, 0).o = MVM_nativeref_lex_name_i(tc, MVM_cu_string(tc, cu, GET_UI32(cur_op, 2))); cur_op += 6; goto NEXT; OP(getlexref_nn): GET_REG(cur_op, 0).o = MVM_nativeref_lex_name_n(tc, MVM_cu_string(tc, cu, GET_UI32(cur_op, 2))); cur_op += 6; goto NEXT; OP(getlexref_ns): GET_REG(cur_op, 0).o = MVM_nativeref_lex_name_s(tc, MVM_cu_string(tc, cu, GET_UI32(cur_op, 2))); cur_op += 6; goto NEXT; OP(atposref_i): GET_REG(cur_op, 0).o = MVM_nativeref_pos_i(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(atposref_n): GET_REG(cur_op, 0).o = MVM_nativeref_pos_n(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(atposref_s): GET_REG(cur_op, 0).o = MVM_nativeref_pos_s(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(getattrref_i): GET_REG(cur_op, 0).o = MVM_nativeref_attr_i(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, MVM_cu_string(tc, cu, GET_UI32(cur_op, 6))); cur_op += 12; goto NEXT; OP(getattrref_n): GET_REG(cur_op, 0).o = MVM_nativeref_attr_n(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, MVM_cu_string(tc, cu, GET_UI32(cur_op, 6))); cur_op += 12; goto NEXT; OP(getattrref_s): GET_REG(cur_op, 0).o = MVM_nativeref_attr_s(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, MVM_cu_string(tc, cu, GET_UI32(cur_op, 6))); cur_op += 12; goto NEXT; OP(getattrsref_i): GET_REG(cur_op, 0).o = MVM_nativeref_attr_i(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).s); cur_op += 8; goto NEXT; OP(getattrsref_n): GET_REG(cur_op, 0).o = MVM_nativeref_attr_n(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).s); cur_op += 8; goto NEXT; OP(getattrsref_s): GET_REG(cur_op, 0).o = MVM_nativeref_attr_s(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).s); cur_op += 8; goto NEXT; OP(nativecallsizeof): GET_REG(cur_op, 0).i64 = MVM_nativecall_sizeof(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(encodenorm): MVM_exception_throw_adhoc(tc, "NYI"); OP(normalizecodes): MVM_unicode_normalize_codepoints(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 4).o, MVM_unicode_normalizer_form(tc, GET_REG(cur_op, 2).i64)); cur_op += 6; goto NEXT; OP(strfromcodes): GET_REG(cur_op, 0).s = MVM_unicode_codepoints_to_nfg_string(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(strtocodes): MVM_unicode_string_to_codepoints(tc, GET_REG(cur_op, 0).s, MVM_unicode_normalizer_form(tc, GET_REG(cur_op, 2).i64), GET_REG(cur_op, 4).o); cur_op += 6; goto NEXT; OP(getcodelocation): GET_REG(cur_op, 0).o = MVM_code_location(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(eqatim_s): GET_REG(cur_op, 0).i64 = MVM_string_equal_at_ignore_mark(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(ordbaseat): GET_REG(cur_op, 0).i64 = MVM_string_ord_basechar_at(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(neverrepossess): MVM_6model_never_repossess(tc, GET_REG(cur_op, 0).o); cur_op += 2; goto NEXT; OP(scdisclaim): MVM_sc_disclaim(tc, (MVMSerializationContext *)GET_REG(cur_op, 0).o); cur_op += 2; goto NEXT; OP(atpos2d_i): GET_REG(cur_op, 0).i64 = MVM_repr_at_pos_2d_i(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(atpos2d_n): GET_REG(cur_op, 0).n64 = MVM_repr_at_pos_2d_n(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(atpos2d_s): GET_REG(cur_op, 0).s = MVM_repr_at_pos_2d_s(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(atpos2d_o): GET_REG(cur_op, 0).o = MVM_repr_at_pos_2d_o(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(atpos3d_i): GET_REG(cur_op, 0).i64 = MVM_repr_at_pos_3d_i(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).i64); cur_op += 10; goto NEXT; OP(atpos3d_n): GET_REG(cur_op, 0).n64 = MVM_repr_at_pos_3d_n(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).i64); cur_op += 10; goto NEXT; OP(atpos3d_s): GET_REG(cur_op, 0).s = MVM_repr_at_pos_3d_s(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).i64); cur_op += 10; goto NEXT; OP(atpos3d_o): GET_REG(cur_op, 0).o = MVM_repr_at_pos_3d_o(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).i64); cur_op += 10; goto NEXT; OP(atposnd_i): GET_REG(cur_op, 0).i64 = MVM_repr_at_pos_multidim_i(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 6; goto NEXT; OP(atposnd_n): GET_REG(cur_op, 0).n64 = MVM_repr_at_pos_multidim_n(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 6; goto NEXT; OP(atposnd_s): GET_REG(cur_op, 0).s = MVM_repr_at_pos_multidim_s(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 6; goto NEXT; OP(atposnd_o): GET_REG(cur_op, 0).o = MVM_repr_at_pos_multidim_o(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 6; goto NEXT; OP(bindpos2d_i): MVM_repr_bind_pos_2d_i(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(bindpos2d_n): MVM_repr_bind_pos_2d_n(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).n64); cur_op += 8; goto NEXT; OP(bindpos2d_s): MVM_repr_bind_pos_2d_s(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).s); cur_op += 8; goto NEXT; OP(bindpos2d_o): MVM_repr_bind_pos_2d_o(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).o); cur_op += 8; goto NEXT; OP(bindpos3d_i): MVM_repr_bind_pos_3d_i(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).i64); cur_op += 10; goto NEXT; OP(bindpos3d_n): MVM_repr_bind_pos_3d_n(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).n64); cur_op += 10; goto NEXT; OP(bindpos3d_s): MVM_repr_bind_pos_3d_s(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).s); cur_op += 10; goto NEXT; OP(bindpos3d_o): MVM_repr_bind_pos_3d_o(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).i64, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64, GET_REG(cur_op, 8).o); cur_op += 10; goto NEXT; OP(bindposnd_i): MVM_repr_bind_pos_multidim_i(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(bindposnd_n): MVM_repr_bind_pos_multidim_n(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).n64); cur_op += 6; goto NEXT; OP(bindposnd_s): MVM_repr_bind_pos_multidim_s(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; OP(bindposnd_o): MVM_repr_bind_pos_multidim_o(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 6; goto NEXT; OP(dimensions): GET_REG(cur_op, 0).o = MVM_repr_dimensions(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(setdimensions): MVM_repr_set_dimensions(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(numdimensions): GET_REG(cur_op, 0).i64 = MVM_repr_num_dimensions(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(ctxcode): { MVMObject *this_ctx = GET_REG(cur_op, 2).o; if (IS_CONCRETE(this_ctx) && REPR(this_ctx)->ID == MVM_REPR_ID_MVMContext) { MVMObject *code_obj = ((MVMContext *)this_ctx)->body.context->code_ref; GET_REG(cur_op, 0).o = code_obj ? code_obj : tc->instance->VMNull; cur_op += 4; } else { MVM_exception_throw_adhoc(tc, "ctxcode needs an MVMContext"); } goto NEXT; } OP(isrwcont): { MVMObject *obj = GET_REG(cur_op, 2).o; MVMint64 is_rw = 0; if (!MVM_is_null(tc, obj)) { const MVMContainerSpec *cs = STABLE(obj)->container_spec; is_rw = cs && cs->can_store(tc, obj); } GET_REG(cur_op, 0).i64 = is_rw; cur_op += 4; goto NEXT; } OP(fc): GET_REG(cur_op, 0).s = MVM_string_fc(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(encoderep): GET_REG(cur_op, 8).o = MVM_string_encode_to_buf(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s, GET_REG(cur_op, 8).o, GET_REG(cur_op, 6).s); cur_op += 10; goto NEXT; OP(istty_fh): GET_REG(cur_op, 0).i64 = MVM_io_is_tty(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(multidimref_i): GET_REG(cur_op, 0).o = MVM_nativeref_multidim_i(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 6; goto NEXT; OP(multidimref_n): GET_REG(cur_op, 0).o = MVM_nativeref_multidim_n(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 6; goto NEXT; OP(multidimref_s): GET_REG(cur_op, 0).o = MVM_nativeref_multidim_s(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 6; goto NEXT; OP(fileno_fh): GET_REG(cur_op, 0).i64 = MVM_io_fileno(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(asyncudp): GET_REG(cur_op, 0).o = MVM_io_socket_udp_async(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).s, GET_REG(cur_op, 8).i64, GET_REG(cur_op, 10).i64, GET_REG(cur_op, 12).o); cur_op += 14; goto NEXT; OP(asyncwritebytesto): GET_REG(cur_op, 0).o = MVM_io_write_bytes_to_async(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).o, GET_REG(cur_op, 8).o, GET_REG(cur_op, 10).o, GET_REG(cur_op, 12).s, GET_REG(cur_op, 14).i64); cur_op += 16; goto NEXT; OP(objprimbits): { MVMObject *type = GET_REG(cur_op, 2).o; if (type) { const MVMStorageSpec *ss = REPR(type)->get_storage_spec(tc, STABLE(type)); GET_REG(cur_op, 0).i64 = ss->boxed_primitive ? ss->bits : 0; } else { GET_REG(cur_op, 0).i64 = 0; } cur_op += 4; goto NEXT; } OP(objprimunsigned): { MVMObject *type = GET_REG(cur_op, 2).o; if (type) { const MVMStorageSpec *ss = REPR(type)->get_storage_spec(tc, STABLE(type)); GET_REG(cur_op, 0).i64 = ss->boxed_primitive == 1 ? ss->is_unsigned : 0; } else { GET_REG(cur_op, 0).i64 = 0; } cur_op += 4; goto NEXT; } OP(getlexref_i32): OP(getlexref_i16): OP(getlexref_i8): GET_REG(cur_op, 0).o = MVM_nativeref_lex_i(tc, GET_UI16(cur_op, 4), GET_UI16(cur_op, 2)); cur_op += 6; goto NEXT; OP(getlexref_n32): GET_REG(cur_op, 0).o = MVM_nativeref_lex_n(tc, GET_UI16(cur_op, 4), GET_UI16(cur_op, 2)); cur_op += 6; goto NEXT; OP(box_u): { MVM_box_uint(tc, GET_REG(cur_op, 2).u64, GET_REG(cur_op, 4).o, &GET_REG(cur_op, 0)); cur_op += 6; goto NEXT; } OP(unbox_u): { MVMObject *obj = GET_REG(cur_op, 2).o; if (!IS_CONCRETE(obj)) MVM_exception_throw_adhoc(tc, "Cannot unbox a type object"); GET_REG(cur_op, 0).u64 = REPR(obj)->box_funcs.get_uint(tc, STABLE(obj), obj, OBJECT_BODY(obj)); cur_op += 4; goto NEXT; } OP(coerce_iu): GET_REG(cur_op, 0).u64 = (MVMuint64)GET_REG(cur_op, 2).i64; cur_op += 4; goto NEXT; OP(coerce_ui): GET_REG(cur_op, 0).i64 = (MVMint64)GET_REG(cur_op, 2).u64; cur_op += 4; goto NEXT; OP(coerce_nu): GET_REG(cur_op, 0).u64 = (MVMuint64)GET_REG(cur_op, 2).n64; cur_op += 4; goto NEXT; OP(coerce_un): GET_REG(cur_op, 0).n64 = (MVMnum64)GET_REG(cur_op, 2).u64; cur_op += 4; goto NEXT; OP(decont_u): { MVMObject *obj = GET_REG(cur_op, 2).o; MVMRegister *r = &GET_REG(cur_op, 0); cur_op += 4; MVM_6model_container_decont_u(tc, obj, r); goto NEXT; } OP(getlexref_u): OP(getlexref_u32): OP(getlexref_u16): OP(getlexref_u8): /* XXX Cheat should have a _u here. */ GET_REG(cur_op, 0).o = MVM_nativeref_lex_i(tc, GET_UI16(cur_op, 4), GET_UI16(cur_op, 2)); cur_op += 6; goto NEXT; OP(param_rp_u): GET_REG(cur_op, 0).u64 = MVM_args_get_pos_uint(tc, &tc->cur_frame->params, GET_UI16(cur_op, 2), MVM_ARG_REQUIRED).arg.u64; cur_op += 4; goto NEXT; OP(param_op_u): { MVMArgInfo param = MVM_args_get_pos_uint(tc, &tc->cur_frame->params, GET_UI16(cur_op, 2), MVM_ARG_OPTIONAL); if (param.exists) { GET_REG(cur_op, 0).u64 = param.arg.u64; cur_op = bytecode_start + GET_UI32(cur_op, 4); } else { cur_op += 8; } goto NEXT; } OP(param_rn_u): GET_REG(cur_op, 0).u64 = MVM_args_get_named_uint(tc, &tc->cur_frame->params, MVM_cu_string(tc, cu, GET_UI32(cur_op, 2)), MVM_ARG_REQUIRED).arg.u64; cur_op += 6; goto NEXT; OP(param_on_u):{ MVMArgInfo param = MVM_args_get_named_uint(tc, &tc->cur_frame->params, MVM_cu_string(tc, cu, GET_UI32(cur_op, 2)), MVM_ARG_OPTIONAL); if (param.exists) { GET_REG(cur_op, 0).u64 = param.arg.u64; cur_op = bytecode_start + GET_UI32(cur_op, 6); } else { cur_op += 10; } goto NEXT; } OP(param_rn2_u): { MVMArgInfo param = MVM_args_get_named_uint(tc, &tc->cur_frame->params, MVM_cu_string(tc, cu, GET_UI32(cur_op, 2)), MVM_ARG_OPTIONAL); if (param.exists) GET_REG(cur_op, 0).u64 = param.arg.u64; else GET_REG(cur_op, 0).u64 = MVM_args_get_named_uint(tc, &tc->cur_frame->params, MVM_cu_string(tc, cu, GET_UI32(cur_op, 6)), MVM_ARG_REQUIRED).arg.u64; cur_op += 10; goto NEXT; } OP(param_on2_u): { MVMArgInfo param = MVM_args_get_named_uint(tc, &tc->cur_frame->params, MVM_cu_string(tc, cu, GET_UI32(cur_op, 2)), MVM_ARG_OPTIONAL); if (!param.exists) param = MVM_args_get_named_uint(tc, &tc->cur_frame->params, MVM_cu_string(tc, cu, GET_UI32(cur_op, 6)), MVM_ARG_OPTIONAL); if (param.exists) { GET_REG(cur_op, 0).u64 = param.arg.u64; cur_op = bytecode_start + GET_UI32(cur_op, 10); } else { cur_op += 14; } goto NEXT; } OP(stat_time): GET_REG(cur_op, 0).n64 = MVM_file_time(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64, 0); cur_op += 6; goto NEXT; OP(lstat_time): GET_REG(cur_op, 0).n64 = MVM_file_time(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).i64, 1); cur_op += 6; goto NEXT; OP(setdebugtypename): { MVMObject *obj = GET_REG(cur_op, 0).o; if (MVM_string_graphs(tc, GET_REG(cur_op, 2).s)) { char *debugname = MVM_string_utf8_encode_C_string(tc, GET_REG(cur_op, 2).s); if (STABLE(obj)->debug_name) { MVM_free(STABLE(obj)->debug_name); } STABLE(obj)->debug_name = debugname; } else { STABLE(obj)->debug_name = NULL; } cur_op += 4; goto NEXT; } OP(throwpayloadlex): { MVMRegister *rr = &GET_REG(cur_op, 0); MVMuint32 cat = (MVMuint32)MVM_BC_get_I64(cur_op, 2); MVMObject *payload = GET_REG(cur_op, 10).o; cur_op += 12; MVM_exception_throwpayload(tc, MVM_EX_THROW_LEX, cat, payload, rr); goto NEXT; } OP(throwpayloadlexcaller): { MVMRegister *rr = &GET_REG(cur_op, 0); MVMuint32 cat = (MVMuint32)MVM_BC_get_I64(cur_op, 2); MVMObject *payload = GET_REG(cur_op, 10).o; cur_op += 12; MVM_exception_throwpayload(tc, MVM_EX_THROW_LEX_CALLER, cat, payload, rr); goto NEXT; } OP(lastexpayload): GET_REG(cur_op, 0).o = tc->last_payload; cur_op += 2; goto NEXT; OP(cancelnotify): MVM_io_eventloop_cancel_work(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); cur_op += 6; goto NEXT; OP(decoderconfigure): { MVMObject *decoder = GET_REG(cur_op, 0).o; MVM_decoder_ensure_decoder(tc, decoder, "decoderconfigure"); MVM_decoder_configure(tc, (MVMDecoder *)decoder, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).o); cur_op += 6; goto NEXT; } OP(decodersetlineseps): { MVMObject *decoder = GET_REG(cur_op, 0).o; MVM_decoder_ensure_decoder(tc, decoder, "decodersetlineseps"); MVM_decoder_set_separators(tc, (MVMDecoder *)decoder, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; } OP(decoderaddbytes): { MVMObject *decoder = GET_REG(cur_op, 0).o; MVM_decoder_ensure_decoder(tc, decoder, "decoderaddbytes"); MVM_decoder_add_bytes(tc, (MVMDecoder *)decoder, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; } OP(decodertakechars): { MVMObject *decoder = GET_REG(cur_op, 2).o; MVM_decoder_ensure_decoder(tc, decoder, "decodertakechars"); GET_REG(cur_op, 0).s = MVM_decoder_take_chars(tc, (MVMDecoder *)decoder, GET_REG(cur_op, 4).i64, 0); cur_op += 6; goto NEXT; } OP(indexim_s): { GET_REG(cur_op, 0).i64 = MVM_string_index_ignore_mark(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; } OP(decodertakeallchars): { MVMObject *decoder = GET_REG(cur_op, 2).o; MVM_decoder_ensure_decoder(tc, decoder, "decodertakeallchars"); GET_REG(cur_op, 0).s = MVM_decoder_take_all_chars(tc, (MVMDecoder *)decoder); cur_op += 4; goto NEXT; } OP(decodertakeavailablechars): { MVMObject *decoder = GET_REG(cur_op, 2).o; MVM_decoder_ensure_decoder(tc, decoder, "decodertakeavailablechars"); GET_REG(cur_op, 0).s = MVM_decoder_take_available_chars(tc, (MVMDecoder *)decoder); cur_op += 4; goto NEXT; } OP(decodertakeline): { MVMObject *decoder = GET_REG(cur_op, 2).o; MVM_decoder_ensure_decoder(tc, decoder, "decodertakeline"); GET_REG(cur_op, 0).s = MVM_decoder_take_line(tc, (MVMDecoder *)decoder, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; } OP(decoderbytesavailable): { MVMObject *decoder = GET_REG(cur_op, 2).o; MVM_decoder_ensure_decoder(tc, decoder, "decoderbytesavailable"); GET_REG(cur_op, 0).i64 = MVM_decoder_bytes_available(tc, (MVMDecoder *)decoder); cur_op += 4; goto NEXT; } OP(decodertakebytes): { MVMObject *decoder = GET_REG(cur_op, 2).o; MVM_decoder_ensure_decoder(tc, decoder, "decodertakebytes"); GET_REG(cur_op, 0).o = MVM_decoder_take_bytes(tc, (MVMDecoder *)decoder, GET_REG(cur_op, 4).o, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; } OP(decoderempty): { MVMObject *decoder = GET_REG(cur_op, 2).o; MVM_decoder_ensure_decoder(tc, decoder, "decoderempty"); GET_REG(cur_op, 0).i64 = MVM_decoder_empty(tc, (MVMDecoder *)decoder); cur_op += 4; goto NEXT; } OP(indexingoptimized): GET_REG(cur_op, 0).s = MVM_string_indexing_optimized(tc, GET_REG(cur_op, 2).s); cur_op += 4; goto NEXT; OP(captureinnerlex): MVM_frame_capture_inner(tc, GET_REG(cur_op, 0).o); cur_op += 2; goto NEXT; OP(setdispatcherfor): { MVMObject *disp_for = GET_REG(cur_op, 2).o; tc->cur_dispatcher = GET_REG(cur_op, 0).o; tc->cur_dispatcher_for = REPR(disp_for)->ID == MVM_REPR_ID_MVMCode ? disp_for : MVM_frame_find_invokee(tc, disp_for, NULL); cur_op += 4; goto NEXT; } OP(cpucores): { GET_REG(cur_op, 0).i32 = MVM_platform_cpu_count(); cur_op += 2; goto NEXT; } OP(decodertakecharseof): { MVMObject *decoder = GET_REG(cur_op, 2).o; MVM_decoder_ensure_decoder(tc, decoder, "decodertakecharseof"); GET_REG(cur_op, 0).s = MVM_decoder_take_chars(tc, (MVMDecoder *)decoder, GET_REG(cur_op, 4).i64, 1); cur_op += 6; goto NEXT; } OP(cas_o): { MVMRegister *result = &GET_REG(cur_op, 0); MVMObject *target = GET_REG(cur_op, 2).o; MVMObject *expected = GET_REG(cur_op, 4).o; MVMObject *value = GET_REG(cur_op, 6).o; cur_op += 8; MVM_6model_container_cas(tc, target, expected, value, result); goto NEXT; } OP(cas_i): GET_REG(cur_op, 0).i64 = MVM_6model_container_cas_i(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(atomicinc_i): GET_REG(cur_op, 0).i64 = MVM_6model_container_atomic_inc(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(atomicdec_i): GET_REG(cur_op, 0).i64 = MVM_6model_container_atomic_dec(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(atomicadd_i): GET_REG(cur_op, 0).i64 = MVM_6model_container_atomic_add(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).i64); cur_op += 6; goto NEXT; OP(atomicload_o): GET_REG(cur_op, 0).o = MVM_6model_container_atomic_load(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(atomicload_i): GET_REG(cur_op, 0).i64 = MVM_6model_container_atomic_load_i(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(atomicstore_o): { MVMObject *target = GET_REG(cur_op, 0).o; MVMObject *value = GET_REG(cur_op, 2).o; cur_op += 4; MVM_6model_container_atomic_store(tc, target, value); goto NEXT; } OP(atomicstore_i): MVM_6model_container_atomic_store_i(tc, GET_REG(cur_op, 0).o, GET_REG(cur_op, 2).i64); cur_op += 4; goto NEXT; OP(barrierfull): MVM_barrier(); goto NEXT; OP(nativeinvoke_v): tc->cur_frame->return_value = NULL; tc->cur_frame->return_type = MVM_RETURN_VOID; MVM_nativecall_invoke_jit(tc, GET_REG(cur_op, 2).o); cur_op += 6; goto NEXT; OP(nativeinvoke_i): tc->cur_frame->return_value = &GET_REG(cur_op, 0); tc->cur_frame->return_type = MVM_RETURN_INT; MVM_nativecall_invoke_jit(tc, GET_REG(cur_op, 2).o); cur_op += 6; goto NEXT; OP(nativeinvoke_n): tc->cur_frame->return_value = &GET_REG(cur_op, 0); tc->cur_frame->return_type = MVM_RETURN_NUM; MVM_nativecall_invoke_jit(tc, GET_REG(cur_op, 2).o); cur_op += 6; goto NEXT; OP(nativeinvoke_s): tc->cur_frame->return_value = &GET_REG(cur_op, 0); tc->cur_frame->return_type = MVM_RETURN_STR; MVM_nativecall_invoke_jit(tc, GET_REG(cur_op, 2).o); cur_op += 6; goto NEXT; OP(nativeinvoke_o): tc->cur_frame->return_value = &GET_REG(cur_op, 0); tc->cur_frame->return_type = MVM_RETURN_OBJ; MVM_nativecall_invoke_jit(tc, GET_REG(cur_op, 2).o); cur_op += 6; goto NEXT; OP(getarg_i): GET_REG(cur_op, 0).i64 = tc->cur_frame->args[GET_REG(cur_op, 2).u16].i64; cur_op += 4; goto NEXT; OP(getarg_n): GET_REG(cur_op, 0).n64 = tc->cur_frame->args[GET_REG(cur_op, 2).u16].n64; cur_op += 4; goto NEXT; OP(getarg_s): GET_REG(cur_op, 0).s = tc->cur_frame->args[GET_REG(cur_op, 2).u16].s; cur_op += 4; goto NEXT; OP(getarg_o): GET_REG(cur_op, 0).o = tc->cur_frame->args[GET_REG(cur_op, 2).u16].o; cur_op += 4; goto NEXT; OP(coerce_II): { MVMObject * const type = GET_REG(cur_op, 4).o; GET_REG(cur_op, 0).o = MVM_bigint_from_bigint(tc, type, GET_REG(cur_op, 2).o); cur_op += 6; goto NEXT; } OP(encoderepconf): GET_REG(cur_op, 8).o = MVM_string_encode_to_buf_config(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s, GET_REG(cur_op, 8).o, GET_REG(cur_op, 6).s, GET_REG(cur_op, 10).i64); cur_op += 12; goto NEXT; OP(encodeconf): GET_REG(cur_op, 0).o = MVM_string_encode_to_buf_config(tc, GET_REG(cur_op, 2).s, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).o, NULL, GET_REG(cur_op, 8).i64); cur_op += 10; goto NEXT; OP(decodeconf): GET_REG(cur_op, 0).s = MVM_string_decode_from_buf_config(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).s, NULL, GET_REG(cur_op, 6).i64); cur_op += 8; goto NEXT; OP(decoderepconf): GET_REG(cur_op, 0).s = MVM_string_decode_from_buf_config(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).s, GET_REG(cur_op, 6).s, GET_REG(cur_op, 8).i64); cur_op += 10; goto NEXT; OP(getppid): GET_REG(cur_op, 0).i64 = MVM_proc_getppid(tc); cur_op += 2; goto NEXT; OP(sp_guard): { MVMObject *check = GET_REG(cur_op, 0).o; MVMSTable *want = (MVMSTable *)tc->cur_frame ->effective_spesh_slots[GET_UI16(cur_op, 2)]; cur_op += 8; if (!check || STABLE(check) != want) MVM_spesh_deopt_one(tc, GET_UI32(cur_op, -4)); goto NEXT; } OP(sp_guardconc): { MVMObject *check = GET_REG(cur_op, 0).o; MVMSTable *want = (MVMSTable *)tc->cur_frame ->effective_spesh_slots[GET_UI16(cur_op, 2)]; cur_op += 8; if (!check || !IS_CONCRETE(check) || STABLE(check) != want) MVM_spesh_deopt_one(tc, GET_UI32(cur_op, -4)); goto NEXT; } OP(sp_guardtype): { MVMObject *check = GET_REG(cur_op, 0).o; MVMSTable *want = (MVMSTable *)tc->cur_frame ->effective_spesh_slots[GET_UI16(cur_op, 2)]; cur_op += 8; if (!check || IS_CONCRETE(check) || STABLE(check) != want) MVM_spesh_deopt_one(tc, GET_UI32(cur_op, -4)); goto NEXT; } OP(sp_guardsf): { MVMObject *check = GET_REG(cur_op, 0).o; MVMStaticFrame *want = (MVMStaticFrame *)tc->cur_frame ->effective_spesh_slots[GET_UI16(cur_op, 2)]; cur_op += 8; if (REPR(check)->ID != MVM_REPR_ID_MVMCode || ((MVMCode *)check)->body.sf != want) MVM_spesh_deopt_one(tc, GET_UI32(cur_op, -4)); goto NEXT; } OP(sp_guardsfouter): { MVMObject *check = GET_REG(cur_op, 0).o; MVMStaticFrame *want = (MVMStaticFrame *)tc->cur_frame ->effective_spesh_slots[GET_UI16(cur_op, 2)]; cur_op += 8; if (REPR(check)->ID != MVM_REPR_ID_MVMCode || ((MVMCode *)check)->body.sf != want || ((MVMCode *)check)->body.outer != tc->cur_frame) MVM_spesh_deopt_one(tc, GET_UI32(cur_op, -4)); goto NEXT; } OP(sp_rebless): if (!REPR(GET_REG(cur_op, 2).o)->change_type) { MVM_exception_throw_adhoc(tc, "This REPR cannot change type"); } REPR(GET_REG(cur_op, 2).o)->change_type(tc, GET_REG(cur_op, 2).o, GET_REG(cur_op, 4).o); GET_REG(cur_op, 0).o = GET_REG(cur_op, 2).o; MVM_SC_WB_OBJ(tc, GET_REG(cur_op, 0).o); cur_op += 10; MVM_spesh_deopt_all(tc); MVM_spesh_deopt_one(tc, GET_UI32(cur_op, -4)); goto NEXT; OP(sp_resolvecode): GET_REG(cur_op, 0).o = MVM_frame_resolve_invokee_spesh(tc, GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; OP(sp_decont): { MVMObject *obj = GET_REG(cur_op, 2).o; MVMRegister *r = &GET_REG(cur_op, 0); cur_op += 4; if (obj && IS_CONCRETE(obj) && STABLE(obj)->container_spec) STABLE(obj)->container_spec->fetch(tc, obj, r); else r->o = obj; goto NEXT; } OP(sp_getlex_o): { MVMFrame *f = tc->cur_frame; MVMuint16 idx = GET_UI16(cur_op, 2); MVMuint16 outers = GET_UI16(cur_op, 4); MVMRegister found; while (outers) { if (!f->outer) MVM_exception_throw_adhoc(tc, "getlex: outer index out of range"); f = f->outer; outers--; } found = GET_LEX(cur_op, 2, f); GET_REG(cur_op, 0).o = found.o == NULL ? MVM_frame_vivify_lexical(tc, f, idx) : found.o; cur_op += 6; goto NEXT; } OP(sp_getlex_ins): { MVMFrame *f = tc->cur_frame; MVMuint16 idx = GET_UI16(cur_op, 2); MVMuint16 outers = GET_UI16(cur_op, 4); while (outers) { if (!f->outer) MVM_exception_throw_adhoc(tc, "getlex: outer index out of range"); f = f->outer; outers--; } GET_REG(cur_op, 0) = GET_LEX(cur_op, 2, f); cur_op += 6; goto NEXT; } OP(sp_getlex_no): { MVMRegister *found = MVM_frame_find_lexical_by_name(tc, MVM_cu_string(tc, cu, GET_UI32(cur_op, 2)), MVM_reg_obj); GET_REG(cur_op, 0).o = found ? found->o : tc->instance->VMNull; cur_op += 6; goto NEXT; } OP(sp_getarg_o): GET_REG(cur_op, 0).o = tc->cur_frame->params.args[GET_UI16(cur_op, 2)].o; cur_op += 4; goto NEXT; OP(sp_getarg_i): GET_REG(cur_op, 0).i64 = tc->cur_frame->params.args[GET_UI16(cur_op, 2)].i64; cur_op += 4; goto NEXT; OP(sp_getarg_n): GET_REG(cur_op, 0).n64 = tc->cur_frame->params.args[GET_UI16(cur_op, 2)].n64; cur_op += 4; goto NEXT; OP(sp_getarg_s): GET_REG(cur_op, 0).s = tc->cur_frame->params.args[GET_UI16(cur_op, 2)].s; cur_op += 4; goto NEXT; OP(sp_fastinvoke_v): { MVMCode *code = (MVMCode *)GET_REG(cur_op, 0).o; MVMRegister *args = tc->cur_frame->args; MVMint32 spesh_cand = GET_UI16(cur_op, 2); tc->cur_frame->return_value = NULL; tc->cur_frame->return_type = MVM_RETURN_VOID; cur_op += 4; tc->cur_frame->return_address = cur_op; MVM_frame_invoke(tc, code->body.sf, cur_callsite, args, code->body.outer, (MVMObject *)code, spesh_cand); goto NEXT; } OP(sp_fastinvoke_i): { MVMCode *code = (MVMCode *)GET_REG(cur_op, 2).o; MVMRegister *args = tc->cur_frame->args; MVMint32 spesh_cand = GET_UI16(cur_op, 4); tc->cur_frame->return_value = &GET_REG(cur_op, 0); tc->cur_frame->return_type = MVM_RETURN_INT; cur_op += 6; tc->cur_frame->return_address = cur_op; MVM_frame_invoke(tc, code->body.sf, cur_callsite, args, code->body.outer, (MVMObject *)code, spesh_cand); goto NEXT; } OP(sp_fastinvoke_n): { MVMCode *code = (MVMCode *)GET_REG(cur_op, 2).o; MVMRegister *args = tc->cur_frame->args; MVMint32 spesh_cand = GET_UI16(cur_op, 4); tc->cur_frame->return_value = &GET_REG(cur_op, 0); tc->cur_frame->return_type = MVM_RETURN_NUM; cur_op += 6; tc->cur_frame->return_address = cur_op; MVM_frame_invoke(tc, code->body.sf, cur_callsite, args, code->body.outer, (MVMObject *)code, spesh_cand); goto NEXT; } OP(sp_fastinvoke_s): { MVMCode *code = (MVMCode *)GET_REG(cur_op, 2).o; MVMRegister *args = tc->cur_frame->args; MVMint32 spesh_cand = GET_UI16(cur_op, 4); tc->cur_frame->return_value = &GET_REG(cur_op, 0); tc->cur_frame->return_type = MVM_RETURN_STR; cur_op += 6; tc->cur_frame->return_address = cur_op; MVM_frame_invoke(tc, code->body.sf, cur_callsite, args, code->body.outer, (MVMObject *)code, spesh_cand); goto NEXT; } OP(sp_fastinvoke_o): { MVMCode *code = (MVMCode *)GET_REG(cur_op, 2).o; MVMRegister *args = tc->cur_frame->args; MVMint32 spesh_cand = GET_UI16(cur_op, 4); tc->cur_frame->return_value = &GET_REG(cur_op, 0); tc->cur_frame->return_type = MVM_RETURN_OBJ; cur_op += 6; tc->cur_frame->return_address = cur_op; MVM_frame_invoke(tc, code->body.sf, cur_callsite, args, code->body.outer, (MVMObject *)code, spesh_cand); goto NEXT; } OP(sp_paramnamesused): MVM_args_throw_named_unused_error(tc, (MVMString *)tc->cur_frame ->effective_spesh_slots[GET_UI16(cur_op, 0)]); cur_op += 2; goto NEXT; OP(sp_getspeshslot): GET_REG(cur_op, 0).o = (MVMObject *)tc->cur_frame ->effective_spesh_slots[GET_UI16(cur_op, 2)]; cur_op += 4; goto NEXT; OP(sp_findmeth): { /* Obtain object and cache index; see if we get a match. */ MVMObject *obj = GET_REG(cur_op, 2).o; MVMuint16 idx = GET_UI16(cur_op, 8); if ((MVMSTable *)tc->cur_frame->effective_spesh_slots[idx] == STABLE(obj)) { GET_REG(cur_op, 0).o = (MVMObject *)tc->cur_frame->effective_spesh_slots[idx + 1]; cur_op += 10; } else { /* May invoke, so pre-increment op counter */ MVMString *name = MVM_cu_string(tc, cu, GET_UI32(cur_op, 4)); MVMRegister *res = &GET_REG(cur_op, 0); cur_op += 10; MVM_6model_find_method_spesh(tc, obj, name, idx, res); } goto NEXT; } OP(sp_fastcreate): { /* Assume we're in normal code, so doing a nursery allocation. * Also, that there is no initialize. */ MVMuint16 size = GET_UI16(cur_op, 2); MVMObject *obj = MVM_gc_allocate_zeroed(tc, size); obj->st = (MVMSTable *)tc->cur_frame->effective_spesh_slots[GET_UI16(cur_op, 4)]; obj->header.size = size; obj->header.owner = tc->thread_id; GET_REG(cur_op, 0).o = obj; cur_op += 6; goto NEXT; } OP(sp_get_o): { MVMObject *val = ((MVMObject *)((char *)GET_REG(cur_op, 2).o + GET_UI16(cur_op, 4))); GET_REG(cur_op, 0).o = val ? val : tc->instance->VMNull; cur_op += 6; goto NEXT; } OP(sp_get_i64): GET_REG(cur_op, 0).i64 = *((MVMint64 *)((char *)GET_REG(cur_op, 2).o + GET_UI16(cur_op, 4))); cur_op += 6; goto NEXT; OP(sp_get_i32): GET_REG(cur_op, 0).i64 = *((MVMint32 *)((char *)GET_REG(cur_op, 2).o + GET_UI16(cur_op, 4))); cur_op += 6; goto NEXT; OP(sp_get_i16): GET_REG(cur_op, 0).i64 = *((MVMint16 *)((char *)GET_REG(cur_op, 2).o + GET_UI16(cur_op, 4))); cur_op += 6; goto NEXT; OP(sp_get_i8): GET_REG(cur_op, 0).i64 = *((MVMint8 *)((char *)GET_REG(cur_op, 2).o + GET_UI16(cur_op, 4))); cur_op += 6; goto NEXT; OP(sp_get_n): GET_REG(cur_op, 0).n64 = *((MVMnum64 *)((char *)GET_REG(cur_op, 2).o + GET_UI16(cur_op, 4))); cur_op += 6; goto NEXT; OP(sp_get_s): GET_REG(cur_op, 0).s = ((MVMString *)((char *)GET_REG(cur_op, 2).o + GET_UI16(cur_op, 4))); cur_op += 6; goto NEXT; OP(sp_bind_o): { MVMObject *o = GET_REG(cur_op, 0).o; MVMObject *value = GET_REG(cur_op, 4).o; MVM_ASSIGN_REF(tc, &(o->header), *((MVMObject **)((char *)o + GET_UI16(cur_op, 2))), value); cur_op += 6; goto NEXT; } OP(sp_bind_i64): { MVMObject *o = GET_REG(cur_op, 0).o; *((MVMint64 *)((char *)o + GET_UI16(cur_op, 2))) = GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; } OP(sp_bind_i32): { MVMObject *o = GET_REG(cur_op, 0).o; *((MVMint32 *)((char *)o + GET_UI16(cur_op, 2))) = GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; } OP(sp_bind_i16): { MVMObject *o = GET_REG(cur_op, 0).o; *((MVMint16 *)((char *)o + GET_UI16(cur_op, 2))) = GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; } OP(sp_bind_i8): { MVMObject *o = GET_REG(cur_op, 0).o; *((MVMint8 *)((char *)o + GET_UI16(cur_op, 2))) = GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; } OP(sp_bind_n): { MVMObject *o = GET_REG(cur_op, 0).o; *((MVMnum64 *)((char *)o + GET_UI16(cur_op, 2))) = GET_REG(cur_op, 4).n64; cur_op += 6; goto NEXT; } OP(sp_bind_s): { MVMObject *o = GET_REG(cur_op, 0).o; MVMString *value = GET_REG(cur_op, 4).s; MVM_ASSIGN_REF(tc, &(o->header), *((MVMObject **)((char *)o + GET_UI16(cur_op, 2))), value); cur_op += 6; goto NEXT; } OP(sp_p6oget_o): { MVMObject *o = GET_REG(cur_op, 2).o; MVMObject *val = MVM_p6opaque_read_object(tc, o, GET_UI16(cur_op, 4)); GET_REG(cur_op, 0).o = val ? val : tc->instance->VMNull; cur_op += 6; goto NEXT; } OP(sp_p6ogetvt_o): { MVMObject *o = GET_REG(cur_op, 2).o; char *data = MVM_p6opaque_real_data(tc, OBJECT_BODY(o)); MVMObject *val = *((MVMObject **)(data + GET_UI16(cur_op, 4))); if (!val) { val = (MVMObject *)tc->cur_frame->effective_spesh_slots[GET_UI16(cur_op, 6)]; MVM_ASSIGN_REF(tc, &(o->header), *((MVMObject **)(data + GET_UI16(cur_op, 4))), val); } GET_REG(cur_op, 0).o = val; cur_op += 8; goto NEXT; } OP(sp_p6ogetvc_o): { MVMObject *o = GET_REG(cur_op, 2).o; char *data = MVM_p6opaque_real_data(tc, OBJECT_BODY(o)); MVMObject *val = *((MVMObject **)(data + GET_UI16(cur_op, 4))); if (!val) { /* Clone might allocate, so re-fetch things after it. */ val = MVM_repr_clone(tc, (MVMObject *)tc->cur_frame->effective_spesh_slots[GET_UI16(cur_op, 6)]); o = GET_REG(cur_op, 2).o; data = MVM_p6opaque_real_data(tc, OBJECT_BODY(o)); MVM_ASSIGN_REF(tc, &(o->header), *((MVMObject **)(data + GET_UI16(cur_op, 4))), val); } GET_REG(cur_op, 0).o = val; cur_op += 8; goto NEXT; } OP(sp_p6oget_i): { MVMObject *o = GET_REG(cur_op, 2).o; char *data = MVM_p6opaque_real_data(tc, OBJECT_BODY(o)); GET_REG(cur_op, 0).i64 = *((MVMint64 *)(data + GET_UI16(cur_op, 4))); cur_op += 6; goto NEXT; } OP(sp_p6oget_n): { MVMObject *o = GET_REG(cur_op, 2).o; char *data = MVM_p6opaque_real_data(tc, OBJECT_BODY(o)); GET_REG(cur_op, 0).n64 = *((MVMnum64 *)(data + GET_UI16(cur_op, 4))); cur_op += 6; goto NEXT; } OP(sp_p6oget_s): { MVMObject *o = GET_REG(cur_op, 2).o; char *data = MVM_p6opaque_real_data(tc, OBJECT_BODY(o)); GET_REG(cur_op, 0).s = *((MVMString **)(data + GET_UI16(cur_op, 4))); cur_op += 6; goto NEXT; } OP(sp_p6obind_o): { MVMObject *o = GET_REG(cur_op, 0).o; MVMObject *value = GET_REG(cur_op, 4).o; char *data = MVM_p6opaque_real_data(tc, OBJECT_BODY(o)); MVM_ASSIGN_REF(tc, &(o->header), *((MVMObject **)(data + GET_UI16(cur_op, 2))), value); cur_op += 6; goto NEXT; } OP(sp_p6obind_i): { MVMObject *o = GET_REG(cur_op, 0).o; char *data = MVM_p6opaque_real_data(tc, OBJECT_BODY(o)); *((MVMint64 *)(data + GET_UI16(cur_op, 2))) = GET_REG(cur_op, 4).i64; cur_op += 6; goto NEXT; } OP(sp_p6obind_n): { MVMObject *o = GET_REG(cur_op, 0).o; char *data = MVM_p6opaque_real_data(tc, OBJECT_BODY(o)); *((MVMnum64 *)(data + GET_UI16(cur_op, 2))) = GET_REG(cur_op, 4).n64; cur_op += 6; goto NEXT; } OP(sp_p6obind_s): { MVMObject *o = GET_REG(cur_op, 0).o; char *data = MVM_p6opaque_real_data(tc, OBJECT_BODY(o)); MVM_ASSIGN_REF(tc, &(o->header), *((MVMString **)(data + GET_UI16(cur_op, 2))), GET_REG(cur_op, 4).s); cur_op += 6; goto NEXT; } OP(sp_deref_get_i64): { MVMObject *o = GET_REG(cur_op, 2).o; MVMint64 **target = ((MVMint64 **)((char *)o + GET_UI16(cur_op, 4))); GET_REG(cur_op, 0).i64 = **target; cur_op += 6; goto NEXT; } OP(sp_deref_get_n): { MVMObject *o = GET_REG(cur_op, 2).o; MVMnum64 **target = ((MVMnum64 **)((char *)o + GET_UI16(cur_op, 4))); GET_REG(cur_op, 0).n64 = **target; cur_op += 6; goto NEXT; } OP(sp_deref_bind_i64): { MVMObject *o = GET_REG(cur_op, 0).o; MVMint64 **target = ((MVMint64 **)((char *)o + GET_UI16(cur_op, 4))); **target = GET_REG(cur_op, 2).i64; cur_op += 6; goto NEXT; } OP(sp_deref_bind_n): { MVMObject *o = GET_REG(cur_op, 0).o; MVMnum64 **target = ((MVMnum64 **)((char *)o + GET_UI16(cur_op, 4))); **target = GET_REG(cur_op, 2).n64; cur_op += 6; goto NEXT; } OP(sp_getlexvia_o): { MVMFrame *f = ((MVMCode *)GET_REG(cur_op, 6).o)->body.outer; MVMuint16 idx = GET_UI16(cur_op, 2); MVMuint16 outers = GET_UI16(cur_op, 4) - 1; /* - 1 as already in outer */ MVMRegister found; while (outers) { if (!f->outer) MVM_exception_throw_adhoc(tc, "getlex: outer index out of range"); f = f->outer; outers--; } found = GET_LEX(cur_op, 2, f); GET_REG(cur_op, 0).o = found.o == NULL ? MVM_frame_vivify_lexical(tc, f, idx) : found.o; cur_op += 8; goto NEXT; } OP(sp_getlexvia_ins): { MVMFrame *f = ((MVMCode *)GET_REG(cur_op, 6).o)->body.outer; MVMuint16 idx = GET_UI16(cur_op, 2); MVMuint16 outers = GET_UI16(cur_op, 4) - 1; /* - 1 as already in outer */ while (outers) { if (!f->outer) MVM_exception_throw_adhoc(tc, "getlex: outer index out of range"); f = f->outer; outers--; } GET_REG(cur_op, 0) = GET_LEX(cur_op, 2, f); cur_op += 8; goto NEXT; } OP(sp_jit_enter): { if (tc->cur_frame->spesh_cand->jitcode == NULL) { MVM_exception_throw_adhoc(tc, "Try to enter NULL jitcode"); } /* trampoline back to this opcode */ cur_op -= 2; MVM_jit_enter_code(tc, cu, tc->cur_frame->spesh_cand->jitcode); if (!tc->cur_frame) { /* somehow unwound our top frame */ goto return_label; } goto NEXT; } OP(sp_boolify_iter): { GET_REG(cur_op, 0).i64 = MVM_iter_istrue(tc, (MVMIter*)GET_REG(cur_op, 2).o); cur_op += 4; goto NEXT; } OP(sp_boolify_iter_arr): { MVMIter *iter = (MVMIter *)GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).i64 = iter->body.array_state.index + 1 < iter->body.array_state.limit ? 1 : 0; cur_op += 4; goto NEXT; } OP(sp_boolify_iter_hash): { MVMIter *iter = (MVMIter *)GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).i64 = iter->body.hash_state.next != NULL ? 1 : 0; cur_op += 4; goto NEXT; } OP(sp_cas_o): { MVMRegister *result = &GET_REG(cur_op, 0); MVMObject *target = GET_REG(cur_op, 2).o; MVMObject *expected = GET_REG(cur_op, 4).o; MVMObject *value = GET_REG(cur_op, 6).o; cur_op += 8; target->st->container_spec->cas(tc, target, expected, value, result); goto NEXT; } OP(sp_atomicload_o): { MVMObject *target = GET_REG(cur_op, 2).o; GET_REG(cur_op, 0).o = target->st->container_spec->atomic_load(tc, target); cur_op += 4; goto NEXT; } OP(sp_atomicstore_o): { MVMObject *target = GET_REG(cur_op, 0).o; MVMObject *value = GET_REG(cur_op, 2).o; cur_op += 4; target->st->container_spec->atomic_store(tc, target, value); goto NEXT; } OP(prof_enter): MVM_profile_log_enter(tc, tc->cur_frame->static_info, MVM_PROFILE_ENTER_NORMAL); goto NEXT; OP(prof_enterspesh): MVM_profile_log_enter(tc, tc->cur_frame->static_info, MVM_PROFILE_ENTER_SPESH); goto NEXT; OP(prof_enterinline): MVM_profile_log_enter(tc, (MVMStaticFrame *)tc->cur_frame->effective_spesh_slots[GET_UI16(cur_op, 0)], MVM_PROFILE_ENTER_SPESH_INLINE); cur_op += 2; goto NEXT; OP(prof_enternative): MVM_profile_log_enter_native(tc, GET_REG(cur_op, 0).o); cur_op += 2; goto NEXT; OP(prof_exit): MVM_profile_log_exit(tc); goto NEXT; OP(prof_allocated): MVM_profile_log_allocated(tc, GET_REG(cur_op, 0).o); cur_op += 2; goto NEXT; OP(ctw_check): { MVMObject *obj = GET_REG(cur_op, 0).o; MVMint16 blame = GET_I16(cur_op, 2); cur_op += 4; MVM_cross_thread_write_check(tc, obj, blame); goto NEXT; } OP(DEPRECATED_4): OP(DEPRECATED_5): OP(DEPRECATED_6): OP(DEPRECATED_7): OP(DEPRECATED_8): OP(DEPRECATED_9): OP(DEPRECATED_10): OP(DEPRECATED_11): OP(DEPRECATED_12): MVM_exception_throw_adhoc(tc, "The getregref_* ops were removed in MoarVM 2017.01."); OP(DEPRECATED_13): MVM_exception_throw_adhoc(tc, "The continuationclone op was removed in MoarVM 2017.01."); OP(DEPRECATED_14): MVM_exception_throw_adhoc(tc, "The asyncwritestr op was removed in MoarVM 2017.05."); OP(DEPRECATED_15): MVM_exception_throw_adhoc(tc, "The asyncwritestrto op was removed in MoarVM 2017.05."); OP(DEPRECATED_16): MVM_exception_throw_adhoc(tc, "The asyncreadchars op was removed in MoarVM 2017.05."); OP(DEPRECATED_17): MVM_exception_throw_adhoc(tc, "The setencoding op was removed in MoarVM 2017.06."); OP(DEPRECATED_18): MVM_exception_throw_adhoc(tc, "The write_fhs op was removed in MoarVM 2017.06."); OP(DEPRECATED_19): MVM_exception_throw_adhoc(tc, "The say_fhs op was removed in MoarVM 2017.06."); OP(DEPRECATED_21): MVM_exception_throw_adhoc(tc, "The readlinechomp_fh op was removed in MoarVM 2017.06."); OP(DEPRECATED_22): MVM_exception_throw_adhoc(tc, "The readall_fh op was removed in MoarVM 2017.06."); OP(DEPRECATED_23): MVM_exception_throw_adhoc(tc, "The read_fhs op was removed in MoarVM 2017.06."); OP(DEPRECATED_24): MVM_exception_throw_adhoc(tc, "The setinputlinesep op was removed in MoarVM 2017.06."); OP(DEPRECATED_25): MVM_exception_throw_adhoc(tc, "The setinputlineseps op was removed in MoarVM 2017.06."); OP(DEPRECATED_27): MVM_exception_throw_adhoc(tc, "The slurp op was removed in MoarVM 2017.06."); OP(DEPRECATED_28): MVM_exception_throw_adhoc(tc, "The spew op was removed in MoarVM 2017.06."); OP(DEPRECATED_29): MVM_exception_throw_adhoc(tc, "The spawn op was removed in MoarVM 2017.07."); OP(DEPRECATED_30): MVM_exception_throw_adhoc(tc, "The shell op was removed in MoarVM 2017.07."); OP(DEPRECATED_31): MVM_exception_throw_adhoc(tc, "The syncpipe op was removed in MoarVM 2017.07."); OP(DEPRECATED_32): MVM_exception_throw_adhoc(tc, "The close_fhi op was removed in MoarVM 2017.07."); OP(DEPRECATED_33): MVM_exception_throw_adhoc(tc, "The newlexotic op was removed in MoarVM 2017.08."); OP(DEPRECATED_34): MVM_exception_throw_adhoc(tc, "The lexoticresult op was removed in MoarVM 2017.08."); OP(coverage_log): { MVMString *filename = MVM_cu_string(tc, cu, GET_UI32(cur_op, 0)); MVMuint32 lineno = GET_UI32(cur_op, 4); MVMuint32 cacheidx = GET_UI32(cur_op, 8); char *cache = (char *)MVM_BC_get_I64(cur_op, 12); MVM_line_coverage_report(tc, filename, lineno, cacheidx, cache); cur_op += 20; goto NEXT; } OP(breakpoint): { MVMuint32 file_idx = GET_UI32(cur_op, 0); MVMuint32 line_no = GET_UI32(cur_op, 4); MVM_debugserver_breakpoint_check(tc, file_idx, line_no); cur_op += 8; goto NEXT; } OP(coveragecontrol): { MVMuint32 cc = (MVMuint32)GET_REG(cur_op, 0).i64; if (tc->instance->coverage_control && (cc == 0 || cc == 1)) tc->instance->coverage_control = cc + 1; cur_op += 2; goto NEXT; } #if MVM_CGOTO OP_CALL_EXTOP: { /* Bounds checking? Never heard of that. */ MVMuint8 *op_before = cur_op; MVMExtOpRecord *record = &cu->body.extops[op - MVM_OP_EXT_BASE]; record->func(tc, cur_op); if (op_before == cur_op) cur_op += record->operand_bytes; goto NEXT; } #else default: { if (op >= MVM_OP_EXT_BASE && (op - MVM_OP_EXT_BASE) < cu->body.num_extops) { MVMuint8 *op_before = cur_op; MVMExtOpRecord *record = &cu->body.extops[op - MVM_OP_EXT_BASE]; record->func(tc, cur_op); if (op_before == cur_op) cur_op += record->operand_bytes; goto NEXT; } MVM_panic(MVM_exitcode_invalidopcode, "Invalid opcode executed (corrupt bytecode stream?) opcode %u", op); } #endif } } return_label: /* Need to clear these pointer pointers since they may be rooted * by some GC procedure. */ tc->interp_cur_op = NULL; tc->interp_bytecode_start = NULL; tc->interp_reg_base = NULL; tc->interp_cu = NULL; MVM_barrier(); } void MVM_interp_enable_tracing() { tracing_enabled = 1; } MoarVM-2018.03/src/core/interp.h0000644000175000017510000001126613242626641016410 0ustar samanthasamantha/* A GC sync point is a point where we can check if we're being signalled * to stop to do a GC run. This is placed at points where it is safe to * do such a thing, and hopefully so that it happens often enough; note * that every call down to the allocator is also a sync point, so this * really only means we need to do this enough to make sure tight native * loops trigger it. */ /* Don't use a MVM_load(&tc->gc_status) here for performance, it's okay * if the interrupt is delayed a bit. */ #define GC_SYNC_POINT(tc) \ if (tc->gc_status) { \ MVM_gc_enter_from_interrupt(tc); \ } /* Different views of a register. */ union MVMRegister { MVMObject *o; MVMString *s; MVMint8 i8; MVMuint8 u8; MVMint16 i16; MVMuint16 u16; MVMint32 i32; MVMuint32 u32; MVMint64 i64; MVMuint64 u64; MVMnum32 n32; MVMnum64 n64; }; /* Most operands an operation will have. */ #define MVM_MAX_OPERANDS 8 /* Kind of de-opt mark. */ #define MVM_DEOPT_MARK_ONE 1 #define MVM_DEOPT_MARK_ALL 2 #define MVM_DEOPT_MARK_OSR 4 #define MVM_DEOPT_MARK_ONE_PRE 8 /* Information about an opcode. */ struct MVMOpInfo { MVMuint16 opcode; const char *name; char mark[2]; MVMuint16 num_operands; MVMuint8 pure; MVMuint8 deopt_point; MVMuint8 logged; MVMuint8 no_inline; MVMuint8 jittivity; MVMuint8 uses_hll; MVMuint8 operands[MVM_MAX_OPERANDS]; }; /* Operand read/write/literal flags. */ #define MVM_operand_literal 0 #define MVM_operand_read_reg 1 #define MVM_operand_write_reg 2 #define MVM_operand_read_lex 3 #define MVM_operand_write_lex 4 #define MVM_operand_rw_mask 7 /* Register data types. */ #define MVM_reg_int8 1 #define MVM_reg_int16 2 #define MVM_reg_int32 3 #define MVM_reg_int64 4 #define MVM_reg_num32 5 #define MVM_reg_num64 6 #define MVM_reg_str 7 #define MVM_reg_obj 8 #define MVM_reg_uint8 17 #define MVM_reg_uint16 18 #define MVM_reg_uint32 19 #define MVM_reg_uint64 20 /* Operand data types. */ #define MVM_operand_int8 (MVM_reg_int8 << 3) #define MVM_operand_int16 (MVM_reg_int16 << 3) #define MVM_operand_int32 (MVM_reg_int32 << 3) #define MVM_operand_int64 (MVM_reg_int64 << 3) #define MVM_operand_num32 (MVM_reg_num32 << 3) #define MVM_operand_num64 (MVM_reg_num64 << 3) #define MVM_operand_str (MVM_reg_str << 3) #define MVM_operand_obj (MVM_reg_obj << 3) #define MVM_operand_ins (9 << 3) #define MVM_operand_type_var (10 << 3) #define MVM_operand_coderef (12 << 3) #define MVM_operand_callsite (13 << 3) #define MVM_operand_spesh_slot (16 << 3) #define MVM_operand_uint8 (MVM_reg_uint8 << 3) #define MVM_operand_uint16 (MVM_reg_uint16 << 3) #define MVM_operand_uint32 (MVM_reg_uint32 << 3) #define MVM_operand_uint64 (MVM_reg_uint64 << 3) #define MVM_operand_type_mask (31 << 3) /* Functions. */ void MVM_interp_run(MVMThreadContext *tc, void (*initial_invoke)(MVMThreadContext *, void *), void *invoke_data); MVM_PUBLIC void MVM_interp_enable_tracing(); MVM_STATIC_INLINE MVMint64 MVM_BC_get_I64(const MVMuint8 *cur_op, int offset) { const MVMuint8 *const where = cur_op + offset; #ifdef MVM_CAN_UNALIGNED_INT64 return *(MVMint64 *)where; #else MVMint64 temp; memmove(&temp, where, sizeof(MVMint64)); return temp; #endif } MVM_STATIC_INLINE MVMnum64 MVM_BC_get_N64(const MVMuint8 *cur_op, int offset) { const MVMuint8 *const where = cur_op + offset; #ifdef MVM_CAN_UNALIGNED_NUM64 return *(MVMnum64 *)where; #else MVMnum64 temp; memmove(&temp, cur_op + offset, sizeof(MVMnum64)); return temp; #endif } /* For MVM_reg_* types */ static char * MVM_reg_get_debug_name(MVMThreadContext *tc, MVMuint16 type) { switch (type) { case MVM_reg_int8: return "int8"; case MVM_reg_int16: return "int16"; case MVM_reg_int32: return "int32"; case MVM_reg_int64: return "int64"; case MVM_reg_num32: return "num32"; case MVM_reg_num64: return "num64"; case MVM_reg_str: return "str"; case MVM_reg_obj: return "obj"; case MVM_reg_uint8: return "uint8"; case MVM_reg_uint16: return "uint16"; case MVM_reg_uint32: return "uint32"; case MVM_reg_uint64: return "uint64"; default: return "unknown"; } } MoarVM-2018.03/src/core/loadbytecode.c0000644000175000017510000001137513237701240017532 0ustar samanthasamantha#include "moar.h" /* Handles loading of bytecode, including triggering the deserialize and load * special frames. Takes place in two steps, with a callback between them which * is triggered by the special_return mechanism. */ static void run_load(MVMThreadContext *tc, void *sr_data); static void mark_sr_data(MVMThreadContext *tc, MVMFrame *frame, MVMGCWorklist *worklist) { MVM_gc_worklist_add(tc, worklist, &frame->extra->special_return_data); } static void run_comp_unit(MVMThreadContext *tc, MVMCompUnit *cu) { /* If there's a deserialization frame, need to run that. */ if (cu->body.deserialize_frame) { /* Set up special return to delegate to running the load frame, * if any. */ tc->cur_frame->return_value = NULL; tc->cur_frame->return_type = MVM_RETURN_VOID; MVM_frame_special_return(tc, tc->cur_frame, run_load, NULL, cu, mark_sr_data); /* Invoke the deserialization frame and return to the runloop. */ MVM_frame_invoke(tc, cu->body.deserialize_frame, MVM_callsite_get_common(tc, MVM_CALLSITE_ID_NULL_ARGS), NULL, NULL, NULL, -1); } else { /* No deserialize frame, so do load frame instead. */ run_load(tc, cu); } } void MVM_load_bytecode_buffer(MVMThreadContext *tc, MVMObject *buf) { MVMCompUnit *cu; MVMuint8 *data_start; MVMuint32 data_size; /* Ensure the source is in the correct form. */ if ( !IS_CONCRETE(buf) || REPR(buf)->ID != MVM_REPR_ID_VMArray || ( ((MVMArrayREPRData *)STABLE(buf)->REPR_data)->slot_type != MVM_ARRAY_U8 && ((MVMArrayREPRData *)STABLE(buf)->REPR_data)->slot_type != MVM_ARRAY_I8 ) ) MVM_exception_throw_adhoc(tc, "loadbytecodebuffer requires a native int8 or uint8 array to read from"); /* MVMCompUnit expects the data to be non-GC managed as it usually comes straight from a file */ data_size = ((MVMArray *)buf)->body.elems; data_start = MVM_malloc(data_size); memcpy(data_start, (MVMuint8 *)(((MVMArray *)buf)->body.slots.i8 + ((MVMArray *)buf)->body.start), data_size); cu = MVM_cu_from_bytes(tc, data_start, data_size); run_comp_unit(tc, cu); } void MVM_load_bytecode(MVMThreadContext *tc, MVMString *filename) { MVMCompUnit *cu; MVMLoadedCompUnitName *loaded_name; /* Work out actual filename to use, taking --libpath into account. */ filename = MVM_file_in_libpath(tc, filename); /* See if we already loaded this. */ uv_mutex_lock(&tc->instance->mutex_loaded_compunits); MVM_tc_set_ex_release_mutex(tc, &tc->instance->mutex_loaded_compunits); MVM_HASH_GET(tc, tc->instance->loaded_compunits, filename, loaded_name); if (loaded_name) { /* already loaded */ goto LEAVE; } /* Otherwise, load from disk. */ MVMROOT(tc, filename, { char *c_filename = MVM_string_utf8_c8_encode_C_string(tc, filename); /* XXX any exception from MVM_cu_map_from_file needs to be handled * and c_filename needs to be freed */ cu = MVM_cu_map_from_file(tc, c_filename); MVM_free(c_filename); cu->body.filename = filename; run_comp_unit(tc, cu); loaded_name = MVM_calloc(1, sizeof(MVMLoadedCompUnitName)); loaded_name->filename = filename; MVM_HASH_BIND(tc, tc->instance->loaded_compunits, filename, loaded_name); }); LEAVE: MVM_tc_clear_ex_release_mutex(tc); uv_mutex_unlock(&tc->instance->mutex_loaded_compunits); } void MVM_load_bytecode_fh(MVMThreadContext *tc, MVMObject *oshandle, MVMString *filename) { MVMCompUnit *cu; if (REPR(oshandle)->ID != MVM_REPR_ID_MVMOSHandle) MVM_exception_throw_adhoc(tc, "loadbytecodefh requires an object with REPR MVMOSHandle"); MVMROOT(tc, filename, { MVMuint64 pos = MVM_io_tell(tc, oshandle); cu = MVM_cu_map_from_file_handle(tc, MVM_io_fileno(tc, oshandle), pos); cu->body.filename = filename; run_comp_unit(tc, cu); }); } /* Callback after running deserialize code to run the load code. */ static void run_load(MVMThreadContext *tc, void *sr_data) { MVMCompUnit *cu = (MVMCompUnit *)sr_data; /* If there's a load frame, need to run that. If not, we're done. */ if (cu->body.load_frame) { /* Make sure the call happens in void context. No special return * handler here; we want to go back to the place that used the * loadbytecode op in the first place. */ tc->cur_frame->return_value = NULL; tc->cur_frame->return_type = MVM_RETURN_VOID; /* Invoke the load frame and return to the runloop. */ MVM_frame_invoke(tc, cu->body.load_frame, MVM_callsite_get_common(tc, MVM_CALLSITE_ID_NULL_ARGS), NULL, NULL, NULL, -1); } } MoarVM-2018.03/src/core/loadbytecode.h0000644000175000017510000000034313237701240017530 0ustar samanthasamanthavoid MVM_load_bytecode_buffer(MVMThreadContext *tc, MVMObject *buf); void MVM_load_bytecode(MVMThreadContext *tc, MVMString *filename); void MVM_load_bytecode_fh(MVMThreadContext *tc, MVMObject *oshandle, MVMString *filename); MoarVM-2018.03/src/core/nativecall.c0000644000175000017510000013737513242626641017236 0ustar samanthasamantha#include "moar.h" #ifndef _WIN32 #include #endif #include #include /* Grabs a NativeCall body. */ MVMNativeCallBody * MVM_nativecall_get_nc_body(MVMThreadContext *tc, MVMObject *obj) { if (REPR(obj)->ID == MVM_REPR_ID_MVMNativeCall) return (MVMNativeCallBody *)OBJECT_BODY(obj); else return (MVMNativeCallBody *)REPR(obj)->box_funcs.get_boxed_ref(tc, STABLE(obj), obj, OBJECT_BODY(obj), MVM_REPR_ID_MVMNativeCall); } /* Gets the flag for whether to free a string after a call or not. */ static MVMint16 get_str_free_flag(MVMThreadContext *tc, MVMObject *info) { MVMString *flag = tc->instance->str_consts.free_str; if (MVM_repr_exists_key(tc, info, flag)) if (!MVM_repr_get_int(tc, MVM_repr_at_key_o(tc, info, flag))) return MVM_NATIVECALL_ARG_NO_FREE_STR; return MVM_NATIVECALL_ARG_FREE_STR; } /* Gets the flag for whether an arg is rw or not. */ static MVMint16 get_rw_flag(MVMThreadContext *tc, MVMObject *info) { MVMString *flag = tc->instance->str_consts.rw; if (MVM_repr_exists_key(tc, info, flag)) { if (MVM_repr_get_int(tc, MVM_repr_at_key_o(tc, info, flag))) return MVM_NATIVECALL_ARG_RW; } return MVM_NATIVECALL_ARG_NO_RW; } /* Gets the flag for whether an arg is rw or not. */ static MVMint16 get_refresh_flag(MVMThreadContext *tc, MVMObject *info) { MVMString *typeobj_str = tc->instance->str_consts.typeobj; if (MVM_repr_exists_key(tc, info, typeobj_str)) { MVMObject *typeobj = MVM_repr_at_key_o(tc, info, typeobj_str); if (REPR(typeobj)->ID == MVM_REPR_ID_MVMCArray) { MVMCArrayREPRData *repr_data = (MVMCArrayREPRData *)STABLE(typeobj)->REPR_data; /* No need to refresh numbers. They're stored directly in the array. */ if (repr_data->elem_kind == MVM_CARRAY_ELEM_KIND_NUMERIC) return MVM_NATIVECALL_ARG_NO_REFRESH; return MVM_NATIVECALL_ARG_REFRESH; } } /* We don't know, so fail safe by assuming we have to refresh */ return MVM_NATIVECALL_ARG_REFRESH; } /* Takes a hash describing a type hands back an argument type code. */ MVMint16 MVM_nativecall_get_arg_type(MVMThreadContext *tc, MVMObject *info, MVMint16 is_return) { MVMString *typename = MVM_repr_get_str(tc, MVM_repr_at_key_o(tc, info, tc->instance->str_consts.type)); char *ctypename = MVM_string_utf8_encode_C_string(tc, typename); MVMint16 result; if (strcmp(ctypename, "void") == 0) { if (!is_return) { MVM_free(ctypename); MVM_exception_throw_adhoc(tc, "Cannot use 'void' type except for on native call return values"); } result = MVM_NATIVECALL_ARG_VOID; } else if (strcmp(ctypename, "char") == 0) result = MVM_NATIVECALL_ARG_CHAR | get_rw_flag(tc, info); else if (strcmp(ctypename, "short") == 0) result = MVM_NATIVECALL_ARG_SHORT | get_rw_flag(tc, info); else if (strcmp(ctypename, "int") == 0) result = MVM_NATIVECALL_ARG_INT | get_rw_flag(tc, info); else if (strcmp(ctypename, "long") == 0) result = MVM_NATIVECALL_ARG_LONG | get_rw_flag(tc, info); else if (strcmp(ctypename, "longlong") == 0) result = MVM_NATIVECALL_ARG_LONGLONG | get_rw_flag(tc, info); else if (strcmp(ctypename, "uchar") == 0) result = MVM_NATIVECALL_ARG_UCHAR | get_rw_flag(tc, info); else if (strcmp(ctypename, "ushort") == 0) result = MVM_NATIVECALL_ARG_USHORT | get_rw_flag(tc, info); else if (strcmp(ctypename, "uint") == 0) result = MVM_NATIVECALL_ARG_UINT | get_rw_flag(tc, info); else if (strcmp(ctypename, "ulong") == 0) result = MVM_NATIVECALL_ARG_ULONG | get_rw_flag(tc, info); else if (strcmp(ctypename, "ulonglong") == 0) result = MVM_NATIVECALL_ARG_ULONGLONG | get_rw_flag(tc, info); else if (strcmp(ctypename, "float") == 0) result = MVM_NATIVECALL_ARG_FLOAT | get_rw_flag(tc, info); else if (strcmp(ctypename, "double") == 0) result = MVM_NATIVECALL_ARG_DOUBLE | get_rw_flag(tc, info); else if (strcmp(ctypename, "asciistr") == 0) result = MVM_NATIVECALL_ARG_ASCIISTR | get_str_free_flag(tc, info); else if (strcmp(ctypename, "utf8str") == 0) result = MVM_NATIVECALL_ARG_UTF8STR | get_str_free_flag(tc, info); else if (strcmp(ctypename, "utf16str") == 0) result = MVM_NATIVECALL_ARG_UTF16STR | get_str_free_flag(tc, info); else if (strcmp(ctypename, "cstruct") == 0) result = MVM_NATIVECALL_ARG_CSTRUCT; else if (strcmp(ctypename, "cppstruct") == 0) result = MVM_NATIVECALL_ARG_CPPSTRUCT; else if (strcmp(ctypename, "cpointer") == 0) result = MVM_NATIVECALL_ARG_CPOINTER | get_rw_flag(tc, info); else if (strcmp(ctypename, "carray") == 0) result = MVM_NATIVECALL_ARG_CARRAY | get_refresh_flag(tc, info); else if (strcmp(ctypename, "cunion") == 0) result = MVM_NATIVECALL_ARG_CUNION; else if (strcmp(ctypename, "vmarray") == 0) result = MVM_NATIVECALL_ARG_VMARRAY; else if (strcmp(ctypename, "callback") == 0) result = MVM_NATIVECALL_ARG_CALLBACK; else { char *waste[] = { ctypename, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Unknown type '%s' used for native call", ctypename); } MVM_free(ctypename); return result; } MVMObject * MVM_nativecall_make_int(MVMThreadContext *tc, MVMObject *type, MVMint64 value) { return type ? MVM_repr_box_int(tc, type, value) : NULL; } MVMObject * MVM_nativecall_make_uint(MVMThreadContext *tc, MVMObject *type, MVMuint64 value) { return type ? MVM_repr_box_int(tc, type, (MVMint64)value) : NULL; } MVMObject * MVM_nativecall_make_num(MVMThreadContext *tc, MVMObject *type, MVMnum64 value) { return type ? MVM_repr_box_num(tc, type, value) : NULL; } MVMObject * MVM_nativecall_make_str(MVMThreadContext *tc, MVMObject *type, MVMint16 ret_type, char *cstring) { MVMObject *result = type; if (cstring && type) { MVMString *value; MVM_gc_root_temp_push(tc, (MVMCollectable **)&type); switch (ret_type & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_ASCIISTR: value = MVM_string_ascii_decode(tc, tc->instance->VMString, cstring, strlen(cstring)); break; case MVM_NATIVECALL_ARG_UTF8STR: value = MVM_string_utf8_decode(tc, tc->instance->VMString, cstring, strlen(cstring)); break; case MVM_NATIVECALL_ARG_UTF16STR: value = MVM_string_utf16_decode(tc, tc->instance->VMString, cstring, strlen(cstring)); break; default: MVM_exception_throw_adhoc(tc, "Internal error: unhandled encoding"); } MVM_gc_root_temp_pop(tc); result = MVM_repr_box_str(tc, type, value); if (ret_type & MVM_NATIVECALL_ARG_FREE_STR) MVM_free(cstring); } return result; } /* Constructs a boxed result using a CStruct REPR type. */ MVMObject * MVM_nativecall_make_cstruct(MVMThreadContext *tc, MVMObject *type, void *cstruct) { MVMObject *result = type; if (cstruct && type) { MVMCStructREPRData *repr_data = (MVMCStructREPRData *)STABLE(type)->REPR_data; if (REPR(type)->ID != MVM_REPR_ID_MVMCStruct) MVM_exception_throw_adhoc(tc, "Native call expected return type with CStruct representation, but got a %s (%s)", REPR(type)->name, MVM_6model_get_debug_name(tc, type)); result = REPR(type)->allocate(tc, STABLE(type)); ((MVMCStruct *)result)->body.cstruct = cstruct; if (repr_data->num_child_objs) ((MVMCStruct *)result)->body.child_objs = MVM_calloc(repr_data->num_child_objs, sizeof(MVMObject *)); } return result; } /* Constructs a boxed result using a CUnion REPR type. */ MVMObject * MVM_nativecall_make_cunion(MVMThreadContext *tc, MVMObject *type, void *cunion) { MVMObject *result = type; if (cunion && type) { MVMCUnionREPRData *repr_data = (MVMCUnionREPRData *)STABLE(type)->REPR_data; if (REPR(type)->ID != MVM_REPR_ID_MVMCUnion) MVM_exception_throw_adhoc(tc, "Native call expected return type with CUnion representation, but got a %s (%s)", REPR(type)->name, MVM_6model_get_debug_name(tc, type)); result = REPR(type)->allocate(tc, STABLE(type)); ((MVMCUnion *)result)->body.cunion = cunion; if (repr_data->num_child_objs) ((MVMCUnion *)result)->body.child_objs = MVM_calloc(repr_data->num_child_objs, sizeof(MVMObject *)); } return result; } MVMObject * MVM_nativecall_make_cppstruct(MVMThreadContext *tc, MVMObject *type, void *cppstruct) { MVMObject *result = type; if (cppstruct && type) { MVMCPPStructREPRData *repr_data = (MVMCPPStructREPRData *)STABLE(type)->REPR_data; if (REPR(type)->ID != MVM_REPR_ID_MVMCPPStruct) MVM_exception_throw_adhoc(tc, "Native call expected return type with CPPStruct representation, but got a %s (%s)", REPR(type)->name, MVM_6model_get_debug_name(tc, type)); result = REPR(type)->allocate(tc, STABLE(type)); ((MVMCPPStruct *)result)->body.cppstruct = cppstruct; if (repr_data->num_child_objs) ((MVMCPPStruct *)result)->body.child_objs = MVM_calloc(repr_data->num_child_objs, sizeof(MVMObject *)); } return result; } /* Constructs a boxed result using a CPointer REPR type. */ MVMObject * MVM_nativecall_make_cpointer(MVMThreadContext *tc, MVMObject *type, void *ptr) { MVMObject *result = type; if (ptr && type) { if (REPR(type)->ID != MVM_REPR_ID_MVMCPointer) MVM_exception_throw_adhoc(tc, "Native call expected return type with CPointer representation, but got a %s (%s)", REPR(type)->name, MVM_6model_get_debug_name(tc, type)); result = REPR(type)->allocate(tc, STABLE(type)); ((MVMCPointer *)result)->body.ptr = ptr; } return result; } /* Constructs a boxed result using a CArray REPR type. */ MVMObject * MVM_nativecall_make_carray(MVMThreadContext *tc, MVMObject *type, void *carray) { MVMObject *result = type; if (carray && type) { if (REPR(type)->ID != MVM_REPR_ID_MVMCArray) MVM_exception_throw_adhoc(tc, "Native call expected return type with CArray representation, but got a %s (%s)", REPR(type)->name, MVM_6model_get_debug_name(tc, type)); result = REPR(type)->allocate(tc, STABLE(type)); ((MVMCArray *)result)->body.storage = carray; } return result; } signed char MVM_nativecall_unmarshal_char(MVMThreadContext *tc, MVMObject *value) { return (signed char)MVM_repr_get_int(tc, value); } signed short MVM_nativecall_unmarshal_short(MVMThreadContext *tc, MVMObject *value) { return (signed short)MVM_repr_get_int(tc, value); } signed int MVM_nativecall_unmarshal_int(MVMThreadContext *tc, MVMObject *value) { return (signed int)MVM_repr_get_int(tc, value); } signed long MVM_nativecall_unmarshal_long(MVMThreadContext *tc, MVMObject *value) { return (signed long)MVM_repr_get_int(tc, value); } signed long long MVM_nativecall_unmarshal_longlong(MVMThreadContext *tc, MVMObject *value) { return (signed long long)MVM_repr_get_int(tc, value); } unsigned char MVM_nativecall_unmarshal_uchar(MVMThreadContext *tc, MVMObject *value) { return (unsigned char)MVM_repr_get_int(tc, value); } unsigned short MVM_nativecall_unmarshal_ushort(MVMThreadContext *tc, MVMObject *value) { return (unsigned short)MVM_repr_get_int(tc, value); } unsigned int MVM_nativecall_unmarshal_uint(MVMThreadContext *tc, MVMObject *value) { return (unsigned int)MVM_repr_get_int(tc, value); } unsigned long MVM_nativecall_unmarshal_ulong(MVMThreadContext *tc, MVMObject *value) { return (unsigned long)MVM_repr_get_int(tc, value); } unsigned long long MVM_nativecall_unmarshal_ulonglong(MVMThreadContext *tc, MVMObject *value) { return (unsigned long long)MVM_repr_get_int(tc, value); } float MVM_nativecall_unmarshal_float(MVMThreadContext *tc, MVMObject *value) { return (float)MVM_repr_get_num(tc, value); } double MVM_nativecall_unmarshal_double(MVMThreadContext *tc, MVMObject *value) { return (double)MVM_repr_get_num(tc, value); } char * MVM_nativecall_unmarshal_string(MVMThreadContext *tc, MVMObject *value, MVMint16 type, MVMint16 *free) { if (IS_CONCRETE(value)) { MVMString *value_str = MVM_repr_get_str(tc, value); /* Encode string. */ char *str; switch (type & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_ASCIISTR: str = MVM_string_ascii_encode_any(tc, value_str); break; case MVM_NATIVECALL_ARG_UTF16STR: str = MVM_string_utf16_encode(tc, value_str, 0); break; default: str = MVM_string_utf8_encode_C_string(tc, value_str); } /* Set whether to free it or not. */ if (free) { if (REPR(value)->ID == MVM_REPR_ID_MVMCStr) *free = 0; /* Manually managed. */ else if (free && type & MVM_NATIVECALL_ARG_FREE_STR_MASK) *free = 1; else *free = 0; } return str; } else { return NULL; } } void * MVM_nativecall_unmarshal_cstruct(MVMThreadContext *tc, MVMObject *value) { if (!IS_CONCRETE(value)) return NULL; else if (REPR(value)->ID == MVM_REPR_ID_MVMCStruct) return ((MVMCStruct *)value)->body.cstruct; else MVM_exception_throw_adhoc(tc, "Native call expected return type with CStruct representation, but got a %s (%s)", REPR(value)->name, MVM_6model_get_debug_name(tc, value)); } void * MVM_nativecall_unmarshal_cppstruct(MVMThreadContext *tc, MVMObject *value) { if (!IS_CONCRETE(value)) return NULL; else if (REPR(value)->ID == MVM_REPR_ID_MVMCPPStruct) return ((MVMCPPStruct *)value)->body.cppstruct; else MVM_exception_throw_adhoc(tc, "Native call expected return type with CPPStruct representation, but got a %s (%s)", REPR(value)->name, MVM_6model_get_debug_name(tc, value)); } void * MVM_nativecall_unmarshal_cpointer(MVMThreadContext *tc, MVMObject *value) { if (!IS_CONCRETE(value)) return NULL; else if (REPR(value)->ID == MVM_REPR_ID_MVMCPointer) return ((MVMCPointer *)value)->body.ptr; else MVM_exception_throw_adhoc(tc, "Native call expected return type with CPointer representation, but got a %s (%s)", REPR(value)->name, MVM_6model_get_debug_name(tc, value)); } void * MVM_nativecall_unmarshal_carray(MVMThreadContext *tc, MVMObject *value) { if (!IS_CONCRETE(value)) return NULL; else if (REPR(value)->ID == MVM_REPR_ID_MVMCArray) return ((MVMCArray *)value)->body.storage; else MVM_exception_throw_adhoc(tc, "Native call expected return type with CArray representation, but got a %s (%s)", REPR(value)->name, MVM_6model_get_debug_name(tc, value)); } void * MVM_nativecall_unmarshal_vmarray(MVMThreadContext *tc, MVMObject *value) { if (!IS_CONCRETE(value)) return NULL; else if (REPR(value)->ID == MVM_REPR_ID_VMArray) { MVMArrayBody *body = &((MVMArray *)value)->body; MVMArrayREPRData *repr_data = (MVMArrayREPRData *)STABLE(value)->REPR_data; size_t start_pos = body->start * repr_data->elem_size; return ((char *)body->slots.any) + start_pos; } else MVM_exception_throw_adhoc(tc, "Native call expected object with Array representation, but got a %s (%s)", REPR(value)->name, MVM_6model_get_debug_name(tc, value)); } void * MVM_nativecall_unmarshal_cunion(MVMThreadContext *tc, MVMObject *value) { if (!IS_CONCRETE(value)) return NULL; else if (REPR(value)->ID == MVM_REPR_ID_MVMCUnion) return ((MVMCUnion *)value)->body.cunion; else MVM_exception_throw_adhoc(tc, "Native call expected return type with CUnion representation, but got a %s (%s)", REPR(value)->name, MVM_6model_get_debug_name(tc, value)); } #ifdef _WIN32 static const char *dlerror(void) { static char buf[32]; DWORD dw = GetLastError(); if (dw == 0) return NULL; snprintf(buf, 32, "error 0x%"PRIx32"", (MVMuint32)dw); return buf; } #endif void init_c_call_node(MVMThreadContext *tc, MVMSpeshGraph *sg, MVMJitNode *node, void *func_ptr, MVMint16 num_args, MVMJitCallArg *args) { node->type = MVM_JIT_NODE_CALL_C; node->u.call.func_ptr = func_ptr; if (0 < num_args) { node->u.call.args = MVM_spesh_alloc(tc, sg, num_args * sizeof(MVMJitCallArg)); memcpy(node->u.call.args, args, num_args * sizeof(MVMJitCallArg)); } else { node->u.call.args = NULL; } node->u.call.num_args = num_args; node->u.call.has_vargs = 0; node->u.call.rv_mode = MVM_JIT_RV_VOID; node->u.call.rv_idx = -1; } void init_box_call_node(MVMThreadContext *tc, MVMSpeshGraph *sg, MVMJitNode *box_rv_node, void *func_ptr, MVMint16 restype, MVMint16 dst) { MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR , { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_DYNIDX, { 2 } }, { MVM_JIT_SAVED_RV, { 0 } }}; init_c_call_node(tc, sg, box_rv_node, func_ptr, 3, args); box_rv_node->next = NULL; if (dst == -1) { box_rv_node->u.call.rv_mode = MVM_JIT_RV_DYNIDX; box_rv_node->u.call.rv_idx = 0; } else { box_rv_node->u.call.args[1].type = MVM_JIT_REG_VAL; box_rv_node->u.call.args[1].v.reg = restype; box_rv_node->u.call.rv_mode = MVM_JIT_RV_PTR; box_rv_node->u.call.rv_idx = dst; } } MVMJitGraph *MVM_nativecall_jit_graph_for_caller_code( MVMThreadContext *tc, MVMSpeshGraph *sg, MVMNativeCallBody *body, MVMint16 restype, MVMint16 dst, MVMSpeshIns **arg_ins ) { MVMJitGraph *jg = MVM_spesh_alloc(tc, sg, sizeof(MVMJitGraph)); /* will actually calloc */ MVMJitNode *block_gc_node = MVM_spesh_alloc(tc, sg, sizeof(MVMJitNode)); MVMJitNode *unblock_gc_node = MVM_spesh_alloc(tc, sg, sizeof(MVMJitNode)); MVMJitNode *call_node = MVM_spesh_alloc(tc, sg, sizeof(MVMJitNode)); MVMJitNode *save_rv_node = MVM_spesh_alloc(tc, sg, sizeof(MVMJitNode)); MVMJitNode *box_rv_node = MVM_spesh_alloc(tc, sg, sizeof(MVMJitNode)); MVMJitCode *jitcode = NULL; MVMJitCallArg block_gc_args[] = { { MVM_JIT_INTERP_VAR , { MVM_JIT_INTERP_TC } } }; jg->sg = sg; jg->first_node = block_gc_node; save_rv_node->type = MVM_JIT_NODE_SAVE_RV; save_rv_node->u.stack.slot = 0; save_rv_node->next = unblock_gc_node; init_c_call_node(tc, sg, block_gc_node, &MVM_gc_mark_thread_blocked, 1, block_gc_args); block_gc_node->next = call_node; init_c_call_node(tc, sg, unblock_gc_node, &MVM_gc_mark_thread_unblocked, 1, block_gc_args); init_c_call_node(tc, sg, call_node, body->entry_point, 0, NULL); /* we handle args manually */ call_node->next = save_rv_node; call_node->u.call.num_args = body->num_args; jg->last_node = unblock_gc_node->next = box_rv_node; if (0 < body->num_args) { MVMuint16 i = 0, str_arg_count = 0; call_node->u.call.args = MVM_spesh_alloc(tc, sg, body->num_args * sizeof(MVMJitCallArg)); for (i = 0; i < body->num_args; i++) { if ((body->arg_types[i] & MVM_NATIVECALL_ARG_TYPE_MASK) == MVM_NATIVECALL_ARG_UTF8STR) { MVMJitNode *unbox_str_node; MVMJitNode *save_str_rv_node; MVMJitNode *free_str_node; if (7 < ++str_arg_count) /* only got 7 empty slots in the stack scratch space */ goto fail; save_str_rv_node = MVM_spesh_alloc(tc, sg, sizeof(MVMJitNode)); save_str_rv_node->type = MVM_JIT_NODE_SAVE_RV; save_str_rv_node->u.stack.slot = str_arg_count; save_str_rv_node->next = jg->first_node; unbox_str_node = MVM_spesh_alloc(tc, sg, sizeof(MVMJitNode)); { MVMJitCallArg unbox_str_args[] = { { MVM_JIT_INTERP_VAR , { MVM_JIT_INTERP_TC } }, { dst == -1 ? MVM_JIT_ARG_I64 : MVM_JIT_PARAM_I64 , { dst == -1 ? i : arg_ins[i]->operands[1].reg.orig } } }; init_c_call_node(tc, sg, unbox_str_node, &MVM_string_utf8_maybe_encode_C_string, 2, unbox_str_args); } unbox_str_node->next = save_str_rv_node; jg->first_node = unbox_str_node; call_node->u.call.args[i].type = MVM_JIT_SAVED_RV; call_node->u.call.args[i].v.lit_i64 = str_arg_count; if ((body->arg_types[i] & MVM_NATIVECALL_ARG_FREE_STR_MASK) != 0) { MVMJitCallArg free_str_args[] = { { MVM_JIT_SAVED_RV , { str_arg_count } } }; free_str_node = MVM_spesh_alloc(tc, sg, sizeof(MVMJitNode)); init_c_call_node(tc, sg, free_str_node, &MVM_free, 1, free_str_args); free_str_node->next = unblock_gc_node->next; unblock_gc_node->next = free_str_node; } } } for (i = 0; i < body->num_args; i++) { MVMJitArgType arg_type; int is_rw = ((body->arg_types[i] & MVM_NATIVECALL_ARG_RW_MASK) == MVM_NATIVECALL_ARG_RW); switch (body->arg_types[i] & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_CHAR: case MVM_NATIVECALL_ARG_UCHAR: case MVM_NATIVECALL_ARG_SHORT: case MVM_NATIVECALL_ARG_USHORT: case MVM_NATIVECALL_ARG_INT: case MVM_NATIVECALL_ARG_UINT: case MVM_NATIVECALL_ARG_LONG: case MVM_NATIVECALL_ARG_ULONG: case MVM_NATIVECALL_ARG_LONGLONG: case MVM_NATIVECALL_ARG_ULONGLONG: arg_type = dst == -1 ? is_rw ? MVM_JIT_ARG_I64_RW : MVM_JIT_ARG_I64 : is_rw ? MVM_JIT_PARAM_I64_RW : MVM_JIT_PARAM_I64; break; case MVM_NATIVECALL_ARG_CPOINTER: if (is_rw) goto fail; arg_type = dst == -1 ? MVM_JIT_ARG_PTR : MVM_JIT_PARAM_PTR; break; case MVM_NATIVECALL_ARG_CARRAY: if (body->arg_types[i] & MVM_NATIVECALL_ARG_REFRESH_MASK) goto fail; if (is_rw) goto fail; arg_type = dst == -1 ? MVM_JIT_ARG_PTR : MVM_JIT_PARAM_PTR; break; case MVM_NATIVECALL_ARG_VMARRAY: if (is_rw) goto fail; arg_type = dst == -1 ? MVM_JIT_ARG_VMARRAY : MVM_JIT_PARAM_VMARRAY; break; case MVM_NATIVECALL_ARG_UTF8STR: if (is_rw) goto fail; continue; /* already handled */ default: goto fail; } call_node->u.call.args[i].type = arg_type; call_node->u.call.args[i].v.lit_i64 = dst == -1 ? i : arg_ins[i]->operands[1].reg.orig; } } if (body->ret_type == MVM_NATIVECALL_ARG_CHAR || body->ret_type == MVM_NATIVECALL_ARG_UCHAR || body->ret_type == MVM_NATIVECALL_ARG_SHORT || body->ret_type == MVM_NATIVECALL_ARG_USHORT || body->ret_type == MVM_NATIVECALL_ARG_INT || body->ret_type == MVM_NATIVECALL_ARG_UINT || body->ret_type == MVM_NATIVECALL_ARG_LONG || body->ret_type == MVM_NATIVECALL_ARG_ULONG || body->ret_type == MVM_NATIVECALL_ARG_LONGLONG || body->ret_type == MVM_NATIVECALL_ARG_ULONGLONG ) { init_box_call_node(tc, sg, box_rv_node, &MVM_nativecall_make_int, restype, dst); } else if (body->ret_type == MVM_NATIVECALL_ARG_CPOINTER) { init_box_call_node(tc, sg, box_rv_node, &MVM_nativecall_make_cpointer, restype, dst); } else if (body->ret_type == MVM_NATIVECALL_ARG_UTF8STR) { MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR , { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_DYNIDX, { 2 } }, { MVM_JIT_LITERAL, { MVM_NATIVECALL_ARG_UTF8STR } }, { MVM_JIT_SAVED_RV, { 0 } }}; init_c_call_node(tc, sg, box_rv_node, &MVM_nativecall_make_str, 4, args); box_rv_node->next = NULL; if (dst == -1) { box_rv_node->u.call.rv_mode = MVM_JIT_RV_DYNIDX; box_rv_node->u.call.rv_idx = 0; } else { box_rv_node->u.call.args[1].type = MVM_JIT_REG_VAL; box_rv_node->u.call.args[1].v.reg = restype; box_rv_node->u.call.rv_mode = MVM_JIT_RV_PTR; box_rv_node->u.call.rv_idx = dst; } } else if (body->ret_type == MVM_NATIVECALL_ARG_VOID) { call_node->next = unblock_gc_node; unblock_gc_node->next = NULL; jg->last_node = unblock_gc_node; } else { goto fail; } return jg; fail: return NULL; } MVMJitCode *create_caller_code(MVMThreadContext *tc, MVMNativeCallBody *body) { MVMSpeshGraph *sg = MVM_calloc(1, sizeof(MVMSpeshGraph)); MVMJitGraph *jg = MVM_nativecall_jit_graph_for_caller_code(tc, sg, body, -1, -1, NULL); MVMJitCode *jitcode; if (jg != NULL) { MVMJitNode *entry_label = MVM_spesh_alloc(tc, sg, sizeof(MVMJitNode)); entry_label->next = jg->first_node; jg->first_node = entry_label; jg->num_labels = 1; entry_label->type = MVM_JIT_NODE_LABEL; entry_label->u.label.name = 0; jitcode = MVM_jit_compile_graph(tc, jg); } else { jitcode = NULL; } MVM_spesh_graph_destroy(tc, sg); return jitcode; } /* Builds up a native call site out of the supplied arguments. */ MVMint8 MVM_nativecall_build(MVMThreadContext *tc, MVMObject *site, MVMString *lib, MVMString *sym, MVMString *conv, MVMObject *arg_info, MVMObject *ret_info) { char *lib_name = MVM_string_utf8_c8_encode_C_string(tc, lib); char *sym_name = MVM_string_utf8_c8_encode_C_string(tc, sym); MVMint8 keep_sym_name = 0; MVMint16 i; unsigned int interval_id = MVM_telemetry_interval_start(tc, "building native call"); MVMObject *entry_point_o = (MVMObject *)MVM_repr_at_key_o(tc, ret_info, tc->instance->str_consts.entry_point); /* Initialize the object; grab native call part of its body. */ MVMNativeCallBody *body = MVM_nativecall_get_nc_body(tc, site); /* Try to load the library. */ body->lib_name = lib_name; body->lib_handle = MVM_nativecall_load_lib(lib_name[0] ? lib_name : NULL); if (!body->lib_handle) { char *waste[] = { lib_name, NULL }; MVM_free(sym_name); MVM_telemetry_interval_stop(tc, interval_id, "error building native call"); MVM_exception_throw_adhoc_free(tc, waste, "Cannot locate native library '%s': %s", lib_name, dlerror()); } /* Try to locate the symbol. */ if (entry_point_o) { body->entry_point = MVM_nativecall_unmarshal_cpointer(tc, entry_point_o); body->sym_name = sym_name; keep_sym_name = 1; } if (!body->entry_point) { body->entry_point = MVM_nativecall_find_sym(body->lib_handle, sym_name); if (!body->entry_point) { char *waste[] = { sym_name, lib_name, NULL }; MVM_telemetry_interval_stop(tc, interval_id, "error building native call"); MVM_exception_throw_adhoc_free(tc, waste, "Cannot locate symbol '%s' in native library '%s'", sym_name, lib_name); } body->sym_name = sym_name; keep_sym_name = 1; } MVM_telemetry_interval_annotate_dynamic((uintptr_t)body->entry_point, interval_id, body->sym_name); if (keep_sym_name == 0) { MVM_free(sym_name); } /* Set calling convention, if any. */ body->convention = MVM_nativecall_get_calling_convention(tc, conv); /* Transform each of the args info structures into a flag. */ body->num_args = MVM_repr_elems(tc, arg_info); body->arg_types = MVM_malloc(sizeof(MVMint16) * (body->num_args ? body->num_args : 1)); body->arg_info = MVM_malloc(sizeof(MVMObject *) * (body->num_args ? body->num_args : 1)); #ifdef HAVE_LIBFFI body->ffi_arg_types = MVM_malloc(sizeof(ffi_type *) * (body->num_args ? body->num_args : 1)); #endif for (i = 0; i < body->num_args; i++) { MVMObject *info = MVM_repr_at_pos_o(tc, arg_info, i); body->arg_types[i] = MVM_nativecall_get_arg_type(tc, info, 0); #ifdef HAVE_LIBFFI body->ffi_arg_types[i] = MVM_nativecall_get_ffi_type(tc, body->arg_types[i]); #endif if(body->arg_types[i] == MVM_NATIVECALL_ARG_CALLBACK) { MVM_ASSIGN_REF(tc, &(site->header), body->arg_info[i], MVM_repr_at_key_o(tc, info, tc->instance->str_consts.callback_args)); } else { body->arg_info[i] = NULL; } } /* Transform return argument type info a flag. */ body->ret_type = MVM_nativecall_get_arg_type(tc, ret_info, 1); #ifdef HAVE_LIBFFI body->ffi_ret_type = MVM_nativecall_get_ffi_type(tc, body->ret_type); #endif if (tc->instance->jit_enabled) { body->jitcode = create_caller_code(tc, body); } else body->jitcode = NULL; MVM_telemetry_interval_stop(tc, interval_id, "nativecall built"); return body->jitcode != NULL; } static MVMObject * nativecall_cast(MVMThreadContext *tc, MVMObject *target_spec, MVMObject *target_type, void *cpointer_body) { MVMObject *result = NULL; MVMROOT2(tc, target_spec, target_type, { switch (REPR(target_type)->ID) { case MVM_REPR_ID_P6opaque: { const MVMStorageSpec *ss = REPR(target_spec)->get_storage_spec(tc, STABLE(target_spec)); if(ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_INT) { MVMint64 value = 0; if (ss->is_unsigned) switch(ss->bits) { case 8: value = *(MVMuint8 *)cpointer_body; break; case 16: value = *(MVMuint16 *)cpointer_body; break; case 32: value = *(MVMuint32 *)cpointer_body; break; case 64: default: value = *(MVMuint64 *)cpointer_body; } else switch(ss->bits) { case 8: value = *(MVMint8 *)cpointer_body; break; case 16: value = *(MVMint16 *)cpointer_body; break; case 32: value = *(MVMint32 *)cpointer_body; break; case 64: default: value = *(MVMint64 *)cpointer_body; } result = MVM_nativecall_make_int(tc, target_type, value); } else if(ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_NUM) { MVMnum64 value; switch(ss->bits) { case 32: value = *(MVMnum32 *)cpointer_body; break; case 64: default: value = *(MVMnum64 *)cpointer_body; } result = MVM_nativecall_make_num(tc, target_type, value); } else if(ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_STR) { result = MVM_nativecall_make_str(tc, target_type, MVM_NATIVECALL_ARG_UTF8STR, (char *)cpointer_body); } else MVM_exception_throw_adhoc(tc, "Internal error: unhandled target type"); break; } case MVM_REPR_ID_P6int: { const MVMStorageSpec *ss = REPR(target_spec)->get_storage_spec(tc, STABLE(target_spec)); MVMint64 value; if (ss->is_unsigned) switch(ss->bits) { case 8: value = *(MVMuint8 *)cpointer_body; break; case 16: value = *(MVMuint16 *)cpointer_body; break; case 32: value = *(MVMuint32 *)cpointer_body; break; case 64: default: value = *(MVMuint64 *)cpointer_body; } else switch(ss->bits) { case 8: value = *(MVMint8 *)cpointer_body; break; case 16: value = *(MVMint16 *)cpointer_body; break; case 32: value = *(MVMint32 *)cpointer_body; break; case 64: default: value = *(MVMint64 *)cpointer_body; } result = MVM_nativecall_make_int(tc, target_type, value); break; } case MVM_REPR_ID_P6num: { const MVMStorageSpec *ss = REPR(target_spec)->get_storage_spec(tc, STABLE(target_spec)); MVMnum64 value; switch(ss->bits) { case 32: value = *(MVMnum32 *)cpointer_body; break; case 64: default: value = *(MVMnum64 *)cpointer_body; } result = MVM_nativecall_make_num(tc, target_type, value); break; } case MVM_REPR_ID_MVMCStr: case MVM_REPR_ID_P6str: result = MVM_nativecall_make_str(tc, target_type, MVM_NATIVECALL_ARG_UTF8STR, (char *)cpointer_body); break; case MVM_REPR_ID_MVMCStruct: result = MVM_nativecall_make_cstruct(tc, target_type, (void *)cpointer_body); break; case MVM_REPR_ID_MVMCUnion: result = MVM_nativecall_make_cunion(tc, target_type, (void *)cpointer_body); break; case MVM_REPR_ID_MVMCPointer: result = MVM_nativecall_make_cpointer(tc, target_type, (void *)cpointer_body); break; case MVM_REPR_ID_MVMCArray: { result = MVM_nativecall_make_carray(tc, target_type, (void *)cpointer_body); break; } default: MVM_exception_throw_adhoc(tc, "Internal error: unhandled target type"); } }); return result; } MVMObject * MVM_nativecall_global(MVMThreadContext *tc, MVMString *lib, MVMString *sym, MVMObject *target_spec, MVMObject *target_type) { char *lib_name = MVM_string_utf8_c8_encode_C_string(tc, lib); char *sym_name = MVM_string_utf8_c8_encode_C_string(tc, sym); DLLib *lib_handle; void *entry_point; MVMObject *ret = NULL; /* Try to load the library. */ lib_handle = MVM_nativecall_load_lib(lib_name[0] ? lib_name : NULL); if (!lib_handle) { char *waste[] = { lib_name, NULL }; MVM_free(sym_name); MVM_exception_throw_adhoc_free(tc, waste, "Cannot locate native library '%s': %s", lib_name, dlerror()); } /* Try to locate the symbol. */ entry_point = MVM_nativecall_find_sym(lib_handle, sym_name); if (!entry_point) { char *waste[] = { sym_name, lib_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Cannot locate symbol '%s' in native library '%s'", sym_name, lib_name); } MVM_free(sym_name); MVM_free(lib_name); if (REPR(target_type)->ID == MVM_REPR_ID_MVMCStr || REPR(target_type)->ID == MVM_REPR_ID_P6str || (REPR(target_type)->ID == MVM_REPR_ID_P6opaque && REPR(target_spec)->get_storage_spec(tc, STABLE(target_spec))->can_box & MVM_STORAGE_SPEC_CAN_BOX_STR)) { entry_point = *(void **)entry_point; } ret = nativecall_cast(tc, target_spec, target_type, entry_point); MVM_nativecall_free_lib(lib_handle); return ret; } MVMObject * MVM_nativecall_cast(MVMThreadContext *tc, MVMObject *target_spec, MVMObject *target_type, MVMObject *source) { void *data_body; if (!source) return target_type; if (REPR(source)->ID == MVM_REPR_ID_MVMCStruct) data_body = MVM_nativecall_unmarshal_cstruct(tc, source); else if (REPR(source)->ID == MVM_REPR_ID_MVMCPPStruct) data_body = MVM_nativecall_unmarshal_cppstruct(tc, source); else if (REPR(source)->ID == MVM_REPR_ID_MVMCUnion) data_body = MVM_nativecall_unmarshal_cunion(tc, source); else if (REPR(source)->ID == MVM_REPR_ID_MVMCPointer) data_body = MVM_nativecall_unmarshal_cpointer(tc, source); else if (REPR(source)->ID == MVM_REPR_ID_MVMCArray) data_body = MVM_nativecall_unmarshal_carray(tc, source); else if (REPR(source)->ID == MVM_REPR_ID_VMArray) data_body = MVM_nativecall_unmarshal_vmarray(tc, source); else MVM_exception_throw_adhoc(tc, "Native call expected return type with CPointer, CStruct, CArray, or VMArray representation, but got a %s (%s)", REPR(source)->name, MVM_6model_get_debug_name(tc, source)); return nativecall_cast(tc, target_spec, target_type, data_body); } MVMint64 MVM_nativecall_sizeof(MVMThreadContext *tc, MVMObject *obj) { if (REPR(obj)->ID == MVM_REPR_ID_MVMCStruct) return ((MVMCStructREPRData *)STABLE(obj)->REPR_data)->struct_size; else if (REPR(obj)->ID == MVM_REPR_ID_MVMCPPStruct) return ((MVMCPPStructREPRData *)STABLE(obj)->REPR_data)->struct_size; else if (REPR(obj)->ID == MVM_REPR_ID_MVMCUnion) return ((MVMCUnionREPRData *)STABLE(obj)->REPR_data)->struct_size; else if (REPR(obj)->ID == MVM_REPR_ID_P6int) return ((MVMP6intREPRData *)STABLE(obj)->REPR_data)->bits / 8; else if (REPR(obj)->ID == MVM_REPR_ID_P6num) return ((MVMP6numREPRData *)STABLE(obj)->REPR_data)->bits / 8; else if (REPR(obj)->ID == MVM_REPR_ID_MVMCPointer || REPR(obj)->ID == MVM_REPR_ID_MVMCArray || REPR(obj)->ID == MVM_REPR_ID_MVMCStr || REPR(obj)->ID == MVM_REPR_ID_P6str) return sizeof(void *); else MVM_exception_throw_adhoc(tc, "NativeCall op sizeof expected type with CPointer, CStruct, CArray, P6int or P6num representation, but got a %s (%s)", REPR(obj)->name, MVM_6model_get_debug_name(tc, obj)); } /* Write-barriers a dyncall object so that delayed changes to the C-side of * objects are propagated to the HLL side. All CArray and CStruct arguments to * C functions are write-barriered automatically, so this should be necessary * only in the rarest of cases. */ void MVM_nativecall_refresh(MVMThreadContext *tc, MVMObject *cthingy) { if (!IS_CONCRETE(cthingy)) return; if (REPR(cthingy)->ID == MVM_REPR_ID_MVMCArray) { MVMCArrayBody *body = (MVMCArrayBody *)OBJECT_BODY(cthingy); MVMCArrayREPRData *repr_data = (MVMCArrayREPRData *)STABLE(cthingy)->REPR_data; void **storage = (void **) body->storage; MVMint64 i; /* No need to check for numbers. They're stored directly in the array. */ if (repr_data->elem_kind == MVM_CARRAY_ELEM_KIND_NUMERIC) return; for (i = 0; i < body->elems; i++) { void *cptr; /* The pointer in the C storage. */ void *objptr; /* The pointer in the object representing the C object. */ /* Ignore elements where we haven't generated an object. */ if (!body->child_objs[i]) continue; cptr = storage[i]; if (IS_CONCRETE(body->child_objs[i])) { switch (repr_data->elem_kind) { case MVM_CARRAY_ELEM_KIND_CARRAY: objptr = ((MVMCArrayBody *)OBJECT_BODY(body->child_objs[i]))->storage; break; case MVM_CARRAY_ELEM_KIND_CPOINTER: objptr = ((MVMCPointerBody *)OBJECT_BODY(body->child_objs[i]))->ptr; break; case MVM_CARRAY_ELEM_KIND_CSTRUCT: objptr = ((MVMCStructBody *)OBJECT_BODY(body->child_objs[i]))->cstruct; break; case MVM_CARRAY_ELEM_KIND_CUNION: objptr = ((MVMCUnionBody *)OBJECT_BODY(body->child_objs[i]))->cunion; break; case MVM_CARRAY_ELEM_KIND_STRING: objptr = NULL; /* TODO */ break; default: MVM_exception_throw_adhoc(tc, "Fatal error: bad elem_kind (%d) in CArray write barrier", repr_data->elem_kind); } } else { objptr = NULL; } if (objptr != cptr) body->child_objs[i] = NULL; else MVM_nativecall_refresh(tc, body->child_objs[i]); } } else if (REPR(cthingy)->ID == MVM_REPR_ID_MVMCStruct) { MVMCStructBody *body = (MVMCStructBody *)OBJECT_BODY(cthingy); MVMCStructREPRData *repr_data = (MVMCStructREPRData *)STABLE(cthingy)->REPR_data; char *storage = (char *) body->cstruct; MVMint64 i; for (i = 0; i < repr_data->num_attributes; i++) { MVMint32 kind = repr_data->attribute_locations[i] & MVM_CSTRUCT_ATTR_MASK; MVMint32 slot = repr_data->attribute_locations[i] >> MVM_CSTRUCT_ATTR_SHIFT; void *cptr = NULL; /* The pointer in the C storage. */ void *objptr = NULL; /* The pointer in the object representing the C object. */ if (kind == MVM_CSTRUCT_ATTR_IN_STRUCT || !body->child_objs[slot]) continue; cptr = (void*)((uintptr_t)storage + (uintptr_t)repr_data->struct_offsets[i]); if (IS_CONCRETE(body->child_objs[slot])) { switch (kind) { case MVM_CSTRUCT_ATTR_CARRAY: objptr = ((MVMCArrayBody *)OBJECT_BODY(body->child_objs[slot]))->storage; break; case MVM_CSTRUCT_ATTR_CPTR: objptr = ((MVMCPointerBody *)OBJECT_BODY(body->child_objs[slot]))->ptr; break; case MVM_CSTRUCT_ATTR_CSTRUCT: objptr = (MVMCStructBody *)OBJECT_BODY(body->child_objs[slot]); break; case MVM_CSTRUCT_ATTR_CUNION: objptr = (MVMCUnionBody *)OBJECT_BODY(body->child_objs[slot]); break; case MVM_CSTRUCT_ATTR_STRING: objptr = NULL; break; default: MVM_exception_throw_adhoc(tc, "Fatal error: bad kind (%d) in CStruct write barrier", kind); } } else { objptr = NULL; } if (objptr != cptr) body->child_objs[slot] = NULL; else MVM_nativecall_refresh(tc, body->child_objs[slot]); } } else if (REPR(cthingy)->ID == MVM_REPR_ID_MVMCPPStruct) { MVMCPPStructBody *body = (MVMCPPStructBody *)OBJECT_BODY(cthingy); MVMCPPStructREPRData *repr_data = (MVMCPPStructREPRData *)STABLE(cthingy)->REPR_data; char *storage = (char *) body->cppstruct; MVMint64 i; for (i = 0; i < repr_data->num_attributes; i++) { MVMint32 kind = repr_data->attribute_locations[i] & MVM_CPPSTRUCT_ATTR_MASK; MVMint32 slot = repr_data->attribute_locations[i] >> MVM_CPPSTRUCT_ATTR_SHIFT; void *cptr = NULL; /* The pointer in the C storage. */ void *objptr = NULL; /* The pointer in the object representing the C object. */ if (kind == MVM_CPPSTRUCT_ATTR_IN_STRUCT || !body->child_objs[slot]) continue; cptr = (void*)((uintptr_t)storage + (uintptr_t)repr_data->struct_offsets[i]); if (IS_CONCRETE(body->child_objs[slot])) { switch (kind) { case MVM_CPPSTRUCT_ATTR_CARRAY: objptr = ((MVMCArrayBody *)OBJECT_BODY(body->child_objs[slot]))->storage; break; case MVM_CPPSTRUCT_ATTR_CPTR: objptr = ((MVMCPointerBody *)OBJECT_BODY(body->child_objs[slot]))->ptr; break; case MVM_CPPSTRUCT_ATTR_CSTRUCT: objptr = (MVMCStructBody *)OBJECT_BODY(body->child_objs[slot]); break; case MVM_CPPSTRUCT_ATTR_STRING: objptr = NULL; break; default: MVM_exception_throw_adhoc(tc, "Fatal error: bad kind (%d) in CPPStruct write barrier", kind); } } else { objptr = NULL; } if (objptr != cptr) body->child_objs[slot] = NULL; else MVM_nativecall_refresh(tc, body->child_objs[slot]); } } } /* Locate the thread that a callback should be run on. */ MVMThreadContext * MVM_nativecall_find_thread_context(MVMInstance *instance) { MVMint64 wanted_thread_id = MVM_platform_thread_id(); MVMThreadContext *tc = NULL; while (1) { uv_mutex_lock(&(instance->mutex_threads)); if (instance->in_gc) { /* VM is in GC; free lock since the GC will acquire it again to * clear the in_gc flag, and sleep a bit until it's safe to read * the threads list. */ uv_mutex_unlock(&(instance->mutex_threads)); MVM_platform_sleep(0.0001); } else { /* Not in GC. If a GC starts while we are reading this, then we * are holding mutex_threads, and the GC will block on it before * it gets to a stage where it can move things. */ MVMThread *thread = instance->threads; while (thread) { if (thread->body.native_thread_id == wanted_thread_id) { tc = thread->body.tc; if (tc) break; } thread = thread->body.next; } if (!tc) MVM_panic(1, "native callback ran on thread (%"PRId64") unknown to MoarVM", wanted_thread_id); uv_mutex_unlock(&(instance->mutex_threads)); break; } } return tc; } void MVM_nativecall_invoke_jit(MVMThreadContext *tc, MVMObject *site) { MVMNativeCallBody *body = MVM_nativecall_get_nc_body(tc, site); MVMJitCode * const jitcode = body->jitcode; jitcode->func_ptr(tc, *tc->interp_cu, jitcode->labels[0]); } MoarVM-2018.03/src/core/nativecall.h0000644000175000017510000001531313237701240017217 0ustar samanthasamantha/* The various native call argument types. */ #define MVM_NATIVECALL_ARG_VOID 0 #define MVM_NATIVECALL_ARG_CHAR 2 #define MVM_NATIVECALL_ARG_SHORT 4 #define MVM_NATIVECALL_ARG_INT 6 #define MVM_NATIVECALL_ARG_LONG 8 #define MVM_NATIVECALL_ARG_LONGLONG 10 #define MVM_NATIVECALL_ARG_FLOAT 12 #define MVM_NATIVECALL_ARG_DOUBLE 14 #define MVM_NATIVECALL_ARG_ASCIISTR 16 #define MVM_NATIVECALL_ARG_UTF8STR 18 #define MVM_NATIVECALL_ARG_UTF16STR 20 #define MVM_NATIVECALL_ARG_CSTRUCT 22 #define MVM_NATIVECALL_ARG_CARRAY 24 #define MVM_NATIVECALL_ARG_CALLBACK 26 #define MVM_NATIVECALL_ARG_CPOINTER 28 #define MVM_NATIVECALL_ARG_VMARRAY 30 #define MVM_NATIVECALL_ARG_UCHAR 32 #define MVM_NATIVECALL_ARG_USHORT 34 #define MVM_NATIVECALL_ARG_UINT 36 #define MVM_NATIVECALL_ARG_ULONG 38 #define MVM_NATIVECALL_ARG_ULONGLONG 40 #define MVM_NATIVECALL_ARG_CUNION 42 #define MVM_NATIVECALL_ARG_CPPSTRUCT 44 #define MVM_NATIVECALL_ARG_TYPE_MASK 62 /* Flag for whether we should free a string after passing it or not. */ #define MVM_NATIVECALL_ARG_NO_FREE_STR 0 #define MVM_NATIVECALL_ARG_FREE_STR 1 #define MVM_NATIVECALL_ARG_FREE_STR_MASK 1 /* Flag for whether we need to refresh a CArray after passing or not. */ #define MVM_NATIVECALL_ARG_NO_REFRESH 0 #define MVM_NATIVECALL_ARG_REFRESH 1 #define MVM_NATIVECALL_ARG_REFRESH_MASK 1 #define MVM_NATIVECALL_ARG_NO_RW 0 #define MVM_NATIVECALL_ARG_RW 256 #define MVM_NATIVECALL_ARG_RW_MASK 256 /* Native callback entry. Hung off MVMNativeCallbackCacheHead, which is * a hash owned by the ThreadContext. All MVMNativeCallbacks in a linked * list have the same cuid, which is the key to the CacheHead hash. */ struct MVMNativeCallback { /* The dyncall/libffi callback object. */ void *cb; /* The routine that we will call. */ MVMObject *target; /* The VM instance. */ MVMInstance *instance; /* Return and argument type flags. */ MVMint16 *typeinfos; /* Return and argument types themselves. */ MVMObject **types; /* The number of entries in typeinfos/types. */ MVMint32 num_types; /* The MoarVM callsite object for this call. */ MVMCallsite *cs; #ifdef HAVE_LIBFFI ffi_abi convention; ffi_type **ffi_arg_types; ffi_type *ffi_ret_type; #endif /* The next entry in the linked list */ MVMNativeCallback *next; }; /* A hash of nativecall callbacks. Each entry is a linked * list of MVMNativeCallback sharing the same cuid. * Multiple callbacks with the same cuid get created when * closures are taken and need to be differentiated. */ struct MVMNativeCallbackCacheHead { MVMNativeCallback *head; /* The uthash hash handle inline struct. */ UT_hash_handle hash_handle; }; /* Functions for working with native callsites. */ MVMNativeCallBody * MVM_nativecall_get_nc_body(MVMThreadContext *tc, MVMObject *obj); MVMint16 MVM_nativecall_get_arg_type(MVMThreadContext *tc, MVMObject *info, MVMint16 is_return); MVMint8 MVM_nativecall_build(MVMThreadContext *tc, MVMObject *site, MVMString *lib, MVMString *sym, MVMString *conv, MVMObject *arg_spec, MVMObject *ret_spec); MVMObject * MVM_nativecall_invoke(MVMThreadContext *tc, MVMObject *res_type, MVMObject *site, MVMObject *args); void MVM_nativecall_invoke_jit(MVMThreadContext *tc, MVMObject *site); MVMObject * MVM_nativecall_global(MVMThreadContext *tc, MVMString *lib, MVMString *sym, MVMObject *target_spec, MVMObject *target_type); MVMObject * MVM_nativecall_cast(MVMThreadContext *tc, MVMObject *target_spec, MVMObject *res_type, MVMObject *obj); MVMint64 MVM_nativecall_sizeof(MVMThreadContext *tc, MVMObject *obj); void MVM_nativecall_refresh(MVMThreadContext *tc, MVMObject *cthingy); MVMObject * MVM_nativecall_make_cstruct(MVMThreadContext *tc, MVMObject *type, void *cstruct); MVMObject * MVM_nativecall_make_cppstruct(MVMThreadContext *tc, MVMObject *type, void *cppstruct); MVMObject * MVM_nativecall_make_cunion(MVMThreadContext *tc, MVMObject *type, void *cunion); MVMObject * MVM_nativecall_make_cpointer(MVMThreadContext *tc, MVMObject *type, void *ptr); MVMObject * MVM_nativecall_make_carray(MVMThreadContext *tc, MVMObject *type, void *carray); MVMObject * MVM_nativecall_make_int(MVMThreadContext *tc, MVMObject *type, MVMint64 value); MVMObject * MVM_nativecall_make_uint(MVMThreadContext *tc, MVMObject *type, MVMuint64 value); MVMObject * MVM_nativecall_make_num(MVMThreadContext *tc, MVMObject *type, MVMnum64 value); MVMObject * MVM_nativecall_make_str(MVMThreadContext *tc, MVMObject *type, MVMint16 ret_type, char *cstring); signed char MVM_nativecall_unmarshal_char(MVMThreadContext *tc, MVMObject *value); signed short MVM_nativecall_unmarshal_short(MVMThreadContext *tc, MVMObject *value); signed int MVM_nativecall_unmarshal_int(MVMThreadContext *tc, MVMObject *value); signed long MVM_nativecall_unmarshal_long(MVMThreadContext *tc, MVMObject *value); signed long long MVM_nativecall_unmarshal_longlong(MVMThreadContext *tc, MVMObject *value); unsigned char MVM_nativecall_unmarshal_uchar(MVMThreadContext *tc, MVMObject *value); unsigned short MVM_nativecall_unmarshal_ushort(MVMThreadContext *tc, MVMObject *value); unsigned int MVM_nativecall_unmarshal_uint(MVMThreadContext *tc, MVMObject *value); unsigned long MVM_nativecall_unmarshal_ulong(MVMThreadContext *tc, MVMObject *value); unsigned long long MVM_nativecall_unmarshal_ulonglong(MVMThreadContext *tc, MVMObject *value); float MVM_nativecall_unmarshal_float(MVMThreadContext *tc, MVMObject *value); double MVM_nativecall_unmarshal_double(MVMThreadContext *tc, MVMObject *value); char * MVM_nativecall_unmarshal_string(MVMThreadContext *tc, MVMObject *value, MVMint16 type, MVMint16 *free); void * MVM_nativecall_unmarshal_cstruct(MVMThreadContext *tc, MVMObject *value); void * MVM_nativecall_unmarshal_cppstruct(MVMThreadContext *tc, MVMObject *value); void * MVM_nativecall_unmarshal_cpointer(MVMThreadContext *tc, MVMObject *value); void * MVM_nativecall_unmarshal_carray(MVMThreadContext *tc, MVMObject *value); void * MVM_nativecall_unmarshal_vmarray(MVMThreadContext *tc, MVMObject *value); void * MVM_nativecall_unmarshal_cunion(MVMThreadContext *tc, MVMObject *value); MVMThreadContext * MVM_nativecall_find_thread_context(MVMInstance *instance); MVMJitGraph *MVM_nativecall_jit_graph_for_caller_code( MVMThreadContext *tc, MVMSpeshGraph *sg, MVMNativeCallBody *body, MVMint16 restype, MVMint16 dst, MVMSpeshIns **arg_ins ); MoarVM-2018.03/src/core/nativecall_dyncall.c0000644000175000017510000010717013252330426020724 0ustar samanthasamantha#include "moar.h" #ifndef _WIN32 #include #endif /* Maps a calling convention name to an ID. */ MVMint16 MVM_nativecall_get_calling_convention(MVMThreadContext *tc, MVMString *name) { MVMint16 result = DC_CALL_C_DEFAULT; if (name && MVM_string_graphs(tc, name) > 0) { char *cname = MVM_string_utf8_encode_C_string(tc, name); if (strcmp(cname, "cdecl") == 0) result = DC_CALL_C_X86_CDECL; else if (strcmp(cname, "stdcall") == 0) result = DC_CALL_C_X86_WIN32_STD; else if (strcmp(cname, "thisgnu") == 0) result = DC_CALL_C_X86_WIN32_THIS_GNU; else if (strcmp(cname, "thisms") == 0) result = DC_CALL_C_X86_WIN32_THIS_MS; else if (strcmp(cname, "stdcall") == 0) result = DC_CALL_C_X64_WIN64; else { char *waste[] = { cname, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Unknown calling convention '%s' used for native call", cname); } MVM_free(cname); } return result; } /* Map argument type ID to dyncall character ID. */ static char get_signature_char(MVMint16 type_id) { if ( (type_id & MVM_NATIVECALL_ARG_RW_MASK) == MVM_NATIVECALL_ARG_RW) return 'p'; switch (type_id & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_VOID: return 'v'; case MVM_NATIVECALL_ARG_CHAR: return 'c'; case MVM_NATIVECALL_ARG_SHORT: return 's'; case MVM_NATIVECALL_ARG_INT: return 'i'; case MVM_NATIVECALL_ARG_LONG: return 'j'; case MVM_NATIVECALL_ARG_LONGLONG: return 'l'; case MVM_NATIVECALL_ARG_FLOAT: return 'f'; case MVM_NATIVECALL_ARG_DOUBLE: return 'd'; case MVM_NATIVECALL_ARG_ASCIISTR: case MVM_NATIVECALL_ARG_UTF8STR: case MVM_NATIVECALL_ARG_UTF16STR: case MVM_NATIVECALL_ARG_CSTRUCT: case MVM_NATIVECALL_ARG_CPOINTER: case MVM_NATIVECALL_ARG_CARRAY: case MVM_NATIVECALL_ARG_CUNION: case MVM_NATIVECALL_ARG_VMARRAY: case MVM_NATIVECALL_ARG_CALLBACK: return 'p'; case MVM_NATIVECALL_ARG_UCHAR: return 'C'; case MVM_NATIVECALL_ARG_USHORT: return 'S'; case MVM_NATIVECALL_ARG_UINT: return 'I'; case MVM_NATIVECALL_ARG_ULONG: return 'J'; case MVM_NATIVECALL_ARG_ULONGLONG: return 'L'; default: return '\0'; } } /* Sets up a callback, caching the information to avoid duplicate work. */ static char callback_handler(DCCallback *cb, DCArgs *args, DCValue *result, MVMNativeCallback *data); static void * unmarshal_callback(MVMThreadContext *tc, MVMObject *callback, MVMObject *sig_info) { MVMNativeCallbackCacheHead *callback_data_head = NULL; MVMNativeCallback **callback_data_handle; MVMString *cuid; if (!IS_CONCRETE(callback)) return NULL; /* Try to locate existing cached callback info. */ callback = MVM_frame_find_invokee(tc, callback, NULL); cuid = ((MVMCode *)callback)->body.sf->body.cuuid; MVM_HASH_GET(tc, tc->native_callback_cache, cuid, callback_data_head); if (!callback_data_head) { callback_data_head = MVM_malloc(sizeof(MVMNativeCallbackCacheHead)); callback_data_head->head = NULL; MVM_HASH_BIND(tc, tc->native_callback_cache, cuid, callback_data_head); } callback_data_handle = &(callback_data_head->head); while (*callback_data_handle) { if ((*callback_data_handle)->target == callback) /* found it, break */ break; callback_data_handle = &((*callback_data_handle)->next); } if (!*callback_data_handle) { /* First, build the MVMNativeCallback */ MVMCallsite *cs; char *signature; MVMObject *typehash; MVMint64 num_info, i; MVMNativeCallback *callback_data; num_info = MVM_repr_elems(tc, sig_info); callback_data = MVM_malloc(sizeof(MVMNativeCallback)); callback_data->num_types = num_info; callback_data->typeinfos = MVM_malloc(num_info * sizeof(MVMint16)); callback_data->types = MVM_malloc(num_info * sizeof(MVMObject *)); callback_data->next = NULL; /* A dyncall signature looks like this: xxx)x * Argument types before the ) and return type after it. Thus, * num_info+1 must be NULL (zero-terminated string) and num_info-1 * must be the ). */ signature = MVM_malloc(num_info + 2); signature[num_info + 1] = '\0'; signature[num_info - 1] = ')'; /* We'll also build up a MoarVM callsite as we go. */ cs = MVM_calloc(1, sizeof(MVMCallsite)); cs->flag_count = num_info - 1; cs->arg_flags = MVM_malloc(cs->flag_count * sizeof(MVMCallsiteEntry)); cs->arg_count = num_info - 1; cs->num_pos = num_info - 1; cs->has_flattening = 0; cs->is_interned = 0; cs->with_invocant = NULL; typehash = MVM_repr_at_pos_o(tc, sig_info, 0); callback_data->types[0] = MVM_repr_at_key_o(tc, typehash, tc->instance->str_consts.typeobj); callback_data->typeinfos[0] = MVM_nativecall_get_arg_type(tc, typehash, 1); signature[num_info] = get_signature_char(callback_data->typeinfos[0]); for (i = 1; i < num_info; i++) { typehash = MVM_repr_at_pos_o(tc, sig_info, i); callback_data->types[i] = MVM_repr_at_key_o(tc, typehash, tc->instance->str_consts.typeobj); callback_data->typeinfos[i] = MVM_nativecall_get_arg_type(tc, typehash, 0) & ~MVM_NATIVECALL_ARG_FREE_STR; signature[i - 1] = get_signature_char(callback_data->typeinfos[i]); switch (callback_data->typeinfos[i] & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_CHAR: case MVM_NATIVECALL_ARG_SHORT: case MVM_NATIVECALL_ARG_INT: case MVM_NATIVECALL_ARG_LONG: case MVM_NATIVECALL_ARG_LONGLONG: cs->arg_flags[i - 1] = MVM_CALLSITE_ARG_INT; break; case MVM_NATIVECALL_ARG_UCHAR: case MVM_NATIVECALL_ARG_USHORT: case MVM_NATIVECALL_ARG_UINT: case MVM_NATIVECALL_ARG_ULONG: case MVM_NATIVECALL_ARG_ULONGLONG: /* TODO: should probably be UINT, when we can support that. */ cs->arg_flags[i - 1] = MVM_CALLSITE_ARG_INT; break; case MVM_NATIVECALL_ARG_FLOAT: case MVM_NATIVECALL_ARG_DOUBLE: cs->arg_flags[i - 1] = MVM_CALLSITE_ARG_NUM; break; default: cs->arg_flags[i - 1] = MVM_CALLSITE_ARG_OBJ; break; } } MVM_callsite_try_intern(tc, &cs); callback_data->instance = tc->instance; callback_data->cs = cs; callback_data->target = callback; callback_data->cb = dcbNewCallback(signature, (DCCallbackHandler *)callback_handler, callback_data); if (!callback_data->cb) MVM_panic(1, "Unable to allocate memory for callback closure"); /* Now insert the MVMCallback into the linked list. */ *callback_data_handle = callback_data; MVM_free(signature); } return (*callback_data_handle)->cb; } /* Called to handle a callback. */ typedef struct { MVMObject *invokee; MVMRegister *args; MVMCallsite *cs; } CallbackInvokeData; static void callback_invoke(MVMThreadContext *tc, void *data) { /* Invoke the coderef, to set up the nested interpreter. */ CallbackInvokeData *cid = (CallbackInvokeData *)data; STABLE(cid->invokee)->invoke(tc, cid->invokee, cid->cs, cid->args); /* Ensure we exit interp after callback. */ tc->thread_entry_frame = tc->cur_frame; } static char callback_handler(DCCallback *cb, DCArgs *cb_args, DCValue *cb_result, MVMNativeCallback *data) { CallbackInvokeData cid; MVMint32 num_roots, i; MVMRegister res; MVMRegister *args; unsigned int interval_id; /* Locate the MoarVM thread this callback is being run on. */ MVMThreadContext *tc = MVM_nativecall_find_thread_context(data->instance); /* Unblock GC if needed, so this thread can do work. */ MVMint32 was_blocked = MVM_gc_is_thread_blocked(tc); if (was_blocked) MVM_gc_mark_thread_unblocked(tc); interval_id = MVM_telemetry_interval_start(tc, "nativecall callback handler"); /* Build a callsite and arguments buffer. */ args = MVM_malloc(data->num_types * sizeof(MVMRegister)); num_roots = 0; for (i = 1; i < data->num_types; i++) { MVMObject *type = data->types[i]; MVMint16 typeinfo = data->typeinfos[i]; switch (typeinfo & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_CHAR: args[i - 1].i64 = dcbArgChar(cb_args); break; case MVM_NATIVECALL_ARG_SHORT: args[i - 1].i64 = dcbArgShort(cb_args); break; case MVM_NATIVECALL_ARG_INT: args[i - 1].i64 = dcbArgInt(cb_args); break; case MVM_NATIVECALL_ARG_LONG: args[i - 1].i64 = dcbArgLong(cb_args); break; case MVM_NATIVECALL_ARG_LONGLONG: args[i - 1].i64 = dcbArgLongLong(cb_args); break; case MVM_NATIVECALL_ARG_FLOAT: args[i - 1].n64 = dcbArgFloat(cb_args); break; case MVM_NATIVECALL_ARG_DOUBLE: args[i - 1].n64 = dcbArgDouble(cb_args); break; case MVM_NATIVECALL_ARG_ASCIISTR: case MVM_NATIVECALL_ARG_UTF8STR: case MVM_NATIVECALL_ARG_UTF16STR: args[i - 1].o = MVM_nativecall_make_str(tc, type, typeinfo, (char *)dcbArgPointer(cb_args)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o)); num_roots++; break; case MVM_NATIVECALL_ARG_CSTRUCT: args[i - 1].o = MVM_nativecall_make_cstruct(tc, type, dcbArgPointer(cb_args)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o)); num_roots++; break; case MVM_NATIVECALL_ARG_CPOINTER: args[i - 1].o = MVM_nativecall_make_cpointer(tc, type, dcbArgPointer(cb_args)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o)); num_roots++; break; case MVM_NATIVECALL_ARG_CARRAY: args[i - 1].o = MVM_nativecall_make_carray(tc, type, dcbArgPointer(cb_args)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o)); num_roots++; break; case MVM_NATIVECALL_ARG_CUNION: args[i - 1].o = MVM_nativecall_make_cunion(tc, type, dcbArgPointer(cb_args)); MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o)); num_roots++; break; case MVM_NATIVECALL_ARG_CALLBACK: /* TODO: A callback -return- value means that we have a C method * that needs to be wrapped similarly to a is native(...) Perl 6 * sub. */ dcbArgPointer(cb_args); args[i - 1].o = type; MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o)); num_roots++; break; case MVM_NATIVECALL_ARG_UCHAR: args[i - 1].i64 = dcbArgUChar(cb_args); break; case MVM_NATIVECALL_ARG_USHORT: args[i - 1].i64 = dcbArgUShort(cb_args); break; case MVM_NATIVECALL_ARG_UINT: args[i - 1].i64 = dcbArgUInt(cb_args); break; case MVM_NATIVECALL_ARG_ULONG: args[i - 1].i64 = dcbArgULong(cb_args); break; case MVM_NATIVECALL_ARG_ULONGLONG: args[i - 1].i64 = dcbArgULongLong(cb_args); break; default: MVM_telemetry_interval_stop(tc, interval_id, "nativecall callback handler failed"); MVM_exception_throw_adhoc(tc, "Internal error: unhandled dyncall callback argument type"); } } /* Call into a nested interpreter (since we already are in one). Need to * save a bunch of state around each side of this. */ cid.invokee = data->target; cid.args = args; cid.cs = data->cs; { MVMuint8 **backup_interp_cur_op = tc->interp_cur_op; MVMuint8 **backup_interp_bytecode_start = tc->interp_bytecode_start; MVMRegister **backup_interp_reg_base = tc->interp_reg_base; MVMCompUnit **backup_interp_cu = tc->interp_cu; MVMFrame *backup_cur_frame = MVM_frame_force_to_heap(tc, tc->cur_frame); MVMFrame *backup_thread_entry_frame = tc->thread_entry_frame; MVMROOT2(tc, backup_cur_frame, backup_thread_entry_frame, { MVMuint32 backup_mark = MVM_gc_root_temp_mark(tc); jmp_buf backup_interp_jump; memcpy(backup_interp_jump, tc->interp_jump, sizeof(jmp_buf)); tc->cur_frame->return_value = &res; tc->cur_frame->return_type = MVM_RETURN_OBJ; MVM_interp_run(tc, callback_invoke, &cid); tc->interp_cur_op = backup_interp_cur_op; tc->interp_bytecode_start = backup_interp_bytecode_start; tc->interp_reg_base = backup_interp_reg_base; tc->interp_cu = backup_interp_cu; tc->cur_frame = backup_cur_frame; tc->current_frame_nr = backup_cur_frame->sequence_nr; tc->thread_entry_frame = backup_thread_entry_frame; memcpy(tc->interp_jump, backup_interp_jump, sizeof(jmp_buf)); MVM_gc_root_temp_mark_reset(tc, backup_mark); }); } /* Handle return value. */ if (res.o) { MVMContainerSpec const *contspec = STABLE(res.o)->container_spec; if (contspec && contspec->fetch_never_invokes) contspec->fetch(tc, res.o, &res); } switch (data->typeinfos[0] & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_VOID: break; case MVM_NATIVECALL_ARG_CHAR: cb_result->c = (signed char)MVM_nativecall_unmarshal_char(tc, res.o); break; case MVM_NATIVECALL_ARG_SHORT: cb_result->s = MVM_nativecall_unmarshal_short(tc, res.o); break; case MVM_NATIVECALL_ARG_INT: cb_result->i = MVM_nativecall_unmarshal_int(tc, res.o); break; case MVM_NATIVECALL_ARG_LONG: cb_result->j = MVM_nativecall_unmarshal_long(tc, res.o); break; case MVM_NATIVECALL_ARG_LONGLONG: cb_result->l = MVM_nativecall_unmarshal_longlong(tc, res.o); break; case MVM_NATIVECALL_ARG_FLOAT: cb_result->f = MVM_nativecall_unmarshal_float(tc, res.o); break; case MVM_NATIVECALL_ARG_DOUBLE: cb_result->d = MVM_nativecall_unmarshal_double(tc, res.o); break; case MVM_NATIVECALL_ARG_ASCIISTR: case MVM_NATIVECALL_ARG_UTF8STR: case MVM_NATIVECALL_ARG_UTF16STR: cb_result->Z = MVM_nativecall_unmarshal_string(tc, res.o, data->typeinfos[0], NULL); break; case MVM_NATIVECALL_ARG_CSTRUCT: cb_result->p = MVM_nativecall_unmarshal_cstruct(tc, res.o); break; case MVM_NATIVECALL_ARG_CPOINTER: cb_result->p = MVM_nativecall_unmarshal_cpointer(tc, res.o); break; case MVM_NATIVECALL_ARG_CARRAY: cb_result->p = MVM_nativecall_unmarshal_carray(tc, res.o); break; case MVM_NATIVECALL_ARG_CUNION: cb_result->p = MVM_nativecall_unmarshal_cunion(tc, res.o); break; case MVM_NATIVECALL_ARG_VMARRAY: cb_result->p = MVM_nativecall_unmarshal_vmarray(tc, res.o); break; case MVM_NATIVECALL_ARG_CALLBACK: cb_result->p = unmarshal_callback(tc, res.o, data->types[0]); break; case MVM_NATIVECALL_ARG_UCHAR: cb_result->c = MVM_nativecall_unmarshal_uchar(tc, res.o); break; case MVM_NATIVECALL_ARG_USHORT: cb_result->s = MVM_nativecall_unmarshal_ushort(tc, res.o); break; case MVM_NATIVECALL_ARG_UINT: cb_result->i = MVM_nativecall_unmarshal_uint(tc, res.o); break; case MVM_NATIVECALL_ARG_ULONG: cb_result->j = MVM_nativecall_unmarshal_ulong(tc, res.o); break; case MVM_NATIVECALL_ARG_ULONGLONG: cb_result->l = MVM_nativecall_unmarshal_ulonglong(tc, res.o); break; default: MVM_telemetry_interval_stop(tc, interval_id, "nativecall callback handler failed"); MVM_exception_throw_adhoc(tc, "Internal error: unhandled dyncall callback return type"); } /* Clean up. */ MVM_gc_root_temp_pop_n(tc, num_roots); MVM_free(args); /* Re-block GC if needed, so other threads will be able to collect. */ if (was_blocked) MVM_gc_mark_thread_blocked(tc); MVM_telemetry_interval_stop(tc, interval_id, "nativecall callback handler"); /* Indicate what we're producing as a result. */ return get_signature_char(data->typeinfos[0]); } #define handle_arg(what, cont_X, dc_type, reg_slot, dc_fun, unmarshal_fun) do { \ MVMRegister r; \ if ((arg_types[i] & MVM_NATIVECALL_ARG_RW_MASK) == MVM_NATIVECALL_ARG_RW) { \ if (MVM_6model_container_is ## cont_X(tc, value)) { \ dc_type *rw = (dc_type *)MVM_malloc(sizeof(dc_type)); \ MVM_6model_container_de ## cont_X(tc, value, &r); \ *rw = (dc_type)r. reg_slot ; \ if (!free_rws) \ free_rws = (void **)MVM_malloc(num_args * sizeof(void *)); \ free_rws[num_rws] = rw; \ num_rws++; \ dcArgPointer(vm, rw); \ } \ else \ MVM_exception_throw_adhoc(tc, \ "Native call expected argument that references a native %s, but got %s", \ what, REPR(value)->name); \ } \ else { \ if (value && IS_CONCRETE(value) && STABLE(value)->container_spec) { \ STABLE(value)->container_spec->fetch(tc, value, &r); \ dc_fun(vm, unmarshal_fun(tc, r.o)); \ } \ else { \ dc_fun(vm, unmarshal_fun(tc, value)); \ } \ } \ } while (0) MVMObject * MVM_nativecall_invoke(MVMThreadContext *tc, MVMObject *res_type, MVMObject *site, MVMObject *args) { MVMObject *result = NULL; char **free_strs = NULL; void **free_rws = NULL; MVMint16 num_strs = 0; MVMint16 num_rws = 0; MVMint16 i; /* Get native call body, so we can locate the call info. Read out all we * shall need, since later we may allocate a result and and move it. */ MVMNativeCallBody *body = MVM_nativecall_get_nc_body(tc, site); MVMint16 num_args = body->num_args; MVMint16 *arg_types = body->arg_types; MVMint16 ret_type = body->ret_type; void *entry_point = body->entry_point; void *ptr = NULL; unsigned int interval_id; DCCallVM *vm; /* Create and set up call VM. */ vm = dcNewCallVM(8192); dcMode(vm, body->convention); dcReset(vm); interval_id = MVM_telemetry_interval_start(tc, "nativecall invoke"); MVM_telemetry_interval_annotate((intptr_t)entry_point, interval_id, "nc entrypoint"); /* Process arguments. */ for (i = 0; i < num_args; i++) { MVMObject *value = MVM_repr_at_pos_o(tc, args, i); switch (arg_types[i] & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_CHAR: handle_arg("integer", cont_i, DCchar, i64, dcArgChar, MVM_nativecall_unmarshal_char); break; case MVM_NATIVECALL_ARG_SHORT: handle_arg("integer", cont_i, DCshort, i64, dcArgShort, MVM_nativecall_unmarshal_short); break; case MVM_NATIVECALL_ARG_INT: handle_arg("integer", cont_i, DCint, i64, dcArgInt, MVM_nativecall_unmarshal_int); break; case MVM_NATIVECALL_ARG_LONG: handle_arg("integer", cont_i, DClong, i64, dcArgLong, MVM_nativecall_unmarshal_long); break; case MVM_NATIVECALL_ARG_LONGLONG: handle_arg("integer", cont_i, DClonglong, i64, dcArgLongLong, MVM_nativecall_unmarshal_longlong); break; case MVM_NATIVECALL_ARG_FLOAT: handle_arg("number", cont_n, DCfloat, n64, dcArgFloat, MVM_nativecall_unmarshal_float); break; case MVM_NATIVECALL_ARG_DOUBLE: handle_arg("number", cont_n, DCdouble, n64, dcArgDouble, MVM_nativecall_unmarshal_double); break; case MVM_NATIVECALL_ARG_ASCIISTR: case MVM_NATIVECALL_ARG_UTF8STR: case MVM_NATIVECALL_ARG_UTF16STR: { MVMint16 free = 0; char *str = MVM_nativecall_unmarshal_string(tc, value, arg_types[i], &free); if (free) { if (!free_strs) free_strs = (char**)MVM_malloc(num_args * sizeof(char *)); free_strs[num_strs] = str; num_strs++; } dcArgPointer(vm, str); } break; case MVM_NATIVECALL_ARG_CSTRUCT: dcArgPointer(vm, MVM_nativecall_unmarshal_cstruct(tc, value)); break; case MVM_NATIVECALL_ARG_CPPSTRUCT: { /* We need to allocate the struct (THIS) for C++ constructor before passing it along. */ if (i == 0 && !IS_CONCRETE(value)) { MVMCPPStructREPRData *repr_data = (MVMCPPStructREPRData *)STABLE(res_type)->REPR_data; /* Allocate a full byte aligned area where the C++ structure fits into. */ ptr = MVM_malloc(repr_data->struct_size > 0 ? repr_data->struct_size : 1); result = MVM_nativecall_make_cppstruct(tc, res_type, ptr); dcArgPointer(vm, ptr); } else { dcArgPointer(vm, MVM_nativecall_unmarshal_cppstruct(tc, value)); } } break; case MVM_NATIVECALL_ARG_CPOINTER: if ((arg_types[i] & MVM_NATIVECALL_ARG_RW_MASK) == MVM_NATIVECALL_ARG_RW) { DCpointer *rw = (DCpointer *)MVM_malloc(sizeof(DCpointer *)); *rw = (DCpointer)MVM_nativecall_unmarshal_cpointer(tc, value); if (!free_rws) free_rws = (void **)MVM_malloc(num_args * sizeof(void *)); free_rws[num_rws] = rw; num_rws++; dcArgPointer(vm, rw); } else { dcArgPointer(vm, MVM_nativecall_unmarshal_cpointer(tc, value)); } break; case MVM_NATIVECALL_ARG_CARRAY: dcArgPointer(vm, MVM_nativecall_unmarshal_carray(tc, value)); break; case MVM_NATIVECALL_ARG_CUNION: dcArgPointer(vm, MVM_nativecall_unmarshal_cunion(tc, value)); break; case MVM_NATIVECALL_ARG_VMARRAY: dcArgPointer(vm, MVM_nativecall_unmarshal_vmarray(tc, value)); break; case MVM_NATIVECALL_ARG_CALLBACK: dcArgPointer(vm, unmarshal_callback(tc, value, body->arg_info[i])); break; case MVM_NATIVECALL_ARG_UCHAR: handle_arg("integer", cont_i, DCuchar, i64, dcArgChar, MVM_nativecall_unmarshal_uchar); break; case MVM_NATIVECALL_ARG_USHORT: handle_arg("integer", cont_i, DCushort, i64, dcArgShort, MVM_nativecall_unmarshal_ushort); break; case MVM_NATIVECALL_ARG_UINT: handle_arg("integer", cont_i, DCuint, i64, dcArgInt, MVM_nativecall_unmarshal_uint); break; case MVM_NATIVECALL_ARG_ULONG: handle_arg("integer", cont_i, DCulong, i64, dcArgLong, MVM_nativecall_unmarshal_ulong); break; case MVM_NATIVECALL_ARG_ULONGLONG: handle_arg("integer", cont_i, DCulonglong, i64, dcArgLongLong, MVM_nativecall_unmarshal_ulonglong); break; default: MVM_telemetry_interval_stop(tc, interval_id, "nativecall invoke failed"); MVM_exception_throw_adhoc(tc, "Internal error: unhandled dyncall argument type"); } } MVMROOT2(tc, args, res_type, { MVM_gc_mark_thread_blocked(tc); if (result) { /* We are calling a C++ constructor so we hand back the invocant (THIS) we recorded earlier. */ dcCallVoid(vm, body->entry_point); MVM_gc_mark_thread_unblocked(tc); } else { /* Call and process return values. */ switch (ret_type & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_VOID: dcCallVoid(vm, entry_point); MVM_gc_mark_thread_unblocked(tc); result = res_type; break; case MVM_NATIVECALL_ARG_CHAR: { MVMint64 native_result = (signed char)dcCallChar(vm, entry_point); MVM_gc_mark_thread_unblocked(tc); result = MVM_nativecall_make_int(tc, res_type, native_result); break; } case MVM_NATIVECALL_ARG_SHORT: { MVMint64 native_result = dcCallShort(vm, entry_point); MVM_gc_mark_thread_unblocked(tc); result = MVM_nativecall_make_int(tc, res_type, native_result); break; } case MVM_NATIVECALL_ARG_INT: { MVMint64 native_result = dcCallInt(vm, entry_point); MVM_gc_mark_thread_unblocked(tc); result = MVM_nativecall_make_int(tc, res_type, native_result); break; } case MVM_NATIVECALL_ARG_LONG: { MVMint64 native_result = dcCallLong(vm, entry_point); MVM_gc_mark_thread_unblocked(tc); result = MVM_nativecall_make_int(tc, res_type, native_result); break; } case MVM_NATIVECALL_ARG_LONGLONG: { MVMint64 native_result = dcCallLongLong(vm, entry_point); MVM_gc_mark_thread_unblocked(tc); result = MVM_nativecall_make_int(tc, res_type, native_result); break; } case MVM_NATIVECALL_ARG_FLOAT: { MVMnum64 native_result = dcCallFloat(vm, entry_point); MVM_gc_mark_thread_unblocked(tc); result = MVM_nativecall_make_num(tc, res_type, native_result); break; } case MVM_NATIVECALL_ARG_DOUBLE: { MVMnum64 native_result = dcCallDouble(vm, entry_point); MVM_gc_mark_thread_unblocked(tc); result = MVM_nativecall_make_num(tc, res_type, native_result); break; } case MVM_NATIVECALL_ARG_ASCIISTR: case MVM_NATIVECALL_ARG_UTF8STR: case MVM_NATIVECALL_ARG_UTF16STR: { char *native_result = (char *)dcCallPointer(vm, entry_point); MVM_gc_mark_thread_unblocked(tc); result = MVM_nativecall_make_str(tc, res_type, body->ret_type, native_result); break; } case MVM_NATIVECALL_ARG_CSTRUCT: { void *native_result = dcCallPointer(vm, body->entry_point); MVM_gc_mark_thread_unblocked(tc); result = MVM_nativecall_make_cstruct(tc, res_type, native_result); break; } case MVM_NATIVECALL_ARG_CPPSTRUCT: { void *native_result = dcCallPointer(vm, body->entry_point); MVM_gc_mark_thread_unblocked(tc); result = MVM_nativecall_make_cppstruct(tc, res_type, native_result); break; } case MVM_NATIVECALL_ARG_CPOINTER: { void *native_result = dcCallPointer(vm, body->entry_point); MVM_gc_mark_thread_unblocked(tc); result = MVM_nativecall_make_cpointer(tc, res_type, native_result); break; } case MVM_NATIVECALL_ARG_CARRAY: { void *native_result = dcCallPointer(vm, body->entry_point); MVM_gc_mark_thread_unblocked(tc); result = MVM_nativecall_make_carray(tc, res_type, native_result); break; } case MVM_NATIVECALL_ARG_CUNION: { void *native_result = dcCallPointer(vm, body->entry_point); MVM_gc_mark_thread_unblocked(tc); result = MVM_nativecall_make_cunion(tc, res_type, native_result); break; } case MVM_NATIVECALL_ARG_CALLBACK: /* TODO: A callback -return- value means that we have a C method * that needs to be wrapped similarly to a is native(...) Perl 6 * sub. */ dcCallPointer(vm, body->entry_point); MVM_gc_mark_thread_unblocked(tc); result = res_type; break; case MVM_NATIVECALL_ARG_UCHAR: { MVMuint64 native_result = (DCuchar)dcCallChar(vm, entry_point); MVM_gc_mark_thread_unblocked(tc); result = MVM_nativecall_make_uint(tc, res_type, native_result); break; } case MVM_NATIVECALL_ARG_USHORT: { MVMuint64 native_result = (DCushort)dcCallShort(vm, entry_point); MVM_gc_mark_thread_unblocked(tc); result = MVM_nativecall_make_uint(tc, res_type, native_result); break; } case MVM_NATIVECALL_ARG_UINT: { MVMuint64 native_result = (DCuint)dcCallInt(vm, entry_point); MVM_gc_mark_thread_unblocked(tc); result = MVM_nativecall_make_uint(tc, res_type, native_result); break; } case MVM_NATIVECALL_ARG_ULONG: { MVMuint64 native_result = (DCulong)dcCallLong(vm, entry_point); MVM_gc_mark_thread_unblocked(tc); result = MVM_nativecall_make_uint(tc, res_type, native_result); break; } case MVM_NATIVECALL_ARG_ULONGLONG: { MVMuint64 native_result = (DCulonglong)dcCallLongLong(vm, entry_point); MVM_gc_mark_thread_unblocked(tc); result = MVM_nativecall_make_uint(tc, res_type, native_result); break; } default: MVM_telemetry_interval_stop(tc, interval_id, "nativecall invoke failed"); MVM_exception_throw_adhoc(tc, "Internal error: unhandled dyncall return type"); } } }); num_rws = 0; for (i = 0; i < num_args; i++) { MVMObject *value = MVM_repr_at_pos_o(tc, args, i); if ((arg_types[i] & MVM_NATIVECALL_ARG_RW_MASK) == MVM_NATIVECALL_ARG_RW) { switch (arg_types[i] & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_CHAR: MVM_6model_container_assign_i(tc, value, (MVMint64)*(DCchar *)free_rws[num_rws]); break; case MVM_NATIVECALL_ARG_SHORT: MVM_6model_container_assign_i(tc, value, (MVMint64)*(DCshort *)free_rws[num_rws]); break; case MVM_NATIVECALL_ARG_INT: MVM_6model_container_assign_i(tc, value, (MVMint64)*(DCint *)free_rws[num_rws]); break; case MVM_NATIVECALL_ARG_LONG: MVM_6model_container_assign_i(tc, value, (MVMint64)*(DClong *)free_rws[num_rws]); break; case MVM_NATIVECALL_ARG_LONGLONG: MVM_6model_container_assign_i(tc, value, (MVMint64)*(DClonglong *)free_rws[num_rws]); break; case MVM_NATIVECALL_ARG_FLOAT: MVM_6model_container_assign_n(tc, value, (MVMnum64)*(DCfloat *)free_rws[num_rws]); break; case MVM_NATIVECALL_ARG_DOUBLE: MVM_6model_container_assign_n(tc, value, (MVMnum64)*(DCdouble *)free_rws[num_rws]); break; case MVM_NATIVECALL_ARG_UCHAR: MVM_6model_container_assign_i(tc, value, (MVMint64)*(DCuchar *)free_rws[num_rws]); break; case MVM_NATIVECALL_ARG_USHORT: MVM_6model_container_assign_i(tc, value, (MVMint64)*(DCushort *)free_rws[num_rws]); break; case MVM_NATIVECALL_ARG_UINT: MVM_6model_container_assign_i(tc, value, (MVMint64)*(DCuint *)free_rws[num_rws]); break; case MVM_NATIVECALL_ARG_ULONG: MVM_6model_container_assign_i(tc, value, (MVMint64)*(DCulong *)free_rws[num_rws]); break; case MVM_NATIVECALL_ARG_ULONGLONG: MVM_6model_container_assign_i(tc, value, (MVMint64)*(DCulonglong *)free_rws[num_rws]); break; case MVM_NATIVECALL_ARG_CPOINTER: REPR(value)->box_funcs.set_int(tc, STABLE(value), value, OBJECT_BODY(value), (MVMint64)*(DCpointer *)free_rws[num_rws]); break; default: MVM_telemetry_interval_stop(tc, interval_id, "nativecall invoke failed"); MVM_exception_throw_adhoc(tc, "Internal error: unhandled dyncall argument type"); } num_rws++; } /* Perform CArray/CStruct write barriers. */ MVM_nativecall_refresh(tc, value); } /* Free any memory that we need to. */ if (free_strs) { for (i = 0; i < num_strs; i++) MVM_free(free_strs[i]); MVM_free(free_strs); } if (free_rws) { for (i = 0; i < num_rws; i++) MVM_free(free_rws[i]); MVM_free(free_rws); } /* Finally, free call VM. */ dcFree(vm); MVM_telemetry_interval_stop(tc, interval_id, "nativecall invoke"); return result; } MoarVM-2018.03/src/core/nativecall_dyncall.h0000644000175000017510000000043213237701240020721 0ustar samanthasamanthaMVMint16 MVM_nativecall_get_calling_convention(MVMThreadContext *tc, MVMString *name); #define MVM_nativecall_load_lib(path) dlLoadLibrary(path) #define MVM_nativecall_free_lib(lib) dlFreeLibrary(lib) #define MVM_nativecall_find_sym(lib, name) dlFindSymbol(lib, name) MoarVM-2018.03/src/core/nativecall_libffi.c0000644000175000017510000010637113242626641020541 0ustar samanthasamantha#include "moar.h" #include //~ ffi_type * MVM_nativecall_get_ffi_type(MVMThreadContext *tc, MVMuint64 type_id, void **values, MVMuint64 offset) { ffi_type * MVM_nativecall_get_ffi_type(MVMThreadContext *tc, MVMuint64 type_id) { if ((type_id & MVM_NATIVECALL_ARG_RW_MASK) == MVM_NATIVECALL_ARG_RW) return &ffi_type_pointer; switch (type_id & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_CHAR: return &ffi_type_schar; case MVM_NATIVECALL_ARG_SHORT: return &ffi_type_sshort; case MVM_NATIVECALL_ARG_INT: return &ffi_type_sint; case MVM_NATIVECALL_ARG_LONG: return &ffi_type_slong; case MVM_NATIVECALL_ARG_LONGLONG: return &ffi_type_sint64; /* XXX ffi_type_slonglong not defined */ case MVM_NATIVECALL_ARG_FLOAT: return &ffi_type_float; case MVM_NATIVECALL_ARG_DOUBLE: return &ffi_type_double; case MVM_NATIVECALL_ARG_ASCIISTR: case MVM_NATIVECALL_ARG_UTF8STR: case MVM_NATIVECALL_ARG_UTF16STR: case MVM_NATIVECALL_ARG_CPPSTRUCT: case MVM_NATIVECALL_ARG_CSTRUCT: case MVM_NATIVECALL_ARG_CPOINTER: case MVM_NATIVECALL_ARG_CARRAY: case MVM_NATIVECALL_ARG_CUNION: case MVM_NATIVECALL_ARG_VMARRAY: case MVM_NATIVECALL_ARG_CALLBACK: return &ffi_type_pointer; case MVM_NATIVECALL_ARG_UCHAR: return &ffi_type_uchar; case MVM_NATIVECALL_ARG_USHORT: return &ffi_type_ushort; case MVM_NATIVECALL_ARG_UINT: return &ffi_type_uint; case MVM_NATIVECALL_ARG_ULONG: return &ffi_type_ulong; case MVM_NATIVECALL_ARG_ULONGLONG: return &ffi_type_uint64; /* XXX ffi_type_ulonglong not defined */ default: return &ffi_type_void; } } /* Maps a calling convention name to an ID. */ ffi_abi MVM_nativecall_get_calling_convention(MVMThreadContext *tc, MVMString *name) { ffi_abi result = FFI_DEFAULT_ABI; //~ if (name && MVM_string_graphs(tc, name) > 0) { //~ char *cname = MVM_string_utf8_encode_C_string(tc, name); //~ if (strcmp(cname, "cdecl") == 0) //~ result = DC_CALL_C_X86_CDECL; //~ else if (strcmp(cname, "stdcall") == 0) //~ result = DC_CALL_C_X86_WIN32_STD; //~ else if (strcmp(cname, "stdcall") == 0) //~ result = DC_CALL_C_X64_WIN64; //~ else { //~ char *waste[] = { cname, NULL }; //~ MVM_exception_throw_adhoc_free(tc, waste, //~ "Unknown calling convention '%s' used for native call", cname); //~ } //~ MVM_free(cname); //~ } return result; } /* Sets up a callback, caching the information to avoid duplicate work. */ //~ static char callback_handler(DCCallback *cb, DCArgs *args, DCValue *result, MVMNativeCallback *data); static void callback_handler(ffi_cif *cif, void *cb_result, void **cb_args, void *data); static void * unmarshal_callback(MVMThreadContext *tc, MVMObject *callback, MVMObject *sig_info) { MVMNativeCallbackCacheHead *callback_data_head = NULL; MVMNativeCallback **callback_data_handle; MVMString *cuid; if (!IS_CONCRETE(callback)) return NULL; /* Try to locate existing cached callback info. */ callback = MVM_frame_find_invokee(tc, callback, NULL); cuid = ((MVMCode *)callback)->body.sf->body.cuuid; MVM_HASH_GET(tc, tc->native_callback_cache, cuid, callback_data_head); if (!callback_data_head) { callback_data_head = MVM_malloc(sizeof(MVMNativeCallbackCacheHead)); callback_data_head->head = NULL; MVM_HASH_BIND(tc, tc->native_callback_cache, cuid, callback_data_head); } callback_data_handle = &(callback_data_head->head); while (*callback_data_handle) { if ((*callback_data_handle)->target == callback) /* found it, break */ break; callback_data_handle = &((*callback_data_handle)->next); } if (!*callback_data_handle) { /* First, build the MVMNativeCallback */ MVMCallsite *cs; MVMObject *typehash; MVMint64 num_info, i; MVMNativeCallback *callback_data; /* cb is a piece of executable memory we obtain from libffi. */ void *cb; ffi_cif *cif; ffi_closure *closure; ffi_status status; num_info = MVM_repr_elems(tc, sig_info); /* We'll also build up a MoarVM callsite as we go. */ cs = MVM_calloc(1, sizeof(MVMCallsite)); cs->flag_count = num_info - 1; cs->arg_flags = MVM_malloc(cs->flag_count * sizeof(MVMCallsiteEntry)); cs->arg_count = num_info - 1; cs->num_pos = num_info - 1; cs->has_flattening = 0; cs->is_interned = 0; cs->with_invocant = NULL; callback_data = MVM_malloc(sizeof(MVMNativeCallback)); callback_data->num_types = num_info; callback_data->typeinfos = MVM_malloc(num_info * sizeof(MVMint16)); callback_data->types = MVM_malloc(num_info * sizeof(MVMObject *)); callback_data->next = NULL; cif = (ffi_cif *)MVM_malloc(sizeof(ffi_cif)); callback_data->convention = FFI_DEFAULT_ABI; callback_data->ffi_arg_types = MVM_malloc(sizeof(ffi_type *) * (cs->arg_count ? cs->arg_count : 1)); /* Collect information about the return type. */ typehash = MVM_repr_at_pos_o(tc, sig_info, 0); callback_data->types[0] = MVM_repr_at_key_o(tc, typehash, tc->instance->str_consts.typeobj); callback_data->typeinfos[0] = MVM_nativecall_get_arg_type(tc, typehash, 1); callback_data->ffi_ret_type = MVM_nativecall_get_ffi_type(tc, callback_data->typeinfos[0]); for (i = 1; i < num_info; i++) { typehash = MVM_repr_at_pos_o(tc, sig_info, i); callback_data->types[i] = MVM_repr_at_key_o(tc, typehash, tc->instance->str_consts.typeobj); callback_data->typeinfos[i] = MVM_nativecall_get_arg_type(tc, typehash, 0) & ~MVM_NATIVECALL_ARG_FREE_STR; callback_data->ffi_arg_types[i - 1] = MVM_nativecall_get_ffi_type(tc, callback_data->typeinfos[i]); switch (callback_data->typeinfos[i] & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_CHAR: case MVM_NATIVECALL_ARG_SHORT: case MVM_NATIVECALL_ARG_INT: case MVM_NATIVECALL_ARG_LONG: case MVM_NATIVECALL_ARG_LONGLONG: cs->arg_flags[i - 1] = MVM_CALLSITE_ARG_INT; break; case MVM_NATIVECALL_ARG_UCHAR: case MVM_NATIVECALL_ARG_USHORT: case MVM_NATIVECALL_ARG_UINT: case MVM_NATIVECALL_ARG_ULONG: case MVM_NATIVECALL_ARG_ULONGLONG: /* TODO: should probably be UINT, when we can support that. */ cs->arg_flags[i - 1] = MVM_CALLSITE_ARG_INT; break; case MVM_NATIVECALL_ARG_FLOAT: case MVM_NATIVECALL_ARG_DOUBLE: cs->arg_flags[i - 1] = MVM_CALLSITE_ARG_NUM; break; default: cs->arg_flags[i - 1] = MVM_CALLSITE_ARG_OBJ; break; } } MVM_callsite_try_intern(tc, &cs); callback_data->instance = tc->instance; callback_data->cs = cs; callback_data->target = callback; status = ffi_prep_cif(cif, callback_data->convention, (unsigned int)cs->arg_count, callback_data->ffi_ret_type, callback_data->ffi_arg_types); closure = ffi_closure_alloc(sizeof(ffi_closure), &cb); if (!closure) MVM_panic(1, "Unable to allocate memory for callback closure"); ffi_prep_closure_loc(closure, cif, callback_handler, callback_data, cb); callback_data->cb = cb; /* Now insert the MVMCallback into the linked list. */ *callback_data_handle = callback_data; } return (*callback_data_handle)->cb; } /* Called to handle a callback. */ typedef struct { MVMObject *invokee; MVMRegister *args; MVMCallsite *cs; } CallbackInvokeData; static void callback_invoke(MVMThreadContext *tc, void *data) { /* Invoke the coderef, to set up the nested interpreter. */ CallbackInvokeData *cid = (CallbackInvokeData *)data; STABLE(cid->invokee)->invoke(tc, cid->invokee, cid->cs, cid->args); /* Ensure we exit interp after callback. */ tc->thread_entry_frame = tc->cur_frame; } static void callback_handler(ffi_cif *cif, void *cb_result, void **cb_args, void *cb_data) { CallbackInvokeData cid; MVMint32 num_roots, i; MVMRegister res; MVMRegister *args; MVMNativeCallback *data = (MVMNativeCallback *)cb_data; void **values = MVM_malloc(sizeof(void *) * (data->cs->arg_count ? data->cs->arg_count : 1)); unsigned int interval_id; /* Locate the MoarVM thread this callback is being run on. */ MVMThreadContext *tc = MVM_nativecall_find_thread_context(data->instance); /* Unblock GC if needed, so this thread can do work. */ MVMint32 was_blocked = MVM_gc_is_thread_blocked(tc); if (was_blocked) MVM_gc_mark_thread_unblocked(tc); interval_id = MVM_telemetry_interval_start(tc, "nativecall callback handler"); /* Build a callsite and arguments buffer. */ args = MVM_malloc(data->num_types * sizeof(MVMRegister)); num_roots = 0; for (i = 1; i < data->num_types; i++) { MVMObject *type = data->types[i]; MVMint16 typeinfo = data->typeinfos[i]; switch (typeinfo & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_CHAR: args[i - 1].i64 = *(signed char *)cb_args[i - 1]; break; case MVM_NATIVECALL_ARG_SHORT: args[i - 1].i64 = *(signed short *)cb_args[i - 1]; break; case MVM_NATIVECALL_ARG_INT: args[i - 1].i64 = *(signed int *)cb_args[i - 1]; break; case MVM_NATIVECALL_ARG_LONG: args[i - 1].i64 = *(signed long *)cb_args[i - 1]; break; case MVM_NATIVECALL_ARG_LONGLONG: args[i - 1].i64 = *(signed long long *)cb_args[i - 1]; break; case MVM_NATIVECALL_ARG_FLOAT: args[i - 1].n64 = *(float *)cb_args[i - 1]; break; case MVM_NATIVECALL_ARG_DOUBLE: args[i - 1].n64 = *(double *)cb_args[i - 1]; break; case MVM_NATIVECALL_ARG_ASCIISTR: case MVM_NATIVECALL_ARG_UTF8STR: case MVM_NATIVECALL_ARG_UTF16STR: args[i - 1].o = MVM_nativecall_make_str(tc, type, typeinfo, *(char **)cb_args[i - 1]); MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o)); num_roots++; break; case MVM_NATIVECALL_ARG_CSTRUCT: args[i - 1].o = MVM_nativecall_make_cstruct(tc, type, *(void **)cb_args[i - 1]); MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o)); num_roots++; break; case MVM_NATIVECALL_ARG_CPOINTER: args[i - 1].o = MVM_nativecall_make_cpointer(tc, type, *(void **)cb_args[i - 1]); MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o)); num_roots++; break; case MVM_NATIVECALL_ARG_CARRAY: args[i - 1].o = MVM_nativecall_make_carray(tc, type, *(void **)cb_args[i - 1]); MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o)); num_roots++; break; case MVM_NATIVECALL_ARG_CUNION: args[i - 1].o = MVM_nativecall_make_cunion(tc, type, *(void **)cb_args[i - 1]); MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o)); num_roots++; break; case MVM_NATIVECALL_ARG_CALLBACK: /* TODO: A callback -return- value means that we have a C method * that needs to be wrapped similarly to a is native(...) Perl 6 * sub. */ /* XXX do something with the function pointer: *(void **)cb_args[i - 1] */ args[i - 1].o = type; MVM_gc_root_temp_push(tc, (MVMCollectable **)&(args[i - 1].o)); num_roots++; case MVM_NATIVECALL_ARG_UCHAR: args[i - 1].i64 = *(unsigned char *)cb_args[i - 1]; break; case MVM_NATIVECALL_ARG_USHORT: args[i - 1].i64 = *(unsigned short *)cb_args[i - 1]; break; case MVM_NATIVECALL_ARG_UINT: args[i - 1].i64 = *(unsigned int *)cb_args[i - 1]; break; case MVM_NATIVECALL_ARG_ULONG: args[i - 1].i64 = *(unsigned long *)cb_args[i - 1]; break; case MVM_NATIVECALL_ARG_ULONGLONG: args[i - 1].i64 = *(unsigned long long *)cb_args[i - 1]; break; default: MVM_telemetry_interval_stop(tc, interval_id, "nativecall callback handler failed"); MVM_exception_throw_adhoc(tc, "Internal error: unhandled libffi callback argument type"); } } /* Call into a nested interpreter (since we already are in one). Need to * save a bunch of state around each side of this. */ cid.invokee = data->target; cid.args = args; cid.cs = data->cs; { MVMuint8 **backup_interp_cur_op = tc->interp_cur_op; MVMuint8 **backup_interp_bytecode_start = tc->interp_bytecode_start; MVMRegister **backup_interp_reg_base = tc->interp_reg_base; MVMCompUnit **backup_interp_cu = tc->interp_cu; MVMFrame *backup_cur_frame = MVM_frame_force_to_heap(tc, tc->cur_frame); MVMFrame *backup_thread_entry_frame = tc->thread_entry_frame; MVMROOT2(tc, backup_cur_frame, backup_thread_entry_frame, { MVMuint32 backup_mark = MVM_gc_root_temp_mark(tc); jmp_buf backup_interp_jump; memcpy(backup_interp_jump, tc->interp_jump, sizeof(jmp_buf)); tc->cur_frame->return_value = &res; tc->cur_frame->return_type = MVM_RETURN_OBJ; MVM_interp_run(tc, callback_invoke, &cid); tc->interp_cur_op = backup_interp_cur_op; tc->interp_bytecode_start = backup_interp_bytecode_start; tc->interp_reg_base = backup_interp_reg_base; tc->interp_cu = backup_interp_cu; tc->cur_frame = backup_cur_frame; tc->current_frame_nr = backup_cur_frame->sequence_nr; tc->thread_entry_frame = backup_thread_entry_frame; memcpy(tc->interp_jump, backup_interp_jump, sizeof(jmp_buf)); MVM_gc_root_temp_mark_reset(tc, backup_mark); }); } /* Handle return value. */ if (res.o) { MVMContainerSpec const *contspec = STABLE(res.o)->container_spec; if (contspec && contspec->fetch_never_invokes) contspec->fetch(tc, res.o, &res); } switch (data->typeinfos[0] & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_VOID: break; case MVM_NATIVECALL_ARG_CHAR: *(signed char *)cb_result = MVM_nativecall_unmarshal_char(tc, res.o); break; case MVM_NATIVECALL_ARG_SHORT: *(signed short *)cb_result = MVM_nativecall_unmarshal_short(tc, res.o); break; case MVM_NATIVECALL_ARG_INT: *(signed int *)cb_result = MVM_nativecall_unmarshal_int(tc, res.o); break; case MVM_NATIVECALL_ARG_LONG: *(signed long *)cb_result = MVM_nativecall_unmarshal_long(tc, res.o); break; case MVM_NATIVECALL_ARG_LONGLONG: *(signed long long *)cb_result = MVM_nativecall_unmarshal_longlong(tc, res.o); break; case MVM_NATIVECALL_ARG_FLOAT: *(float *)cb_result = MVM_nativecall_unmarshal_float(tc, res.o); break; case MVM_NATIVECALL_ARG_DOUBLE: *(double *)cb_result = MVM_nativecall_unmarshal_double(tc, res.o); break; case MVM_NATIVECALL_ARG_ASCIISTR: case MVM_NATIVECALL_ARG_UTF8STR: case MVM_NATIVECALL_ARG_UTF16STR: *(void **)cb_result = MVM_nativecall_unmarshal_string(tc, res.o, data->typeinfos[0], NULL); break; case MVM_NATIVECALL_ARG_CSTRUCT: *(void **)cb_result = MVM_nativecall_unmarshal_cstruct(tc, res.o); break; case MVM_NATIVECALL_ARG_CPOINTER: *(void **)cb_result = MVM_nativecall_unmarshal_cpointer(tc, res.o); break; case MVM_NATIVECALL_ARG_CARRAY: *(void **)cb_result = MVM_nativecall_unmarshal_carray(tc, res.o); break; case MVM_NATIVECALL_ARG_CUNION: *(void **)cb_result = MVM_nativecall_unmarshal_cunion(tc, res.o); break; case MVM_NATIVECALL_ARG_VMARRAY: *(void **)cb_result = MVM_nativecall_unmarshal_vmarray(tc, res.o); break; case MVM_NATIVECALL_ARG_CALLBACK: *(void **)cb_result = unmarshal_callback(tc, res.o, data->types[0]); break; case MVM_NATIVECALL_ARG_UCHAR: *(unsigned char *)cb_result = MVM_nativecall_unmarshal_uchar(tc, res.o); break; case MVM_NATIVECALL_ARG_USHORT: *(unsigned short *)cb_result = MVM_nativecall_unmarshal_ushort(tc, res.o); break; case MVM_NATIVECALL_ARG_UINT: *(unsigned int *)cb_result = MVM_nativecall_unmarshal_uint(tc, res.o); break; case MVM_NATIVECALL_ARG_ULONG: *(unsigned long *)cb_result = MVM_nativecall_unmarshal_ulong(tc, res.o); break; case MVM_NATIVECALL_ARG_ULONGLONG: *(unsigned long long *)cb_result = MVM_nativecall_unmarshal_ulonglong(tc, res.o); break; default: MVM_telemetry_interval_stop(tc, interval_id, "nativecall callback handler failed"); MVM_exception_throw_adhoc(tc, "Internal error: unhandled libffi callback return type"); } /* Clean up. */ MVM_gc_root_temp_pop_n(tc, num_roots); MVM_free(args); /* Re-block GC if needed, so other threads will be able to collect. */ if (was_blocked) MVM_gc_mark_thread_blocked(tc); MVM_telemetry_interval_stop(tc, interval_id, "nativecall callback handler"); } #define handle_arg(what, cont_X, dc_type, reg_slot, unmarshal_fun) do { \ MVMRegister r; \ if ((arg_types[i] & MVM_NATIVECALL_ARG_RW_MASK) == MVM_NATIVECALL_ARG_RW) { \ if (MVM_6model_container_is ## cont_X(tc, value)) { \ MVM_6model_container_de ## cont_X(tc, value, &r); \ values[i] = MVM_malloc(sizeof(void *)); \ *(void **)values[i] = MVM_malloc(sizeof(dc_type)); \ *(dc_type *)*(void **)values[i] = (dc_type)r. reg_slot ; \ } \ else \ MVM_exception_throw_adhoc(tc, \ "Native call expected argument that references a native %s, but got %s", \ what, REPR(value)->name); \ } \ else { \ values[i] = MVM_malloc(sizeof(dc_type)); \ if (value && IS_CONCRETE(value) && STABLE(value)->container_spec) { \ STABLE(value)->container_spec->fetch(tc, value, &r); \ *(dc_type *)values[i] = unmarshal_fun(tc, r.o); \ } \ else { \ *(dc_type *)values[i] = unmarshal_fun(tc, value); \ } \ } \ } while (0) #define handle_ret(tc, c_type, ffi_type, make_fun) do { \ if (sizeof(c_type) < sizeof(ffi_type)) { \ ffi_type ret; \ ffi_call(&cif, entry_point, &ret, values); \ MVM_gc_mark_thread_unblocked(tc); \ result = make_fun(tc, res_type, (c_type)ret); \ } \ else { \ c_type ret; \ ffi_call(&cif, entry_point, &ret, values); \ MVM_gc_mark_thread_unblocked(tc); \ result = make_fun(tc, res_type, ret); \ } \ } while (0) MVMObject * MVM_nativecall_invoke(MVMThreadContext *tc, MVMObject *res_type, MVMObject *site, MVMObject *args) { MVMObject *result = NULL; char **free_strs = NULL; MVMint16 num_strs = 0; MVMint16 i; /* Get native call body, so we can locate the call info. Read out all we * shall need, since later we may allocate a result and and move it. */ MVMNativeCallBody *body = MVM_nativecall_get_nc_body(tc, site); MVMint16 num_args = body->num_args; MVMint16 *arg_types = body->arg_types; MVMint16 ret_type = body->ret_type; void *entry_point = body->entry_point; void **values = MVM_malloc(sizeof(void *) * (num_args ? num_args : 1)); unsigned int interval_id; ffi_cif cif; ffi_status status = ffi_prep_cif(&cif, body->convention, (unsigned int)num_args, body->ffi_ret_type, body->ffi_arg_types); interval_id = MVM_telemetry_interval_start(tc, "nativecall invoke"); MVM_telemetry_interval_annotate((uintptr_t)entry_point, interval_id, "nc entrypoint"); /* Process arguments. */ for (i = 0; i < num_args; i++) { MVMObject *value = MVM_repr_at_pos_o(tc, args, i); switch (arg_types[i] & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_CHAR: handle_arg("integer", cont_i, signed char, i64, MVM_nativecall_unmarshal_char); break; case MVM_NATIVECALL_ARG_SHORT: handle_arg("integer", cont_i, signed short, i64, MVM_nativecall_unmarshal_short); break; case MVM_NATIVECALL_ARG_INT: handle_arg("integer", cont_i, signed int, i64, MVM_nativecall_unmarshal_int); break; case MVM_NATIVECALL_ARG_LONG: handle_arg("integer", cont_i, signed long, i64, MVM_nativecall_unmarshal_long); break; case MVM_NATIVECALL_ARG_LONGLONG: handle_arg("integer", cont_i, signed long long, i64, MVM_nativecall_unmarshal_longlong); break; case MVM_NATIVECALL_ARG_FLOAT: handle_arg("number", cont_n, float, n64, MVM_nativecall_unmarshal_float); break; case MVM_NATIVECALL_ARG_DOUBLE: handle_arg("number", cont_n, double, n64, MVM_nativecall_unmarshal_double); break; case MVM_NATIVECALL_ARG_ASCIISTR: case MVM_NATIVECALL_ARG_UTF8STR: case MVM_NATIVECALL_ARG_UTF16STR: { MVMint16 free = 0; char *str = MVM_nativecall_unmarshal_string(tc, value, arg_types[i], &free); if (free) { if (!free_strs) free_strs = (char**)MVM_malloc(num_args * sizeof(char *)); free_strs[num_strs] = str; num_strs++; } values[i] = MVM_malloc(sizeof(void *)); *(void **)values[i] = str; break; } case MVM_NATIVECALL_ARG_CSTRUCT: values[i] = MVM_malloc(sizeof(void *)); *(void **)values[i] = MVM_nativecall_unmarshal_cstruct(tc, value); break; case MVM_NATIVECALL_ARG_CPPSTRUCT: { /* We need to allocate the struct (THIS) for C++ constructor before passing it along. */ if (i == 0 && !IS_CONCRETE(value)) { MVMCPPStructREPRData *repr_data = (MVMCPPStructREPRData *)STABLE(res_type)->REPR_data; /* Allocate a full byte aligned area where the C++ structure fits into. */ void *ptr = MVM_malloc(repr_data->struct_size > 0 ? repr_data->struct_size : 1); result = MVM_nativecall_make_cppstruct(tc, res_type, ptr); values[i] = MVM_malloc(sizeof(void *)); *(void **)values[i] = ptr; } else { values[i] = MVM_malloc(sizeof(void *)); *(void **)values[i] = MVM_nativecall_unmarshal_cppstruct(tc, value); } break; } case MVM_NATIVECALL_ARG_CPOINTER: if ((arg_types[i] & MVM_NATIVECALL_ARG_RW_MASK) == MVM_NATIVECALL_ARG_RW) { values[i] = MVM_malloc(sizeof(void *)); *(void **)values[i] = MVM_malloc(sizeof(void *)); *(void **)*(void **)values[i] = (void *)MVM_nativecall_unmarshal_cpointer(tc, value); } else { values[i] = MVM_malloc(sizeof(void *)); *(void **)values[i] = MVM_nativecall_unmarshal_cpointer(tc, value); } break; case MVM_NATIVECALL_ARG_CARRAY: values[i] = MVM_malloc(sizeof(void *)); *(void **)values[i] = MVM_nativecall_unmarshal_carray(tc, value); break; case MVM_NATIVECALL_ARG_CUNION: values[i] = MVM_malloc(sizeof(void *)); *(void **)values[i] = MVM_nativecall_unmarshal_cunion(tc, value); break; case MVM_NATIVECALL_ARG_VMARRAY: values[i] = MVM_malloc(sizeof(void *)); *(void **)values[i] = MVM_nativecall_unmarshal_vmarray(tc, value); break; case MVM_NATIVECALL_ARG_CALLBACK: values[i] = MVM_malloc(sizeof(void *)); *(void **)values[i] = unmarshal_callback(tc, value, body->arg_info[i]); break; case MVM_NATIVECALL_ARG_UCHAR: handle_arg("integer", cont_i, unsigned char, i64, MVM_nativecall_unmarshal_uchar); break; case MVM_NATIVECALL_ARG_USHORT: handle_arg("integer", cont_i, unsigned short, i64, MVM_nativecall_unmarshal_ushort); break; case MVM_NATIVECALL_ARG_UINT: handle_arg("integer", cont_i, unsigned int, i64, MVM_nativecall_unmarshal_uint); break; case MVM_NATIVECALL_ARG_ULONG: handle_arg("integer", cont_i, unsigned long, i64, MVM_nativecall_unmarshal_ulong); break; case MVM_NATIVECALL_ARG_ULONGLONG: handle_arg("integer", cont_i, unsigned long long, i64, MVM_nativecall_unmarshal_ulonglong); break; default: MVM_telemetry_interval_stop(tc, interval_id, "nativecall invoke failed"); MVM_exception_throw_adhoc(tc, "Internal error: unhandled libffi argument type"); } } MVMROOT2(tc, args, res_type, { MVM_gc_mark_thread_blocked(tc); if (result) { /* We are calling a C++ constructor so we hand back the invocant (THIS) we recorded earlier. */ void *ret; // We are not going to use it, but we need to pass it to libffi. ffi_call(&cif, entry_point, &ret, values); MVM_gc_mark_thread_unblocked(tc); } else { /* Process return values. */ switch (ret_type & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_VOID: { void *ret; ffi_call(&cif, entry_point, &ret, values); MVM_gc_mark_thread_unblocked(tc); result = res_type; break; } case MVM_NATIVECALL_ARG_CHAR: handle_ret(tc, signed char, ffi_sarg, MVM_nativecall_make_int); break; case MVM_NATIVECALL_ARG_SHORT: handle_ret(tc, signed short, ffi_sarg, MVM_nativecall_make_int); break; case MVM_NATIVECALL_ARG_INT: handle_ret(tc, signed int, ffi_sarg, MVM_nativecall_make_int); break; case MVM_NATIVECALL_ARG_LONG: handle_ret(tc, signed long, ffi_sarg, MVM_nativecall_make_int); break; case MVM_NATIVECALL_ARG_LONGLONG: handle_ret(tc, signed long long, ffi_sarg, MVM_nativecall_make_int); break; case MVM_NATIVECALL_ARG_FLOAT: { float ret; ffi_call(&cif, entry_point, &ret, values); MVM_gc_mark_thread_unblocked(tc); result = MVM_nativecall_make_num(tc, res_type, ret); break; } case MVM_NATIVECALL_ARG_DOUBLE: { double ret; ffi_call(&cif, entry_point, &ret, values); MVM_gc_mark_thread_unblocked(tc); result = MVM_nativecall_make_num(tc, res_type, ret); break; } case MVM_NATIVECALL_ARG_ASCIISTR: case MVM_NATIVECALL_ARG_UTF8STR: case MVM_NATIVECALL_ARG_UTF16STR: { char *ret; ffi_call(&cif, entry_point, &ret, values); MVM_gc_mark_thread_unblocked(tc); result = MVM_nativecall_make_str(tc, res_type, body->ret_type, ret); break; } case MVM_NATIVECALL_ARG_CSTRUCT: handle_ret(tc, void *, ffi_arg, MVM_nativecall_make_cstruct); break; case MVM_NATIVECALL_ARG_CPPSTRUCT: handle_ret(tc, void *, ffi_arg, MVM_nativecall_make_cppstruct); break; case MVM_NATIVECALL_ARG_CPOINTER: handle_ret(tc, void *, ffi_arg, MVM_nativecall_make_cpointer); break; case MVM_NATIVECALL_ARG_CARRAY: handle_ret(tc, void *, ffi_arg, MVM_nativecall_make_carray); break; case MVM_NATIVECALL_ARG_CUNION: handle_ret(tc, void *, ffi_arg, MVM_nativecall_make_cunion); break; case MVM_NATIVECALL_ARG_CALLBACK: { /* TODO: A callback -return- value means that we have a C method * that needs to be wrapped similarly to a is native(...) Perl 6 * sub. */ void *ret; ffi_call(&cif, entry_point, &ret, values); MVM_gc_mark_thread_unblocked(tc); /* XXX do something with the function pointer: ret */ result = res_type; break; } case MVM_NATIVECALL_ARG_UCHAR: handle_ret(tc, unsigned char, ffi_arg, MVM_nativecall_make_int); break; case MVM_NATIVECALL_ARG_USHORT: handle_ret(tc, unsigned short, ffi_arg, MVM_nativecall_make_int); break; case MVM_NATIVECALL_ARG_UINT: handle_ret(tc, unsigned int, ffi_arg, MVM_nativecall_make_int); break; case MVM_NATIVECALL_ARG_ULONG: handle_ret(tc, unsigned long, ffi_arg, MVM_nativecall_make_int); break; case MVM_NATIVECALL_ARG_ULONGLONG: handle_ret(tc, unsigned long long, ffi_arg, MVM_nativecall_make_int); break; default: MVM_telemetry_interval_stop(tc, interval_id, "nativecall invoke failed"); MVM_exception_throw_adhoc(tc, "Internal error: unhandled libffi return type"); } } }); for (i = 0; i < num_args; i++) { MVMObject *value = MVM_repr_at_pos_o(tc, args, i); if ((arg_types[i] & MVM_NATIVECALL_ARG_RW_MASK) == MVM_NATIVECALL_ARG_RW) { switch (arg_types[i] & MVM_NATIVECALL_ARG_TYPE_MASK) { case MVM_NATIVECALL_ARG_CHAR: MVM_6model_container_assign_i(tc, value, (MVMint64)*(signed char *)*(void **)values[i]); break; case MVM_NATIVECALL_ARG_SHORT: MVM_6model_container_assign_i(tc, value, (MVMint64)*(signed short *)*(void **)values[i]); break; case MVM_NATIVECALL_ARG_INT: MVM_6model_container_assign_i(tc, value, (MVMint64)*(signed int *)*(void **)values[i]); break; case MVM_NATIVECALL_ARG_LONG: MVM_6model_container_assign_i(tc, value, (MVMint64)*(signed long *)*(void **)values[i]); break; case MVM_NATIVECALL_ARG_LONGLONG: MVM_6model_container_assign_i(tc, value, (MVMint64)*(signed long long *)*(void **)values[i]); break; case MVM_NATIVECALL_ARG_FLOAT: MVM_6model_container_assign_n(tc, value, (MVMnum64)*(float *)*(void **)values[i]); break; case MVM_NATIVECALL_ARG_DOUBLE: MVM_6model_container_assign_n(tc, value, (MVMnum64)*(double *)*(void **)values[i]); break; case MVM_NATIVECALL_ARG_UCHAR: MVM_6model_container_assign_i(tc, value, (MVMint64)*(unsigned char *)*(void **)values[i]); break; case MVM_NATIVECALL_ARG_USHORT: MVM_6model_container_assign_i(tc, value, (MVMint64)*(unsigned short *)*(void **)values[i]); break; case MVM_NATIVECALL_ARG_UINT: MVM_6model_container_assign_i(tc, value, (MVMint64)*(unsigned int *)*(void **)values[i]); break; case MVM_NATIVECALL_ARG_ULONG: MVM_6model_container_assign_i(tc, value, (MVMint64)*(unsigned long *)*(void **)values[i]); break; case MVM_NATIVECALL_ARG_ULONGLONG: MVM_6model_container_assign_i(tc, value, (MVMint64)*(unsigned long long *)*(void **)values[i]); break; case MVM_NATIVECALL_ARG_CPOINTER: REPR(value)->box_funcs.set_int(tc, STABLE(value), value, OBJECT_BODY(value), (MVMint64)*(void **)*(void **)values[i]); break; default: MVM_telemetry_interval_stop(tc, interval_id, "nativecall invoke failed"); MVM_exception_throw_adhoc(tc, "Internal error: unhandled libffi argument type"); } } /* Perform CArray/CStruct write barriers. */ MVM_nativecall_refresh(tc, value); } /* Free any memory that we need to. */ if (free_strs) { for (i = 0; i < num_strs; i++) MVM_free(free_strs[i]); MVM_free(free_strs); } if (values) MVM_free(values); MVM_telemetry_interval_stop(tc, interval_id, "nativecall invoke"); return result; } MoarVM-2018.03/src/core/nativecall_libffi.h0000644000175000017510000000065713237701240020537 0ustar samanthasamantha#include typedef void DLLib; ffi_type * MVM_nativecall_get_ffi_type(MVMThreadContext *tc, MVMuint64 type_id); ffi_abi MVM_nativecall_get_calling_convention(MVMThreadContext *tc, MVMString *name); #define MVM_nativecall_load_lib(path) dlopen(path, RTLD_NOW|RTLD_GLOBAL) #define MVM_nativecall_free_lib(lib) do { if(lib) dlclose(lib); } while (0) #define MVM_nativecall_find_sym(lib, name) dlsym(lib, name) MoarVM-2018.03/src/core/oplabels.h0000644000175000017510000011775713252330426016716 0ustar samanthasamantha/* This file is generated from src/core/oplist by tools/update_ops.p6. */ static const void * const LABELS[] = { &&OP_no_op, &&OP_const_i8, &&OP_const_i16, &&OP_const_i32, &&OP_const_i64, &&OP_const_n32, &&OP_const_n64, &&OP_const_s, &&OP_set, &&OP_extend_u8, &&OP_extend_u16, &&OP_extend_u32, &&OP_extend_i8, &&OP_extend_i16, &&OP_extend_i32, &&OP_trunc_u8, &&OP_trunc_u16, &&OP_trunc_u32, &&OP_trunc_i8, &&OP_trunc_i16, &&OP_trunc_i32, &&OP_extend_n32, &&OP_trunc_n32, &&OP_goto, &&OP_if_i, &&OP_unless_i, &&OP_if_n, &&OP_unless_n, &&OP_if_s, &&OP_unless_s, &&OP_if_s0, &&OP_unless_s0, &&OP_if_o, &&OP_unless_o, &&OP_jumplist, &&OP_getlex, &&OP_bindlex, &&OP_getlex_ni, &&OP_getlex_nn, &&OP_getlex_ns, &&OP_getlex_no, &&OP_bindlex_ni, &&OP_bindlex_nn, &&OP_bindlex_ns, &&OP_bindlex_no, &&OP_getlex_ng, &&OP_bindlex_ng, &&OP_getdynlex, &&OP_binddynlex, &&OP_setlexvalue, &&OP_lexprimspec, &&OP_return_i, &&OP_return_n, &&OP_return_s, &&OP_return_o, &&OP_return, &&OP_eq_i, &&OP_ne_i, &&OP_lt_i, &&OP_le_i, &&OP_gt_i, &&OP_ge_i, &&OP_cmp_i, &&OP_add_i, &&OP_sub_i, &&OP_mul_i, &&OP_div_i, &&OP_div_u, &&OP_mod_i, &&OP_mod_u, &&OP_neg_i, &&OP_abs_i, &&OP_inc_i, &&OP_inc_u, &&OP_dec_i, &&OP_dec_u, &&OP_band_i, &&OP_bor_i, &&OP_bxor_i, &&OP_bnot_i, &&OP_blshift_i, &&OP_brshift_i, &&OP_pow_i, &&OP_not_i, &&OP_gcd_i, &&OP_lcm_i, &&OP_eq_n, &&OP_ne_n, &&OP_lt_n, &&OP_le_n, &&OP_gt_n, &&OP_ge_n, &&OP_cmp_n, &&OP_add_n, &&OP_sub_n, &&OP_mul_n, &&OP_div_n, &&OP_mod_n, &&OP_neg_n, &&OP_abs_n, &&OP_pow_n, &&OP_ceil_n, &&OP_floor_n, &&OP_sin_n, &&OP_asin_n, &&OP_cos_n, &&OP_acos_n, &&OP_tan_n, &&OP_atan_n, &&OP_atan2_n, &&OP_sec_n, &&OP_asec_n, &&OP_sinh_n, &&OP_cosh_n, &&OP_tanh_n, &&OP_sech_n, &&OP_sqrt_n, &&OP_log_n, &&OP_exp_n, &&OP_coerce_in, &&OP_coerce_ni, &&OP_coerce_is, &&OP_coerce_ns, &&OP_coerce_si, &&OP_coerce_sn, &&OP_smrt_numify, &&OP_smrt_strify, &&OP_prepargs, &&OP_arg_i, &&OP_arg_n, &&OP_arg_s, &&OP_arg_o, &&OP_argconst_i, &&OP_argconst_n, &&OP_argconst_s, &&OP_invoke_v, &&OP_invoke_i, &&OP_invoke_n, &&OP_invoke_s, &&OP_invoke_o, &&OP_checkarity, &&OP_param_rp_i, &&OP_param_rp_n, &&OP_param_rp_s, &&OP_param_rp_o, &&OP_param_op_i, &&OP_param_op_n, &&OP_param_op_s, &&OP_param_op_o, &&OP_param_rn_i, &&OP_param_rn_n, &&OP_param_rn_s, &&OP_param_rn_o, &&OP_param_on_i, &&OP_param_on_n, &&OP_param_on_s, &&OP_param_on_o, &&OP_param_sp, &&OP_param_sn, &&OP_getcode, &&OP_caller, &&OP_capturelex, &&OP_takeclosure, &&OP_exception, &&OP_bindexmessage, &&OP_bindexpayload, &&OP_bindexcategory, &&OP_getexmessage, &&OP_getexpayload, &&OP_getexcategory, &&OP_throwdyn, &&OP_throwlex, &&OP_throwlexotic, &&OP_throwcatdyn, &&OP_throwcatlex, &&OP_throwcatlexotic, &&OP_die, &&OP_rethrow, &&OP_resume, &&OP_takehandlerresult, &&OP_DEPRECATED_33, &&OP_DEPRECATED_34, &&OP_backtracestrings, &&OP_usecapture, &&OP_savecapture, &&OP_captureposelems, &&OP_captureposarg, &&OP_captureposarg_i, &&OP_captureposarg_n, &&OP_captureposarg_s, &&OP_captureposprimspec, &&OP_captureexistsnamed, &&OP_capturehasnameds, &&OP_invokewithcapture, &&OP_multicacheadd, &&OP_multicachefind, &&OP_null_s, &&OP_isnull_s, &&OP_eq_s, &&OP_ne_s, &&OP_gt_s, &&OP_ge_s, &&OP_lt_s, &&OP_le_s, &&OP_cmp_s, &&OP_eqat_s, &&OP_eqatic_s, &&OP_haveat_s, &&OP_concat_s, &&OP_repeat_s, &&OP_substr_s, &&OP_index_s, &&OP_graphs_s, &&OP_codes_s, &&OP_getcp_s, &&OP_indexcp_s, &&OP_uc, &&OP_lc, &&OP_tc, &&OP_split, &&OP_join, &&OP_getcpbyname, &&OP_indexat, &&OP_indexnat, &&OP_unipropcode, &&OP_unipvalcode, &&OP_hasuniprop, &&OP_hasunipropc, &&OP_chars, &&OP_chr, &&OP_ordfirst, &&OP_ordat, &&OP_rindexfrom, &&OP_escape, &&OP_flip, &&OP_setbuffersize_fh, &&OP_iscclass, &&OP_findcclass, &&OP_findnotcclass, &&OP_nfafromstatelist, &&OP_nfarunproto, &&OP_nfarunalt, &&OP_radix, &&OP_encode, &&OP_decode, &&OP_istrue_s, &&OP_isfalse_s, &&OP_null, &&OP_isnull, &&OP_ifnonnull, &&OP_findmeth, &&OP_findmeth_s, &&OP_can, &&OP_can_s, &&OP_create, &&OP_clone, &&OP_isconcrete, &&OP_rebless, &&OP_istype, &&OP_objprimspec, &&OP_gethow, &&OP_getwhat, &&OP_getwho, &&OP_setwho, &&OP_reprname, &&OP_getwhere, &&OP_eqaddr, &&OP_bindattr_i, &&OP_bindattr_n, &&OP_bindattr_s, &&OP_bindattr_o, &&OP_bindattrs_i, &&OP_bindattrs_n, &&OP_bindattrs_s, &&OP_bindattrs_o, &&OP_getattr_i, &&OP_getattr_n, &&OP_getattr_s, &&OP_getattr_o, &&OP_getattrs_i, &&OP_getattrs_n, &&OP_getattrs_s, &&OP_getattrs_o, &&OP_attrinited, &&OP_box_i, &&OP_box_n, &&OP_box_s, &&OP_unbox_i, &&OP_unbox_n, &&OP_unbox_s, &&OP_atpos_i, &&OP_atpos_n, &&OP_atpos_s, &&OP_atpos_o, &&OP_bindpos_i, &&OP_bindpos_n, &&OP_bindpos_s, &&OP_bindpos_o, &&OP_push_i, &&OP_push_n, &&OP_push_s, &&OP_push_o, &&OP_pop_i, &&OP_pop_n, &&OP_pop_s, &&OP_pop_o, &&OP_shift_i, &&OP_shift_n, &&OP_shift_s, &&OP_shift_o, &&OP_unshift_i, &&OP_unshift_n, &&OP_unshift_s, &&OP_unshift_o, &&OP_splice, &&OP_setelemspos, &&OP_existspos, &&OP_atkey_i, &&OP_atkey_n, &&OP_atkey_s, &&OP_atkey_o, &&OP_bindkey_i, &&OP_bindkey_n, &&OP_bindkey_s, &&OP_bindkey_o, &&OP_existskey, &&OP_deletekey, &&OP_elems, &&OP_knowhow, &&OP_knowhowattr, &&OP_newtype, &&OP_composetype, &&OP_setmethcache, &&OP_setmethcacheauth, &&OP_settypecache, &&OP_settypecheckmode, &&OP_setboolspec, &&OP_istrue, &&OP_isfalse, &&OP_bootint, &&OP_bootnum, &&OP_bootstr, &&OP_bootarray, &&OP_bootintarray, &&OP_bootnumarray, &&OP_bootstrarray, &&OP_boothash, &&OP_isint, &&OP_isnum, &&OP_isstr, &&OP_islist, &&OP_ishash, &&OP_sethllconfig, &&OP_hllboxtype_i, &&OP_hllboxtype_n, &&OP_hllboxtype_s, &&OP_hlllist, &&OP_hllhash, &&OP_getcomp, &&OP_bindcomp, &&OP_getcurhllsym, &&OP_bindcurhllsym, &&OP_gethllsym, &&OP_bindhllsym, &&OP_settypehll, &&OP_settypehllrole, &&OP_hllize, &&OP_hllizefor, &&OP_usecompileehllconfig, &&OP_usecompilerhllconfig, &&OP_iter, &&OP_iterkey_s, &&OP_iterval, &&OP_getcodename, &&OP_iscoderef, &&OP_getcodeobj, &&OP_setcodeobj, &&OP_setcodename, &&OP_forceouterctx, &&OP_setinvokespec, &&OP_isinvokable, &&OP_freshcoderef, &&OP_markcodestatic, &&OP_markcodestub, &&OP_getstaticcode, &&OP_getcodecuid, &&OP_setdispatcher, &&OP_takedispatcher, &&OP_assign, &&OP_assignunchecked, &&OP_iscont, &&OP_decont, &&OP_setcontspec, &&OP_sha1, &&OP_createsc, &&OP_scsetobj, &&OP_scsetcode, &&OP_scgetobj, &&OP_scgethandle, &&OP_scgetobjidx, &&OP_scsetdesc, &&OP_scobjcount, &&OP_setobjsc, &&OP_getobjsc, &&OP_serialize, &&OP_deserialize, &&OP_wval, &&OP_wval_wide, &&OP_scwbdisable, &&OP_scwbenable, &&OP_pushcompsc, &&OP_popcompsc, &&OP_scgetdesc, &&OP_loadbytecode, &&OP_masttofile, &&OP_masttocu, &&OP_iscompunit, &&OP_compunitmainline, &&OP_compunitcodes, &&OP_ctx, &&OP_ctxouter, &&OP_ctxcaller, &&OP_ctxlexpad, &&OP_curcode, &&OP_callercode, &&OP_add_I, &&OP_sub_I, &&OP_mul_I, &&OP_div_I, &&OP_mod_I, &&OP_neg_I, &&OP_abs_I, &&OP_cmp_I, &&OP_eq_I, &&OP_ne_I, &&OP_lt_I, &&OP_le_I, &&OP_gt_I, &&OP_ge_I, &&OP_bor_I, &&OP_bxor_I, &&OP_band_I, &&OP_bnot_I, &&OP_blshift_I, &&OP_brshift_I, &&OP_pow_I, &&OP_gcd_I, &&OP_lcm_I, &&OP_expmod_I, &&OP_isprime_I, &&OP_rand_I, &&OP_coerce_In, &&OP_coerce_Is, &&OP_coerce_nI, &&OP_coerce_sI, &&OP_isbig_I, &&OP_bool_I, &&OP_base_I, &&OP_radix_I, &&OP_div_In, &&OP_copy_f, &&OP_append_f, &&OP_rename_f, &&OP_delete_f, &&OP_chmod_f, &&OP_exists_f, &&OP_mkdir, &&OP_rmdir, &&OP_open_dir, &&OP_read_dir, &&OP_close_dir, &&OP_open_fh, &&OP_close_fh, &&OP_DEPRECATED_23, &&OP_DEPRECATED_27, &&OP_DEPRECATED_28, &&OP_DEPRECATED_18, &&OP_seek_fh, &&OP_lock_fh, &&OP_unlock_fh, &&OP_sync_fh, &&OP_trunc_fh, &&OP_eof_fh, &&OP_getstdin, &&OP_getstdout, &&OP_getstderr, &&OP_connect_sk, &&OP_socket, &&OP_bind_sk, &&OP_DEPRECATED_24, &&OP_accept_sk, &&OP_decodetocodes, &&OP_encodefromcodes, &&OP_DEPRECATED_17, &&OP_print, &&OP_say, &&OP_DEPRECATED_22, &&OP_tell_fh, &&OP_stat, &&OP_tryfindmeth, &&OP_tryfindmeth_s, &&OP_chdir, &&OP_srand, &&OP_rand_i, &&OP_rand_n, &&OP_time_i, &&OP_sleep, &&OP_newthread, &&OP_threadjoin, &&OP_time_n, &&OP_exit, &&OP_DEPRECATED_30, &&OP_cwd, &&OP_clargs, &&OP_getenvhash, &&OP_loadlib, &&OP_freelib, &&OP_findsym, &&OP_dropsym, &&OP_loadext, &&OP_backendconfig, &&OP_getlexouter, &&OP_getlexrel, &&OP_getlexreldyn, &&OP_getlexrelcaller, &&OP_getlexcaller, &&OP_bitand_s, &&OP_bitor_s, &&OP_bitxor_s, &&OP_isnanorinf, &&OP_inf, &&OP_neginf, &&OP_nan, &&OP_getpid, &&OP_DEPRECATED_29, &&OP_filereadable, &&OP_filewritable, &&OP_fileexecutable, &&OP_DEPRECATED_19, &&OP_capturenamedshash, &&OP_read_fhb, &&OP_write_fhb, &&OP_replace, &&OP_newexception, &&OP_permit, &&OP_backtrace, &&OP_symlink, &&OP_link, &&OP_gethostname, &&OP_exreturnafterunwind, &&OP_DEPRECATED_13, &&OP_continuationreset, &&OP_continuationcontrol, &&OP_continuationinvoke, &&OP_randscale_n, &&OP_uniisblock, &&OP_assertparamcheck, &&OP_hintfor, &&OP_paramnamesused, &&OP_getuniname, &&OP_getuniprop_int, &&OP_getuniprop_bool, &&OP_getuniprop_str, &&OP_matchuniprop, &&OP_nativecallbuild, &&OP_nativecallinvoke, &&OP_nativecallrefresh, &&OP_threadrun, &&OP_threadid, &&OP_threadyield, &&OP_currentthread, &&OP_lock, &&OP_unlock, &&OP_semacquire, &&OP_semtryacquire, &&OP_semrelease, &&OP_getlockcondvar, &&OP_condwait, &&OP_condsignalone, &&OP_condsignalall, &&OP_queuepoll, &&OP_setmultispec, &&OP_ctxouterskipthunks, &&OP_ctxcallerskipthunks, &&OP_timer, &&OP_cancel, &&OP_signal, &&OP_watchfile, &&OP_asyncconnect, &&OP_asynclisten, &&OP_DEPRECATED_14, &&OP_asyncwritebytes, &&OP_DEPRECATED_16, &&OP_asyncreadbytes, &&OP_getlexstatic_o, &&OP_getlexperinvtype_o, &&OP_execname, &&OP_const_i64_16, &&OP_const_i64_32, &&OP_isnonnull, &&OP_param_rn2_i, &&OP_param_rn2_n, &&OP_param_rn2_s, &&OP_param_rn2_o, &&OP_param_on2_i, &&OP_param_on2_n, &&OP_param_on2_s, &&OP_param_on2_o, &&OP_osrpoint, &&OP_nativecallcast, &&OP_spawnprocasync, &&OP_killprocasync, &&OP_startprofile, &&OP_endprofile, &&OP_objectid, &&OP_settypefinalize, &&OP_force_gc, &&OP_nativecallglobal, &&OP_DEPRECATED_32, &&OP_setparameterizer, &&OP_parameterizetype, &&OP_typeparameterized, &&OP_typeparameters, &&OP_typeparameterat, &&OP_readlink, &&OP_lstat, &&OP_iscont_i, &&OP_iscont_n, &&OP_iscont_s, &&OP_assign_i, &&OP_assign_n, &&OP_assign_s, &&OP_decont_i, &&OP_decont_n, &&OP_decont_s, &&OP_getrusage, &&OP_threadlockcount, &&OP_DEPRECATED_4, &&OP_getlexref_i, &&OP_getlexref_n, &&OP_getlexref_s, &&OP_getlexref_ni, &&OP_getlexref_nn, &&OP_getlexref_ns, &&OP_atposref_i, &&OP_atposref_n, &&OP_atposref_s, &&OP_getattrref_i, &&OP_getattrref_n, &&OP_getattrref_s, &&OP_getattrsref_i, &&OP_getattrsref_n, &&OP_getattrsref_s, &&OP_nativecallsizeof, &&OP_encodenorm, &&OP_normalizecodes, &&OP_strfromcodes, &&OP_strtocodes, &&OP_getcodelocation, &&OP_eqatim_s, &&OP_ordbaseat, &&OP_neverrepossess, &&OP_scdisclaim, &&OP_DEPRECATED_31, &&OP_atpos2d_i, &&OP_atpos2d_n, &&OP_atpos2d_s, &&OP_atpos2d_o, &&OP_atpos3d_i, &&OP_atpos3d_n, &&OP_atpos3d_s, &&OP_atpos3d_o, &&OP_atposnd_i, &&OP_atposnd_n, &&OP_atposnd_s, &&OP_atposnd_o, &&OP_bindpos2d_i, &&OP_bindpos2d_n, &&OP_bindpos2d_s, &&OP_bindpos2d_o, &&OP_bindpos3d_i, &&OP_bindpos3d_n, &&OP_bindpos3d_s, &&OP_bindpos3d_o, &&OP_bindposnd_i, &&OP_bindposnd_n, &&OP_bindposnd_s, &&OP_bindposnd_o, &&OP_dimensions, &&OP_setdimensions, &&OP_numdimensions, &&OP_ctxcode, &&OP_isrwcont, &&OP_fc, &&OP_DEPRECATED_25, &&OP_DEPRECATED_21, &&OP_encoderep, &&OP_istty_fh, &&OP_multidimref_i, &&OP_multidimref_n, &&OP_multidimref_s, &&OP_fileno_fh, &&OP_asyncudp, &&OP_DEPRECATED_15, &&OP_asyncwritebytesto, &&OP_objprimbits, &&OP_objprimunsigned, &&OP_DEPRECATED_5, &&OP_DEPRECATED_6, &&OP_DEPRECATED_7, &&OP_DEPRECATED_8, &&OP_getlexref_i32, &&OP_getlexref_i16, &&OP_getlexref_i8, &&OP_getlexref_n32, &&OP_box_u, &&OP_unbox_u, &&OP_coerce_iu, &&OP_coerce_ui, &&OP_coerce_nu, &&OP_coerce_un, &&OP_decont_u, &&OP_DEPRECATED_9, &&OP_DEPRECATED_10, &&OP_DEPRECATED_11, &&OP_DEPRECATED_12, &&OP_getlexref_u, &&OP_getlexref_u32, &&OP_getlexref_u16, &&OP_getlexref_u8, &&OP_param_rp_u, &&OP_param_op_u, &&OP_param_rn_u, &&OP_param_on_u, &&OP_param_rn2_u, &&OP_param_on2_u, &&OP_stat_time, &&OP_lstat_time, &&OP_setdebugtypename, &&OP_loadbytecodebuffer, &&OP_loadbytecodefh, &&OP_throwpayloadlex, &&OP_throwpayloadlexcaller, &&OP_lastexpayload, &&OP_cancelnotify, &&OP_decoderconfigure, &&OP_decodersetlineseps, &&OP_decoderaddbytes, &&OP_decodertakechars, &&OP_decodertakeallchars, &&OP_decodertakeavailablechars, &&OP_decodertakeline, &&OP_decoderbytesavailable, &&OP_decodertakebytes, &&OP_decoderempty, &&OP_indexingoptimized, &&OP_captureinnerlex, &&OP_unicmp_s, &&OP_setdispatcherfor, &&OP_getstrfromname, &&OP_indexic_s, &&OP_getport_sk, &&OP_cpucores, &&OP_eqaticim_s, &&OP_indexicim_s, &&OP_decodertakecharseof, &&OP_indexim_s, &&OP_cas_o, &&OP_cas_i, &&OP_atomicinc_i, &&OP_atomicdec_i, &&OP_atomicadd_i, &&OP_atomicload_o, &&OP_atomicload_i, &&OP_atomicstore_o, &&OP_atomicstore_i, &&OP_barrierfull, &&OP_coveragecontrol, &&OP_nativeinvoke_v, &&OP_nativeinvoke_i, &&OP_nativeinvoke_n, &&OP_nativeinvoke_s, &&OP_nativeinvoke_o, &&OP_getarg_i, &&OP_getarg_n, &&OP_getarg_s, &&OP_getarg_o, &&OP_coerce_II, &&OP_encoderepconf, &&OP_encodeconf, &&OP_decodeconf, &&OP_decoderepconf, &&OP_getppid, &&OP_sp_guard, &&OP_sp_guardconc, &&OP_sp_guardtype, &&OP_sp_guardsf, &&OP_sp_guardsfouter, &&OP_sp_rebless, &&OP_sp_resolvecode, &&OP_sp_decont, &&OP_sp_getlex_o, &&OP_sp_getlex_ins, &&OP_sp_getlex_no, &&OP_sp_getarg_o, &&OP_sp_getarg_i, &&OP_sp_getarg_n, &&OP_sp_getarg_s, &&OP_sp_fastinvoke_v, &&OP_sp_fastinvoke_i, &&OP_sp_fastinvoke_n, &&OP_sp_fastinvoke_s, &&OP_sp_fastinvoke_o, &&OP_sp_paramnamesused, &&OP_sp_getspeshslot, &&OP_sp_findmeth, &&OP_sp_fastcreate, &&OP_sp_get_o, &&OP_sp_get_i64, &&OP_sp_get_i32, &&OP_sp_get_i16, &&OP_sp_get_i8, &&OP_sp_get_n, &&OP_sp_get_s, &&OP_sp_bind_o, &&OP_sp_bind_i64, &&OP_sp_bind_i32, &&OP_sp_bind_i16, &&OP_sp_bind_i8, &&OP_sp_bind_n, &&OP_sp_bind_s, &&OP_sp_p6oget_o, &&OP_sp_p6ogetvt_o, &&OP_sp_p6ogetvc_o, &&OP_sp_p6oget_i, &&OP_sp_p6oget_n, &&OP_sp_p6oget_s, &&OP_sp_p6obind_o, &&OP_sp_p6obind_i, &&OP_sp_p6obind_n, &&OP_sp_p6obind_s, &&OP_sp_deref_get_i64, &&OP_sp_deref_get_n, &&OP_sp_deref_bind_i64, &&OP_sp_deref_bind_n, &&OP_sp_getlexvia_o, &&OP_sp_getlexvia_ins, &&OP_sp_jit_enter, &&OP_sp_boolify_iter, &&OP_sp_boolify_iter_arr, &&OP_sp_boolify_iter_hash, &&OP_sp_cas_o, &&OP_sp_atomicload_o, &&OP_sp_atomicstore_o, &&OP_prof_enter, &&OP_prof_enterspesh, &&OP_prof_enterinline, &&OP_prof_enternative, &&OP_prof_exit, &&OP_prof_allocated, &&OP_ctw_check, &&OP_coverage_log, &&OP_breakpoint, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP, &&OP_CALL_EXTOP }; MoarVM-2018.03/src/core/oplist0000644000175000017510000012501013252330426016156 0ustar samanthasamantha# This is the authoritative list of MoarVM instructions. # # Changes to this file need to be followed by a call to # tools/update_ops.p6 to update various auto-generated files. # # IMPORTANT NOTE: MoarVM is meant to be able to read bytecode files # from some number of versions back. This means that new ops should, # in general, always be added *at the end* of this file (but before # spesh ops), so they get new numbers. Similarly, do not remove an # op; rename it DEPRECATED_n (where n is unique for each one). # Otherwise the numbering of those after it will be broken. The # alternative is writing a bunch of very boring mapping code and # rendering old bytecode impossible to simply run from the mmap'd file. # # The exception to this rule is the spesh ops, which must come at the # very end of the file, and since they are never emitted into bytecode # files (the specializer inserts them) can be renumbered any time. # # Each entry specifies an opname, an optional annotation used by the # bytecode validator as well as the op arguments: # # [opname] [annotation?] [args...] # # A basic annotation is a single char prefixed by '.', eg '.r' # for return ops. # # Using a ':' marks the beginning of an op sequence that is followed # by several '.' annoted ops, eg ':j' for a jumplist that is followed # by '.j' annotated goto ops. # # Using a '+' marks the beginning and '-' the end of a block that may # only contain matching '*' annotated ops, eg '+a' for prepargs and # '-a' for invoke_o with ops like arg_i or arg_o annotated as '*a' # inbetween. Note that '*' ops must not appear outside such blocks. # # A number of adverbs may follow an operation: # * :pure means that the op has no side-effects and so can safely be # thrown away if the result is unused # * :logged means type or value logging for specialization happens at this # op # * :deoptonepoint means that we may deoptimize (fall back to slow-path code) # after this instruction, but just locally within the current frame # * :predeoptonepoint means that we may deoptimize (fall back to slow-path # code) before this instruction, but just locally within the current frame # * :deoptallpoint means that we may globally deoptimize (this goes only on an # invoke; the callsite address will be rewritten) # * :noinline means it is never safe to inline this op # * :invokish means the op may invoke (used by the JIT) # * :throwish means the op may throw (used by the JIT) # * :useshll means that the op uses per-HLL config no_op const_i8 w(int8) int8 :pure const_i16 w(int16) int16 :pure const_i32 w(int32) int32 :pure const_i64 w(int64) int64 :pure const_n32 w(num32) num32 :pure const_n64 w(num64) num64 :pure const_s w(str) str :pure set w(`1) r(`1) :pure extend_u8 w(uint64) r(uint8) :pure extend_u16 w(uint64) r(uint16) :pure extend_u32 w(uint64) r(uint32) :pure extend_i8 w(int64) r(int8) :pure extend_i16 w(int64) r(int16) :pure extend_i32 w(int64) r(int32) :pure trunc_u8 w(uint8) r(uint64) :pure trunc_u16 w(uint16) r(uint64) :pure trunc_u32 w(uint32) r(uint64) :pure trunc_i8 w(int8) r(int64) :pure trunc_i16 w(int16) r(int64) :pure trunc_i32 w(int32) r(int64) :pure extend_n32 w(num64) r(num32) :pure trunc_n32 w(num32) r(num64) :pure goto .j ins if_i r(int64) ins unless_i r(int64) ins if_n r(num64) ins unless_n r(num64) ins if_s r(str) ins unless_s r(str) ins if_s0 r(str) ins unless_s0 r(str) ins if_o r(obj) ins :invokish unless_o r(obj) ins :invokish jumplist :j int64 r(int64) getlex w(`1) rl(`1) :pure :deoptonepoint :logged bindlex wl(`1) r(`1) getlex_ni w(int64) str :pure :noinline getlex_nn w(num64) str :pure :noinline getlex_ns w(str) str :pure :noinline getlex_no w(obj) str :pure :deoptonepoint :logged :noinline bindlex_ni str r(int64) :noinline bindlex_nn str r(num64) :noinline bindlex_ns str r(str) :noinline bindlex_no str r(obj) :noinline getlex_ng w(obj) r(str) :pure :noinline :useshll bindlex_ng r(str) r(obj) :noinline :useshll getdynlex w(obj) r(str) :pure :noinline :useshll binddynlex r(str) r(obj) :noinline setlexvalue r(obj) str r(obj) int16 lexprimspec w(int64) r(obj) r(str) :pure return_i .r r(int64) :useshll return_n .r r(num64) :useshll return_s .r r(str) :useshll return_o .r r(obj) return .r eq_i w(int64) r(int64) r(int64) :pure ne_i w(int64) r(int64) r(int64) :pure lt_i w(int64) r(int64) r(int64) :pure le_i w(int64) r(int64) r(int64) :pure gt_i w(int64) r(int64) r(int64) :pure ge_i w(int64) r(int64) r(int64) :pure cmp_i w(int64) r(int64) r(int64) :pure add_i w(int64) r(int64) r(int64) :pure sub_i w(int64) r(int64) r(int64) :pure mul_i w(int64) r(int64) r(int64) :pure div_i w(int64) r(int64) r(int64) :pure div_u w(uint64) r(uint64) r(uint64) :pure mod_i w(int64) r(int64) r(int64) :pure mod_u w(uint64) r(uint64) r(uint64) :pure neg_i w(int64) r(int64) :pure abs_i w(int64) r(int64) :pure inc_i w(int64) inc_u w(uint64) dec_i w(int64) dec_u w(uint64) band_i w(int64) r(int64) r(int64) :pure bor_i w(int64) r(int64) r(int64) :pure bxor_i w(int64) r(int64) r(int64) :pure bnot_i w(int64) r(int64) :pure blshift_i w(int64) r(int64) r(int64) :pure brshift_i w(int64) r(int64) r(int64) :pure pow_i w(int64) r(int64) r(int64) :pure not_i w(int64) r(int64) :pure gcd_i w(int64) r(int64) r(int64) :pure lcm_i w(int64) r(int64) r(int64) :pure eq_n w(int64) r(num64) r(num64) :pure ne_n w(int64) r(num64) r(num64) :pure lt_n w(int64) r(num64) r(num64) :pure le_n w(int64) r(num64) r(num64) :pure gt_n w(int64) r(num64) r(num64) :pure ge_n w(int64) r(num64) r(num64) :pure cmp_n w(int64) r(num64) r(num64) :pure add_n w(num64) r(num64) r(num64) :pure sub_n w(num64) r(num64) r(num64) :pure mul_n w(num64) r(num64) r(num64) :pure div_n w(num64) r(num64) r(num64) :pure mod_n w(num64) r(num64) r(num64) :pure neg_n w(num64) r(num64) :pure abs_n w(num64) r(num64) :pure pow_n w(num64) r(num64) r(num64) :pure ceil_n w(num64) r(num64) :pure floor_n w(num64) r(num64) :pure sin_n w(num64) r(num64) :pure asin_n w(num64) r(num64) :pure cos_n w(num64) r(num64) :pure acos_n w(num64) r(num64) :pure tan_n w(num64) r(num64) :pure atan_n w(num64) r(num64) :pure atan2_n w(num64) r(num64) r(num64) :pure sec_n w(num64) r(num64) :pure asec_n w(num64) r(num64) :pure sinh_n w(num64) r(num64) :pure cosh_n w(num64) r(num64) :pure tanh_n w(num64) r(num64) :pure sech_n w(num64) r(num64) :pure sqrt_n w(num64) r(num64) :pure log_n w(num64) r(num64) :pure exp_n w(num64) r(num64) :pure coerce_in w(num64) r(int64) :pure coerce_ni w(int64) r(num64) :pure coerce_is w(str) r(int64) :pure coerce_ns w(str) r(num64) :pure coerce_si w(int64) r(str) :pure coerce_sn w(num64) r(str) :pure smrt_numify w(num64) r(obj) :pure :invokish smrt_strify w(str) r(obj) :pure :invokish prepargs +a callsite :predeoptonepoint arg_i *a int16 r(int64) arg_n *a int16 r(num64) arg_s *a int16 r(str) arg_o *a int16 r(obj) argconst_i *a int16 int64 argconst_n *a int16 num64 argconst_s *a int16 str invoke_v -a r(obj) :deoptallpoint invoke_i -a w(int64) r(obj) :deoptallpoint invoke_n -a w(num64) r(obj) :deoptallpoint invoke_s -a w(str) r(obj) :deoptallpoint invoke_o -a w(obj) r(obj) :deoptallpoint :deoptonepoint :logged checkarity int16 int16 param_rp_i .p w(int64) int16 :pure :noinline param_rp_n .p w(num64) int16 :pure :noinline param_rp_s .p w(str) int16 :pure :noinline param_rp_o .p w(obj) int16 :pure :noinline :useshll param_op_i .p w(int64) int16 ins :pure :noinline param_op_n .p w(num64) int16 ins :pure :noinline param_op_s .p w(str) int16 ins :pure :noinline param_op_o .p w(obj) int16 ins :pure :noinline :useshll param_rn_i w(int64) str :noinline param_rn_n w(num64) str :noinline param_rn_s w(str) str :noinline param_rn_o w(obj) str :noinline :useshll param_on_i w(int64) str ins :noinline param_on_n w(num64) str ins :noinline param_on_s w(str) str ins :noinline param_on_o w(obj) str ins :noinline :useshll param_sp .p w(obj) int16 :pure :noinline :useshll param_sn w(obj) :noinline :useshll getcode w(obj) coderef :pure caller w(obj) r(int64) :pure :noinline capturelex r(obj) :noinline takeclosure w(obj) r(obj) :noinline exception w(obj) bindexmessage r(obj) r(str) bindexpayload r(obj) r(obj) bindexcategory r(obj) r(int64) getexmessage w(str) r(obj) :pure getexpayload w(obj) r(obj) :pure getexcategory w(int64) r(obj) :pure throwdyn w(obj) r(obj) :throwish throwlex w(obj) r(obj) :throwish throwlexotic w(obj) r(obj) :throwish throwcatdyn w(obj) int64 :throwish throwcatlex w(obj) int64 :throwish throwcatlexotic w(obj) int64 :throwish die w(obj) r(str) :throwish rethrow r(obj) :throwish resume r(obj) :throwish takehandlerresult w(obj) DEPRECATED_33 w(obj) ins DEPRECATED_34 w(obj) r(obj) backtracestrings w(obj) r(obj) :pure usecapture w(obj) :noinline savecapture w(obj) :noinline captureposelems w(int64) r(obj) :pure captureposarg w(obj) r(obj) r(int64) :pure :useshll captureposarg_i w(int64) r(obj) r(int64) :pure captureposarg_n w(num64) r(obj) r(int64) :pure captureposarg_s w(str) r(obj) r(int64) :pure captureposprimspec w(int64) r(obj) r(int64) :pure captureexistsnamed w(int64) r(obj) r(str) :pure capturehasnameds w(int64) r(obj) :pure :useshll invokewithcapture w(obj) r(obj) r(obj) :invokish multicacheadd w(obj) r(obj) r(obj) r(obj) multicachefind w(obj) r(obj) r(obj) null_s w(str) :pure isnull_s w(int64) r(str) :pure eq_s w(int64) r(str) r(str) :pure ne_s w(int64) r(str) r(str) :pure gt_s w(int64) r(str) r(str) :pure ge_s w(int64) r(str) r(str) :pure lt_s w(int64) r(str) r(str) :pure le_s w(int64) r(str) r(str) :pure cmp_s w(int64) r(str) r(str) :pure eqat_s w(int64) r(str) r(str) r(int64) :pure eqatic_s w(int64) r(str) r(str) r(int64) :pure haveat_s w(int64) r(str) r(int64) r(int64) r(str) r(int64) :pure concat_s w(str) r(str) r(str) :pure repeat_s w(str) r(str) r(int64) :pure substr_s w(str) r(str) r(int64) r(int64) :pure index_s w(int64) r(str) r(str) r(int64) :pure # graphs_s will be DEPRECATED! graphs_s w(int64) r(str) :pure codes_s w(int64) r(str) :pure getcp_s w(int64) r(str) r(int64) :pure indexcp_s w(int64) r(str) r(int64) :pure uc w(str) r(str) :pure lc w(str) r(str) :pure tc w(str) r(str) :pure split w(obj) r(str) r(str) :pure join w(str) r(str) r(obj) :pure getcpbyname w(int64) r(str) :pure indexat r(str) r(int64) str ins indexnat r(str) r(int64) str ins unipropcode w(int64) r(str) :pure unipvalcode w(int64) r(int64) r(str) :pure hasuniprop w(int64) r(str) r(int64) r(int64) r(int64) :pure hasunipropc w(int64) r(str) r(int64) int16 int16 :pure chars w(int64) r(str) :pure chr w(str) r(int64) :pure ordfirst w(int64) r(str) :pure ordat w(int64) r(str) r(int64) :pure rindexfrom w(int64) r(str) r(str) r(int64) :pure escape w(str) r(str) :pure flip w(str) r(str) :pure setbuffersize_fh r(obj) r(int64) iscclass w(int64) r(int64) r(str) r(int64) :pure findcclass w(int64) r(int64) r(str) r(int64) r(int64) :pure findnotcclass w(int64) r(int64) r(str) r(int64) r(int64) :pure nfafromstatelist w(obj) r(obj) r(obj) nfarunproto w(obj) r(obj) r(str) r(int64) nfarunalt r(obj) r(str) r(int64) r(obj) r(obj) r(obj) radix w(obj) r(int64) r(str) r(int64) r(int64) :useshll encode w(obj) r(str) r(str) r(obj) decode w(str) r(obj) r(str) istrue_s w(int64) r(str) :pure isfalse_s w(int64) r(str) :pure null w(obj) :pure isnull w(int64) r(obj) :pure ifnonnull r(obj) ins findmeth w(obj) r(obj) str :pure :invokish findmeth_s w(obj) r(obj) r(str) :pure :invokish can w(int64) r(obj) str :pure :invokish can_s w(int64) r(obj) r(str) :pure :invokish create w(obj) r(obj) :pure clone w(obj) r(obj) :pure isconcrete w(int64) r(obj) :pure rebless w(obj) r(obj) r(obj) :deoptonepoint istype w(int64) r(obj) r(obj) :pure :invokish objprimspec w(int64) r(obj) :pure gethow w(obj) r(obj) :pure getwhat w(obj) r(obj) :pure getwho w(obj) r(obj) :pure setwho w(obj) r(obj) r(obj) reprname w(str) r(obj) :pure getwhere w(int64) r(obj) :pure eqaddr w(int64) r(obj) r(obj) :pure bindattr_i r(obj) r(obj) str r(int64) int16 bindattr_n r(obj) r(obj) str r(num64) int16 bindattr_s r(obj) r(obj) str r(str) int16 bindattr_o r(obj) r(obj) str r(obj) int16 bindattrs_i r(obj) r(obj) r(str) r(int64) bindattrs_n r(obj) r(obj) r(str) r(num64) bindattrs_s r(obj) r(obj) r(str) r(str) bindattrs_o r(obj) r(obj) r(str) r(obj) getattr_i w(int64) r(obj) r(obj) str int16 getattr_n w(num64) r(obj) r(obj) str int16 getattr_s w(str) r(obj) r(obj) str int16 getattr_o w(obj) r(obj) r(obj) str int16 :deoptonepoint :logged getattrs_i w(int64) r(obj) r(obj) r(str) getattrs_n w(num64) r(obj) r(obj) r(str) getattrs_s w(str) r(obj) r(obj) r(str) getattrs_o w(obj) r(obj) r(obj) r(str) :deoptonepoint :logged attrinited w(int64) r(obj) r(obj) r(str) box_i w(obj) r(int64) r(obj) :pure box_n w(obj) r(num64) r(obj) :pure box_s w(obj) r(str) r(obj) :pure unbox_i w(int64) r(obj) :pure unbox_n w(num64) r(obj) :pure unbox_s w(str) r(obj) :pure atpos_i w(int64) r(obj) r(int64) atpos_n w(num64) r(obj) r(int64) atpos_s w(str) r(obj) r(int64) atpos_o w(obj) r(obj) r(int64) bindpos_i r(obj) r(int64) r(int64) bindpos_n r(obj) r(int64) r(num64) bindpos_s r(obj) r(int64) r(str) bindpos_o r(obj) r(int64) r(obj) push_i r(obj) r(int64) push_n r(obj) r(num64) push_s r(obj) r(str) push_o r(obj) r(obj) pop_i w(int64) r(obj) pop_n w(num64) r(obj) pop_s w(str) r(obj) pop_o w(obj) r(obj) shift_i w(int64) r(obj) shift_n w(num64) r(obj) shift_s w(str) r(obj) shift_o w(obj) r(obj) unshift_i r(obj) r(int64) unshift_n r(obj) r(num64) unshift_s r(obj) r(str) unshift_o r(obj) r(obj) splice r(obj) r(obj) r(int64) r(int64) setelemspos r(obj) r(int64) existspos w(int64) r(obj) r(int64) :pure atkey_i w(int64) r(obj) r(str) atkey_n w(num64) r(obj) r(str) atkey_s w(str) r(obj) r(str) atkey_o w(obj) r(obj) r(str) bindkey_i r(obj) r(str) r(int64) bindkey_n r(obj) r(str) r(num64) bindkey_s r(obj) r(str) r(str) bindkey_o r(obj) r(str) r(obj) existskey w(int64) r(obj) r(str) :pure deletekey r(obj) r(str) elems w(int64) r(obj) :pure knowhow w(obj) :pure knowhowattr w(obj) :pure newtype w(obj) r(obj) r(str) composetype w(obj) r(obj) r(obj) setmethcache r(obj) r(obj) setmethcacheauth r(obj) r(int64) settypecache r(obj) r(obj) settypecheckmode r(obj) r(int64) setboolspec r(obj) r(int64) r(obj) istrue w(int64) r(obj) :invokish isfalse w(int64) r(obj) :invokish bootint w(obj) :pure bootnum w(obj) :pure bootstr w(obj) :pure bootarray w(obj) :pure bootintarray w(obj) :pure bootnumarray w(obj) :pure bootstrarray w(obj) :pure boothash w(obj) :pure isint w(int64) r(obj) :pure isnum w(int64) r(obj) :pure isstr w(int64) r(obj) :pure islist w(int64) r(obj) :pure ishash w(int64) r(obj) :pure sethllconfig r(str) r(obj) hllboxtype_i w(obj) :pure :useshll hllboxtype_n w(obj) :pure :useshll hllboxtype_s w(obj) :pure :useshll hlllist w(obj) :pure :useshll hllhash w(obj) :pure :useshll getcomp w(obj) r(str) :pure bindcomp w(obj) r(str) r(obj) getcurhllsym w(obj) r(str) :pure :useshll bindcurhllsym w(obj) r(str) r(obj) :useshll gethllsym w(obj) r(str) r(str) :pure bindhllsym r(str) r(str) r(obj) settypehll r(obj) r(str) settypehllrole r(obj) r(int64) hllize w(obj) r(obj) :pure :invokish :useshll hllizefor w(obj) r(obj) r(str) :pure :invokish usecompileehllconfig :useshll usecompilerhllconfig :useshll iter w(obj) r(obj) :pure :useshll iterkey_s w(str) r(obj) :pure iterval w(obj) r(obj) :pure getcodename w(str) r(obj) :pure iscoderef w(int64) r(obj) :pure getcodeobj w(obj) r(obj) :pure setcodeobj r(obj) r(obj) setcodename r(obj) r(str) forceouterctx r(obj) r(obj) setinvokespec r(obj) r(obj) r(str) r(obj) isinvokable w(int64) r(obj) :pure freshcoderef w(obj) r(obj) markcodestatic r(obj) markcodestub r(obj) getstaticcode w(obj) r(obj) :pure getcodecuid w(str) r(obj) :pure setdispatcher r(obj) takedispatcher w(obj) assign r(obj) r(obj) :invokish assignunchecked r(obj) r(obj) :invokish iscont w(int64) r(obj) :pure decont w(obj) r(obj) :pure :invokish :deoptonepoint setcontspec r(obj) r(str) r(obj) sha1 w(str) r(str) :pure createsc w(obj) r(str) scsetobj r(obj) r(int64) r(obj) scsetcode r(obj) r(int64) r(obj) scgetobj w(obj) r(obj) r(int64) scgethandle w(str) r(obj) scgetobjidx w(int64) r(obj) r(obj) scsetdesc r(obj) r(str) scobjcount w(int64) r(obj) setobjsc r(obj) r(obj) getobjsc w(obj) r(obj) serialize w(str) r(obj) r(obj) deserialize r(str) r(obj) r(obj) r(obj) r(obj) wval w(obj) int16 int16 :pure wval_wide w(obj) int16 int64 :pure scwbdisable w(int64) scwbenable w(int64) pushcompsc r(obj) popcompsc w(obj) scgetdesc w(str) r(obj) loadbytecode w(str) r(str) :invokish masttofile r(obj) r(obj) r(str) masttocu w(obj) r(obj) r(obj) :invokish iscompunit w(int64) r(obj) :pure compunitmainline w(obj) r(obj) compunitcodes w(obj) r(obj) ctx w(obj) :noinline ctxouter w(obj) r(obj) ctxcaller w(obj) r(obj) ctxlexpad w(obj) r(obj) curcode w(obj) :noinline callercode w(obj) :noinline add_I w(obj) r(obj) r(obj) r(obj) :pure sub_I w(obj) r(obj) r(obj) r(obj) :pure mul_I w(obj) r(obj) r(obj) r(obj) :pure div_I w(obj) r(obj) r(obj) r(obj) :pure mod_I w(obj) r(obj) r(obj) r(obj) :pure neg_I w(obj) r(obj) r(obj) :pure abs_I w(obj) r(obj) r(obj) :pure cmp_I w(int64) r(obj) r(obj) :pure eq_I w(int64) r(obj) r(obj) :pure ne_I w(int64) r(obj) r(obj) :pure lt_I w(int64) r(obj) r(obj) :pure le_I w(int64) r(obj) r(obj) :pure gt_I w(int64) r(obj) r(obj) :pure ge_I w(int64) r(obj) r(obj) :pure bor_I w(obj) r(obj) r(obj) r(obj) :pure bxor_I w(obj) r(obj) r(obj) r(obj) :pure band_I w(obj) r(obj) r(obj) r(obj) :pure bnot_I w(obj) r(obj) r(obj) :pure blshift_I w(obj) r(obj) r(int64) r(obj) :pure brshift_I w(obj) r(obj) r(int64) r(obj) :pure pow_I w(obj) r(obj) r(obj) r(obj) r(obj) :pure gcd_I w(obj) r(obj) r(obj) r(obj) :pure lcm_I w(obj) r(obj) r(obj) r(obj) :pure expmod_I w(obj) r(obj) r(obj) r(obj) r(obj) :pure isprime_I w(int64) r(obj) r(int64) :pure rand_I w(obj) r(obj) r(obj) :pure coerce_In w(num64) r(obj) :pure coerce_Is w(str) r(obj) :pure coerce_nI w(obj) r(num64) r(obj) :pure coerce_sI w(obj) r(str) r(obj) :pure isbig_I w(int64) r(obj) :pure bool_I w(int64) r(obj) :pure base_I w(str) r(obj) r(int64) :pure radix_I w(obj) r(int64) r(str) r(int64) r(int64) r(obj) :pure :useshll div_In w(num64) r(obj) r(obj) :pure copy_f r(str) r(str) append_f r(str) r(str) rename_f r(str) r(str) delete_f r(str) chmod_f r(str) r(int64) exists_f w(int64) r(str) mkdir r(str) r(int64) rmdir r(str) open_dir w(obj) r(str) read_dir w(str) r(obj) close_dir r(obj) open_fh w(obj) r(str) r(str) close_fh r(obj) DEPRECATED_23 w(str) r(obj) r(int64) DEPRECATED_27 w(str) r(str) r(str) DEPRECATED_28 r(str) r(str) r(str) DEPRECATED_18 w(int64) r(obj) r(str) seek_fh r(obj) r(int64) r(int64) lock_fh w(int64) r(obj) r(int64) unlock_fh r(obj) sync_fh r(obj) trunc_fh r(obj) r(int64) eof_fh w(int64) r(obj) getstdin w(obj) :pure getstdout w(obj) :pure getstderr w(obj) :pure connect_sk r(obj) r(str) r(int64) socket w(obj) r(int64) bind_sk r(obj) r(str) r(int64) r(int64) DEPRECATED_24 r(obj) r(str) accept_sk w(obj) r(obj) decodetocodes r(obj) r(str) r(int64) r(obj) encodefromcodes r(obj) r(str) r(obj) DEPRECATED_17 r(obj) r(str) print r(str) say r(str) DEPRECATED_22 w(str) r(obj) tell_fh w(int64) r(obj) stat w(int64) r(str) r(int64) tryfindmeth w(obj) r(obj) str :pure :invokish tryfindmeth_s w(obj) r(obj) r(str) :pure :invokish chdir r(str) srand r(int64) rand_i w(int64) rand_n w(num64) time_i w(int64) sleep r(num64) newthread w(obj) r(obj) r(int64) threadjoin r(obj) time_n w(num64) exit r(int64) DEPRECATED_30 w(int64) r(str) r(str) r(obj) r(obj) r(obj) r(obj) r(int64) cwd w(str) clargs w(obj) :useshll getenvhash w(obj) :useshll loadlib r(str) r(str) freelib r(str) findsym w(obj) r(str) r(str) dropsym r(obj) loadext r(str) r(str) backendconfig w(obj) getlexouter w(obj) r(str) :pure :noinline :useshll getlexrel w(obj) r(obj) r(str) :pure :useshll getlexreldyn w(obj) r(obj) r(str) :pure :useshll getlexrelcaller w(obj) r(obj) r(str) :pure :useshll getlexcaller w(obj) r(str) :pure :noinline :useshll bitand_s w(str) r(str) r(str) :pure bitor_s w(str) r(str) r(str) :pure bitxor_s w(str) r(str) r(str) :pure isnanorinf w(int64) r(num64) :pure inf w(num64) :pure neginf w(num64) :pure nan w(num64) :pure getpid w(int64) :pure DEPRECATED_29 w(int64) r(obj) r(str) r(obj) r(obj) r(obj) r(obj) r(int64) filereadable w(int64) r(str) filewritable w(int64) r(str) fileexecutable w(int64) r(str) DEPRECATED_19 w(int64) r(obj) r(str) capturenamedshash w(obj) r(obj) :pure :useshll read_fhb r(obj) r(obj) r(int64) write_fhb r(obj) r(obj) replace w(str) r(str) r(int64) r(int64) r(str) newexception w(obj) permit r(obj) r(int64) r(int64) backtrace w(obj) r(obj) symlink r(str) r(str) link r(str) r(str) gethostname w(str) exreturnafterunwind r(obj) DEPRECATED_13 w(obj) r(obj) continuationreset w(obj) r(obj) r(obj) :invokish # this op isn't actually invokish, but it requires the cur_op to be set before doing its work continuationcontrol w(obj) r(int64) r(obj) r(obj) :invokish continuationinvoke w(obj) r(obj) r(obj) :invokish randscale_n w(num64) r(num64) :pure uniisblock w(int64) r(str) r(int64) r(str) :pure assertparamcheck r(int64) :noinline :invokish hintfor w(int64) r(obj) r(str) paramnamesused :noinline getuniname w(str) r(int64) getuniprop_int w(int64) r(int64) r(int64) getuniprop_bool w(int64) r(int64) r(int64) getuniprop_str w(str) r(int64) r(int64) matchuniprop w(int64) r(int64) r(int64) r(int64) nativecallbuild w(int64) r(obj) r(str) r(str) r(str) r(obj) r(obj) nativecallinvoke w(obj) r(obj) r(obj) r(obj) nativecallrefresh r(obj) threadrun r(obj) threadid w(int64) r(obj) threadyield currentthread w(obj) lock r(obj) unlock r(obj) semacquire r(obj) semtryacquire w(int64) r(obj) semrelease r(obj) getlockcondvar w(obj) r(obj) r(obj) condwait r(obj) condsignalone r(obj) condsignalall r(obj) queuepoll w(obj) r(obj) setmultispec r(obj) r(obj) r(str) r(str) ctxouterskipthunks w(obj) r(obj) :noinline ctxcallerskipthunks w(obj) r(obj) :noinline timer w(obj) r(obj) r(obj) r(int64) r(int64) r(obj) cancel r(obj) signal w(obj) r(obj) r(obj) r(int64) r(obj) watchfile w(obj) r(obj) r(obj) r(str) r(obj) asyncconnect w(obj) r(obj) r(obj) r(str) r(int64) r(obj) asynclisten w(obj) r(obj) r(obj) r(str) r(int64) r(int64) r(obj) DEPRECATED_14 w(obj) r(obj) r(obj) r(obj) r(str) r(obj) asyncwritebytes w(obj) r(obj) r(obj) r(obj) r(obj) r(obj) DEPRECATED_16 w(obj) r(obj) r(obj) r(obj) r(obj) asyncreadbytes w(obj) r(obj) r(obj) r(obj) r(obj) r(obj) getlexstatic_o w(obj) r(str) :pure :noinline :logged getlexperinvtype_o w(obj) r(str) :pure :noinline :logged execname w(str) const_i64_16 w(int64) int16 :pure const_i64_32 w(int64) int32 :pure isnonnull w(int64) r(obj) :pure param_rn2_i w(int64) str str :noinline param_rn2_n w(num64) str str :noinline param_rn2_s w(str) str str :noinline param_rn2_o w(obj) str str :noinline :useshll param_on2_i w(int64) str str ins :noinline param_on2_n w(num64) str str ins :noinline param_on2_s w(str) str str ins :noinline param_on2_o w(obj) str str ins :noinline :useshll osrpoint :osrpoint nativecallcast w(obj) r(obj) r(obj) r(obj) spawnprocasync w(obj) r(obj) r(obj) r(str) r(obj) r(obj) killprocasync r(obj) r(int64) startprofile r(obj) endprofile w(obj) objectid w(int64) r(obj) settypefinalize r(obj) r(int64) force_gc nativecallglobal w(obj) r(str) r(str) r(obj) r(obj) DEPRECATED_32 w(int64) r(obj) setparameterizer r(obj) r(obj) parameterizetype w(obj) r(obj) r(obj) :invokish typeparameterized w(obj) r(obj) typeparameters w(obj) r(obj) typeparameterat w(obj) r(obj) r(int64) readlink w(str) r(str) lstat w(int64) r(str) r(int64) iscont_i w(int64) r(obj) :pure iscont_n w(int64) r(obj) :pure iscont_s w(int64) r(obj) :pure assign_i r(obj) r(int64) :invokish assign_n r(obj) r(num64) :invokish assign_s r(obj) r(str) :invokish decont_i w(int64) r(obj) :pure :invokish decont_n w(num64) r(obj) :pure :invokish decont_s w(str) r(obj) :pure :invokish getrusage w(obj) :pure threadlockcount w(int64) r(obj) DEPRECATED_4 w(obj) r(str) :pure :noinline getlexref_i w(obj) rl(int64) :pure :noinline getlexref_n w(obj) rl(num64) :pure :noinline getlexref_s w(obj) rl(str) :pure :noinline getlexref_ni w(obj) str :pure :noinline getlexref_nn w(obj) str :pure :noinline getlexref_ns w(obj) str :pure :noinline atposref_i w(obj) r(obj) r(int64) :pure atposref_n w(obj) r(obj) r(int64) :pure atposref_s w(obj) r(obj) r(int64) :pure getattrref_i w(obj) r(obj) r(obj) str int16 :pure getattrref_n w(obj) r(obj) r(obj) str int16 :pure getattrref_s w(obj) r(obj) r(obj) str int16 :pure getattrsref_i w(obj) r(obj) r(obj) r(str) :pure getattrsref_n w(obj) r(obj) r(obj) r(str) :pure getattrsref_s w(obj) r(obj) r(obj) r(str) :pure nativecallsizeof w(int64) r(obj) encodenorm r(str) r(str) r(int64) r(obj) normalizecodes r(obj) r(int64) r(obj) strfromcodes w(str) r(obj) strtocodes r(str) r(int64) r(obj) getcodelocation w(obj) r(obj) :pure eqatim_s w(int64) r(str) r(str) r(int64) :pure ordbaseat w(int64) r(str) r(int64) :pure neverrepossess r(obj) scdisclaim r(obj) DEPRECATED_31 w(obj) atpos2d_i w(int64) r(obj) r(int64) r(int64) :pure atpos2d_n w(num64) r(obj) r(int64) r(int64) :pure atpos2d_s w(str) r(obj) r(int64) r(int64) :pure atpos2d_o w(obj) r(obj) r(int64) r(int64) :pure atpos3d_i w(int64) r(obj) r(int64) r(int64) r(int64) :pure atpos3d_n w(num64) r(obj) r(int64) r(int64) r(int64) :pure atpos3d_s w(str) r(obj) r(int64) r(int64) r(int64) :pure atpos3d_o w(obj) r(obj) r(int64) r(int64) r(int64) :pure atposnd_i w(int64) r(obj) r(obj) :pure atposnd_n w(num64) r(obj) r(obj) :pure atposnd_s w(str) r(obj) r(obj) :pure atposnd_o w(obj) r(obj) r(obj) :pure bindpos2d_i r(obj) r(int64) r(int64) r(int64) bindpos2d_n r(obj) r(int64) r(int64) r(num64) bindpos2d_s r(obj) r(int64) r(int64) r(str) bindpos2d_o r(obj) r(int64) r(int64) r(obj) bindpos3d_i r(obj) r(int64) r(int64) r(int64) r(int64) bindpos3d_n r(obj) r(int64) r(int64) r(int64) r(num64) bindpos3d_s r(obj) r(int64) r(int64) r(int64) r(str) bindpos3d_o r(obj) r(int64) r(int64) r(int64) r(obj) bindposnd_i r(obj) r(obj) r(int64) bindposnd_n r(obj) r(obj) r(num64) bindposnd_s r(obj) r(obj) r(str) bindposnd_o r(obj) r(obj) r(obj) dimensions w(obj) r(obj) setdimensions r(obj) r(obj) numdimensions w(int64) r(obj) :pure ctxcode w(obj) r(obj) isrwcont w(int64) r(obj) :pure fc w(str) r(str) :pure DEPRECATED_25 r(obj) r(obj) DEPRECATED_21 w(str) r(obj) encoderep w(obj) r(str) r(str) r(str) r(obj) istty_fh w(int64) r(obj) :pure multidimref_i w(obj) r(obj) r(obj) :pure multidimref_n w(obj) r(obj) r(obj) :pure multidimref_s w(obj) r(obj) r(obj) :pure fileno_fh w(int64) r(obj) :pure asyncudp w(obj) r(obj) r(obj) r(str) r(int64) r(int64) r(obj) DEPRECATED_15 w(obj) r(obj) r(obj) r(obj) r(str) r(obj) r(str) r(int64) asyncwritebytesto w(obj) r(obj) r(obj) r(obj) r(obj) r(obj) r(str) r(int64) objprimbits w(int64) r(obj) objprimunsigned w(int64) r(obj) DEPRECATED_5 w(obj) r(int32) :pure :noinline DEPRECATED_6 w(obj) r(int16) :pure :noinline DEPRECATED_7 w(obj) r(int8) :pure :noinline DEPRECATED_8 w(obj) r(num32) :pure :noinline getlexref_i32 w(obj) rl(int32) :pure :noinline getlexref_i16 w(obj) rl(int16) :pure :noinline getlexref_i8 w(obj) rl(int8) :pure :noinline getlexref_n32 w(obj) rl(num32) :pure :noinline box_u w(obj) r(uint64) r(obj) :pure unbox_u w(uint64) r(obj) :pure coerce_iu w(uint64) r(int64) :pure coerce_ui w(int64) r(uint64) :pure coerce_nu w(uint64) r(num64) :pure coerce_un w(num64) r(uint64) :pure decont_u w(uint64) r(obj) :pure :invokish DEPRECATED_9 w(obj) r(uint64) :pure :noinline DEPRECATED_10 w(obj) r(uint32) :pure :noinline DEPRECATED_11 w(obj) r(uint16) :pure :noinline DEPRECATED_12 w(obj) r(uint8) :pure :noinline getlexref_u w(obj) rl(uint64) :pure :noinline getlexref_u32 w(obj) rl(uint32) :pure :noinline getlexref_u16 w(obj) rl(uint16) :pure :noinline getlexref_u8 w(obj) rl(uint8) :pure :noinline param_rp_u w(uint64) int16 :pure :noinline param_op_u w(uint64) int16 ins :pure :noinline param_rn_u w(uint64) str :noinline param_on_u w(uint64) str ins :noinline param_rn2_u w(uint64) str str :noinline param_on2_u w(uint64) str str ins :noinline stat_time w(num64) r(str) r(int64) lstat_time w(num64) r(str) r(int64) setdebugtypename r(obj) r(str) loadbytecodebuffer r(obj) :invokish loadbytecodefh r(obj) r(str) :invokish throwpayloadlex w(obj) int64 r(obj) :throwish throwpayloadlexcaller w(obj) int64 r(obj) :throwish lastexpayload w(obj) cancelnotify r(obj) r(obj) r(obj) decoderconfigure r(obj) r(str) r(obj) decodersetlineseps r(obj) r(obj) decoderaddbytes r(obj) r(obj) decodertakechars w(str) r(obj) r(int64) decodertakeallchars w(str) r(obj) decodertakeavailablechars w(str) r(obj) decodertakeline w(str) r(obj) r(int64) r(int64) decoderbytesavailable w(int64) r(obj) :pure decodertakebytes w(obj) r(obj) r(obj) r(int64) decoderempty w(int64) r(obj) :pure indexingoptimized w(str) r(str) :pure captureinnerlex r(obj) :noinline unicmp_s w(int64) r(str) r(str) r(int64) r(int64) r(int64) :pure setdispatcherfor r(obj) r(obj) getstrfromname w(str) r(str) :pure indexic_s w(int64) r(str) r(str) r(int64) :pure getport_sk w(int64) r(obj) cpucores w(int64) :pure eqaticim_s w(int64) r(str) r(str) r(int64) :pure indexicim_s w(int64) r(str) r(str) r(int64) :pure decodertakecharseof w(str) r(obj) r(int64) indexim_s w(int64) r(str) r(str) r(int64) :pure cas_o w(obj) r(obj) r(obj) r(obj) :invokish cas_i w(int64) r(obj) r(int64) r(int64) atomicinc_i w(int64) r(obj) atomicdec_i w(int64) r(obj) atomicadd_i w(int64) r(obj) r(int64) # Following two are *not* :pure (even though just loads); their memory barrier # counts as a side-effect that should be retained. atomicload_o w(obj) r(obj) atomicload_i w(int64) r(obj) atomicstore_o r(obj) r(obj) :invokish atomicstore_i r(obj) r(int64) barrierfull coveragecontrol r(int64) nativeinvoke_v -a r(obj) r(obj) nativeinvoke_i -a w(int64) r(obj) r(obj) nativeinvoke_n -a w(num64) r(obj) r(obj) nativeinvoke_s -a w(str) r(obj) r(obj) nativeinvoke_o -a w(obj) r(obj) r(obj) getarg_i w(int64) r(int16) getarg_n w(num64) r(int16) getarg_s w(str) r(int16) getarg_o w(obj) r(int16) coerce_II w(obj) r(obj) r(obj) :pure encoderepconf w(obj) r(str) r(str) r(str) r(obj) r(int64) encodeconf w(obj) r(str) r(str) r(obj) r(int64) decodeconf w(str) r(obj) r(str) r(int64) decoderepconf w(str) r(obj) r(str) r(str) r(int64) getppid w(int64) # Spesh ops. Naming convention: start with sp_. Must all be marked .s, which # is how the validator knows to exclude them. # Type guard operations. Trigger de-optimization if the guard is violated. # guard = guard on type only; index is spesh slot with type # guardconc = guard on type + concrete; index is spesh slot with type # guardtype = guard on type + type object; index is spesh slot with type sp_guard .s r(obj) sslot uint32 sp_guardconc .s r(obj) sslot uint32 sp_guardtype .s r(obj) sslot uint32 # Code guard operations. Trigger de-optimization if the guard is violated. # guardsf = guard on being an MVMCode with specified static frame inside # guardsfouter = as with guardsf but also ensures its ->outer is equal to # the currently executing frame sp_guardsf .s r(obj) sslot uint32 sp_guardsfouter .s r(obj) sslot uint32 # Specialized form of rebless that will always do a deopt one out of the # current code as well as a deopt all. sp_rebless .s w(obj) r(obj) r(obj) uint32 :noinline # Resolves an invokee into an MVMCode object, or returns VMNull when that is # not possible. Doesn't do multiple dispatch cache handling (since that needs # the args buffer set up). sp_resolvecode .s w(obj) r(obj) # These are variants of the normal interpreted ops that do not log. Used for # the case where we can't JIT-compile, but don't want to keep on logging. sp_decont .s w(obj) r(obj) :pure :invokish sp_getlex_o .s w(obj) rl(obj) :pure sp_getlex_ins .s w(`1) rl(`1) :pure sp_getlex_no .s w(obj) str :pure :noinline # Following are for fast, unchecked grabbing of args from the arg buffer. sp_getarg_o .s w(obj) int16 :pure sp_getarg_i .s w(obj) int16 :pure sp_getarg_n .s w(obj) int16 :pure sp_getarg_s .s w(obj) int16 :pure # Fast invocation. sp_fastinvoke_v .s r(obj) int16 sp_fastinvoke_i .s w(int64) r(obj) int16 sp_fastinvoke_n .s w(num64) r(obj) int16 sp_fastinvoke_s .s w(str) r(obj) int16 sp_fastinvoke_o .s w(obj) r(obj) int16 # Error generation if a named param is unused (name goes in spesh slot). sp_paramnamesused sslot # Look up a spesh slot. sp_getspeshslot .s w(obj) sslot :pure # Find method, using spesh slot and the one after it as a cache. # Isn't marked invokish, since the check is implemented directly sp_findmeth .s w(obj) r(obj) str sslot :pure # Create an object with the first int16's number of bytes size and then # set its STable to the STable in the spesh slot. sp_fastcreate .s w(obj) int16 sslot :pure # Retrieve or store a value by pointer offset. sp_get_o .s w(obj) r(obj) int16 :pure sp_get_i64 .s w(int64) r(obj) int16 :pure sp_get_i32 .s w(int64) r(obj) int16 :pure sp_get_i16 .s w(int64) r(obj) int16 :pure sp_get_i8 .s w(int64) r(obj) int16 :pure sp_get_n .s w(num64) r(obj) int16 :pure sp_get_s .s w(str) r(obj) int16 :pure sp_bind_o .s r(obj) int16 r(obj) sp_bind_i64 .s r(obj) int16 r(int64) sp_bind_i32 .s r(obj) int16 r(int64) sp_bind_i16 .s r(obj) int16 r(int64) sp_bind_i8 .s r(obj) int16 r(int64) sp_bind_n .s r(obj) int16 r(num64) sp_bind_s .s r(obj) int16 r(str) # Same as above, but for p6opaques, handling the NULL sentinel and the # real_data thing for mixins. The vt variant vivifies a NULL with a # type object; the vc does it with a clone. sp_p6oget_o .s w(obj) r(obj) int16 :pure sp_p6ogetvt_o .s w(obj) r(obj) int16 sslot sp_p6ogetvc_o .s w(obj) r(obj) int16 sslot sp_p6oget_i .s w(int64) r(obj) int16 :pure sp_p6oget_n .s w(num64) r(obj) int16 :pure sp_p6oget_s .s w(str) r(obj) int16 :pure sp_p6obind_o .s r(obj) int16 r(obj) sp_p6obind_i .s r(obj) int16 r(int64) sp_p6obind_n .s r(obj) int16 r(num64) sp_p6obind_s .s r(obj) int16 r(str) # Follow a pointer at an offset to an object and get/store a value there. sp_deref_get_i64 .s w(int64) r(obj) int16 :pure sp_deref_get_n .s w(num64) r(obj) int16 :pure sp_deref_bind_i64 .s r(obj) r(int64) int16 sp_deref_bind_n .s r(obj) r(num64) int16 # These read a lexical via. a code ref held in a register. Used for closure # inlining. The outers count must be at least 1 (e.g. these must never be used # for lexicals that are in the current scope). sp_getlexvia_o .s w(obj) int16 int16 r(obj) :pure sp_getlexvia_ins .s w(`1) int16 int16 r(obj) :pure # Enter the JIT sp_jit_enter .s w(obj) # we boolify iter objects all the time, but we have no op for it. until now! sp_boolify_iter .s w(int64) r(obj) :pure sp_boolify_iter_arr .s w(int64) r(obj) :pure sp_boolify_iter_hash .s w(int64) r(obj) :pure # Unguarded atomic ops (when we know it's a concrete target that certainly # has the operation). sp_cas_o w(obj) r(obj) r(obj) r(obj) :invokish sp_atomicload_o w(obj) r(obj) sp_atomicstore_o r(obj) r(obj) :invokish # Profiler recording ops. Naming convention: start with prof_. Must all be # marked .s, which is how the validator knows to exclude them. (For that # purpose, we treat them as a kind of spesh op). # Entry of various forms. The inline one passes along the static frame of the # inlinee. prof_enter .s prof_enterspesh .s prof_enterinline .s sslot prof_enternative .s r(obj) # Normal exit (exception throw and unwind is handled separately). Will always # be what we last entered, so no need for separate versions like above. prof_exit # Recording of allocated types (may not give full picture of allocations, but # is at least enough to get a picture). prof_allocated .s r(obj) # Cross-thread write analysis logging instruction. ctw_check .s r(obj) int16 coverage_log .s str int32 int32 int64 breakpoint .s int32 int32 MoarVM-2018.03/src/core/ops.c0000644000175000017510000067022313252330426015701 0ustar samanthasamantha#include "moar.h" /* This file is generated from src/core/oplist by tools/update_ops.p6. */ static const MVMOpInfo MVM_op_infos[] = { { MVM_OP_no_op, "no_op", " ", 0, 0, 0, 0, 0, 0, 0, }, { MVM_OP_const_i8, "const_i8", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int8, MVM_operand_int8 } }, { MVM_OP_const_i16, "const_i16", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int16, MVM_operand_int16 } }, { MVM_OP_const_i32, "const_i32", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int32, MVM_operand_int32 } }, { MVM_OP_const_i64, "const_i64", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_int64 } }, { MVM_OP_const_n32, "const_n32", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num32, MVM_operand_num32 } }, { MVM_OP_const_n64, "const_n64", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_num64 } }, { MVM_OP_const_s, "const_s", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_str } }, { MVM_OP_set, "set", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_type_var, MVM_operand_read_reg | MVM_operand_type_var } }, { MVM_OP_extend_u8, "extend_u8", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_uint64, MVM_operand_read_reg | MVM_operand_uint8 } }, { MVM_OP_extend_u16, "extend_u16", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_uint64, MVM_operand_read_reg | MVM_operand_uint16 } }, { MVM_OP_extend_u32, "extend_u32", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_uint64, MVM_operand_read_reg | MVM_operand_uint32 } }, { MVM_OP_extend_i8, "extend_i8", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int8 } }, { MVM_OP_extend_i16, "extend_i16", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int16 } }, { MVM_OP_extend_i32, "extend_i32", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int32 } }, { MVM_OP_trunc_u8, "trunc_u8", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_uint8, MVM_operand_read_reg | MVM_operand_uint64 } }, { MVM_OP_trunc_u16, "trunc_u16", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_uint16, MVM_operand_read_reg | MVM_operand_uint64 } }, { MVM_OP_trunc_u32, "trunc_u32", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_uint32, MVM_operand_read_reg | MVM_operand_uint64 } }, { MVM_OP_trunc_i8, "trunc_i8", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int8, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_trunc_i16, "trunc_i16", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int16, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_trunc_i32, "trunc_i32", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int32, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_extend_n32, "extend_n32", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num32 } }, { MVM_OP_trunc_n32, "trunc_n32", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num32, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_goto, "goto", ".j", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_ins } }, { MVM_OP_if_i, "if_i", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_int64, MVM_operand_ins } }, { MVM_OP_unless_i, "unless_i", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_int64, MVM_operand_ins } }, { MVM_OP_if_n, "if_n", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_num64, MVM_operand_ins } }, { MVM_OP_unless_n, "unless_n", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_num64, MVM_operand_ins } }, { MVM_OP_if_s, "if_s", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_ins } }, { MVM_OP_unless_s, "unless_s", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_ins } }, { MVM_OP_if_s0, "if_s0", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_ins } }, { MVM_OP_unless_s0, "unless_s0", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_ins } }, { MVM_OP_if_o, "if_o", " ", 2, 0, 0, 0, 0, 1, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_ins } }, { MVM_OP_unless_o, "unless_o", " ", 2, 0, 0, 0, 0, 1, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_ins } }, { MVM_OP_jumplist, "jumplist", ":j", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_getlex, "getlex", " ", 2, 1, 1, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_type_var, MVM_operand_read_lex | MVM_operand_type_var } }, { MVM_OP_bindlex, "bindlex", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_lex | MVM_operand_type_var, MVM_operand_read_reg | MVM_operand_type_var } }, { MVM_OP_getlex_ni, "getlex_ni", " ", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_str } }, { MVM_OP_getlex_nn, "getlex_nn", " ", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_str } }, { MVM_OP_getlex_ns, "getlex_ns", " ", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_str } }, { MVM_OP_getlex_no, "getlex_no", " ", 2, 1, 1, 1, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_str } }, { MVM_OP_bindlex_ni, "bindlex_ni", " ", 2, 0, 0, 0, 1, 0, 0, { MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_bindlex_nn, "bindlex_nn", " ", 2, 0, 0, 0, 1, 0, 0, { MVM_operand_str, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_bindlex_ns, "bindlex_ns", " ", 2, 0, 0, 0, 1, 0, 0, { MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bindlex_no, "bindlex_no", " ", 2, 0, 0, 0, 1, 0, 0, { MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getlex_ng, "getlex_ng", " ", 2, 1, 0, 0, 1, 0, 1, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bindlex_ng, "bindlex_ng", " ", 2, 0, 0, 0, 1, 0, 1, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getdynlex, "getdynlex", " ", 2, 1, 0, 0, 1, 0, 1, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_binddynlex, "binddynlex", " ", 2, 0, 0, 0, 1, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_setlexvalue, "setlexvalue", " ", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_lexprimspec, "lexprimspec", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_return_i, "return_i", ".r", 1, 0, 0, 0, 0, 0, 1, { MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_return_n, "return_n", ".r", 1, 0, 0, 0, 0, 0, 1, { MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_return_s, "return_s", ".r", 1, 0, 0, 0, 0, 0, 1, { MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_return_o, "return_o", ".r", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_return, "return", ".r", 0, 0, 0, 0, 0, 0, 0, }, { MVM_OP_eq_i, "eq_i", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_ne_i, "ne_i", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_lt_i, "lt_i", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_le_i, "le_i", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_gt_i, "gt_i", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_ge_i, "ge_i", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_cmp_i, "cmp_i", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_add_i, "add_i", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_sub_i, "sub_i", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_mul_i, "mul_i", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_div_i, "div_i", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_div_u, "div_u", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_uint64, MVM_operand_read_reg | MVM_operand_uint64, MVM_operand_read_reg | MVM_operand_uint64 } }, { MVM_OP_mod_i, "mod_i", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_mod_u, "mod_u", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_uint64, MVM_operand_read_reg | MVM_operand_uint64, MVM_operand_read_reg | MVM_operand_uint64 } }, { MVM_OP_neg_i, "neg_i", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_abs_i, "abs_i", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_inc_i, "inc_i", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64 } }, { MVM_OP_inc_u, "inc_u", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_uint64 } }, { MVM_OP_dec_i, "dec_i", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64 } }, { MVM_OP_dec_u, "dec_u", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_uint64 } }, { MVM_OP_band_i, "band_i", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_bor_i, "bor_i", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_bxor_i, "bxor_i", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_bnot_i, "bnot_i", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_blshift_i, "blshift_i", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_brshift_i, "brshift_i", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_pow_i, "pow_i", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_not_i, "not_i", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_gcd_i, "gcd_i", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_lcm_i, "lcm_i", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_eq_n, "eq_n", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_ne_n, "ne_n", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_lt_n, "lt_n", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_le_n, "le_n", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_gt_n, "gt_n", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_ge_n, "ge_n", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_cmp_n, "cmp_n", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_add_n, "add_n", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_sub_n, "sub_n", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_mul_n, "mul_n", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_div_n, "div_n", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_mod_n, "mod_n", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_neg_n, "neg_n", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_abs_n, "abs_n", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_pow_n, "pow_n", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_ceil_n, "ceil_n", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_floor_n, "floor_n", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_sin_n, "sin_n", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_asin_n, "asin_n", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_cos_n, "cos_n", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_acos_n, "acos_n", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_tan_n, "tan_n", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_atan_n, "atan_n", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_atan2_n, "atan2_n", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_sec_n, "sec_n", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_asec_n, "asec_n", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_sinh_n, "sinh_n", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_cosh_n, "cosh_n", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_tanh_n, "tanh_n", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_sech_n, "sech_n", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_sqrt_n, "sqrt_n", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_log_n, "log_n", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_exp_n, "exp_n", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_coerce_in, "coerce_in", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_coerce_ni, "coerce_ni", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_coerce_is, "coerce_is", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_coerce_ns, "coerce_ns", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_coerce_si, "coerce_si", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_coerce_sn, "coerce_sn", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_smrt_numify, "smrt_numify", " ", 2, 1, 0, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_smrt_strify, "smrt_strify", " ", 2, 1, 0, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_prepargs, "prepargs", "+a", 1, 0, 8, 0, 0, 0, 0, { MVM_operand_callsite } }, { MVM_OP_arg_i, "arg_i", "*a", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_int16, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_arg_n, "arg_n", "*a", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_int16, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_arg_s, "arg_s", "*a", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_int16, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_arg_o, "arg_o", "*a", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_int16, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_argconst_i, "argconst_i", "*a", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_int16, MVM_operand_int64 } }, { MVM_OP_argconst_n, "argconst_n", "*a", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_int16, MVM_operand_num64 } }, { MVM_OP_argconst_s, "argconst_s", "*a", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_int16, MVM_operand_str } }, { MVM_OP_invoke_v, "invoke_v", "-a", 1, 0, 2, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_invoke_i, "invoke_i", "-a", 2, 0, 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_invoke_n, "invoke_n", "-a", 2, 0, 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_invoke_s, "invoke_s", "-a", 2, 0, 2, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_invoke_o, "invoke_o", "-a", 2, 0, 3, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_checkarity, "checkarity", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_int16, MVM_operand_int16 } }, { MVM_OP_param_rp_i, "param_rp_i", ".p", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_int16 } }, { MVM_OP_param_rp_n, "param_rp_n", ".p", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_int16 } }, { MVM_OP_param_rp_s, "param_rp_s", ".p", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_int16 } }, { MVM_OP_param_rp_o, "param_rp_o", ".p", 2, 1, 0, 0, 1, 0, 1, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_param_op_i, "param_op_i", ".p", 3, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_int16, MVM_operand_ins } }, { MVM_OP_param_op_n, "param_op_n", ".p", 3, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_int16, MVM_operand_ins } }, { MVM_OP_param_op_s, "param_op_s", ".p", 3, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_int16, MVM_operand_ins } }, { MVM_OP_param_op_o, "param_op_o", ".p", 3, 1, 0, 0, 1, 0, 1, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_ins } }, { MVM_OP_param_rn_i, "param_rn_i", " ", 2, 0, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_str } }, { MVM_OP_param_rn_n, "param_rn_n", " ", 2, 0, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_str } }, { MVM_OP_param_rn_s, "param_rn_s", " ", 2, 0, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_str } }, { MVM_OP_param_rn_o, "param_rn_o", " ", 2, 0, 0, 0, 1, 0, 1, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_str } }, { MVM_OP_param_on_i, "param_on_i", " ", 3, 0, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_str, MVM_operand_ins } }, { MVM_OP_param_on_n, "param_on_n", " ", 3, 0, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_str, MVM_operand_ins } }, { MVM_OP_param_on_s, "param_on_s", " ", 3, 0, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_str, MVM_operand_ins } }, { MVM_OP_param_on_o, "param_on_o", " ", 3, 0, 0, 0, 1, 0, 1, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_ins } }, { MVM_OP_param_sp, "param_sp", ".p", 2, 1, 0, 0, 1, 0, 1, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_param_sn, "param_sn", " ", 1, 0, 0, 0, 1, 0, 1, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_getcode, "getcode", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_coderef } }, { MVM_OP_caller, "caller", " ", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_capturelex, "capturelex", " ", 1, 0, 0, 0, 1, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_takeclosure, "takeclosure", " ", 2, 0, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_exception, "exception", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_bindexmessage, "bindexmessage", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bindexpayload, "bindexpayload", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_bindexcategory, "bindexcategory", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_getexmessage, "getexmessage", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getexpayload, "getexpayload", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getexcategory, "getexcategory", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_throwdyn, "throwdyn", " ", 2, 0, 0, 0, 0, 2, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_throwlex, "throwlex", " ", 2, 0, 0, 0, 0, 2, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_throwlexotic, "throwlexotic", " ", 2, 0, 0, 0, 0, 2, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_throwcatdyn, "throwcatdyn", " ", 2, 0, 0, 0, 0, 2, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int64 } }, { MVM_OP_throwcatlex, "throwcatlex", " ", 2, 0, 0, 0, 0, 2, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int64 } }, { MVM_OP_throwcatlexotic, "throwcatlexotic", " ", 2, 0, 0, 0, 0, 2, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int64 } }, { MVM_OP_die, "die", " ", 2, 0, 0, 0, 0, 2, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_rethrow, "rethrow", " ", 1, 0, 0, 0, 0, 2, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_resume, "resume", " ", 1, 0, 0, 0, 0, 2, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_takehandlerresult, "takehandlerresult", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_DEPRECATED_33, "DEPRECATED_33", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_ins } }, { MVM_OP_DEPRECATED_34, "DEPRECATED_34", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_backtracestrings, "backtracestrings", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_usecapture, "usecapture", " ", 1, 0, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_savecapture, "savecapture", " ", 1, 0, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_captureposelems, "captureposelems", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_captureposarg, "captureposarg", " ", 3, 1, 0, 0, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_captureposarg_i, "captureposarg_i", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_captureposarg_n, "captureposarg_n", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_captureposarg_s, "captureposarg_s", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_captureposprimspec, "captureposprimspec", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_captureexistsnamed, "captureexistsnamed", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_capturehasnameds, "capturehasnameds", " ", 2, 1, 0, 0, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_invokewithcapture, "invokewithcapture", " ", 3, 0, 0, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_multicacheadd, "multicacheadd", " ", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_multicachefind, "multicachefind", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_null_s, "null_s", " ", 1, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str } }, { MVM_OP_isnull_s, "isnull_s", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_eq_s, "eq_s", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_ne_s, "ne_s", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_gt_s, "gt_s", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_ge_s, "ge_s", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_lt_s, "lt_s", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_le_s, "le_s", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_cmp_s, "cmp_s", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_eqat_s, "eqat_s", " ", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_eqatic_s, "eqatic_s", " ", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_haveat_s, "haveat_s", " ", 6, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_concat_s, "concat_s", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_repeat_s, "repeat_s", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_substr_s, "substr_s", " ", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_index_s, "index_s", " ", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_graphs_s, "graphs_s", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_codes_s, "codes_s", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_getcp_s, "getcp_s", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_indexcp_s, "indexcp_s", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_uc, "uc", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_lc, "lc", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_tc, "tc", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_split, "split", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_join, "join", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getcpbyname, "getcpbyname", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_indexat, "indexat", " ", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_str, MVM_operand_ins } }, { MVM_OP_indexnat, "indexnat", " ", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_str, MVM_operand_ins } }, { MVM_OP_unipropcode, "unipropcode", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_unipvalcode, "unipvalcode", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_hasuniprop, "hasuniprop", " ", 5, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_hasunipropc, "hasunipropc", " ", 5, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_int16, MVM_operand_int16 } }, { MVM_OP_chars, "chars", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_chr, "chr", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_ordfirst, "ordfirst", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_ordat, "ordat", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_rindexfrom, "rindexfrom", " ", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_escape, "escape", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_flip, "flip", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_setbuffersize_fh, "setbuffersize_fh", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_iscclass, "iscclass", " ", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_findcclass, "findcclass", " ", 5, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_findnotcclass, "findnotcclass", " ", 5, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_nfafromstatelist, "nfafromstatelist", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_nfarunproto, "nfarunproto", " ", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_nfarunalt, "nfarunalt", " ", 6, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_radix, "radix", " ", 5, 0, 0, 0, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_encode, "encode", " ", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_decode, "decode", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_istrue_s, "istrue_s", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_isfalse_s, "isfalse_s", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_null, "null", " ", 1, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_isnull, "isnull", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_ifnonnull, "ifnonnull", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_ins } }, { MVM_OP_findmeth, "findmeth", " ", 3, 1, 0, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_str } }, { MVM_OP_findmeth_s, "findmeth_s", " ", 3, 1, 0, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_can, "can", " ", 3, 1, 0, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_str } }, { MVM_OP_can_s, "can_s", " ", 3, 1, 0, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_create, "create", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_clone, "clone", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_isconcrete, "isconcrete", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_rebless, "rebless", " ", 3, 0, 1, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_istype, "istype", " ", 3, 1, 0, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_objprimspec, "objprimspec", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_gethow, "gethow", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getwhat, "getwhat", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getwho, "getwho", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_setwho, "setwho", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_reprname, "reprname", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getwhere, "getwhere", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_eqaddr, "eqaddr", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_bindattr_i, "bindattr_i", " ", 5, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_int16 } }, { MVM_OP_bindattr_n, "bindattr_n", " ", 5, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_int16 } }, { MVM_OP_bindattr_s, "bindattr_s", " ", 5, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_int16 } }, { MVM_OP_bindattr_o, "bindattr_o", " ", 5, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_bindattrs_i, "bindattrs_i", " ", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_bindattrs_n, "bindattrs_n", " ", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_bindattrs_s, "bindattrs_s", " ", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bindattrs_o, "bindattrs_o", " ", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getattr_i, "getattr_i", " ", 5, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_int16 } }, { MVM_OP_getattr_n, "getattr_n", " ", 5, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_int16 } }, { MVM_OP_getattr_s, "getattr_s", " ", 5, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_int16 } }, { MVM_OP_getattr_o, "getattr_o", " ", 5, 0, 1, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_int16 } }, { MVM_OP_getattrs_i, "getattrs_i", " ", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_getattrs_n, "getattrs_n", " ", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_getattrs_s, "getattrs_s", " ", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_getattrs_o, "getattrs_o", " ", 4, 0, 1, 1, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_attrinited, "attrinited", " ", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_box_i, "box_i", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_box_n, "box_n", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_box_s, "box_s", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_unbox_i, "unbox_i", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_unbox_n, "unbox_n", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_unbox_s, "unbox_s", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_atpos_i, "atpos_i", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_atpos_n, "atpos_n", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_atpos_s, "atpos_s", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_atpos_o, "atpos_o", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_bindpos_i, "bindpos_i", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_bindpos_n, "bindpos_n", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_bindpos_s, "bindpos_s", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bindpos_o, "bindpos_o", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_push_i, "push_i", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_push_n, "push_n", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_push_s, "push_s", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_push_o, "push_o", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_pop_i, "pop_i", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_pop_n, "pop_n", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_pop_s, "pop_s", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_pop_o, "pop_o", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_shift_i, "shift_i", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_shift_n, "shift_n", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_shift_s, "shift_s", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_shift_o, "shift_o", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_unshift_i, "unshift_i", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_unshift_n, "unshift_n", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_unshift_s, "unshift_s", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_unshift_o, "unshift_o", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_splice, "splice", " ", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_setelemspos, "setelemspos", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_existspos, "existspos", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_atkey_i, "atkey_i", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_atkey_n, "atkey_n", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_atkey_s, "atkey_s", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_atkey_o, "atkey_o", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bindkey_i, "bindkey_i", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_bindkey_n, "bindkey_n", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_bindkey_s, "bindkey_s", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bindkey_o, "bindkey_o", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_existskey, "existskey", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_deletekey, "deletekey", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_elems, "elems", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_knowhow, "knowhow", " ", 1, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_knowhowattr, "knowhowattr", " ", 1, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_newtype, "newtype", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_composetype, "composetype", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_setmethcache, "setmethcache", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_setmethcacheauth, "setmethcacheauth", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_settypecache, "settypecache", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_settypecheckmode, "settypecheckmode", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_setboolspec, "setboolspec", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_istrue, "istrue", " ", 2, 0, 0, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_isfalse, "isfalse", " ", 2, 0, 0, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_bootint, "bootint", " ", 1, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_bootnum, "bootnum", " ", 1, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_bootstr, "bootstr", " ", 1, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_bootarray, "bootarray", " ", 1, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_bootintarray, "bootintarray", " ", 1, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_bootnumarray, "bootnumarray", " ", 1, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_bootstrarray, "bootstrarray", " ", 1, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_boothash, "boothash", " ", 1, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_isint, "isint", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_isnum, "isnum", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_isstr, "isstr", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_islist, "islist", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_ishash, "ishash", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_sethllconfig, "sethllconfig", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_hllboxtype_i, "hllboxtype_i", " ", 1, 1, 0, 0, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_hllboxtype_n, "hllboxtype_n", " ", 1, 1, 0, 0, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_hllboxtype_s, "hllboxtype_s", " ", 1, 1, 0, 0, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_hlllist, "hlllist", " ", 1, 1, 0, 0, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_hllhash, "hllhash", " ", 1, 1, 0, 0, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_getcomp, "getcomp", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bindcomp, "bindcomp", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getcurhllsym, "getcurhllsym", " ", 2, 1, 0, 0, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bindcurhllsym, "bindcurhllsym", " ", 3, 0, 0, 0, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_gethllsym, "gethllsym", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bindhllsym, "bindhllsym", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_settypehll, "settypehll", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_settypehllrole, "settypehllrole", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_hllize, "hllize", " ", 2, 1, 0, 0, 0, 1, 1, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_hllizefor, "hllizefor", " ", 3, 1, 0, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_usecompileehllconfig, "usecompileehllconfig", " ", 0, 0, 0, 0, 0, 0, 1, }, { MVM_OP_usecompilerhllconfig, "usecompilerhllconfig", " ", 0, 0, 0, 0, 0, 0, 1, }, { MVM_OP_iter, "iter", " ", 2, 1, 0, 0, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_iterkey_s, "iterkey_s", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_iterval, "iterval", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getcodename, "getcodename", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_iscoderef, "iscoderef", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getcodeobj, "getcodeobj", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_setcodeobj, "setcodeobj", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_setcodename, "setcodename", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_forceouterctx, "forceouterctx", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_setinvokespec, "setinvokespec", " ", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_isinvokable, "isinvokable", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_freshcoderef, "freshcoderef", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_markcodestatic, "markcodestatic", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_markcodestub, "markcodestub", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getstaticcode, "getstaticcode", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getcodecuid, "getcodecuid", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_setdispatcher, "setdispatcher", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_takedispatcher, "takedispatcher", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_assign, "assign", " ", 2, 0, 0, 0, 0, 1, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_assignunchecked, "assignunchecked", " ", 2, 0, 0, 0, 0, 1, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_iscont, "iscont", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_decont, "decont", " ", 2, 1, 1, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_setcontspec, "setcontspec", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_sha1, "sha1", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_createsc, "createsc", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_scsetobj, "scsetobj", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_scsetcode, "scsetcode", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_scgetobj, "scgetobj", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_scgethandle, "scgethandle", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_scgetobjidx, "scgetobjidx", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_scsetdesc, "scsetdesc", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_scobjcount, "scobjcount", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_setobjsc, "setobjsc", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getobjsc, "getobjsc", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_serialize, "serialize", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_deserialize, "deserialize", " ", 5, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_wval, "wval", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_int16 } }, { MVM_OP_wval_wide, "wval_wide", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_int64 } }, { MVM_OP_scwbdisable, "scwbdisable", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64 } }, { MVM_OP_scwbenable, "scwbenable", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64 } }, { MVM_OP_pushcompsc, "pushcompsc", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_popcompsc, "popcompsc", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_scgetdesc, "scgetdesc", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_loadbytecode, "loadbytecode", " ", 2, 0, 0, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_masttofile, "masttofile", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_masttocu, "masttocu", " ", 3, 0, 0, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_iscompunit, "iscompunit", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_compunitmainline, "compunitmainline", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_compunitcodes, "compunitcodes", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_ctx, "ctx", " ", 1, 0, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_ctxouter, "ctxouter", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_ctxcaller, "ctxcaller", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_ctxlexpad, "ctxlexpad", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_curcode, "curcode", " ", 1, 0, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_callercode, "callercode", " ", 1, 0, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_add_I, "add_I", " ", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_sub_I, "sub_I", " ", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_mul_I, "mul_I", " ", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_div_I, "div_I", " ", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_mod_I, "mod_I", " ", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_neg_I, "neg_I", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_abs_I, "abs_I", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_cmp_I, "cmp_I", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_eq_I, "eq_I", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_ne_I, "ne_I", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_lt_I, "lt_I", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_le_I, "le_I", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_gt_I, "gt_I", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_ge_I, "ge_I", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_bor_I, "bor_I", " ", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_bxor_I, "bxor_I", " ", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_band_I, "band_I", " ", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_bnot_I, "bnot_I", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_blshift_I, "blshift_I", " ", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_brshift_I, "brshift_I", " ", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_pow_I, "pow_I", " ", 5, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_gcd_I, "gcd_I", " ", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_lcm_I, "lcm_I", " ", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_expmod_I, "expmod_I", " ", 5, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_isprime_I, "isprime_I", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_rand_I, "rand_I", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_coerce_In, "coerce_In", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_coerce_Is, "coerce_Is", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_coerce_nI, "coerce_nI", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_coerce_sI, "coerce_sI", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_isbig_I, "isbig_I", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_bool_I, "bool_I", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_base_I, "base_I", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_radix_I, "radix_I", " ", 6, 1, 0, 0, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_div_In, "div_In", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_copy_f, "copy_f", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_append_f, "append_f", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_rename_f, "rename_f", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_delete_f, "delete_f", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_chmod_f, "chmod_f", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_exists_f, "exists_f", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_mkdir, "mkdir", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_rmdir, "rmdir", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_open_dir, "open_dir", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_read_dir, "read_dir", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_close_dir, "close_dir", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_open_fh, "open_fh", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_close_fh, "close_fh", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_DEPRECATED_23, "DEPRECATED_23", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_DEPRECATED_27, "DEPRECATED_27", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_DEPRECATED_28, "DEPRECATED_28", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_DEPRECATED_18, "DEPRECATED_18", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_seek_fh, "seek_fh", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_lock_fh, "lock_fh", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_unlock_fh, "unlock_fh", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_sync_fh, "sync_fh", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_trunc_fh, "trunc_fh", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_eof_fh, "eof_fh", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getstdin, "getstdin", " ", 1, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_getstdout, "getstdout", " ", 1, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_getstderr, "getstderr", " ", 1, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_connect_sk, "connect_sk", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_socket, "socket", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_bind_sk, "bind_sk", " ", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_DEPRECATED_24, "DEPRECATED_24", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_accept_sk, "accept_sk", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_decodetocodes, "decodetocodes", " ", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_encodefromcodes, "encodefromcodes", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_DEPRECATED_17, "DEPRECATED_17", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_print, "print", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_say, "say", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_DEPRECATED_22, "DEPRECATED_22", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_tell_fh, "tell_fh", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_stat, "stat", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_tryfindmeth, "tryfindmeth", " ", 3, 1, 0, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_str } }, { MVM_OP_tryfindmeth_s, "tryfindmeth_s", " ", 3, 1, 0, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_chdir, "chdir", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_srand, "srand", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_rand_i, "rand_i", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64 } }, { MVM_OP_rand_n, "rand_n", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64 } }, { MVM_OP_time_i, "time_i", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64 } }, { MVM_OP_sleep, "sleep", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_newthread, "newthread", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_threadjoin, "threadjoin", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_time_n, "time_n", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64 } }, { MVM_OP_exit, "exit", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_DEPRECATED_30, "DEPRECATED_30", " ", 8, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_cwd, "cwd", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str } }, { MVM_OP_clargs, "clargs", " ", 1, 0, 0, 0, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_getenvhash, "getenvhash", " ", 1, 0, 0, 0, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_loadlib, "loadlib", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_freelib, "freelib", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_findsym, "findsym", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_dropsym, "dropsym", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_loadext, "loadext", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_backendconfig, "backendconfig", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_getlexouter, "getlexouter", " ", 2, 1, 0, 0, 1, 0, 1, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_getlexrel, "getlexrel", " ", 3, 1, 0, 0, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_getlexreldyn, "getlexreldyn", " ", 3, 1, 0, 0, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_getlexrelcaller, "getlexrelcaller", " ", 3, 1, 0, 0, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_getlexcaller, "getlexcaller", " ", 2, 1, 0, 0, 1, 0, 1, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bitand_s, "bitand_s", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bitor_s, "bitor_s", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bitxor_s, "bitxor_s", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_isnanorinf, "isnanorinf", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_inf, "inf", " ", 1, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64 } }, { MVM_OP_neginf, "neginf", " ", 1, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64 } }, { MVM_OP_nan, "nan", " ", 1, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64 } }, { MVM_OP_getpid, "getpid", " ", 1, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64 } }, { MVM_OP_DEPRECATED_29, "DEPRECATED_29", " ", 8, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_filereadable, "filereadable", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_filewritable, "filewritable", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_fileexecutable, "fileexecutable", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_DEPRECATED_19, "DEPRECATED_19", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_capturenamedshash, "capturenamedshash", " ", 2, 1, 0, 0, 0, 0, 1, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_read_fhb, "read_fhb", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_write_fhb, "write_fhb", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_replace, "replace", " ", 5, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_newexception, "newexception", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_permit, "permit", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_backtrace, "backtrace", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_symlink, "symlink", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_link, "link", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_gethostname, "gethostname", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str } }, { MVM_OP_exreturnafterunwind, "exreturnafterunwind", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_DEPRECATED_13, "DEPRECATED_13", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_continuationreset, "continuationreset", " ", 3, 0, 0, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_continuationcontrol, "continuationcontrol", " ", 4, 0, 0, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_continuationinvoke, "continuationinvoke", " ", 3, 0, 0, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_randscale_n, "randscale_n", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_uniisblock, "uniisblock", " ", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_assertparamcheck, "assertparamcheck", " ", 1, 0, 0, 0, 1, 1, 0, { MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_hintfor, "hintfor", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_paramnamesused, "paramnamesused", " ", 0, 0, 0, 0, 1, 0, 0, }, { MVM_OP_getuniname, "getuniname", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_getuniprop_int, "getuniprop_int", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_getuniprop_bool, "getuniprop_bool", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_getuniprop_str, "getuniprop_str", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_matchuniprop, "matchuniprop", " ", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_nativecallbuild, "nativecallbuild", " ", 7, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_nativecallinvoke, "nativecallinvoke", " ", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_nativecallrefresh, "nativecallrefresh", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_threadrun, "threadrun", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_threadid, "threadid", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_threadyield, "threadyield", " ", 0, 0, 0, 0, 0, 0, 0, }, { MVM_OP_currentthread, "currentthread", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_lock, "lock", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_unlock, "unlock", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_semacquire, "semacquire", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_semtryacquire, "semtryacquire", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_semrelease, "semrelease", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getlockcondvar, "getlockcondvar", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_condwait, "condwait", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_condsignalone, "condsignalone", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_condsignalall, "condsignalall", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_queuepoll, "queuepoll", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_setmultispec, "setmultispec", " ", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_ctxouterskipthunks, "ctxouterskipthunks", " ", 2, 0, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_ctxcallerskipthunks, "ctxcallerskipthunks", " ", 2, 0, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_timer, "timer", " ", 6, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_cancel, "cancel", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_signal, "signal", " ", 5, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_watchfile, "watchfile", " ", 5, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_asyncconnect, "asyncconnect", " ", 6, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_asynclisten, "asynclisten", " ", 7, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_DEPRECATED_14, "DEPRECATED_14", " ", 6, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_asyncwritebytes, "asyncwritebytes", " ", 6, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_DEPRECATED_16, "DEPRECATED_16", " ", 5, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_asyncreadbytes, "asyncreadbytes", " ", 6, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getlexstatic_o, "getlexstatic_o", " ", 2, 1, 0, 1, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_getlexperinvtype_o, "getlexperinvtype_o", " ", 2, 1, 0, 1, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_execname, "execname", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str } }, { MVM_OP_const_i64_16, "const_i64_16", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_int16 } }, { MVM_OP_const_i64_32, "const_i64_32", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_int32 } }, { MVM_OP_isnonnull, "isnonnull", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_param_rn2_i, "param_rn2_i", " ", 3, 0, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_str, MVM_operand_str } }, { MVM_OP_param_rn2_n, "param_rn2_n", " ", 3, 0, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_str, MVM_operand_str } }, { MVM_OP_param_rn2_s, "param_rn2_s", " ", 3, 0, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_str, MVM_operand_str } }, { MVM_OP_param_rn2_o, "param_rn2_o", " ", 3, 0, 0, 0, 1, 0, 1, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_str } }, { MVM_OP_param_on2_i, "param_on2_i", " ", 4, 0, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_str, MVM_operand_str, MVM_operand_ins } }, { MVM_OP_param_on2_n, "param_on2_n", " ", 4, 0, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_str, MVM_operand_str, MVM_operand_ins } }, { MVM_OP_param_on2_s, "param_on2_s", " ", 4, 0, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_str, MVM_operand_str, MVM_operand_ins } }, { MVM_OP_param_on2_o, "param_on2_o", " ", 4, 0, 0, 0, 1, 0, 1, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_str, MVM_operand_ins } }, { MVM_OP_osrpoint, "osrpoint", " ", 0, 0, 4, 0, 0, 0, 0, }, { MVM_OP_nativecallcast, "nativecallcast", " ", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_spawnprocasync, "spawnprocasync", " ", 6, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_killprocasync, "killprocasync", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_startprofile, "startprofile", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_endprofile, "endprofile", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_objectid, "objectid", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_settypefinalize, "settypefinalize", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_force_gc, "force_gc", " ", 0, 0, 0, 0, 0, 0, 0, }, { MVM_OP_nativecallglobal, "nativecallglobal", " ", 5, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_DEPRECATED_32, "DEPRECATED_32", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_setparameterizer, "setparameterizer", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_parameterizetype, "parameterizetype", " ", 3, 0, 0, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_typeparameterized, "typeparameterized", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_typeparameters, "typeparameters", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_typeparameterat, "typeparameterat", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_readlink, "readlink", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_lstat, "lstat", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_iscont_i, "iscont_i", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_iscont_n, "iscont_n", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_iscont_s, "iscont_s", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_assign_i, "assign_i", " ", 2, 0, 0, 0, 0, 1, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_assign_n, "assign_n", " ", 2, 0, 0, 0, 0, 1, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_assign_s, "assign_s", " ", 2, 0, 0, 0, 0, 1, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_decont_i, "decont_i", " ", 2, 1, 0, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_decont_n, "decont_n", " ", 2, 1, 0, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_decont_s, "decont_s", " ", 2, 1, 0, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getrusage, "getrusage", " ", 1, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_threadlockcount, "threadlockcount", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_DEPRECATED_4, "DEPRECATED_4", " ", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_getlexref_i, "getlexref_i", " ", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_lex | MVM_operand_int64 } }, { MVM_OP_getlexref_n, "getlexref_n", " ", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_lex | MVM_operand_num64 } }, { MVM_OP_getlexref_s, "getlexref_s", " ", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_lex | MVM_operand_str } }, { MVM_OP_getlexref_ni, "getlexref_ni", " ", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_str } }, { MVM_OP_getlexref_nn, "getlexref_nn", " ", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_str } }, { MVM_OP_getlexref_ns, "getlexref_ns", " ", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_str } }, { MVM_OP_atposref_i, "atposref_i", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_atposref_n, "atposref_n", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_atposref_s, "atposref_s", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_getattrref_i, "getattrref_i", " ", 5, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_int16 } }, { MVM_OP_getattrref_n, "getattrref_n", " ", 5, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_int16 } }, { MVM_OP_getattrref_s, "getattrref_s", " ", 5, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_int16 } }, { MVM_OP_getattrsref_i, "getattrsref_i", " ", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_getattrsref_n, "getattrsref_n", " ", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_getattrsref_s, "getattrsref_s", " ", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_nativecallsizeof, "nativecallsizeof", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_encodenorm, "encodenorm", " ", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_normalizecodes, "normalizecodes", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_strfromcodes, "strfromcodes", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_strtocodes, "strtocodes", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getcodelocation, "getcodelocation", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_eqatim_s, "eqatim_s", " ", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_ordbaseat, "ordbaseat", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_neverrepossess, "neverrepossess", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_scdisclaim, "scdisclaim", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_DEPRECATED_31, "DEPRECATED_31", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_atpos2d_i, "atpos2d_i", " ", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_atpos2d_n, "atpos2d_n", " ", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_atpos2d_s, "atpos2d_s", " ", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_atpos2d_o, "atpos2d_o", " ", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_atpos3d_i, "atpos3d_i", " ", 5, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_atpos3d_n, "atpos3d_n", " ", 5, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_atpos3d_s, "atpos3d_s", " ", 5, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_atpos3d_o, "atpos3d_o", " ", 5, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_atposnd_i, "atposnd_i", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_atposnd_n, "atposnd_n", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_atposnd_s, "atposnd_s", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_atposnd_o, "atposnd_o", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_bindpos2d_i, "bindpos2d_i", " ", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_bindpos2d_n, "bindpos2d_n", " ", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_bindpos2d_s, "bindpos2d_s", " ", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bindpos2d_o, "bindpos2d_o", " ", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_bindpos3d_i, "bindpos3d_i", " ", 5, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_bindpos3d_n, "bindpos3d_n", " ", 5, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_bindpos3d_s, "bindpos3d_s", " ", 5, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bindpos3d_o, "bindpos3d_o", " ", 5, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_bindposnd_i, "bindposnd_i", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_bindposnd_n, "bindposnd_n", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_bindposnd_s, "bindposnd_s", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_bindposnd_o, "bindposnd_o", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_dimensions, "dimensions", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_setdimensions, "setdimensions", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_numdimensions, "numdimensions", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_ctxcode, "ctxcode", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_isrwcont, "isrwcont", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_fc, "fc", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_DEPRECATED_25, "DEPRECATED_25", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_DEPRECATED_21, "DEPRECATED_21", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_encoderep, "encoderep", " ", 5, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_istty_fh, "istty_fh", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_multidimref_i, "multidimref_i", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_multidimref_n, "multidimref_n", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_multidimref_s, "multidimref_s", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_fileno_fh, "fileno_fh", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_asyncudp, "asyncudp", " ", 7, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_DEPRECATED_15, "DEPRECATED_15", " ", 8, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_asyncwritebytesto, "asyncwritebytesto", " ", 8, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_objprimbits, "objprimbits", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_objprimunsigned, "objprimunsigned", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_DEPRECATED_5, "DEPRECATED_5", " ", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int32 } }, { MVM_OP_DEPRECATED_6, "DEPRECATED_6", " ", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int16 } }, { MVM_OP_DEPRECATED_7, "DEPRECATED_7", " ", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int8 } }, { MVM_OP_DEPRECATED_8, "DEPRECATED_8", " ", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_num32 } }, { MVM_OP_getlexref_i32, "getlexref_i32", " ", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_lex | MVM_operand_int32 } }, { MVM_OP_getlexref_i16, "getlexref_i16", " ", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_lex | MVM_operand_int16 } }, { MVM_OP_getlexref_i8, "getlexref_i8", " ", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_lex | MVM_operand_int8 } }, { MVM_OP_getlexref_n32, "getlexref_n32", " ", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_lex | MVM_operand_num32 } }, { MVM_OP_box_u, "box_u", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_uint64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_unbox_u, "unbox_u", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_uint64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_coerce_iu, "coerce_iu", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_uint64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_coerce_ui, "coerce_ui", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_uint64 } }, { MVM_OP_coerce_nu, "coerce_nu", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_uint64, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_coerce_un, "coerce_un", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_uint64 } }, { MVM_OP_decont_u, "decont_u", " ", 2, 1, 0, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_uint64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_DEPRECATED_9, "DEPRECATED_9", " ", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_uint64 } }, { MVM_OP_DEPRECATED_10, "DEPRECATED_10", " ", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_uint32 } }, { MVM_OP_DEPRECATED_11, "DEPRECATED_11", " ", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_uint16 } }, { MVM_OP_DEPRECATED_12, "DEPRECATED_12", " ", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_uint8 } }, { MVM_OP_getlexref_u, "getlexref_u", " ", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_lex | MVM_operand_uint64 } }, { MVM_OP_getlexref_u32, "getlexref_u32", " ", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_lex | MVM_operand_uint32 } }, { MVM_OP_getlexref_u16, "getlexref_u16", " ", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_lex | MVM_operand_uint16 } }, { MVM_OP_getlexref_u8, "getlexref_u8", " ", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_lex | MVM_operand_uint8 } }, { MVM_OP_param_rp_u, "param_rp_u", " ", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_uint64, MVM_operand_int16 } }, { MVM_OP_param_op_u, "param_op_u", " ", 3, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_uint64, MVM_operand_int16, MVM_operand_ins } }, { MVM_OP_param_rn_u, "param_rn_u", " ", 2, 0, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_uint64, MVM_operand_str } }, { MVM_OP_param_on_u, "param_on_u", " ", 3, 0, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_uint64, MVM_operand_str, MVM_operand_ins } }, { MVM_OP_param_rn2_u, "param_rn2_u", " ", 3, 0, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_uint64, MVM_operand_str, MVM_operand_str } }, { MVM_OP_param_on2_u, "param_on2_u", " ", 4, 0, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_uint64, MVM_operand_str, MVM_operand_str, MVM_operand_ins } }, { MVM_OP_stat_time, "stat_time", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_lstat_time, "lstat_time", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_setdebugtypename, "setdebugtypename", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_loadbytecodebuffer, "loadbytecodebuffer", " ", 1, 0, 0, 0, 0, 1, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_loadbytecodefh, "loadbytecodefh", " ", 2, 0, 0, 0, 0, 1, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_throwpayloadlex, "throwpayloadlex", " ", 3, 0, 0, 0, 0, 2, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_throwpayloadlexcaller, "throwpayloadlexcaller", " ", 3, 0, 0, 0, 0, 2, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_lastexpayload, "lastexpayload", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_cancelnotify, "cancelnotify", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_decoderconfigure, "decoderconfigure", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_decodersetlineseps, "decodersetlineseps", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_decoderaddbytes, "decoderaddbytes", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_decodertakechars, "decodertakechars", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_decodertakeallchars, "decodertakeallchars", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_decodertakeavailablechars, "decodertakeavailablechars", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_decodertakeline, "decodertakeline", " ", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_decoderbytesavailable, "decoderbytesavailable", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_decodertakebytes, "decodertakebytes", " ", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_decoderempty, "decoderempty", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_indexingoptimized, "indexingoptimized", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_captureinnerlex, "captureinnerlex", " ", 1, 0, 0, 0, 1, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_unicmp_s, "unicmp_s", " ", 6, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_setdispatcherfor, "setdispatcherfor", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getstrfromname, "getstrfromname", " ", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_indexic_s, "indexic_s", " ", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_getport_sk, "getport_sk", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_cpucores, "cpucores", " ", 1, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64 } }, { MVM_OP_eqaticim_s, "eqaticim_s", " ", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_indexicim_s, "indexicim_s", " ", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_decodertakecharseof, "decodertakecharseof", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_indexim_s, "indexim_s", " ", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_cas_o, "cas_o", " ", 4, 0, 0, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_cas_i, "cas_i", " ", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_atomicinc_i, "atomicinc_i", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_atomicdec_i, "atomicdec_i", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_atomicadd_i, "atomicadd_i", " ", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_atomicload_o, "atomicload_o", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_atomicload_i, "atomicload_i", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_atomicstore_o, "atomicstore_o", " ", 2, 0, 0, 0, 0, 1, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_atomicstore_i, "atomicstore_i", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_barrierfull, "barrierfull", " ", 0, 0, 0, 0, 0, 0, 0, }, { MVM_OP_coveragecontrol, "coveragecontrol", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_nativeinvoke_v, "nativeinvoke_v", "-a", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_nativeinvoke_i, "nativeinvoke_i", "-a", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_nativeinvoke_n, "nativeinvoke_n", "-a", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_nativeinvoke_s, "nativeinvoke_s", "-a", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_nativeinvoke_o, "nativeinvoke_o", "-a", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_getarg_i, "getarg_i", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_int16 } }, { MVM_OP_getarg_n, "getarg_n", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_int16 } }, { MVM_OP_getarg_s, "getarg_s", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int16 } }, { MVM_OP_getarg_o, "getarg_o", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int16 } }, { MVM_OP_coerce_II, "coerce_II", " ", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_encoderepconf, "encoderepconf", " ", 6, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_encodeconf, "encodeconf", " ", 5, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_decodeconf, "decodeconf", " ", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_decoderepconf, "decoderepconf", " ", 5, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_getppid, "getppid", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64 } }, { MVM_OP_sp_guard, "sp_guard", ".s", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_spesh_slot, MVM_operand_uint32 } }, { MVM_OP_sp_guardconc, "sp_guardconc", ".s", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_spesh_slot, MVM_operand_uint32 } }, { MVM_OP_sp_guardtype, "sp_guardtype", ".s", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_spesh_slot, MVM_operand_uint32 } }, { MVM_OP_sp_guardsf, "sp_guardsf", ".s", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_spesh_slot, MVM_operand_uint32 } }, { MVM_OP_sp_guardsfouter, "sp_guardsfouter", ".s", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_spesh_slot, MVM_operand_uint32 } }, { MVM_OP_sp_rebless, "sp_rebless", ".s", 4, 0, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_uint32 } }, { MVM_OP_sp_resolvecode, "sp_resolvecode", ".s", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_sp_decont, "sp_decont", ".s", 2, 1, 0, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_sp_getlex_o, "sp_getlex_o", ".s", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_lex | MVM_operand_obj } }, { MVM_OP_sp_getlex_ins, "sp_getlex_ins", ".s", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_type_var, MVM_operand_read_lex | MVM_operand_type_var } }, { MVM_OP_sp_getlex_no, "sp_getlex_no", ".s", 2, 1, 0, 0, 1, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_str } }, { MVM_OP_sp_getarg_o, "sp_getarg_o", ".s", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_getarg_i, "sp_getarg_i", ".s", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_getarg_n, "sp_getarg_n", ".s", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_getarg_s, "sp_getarg_s", ".s", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_fastinvoke_v, "sp_fastinvoke_v", ".s", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_fastinvoke_i, "sp_fastinvoke_i", ".s", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_fastinvoke_n, "sp_fastinvoke_n", ".s", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_fastinvoke_s, "sp_fastinvoke_s", ".s", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_fastinvoke_o, "sp_fastinvoke_o", ".s", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_paramnamesused, "sp_paramnamesused", " ", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_spesh_slot } }, { MVM_OP_sp_getspeshslot, "sp_getspeshslot", ".s", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_spesh_slot } }, { MVM_OP_sp_findmeth, "sp_findmeth", ".s", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_str, MVM_operand_spesh_slot } }, { MVM_OP_sp_fastcreate, "sp_fastcreate", ".s", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_spesh_slot } }, { MVM_OP_sp_get_o, "sp_get_o", ".s", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_get_i64, "sp_get_i64", ".s", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_get_i32, "sp_get_i32", ".s", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_get_i16, "sp_get_i16", ".s", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_get_i8, "sp_get_i8", ".s", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_get_n, "sp_get_n", ".s", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_get_s, "sp_get_s", ".s", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_bind_o, "sp_bind_o", ".s", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_sp_bind_i64, "sp_bind_i64", ".s", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_sp_bind_i32, "sp_bind_i32", ".s", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_sp_bind_i16, "sp_bind_i16", ".s", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_sp_bind_i8, "sp_bind_i8", ".s", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_sp_bind_n, "sp_bind_n", ".s", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_sp_bind_s, "sp_bind_s", ".s", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_sp_p6oget_o, "sp_p6oget_o", ".s", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_p6ogetvt_o, "sp_p6ogetvt_o", ".s", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_spesh_slot } }, { MVM_OP_sp_p6ogetvc_o, "sp_p6ogetvc_o", ".s", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_spesh_slot } }, { MVM_OP_sp_p6oget_i, "sp_p6oget_i", ".s", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_p6oget_n, "sp_p6oget_n", ".s", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_p6oget_s, "sp_p6oget_s", ".s", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_str, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_p6obind_o, "sp_p6obind_o", ".s", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_sp_p6obind_i, "sp_p6obind_i", ".s", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_int64 } }, { MVM_OP_sp_p6obind_n, "sp_p6obind_n", ".s", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_num64 } }, { MVM_OP_sp_p6obind_s, "sp_p6obind_s", ".s", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_str } }, { MVM_OP_sp_deref_get_i64, "sp_deref_get_i64", ".s", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_deref_get_n, "sp_deref_get_n", ".s", 3, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_num64, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_sp_deref_bind_i64, "sp_deref_bind_i64", ".s", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_int64, MVM_operand_int16 } }, { MVM_OP_sp_deref_bind_n, "sp_deref_bind_n", ".s", 3, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_num64, MVM_operand_int16 } }, { MVM_OP_sp_getlexvia_o, "sp_getlexvia_o", ".s", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_int16, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_sp_getlexvia_ins, "sp_getlexvia_ins", ".s", 4, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_type_var, MVM_operand_int16, MVM_operand_int16, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_sp_jit_enter, "sp_jit_enter", ".s", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj } }, { MVM_OP_sp_boolify_iter, "sp_boolify_iter", ".s", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_sp_boolify_iter_arr, "sp_boolify_iter_arr", ".s", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_sp_boolify_iter_hash, "sp_boolify_iter_hash", ".s", 2, 1, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_int64, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_sp_cas_o, "sp_cas_o", " ", 4, 0, 0, 0, 0, 1, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_sp_atomicload_o, "sp_atomicload_o", " ", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_write_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_sp_atomicstore_o, "sp_atomicstore_o", " ", 2, 0, 0, 0, 0, 1, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_prof_enter, "prof_enter", ".s", 0, 0, 0, 0, 0, 0, 0, }, { MVM_OP_prof_enterspesh, "prof_enterspesh", ".s", 0, 0, 0, 0, 0, 0, 0, }, { MVM_OP_prof_enterinline, "prof_enterinline", ".s", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_spesh_slot } }, { MVM_OP_prof_enternative, "prof_enternative", ".s", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_prof_exit, "prof_exit", " ", 0, 0, 0, 0, 0, 0, 0, }, { MVM_OP_prof_allocated, "prof_allocated", ".s", 1, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj } }, { MVM_OP_ctw_check, "ctw_check", ".s", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_read_reg | MVM_operand_obj, MVM_operand_int16 } }, { MVM_OP_coverage_log, "coverage_log", ".s", 4, 0, 0, 0, 0, 0, 0, { MVM_operand_str, MVM_operand_int32, MVM_operand_int32, MVM_operand_int64 } }, { MVM_OP_breakpoint, "breakpoint", ".s", 2, 0, 0, 0, 0, 0, 0, { MVM_operand_int32, MVM_operand_int32 } }, }; static const unsigned short MVM_op_counts = 863; MVM_PUBLIC const MVMOpInfo * MVM_op_get_op(unsigned short op) { if (op >= MVM_op_counts) return NULL; return &MVM_op_infos[op]; } MoarVM-2018.03/src/core/ops.h0000644000175000017510000006177313252330426015712 0ustar samanthasamantha/* This file is generated from src/core/oplist by tools/update_ops.p6. */ /* Op name defines. */ #define MVM_OP_no_op 0 #define MVM_OP_const_i8 1 #define MVM_OP_const_i16 2 #define MVM_OP_const_i32 3 #define MVM_OP_const_i64 4 #define MVM_OP_const_n32 5 #define MVM_OP_const_n64 6 #define MVM_OP_const_s 7 #define MVM_OP_set 8 #define MVM_OP_extend_u8 9 #define MVM_OP_extend_u16 10 #define MVM_OP_extend_u32 11 #define MVM_OP_extend_i8 12 #define MVM_OP_extend_i16 13 #define MVM_OP_extend_i32 14 #define MVM_OP_trunc_u8 15 #define MVM_OP_trunc_u16 16 #define MVM_OP_trunc_u32 17 #define MVM_OP_trunc_i8 18 #define MVM_OP_trunc_i16 19 #define MVM_OP_trunc_i32 20 #define MVM_OP_extend_n32 21 #define MVM_OP_trunc_n32 22 #define MVM_OP_goto 23 #define MVM_OP_if_i 24 #define MVM_OP_unless_i 25 #define MVM_OP_if_n 26 #define MVM_OP_unless_n 27 #define MVM_OP_if_s 28 #define MVM_OP_unless_s 29 #define MVM_OP_if_s0 30 #define MVM_OP_unless_s0 31 #define MVM_OP_if_o 32 #define MVM_OP_unless_o 33 #define MVM_OP_jumplist 34 #define MVM_OP_getlex 35 #define MVM_OP_bindlex 36 #define MVM_OP_getlex_ni 37 #define MVM_OP_getlex_nn 38 #define MVM_OP_getlex_ns 39 #define MVM_OP_getlex_no 40 #define MVM_OP_bindlex_ni 41 #define MVM_OP_bindlex_nn 42 #define MVM_OP_bindlex_ns 43 #define MVM_OP_bindlex_no 44 #define MVM_OP_getlex_ng 45 #define MVM_OP_bindlex_ng 46 #define MVM_OP_getdynlex 47 #define MVM_OP_binddynlex 48 #define MVM_OP_setlexvalue 49 #define MVM_OP_lexprimspec 50 #define MVM_OP_return_i 51 #define MVM_OP_return_n 52 #define MVM_OP_return_s 53 #define MVM_OP_return_o 54 #define MVM_OP_return 55 #define MVM_OP_eq_i 56 #define MVM_OP_ne_i 57 #define MVM_OP_lt_i 58 #define MVM_OP_le_i 59 #define MVM_OP_gt_i 60 #define MVM_OP_ge_i 61 #define MVM_OP_cmp_i 62 #define MVM_OP_add_i 63 #define MVM_OP_sub_i 64 #define MVM_OP_mul_i 65 #define MVM_OP_div_i 66 #define MVM_OP_div_u 67 #define MVM_OP_mod_i 68 #define MVM_OP_mod_u 69 #define MVM_OP_neg_i 70 #define MVM_OP_abs_i 71 #define MVM_OP_inc_i 72 #define MVM_OP_inc_u 73 #define MVM_OP_dec_i 74 #define MVM_OP_dec_u 75 #define MVM_OP_band_i 76 #define MVM_OP_bor_i 77 #define MVM_OP_bxor_i 78 #define MVM_OP_bnot_i 79 #define MVM_OP_blshift_i 80 #define MVM_OP_brshift_i 81 #define MVM_OP_pow_i 82 #define MVM_OP_not_i 83 #define MVM_OP_gcd_i 84 #define MVM_OP_lcm_i 85 #define MVM_OP_eq_n 86 #define MVM_OP_ne_n 87 #define MVM_OP_lt_n 88 #define MVM_OP_le_n 89 #define MVM_OP_gt_n 90 #define MVM_OP_ge_n 91 #define MVM_OP_cmp_n 92 #define MVM_OP_add_n 93 #define MVM_OP_sub_n 94 #define MVM_OP_mul_n 95 #define MVM_OP_div_n 96 #define MVM_OP_mod_n 97 #define MVM_OP_neg_n 98 #define MVM_OP_abs_n 99 #define MVM_OP_pow_n 100 #define MVM_OP_ceil_n 101 #define MVM_OP_floor_n 102 #define MVM_OP_sin_n 103 #define MVM_OP_asin_n 104 #define MVM_OP_cos_n 105 #define MVM_OP_acos_n 106 #define MVM_OP_tan_n 107 #define MVM_OP_atan_n 108 #define MVM_OP_atan2_n 109 #define MVM_OP_sec_n 110 #define MVM_OP_asec_n 111 #define MVM_OP_sinh_n 112 #define MVM_OP_cosh_n 113 #define MVM_OP_tanh_n 114 #define MVM_OP_sech_n 115 #define MVM_OP_sqrt_n 116 #define MVM_OP_log_n 117 #define MVM_OP_exp_n 118 #define MVM_OP_coerce_in 119 #define MVM_OP_coerce_ni 120 #define MVM_OP_coerce_is 121 #define MVM_OP_coerce_ns 122 #define MVM_OP_coerce_si 123 #define MVM_OP_coerce_sn 124 #define MVM_OP_smrt_numify 125 #define MVM_OP_smrt_strify 126 #define MVM_OP_prepargs 127 #define MVM_OP_arg_i 128 #define MVM_OP_arg_n 129 #define MVM_OP_arg_s 130 #define MVM_OP_arg_o 131 #define MVM_OP_argconst_i 132 #define MVM_OP_argconst_n 133 #define MVM_OP_argconst_s 134 #define MVM_OP_invoke_v 135 #define MVM_OP_invoke_i 136 #define MVM_OP_invoke_n 137 #define MVM_OP_invoke_s 138 #define MVM_OP_invoke_o 139 #define MVM_OP_checkarity 140 #define MVM_OP_param_rp_i 141 #define MVM_OP_param_rp_n 142 #define MVM_OP_param_rp_s 143 #define MVM_OP_param_rp_o 144 #define MVM_OP_param_op_i 145 #define MVM_OP_param_op_n 146 #define MVM_OP_param_op_s 147 #define MVM_OP_param_op_o 148 #define MVM_OP_param_rn_i 149 #define MVM_OP_param_rn_n 150 #define MVM_OP_param_rn_s 151 #define MVM_OP_param_rn_o 152 #define MVM_OP_param_on_i 153 #define MVM_OP_param_on_n 154 #define MVM_OP_param_on_s 155 #define MVM_OP_param_on_o 156 #define MVM_OP_param_sp 157 #define MVM_OP_param_sn 158 #define MVM_OP_getcode 159 #define MVM_OP_caller 160 #define MVM_OP_capturelex 161 #define MVM_OP_takeclosure 162 #define MVM_OP_exception 163 #define MVM_OP_bindexmessage 164 #define MVM_OP_bindexpayload 165 #define MVM_OP_bindexcategory 166 #define MVM_OP_getexmessage 167 #define MVM_OP_getexpayload 168 #define MVM_OP_getexcategory 169 #define MVM_OP_throwdyn 170 #define MVM_OP_throwlex 171 #define MVM_OP_throwlexotic 172 #define MVM_OP_throwcatdyn 173 #define MVM_OP_throwcatlex 174 #define MVM_OP_throwcatlexotic 175 #define MVM_OP_die 176 #define MVM_OP_rethrow 177 #define MVM_OP_resume 178 #define MVM_OP_takehandlerresult 179 #define MVM_OP_DEPRECATED_33 180 #define MVM_OP_DEPRECATED_34 181 #define MVM_OP_backtracestrings 182 #define MVM_OP_usecapture 183 #define MVM_OP_savecapture 184 #define MVM_OP_captureposelems 185 #define MVM_OP_captureposarg 186 #define MVM_OP_captureposarg_i 187 #define MVM_OP_captureposarg_n 188 #define MVM_OP_captureposarg_s 189 #define MVM_OP_captureposprimspec 190 #define MVM_OP_captureexistsnamed 191 #define MVM_OP_capturehasnameds 192 #define MVM_OP_invokewithcapture 193 #define MVM_OP_multicacheadd 194 #define MVM_OP_multicachefind 195 #define MVM_OP_null_s 196 #define MVM_OP_isnull_s 197 #define MVM_OP_eq_s 198 #define MVM_OP_ne_s 199 #define MVM_OP_gt_s 200 #define MVM_OP_ge_s 201 #define MVM_OP_lt_s 202 #define MVM_OP_le_s 203 #define MVM_OP_cmp_s 204 #define MVM_OP_eqat_s 205 #define MVM_OP_eqatic_s 206 #define MVM_OP_haveat_s 207 #define MVM_OP_concat_s 208 #define MVM_OP_repeat_s 209 #define MVM_OP_substr_s 210 #define MVM_OP_index_s 211 #define MVM_OP_graphs_s 212 #define MVM_OP_codes_s 213 #define MVM_OP_getcp_s 214 #define MVM_OP_indexcp_s 215 #define MVM_OP_uc 216 #define MVM_OP_lc 217 #define MVM_OP_tc 218 #define MVM_OP_split 219 #define MVM_OP_join 220 #define MVM_OP_getcpbyname 221 #define MVM_OP_indexat 222 #define MVM_OP_indexnat 223 #define MVM_OP_unipropcode 224 #define MVM_OP_unipvalcode 225 #define MVM_OP_hasuniprop 226 #define MVM_OP_hasunipropc 227 #define MVM_OP_chars 228 #define MVM_OP_chr 229 #define MVM_OP_ordfirst 230 #define MVM_OP_ordat 231 #define MVM_OP_rindexfrom 232 #define MVM_OP_escape 233 #define MVM_OP_flip 234 #define MVM_OP_setbuffersize_fh 235 #define MVM_OP_iscclass 236 #define MVM_OP_findcclass 237 #define MVM_OP_findnotcclass 238 #define MVM_OP_nfafromstatelist 239 #define MVM_OP_nfarunproto 240 #define MVM_OP_nfarunalt 241 #define MVM_OP_radix 242 #define MVM_OP_encode 243 #define MVM_OP_decode 244 #define MVM_OP_istrue_s 245 #define MVM_OP_isfalse_s 246 #define MVM_OP_null 247 #define MVM_OP_isnull 248 #define MVM_OP_ifnonnull 249 #define MVM_OP_findmeth 250 #define MVM_OP_findmeth_s 251 #define MVM_OP_can 252 #define MVM_OP_can_s 253 #define MVM_OP_create 254 #define MVM_OP_clone 255 #define MVM_OP_isconcrete 256 #define MVM_OP_rebless 257 #define MVM_OP_istype 258 #define MVM_OP_objprimspec 259 #define MVM_OP_gethow 260 #define MVM_OP_getwhat 261 #define MVM_OP_getwho 262 #define MVM_OP_setwho 263 #define MVM_OP_reprname 264 #define MVM_OP_getwhere 265 #define MVM_OP_eqaddr 266 #define MVM_OP_bindattr_i 267 #define MVM_OP_bindattr_n 268 #define MVM_OP_bindattr_s 269 #define MVM_OP_bindattr_o 270 #define MVM_OP_bindattrs_i 271 #define MVM_OP_bindattrs_n 272 #define MVM_OP_bindattrs_s 273 #define MVM_OP_bindattrs_o 274 #define MVM_OP_getattr_i 275 #define MVM_OP_getattr_n 276 #define MVM_OP_getattr_s 277 #define MVM_OP_getattr_o 278 #define MVM_OP_getattrs_i 279 #define MVM_OP_getattrs_n 280 #define MVM_OP_getattrs_s 281 #define MVM_OP_getattrs_o 282 #define MVM_OP_attrinited 283 #define MVM_OP_box_i 284 #define MVM_OP_box_n 285 #define MVM_OP_box_s 286 #define MVM_OP_unbox_i 287 #define MVM_OP_unbox_n 288 #define MVM_OP_unbox_s 289 #define MVM_OP_atpos_i 290 #define MVM_OP_atpos_n 291 #define MVM_OP_atpos_s 292 #define MVM_OP_atpos_o 293 #define MVM_OP_bindpos_i 294 #define MVM_OP_bindpos_n 295 #define MVM_OP_bindpos_s 296 #define MVM_OP_bindpos_o 297 #define MVM_OP_push_i 298 #define MVM_OP_push_n 299 #define MVM_OP_push_s 300 #define MVM_OP_push_o 301 #define MVM_OP_pop_i 302 #define MVM_OP_pop_n 303 #define MVM_OP_pop_s 304 #define MVM_OP_pop_o 305 #define MVM_OP_shift_i 306 #define MVM_OP_shift_n 307 #define MVM_OP_shift_s 308 #define MVM_OP_shift_o 309 #define MVM_OP_unshift_i 310 #define MVM_OP_unshift_n 311 #define MVM_OP_unshift_s 312 #define MVM_OP_unshift_o 313 #define MVM_OP_splice 314 #define MVM_OP_setelemspos 315 #define MVM_OP_existspos 316 #define MVM_OP_atkey_i 317 #define MVM_OP_atkey_n 318 #define MVM_OP_atkey_s 319 #define MVM_OP_atkey_o 320 #define MVM_OP_bindkey_i 321 #define MVM_OP_bindkey_n 322 #define MVM_OP_bindkey_s 323 #define MVM_OP_bindkey_o 324 #define MVM_OP_existskey 325 #define MVM_OP_deletekey 326 #define MVM_OP_elems 327 #define MVM_OP_knowhow 328 #define MVM_OP_knowhowattr 329 #define MVM_OP_newtype 330 #define MVM_OP_composetype 331 #define MVM_OP_setmethcache 332 #define MVM_OP_setmethcacheauth 333 #define MVM_OP_settypecache 334 #define MVM_OP_settypecheckmode 335 #define MVM_OP_setboolspec 336 #define MVM_OP_istrue 337 #define MVM_OP_isfalse 338 #define MVM_OP_bootint 339 #define MVM_OP_bootnum 340 #define MVM_OP_bootstr 341 #define MVM_OP_bootarray 342 #define MVM_OP_bootintarray 343 #define MVM_OP_bootnumarray 344 #define MVM_OP_bootstrarray 345 #define MVM_OP_boothash 346 #define MVM_OP_isint 347 #define MVM_OP_isnum 348 #define MVM_OP_isstr 349 #define MVM_OP_islist 350 #define MVM_OP_ishash 351 #define MVM_OP_sethllconfig 352 #define MVM_OP_hllboxtype_i 353 #define MVM_OP_hllboxtype_n 354 #define MVM_OP_hllboxtype_s 355 #define MVM_OP_hlllist 356 #define MVM_OP_hllhash 357 #define MVM_OP_getcomp 358 #define MVM_OP_bindcomp 359 #define MVM_OP_getcurhllsym 360 #define MVM_OP_bindcurhllsym 361 #define MVM_OP_gethllsym 362 #define MVM_OP_bindhllsym 363 #define MVM_OP_settypehll 364 #define MVM_OP_settypehllrole 365 #define MVM_OP_hllize 366 #define MVM_OP_hllizefor 367 #define MVM_OP_usecompileehllconfig 368 #define MVM_OP_usecompilerhllconfig 369 #define MVM_OP_iter 370 #define MVM_OP_iterkey_s 371 #define MVM_OP_iterval 372 #define MVM_OP_getcodename 373 #define MVM_OP_iscoderef 374 #define MVM_OP_getcodeobj 375 #define MVM_OP_setcodeobj 376 #define MVM_OP_setcodename 377 #define MVM_OP_forceouterctx 378 #define MVM_OP_setinvokespec 379 #define MVM_OP_isinvokable 380 #define MVM_OP_freshcoderef 381 #define MVM_OP_markcodestatic 382 #define MVM_OP_markcodestub 383 #define MVM_OP_getstaticcode 384 #define MVM_OP_getcodecuid 385 #define MVM_OP_setdispatcher 386 #define MVM_OP_takedispatcher 387 #define MVM_OP_assign 388 #define MVM_OP_assignunchecked 389 #define MVM_OP_iscont 390 #define MVM_OP_decont 391 #define MVM_OP_setcontspec 392 #define MVM_OP_sha1 393 #define MVM_OP_createsc 394 #define MVM_OP_scsetobj 395 #define MVM_OP_scsetcode 396 #define MVM_OP_scgetobj 397 #define MVM_OP_scgethandle 398 #define MVM_OP_scgetobjidx 399 #define MVM_OP_scsetdesc 400 #define MVM_OP_scobjcount 401 #define MVM_OP_setobjsc 402 #define MVM_OP_getobjsc 403 #define MVM_OP_serialize 404 #define MVM_OP_deserialize 405 #define MVM_OP_wval 406 #define MVM_OP_wval_wide 407 #define MVM_OP_scwbdisable 408 #define MVM_OP_scwbenable 409 #define MVM_OP_pushcompsc 410 #define MVM_OP_popcompsc 411 #define MVM_OP_scgetdesc 412 #define MVM_OP_loadbytecode 413 #define MVM_OP_masttofile 414 #define MVM_OP_masttocu 415 #define MVM_OP_iscompunit 416 #define MVM_OP_compunitmainline 417 #define MVM_OP_compunitcodes 418 #define MVM_OP_ctx 419 #define MVM_OP_ctxouter 420 #define MVM_OP_ctxcaller 421 #define MVM_OP_ctxlexpad 422 #define MVM_OP_curcode 423 #define MVM_OP_callercode 424 #define MVM_OP_add_I 425 #define MVM_OP_sub_I 426 #define MVM_OP_mul_I 427 #define MVM_OP_div_I 428 #define MVM_OP_mod_I 429 #define MVM_OP_neg_I 430 #define MVM_OP_abs_I 431 #define MVM_OP_cmp_I 432 #define MVM_OP_eq_I 433 #define MVM_OP_ne_I 434 #define MVM_OP_lt_I 435 #define MVM_OP_le_I 436 #define MVM_OP_gt_I 437 #define MVM_OP_ge_I 438 #define MVM_OP_bor_I 439 #define MVM_OP_bxor_I 440 #define MVM_OP_band_I 441 #define MVM_OP_bnot_I 442 #define MVM_OP_blshift_I 443 #define MVM_OP_brshift_I 444 #define MVM_OP_pow_I 445 #define MVM_OP_gcd_I 446 #define MVM_OP_lcm_I 447 #define MVM_OP_expmod_I 448 #define MVM_OP_isprime_I 449 #define MVM_OP_rand_I 450 #define MVM_OP_coerce_In 451 #define MVM_OP_coerce_Is 452 #define MVM_OP_coerce_nI 453 #define MVM_OP_coerce_sI 454 #define MVM_OP_isbig_I 455 #define MVM_OP_bool_I 456 #define MVM_OP_base_I 457 #define MVM_OP_radix_I 458 #define MVM_OP_div_In 459 #define MVM_OP_copy_f 460 #define MVM_OP_append_f 461 #define MVM_OP_rename_f 462 #define MVM_OP_delete_f 463 #define MVM_OP_chmod_f 464 #define MVM_OP_exists_f 465 #define MVM_OP_mkdir 466 #define MVM_OP_rmdir 467 #define MVM_OP_open_dir 468 #define MVM_OP_read_dir 469 #define MVM_OP_close_dir 470 #define MVM_OP_open_fh 471 #define MVM_OP_close_fh 472 #define MVM_OP_DEPRECATED_23 473 #define MVM_OP_DEPRECATED_27 474 #define MVM_OP_DEPRECATED_28 475 #define MVM_OP_DEPRECATED_18 476 #define MVM_OP_seek_fh 477 #define MVM_OP_lock_fh 478 #define MVM_OP_unlock_fh 479 #define MVM_OP_sync_fh 480 #define MVM_OP_trunc_fh 481 #define MVM_OP_eof_fh 482 #define MVM_OP_getstdin 483 #define MVM_OP_getstdout 484 #define MVM_OP_getstderr 485 #define MVM_OP_connect_sk 486 #define MVM_OP_socket 487 #define MVM_OP_bind_sk 488 #define MVM_OP_DEPRECATED_24 489 #define MVM_OP_accept_sk 490 #define MVM_OP_decodetocodes 491 #define MVM_OP_encodefromcodes 492 #define MVM_OP_DEPRECATED_17 493 #define MVM_OP_print 494 #define MVM_OP_say 495 #define MVM_OP_DEPRECATED_22 496 #define MVM_OP_tell_fh 497 #define MVM_OP_stat 498 #define MVM_OP_tryfindmeth 499 #define MVM_OP_tryfindmeth_s 500 #define MVM_OP_chdir 501 #define MVM_OP_srand 502 #define MVM_OP_rand_i 503 #define MVM_OP_rand_n 504 #define MVM_OP_time_i 505 #define MVM_OP_sleep 506 #define MVM_OP_newthread 507 #define MVM_OP_threadjoin 508 #define MVM_OP_time_n 509 #define MVM_OP_exit 510 #define MVM_OP_DEPRECATED_30 511 #define MVM_OP_cwd 512 #define MVM_OP_clargs 513 #define MVM_OP_getenvhash 514 #define MVM_OP_loadlib 515 #define MVM_OP_freelib 516 #define MVM_OP_findsym 517 #define MVM_OP_dropsym 518 #define MVM_OP_loadext 519 #define MVM_OP_backendconfig 520 #define MVM_OP_getlexouter 521 #define MVM_OP_getlexrel 522 #define MVM_OP_getlexreldyn 523 #define MVM_OP_getlexrelcaller 524 #define MVM_OP_getlexcaller 525 #define MVM_OP_bitand_s 526 #define MVM_OP_bitor_s 527 #define MVM_OP_bitxor_s 528 #define MVM_OP_isnanorinf 529 #define MVM_OP_inf 530 #define MVM_OP_neginf 531 #define MVM_OP_nan 532 #define MVM_OP_getpid 533 #define MVM_OP_DEPRECATED_29 534 #define MVM_OP_filereadable 535 #define MVM_OP_filewritable 536 #define MVM_OP_fileexecutable 537 #define MVM_OP_DEPRECATED_19 538 #define MVM_OP_capturenamedshash 539 #define MVM_OP_read_fhb 540 #define MVM_OP_write_fhb 541 #define MVM_OP_replace 542 #define MVM_OP_newexception 543 #define MVM_OP_permit 544 #define MVM_OP_backtrace 545 #define MVM_OP_symlink 546 #define MVM_OP_link 547 #define MVM_OP_gethostname 548 #define MVM_OP_exreturnafterunwind 549 #define MVM_OP_DEPRECATED_13 550 #define MVM_OP_continuationreset 551 #define MVM_OP_continuationcontrol 552 #define MVM_OP_continuationinvoke 553 #define MVM_OP_randscale_n 554 #define MVM_OP_uniisblock 555 #define MVM_OP_assertparamcheck 556 #define MVM_OP_hintfor 557 #define MVM_OP_paramnamesused 558 #define MVM_OP_getuniname 559 #define MVM_OP_getuniprop_int 560 #define MVM_OP_getuniprop_bool 561 #define MVM_OP_getuniprop_str 562 #define MVM_OP_matchuniprop 563 #define MVM_OP_nativecallbuild 564 #define MVM_OP_nativecallinvoke 565 #define MVM_OP_nativecallrefresh 566 #define MVM_OP_threadrun 567 #define MVM_OP_threadid 568 #define MVM_OP_threadyield 569 #define MVM_OP_currentthread 570 #define MVM_OP_lock 571 #define MVM_OP_unlock 572 #define MVM_OP_semacquire 573 #define MVM_OP_semtryacquire 574 #define MVM_OP_semrelease 575 #define MVM_OP_getlockcondvar 576 #define MVM_OP_condwait 577 #define MVM_OP_condsignalone 578 #define MVM_OP_condsignalall 579 #define MVM_OP_queuepoll 580 #define MVM_OP_setmultispec 581 #define MVM_OP_ctxouterskipthunks 582 #define MVM_OP_ctxcallerskipthunks 583 #define MVM_OP_timer 584 #define MVM_OP_cancel 585 #define MVM_OP_signal 586 #define MVM_OP_watchfile 587 #define MVM_OP_asyncconnect 588 #define MVM_OP_asynclisten 589 #define MVM_OP_DEPRECATED_14 590 #define MVM_OP_asyncwritebytes 591 #define MVM_OP_DEPRECATED_16 592 #define MVM_OP_asyncreadbytes 593 #define MVM_OP_getlexstatic_o 594 #define MVM_OP_getlexperinvtype_o 595 #define MVM_OP_execname 596 #define MVM_OP_const_i64_16 597 #define MVM_OP_const_i64_32 598 #define MVM_OP_isnonnull 599 #define MVM_OP_param_rn2_i 600 #define MVM_OP_param_rn2_n 601 #define MVM_OP_param_rn2_s 602 #define MVM_OP_param_rn2_o 603 #define MVM_OP_param_on2_i 604 #define MVM_OP_param_on2_n 605 #define MVM_OP_param_on2_s 606 #define MVM_OP_param_on2_o 607 #define MVM_OP_osrpoint 608 #define MVM_OP_nativecallcast 609 #define MVM_OP_spawnprocasync 610 #define MVM_OP_killprocasync 611 #define MVM_OP_startprofile 612 #define MVM_OP_endprofile 613 #define MVM_OP_objectid 614 #define MVM_OP_settypefinalize 615 #define MVM_OP_force_gc 616 #define MVM_OP_nativecallglobal 617 #define MVM_OP_DEPRECATED_32 618 #define MVM_OP_setparameterizer 619 #define MVM_OP_parameterizetype 620 #define MVM_OP_typeparameterized 621 #define MVM_OP_typeparameters 622 #define MVM_OP_typeparameterat 623 #define MVM_OP_readlink 624 #define MVM_OP_lstat 625 #define MVM_OP_iscont_i 626 #define MVM_OP_iscont_n 627 #define MVM_OP_iscont_s 628 #define MVM_OP_assign_i 629 #define MVM_OP_assign_n 630 #define MVM_OP_assign_s 631 #define MVM_OP_decont_i 632 #define MVM_OP_decont_n 633 #define MVM_OP_decont_s 634 #define MVM_OP_getrusage 635 #define MVM_OP_threadlockcount 636 #define MVM_OP_DEPRECATED_4 637 #define MVM_OP_getlexref_i 638 #define MVM_OP_getlexref_n 639 #define MVM_OP_getlexref_s 640 #define MVM_OP_getlexref_ni 641 #define MVM_OP_getlexref_nn 642 #define MVM_OP_getlexref_ns 643 #define MVM_OP_atposref_i 644 #define MVM_OP_atposref_n 645 #define MVM_OP_atposref_s 646 #define MVM_OP_getattrref_i 647 #define MVM_OP_getattrref_n 648 #define MVM_OP_getattrref_s 649 #define MVM_OP_getattrsref_i 650 #define MVM_OP_getattrsref_n 651 #define MVM_OP_getattrsref_s 652 #define MVM_OP_nativecallsizeof 653 #define MVM_OP_encodenorm 654 #define MVM_OP_normalizecodes 655 #define MVM_OP_strfromcodes 656 #define MVM_OP_strtocodes 657 #define MVM_OP_getcodelocation 658 #define MVM_OP_eqatim_s 659 #define MVM_OP_ordbaseat 660 #define MVM_OP_neverrepossess 661 #define MVM_OP_scdisclaim 662 #define MVM_OP_DEPRECATED_31 663 #define MVM_OP_atpos2d_i 664 #define MVM_OP_atpos2d_n 665 #define MVM_OP_atpos2d_s 666 #define MVM_OP_atpos2d_o 667 #define MVM_OP_atpos3d_i 668 #define MVM_OP_atpos3d_n 669 #define MVM_OP_atpos3d_s 670 #define MVM_OP_atpos3d_o 671 #define MVM_OP_atposnd_i 672 #define MVM_OP_atposnd_n 673 #define MVM_OP_atposnd_s 674 #define MVM_OP_atposnd_o 675 #define MVM_OP_bindpos2d_i 676 #define MVM_OP_bindpos2d_n 677 #define MVM_OP_bindpos2d_s 678 #define MVM_OP_bindpos2d_o 679 #define MVM_OP_bindpos3d_i 680 #define MVM_OP_bindpos3d_n 681 #define MVM_OP_bindpos3d_s 682 #define MVM_OP_bindpos3d_o 683 #define MVM_OP_bindposnd_i 684 #define MVM_OP_bindposnd_n 685 #define MVM_OP_bindposnd_s 686 #define MVM_OP_bindposnd_o 687 #define MVM_OP_dimensions 688 #define MVM_OP_setdimensions 689 #define MVM_OP_numdimensions 690 #define MVM_OP_ctxcode 691 #define MVM_OP_isrwcont 692 #define MVM_OP_fc 693 #define MVM_OP_DEPRECATED_25 694 #define MVM_OP_DEPRECATED_21 695 #define MVM_OP_encoderep 696 #define MVM_OP_istty_fh 697 #define MVM_OP_multidimref_i 698 #define MVM_OP_multidimref_n 699 #define MVM_OP_multidimref_s 700 #define MVM_OP_fileno_fh 701 #define MVM_OP_asyncudp 702 #define MVM_OP_DEPRECATED_15 703 #define MVM_OP_asyncwritebytesto 704 #define MVM_OP_objprimbits 705 #define MVM_OP_objprimunsigned 706 #define MVM_OP_DEPRECATED_5 707 #define MVM_OP_DEPRECATED_6 708 #define MVM_OP_DEPRECATED_7 709 #define MVM_OP_DEPRECATED_8 710 #define MVM_OP_getlexref_i32 711 #define MVM_OP_getlexref_i16 712 #define MVM_OP_getlexref_i8 713 #define MVM_OP_getlexref_n32 714 #define MVM_OP_box_u 715 #define MVM_OP_unbox_u 716 #define MVM_OP_coerce_iu 717 #define MVM_OP_coerce_ui 718 #define MVM_OP_coerce_nu 719 #define MVM_OP_coerce_un 720 #define MVM_OP_decont_u 721 #define MVM_OP_DEPRECATED_9 722 #define MVM_OP_DEPRECATED_10 723 #define MVM_OP_DEPRECATED_11 724 #define MVM_OP_DEPRECATED_12 725 #define MVM_OP_getlexref_u 726 #define MVM_OP_getlexref_u32 727 #define MVM_OP_getlexref_u16 728 #define MVM_OP_getlexref_u8 729 #define MVM_OP_param_rp_u 730 #define MVM_OP_param_op_u 731 #define MVM_OP_param_rn_u 732 #define MVM_OP_param_on_u 733 #define MVM_OP_param_rn2_u 734 #define MVM_OP_param_on2_u 735 #define MVM_OP_stat_time 736 #define MVM_OP_lstat_time 737 #define MVM_OP_setdebugtypename 738 #define MVM_OP_loadbytecodebuffer 739 #define MVM_OP_loadbytecodefh 740 #define MVM_OP_throwpayloadlex 741 #define MVM_OP_throwpayloadlexcaller 742 #define MVM_OP_lastexpayload 743 #define MVM_OP_cancelnotify 744 #define MVM_OP_decoderconfigure 745 #define MVM_OP_decodersetlineseps 746 #define MVM_OP_decoderaddbytes 747 #define MVM_OP_decodertakechars 748 #define MVM_OP_decodertakeallchars 749 #define MVM_OP_decodertakeavailablechars 750 #define MVM_OP_decodertakeline 751 #define MVM_OP_decoderbytesavailable 752 #define MVM_OP_decodertakebytes 753 #define MVM_OP_decoderempty 754 #define MVM_OP_indexingoptimized 755 #define MVM_OP_captureinnerlex 756 #define MVM_OP_unicmp_s 757 #define MVM_OP_setdispatcherfor 758 #define MVM_OP_getstrfromname 759 #define MVM_OP_indexic_s 760 #define MVM_OP_getport_sk 761 #define MVM_OP_cpucores 762 #define MVM_OP_eqaticim_s 763 #define MVM_OP_indexicim_s 764 #define MVM_OP_decodertakecharseof 765 #define MVM_OP_indexim_s 766 #define MVM_OP_cas_o 767 #define MVM_OP_cas_i 768 #define MVM_OP_atomicinc_i 769 #define MVM_OP_atomicdec_i 770 #define MVM_OP_atomicadd_i 771 #define MVM_OP_atomicload_o 772 #define MVM_OP_atomicload_i 773 #define MVM_OP_atomicstore_o 774 #define MVM_OP_atomicstore_i 775 #define MVM_OP_barrierfull 776 #define MVM_OP_coveragecontrol 777 #define MVM_OP_nativeinvoke_v 778 #define MVM_OP_nativeinvoke_i 779 #define MVM_OP_nativeinvoke_n 780 #define MVM_OP_nativeinvoke_s 781 #define MVM_OP_nativeinvoke_o 782 #define MVM_OP_getarg_i 783 #define MVM_OP_getarg_n 784 #define MVM_OP_getarg_s 785 #define MVM_OP_getarg_o 786 #define MVM_OP_coerce_II 787 #define MVM_OP_encoderepconf 788 #define MVM_OP_encodeconf 789 #define MVM_OP_decodeconf 790 #define MVM_OP_decoderepconf 791 #define MVM_OP_getppid 792 #define MVM_OP_sp_guard 793 #define MVM_OP_sp_guardconc 794 #define MVM_OP_sp_guardtype 795 #define MVM_OP_sp_guardsf 796 #define MVM_OP_sp_guardsfouter 797 #define MVM_OP_sp_rebless 798 #define MVM_OP_sp_resolvecode 799 #define MVM_OP_sp_decont 800 #define MVM_OP_sp_getlex_o 801 #define MVM_OP_sp_getlex_ins 802 #define MVM_OP_sp_getlex_no 803 #define MVM_OP_sp_getarg_o 804 #define MVM_OP_sp_getarg_i 805 #define MVM_OP_sp_getarg_n 806 #define MVM_OP_sp_getarg_s 807 #define MVM_OP_sp_fastinvoke_v 808 #define MVM_OP_sp_fastinvoke_i 809 #define MVM_OP_sp_fastinvoke_n 810 #define MVM_OP_sp_fastinvoke_s 811 #define MVM_OP_sp_fastinvoke_o 812 #define MVM_OP_sp_paramnamesused 813 #define MVM_OP_sp_getspeshslot 814 #define MVM_OP_sp_findmeth 815 #define MVM_OP_sp_fastcreate 816 #define MVM_OP_sp_get_o 817 #define MVM_OP_sp_get_i64 818 #define MVM_OP_sp_get_i32 819 #define MVM_OP_sp_get_i16 820 #define MVM_OP_sp_get_i8 821 #define MVM_OP_sp_get_n 822 #define MVM_OP_sp_get_s 823 #define MVM_OP_sp_bind_o 824 #define MVM_OP_sp_bind_i64 825 #define MVM_OP_sp_bind_i32 826 #define MVM_OP_sp_bind_i16 827 #define MVM_OP_sp_bind_i8 828 #define MVM_OP_sp_bind_n 829 #define MVM_OP_sp_bind_s 830 #define MVM_OP_sp_p6oget_o 831 #define MVM_OP_sp_p6ogetvt_o 832 #define MVM_OP_sp_p6ogetvc_o 833 #define MVM_OP_sp_p6oget_i 834 #define MVM_OP_sp_p6oget_n 835 #define MVM_OP_sp_p6oget_s 836 #define MVM_OP_sp_p6obind_o 837 #define MVM_OP_sp_p6obind_i 838 #define MVM_OP_sp_p6obind_n 839 #define MVM_OP_sp_p6obind_s 840 #define MVM_OP_sp_deref_get_i64 841 #define MVM_OP_sp_deref_get_n 842 #define MVM_OP_sp_deref_bind_i64 843 #define MVM_OP_sp_deref_bind_n 844 #define MVM_OP_sp_getlexvia_o 845 #define MVM_OP_sp_getlexvia_ins 846 #define MVM_OP_sp_jit_enter 847 #define MVM_OP_sp_boolify_iter 848 #define MVM_OP_sp_boolify_iter_arr 849 #define MVM_OP_sp_boolify_iter_hash 850 #define MVM_OP_sp_cas_o 851 #define MVM_OP_sp_atomicload_o 852 #define MVM_OP_sp_atomicstore_o 853 #define MVM_OP_prof_enter 854 #define MVM_OP_prof_enterspesh 855 #define MVM_OP_prof_enterinline 856 #define MVM_OP_prof_enternative 857 #define MVM_OP_prof_exit 858 #define MVM_OP_prof_allocated 859 #define MVM_OP_ctw_check 860 #define MVM_OP_coverage_log 861 #define MVM_OP_breakpoint 862 #define MVM_OP_EXT_BASE 1024 #define MVM_OP_EXT_CU_LIMIT 1024 MVM_PUBLIC const MVMOpInfo * MVM_op_get_op(unsigned short op); MoarVM-2018.03/src/core/regionalloc.c0000644000175000017510000000270213237701240017364 0ustar samanthasamantha#include "moar.h" void * MVM_region_alloc(MVMThreadContext *tc, MVMRegionAlloc *al, size_t bytes) { char *result = NULL; #if !defined(MVM_CAN_UNALIGNED_INT64) || !defined(MVM_CAN_UNALIGNED_NUM64) /* Round up size to next multiple of 8, to ensure alignment. */ bytes = (bytes + 7) & ~7; #endif if (al->block != NULL && (al->block->alloc + bytes) < al->block->limit) { result = al->block->alloc; al->block->alloc += bytes; } else { /* No block, or block was full. Add another. */ MVMRegionBlock *block = MVM_malloc(sizeof(MVMRegionBlock)); size_t buffer_size = al->block == NULL ? MVM_REGIONALLOC_FIRST_MEMBLOCK_SIZE : MVM_REGIONALLOC_MEMBLOCK_SIZE; if (buffer_size < bytes) buffer_size = bytes; block->buffer = MVM_calloc(1, buffer_size); block->alloc = block->buffer; block->limit = block->buffer + buffer_size; block->prev = al->block; al->block = block; /* Now allocate out of it. */ result = block->alloc; block->alloc += bytes; } return result; } void MVM_region_destroy(MVMThreadContext *tc, MVMRegionAlloc *alloc) { MVMRegionBlock *block = alloc->block; /* Free all of the allocated memory. */ while (block) { MVMRegionBlock *prev = block->prev; MVM_free(block->buffer); MVM_free(block); block = prev; } alloc->block = NULL; } MoarVM-2018.03/src/core/regionalloc.h0000644000175000017510000000141013237701240017364 0ustar samanthasamantha/* A block of bump-pointer allocated memory. For single-threaded use only. */ struct MVMRegionBlock { /* The memory buffer itself. */ char *buffer; /* Current allocation position. */ char *alloc; /* Allocation limit. */ char *limit; /* Previous, now full, memory block. */ MVMRegionBlock *prev; }; struct MVMRegionAlloc { MVMRegionBlock *block; }; /* The default allocation chunk size for memory blocks used to store spesh * graph nodes. Power of two is best; we start small also. */ #define MVM_REGIONALLOC_FIRST_MEMBLOCK_SIZE 32768 #define MVM_REGIONALLOC_MEMBLOCK_SIZE 8192 void * MVM_region_alloc(MVMThreadContext *tc, MVMRegionAlloc *alloc, size_t s); void MVM_region_destroy(MVMThreadContext *tc, MVMRegionAlloc *alloc); MoarVM-2018.03/src/core/threadcontext.c0000644000175000017510000001072613237701240017747 0ustar samanthasamantha#include "moar.h" #include "platform/time.h" /* Initializes a new thread context. Note that this doesn't set up a * thread itself, it just creates the data structure that exists in * MoarVM per thread. */ MVMThreadContext * MVM_tc_create(MVMThreadContext *parent, MVMInstance *instance) { MVMThreadContext *tc = MVM_calloc(1, sizeof(MVMThreadContext)); /* Associate with VM instance. */ tc->instance = instance; /* Use default loop for main thread; create a new one for others. */ if (instance->main_thread) { int r; tc->loop = MVM_calloc(1, sizeof(uv_loop_t)); r = uv_loop_init(tc->loop); if (r < 0) { MVM_free(tc->loop); MVM_free(tc); MVM_exception_throw_adhoc(parent, "Could not create a new Thread: %s", uv_strerror(r)); } } else { tc->loop = uv_default_loop(); } /* Set up GC nursery. We only allocate tospace initially, and allocate * fromspace the first time this thread GCs, provided it ever does. */ tc->nursery_tospace_size = MVM_gc_new_thread_nursery_size(instance); tc->nursery_tospace = MVM_calloc(1, tc->nursery_tospace_size); tc->nursery_alloc = tc->nursery_tospace; tc->nursery_alloc_limit = (char *)tc->nursery_alloc + tc->nursery_tospace_size; /* Set up temporary root handling. */ tc->num_temproots = 0; tc->alloc_temproots = MVM_TEMP_ROOT_BASE_ALLOC; tc->temproots = MVM_malloc(sizeof(MVMCollectable **) * tc->alloc_temproots); /* Set up intergenerational root handling. */ tc->num_gen2roots = 0; tc->alloc_gen2roots = 64; tc->gen2roots = MVM_malloc(sizeof(MVMCollectable *) * tc->alloc_gen2roots); /* Set up the second generation allocator. */ tc->gen2 = MVM_gc_gen2_create(instance); /* The fixed size allocator also keeps pre-thread state. */ MVM_fixed_size_create_thread(tc); /* Allocate an initial call stack region for the thread. */ MVM_callstack_region_init(tc); /* Initialize random number generator state. */ MVM_proc_seed(tc, (MVM_platform_now() / 10000) * MVM_proc_getpid(tc)); /* Initialize frame sequence numbers */ tc->next_frame_nr = 0; tc->current_frame_nr = 0; /* Initialize last_payload, so we can be sure it's never NULL and don't * need to check. */ tc->last_payload = instance->VMNull; return tc; } /* Destroys a given thread context. This will also free the nursery. * This means that it must no longer be in use, at all; this can be * ensured by a GC run at thread exit that forces evacuation of all * objects from this nursery to the second generation. Only after * that is true should this be called. */ void MVM_tc_destroy(MVMThreadContext *tc) { /* We run once again (non-blocking) to eventually close filehandles. */ uv_run(tc->loop, UV_RUN_NOWAIT); /* Free specialization state. */ MVM_spesh_sim_stack_destroy(tc, tc->spesh_sim_stack); /* Free the nursery and finalization queue. */ MVM_free(tc->nursery_fromspace); MVM_free(tc->nursery_tospace); MVM_free(tc->finalizing); /* Destroy the second generation allocator. */ MVM_gc_gen2_destroy(tc->instance, tc->gen2); /* Destory the per-thread fixed size allocator state. */ MVM_fixed_size_destroy_thread(tc); /* Destroy all callstack regions. */ MVM_callstack_region_destroy_all(tc); /* Free the thread-specific storage */ MVM_free(tc->gc_work); MVM_free(tc->temproots); MVM_free(tc->gen2roots); MVM_free(tc->finalize); /* Free any memory allocated for NFAs and multi-dim indices. */ MVM_free(tc->nfa_done); MVM_free(tc->nfa_curst); MVM_free(tc->nfa_nextst); MVM_free(tc->nfa_fates); MVM_free(tc->nfa_longlit); MVM_free(tc->multi_dim_indices); /* Destroy the libuv event loop */ uv_loop_delete(tc->loop); /* Free the thread context itself. */ memset(tc, 0, sizeof(MVMThreadContext)); MVM_free(tc); } /* Setting and clearing mutex to release on exception throw. */ void MVM_tc_set_ex_release_mutex(MVMThreadContext *tc, uv_mutex_t *mutex) { if (tc->ex_release_mutex) MVM_exception_throw_adhoc(tc, "Internal error: multiple ex_release_mutex"); tc->ex_release_mutex = mutex; } void MVM_tc_release_ex_release_mutex(MVMThreadContext *tc) { if (tc->ex_release_mutex) uv_mutex_unlock(tc->ex_release_mutex); tc->ex_release_mutex = NULL; } void MVM_tc_clear_ex_release_mutex(MVMThreadContext *tc) { tc->ex_release_mutex = NULL; } MoarVM-2018.03/src/core/threadcontext.h0000644000175000017510000002725713252330426017764 0ustar samanthasamantha#define MVMGCSTATUS_MASK 3 #define MVMSUSPENDSTATUS_MASK 12 /* Possible values for the thread execution interrupt flag. */ typedef enum { /* Indicates that the thread is currently executing, and should * continue to do so. */ MVMGCStatus_NONE = 0, /* Set when another thread decides it wants to do a GC run. The * current thread, on detecting this condition at a safe point, * should join in with the current GC run. */ MVMGCStatus_INTERRUPT = 1, /* Set by a thread when it is unable to do any GC work because it * is currently blocked waiting on an operation in the outside * world (such as, waiting for another thread to join, or for * some I/O to complete). */ MVMGCStatus_UNABLE = 2, /* Indicates that, while the thread was in unable status, a GC * run was triggered and the scanning work was stolen. A thread * that becomes unblocked upon seeing this will wait for the GC * run to be done. */ MVMGCStatus_STOLEN = 3, } MVMGCStatus; typedef enum { /* Indicates the thread shall continue executing. */ MVMSuspendState_NONE = 0, /* Indicates the thread shall suspend execution as soon as practical. */ MVMSuspendState_SUSPEND_REQUEST = 4, /* Indicates the thread has suspended execution and is waiting for * a signal to resume execution. */ MVMSuspendState_SUSPENDED = 12, } MVMSuspendStatus; typedef enum { /* Just pass by any line number annotation */ MVMDebugSteppingMode_NONE = 0, /* Step Over: * Line annotation: If the line number doesn't match, but the frame does. * Return from Frame: If the frame matches. */ MVMDebugSteppingMode_STEP_OVER = 1, /* Step Into: * Line annotation: If the line number doesn't match in the same frame, * if the frame doesn't match. * Return from Frame: If the frame matches. */ MVMDebugSteppingMode_STEP_INTO = 2, /* Step Out: * Line annotation: - * Return from Frame: If the frame matches. */ MVMDebugSteppingMode_STEP_OUT = 3, } MVMDebugSteppingMode; /* Information associated with an executing thread. */ struct MVMThreadContext { /************************************************************************ * Information about this thread ************************************************************************/ /* Internal ID of the thread. */ MVMuint32 thread_id; /* Thread object representing the thread. */ MVMThread *thread_obj; /* The VM instance that this thread belongs to. */ MVMInstance *instance; /* The number of locks the thread is holding. */ MVMint64 num_locks; /************************************************************************ * Garbage collection and memory management ************************************************************************/ /* Start of fromspace, the place we're copying objects from during a * copying collection or processing dead objects that need to do extra * resource release afterwards. */ void *nursery_fromspace; /* Where we evacuate objects to when collecting this thread's nursery, or * allocate new ones. */ void *nursery_tospace; /* The current allocation pointer, where the next object to be allocated * should be placed. */ void *nursery_alloc; /* The end of the space we're allowed to allocate to. */ void *nursery_alloc_limit; /* This thread's GC status. */ AO_t gc_status; /* The second GC generation allocator. */ MVMGen2Allocator *gen2; /* The current sizes of the nursery fromspace/tospace for this thread, in * bytes. Used to handle growing it over time depending on usage. */ MVMuint32 nursery_fromspace_size; MVMuint32 nursery_tospace_size; /* Non-zero is we should allocate in gen2; incremented/decremented as we * enter/leave a region wanting gen2 allocation. */ MVMuint32 allocate_in_gen2; /* Number of bytes promoted to gen2 in current GC run. */ MVMuint32 gc_promoted_bytes; /* Temporarily rooted objects. This is generally used by code written in * C that wants to keep references to objects. Since those may change * if the code in question also allocates, there is a need to register * them; this ensures the GC will not swallow them but also that they * will get updated if a GC run happens. Note that this is used as a * stack and is also thread-local, so it's cheap to push/pop. */ MVMuint32 num_temproots; MVMuint32 mark_temproots; MVMuint32 alloc_temproots; MVMCollectable ***temproots; /* Nursery collectables (maybe STables) rooted because something in * generation 2 is pointing at them. */ MVMuint32 num_gen2roots; MVMuint32 alloc_gen2roots; MVMCollectable **gen2roots; /* Finalize queue objects, which need to have a finalizer invoked once * they are no longer referenced from anywhere except this queue. */ MVMuint32 num_finalize; MVMuint32 alloc_finalize; MVMObject **finalize; /* List of objects we're in the process of finalizing. */ MVMuint32 num_finalizing; MVMuint32 alloc_finalizing; MVMObject **finalizing; /* The GC's cross-thread in-tray of processing work. */ MVMGCPassedWork *gc_in_tray; /* Threads we will do GC work for this run (ourself plus any that we stole * work from because they were blocked). */ MVMWorkThread *gc_work; MVMuint32 gc_work_size; MVMuint32 gc_work_count; /* Per-thread fixed size allocator state. */ MVMFixedSizeAllocThread *thread_fsa; /************************************************************************ * Interpreter state ************************************************************************/ /* Pointer to where the interpreter's current opcode is stored. */ MVMuint8 **interp_cur_op; /* Pointer to where the interpreter's bytecode start pointer is stored. */ MVMuint8 **interp_bytecode_start; /* Pointer to where the interpreter's base of the current register * set is stored. */ MVMRegister **interp_reg_base; /* Pointer to where the interpreter's current compilation unit pointer * is stored. */ MVMCompUnit **interp_cu; /* Jump buffer, used when an exception is thrown from C-land and we need * to fall back into the interpreter. These things are huge, so put it * near the end to keep the hotter stuff on the same cacheline. */ jmp_buf interp_jump; /************************************************************************ * Frames, call stack, and exception state ************************************************************************/ /* The frame we're currently executing. */ MVMFrame *cur_frame; /* The frame lying at the base of the current thread. */ MVMFrame *thread_entry_frame; /* First call stack memory region, so we can traverse them for cleanup. */ MVMCallStackRegion *stack_first; /* Current call stack region, which the next frame will be allocated in. */ MVMCallStackRegion *stack_current; /* Linked list of exception handlers that we're currently executing, topmost * one first in the list. */ MVMActiveHandler *active_handlers; /* Result object of the last-run exception handler. */ MVMObject *last_handler_result; /* Last payload made available in a payload-goto exception handler. */ MVMObject *last_payload; /************************************************************************ * Specialization and JIT compilation ************************************************************************/ /* Frame sequence numbers in order to cheaply identify the place of a frame * in the call stack */ MVMint32 current_frame_nr; MVMint32 next_frame_nr; /* This thread's current spesh log to write in to, if there curently is * one. */ MVMSpeshLog *spesh_log; /* How many spesh logs we can produce, inclusive of the current one. * Ensures the spesh worker isn't overwhelmed with data before it has a * change to produce some specializations. */ AO_t spesh_log_quota; /* The spesh stack simulation, perserved between processing logs. */ MVMSpeshSimStack *spesh_sim_stack; /* We try to do better at OSR by creating a fresh log when we enter a new * compilation unit. However, for things that EVAL or do a ton of BEGIN, * this does more harm than good. Use this to throttle it back. */ MVMuint32 num_compunit_extra_logs; /* The current specialization correlation ID, used in logging. */ MVMuint32 spesh_cid; #if MVM_GC_DEBUG /* Whether we are currently in the specializer. Used to catch GC runs that * take place at times they never should. */ MVMint32 in_spesh; #endif /* State to cheaply determine if we should look again for the availability * of optimzied code at an OSR point. When the current state seen by the * interpreter of frame number of spesh candidates matches, we know there * was no change since the last OSR point. */ MVMint32 osr_hunt_frame_nr; MVMint32 osr_hunt_num_spesh_candidates; /************************************************************************ * Per-thread state held by assorted VM subsystems ************************************************************************/ /* libuv event loop */ uv_loop_t *loop; /* Mutex that must be released if we throw an exception. Used in places * like I/O, which grab a mutex but may throw an exception. */ uv_mutex_t *ex_release_mutex; /* Memory buffer pointing to the last thing we serialized, intended to go * into the next compilation unit we write. Also the serialized string * heap, which will be used to seed the compilation unit string heap. */ MVMint32 serialized_size; char *serialized; MVMObject *serialized_string_heap; /* Serialization context write barrier disabled depth (anything non-zero * means disabled). */ MVMint32 sc_wb_disable_depth; /* Any serialization contexts we are compiling. The current one is at * index 0. */ MVMObject *compiling_scs; /* Dispatcher for next invocation that matches _for to take. If _for is * NULL then anything matches. */ MVMObject *cur_dispatcher; MVMObject *cur_dispatcher_for; /* Cache of native code callback data. */ MVMNativeCallbackCacheHead *native_callback_cache; /* Random number generator state. */ MVMuint64 rand_state[2]; /* NFA evaluator memory cache, to avoid many allocations; see NFA.c. */ MVMuint32 *nfa_done; MVMuint32 *nfa_curst; MVMuint32 *nfa_nextst; MVMint64 nfa_alloc_states; MVMint64 *nfa_fates; MVMint64 nfa_fates_len; MVMint64 *nfa_longlit; MVMint64 nfa_longlit_len; /* Memory for doing multi-dim indexing with late-bound dimension counts. */ MVMint64 *multi_dim_indices; MVMint64 num_multi_dim_indices; /* Profiling data collected for this thread, if profiling is on. */ MVMProfileThreadData *prof_data; /* Debug server stepping mode and settings */ MVMDebugSteppingMode step_mode; MVMFrame *step_mode_frame; MVMuint32 step_mode_file_idx; MVMuint32 step_mode_line_no; MVMuint64 step_message_id; MVMuint32 cur_file_idx; MVMuint32 cur_line_no; }; MVMThreadContext * MVM_tc_create(MVMThreadContext *parent, MVMInstance *instance); void MVM_tc_destroy(MVMThreadContext *tc); void MVM_tc_set_ex_release_mutex(MVMThreadContext *tc, uv_mutex_t *mutex); void MVM_tc_release_ex_release_mutex(MVMThreadContext *tc); void MVM_tc_clear_ex_release_mutex(MVMThreadContext *tc); MoarVM-2018.03/src/core/threads.c0000644000175000017510000002725113252330426016527 0ustar samanthasamantha#include "moar.h" #include /* Temporary structure for passing data to thread start. */ typedef struct { MVMThreadContext *tc; MVMObject *thread_obj; } ThreadStart; /* Creates a new thread handle with the MVMThread representation. Does not * actually start execution of the thread, but does give it its unique ID. */ MVMObject * MVM_thread_new(MVMThreadContext *tc, MVMObject *invokee, MVMint64 app_lifetime) { MVMThread *thread; MVMThreadContext *child_tc; unsigned int interval_id; interval_id = MVM_telemetry_interval_start(tc, "spawning a new thread off of me"); /* Create the Thread object and stash code to run and lifetime. */ MVMROOT(tc, invokee, { thread = (MVMThread *)MVM_repr_alloc_init(tc, tc->instance->Thread); }); thread->body.stage = MVM_thread_stage_unstarted; MVM_ASSIGN_REF(tc, &(thread->common.header), thread->body.invokee, invokee); thread->body.app_lifetime = app_lifetime; /* Try to create the new threadcontext. Can throw if libuv can't * create a loop for it for some reason (i.e. too many open files) */ MVMROOT(tc, thread, { child_tc = MVM_tc_create(tc, tc->instance); }); /* Set up the new threadcontext a little. */ child_tc->thread_obj = thread; child_tc->thread_id = 1 + MVM_incr(&tc->instance->next_user_thread_id); /* Add one, since MVM_incr returns original. */ thread->body.tc = child_tc; MVM_telemetry_interval_stop(child_tc, interval_id, "i'm the newly spawned thread."); /* Also make a copy of the thread ID in the thread object itself, so it * is available once the thread dies and its ThreadContext is gone. */ thread->body.thread_id = child_tc->thread_id; return (MVMObject *)thread; } /* This callback is passed to the interpreter code. It takes care of making * the initial invocation of the thread code. */ static void thread_initial_invoke(MVMThreadContext *tc, void *data) { /* The passed data is simply the code object to invoke. */ ThreadStart *ts = (ThreadStart *)data; MVMThread *thread = (MVMThread *)ts->thread_obj; MVMObject *invokee = thread->body.invokee; thread->body.invokee = NULL; /* Create initial frame, which sets up all of the interpreter state also. */ invokee = MVM_frame_find_invokee(tc, invokee, NULL); STABLE(invokee)->invoke(tc, invokee, MVM_callsite_get_common(tc, MVM_CALLSITE_ID_NULL_ARGS), NULL); /* This frame should be marked as the thread entry frame, so that any * return from it will cause us to drop out of the interpreter and end * the thread. */ tc->thread_entry_frame = tc->cur_frame; } /* This callback handles starting execution of a thread. */ static void start_thread(void *data) { ThreadStart *ts = (ThreadStart *)data; MVMThreadContext *tc = ts->tc; /* wait for the GC to finish if it's not finished stealing us. */ MVM_gc_mark_thread_unblocked(tc); tc->thread_obj->body.stage = MVM_thread_stage_started; /* Stash thread ID. */ tc->thread_obj->body.native_thread_id = MVM_platform_thread_id(); /* Create a spesh log for this thread, unless it's just going to run C * code (and thus it's a VM internal worker). */ if (REPR(tc->thread_obj->body.invokee)->ID != MVM_REPR_ID_MVMCFunction) MVM_spesh_log_initialize_thread(tc, 0); MVM_debugserver_notify_thread_creation(tc); /* Enter the interpreter, to run code. */ MVM_interp_run(tc, thread_initial_invoke, ts); MVM_debugserver_notify_thread_destruction(tc); /* Pop the temp root stack's ts->thread_obj, if it's still there (if we * cleared the temp root stack on exception at some point, it'll already be * gone). */ if (tc->num_temproots != 0) MVM_gc_root_temp_pop_n(tc, tc->num_temproots); MVM_free(ts); /* Mark as exited, so the GC will know to clear our stuff. */ tc->thread_obj->body.stage = MVM_thread_stage_exited; /* Mark ourselves as blocked, so that another thread will take care * of GC-ing our objects and cleaning up our thread context. */ MVM_gc_mark_thread_blocked(tc); /* Exit the thread, now it's completed. */ MVM_platform_thread_exit(NULL); } /* Begins execution of a thread. */ void MVM_thread_run(MVMThreadContext *tc, MVMObject *thread_obj) { MVMThread *child = (MVMThread *)thread_obj; int status, added; ThreadStart *ts; if (REPR(child)->ID == MVM_REPR_ID_MVMThread && IS_CONCRETE(thread_obj)) { MVMThreadContext *child_tc = child->body.tc; /* Mark thread as GC blocked until the thread actually starts. */ MVM_gc_mark_thread_blocked(child_tc); /* Create thread state, to pass to the thread start callback. */ ts = MVM_malloc(sizeof(ThreadStart)); ts->tc = child_tc; /* Push to starting threads list. We may need to retry this if we are * asked to join a GC run at this point (since the GC would already * have taken a snapshot of the thread list, so it's not safe to add * another at this point). */ added = 0; while (!added) { uv_mutex_lock(&tc->instance->mutex_threads); if (MVM_load(&tc->gc_status) == MVMGCStatus_NONE) { /* Insert into list. */ MVM_ASSIGN_REF(tc, &(child->common.header), child->body.next, tc->instance->threads); tc->instance->threads = child; /* Store the thread object in the thread start information and * keep it alive by putting it in the *child* tc's temp roots. */ ts->thread_obj = thread_obj; MVM_gc_root_temp_push(child_tc, (MVMCollectable **)&ts->thread_obj); /* Move thread to starting stage. */ child->body.stage = MVM_thread_stage_starting; /* Mark us done and unlock the mutex; any GC run will now have * a consistent view of the thread list and can safely run. */ added = 1; uv_mutex_unlock(&tc->instance->mutex_threads); } else { /* Another thread decided we'll GC now. Release mutex, and * do the GC, making sure thread_obj and child are marked. */ uv_mutex_unlock(&tc->instance->mutex_threads); MVMROOT2(tc, thread_obj, child, { GC_SYNC_POINT(tc); }); } } /* Do the actual thread creation. */ status = uv_thread_create(&child->body.thread, start_thread, ts); if (status < 0) MVM_panic(MVM_exitcode_compunit, "Could not spawn thread: errorcode %d", status); } else { MVM_exception_throw_adhoc(tc, "Thread handle passed to run must have representation MVMThread"); } } /* Waits for a thread to finish. */ static int try_join(MVMThreadContext *tc, MVMThread *thread) { /* Join the thread, marking ourselves as unable to GC while we wait. */ int status; MVM_gc_root_temp_push(tc, (MVMCollectable **)&thread); MVM_gc_mark_thread_blocked(tc); if (thread->body.stage < MVM_thread_stage_exited) { status = uv_thread_join(&thread->body.thread); } else { /* the target already ended */ status = 0; } MVM_gc_mark_thread_unblocked(tc); MVM_gc_root_temp_pop(tc); /* After a thread has been joined, we trigger a GC run to clean up after * it. This avoids problems where a program spawns threads and joins them * in a loop gobbling a load of memory and other resources because we do * not ever trigger a GC run to clean up the thread. */ MVM_gc_enter_from_allocator(tc); return status; } void MVM_thread_join(MVMThreadContext *tc, MVMObject *thread_obj) { if (REPR(thread_obj)->ID == MVM_REPR_ID_MVMThread && IS_CONCRETE(thread_obj)) { int status = try_join(tc, (MVMThread *)thread_obj); if (status < 0) MVM_panic(MVM_exitcode_compunit, "Could not join thread: errorcode %d", status); } else { MVM_exception_throw_adhoc(tc, "Thread handle passed to join must have representation MVMThread"); } } /* Gets the (VM-level) ID of a thread. */ MVMint64 MVM_thread_id(MVMThreadContext *tc, MVMObject *thread_obj) { if (REPR(thread_obj)->ID == MVM_REPR_ID_MVMThread && IS_CONCRETE(thread_obj)) return ((MVMThread *)thread_obj)->body.thread_id; else MVM_exception_throw_adhoc(tc, "Thread handle passed to threadid must have representation MVMThread"); } /* Gets the native OS ID of a thread. If it's not yet available because * the thread was not yet started, this will return 0. */ MVMint64 MVM_thread_native_id(MVMThreadContext *tc, MVMObject *thread_obj) { if (REPR(thread_obj)->ID == MVM_REPR_ID_MVMThread && IS_CONCRETE(thread_obj)) return ((MVMThread *)thread_obj)->body.native_thread_id; else MVM_exception_throw_adhoc(tc, "Thread handle passed to threadnativeid must have representation MVMThread"); } /* Yields control to another thread. */ void MVM_thread_yield(MVMThreadContext *tc) { MVM_telemetry_timestamp(tc, "thread yielding"); MVM_platform_thread_yield(); } /* Gets the object representing the current thread. */ MVMObject * MVM_thread_current(MVMThreadContext *tc) { return (MVMObject *)tc->thread_obj; } /* Gets the number of locks held by a thread. */ MVMint64 MVM_thread_lock_count(MVMThreadContext *tc, MVMObject *thread_obj) { if (REPR(thread_obj)->ID == MVM_REPR_ID_MVMThread && IS_CONCRETE(thread_obj)) { MVMThreadContext *thread_tc = ((MVMThread *)thread_obj)->body.tc; return thread_tc ? thread_tc->num_locks : 0; } else { MVM_exception_throw_adhoc(tc, "Thread handle used with threadlockcount must have representation MVMThread"); } } void MVM_thread_cleanup_threads_list(MVMThreadContext *tc, MVMThread **head) { /* Assumed to be the only thread accessing the list. * must set next on every item. */ MVMThread *new_list = NULL, *this = *head, *next; *head = NULL; while (this) { next = this->body.next; switch (this->body.stage) { case MVM_thread_stage_starting: case MVM_thread_stage_waiting: case MVM_thread_stage_started: case MVM_thread_stage_exited: case MVM_thread_stage_clearing_nursery: /* push it to the new starting list */ this->body.next = new_list; new_list = this; break; case MVM_thread_stage_destroyed: /* don't put in a list */ this->body.next = NULL; break; default: MVM_panic(MVM_exitcode_threads, "Thread in unknown stage: %"MVM_PRSz"\n", this->body.stage); } this = next; } *head = new_list; } /* Goes through all non-app-lifetime threads and joins them. */ void MVM_thread_join_foreground(MVMThreadContext *tc) { MVMint64 work = 1; while (work) { MVMThread *cur_thread = tc->instance->threads; work = 0; while (cur_thread) { if (cur_thread->body.tc != tc->instance->main_thread) { if (!cur_thread->body.app_lifetime) { if (MVM_load(&cur_thread->body.stage) < MVM_thread_stage_exited) { /* Join may trigger GC and invalidate cur_thread, so we * just set work to 1 and do another trip around the main * loop. */ try_join(tc, cur_thread); work = 1; break; } } } cur_thread = cur_thread->body.next; } } } MoarVM-2018.03/src/core/threads.h0000644000175000017510000000132413237701240016524 0ustar samanthasamanthaMVMObject * MVM_thread_new(MVMThreadContext *tc, MVMObject *invokee, MVMint64 app_lifetime); void MVM_thread_run(MVMThreadContext *tc, MVMObject *thread); void MVM_thread_join(MVMThreadContext *tc, MVMObject *thread); MVMint64 MVM_thread_id(MVMThreadContext *tc, MVMObject *thread); MVMint64 MVM_thread_native_id(MVMThreadContext *tc, MVMObject *thread); MVMint64 MVM_thread_current_os_thread_id(MVMThreadContext *tc); void MVM_thread_yield(MVMThreadContext *tc); MVMObject * MVM_thread_current(MVMThreadContext *tc); MVMint64 MVM_thread_lock_count(MVMThreadContext *tc, MVMObject *thread); void MVM_thread_cleanup_threads_list(MVMThreadContext *tc, MVMThread **head); void MVM_thread_join_foreground(MVMThreadContext *tc); MoarVM-2018.03/src/core/validation.c0000644000175000017510000005127113237701240017225 0ustar samanthasamantha#include "moar.h" /* TODO: validate * - args of prepargs, getcode * - any cu->strings index (28 currently) * - cur_frame->args indexes */ /* Macros for getting things from the bytecode stream. */ /* GET_REG is defined differently here from interp.c */ #define GET_REG(pc, idx) *((MVMuint16 *)(pc + idx)) #define GET_I16(pc, idx) *((MVMint16 *)(pc + idx)) #define GET_UI16(pc, idx) *((MVMuint16 *)(pc + idx)) #define GET_I32(pc, idx) *((MVMint32 *)(pc + idx)) #define GET_UI32(pc, idx) *((MVMuint32 *)(pc + idx)) #define GET_N32(pc, idx) *((MVMnum32 *)(pc + idx)) #define MSG(val, msg) "Bytecode validation error at offset %" PRIu32 \ ", instruction %" PRIu32 ":\n" msg, \ (MVMuint32)((val)->cur_op - (val)->bc_start), (val)->cur_instr enum { MARK_regular = ' ', MARK_special = '.', MARK_sequence = ':', MARK_head = '+', MARK_body = '*', MARK_tail = '-' }; typedef struct { MVMThreadContext *tc; MVMCompUnit *cu; MVMStaticFrame *frame; MVMuint32 loc_count; MVMuint16 *loc_types; MVMuint32 bc_size; MVMuint8 *bc_start; MVMuint8 *bc_end; MVMuint8 *src_cur_op; MVMuint8 *src_bc_end; MVMuint8 *labels; MVMuint8 *cur_op; const MVMOpInfo *cur_info; const char *cur_mark; MVMuint32 cur_instr; MVMCallsite *cur_call; MVMuint16 cur_arg; MVMint32 acceptable_max_arity; MVMint16 checkarity_seen; MVMCallsiteEntry expected_named_arg; MVMuint16 remaining_args; MVMuint16 remaining_positionals; MVMuint32 remaining_jumplabels; MVMuint32 reg_type_var; } Validator; MVM_NO_RETURN static void fail(Validator *val, const char *msg, ...) MVM_FORMAT(printf, 2, 3) MVM_NO_RETURN_GCC; static void fail(Validator *val, const char *msg, ...) { va_list args; va_start(args, msg); MVM_free(val->labels); MVM_exception_throw_adhoc_va(val->tc, msg, args); va_end(args); } static void fail_illegal_mark(Validator *val) { fail(val, MSG(val, "illegal op mark '%.2s'"), val->cur_mark); } static void ensure_bytes(Validator *val, MVMuint32 count) { if (val->src_cur_op + count > val->src_bc_end) fail(val, MSG(val, "truncated stream")); #ifdef MVM_BIGENDIAN /* Endian swap equivalent of memcpy(val->cur_op, val->src_cur_op, count); */ { MVMuint8 *d = val->cur_op + count; while (count--) { *--d = *val->src_cur_op++; } } #else val->src_cur_op += count; #endif } static void ensure_op(Validator *val, MVMuint16 opcode) { if (val->cur_info->opcode != opcode) { fail(val, MSG(val, "expected op %s but got %s"), MVM_op_get_op(opcode)->name, val->cur_info->name); } } static void ensure_no_remaining_jumplabels(Validator *val) { if (val->remaining_jumplabels != 0) fail(val, MSG(val, "%" PRIu32 " jumplist labels missing their goto ops"), val->remaining_jumplabels); } static void ensure_no_remaining_positionals(Validator *val) { if (val->remaining_positionals != 0) fail(val, MSG(val, "callsite expects %" PRIu16 " more positionals"), val->remaining_positionals); } static void ensure_no_remaining_args(Validator *val) { if (val->remaining_args != 0) fail(val, MSG(val, "callsite expects %" PRIu16 " more args"), val->remaining_args); } MVM_STATIC_INLINE const MVMOpInfo * get_info(Validator *val, MVMuint16 opcode) { const MVMOpInfo *info; if (opcode < MVM_OP_EXT_BASE) { info = MVM_op_get_op(opcode); if (!info) fail(val, MSG(val, "invalid opcode %u"), opcode); } else { MVMuint16 index = opcode - MVM_OP_EXT_BASE; MVMExtOpRecord *record; if (index >= val->cu->body.num_extops) fail(val, MSG(val, "invalid extension opcode %u - should be less than %u"), opcode, MVM_OP_EXT_BASE + val->cu->body.num_extops); record = &val->cu->body.extops[index]; info = MVM_ext_resolve_extop_record(val->tc, record); if (!info) fail(val, MSG(val, "extension op '%s' not registered"), MVM_string_utf8_encode_C_string(val->tc, record->name)); } return info; } MVM_STATIC_INLINE void read_op(Validator *val) { MVMuint16 opcode; const MVMOpInfo *info; MVMuint32 pos; ensure_bytes(val, 2); opcode = *(MVMuint16 *)val->cur_op; info = get_info(val, opcode); pos = val->cur_op - val->bc_start; #if 0 MVM_string_print(val->tc, val->cu->body.filename); printf(" %u %s %.2s\n", val->cur_instr, info->name, info->mark); #endif val->labels[pos] |= MVM_BC_op_boundary; val->cur_info = info; val->cur_mark = info->mark; val->cur_op += 2; val->cur_instr += 1; } static void unread_op(Validator *val) { val->src_cur_op -= 2; val->cur_op -= 2; val->cur_instr -= 1; } static void validate_branch_targets(Validator *val) { MVMuint32 pos, instr; for (pos = 0, instr = (MVMuint32)-1; pos < val->bc_size; pos++) { MVMuint32 flag = val->labels[pos]; if (flag & MVM_BC_op_boundary) instr++; if ((flag & MVM_BC_branch_target) && !(flag & MVM_BC_op_boundary)) fail(val, MSG(val, "branch targets offset %" PRIu32 "within instruction %" PRIu32), pos, instr); } } static void validate_final_return(Validator *val) { if (!val->bc_size || val->cur_mark[1] != 'r') fail(val, MSG(val, "missing final return instruction")); } static void validate_literal_operand(Validator *val, MVMuint32 flags) { MVMuint32 type = flags & MVM_operand_type_mask; MVMuint32 size; switch (type) { case MVM_operand_int8: size = 1; break; case MVM_operand_int16: size = 2; break; case MVM_operand_int32: size = 4; break; case MVM_operand_int64: size = 8; break; case MVM_operand_num32: size = 4; break; case MVM_operand_num64: size = 8; break; case MVM_operand_callsite: size = 2; break; case MVM_operand_coderef: size = 2; break; case MVM_operand_str: size = 4; break; case MVM_operand_ins: size = 4; break; case MVM_operand_obj: case MVM_operand_type_var: fail(val, MSG(val, "operand type %i can't be a literal"), type); default: fail(val, MSG(val, "unknown operand type %i"), type); } ensure_bytes(val, size); switch (type) { case MVM_operand_callsite: { MVMuint16 index = GET_UI16(val->cur_op, 0); MVMuint32 count = val->cu->body.orig_callsites; if (index >= count) fail(val, MSG(val, "callsite index %" PRIu16 " out of range 0..%" PRIu32), index, count - 1); break; } case MVM_operand_coderef: { MVMuint16 index = GET_UI16(val->cur_op, 0); MVMuint32 count = val->cu->body.orig_frames; if (index >= count) fail(val, MSG(val, "coderef index %" PRIu16 " out of range 0..%" PRIu32), index, count - 1); break; } case MVM_operand_str: { MVMuint32 index = GET_UI32(val->cur_op, 0); MVMuint32 count = val->cu->body.orig_strings; if (index >= count) fail(val, MSG(val, "string index %" PRIu32 " out of range 0..%" PRIu32), index, count - 1); break; } case MVM_operand_ins: { MVMuint32 offset = GET_UI32(val->cur_op, 0); if (offset >= val->bc_size) fail(val, MSG(val, "branch instruction offset %" PRIu32 " out of range 0..%" PRIu32), offset, val->bc_size - 1); val->labels[offset] |= MVM_BC_branch_target; } } val->cur_op += size; } static void validate_reg_operand(Validator *val, MVMuint32 flags) { MVMuint32 operand_type = flags & MVM_operand_type_mask; MVMuint32 reg_type; MVMuint16 reg; ensure_bytes(val, 2); reg = GET_REG(val->cur_op, 0); if (reg >= val->loc_count) fail(val, MSG(val, "register operand index %" PRIu16 " out of range 0..%" PRIu32), reg, val->loc_count - 1); reg_type = val->loc_types[reg] << 3; if (operand_type == MVM_operand_type_var) { if (!val->reg_type_var) { val->reg_type_var = reg_type; goto next_operand; } operand_type = val->reg_type_var; } if (reg_type != operand_type) fail(val, MSG(val, "operand type %i does not match register type %i"), operand_type, reg_type); next_operand: val->cur_op += 2; } static void validate_lex_operand(Validator *val, MVMuint32 flags) { MVMuint32 operand_type = flags & MVM_operand_type_mask; MVMuint16 lex_index, frame_index, i; MVMuint32 lex_count, lex_type; MVMStaticFrame *frame = val->frame; /* Two steps forward, two steps back to keep the error reporting happy, and to make the endian conversion within ensure_bytes correct. (Both are using val->cur_op, and want it to have different values.) */ ensure_bytes(val, 2); lex_index = GET_UI16(val->cur_op, 0); val->cur_op += 2; ensure_bytes(val, 2); val->cur_op -= 2; frame_index = GET_UI16(val->cur_op, 2); for (i = frame_index; i; i--) { frame = frame->body.outer; if (!frame) fail(val, MSG(val, "lexical operand requires %" PRIu16 " more enclosing scopes"), i); } if (!frame->body.fully_deserialized) MVM_bytecode_finish_frame(val->tc, frame->body.cu, frame, 0); lex_count = frame->body.num_lexicals; if (lex_index >= lex_count) fail(val, MSG(val, "lexical operand index %" PRIu16 " out of range 0.. %" PRIu32), lex_index, lex_count - 1); lex_type = frame->body.lexical_types[lex_index] << 3; if (operand_type == MVM_operand_type_var) { if (!val->reg_type_var) { val->reg_type_var = lex_type; goto next_operand; } operand_type = val->reg_type_var; } if (lex_type != operand_type) fail(val, MSG(val, "operand type %i does not match lexical type %i"), operand_type, lex_type); next_operand: val->cur_op += 4; } static void validate_operand(Validator *val, MVMuint32 flags) { MVMuint32 rw = flags & MVM_operand_rw_mask; switch (rw) { case MVM_operand_literal: validate_literal_operand(val, flags); break; case MVM_operand_read_reg: case MVM_operand_write_reg: validate_reg_operand(val, flags); break; case MVM_operand_read_lex: case MVM_operand_write_lex: validate_lex_operand(val, flags); break; default: fail(val, MSG(val, "invalid instruction rw flag %i"), rw); } } static void validate_operands(Validator *val) { const MVMuint8 *operands = val->cur_info->operands; val->reg_type_var = 0; switch (val->cur_info->opcode) { case MVM_OP_jumplist: { MVMint64 count; validate_literal_operand(val, operands[0]); count = MVM_BC_get_I64(val->cur_op, -8); if (count < 0 || count > UINT32_MAX) fail(val, MSG(val, "illegal jumplist label count %" PRIi64), count); validate_reg_operand(val, operands[1]); break; } case MVM_OP_checkarity: { validate_literal_operand(val, operands[0]); validate_literal_operand(val, operands[1]); val->acceptable_max_arity = GET_UI16(val->cur_op, -2); val->checkarity_seen = 1; break; } case MVM_OP_wval: case MVM_OP_wval_wide: { validate_reg_operand(val, operands[0]); if (GET_UI16(val->cur_op, 0) >= val->cu->body.num_scs) fail(val, MSG(val, "out of range SC index %u"), GET_UI16(val->cur_op, 0)); validate_literal_operand(val, operands[1]); validate_literal_operand(val, operands[2]); break; } default: { int i; if (val->cur_mark[1] == 'p') { /* First of all, bail out if no checkarity was seen yet. */ if (!val->checkarity_seen) { fail(val, MSG(val, "param op without checkarity op seen.")); } /* For the p-marked ops, which is a subset of param_* ops, * we check the second argument against the value checkarity * checked against. */ for (i = 0; i < val->cur_info->num_operands; i++) { validate_operand(val, val->cur_info->operands[i]); /* This is the argument we want to check */ if (i == 1) { MVMint16 value = GET_UI16(val->cur_op, -2); if (value > val->acceptable_max_arity) { fail(val, MSG(val, "tried to take arg number %d after checkarity with %d"), value, val->acceptable_max_arity); } } } } else { for (i = 0; i < val->cur_info->num_operands; i++) validate_operand(val, val->cur_info->operands[i]); } } } } static void validate_sequence(Validator *val) { int seq_id = val->cur_mark[1]; switch (seq_id) { case 'j': { ensure_op(val, MVM_OP_jumplist); validate_operands(val); val->remaining_jumplabels = (MVMuint32)MVM_BC_get_I64(val->cur_op, -10); break; } default: fail(val, MSG(val, "unknown instruction sequence '%c'"), seq_id); } while (val->cur_op < val->bc_end) { int type, id; read_op(val); type = val->cur_mark[0]; id = val->cur_mark[1]; switch (type) { case MARK_special: if (id == seq_id) break; /* FALLTHROUGH */ case MARK_regular: case MARK_sequence: case MARK_head: unread_op(val); goto terminate_seq; default: fail_illegal_mark(val); } switch (seq_id) { case 'j': ensure_op(val, MVM_OP_goto); validate_operands(val); val->remaining_jumplabels--; if (val->remaining_jumplabels == 0) goto terminate_seq; break; } } terminate_seq: switch (seq_id) { case 'j': ensure_no_remaining_jumplabels(val); break; } } static void validate_arg(Validator *val) { MVMCallsiteEntry flags; val->remaining_args--; if (val->expected_named_arg) { flags = val->expected_named_arg; val->expected_named_arg = 0; } else { MVMuint16 index = val->cur_arg++; MVMuint16 count = val->cur_call->arg_count; if (index >= count) fail (val, MSG(val, "argument index %" PRIu16 " not in range 0..%" PRIu32), index, count - 1); flags = val->cur_call->arg_flags[index]; switch (flags & ~MVM_CALLSITE_ARG_MASK) { case 0: /* positionals */ case MVM_CALLSITE_ARG_FLAT: val->remaining_positionals--; break; case MVM_CALLSITE_ARG_FLAT_NAMED: /* Nothing to do for this case. */ break; case MVM_CALLSITE_ARG_NAMED: val->expected_named_arg = flags & MVM_CALLSITE_ARG_MASK; goto named_arg; default: fail(val, MSG(val, "invalid argument flags (%i) at index %" PRIu16), (int)(flags & ~MVM_CALLSITE_ARG_MASK), index); } } goto regular_arg; named_arg: if (val->cur_info->opcode != MVM_OP_argconst_s) fail(val, MSG(val, "expected instruction 'argconst_s' but got '%s'"), val->cur_info->name); return; regular_arg: switch (val->cur_info->opcode) { case MVM_OP_arg_o: if(!(flags & MVM_CALLSITE_ARG_OBJ)) goto fail_arg; break; case MVM_OP_arg_s: if(!(flags & MVM_CALLSITE_ARG_STR)) goto fail_arg; break; case MVM_OP_argconst_s: if(!(flags & MVM_CALLSITE_ARG_STR)) goto fail_arg; break; case MVM_OP_arg_i: if(!(flags & MVM_CALLSITE_ARG_INT)) goto fail_arg; break; case MVM_OP_arg_n: if(!(flags & MVM_CALLSITE_ARG_NUM)) goto fail_arg; break; default: fail(val, MSG(val, "unexpected instruction '%s' during argument preparation"), val->cur_info->name); fail_arg: fail(val, MSG(val, "invalid argument (%i) for instruction %s"), (int)flags, val->cur_info->name); } } static void validate_block(Validator *val) { int block_id = val->cur_mark[1]; switch (block_id) { case 'a': { MVMuint16 index; ensure_op(val, MVM_OP_prepargs); validate_operands(val); index = GET_UI16(val->cur_op, -2); val->cur_call = val->cu->body.callsites[index]; val->cur_arg = 0; val->expected_named_arg = 0; val->remaining_args = val->cur_call->arg_count; val->remaining_positionals = val->cur_call->num_pos; break; } default: fail(val, MSG(val, "unknown instruction block '%c'"), block_id); } while (val->cur_op < val->bc_end) { int type, id; read_op(val); type = val->cur_mark[0]; id = val->cur_mark[1]; if (id != block_id) fail(val, MSG(val, "expected instruction marked '%c' but got '%c'"), block_id, id); switch (type) { case MARK_body: break; case MARK_tail: goto terminate_block; default: fail_illegal_mark(val); } switch (block_id) { case 'a': validate_operands(val); validate_arg(val); break; } } terminate_block: switch (block_id) { case 'a': validate_operands(val); ensure_no_remaining_positionals(val); break; } } /* Validate that a static frame's bytecode is executable by the interpreter. */ void MVM_validate_static_frame(MVMThreadContext *tc, MVMStaticFrame *static_frame) { MVMStaticFrameBody *fb = &static_frame->body; Validator val[1]; val->tc = tc; val->cu = fb->cu; val->frame = static_frame; val->loc_count = fb->num_locals; val->loc_types = fb->local_types; val->bc_size = fb->bytecode_size; val->src_cur_op = fb->bytecode; val->src_bc_end = fb->bytecode + fb->bytecode_size; val->labels = MVM_calloc(1, fb->bytecode_size); val->cur_info = NULL; val->cur_mark = NULL; val->cur_instr = 0; val->cur_call = NULL; val->cur_arg = 0; val->acceptable_max_arity = 0; val->checkarity_seen = 0; val->expected_named_arg = 0; val->remaining_positionals = 0; val->remaining_jumplabels = 0; val->reg_type_var = 0; #ifdef MVM_BIGENDIAN assert(fb->bytecode == fb->orig_bytecode); val->bc_start = MVM_malloc(fb->bytecode_size); memset(val->bc_start, 0xDB, fb->bytecode_size); fb->bytecode = val->bc_start; #else val->bc_start = fb->bytecode; #endif val->bc_end = val->bc_start + fb->bytecode_size; val->cur_op = val->bc_start; while (val->cur_op < val->bc_end) { read_op(val); if (val->cur_mark && val->cur_mark[0] == 's') fail(val, MSG(val, "Illegal appearance of spesh op")); switch (val->cur_mark[0]) { case MARK_regular: case MARK_special: validate_operands(val); break; case MARK_sequence: validate_sequence(val); break; case MARK_head: validate_block(val); break; default: fail_illegal_mark(val); } } validate_branch_targets(val); validate_final_return(val); /* Validation successful. Clear up instruction offsets. */ MVM_free(val->labels); } MoarVM-2018.03/src/core/validation.h0000644000175000017510000000032413237701240017223 0ustar samanthasamantha#define MVM_BC_ILLEGAL_OFFSET ((MVMuint32)-1) enum { MVM_BC_branch_target = 1 << 0, MVM_BC_op_boundary = 1 << 1, }; void MVM_validate_static_frame(MVMThreadContext *tc, MVMStaticFrame *static_frame); MoarVM-2018.03/src/core/vector.h0000644000175000017510000000410513237701240016374 0ustar samanthasamantha/* An as-small-as-possible dynamic array implementation. */ #define MVM_VECTOR_DECL(type, x) type *x; \ size_t x ## _num; \ size_t x ## _alloc #define MVM_VECTOR_INIT(x, size) do { \ size_t _s = (size); \ x = (_s > 0) ? MVM_calloc(_s, sizeof(*x)) : NULL; \ x ## _num = 0; \ x ## _alloc = _s; \ } while (0) #define MVM_VECTOR_DESTROY(x) do { \ MVM_free(x); \ x = NULL; \ x ## _num = 0; \ x ## _alloc = 0; \ } while (0) #define MVM_VECTOR_SIZE(x) \ (sizeof(*x) * (x ## _alloc)) #define MVM_VECTOR_TOP(x) \ ((x) + (x ## _num)) #define MVM_VECTOR_GROW(x, size) do {\ size_t _s = (size); \ x = MVM_realloc(x, _s*sizeof(*x)); \ memset(x + (x ## _alloc), 0, (_s - (x ## _alloc)) * sizeof(*x)); \ x ## _alloc = _s; \ } while (0) #define MVM_VECTOR_ENSURE_SIZE(x, size) do {\ size_t _s = (size); \ if (_s >= (x ## _alloc)) { \ size_t newsize = (x ## _alloc) * 2 + 2; \ while (_s >= newsize) newsize *= 2; \ MVM_VECTOR_GROW(x, newsize); \ } \ } while (0) #define MVM_VECTOR_ENSURE_SPACE(x, space) \ MVM_VECTOR_ENSURE_SIZE(x, (x ## _num) + (space)) #define MVM_VECTOR_PUSH(x, value) do { \ MVM_VECTOR_ENSURE_SPACE(x, 1); \ x[x ## _num++] = (value); \ } while(0) #define MVM_VECTOR_POP(x) \ (x)[--(x ## _num)] #define MVM_VECTOR_APPEND(x, ar, len) do { \ size_t _l = (len); \ MVM_VECTOR_ENSURE_SPACE(x, _l); \ memcpy(MVM_VECTOR_TOP(x), ar, _l * sizeof(x[0])); \ x ## _num += _l; \ } while(0) #define MVM_VECTOR_SPLICE(x, ofs, len, out) do { \ size_t _l = (len), _o = (ofs); \ void * buf = (out); \ if (buf != NULL) { memcpy(buf, (x) + _o, _l * sizeof(x[0])); } \ memmove((x) + _o, (x) + _o + _l, ((x ## _num) - _l - _o) * sizeof(x[0])); \ x ## _num -= _l; \ } while (0) #define MVM_VECTOR_ASSIGN(a, b) do { \ a = b; \ a ## _alloc = b ## _alloc; \ a ## _num = b ## _num; \ } while (0) MoarVM-2018.03/src/debug/debugserver.c0000644000175000017510000027541713252357700017565 0ustar samanthasamantha#include "moar.h" #include "platform/threads.h" #define bool int #define true TRUE #define false FALSE #include "cmp.h" #ifdef _WIN32 #include #include typedef SOCKET Socket; #define sa_family_t unsigned int #else #include "unistd.h" #include #include typedef int Socket; #define closesocket close #endif typedef enum { MT_MessageTypeNotUnderstood, MT_ErrorProcessingMessage, MT_OperationSuccessful, MT_IsExecutionSuspendedRequest, MT_IsExecutionSuspendedResponse, MT_SuspendAll, MT_ResumeAll, MT_SuspendOne, MT_ResumeOne, MT_ThreadStarted, MT_ThreadEnded, MT_ThreadListRequest, MT_ThreadListResponse, MT_ThreadStackTraceRequest, MT_ThreadStackTraceResponse, MT_SetBreakpointRequest, MT_SetBreakpointConfirmation, MT_BreakpointNotification, MT_ClearBreakpoint, MT_ClearAllBreakpoints, MT_StepInto, MT_StepOver, MT_StepOut, MT_StepCompleted, MT_ReleaseHandles, MT_HandleResult, MT_ContextHandle, MT_ContextLexicalsRequest, MT_ContextLexicalsResponse, MT_OuterContextRequest, MT_CallerContextRequest, MT_CodeObjectHandle, MT_ObjectAttributesRequest, MT_ObjectAttributesResponse, MT_DecontainerizeHandle, MT_FindMethod, MT_Invoke, MT_InvokeResult, MT_UnhandledException, MT_OperationUnsuccessful, MT_ObjectMetadataRequest, MT_ObjectMetadataResponse, MT_ObjectPositionalsRequest, MT_ObjectPositionalsResponse, MT_ObjectAssociativesRequest, MT_ObjectAssociativesResponse, } message_type; typedef enum { ArgKind_Handle, ArgKind_Integer, ArgKind_Num, ArgKind_String, } argument_kind; typedef struct { MVMuint8 arg_kind; union { MVMint64 i; MVMnum64 n; char *s; MVMint64 o; } arg_u; } argument_data; typedef enum { FS_type = 1, FS_id = 2, FS_thread_id = 4, FS_file = 8, FS_line = 16, FS_suspend = 32, FS_stacktrace = 64, /* handle_count is just bookkeeping */ FS_handles = 128, FS_handle_id = 256, FS_frame_number = 512, FS_arguments = 1024, } fields_set; typedef struct { MVMuint16 type; MVMuint64 id; MVMuint32 thread_id; char *file; MVMuint32 line; MVMuint8 suspend; MVMuint8 stacktrace; MVMuint16 handle_count; MVMuint64 *handles; MVMuint64 handle_id; MVMuint32 frame_number; MVMuint32 argument_count; argument_data *arguments; MVMuint8 parse_fail; const char *parse_fail_message; fields_set fields_set; } request_data; static MVMint32 write_stacktrace_frames(MVMThreadContext *dtc, cmp_ctx_t *ctx, MVMThread *thread); static MVMint32 request_all_threads_suspend(MVMThreadContext *dtc, cmp_ctx_t *ctx, request_data *argument); static MVMuint64 allocate_handle(MVMThreadContext *dtc, MVMObject *target); /* Breakpoint stuff */ MVM_PUBLIC void MVM_debugserver_register_line(MVMThreadContext *tc, char *filename, MVMuint32 filename_len, MVMuint32 line_no, MVMuint32 *file_idx) { MVMDebugServerData *debugserver = tc->instance->debugserver; MVMDebugServerBreakpointTable *table = debugserver->breakpoints; MVMDebugServerBreakpointFileTable *found = NULL; MVMuint32 index = 0; uv_mutex_lock(&debugserver->mutex_breakpoints); if (*file_idx < table->files_used) { MVMDebugServerBreakpointFileTable *file = &table->files[*file_idx]; if (file->filename_length == filename_len && memcmp(file->filename, filename, filename_len) == 0) found = file; } if (!found) { for (index = 0; index < table->files_used; index++) { MVMDebugServerBreakpointFileTable *file = &table->files[index]; if (file->filename_length != filename_len) continue; if (memcmp(file->filename, filename, filename_len) != 0) continue; found = file; *file_idx = index; break; } } if (!found) { if (table->files_used++ >= table->files_alloc) { MVMuint32 old_alloc = table->files_alloc; table->files_alloc *= 2; table->files = MVM_fixed_size_realloc_at_safepoint(tc, tc->instance->fsa, table->files, old_alloc * sizeof(MVMDebugServerBreakpointFileTable), table->files_alloc * sizeof(MVMDebugServerBreakpointFileTable)); memset((char *)(table->files + old_alloc), 0, (table->files_alloc - old_alloc) * sizeof(MVMDebugServerBreakpointFileTable) - 1); if (tc->instance->debugserver->debugspam_protocol) fprintf(stderr, "table for files increased to %u slots\n", table->files_alloc); } found = &table->files[table->files_used - 1]; if (tc->instance->debugserver->debugspam_protocol) fprintf(stderr, "created new file entry at %u for %s\n", table->files_used - 1, filename); found->filename = MVM_calloc(filename_len + 1, sizeof(char)); strncpy(found->filename, filename, filename_len); found->filename_length = filename_len; found->lines_active_alloc = line_no + 32; found->lines_active = MVM_fixed_size_alloc_zeroed(tc, tc->instance->fsa, found->lines_active_alloc * sizeof(MVMuint8)); *file_idx = table->files_used - 1; found->breakpoints = NULL; found->breakpoints_alloc = 0; found->breakpoints_used = 0; } if (found->lines_active_alloc < line_no + 1) { MVMuint32 old_size = found->lines_active_alloc; found->lines_active_alloc *= 2; if (tc->instance->debugserver->debugspam_protocol) fprintf(stderr, "increasing line number table for %s from %u to %u slots\n", filename, old_size, found->lines_active_alloc); found->lines_active = MVM_fixed_size_realloc_at_safepoint(tc, tc->instance->fsa, found->lines_active, old_size, found->lines_active_alloc); memset((char *)found->lines_active + old_size, 0, found->lines_active_alloc - old_size - 1); } uv_mutex_unlock(&debugserver->mutex_breakpoints); } static void stop_point_hit(MVMThreadContext *tc) { while (1) { /* We're in total regular boring execution. Set ourselves to * interrupted for suspend reasons */ if (MVM_cas(&tc->gc_status, MVMGCStatus_NONE, MVMGCStatus_INTERRUPT | MVMSuspendState_SUSPEND_REQUEST) == MVMGCStatus_NONE) { break; } /* Looks like another thread just interrupted us; join in on GC and * then this loop will store the suspend request flag when we're back * to MVMGCStatus_NONE. */ if (MVM_load(&tc->gc_status) == MVMGCStatus_INTERRUPT) { MVM_gc_enter_from_interrupt(tc); } /* Perhaps the debugserver just asked us to suspend, too. It's not * important for our suspend request flag to survive or something. */ if (MVM_load(&tc->gc_status) == (MVMGCStatus_INTERRUPT | MVMSuspendState_SUSPEND_REQUEST)) { break; } } MVM_gc_enter_from_interrupt(tc); } static MVMuint8 breakpoint_hit(MVMThreadContext *tc, MVMDebugServerBreakpointFileTable *file, MVMuint32 line_no) { cmp_ctx_t *ctx = NULL; MVMDebugServerBreakpointInfo *info; MVMuint32 index; MVMuint8 must_suspend = 0; if (tc->instance->debugserver && tc->instance->debugserver->messagepack_data) { ctx = (cmp_ctx_t*)tc->instance->debugserver->messagepack_data; } for (index = 0; index < file->breakpoints_used; index++) { info = &file->breakpoints[index]; if (info->line_no == line_no) { if (tc->instance->debugserver->debugspam_protocol) fprintf(stderr, "hit a breakpoint\n"); if (ctx) { uv_mutex_lock(&tc->instance->debugserver->mutex_network_send); cmp_write_map(ctx, 4); cmp_write_str(ctx, "id", 2); cmp_write_integer(ctx, info->breakpoint_id); cmp_write_str(ctx, "type", 4); cmp_write_integer(ctx, MT_BreakpointNotification); cmp_write_str(ctx, "thread", 6); cmp_write_integer(ctx, tc->thread_id); cmp_write_str(ctx, "frames", 6); if (info->send_backtrace) { write_stacktrace_frames(tc, ctx, tc->thread_obj); } else { cmp_write_nil(ctx); } uv_mutex_unlock(&tc->instance->debugserver->mutex_network_send); } if (info->shall_suspend) { must_suspend = 1; } } } return must_suspend; } static void step_point_hit(MVMThreadContext *tc) { cmp_ctx_t *ctx = (cmp_ctx_t*)tc->instance->debugserver->messagepack_data; uv_mutex_lock(&tc->instance->debugserver->mutex_network_send); cmp_write_map(ctx, 4); cmp_write_str(ctx, "id", 2); cmp_write_integer(ctx, tc->step_message_id); cmp_write_str(ctx, "type", 4); cmp_write_integer(ctx, MT_StepCompleted); cmp_write_str(ctx, "thread", 6); cmp_write_integer(ctx, tc->thread_id); cmp_write_str(ctx, "frames", 6); write_stacktrace_frames(tc, ctx, tc->thread_obj); uv_mutex_unlock(&tc->instance->debugserver->mutex_network_send); tc->step_mode = MVMDebugSteppingMode_NONE; tc->step_mode_frame = NULL; } MVM_PUBLIC void MVM_debugserver_breakpoint_check(MVMThreadContext *tc, MVMuint32 file_idx, MVMuint32 line_no) { MVMDebugServerData *debugserver = tc->instance->debugserver; MVMuint8 shall_suspend = 0; tc->cur_line_no = line_no; tc->cur_file_idx = file_idx; if (debugserver->any_breakpoints_at_all) { MVMDebugServerBreakpointTable *table = debugserver->breakpoints; MVMDebugServerBreakpointFileTable *found = &table->files[file_idx]; if (debugserver->any_breakpoints_at_all && found->breakpoints_used && found->lines_active[line_no]) { shall_suspend = 1; breakpoint_hit(tc, found, line_no); } } if (tc->step_mode) { if (tc->step_mode == MVMDebugSteppingMode_STEP_OVER) { if (line_no != tc->step_mode_line_no && tc->step_mode_frame == tc->cur_frame) { if (tc->instance->debugserver->debugspam_protocol) fprintf(stderr, "hit a stepping point: step over; %u != %u, %p == %p\n", line_no, tc->step_mode_line_no, tc->step_mode_frame, tc->cur_frame); step_point_hit(tc); shall_suspend = 1; } } else if (tc->step_mode == MVMDebugSteppingMode_STEP_INTO) { if (line_no != tc->step_mode_line_no && tc->step_mode_frame == tc->cur_frame || tc->step_mode_frame != tc->cur_frame) { if (tc->instance->debugserver->debugspam_protocol) if (line_no != tc->step_mode_line_no && tc->step_mode_frame == tc->cur_frame) fprintf(stderr, "hit a stepping point: step into; %u != %u, %p == %p\n", line_no, tc->step_mode_line_no, tc->step_mode_frame, tc->cur_frame); else fprintf(stderr, "hit a stepping point: step into; %u, %u, %p != %p\n", line_no, tc->step_mode_line_no, tc->step_mode_frame, tc->cur_frame); step_point_hit(tc); shall_suspend = 1; } } /* Nothing to do for STEP_OUT. */ /* else if (tc->step_mode == MVMDebugSteppingMode_STEP_OUT) { } */ } if (shall_suspend) stop_point_hit(tc); } #define REQUIRE(field, message) do { if(!(data->fields_set & (field))) { data->parse_fail = 1; data->parse_fail_message = (message); return 0; }; accepted = accepted | (field); } while (0) MVMuint8 check_requirements(request_data *data) { fields_set accepted = FS_id | FS_type; REQUIRE(FS_id, "An id field is required"); REQUIRE(FS_type, "A type field is required"); switch (data->type) { case MT_IsExecutionSuspendedRequest: case MT_SuspendAll: case MT_ResumeAll: case MT_ThreadListRequest: case MT_ClearAllBreakpoints: /* All of these messages only take id and type */ break; case MT_SuspendOne: case MT_ResumeOne: case MT_ThreadStackTraceRequest: case MT_StepInto: case MT_StepOver: case MT_StepOut: REQUIRE(FS_thread_id, "A thread field is required"); break; case MT_SetBreakpointRequest: REQUIRE(FS_suspend, "A suspend field is required"); REQUIRE(FS_stacktrace, "A stacktrace field is required"); /* Fall-Through */ case MT_ClearBreakpoint: REQUIRE(FS_file, "A file field is required"); REQUIRE(FS_line, "A line field is required"); break; case MT_ReleaseHandles: REQUIRE(FS_handles, "A handles field is required"); break; case MT_FindMethod: /* TODO we've got to have some name field or something */ /* Fall-Through */ case MT_DecontainerizeHandle: REQUIRE(FS_thread_id, "A thread field is required"); /* Fall-Through */ case MT_ContextLexicalsRequest: case MT_OuterContextRequest: case MT_CallerContextRequest: case MT_ObjectAttributesRequest: case MT_ObjectMetadataRequest: case MT_ObjectPositionalsRequest: case MT_ObjectAssociativesRequest: REQUIRE(FS_handle_id, "A handle field is required"); break; case MT_ContextHandle: case MT_CodeObjectHandle: REQUIRE(FS_thread_id, "A thread field is required"); REQUIRE(FS_frame_number, "A frame field is required"); break; case MT_Invoke: REQUIRE(FS_handle_id, "A handle field is required"); REQUIRE(FS_thread_id, "A thread field is required"); REQUIRE(FS_arguments, "An arguments field is required"); break; default: break; } if (data->fields_set != accepted) { data->parse_fail = 1; data->parse_fail_message = "Too many keys in message"; } } static MVMuint16 big_endian_16(MVMuint16 number) { #ifdef MVM_BIGENDIAN return number; #else char *bytes = (char *)&number; char tmp; tmp = bytes[1]; bytes[1] = bytes[0]; bytes[0] = tmp; return *((MVMuint16 *)bytes); #endif } static void send_greeting(Socket *sock) { char buffer[24] = "MOARVM-REMOTE-DEBUG\0"; MVMuint16 version = big_endian_16(1); MVMuint16 *verptr = (MVMuint16 *)(&buffer[strlen("MOARVM-REMOTE-DEBUG") + 1]); *verptr = version; verptr++; version = big_endian_16(0); *verptr = version; send(*sock, buffer, 24, 0); } static int receive_greeting(Socket *sock) { const char *expected = "MOARVM-REMOTE-CLIENT-OK"; char buffer[24]; int received = 0; memset(buffer, 0, sizeof(buffer)); received = recv(*sock, buffer, sizeof(buffer), 0); if (received != sizeof(buffer)) { return 0; } if (memcmp(buffer, expected, sizeof(buffer)) == 0) { return 1; } return 0; } static void communicate_error(MVMThreadContext *tc, cmp_ctx_t *ctx, request_data *argument) { if (argument) { if (tc->instance->debugserver->debugspam_protocol) fprintf(stderr, "communicating an error\n"); cmp_write_map(ctx, 2); cmp_write_str(ctx, "id", 2); cmp_write_integer(ctx, argument->id); cmp_write_str(ctx, "type", 4); cmp_write_integer(ctx, MT_ErrorProcessingMessage); } } static void communicate_success(MVMThreadContext *tc, cmp_ctx_t *ctx, request_data *argument) { if (argument) { if (tc->instance->debugserver->debugspam_protocol) fprintf(stderr, "communicating success\n"); cmp_write_map(ctx, 2); cmp_write_str(ctx, "id", 2); cmp_write_integer(ctx, argument->id); cmp_write_str(ctx, "type", 4); cmp_write_integer(ctx, MT_OperationSuccessful); } } /* Send spontaneous events */ MVM_PUBLIC void MVM_debugserver_notify_thread_creation(MVMThreadContext *tc) { if (tc->instance->debugserver && tc->instance->debugserver->messagepack_data) { cmp_ctx_t *ctx = (cmp_ctx_t*)tc->instance->debugserver->messagepack_data; MVMuint64 event_id; uv_mutex_lock(&tc->instance->debugserver->mutex_network_send); event_id = tc->instance->debugserver->event_id; tc->instance->debugserver->event_id += 2; cmp_write_map(ctx, 5); cmp_write_str(ctx, "id", 2); cmp_write_integer(ctx, event_id); cmp_write_str(ctx, "type", 4); cmp_write_integer(ctx, MT_ThreadStarted); cmp_write_str(ctx, "thread", 6); cmp_write_integer(ctx, tc->thread_obj->body.thread_id); cmp_write_str(ctx, "native_id", 9); cmp_write_integer(ctx, tc->thread_obj->body.native_thread_id); cmp_write_str(ctx, "app_lifetime", 12); cmp_write_integer(ctx, tc->thread_obj->body.app_lifetime); uv_mutex_unlock(&tc->instance->debugserver->mutex_network_send); } } MVM_PUBLIC void MVM_debugserver_notify_thread_destruction(MVMThreadContext *tc) { if (tc->instance->debugserver && tc->instance->debugserver->messagepack_data) { cmp_ctx_t *ctx = (cmp_ctx_t*)tc->instance->debugserver->messagepack_data; MVMuint64 event_id; uv_mutex_lock(&tc->instance->debugserver->mutex_network_send); event_id = tc->instance->debugserver->event_id; tc->instance->debugserver->event_id += 2; cmp_write_map(ctx, 3); cmp_write_str(ctx, "id", 2); cmp_write_integer(ctx, event_id); cmp_write_str(ctx, "type", 4); cmp_write_integer(ctx, MT_ThreadEnded); cmp_write_str(ctx, "thread", 6); cmp_write_integer(ctx, tc->thread_obj->body.thread_id); uv_mutex_unlock(&tc->instance->debugserver->mutex_network_send); } } MVM_PUBLIC void MVM_debugserver_notify_unhandled_exception(MVMThreadContext *tc, MVMException *ex) { if (tc->instance->debugserver && tc->instance->debugserver->messagepack_data) { cmp_ctx_t *ctx = (cmp_ctx_t*)tc->instance->debugserver->messagepack_data; MVMuint64 event_id; uv_mutex_lock(&tc->instance->debugserver->mutex_network_send); request_all_threads_suspend(tc, ctx, NULL); event_id = tc->instance->debugserver->event_id; tc->instance->debugserver->event_id += 2; cmp_write_map(ctx, 5); cmp_write_str(ctx, "id", 2); cmp_write_integer(ctx, event_id); cmp_write_str(ctx, "type", 4); cmp_write_integer(ctx, MT_UnhandledException); cmp_write_str(ctx, "handle", 6); cmp_write_integer(ctx, allocate_handle(tc, (MVMObject *)ex)); cmp_write_str(ctx, "thread", 6); cmp_write_integer(ctx, tc->thread_obj->body.thread_id); cmp_write_str(ctx, "frames", 6); write_stacktrace_frames(tc, ctx, tc->thread_obj); uv_mutex_unlock(&tc->instance->debugserver->mutex_network_send); MVM_gc_enter_from_interrupt(tc); } } static MVMuint8 is_thread_id_eligible(MVMInstance *vm, MVMuint32 id) { if (id == vm->debugserver->thread_id || id == vm->speshworker_thread_id) { return 0; } return 1; } /* Send replies to requests send by the client */ static MVMThread *find_thread_by_id(MVMInstance *vm, MVMint32 id) { MVMThread *cur_thread = 0; if (!is_thread_id_eligible(vm, id)) { return NULL; } uv_mutex_lock(&vm->mutex_threads); cur_thread = vm->threads; while (cur_thread) { if (cur_thread->body.thread_id == id) { break; } cur_thread = cur_thread->body.next; } uv_mutex_unlock(&vm->mutex_threads); return cur_thread; } static MVMint32 request_thread_suspends(MVMThreadContext *dtc, cmp_ctx_t *ctx, request_data *argument, MVMThread *thread) { MVMThread *to_do = thread ? thread : find_thread_by_id(dtc->instance, argument->thread_id); MVMThreadContext *tc = to_do ? to_do->body.tc : NULL; if (!tc) return 1; MVM_gc_mark_thread_blocked(dtc); while (1) { /* Is the thread currently doing completely ordinary code execution? */ if (MVM_cas(&tc->gc_status, MVMGCStatus_NONE, MVMGCStatus_INTERRUPT | MVMSuspendState_SUSPEND_REQUEST) == MVMGCStatus_NONE) { break; } /* Is the thread in question currently blocked, i.e. spending time in * some long-running piece of C code, waiting for I/O, etc.? * If so, just store the suspend request bit so when it unblocks itself * it'll suspend execution. */ if (MVM_cas(&tc->gc_status, MVMGCStatus_UNABLE, MVMGCStatus_UNABLE | MVMSuspendState_SUSPEND_REQUEST) == MVMGCStatus_UNABLE) { break; } /* Was the thread faster than us? For example by running into * a breakpoint, completing a step, or encountering an * unhandled exception? If so, we're done here. */ if ((MVM_load(&tc->gc_status) & MVMSUSPENDSTATUS_MASK) == MVMSuspendState_SUSPEND_REQUEST) { break; } MVM_platform_thread_yield(); } if (argument && argument->type == MT_SuspendOne) communicate_success(tc, ctx, argument); MVM_gc_mark_thread_unblocked(dtc); if (tc->instance->debugserver->debugspam_protocol) fprintf(stderr, "thread %u successfully suspended\n", tc->thread_id); return 0; } static MVMint32 request_all_threads_suspend(MVMThreadContext *dtc, cmp_ctx_t *ctx, request_data *argument) { MVMInstance *vm = dtc->instance; MVMThread *cur_thread = 0; MVMuint32 success = 1; uv_mutex_lock(&vm->mutex_threads); /* TODO track which threads we successfully suspended so we can wake them * up again if an error occured */ cur_thread = vm->threads; while (cur_thread) { if (is_thread_id_eligible(vm, cur_thread->body.thread_id)) { AO_t current = MVM_load(&cur_thread->body.tc->gc_status); if (current == MVMGCStatus_NONE || current == MVMGCStatus_UNABLE) { MVMint32 result = request_thread_suspends(dtc, ctx, argument, cur_thread); if (result == 1) { success = 0; break; } } } cur_thread = cur_thread->body.next; } if (success) communicate_success(dtc, ctx, argument); else communicate_error(dtc, ctx, argument); uv_mutex_unlock(&vm->mutex_threads); } static MVMint32 request_thread_resumes(MVMThreadContext *dtc, cmp_ctx_t *ctx, request_data *argument, MVMThread *thread) { MVMInstance *vm = dtc->instance; MVMThread *to_do = thread ? thread : find_thread_by_id(vm, argument->thread_id); MVMThreadContext *tc = to_do ? to_do->body.tc : NULL; AO_t current; if (!tc) { return 1; } current = MVM_load(&tc->gc_status); if (current != (MVMGCStatus_UNABLE | MVMSuspendState_SUSPENDED) && (current & MVMSUSPENDSTATUS_MASK) != MVMSuspendState_SUSPEND_REQUEST) { fprintf(stderr, "wrong state to resume from: %lu\n", MVM_load(&tc->gc_status)); return 1; } MVM_gc_mark_thread_blocked(dtc); while(1) { current = MVM_cas(&tc->gc_status, MVMGCStatus_UNABLE | MVMSuspendState_SUSPENDED, MVMGCStatus_UNABLE); if (current == (MVMGCStatus_UNABLE | MVMSuspendState_SUSPENDED)) { /* Success! We signalled the thread and can now tell it to * mark itself unblocked, which takes care of any looming GC * and related business. */ uv_cond_broadcast(&vm->debugserver->tell_threads); break; } else if ((current & MVMGCSTATUS_MASK) == MVMGCStatus_STOLEN) { uv_mutex_lock(&tc->instance->mutex_gc_orchestrate); if (tc->instance->in_gc) { uv_cond_wait(&tc->instance->cond_blocked_can_continue, &tc->instance->mutex_gc_orchestrate); } uv_mutex_unlock(&tc->instance->mutex_gc_orchestrate); } else { if (current == (MVMGCStatus_UNABLE | MVMSuspendState_SUSPEND_REQUEST)) { if (MVM_cas(&tc->gc_status, current, MVMGCStatus_UNABLE) == current) { break; } } } } MVM_gc_mark_thread_unblocked(dtc); if (argument && argument->type == MT_ResumeOne) communicate_success(tc, ctx, argument); if (tc->instance->debugserver->debugspam_protocol) fprintf(stderr, "success resuming thread; its status is now %lu\n", MVM_load(&tc->gc_status)); return 0; } static MVMint32 request_all_threads_resume(MVMThreadContext *dtc, cmp_ctx_t *ctx, request_data *argument) { MVMInstance *vm = dtc->instance; MVMThread *cur_thread = 0; MVMuint8 success = 1; uv_mutex_lock(&vm->mutex_threads); cur_thread = vm->threads; while (cur_thread) { if (cur_thread != dtc->thread_obj) { AO_t current = MVM_load(&cur_thread->body.tc->gc_status); if (current == (MVMGCStatus_UNABLE | MVMSuspendState_SUSPENDED) || current == (MVMGCStatus_INTERRUPT | MVMSuspendState_SUSPEND_REQUEST) || current == (MVMGCStatus_STOLEN | MVMSuspendState_SUSPEND_REQUEST)) { if (request_thread_resumes(dtc, ctx, argument, cur_thread)) { if (vm->debugserver->debugspam_protocol) fprintf(stderr, "failure to resume thread %u\n", cur_thread->body.thread_id); success = 0; break; } } } cur_thread = cur_thread->body.next; } if (success) communicate_success(dtc, ctx, argument); else communicate_error(dtc, ctx, argument); uv_mutex_unlock(&vm->mutex_threads); return !success; } static MVMint32 write_stacktrace_frames(MVMThreadContext *dtc, cmp_ctx_t *ctx, MVMThread *thread) { MVMThreadContext *tc = thread->body.tc; MVMuint64 stack_size = 0; MVMFrame *cur_frame = tc->cur_frame; while (cur_frame != NULL) { stack_size++; cur_frame = cur_frame->caller; } if (tc->instance->debugserver->debugspam_protocol) fprintf(stderr, "dumping a stack trace of %lu frames\n", stack_size); cmp_write_array(ctx, stack_size); cur_frame = tc->cur_frame; stack_size = 0; /* To check if we've got the topmost frame or not */ while (cur_frame != NULL) { MVMString *bc_filename = cur_frame->static_info->body.cu->body.filename; MVMString *name = cur_frame->static_info->body.name; MVMuint8 *cur_op = stack_size != 0 ? cur_frame->return_address : *(tc->interp_cur_op); MVMuint32 offset = cur_op - MVM_frame_effective_bytecode(cur_frame); MVMBytecodeAnnotation *annot = MVM_bytecode_resolve_annotation(tc, &cur_frame->static_info->body, offset > 0 ? offset - 1 : 0); MVMint32 line_number = annot ? annot->line_number : 1; MVMint16 string_heap_index = annot ? annot->filename_string_heap_index : 1; char *tmp1 = annot && string_heap_index < cur_frame->static_info->body.cu->body.num_strings ? MVM_string_utf8_encode_C_string(tc, MVM_cu_string(tc, cur_frame->static_info->body.cu, string_heap_index)) : NULL; char *filename_c = bc_filename ? MVM_string_utf8_encode_C_string(tc, bc_filename) : NULL; char *name_c = name ? MVM_string_utf8_encode_C_string(tc, name) : NULL; MVMObject *code_ref = cur_frame->code_ref; MVMCode *code_obj = code_ref && REPR(code_ref)->ID == MVM_REPR_ID_MVMCode ? (MVMCode*)code_ref : NULL; char *debugname = code_obj && code_obj->body.code_object ? MVM_6model_get_debug_name(tc, code_obj->body.code_object) : ""; cmp_write_map(ctx, 5); cmp_write_str(ctx, "file", 4); cmp_write_str(ctx, tmp1, tmp1 ? strlen(tmp1) : 0); cmp_write_str(ctx, "line", 4); cmp_write_integer(ctx, line_number); cmp_write_str(ctx, "bytecode_file", 13); if (bc_filename) cmp_write_str(ctx, filename_c, strlen(filename_c)); else cmp_write_nil(ctx); cmp_write_str(ctx, "name", 4); cmp_write_str(ctx, name_c, name_c ? strlen(name_c) : 0); cmp_write_str(ctx, "type", 4); cmp_write_str(ctx, debugname, strlen(debugname)); if (bc_filename) MVM_free(filename_c); if (name) MVM_free(name_c); if (tmp1) MVM_free(tmp1); cur_frame = cur_frame->caller; stack_size++; } } static MVMint32 request_thread_stacktrace(MVMThreadContext *dtc, cmp_ctx_t *ctx, request_data *argument, MVMThread *thread) { MVMThread *to_do = thread ? thread : find_thread_by_id(dtc->instance, argument->thread_id); if (!to_do) return 1; if ((to_do->body.tc->gc_status & MVMGCSTATUS_MASK) != MVMGCStatus_UNABLE) { return 1; } cmp_write_map(ctx, 3); cmp_write_str(ctx, "id", 2); cmp_write_integer(ctx, argument->id); cmp_write_str(ctx, "type", 4); cmp_write_integer(ctx, MT_ThreadStackTraceResponse); cmp_write_str(ctx, "frames", 6); write_stacktrace_frames(dtc, ctx, to_do); return 0; } static void send_thread_info(MVMThreadContext *dtc, cmp_ctx_t *ctx, request_data *argument) { MVMInstance *vm = dtc->instance; MVMint32 threadcount = 0; MVMThread *cur_thread; char infobuf[32] = "THL"; uv_mutex_lock(&vm->mutex_threads); cur_thread = vm->threads; while (cur_thread) { threadcount++; cur_thread = cur_thread->body.next; } cmp_write_map(ctx, 3); cmp_write_str(ctx, "id", 2); cmp_write_integer(ctx, argument->id); cmp_write_str(ctx, "type", 4); cmp_write_integer(ctx, MT_ThreadListResponse); cmp_write_str(ctx, "threads", 7); cmp_write_array(ctx, threadcount); cur_thread = vm->threads; while (cur_thread) { cmp_write_map(ctx, 5); cmp_write_str(ctx, "thread", 6); cmp_write_integer(ctx, cur_thread->body.thread_id); cmp_write_str(ctx, "native_id", 9); cmp_write_integer(ctx, cur_thread->body.native_thread_id); cmp_write_str(ctx, "app_lifetime", 12); cmp_write_bool(ctx, cur_thread->body.app_lifetime); cmp_write_str(ctx, "suspended", 9); cmp_write_bool(ctx, (MVM_load(&cur_thread->body.tc->gc_status) & MVMSUSPENDSTATUS_MASK) != MVMSuspendState_NONE); cmp_write_str(ctx, "num_locks", 9); cmp_write_integer(ctx, cur_thread->body.tc->num_locks); cur_thread = cur_thread->body.next; } uv_mutex_unlock(&vm->mutex_threads); } static MVMuint64 send_is_execution_suspended_info(MVMThreadContext *dtc, cmp_ctx_t *ctx, request_data *argument) { MVMInstance *vm = dtc->instance; MVMuint8 result = 1; MVMThread *cur_thread; uv_mutex_lock(&vm->mutex_threads); cur_thread = vm->threads; while (cur_thread) { if ((MVM_load(&cur_thread->body.tc->gc_status) & MVMSUSPENDSTATUS_MASK) != MVMSuspendState_SUSPENDED && cur_thread->body.thread_id != vm->debugserver->thread_id && cur_thread->body.thread_id != vm->speshworker_thread_id) { result = 0; break; } cur_thread = cur_thread->body.next; } uv_mutex_unlock(&vm->mutex_threads); cmp_write_map(ctx, 3); cmp_write_str(ctx, "id", 2); cmp_write_integer(ctx, argument->id); cmp_write_str(ctx, "type", 4); cmp_write_integer(ctx, MT_IsExecutionSuspendedResponse); cmp_write_str(ctx, "suspended", 9); cmp_write_bool(ctx, result); } MVMuint8 setup_step(MVMThreadContext *dtc, cmp_ctx_t *ctx, request_data *argument, MVMDebugSteppingMode mode, MVMThread *thread) { MVMThread *to_do = thread ? thread : find_thread_by_id(dtc->instance, argument->thread_id); MVMThreadContext *tc; if (!to_do) return 1; if ((to_do->body.tc->gc_status & MVMGCSTATUS_MASK) != MVMGCStatus_UNABLE) { return 1; } tc = to_do->body.tc; tc->step_mode_frame = tc->cur_frame; tc->step_message_id = argument->id; tc->step_mode_line_no = tc->cur_line_no; tc->step_mode_file_idx = tc->cur_file_idx; tc->step_mode = mode; request_thread_resumes(dtc, ctx, NULL, to_do); return 0; } void MVM_debugserver_add_breakpoint(MVMThreadContext *tc, cmp_ctx_t *ctx, request_data *argument) { MVMDebugServerData *debugserver = tc->instance->debugserver; MVMDebugServerBreakpointTable *table = debugserver->breakpoints; MVMDebugServerBreakpointFileTable *found = NULL; MVMDebugServerBreakpointInfo *bp_info = NULL; MVMuint32 index = 0; if (tc->instance->debugserver->debugspam_protocol) fprintf(stderr, "asked to set a breakpoint for file %s line %u to send id %lu\n", argument->file, argument->line, argument->id); MVM_debugserver_register_line(tc, argument->file, strlen(argument->file), argument->line, &index); uv_mutex_lock(&debugserver->mutex_breakpoints); found = &table->files[index]; /* Create breakpoint first so that if a thread breaks on the activated line * the breakpoint information already exists */ if (found->breakpoints_alloc == 0) { found->breakpoints_alloc = 4; found->breakpoints = MVM_fixed_size_alloc_zeroed(tc, tc->instance->fsa, found->breakpoints_alloc * sizeof(MVMDebugServerBreakpointInfo)); } if (found->breakpoints_used++ >= found->breakpoints_alloc) { MVMuint32 old_alloc = found->breakpoints_alloc; found->breakpoints_alloc *= 2; found->breakpoints = MVM_fixed_size_realloc_at_safepoint(tc, tc->instance->fsa, found->breakpoints, old_alloc * sizeof(MVMDebugServerBreakpointInfo), found->breakpoints_alloc * sizeof(MVMDebugServerBreakpointInfo)); if (tc->instance->debugserver->debugspam_protocol) fprintf(stderr, "table for breakpoints increased to %u slots\n", found->breakpoints_alloc); } bp_info = &found->breakpoints[found->breakpoints_used - 1]; bp_info->breakpoint_id = argument->id; bp_info->line_no = argument->line; bp_info->shall_suspend = argument->suspend; bp_info->send_backtrace = argument->stacktrace; debugserver->any_breakpoints_at_all++; if (tc->instance->debugserver->debugspam_protocol) fprintf(stderr, "breakpoint settings: index %u bpid %lu lineno %u suspend %u backtrace %u\n", found->breakpoints_used - 1, argument->id, argument->line, argument->suspend, argument->stacktrace); found->lines_active[argument->line] = 1; cmp_write_map(ctx, 3); cmp_write_str(ctx, "id", 2); cmp_write_integer(ctx, argument->id); cmp_write_str(ctx, "type", 4); cmp_write_integer(ctx, MT_SetBreakpointConfirmation); cmp_write_str(ctx, "line", 4); cmp_write_integer(ctx, argument->line); uv_mutex_unlock(&debugserver->mutex_breakpoints); } void MVM_debugserver_clear_all_breakpoints(MVMThreadContext *tc, cmp_ctx_t *ctx, request_data *argument) { MVMDebugServerData *debugserver = tc->instance->debugserver; MVMDebugServerBreakpointTable *table = debugserver->breakpoints; MVMDebugServerBreakpointFileTable *found = NULL; MVMuint32 index; uv_mutex_lock(&debugserver->mutex_breakpoints); for (index = 0; index < table->files_used; index++) { found = &table->files[index]; memset(found->lines_active, 0, found->lines_active_alloc * sizeof(MVMuint8)); found->breakpoints_used = 0; } debugserver->any_breakpoints_at_all = 0; uv_mutex_unlock(&debugserver->mutex_breakpoints); /* When a client disconnects, we clear all breakpoints but don't * send a confirmation. In this case ctx and argument will be NULL */ if (ctx && argument) communicate_success(tc, ctx, argument); } void MVM_debugserver_clear_breakpoint(MVMThreadContext *tc, cmp_ctx_t *ctx, request_data *argument) { MVMDebugServerData *debugserver = tc->instance->debugserver; MVMDebugServerBreakpointTable *table = debugserver->breakpoints; MVMDebugServerBreakpointFileTable *found = NULL; MVMuint32 index = 0; MVMuint32 bpidx = 0; MVMuint32 num_cleared = 0; MVM_debugserver_register_line(tc, argument->file, strlen(argument->file), argument->line, &index); if (tc->instance->debugserver->debugspam_protocol) fprintf(stderr, "asked to clear breakpoints for file %s line %u\n", argument->file, argument->line); uv_mutex_lock(&debugserver->mutex_breakpoints); found = &table->files[index]; if (tc->instance->debugserver->debugspam_protocol) { fprintf(stderr, "dumping all breakpoints\n"); for (bpidx = 0; bpidx < found->breakpoints_used; bpidx++) { MVMDebugServerBreakpointInfo *bp_info = &found->breakpoints[bpidx]; fprintf(stderr, "breakpoint index %u has id %lu, is at line %u\n", bpidx, bp_info->breakpoint_id, bp_info->line_no); } } if (tc->instance->debugserver->debugspam_protocol) fprintf(stderr, "trying to clear breakpoints\n\n"); for (bpidx = 0; bpidx < found->breakpoints_used; bpidx++) { MVMDebugServerBreakpointInfo *bp_info = &found->breakpoints[bpidx]; if (tc->instance->debugserver->debugspam_protocol) fprintf(stderr, "breakpoint index %u has id %lu, is at line %u\n", bpidx, bp_info->breakpoint_id, bp_info->line_no); if (bp_info->line_no == argument->line) { if (tc->instance->debugserver->debugspam_protocol) fprintf(stderr, "breakpoint with id %ld cleared\n", bp_info->breakpoint_id); found->breakpoints[bpidx] = found->breakpoints[--found->breakpoints_used]; num_cleared++; bpidx--; debugserver->any_breakpoints_at_all--; } } uv_mutex_unlock(&debugserver->mutex_breakpoints); if (num_cleared > 0) communicate_success(tc, ctx, argument); else communicate_error(tc, ctx, argument); } static void release_all_handles(MVMThreadContext *dtc) { MVMDebugServerHandleTable *dht = dtc->instance->debugserver->handle_table; dht->used = 0; dht->next_id = 1; } static MVMuint64 release_handles(MVMThreadContext *dtc, cmp_ctx_t *ctx, request_data *argument) { MVMDebugServerHandleTable *dht = dtc->instance->debugserver->handle_table; MVMuint16 handle_index = 0; MVMuint16 id_index = 0; MVMuint16 handles_cleared = 0; for (handle_index = 0; handle_index < dht->used; handle_index++) { for (id_index = 0; id_index < argument->handle_count; id_index++) { if (argument->handles[id_index] == dht->entries[handle_index].id) { dht->used--; dht->entries[handle_index].id = dht->entries[dht->used].id; dht->entries[handle_index].target = dht->entries[dht->used].target; handle_index--; handles_cleared++; break; } } } if (handles_cleared != argument->handle_count) { return 1; } else { return 0; } } static MVMuint64 allocate_handle(MVMThreadContext *dtc, MVMObject *target) { if (!target || MVM_is_null(dtc, target)) { return 0; } else { MVMDebugServerHandleTable *dht = dtc->instance->debugserver->handle_table; MVMuint64 id = dht->next_id++; if (dht->used + 1 > dht->allocated) { if (dht->allocated < 8192) dht->allocated *= 2; else dht->allocated += 1024; dht->entries = MVM_realloc(dht->entries, sizeof(MVMDebugServerHandleTableEntry) * dht->allocated); } dht->entries[dht->used].id = id; dht->entries[dht->used].target = target; dht->used++; return id; } } static MVMuint64 allocate_and_send_handle(MVMThreadContext *dtc, cmp_ctx_t *ctx, request_data *argument, MVMObject *target) { MVMuint64 id = allocate_handle(dtc, target); cmp_write_map(ctx, 3); cmp_write_str(ctx, "id", 2); cmp_write_integer(ctx, argument->id); cmp_write_str(ctx, "type", 4); cmp_write_integer(ctx, MT_HandleResult); cmp_write_str(ctx, "handle", 6); cmp_write_integer(ctx, id); return id; } static MVMObject *find_handle_target(MVMThreadContext *dtc, MVMuint64 id) { MVMDebugServerHandleTable *dht = dtc->instance->debugserver->handle_table; MVMuint32 index; for (index = 0; index < dht->used; index++) { if (dht->entries[index].id == id) return dht->entries[index].target; } return NULL; } static MVMint32 create_context_or_code_obj_debug_handle(MVMThreadContext *dtc, cmp_ctx_t *ctx, request_data *argument, MVMThread *thread) { MVMInstance *vm = dtc->instance; MVMThread *to_do = thread ? thread : find_thread_by_id(vm, argument->thread_id); if (!to_do) { if (dtc->instance->debugserver->debugspam_protocol) fprintf(stderr, "no thread found for context/code obj handle (or thread not eligible)\n"); return 1; } if ((to_do->body.tc->gc_status & MVMGCSTATUS_MASK) != MVMGCStatus_UNABLE) { if (dtc->instance->debugserver->debugspam_protocol) fprintf(stderr, "can only retrieve a context or code obj handle if thread is 'UNABLE' (is %lu)\n", to_do->body.tc->gc_status); return 1; } { MVMFrame *cur_frame = to_do->body.tc->cur_frame; MVMuint32 frame_idx; for (frame_idx = 0; cur_frame && frame_idx < argument->frame_number; frame_idx++, cur_frame = cur_frame->caller) { } if (!cur_frame) { if (dtc->instance->debugserver->debugspam_protocol) fprintf(stderr, "couldn't create context/coderef handle: no such frame %d\n", argument->frame_number); return 1; } if (argument->type == MT_ContextHandle) { MVMROOT(dtc, cur_frame, { if (MVM_FRAME_IS_ON_CALLSTACK(dtc, cur_frame)) { cur_frame = MVM_frame_debugserver_move_to_heap(dtc, to_do->body.tc, cur_frame); } allocate_and_send_handle(dtc, ctx, argument, MVM_frame_context_wrapper(dtc, cur_frame)); }); } else if (argument->type == MT_CodeObjectHandle) { allocate_and_send_handle(dtc, ctx, argument, cur_frame->code_ref); } else { if (dtc->instance->debugserver->debugspam_protocol) fprintf(stderr, "Did not expect to see create_context_or_code_obj_debug_handle called with a %d type\n", argument->type); return 1; } } return 0; } static MVMint32 create_caller_or_outer_context_debug_handle(MVMThreadContext *dtc, cmp_ctx_t *ctx, request_data *argument, MVMThread *thread) { MVMObject *this_ctx = argument->handle_id ? find_handle_target(dtc, argument->handle_id) : dtc->instance->VMNull; MVMFrame *frame; if (!IS_CONCRETE(this_ctx) || REPR(this_ctx)->ID != MVM_REPR_ID_MVMContext) { if (dtc->instance->debugserver->debugspam_protocol) fprintf(stderr, "outer/caller context handle must refer to a definite MVMContext object\n"); return 1; } if (argument->type == MT_OuterContextRequest) { if ((frame = ((MVMContext *)this_ctx)->body.context->outer)) this_ctx = MVM_frame_context_wrapper(dtc, frame); } else if (argument->type == MT_CallerContextRequest) { if ((frame = ((MVMContext *)this_ctx)->body.context->caller)) this_ctx = MVM_frame_context_wrapper(dtc, frame); } allocate_and_send_handle(dtc, ctx, argument, this_ctx); return 0; } static MVMint32 request_context_lexicals(MVMThreadContext *dtc, cmp_ctx_t *ctx, request_data *argument) { MVMObject *this_ctx = argument->handle_id ? find_handle_target(dtc, argument->handle_id) : dtc->instance->VMNull; MVMStaticFrame *static_info; MVMLexicalRegistry *lexical_names; MVMFrame *frame; if (MVM_is_null(dtc, this_ctx) || !IS_CONCRETE(this_ctx) || REPR(this_ctx)->ID != MVM_REPR_ID_MVMContext) { if (dtc->instance->debugserver->debugspam_protocol) fprintf(stderr, "getting lexicals: context handle must refer to a definite MVMContext object\n"); return 1; } if (!(frame = ((MVMContext *)this_ctx)->body.context)) { if (dtc->instance->debugserver->debugspam_protocol) fprintf(stderr, "context doesn't have a frame?!\n"); return 1; } static_info = frame->static_info; lexical_names = static_info->body.lexical_names; if (lexical_names) { MVMLexicalRegistry *entry, *tmp; unsigned bucket_tmp; MVMuint64 lexcount = HASH_CNT(hash_handle, lexical_names); MVMuint64 lexical_index = 0; cmp_write_map(ctx, 3); cmp_write_str(ctx, "id", 2); cmp_write_integer(ctx, argument->id); cmp_write_str(ctx, "type", 4); cmp_write_integer(ctx, MT_ContextLexicalsResponse); cmp_write_str(ctx, "lexicals", 8); cmp_write_map(ctx, lexcount); if (dtc->instance->debugserver->debugspam_protocol) fprintf(stderr, "will write %lu lexicals\n", lexcount); HASH_ITER(hash_handle, lexical_names, entry, tmp, bucket_tmp) { MVMuint16 lextype = static_info->body.lexical_types[entry->value]; MVMRegister *result = &frame->env[entry->value]; char *c_key_name; if (entry->key && IS_CONCRETE(entry->key)) c_key_name = MVM_string_utf8_encode_C_string(dtc, entry->key); else { c_key_name = MVM_malloc(12 + 16); sprintf(c_key_name, "", lexical_index); } cmp_write_str(ctx, c_key_name, strlen(c_key_name)); MVM_free(c_key_name); if (lextype == MVM_reg_obj) { /* Object */ char *debugname; if (!result->o) { /* XXX this can't allocate? */ MVM_frame_vivify_lexical(dtc, frame, entry->value); } cmp_write_map(ctx, 5); cmp_write_str(ctx, "kind", 4); cmp_write_str(ctx, "obj", 3); cmp_write_str(ctx, "handle", 6); cmp_write_integer(ctx, allocate_handle(dtc, result->o)); debugname = MVM_6model_get_debug_name(dtc, result->o); cmp_write_str(ctx, "type", 4); cmp_write_str(ctx, debugname, strlen(debugname)); cmp_write_str(ctx, "concrete", 8); cmp_write_bool(ctx, IS_CONCRETE(result->o)); cmp_write_str(ctx, "container", 9); cmp_write_bool(ctx, STABLE(result->o)->container_spec == NULL ? 0 : 1); } else { cmp_write_map(ctx, 2); cmp_write_str(ctx, "kind", 4); cmp_write_str(ctx, lextype == MVM_reg_int64 ? "int" : lextype == MVM_reg_num32 ? "num" : lextype == MVM_reg_str ? "str" : "???", 3); cmp_write_str(ctx, "value", 5); if (lextype == MVM_reg_int64) { cmp_write_integer(ctx, result->i64); } else if (lextype == MVM_reg_num64) { cmp_write_double(ctx, result->n64); } else if (lextype == MVM_reg_str) { if (result->s && IS_CONCRETE(result->s)) { char *c_value = MVM_string_utf8_encode_C_string(dtc, result->s); cmp_write_str(ctx, c_value, strlen(c_value)); MVM_free(c_value); } else { cmp_write_nil(ctx); } } else { if (dtc->instance->debugserver->debugspam_protocol) fprintf(stderr, "what lexical type is %d supposed to be?\n", lextype); cmp_write_nil(ctx); } } if (dtc->instance->debugserver->debugspam_protocol) fprintf(stderr, "wrote a lexical\n"); lexical_index++; } } else { cmp_write_map(ctx, 3); cmp_write_str(ctx, "id", 2); cmp_write_integer(ctx, argument->id); cmp_write_str(ctx, "type", 4); cmp_write_integer(ctx, MT_ContextLexicalsResponse); cmp_write_str(ctx, "lexicals", 8); cmp_write_map(ctx, 0); } if (dtc->instance->debugserver->debugspam_protocol) fprintf(stderr, "done writing lexicals\n"); return 0; } MVM_STATIC_INLINE MVMObject * get_obj_at_offset(void *data, MVMint64 offset) { void *location = (char *)data + offset; return *((MVMObject **)location); } static MVMint32 request_object_attributes(MVMThreadContext *dtc, cmp_ctx_t *ctx, request_data *argument) { MVMInstance *vm = dtc->instance; MVMObject *target = argument->handle_id ? find_handle_target(dtc, argument->handle_id) : dtc->instance->VMNull; if (MVM_is_null(dtc, target)) { if (vm->debugserver->debugspam_protocol) fprintf(stderr, "target of attributes request is null\n"); return 1; } if (!IS_CONCRETE(target)) { if (vm->debugserver->debugspam_protocol) fprintf(stderr, "target of attributes request is not concrete\n"); return 1; } if (dtc->instance->debugserver->debugspam_protocol) fprintf(stderr, "writing attributes of a %s\n", MVM_6model_get_debug_name(dtc, target)); cmp_write_map(ctx, 3); cmp_write_str(ctx, "id", 2); cmp_write_integer(ctx, argument->id); cmp_write_str(ctx, "type", 4); cmp_write_integer(ctx, MT_ObjectAttributesResponse); cmp_write_str(ctx, "attributes", 10); if (REPR(target)->ID == MVM_REPR_ID_P6opaque) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData *)STABLE(target)->REPR_data; MVMP6opaqueBody *data = MVM_p6opaque_real_data(dtc, OBJECT_BODY(target)); if (repr_data) { MVMint16 num_attributes = 0; MVMP6opaqueNameMap * name_to_index_mapping = repr_data->name_to_index_mapping; while (name_to_index_mapping != NULL && name_to_index_mapping->class_key != NULL) { num_attributes += name_to_index_mapping->num_attrs; name_to_index_mapping++; } name_to_index_mapping = repr_data->name_to_index_mapping; cmp_write_array(ctx, num_attributes); if (vm->debugserver->debugspam_protocol) fprintf(stderr, "going to write out %d attributes\n", num_attributes); if (name_to_index_mapping != NULL) { MVMint16 i; MVMP6opaqueNameMap *cur_map_entry = name_to_index_mapping; while (cur_map_entry->class_key != NULL) { MVMint16 i; MVMint64 slot; char *class_name = MVM_6model_get_stable_debug_name(dtc, cur_map_entry->class_key->st); if (vm->debugserver->debugspam_protocol) fprintf(stderr, "class %s has %d attributes\n", class_name, cur_map_entry->num_attrs); for (i = 0; i < cur_map_entry->num_attrs; i++) { char * name = MVM_string_utf8_encode_C_string(dtc, cur_map_entry->names[i]); slot = cur_map_entry->slots[i]; if (slot >= 0) { MVMuint16 const offset = repr_data->attribute_offsets[slot]; MVMSTable * const attr_st = repr_data->flattened_stables[slot]; if (attr_st == NULL) { MVMObject *value = get_obj_at_offset(data, offset); char *value_debug_name = value ? MVM_6model_get_debug_name(dtc, value) : "VMNull"; if (vm->debugserver->debugspam_protocol) fprintf(stderr, "Writing an object attribute\n"); cmp_write_map(ctx, 7); cmp_write_str(ctx, "name", 4); cmp_write_str(ctx, name, strlen(name)); cmp_write_str(ctx, "class", 5); cmp_write_str(ctx, class_name, strlen(class_name)); cmp_write_str(ctx, "kind", 4); cmp_write_str(ctx, "obj", 3); cmp_write_str(ctx, "handle", 6); cmp_write_integer(ctx, allocate_handle(dtc, value)); cmp_write_str(ctx, "type", 4); cmp_write_str(ctx, value_debug_name, strlen(value_debug_name)); cmp_write_str(ctx, "concrete", 8); cmp_write_bool(ctx, !MVM_is_null(dtc, value) && IS_CONCRETE(value)); cmp_write_str(ctx, "container", 9); if (MVM_is_null(dtc, value)) cmp_write_bool(ctx, 0); else cmp_write_bool(ctx, STABLE(value)->container_spec == NULL ? 0 : 1); } else { const MVMStorageSpec *attr_storage_spec = attr_st->REPR->get_storage_spec(dtc, attr_st); if (vm->debugserver->debugspam_protocol) fprintf(stderr, "Writing a native attribute\n"); cmp_write_map(ctx, 4); cmp_write_str(ctx, "name", 4); cmp_write_str(ctx, name, strlen(name)); cmp_write_str(ctx, "class", 5); cmp_write_str(ctx, class_name, strlen(class_name)); cmp_write_str(ctx, "kind", 4); switch (attr_storage_spec->boxed_primitive) { case MVM_STORAGE_SPEC_BP_INT: cmp_write_str(ctx, "int", 3); cmp_write_str(ctx, "value", 5); cmp_write_integer(ctx, attr_st->REPR->box_funcs.get_int(dtc, attr_st, target, (char *)data + offset)); break; case MVM_STORAGE_SPEC_BP_NUM: cmp_write_str(ctx, "num", 3); cmp_write_str(ctx, "value", 5); cmp_write_double(ctx, attr_st->REPR->box_funcs.get_num(dtc, attr_st, target, (char *)data + offset)); break; case MVM_STORAGE_SPEC_BP_STR: { MVMString * const s = attr_st->REPR->box_funcs.get_str(dtc, attr_st, target, (char *)data + offset); char * str; if (s) str = MVM_string_utf8_encode_C_string(dtc, s); cmp_write_str(ctx, "str", 3); cmp_write_str(ctx, "value", 5); if (s) { cmp_write_str(ctx, str, strlen(str)); MVM_free(str); } else { cmp_write_nil(ctx); } break; } default: cmp_write_str(ctx, "error", 5); cmp_write_str(ctx, "value", 5); cmp_write_str(ctx, "error", 5); break; } } } MVM_free(name); } cur_map_entry++; } } return 0; } else { if (vm->debugserver->debugspam_protocol) fprintf(stderr, "This class isn't composed yet!\n"); cmp_write_str(ctx, "error: not composed yet", 22); return 0; } } else { cmp_write_array(ctx, 0); return 0; } return 1; } static void write_object_features(MVMThreadContext *tc, cmp_ctx_t *ctx, MVMuint8 attributes, MVMuint8 positional, MVMuint8 associative) { cmp_write_str(ctx, "attr_features", 13); cmp_write_bool(ctx, attributes); cmp_write_str(ctx, "pos_features", 12); cmp_write_bool(ctx, positional); cmp_write_str(ctx, "ass_features", 12); cmp_write_bool(ctx, associative); } static void write_vmarray_slot_type(MVMThreadContext *tc, cmp_ctx_t *ctx, MVMuint8 slot_type) { char *text = "unknown"; switch (slot_type) { case MVM_ARRAY_OBJ: text = "obj"; break; case MVM_ARRAY_STR: text = "str"; break; case MVM_ARRAY_I64: text = "i64"; break; case MVM_ARRAY_I32: text = "i32"; break; case MVM_ARRAY_I16: text = "i16"; break; case MVM_ARRAY_I8: text = "i8"; break; case MVM_ARRAY_N64: text = "n64"; break; case MVM_ARRAY_N32: text = "n32"; break; case MVM_ARRAY_U64: text = "u64"; break; case MVM_ARRAY_U32: text = "u32"; break; case MVM_ARRAY_U16: text = "u16"; break; case MVM_ARRAY_U8: text = "u8"; break; case MVM_ARRAY_U4: text = "u4"; break; case MVM_ARRAY_U2: text = "u2"; break; case MVM_ARRAY_U1: text = "u1"; break; case MVM_ARRAY_I4: text = "i4"; break; case MVM_ARRAY_I2: text = "i2"; break; case MVM_ARRAY_I1: text = "i1"; break; } cmp_write_str(ctx, text, strlen(text)); } static MVMuint16 write_vmarray_slot_kind(MVMThreadContext *tc, cmp_ctx_t *ctx, MVMuint8 slot_type) { char *text = "unknown"; MVMuint16 kind = 0; switch (slot_type) { case MVM_ARRAY_OBJ: text = "obj"; kind = MVM_reg_obj; break; case MVM_ARRAY_STR: text = "str"; kind = MVM_reg_str; break; case MVM_ARRAY_I64: case MVM_ARRAY_I32: case MVM_ARRAY_I16: case MVM_ARRAY_I8: text = "int"; kind = MVM_reg_int64; break; case MVM_ARRAY_N64: case MVM_ARRAY_N32: text = "num"; kind = MVM_reg_num64; break; case MVM_ARRAY_U64: case MVM_ARRAY_U32: case MVM_ARRAY_U16: case MVM_ARRAY_U8: case MVM_ARRAY_U4: case MVM_ARRAY_U2: case MVM_ARRAY_U1: case MVM_ARRAY_I4: case MVM_ARRAY_I2: case MVM_ARRAY_I1: text = "int"; kind = MVM_reg_int64; break; } cmp_write_str(ctx, text, strlen(text)); return kind; } static MVMint32 request_object_metadata(MVMThreadContext *dtc, cmp_ctx_t *ctx, request_data *argument) { MVMInstance *vm = dtc->instance; MVMObject *target = argument->handle_id ? find_handle_target(dtc, argument->handle_id) : dtc->instance->VMNull; MVMint64 slots = 2; /* Always have the repr name and debug name */ MVMuint32 repr_id; if (MVM_is_null(dtc, target)) { return 1; } cmp_write_map(ctx, 3); cmp_write_str(ctx, "id", 2); cmp_write_integer(ctx, argument->id); cmp_write_str(ctx, "type", 4); cmp_write_integer(ctx, MT_ObjectMetadataResponse); cmp_write_str(ctx, "metadata", 8); if (IS_CONCRETE(target)) { slots++; if (REPR(target)->unmanaged_size) slots++; } repr_id = REPR(target)->ID; if (repr_id == MVM_REPR_ID_P6opaque) { MVMP6opaqueREPRData *repr_data = (MVMP6opaqueREPRData*)(STABLE(target)->REPR_data); MVMP6opaqueBody *body = &((MVMP6opaque *)target)->body; if (IS_CONCRETE(target)) { slots += 1; /* Replaced? */ } slots += 5; /* pos/ass del slots, int/num/str unbox slots */ /*slots++; [> storage spec <]*/ slots += 3; /* features */ cmp_write_map(ctx, slots); cmp_write_str(ctx, "p6opaque_pos_delegate_slot", 21); cmp_write_int(ctx, repr_data->pos_del_slot); cmp_write_str(ctx, "p6opaque_ass_delegate_slot", 21); cmp_write_int(ctx, repr_data->ass_del_slot); cmp_write_str(ctx, "p6opaque_unbox_int_slot", 23); cmp_write_int(ctx, repr_data->unbox_int_slot); cmp_write_str(ctx, "p6opaque_unbox_num_slot", 23); cmp_write_int(ctx, repr_data->unbox_num_slot); cmp_write_str(ctx, "p6opaque_unbox_str_slot", 23); cmp_write_int(ctx, repr_data->unbox_str_slot); if (IS_CONCRETE(target)) { cmp_write_str(ctx, "p6opaque_body_replaced", 22); cmp_write_bool(ctx, !!body->replaced); } write_object_features(dtc, ctx, 1, 0, 0); /* TODO maybe output additional unbox slots, too? */ /*cmp_write_str(ctx, "storage_spec", 12);*/ /*write_storage_spec(dtc, ctx, repr_data->storage_spec);*/ } else if (repr_id == MVM_REPR_ID_VMArray) { MVMArrayREPRData *repr_data = (MVMArrayREPRData *)(STABLE(target)->REPR_data); char *debugname = repr_data->elem_type ? MVM_6model_get_debug_name(dtc, repr_data->elem_type) : NULL; if (IS_CONCRETE(target)) { slots += 3; /* slots allocated / used, storage size */ } slots += 3; slots += 3; /* features */ cmp_write_map(ctx, slots); cmp_write_str(ctx, "vmarray_elem_size", 17); cmp_write_int(ctx, repr_data->elem_size); cmp_write_str(ctx, "vmarray_slot_type", 17); write_vmarray_slot_type(dtc, ctx, repr_data->slot_type); cmp_write_str(ctx, "vmarray_elem_type", 17); if (debugname) cmp_write_str(ctx, debugname, strlen(debugname)); else cmp_write_nil(ctx); if (IS_CONCRETE(target)) { MVMArrayBody *body = (MVMArrayBody *)OBJECT_BODY(target); cmp_write_str(ctx, "positional_elems", 16); cmp_write_int(ctx, body->elems); cmp_write_str(ctx, "vmarray_start", 13); cmp_write_int(ctx, body->start); cmp_write_str(ctx, "vmarray_ssize", 13); cmp_write_int(ctx, body->ssize); } write_object_features(dtc, ctx, 0, 1, 0); } else if (repr_id == MVM_REPR_ID_MVMHash) { if (IS_CONCRETE(target)) { slots += 4; /* num_buckets, num_items, nonideal_items, ineff_expands */ } slots += 3; /* features */ cmp_write_map(ctx, slots); if (IS_CONCRETE(target)) { MVMHashBody *body = (MVMHashBody *)OBJECT_BODY(target); MVMHashEntry *handle = body->hash_head; UT_hash_table *tbl = handle ? body->hash_head->hash_handle.tbl : 0; if (tbl) { cmp_write_str(ctx, "mvmhash_num_buckets", 19); cmp_write_int(ctx, tbl->num_buckets); cmp_write_str(ctx, "mvmhash_num_items", 17); cmp_write_int(ctx, tbl->num_items); cmp_write_str(ctx, "mvmhash_nonideal_items", 22); cmp_write_int(ctx, tbl->nonideal_items); cmp_write_str(ctx, "mvmhash_ineff_expands", 21); cmp_write_int(ctx, tbl->ineff_expands); } else { cmp_write_str(ctx, "mvmhash_num_buckets", 19); cmp_write_int(ctx, 0); cmp_write_str(ctx, "mvmhash_num_items", 17); cmp_write_int(ctx, 0); cmp_write_str(ctx, "mvmhash_nonideal_items", 22); cmp_write_int(ctx, 0); cmp_write_str(ctx, "mvmhash_ineff_expands", 21); cmp_write_int(ctx, 0); } } write_object_features(dtc, ctx, 0, 0, 1); } else if (repr_id == MVM_REPR_ID_MVMContext) { MVMFrame *frame = ((MVMContext *)target)->body.context; MVMArgProcContext *argctx = &frame->params; MVMCallsite *cs = argctx->callsite; MVMCallsiteEntry *cse = argctx->arg_flags ? argctx->arg_flags : cs->arg_flags; MVMuint16 flag_idx; MVMuint16 flag_count = argctx->arg_flags ? argctx->flag_count : cs->flag_count; char *name = MVM_string_utf8_encode_C_string(dtc, frame->static_info->body.name); char *cuuid = MVM_string_utf8_encode_C_string(dtc, frame->static_info->body.cuuid); slots += 8; slots += 3; /* features */ cmp_write_map(ctx, slots); cmp_write_str(ctx, "frame_on_heap", 13); cmp_write_bool(ctx, !MVM_FRAME_IS_ON_CALLSTACK(dtc, frame)); cmp_write_str(ctx, "frame_work_size", 15); cmp_write_int(ctx, frame->allocd_work); cmp_write_str(ctx, "frame_env_size", 15); cmp_write_int(ctx, frame->allocd_env); cmp_write_str(ctx, "frame_name", 10); cmp_write_str(ctx, name, strlen(name)); cmp_write_str(ctx, "frame_cuuid", 11); cmp_write_str(ctx, cuuid, strlen(cuuid)); cmp_write_str(ctx, "frame_num_locals", 16); cmp_write_int(ctx, frame->static_info->body.num_locals); cmp_write_str(ctx, "frame_num_lexicals", 18); cmp_write_int(ctx, frame->static_info->body.num_lexicals); cmp_write_str(ctx, "callsite_flags", 14); cmp_write_array(ctx, flag_count); for (flag_idx = 0; flag_idx < flag_count; flag_idx++) { MVMCallsiteEntry entry = cse[flag_idx]; MVMuint8 entry_count = !!(entry & MVM_CALLSITE_ARG_OBJ) + !!(entry & MVM_CALLSITE_ARG_INT) + !!(entry & MVM_CALLSITE_ARG_NUM) + !!(entry & MVM_CALLSITE_ARG_STR) + !!(entry & MVM_CALLSITE_ARG_NAMED) + !!(entry & MVM_CALLSITE_ARG_FLAT) + !!(entry & MVM_CALLSITE_ARG_FLAT_NAMED); cmp_write_array(ctx, entry_count ? entry_count : 0); if (entry & MVM_CALLSITE_ARG_OBJ) cmp_write_str(ctx, "obj", 3); if (entry & MVM_CALLSITE_ARG_INT) cmp_write_str(ctx, "int", 3); if (entry & MVM_CALLSITE_ARG_NUM) cmp_write_str(ctx, "num", 3); if (entry & MVM_CALLSITE_ARG_STR) cmp_write_str(ctx, "str", 3); if (entry & MVM_CALLSITE_ARG_NAMED) cmp_write_str(ctx, "named", 5); if (entry & MVM_CALLSITE_ARG_FLAT) cmp_write_str(ctx, "flat", 4); if (entry & MVM_CALLSITE_ARG_FLAT_NAMED) cmp_write_str(ctx, "flat&named", 10); if (!entry_count) cmp_write_str(ctx, "nothing", 7); } MVM_free(name); MVM_free(cuuid); write_object_features(dtc, ctx, 0, 0, 0); } else if (repr_id == MVM_REPR_ID_P6str && IS_CONCRETE(target)) { MVMP6strBody *body = (MVMP6strBody *)OBJECT_BODY(target); MVMString *string = body->value; char *value = MVM_string_utf8_encode_C_string(dtc, string); slots += 2; slots += 3; /* features */ if (string->body.storage_type == MVM_STRING_STRAND) slots += 5; cmp_write_map(ctx, slots); cmp_write_str(ctx, "string_value", 12); cmp_write_str(ctx, value, strlen(value)); cmp_write_str(ctx, "string_storage_kind", 19); switch (string->body.storage_type) { case MVM_STRING_GRAPHEME_32: cmp_write_str(ctx, "grapheme32", 10); break; case MVM_STRING_GRAPHEME_ASCII: cmp_write_str(ctx, "graphemeASCII", 13); break; case MVM_STRING_GRAPHEME_8: cmp_write_str(ctx, "grapheme8", 9); break; case MVM_STRING_STRAND: cmp_write_str(ctx, "strands", 7); break; default: cmp_write_str(ctx, "???", 3); } if (string->body.storage_type == MVM_STRING_STRAND) { MVMuint16 num_strands = string->body.num_strands; MVMuint16 strand_idx; cmp_write_str(ctx, "string_strand_count", 19); cmp_write_int(ctx, num_strands); cmp_write_str(ctx, "string_strand_starts", 20); cmp_write_array(ctx, num_strands); for (strand_idx = 0; strand_idx < num_strands; strand_idx++) { cmp_write_int(ctx, string->body.storage.strands[strand_idx].start); } cmp_write_str(ctx, "string_strand_ends", 18); cmp_write_array(ctx, num_strands); for (strand_idx = 0; strand_idx < num_strands; strand_idx++) { cmp_write_int(ctx, string->body.storage.strands[strand_idx].end); } cmp_write_str(ctx, "string_strand_repetitions", 25); cmp_write_array(ctx, num_strands); for (strand_idx = 0; strand_idx < num_strands; strand_idx++) { cmp_write_int(ctx, string->body.storage.strands[strand_idx].repetitions); } cmp_write_str(ctx, "string_strand_target_length", 27); cmp_write_array(ctx, num_strands); for (strand_idx = 0; strand_idx < num_strands; strand_idx++) { cmp_write_int(ctx, string->body.storage.strands[strand_idx].blob_string->body.num_graphs); } } write_object_features(dtc, ctx, 0, 0, 0); MVM_free(value); } else { cmp_write_map(ctx, slots); } if (REPR(target)->unmanaged_size && IS_CONCRETE(target)) { cmp_write_str(ctx, "unmanaged_size", 14); cmp_write_int(ctx, REPR(target)->unmanaged_size(dtc, STABLE(target), OBJECT_BODY(target))); } if (IS_CONCRETE(target)) { cmp_write_str(ctx, "size", 4); cmp_write_int(ctx, target->header.size); } cmp_write_str(ctx, "repr_name", 9); cmp_write_str(ctx, REPR(target)->name, strlen(REPR(target)->name)); { char *debug_name = MVM_6model_get_debug_name(dtc, target); cmp_write_str(ctx, "debug_name", 10); cmp_write_str(ctx, debug_name, strlen(debug_name)); } return 0; } static MVMint32 request_object_positionals(MVMThreadContext *dtc, cmp_ctx_t *ctx, request_data *argument) { MVMObject *target = argument->handle_id ? find_handle_target(dtc, argument->handle_id) : dtc->instance->VMNull; MVMint64 slots; if (MVM_is_null(dtc, target)) { return 1; } if (REPR(target)->ID == MVM_REPR_ID_VMArray) { MVMArrayBody *body = (MVMArrayBody *)OBJECT_BODY(target); MVMArrayREPRData *repr_data = (MVMArrayREPRData *)STABLE(target)->REPR_data; MVMuint16 kind; MVMint64 index; cmp_write_map(ctx, 5); cmp_write_str(ctx, "id", 2); cmp_write_integer(ctx, argument->id); cmp_write_str(ctx, "type", 4); cmp_write_integer(ctx, MT_ObjectPositionalsResponse); cmp_write_str(ctx, "kind", 4); kind = write_vmarray_slot_kind(dtc, ctx, repr_data->slot_type); cmp_write_str(ctx, "start", 5); cmp_write_int(ctx, 0); cmp_write_str(ctx, "contents", 8); cmp_write_array(ctx, body->elems); for (index = 0; index < body->elems; index++) { MVMRegister target_reg; REPR(target)->pos_funcs.at_pos(dtc, STABLE(target), target, body, index, &target_reg, kind); switch (kind) { case MVM_reg_obj: { MVMObject *value = target_reg.o; char *value_debug_name = value ? MVM_6model_get_debug_name(dtc, value) : "VMNull"; cmp_write_map(ctx, 4); cmp_write_str(ctx, "handle", 6); cmp_write_integer(ctx, allocate_handle(dtc, value)); cmp_write_str(ctx, "type", 4); cmp_write_str(ctx, value_debug_name, strlen(value_debug_name)); cmp_write_str(ctx, "concrete", 8); cmp_write_bool(ctx, !MVM_is_null(dtc, value) && IS_CONCRETE(value)); cmp_write_str(ctx, "container", 9); if (MVM_is_null(dtc, value)) cmp_write_bool(ctx, 0); else cmp_write_bool(ctx, STABLE(value)->container_spec == NULL ? 0 : 1); break; } case MVM_reg_int64: { cmp_write_int(ctx, target_reg.i64); break; } case MVM_reg_num64: cmp_write_double(ctx, target_reg.n64); break; case MVM_reg_str: { char *c_value = MVM_string_utf8_encode_C_string(dtc, target_reg.s); cmp_write_str(ctx, c_value, strlen(c_value)); MVM_free(c_value); break; } default: cmp_write_nil(ctx); } } return 0; } return 1; } static MVMint32 request_object_associatives(MVMThreadContext *dtc, cmp_ctx_t *ctx, request_data *argument) { MVMObject *target = argument->handle_id ? find_handle_target(dtc, argument->handle_id) : dtc->instance->VMNull; if (MVM_is_null(dtc, target)) { return 1; } if (!IS_CONCRETE(target)) { return 1; } if (REPR(target)->ID == MVM_REPR_ID_MVMHash) { MVMHashBody *body = (MVMHashBody *)OBJECT_BODY(target); MVMuint64 count = HASH_CNT(hash_handle, body->hash_head); MVMHashEntry *entry = NULL; MVMHashEntry *tmp = NULL; unsigned bucket_tmp; cmp_write_map(ctx, 4); cmp_write_str(ctx, "id", 2); cmp_write_integer(ctx, argument->id); cmp_write_str(ctx, "type", 4); cmp_write_integer(ctx, MT_ObjectAssociativesResponse); cmp_write_str(ctx, "kind", 4); cmp_write_str(ctx, "obj", 3); cmp_write_str(ctx, "contents", 8); cmp_write_map(ctx, count); HASH_ITER(hash_handle, body->hash_head, entry, tmp, bucket_tmp) { char *key = MVM_string_utf8_encode_C_string(dtc, entry->hash_handle.key); MVMObject *value = entry->value; char *value_debug_name = value ? MVM_6model_get_debug_name(dtc, value) : "VMNull"; cmp_write_str(ctx, key, strlen(key)); cmp_write_map(ctx, 4); cmp_write_str(ctx, "handle", 6); cmp_write_integer(ctx, allocate_handle(dtc, value)); cmp_write_str(ctx, "type", 4); cmp_write_str(ctx, value_debug_name, strlen(value_debug_name)); cmp_write_str(ctx, "concrete", 8); cmp_write_bool(ctx, !MVM_is_null(dtc, value) && IS_CONCRETE(value)); cmp_write_str(ctx, "container", 9); if (MVM_is_null(dtc, value)) cmp_write_bool(ctx, 0); else cmp_write_bool(ctx, STABLE(value)->container_spec == NULL ? 0 : 1); MVM_free(key); } } } MVMuint8 debugspam_network; static bool socket_reader(cmp_ctx_t *ctx, void *data, size_t limit) { size_t idx; size_t total_read = 0; size_t read; MVMuint8 *orig_data = (MVMuint8 *)data; if (debugspam_network) fprintf(stderr, "asked to read %lu bytes\n", limit); while (total_read < limit) { if ((read = recv(*((Socket*)ctx->buf), data, limit, 0)) == -1) { if (debugspam_network) fprintf(stderr, "minus one\n"); return 0; } else if (read == 0) { if (debugspam_network) fprintf(stderr, "end of file - socket probably closed\nignore warnings about parse errors\n"); return 0; } if (debugspam_network) fprintf(stderr, "%lu ", read); data = (void *)(((MVMuint8*)data) + read); total_read += read; } if (debugspam_network) { fprintf(stderr, "... recv received %lu bytes\n", total_read); fprintf(stderr, "cmp read: "); for (idx = 0; idx < limit; idx++) { fprintf(stderr, "%x ", orig_data[idx]); } fprintf(stderr, "\n"); } return 1; } static size_t socket_writer(cmp_ctx_t *ctx, const void *data, size_t limit) { size_t idx; size_t total_sent = 0; size_t sent; MVMuint8 *orig_data = (MVMuint8 *)data; if (debugspam_network) fprintf(stderr, "asked to send %3lu bytes: ", limit); while (total_sent < limit) { if ((sent = send(*(Socket*)ctx->buf, data, limit, 0)) == -1) { if (debugspam_network) fprintf(stderr, "but couldn't (socket disconnected?)\n"); return 0; } else if (sent == 0) { if (debugspam_network) fprintf(stderr, "send encountered end of file\n"); return 0; } if (debugspam_network) fprintf(stderr, "%2lu ", sent); data = (void *)(((MVMuint8*)data) + sent); total_sent += sent; } if (debugspam_network) fprintf(stderr, "... send sent %3lu bytes\n", total_sent); return 1; } static bool is_valid_int(cmp_object_t *obj, MVMint64 *result) { switch (obj->type) { case CMP_TYPE_POSITIVE_FIXNUM: case CMP_TYPE_UINT8: *result = obj->as.u8; break; case CMP_TYPE_UINT16: *result = obj->as.u16; break; case CMP_TYPE_UINT32: *result = obj->as.u32; break; case CMP_TYPE_UINT64: *result = obj->as.u64; break; case CMP_TYPE_NEGATIVE_FIXNUM: case CMP_TYPE_SINT8: *result = obj->as.s8; break; case CMP_TYPE_SINT16: *result = obj->as.s16; break; case CMP_TYPE_SINT32: *result = obj->as.s32; break; case CMP_TYPE_SINT64: *result = obj->as.s64; break; case CMP_TYPE_BOOLEAN: *result = obj->as.boolean; break; default: return 0; } return 1; } #define CHECK(operation, message) do { if(!(operation)) { data->parse_fail = 1; data->parse_fail_message = (message); if (tc->instance->debugserver->debugspam_protocol) fprintf(stderr, "CMP error: %s\n", cmp_strerror(ctx)); return 0; } } while(0) #define FIELD_FOUND(field, duplicated_message) do { if(data->fields_set & (field)) { data->parse_fail = 1; data->parse_fail_message = duplicated_message; return 0; }; field_to_set = (field); } while (0) MVMint32 parse_message_map(MVMThreadContext *tc, cmp_ctx_t *ctx, request_data *data) { MVMuint32 map_size = 0; MVMuint32 i; cmp_object_t obj; memset(data, 0, sizeof(request_data)); CHECK(cmp_read_object(ctx, &obj), "couldn't read envelope object!"); switch (obj.type) { case CMP_TYPE_FIXMAP: case CMP_TYPE_MAP16: case CMP_TYPE_MAP32: map_size = obj.as.map_size; break; default: if (tc->instance->debugserver->debugspam_protocol) fprintf(stderr, "expected a map, but got %d\n", obj.type); data->parse_fail = 1; data->parse_fail_message = "expected a map as the envelope"; return 0; } for (i = 0; i < map_size; i++) { char key_str[16]; MVMuint32 str_size = 16; fields_set field_to_set = 0; MVMuint32 type_to_parse = 0; CHECK(cmp_read_str(ctx, key_str, &str_size), "Couldn't read string key"); if (strncmp(key_str, "type", 15) == 0) { FIELD_FOUND(FS_type, "type field duplicated"); type_to_parse = 1; } else if (strncmp(key_str, "id", 15) == 0) { FIELD_FOUND(FS_id, "id field duplicated"); type_to_parse = 1; } else if (strncmp(key_str, "thread", 15) == 0) { FIELD_FOUND(FS_thread_id, "thread field duplicated"); type_to_parse = 1; } else if (strncmp(key_str, "frame", 15) == 0) { FIELD_FOUND(FS_frame_number, "frame number field duplicated"); type_to_parse = 1; } else if (strncmp(key_str, "handle", 15) == 0) { FIELD_FOUND(FS_handle_id, "handle field duplicated"); type_to_parse = 1; } else if (strncmp(key_str, "line", 15) == 0) { FIELD_FOUND(FS_line, "line field duplicated"); type_to_parse = 1; } else if (strncmp(key_str, "suspend", 15) == 0) { FIELD_FOUND(FS_suspend, "suspend field duplicated"); type_to_parse = 1; } else if (strncmp(key_str, "stacktrace", 15) == 0) { FIELD_FOUND(FS_stacktrace, "stacktrace field duplicated"); type_to_parse = 1; } else if (strncmp(key_str, "file", 15) == 0) { FIELD_FOUND(FS_file, "file field duplicated"); type_to_parse = 2; } else if (strncmp(key_str, "handles", 15) == 0) { FIELD_FOUND(FS_handles, "handles field duplicated"); type_to_parse = 3; } else { if (tc->instance->debugserver->debugspam_protocol) fprintf(stderr, "the hell is a %s?\n", key_str); data->parse_fail = 1; data->parse_fail_message = "Unknown field encountered (NYI or protocol violation)"; return 0; } if (type_to_parse == 1) { cmp_object_t object; MVMuint64 result; CHECK(cmp_read_object(ctx, &object), "Couldn't read value for a key"); CHECK(is_valid_int(&object, &result), "Couldn't read integer value for a key"); switch (field_to_set) { case FS_type: data->type = result; break; case FS_id: data->id = result; break; case FS_thread_id: data->thread_id = result; break; case FS_frame_number: data->frame_number = result; break; case FS_handle_id: data->handle_id = result; break; case FS_line: data->line = result; break; case FS_suspend: data->suspend = result; break; case FS_stacktrace: data->stacktrace = result; break; default: data->parse_fail = 1; data->parse_fail_message = "Int field to set NYI"; return 0; } data->fields_set = data->fields_set | field_to_set; } else if (type_to_parse == 2) { uint32_t strsize = 1024; char *string = MVM_calloc(strsize, sizeof(char)); if (tc->instance->debugserver->debugspam_protocol) fprintf(stderr, "reading a string for %s\n", key_str); CHECK(cmp_read_str(ctx, string, &strsize), "Couldn't read string for a key"); switch (field_to_set) { case FS_file: data->file = string; break; default: data->parse_fail = 1; data->parse_fail_message = "Str field to set NYI"; return 0; } data->fields_set = data->fields_set | field_to_set; } else if (type_to_parse == 3) { uint32_t arraysize = 0; uint32_t index; CHECK(cmp_read_array(ctx, &arraysize), "Couldn't read array for a key"); data->handle_count = arraysize; data->handles = MVM_malloc(arraysize * sizeof(MVMuint64)); for (index = 0; index < arraysize; index++) { cmp_object_t object; MVMuint64 result; CHECK(cmp_read_object(ctx, &object), "Couldn't read value for a key"); CHECK(is_valid_int(&object, &result), "Couldn't read integer value for a key"); data->handles[index] = result; } data->fields_set = data->fields_set | field_to_set; } } return check_requirements(data); } #define COMMUNICATE_RESULT(operation) do { if((operation)) { communicate_error(tc, &ctx, &argument); } else { communicate_success(tc, &ctx, &argument); } } while (0) #define COMMUNICATE_ERROR(operation) do { if((operation)) { communicate_error(tc, &ctx, &argument); } } while (0) static void debugserver_worker(MVMThreadContext *tc, MVMCallsite *callsite, MVMRegister *args) { int continue_running = 1; MVMint32 command_serial; Socket listensocket; MVMInstance *vm = tc->instance; MVMuint64 port = vm->debugserver->port; vm->debugserver->thread_id = tc->thread_obj->body.thread_id; { char portstr[16]; struct addrinfo *res; int error; snprintf(portstr, 16, "%lu", port); getaddrinfo("localhost", portstr, NULL, &res); listensocket = socket(res->ai_family, SOCK_STREAM, 0); #ifndef _WIN32 { int one = 1; setsockopt(listensocket, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); } #endif if (bind(listensocket, res->ai_addr, res->ai_addrlen) == -1) { MVM_panic(1, "Could not bind to socket: %s", strerror(errno)); } freeaddrinfo(res); if (listen(listensocket, 1) == -1) { MVM_panic(1, "Could not listen on socket: %s", strerror(errno)); } } while(continue_running) { Socket clientsocket; int len; char *buffer[32]; cmp_ctx_t ctx; MVM_gc_mark_thread_blocked(tc); clientsocket = accept(listensocket, NULL, NULL); MVM_gc_mark_thread_unblocked(tc); send_greeting(&clientsocket); if (!receive_greeting(&clientsocket)) { if (tc->instance->debugserver->debugspam_protocol) fprintf(stderr, "did not receive greeting properly\n"); close(clientsocket); continue; } cmp_init(&ctx, &clientsocket, socket_reader, NULL, socket_writer); vm->debugserver->messagepack_data = (void*)&ctx; while (clientsocket) { request_data argument; MVM_gc_mark_thread_blocked(tc); parse_message_map(tc, &ctx, &argument); MVM_gc_mark_thread_unblocked(tc); uv_mutex_lock(&vm->debugserver->mutex_network_send); if (argument.parse_fail) { if (tc->instance->debugserver->debugspam_protocol) fprintf(stderr, "failed to parse this message: %s\n", argument.parse_fail_message); cmp_write_map(&ctx, 3); cmp_write_str(&ctx, "id", 2); cmp_write_integer(&ctx, argument.id); cmp_write_str(&ctx, "type", 4); cmp_write_integer(&ctx, 1); cmp_write_str(&ctx, "reason", 6); cmp_write_str(&ctx, argument.parse_fail_message, strlen(argument.parse_fail_message)); close(clientsocket); uv_mutex_unlock(&vm->debugserver->mutex_network_send); break; } if (vm->debugserver->debugspam_protocol) fprintf(stderr, "debugserver received packet %lu, command %u\n", argument.id, argument.type); switch (argument.type) { case MT_IsExecutionSuspendedRequest: send_is_execution_suspended_info(tc, &ctx, &argument); break; case MT_SuspendAll: COMMUNICATE_ERROR(request_all_threads_suspend(tc, &ctx, &argument)); break; case MT_ResumeAll: COMMUNICATE_ERROR(request_all_threads_resume(tc, &ctx, &argument)); break; case MT_SuspendOne: COMMUNICATE_ERROR(request_thread_suspends(tc, &ctx, &argument, NULL)); break; case MT_ResumeOne: COMMUNICATE_ERROR(request_thread_resumes(tc, &ctx, &argument, NULL)); break; case MT_ThreadListRequest: send_thread_info(tc, &ctx, &argument); break; case MT_ThreadStackTraceRequest: if (request_thread_stacktrace(tc, &ctx, &argument, NULL)) { communicate_error(tc, &ctx, &argument); } break; case MT_SetBreakpointRequest: MVM_debugserver_add_breakpoint(tc, &ctx, &argument); break; case MT_ClearBreakpoint: MVM_debugserver_clear_breakpoint(tc, &ctx, &argument); break; case MT_ClearAllBreakpoints: MVM_debugserver_clear_all_breakpoints(tc, &ctx, &argument); break; case MT_StepInto: COMMUNICATE_RESULT(setup_step(tc, &ctx, &argument, MVMDebugSteppingMode_STEP_INTO, NULL)); break; case MT_StepOver: COMMUNICATE_RESULT(setup_step(tc, &ctx, &argument, MVMDebugSteppingMode_STEP_OVER, NULL)); break; case MT_StepOut: COMMUNICATE_RESULT(setup_step(tc, &ctx, &argument, MVMDebugSteppingMode_STEP_OUT, NULL)); break; case MT_ObjectAttributesRequest: if (request_object_attributes(tc, &ctx, &argument)) { communicate_error(tc, &ctx, &argument); } break; case MT_ReleaseHandles: COMMUNICATE_RESULT(release_handles(tc, &ctx, &argument)); MVM_free(argument.handles); break; case MT_ContextHandle: case MT_CodeObjectHandle: if (create_context_or_code_obj_debug_handle(tc, &ctx, &argument, NULL)) { communicate_error(tc, &ctx, &argument); } break; case MT_CallerContextRequest: case MT_OuterContextRequest: if (create_caller_or_outer_context_debug_handle(tc, &ctx, &argument, NULL)) { communicate_error(tc, &ctx, &argument); } break; case MT_ContextLexicalsRequest: if (request_context_lexicals(tc, &ctx, &argument)) { communicate_error(tc, &ctx, &argument); } break; case MT_ObjectMetadataRequest: if (request_object_metadata(tc, &ctx, &argument)) { communicate_error(tc, &ctx, &argument); } break; case MT_ObjectPositionalsRequest: if (request_object_positionals(tc, &ctx, &argument)) { communicate_error(tc, &ctx, &argument); } break; case MT_ObjectAssociativesRequest: if (request_object_associatives(tc, &ctx, &argument)) { communicate_error(tc, &ctx, &argument); } break; default: /* Unknown command or NYI */ if (tc->instance->debugserver->debugspam_protocol) fprintf(stderr, "unknown command type (or NYI)\n"); cmp_write_map(&ctx, 2); cmp_write_str(&ctx, "id", 2); cmp_write_integer(&ctx, argument.id); cmp_write_str(&ctx, "type", 4); cmp_write_integer(&ctx, 0); break; } uv_mutex_unlock(&vm->debugserver->mutex_network_send); } MVM_debugserver_clear_all_breakpoints(tc, NULL, NULL); release_all_handles(tc); vm->debugserver->messagepack_data = NULL; } } /* XXX stolen verbatim from src/moar.c; maybe put into a header somewhere */ #define init_mutex(loc, name) do { \ if ((init_stat = uv_mutex_init(&loc)) < 0) { \ fprintf(stderr, "MoarVM: Initialization of " name " mutex failed\n %s\n", \ uv_strerror(init_stat)); \ exit(1); \ } \ } while (0) #define init_cond(loc, name) do { \ if ((init_stat = uv_cond_init(&loc)) < 0) { \ fprintf(stderr, "MoarVM: Initialization of " name " condition variable failed\n %s\n", \ uv_strerror(init_stat)); \ exit(1); \ } \ } while (0) MVM_PUBLIC void MVM_debugserver_init(MVMThreadContext *tc, MVMuint32 port) { MVMInstance *vm = tc->instance; MVMDebugServerData *debugserver = MVM_calloc(1, sizeof(MVMDebugServerData)); MVMObject *worker_entry_point; int threadCreateError; int init_stat; init_mutex(debugserver->mutex_cond, "debug server orchestration"); init_mutex(debugserver->mutex_network_send, "debug server network socket lock"); init_mutex(debugserver->mutex_request_list, "debug server request list lock"); init_mutex(debugserver->mutex_breakpoints, "debug server breakpoint management lock"); init_cond(debugserver->tell_threads, "debugserver signals threads"); init_cond(debugserver->tell_worker, "threads signal debugserver"); debugserver->handle_table = MVM_malloc(sizeof(MVMDebugServerHandleTable)); debugserver->handle_table->allocated = 32; debugserver->handle_table->used = 0; debugserver->handle_table->next_id = 1; debugserver->handle_table->entries = MVM_calloc(debugserver->handle_table->allocated, sizeof(MVMDebugServerHandleTableEntry)); debugserver->breakpoints = MVM_malloc(sizeof(MVMDebugServerBreakpointTable)); debugserver->breakpoints->files_alloc = 32; debugserver->breakpoints->files_used = 0; debugserver->breakpoints->files = MVM_calloc(debugserver->breakpoints->files_alloc, sizeof(MVMDebugServerBreakpointFileTable)); debugserver->event_id = 2; debugserver->port = port; if (getenv("MDS_NETWORK")) { debugspam_network = 1; debugserver->debugspam_network = 1; } else { debugspam_network = 0; } if (getenv("MDS_PROTOCOL")) { debugserver->debugspam_protocol = 1; } vm->debugserver = debugserver; worker_entry_point = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTCCode); ((MVMCFunction *)worker_entry_point)->body.func = debugserver_worker; MVM_thread_run(tc, MVM_thread_new(tc, worker_entry_point, 1)); } MVM_PUBLIC void MVM_debugserver_mark_handles(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMHeapSnapshotState *snapshot) { MVMInstance *vm = tc->instance; if (vm->debugserver) { MVMDebugServerHandleTable *table = vm->debugserver->handle_table; MVMuint32 idx; if (table == NULL) return; for (idx = 0; idx < table->used; idx++) { if (worklist) MVM_gc_worklist_add(tc, worklist, &(table->entries[idx].target)); else MVM_profile_heap_add_collectable_rel_const_cstr(tc, snapshot, (MVMCollectable *)table->entries[idx].target, "Debug Handle"); } } } MoarVM-2018.03/src/debug/debugserver.h0000644000175000017510000000474513252330426017560 0ustar samanthasamanthastruct MVMDebugServerHandleTableEntry { MVMuint64 id; MVMObject *target; }; struct MVMDebugServerHandleTable { MVMuint32 allocated; MVMuint32 used; MVMuint64 next_id; MVMDebugServerHandleTableEntry *entries; }; struct MVMDebugServerBreakpointInfo { MVMuint64 breakpoint_id; MVMuint32 line_no; MVMuint8 shall_suspend; MVMuint8 send_backtrace; }; struct MVMDebugServerBreakpointFileTable { char *filename; MVMuint32 filename_length; MVMuint32 lines_active_alloc; MVMuint8 *lines_active; MVMDebugServerBreakpointInfo *breakpoints; MVMuint32 breakpoints_alloc; MVMuint32 breakpoints_used; }; struct MVMDebugServerBreakpointTable { MVMDebugServerBreakpointFileTable *files; MVMuint32 files_used; MVMuint32 files_alloc; }; struct MVMDebugServerData { /* Debug Server thread */ uv_thread_t thread; /* Protect the debugserver-related condvars */ uv_mutex_t mutex_cond; /* Protect sending data on the network */ uv_mutex_t mutex_network_send; /* Protect the open requests list */ uv_mutex_t mutex_request_list; /* Condition variable to tell threads to check their state for changes * like "i should suspend" */ uv_cond_t tell_threads; /* Condition variable to tell the worker to check thread states * for changes like "i just suspended" */ uv_cond_t tell_worker; MVMuint32 port; MVMuint32 thread_id; MVMuint64 event_id; MVMDebugServerHandleTable *handle_table; MVMDebugServerBreakpointTable *breakpoints; MVMuint32 any_breakpoints_at_all; MVMuint32 breakpoints_alloc; MVMuint32 breakpoints_used; uv_mutex_t mutex_breakpoints; void *messagepack_data; MVMuint8 debugspam_network; MVMuint8 debugspam_protocol; }; MVM_PUBLIC void MVM_debugserver_init(MVMThreadContext *tc, MVMuint32 port); MVM_PUBLIC void MVM_debugserver_mark_handles(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMHeapSnapshotState *snapshot); MVM_PUBLIC void MVM_debugserver_notify_thread_creation(MVMThreadContext *tc); MVM_PUBLIC void MVM_debugserver_notify_thread_destruction(MVMThreadContext *tc); MVM_PUBLIC void MVM_debugserver_notify_unhandled_exception(MVMThreadContext *tc, MVMException *ex); MVM_PUBLIC void MVM_debugserver_register_line(MVMThreadContext *tc, char *filename, MVMuint32 filename_len, MVMuint32 line_no, MVMuint32 *file_idx); MVM_PUBLIC void MVM_debugserver_breakpoint_check(MVMThreadContext *tc, MVMuint32 file_idx, MVMuint32 line_no); MoarVM-2018.03/src/gc/allocation.c0000644000175000017510000001077013237701240016660 0ustar samanthasamantha/* Allocation of managed memory - that is, from the memory space that is * managed by the garbage collector. Memory that is in turn owned by a * GC-able object will be allocated separately and freed explicitly by * its REPR gc_free routine. */ #include "moar.h" /* Allocate the specified amount of memory from the nursery. Will * trigger a GC run if there is not enough. */ void * MVM_gc_allocate_nursery(MVMThreadContext *tc, size_t size) { void *allocated; /* Before an allocation is a GC safe-point and thus a good GC sync point * also; check if we've been signalled to collect. */ /* Don't use a MVM_load(&tc->gc_status) here for performance, it's okay * if the interrupt is delayed a bit. */ if (tc->gc_status) MVM_gc_enter_from_interrupt(tc); /* Guard against 0-byte allocation. */ if (size > 0) { /* Do a GC run if this allocation won't fit in what we have * left in the nursery. Note this is a loop to handle a * pathological case: all the objects in the nursery are very * young and thus survive in the nursery, meaning that no space * actually gets freed up. The next run will promote them to the * second generation. Note that this circumstance is exceptionally * unlikely in any non-contrived situation. */ while ((char *)tc->nursery_alloc + size >= (char *)tc->nursery_alloc_limit) { if (size > MVM_NURSERY_SIZE) MVM_panic(MVM_exitcode_gcalloc, "Attempt to allocate more than the maximum nursery size"); MVM_gc_enter_from_allocator(tc); } /* Allocate (just bump the pointer). */ allocated = tc->nursery_alloc; tc->nursery_alloc = (char *)tc->nursery_alloc + size; } else { MVM_panic(MVM_exitcode_gcalloc, "Cannot allocate 0 bytes of memory in the nursery"); } return allocated; } /* Same as MVM_gc_allocate, but promises that the memory will be zeroed. */ void * MVM_gc_allocate_zeroed(MVMThreadContext *tc, size_t size) { /* At present, MVM_gc_allocate always returns zeroed memory. */ return MVM_gc_allocate(tc, size); } /* Allocates a new STable, based on the specified thread context, REPR * and meta-object. */ MVMSTable * MVM_gc_allocate_stable(MVMThreadContext *tc, const MVMREPROps *repr, MVMObject *how) { MVMSTable *st; MVMROOT(tc, how, { st = MVM_gc_allocate_zeroed(tc, sizeof(MVMSTable)); st->header.flags |= MVM_CF_STABLE; st->header.size = sizeof(MVMSTable); st->header.owner = tc->thread_id; st->REPR = repr; st->invoke = MVM_6model_invoke_default; st->type_cache_id = MVM_6model_next_type_cache_id(tc); st->debug_name = NULL; MVM_ASSIGN_REF(tc, &(st->header), st->HOW, how); }); return st; } /* Allocates a new type object. */ MVMObject * MVM_gc_allocate_type_object(MVMThreadContext *tc, MVMSTable *st) { MVMObject *obj; MVMROOT(tc, st, { obj = MVM_gc_allocate_zeroed(tc, sizeof(MVMObject)); obj->header.flags |= MVM_CF_TYPE_OBJECT; obj->header.size = sizeof(MVMObject); obj->header.owner = tc->thread_id; MVM_ASSIGN_REF(tc, &(obj->header), obj->st, st); }); return obj; } /* Allocates a new object, and points it at the specified STable. */ MVMObject * MVM_gc_allocate_object(MVMThreadContext *tc, MVMSTable *st) { MVMObject *obj; MVMROOT(tc, st, { obj = MVM_gc_allocate_zeroed(tc, st->size); obj->header.size = (MVMuint16)st->size; obj->header.owner = tc->thread_id; MVM_ASSIGN_REF(tc, &(obj->header), obj->st, st); if (st->mode_flags & MVM_FINALIZE_TYPE) MVM_gc_finalize_add_to_queue(tc, obj); }); return obj; } /* Allocates a new heap frame. */ MVMFrame * MVM_gc_allocate_frame(MVMThreadContext *tc) { MVMFrame *f = MVM_gc_allocate_zeroed(tc, sizeof(MVMFrame)); f->header.flags |= MVM_CF_FRAME; f->header.size = sizeof(MVMFrame); f->header.owner = tc->thread_id; return f; } /* Sets allocate for this thread to be from the second generation by * default. */ void MVM_gc_allocate_gen2_default_set(MVMThreadContext *tc) { tc->allocate_in_gen2++; } /* Sets allocation for this thread to be from the nursery by default. */ void MVM_gc_allocate_gen2_default_clear(MVMThreadContext *tc) { if (tc->allocate_in_gen2 <= 0) MVM_oops(tc, "Cannot leave gen2 allocation without entering it"); tc->allocate_in_gen2--; } MoarVM-2018.03/src/gc/allocation.h0000644000175000017510000000140613237701240016661 0ustar samanthasamanthavoid * MVM_gc_allocate_nursery(MVMThreadContext *tc, size_t size); void * MVM_gc_allocate_zeroed(MVMThreadContext *tc, size_t size); MVMSTable * MVM_gc_allocate_stable(MVMThreadContext *tc, const MVMREPROps *repr, MVMObject *how); MVMObject * MVM_gc_allocate_type_object(MVMThreadContext *tc, MVMSTable *st); MVMObject * MVM_gc_allocate_object(MVMThreadContext *tc, MVMSTable *st); MVMFrame * MVM_gc_allocate_frame(MVMThreadContext *tc); void MVM_gc_allocate_gen2_default_set(MVMThreadContext *tc); void MVM_gc_allocate_gen2_default_clear(MVMThreadContext *tc); MVM_STATIC_INLINE void * MVM_gc_allocate(MVMThreadContext *tc, size_t size) { return tc->allocate_in_gen2 ? MVM_gc_gen2_allocate_zeroed(tc->gen2, size) : MVM_gc_allocate_nursery(tc, size); } MoarVM-2018.03/src/gc/collect.c0000644000175000017510000010755113242626641016173 0ustar samanthasamantha#include "moar.h" /* Combines a piece of work that will be passed to another thread with the * ID of the target thread to pass it to. */ typedef struct { MVMuint32 target; MVMGCPassedWork *work; } ThreadWork; /* Current chunks of work we're building up to pass. */ typedef struct { MVMuint32 num_target_threads; ThreadWork *target_work; } WorkToPass; /* Forward decls. */ static void process_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist, WorkToPass *wtp, MVMuint8 gen); static void pass_work_item(MVMThreadContext *tc, WorkToPass *wtp, MVMCollectable **item_ptr); static void pass_leftover_work(MVMThreadContext *tc, WorkToPass *wtp); static void add_in_tray_to_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist); /* The size of the nursery that a new thread should get. The main thread will * get a full-size one right away. */ MVMuint32 MVM_gc_new_thread_nursery_size(MVMInstance *i) { return i->main_thread != NULL ? (MVM_NURSERY_SIZE < MVM_NURSERY_THREAD_START ? MVM_NURSERY_SIZE : MVM_NURSERY_THREAD_START) : MVM_NURSERY_SIZE; } /* Does a garbage collection run. Exactly what it does is configured by the * couple of arguments that it takes. * * The what_to_do argument specifies where it should look for things to add * to the worklist: everywhere, just at thread local stuff, or just in the * thread's in-tray. * * The gen argument specifies whether to collect the nursery or both of the * generations. Nursery collection is done by semi-space copying. Once an * object is seen/copied once in the nursery (may be tuned in the future to * twice or so - we'll see) then it is not copied to tospace, but instead * promoted to the second generation. If we are collecting generation 2 also, * then objects that are alive in the second generation are simply marked. * Since the second generation is managed as a set of sized pools, there is * much less motivation for any kind of copying/compaction; the internal * fragmentation that makes finding a right-sized gap problematic will not * happen. * * Note that it adds the roots and processes them in phases, to try to avoid * building up a huge worklist. */ void MVM_gc_collect(MVMThreadContext *tc, MVMuint8 what_to_do, MVMuint8 gen) { /* Create a GC worklist. */ MVMGCWorklist *worklist = MVM_gc_worklist_create(tc, gen != MVMGCGenerations_Nursery); /* Initialize work passing data structure. */ WorkToPass wtp; wtp.num_target_threads = 0; wtp.target_work = NULL; /* See what we need to work on this time. */ if (what_to_do == MVMGCWhatToDo_InTray) { /* We just need to process anything in the in-tray. */ add_in_tray_to_worklist(tc, worklist); GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : processing %d items from in tray \n", worklist->items); process_worklist(tc, worklist, &wtp, gen); } else if (what_to_do == MVMGCWhatToDo_Finalizing) { /* Need to process the finalizing queue. */ MVMuint32 i; for (i = 0; i < tc->num_finalizing; i++) MVM_gc_worklist_add(tc, worklist, &(tc->finalizing[i])); GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : processing %d items from finalizing \n", worklist->items); process_worklist(tc, worklist, &wtp, gen); } else { /* Main collection run. The current tospace becomes fromspace, with * the size of the current tospace becoming stashed as the size of * that fromspace. */ void *old_fromspace = tc->nursery_fromspace; MVMuint32 old_fromspace_size = tc->nursery_fromspace_size; tc->nursery_fromspace = tc->nursery_tospace; tc->nursery_fromspace_size = tc->nursery_tospace_size; /* Decide on this threads's tospace size. If fromspace was already at * the maximum nursery size, then that is the new tospace size. If * not, then see if this thread caused the current GC run, and grant * it a bigger tospace. Otherwise, new tospace size is left as the * last tospace size. */ if (tc->nursery_tospace_size < MVM_NURSERY_SIZE) { if (tc->instance->thread_to_blame_for_gc == tc) tc->nursery_tospace_size *= 2; } /* If the old fromspace matches the target size, just re-use it. If * not, free it and allocate a new tospace. */ if (old_fromspace_size == tc->nursery_tospace_size) { tc->nursery_tospace = old_fromspace; } else { MVM_free(old_fromspace); tc->nursery_tospace = MVM_calloc(1, tc->nursery_tospace_size); } /* Reset nursery allocation pointers to the new tospace. */ tc->nursery_alloc = tc->nursery_tospace; tc->nursery_alloc_limit = (char *)tc->nursery_tospace + tc->nursery_tospace_size; /* Add permanent roots and process them; only one thread will do * this, since they are instance-wide. */ if (what_to_do != MVMGCWhatToDo_NoInstance) { MVM_gc_root_add_permanents_to_worklist(tc, worklist, NULL); GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : processing %d items from instance permanents\n", worklist->items); process_worklist(tc, worklist, &wtp, gen); MVM_gc_root_add_instance_roots_to_worklist(tc, worklist, NULL); GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : processing %d items from instance roots\n", worklist->items); process_worklist(tc, worklist, &wtp, gen); } /* Add per-thread state to worklist and process it. */ MVM_gc_root_add_tc_roots_to_worklist(tc, worklist, NULL); GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : processing %d items from TC objects\n", worklist->items); process_worklist(tc, worklist, &wtp, gen); /* Walk current call stack, following caller chain until we reach a * heap-allocated frame. Note that tc->cur_frame may itself be a heap * frame, in which case we put it directly on the worklist as it can * move. */ if (tc->cur_frame && MVM_FRAME_IS_ON_CALLSTACK(tc, tc->cur_frame)) { MVMFrame *cur_frame = tc->cur_frame; while (cur_frame && MVM_FRAME_IS_ON_CALLSTACK(tc, cur_frame)) { MVM_gc_root_add_frame_roots_to_worklist(tc, worklist, cur_frame); GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : processing %d items from a stack frame\n", worklist->items); process_worklist(tc, worklist, &wtp, gen); cur_frame = cur_frame->caller; } } else { MVM_gc_worklist_add(tc, worklist, &tc->cur_frame); GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : processing %d items from current frame\n", worklist->items); process_worklist(tc, worklist, &wtp, gen); } /* Add temporary roots and process them (these are per-thread). */ MVM_gc_root_add_temps_to_worklist(tc, worklist, NULL); GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : processing %d items from thread temps\n", worklist->items); process_worklist(tc, worklist, &wtp, gen); /* Add things that are roots for the first generation because they are * pointed to by objects in the second generation and process them * (also per-thread). Note we need not do this if we're doing a full * collection anyway (in fact, we must not for correctness, otherwise * the gen2 rooting keeps them alive forever). */ if (gen == MVMGCGenerations_Nursery) { MVM_gc_root_add_gen2s_to_worklist(tc, worklist); GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : processing %d items from gen2 \n", worklist->items); process_worklist(tc, worklist, &wtp, gen); } /* Process anything in the in-tray. */ add_in_tray_to_worklist(tc, worklist); GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : processing %d items from in tray \n", worklist->items); process_worklist(tc, worklist, &wtp, gen); /* At this point, we have probably done most of the work we will * need to (only get more if another thread passes us more); zero * out the remaining tospace. */ memset(tc->nursery_alloc, 0, (char *)tc->nursery_alloc_limit - (char *)tc->nursery_alloc); } /* Destroy the worklist. */ MVM_gc_worklist_destroy(tc, worklist); /* Pass any work for other threads we accumulated but that didn't trigger * the work passing threshold, then cleanup work passing list. */ if (wtp.num_target_threads) { pass_leftover_work(tc, &wtp); MVM_free(wtp.target_work); } } /* Processes the current worklist. */ static void process_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist, WorkToPass *wtp, MVMuint8 gen) { MVMGen2Allocator *gen2; MVMCollectable **item_ptr; MVMCollectable *new_addr; MVMuint32 gen2count; /* Grab the second generation allocator; we may move items into the * old generation. */ gen2 = tc->gen2; while ((item_ptr = MVM_gc_worklist_get(tc, worklist))) { /* Dereference the object we're considering. */ MVMCollectable *item = *item_ptr; MVMuint8 item_gen2; MVMuint8 to_gen2 = 0; /* If the item is NULL, that's fine - it's just a null reference and * thus we've no object to consider. */ if (item == NULL) continue; /* If it's in the second generation and we're only doing a nursery, * collection, we have nothing to do. */ item_gen2 = item->flags & MVM_CF_SECOND_GEN; if (item_gen2) { if (gen == MVMGCGenerations_Nursery) continue; if (item->flags & MVM_CF_GEN2_LIVE) { /* gen2 and marked as live. */ continue; } } else if (item->flags & MVM_CF_FORWARDER_VALID) { /* If the item was already seen and copied, then it will have a * forwarding address already. Just update this pointer to the * new address and we're done. */ assert(*item_ptr != item->sc_forward_u.forwarder); if (MVM_GC_DEBUG_ENABLED(MVM_GC_DEBUG_COLLECT)) { if (*item_ptr != item->sc_forward_u.forwarder) { GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : updating handle %p from %p to forwarder %p\n", item_ptr, item, item->sc_forward_u.forwarder); } else { GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : already visited handle %p to forwarder %p\n", item_ptr, item->sc_forward_u.forwarder); } } *item_ptr = item->sc_forward_u.forwarder; continue; } else { /* If the pointer is already into tospace (the bit we've already copied into), we already updated it, so we're done. */ if (item >= (MVMCollectable *)tc->nursery_tospace && item < (MVMCollectable *)tc->nursery_alloc) { continue; } } /* If it's owned by a different thread, we need to pass it over to * the owning thread. */ if (item->owner != tc->thread_id) { GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : sending a handle %p to object %p to thread %d\n", item_ptr, item, item->owner); pass_work_item(tc, wtp, item_ptr); continue; } /* If it's in to-space but *ahead* of our copy offset then it's an out-of-date pointer and we have some kind of corruption. */ if (item >= (MVMCollectable *)tc->nursery_alloc && item < (MVMCollectable *)tc->nursery_alloc_limit) MVM_panic(1, "Heap corruption detected: pointer %p to past fromspace", item); /* At this point, we didn't already see the object, which means we * need to take some action. Go on the generation... */ if (item_gen2) { assert(!(item->flags & MVM_CF_FORWARDER_VALID)); /* It's in the second generation. We'll just mark it. */ new_addr = item; if (MVM_GC_DEBUG_ENABLED(MVM_GC_DEBUG_COLLECT)) { GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : handle %p was already %p\n", item_ptr, new_addr); } item->flags |= MVM_CF_GEN2_LIVE; assert(*item_ptr == new_addr); } else { /* Catch NULL stable (always sign of trouble) in debug mode. */ if (MVM_GC_DEBUG_ENABLED(MVM_GC_DEBUG_COLLECT) && !STABLE(item)) { GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : found a zeroed handle %p to object %p\n", item_ptr, item); } /* Did we see it in the nursery before, or should we move it to * gen2 anyway since it a persistent ID was requested? */ if (item->flags & (MVM_CF_NURSERY_SEEN | MVM_CF_HAS_OBJECT_ID)) { /* Yes; we should move it to the second generation. Allocate * space in the second generation. */ to_gen2 = 1; new_addr = item->flags & MVM_CF_HAS_OBJECT_ID ? MVM_gc_object_id_use_allocation(tc, item) : MVM_gc_gen2_allocate(gen2, item->size); /* Add on to the promoted amount (used both to decide when to do * the next full collection, as well as for profiling). Note we * add unmanaged size on for objects below. */ tc->gc_promoted_bytes += item->size; /* Copy the object to the second generation and mark it as * living there. */ GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : copying an object %p of size %d to gen2 %p\n", item, item->size, new_addr); memcpy(new_addr, item, item->size); if (new_addr->flags & MVM_CF_NURSERY_SEEN) new_addr->flags ^= MVM_CF_NURSERY_SEEN; new_addr->flags |= MVM_CF_SECOND_GEN; /* If it's a frame with an active work area, we need to keep * on visiting it. Also add on object's unmanaged size. */ if (new_addr->flags & MVM_CF_FRAME) { if (((MVMFrame *)new_addr)->work) MVM_gc_root_gen2_add(tc, (MVMCollectable *)new_addr); } else if (!(new_addr->flags & (MVM_CF_TYPE_OBJECT | MVM_CF_STABLE))) { MVMObject *new_obj_addr = (MVMObject *)new_addr; if (REPR(new_obj_addr)->unmanaged_size) tc->gc_promoted_bytes += REPR(new_obj_addr)->unmanaged_size(tc, STABLE(new_obj_addr), OBJECT_BODY(new_obj_addr)); } /* If we're going to sweep the second generation, also need * to mark it as live. */ if (gen == MVMGCGenerations_Both) new_addr->flags |= MVM_CF_GEN2_LIVE; } else { /* No, so it will live in the nursery for another GC * iteration. Allocate space in the nursery. */ new_addr = (MVMCollectable *)tc->nursery_alloc; tc->nursery_alloc = (char *)tc->nursery_alloc + item->size; GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : copying an object %p (reprid %d) of size %d to tospace %p\n", item, REPR(item)->ID, item->size, new_addr); /* Copy the object to tospace and mark it as seen in the * nursery (so the next time around it will move to the * older generation, if it survives). */ memcpy(new_addr, item, item->size); new_addr->flags |= MVM_CF_NURSERY_SEEN; } /* Store the forwarding pointer and update the original * reference. */ if (MVM_GC_DEBUG_ENABLED(MVM_GC_DEBUG_COLLECT) && new_addr != item) { GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : updating handle %p from referent %p (reprid %d) to %p\n", item_ptr, item, REPR(item)->ID, new_addr); } *item_ptr = new_addr; item->sc_forward_u.forwarder = new_addr; /* Set the flag on the copy of item *in fromspace* to mark that the forwarder pointer is valid. */ item->flags |= MVM_CF_FORWARDER_VALID; } /* Finally, we need to mark the collectable (at its moved address). * Track how many items we had before we mark it, in case we need * to write barrier them post-move to uphold the generational * invariant. */ gen2count = worklist->items; MVM_gc_mark_collectable(tc, worklist, new_addr); /* In moving an object to generation 2, we may have left it pointing * to nursery objects. If so, make sure it's in the gen2 roots. */ if (to_gen2) { MVMCollectable **j; MVMuint32 max = worklist->items, k; for (k = gen2count; k < max; k++) { j = worklist->list[k]; if (*j) MVM_gc_write_barrier(tc, new_addr, *j); } } } } /* Marks a collectable item (object, type object, STable). */ void MVM_gc_mark_collectable(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMCollectable *new_addr) { MVMuint16 i; MVMuint32 sc_idx; assert(!(new_addr->flags & MVM_CF_FORWARDER_VALID)); /*assert(REPR(new_addr));*/ sc_idx = MVM_sc_get_idx_of_sc(new_addr); if (sc_idx > 0) MVM_gc_worklist_add(tc, worklist, &(tc->instance->all_scs[sc_idx]->sc)); if (new_addr->flags & MVM_CF_TYPE_OBJECT) { /* Add the STable to the worklist. */ MVM_gc_worklist_add(tc, worklist, &((MVMObject *)new_addr)->st); } else if (new_addr->flags & MVM_CF_STABLE) { /* Add all references in the STable to the work list. */ MVMSTable *new_addr_st = (MVMSTable *)new_addr; MVM_gc_worklist_add(tc, worklist, &new_addr_st->method_cache); for (i = 0; i < new_addr_st->type_check_cache_length; i++) MVM_gc_worklist_add(tc, worklist, &new_addr_st->type_check_cache[i]); if (new_addr_st->container_spec) if (new_addr_st->container_spec->gc_mark_data) new_addr_st->container_spec->gc_mark_data(tc, new_addr_st, worklist); if (new_addr_st->boolification_spec) MVM_gc_worklist_add(tc, worklist, &new_addr_st->boolification_spec->method); if (new_addr_st->invocation_spec) { MVM_gc_worklist_add(tc, worklist, &new_addr_st->invocation_spec->class_handle); MVM_gc_worklist_add(tc, worklist, &new_addr_st->invocation_spec->attr_name); MVM_gc_worklist_add(tc, worklist, &new_addr_st->invocation_spec->invocation_handler); MVM_gc_worklist_add(tc, worklist, &new_addr_st->invocation_spec->md_class_handle); MVM_gc_worklist_add(tc, worklist, &new_addr_st->invocation_spec->md_cache_attr_name); MVM_gc_worklist_add(tc, worklist, &new_addr_st->invocation_spec->md_valid_attr_name); } MVM_gc_worklist_add(tc, worklist, &new_addr_st->WHO); MVM_gc_worklist_add(tc, worklist, &new_addr_st->WHAT); MVM_gc_worklist_add(tc, worklist, &new_addr_st->HOW); MVM_gc_worklist_add(tc, worklist, &new_addr_st->HOW_sc); MVM_gc_worklist_add(tc, worklist, &new_addr_st->method_cache_sc); if (new_addr_st->mode_flags & MVM_PARAMETRIC_TYPE) { MVM_gc_worklist_add(tc, worklist, &new_addr_st->paramet.ric.parameterizer); MVM_gc_worklist_add(tc, worklist, &new_addr_st->paramet.ric.lookup); } else if (new_addr_st->mode_flags & MVM_PARAMETERIZED_TYPE) { MVM_gc_worklist_add(tc, worklist, &new_addr_st->paramet.erized.parametric_type); MVM_gc_worklist_add(tc, worklist, &new_addr_st->paramet.erized.parameters); } /* If it needs to have its REPR data marked, do that. */ if (new_addr_st->REPR->gc_mark_repr_data) new_addr_st->REPR->gc_mark_repr_data(tc, new_addr_st, worklist); } else if (new_addr->flags & MVM_CF_FRAME) { MVM_gc_root_add_frame_roots_to_worklist(tc, worklist, (MVMFrame *)new_addr); } else { /* Need to view it as an object in here. */ MVMObject *new_addr_obj = (MVMObject *)new_addr; /* Add the STable to the worklist. */ MVM_gc_worklist_add(tc, worklist, &new_addr_obj->st); /* If needed, mark it. This will add addresses to the worklist * that will need updating. Note that we are passing the address * of the object *after* copying it since those are the addresses * we care about updating; the old chunk of memory is now dead! */ if (MVM_GC_DEBUG_ENABLED(MVM_GC_DEBUG_COLLECT) && !STABLE(new_addr_obj)) MVM_panic(MVM_exitcode_gcnursery, "Found an outdated reference to address %p", new_addr); if (REPR(new_addr_obj)->gc_mark) REPR(new_addr_obj)->gc_mark(tc, STABLE(new_addr_obj), OBJECT_BODY(new_addr_obj), worklist); } } /* Adds a chunk of work to another thread's in-tray. */ static void push_work_to_thread_in_tray(MVMThreadContext *tc, MVMuint32 target, MVMGCPassedWork *work) { MVMGCPassedWork * volatile *target_tray; /* Locate the thread to pass the work to. */ MVMThreadContext *target_tc = NULL; if (target == 1) { /* It's going to the main thread. */ target_tc = tc->instance->main_thread; } else { MVMThread *t = (MVMThread *)MVM_load(&tc->instance->threads); do { if (t->body.tc && t->body.tc->thread_id == target) { target_tc = t->body.tc; break; } } while ((t = t->body.next)); if (!target_tc) MVM_panic(MVM_exitcode_gcnursery, "Internal error: invalid thread ID %d in GC work pass", target); } /* Pass the work, chaining any other in-tray entries for the thread * after us. */ target_tray = &target_tc->gc_in_tray; while (1) { MVMGCPassedWork *orig = *target_tray; work->next = orig; if (MVM_casptr(target_tray, orig, work) == orig) return; } } /* Adds work to list of items to pass over to another thread, and if we * reach the pass threshold then does the passing. */ static void pass_work_item(MVMThreadContext *tc, WorkToPass *wtp, MVMCollectable **item_ptr) { ThreadWork *target_info = NULL; MVMuint32 target = (*item_ptr)->owner; MVMuint32 j; /* Find any existing thread work passing list for the target. */ if (target == 0) MVM_panic(MVM_exitcode_gcnursery, "Internal error: zeroed target thread ID in work pass"); for (j = 0; j < wtp->num_target_threads; j++) { if (wtp->target_work[j].target == target) { target_info = &wtp->target_work[j]; break; } } /* If there's no entry for this target, create one. */ if (target_info == NULL) { wtp->num_target_threads++; wtp->target_work = MVM_realloc(wtp->target_work, wtp->num_target_threads * sizeof(ThreadWork)); target_info = &wtp->target_work[wtp->num_target_threads - 1]; target_info->target = target; target_info->work = NULL; } /* See if there's a currently active list; create it if not. */ if (!target_info->work) { target_info->work = MVM_calloc(1, sizeof(MVMGCPassedWork)); } /* Add this item to the work list. */ target_info->work->items[target_info->work->num_items] = item_ptr; target_info->work->num_items++; /* If we've hit the limit, pass this work to the target thread. */ if (target_info->work->num_items == MVM_GC_PASS_WORK_SIZE) { push_work_to_thread_in_tray(tc, target, target_info->work); target_info->work = NULL; } } /* Passes all work for other threads that we've got left in our to-pass list. */ static void pass_leftover_work(MVMThreadContext *tc, WorkToPass *wtp) { MVMuint32 j; for (j = 0; j < wtp->num_target_threads; j++) if (wtp->target_work[j].work) push_work_to_thread_in_tray(tc, wtp->target_work[j].target, wtp->target_work[j].work); } /* Takes work in a thread's in-tray, if any, and adds it to the worklist. */ static void add_in_tray_to_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist) { MVMGCPassedWork * volatile *in_tray = &tc->gc_in_tray; MVMGCPassedWork *head; /* Get work to process. */ while (1) { /* See if there's anything in the in-tray; if not, we're done. */ head = *in_tray; if (head == NULL) return; /* Otherwise, try to take it. */ if (MVM_casptr(in_tray, head, NULL) == head) break; } /* Go through list, adding to worklist. */ while (head) { MVMGCPassedWork *next = head->next; MVMuint32 i; for (i = 0; i < head->num_items; i++) MVM_gc_worklist_add(tc, worklist, head->items[i]); MVM_free(head); head = next; } } /* Save dead STable pointers to delete later.. */ static void MVM_gc_collect_enqueue_stable_for_deletion(MVMThreadContext *tc, MVMSTable *st) { MVMSTable *old_head; #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX assert(!(st->header.flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED)); #endif do { old_head = tc->instance->stables_to_free; st->header.sc_forward_u.st = old_head; } while (!MVM_trycas(&tc->instance->stables_to_free, old_head, st)); } /* Some objects, having been copied, need no further attention. Others * need to do some additional freeing, however. This goes through the * fromspace and does any needed work to free uncopied things (this may * run in parallel with the mutator, which will be operating on tospace). */ void MVM_gc_collect_free_nursery_uncopied(MVMThreadContext *tc, void *limit) { /* We start scanning the fromspace, and keep going until we hit * the end of the area allocated in it. */ void *scan = tc->nursery_fromspace; while (scan < limit) { /* The object here is dead if it never got a forwarding pointer * written in to it. */ MVMCollectable *item = (MVMCollectable *)scan; MVMuint8 dead = !(item->flags & MVM_CF_FORWARDER_VALID); if (!dead) assert(item->sc_forward_u.forwarder != NULL); /* Now go by collectable type. */ if (item->flags & MVM_CF_TYPE_OBJECT) { /* Type object */ #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX if (dead && item->flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED) MVM_free(item->sc_forward_u.sci); #endif if (dead && item->flags & MVM_CF_HAS_OBJECT_ID) MVM_gc_object_id_clear(tc, item); } else if (item->flags & MVM_CF_STABLE) { MVMSTable *st = (MVMSTable *)item; if (dead) { /* GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : enqueuing an STable %d in the nursery to be freed\n", item);*/ #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX if (item->flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED) { MVM_free(item->sc_forward_u.sci); /* Arguably we don't need to do this, if we're always consistent about what we put on the stable queue. */ item->flags &= ~MVM_CF_SERIALZATION_INDEX_ALLOCATED; } #endif MVM_gc_collect_enqueue_stable_for_deletion(tc, st); } } else if (item->flags & MVM_CF_FRAME) { if (dead) MVM_frame_destroy(tc, (MVMFrame *)item); } else { /* Object instance. If dead, call gc_free if needed. Scan is * incremented by object size. */ MVMObject *obj = (MVMObject *)item; GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : collecting an object %p in the nursery with reprid %d\n", item, REPR(obj)->ID); if (dead && REPR(obj)->gc_free) REPR(obj)->gc_free(tc, obj); #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX if (dead && item->flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED) MVM_free(item->sc_forward_u.sci); #endif if (dead && item->flags & MVM_CF_HAS_OBJECT_ID) MVM_gc_object_id_clear(tc, item); } /* Go to the next item. */ scan = (char *)scan + item->size; } } /* Free STables (in any thread/generation!) queued to be freed. */ void MVM_gc_collect_free_stables(MVMThreadContext *tc) { MVMSTable *st = tc->instance->stables_to_free; while (st) { MVMSTable *st_to_free = st; st = st_to_free->header.sc_forward_u.st; st_to_free->header.sc_forward_u.st = NULL; MVM_6model_stable_gc_free(tc, st_to_free); } tc->instance->stables_to_free = NULL; } /* Goes through the unmarked objects in the second generation heap and builds * free lists out of them. Also does any required finalization. */ void MVM_gc_collect_free_gen2_unmarked(MVMThreadContext *tc, MVMint32 global_destruction) { /* Visit each of the size class bins. */ MVMGen2Allocator *gen2 = tc->gen2; MVMuint32 bin, obj_size, page, i; char ***freelist_insert_pos; for (bin = 0; bin < MVM_GEN2_BINS; bin++) { /* If we've nothing allocated in this size class, skip it. */ if (gen2->size_classes[bin].pages == NULL) continue; /* Calculate object size for this bin. */ obj_size = (bin + 1) << MVM_GEN2_BIN_BITS; /* freelist_insert_pos is a pointer to a memory location that * stores the address of the last traversed free list node (char **). */ /* Initialize freelist insertion position to free list head. */ freelist_insert_pos = &gen2->size_classes[bin].free_list; /* Visit each page. */ for (page = 0; page < gen2->size_classes[bin].num_pages; page++) { /* Visit all the objects, looking for dead ones and reset the * mark for each of them. */ char *cur_ptr = gen2->size_classes[bin].pages[page]; char *end_ptr = page + 1 == gen2->size_classes[bin].num_pages ? gen2->size_classes[bin].alloc_pos : cur_ptr + obj_size * MVM_GEN2_PAGE_ITEMS; while (cur_ptr < end_ptr) { MVMCollectable *col = (MVMCollectable *)cur_ptr; /* Is this already a free list slot? If so, it becomes the * new free list insert position. */ if (*freelist_insert_pos == (char **)cur_ptr) { freelist_insert_pos = (char ***)cur_ptr; } /* Otherwise, it must be a collectable of some kind. Is it * live? */ else if (col->flags & MVM_CF_GEN2_LIVE) { /* Yes; clear the mark. */ col->flags &= ~MVM_CF_GEN2_LIVE; } else { GCDEBUG_LOG(tc, MVM_GC_DEBUG_COLLECT, "Thread %d run %d : collecting an object %p in the gen2\n", col); /* No, it's dead. Do any cleanup. */ if (col->flags & MVM_CF_TYPE_OBJECT) { #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX if (col->flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED) MVM_free(col->sc_forward_u.sci); #endif } else if (col->flags & MVM_CF_STABLE) { if ( #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX !(col->flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED) && #endif col->sc_forward_u.sc.sc_idx == 0 && col->sc_forward_u.sc.idx == MVM_DIRECT_SC_IDX_SENTINEL) { /* We marked it dead last time, kill it. */ MVM_6model_stable_gc_free(tc, (MVMSTable *)col); } else { #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX if (col->flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED) { /* Whatever happens next, we can free this memory immediately, because no-one will be serializing a dead STable. */ assert(!(col->sc_forward_u.sci->sc_idx == 0 && col->sc_forward_u.sci->idx == MVM_DIRECT_SC_IDX_SENTINEL)); MVM_free(col->sc_forward_u.sci); col->flags &= ~MVM_CF_SERIALZATION_INDEX_ALLOCATED; } #endif if (global_destruction) { /* We're in global destruction, so enqueue to the end * like we do in the nursery */ MVM_gc_collect_enqueue_stable_for_deletion(tc, (MVMSTable *)col); } else { /* There will definitely be another gc run, so mark it as "died last time". */ col->sc_forward_u.sc.sc_idx = 0; col->sc_forward_u.sc.idx = MVM_DIRECT_SC_IDX_SENTINEL; } /* Skip the freelist updating. */ cur_ptr += obj_size; continue; } } else if (col->flags & MVM_CF_FRAME) { MVM_frame_destroy(tc, (MVMFrame *)col); } else { /* Object instance; call gc_free if needed. */ MVMObject *obj = (MVMObject *)col; if (STABLE(obj) && REPR(obj)->gc_free) REPR(obj)->gc_free(tc, obj); #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX if (col->flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED) MVM_free(col->sc_forward_u.sci); #endif } /* Chain in to the free list. */ *((char **)cur_ptr) = (char *)*freelist_insert_pos; *freelist_insert_pos = (char **)cur_ptr; /* Update the pointer to the insert position to point to us */ freelist_insert_pos = (char ***)cur_ptr; } /* Move to the next object. */ cur_ptr += obj_size; } } } /* Also need to consider overflows. */ for (i = 0; i < gen2->num_overflows; i++) { if (gen2->overflows[i]) { MVMCollectable *col = gen2->overflows[i]; if (col->flags & MVM_CF_GEN2_LIVE) { /* A living over-sized object; just clear the mark. */ col->flags &= ~MVM_CF_GEN2_LIVE; } else { /* Dead over-sized object. We know if it's this big it cannot * be a type object or STable, so only need handle the simple * object case. */ if (!(col->flags & (MVM_CF_TYPE_OBJECT | MVM_CF_STABLE | MVM_CF_FRAME))) { MVMObject *obj = (MVMObject *)col; if (REPR(obj)->gc_free) REPR(obj)->gc_free(tc, obj); #ifdef MVM_USE_OVERFLOW_SERIALIZATION_INDEX if (col->flags & MVM_CF_SERIALZATION_INDEX_ALLOCATED) MVM_free(col->sc_forward_u.sci); #endif } else { MVM_panic(MVM_exitcode_gcnursery, "Internal error: gen2 overflow contains non-object"); } MVM_free(col); gen2->overflows[i] = NULL; } } } /* And finally compact the overflow list */ MVM_gc_gen2_compact_overflows(gen2); } MoarVM-2018.03/src/gc/collect.h0000644000175000017510000000502413237701240016161 0ustar samanthasamantha/* The maximum size of the nursery area. Note that since it's semi-space * copying, we could actually have double this amount allocated per thread. */ #define MVM_NURSERY_SIZE 4194304 /* The nursery size threads other than the main thread start out with. If * they fill it and trigger a GC run, then it is doubled. If they are * pulled into a GC run without having themselves filled the nursery, it * does not grow. If MVM_NURSERY_SIZE is smaller than this value (as is * often done for GC stress testing) then this value will be ignored. */ #define MVM_NURSERY_THREAD_START 131072 /* How many bytes should have been promoted into gen2 before we decide to * do a full GC run? This defaults to a percentage of the resident set, with * a minimum to avoid small processes doing a load of gen2 collections. */ #define MVM_GC_GEN2_THRESHOLD_PERCENT 20 #define MVM_GC_GEN2_THRESHOLD_MINIMUM (20 * 1024 * 1024) /* What things should be processed in this GC run? */ typedef enum { /* Everything, including the instance-wide roots. If we have many * active threads, only one thread will be set to do this. */ MVMGCWhatToDo_All = 0, /* Everything except the instance-wide roots. */ MVMGCWhatToDo_NoInstance = 1, /* Only process the in-tray of work given by other threads. */ MVMGCWhatToDo_InTray = 2, /* Only process the finalizing list. */ MVMGCWhatToDo_Finalizing = 4 } MVMGCWhatToDo; /* What generation(s) to collect? */ typedef enum { /* Only the nursery. */ MVMGCGenerations_Nursery = 0, /* Both the nursery and generation 2. */ MVMGCGenerations_Both = 1 } MVMGCGenerations; /* The number of items we must reach in a bucket of work before passing it * off to the next thread. (Power of 2, minus 2, is a decent choice.) */ #define MVM_GC_PASS_WORK_SIZE 62 /* Represents a piece of work (some addresses to visit) that have been passed * from one thread doing GC to another thread doing GC. */ struct MVMGCPassedWork { MVMCollectable **items[MVM_GC_PASS_WORK_SIZE]; MVMGCPassedWork *next; MVMint32 num_items; }; /* Functions. */ MVMuint32 MVM_gc_new_thread_nursery_size(MVMInstance *i); void MVM_gc_collect(MVMThreadContext *tc, MVMuint8 what_to_do, MVMuint8 gen); void MVM_gc_collect_free_nursery_uncopied(MVMThreadContext *tc, void *limit); void MVM_gc_collect_free_gen2_unmarked(MVMThreadContext *tc, MVMint32 global_destruction); void MVM_gc_mark_collectable(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMCollectable *item); void MVM_gc_collect_free_stables(MVMThreadContext *tc); MoarVM-2018.03/src/gc/debug.c0000644000175000017510000000376413237701240015626 0ustar samanthasamantha#include "moar.h" #if MVM_GC_DEBUG /* Takes a pointer of a GC-allocated object, and goes through all of the * alive thread's fromspace/tospace regions and all gen2 pages to try and * find the region the pointer is part of. */ void MVM_gc_debug_find_region(MVMThreadContext *tc, void *ptr) { MVMThread *cur_thread = tc->instance->threads; while (cur_thread) { MVMThreadContext *thread_tc = cur_thread->body.tc; if (thread_tc) { if (ptr >= thread_tc->nursery_fromspace && (char *)ptr < (char *)thread_tc->nursery_fromspace + thread_tc->nursery_fromspace_size) { printf("In fromspace of thread %d\n", cur_thread->body.thread_id); return; } if (ptr >= thread_tc->nursery_tospace && (char *)ptr < (char *)thread_tc->nursery_tospace + thread_tc->nursery_tospace_size) { printf("In tospace of thread %d\n", cur_thread->body.thread_id); return; } if (thread_tc->gen2) { MVMGen2Allocator *gen2 = thread_tc->gen2; MVMint32 bin; for (bin = 0; bin < MVM_GEN2_BINS; bin++) { MVMGen2SizeClass *szc = &(gen2->size_classes[bin]); MVMint32 page; for (page = 0; page < szc->num_pages; page++) { char *page_start = szc->pages[page]; size_t page_size = MVM_GEN2_PAGE_ITEMS * ((bin + 1) << MVM_GEN2_BIN_BITS); char *page_end = page_start + page_size; if (ptr >= (void*)page_start && ptr < (void*)page_end) { printf("In gen2 bin of thread %d\n", cur_thread->body.thread_id); return; } } } } } cur_thread = cur_thread->body.next; } printf("Not found\n"); } #endif MoarVM-2018.03/src/gc/debug.h0000644000175000017510000000266613237701240015633 0ustar samanthasamantha/* This flag enables/disables various bits of GC debugging sanity checks: * 0 = No checking * 1 = Checks on reference assignments and other relatively cheap cases * 2 = Checks on every object register access (slow) */ #define MVM_GC_DEBUG 0 #if MVM_GC_DEBUG #define MVM_ASSERT_NOT_FROMSPACE(tc, c) do { \ MVMThread *cur_thread = tc->instance->threads; \ while (cur_thread) { \ MVMThreadContext *thread_tc = cur_thread->body.tc; \ if (thread_tc && thread_tc->nursery_fromspace && \ (char *)(c) >= (char *)thread_tc->nursery_fromspace && \ (char *)(c) < (char *)thread_tc->nursery_fromspace + \ thread_tc->nursery_fromspace_size) \ MVM_panic(1, "Collectable %p in fromspace accessed", c); \ cur_thread = cur_thread->body.next; \ } \ } while (0) #define MVM_CHECK_CALLER_CHAIN(tc, f) do { \ MVMFrame *check = f; \ while (check) { \ MVM_ASSERT_NOT_FROMSPACE(tc, check); \ if ((check->header.flags & MVM_CF_SECOND_GEN) && \ check->caller && \ !(check->caller->header.flags & MVM_CF_SECOND_GEN) && \ !(check->header.flags & MVM_CF_IN_GEN2_ROOT_LIST)) \ MVM_panic(1, "Illegal Gen2 -> Nursery in caller chain (not in inter-gen set)"); \ check = check->caller; \ } \ } while (0) #else #define MVM_ASSERT_NOT_FROMSPACE(tc, c) #define MVM_CHECK_CALLER_CHAIN(tc, f) #endif MoarVM-2018.03/src/gc/finalize.c0000644000175000017510000001107113237701240016327 0ustar samanthasamantha#include "moar.h" /* Turns finalization on or off for a type. */ void MVM_gc_finalize_set(MVMThreadContext *tc, MVMObject *type, MVMint64 finalize) { MVMSTable *st = STABLE(type); MVMint64 new_flags = st->mode_flags & (~MVM_FINALIZE_TYPE); if (finalize) new_flags |= MVM_FINALIZE_TYPE; st->mode_flags = new_flags; MVM_SC_WB_ST(tc, st); } /* Adds an object we've just allocated to the queue of those with finalizers * that will need calling upon collection. */ void MVM_gc_finalize_add_to_queue(MVMThreadContext *tc, MVMObject *obj) { MVM_ASSERT_NOT_FROMSPACE(tc, obj); if (tc->num_finalize == tc->alloc_finalize) { if (tc->alloc_finalize) tc->alloc_finalize *= 2; else tc->alloc_finalize = 64; tc->finalize = MVM_realloc(tc->finalize, sizeof(MVMCollectable **) * tc->alloc_finalize); } tc->finalize[tc->num_finalize] = obj; tc->num_finalize++; } /* Sets the passed thread context's thread up so that we'll run a finalize * handler on it in the near future. */ static void finalize_handler_caller(MVMThreadContext *tc, void *sr_data) { MVMObject *handler = MVM_hll_current(tc)->finalize_handler; if (handler) { MVMCallsite *inv_arg_callsite = MVM_callsite_get_common(tc, MVM_CALLSITE_ID_INV_ARG); /* Drain the finalizing queue to an array. */ MVMObject *drain = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); while (tc->num_finalizing > 0) MVM_repr_push_o(tc, drain, tc->finalizing[--tc->num_finalizing]); /* Invoke the handler. */ handler = MVM_frame_find_invokee(tc, handler, NULL); MVM_args_setup_thunk(tc, NULL, MVM_RETURN_VOID, inv_arg_callsite); tc->cur_frame->args[0].o = drain; STABLE(handler)->invoke(tc, handler, inv_arg_callsite, tc->cur_frame->args); } } static void setup_finalize_handler_call(MVMThreadContext *tc) { MVMFrame *install_on = tc->cur_frame; while (install_on) { if (!install_on->extra || !install_on->extra->special_return) if (install_on->static_info->body.cu->body.hll_config) break; install_on = install_on->caller; } if (install_on) MVM_frame_special_return(tc, install_on, finalize_handler_caller, NULL, NULL, NULL); } /* Walks through the per-thread finalize queues, identifying objects that * should be finalized, pushing them onto a finalize list, and then marking * that list entry. Assumes the world is stopped. */ static void add_to_finalizing(MVMThreadContext *tc, MVMObject *obj) { if (tc->num_finalizing == tc->alloc_finalizing) { if (tc->alloc_finalizing) tc->alloc_finalizing *= 2; else tc->alloc_finalizing = 64; tc->finalizing = MVM_realloc(tc->finalizing, sizeof(MVMCollectable **) * tc->alloc_finalizing); } tc->finalizing[tc->num_finalizing] = obj; tc->num_finalizing++; } static void walk_thread_finalize_queue(MVMThreadContext *tc, MVMuint8 gen) { MVMuint32 collapse_pos = 0; MVMuint32 i; for (i = 0; i < tc->num_finalize; i++) { /* See if it's dead, taking which generation we've marked into * account. */ MVMuint32 flags = tc->finalize[i]->header.flags; MVMuint32 in_gen2 = flags & MVM_CF_SECOND_GEN; if (gen == MVMGCGenerations_Both || !in_gen2) { MVMuint32 live = flags & (MVM_CF_GEN2_LIVE | MVM_CF_FORWARDER_VALID); if (live) { /* Alive, so just leave it in finalized queue, taking updated * address if needed. */ tc->finalize[collapse_pos++] = flags & MVM_CF_FORWARDER_VALID ? (MVMObject *)tc->finalize[i]->header.sc_forward_u.forwarder : tc->finalize[i]; } else { /* Dead; needs finalizing, so pop it on the finalizing list. */ add_to_finalizing(tc, tc->finalize[i]); } } } tc->num_finalize = collapse_pos; } void MVM_finalize_walk_queues(MVMThreadContext *tc, MVMuint8 gen) { MVMThread *cur_thread = (MVMThread *)MVM_load(&tc->instance->threads); while (cur_thread) { if (cur_thread->body.tc) { walk_thread_finalize_queue(cur_thread->body.tc, gen); if (cur_thread->body.tc->num_finalizing > 0) { MVM_gc_collect(cur_thread->body.tc, MVMGCWhatToDo_Finalizing, gen); setup_finalize_handler_call(cur_thread->body.tc); } } cur_thread = cur_thread->body.next; } } MoarVM-2018.03/src/gc/finalize.h0000644000175000017510000000034013237701240016331 0ustar samanthasamanthavoid MVM_gc_finalize_set(MVMThreadContext *tc, MVMObject *type, MVMint64 finalize); void MVM_gc_finalize_add_to_queue(MVMThreadContext *tc, MVMObject *obj); void MVM_finalize_walk_queues(MVMThreadContext *tc, MVMuint8 gen); MoarVM-2018.03/src/gc/gen2.c0000644000175000017510000002472713237701240015375 0ustar samanthasamantha#include "moar.h" /* Creates a new second generation allocator. */ MVMGen2Allocator * MVM_gc_gen2_create(MVMInstance *i) { /* Create allocator data structure. */ MVMGen2Allocator *al = MVM_malloc(sizeof(MVMGen2Allocator)); /* Create empty size classes array data structure. */ al->size_classes = (MVMGen2SizeClass *)MVM_calloc(MVM_GEN2_BINS, sizeof(MVMGen2SizeClass)); /* Set up overflows area. */ al->alloc_overflows = MVM_GEN2_OVERFLOWS; al->num_overflows = 0; al->overflows = MVM_malloc(al->alloc_overflows * sizeof(MVMCollectable *)); return al; } /* Sets up a size class bin in the second generation. */ static void setup_bin(MVMGen2Allocator *al, MVMuint32 bin) { /* Work out page size we want. */ MVMuint32 page_size = MVM_GEN2_PAGE_ITEMS * ((bin + 1) << MVM_GEN2_BIN_BITS); /* We'll just allocate a single page to start off with. */ al->size_classes[bin].num_pages = 1; al->size_classes[bin].pages = MVM_malloc(sizeof(void *) * al->size_classes[bin].num_pages); al->size_classes[bin].pages[0] = MVM_malloc(page_size); /* Set up allocation position and limit. */ al->size_classes[bin].alloc_pos = al->size_classes[bin].pages[0]; al->size_classes[bin].alloc_limit = al->size_classes[bin].alloc_pos + page_size; /* Free list is empty until GC run (and we just do page by page allocation). */ al->size_classes[bin].free_list = NULL; } /* Adds a new page to a size class bin. */ static void add_page(MVMGen2Allocator *al, MVMuint32 bin) { /* Work out page size. */ MVMuint32 page_size = MVM_GEN2_PAGE_ITEMS * ((bin + 1) << MVM_GEN2_BIN_BITS); /* Add the extra page. */ MVMuint32 cur_page = al->size_classes[bin].num_pages; al->size_classes[bin].num_pages++; al->size_classes[bin].pages = MVM_realloc(al->size_classes[bin].pages, sizeof(void *) * al->size_classes[bin].num_pages); al->size_classes[bin].pages[cur_page] = MVM_malloc(page_size); /* Set up allocation position and limit. */ al->size_classes[bin].alloc_pos = al->size_classes[bin].pages[cur_page]; al->size_classes[bin].alloc_limit = al->size_classes[bin].alloc_pos + page_size; /* set the cur_page to a proper value */ al->size_classes[bin].cur_page = cur_page; } /* Allocates space using the second generation allocator and returns * a pointer to the allocated space. Does not zero the space or set * it up in any way. */ void * MVM_gc_gen2_allocate(MVMGen2Allocator *al, MVMuint32 size) { void *result; /* Determine the bin. If we hit a bin exactly then it's off-by-one, * since the bins list is base-0. Otherwise we've some extra bits, * which round us up to the next bin, but that's a no-op. */ MVMuint32 bin = (size >> MVM_GEN2_BIN_BITS); if ((size & MVM_GEN2_BIN_MASK) == 0) bin--; /* If the selected bin is in range... */ if (bin < MVM_GEN2_BINS) { /* If we've no pages yet, never encountered this bin; set it up. */ if (al->size_classes[bin].pages == NULL) setup_bin(al, bin); /* If there's a free list entry, use that. */ if (al->size_classes[bin].free_list) { result = (void *)al->size_classes[bin].free_list; al->size_classes[bin].free_list = (char **)*(al->size_classes[bin].free_list); } else { /* If we're at the page limit, add a new page. */ if (al->size_classes[bin].alloc_pos == al->size_classes[bin].alloc_limit) add_page(al, bin); /* Now we can allocate. */ result = al->size_classes[bin].alloc_pos; al->size_classes[bin].alloc_pos += (bin + 1) << MVM_GEN2_BIN_BITS; } } else { /* We're beyond the size class bins, so resort to malloc. */ result = MVM_malloc(size); /* Add to overflows list. */ if (al->num_overflows == al->alloc_overflows) { al->alloc_overflows *= 2; al->overflows = MVM_realloc(al->overflows, al->alloc_overflows * sizeof(MVMCollectable *)); } al->overflows[al->num_overflows++] = result; } return result; } /* Allocates space using the second generation allocator and returns * a pointer to the allocated space. Promises the memory will be * zeroed, except that the MVMCollectable gen 2 flag will get set. */ void * MVM_gc_gen2_allocate_zeroed(MVMGen2Allocator *al, MVMuint32 size) { void *a = MVM_gc_gen2_allocate(al, size); memset(a, 0, size); ((MVMCollectable *)a)->flags = MVM_CF_SECOND_GEN; return a; } /* Frees all memory associated with the second generation. */ void MVM_gc_gen2_destroy(MVMInstance *i, MVMGen2Allocator *al) { MVMint32 j, k; /* Remove all pages. */ for (j = 0; j < MVM_GEN2_BINS; j++) { for (k = 0; k < al->size_classes[j].num_pages; k++) MVM_free(al->size_classes[j].pages[k]); MVM_free(al->size_classes[j].pages); } /* Free any allocated overflows. */ for (j = 0; j < al->num_overflows; j++) if (al->overflows[j]) MVM_free(al->overflows[j]); /* Clean up allocator data structure. */ MVM_free(al->size_classes); al->size_classes = NULL; MVM_free(al->overflows); al->overflows = NULL; MVM_free(al); } /* blindly move pages from one gen2 to another */ void MVM_gc_gen2_transfer(MVMThreadContext *src, MVMThreadContext *dest) { MVMGen2Allocator *gen2 = src->gen2, *dest_gen2 = dest->gen2; MVMuint32 bin, obj_size, page; char ***freelist_insert_pos; for (bin = 0; bin < MVM_GEN2_BINS; bin++) { MVMuint32 orig_dest_num_pages = dest_gen2->size_classes[bin].num_pages; char *cur_ptr, *end_ptr; /* If we've nothing allocated in this size class, skip it. */ if (gen2->size_classes[bin].pages == NULL) continue; if (dest_gen2->size_classes[bin].pages == NULL) dest_gen2->size_classes[bin].free_list = NULL; /* Calculate object size for this bin. */ obj_size = (bin + 1) << MVM_GEN2_BIN_BITS; /* freelist_insert_pos is a pointer to a memory location that * stores the address of the last traversed free list node (char **). */ /* Initialize freelist insertion position to free list head. */ freelist_insert_pos = &gen2->size_classes[bin].free_list; if (dest_gen2->size_classes[bin].pages == NULL) { dest_gen2->size_classes[bin].pages = MVM_malloc(sizeof(void *) * gen2->size_classes[bin].num_pages); dest_gen2->size_classes[bin].num_pages = gen2->size_classes[bin].num_pages; } else { dest_gen2->size_classes[bin].num_pages += gen2->size_classes[bin].num_pages; dest_gen2->size_classes[bin].pages = MVM_realloc(dest_gen2->size_classes[bin].pages, sizeof(void *) * dest_gen2->size_classes[bin].num_pages); } /* Visit each page in the source. */ for (page = 0; page < gen2->size_classes[bin].num_pages; page++) { /* Visit all the objects, looking for dead ones and swap the * owner for each of them. */ cur_ptr = gen2->size_classes[bin].pages[page]; end_ptr = page + 1 == gen2->size_classes[bin].num_pages ? gen2->size_classes[bin].alloc_pos : cur_ptr + obj_size * MVM_GEN2_PAGE_ITEMS; while (cur_ptr < end_ptr) { if (cur_ptr == (char *)freelist_insert_pos) { /* skip */ } else if (cur_ptr == (char *)*freelist_insert_pos) { /* printf("found a free list slot in bin %d page %d: %d with value %d and start %d and limit %d\n", bin, page, cur_ptr, *(void **)cur_ptr, gen2->size_classes[bin].pages[page], dest_gen2->size_classes[bin].alloc_limit);*/ freelist_insert_pos = (char ***)cur_ptr; } else { /* note: we don't have tests that exercise this path yet. */ /* printf("updating an owner from %d to %d\n", ((MVMCollectable *)cur_ptr)->owner, dest->thread_id);*/ ((MVMCollectable *)cur_ptr)->owner = dest->thread_id; } /* Move to the next object. */ cur_ptr += obj_size; } dest_gen2->size_classes[bin].pages[page + orig_dest_num_pages] = gen2->size_classes[bin].pages[page]; } freelist_insert_pos = &dest_gen2->size_classes[bin].free_list; while (*freelist_insert_pos) { freelist_insert_pos = (char ***)*freelist_insert_pos; } /* chain the destination's freelist through any remaining unallocated area */ if (dest_gen2->size_classes[bin].alloc_pos) { cur_ptr = dest_gen2->size_classes[bin].alloc_pos; end_ptr = dest_gen2->size_classes[bin].alloc_limit; while (cur_ptr < end_ptr) { *freelist_insert_pos = (char **)cur_ptr; freelist_insert_pos = (char ***)cur_ptr; cur_ptr += obj_size; } } /* link to the new pages, if any */ *freelist_insert_pos = gen2->size_classes[bin].free_list; dest_gen2->size_classes[bin].alloc_pos = gen2->size_classes[bin].alloc_pos; dest_gen2->size_classes[bin].alloc_limit = gen2->size_classes[bin].alloc_limit; MVM_free(gen2->size_classes[bin].pages); gen2->size_classes[bin].pages = NULL; gen2->size_classes[bin].num_pages = 0; } { /* copy the roots... */ MVMuint32 i, n = src->num_gen2roots; for ( i = 0; i < n; i++) { MVM_gc_root_gen2_add(dest, src->gen2roots[i]); } src->num_gen2roots = 0; src->alloc_gen2roots = 0; MVM_free(src->gen2roots); src->gen2roots = NULL; } } void MVM_gc_gen2_compact_overflows(MVMGen2Allocator *al) { /* compact the overflow list to prevent it from growing without bounds */ MVMCollectable **overflows = al->overflows; const MVMuint32 num_overflows = al->num_overflows; MVMuint32 cursor = 0; MVMuint32 live; /* Find the first NULL object. */ while (cursor < num_overflows && overflows[cursor]) cursor++; live = cursor; /* Slide others back so the alive ones are at the start of the list. */ while (cursor < num_overflows) { if (overflows[cursor]) { overflows[live++] = overflows[cursor]; } cursor++; } al->num_overflows = live; } MoarVM-2018.03/src/gc/gen2.h0000644000175000017510000000525313237701240015373 0ustar samanthasamantha/* Represents the objects for a particular size class. */ struct MVMGen2SizeClass { /* Each page holds a certain number of collectables. We know * nothing of the size statically, so we'll work in bytes. */ char **pages; /* Head of the free list. */ char **free_list; /* The current allocation position if we've nothing on the * free list. */ char *alloc_pos; /* The current page allocation limit (once we hit this, we need * to go to the next page) Also just used when no free list. */ char *alloc_limit; /* The current page number that we're allocating in. */ MVMuint32 cur_page; /* The number of pages allocated. */ MVMuint32 num_pages; }; /* An "instance" of the fixed size allocator. */ struct MVMGen2Allocator { /* Size classes for the fixed size allocator. Each one represents * a bunch of objects of the same size. The allocated sizes are * rounded and then one of these buckets is used, unless it is * past the limit. */ MVMGen2SizeClass *size_classes; /* Array of objects that were malloc'd instead, because they did * not fit in a size class due to being too large. */ MVMCollectable **overflows; /* The number of objects in the overflow array. */ MVMuint32 num_overflows; /* The amount of space allocated in the overflow array. */ MVMuint32 alloc_overflows; }; /* The number of bits we discard from the requested size when binning * the allocation request into a size class. For example, if this is * 3 bits then: * Request for 2 bytes ==> bin 0 (objects 0 - 8 bytes) * Request for 4 bytes ==> bin 0 (objects 0 - 8 bytes) * Request for 8 bytes ==> bin 0 (objects 0 - 8 bytes) * Request for 12 bytes ==> bin 1 (objects 9 - 16 bytes) * Request for 16 bytes ==> bin 1 (objects 9 - 16 bytes) */ #define MVM_GEN2_BIN_BITS 3 /* Mask used to know if we hit a size class exactly or have to round up. */ #define MVM_GEN2_BIN_MASK ((1 << MVM_GEN2_BIN_BITS) - 1) /* Number of bins in the FSA. Beyond this, we just degrade to malloc/free. */ #define MVM_GEN2_BINS 40 /* Default overflow list size. */ #define MVM_GEN2_OVERFLOWS 32 /* The number of items that go into each page. */ #define MVM_GEN2_PAGE_ITEMS 256 /* Functions. */ MVMGen2Allocator * MVM_gc_gen2_create(MVMInstance *i); void * MVM_gc_gen2_allocate(MVMGen2Allocator *al, MVMuint32 size); void * MVM_gc_gen2_allocate_zeroed(MVMGen2Allocator *al, MVMuint32 size); void MVM_gc_gen2_destroy(MVMInstance *i, MVMGen2Allocator *allocator); void MVM_gc_gen2_transfer(MVMThreadContext *src, MVMThreadContext *dest); void MVM_gc_gen2_compact_overflows(MVMGen2Allocator *allocator); MoarVM-2018.03/src/gc/objectid.c0000644000175000017510000000511213237701240016310 0ustar samanthasamantha#include "moar.h" /* Gets a stable identifier for an object, which will not change even if the * GC moves the object. */ MVMuint64 MVM_gc_object_id(MVMThreadContext *tc, MVMObject *obj) { MVMuint64 id; /* If it's already in the old generation, just use memory address, as * gen2 objects never move. */ if (obj->header.flags & MVM_CF_SECOND_GEN) { id = (MVMuint64)obj; } /* Otherwise, see if we already have a persistent object ID. */ else { MVMObjectId *entry; uv_mutex_lock(&tc->instance->mutex_object_ids); if (obj->header.flags & MVM_CF_HAS_OBJECT_ID) { /* Has one, so just look up by address in the hash ID hash. */ HASH_FIND(hash_handle, tc->instance->object_ids, (void *)&obj, sizeof(MVMObject *), entry); } else { /* Hasn't got one; allocate it a place in gen2 and make an entry * in the persistent object ID hash. */ entry = MVM_calloc(1, sizeof(MVMObjectId)); entry->current = obj; entry->gen2_addr = MVM_gc_gen2_allocate_zeroed(tc->gen2, obj->header.size); HASH_ADD_KEYPTR(hash_handle, tc->instance->object_ids, &(entry->current), sizeof(MVMObject *), entry); obj->header.flags |= MVM_CF_HAS_OBJECT_ID; } id = (MVMuint64)entry->gen2_addr; uv_mutex_unlock(&tc->instance->mutex_object_ids); } return id; } /* If an object with an entry here lives long enough to be promoted to gen2, * this removes the hash entry for it and returns the pre-allocated gen2 * address. */ void * MVM_gc_object_id_use_allocation(MVMThreadContext *tc, MVMCollectable *item) { MVMObjectId *entry; void *addr; uv_mutex_lock(&tc->instance->mutex_object_ids); HASH_FIND(hash_handle, tc->instance->object_ids, (void *)&item, sizeof(MVMObject *), entry); addr = entry->gen2_addr; HASH_DELETE(hash_handle, tc->instance->object_ids, entry); MVM_free(entry); item->flags ^= MVM_CF_HAS_OBJECT_ID; uv_mutex_unlock(&tc->instance->mutex_object_ids); return addr; } /* Clears hash entry for a persistent object ID when an object dies in the * nursery. */ void MVM_gc_object_id_clear(MVMThreadContext *tc, MVMCollectable *item) { MVMObjectId *entry; uv_mutex_lock(&tc->instance->mutex_object_ids); HASH_FIND(hash_handle, tc->instance->object_ids, (void *)&item, sizeof(MVMObject *), entry); HASH_DELETE(hash_handle, tc->instance->object_ids, entry); MVM_free(entry); uv_mutex_unlock(&tc->instance->mutex_object_ids); } MoarVM-2018.03/src/gc/objectid.h0000644000175000017510000000033713237701240016321 0ustar samanthasamanthaMVMuint64 MVM_gc_object_id(MVMThreadContext *tc, MVMObject *obj); void * MVM_gc_object_id_use_allocation(MVMThreadContext *tc, MVMCollectable *item); void MVM_gc_object_id_clear(MVMThreadContext *tc, MVMCollectable *item); MoarVM-2018.03/src/gc/orchestrate.c0000644000175000017510000007172713252330426017070 0ustar samanthasamantha#include "moar.h" #include /* If we have the job of doing GC for a thread, we add it to our work * list. */ static void add_work(MVMThreadContext *tc, MVMThreadContext *stolen) { MVMint32 i; for (i = 0; i < tc->gc_work_count; i++) if (tc->gc_work[i].tc == stolen) return; if (tc->gc_work == NULL) { tc->gc_work_size = 16; tc->gc_work = MVM_malloc(tc->gc_work_size * sizeof(MVMWorkThread)); } else if (tc->gc_work_count == tc->gc_work_size) { tc->gc_work_size *= 2; tc->gc_work = MVM_realloc(tc->gc_work, tc->gc_work_size * sizeof(MVMWorkThread)); } tc->gc_work[tc->gc_work_count++].tc = stolen; } /* Goes through all threads but the current one and notifies them that a * GC run is starting. Those that are blocked are considered excluded from * the run, and are not counted. Returns the count of threads that should be * added to the finished countdown. */ static MVMuint32 signal_one_thread(MVMThreadContext *tc, MVMThreadContext *to_signal) { /* Loop here since we may not succeed first time (e.g. the status of the * thread may change between the two ways we try to twiddle it). */ int had_suspend_request = 0; while (1) { AO_t current = MVM_load(&to_signal->gc_status); switch (current) { case MVMGCStatus_NONE: /* Try to set it from running to interrupted - the common case. */ if (MVM_cas(&to_signal->gc_status, MVMGCStatus_NONE, MVMGCStatus_INTERRUPT) == MVMGCStatus_NONE) { GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Signalled thread %d to interrupt\n", to_signal->thread_id); return 1; } break; case MVMGCStatus_INTERRUPT | MVMSuspendState_SUSPEND_REQUEST: case MVMGCStatus_INTERRUPT: GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : thread %d already interrupted\n", to_signal->thread_id); return 0; case MVMGCStatus_UNABLE | MVMSuspendState_SUSPEND_REQUEST: case MVMGCStatus_UNABLE | MVMSuspendState_SUSPENDED: had_suspend_request = current & MVMSUSPENDSTATUS_MASK; case MVMGCStatus_UNABLE: /* Otherwise, it's blocked; try to set it to work Stolen. */ if (MVM_cas(&to_signal->gc_status, MVMGCStatus_UNABLE | had_suspend_request, MVMGCStatus_STOLEN | had_suspend_request) == (MVMGCStatus_UNABLE | had_suspend_request)) { GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : A blocked thread %d spotted; work stolen\n", to_signal->thread_id); add_work(tc, to_signal); return 0; } break; /* this case occurs if a child thread is Stolen by its parent * before we get to it in the chain. */ case MVMGCStatus_STOLEN | MVMSuspendState_SUSPEND_REQUEST: case MVMGCStatus_STOLEN | MVMSuspendState_SUSPENDED: case MVMGCStatus_STOLEN: GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : thread %d already stolen (it was a spawning child)\n", to_signal->thread_id); return 0; default: MVM_panic(MVM_exitcode_gcorch, "invalid status %"MVM_PRSz" in GC orchestrate\n", MVM_load(&to_signal->gc_status)); return 0; } } } static MVMuint32 signal_all(MVMThreadContext *tc, MVMThread *threads) { MVMThread *t = threads; MVMuint32 count = 0; while (t) { switch (MVM_load(&t->body.stage)) { case MVM_thread_stage_starting: case MVM_thread_stage_waiting: case MVM_thread_stage_started: /* Don't signal ourself. */ if (t->body.tc != tc) count += signal_one_thread(tc, t->body.tc); break; case MVM_thread_stage_exited: GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : queueing to clear nursery of thread %d\n", t->body.tc->thread_id); add_work(tc, t->body.tc); break; case MVM_thread_stage_clearing_nursery: GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : queueing to destroy thread %d\n", t->body.tc->thread_id); /* last GC run for this thread */ add_work(tc, t->body.tc); break; case MVM_thread_stage_destroyed: GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : found a destroyed thread\n"); /* will be cleaned up (removed from the lists) shortly */ break; default: MVM_panic(MVM_exitcode_gcorch, "Corrupted MVMThread or running threads list: invalid thread stage %"MVM_PRSz"", MVM_load(&t->body.stage)); } t = t->body.next; } return count; } /* Does work in a thread's in-tray, if any. Returns a non-zero value if work * was found and done, and zero otherwise. */ static int process_in_tray(MVMThreadContext *tc, MVMuint8 gen) { GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Considering extra work\n"); if (MVM_load(&tc->gc_in_tray)) { GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Was given extra work by another thread; doing it\n"); MVM_gc_collect(tc, MVMGCWhatToDo_InTray, gen); return 1; } return 0; } /* Called by a thread when it thinks it is done with GC. It may get some more * work yet, though. */ static void clear_intrays(MVMThreadContext *tc, MVMuint8 gen) { MVMuint32 did_work = 1; while (did_work) { MVMThread *cur_thread; did_work = 0; cur_thread = (MVMThread *)MVM_load(&tc->instance->threads); while (cur_thread) { if (cur_thread->body.tc) did_work += process_in_tray(cur_thread->body.tc, gen); cur_thread = cur_thread->body.next; } } } static void finish_gc(MVMThreadContext *tc, MVMuint8 gen, MVMuint8 is_coordinator) { MVMuint32 i, did_work; /* Do any extra work that we have been passed. */ GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : doing any work in thread in-trays\n"); did_work = 1; while (did_work) { did_work = 0; for (i = 0; i < tc->gc_work_count; i++) did_work += process_in_tray(tc->gc_work[i].tc, gen); } /* Decrement gc_finish to say we're done, and wait for termination. */ GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Voting to finish\n"); uv_mutex_lock(&tc->instance->mutex_gc_orchestrate); MVM_decr(&tc->instance->gc_finish); uv_cond_broadcast(&tc->instance->cond_gc_finish); while (MVM_load(&tc->instance->gc_finish)) uv_cond_wait(&tc->instance->cond_gc_finish, &tc->instance->mutex_gc_orchestrate); uv_mutex_unlock(&tc->instance->mutex_gc_orchestrate); GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Termination agreed\n"); /* Co-ordinator should do final check over all the in-trays, and trigger * collection until all is settled. Rest should wait. Additionally, after * in-trays are settled, coordinator walks threads looking for anything * that needs adding to the finalize queue. It then will make another * iteration over in-trays to handle cross-thread references to objects * needing finalization. For full collections, collected objects are then * cleaned from all inter-generational sets, and finally any objects to * be freed at the fixed size allocator's next safepoint are freed. */ if (is_coordinator) { GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Co-ordinator handling in-tray clearing completion\n"); clear_intrays(tc, gen); GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Co-ordinator handling finalizers\n"); MVM_finalize_walk_queues(tc, gen); clear_intrays(tc, gen); if (gen == MVMGCGenerations_Both) { MVMThread *cur_thread = (MVMThread *)MVM_load(&tc->instance->threads); GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Co-ordinator handling inter-gen root cleanup\n"); while (cur_thread) { if (cur_thread->body.tc) MVM_gc_root_gen2_cleanup(cur_thread->body.tc); cur_thread = cur_thread->body.next; } } GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Co-ordinator handling fixed-size allocator safepoint frees\n"); MVM_fixed_size_safepoint(tc, tc->instance->fsa); MVM_profile_dump_instrumented_data(tc); MVM_profile_heap_take_snapshot(tc); GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Co-ordinator signalling in-trays clear\n"); uv_mutex_lock(&tc->instance->mutex_gc_orchestrate); MVM_store(&tc->instance->gc_intrays_clearing, 0); uv_cond_broadcast(&tc->instance->cond_gc_intrays_clearing); uv_mutex_unlock(&tc->instance->mutex_gc_orchestrate); } else { GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Waiting for in-tray clearing completion\n"); uv_mutex_lock(&tc->instance->mutex_gc_orchestrate); while (MVM_load(&tc->instance->gc_intrays_clearing)) uv_cond_wait(&tc->instance->cond_gc_intrays_clearing, &tc->instance->mutex_gc_orchestrate); uv_mutex_unlock(&tc->instance->mutex_gc_orchestrate); GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Got in-tray clearing complete notice\n"); } /* Reset GC status flags. This is also where thread destruction happens, * and it needs to happen before we acknowledge this GC run is finished. */ for (i = 0; i < tc->gc_work_count; i++) { MVMThreadContext *other = tc->gc_work[i].tc; MVMThread *thread_obj = other->thread_obj; if (MVM_load(&thread_obj->body.stage) == MVM_thread_stage_clearing_nursery) { GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : transferring gen2 of thread %d\n", other->thread_id); MVM_gc_gen2_transfer(other, tc); GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : destroying thread %d\n", other->thread_id); MVM_tc_destroy(other); tc->gc_work[i].tc = thread_obj->body.tc = NULL; MVM_store(&thread_obj->body.stage, MVM_thread_stage_destroyed); } else { /* Free gen2 unmarked if full collection. */ if (gen == MVMGCGenerations_Both) { GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : freeing gen2 of thread %d\n", other->thread_id); MVM_gc_collect_free_gen2_unmarked(other, 0); } /* Contribute this thread's promoted bytes. */ MVM_add(&tc->instance->gc_promoted_bytes_since_last_full, other->gc_promoted_bytes); /* Collect nursery. */ GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : collecting nursery uncopied of thread %d\n", other->thread_id); MVM_gc_collect_free_nursery_uncopied(other, tc->gc_work[i].limit); /* Handle exited threads. */ if (MVM_load(&thread_obj->body.stage) == MVM_thread_stage_exited) { /* Don't bother freeing gen2; we'll do it next time */ MVM_store(&thread_obj->body.stage, MVM_thread_stage_clearing_nursery); GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : set thread %d clearing nursery stage to %d\n", other->thread_id, (int)MVM_load(&thread_obj->body.stage)); } /* Mark thread free to continue. */ MVM_cas(&other->gc_status, MVMGCStatus_STOLEN, MVMGCStatus_UNABLE); MVM_cas(&other->gc_status, MVMGCStatus_INTERRUPT, MVMGCStatus_NONE); } } /* Signal acknowledgement of completing the cleanup, * except for STables, and if we're the final to do * so, free the STables, which have been linked. */ if (MVM_decr(&tc->instance->gc_ack) == 2) { /* Set it to zero (we're guaranteed the only ones trying to write to * it here). Actual STable free in MVM_gc_enter_from_allocator. */ MVM_store(&tc->instance->gc_ack, 0); /* Also clear in GC flag. */ uv_mutex_lock(&tc->instance->mutex_gc_orchestrate); tc->instance->in_gc = 0; uv_cond_broadcast(&tc->instance->cond_blocked_can_continue); uv_mutex_unlock(&tc->instance->mutex_gc_orchestrate); } } /* Called by a thread to indicate it is about to enter a blocking operation. * This tells any thread that is coordinating a GC run that this thread will * be unable to participate. */ void MVM_gc_mark_thread_blocked(MVMThreadContext *tc) { /* This may need more than one attempt. */ while (1) { /* Try to set it from running to unable - the common case. */ if (MVM_cas(&tc->gc_status, MVMGCStatus_NONE, MVMGCStatus_UNABLE) == MVMGCStatus_NONE) return; if (MVM_cas(&tc->gc_status, MVMGCStatus_INTERRUPT | MVMSuspendState_SUSPEND_REQUEST, MVMGCStatus_UNABLE | MVMSuspendState_SUSPENDED) == (MVMGCStatus_INTERRUPT | MVMSuspendState_SUSPEND_REQUEST)) return; /* The only way this can fail is if another thread just decided we're to * participate in a GC run. */ if (MVM_load(&tc->gc_status) == MVMGCStatus_INTERRUPT) MVM_gc_enter_from_interrupt(tc); else MVM_panic(MVM_exitcode_gcorch, "Invalid GC status observed while blocking thread; aborting"); } } /* Called by a thread to indicate it has completed a block operation and is * thus able to particpate in a GC run again. Note that this case needs some * special handling if it comes out of this mode when a GC run is taking place. */ void MVM_gc_mark_thread_unblocked(MVMThreadContext *tc) { /* Try to set it from unable to running. */ while (MVM_cas(&tc->gc_status, MVMGCStatus_UNABLE, MVMGCStatus_NONE) != MVMGCStatus_UNABLE) { /* We can't, presumably because a GC run is going on. We should wait * for that to finish before we go on; try using a condvar for it. */ uv_mutex_lock(&tc->instance->mutex_gc_orchestrate); if (tc->instance->in_gc) { uv_cond_wait(&tc->instance->cond_blocked_can_continue, &tc->instance->mutex_gc_orchestrate); uv_mutex_unlock(&tc->instance->mutex_gc_orchestrate); } else { uv_mutex_unlock(&tc->instance->mutex_gc_orchestrate); if ((MVM_load(&tc->gc_status) & MVMSUSPENDSTATUS_MASK) == MVMSuspendState_SUSPEND_REQUEST) { while (1) { /* Let's try to unblock into INTERRUPT mode and keep the * suspend request, then immediately enter_from_interrupt, * so we actually wait to be woken up. */ if (MVM_cas(&tc->gc_status, MVMGCStatus_UNABLE | MVMSuspendState_SUSPEND_REQUEST, MVMGCStatus_INTERRUPT | MVMSuspendState_SUSPEND_REQUEST) == (MVMGCStatus_UNABLE | MVMSuspendState_SUSPEND_REQUEST)) { MVM_gc_enter_from_interrupt(tc); break; } /* If we're being resumed while trying to unblock into * suspend request, we'd block forever. Therefor we have * to check if we've been un-requested. */ if (MVM_cas(&tc->gc_status, MVMGCStatus_UNABLE, MVMGCStatus_NONE) == MVMGCStatus_UNABLE) { return; } } } else if (MVM_load(&tc->gc_status) == MVMGCStatus_NONE) { fprintf(stderr, "marking thread %d unblocked, but its status is already NONE.\n", tc->thread_id); break; } else { MVM_platform_thread_yield(); } } } } /* Checks if a thread has marked itself as blocked. Considers that the GC may * have stolen its work and marked it as such also. So what this really * answers is, "did this thread mark itself blocked, and since then not mark * itself unblocked", which is useful if you need to conditionally unblock * or re-block. If the status changes from blocked to stolen or stolen to * blocked between checking this and calling unblock, it's safe anyway since * these cases are handled in MVM_gc_mark_thread_unblocked. Note that this * relies on a thread itself only ever calling block/unblock. */ MVMint32 MVM_gc_is_thread_blocked(MVMThreadContext *tc) { AO_t gc_status = MVM_load(&(tc->gc_status)) & MVMGCSTATUS_MASK; return gc_status == MVMGCStatus_UNABLE || gc_status == MVMGCStatus_STOLEN; } static MVMint32 is_full_collection(MVMThreadContext *tc) { MVMuint64 percent_growth, promoted; size_t rss; /* If it's below the absolute minimum, quickly return. */ promoted = (MVMuint64)MVM_load(&tc->instance->gc_promoted_bytes_since_last_full); if (promoted < MVM_GC_GEN2_THRESHOLD_MINIMUM) return 0; /* If we're heap profiling then don't consider the resident set size, as * it will be hugely distorted by the profile data we record. */ if (MVM_profile_heap_profiling(tc)) return 1; /* Otherwise, consider percentage of resident set size. */ if (uv_resident_set_memory(&rss) < 0 || rss == 0) rss = 50 * 1024 * 1024; percent_growth = (100 * promoted) / (MVMuint64)rss; return percent_growth >= MVM_GC_GEN2_THRESHOLD_PERCENT; } static void run_gc(MVMThreadContext *tc, MVMuint8 what_to_do) { MVMuint8 gen; MVMuint32 i, n; unsigned int interval_id; #if MVM_GC_DEBUG if (tc->in_spesh) MVM_panic(1, "Must not GC when in the specializer/JIT\n"); #endif /* Decide nursery or full collection. */ gen = tc->instance->gc_full_collect ? MVMGCGenerations_Both : MVMGCGenerations_Nursery; if (tc->instance->gc_full_collect) { interval_id = MVM_telemetry_interval_start(tc, "start full collection"); } else { interval_id = MVM_telemetry_interval_start(tc, "start minor collection"); } /* Do GC work for ourselves and any work threads. */ for (i = 0, n = tc->gc_work_count ; i < n; i++) { MVMThreadContext *other = tc->gc_work[i].tc; tc->gc_work[i].limit = other->nursery_alloc; GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : starting collection for thread %d\n", other->thread_id); other->gc_promoted_bytes = 0; MVM_gc_collect(other, (other == tc ? what_to_do : MVMGCWhatToDo_NoInstance), gen); } /* Wait for everybody to agree we're done. */ finish_gc(tc, gen, what_to_do == MVMGCWhatToDo_All); MVM_telemetry_interval_stop(tc, interval_id, "finished run_gc"); } /* This is called when the allocator finds it has run out of memory and wants * to trigger a GC run. In this case, it's possible (probable, really) that it * will need to do that triggering, notifying other running threads that the * time has come to GC. */ void MVM_gc_enter_from_allocator(MVMThreadContext *tc) { GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Entered from allocate\n"); MVM_telemetry_timestamp(tc, "gc_enter_from_allocator"); /* Try to start the GC run. */ if (MVM_trycas(&tc->instance->gc_start, 0, 1)) { MVMThread *last_starter = NULL; MVMuint32 num_threads = 0; /* Stash us as the thread to blame for this GC run (used to give it a * potential nursery size boost). */ tc->instance->thread_to_blame_for_gc = tc; /* Need to wait for other threads to reset their gc_status. */ while (MVM_load(&tc->instance->gc_ack)) { GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : waiting for other thread's gc_ack\n"); MVM_platform_thread_yield(); } /* We are the winner of the GC starting race. This gives us some * extra responsibilities as well as doing the usual things. * First, increment GC sequence number. */ MVM_incr(&tc->instance->gc_seq_number); GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : GC thread elected coordinator: starting gc seq %d\n", (int)MVM_load(&tc->instance->gc_seq_number)); /* Decide if it will be a full collection. */ tc->instance->gc_full_collect = is_full_collection(tc); MVM_telemetry_timestamp(tc, "won the gc starting race"); /* If profiling, record that GC is starting. */ if (tc->instance->profiling) MVM_profiler_log_gc_start(tc, tc->instance->gc_full_collect, 1); /* Ensure our stolen list is empty. */ tc->gc_work_count = 0; /* Flag that we didn't agree on this run that all the in-trays are * cleared (a responsibility of the co-ordinator. */ MVM_store(&tc->instance->gc_intrays_clearing, 1); /* We'll take care of our own work. */ add_work(tc, tc); /* Find other threads, and signal or steal. Also set in GC flag. */ uv_mutex_lock(&tc->instance->mutex_threads); tc->instance->in_gc = 1; num_threads = signal_all(tc, tc->instance->threads); uv_mutex_unlock(&tc->instance->mutex_threads); /* Bump the thread count and signal any threads waiting for that. */ uv_mutex_lock(&tc->instance->mutex_gc_orchestrate); MVM_add(&tc->instance->gc_start, num_threads); uv_cond_broadcast(&tc->instance->cond_gc_start); uv_mutex_unlock(&tc->instance->mutex_gc_orchestrate); /* If there's an event loop thread, wake it up to participate. */ if (tc->instance->event_loop_wakeup) uv_async_send(tc->instance->event_loop_wakeup); /* Wait for other threads to be ready. */ uv_mutex_lock(&tc->instance->mutex_gc_orchestrate); while (MVM_load(&tc->instance->gc_start) > 1) uv_cond_wait(&tc->instance->cond_gc_start, &tc->instance->mutex_gc_orchestrate); uv_mutex_unlock(&tc->instance->mutex_gc_orchestrate); /* Sanity check finish votes. */ if (MVM_load(&tc->instance->gc_finish) != 0) MVM_panic(MVM_exitcode_gcorch, "Finish votes was %"MVM_PRSz"\n", MVM_load(&tc->instance->gc_finish)); /* gc_ack gets an extra so the final acknowledger * can also free the STables. */ MVM_store(&tc->instance->gc_finish, num_threads + 1); MVM_store(&tc->instance->gc_ack, num_threads + 2); GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : finish votes is %d\n", (int)MVM_load(&tc->instance->gc_finish)); /* Now we're ready to start, zero promoted since last full collection * counter if this is a full collect. */ if (tc->instance->gc_full_collect) MVM_store(&tc->instance->gc_promoted_bytes_since_last_full, 0); /* This is a safe point for us to free any STables that have been marked * for deletion in the previous collection (since we let finalization - * which appends to this list - happen after we set threads on their * way again, it's not safe to do it in the previous collection). */ GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Freeing STables if needed\n"); MVM_gc_collect_free_stables(tc); /* Signal to the rest to start */ GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : coordinator signalling start\n"); uv_mutex_lock(&tc->instance->mutex_gc_orchestrate); if (MVM_decr(&tc->instance->gc_start) != 1) MVM_panic(MVM_exitcode_gcorch, "Start votes was %"MVM_PRSz"\n", MVM_load(&tc->instance->gc_start)); uv_cond_broadcast(&tc->instance->cond_gc_start); uv_mutex_unlock(&tc->instance->mutex_gc_orchestrate); /* Start collecting. */ GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : coordinator entering run_gc\n"); run_gc(tc, MVMGCWhatToDo_All); /* If profiling, record that GC is over. */ if (tc->instance->profiling) MVM_profiler_log_gc_end(tc); MVM_telemetry_timestamp(tc, "gc finished"); GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : GC complete (coordinator)\n"); } else { /* Another thread beat us to starting the GC sync process. Thus, act as * if we were interrupted to GC. */ GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Lost coordinator election\n"); MVM_gc_enter_from_interrupt(tc); } } /* This is called when a thread hits an interrupt at a GC safe point. * * There are two interpretations for this: * * That another thread is already trying to start a GC run, so we don't need * to try and do that, just enlist in the run. * * The debug remote is asking this thread to suspend execution. * * Those cases can be distinguished by the gc state masked with * MVMSUSPENDSTATUS_MASK. * */ void MVM_gc_enter_from_interrupt(MVMThreadContext *tc) { AO_t curr; GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Entered from interrupt\n"); if ((MVM_load(&tc->gc_status) & MVMSUSPENDSTATUS_MASK) == MVMSuspendState_SUSPEND_REQUEST) { if (tc->instance->debugserver && tc->instance->debugserver->debugspam_protocol) fprintf(stderr, "thread %d reacting to suspend request\n", tc->thread_id); MVM_gc_mark_thread_blocked(tc); while (1) { uv_cond_wait(&tc->instance->debugserver->tell_threads, &tc->instance->debugserver->mutex_cond); if ((MVM_load(&tc->gc_status) & MVMSUSPENDSTATUS_MASK) == MVMSuspendState_NONE) { if (tc->instance->debugserver && tc->instance->debugserver->debugspam_protocol) fprintf(stderr, "thread %d got un-suspended\n", tc->thread_id); break; } else { if (tc->instance->debugserver && tc->instance->debugserver->debugspam_protocol) fprintf(stderr, "something happened, but we're still suspended.\n"); } } MVM_gc_mark_thread_unblocked(tc); return; } else if (MVM_load(&tc->gc_status) == (MVMGCStatus_UNABLE | MVMSuspendState_SUSPENDED)) { /* The thread that the tc belongs to is already waiting in that loop * up there. If we reach this piece of code the active thread must be * the debug remote using a suspended thread's ThreadContext. */ return; } MVM_telemetry_timestamp(tc, "gc_enter_from_interrupt"); /* If profiling, record that GC is starting. */ if (tc->instance->profiling) MVM_profiler_log_gc_start(tc, is_full_collection(tc), 0); /* We'll certainly take care of our own work. */ tc->gc_work_count = 0; add_work(tc, tc); /* Indicate that we're ready to GC. Only want to decrement it if it's 2 or * greater (0 should never happen; 1 means the coordinator is still counting * up how many threads will join in, so we should wait until it decides to * decrement.) */ uv_mutex_lock(&tc->instance->mutex_gc_orchestrate); while (MVM_load(&tc->instance->gc_start) < 2) uv_cond_wait(&tc->instance->cond_gc_start, &tc->instance->mutex_gc_orchestrate); MVM_decr(&tc->instance->gc_start); uv_cond_broadcast(&tc->instance->cond_gc_start); uv_mutex_unlock(&tc->instance->mutex_gc_orchestrate); /* Wait for all threads to indicate readiness to collect. */ GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Waiting for other threads\n"); uv_mutex_lock(&tc->instance->mutex_gc_orchestrate); while (MVM_load(&tc->instance->gc_start)) uv_cond_wait(&tc->instance->cond_gc_start, &tc->instance->mutex_gc_orchestrate); uv_mutex_unlock(&tc->instance->mutex_gc_orchestrate); GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : Entering run_gc\n"); run_gc(tc, MVMGCWhatToDo_NoInstance); GCDEBUG_LOG(tc, MVM_GC_DEBUG_ORCHESTRATE, "Thread %d run %d : GC complete\n"); /* If profiling, record that GC is over. */ if (tc->instance->profiling) MVM_profiler_log_gc_end(tc); } /* Run the global destruction phase. */ void MVM_gc_global_destruction(MVMThreadContext *tc) { char *nursery_tmp; /* Fake a nursery collection run by swapping the semi- * space nurseries. */ nursery_tmp = tc->nursery_fromspace; tc->nursery_fromspace = tc->nursery_tospace; tc->nursery_tospace = nursery_tmp; /* Run the objects' finalizers */ MVM_gc_collect_free_nursery_uncopied(tc, tc->nursery_alloc); MVM_gc_root_gen2_cleanup(tc); MVM_gc_collect_free_gen2_unmarked(tc, 1); MVM_gc_collect_free_stables(tc); } MoarVM-2018.03/src/gc/orchestrate.h0000644000175000017510000000361113237701240017057 0ustar samanthasamanthavoid MVM_gc_enter_from_allocator(MVMThreadContext *tc); void MVM_gc_enter_from_interrupt(MVMThreadContext *tc); MVM_PUBLIC void MVM_gc_mark_thread_blocked(MVMThreadContext *tc); MVM_PUBLIC void MVM_gc_mark_thread_unblocked(MVMThreadContext *tc); MVM_PUBLIC MVMint32 MVM_gc_is_thread_blocked(MVMThreadContext *tc); void MVM_gc_global_destruction(MVMThreadContext *tc); struct MVMWorkThread { MVMThreadContext *tc; void *limit; }; typedef enum { MVM_GC_DEBUG_ORCHESTRATE = 1, MVM_GC_DEBUG_COLLECT = 2, /* MVM_GC_DEBUG_ = 4, MVM_GC_DEBUG_ = 8, MVM_GC_DEBUG_ = 16, MVM_GC_DEBUG_ = 32, MVM_GC_DEBUG_ = 64, MVM_GC_DEBUG_ = 128, MVM_GC_DEBUG_ = 256, MVM_GC_DEBUG_ = 512, MVM_GC_DEBUG_ = 1024, MVM_GC_DEBUG_ = 2048, MVM_GC_DEBUG_ = 4096, MVM_GC_DEBUG_ = 8192, MVM_GC_DEBUG_ = 16384, MVM_GC_DEBUG_ = 32768, MVM_GC_DEBUG_ = 65536, MVM_GC_DEBUG_ = 131072, MVM_GC_DEBUG_ = 262144, MVM_GC_DEBUG_ = 524288, MVM_GC_DEBUG_ = 1048576, MVM_GC_DEBUG_ = 2097152, MVM_GC_DEBUG_ = 4194304, MVM_GC_DEBUG_ = 8388608, MVM_GC_DEBUG_ = 16777216, MVM_GC_DEBUG_ = 33554432, MVM_GC_DEBUG_ = 67108864, MVM_GC_DEBUG_ = 134217728*/ } MVMGCDebugLogFlags; /* OR together the flags you want to require, or redefine * MVM_GC_DEBUG_ENABLED(flags) if you want something more * complicated. */ #define MVM_GC_DEBUG_LOG_FLAGS \ 0 #define MVM_GC_DEBUG_ENABLED(flags) \ ((MVM_GC_DEBUG_LOG_FLAGS) & (flags)) #ifdef _MSC_VER # define GCDEBUG_LOG(tc, flags, msg, ...) \ if (MVM_GC_DEBUG_ENABLED(flags)) \ printf((msg), (tc)->thread_id, \ MVM_load(&(tc)->instance->gc_seq_number), __VA_ARGS__) #else # define GCDEBUG_LOG(tc, flags, msg, ...) \ if (MVM_GC_DEBUG_ENABLED(flags)) \ printf((msg), (tc)->thread_id, \ (int)MVM_load(&(tc)->instance->gc_seq_number) , ##__VA_ARGS__) #endif MoarVM-2018.03/src/gc/roots.c0000644000175000017510000005042413252330426015702 0ustar samanthasamantha#include "moar.h" /* Adds a location holding a collectable object to the permanent list of GC * roots, so that it will always be marked and never die. Note that the * address of the collectable must be passed, since it will need to be * updated. */ void MVM_gc_root_add_permanent_desc(MVMThreadContext *tc, MVMCollectable **obj_ref, char *description) { if (obj_ref == NULL) MVM_panic(MVM_exitcode_gcroots, "Illegal attempt to add null object address as a permanent root"); uv_mutex_lock(&tc->instance->mutex_permroots); /* Allocate extra permanent root space if needed. */ if (tc->instance->num_permroots == tc->instance->alloc_permroots) { tc->instance->alloc_permroots *= 2; tc->instance->permroots = MVM_realloc(tc->instance->permroots, sizeof(MVMCollectable **) * tc->instance->alloc_permroots); tc->instance->permroot_descriptions = MVM_realloc( tc->instance->permroot_descriptions, sizeof(char *) * tc->instance->alloc_permroots); } /* Add this one to the list. */ tc->instance->permroots[tc->instance->num_permroots] = obj_ref; tc->instance->permroot_descriptions[tc->instance->num_permroots] = description; tc->instance->num_permroots++; uv_mutex_unlock(&tc->instance->mutex_permroots); } void MVM_gc_root_add_permanent(MVMThreadContext *tc, MVMCollectable **obj_ref) { MVM_gc_root_add_permanent_desc(tc, obj_ref, "<\?\?>"); } /* Adds the set of permanently registered roots to a GC worklist. */ void MVM_gc_root_add_permanents_to_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMHeapSnapshotState *snapshot) { MVMuint32 i, num_roots; MVMCollectable ***permroots; num_roots = tc->instance->num_permroots; permroots = tc->instance->permroots; if (worklist) { for (i = 0; i < num_roots; i++) MVM_gc_worklist_add(tc, worklist, permroots[i]); } else { char **permroot_descriptions = tc->instance->permroot_descriptions; for (i = 0; i < num_roots; i++) MVM_profile_heap_add_collectable_rel_const_cstr(tc, snapshot, *(permroots[i]), permroot_descriptions[i]); } } /* This macro factors out the logic to check if we're adding to a GC worklist * or a heap snapshot, and does the appropriate thing. */ #define add_collectable(tc, worklist, snapshot, col, desc) \ do { \ if (worklist) { \ MVM_gc_worklist_add(tc, worklist, &(col)); \ } \ else { \ MVM_profile_heap_add_collectable_rel_const_cstr(tc, snapshot, \ (MVMCollectable *)col, desc); \ } \ } while (0) /* Adds anything that is a root thanks to being referenced by instance, * but that isn't permanent. */ void MVM_gc_root_add_instance_roots_to_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMHeapSnapshotState *snapshot) { MVMSerializationContextBody *current, *tmp; MVMLoadedCompUnitName *current_lcun, *tmp_lcun; unsigned bucket_tmp; MVMString **int_to_str_cache; MVMuint32 i; add_collectable(tc, worklist, snapshot, tc->instance->threads, "Thread list"); add_collectable(tc, worklist, snapshot, tc->instance->compiler_registry, "Compiler registry"); add_collectable(tc, worklist, snapshot, tc->instance->hll_syms, "HLL symbols"); add_collectable(tc, worklist, snapshot, tc->instance->clargs, "Command line args"); add_collectable(tc, worklist, snapshot, tc->instance->event_loop_todo_queue, "Event loop todo queue"); add_collectable(tc, worklist, snapshot, tc->instance->event_loop_permit_queue, "Event loop permit queue"); add_collectable(tc, worklist, snapshot, tc->instance->event_loop_cancel_queue, "Event loop cancel queue"); add_collectable(tc, worklist, snapshot, tc->instance->event_loop_active, "Event loop active"); add_collectable(tc, worklist, snapshot, tc->instance->spesh_queue, "Specialization log queue"); if (worklist) MVM_spesh_plan_gc_mark(tc, tc->instance->spesh_plan, worklist); int_to_str_cache = tc->instance->int_to_str_cache; for (i = 0; i < MVM_INT_TO_STR_CACHE_SIZE; i++) add_collectable(tc, worklist, snapshot, int_to_str_cache[i], "Integer to string cache entry"); /* okay, so this makes the weak hash slightly less weak.. for certain * keys of it anyway... */ HASH_ITER(hash_handle, tc->instance->sc_weakhash, current, tmp, bucket_tmp) { /* mark the string handle pointer iff it hasn't yet been resolved */ add_collectable(tc, worklist, snapshot, current->hash_handle.key, "SC weakhash hash key"); if (!current->sc) add_collectable(tc, worklist, snapshot, current->handle, "SC weakhash unresolved handle"); else if (!current->claimed) add_collectable(tc, worklist, snapshot, current->sc, "SC weakhash unclaimed SC"); } HASH_ITER(hash_handle, tc->instance->loaded_compunits, current_lcun, tmp_lcun, bucket_tmp) { add_collectable(tc, worklist, snapshot, current_lcun->hash_handle.key, "Loaded compilation unit hash key"); add_collectable(tc, worklist, snapshot, current_lcun->filename, "Loaded compilation unit filename"); } add_collectable(tc, worklist, snapshot, tc->instance->cached_backend_config, "Cached backend configuration hash"); add_collectable(tc, worklist, snapshot, tc->instance->env_hash, "Cached environment variable hash"); MVM_debugserver_mark_handles(tc, worklist, snapshot); } /* Adds anything that is a root thanks to being referenced by a thread, * context, but that isn't permanent. */ void MVM_gc_root_add_tc_roots_to_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMHeapSnapshotState *snapshot) { MVMNativeCallbackCacheHead *current_cbceh, *tmp_cbceh; unsigned bucket_tmp; /* Any active exception handlers and payload. */ MVMActiveHandler *cur_ah = tc->active_handlers; while (cur_ah != NULL) { add_collectable(tc, worklist, snapshot, cur_ah->ex_obj, "Active handler exception object"); if (!MVM_FRAME_IS_ON_CALLSTACK(tc, cur_ah->frame)) add_collectable(tc, worklist, snapshot, cur_ah->frame, "Active handler frame"); cur_ah = cur_ah->next_handler; } add_collectable(tc, worklist, snapshot, tc->last_payload, "Last exception payload"); /* The thread object. */ add_collectable(tc, worklist, snapshot, tc->thread_obj, "Thread object"); /* The thread's entry frame. */ if (tc->thread_entry_frame && !MVM_FRAME_IS_ON_CALLSTACK(tc, tc->thread_entry_frame)) add_collectable(tc, worklist, snapshot, tc->thread_entry_frame, "Thread entry frame"); /* Any exception handler result. */ add_collectable(tc, worklist, snapshot, tc->last_handler_result, "Last handler result"); /* List of SCs currently being compiled. */ add_collectable(tc, worklist, snapshot, tc->compiling_scs, "Compiling serialization contexts"); /* compunit variable pointer (and be null if thread finished) */ if (tc->interp_cu) add_collectable(tc, worklist, snapshot, *(tc->interp_cu), "Current interpreter compilation unit"); /* Current dispatcher. */ add_collectable(tc, worklist, snapshot, tc->cur_dispatcher, "Current dispatcher"); add_collectable(tc, worklist, snapshot, tc->cur_dispatcher_for, "Current dispatcher for"); /* Callback cache. */ HASH_ITER(hash_handle, tc->native_callback_cache, current_cbceh, tmp_cbceh, bucket_tmp) { MVMint32 i; MVMNativeCallback *entry = current_cbceh->head; add_collectable(tc, worklist, snapshot, current_cbceh->hash_handle.key, "Native callback cache key"); while (entry) { for (i = 0; i < entry->num_types; i++) add_collectable(tc, worklist, snapshot, entry->types[i], "Native callback cache type"); add_collectable(tc, worklist, snapshot, entry->target, "Native callback cache target"); entry = entry->next; } } /* Profiling data. */ if (worklist) MVM_profile_instrumented_mark_data(tc, worklist); /* Serialized string heap, if any. */ add_collectable(tc, worklist, snapshot, tc->serialized_string_heap, "Serialized string heap"); /* Specialization log and stack simulation. */ add_collectable(tc, worklist, snapshot, tc->spesh_log, "Specialization log"); if (worklist) MVM_spesh_sim_stack_gc_mark(tc, tc->spesh_sim_stack, worklist); else { MVM_spesh_sim_stack_gc_describe(tc, snapshot, tc->spesh_sim_stack); } if (tc->step_mode_frame) add_collectable(tc, worklist, snapshot, tc->step_mode_frame, "Frame referenced for stepping mode"); } /* Pushes a temporary root onto the thread-local roots list. */ void MVM_gc_root_temp_push_slow(MVMThreadContext *tc, MVMCollectable **obj_ref) { /* Allocate extra temporary root space if needed. */ if (tc->num_temproots == tc->alloc_temproots) { tc->alloc_temproots *= 2; tc->temproots = MVM_realloc(tc->temproots, sizeof(MVMCollectable **) * tc->alloc_temproots); } /* Add this one to the list. */ tc->temproots[tc->num_temproots] = obj_ref; tc->num_temproots++; } /* Marks the temporary root stack at its current height as the limit for * removing all roots. This is done so that in nested interpreter runs * (at present, just nativecall callbacks) we don't clear things that * are pushed by the native call itself. */ MVMuint32 MVM_gc_root_temp_mark(MVMThreadContext *tc) { MVMint32 current = tc->mark_temproots; tc->mark_temproots = tc->num_temproots; return current; } /* Resets the temporary root stack mark to the provided height. */ void MVM_gc_root_temp_mark_reset(MVMThreadContext *tc, MVMuint32 mark) { tc->mark_temproots = mark; } /* Pops all temporary roots off the thread-local roots list. */ void MVM_gc_root_temp_pop_all(MVMThreadContext *tc) { tc->num_temproots = tc->mark_temproots; } /* Adds the set of thread-local temporary roots to a GC worklist. Note that we * may MVMROOT things that are actually frames on a therad local call stack as * they may be GC-able; check for this and make sure such roots do not get * added to the worklist. (Cheaper to do it here in the event we GC than to * do it on every stack push). */ static MVMuint32 is_stack_frame(MVMThreadContext *tc, MVMCollectable **c) { MVMCollectable *maybe_frame = *c; return maybe_frame && maybe_frame->flags == 0 && maybe_frame->owner == 0; } void MVM_gc_root_add_temps_to_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMHeapSnapshotState *snapshot) { MVMuint32 i, num_roots; MVMCollectable ***temproots; num_roots = tc->num_temproots; temproots = tc->temproots; if (worklist) { for (i = 0; i < num_roots; i++) if (!is_stack_frame(tc, temproots[i])) MVM_gc_worklist_add(tc, worklist, temproots[i]); } else { for (i = 0; i < num_roots; i++) if (!is_stack_frame(tc, temproots[i])) MVM_profile_heap_add_collectable_rel_idx(tc, snapshot, *(temproots[i]), i); } } /* Pushes a collectable that is in generation 2, but now references a nursery * collectable, into the gen2 root set. */ void MVM_gc_root_gen2_add(MVMThreadContext *tc, MVMCollectable *c) { /* Ensure the collectable is not null. */ if (c == NULL) MVM_panic(MVM_exitcode_gcroots, "Illegal attempt to add null collectable address as an inter-generational root"); assert(!(c->flags & MVM_CF_FORWARDER_VALID)); /* Allocate extra gen2 aggregate space if needed. */ if (tc->num_gen2roots == tc->alloc_gen2roots) { tc->alloc_gen2roots *= 2; tc->gen2roots = MVM_realloc(tc->gen2roots, sizeof(MVMCollectable **) * tc->alloc_gen2roots); } /* Add this one to the list. */ tc->gen2roots[tc->num_gen2roots] = c; tc->num_gen2roots++; /* Flag it as added, so we don't add it multiple times. */ c->flags |= MVM_CF_IN_GEN2_ROOT_LIST; } /* Adds the set of thread-local inter-generational roots to a GC worklist. As * a side-effect, removes gen2 roots that no longer point to any nursery * items (usually because all the referenced objects also got promoted). */ void MVM_gc_root_add_gen2s_to_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist) { MVMCollectable **gen2roots = tc->gen2roots; MVMuint32 num_roots = tc->num_gen2roots; MVMuint32 i; /* We'll remove some entries from this list. The algorithm is simply to * slide all that stay towards the start of the array. */ MVMuint32 insert_pos = 0; /* Guess that we'll end up with around num_roots entries, to avoid some * worklist growth reallocations. */ MVM_gc_worklist_presize_for(tc, worklist, num_roots); /* Visit each gen2 root and... */ for (i = 0; i < num_roots; i++) { /* Count items on worklist before we mark it. */ MVMuint32 items_before_mark = worklist->items; /* Put things it references into the worklist; since the worklist will * be set not to include gen2 things, only nursery things will make it * in. */ assert(!(gen2roots[i]->flags & MVM_CF_FORWARDER_VALID)); MVM_gc_mark_collectable(tc, worklist, gen2roots[i]); /* If we added any nursery objects, or if we are a frame with ->work * area, keep in this list. */ if (worklist->items != items_before_mark || (gen2roots[i]->flags & MVM_CF_FRAME && ((MVMFrame *)gen2roots[i])->work)) { gen2roots[insert_pos] = gen2roots[i]; insert_pos++; } /* Otherwise, clear the "in gen2 root list" flag. Note that another * thread may also clear this flag if it also had the entry in its * inter-gen list, so be careful to clear it, not just toggle. */ else { gen2roots[i]->flags &= ~MVM_CF_IN_GEN2_ROOT_LIST; } } /* New number of entries after sliding is the final insert position. */ tc->num_gen2roots = insert_pos; } /* Adds inter-generational roots to a heap snapshot. */ void MVM_gc_root_add_gen2s_to_snapshot(MVMThreadContext *tc, MVMHeapSnapshotState *snapshot) { MVMCollectable **gen2roots = tc->gen2roots; MVMuint32 num_roots = tc->num_gen2roots; MVMuint32 i; for (i = 0; i < num_roots; i++) MVM_profile_heap_add_collectable_rel_idx(tc, snapshot, gen2roots[i], i); } /* Visits all of the roots in the gen2 list and removes those that have been * collected. Applied after a full collection. */ void MVM_gc_root_gen2_cleanup(MVMThreadContext *tc) { MVMCollectable **gen2roots = tc->gen2roots; MVMuint32 num_roots = tc->num_gen2roots; MVMuint32 i = 0; MVMuint32 cur_survivor; /* Find the first collected object. */ while (i < num_roots && gen2roots[i]->flags & MVM_CF_GEN2_LIVE) i++; cur_survivor = i; /* Slide others back so the alive ones are at the start of the list. */ while (i < num_roots) { if (gen2roots[i]->flags & MVM_CF_GEN2_LIVE) { assert(!(gen2roots[i]->flags & MVM_CF_FORWARDER_VALID)); gen2roots[cur_survivor++] = gen2roots[i]; } i++; } tc->num_gen2roots = cur_survivor; } /* Walks frames and compilation units. Adds the roots it finds into the * GC worklist. */ static void scan_lexicals(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMFrame *frame); void MVM_gc_root_add_frame_roots_to_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMFrame *cur_frame) { /* Add caller to worklist if it's heap-allocated. */ if (cur_frame->caller && !MVM_FRAME_IS_ON_CALLSTACK(tc, cur_frame->caller)) MVM_gc_worklist_add(tc, worklist, &cur_frame->caller); /* Add outer, code_ref and static info to work list. */ MVM_gc_worklist_add(tc, worklist, &cur_frame->outer); MVM_gc_worklist_add(tc, worklist, &cur_frame->code_ref); MVM_gc_worklist_add(tc, worklist, &cur_frame->static_info); /* Mark frame extras if needed. */ if (cur_frame->extra) { MVMFrameExtra *e = cur_frame->extra; if (e->special_return_data && e->mark_special_return_data) e->mark_special_return_data(tc, cur_frame, worklist); if (e->continuation_tags) { MVMContinuationTag *tag = e->continuation_tags; while (tag) { MVM_gc_worklist_add(tc, worklist, &tag->tag); tag = tag->next; } } MVM_gc_worklist_add(tc, worklist, &e->invoked_call_capture); if (e->dynlex_cache_name) MVM_gc_worklist_add(tc, worklist, &e->dynlex_cache_name); } /* Scan the registers. */ MVM_gc_root_add_frame_registers_to_worklist(tc, worklist, cur_frame); scan_lexicals(tc, worklist, cur_frame); } /* Takes a frame, scans its registers and adds them to the roots. */ void MVM_gc_root_add_frame_registers_to_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMFrame *frame) { MVMuint16 i, count, flag; MVMuint16 *type_map; MVMuint8 *flag_map; /* We only need to do any of this work if the frame is in dynamic scope. */ if (frame->work) { /* Scan locals. */ MVMSpeshCandidate *spesh_cand = frame->spesh_cand; MVMJitCode *jitcode = spesh_cand ? spesh_cand->jitcode : NULL; if (jitcode && jitcode->local_types) { type_map = jitcode->local_types; count = jitcode->num_locals; } else if (frame->spesh_cand && frame->spesh_cand->local_types) { type_map = frame->spesh_cand->local_types; count = frame->spesh_cand->num_locals; } else { type_map = frame->static_info->body.local_types; count = frame->static_info->body.num_locals; } for (i = 0; i < count; i++) if (type_map[i] == MVM_reg_str || type_map[i] == MVM_reg_obj) MVM_gc_worklist_add(tc, worklist, &frame->work[i].o); /* Scan arg buffer if needed. */ if (frame->cur_args_callsite) { flag_map = frame->cur_args_callsite->arg_flags; count = frame->cur_args_callsite->arg_count; for (i = 0, flag = 0; i < count; i++, flag++) { if (flag_map[flag] & MVM_CALLSITE_ARG_NAMED) { /* Current position is name, then next is value. */ MVM_gc_worklist_add(tc, worklist, &frame->args[i].s); i++; } if (flag_map[flag] & MVM_CALLSITE_ARG_STR || flag_map[flag] & MVM_CALLSITE_ARG_OBJ) MVM_gc_worklist_add(tc, worklist, &frame->args[i].o); } } /* Scan arguments in case there was a flattening. Don't need to if * there wasn't a flattening because orig args is a subset of locals. */ if (frame->params.arg_flags && frame->params.callsite->has_flattening) { MVMArgProcContext *ctx = &frame->params; flag_map = ctx->arg_flags; count = ctx->arg_count; for (i = 0, flag = 0; i < count; i++, flag++) { if (flag_map[flag] & MVM_CALLSITE_ARG_NAMED) { /* Current position is name, then next is value. */ MVM_gc_worklist_add(tc, worklist, &ctx->args[i].s); i++; } if (flag_map[flag] & MVM_CALLSITE_ARG_STR || flag_map[flag] & MVM_CALLSITE_ARG_OBJ) MVM_gc_worklist_add(tc, worklist, &ctx->args[i].o); } } } } /* Takes a frame, scans its lexicals and adds them to the roots. */ static void scan_lexicals(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMFrame *frame) { if (frame->env) { MVMuint16 i, count; MVMuint16 *type_map; if (frame->spesh_cand && frame->spesh_cand->lexical_types) { type_map = frame->spesh_cand->lexical_types; count = frame->spesh_cand->num_lexicals; } else { type_map = frame->static_info->body.lexical_types; count = frame->static_info->body.num_lexicals; } for (i = 0; i < count; i++) if (type_map[i] == MVM_reg_str || type_map[i] == MVM_reg_obj) MVM_gc_worklist_add(tc, worklist, &frame->env[i].o); } } MoarVM-2018.03/src/gc/roots.h0000644000175000017510000001244313242626641015714 0ustar samanthasamantha/* Set this flag to debug temporary root pushes/pops. */ #define MVM_TEMP_ROOT_DEBUG 0 /* The number of temp roots we start out with per thread (and so can rely on * always having). */ #define MVM_TEMP_ROOT_BASE_ALLOC 16 /* Temp root push slow-path case. */ MVM_PUBLIC void MVM_gc_root_temp_push_slow(MVMThreadContext *tc, MVMCollectable **obj_ref); /* Fast-path case of pushing a root onto the per-thread temporary roots. */ MVM_STATIC_INLINE void MVM_gc_root_temp_push(MVMThreadContext *tc, MVMCollectable **obj_ref) { /* If debugging, ensure the root is not null. */ #ifdef MVM_TEMP_ROOT_DEBUG if (obj_ref == NULL) MVM_panic(MVM_exitcode_gcroots, "Illegal attempt to add null object address as a temporary root"); #endif /* If less than the number of always-allocated roots, just add. */ if (tc->num_temproots < MVM_TEMP_ROOT_BASE_ALLOC) { tc->temproots[tc->num_temproots] = obj_ref; tc->num_temproots++; } /* Otherwise call the slow path. */ else { MVM_gc_root_temp_push_slow(tc, obj_ref); } } /* Pop top root from the per-thread temporary roots stack. */ MVM_STATIC_INLINE void MVM_gc_root_temp_pop(MVMThreadContext *tc) { #if MVM_TEMP_ROOT_DEBUG if (tc->num_temproots <= 0) MVM_panic(1, "Illegal attempt to pop empty temporary root stack"); #endif tc->num_temproots--; } /* Pop top n roots from the per-thread temporary roots stack. */ MVM_STATIC_INLINE void MVM_gc_root_temp_pop_n(MVMThreadContext *tc, MVMuint32 n) { #if MVM_TEMP_ROOT_DEBUG if (tc->num_temproots < n) MVM_panic(MVM_exitcode_gcroots, "Illegal attempt to pop insufficiently large temporary root stack"); #endif tc->num_temproots -= n; } /* Other functions related to roots. */ MVM_PUBLIC void MVM_gc_root_add_permanent(MVMThreadContext *tc, MVMCollectable **obj_ref); MVM_PUBLIC void MVM_gc_root_add_permanent_desc(MVMThreadContext *tc, MVMCollectable **obj_ref, char *description); void MVM_gc_root_add_permanents_to_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMHeapSnapshotState *snapshot); void MVM_gc_root_add_instance_roots_to_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMHeapSnapshotState *snapshot); void MVM_gc_root_add_tc_roots_to_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMHeapSnapshotState *snapshot); MVMuint32 MVM_gc_root_temp_mark(MVMThreadContext *tc); void MVM_gc_root_temp_mark_reset(MVMThreadContext *tc, MVMuint32 mark); void MVM_gc_root_temp_pop_all(MVMThreadContext *tc); void MVM_gc_root_add_temps_to_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMHeapSnapshotState *snapshot); void MVM_gc_root_gen2_add(MVMThreadContext *tc, MVMCollectable *c); void MVM_gc_root_add_gen2s_to_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist); void MVM_gc_root_add_gen2s_to_snapshot(MVMThreadContext *tc, MVMHeapSnapshotState *snapshot); void MVM_gc_root_gen2_cleanup(MVMThreadContext *tc); void MVM_gc_root_add_frame_roots_to_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMFrame *start_frame); void MVM_gc_root_add_frame_registers_to_worklist(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMFrame *frame); /* Macros related to rooting objects into the temporaries list, and * unrooting them afterwards. */ #define MVMROOT(tc, obj_ref, block) do {\ MVM_gc_root_temp_push(tc, (MVMCollectable **)&(obj_ref)); \ block \ MVM_gc_root_temp_pop(tc); \ } while (0) #define MVMROOT2(tc, obj_ref1, obj_ref2, block) do {\ MVM_gc_root_temp_push(tc, (MVMCollectable **)&(obj_ref1)); \ MVM_gc_root_temp_push(tc, (MVMCollectable **)&(obj_ref2)); \ block \ MVM_gc_root_temp_pop_n(tc, 2); \ } while (0) #define MVMROOT3(tc, obj_ref1, obj_ref2, obj_ref3, block) do {\ MVM_gc_root_temp_push(tc, (MVMCollectable **)&(obj_ref1)); \ MVM_gc_root_temp_push(tc, (MVMCollectable **)&(obj_ref2)); \ MVM_gc_root_temp_push(tc, (MVMCollectable **)&(obj_ref3)); \ block \ MVM_gc_root_temp_pop_n(tc, 3); \ } while (0) #define MVMROOT4(tc, obj_ref1, obj_ref2, obj_ref3, obj_ref4, block) do {\ MVM_gc_root_temp_push(tc, (MVMCollectable **)&(obj_ref1)); \ MVM_gc_root_temp_push(tc, (MVMCollectable **)&(obj_ref2)); \ MVM_gc_root_temp_push(tc, (MVMCollectable **)&(obj_ref3)); \ MVM_gc_root_temp_push(tc, (MVMCollectable **)&(obj_ref4)); \ block \ MVM_gc_root_temp_pop_n(tc, 4); \ } while (0) #define MVMROOT5(tc, obj_ref1, obj_ref2, obj_ref3, obj_ref4, obj_ref5, block) do {\ MVM_gc_root_temp_push(tc, (MVMCollectable **)&(obj_ref1)); \ MVM_gc_root_temp_push(tc, (MVMCollectable **)&(obj_ref2)); \ MVM_gc_root_temp_push(tc, (MVMCollectable **)&(obj_ref3)); \ MVM_gc_root_temp_push(tc, (MVMCollectable **)&(obj_ref4)); \ MVM_gc_root_temp_push(tc, (MVMCollectable **)&(obj_ref5)); \ block \ MVM_gc_root_temp_pop_n(tc, 5); \ } while (0) #define MVMROOT6(tc, obj_ref1, obj_ref2, obj_ref3, obj_ref4, obj_ref5, obj_ref6, block) do {\ MVM_gc_root_temp_push(tc, (MVMCollectable **)&(obj_ref1)); \ MVM_gc_root_temp_push(tc, (MVMCollectable **)&(obj_ref2)); \ MVM_gc_root_temp_push(tc, (MVMCollectable **)&(obj_ref3)); \ MVM_gc_root_temp_push(tc, (MVMCollectable **)&(obj_ref4)); \ MVM_gc_root_temp_push(tc, (MVMCollectable **)&(obj_ref5)); \ MVM_gc_root_temp_push(tc, (MVMCollectable **)&(obj_ref6)); \ block \ MVM_gc_root_temp_pop_n(tc, 6); \ } while (0) MoarVM-2018.03/src/gc/wb.c0000644000175000017510000000121013237701240015130 0ustar samanthasamantha#include /* Called when the write barrier macro detects we need to trigger * the write barrier. Arguments are the same as to the barrier macro * itself (updating is the object that we're about to write a pointer * into, and referenced is the object that the pointer references). * This barrier forces a re-scan of the object's contents during a GC * run - even a nursery only one - since somewhere it has references * to a nursery object. */ void MVM_gc_write_barrier_hit(MVMThreadContext *tc, MVMCollectable *update_root) { if (!(update_root->flags & MVM_CF_IN_GEN2_ROOT_LIST)) MVM_gc_root_gen2_add(tc, update_root); } MoarVM-2018.03/src/gc/wb.h0000644000175000017510000000272313237701240015147 0ustar samanthasamantha/* Functions for if the write barriers are hit. */ MVM_PUBLIC void MVM_gc_write_barrier_hit(MVMThreadContext *tc, MVMCollectable *update_root); /* Ensures that if a generation 2 object comes to hold a reference to a * nursery object, then the generation 2 object becomes an inter-generational * root. */ MVM_STATIC_INLINE void MVM_gc_write_barrier(MVMThreadContext *tc, MVMCollectable *update_root, const MVMCollectable *referenced) { if (((update_root->flags & MVM_CF_SECOND_GEN) && referenced && !(referenced->flags & MVM_CF_SECOND_GEN))) MVM_gc_write_barrier_hit(tc, update_root); } /* Does an assignment, but makes sure the write barrier MVM_WB is applied * first. Takes the root object, the address within it we're writing to, and * the thing we're writing. Note that update_addr is not involved in the * write barrier. */ #if MVM_GC_DEBUG #define MVM_ASSIGN_REF(tc, update_root, update_addr, referenced) \ { \ void *_r = referenced; \ if (_r && ((MVMCollectable *)_r)->owner == 0) \ MVM_panic(1, "Invalid assignment (maybe of heap frame to stack frame?)"); \ MVM_ASSERT_NOT_FROMSPACE(tc, _r); \ MVM_gc_write_barrier(tc, update_root, (MVMCollectable *)_r); \ update_addr = _r; \ } #else #define MVM_ASSIGN_REF(tc, update_root, update_addr, referenced) \ { \ void *_r = referenced; \ MVM_gc_write_barrier(tc, update_root, (MVMCollectable *)_r); \ update_addr = _r; \ } #endif MoarVM-2018.03/src/gc/worklist.c0000644000175000017510000000254513237701240016412 0ustar samanthasamantha#include "moar.h" /* Allocates a new GC worklist. */ MVMGCWorklist * MVM_gc_worklist_create(MVMThreadContext *tc, MVMuint8 include_gen2) { MVMGCWorklist *worklist = MVM_malloc(sizeof(MVMGCWorklist)); worklist->items = 0; worklist->alloc = MVM_GC_WORKLIST_START_SIZE; worklist->list = MVM_malloc(worklist->alloc * sizeof(MVMCollectable **)); worklist->include_gen2 = include_gen2; return worklist; } /* Adds an item to the worklist, expanding it if needed. */ void MVM_gc_worklist_add_slow(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMCollectable **item) { if (worklist->items == worklist->alloc) { worklist->alloc *= 2; worklist->list = MVM_realloc(worklist->list, worklist->alloc * sizeof(MVMCollectable **)); } worklist->list[worklist->items++] = item; } /* Pre-sizes the worklist in expectation a certain number of items is about to be * added. */ void MVM_gc_worklist_presize_for(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMint32 items) { if (worklist->items + items >= worklist->alloc) { worklist->alloc = worklist->items + items; worklist->list = MVM_realloc(worklist->list, worklist->alloc * sizeof(MVMCollectable **)); } } /* Free a worklist. */ void MVM_gc_worklist_destroy(MVMThreadContext *tc, MVMGCWorklist *worklist) { MVM_free(worklist->list); MVM_free(worklist); } MoarVM-2018.03/src/gc/worklist.h0000644000175000017510000001001013237701240016401 0ustar samanthasamantha/* A worklist holds the current set of pointers we have got in the queue * to scan. We hide away the details of it behind this abstraction since * the order in which we hand things back from it can have a big influence * on locality in the copied/compacted heap, and thus mutator performance. * * For the time being, we do the simplest possible thing: just make it a * stack. This actually has reasonable properties if we scan objects right * after they are copied/moved, since an object's children will then come * right after the object itself - unless they were copied/moved earlier. * But things aren't quite so rosy for deeply nested data structures, where * two siblings may thus end up far apart. Lots of stuff in the literature * on these issues, but for now this is probably less bad than some of the * other options. */ struct MVMGCWorklist { /* The worklist itself. An array of addresses which hold pointers to * collectables (yes, two levels of indirection, since we need to * update addresses in copying/moving algorithms.) */ MVMCollectable ***list; /* The number of items on the worklist. */ MVMuint32 items; /* The number of items the work list is allocated to hold. */ MVMuint32 alloc; /* Whether we should include gen2 entries. */ MVMuint8 include_gen2; }; /* Some macros for doing stuff fast with worklists, defined to look like * functions since perhaps they become them in the future if needed. */ #if MVM_GC_DEBUG #define MVM_gc_worklist_add(tc, worklist, item) \ do { \ MVMCollectable **item_to_add = (MVMCollectable **)(item);\ if (*item_to_add) { \ if ((*item_to_add)->owner == 0) \ MVM_panic(1, "Zeroed owner in item added to GC worklist"); \ if ((*item_to_add)->owner > tc->instance->next_user_thread_id) \ MVM_panic(1, "Invalid owner in item added to GC worklist"); \ if ((*item_to_add)->flags & MVM_CF_FRAME && !((MVMFrame *)(*item_to_add))->static_info) \ MVM_panic(1, "Frame with NULL static_info added to worklist"); \ else if ((*item_to_add)->flags & MVM_CF_STABLE == 0 && !STABLE(*item_to_add)) \ MVM_panic(1, "NULL STable in item added to GC worklist"); \ if ((char *)*item_to_add >= (char *)tc->nursery_alloc && \ (char *)*item_to_add < (char *)tc->nursery_alloc_limit) \ MVM_panic(1, "Adding pointer %p to past fromspace to GC worklist", \ *item_to_add); \ } \ if (*item_to_add && (worklist->include_gen2 || !((*item_to_add)->flags & MVM_CF_SECOND_GEN))) { \ if (worklist->items == worklist->alloc) \ MVM_gc_worklist_add_slow(tc, worklist, item_to_add); \ else \ worklist->list[worklist->items++] = item_to_add; \ } \ } while (0) #else #define MVM_gc_worklist_add(tc, worklist, item) \ do { \ MVMCollectable **item_to_add = (MVMCollectable **)(item);\ if (*item_to_add && (worklist->include_gen2 || !((*item_to_add)->flags & MVM_CF_SECOND_GEN))) { \ if (worklist->items == worklist->alloc) \ MVM_gc_worklist_add_slow(tc, worklist, item_to_add); \ else \ worklist->list[worklist->items++] = item_to_add; \ } \ } while (0) #endif #define MVM_gc_worklist_get(tc, worklist) \ (worklist->items ? \ worklist->list[--worklist->items] : \ NULL) /* Various functions for worklist manipulation. */ MVMGCWorklist * MVM_gc_worklist_create(MVMThreadContext *tc, MVMuint8 include_gen2); MVM_PUBLIC void MVM_gc_worklist_add_slow(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMCollectable **item); void MVM_gc_worklist_presize_for(MVMThreadContext *tc, MVMGCWorklist *worklist, MVMint32 items); void MVM_gc_worklist_destroy(MVMThreadContext *tc, MVMGCWorklist *worklist); /* The number of pointers we assume the list may need to hold initially; * it will be resized as needed. */ #define MVM_GC_WORKLIST_START_SIZE 256 MoarVM-2018.03/src/gcc_diag.h0000644000175000017510000000144013237701240015661 0ustar samanthasamantha/* GCC diagnostics control macros courtesy of: * http://dbp-consulting.com/tutorials/SuppressingGCCWarnings.html */ #if ((__GNUC__ * 100) + __GNUC_MINOR__) >= 402 # define GCC_DIAG_STR(s) #s # define GCC_DIAG_JOINSTR(x,y) GCC_DIAG_STR(x ## y) # define GCC_DIAG_DO_PRAGMA(x) _Pragma (#x) # define GCC_DIAG_PRAGMA(x) GCC_DIAG_DO_PRAGMA(GCC diagnostic x) # if ((__GNUC__ * 100) + __GNUC_MINOR__) >= 406 # define GCC_DIAG_OFF(x) GCC_DIAG_PRAGMA(push) \ GCC_DIAG_PRAGMA(ignored GCC_DIAG_JOINSTR(-W,x)) # define GCC_DIAG_ON(x) GCC_DIAG_PRAGMA(pop) # else # define GCC_DIAG_OFF(x) GCC_DIAG_PRAGMA(ignored GCC_DIAG_JOINSTR(-W,x)) # define GCC_DIAG_ON(x) GCC_DIAG_PRAGMA(warning GCC_DIAG_JOINSTR(-W,x)) # endif #else # define GCC_DIAG_OFF(x) # define GCC_DIAG_ON(x) #endif MoarVM-2018.03/src/gen/IGNOREME0000644000175000017510000000000013237701113015657 0ustar samanthasamanthaMoarVM-2018.03/src/instrument/crossthreadwrite.c0000644000175000017510000002145013237701240021743 0ustar samanthasamantha#include "moar.h" /* Walk graph and insert write check instructions. */ static void prepend_ctw_check(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *before_ins, MVMSpeshOperand check_reg, MVMint16 guilty) { MVMSpeshIns *ctw_ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); ctw_ins->info = MVM_op_get_op(MVM_OP_ctw_check); ctw_ins->operands = MVM_spesh_alloc(tc, g, 2 * sizeof(MVMSpeshOperand)); ctw_ins->operands[0] = check_reg; ctw_ins->operands[1].lit_i16 = guilty; MVM_spesh_manipulate_insert_ins(tc, bb, before_ins->prev, ctw_ins); } static void instrument_graph(MVMThreadContext *tc, MVMSpeshGraph *g) { MVMSpeshBB *bb = g->entry->linear_next; while (bb) { MVMSpeshIns *ins = bb->first_ins; while (ins) { switch (ins->info->opcode) { case MVM_OP_rebless: prepend_ctw_check(tc, g, bb, ins, ins->operands[0], MVM_CTW_REBLESS); case MVM_OP_bindattr_i: case MVM_OP_bindattr_n: case MVM_OP_bindattr_s: case MVM_OP_bindattr_o: case MVM_OP_bindattrs_i: case MVM_OP_bindattrs_n: case MVM_OP_bindattrs_s: case MVM_OP_bindattrs_o: prepend_ctw_check(tc, g, bb, ins, ins->operands[0], MVM_CTW_BIND_ATTR); break; case MVM_OP_bindpos_i: case MVM_OP_bindpos_n: case MVM_OP_bindpos_s: case MVM_OP_bindpos_o: prepend_ctw_check(tc, g, bb, ins, ins->operands[0], MVM_CTW_BIND_POS); break; case MVM_OP_push_i: case MVM_OP_push_n: case MVM_OP_push_s: case MVM_OP_push_o: prepend_ctw_check(tc, g, bb, ins, ins->operands[0], MVM_CTW_PUSH); break; case MVM_OP_pop_i: case MVM_OP_pop_n: case MVM_OP_pop_s: case MVM_OP_pop_o: prepend_ctw_check(tc, g, bb, ins, ins->operands[1], MVM_CTW_POP); break; case MVM_OP_shift_i: case MVM_OP_shift_n: case MVM_OP_shift_s: case MVM_OP_shift_o: prepend_ctw_check(tc, g, bb, ins, ins->operands[1], MVM_CTW_SHIFT); break; case MVM_OP_unshift_i: case MVM_OP_unshift_n: case MVM_OP_unshift_s: case MVM_OP_unshift_o: prepend_ctw_check(tc, g, bb, ins, ins->operands[0], MVM_CTW_UNSHIFT); break; case MVM_OP_splice: prepend_ctw_check(tc, g, bb, ins, ins->operands[0], MVM_CTW_SPLICE); break; case MVM_OP_bindkey_i: case MVM_OP_bindkey_n: case MVM_OP_bindkey_s: case MVM_OP_bindkey_o: prepend_ctw_check(tc, g, bb, ins, ins->operands[0], MVM_CTW_BIND_KEY); break; case MVM_OP_deletekey: prepend_ctw_check(tc, g, bb, ins, ins->operands[0], MVM_CTW_DELETE_KEY); break; case MVM_OP_assign: case MVM_OP_assignunchecked: case MVM_OP_assign_i: case MVM_OP_assign_n: case MVM_OP_assign_s: prepend_ctw_check(tc, g, bb, ins, ins->operands[0], MVM_CTW_ASSIGN); break; case MVM_OP_bindpos2d_i: case MVM_OP_bindpos2d_n: case MVM_OP_bindpos2d_s: case MVM_OP_bindpos2d_o: case MVM_OP_bindpos3d_i: case MVM_OP_bindpos3d_n: case MVM_OP_bindpos3d_s: case MVM_OP_bindpos3d_o: case MVM_OP_bindposnd_i: case MVM_OP_bindposnd_n: case MVM_OP_bindposnd_s: case MVM_OP_bindposnd_o: prepend_ctw_check(tc, g, bb, ins, ins->operands[0], MVM_CTW_BIND_POS); break; } ins = ins->next; } bb = bb->linear_next; } } /* Adds instrumented version of the unspecialized bytecode. */ static void add_instrumentation(MVMThreadContext *tc, MVMStaticFrame *sf) { MVMSpeshCode *sc; MVMStaticFrameInstrumentation *ins; MVMSpeshGraph *sg = MVM_spesh_graph_create(tc, sf, 1, 0); instrument_graph(tc, sg); sc = MVM_spesh_codegen(tc, sg); ins = MVM_calloc(1, sizeof(MVMStaticFrameInstrumentation)); ins->instrumented_bytecode = sc->bytecode; ins->instrumented_handlers = sc->handlers; ins->instrumented_bytecode_size = sc->bytecode_size; ins->uninstrumented_bytecode = sf->body.bytecode; ins->uninstrumented_handlers = sf->body.handlers; ins->uninstrumented_bytecode_size = sf->body.bytecode_size; sf->body.instrumentation = ins; MVM_spesh_graph_destroy(tc, sg); MVM_free(sc); } /* Instruments code with detection and reporting of cross-thread writes. */ void MVM_cross_thread_write_instrument(MVMThreadContext *tc, MVMStaticFrame *sf) { if (!sf->body.instrumentation || sf->body.bytecode != sf->body.instrumentation->instrumented_bytecode) { /* Handle main, non-specialized, bytecode. */ if (!sf->body.instrumentation) add_instrumentation(tc, sf); sf->body.bytecode = sf->body.instrumentation->instrumented_bytecode; sf->body.handlers = sf->body.instrumentation->instrumented_handlers; sf->body.bytecode_size = sf->body.instrumentation->instrumented_bytecode_size; /* Throw away any argument guard so we'll never resolve prior * specializations again. */ MVM_spesh_arg_guard_discard(tc, sf); } } /* Filter out some special cases to reduce noise. */ static MVMint64 filtered_out(MVMThreadContext *tc, MVMObject *written) { /* If we're holding locks, exclude by default (unless we were asked to * also include these). */ if (tc->num_locks && !tc->instance->cross_thread_write_logging_include_locked) return 1; /* Operations on a concurrent queue are fine 'cus it's concurrent. */ if (REPR(written)->ID == MVM_REPR_ID_ConcBlockingQueue) return 1; /* Write on object from event loop thread is usually shift of invokable. */ if (tc->instance->event_loop_thread) if (written->header.owner == tc->instance->event_loop_thread->thread_id) return 1; /* Filter out writes to Sub and Method, since these are almost always just * multi-dispatch caches. */ if (strncmp( MVM_6model_get_stable_debug_name(tc, written->st), "Method", 6) == 0) return 1; if (strncmp( MVM_6model_get_stable_debug_name(tc, written->st), "Sub", 3) == 0) return 1; /* Otherwise, may be relevant. */ return 0; } /* Squeal if the target of the write wasn't allocated by us. */ void MVM_cross_thread_write_check(MVMThreadContext *tc, MVMObject *written, MVMint16 guilty) { if (written->header.owner != tc->thread_id && !filtered_out(tc, written)) { char *guilty_desc = "did something to"; switch (guilty) { case MVM_CTW_BIND_ATTR: guilty_desc = "bound to an attribute of"; break; case MVM_CTW_BIND_POS: guilty_desc = "bound to an array slot of"; break; case MVM_CTW_PUSH: guilty_desc = "pushed to"; break; case MVM_CTW_POP: guilty_desc = "popped"; break; case MVM_CTW_SHIFT: guilty_desc = "shifted"; break; case MVM_CTW_UNSHIFT: guilty_desc = "unshifted to"; break; case MVM_CTW_SPLICE: guilty_desc = "spliced"; break; case MVM_CTW_BIND_KEY: guilty_desc = "bound to a hash key of"; break; case MVM_CTW_DELETE_KEY: guilty_desc = "deleted a hash key of"; break; case MVM_CTW_ASSIGN: guilty_desc = "assigned to"; break; case MVM_CTW_REBLESS: guilty_desc = "reblessed"; break; } uv_mutex_lock(&(tc->instance->mutex_cross_thread_write_logging)); fprintf(stderr, "Thread %d %s an object (%s) allocated by thread %d\n", tc->thread_id, guilty_desc, MVM_6model_get_debug_name(tc, written), written->header.owner); MVM_dump_backtrace(tc); fprintf(stderr, "\n"); uv_mutex_unlock(&(tc->instance->mutex_cross_thread_write_logging)); } } MoarVM-2018.03/src/instrument/crossthreadwrite.h0000644000175000017510000000117613237701240021753 0ustar samanthasamanthavoid MVM_cross_thread_write_instrument(MVMThreadContext *tc, MVMStaticFrame *static_frame); void MVM_cross_thread_write_check(MVMThreadContext *tc, MVMObject *written, MVMint16 guilty); /* Mutating operations one thread may do on an object it didn't create. */ #define MVM_CTW_BIND_ATTR 1 #define MVM_CTW_BIND_POS 2 #define MVM_CTW_PUSH 3 #define MVM_CTW_POP 4 #define MVM_CTW_SHIFT 5 #define MVM_CTW_UNSHIFT 6 #define MVM_CTW_SPLICE 7 #define MVM_CTW_BIND_KEY 8 #define MVM_CTW_DELETE_KEY 9 #define MVM_CTW_ASSIGN 10 #define MVM_CTW_REBLESS 11 MoarVM-2018.03/src/instrument/line_coverage.c0000644000175000017510000003041713252330426021155 0ustar samanthasamantha#include "moar.h" #ifdef _WIN32 #define snprintf _snprintf #endif static void instrument_graph_with_breakpoints(MVMThreadContext *tc, MVMSpeshGraph *g) { MVMSpeshBB *bb = g->entry->linear_next; MVMuint16 array_slot = 0; MVMint32 last_line_number = -2; MVMint32 last_filename = -1; char *filename_buf = NULL; while (bb) { MVMSpeshIns *ins = bb->first_ins; MVMSpeshIns *breakpoint_ins; MVMBytecodeAnnotation *bbba = MVM_bytecode_resolve_annotation(tc, &g->sf->body, bb->initial_pc); MVMint64 line_number = -1; MVMint64 filename_string_index = -1; MVMuint32 file_bp_idx; if (bbba) { line_number = bbba->line_number; filename_string_index = bbba->filename_string_heap_index; MVM_free(bbba); } else { line_number = -1; bb = bb->linear_next; continue; } /* skip PHI instructions, to make sure PHI only occur uninterrupted after start-of-bb */ while (ins && ins->info->opcode == MVM_SSA_PHI) { ins = ins->next; } if (!ins) ins = bb->last_ins; /* Jumplists require the target BB to start in the goto op. * We must not break this, or we cause the interpreter to derail */ if (bb->last_ins->info->opcode == MVM_OP_jumplist) { MVMint16 to_skip = bb->num_succ; for (; to_skip > 0; to_skip--) { bb = bb->linear_next; } continue; } if (line_number >= 0) { breakpoint_ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); breakpoint_ins->info = MVM_op_get_op(MVM_OP_breakpoint); breakpoint_ins->operands = MVM_spesh_alloc(tc, g, 2 * sizeof(MVMSpeshOperand)); if (last_filename != filename_string_index) { if (filename_buf) MVM_free(filename_buf); filename_buf = MVM_string_utf8_encode_C_string(tc, MVM_cu_string(tc, g->sf->body.cu, filename_string_index)); } MVM_debugserver_register_line(tc, filename_buf, strlen(filename_buf), line_number, &file_bp_idx); breakpoint_ins->operands[0].lit_i32 = file_bp_idx; breakpoint_ins->operands[1].lit_i32 = line_number; last_filename = filename_string_index; MVM_spesh_manipulate_insert_ins(tc, bb, ins->prev, breakpoint_ins); } /* Now go through instructions to see if any are annotated with a * precise filename/lineno as well. */ while (ins) { MVMSpeshAnn *ann = ins->annotations; while (ann) { if (ann->type == MVM_SPESH_ANN_LINENO) { /* We are very likely to have one instruction here that has * the same annotation as the bb itself. We skip that one.*/ if (ann->data.lineno.line_number == line_number && ann->data.lineno.filename_string_index == filename_string_index) { break; } line_number = ann->data.lineno.line_number; filename_string_index = ann->data.lineno.filename_string_index; breakpoint_ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); breakpoint_ins->info = MVM_op_get_op(MVM_OP_breakpoint); breakpoint_ins->operands = MVM_spesh_alloc(tc, g, 2 * sizeof(MVMSpeshOperand)); if (last_filename != filename_string_index) { if (filename_buf) MVM_free(filename_buf); filename_buf = MVM_string_utf8_encode_C_string(tc, MVM_cu_string(tc, g->sf->body.cu, filename_string_index)); } MVM_debugserver_register_line(tc, filename_buf, strlen(filename_buf), line_number, &file_bp_idx); breakpoint_ins->operands[0].lit_i32 = file_bp_idx; breakpoint_ins->operands[1].lit_i32 = ann->data.lineno.line_number; /* XXX insert breakpoint op here, too, maybe? */ break; } ann = ann->next; } ins = ins->next; } bb = bb->linear_next; } if (filename_buf) MVM_free(filename_buf); } static void instrument_graph(MVMThreadContext *tc, MVMSpeshGraph *g) { MVMSpeshBB *bb = g->entry->linear_next; MVMuint16 array_slot = 0; MVMint32 last_line_number = -2; MVMint32 last_filename = -1; MVMuint16 allocd_slots = g->num_bbs * 2; char *line_report_store = MVM_calloc(allocd_slots, sizeof(char)); /* Since we don't know the right size for the line report store * up front, we will have to realloc it along the way. After that * we havee to fix up the arguments to the coverage log instructions */ MVMuint32 fixup_alloc = g->num_bbs * 2; MVMuint32 fixup_elems = 0; MVMuint32 fixup_idx; /* for iterating over the fixup array */ MVMSpeshIns **to_fixup = MVM_malloc(fixup_alloc * sizeof(MVMSpeshIns*)); while (bb) { MVMSpeshIns *ins = bb->first_ins; MVMSpeshIns *log_ins; MVMBytecodeAnnotation *bbba = MVM_bytecode_resolve_annotation(tc, &g->sf->body, bb->initial_pc); MVMint64 line_number; MVMint64 filename_string_index; if (bbba) { line_number = bbba->line_number; filename_string_index = bbba->filename_string_heap_index; MVM_free(bbba); } else { line_number = -1; bb = bb->linear_next; continue; } /* skip PHI instructions, to make sure PHI only occur uninterrupted after start-of-bb */ while (ins && ins->info->opcode == MVM_SSA_PHI) { ins = ins->next; } if (!ins) ins = bb->last_ins; /* Jumplists require the target BB to start in the goto op. * We must not break this, or we cause the interpreter to derail */ if (bb->last_ins->info->opcode == MVM_OP_jumplist) { MVMint16 to_skip = bb->num_succ; for (; to_skip > 0; to_skip--) { bb = bb->linear_next; } continue; } log_ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); log_ins->info = MVM_op_get_op(MVM_OP_coverage_log); log_ins->operands = MVM_spesh_alloc(tc, g, 4 * sizeof(MVMSpeshOperand)); log_ins->operands[0].lit_str_idx = filename_string_index; log_ins->operands[1].lit_i32 = line_number; if (last_line_number == line_number && last_filename == filename_string_index) { /* Consecutive BBs with the same line number and filename should * share one "already reported" slot. */ log_ins->operands[2].lit_i32 = array_slot; } else { log_ins->operands[2].lit_i32 = array_slot++; last_line_number = line_number; last_filename = filename_string_index; if (array_slot == allocd_slots) { allocd_slots *= 2; line_report_store = MVM_realloc(line_report_store, sizeof(char) * allocd_slots); } } to_fixup[fixup_elems++] = log_ins; if (fixup_elems == fixup_alloc) { fixup_alloc *= 2; to_fixup = MVM_realloc(to_fixup, sizeof(MVMSpeshIns*) * fixup_alloc); } MVM_spesh_manipulate_insert_ins(tc, bb, ins, log_ins); /* Now go through instructions to see if any are annotated with a * precise filename/lineno as well. */ while (ins) { MVMSpeshAnn *ann = ins->annotations; while (ann) { if (ann->type == MVM_SPESH_ANN_LINENO) { /* We are very likely to have one instruction here that has * the same annotation as the bb itself. We skip that one.*/ if (ann->data.lineno.line_number == line_number && ann->data.lineno.filename_string_index == filename_string_index) { break; } log_ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); log_ins->info = MVM_op_get_op(MVM_OP_coverage_log); log_ins->operands = MVM_spesh_alloc(tc, g, 4 * sizeof(MVMSpeshOperand)); log_ins->operands[0].lit_str_idx = ann->data.lineno.filename_string_index; log_ins->operands[1].lit_i32 = ann->data.lineno.line_number; log_ins->operands[2].lit_i32 = array_slot++; if (array_slot == allocd_slots) { allocd_slots *= 2; line_report_store = MVM_realloc(line_report_store, sizeof(char) * allocd_slots); } to_fixup[fixup_elems++] = log_ins; if (fixup_elems == fixup_alloc) { fixup_alloc *= 2; to_fixup = MVM_realloc(to_fixup, sizeof(MVMSpeshIns*) * fixup_alloc); } break; } ann = ann->next; } ins = ins->next; } bb = bb->linear_next; } line_report_store = MVM_realloc(line_report_store, sizeof(char) * (array_slot + 1)); for (fixup_idx = 0; fixup_idx < fixup_elems; fixup_idx++) { MVMSpeshIns *ins = to_fixup[fixup_idx]; ins->operands[3].lit_i64 = (MVMint64)line_report_store; } if (array_slot == 0) { MVM_free(line_report_store); } } /* Adds instrumented version of the unspecialized bytecode. */ static void add_instrumentation(MVMThreadContext *tc, MVMStaticFrame *sf, MVMuint8 want_coverage) { MVMSpeshCode *sc; MVMStaticFrameInstrumentation *ins; MVMSpeshGraph *sg = MVM_spesh_graph_create(tc, sf, 1, 0); if (want_coverage) instrument_graph(tc, sg); else instrument_graph_with_breakpoints(tc, sg); sc = MVM_spesh_codegen(tc, sg); ins = MVM_calloc(1, sizeof(MVMStaticFrameInstrumentation)); ins->instrumented_bytecode = sc->bytecode; ins->instrumented_handlers = sc->handlers; ins->instrumented_bytecode_size = sc->bytecode_size; ins->uninstrumented_bytecode = sf->body.bytecode; ins->uninstrumented_handlers = sf->body.handlers; ins->uninstrumented_bytecode_size = sf->body.bytecode_size; sf->body.instrumentation = ins; MVM_spesh_graph_destroy(tc, sg); MVM_free(sc); } /* Instruments code with per-line logging of code coverage */ static void line_numbers_instrument(MVMThreadContext *tc, MVMStaticFrame *sf, MVMuint8 want_coverage) { if (!sf->body.instrumentation || sf->body.bytecode != sf->body.instrumentation->instrumented_bytecode) { /* Handle main, non-specialized, bytecode. */ if (!sf->body.instrumentation) add_instrumentation(tc, sf, want_coverage); sf->body.bytecode = sf->body.instrumentation->instrumented_bytecode; sf->body.handlers = sf->body.instrumentation->instrumented_handlers; sf->body.bytecode_size = sf->body.instrumentation->instrumented_bytecode_size; /* Throw away any argument guard so we'll never resolve prior * specializations again. */ MVM_spesh_arg_guard_discard(tc, sf); } } /* Instruments code with per-line logging of code coverage */ void MVM_line_coverage_instrument(MVMThreadContext *tc, MVMStaticFrame *sf) { line_numbers_instrument(tc, sf, 1); } /* Instruments code with a breakpoint check instruction af every line number change */ void MVM_breakpoint_instrument(MVMThreadContext *tc, MVMStaticFrame *sf) { line_numbers_instrument(tc, sf, 0); } void MVM_line_coverage_report(MVMThreadContext *tc, MVMString *filename, MVMuint32 line_number, MVMuint16 cache_slot, char *cache) { if (tc->instance->coverage_control == 2 || (!tc->instance->coverage_control && cache[cache_slot] == 0)) { char *encoded_filename; char composed_line[256]; size_t length; cache[cache_slot] = 1; encoded_filename = MVM_string_utf8_encode_C_string(tc, filename); if ((length = snprintf(composed_line, 255, "HIT %s %d\n", encoded_filename, line_number)) > 0) { fputs(composed_line, tc->instance->coverage_log_fh); } MVM_free(encoded_filename); } } MoarVM-2018.03/src/instrument/line_coverage.h0000644000175000017510000000046013252330426021155 0ustar samanthasamanthavoid MVM_line_coverage_instrument(MVMThreadContext *tc, MVMStaticFrame *static_frame); void MVM_line_coverage_report(MVMThreadContext *tc, MVMString *filename, MVMuint32 line_number, MVMuint16 cache_slot, char *cache); void MVM_breakpoint_instrument(MVMThreadContext *tc, MVMStaticFrame *static_frame); MoarVM-2018.03/src/io/asyncsocket.c0000644000175000017510000007646413242626641017122 0ustar samanthasamantha#include "moar.h" /* Data that we keep for an asynchronous socket handle. */ typedef struct { /* The libuv handle to the socket. */ uv_stream_t *handle; } MVMIOAsyncSocketData; /* Info we convey about a read task. */ typedef struct { MVMOSHandle *handle; MVMObject *buf_type; int seq_number; MVMThreadContext *tc; int work_idx; } ReadInfo; /* Allocates a buffer of the suggested size. */ static void on_alloc(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf) { size_t size = suggested_size > 0 ? suggested_size : 4; buf->base = MVM_malloc(size); buf->len = size; } /* Callback used to simply free memory on close. */ static void free_on_close_cb(uv_handle_t *handle) { MVM_free(handle); } /* Read handler. */ static void on_read(uv_stream_t *handle, ssize_t nread, const uv_buf_t *buf) { ReadInfo *ri = (ReadInfo *)handle->data; MVMThreadContext *tc = ri->tc; MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = MVM_io_eventloop_get_active_work(tc, ri->work_idx); MVM_repr_push_o(tc, arr, t->body.schedulee); if (nread >= 0) { MVMROOT2(tc, t, arr, { MVMArray *res_buf; /* Push the sequence number. */ MVMObject *seq_boxed = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, ri->seq_number++); MVM_repr_push_o(tc, arr, seq_boxed); /* Produce a buffer and push it. */ res_buf = (MVMArray *)MVM_repr_alloc_init(tc, ri->buf_type); res_buf->body.slots.i8 = (MVMint8 *)buf->base; res_buf->body.start = 0; res_buf->body.ssize = buf->len; res_buf->body.elems = nread; MVM_repr_push_o(tc, arr, (MVMObject *)res_buf); /* Finally, no error. */ MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); }); } else if (nread == UV_EOF) { MVMROOT2(tc, t, arr, { MVMObject *final = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, ri->seq_number); MVM_repr_push_o(tc, arr, final); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); }); if (buf->base) MVM_free(buf->base); uv_read_stop(handle); MVM_io_eventloop_remove_active_work(tc, &(ri->work_idx)); } else { MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVMROOT2(tc, t, arr, { MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, uv_strerror(nread)); MVMObject *msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); MVM_repr_push_o(tc, arr, msg_box); }); if (buf->base) MVM_free(buf->base); uv_read_stop(handle); MVM_io_eventloop_remove_active_work(tc, &(ri->work_idx)); } MVM_repr_push_o(tc, t->body.queue, arr); } /* Does setup work for setting up asynchronous reads. */ static void read_setup(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { MVMIOAsyncSocketData *handle_data; ReadInfo *ri; int r; /* Ensure not closed. */ ri = (ReadInfo *)data; handle_data = (MVMIOAsyncSocketData *)ri->handle->body.data; if (!handle_data->handle || uv_is_closing((uv_handle_t *)handle_data->handle)) { /* Closed, so immediately send done. */ MVMAsyncTask *t = (MVMAsyncTask *)async_task; MVMROOT(tc, t, { MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVM_repr_push_o(tc, arr, t->body.schedulee); MVMROOT(tc, arr, { MVMObject *final = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, ri->seq_number); MVM_repr_push_o(tc, arr, final); }); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVM_repr_push_o(tc, t->body.queue, arr); }); return; } /* Add to work in progress. */ ri->tc = tc; ri->work_idx = MVM_io_eventloop_add_active_work(tc, async_task); /* Start reading the stream. */ handle_data->handle->data = data; if ((r = uv_read_start(handle_data->handle, on_alloc, on_read)) < 0) { /* Error; need to notify. */ MVMROOT(tc, async_task, { MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = (MVMAsyncTask *)async_task; MVM_repr_push_o(tc, arr, t->body.schedulee); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVMROOT(tc, arr, { MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, uv_strerror(r)); MVMObject *msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); MVM_repr_push_o(tc, arr, msg_box); }); MVM_repr_push_o(tc, t->body.queue, arr); }); MVM_io_eventloop_remove_active_work(tc, &(ri->work_idx)); } } /* Stops reading. */ static void read_cancel(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { ReadInfo *ri = (ReadInfo *)data; if (ri->work_idx >= 0) { MVMIOAsyncSocketData *handle_data = (MVMIOAsyncSocketData *)ri->handle->body.data; if (handle_data->handle && !uv_is_closing((uv_handle_t *)handle_data->handle)) uv_read_stop(handle_data->handle); MVM_io_eventloop_remove_active_work(tc, &(ri->work_idx)); } } /* Marks objects for a read task. */ static void read_gc_mark(MVMThreadContext *tc, void *data, MVMGCWorklist *worklist) { ReadInfo *ri = (ReadInfo *)data; MVM_gc_worklist_add(tc, worklist, &ri->buf_type); MVM_gc_worklist_add(tc, worklist, &ri->handle); } /* Frees info for a read task. */ static void read_gc_free(MVMThreadContext *tc, MVMObject *t, void *data) { if (data) MVM_free(data); } /* Operations table for async read task. */ static const MVMAsyncTaskOps read_op_table = { read_setup, NULL, read_cancel, read_gc_mark, read_gc_free }; static MVMAsyncTask * read_bytes(MVMThreadContext *tc, MVMOSHandle *h, MVMObject *queue, MVMObject *schedulee, MVMObject *buf_type, MVMObject *async_type) { MVMAsyncTask *task; ReadInfo *ri; /* Validate REPRs. */ if (REPR(queue)->ID != MVM_REPR_ID_ConcBlockingQueue) MVM_exception_throw_adhoc(tc, "asyncreadbytes target queue must have ConcBlockingQueue REPR (got %s)", MVM_6model_get_stable_debug_name(tc, queue->st)); if (REPR(async_type)->ID != MVM_REPR_ID_MVMAsyncTask) MVM_exception_throw_adhoc(tc, "asyncreadbytes result type must have REPR AsyncTask"); if (REPR(buf_type)->ID == MVM_REPR_ID_VMArray) { MVMint32 slot_type = ((MVMArrayREPRData *)STABLE(buf_type)->REPR_data)->slot_type; if (slot_type != MVM_ARRAY_U8 && slot_type != MVM_ARRAY_I8) MVM_exception_throw_adhoc(tc, "asyncreadbytes buffer type must be an array of uint8 or int8"); } else { MVM_exception_throw_adhoc(tc, "asyncreadbytes buffer type must be an array"); } /* Create async task handle. */ MVMROOT4(tc, queue, schedulee, h, buf_type, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, async_type); }); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.queue, queue); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.schedulee, schedulee); task->body.ops = &read_op_table; ri = MVM_calloc(1, sizeof(ReadInfo)); MVM_ASSIGN_REF(tc, &(task->common.header), ri->buf_type, buf_type); MVM_ASSIGN_REF(tc, &(task->common.header), ri->handle, h); task->body.data = ri; /* Hand the task off to the event loop. */ MVMROOT(tc, task, { MVM_io_eventloop_queue_work(tc, (MVMObject *)task); }); return task; } /* Info we convey about a write task. */ typedef struct { MVMOSHandle *handle; MVMObject *buf_data; uv_write_t *req; uv_buf_t buf; MVMThreadContext *tc; int work_idx; } WriteInfo; /* Completion handler for an asynchronous write. */ static void on_write(uv_write_t *req, int status) { WriteInfo *wi = (WriteInfo *)req->data; MVMThreadContext *tc = wi->tc; MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = MVM_io_eventloop_get_active_work(tc, wi->work_idx); MVM_repr_push_o(tc, arr, t->body.schedulee); if (status >= 0) { MVMROOT2(tc, arr, t, { MVMObject *bytes_box = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, wi->buf.len); MVM_repr_push_o(tc, arr, bytes_box); }); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); } else { MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); MVMROOT2(tc, arr, t, { MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, uv_strerror(status)); MVMObject *msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); MVM_repr_push_o(tc, arr, msg_box); }); } MVM_repr_push_o(tc, t->body.queue, arr); MVM_free(wi->req); MVM_io_eventloop_remove_active_work(tc, &(wi->work_idx)); } /* Does setup work for an asynchronous write. */ static void write_setup(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { MVMIOAsyncSocketData *handle_data; MVMArray *buffer; WriteInfo *wi; char *output; int output_size, r; /* Ensure not closed. */ wi = (WriteInfo *)data; handle_data = (MVMIOAsyncSocketData *)wi->handle->body.data; if (!handle_data->handle || uv_is_closing((uv_handle_t *)handle_data->handle)) { MVMROOT(tc, async_task, { MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = (MVMAsyncTask *)async_task; MVM_repr_push_o(tc, arr, t->body.schedulee); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); MVMROOT(tc, arr, { MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "Cannot write to a closed socket"); MVMObject *msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); MVM_repr_push_o(tc, arr, msg_box); }); MVM_repr_push_o(tc, t->body.queue, arr); }); return; } /* Add to work in progress. */ wi->tc = tc; wi->work_idx = MVM_io_eventloop_add_active_work(tc, async_task); /* Extract buf data. */ buffer = (MVMArray *)wi->buf_data; output = (char *)(buffer->body.slots.i8 + buffer->body.start); output_size = (int)buffer->body.elems; /* Create and initialize write request. */ wi->req = MVM_malloc(sizeof(uv_write_t)); wi->buf = uv_buf_init(output, output_size); wi->req->data = data; if ((r = uv_write(wi->req, handle_data->handle, &(wi->buf), 1, on_write)) < 0) { /* Error; need to notify. */ MVMROOT(tc, async_task, { MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = (MVMAsyncTask *)async_task; MVM_repr_push_o(tc, arr, t->body.schedulee); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); MVMROOT(tc, arr, { MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, uv_strerror(r)); MVMObject *msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); MVM_repr_push_o(tc, arr, msg_box); }); MVM_repr_push_o(tc, t->body.queue, arr); }); /* Cleanup handle. */ MVM_free(wi->req); wi->req = NULL; MVM_io_eventloop_remove_active_work(tc, &(wi->work_idx)); } } /* Marks objects for a write task. */ static void write_gc_mark(MVMThreadContext *tc, void *data, MVMGCWorklist *worklist) { WriteInfo *wi = (WriteInfo *)data; MVM_gc_worklist_add(tc, worklist, &wi->handle); MVM_gc_worklist_add(tc, worklist, &wi->buf_data); } /* Frees info for a write task. */ static void write_gc_free(MVMThreadContext *tc, MVMObject *t, void *data) { if (data) MVM_free(data); } /* Operations table for async write task. */ static const MVMAsyncTaskOps write_op_table = { write_setup, NULL, NULL, write_gc_mark, write_gc_free }; static MVMAsyncTask * write_bytes(MVMThreadContext *tc, MVMOSHandle *h, MVMObject *queue, MVMObject *schedulee, MVMObject *buffer, MVMObject *async_type) { MVMAsyncTask *task; WriteInfo *wi; /* Validate REPRs. */ if (REPR(queue)->ID != MVM_REPR_ID_ConcBlockingQueue) MVM_exception_throw_adhoc(tc, "asyncwritebytes target queue must have ConcBlockingQueue REPR"); if (REPR(async_type)->ID != MVM_REPR_ID_MVMAsyncTask) MVM_exception_throw_adhoc(tc, "asyncwritebytes result type must have REPR AsyncTask"); if (!IS_CONCRETE(buffer) || REPR(buffer)->ID != MVM_REPR_ID_VMArray) MVM_exception_throw_adhoc(tc, "asyncwritebytes requires a native array to read from"); if (((MVMArrayREPRData *)STABLE(buffer)->REPR_data)->slot_type != MVM_ARRAY_U8 && ((MVMArrayREPRData *)STABLE(buffer)->REPR_data)->slot_type != MVM_ARRAY_I8) MVM_exception_throw_adhoc(tc, "asyncwritebytes requires a native array of uint8 or int8"); /* Create async task handle. */ MVMROOT4(tc, queue, schedulee, h, buffer, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, async_type); }); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.queue, queue); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.schedulee, schedulee); task->body.ops = &write_op_table; wi = MVM_calloc(1, sizeof(WriteInfo)); MVM_ASSIGN_REF(tc, &(task->common.header), wi->handle, h); MVM_ASSIGN_REF(tc, &(task->common.header), wi->buf_data, buffer); task->body.data = wi; /* Hand the task off to the event loop. */ MVMROOT(tc, task, { MVM_io_eventloop_queue_work(tc, (MVMObject *)task); }); return task; } /* Info we convey about a socket close task. */ typedef struct { MVMOSHandle *handle; } CloseInfo; /* Does an asynchronous close (since it must run on the event loop). */ static void close_perform(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { CloseInfo *ci = (CloseInfo *)data; MVMIOAsyncSocketData *handle_data = (MVMIOAsyncSocketData *)ci->handle->body.data; uv_handle_t *handle = (uv_handle_t *)handle_data->handle; if (handle && !uv_is_closing(handle)) { handle_data->handle = NULL; uv_close(handle, free_on_close_cb); } } /* Marks objects for a close task. */ static void close_gc_mark(MVMThreadContext *tc, void *data, MVMGCWorklist *worklist) { CloseInfo *ci = (CloseInfo *)data; MVM_gc_worklist_add(tc, worklist, &ci->handle); } /* Frees info for a close task. */ static void close_gc_free(MVMThreadContext *tc, MVMObject *t, void *data) { if (data) MVM_free(data); } /* Operations table for async close task. */ static const MVMAsyncTaskOps close_op_table = { close_perform, NULL, NULL, close_gc_mark, close_gc_free }; static MVMint64 close_socket(MVMThreadContext *tc, MVMOSHandle *h) { MVMAsyncTask *task; CloseInfo *ci; MVMROOT(tc, h, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTAsync); }); task->body.ops = &close_op_table; ci = MVM_calloc(1, sizeof(CloseInfo)); MVM_ASSIGN_REF(tc, &(task->common.header), ci->handle, h); task->body.data = ci; MVM_io_eventloop_queue_work(tc, (MVMObject *)task); return 0; } /* IO ops table, populated with functions. */ static const MVMIOClosable closable = { close_socket }; static const MVMIOAsyncReadable async_readable = { read_bytes }; static const MVMIOAsyncWritable async_writable = { write_bytes }; static const MVMIOOps op_table = { &closable, NULL, NULL, &async_readable, &async_writable, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; static void push_name_and_port(MVMThreadContext *tc, struct sockaddr_storage *name, MVMObject *arr) { char addrstr[INET6_ADDRSTRLEN + 1]; /* XXX windows support kludge. 64 bit is much too big, but we'll * get the proper data from the struct anyway, however windows * decides to declare it. */ MVMuint64 port; MVMObject *host_o; MVMObject *port_o; switch (name->ss_family) { case AF_INET6: { uv_ip6_name((struct sockaddr_in6*)name, addrstr, INET6_ADDRSTRLEN + 1); port = ntohs(((struct sockaddr_in6*)name)->sin6_port); break; } case AF_INET: { uv_ip4_name((struct sockaddr_in*)name, addrstr, INET6_ADDRSTRLEN + 1); port = ntohs(((struct sockaddr_in*)name)->sin_port); break; } default: MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); return; break; } MVMROOT(tc, arr, { port_o = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, port); MVMROOT(tc, port_o, { host_o = (MVMObject *)MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, MVM_string_ascii_decode_nt(tc, tc->instance->VMString, addrstr)); }); }); MVM_repr_push_o(tc, arr, host_o); MVM_repr_push_o(tc, arr, port_o); } /* Info we convey about a connection attempt task. */ typedef struct { struct sockaddr *dest; uv_tcp_t *socket; uv_connect_t *connect; MVMThreadContext *tc; int work_idx; } ConnectInfo; /* When a connection takes place, need to send result. */ static void on_connect(uv_connect_t* req, int status) { ConnectInfo *ci = (ConnectInfo *)req->data; MVMThreadContext *tc = ci->tc; MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = MVM_io_eventloop_get_active_work(tc, ci->work_idx); MVM_repr_push_o(tc, arr, t->body.schedulee); if (status >= 0) { /* Allocate and set up handle. */ MVMROOT2(tc, arr, t, { MVMOSHandle *result = (MVMOSHandle *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTIO); MVMIOAsyncSocketData *data = MVM_calloc(1, sizeof(MVMIOAsyncSocketData)); data->handle = (uv_stream_t *)ci->socket; result->body.ops = &op_table; result->body.data = data; MVM_repr_push_o(tc, arr, (MVMObject *)result); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVMROOT(tc, result, { struct sockaddr_storage sockaddr; int name_len = sizeof(struct sockaddr_storage); uv_tcp_getpeername(ci->socket, (struct sockaddr *)&sockaddr, &name_len); push_name_and_port(tc, &sockaddr, arr); uv_tcp_getsockname(ci->socket, (struct sockaddr *)&sockaddr, &name_len); push_name_and_port(tc, &sockaddr, arr); }); }); } else { MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTIO); MVMROOT2(tc, arr, t, { MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, uv_strerror(status)); MVMObject *msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); MVM_repr_push_o(tc, arr, msg_box); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); }); } MVM_repr_push_o(tc, t->body.queue, arr); MVM_free(req); MVM_io_eventloop_remove_active_work(tc, &(ci->work_idx)); } /* Initilalize the connection on the event loop. */ static void connect_setup(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { int r; /* Add to work in progress. */ ConnectInfo *ci = (ConnectInfo *)data; ci->tc = tc; ci->work_idx = MVM_io_eventloop_add_active_work(tc, async_task); /* Create and initialize socket and connection. */ ci->socket = MVM_malloc(sizeof(uv_tcp_t)); ci->connect = MVM_malloc(sizeof(uv_connect_t)); ci->connect->data = data; if ((r = uv_tcp_init(loop, ci->socket)) < 0 || (r = uv_tcp_connect(ci->connect, ci->socket, ci->dest, on_connect)) < 0) { /* Error; need to notify. */ MVMROOT(tc, async_task, { MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = (MVMAsyncTask *)async_task; MVM_repr_push_o(tc, arr, t->body.schedulee); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTIO); MVMROOT(tc, arr, { MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, uv_strerror(r)); MVMObject *msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); MVM_repr_push_o(tc, arr, msg_box); }); MVM_repr_push_o(tc, t->body.queue, arr); }); /* Cleanup handles. */ MVM_free(ci->connect); ci->connect = NULL; uv_close((uv_handle_t *)ci->socket, free_on_close_cb); ci->socket = NULL; MVM_io_eventloop_remove_active_work(tc, &(ci->work_idx)); } } /* Frees info for a connection task. */ static void connect_gc_free(MVMThreadContext *tc, MVMObject *t, void *data) { if (data) { ConnectInfo *ci = (ConnectInfo *)data; if (ci->dest) MVM_free(ci->dest); MVM_free(ci); } } /* Operations table for async connect task. */ static const MVMAsyncTaskOps connect_op_table = { connect_setup, NULL, NULL, NULL, connect_gc_free }; /* Sets off an asynchronous socket connection. */ MVMObject * MVM_io_socket_connect_async(MVMThreadContext *tc, MVMObject *queue, MVMObject *schedulee, MVMString *host, MVMint64 port, MVMObject *async_type) { MVMAsyncTask *task; ConnectInfo *ci; /* Resolve hostname. (Could be done asynchronously too.) */ struct sockaddr *dest = MVM_io_resolve_host_name(tc, host, port); /* Validate REPRs. */ if (REPR(queue)->ID != MVM_REPR_ID_ConcBlockingQueue) MVM_exception_throw_adhoc(tc, "asyncconnect target queue must have ConcBlockingQueue REPR"); if (REPR(async_type)->ID != MVM_REPR_ID_MVMAsyncTask) MVM_exception_throw_adhoc(tc, "asyncconnect result type must have REPR AsyncTask"); /* Create async task handle. */ MVMROOT2(tc, queue, schedulee, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, async_type); }); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.queue, queue); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.schedulee, schedulee); task->body.ops = &connect_op_table; ci = MVM_calloc(1, sizeof(ConnectInfo)); ci->dest = dest; task->body.data = ci; /* Hand the task off to the event loop. */ MVMROOT(tc, task, { MVM_io_eventloop_queue_work(tc, (MVMObject *)task); }); return (MVMObject *)task; } /* Info we convey about a socket listen task. */ typedef struct { struct sockaddr *dest; uv_tcp_t *socket; MVMThreadContext *tc; int work_idx; int backlog; } ListenInfo; /* Handles an incoming connection. */ static void on_connection(uv_stream_t *server, int status) { ListenInfo *li = (ListenInfo *)server->data; MVMThreadContext *tc = li->tc; MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = MVM_io_eventloop_get_active_work(tc, li->work_idx); uv_tcp_t *client = MVM_malloc(sizeof(uv_tcp_t)); int r; uv_tcp_init(tc->loop, client); MVM_repr_push_o(tc, arr, t->body.schedulee); if ((r = uv_accept(server, (uv_stream_t *)client)) == 0) { /* Allocate and set up handle. */ MVMROOT2(tc, arr, t, { MVMOSHandle *result = (MVMOSHandle *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTIO); MVMIOAsyncSocketData *data = MVM_calloc(1, sizeof(MVMIOAsyncSocketData)); data->handle = (uv_stream_t *)client; result->body.ops = &op_table; result->body.data = data; MVM_repr_push_o(tc, arr, (MVMObject *)result); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVMROOT(tc, result, { struct sockaddr_storage sockaddr; int name_len = sizeof(struct sockaddr_storage); uv_tcp_getpeername(client, (struct sockaddr *)&sockaddr, &name_len); push_name_and_port(tc, &sockaddr, arr); uv_tcp_getsockname(client, (struct sockaddr *)&sockaddr, &name_len); push_name_and_port(tc, &sockaddr, arr); }); }); } else { uv_close((uv_handle_t*)client, NULL); MVM_free(client); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTIO); MVMROOT2(tc, arr, t, { MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, uv_strerror(r)); MVMObject *msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); MVM_repr_push_o(tc, arr, msg_box); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); }); } MVM_repr_push_o(tc, t->body.queue, arr); } /* Sets up a socket listener. */ static void listen_setup(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { int r; /* Add to work in progress. */ ListenInfo *li = (ListenInfo *)data; li->tc = tc; li->work_idx = MVM_io_eventloop_add_active_work(tc, async_task); /* Create and initialize socket and connection, and start listening. */ li->socket = MVM_malloc(sizeof(uv_tcp_t)); li->socket->data = data; if ((r = uv_tcp_init(loop, li->socket)) < 0 || (r = uv_tcp_bind(li->socket, li->dest, 0)) < 0 || (r = uv_listen((uv_stream_t *)li->socket, li->backlog, on_connection))) { /* Error; need to notify. */ MVMROOT(tc, async_task, { MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = (MVMAsyncTask *)async_task; MVM_repr_push_o(tc, arr, t->body.schedulee); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTIO); MVMROOT(tc, arr, { MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, uv_strerror(r)); MVMObject *msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); MVM_repr_push_o(tc, arr, msg_box); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); }); MVM_repr_push_o(tc, t->body.queue, arr); }); uv_close((uv_handle_t *)li->socket, free_on_close_cb); li->socket = NULL; MVM_io_eventloop_remove_active_work(tc, &(li->work_idx)); return; } } /* Stops listening. */ static void on_listen_cancelled(uv_handle_t *handle) { ListenInfo *li = (ListenInfo *)handle->data; MVMThreadContext *tc = li->tc; MVM_io_eventloop_send_cancellation_notification(tc, MVM_io_eventloop_get_active_work(tc, li->work_idx)); MVM_io_eventloop_remove_active_work(tc, &(li->work_idx)); } static void listen_cancel(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { ListenInfo *li = (ListenInfo *)data; if (li->socket) { uv_close((uv_handle_t *)li->socket, on_listen_cancelled); li->socket = NULL; } } /* Frees info for a listen task. */ static void listen_gc_free(MVMThreadContext *tc, MVMObject *t, void *data) { if (data) { ListenInfo *li = (ListenInfo *)data; if (li->dest) MVM_free(li->dest); MVM_free(li); } } /* Operations table for async listen task. */ static const MVMAsyncTaskOps listen_op_table = { listen_setup, NULL, listen_cancel, NULL, listen_gc_free }; /* Initiates an async socket listener. */ MVMObject * MVM_io_socket_listen_async(MVMThreadContext *tc, MVMObject *queue, MVMObject *schedulee, MVMString *host, MVMint64 port, MVMint32 backlog, MVMObject *async_type) { MVMAsyncTask *task; ListenInfo *li; /* Resolve hostname. (Could be done asynchronously too.) */ struct sockaddr *dest = MVM_io_resolve_host_name(tc, host, port); /* Validate REPRs. */ if (REPR(queue)->ID != MVM_REPR_ID_ConcBlockingQueue) MVM_exception_throw_adhoc(tc, "asynclisten target queue must have ConcBlockingQueue REPR"); if (REPR(async_type)->ID != MVM_REPR_ID_MVMAsyncTask) MVM_exception_throw_adhoc(tc, "asynclisten result type must have REPR AsyncTask"); /* Create async task handle. */ MVMROOT2(tc, queue, schedulee, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, async_type); }); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.queue, queue); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.schedulee, schedulee); task->body.ops = &listen_op_table; li = MVM_calloc(1, sizeof(ListenInfo)); li->dest = dest; li->backlog = backlog; task->body.data = li; /* Hand the task off to the event loop. */ MVMROOT(tc, task, { MVM_io_eventloop_queue_work(tc, (MVMObject *)task); }); return (MVMObject *)task; } MoarVM-2018.03/src/io/asyncsocket.h0000644000175000017510000000052513237701240017101 0ustar samanthasamanthaMVMObject * MVM_io_socket_connect_async(MVMThreadContext *tc, MVMObject *queue, MVMObject *schedulee, MVMString *host, MVMint64 port, MVMObject *async_type); MVMObject * MVM_io_socket_listen_async(MVMThreadContext *tc, MVMObject *queue, MVMObject *schedulee, MVMString *host, MVMint64 port, MVMint32 backlog, MVMObject *async_type); MoarVM-2018.03/src/io/asyncsocketudp.c0000644000175000017510000005303213250636753017621 0ustar samanthasamantha#include "moar.h" /* Number of bytes we accept per read. */ #define CHUNK_SIZE 65536 /* Data that we keep for an asynchronous UDP socket handle. */ typedef struct { /* The libuv handle to the socket. */ uv_udp_t *handle; } MVMIOAsyncUDPSocketData; /* Info we convey about a read task. */ typedef struct { MVMOSHandle *handle; MVMObject *buf_type; int seq_number; MVMThreadContext *tc; int work_idx; } ReadInfo; /* Allocates a buffer of the suggested size. */ static void on_alloc(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf) { size_t size = suggested_size > 0 ? suggested_size : 4; buf->base = MVM_malloc(size); buf->len = size; } /* Callback used to simply free memory on close. */ static void free_on_close_cb(uv_handle_t *handle) { MVM_free(handle); } /* XXX this is duplicated from asyncsocket.c; put it in some shared file */ static void push_name_and_port(MVMThreadContext *tc, struct sockaddr_storage *name, MVMObject *arr) { char addrstr[INET6_ADDRSTRLEN + 1]; /* XXX windows support kludge. 64 bit is much too big, but we'll * get the proper data from the struct anyway, however windows * decides to declare it. */ MVMuint64 port; MVMObject *host_o; MVMObject *port_o; if (name) { switch (name->ss_family) { case AF_INET6: { uv_ip6_name((struct sockaddr_in6*)name, addrstr, INET6_ADDRSTRLEN + 1); port = ntohs(((struct sockaddr_in6*)name)->sin6_port); break; } case AF_INET: { uv_ip4_name((struct sockaddr_in*)name, addrstr, INET6_ADDRSTRLEN + 1); port = ntohs(((struct sockaddr_in*)name)->sin_port); break; } default: MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); return; break; } MVMROOT(tc, arr, { port_o = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, port); MVMROOT(tc, port_o, { host_o = (MVMObject *)MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, MVM_string_ascii_decode_nt(tc, tc->instance->VMString, addrstr)); }); }); } else { host_o = tc->instance->boot_types.BOOTStr; port_o = tc->instance->boot_types.BOOTInt; } MVM_repr_push_o(tc, arr, host_o); MVM_repr_push_o(tc, arr, port_o); } /* Read handler. */ static void on_read(uv_udp_t *handle, ssize_t nread, const uv_buf_t *buf, const struct sockaddr *addr, unsigned flags) { ReadInfo *ri = (ReadInfo *)handle->data; MVMThreadContext *tc = ri->tc; MVMObject *arr; MVMAsyncTask *t; /* libuv will call on_read once after all datagram read operations * to "give us back a buffer". in that case, nread and addr are NULL. * This is an artifact of the underlying implementation and we shouldn't * pass it through to the user. */ if (nread == 0 && addr == NULL) return; arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); t = MVM_io_eventloop_get_active_work(tc, ri->work_idx); MVM_repr_push_o(tc, arr, t->body.schedulee); if (nread >= 0) { MVMROOT2(tc, t, arr, { MVMArray *res_buf; /* Push the sequence number. */ MVMObject *seq_boxed = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, ri->seq_number++); MVM_repr_push_o(tc, arr, seq_boxed); /* Produce a buffer and push it. */ res_buf = (MVMArray *)MVM_repr_alloc_init(tc, ri->buf_type); res_buf->body.slots.i8 = (MVMint8 *)buf->base; res_buf->body.start = 0; res_buf->body.ssize = buf->len; res_buf->body.elems = nread; MVM_repr_push_o(tc, arr, (MVMObject *)res_buf); /* next, no error. */ MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); /* and finally, address and port */ push_name_and_port(tc, (struct sockaddr_storage *)addr, arr); }); } else if (nread == UV_EOF) { MVMROOT2(tc, t, arr, { MVMObject *final = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, ri->seq_number); MVM_repr_push_o(tc, arr, final); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); }); if (buf->base) MVM_free(buf->base); uv_udp_recv_stop(handle); MVM_io_eventloop_remove_active_work(tc, &(ri->work_idx)); } else { MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVMROOT2(tc, t, arr, { MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, uv_strerror(nread)); MVMObject *msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); MVM_repr_push_o(tc, arr, msg_box); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); }); if (buf->base) MVM_free(buf->base); uv_udp_recv_stop(handle); MVM_io_eventloop_remove_active_work(tc, &(ri->work_idx)); } MVM_repr_push_o(tc, t->body.queue, arr); } /* Does setup work for setting up asynchronous reads. */ static void read_setup(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { MVMIOAsyncUDPSocketData *handle_data; int r; /* Add to work in progress. */ ReadInfo *ri = (ReadInfo *)data; ri->tc = tc; ri->work_idx = MVM_io_eventloop_add_active_work(tc, async_task); /* Start reading the stream. */ handle_data = (MVMIOAsyncUDPSocketData *)ri->handle->body.data; handle_data->handle->data = data; if ((r = uv_udp_recv_start(handle_data->handle, on_alloc, on_read)) < 0) { /* Error; need to notify. */ MVMROOT(tc, async_task, { MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = (MVMAsyncTask *)async_task; MVM_repr_push_o(tc, arr, t->body.schedulee); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVMROOT(tc, arr, { MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, uv_strerror(r)); MVMObject *msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); MVM_repr_push_o(tc, arr, msg_box); }); MVM_repr_push_o(tc, t->body.queue, arr); }); } } /* Marks objects for a read task. */ static void read_gc_mark(MVMThreadContext *tc, void *data, MVMGCWorklist *worklist) { ReadInfo *ri = (ReadInfo *)data; MVM_gc_worklist_add(tc, worklist, &ri->buf_type); MVM_gc_worklist_add(tc, worklist, &ri->handle); } /* Frees info for a read task. */ static void read_gc_free(MVMThreadContext *tc, MVMObject *t, void *data) { if (data) MVM_free(data); } /* Operations table for async read task. */ static const MVMAsyncTaskOps read_op_table = { read_setup, NULL, NULL, read_gc_mark, read_gc_free }; static MVMAsyncTask * read_bytes(MVMThreadContext *tc, MVMOSHandle *h, MVMObject *queue, MVMObject *schedulee, MVMObject *buf_type, MVMObject *async_type) { MVMAsyncTask *task; ReadInfo *ri; /* Validate REPRs. */ if (REPR(queue)->ID != MVM_REPR_ID_ConcBlockingQueue) MVM_exception_throw_adhoc(tc, "asyncreadbytes target queue must have ConcBlockingQueue REPR (got %s)", MVM_6model_get_stable_debug_name(tc, queue->st)); if (REPR(async_type)->ID != MVM_REPR_ID_MVMAsyncTask) MVM_exception_throw_adhoc(tc, "asyncreadbytes result type must have REPR AsyncTask"); if (REPR(buf_type)->ID == MVM_REPR_ID_VMArray) { MVMint32 slot_type = ((MVMArrayREPRData *)STABLE(buf_type)->REPR_data)->slot_type; if (slot_type != MVM_ARRAY_U8 && slot_type != MVM_ARRAY_I8) MVM_exception_throw_adhoc(tc, "asyncreadbytes buffer type must be an array of uint8 or int8"); } else { MVM_exception_throw_adhoc(tc, "asyncreadbytes buffer type must be an array"); } /* Create async task handle. */ MVMROOT4(tc, queue, schedulee, h, buf_type, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, async_type); }); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.queue, queue); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.schedulee, schedulee); task->body.ops = &read_op_table; ri = MVM_calloc(1, sizeof(ReadInfo)); MVM_ASSIGN_REF(tc, &(task->common.header), ri->buf_type, buf_type); MVM_ASSIGN_REF(tc, &(task->common.header), ri->handle, h); task->body.data = ri; /* Hand the task off to the event loop. */ MVMROOT(tc, task, { MVM_io_eventloop_queue_work(tc, (MVMObject *)task); }); return task; } /* Info we convey about a write task. */ typedef struct { MVMOSHandle *handle; MVMObject *buf_data; uv_udp_send_t *req; uv_buf_t buf; MVMThreadContext *tc; int work_idx; struct sockaddr *dest_addr; } WriteInfo; /* Completion handler for an asynchronous write. */ static void on_write(uv_udp_send_t *req, int status) { WriteInfo *wi = (WriteInfo *)req->data; MVMThreadContext *tc = wi->tc; MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = MVM_io_eventloop_get_active_work(tc, wi->work_idx); MVM_repr_push_o(tc, arr, t->body.schedulee); if (status >= 0) { MVMROOT2(tc, arr, t, { MVMObject *bytes_box = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, wi->buf.len); MVM_repr_push_o(tc, arr, bytes_box); }); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); } else { MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); MVMROOT2(tc, arr, t, { MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, uv_strerror(status)); MVMObject *msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); MVM_repr_push_o(tc, arr, msg_box); }); } MVM_repr_push_o(tc, t->body.queue, arr); MVM_free(wi->req); MVM_io_eventloop_remove_active_work(tc, &(wi->work_idx)); } /* Does setup work for an asynchronous write. */ static void write_setup(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { MVMIOAsyncUDPSocketData *handle_data; MVMArray *buffer; char *output; int output_size, r; /* Add to work in progress. */ WriteInfo *wi = (WriteInfo *)data; wi->tc = tc; wi->work_idx = MVM_io_eventloop_add_active_work(tc, async_task); /* Extract buf data. */ buffer = (MVMArray *)wi->buf_data; output = (char *)(buffer->body.slots.i8 + buffer->body.start); output_size = (int)buffer->body.elems; /* Create and initialize write request. */ wi->req = MVM_malloc(sizeof(uv_udp_send_t)); wi->buf = uv_buf_init(output, output_size); wi->req->data = data; handle_data = (MVMIOAsyncUDPSocketData *)wi->handle->body.data; if (uv_is_closing((uv_handle_t *)handle_data->handle)) MVM_exception_throw_adhoc(tc, "cannot write to a closed socket"); if ((r = uv_udp_send(wi->req, handle_data->handle, &(wi->buf), 1, wi->dest_addr, on_write)) < 0) { /* Error; need to notify. */ MVMROOT(tc, async_task, { MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = (MVMAsyncTask *)async_task; MVM_repr_push_o(tc, arr, t->body.schedulee); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); MVMROOT(tc, arr, { MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, uv_strerror(r)); MVMObject *msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); MVM_repr_push_o(tc, arr, msg_box); }); MVM_repr_push_o(tc, t->body.queue, arr); }); /* Cleanup handle. */ MVM_free(wi->req); wi->req = NULL; MVM_io_eventloop_remove_active_work(tc, &(wi->work_idx)); } } /* Marks objects for a write task. */ static void write_gc_mark(MVMThreadContext *tc, void *data, MVMGCWorklist *worklist) { WriteInfo *wi = (WriteInfo *)data; MVM_gc_worklist_add(tc, worklist, &wi->handle); MVM_gc_worklist_add(tc, worklist, &wi->buf_data); } /* Frees info for a write task. */ static void write_gc_free(MVMThreadContext *tc, MVMObject *t, void *data) { if (data) { WriteInfo *wi = (WriteInfo *)data; if (wi->dest_addr) MVM_free(wi->dest_addr); MVM_free(data); } } /* Operations table for async write task. */ static const MVMAsyncTaskOps write_op_table = { write_setup, NULL, NULL, write_gc_mark, write_gc_free }; static MVMAsyncTask * write_bytes_to(MVMThreadContext *tc, MVMOSHandle *h, MVMObject *queue, MVMObject *schedulee, MVMObject *buffer, MVMObject *async_type, MVMString *host, MVMint64 port) { MVMAsyncTask *task; WriteInfo *wi; struct sockaddr *dest_addr; /* Validate REPRs. */ if (REPR(queue)->ID != MVM_REPR_ID_ConcBlockingQueue) MVM_exception_throw_adhoc(tc, "asyncwritebytesto target queue must have ConcBlockingQueue REPR"); if (REPR(async_type)->ID != MVM_REPR_ID_MVMAsyncTask) MVM_exception_throw_adhoc(tc, "asyncwritebytesto result type must have REPR AsyncTask"); if (!IS_CONCRETE(buffer) || REPR(buffer)->ID != MVM_REPR_ID_VMArray) MVM_exception_throw_adhoc(tc, "asyncwritebytesto requires a native array to read from"); if (((MVMArrayREPRData *)STABLE(buffer)->REPR_data)->slot_type != MVM_ARRAY_U8 && ((MVMArrayREPRData *)STABLE(buffer)->REPR_data)->slot_type != MVM_ARRAY_I8) MVM_exception_throw_adhoc(tc, "asyncwritebytesto requires a native array of uint8 or int8"); /* Resolve destination. */ dest_addr = MVM_io_resolve_host_name(tc, host, port); /* Create async task handle. */ MVMROOT4(tc, queue, schedulee, h, buffer, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, async_type); }); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.queue, queue); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.schedulee, schedulee); task->body.ops = &write_op_table; wi = MVM_calloc(1, sizeof(WriteInfo)); MVM_ASSIGN_REF(tc, &(task->common.header), wi->handle, h); MVM_ASSIGN_REF(tc, &(task->common.header), wi->buf_data, buffer); wi->dest_addr = dest_addr; task->body.data = wi; /* Hand the task off to the event loop. */ MVMROOT(tc, task, { MVM_io_eventloop_queue_work(tc, (MVMObject *)task); }); return task; } /* Does an asynchronous close (since it must run on the event loop). */ static void close_perform(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { uv_handle_t *handle = (uv_handle_t *)data; if (uv_is_closing(handle)) MVM_exception_throw_adhoc(tc, "cannot close a closed socket"); uv_close(handle, free_on_close_cb); } /* Operations table for async close task. */ static const MVMAsyncTaskOps close_op_table = { close_perform, NULL, NULL, NULL, NULL }; static MVMint64 close_socket(MVMThreadContext *tc, MVMOSHandle *h) { MVMIOAsyncUDPSocketData *data = (MVMIOAsyncUDPSocketData *)h->body.data; MVMAsyncTask *task; MVMROOT(tc, h, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTAsync); }); task->body.ops = &close_op_table; task->body.data = data->handle; MVM_io_eventloop_queue_work(tc, (MVMObject *)task); return 0; } /* IO ops table, populated with functions. */ static const MVMIOClosable closable = { close_socket }; static const MVMIOAsyncReadable async_readable = { read_bytes }; static const MVMIOAsyncWritableTo async_writable_to = { write_bytes_to }; static const MVMIOOps op_table = { &closable, NULL, NULL, &async_readable, NULL, &async_writable_to, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; /* Info we convey about a socket setup task. */ typedef struct { struct sockaddr *bind_addr; MVMint64 flags; } SocketSetupInfo; /* Initilalize the UDP socket on the event loop. */ static void setup_setup(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { /* Set up the UDP handle. */ SocketSetupInfo *ssi = (SocketSetupInfo *)data; uv_udp_t *udp_handle = MVM_malloc(sizeof(uv_udp_t)); int r; if ((r = uv_udp_init(loop, udp_handle)) >= 0) { if (ssi->bind_addr) r = uv_udp_bind(udp_handle, ssi->bind_addr, 0); if (r >= 0 && (ssi->flags & 1)) r = uv_udp_set_broadcast(udp_handle, 1); } if (r >= 0) { /* UDP handle initialized; wrap it up in an I/O handle and send. */ MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = (MVMAsyncTask *)async_task; MVM_repr_push_o(tc, arr, t->body.schedulee); MVMROOT2(tc, arr, t, { MVMOSHandle *result = (MVMOSHandle *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTIO); MVMIOAsyncUDPSocketData *data = MVM_calloc(1, sizeof(MVMIOAsyncUDPSocketData)); data->handle = udp_handle; result->body.ops = &op_table; result->body.data = data; MVM_repr_push_o(tc, arr, (MVMObject *)result); }); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVM_repr_push_o(tc, t->body.queue, arr); } else { /* Something failed; need to notify. */ MVMROOT(tc, async_task, { MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = (MVMAsyncTask *)async_task; MVM_repr_push_o(tc, arr, t->body.schedulee); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTIO); MVMROOT2(tc, arr, t, { MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, uv_strerror(r)); MVMObject *msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); MVM_repr_push_o(tc, arr, msg_box); }); MVM_repr_push_o(tc, t->body.queue, arr); uv_close((uv_handle_t *)udp_handle, free_on_close_cb); }); } } /* Frees info for a connection task. */ static void setup_gc_free(MVMThreadContext *tc, MVMObject *t, void *data) { if (data) { SocketSetupInfo *ssi = (SocketSetupInfo *)data; if (ssi->bind_addr) MVM_free(ssi->bind_addr); MVM_free(ssi); } } /* Operations table for async connect task. */ static const MVMAsyncTaskOps setup_op_table = { setup_setup, NULL, NULL, NULL, setup_gc_free }; /* Creates a UDP socket and binds it to the specified host/port. */ MVMObject * MVM_io_socket_udp_async(MVMThreadContext *tc, MVMObject *queue, MVMObject *schedulee, MVMString *host, MVMint64 port, MVMint64 flags, MVMObject *async_type) { MVMAsyncTask *task; SocketSetupInfo *ssi; struct sockaddr *bind_addr = NULL; /* Validate REPRs. */ if (REPR(queue)->ID != MVM_REPR_ID_ConcBlockingQueue) MVM_exception_throw_adhoc(tc, "asyncudp target queue must have ConcBlockingQueue REPR"); if (REPR(async_type)->ID != MVM_REPR_ID_MVMAsyncTask) MVM_exception_throw_adhoc(tc, "asyncudp result type must have REPR AsyncTask"); /* Resolve hostname. (Could be done asynchronously too.) */ if (host && IS_CONCRETE(host)) bind_addr = MVM_io_resolve_host_name(tc, host, port); /* Create async task handle. */ MVMROOT2(tc, queue, schedulee, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, async_type); }); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.queue, queue); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.schedulee, schedulee); task->body.ops = &setup_op_table; ssi = MVM_calloc(1, sizeof(SocketSetupInfo)); ssi->bind_addr = bind_addr; ssi->flags = flags; task->body.data = ssi; /* Hand the task off to the event loop. */ MVMROOT(tc, task, { MVM_io_eventloop_queue_work(tc, (MVMObject *)task); }); return (MVMObject *)task; } MoarVM-2018.03/src/io/asyncsocketudp.h0000644000175000017510000000042613237701240017612 0ustar samanthasamanthaMVMObject * MVM_io_socket_udp_async(MVMThreadContext *tc, MVMObject *queue, MVMObject *schedulee, MVMString *host, MVMint64 port, MVMint64 flags, MVMObject *async_type); MoarVM-2018.03/src/io/dirops.c0000644000175000017510000002525313237701240016053 0ustar samanthasamantha#include "moar.h" #ifndef _WIN32 #include #endif #ifdef _WIN32 # define IS_SLASH(c) ((c) == L'\\' || (c) == L'/') #else # define IS_SLASH(c) ((c) == '/') #endif #ifdef _WIN32 static wchar_t * UTF8ToUnicode(char *str) { const int len = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0); wchar_t * const result = (wchar_t *)MVM_malloc(len * sizeof(wchar_t)); MultiByteToWideChar(CP_UTF8, 0, str, -1, result, len); return result; } static char * UnicodeToUTF8(const wchar_t *str) { const int len = WideCharToMultiByte(CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL); char * const result = (char *)MVM_malloc(len * sizeof(char)); WideCharToMultiByte(CP_UTF8, 0, str, -1, result, len, NULL, NULL); return result; } static int mkdir_p(MVMThreadContext *tc, wchar_t *pathname, MVMint64 mode) { wchar_t *p = pathname, ch; #else static int mkdir_p(MVMThreadContext *tc, char *pathname, MVMint64 mode) { char *p = pathname, ch; uv_fs_t req; #endif int created = 0; for (;; ++p) if (!*p || IS_SLASH(*p)) { ch = *p; *p = '\0'; #ifdef _WIN32 if (CreateDirectoryW(pathname, NULL)) { created = 1; } #else if (uv_fs_stat(tc->loop, &req, pathname, NULL) <= 0) { if (mkdir(pathname, mode) != -1) { created = 1; } } #endif if (!(*p = ch)) break; } if (!created) return -1; return 0; } /* Create a directory recursively. */ void MVM_dir_mkdir(MVMThreadContext *tc, MVMString *path, MVMint64 mode) { char * const pathname = MVM_string_utf8_c8_encode_C_string(tc, path); #ifdef _WIN32 /* Must using UTF8ToUnicode for supporting CJK Windows file name. */ wchar_t *wpathname = UTF8ToUnicode(pathname); int str_len = wcslen(wpathname); MVM_free(pathname); if (str_len > MAX_PATH) { wchar_t abs_dirname[4096]; /* 4096 should be enough for absolute path */ wchar_t *lpp_part; /* You cannot use the "\\?\" prefix with a relative path, * relative paths are always limited to a total of MAX_PATH characters. * see http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx */ if (!GetFullPathNameW(wpathname, 4096, abs_dirname, &lpp_part)) { MVM_free(wpathname); MVM_exception_throw_adhoc(tc, "Directory path is wrong: %d", GetLastError()); } MVM_free(wpathname); str_len = wcslen(abs_dirname); wpathname = (wchar_t *)MVM_malloc((str_len + 4) * sizeof(wchar_t)); wcscpy(wpathname, L"\\\\?\\"); wcscat(wpathname, abs_dirname); } if (mkdir_p(tc, wpathname, mode) == -1) { DWORD error = GetLastError(); if (error != ERROR_ALREADY_EXISTS) { MVM_free(wpathname); MVM_exception_throw_adhoc(tc, "Failed to mkdir: %d", error); } } MVM_free(wpathname); #else if (mkdir_p(tc, pathname, mode) == -1 && errno != EEXIST) { int mkdir_error = errno; MVM_free(pathname); MVM_exception_throw_adhoc(tc, "Failed to mkdir: %d", mkdir_error); } MVM_free(pathname); #endif } /* Remove a directory recursively. */ void MVM_dir_rmdir(MVMThreadContext *tc, MVMString *path) { char * const pathname = MVM_string_utf8_c8_encode_C_string(tc, path); uv_fs_t req; if(uv_fs_rmdir(tc->loop, &req, pathname, NULL) < 0 ) { MVM_free(pathname); MVM_exception_throw_adhoc(tc, "Failed to rmdir: %s", uv_strerror(req.result)); } MVM_free(pathname); } /* Get the current working directory. */ MVMString * MVM_dir_cwd(MVMThreadContext *tc) { #ifdef _WIN32 char path[MAX_PATH]; size_t max_path = MAX_PATH; int r; #else char path[PATH_MAX]; size_t max_path = PATH_MAX; int r; #endif if ((r = uv_cwd(path, (size_t *)&max_path)) < 0) { MVM_exception_throw_adhoc(tc, "Failed to determine cwd: %s", uv_strerror(r)); } return MVM_string_utf8_c8_decode(tc, tc->instance->VMString, path, strlen(path)); } int MVM_dir_chdir_C_string(MVMThreadContext *tc, const char *dirstring) { return uv_chdir(dirstring); } /* Change directory. */ void MVM_dir_chdir(MVMThreadContext *tc, MVMString *dir) { const char *dirstring = MVM_string_utf8_c8_encode_C_string(tc, dir); int chdir_error = MVM_dir_chdir_C_string(tc, dirstring); MVM_free((void*)dirstring); if (chdir_error) { MVM_exception_throw_adhoc(tc, "chdir failed: %s", uv_strerror(chdir_error)); } } /* Structure to keep track of directory iteration state. */ typedef struct { #ifdef _WIN32 wchar_t *dir_name; HANDLE dir_handle; #else DIR *dir_handle; #endif } MVMIODirIter; /* Frees data associated with the directory handle. */ static void gc_free(MVMThreadContext *tc, MVMObject *h, void *d) { MVMIODirIter *data = (MVMIODirIter *)d; if (data) { #ifdef _WIN32 if (data->dir_name) MVM_free(data->dir_name); if (data->dir_handle) FindClose(data->dir_handle); #else if (data->dir_handle) closedir(data->dir_handle); #endif MVM_free(data); } } /* Ops table for directory iterator; it all works off special ops, so no entries. */ static const MVMIOOps op_table = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, gc_free }; /* Open a filehandle, returning a handle. */ MVMObject * MVM_dir_open(MVMThreadContext *tc, MVMString *dirname) { MVMOSHandle * const result = (MVMOSHandle *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTIO); MVMIODirIter * const data = MVM_calloc(1, sizeof(MVMIODirIter)); #ifdef _WIN32 char *name; int str_len; wchar_t *wname; wchar_t *dir_name; name = MVM_string_utf8_c8_encode_C_string(tc, dirname); wname = UTF8ToUnicode(name); MVM_free(name); str_len = wcslen(wname); if (str_len > MAX_PATH - 2) { // the length of later appended '\*' is 2 wchar_t abs_dirname[4096]; /* 4096 should be enough for absolute path */ wchar_t *lpp_part; /* You cannot use the "\\?\" prefix with a relative path, * relative paths are always limited to a total of MAX_PATH characters. * see http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx */ if (!GetFullPathNameW(wname, 4096, abs_dirname, &lpp_part)) { MVM_free(wname); MVM_exception_throw_adhoc(tc, "Directory path is wrong: %d", GetLastError()); } MVM_free(wname); str_len = wcslen(abs_dirname); dir_name = (wchar_t *)MVM_malloc((str_len + 7) * sizeof(wchar_t)); wcscpy(dir_name, L"\\\\?\\"); wcscat(dir_name, abs_dirname); } else { dir_name = (wchar_t *)MVM_malloc((str_len + 3) * sizeof(wchar_t)); wcscpy(dir_name, wname); MVM_free(wname); } wcscat(dir_name, L"\\*"); /* Three characters are for the "\*" plus NULL appended. * see http://msdn.microsoft.com/en-us/library/windows/desktop/aa365200%28v=vs.85%29.aspx */ data->dir_name = dir_name; data->dir_handle = INVALID_HANDLE_VALUE; #else char * const dir_name = MVM_string_utf8_c8_encode_C_string(tc, dirname); DIR * const dir_handle = opendir(dir_name); int opendir_error = errno; MVM_free(dir_name); if (!dir_handle) MVM_exception_throw_adhoc(tc, "Failed to open dir: %d", opendir_error); data->dir_handle = dir_handle; #endif result->body.ops = &op_table; result->body.data = data; return (MVMObject *)result; } /* Casts to a handle, checking it's a directory handle along the way. */ static MVMOSHandle * get_dirhandle(MVMThreadContext *tc, MVMObject *oshandle, const char *msg) { MVMOSHandle *handle = (MVMOSHandle *)oshandle; if (REPR(oshandle)->ID != MVM_REPR_ID_MVMOSHandle) MVM_exception_throw_adhoc(tc, "%s requires an object with REPR MVMOSHandle (got %s with REPR %s)", msg, MVM_6model_get_debug_name(tc, (MVMObject *)handle), REPR(handle)->name); if (handle->body.ops != &op_table) MVM_exception_throw_adhoc(tc, "%s got incorrect kind of handle", msg); return handle; } /* Reads a directory entry from a directory. */ MVMString * MVM_dir_read(MVMThreadContext *tc, MVMObject *oshandle) { MVMOSHandle *handle = get_dirhandle(tc, oshandle, "readdir"); MVMIODirIter *data = (MVMIODirIter *)handle->body.data; #ifdef _WIN32 MVMString *result; TCHAR dir[MAX_PATH]; WIN32_FIND_DATAW ffd; char *dir_str; if (data->dir_handle == INVALID_HANDLE_VALUE) { HANDLE hFind = FindFirstFileW(data->dir_name, &ffd); if (hFind == INVALID_HANDLE_VALUE) { MVM_exception_throw_adhoc(tc, "read from dirhandle failed: %d", GetLastError()); } data->dir_handle = hFind; dir_str = UnicodeToUTF8(ffd.cFileName); result = MVM_string_utf8_c8_decode(tc, tc->instance->VMString, dir_str, strlen(dir_str)); MVM_free(dir_str); return result; } else if (FindNextFileW(data->dir_handle, &ffd) != 0) { dir_str = UnicodeToUTF8(ffd.cFileName); result = MVM_string_decode(tc, tc->instance->VMString, dir_str, strlen(dir_str), MVM_encoding_type_utf8_c8); MVM_free(dir_str); return result; } else { return tc->instance->str_consts.empty; } #else struct dirent *entry; errno = 0; /* must reset errno so we won't check old errno */ if (!data->dir_handle) { MVM_exception_throw_adhoc(tc, "Cannot read a closed dir handle."); } entry = readdir(data->dir_handle); if (errno == 0) { MVMString *ret = (entry == NULL) ? tc->instance->str_consts.empty : MVM_string_decode(tc, tc->instance->VMString, entry->d_name, strlen(entry->d_name), MVM_encoding_type_utf8_c8); return ret; } MVM_exception_throw_adhoc(tc, "Failed to read dirhandle: %d", errno); #endif } void MVM_dir_close(MVMThreadContext *tc, MVMObject *oshandle) { MVMOSHandle *handle = get_dirhandle(tc, oshandle, "readdir"); MVMIODirIter *data = (MVMIODirIter *)handle->body.data; #ifdef _WIN32 if (data->dir_name) { MVM_free(data->dir_name); data->dir_name = NULL; } if (!FindClose(data->dir_handle)) MVM_exception_throw_adhoc(tc, "Failed to close dirhandle: %d", GetLastError()); data->dir_handle = NULL; #else if (closedir(data->dir_handle) == -1) MVM_exception_throw_adhoc(tc, "Failed to close dirhandle: %d", errno); data->dir_handle = NULL; #endif } MoarVM-2018.03/src/io/dirops.h0000644000175000017510000000077713237701240016064 0ustar samanthasamanthavoid MVM_dir_mkdir(MVMThreadContext *tc, MVMString *path, MVMint64 mode); void MVM_dir_rmdir(MVMThreadContext *tc, MVMString *path); MVMObject * MVM_dir_open(MVMThreadContext *tc, MVMString *dirname); MVMString * MVM_dir_read(MVMThreadContext *tc, MVMObject *oshandle); void MVM_dir_close(MVMThreadContext *tc, MVMObject *oshandle); MVMString * MVM_dir_cwd(MVMThreadContext *tc); int MVM_dir_chdir_C_string(MVMThreadContext *tc, const char *dirstring); void MVM_dir_chdir(MVMThreadContext *tc, MVMString *dir); MoarVM-2018.03/src/io/eventloop.c0000644000175000017510000002662513242626641016601 0ustar samanthasamantha#include "moar.h" /* Asynchronous I/O, timers, file system notifications and signal handlers * have their callbacks processed by this event loop. Its job is mostly to * fire off work, receive the callbacks, and put stuff into the concurrent * work queue of some scheduler or other. It's backed by a thread that is * started in the usual way, but never actually ends up in interpreter; * instead, it enters a libuv event loop "forever", until program exit. * * Work is sent to the event loop by */ /* Sets up an async task to be done on the loop. */ static void setup_work(MVMThreadContext *tc) { MVMConcBlockingQueue *queue = (MVMConcBlockingQueue *)tc->instance->event_loop_todo_queue; MVMObject *task_obj; MVMROOT(tc, queue, { while (!MVM_is_null(tc, task_obj = MVM_concblockingqueue_poll(tc, queue))) { MVMAsyncTask *task = (MVMAsyncTask *)task_obj; MVM_ASSERT_NOT_FROMSPACE(tc, task); if (task->body.state == MVM_ASYNC_TASK_STATE_NEW) { MVMROOT(tc, task, { task->body.ops->setup(tc, tc->loop, task_obj, task->body.data); task->body.state = MVM_ASYNC_TASK_STATE_SETUP; }); } } }); } /* Performs an async emit permit grant on the loop. */ static void permit_work(MVMThreadContext *tc) { MVMConcBlockingQueue *queue = (MVMConcBlockingQueue *)tc->instance->event_loop_permit_queue; MVMObject *task_arr; MVMROOT(tc, queue, { while (!MVM_is_null(tc, task_arr = MVM_concblockingqueue_poll(tc, queue))) { MVMObject *task_obj = MVM_repr_at_pos_o(tc, task_arr, 0); MVMAsyncTask *task = (MVMAsyncTask *)task_obj; MVM_ASSERT_NOT_FROMSPACE(tc, task); if (task->body.ops->permit) { MVMint64 channel = MVM_repr_get_int(tc, MVM_repr_at_pos_o(tc, task_arr, 1)); MVMint64 permit = MVM_repr_get_int(tc, MVM_repr_at_pos_o(tc, task_arr, 2)); task->body.ops->permit(tc, tc->loop, task_obj, task->body.data, channel, permit); } } }); } /* Performs an async cancellation on the loop. */ static void cancel_work(MVMThreadContext *tc) { MVMConcBlockingQueue *queue = (MVMConcBlockingQueue *)tc->instance->event_loop_cancel_queue; MVMObject *task_obj; MVMROOT(tc, queue, { while (!MVM_is_null(tc, task_obj = MVM_concblockingqueue_poll(tc, queue))) { MVMAsyncTask *task = (MVMAsyncTask *)task_obj; MVM_ASSERT_NOT_FROMSPACE(tc, task); if (task->body.state == MVM_ASYNC_TASK_STATE_SETUP) { MVMROOT(tc, task, { if (task->body.ops->cancel) task->body.ops->cancel(tc, tc->loop, task_obj, task->body.data); }); } task->body.state = MVM_ASYNC_TASK_STATE_CANCELLED; } }); } /* Fired whenever we were signalled that there is a new task or a new * cancellation for the event loop to process. */ static void async_handler(uv_async_t *handle) { MVMThreadContext *tc = (MVMThreadContext *)handle->data; GC_SYNC_POINT(tc); setup_work(tc); permit_work(tc); cancel_work(tc); } /* Enters the event loop. */ static void enter_loop(MVMThreadContext *tc, MVMCallsite *callsite, MVMRegister *args) { uv_async_t *async; /* Set up async handler so we can be woken up when there's new tasks. */ async = MVM_malloc(sizeof(uv_async_t)); if (uv_async_init(tc->loop, async, async_handler) != 0) MVM_panic(1, "Unable to initialize async wake-up handle for event loop"); async->data = tc; tc->instance->event_loop_wakeup = async; /* Signal that the event loop is ready for processing. */ uv_sem_post(&(tc->instance->sem_event_loop_started)); /* Enter event loop; should never leave it. */ uv_run(tc->loop, UV_RUN_DEFAULT); MVM_panic(1, "Supposedly unending event loop thread ended"); } /* Sees if we have an event loop processing thread set up already, and * sets it up if not. */ static uv_loop_t *get_or_vivify_loop(MVMThreadContext *tc) { MVMInstance *instance = tc->instance; if (!instance->event_loop_thread) { /* Grab starting mutex and ensure we didn't lose the race. */ MVM_telemetry_timestamp(tc, "hoping to start an event loop thread"); MVM_gc_mark_thread_blocked(tc); uv_mutex_lock(&instance->mutex_event_loop_start); MVM_gc_mark_thread_unblocked(tc); if (!instance->event_loop_thread) { MVMObject *thread, *loop_runner; int r; unsigned int interval_id; interval_id = MVM_telemetry_interval_start(tc, "creating the event loop thread"); /* Create various bits of state the async event loop thread needs. */ instance->event_loop_todo_queue = MVM_repr_alloc_init(tc, instance->boot_types.BOOTQueue); instance->event_loop_permit_queue = MVM_repr_alloc_init(tc, instance->boot_types.BOOTQueue); instance->event_loop_cancel_queue = MVM_repr_alloc_init(tc, instance->boot_types.BOOTQueue); instance->event_loop_active = MVM_repr_alloc_init(tc, instance->boot_types.BOOTArray); /* We need to wait until we know the event loop has started; we'll * use a semaphore for this purpose. */ if ((r = uv_sem_init(&(instance->sem_event_loop_started), 0)) < 0) { uv_mutex_unlock(&instance->mutex_event_loop_start); MVM_exception_throw_adhoc(tc, "Failed to initialize event loop start semaphore: %s", uv_strerror(r)); } /* Start the event loop thread, which will call a C function that * sits in the uv loop, never leaving. */ loop_runner = MVM_repr_alloc_init(tc, instance->boot_types.BOOTCCode); ((MVMCFunction *)loop_runner)->body.func = enter_loop; thread = MVM_thread_new(tc, loop_runner, 1); MVMROOT(tc, thread, { MVM_thread_run(tc, thread); /* Block until we know it's fully started and initialized. */ MVM_gc_mark_thread_blocked(tc); uv_sem_wait(&(instance->sem_event_loop_started)); MVM_gc_mark_thread_unblocked(tc); uv_sem_destroy(&(instance->sem_event_loop_started)); /* Make the started event loop thread visible to others. */ instance->event_loop_thread = ((MVMThread *)thread)->body.tc; }); MVM_telemetry_interval_stop(tc, interval_id, "created the event loop thread"); } uv_mutex_unlock(&instance->mutex_event_loop_start); } return instance->event_loop_thread->loop; } /* Adds a work item into the event loop work queue. */ void MVM_io_eventloop_queue_work(MVMThreadContext *tc, MVMObject *work) { MVMROOT(tc, work, { get_or_vivify_loop(tc); MVM_repr_push_o(tc, tc->instance->event_loop_todo_queue, work); uv_async_send(tc->instance->event_loop_wakeup); }); } /* Permits an asynchronous task to emit more events. This is used to provide a * back-pressure mechanism. */ void MVM_io_eventloop_permit(MVMThreadContext *tc, MVMObject *task_obj, MVMint64 channel, MVMint64 permits) { if (REPR(task_obj)->ID == MVM_REPR_ID_MVMOSHandle) task_obj = MVM_io_get_async_task_handle(tc, task_obj); if (REPR(task_obj)->ID == MVM_REPR_ID_MVMAsyncTask) { MVMROOT(tc, task_obj, { MVMObject *channel_box = NULL; MVMObject *permits_box = NULL; MVMObject *arr = NULL; MVMROOT3(tc, channel_box, permits_box, arr, { channel_box = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, channel); permits_box = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, permits); arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVM_repr_push_o(tc, arr, task_obj); MVM_repr_push_o(tc, arr, channel_box); MVM_repr_push_o(tc, arr, permits_box); get_or_vivify_loop(tc); MVM_repr_push_o(tc, tc->instance->event_loop_permit_queue, arr); uv_async_send(tc->instance->event_loop_wakeup); }); }); } else { MVM_exception_throw_adhoc(tc, "Can only permit an AsyncTask handle"); } } /* Cancels a piece of async work. */ void MVM_io_eventloop_cancel_work(MVMThreadContext *tc, MVMObject *task_obj, MVMObject *notify_queue, MVMObject *notify_schedulee) { if (REPR(task_obj)->ID == MVM_REPR_ID_MVMAsyncTask) { if (notify_queue && notify_schedulee) { MVMAsyncTask *task = (MVMAsyncTask *)task_obj; MVM_ASSIGN_REF(tc, &(task_obj->header), task->body.cancel_notify_queue, notify_queue); MVM_ASSIGN_REF(tc, &(task_obj->header), task->body.cancel_notify_schedulee, notify_schedulee); } MVMROOT(tc, task_obj, { get_or_vivify_loop(tc); MVM_repr_push_o(tc, tc->instance->event_loop_cancel_queue, task_obj); uv_async_send(tc->instance->event_loop_wakeup); }); } else { MVM_exception_throw_adhoc(tc, "Can only cancel an AsyncTask handle"); } } /* Sends a task cancellation notification if requested for the specified task. */ void MVM_io_eventloop_send_cancellation_notification(MVMThreadContext *tc, MVMAsyncTask *task) { MVMObject *notify_queue = task->body.cancel_notify_queue; MVMObject *notify_schedulee = task->body.cancel_notify_schedulee; if (notify_queue && notify_schedulee) MVM_repr_push_o(tc, notify_queue, notify_schedulee); } /* Adds a work item to the active async task set. */ int MVM_io_eventloop_add_active_work(MVMThreadContext *tc, MVMObject *async_task) { int work_idx = MVM_repr_elems(tc, tc->instance->event_loop_active); MVM_ASSERT_NOT_FROMSPACE(tc, async_task); MVM_repr_push_o(tc, tc->instance->event_loop_active, async_task); return work_idx; } /* Gets an active work item from the active work eventloop. */ MVMAsyncTask * MVM_io_eventloop_get_active_work(MVMThreadContext *tc, int work_idx) { if (work_idx >= 0 && work_idx < MVM_repr_elems(tc, tc->instance->event_loop_active)) { MVMObject *task_obj = MVM_repr_at_pos_o(tc, tc->instance->event_loop_active, work_idx); if (REPR(task_obj)->ID != MVM_REPR_ID_MVMAsyncTask) MVM_panic(1, "non-AsyncTask fetched from eventloop active work list"); MVM_ASSERT_NOT_FROMSPACE(tc, task_obj); return (MVMAsyncTask *)task_obj; } else { MVM_panic(1, "use of invalid eventloop work item index %d", work_idx); } } /* Removes an active work index from the active work list, enabling any * memory associated with it to be collected. Replaces the work index with -1 * so that any future use of the task will be a failed lookup. */ void MVM_io_eventloop_remove_active_work(MVMThreadContext *tc, int *work_idx_to_clear) { int work_idx = *work_idx_to_clear; if (work_idx >= 0 && work_idx < MVM_repr_elems(tc, tc->instance->event_loop_active)) { *work_idx_to_clear = -1; MVM_repr_bind_pos_o(tc, tc->instance->event_loop_active, work_idx, tc->instance->VMNull); /* TODO: start to re-use the indices */ } else { MVM_panic(1, "cannot remove invalid eventloop work item index %d", work_idx); } } MoarVM-2018.03/src/io/eventloop.h0000644000175000017510000000277413237701240016576 0ustar samanthasamantha/* Operations table for a certain type of asynchronous task that can be run on * the event loop. */ struct MVMAsyncTaskOps { /* How to set work up on the event loop. */ void (*setup) (MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data); /* How to grant emit permits, if possible. */ void (*permit) (MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data, MVMint64 channel, MVMint64 permits); /* How to cancel, if possible. */ void (*cancel) (MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data); /* How to mark the task's data, if needed. */ void (*gc_mark) (MVMThreadContext *tc, void *data, MVMGCWorklist *worklist); /* How to free the task's data, if needed. */ void (*gc_free) (MVMThreadContext *tc, MVMObject *t, void *data); }; void MVM_io_eventloop_queue_work(MVMThreadContext *tc, MVMObject *work); void MVM_io_eventloop_permit(MVMThreadContext *tc, MVMObject *task_obj, MVMint64 channel, MVMint64 permits); void MVM_io_eventloop_cancel_work(MVMThreadContext *tc, MVMObject *task_obj, MVMObject *notify_queue, MVMObject *notify_schedulee); void MVM_io_eventloop_send_cancellation_notification(MVMThreadContext *tc, MVMAsyncTask *task_obj); int MVM_io_eventloop_add_active_work(MVMThreadContext *tc, MVMObject *async_task); MVMAsyncTask * MVM_io_eventloop_get_active_work(MVMThreadContext *tc, int work_idx); void MVM_io_eventloop_remove_active_work(MVMThreadContext *tc, int *work_idx_to_clear); MoarVM-2018.03/src/io/fileops.c0000644000175000017510000003244113243752707016224 0ustar samanthasamantha#include "moar.h" #ifndef _WIN32 #include #include #define DEFAULT_MODE 0x01B6 #else #include #define O_CREAT _O_CREAT #define O_RDONLY _O_RDONLY #define O_WRONLY _O_WRONLY #define O_TRUNC _O_TRUNC #define DEFAULT_MODE _S_IWRITE /* work around sucky libuv defaults */ #endif static uv_stat_t file_info(MVMThreadContext *tc, MVMString *filename, MVMint32 use_lstat) { char * const a = MVM_string_utf8_c8_encode_C_string(tc, filename); uv_fs_t req; if ((use_lstat ? uv_fs_lstat(tc->loop, &req, a, NULL) : uv_fs_stat(tc->loop, &req, a, NULL) ) < 0) { MVM_free(a); MVM_exception_throw_adhoc(tc, "Failed to stat file: %s", uv_strerror(req.result)); } MVM_free(a); return req.statbuf; } MVMint64 MVM_file_stat(MVMThreadContext *tc, MVMString *filename, MVMint64 status, MVMint32 use_lstat) { MVMint64 r = -1; switch (status) { case MVM_STAT_EXISTS: r = MVM_file_exists(tc, filename, use_lstat); break; case MVM_STAT_FILESIZE: { char * const a = MVM_string_utf8_c8_encode_C_string(tc, filename); uv_fs_t req; if ((use_lstat ? uv_fs_lstat(tc->loop, &req, a, NULL) : uv_fs_stat(tc->loop, &req, a, NULL) ) < 0) { MVM_free(a); MVM_exception_throw_adhoc(tc, "Failed to stat file: %s", uv_strerror(req.result)); } MVM_free(a); r = req.statbuf.st_size; break; } case MVM_STAT_ISDIR: r = (file_info(tc, filename, use_lstat).st_mode & S_IFMT) == S_IFDIR; break; case MVM_STAT_ISREG: r = (file_info(tc, filename, use_lstat).st_mode & S_IFMT) == S_IFREG; break; case MVM_STAT_ISDEV: { const int mode = file_info(tc, filename, use_lstat).st_mode; #ifdef _WIN32 r = mode & S_IFMT == S_IFCHR; #else r = (mode & S_IFMT) == S_IFCHR || (mode & S_IFMT) == S_IFBLK; #endif break; } case MVM_STAT_CREATETIME: r = file_info(tc, filename, use_lstat).st_birthtim.tv_sec; break; case MVM_STAT_ACCESSTIME: r = file_info(tc, filename, use_lstat).st_atim.tv_sec; break; case MVM_STAT_MODIFYTIME: r = file_info(tc, filename, use_lstat).st_mtim.tv_sec; break; case MVM_STAT_CHANGETIME: r = file_info(tc, filename, use_lstat).st_ctim.tv_sec; break; /* case MVM_STAT_BACKUPTIME: r = -1; break; */ case MVM_STAT_UID: r = file_info(tc, filename, use_lstat).st_uid; break; case MVM_STAT_GID: r = file_info(tc, filename, use_lstat).st_gid; break; case MVM_STAT_ISLNK: r = (file_info(tc, filename, 1).st_mode & S_IFMT) == S_IFLNK; break; case MVM_STAT_PLATFORM_DEV: r = file_info(tc, filename, use_lstat).st_dev; break; case MVM_STAT_PLATFORM_INODE: r = file_info(tc, filename, use_lstat).st_ino; break; case MVM_STAT_PLATFORM_MODE: r = file_info(tc, filename, use_lstat).st_mode; break; case MVM_STAT_PLATFORM_NLINKS: r = file_info(tc, filename, use_lstat).st_nlink; break; case MVM_STAT_PLATFORM_DEVTYPE: r = file_info(tc, filename, use_lstat).st_rdev; break; case MVM_STAT_PLATFORM_BLOCKSIZE: r = file_info(tc, filename, use_lstat).st_blksize; break; case MVM_STAT_PLATFORM_BLOCKS: r = file_info(tc, filename, use_lstat).st_blocks; break; default: break; } return r; } MVMnum64 MVM_file_time(MVMThreadContext *tc, MVMString *filename, MVMint64 status, MVMint32 use_lstat) { uv_stat_t statbuf = file_info(tc, filename, use_lstat); uv_timespec_t ts; switch(status) { case MVM_STAT_CREATETIME: ts = statbuf.st_birthtim; break; case MVM_STAT_MODIFYTIME: ts = statbuf.st_mtim; break; case MVM_STAT_ACCESSTIME: ts = statbuf.st_atim; break; case MVM_STAT_CHANGETIME: ts = statbuf.st_ctim; break; default: return -1; } return ts.tv_sec + 1e-9 * (MVMnum64)ts.tv_nsec; } /* copy a file from one to another */ void MVM_file_copy(MVMThreadContext *tc, MVMString *src, MVMString * dest) { char * const a = MVM_string_utf8_c8_encode_C_string(tc, src); char * const b = MVM_string_utf8_c8_encode_C_string(tc, dest); uv_fs_t req; if(uv_fs_copyfile(tc->loop, &req, a, b, 0, NULL) < 0) { MVM_free(a); MVM_free(b); MVM_exception_throw_adhoc(tc, "Failed to copy file: %s", uv_strerror(req.result)); } MVM_free(a); MVM_free(b); } /* rename one file to another. */ void MVM_file_rename(MVMThreadContext *tc, MVMString *src, MVMString *dest) { char * const a = MVM_string_utf8_c8_encode_C_string(tc, src); char * const b = MVM_string_utf8_c8_encode_C_string(tc, dest); uv_fs_t req; if(uv_fs_rename(tc->loop, &req, a, b, NULL) < 0 ) { MVM_free(a); MVM_free(b); MVM_exception_throw_adhoc(tc, "Failed to rename file: %s", uv_strerror(req.result)); } MVM_free(a); MVM_free(b); } void MVM_file_delete(MVMThreadContext *tc, MVMString *f) { uv_fs_t req; char * const a = MVM_string_utf8_c8_encode_C_string(tc, f); #ifdef _WIN32 const int r = MVM_platform_unlink(a); if( r < 0 && errno != ENOENT) { MVM_free(a); MVM_exception_throw_adhoc(tc, "Failed to delete file: %d", errno); } #else const int r = uv_fs_unlink(tc->loop, &req, a, NULL); if( r < 0 && r != UV_ENOENT) { MVM_free(a); MVM_exception_throw_adhoc(tc, "Failed to delete file: %s", uv_strerror(req.result)); } #endif MVM_free(a); } void MVM_file_chmod(MVMThreadContext *tc, MVMString *f, MVMint64 flag) { char * const a = MVM_string_utf8_c8_encode_C_string(tc, f); uv_fs_t req; if(uv_fs_chmod(tc->loop, &req, a, flag, NULL) < 0 ) { MVM_free(a); MVM_exception_throw_adhoc(tc, "Failed to set permissions on path: %s", uv_strerror(req.result)); } MVM_free(a); } MVMint64 MVM_file_exists(MVMThreadContext *tc, MVMString *f, MVMint32 use_lstat) { uv_fs_t req; char * const a = MVM_string_utf8_c8_encode_C_string(tc, f); const MVMint64 result = (use_lstat ? uv_fs_lstat(tc->loop, &req, a, NULL) : uv_fs_stat(tc->loop, &req, a, NULL) ) < 0 ? 0 : 1; MVM_free(a); return result; } #ifdef _WIN32 #define FILE_IS(name, rwx) \ MVMint64 MVM_file_is ## name (MVMThreadContext *tc, MVMString *filename, MVMint32 use_lstat) { \ if (!MVM_file_exists(tc, filename, use_lstat)) \ return 0; \ else { \ uv_stat_t statbuf = file_info(tc, filename, use_lstat); \ MVMint64 r = (statbuf.st_mode & S_I ## rwx ); \ return r ? 1 : 0; \ } \ } FILE_IS(readable, READ) FILE_IS(writable, WRITE) MVMint64 MVM_file_isexecutable(MVMThreadContext *tc, MVMString *filename, MVMint32 use_lstat) { if (!MVM_file_exists(tc, filename, use_lstat)) return 0; else { MVMint64 r = 0; uv_stat_t statbuf = file_info(tc, filename, use_lstat); if ((statbuf.st_mode & S_IFMT) == S_IFDIR) return 1; else { /* true if fileext is in PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC */ MVMString *dot = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "."); MVMROOT(tc, dot, { MVMint64 n = MVM_string_index_from_end(tc, filename, dot, 0); if (n >= 0) { MVMString *fileext = MVM_string_substring(tc, filename, n, -1); char *ext = MVM_string_utf8_c8_encode_C_string(tc, fileext); char *pext = getenv("PATHEXT"); int plen = strlen(pext); int i; for (i = 0; i < plen; i++) { if (0 == stricmp(ext, pext++)) { r = 1; break; } } MVM_free(ext); MVM_free(pext); } }); } return r; } } #else #define FILE_IS(name, rwx) \ MVMint64 MVM_file_is ## name (MVMThreadContext *tc, MVMString *filename, MVMint32 use_lstat) { \ if (!MVM_file_exists(tc, filename, use_lstat)) \ return 0; \ else { \ uv_stat_t statbuf = file_info(tc, filename, use_lstat); \ MVMint64 r = (statbuf.st_mode & S_I ## rwx ## OTH) \ || (statbuf.st_uid == geteuid() && (statbuf.st_mode & S_I ## rwx ## USR)) \ || (statbuf.st_uid == getegid() && (statbuf.st_mode & S_I ## rwx ## GRP)); \ return r ? 1 : 0; \ } \ } FILE_IS(readable, R) FILE_IS(writable, W) FILE_IS(executable, X) #endif /* Get a MoarVM file handle representing one of the standard streams */ MVMObject * MVM_file_get_stdstream(MVMThreadContext *tc, MVMint32 descriptor) { return MVM_file_handle_from_fd(tc, descriptor); } /* Takes a filename and prepends any --libpath value we have, if it's not an * absolute path. */ MVMString * MVM_file_in_libpath(MVMThreadContext *tc, MVMString *orig) { const char **lib_path = tc->instance->lib_path; MVM_gc_root_temp_push(tc, (MVMCollectable **)&orig); if (lib_path) { /* We actually have a lib_path to consider. See if the filename is * absolute (XXX wants a platform abstraction, and doing better). */ char *orig_cstr = MVM_string_utf8_c8_encode_C_string(tc, orig); int absolute = orig_cstr[0] == '/' || orig_cstr[0] == '\\' || (orig_cstr[1] == ':' && orig_cstr[2] == '\\'); if (absolute) { /* Nothing more to do; we have an absolute path. */ MVM_free(orig_cstr); MVM_gc_root_temp_pop(tc); /* orig */ return orig; } else { MVMString *result = NULL; int lib_path_i = 0; MVM_gc_root_temp_push(tc, (MVMCollectable **)&result); while (lib_path[lib_path_i]) { /* Concatenate libpath with filename. */ size_t lib_path_len = strlen(lib_path[lib_path_i]); size_t orig_len = strlen(orig_cstr); int need_sep = lib_path[lib_path_i][lib_path_len - 1] != '/' && lib_path[lib_path_i][lib_path_len - 1] != '\\'; int new_len = lib_path_len + (need_sep ? 1 : 0) + orig_len; char * new_path = MVM_malloc(new_len); memcpy(new_path, lib_path[lib_path_i], lib_path_len); if (need_sep) { new_path[lib_path_len] = '/'; memcpy(new_path + lib_path_len + 1, orig_cstr, orig_len); } else { memcpy(new_path + lib_path_len, orig_cstr, orig_len); } result = MVM_string_utf8_c8_decode(tc, tc->instance->VMString, new_path, new_len); MVM_free(new_path); if (!MVM_file_exists(tc, result, 1)) result = orig; else { MVM_free(orig_cstr); MVM_gc_root_temp_pop_n(tc, 2); /* orig and result */ return result; } lib_path_i++; } if (!result || !MVM_file_exists(tc, result, 1)) result = orig; MVM_free(orig_cstr); MVM_gc_root_temp_pop_n(tc, 2); /* orig and result */ return result; } } else { /* No libpath, so just hand back the original name. */ MVM_gc_root_temp_pop(tc); /* orig */ return orig; } } void MVM_file_link(MVMThreadContext *tc, MVMString *oldpath, MVMString *newpath) { uv_fs_t req; char * const oldpath_s = MVM_string_utf8_c8_encode_C_string(tc, oldpath); char * const newpath_s = MVM_string_utf8_c8_encode_C_string(tc, newpath); if (uv_fs_link(tc->loop, &req, oldpath_s, newpath_s, NULL)) { MVM_free(oldpath_s); MVM_free(newpath_s); MVM_exception_throw_adhoc(tc, "Failed to link file: %s", uv_strerror(req.result)); } MVM_free(oldpath_s); MVM_free(newpath_s); } void MVM_file_symlink(MVMThreadContext *tc, MVMString *oldpath, MVMString *newpath) { uv_fs_t req; char * const oldpath_s = MVM_string_utf8_c8_encode_C_string(tc, oldpath); char * const newpath_s = MVM_string_utf8_c8_encode_C_string(tc, newpath); if (uv_fs_symlink(tc->loop, &req, oldpath_s, newpath_s, 0, NULL)) { MVM_free(oldpath_s); MVM_free(newpath_s); MVM_exception_throw_adhoc(tc, "Failed to symlink file: %s", uv_strerror(req.result)); } MVM_free(oldpath_s); MVM_free(newpath_s); } MVMString * MVM_file_readlink(MVMThreadContext *tc, MVMString *path) { uv_fs_t req; MVMString *result; char * const path_s = MVM_string_utf8_c8_encode_C_string(tc, path); if (uv_fs_readlink(tc->loop, &req, path_s, NULL) < 0) { MVM_free(path_s); MVM_exception_throw_adhoc(tc, "Failed to readlink file: %s", uv_strerror(req.result)); } MVM_free(path_s); result = MVM_string_utf8_c8_decode(tc, tc->instance->VMString, req.ptr, strlen(req.ptr)); MVM_free(req.ptr); return result; } MoarVM-2018.03/src/io/fileops.h0000644000175000017510000000451613237701240016220 0ustar samanthasamantha#define MVM_FILE_FLOCK_SHARED 1 /* Shared lock. Read lock */ #define MVM_FILE_FLOCK_EXCLUSIVE 2 /* Exclusive lock. Write lock. */ #define MVM_FILE_FLOCK_TYPEMASK 0x000F /* a mask of lock type */ #define MVM_FILE_FLOCK_NONBLOCK 0x0010 /* asynchronous block during * locking the file */ #define MVM_STAT_EXISTS 0 #define MVM_STAT_FILESIZE 1 #define MVM_STAT_ISDIR 2 #define MVM_STAT_ISREG 3 #define MVM_STAT_ISDEV 4 #define MVM_STAT_CREATETIME 5 #define MVM_STAT_ACCESSTIME 6 #define MVM_STAT_MODIFYTIME 7 #define MVM_STAT_CHANGETIME 8 #define MVM_STAT_BACKUPTIME 9 #define MVM_STAT_UID 10 #define MVM_STAT_GID 11 #define MVM_STAT_ISLNK 12 #define MVM_STAT_PLATFORM_DEV -1 #define MVM_STAT_PLATFORM_INODE -2 #define MVM_STAT_PLATFORM_MODE -3 #define MVM_STAT_PLATFORM_NLINKS -4 #define MVM_STAT_PLATFORM_DEVTYPE -5 #define MVM_STAT_PLATFORM_BLOCKSIZE -6 #define MVM_STAT_PLATFORM_BLOCKS -7 MVMint64 MVM_file_stat(MVMThreadContext *tc, MVMString *filename, MVMint64 status, MVMint32 use_lstat); MVMnum64 MVM_file_time(MVMThreadContext *tc, MVMString *filename, MVMint64 status, MVMint32 use_lstat); void MVM_file_copy(MVMThreadContext *tc, MVMString *src, MVMString *dest); void MVM_file_rename(MVMThreadContext *tc, MVMString *src, MVMString *dest); void MVM_file_delete(MVMThreadContext *tc, MVMString *f); void MVM_file_chmod(MVMThreadContext *tc, MVMString *f, MVMint64 flag); MVMint64 MVM_file_exists(MVMThreadContext *tc, MVMString *f, MVMint32 use_lstat); MVMint64 MVM_file_isreadable(MVMThreadContext *tc, MVMString *filename, MVMint32 use_lstat); MVMint64 MVM_file_iswritable(MVMThreadContext *tc, MVMString *filename, MVMint32 use_lstat); MVMint64 MVM_file_isexecutable(MVMThreadContext *tc, MVMString *filename, MVMint32 use_lstat); MVMObject * MVM_file_get_stdstream(MVMThreadContext *tc, MVMint32 type); MVMString * MVM_file_in_libpath(MVMThreadContext *tc, MVMString *orig); void MVM_file_link(MVMThreadContext *tc, MVMString *oldpath, MVMString *newpath); void MVM_file_symlink(MVMThreadContext *tc, MVMString *oldpath, MVMString *newpath); MVMString * MVM_file_readlink(MVMThreadContext *tc, MVMString *path); MoarVM-2018.03/src/io/filewatchers.c0000644000175000017510000001053413242626641017236 0ustar samanthasamantha#include "moar.h" /* Info we convey about a file watcher. */ typedef struct { char *path; uv_fs_event_t handle; MVMThreadContext *tc; int work_idx; } WatchInfo; static void on_changed(uv_fs_event_t *handle, const char *filename, int events, int status) { WatchInfo *wi = (WatchInfo *)handle->data; MVMThreadContext *tc = wi->tc; MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = MVM_io_eventloop_get_active_work(tc, wi->work_idx); MVM_repr_push_o(tc, arr, t->body.schedulee); MVMROOT2(tc, t, arr, { MVMObject *filename_boxed; MVMObject *rename_boxed; if (filename) { MVMString *filename_str = MVM_string_utf8_c8_decode(tc, tc->instance->VMString, filename, strlen(filename)); filename_boxed = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, filename_str); } else { filename_boxed = tc->instance->boot_types.BOOTStr; } MVM_repr_push_o(tc, arr, filename_boxed); rename_boxed = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, events == UV_RENAME ? 1 : 0); MVM_repr_push_o(tc, arr, rename_boxed); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); }); MVM_repr_push_o(tc, t->body.queue, arr); } /* Sets the signal handler up on the event loop. */ static void setup(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { WatchInfo *wi = (WatchInfo *)data; int r; /* Add task to active list. */ wi->work_idx = MVM_io_eventloop_add_active_work(tc, async_task); wi->tc = tc; wi->handle.data = wi; /* Start watching. */ uv_fs_event_init(loop, &wi->handle); if ((r = uv_fs_event_start(&wi->handle, on_changed, wi->path, 0)) != 0) { /* Error; need to notify. */ MVMROOT(tc, async_task, { MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = (MVMAsyncTask *)async_task; MVM_repr_push_o(tc, arr, t->body.schedulee); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); MVMROOT(tc, arr, { MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, uv_strerror(r)); MVMObject *msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); MVM_repr_push_o(tc, arr, msg_box); }); MVM_repr_push_o(tc, t->body.queue, arr); }); } } /* Frees data associated with a file watcher task. */ static void gc_free(MVMThreadContext *tc, MVMObject *t, void *data) { if (data) MVM_free(data); } /* Operations table for a file watcher task. */ static const MVMAsyncTaskOps op_table = { setup, NULL, NULL, NULL, gc_free }; MVMObject * MVM_io_file_watch(MVMThreadContext *tc, MVMObject *queue, MVMObject *schedulee, MVMString *path, MVMObject *async_type) { MVMAsyncTask *task; WatchInfo *watch_info; /* Encode path. */ char *c_path = MVM_string_utf8_c8_encode_C_string(tc, path); /* Validate REPRs. */ if (REPR(queue)->ID != MVM_REPR_ID_ConcBlockingQueue) MVM_exception_throw_adhoc(tc, "file watch target queue must have ConcBlockingQueue REPR"); if (REPR(async_type)->ID != MVM_REPR_ID_MVMAsyncTask) MVM_exception_throw_adhoc(tc, "file watch result type must have REPR AsyncTask"); /* Create async task handle. */ MVMROOT2(tc, queue, schedulee, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, async_type); }); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.queue, queue); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.schedulee, schedulee); task->body.ops = &op_table; watch_info = MVM_malloc(sizeof(WatchInfo)); watch_info->path = c_path; task->body.data = watch_info; /* Hand the task off to the event loop. */ MVMROOT(tc, task, { MVM_io_eventloop_queue_work(tc, (MVMObject *)task); }); return (MVMObject *)task; } MoarVM-2018.03/src/io/filewatchers.h0000644000175000017510000000021113237701240017223 0ustar samanthasamanthaMVMObject * MVM_io_file_watch(MVMThreadContext *tc, MVMObject *queue, MVMObject *schedulee, MVMString *path, MVMObject *async_type); MoarVM-2018.03/src/io/io.c0000644000175000017510000003632713242626641015175 0ustar samanthasamantha#include "moar.h" /* Delegatory functions that assert we have a capable handle, then delegate * through the IO table to the correct operation. */ static MVMOSHandle * verify_is_handle(MVMThreadContext *tc, MVMObject *oshandle, const char *op) { if (REPR(oshandle)->ID != MVM_REPR_ID_MVMOSHandle) MVM_exception_throw_adhoc(tc, "%s requires an object with REPR MVMOSHandle (got %s with REPR %s)", op, MVM_6model_get_debug_name(tc, oshandle), REPR(oshandle)->name); return (MVMOSHandle *)oshandle; } static uv_mutex_t * acquire_mutex(MVMThreadContext *tc, MVMOSHandle *handle) { uv_mutex_t *mutex = handle->body.mutex; MVM_gc_mark_thread_blocked(tc); uv_mutex_lock(mutex); MVM_gc_mark_thread_unblocked(tc); MVM_tc_set_ex_release_mutex(tc, mutex); return mutex; } static void release_mutex(MVMThreadContext *tc, uv_mutex_t *mutex) { uv_mutex_unlock(mutex); MVM_tc_clear_ex_release_mutex(tc); } MVMint64 MVM_io_close(MVMThreadContext *tc, MVMObject *oshandle) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "close"); if (handle->body.ops->closable) { MVMint64 ret; MVMROOT(tc, handle, { uv_mutex_t *mutex = acquire_mutex(tc, handle); ret = handle->body.ops->closable->close(tc, handle); release_mutex(tc, mutex); }); return ret; } else MVM_exception_throw_adhoc(tc, "Cannot close this kind of handle"); } MVMint64 MVM_io_is_tty(MVMThreadContext *tc, MVMObject *oshandle) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "istty"); /* We need the extra check on is_tty because it is NULL for pipes. */ if (handle->body.ops->introspection && handle->body.ops->introspection->is_tty) { MVMint64 ret; MVMROOT(tc, handle, { uv_mutex_t *mutex = acquire_mutex(tc, handle); ret = handle->body.ops->introspection->is_tty(tc, handle); release_mutex(tc, mutex); }); return ret; } else { return 0; } } MVMint64 MVM_io_fileno(MVMThreadContext *tc, MVMObject *oshandle) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "get native descriptor"); if (handle->body.ops->introspection) { MVMint64 ret; MVMROOT(tc, handle, { uv_mutex_t *mutex = acquire_mutex(tc, handle); ret = handle->body.ops->introspection->native_descriptor(tc, handle); release_mutex(tc, mutex); }); return ret; } else { return -1; } } void MVM_io_seek(MVMThreadContext *tc, MVMObject *oshandle, MVMint64 offset, MVMint64 flag) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "seek"); if (handle->body.ops->seekable) { MVMROOT(tc, handle, { uv_mutex_t *mutex = acquire_mutex(tc, handle); handle->body.ops->seekable->seek(tc, handle, offset, flag); release_mutex(tc, mutex); }); } else MVM_exception_throw_adhoc(tc, "Cannot seek this kind of handle"); } MVMint64 MVM_io_tell(MVMThreadContext *tc, MVMObject *oshandle) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "tell"); if (handle->body.ops->seekable) { MVMint64 result; MVMROOT(tc, handle, { uv_mutex_t *mutex = acquire_mutex(tc, handle); result = handle->body.ops->seekable->tell(tc, handle); release_mutex(tc, mutex); }); return result; } else MVM_exception_throw_adhoc(tc, "Cannot tell this kind of handle"); } void MVM_io_read_bytes(MVMThreadContext *tc, MVMObject *oshandle, MVMObject *result, MVMint64 length) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "read bytes"); MVMint64 bytes_read; char *buf; /* Ensure the target is in the correct form. */ if (!IS_CONCRETE(result) || REPR(result)->ID != MVM_REPR_ID_VMArray) MVM_exception_throw_adhoc(tc, "read_fhb requires a native array to write to"); if (((MVMArrayREPRData *)STABLE(result)->REPR_data)->slot_type != MVM_ARRAY_U8 && ((MVMArrayREPRData *)STABLE(result)->REPR_data)->slot_type != MVM_ARRAY_I8) MVM_exception_throw_adhoc(tc, "read_fhb requires a native array of uint8 or int8"); if (length < 1) MVM_exception_throw_adhoc(tc, "Out of range: attempted to read %"PRId64" bytes from filehandle", length); if (handle->body.ops->sync_readable) { MVMROOT2(tc, handle, result, { uv_mutex_t *mutex = acquire_mutex(tc, handle); bytes_read = handle->body.ops->sync_readable->read_bytes(tc, handle, &buf, length); release_mutex(tc, mutex); }); } else MVM_exception_throw_adhoc(tc, "Cannot read characters from this kind of handle"); /* Stash the data in the VMArray. */ ((MVMArray *)result)->body.slots.i8 = (MVMint8 *)buf; ((MVMArray *)result)->body.start = 0; ((MVMArray *)result)->body.ssize = bytes_read; ((MVMArray *)result)->body.elems = bytes_read; } void MVM_io_write_bytes(MVMThreadContext *tc, MVMObject *oshandle, MVMObject *buffer) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "write bytes"); char *output; MVMint64 output_size; /* Ensure the target is in the correct form. */ if (!IS_CONCRETE(buffer) || REPR(buffer)->ID != MVM_REPR_ID_VMArray) MVM_exception_throw_adhoc(tc, "write_fhb requires a native array to read from"); if (((MVMArrayREPRData *)STABLE(buffer)->REPR_data)->slot_type != MVM_ARRAY_U8 && ((MVMArrayREPRData *)STABLE(buffer)->REPR_data)->slot_type != MVM_ARRAY_I8) MVM_exception_throw_adhoc(tc, "write_fhb requires a native array of uint8 or int8"); output = (char *)(((MVMArray *)buffer)->body.slots.i8 + ((MVMArray *)buffer)->body.start); output_size = ((MVMArray *)buffer)->body.elems; if (handle->body.ops->sync_writable) { MVMROOT(tc, handle, { uv_mutex_t *mutex = acquire_mutex(tc, handle); handle->body.ops->sync_writable->write_bytes(tc, handle, output, output_size); release_mutex(tc, mutex); }); } else MVM_exception_throw_adhoc(tc, "Cannot write bytes to this kind of handle"); } void MVM_io_write_bytes_c(MVMThreadContext *tc, MVMObject *oshandle, char *output, MVMuint64 output_size) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "write bytes"); if (handle->body.ops->sync_writable) { MVMROOT(tc, handle, { uv_mutex_t *mutex = acquire_mutex(tc, handle); handle->body.ops->sync_writable->write_bytes(tc, handle, output, output_size); release_mutex(tc, mutex); }); } else MVM_exception_throw_adhoc(tc, "Cannot write bytes to this kind of handle"); } MVMObject * MVM_io_read_bytes_async(MVMThreadContext *tc, MVMObject *oshandle, MVMObject *queue, MVMObject *schedulee, MVMObject *buf_type, MVMObject *async_type) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "read bytes asynchronously"); if (handle->body.ops->async_readable) { MVMObject *result; MVMROOT5(tc, queue, schedulee, buf_type, async_type, handle, { uv_mutex_t *mutex = acquire_mutex(tc, handle); result = (MVMObject *)handle->body.ops->async_readable->read_bytes(tc, handle, queue, schedulee, buf_type, async_type); release_mutex(tc, mutex); }); return result; } else MVM_exception_throw_adhoc(tc, "Cannot read bytes asynchronously from this kind of handle"); } MVMObject * MVM_io_write_bytes_async(MVMThreadContext *tc, MVMObject *oshandle, MVMObject *queue, MVMObject *schedulee, MVMObject *buffer, MVMObject *async_type) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "write buffer asynchronously"); if (buffer == NULL) MVM_exception_throw_adhoc(tc, "Failed to write to filehandle: NULL buffer given"); if (handle->body.ops->async_writable) { MVMObject *result; MVMROOT5(tc, queue, schedulee, buffer, async_type, handle, { uv_mutex_t *mutex = acquire_mutex(tc, handle); result = (MVMObject *)handle->body.ops->async_writable->write_bytes(tc, handle, queue, schedulee, buffer, async_type); release_mutex(tc, mutex); }); return result; } else MVM_exception_throw_adhoc(tc, "Cannot write bytes asynchronously to this kind of handle"); } MVMObject * MVM_io_write_bytes_to_async(MVMThreadContext *tc, MVMObject *oshandle, MVMObject *queue, MVMObject *schedulee, MVMObject *buffer, MVMObject *async_type, MVMString *host, MVMint64 port) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "write buffer asynchronously to destination"); if (buffer == NULL) MVM_exception_throw_adhoc(tc, "Failed to write to filehandle: NULL buffer given"); if (handle->body.ops->async_writable_to) { MVMObject *result; MVMROOT6(tc, host, queue, schedulee, buffer, async_type, handle, { uv_mutex_t *mutex = acquire_mutex(tc, handle); result = (MVMObject *)handle->body.ops->async_writable_to->write_bytes_to(tc, handle, queue, schedulee, buffer, async_type, host, port); release_mutex(tc, mutex); }); return result; } else MVM_exception_throw_adhoc(tc, "Cannot write bytes to a destination asynchronously to this kind of handle"); } MVMint64 MVM_io_eof(MVMThreadContext *tc, MVMObject *oshandle) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "eof"); if (handle->body.ops->sync_readable) { MVMint64 result; MVMROOT(tc, handle, { uv_mutex_t *mutex = acquire_mutex(tc, handle); result = handle->body.ops->sync_readable->eof(tc, handle); release_mutex(tc, mutex); }); return result; } else MVM_exception_throw_adhoc(tc, "Cannot eof this kind of handle"); } MVMint64 MVM_io_lock(MVMThreadContext *tc, MVMObject *oshandle, MVMint64 flag) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "lock"); if (handle->body.ops->lockable) { MVMint64 result; MVMROOT(tc, handle, { uv_mutex_t *mutex = acquire_mutex(tc, handle); result = handle->body.ops->lockable->lock(tc, handle, flag); release_mutex(tc, mutex); }); return result; } else MVM_exception_throw_adhoc(tc, "Cannot lock this kind of handle"); } void MVM_io_unlock(MVMThreadContext *tc, MVMObject *oshandle) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "unlock"); if (handle->body.ops->lockable) { MVMROOT(tc, handle, { uv_mutex_t *mutex = acquire_mutex(tc, handle); handle->body.ops->lockable->unlock(tc, handle); release_mutex(tc, mutex); }); } else MVM_exception_throw_adhoc(tc, "Cannot unlock this kind of handle"); } void MVM_io_flush(MVMThreadContext *tc, MVMObject *oshandle, MVMint32 sync) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "flush"); if (handle->body.ops->sync_writable) { MVMROOT(tc, handle, { uv_mutex_t *mutex = acquire_mutex(tc, handle); handle->body.ops->sync_writable->flush(tc, handle, sync); release_mutex(tc, mutex); }); } else MVM_exception_throw_adhoc(tc, "Cannot flush this kind of handle"); } void MVM_io_truncate(MVMThreadContext *tc, MVMObject *oshandle, MVMint64 offset) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "truncate"); if (handle->body.ops->sync_writable) { MVMROOT(tc, handle, { uv_mutex_t *mutex = acquire_mutex(tc, handle); handle->body.ops->sync_writable->truncate(tc, handle, offset); release_mutex(tc, mutex); }); } else MVM_exception_throw_adhoc(tc, "Cannot truncate this kind of handle"); } void MVM_io_connect(MVMThreadContext *tc, MVMObject *oshandle, MVMString *host, MVMint64 port) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "connect"); if (handle->body.ops->sockety) { MVMROOT2(tc, host, handle, { uv_mutex_t *mutex = acquire_mutex(tc, handle); handle->body.ops->sockety->connect(tc, handle, host, port); release_mutex(tc, mutex); }); } else MVM_exception_throw_adhoc(tc, "Cannot connect this kind of handle"); } void MVM_io_bind(MVMThreadContext *tc, MVMObject *oshandle, MVMString *host, MVMint64 port, MVMint32 backlog) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "bind"); if (handle->body.ops->sockety) { MVMROOT2(tc, host, handle, { uv_mutex_t *mutex = acquire_mutex(tc, handle); handle->body.ops->sockety->bind(tc, handle, host, port, backlog); release_mutex(tc, mutex); }); } else MVM_exception_throw_adhoc(tc, "Cannot bind this kind of handle"); } MVMint64 MVM_io_getport(MVMThreadContext *tc, MVMObject *oshandle) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "getport"); if (handle->body.ops->sockety) { MVMint64 result; MVMROOT(tc, handle, { uv_mutex_t *mutex = acquire_mutex(tc, handle); result = handle->body.ops->sockety->getport(tc, handle); release_mutex(tc, mutex); }); return result; } else MVM_exception_throw_adhoc(tc, "Cannot getport for this kind of handle"); } MVMObject * MVM_io_accept(MVMThreadContext *tc, MVMObject *oshandle) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "accept"); if (handle->body.ops->sockety) { MVMObject *result; MVMROOT(tc, handle, { uv_mutex_t *mutex = acquire_mutex(tc, handle); result = handle->body.ops->sockety->accept(tc, handle); release_mutex(tc, mutex); }); return result; } else MVM_exception_throw_adhoc(tc, "Cannot accept this kind of handle"); } void MVM_io_set_buffer_size(MVMThreadContext *tc, MVMObject *oshandle, MVMint64 size) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "set buffer size"); if (handle->body.ops->set_buffer_size) { MVMROOT(tc, handle, { uv_mutex_t *mutex = acquire_mutex(tc, handle); handle->body.ops->set_buffer_size(tc, handle, size); release_mutex(tc, mutex); }); } else MVM_exception_throw_adhoc(tc, "Cannot set buffer size on this kind of handle"); } MVMObject * MVM_io_get_async_task_handle(MVMThreadContext *tc, MVMObject *oshandle) { MVMOSHandle *handle = verify_is_handle(tc, oshandle, "get async task handle"); if (handle->body.ops->get_async_task_handle) { MVMObject *ath; MVMROOT(tc, handle, { uv_mutex_t *mutex = acquire_mutex(tc, handle); ath = handle->body.ops->get_async_task_handle(tc, handle); release_mutex(tc, mutex); }); return ath; } else MVM_exception_throw_adhoc(tc, "Cannot get async task handle from this kind of handle"); } void MVM_io_flush_standard_handles(MVMThreadContext *tc) { MVM_io_flush(tc, tc->instance->stdout_handle, 0); MVM_io_flush(tc, tc->instance->stderr_handle, 0); } MoarVM-2018.03/src/io/io.h0000644000175000017510000001340513237701240015163 0ustar samanthasamantha/* Operation table for I/O. A given handle type may implement any number of * these sections. */ struct MVMIOOps { /* The various sections that may be implemented. */ const MVMIOClosable *closable; const MVMIOSyncReadable *sync_readable; const MVMIOSyncWritable *sync_writable; const MVMIOAsyncReadable *async_readable; const MVMIOAsyncWritable *async_writable; const MVMIOAsyncWritableTo *async_writable_to; const MVMIOSeekable *seekable; const MVMIOSockety *sockety; MVMObject * (*get_async_task_handle) (MVMThreadContext *tc, MVMOSHandle *h); const MVMIOLockable *lockable; const MVMIOIntrospection *introspection; void (*set_buffer_size) (MVMThreadContext *tc, MVMOSHandle *h, MVMint64 size); /* How to mark the handle's data, if needed. */ void (*gc_mark) (MVMThreadContext *tc, void *data, MVMGCWorklist *worklist); /* How to free the handle's data. */ void (*gc_free) (MVMThreadContext *tc, MVMObject *h, void *data); }; /* I/O operations on handles that can be closed. */ struct MVMIOClosable { MVMint64 (*close) (MVMThreadContext *tc, MVMOSHandle *h); }; /* I/O operations on handles that can do synchronous reading. */ struct MVMIOSyncReadable { MVMint64 (*read_bytes) (MVMThreadContext *tc, MVMOSHandle *h, char **buf, MVMint64 bytes); MVMint64 (*eof) (MVMThreadContext *tc, MVMOSHandle *h); }; /* I/O operations on handles that can do synchronous writing. */ struct MVMIOSyncWritable { MVMint64 (*write_bytes) (MVMThreadContext *tc, MVMOSHandle *h, char *buf, MVMint64 bytes); void (*flush) (MVMThreadContext *tc, MVMOSHandle *h, MVMint32 sync); void (*truncate) (MVMThreadContext *tc, MVMOSHandle *h, MVMint64 bytes); }; /* I/O operations on handles that can do asynchronous reading. */ struct MVMIOAsyncReadable { MVMAsyncTask * (*read_bytes) (MVMThreadContext *tc, MVMOSHandle *h, MVMObject *queue, MVMObject *schedulee, MVMObject *buf_type, MVMObject *async_type); }; /* I/O operations on handles that can do asynchronous writing. */ struct MVMIOAsyncWritable { MVMAsyncTask * (*write_bytes) (MVMThreadContext *tc, MVMOSHandle *h, MVMObject *queue, MVMObject *schedulee, MVMObject *buffer, MVMObject *async_type); }; /* I/O operations on handles that can do asynchronous writing to a given * network destination. */ struct MVMIOAsyncWritableTo { MVMAsyncTask * (*write_bytes_to) (MVMThreadContext *tc, MVMOSHandle *h, MVMObject *queue, MVMObject *schedulee, MVMObject *buffer, MVMObject *async_type, MVMString *host, MVMint64 port); }; /* I/O operations on handles that can seek/tell. */ struct MVMIOSeekable { void (*seek) (MVMThreadContext *tc, MVMOSHandle *h, MVMint64 offset, MVMint64 whence); MVMint64 (*tell) (MVMThreadContext *tc, MVMOSHandle *h); }; /* I/O operations on handles that do socket-y things (connect, bind, accept). */ struct MVMIOSockety { void (*connect) (MVMThreadContext *tc, MVMOSHandle *h, MVMString *host, MVMint64 port); void (*bind) (MVMThreadContext *tc, MVMOSHandle *h, MVMString *host, MVMint64 port, MVMint32 backlog); MVMObject * (*accept) (MVMThreadContext *tc, MVMOSHandle *h); MVMint64 (*getport) (MVMThreadContext *tc, MVMOSHandle *h); }; /* I/O operations on handles that can lock/unlock. */ struct MVMIOLockable { MVMint64 (*lock) (MVMThreadContext *tc, MVMOSHandle *h, MVMint64 flag); void (*unlock) (MVMThreadContext *tc, MVMOSHandle *h); }; /* Various bits of introspection we can perform on a handle. */ struct MVMIOIntrospection { MVMint64 (*is_tty) (MVMThreadContext *tc, MVMOSHandle *h); MVMint64 (*native_descriptor) (MVMThreadContext *tc, MVMOSHandle *h); }; MVMint64 MVM_io_close(MVMThreadContext *tc, MVMObject *oshandle); MVMint64 MVM_io_is_tty(MVMThreadContext *tc, MVMObject *oshandle); MVMint64 MVM_io_fileno(MVMThreadContext *tc, MVMObject *oshandle); void MVM_io_seek(MVMThreadContext *tc, MVMObject *oshandle, MVMint64 offset, MVMint64 flag); MVMint64 MVM_io_tell(MVMThreadContext *tc, MVMObject *oshandle); void MVM_io_read_bytes(MVMThreadContext *tc, MVMObject *oshandle, MVMObject *result, MVMint64 length); void MVM_io_write_bytes(MVMThreadContext *tc, MVMObject *oshandle, MVMObject *buffer); void MVM_io_write_bytes_c(MVMThreadContext *tc, MVMObject *oshandle, char *output, MVMuint64 output_size); MVMObject * MVM_io_read_bytes_async(MVMThreadContext *tc, MVMObject *oshandle, MVMObject *queue, MVMObject *schedulee, MVMObject *buf_type, MVMObject *async_type); MVMObject * MVM_io_write_bytes_async(MVMThreadContext *tc, MVMObject *oshandle, MVMObject *queue, MVMObject *schedulee, MVMObject *buffer, MVMObject *async_type); MVMObject * MVM_io_write_bytes_to_async(MVMThreadContext *tc, MVMObject *oshandle, MVMObject *queue, MVMObject *schedulee, MVMObject *buffer, MVMObject *async_type, MVMString *host, MVMint64 port); MVMint64 MVM_io_eof(MVMThreadContext *tc, MVMObject *oshandle); MVMint64 MVM_io_lock(MVMThreadContext *tc, MVMObject *oshandle, MVMint64 flag); void MVM_io_unlock(MVMThreadContext *tc, MVMObject *oshandle); void MVM_io_flush(MVMThreadContext *tc, MVMObject *oshandle, MVMint32 sync); void MVM_io_truncate(MVMThreadContext *tc, MVMObject *oshandle, MVMint64 offset); void MVM_io_connect(MVMThreadContext *tc, MVMObject *oshandle, MVMString *host, MVMint64 port); void MVM_io_bind(MVMThreadContext *tc, MVMObject *oshandle, MVMString *host, MVMint64 port, MVMint32 backlog); MVMObject * MVM_io_accept(MVMThreadContext *tc, MVMObject *oshandle); MVMint64 MVM_io_getport(MVMThreadContext *tc, MVMObject *oshandle); void MVM_io_set_buffer_size(MVMThreadContext *tc, MVMObject *oshandle, MVMint64 size); MVMObject * MVM_io_get_async_task_handle(MVMThreadContext *tc, MVMObject *oshandle); void MVM_io_flush_standard_handles(MVMThreadContext *tc); MoarVM-2018.03/src/io/procops.c0000644000175000017510000012475513243752707016262 0ustar samanthasamantha#include "moar.h" #include "platform/time.h" #include "tinymt64.h" #include "bithacks.h" /* concatenating with "" ensures that only literal strings are accepted as argument. */ #define STR_WITH_LEN(str) ("" str ""), (sizeof(str) - 1) /* MSVC compilers know about environ, * see http://msdn.microsoft.com/en-us//library/vstudio/stxk41x1.aspx */ #ifndef _WIN32 #include # ifdef __APPLE_CC__ # include # define environ (*_NSGetEnviron()) # else extern char **environ; # endif #else #include #endif #ifdef _WIN32 static wchar_t * ANSIToUnicode(MVMuint16 acp, const char *str) { const int len = MultiByteToWideChar(acp, 0, str, -1, NULL, 0); wchar_t * const result = (wchar_t *)MVM_malloc(len * sizeof(wchar_t)); MultiByteToWideChar(acp, 0, str, -1, (LPWSTR)result, len); return result; } static char * UnicodeToUTF8(const wchar_t *str) { const int len = WideCharToMultiByte(CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL); char * const result = (char *)MVM_malloc(len + 1); WideCharToMultiByte(CP_UTF8, 0, str, -1, result, len, NULL, NULL); return result; } static char * ANSIToUTF8(MVMuint16 acp, const char * str) { wchar_t * const wstr = ANSIToUnicode(acp, str); char * const result = UnicodeToUTF8(wstr); MVM_free(wstr); return result; } MVM_PUBLIC char ** MVM_UnicodeToUTF8_argv(const int argc, wchar_t **wargv) { int i; char **argv = MVM_malloc((argc + 1) * sizeof(*argv)); for (i = 0; i < argc; ++i) { argv[i] = UnicodeToUTF8(wargv[i]); } argv[i] = NULL; return argv; } #endif MVMObject * MVM_proc_getenvhash(MVMThreadContext *tc) { MVMInstance * const instance = tc->instance; MVMObject * env_hash; if (instance->env_hash) { return instance->env_hash; } else { MVMuint32 pos = 0; MVMString *needle = MVM_string_ascii_decode(tc, instance->VMString, STR_WITH_LEN("=")); #ifndef _WIN32 char *env; #else wchar_t *env; (void) _wgetenv(L"windows"); /* populate _wenviron */ #endif MVM_gc_root_temp_push(tc, (MVMCollectable **)&needle); env_hash = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_hash_type); MVM_gc_root_temp_push(tc, (MVMCollectable **)&env_hash); #ifndef _WIN32 while ((env = environ[pos++]) != NULL) { MVMString *str = MVM_string_utf8_c8_decode(tc, instance->VMString, env, strlen(env)); #else while ((env = _wenviron[pos++]) != NULL) { char * const _env = UnicodeToUTF8(env); MVMString *str = MVM_string_utf8_c8_decode(tc, instance->VMString, _env, strlen(_env)); #endif MVMuint32 index = MVM_string_index(tc, str, needle, 0); MVMString *key, *val; MVMObject *box; #ifdef _WIN32 MVM_free(_env); #endif MVM_gc_root_temp_push(tc, (MVMCollectable **)&str); key = MVM_string_substring(tc, str, 0, index); MVM_gc_root_temp_push(tc, (MVMCollectable **)&key); val = MVM_string_substring(tc, str, index + 1, -1); box = MVM_repr_box_str(tc, MVM_hll_current(tc)->str_box_type, val); MVM_repr_bind_key_o(tc, env_hash, key, box); MVM_gc_root_temp_pop_n(tc, 2); } MVM_gc_root_temp_pop_n(tc, 2); instance->env_hash = env_hash; return env_hash; } } #define INIT_ENV() do { \ MVMROOT(tc, iter, { \ MVMString * const equal = MVM_string_ascii_decode(tc, tc->instance->VMString, STR_WITH_LEN("=")); \ MVMROOT(tc, equal, { \ MVMString *env_str = NULL; \ MVMObject *iterval = NULL; \ i = 0; \ while(MVM_iter_istrue(tc, iter)) { \ MVM_repr_shift_o(tc, (MVMObject *)iter); \ env_str = MVM_string_concatenate(tc, MVM_iterkey_s(tc, iter), equal); \ iterval = MVM_iterval(tc, iter); \ env_str = MVM_string_concatenate(tc, env_str, MVM_repr_get_str(tc, iterval)); \ _env[i++] = MVM_string_utf8_c8_encode_C_string(tc, env_str); \ } \ _env[size] = NULL; \ }); \ }); \ } while (0) #define FREE_ENV() do { \ i = 0; \ while(_env[i]) \ MVM_free(_env[i++]); \ MVM_free(_env); \ } while (0) /* Data that we keep for an asynchronous process handle. */ typedef struct { /* The libuv handle to the process. */ uv_process_t *handle; /* The async task handle, provided we're running. */ MVMObject *async_task; /* The exit signal to send, if any. */ MVMint64 signal; } MVMIOAsyncProcessData; typedef enum { STATE_UNSTARTED, STATE_STARTED, STATE_DONE } ProcessState; /* Info we convey about an async spawn task. */ typedef struct { MVMThreadContext *tc; int work_idx; MVMObject *handle; MVMObject *callbacks; char *prog; char *cwd; char **env; char **args; uv_stream_t *stdin_handle; MVMuint32 seq_stdout; MVMuint32 seq_stderr; MVMuint32 seq_merge; MVMint64 permit_stdout; MVMint64 permit_stderr; MVMint64 permit_merge; uv_pipe_t *pipe_stdout; uv_pipe_t *pipe_stderr; int reading_stdout; int reading_stderr; ProcessState state; int using; int merge; size_t last_read; } SpawnInfo; /* Info we convey about a write task. */ typedef struct { MVMOSHandle *handle; MVMObject *buf_data; uv_write_t *req; uv_buf_t buf; MVMThreadContext *tc; int work_idx; } SpawnWriteInfo; /* Completion handler for an asynchronous write. */ static void on_write(uv_write_t *req, int status) { SpawnWriteInfo *wi = (SpawnWriteInfo *)req->data; MVMThreadContext *tc = wi->tc; MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = MVM_io_eventloop_get_active_work(tc, wi->work_idx); MVM_repr_push_o(tc, arr, t->body.schedulee); if (status >= 0) { MVMROOT2(tc, arr, t, { MVMObject *bytes_box = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, wi->buf.len); MVM_repr_push_o(tc, arr, bytes_box); }); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); } else { MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); MVMROOT2(tc, arr, t, { MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, uv_strerror(status)); MVMObject *msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); MVM_repr_push_o(tc, arr, msg_box); }); } MVM_repr_push_o(tc, t->body.queue, arr); MVM_io_eventloop_remove_active_work(tc, &(wi->work_idx)); MVM_free(wi->req); } /* Does setup work for an asynchronous write. */ static void write_setup(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { MVMIOAsyncProcessData *handle_data; MVMAsyncTask *spawn_task; MVMArray *buffer; SpawnInfo *si; char *output; int output_size, r; /* Add to work in progress. */ SpawnWriteInfo *wi = (SpawnWriteInfo *)data; wi->tc = tc; wi->work_idx = MVM_io_eventloop_add_active_work(tc, async_task); /* Extract buf data. */ buffer = (MVMArray *)wi->buf_data; output = (char *)(buffer->body.slots.i8 + buffer->body.start); output_size = (int)buffer->body.elems; /* Create and initialize write request. */ wi->req = MVM_malloc(sizeof(uv_write_t)); wi->buf = uv_buf_init(output, output_size); wi->req->data = data; handle_data = (MVMIOAsyncProcessData *)wi->handle->body.data; spawn_task = (MVMAsyncTask *)handle_data->async_task; si = spawn_task ? (SpawnInfo *)spawn_task->body.data : NULL; if (!si || !si->stdin_handle || (r = uv_write(wi->req, si->stdin_handle, &(wi->buf), 1, on_write)) < 0) { /* Error; need to notify. */ MVMROOT(tc, async_task, { MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = (MVMAsyncTask *)async_task; MVM_repr_push_o(tc, arr, t->body.schedulee); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); MVMROOT(tc, arr, { MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, (si && si->stdin_handle ? uv_strerror(r) : "This process is not opened for write")); MVMObject *msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); MVM_repr_push_o(tc, arr, msg_box); }); MVM_repr_push_o(tc, t->body.queue, arr); }); /* Cleanup handle. */ MVM_free(wi->req); wi->req = NULL; } } /* Marks objects for a write task. */ static void write_gc_mark(MVMThreadContext *tc, void *data, MVMGCWorklist *worklist) { SpawnWriteInfo *wi = (SpawnWriteInfo *)data; MVM_gc_worklist_add(tc, worklist, &wi->handle); MVM_gc_worklist_add(tc, worklist, &wi->buf_data); } /* Frees info for a write task. */ static void write_gc_free(MVMThreadContext *tc, MVMObject *t, void *data) { if (data) MVM_free(data); } /* Operations table for async write task. */ static const MVMAsyncTaskOps write_op_table = { write_setup, NULL, NULL, write_gc_mark, write_gc_free }; static MVMAsyncTask * write_bytes(MVMThreadContext *tc, MVMOSHandle *h, MVMObject *queue, MVMObject *schedulee, MVMObject *buffer, MVMObject *async_type) { MVMAsyncTask *task; SpawnWriteInfo *wi; /* Validate REPRs. */ if (REPR(queue)->ID != MVM_REPR_ID_ConcBlockingQueue) MVM_exception_throw_adhoc(tc, "asyncwritebytes target queue must have ConcBlockingQueue REPR"); if (REPR(async_type)->ID != MVM_REPR_ID_MVMAsyncTask) MVM_exception_throw_adhoc(tc, "asyncwritebytes result type must have REPR AsyncTask"); if (!IS_CONCRETE(buffer) || REPR(buffer)->ID != MVM_REPR_ID_VMArray) MVM_exception_throw_adhoc(tc, "asyncwritebytes requires a native array to read from"); if (((MVMArrayREPRData *)STABLE(buffer)->REPR_data)->slot_type != MVM_ARRAY_U8 && ((MVMArrayREPRData *)STABLE(buffer)->REPR_data)->slot_type != MVM_ARRAY_I8) MVM_exception_throw_adhoc(tc, "asyncwritebytes requires a native array of uint8 or int8"); /* Create async task handle. */ MVMROOT4(tc, queue, schedulee, h, buffer, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, async_type); }); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.queue, queue); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.schedulee, schedulee); task->body.ops = &write_op_table; wi = MVM_calloc(1, sizeof(SpawnWriteInfo)); MVM_ASSIGN_REF(tc, &(task->common.header), wi->handle, h); MVM_ASSIGN_REF(tc, &(task->common.header), wi->buf_data, buffer); task->body.data = wi; /* Hand the task off to the event loop. */ MVMROOT(tc, task, { MVM_io_eventloop_queue_work(tc, (MVMObject *)task); }); return task; } /* Marks an async handle. */ static void proc_async_gc_mark(MVMThreadContext *tc, void *data, MVMGCWorklist *worklist) { MVMIOAsyncProcessData *apd = (MVMIOAsyncProcessData *)data; if (data) MVM_gc_worklist_add(tc, worklist, &(apd->async_task)); } /* Does an asynchronous close (since it must run on the event loop). */ static void close_cb(uv_handle_t *handle) { MVM_free(handle); } static void close_perform(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { uv_close((uv_handle_t *)data, close_cb); } /* Operations table for async close task. */ static const MVMAsyncTaskOps close_op_table = { close_perform, NULL, NULL, NULL, NULL }; static void deferred_close_perform(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data); static const MVMAsyncTaskOps deferred_close_op_table = { deferred_close_perform, NULL, NULL, NULL, NULL }; static MVMint64 close_stdin(MVMThreadContext *tc, MVMOSHandle *h) { MVMIOAsyncProcessData *handle_data = (MVMIOAsyncProcessData *)h->body.data; MVMAsyncTask *spawn_task = (MVMAsyncTask *)handle_data->async_task; SpawnInfo *si = spawn_task ? (SpawnInfo *)spawn_task->body.data : NULL; if (si && si->state == STATE_UNSTARTED) { MVMAsyncTask *task; MVMROOT(tc, h, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTAsync); }); task->body.ops = &deferred_close_op_table; task->body.data = si; MVM_io_eventloop_queue_work(tc, (MVMObject *)task); return 0; } if (si && si->stdin_handle) { MVMAsyncTask *task; MVMROOT(tc, h, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTAsync); }); task->body.ops = &close_op_table; task->body.data = si->stdin_handle; MVM_io_eventloop_queue_work(tc, (MVMObject *)task); si->stdin_handle = NULL; } return 0; } static void deferred_close_perform(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { SpawnInfo *si = (SpawnInfo *) data; MVMOSHandle *h = (MVMOSHandle *) si->handle; if (si->state == STATE_UNSTARTED) { MVMAsyncTask *task; MVMROOT(tc, h, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTAsync); }); task->body.ops = &deferred_close_op_table; task->body.data = si; MVM_io_eventloop_queue_work(tc, (MVMObject *)task); return; } if (si->stdin_handle) { close_stdin(tc, h); } } MVMObject * get_async_task_handle(MVMThreadContext *tc, MVMOSHandle *h) { MVMIOAsyncProcessData *handle_data = (MVMIOAsyncProcessData *)h->body.data; return handle_data->async_task; } /* IO ops table, for async process, populated with functions. */ static const MVMIOAsyncWritable proc_async_writable = { write_bytes }; static const MVMIOClosable closable = { close_stdin }; static const MVMIOOps proc_op_table = { &closable, NULL, NULL, NULL, &proc_async_writable, NULL, NULL, NULL, get_async_task_handle, NULL, NULL, NULL, proc_async_gc_mark, NULL }; static void spawn_async_close(uv_handle_t *handle) { MVM_free(handle); } static void async_spawn_on_exit(uv_process_t *req, MVMint64 exit_status, int term_signal) { /* Check we've got a callback to fire. */ SpawnInfo *si = (SpawnInfo *)req->data; MVMThreadContext *tc = si->tc; MVMObject *done_cb = MVM_repr_at_key_o(tc, si->callbacks, tc->instance->str_consts.done); MVMOSHandle *os_handle; if (!MVM_is_null(tc, done_cb)) { MVMROOT(tc, done_cb, { /* Get status. */ MVMint64 status = (exit_status << 8) | term_signal; /* Get what we'll need to build and convey the result. */ MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = MVM_io_eventloop_get_active_work(tc, si->work_idx); /* Box and send along status. */ MVM_repr_push_o(tc, arr, done_cb); MVMROOT2(tc, arr, t, { MVMObject *result_box = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, status); MVM_repr_push_o(tc, arr, result_box); }); MVM_repr_push_o(tc, t->body.queue, arr); }); } /* when invoked via MVMIOOps, close_stdin is already wrapped in a mutex */ os_handle = (MVMOSHandle *) si->handle; uv_mutex_lock(os_handle->body.mutex); si->state = STATE_DONE; close_stdin(tc, os_handle); uv_mutex_unlock(os_handle->body.mutex); /* Close handle. */ uv_close((uv_handle_t *)req, spawn_async_close); ((MVMIOAsyncProcessData *)((MVMOSHandle *)si->handle)->body.data)->handle = NULL; if (--si->using == 0) MVM_io_eventloop_remove_active_work(tc, &(si->work_idx)); } /* Allocates a buffer of the suggested size. */ static void on_alloc(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf) { SpawnInfo *si = (SpawnInfo *)handle->data; size_t size = si->last_read ? si->last_read : 64; if (size < 128) { size = 128; } else { size = MVM_bithacks_next_greater_pow2(size + 1); } buf->base = MVM_malloc(size); buf->len = size; } /* Read functions for stdout/stderr/merged. */ static void async_read(uv_stream_t *handle, ssize_t nread, const uv_buf_t *buf, SpawnInfo *si, MVMObject *callback, MVMuint32 seq_number, MVMint64 *permit) { MVMThreadContext *tc = si->tc; MVMObject *arr; MVMAsyncTask *t; MVMROOT(tc, callback, { arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); t = MVM_io_eventloop_get_active_work(tc, si->work_idx); }); MVM_repr_push_o(tc, arr, callback); if (nread >= 0) { MVMROOT2(tc, t, arr, { /* Push the sequence number. */ MVMObject *seq_boxed = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, seq_number); MVM_repr_push_o(tc, arr, seq_boxed); /* Push buffer of data. */ { MVMObject *buf_type = MVM_repr_at_key_o(tc, si->callbacks, tc->instance->str_consts.buf_type); MVMArray *res_buf = (MVMArray *)MVM_repr_alloc_init(tc, buf_type); res_buf->body.slots.i8 = (MVMint8 *)buf->base; res_buf->body.start = 0; res_buf->body.ssize = buf->len; res_buf->body.elems = nread; MVM_repr_push_o(tc, arr, (MVMObject *)res_buf); } /* Finally, no error. */ MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); /* Update handle with amount read. */ si->last_read = nread; /* Update permit count, stop reading if we run out. */ if (permit > 0) { (*permit)--; if (*permit == 0) { uv_read_stop(handle); if (handle == (uv_stream_t *)si->pipe_stdout) si->reading_stdout = 0; else if (handle == (uv_stream_t *)si->pipe_stderr) si->reading_stderr = 0; else MVM_panic(1, "Confused stopping reading async process handle"); } } }); } else if (nread == UV_EOF) { MVMROOT2(tc, t, arr, { MVMObject *final = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, seq_number); MVM_repr_push_o(tc, arr, final); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); }); if (buf->base) MVM_free(buf->base); uv_close((uv_handle_t *)handle, NULL); if (--si->using == 0) MVM_io_eventloop_remove_active_work(tc, &(si->work_idx)); } else { MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVMROOT2(tc, t, arr, { MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, uv_strerror(nread)); MVMObject *msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); MVM_repr_push_o(tc, arr, msg_box); }); if (buf->base) MVM_free(buf->base); uv_close((uv_handle_t *)handle, NULL); if (--si->using == 0) MVM_io_eventloop_remove_active_work(tc, &(si->work_idx)); } MVM_repr_push_o(tc, t->body.queue, arr); } static void async_spawn_stdout_bytes_read(uv_stream_t *handle, ssize_t nread, const uv_buf_t *buf) { SpawnInfo *si = (SpawnInfo *)handle->data; MVMObject *cb = MVM_repr_at_key_o(si->tc, si->callbacks, si->tc->instance->str_consts.stdout_bytes); async_read(handle, nread, buf, si, cb, si->seq_stdout++, &(si->permit_stdout)); } static void async_spawn_stderr_bytes_read(uv_stream_t *handle, ssize_t nread, const uv_buf_t *buf) { SpawnInfo *si = (SpawnInfo *)handle->data; MVMObject *cb = MVM_repr_at_key_o(si->tc, si->callbacks, si->tc->instance->str_consts.stderr_bytes); async_read(handle, nread, buf, si, cb, si->seq_stderr++, &(si->permit_stderr)); } static void async_spawn_merge_bytes_read(uv_stream_t *handle, ssize_t nread, const uv_buf_t *buf) { SpawnInfo *si = (SpawnInfo *)handle->data; MVMObject *cb = MVM_repr_at_key_o(si->tc, si->callbacks, si->tc->instance->str_consts.merge_bytes); async_read(handle, nread, buf, si, cb, si->seq_merge++, &(si->permit_merge)); } /* Actually spawns an async task. This runs in the event loop thread. */ static MVMint64 get_pipe_fd(MVMThreadContext *tc, uv_pipe_t *pipe) { uv_os_fd_t fd; if (uv_fileno((uv_handle_t *)pipe, &fd) == 0) return (MVMint64)fd; else return 0; } static void spawn_setup(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { MVMint64 spawn_result; /* Process info setup. */ uv_process_t *process = MVM_calloc(1, sizeof(uv_process_t)); uv_process_options_t process_options = {0}; uv_stdio_container_t process_stdio[3]; /* Add to work in progress. */ SpawnInfo *si = (SpawnInfo *)data; si->tc = tc; si->work_idx = MVM_io_eventloop_add_active_work(tc, async_task); si->using = 1; /* Create input/output handles as needed. */ if (MVM_repr_exists_key(tc, si->callbacks, tc->instance->str_consts.write)) { uv_pipe_t *pipe = MVM_malloc(sizeof(uv_pipe_t)); uv_pipe_init(tc->loop, pipe, 0); pipe->data = si; process_stdio[0].flags = UV_CREATE_PIPE | UV_READABLE_PIPE; process_stdio[0].data.stream = (uv_stream_t *)pipe; si->stdin_handle = (uv_stream_t *)pipe; } else if (MVM_repr_exists_key(tc, si->callbacks, tc->instance->str_consts.stdin_fd)) { process_stdio[0].flags = UV_INHERIT_FD; process_stdio[0].data.fd = (int)MVM_repr_get_int(tc, MVM_repr_at_key_o(tc, si->callbacks, tc->instance->str_consts.stdin_fd)); } else { process_stdio[0].flags = UV_INHERIT_FD; process_stdio[0].data.fd = 0; } if (MVM_repr_exists_key(tc, si->callbacks, tc->instance->str_consts.merge_bytes)) { si->pipe_stdout = MVM_malloc(sizeof(uv_pipe_t)); uv_pipe_init(tc->loop, si->pipe_stdout, 0); si->pipe_stdout->data = si; process_stdio[1].flags = UV_CREATE_PIPE | UV_WRITABLE_PIPE; process_stdio[1].data.stream = (uv_stream_t *)si->pipe_stdout; si->pipe_stderr = MVM_malloc(sizeof(uv_pipe_t)); uv_pipe_init(tc->loop, si->pipe_stderr, 0); si->pipe_stderr->data = si; process_stdio[2].flags = UV_CREATE_PIPE | UV_WRITABLE_PIPE; process_stdio[2].data.stream = (uv_stream_t *)si->pipe_stderr; si->merge = 1; si->using += 2; } else { if (MVM_repr_exists_key(tc, si->callbacks, tc->instance->str_consts.stdout_bytes)) { si->pipe_stdout = MVM_malloc(sizeof(uv_pipe_t)); uv_pipe_init(tc->loop, si->pipe_stdout, 0); si->pipe_stdout->data = si; process_stdio[1].flags = UV_CREATE_PIPE | UV_WRITABLE_PIPE; process_stdio[1].data.stream = (uv_stream_t *)si->pipe_stdout; si->using++; } else if (MVM_repr_exists_key(tc, si->callbacks, tc->instance->str_consts.stdout_fd)) { process_stdio[1].flags = UV_INHERIT_FD; process_stdio[1].data.fd = (int)MVM_repr_get_int(tc, MVM_repr_at_key_o(tc, si->callbacks, tc->instance->str_consts.stdout_fd)); } else { process_stdio[1].flags = UV_INHERIT_FD; process_stdio[1].data.fd = 1; } if (MVM_repr_exists_key(tc, si->callbacks, tc->instance->str_consts.stderr_bytes)) { si->pipe_stderr = MVM_malloc(sizeof(uv_pipe_t)); uv_pipe_init(tc->loop, si->pipe_stderr, 0); si->pipe_stderr->data = si; process_stdio[2].flags = UV_CREATE_PIPE | UV_WRITABLE_PIPE; process_stdio[2].data.stream = (uv_stream_t *)si->pipe_stderr; si->using++; } else if (MVM_repr_exists_key(tc, si->callbacks, tc->instance->str_consts.stderr_fd)) { process_stdio[2].flags = UV_INHERIT_FD; process_stdio[2].data.fd = (int)MVM_repr_get_int(tc, MVM_repr_at_key_o(tc, si->callbacks, tc->instance->str_consts.stderr_fd)); } else { process_stdio[2].flags = UV_INHERIT_FD; process_stdio[2].data.fd = 2; } } /* Set up process start info. */ process_options.stdio = process_stdio; process_options.file = si->prog; process_options.args = si->args; process_options.cwd = si->cwd; process_options.flags = UV_PROCESS_WINDOWS_HIDE; process_options.env = si->env; process_options.stdio_count = 3; process_options.exit_cb = async_spawn_on_exit; /* Attach data, spawn, report any error. */ process->data = si; spawn_result = uv_spawn(tc->loop, process, &process_options); if (spawn_result) { MVMObject *msg_box = NULL; si->state = STATE_DONE; MVMROOT2(tc, async_task, msg_box, { MVMObject *error_cb; MVMString *msg_str = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, uv_strerror(spawn_result)); msg_box = MVM_repr_box_str(tc, tc->instance->boot_types.BOOTStr, msg_str); error_cb = MVM_repr_at_key_o(tc, si->callbacks, tc->instance->str_consts.error); if (!MVM_is_null(tc, error_cb)) { MVMROOT(tc, error_cb, { MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVM_repr_push_o(tc, arr, error_cb); MVM_repr_push_o(tc, arr, msg_box); MVM_repr_push_o(tc, ((MVMAsyncTask *)async_task)->body.queue, arr); }); } if (si->pipe_stdout) { MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMObject *cb = MVM_repr_at_key_o(tc, si->callbacks, tc->instance->str_consts.stdout_bytes); MVM_repr_push_o(tc, arr, cb); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVM_repr_push_o(tc, arr, msg_box); MVM_repr_push_o(tc, ((MVMAsyncTask *)async_task)->body.queue, arr); } if (si->pipe_stderr) { MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMObject *cb = MVM_repr_at_key_o(tc, si->callbacks, tc->instance->str_consts.stderr_bytes); MVM_repr_push_o(tc, arr, cb); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTInt); MVM_repr_push_o(tc, arr, tc->instance->boot_types.BOOTStr); MVM_repr_push_o(tc, arr, msg_box); MVM_repr_push_o(tc, ((MVMAsyncTask *)async_task)->body.queue, arr); } }); MVM_io_eventloop_remove_active_work(tc, &(si->work_idx)); } else { MVMOSHandle *handle = (MVMOSHandle *)si->handle; MVMIOAsyncProcessData *apd = (MVMIOAsyncProcessData *)handle->body.data; MVMObject *ready_cb; apd->handle = process; ready_cb = MVM_repr_at_key_o(tc, si->callbacks, tc->instance->str_consts.ready); si->state = STATE_STARTED; if (!MVM_is_null(tc, ready_cb)) { MVMROOT2(tc, ready_cb, async_task, { MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMROOT(tc, arr, { MVMObject *handle_arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTIntArray); MVM_repr_push_i(tc, handle_arr, si->pipe_stdout ? get_pipe_fd(tc, si->pipe_stdout) : -1); MVM_repr_push_i(tc, handle_arr, si->pipe_stderr ? get_pipe_fd(tc, si->pipe_stderr) : -1); MVM_repr_push_o(tc, arr, ready_cb); MVM_repr_push_o(tc, arr, handle_arr); MVM_repr_push_o(tc, ((MVMAsyncTask *)async_task)->body.queue, arr); }); }); } } } /* Permits provide the back-pressure mechanism for the readers. */ static void spawn_permit(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data, MVMint64 channel, MVMint64 permits) { SpawnInfo *si = (SpawnInfo *)data; if (si->work_idx < 0) return; if (channel == 0 && si->pipe_stdout && si->pipe_stderr && si->merge) { if (permits < 0) si->permit_merge = -1; else if (si->permit_merge < 0) si->permit_merge = permits; else si->permit_merge += permits; if (!si->reading_stdout && si->permit_merge) { uv_read_start((uv_stream_t *)si->pipe_stdout, on_alloc, async_spawn_merge_bytes_read); uv_read_start((uv_stream_t *)si->pipe_stderr, on_alloc, async_spawn_merge_bytes_read); si->reading_stdout = 1; si->reading_stderr = 1; } else if (si->reading_stdout && !si->permit_merge) { uv_read_stop((uv_stream_t *)si->pipe_stdout); uv_read_stop((uv_stream_t *)si->pipe_stderr); si->reading_stdout = 0; si->reading_stderr = 0; } } else if (channel == 1 && si->pipe_stdout && !si->merge) { if (permits < 0) si->permit_stdout = -1; else if (si->permit_stdout < 0) si->permit_stdout = permits; else si->permit_stdout += permits; if (!si->reading_stdout && si->permit_stdout) { uv_read_start((uv_stream_t *)si->pipe_stdout, on_alloc, async_spawn_stdout_bytes_read); si->reading_stdout = 1; } else if (si->reading_stdout && !si->permit_stdout) { uv_read_stop((uv_stream_t *)si->pipe_stdout); si->reading_stdout = 0; } } else if (channel == 2 && si->pipe_stderr && !si->merge) { if (permits < 0) si->permit_stderr = -1; else if (si->permit_stderr < 0) si->permit_stderr = permits; else si->permit_stderr += permits; if (!si->reading_stderr && si->permit_stderr) { uv_read_start((uv_stream_t *)si->pipe_stderr, on_alloc, async_spawn_stderr_bytes_read); si->reading_stderr = 1; } else if (si->reading_stderr && !si->permit_stderr) { uv_read_stop((uv_stream_t *)si->pipe_stderr); si->reading_stderr = 0; } } } /* On cancel, kill the process. */ static void spawn_cancel(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { /* Locate handle. */ SpawnInfo *si = (SpawnInfo *)data; MVMOSHandle *handle = (MVMOSHandle *)si->handle; MVMIOAsyncProcessData *apd = (MVMIOAsyncProcessData *)handle->body.data; uv_process_t *phandle = apd->handle; /* If it didn't already end, try to kill it. exit_cb will clean up phandle * should the signal lead to process exit. */ if (phandle) { #ifdef _WIN32 /* On Windows, make sure we use a signal that will actually work. */ if (apd->signal != SIGTERM && apd->signal != SIGKILL && apd->signal != SIGINT) apd->signal = SIGKILL; #endif uv_process_kill(phandle, (int)apd->signal); } } /* Marks objects for a spawn task. */ static void spawn_gc_mark(MVMThreadContext *tc, void *data, MVMGCWorklist *worklist) { SpawnInfo *si = (SpawnInfo *)data; MVM_gc_worklist_add(tc, worklist, &si->handle); MVM_gc_worklist_add(tc, worklist, &si->callbacks); } /* Frees info for a spawn task. */ static void spawn_gc_free(MVMThreadContext *tc, MVMObject *t, void *data) { if (data) { SpawnInfo *si = (SpawnInfo *)data; if (si->cwd) { MVM_free(si->cwd); si->cwd = NULL; } if (si->env) { MVMuint32 i; char **_env = si->env; FREE_ENV(); si->env = NULL; } if (si->args) { MVMuint32 i = 0; while (si->args[i]) MVM_free(si->args[i++]); MVM_free(si->args); si->args = NULL; } MVM_free(si); } } /* Operations table for async connect task. */ static const MVMAsyncTaskOps spawn_op_table = { spawn_setup, spawn_permit, spawn_cancel, spawn_gc_mark, spawn_gc_free }; /* Spawn a process asynchronously. */ MVMObject * MVM_proc_spawn_async(MVMThreadContext *tc, MVMObject *queue, MVMObject *argv, MVMString *cwd, MVMObject *env, MVMObject *callbacks) { MVMAsyncTask *task; MVMOSHandle *handle; SpawnInfo *si; char *prog, *_cwd, **_env, **args; MVMuint64 size, arg_size, i; MVMIter *iter; MVMRegister reg; /* Validate queue REPR. */ if (REPR(queue)->ID != MVM_REPR_ID_ConcBlockingQueue) MVM_exception_throw_adhoc(tc, "spawnprocasync target queue must have ConcBlockingQueue REPR"); /* Encode arguments, taking first as program name. */ arg_size = MVM_repr_elems(tc, argv); if (arg_size < 1) MVM_exception_throw_adhoc(tc, "spawnprocasync must have first arg for program"); args = MVM_malloc((arg_size + 1) * sizeof(char *)); for (i = 0; i < arg_size; i++) { REPR(argv)->pos_funcs.at_pos(tc, STABLE(argv), argv, OBJECT_BODY(argv), i, ®, MVM_reg_obj); args[i] = MVM_string_utf8_c8_encode_C_string(tc, MVM_repr_get_str(tc, reg.o)); } args[arg_size] = NULL; prog = args[0]; /* Encode CWD. */ _cwd = MVM_string_utf8_c8_encode_C_string(tc, cwd); MVMROOT3(tc, queue, env, callbacks, { MVMIOAsyncProcessData *data; /* Encode environment. */ size = MVM_repr_elems(tc, env); iter = (MVMIter *)MVM_iter(tc, env); _env = MVM_malloc((size + 1) * sizeof(char *)); INIT_ENV(); /* Create handle. */ data = MVM_calloc(1, sizeof(MVMIOAsyncProcessData)); handle = (MVMOSHandle *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTIO); handle->body.ops = &proc_op_table; handle->body.data = data; /* Create async task handle. */ MVMROOT(tc, handle, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTAsync); }); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.queue, queue); task->body.ops = &spawn_op_table; si = MVM_calloc(1, sizeof(SpawnInfo)); si->prog = prog; si->cwd = _cwd; si->env = _env; si->args = args; si->state = STATE_UNSTARTED; MVM_ASSIGN_REF(tc, &(task->common.header), si->handle, handle); MVM_ASSIGN_REF(tc, &(task->common.header), si->callbacks, callbacks); task->body.data = si; MVM_ASSIGN_REF(tc, &(handle->common.header), data->async_task, task); }); /* Hand the task off to the event loop. */ MVMROOT(tc, handle, { MVM_io_eventloop_queue_work(tc, (MVMObject *)task); }); return (MVMObject *)handle; } /* Kills an asynchronously spawned process. */ void MVM_proc_kill_async(MVMThreadContext *tc, MVMObject *handle_obj, MVMint64 signal) { /* Ensure it's a handle for a process. */ if (REPR(handle_obj)->ID == MVM_REPR_ID_MVMOSHandle) { MVMOSHandle *handle = (MVMOSHandle *)handle_obj; if (handle->body.ops == &proc_op_table) { /* It's fine; send the kill by cancelling the task. */ MVMIOAsyncProcessData *data = (MVMIOAsyncProcessData *)handle->body.data; data->signal = signal; MVM_io_eventloop_cancel_work(tc, data->async_task, NULL, NULL); return; } } MVM_exception_throw_adhoc(tc, "killprocasync requires a process handle"); } /* Get the current process ID. */ MVMint64 MVM_proc_getpid(MVMThreadContext *tc) { #ifdef _WIN32 return _getpid(); #else return getpid(); #endif } /* Get the process ID of the parent process */ MVMint64 MVM_proc_getppid(MVMThreadContext *tc) { return uv_os_getppid(); } /* generates a random int64 */ MVMint64 MVM_proc_rand_i(MVMThreadContext *tc) { MVMuint64 result = tinymt64_generate_uint64(tc->rand_state); return *(MVMint64 *)&result; } /* generates a number between 0 and 1 */ MVMnum64 MVM_proc_rand_n(MVMThreadContext *tc) { return tinymt64_generate_double(tc->rand_state); } MVMnum64 MVM_proc_randscale_n(MVMThreadContext *tc, MVMnum64 scale) { return tinymt64_generate_double(tc->rand_state) * scale; } /* seed random number generator */ void MVM_proc_seed(MVMThreadContext *tc, MVMint64 seed) { /* Seed our one, plus the normal C srand for libtommath. */ tinymt64_init(tc->rand_state, (MVMuint64)seed); /* do not call srand if we are not using rand */ #ifndef MP_USE_ALT_RAND srand((MVMuint32)seed); #endif } /* gets the system time since the epoch truncated to integral seconds */ MVMint64 MVM_proc_time_i(MVMThreadContext *tc) { return (MVMint64)(MVM_platform_now() / 1000000000); } /* gets the system time since the epoch as floating point seconds */ MVMnum64 MVM_proc_time_n(MVMThreadContext *tc) { return (MVMnum64)MVM_platform_now() / 1000000000.0; } MVMString * MVM_executable_name(MVMThreadContext *tc) { MVMInstance * const instance = tc->instance; if (instance->exec_name) return MVM_string_utf8_c8_decode(tc, instance->VMString, instance->exec_name, strlen(instance->exec_name)); else return tc->instance->str_consts.empty; } MVMObject * MVM_proc_clargs(MVMThreadContext *tc) { MVMInstance * const instance = tc->instance; MVMObject *clargs = instance->clargs; if (!clargs) { clargs = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_array_type); #ifndef _WIN32 MVMROOT(tc, clargs, { const MVMint64 num_clargs = instance->num_clargs; MVMint64 count; MVMString *prog_string = MVM_string_utf8_c8_decode(tc, instance->VMString, instance->prog_name, strlen(instance->prog_name)); MVMObject *boxed_str = MVM_repr_box_str(tc, instance->boot_types.BOOTStr, prog_string); MVM_repr_push_o(tc, clargs, boxed_str); for (count = 0; count < num_clargs; count++) { char *raw_clarg = instance->raw_clargs[count]; MVMString *string = MVM_string_utf8_c8_decode(tc, instance->VMString, raw_clarg, strlen(raw_clarg)); boxed_str = MVM_repr_box_str(tc, instance->boot_types.BOOTStr, string); MVM_repr_push_o(tc, clargs, boxed_str); } }); #else MVMROOT(tc, clargs, { const MVMint64 num_clargs = instance->num_clargs; MVMint64 count; MVMString *prog_string = MVM_string_utf8_c8_decode(tc, instance->VMString, instance->prog_name, strlen(instance->prog_name)); MVMObject *boxed_str = MVM_repr_box_str(tc, instance->boot_types.BOOTStr, prog_string); MVM_repr_push_o(tc, clargs, boxed_str); for (count = 0; count < num_clargs; count++) { char *raw_clarg = instance->raw_clargs[count]; MVMString *string = MVM_string_utf8_c8_decode(tc, instance->VMString, raw_clarg, strlen(raw_clarg)); boxed_str = MVM_repr_box_str(tc, instance->boot_types.BOOTStr, string); MVM_repr_push_o(tc, clargs, boxed_str); } }); #endif instance->clargs = clargs; } return clargs; } /* Gets resource usage statistics, so far as they are portably available (see * libuv docs) and puts them into an integer array. */ MVMObject * MVM_proc_getrusage(MVMThreadContext *tc) { MVMObject *result; uv_rusage_t usage; int r; if ((r = uv_getrusage(&usage)) > 0) MVM_exception_throw_adhoc(tc, "Unable to getrusage: %s", uv_strerror(r)); result = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTIntArray); MVM_repr_bind_pos_i(tc, result, 0, usage.ru_utime.tv_sec); MVM_repr_bind_pos_i(tc, result, 1, usage.ru_utime.tv_usec); MVM_repr_bind_pos_i(tc, result, 2, usage.ru_stime.tv_sec); MVM_repr_bind_pos_i(tc, result, 3, usage.ru_stime.tv_usec); MVM_repr_bind_pos_i(tc, result, 4, usage.ru_maxrss); MVM_repr_bind_pos_i(tc, result, 5, usage.ru_ixrss); MVM_repr_bind_pos_i(tc, result, 6, usage.ru_idrss); MVM_repr_bind_pos_i(tc, result, 7, usage.ru_isrss); MVM_repr_bind_pos_i(tc, result, 8, usage.ru_minflt); MVM_repr_bind_pos_i(tc, result, 9, usage.ru_majflt); MVM_repr_bind_pos_i(tc, result, 10, usage.ru_nswap); MVM_repr_bind_pos_i(tc, result, 11, usage.ru_inblock); MVM_repr_bind_pos_i(tc, result, 12, usage.ru_oublock); MVM_repr_bind_pos_i(tc, result, 13, usage.ru_msgsnd); MVM_repr_bind_pos_i(tc, result, 14, usage.ru_msgrcv); MVM_repr_bind_pos_i(tc, result, 15, usage.ru_nsignals); MVM_repr_bind_pos_i(tc, result, 16, usage.ru_nvcsw); MVM_repr_bind_pos_i(tc, result, 17, usage.ru_nivcsw); return result; } MoarVM-2018.03/src/io/procops.h0000644000175000017510000000262613243752707016257 0ustar samanthasamantha#define MVM_PIPE_INHERIT 1 #define MVM_PIPE_IGNORE 2 #define MVM_PIPE_CAPTURE 4 #define MVM_PIPE_INHERIT_IN 1 #define MVM_PIPE_IGNORE_IN 2 #define MVM_PIPE_CAPTURE_IN 4 #define MVM_PIPE_INHERIT_OUT 8 #define MVM_PIPE_IGNORE_OUT 16 #define MVM_PIPE_CAPTURE_OUT 32 #define MVM_PIPE_INHERIT_ERR 64 #define MVM_PIPE_IGNORE_ERR 128 #define MVM_PIPE_CAPTURE_ERR 256 #define MVM_PIPE_MERGED_OUT_ERR 512 MVMObject * MVM_proc_getenvhash(MVMThreadContext *tc); MVMObject * MVM_proc_spawn_async(MVMThreadContext *tc, MVMObject *queue, MVMObject *args, MVMString *cwd, MVMObject *env, MVMObject *callbacks); void MVM_proc_kill_async(MVMThreadContext *tc, MVMObject *handle, MVMint64 signal); MVMint64 MVM_proc_getpid(MVMThreadContext *tc); MVMint64 MVM_proc_getppid(MVMThreadContext *tc); MVMint64 MVM_proc_rand_i(MVMThreadContext *tc); MVMnum64 MVM_proc_rand_n(MVMThreadContext *tc); MVMnum64 MVM_proc_randscale_n(MVMThreadContext *tc, MVMnum64 scale); void MVM_proc_seed(MVMThreadContext *tc, MVMint64 seed); MVMint64 MVM_proc_time_i(MVMThreadContext *tc); MVMObject * MVM_proc_clargs(MVMThreadContext *tc); MVMnum64 MVM_proc_time_n(MVMThreadContext *tc); MVMString * MVM_executable_name(MVMThreadContext *tc); MVMObject * MVM_proc_getrusage(MVMThreadContext *tc); #ifdef _WIN32 #include MVM_PUBLIC char ** MVM_UnicodeToUTF8_argv(const int argc, wchar_t **argv); #endif MoarVM-2018.03/src/io/signals.c0000644000175000017510000001406713250636753016227 0ustar samanthasamantha#include "moar.h" #include #ifdef _WIN32 #define SIGHUP 1 #define SIGKILL 9 #define SIGWINCH 28 #endif /* Info we convey about a signal handler. */ typedef struct { int signum; uv_signal_t handle; MVMThreadContext *tc; int work_idx; } SignalInfo; /* Signal callback; dispatches schedulee to the queue. */ static void signal_cb(uv_signal_t *handle, int sig_num) { SignalInfo *si = (SignalInfo *)handle->data; MVMThreadContext *tc = si->tc; MVMObject *arr = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMAsyncTask *t = MVM_io_eventloop_get_active_work(tc, si->work_idx); MVM_repr_push_o(tc, arr, t->body.schedulee); MVMROOT2(tc, t, arr, { MVMObject *sig_num_boxed = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, sig_num); MVM_repr_push_o(tc, arr, sig_num_boxed); }); MVM_repr_push_o(tc, t->body.queue, arr); } /* Sets the signal handler up on the event loop. */ static void setup(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { SignalInfo *si = (SignalInfo *)data; uv_signal_init(loop, &si->handle); si->work_idx = MVM_io_eventloop_add_active_work(tc, async_task); si->tc = tc; si->handle.data = si; uv_signal_start(&si->handle, signal_cb, si->signum); } static void cancel(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { SignalInfo *si = (SignalInfo *)data; if (si->work_idx >= 0) { if (!uv_is_closing((uv_handle_t *)&(si->handle))) uv_signal_stop(&si->handle); MVM_io_eventloop_remove_active_work(tc, &(si->work_idx)); } } /* Frees data associated with a timer async task. */ static void gc_free(MVMThreadContext *tc, MVMObject *t, void *data) { if (data) MVM_free(data); } /* Operations table for async timer task. */ static const MVMAsyncTaskOps op_table = { setup, NULL, cancel, NULL, gc_free }; /* Creates a new timer. */ MVMObject * MVM_io_signal_handle(MVMThreadContext *tc, MVMObject *queue, MVMObject *schedulee, MVMint64 signal, MVMObject *async_type) { MVMAsyncTask *task; SignalInfo *signal_info; int signum; /* Transform the signal number. */ switch (signal) { case MVM_SIG_HUP: signum = SIGHUP; break; case MVM_SIG_INT: signum = SIGINT; break; #ifdef SIGQUIT case MVM_SIG_QUIT: signum = SIGQUIT; break; #endif #ifdef SIGILL case MVM_SIG_ILL: signum = SIGILL; break; #endif #ifdef SIGTRAP case MVM_SIG_TRAP: signum = SIGTRAP; break; #endif #ifdef SIGABRT case MVM_SIG_ABRT: signum = SIGABRT; break; #endif #ifdef SIGEMT case MVM_SIG_EMT: signum = SIGEMT; break; #endif #ifdef SIGFPE case MVM_SIG_FPE: signum = SIGFPE; break; #endif #ifdef SIGKILL case MVM_SIG_KILL: signum = SIGKILL; break; #endif #ifdef SIGBUS case MVM_SIG_BUS: signum = SIGBUS; break; #endif #ifdef SIGSEGV case MVM_SIG_SEGV: signum = SIGSEGV; break; #endif #ifdef SIGSYS case MVM_SIG_SYS: signum = SIGSYS; break; #endif #ifdef SIGPIPE case MVM_SIG_PIPE: signum = SIGPIPE; break; #endif #ifdef SIGALRM case MVM_SIG_ALRM: signum = SIGALRM; break; #endif #ifdef SIGTERM case MVM_SIG_TERM: signum = SIGTERM; break; #endif #ifdef SIGURG case MVM_SIG_URG: signum = SIGURG; break; #endif #ifdef SIGSTOP case MVM_SIG_STOP: signum = SIGSTOP; break; /* hammer time */ #endif #ifdef SIGTSTP case MVM_SIG_TSTP: signum = SIGTSTP; break; #endif #ifdef SIGCONT case MVM_SIG_CONT: signum = SIGCONT; break; #endif #ifdef SIGCHLD case MVM_SIG_CHLD: signum = SIGCHLD; break; #endif #ifdef SIGTTIN case MVM_SIG_TTIN: signum = SIGTTIN; break; #endif #ifdef SIGTTOU case MVM_SIG_TTOU: signum = SIGTTOU; break; #endif #ifdef SIGIO case MVM_SIG_IO: signum = SIGIO; break; #endif #ifdef SIGXCPU case MVM_SIG_XCPU: signum = SIGXCPU; break; #endif #ifdef SIGXFSZ case MVM_SIG_XFSZ: signum = SIGXFSZ; break; #endif #ifdef SIGVTALRM case MVM_SIG_VTALRM: signum = SIGVTALRM; break; #endif #ifdef SIGPROF case MVM_SIG_PROF: signum = SIGPROF; break; #endif #ifdef SIGWINCH case MVM_SIG_WINCH: signum = SIGWINCH; break; #endif #ifdef SIGINFO case MVM_SIG_INFO: signum = SIGINFO; break; #endif #ifdef SIGUSR1 case MVM_SIG_USR1: signum = SIGUSR1; break; #endif #ifdef SIGUSR2 case MVM_SIG_USR2: signum = SIGUSR2; break; #endif #ifdef SIGTHR case MVM_SIG_THR: signum = SIGTHR; break; #endif #ifdef SIGSTKFLT case MVM_SIG_STKFLT: signum = SIGSTKFLT; break; #endif #ifdef SIGPWR case MVM_SIG_PWR: signum = SIGPWR; break; #endif #ifdef SIGBREAK case MVM_SIG_BREAK: signum = SIGBREAK; break; #endif default: MVM_exception_throw_adhoc(tc, "Unsupported signal handler %d", (int)signal); } /* Validate REPRs. */ if (REPR(queue)->ID != MVM_REPR_ID_ConcBlockingQueue) MVM_exception_throw_adhoc(tc, "signal target queue must have ConcBlockingQueue REPR"); if (REPR(async_type)->ID != MVM_REPR_ID_MVMAsyncTask) MVM_exception_throw_adhoc(tc, "signal result type must have REPR AsyncTask"); /* Create async task handle. */ MVMROOT2(tc, queue, schedulee, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, async_type); }); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.queue, queue); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.schedulee, schedulee); task->body.ops = &op_table; signal_info = MVM_malloc(sizeof(SignalInfo)); signal_info->signum = signum; task->body.data = signal_info; /* Hand the task off to the event loop. */ MVMROOT(tc, task, { MVM_io_eventloop_queue_work(tc, (MVMObject *)task); }); return (MVMObject *)task; } MoarVM-2018.03/src/io/signals.h0000644000175000017510000000232313237701240016211 0ustar samanthasamantha/* MoarVM platform-independent signal values. */ /* these match the BSD/Darwin values */ #define MVM_SIG_HUP 1 #define MVM_SIG_INT 2 #define MVM_SIG_QUIT 3 #define MVM_SIG_ILL 4 #define MVM_SIG_TRAP 5 #define MVM_SIG_ABRT 6 #define MVM_SIG_EMT 7 #define MVM_SIG_FPE 8 #define MVM_SIG_KILL 9 #define MVM_SIG_BUS 10 #define MVM_SIG_SEGV 11 #define MVM_SIG_SYS 12 #define MVM_SIG_PIPE 13 #define MVM_SIG_ALRM 14 #define MVM_SIG_TERM 15 #define MVM_SIG_URG 16 #define MVM_SIG_STOP 17 /* hammer time */ #define MVM_SIG_TSTP 18 #define MVM_SIG_CONT 19 #define MVM_SIG_CHLD 20 #define MVM_SIG_TTIN 21 #define MVM_SIG_TTOU 22 #define MVM_SIG_IO 23 #define MVM_SIG_XCPU 24 #define MVM_SIG_XFSZ 25 #define MVM_SIG_VTALRM 26 #define MVM_SIG_PROF 27 #define MVM_SIG_WINCH 28 #define MVM_SIG_INFO 29 #define MVM_SIG_USR1 30 #define MVM_SIG_USR2 31 #define MVM_SIG_THR 32 /* linux overloads */ #define MVM_SIG_STKFLT 116 #define MVM_SIG_PWR 130 /* windows overloads */ #define MVM_SIG_BREAK 221 MVMObject * MVM_io_signal_handle(MVMThreadContext *tc, MVMObject *queue, MVMObject *schedulee, MVMint64 signal, MVMObject *async_type); MoarVM-2018.03/src/io/syncfile.c0000644000175000017510000003775413243116442016401 0ustar samanthasamantha#include "moar.h" #include "platform/io.h" #ifndef _WIN32 #include #include #define DEFAULT_MODE 0x01B6 typedef struct stat STAT; #else #include #include #define O_CREAT _O_CREAT #define O_RDONLY _O_RDONLY #define O_WRONLY _O_WRONLY #define O_TRUNC _O_TRUNC #define O_EXCL _O_EXCL #define O_RDWR _O_RDWR #define DEFAULT_MODE _S_IWRITE #define open _open #define close _close #define read _read #define write _write #define isatty _isatty #define ftruncate _chsize #define fstat _fstat typedef struct _stat STAT; #endif /* Data that we keep for a file-based handle. */ typedef struct { /* File descriptor. */ int fd; /* Is it seekable? */ short seekable; /* Is it known to be writable? */ short known_writable; /* How many bytes have we read/written? Used to fake tell on handles that * are not seekable. */ MVMint64 byte_position; /* Did read already report EOF? */ int eof_reported; /* Output buffer, for buffered output. */ char *output_buffer; /* Size of the output buffer, for buffered output; 0 if not buffering. */ size_t output_buffer_size; /* How much of the output buffer has been used so far. */ size_t output_buffer_used; } MVMIOFileData; /* Checks if the file is a TTY. */ static MVMint64 is_tty(MVMThreadContext *tc, MVMOSHandle *h) { MVMIOFileData *data = (MVMIOFileData *)h->body.data; return isatty(data->fd); } /* Gets the file descriptor. */ static MVMint64 mvm_fileno(MVMThreadContext *tc, MVMOSHandle *h) { MVMIOFileData *data = (MVMIOFileData *)h->body.data; return (MVMint64)data->fd; } /* Performs a write, either because a buffer filled or because we are not * buffering output. */ static void perform_write(MVMThreadContext *tc, MVMIOFileData *data, char *buf, MVMint64 bytes) { MVMint64 bytes_written = 0; MVM_gc_mark_thread_blocked(tc); while (bytes > 0) { int r; do { r = write(data->fd, buf, (int)bytes); } while (r == -1 && errno == EINTR); if (r == -1) { int save_errno = errno; MVM_gc_mark_thread_unblocked(tc); MVM_exception_throw_adhoc(tc, "Failed to write bytes to filehandle: %s", strerror(save_errno)); } bytes_written += r; buf += r; bytes -= r; } MVM_gc_mark_thread_unblocked(tc); data->byte_position += bytes_written; data->known_writable = 1; } /* Flushes any existing output buffer and clears use back to 0. */ static void flush_output_buffer(MVMThreadContext *tc, MVMIOFileData *data) { if (data->output_buffer_used) { perform_write(tc, data, data->output_buffer, data->output_buffer_used); data->output_buffer_used = 0; } } /* Seek to the specified position in the file. */ static void seek(MVMThreadContext *tc, MVMOSHandle *h, MVMint64 offset, MVMint64 whence) { MVMIOFileData *data = (MVMIOFileData *)h->body.data; if (!data->seekable) MVM_exception_throw_adhoc(tc, "It is not possible to seek this kind of handle"); flush_output_buffer(tc, data); if (MVM_platform_lseek(data->fd, offset, whence) == -1) MVM_exception_throw_adhoc(tc, "Failed to seek in filehandle: %d", errno); } /* Get current position in the file. */ static MVMint64 mvm_tell(MVMThreadContext *tc, MVMOSHandle *h) { MVMIOFileData *data = (MVMIOFileData *)h->body.data; flush_output_buffer(tc, data); if (data->seekable) { MVMint64 r; if ((r = MVM_platform_lseek(data->fd, 0, SEEK_CUR)) == -1) MVM_exception_throw_adhoc(tc, "Failed to tell in filehandle: %d", errno); return r; } else { return data->byte_position; } } /* Reads the specified number of bytes into the supplied buffer, returning * the number actually read. */ static MVMint64 read_bytes(MVMThreadContext *tc, MVMOSHandle *h, char **buf_out, MVMint64 bytes) { MVMIOFileData *data = (MVMIOFileData *)h->body.data; char *buf = MVM_malloc(bytes); unsigned int interval_id = MVM_telemetry_interval_start(tc, "syncfile.read_to_buffer"); MVMint32 bytes_read; #ifdef _WIN32 /* Can only perform relatively small reads from a Windows console; * trying to do larger ones gives back ENOMEM, most likely due to * limitations of the Windows console subsystem. */ if (bytes > 16387 && _isatty(data->fd)) bytes = 16387; #endif flush_output_buffer(tc, data); do { MVM_gc_mark_thread_blocked(tc); bytes_read = read(data->fd, buf, bytes); MVM_gc_mark_thread_unblocked(tc); } while(bytes_read == -1 && errno == EINTR); if (bytes_read == -1) { int save_errno = errno; MVM_free(buf); MVM_exception_throw_adhoc(tc, "Reading from filehandle failed: %s", strerror(save_errno)); } *buf_out = buf; MVM_telemetry_interval_annotate(bytes_read, interval_id, "read this many bytes"); MVM_telemetry_interval_stop(tc, interval_id, "syncfile.read_to_buffer"); data->byte_position += bytes_read; if (bytes_read == 0 && bytes != 0) data->eof_reported = 1; return bytes_read; } /* Checks if the end of file has been reached. */ static MVMint64 mvm_eof(MVMThreadContext *tc, MVMOSHandle *h) { MVMIOFileData *data = (MVMIOFileData *)h->body.data; if (data->seekable) { MVMint64 seek_pos; STAT statbuf; if (fstat(data->fd, &statbuf) == -1) MVM_exception_throw_adhoc(tc, "Failed to stat file descriptor: %s", strerror(errno)); if ((seek_pos = MVM_platform_lseek(data->fd, 0, SEEK_CUR)) == -1) MVM_exception_throw_adhoc(tc, "Failed to seek in filehandle: %d", errno); /* For some special files, like those in /proc, the file size is 0, * so in those cases, fall back to eof_reported flag to detect EOF. */ return statbuf.st_size ? statbuf.st_size <= seek_pos : data->eof_reported; } else { return data->eof_reported; } } /* Sets the output buffer size; if <= 0, means no buffering. Flushes any * existing buffer before changing. */ static void set_buffer_size(MVMThreadContext *tc, MVMOSHandle *h, MVMint64 size) { MVMIOFileData *data = (MVMIOFileData *)h->body.data; /* Flush and clear up any existing output buffer. */ flush_output_buffer(tc, data); MVM_free(data->output_buffer); /* Set up new buffer if needed. */ if (size > 0) { data->output_buffer_size = size; data->output_buffer = MVM_malloc(size); } else { data->output_buffer_size = 0; data->output_buffer = NULL; } } /* Writes the specified bytes to the file handle. */ static MVMint64 write_bytes(MVMThreadContext *tc, MVMOSHandle *h, char *buf, MVMint64 bytes) { MVMIOFileData *data = (MVMIOFileData *)h->body.data; if (data->output_buffer_size && data->known_writable) { /* If we can't fit it on the end of the buffer, flush the buffer. */ if (data->output_buffer_used + bytes > data->output_buffer_size) flush_output_buffer(tc, data); /* If we can fit it in the buffer now, memcpy it there, and we're * done. */ if (bytes < data->output_buffer_size) { memcpy(data->output_buffer + data->output_buffer_used, buf, bytes); data->output_buffer_used += bytes; return bytes; } } perform_write(tc, data, buf, bytes); return bytes; } /* Flushes the file handle. */ static void flush(MVMThreadContext *tc, MVMOSHandle *h, MVMint32 sync){ MVMIOFileData *data = (MVMIOFileData *)h->body.data; flush_output_buffer(tc, data); if (sync) { if (MVM_platform_fsync(data->fd) == -1) { /* If this is something that can't be flushed, we let that pass. */ if (errno != EROFS && errno != EINVAL #ifdef WSL_BASH_ON_WIN && ! (errno == EIO && ! data->seekable) /* Bash on Win10 doesn't seem to handle TTYs right when flushing: * https://github.com/borgbackup/borg/issues/1961#issuecomment-335653560 */ #endif ) MVM_exception_throw_adhoc(tc, "Failed to flush filehandle: %s", strerror(errno)); } } } /* Truncates the file handle. */ static void truncatefh(MVMThreadContext *tc, MVMOSHandle *h, MVMint64 bytes) { MVMIOFileData *data = (MVMIOFileData *)h->body.data; if (ftruncate(data->fd, bytes) == -1) MVM_exception_throw_adhoc(tc, "Failed to truncate filehandle: %s", strerror(errno)); } /* Closes the file. */ static MVMint64 closefh(MVMThreadContext *tc, MVMOSHandle *h) { MVMIOFileData *data = (MVMIOFileData *)h->body.data; if (data->fd != -1) { int r; flush_output_buffer(tc, data); MVM_free(data->output_buffer); data->output_buffer = NULL; r = close(data->fd); data->fd = -1; if (r == -1) MVM_exception_throw_adhoc(tc, "Failed to close filehandle: %s", strerror(errno)); } return 0; } /* Locks a file. */ static MVMint64 lock(MVMThreadContext *tc, MVMOSHandle *h, MVMint64 flag) { MVMIOFileData *data = (MVMIOFileData *)h->body.data; #ifdef _WIN32 const DWORD len = 0xffffffff; const HANDLE hf = (HANDLE)_get_osfhandle(data->fd); OVERLAPPED offset; if (hf == INVALID_HANDLE_VALUE) { MVM_exception_throw_adhoc(tc, "Failed to lock filehandle: bad file descriptor"); } flag = ((flag & MVM_FILE_FLOCK_NONBLOCK) ? LOCKFILE_FAIL_IMMEDIATELY : 0) + ((flag & MVM_FILE_FLOCK_TYPEMASK) == MVM_FILE_FLOCK_SHARED ? 0 : LOCKFILE_EXCLUSIVE_LOCK); memset (&offset, 0, sizeof(offset)); MVM_gc_mark_thread_blocked(tc); if (LockFileEx(hf, flag, 0, len, len, &offset)) { MVM_gc_mark_thread_unblocked(tc); return 1; } MVM_gc_mark_thread_unblocked(tc); MVM_exception_throw_adhoc(tc, "Failed to lock filehandle: %d", GetLastError()); return 0; #else struct flock l; ssize_t r; int fc; const int fd = data->fd; l.l_whence = SEEK_SET; l.l_start = 0; l.l_len = 0; if ((flag & MVM_FILE_FLOCK_TYPEMASK) == MVM_FILE_FLOCK_SHARED) l.l_type = F_RDLCK; else l.l_type = F_WRLCK; fc = (flag & MVM_FILE_FLOCK_NONBLOCK) ? F_SETLK : F_SETLKW; do { MVM_gc_mark_thread_blocked(tc); r = fcntl(fd, fc, &l); MVM_gc_mark_thread_unblocked(tc); } while (r == -1 && errno == EINTR); if (r == -1) { MVM_exception_throw_adhoc(tc, "Failed to lock filehandle: %d", errno); } return 1; #endif } /* Unlocks a file. */ static void unlock(MVMThreadContext *tc, MVMOSHandle *h) { MVMIOFileData *data = (MVMIOFileData *)h->body.data; #ifdef _WIN32 const DWORD len = 0xffffffff; const HANDLE hf = (HANDLE)_get_osfhandle(data->fd); OVERLAPPED offset; if (hf == INVALID_HANDLE_VALUE) { MVM_exception_throw_adhoc(tc, "Failed to seek in filehandle: bad file descriptor"); } memset (&offset, 0, sizeof(offset)); MVM_gc_mark_thread_blocked(tc); if (UnlockFileEx(hf, 0, len, len, &offset)) { MVM_gc_mark_thread_unblocked(tc); return; } MVM_gc_mark_thread_unblocked(tc); MVM_exception_throw_adhoc(tc, "Failed to unlock filehandle: %d", GetLastError()); #else struct flock l; ssize_t r; const int fd = data->fd; l.l_whence = SEEK_SET; l.l_start = 0; l.l_len = 0; l.l_type = F_UNLCK; do { MVM_gc_mark_thread_blocked(tc); r = fcntl(fd, F_SETLKW, &l); MVM_gc_mark_thread_unblocked(tc); } while (r == -1 && errno == EINTR); if (r == -1) { MVM_exception_throw_adhoc(tc, "Failed to unlock filehandle: %d", errno); } #endif } /* Frees data associated with the handle. */ static void gc_free(MVMThreadContext *tc, MVMObject *h, void *d) { MVMIOFileData *data = (MVMIOFileData *)d; if (data) { MVM_free(data->output_buffer); MVM_free(data); } } /* IO ops table, populated with functions. */ static const MVMIOClosable closable = { closefh }; static const MVMIOSyncReadable sync_readable = { read_bytes, mvm_eof }; static const MVMIOSyncWritable sync_writable = { write_bytes, flush, truncatefh }; static const MVMIOSeekable seekable = { seek, mvm_tell }; static const MVMIOLockable lockable = { lock, unlock }; static const MVMIOIntrospection introspection = { is_tty, mvm_fileno }; static const MVMIOOps op_table = { &closable, &sync_readable, &sync_writable, NULL, NULL, NULL, &seekable, NULL, NULL, &lockable, &introspection, &set_buffer_size, NULL, gc_free }; /* Builds POSIX flag from mode string. */ static int resolve_open_mode(int *flag, const char *cp) { switch (*cp++) { case 'r': *flag = O_RDONLY; break; case '-': *flag = O_WRONLY; break; case '+': *flag = O_RDWR; break; /* alias for "-c" or "-ct" if by itself */ case 'w': *flag = *cp ? O_WRONLY | O_CREAT : O_WRONLY | O_CREAT | O_TRUNC; break; default: return 0; } for (;;) switch (*cp++) { case 0: return 1; case 'a': *flag |= O_APPEND; break; case 'c': *flag |= O_CREAT; break; case 't': *flag |= O_TRUNC; break; case 'x': *flag |= O_EXCL; break; default: return 0; } } /* Opens a file, returning a synchronous file handle. */ MVMObject * MVM_file_open_fh(MVMThreadContext *tc, MVMString *filename, MVMString *mode) { char * const fname = MVM_string_utf8_c8_encode_C_string(tc, filename); int fd; int flag; STAT statbuf; /* Resolve mode description to flags. */ char * const fmode = MVM_string_utf8_encode_C_string(tc, mode); if (!resolve_open_mode(&flag, fmode)) { char *waste[] = { fname, fmode, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Invalid open mode for file %s: %s", fname, fmode); } MVM_free(fmode); /* Try to open the file. */ #ifdef _WIN32 flag |= _O_BINARY; #endif if ((fd = open((const char *)fname, flag, DEFAULT_MODE)) == -1) { char *waste[] = { fname, NULL }; const char *err = strerror(errno); MVM_exception_throw_adhoc_free(tc, waste, "Failed to open file %s: %s", fname, err); } /* Check that we didn't open a directory by accident. If fstat fails, just move on: Most of the documented error cases should already have triggered when opening the file, and we can't do anything about the others; a failure also does not necessarily imply that the file descriptor cannot be used for reading/writing. */ if (fstat(fd, &statbuf) == 0 && (statbuf.st_mode & S_IFMT) == S_IFDIR) { char *waste[] = { fname, NULL }; if (close(fd) == -1) { const char *err = strerror(errno); MVM_exception_throw_adhoc_free(tc, waste, "Tried to open directory %s, which we failed to close: %s", fname, err); } MVM_exception_throw_adhoc_free(tc, waste, "Tried to open directory %s", fname); } /* Set up handle. */ MVM_free(fname); { MVMIOFileData * const data = MVM_calloc(1, sizeof(MVMIOFileData)); MVMOSHandle * const result = (MVMOSHandle *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTIO); data->fd = fd; data->seekable = MVM_platform_is_fd_seekable(fd); result->body.ops = &op_table; result->body.data = data; return (MVMObject *)result; } } /* Opens a file, returning a synchronous file handle. */ MVMObject * MVM_file_handle_from_fd(MVMThreadContext *tc, int fd) { MVMOSHandle * const result = (MVMOSHandle *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTIO); MVMIOFileData * const data = MVM_calloc(1, sizeof(MVMIOFileData)); data->fd = fd; data->seekable = MVM_platform_is_fd_seekable(fd); result->body.ops = &op_table; result->body.data = data; #ifdef _WIN32 _setmode(fd, _O_BINARY); #endif return (MVMObject *)result; } MoarVM-2018.03/src/io/syncfile.h0000644000175000017510000000024113237701240016362 0ustar samanthasamanthaMVMObject * MVM_file_open_fh(MVMThreadContext *tc, MVMString *filename, MVMString *mode); MVMObject * MVM_file_handle_from_fd(MVMThreadContext *tc, uv_file fd); MoarVM-2018.03/src/io/syncsocket.c0000644000175000017510000004212313243116442016734 0ustar samanthasamantha#include "moar.h" #ifdef _WIN32 #include #include typedef SOCKET Socket; #define sa_family_t unsigned int #else #include "unistd.h" #include #include typedef int Socket; #define closesocket close #endif #if defined(_MSC_VER) #define snprintf _snprintf #endif /* Assumed maximum packet size. If ever changing this to something beyond a * 16-bit number, then make sure to change the receive offsets in the data * structure below. */ #define PACKET_SIZE 65535 /* Error handling varies between POSIX and WinSock. */ MVM_NO_RETURN static void throw_error(MVMThreadContext *tc, int r, char *operation) MVM_NO_RETURN_GCC; #ifdef _WIN32 #define MVM_IS_SOCKET_ERROR(x) ((x) == SOCKET_ERROR) static void throw_error(MVMThreadContext *tc, int r, char *operation) { int error = WSAGetLastError(); LPTSTR error_string = NULL; if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, error, 0, (LPTSTR)&error_string, 0, NULL) == 0) { /* Couldn't get error string; throw with code. */ MVM_exception_throw_adhoc(tc, "Could not %s: error code %d", operation, error); } MVM_exception_throw_adhoc(tc, "Could not %s: %s", operation, error_string); } #else #define MVM_IS_SOCKET_ERROR(x) ((x) < 0) static void throw_error(MVMThreadContext *tc, int r, char *operation) { MVM_exception_throw_adhoc(tc, "Could not %s: %s", operation, strerror(errno)); } #endif /* Data that we keep for a socket-based handle. */ typedef struct { /* The socket handle (file descriptor on POSIX, SOCKET on Windows). */ Socket handle; /* Buffer of the last received packet of data, and start/end pointers * into the data. */ char *last_packet; MVMuint16 last_packet_start; MVMuint16 last_packet_end; /* Did we reach EOF yet? */ MVMint32 eof; /* ID for instrumentation. */ unsigned int interval_id; } MVMIOSyncSocketData; /* Read a packet worth of data into the last packet buffer. */ static void read_one_packet(MVMThreadContext *tc, MVMIOSyncSocketData *data) { unsigned int interval_id = MVM_telemetry_interval_start(tc, "syncsocket.read_one_packet"); int r; data->last_packet = MVM_malloc(PACKET_SIZE); do { MVM_gc_mark_thread_blocked(tc); r = recv(data->handle, data->last_packet, PACKET_SIZE, 0); MVM_gc_mark_thread_unblocked(tc); } while(r == -1 && errno == EINTR); MVM_telemetry_interval_stop(tc, interval_id, "syncsocket.read_one_packet"); if (MVM_IS_SOCKET_ERROR(r) || r == 0) { MVM_free(data->last_packet); data->last_packet = NULL; if (r != 0) throw_error(tc, r, "receive data from socket"); } else { data->last_packet_start = 0; data->last_packet_end = r; } } MVMint64 socket_read_bytes(MVMThreadContext *tc, MVMOSHandle *h, char **buf, MVMint64 bytes) { MVMIOSyncSocketData *data = (MVMIOSyncSocketData *)h->body.data; char *use_last_packet = NULL; MVMuint16 use_last_packet_start, use_last_packet_end; /* If at EOF, nothing more to do. */ if (data->eof) { *buf = NULL; return 0; } /* See if there's anything in the packet buffer. */ if (data->last_packet) { MVMuint16 last_remaining = data->last_packet_end - data->last_packet_start; if (bytes <= last_remaining) { /* There's enough, and it's sufficient for the request. Extract it * and return, discarding the last packet buffer if we drain it. */ *buf = MVM_malloc(bytes); memcpy(*buf, data->last_packet + data->last_packet_start, bytes); if (bytes == last_remaining) { MVM_free(data->last_packet); data->last_packet = NULL; } else { data->last_packet_start += bytes; } return bytes; } else { /* Something, but not enough. Take the last packet for use, then * we'll read another one. */ use_last_packet = data->last_packet; use_last_packet_start = data->last_packet_start; use_last_packet_end = data->last_packet_end; data->last_packet = NULL; } } /* If we get here, we need to read another packet. */ read_one_packet(tc, data); /* Now assemble the result. */ if (data->last_packet && use_last_packet) { /* Need to assemble it from two places. */ MVMuint32 last_available = use_last_packet_end - use_last_packet_start; MVMuint32 available = last_available + data->last_packet_end; if (bytes > available) bytes = available; *buf = MVM_malloc(bytes); memcpy(*buf, use_last_packet + use_last_packet_start, last_available); memcpy(*buf + last_available, data->last_packet, bytes - last_available); if (bytes == available) { /* We used all of the just-read packet. */ MVM_free(data->last_packet); data->last_packet = NULL; } else { /* Still something left in the just-read packet for next time. */ data->last_packet_start += bytes - last_available; } } else if (data->last_packet) { /* Only data from the just-read packet. */ if (bytes >= data->last_packet_end) { /* We need all of it, so no copying needed, just hand it back. */ *buf = data->last_packet; bytes = data->last_packet_end; data->last_packet = NULL; } else { /* Only need some of it. */ *buf = MVM_malloc(bytes); memcpy(*buf, data->last_packet, bytes); data->last_packet_start += bytes; } } else if (use_last_packet) { /* Nothing read this time, so at the end. Drain previous packet data * and mark EOF. */ bytes = use_last_packet_end - use_last_packet_start; *buf = MVM_malloc(bytes); memcpy(*buf, use_last_packet + use_last_packet_start, bytes); data->eof = 1; } else { /* Nothing to hand back; at EOF. */ *buf = NULL; bytes = 0; data->eof = 1; } return bytes; } /* Checks if EOF has been reached on the incoming data. */ MVMint64 socket_eof(MVMThreadContext *tc, MVMOSHandle *h) { MVMIOSyncSocketData *data = (MVMIOSyncSocketData *)h->body.data; return data->eof; } void socket_flush(MVMThreadContext *tc, MVMOSHandle *h, MVMint32 sync) { /* A no-op for sockets; we don't buffer. */ } void socket_truncate(MVMThreadContext *tc, MVMOSHandle *h, MVMint64 bytes) { MVM_exception_throw_adhoc(tc, "Cannot truncate a socket"); } /* Writes the specified bytes to the stream. */ MVMint64 socket_write_bytes(MVMThreadContext *tc, MVMOSHandle *h, char *buf, MVMint64 bytes) { MVMIOSyncSocketData *data = (MVMIOSyncSocketData *)h->body.data; MVMint64 sent = 0; unsigned int interval_id; interval_id = MVM_telemetry_interval_start(tc, "syncsocket.write_bytes"); MVM_gc_mark_thread_blocked(tc); while (bytes > 0) { int r; do { r = send(data->handle, buf, (int)bytes, 0); } while(r == -1 && errno == EINTR); if (MVM_IS_SOCKET_ERROR(r)) { MVM_gc_mark_thread_unblocked(tc); MVM_telemetry_interval_stop(tc, interval_id, "syncsocket.write_bytes"); throw_error(tc, r, "send data to socket"); } sent += r; buf += r; bytes -= r; } MVM_gc_mark_thread_unblocked(tc); MVM_telemetry_interval_annotate(bytes, interval_id, "written this many bytes"); MVM_telemetry_interval_stop(tc, interval_id, "syncsocket.write_bytes"); return bytes; } static MVMint64 do_close(MVMThreadContext *tc, MVMIOSyncSocketData *data) { if (data->handle) { closesocket(data->handle); data->handle = 0; } return 0; } static MVMint64 close_socket(MVMThreadContext *tc, MVMOSHandle *h) { return do_close(tc, (MVMIOSyncSocketData *)h->body.data); } static void gc_free(MVMThreadContext *tc, MVMObject *h, void *d) { MVMIOSyncSocketData *data = (MVMIOSyncSocketData *)d; do_close(tc, data); MVM_free(data); } static size_t get_struct_size_for_family(sa_family_t family) { switch (family) { case AF_INET6: return sizeof(struct sockaddr_in6); case AF_INET: return sizeof(struct sockaddr_in); #ifndef _WIN32 case AF_UNIX: return sizeof(struct sockaddr_un); #endif default: return sizeof(struct sockaddr); } } /* This function may return any type of sockaddr e.g. sockaddr_un, sockaddr_in or sockaddr_in6 * It shouldn't be a problem with general code as long as the port number is kept below the int16 limit: 65536 * After this it defines the family which may spawn non internet sockaddr's * The family can be extracted by (port >> 16) & USHORT_MAX * * Currently supported families: * * AF_UNSPEC = 1 * Unspecified, in most cases should be equal to AF_INET or AF_INET6 * * AF_UNIX = 1 * Unix domain socket, will spawn a sockaddr_un which will use the given host as path * e.g: MVM_io_resolve_host_name(tc, "/run/moarvm.sock", 1 << 16) * will spawn an unix domain socket on /run/moarvm.sock * * AF_INET = 2 * IPv4 socket * * AF_INET6 = 10 * IPv6 socket */ struct sockaddr * MVM_io_resolve_host_name(MVMThreadContext *tc, MVMString *host, MVMint64 port) { char *host_cstr = MVM_string_utf8_encode_C_string(tc, host); struct sockaddr *dest; int error; struct addrinfo *result; char port_cstr[8]; unsigned short family = (port >> 16) & USHRT_MAX; struct addrinfo hints; #ifndef _WIN32 /* AF_UNIX = 1 */ if (family == AF_UNIX) { struct sockaddr_un *result_un = MVM_malloc(sizeof(struct sockaddr_un)); if (strlen(host_cstr) > 107) { MVM_free(result_un); MVM_free(host_cstr); MVM_exception_throw_adhoc(tc, "Socket path can only be maximal 107 characters long"); } result_un->sun_family = AF_UNIX; strcpy(result_un->sun_path, host_cstr); MVM_free(host_cstr); return (struct sockaddr *)result_un; } #endif hints.ai_family = family; hints.ai_socktype = 0; hints.ai_flags = AI_PASSIVE; hints.ai_protocol = 0; hints.ai_addrlen = 0; hints.ai_addr = NULL; hints.ai_canonname = NULL; hints.ai_next = NULL; snprintf(port_cstr, 8, "%d", (int)port); error = getaddrinfo(host_cstr, port_cstr, &hints, &result); if (error == 0) { size_t size = get_struct_size_for_family(result->ai_addr->sa_family); MVM_free(host_cstr); dest = MVM_malloc(size); memcpy(dest, result->ai_addr, size); } else { char *waste[] = { host_cstr, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Failed to resolve host name '%s' with family %d. Error: '%s'", host_cstr, family, gai_strerror(error)); } freeaddrinfo(result); return dest; } /* Establishes a connection. */ static void socket_connect(MVMThreadContext *tc, MVMOSHandle *h, MVMString *host, MVMint64 port) { MVMIOSyncSocketData *data = (MVMIOSyncSocketData *)h->body.data; unsigned int interval_id; interval_id = MVM_telemetry_interval_start(tc, "syncsocket connect"); if (!data->handle) { struct sockaddr *dest = MVM_io_resolve_host_name(tc, host, port); int r; Socket s = socket(dest->sa_family , SOCK_STREAM , 0); if (MVM_IS_SOCKET_ERROR(s)) { MVM_free(dest); MVM_telemetry_interval_stop(tc, interval_id, "syncsocket connect"); throw_error(tc, s, "create socket"); } do { MVM_gc_mark_thread_blocked(tc); r = connect(s, dest, (socklen_t)get_struct_size_for_family(dest->sa_family)); MVM_gc_mark_thread_unblocked(tc); } while(r == -1 && errno == EINTR); MVM_free(dest); if (MVM_IS_SOCKET_ERROR(r)) { MVM_telemetry_interval_stop(tc, interval_id, "syncsocket connect"); throw_error(tc, s, "connect socket"); } data->handle = s; } else { MVM_telemetry_interval_stop(tc, interval_id, "syncsocket didn't connect"); MVM_exception_throw_adhoc(tc, "Socket is already bound or connected"); } } static void socket_bind(MVMThreadContext *tc, MVMOSHandle *h, MVMString *host, MVMint64 port, MVMint32 backlog) { MVMIOSyncSocketData *data = (MVMIOSyncSocketData *)h->body.data; if (!data->handle) { struct sockaddr *dest = MVM_io_resolve_host_name(tc, host, port); int r; Socket s = socket(dest->sa_family , SOCK_STREAM , 0); if (MVM_IS_SOCKET_ERROR(s)) { MVM_free(dest); throw_error(tc, s, "create socket"); } /* On POSIX, we set the SO_REUSEADDR option, which allows re-use of * a port in TIME_WAIT state (modulo many hair details). Oringinally, * MoarVM used libuv, which does this automatically on non-Windows. * We have tests with bring up a server, then take it down, and then * bring another up on the same port, and we get test failures due * to racing to re-use the port without this. */ #ifndef _WIN32 { int one = 1; setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); } #endif r = bind(s, dest, (socklen_t)get_struct_size_for_family(dest->sa_family)); MVM_free(dest); if (MVM_IS_SOCKET_ERROR(r)) throw_error(tc, s, "bind socket"); r = listen(s, (int)backlog); if (MVM_IS_SOCKET_ERROR(r)) throw_error(tc, s, "start listening on socket"); data->handle = s; } else { MVM_exception_throw_adhoc(tc, "Socket is already bound or connected"); } } MVMint64 socket_getport(MVMThreadContext *tc, MVMOSHandle *h) { MVMIOSyncSocketData *data = (MVMIOSyncSocketData *)h->body.data; struct sockaddr_storage name; int error; socklen_t len = sizeof(struct sockaddr_storage); MVMint64 port = 0; error = getsockname(data->handle, (struct sockaddr *) &name, &len); if (error != 0) MVM_exception_throw_adhoc(tc, "Failed to getsockname: %s", strerror(errno)); switch (name.ss_family) { case AF_INET6: port = ntohs((*( struct sockaddr_in6 *) &name).sin6_port); break; case AF_INET: port = ntohs((*( struct sockaddr_in *) &name).sin_port); break; } return port; } static MVMObject * socket_accept(MVMThreadContext *tc, MVMOSHandle *h); /* IO ops table, populated with functions. */ static const MVMIOClosable closable = { close_socket }; static const MVMIOSyncReadable sync_readable = { socket_read_bytes, socket_eof }; static const MVMIOSyncWritable sync_writable = { socket_write_bytes, socket_flush, socket_truncate }; static const MVMIOSockety sockety = { socket_connect, socket_bind, socket_accept, socket_getport }; static const MVMIOOps op_table = { &closable, &sync_readable, &sync_writable, NULL, NULL, NULL, NULL, &sockety, NULL, NULL, NULL, NULL, NULL, gc_free }; static MVMObject * socket_accept(MVMThreadContext *tc, MVMOSHandle *h) { MVMIOSyncSocketData *data = (MVMIOSyncSocketData *)h->body.data; Socket s; unsigned int interval_id = MVM_telemetry_interval_start(tc, "syncsocket accept"); do { MVM_gc_mark_thread_blocked(tc); s = accept(data->handle, NULL, NULL); MVM_gc_mark_thread_unblocked(tc); } while(s == -1 && errno == EINTR); if (MVM_IS_SOCKET_ERROR(s)) { MVM_telemetry_interval_stop(tc, interval_id, "syncsocket accept failed"); throw_error(tc, s, "accept socket connection"); } else { MVMOSHandle * const result = (MVMOSHandle *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTIO); MVMIOSyncSocketData * const data = MVM_calloc(1, sizeof(MVMIOSyncSocketData)); data->handle = s; result->body.ops = &op_table; result->body.data = data; MVM_telemetry_interval_stop(tc, interval_id, "syncsocket accept succeeded"); return (MVMObject *)result; } } MVMObject * MVM_io_socket_create(MVMThreadContext *tc, MVMint64 listen) { MVMOSHandle * const result = (MVMOSHandle *)MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTIO); MVMIOSyncSocketData * const data = MVM_calloc(1, sizeof(MVMIOSyncSocketData)); result->body.ops = &op_table; result->body.data = data; return (MVMObject *)result; } MVMString * MVM_io_get_hostname(MVMThreadContext *tc) { char hostname[65]; gethostname(hostname, 65); return MVM_string_ascii_decode_nt(tc, tc->instance->VMString, hostname); } MoarVM-2018.03/src/io/syncsocket.h0000644000175000017510000000034213237701240016735 0ustar samanthasamanthaMVMObject * MVM_io_socket_create(MVMThreadContext *tc, MVMint64 listen); struct sockaddr * MVM_io_resolve_host_name(MVMThreadContext *tc, MVMString *host, MVMint64 port); MVMString * MVM_io_get_hostname(MVMThreadContext *tc); MoarVM-2018.03/src/io/timers.c0000644000175000017510000000714313243116442016055 0ustar samanthasamantha#include "moar.h" /* Info we convey about a timer. */ typedef struct { int timeout; int repeat; uv_timer_t *handle; MVMThreadContext *tc; int work_idx; } TimerInfo; /* Frees the timer's handle memory. */ static void free_timer(uv_handle_t *handle) { MVM_free(handle); } /* Timer callback; dispatches schedulee to the queue. */ static void timer_cb(uv_timer_t *handle) { TimerInfo *ti = (TimerInfo *)handle->data; MVMThreadContext *tc = ti->tc; MVMAsyncTask *t = MVM_io_eventloop_get_active_work(tc, ti->work_idx); MVM_repr_push_o(tc, t->body.queue, t->body.schedulee); if (!ti->repeat && ti->work_idx >= 0) { /* The timer will only fire once. Having now fired, stop the callback, * clean up the handle, and remove the active work so that we will not * hold on to the callback and its associated memory. */ uv_timer_stop(ti->handle); uv_close((uv_handle_t *)ti->handle, free_timer); MVM_io_eventloop_remove_active_work(tc, &(ti->work_idx)); } } /* Sets the timer up on the event loop. */ static void setup(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { TimerInfo *ti = (TimerInfo *)data; ti->handle = MVM_malloc(sizeof(uv_timer_t)); uv_timer_init(loop, ti->handle); ti->work_idx = MVM_io_eventloop_add_active_work(tc, async_task); ti->tc = tc; ti->handle->data = ti; uv_timer_start(ti->handle, timer_cb, ti->timeout, ti->repeat); } /* Stops the timer. */ static void cancel(MVMThreadContext *tc, uv_loop_t *loop, MVMObject *async_task, void *data) { TimerInfo *ti = (TimerInfo *)data; if (ti->work_idx >= 0) { uv_timer_stop(ti->handle); uv_close((uv_handle_t *)ti->handle, free_timer); MVM_io_eventloop_send_cancellation_notification(ti->tc, MVM_io_eventloop_get_active_work(tc, ti->work_idx)); MVM_io_eventloop_remove_active_work(tc, &(ti->work_idx)); } } /* Frees data associated with a timer async task. */ static void gc_free(MVMThreadContext *tc, MVMObject *t, void *data) { if (data) MVM_free(data); } /* Operations table for async timer task. */ static const MVMAsyncTaskOps op_table = { setup, NULL, cancel, NULL, gc_free }; /* Creates a new timer. */ MVMObject * MVM_io_timer_create(MVMThreadContext *tc, MVMObject *queue, MVMObject *schedulee, MVMint64 timeout, MVMint64 repeat, MVMObject *async_type) { MVMAsyncTask *task; TimerInfo *timer_info; /* Validate REPRs. */ if (REPR(queue)->ID != MVM_REPR_ID_ConcBlockingQueue) MVM_exception_throw_adhoc(tc, "timer target queue must have ConcBlockingQueue REPR"); if (REPR(async_type)->ID != MVM_REPR_ID_MVMAsyncTask) MVM_exception_throw_adhoc(tc, "timer result type must have REPR AsyncTask"); /* Create async task handle. */ MVMROOT2(tc, queue, schedulee, { task = (MVMAsyncTask *)MVM_repr_alloc_init(tc, async_type); }); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.queue, queue); MVM_ASSIGN_REF(tc, &(task->common.header), task->body.schedulee, schedulee); task->body.ops = &op_table; timer_info = MVM_malloc(sizeof(TimerInfo)); timer_info->timeout = timeout; timer_info->repeat = repeat; task->body.data = timer_info; /* Hand the task off to the event loop, which will set up the timer on the * event loop. */ MVMROOT(tc, task, { MVM_io_eventloop_queue_work(tc, (MVMObject *)task); }); return (MVMObject *)task; } MoarVM-2018.03/src/io/timers.h0000644000175000017510000000023513237701240016054 0ustar samanthasamanthaMVMObject * MVM_io_timer_create(MVMThreadContext *tc, MVMObject *queue, MVMObject *schedulee, MVMint64 timeout, MVMint64 repeat, MVMObject *async_type); MoarVM-2018.03/src/jit/compile.c0000644000175000017510000003015413237701240016356 0ustar samanthasamantha#include "moar.h" #include "internal.h" #include "platform/mmap.h" void MVM_jit_compiler_init(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitGraph *jg); void MVM_jit_compiler_deinit(MVMThreadContext *tc, MVMJitCompiler *compiler); MVMJitCode * MVM_jit_compiler_assemble(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitGraph *jg); void MVM_jit_compile_expr_tree(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitGraph *graph, MVMJitExprTree *tree); #define COPY_ARRAY(a, n) ((n) > 0) ? memcpy(MVM_malloc((n) * sizeof(a[0])), a, (n) * sizeof(a[0])) : NULL; static const MVMuint16 MAGIC_BYTECODE[] = { MVM_OP_sp_jit_enter, 0 }; void MVM_jit_compiler_init(MVMThreadContext *tc, MVMJitCompiler *cl, MVMJitGraph *jg) { MVMint32 num_globals = MVM_jit_num_globals(); /* Create dasm state */ dasm_init(cl, 2); cl->dasm_globals = MVM_malloc(num_globals * sizeof(void*)); dasm_setupglobal(cl, cl->dasm_globals, num_globals); dasm_setup(cl, MVM_jit_actions()); /* Store graph we're compiling */ cl->graph = jg; /* next (internal) label to assign */ cl->label_offset = jg->num_labels; /* space for dynamic labels */ dasm_growpc(cl, jg->num_labels); /* Spill offset and free list */ cl->spills_base = jg->sg->num_locals * sizeof(MVMRegister); memset(cl->spills_free, -1, sizeof(cl->spills_free)); MVM_VECTOR_INIT(cl->spills, 4); } void MVM_jit_compiler_deinit(MVMThreadContext *tc, MVMJitCompiler *cl) { dasm_free(cl); MVM_free(cl->dasm_globals); MVM_VECTOR_DESTROY(cl->spills); } MVMJitCode * MVM_jit_compile_graph(MVMThreadContext *tc, MVMJitGraph *jg) { MVMJitCompiler cl; MVMJitCode *code; MVMJitNode *node = jg->first_node; MVM_jit_log(tc, "Starting compilation\n"); /* initialation */ MVM_jit_compiler_init(tc, &cl, jg); /* generate code */ MVM_jit_emit_prologue(tc, &cl, jg); while (node) { switch(node->type) { case MVM_JIT_NODE_LABEL: MVM_jit_emit_label(tc, &cl, jg, node->u.label.name); break; case MVM_JIT_NODE_PRIMITIVE: MVM_jit_emit_primitive(tc, &cl, jg, &node->u.prim); break; case MVM_JIT_NODE_BRANCH: MVM_jit_emit_block_branch(tc, &cl, jg, &node->u.branch); break; case MVM_JIT_NODE_CALL_C: MVM_jit_emit_call_c(tc, &cl, jg, &node->u.call); break; case MVM_JIT_NODE_GUARD: MVM_jit_emit_guard(tc, &cl, jg, &node->u.guard); break; case MVM_JIT_NODE_INVOKE: MVM_jit_emit_invoke(tc, &cl, jg, &node->u.invoke); break; case MVM_JIT_NODE_JUMPLIST: MVM_jit_emit_jumplist(tc, &cl, jg, &node->u.jumplist); break; case MVM_JIT_NODE_CONTROL: MVM_jit_emit_control(tc, &cl, &node->u.control, NULL); break; case MVM_JIT_NODE_EXPR_TREE: MVM_jit_compile_expr_tree(tc, &cl, jg, node->u.tree); break; case MVM_JIT_NODE_DATA: MVM_jit_emit_data(tc, &cl, &node->u.data); break; case MVM_JIT_NODE_SAVE_RV: MVM_jit_emit_save_rv(tc, &cl, node->u.stack.slot); break; } node = node->next; } MVM_jit_emit_epilogue(tc, &cl, jg); /* Generate code */ code = MVM_jit_compiler_assemble(tc, &cl, jg); /* Clear up the compiler */ MVM_jit_compiler_deinit(tc, &cl); /* Logging for insight */ if (tc->instance->jit_bytecode_dir) { MVM_jit_log_bytecode(tc, code); } if (tc->instance->jit_log_fh) fflush(tc->instance->jit_log_fh); return code; } MVMJitCode * MVM_jit_compiler_assemble(MVMThreadContext *tc, MVMJitCompiler *cl, MVMJitGraph *jg) { MVMJitCode * code; MVMint32 i; char * memory; size_t codesize; MVMint32 dasm_error = 0; /* compile the function */ if ((dasm_error = dasm_link(cl, &codesize)) != 0) { MVM_jit_log(tc, "DynASM could not link, error: %d\n", dasm_error); return NULL; } memory = MVM_platform_alloc_pages(codesize, MVM_PAGE_READ|MVM_PAGE_WRITE); if ((dasm_error = dasm_encode(cl, memory)) != 0) { MVM_jit_log(tc, "DynASM could not encode, error: %d\n", dasm_error); return NULL; } /* set memory readable + executable */ if (!MVM_platform_set_page_mode(memory, codesize, MVM_PAGE_READ|MVM_PAGE_EXEC)) { MVM_jit_log(tc, "Setting jit page executable failed or was denied. deactivating jit.\n"); /* our caller allocated the compiler and our caller must clean it up */ tc->instance->jit_enabled = 0; return NULL; } MVM_jit_log(tc, "Bytecode size: %"MVM_PRSz"\n", codesize); /* Create code segment */ code = MVM_malloc(sizeof(MVMJitCode)); code->func_ptr = (void (*)(MVMThreadContext*,MVMCompUnit*,void*)) memory; code->size = codesize; code->bytecode = (MVMuint8*)MAGIC_BYTECODE; code->sf = jg->sg->sf; code->spill_size = cl->spills_num; if (cl->spills_num > 0) { MVMint32 sg_num_locals = jg->sg->num_locals; code->num_locals = sg_num_locals + cl->spills_num; code->local_types = MVM_malloc(code->num_locals * sizeof(MVMuint16)); if (jg->sg->local_types != NULL) { memcpy(code->local_types, jg->sg->local_types, sizeof(MVMuint16)*sg_num_locals); } else { memcpy(code->local_types, code->sf->body.local_types, sizeof(MVMuint16)*sg_num_locals); } for (i = 0; i < cl->spills_num; i++) { code->local_types[sg_num_locals + i] = cl->spills[i].reg_type; } } else { code->local_types = NULL; code->num_locals = 0; } /* Get the basic block labels */ code->num_labels = jg->num_labels; code->labels = MVM_calloc(code->num_labels, sizeof(void*)); for (i = 0; i < code->num_labels; i++) { MVMint32 offset = dasm_getpclabel(cl, i); if (offset < 0) MVM_jit_log(tc, "Got negative offset for dynamic label %d\n", i); code->labels[i] = memory + offset; } /* Copy the deopts, inlines, and handlers. Because these use the * label index rather than the direct pointer, no fixup is * necessary */ code->num_deopts = jg->deopts_num; code->deopts = COPY_ARRAY(jg->deopts, jg->deopts_num); code->num_handlers = jg->handlers_num; code->handlers = COPY_ARRAY(jg->handlers, jg->handlers_alloc); code->num_inlines = jg->inlines_num; code->inlines = COPY_ARRAY(jg->inlines, jg->inlines_alloc); /* add sequence number */ code->seq_nr = tc->instance->jit_seq_nr++; return code; } void MVM_jit_destroy_code(MVMThreadContext *tc, MVMJitCode *code) { MVM_platform_free_pages(code->func_ptr, code->size); MVM_free(code->labels); MVM_free(code->deopts); MVM_free(code->handlers); MVM_free(code->inlines); MVM_free(code->local_types); MVM_free(code); } #define NYI(x) MVM_oops(tc, #x " NYI") /* pseudotile emit functions */ void MVM_jit_compile_branch(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitTile *tile, MVMJitExprTree *tree) { MVM_jit_emit_branch(tc, compiler, tile->args[0] + compiler->label_offset); } void MVM_jit_compile_conditional_branch(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitTile *tile, MVMJitExprTree *tree) { MVM_jit_emit_conditional_branch(tc, compiler, tile->args[0], tile->args[1] + compiler->label_offset); } void MVM_jit_compile_label(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitTile *tile, MVMJitExprTree *tree) { MVM_jit_emit_label(tc, compiler, tree->graph, tile->args[0] + compiler->label_offset); } void MVM_jit_compile_store(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitTile *tile, MVMJitExprTree *tree) { MVM_jit_emit_store(tc, compiler, tile->args[0], tile->args[1], MVM_JIT_STORAGE_GPR, tile->values[1], sizeof(MVMRegister)); } void MVM_jit_compile_memory_copy(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitTile *tile, MVMJitExprTree *tree) { MVM_jit_emit_load(tc, compiler, MVM_JIT_STORAGE_GPR, tile->values[1], tile->args[2], tile->args[3], sizeof(MVMRegister)); MVM_jit_emit_store(tc, compiler, tile->args[0], tile->args[1], MVM_JIT_STORAGE_GPR, tile->values[1], sizeof(MVMRegister)); } void MVM_jit_compile_move(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitTile *tile, MVMJitExprTree *tree) { MVM_jit_emit_copy(tc, compiler, MVM_JIT_STORAGE_GPR, tile->values[0], MVM_JIT_STORAGE_GPR, tile->values[1]); } void MVM_jit_compile_load(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitTile *tile, MVMJitExprTree *tree) { MVM_jit_emit_load(tc, compiler, MVM_JIT_STORAGE_GPR, tile->values[0], tile->args[0], tile->args[1], sizeof(MVMRegister)); } void MVM_jit_compile_guard(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitTile *tile, MVMJitExprTree *tree) { MVM_jit_emit_control(tc, compiler, NULL, tile); } void MVM_jit_compile_expr_tree(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitGraph *jg, MVMJitExprTree *tree) { MVMJitTileList *list; MVMJitTile *tile; MVMint32 i; /* First stage, tile the tree */ list = MVM_jit_tile_expr_tree(tc, compiler, tree); MVM_jit_log_tile_list(tc, list); /* Second stage, allocate registers */ MVM_jit_linear_scan_allocate(tc, compiler, list); /* Allocate sufficient space for the internal labels */ dasm_growpc(compiler, compiler->label_offset + tree->num_labels); /* Third stage, emit the code */ for (i = 0; i < list->items_num; i++) { tile = list->items[i]; /* definition tiles etc. have NULL emit rules */ if (tile->emit != NULL) { tile->emit(tc, compiler, tile, tree); } } /* Cleanup tile lits */ MVM_jit_tile_list_destroy(tc, list); /* Make sure no other tree reuses the same labels */ compiler->label_offset += tree->num_labels; } MVM_STATIC_INLINE MVMint32 reg_type_bucket(MVMint8 reg_type) { switch (reg_type) { case MVM_reg_num32: case MVM_reg_num64: return 1; break; case MVM_reg_str: return 2; break; case MVM_reg_obj: return 3; break; default: break; } return 0; } MVMint32 MVM_jit_spill_memory_select(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMint8 reg_type) { MVMint32 idx; MVMint8 bucket = reg_type_bucket(reg_type); if (compiler->spills_free[bucket] >= 0) { idx = compiler->spills_free[bucket]; compiler->spills_free[bucket] = compiler->spills[idx].next; } else { MVM_VECTOR_ENSURE_SPACE(compiler->spills, idx = compiler->spills_num++); compiler->spills[idx].reg_type = reg_type; } return compiler->spills_base + idx * sizeof(MVMRegister); } void MVM_jit_spill_memory_release(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMint32 pos, MVMint8 reg_type) { MVMint32 idx = (pos - compiler->spills_base) / sizeof(MVMRegister); MVMint8 bucket = reg_type_bucket(reg_type); compiler->spills[idx].next = compiler->spills_free[bucket]; compiler->spills_free[bucket] = idx; } /* Enter the JIT code segment. The label is a continuation point where control * is resumed after the frame is properly setup. */ void MVM_jit_enter_code(MVMThreadContext *tc, MVMCompUnit *cu, MVMJitCode *code) { void *label = tc->cur_frame->jit_entry_label; MVMint32 ofs = (char*)label - (char*)code->func_ptr; if (ofs < 0 || ofs >= code->size) MVM_oops(tc, "JIT entry label out of range for code!\n" "(label %p, func_ptr %p, code size %lui, offset %li, frame_nr %i, seq nr %i)", label, code->func_ptr, code->size, ((char*)label) - ((char*)code->func_ptr), tc->cur_frame->sequence_nr, code->seq_nr); code->func_ptr(tc, cu, label); } MoarVM-2018.03/src/jit/compile.h0000644000175000017510000000512713237701240016365 0ustar samanthasamantha struct MVMJitCode { void (*func_ptr)(MVMThreadContext *tc, MVMCompUnit *cu, void * label); size_t size; MVMuint8 *bytecode; MVMStaticFrame *sf; MVMuint16 *local_types; MVMint32 num_locals; /* The basic idea here is that /all/ label names are indexes into the single * labels array. This isn't particularly efficient at runtime (because we * need a second dereference to figure the labels out), but very simple for * me now, and super-easy to optimise at a later date */ MVMint32 num_labels; void **labels; MVMint32 num_deopts; MVMint32 num_inlines; MVMint32 num_handlers; MVMJitDeopt *deopts; MVMJitInline *inlines; MVMJitHandler *handlers; MVMint32 spill_size; MVMint32 seq_nr; }; MVMJitCode* MVM_jit_compile_graph(MVMThreadContext *tc, MVMJitGraph *graph); void MVM_jit_destroy_code(MVMThreadContext *tc, MVMJitCode *code); void MVM_jit_enter_code(MVMThreadContext *tc, MVMCompUnit *cu, MVMJitCode * code); /* Peseudotile compile functions */ void MVM_jit_compile_label(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitTile *tile, MVMJitExprTree *tree); void MVM_jit_compile_branch(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitTile *tile, MVMJitExprTree *tree); void MVM_jit_compile_conditional_branch(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitTile *tile, MVMJitExprTree *tree); void MVM_jit_compile_store(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitTile *tile, MVMJitExprTree *tree); void MVM_jit_compile_load(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitTile *tile, MVMJitExprTree *tree); void MVM_jit_compile_move(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitTile *tile, MVMJitExprTree *tree); void MVM_jit_compile_memory_copy(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitTile *tile, MVMJitExprTree *tree); void MVM_jit_compile_guard(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitTile *tile, MVMJitExprTree *tree); /* Function for getting effective (JIT/specialized/original) bytecode. */ MVM_STATIC_INLINE MVMuint8 * MVM_frame_effective_bytecode(MVMFrame *f) { MVMSpeshCandidate *spesh_cand = f->spesh_cand; if (spesh_cand) return spesh_cand->jitcode ? spesh_cand->jitcode->bytecode : spesh_cand->bytecode; return f->static_info->body.bytecode; } MoarVM-2018.03/src/jit/core_templates.expr0000644000175000017510000004745013253524724020507 0ustar samanthasamantha# -*-whitespace-*- # SYNTAX: (keyword: opcode (tree $substitutions)) # include 'standard' macros (include: "src/jit/macro.expr") # Number with dollar-signs stand for the arguments of the opcode. The # opcode preprocessor inserts loads, and immediate nodes for arguments # automatically. (template: const_i16 (copy $1)) (template: const_i64_16 (copy $1)) (template: const_i64_32 (copy $1)) (template: const_i64 (copy $1)) (template: const_n64 (copy $1)) (template: const_s (^cu_string $1)) (template: trunc_i8! (store $0 $1 1)) (template: trunc_i16! (store $0 $1 2)) (template: trunc_i32! (store $0 $1 4)) (template: set (copy $1)) (template: getlex (copy $1)) (template: bindlex! (store $0 $1 reg_sz)) (template: add_i (add $1 $2)) (template: sub_i (sub $1 $2)) (template: inc_i (add $1 (const 1 int_sz))) (template: dec_i (sub $1 (const 1 int_sz))) (template: gt_i (flagval (gt $1 $2))) (template: ge_i (flagval (ge $1 $2))) (template: eq_i (flagval (eq $1 $2))) (template: ne_i (flagval (ne $1 $2))) (template: le_i (flagval (le $1 $2))) (template: lt_i (flagval (lt $1 $2))) (template: eqaddr (flagval (eq $1 $2))) (template: not_i (flagval (zr $1))) (template: sp_getarg_o (load (^parg $1) ptr_sz)) (template: sp_getarg_s (load (^parg $1) ptr_sz)) (template: sp_getarg_i (load (^parg $1) int_sz)) (template: sp_getarg_n (load (^parg $1) int_sz)) (template: sp_getspeshslot (load (^spesh_slot $1) ptr_sz)) (template: null_s (const 0 ptr_sz)) (template: null (^vmnull)) (template: getwhat (^getf (^stable $1) MVMSTable WHAT)) (template: hllboxtype_i (^getf (^hllconfig) MVMHLLConfig int_box_type)) (template: hllboxtype_s (^getf (^hllconfig) MVMHLLConfig str_box_type)) (template: hllboxtype_n (^getf (^hllconfig) MVMHLLConfig num_box_type)) (template: curcode (^getf (^frame) MVMFrame code_ref)) # Relatively harmless branches, I think (template: unless_i (when (zr $0) (branch $1))) (template: if_i (when (nz $0) (branch $1))) (template: ifnonnull (when (all (nz $0) (ne $0 (^vmnull))) (branch $1))) (template: goto (branch $0)) # since compilation of invocation is special-cased in the regular jit # we can't just toss this in here without also handling all of arg_* # and invoke_*. #(template: prepargs (^setf (^getf (tc) MVMThreadContext cur_frame) MVMFrame cur_args_callsite # (^cu_callsite $0))) (template: sp_p6oget_i (load (add (^p6obody $1) $2) int_sz)) (template: sp_p6oget_n (load (add (^p6obody $1) $2) (&sizeof MVMnum64))) (template: sp_p6oget_s (load (add (^p6obody $1) $2) ptr_sz)) (template: sp_p6oget_o (let: (($val (load (add (^p6obody $1) $2) ptr_sz))) (if (nz $val) $val (^vmnull)))) (template: getwho (let: (($who (^getf (^stable $1) MVMSTable WHO))) (if (nz $who) $who (^vmnull)))) (template: sp_p6obind_i (store (add (^p6obody $0) $1) $2 int_sz)) (template: sp_p6obind_n (store (add (^p6obody $0) $1) $2 int_sz)) (template: sp_p6obind_o (^store_write_barrier! $0 (add (^p6obody $0) $1) $2)) (template: sp_p6obind_s (^store_write_barrier! $0 (add (^p6obody $0) $1) $2)) (template: sp_p6ogetvt_o (let: (($addr (add (^p6obody $1) $2)) ($val (load $addr ptr_sz))) (if (nz $val) $val (let: (($type (load (^spesh_slot $3) ptr_sz))) (^store_write_barrier! $1 $addr $type) (copy $type))))) (template: say (callv (^func &MVM_string_say) (arglist (carg (tc) ptr) (carg $0 ptr)))) (template: decont! (ifv (any (zr $1) (^is_type_obj $1) (zr (^getf (^stable $1) MVMSTable container_spec))) (store $0 $1 ptr_sz) (callv (^stable_cont_func $1 fetch) (arglist (carg (tc) ptr) (carg $1 ptr) (carg $0 ptr))))) (template: takedispatcher (let: ( ($disp (^getf (tc) MVMThreadContext cur_dispatcher)) ($disp_for (^getf (tc) MVMThreadContext cur_dispatcher_for)) ($cur_code (^getf (^frame) MVMFrame code_ref)) ) (if (all (nz $disp) (any (zr $disp_for) (eq $disp_for $cur_code))) (do (store (^getf (tc) MVMThreadContext cur_dispatcher) (const 0 ptr_sz) ptr_sz) $disp ) (^vmnull) ) ) ) (template: wval (call (^func MVM_sc_get_sc_object) (arglist (carg (tc) ptr) (carg (cu) ptr) (carg $1 int) (carg $2 int)) ptr_sz)) # GET_REG(cur_op, 0).i64 = (MVMint64)REPR(obj)->elems(tc, STABLE(obj), obj, OBJECT_BODY(obj)); (template: elems (call (^getf (^repr $1) MVMREPROps elems) (arglist (carg (tc) ptr) (carg (^stable $1) ptr) (carg $1 ptr) (carg (^body $1) ptr)) int_sz)) # REPR(obj)->pos_funcs.at_pos(tc, STABLE(obj), obj, # OBJECT_BODY(obj), GET_REG(cur_op, 4).i64, # &GET_REG(cur_op, 0), MVM_reg_obj); (template: atpos_o! (ifv (^is_type_obj $1) (store $0 (^vmnull) ptr_sz) (callv (^getf (^repr $1) MVMREPROps pos_funcs.at_pos) (arglist (carg (tc) ptr) (carg (^stable $1) ptr) (carg $1 ptr) (carg (^body $1) ptr) (carg $2 int) (carg $0 ptr) (carg (const ("E MVM_reg_obj) int_sz) int))))) (template: atpos_i! (callv (^getf (^repr $1) MVMREPROps pos_funcs.at_pos) (arglist (carg (tc) ptr) (carg (^stable $1) ptr) (carg $1 ptr) (carg (^body $1) ptr) (carg $2 int) (carg $0 ptr) (carg (const ("E MVM_reg_int64) int_sz) int)))) # REPR(obj)->ass_funcs.at_key(tc, STABLE(obj), obj, OBJECT_BODY(obj), # (MVMObject *)GET_REG(cur_op, 4).s, &GET_REG(cur_op, 0), MVM_reg_obj); (template: atkey_o! (ifv (^is_type_obj $1) (store $0 (^vmnull) ptr_sz) (callv (^getf (^repr $1) MVMREPROps ass_funcs.at_key) (arglist (carg (tc) ptr) (carg (^stable $1) ptr) (carg $1 ptr) (carg (^body $1) ptr) (carg $2 ptr) (carg $0 ptr) (carg (const ("E MVM_reg_obj) int_sz) int))))) (template: existskey (call (^getf (^repr $1) MVMREPROps ass_funcs.exists_key) (arglist (carg (tc) ptr) (carg (^stable $1) ptr) (carg $1 ptr) (carg (^body $1) ptr) (carg $2 ptr)) int_sz)) (template: gethow (let: (($how (^getf (^stable $1) MVMSTable HOW))) (if (nz $how) $how (call (^func MVM_6model_get_how) (arglist (carg (tc) ptr) (carg (^stable $1) ptr)) ptr_sz)))) (template: getcode (load (idx (^getf (cu) MVMCompUnit body.coderefs) $1 ptr_sz) ptr_sz)) (template: takeclosure (call (^func MVM_frame_takeclosure) (arglist (carg (tc) ptr) (carg $1 ptr) ) ptr_sz ) ) (template: capturelex (callv (^func MVM_frame_capturelex) (arglist (carg (tc) ptr) (carg $0 ptr) ) ) ) (template: callercode (let: (($caller (^getf (^frame) MVMFrame caller))) (if (nz $caller) (^getf $caller MVMFrame code_ref) (const 0 ptr_sz)))) (template: create! (let: ( ($obj (call (^getf (^repr $1) MVMREPROps allocate) (arglist (carg (tc) ptr) (carg (^stable $1) ptr) ) ptr_sz ) ) ($initialize (^getf (^repr $1) MVMREPROps initialize)) ) (dov (when (nz $initialize) (callv $initialize (arglist (carg (tc) ptr) (carg (^stable $obj) ptr) (carg $obj ptr) (carg (^body $obj) ptr) ) ) ) (store $0 $obj ptr_sz) ) ) ) (template: sp_fastcreate! (let: (($block (call (^func &MVM_gc_allocate_zeroed) (arglist (carg (tc) ptr) (carg $1 int)) ptr_sz))) (^setf $block MVMObject st (load (^spesh_slot $2) ptr_sz)) (^setf $block MVMObject header.size $1) (^setf $block MVMObject header.owner (^getf (tc) MVMThreadContext thread_id)) (store $0 $block ptr_sz))) (template: return_o (dov (callv (^func &MVM_args_set_result_obj) (arglist (carg (tc) ptr) (carg $0 ptr) (carg (const 0 int_sz) int))) (callv (^func &MVM_frame_try_return) (arglist (carg (tc) ptr))) (^exit))) (template: sp_decont! (ifv (all (nz $1) (^is_conc_obj $1) (nz (^getf (^stable $1) MVMSTable container_spec))) (callv (^getf (^getf (^stable $1) MVMSTable container_spec) MVMContainerSpec fetch) (arglist (carg (tc) ptr) (carg $1 ptr) (carg $0 ptr))) (store $0 $1 ptr_sz))) (template: sp_resolvecode (call (^func &MVM_frame_resolve_invokee_spesh) (arglist (carg (tc) ptr) (carg $1 ptr)) ptr_sz)) (template: smrt_strify! (callv (^func &MVM_coerce_smart_stringify) (arglist (carg (tc) ptr) (carg $1 ptr) (carg $0 ptr)))) (template: smrt_numify! (callv (^func &MVM_coerce_smart_numify) (arglist (carg (tc) ptr) (carg $1 ptr) (carg $0 ptr)))) (template: push_i! (dov (callv (^getf (^repr $0) MVMREPROps pos_funcs.push) (arglist (carg (tc) ptr) (carg (^stable $0) ptr) (carg $0 ptr) (carg (^body $0) ptr) (carg $1 ptr) (carg (const ("E MVM_reg_int64) int_sz) int))) (callv (^func &MVM_SC_WB_OBJ) (arglist (carg (tc) ptr) (carg $0 ptr))))) (template: push_n! (dov (callv (^getf (^repr $0) MVMREPROps pos_funcs.push) (arglist (carg (tc) ptr) (carg (^stable $0) ptr) (carg $0 ptr) (carg (^body $0) ptr) (carg $1 ptr) (carg (const ("E MVM_reg_num64) int_sz) int))) (callv (^func &MVM_SC_WB_OBJ) (arglist (carg (tc) ptr) (carg $0 ptr))))) (template: push_s! (dov (callv (^getf (^repr $0) MVMREPROps pos_funcs.push) (arglist (carg (tc) ptr) (carg (^stable $0) ptr) (carg $0 ptr) (carg (^body $0) ptr) (carg $1 ptr) (carg (const ("E MVM_reg_str) int_sz) int))) (callv (^func &MVM_SC_WB_OBJ) (arglist (carg (tc) ptr) (carg $0 ptr))))) (template: push_o! (dov (callv (^getf (^repr $0) MVMREPROps pos_funcs.push) (arglist (carg (tc) ptr) (carg (^stable $0) ptr) (carg $0 ptr) (carg (^body $0) ptr) (carg $1 ptr) (carg (const ("E MVM_reg_obj) int_sz) int))) (callv (^func &MVM_SC_WB_OBJ) (arglist (carg (tc) ptr) (carg $0 ptr))))) (template: eq_s (call (^func &MVM_string_equal) (arglist (carg (tc) ptr) (carg $1 ptr) (carg $2 ptr)) int_sz)) (template: ne_s (flagval (zr (call (^func &MVM_string_equal) (arglist (carg (tc) ptr) (carg $1 ptr) (carg $2 ptr)) int_sz)))) # NB disable this for the moment, it seems to upset (some) builds, we # don't know yet why, but it might be because it allocates (template: box_i! (callv (^func &MVM_box_int) (arglist (carg (tc) ptr) (carg $1 int) (carg $2 ptr) (carg $0 ptr)))) (template: box_s! (callv (^func &MVM_box_str) (arglist (carg (tc) ptr) (carg $1 ptr) (carg $2 ptr) (carg $0 ptr)))) (template: istrue! (callv (^func &MVM_coerce_istrue) (arglist (carg (tc) ptr) (carg $1 ptr) (carg $0 ptr) (carg (const 0 ptr_sz) ptr) (carg (const 0 ptr_sz) ptr) (carg (const 0 int_sz) int)))) (template: isfalse! (callv (^func &MVM_coerce_istrue) (arglist (carg (tc) ptr) (carg $1 ptr) (carg $0 ptr) (carg (const 0 ptr_sz) ptr) (carg (const 0 ptr_sz) ptr) (carg (const 1 int_sz) int)))) (template: shift_i! (callv (^getf (^repr $1) MVMREPROps pos_funcs.shift) (arglist (carg (tc) ptr) (carg (^stable $1) ptr) (carg $1 ptr) (carg (^body $1) ptr) (carg $0 ptr) (carg (const ("E MVM_reg_int64) int_sz) int)))) (template: shift_n! (callv (^getf (^repr $1) MVMREPROps pos_funcs.shift) (arglist (carg (tc) ptr) (carg (^stable $1) ptr) (carg $1 ptr) (carg (^body $1) ptr) (carg $0 ptr) (carg (const ("E MVM_reg_num64) int_sz) int)))) (template: shift_s! (callv (^getf (^repr $1) MVMREPROps pos_funcs.shift) (arglist (carg (tc) ptr) (carg (^stable $1) ptr) (carg $1 ptr) (carg (^body $1) ptr) (carg $0 ptr) (carg (const ("E MVM_reg_str) int_sz) int)))) (template: shift_o! (callv (^getf (^repr $1) MVMREPROps pos_funcs.shift) (arglist (carg (tc) ptr) (carg (^stable $1) ptr) (carg $1 ptr) (carg (^body $1) ptr) (carg $0 ptr) (carg (const ("E MVM_reg_obj) int_sz) int)))) (template: pop_i! (callv (^getf (^repr $1) MVMREPROps pos_funcs.pop) (arglist (carg (tc) ptr) (carg (^stable $1) ptr) (carg $1 ptr) (carg (^body $1) ptr) (carg $0 ptr) (carg (const ("E MVM_reg_int64) int_sz) int)))) (template: pop_n! (callv (^getf (^repr $1) MVMREPROps pos_funcs.pop) (arglist (carg (tc) ptr) (carg (^stable $1) ptr) (carg $1 ptr) (carg (^body $1) ptr) (carg $0 ptr) (carg (const ("E MVM_reg_num64) int_sz) int)))) (template: pop_s! (callv (^getf (^repr $1) MVMREPROps pos_funcs.pop) (arglist (carg (tc) ptr) (carg (^stable $1) ptr) (carg $1 ptr) (carg (^body $1) ptr) (carg $0 ptr) (carg (const ("E MVM_reg_str) int_sz) int)))) (template: pop_o! (callv (^getf (^repr $1) MVMREPROps pos_funcs.pop) (arglist (carg (tc) ptr) (carg (^stable $1) ptr) (carg $1 ptr) (carg (^body $1) ptr) (carg $0 ptr) (carg (const ("E MVM_reg_obj) int_sz) int)))) (template: iter (call (^func &MVM_iter) (arglist (carg (tc) ptr) (carg $1 ptr)) ptr_sz)) (template: getdynlex (call (^func &MVM_frame_getdynlex) (arglist (carg (tc) ptr) (carg $1 ptr) (carg (^caller) ptr)) ptr_sz)) (template: lastexpayload (^getf (tc) MVMThreadContext last_payload)) (template: hllize! (callv (^func &MVM_hll_map) (arglist (carg (tc) ptr) (carg $1 ptr) (carg (call (^func &MVM_hll_current) (arglist (carg (tc) ptr)) ptr_sz) ptr) (carg $0 ptr)))) (template: isconcrete (if (all (nz $1) (^is_conc_obj $1)) (const 1 int_sz) (const 0 int_sz))) (template: band_i (and $1 $2)) (template: bor_i (or $1 $2)) (template: bxor_i (xor $1 $2)) (template: bnot_i (not $1)) (template: can! (callv (^func &MVM_6model_can_method) (arglist (carg (tc) ptr) (carg $1 ptr) (carg (^cu_string $2) ptr) (carg $0 ptr)))) (template: setelemspos! (callv (^getf (^repr $0) MVMREPROps pos_funcs.set_elems) (arglist (carg (tc) ptr) (carg (^stable $0) ptr) (carg $0 ptr) (carg (^body $0) ptr) (carg $1 int)))) (template: istype! (callv (^func &MVM_6model_istype) (arglist (carg (tc) ptr) (carg $1 ptr) (carg $2 ptr) (carg $0 ptr)))) (template: bindkey_o! (dov (callv (^getf (^repr $0) MVMREPROps ass_funcs.bind_key) (arglist (carg (tc) ptr) (carg (^stable $0) ptr) (carg $0 ptr) (carg (^body $0) ptr) (carg $1 ptr) (carg $2 ptr) (carg (const ("E MVM_reg_obj) int_sz) int))) (callv (^func &MVM_SC_WB_OBJ) (arglist (carg (tc) ptr) (carg $0 ptr))))) (template: bindkey_s! (dov (callv (^getf (^repr $0) MVMREPROps ass_funcs.bind_key) (arglist (carg (tc) ptr) (carg (^stable $0) ptr) (carg $0 ptr) (carg (^body $0) ptr) (carg $1 ptr) (carg $2 ptr) (carg (const ("E MVM_reg_str) int_sz) int))) (callv (^func &MVM_SC_WB_OBJ) (arglist (carg (tc) ptr) (carg $0 ptr))))) (template: bindkey_n! (dov (callv (^getf (^repr $0) MVMREPROps ass_funcs.bind_key) (arglist (carg (tc) ptr) (carg (^stable $0) ptr) (carg $0 ptr) (carg (^body $0) ptr) (carg $1 ptr) (carg $2 ptr) (carg (const ("E MVM_reg_num64) int_sz) int))) (callv (^func &MVM_SC_WB_OBJ) (arglist (carg (tc) ptr) (carg $0 ptr))))) (template: bindkey_i! (dov (callv (^getf (^repr $0) MVMREPROps ass_funcs.bind_key) (arglist (carg (tc) ptr) (carg (^stable $0) ptr) (carg $0 ptr) (carg (^body $0) ptr) (carg $1 ptr) (carg $2 ptr) (carg (const ("E MVM_reg_int64) int_sz) int))) (callv (^func &MVM_SC_WB_OBJ) (arglist (carg (tc) ptr) (carg $0 ptr))))) (template: bindpos_i! (dov (callv (^getf (^repr $0) MVMREPROps pos_funcs.bind_pos) (arglist (carg (tc) ptr) (carg (^stable $0) ptr) (carg $0 ptr) (carg (^body $0) ptr) (carg $1 ptr) (carg $2 ptr) (carg (const ("E MVM_reg_int64) int_sz) int))) (callv (^func &MVM_SC_WB_OBJ) (arglist (carg (tc) ptr) (carg $0 ptr))))) (template: bindpos_n! (dov (callv (^getf (^repr $0) MVMREPROps pos_funcs.bind_pos) (arglist (carg (tc) ptr) (carg (^stable $0) ptr) (carg $0 ptr) (carg (^body $0) ptr) (carg $1 ptr) (carg $2 ptr) (carg (const ("E MVM_reg_num64) int_sz) int))) (callv (^func &MVM_SC_WB_OBJ) (arglist (carg (tc) ptr) (carg $0 ptr))))) (template: bindpos_s! (dov (callv (^getf (^repr $0) MVMREPROps pos_funcs.bind_pos) (arglist (carg (tc) ptr) (carg (^stable $0) ptr) (carg $0 ptr) (carg (^body $0) ptr) (carg $1 ptr) (carg $2 ptr) (carg (const ("E MVM_reg_str) int_sz) int))) (callv (^func &MVM_SC_WB_OBJ) (arglist (carg (tc) ptr) (carg $0 ptr))))) (template: bindpos_o! (dov (callv (^getf (^repr $0) MVMREPROps pos_funcs.bind_pos) (arglist (carg (tc) ptr) (carg (^stable $0) ptr) (carg $0 ptr) (carg (^body $0) ptr) (carg $1 ptr) (carg $2 ptr) (carg (const ("E MVM_reg_obj) int_sz) int))) (callv (^func &MVM_SC_WB_OBJ) (arglist (carg (tc) ptr) (carg $0 ptr))))) (template: eqat_s (call (^func &MVM_string_equal_at) (arglist (carg (tc) ptr) (carg $1 ptr) (carg $2 ptr) (carg $3 int)) int_sz)) (template: concat_s (call (^func &MVM_string_concatenate) (arglist (carg (tc) ptr) (carg $1 ptr) (carg $2 ptr)) ptr_sz)) (template: isnull_s (flagval (zr $1))) (template: isnull (or (flagval (zr $1)) (flagval (eq $1 (^vmnull))))) (template: isint (if (all (nz $1) (eq (^getf (^repr $1) MVMREPROps ID) (const ("E MVM_REPR_ID_P6int) (&sizeof MVMuint32)))) (const 1 int_sz) (const 0 int_sz))) (template: isnum (if (all (nz $1) (eq (^getf (^repr $1) MVMREPROps ID) (const ("E MVM_REPR_ID_P6num) (&sizeof MVMuint32)))) (const 1 int_sz) (const 0 int_sz))) (template: isstr (if (all (nz $1) (eq (^getf (^repr $1) MVMREPROps ID) (const ("E MVM_REPR_ID_P6str) (&sizeof MVMuint32)))) (const 1 int_sz) (const 0 int_sz))) (template: islist (if (all (nz $1) (eq (^getf (^repr $1) MVMREPROps ID) (const ("E MVM_REPR_ID_VMArray) (&sizeof MVMuint32)))) (const 1 int_sz) (const 0 int_sz))) (template: ishash (if (all (nz $1) (eq (^getf (^repr $1) MVMREPROps ID) (const ("E MVM_REPR_ID_MVMHash) (&sizeof MVMuint32)))) (const 1 int_sz) (const 0 int_sz))) MoarVM-2018.03/src/jit/expr.c0000644000175000017510000012162113250636753015717 0ustar samanthasamantha#include "moar.h" /* Mathematical min and max macro's */ #ifndef MAX #define MAX(a,b) ((a) > (b) ? (a) : (b)); #endif #ifndef MIN #define MIN(a,b) ((a) < (b) ? (a) : (b)); #endif /* macros used in the expression list templates, defined here so they don't overwrite other definitions */ #define CONST_PTR(x) ((uintptr_t)(x)) #define QUOTE(x) (x) #define MSG(...) CONST_PTR(#__VA_ARGS__) #define SIZEOF_MEMBER(type, member) sizeof(((type*)0)->member) #include "jit/core_templates.h" static const MVMJitExprOpInfo expr_op_info[] = { #define OP_INFO(name, nchild, nargs, vtype, cast) { #name, nchild, nargs, MVM_JIT_ ## vtype, MVM_JIT_ ## cast } MVM_JIT_EXPR_OPS(OP_INFO) #undef OP_INFO }; const MVMJitExprOpInfo * MVM_jit_expr_op_info(MVMThreadContext *tc, MVMint32 op) { if (op < 0 || op >= MVM_JIT_MAX_NODES) { MVM_oops(tc, "JIT: Expr op index out of bounds: %d", op); } return &expr_op_info[op]; } /* Record the node that defines a value */ struct ValueDefinition { MVMint32 node; MVMint32 root; MVMint32 addr; }; /* Logical negation of MVMJitExprOp flags. */ MVMint32 MVM_jit_expr_op_negate_flag(MVMThreadContext *tc, MVMint32 op) { switch(op) { case MVM_JIT_LT: return MVM_JIT_GE; case MVM_JIT_LE: return MVM_JIT_GT; case MVM_JIT_EQ: return MVM_JIT_NE; case MVM_JIT_NE: return MVM_JIT_EQ; case MVM_JIT_GE: return MVM_JIT_LT; case MVM_JIT_GT: return MVM_JIT_LE; case MVM_JIT_NZ: return MVM_JIT_ZR; case MVM_JIT_ZR: return MVM_JIT_NZ; default: break; } return -1; /* not a flag */ } MVMint32 MVM_jit_expr_op_is_binary_noncommutative(MVMThreadContext *tc, MVMint32 op) { switch (op) { case MVM_JIT_SUB: case MVM_JIT_XOR: /* and DIV, SHIFT, etc */ return 1; default: /* ADD, MUL, AND, OR, etc. are commutative */ return 0; } } static MVMint32 MVM_jit_expr_add_regaddr(MVMThreadContext *tc, MVMJitExprTree *tree, MVMuint16 reg) { MVMint32 num = tree->nodes_num; MVMJitExprNode template[] = { MVM_JIT_LOCAL, MVM_JIT_ADDR, num, reg * MVM_JIT_REG_SZ }; MVM_VECTOR_APPEND(tree->nodes, template, sizeof(template)/sizeof(MVMJitExprNode)); return num + 1; } static MVMint32 MVM_jit_expr_add_loadframe(MVMThreadContext *tc, MVMJitExprTree *tree) { MVMint32 num = tree->nodes_num; MVMJitExprNode template[] = { MVM_JIT_TC, MVM_JIT_ADDR, num, offsetof(MVMThreadContext, cur_frame), MVM_JIT_LOAD, num + 1, sizeof(MVMFrame*) }; MVM_VECTOR_APPEND(tree->nodes, template, sizeof(template)/sizeof(MVMJitExprNode)); return num + 4; } static MVMint32 MVM_jit_expr_add_load(MVMThreadContext *tc, MVMJitExprTree *tree, MVMint32 addr) { MVMint32 num = tree->nodes_num; MVMJitExprNode template[] = { MVM_JIT_LOAD, addr, MVM_JIT_REG_SZ }; MVM_VECTOR_APPEND(tree->nodes, template, sizeof(template)/sizeof(MVMJitExprNode)); return num; } static MVMint32 MVM_jit_expr_add_store(MVMThreadContext *tc, MVMJitExprTree *tree, MVMint32 addr, MVMint32 val, MVMint32 sz) { MVMint32 num = tree->nodes_num; MVMJitExprNode template[] = { MVM_JIT_STORE, addr, val, sz }; MVM_VECTOR_APPEND(tree->nodes, template, sizeof(template)/sizeof(MVMJitExprNode)); return num; } static MVMint32 MVM_jit_expr_add_cast(MVMThreadContext *tc, MVMJitExprTree *tree, MVMint32 node, MVMint32 to_size, MVMint32 from_size, MVMint32 is_signed) { MVMint32 num = tree->nodes_num; MVMJitExprNode template[] = { MVM_JIT_CAST, node, to_size, from_size, is_signed }; MVM_VECTOR_APPEND(tree->nodes, template, sizeof(template)/sizeof(MVMJitExprNode)); return num; } static MVMint32 MVM_jit_expr_wrap_guard(MVMThreadContext *tc, MVMJitExprTree *tree, MVMint32 node, MVMint32 before, MVMint32 after) { MVMint32 num = tree->nodes_num; MVMJitExprNode template[] = { MVM_JIT_GUARD, node, before, after }; MVM_VECTOR_APPEND(tree->nodes, template, sizeof(template)/sizeof(MVMJitExprNode)); return num; } static MVMint32 MVM_jit_expr_add_label(MVMThreadContext *tc, MVMJitExprTree *tree, MVMint32 label) { MVMint32 num = tree->nodes_num; MVMJitExprNode template[] = { MVM_JIT_MARK, label }; MVM_VECTOR_APPEND(tree->nodes, template, sizeof(template)/sizeof(template[0])); return num; } static MVMint32 MVM_jit_expr_add_lexaddr(MVMThreadContext *tc, MVMJitExprTree *tree, MVMuint16 outers, MVMuint16 idx) { MVMint32 i; /* (frame) as the root */ MVMint32 num = MVM_jit_expr_add_loadframe(tc, tree); for (i = 0; i < outers; i++) { /* (load (addr $val (&offsetof MVMFrame outer)) (&sizeof MVMFrame*)) */ MVMJitExprNode template[] = { MVM_JIT_ADDR, num, offsetof(MVMFrame, outer), MVM_JIT_LOAD, tree->nodes_num, sizeof(MVMFrame*) }; MVM_VECTOR_APPEND(tree->nodes, template, sizeof(template)/sizeof(MVMJitExprNode)); num = tree->nodes_num - 3; } /* (addr (load (addr $frame (&offsetof MVMFrame env)) ptr_sz) ptr_sz*idx) */ { MVMJitExprNode template[] = { MVM_JIT_ADDR, num, offsetof(MVMFrame, env), /* (addr $frame (&offsetof MVMFrame env)) */ MVM_JIT_LOAD, tree->nodes_num, MVM_JIT_PTR_SZ, /* (load $addr ptr_sz) */ MVM_JIT_ADDR, tree->nodes_num + 3, idx * MVM_JIT_REG_SZ /* (addr $frame_env idx*reg_sz) */ }; MVM_VECTOR_APPEND(tree->nodes, template, sizeof(template)/sizeof(MVMJitExprNode)); num = tree->nodes_num - 3; } return num; } static MVMint32 MVM_jit_expr_add_const(MVMThreadContext *tc, MVMJitExprTree *tree, MVMSpeshOperand opr, MVMuint8 info) { MVMJitExprNode template[] = { MVM_JIT_CONST, 0, 0 }; MVMint32 num = tree->nodes_num; MVMint32 size = 3; switch(info & MVM_operand_type_mask) { case MVM_operand_int8: template[1] = opr.lit_i8; template[2] = sizeof(MVMint8); break; case MVM_operand_int16: template[1] = opr.lit_i16; template[2] = sizeof(MVMint16); break; case MVM_operand_coderef: template[1] = opr.coderef_idx; template[2] = sizeof(MVMuint16); break; case MVM_operand_int32: template[1] = opr.lit_i32; template[2] = sizeof(MVMint32); break; case MVM_operand_int64: template[1] = opr.lit_i64; template[2] = sizeof(MVMint64); break; case MVM_operand_num32: /* possible endianess issue here */ template[1] = opr.lit_i32; template[2] = sizeof(MVMnum32); break; case MVM_operand_num64: /* use i64 to get the bits */ template[1] = opr.lit_i64; template[2] = sizeof(MVMnum64); break; case MVM_operand_str: /* string index really */ template[1] = opr.lit_str_idx; template[2] = sizeof(MVMuint32); break; case MVM_operand_ins: template[0] = MVM_JIT_LABEL; template[1] = MVM_jit_label_before_bb(tc, tree->graph, opr.ins_bb); size = 2; break; case MVM_operand_callsite: template[1] = opr.callsite_idx; template[2] = sizeof(MVMuint16); break; case MVM_operand_spesh_slot: template[1] = opr.lit_i16; template[2] = sizeof(MVMuint16); break; default: MVM_oops(tc, "Can't add constant for operand type %d\n", (info & MVM_operand_type_mask) >> 3); } MVM_VECTOR_APPEND(tree->nodes, template, size); return num; } static MVMint32 getlex_needs_autoviv(MVMThreadContext *tc, MVMJitGraph *jg, MVMSpeshIns *ins) { MVMSpeshOperand opr = ins->operands[1]; MVMuint16 lexical_type = MVM_spesh_get_lex_type(tc, jg->sg, opr.lex.outers, opr.lex.idx); return lexical_type == MVM_reg_obj; } static MVMint32 bindlex_needs_write_barrier(MVMThreadContext *tc, MVMJitGraph *jg, MVMSpeshIns *ins) { MVMSpeshOperand opr = ins->operands[0]; MVMuint16 lexical_type = MVM_spesh_get_lex_type(tc, jg->sg, opr.lex.outers, opr.lex.idx); /* need to hit a write barrier if we bindlex to a string */ return lexical_type == MVM_reg_obj || lexical_type == MVM_reg_str; } static MVMint32 ins_has_single_input_output_operand(MVMSpeshIns *ins) { switch (ins->info->opcode) { case MVM_OP_inc_i: case MVM_OP_inc_u: case MVM_OP_dec_i: case MVM_OP_dec_u: return 1; default: break; } return 0; } void MVM_jit_expr_load_operands(MVMThreadContext *tc, MVMJitExprTree *tree, MVMSpeshIns *ins, struct ValueDefinition *values, MVMint32 *operands) { MVMint32 i; for (i = 0; i < ins->info->num_operands; i++) { MVMSpeshOperand opr = ins->operands[i]; MVMint8 opr_kind = ins->info->operands[i]; switch(opr_kind & MVM_operand_rw_mask) { case MVM_operand_read_reg: if (values[opr.reg.orig].node >= 0) { operands[i] = values[opr.reg.orig].node; } else { MVMint32 addr = MVM_jit_expr_add_regaddr(tc, tree, opr.reg.orig); operands[i] = MVM_jit_expr_add_load(tc, tree, addr); values[opr.reg.orig].node = operands[i]; values[opr.reg.orig].addr = addr; values[opr.reg.orig].root = -1; /* load is not part of a root */ } break; case MVM_operand_write_reg: /* get address of register to write */ operands[i] = MVM_jit_expr_add_regaddr(tc, tree, opr.reg.orig); break; case MVM_operand_literal: operands[i] = MVM_jit_expr_add_const(tc, tree, opr, ins->info->operands[i]); break; case MVM_operand_read_lex: { MVMint32 addr = MVM_jit_expr_add_lexaddr(tc, tree, opr.lex.outers, opr.lex.idx); operands[i] = MVM_jit_expr_add_load(tc, tree, addr); break; } case MVM_operand_write_lex: operands[i] = MVM_jit_expr_add_lexaddr(tc, tree, opr.lex.outers, opr.lex.idx); break; default: continue; } if (operands[i] >= tree->nodes_num || operands[i] < 0) { MVM_oops(tc, "JIT: something is wrong with operand loading"); } } /* A HACK. * * dec_i and inc_i have a single operand that acts both as input and output. * This is marked only as an output operand, though. Thus, we load the * address here, and define the value later. However, if we have multiple of * these in sequence, each will load the old value from memory, disregarding * the value that an earlier operator has defined, i.e. losing the update. * That's a bug, and this tries to fix it, by forcing a 'split' between the * input and the output operand. */ if (ins_has_single_input_output_operand(ins)) { MVMuint16 reg = ins->operands[0].reg.orig; if (values[reg].node >= 0) { operands[1] = values[reg].node; } else { /* operands[0] has the address */ operands[1] = MVM_jit_expr_add_load(tc, tree, operands[0]); /* no need to insert it in the table since it will be directly * overwritten */ } } } /* This function is to check the internal consistency of a template * before I apply it. I need this because I make a lot of mistakes in * writing templates, and debugging is hard. */ static void check_template(MVMThreadContext *tc, const MVMJitExprTemplate *template, MVMSpeshIns *ins) { MVMint32 i; for (i = 0; i < template->len; i++) { switch(template->info[i]) { case 0: MVM_oops(tc, "JIT: Template info shorter than template length (instruction %s)", ins->info->name); break; case 'l': if (template->code[i] >= i || template->code[i] < 0) MVM_oops(tc, "JIT: Template link out of bounds (instruction: %s)", ins->info->name); break; case 'f': if (template->code[i] < 0 || (template->code[i] >= ins->info->num_operands && !ins_has_single_input_output_operand(ins))) MVM_oops(tc, "JIT: Operand access out of bounds (instruction: %s)", ins->info->name); break; default: continue; } } if (template->info[i]) MVM_oops(tc, "JIT: Template info longer than template length (instruction: %s)", ins->info->name); } /* Add template to nodes, filling in operands and linking tree nodes. Return template root */ MVMint32 MVM_jit_expr_apply_template(MVMThreadContext *tc, MVMJitExprTree *tree, const MVMJitExprTemplate *template, MVMint32 *operands) { MVMint32 i, num; num = tree->nodes_num; MVM_VECTOR_ENSURE_SPACE(tree->nodes, template->len); /* Loop over string until the end */ for (i = 0; template->info[i]; i++) { switch (template->info[i]) { case 'l': /* link template-relative to nodes-relative */ tree->nodes[num+i] = template->code[i] + num; break; case 'f': /* add operand node into the nodes */ tree->nodes[num+i] = operands[template->code[i]]; break; default: /* copy from template to nodes */ tree->nodes[num+i] = template->code[i]; break; } } tree->nodes_num = num + template->len; return num + template->root; /* root relative to nodes */ } /* Collect tree analysis information, add stores of computed values */ static void analyze_node(MVMThreadContext *tc, MVMJitTreeTraverser *traverser, MVMJitExprTree *tree, MVMint32 node) { const MVMJitExprOpInfo *op_info = MVM_jit_expr_op_info(tc, tree->nodes[node]); MVMint32 first_child = node + 1; MVMint32 nchild = op_info->nchild < 0 ? tree->nodes[first_child++] : op_info->nchild; MVMJitExprNode *args = tree->nodes + first_child + nchild; MVMJitExprNodeInfo *node_info = tree->info + node; MVMint32 i; node_info->op_info = op_info; /* propagate node sizes and assign labels */ switch (tree->nodes[node]) { case MVM_JIT_CONST: /* node size is given */ node_info->size = args[1]; break; case MVM_JIT_COPY: node_info->size = tree->info[tree->nodes[first_child]].size; break; case MVM_JIT_LOAD: node_info->size = args[0]; break; case MVM_JIT_CAST: node_info->size = args[0]; break; case MVM_JIT_ADDR: case MVM_JIT_IDX: case MVM_JIT_LABEL: case MVM_JIT_TC: case MVM_JIT_CU: case MVM_JIT_LOCAL: case MVM_JIT_STACK: /* addresses result in pointers */ node_info->size = MVM_JIT_PTR_SZ; break; /* binary operations */ case MVM_JIT_ADD: case MVM_JIT_SUB: case MVM_JIT_AND: case MVM_JIT_OR: case MVM_JIT_XOR: case MVM_JIT_NOT: /* comparisons */ case MVM_JIT_NE: case MVM_JIT_LT: case MVM_JIT_LE: case MVM_JIT_EQ: case MVM_JIT_GE: case MVM_JIT_GT: { /* arithmetic nodes use their largest operand */ MVMint32 left = tree->nodes[first_child]; MVMint32 right = tree->nodes[first_child+1]; node_info->size = MAX(tree->info[left].size, tree->info[right].size); break; } case MVM_JIT_FLAGVAL: /* XXX THIS IS A HACK * * The true size of 'flagval' is a single byte. But that would mean it * had to be upcast to be used as a 64-bit word, and that subtly * doesn't work if the value is STORE-d to memory. */ node_info->size = 4; break; case MVM_JIT_DO: /* node size of last child */ { MVMint32 last_child = tree->nodes[first_child + nchild - 1]; node_info->size = tree->info[last_child].size; break; } case MVM_JIT_IF: { MVMint32 left = tree->nodes[first_child+1]; MVMint32 right = tree->nodes[first_child+2]; node_info->size = MAX(tree->info[left].size, tree->info[right].size); break; } case MVM_JIT_CALL: node_info->size = args[0]; break; case MVM_JIT_NZ: case MVM_JIT_ZR: node_info->size = tree->info[tree->nodes[first_child]].size; break; default: /* all other things, branches, labels, when, arglist, carg, * comparisons, etc, have no value size */ node_info->size = 0; break; } /* Insert casts as necessary */ if (op_info->cast != MVM_JIT_NO_CAST) { for (i = 0; i < nchild; i++) { MVMint32 child = tree->nodes[first_child+i]; if (tree->nodes[child] == MVM_JIT_CONST) { /* CONST nodes can always take over their target size, so they never need to be cast */ tree->info[child].size = tree->info[node].size; } else if (tree->info[child].size < node_info->size) { /* Widening casts need to be handled explicitly, shrinking casts do not */ MVMint32 cast = MVM_jit_expr_add_cast(tc, tree, child, node_info->size, tree->info[child].size, op_info->cast); /* Because the cast may have grown the backing nodes array, the info array needs to grow as well */ MVM_VECTOR_ENSURE_SIZE(tree->info, cast); /* And because analyze_node is called in postorder, the newly added cast node would be neglected by the traverser. So we traverse it explicitly.. */ MVM_VECTOR_ENSURE_SIZE(traverser->visits, cast); traverser->visits[cast] = 1; analyze_node(tc, traverser, tree, cast); /* Finally we replace the child with its cast */ tree->nodes[first_child+i] = cast; } } } } static void assign_labels(MVMThreadContext *tc, MVMJitTreeTraverser *traverser, MVMJitExprTree *tree, MVMint32 node) { /* IF has two blocks, the first I call left, the second I call right. Regular IF is implemented by the following sequence: * test * negated conditional jump to label 1 * left block * unconditional jump to label 2 * label 1 * right block * label 2 The 'short-circuiting' cases of IF ALL and IF ANY require special treatment. IF ALL simply repeats the test+negated branch for each of the ALL's children. IF ANY on the other hand must short circuit not into the default (right) but into the (left) conditional block. So IF ANY must be implemented as: (* test * conditional jump to label 3) - repeated n times * unconditional jump to label 1 * label 3 * left block * unconditional jump to label 2 * label 1 * right block * label 2 NB - the label before the left block has been given the number 3 for consistency with the regular case. Simpilar observations are applicable to WHEN and WHEN ANY/WHEN ALL. Different altogether are the cases of ANY ALL and ALL ANY. ANY ALL can be implemented as: ( test negated conditional jump to label 4) - repeated for all in ALL * unconditional jump to label 3 * label 4 (continuing the ANY) This way the 'short-circuit' jump of the ALL sequence implies the continuation of the ANY sequence, whereas the finishing of the ALL sequence implies it succeeded and hence the ANY needs to short-circuit. ALL ANY can be implemented analogously as: ( test conditional jump to label 4) repeated for all children of ANY * unconditional short-circuit jump to label 1 * label 4 Nested ALL in ALL and ANY in ANY all have the same short-circuiting behaviour (i.e. a nested ALL in ALL is indistinguishable from inserting all the children of the nested ALL into the nesting ALL), so they don't require special treatment. All this goes to say in that the number of labels required and the actual labels assigned to different children depends on the structure of the tree, which is why labels are 'pushed down' from parents to children, at least when those children are ANY and ALL. */ switch (tree->nodes[node]) { case MVM_JIT_WHEN: { /* WHEN just requires one label in the default case */ MVMint32 test = tree->nodes[node+1]; tree->info[node].label = tree->num_labels++; if (tree->nodes[test] == MVM_JIT_ANY) { /* ANY requires a pre-left-block label */ tree->info[test].label = tree->num_labels++; } else if (tree->nodes[test] == MVM_JIT_ALL) { /* ALL takes over the label of its parent */ tree->info[test].label = tree->info[node].label; } } break; case MVM_JIT_IF: case MVM_JIT_IFV: { MVMint32 test = tree->nodes[node+1]; /* take two labels, one for the left block and one for the right block */ tree->info[node].label = tree->num_labels; tree->num_labels += 2; if (tree->nodes[test] == MVM_JIT_ANY) { /* assign 'label 3' to the ANY */ tree->info[test].label = tree->num_labels++; } else if (tree->nodes[test] == MVM_JIT_ALL) { /* assign 'label 1' to the ALL */ tree->info[test].label = tree->info[node].label; } } break; case MVM_JIT_ALL: { MVMint32 nchild = tree->nodes[node+1]; MVMint32 i; for (i = 0; i < nchild; i++) { MVMint32 test = tree->nodes[node+2+i]; if (tree->nodes[test] == MVM_JIT_ALL) { /* use same label for child as parent */ tree->info[test].label = tree->info[node].label; } else if (tree->nodes[test] == MVM_JIT_ANY) { /* assign an extra label for ANY to short-circuit into */ tree->info[test].label = tree->num_labels++; } } } break; case MVM_JIT_ANY: { MVMint32 nchild = tree->nodes[node+1]; MVMint32 i; for (i = 0; i < nchild; i++) { MVMint32 test = tree->nodes[node+2+i]; if (tree->nodes[test] == MVM_JIT_ANY) { tree->info[test].label = tree->info[node].label; } else if (tree->nodes[test] == MVM_JIT_ALL) { tree->info[test].label = tree->num_labels++; } } } break; default: break; } } void MVM_jit_expr_tree_analyze(MVMThreadContext *tc, MVMJitExprTree *tree) { /* analyse the tree, calculate usage and destination information */ MVMJitTreeTraverser traverser; MVM_VECTOR_ENSURE_SIZE(tree->info, tree->nodes_num); traverser.policy = MVM_JIT_TRAVERSER_ONCE; traverser.data = NULL; traverser.preorder = &assign_labels; traverser.inorder = NULL; traverser.postorder = &analyze_node; MVM_jit_expr_tree_traverse(tc, tree, &traverser); } /* insert stores for all the active unstored values */ static void active_values_flush(MVMThreadContext *tc, MVMJitExprTree *tree, struct ValueDefinition *values, MVMint32 num_values) { MVMint32 i; for (i = 0; i < num_values; i++) { if (values[i].root >= 0) { tree->roots[values[i].root] = MVM_jit_expr_add_store( tc, tree, values[i].addr, values[i].node, MVM_JIT_REG_SZ ); } if (values[i].node >= 0) { memset(values + i, -1, sizeof(struct ValueDefinition)); } } } /* TODO add labels to the expression tree */ MVMJitExprTree * MVM_jit_expr_tree_build(MVMThreadContext *tc, MVMJitGraph *jg, MVMSpeshIterator *iter) { MVMSpeshGraph *sg = jg->sg; MVMSpeshIns *entry = iter->ins; MVMSpeshIns *ins; MVMJitExprTree *tree; MVMint32 operands[MVM_MAX_OPERANDS]; struct ValueDefinition *values; MVMint32 root, node; MVMuint16 i; /* No instructions, just skip */ if (!iter->ins) return NULL; /* Make the tree */ tree = MVM_malloc(sizeof(MVMJitExprTree)); MVM_VECTOR_INIT(tree->nodes, 256); MVM_VECTOR_INIT(tree->info, 256); MVM_VECTOR_INIT(tree->roots, 16); /* ensure that all references are nonzero */ MVM_VECTOR_PUSH(tree->nodes, MVM_JIT_NOOP); tree->graph = jg; tree->num_labels = 0; /* Hold indices to the node that last computed a value belonging * to a register. Initialized as -1 to indicate that these * values are empty. */ values = MVM_malloc(sizeof(struct ValueDefinition)*sg->num_locals); memset(values, -1, sizeof(struct ValueDefinition)*sg->num_locals); #define BAIL(x, ...) do { if (x) { MVM_jit_log(tc, __VA_ARGS__); goto done; } } while (0) /* Generate a tree based on templates. The basic idea is to keep a index to the node that last computed the value of a local. Each opcode is translated to the expression using a template, which is a): filled with nodes coming from operands and b): internally linked together (relative to absolute indexes). Afterwards stores are inserted for computed values. */ for (ins = iter->ins; ins != NULL; ins = MVM_spesh_iterator_next_ins(tc, iter)) { /* NB - we probably will want to involve the spesh info in selecting a template. And for optimisation, I'd like to copy spesh facts (if any) to the tree info */ MVMuint16 opcode = ins->info->opcode; MVMSpeshAnn *ann; const MVMJitExprTemplate *template; MVMint32 before_label = -1, after_label = -1, wrap_before = 0, wrap_after = 0; struct ValueDefinition *defined_value = NULL; /* check if this is a getlex and if we can handle it */ BAIL(opcode == MVM_OP_getlex && getlex_needs_autoviv(tc, jg, ins), "Can't compile object getlex"); BAIL(opcode == MVM_OP_bindlex && bindlex_needs_write_barrier(tc, jg, ins), "Can't compile write-barrier bindlex"); /* Check annotations that may require handling or wrapping the expression */ for (ann = ins->annotations; ann != NULL; ann = ann->next) { MVMint32 idx; switch (ann->type) { case MVM_SPESH_ANN_FH_START: /* start of a frame handler (inclusive). We need to mark this * instruction with a label so that we know the handler covers * this code, and we need to install a dynamic label to tell the * interpreter that JIT execution has reached this point. */ before_label = MVM_jit_label_before_ins(tc, jg, iter->bb, ins); jg->handlers[ann->data.frame_handler_index].start_label = before_label; wrap_before = MVM_JIT_CONTROL_DYNAMIC_LABEL; break; case MVM_SPESH_ANN_FH_END: /* end of the frame handler (exclusive), funnily enough not the * end of a basic block. The dynamic label will be installed * just after the label that marks the end, which means that * jit_entry_label will compare greater-than the end label, * which ensures that the end is exclusive. */ before_label = MVM_jit_label_before_ins(tc, jg, iter->bb, ins); jg->handlers[ann->data.frame_handler_index].end_label = before_label; wrap_before = MVM_JIT_CONTROL_DYNAMIC_LABEL; break; case MVM_SPESH_ANN_FH_GOTO: /* A label to jump to for when a handler catches an * exception. Thus, this can be a control flow entry point (and * should be the start of a basic block, but I'm not sure if it * always is). */ before_label = MVM_jit_label_before_ins(tc, jg, iter->bb, ins); jg->handlers[ann->data.frame_handler_index].goto_label = before_label; active_values_flush(tc, tree, values, sg->num_locals); break; case MVM_SPESH_ANN_DEOPT_OSR: /* A label the OSR can jump into to 'start running', so to * speak. As it breaks the basic-block assumption, arguably, * this should only ever be at the start of a basic block. But * it's not. So we have to insert the label and compute it. */ before_label = MVM_jit_label_before_ins(tc, jg, iter->bb, ins); /* OSR reuses the deopt label mechanism */ MVM_VECTOR_ENSURE_SIZE(jg->deopts, idx = jg->deopts_num++); jg->deopts[idx].label = before_label; jg->deopts[idx].idx = ann->data.deopt_idx; /* possible entrypoint, so flush intermediates */ active_values_flush(tc, tree, values, sg->num_locals); break; case MVM_SPESH_ANN_INLINE_START: /* start of an inline, used for reconstructing state when deoptimizing */ before_label = MVM_jit_label_before_ins(tc, jg, iter->bb, ins); jg->inlines[ann->data.inline_idx].start_label = before_label; break; case MVM_SPESH_ANN_INLINE_END: /* end of the inline (inclusive), so we need to add a label, * which should be the end of the basic block. */ after_label = MVM_jit_label_after_ins(tc, jg, iter->bb, ins); jg->inlines[ann->data.inline_idx].end_label = after_label; break; case MVM_SPESH_ANN_DEOPT_INLINE: MVM_jit_log(tc, "Not sure if we can handle DEOPT_INLINE on instruction %s\n", ins->info->name); break; case MVM_SPESH_ANN_DEOPT_ONE_INS: /* we should only see this in guards, which we don't do just * yet, although we will. At the very least, this implies a flush. */ switch (opcode) { case MVM_OP_sp_guard: case MVM_OP_sp_guardconc: case MVM_OP_sp_guardtype: case MVM_OP_sp_guardsf: BAIL(1, "Cannot handle DEOPT_ONE (ins=%s)\n", ins->info->name); break; } break; case MVM_SPESH_ANN_DEOPT_ALL_INS: /* don't expect to be handling these, either, but these also * might need a label-after-the-fact */ after_label = MVM_jit_label_after_ins(tc, jg, iter->bb, ins); /* ensure a consistent state for deoptimization */ active_values_flush(tc, tree, values, sg->num_locals); /* add deopt idx */ MVM_VECTOR_ENSURE_SIZE(jg->deopts, idx = jg->deopts_num++); jg->deopts[idx].label = after_label; jg->deopts[idx].idx = ann->data.deopt_idx; break; } } if (opcode == MVM_SSA_PHI || opcode == MVM_OP_no_op) { /* By definition, a PHI node can only occur at the start of a basic * block. (A no_op instruction only seems to happen as the very * first instruction of a frame, and I'm not sure why). * * Thus, if it happens that we've processed annotations on those * instructions (which probably means they migrated there from * somewhere else), they always refer to the start of the basic * block, which is already assigned a label and * dynamic-control-handler. * * So we never need to do anything with this label and wrapper, but * we do need to process the annotation to setup the frame handler * correctly. */ BAIL(after_label >= 0, "A PHI node should not have an after label"); continue; } template = MVM_jit_get_template_for_opcode(opcode); BAIL(template == NULL, "Cannot get template for: %s\n", ins->info->name); check_template(tc, template, ins); MVM_jit_expr_load_operands(tc, tree, ins, values, operands); root = MVM_jit_expr_apply_template(tc, tree, template, operands); /* root is highest node by construction, so we don't have to check the size of info later */ MVM_VECTOR_ENSURE_SIZE(tree->info, root); tree->info[root].spesh_ins = ins; /* mark operand types */ for (i = 0; i < ins->info->num_operands; i++) { MVMint8 opr_kind = ins->info->operands[i]; MVMint8 opr_type = opr_kind & MVM_operand_type_mask; MVMSpeshOperand opr = ins->operands[i]; if (opr_type == MVM_operand_type_var) { switch (opr_kind & MVM_operand_rw_mask) { case MVM_operand_read_reg: case MVM_operand_write_reg: opr_type = MVM_spesh_get_reg_type(tc, sg, opr.reg.orig) << 3; /* shift up 3 to match operand type */ break; case MVM_operand_read_lex: case MVM_operand_write_lex: opr_type = MVM_spesh_get_lex_type(tc, sg, opr.lex.outers, opr.lex.idx) << 3; break; } } switch(opr_kind & MVM_operand_rw_mask) { case MVM_operand_read_reg: case MVM_operand_read_lex: tree->info[operands[i]].opr_type = opr_type; break; case MVM_operand_write_reg: /* for write_reg and write_lex, operands[i] is the *address*, * the *value* is the root, but this is only valid if the * operand index is 0 */ if (template->flags & MVM_JIT_EXPR_TEMPLATE_DESTRUCTIVE) { /* overrides any earlier definition of this local variable */ memset(values + opr.reg.orig, -1, sizeof(struct ValueDefinition)); } else { /* record this value, should be only one for the root */ BAIL(i != 0, "Write reg operand %d", i); tree->info[root].opr_type = opr_type; defined_value = values + opr.reg.orig; defined_value->addr = operands[i]; defined_value->node = root; /* this overwrites any previous definition */ defined_value->root = -1; } break; case MVM_operand_write_lex: /* does not define a value we can look up, but we may need to * insert a store */ if (!(template->flags & MVM_JIT_EXPR_TEMPLATE_DESTRUCTIVE)) { BAIL(i != 0, "Write lex operand %d", i); tree->info[root].opr_type = opr_type; /* insert the store to lexicals directly, do not record as value */ root = MVM_jit_expr_add_store(tc, tree, operands[i], root, MVM_JIT_REG_SZ); } break; } } /* NB - MVM_JIT_CONTROL_DYNAMIC_LABEL which is set in wrap_before, may * be overwritten, but that is okay, since for all uses of the DYNAMIC * LABEL, the MVM_JIT_CONTROL_THROWISH_PRE is equivalent because it * installs a jit_entry_point 'within' the labels before and after this * instructions. */ if (ins->info->jittivity & (MVM_JIT_INFO_THROWISH | MVM_JIT_INFO_INVOKISH)) { /* NB: we should make this a template-level flag; should be possible * to replace an invokish version with a non-invokish version (but * perhaps best if that is opt-in so people don't accidentally * forget to set it). */ MVM_jit_log(tc, "EXPR: adding throwish guard to op (%s)\n", ins->info->name); wrap_before = MVM_JIT_CONTROL_THROWISH_PRE; wrap_after = (ins->info->jittivity & MVM_JIT_INFO_THROWISH) ? MVM_JIT_CONTROL_THROWISH_POST : MVM_JIT_CONTROL_INVOKISH; active_values_flush(tc, tree, values, sg->num_locals); } /* Add root to tree to ensure source evaluation order, wrapped with * labels if necessary. */ if (before_label >= 0 && MVM_jit_label_is_for_ins(tc, jg, before_label)) { MVM_VECTOR_PUSH(tree->roots, MVM_jit_expr_add_label(tc, tree, before_label)); } /* NB: GUARD only wraps void nodes. Currently, we replace any * value-yielding node with it's STORE (and thereby make sure it is * flushed directly) */ if (wrap_before != 0 || wrap_after != 0) { /* install wrapper */ if (defined_value != NULL) { /* If we're wrapping this template and it defines a value, we * had maybe better flush it directly */ root = MVM_jit_expr_add_store(tc, tree, defined_value->addr, root, MVM_JIT_REG_SZ); defined_value = NULL; } root = MVM_jit_expr_wrap_guard(tc, tree, root, wrap_before, wrap_after); } if (defined_value != NULL) { defined_value->root = tree->roots_num; } MVM_VECTOR_PUSH(tree->roots, root); if (after_label >= 0 && MVM_jit_label_is_for_ins(tc, jg, after_label)) { MVM_VECTOR_PUSH(tree->roots, MVM_jit_expr_add_label(tc, tree, after_label)); } } done: if (tree->roots_num > 0) { active_values_flush(tc, tree, values, sg->num_locals); MVM_jit_expr_tree_analyze(tc, tree); MVM_jit_log(tc, "Build tree out of: ["); for (ins = entry; ins != iter->ins; ins = ins->next) { if (ins->info->opcode == MVM_SSA_PHI) continue; MVM_jit_log(tc, "%s, ", ins->info->name); } MVM_jit_log(tc, "]\n"); } else { /* Don't return empty trees, nobody wants that */ MVM_jit_expr_tree_destroy(tc, tree); tree = NULL; } MVM_free(values); return tree; } void MVM_jit_expr_tree_destroy(MVMThreadContext *tc, MVMJitExprTree *tree) { if (tree->info) MVM_free(tree->info); MVM_free(tree->nodes); MVM_free(tree->roots); MVM_free(tree); } static void walk_tree(MVMThreadContext *tc, MVMJitExprTree *tree, MVMJitTreeTraverser *traverser, MVMint32 node) { const MVMJitExprOpInfo *info = MVM_jit_expr_op_info(tc, tree->nodes[node]); MVMint32 nchild = info->nchild; MVMint32 first_child = node + 1; MVMint32 i; if (traverser->policy == MVM_JIT_TRAVERSER_ONCE && traverser->visits[node] >= 1) return; traverser->visits[node]++; /* visiting on the way down - NB want to add visitation information */ if (traverser->preorder) traverser->preorder(tc, traverser, tree, node); if (nchild < 0) { /* Variadic case: take first child as constant signifying the * number of children. Increment because the 'real' children now * start node later */ nchild = tree->nodes[first_child++]; } for (i = 0; i < nchild; i++) { /* Enter child node */ walk_tree(tc, tree, traverser, tree->nodes[first_child+i]); if (traverser->inorder) { traverser->inorder(tc, traverser, tree, node, i); } } if (traverser->postorder) { traverser->postorder(tc, traverser, tree, node); } } /* TODO specify revisiting policy */ void MVM_jit_expr_tree_traverse(MVMThreadContext *tc, MVMJitExprTree *tree, MVMJitTreeTraverser *traverser) { MVMint32 i; MVM_VECTOR_INIT(traverser->visits, tree->nodes_num); for (i = 0; i < tree->roots_num; i++) { /* TODO deal with nodes with multiple entries */ walk_tree(tc, tree, traverser, tree->roots[i]); } MVM_free(traverser->visits); } #define FIRST_CHILD(t,x) (t->info[x].op_info->nchild < 0 ? x + 2 : x + 1) /* Walk tree to get nodes along a path */ MVMint32 MVM_jit_expr_tree_get_nodes(MVMThreadContext *tc, MVMJitExprTree *tree, MVMint32 node, const char *path, MVMJitExprNode *buffer) { MVMJitExprNode *ptr = buffer; while (*path) { MVMJitExprNode cur_node = node; do { MVMint32 first_child = FIRST_CHILD(tree, cur_node) - 1; MVMint32 child_nr = *path++ - '0'; cur_node = tree->nodes[first_child+child_nr]; } while (*path != '.'); /* regs nodes go to values, others to args */ *ptr++ = cur_node; path++; } return ptr - buffer; } #undef FIRST_CHILD MoarVM-2018.03/src/jit/expr.h0000644000175000017510000000636713237701240015722 0ustar samanthasamantha/* Each node that yields a value has a type. This information can * probably be used by the code generator, somehow. */ typedef enum { /* value type */ MVM_JIT_VOID, MVM_JIT_REG, MVM_JIT_FLAG, MVM_JIT_INT, MVM_JIT_NUM, MVM_JIT_PTR, MVM_JIT_C_ARGS, } MVMJitExprVtype; #define MVM_JIT_PTR_SZ sizeof(void*) #define MVM_JIT_REG_SZ sizeof(MVMRegister) #define MVM_JIT_INT_SZ sizeof(MVMint64) #define MVM_JIT_NUM_SZ sizeof(MVMnum64) /* Control casting behaviour for mixed-sized operands */ #define MVM_JIT_NO_CAST 0 #define MVM_JIT_UNSIGNED 1 #define MVM_JIT_SIGNED 2 #include "expr_ops.h" enum { #define MVM_JIT_OP_ENUM(name, nchild, npar, vtype, cast) MVM_JIT_##name MVM_JIT_EXPR_OPS(MVM_JIT_OP_ENUM) #undef MVM_JIT_OP_ENUM }; typedef MVMint64 MVMJitExprNode; struct MVMJitExprOpInfo { const char *name; MVMint32 nchild; MVMint32 nargs; MVMJitExprVtype vtype; MVMint8 cast; }; /* Tree node information for easy access and use during compilation (a symbol table entry of sorts) */ struct MVMJitExprNodeInfo { const MVMJitExprOpInfo *op_info; /* VM instruction represented by this node */ MVMSpeshIns *spesh_ins; /* VM 'register' type represented by this node */ MVMint8 opr_type; /* Size of computed value */ MVMint8 size; /* internal label for IF/WHEN/ALL/ANY etc, relative to the tree label offset */ MVMint32 label; }; struct MVMJitExprTree { MVMJitGraph *graph; MVM_VECTOR_DECL(MVMJitExprNode, nodes); MVM_VECTOR_DECL(MVMint32, roots); MVM_VECTOR_DECL(MVMJitExprNodeInfo, info); MVMint32 label_ofs; MVMint32 num_labels; MVMuint32 seq_nr; }; struct MVMJitExprTemplate { const MVMJitExprNode *code; const char *info; MVMint32 len; MVMint32 root; MVMint32 flags; }; #define MVM_JIT_EXPR_TEMPLATE_VALUE 0 #define MVM_JIT_EXPR_TEMPLATE_DESTRUCTIVE 1 struct MVMJitTreeTraverser { void (*preorder)(MVMThreadContext *tc, MVMJitTreeTraverser *traverser, MVMJitExprTree *tree, MVMint32 node); void (*inorder)(MVMThreadContext *tc, MVMJitTreeTraverser *traverser, MVMJitExprTree *tree, MVMint32 node, MVMint32 child); void (*postorder)(MVMThreadContext *tc, MVMJitTreeTraverser *traverser, MVMJitExprTree *tree, MVMint32 node); void *data; MVM_VECTOR_DECL(MVMint32, visits); enum { MVM_JIT_TRAVERSER_REPEAT, MVM_JIT_TRAVERSER_ONCE } policy; }; const MVMJitExprOpInfo * MVM_jit_expr_op_info(MVMThreadContext *tc, MVMint32 op); /* properties of expression ops */ MVMint32 MVM_jit_expr_op_negate_flag(MVMThreadContext *tc, MVMint32 op); MVMint32 MVM_jit_expr_op_is_binary_noncommutative(MVMThreadContext *tc, MVMint32 op); MVMJitExprTree * MVM_jit_expr_tree_build(MVMThreadContext *tc, MVMJitGraph *jg, MVMSpeshIterator *iter); void MVM_jit_expr_tree_traverse(MVMThreadContext *tc, MVMJitExprTree *tree, MVMJitTreeTraverser *traverser); void MVM_jit_expr_tree_destroy(MVMThreadContext *tc, MVMJitExprTree *tree); MVMint32 MVM_jit_expr_tree_get_nodes(MVMThreadContext *tc, MVMJitExprTree *tree, MVMint32 node, const char *path, MVMJitExprNode *buffer); MoarVM-2018.03/src/jit/expr_ops.h0000644000175000017510000000542113242626641016600 0ustar samanthasamantha/* This defines a macro that defines a list which will use a macro to define a list. It's a little trick I've gained from the luajit source code - the big advantage of course is that it keeps the list consistent across multiple definitions. The first argument is the name, the second the number of children, the third the number of parameters - together they define the size of the node. The fourth argument defines the result type. This is strictly redundant for code generation, although it is used by the template compiler. The fifth argument determines how to generate a cast for mixed-sized oeprands. NB: This file is parsed by tools/expr_ops.pm *AND* included by src/jit/expr.h, so keep it in order! */ #define MVM_JIT_EXPR_OPS(_) \ /* invalid operator */ \ _(NOOP, 0, 0, VOID, NO_CAST), \ /* memory access */ \ _(LOAD, 1, 1, REG, NO_CAST), \ _(STORE, 2, 1, VOID, NO_CAST), \ _(CONST, 0, 2, REG, NO_CAST), \ _(ADDR, 1, 1, REG, UNSIGNED), \ _(IDX, 2, 1, REG, UNSIGNED), \ _(COPY, 1, 0, REG, NO_CAST), \ /* integer comparison */ \ _(LT, 2, 0, FLAG, SIGNED), \ _(LE, 2, 0, FLAG, SIGNED), \ _(EQ, 2, 0, FLAG, SIGNED), \ _(NE, 2, 0, FLAG, SIGNED), \ _(GE, 2, 0, FLAG, SIGNED), \ _(GT, 2, 0, FLAG, SIGNED), \ _(NZ, 1, 0, FLAG, UNSIGNED), \ _(ZR, 1, 0, FLAG, UNSIGNED), \ /* flag value */ \ _(FLAGVAL, 1, 0, REG, NO_CAST), \ /* force compilation but discard result */ \ _(DISCARD, 1, 0, VOID, NO_CAST), \ /* type conversion */ \ _(CAST, 1, 3, REG, NO_CAST), \ /* integer arithmetic */ \ _(ADD, 2, 0, REG, SIGNED), \ _(SUB, 2, 0, REG, SIGNED), \ /* binary operations */ \ _(AND, 2, 0, REG, UNSIGNED), \ _(OR, 2, 0, REG, UNSIGNED), \ _(XOR, 2, 0, REG, UNSIGNED), \ _(NOT, 1, 0, REG, UNSIGNED), \ /* boolean logic */ \ _(ALL, -1, 0, FLAG, NO_CAST), \ _(ANY, -1, 0, FLAG, NO_CAST), \ /* control operators */ \ _(DO, -1, 0, REG, NO_CAST), \ _(DOV, -1, 0, VOID, NO_CAST), \ _(WHEN, 2, 0, VOID, NO_CAST), \ _(IF, 3, 0, REG, NO_CAST), \ _(IFV, 3, 0, VOID, NO_CAST), \ _(BRANCH, 1, 0, VOID, NO_CAST), \ _(LABEL, 0, 1, REG, NO_CAST), \ _(MARK, 0, 1, VOID, NO_CAST), \ /* call c functions */ \ _(CALL, 2, 1, REG, NO_CAST), \ _(CALLV, 2, 0, VOID, NO_CAST), \ _(ARGLIST, -1, 0, C_ARGS, NO_CAST), \ _(CARG, 1, 1, VOID, NO_CAST), \ /* special constrol structures */ \ _(GUARD, 1, 2, VOID, NO_CAST), \ /* interpreter special variables */ \ _(TC, 0, 0, REG, NO_CAST), \ _(CU, 0, 0, REG, NO_CAST), \ _(LOCAL, 0, 0, REG, NO_CAST), \ _(STACK, 0, 0, REG, NO_CAST), \ /* End of list marker */ \ _(MAX_NODES, 0, 0, VOID, NO_CAST) MoarVM-2018.03/src/jit/graph.c0000644000175000017510000045121413252330426016034 0ustar samanthasamantha#include "moar.h" #include "math.h" static void jg_append_node(MVMJitGraph *jg, MVMJitNode *node) { if (jg->last_node) { jg->last_node->next = node; jg->last_node = node; } else { jg->first_node = node; jg->last_node = node; } node->next = NULL; } static void jg_append_primitive(MVMThreadContext *tc, MVMJitGraph *jg, MVMSpeshIns * ins) { MVMJitNode * node = MVM_spesh_alloc(tc, jg->sg, sizeof(MVMJitNode)); node->type = MVM_JIT_NODE_PRIMITIVE; node->u.prim.ins = ins; jg_append_node(jg, node); } static void jg_append_call_c(MVMThreadContext *tc, MVMJitGraph *jg, void * func_ptr, MVMint16 num_args, MVMJitCallArg *call_args, MVMJitRVMode rv_mode, MVMint16 rv_idx) { MVMJitNode * node = MVM_spesh_alloc(tc, jg->sg, sizeof(MVMJitNode)); size_t args_size = num_args * sizeof(MVMJitCallArg); node->type = MVM_JIT_NODE_CALL_C; node->u.call.func_ptr = func_ptr; node->u.call.num_args = num_args; node->u.call.has_vargs = 0; /* don't support them yet */ /* Call argument array is typically stack allocated, * so they need to be copied */ node->u.call.args = MVM_spesh_alloc(tc, jg->sg, args_size); memcpy(node->u.call.args, call_args, args_size); node->u.call.rv_mode = rv_mode; node->u.call.rv_idx = rv_idx; jg_append_node(jg, node); } static void add_deopt_idx(MVMThreadContext *tc, MVMJitGraph *jg, MVMint32 label_name, MVMint32 deopt_idx) { MVMJitDeopt deopt; deopt.label = label_name; deopt.idx = deopt_idx; MVM_VECTOR_PUSH(jg->deopts, deopt); } static void jg_append_branch(MVMThreadContext *tc, MVMJitGraph *jg, MVMint32 name, MVMSpeshIns *ins) { MVMJitNode * node = MVM_spesh_alloc(tc, jg->sg, sizeof(MVMJitNode)); node->type = MVM_JIT_NODE_BRANCH; if (ins == NULL) { node->u.branch.ins = NULL; node->u.branch.dest = name; } else { MVMSpeshBB *bb; node->u.branch.ins = ins; if (ins->info->opcode == MVM_OP_goto) { bb = ins->operands[0].ins_bb; } else if (ins->info->opcode == MVM_OP_indexat || ins->info->opcode == MVM_OP_indexnat) { bb = ins->operands[3].ins_bb; } else { bb = ins->operands[1].ins_bb; } node->u.branch.dest = MVM_jit_label_before_bb(tc, jg, bb); } jg_append_node(jg, node); } static void jg_append_label(MVMThreadContext *tc, MVMJitGraph *jg, MVMint32 name) { MVMJitNode *node; /* does this label already exist? */ MVM_VECTOR_ENSURE_SIZE(jg->label_nodes, name); if (jg->label_nodes[name] != NULL) return; node = MVM_spesh_alloc(tc, jg->sg, sizeof(MVMJitNode)); node->type = MVM_JIT_NODE_LABEL; node->u.label.name = name; jg_append_node(jg, node); jg->label_nodes[name] = node; MVM_jit_log(tc, "append label: %d\n", node->u.label.name); } static void * op_to_func(MVMThreadContext *tc, MVMint16 opcode) { switch(opcode) { case MVM_OP_checkarity: return MVM_args_checkarity; case MVM_OP_say: return MVM_string_say; case MVM_OP_print: return MVM_string_print; case MVM_OP_isnull: return MVM_is_null; case MVM_OP_capturelex: return MVM_frame_capturelex; case MVM_OP_captureinnerlex: return MVM_frame_capture_inner; case MVM_OP_takeclosure: return MVM_frame_takeclosure; case MVM_OP_usecapture: return MVM_args_use_capture; case MVM_OP_savecapture: return MVM_args_save_capture; case MVM_OP_captureposprimspec: return MVM_capture_pos_primspec; case MVM_OP_return: return MVM_args_assert_void_return_ok; case MVM_OP_return_i: return MVM_args_set_result_int; case MVM_OP_return_s: return MVM_args_set_result_str; case MVM_OP_return_o: return MVM_args_set_result_obj; case MVM_OP_return_n: return MVM_args_set_result_num; case MVM_OP_coerce_is: return MVM_coerce_i_s; case MVM_OP_coerce_ns: return MVM_coerce_n_s; case MVM_OP_coerce_si: return MVM_coerce_s_i; case MVM_OP_coerce_sn: return MVM_coerce_s_n; case MVM_OP_coerce_In: return MVM_bigint_to_num; case MVM_OP_coerce_nI: return MVM_bigint_from_num; case MVM_OP_coerce_II: return MVM_bigint_from_bigint; case MVM_OP_iterkey_s: return MVM_iterkey_s; case MVM_OP_iter: return MVM_iter; case MVM_OP_iterval: return MVM_iterval; case MVM_OP_die: return MVM_exception_die; case MVM_OP_throwdyn: case MVM_OP_throwlex: case MVM_OP_throwlexotic: case MVM_OP_rethrow: return MVM_exception_throwobj; case MVM_OP_throwcatdyn: case MVM_OP_throwcatlex: case MVM_OP_throwcatlexotic: return MVM_exception_throwcat; case MVM_OP_throwpayloadlex: return MVM_exception_throwpayload; case MVM_OP_bindexpayload: return MVM_bind_exception_payload; case MVM_OP_getexpayload: return MVM_get_exception_payload; case MVM_OP_resume: return MVM_exception_resume; case MVM_OP_continuationreset: return MVM_continuation_reset; case MVM_OP_continuationcontrol: return MVM_continuation_control; case MVM_OP_smrt_numify: return MVM_coerce_smart_numify; case MVM_OP_smrt_strify: return MVM_coerce_smart_stringify; case MVM_OP_gethow: return MVM_6model_get_how_obj; case MVM_OP_box_i: return MVM_box_int; case MVM_OP_box_s: return MVM_box_str; case MVM_OP_box_n: return MVM_box_num; case MVM_OP_unbox_i: return MVM_repr_get_int; case MVM_OP_unbox_s: return MVM_repr_get_str; case MVM_OP_unbox_n: return MVM_repr_get_num; case MVM_OP_istrue: case MVM_OP_isfalse: return MVM_coerce_istrue; case MVM_OP_istype: return MVM_6model_istype; case MVM_OP_isint: case MVM_OP_isnum: case MVM_OP_isstr: /* continued */ case MVM_OP_islist: case MVM_OP_ishash: return MVM_repr_compare_repr_id; case MVM_OP_wval: case MVM_OP_wval_wide: return MVM_sc_get_sc_object; case MVM_OP_scgetobjidx: return MVM_sc_find_object_idx_jit; case MVM_OP_getdynlex: return MVM_frame_getdynlex; case MVM_OP_binddynlex: return MVM_frame_binddynlex; case MVM_OP_getlexouter: return MVM_frame_find_lexical_by_name_outer; case MVM_OP_findmeth: case MVM_OP_findmeth_s: return MVM_6model_find_method; case MVM_OP_tryfindmeth: case MVM_OP_tryfindmeth_s: return MVM_6model_find_method; case MVM_OP_multicacheadd: return MVM_multi_cache_add; case MVM_OP_multicachefind: return MVM_multi_cache_find; case MVM_OP_can: case MVM_OP_can_s: return MVM_6model_can_method; case MVM_OP_push_i: return MVM_repr_push_i; case MVM_OP_push_n: return MVM_repr_push_n; case MVM_OP_push_s: return MVM_repr_push_s; case MVM_OP_push_o: return MVM_repr_push_o; case MVM_OP_unshift_i: return MVM_repr_unshift_i; case MVM_OP_unshift_n: return MVM_repr_unshift_n; case MVM_OP_unshift_s: return MVM_repr_unshift_s; case MVM_OP_unshift_o: return MVM_repr_unshift_o; case MVM_OP_pop_i: return MVM_repr_pop_i; case MVM_OP_pop_n: return MVM_repr_pop_n; case MVM_OP_pop_s: return MVM_repr_pop_s; case MVM_OP_pop_o: return MVM_repr_pop_o; case MVM_OP_shift_i: return MVM_repr_shift_i; case MVM_OP_shift_n: return MVM_repr_shift_n; case MVM_OP_shift_s: return MVM_repr_shift_s; case MVM_OP_shift_o: return MVM_repr_shift_o; case MVM_OP_setelemspos: return MVM_repr_pos_set_elems; case MVM_OP_splice: return MVM_repr_pos_splice; case MVM_OP_existskey: return MVM_repr_exists_key; case MVM_OP_deletekey: return MVM_repr_delete_key; case MVM_OP_atpos_i: return MVM_repr_at_pos_i; case MVM_OP_atpos_n: return MVM_repr_at_pos_n; case MVM_OP_atpos_s: return MVM_repr_at_pos_s; case MVM_OP_atpos_o: return MVM_repr_at_pos_o; case MVM_OP_existspos: return MVM_repr_exists_pos; case MVM_OP_atkey_i: return MVM_repr_at_key_i; case MVM_OP_atkey_n: return MVM_repr_at_key_n; case MVM_OP_atkey_s: return MVM_repr_at_key_s; case MVM_OP_atkey_o: return MVM_repr_at_key_o; case MVM_OP_bindpos_i: return MVM_repr_bind_pos_i; case MVM_OP_bindpos_n: return MVM_repr_bind_pos_n; case MVM_OP_bindpos_s: return MVM_repr_bind_pos_s; case MVM_OP_bindpos_o: return MVM_repr_bind_pos_o; case MVM_OP_bindkey_i: return MVM_repr_bind_key_i; case MVM_OP_bindkey_n: return MVM_repr_bind_key_n; case MVM_OP_bindkey_s: return MVM_repr_bind_key_s; case MVM_OP_bindkey_o: return MVM_repr_bind_key_o; case MVM_OP_getattr_s: return MVM_repr_get_attr_s; case MVM_OP_getattr_n: return MVM_repr_get_attr_n; case MVM_OP_getattr_i: return MVM_repr_get_attr_i; case MVM_OP_getattr_o: return MVM_repr_get_attr_o; case MVM_OP_getattrs_s: return MVM_repr_get_attr_s; case MVM_OP_getattrs_n: return MVM_repr_get_attr_n; case MVM_OP_getattrs_i: return MVM_repr_get_attr_i; case MVM_OP_getattrs_o: return MVM_repr_get_attr_o; case MVM_OP_attrinited: return MVM_repr_attribute_inited; case MVM_OP_bindattr_i: case MVM_OP_bindattr_n: case MVM_OP_bindattr_s: case MVM_OP_bindattr_o: return MVM_repr_bind_attr_inso; case MVM_OP_bindattrs_i: case MVM_OP_bindattrs_n: case MVM_OP_bindattrs_s: case MVM_OP_bindattrs_o: return MVM_repr_bind_attr_inso; case MVM_OP_hintfor: return MVM_repr_hint_for; case MVM_OP_gt_s: case MVM_OP_ge_s: case MVM_OP_lt_s: case MVM_OP_le_s: case MVM_OP_cmp_s: return MVM_string_compare; case MVM_OP_open_fh: return MVM_file_open_fh; case MVM_OP_close_fh: return MVM_io_close; case MVM_OP_eof_fh: return MVM_io_eof; case MVM_OP_write_fhb: return MVM_io_write_bytes; case MVM_OP_read_fhb: return MVM_io_read_bytes; case MVM_OP_encode: return MVM_string_encode_to_buf; case MVM_OP_decoderaddbytes: return MVM_decoder_add_bytes; case MVM_OP_decodertakeline: return MVM_decoder_take_line; case MVM_OP_elems: return MVM_repr_elems; case MVM_OP_concat_s: return MVM_string_concatenate; case MVM_OP_repeat_s: return MVM_string_repeat; case MVM_OP_flip: return MVM_string_flip; case MVM_OP_split: return MVM_string_split; case MVM_OP_escape: return MVM_string_escape; case MVM_OP_uc: return MVM_string_uc; case MVM_OP_tc: return MVM_string_tc; case MVM_OP_lc: return MVM_string_lc; case MVM_OP_fc: return MVM_string_fc; case MVM_OP_eq_s: return MVM_string_equal; case MVM_OP_eqat_s: return MVM_string_equal_at; case MVM_OP_eqatic_s: return MVM_string_equal_at_ignore_case; case MVM_OP_eqatim_s: return MVM_string_equal_at_ignore_mark; case MVM_OP_eqaticim_s: return MVM_string_equal_at_ignore_case_ignore_mark; case MVM_OP_chars: case MVM_OP_graphs_s: return MVM_string_graphs; case MVM_OP_chr: return MVM_string_chr; case MVM_OP_codes_s: return MVM_string_codes; case MVM_OP_getcp_s: return MVM_string_get_grapheme_at; case MVM_OP_index_s: return MVM_string_index; case MVM_OP_substr_s: return MVM_string_substring; case MVM_OP_join: return MVM_string_join; case MVM_OP_replace: return MVM_string_replace; case MVM_OP_iscclass: return MVM_string_is_cclass; case MVM_OP_findcclass: return MVM_string_find_cclass; case MVM_OP_findnotcclass: return MVM_string_find_not_cclass; case MVM_OP_nfarunalt: return MVM_nfa_run_alt; case MVM_OP_nfarunproto: return MVM_nfa_run_proto; case MVM_OP_nfafromstatelist: return MVM_nfa_from_statelist; case MVM_OP_hllize: return MVM_hll_map; case MVM_OP_gethllsym: return MVM_hll_sym_get; case MVM_OP_clone: return MVM_repr_clone; case MVM_OP_create: return MVM_repr_alloc_init; case MVM_OP_getcodeobj: return MVM_frame_get_code_object; case MVM_OP_isbig_I: return MVM_bigint_is_big; case MVM_OP_cmp_I: return MVM_bigint_cmp; case MVM_OP_add_I: return MVM_bigint_add; case MVM_OP_sub_I: return MVM_bigint_sub; case MVM_OP_mul_I: return MVM_bigint_mul; case MVM_OP_div_I: return MVM_bigint_div; case MVM_OP_bor_I: return MVM_bigint_or; case MVM_OP_band_I: return MVM_bigint_and; case MVM_OP_bxor_I: return MVM_bigint_xor; case MVM_OP_mod_I: return MVM_bigint_mod; case MVM_OP_lcm_I: return MVM_bigint_lcm; case MVM_OP_gcd_I: return MVM_bigint_gcd; case MVM_OP_bool_I: return MVM_bigint_bool; case MVM_OP_isprime_I: return MVM_bigint_is_prime; case MVM_OP_brshift_I: return MVM_bigint_shr; case MVM_OP_blshift_I: return MVM_bigint_shl; case MVM_OP_bnot_I: return MVM_bigint_not; case MVM_OP_div_In: return MVM_bigint_div_num; case MVM_OP_coerce_Is: case MVM_OP_base_I: return MVM_bigint_to_str; case MVM_OP_radix: return MVM_radix; case MVM_OP_radix_I: return MVM_bigint_radix; case MVM_OP_sqrt_n: return sqrt; case MVM_OP_sin_n: return sin; case MVM_OP_cos_n: return cos; case MVM_OP_tan_n: return tan; case MVM_OP_asin_n: return asin; case MVM_OP_acos_n: return acos; case MVM_OP_atan_n: return atan; case MVM_OP_atan2_n: return atan2; case MVM_OP_pow_I: return MVM_bigint_pow; case MVM_OP_rand_I: return MVM_bigint_rand; case MVM_OP_pow_n: return pow; case MVM_OP_time_n: return MVM_proc_time_n; case MVM_OP_randscale_n: return MVM_proc_randscale_n; case MVM_OP_isnanorinf: return MVM_num_isnanorinf; case MVM_OP_nativecallcast: return MVM_nativecall_cast; case MVM_OP_nativecallinvoke: return MVM_nativecall_invoke; case MVM_OP_nativeinvoke_o: return MVM_nativecall_invoke_jit; case MVM_OP_typeparameterized: return MVM_6model_parametric_type_parameterized; case MVM_OP_typeparameters: return MVM_6model_parametric_type_parameters; case MVM_OP_typeparameterat: return MVM_6model_parametric_type_parameter_at; case MVM_OP_objectid: return MVM_gc_object_id; case MVM_OP_iscont_i: return MVM_6model_container_iscont_i; case MVM_OP_iscont_n: return MVM_6model_container_iscont_n; case MVM_OP_iscont_s: return MVM_6model_container_iscont_s; case MVM_OP_isrwcont: return MVM_6model_container_iscont_rw; case MVM_OP_assign_i: return MVM_6model_container_assign_i; case MVM_OP_assign_n: return MVM_6model_container_assign_n; case MVM_OP_assign_s: return MVM_6model_container_assign_s; case MVM_OP_decont_i: return MVM_6model_container_decont_i; case MVM_OP_decont_n: return MVM_6model_container_decont_n; case MVM_OP_decont_s: return MVM_6model_container_decont_s; case MVM_OP_getrusage: return MVM_proc_getrusage; case MVM_OP_getlexref_i32: case MVM_OP_getlexref_i16: case MVM_OP_getlexref_i8: case MVM_OP_getlexref_i: return MVM_nativeref_lex_i; case MVM_OP_getlexref_n32: case MVM_OP_getlexref_n: return MVM_nativeref_lex_n; case MVM_OP_getlexref_s: return MVM_nativeref_lex_s; case MVM_OP_getattrref_i: return MVM_nativeref_attr_i; case MVM_OP_getattrref_n: return MVM_nativeref_attr_n; case MVM_OP_getattrref_s: return MVM_nativeref_attr_s; case MVM_OP_getattrsref_i: return MVM_nativeref_attr_i; case MVM_OP_getattrsref_n: return MVM_nativeref_attr_n; case MVM_OP_getattrsref_s: return MVM_nativeref_attr_s; case MVM_OP_atposref_i: return MVM_nativeref_pos_i; case MVM_OP_atposref_n: return MVM_nativeref_pos_n; case MVM_OP_atposref_s: return MVM_nativeref_pos_s; case MVM_OP_indexingoptimized: return MVM_string_indexing_optimized; case MVM_OP_sp_boolify_iter: return MVM_iter_istrue; case MVM_OP_prof_allocated: return MVM_profile_log_allocated; case MVM_OP_prof_exit: return MVM_profile_log_exit; case MVM_OP_sp_resolvecode: return MVM_frame_resolve_invokee_spesh; case MVM_OP_cas_o: return MVM_6model_container_cas; case MVM_OP_cas_i: return MVM_6model_container_cas_i; case MVM_OP_atomicinc_i: return MVM_6model_container_atomic_inc; case MVM_OP_atomicdec_i: return MVM_6model_container_atomic_dec; case MVM_OP_atomicadd_i: return MVM_6model_container_atomic_add; case MVM_OP_atomicload_o: return MVM_6model_container_atomic_load; case MVM_OP_atomicload_i: return MVM_6model_container_atomic_load_i; case MVM_OP_atomicstore_o: return MVM_6model_container_atomic_store; case MVM_OP_atomicstore_i: return MVM_6model_container_atomic_store_i; case MVM_OP_lock: return MVM_reentrantmutex_lock_checked; case MVM_OP_unlock: return MVM_reentrantmutex_unlock_checked; case MVM_OP_getexcategory: return MVM_get_exception_category; case MVM_OP_bindexcategory: return MVM_bind_exception_category; case MVM_OP_exreturnafterunwind: return MVM_exception_returnafterunwind; case MVM_OP_breakpoint: return MVM_debugserver_breakpoint_check; default: MVM_oops(tc, "JIT: No function for op %d in op_to_func (%s)", opcode, MVM_op_get_op(opcode)->name); } } static void jg_append_guard(MVMThreadContext *tc, MVMJitGraph *jg, MVMSpeshIns *ins) { MVMSpeshAnn *ann = ins->annotations; MVMJitNode *node = MVM_spesh_alloc(tc, jg->sg, sizeof(MVMJitNode)); MVMint32 deopt_idx; node->type = MVM_JIT_NODE_GUARD; node->u.guard.ins = ins; while (ann) { if (ann->type == MVM_SPESH_ANN_DEOPT_ONE_INS || ann->type == MVM_SPESH_ANN_DEOPT_INLINE) { deopt_idx = ann->data.deopt_idx; break; } ann = ann->next; } if (!ann) { MVM_oops(tc, "Can't find deopt idx annotation on spesh ins <%s>", ins->info->name); } node->u.guard.deopt_target = ins->operands[2].lit_ui32; node->u.guard.deopt_offset = jg->sg->deopt_addrs[2 * deopt_idx + 1]; jg_append_node(jg, node); } static MVMint32 consume_invoke(MVMThreadContext *tc, MVMJitGraph *jg, MVMSpeshIterator *iter, MVMSpeshIns *ins) { MVMCompUnit *cu = iter->graph->sf->body.cu; MVMint16 callsite_idx = ins->operands[0].callsite_idx; MVMCallsite *cs = cu->body.callsites[callsite_idx]; MVMSpeshIns **arg_ins = MVM_spesh_alloc(tc, iter->graph, sizeof(MVMSpeshIns*) * cs->arg_count); MVMint16 i = 0; MVMJitNode *node; MVMint32 reentry_label; MVMReturnType return_type; MVMint16 return_register; MVMint16 code_register; MVMint16 spesh_cand; MVMint16 is_fast; while ((ins = ins->next)) { switch(ins->info->opcode) { case MVM_OP_arg_i: case MVM_OP_arg_n: case MVM_OP_arg_s: case MVM_OP_arg_o: case MVM_OP_argconst_i: case MVM_OP_argconst_n: case MVM_OP_argconst_s: MVM_jit_log(tc, "Invoke arg: <%s>\n", ins->info->name); arg_ins[i++] = ins; break; case MVM_OP_invoke_v: return_type = MVM_RETURN_VOID; return_register = -1; code_register = ins->operands[0].reg.orig; spesh_cand = -1; is_fast = 0; goto checkargs; case MVM_OP_invoke_i: return_type = MVM_RETURN_INT; return_register = ins->operands[0].reg.orig; code_register = ins->operands[1].reg.orig; spesh_cand = -1; is_fast = 0; goto checkargs; case MVM_OP_invoke_n: return_type = MVM_RETURN_NUM; return_register = ins->operands[0].reg.orig; code_register = ins->operands[1].reg.orig; spesh_cand = -1; is_fast = 0; goto checkargs; case MVM_OP_invoke_s: return_type = MVM_RETURN_STR; return_register = ins->operands[0].reg.orig; code_register = ins->operands[1].reg.orig; spesh_cand = -1; is_fast = 0; goto checkargs; case MVM_OP_invoke_o: return_type = MVM_RETURN_OBJ; return_register = ins->operands[0].reg.orig; code_register = ins->operands[1].reg.orig; spesh_cand = -1; is_fast = 0; goto checkargs; case MVM_OP_nativeinvoke_o: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 site = ins->operands[1].reg.orig; MVMint16 restype = ins->operands[2].reg.orig; MVMNativeCallBody *body; MVMJitGraph *nc_jg; MVMObject *nc_site; MVMSpeshFacts *object_facts = MVM_spesh_get_facts(tc, iter->graph, ins->operands[1]); MVM_jit_log(tc, "Invoke instruction: <%s>\n", ins->info->name); if (!(object_facts->flags & MVM_SPESH_FACT_KNOWN_VALUE)) { MVM_jit_log(tc, "BAIL: op <%s> (Can't find nc_site value on spesh ins)\n", ins->info->name); return 0; } body = MVM_nativecall_get_nc_body(tc, object_facts->value.o); nc_jg = MVM_nativecall_jit_graph_for_caller_code(tc, iter->graph, body, restype, dst, arg_ins); if (nc_jg == NULL) return 0; jg->last_node->next = nc_jg->first_node; jg->last_node = nc_jg->last_node; goto success; } case MVM_OP_sp_fastinvoke_v: return_type = MVM_RETURN_VOID; return_register = -1; code_register = ins->operands[0].reg.orig; spesh_cand = ins->operands[1].lit_i16; is_fast = 1; goto checkargs; case MVM_OP_sp_fastinvoke_o: return_type = MVM_RETURN_OBJ; return_register = ins->operands[0].reg.orig;; code_register = ins->operands[1].reg.orig; spesh_cand = ins->operands[2].lit_i16; is_fast = 1; goto checkargs; case MVM_OP_sp_fastinvoke_s: return_type = MVM_RETURN_STR; return_register = ins->operands[0].reg.orig;; code_register = ins->operands[1].reg.orig; spesh_cand = ins->operands[2].lit_i16; is_fast = 1; goto checkargs; case MVM_OP_sp_fastinvoke_i: return_type = MVM_RETURN_INT; return_register = ins->operands[0].reg.orig;; code_register = ins->operands[1].reg.orig; spesh_cand = ins->operands[2].lit_i16; is_fast = 1; goto checkargs; case MVM_OP_sp_fastinvoke_n: return_type = MVM_RETURN_NUM; return_register = ins->operands[0].reg.orig;; code_register = ins->operands[1].reg.orig; spesh_cand = ins->operands[2].lit_i16; is_fast = 1; goto checkargs; default: MVM_jit_log(tc, "Unexpected opcode in invoke sequence: <%s>\n", ins->info->name); return 0; } } checkargs: if (!ins || i < cs->arg_count) { MVM_jit_log(tc, "Could not find invoke opcode or enough arguments\n" "BAIL: op <%s>, expected args: %d, num of args: %d\n", ins? ins->info->name : "NULL", i, cs->arg_count); return 0; } MVM_jit_log(tc, "Invoke instruction: <%s>\n", ins->info->name); /* get label /after/ current (invoke) ins, where we'll need to reenter the JIT */ reentry_label = MVM_jit_label_after_ins(tc, jg, iter->bb, ins); /* create invoke node */ node = MVM_spesh_alloc(tc, jg->sg, sizeof(MVMJitNode)); node->type = MVM_JIT_NODE_INVOKE; node->u.invoke.callsite_idx = callsite_idx; node->u.invoke.arg_count = cs->arg_count; node->u.invoke.arg_ins = arg_ins; node->u.invoke.return_type = return_type; node->u.invoke.return_register = return_register; node->u.invoke.code_register = code_register; node->u.invoke.spesh_cand = spesh_cand; node->u.invoke.reentry_label = reentry_label; node->u.invoke.is_fast = is_fast; jg_append_node(jg, node); /* append reentry label */ jg_append_label(tc, jg, reentry_label); success: /* move forward to invoke ins */ iter->ins = ins; return 1; } static void jg_append_control(MVMThreadContext *tc, MVMJitGraph *jg, MVMSpeshIns *ins, MVMJitControlType ctrl) { MVMJitNode *node = MVM_spesh_alloc(tc, jg->sg, sizeof(MVMJitNode)); node->type = MVM_JIT_NODE_CONTROL; node->u.control.ins = ins; node->u.control.type = ctrl; jg_append_node(jg, node); } static MVMint32 consume_jumplist(MVMThreadContext *tc, MVMJitGraph *jg, MVMSpeshIterator *iter, MVMSpeshIns *ins) { MVMint64 num_labels = ins->operands[0].lit_i64; MVMint16 idx_reg = ins->operands[1].reg.orig; MVMint32 *in_labels = MVM_spesh_alloc(tc, jg->sg, sizeof(MVMint32) * num_labels); MVMint32 *out_labels = MVM_spesh_alloc(tc, jg->sg, sizeof(MVMint32) * num_labels); MVMSpeshBB *bb = iter->bb; MVMJitNode *node; MVMint64 i; for (i = 0; i < num_labels; i++) { bb = bb->linear_next; /* take the next basic block */ if (!bb || bb->first_ins != bb->last_ins) return 0; /* which must exist */ ins = bb->first_ins; /* and it's first and only entry */ if (ins->info->opcode != MVM_OP_goto) /* which must be a goto */ return 0; in_labels[i] = MVM_jit_label_before_bb(tc, jg, bb); out_labels[i] = MVM_jit_label_before_bb(tc, jg, ins->operands[0].ins_bb); } /* build the node */ node = MVM_spesh_alloc(tc, jg->sg, sizeof(MVMJitNode)); node->type = MVM_JIT_NODE_JUMPLIST; node->u.jumplist.num_labels = num_labels; node->u.jumplist.reg = idx_reg; node->u.jumplist.in_labels = in_labels; node->u.jumplist.out_labels = out_labels; jg_append_node(jg, node); /* set iterator bb and ins to the end of our jumplist */ iter->bb = bb; iter->ins = ins; return 1; } static MVMint32 jg_add_data_node(MVMThreadContext *tc, MVMJitGraph *jg, void *data, size_t size) { MVMJitNode *node = MVM_spesh_alloc(tc, jg->sg, sizeof(MVMJitNode)); MVMint32 label = MVM_jit_label_for_obj(tc, jg, data); node->type = MVM_JIT_NODE_DATA; node->u.data.data = data; node->u.data.size = size; node->u.data.label = label; jg_append_node(jg, node); return label; } static MVMuint16 * try_fake_extop_regs(MVMThreadContext *tc, MVMSpeshGraph *sg, MVMSpeshIns *ins, size_t *bufsize) { MVMuint16 *regs = MVM_spesh_alloc(tc, sg, (*bufsize = (ins->info->num_operands * sizeof(MVMuint16)))); MVMuint16 i; for (i = 0; i < ins->info->num_operands; i++) { switch (ins->info->operands[i] & MVM_operand_rw_mask) { case MVM_operand_read_reg: case MVM_operand_write_reg: regs[i] = ins->operands[i].reg.orig; break; default: MVM_free(regs); return NULL; } } return regs; } static void log_inline(MVMThreadContext *tc, MVMSpeshGraph *sg, MVMint32 inline_idx, MVMint32 is_entry) { MVMStaticFrame *sf = sg->inlines[inline_idx].sf; char *name = MVM_string_utf8_encode_C_string(tc, sf->body.name); char *cuuid = MVM_string_utf8_encode_C_string(tc, sf->body.cuuid); MVM_jit_log(tc, "%s inline %d (name: %s, cuuid: %s)\n", is_entry ? "Entering" : "Leaving", inline_idx, name, cuuid); MVM_free(name); MVM_free(cuuid); } static void before_ins(MVMThreadContext *tc, MVMJitGraph *jg, MVMSpeshIterator *iter, MVMSpeshIns *ins) { MVMSpeshBB *bb = iter->bb; MVMSpeshAnn *ann = ins->annotations; MVMint32 has_label = 0, has_dynamic_control = 0, label; /* Search annotations for stuff that may need a label. */ while (ann) { switch(ann->type) { case MVM_SPESH_ANN_DEOPT_OSR: { /* get label before our instruction */ label = MVM_jit_label_before_ins(tc, jg, bb, ins); add_deopt_idx(tc, jg, label, ann->data.deopt_idx); has_label = 1; break; } case MVM_SPESH_ANN_FH_START: { label = MVM_jit_label_before_ins(tc, jg, bb, ins); jg->handlers[ann->data.frame_handler_index].start_label = label; has_label = 1; has_dynamic_control = 1; /* Load the current position into the jit entry label, so that * when throwing we'll know which handler to use */ break; } case MVM_SPESH_ANN_FH_END: { label = MVM_jit_label_before_ins(tc, jg, bb, ins); jg->handlers[ann->data.frame_handler_index].end_label = label; /* Same as above. Note that the dynamic label control * actually loads a position a few bytes away from the * label appended above. This is in this case intentional * because the frame handler end is exclusive; once it is * passed we should not use the same handler again. If we * loaded the exact same position, we would not be able to * distinguish between the end of the basic block to which * the handler applies and the start of the basic block to * which it doesn't. */ has_label = 1; has_dynamic_control = 1; break; } case MVM_SPESH_ANN_FH_GOTO: { label = MVM_jit_label_before_ins(tc, jg, bb, ins); jg->handlers[ann->data.frame_handler_index].goto_label = label; has_label = 1; break; } case MVM_SPESH_ANN_INLINE_START: { label = MVM_jit_label_before_ins(tc, jg, bb, ins); jg->inlines[ann->data.inline_idx].start_label = label; if (tc->instance->jit_log_fh) log_inline(tc, jg->sg, ann->data.inline_idx, 1); has_label = 1; break; } } /* switch */ ann = ann->next; } if (has_label) { jg_append_label(tc, jg, label); } if (has_dynamic_control) { MVM_jit_log(tc, "Dynamic control label on ins %s\n", ins->info->name); jg_append_control(tc, jg, ins, MVM_JIT_CONTROL_DYNAMIC_LABEL); } if (ins->info->jittivity & (MVM_JIT_INFO_THROWISH | MVM_JIT_INFO_INVOKISH)) { jg_append_control(tc, jg, ins, MVM_JIT_CONTROL_THROWISH_PRE); } } static void after_ins(MVMThreadContext *tc, MVMJitGraph *jg, MVMSpeshIterator *iter, MVMSpeshIns *ins) { MVMSpeshBB *bb = iter->bb; MVMSpeshAnn *ann = ins->annotations; /* If we've consumed an (or throwish) op, we should append a guard */ if (ins->info->jittivity & MVM_JIT_INFO_INVOKISH) { MVM_jit_log(tc, "append invokish control guard\n"); jg_append_control(tc, jg, ins, MVM_JIT_CONTROL_INVOKISH); } else if (ins->info->jittivity & MVM_JIT_INFO_THROWISH) { jg_append_control(tc, jg, ins, MVM_JIT_CONTROL_THROWISH_POST); } /* This order of processing is necessary to ensure that a label * calculated by one of the control guards as well as the labels * calculated below point to the exact same instruction. This is a * relatively fragile construction! One could argue that the * control guards should in fact use the same (dynamic) labels. */ while (ann) { if (ann->type == MVM_SPESH_ANN_INLINE_END) { MVMint32 label = MVM_jit_label_after_ins(tc, jg, bb, ins); jg_append_label(tc, jg, label); jg->inlines[ann->data.inline_idx].end_label = label; if (tc->instance->jit_log_fh) log_inline(tc, jg->sg, ann->data.inline_idx, 0); } else if (ann->type == MVM_SPESH_ANN_DEOPT_ALL_INS) { /* An underlying assumption here is that this instruction * will in fact set the jit_entry_label to a correct * value. This is clearly true for invoking ops as well * as invokish ops, and in fact there is no other way * to get a deopt_all_ins annotation. Still, be warned. */ MVMint32 label = MVM_jit_label_after_ins(tc, jg, bb, ins); jg_append_label(tc, jg, label); add_deopt_idx(tc, jg, label, ann->data.deopt_idx); } ann = ann->next; } } static void jg_sc_wb(MVMThreadContext *tc, MVMJitGraph *jg, MVMSpeshOperand check) { MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, check.reg.orig } }; jg_append_call_c(tc, jg, &MVM_SC_WB_OBJ, 2, args, MVM_JIT_RV_VOID, -1); } static MVMint32 consume_reprop(MVMThreadContext *tc, MVMJitGraph *jg, MVMSpeshIterator *iterator, MVMSpeshIns *ins) { MVMint16 op = ins->info->opcode; MVMSpeshOperand type_operand; MVMSpeshFacts *type_facts = 0; MVMint32 alternative = 0; switch (op) { case MVM_OP_unshift_i: case MVM_OP_unshift_n: case MVM_OP_unshift_s: case MVM_OP_unshift_o: case MVM_OP_bindkey_i: case MVM_OP_bindkey_n: case MVM_OP_bindkey_s: case MVM_OP_bindkey_o: case MVM_OP_bindpos_i: case MVM_OP_bindpos_n: case MVM_OP_bindpos_s: case MVM_OP_bindpos_o: case MVM_OP_bindattr_i: case MVM_OP_bindattr_n: case MVM_OP_bindattr_s: case MVM_OP_bindattr_o: case MVM_OP_bindattrs_i: case MVM_OP_bindattrs_n: case MVM_OP_bindattrs_s: case MVM_OP_bindattrs_o: case MVM_OP_push_i: case MVM_OP_push_n: case MVM_OP_push_s: case MVM_OP_push_o: case MVM_OP_deletekey: case MVM_OP_setelemspos: case MVM_OP_splice: type_operand = ins->operands[0]; break; case MVM_OP_atpos_i: case MVM_OP_atpos_n: case MVM_OP_atpos_s: case MVM_OP_atpos_o: case MVM_OP_atkey_i: case MVM_OP_atkey_n: case MVM_OP_atkey_s: case MVM_OP_atkey_o: case MVM_OP_elems: case MVM_OP_shift_i: case MVM_OP_shift_n: case MVM_OP_shift_s: case MVM_OP_shift_o: case MVM_OP_pop_i: case MVM_OP_pop_n: case MVM_OP_pop_s: case MVM_OP_pop_o: case MVM_OP_existskey: case MVM_OP_existspos: case MVM_OP_getattr_i: case MVM_OP_getattr_n: case MVM_OP_getattr_s: case MVM_OP_getattr_o: case MVM_OP_getattrs_i: case MVM_OP_getattrs_n: case MVM_OP_getattrs_s: case MVM_OP_getattrs_o: case MVM_OP_attrinited: case MVM_OP_hintfor: type_operand = ins->operands[1]; break; case MVM_OP_box_i: case MVM_OP_box_n: case MVM_OP_box_s: type_operand = ins->operands[2]; break; default: MVM_jit_log(tc, "devirt: couldn't figure out type operand for op %s\n", ins->info->name); return 0; } type_facts = MVM_spesh_get_facts(tc, jg->sg, type_operand); if (type_facts && type_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && type_facts->type && type_facts->flags & MVM_SPESH_FACT_CONCRETE) { switch(op) { case MVM_OP_atkey_i: case MVM_OP_atkey_n: case MVM_OP_atkey_s: case MVM_OP_atkey_o: alternative = 1; case MVM_OP_atpos_i: case MVM_OP_atpos_n: case MVM_OP_atpos_s: case MVM_OP_atpos_o: { /* atpos_i w(int64) r(obj) r(int64) */ /* atkey_i w(int64) r(obj) r(str)*/ /*void (*at_pos) (MVMThreadContext *tc, MVMSTable *st, * MVMObject *root, void *data, MVMint64 index, * MVMRegister *result, MVMuint16 kind);*/ /*REPR(obj)->pos_funcs.at_pos(tc, STABLE(obj), obj, OBJECT_BODY(obj), * idx, &value, MVM_reg_int64);*/ MVMint32 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMint32 value = ins->operands[2].reg.orig; void *function = alternative ? (void *)((MVMObject*)type_facts->type)->st->REPR->ass_funcs.at_key : (void *)((MVMObject*)type_facts->type)->st->REPR->pos_funcs.at_pos; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_STABLE, invocant }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_OBJBODY, invocant }, { MVM_JIT_REG_VAL, value }, { MVM_JIT_REG_ADDR, dst }, { MVM_JIT_LITERAL, op == MVM_OP_atpos_i || op == MVM_OP_atkey_i ? MVM_reg_int64 : op == MVM_OP_atpos_n || op == MVM_OP_atkey_n ? MVM_reg_num64 : op == MVM_OP_atpos_s || op == MVM_OP_atkey_s ? MVM_reg_str : MVM_reg_obj } }; jg_append_call_c(tc, jg, function, 7, args, MVM_JIT_RV_VOID, -1); MVM_jit_log(tc, "devirt: emitted an %s via consume_reprop\n", ins->info->name); return 1; } case MVM_OP_bindkey_i: case MVM_OP_bindkey_n: case MVM_OP_bindkey_s: case MVM_OP_bindkey_o: alternative = 1; case MVM_OP_bindpos_i: case MVM_OP_bindpos_n: case MVM_OP_bindpos_s: case MVM_OP_bindpos_o: { /*bindpos_i r(obj) r(int64) r(int64)*/ /*bindkey_i r(obj) r(str) r(int64)*/ /* void (*bind_pos) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMint64 index, MVMRegister value, MVMuint16 kind); */ /* void (*bind_key) (MVMThreadContext *tc, MVMSTable *st, MVMObject *root, void *data, MVMObject *key, MVMRegister value, MVMuint16 kind); */ MVMint32 invocant = ins->operands[0].reg.orig; MVMint32 key = ins->operands[1].reg.orig; MVMint32 value = ins->operands[2].reg.orig; void *function = alternative ? (void *)((MVMObject*)type_facts->type)->st->REPR->ass_funcs.bind_key : (void *)((MVMObject*)type_facts->type)->st->REPR->pos_funcs.bind_pos; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_STABLE, invocant }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_OBJBODY, invocant }, { MVM_JIT_REG_VAL, key }, { MVM_JIT_REG_VAL, value }, { MVM_JIT_LITERAL, op == MVM_OP_bindpos_i || op == MVM_OP_bindkey_i ? MVM_reg_int64 : op == MVM_OP_bindpos_n || op == MVM_OP_bindkey_n ? MVM_reg_num64 : op == MVM_OP_bindpos_s || op == MVM_OP_bindkey_s ? MVM_reg_str : MVM_reg_obj } }; jg_append_call_c(tc, jg, function, 7, args, MVM_JIT_RV_VOID, -1); MVM_jit_log(tc, "devirt: emitted a %s via consume_reprop\n", ins->info->name); jg_sc_wb(tc, jg, ins->operands[0]); return 1; } case MVM_OP_elems: { /*elems w(int64) r(obj) :pure*/ MVMint32 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; void *function = ((MVMObject*)type_facts->type)->st->REPR->elems; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_STABLE, invocant }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_OBJBODY, invocant } }; jg_append_call_c(tc, jg, function, 4, args, MVM_JIT_RV_INT, dst); MVM_jit_log(tc, "devirt: emitted an elems via consume_reprop\n"); return 1; } case MVM_OP_getattr_i: case MVM_OP_getattr_n: case MVM_OP_getattr_s: case MVM_OP_getattr_o: case MVM_OP_getattrs_i: case MVM_OP_getattrs_n: case MVM_OP_getattrs_s: case MVM_OP_getattrs_o: { /*getattr_i w(int64) r(obj) r(obj) str int16*/ /*getattrs_i w(int64) r(obj) r(obj) r(str)*/ /*static void get_attribute(MVMThreadContext *tc, MVMSTable *st, MVMObject *root,*/ /* void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint,*/ /* MVMRegister *result_reg, MVMuint16 kind) {*/ /* reprconv and interp.c check for concreteness, so we'd either * have to emit a bit of code to check and throw or just rely * on a concreteness fact */ MVMSpeshFacts *object_facts = MVM_spesh_get_facts(tc, jg->sg, ins->operands[1]); if (object_facts->flags & MVM_SPESH_FACT_CONCRETE) { MVMint32 is_name_direct = ins->info->num_operands == 5; MVMint32 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMint32 type = ins->operands[2].reg.orig; MVMint32 attrname = is_name_direct ? ins->operands[3].lit_str_idx : ins->operands[3].reg.orig; MVMint32 attrhint = is_name_direct ? ins->operands[4].lit_i16 : -1; void *function = ((MVMObject*)type_facts->type)->st->REPR->attr_funcs.get_attribute; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_STABLE, invocant }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_OBJBODY, invocant }, { MVM_JIT_REG_VAL, type }, { is_name_direct ? MVM_JIT_STR_IDX : MVM_JIT_REG_VAL, attrname }, { MVM_JIT_LITERAL, attrhint }, { MVM_JIT_REG_ADDR, dst }, { MVM_JIT_LITERAL, op == MVM_OP_getattr_i || op == MVM_OP_getattrs_i ? MVM_reg_int64 : op == MVM_OP_getattr_n || op == MVM_OP_getattrs_n ? MVM_reg_num64 : op == MVM_OP_getattr_s || op == MVM_OP_getattrs_s ? MVM_reg_str : MVM_reg_obj } }; MVM_jit_log(tc, "devirt: emitted a %s via consume_reprop\n", ins->info->name); jg_append_call_c(tc, jg, function, 9, args, MVM_JIT_RV_VOID, -1); return 1; } else { MVM_jit_log(tc, "devirt: couldn't %s; concreteness not sure\n", ins->info->name); break; } } case MVM_OP_attrinited: { /*attrinited w(int64) r(obj) r(obj) r(str)*/ /*MVMint64 (*is_attribute_initialized) (MVMThreadContext *tc, MVMSTable *st,*/ /*void *data, MVMObject *class_handle, MVMString *name,*/ /*MVMint64 hint);*/ /* reprconv and interp.c check for concreteness, so we'd either * have to emit a bit of code to check and throw or just rely * on a concreteness fact */ MVMSpeshFacts *object_facts = MVM_spesh_get_facts(tc, jg->sg, ins->operands[1]); if (object_facts->flags & MVM_SPESH_FACT_CONCRETE) { MVMint32 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMint32 type = ins->operands[2].reg.orig; MVMint32 attrname = ins->operands[3].reg.orig; MVMint32 attrhint = MVM_NO_HINT; void *function = ((MVMObject*)type_facts->type)->st->REPR->attr_funcs.is_attribute_initialized; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_STABLE, invocant }, { MVM_JIT_REG_OBJBODY, invocant }, { MVM_JIT_REG_VAL, type }, { MVM_JIT_REG_VAL, attrname }, { MVM_JIT_LITERAL, attrhint } }; MVM_jit_log(tc, "devirt: emitted a %s via jgb_consume_reprop\n", ins->info->name); jg_append_call_c(tc, jg, function, 6, args, MVM_JIT_RV_INT, dst); return 1; } else { MVM_jit_log(tc, "devirt: couldn't %s; concreteness not sure\n", ins->info->name); break; } } case MVM_OP_bindattr_i: case MVM_OP_bindattr_n: case MVM_OP_bindattr_s: case MVM_OP_bindattr_o: case MVM_OP_bindattrs_i: case MVM_OP_bindattrs_n: case MVM_OP_bindattrs_s: case MVM_OP_bindattrs_o: { /*bindattr_n r(obj) r(obj) str r(num64) int16*/ /*bindattrs_n r(obj) r(obj) r(str) r(num64)*/ /* static void bind_attribute(MVMThreadContext *tc, MVMSTable *st, MVMObject *root, * void *data, MVMObject *class_handle, MVMString *name, MVMint64 hint, * MVMRegister value_reg, MVMuint16 kind) */ /* reprconv and interp.c check for concreteness, so we'd either * have to emit a bit of code to check and throw or just rely * on a concreteness fact */ MVMSpeshFacts *object_facts = MVM_spesh_get_facts(tc, jg->sg, ins->operands[1]); if (object_facts->flags & MVM_SPESH_FACT_CONCRETE) { MVMint32 is_name_direct = ins->info->num_operands == 5; MVMint32 invocant = ins->operands[0].reg.orig; MVMint32 type = ins->operands[1].reg.orig; MVMint32 attrname = is_name_direct ? ins->operands[2].lit_str_idx : ins->operands[2].reg.orig; MVMint32 attrhint = is_name_direct ? ins->operands[4].lit_i16 : -1; MVMint32 value = ins->operands[3].reg.orig; void *function = ((MVMObject*)type_facts->type)->st->REPR->attr_funcs.bind_attribute; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_STABLE, invocant }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_OBJBODY, invocant }, { MVM_JIT_REG_VAL, type }, { is_name_direct ? MVM_JIT_STR_IDX : MVM_JIT_REG_VAL, attrname }, { MVM_JIT_LITERAL, attrhint }, { MVM_JIT_REG_VAL, value }, { MVM_JIT_LITERAL, op == MVM_OP_bindattr_i || op == MVM_OP_bindattrs_i ? MVM_reg_int64 : op == MVM_OP_bindattr_n || op == MVM_OP_bindattrs_n ? MVM_reg_num64 : op == MVM_OP_bindattr_s || op == MVM_OP_bindattrs_s ? MVM_reg_str : MVM_reg_obj } }; MVM_jit_log(tc, "devirt: emitted a %s via consume_reprop\n", ins->info->name); jg_append_call_c(tc, jg, function, 9, args, MVM_JIT_RV_VOID, -1); jg_sc_wb(tc, jg, ins->operands[0]); return 1; } else { MVM_jit_log(tc, "devirt: couldn't %s; concreteness not sure\n", ins->info->name); break; } } case MVM_OP_hintfor: { /* * MVMint64 (*hint_for) (MVMThreadContext *tc, MVMSTable *st, * MVMObject *class_handle, MVMString *name); */ MVMint32 result = ins->operands[0].reg.orig; MVMint32 type = ins->operands[1].reg.orig; MVMint32 attrname = ins->operands[2].reg.orig; void *function = ((MVMObject*)type_facts->type)->st->REPR->attr_funcs.hint_for; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_STABLE, type }, { MVM_JIT_REG_VAL, type }, { MVM_JIT_REG_VAL, attrname } }; MVM_jit_log(tc, "devirt: emitted a %s via consume_reprop\n", ins->info->name); jg_append_call_c(tc, jg, function, 4, args, MVM_JIT_RV_INT, result); return 1; break; } case MVM_OP_push_i: case MVM_OP_push_n: case MVM_OP_push_s: case MVM_OP_push_o: alternative = 1; case MVM_OP_unshift_i: case MVM_OP_unshift_n: case MVM_OP_unshift_s: case MVM_OP_unshift_o: { MVMint32 invocant = ins->operands[0].reg.orig; MVMint32 value = ins->operands[1].reg.orig; void *function = alternative ? (void *)((MVMObject*)type_facts->type)->st->REPR->pos_funcs.push : (void *)((MVMObject*)type_facts->type)->st->REPR->pos_funcs.unshift; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_STABLE, invocant }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_OBJBODY, invocant }, { MVM_JIT_REG_VAL, value }, { MVM_JIT_LITERAL, op == MVM_OP_push_i || op == MVM_OP_unshift_i ? MVM_reg_int64 : op == MVM_OP_push_n || op == MVM_OP_unshift_n ? MVM_reg_num64 : op == MVM_OP_push_s || op == MVM_OP_unshift_s ? MVM_reg_str : MVM_reg_obj } }; jg_append_call_c(tc, jg, function, 6, args, MVM_JIT_RV_VOID, -1); MVM_jit_log(tc, "devirt: emitted a %s via consume_reprop\n", ins->info->name); jg_sc_wb(tc, jg, ins->operands[0]); return 1; } case MVM_OP_pop_i: case MVM_OP_pop_n: case MVM_OP_pop_s: case MVM_OP_pop_o: alternative = 1; case MVM_OP_shift_i: case MVM_OP_shift_n: case MVM_OP_shift_s: case MVM_OP_shift_o: { MVMint32 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; void *function = alternative ? (void *)((MVMObject*)type_facts->type)->st->REPR->pos_funcs.pop : (void *)((MVMObject*)type_facts->type)->st->REPR->pos_funcs.shift; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_STABLE, invocant }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_OBJBODY, invocant }, { MVM_JIT_REG_ADDR, dst }, { MVM_JIT_LITERAL, op == MVM_OP_pop_i || op == MVM_OP_shift_i ? MVM_reg_int64 : op == MVM_OP_pop_n || op == MVM_OP_shift_n ? MVM_reg_num64 : op == MVM_OP_pop_s || op == MVM_OP_shift_s ? MVM_reg_str : MVM_reg_obj } }; jg_append_call_c(tc, jg, function, 6, args, MVM_JIT_RV_VOID, -1); MVM_jit_log(tc, "devirt: emitted a %s via consume_reprop\n", ins->info->name); return 1; } case MVM_OP_setelemspos: { MVMint32 invocant = ins->operands[0].reg.orig; MVMint32 amount = ins->operands[1].reg.orig; void *function = ((MVMObject*)type_facts->type)->st->REPR->pos_funcs.set_elems; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_STABLE, invocant }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_OBJBODY, invocant }, { MVM_JIT_REG_VAL, amount } }; jg_append_call_c(tc, jg, function, 5, args, MVM_JIT_RV_VOID, -1); MVM_jit_log(tc, "devirt: emitted a %s via consume_reprop\n", ins->info->name); return 1; } case MVM_OP_existskey: { /*existskey w(int64) r(obj) r(str) :pure*/ MVMint32 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMint32 keyidx = ins->operands[2].reg.orig; void *function = (void *)((MVMObject*)type_facts->type)->st->REPR->ass_funcs.exists_key; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_STABLE, invocant }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_OBJBODY, invocant }, { MVM_JIT_REG_VAL, keyidx } }; jg_append_call_c(tc, jg, function, 5, args, MVM_JIT_RV_INT, dst); MVM_jit_log(tc, "devirt: emitted a %s via consume_reprop\n", ins->info->name); return 1; } default: MVM_jit_log(tc, "devirt: please implement emitting repr op %s\n", ins->info->name); } } else { MVM_jit_log(tc, "devirt: repr op %s couldn't be devirtualized: type unknown\n", ins->info->name); } skipdevirt: switch(op) { case MVM_OP_push_i: case MVM_OP_push_s: case MVM_OP_push_o: case MVM_OP_unshift_i: case MVM_OP_unshift_s: case MVM_OP_unshift_o: { MVMint32 invocant = ins->operands[0].reg.orig; MVMint32 value = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_VAL, value } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_VOID, -1); jg_sc_wb(tc, jg, ins->operands[0]); break; } case MVM_OP_unshift_n: case MVM_OP_push_n: { MVMint32 invocant = ins->operands[0].reg.orig; MVMint32 value = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_VAL_F, value } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_shift_s: case MVM_OP_pop_s: case MVM_OP_shift_o: case MVM_OP_pop_o: { MVMint16 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_shift_i: case MVM_OP_pop_i: { MVMint16 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_shift_n: case MVM_OP_pop_n: { MVMint16 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_NUM, dst); break; } case MVM_OP_deletekey: case MVM_OP_setelemspos: { MVMint32 invocant = ins->operands[0].reg.orig; MVMint32 key_or_val = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_VAL, key_or_val } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_existskey: { MVMint16 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMint32 key = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_VAL, key } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_splice: { MVMint16 invocant = ins->operands[0].reg.orig; MVMint16 source = ins->operands[1].reg.orig; MVMint16 offset = ins->operands[2].reg.orig; MVMint16 count = ins->operands[3].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_VAL, source }, { MVM_JIT_REG_VAL, offset }, { MVM_JIT_REG_VAL, count } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 5, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_existspos: case MVM_OP_atkey_i: case MVM_OP_atpos_i: { MVMint16 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMint32 position = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_VAL, position } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_atkey_n: case MVM_OP_atpos_n: { MVMint16 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMint32 position = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_VAL, position } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_NUM, dst); break; } case MVM_OP_atpos_o: case MVM_OP_atkey_o: case MVM_OP_atkey_s: case MVM_OP_atpos_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMint32 position = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_VAL, position } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_bindkey_n: case MVM_OP_bindpos_n: { MVMint32 invocant = ins->operands[0].reg.orig; MVMint32 key_pos = ins->operands[1].reg.orig; MVMint32 value = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_VAL, key_pos }, { MVM_JIT_REG_VAL_F, value } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_VOID, -1); jg_sc_wb(tc, jg, ins->operands[0]); break; } case MVM_OP_bindpos_i: case MVM_OP_bindpos_s: case MVM_OP_bindpos_o: case MVM_OP_bindkey_i: case MVM_OP_bindkey_s: case MVM_OP_bindkey_o: { MVMint32 invocant = ins->operands[0].reg.orig; MVMint32 key_pos = ins->operands[1].reg.orig; MVMint32 value = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_VAL, key_pos }, { MVM_JIT_REG_VAL, value } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_VOID, -1); jg_sc_wb(tc, jg, ins->operands[0]); break; } case MVM_OP_getattr_i: case MVM_OP_getattr_n: case MVM_OP_getattr_s: case MVM_OP_getattr_o: { MVMuint16 kind = op == MVM_OP_getattr_i ? MVM_JIT_RV_INT : op == MVM_OP_getattr_n ? MVM_JIT_RV_NUM : op == MVM_OP_getattr_s ? MVM_JIT_RV_PTR : /* MVM_OP_getattr_o ? */ MVM_JIT_RV_PTR; MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMint16 typ = ins->operands[2].reg.orig; MVMuint32 str_idx = ins->operands[3].lit_str_idx; MVMint16 hint = ins->operands[4].lit_i16; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, obj }, { MVM_JIT_REG_VAL, typ }, { MVM_JIT_STR_IDX, str_idx }, { MVM_JIT_LITERAL, hint }}; jg_append_call_c(tc, jg, op_to_func(tc, op), 5, args, kind, dst); break; } case MVM_OP_getattrs_i: case MVM_OP_getattrs_n: case MVM_OP_getattrs_s: case MVM_OP_getattrs_o: { MVMuint16 kind = op == MVM_OP_getattrs_i ? MVM_JIT_RV_INT : op == MVM_OP_getattrs_n ? MVM_JIT_RV_NUM : op == MVM_OP_getattrs_s ? MVM_JIT_RV_PTR : /* MVM_OP_getattrs_o ? */ MVM_JIT_RV_PTR; MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMint16 typ = ins->operands[2].reg.orig; MVMint16 str = ins->operands[3].reg.orig; MVMint16 hint = -1; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, obj }, { MVM_JIT_REG_VAL, typ }, { MVM_JIT_REG_VAL, str }, { MVM_JIT_LITERAL, hint }}; jg_append_call_c(tc, jg, op_to_func(tc, op), 5, args, kind, dst); break; } case MVM_OP_attrinited: { MVMint32 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMint32 type = ins->operands[2].reg.orig; MVMint32 attrname = ins->operands[3].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_VAL, type }, { MVM_JIT_REG_VAL, attrname } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_bindattr_i: case MVM_OP_bindattr_n: case MVM_OP_bindattr_s: case MVM_OP_bindattr_o: { MVMint16 obj = ins->operands[0].reg.orig; MVMint16 typ = ins->operands[1].reg.orig; MVMuint32 str_idx = ins->operands[2].lit_str_idx; MVMint16 val = ins->operands[3].reg.orig; MVMint16 hint = ins->operands[4].lit_i16; MVMuint16 kind = op == MVM_OP_bindattr_i ? MVM_reg_int64 : op == MVM_OP_bindattr_n ? MVM_reg_num64 : op == MVM_OP_bindattr_s ? MVM_reg_str : /* MVM_OP_bindattr_o ? */ MVM_reg_obj; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, obj }, { MVM_JIT_REG_VAL, typ }, { MVM_JIT_STR_IDX, str_idx }, { MVM_JIT_LITERAL, hint }, { MVM_JIT_REG_VAL, val }, /* Takes MVMRegister, so no _F needed. */ { MVM_JIT_LITERAL, kind } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 7, args, MVM_JIT_RV_VOID, -1); jg_sc_wb(tc, jg, ins->operands[0]); break; } case MVM_OP_bindattrs_i: case MVM_OP_bindattrs_n: case MVM_OP_bindattrs_s: case MVM_OP_bindattrs_o: { MVMint16 obj = ins->operands[0].reg.orig; MVMint16 typ = ins->operands[1].reg.orig; MVMint16 str = ins->operands[2].reg.orig; MVMint16 val = ins->operands[3].reg.orig; MVMint16 hint = -1; MVMuint16 kind = op == MVM_OP_bindattrs_i ? MVM_reg_int64 : op == MVM_OP_bindattrs_n ? MVM_reg_num64 : op == MVM_OP_bindattrs_s ? MVM_reg_str : /* MVM_OP_bindattrs_o ? */ MVM_reg_obj; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, obj }, { MVM_JIT_REG_VAL, typ }, { MVM_JIT_REG_VAL, str }, { MVM_JIT_LITERAL, hint }, { MVM_JIT_REG_VAL, val }, /* Takes MVMRegister, so no _F needed. */ { MVM_JIT_LITERAL, kind } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 7, args, MVM_JIT_RV_VOID, -1); jg_sc_wb(tc, jg, ins->operands[0]); break; } case MVM_OP_hintfor: { MVMint16 dst = ins->operands[0].reg.orig; MVMint32 type = ins->operands[1].reg.orig; MVMint32 attrname = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, type }, { MVM_JIT_REG_VAL, attrname } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_elems: { MVMint16 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_INT, dst); break; } default: return 0; } return 1; } static MVMint32 consume_ins(MVMThreadContext *tc, MVMJitGraph *jg, MVMSpeshIterator *iter, MVMSpeshIns *ins) { MVMint16 op = ins->info->opcode; MVM_jit_log(tc, "append_ins: <%s>\n", ins->info->name); switch(op) { case MVM_SSA_PHI: case MVM_OP_no_op: break; /* arithmetic */ case MVM_OP_add_i: case MVM_OP_sub_i: case MVM_OP_mul_i: case MVM_OP_div_i: case MVM_OP_mod_i: case MVM_OP_inc_i: case MVM_OP_dec_i: case MVM_OP_neg_i: case MVM_OP_band_i: case MVM_OP_bor_i: case MVM_OP_bxor_i: case MVM_OP_bnot_i: case MVM_OP_blshift_i: case MVM_OP_brshift_i: case MVM_OP_add_n: case MVM_OP_sub_n: case MVM_OP_mul_n: case MVM_OP_div_n: case MVM_OP_neg_n: /* number coercion */ case MVM_OP_coerce_ni: case MVM_OP_coerce_in: case MVM_OP_extend_i32: case MVM_OP_trunc_i16: case MVM_OP_trunc_i32: /* comparison (integer) */ case MVM_OP_eq_i: case MVM_OP_ne_i: case MVM_OP_lt_i: case MVM_OP_le_i: case MVM_OP_gt_i: case MVM_OP_ge_i: case MVM_OP_cmp_i: /* comparison (numbers) */ case MVM_OP_eq_n: case MVM_OP_ne_n: case MVM_OP_ge_n: case MVM_OP_gt_n: case MVM_OP_lt_n: case MVM_OP_le_n: case MVM_OP_cmp_n: /* comparison (objects) */ case MVM_OP_eqaddr: case MVM_OP_isconcrete: /* comparison (big integer) */ case MVM_OP_eq_I: case MVM_OP_ne_I: case MVM_OP_lt_I: case MVM_OP_le_I: case MVM_OP_gt_I: case MVM_OP_ge_I: /* constants */ case MVM_OP_const_i64_16: case MVM_OP_const_i64_32: case MVM_OP_const_i64: case MVM_OP_const_n64: case MVM_OP_nan: case MVM_OP_const_s: case MVM_OP_null: /* argument reading */ case MVM_OP_getarg_i: case MVM_OP_getarg_o: case MVM_OP_getarg_n: case MVM_OP_getarg_s: case MVM_OP_sp_getarg_i: case MVM_OP_sp_getarg_o: case MVM_OP_sp_getarg_n: case MVM_OP_sp_getarg_s: /* accessors */ case MVM_OP_sp_p6oget_o: case MVM_OP_sp_p6oget_s: case MVM_OP_sp_p6oget_i: case MVM_OP_sp_p6oget_n: case MVM_OP_sp_p6ogetvc_o: case MVM_OP_sp_p6ogetvt_o: case MVM_OP_sp_p6obind_i: case MVM_OP_sp_p6obind_n: case MVM_OP_sp_p6obind_s: case MVM_OP_sp_p6obind_o: case MVM_OP_sp_bind_i64: case MVM_OP_sp_bind_n: case MVM_OP_sp_bind_s: case MVM_OP_sp_bind_o: case MVM_OP_sp_get_i64: case MVM_OP_sp_get_n: case MVM_OP_sp_get_s: case MVM_OP_sp_get_o: case MVM_OP_sp_deref_bind_i64: case MVM_OP_sp_deref_bind_n: case MVM_OP_sp_deref_get_i64: case MVM_OP_sp_deref_get_n: case MVM_OP_set: case MVM_OP_getlex: case MVM_OP_sp_getlex_o: case MVM_OP_sp_getlex_ins: case MVM_OP_sp_getlexvia_o: case MVM_OP_sp_getlexvia_ins: case MVM_OP_getlex_no: case MVM_OP_sp_getlex_no: case MVM_OP_bindlex: case MVM_OP_getwhat: case MVM_OP_getwho: case MVM_OP_getwhere: case MVM_OP_sp_getspeshslot: case MVM_OP_takedispatcher: case MVM_OP_setdispatcher: case MVM_OP_curcode: case MVM_OP_getcode: case MVM_OP_callercode: case MVM_OP_sp_fastcreate: case MVM_OP_iscont: case MVM_OP_decont: case MVM_OP_sp_decont: case MVM_OP_sp_findmeth: case MVM_OP_hllboxtype_i: case MVM_OP_hllboxtype_n: case MVM_OP_hllboxtype_s: case MVM_OP_null_s: case MVM_OP_isnull_s: case MVM_OP_not_i: case MVM_OP_isnull: case MVM_OP_isnonnull: case MVM_OP_isint: case MVM_OP_isnum: case MVM_OP_isstr: case MVM_OP_islist: case MVM_OP_ishash: case MVM_OP_sp_boolify_iter_arr: case MVM_OP_sp_boolify_iter_hash: case MVM_OP_objprimspec: case MVM_OP_objprimbits: case MVM_OP_takehandlerresult: case MVM_OP_exception: case MVM_OP_scwbdisable: case MVM_OP_scwbenable: case MVM_OP_assign: case MVM_OP_assignunchecked: case MVM_OP_getlexstatic_o: case MVM_OP_getlexperinvtype_o: case MVM_OP_paramnamesused: case MVM_OP_assertparamcheck: case MVM_OP_getobjsc: case MVM_OP_getstderr: case MVM_OP_getstdout: case MVM_OP_getstdin: case MVM_OP_ordat: case MVM_OP_ordfirst: case MVM_OP_setcodeobj: /* Profiling */ case MVM_OP_prof_enterspesh: case MVM_OP_prof_enterinline: case MVM_OP_invokewithcapture: case MVM_OP_captureposelems: case MVM_OP_capturehasnameds: /* Exception handling */ case MVM_OP_lastexpayload: /* Parameters */ case MVM_OP_param_sp: case MVM_OP_param_sn: /* Specialized atomics */ case MVM_OP_sp_cas_o: case MVM_OP_sp_atomicload_o: case MVM_OP_sp_atomicstore_o: jg_append_primitive(tc, jg, ins); break; /* Unspecialized parameter access */ case MVM_OP_param_rp_i: { MVMint16 dst = ins->operands[0].reg.orig; MVMuint16 arg_idx = ins->operands[1].lit_ui16; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_PARAMS } }, { MVM_JIT_LITERAL, { arg_idx } } }; jg_append_call_c(tc, jg, MVM_args_get_required_pos_int, 3, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_param_rp_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMuint16 arg_idx = ins->operands[1].lit_ui16; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_PARAMS } }, { MVM_JIT_LITERAL, { arg_idx } } }; jg_append_call_c(tc, jg, MVM_args_get_required_pos_str, 3, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_param_rp_o: { MVMint16 dst = ins->operands[0].reg.orig; MVMuint16 arg_idx = ins->operands[1].lit_ui16; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_PARAMS } }, { MVM_JIT_LITERAL, { arg_idx } } }; jg_append_call_c(tc, jg, MVM_args_get_required_pos_obj, 3, args, MVM_JIT_RV_PTR, dst); break; } /* branches */ case MVM_OP_goto: case MVM_OP_if_i: case MVM_OP_unless_i: case MVM_OP_if_n: case MVM_OP_unless_n: case MVM_OP_ifnonnull: case MVM_OP_indexat: case MVM_OP_indexnat: case MVM_OP_if_s0: case MVM_OP_unless_s0: jg_append_branch(tc, jg, 0, ins); break; /* never any need to implement them anymore, since they're automatically lowered for us by spesh into istrue + if_i. We can't properly compile if_o / unless_o as-is because they're both invokish and branching. */ case MVM_OP_if_o: case MVM_OP_unless_o: MVM_oops(tc, "Trying to compile if_o/unless_o, should never happen"); break; /* some functions */ case MVM_OP_gethow: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_istype: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMint16 type = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } }, { MVM_JIT_REG_VAL, { type } }, { MVM_JIT_REG_ADDR, { dst } }}; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_gethllsym: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 hll = ins->operands[1].reg.orig; MVMint16 sym = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { hll } }, { MVM_JIT_REG_VAL, { sym } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_checkarity: { MVMuint16 min = ins->operands[0].lit_i16; MVMuint16 max = ins->operands[1].lit_i16; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_PARAMS } }, { MVM_JIT_LITERAL, { min } }, { MVM_JIT_LITERAL, { max } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_say: case MVM_OP_print: { MVMint32 reg = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { reg } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_wval: case MVM_OP_wval_wide: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 dep = ins->operands[1].lit_i16; MVMint64 idx = op == MVM_OP_wval ? ins->operands[2].lit_i16 : ins->operands[2].lit_i64; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_CU } }, { MVM_JIT_LITERAL, { dep } }, { MVM_JIT_LITERAL, { idx } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_scgetobjidx: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 sc = ins->operands[1].reg.orig; MVMint64 obj = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { sc } }, { MVM_JIT_REG_VAL, { obj } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_throwdyn: case MVM_OP_throwlex: case MVM_OP_throwlexotic: { MVMint16 regi = ins->operands[0].reg.orig; MVMint16 object = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_LITERAL, { op == MVM_OP_throwlexotic ? MVM_EX_THROW_LEXOTIC : op == MVM_OP_throwlex ? MVM_EX_THROW_LEX : MVM_EX_THROW_DYN } }, { MVM_JIT_REG_VAL, { object } }, { MVM_JIT_REG_ADDR, { regi } }}; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_rethrow: { MVMint16 obj = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_LITERAL, { MVM_EX_THROW_DYN } }, { MVM_JIT_REG_VAL, { obj } }, { MVM_JIT_LITERAL, { 0 } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_throwcatdyn: case MVM_OP_throwcatlex: case MVM_OP_throwcatlexotic: { MVMint16 regi = ins->operands[0].reg.orig; MVMint32 category = (MVMuint32)ins->operands[1].lit_i64; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_LITERAL, { op == MVM_OP_throwcatdyn ? MVM_EX_THROW_DYN : op == MVM_OP_throwcatlex ? MVM_EX_THROW_LEX : MVM_EX_THROW_LEXOTIC } }, { MVM_JIT_LITERAL, { category } }, { MVM_JIT_REG_ADDR, { regi } }}; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_throwpayloadlex: { MVMint16 regi = ins->operands[0].reg.orig; MVMint32 category = (MVMuint32)ins->operands[1].lit_i64; MVMint16 payload = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_LITERAL, { MVM_EX_THROW_LEX } }, { MVM_JIT_LITERAL, { category } }, { MVM_JIT_REG_VAL, { payload } }, { MVM_JIT_REG_ADDR, { regi } }}; jg_append_call_c(tc, jg, op_to_func(tc, op), 5, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_getexpayload: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_bindexpayload: { MVMint16 obj = ins->operands[0].reg.orig; MVMint16 payload = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } }, { MVM_JIT_REG_VAL, { payload } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_resume: { MVMint16 exc = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { exc } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_die: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 str = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { str } }, { MVM_JIT_REG_ADDR, { dst } }}; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_getdynlex: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 name = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { name } }, { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_CALLER } }}; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_binddynlex: { MVMint16 name = ins->operands[0].reg.orig; MVMint16 val = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { name } }, { MVM_JIT_REG_VAL, { val } }, { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_CALLER } }}; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_getlexouter: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 name = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { name } }}; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_isfalse: case MVM_OP_istrue: { MVMint16 obj = ins->operands[1].reg.orig; MVMint16 dst = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } }, { MVM_JIT_REG_ADDR, { dst } }, { MVM_JIT_LITERAL, { 0 } }, { MVM_JIT_LITERAL, { 0 } }, { MVM_JIT_LITERAL, { op == MVM_OP_isfalse } }}; jg_append_call_c(tc, jg, op_to_func(tc, op), 6, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_capturelex: { MVMint16 code = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { code } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_captureinnerlex: { MVMint16 code = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { code } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_takeclosure: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { src } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_usecapture: case MVM_OP_savecapture: { MVMint16 dst = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_FRAME } }}; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_captureposprimspec: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 capture = ins->operands[1].reg.orig; MVMint16 index = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { capture } }, { MVM_JIT_REG_VAL, { index } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_gt_s: case MVM_OP_ge_s: case MVM_OP_lt_s: case MVM_OP_le_s: case MVM_OP_cmp_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 a = ins->operands[1].reg.orig; MVMint16 b = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { a } }, { MVM_JIT_REG_VAL, { b } }}; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_INT, dst); /* We rely on an implementation of the comparisons against -1, 0 and 1 * in emit.dasc */ if (op != MVM_OP_cmp_s) { jg_append_primitive(tc, jg, ins); } break; } case MVM_OP_hllize: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; MVMHLLConfig *hll_config = jg->sg->sf->body.cu->body.hll_config; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { src } }, { MVM_JIT_LITERAL_PTR, { (MVMint64)hll_config } }, { MVM_JIT_REG_ADDR, { dst } }}; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_clone: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_create: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 type = ins->operands[1].reg.orig; MVMJitCallArg args_alloc[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { type } } }; MVMJitCallArg args_init[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { dst } } }; jg_append_call_c(tc, jg, MVM_repr_alloc, 2, args_alloc, MVM_JIT_RV_PTR, dst); jg_append_call_c(tc, jg, MVM_repr_init, 2, args_init, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_cas_o: { MVMint16 result = ins->operands[0].reg.orig; MVMint16 target = ins->operands[1].reg.orig; MVMint16 expected = ins->operands[2].reg.orig; MVMint16 value = ins->operands[3].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { target } }, { MVM_JIT_REG_VAL, { expected } }, { MVM_JIT_REG_VAL, { value } }, { MVM_JIT_REG_ADDR, { result } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 5, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_cas_i: { MVMint16 result = ins->operands[0].reg.orig; MVMint16 target = ins->operands[1].reg.orig; MVMint16 expected = ins->operands[2].reg.orig; MVMint16 value = ins->operands[3].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { target } }, { MVM_JIT_REG_VAL, { expected } }, { MVM_JIT_REG_VAL, { value } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_INT, result); break; } case MVM_OP_atomicinc_i: case MVM_OP_atomicdec_i: case MVM_OP_atomicload_i: { MVMint16 result = ins->operands[0].reg.orig; MVMint16 target = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { target } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_INT, result); break; } case MVM_OP_atomicadd_i: { MVMint16 result = ins->operands[0].reg.orig; MVMint16 target = ins->operands[1].reg.orig; MVMint16 increment = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { target } }, { MVM_JIT_REG_VAL, { increment } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_INT, result); break; } case MVM_OP_atomicload_o: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 target = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { target } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_atomicstore_o: case MVM_OP_atomicstore_i: { MVMint16 target = ins->operands[0].reg.orig; MVMint16 value = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { target } }, { MVM_JIT_REG_VAL, { value } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_lock: { MVMint16 lock = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { lock } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_unlock: { MVMint16 lock = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { lock } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_VOID, -1); break; } /* repr ops */ case MVM_OP_unshift_i: case MVM_OP_unshift_n: case MVM_OP_unshift_s: case MVM_OP_unshift_o: case MVM_OP_push_i: case MVM_OP_push_n: case MVM_OP_push_s: case MVM_OP_push_o: case MVM_OP_shift_i: case MVM_OP_shift_n: case MVM_OP_shift_s: case MVM_OP_shift_o: case MVM_OP_pop_i: case MVM_OP_pop_n: case MVM_OP_pop_s: case MVM_OP_pop_o: case MVM_OP_deletekey: case MVM_OP_existskey: case MVM_OP_existspos: case MVM_OP_setelemspos: case MVM_OP_splice: case MVM_OP_atpos_i: case MVM_OP_atpos_n: case MVM_OP_atpos_s: case MVM_OP_atpos_o: case MVM_OP_atkey_i: case MVM_OP_atkey_n: case MVM_OP_atkey_s: case MVM_OP_atkey_o: case MVM_OP_bindpos_i: case MVM_OP_bindpos_n: case MVM_OP_bindpos_s: case MVM_OP_bindpos_o: case MVM_OP_bindkey_i: case MVM_OP_bindkey_n: case MVM_OP_bindkey_s: case MVM_OP_bindkey_o: case MVM_OP_getattr_i: case MVM_OP_getattr_n: case MVM_OP_getattr_s: case MVM_OP_getattr_o: case MVM_OP_getattrs_i: case MVM_OP_getattrs_n: case MVM_OP_getattrs_s: case MVM_OP_getattrs_o: case MVM_OP_attrinited: case MVM_OP_bindattr_i: case MVM_OP_bindattr_n: case MVM_OP_bindattr_s: case MVM_OP_bindattr_o: case MVM_OP_bindattrs_i: case MVM_OP_bindattrs_n: case MVM_OP_bindattrs_s: case MVM_OP_bindattrs_o: case MVM_OP_hintfor: case MVM_OP_elems: if (!consume_reprop(tc, jg, iter, ins)) { MVM_jit_log(tc, "BAIL: op <%s> (devirt attempted)\n", ins->info->name); return 0; } break; case MVM_OP_iterkey_s: case MVM_OP_iterval: case MVM_OP_iter: { MVMint16 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { invocant } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_continuationreset: { MVMint16 reg = ins->operands[0].reg.orig; MVMint16 tag = ins->operands[1].reg.orig; MVMint16 code = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { tag } }, { MVM_JIT_REG_VAL, { code } }, { MVM_JIT_REG_ADDR, { reg } }}; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_continuationcontrol: { MVMint16 reg = ins->operands[0].reg.orig; MVMint16 protect = ins->operands[1].reg.orig; MVMint16 tag = ins->operands[2].reg.orig; MVMint16 code = ins->operands[3].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { protect } }, { MVM_JIT_REG_VAL, { tag } }, { MVM_JIT_REG_VAL, { code } }, { MVM_JIT_REG_ADDR, { reg } }}; jg_append_call_c(tc, jg, op_to_func(tc, op), 5, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_sp_boolify_iter: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } }}; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_findmeth: case MVM_OP_findmeth_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMint32 name = (op == MVM_OP_findmeth_s ? ins->operands[2].reg.orig : ins->operands[2].lit_str_idx); MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } }, { (op == MVM_OP_findmeth_s ? MVM_JIT_REG_VAL : MVM_JIT_STR_IDX), { name } }, { MVM_JIT_REG_ADDR, { dst } }, { MVM_JIT_LITERAL, { 1 } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 5, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_tryfindmeth: case MVM_OP_tryfindmeth_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMint32 name = (op == MVM_OP_tryfindmeth_s ? ins->operands[2].reg.orig : ins->operands[2].lit_str_idx); MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } }, { (op == MVM_OP_tryfindmeth_s ? MVM_JIT_REG_VAL : MVM_JIT_STR_IDX), { name } }, { MVM_JIT_REG_ADDR, { dst } }, { MVM_JIT_LITERAL, { 0 } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 5, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_multicachefind: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 cache = ins->operands[1].reg.orig; MVMint16 capture = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { cache } }, { MVM_JIT_REG_VAL, { capture } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_multicacheadd: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 cache = ins->operands[1].reg.orig; MVMint16 capture = ins->operands[2].reg.orig; MVMint16 result = ins->operands[3].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { cache } }, { MVM_JIT_REG_VAL, { capture } }, { MVM_JIT_REG_VAL, { result } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_can: case MVM_OP_can_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMint32 name = (op == MVM_OP_can_s ? ins->operands[2].reg.orig : ins->operands[2].lit_str_idx); MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } }, { (op == MVM_OP_can_s ? MVM_JIT_REG_VAL : MVM_JIT_STR_IDX), { name } }, { MVM_JIT_REG_ADDR, { dst } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_VOID, -1); break; } /* coercion */ case MVM_OP_coerce_sn: case MVM_OP_coerce_ns: case MVM_OP_coerce_si: case MVM_OP_coerce_is: case MVM_OP_coerce_In: { MVMint16 src = ins->operands[1].reg.orig; MVMint16 dst = ins->operands[0].reg.orig; MVMJitCallArg args[] = {{ MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { src } } }; MVMJitRVMode rv_mode = ((op == MVM_OP_coerce_sn || op == MVM_OP_coerce_In) ? MVM_JIT_RV_NUM : op == MVM_OP_coerce_si ? MVM_JIT_RV_INT : MVM_JIT_RV_PTR); if (op == MVM_OP_coerce_ns) { args[1].type = MVM_JIT_REG_VAL_F; } jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, rv_mode, dst); break; } case MVM_OP_coerce_nI: { MVMint16 src = ins->operands[1].reg.orig; MVMint16 dst = ins->operands[0].reg.orig; MVMint16 typ = ins->operands[2].reg.orig; MVMJitCallArg args[] = {{ MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { typ } }, { MVM_JIT_REG_VAL_F, { src } }}; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_coerce_II: { MVMint16 src = ins->operands[1].reg.orig; MVMint16 dst = ins->operands[0].reg.orig; MVMint16 typ = ins->operands[2].reg.orig; MVMJitCallArg args[] = {{ MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { typ } }, { MVM_JIT_REG_VAL, { src } }}; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_smrt_strify: case MVM_OP_smrt_numify: { MVMint16 obj = ins->operands[1].reg.orig; MVMint16 dst = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } }, { MVM_JIT_REG_ADDR, { dst } }}; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_close_fh: { MVMint16 fho = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { fho } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_open_fh: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 path = ins->operands[1].reg.orig; MVMint16 mode = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { path } }, { MVM_JIT_REG_VAL, { mode } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_eof_fh: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 fho = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { fho } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_write_fhb: { MVMint16 fho = ins->operands[0].reg.orig; MVMint16 buf = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { fho } }, { MVM_JIT_REG_VAL, { buf } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_read_fhb: { MVMint16 fho = ins->operands[0].reg.orig; MVMint16 res = ins->operands[1].reg.orig; MVMint16 len = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { fho } }, { MVM_JIT_REG_VAL, { res } }, { MVM_JIT_REG_VAL, { len } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_box_n: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 val = ins->operands[1].reg.orig; MVMint16 type = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR , { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL_F, { val } }, { MVM_JIT_REG_VAL, { type } }, { MVM_JIT_REG_ADDR, { dst } }}; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_box_s: case MVM_OP_box_i: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 val = ins->operands[1].reg.orig; MVMint16 type = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR , { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { val } }, { MVM_JIT_REG_VAL, { type } }, { MVM_JIT_REG_ADDR, { dst } }}; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_unbox_i: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR , { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_unbox_n: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR , { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_NUM, dst); break; } case MVM_OP_unbox_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR , { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_PTR, dst); break; } /* string ops */ case MVM_OP_repeat_s: case MVM_OP_split: case MVM_OP_concat_s: { MVMint16 src_a = ins->operands[1].reg.orig; MVMint16 src_b = ins->operands[2].reg.orig; MVMint16 dst = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { src_a } }, { MVM_JIT_REG_VAL, { src_b } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_escape: case MVM_OP_uc: case MVM_OP_lc: case MVM_OP_tc: case MVM_OP_fc: case MVM_OP_indexingoptimized: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 string = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { string } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_ne_s: case MVM_OP_eq_s: { MVMint16 src_a = ins->operands[1].reg.orig; MVMint16 src_b = ins->operands[2].reg.orig; MVMint16 dst = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { src_a } }, { MVM_JIT_REG_VAL, { src_b } } }; jg_append_call_c(tc, jg, op_to_func(tc, MVM_OP_eq_s), 3, args, MVM_JIT_RV_INT, dst); if (op == MVM_OP_ne_s) { /* append not_i to negate ne_s */ MVMSpeshIns *not_i = MVM_spesh_alloc(tc, jg->sg, sizeof(MVMSpeshIns)); not_i->info = MVM_op_get_op(MVM_OP_not_i); not_i->operands = MVM_spesh_alloc(tc, jg->sg, sizeof(MVMSpeshOperand) * 2); not_i->operands[0].reg.orig = dst; not_i->operands[1].reg.orig = dst; jg_append_primitive(tc, jg, not_i); } break; } case MVM_OP_eqat_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src_a = ins->operands[1].reg.orig; MVMint16 src_b = ins->operands[2].reg.orig; MVMint16 offset = ins->operands[3].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { src_a } }, { MVM_JIT_REG_VAL, { src_b } }, { MVM_JIT_REG_VAL, { offset } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_eqatic_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src_a = ins->operands[1].reg.orig; MVMint16 src_b = ins->operands[2].reg.orig; MVMint16 offset = ins->operands[3].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { src_a } }, { MVM_JIT_REG_VAL, { src_b } }, { MVM_JIT_REG_VAL, { offset } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_eqatim_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src_a = ins->operands[1].reg.orig; MVMint16 src_b = ins->operands[2].reg.orig; MVMint16 offset = ins->operands[3].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { src_a } }, { MVM_JIT_REG_VAL, { src_b } }, { MVM_JIT_REG_VAL, { offset } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_eqaticim_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src_a = ins->operands[1].reg.orig; MVMint16 src_b = ins->operands[2].reg.orig; MVMint16 offset = ins->operands[3].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { src_a } }, { MVM_JIT_REG_VAL, { src_b } }, { MVM_JIT_REG_VAL, { offset } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_chars: case MVM_OP_graphs_s: case MVM_OP_codes_s: case MVM_OP_flip: { MVMint16 src = ins->operands[1].reg.orig; MVMint16 dst = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { src } } }; MVMJitRVMode rv_mode = (op == MVM_OP_flip ? MVM_JIT_RV_PTR : MVM_JIT_RV_INT); jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, rv_mode, dst); break; } case MVM_OP_getcp_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; MVMint16 idx = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { src } }, { MVM_JIT_REG_VAL, { idx } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_chr: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { src } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_join: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 sep = ins->operands[1].reg.orig; MVMint16 input = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { sep } }, { MVM_JIT_REG_VAL, { input } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_replace: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 a = ins->operands[1].reg.orig; MVMint16 start = ins->operands[2].reg.orig; MVMint16 length = ins->operands[3].reg.orig; MVMint16 replace = ins->operands[4].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { a } }, { MVM_JIT_REG_VAL, { start } }, { MVM_JIT_REG_VAL, { length } }, { MVM_JIT_REG_VAL, { replace } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 5, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_substr_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 string = ins->operands[1].reg.orig; MVMint16 start = ins->operands[2].reg.orig; MVMint16 length = ins->operands[3].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { string } }, { MVM_JIT_REG_VAL, { start } }, { MVM_JIT_REG_VAL, { length } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_index_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 haystack = ins->operands[1].reg.orig; MVMint16 needle = ins->operands[2].reg.orig; MVMint16 start = ins->operands[3].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { haystack } }, { MVM_JIT_REG_VAL, { needle } }, { MVM_JIT_REG_VAL, { start } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_iscclass: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 cclass = ins->operands[1].reg.orig; MVMint16 str = ins->operands[2].reg.orig; MVMint16 offset = ins->operands[3].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { cclass } }, { MVM_JIT_REG_VAL, { str } }, { MVM_JIT_REG_VAL, { offset } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_findcclass: case MVM_OP_findnotcclass: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 cclass = ins->operands[1].reg.orig; MVMint16 target = ins->operands[2].reg.orig; MVMint16 offset = ins->operands[3].reg.orig; MVMint16 count = ins->operands[4].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { cclass } }, { MVM_JIT_REG_VAL, { target } }, { MVM_JIT_REG_VAL, { offset } }, { MVM_JIT_REG_VAL, { count } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 5, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_nfarunalt: { MVMint16 nfa = ins->operands[0].reg.orig; MVMint16 target = ins->operands[1].reg.orig; MVMint16 offset = ins->operands[2].reg.orig; MVMint16 bstack = ins->operands[3].reg.orig; MVMint16 cstack = ins->operands[4].reg.orig; MVMint16 labels = ins->operands[5].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { nfa } }, { MVM_JIT_REG_VAL, { target } }, { MVM_JIT_REG_VAL, { offset } }, { MVM_JIT_REG_VAL, { bstack } }, { MVM_JIT_REG_VAL, { cstack } }, { MVM_JIT_REG_VAL, { labels } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 7, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_nfarunproto: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 nfa = ins->operands[1].reg.orig; MVMint16 target = ins->operands[2].reg.orig; MVMint16 offset = ins->operands[3].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { nfa } }, { MVM_JIT_REG_VAL, { target } }, { MVM_JIT_REG_VAL, { offset } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_nfafromstatelist: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 states = ins->operands[1].reg.orig; MVMint16 type = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { states } }, { MVM_JIT_REG_VAL, { type } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_PTR, dst); break; } /* encode/decode ops */ case MVM_OP_encode: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 str = ins->operands[1].reg.orig; MVMint16 enc = ins->operands[2].reg.orig; MVMint16 buf = ins->operands[3].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { str } }, { MVM_JIT_REG_VAL, { enc } }, { MVM_JIT_REG_VAL, { buf } }, { MVM_JIT_LITERAL_PTR, { 0 } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 5, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_decoderaddbytes: { MVMint16 decoder = ins->operands[0].reg.orig; MVMint16 bytes = ins->operands[1].reg.orig; MVMJitCallArg argc[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { decoder } }, { MVM_JIT_LITERAL_PTR, { (MVMint64)"decoderaddbytes" } } }; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { decoder } }, { MVM_JIT_REG_VAL, { bytes } } }; jg_append_call_c(tc, jg, &MVM_decoder_ensure_decoder, 3, argc, MVM_JIT_RV_VOID, -1); jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_decodertakeline: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 decoder = ins->operands[1].reg.orig; MVMint16 chomp = ins->operands[2].reg.orig; MVMint16 inc = ins->operands[3].reg.orig; MVMJitCallArg argc[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { decoder } }, { MVM_JIT_LITERAL_PTR, { (MVMint64)"decodertakeline" } } }; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { decoder } }, { MVM_JIT_REG_VAL, { chomp } }, { MVM_JIT_REG_VAL, { inc } } }; jg_append_call_c(tc, jg, &MVM_decoder_ensure_decoder, 3, argc, MVM_JIT_RV_VOID, -1); jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_PTR, dst); break; } /* bigint ops */ case MVM_OP_isbig_I: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { src } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_cmp_I: { MVMint16 src_a = ins->operands[1].reg.orig; MVMint16 src_b = ins->operands[2].reg.orig; MVMint16 dst = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { src_a } }, { MVM_JIT_REG_VAL, { src_b } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_add_I: case MVM_OP_sub_I: case MVM_OP_mul_I: case MVM_OP_div_I: case MVM_OP_mod_I: case MVM_OP_bor_I: case MVM_OP_band_I: case MVM_OP_bxor_I: case MVM_OP_lcm_I: case MVM_OP_gcd_I: { MVMint16 src_a = ins->operands[1].reg.orig; MVMint16 src_b = ins->operands[2].reg.orig; MVMint16 type = ins->operands[3].reg.orig; MVMint16 dst = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { type } }, { MVM_JIT_REG_VAL, { src_a } }, { MVM_JIT_REG_VAL, { src_b } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_pow_I: { MVMint16 src_a = ins->operands[1].reg.orig; MVMint16 src_b = ins->operands[2].reg.orig; MVMint16 type_n = ins->operands[3].reg.orig; MVMint16 type_I = ins->operands[4].reg.orig; MVMint16 dst = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { src_a } }, { MVM_JIT_REG_VAL, { src_b } }, { MVM_JIT_REG_VAL, { type_n } }, { MVM_JIT_REG_VAL, { type_I } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 5, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_div_In: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src_a = ins->operands[1].reg.orig; MVMint16 src_b = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { src_a } }, { MVM_JIT_REG_VAL, { src_b } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_NUM, dst); break; } case MVM_OP_brshift_I: case MVM_OP_blshift_I: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; MVMint16 shift = ins->operands[2].reg.orig; MVMint16 type = ins->operands[3].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { type } }, { MVM_JIT_REG_VAL, { src } }, { MVM_JIT_REG_VAL, { shift } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_coerce_Is: { MVMint16 src = ins->operands[1].reg.orig; MVMint16 dst = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { src } }, { MVM_JIT_LITERAL, { 10 } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_radix: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 radix = ins->operands[1].reg.orig; MVMint16 string = ins->operands[2].reg.orig; MVMint16 offset = ins->operands[3].reg.orig; MVMint16 flag = ins->operands[4].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { radix } }, { MVM_JIT_REG_VAL, { string } }, { MVM_JIT_REG_VAL, { offset } }, { MVM_JIT_REG_VAL, { flag } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 5, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_radix_I: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 radix = ins->operands[1].reg.orig; MVMint16 string = ins->operands[2].reg.orig; MVMint16 offset = ins->operands[3].reg.orig; MVMint16 flag = ins->operands[4].reg.orig; MVMint16 type = ins->operands[5].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { radix } }, { MVM_JIT_REG_VAL, { string } }, { MVM_JIT_REG_VAL, { offset } }, { MVM_JIT_REG_VAL, { flag } }, { MVM_JIT_REG_VAL, { type } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 6, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_base_I: { MVMint16 src = ins->operands[1].reg.orig; MVMint16 base = ins->operands[2].reg.orig; MVMint16 dst = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { src } }, { MVM_JIT_REG_VAL, { base } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_isprime_I: { MVMint16 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMint32 rounds = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant }, { MVM_JIT_REG_VAL, rounds } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_bool_I: { MVMint16 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_rand_I: case MVM_OP_bnot_I: { MVMint16 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMint32 type = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, type }, { MVM_JIT_REG_VAL, invocant } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_getcodeobj: { MVMint16 dst = ins->operands[0].reg.orig; MVMint32 invocant = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_REG_VAL, invocant } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_sqrt_n: case MVM_OP_sin_n: case MVM_OP_cos_n: case MVM_OP_tan_n: case MVM_OP_asin_n: case MVM_OP_acos_n: case MVM_OP_atan_n: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_REG_VAL_F, { src } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 1, args, MVM_JIT_RV_NUM, dst); break; } case MVM_OP_pow_n: case MVM_OP_atan2_n: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 a = ins->operands[1].reg.orig; MVMint16 b = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_REG_VAL_F, { a } }, { MVM_JIT_REG_VAL_F, { b } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_NUM, dst); break; } case MVM_OP_time_n: { MVMint16 dst = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 1, args, MVM_JIT_RV_NUM, dst); break; } case MVM_OP_randscale_n: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 scale = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL_F, { scale } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_NUM, dst); break; } case MVM_OP_isnanorinf: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL_F, { src } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_nativecallcast: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 restype = ins->operands[1].reg.orig; MVMint16 site = ins->operands[2].reg.orig; MVMint16 cargs = ins->operands[3].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { restype } }, { MVM_JIT_REG_VAL, { site } }, { MVM_JIT_REG_VAL, { cargs } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_nativecallinvoke: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 restype = ins->operands[1].reg.orig; MVMint16 site = ins->operands[2].reg.orig; MVMint16 cargs = ins->operands[3].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { restype } }, { MVM_JIT_REG_VAL, { site } }, { MVM_JIT_REG_VAL, { cargs } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_typeparameters: case MVM_OP_typeparameterized: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_typeparameterat: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMint16 idx = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } }, { MVM_JIT_REG_VAL, { idx } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_objectid: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_INT, dst); break; } /* native references (as simple function calls for now) */ case MVM_OP_iscont_i: case MVM_OP_iscont_n: case MVM_OP_iscont_s: case MVM_OP_isrwcont: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_INT, dst); break; } case MVM_OP_assign_i: case MVM_OP_assign_n: case MVM_OP_assign_s: { MVMint16 target = ins->operands[0].reg.orig; MVMint16 value = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { target } }, { MVM_JIT_REG_VAL, { value } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_decont_i: case MVM_OP_decont_n: case MVM_OP_decont_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } }, { MVM_JIT_REG_ADDR, { dst } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_getrusage: { MVMint16 dst = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 1, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_getlexref_i: case MVM_OP_getlexref_i32: case MVM_OP_getlexref_i16: case MVM_OP_getlexref_i8: case MVM_OP_getlexref_n: case MVM_OP_getlexref_n32: case MVM_OP_getlexref_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMuint16 outers = ins->operands[1].lex.outers; MVMuint16 idx = ins->operands[1].lex.idx; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_LITERAL, { outers } }, { MVM_JIT_LITERAL, { idx } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_getattrref_i: case MVM_OP_getattrref_n: case MVM_OP_getattrref_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMint16 class = ins->operands[2].reg.orig; MVMint16 name = ins->operands[3].lit_str_idx; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } }, { MVM_JIT_REG_VAL, { class } }, { MVM_JIT_STR_IDX, { name } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_getattrsref_i: case MVM_OP_getattrsref_n: case MVM_OP_getattrsref_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMint16 class = ins->operands[2].reg.orig; MVMint16 name = ins->operands[3].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } }, { MVM_JIT_REG_VAL, { class } }, { MVM_JIT_REG_VAL, { name } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 4, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_atposref_i: case MVM_OP_atposref_n: case MVM_OP_atposref_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMint16 index = ins->operands[2].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } }, { MVM_JIT_REG_VAL, { index } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_PTR, dst); break; } /* profiling */ case MVM_OP_prof_allocated: { MVMint16 reg = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { reg } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_prof_exit: { MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 1, args, MVM_JIT_RV_VOID, -1); break; } /* special jumplist branch */ case MVM_OP_jumplist: { return consume_jumplist(tc, jg, iter, ins); } /* returning */ case MVM_OP_return: { MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_LITERAL, { 0 } }}; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_VOID, -1); jg_append_call_c(tc, jg, &MVM_frame_try_return, 1, args, MVM_JIT_RV_VOID, -1); jg_append_branch(tc, jg, MVM_JIT_BRANCH_EXIT, NULL); break; } case MVM_OP_return_o: case MVM_OP_return_s: case MVM_OP_return_n: case MVM_OP_return_i: { MVMint16 reg = ins->operands[0].reg.orig; MVMJitCallArg args[] = {{ MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { reg } }, { MVM_JIT_LITERAL, { 0 } } }; if (op == MVM_OP_return_n) { args[1].type = MVM_JIT_REG_VAL_F; } jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_VOID, -1); /* reuse args for tc arg */ jg_append_call_c(tc, jg, &MVM_frame_try_return, 1, args, MVM_JIT_RV_VOID, -1); jg_append_branch(tc, jg, MVM_JIT_BRANCH_EXIT, NULL); break; } case MVM_OP_sp_guard: case MVM_OP_sp_guardconc: case MVM_OP_sp_guardtype: case MVM_OP_sp_guardsf: jg_append_guard(tc, jg, ins); break; case MVM_OP_sp_resolvecode: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_prepargs: { return consume_invoke(tc, jg, iter, ins); } case MVM_OP_getexcategory: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_PTR, dst); break; } case MVM_OP_bindexcategory: { MVMint16 obj = ins->operands[0].reg.orig; MVMint16 category = ins->operands[1].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } }, { MVM_JIT_REG_VAL, { category } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_exreturnafterunwind: { MVMint16 obj = ins->operands[0].reg.orig; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_REG_VAL, { obj } } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 2, args, MVM_JIT_RV_VOID, -1); break; } case MVM_OP_breakpoint: { MVMint32 file_idx = ins->operands[0].lit_i16; MVMint32 line_no = ins->operands[1].lit_i16; MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, MVM_JIT_INTERP_TC }, { MVM_JIT_LITERAL, file_idx }, { MVM_JIT_LITERAL, line_no } }; jg_append_call_c(tc, jg, op_to_func(tc, op), 3, args, MVM_JIT_RV_VOID, -1); break; } default: { /* Check if it's an extop. */ MVMint32 emitted_extop = 0; if (ins->info->opcode == (MVMuint16)-1) { MVMExtOpRecord *extops = jg->sg->sf->body.cu->body.extops; MVMuint16 num_extops = jg->sg->sf->body.cu->body.num_extops; MVMuint16 i; for (i = 0; i < num_extops; i++) { if (extops[i].info == ins->info && !extops[i].no_jit) { size_t fake_regs_size; MVMuint16 *fake_regs = try_fake_extop_regs(tc, jg->sg, ins, &fake_regs_size); if (fake_regs_size && fake_regs != NULL) { MVMint32 data_label = jg_add_data_node(tc, jg, fake_regs, fake_regs_size); MVMJitCallArg args[] = { { MVM_JIT_INTERP_VAR, { MVM_JIT_INTERP_TC } }, { MVM_JIT_DATA_LABEL, { data_label } }}; if (ins->info->jittivity & MVM_JIT_INFO_INVOKISH) jg_append_control(tc, jg, ins, MVM_JIT_CONTROL_THROWISH_PRE); jg_append_call_c(tc, jg, extops[i].func, 2, args, MVM_JIT_RV_VOID, -1); if (ins->info->jittivity & MVM_JIT_INFO_INVOKISH) jg_append_control(tc, jg, ins, MVM_JIT_CONTROL_INVOKISH); MVM_jit_log(tc, "append extop: <%s>\n", ins->info->name); emitted_extop = 1; } break; } } } if (!emitted_extop) { MVM_jit_log(tc, "BAIL: op <%s>\n", ins->info->name); return 0; } } } return 1; } static MVMint32 consume_bb(MVMThreadContext *tc, MVMJitGraph *jg, MVMSpeshIterator *iter, MVMSpeshBB *bb) { MVMJitExprTree *tree = NULL; MVMint32 i; MVMint32 label = MVM_jit_label_before_bb(tc, jg, bb); jg_append_label(tc, jg, label); /* We always append a label update at the start of a basic block for now. * This may be more than is actually needed, but it's safe. The problem is * that a jump can move us out of the scope of an exception hander, and so * we need a location update. This came to light in the case that we left an * inline (which is a jump) and came back to a region where a handler should * be in force, and it failed to be. */ jg_append_control(tc, jg, bb->first_ins, MVM_JIT_CONTROL_DYNAMIC_LABEL); /* add a jit breakpoint if required */ for (i = 0; i < tc->instance->jit_breakpoints_num; i++) { if (tc->instance->jit_breakpoints[i].frame_nr == tc->instance->jit_seq_nr && tc->instance->jit_breakpoints[i].block_nr == iter->bb->idx) { jg_append_control(tc, jg, bb->first_ins, MVM_JIT_CONTROL_BREAKPOINT); break; /* one is enough though */ } } /* Try to create an expression tree */ if (tc->instance->jit_expr_enabled && (tc->instance->jit_expr_last_frame < 0 || tc->instance->jit_seq_nr < tc->instance->jit_expr_last_frame || (tc->instance->jit_seq_nr == tc->instance->jit_expr_last_frame && (tc->instance->jit_expr_last_bb < 0 || iter->bb->idx <= tc->instance->jit_expr_last_bb)))) { while (iter->ins) { /* consumes iterator */ tree = MVM_jit_expr_tree_build(tc, jg, iter); if (tree != NULL) { MVMJitNode *node = MVM_spesh_alloc(tc, jg->sg, sizeof(MVMJitNode)); node->type = MVM_JIT_NODE_EXPR_TREE; node->u.tree = tree; tree->seq_nr = jg->expr_seq_nr++; jg_append_node(jg, node); MVM_jit_log_expr_tree(tc, tree); } if (iter->ins) { /* something we can't compile yet, or simply an empty tree */ break; } } } /* Try to consume the (rest of the) basic block per instruction */ while (iter->ins) { before_ins(tc, jg, iter, iter->ins); if(!consume_ins(tc, jg, iter, iter->ins)) return 0; after_ins(tc, jg, iter, iter->ins); MVM_spesh_iterator_next_ins(tc, iter); } return 1; } MVMJitGraph * MVM_jit_try_make_graph(MVMThreadContext *tc, MVMSpeshGraph *sg) { MVMSpeshIterator iter; MVMJitGraph *graph; if (!MVM_jit_support()) { return NULL; } if (tc->instance->jit_log_fh) { char *cuuid = MVM_string_utf8_encode_C_string(tc, sg->sf->body.cuuid); char *name = MVM_string_utf8_encode_C_string(tc, sg->sf->body.name); MVM_jit_log(tc, "Constructing JIT graph (cuuid: %s, name: '%s')\n", cuuid, name); MVM_free(cuuid); MVM_free(name); } MVM_spesh_iterator_init(tc, &iter, sg); /* ignore first BB, which always contains a NOP */ MVM_spesh_iterator_next_bb(tc, &iter); graph = MVM_spesh_alloc(tc, sg, sizeof(MVMJitGraph)); graph->sg = sg; graph->first_node = NULL; graph->last_node = NULL; /* Set initial instruction label offset */ graph->obj_label_ofs = sg->num_bbs + 1; /* Labels for individual instructions (not basic blocks), for instance at * boundaries of exception handling frames */ MVM_VECTOR_INIT(graph->obj_labels, 16); /* Deoptimization labels */ MVM_VECTOR_INIT(graph->deopts, 8); /* Nodes for each label, used to ensure labels aren't added twice */ MVM_VECTOR_INIT(graph->label_nodes, 16 + sg->num_bbs); graph->expr_seq_nr = 0; /* JIT handlers are indexed by spesh graph handler index */ if (sg->num_handlers > 0) { MVM_VECTOR_INIT(graph->handlers, sg->num_handlers); graph->handlers_num = sg->num_handlers; } else { graph->handlers = NULL; graph->handlers_num = 0; } /* JIT inlines are indexed by spesh graph inline index */ if (sg->num_inlines > 0) { MVM_VECTOR_INIT(graph->inlines, sg->num_inlines); graph->inlines_num = sg->num_inlines; } else { graph->inlines = NULL; graph->inlines_num = 0; } /* Add start-of-graph label */ jg_append_label(tc, graph, MVM_jit_label_before_graph(tc, graph, sg)); /* Loop over basic blocks */ while (iter.bb) { if (!consume_bb(tc, graph, &iter, iter.bb)) goto bail; MVM_spesh_iterator_next_bb(tc, &iter); } /* Check if we've added a instruction at all */ if (!graph->first_node) goto bail; /* append the end-of-graph label */ jg_append_label(tc, graph, MVM_jit_label_after_graph(tc, graph, sg)); /* Calculate number of basic block + graph labels */ graph->num_labels = graph->obj_label_ofs + graph->obj_labels_num; return graph; bail: MVM_jit_graph_destroy(tc, graph); return NULL; } void MVM_jit_graph_destroy(MVMThreadContext *tc, MVMJitGraph *graph) { MVMJitNode *node; /* destroy all trees */ for (node = graph->first_node; node != NULL; node = node->next) { if (node->type == MVM_JIT_NODE_EXPR_TREE) { MVM_jit_expr_tree_destroy(tc, node->u.tree); } } MVM_free(graph->label_nodes); MVM_free(graph->obj_labels); MVM_free(graph->deopts); MVM_free(graph->handlers); MVM_free(graph->inlines); } MoarVM-2018.03/src/jit/graph.h0000644000175000017510000001420613242626641016043 0ustar samanthasamantha/* The MVMJitGraph is - for now - really a linked list of instructions. * It's likely I'll add complexity when it's needed */ struct MVMJitGraph { MVMSpeshGraph *sg; MVMJitNode *first_node; MVMJitNode *last_node; /* Number of instruction+bb+graph labels, but excluding the expression labels */ MVMint32 num_labels; /* Offset for instruction labels */ MVMint32 obj_label_ofs; /* Sequence number for expr trees */ MVMuint32 expr_seq_nr; /* All labeled things */ MVM_VECTOR_DECL(void*, obj_labels); MVM_VECTOR_DECL(MVMJitDeopt, deopts); MVM_VECTOR_DECL(MVMJitHandler, handlers); MVM_VECTOR_DECL(MVMJitInline, inlines); MVM_VECTOR_DECL(MVMJitNode*, label_nodes); }; struct MVMJitDeopt { MVMint32 idx; MVMint32 label; }; struct MVMJitHandler { MVMint32 start_label; MVMint32 end_label; MVMint32 goto_label; }; struct MVMJitInline { MVMint32 start_label; MVMint32 end_label; }; /* A label (no more than a number) */ struct MVMJitLabel { MVMint32 name; }; struct MVMJitPrimitive { MVMSpeshIns * ins; }; struct MVMJitGuard { MVMSpeshIns * ins; MVMint32 deopt_target; MVMint32 deopt_offset; }; #define MVM_JIT_INFO_INVOKISH 1 #define MVM_JIT_INFO_THROWISH 2 typedef enum { MVM_JIT_CONTROL_INVOKISH = 1, MVM_JIT_CONTROL_DYNAMIC_LABEL, MVM_JIT_CONTROL_THROWISH_PRE, MVM_JIT_CONTROL_THROWISH_POST, MVM_JIT_CONTROL_CHECK_RETURN, MVM_JIT_CONTROL_BREAKPOINT, } MVMJitControlType; struct MVMJitControl { MVMSpeshIns *ins; MVMJitControlType type; }; /* Special branch target for the exit */ #define MVM_JIT_BRANCH_EXIT -1 /* What does a branch need? a label to go to, an instruction to read */ struct MVMJitBranch { MVMint32 dest; MVMSpeshIns *ins; }; typedef enum { MVM_JIT_INTERP_TC, MVM_JIT_INTERP_CU, MVM_JIT_INTERP_FRAME, MVM_JIT_INTERP_PARAMS, MVM_JIT_INTERP_CALLER, } MVMJitInterpVar; typedef enum { MVM_JIT_INTERP_VAR, MVM_JIT_REG_VAL, MVM_JIT_REG_VAL_F, MVM_JIT_REG_ADDR, MVM_JIT_STR_IDX, MVM_JIT_LITERAL, MVM_JIT_LITERAL_F, MVM_JIT_LITERAL_64, MVM_JIT_LITERAL_PTR, MVM_JIT_REG_STABLE, MVM_JIT_REG_OBJBODY, /* Take from register relative to cur_op. Usually code is JIT compiled by spesh which already known the indexes of the registers an op uses. Compilation of native calls however happens ahead of time when the code that will call the ncinvoke op may not even exist yet. In that case we need to do the same as interp.c and address registers relative to cur_op. */ MVM_JIT_REG_DYNIDX, MVM_JIT_DATA_LABEL, MVM_JIT_SAVED_RV, /* The MVM_JIT_ARG_* types are used when the offset into the WORK array is not known yet, i.e. for ahead of time compiled native calls. */ MVM_JIT_ARG_I64, MVM_JIT_ARG_I64_RW, /* Pointers are passed as objects with CPointer representation, i.e. the actual pointer is part of the object's data. The MVM_JIT_ARG_PTR type unboxes the CPointer object and passes on the contained pointer */ MVM_JIT_ARG_PTR, MVM_JIT_ARG_VMARRAY, /* The MVM_JIT_PARAM_* types are usd when actual JIT compilation is happening as part of spesh, i.e. the offset of the args buffer in WORK is already known. */ MVM_JIT_PARAM_I64, MVM_JIT_PARAM_I64_RW, MVM_JIT_PARAM_PTR, MVM_JIT_PARAM_VMARRAY, } MVMJitArgType; struct MVMJitCallArg { MVMJitArgType type; union { MVMint64 lit_i64; MVMnum64 lit_n64; MVMJitInterpVar ivar; MVMint16 reg; void *ptr; } v; }; typedef enum { MVM_JIT_RV_VOID, /* ptr and int are mostly the same, but they might not be on all platforms */ MVM_JIT_RV_INT, MVM_JIT_RV_PTR, /* floats aren't */ MVM_JIT_RV_NUM, /* dereference and store */ MVM_JIT_RV_DEREF, /* store local at address */ MVM_JIT_RV_ADDR, /* Store in register relative to cur_op. Usually code is JIT compiled by spesh which already known the indexes of the registers an op uses. Compilation of native calls however happens ahead of time when the code that will call the ncinvoke op may not even exist yet. In that case we need to do the same as interp.c and address registers relative to cur_op. */ MVM_JIT_RV_DYNIDX, } MVMJitRVMode; struct MVMJitCallC { void *func_ptr; MVMJitCallArg *args; MVMuint16 num_args; MVMuint16 has_vargs; MVMJitRVMode rv_mode; MVMint16 rv_idx; }; struct MVMJitInvoke { MVMint16 callsite_idx; MVMint16 arg_count; MVMSpeshIns **arg_ins; MVMReturnType return_type; MVMint16 return_register; MVMint16 code_register; MVMint16 spesh_cand; MVMint8 is_fast; MVMint32 reentry_label; }; struct MVMJitJumpList { MVMint64 num_labels; MVMint16 reg; /* labels of the goto's / jump instructions themselves */ MVMint32 *in_labels; /* labels the goto's jump to */ MVMint32 *out_labels; }; struct MVMJitData { MVMint32 label; void *data; size_t size; }; struct MVMJitStackSlot { MVMint16 slot; }; /* Node types */ typedef enum { MVM_JIT_NODE_PRIMITIVE, MVM_JIT_NODE_CALL_C, MVM_JIT_NODE_BRANCH, MVM_JIT_NODE_LABEL, MVM_JIT_NODE_GUARD, MVM_JIT_NODE_INVOKE, MVM_JIT_NODE_JUMPLIST, MVM_JIT_NODE_CONTROL, MVM_JIT_NODE_DATA, MVM_JIT_NODE_EXPR_TREE, MVM_JIT_NODE_SAVE_RV, } MVMJitNodeType; struct MVMJitNode { MVMJitNode * next; /* linked list */ MVMJitNodeType type; /* tag */ union { MVMJitPrimitive prim; MVMJitCallC call; MVMJitBranch branch; MVMJitLabel label; MVMJitGuard guard; MVMJitInvoke invoke; MVMJitJumpList jumplist; MVMJitControl control; MVMJitData data; MVMJitExprTree *tree; MVMJitStackSlot stack; } u; }; MVMJitGraph* MVM_jit_try_make_graph(MVMThreadContext *tc, MVMSpeshGraph *sg); void MVM_jit_graph_destroy(MVMThreadContext *tc, MVMJitGraph *graph); MoarVM-2018.03/src/jit/internal.h0000644000175000017510000001114613237701240016547 0ustar samanthasamantha/* Internal header for the MoarVM JIT compiler. Probably best not to use it * outside the JIT */ /* Override dynasm state definitions, so that we can use our own compiler * with register allocation structures etc. */ #define Dst_DECL MVMJitCompiler *compiler #define Dst_REF (compiler->dasm_handle) #define Dst (compiler) #include "dasm_proto.h" struct MVMJitCompiler { dasm_State *dasm_handle; void **dasm_globals; MVMJitGraph *graph; MVMint32 label_offset; MVMint32 label_max; /* For spilling values that don't fit into the register allocator */ MVMint32 spills_base; MVMint32 spills_free[4]; MVM_VECTOR_DECL(struct { MVMint8 reg_type; MVMint32 next; }, spills); }; /* Declarations for architecture-specific codegen stuff */ const MVMint32 MVM_jit_support(void); const unsigned char * MVM_jit_actions(void); const unsigned int MVM_jit_num_globals(void); void MVM_jit_emit_prologue(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitGraph *jg); void MVM_jit_emit_epilogue(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitGraph *jg); void MVM_jit_emit_primitive(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitGraph *jg, MVMJitPrimitive *prim); void MVM_jit_emit_call_c(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitGraph *jg, MVMJitCallC *call_spec); void MVM_jit_emit_branch(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMint32 label); void MVM_jit_emit_conditional_branch(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMint32 cond, MVMint32 label); void MVM_jit_emit_block_branch(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitGraph *jg, MVMJitBranch *branch_spec); void MVM_jit_emit_label(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitGraph *jg, MVMint32 label); void MVM_jit_emit_guard(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitGraph *jg, MVMJitGuard *guard); void MVM_jit_emit_invoke(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitGraph *jg, MVMJitInvoke *invoke); void MVM_jit_emit_jumplist(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitGraph *jg, MVMJitJumpList *jumplist); void MVM_jit_emit_control(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitControl *ctrl, MVMJitTile *tile); void MVM_jit_emit_data(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitData *data); void MVM_jit_emit_save_rv(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMint16 slot); void MVM_jit_emit_load(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMint32 reg_cls, MVMint8 reg_dst, MVMint32 mem_cls, MVMint32 mem_src, MVMint32 size); void MVM_jit_emit_store(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMint32 mem_cls, MVMint32 mem_pos, MVMint32 reg_cls, MVMint8 reg_pos, MVMint32 size); void MVM_jit_emit_copy(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMint32 dst_cls, MVMint8 dst_reg, MVMint32 src_cls, MVMint8 src_num); void MVM_jit_emit_marker(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMint32 num); MVMint32 MVM_jit_spill_memory_select(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMint8 reg_type); void MVM_jit_spill_memory_release(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMint32 pos, MVMint8 reg_type); /* Although we use these only symbolically, we need to assign a temporary value * in order to to distinguish between these */ #define MVM_JIT_ARCH_X64 1 #define MVM_JIT_PLATFORM_POSIX 1 #define MVM_JIT_PLATFORM_WIN32 2 #if MVM_JIT_ARCH == MVM_JIT_ARCH_X64 #define MVM_JIT_ARCH_H "jit/x64/arch.h" #endif /* Depends on values of MVM_JIT_PLATFORM, so need to be defined, but uses the * MVM_JIT_ARCH names literally, so these need to be undefined. */ #ifdef MVM_JIT_ARCH_H #include MVM_JIT_ARCH_H #endif #undef MVM_JIT_ARCH_X64 #undef MVM_JIT_PLATFORM_POSIX #undef MVM_JIT_PLATFORM_WIN32 /* declare comma (register name separater) to be literal ',', which makes the * enum declaration work */ #ifdef __COMMA__ #error "Defining __COMMA__ cannot end well" #endif #define __COMMA__ , enum { MVM_JIT_ARCH_GPR(MVM_JIT_REG) }; enum { MVM_JIT_ARCH_NUM(MVM_JIT_REG) }; /* it's a ridiculous, dangerous macro and it shouldn't escape */ #undef __COMMA__ /* We need max and min macros, they used to be in libtommath, but aren't anymore */ #ifndef MAX #define MAX(a,b) ((a) > (b) ? (a) : (b)) #endif #ifndef MIN #define MIN(a,b) ((a) < (b) ? (a) : (b)) #endif MoarVM-2018.03/src/jit/label.c0000644000175000017510000000506013242626641016012 0ustar samanthasamantha#include "moar.h" MVMint32 MVM_jit_label_before_bb(MVMThreadContext *tc, MVMJitGraph *jg, MVMSpeshBB *bb) { return bb->idx; } MVMint32 MVM_jit_label_before_graph(MVMThreadContext *tc, MVMJitGraph *jg, MVMSpeshGraph *sg) { return 0; } MVMint32 MVM_jit_label_after_graph(MVMThreadContext *tc, MVMJitGraph *jg, MVMSpeshGraph *sg) { /* Larger than all basic block labels */ return sg->num_bbs; } MVMint32 MVM_jit_label_before_ins(MVMThreadContext *tc, MVMJitGraph *jg, MVMSpeshBB *bb, MVMSpeshIns *ins) { /* PHI nodes are always at the start of a basic block, so this not is really necessary */ while (ins->prev && ins->prev->info->opcode == MVM_SSA_PHI) { ins = ins->prev; } /* Without predecessor instructions this is the same as the basic block */ if (!ins->prev) { return MVM_jit_label_before_bb(tc, jg, bb); } /* Requires a separate label */ return MVM_jit_label_for_obj(tc, jg, ins); } MVMint32 MVM_jit_label_after_ins(MVMThreadContext *tc, MVMJitGraph *jg, MVMSpeshBB *bb, MVMSpeshIns *ins) { /* A label after this instruction equals a label before the next */ if (ins->next) { return MVM_jit_label_before_ins(tc, jg, bb, ins->next); } /* Or before the next basic block */ if (bb->linear_next) { return MVM_jit_label_before_bb(tc, jg, bb->linear_next); } /* And in the edge case after the graph */ return MVM_jit_label_after_graph(tc, jg, jg->sg); } MVMint32 MVM_jit_label_for_obj(MVMThreadContext *tc, MVMJitGraph *jg, void *obj) { MVMint32 i; /* Reverse search; it is pretty likely we've seen this ins just before */ i = jg->obj_labels_num; while (i--) { if (jg->obj_labels[i] == obj) { return i + jg->obj_label_ofs; } } /* Add and return new instruction label */ MVM_VECTOR_PUSH(jg->obj_labels, obj); return jg->obj_labels_num - 1 + jg->obj_label_ofs; } MVMint32 MVM_jit_label_is_for_graph(MVMThreadContext *tc, MVMJitGraph *jg, MVMint32 label) { return label == 0 || label == jg->sg->num_bbs; } MVMint32 MVM_jit_label_is_for_bb(MVMThreadContext *tc, MVMJitGraph *jg, MVMint32 label) { return label > 0 && label < jg->sg->num_bbs; } MVMint32 MVM_jit_label_is_for_ins(MVMThreadContext *tc, MVMJitGraph *jg, MVMint32 label) { return label > jg->sg->num_bbs && label <= jg->sg->num_bbs + jg->obj_labels_num; } MVMint32 MVM_jit_label_is_internal(MVMThreadContext *tc, MVMJitGraph *jg, MVMint32 label) { /* WARNING: This is *NOT VALID* during jit graph building */ return label >= jg->num_labels; } MoarVM-2018.03/src/jit/label.h0000644000175000017510000000220213237701240016003 0ustar samanthasamantha/* Aqcuiqre labels */ MVMint32 MVM_jit_label_before_graph(MVMThreadContext *tc, MVMJitGraph *jg, MVMSpeshGraph *sg); MVMint32 MVM_jit_label_after_graph(MVMThreadContext *tc, MVMJitGraph *jg, MVMSpeshGraph *sg); MVMint32 MVM_jit_label_before_bb(MVMThreadContext *tc, MVMJitGraph *jg, MVMSpeshBB *bb); MVMint32 MVM_jit_label_before_ins(MVMThreadContext *tc, MVMJitGraph *jg, MVMSpeshBB *bb, MVMSpeshIns *ins); MVMint32 MVM_jit_label_after_ins(MVMThreadContext *tc, MVMJitGraph *jg, MVMSpeshBB *bb, MVMSpeshIns *ins); /* GIANT HACK UNFORTUNATELY */ MVMint32 MVM_jit_label_for_obj(MVMThreadContext *tc, MVMJitGraph *jg, void *obj); /* Test label category */ MVMint32 MVM_jit_label_is_for_graph(MVMThreadContext *tc, MVMJitGraph *jg, MVMint32 label); MVMint32 MVM_jit_label_is_for_bb(MVMThreadContext *tc, MVMJitGraph *jg, MVMint32 label); MVMint32 MVM_jit_label_is_for_ins(MVMThreadContext *tc, MVMJitGraph *jg, MVMint32 label); /* Internal labels aren't actually assigned their 'final number' before * compilation, so this is *NOT VALID* during graph building */ MVMint32 MVM_jit_label_is_internal(MVMThreadContext *tc, MVMJitGraph *jg, MVMint32 label); MoarVM-2018.03/src/jit/linear_scan.c0000644000175000017510000013155513250636753017226 0ustar samanthasamantha#include "moar.h" #include "internal.h" #define __COMMA__ , static MVMint8 available_gpr[] = { MVM_JIT_ARCH_AVAILABLE_GPR(MVM_JIT_REG) }; static MVMint8 available_num[] = { MVM_JIT_ARCH_NUM(MVM_JIT_REG) }; /* bitmap, so make it '|' to combine the shifted register numbers */ #undef __COMMA__ #define __COMMA__ | #define SHIFT(x) (1 << (MVM_JIT_REG(x))) static const MVMBitmap NVR_GPR_BITMAP = MVM_JIT_ARCH_NONVOLATILE_GPR(SHIFT); static const MVMBitmap AVAILABLE_GPR_BITMAP = MVM_JIT_ARCH_AVAILABLE_GPR(SHIFT); #undef SHIFT #undef __COMMA__ #define MAX_ACTIVE sizeof(available_gpr) #define NYI(x) MVM_oops(tc, #x "not yet implemented") #define _ASSERT(b, msg) if (!(b)) do { MVM_panic(1, msg); } while (0) #if MVM_JIT_DEBUG #define _DEBUG(fmt, ...) do { fprintf(stderr, fmt "%s", __VA_ARGS__, "\n"); } while(0) #else #define _DEBUG(fmt, ...) do {} while(0) #endif typedef struct { MVMint32 key; MVMint32 idx; } UnionFind; typedef struct ValueRef ValueRef; struct ValueRef { MVMint32 tile_idx; MVMint32 value_idx; ValueRef *next; }; struct Hole { MVMint32 start, end; struct Hole *next; }; typedef struct { /* double-ended queue of value refs */ ValueRef *first, *last; /* order number of first and last refs */ MVMint32 start, end; /* list of holes in ascending order */ struct Hole *holes; /* We can have at most two synthetic tiles, one attached to the first * definition and one to the last use... we could also point directly into * the values array of the tile, but it is not directly necessary */ MVMJitTile *synthetic[2]; MVMint8 register_spec; MVMJitStorageClass reg_cls; MVMint32 reg_num; MVMint8 reg_type; MVMint32 spill_pos; MVMint32 spill_idx; } LiveRange; typedef struct { MVMJitCompiler *compiler; /* Sets of values */ UnionFind *sets; /* single buffer for uses, definitions */ ValueRef *refs; MVMint32 refs_num; /* single buffer for number of holes */ struct Hole *holes; MVMint32 holes_top; /* All values ever defined by the register allcoator */ MVM_VECTOR_DECL(LiveRange, values); /* 'Currently' active values */ MVMint32 active_top; MVMint32 active[MAX_ACTIVE]; /* Values still left to do (heap) */ MVM_VECTOR_DECL(MVMint32, worklist); /* Retired values (to be assigned registers) (heap) */ MVM_VECTOR_DECL(MVMint32, retired); /* Spilled values */ MVM_VECTOR_DECL(MVMint32, spilled); /* Register handout ring */ MVMint8 reg_ring[MAX_ACTIVE]; MVMint32 reg_give, reg_take; } RegisterAllocator; /* For first/last ref comparison, the tile indexes are doubled, and the indexes * of synthetics are biased with +1/-1. We use this extra space on the number * line to ensure consistent ordering and expiring behavior for 'synthetic' live * ranges that either start before an instruction (loading a required value) or * end just after one (storing the produced value). Without this, ordering * problems can cause two 'atomic' live ranges to be allocated and expired * before their actual last use */ MVM_STATIC_INLINE MVMint32 order_nr(MVMint32 tile_idx) { return tile_idx * 2; } MVM_STATIC_INLINE MVMint32 is_definition(ValueRef *v) { return (v->value_idx == 0); } MVM_STATIC_INLINE MVMint32 is_arglist_ref(MVMJitTileList *list, ValueRef *v) { return (list->items[v->tile_idx]->op == MVM_JIT_ARGLIST); } MVM_STATIC_INLINE MVMint32 live_range_is_empty(LiveRange *range) { return (range->first == NULL && range->synthetic[0] == NULL && range->synthetic[1] == NULL); } /* allocate a new live range value by pointer-bumping */ MVMint32 live_range_init(RegisterAllocator *alc) { LiveRange *range; MVMint32 idx = alc->values_num++; MVM_VECTOR_ENSURE_SIZE(alc->values, idx); alc->values[idx].spill_idx = INT32_MAX; alc->values[idx].start = INT32_MAX; return idx; } /* append ref to end of queue */ static void live_range_add_ref(RegisterAllocator *alc, LiveRange *range, MVMint32 tile_idx, MVMint32 value_idx) { ValueRef *ref = alc->refs + alc->refs_num++; ref->tile_idx = tile_idx; ref->value_idx = value_idx; if (range->first == NULL) { range->first = ref; } if (range->last != NULL) { range->last->next = ref; } range->last = ref; ref->next = NULL; range->start = MIN(order_nr(tile_idx), range->start); range->end = MAX(order_nr(tile_idx), range->end); } /* merge value ref sets */ static void live_range_merge(LiveRange *a, LiveRange *b) { ValueRef *head = NULL, *tail = NULL; MVMint32 i; _DEBUG("Merging live ranges (%d-%d) and (%d-%d)", (a)->start, (a)->end, (b)->start, (b)->end); if (a->start <= b->start) { head = a->first; a->first = a->first->next; } else { head = b->first; b->first = b->first->next; } tail = head; while (a->first != NULL && b->first != NULL) { if (a->first->tile_idx <= b->first->tile_idx) { tail->next = a->first; a->first = a->first->next; } else { tail->next = b->first; b->first = b->first->next; } tail = tail->next; } while (a->first != NULL) { tail->next = a->first; a->first = a->first->next; tail = tail->next; } while (b->first != NULL) { tail->next = b->first; b->first = b->first->next; tail = tail->next; } a->first = head; a->last = tail; for (i = 0; i < 2; i++) { if (b->synthetic[i] == NULL) { continue; } if (a->synthetic[i] != NULL) { MVM_panic(1, "Can't merge the same synthetic!"); } } a->start = MIN(a->start, b->start); a->end = MAX(a->end, b->end); /* deinitialize the live range */ b->start = INT32_MAX; b->end = 0; } static struct Hole * live_range_has_hole(LiveRange *value, MVMint32 order_nr) { struct Hole *h; /* By construction these are in linear ascending order, and never overlap */ for (h = value->holes; h != NULL && h->start <= order_nr; h = h->next) { if (h->end >= order_nr) return h; } return NULL; } UnionFind * value_set_find(UnionFind *sets, MVMint32 key) { while (sets[key].key != key) { key = sets[key].key; } return sets + key; } MVMint32 value_set_union(UnionFind *sets, LiveRange *values, MVMint32 a, MVMint32 b) { /* dereference the sets to their roots */ a = value_set_find(sets, a)->key; b = value_set_find(sets, b)->key; if (a == b) { /* secretly the same set anyway, could happen in some combinations of * IF, COPY, and DO. */ return a; } if (values[sets[b].idx].start < values[sets[a].idx].start) { /* ensure we're picking the first one to start so that we maintain the * first-definition heap order */ MVMint32 t = a; a = b; b = t; } sets[b].key = a; /* point b to a */ live_range_merge(values + sets[a].idx, values + sets[b].idx); return a; } MVM_STATIC_INLINE void heap_swap(MVMint32 *heap, MVMint32 a, MVMint32 b) { MVMint32 t = heap[a]; heap[a] = heap[b]; heap[b] = t; } /* Functions to maintain a heap of references to the live ranges */ void live_range_heap_down(LiveRange *values, MVMint32 *heap, MVMint32 top, MVMint32 item, MVMint32 (*cmp)(LiveRange *values, MVMint32 a, MVMint32 b)) { while (item < top) { MVMint32 left = item * 2 + 1; MVMint32 right = left + 1; MVMint32 swap; if (right < top) { swap = cmp(values, heap[left], heap[right]) < 0 ? left : right; } else if (left < top) { swap = left; } else { break; } if (cmp(values, heap[swap], heap[item]) < 0) { heap_swap(heap, swap, item); item = swap; } else { break; } } } void live_range_heap_up(LiveRange *values, MVMint32 *heap, MVMint32 item, MVMint32 (*cmp)(LiveRange* values, MVMint32 a, MVMint32 b)) { while (item > 0) { MVMint32 parent = (item-1)/2; if (cmp(values, heap[parent], heap[item]) > 0) { heap_swap(heap, item, parent); item = parent; } else { break; } } } MVMint32 live_range_heap_pop(LiveRange *values, MVMint32 *heap, size_t *top, MVMint32 (*cmp)(LiveRange* values, MVMint32 a, MVMint32 b)) { MVMint32 v = heap[0]; MVMint32 t = --(*top); /* pop by swap and heap-down */ heap[0] = heap[t]; live_range_heap_down(values, heap, t, 0, cmp); return v; } void live_range_heap_push(LiveRange *values, MVMint32 *heap, size_t *top, MVMint32 v, MVMint32 (*cmp)(LiveRange* values, MVMint32 a, MVMint32 b)) { /* NB, caller should use MVM_ENSURE_SPACE prior to calling */ MVMint32 t = (*top)++; heap[t] = v; live_range_heap_up(values, heap, t, cmp); } MVMint32 live_range_heap_peek(LiveRange *values, MVMint32 *heap) { return values[heap[0]].start; } void live_range_heapify(LiveRange *values, MVMint32 *heap, MVMint32 top, MVMint32 (*cmp)(LiveRange* values, MVMint32 a, MVMint32 b)) { MVMint32 i = top, mid = top/2; while (i-- > mid) { live_range_heap_up(values, heap, i, cmp); } } MVMint32 values_cmp_first_ref(LiveRange *values, MVMint32 a, MVMint32 b) { return values[a].start - values[b].start; } MVMint32 values_cmp_last_ref(LiveRange *values, MVMint32 a, MVMint32 b) { return values[a].end - values[b].end; } /* register assignment logic */ #define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0])) #define NEXT_IN_RING(a,x) (((x)+1) == ARRAY_SIZE(a) ? 0 : ((x)+1)) MVMint8 get_register(MVMThreadContext *tc, RegisterAllocator *alc, MVMJitStorageClass reg_cls) { /* ignore storage class for now */ MVMint8 reg_num; reg_num = alc->reg_ring[alc->reg_take]; if (reg_num >= 0) { /* not empty */ alc->reg_ring[alc->reg_take] = -1; /* mark used */ alc->reg_take = NEXT_IN_RING(alc->reg_ring, alc->reg_take); } return reg_num; } void free_register(MVMThreadContext *tc, RegisterAllocator *alc, MVMJitStorageClass reg_cls, MVMint8 reg_num) { if (alc->reg_ring[alc->reg_give] != -1) { MVM_oops(tc, "No space to release register %d to ring", reg_num); } alc->reg_ring[alc->reg_give] = reg_num; alc->reg_give = NEXT_IN_RING(alc->reg_ring, alc->reg_give); } void assign_register(MVMThreadContext *tc, RegisterAllocator *alc, MVMJitTileList *list, MVMint32 lv, MVMJitStorageClass reg_cls, MVMint8 reg_num) { /* What to do here: * - update tiles using this live range to refer to this register * - update allocator to mark this register as used by this live range */ LiveRange *range = alc->values + lv; ValueRef *ref; MVMint32 i; range->reg_cls = reg_cls; range->reg_num = reg_num; for (ref = range->first; ref != NULL; ref = ref->next) { if (is_arglist_ref(list, ref)) { /* don't assign registers to ARGLIST references, that will never * work */ continue; } else { MVMJitTile *tile = list->items[ref->tile_idx]; tile->values[ref->value_idx] = reg_num; } } for (i = 0; i < 2; i++) { MVMJitTile *tile = range->synthetic[i]; if (tile != NULL) { tile->values[i] = reg_num; } } } MVM_STATIC_INLINE void close_hole(RegisterAllocator *alc, MVMint32 ref, MVMint32 tile_idx) { LiveRange *v = alc->values + ref; if (v->holes && v->holes->start < order_nr(tile_idx)) { v->holes->start = order_nr(tile_idx); _DEBUG("Closed hole in live range %d at %d", ref, order_nr(tile_idx)); } } MVM_STATIC_INLINE void open_hole(RegisterAllocator *alc, MVMint32 ref, MVMint32 tile_idx) { LiveRange *v = alc->values + ref; if (v->start < order_nr(tile_idx) && (v->holes == NULL || v->holes->start > order_nr(tile_idx))) { struct Hole *hole = alc->holes + alc->holes_top++; hole->next = v->holes; hole->start = 0; hole->end = order_nr(tile_idx); v->holes = hole; _DEBUG("Opened hole in live range %d at %d", ref, order_nr(tile_idx)); } } /* Find holes in live ranges, as per Wimmer (2010). This is required only * because the spill-strategy arround CALLs is (sometimes) to load-and-restore, * rather than do a full spill, in the not-so-rare case that many of the live * values will be temporaries and the call is only necessary in a branch */ static void find_holes(MVMThreadContext *tc, RegisterAllocator *alc, MVMJitTileList *list) { MVMint32 i, j, k; MVMint32 bitmap_size = (alc->values_num >> 5) + 1; /* convenience macros */ #define _BITMAP(_a) (bitmaps + (_a)*bitmap_size) #define _SUCC(_a, _z) (list->blocks[(_a)].succ[(_z)]) MVMBitmap *bitmaps = MVM_calloc(list->blocks_num + 1, sizeof(MVMBitmap) * bitmap_size); /* last bitmap is allocated to hold diff, which is how we know which live * ranges holes potentially need to be closed */ MVMBitmap *diff = _BITMAP(list->blocks_num); for (j = list->blocks_num - 1; j >= 0; j--) { MVMBitmap *live_in = _BITMAP(j); MVMint32 start = list->blocks[j].start, end = list->blocks[j].end; if (list->blocks[j].num_succ == 2) { /* live out is union of successors' live_in */ MVMBitmap *a = _BITMAP(_SUCC(j, 0)), *b = _BITMAP(_SUCC(j, 1)); MVM_bitmap_union(live_in, a, b, bitmap_size); MVM_bitmap_difference(diff, a, b, bitmap_size); for (k = 0; k < bitmap_size; k++) { MVMBitmap additions = diff[k]; while (additions) { MVMint32 bit = MVM_FFS(additions) - 1; MVMint32 val = (k << 6) + bit; close_hole(alc, val, end); MVM_bitmap_delete(&additions, bit); } } } else if (list->blocks[j].num_succ == 1) { memcpy(live_in, _BITMAP(_SUCC(j, 0)), sizeof(MVMBitmap) * bitmap_size); } for (i = end - 1; i >= start; i--) { MVMJitTile *tile = list->items[i]; if (tile->op == MVM_JIT_ARGLIST) { /* list of uses, all very real */ MVMint32 nchild = list->tree->nodes[tile->node + 1]; for (k = 0; k < nchild; k++) { MVMint32 carg = list->tree->nodes[tile->node + 2 + k]; MVMint32 ref = value_set_find(alc->sets, list->tree->nodes[carg + 1])->idx; if (!MVM_bitmap_get(live_in, ref)) { MVM_bitmap_set(live_in, ref); close_hole(alc, ref, i); } } } else if (tile->op == MVM_JIT_IF || tile->op == MVM_JIT_DO || tile->op == MVM_JIT_COPY) { /* not a real use, no work needed here (we already merged them) */ } else { /* If a value is used and defined by the same tile, then the * 'hole' only covers that single tile. The definitions must * therefore be handled before the uses */ if (MVM_JIT_TILE_YIELDS_VALUE(tile)) { MVMint32 ref = value_set_find(alc->sets, tile->node)->idx; open_hole(alc, ref, i); MVM_bitmap_delete(live_in, ref); } for (k = 0; k < tile->num_refs; k++) { if (MVM_JIT_REGISTER_IS_USED(MVM_JIT_REGISTER_FETCH(tile->register_spec, k+1))) { MVMint32 ref = value_set_find(alc->sets, tile->refs[k])->idx; if (!MVM_bitmap_get(live_in, ref)) { MVM_bitmap_set(live_in, ref); close_hole(alc, ref, i); } } } } } } MVM_free(bitmaps); #undef _BITMAP #undef _SUCC } static void determine_live_ranges(MVMThreadContext *tc, RegisterAllocator *alc, MVMJitTileList *list) { MVMJitExprTree *tree = list->tree; MVMint32 i, j, n; MVMint32 num_phi = 0; /* pessimistic but correct upper bound of number of holes */ alc->sets = MVM_calloc(tree->nodes_num, sizeof(UnionFind)); /* up to 4 refs per tile (1 out, 3 in) plus the number of refs per arglist */ alc->refs = MVM_calloc(list->items_num * 4 + list->num_arglist_refs, sizeof(ValueRef)); alc->refs_num = 0; MVM_VECTOR_INIT(alc->values, list->items_num); MVM_VECTOR_INIT(alc->worklist, list->items_num); for (i = 0; i < list->items_num; i++) { MVMJitTile *tile = list->items[i]; MVMint32 node = tile->node; /* Each of the following counts as either an alias or as a PHI (in case * of IF), and thus these are not actual definitions */ if (tile->op == MVM_JIT_COPY) { MVMint32 ref = tree->nodes[tile->node + 1]; _DEBUG("Unify COPY node (%d -> %d)", tile->node, ref); alc->sets[node].key = ref; /* point directly to actual definition */ } else if (tile->op == MVM_JIT_DO) { MVMint32 nchild = tree->nodes[tile->node + 1]; MVMint32 ref = tree->nodes[tile->node + 1 + nchild]; _DEBUG("Unify COPY DO (%d -> %d)", tile->node, ref); alc->sets[node].key = ref; } else if (tile->op == MVM_JIT_IF) { MVMint32 left_cond = tree->nodes[tile->node + 2]; MVMint32 right_cond = tree->nodes[tile->node + 3]; /* NB; this may cause a conflict in register requirements, in which * case we should resolve it by creating a new live range or inserting * a copy */ alc->sets[node].key = value_set_union(alc->sets, alc->values, left_cond, right_cond); _DEBUG("Merging nodes %d and %d to %d (result key = %d)", left_cond, right_cond, node, alc->sets[node].key); num_phi++; } else if (tile->op == MVM_JIT_ARGLIST) { MVMint32 num_args = tree->nodes[tile->node + 1]; MVMJitExprNode *refs = tree->nodes + tile->node + 2; _DEBUG("Adding %d references to ARGLIST node", num_args); for (j = 0; j < num_args; j++) { MVMint32 carg = refs[j]; MVMint32 value = list->tree->nodes[carg+1]; MVMint32 idx = value_set_find(alc->sets, value)->idx; _DEBUG(" Reference %d", idx); live_range_add_ref(alc, alc->values + idx, i, j + 1); /* include the CALL node into the arglist child range, so we * don't release them too early */ alc->values[idx].end = MAX(alc->values[idx].end, order_nr(i + 1)); } } else { /* create a live range if necessary */ if (MVM_JIT_TILE_YIELDS_VALUE(tile)) { MVMint8 register_spec = MVM_JIT_REGISTER_FETCH(tile->register_spec, 0); MVMint32 idx = live_range_init(alc); alc->sets[node].key = node; alc->sets[node].idx = idx; _DEBUG("Create live range %d (tile=%d, node=%d)", idx,i, node); live_range_add_ref(alc, alc->values + idx, i, 0); if (MVM_JIT_REGISTER_HAS_REQUIREMENT(register_spec)) { alc->values[idx].register_spec = register_spec; } MVM_VECTOR_PUSH(alc->worklist, idx); } /* account for uses */ for (j = 0; j < tile->num_refs; j++) { MVMint8 register_spec = MVM_JIT_REGISTER_FETCH(tile->register_spec, j+1); /* any 'use' register requirements are handled in the allocation step */ if (MVM_JIT_REGISTER_IS_USED(register_spec)) { MVMint32 idx = value_set_find(alc->sets, tile->refs[j])->idx; _DEBUG("Adding reference to live range %d from tile %d", idx, i); live_range_add_ref(alc, alc->values + idx, i, j + 1); } } } if (MVM_JIT_TILE_YIELDS_VALUE(tile) && tree->info[node].opr_type != 0) { LiveRange *range = alc->values + value_set_find(alc->sets, node)->idx; _ASSERT(range->reg_type == 0 || (range->reg_type << 3) == tree->info[node].opr_type, "Register types do not match between value and node"); /* shift to match MVM_reg_types. should arguably be a macro maybe */ range->reg_type = tree->info[node].opr_type >> 3; _DEBUG( "Assigned type: %d to live range %d\n", range->reg_type, range - alc->values); } } if (num_phi > 0) { /* If there are PHI nodes, there will be holes. * The array allocated here will be used to construct linked lists */ alc->holes = MVM_malloc(num_phi * sizeof(struct Hole)); alc->holes_top = 0; find_holes(tc, alc, list); /* eliminate empty values from the worklist */ for (i = 0, j = 0; j < alc->worklist_num; j++) { if (!live_range_is_empty(alc->values + alc->worklist[j])) { alc->worklist[i++] = alc->worklist[j]; } } alc->worklist_num = i; } else { alc->holes = NULL; alc->holes_top = 0; } } /* The code below needs some thinking... */ static void active_set_add(MVMThreadContext *tc, RegisterAllocator *alc, MVMint32 a) { /* the original linear-scan heuristic for spilling is to take the last value * in the set to expire, freeeing up the largest extent of code... that is a * reasonably good heuristic, albeit not essential to the concept of linear * scan. It makes sense to keep the stack ordered at all times (simplest by * use of insertion sort). Although insertion sort is O(n^2), n is never * large in this case (32 for RISC architectures, maybe, if we ever support * them; 7 for x86-64. So the time spent on insertion sort is always small * and bounded by a constant, hence O(1). Yes, algorithmics works this way * :-) */ MVMint32 i; for (i = 0; i < alc->active_top; i++) { MVMint32 b = alc->active[i]; if (alc->values[b].end > alc->values[a].end) { /* insert a before b */ memmove(alc->active + i + 1, alc->active + i, sizeof(MVMint32)*(alc->active_top - i)); alc->active[i] = a; alc->active_top++; return; } } /* append at the end */ alc->active[alc->active_top++] = a; } /* Take live ranges from active_set whose last use was after position and append them to the retired list */ static void active_set_expire(MVMThreadContext *tc, RegisterAllocator *alc, MVMint32 order_nr) { MVMint32 i; for (i = 0; i < alc->active_top; i++) { MVMint32 v = alc->active[i]; MVMint8 reg_num = alc->values[v].reg_num; if (alc->values[v].end > order_nr) { break; } else { _DEBUG("Live range %d is out of scope (last ref %d, %d) and releasing register %d", v, alc->values[v].end, order_nr, reg_num); free_register(tc, alc, MVM_JIT_STORAGE_GPR, reg_num); } } /* shift off the first x values from the live set. */ if (i > 0) { MVM_VECTOR_APPEND(alc->retired, alc->active, i); alc->active_top -= i; if (alc->active_top > 0) { memmove(alc->active, alc->active + i, sizeof(alc->active[0]) * alc->active_top); } } } /* Compute the earliest live range that is still active. */ static MVMint32 earliest_active_value(MVMThreadContext *tc, RegisterAllocator *alc, MVMint32 tile_order_nr) { /* can we cache this, and does it make sense to do so? */ int i; for (i = 0; i < alc->active_top; i++) { tile_order_nr = MIN(tile_order_nr, alc->values[alc->active[i]].start); } return tile_order_nr; } static void active_set_splice(MVMThreadContext *tc, RegisterAllocator *alc, MVMint32 to_splice) { MVMint32 i ; /* find (reverse, because it's usually the last); predecrement alc->active_top because we're removing one item */ for (i = --alc->active_top; i >= 0; i--) { if (alc->active[i] == to_splice) break; } if (i >= 0 && i < alc->active_top) { /* shift out */ memmove(alc->active + i, alc->active + i + 1, sizeof(alc->active[0]) * alc->active_top - i); } } static void spill_set_release(MVMThreadContext *tc, RegisterAllocator *alc, MVMint32 order_nr) { while (alc->spilled_num > 0 && alc->values[alc->spilled[0]].end <= order_nr) { MVMint32 spilled = live_range_heap_pop(alc->values, alc->spilled, &alc->spilled_num, values_cmp_last_ref); LiveRange *value = alc->values + spilled; _DEBUG("VM Register %d for live range %d can be released", value->spill_pos / sizeof(MVMRegister), spilled); MVM_jit_spill_memory_release(tc, alc->compiler, value->spill_pos, value->reg_type); } } static MVMint32 insert_load_before_use(MVMThreadContext *tc, RegisterAllocator *alc, MVMJitTileList *list, ValueRef *ref, MVMint32 load_pos) { MVMint32 n = live_range_init(alc); MVMJitTile *tile = MVM_jit_tile_make(tc, alc->compiler, MVM_jit_compile_load, 2, 1, MVM_JIT_STORAGE_LOCAL, load_pos, 0); LiveRange *range = alc->values + n; MVM_jit_tile_list_insert(tc, list, tile, ref->tile_idx - 1, +1); /* insert just prior to use */ range->synthetic[0] = tile; range->first = range->last = ref; range->start = order_nr(ref->tile_idx) - 1; range->end = order_nr(ref->tile_idx); return n; } static MVMint32 insert_store_after_definition(MVMThreadContext *tc, RegisterAllocator *alc, MVMJitTileList *list, ValueRef *ref, MVMint32 store_pos) { MVMint32 n = live_range_init(alc); MVMJitTile *tile = MVM_jit_tile_make(tc, alc->compiler, MVM_jit_compile_store, 2, 2, MVM_JIT_STORAGE_LOCAL, store_pos, 0, 0); LiveRange *range = alc->values + n; MVM_jit_tile_list_insert(tc, list, tile, ref->tile_idx, -1); /* insert just after storage */ range->synthetic[1] = tile; range->first = range->last = ref; range->start = order_nr(ref->tile_idx); range->end = order_nr(ref->tile_idx) + 1; return n; } static MVMint32 select_live_range_for_spill(MVMThreadContext *tc, RegisterAllocator *alc, MVMJitTileList *list, MVMint32 code_pos) { return alc->active[alc->active_top-1]; } static void live_range_spill(MVMThreadContext *tc, RegisterAllocator *alc, MVMJitTileList *list, MVMint32 to_spill, MVMint32 spill_pos, MVMint32 code_pos) { MVMint8 reg_spilled = alc->values[to_spill].reg_num; /* loop over all value refs */ _DEBUG("Spilling live range value %d to memory position %d at %d", to_spill, spill_pos, code_pos); while (alc->values[to_spill].first != NULL) { /* make a new live range */ MVMint32 n; /* shift current ref */ ValueRef *ref = alc->values[to_spill].first; alc->values[to_spill].first = ref->next; ref->next = NULL; if (is_arglist_ref(list, ref) && order_nr(ref->tile_idx) > code_pos) { /* Never insert a load before a future ARGLIST; ARGLIST may easily * consume more registers than we have available. Past ARGLISTs have * already been handled, so we do need to insert a load a before * them (or modify in place, but, complex!). */ continue; } else if (is_definition(ref)) { n = insert_store_after_definition(tc, alc, list, ref, spill_pos); } else { n = insert_load_before_use(tc, alc, list, ref, spill_pos); } if (order_nr(ref->tile_idx) < code_pos) { /* in the past, which means we can safely use the spilled register * and immediately retire this live range */ assign_register(tc, alc, list, n, MVM_JIT_STORAGE_GPR, reg_spilled); MVM_VECTOR_PUSH(alc->retired, n); } else { /* in the future, which means we need to add it to the worklist */ MVM_VECTOR_ENSURE_SPACE(alc->worklist, 1); live_range_heap_push(alc->values, alc->worklist, &alc->worklist_num, n, values_cmp_first_ref); } } /* clear value references */ alc->values[to_spill].last = NULL; /* mark as spilled and store the spill position */ alc->values[to_spill].spill_pos = spill_pos; alc->values[to_spill].spill_idx = code_pos; free_register(tc, alc, MVM_JIT_STORAGE_GPR, reg_spilled); MVM_VECTOR_ENSURE_SPACE(alc->spilled, 1); live_range_heap_push(alc->values, alc->spilled, &alc->spilled_num, to_spill, values_cmp_last_ref); } static void prepare_arglist_and_call(MVMThreadContext *tc, RegisterAllocator *alc, MVMJitTileList *list, MVMint32 arglist_idx, MVMint32 call_idx) { MVMJitTile *arglist_tile = list->items[arglist_idx], *call_tile = list->items[call_idx]; MVMJitExprTree *tree = list->tree; MVMint32 num_args = tree->nodes[arglist_tile->node + 1]; MVMint32 arg_values[16]; MVMJitStorageRef storage_refs[16]; struct { MVMint8 in_reg; /* register number that is to be moved in */ MVMint8 num_out; /* how many values need to make room for me */ } topological_map[MVM_JIT_ARCH_NUM_GPR]; /* reverse map for topological sort of moves */ struct { MVMint8 reg_num; MVMint8 stack_pos; } stack_transfer[16]; MVMint32 stack_transfer_top = 0; MVMint8 transfer_queue[16]; MVMint32 transfer_queue_idx, transfer_queue_top = 0, transfers_required = 0; MVMint8 spilled_args[16]; MVMint32 spilled_args_top = 0; MVMBitmap call_bitmap = 0, arg_bitmap = 0; MVMint8 spare_register; MVMint32 i, j, ins_pos = 2; /* get storage positions for arglist */ MVM_jit_arch_storage_for_arglist(tc, alc->compiler, tree, arglist_tile->node, storage_refs); /* get value refs for arglist */ for (i = 0; i < num_args; i++) { MVMint32 carg = tree->nodes[arglist_tile->node + 2 + i]; /* may refer to spilled live range */ arg_values[i] = value_set_find(alc->sets, tree->nodes[carg + 1])->idx; } _DEBUG("prepare_call: Got %d args", num_args); /* initialize topological map, use -1 as 'undefined' inboud value */ for (i = 0; i < ARRAY_SIZE(topological_map); i++) { topological_map[i].num_out = 0; topological_map[i].in_reg = -1; } for (i = 0, j = 0; i < alc->active_top; i++) { LiveRange *v = alc->values + alc->active[i]; MVMint32 code_pos = order_nr(call_idx); if (v->end > code_pos && live_range_has_hole(v, code_pos) == NULL) { /* surviving values need to be spilled */ MVMint32 spill_pos = MVM_jit_spill_memory_select(tc, alc->compiler, v->reg_type); /* spilling at the CALL idx will mean that the spiller inserts a * LOAD at the current register before the ARGLIST, meaning it * remains 'live' for this ARGLIST */ _DEBUG("Spilling %d to %d at %d", alc->active[i], spill_pos, code_pos); live_range_spill(tc, alc, list, alc->active[i], spill_pos, code_pos); } else { /* compact the active set */ alc->active[j++] = alc->active[i]; } } alc->active_top = j; for (i = 0; i < num_args; i++) { LiveRange *v = alc->values + arg_values[i]; if (v->spill_idx < order_nr(call_idx)) { /* spilled prior to the ARGLIST/CALL */ spilled_args[spilled_args_top++] = i; } else if (storage_refs[i]._cls == MVM_JIT_STORAGE_GPR) { MVMint8 reg_num = storage_refs[i]._pos; if (reg_num != v->reg_num) { _DEBUG("Transfer Rq(%d) -> Rq(%d)", reg_num, v->reg_num); topological_map[reg_num].in_reg = v->reg_num; topological_map[v->reg_num].num_out++; transfers_required++; } else { _DEBUG("Transfer Rq(%d) not required", reg_num); } } else if (storage_refs[i]._cls == MVM_JIT_STORAGE_STACK) { /* enqueue for stack transfer */ stack_transfer[stack_transfer_top].reg_num = v->reg_num; stack_transfer[stack_transfer_top].stack_pos = storage_refs[i]._pos; stack_transfer_top++; /* count the outbound edge */ topological_map[v->reg_num].num_out++; } else { NYI(this_storage_class); } /* set bitmap */ if (storage_refs[i]._cls == MVM_JIT_STORAGE_GPR) { MVMint8 reg_num = storage_refs[i]._pos; MVM_bitmap_set(&arg_bitmap, reg_num); } } _DEBUG("%d transfers required", transfers_required); #define INSERT_TILE(_tile, _pos, _order) MVM_jit_tile_list_insert(tc, list, _tile, _pos, _order) #define INSERT_NEXT_TILE(_tile) INSERT_TILE(_tile, arglist_idx, ins_pos++) #define MAKE_TILE(_code, _narg, _nval, ...) MVM_jit_tile_make(tc, alc->compiler, MVM_jit_compile_ ## _code, _narg, _nval, __VA_ARGS__) #define INSERT_MOVE(_a, _b) INSERT_NEXT_TILE(MAKE_TILE(move, 0, 2, _a, _b)) #define INSERT_COPY_TO_STACK(_s, _r) INSERT_NEXT_TILE(MAKE_TILE(store, 2, 2, MVM_JIT_STORAGE_STACK, _s, 0, _r)) #define INSERT_LOAD_LOCAL(_r, _l) INSERT_NEXT_TILE(MAKE_TILE(load, 2, 1, MVM_JIT_STORAGE_LOCAL, _l, _r)) #define INSERT_LOCAL_STACK_COPY(_s, _l) \ INSERT_NEXT_TILE(MAKE_TILE(memory_copy, 4, 2, MVM_JIT_STORAGE_STACK, _s, MVM_JIT_STORAGE_LOCAL, _l, 0, spare_register)) #define ENQUEUE_TRANSFER(_r) do { \ MVMint8 _c = (_r); \ if (--(topological_map[(_c)].num_out) == 0 && \ topological_map[(_c)].in_reg >= 0) { \ transfer_queue[transfer_queue_top++] = _c; \ } \ } while(0) /* resolve conflicts for CALL; since we're spilling any surviving bits, * we can just move it to any free registers. */ for (i = 0; i < call_tile->num_refs; i++) { MVMint8 spec = MVM_JIT_REGISTER_FETCH(call_tile->register_spec, i + 1); if (MVM_JIT_REGISTER_IS_USED(spec)) { MVMint8 reg = call_tile->values[i+1]; MVM_bitmap_set(&call_bitmap, reg); } } while (call_bitmap & arg_bitmap) { MVMuint32 free_reg = ~(call_bitmap | arg_bitmap | NVR_GPR_BITMAP); /* FFS counts registers starting from 1 */ MVMuint8 src = MVM_FFS(call_bitmap & arg_bitmap) - 1; MVMuint8 dst = MVM_FFS(free_reg) - 1; _ASSERT(free_reg != 0, "JIT: need to move a register but nothing is free"); /* add edge */ topological_map[dst].in_reg = src; topological_map[src].num_out++; /* update bitmap */ MVM_bitmap_delete(&call_bitmap, src); MVM_bitmap_set(&call_bitmap, dst); /* update CALL args */ for (i = 0; i < call_tile->num_refs; i++) { if (call_tile->values[i+1] == src) { call_tile->values[i+1] = dst; } } } /* at this point, all outbound edges have been created, and none have been * processed yet, so we can eqnueue all 'free' transfers */ for (i = 0; i < ARRAY_SIZE(topological_map); i++) { if (topological_map[i].num_out == 0 && topological_map[i].in_reg >= 0) { _DEBUG("Directly transfer %d -> %d", topological_map[i].in_reg, i); transfer_queue[transfer_queue_top++] = i; } } /* with call_bitmap and arg_bitmap given, we can determine the spare * register used for allocation; NB this may only be necessary in some * cases */ spare_register = MVM_FFS(~(call_bitmap | arg_bitmap | NVR_GPR_BITMAP)) - 1; _ASSERT(spare_register >= 0, "JIT: No spare register for moves"); for (i = 0; i < stack_transfer_top; i++) { MVMint8 reg_num = stack_transfer[i].reg_num; MVMint8 stk_pos = stack_transfer[i].stack_pos; INSERT_COPY_TO_STACK(stk_pos, reg_num); _DEBUG("Insert stack parameter: Rq(%d) -> [rsp+%d]", reg_num, stk_pos); ENQUEUE_TRANSFER(reg_num); } for (transfer_queue_idx = 0; transfer_queue_idx < transfer_queue_top; transfer_queue_idx++) { MVMint8 dst = transfer_queue[transfer_queue_idx]; MVMint8 src = topological_map[dst].in_reg; _ASSERT(src >= 0, "No inboud edge (sort)"); _DEBUG("Insert move (toposort): Rq(%d) -> Rq(%d)", src, dst); INSERT_MOVE(dst, src); ENQUEUE_TRANSFER(src); } if (transfer_queue_top < transfers_required) { /* suppose we have a cycle of transfers: a -> b -> c -> a; * since we only keep the one inbound register as a reference, the chain * is really: * a -> c -> b -> a * We can 'break' this cycle by walking the chain in this order, first * moving 'a' out of thee way into a spare register, then moving c to a, * b to c, and finally moving the spare register to 'b' */ for (i = 0; i < MVM_JIT_ARCH_NUM_GPR; i++) { if (topological_map[i].num_out > 0) { MVMint8 src, dst; INSERT_MOVE(spare_register, i); _ASSERT(--(topological_map[i].num_out) == 0, "More than one outbound edge in cycle"); for (dst = i, src = topological_map[i].in_reg; src != i; dst = src, src = topological_map[src].in_reg) { _ASSERT(src >= 0, "No inbound edge (cycle breaking)"); INSERT_MOVE(dst, src); _ASSERT(--(topological_map[src].num_out) == 0, "More than one outbound edge in cycle"); } INSERT_MOVE(dst, spare_register); } } } /* now all that remains is to deal with spilled values */ for (i = 0; i < spilled_args_top; i++) { MVMint32 arg = spilled_args[i]; LiveRange *v = alc->values + arg_values[arg]; if (storage_refs[arg]._cls == MVM_JIT_STORAGE_GPR) { _DEBUG("Loading spilled value to Rq(%d) from [rbx+%d]", storage_refs[arg]._pos, v->spill_pos); INSERT_LOAD_LOCAL(storage_refs[arg]._pos, v->spill_pos); } else if (storage_refs[arg]._cls == MVM_JIT_STORAGE_STACK) { INSERT_LOCAL_STACK_COPY(storage_refs[arg]._pos, v->spill_pos); } else { NYI(storage_class); } } } MVM_STATIC_INLINE void process_tile(MVMThreadContext *tc, RegisterAllocator *alc, MVMJitTileList *list, MVMint32 tile_cursor) { MVMJitTile *tile = list->items[tile_cursor]; if (tile->op == MVM_JIT_ARGLIST) { MVMint32 arglist_idx = tile_cursor; MVMint32 call_idx = tile_cursor + 1; _ASSERT(call_idx < list->items_num && (list->items[call_idx]->op == MVM_JIT_CALL || list->items[call_idx]->op == MVM_JIT_CALLV), "ARGLIST tiles must be followed by CALL"); } else if (tile->op == MVM_JIT_CALL || tile->op == MVM_JIT_CALLV) { MVMint32 arglist_idx = tile_cursor - 1; MVMint32 call_idx = tile_cursor; _ASSERT(tile_cursor > 0 && list->items[tile_cursor - 1]->op == MVM_JIT_ARGLIST, "CALL must be preceded by ARGLIST"); /* * CALL nodes can use values in registers, for example for dynamic * calls. These registers may conflict with registers used in ARGLIST, * in which case prepare_arglist_and_call will move the values to a free * register and update the call tile. * * However, as regular register-allocated values, the selected register * may be allocated for a synthetic LOAD tile after it had previously * been spilled. To ensure that allocation for the synthetic tile does * not overwrite the free register picked by the resolution code, we * must be sure that prepare_arglist_and_call will be run *after* all * registers have been allocated for the values used by the CALL tile. * * That is why prepare_arglist_and_call, which handles BOTH tiles, is * called for the CALL tile and not for the ARGLIST tile. */ prepare_arglist_and_call(tc, alc, list, arglist_idx, call_idx); } else { MVMint32 i; /* deal with 'use' registers */ for (i = 1; i < tile->num_refs; i++) { MVMint8 spec = MVM_JIT_REGISTER_FETCH(tile->register_spec, i); if (MVM_JIT_REGISTER_IS_USED(spec) && MVM_JIT_REGISTER_HAS_REQUIREMENT(spec)) { /* we could use the register map here, but let's wait and see */ NYI(tile_use_requirements); } } } } static void process_live_range(MVMThreadContext *tc, RegisterAllocator *alc, MVMJitTileList *list, MVMint32 v) { MVMint8 reg; MVMint32 tile_order_nr = alc->values[v].start; if (MVM_JIT_REGISTER_HAS_REQUIREMENT(alc->values[v].register_spec)) { reg = MVM_JIT_REGISTER_REQUIREMENT(alc->values[v].register_spec); if (MVM_bitmap_get((MVMBitmap*)&NVR_GPR_BITMAP, reg)) { assign_register(tc, alc, list, v, MVM_JIT_STORAGE_NVR, reg); } else { /* TODO; might require swapping / spilling */ NYI(general_purpose_register_spec); } } else { while ((reg = get_register(tc, alc, MVM_JIT_STORAGE_GPR)) < 0) { /* choose a live range, a register to spill, and a spill location */ MVMint32 to_spill = select_live_range_for_spill(tc, alc, list, tile_order_nr); MVMint32 spill_pos = MVM_jit_spill_memory_select(tc, alc->compiler, alc->values[to_spill].reg_type); active_set_splice(tc, alc, to_spill); _DEBUG("Spilling live range %d at %d to %d to free up a register", to_spill, tile_order_nr, spill_pos); live_range_spill(tc, alc, list, to_spill, spill_pos, tile_order_nr); } assign_register(tc, alc, list, v, MVM_JIT_STORAGE_GPR, reg); active_set_add(tc, alc, v); } } static void linear_scan(MVMThreadContext *tc, RegisterAllocator *alc, MVMJitTileList *list) { MVMint32 tile_cursor = 0; MVM_VECTOR_INIT(alc->retired, alc->worklist_num); MVM_VECTOR_INIT(alc->spilled, 8); _DEBUG("STARTING LINEAR SCAN: %d/%d", tc->instance->jit_seq_nr, list->tree->seq_nr); /* loop over all tiles and peek on the value heap */ while (tile_cursor < list->items_num) { if (alc->worklist_num > 0 && live_range_heap_peek(alc->values, alc->worklist) < order_nr(tile_cursor)) { /* we've processed all tiles prior to this live range */ MVMint32 live_range = live_range_heap_pop(alc->values, alc->worklist, &alc->worklist_num, values_cmp_first_ref); MVMint32 tile_order_nr = alc->values[live_range].start; _DEBUG("Processing live range %d (first ref %d, last ref %d)", live_range, alc->values[live_range].start, alc->values[live_range].end); active_set_expire(tc, alc, tile_order_nr); /* We can release the spill slot only if there is no more active * live range overlapping with its extent. Otherwise, when we reuse * the slot, we risk overwriting a useful value. * * We pass the current tile_order_nr as the upper bound (e.g. when * there may be no active live ranges, slots will still be useful if * they have later uses */ spill_set_release(tc, alc, earliest_active_value(tc,alc, tile_order_nr)); process_live_range(tc, alc, list, live_range); } else { /* still have tiles to process, increment cursor */ process_tile(tc, alc, list, tile_cursor++); } } /* flush active live ranges */ active_set_expire(tc, alc, order_nr(list->items_num) + 1); spill_set_release(tc, alc, order_nr(list->items_num) + 1); _DEBUG("END OF LINEAR SCAN%s","\n"); } void MVM_jit_linear_scan_allocate(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitTileList *list) { RegisterAllocator alc; /* initialize allocator */ alc.compiler = compiler; /* restart spill stack */ alc.active_top = 0; memset(alc.active, -1, sizeof(alc.active)); alc.reg_give = alc.reg_take = 0; memcpy(alc.reg_ring, available_gpr, sizeof(available_gpr)); /* run algorithm */ determine_live_ranges(tc, &alc, list); linear_scan(tc, &alc, list); /* deinitialize allocator */ MVM_free(alc.sets); MVM_free(alc.refs); MVM_free(alc.holes); MVM_free(alc.values); MVM_free(alc.worklist); MVM_free(alc.retired); MVM_free(alc.spilled); /* make edits effective */ MVM_jit_tile_list_edit(tc, list); } MoarVM-2018.03/src/jit/log.c0000644000175000017510000001412413242626641015515 0ustar samanthasamantha#include "moar.h" /* inline this? maybe */ void MVM_jit_log(MVMThreadContext *tc, const char * fmt, ...) { va_list args; va_start(args, fmt); if (tc->instance->jit_log_fh) { vfprintf(tc->instance->jit_log_fh, fmt, args); } va_end(args); } void MVM_jit_log_bytecode(MVMThreadContext *tc, MVMJitCode *code) { /* Filename format: moar-jit-%d.bin. number can consume at most 10 * bytes, moar-jit-.bin is 13 bytes, one byte for the zero at the * end, one byte for the directory separator is 25 bytes, plus the * length of the bytecode directory itself */ size_t filename_size = strlen(tc->instance->jit_bytecode_dir) + 25; char * filename = MVM_malloc(filename_size); FILE * out; snprintf(filename, filename_size, "%s/moar-jit-%04d.bin", tc->instance->jit_bytecode_dir, code->seq_nr); out = fopen(filename, "w"); if (out) { fwrite(code->func_ptr, sizeof(char), code->size, out); fclose(out); if (tc->instance->jit_bytecode_map) { char *frame_name = code->sf ? MVM_string_utf8_encode_C_string(tc, code->sf->body.name) : NULL; char *frame_cuuid = code->sf ? MVM_string_utf8_encode_C_string(tc, code->sf->body.cuuid) : NULL; /* I'd like to add linenumber and filename information, but it's really a lot of work at this point */ fprintf( tc->instance->jit_bytecode_map, "%s\t%s\t%s\n", filename, frame_name ? frame_name : "(unknown)", frame_cuuid ? frame_cuuid : "(unknown)" ); fflush(tc->instance->jit_bytecode_map); MVM_free(frame_name); MVM_free(frame_cuuid); } } else { MVM_jit_log(tc, "ERROR: could dump bytecode in %s\n", filename); } MVM_free(filename); } static void dump_tree(MVMThreadContext *tc, MVMJitTreeTraverser *traverser, MVMJitExprTree *tree, MVMint32 node) { MVMJitExprNodeInfo *info = &tree->info[node]; const MVMJitExprOpInfo *op = info->op_info; MVMint32 *depth = traverser->data; MVMint32 i, j; char indent[64]; char nargs[80]; (*depth)++; #define MIN(a,b) ((a) < (b) ? (a) : (b)) i = MIN(*depth*2, sizeof(indent)-1); memset(indent, ' ', i); indent[i] = 0; j = 0; for (i = 0; i < op->nargs; i++) { MVMint64 arg = tree->nodes[node+op->nchild+i+1]; j += snprintf(nargs + j, sizeof(nargs)-j-3, "%"PRId64, arg); if (i+1 < op->nargs && j < sizeof(nargs)-3) { j += sprintf(nargs + j, ", "); } } nargs[j] = 0; MVM_jit_log(tc, "%04d%s%s (%s; sz=%d)\n", node, indent, op->name, nargs, info->size); } static void ascend_tree(MVMThreadContext *tc, MVMJitTreeTraverser *traverser, MVMJitExprTree *tree, MVMint32 node) { MVMint32 *depth = traverser->data; (*depth)--; } static void write_graphviz_node(MVMThreadContext *tc, MVMJitTreeTraverser *traverser, MVMJitExprTree *tree, MVMint32 node) { FILE *graph_file = traverser->data; const MVMJitExprOpInfo *op_info = tree->info[node].op_info; MVMint32 first_child = node + 1; MVMint32 nchild = op_info->nchild < 0 ? tree->nodes[first_child++] : op_info->nchild; MVMint32 first_arg = first_child + nchild; MVMint32 i; /* maximum length of op name is 'invokish' at 8 characters, let's allocate * 16; maximum number of parameters is 4, and 64 bits; printing them in * hexadecimal would require at most 8 characters, plus 4 for the '0x' and * the ', '; minus 2 for the last one, plus 2 for the ampersands, plus 0 for * the terminus, gives us 16 + 4*12 + 3 = 67; 80 should be plenty */ char node_label[80]; char *ptr = node_label + sprintf(node_label, "%s%s", op_info->name, op_info->nargs ? "(" : ""); for (i = 0; i < op_info->nargs; i++) { ptr += sprintf(ptr, "%#" PRIx64 "%s", tree->nodes[first_arg+i], (i + 1 < op_info->nargs) ? ", " : ")"); } fprintf(graph_file, " n_%04d [label=\"%s\"];\n", node, node_label); for (i = 0; i < nchild; i++) { fprintf(graph_file, " n_%04d -> n_%04d;\n", node, (MVMint32)tree->nodes[first_child+i]); } } void MVM_jit_log_expr_tree(MVMThreadContext *tc, MVMJitExprTree *tree) { MVMJitTreeTraverser traverser; if (!tc->instance->jit_log_fh) return; traverser.policy = MVM_JIT_TRAVERSER_ONCE; traverser.preorder = NULL; traverser.inorder = NULL; traverser.postorder = &write_graphviz_node; traverser.data = tc->instance->jit_log_fh; MVM_jit_log(tc, "Starting dump of JIT expression tree\n" "====================================\n"); MVM_jit_log(tc, "digraph {\n"); MVM_jit_expr_tree_traverse(tc, tree, &traverser); MVM_jit_log(tc, "}\n"); MVM_jit_log(tc, "End dump of JIT expression tree\n" "====================================\n"); } void MVM_jit_log_tile_list(MVMThreadContext *tc, MVMJitTileList *list) { MVMint32 i, j; FILE *f = tc->instance->jit_log_fh; if (!f) return; fprintf(f, "Starting tile list log\n" "======================\n"); for (i = 0; i < list->blocks_num; i++) { MVMint32 start = list->blocks[i].start, end = list->blocks[i].end; fprintf(f, "Block{%d} [%d-%d)\n", i, start, end); for (j = start; j < end; j++) { MVMJitTile *tile = list->items[j]; fprintf(f, " %d: %s\n", j, tile->debug_name ? tile->debug_name : ""); } if (list->blocks[i].num_succ == 2) { fprintf(f, "-> { %d, %d }\n", list->blocks[i].succ[0], list->blocks[i].succ[1]); } else if (list->blocks[i].num_succ == 1) { fprintf(f, "-> { %d }\n", list->blocks[i].succ[0]); } else { fprintf(f, "-> {}\n"); } } fprintf(f, "End of tile list log\n" "======================\n"); } MoarVM-2018.03/src/jit/log.h0000644000175000017510000000045213237701240015512 0ustar samanthasamanthavoid MVM_jit_log(MVMThreadContext *tc, const char *fmt, ...) MVM_FORMAT(printf, 2, 3); void MVM_jit_log_bytecode(MVMThreadContext *tc, MVMJitCode *code); void MVM_jit_log_expr_tree(MVMThreadContext *tc, MVMJitExprTree *tree); void MVM_jit_log_tile_list(MVMThreadContext *tc, MVMJitTileList *list); MoarVM-2018.03/src/jit/macro.expr0000644000175000017510000000456513250636753016605 0ustar samanthasamantha# -*-whitespace-*- (macro: ^getf (,object ,type ,field) (load (addr ,object (&offsetof ,type ,field)) (&SIZEOF_MEMBER ,type ,field))) (macro: ^setf (,object ,type ,field ,value) (store (addr ,object (&offsetof ,type ,field)) ,value (&SIZEOF_MEMBER ,type ,field))) (macro: ^cu_callsite (,a) (idx (^getf (cu) MVMCompUnit body.callsites) ,a ptr_sz)) (macro: ^frame () (^getf (tc) MVMThreadContext cur_frame)) (macro: ^parg (,a) (idx (^getf (^frame) MVMFrame params.args) ,a reg_sz)) (macro: ^params () (addr (^frame) (&offsetof MVMFrame params))) (macro: ^caller () (^getf (^frame) MVMFrame caller)) # get spesh slot address (macro: ^spesh_slot (,a) (idx (^getf (^frame) MVMFrame effective_spesh_slots) ,a ptr_sz)) (macro: ^vmnull () (^getf (^getf (tc) MVMThreadContext instance) MVMInstance VMNull)) (macro: ^stable (,a) (^getf ,a MVMObject st)) (macro: ^hllconfig () (^getf (cu) MVMCompUnit body.hll_config)) (macro: ^exit () (branch (label branch_exit))) (macro: ^p6obody (,a) (let: (($replace (^getf ,a MVMP6opaque body.replaced))) (if (nz $replace) $replace (addr ,a (&offsetof MVMP6opaque body))))) (macro: ^func (,a) (const (&CONST_PTR ,a) ptr_sz)) (macro: ^cu_string (,a) (call (^func MVM_cu_string) (arglist (carg (tc) ptr) (carg (cu) ptr) (carg ,a int)) ptr_sz)) (macro: ^objflag (,cv) (const ("E ,cv) (&SIZEOF_MEMBER MVMObject header.flags))) (macro: ^write_barrier (,root ,obj) (when (all (nz (and (^getf ,root MVMCollectable flags) (^objflag MVM_CF_SECOND_GEN))) (nz ,obj) (zr (and (^getf ,obj MVMCollectable flags) (^objflag MVM_CF_SECOND_GEN)))) (callv (^func &MVM_gc_write_barrier_hit) (arglist (carg (tc) ptr) (carg ,root ptr))))) (macro: ^store_write_barrier! (,root ,addr ,obj) (dov (store ,addr ,obj ptr_sz) (^write_barrier ,root ,obj))) (macro: ^repr (,obj) (^getf (^stable ,obj) MVMSTable REPR)) (macro: ^is_type_obj (,a) (nz (and (^getf ,a MVMObject header.flags) (^objflag MVM_CF_TYPE_OBJECT)))) (macro: ^is_conc_obj (,a) (zr (and (^getf ,a MVMObject header.flags) (^objflag MVM_CF_TYPE_OBJECT)))) (macro: ^stable_cont_func (,obj ,func) (^getf (^getf (^stable ,obj) MVMSTable container_spec) MVMContainerSpec ,func)) (macro: ^body (,a) (addr ,a (&offsetof MVMObjectStooge data))) MoarVM-2018.03/src/jit/register.h0000644000175000017510000000462213237701240016560 0ustar samanthasamantha/* different places in which we can store stuff */ typedef enum { MVM_JIT_STORAGE_LOCAL, MVM_JIT_STORAGE_STACK, MVM_JIT_STORAGE_GPR, /* general purpose register */ MVM_JIT_STORAGE_FPR, /* floating point register */ MVM_JIT_STORAGE_NVR /* non-volatile register */ } MVMJitStorageClass; /* a reference to a place something is stored */ typedef struct { MVMJitStorageClass _cls; MVMint32 _pos; } MVMJitStorageRef; /* I'll never run out of names for a CONS */ /* REGISTER REQUIREMENT SPECIFICATION * * The goal is to represent required registers for a tile. I've assumed that 6 * bits are sufficient to specify a register number (64 possibilities; for * x86-64 we'd need 16 for GPR, 16 for the FPR, so that'd be 32, and I'm not * 100% sure that using register numbers that way is right for the FPR/GPR * distinction. * * We need to encode two facts: * - this value needs to be in a register * - and that register should be $such * * So we use the following layout: * * +---------------+--------------------------+-------------------------------+ * | Used? (1 bit) | Has Requirement? (1 bit) | Required register nr (6 bits) | * +---------------+--------------------------+-------------------------------+ * * Which is then repeated four times over an unsgined 32 bit integer. The first * value always specifies the output register, so that we can determine if a * tile has any register output simply by (spec & 1). */ #define MVM_JIT_REG_MK2(arch,name) arch ## _ ## name #define MVM_JIT_REG_MK1(arch,name) MVM_JIT_REG_MK2(arch,name) #define MVM_JIT_REG(name) MVM_JIT_REG_MK1(MVM_JIT_ARCH,name) #define MVM_JIT_REGISTER_NONE 0 #define MVM_JIT_REGISTER_ANY 1 #define MVM_JIT_REGISTER_REQUIRE(name) (3 | ((MVM_JIT_REG(name)) << 2)) #define MVM_JIT_REGISTER_ENCODE(spec,n) ((spec) << (8*(n))) #define MVM_JIT_REGISTER_FETCH(spec,n) (((spec) >> (8*(n)))&0xff) #define MVM_JIT_REGISTER_IS_USED(desc) ((desc) & 1) #define MVM_JIT_REGISTER_HAS_REQUIREMENT(desc) (((desc) & 2) >> 1) #define MVM_JIT_REGISTER_REQUIREMENT(desc) (((desc) & 0xfc) >> 2) void MVM_jit_linear_scan_allocate(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitTileList *list); void MVM_jit_arch_storage_for_arglist(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitExprTree *tree, MVMint32 arglist_node, MVMJitStorageRef *storage); MoarVM-2018.03/src/jit/stub.c0000644000175000017510000000122413237701240015677 0ustar samanthasamantha#include "moar.h" /* Stub file to mark our lack of support for this architecture. We should probably stub dasm, too, rather than include x86 */ const MVMint32 MVM_jit_support() { return 0; } MVMJitGraph* MVM_jit_try_make_graph(MVMThreadContext *tc, MVMSpeshGraph *sg) { return NULL; } MVMJitCode * MVM_jit_compile_graph(MVMThreadContext *tc, MVMJitGraph *jg) { return NULL; } void MVM_jit_graph_destroy(MVMThreadContext *tc, MVMJitGraph *graph) { return; } void MVM_jit_destroy_code(MVMThreadContext *tc, MVMJitCode *code) { return; } void MVM_jit_enter_code(MVMThreadContext *tc, MVMCompUnit *cu, MVMJitCode *code) { return; } MoarVM-2018.03/src/jit/tile.c0000644000175000017510000010012413242626641015665 0ustar samanthasamantha#include "moar.h" #include "internal.h" #include #if MVM_JIT_ARCH == MVM_JIT_ARCH_X64 #include "jit/x64/tile_decl.h" #include "jit/x64/tile_pattern.h" #endif #if MVM_JIT_DEBUG #define _ASSERT(x, f, ...) do { if (!(x)) { MVM_oops(tc, f, __VA_ARGS__); } } while(0) #else #define _ASSERT(x, f, ...) do { } while (0) #endif struct TileState { /* state is junction of applicable tiles */ MVMint32 state; /* rule is number of best applicable tile */ MVMint32 rule; /* template is template of assigned tile */ const MVMJitTileTemplate *template; /* block that ends at this node (or node ref) */ MVMint32 block; }; struct TreeTiler { MVM_VECTOR_DECL(struct TileState, states); MVMJitCompiler *compiler; MVMJitTileList *list; }; /* Make complete tiles. Note that any argument passed is interpreted as an * int32. Used primarily for making 'synthetic' tiles introduced by the * compiler */ MVMJitTile* MVM_jit_tile_make(MVMThreadContext *tc, MVMJitCompiler *compiler, void *emit, MVMint32 num_args, MVMint32 num_values, ...) { MVMJitTile *tile; MVMint32 i; va_list arglist; va_start(arglist, num_values); tile = MVM_spesh_alloc(tc, compiler->graph->sg, sizeof(MVMJitTile)); tile->emit = emit; tile->num_refs = num_values; for (i = 0; i < num_args; i++) { tile->args[i] = va_arg(arglist, MVMint32); } for (i = 0; i < num_values; i++) { tile->values[i] = (MVMint8)va_arg(arglist, MVMint32); } va_end(arglist); return tile; } /* Postorder collection of tile states (rulesets) */ static void tile_node(MVMThreadContext *tc, MVMJitTreeTraverser *traverser, MVMJitExprTree *tree, MVMint32 node) { struct TreeTiler *tiler = traverser->data; MVMJitExprNode op = tree->nodes[node]; const MVMJitExprOpInfo *info = tree->info[node].op_info; MVMint32 first_child = node+1; MVMint32 nchild = info->nchild < 0 ? tree->nodes[first_child++] : info->nchild; MVMint32 *state_info = NULL; switch (op) { case MVM_JIT_ALL: case MVM_JIT_ANY: case MVM_JIT_ARGLIST: { /* Unary variadic nodes are exactly the same... */ MVMint32 i; for (i = 0; i < nchild; i++) { MVMint32 child = tree->nodes[first_child+i]; state_info = MVM_jit_tile_state_lookup(tc, op, tiler->states[child].state, -1); _ASSERT(state_info != NULL, "OOPS, %s can't be tiled with a %s child at position %d", info->name, tree->info[child].op_info->name, i); } tiler->states[node].state = state_info[3]; tiler->states[node].rule = state_info[4]; } break; case MVM_JIT_DO: case MVM_JIT_DOV: { MVMint32 last_child = first_child+nchild-1; MVMint32 left_state = tiler->states[tree->nodes[first_child]].state; MVMint32 right_state = tiler->states[tree->nodes[last_child]].state; state_info = MVM_jit_tile_state_lookup(tc, op, left_state, right_state); _ASSERT(state_info != NULL, "Can't tile this DO node %d", node); tiler->states[node].state = state_info[3]; tiler->states[node].rule = state_info[4]; } break; case MVM_JIT_IF: case MVM_JIT_IFV: { MVMint32 cond = tree->nodes[node+1], left = tree->nodes[node+2], right = tree->nodes[node+3]; MVMint32 *left_state = MVM_jit_tile_state_lookup(tc, op, tiler->states[cond].state, tiler->states[left].state); MVMint32 *right_state = MVM_jit_tile_state_lookup(tc, op, tiler->states[cond].state, tiler->states[right].state); _ASSERT(left_state != NULL && right_state != NULL, "Inconsistent %s tile state", info->name); tiler->states[node].state = left_state[3]; tiler->states[node].rule = left_state[4]; } break; default: { if (nchild == 0) { state_info = MVM_jit_tile_state_lookup(tc, op, -1, -1); } else if (nchild == 1) { MVMint32 left = tree->nodes[first_child]; MVMint32 lstate = tiler->states[left].state; state_info = MVM_jit_tile_state_lookup(tc, op, lstate, -1); } else if (nchild == 2) { MVMint32 left = tree->nodes[first_child]; MVMint32 lstate = tiler->states[left].state; MVMint32 right = tree->nodes[first_child+1]; MVMint32 rstate = tiler->states[right].state; state_info = MVM_jit_tile_state_lookup(tc, op, lstate, rstate); } _ASSERT(state_info != NULL, "Tiler table could not find next state for %s\n", info->name); tiler->states[node].state = state_info[3]; tiler->states[node].rule = state_info[4]; } } } /* It may happen that a nodes which is used multiple times is tiled in * differrent ways, because it is the parent tile which determines which * 'symbol' the child node gets to implement, and hence different parents might * decide differently. That may mean the same value will be computed more than * once, which could be suboptimal. Still, it is necessary to resolve such * conflicts. We do so by generating a new node for the parent node to refer to, * leaving the old node as it was. That may cause the tree to grow, which is * implemented by realloc. As a result, it is unsafe to take references to tree * elements while it is being modified. */ static MVMint32 assign_tile(MVMThreadContext *tc, MVMJitExprTree *tree, MVMJitTreeTraverser *traverser, MVMJitExprNode node, MVMint32 rule_nr) { const MVMJitTileTemplate *template = &MVM_jit_tile_templates[rule_nr]; struct TreeTiler *tiler = traverser->data; _ASSERT(rule_nr <= (sizeof(MVM_jit_tile_templates)/sizeof(MVM_jit_tile_templates[0])), "Attempt to assign invalid tile rule %d\n", rule_nr); if (tiler->states[node].template == NULL || tiler->states[node].template == template || memcmp(template, tiler->states[node].template, sizeof(MVMJitTileTemplate)) == 0) { /* happy case, no conflict */ tiler->states[node].rule = rule_nr; tiler->states[node].template = template; return node; } else { /* resolve conflict by copying this node */ const MVMJitExprOpInfo *info = tree->info[node].op_info; MVMint32 space = (info->nchild < 0 ? 2 + tree->nodes[node+1] + info->nargs : 1 + info->nchild + info->nargs); MVMint32 num = tree->nodes_num; /* NB - we should have an append_during_traversal function * because the following is quite a common pattern */ /* Internal copy; hence no realloc may happen during append, ensure the * space is available before the copy */ MVM_VECTOR_ENSURE_SPACE(tree->nodes, space); MVM_VECTOR_APPEND(tree->nodes, tree->nodes + node, space); /* Copy the information node as well */ MVM_VECTOR_ENSURE_SIZE(tree->info, num); memcpy(tree->info + num, tree->info + node, sizeof(MVMJitExprNodeInfo)); /* Also ensure the visits and tiles array are of correct size */ MVM_VECTOR_ENSURE_SIZE(tiler->states, num); MVM_VECTOR_ENSURE_SIZE(traverser->visits, num); /* Assign the new tile */ tiler->states[num].rule = rule_nr; tiler->states[num].template = template; /* Return reference to new node */ return num; } } /* Preorder propagation of rules downward */ static void select_tiles(MVMThreadContext *tc, MVMJitTreeTraverser *traverser, MVMJitExprTree *tree, MVMint32 node) { MVMJitExprNode op = tree->nodes[node]; MVMint32 first_child = node+1; MVMint32 nchild = (tree->info[node].op_info->nchild < 0 ? tree->nodes[first_child++] : tree->info[node].op_info->nchild); struct TreeTiler *tiler = traverser->data; const MVMJitTileTemplate *tile = tiler->states[node].template; MVMint32 left_sym = tile->left_sym, right_sym = tile->right_sym; /* Tile assignment is somewhat precarious due to (among other things), possible * reallocation. So let's provide a single macro to do it correctly. */ #define DO_ASSIGN_CHILD(NUM, SYM) do { \ MVMint32 child = tree->nodes[first_child+(NUM)]; \ MVMint32 state = tiler->states[child].state; \ MVMint32 rule = MVM_jit_tile_select_lookup(tc, state, (SYM)); \ MVMint32 assigned = assign_tile(tc, tree, traverser, child, rule); \ tree->nodes[first_child+(NUM)] = assigned; \ } while(0) switch (op) { case MVM_JIT_ALL: case MVM_JIT_ANY: case MVM_JIT_ARGLIST: { MVMint32 i; for (i = 0; i < nchild; i++) { DO_ASSIGN_CHILD(i, left_sym); } } break; case MVM_JIT_DO: case MVM_JIT_DOV: { MVMint32 i, last_child, last_rule; for (i = 0; i < nchild - 1; i++) { DO_ASSIGN_CHILD(i, left_sym); } DO_ASSIGN_CHILD(i, right_sym); } break; case MVM_JIT_IF: case MVM_JIT_IFV: { DO_ASSIGN_CHILD(0, left_sym); DO_ASSIGN_CHILD(1, right_sym); DO_ASSIGN_CHILD(2, right_sym); } break; case MVM_JIT_GUARD: { /* tree->nodes[node+2] = the first guard of the before/after pair */ if (tree->nodes[node+2] != 0) { MVMJitTile *tile = MVM_jit_tile_make(tc, tiler->compiler, MVM_jit_compile_guard, 1, 0, tree->nodes[node+2]); /* XXX - request a spare register (necessary for DYMAMIC LABEL * etc). This should be generalized */ tile->register_spec = MVM_JIT_REGISTER_ANY; tile->debug_name = "(guard :pre)"; MVM_VECTOR_PUSH(tiler->list->items, tile); } DO_ASSIGN_CHILD(0, left_sym); } default: { _ASSERT(nchild <= 2, "Can't tile %d children of %s", nchild, tree->info[node].op_info->name); if (nchild > 0) { DO_ASSIGN_CHILD(0, left_sym); } if (nchild > 1) { DO_ASSIGN_CHILD(1, right_sym); } } } #undef DO_ASSIGN_CHILD /* (Currently) we never insert into the tile list here */ } static void start_basic_block(MVMThreadContext *tc, struct TreeTiler *tiler, MVMint32 node) { /* After the last tile of a basic block (e.g. after a branch) or before the * first tile of a new basic block (before a label), 'split' off a new basic * block from the old one; tag the node with this basic block, so the * patchup process can work */ MVMJitTileList *list = tiler->list; MVMint32 tile_idx = list->items_num, block_idx = list->blocks_num; MVM_VECTOR_ENSURE_SPACE(list->blocks, 1); list->blocks[block_idx].end = tile_idx; list->blocks[block_idx+1].start = tile_idx; list->blocks_num++; /* associate block with node */ tiler->states[node].block = block_idx; } static void extend_last_block(MVMThreadContext *tc, struct TreeTiler *tiler, MVMint32 node) { /* In some cases (ANY in WHEN, ALL in ANY, ANY in ALL) the last basic block * of the inner block has functionally the same successors as the outer node * block; in this case we can 'extend' this block to include the * (unconditional) branch and tag the outer block withthe inner block. This * works mostly because the call to extend_last_block follows directly after * the start_basic_block by the inner block. */ MVMJitTileList *list = tiler->list; MVMint32 tile_idx = list->items_num, block_idx = list->blocks_num; list->blocks[block_idx - 1].end = tile_idx; list->blocks[block_idx].start = tile_idx; tiler->states[node].block = block_idx - 1; } static void patch_shortcircuit_blocks(MVMThreadContext *tc, struct TreeTiler *tiler, MVMJitExprTree *tree, MVMint32 node, MVMint32 alt) { /* Shortcircuit operators (ALL/ANY), are series of tests and conditional * jumps to a common label (i.e. basic block). Hence every block associated * with a child has two successors, namely the following block (block + 1) * or the shortcircuited block (alt). */ MVMJitTileList *list = tiler->list; MVMint32 i, nchild = tree->nodes[node+1]; for (i = 0; i < nchild; i++) { MVMint32 child = tree->nodes[node + 2 + i]; MVMint32 block = tiler->states[node + 2 + i].block; if (tree->nodes[child] == tree->nodes[node]) { /* in the case of nested shortcircuit operators, if they are equal * they shortcircuit identically, and so all children need to be * patched up in the same way */ patch_shortcircuit_blocks(tc, tiler, tree, child, alt); } else if (tree->nodes[child] == MVM_JIT_ALL || tree->nodes[child] == MVM_JIT_ANY) { /* unequal nested shortcircuit operators (ALL in ANY or ANY in ALL) * have the behaviour that shortcircuit to the next block or at the * end shortcircuit to the alternative block. E.g. ANY nested in ALL * must jump to the next block (continue tests) or continue testing; * after the last block, however, if we reach it we can shortcircuit * (in ANY, we only reach it, if nothing was true, in ALL, only if * everything was true, and hence one of the ANY is true) */ patch_shortcircuit_blocks(tc, tiler, tree, child, block + 1); } list->blocks[block].num_succ = 2; list->blocks[block].succ[0] = block + 1; list->blocks[block].succ[1] = alt; } } static void patch_basic_blocks(MVMThreadContext *tc, struct TreeTiler *tiler, MVMJitExprTree *tree, MVMint32 node) { /* Postorder assign the successors to blocks associated with nodes */ MVMJitTileList *list = tiler->list; MVMint32 test = tree->nodes[node+1]; if (tree->nodes[node] == MVM_JIT_WHEN) { MVMint32 pre = tiler->states[node + 1].block; MVMint32 post = tiler->states[node + 2].block; if (tree->nodes[test] == MVM_JIT_ALL) { patch_shortcircuit_blocks(tc, tiler, tree, test, post + 1); } else if (tree->nodes[test] == MVM_JIT_ANY) { /* ANY will start numbering the blocks and assigning (n+1, pre+1) to * each of them; pre+1 is the alternative successor. */ patch_shortcircuit_blocks(tc, tiler, tree, test, pre + 1); } list->blocks[pre].num_succ = 2; list->blocks[pre].succ[0] = pre + 1; list->blocks[pre].succ[1] = post + 1; list->blocks[post].num_succ = 1; list->blocks[post].succ[0] = post + 1; } else if (tree->nodes[node] == MVM_JIT_IF || tree->nodes[node] == MVM_JIT_IFV) { MVMint32 pre = tiler->states[node + 1].block; MVMint32 cond = tiler->states[node + 2].block; MVMint32 post = tiler->states[node + 3].block; if (tree->nodes[test] == MVM_JIT_ALL) { patch_shortcircuit_blocks(tc, tiler, tree, test, cond + 1); } else if (tree->nodes[test] == MVM_JIT_ANY) { patch_shortcircuit_blocks(tc, tiler, tree, test, pre + 1); } list->blocks[pre].num_succ = 2; list->blocks[pre].succ[0] = pre + 1; list->blocks[pre].succ[1] = cond + 1; list->blocks[cond].num_succ = 1; list->blocks[cond].succ[0] = post + 1; list->blocks[post].num_succ = 1; list->blocks[post].succ[0] = post + 1; } } /* Insert labels, compute basic block extents (eventually) */ static void build_blocks(MVMThreadContext *tc, MVMJitTreeTraverser *traverser, MVMJitExprTree *tree, MVMint32 node, MVMint32 i) { struct TreeTiler *tiler = traverser->data; MVMJitTileList *list = tiler->list; switch (tree->nodes[node]) { case MVM_JIT_WHEN: { MVMint32 when_label = tree->info[node].label; if (i == 0) { MVMint32 test = tree->nodes[node+1]; MVMint32 flag = tree->nodes[test]; /* First child is the test */ if (flag == MVM_JIT_ALL) { /* Do nothing, shortcircuit of ALL has skipped the conditional block if necessary */ MVMint32 last_child = test + tree->nodes[test+1] + 1; tiler->states[node+1].block = tiler->states[last_child].block; } else if (flag == MVM_JIT_ANY) { /* If ANY hasn't short-circuited into the conditional block, * it has failed, so insert an unconditional jump past it */ MVMint32 any_label = tree->info[test].label; MVMJitTile *branch = MVM_jit_tile_make(tc, tiler->compiler, MVM_jit_compile_branch, 1, 0, when_label); MVMJitTile *label = MVM_jit_tile_make(tc, tiler->compiler, MVM_jit_compile_label, 1, 0, any_label); branch->debug_name = "(branch :fail)"; label->debug_name = "(label :success)"; MVM_VECTOR_PUSH(list->items, branch); /* extends last block of ANY to include the unconditional branch */ extend_last_block(tc, tiler, node + 2 + i); MVM_VECTOR_PUSH(list->items, label); } else { /* Other tests require a conditional branch, but no label */ MVMJitTile *branch = MVM_jit_tile_make(tc, tiler->compiler, MVM_jit_compile_conditional_branch, 2, 0, MVM_jit_expr_op_negate_flag(tc, flag), when_label); branch->debug_name = "(branch :fail)"; MVM_VECTOR_PUSH(list->items, branch); start_basic_block(tc, tiler, node + 1); } } else { /* after child of WHEN, insert the label */ MVMJitTile *label = MVM_jit_tile_make(tc, tiler->compiler, MVM_jit_compile_label, 1, 0, when_label); label->debug_name = "(label :fail)"; start_basic_block(tc, tiler, node + 2); MVM_VECTOR_PUSH(list->items, label); } break; } case MVM_JIT_ALL: { MVMint32 test = tree->nodes[node+2+i]; MVMint32 flag = tree->nodes[test]; MVMint32 all_label = tree->info[node].label; if (flag == MVM_JIT_ALL) { /* Nested ALL short-circuits identically */ MVMint32 last_child = test + 1 + tree->nodes[test + 1]; tiler->states[node + 2 + i].block = tiler->states[last_child].block; } else if (flag == MVM_JIT_ANY) { /* If ANY reached it's end, that means it's false. So short-circuit out */ MVMint32 any_label = tree->info[test].label; MVMJitTile *branch = MVM_jit_tile_make(tc, tiler->compiler, MVM_jit_compile_branch, 1, 0, all_label); MVMJitTile *label = MVM_jit_tile_make(tc, tiler->compiler, MVM_jit_compile_label, 1, 0, any_label); branch->debug_name = "(branch :fail) # ALL"; label->debug_name = "(label :success) # ANY"; MVM_VECTOR_PUSH(list->items, branch); /* extends last block of ANY to include the unconditional branch */ extend_last_block(tc, tiler, node + 2 + i); /* And if ANY short-circuits we should continue the evaluation of ALL */ MVM_VECTOR_PUSH(list->items, label); } else { /* Flag should be negated (ALL = short-circiut unless condition)) */ MVMJitTile *branch = MVM_jit_tile_make(tc, tiler->compiler, MVM_jit_compile_conditional_branch, 2, 0, MVM_jit_expr_op_negate_flag(tc, flag), all_label); branch->debug_name = "(conditional-branch :fail)"; MVM_VECTOR_PUSH(list->items, branch); start_basic_block(tc, tiler, node + 2 + i); } break; } case MVM_JIT_ANY: { MVMint32 test = tree->nodes[node+2+i]; MVMint32 flag = tree->nodes[test]; MVMint32 any_label = tree->info[node].label; if (flag == MVM_JIT_ALL) { /* If ALL reached the end, it must have been succesful, and ANY's short-circuit behaviour implies we should branch out */ MVMint32 all_label = tree->info[test].label; MVMJitTile *branch = MVM_jit_tile_make(tc, tiler->compiler, MVM_jit_compile_branch, 1, 0, any_label); MVMJitTile *label = MVM_jit_tile_make(tc, tiler->compiler, MVM_jit_compile_label, 1, 0, all_label); branch->debug_name = "(branch :success) # ALL"; label->debug_name = "(label :fail) # ANY"; MVM_VECTOR_PUSH(list->items, branch); extend_last_block(tc, tiler, node + 2 + i); /* If not succesful, testing should continue (thus ALL must branch * into our ANY) */ MVM_VECTOR_PUSH(list->items, label); } else if (flag == MVM_JIT_ANY) { /* Nothing to do here, since nested ANY already short-circuits to our label */ MVMint32 last_child = test + 1 + tree->nodes[test + 1]; tiler->states[node + 2 + i].block = tiler->states[last_child].block; } else { /* Normal evaluation (ANY = short-circuit if condition) */ MVMJitTile *branch = MVM_jit_tile_make(tc, tiler->compiler, MVM_jit_compile_conditional_branch, 2, 0, flag, any_label); branch->debug_name = "(branch :success)"; MVM_VECTOR_PUSH(list->items, branch); start_basic_block(tc, tiler, node + 2 + i); } break; } case MVM_JIT_IF: case MVM_JIT_IFV: { MVMint32 left_label = tree->info[node].label; MVMint32 right_label = left_label + 1; if (i == 0) { /* after flag child */ MVMint32 test = tree->nodes[node+1]; MVMint32 flag = tree->nodes[test]; if (flag == MVM_JIT_ALL) { /* If we reach this code then ALL was true, hence we should * enter the left block, and do nothing */ MVMint32 last_child = test + 1 + tree->nodes[test + 1]; tiler->states[node + 1].block = tiler->states[last_child].block; } else if (flag == MVM_JIT_ANY) { /* We need the branch to the right block and the label for ANY * to jump to enter the left block */ MVMint32 any_label = tree->info[test].label; MVMJitTile *branch = MVM_jit_tile_make(tc, tiler->compiler, MVM_jit_compile_branch, 1, 0, left_label); MVMJitTile *label = MVM_jit_tile_make(tc, tiler->compiler, MVM_jit_compile_label, 1, 0, any_label); branch->debug_name = "(branch: fail)"; label->debug_name = "(label :success)"; MVM_VECTOR_PUSH(list->items, branch); extend_last_block(tc, tiler, node + 1); MVM_VECTOR_PUSH(list->items, label); } else { MVMJitTile *branch = MVM_jit_tile_make(tc, tiler->compiler, MVM_jit_compile_conditional_branch, 2, 0, MVM_jit_expr_op_negate_flag(tc, flag), left_label); branch->debug_name = "(conditional-branch: fail)"; MVM_VECTOR_PUSH(list->items, branch); start_basic_block(tc, tiler, node + 1); } } else if (i == 1) { /* between left and right conditional block */ MVMJitTile *branch = MVM_jit_tile_make(tc, tiler->compiler, MVM_jit_compile_branch, 1, 0, right_label); MVMJitTile *label = MVM_jit_tile_make(tc, tiler->compiler, MVM_jit_compile_label, 1, 0, left_label); branch->debug_name = "(branch :after)"; label->debug_name = "(label :fail)"; MVM_VECTOR_PUSH(list->items, branch); start_basic_block(tc, tiler, node + 2); MVM_VECTOR_PUSH(list->items, label); } else { /* after 'right' conditional block */ MVMJitTile *label = MVM_jit_tile_make(tc, tiler->compiler, MVM_jit_compile_label, 1, 0, right_label); label->debug_name = "(branch :after)"; start_basic_block(tc, tiler, node + 3); MVM_VECTOR_PUSH(list->items, label); } } default: break; } } static void build_tilelist(MVMThreadContext *tc, MVMJitTreeTraverser *traverser, MVMJitExprTree *tree, MVMint32 node) { struct TreeTiler *tiler = traverser->data; const MVMJitTileTemplate *template = tiler->states[node].template; MVMJitTile *tile; /* only need to add 'real' tiles; emit may be null for a definition */ if (template->expr == NULL) return; tile = MVM_jit_tile_make_from_template(tc, tiler->compiler, template, tree, node); MVM_VECTOR_PUSH(tiler->list->items, tile); /* count tne number of refs for ARGLIST */ if (tile->op == MVM_JIT_ARGLIST) { tiler->list->num_arglist_refs += tile->num_refs; } else if (tile->op == MVM_JIT_WHEN || tile->op == MVM_JIT_IF || tile->op == MVM_JIT_IFV) { /* NB: ALL and ANY also generate basic blocks, but their successors can * only be resolved after the conditional construct */ patch_basic_blocks(tc, tiler, tree, node); } else if (tile->op == MVM_JIT_GUARD && tile->args[1] != 0) { /* second arg is wrap after (and nonzero if required). Because guard is * a 'definition' tile, it's emit is usually NULL, so we can overwrite * it to make it a 'real' tile. */ tile->args[0] = tile->args[1]; tile->emit = MVM_jit_compile_guard; } } /* Create a tile from a template */ MVMJitTile * MVM_jit_tile_make_from_template(MVMThreadContext *tc, MVMJitCompiler *compiler, const MVMJitTileTemplate *template, MVMJitExprTree *tree, MVMint32 node) { MVMJitTile *tile; tile = MVM_spesh_alloc(tc, compiler->graph->sg, sizeof(MVMJitTile)); tile->emit = template->emit; tile->register_spec = template->register_spec; tile->node = node; tile->op = tree->nodes[node]; tile->size = tree->info[node].size; /* Assign tile arguments and compute the refering nodes */ switch (tile->op) { case MVM_JIT_IF: { tile->refs[0] = tree->nodes[node+2]; tile->refs[1] = tree->nodes[node+3]; tile->num_refs = 2; break; } case MVM_JIT_ARGLIST: { /* because arglist needs special-casing and because it will use more * than 8 (never mind 4) values, it won't fit into refs, so we're not * reading them here */ tile->num_refs = tree->nodes[node+1]; break; } case MVM_JIT_DO: { MVMint32 nchild = tree->nodes[node+1]; tile->refs[0] = tree->nodes[node+1+nchild]; tile->num_refs = 1; break; } default: { MVMint32 i, j, k, num_nodes, value_bitmap; MVMJitExprNode buffer[8]; num_nodes = MVM_jit_expr_tree_get_nodes(tc, tree, node, template->path, buffer); value_bitmap = template->value_bitmap; tile->num_refs = template->num_refs; j = 0; k = 0; /* splice out args from node refs */ for (i = 0; i < num_nodes; i++) { if (value_bitmap & 1) { tile->refs[j++] = buffer[i]; } else { tile->args[k++] = buffer[i]; } value_bitmap >>= 1; } break; } } tile->debug_name = template->expr; return tile; } MVMJitTileList * MVM_jit_tile_expr_tree(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitExprTree *tree) { MVMJitTreeTraverser traverser; MVMint32 i; struct TreeTiler tiler; MVM_VECTOR_INIT(tiler.states, tree->nodes_num); traverser.policy = MVM_JIT_TRAVERSER_ONCE; traverser.inorder = NULL; traverser.preorder = NULL; traverser.postorder = &tile_node; traverser.data = &tiler; MVM_jit_expr_tree_traverse(tc, tree, &traverser); /* 'pushdown' of tiles to roots */ for (i = 0; i < tree->roots_num; i++) { MVMint32 node = tree->roots[i]; assign_tile(tc, tree, &traverser, tree->roots[i], tiler.states[node].rule); } /* Create serial list of actual tiles which represent the final low-level code */ tiler.compiler = compiler; tiler.list = MVM_spesh_alloc(tc, compiler->graph->sg, sizeof(MVMJitTileList)); tiler.list->tree = tree; tiler.list->num_arglist_refs = 0; MVM_VECTOR_INIT(tiler.list->items, tree->nodes_num / 2); MVM_VECTOR_INIT(tiler.list->inserts, 0); MVM_VECTOR_INIT(tiler.list->blocks, 8); traverser.preorder = &select_tiles; traverser.inorder = &build_blocks; traverser.postorder = &build_tilelist; MVM_jit_expr_tree_traverse(tc, tree, &traverser); MVM_free(tiler.states); /* finish last list block */ { MVMint32 last_block = tiler.list->blocks_num++; tiler.list->blocks[last_block].end = tiler.list->items_num; tiler.list->blocks[last_block].num_succ = 0; } return tiler.list; } static int cmp_tile_insert(const void *p1, const void *p2) { const struct MVMJitTileInsert *a = p1, *b = p2; return a->position == b->position ? a->order - b->order : a->position - b->position; } void MVM_jit_tile_list_insert(MVMThreadContext *tc, MVMJitTileList *list, MVMJitTile *tile, MVMint32 position, MVMint32 order) { struct MVMJitTileInsert i = { position, order, tile }; MVM_VECTOR_PUSH(list->inserts, i); } void MVM_jit_tile_list_edit(MVMThreadContext *tc, MVMJitTileList *list) { MVMJitTile **worklist; MVMint32 i, j, k, n; if (list->inserts_num == 0) return; /* sort inserted tiles in ascending order */ qsort(list->inserts, list->inserts_num, sizeof(struct MVMJitTileInsert), cmp_tile_insert); /* create a new array for the tiles */ worklist = MVM_malloc((list->items_num + list->inserts_num) * sizeof(MVMJitTile*)); i = 0; /* items */ j = 0; /* inserts */ k = 0; /* output */ n = 0; /* block */ while (i < list->items_num) { while (j < list->inserts_num && list->inserts[j].position < i) { worklist[k++] = list->inserts[j++].tile; } if (list->blocks[n].end == i) { list->blocks[n++].end = k; list->blocks[n].start = k; } worklist[k++] = list->items[i++]; } /* insert all tiles after the last one, if any */ while (j < list->inserts_num) { worklist[k++] = list->inserts[j++].tile; } list->blocks[n].end = k; /* swap old and new list */ MVM_free(list->items); list->items = worklist; list->items_num = k; list->items_alloc = k; /* Cleanup edits buffer */ MVM_free(list->inserts); MVM_VECTOR_INIT(list->inserts, 0); } void MVM_jit_tile_list_destroy(MVMThreadContext *tc, MVMJitTileList *list) { MVM_free(list->items); MVM_free(list->inserts); MVM_free(list->blocks); } MoarVM-2018.03/src/jit/tile.h0000644000175000017510000000451613237701240015673 0ustar samanthasamanthastruct MVMJitTileTemplate { void (*emit)(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitTile *tile, MVMJitExprTree *tree); const char *path; const char *expr; MVMint32 left_sym; MVMint32 right_sym; MVMint32 num_refs; MVMint32 value_bitmap; MVMuint32 register_spec; }; struct MVMJitTile { void (*emit)(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitTile *tile, MVMJitExprTree *tree); MVMint32 node; MVMint32 op; MVMint32 num_refs; MVMint32 refs[4]; MVMJitExprNode args[4]; MVMint8 values[4]; MVMuint32 register_spec; MVMint8 size; const char *debug_name; }; struct MVMJitTileBB { /* first and last tile index of code */ MVMint32 start, end; /* up to two successors */ MVMint32 num_succ, succ[2]; }; /* A tile I'm planning to insert into the list */ struct MVMJitTileInsert { MVMint32 position; MVMint32 order; MVMJitTile *tile; }; /* A list of tiles representing a (part of a) routine */ struct MVMJitTileList { MVMJitExprTree *tree; MVM_VECTOR_DECL(MVMJitTile*, items); MVM_VECTOR_DECL(struct MVMJitTileInsert, inserts); MVM_VECTOR_DECL(struct MVMJitTileBB, blocks); /* TODO implement structures to mark basic blocks */ MVMint32 num_arglist_refs; }; MVMJitTile * MVM_jit_tile_make(MVMThreadContext *tc, MVMJitCompiler *compiler, void *emit, MVMint32 num_args, MVMint32 num_values, ...); MVMJitTile * MVM_jit_tile_make_from_template(MVMThreadContext *tc, MVMJitCompiler *compiler, const MVMJitTileTemplate *template, MVMJitExprTree *tree, MVMint32 node); MVMJitTileList * MVM_jit_tile_expr_tree(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitExprTree *tree); void MVM_jit_tile_list_insert(MVMThreadContext *tc, MVMJitTileList *list, MVMJitTile *tile, MVMint32 position, MVMint32 order); void MVM_jit_tile_list_edit(MVMThreadContext *tc, MVMJitTileList *list); void MVM_jit_tile_list_destroy(MVMThreadContext *tc, MVMJitTileList *list); #define MVM_JIT_TILE_YIELDS_VALUE(t) ((t)->register_spec & 1) #define MVM_JIT_TILE_DECL(name) \ void MVM_jit_tile_ ## name (MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitTile *tile, MVMJitExprTree *tree) MoarVM-2018.03/src/jit/unsafe.expr0000644000175000017510000000554313243116442016750 0ustar samanthasamantha# Difficult stuff, that hasn't been tested sufficiently adequately to support (template: getlexstatic_o (let: (($found (call (^func &MVM_frame_find_lexical_by_name) (arglist (carg (tc) ptr) (carg $1 ptr) (carg (const ("E MVM_reg_obj) int_sz) int)) ptr_sz))) (if (nz $found) (do (when (nz (call (^func &MVM_spesh_log_is_logging) (arglist (carg (tc) ptr)) int)) (callv (^func &MVM_spesh_log_static) (arglist (carg (tc) ptr) (carg (^getf $found MVMRegister o) ptr)))) (^getf $found MVMRegister o)) (^vmnull)))) (template: getlex_no (let: (($res (call (^func &MVM_frame_find_lexical_by_name) (arglist (carg (tc) ptr) (carg (^cu_string $1) ptr) (carg (const ("E MVM_reg_obj) int_sz) int)) ptr))) (if (nz $res) (load $res ptr_sz) $res))) (template: return (do 3 (callv (^func &MVM_args_assert_void_return_ok) (arglist (carg (tc) ptr) (carg (const 0 int_sz) int))) (callv (^func &MVM_frame_try_return) (arglist 1 (carg (tc) ptr))) (^exit))) (template: return_o (do 3 (call (^func &MVM_args_set_result_obj) (arglist (carg (tc) ptr) (carg $0 ptr) (carg (const 0 int_sz) int)) void) (call (^func &MVM_frame_try_return) (arglist 1 (carg (tc) ptr)) void) (^exit))) (template: setdispatcher (^setf (tc) MVMThreadContext cur_dispatcher $0)) (template: takedispatcher (let: (($cur (^getf (tc) MVMThreadContext cur_dispatcher))) (do (^setf (tc) MVMThreadContext cur_dispatcher (const 0 ptr_sz)) (copy $cur)))) (template: getcode (let: (($arr (^getf (cu) MVMCompUnit body.coderefs))) (load (idx $arr $1 ptr_sz) ptr_sz))) (template: callercode (let: (($caller (^getf (frame) MVMFrame caller))) (if (nz $caller) (^getf $caller MVMFrame code_ref) (const 0 ptr_sz)))) (macro: ^throw_adhoc (,msg) (die (^func &MVM_exception_throw_adhoc) (arglist 2 (carg (tc) ptr) (carg (const ,msg ptr_sz) ptr)))) (template: ctxcode (do (when (any (^is_type_obj $1) (ne (^getf (^repr $1) MVMREPROps ID) (const ("E MVM_REPR_ID_MVMContext) (&SIZEOF_MEMBER MVMREPROps ID)))) (^throw_adhoc (&MSG ctxcode needs an MVMContext))) (^getf (^getf $1 MVMContext body.context) MVMFrame code_ref))) # These properly yield a flag, not a register value. # I maybe want to add a flag-to-register op MoarVM-2018.03/src/jit/x64/arch.c0000644000175000017510000000604413237701240016265 0ustar samanthasamantha#include "moar.h" #include "jit/internal.h" #define MVM_JIT_PLATFORM_POSIX 1 #define MVM_JIT_PLATFORM_WIN32 2 #if MVM_JIT_PLATFORM == MVM_JIT_PLATFORM_POSIX static const MVMint8 arg_gpr[] = { MVM_JIT_REG(RDI), MVM_JIT_REG(RSI), MVM_JIT_REG(RDX), MVM_JIT_REG(RCX), MVM_JIT_REG(R8), MVM_JIT_REG(R9), }; static const MVMint8 arg_fpr[] = { MVM_JIT_REG(XMM0), MVM_JIT_REG(XMM1), MVM_JIT_REG(XMM2), MVM_JIT_REG(XMM3), MVM_JIT_REG(XMM4), MVM_JIT_REG(XMM5), MVM_JIT_REG(XMM6), MVM_JIT_REG(XMM7), }; void MVM_jit_arch_storage_for_arglist(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitExprTree *tree, MVMint32 arglist_node, MVMJitStorageRef *storage) { MVMint32 narg = tree->nodes[arglist_node + 1]; MVMint32 i, ngpr = 0, nfpr = 0, nstack = 0; for (i = 0; i < narg; i++) { MVMint32 carg_node = tree->nodes[arglist_node + 2 + i]; MVMint32 carg_type = tree->nodes[carg_node + 2]; /* posix stores numeric args in floating point registers, everything * else in general purpose registers, until it doesn't fit anymore, in * which case it stores them on the stack */ if (carg_type == MVM_JIT_NUM && nfpr < sizeof(arg_fpr)) { storage[i]._cls = MVM_JIT_STORAGE_FPR; storage[i]._pos = arg_fpr[nfpr++]; } else if (ngpr < sizeof(arg_gpr)) { storage[i]._cls = MVM_JIT_STORAGE_GPR; storage[i]._pos = arg_gpr[ngpr++]; } else { storage[i]._cls = MVM_JIT_STORAGE_STACK; storage[i]._pos = 8 * nstack++; } } } #elif MVM_JIT_PLATFORM == MVM_JIT_PLATFORM_WIN32 static const MVMint8 arg_gpr[] = { MVM_JIT_REG(RCX), MVM_JIT_REG(RDX), MVM_JIT_REG(R8), MVM_JIT_REG(R9), }; static const MVMint8 arg_fpr[] = { MVM_JIT_REG(XMM0), MVM_JIT_REG(XMM1), MVM_JIT_REG(XMM2), MVM_JIT_REG(XMM3), }; void MVM_jit_arch_storage_for_arglist(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitExprTree *tree, MVMint32 arglist_node, MVMJitStorageRef *storage) { MVMint32 i, narg = tree->nodes[arglist_node + 1]; for (i = 0; i < MIN(narg, 4); i++) { MVMint32 carg_node = tree->nodes[arglist_node + 2 + i]; MVMint32 carg_type = tree->nodes[carg_node + 2]; if (carg_type == MVM_JIT_NUM) { storage[i]._cls = MVM_JIT_STORAGE_FPR; storage[i]._pos = arg_fpr[i]; } else { storage[i]._cls = MVM_JIT_STORAGE_GPR; storage[i]._pos = arg_gpr[i]; } } /* rest of arguments is passed on stack. first 4 quadwords (32 bytes) are * reserved for first 4 args, hence we start counting from 4 upwards. * See https://msdn.microsoft.com/en-us/library/ms235286.aspx */ for (; i < narg; i++) { storage[i]._cls = MVM_JIT_STORAGE_STACK; storage[i]._pos = i * 8; } } #else #error "Unknown platform " MVM_JIT_PLATFORM #endif MoarVM-2018.03/src/jit/x64/arch.h0000644000175000017510000000427013237701240016271 0ustar samanthasamantha #define MVM_JIT_ARCH_GPR(_) \ _(RAX) __COMMA__ \ _(RCX) __COMMA__ \ _(RDX) __COMMA__ \ _(RBX) __COMMA__ \ _(RSP) __COMMA__ \ _(RBP) __COMMA__ \ _(RSI) __COMMA__ \ _(RDI) __COMMA__ \ _(R8) __COMMA__ \ _(R9) __COMMA__ \ _(R10) __COMMA__ \ _(R11) __COMMA__ \ _(R12) __COMMA__ \ _(R13) __COMMA__ \ _(R14) __COMMA__ \ _(R15) #define MVM_JIT_ARCH_NUM(_) \ _(XMM0) __COMMA__ \ _(XMM1) __COMMA__ \ _(XMM2) __COMMA__ \ _(XMM3) __COMMA__ \ _(XMM4) __COMMA__ \ _(XMM5) __COMMA__ \ _(XMM6) __COMMA__ \ _(XMM7) #if MVM_JIT_PLATFORM == MVM_JIT_PLATFORM_POSIX /* Define the GPR set usable for general calculations. RAX is reserved for * internal use by tiles */ #define MVM_JIT_ARCH_AVAILABLE_GPR(_) \ _(RCX) __COMMA__ \ _(RDX) __COMMA__ \ _(RSI) __COMMA__ \ _(RDI) __COMMA__ \ _(R8) __COMMA__ \ _(R9) __COMMA__ \ _(R10) __COMMA__ \ _(R11) /* define set of non-volatile regsiters */ #define MVM_JIT_ARCH_NONVOLATILE_GPR(_) \ _(RBX) __COMMA__ \ _(RSP) __COMMA__ \ _(RBP) __COMMA__ \ _(R12) __COMMA__ \ _(R13) __COMMA__ \ _(R14) __COMMA__ \ _(R15) /* GPR used for arguments */ #define MVM_JIT_ARCH_ARG_GPR(_) \ _(RDI) __COMMA__ \ _(RSI) __COMMA__ \ _(RDX) __COMMA__ \ _(RCX) __COMMA__ \ _(R8) __COMMA__ \ _(R9) /* SSE used for arguments */ #define MVM_JIT_ARCH_ARG_NUM(_) \ MVM_JIT_ARCH_NUM(_) #else /* Microsoft why you give us so few registers :-( */ #define MVM_JIT_ARCH_AVAILABLE_GPR(_) \ _(RCX) __COMMA__ \ _(RDX) __COMMA__ \ _(R8) __COMMA__ \ _(R9) __COMMA__ \ _(R10) __COMMA__ \ _(R11) #define MVM_JIT_ARCH_NONVOLATILE_GPR(_) \ _(RBX) __COMMA__ \ _(RSP) __COMMA__ \ _(RBP) __COMMA__ \ _(RSI) __COMMA__ \ _(RDI) __COMMA__ \ _(R12) __COMMA__ \ _(R13) __COMMA__ \ _(R14) __COMMA__ \ _(R15) #define MVM_JIT_ARCH_ARG_GPR(_) \ _(RCX) __COMMA__ \ _(RDX) __COMMA__ \ _(R8) __COMMA__ \ _(R9) #define MVM_JIT_ARCH_ARG_NUM(_) \ _(XMM0) __COMMA__ \ _(XMM1) __COMMA__ \ _(XMM2) __COMMA__ \ _(XMM3) #endif /* Frame declarations */ #define MVM_JIT_ARCH_NUM_GPR 16 MoarVM-2018.03/src/jit/x64/emit.dasc0000644000175000017510000025761113242626641017015 0ustar samanthasamantha/* -*-C-*- */ #include "moar.h" #include "jit/internal.h" #include "dasm_x86.h" #ifdef _MSC_VER #pragma warning( disable : 4129 ) #endif /** * CONVENTIONS * Much of this file contains snippets of assembly code, which are concatenated * at runtime in order to form a single executable routine. It is essential for * the correctness of the result that each of the snippets behaves * nicely. Because you can't be expected to know what that is, it is documented * here. * REGISTERS: * Register and calling conventions differ between POSIX and windows * systems. The registers rax, rcx, rdx, r8, r9, r10 and r11 are caller-saved, * meaning that you are free to overwrrite them, and functions you may call are * free to do thesame. Hence you should save their values on stack, if you wish * to keep them after calling. In contrast, rbx, rsp, rbp, and r12-r15 are * callee-saved, meaning that their values before entering and after returning * from a function must be the same. POSIX also makes rdi and rsi caller-saved, * windows makes them callee-saved. For this reason we avoid using them. The * first 4 (windows) or 6 (POSIX) function call arguments are placed in * registers. These registers sets are not the same between windows and POSIX, * but they're always caller-saved. * To deal with the ambiguity, register names have been aliased. * + RV stands for 'return value', and is aliased to rax * + TMP1-6 are the 6 shared caller-saved registers * + ARG1-4 are (different) aliases for argument registers * + TC, CU, WORK are registers that hold interpreter variables; these are callee- * saved registers set up at entry and restored at exit * + TMP5 (r10) is also aliased as FUNCTION; it never conflicts with an argument * register, and neither does TMP6. * + The suffixes d, w, and b stand for the 4, 2, and 1 byte-width value of the * registers. * Note that the current convention for function calls is to load the function * pointer as a 64 bit value in a register from the machine code, and call on * that register. This is not ideal, but call doesn't natively take 64 bit * values, and it is neccesary to ensure that the function lives within 32 bits * distance from the function otherwise. Other methods are being considered. * LABELS: * Don't use dynamic labels in this code, unless they have been passed to you * from outside. Dynamic labels need to be allocated and not conflict, hence * just picking one is typically unsafe. You are allowed to use in a snippet * the local labels 1-5; the labels 6-9 are reserved by special constructs like * THROWISH_PRE and INVOKISH. * WRITE BARRIERS: * Use of write barriers is tricky, because they may involve a function call, and * that may or may not mean you have to store your temporaries on the stack. * Hence, a write barrier (MVM_ASSIGN_REF) is split into two parts: * + check_wb (root, value, label) * + hit_wb (root) * You should have the label parameter point somewhere after hit_wb, and save * and restore your temporaries around the hib_wb. **/ |.arch x64 |.actionlist actions |.section code, data |.globals MVM_JIT_LABEL_ /* type declarations */ |.type REGISTER, MVMRegister |.type FRAME, MVMFrame |.type ARGCTX, MVMArgProcContext |.type CALLSITEPTR, MVMCallsite* |.type CAPTURE, MVMCallCapture |.type CAPTUREBODY, MVMCallCaptureBody |.type ARGPROCCONTEXT, MVMArgProcContext |.type STATICFRAME, MVMStaticFrame |.type P6OPAQUE, MVMP6opaque |.type P6OBODY, MVMP6opaqueBody |.type MVMITER, MVMIter |.type MVMINSTANCE, MVMInstance |.type MVMACTIVEHANDLERS, MVMActiveHandler |.type OBJECT, MVMObject |.type STOOGE, MVMObjectStooge |.type VMARRAY, MVMArray |.type COLLECTABLE, MVMCollectable |.type STABLE, MVMSTable |.type REPR, MVMREPROps |.type STRING, MVMString* |.type OBJECTPTR, MVMObject* |.type CONTAINERSPEC, MVMContainerSpec |.type STORAGESPEC, MVMStorageSpec |.type HLLCONFIG, MVMHLLConfig; |.type SCREFBODY, MVMSerializationContextBody |.type NFGSYNTH, MVMNFGSynthetic |.type CODE, MVMCode |.type U8, MVMuint8 |.type U16, MVMuint16 |.type U32, MVMuint32 |.type U64, MVMuint64 /* Static allocation of relevant types to registers. I pick * callee-save registers for efficiency. It is likely we'll be calling * quite a C functions, and this saves us the trouble of storing * them. Moreover, C compilers preferentially do not use callee-saved * registers, and so in most cases, these won't be touched at all. */ |.type TC, MVMThreadContext, r14 /* Alternative base pointer. I'll be using this often, so picking rbx * here rather than the extended registers will lead to smaller * bytecode */ |.type WORK, MVMRegister, rbx |.type CU, MVMCompUnit, r13 const MVMint32 MVM_jit_support(void) { #ifdef __i386__ /* Usually, this file should only be compiled only on a amd64 platform; but when compiling 'fat' or 'universal' binaries, we may compile it for other platform. In this case we use the runtime check to disable the JIT */ return 0; #else return 1; #endif } const unsigned char * MVM_jit_actions(void) { return actions; } const unsigned int MVM_jit_num_globals(void) { return MVM_JIT_LABEL__MAX; } /* C Call argument registers */ |.if WIN32 |.define ARG1, rcx |.define ARG2, rdx |.define ARG3, r8 |.define ARG4, r9 |.else |.define ARG1, rdi |.define ARG2, rsi |.define ARG3, rdx |.define ARG4, rcx |.define ARG5, r8 |.define ARG6, r9 |.endif /* C call argument registers for floating point */ |.if WIN32 |.define ARG1F, xmm0 |.define ARG2F, xmm1 |.define ARG3F, xmm2 |.define ARG4F, xmm3 |.else |.define ARG1F, xmm0 |.define ARG2F, xmm1 |.define ARG3F, xmm2 |.define ARG4F, xmm3 |.define ARG5F, xmm4 |.define ARG6F, xmm5 |.define ARG7F, xmm6 |.define ARG8F, xmm7 |.endif /* Special register for the function to be invoked * (chosen because it isn't involved in argument passing * and volatile) */ |.define FUNCTION, r10 /* all-purpose temporary registers */ |.define TMP1, rcx |.define TMP2, rdx |.define TMP3, r8 |.define TMP4, r9 |.define TMP5, r10 |.define TMP6, r11 /* same, but 32 bits wide */ |.define TMP1d, ecx |.define TMP2d, edx |.define TMP3d, r8d |.define TMP4d, r9d |.define TMP5d, r10d |.define TMP6d, r11d /* and 16 bits wide */ |.define TMP1w, cx |.define TMP2w, dx |.define TMP3w, r8w |.define TMP4w, r9w |.define TMP5w, r10w |.define TMP6w, r11w /* and 8 bits for good measure */ |.define TMP1b, cl |.define TMP2b, dl |.define TMP3b, r8b |.define TMP4b, r9b |.define TMP5b, r10b |.define TMP6b, r11b /* return value */ |.define RV, rax |.define RVd, eax |.define RVF, xmm0 |.macro callp, funcptr |.data |5: |.dword (MVMuint32)((uintptr_t)(funcptr)), (MVMuint32)((uintptr_t)(funcptr) >> 32); |.code | call qword [<5]; |.endmacro |.macro check_wb, root, ref, lbl; | test word COLLECTABLE:root->flags, MVM_CF_SECOND_GEN; | jz lbl; | test ref, ref; | jz lbl; | test word COLLECTABLE:ref->flags, MVM_CF_SECOND_GEN; | jnz lbl; |.endmacro; |.macro hit_wb, obj | mov ARG2, obj; | mov ARG1, TC; | callp &MVM_gc_write_barrier_hit; |.endmacro |.macro get_spesh_slot, reg, idx; | mov reg, TC->cur_frame; | mov reg, FRAME:reg->effective_spesh_slots; | mov reg, OBJECTPTR:reg[idx]; |.endmacro |.macro get_vmnull, reg | mov reg, TC->instance; | mov reg, MVMINSTANCE:reg->VMNull; |.endmacro |.macro get_cur_op, reg | mov reg, TC->interp_cur_op | mov reg, [reg] |.endmacro |.macro get_string, reg, idx || MVM_cu_ensure_string_decoded(tc, jg->sg->sf->body.cu, idx); | mov reg, CU->body.strings; | mov reg, STRING:reg[idx]; |.endmacro |.macro is_type_object, reg | test word OBJECT:reg->header.flags, MVM_CF_TYPE_OBJECT |.endmacro |.macro gc_sync_point | cmp qword TC->gc_status, 0; | je >1; | mov ARG1, TC; | callp &MVM_gc_enter_from_interrupt; |1: |.endmacro |.macro throw_adhoc, msg | mov ARG1, TC; | mov64 ARG2, (uintptr_t)(msg); | callp &MVM_exception_throw_adhoc; |.endmacro |.define FRAME_NR, dword [rbp-0x20] /* A function prologue is always the same in x86 / x64, because * we do not provide variable arguments, instead arguments are provided * via a frame. All JIT entry points receive a prologue. */ void MVM_jit_emit_prologue(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitGraph *jg) { |.code /* Setup stack */ | push rbp; // nb, this aligns the stack to 16 bytes again | mov rbp, rsp; /* allocate stack space: 0x100 bytes = 256 bytes * * layout: [ a: 0x20 | b: 0x40 | c: 0xa0 | d: 0x20 ] * a: space for 4 callee-save registers * b: small scratch space * c: space for stack arguments to c calls * d: reserve space for GPR registers to c calls (win64) or more space for * stack arguments (posix) */ | sub rsp, 0x100; /* save callee-save registers */ | mov [rbp-0x8], TC; | mov [rbp-0x10], CU; | mov [rbp-0x18], WORK; /* store the current frame number for cheap comparisons */ | mov TMP6d, dword TC:ARG1->current_frame_nr; | mov FRAME_NR, TMP6d; /* setup special frame variables */ | mov TC, ARG1; | mov CU, ARG2; | mov TMP6, TC->cur_frame; | mov WORK, FRAME:TMP6->work; /* ARG3 contains our 'entry label' */ | jmp ARG3 } /* And a function epilogue is also always the same */ void MVM_jit_emit_epilogue(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitGraph *jg) { | ->exit: /* restore callee-save registers */ | mov TC, [rbp-0x8]; | mov CU, [rbp-0x10]; | mov WORK, [rbp-0x18]; /* Restore stack */ | mov rsp, rbp; | pop rbp; | ret; } static MVMuint64 try_emit_gen2_ref(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitGraph *jg, MVMObject *obj, MVMint16 reg) { if (!(obj->header.flags & MVM_CF_SECOND_GEN)) return 0; | mov64 TMP1, (uintptr_t)obj; | mov WORK[reg], TMP1; return 1; } static MVMint64 fits_in_32_bit(MVMint64 number) { /* Used to determine if a 64 bit integer can be safely used as a * 32 bit constant for immediate mode access */ return (number >= INT32_MIN) && (number <= INT32_MAX); } /* compile per instruction, can't really do any better yet */ void MVM_jit_emit_primitive(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitGraph *jg, MVMJitPrimitive * prim) { MVMSpeshIns *ins = prim->ins; MVMuint16 op = ins->info->opcode; MVM_jit_log(tc, "emit opcode: <%s>\n", ins->info->name); /* Quite a few of these opcodes are copies. Ultimately, I want to * move copies to their own node (MVMJitCopy or such), and reduce * the number of copies (and thereby increase the efficiency), but * currently that isn't really feasible. */ switch (op) { case MVM_OP_const_i64_16: case MVM_OP_const_i64_32: { MVMint32 reg = ins->operands[0].reg.orig; /* Upgrade to 64 bit */ MVMint64 val = (op == MVM_OP_const_i64_16 ? (MVMint64)ins->operands[1].lit_i16 : (MVMint64)ins->operands[1].lit_i32); | mov qword WORK[reg], val; break; } case MVM_OP_const_i64: { MVMint32 reg = ins->operands[0].reg.orig; MVMint64 val = ins->operands[1].lit_i64; | mov64 TMP1, val; | mov WORK[reg], TMP1; break; } case MVM_OP_const_n64: { MVMint16 reg = ins->operands[0].reg.orig; MVMint64 valbytes = ins->operands[1].lit_i64; MVM_jit_log(tc, "store const %f\n", ins->operands[1].lit_n64); | mov64 TMP1, valbytes; | mov WORK[reg], TMP1; break; } case MVM_OP_inf: case MVM_OP_neginf: case MVM_OP_nan: { MVMint16 reg = ins->operands[0].reg.orig; MVMRegister tmp; if (op == MVM_OP_nan) tmp.n64 = MVM_num_nan(tc); else if (op == MVM_OP_inf) tmp.n64 = MVM_num_posinf(tc); else if (op == MVM_OP_neginf) tmp.n64 = MVM_num_neginf(tc); | mov64 TMP1, tmp.i64; | mov WORK[reg], TMP1; break; } case MVM_OP_const_s: { MVMint16 reg = ins->operands[0].reg.orig; MVMuint32 idx = ins->operands[1].lit_str_idx; MVMStaticFrame *sf = jg->sg->sf; MVMString * s = MVM_cu_string(tc, sf->body.cu, idx); if (!try_emit_gen2_ref(tc, compiler, jg, (MVMObject*)s, reg)) { | get_string TMP1, idx; | mov WORK[reg], TMP1; } break; } case MVM_OP_null: { MVMint16 reg = ins->operands[0].reg.orig; | get_vmnull TMP1; | mov WORK[reg], TMP1; break; } case MVM_OP_getwhat: case MVM_OP_getwho: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; | mov TMP1, WORK[obj]; | mov TMP1, OBJECT:TMP1->st; if (op == MVM_OP_getwho) { | mov TMP1, STABLE:TMP1->WHO; | get_vmnull TMP2; | test TMP1, TMP1; | cmovz TMP1, TMP2; } else { | mov TMP1, STABLE:TMP1->WHAT; } | mov WORK[dst], TMP1; break; } case MVM_OP_getlex: case MVM_OP_sp_getlex_o: case MVM_OP_sp_getlex_ins: { MVMuint16 *lexical_types; MVMStaticFrame * sf = jg->sg->sf; MVMint16 dst = ins->operands[0].reg.orig; MVMint16 idx = ins->operands[1].lex.idx; MVMint16 out = ins->operands[1].lex.outers; MVMint16 i; | mov TMP6, TC->cur_frame; for (i = 0; i < out; i++) { /* I'm going to skip compiling the check whether the outer * node really exists, because if the code has run N times * correctly, then the outer frame must have existed then, * and since this chain is static, it should still exist * now. If it doesn't exist, that means we crash. * * NB: inlining /might/ make this all wrong! But, if that * happens, the interpreter will panic even without JIT */ | mov TMP6, FRAME:TMP6->outer; sf = sf->body.outer; } /* get array of lexicals */ | mov TMP5, FRAME:TMP6->env; /* read value */ | mov TMP5, REGISTER:TMP5[idx]; /* it seems that if at runtime, if the outer frame has been inlined, * this /could/ be wrong. But if that is so, the interpreted instruction * would also be wrong, because it'd refer to the wrong lexical. */ lexical_types = (!out && jg->sg->lexical_types ? jg->sg->lexical_types : sf->body.lexical_types); MVM_jit_log(tc, "Lexical type of register: %d\n", lexical_types[idx]); if (lexical_types[idx] == MVM_reg_obj) { MVM_jit_log(tc, "Emit lex vifivy check\n"); /* if it is zero, check if we need to auto-vivify */ | test TMP5, TMP5; | jnz >1; /* setup args */ | mov ARG1, TC; | mov ARG2, TMP6; | mov ARG3, idx; | callp &MVM_frame_vivify_lexical; /* use return value for the result */ | mov TMP5, RV; |1: } /* store the value */ | mov WORK[dst], TMP5; break; } case MVM_OP_sp_getlexvia_o: case MVM_OP_sp_getlexvia_ins: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 idx = ins->operands[1].lit_ui16; MVMint16 out = ins->operands[2].lit_ui16; MVMint16 via = ins->operands[3].reg.orig; MVMint16 i; /* Resolve the frame. */ | mov TMP6, WORK[via]; | mov TMP6, CODE:TMP6->body.outer; for (i = 1; i < out; i++) /* From 1 as we are already at outer */ | mov TMP6, FRAME:TMP6->outer; /* get array of lexicals */ | mov TMP5, FRAME:TMP6->env; /* read value */ | mov TMP5, REGISTER:TMP5[idx]; if (op == MVM_OP_sp_getlexvia_o) { MVM_jit_log(tc, "Emit lex vifivy check for via code-ref lookup\n"); /* if it is zero, check if we need to auto-vivify */ | test TMP5, TMP5; | jnz >1; /* setup args */ | mov ARG1, TC; | mov ARG2, TMP6; | mov ARG3, idx; | callp &MVM_frame_vivify_lexical; /* use return value for the result */ | mov TMP5, RV; |1: } /* store the value */ | mov WORK[dst], TMP5; break; } case MVM_OP_getlex_no: case MVM_OP_sp_getlex_no: { MVMint16 dst = ins->operands[0].reg.orig; MVMuint32 idx = ins->operands[1].lit_str_idx; | mov ARG1, TC; | get_string ARG2, idx; | mov ARG3, MVM_reg_obj; | callp &MVM_frame_find_lexical_by_name; | test RV, RV; | jz >1; | mov RV, [RV]; | mov WORK[dst], RV; | jmp >2; |1: | get_vmnull TMP3; | mov WORK[dst], TMP3; |2: break; } case MVM_OP_bindlex: { MVMuint16 *lexical_types; MVMStaticFrame *sf = jg->sg->sf; MVMint16 idx = ins->operands[0].lex.idx; MVMint16 out = ins->operands[0].lex.outers; MVMint16 src = ins->operands[1].reg.orig; MVMint16 i; | mov TMP1, TC->cur_frame; for (i = 0; i < out; i++) { | mov TMP1, FRAME:TMP1->outer; sf = sf->body.outer; } lexical_types = (!out && jg->sg->lexical_types ? jg->sg->lexical_types : sf->body.lexical_types); | mov TMP2, FRAME:TMP1->env; | mov TMP3, WORK[src]; | mov REGISTER:TMP2[idx], TMP3; if (lexical_types[idx] == MVM_reg_obj || lexical_types[idx] == MVM_reg_str) { | check_wb TMP1, TMP3, >2; | hit_wb TMP1; |2: } break; } case MVM_OP_getarg_o: case MVM_OP_getarg_n: case MVM_OP_getarg_s: case MVM_OP_getarg_i: { MVMint32 reg = ins->operands[0].reg.orig; MVMuint16 idx = ins->operands[1].callsite_idx; | mov TMP1, TC->cur_frame; | mov TMP1, FRAME:TMP1->args; | mov TMP1, REGISTER:TMP1[idx]; | mov WORK[reg], TMP1; break; } case MVM_OP_sp_getarg_o: case MVM_OP_sp_getarg_n: case MVM_OP_sp_getarg_s: case MVM_OP_sp_getarg_i: { MVMint32 reg = ins->operands[0].reg.orig; MVMuint16 idx = ins->operands[1].callsite_idx; | mov TMP1, TC->cur_frame; | mov TMP1, FRAME:TMP1->params.args; | mov TMP1, REGISTER:TMP1[idx]; | mov WORK[reg], TMP1; break; } case MVM_OP_sp_p6oget_i: case MVM_OP_sp_p6oget_n: case MVM_OP_sp_p6oget_s: case MVM_OP_sp_p6oget_o: case MVM_OP_sp_p6ogetvc_o: case MVM_OP_sp_p6ogetvt_o: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMint16 offset = ins->operands[2].lit_i16; MVMint16 body = offsetof(MVMP6opaque, body); /* load address and object */ | mov TMP1, WORK[obj]; | lea TMP2, [TMP1 + (offset + body)]; | mov TMP4, P6OPAQUE:TMP1->body.replaced; | lea TMP5, [TMP4 + offset]; | test TMP4, TMP4; | cmovnz TMP2, TMP5; /* TMP2 now contains address of item */ if (op == MVM_OP_sp_p6oget_o) { | mov TMP3, [TMP2]; | test TMP3, TMP3; /* Check if object doesn't point to NULL */ | jnz >3; /* Otherwise load VMNull */ | get_vmnull TMP3; |3: } else if (op == MVM_OP_sp_p6ogetvt_o) { /* vivify as type object */ MVMint16 spesh_idx = ins->operands[3].lit_i16; | mov TMP3, [TMP2]; /* check for null */ | test TMP3, TMP3; | jnz >4; /* if null, vivify as type object from spesh slot */ | get_spesh_slot TMP3, spesh_idx; /* need to hit write barrier? */ | check_wb TMP1, TMP3, >3; | mov qword [rbp-0x28], TMP2; // address | mov qword [rbp-0x30], TMP3; // value | hit_wb WORK[obj]; // write barrier for header | mov TMP3, qword [rbp-0x30]; | mov TMP2, qword [rbp-0x28]; |3: /* store vivified type value in memory location */ | mov qword [TMP2], TMP3; |4: } else if (op == MVM_OP_sp_p6ogetvc_o) { MVMint16 spesh_idx = ins->operands[3].lit_i16; | mov TMP3, [TMP2]; | test TMP3, TMP3; | jnz >4; /* vivify as clone */ | mov ARG1, TC; | get_spesh_slot ARG2, spesh_idx; | callp &MVM_repr_clone; | mov TMP3, RV; /* reload object and address */ | mov TMP1, WORK[obj]; | lea TMP2, [TMP1 + (offset + body)]; | mov TMP4, P6OPAQUE:TMP1->body.replaced; | lea TMP5, [TMP4 + offset]; | test TMP4, TMP4; | cmovnz TMP2, TMP5; /* assign with write barrier */ | check_wb TMP1, TMP3, >3; | mov qword [rbp-0x28], TMP2; // address | mov qword [rbp-0x30], TMP3; // value | hit_wb WORK[obj]; // write barrier for header | mov TMP3, qword [rbp-0x30]; | mov TMP2, qword [rbp-0x28]; |3: | mov qword [TMP2], TMP3; /* done */ |4: } else { /* the regular case */ | mov TMP3, [TMP2]; } /* store in local register */ | mov WORK[dst], TMP3; break; } case MVM_OP_sp_bind_i64: case MVM_OP_sp_bind_n: case MVM_OP_sp_bind_s: case MVM_OP_sp_bind_o: { MVMint16 obj = ins->operands[0].reg.orig; MVMint16 offset = ins->operands[1].lit_i16; MVMint16 val = ins->operands[2].reg.orig; | mov TMP1, WORK[obj]; // object | mov TMP2, WORK[val]; // value if (op == MVM_OP_sp_bind_o || op == MVM_OP_sp_bind_s) { /* check if we should hit write barrier */ | check_wb TMP1, TMP2, >2; /* note: it is uneccesary to store pointers, because they can just be loaded from memory */ | hit_wb WORK[obj]; | mov TMP1, aword WORK[obj]; // reload object | mov TMP2, aword WORK[val]; // reload value |2: // done } | mov qword [TMP1+offset], TMP2; // store value into body break; } case MVM_OP_sp_get_i64: case MVM_OP_sp_get_n: case MVM_OP_sp_get_s: case MVM_OP_sp_get_o: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMint16 offset = ins->operands[2].lit_i16; | mov TMP1, WORK[obj]; // object | mov TMP2, qword [TMP1+offset]; // get value from body | mov WORK[dst], TMP2; break; } case MVM_OP_sp_deref_bind_i64: case MVM_OP_sp_deref_bind_n: { MVMint16 obj = ins->operands[0].reg.orig; MVMint16 val = ins->operands[1].reg.orig; MVMint16 offset = ins->operands[2].lit_i16; | mov TMP1, WORK[obj]; // object | mov TMP2, WORK[val]; // value | mov TMP1, qword [TMP1+offset]; // find address of target | mov qword [TMP1], TMP2; break; } case MVM_OP_sp_deref_get_i64: case MVM_OP_sp_deref_get_n: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMint16 offset = ins->operands[2].lit_i16; | mov TMP1, WORK[obj]; // object | mov TMP3, qword [TMP1+offset]; // get value pointer from body | mov TMP2, qword [TMP3]; // deref the pointer | mov WORK[dst], TMP2; break; } case MVM_OP_sp_p6obind_i: case MVM_OP_sp_p6obind_n: case MVM_OP_sp_p6obind_s: case MVM_OP_sp_p6obind_o: { MVMint16 obj = ins->operands[0].reg.orig; MVMint16 offset = ins->operands[1].lit_i16; MVMint16 val = ins->operands[2].reg.orig; | mov TMP1, WORK[obj]; // object | mov TMP2, WORK[val]; // value | lea TMP3, P6OPAQUE:TMP1->body; // body | cmp qword P6OBODY:TMP3->replaced, 0; | je >1; | mov TMP3, P6OBODY:TMP3->replaced; // replaced object body |1: if (op == MVM_OP_sp_p6obind_o || op == MVM_OP_sp_p6obind_s) { /* check if we should hit write barrier */ | check_wb TMP1, TMP2, >2; | mov qword [rbp-0x28], TMP2; // store value | mov qword [rbp-0x30], TMP3; // store body pointer | hit_wb WORK[obj]; | mov TMP3, qword [rbp-0x30]; // restore body pointer | mov TMP2, qword [rbp-0x28]; // restore value |2: // done } | mov [TMP3+offset], TMP2; // store value into body break; } case MVM_OP_getwhere: case MVM_OP_set: { MVMint32 reg1 = ins->operands[0].reg.orig; MVMint32 reg2 = ins->operands[1].reg.orig; | mov TMP1, WORK[reg2]; | mov WORK[reg1], TMP1; break; } case MVM_OP_sp_getspeshslot: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 spesh_idx = ins->operands[1].lit_i16; | get_spesh_slot TMP1, spesh_idx; | mov WORK[dst], TMP1; break; } case MVM_OP_setdispatcher: { MVMint16 src = ins->operands[0].reg.orig; | mov TMP1, aword WORK[src]; | mov aword TC->cur_dispatcher, TMP1; break; } case MVM_OP_takedispatcher: { MVMint16 dst = ins->operands[0].reg.orig; | mov TMP1, aword TC->cur_dispatcher; | cmp TMP1, 0; | je >2; | mov TMP2, aword TC->cur_dispatcher_for; | cmp TMP2, 0; | je >1; | mov TMP3, TC->cur_frame; | mov TMP3, FRAME:TMP3->code_ref; | cmp TMP2, TMP3; | jne >2; |1: | mov aword WORK[dst], TMP1; | mov aword TC->cur_dispatcher, NULL; | jmp >3; |2: | get_vmnull TMP1; | mov aword WORK[dst], TMP1; |3: break; } case MVM_OP_curcode: { MVMint16 dst = ins->operands[0].reg.orig; | mov TMP1, TC->cur_frame; | mov TMP1, aword FRAME:TMP1->code_ref; | mov aword WORK[dst], TMP1; break; } case MVM_OP_getcode: { MVMint16 dst = ins->operands[0].reg.orig; MVMuint16 idx = ins->operands[1].coderef_idx; | mov TMP1, aword CU->body.coderefs; | mov TMP1, aword OBJECTPTR:TMP1[idx]; | mov aword WORK[dst], TMP1; break; } case MVM_OP_callercode: { MVMint16 dst = ins->operands[0].reg.orig; | mov TMP1, TC->cur_frame; | mov TMP1, aword FRAME:TMP1->caller; | test TMP1, TMP1; | jz >1; | mov TMP1, aword FRAME:TMP1->code_ref; |1: | mov aword WORK[dst], TMP1; break; } case MVM_OP_hllboxtype_n: case MVM_OP_hllboxtype_s: case MVM_OP_hllboxtype_i: { MVMint16 dst = ins->operands[0].reg.orig; | mov TMP1, CU->body.hll_config; if (op == MVM_OP_hllboxtype_n) { | mov TMP1, aword HLLCONFIG:TMP1->num_box_type; } else if (op == MVM_OP_hllboxtype_s) { | mov TMP1, aword HLLCONFIG:TMP1->str_box_type; } else { | mov TMP1, aword HLLCONFIG:TMP1->int_box_type; } | mov aword WORK[dst], TMP1; break; } case MVM_OP_null_s: { MVMint16 dst = ins->operands[0].reg.orig; | mov qword WORK[dst], 0; break; } case MVM_OP_isnull_s: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; | mov TMP1, WORK[src]; | test TMP1, TMP1; | setz TMP2b; | movzx TMP2, TMP2b; | mov qword WORK[dst], TMP2; break; } case MVM_OP_add_i: case MVM_OP_sub_i: case MVM_OP_bor_i: case MVM_OP_band_i: case MVM_OP_bxor_i: { MVMint32 reg_a = ins->operands[0].reg.orig; MVMint32 reg_b = ins->operands[1].reg.orig; MVMint32 reg_c = ins->operands[2].reg.orig; MVMSpeshFacts *operand_facts = MVM_spesh_get_facts(tc, jg->sg, ins->operands[2]); if (reg_a == reg_b) { if (operand_facts->flags & MVM_SPESH_FACT_KNOWN_VALUE && fits_in_32_bit(operand_facts->value.i)) { MVMint64 value = operand_facts->value.i; MVM_jit_log(tc, "accumulator for %s stayed in memory and " " constant value %"PRId64" used\n", ins->info->name, value); switch(ins->info->opcode) { case MVM_OP_add_i: | add qword WORK[reg_a], qword value; break; case MVM_OP_sub_i: | sub qword WORK[reg_a], qword value; break; case MVM_OP_bor_i: | or qword WORK[reg_a], qword value; break; case MVM_OP_band_i: | and qword WORK[reg_a], qword value; break; case MVM_OP_bxor_i: | xor qword WORK[reg_a], qword value; break; } } else { MVM_jit_log(tc, "accumulator for %s stayed in memory\n", ins->info->name); | mov rax, WORK[reg_c]; switch(ins->info->opcode) { case MVM_OP_add_i: | add WORK[reg_a], rax; break; case MVM_OP_sub_i: | sub WORK[reg_a], rax; break; case MVM_OP_bor_i: | or WORK[reg_a], rax; break; case MVM_OP_band_i: | and WORK[reg_a], rax; break; case MVM_OP_bxor_i: | xor WORK[reg_a], rax; break; } } } else { if (operand_facts->flags & MVM_SPESH_FACT_KNOWN_VALUE && fits_in_32_bit(operand_facts->value.i)) { MVMint64 value = operand_facts->value.i; MVM_jit_log(tc, "constant value %"PRId64" used for %s\n", value, ins->info->name); | mov rax, WORK[reg_b]; switch(ins->info->opcode) { case MVM_OP_add_i: | add rax, qword value; break; case MVM_OP_sub_i: | sub rax, qword value; break; case MVM_OP_bor_i: | or rax, qword value; break; case MVM_OP_band_i: | and rax, qword value; break; case MVM_OP_bxor_i: | xor rax, qword value; break; } | mov WORK[reg_a], rax; } else { | mov rax, WORK[reg_b]; switch(ins->info->opcode) { case MVM_OP_add_i: | add rax, WORK[reg_c]; break; case MVM_OP_sub_i: | sub rax, WORK[reg_c]; break; case MVM_OP_bor_i: | or rax, WORK[reg_c]; break; case MVM_OP_band_i: | and rax, WORK[reg_c]; break; case MVM_OP_bxor_i: | xor rax, WORK[reg_c]; break; } | mov WORK[reg_a], rax; } } break; } case MVM_OP_mul_i: case MVM_OP_blshift_i: case MVM_OP_brshift_i: { MVMint32 reg_a = ins->operands[0].reg.orig; MVMint32 reg_b = ins->operands[1].reg.orig; MVMint32 reg_c = ins->operands[2].reg.orig; | mov rax, WORK[reg_b]; switch(ins->info->opcode) { case MVM_OP_mul_i: | imul rax, WORK[reg_c]; break; case MVM_OP_blshift_i: | mov cl, byte WORK[reg_c]; | shl rax, cl; break; case MVM_OP_brshift_i: | mov cl, byte WORK[reg_c]; | shr rax, cl; break; } | mov WORK[reg_a], rax; break; } case MVM_OP_div_i: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 a = ins->operands[1].reg.orig; MVMint16 b = ins->operands[2].reg.orig; | mov rax, WORK[a]; | mov rcx, WORK[b]; | cmp rcx, 0; | jnz >1; | throw_adhoc "Division by zero"; |1: /* either num < 0, or denom < 0, but not both */ | setl dh; | cmp rax, 0; | setl dl; | xor dl, dh; | movzx r8d, dl; | cqo; | idiv rcx; | test rdx, rdx; | setnz cl; | and r8b, cl; /* r8 = bias = (modulo != 0) & ((num < 0) ^ (denom < 0)) */ | sub rax, r8; | mov WORK[dst], rax; break; } case MVM_OP_mod_i: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 a = ins->operands[1].reg.orig; MVMint16 b = ins->operands[2].reg.orig; | mov rax, WORK[a]; | mov rcx, WORK[b]; | cmp rcx, 0; | jnz >1; | throw_adhoc "Division by zero"; |1: | cqo; | idiv rcx; | mov WORK[dst], rdx; break; } case MVM_OP_inc_i: { MVMint32 reg = ins->operands[0].reg.orig; | add qword WORK[reg], 1; break; } case MVM_OP_dec_i: { MVMint32 reg = ins->operands[0].reg.orig; | sub qword WORK[reg], 1; break; } case MVM_OP_bnot_i: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; | mov TMP1, WORK[src]; | not TMP1; | mov WORK[dst], TMP1; break; } case MVM_OP_neg_i: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; | mov TMP1, WORK[src]; | neg TMP1; | mov WORK[dst], TMP1; break; } case MVM_OP_extend_i32: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; | mov RV, WORK[src]; | cdqe | mov WORK[dst], RV; break; } case MVM_OP_trunc_i16: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; | mov TMP1, WORK[src]; /* x86-64 auto-truncates the upper 48 bits when using registers in 16 * bit mode */ | mov TMP2w, TMP1w; | mov WORK[dst], TMP2; break; } case MVM_OP_trunc_i32: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; | mov TMP1, WORK[src]; /* x86-64 auto-truncates the upper 32 bits when using registers in 32 * bit mode */ | mov TMP2d, TMP1d; | mov WORK[dst], TMP2; break; } case MVM_OP_add_n: case MVM_OP_sub_n: case MVM_OP_mul_n: case MVM_OP_div_n: { MVMint16 reg_a = ins->operands[0].reg.orig; MVMint16 reg_b = ins->operands[1].reg.orig; MVMint16 reg_c = ins->operands[2].reg.orig; /* Copying data to xmm (floating point) registers requires * a special move instruction */ | movsd xmm0, qword WORK[reg_b]; switch(ins->info->opcode) { case MVM_OP_add_n: | addsd xmm0, qword WORK[reg_c]; break; case MVM_OP_sub_n: | subsd xmm0, qword WORK[reg_c]; break; case MVM_OP_mul_n: | mulsd xmm0, qword WORK[reg_c]; break; case MVM_OP_div_n: | divsd xmm0, qword WORK[reg_c]; break; } | movsd qword WORK[reg_a], xmm0; break; } case MVM_OP_coerce_in: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; /* convert simple integer to double precision */ | cvtsi2sd xmm0, qword WORK[src]; | movsd qword WORK[dst], xmm0; break; } case MVM_OP_coerce_ni: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; /* convert double precision to simple intege */ | cvttsd2si rax, qword WORK[src]; | mov WORK[dst], rax; break; } case MVM_OP_neg_n: { /* Negation is xor-ing the highest byte. Pretty simple right */ MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; | mov TMP1, 1; | sal TMP1, 63; | mov TMP2, qword WORK[src]; | xor TMP2, TMP1; | mov qword WORK[dst], TMP2; break; } case MVM_OP_eq_i: case MVM_OP_eqaddr: case MVM_OP_ne_i: case MVM_OP_lt_i: case MVM_OP_le_i: case MVM_OP_gt_i: case MVM_OP_ge_i: { MVMint32 reg_a = ins->operands[0].reg.orig; MVMint32 reg_b = ins->operands[1].reg.orig; MVMint32 reg_c = ins->operands[2].reg.orig; | mov rax, WORK[reg_b]; /* comparison result in the setting bits in the rflags register */ | cmp rax, WORK[reg_c]; /* copy the right comparison bit to the lower byte of the rax register */ switch(ins->info->opcode) { case MVM_OP_eqaddr: case MVM_OP_eq_i: | sete al; break; case MVM_OP_ne_i: | setne al; break; case MVM_OP_lt_i: | setl al; break; case MVM_OP_le_i: | setle al; break; case MVM_OP_gt_i: | setg al; break; case MVM_OP_ge_i: | setge al; break; } /* zero extend al (lower byte) to rax (whole register) */ | movzx rax, al; | mov WORK[reg_a], rax; break; } case MVM_OP_cmp_i : { MVMint32 reg_a = ins->operands[0].reg.orig; MVMint32 reg_b = ins->operands[1].reg.orig; MVMint32 reg_c = ins->operands[2].reg.orig; | mov TMP1, WORK[reg_b]; /* comparison result in the setting bits in the rflags register */ | cmp TMP1, WORK[reg_c]; /* copy the right comparison bit to the lower byte of the rax register */ | setg TMP2b; | movzx TMP2, TMP2b; | setl TMP3b; | movzx TMP3, TMP3b; | sub TMP2, TMP3; | mov WORK[reg_a], TMP2; break; } case MVM_OP_gt_s: case MVM_OP_ge_s: case MVM_OP_lt_s: case MVM_OP_le_s: { /* src/jit/graph.c already put a call to the MVM_string_compare function into the graph, so here we just have to deal with the returned integers. */ MVMint32 reg = ins->operands[0].reg.orig; switch(ins->info->opcode) { case MVM_OP_gt_s: | mov TMP2, 1; break; case MVM_OP_lt_s: | mov TMP2, -1; break; case MVM_OP_ge_s: case MVM_OP_le_s: | mov TMP2, 0; break; } | cmp TMP2, WORK[reg]; /* Mind the reversedness of the constant and the value as compared to * interp.c */ switch(ins->info->opcode) { case MVM_OP_gt_s: | sete al; break; case MVM_OP_ge_s: | setle al; break; case MVM_OP_lt_s: | sete al; break; case MVM_OP_le_s: | setge al; break; } | movzx rax, al; | mov WORK[reg], rax; break; } case MVM_OP_not_i: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; | mov TMP1, WORK[src]; | test TMP1, TMP1; | setz TMP2b; | movzx TMP2, TMP2b; | mov WORK[dst], TMP2; break; } case MVM_OP_eq_n: case MVM_OP_ne_n: case MVM_OP_le_n: case MVM_OP_lt_n: case MVM_OP_ge_n: case MVM_OP_gt_n: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 a = ins->operands[1].reg.orig; MVMint16 b = ins->operands[2].reg.orig; if (op == MVM_OP_eq_n) { | mov TMP1, 0; } else if (op == MVM_OP_ne_n) { | mov TMP1, 1; } if (op == MVM_OP_lt_n || op == MVM_OP_le_n) { | movsd xmm0, qword WORK[b]; | ucomisd xmm0, qword WORK[a]; } else { | movsd xmm0, qword WORK[a]; | ucomisd xmm0, qword WORK[b]; } if (op == MVM_OP_le_n || op == MVM_OP_ge_n) { | setae TMP1b; } else if (op == MVM_OP_eq_n) { | setnp TMP2b; // zero if either is NaN, 1 otherwise | cmove TMP1, TMP2; // if equal, overwrite 0 with 1 } else if (op == MVM_OP_ne_n) { | setp TMP2b; // 1 if either is NaN (in which case they can't be equal) | cmove TMP1, TMP2; // if equal, overwrite 1 with IsNan(a) | IsNaN(b) } else { | seta TMP1b; } | movzx TMP1, TMP1b; | mov WORK[dst], TMP1; break; } case MVM_OP_cmp_n: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 a = ins->operands[1].reg.orig; MVMint16 b = ins->operands[2].reg.orig; | movsd xmm0, qword WORK[a]; | movsd xmm1, qword WORK[b]; | ucomisd xmm0, xmm1 | seta TMP1b; | movzx rax, TMP1b; | ucomisd xmm1, xmm0 | seta TMP1b; | movzx TMP1, TMP1b; | sub rax, TMP1; | mov WORK[dst], rax; break; } case MVM_OP_eq_I: case MVM_OP_ne_I: case MVM_OP_lt_I: case MVM_OP_le_I: case MVM_OP_gt_I: case MVM_OP_ge_I: { MVMint32 reg_a = ins->operands[0].reg.orig; MVMint32 reg_b = ins->operands[1].reg.orig; MVMint32 reg_c = ins->operands[2].reg.orig; /* Call the bigint comparison function. */ | mov ARG1, tc; | mov ARG2, WORK[reg_b]; | mov ARG3, WORK[reg_c]; | callp &MVM_bigint_cmp; /* Handle result by opcode. */ switch(ins->info->opcode) { case MVM_OP_eq_I: | cmp RV, MP_EQ | sete al; break; case MVM_OP_ne_I: | cmp RV, MP_EQ | setne al; break; case MVM_OP_lt_I: | cmp RV, MP_LT | sete al; break; case MVM_OP_le_I: | cmp RV, MP_GT | setne al; break; case MVM_OP_gt_I: | cmp RV, MP_GT | sete al; break; case MVM_OP_ge_I: | cmp RV, MP_LT | setne al; break; } /* zero extend al (lower byte) to rax (whole register) */ | movzx rax, al; | mov WORK[reg_a], rax; break; } case MVM_OP_isint: case MVM_OP_isnum: case MVM_OP_isstr: case MVM_OP_islist: case MVM_OP_ishash: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMint32 reprid = op == MVM_OP_isint ? MVM_REPR_ID_P6int : op == MVM_OP_isnum ? MVM_REPR_ID_P6num : op == MVM_OP_isstr ? MVM_REPR_ID_P6str : op == MVM_OP_islist ? MVM_REPR_ID_VMArray : /* op == MVM_OP_ishash */ MVM_REPR_ID_MVMHash; | mov TMP1, aword WORK[obj]; | test TMP1, TMP1; | jz >1; | mov TMP1, OBJECT:TMP1->st; | mov TMP1, STABLE:TMP1->REPR; | cmp qword REPR:TMP1->ID, reprid; | jne >1; | mov qword WORK[dst], 1; | jmp >2; |1: | mov qword WORK[dst], 0; |2: break; } case MVM_OP_sp_boolify_iter_arr: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; | mov TMP1, aword WORK[obj]; | mov TMP2, MVMITER:TMP1->body.array_state.index; | add TMP2, 1; | mov TMP3, MVMITER:TMP1->body.array_state.limit; /* index - limit will give a carry flag when index < limit */ | cmp TMP2, TMP3; | setl TMP1b; | movzx TMP1, TMP1b; | mov aword WORK[dst], TMP1; break; } case MVM_OP_sp_boolify_iter_hash: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; | mov TMP1, aword WORK[obj]; | mov TMP2, MVMITER:TMP1->body.hash_state.next; | test TMP2, TMP2; | setnz TMP2b; | movzx TMP2, TMP2b; | mov aword WORK[dst], TMP2; break; } case MVM_OP_objprimspec: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 type = ins->operands[1].reg.orig; | mov TMP6, aword WORK[type]; | test TMP6, TMP6; | jz >1; | mov ARG2, OBJECT:TMP6->st; | mov FUNCTION, STABLE:ARG2->REPR; | mov FUNCTION, REPR:FUNCTION->get_storage_spec; | mov ARG1, TC; | call FUNCTION; | movzx TMP6, word STORAGESPEC:RV->boxed_primitive; |1: | mov aword WORK[dst], TMP6; break; } case MVM_OP_objprimbits: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 type = ins->operands[1].reg.orig; | mov TMP6, aword WORK[type]; | test TMP6, TMP6; | jz >1; | mov ARG2, OBJECT:TMP6->st; | mov FUNCTION, STABLE:ARG2->REPR; | mov FUNCTION, REPR:FUNCTION->get_storage_spec; | mov ARG1, TC; | call FUNCTION; | movzx TMP6, word STORAGESPEC:RV->boxed_primitive; | test TMP6, TMP6; | jz >1; | movzx TMP6, word STORAGESPEC:RV->bits; |1: | mov aword WORK[dst], TMP6; break; } case MVM_OP_isnonnull: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; | mov TMP1, WORK[obj]; | test TMP1, TMP1; | setnz TMP2b; | get_vmnull TMP3; | cmp TMP1, TMP3; | setne TMP3b; | and TMP2b, TMP3b; | movzx TMP2, TMP2b; | mov WORK[dst], TMP2; break; } case MVM_OP_isnull: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; | mov TMP1, WORK[obj]; | test TMP1, TMP1; | setz TMP2b; | get_vmnull TMP3; | cmp TMP1, TMP3; | sete TMP3b; | or TMP2b, TMP3b; | movzx TMP2, TMP2b; | mov WORK[dst], TMP2; break; } case MVM_OP_sp_fastcreate: { MVMint16 dst = ins->operands[0].reg.orig; MVMuint16 size = ins->operands[1].lit_i16; MVMint16 spesh_idx = ins->operands[2].lit_i16; | mov ARG1, TC; | mov ARG2, size; | callp &MVM_gc_allocate_zeroed; | get_spesh_slot TMP1, spesh_idx; | mov aword OBJECT:RV->st, TMP1; // st is 64 bit (pointer) | mov word OBJECT:RV->header.size, size; // object size is 16 bit | mov TMP1d, dword TC->thread_id; // thread id is 32 bit | mov dword OBJECT:RV->header.owner, TMP1d; // does this even work? | mov aword WORK[dst], RV; // store in local register break; } case MVM_OP_decont: case MVM_OP_sp_decont: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 src = ins->operands[1].reg.orig; | mov TMP5, WORK[src]; | test TMP5, TMP5; // obj is null | jz >1; | is_type_object TMP5; // object is type object (not concrete) | jnz >1; | mov TMP6, OBJECT:TMP5->st; | mov TMP6, STABLE:TMP6->container_spec; | test TMP6, TMP6; // container spec is zero | jz >1; | mov ARG1, TC; | mov ARG2, TMP5; // object | lea ARG3, WORK[dst]; // destination register | mov FUNCTION, CONTAINERSPEC:TMP6->fetch; // get function pointer | call FUNCTION; | jmp >2; |1: // otherwise just move the object into the register | mov WORK[dst], TMP5; |2: break; } case MVM_OP_iscont: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; | mov TMP1, aword WORK[obj]; | test TMP1, TMP1; | jz >1; | mov TMP1, OBJECT:TMP1->st; | mov TMP1, STABLE:TMP1->container_spec; | test TMP1, TMP1; |1: | setnz TMP1b; | movzx TMP1, TMP1b; | mov qword WORK[dst], TMP1; break; } case MVM_OP_sp_findmeth: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; MVMint32 str_idx = ins->operands[2].lit_str_idx; MVMuint16 ss_idx = ins->operands[3].lit_i16; | get_spesh_slot TMP1, ss_idx; | mov TMP2, WORK[obj]; | mov TMP2, OBJECT:TMP2->st; | cmp TMP1, TMP2; | jne >1; | get_spesh_slot TMP3, ss_idx + 1; | mov WORK[dst], TMP3; | jmp >2; |1: /* assign invokish label first */ | mov rax, TC->cur_frame; | lea TMP6, [>2]; | mov aword FRAME:rax->jit_entry_label, TMP6; /* call find_method_spesh */ | mov ARG1, TC; | mov ARG2, WORK[obj]; | get_string ARG3, str_idx; | mov ARG4, ss_idx; | lea TMP6, WORK[dst]; |.if WIN32; | mov qword [rsp+0x20], TMP6; |.else; | mov ARG5, TMP6; |.endif | callp &MVM_6model_find_method_spesh; | test RV, RV; /* fall out to interpreter */ | jnz ->exit; |2: break; } case MVM_OP_isconcrete: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; | mov TMP1, WORK[obj]; | test TMP1, TMP1; | jz >1; | is_type_object TMP1; | jnz >1; | mov qword WORK[dst], 1; | jmp >2; |1: | mov qword WORK[dst], 0; |2: break; } case MVM_OP_takehandlerresult: { MVMint16 dst = ins->operands[0].reg.orig; | mov TMP1, aword TC->last_handler_result; | mov aword WORK[dst], TMP1; | mov aword TC->last_handler_result, 0; break; } case MVM_OP_exception: { MVMint16 dst = ins->operands[0].reg.orig; | mov TMP1, TC->active_handlers; | test TMP1, TMP1; | jz >1; | mov TMP1, MVMACTIVEHANDLERS:TMP1->ex_obj; | mov WORK[dst], TMP1; | jmp >2; |1: | get_vmnull TMP1; | mov WORK[dst], TMP1; |2: break; } case MVM_OP_scwbdisable: { MVMint16 dst = ins->operands[0].reg.orig; | mov TMP1d, dword TC->sc_wb_disable_depth; | add TMP1d, 1; | mov dword TC->sc_wb_disable_depth, TMP1d; | mov qword WORK[dst], TMP1; break; } case MVM_OP_scwbenable: { MVMint16 dst = ins->operands[0].reg.orig; | mov TMP1d, dword TC->sc_wb_disable_depth; // should do zero-extension | sub TMP1d, 1; | mov dword TC->sc_wb_disable_depth, TMP1d; | mov qword WORK[dst], TMP1; break; } case MVM_OP_assign: case MVM_OP_assignunchecked: { MVMint16 cont = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; | mov ARG2, aword WORK[cont]; | mov FUNCTION, OBJECT:ARG2->st; | mov FUNCTION, STABLE:FUNCTION->container_spec; | test FUNCTION, FUNCTION; | jnz >1; | throw_adhoc "Cannot assign to an immutable value"; |1: | mov ARG1, TC; | mov ARG3, aword WORK[obj]; if (op == MVM_OP_assign) { | mov FUNCTION, CONTAINERSPEC:FUNCTION->store; } else { | mov FUNCTION, CONTAINERSPEC:FUNCTION->store_unchecked; } | call FUNCTION; break; } case MVM_OP_getlexstatic_o: case MVM_OP_getlexperinvtype_o: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 name = ins->operands[1].reg.orig; | mov ARG1, TC; | mov ARG2, aword WORK[name]; | mov ARG3, MVM_reg_obj; | callp &MVM_frame_find_lexical_by_name; | test RV, RV; | jz >1; | mov RV, [RV]; |1: | mov WORK[dst], RV; break; } case MVM_OP_paramnamesused: | mov ARG2, TC->cur_frame; | lea ARG2, FRAME:ARG2->params; | mov TMP5w, word ARGCTX:ARG2->num_pos; | cmp TMP5w, word ARGCTX:ARG2->arg_count; | je >1; | mov ARG1, TC; | callp &MVM_args_assert_nameds_used; |1: break; case MVM_OP_assertparamcheck: { MVMint16 ok = ins->operands[0].reg.orig; | mov TMP1, qword WORK[ok]; | test TMP1, TMP1; | jnz >1; | mov ARG1, TC; | callp &MVM_args_bind_failed; |1: break; } case MVM_OP_prof_enterspesh: | mov ARG1, TC; | mov ARG2, TC->cur_frame; | mov ARG2, aword FRAME:ARG2->static_info; | mov ARG3, aword MVM_PROFILE_ENTER_JIT; | callp &MVM_profile_log_enter; break; case MVM_OP_prof_enterinline: { MVMint16 spesh_idx = ins->operands[0].lit_i16; | mov ARG1, TC; | get_spesh_slot ARG2, spesh_idx; | mov ARG3, aword MVM_PROFILE_ENTER_JIT_INLINE; | callp &MVM_profile_log_enter; break; } case MVM_OP_getobjsc: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 obj = ins->operands[1].reg.orig; | mov TMP1, aword WORK[obj]; | mov TMP2d, dword COLLECTABLE:TMP1->sc_forward_u.sc.sc_idx; | xor TMP3, TMP3; | cmp TMP2d, 0; | jle >1; | mov TMP3, aword TC->instance; | mov TMP3, aword MVMINSTANCE:TMP3->all_scs; | mov TMP3, aword [TMP3 + TMP2d * 8]; | mov TMP3, SCREFBODY:TMP3->sc; |1: | mov aword WORK[dst], TMP3; break; } case MVM_OP_invokewithcapture: { MVMint16 dest = ins->operands[0].reg.orig; MVMint16 code = ins->operands[1].reg.orig; MVMint16 capture = ins->operands[2].reg.orig; | mov TMP1, aword WORK[capture]; /* if (IS_CONCRETE(capture) && REPR(capture)->ID == MVM_REPR_ID_MVMCallCapture) */ | is_type_object TMP1; | jnz >1; | mov TMP2, OBJECT:TMP1->st; | mov TMP2, STABLE:TMP2->REPR; | cmp dword REPR:TMP2->ID, MVM_REPR_ID_MVMCallCapture; | je >2; |1: /* else throw */ | throw_adhoc "invokewithcapture needs a MVMCallCapture"; |2: /* code = MVM_frame_find_invokee(tc, code, NULL) */ | mov ARG1, TC; | mov ARG2, WORK[code]; | xor ARG3, ARG3; | callp &MVM_frame_find_invokee; | mov ARG2, RV; // ARG2 = code /* tc->cur_frame->return_value = &GET_REG(cur_op, 2) */ | lea ARG1, WORK[dest]; // ARG1 is used as scratch space | mov TMP6, aword TC->cur_frame; | mov aword FRAME:TMP6->return_value, ARG1; /* tc->cur_frame->return_type = MVM_RETURN_OBJ */ | mov byte FRAME:TMP6->return_type, MVM_RETURN_OBJ; /* tc->cur_frame->return_address = cur_op */ | get_cur_op ARG1; | mov aword FRAME:TMP6->return_address, ARG1; /* STABLE(code)->invoke(tc, code, capture->body.apc->effective_callsite, capture->body.apc->arg) */ | mov ARG1, TC; | mov ARG3, WORK[capture]; | mov ARG4, aword CAPTURE:ARG3->body.apc; | mov ARG3, aword ARGCTX:ARG4->callsite; | mov ARG4, aword ARGCTX:ARG4->args; | mov FUNCTION, OBJECT:ARG2->st; | mov FUNCTION, STABLE:FUNCTION->invoke; | call FUNCTION; /* jumping out is handled by invokish */ break; } case MVM_OP_captureposelems: { MVMint16 dest = ins->operands[0].reg.orig; MVMint16 capture = ins->operands[1].reg.orig; | mov TMP1, aword WORK[capture]; /* if (IS_CONCRETE(capture) && REPR(capture)->ID == MVM_REPR_ID_MVMCallCapture) */ | is_type_object TMP1; | jnz >1; | mov TMP2, OBJECT:TMP1->st; | mov TMP2, STABLE:TMP2->REPR; | cmp dword REPR:TMP2->ID, MVM_REPR_ID_MVMCallCapture; | je >2; |1: /* else throw */ | throw_adhoc "captureposelems needs a concrete MVMCallCapture"; |2: | mov TMP2, aword CAPTURE:TMP1->body.apc; | movzx TMP2, word ARGPROCCONTEXT:TMP2->num_pos; | mov WORK[dest], TMP2; break; } case MVM_OP_capturehasnameds: { MVMint16 dest = ins->operands[0].reg.orig; MVMint16 capture = ins->operands[1].reg.orig; | mov TMP1, aword WORK[capture]; /* if (IS_CONCRETE(capture) && REPR(capture)->ID == MVM_REPR_ID_MVMCallCapture) */ | is_type_object TMP1; | jnz >1; | mov TMP2, OBJECT:TMP1->st; | mov TMP2, STABLE:TMP2->REPR; | cmp dword REPR:TMP2->ID, MVM_REPR_ID_MVMCallCapture; | je >2; |1: /* else throw */ | throw_adhoc "capturehasnameds needs a concrete MVMCallCapture"; |2: | mov TMP2, CAPTURE:TMP1->body.apc; | mov TMP3w, word ARGPROCCONTEXT:TMP2->num_pos; | mov TMP2w, word ARGPROCCONTEXT:TMP2->arg_count; | cmp TMP2w, TMP3w; | setne al; | movzx rax, al; | mov WORK[dest], rax; break; } case MVM_OP_getstdin: case MVM_OP_getstdout: case MVM_OP_getstderr: { MVMint16 dst = ins->operands[0].reg.orig; | mov TMP3, aword TC->instance; if (ins->info->opcode == MVM_OP_getstdin) { | mov TMP3, aword MVMINSTANCE:TMP3->stdin_handle; } else if (ins->info->opcode == MVM_OP_getstdout) { | mov TMP3, aword MVMINSTANCE:TMP3->stdout_handle; } else if (ins->info->opcode == MVM_OP_getstderr) { | mov TMP3, aword MVMINSTANCE:TMP3->stderr_handle; } | mov aword WORK[dst], TMP3; break; } case MVM_OP_ordat: case MVM_OP_ordfirst: { MVMint16 dst = ins->operands[0].reg.orig; MVMint16 str = ins->operands[1].reg.orig; | mov ARG1, TC; | mov ARG2, aword WORK[str]; if (op == MVM_OP_ordat) { MVMint16 idx = ins->operands[2].reg.orig; | mov ARG3, qword WORK[idx]; } else { | mov ARG3, 0; } | callp &MVM_string_ord_at; | mov qword WORK[dst], RV; break; } case MVM_OP_setcodeobj: { MVMint16 obj = ins->operands[0].reg.orig; MVMint16 code = ins->operands[1].reg.orig; | mov TMP1, aword WORK[obj]; /* if (REPR(obj)->ID == MVM_REPR_ID_MVMCode) */ | mov TMP2, OBJECT:TMP1->st; | mov TMP2, STABLE:TMP2->REPR; | cmp dword REPR:TMP2->ID, MVM_REPR_ID_MVMCode; | je >1; /* else throw */ | throw_adhoc "setcodeobj needs a code ref"; |1: | mov TMP2, aword WORK[code]; | mov aword CODE:TMP1->body.code_object, TMP2; break; } case MVM_OP_lastexpayload: { MVMint16 dst = ins->operands[0].reg.orig; | mov TMP3, aword TC->last_payload; | mov aword WORK[dst], TMP3; break; } case MVM_OP_param_sp: { MVMuint16 dst = ins->operands[0].reg.orig; MVMuint16 off = ins->operands[1].lit_ui16; | mov ARG1, TC | mov ARG2, TC:ARG1->cur_frame | lea ARG2, FRAME:ARG2->params | mov ARG3, off | callp &MVM_args_slurpy_positional; | mov qword WORK[dst], RV; break; } case MVM_OP_param_sn: { MVMuint16 dst = ins->operands[0].reg.orig; | mov ARG1, TC | mov ARG2, TC:ARG1->cur_frame | lea ARG2, FRAME:ARG2->params | callp &MVM_args_slurpy_named; | mov qword WORK[dst], RV; break; } case MVM_OP_sp_cas_o: { MVMint16 target = ins->operands[1].reg.orig; MVMint16 expected = ins->operands[2].reg.orig; MVMint16 value = ins->operands[3].reg.orig; MVMint16 result = ins->operands[0].reg.orig; | mov ARG1, TC; | mov ARG2, aword WORK[target]; | mov ARG3, aword WORK[expected]; | mov ARG4, aword WORK[value]; |.if WIN32; | lea TMP6, WORK[result] | mov qword [rsp+0x20], TMP6 |.else; | lea ARG5, WORK[result] |.endif | mov FUNCTION, OBJECT:ARG2->st; | mov FUNCTION, STABLE:FUNCTION->container_spec; | mov FUNCTION, CONTAINERSPEC:FUNCTION->cas; | call FUNCTION; break; } case MVM_OP_sp_atomicload_o: { MVMint16 target = ins->operands[1].reg.orig; MVMint16 result = ins->operands[0].reg.orig; | mov ARG1, TC; | mov ARG2, aword WORK[target]; | mov FUNCTION, OBJECT:ARG2->st; | mov FUNCTION, STABLE:FUNCTION->container_spec; | mov FUNCTION, CONTAINERSPEC:FUNCTION->atomic_load; | call FUNCTION; | mov WORK[result], RV break; } case MVM_OP_sp_atomicstore_o: { MVMint16 target = ins->operands[0].reg.orig; MVMint16 value = ins->operands[1].reg.orig; | mov ARG1, TC; | mov ARG2, aword WORK[target]; | mov ARG3, aword WORK[value]; | mov FUNCTION, OBJECT:ARG2->st; | mov FUNCTION, STABLE:FUNCTION->container_spec; | mov FUNCTION, CONTAINERSPEC:FUNCTION->atomic_store; | call FUNCTION; break; } default: MVM_panic(1, "Can't JIT opcode <%s>", ins->info->name); } } /* Call argument decoder */ static void load_call_arg(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitGraph *jg, MVMJitCallArg arg) { switch(arg.type) { case MVM_JIT_INTERP_VAR: switch (arg.v.ivar) { case MVM_JIT_INTERP_TC: | mov TMP6, TC; break; case MVM_JIT_INTERP_CU: | mov TMP6, CU; break; case MVM_JIT_INTERP_FRAME: | mov TMP6, TC->cur_frame; break; case MVM_JIT_INTERP_PARAMS: | mov TMP6, TC->cur_frame; | lea TMP6, FRAME:TMP6->params; break; case MVM_JIT_INTERP_CALLER: | mov TMP6, TC->cur_frame; | mov TMP6, aword FRAME:TMP6->caller; break; } break; case MVM_JIT_REG_VAL: | mov TMP6, qword WORK[arg.v.reg]; break; case MVM_JIT_REG_VAL_F: | mov TMP6, qword WORK[arg.v.reg]; break; case MVM_JIT_REG_ADDR: | lea TMP6, WORK[arg.v.reg]; break; case MVM_JIT_STR_IDX: | get_string TMP6, arg.v.lit_i64; break; case MVM_JIT_LITERAL: | mov TMP6, arg.v.lit_i64; break; case MVM_JIT_LITERAL_64: case MVM_JIT_LITERAL_PTR: case MVM_JIT_LITERAL_F: | mov64 TMP6, arg.v.lit_i64; break; case MVM_JIT_REG_STABLE: | mov TMP6, qword WORK[arg.v.reg]; | mov TMP6, OBJECT:TMP6->st; break; case MVM_JIT_REG_OBJBODY: | mov TMP6, qword WORK[arg.v.reg]; | lea TMP6, STOOGE:TMP6->data; break; case MVM_JIT_REG_DYNIDX: | get_cur_op TMP5; | xor TMP6, TMP6; | mov TMP6w, U16:TMP5[arg.v.reg]; | mov TMP6, qword [WORK + TMP6*8]; break; case MVM_JIT_DATA_LABEL: | lea TMP6, [=>(arg.v.lit_i64)]; break; case MVM_JIT_SAVED_RV: | mov TMP6, [rbp-(0x28+arg.v.lit_i64*8)]; break; case MVM_JIT_ARG_I64: | mov TMP6, TC->cur_frame; | mov TMP6, FRAME:TMP6->args; | mov TMP6, qword REGISTER:TMP6[arg.v.lit_i64]; break; case MVM_JIT_ARG_I64_RW: | mov TMP6, TC->cur_frame; | mov TMP6, FRAME:TMP6->args; | lea TMP6, qword REGISTER:TMP6[arg.v.lit_i64]; break; case MVM_JIT_ARG_PTR: | mov TMP6, TC->cur_frame; | mov TMP6, FRAME:TMP6->args; | mov TMP6, qword REGISTER:TMP6[arg.v.lit_i64]; | mov TMP6, aword STOOGE:TMP6->data; break; case MVM_JIT_ARG_VMARRAY: | mov TMP6, TC->cur_frame; | mov TMP6, FRAME:TMP6->args; | mov TMP6, qword REGISTER:TMP6[arg.v.lit_i64]; | mov TMP6, aword VMARRAY:TMP6->body.slots; break; case MVM_JIT_PARAM_I64: | mov TMP6, qword WORK[arg.v.lit_i64]; break; case MVM_JIT_PARAM_I64_RW: | lea TMP6, qword WORK[arg.v.lit_i64]; break; case MVM_JIT_PARAM_PTR: | mov TMP6, aword WORK[arg.v.lit_i64]; | mov TMP6, aword STOOGE:TMP6->data; break; case MVM_JIT_PARAM_VMARRAY: | mov TMP6, aword WORK[arg.v.lit_i64]; | mov TMP6, aword VMARRAY:TMP6->body.slots; break; default: MVM_oops(tc, "JIT: Unknown JIT argument type %d", arg.type); } } static void emit_gpr_arg(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitGraph *jg, MVMint32 i) { switch (i) { case 0: | mov ARG1, TMP6; break; case 1: | mov ARG2, TMP6; break; case 2: | mov ARG3, TMP6; break; case 3: | mov ARG4, TMP6; break; |.if POSIX || case 4: | mov ARG5, TMP6; || break; || case 5: | mov ARG6, TMP6; || break; |.endif default: MVM_oops(tc, "JIT: can't store %d arguments in GPR", i); } } static void emit_sse_arg(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitGraph *jg, MVMint32 i) { switch (i) { case 0: | movd ARG1F, TMP6; break; case 1: | movd ARG2F, TMP6; break; case 2: | movd ARG3F, TMP6; break; case 3: | movd ARG4F, TMP6; break; |.if POSIX || case 4: | movd ARG5F, TMP6; || break; || case 5: | movd ARG6F, TMP6; || break; || case 6: | movd ARG7F, TMP6; || break; || case 7: | movd ARG8F, TMP6; || break; |.endif default: MVM_oops(tc, "JIT: can't put %d arguments in SSE", i); } } static void emit_stack_arg(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitGraph *jg, MVMint32 arg_size, MVMint32 pos) { /* basically, stack arguments are passed in right-to-left order on both POSIX and W64 backends, it seems. Thus the most logical thing to do is to count from the stack top upwards. */ if (pos + arg_size > 160) { MVM_oops(tc, "JIT: trying to pass arguments " " in local space (stack top offset:" " %d, size: %d)", pos, arg_size); } switch(arg_size) { case 1: | mov byte [rsp+pos], TMP6b; break; case 2: | mov word [rsp+pos], TMP6w; break; case 4: | mov dword [rsp+pos], TMP6d; break; case 8: | mov qword [rsp+pos], TMP6; break; default: MVM_oops(tc, "JIT: can't pass arguments size %d bytes", arg_size); } } static void emit_posix_callargs(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitGraph *jg, MVMJitCallArg args[], MVMint32 num_args) { MVMint32 num_gpr = 0, num_fpr = 0, num_stack = 0, i; MVMJitCallArg in_gpr[6], in_fpr[8], *on_stack = NULL; if (num_args > 6) on_stack = MVM_malloc(sizeof(MVMJitCallArg) * (num_args - 6)); /* divide in gpr, fpr, stack values */ for (i = 0; i < num_args; i++) { switch (args[i].type) { case MVM_JIT_INTERP_VAR: case MVM_JIT_REG_VAL: case MVM_JIT_REG_ADDR: case MVM_JIT_REG_OBJBODY: case MVM_JIT_REG_STABLE: case MVM_JIT_REG_DYNIDX: case MVM_JIT_STR_IDX: case MVM_JIT_LITERAL: case MVM_JIT_LITERAL_64: case MVM_JIT_LITERAL_PTR: case MVM_JIT_DATA_LABEL: case MVM_JIT_SAVED_RV: case MVM_JIT_ARG_I64: case MVM_JIT_ARG_I64_RW: case MVM_JIT_ARG_PTR: case MVM_JIT_ARG_VMARRAY: case MVM_JIT_PARAM_I64: case MVM_JIT_PARAM_I64_RW: case MVM_JIT_PARAM_PTR: case MVM_JIT_PARAM_VMARRAY: if (num_gpr < 6) { in_gpr[num_gpr++] = args[i]; } else { on_stack[num_stack++] = args[i]; } break; case MVM_JIT_REG_VAL_F: case MVM_JIT_LITERAL_F: if (num_fpr < 8) { in_fpr[num_fpr++] = args[i]; } else { on_stack[num_stack++] = args[i]; } break; default: MVM_oops(tc, "JIT: Unknown JIT argument type %d for emit_posix_callargs", args[i].type); } } for (i = 0; i < num_gpr; i++) { load_call_arg(tc, compiler, jg, in_gpr[i]); emit_gpr_arg(tc, compiler, jg, i); } for (i = 0; i < num_fpr; i++) { load_call_arg(tc, compiler, jg, in_fpr[i]); emit_sse_arg(tc, compiler, jg, i); } /* push right-to-left */ for (i = 0; i < num_stack; i++) { load_call_arg(tc, compiler, jg, on_stack[i]); // I'm not sure this is correct, btw emit_stack_arg(tc, compiler, jg, 8, i*8); } if (on_stack) MVM_free(on_stack); } static void emit_win64_callargs(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitGraph *jg, MVMJitCallArg args[], MVMint32 num_args) { MVMint32 i; MVMint32 num_reg_args = (num_args > 4 ? 4 : num_args); for (i = 0; i < num_reg_args; i++) { load_call_arg(tc, compiler, jg, args[i]); if (args[i].type == MVM_JIT_REG_VAL_F || args[i].type == MVM_JIT_LITERAL_F) { emit_sse_arg(tc, compiler, jg, i); } else { emit_gpr_arg(tc, compiler, jg, i); } } for (; i < num_args; i++) { load_call_arg(tc, compiler, jg, args[i]); emit_stack_arg(tc, compiler, jg, 8, i * 8); } } void MVM_jit_emit_call_c(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitGraph *jg, MVMJitCallC * call_spec) { MVM_jit_log(tc, "emit c call <%d args>\n", call_spec->num_args); if (call_spec->has_vargs) { MVM_oops(tc, "JIT can't handle varargs yet"); } |.if WIN32; || emit_win64_callargs(tc, compiler, jg, call_spec->args, call_spec->num_args); |.else; || emit_posix_callargs(tc, compiler, jg, call_spec->args, call_spec->num_args); |.endif /* Emit the call. I think we should be able to do something smarter than * store the constant into the bytecode, like a data segment. But I'm * not sure. */ | callp call_spec->func_ptr; /* right, now determine what to do with the return value */ switch(call_spec->rv_mode) { case MVM_JIT_RV_VOID: break; case MVM_JIT_RV_INT: case MVM_JIT_RV_PTR: | mov WORK[call_spec->rv_idx], RV; break; case MVM_JIT_RV_NUM: | movsd qword WORK[call_spec->rv_idx], RVF; break; case MVM_JIT_RV_DEREF: | mov TMP1, [RV]; | mov WORK[call_spec->rv_idx], TMP1; break; case MVM_JIT_RV_ADDR: /* store local at address */ | mov TMP1, WORK[call_spec->rv_idx]; | mov [RV], TMP1; break; case MVM_JIT_RV_DYNIDX: /* store in register relative to cur_op */ | get_cur_op TMP1; | xor TMP2, TMP2; | mov TMP2w, word [TMP1 + call_spec->rv_idx*2]; | mov aword [WORK + TMP2*8], RV; break; } } void MVM_jit_emit_block_branch(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitGraph *jg, MVMJitBranch * branch) { MVMSpeshIns *ins = branch->ins; MVMint32 name = branch->dest; /* move gc sync point to the front so as to not have * awkward dispatching issues */ | gc_sync_point; if (ins == NULL || ins->info->opcode == MVM_OP_goto) { MVM_jit_log(tc, "emit jump to label %d\n", name); if (name == MVM_JIT_BRANCH_EXIT) { | jmp ->exit } else { | jmp =>(name) } } else { MVMint16 val = ins->operands[0].reg.orig; MVM_jit_log(tc, "emit branch <%s> to label %d\n", ins->info->name, name); switch(ins->info->opcode) { case MVM_OP_if_i: | mov rax, WORK[val]; | test rax, rax; | jnz =>(name); // jump to dynamic label break; case MVM_OP_unless_i: | mov rax, WORK[val]; | test rax, rax; | jz =>(name); break; case MVM_OP_if_n: | movd xmm0, qword WORK[val]; | xorpd xmm1, xmm1; // make it zero | ucomisd xmm0, xmm1; | jp =>(name); // is NaN? | jne =>(name); // not equal to zero? we're golden break; case MVM_OP_unless_n: | movd xmm0, qword WORK[val]; | xorpd xmm1, xmm1; // make it zero | ucomisd xmm0, xmm1; | jp >1; // is NaN | jne >1; // is not zero | jmp =>(name); // it is zero yay! |1: break; case MVM_OP_if_s0: case MVM_OP_unless_s0: | mov ARG1, TC; | mov ARG2, WORK[val]; | callp &MVM_coerce_istrue_s; | test RV, RV; if (ins->info->opcode == MVM_OP_unless_s0) | jz =>(name); else | jnz =>(name); break; case MVM_OP_ifnonnull: | mov TMP1, WORK[val]; | test TMP1, TMP1; | jz >1; | get_vmnull TMP2; | cmp TMP1, TMP2; | je >1; | jmp =>(name); |1: break; case MVM_OP_indexat: case MVM_OP_indexnat: { MVMint16 offset = ins->operands[1].reg.orig; MVMuint32 str_idx = ins->operands[2].lit_str_idx; | mov ARG1, TC; | mov ARG2, WORK[val]; | mov ARG3, WORK[offset]; | get_string ARG4, str_idx; | callp &MVM_string_char_at_in_string; /* This subtlety is due to the value being overloaded to * -2 if it is out of bounds. Note that -1 is passed as a * 32 bit integer, but this magically works in a 64 bit * comparison because 32 bit values are sign-extended */ | cmp RV, -1; if (ins->info->opcode == MVM_OP_indexat) | jle =>(name); else { | jne =>(name); } break; } default: MVM_panic(1, "JIT: Can't handle conditional <%s>", ins->info->name); } } } void MVM_jit_emit_label(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitGraph *jg, MVMint32 label) { MVM_jit_log(tc, "Emitting label %d\n", label); | =>(label): } void MVM_jit_emit_branch(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMint32 label) { | jmp =>(label); } void MVM_jit_emit_conditional_branch(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMint32 cond, MVMint32 label) { switch (cond) { case MVM_JIT_LT: | jl =>(label); break; case MVM_JIT_LE: | jle =>(label); break; case MVM_JIT_EQ: | je =>(label); break; case MVM_JIT_NE: | jne =>(label); break; case MVM_JIT_GE: | jge =>(label); break; case MVM_JIT_GT: | jg =>(label); break; case MVM_JIT_NZ: | jnz =>(label); break; case MVM_JIT_ZR: | jz =>(label); break; default: MVM_oops(tc, "this condition cannot be compiled with conditional_branch"); } } void MVM_jit_emit_guard(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitGraph *jg, MVMJitGuard *guard) { MVMint16 op = guard->ins->info->opcode; MVMint16 obj = guard->ins->operands[0].reg.orig; MVMint16 spesh_idx = guard->ins->operands[1].lit_i16; MVM_jit_log(tc, "emit guard <%s>\n", guard->ins->info->name); /* load object and spesh slot value */ | mov TMP1, WORK[obj]; | get_spesh_slot TMP2, spesh_idx; if (op == MVM_OP_sp_guard) { /* object in question should just match the type, so it shouldn't * be zero, and the STABLE should be equal to the value in the spesh * slot */ /* check for null */ | test TMP1, TMP1; | jz >1; /* get stable and compare */ | cmp TMP2, OBJECT:TMP1->st; | jne >1; /* we're good, no need to deopt */ } else if (op == MVM_OP_sp_guardtype) { /* object in question should be a type object, so it shouldn't * be zero, should not be concrete, and the STABLE should be * equal to the value in the spesh slot */ /* check for null */ | test TMP1, TMP1; | jz >1; /* check if type object (not concrete) */ | is_type_object TMP1; /* if zero, this is a concrete object, and we should deopt */ | jz >1; /* get stable and compare */ | cmp TMP2, OBJECT:TMP1->st; | jne >1; /* we're good, no need to deopt */ } else if (op == MVM_OP_sp_guardconc) { /* object should be a non-null concrete (non-type) object */ | test TMP1, TMP1; | jz >1; /* shouldn't be type object */ | is_type_object TMP1; | jnz >1; /* should have our stable */ | cmp TMP2, OBJECT:TMP1->st; | jne >1; } else if (op == MVM_OP_sp_guardsf) { /* Should be an MVMCode */ MVMint32 reprid = MVM_REPR_ID_MVMCode; | mov TMP3, OBJECT:TMP1->st; | mov TMP3, STABLE:TMP3->REPR; | cmp qword REPR:TMP3->ID, reprid; | jne >1; | cmp TMP2, CODE:TMP1->body.sf; | jne >1; } /* if we're here, we didn't jump to deopt, so skip it */ | jmp >2; |1: /* emit deopt */ | mov ARG1, TC; | mov ARG2, guard->deopt_offset; | mov ARG3, guard->deopt_target; | callp &MVM_spesh_deopt_one_direct; /* jump out */ | jmp ->exit; |2: } void MVM_jit_emit_invoke(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitGraph *jg, MVMJitInvoke *invoke) { MVMint16 i; MVMuint16 callsite_idx = invoke->callsite_idx; MVM_jit_log(tc, "Emit invoke (%d args)\n", invoke->arg_count); /* Store callsite in tmp6, which we use at the end of invoke */ | mov TMP6, CU->body.callsites; | mov TMP6, CALLSITEPTR:TMP6[callsite_idx]; /* Store callsite in the frame. I use TMP5 as it never conflicts * with argument passing (like TMP6, but unlike other TMP regs) */ | mov TMP5, TC->cur_frame; | mov FRAME:TMP5->cur_args_callsite, TMP6; /* Setup the frame for returning to our current position */ if (sizeof(MVMReturnType) == 1) { | mov byte FRAME:TMP5->return_type, invoke->return_type; } else { MVM_panic(1, "JIT: MVMReturnType has unexpected size"); } /* The register for our return value */ if (invoke->return_type == MVM_RETURN_VOID) { | mov aword FRAME:TMP5->return_value, NULL; } else { | lea TMP2, WORK[invoke->return_register]; | mov aword FRAME:TMP5->return_value, TMP2; } /* The return address for the interpreter */ | get_cur_op TMP2; | mov aword FRAME:TMP5->return_address, TMP2; /* The re-entry label for the JIT, so that we continue in the next BB */ | lea TMP2, [=>(invoke->reentry_label)]; | mov aword FRAME:TMP5->jit_entry_label, TMP2; /* Install invoke args */ | mov TMP5, FRAME:TMP5->args; for (i = 0; i < invoke->arg_count; i++) { MVMSpeshIns *ins = invoke->arg_ins[i]; switch (ins->info->opcode) { case MVM_OP_arg_i: case MVM_OP_arg_s: case MVM_OP_arg_n: case MVM_OP_arg_o: { MVMint16 dst = ins->operands[0].lit_i16; MVMint16 src = ins->operands[1].reg.orig; | mov TMP4, WORK[src]; | mov REGISTER:TMP5[dst], TMP4; break; } case MVM_OP_argconst_n: case MVM_OP_argconst_i: { MVMint16 dst = ins->operands[0].lit_i16; MVMint64 val = ins->operands[1].lit_i64; | mov64 TMP4, val; | mov REGISTER:TMP5[dst], TMP4; break; } case MVM_OP_argconst_s: { MVMint16 dst = ins->operands[0].lit_i16; MVMint32 idx = ins->operands[1].lit_str_idx; | get_string TMP4, idx; | mov REGISTER:TMP5[dst], TMP4; break; } default: MVM_panic(1, "JIT invoke: Can't add arg <%s>", ins->info->name); } } /* if we're not fast, then we should get the code from multi resolution */ if (!invoke->is_fast) { /* first, save callsite and args */ | mov qword [rbp-0x28], TMP5; // args | mov qword [rbp-0x30], TMP6; // callsite /* setup call MVM_frame_multi_ok(tc, code, &cur_callsite, args); */ | mov ARG1, TC; | mov ARG2, WORK[invoke->code_register]; // code object | lea ARG3, [rbp-0x30]; // &cur_callsite | mov ARG4, TMP5; // args |.if WIN32; | mov qword [rsp+0x20], 0 |.else; | mov ARG5, 0; // NULL to &was_multi |.endif | callp &MVM_frame_find_invokee_multi_ok; /* restore callsite, args, RV now holds code object */ | mov TMP6, [rbp-0x30]; // callsite | mov TMP5, [rbp-0x28]; // args /* setup args for call to invoke(tc, code, cur_callsite, args) */ | mov ARG1, TC; | mov ARG2, RV; // code object | mov ARG3, TMP6; // callsite | mov ARG4, TMP5; // args /* get the actual function */ | mov FUNCTION, OBJECT:RV->st; | mov FUNCTION, STABLE:FUNCTION->invoke; | call FUNCTION; } else { /* call MVM_frame_invoke_code */ | mov ARG1, TC; | mov ARG2, WORK[invoke->code_register]; | mov ARG3, TMP6; // this is the callsite object | mov ARG4, invoke->spesh_cand; | callp &MVM_frame_invoke_code; } /* Almost done. jump out into the interprete */ | jmp ->exit; } void MVM_jit_emit_jumplist(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitGraph *jg, MVMJitJumpList *jumplist) { MVMint32 i; MVM_jit_log(tc, "Emit jumplist (%"PRId64" labels)\n", jumplist->num_labels); | mov TMP1, WORK[jumplist->reg]; | cmp TMP1, 0; | jl >2; | cmp TMP1, jumplist->num_labels; | jge >2; | imul TMP1, 0x8; // 8 bytes per goto | lea TMP2, [>1]; | add TMP2, TMP1; | jmp TMP2; |.align 8; |1: for (i = 0; i < jumplist->num_labels; i++) { |=>(jumplist->in_labels[i]): | jmp =>(jumplist->out_labels[i]); |.align 8; } |2: } void MVM_jit_emit_control(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitControl *ctrl, MVMJitTile *tile) { /* TODO - rename invokish and pre and post invokish into something that makes more sense */ MVMJitControlType type = (tile != NULL ? tile->args[0] : ctrl->type); MVMint8 tmp = (tile != NULL ? tile->values[0] : MVM_JIT_REG(RCX)); if (type == MVM_JIT_CONTROL_INVOKISH) { MVM_jit_log(tc, "Emit invokish control guard\n"); /* This relies on the fact that MVM_JIT_THROWISH_PRE has already * assigned the jit entry label */ | mov eax, dword TC->current_frame_nr; | cmp eax, FRAME_NR; | je >9; | jmp ->exit; |9: } else if (type == MVM_JIT_CONTROL_DYNAMIC_LABEL) { MVM_jit_log(tc, "Emit dynamic label\n"); /* This pre-loads a label for the next op, so that throwish * operators will know where we're throwing from - NB, I'm not * totally sure this is still necessary now */ | lea rax, [>1]; | mov Rq(tmp), TC->cur_frame; | mov aword FRAME:Rq(tmp)->jit_entry_label, rax; |1: } else if (type == MVM_JIT_CONTROL_THROWISH_PRE) { MVM_jit_log(tc, "Emit throwish pre\n"); /* Store a reference to the 9 label below. I assume this label isn't * used in the intermediate instructions, which is basically valid * throughout this codebase. */ | lea Rq(tmp), [>9]; | mov rax, TC->cur_frame; | mov aword FRAME:rax->jit_entry_label, Rq(tmp); } else if (type == MVM_JIT_CONTROL_THROWISH_POST) { MVM_jit_log(tc, "Emit throwish post\n"); /* check if our current frame is the same as it was */ | mov eax, dword TC->current_frame_nr; | cmp eax, FRAME_NR; | jne >8; /* if it is, we may still be in a goto-handler, so in that * case the throwing machinery should have ensured that * jit_entry_label now points to the correct label. If not, it * still points to 9:. */ | mov rax, TC->cur_frame; | jmp aword FRAME:rax->jit_entry_label; /* if not the same frame, trampoline to interpreter */ |8: | jmp ->exit; /* I assume we *never* use a local label 9 in the code between * pre-and-post throwish */ |9: } else if (type == MVM_JIT_CONTROL_CHECK_RETURN) { /* special case for sp_findmeth */ | test RV, RV; | jnz ->exit; |9: } else if (type == MVM_JIT_CONTROL_BREAKPOINT) { /* brrts evil testing purposes breakpoint */ | int 3; } else { MVM_panic(1, "Unknown control code: <%s>", ctrl->ins->info->name); } } void MVM_jit_emit_load(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMint32 reg_cls, MVMint8 reg_dst, MVMint32 mem_cls, MVMint32 mem_src, MVMint32 size) { MVMint8 mem_base; if (mem_cls == MVM_JIT_STORAGE_LOCAL) { mem_base = MVM_JIT_REG(RBX); } else if (mem_cls == MVM_JIT_STORAGE_STACK) { mem_base = MVM_JIT_REG(RSP); } else { MVM_panic(1, "Cannot refer to this memory class: %d", mem_cls); } if (reg_cls == MVM_JIT_STORAGE_GPR) { switch(size) { case 1: | mov Rb(reg_dst), byte [Rq(mem_base)+mem_src]; break; case 2: | mov Rw(reg_dst), word [Rq(mem_base)+mem_src]; break; case 4: | mov Rd(reg_dst), dword [Rq(mem_base)+mem_src]; break; case 8: | mov Rq(reg_dst), qword [Rq(mem_base)+mem_src]; break; } } } void MVM_jit_emit_store(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMint32 mem_cls, MVMint32 mem_dst, MVMint32 reg_cls, MVMint8 reg_src, MVMint32 size) { MVMint8 mem_base; if (mem_cls == MVM_JIT_STORAGE_LOCAL) { mem_base = MVM_JIT_REG(RBX); } else if (mem_cls == MVM_JIT_STORAGE_STACK) { mem_base = MVM_JIT_REG(RSP); } else { MVM_panic(1, "Cannot refer to this memory class: %d", mem_cls); } if (reg_cls == MVM_JIT_STORAGE_GPR) { switch (size) { case 1: | mov byte [Rq(mem_base)+mem_dst], Rb(reg_src); break; case 2: | mov word [Rq(mem_base)+mem_dst], Rw(reg_src); break; case 4: | mov dword [Rq(mem_base)+mem_dst], Rd(reg_src); break; case 8: | mov qword [Rq(mem_base)+mem_dst], Rq(reg_src); break; } } } void MVM_jit_emit_copy(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMint32 dst_cls, MVMint8 dst_reg, MVMint32 src_cls, MVMint8 src_reg) { if (dst_cls == src_cls) { if (dst_cls == MVM_JIT_STORAGE_GPR) { | mov Rq(dst_reg), Rq(src_reg); } else { MVM_oops(tc, "numeric regs nyi"); } } else { MVM_oops(tc, "numeric regs nyi"); } } void MVM_jit_emit_marker(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMint32 num) { MVMint32 i; for (i = 0; i < num; i++) { | nop; } } void MVM_jit_emit_data(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitData *data) { MVMuint8 *bytes = data->data; MVMint32 i; |.data; |=>(data->label): for (i = 0; i < data->size; i++) { |.byte bytes[i]; } |.code } void MVM_jit_emit_save_rv(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMint16 slot) { | mov [rbp-(0x28+slot*8)], RV; } /* import tiles */ |.include src/jit/x64/tiles.dasc MoarVM-2018.03/src/jit/x64/tile_decl.h0000644000175000017510000000227613242626641017313 0ustar samanthasamanthaMVM_JIT_TILE_DECL(addr); MVM_JIT_TILE_DECL(idx); MVM_JIT_TILE_DECL(const_reg); MVM_JIT_TILE_DECL(load_lbl); MVM_JIT_TILE_DECL(load_reg); MVM_JIT_TILE_DECL(load_addr); MVM_JIT_TILE_DECL(load_idx); MVM_JIT_TILE_DECL(cast); MVM_JIT_TILE_DECL(cast_load_addr); MVM_JIT_TILE_DECL(store); MVM_JIT_TILE_DECL(store_addr); MVM_JIT_TILE_DECL(store_idx); MVM_JIT_TILE_DECL(add_reg); MVM_JIT_TILE_DECL(add_const); MVM_JIT_TILE_DECL(add_load_addr); MVM_JIT_TILE_DECL(add_load_idx); MVM_JIT_TILE_DECL(sub_reg); MVM_JIT_TILE_DECL(sub_const); MVM_JIT_TILE_DECL(sub_load_addr); MVM_JIT_TILE_DECL(sub_load_idx); MVM_JIT_TILE_DECL(and_reg); MVM_JIT_TILE_DECL(and_const); MVM_JIT_TILE_DECL(and_load_addr); MVM_JIT_TILE_DECL(and_load_idx); MVM_JIT_TILE_DECL(or_reg); MVM_JIT_TILE_DECL(xor_reg); MVM_JIT_TILE_DECL(not_reg); MVM_JIT_TILE_DECL(test); MVM_JIT_TILE_DECL(test_addr); MVM_JIT_TILE_DECL(test_idx); MVM_JIT_TILE_DECL(test_and); MVM_JIT_TILE_DECL(test_const); MVM_JIT_TILE_DECL(test_addr_const); MVM_JIT_TILE_DECL(cmp); MVM_JIT_TILE_DECL(flagval); MVM_JIT_TILE_DECL(mark); MVM_JIT_TILE_DECL(label); MVM_JIT_TILE_DECL(branch_label); MVM_JIT_TILE_DECL(call); MVM_JIT_TILE_DECL(call_func); MVM_JIT_TILE_DECL(call_addr); MoarVM-2018.03/src/jit/x64/tile_pattern.tile0000644000175000017510000000712113242626641020561 0ustar samanthasamantha# -*-whitespace-*- # Terminals: reg, mem, flag, void, expr, lab # # # Virtual Machine Values # (define: (stack) reg:rsp) (define: (local) reg:rbx) (define: (cu) reg:r13) (define: (tc) reg:r14) # # CONTROL STATEMENTS # (define: (all flag) flag) (define: (any flag) flag) (define: (if flag reg) reg) (define: (ifv flag void) void) (define: (when flag void) void) (define: (discard reg) void) (define: (do void reg) reg) (define: (dov void void) void) # INVOKISH / THROWISH (define: (guard void $before $after) void) # # ALIASING # (define: (copy reg) reg) # # MEMORY TRAFFIC # (tile: addr (addr reg $ofs) reg 2) (tile: idx (idx reg reg $scl) reg 2) (tile: const_reg (const $val $size) reg 2) (tile: load_reg (load reg $size) reg 5) (tile: load_addr (load (addr reg $ofs) $size) reg 5) (tile: load_idx (load (idx reg reg $scale) $size) reg 5) (tile: store (store reg reg $size) void 5) (tile: store_addr (store (addr reg $ofs) reg $size) void 5) (tile: store_idx (store (idx reg reg $scl) reg $size) void 5) (tile: cast (cast reg $to_size $from_size $signed) reg 2) (tile: cast_load_addr (cast (load (addr reg $ofs) $src_sz) $dst_size $signed) reg 5) # # ARITHMETIC # (tile: add_reg (add reg reg) reg 2) (tile: add_const (add reg (const $val $size)) reg 3) (tile: add_load_addr (add reg (load (addr reg $ofs) $sz)) reg 6) (tile: add_load_idx (add reg (load (idx reg reg $scale) $size)) reg 6) (tile: and_reg (and reg reg) reg 2) (tile: and_const (and reg (const $val $size)) reg 3) (tile: and_load_addr (and reg (load (andr reg $ofs) $sz)) reg 6) (tile: and_load_idx (and reg (load (idx reg reg $scale) $size)) reg 6) (tile: or_reg (or reg reg) reg 2) (tile: xor_reg (xor reg reg) reg 2) (tile: not_reg (not reg) reg 2) (tile: sub_reg (sub reg reg) reg 2) (tile: sub_const (sub reg (const $val $size)) reg 3) (tile: sub_load_addr (sub reg (load (subr reg $ofs) $sz)) reg 6) (tile: sub_load_idx (sub reg (load (idx reg reg $scale) $size)) reg 6) # # Tests and Comparinsons # (tile: test (nz reg) flag 4) (tile: test (zr reg) flag 4) (tile: test_addr (nz (load (addr reg $ofs) $size)) flag 6) (tile: test_addr (zr (load (addr reg $ofs) $size)) flag 6) (tile: test_idx (nz (load (idx reg reg $scl) $size)) flag 6) (tile: test_idx (zr (load (idx reg reg $scl) $size)) flag 6) (tile: test_and (nz (and reg reg)) flag 6) (tile: test_and (zr (and reg reg)) flag 6) # special tests (tile: test_const (nz (and reg (const $val $size))) flag 4) (tile: test_const (zr (and reg (const $val $size))) flag 4) # never executed, huh? (tile: test_addr_const (nz (and (load (addr reg $ofs) $size) (const $val $size))) flag 4) (tile: test_addr_const (zr (and (load (addr reg $ofs) $size) (const $val $size))) flag 4) (tile: cmp (eq reg reg) flag 2) (tile: cmp (lt reg reg) flag 2) (tile: cmp (gt reg reg) flag 2) (tile: cmp (ne reg reg) flag 2) (tile: cmp (le reg reg) flag 2) (tile: cmp (ge reg reg) flag 2) (tile: flagval (flagval flag) reg 2) # Labels and branches (tile: mark (mark $label) void 1) (tile: label (label $name) reg 2) # (tile: branch (branch $reg) void 2) (tile: branch_label (branch (label $name)) void 2) # placeholder for arglist pseudotile (define: (arglist (carg reg)) c_args 1) (tile: call (call reg c_args $size) reg 4) (tile: call (callv reg c_args) void 4) (tile: call_func (call (const $ptr $sz) c_args $size) reg 4) (tile: call_func (callv (const $ptr $sz) c_args) void 4) (tile: call_addr (call (load (addr reg $ofs) $sz) c_args $size) reg 4) (tile: call_addr (callv (load (addr reg $ofs) $sz) c_args) void 4) MoarVM-2018.03/src/jit/x64/tiles.dasc0000644000175000017510000005137313252330426017166 0ustar samanthasamantha/* -*-C-*- */ #include "tile_decl.h" /* NB: The rax/eax/ax/al/ah register is *reserved* for internal use in tiles by * the register allocator. Using rax will never overwrite an allocated value */ /* basic memory traffic tiles */ MVM_JIT_TILE_DECL(addr) { MVMint8 out = tile->values[0]; MVMint8 base = tile->values[1]; MVMint32 ofs = tile->args[0]; | lea Rq(out), [Rq(base)+ofs]; } MVM_JIT_TILE_DECL(idx) { MVMint8 out = tile->values[0]; MVMint8 base = tile->values[1]; MVMint8 idx = tile->values[2]; MVMint8 scl = tile->args[0]; if (scl == 8) { | lea Rq(out), [Rq(base)+Rq(idx)*8]; } else { MVM_oops(tc, "Scales other than 8 NYI\n"); } } MVM_JIT_TILE_DECL(const_reg) { MVMint8 out = tile->values[0]; MVMint64 val = tile->args[0]; MVMint32 size = tile->args[1]; if (size == 8 && !fits_in_32_bit(val)) { | mov64 Rq(out), val; } else { | mov Rq(out), val; } } MVM_JIT_TILE_DECL(load_reg) { MVMint8 out = tile->values[0]; MVMint8 base = tile->values[1]; MVMint32 size = tile->args[0]; switch (size) { case 1: | mov Rb(out), [Rq(base)]; break; case 2: | mov Rw(out), [Rq(base)]; break; case 4: | mov Rd(out), [Rq(base)]; break; case 8: | mov Rq(out), [Rq(base)]; break; default: MVM_oops(tc, "Unsupported load size: %d\n", size); } } MVM_JIT_TILE_DECL(load_addr) { MVMint8 out = tile->values[0]; MVMint8 base = tile->values[1]; MVMint32 ofs = tile->args[0]; MVMint32 size = tile->args[1]; switch (tile->args[1]) { case 1: | mov Rb(out), byte [Rq(base)+ofs]; break; case 2: | mov Rw(out), word [Rq(base)+ofs]; break; case 4: | mov Rd(out), dword [Rq(base)+ofs]; break; case 8: | mov Rq(out), qword [Rq(base)+ofs]; break; default: MVM_oops(tc, "Unsupported load size: %d\n", size); } } MVM_JIT_TILE_DECL(load_idx) { MVMint8 out = tile->values[0]; MVMint8 base = tile->values[1]; MVMint8 idx = tile->values[2]; MVMint8 scl = tile->args[0]; MVMint32 size = tile->args[1]; if (scl != 8) { MVM_oops(tc, "Unsupported scale size: %d\n", scl); } switch (size) { case 1: | mov Rb(out), byte [Rq(base)+Rq(idx)*8]; break; case 2: | mov Rw(out), word [Rq(base)+Rq(idx)*8]; break; case 4: | mov Rd(out), dword [Rq(base)+Rq(idx)*8]; break; case 8: | mov Rq(out), qword [Rq(base)+Rq(idx)*8]; break; default: MVM_oops(tc, "Unsupported load size: %d\n", size); } } MVM_JIT_TILE_DECL(store) { MVMint8 base = tile->values[1]; MVMint8 value = tile->values[2]; MVMint32 size = tile->args[0]; switch (size) { case 1: | mov byte [Rq(base)], Rb(value); break; case 2: | mov word [Rq(base)], Rw(value); break; case 4: | mov dword [Rq(base)], Rd(value); break; case 8: | mov qword [Rq(base)], Rq(value); break; default: MVM_oops(tc, "Unsupported store size: %d\n", size); } } MVM_JIT_TILE_DECL(store_addr) { MVMint8 base = tile->values[1]; MVMint8 value = tile->values[2]; MVMint32 ofs = tile->args[0]; MVMint32 size = tile->args[1]; switch (size) { case 1: | mov byte [Rq(base)+ofs], Rb(value); break; case 2: | mov word [Rq(base)+ofs], Rw(value); break; case 4: | mov dword [Rq(base)+ofs], Rd(value); break; case 8: | mov qword [Rq(base)+ofs], Rq(value); break; default: MVM_oops(tc, "Unsupported store size: %d\n", size); } } MVM_JIT_TILE_DECL(store_idx) { MVMint8 base = tile->values[1]; MVMint8 idx = tile->values[2]; MVMint8 scl = tile->args[0]; MVMint32 size = tile->args[1]; MVMint8 value = tile->values[3]; if (scl != 8) MVM_oops(tc, "Scale %d NYI\n", scl); switch (size) { case 1: | mov byte [Rq(base)+Rq(idx)*8], Rb(value); break; case 2: | mov word [Rq(base)+Rq(idx)*8], Rw(value); break; case 4: | mov dword [Rq(base)+Rq(idx)*8], Rd(value); break; case 8: | mov qword [Rq(base)+Rq(idx)*8], Rq(value); break; default: MVM_oops(tc, "Unsupported store size: %d\n", size); } } MVM_JIT_TILE_DECL(cast) { MVMint32 to_size = tile->args[0]; MVMint32 from_size = tile->args[1]; MVMint32 is_signed = tile->args[2]; MVMint8 to_reg = tile->values[0]; MVMint8 from_reg = tile->values[1]; /* possible combinations: 1 -> 2, 4, 8; 2 -> 4, 8; 4 -> 8 * Hence we can combine from_size | (to_size << 3) to get * the following options: * 1 + 2<<3 == 17 * 1 + 4<<3 == 33 * 1 + 8<<3 == 65 * 2 + 4<<3 == 34 * 2 + 8<<3 == 66 * 4 + 8<<3 == 68 */ MVMint32 size_conv = (from_size) | (to_size << 3); if (is_signed == MVM_JIT_SIGNED) { switch (size_conv) { case 17: | movsx Rw(to_reg), Rb(from_reg); break; case 33: | movsx Rd(to_reg), Rb(from_reg); break; case 34: | movsx Rd(to_reg), Rw(from_reg); break; case 65: | movsx Rq(to_reg), Rb(from_reg); break; case 66: | movsx Rq(to_reg), Rw(from_reg); break; case 68: /* movsx is apparantly not defined for double-to-quadword conversions, * which forces us to use the rax register like it's 1978. It might be easier * to bithack the sign-extension manually, but I'm not sure how.. */ | mov eax, Rd(from_reg); | cdqe; | mov Rq(to_reg), rax; break; default: MVM_oops(tc, "Unsupported signed cast %d -> %d\n", from_size, to_size); } } else { switch (size_conv) { case 17: | movzx Rw(to_reg), Rb(from_reg); break; case 33: | movzx Rd(to_reg), Rb(from_reg); break; case 34: | movzx Rd(to_reg), Rw(from_reg); break; case 65: | movzx Rq(to_reg), Rb(from_reg); break; case 66: | movzx Rq(to_reg), Rw(from_reg); break; case 68: /* In contrast, nothing special is necessary to cast unsigned * doublewords to quadwords, because using the lower 4 bytes * automatically clears the upper 4 */ | mov Rd(to_reg), Rd(from_reg); break; default: MVM_oops(tc, "Unsupported unsigned cast %d -> %d\n", from_size, to_size); } } } MVM_JIT_TILE_DECL(cast_load_addr) { MVM_oops(tc, "NYI"); } /* binary operations have special requirements because x86 is two-operand form, e.g: * r0 = r0 r1 * whereas the JIT uses a three-operand model: * r0 = r1 r2 */ static void ensure_two_operand_pre(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitTile *tile, MVMint8 reg[2]) { MVMint8 out = tile->values[0], in1 = tile->values[1], in2 = tile->values[2]; if (out == in1) { reg[0] = in1; reg[1] = in2; } else if (out == in2) { if (MVM_jit_expr_op_is_binary_noncommutative(tc, tile->op)) { | mov rax, Rq(in1); reg[0] = MVM_JIT_ARCH_X64_RAX; reg[1] = in2; } else { /* in this case, r2 r1 == r0 r1 */ reg[0] = out; reg[1] = in1; } } else { /* insert a copy */ | mov Rq(out), Rq(in1); /* use r0, r2 */ reg[0] = out; reg[1] = in2; } } static void ensure_two_operand_post(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitTile *tile, MVMint8 reg[2]) { MVMint8 out = tile->values[0]; if (out != reg[0]) { /* insert a copy afterwards */ | mov Rq(out), Rq(reg[0]); } } MVM_JIT_TILE_DECL(add_reg) { MVMint8 reg[2]; ensure_two_operand_pre(tc, compiler, tile, reg); | add Rq(reg[0]), Rq(reg[1]); ensure_two_operand_post(tc, compiler, tile, reg); } MVM_JIT_TILE_DECL(add_const) { MVMint8 out = tile->values[0]; MVMint8 in1 = tile->values[1]; MVMint64 val = tile->args[0]; MVMint32 sz = tile->args[1]; if (out == in1) { if (sz == 8 && !fits_in_32_bit(val)) { | mov64 rax, val; | add Rq(out), rax; } else { | add Rq(in1), val; } } else { if (sz == 8 && !fits_in_32_bit(val)) { | mov64 Rq(out), val; | add Rq(out), Rq(in1); } else { | mov Rq(out), Rq(in1); | add Rq(out), val; } } } MVM_JIT_TILE_DECL(add_load_addr) { MVMint8 out = tile->values[0]; MVMint8 in1 = tile->values[1]; MVMint8 base = tile->values[2]; MVMint32 ofs = tile->args[0]; MVMint32 size = tile->args[1]; if (in1 != out) { | mov Rq(out), Rq(in1); } switch (size) { case 1: | add Rb(out), byte [Rq(base)+ofs]; break; case 2: | add Rw(out), word [Rq(base)+ofs]; break; case 4: | add Rd(out), dword [Rq(base)+ofs]; break; case 8: | add Rq(out), qword [Rq(base)+ofs]; break; default: MVM_oops(tc, "Unsupported load size: %d\n", size); } } MVM_JIT_TILE_DECL(add_load_idx) { MVMint8 out = tile->values[0]; MVMint8 in1 = tile->values[1]; MVMint8 base = tile->values[2]; MVMint8 idx = tile->values[3]; MVMint32 scl = tile->args[0]; MVMint32 size = tile->args[1]; if (in1 != out) { | mov Rq(out), Rq(in1); } if (scl != 8) MVM_oops(tc, "IDX Scale %d NYI\n", scl); switch (size) { case 1: | add Rb(out), byte [Rq(base)+Rq(idx)*8]; break; case 2: | add Rw(out), word [Rq(base)+Rq(idx)*8]; break; case 4: | add Rd(out), dword [Rq(base)+Rq(idx)*8]; break; case 8: | add Rq(out), qword [Rq(base)+Rq(idx)*8]; break; default: MVM_oops(tc, "Unsupported load size: %d\n", size); } } MVM_JIT_TILE_DECL(and_reg) { MVMint8 reg[2]; ensure_two_operand_pre(tc, compiler, tile, reg); | and Rq(reg[0]), Rq(reg[1]); ensure_two_operand_post(tc, compiler, tile, reg); } MVM_JIT_TILE_DECL(and_const) { MVMint8 out = tile->values[0]; MVMint8 in1 = tile->values[1]; MVMint64 val = tile->args[0]; MVMint32 sz = tile->args[1]; if (out == in1) { if (sz == 8 && !fits_in_32_bit(val)) { | mov64 rax, val; | and Rq(in1), rax; } else { | and Rq(in1), val; } } else { if (sz == 8 && !fits_in_32_bit(val)) { | mov64 Rq(out), val; | and Rq(out), Rq(in1); } else { | mov Rq(out), Rq(in1); | and Rq(out), val; } } } MVM_JIT_TILE_DECL(and_load_addr) { MVMint8 out = tile->values[0]; MVMint8 in1 = tile->values[1]; MVMint8 base = tile->values[2]; MVMint32 ofs = tile->args[0]; MVMint32 size = tile->args[1]; if (in1 != out) { | mov Rq(out), Rq(in1); } switch (size) { case 1: | and Rb(out), byte [Rq(base)+ofs]; break; case 2: | and Rw(out), word [Rq(base)+ofs]; break; case 4: | and Rd(out), dword [Rq(base)+ofs]; break; case 8: | and Rq(out), qword [Rq(base)+ofs]; break; default: MVM_oops(tc, "Unsupported load size: %d\n", size); } } MVM_JIT_TILE_DECL(and_load_idx) { MVMint8 out = tile->values[0]; MVMint8 in1 = tile->values[1]; MVMint8 base = tile->values[2]; MVMint8 idx = tile->values[3]; MVMint32 scl = tile->args[0]; MVMint32 size = tile->args[1]; if (out != in1) { | mov Rq(out), Rq(in1); } if (scl != 8) MVM_oops(tc, "IDX Scale %d NYI\n", scl); switch (size) { case 1: | and Rb(out), byte [Rq(base)+Rq(idx)*8]; break; case 2: | and Rw(out), word [Rq(base)+Rq(idx)*8]; break; case 4: | and Rd(out), dword [Rq(base)+Rq(idx)*8]; break; case 8: | and Rq(out), qword [Rq(base)+Rq(idx)*8]; break; default: MVM_oops(tc, "Unsupported load size: %d\n", size); } } MVM_JIT_TILE_DECL(or_reg) { MVMint8 reg[2]; ensure_two_operand_pre(tc, compiler, tile, reg); | or Rq(reg[0]), Rq(reg[1]); ensure_two_operand_post(tc, compiler, tile, reg); } MVM_JIT_TILE_DECL(xor_reg) { MVMint8 reg[2]; ensure_two_operand_pre(tc, compiler, tile, reg); | xor Rq(reg[0]), Rq(reg[1]); ensure_two_operand_post(tc, compiler, tile, reg); } MVM_JIT_TILE_DECL(not_reg) { MVMint8 out = tile->values[0]; MVMint8 in = tile->values[1]; if (out != in) { | mov Rq(out), Rq(in); } | not Rq(out); } MVM_JIT_TILE_DECL(sub_reg) { MVMint8 reg[2]; ensure_two_operand_pre(tc, compiler, tile, reg); | sub Rq(reg[0]), Rq(reg[1]); ensure_two_operand_post(tc, compiler, tile, reg); } MVM_JIT_TILE_DECL(sub_const) { MVMint8 out = tile->values[0]; MVMint8 in1 = tile->values[1]; MVMint64 val = tile->args[0]; MVMint32 sz = tile->args[1]; if (out == in1) { if (sz == 8 && !fits_in_32_bit(val)) { | mov64 rax, val; | sub Rq(in1), rax; } else { | sub Rq(in1), val; } } else { if (sz == 8 && !fits_in_32_bit(val)) { | mov64 rax, val; | mov Rq(out), Rq(in1); | sub Rq(out), rax; } else { | mov Rq(out), Rq(in1); | sub Rq(out), val; } } } MVM_JIT_TILE_DECL(sub_load_addr) { MVMint8 out = tile->values[0]; MVMint8 in1 = tile->values[1]; MVMint8 base = tile->values[2]; MVMint32 ofs = tile->args[0]; MVMint32 size = tile->args[1]; if (in1 != out) { | mov Rq(out), Rq(in1); } switch (size) { case 1: | sub Rb(out), byte [Rq(base)+ofs]; break; case 2: | sub Rw(out), word [Rq(base)+ofs]; break; case 4: | sub Rd(out), dword [Rq(base)+ofs]; break; case 8: | sub Rq(out), qword [Rq(base)+ofs]; break; default: MVM_oops(tc, "Unsupported load size: %d\n", size); } } MVM_JIT_TILE_DECL(sub_load_idx) { MVMint8 out = tile->values[0]; MVMint8 in1 = tile->values[1]; MVMint8 base = tile->values[2]; MVMint8 idx = tile->values[3]; MVMint32 scl = tile->args[0]; MVMint32 size = tile->args[1]; if (out != in1) { | mov Rq(out), Rq(in1); } if (scl != 8) MVM_oops(tc, "IDX Scale %d NYI\n", scl); switch (size) { case 1: | sub Rb(out), byte [Rq(base)+Rq(idx)*8]; break; case 2: | sub Rw(out), word [Rq(base)+Rq(idx)*8]; break; case 4: | sub Rd(out), dword [Rq(base)+Rq(idx)*8]; break; case 8: | sub Rq(out), qword [Rq(base)+Rq(idx)*8]; break; default: MVM_oops(tc, "Unsupported load size: %d\n", size); } } MVM_JIT_TILE_DECL(test) { MVMint8 reg = tile->values[1]; switch (tile->size) { case 1: | test Rb(reg), Rb(reg); break; case 2: | test Rw(reg), Rw(reg); break; case 4: | test Rd(reg), Rd(reg); break; case 8: default: /* NB - this is a hack, because we don't assign a size to the result of * CALL, its size would be 0, and we'd have nothing compiled. Better fix * would be to assign a result size to CALL. */ | test Rq(reg), Rq(reg); break; } } MVM_JIT_TILE_DECL(test_addr) { MVMint8 base = tile->values[1]; MVMint32 ofs = tile->args[0]; MVMint32 size = tile->args[1]; switch (size) { case 1: | cmp byte [Rq(base)+ofs], 0; break; case 2: | cmp word [Rq(base)+ofs], 0; break; case 4: | cmp dword [Rq(base)+ofs], 0; break; case 8: | cmp qword [Rq(base)+ofs], 0; break; default: MVM_oops(tc, "Unsupported size %d for load\n", size); } } MVM_JIT_TILE_DECL(test_idx) { MVMint8 base = tile->values[1]; MVMint8 idx = tile->values[2]; MVMint32 scl = tile->args[0]; MVMint32 size = tile->args[1]; if (scl != 8) MVM_oops(tc, "Scale %d NYI\n", scl); switch(size) { case 1: | cmp byte [Rq(base)+Rq(idx)*8], 0; break; case 2: | cmp word [Rq(base)+Rq(idx)*8], 0; break; case 4: | cmp dword [Rq(base)+Rq(idx)*8], 0; break; case 8: | cmp qword [Rq(base)+Rq(idx)*8], 0; break; default: MVM_oops(tc, "Unsupported size %d for load\n", tile->size); } } MVM_JIT_TILE_DECL(test_and) { MVMint8 rega = tile->values[1]; MVMint8 regb = tile->values[2]; switch(tile->size) { case 1: | test Rb(regb), Rb(rega); break; case 2: | test Rw(regb), Rw(rega); break; case 4: | test Rd(regb), Rd(rega); break; case 8: | test Rq(regb), Rq(rega); break; } } MVM_JIT_TILE_DECL(test_const) { MVMint8 reg = tile->values[1]; MVMint64 val = tile->args[0]; switch(tile->size) { case 1: | test Rb(reg), val; break; case 2: | test Rw(reg), val; break; case 4: | test Rd(reg), val; break; case 8: if (fits_in_32_bit(val)) { | test Rq(reg), val; } else { | mov64 rax, val; | test Rq(reg), rax; } break; } } MVM_JIT_TILE_DECL(test_addr_const) { MVMint8 reg = tile->values[1]; /* args: $ofs $lsize $val $csize */ MVMint32 ofs = tile->args[0]; MVMint64 val = tile->args[2]; switch(tile->size) { case 1: | test byte [Rq(reg)+ofs], val; break; case 2: | test word [Rq(reg)+ofs], val; break; case 4: | test dword [Rq(reg)+ofs], val; break; case 8: if (fits_in_32_bit(val)) { | test qword [Rq(reg)+ofs], val; } else { | mov64 rax, val; | test qword [Rq(reg)+ofs], rax; } break; } } MVM_JIT_TILE_DECL(cmp) { MVMint8 regl = tile->values[1]; MVMint8 regr = tile->values[2]; switch (tile->size) { case 1: | cmp Rb(regl), Rb(regr); break; case 2: | cmp Rw(regl), Rw(regr); break; case 4: | cmp Rd(regl), Rd(regr); break; case 8: | cmp Rq(regl), Rq(regr); break; } } MVM_JIT_TILE_DECL(flagval) { MVMint8 out = tile->values[0]; MVMint32 child = tree->nodes[tile->node + 1]; MVMint32 flag = tree->nodes[child]; switch (flag) { case MVM_JIT_LT: | setl Rb(out); break; case MVM_JIT_LE: | setle Rb(out); break; case MVM_JIT_ZR: case MVM_JIT_EQ: | setz Rb(out); break; case MVM_JIT_NZ: case MVM_JIT_NE: | setnz Rb(out); break; case MVM_JIT_GE: | setge Rb(out); break; case MVM_JIT_GT: | setg Rb(out); break; default: MVM_panic(1, "No flagval possible"); break; } /* XXX THIS IS A HACK * The size cast is supposed to be applied by the expression template * builder, but that subtly doesn't work (it's not applied for STORE * operands, and when it is, it causes even subtler errors with CONST * arguments. (const_i64_16 returns a 64 bit signed integer as a 16 bit * signed integer argument, and currently CONST doesn't have a sign, and the * tile yielding the value (fortunately) doesn't respect the size. */ | movzx Rq(out), Rb(out); } MVM_JIT_TILE_DECL(mark) { MVMint32 label = tile->args[0]; |=>(label): } MVM_JIT_TILE_DECL(label) { MVMint8 reg = tile->values[0]; MVMint32 label = tile->args[0]; | lea Rq(reg), [=>label]; } MVM_JIT_TILE_DECL(branch_label) { MVMint32 label = tile->args[0]; if (label >= 0) { | jmp =>(label); } else { | jmp ->exit; } } static void move_call_value(MVMThreadContext *tc, MVMJitCompiler *compiler, MVMJitTile *tile) { if (MVM_JIT_TILE_YIELDS_VALUE(tile)) { MVMint8 out = tile->values[0]; | mov Rq(out), rax; } } MVM_JIT_TILE_DECL(call) { MVMint8 reg = tile->values[1]; | call Rq(reg); move_call_value(tc, compiler, tile); } MVM_JIT_TILE_DECL(call_func) { MVMint64 ptr = tile->args[0]; | callp ptr; move_call_value(tc, compiler, tile); } MVM_JIT_TILE_DECL(call_addr) { MVMint8 reg = tile->values[1]; MVMint32 ofs = tile->args[0]; | call qword [Rq(reg)+ofs]; move_call_value(tc, compiler, tile); } MoarVM-2018.03/src/main.c0000644000175000017510000002175613252330426015075 0ustar samanthasamantha#include #include #include #include #if MVM_TRACING # define TRACING_OPT "[--tracing] " # define TRACING_USAGE "\n --tracing output a line to stderr on every interpreter instr" #else # define TRACING_OPT "" # define TRACING_USAGE "" #endif #ifdef HAVE_TELEMEH # define TELEMEH_USAGE " MVM_TELEMETRY_LOG Log internal events at high precision to this file\n" #else # define TELEMEH_USAGE "" #endif #ifndef _WIN32 # include "signal.h" #endif #ifndef _WIN32 # include #else # include #endif #ifdef _WIN32 # define snprintf _snprintf #endif #if defined(_MSC_VER) #define strtoll _strtoi64 #endif /* flags need to be sorted alphabetically */ enum { NOT_A_FLAG = -2, UNKNOWN_FLAG = -1, FLAG_CRASH, FLAG_SUSPEND, FLAG_DUMP, FLAG_FULL_CLEANUP, FLAG_HELP, FLAG_TRACING, FLAG_VERSION, OPT_EXECNAME, OPT_LIBPATH, OPT_DEBUGPORT }; static const char *const FLAGS[] = { "--crash", "--debug-suspend", "--dump", "--full-cleanup", "--help", "--tracing", "--version", }; static const char USAGE[] = "\ USAGE: moar [--crash] [--libpath=...] " TRACING_OPT "input.moarvm [program args]\n\ moar --dump input.moarvm\n\ moar --help\n\ \n\ --help display this message\n\ --dump dump the bytecode to stdout instead of executing\n\ --full-cleanup try to free all memory and exit cleanly\n\ --crash abort instead of exiting on unhandled exception\n\ --libpath specify path loadbytecode should search in\n\ --version show version information\n\ --debug-port=1234 listen for incoming debugger connections\n\ --debug-suspend pause execution at the entry point" TRACING_USAGE "\n\ \n\ The following environment variables are respected:\n\ \n\ MVM_SPESH_DISABLE Disables all dynamic optimization\n\ MVM_SPESH_INLINE_DISABLE Disables inlining\n\ MVM_SPESH_OSR_DISABLE Disables on-stack replacement\n\ MVM_SPESH_BLOCKING Blocks log-sending thread while specializer runs\n\ MVM_SPESH_LOG Specifies a dynamic optimizer log file\n\ MVM_SPESH_NODELAY Run dynamic optimization even for cold frames\n\ MVM_SPESH_LIMIT Limit the maximum number of specializations\n\ MVM_JIT_DISABLE Disables JITting to machine code\n\ MVM_JIT_EXPR_DISABLE Disable advanced 'expression' JIT\n\ MVM_JIT_LOG Specifies a JIT-compiler log file\n\ MVM_JIT_BYTECODE_DIR Specifies a directory for JIT bytecode dumps\n\ MVM_CROSS_THREAD_WRITE_LOG Log unprotected cross-thread object writes to stderr\n\ MVM_COVERAGE_LOG Append (de-duped by default) line-by-line coverage messages to this file\n\ MVM_COVERAGE_CONTROL If set to 1, non-de-duping coverage started with nqp::coveragecontrol(1),\n\ if set to 2, non-de-duping coverage started right away\n" TELEMEH_USAGE; static int cmp_flag(const void *key, const void *value) { return strcmp(key, *(char **)value); } static int starts_with(const char *str, const char *want) { size_t str_len = strlen(str); size_t want_len = strlen(want); return str_len < want_len ? 0 : strncmp(str, want, want_len) == 0; } static int parse_flag(const char *arg) { const char *const *found; if (!arg || arg[0] != '-') return NOT_A_FLAG; found = bsearch(arg, FLAGS, sizeof FLAGS / sizeof *FLAGS, sizeof *FLAGS, cmp_flag); if (found) return (int)(found - FLAGS); else if (starts_with(arg, "--libpath=")) return OPT_LIBPATH; else if (starts_with(arg, "--execname=")) return OPT_EXECNAME; else if (starts_with(arg, "--debug-port=")) return OPT_DEBUGPORT; else return UNKNOWN_FLAG; } #ifndef _WIN32 int main(int argc, char *argv[]) #else int wmain(int argc, wchar_t *wargv[]) #endif { MVMInstance *instance; const char *input_file; const char *executable_name = NULL; const char *lib_path[8]; #ifdef _WIN32 char **argv = MVM_UnicodeToUTF8_argv(argc, wargv); #endif int dump = 0; int full_cleanup = 0; int argi = 1; int lib_path_i = 0; int flag; unsigned int interval_id; char telemeh_inited = 0; MVMuint32 debugserverport = 0; int start_suspended = 0; for (; (flag = parse_flag(argv[argi])) != NOT_A_FLAG; ++argi) { switch (flag) { case FLAG_CRASH: MVM_crash_on_error(); continue; case FLAG_DUMP: dump = 1; continue; case FLAG_FULL_CLEANUP: full_cleanup = 1; continue; case FLAG_HELP: puts(USAGE); return EXIT_SUCCESS; #if MVM_TRACING case FLAG_TRACING: MVM_interp_enable_tracing(); continue; #endif case FLAG_SUSPEND: start_suspended = 1; continue; case OPT_EXECNAME: executable_name = argv[argi] + strlen("--execname="); continue; case OPT_LIBPATH: if (lib_path_i == 7) { /* 0..7 == 8 */ fprintf(stderr, "ERROR: Only up to eight --libpath options are allowed.\n"); return EXIT_FAILURE; } lib_path[lib_path_i++] = argv[argi] + strlen("--libpath="); continue; case FLAG_VERSION: { char *spesh_disable; char *jit_disable; printf("This is MoarVM version %s", MVM_VERSION); if (MVM_jit_support()) { printf(" built with JIT support"); spesh_disable = getenv("MVM_SPESH_DISABLE"); jit_disable = getenv("MVM_JIT_DISABLE"); if (spesh_disable && strlen(spesh_disable) != 0) { printf(" (disabled via MVM_SPESH_DISABLE)"); } else if (jit_disable && strlen(jit_disable) != 0) { printf(" (disabled via MVM_JIT_DISABLE)"); } } printf("\n"); return EXIT_SUCCESS; } case OPT_DEBUGPORT: { MVMint64 port; char *portstr = argv[argi] + strlen("--debugport=") + 1; char *endptr; port = strtoll(portstr, &endptr, 10); if (*endptr != '\0') { fprintf(stderr, "ERROR: Invalid characters in debug port flag: %s\n", portstr); return EXIT_FAILURE; } if (port <= 1024 || port > 65535) { fprintf(stderr, "ERROR: debug server port out of range. We only accept ports above 1024 and below 65535. (got: %lu)\n", port); return EXIT_FAILURE; } debugserverport = (MVMuint32)port; break; } default: fprintf(stderr, "ERROR: Unknown flag %s.\n\n%s\n", argv[argi], USAGE); return EXIT_FAILURE; } } #ifdef HAVE_TELEMEH if (getenv("MVM_TELEMETRY_LOG")) { char path[256]; FILE *fp; snprintf(path, 255, "%s.%d", getenv("MVM_TELEMETRY_LOG"), #ifdef _WIN32 _getpid() #else getpid() #endif ); fp = fopen(path, "w"); if (fp) { MVM_telemetry_init(fp); telemeh_inited = 1; interval_id = MVM_telemetry_interval_start(0, "moarvm startup"); } } #endif lib_path[lib_path_i] = NULL; if (argi >= argc) { fprintf(stderr, "ERROR: Missing input file.\n\n%s\n", USAGE); return EXIT_FAILURE; } instance = MVM_vm_create_instance(); input_file = argv[argi++]; /* stash the rest of the raw command line args in the instance */ MVM_vm_set_clargs(instance, argc - argi, argv + argi); MVM_vm_set_prog_name(instance, input_file); MVM_vm_set_exec_name(instance, executable_name); MVM_vm_set_lib_path(instance, lib_path_i, lib_path); /* Ignore SIGPIPE by default, since we error-check reads/writes. This does * not prevent users from setting up their own signal handler for SIGPIPE, * which will take precedence over this ignore. */ #ifndef _WIN32 signal(SIGPIPE, SIG_IGN); #endif if (debugserverport > 0) { MVM_debugserver_init(instance->main_thread, debugserverport); if (start_suspended) { instance->main_thread->gc_status = MVMGCStatus_INTERRUPT | MVMSuspendState_SUSPEND_REQUEST; } } if (dump) MVM_vm_dump_file(instance, input_file); else MVM_vm_run_file(instance, input_file); if (getenv("MVM_TELEMETRY_LOG") && telemeh_inited) { MVM_telemetry_interval_stop(0, interval_id, "moarvm teardown"); MVM_telemetry_finish(); } if (full_cleanup) { MVM_vm_destroy_instance(instance); return EXIT_SUCCESS; } else { MVM_vm_exit(instance); } } MoarVM-2018.03/src/mast/compiler.c0000644000175000017510000017666113242626641016743 0ustar samanthasamantha#include "moar.h" #include "nodes.h" /* Some constants. */ #define HEADER_SIZE 92 #define BYTECODE_VERSION 5 #define FRAME_HEADER_SIZE (11 * 4 + 3 * 2) #define FRAME_HANDLER_SIZE (4 * 4 + 2 * 2) #define FRAME_SLV_SIZE (2 * 2 + 2 * 4) #define SC_DEP_SIZE 4 #define EXTOP_SIZE (4 + 8) #define SCDEP_HEADER_OFFSET 12 #define EXTOP_HEADER_OFFSET 20 #define FRAME_HEADER_OFFSET 28 #define CALLSITE_HEADER_OFFSET 36 #define STRING_HEADER_OFFSET 44 #define SCDATA_HEADER_OFFSET 52 #define BYTECODE_HEADER_OFFSET 60 #define ANNOTATION_HEADER_OFFSET 68 #define HLL_NAME_HEADER_OFFSET 76 #define SPECIAL_FRAME_HEADER_OFFSET 80 #define EXTOP_BASE 1024 /* Frame flags. */ #define FRAME_FLAG_EXIT_HANDLER 1 #define FRAME_FLAG_IS_THUNK 2 #define FRAME_FLAG_HAS_CODE_OBJ 4 #define FRAME_FLAG_NO_INLINE 8 #define FRAME_FLAG_HAS_INDEX 32768 #define FRAME_FLAG_HAS_SLV 65536 typedef struct { /* callsite ID */ unsigned short callsite_id; /* the identifier for the callsite, to clean up later */ unsigned char *identifier; /* the uthash hash handle. */ UT_hash_handle hash_handle; } CallsiteReuseEntry; /* Information about a handler. */ typedef struct { /* Offset of start of protected region from frame start. */ unsigned int start_offset; /* Offset of end of protected region, exclusive, from frame start. */ unsigned int end_offset; /* Exception categry mask. */ unsigned int category_mask; /* Handler action. */ unsigned short action; /* Local holding block to invoke, if invokey handler. */ unsigned short local; /* Label, which will need resolving. */ MASTNode *label; /* Local holding a label in case we have a labeled loop. */ unsigned short label_reg; } FrameHandler; /* Handler actions. */ #define HANDLER_UNWIND_GOTO 0 #define HANDLER_UNWIND_GOTO_OBJ 1 #define HANDLER_INVOKE 2 /* Information about a label. */ typedef struct { MAST_Label *label; MVMint32 offset; /* Negative if unknown. */ MVMuint16 num_resolve; MVMuint16 alloc_resolve; MVMuint32 *resolve; } LabelInfo; /* Describes the state for the frame we're currently compiling. */ typedef struct { /* Position of start of bytecode. */ unsigned int bytecode_start; /* Position of start of frame entry. */ unsigned int frame_start; /* Types of locals and lexicals, with counts. */ unsigned short *local_types; unsigned short *lexical_types; unsigned int num_locals; unsigned int num_lexicals; /* Number of annotations. */ unsigned int num_annotations; /* Handlers count and list. */ unsigned int num_handlers; FrameHandler *handlers; /* Labels we have so far (either through finding them or finding a need * to fix them up). */ LabelInfo *labels; unsigned int num_labels; unsigned int alloc_labels; /* Number of unresolved labels. */ unsigned int unresolved_labels; } FrameState; /* Describes the current writer state for the compilation unit as a whole. */ typedef struct { /* The set of node types. */ MASTNodeTypes *types; /* The current frame and frame count. */ FrameState *cur_frame; unsigned int num_frames; /* String heap and seen hash mapping known strings to indexes. */ MASTNode *strings; MASTNode *seen_strings; /* The SC dependencies segment; we know the size up front. */ char *scdep_seg; unsigned int scdep_bytes; /* The extension ops segment; we know the size ahead of time. */ char *extops_seg; unsigned int extops_bytes; unsigned int num_extops; /* The frame segment. */ char *frame_seg; unsigned int frame_pos; unsigned int frame_alloc; /* The callsite segment and number of callsites. */ char *callsite_seg; unsigned int callsite_pos; unsigned int callsite_alloc; unsigned int num_callsites; /* The bytecode segment. */ char *bytecode_seg; unsigned int bytecode_pos; unsigned int bytecode_alloc; /* The annotation segment. */ char *annotation_seg; unsigned int annotation_pos; unsigned int annotation_alloc; /* Current instruction info */ const MVMOpInfo *current_op_info; /* Zero-based index of current frame */ unsigned int current_frame_idx; /* Zero-based index of MAST instructions */ unsigned int current_ins_idx; /* Zero-based index of current operand */ unsigned int current_operand_idx; /* The compilation unit we're compiling. */ MAST_CompUnit *cu; /* Hash for callsite descriptor strings to callsite IDs */ CallsiteReuseEntry *callsite_reuse_head; /* Last Annotated node, for error reporting */ MAST_Annotated *last_annotated; } WriterState; static unsigned int umax(unsigned int a, unsigned int b); static void memcpy_endian(char *dest, const void *src, size_t size); static void write_int64(char *buffer, size_t offset, unsigned long long value); static void write_int32(char *buffer, size_t offset, unsigned int value); static void write_int16(char *buffer, size_t offset, unsigned short value); static void write_int8(char *buffer, size_t offset, unsigned char value); static void write_double(char *buffer, size_t offset, double value); static void ensure_space(VM, char **buffer, unsigned int *alloc, unsigned int pos, unsigned int need); static void cleanup_frame(VM, FrameState *fs); static void cleanup_all(VM, WriterState *ws); static unsigned int get_string_heap_index(VM, WriterState *ws, VMSTR *strval); static unsigned short get_frame_index(VM, WriterState *ws, MASTNode *frame); static unsigned short type_to_local_type(VM, WriterState *ws, MASTNode *type); static void compile_operand(VM, WriterState *ws, unsigned char op_flags, MASTNode *operand); static unsigned short get_callsite_id(VM, WriterState *ws, MASTNode *flags, MASTNode *args); static void compile_instruction(VM, WriterState *ws, MASTNode *node); static void compile_frame(VM, WriterState *ws, MASTNode *node, unsigned short idx); static char * form_string_heap(VM, WriterState *ws, unsigned int *string_heap_size); static char * form_bytecode_output(VM, WriterState *ws, unsigned int *bytecode_size); char * MVM_mast_compile(VM, MASTNode *node, MASTNodeTypes *types, unsigned int *size); static unsigned int umax(unsigned int a, unsigned int b) { return a > b ? a : b; } /* copies memory dependent on endianness */ static void memcpy_endian(char *dest, const void *src, size_t size) { #ifdef MVM_BIGENDIAN size_t i; char *srcbytes = (char *)src; for (i = 0; i < size; i++) dest[size - i - 1] = srcbytes[i]; #else memcpy(dest, src, size); #endif } /* Writes an int64 into a buffer. */ static void write_int64(char *buffer, size_t offset, unsigned long long value) { memcpy_endian(buffer + offset, &value, 8); } /* Writes an int32 into a buffer. */ static void write_int32(char *buffer, size_t offset, unsigned int value) { memcpy_endian(buffer + offset, &value, 4); } /* Writes an int16 into a buffer. */ static void write_int16(char *buffer, size_t offset, unsigned short value) { memcpy_endian(buffer + offset, &value, 2); } /* Writes an int8 into a buffer. */ static void write_int8(char *buffer, size_t offset, unsigned char value) { memcpy(buffer + offset, &value, 1); } /* Writes an double into a buffer. */ static void write_double(char *buffer, size_t offset, double value) { memcpy_endian(buffer + offset, &value, 8); } /* Ensures the specified buffer has enough space and expands it if so. */ static void ensure_space(VM, char **buffer, unsigned int *alloc, unsigned int pos, unsigned int need) { if (pos + need > *alloc) { do { *alloc = *alloc * 2; } while (pos + need > *alloc); *buffer = (char *)MVM_realloc(*buffer, *alloc); } } /* Cleans up all allocated memory related to a frame. */ static void cleanup_frame(VM, FrameState *fs) { if (fs->local_types) MVM_free(fs->local_types); if (fs->lexical_types) MVM_free(fs->lexical_types); if (fs->handlers) MVM_free(fs->handlers); if (fs->labels) { MVMuint32 i; for (i = 0; i < fs->num_labels; i++) if (fs->labels[i].alloc_resolve) MVM_free(fs->labels[i].resolve); MVM_free(fs->labels); } MVM_free(fs); } /* Cleans up all allocated memory related to this compilation. */ static void cleanup_all(VM, WriterState *ws) { CallsiteReuseEntry *current, *tmp; unsigned bucket_tmp; if (ws->cur_frame) cleanup_frame(vm, ws->cur_frame); if (ws->scdep_seg) MVM_free(ws->scdep_seg); if (ws->extops_seg) MVM_free(ws->extops_seg); if (ws->frame_seg) MVM_free(ws->frame_seg); if (ws->callsite_seg) MVM_free(ws->callsite_seg); if (ws->bytecode_seg) MVM_free(ws->bytecode_seg); if (ws->annotation_seg) MVM_free(ws->annotation_seg); HASH_ITER(hash_handle, ws->callsite_reuse_head, current, tmp, bucket_tmp) { MVM_free(current->identifier); } MVM_HASH_DESTROY(hash_handle, CallsiteReuseEntry, ws->callsite_reuse_head); MVM_free(ws); } /* Gets the index of a string already in the string heap, or * adds it to the heap if it's not already there. */ static unsigned int get_string_heap_index(VM, WriterState *ws, VMSTR *strval) { if (EXISTSKEY(vm, ws->seen_strings, strval)) { return (unsigned int)ATKEY_I(vm, ws->seen_strings, strval); } else { unsigned int index = (unsigned int)ELEMS(vm, ws->strings); if (index >= 0x7FFFFFFF) { cleanup_all(vm, ws); DIE(vm, "Too many strings in compilation unit"); } BINDPOS_S(vm, ws->strings, index, strval); BINDKEY_I(vm, ws->seen_strings, strval, index); return index; } } /* Locates the index of a frame. */ static unsigned short get_frame_index(VM, WriterState *ws, MASTNode *frame) { if (((MAST_Frame *)frame)->flags & FRAME_FLAG_HAS_INDEX) { return (short)((MAST_Frame *)frame)->index; } else { int num_frames = ELEMS(vm, ws->cu->frames); unsigned short i; for (i = 0; i < num_frames; i++) if (ATPOS(vm, ws->cu->frames, i) == frame) return i; cleanup_all(vm, ws); DIE(vm, "MAST::Frame passed for code ref not found in compilation unit"); } } /* Takes a 6model object type and turns it into a local/lexical type flag. */ static unsigned short type_to_local_type(VM, WriterState *ws, MASTNode *type) { const MVMStorageSpec *ss; if (VM_OBJ_IS_NULL(type)) return MVM_reg_obj; ss = REPR(type)->get_storage_spec(vm, STABLE(type)); if (ss->inlineable) { switch (ss->boxed_primitive) { case MVM_STORAGE_SPEC_BP_INT: if (ss->is_unsigned) { switch (ss->bits) { case 8: return MVM_reg_uint8; case 16: return MVM_reg_uint16; case 32: return MVM_reg_uint32; case 64: return MVM_reg_uint64; default: cleanup_all(vm, ws); DIE(vm, "Invalid int size for local/lexical"); } } else { switch (ss->bits) { case 8: return MVM_reg_int8; case 16: return MVM_reg_int16; case 32: return MVM_reg_int32; case 64: return MVM_reg_int64; default: cleanup_all(vm, ws); DIE(vm, "Invalid int size for local/lexical"); } } break; case MVM_STORAGE_SPEC_BP_NUM: switch (ss->bits) { case 32: return MVM_reg_num32; case 64: return MVM_reg_num64; default: cleanup_all(vm, ws); DIE(vm, "Invalid num size for local/lexical"); } break; case MVM_STORAGE_SPEC_BP_STR: return MVM_reg_str; default: cleanup_all(vm, ws); DIE(vm, "Type used for local/lexical has invalid boxed primitive in storage spec"); } } else { return MVM_reg_obj; } } /* Grows label storage. */ static void add_label(VM, FrameState *fs, MAST_Label *l, MVMint32 offset) { if (fs->num_labels == fs->alloc_labels) { if (fs->alloc_labels) fs->alloc_labels *= 2; else fs->alloc_labels = 8; fs->labels = MVM_realloc(fs->labels, fs->alloc_labels * sizeof(LabelInfo)); } fs->labels[fs->num_labels].label = l; fs->labels[fs->num_labels].offset = offset; fs->labels[fs->num_labels].resolve = NULL; fs->labels[fs->num_labels].num_resolve = 0; fs->labels[fs->num_labels].alloc_resolve = 0; fs->num_labels++; } /* Takes a label and either writes its offset if we already saw it, or writes * a zero and records that a fixups is needed. */ static void write_label_or_add_fixup(VM, WriterState *ws, MAST_Label *l) { FrameState *fs = ws->cur_frame; LabelInfo *info = NULL; MVMuint32 i; /* Ensure we've space to write an offset. */ ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 4); /* Look for the label. */ for (i = 0; i < fs->num_labels; i++) { if (fs->labels[i].label == l) { /* Found it. If we know its offset, write and we're done. */ MVMint32 offset = fs->labels[i].offset; if (offset >= 0) { write_int32(ws->bytecode_seg, ws->bytecode_pos, offset); ws->bytecode_pos += 4; return; } /* Otherwise, note this label to add the resolve need to. */ info = &(fs->labels[i]); break; } } /* If we don't have an entry for this label yet, add it. */ if (!info) { add_label(vm, fs, l, -1); info = &(fs->labels[fs->num_labels - 1]); } if (info->num_resolve == info->alloc_resolve) { if (info->alloc_resolve) info->alloc_resolve *= 2; else info->alloc_resolve = 8; info->resolve = MVM_realloc(info->resolve, info->alloc_resolve * sizeof(MVMuint32)); } info->resolve[info->num_resolve] = ws->bytecode_pos; info->num_resolve++; fs->unresolved_labels++; /* Write zero, to be fixed up later. */ write_int32(ws->bytecode_seg, ws->bytecode_pos, 0); ws->bytecode_pos += 4; } /* Takes a label, and either adds it to the labels collection or, if it's been * seen already, resolves its fixups. */ static void add_label_and_resolve_fixups(VM, WriterState *ws, MAST_Label *l) { FrameState *fs = ws->cur_frame; MVMuint32 offset = ws->bytecode_pos - ws->cur_frame->bytecode_start; MVMuint32 i, j; /* See if it has an existing entry. */ for (i = 0; i < fs->num_labels; i++) { if (fs->labels[i].label == l) { /* Found it. Must not already have an offset, or it's a dupe. */ if (fs->labels[i].offset < 0) { /* Fix up existing usages. */ MVMuint32 *resolve = fs->labels[i].resolve; MVMuint32 nr = fs->labels[i].num_resolve; for (j = 0; j < nr; j++) write_int32(ws->bytecode_seg, resolve[j], offset); fs->labels[i].offset = offset; fs->labels[i].alloc_resolve = 0; fs->labels[i].num_resolve = 0; fs->unresolved_labels -= nr; MVM_free(fs->labels[i].resolve); } else { cleanup_all(vm, ws); DIE(vm, "Duplicate label"); } return; } } /* If we get here, no entry; create one. */ add_label(vm, fs, l, offset); } /* Rreturns a label's offset, dying if it's not possible. */ static MVMuint32 demand_label_offset(VM, WriterState *ws, MAST_Label *l, const char *error) { FrameState *fs = ws->cur_frame; MVMuint32 nl = fs->num_labels; MVMuint32 i; for (i = 0; i < nl; i++) { if (fs->labels[i].label == l) { if (fs->labels[i].offset >= 0) return fs->labels[i].offset; break; } } cleanup_all(vm, ws); DIE(vm, "%s", error); } /* Compiles the operand to an instruction; this involves checking * that we have a node of the correct type for it and writing out * the appropriate thing to the bytecode stream. */ static void compile_operand(VM, WriterState *ws, unsigned char op_flags, MASTNode *operand) { unsigned char op_rw = op_flags & MVM_operand_rw_mask; unsigned char op_type = op_flags & MVM_operand_type_mask; unsigned short int local_type; if (op_rw == MVM_operand_literal) { /* Literal; go by type. */ switch (op_type) { case MVM_operand_int64: { if (ISTYPE(vm, operand, ws->types->IVal)) { MAST_IVal *iv = GET_IVal(operand); ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 8); write_int64(ws->bytecode_seg, ws->bytecode_pos, iv->value); ws->bytecode_pos += 8; } else { cleanup_all(vm, ws); DIE(vm, "Expected MAST::IVal, but didn't get one"); } break; } case MVM_operand_int16: { if (ISTYPE(vm, operand, ws->types->IVal)) { MAST_IVal *iv = GET_IVal(operand); ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 2); if (iv->value > 32767 || iv->value < -32768) { cleanup_all(vm, ws); DIE(vm, "Value outside range of 16-bit MAST::IVal"); } write_int16(ws->bytecode_seg, ws->bytecode_pos, (short)iv->value); ws->bytecode_pos += 2; } else { cleanup_all(vm, ws); DIE(vm, "Expected MAST::IVal, but didn't get one"); } break; } case MVM_operand_num64: { if (ISTYPE(vm, operand, ws->types->NVal)) { MAST_NVal *nv = GET_NVal(operand); ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 8); write_double(ws->bytecode_seg, ws->bytecode_pos, nv->value); ws->bytecode_pos += 8; } else { cleanup_all(vm, ws); DIE(vm, "Expected MAST::NVal, but didn't get one"); } break; } case MVM_operand_str: { if (ISTYPE(vm, operand, ws->types->SVal)) { MAST_SVal *sv = GET_SVal(operand); ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 4); write_int32(ws->bytecode_seg, ws->bytecode_pos, get_string_heap_index(vm, ws, sv->value)); ws->bytecode_pos += 4; } else { cleanup_all(vm, ws); DIE(vm, "Expected MAST::SVal, but didn't get one"); } break; } case MVM_operand_ins: { if (ISTYPE(vm, operand, ws->types->Label)) { write_label_or_add_fixup(vm, ws, GET_Label(operand)); } else { cleanup_all(vm, ws); DIE(vm, "Expected MAST::Label, but didn't get one"); } break; } case MVM_operand_coderef: { if (ISTYPE(vm, operand, ws->types->Frame)) { /* Find the frame index in the compilation unit. */ ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 2); write_int16(ws->bytecode_seg, ws->bytecode_pos, get_frame_index(vm, ws, operand)); ws->bytecode_pos += 2; } else { cleanup_all(vm, ws); DIE(vm, "Expected MAST::Frame, but didn't get one"); } break; } default: cleanup_all(vm, ws); DIE(vm, "Unhandled literal type in MAST compiler"); } } else if (op_rw == MVM_operand_read_reg || op_rw == MVM_operand_write_reg) { /* The operand node had best be a MAST::Local. */ if (ISTYPE(vm, operand, ws->types->Local)) { MAST_Local *l = GET_Local(operand); /* Ensure it's within the set of known locals. */ if (l->index >= ws->cur_frame->num_locals) { cleanup_all(vm, ws); DIE(vm, "MAST::Local index out of range"); } /* Check the type matches. */ local_type = ws->cur_frame->local_types[l->index]; if (op_type != local_type << 3 && op_type != MVM_operand_type_var) { unsigned int current_frame_idx = ws->current_frame_idx; unsigned int current_ins_idx = ws->current_ins_idx; const char *name = ws->current_op_info->name; unsigned int current_operand_idx = ws->current_operand_idx; cleanup_all(vm, ws); DIE(vm, "At Frame %u, Instruction %u, op '%s', operand %u, " "MAST::Local of wrong type (%u) specified; expected %u", current_frame_idx, current_ins_idx, name, current_operand_idx, local_type, (op_type >> 3)); } /* Write the operand type. */ if (l->index < 0 || l->index > 32768) DIE(vm, "Frame %u local access out of range", ws->current_frame_idx); ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 2); write_int16(ws->bytecode_seg, ws->bytecode_pos, (unsigned short)l->index); ws->bytecode_pos += 2; } else { unsigned int current_frame_idx = ws->current_frame_idx; unsigned int current_ins_idx = ws->current_ins_idx; const char *name = ws->current_op_info->name; unsigned int current_operand_idx = ws->current_operand_idx; cleanup_all(vm, ws); DIE(vm, "At Frame %u, Instruction %u, op '%s', operand %u, expected MAST::Local, but didn't get one", current_frame_idx, current_ins_idx, name, current_operand_idx); } } else if (op_rw == MVM_operand_read_lex || op_rw == MVM_operand_write_lex) { /* The operand node should be a MAST::Lexical. */ if (ISTYPE(vm, operand, ws->types->Lexical)) { MAST_Lexical *l = GET_Lexical(operand); /* Write the index, then the frame count. */ ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 4); write_int16(ws->bytecode_seg, ws->bytecode_pos, (unsigned short)l->index); ws->bytecode_pos += 2; write_int16(ws->bytecode_seg, ws->bytecode_pos, (unsigned short)l->frames_out); ws->bytecode_pos += 2; } else { cleanup_all(vm, ws); DIE(vm, "Expected MAST::Lexical, but didn't get one"); } } else { cleanup_all(vm, ws); DIE(vm, "Unknown operand type cannot be compiled"); } ws->current_operand_idx++; } /* Takes a set of flags describing a callsite. Writes out a callsite * descriptor and returns the index of it. */ static unsigned short get_callsite_id(VM, WriterState *ws, MASTNode *flag_node, MASTNode *args) { unsigned int num_nameds = 0; unsigned short i, identifier_len; unsigned char *flags, *identifier; unsigned int *named_idxs; CallsiteReuseEntry *entry = NULL; /* Get callsite elements and work out if a padding byte will be needed. */ unsigned short elems = (unsigned short)ELEMS(vm, flag_node); unsigned short align = elems % 2; /* See if the callsite has any named args, and get string pool entries * for them if so. */ flags = (unsigned char *)MVM_malloc(elems); named_idxs = (unsigned int *)MVM_malloc(elems * sizeof(int)); for (i = 0; i < elems; i++) { flags[i] = (unsigned char)ATPOS_I_C(vm, flag_node, i); if (flags[i] & (MVM_CALLSITE_ARG_NAMED)) { MASTNode *argname = ATPOS(vm, args, i + num_nameds); if (ISTYPE(vm, argname, ws->types->SVal)) { named_idxs[num_nameds] = get_string_heap_index(vm, ws, ((MAST_SVal *)argname)->value); num_nameds++; } else { DIE(vm, "Malformed callsite args: missing MAST::SVal for argument name"); } } } /* See if we already know this callsite. */ identifier_len = elems + num_nameds * sizeof(int); identifier = MVM_malloc(identifier_len); memcpy(identifier, flags, elems); memcpy(identifier + elems, named_idxs, identifier_len - elems); HASH_FIND(hash_handle, ws->callsite_reuse_head, identifier, identifier_len, entry); if (entry) { MVM_free(flags); MVM_free(named_idxs); MVM_free(identifier); return entry->callsite_id; } entry = (CallsiteReuseEntry *)MVM_malloc(sizeof(CallsiteReuseEntry)); entry->callsite_id = (unsigned short)ws->num_callsites; entry->identifier = identifier; HASH_ADD_KEYPTR(hash_handle, ws->callsite_reuse_head, identifier, identifier_len, entry); /* Emit callsite; be sure to pad if there's uneven number of flags. */ ensure_space(vm, &ws->callsite_seg, &ws->callsite_alloc, ws->callsite_pos, 2 + elems + align); write_int16(ws->callsite_seg, ws->callsite_pos, elems); ws->callsite_pos += 2; for (i = 0; i < elems; i++) write_int8(ws->callsite_seg, ws->callsite_pos++, flags[i]); if (align) write_int8(ws->callsite_seg, ws->callsite_pos++, 0); /* Emit any nameds. */ if (num_nameds) { ensure_space(vm, &ws->callsite_seg, &ws->callsite_alloc, ws->callsite_pos, 4 * num_nameds); for (i = 0; i < num_nameds; i++) { write_int32(ws->callsite_seg, ws->callsite_pos, named_idxs[i]); ws->callsite_pos += 4; } } MVM_free(flags); MVM_free(named_idxs); return (unsigned short)ws->num_callsites++; } #define OVERRIDE_WITH_32 1 #define OVERRIDE_WITH_16 2 /* Compiles an instruction (which may actaully be any of the * nodes valid directly in a Frame's instruction list, which * means labels are valid too). */ static void compile_instruction(VM, WriterState *ws, MASTNode *node) { if (ISTYPE(vm, node, ws->types->Op)) { MAST_Op *o = GET_Op(node); const MVMOpInfo *info; int i; unsigned char override_second_argument = 0; /* Look up opcode and get argument info. */ unsigned short op = o->op; info = MVM_op_get_op(op); if (!info) DIE(vm, "Invalid op specified in instruction %d", op); ws->current_op_info = info; ws->current_operand_idx = 0; /* Ensure argument count matches up. */ if (info->num_operands != 0 && ELEMS(vm, o->operands) != info->num_operands) { unsigned int current_frame_idx = ws->current_frame_idx; unsigned int current_ins_idx = ws->current_ins_idx; const char *name = ws->current_op_info->name; cleanup_all(vm, ws); DIE(vm, "At Frame %u, Instruction %u, op '%s' has invalid number (%u) of operands; needs %u.", current_frame_idx, current_ins_idx, name, ELEMS(vm, o->operands), info->num_operands); } /* If we're outputting a const_i64 instruction, we may want to */ /* turn it into a const_i64_32 or const_i64_16 instead if it fits */ if (op == MVM_OP_const_i64) { MASTNode *operand = ATPOS(vm, o->operands, 1); MAST_IVal *iv = GET_IVal(operand); if (INT16_MIN <= iv->value && iv->value <= INT16_MAX) { override_second_argument = OVERRIDE_WITH_16; } else if (INT32_MIN <= iv->value && iv->value <= INT32_MAX) { override_second_argument = OVERRIDE_WITH_32; } } /* Write opcode. */ ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 2); if (override_second_argument == 0) write_int16(ws->bytecode_seg, ws->bytecode_pos, op); else if (override_second_argument == OVERRIDE_WITH_16) write_int16(ws->bytecode_seg, ws->bytecode_pos, MVM_OP_const_i64_16); else if (override_second_argument == OVERRIDE_WITH_32) write_int16(ws->bytecode_seg, ws->bytecode_pos, MVM_OP_const_i64_32); ws->bytecode_pos += 2; /* Write operands. */ for (i = 0; i < info->num_operands; i++) { if (i == 1 && override_second_argument) { MASTNode *operand = ATPOS(vm, o->operands, 1); MAST_IVal *iv = GET_IVal(operand); if (override_second_argument == OVERRIDE_WITH_32) { ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 4); write_int32(ws->bytecode_seg, ws->bytecode_pos, (MVMint32)iv->value); ws->bytecode_pos += 4; } else { ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 2); write_int16(ws->bytecode_seg, ws->bytecode_pos, (MVMint16)iv->value); ws->bytecode_pos += 2; } } else { compile_operand(vm, ws, info->operands[i], ATPOS(vm, o->operands, i)); } } } else if (ISTYPE(vm, node, ws->types->ExtOp)) { MAST_ExtOp *o = GET_ExtOp(node); MASTNode *operands; int i, num_operands; /* Look up opcode and get argument info. */ unsigned short op = o->op; if (op < EXTOP_BASE || (op - EXTOP_BASE) >= ELEMS(vm, ws->cu->extop_sigs)) DIE(vm, "Invalid extension op %d specified", op); operands = ATPOS(vm, ws->cu->extop_sigs, op - EXTOP_BASE); if (VM_OBJ_IS_NULL(operands)) DIE(vm, "Missing extension op operand array for instruction %d", op); ws->current_op_info = NULL; ws->current_operand_idx = 0; /* Ensure argument count matches up. */ num_operands = ELEMS(vm, operands); if (ELEMS(vm, o->operands) != num_operands) { unsigned int current_frame_idx = ws->current_frame_idx; unsigned int current_ins_idx = ws->current_ins_idx; char *c_name = VM_STRING_TO_C_STRING(vm, o->name); char *waste[] = { c_name, NULL }; cleanup_all(vm, ws); DIE_FREE(vm, waste, "At Frame %u, Instruction %u, op '%s' has invalid number (%u) of operands; needs %u.", current_frame_idx, current_ins_idx, c_name, ELEMS(vm, o->operands), num_operands); } /* Write opcode. */ ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 2); write_int16(ws->bytecode_seg, ws->bytecode_pos, op); ws->bytecode_pos += 2; /* Write operands. */ for (i = 0; i < num_operands; i++) compile_operand(vm, ws, ATPOS_I(vm, operands, i), ATPOS(vm, o->operands, i)); } else if (ISTYPE(vm, node, ws->types->Label)) { add_label_and_resolve_fixups(vm, ws, GET_Label(node)); } else if (ISTYPE(vm, node, ws->types->Call)) { MAST_Call *c = GET_Call(node); unsigned short call_op = c->op == 0 ? MVM_OP_invoke_v : MVM_OP_nativeinvoke_v; unsigned char res_type = 0; unsigned short num_flags, flag_pos, arg_pos, arg_out_pos; /* Emit callsite (may re-use existing one) and emit loading of it. */ unsigned short callsite_id = get_callsite_id(vm, ws, c->flags, c->args); ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 4); write_int16(ws->bytecode_seg, ws->bytecode_pos, MVM_OP_prepargs); ws->bytecode_pos += 2; write_int16(ws->bytecode_seg, ws->bytecode_pos, callsite_id); ws->bytecode_pos += 2; /* for errors */ ws->current_op_info = MVM_op_get_op(MVM_OP_prepargs); ws->current_operand_idx = 0; /* Set up args. */ num_flags = (unsigned short)ELEMS(vm, c->flags); arg_pos = c->op == 0 ? 0 : 1; arg_out_pos = 0; for (flag_pos = 0; flag_pos < num_flags; flag_pos++) { /* Handle any special flags. */ unsigned char flag = (unsigned char)ATPOS_I_C(vm, c->flags, flag_pos); if (flag & MVM_CALLSITE_ARG_NAMED) { ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 6); write_int16(ws->bytecode_seg, ws->bytecode_pos, MVM_OP_argconst_s); ws->bytecode_pos += 2; write_int16(ws->bytecode_seg, ws->bytecode_pos, arg_out_pos); ws->bytecode_pos += 2; compile_operand(vm, ws, MVM_operand_str, ATPOS(vm, c->args, arg_pos)); arg_pos++; arg_out_pos++; } else if (flag & MVM_CALLSITE_ARG_FLAT) { /* don't need to do anything special */ } /* Now go by flag type. */ ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 6); if (flag & MVM_CALLSITE_ARG_OBJ) { write_int16(ws->bytecode_seg, ws->bytecode_pos, MVM_OP_arg_o); ws->bytecode_pos += 2; write_int16(ws->bytecode_seg, ws->bytecode_pos, arg_out_pos); ws->bytecode_pos += 2; compile_operand(vm, ws, MVM_operand_read_reg | MVM_operand_obj, ATPOS(vm, c->args, arg_pos)); } else if (flag & MVM_CALLSITE_ARG_STR) { write_int16(ws->bytecode_seg, ws->bytecode_pos, MVM_OP_arg_s); ws->bytecode_pos += 2; write_int16(ws->bytecode_seg, ws->bytecode_pos, arg_out_pos); ws->bytecode_pos += 2; compile_operand(vm, ws, MVM_operand_read_reg | MVM_operand_str, ATPOS(vm, c->args, arg_pos)); } else if (flag & MVM_CALLSITE_ARG_INT) { write_int16(ws->bytecode_seg, ws->bytecode_pos, MVM_OP_arg_i); ws->bytecode_pos += 2; write_int16(ws->bytecode_seg, ws->bytecode_pos, arg_out_pos); ws->bytecode_pos += 2; compile_operand(vm, ws, MVM_operand_read_reg | MVM_operand_int64, ATPOS(vm, c->args, arg_pos)); } else if (flag & MVM_CALLSITE_ARG_NUM) { write_int16(ws->bytecode_seg, ws->bytecode_pos, MVM_OP_arg_n); ws->bytecode_pos += 2; write_int16(ws->bytecode_seg, ws->bytecode_pos, arg_out_pos); ws->bytecode_pos += 2; compile_operand(vm, ws, MVM_operand_read_reg | MVM_operand_num64, ATPOS(vm, c->args, arg_pos)); } else { unsigned int current_frame_idx = ws->current_frame_idx; unsigned int current_ins_idx = ws->current_ins_idx; const char *name = ws->current_op_info->name; cleanup_all(vm, ws); /* DIE(vm, "At Frame %u, Instruction %u, op '%s', " "file %s, line %u, unhandled arg type %u.", current_frame_idx, current_ins_idx, name, ws->last_annotated ? VM_STRING_TO_C_STRING(vm, ws->last_annotated->file) : "", ws->last_annotated ? ws->last_annotated->line : 0, flag); */ DIE(vm, "At Frame %u, Instruction %u, op '%s', unhandled arg type %u.", current_frame_idx, current_ins_idx, name, flag); } arg_pos++; arg_out_pos++; } /* Select operation based on return type. */ if (ISTYPE(vm, c->result, ws->types->Local)) { MAST_Local *l = GET_Local(c->result); /* Ensure it's within the set of known locals. */ if (l->index >= ws->cur_frame->num_locals) { cleanup_all(vm, ws); DIE(vm, "MAST::Local index out of range"); } /* Go by type. */ switch (ws->cur_frame->local_types[l->index]) { case MVM_reg_int64: call_op = c->op == 0 ? MVM_OP_invoke_i : MVM_OP_nativeinvoke_i; res_type = MVM_operand_int64; break; case MVM_reg_num64: call_op = c->op == 0 ? MVM_OP_invoke_n : MVM_OP_nativeinvoke_n; res_type = MVM_operand_num64; break; case MVM_reg_str: call_op = c->op == 0 ? MVM_OP_invoke_s : MVM_OP_nativeinvoke_s; res_type = MVM_operand_str; break; case MVM_reg_obj: call_op = c->op == 0 ? MVM_OP_invoke_o : MVM_OP_nativeinvoke_o; res_type = MVM_operand_obj; break; default: cleanup_all(vm, ws); DIE(vm, "Invalid MAST::Local type for return value"); } } /* Emit the invocation op. */ ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, c->op == 0 ? 6 : 8); write_int16(ws->bytecode_seg, ws->bytecode_pos, call_op); ws->bytecode_pos += 2; if (call_op != MVM_OP_invoke_v && call_op != MVM_OP_nativeinvoke_v) compile_operand(vm, ws, MVM_operand_read_reg | res_type, c->result); compile_operand(vm, ws, MVM_operand_read_reg | MVM_operand_obj, c->target); if (c->op != 0) compile_operand(vm, ws, MVM_operand_read_reg | MVM_operand_obj, ATPOS(vm, c->args, 0)); } else if (ISTYPE(vm, node, ws->types->Annotated)) { MAST_Annotated *a = GET_Annotated(node); unsigned int i; unsigned int num_ins = ELEMS(vm, a->instructions); unsigned int offset = ws->bytecode_pos - ws->cur_frame->bytecode_start; ws->last_annotated = a; ensure_space(vm, &ws->annotation_seg, &ws->annotation_alloc, ws->annotation_pos, 12); write_int32(ws->annotation_seg, ws->annotation_pos, offset); write_int32(ws->annotation_seg, ws->annotation_pos + 4, get_string_heap_index(vm, ws, a->file)); write_int32(ws->annotation_seg, ws->annotation_pos + 8, (unsigned int)a->line); ws->annotation_pos += 12; ws->cur_frame->num_annotations++; for (i = 0; i < num_ins; i++) compile_instruction(vm, ws, ATPOS(vm, a->instructions, i)); } else if (ISTYPE(vm, node, ws->types->HandlerScope)) { MAST_HandlerScope *hs = GET_HandlerScope(node); unsigned int i; unsigned int num_ins = ELEMS(vm, hs->instructions); unsigned int start = ws->bytecode_pos - ws->cur_frame->bytecode_start; unsigned int end; for (i = 0; i < num_ins; i++) compile_instruction(vm, ws, ATPOS(vm, hs->instructions, i)); end = ws->bytecode_pos - ws->cur_frame->bytecode_start; ws->cur_frame->num_handlers++; if (ws->cur_frame->handlers) ws->cur_frame->handlers = (FrameHandler *)MVM_realloc(ws->cur_frame->handlers, ws->cur_frame->num_handlers * sizeof(FrameHandler)); else ws->cur_frame->handlers = (FrameHandler *)MVM_malloc( ws->cur_frame->num_handlers * sizeof(FrameHandler)); i = ws->cur_frame->num_handlers - 1; ws->cur_frame->handlers[i].start_offset = start; ws->cur_frame->handlers[i].end_offset = end; ws->cur_frame->handlers[i].category_mask = (unsigned int)hs->category_mask; ws->cur_frame->handlers[i].action = (unsigned short)hs->action; if (ws->cur_frame->handlers[i].category_mask & MVM_EX_CAT_LABELED) { if (ISTYPE(vm, hs->label_local, ws->types->Local)) { MAST_Local *l = GET_Local(hs->label_local); /* Ensure it's within the set of known locals and an object. */ if (l->index >= ws->cur_frame->num_locals) { cleanup_all(vm, ws); DIE(vm, "MAST::Local index out of range in HandlerScope"); } if (ws->cur_frame->local_types[l->index] != MVM_reg_obj) { cleanup_all(vm, ws); DIE(vm, "MAST::Local for HandlerScope must be an object"); } /* Stash local index. */ ws->cur_frame->handlers[i].label_reg = (unsigned short)l->index; } else { cleanup_all(vm, ws); DIE(vm, "MAST::Local required for HandlerScope with loop label"); } } /* Ensure we have a label. */ if (ISTYPE(vm, hs->goto_label, ws->types->Label)) { ws->cur_frame->handlers[i].label = hs->goto_label; } else { cleanup_all(vm, ws); DIE(vm, "MAST::Label required for HandlerScope goto"); } /* May need a block also. */ if (hs->action == HANDLER_INVOKE) { if (ISTYPE(vm, hs->block_local, ws->types->Local)) { MAST_Local *l = GET_Local(hs->block_local); /* Ensure it's within the set of known locals and an object. */ if (l->index >= ws->cur_frame->num_locals) { cleanup_all(vm, ws); DIE(vm, "MAST::Local index out of range in HandlerScope"); } if (ws->cur_frame->local_types[l->index] != MVM_reg_obj) { cleanup_all(vm, ws); DIE(vm, "MAST::Local for HandlerScope must be an object"); } /* Stash local index. */ ws->cur_frame->handlers[i].local = (unsigned short)l->index; } else { cleanup_all(vm, ws); DIE(vm, "MAST::Local required for HandlerScope invoke action"); } } else if (hs->action == HANDLER_UNWIND_GOTO || hs->action == HANDLER_UNWIND_GOTO_OBJ) { ws->cur_frame->handlers[i].local = 0; } else { cleanup_all(vm, ws); DIE(vm, "Invalid action code for handler scope"); } } else { cleanup_all(vm, ws); DIE(vm, "Invalid MAST node in instruction list (must be Op, ExtOp, Call, Label, or Annotated)"); } ws->current_ins_idx++; } /* Compiles a frame. */ static void compile_frame(VM, WriterState *ws, MASTNode *node, unsigned short idx) { MAST_Frame *f; FrameState *fs; unsigned int i, num_ins, instructions_start; MASTNode *last_inst = NULL; MVMuint16 num_slvs; /* Ensure we have a node of the right type. */ if (!ISTYPE(vm, node, ws->types->Frame)) { cleanup_all(vm, ws); DIE(vm, "Child of CompUnit must be a Frame"); } f = GET_Frame(node); /* Allocate frame state. */ fs = ws->cur_frame = (FrameState *)MVM_malloc(sizeof(FrameState)); fs->bytecode_start = ws->bytecode_pos; fs->frame_start = ws->frame_pos; fs->labels = NULL; fs->num_labels = 0; fs->alloc_labels = 0; fs->unresolved_labels = 0; /* Count locals and lexicals. */ fs->num_locals = ELEMS(vm, f->local_types); fs->num_lexicals = ELEMS(vm, f->lexical_types); if (fs->num_locals > (1 << 16)) { cleanup_all(vm, ws); DIE(vm, "Too many locals in this frame."); } if (ELEMS(vm, f->lexical_names) != fs->num_lexicals) { cleanup_all(vm, ws); DIE(vm, "Lexical types list and lexical names list have unequal length"); } /* initialize number of annotation */ fs->num_annotations = 0; /* initialize number of handlers and handlers pointer */ fs->num_handlers = 0; fs->handlers = NULL; /* Ensure space is available to write frame entry, and write the * header, apart from the bytecode length, which we'll fill in * later. */ ensure_space(vm, &ws->frame_seg, &ws->frame_alloc, ws->frame_pos, FRAME_HEADER_SIZE + fs->num_locals * 2 + fs->num_lexicals * 6); write_int32(ws->frame_seg, ws->frame_pos, fs->bytecode_start); write_int32(ws->frame_seg, ws->frame_pos + 4, 0); /* Filled in later. */ write_int32(ws->frame_seg, ws->frame_pos + 8, fs->num_locals); write_int32(ws->frame_seg, ws->frame_pos + 12, fs->num_lexicals); write_int32(ws->frame_seg, ws->frame_pos + 16, get_string_heap_index(vm, ws, f->cuuid)); write_int32(ws->frame_seg, ws->frame_pos + 20, get_string_heap_index(vm, ws, f->name)); /* Handle outer. The current index means "no outer". */ if (ISTYPE(vm, f->outer, ws->types->Frame)) { /* First, see if we have the index cached. If not, go hunting. */ if (((MAST_Frame *)f->outer)->flags & FRAME_FLAG_HAS_INDEX) { write_int16(ws->frame_seg, ws->frame_pos + 24, ((MAST_Frame *)f->outer)->index); } else { unsigned short j, found, num_frames; found = 0; num_frames = (unsigned short)ELEMS(vm, ws->cu->frames); for (j = 0; j < num_frames; j++) { if (ATPOS(vm, ws->cu->frames, j) == f->outer) { write_int16(ws->frame_seg, ws->frame_pos + 24, j); found = 1; break; } } if (!found) { cleanup_all(vm, ws); DIE(vm, "Could not locate outer frame in frame list"); } } } else { write_int16(ws->frame_seg, ws->frame_pos + 24, idx); } write_int32(ws->frame_seg, ws->frame_pos + 26, ws->annotation_pos); write_int32(ws->frame_seg, ws->frame_pos + 30, 0); /* number of annotation; fill in later */ write_int32(ws->frame_seg, ws->frame_pos + 34, 0); /* number of handlers; fill in later */ write_int16(ws->frame_seg, ws->frame_pos + 38, (MVMint16)f->flags); num_slvs = f->flags & FRAME_FLAG_HAS_SLV ? (MVMuint16)ELEMS(vm, f->static_lex_values) / 4 : 0; write_int16(ws->frame_seg, ws->frame_pos + 40, num_slvs); if (f->flags & FRAME_FLAG_HAS_CODE_OBJ) { write_int32(ws->frame_seg, ws->frame_pos + 42, f->code_obj_sc_dep_idx + 1); write_int32(ws->frame_seg, ws->frame_pos + 46, f->code_obj_sc_idx); } else { write_int32(ws->frame_seg, ws->frame_pos + 42, 0); write_int32(ws->frame_seg, ws->frame_pos + 46, 0); } ws->frame_pos += FRAME_HEADER_SIZE; /* Write locals, as well as collecting our own array of type info. */ fs->local_types = (short unsigned int *)MVM_malloc(sizeof(unsigned short) * fs->num_locals); for (i = 0; i < fs->num_locals; i++) { unsigned short local_type = type_to_local_type(vm, ws, ATPOS(vm, f->local_types, i)); fs->local_types[i] = local_type; write_int16(ws->frame_seg, ws->frame_pos, local_type); ws->frame_pos += 2; } /* Write lexicals. */ fs->lexical_types = (short unsigned int *)MVM_malloc(sizeof(unsigned short) * fs->num_lexicals); for (i = 0; i < fs->num_lexicals; i++) { unsigned short lexical_type = type_to_local_type(vm, ws, ATPOS(vm, f->lexical_types, i)); fs->lexical_types[i] = lexical_type; write_int16(ws->frame_seg, ws->frame_pos, lexical_type); ws->frame_pos += 2; write_int32(ws->frame_seg, ws->frame_pos, get_string_heap_index(vm, ws, ATPOS_S_C(vm, f->lexical_names, i))); ws->frame_pos += 4; } /* Save the location of the start of instructions */ instructions_start = ws->bytecode_pos; /* Compile the instructions. */ ws->current_ins_idx = 0; num_ins = ELEMS(vm, f->instructions); for (i = 0; i < num_ins; i++) compile_instruction(vm, ws, last_inst = ATPOS(vm, f->instructions, i)); /* Fixup frames that don't have a return instruction, so * we don't have to check against bytecode length every * time through the runloop. */ if (!last_inst || !ISTYPE(vm, last_inst, ws->types->Op) || ( GET_Op(last_inst)->op != MVM_OP_return && GET_Op(last_inst)->op != MVM_OP_return_i && GET_Op(last_inst)->op != MVM_OP_return_n && GET_Op(last_inst)->op != MVM_OP_return_s && GET_Op(last_inst)->op != MVM_OP_return_o )) { ensure_space(vm, &ws->bytecode_seg, &ws->bytecode_alloc, ws->bytecode_pos, 2); write_int16(ws->bytecode_seg, ws->bytecode_pos, MVM_OP_return); ws->bytecode_pos += 2; } /* Fill in bytecode length. */ write_int32(ws->frame_seg, fs->frame_start + 4, ws->bytecode_pos - instructions_start); /* Fill in number of annotations. */ write_int32(ws->frame_seg, fs->frame_start + 30, fs->num_annotations); /* Fill in number of handlers. */ write_int32(ws->frame_seg, fs->frame_start + 34, fs->num_handlers); /* Write handlers. */ for (i = 0; i < fs->num_handlers; i++) { ensure_space(vm, &ws->frame_seg, &ws->frame_alloc, ws->frame_pos, FRAME_HANDLER_SIZE); write_int32(ws->frame_seg, ws->frame_pos, fs->handlers[i].start_offset); ws->frame_pos += 4; write_int32(ws->frame_seg, ws->frame_pos, fs->handlers[i].end_offset); ws->frame_pos += 4; write_int32(ws->frame_seg, ws->frame_pos, fs->handlers[i].category_mask); ws->frame_pos += 4; write_int16(ws->frame_seg, ws->frame_pos, fs->handlers[i].action); ws->frame_pos += 2; write_int16(ws->frame_seg, ws->frame_pos, fs->handlers[i].local); ws->frame_pos += 2; if (ws->cur_frame->handlers[i].label) write_int32(ws->frame_seg, ws->frame_pos, demand_label_offset(vm, ws, GET_Label(fs->handlers[i].label), "HandlerScope uses unresolved label")); else write_int32(ws->frame_seg, ws->frame_pos, 0); ws->frame_pos += 4; if (fs->handlers[i].category_mask & MVM_EX_CAT_LABELED) { ensure_space(vm, &ws->frame_seg, &ws->frame_alloc, ws->frame_pos, 2); write_int16(ws->frame_seg, ws->frame_pos, fs->handlers[i].label_reg); ws->frame_pos += 2; } } /* Write static lex values. */ ensure_space(vm, &ws->frame_seg, &ws->frame_alloc, ws->frame_pos, FRAME_SLV_SIZE * num_slvs); for (i = 0; i < num_slvs; i++) { write_int16(ws->frame_seg, ws->frame_pos, (MVMuint16)ATPOS_I(vm, f->static_lex_values, 4 * i)); write_int16(ws->frame_seg, ws->frame_pos + 2, (MVMuint16)ATPOS_I(vm, f->static_lex_values, 4 * i + 1)); write_int32(ws->frame_seg, ws->frame_pos + 4, (MVMuint32)ATPOS_I(vm, f->static_lex_values, 4 * i + 2)); write_int32(ws->frame_seg, ws->frame_pos + 8, (MVMuint32)ATPOS_I(vm, f->static_lex_values, 4 * i + 3)); ws->frame_pos += FRAME_SLV_SIZE; } /* Any leftover labels? */ if (fs->unresolved_labels) { cleanup_all(vm, ws); DIE(vm, "Frame has %u unresolved labels", fs->unresolved_labels); } /* Free the frame state. */ cleanup_frame(vm, fs); ws->cur_frame = NULL; /* Increment frame count. */ ws->num_frames++; } /* Takes all of the strings and joins them into a heap, encoding them as * UTF-8. */ static char * form_string_heap(VM, WriterState *ws, unsigned int *string_heap_size) { char *heap; unsigned int i, num_strings, heap_size, heap_alloc; /* If we've nothing to do, just return immediately. */ num_strings = ELEMS(vm, ws->strings); if (num_strings == 0) { *string_heap_size = 0; return NULL; } /* Allocate heap starting point (just a guess). */ heap_size = 0; heap_alloc = num_strings * 32; heap = (char *)MVM_malloc(heap_alloc); /* Add each string to the heap. */ for (i = 0; i < num_strings; i++) { MVMuint64 bytelen; char *encoded; MVMGraphemeIter gi; unsigned short align; unsigned int need; /* Decide if we can get away with Latin-1 with an assumption of the * string already being in NFG. Latin-1 is except \r, which we also * check for here. */ MVMint32 need_utf8 = 0; MVMString *str = ATPOS_S(vm, ws->strings, i); MVM_string_gi_init(tc, &gi, str); while (MVM_string_gi_has_more(tc, &gi)) { MVMGrapheme32 g = MVM_string_gi_get_grapheme(tc, &gi); if (g < 0 || g >= 0xFF || g == 0x0D) { need_utf8 = 1; break; } } /* Encode it with the chosen algorithm. */ encoded = need_utf8 ? MVM_string_utf8_encode(tc, str, &bytelen, 0) : MVM_string_latin1_encode(tc, str, &bytelen, 0); if (bytelen > 0x3FFFFFFF) { cleanup_all(vm, ws); DIE(vm, "String too long for string constants segment"); } /* Ensure we have space. */ align = bytelen & 3 ? 4 - (bytelen & 3) : 0; need = 4 + bytelen + align; if (heap_size + need >= heap_alloc) { heap_alloc = umax(heap_alloc * 2, heap_size + need); heap = (char *)MVM_realloc(heap, heap_alloc); } /* Write byte length and UTF-8 flag into heap. */ write_int32(heap, heap_size, (bytelen << 1) | need_utf8); heap_size += 4; /* Write string. */ memcpy(heap + heap_size, encoded, bytelen); MVM_free(encoded); heap_size += bytelen; /* Add alignment. Whilst we never read this memory, it's useful to ensure it is initialised, otherwise valgrind (and similar tools) will rightly complain that we're writing garbage to disk. */ if (align) { memset(heap + heap_size, 0, align); heap_size += align; } } *string_heap_size = heap_size; return heap; } /* Takes all the pieces and forms the bytecode output. */ static char * form_bytecode_output(VM, WriterState *ws, unsigned int *bytecode_size) { MVMuint32 size = 0; MVMuint32 pos = 0; char *output; unsigned int string_heap_size; char *string_heap; unsigned int hll_str_idx; /* Store HLL name string, if any. */ if (!VM_STRING_IS_NULL(ws->cu->hll)) hll_str_idx = get_string_heap_index(vm, ws, ws->cu->hll); else hll_str_idx = get_string_heap_index(vm, ws, EMPTY_STRING(vm)); /* Build string heap. */ string_heap = form_string_heap(vm, ws, &string_heap_size); /* Work out total size. */ size += MVM_ALIGN_SECTION(HEADER_SIZE); size += MVM_ALIGN_SECTION(string_heap_size); size += MVM_ALIGN_SECTION(ws->scdep_bytes); size += MVM_ALIGN_SECTION(ws->extops_bytes); size += MVM_ALIGN_SECTION(ws->frame_pos); size += MVM_ALIGN_SECTION(ws->callsite_pos); size += MVM_ALIGN_SECTION(ws->bytecode_pos); size += MVM_ALIGN_SECTION(ws->annotation_pos); if (vm->serialized) size += MVM_ALIGN_SECTION(vm->serialized_size); /* Allocate space for the bytecode output. */ output = (char *)MVM_calloc(1, size); /* Generate start of header. */ memcpy(output, "MOARVM\r\n", 8); write_int32(output, 8, BYTECODE_VERSION); pos += MVM_ALIGN_SECTION(HEADER_SIZE); /* Add SC dependencies section and its header entries. */ write_int32(output, SCDEP_HEADER_OFFSET, pos); write_int32(output, SCDEP_HEADER_OFFSET + 4, ELEMS(vm, ws->cu->sc_handles)); memcpy(output + pos, ws->scdep_seg, ws->scdep_bytes); pos += MVM_ALIGN_SECTION(ws->scdep_bytes); /* Add extension ops section and its header entries. */ write_int32(output, EXTOP_HEADER_OFFSET, pos); write_int32(output, EXTOP_HEADER_OFFSET + 4, ws->num_extops); memcpy(output + pos, ws->extops_seg, ws->extops_bytes); pos += MVM_ALIGN_SECTION(ws->extops_bytes); /* Add frames section and its header entries. */ write_int32(output, FRAME_HEADER_OFFSET, pos); write_int32(output, FRAME_HEADER_OFFSET + 4, ws->num_frames); memcpy(output + pos, ws->frame_seg, ws->frame_pos); pos += MVM_ALIGN_SECTION(ws->frame_pos); /* Add callsites section and its header entries. */ write_int32(output, CALLSITE_HEADER_OFFSET, pos); write_int32(output, CALLSITE_HEADER_OFFSET + 4, ws->num_callsites); memcpy(output + pos, ws->callsite_seg, ws->callsite_pos); pos += MVM_ALIGN_SECTION(ws->callsite_pos); /* Add strings heap section and its header entries. */ write_int32(output, STRING_HEADER_OFFSET, pos); write_int32(output, STRING_HEADER_OFFSET + 4, ELEMS(vm, ws->strings)); memcpy(output + pos, string_heap, string_heap_size); pos += MVM_ALIGN_SECTION(string_heap_size); if (string_heap) { MVM_free(string_heap); string_heap = NULL; } /* SC data. Write it if we have it. */ if (vm->serialized) { write_int32(output, SCDATA_HEADER_OFFSET, pos); write_int32(output, SCDATA_HEADER_OFFSET + 4, vm->serialized_size); memcpy(output + pos, vm->serialized, vm->serialized_size); pos += MVM_ALIGN_SECTION(vm->serialized_size); MVM_free(vm->serialized); vm->serialized = NULL; vm->serialized_size = 0; } /* Add bytecode section and its header entries (offset, length). */ write_int32(output, BYTECODE_HEADER_OFFSET, pos); write_int32(output, BYTECODE_HEADER_OFFSET + 4, ws->bytecode_pos); memcpy(output + pos, ws->bytecode_seg, ws->bytecode_pos); pos += MVM_ALIGN_SECTION(ws->bytecode_pos); /* Add annotation section and its header entries (offset, length). */ write_int32(output, ANNOTATION_HEADER_OFFSET, pos); write_int32(output, ANNOTATION_HEADER_OFFSET + 4, ws->annotation_pos); memcpy(output + pos, ws->annotation_seg, ws->annotation_pos); pos += MVM_ALIGN_SECTION(ws->annotation_pos); /* Add HLL and special frame indexes. */ write_int32(output, HLL_NAME_HEADER_OFFSET, hll_str_idx); if (VM_OBJ_IS_NULL(ws->cu->main_frame)) write_int32(output, SPECIAL_FRAME_HEADER_OFFSET, 0); else write_int32(output, SPECIAL_FRAME_HEADER_OFFSET, 1 + get_frame_index(vm, ws, ws->cu->main_frame)); if (VM_OBJ_IS_NULL(ws->cu->load_frame)) write_int32(output, SPECIAL_FRAME_HEADER_OFFSET + 4, 0); else write_int32(output, SPECIAL_FRAME_HEADER_OFFSET + 4, 1 + get_frame_index(vm, ws, ws->cu->load_frame)); if (VM_OBJ_IS_NULL(ws->cu->deserialize_frame)) write_int32(output, SPECIAL_FRAME_HEADER_OFFSET + 8, 0); else write_int32(output, SPECIAL_FRAME_HEADER_OFFSET + 8, 1 + get_frame_index(vm, ws, ws->cu->deserialize_frame)); /* Sanity...should never fail. */ if (pos != size) DIE(vm, "Bytecode generated did not match expected size"); *bytecode_size = size; return output; } /* Main entry point to the MAST to bytecode compiler. */ char * MVM_mast_compile(VM, MASTNode *node, MASTNodeTypes *types, unsigned int *size) { MAST_CompUnit *cu; WriterState *ws; char *bytecode; unsigned short i, num_depscs, num_frames; unsigned int bytecode_size; /* Ensure we have a compilation unit. */ if (!ISTYPE(vm, node, types->CompUnit)) DIE(vm, "Top-level MAST node must be a CompUnit"); cu = GET_CompUnit(node); /* Initialize the writer state structure. */ ws = (WriterState *)MVM_malloc(sizeof(WriterState)); ws->types = types; ws->strings = NEWLIST_S(vm); ws->seen_strings = NEWHASH(vm); ws->cur_frame = NULL; ws->scdep_bytes = ELEMS(vm, cu->sc_handles) * SC_DEP_SIZE; ws->scdep_seg = ws->scdep_bytes ? (char *)MVM_malloc(ws->scdep_bytes) : NULL; ws->num_extops = ELEMS(vm, cu->extop_names); ws->extops_bytes = ws->num_extops * EXTOP_SIZE; ws->extops_seg = (char *)MVM_malloc(ws->extops_bytes); ws->frame_pos = 0; ws->frame_alloc = 192 * ELEMS(vm, cu->frames); ws->frame_seg = (char *)MVM_malloc(ws->frame_alloc); ws->num_frames = 0; ws->callsite_pos = 0; ws->callsite_alloc = 4096; ws->callsite_seg = (char *)MVM_malloc(ws->callsite_alloc); ws->num_callsites = 0; ws->bytecode_pos = 0; ws->bytecode_alloc = 128 * ELEMS(vm, cu->frames); ws->bytecode_seg = (char *)MVM_malloc(ws->bytecode_alloc); ws->annotation_pos = 0; ws->annotation_alloc = 64 * ELEMS(vm, cu->frames); ws->annotation_seg = (char *)MVM_malloc(ws->annotation_alloc); ws->cu = cu; ws->current_frame_idx= 0; /* If we have any strings from serializing, then we'll seed our own string * heap with them. This means the compilation unit string heap will align * perfectly with what the serialization blob needs, and thus we can use * it in deserialization. Note we use get_string_heap_index for its side * effects only here. Start from 1, as 0 means NULL string. */ if (vm->serialized_string_heap) { MVMint64 elems = ELEMS(vm, vm->serialized_string_heap); for (i = 1; i < elems; i++) (void)get_string_heap_index(vm, ws, ATPOS_S(vm, vm->serialized_string_heap, i)); vm->serialized_string_heap = NULL; } /* Initialize callsite reuse cache */ ws->callsite_reuse_head = NULL; /* Store each of the dependent SCs. */ num_depscs = ELEMS(vm, ws->cu->sc_handles); for (i = 0; i < num_depscs; i++) write_int32(ws->scdep_seg, i * SC_DEP_SIZE, get_string_heap_index(vm, ws, ATPOS_S_C(vm, ws->cu->sc_handles, i))); /* Store each of the extop names and signatures. */ for (i = 0; i < ws->num_extops; i++) { MASTNode *sig_array; int num_operands, j; write_int32(ws->extops_seg, i * EXTOP_SIZE, get_string_heap_index(vm, ws, ATPOS_S_C(vm, ws->cu->extop_names, i))); sig_array = ATPOS(vm, ws->cu->extop_sigs, i); num_operands = ELEMS(vm, sig_array); for (j = 0; j < 8; j++) write_int8(ws->extops_seg, i * EXTOP_SIZE + 4 + j, j < num_operands ? ATPOS_I(vm, sig_array, j) : 0); } /* Visit and compile each of the frames. */ num_frames = (unsigned short)ELEMS(vm, cu->frames); for (i = 0; i < num_frames; i++) compile_frame(vm, ws, ATPOS(vm, cu->frames, i), ws->current_frame_idx = i); /* Join all the pieces into a bytecode file. */ bytecode = form_bytecode_output(vm, ws, &bytecode_size); /* Cleanup and hand back result. */ cleanup_all(vm, ws); *size = bytecode_size; return bytecode; } MoarVM-2018.03/src/mast/compiler.h0000644000175000017510000000015613237701240016722 0ustar samanthasamanthachar * MVM_mast_compile(MVMThreadContext *tc, MVMObject *node, MASTNodeTypes *types, unsigned int *size); MoarVM-2018.03/src/mast/driver.c0000644000175000017510000000736513237701240016407 0ustar samanthasamantha#include "moar.h" #include "nodes.h" #include "compiler.h" /* Takes a hash of types and produces a MASTNodeTypes structure. */ #define grab_type(name) do { \ MVMString *key = MVM_string_utf8_decode(tc, tc->instance->VMString, #name, strlen(#name)); \ result->name = MVM_repr_at_key_o(tc, types, key); \ } while (0) static MASTNodeTypes * node_types_struct(MVMThreadContext *tc, MVMObject *types) { MASTNodeTypes *result = MVM_malloc(sizeof(MASTNodeTypes)); MVMROOT(tc, types, { grab_type(CompUnit); grab_type(Frame); grab_type(Op); grab_type(ExtOp); grab_type(SVal); grab_type(IVal); grab_type(NVal); grab_type(Label); grab_type(Local); grab_type(Lexical); grab_type(Call); grab_type(Annotated); grab_type(HandlerScope); }); return result; } /* Compiles MAST down to bytecode, then loads it as a compilation unit, * running deserialize and load frames as appropriate. */ void MVM_mast_to_cu(MVMThreadContext *tc, MVMObject *mast, MVMObject *types, MVMRegister *res) { MVMCompUnit *loaded; MVMROOT(tc, mast, { /* Get node types into struct. */ MASTNodeTypes *mnt = node_types_struct(tc, types); /* Turn the MAST tree into bytecode. Switch to gen2 GC allocation to be * sure nothing moves, though we'd really rather not have compiler * temporaries live longer. */ unsigned int size; char *bytecode; MVM_gc_allocate_gen2_default_set(tc); bytecode = MVM_mast_compile(tc, mast, mnt, &size); MVM_free(mnt); MVM_gc_allocate_gen2_default_clear(tc); /* Load it as a compilation unit; it is a kind of MVMObject, so cast * it to that. */ loaded = MVM_cu_from_bytes(tc, (MVMuint8 *)bytecode, (MVMuint32)size); loaded->body.deallocate = MVM_DEALLOCATE_FREE; }); /* Stash loaded comp unit in result register. */ res->o = (MVMObject *)loaded; /* If there's a deserialization frame, need to run that. */ if (loaded->body.deserialize_frame) { /* Set up special return to delegate to running the load frame, * if any. */ tc->cur_frame->return_value = NULL; tc->cur_frame->return_type = MVM_RETURN_VOID; /* Invoke the deserialization frame and return to the runloop. */ MVM_frame_invoke(tc, loaded->body.deserialize_frame, MVM_callsite_get_common(tc, MVM_CALLSITE_ID_NULL_ARGS), NULL, NULL, NULL, -1); } } /* Compiles MAST down to bytecode, then writes it to disk. */ void MVM_mast_to_file(MVMThreadContext *tc, MVMObject *mast, MVMObject *types, MVMString *filename) { MVMROOT(tc, mast, { FILE *fh; char *c_filename; /* Get node types into struct. */ MASTNodeTypes *mnt = node_types_struct(tc, types); /* Turn the MAST tree into bytecode. */ unsigned int size; char *bytecode; MVM_gc_allocate_gen2_default_set(tc); bytecode = MVM_mast_compile(tc, mast, mnt, &size); MVM_free(mnt); MVM_gc_allocate_gen2_default_clear(tc); /* Write it out to a file. (Not using VM-level IO for this right now; * may want to do that in the future.) */ c_filename = MVM_string_utf8_c8_encode_C_string(tc, filename); if ((fh = fopen(c_filename, "wb+"))) { fwrite(bytecode, 1, size, fh); fclose(fh); MVM_free(c_filename); MVM_free(bytecode); } else { char *waste[2]; waste[0] = c_filename; waste[1] = NULL; MVM_free(bytecode); MVM_exception_throw_adhoc_free(tc, waste, "Unable to write bytecode to '%s'", c_filename); } }); } MoarVM-2018.03/src/mast/driver.h0000644000175000017510000000030513237701240016377 0ustar samanthasamanthavoid MVM_mast_to_cu(MVMThreadContext *tc, MVMObject *mast, MVMObject *types, MVMRegister *res); void MVM_mast_to_file(MVMThreadContext *tc, MVMObject *mast, MVMObject *types, MVMString *filename); MoarVM-2018.03/src/mast/nodes.h0000644000175000017510000001344113237701240016221 0ustar samanthasamantha/* MAST::CompUnit */ typedef struct { MVMP6opaque p6o_header; MVMObject *frames; MVMString *hll; MVMObject *main_frame; MVMObject *load_frame; MVMObject *deserialize_frame; MVMObject *sc_handles; MVMObject *sc_lookup; MVMObject *extop_sigs; MVMObject *extop_idx; MVMObject *extop_names; } MAST_CompUnit; /* MAST::Frame */ typedef struct { MVMP6opaque p6o_header; MVMString *cuuid; MVMString *name; MVMObject *lexical_types; MVMObject *lexical_names; MVMObject *local_types; MVMObject *instructions; MVMObject *outer; MVMObject *lexical_map; MVMint64 flags; MVMint64 index; MVMObject *static_lex_values; MVMint64 code_obj_sc_dep_idx; MVMint64 code_obj_sc_idx; } MAST_Frame; /* MAST::Op */ typedef struct { MVMP6opaque p6o_header; MVMint64 op; MVMObject *operands; } MAST_Op; /* MAST::ExtOp */ typedef struct { MVMP6opaque p6o_header; MVMint64 op; MVMObject *operands; MVMString *name; } MAST_ExtOp; /* MAST::SVal */ typedef struct { MVMP6opaque p6o_header; MVMString *value; } MAST_SVal; /* MAST::IVal */ typedef struct { MVMP6opaque p6o_header; MVMint64 value; } MAST_IVal; /* MAST::NVal */ typedef struct { MVMP6opaque p6o_header; MVMnum64 value; } MAST_NVal; /* MAST::Label */ typedef struct { MVMP6opaque p6o_header; } MAST_Label; /* MAST::Local */ typedef struct { MVMP6opaque p6o_header; MVMint64 index; } MAST_Local; /* MAST::Lexical */ typedef struct { MVMP6opaque p6o_header; MVMint64 index; MVMint64 frames_out; } MAST_Lexical; /* MAST::Call */ typedef struct { MVMP6opaque p6o_header; MVMObject *target; MVMObject *flags; MVMObject *args; MVMObject *result; MVMint64 op; } MAST_Call; /* MAST::Annotated */ typedef struct { MVMP6opaque p6o_header; MVMString *file; MVMint64 line; MVMObject *instructions; } MAST_Annotated; /* MAST::HandlerScope */ typedef struct { MVMP6opaque p6o_header; MVMObject *instructions; MVMint64 category_mask; MVMint64 action; MVMObject *goto_label; MVMObject *block_local; MVMObject *label_local; } MAST_HandlerScope; /* Node types structure. */ typedef struct _MASTNodeTypes { MVMObject *CompUnit; MVMObject *Frame; MVMObject *Op; MVMObject *ExtOp; MVMObject *SVal; MVMObject *IVal; MVMObject *NVal; MVMObject *Label; MVMObject *Local; MVMObject *Lexical; MVMObject *Call; MVMObject *Annotated; MVMObject *HandlerScope; } MASTNodeTypes; /* This means we can talk about MASTNode in the compiler, not MVMObject. */ typedef MVMObject MASTNode; /* Similar for strings. */ typedef MVMString VMSTR; /* Way of talking about the interpreter. */ #define VM MVMThreadContext *tc #define vm tc /* Some macros for getting at and examining nodes data. */ #define ISTYPE(VM, s, t) (STABLE(s) == STABLE(t)) #define DIE(vm, msg, ...) MVM_exception_throw_adhoc(tc, msg, ## __VA_ARGS__) #define GET_CompUnit(n) ((MAST_CompUnit *)n) #define GET_Frame(n) ((MAST_Frame *)n) #define GET_Op(n) ((MAST_Op *)n) #define GET_ExtOp(n) ((MAST_ExtOp *)n) #define GET_Label(n) ((MAST_Label *)n) #define GET_Local(n) ((MAST_Local *)n) #define GET_Lexical(n) ((MAST_Lexical *)n) #define GET_IVal(n) ((MAST_IVal *)n) #define GET_NVal(n) ((MAST_NVal *)n) #define GET_SVal(n) ((MAST_SVal *)n) #define GET_Call(n) ((MAST_Call *)n) #define GET_Annotated(n) ((MAST_Annotated *)n) #define GET_HandlerScope(n) ((MAST_HandlerScope *)n) #define NEWLIST_I(vm) (MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTIntArray)) #define NEWLIST_S(vm) (MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTStrArray)) #define ELEMS(vm, arr) ((unsigned int )MVM_repr_elems(vm, arr)) #define ATPOS(vm, arr, i) (MVM_repr_at_pos_o(vm, arr, i)) #define ATPOS_I(vm, arr, i) (MVM_repr_at_pos_i(vm, arr, i)) #define ATPOS_S(vm, arr, i) (MVM_repr_at_pos_s(vm, arr, i)) #define ATPOS_I_C(vm, arr, i) (MVM_repr_get_int(vm, MVM_repr_at_pos_o(vm, arr, i))) #define ATPOS_S_C(vm, arr, i) (MVM_repr_get_str(vm, MVM_repr_at_pos_o(vm, arr, i))) #define BINDPOS(vm, arr, i, v) (MVM_repr_bind_pos_o(vm, arr, i, v)) #define BINDPOS_I(vm, arr, i, v) (MVM_repr_bind_pos_i(vm, arr, i, v)) #define BINDPOS_S(vm, arr, i, v) (MVM_repr_bind_pos_s(vm, arr, i, v)) #define NEWHASH(vm) (MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTHash)) #define HASHELEMS(vm, hash) ((unsigned int )MVM_repr_elems(vm, hash)) #define ATKEY(vm, hash, k) (MVM_repr_at_key_o(vm, hash, k)) #define ATKEY_I(vm, hash, k) (MVM_repr_get_int(tc, MVM_repr_at_key_o(vm, hash, k))) #define BINDKEY(vm, hash, k, v) (MVM_repr_bind_key_o(vm, hash, k, v)) #define BINDKEY_I(vm, hash, k, v) do { \ MVMObject *boxed = MVM_repr_box_int(tc, tc->instance->boot_types.BOOTInt, v); \ MVM_repr_bind_key_o(vm, hash, k, boxed); \ } while (0) #define EXISTSKEY(vm, hash, k) (MVM_repr_exists_key(vm, hash, k)) #define DELETEKEY(vm, hash, k) (MVM_repr_delete_key(vm, hash, k)) #define EMPTY_STRING(vm) (tc->instance->str_consts.empty) #define VM_STRING_IS_NULL(s) (s == NULL) #define VM_OBJ_IS_NULL(o) (o == NULL) #define VM_STRING_TO_C_STRING(vm, s) (MVM_string_ascii_encode_any(tc, s)) #define DIE_FREE(vm, waste, msg, ...) MVM_exception_throw_adhoc_free(tc, waste, msg, ## __VA_ARGS__) MoarVM-2018.03/src/math/bigintops.c0000644000175000017510000011013513242626641017074 0ustar samanthasamantha#include "moar.h" #include #ifndef MAX #define MAX(x,y) ((x)>(y)?(x):(y)) #endif #ifndef MIN #define MIN(x,y) ((x)<(y)?(x):(y)) #endif MVM_STATIC_INLINE void adjust_nursery(MVMThreadContext *tc, MVMP6bigintBody *body) { if (MVM_BIGINT_IS_BIG(body)) { int used = USED(body->u.bigint); int adjustment = MIN(used, 32768) & ~0x7; if (adjustment && (char *)tc->nursery_alloc_limit - adjustment > (char *)tc->nursery_alloc) { tc->nursery_alloc_limit = (char *)(tc->nursery_alloc_limit) - adjustment; } } } /* Taken from mp_set_long, but portably accepts a 64-bit number. */ int MVM_bigint_mp_set_uint64(mp_int * a, MVMuint64 b) { int x, res; mp_zero (a); /* set four bits at a time */ for (x = 0; x < sizeof(MVMuint64) * 2; x++) { /* shift the number up four bits */ if ((res = mp_mul_2d (a, 4, a)) != MP_OKAY) { return res; } /* OR in the top four bits of the source */ a->dp[0] |= (b >> ((sizeof(MVMuint64)) * 8 - 4)) & 15; /* shift the source up to the next four bits */ b <<= 4; /* ensure that digits are not clamped off */ a->used += 1; } mp_clamp(a); return MP_OKAY; } static MVMnum64 mp_get_double(mp_int *a) { MVMnum64 d = 0.0; MVMnum64 sign = SIGN(a) == MP_NEG ? -1.0 : 1.0; int i; if (USED(a) == 0) return d; if (USED(a) == 1) return sign * (MVMnum64) DIGIT(a, 0); mp_clamp(a); i = USED(a) - 1; d = (MVMnum64) DIGIT(a, i); i--; if (i == -1) { return sign * d; } d *= pow(2.0, DIGIT_BIT); d += (MVMnum64) DIGIT(a, i); if (USED(a) > 2) { i--; d *= pow(2.0, DIGIT_BIT); d += (MVMnum64) DIGIT(a, i); } d *= pow(2.0, DIGIT_BIT * i); return sign * d; } static void from_num(MVMnum64 d, mp_int *a) { MVMnum64 d_digit = pow(2, DIGIT_BIT); MVMnum64 da = fabs(d); MVMnum64 upper; MVMnum64 lower; MVMnum64 lowest; MVMnum64 rest; int digits = 0; mp_zero(a); while (da > d_digit * d_digit * d_digit) {; da /= d_digit; digits++; } mp_grow(a, digits + 3); /* populate the top 3 digits */ upper = da / (d_digit*d_digit); rest = fmod(da, d_digit*d_digit); lower = rest / d_digit; lowest = fmod(rest,d_digit ); if (upper >= 1) { MVM_bigint_mp_set_uint64(a, (MVMuint64) upper); mp_mul_2d(a, DIGIT_BIT , a); DIGIT(a, 0) = (mp_digit) lower; mp_mul_2d(a, DIGIT_BIT , a); } else { if (lower >= 1) { MVM_bigint_mp_set_uint64(a, (MVMuint64) lower); mp_mul_2d(a, DIGIT_BIT , a); a->used = 2; } else { a->used = 1; } } DIGIT(a, 0) = (mp_digit) lowest; /* shift the rest */ mp_mul_2d(a, DIGIT_BIT * digits, a); if (d < 0) mp_neg(a, a); mp_clamp(a); mp_shrink(a); } /* Returns the body of a P6bigint, containing the bigint/smallint union, for * operations that want to explicitly handle the two. */ static MVMP6bigintBody * get_bigint_body(MVMThreadContext *tc, MVMObject *obj) { if (IS_CONCRETE(obj)) return (MVMP6bigintBody *)REPR(obj)->box_funcs.get_boxed_ref(tc, STABLE(obj), obj, OBJECT_BODY(obj), MVM_REPR_ID_P6bigint); else MVM_exception_throw_adhoc(tc, "Can only perform big integer operations on concrete objects"); } /* Checks if a bigint can be stored small. */ static int can_be_smallint(const mp_int *i) { if (USED(i) != 1) return 0; return MVM_IS_32BIT_INT(DIGIT(i, 0)); } /* Forces a bigint, even if we only have a smallint. Takes a parameter that * indicates where to allocate a temporary mp_int if needed. */ static mp_int * force_bigint(const MVMP6bigintBody *body, mp_int **tmp) { if (MVM_BIGINT_IS_BIG(body)) { return body->u.bigint; } else { MVMint64 value = body->u.smallint.value; mp_int *i = MVM_malloc(sizeof(mp_int)); mp_init(i); if (value >= 0) { mp_set_long(i, value); } else { mp_set_long(i, -value); mp_neg(i, i); } while (*tmp) tmp++; *tmp = i; return i; } } /* Clears an array that may contain tempory big ints. */ static void clear_temp_bigints(mp_int *const *ints, MVMint32 n) { MVMint32 i; for (i = 0; i < n; i++) if (ints[i]) { mp_clear(ints[i]); MVM_free(ints[i]); } } /* Stores an int64 in a bigint result body, either as a 32-bit smallint if it * is in range, or a big integer if not. */ static void store_int64_result(MVMP6bigintBody *body, MVMint64 result) { if (MVM_IS_32BIT_INT(result)) { body->u.smallint.flag = MVM_BIGINT_32_FLAG; body->u.smallint.value = (MVMint32)result; } else { mp_int *i = MVM_malloc(sizeof(mp_int)); mp_init(i); if (result >= 0) { MVM_bigint_mp_set_uint64(i, (MVMuint64)result); } else { MVM_bigint_mp_set_uint64(i, (MVMuint64)-result); mp_neg(i, i); } body->u.bigint = i; } } /* Stores an bigint in a bigint result body, either as a 32-bit smallint if it * is in range, or a big integer if not. Clears and frees the passed bigint if * it is not being used. */ static void store_bigint_result(MVMP6bigintBody *body, mp_int *i) { if (can_be_smallint(i)) { body->u.smallint.flag = MVM_BIGINT_32_FLAG; body->u.smallint.value = SIGN(i) == MP_NEG ? -DIGIT(i, 0) : DIGIT(i, 0); mp_clear(i); MVM_free(i); } else { body->u.bigint = i; } } /* Bitops on libtomath (no two's complement API) are horrendously inefficient and * really should be hand-coded to work DIGIT-by-DIGIT with in-loop carry * handling. For now we have these fixups. * * The following inverts the bits of a negative bigint, adds 1 to that, and * appends sign-bit extension DIGITs to it to give us a 2s compliment * representation in memory. Do not call it on positive bigints. */ static void grow_and_negate(const mp_int *a, int size, mp_int *b) { int i; /* Always add an extra DIGIT so we can tell positive values * with a one in the highest bit apart from negative values. */ int actual_size = MAX(size, USED(a)) + 1; SIGN(b) = MP_ZPOS; mp_grow(b, actual_size); USED(b) = actual_size; for (i = 0; i < USED(a); i++) { DIGIT(b, i) = (~DIGIT(a, i)) & MP_MASK; } for (; i < actual_size; i++) { DIGIT(b, i) = MP_MASK; } /* Note: This add cannot cause another grow assuming nobody ever * tries to use tommath -0 for anything, and nobody tries to use * this on positive bigints. */ mp_add_d(b, 1, b); } static void two_complement_bitop(mp_int *a, mp_int *b, mp_int *c, int (*mp_bitop)(mp_int *, mp_int *, mp_int *)) { mp_int d; mp_int e; mp_int *f; mp_int *g; f = a; g = b; if (MP_NEG == SIGN(a)) { mp_init(&d); grow_and_negate(a, USED(b), &d); f = &d; } if (MP_NEG == SIGN(b)) { mp_init(&e); grow_and_negate(b, USED(a), &e); g = &e; } /* f and g now guaranteed to each point to positive bigints containing * a two's complement representation of the values in a and b. If either * a or b was negative, the representation is one tomath "digit" longer * than it need be and sign extended. */ mp_bitop(f, g, c); if (f == &d) mp_clear(&d); if (g == &e) mp_clear(&e); /* Use the fact that tomath clamps to detect results that should be * signed. If we created extra tomath "digits" and they resulted in * sign bits of 0, they have been clamped away. If the resulting sign * bits were 1, they remain, and c will have more digits than either of * original operands. Note this only works because we do not * support NOR/NAND/NXOR, and so two zero sign bits can never create 1s. */ if (USED(c) > MAX(USED(a),USED(b))) { int i; for (i = 0; i < USED(c); i++) { DIGIT(c, i) = (~DIGIT(c, i)) & MP_MASK; } mp_add_d(c, 1, c); mp_neg(c, c); } } static void two_complement_shl(mp_int *result, mp_int *value, MVMint64 count) { if (count >= 0) { mp_mul_2d(value, count, result); } else if (MP_NEG == SIGN(value)) { /* fake two's complement semantics on top of sign-magnitude * algorithm appears to work [citation needed] */ mp_add_d(value, 1, result); mp_div_2d(result, -count, result, NULL); mp_sub_d(result, 1, result); } else { mp_div_2d(value, -count, result, NULL); } } #define MVM_BIGINT_UNARY_OP(opname, SMALLINT_OP) \ void MVM_bigint_##opname(MVMThreadContext *tc, MVMObject *result, MVMObject *source) { \ MVMP6bigintBody *bb = get_bigint_body(tc, result); \ if (!IS_CONCRETE(source)) { \ store_int64_result(bb, 0); \ } \ else { \ MVMP6bigintBody *ba = get_bigint_body(tc, source); \ if (MVM_BIGINT_IS_BIG(ba)) { \ mp_int *ia = ba->u.bigint; \ mp_int *ib = MVM_malloc(sizeof(mp_int)); \ mp_init(ib); \ mp_##opname(ia, ib); \ store_bigint_result(bb, ib); \ adjust_nursery(tc, bb); \ } \ else { \ MVMint64 sb; \ MVMint64 sa = ba->u.smallint.value; \ SMALLINT_OP; \ store_int64_result(bb, sb); \ } \ } \ } #define MVM_BIGINT_BINARY_OP(opname) \ MVMObject * MVM_bigint_##opname(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a, MVMObject *b) { \ MVMP6bigintBody *ba, *bb, *bc; \ MVMObject *result; \ mp_int *tmp[2] = { NULL, NULL }; \ mp_int *ia, *ib, *ic; \ MVMROOT2(tc, a, b, { \ result = MVM_repr_alloc_init(tc, result_type);\ }); \ ba = get_bigint_body(tc, a); \ bb = get_bigint_body(tc, b); \ bc = get_bigint_body(tc, result); \ ia = force_bigint(ba, tmp); \ ib = force_bigint(bb, tmp); \ ic = MVM_malloc(sizeof(mp_int)); \ mp_init(ic); \ mp_##opname(ia, ib, ic); \ store_bigint_result(bc, ic); \ clear_temp_bigints(tmp, 2); \ adjust_nursery(tc, bc); \ return result; \ } #define MVM_BIGINT_BINARY_OP_SIMPLE(opname, SMALLINT_OP) \ MVMObject * MVM_bigint_##opname(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a, MVMObject *b) { \ MVMP6bigintBody *ba, *bb, *bc; \ MVMObject *result; \ ba = get_bigint_body(tc, a); \ bb = get_bigint_body(tc, b); \ if (MVM_BIGINT_IS_BIG(ba) || MVM_BIGINT_IS_BIG(bb)) { \ mp_int *tmp[2] = { NULL, NULL }; \ mp_int *ia, *ib, *ic; \ MVMROOT2(tc, a, b, { \ result = MVM_repr_alloc_init(tc, result_type);\ }); \ ba = get_bigint_body(tc, a); \ bb = get_bigint_body(tc, b); \ bc = get_bigint_body(tc, result); \ ia = force_bigint(ba, tmp); \ ib = force_bigint(bb, tmp); \ ic = MVM_malloc(sizeof(mp_int)); \ mp_init(ic); \ mp_##opname(ia, ib, ic); \ store_bigint_result(bc, ic); \ clear_temp_bigints(tmp, 2); \ adjust_nursery(tc, bc); \ } \ else { \ MVMint64 sc; \ MVMint64 sa = ba->u.smallint.value; \ MVMint64 sb = bb->u.smallint.value; \ SMALLINT_OP; \ result = MVM_intcache_get(tc, result_type, sc); \ if (result) \ return result; \ result = MVM_repr_alloc_init(tc, result_type);\ bc = get_bigint_body(tc, result); \ store_int64_result(bc, sc); \ } \ return result; \ } #define MVM_BIGINT_BINARY_OP_2(opname, SMALLINT_OP) \ MVMObject * MVM_bigint_##opname(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a, MVMObject *b) { \ MVMP6bigintBody *ba = get_bigint_body(tc, a); \ MVMP6bigintBody *bb = get_bigint_body(tc, b); \ MVMP6bigintBody *bc; \ MVMObject *result; \ MVMROOT2(tc, a, b, { \ result = MVM_repr_alloc_init(tc, result_type);\ }); \ bc = get_bigint_body(tc, result); \ if (MVM_BIGINT_IS_BIG(ba) || MVM_BIGINT_IS_BIG(bb)) { \ mp_int *tmp[2] = { NULL, NULL }; \ mp_int *ia = force_bigint(ba, tmp); \ mp_int *ib = force_bigint(bb, tmp); \ mp_int *ic = MVM_malloc(sizeof(mp_int)); \ mp_init(ic); \ two_complement_bitop(ia, ib, ic, mp_##opname); \ store_bigint_result(bc, ic); \ clear_temp_bigints(tmp, 2); \ adjust_nursery(tc, bc); \ } \ else { \ MVMint64 sc; \ MVMint64 sa = ba->u.smallint.value; \ MVMint64 sb = bb->u.smallint.value; \ SMALLINT_OP; \ store_int64_result(bc, sc); \ } \ return result; \ } MVM_BIGINT_UNARY_OP(abs, { sb = labs(sa); }) MVM_BIGINT_UNARY_OP(neg, { sb = -sa; }) /* unused */ /* MVM_BIGINT_UNARY_OP(sqrt) */ MVM_BIGINT_BINARY_OP_SIMPLE(add, { sc = sa + sb; }) MVM_BIGINT_BINARY_OP_SIMPLE(sub, { sc = sa - sb; }) MVM_BIGINT_BINARY_OP_SIMPLE(mul, { sc = sa * sb; }) MVM_BIGINT_BINARY_OP(lcm) MVMObject *MVM_bigint_gcd(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a, MVMObject *b) { MVMP6bigintBody *ba = get_bigint_body(tc, a); MVMP6bigintBody *bb = get_bigint_body(tc, b); MVMP6bigintBody *bc; MVMObject *result; MVMROOT2(tc, a, b, { result = MVM_repr_alloc_init(tc, result_type); }); bc = get_bigint_body(tc, result); if (MVM_BIGINT_IS_BIG(ba) || MVM_BIGINT_IS_BIG(bb)) { mp_int *tmp[2] = { NULL, NULL }; mp_int *ia = force_bigint(ba, tmp); mp_int *ib = force_bigint(bb, tmp); mp_int *ic = MVM_malloc(sizeof(mp_int)); mp_init(ic); mp_gcd(ia, ib, ic); store_bigint_result(bc, ic); clear_temp_bigints(tmp, 2); adjust_nursery(tc, bc); } else { MVMint32 sa = ba->u.smallint.value; MVMint32 sb = bb->u.smallint.value; MVMint32 t; sa = abs(sa); sb = abs(sb); while (sb != 0) { t = sb; sb = sa % sb; sa = t; } store_int64_result(bc, sa); } return result; } MVM_BIGINT_BINARY_OP_2(or , { sc = sa | sb; }) MVM_BIGINT_BINARY_OP_2(xor, { sc = sa ^ sb; }) MVM_BIGINT_BINARY_OP_2(and, { sc = sa & sb; }) MVMint64 MVM_bigint_cmp(MVMThreadContext *tc, MVMObject *a, MVMObject *b) { MVMP6bigintBody *ba = get_bigint_body(tc, a); MVMP6bigintBody *bb = get_bigint_body(tc, b); if (MVM_BIGINT_IS_BIG(ba) || MVM_BIGINT_IS_BIG(bb)) { mp_int *tmp[2] = { NULL, NULL }; mp_int *ia = force_bigint(ba, tmp); mp_int *ib = force_bigint(bb, tmp); MVMint64 r = (MVMint64)mp_cmp(ia, ib); clear_temp_bigints(tmp, 2); return r; } else { MVMint64 sa = ba->u.smallint.value; MVMint64 sb = bb->u.smallint.value; return sa == sb ? 0 : sa < sb ? -1 : 1; } } MVMObject * MVM_bigint_mod(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a, MVMObject *b) { MVMP6bigintBody *ba = get_bigint_body(tc, a); MVMP6bigintBody *bb = get_bigint_body(tc, b); MVMP6bigintBody *bc; MVMObject *result; MVMROOT2(tc, a, b, { result = MVM_repr_alloc_init(tc, result_type); }); bc = get_bigint_body(tc, result); /* XXX the behavior of C's mod operator is not correct * for our purposes. So we rely on mp_mod for all our modulus * calculations for now. */ if (1 || MVM_BIGINT_IS_BIG(ba) || MVM_BIGINT_IS_BIG(bb)) { mp_int *tmp[2] = { NULL, NULL }; mp_int *ia = force_bigint(ba, tmp); mp_int *ib = force_bigint(bb, tmp); mp_int *ic = MVM_malloc(sizeof(mp_int)); int mp_result; mp_init(ic); mp_result = mp_mod(ia, ib, ic); clear_temp_bigints(tmp, 2); if (mp_result == MP_VAL) { MVM_exception_throw_adhoc(tc, "Division by zero"); } store_bigint_result(bc, ic); adjust_nursery(tc, bc); } else { store_int64_result(bc, ba->u.smallint.value % bb->u.smallint.value); } return result; } MVMObject *MVM_bigint_div(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a, MVMObject *b) { MVMP6bigintBody *ba = get_bigint_body(tc, a); MVMP6bigintBody *bb = get_bigint_body(tc, b); MVMP6bigintBody *bc; mp_int *ia, *ib, *ic; int cmp_a; int cmp_b; mp_int remainder; mp_int intermediate; MVMObject *result; int mp_result; if (!MVM_BIGINT_IS_BIG(bb) && bb->u.smallint.value == 1 && STABLE(a) == STABLE(b)) { return a; } MVMROOT2(tc, a, b, { result = MVM_repr_alloc_init(tc, result_type); }); bc = get_bigint_body(tc, result); /* we only care about MP_LT or !MP_LT, so we give MP_GT even for 0. */ if (MVM_BIGINT_IS_BIG(ba)) { cmp_a = !mp_iszero(ba->u.bigint) && SIGN(ba->u.bigint) == MP_NEG ? MP_LT : MP_GT; } else { cmp_a = ba->u.smallint.value < 0 ? MP_LT : MP_GT; } if (MVM_BIGINT_IS_BIG(bb)) { cmp_b = !mp_iszero(bb->u.bigint) && SIGN(bb->u.bigint) == MP_NEG ? MP_LT : MP_GT; } else { cmp_b = bb->u.smallint.value < 0 ? MP_LT : MP_GT; } if (MVM_BIGINT_IS_BIG(ba) || MVM_BIGINT_IS_BIG(bb)) { mp_int *tmp[2] = { NULL, NULL }; ia = force_bigint(ba, tmp); ib = force_bigint(bb, tmp); ic = MVM_malloc(sizeof(mp_int)); mp_init(ic); /* if we do a div with a negative, we need to make sure * the result is floored rather than rounded towards * zero, like C and libtommath would do. */ if ((cmp_a == MP_LT) ^ (cmp_b == MP_LT)) { mp_init(&remainder); mp_init(&intermediate); mp_result = mp_div(ia, ib, &intermediate, &remainder); if (mp_result == MP_VAL) { mp_clear(&remainder); mp_clear(&intermediate); clear_temp_bigints(tmp, 2); MVM_exception_throw_adhoc(tc, "Division by zero"); } if (mp_iszero(&remainder) == 0) { mp_sub_d(&intermediate, 1, ic); } else { mp_copy(&intermediate, ic); } mp_clear(&remainder); mp_clear(&intermediate); } else { mp_result = mp_div(ia, ib, ic, NULL); if (mp_result == MP_VAL) { clear_temp_bigints(tmp, 2); MVM_exception_throw_adhoc(tc, "Division by zero"); } } store_bigint_result(bc, ic); clear_temp_bigints(tmp, 2); adjust_nursery(tc, bc); } else { MVMint32 num = ba->u.smallint.value; MVMint32 denom = bb->u.smallint.value; MVMint32 value; if ((cmp_a == MP_LT) ^ (cmp_b == MP_LT)) { if (denom == 0) { MVM_exception_throw_adhoc(tc, "Division by zero"); } if ((num % denom) != 0) { value = num / denom - 1; } else { value = num / denom; } } else { value = num / denom; } store_int64_result(bc, value); } return result; } MVMObject * MVM_bigint_pow(MVMThreadContext *tc, MVMObject *a, MVMObject *b, MVMObject *num_type, MVMObject *int_type) { MVMP6bigintBody *ba = get_bigint_body(tc, a); MVMP6bigintBody *bb = get_bigint_body(tc, b); MVMObject *r = NULL; mp_int *tmp[2] = { NULL, NULL }; mp_int *base = force_bigint(ba, tmp); mp_int *exponent = force_bigint(bb, tmp); mp_digit exponent_d = 0; if (mp_iszero(exponent) || (MP_EQ == mp_cmp_d(base, 1))) { r = MVM_repr_box_int(tc, int_type, 1); } else if (SIGN(exponent) == MP_ZPOS) { exponent_d = mp_get_int(exponent); if ((MP_GT == mp_cmp_d(exponent, exponent_d))) { if (mp_iszero(base)) { r = MVM_repr_box_int(tc, int_type, 0); } else if (mp_get_int(base) == 1) { r = MVM_repr_box_int(tc, int_type, MP_ZPOS == SIGN(base) || mp_iseven(exponent) ? 1 : -1); } else { MVMnum64 inf; if (MP_ZPOS == SIGN(base) || mp_iseven(exponent)) { inf = MVM_num_posinf(tc); } else { inf = MVM_num_neginf(tc); } r = MVM_repr_box_num(tc, num_type, inf); } } else { mp_int *ic = MVM_malloc(sizeof(mp_int)); MVMP6bigintBody *resbody; mp_init(ic); MVM_gc_mark_thread_blocked(tc); mp_expt_d(base, exponent_d, ic); MVM_gc_mark_thread_unblocked(tc); r = MVM_repr_alloc_init(tc, int_type); resbody = get_bigint_body(tc, r); store_bigint_result(resbody, ic); adjust_nursery(tc, resbody); } } else { MVMnum64 f_base = mp_get_double(base); MVMnum64 f_exp = mp_get_double(exponent); r = MVM_repr_box_num(tc, num_type, pow(f_base, f_exp)); } clear_temp_bigints(tmp, 2); return r; } MVMObject *MVM_bigint_shl(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a, MVMint64 n) { MVMP6bigintBody *ba = get_bigint_body(tc, a); MVMP6bigintBody *bb; MVMObject *result; MVMROOT(tc, a, { result = MVM_repr_alloc_init(tc, result_type); }); bb = get_bigint_body(tc, result); if (MVM_BIGINT_IS_BIG(ba) || n >= 31) { mp_int *tmp[1] = { NULL }; mp_int *ia = force_bigint(ba, tmp); mp_int *ib = MVM_malloc(sizeof(mp_int)); mp_init(ib); two_complement_shl(ib, ia, n); store_bigint_result(bb, ib); clear_temp_bigints(tmp, 1); adjust_nursery(tc, bb); } else { MVMint64 value; if (n < 0) value = ((MVMint64)ba->u.smallint.value) >> -n; else value = ((MVMint64)ba->u.smallint.value) << n; store_int64_result(bb, value); } return result; } /* Checks if a MVMP6bigintBody is negative. Handles cases where it is stored as * a small int as well as cases when it is stored as a bigint */ int BIGINT_IS_NEGATIVE (MVMP6bigintBody *ba) { mp_int *mp_a = ba->u.bigint; if (MVM_BIGINT_IS_BIG(ba)) { return SIGN(mp_a) == MP_NEG; } else { return ba->u.smallint.value < 0; } } MVMObject *MVM_bigint_shr(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a, MVMint64 n) { MVMP6bigintBody *ba = get_bigint_body(tc, a); MVMP6bigintBody *bb; MVMObject *result; MVMROOT(tc, a, { result = MVM_repr_alloc_init(tc, result_type); }); bb = get_bigint_body(tc, result); if (MVM_BIGINT_IS_BIG(ba) || n < 0) { mp_int *tmp[1] = { NULL }; mp_int *ia = force_bigint(ba, tmp); mp_int *ib = MVM_malloc(sizeof(mp_int)); mp_init(ib); two_complement_shl(ib, ia, -n); store_bigint_result(bb, ib); clear_temp_bigints(tmp, 1); adjust_nursery(tc, bb); } else if (n >= 32) { store_int64_result(bb, BIGINT_IS_NEGATIVE(ba) ? -1 : 0); } else { MVMint32 value = ba->u.smallint.value; value = value >> n; store_int64_result(bb, value); } return result; } MVMObject *MVM_bigint_not(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a) { MVMP6bigintBody *ba = get_bigint_body(tc, a); MVMP6bigintBody *bb; MVMObject *result; MVMROOT(tc, a, { result = MVM_repr_alloc_init(tc, result_type); }); bb = get_bigint_body(tc, result); if (MVM_BIGINT_IS_BIG(ba)) { mp_int *ia = ba->u.bigint; mp_int *ib = MVM_malloc(sizeof(mp_int)); mp_init(ib); /* two's complement not: add 1 and negate */ mp_add_d(ia, 1, ib); mp_neg(ib, ib); store_bigint_result(bb, ib); adjust_nursery(tc, bb); } else { MVMint32 value = ba->u.smallint.value; value = ~value; store_int64_result(bb, value); } return result; } void MVM_bigint_expmod(MVMThreadContext *tc, MVMObject *result, MVMObject *a, MVMObject *b, MVMObject *c) { MVMP6bigintBody *ba = get_bigint_body(tc, a); MVMP6bigintBody *bb = get_bigint_body(tc, b); MVMP6bigintBody *bc = get_bigint_body(tc, c); MVMP6bigintBody *bd = get_bigint_body(tc, result); mp_int *tmp[3] = { NULL, NULL, NULL }; mp_int *ia = force_bigint(ba, tmp); mp_int *ib = force_bigint(bb, tmp); mp_int *ic = force_bigint(bc, tmp); mp_int *id = MVM_malloc(sizeof(mp_int)); mp_init(id); mp_exptmod(ia, ib, ic, id); store_bigint_result(bd, id); clear_temp_bigints(tmp, 3); adjust_nursery(tc, bd); } void MVM_bigint_from_str(MVMThreadContext *tc, MVMObject *a, const char *buf) { MVMP6bigintBody *body = get_bigint_body(tc, a); mp_int *i = MVM_malloc(sizeof(mp_int)); mp_init(i); mp_read_radix(i, buf, 10); adjust_nursery(tc, body); if (can_be_smallint(i)) { body->u.smallint.flag = MVM_BIGINT_32_FLAG; body->u.smallint.value = SIGN(i) == MP_NEG ? -DIGIT(i, 0) : DIGIT(i, 0); mp_clear(i); MVM_free(i); } else { body->u.bigint = i; } } MVMObject * MVM_bigint_from_bigint(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a) { MVMP6bigintBody *a_body; MVMP6bigintBody *r_body; MVMObject *result; MVMROOT(tc, a, { result = MVM_repr_alloc_init(tc, result_type); }); a_body = get_bigint_body(tc, a); r_body = get_bigint_body(tc, result); if (MVM_BIGINT_IS_BIG(a_body)) { mp_int *i = MVM_malloc(sizeof(mp_int)); mp_init_copy(i, a_body->u.bigint); store_bigint_result(r_body, i); adjust_nursery(tc, r_body); } else { r_body->u.smallint = a_body->u.smallint; r_body->u.smallint.flag = a_body->u.smallint.flag; r_body->u.smallint.value = a_body->u.smallint.value; } return result; } MVMString * MVM_bigint_to_str(MVMThreadContext *tc, MVMObject *a, int base) { MVMP6bigintBody *body = get_bigint_body(tc, a); if (MVM_BIGINT_IS_BIG(body)) { mp_int *i = body->u.bigint; int len; char *buf; MVMString *result; mp_radix_size(i, base, &len); buf = (char *) MVM_malloc(len); mp_toradix_n(i, buf, base, len); result = MVM_string_ascii_decode(tc, tc->instance->VMString, buf, len - 1); MVM_free(buf); return result; } else { if (base == 10) { return MVM_coerce_i_s(tc, body->u.smallint.value); } else { /* It's small, but shove it through bigint lib, as it knows how to * get other bases right. */ mp_int i; int len; char *buf; MVMString *result; MVMint64 value = body->u.smallint.value; mp_init(&i); if (value >= 0) { mp_set_long(&i, value); } else { mp_set_long(&i, -value); mp_neg(&i, &i); } mp_radix_size(&i, base, &len); buf = (char *) MVM_malloc(len); mp_toradix_n(&i, buf, base, len); result = MVM_string_ascii_decode(tc, tc->instance->VMString, buf, len - 1); MVM_free(buf); mp_clear(&i); return result; } } } MVMnum64 MVM_bigint_to_num(MVMThreadContext *tc, MVMObject *a) { MVMP6bigintBody *ba = get_bigint_body(tc, a); if (MVM_BIGINT_IS_BIG(ba)) { mp_int *ia = ba->u.bigint; return mp_get_double(ia); } else { return (double)ba->u.smallint.value; } } MVMObject *MVM_bigint_from_num(MVMThreadContext *tc, MVMObject *result_type, MVMnum64 n) { MVMObject * const result = MVM_repr_alloc_init(tc, result_type); MVMP6bigintBody *ba = get_bigint_body(tc, result); mp_int *ia = MVM_malloc(sizeof(mp_int)); mp_init(ia); from_num(n, ia); store_bigint_result(ba, ia); return result; } MVMnum64 MVM_bigint_div_num(MVMThreadContext *tc, MVMObject *a, MVMObject *b) { MVMP6bigintBody *ba = get_bigint_body(tc, a); MVMP6bigintBody *bb = get_bigint_body(tc, b); MVMnum64 c; if (MVM_BIGINT_IS_BIG(ba) || MVM_BIGINT_IS_BIG(bb)) { mp_int *tmp[2] = { NULL, NULL }; mp_int *ia = force_bigint(ba, tmp); mp_int *ib = force_bigint(bb, tmp); int max_size = DIGIT_BIT * MAX(USED(ia), USED(ib)); if (max_size > 1023) { mp_int reduced_a, reduced_b; mp_init(&reduced_a); mp_init(&reduced_b); mp_div_2d(ia, max_size - 1023, &reduced_a, NULL); mp_div_2d(ib, max_size - 1023, &reduced_b, NULL); c = mp_get_double(&reduced_a) / mp_get_double(&reduced_b); mp_clear(&reduced_a); mp_clear(&reduced_b); } else { c = mp_get_double(ia) / mp_get_double(ib); } clear_temp_bigints(tmp, 2); } else { c = (double)ba->u.smallint.value / (double)bb->u.smallint.value; } return c; } MVMObject * MVM_bigint_rand(MVMThreadContext *tc, MVMObject *type, MVMObject *b) { MVMObject *result; MVMP6bigintBody *ba; MVMP6bigintBody *bb = get_bigint_body(tc, b); MVMint8 use_small_arithmetic = 0; MVMint8 have_to_negate = 0; MVMint32 smallint_max = 0; if (MVM_BIGINT_IS_BIG(bb)) { if (can_be_smallint(bb->u.bigint)) { use_small_arithmetic = 1; smallint_max = DIGIT(bb->u.bigint, 0); have_to_negate = SIGN(bb->u.bigint) == MP_NEG; } } else { use_small_arithmetic = 1; smallint_max = bb->u.smallint.value; } if (use_small_arithmetic) { if (MP_GEN_RANDOM_MAX >= abs(smallint_max)) { mp_digit result_int = MP_GEN_RANDOM(); result_int = result_int % smallint_max; if(have_to_negate) result_int *= -1; MVMROOT2(tc, type, b, { result = MVM_repr_alloc_init(tc, type); }); ba = get_bigint_body(tc, result); store_int64_result(ba, result_int); } else { use_small_arithmetic = 0; } } if (!use_small_arithmetic) { mp_int *tmp[1] = { NULL }; mp_int *rnd = MVM_malloc(sizeof(mp_int)); mp_int *max = force_bigint(bb, tmp); MVMROOT2(tc, type, b, { result = MVM_repr_alloc_init(tc, type); }); ba = get_bigint_body(tc, result); mp_init(rnd); mp_rand(rnd, USED(max) + 1); mp_mod(rnd, max, rnd); store_bigint_result(ba, rnd); clear_temp_bigints(tmp, 1); adjust_nursery(tc, ba); } return result; } MVMint64 MVM_bigint_is_prime(MVMThreadContext *tc, MVMObject *a, MVMint64 b) { /* mp_prime_is_prime returns True for 1, and I think * it's worth special-casing this particular number :-) */ MVMP6bigintBody *ba = get_bigint_body(tc, a); if (MVM_BIGINT_IS_BIG(ba) || ba->u.smallint.value != 1) { mp_int *tmp[1] = { NULL }; mp_int *ia = force_bigint(ba, tmp); if (mp_cmp_d(ia, 1) == MP_EQ) { clear_temp_bigints(tmp, 1); return 0; } else { int result; mp_prime_is_prime(ia, b, &result); clear_temp_bigints(tmp, 1); return result; } } else { /* we only reach this if we have a smallint that's equal to 1. * which we define as not-prime. */ return 0; } } /* concatenating with "" ensures that only literal strings are accepted as argument. */ #define STR_WITH_LEN(str) ("" str ""), (sizeof(str) - 1) MVMObject * MVM_bigint_radix(MVMThreadContext *tc, MVMint64 radix, MVMString *str, MVMint64 offset, MVMint64 flag, MVMObject *type) { MVMObject *result; MVMint64 chars = MVM_string_graphs(tc, str); MVMuint16 neg = 0; MVMint64 ch; mp_int zvalue; mp_int zbase; MVMObject *value_obj; mp_int *value; MVMP6bigintBody *bvalue; MVMObject *base_obj; mp_int *base; MVMP6bigintBody *bbase; MVMObject *pos_obj; MVMint64 pos = -1; if (radix > 36) { MVM_exception_throw_adhoc(tc, "Cannot convert radix of %"PRId64" (max 36)", radix); } MVM_gc_root_temp_push(tc, (MVMCollectable **)&str); MVM_gc_root_temp_push(tc, (MVMCollectable **)&type); /* initialize the object */ result = MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_array_type); MVM_gc_root_temp_push(tc, (MVMCollectable **)&result); mp_init(&zvalue); mp_init(&zbase); mp_set_int(&zbase, 1); value_obj = MVM_repr_alloc_init(tc, type); MVM_repr_push_o(tc, result, value_obj); MVM_gc_root_temp_push(tc, (MVMCollectable **)&value_obj); base_obj = MVM_repr_alloc_init(tc, type); MVM_repr_push_o(tc, result, base_obj); bvalue = get_bigint_body(tc, value_obj); bbase = get_bigint_body(tc, base_obj); value = MVM_malloc(sizeof(mp_int)); base = MVM_malloc(sizeof(mp_int)); mp_init(value); mp_init(base); mp_set_int(base, 1); ch = (offset < chars) ? MVM_string_get_grapheme_at_nocheck(tc, str, offset) : 0; if ((flag & 0x02) && (ch == '+' || ch == '-')) { neg = (ch == '-'); offset++; ch = (offset < chars) ? MVM_string_get_grapheme_at_nocheck(tc, str, offset) : 0; } while (offset < chars) { if (ch >= '0' && ch <= '9') ch = ch - '0'; /* fast-path for ASCII 0..9 */ else if (ch >= 'a' && ch <= 'z') ch = ch - 'a' + 10; else if (ch >= 'A' && ch <= 'Z') ch = ch - 'A' + 10; else if (ch >= 0xFF21 && ch <= 0xFF3A) ch = ch - 0xFF21 + 10; /* uppercase fullwidth */ else if (ch >= 0xFF41 && ch <= 0xFF5A) ch = ch - 0xFF41 + 10; /* lowercase fullwidth */ else if (ch > 0 && MVM_unicode_codepoint_get_property_int(tc, ch, MVM_UNICODE_PROPERTY_NUMERIC_TYPE) == MVM_UNICODE_PVALUE_Numeric_Type_DECIMAL) { /* as of Unicode 9.0.0, characters with the 'de' Numeric Type (and are * thus also of General Category Nd, since 4.0.0) are contiguous * sequences of 10 chars whose Numeric Values ascend from 0 through 9. */ /* the string returned for NUMERIC_VALUE_NUMERATOR contains an integer * value. We can use numerator because they all are from 0-9 and have * denominator of 1 */ ch = fast_atoi(MVM_unicode_codepoint_get_property_cstr(tc, ch, MVM_UNICODE_PROPERTY_NUMERIC_VALUE_NUMERATOR)); } else break; if (ch >= radix) break; mp_mul_d(&zvalue, radix, &zvalue); mp_add_d(&zvalue, ch, &zvalue); mp_mul_d(&zbase, radix, &zbase); offset++; pos = offset; if (ch != 0 || !(flag & 0x04)) { mp_copy(&zvalue, value); mp_copy(&zbase, base); } if (offset >= chars) break; ch = MVM_string_get_grapheme_at_nocheck(tc, str, offset); if (ch != '_') continue; offset++; if (offset >= chars) break; ch = MVM_string_get_grapheme_at_nocheck(tc, str, offset); } mp_clear(&zvalue); mp_clear(&zbase); if (neg || flag & 0x01) { mp_neg(value, value); } store_bigint_result(bvalue, value); store_bigint_result(bbase, base); adjust_nursery(tc, bvalue); adjust_nursery(tc, bbase); pos_obj = MVM_repr_box_int(tc, type, pos); MVM_repr_push_o(tc, result, pos_obj); MVM_gc_root_temp_pop_n(tc, 4); return result; } /* returns 1 if a is too large to fit into an INTVAL without loss of information */ MVMint64 MVM_bigint_is_big(MVMThreadContext *tc, MVMObject *a) { MVMP6bigintBody *ba = get_bigint_body(tc, a); if (MVM_BIGINT_IS_BIG(ba)) { mp_int *b = ba->u.bigint; MVMint64 is_big = b->used > 1; /* XXX somebody please check that on a 32 bit platform */ if ( sizeof(MVMint64) * 8 > DIGIT_BIT && is_big == 0 && DIGIT(b, 0) & ~0x7FFFFFFFUL) is_big = 1; return is_big; } else { /* if it's in a smallint, it's 32 bits big at most and fits into an INTVAL easily. */ return 0; } } MVMint64 MVM_bigint_bool(MVMThreadContext *tc, MVMObject *a) { MVMP6bigintBody *body = get_bigint_body(tc, a); if (MVM_BIGINT_IS_BIG(body)) return !mp_iszero(body->u.bigint); else return body->u.smallint.value != 0; } MoarVM-2018.03/src/math/bigintops.h0000644000175000017510000000531613242626641017105 0ustar samanthasamanthaint MVM_bigint_mp_set_uint64(mp_int * a, MVMuint64 b); void MVM_bigint_abs(MVMThreadContext *tc, MVMObject *result, MVMObject *a); void MVM_bigint_neg(MVMThreadContext *tc, MVMObject *result, MVMObject *a); MVMObject * MVM_bigint_not(MVMThreadContext *tc, MVMObject *result, MVMObject *a); /* unused */ /* void MVM_bigint_sqrt(MVMObject *b, MVMObject *a); */ MVMObject * MVM_bigint_add(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a, MVMObject *b); MVMObject * MVM_bigint_sub(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a, MVMObject *b); MVMObject * MVM_bigint_mul(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a, MVMObject *b); MVMObject * MVM_bigint_div(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a, MVMObject *b); MVMObject * MVM_bigint_mod(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a, MVMObject *b); MVMObject * MVM_bigint_pow(MVMThreadContext *tc, MVMObject *a, MVMObject *b, MVMObject *num_type, MVMObject *int_type); MVMObject * MVM_bigint_gcd(MVMThreadContext *tc, MVMObject *result, MVMObject *a, MVMObject *b); MVMObject * MVM_bigint_lcm(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a, MVMObject *b); MVMObject * MVM_bigint_or(MVMThreadContext *tc, MVMObject *result, MVMObject *a, MVMObject *b); MVMObject * MVM_bigint_xor(MVMThreadContext *tc, MVMObject *result, MVMObject *a, MVMObject *b); MVMObject * MVM_bigint_and(MVMThreadContext *tc, MVMObject *result, MVMObject *a, MVMObject *b); MVMObject * MVM_bigint_shl(MVMThreadContext *tc, MVMObject *result, MVMObject *a, MVMint64 n); MVMObject * MVM_bigint_shr(MVMThreadContext *tc, MVMObject *result, MVMObject *a, MVMint64 n); void MVM_bigint_expmod(MVMThreadContext *tc, MVMObject *result, MVMObject *a, MVMObject *b, MVMObject *c); MVMint64 MVM_bigint_cmp(MVMThreadContext *tc, MVMObject *a, MVMObject *b); MVMObject * MVM_bigint_from_bigint(MVMThreadContext *tc, MVMObject *result_type, MVMObject *a); void MVM_bigint_from_str(MVMThreadContext *tc, MVMObject *a, const char *buf); MVMString * MVM_bigint_to_str(MVMThreadContext *tc, MVMObject *a, int base); MVMnum64 MVM_bigint_to_num(MVMThreadContext *tc, MVMObject *a); MVMObject *MVM_bigint_from_num(MVMThreadContext *tc, MVMObject *result_type, MVMnum64 n); MVMnum64 MVM_bigint_div_num(MVMThreadContext *tc, MVMObject *a, MVMObject *b); MVMObject * MVM_bigint_rand(MVMThreadContext *tc, MVMObject *a, MVMObject *b); MVMint64 MVM_bigint_is_prime(MVMThreadContext *tc, MVMObject *a, MVMint64 b); MVMObject * MVM_bigint_radix(MVMThreadContext *tc, MVMint64 radix, MVMString *str, MVMint64 offset, MVMint64 flag, MVMObject *type); MVMint64 MVM_bigint_is_big(MVMThreadContext *tc, MVMObject *a); MVMint64 MVM_bigint_bool(MVMThreadContext *tc, MVMObject *a); MoarVM-2018.03/src/math/num.c0000644000175000017510000000201413237701240015662 0ustar samanthasamantha#include "moar.h" #include #ifdef _WIN32 #include #endif #if defined(INFINITY) && !defined(_AIX) static const MVMnum64 MVM_NUM_POSINF = INFINITY; static const MVMnum64 MVM_NUM_NEGINF = -INFINITY; #else # ifdef _MSC_VER #define MVM_NUM_POSINF (DBL_MAX+DBL_MAX) #define MVM_NUM_NEGINF -(DBL_MAX+DBL_MAX) # else static const MVMnum64 MVM_NUM_POSINF = 1.0 / 0.0; static const MVMnum64 MVM_NUM_NEGINF = -1.0 / 0.0; # endif #endif #if defined(NAN) && !defined(_AIX) static const MVMnum64 MVM_NUM_NAN = NAN; #else # ifdef _MSC_VER #define MVM_NUM_NAN (MVM_NUM_POSINF-MVM_NUM_POSINF) # else static const MVMnum64 MVM_NUM_NAN = 0.0 / 0.0; # endif #endif MVMint64 MVM_num_isnanorinf(MVMThreadContext *tc, MVMnum64 n) { return n == MVM_NUM_POSINF || n == MVM_NUM_NEGINF || n != n; } MVMnum64 MVM_num_posinf(MVMThreadContext *tc) { return MVM_NUM_POSINF; } MVMnum64 MVM_num_neginf(MVMThreadContext *tc) { return MVM_NUM_NEGINF; } MVMnum64 MVM_num_nan(MVMThreadContext *tc) { return MVM_NUM_NAN; } MoarVM-2018.03/src/math/num.h0000644000175000017510000000031113237701240015665 0ustar samanthasamanthaMVMint64 MVM_num_isnanorinf(MVMThreadContext *tc, MVMnum64 n); MVMnum64 MVM_num_posinf(MVMThreadContext *tc); MVMnum64 MVM_num_neginf(MVMThreadContext *tc); MVMnum64 MVM_num_nan(MVMThreadContext *tc); MoarVM-2018.03/src/memdebug.h0000644000175000017510000000134413237701240015731 0ustar samanthasamantha#ifdef MVM_VALGRIND_SUPPORT # include /* The redzone we will put in front of and after every * allocation from the fixed size allocator */ #ifndef MVM_FSA_REDZONE_BYTES #define MVM_FSA_REDZONE_BYTES 4 #endif #else #define MVM_FSA_REDZONE_BYTES 0 #define VALGRIND_CREATE_MEMPOOL(pool, rzB, is_zeroed) do { } while (0) #define VALGRIND_CREATE_MEMPOOL_EXT(pool, rzB, is_zeroed, flags) do { } while (0) #define VALGRIND_DESTROY_MEMPOOL(pool) do { } while (0) #define VALGRIND_MEMPOOL_ALLOC(pool, addr, size) do { } while (0) #define VALGRIND_MEMPOOL_FREE(pool, addr) do { } while (0) #define VALGRIND_MOVE_MEMPOOL(poolA, poolB) do { } while (0) #define VALGRIND_MAKE_MEM_DEFINED(addr, size) do { } while (0) #endif MoarVM-2018.03/src/moar.c0000644000175000017510000006025413242626641015111 0ustar samanthasamantha#include "moar.h" #include #if defined(_MSC_VER) #define snprintf _snprintf #endif #ifndef _WIN32 # include #else # include #endif #define init_mutex(loc, name) do { \ if ((init_stat = uv_mutex_init(&loc)) < 0) { \ fprintf(stderr, "MoarVM: Initialization of " name " mutex failed\n %s\n", \ uv_strerror(init_stat)); \ exit(1); \ } \ } while (0) #define init_cond(loc, name) do { \ if ((init_stat = uv_cond_init(&loc)) < 0) { \ fprintf(stderr, "MoarVM: Initialization of " name " condition variable failed\n %s\n", \ uv_strerror(init_stat)); \ exit(1); \ } \ } while (0) static void setup_std_handles(MVMThreadContext *tc); static FILE *fopen_perhaps_with_pid(char *env_var, char *path, const char *mode) { FILE *result; if (strstr(path, "%d")) { MVMuint64 path_length = strlen(path); MVMuint64 found_percents = 0; MVMuint64 i; /* Let's sanitize the format string a bit. Must only have * a single printf-recognized directive. */ for (i = 0; i < path_length; i++) { if (path[i] == '%') { /* %% is all right. */ if (i + 1 < path_length && path[i + 1] == '%') { i++; continue; } found_percents++; } } /* We expect to pass only a single argument to snprintf here; * just bail out if there's more than one directive. */ if (found_percents > 1) { result = fopen(path, mode); } else { char *fixed_path = malloc(path_length + 16); MVMint64 pid; #ifdef _WIN32 pid = _getpid(); #else pid = getpid(); #endif /* We make the brave assumption that * pids only go up to 16 characters. */ snprintf(fixed_path, path_length + 16, path, pid); result = fopen(fixed_path, mode); free(fixed_path); } } else { result = fopen(path, mode); } if (result) return result; fprintf(stderr, "MoarVM: Failed to open file `%s` given via `%s`: %s\n", path, env_var, strerror(errno)); exit(1); } /* Create a new instance of the VM. */ MVMInstance * MVM_vm_create_instance(void) { MVMInstance *instance; char *spesh_log, *spesh_nodelay, *spesh_disable, *spesh_inline_disable, *spesh_osr_disable, *spesh_limit, *spesh_blocking; char *jit_log, *jit_expr_disable, *jit_disable, *jit_bytecode_dir, *jit_last_frame, *jit_last_bb; char *dynvar_log; int init_stat; /* Set up instance data structure. */ instance = MVM_calloc(1, sizeof(MVMInstance)); /* Create the main thread's ThreadContext and stash it. */ instance->main_thread = MVM_tc_create(NULL, instance); instance->main_thread->thread_id = 1; /* Next thread to be created gets ID 2 (the main thread got ID 1). */ MVM_store(&instance->next_user_thread_id, 2); /* Set up the permanent roots storage. */ instance->num_permroots = 0; instance->alloc_permroots = 16; instance->permroots = MVM_malloc(sizeof(MVMCollectable **) * instance->alloc_permroots); instance->permroot_descriptions = MVM_malloc(sizeof(char *) * instance->alloc_permroots); init_mutex(instance->mutex_permroots, "permanent roots"); /* GC orchestration state. */ init_mutex(instance->mutex_gc_orchestrate, "GC orchestration"); init_cond(instance->cond_gc_start, "GC start"); init_cond(instance->cond_gc_finish, "GC finish"); init_cond(instance->cond_gc_intrays_clearing, "GC intrays clearing"); init_cond(instance->cond_blocked_can_continue, "GC thread unblock"); /* Create fixed size allocator. */ instance->fsa = MVM_fixed_size_create(instance->main_thread); /* Set up REPR registry mutex. */ init_mutex(instance->mutex_repr_registry, "REPR registry"); /* Set up HLL config mutex. */ init_mutex(instance->mutex_hllconfigs, "hll configs"); /* Set up DLL registry mutex. */ init_mutex(instance->mutex_dll_registry, "REPR registry"); /* Set up extension registry mutex. */ init_mutex(instance->mutex_ext_registry, "extension registry"); /* Set up extension op registry mutex. */ init_mutex(instance->mutex_extop_registry, "extension op registry"); /* Set up weak reference hash mutex. */ init_mutex(instance->mutex_sc_weakhash, "sc weakhash"); /* Set up loaded compunits hash mutex. */ init_mutex(instance->mutex_loaded_compunits, "loaded compunits"); /* Set up container registry mutex. */ init_mutex(instance->mutex_container_registry, "container registry"); /* Set up persistent object ID hash mutex. */ init_mutex(instance->mutex_object_ids, "object ID hash"); /* Allocate all things during following setup steps directly in gen2, as * they will have program lifetime. */ MVM_gc_allocate_gen2_default_set(instance->main_thread); /* Set up integer constant and string cache. */ init_mutex(instance->mutex_int_const_cache, "int constant cache"); instance->int_const_cache = MVM_calloc(1, sizeof(MVMIntConstCache)); instance->int_to_str_cache = MVM_calloc(MVM_INT_TO_STR_CACHE_SIZE, sizeof(MVMString *)); /* Initialize Unicode database and NFG. */ MVM_unicode_init(instance->main_thread); MVM_string_cclass_init(instance->main_thread); MVM_nfg_init(instance->main_thread); /* Bootstrap 6model. It is assumed the GC will not be called during this. */ MVM_6model_bootstrap(instance->main_thread); /* Set up main thread's last_payload. */ instance->main_thread->last_payload = instance->VMNull; /* Initialize event loop thread starting mutex. */ init_mutex(instance->mutex_event_loop_start, "event loop thread start"); /* Create main thread object, and also make it the start of the all threads * linked list. Set up the mutex to protect it. */ instance->threads = instance->main_thread->thread_obj = (MVMThread *) REPR(instance->boot_types.BOOTThread)->allocate( instance->main_thread, STABLE(instance->boot_types.BOOTThread)); instance->threads->body.stage = MVM_thread_stage_started; instance->threads->body.tc = instance->main_thread; instance->threads->body.native_thread_id = MVM_platform_thread_id(); instance->threads->body.thread_id = instance->main_thread->thread_id; init_mutex(instance->mutex_threads, "threads list"); /* Create compiler registry */ instance->compiler_registry = MVM_repr_alloc_init(instance->main_thread, instance->boot_types.BOOTHash); /* Set up compiler registr mutex. */ init_mutex(instance->mutex_compiler_registry, "compiler registry"); /* Create hll symbol tables */ instance->hll_syms = MVM_repr_alloc_init(instance->main_thread, instance->boot_types.BOOTHash); /* Set up hll symbol tables mutex. */ init_mutex(instance->mutex_hll_syms, "hll syms"); /* Create callsite intern pool. */ instance->callsite_interns = MVM_calloc(1, sizeof(MVMCallsiteInterns)); init_mutex(instance->mutex_callsite_interns, "callsite interns"); /* There's some callsites we statically use all over the place. Intern * them, so that spesh may end up optimizing more "internal" stuff. */ MVM_callsite_initialize_common(instance->main_thread); /* Multi-cache additions mutex. */ init_mutex(instance->mutex_multi_cache_add, "multi-cache addition"); /* Current instrumentation level starts at 1; used to trigger all frames * to be verified before their first run. */ instance->instrumentation_level = 1; /* Mutex for spesh installations, and check if we've a file we * should log specializations to. */ init_mutex(instance->mutex_spesh_install, "spesh installations"); spesh_log = getenv("MVM_SPESH_LOG"); if (spesh_log && spesh_log[0]) instance->spesh_log_fh = fopen_perhaps_with_pid("MVM_SPESH_LOG", spesh_log, "w"); spesh_disable = getenv("MVM_SPESH_DISABLE"); if (!spesh_disable || !spesh_disable[0]) { instance->spesh_enabled = 1; spesh_inline_disable = getenv("MVM_SPESH_INLINE_DISABLE"); if (!spesh_inline_disable || !spesh_inline_disable[0]) instance->spesh_inline_enabled = 1; spesh_osr_disable = getenv("MVM_SPESH_OSR_DISABLE"); if (!spesh_osr_disable || !spesh_osr_disable[0]) instance->spesh_osr_enabled = 1; } init_mutex(instance->mutex_parameterization_add, "parameterization"); /* Should we specialize without warm up delays? Used to find bugs in the * specializer and JIT. */ spesh_nodelay = getenv("MVM_SPESH_NODELAY"); if (spesh_nodelay && spesh_nodelay[0]) { instance->spesh_nodelay = 1; } /* Should we limit the number of specialized frames produced? (This is * mostly useful for building spesh bug bisect tools.) */ spesh_limit = getenv("MVM_SPESH_LIMIT"); if (spesh_limit && spesh_limit[0]) instance->spesh_limit = atoi(spesh_limit); /* Should we enforce that a thread, when sending work to the specialzation * worker, block until the specialization worker is done? This is useful * for getting more predictable behavior when debugging. */ spesh_blocking = getenv("MVM_SPESH_BLOCKING"); if (spesh_blocking && spesh_blocking[0]) instance->spesh_blocking = 1; /* JIT environment/logging setup. */ jit_disable = getenv("MVM_JIT_DISABLE"); if (!jit_disable || !jit_disable[0]) instance->jit_enabled = 1; jit_expr_disable = getenv("MVM_JIT_EXPR_DISABLE"); if (!jit_expr_disable || strlen(jit_expr_disable) == 0) instance->jit_expr_enabled = 1; jit_log = getenv("MVM_JIT_LOG"); if (jit_log && jit_log[0]) instance->jit_log_fh = fopen_perhaps_with_pid("MVM_JIT_LOG", jit_log, "w"); jit_bytecode_dir = getenv("MVM_JIT_BYTECODE_DIR"); if (jit_bytecode_dir && jit_bytecode_dir[0]) { size_t bytecode_map_name_size = strlen(jit_bytecode_dir) + strlen("/jit-map.txt") + 1; char *bytecode_map_name = MVM_malloc(bytecode_map_name_size); snprintf(bytecode_map_name, bytecode_map_name_size, "%s/jit-map.txt", jit_bytecode_dir); instance->jit_bytecode_map = fopen(bytecode_map_name, "w"); instance->jit_bytecode_dir = jit_bytecode_dir; MVM_free(bytecode_map_name); } jit_last_frame = getenv("MVM_JIT_EXPR_LAST_FRAME"); jit_last_bb = getenv("MVM_JIT_EXPR_LAST_BB"); /* what could possibly go wrong in integer formats? */ instance->jit_expr_last_frame = jit_last_frame != NULL ? atoi(jit_last_frame) : -1; instance->jit_expr_last_bb = jit_last_bb != NULL ? atoi(jit_last_bb) : -1; instance->jit_seq_nr = 0; /* add JIT debugging breakpoints */ { char *jit_breakpoints_str = getenv("MVM_JIT_BREAKPOINTS"); if (jit_breakpoints_str != NULL) { MVM_VECTOR_INIT(instance->jit_breakpoints, 4); } else { instance->jit_breakpoints_num = 0; instance->jit_breakpoints = NULL; } while (jit_breakpoints_str != NULL && *jit_breakpoints_str) { MVMint32 frame_nr, block_nr, nchars; MVMint32 result = sscanf(jit_breakpoints_str, "%d/%d%n", &frame_nr, &block_nr, &nchars); if (result < 2) break; MVM_VECTOR_ENSURE_SPACE(instance->jit_breakpoints, 1); instance->jit_breakpoints[instance->jit_breakpoints_num].frame_nr = frame_nr; instance->jit_breakpoints[instance->jit_breakpoints_num].block_nr = block_nr; instance->jit_breakpoints_num++; jit_breakpoints_str += nchars; if (*jit_breakpoints_str == ':') { jit_breakpoints_str++; } } } /* Spesh thread syncing. */ init_mutex(instance->mutex_spesh_sync, "spesh sync"); init_cond(instance->cond_spesh_sync, "spesh sync"); /* Various kinds of debugging that can be enabled. */ dynvar_log = getenv("MVM_DYNVAR_LOG"); if (dynvar_log && dynvar_log[0]) { instance->dynvar_log_fh = fopen_perhaps_with_pid("MVM_DYNVAR_LOG", dynvar_log, "w"); fprintf(instance->dynvar_log_fh, "+ x 0 0 0 0 0 %"PRIu64"\n", uv_hrtime()); fflush(instance->dynvar_log_fh); instance->dynvar_log_lasttime = uv_hrtime(); } else instance->dynvar_log_fh = NULL; instance->nfa_debug_enabled = getenv("MVM_NFA_DEB") ? 1 : 0; if (getenv("MVM_CROSS_THREAD_WRITE_LOG")) { instance->cross_thread_write_logging = 1; instance->cross_thread_write_logging_include_locked = getenv("MVM_CROSS_THREAD_WRITE_LOG_INCLUDE_LOCKED") ? 1 : 0; instance->instrumentation_level++; init_mutex(instance->mutex_cross_thread_write_logging, "cross thread write logging output"); } else { instance->cross_thread_write_logging = 0; } if (getenv("MVM_COVERAGE_LOG")) { char *coverage_log = getenv("MVM_COVERAGE_LOG"); instance->coverage_logging = 1; instance->instrumentation_level++; if (coverage_log[0]) instance->coverage_log_fh = fopen_perhaps_with_pid("MVM_COVERAGE_LOG", coverage_log, "a"); else instance->coverage_log_fh = stderr; instance->coverage_control = 0; if (getenv("MVM_COVERAGE_CONTROL")) { char *coverage_control = getenv("MVM_COVERAGE_CONTROL"); if (coverage_control && coverage_control[0]) instance->coverage_control = atoi(coverage_control); } } else { instance->coverage_logging = 0; } /* Create std[in/out/err]. */ setup_std_handles(instance->main_thread); /* Set up the specialization worker thread and a log for the main thread. */ MVM_spesh_worker_setup(instance->main_thread); MVM_spesh_log_initialize_thread(instance->main_thread, 1); /* Back to nursery allocation, now we're set up. */ MVM_gc_allocate_gen2_default_clear(instance->main_thread); return instance; } /* Set up some standard file handles. */ static void setup_std_handles(MVMThreadContext *tc) { tc->instance->stdin_handle = MVM_file_get_stdstream(tc, 0); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&tc->instance->stdin_handle, "stdin handle"); tc->instance->stdout_handle = MVM_file_get_stdstream(tc, 1); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&tc->instance->stdout_handle, "stdout handle"); tc->instance->stderr_handle = MVM_file_get_stdstream(tc, 2); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&tc->instance->stderr_handle, "stderr handle"); } /* This callback is passed to the interpreter code. It takes care of making * the initial invocation. */ static void toplevel_initial_invoke(MVMThreadContext *tc, void *data) { /* Create initial frame, which sets up all of the interpreter state also. */ MVM_frame_invoke(tc, (MVMStaticFrame *)data, MVM_callsite_get_common(tc, MVM_CALLSITE_ID_NULL_ARGS), NULL, NULL, NULL, -1); } /* Loads bytecode from the specified file name and runs it. */ void MVM_vm_run_file(MVMInstance *instance, const char *filename) { /* Map the compilation unit into memory and dissect it. */ MVMThreadContext *tc = instance->main_thread; MVMCompUnit *cu = MVM_cu_map_from_file(tc, filename); MVMROOT(tc, cu, { /* The call to MVM_string_utf8_decode() may allocate, invalidating the location cu->body.filename */ MVMString *const str = MVM_string_utf8_c8_decode(tc, instance->VMString, filename, strlen(filename)); cu->body.filename = str; /* Run deserialization frame, if there is one. Disable specialization * during this time, so we don't waste time logging one-shot setup * code. */ if (cu->body.deserialize_frame) { MVMint8 spesh_enabled_orig = tc->instance->spesh_enabled; tc->instance->spesh_enabled = 0; MVM_interp_run(tc, toplevel_initial_invoke, cu->body.deserialize_frame); tc->instance->spesh_enabled = spesh_enabled_orig; } }); /* Run the entry-point frame. */ MVM_interp_run(tc, toplevel_initial_invoke, cu->body.main_frame); } /* Loads bytecode from the specified file name and dumps it. */ void MVM_vm_dump_file(MVMInstance *instance, const char *filename) { /* Map the compilation unit into memory and dissect it. */ MVMThreadContext *tc = instance->main_thread; MVMCompUnit *cu = MVM_cu_map_from_file(tc, filename); char *dump = MVM_bytecode_dump(tc, cu); size_t dumplen = strlen(dump); int position = 0; /* libuv already set up stdout to be nonblocking, but it can very well be * we encounter EAGAIN (Resource temporarily unavailable), so we need to * loop over our buffer, which can be quite big. * * The CORE.setting.moarvm has - as of writing this - about 32 megs of * output from dumping. */ while (position < dumplen) { size_t written = write(1, dump + position, dumplen - position); if (written > 0) position += written; } MVM_free(dump); } /* Exits the process as quickly as is gracefully possible, respecting that * foreground threads should join first. Leaves all cleanup to the OS, as it * will be able to do it much more swiftly than we could. This is typically * not the right thing for embedding; see MVM_vm_destroy_instance for that. */ void MVM_vm_exit(MVMInstance *instance) { /* Join any foreground threads and flush standard handles. */ MVM_thread_join_foreground(instance->main_thread); MVM_io_flush_standard_handles(instance->main_thread); /* Close any spesh or jit log. */ if (instance->spesh_log_fh) fclose(instance->spesh_log_fh); if (instance->jit_log_fh) fclose(instance->jit_log_fh); if (instance->jit_bytecode_map) fclose(instance->jit_bytecode_map); if (instance->dynvar_log_fh) { fprintf(instance->dynvar_log_fh, "- x 0 0 0 0 %"PRId64" %"PRIu64" %"PRIu64"\n", instance->dynvar_log_lasttime, uv_hrtime(), uv_hrtime()); fclose(instance->dynvar_log_fh); } /* And, we're done. */ exit(0); } static void cleanup_callsite_interns(MVMInstance *instance) { int i; for (i = 0; i < MVM_INTERN_ARITY_LIMIT; i++) { int callsite_count = instance->callsite_interns->num_by_arity[i]; int j; if (callsite_count) { MVMCallsite **callsites = instance->callsite_interns->by_arity[i]; for (j = 0; j < callsite_count; j++) { MVMCallsite *callsite = callsites[j]; if (MVM_callsite_is_common(callsite)) { continue; } MVM_callsite_destroy(callsite); } MVM_free(callsites); } } MVM_free(instance->callsite_interns); } /* Destroys a VM instance. This must be called only from the main thread. It * should clear up all resources and free all memory; in practice, it falls * short of this goal at the moment. */ void MVM_vm_destroy_instance(MVMInstance *instance) { /* Join any foreground threads and flush standard handles. */ MVM_thread_join_foreground(instance->main_thread); MVM_io_flush_standard_handles(instance->main_thread); /* Run the GC global destruction phase. After this, * no 6model object pointers should be accessed. */ MVM_gc_global_destruction(instance->main_thread); /* Cleanup REPR registry */ uv_mutex_destroy(&instance->mutex_repr_registry); MVM_HASH_DESTROY(hash_handle, MVMReprRegistry, instance->repr_hash); MVM_free(instance->repr_list); /* Clean up GC related resources. */ uv_mutex_destroy(&instance->mutex_permroots); MVM_free(instance->permroots); MVM_free(instance->permroot_descriptions); uv_cond_destroy(&instance->cond_gc_start); uv_cond_destroy(&instance->cond_gc_finish); uv_cond_destroy(&instance->cond_gc_intrays_clearing); uv_cond_destroy(&instance->cond_blocked_can_continue); uv_mutex_destroy(&instance->mutex_gc_orchestrate); /* Clean up Hash of HLLConfig. */ uv_mutex_destroy(&instance->mutex_hllconfigs); MVM_HASH_DESTROY(hash_handle, MVMHLLConfig, instance->compiler_hll_configs); MVM_HASH_DESTROY(hash_handle, MVMHLLConfig, instance->compilee_hll_configs); /* Clean up Hash of DLLs. */ uv_mutex_destroy(&instance->mutex_dll_registry); MVM_HASH_DESTROY(hash_handle, MVMDLLRegistry, instance->dll_registry); /* Clean up Hash of extensions. */ uv_mutex_destroy(&instance->mutex_ext_registry); MVM_HASH_DESTROY(hash_handle, MVMExtRegistry, instance->ext_registry); /* Clean up Hash of extension ops. */ uv_mutex_destroy(&instance->mutex_extop_registry); MVM_HASH_DESTROY(hash_handle, MVMExtOpRegistry, instance->extop_registry); /* Clean up Hash of all known serialization contexts, along with list. */ uv_mutex_destroy(&instance->mutex_sc_weakhash); MVM_HASH_DESTROY(hash_handle, MVMSerializationContextBody, instance->sc_weakhash); MVM_free(instance->all_scs); /* Clean up Hash of filenames of compunits loaded from disk. */ uv_mutex_destroy(&instance->mutex_loaded_compunits); MVM_HASH_DESTROY(hash_handle, MVMLoadedCompUnitName, instance->loaded_compunits); /* Clean up Container registry. */ uv_mutex_destroy(&instance->mutex_container_registry); MVM_HASH_DESTROY(hash_handle, MVMContainerRegistry, instance->container_registry); /* Clean up Hash of compiler objects keyed by name. */ uv_mutex_destroy(&instance->mutex_compiler_registry); /* Clean up Hash of hashes of symbol tables per hll. */ uv_mutex_destroy(&instance->mutex_hll_syms); /* Clean up multi cache addition mutex. */ uv_mutex_destroy(&instance->mutex_multi_cache_add); /* Clean up parameterization addition mutex. */ uv_mutex_destroy(&instance->mutex_parameterization_add); /* Clean up interned callsites */ uv_mutex_destroy(&instance->mutex_callsite_interns); cleanup_callsite_interns(instance); /* Release this interpreter's hold on Unicode database */ MVM_unicode_release(instance->main_thread); /* Clean up spesh mutexes and close any log. */ uv_mutex_destroy(&instance->mutex_spesh_install); uv_cond_destroy(&instance->cond_spesh_sync); uv_mutex_destroy(&instance->mutex_spesh_sync); if (instance->spesh_log_fh) fclose(instance->spesh_log_fh); if (instance->jit_log_fh) fclose(instance->jit_log_fh); if (instance->dynvar_log_fh) fclose(instance->dynvar_log_fh); if (instance->jit_breakpoints) { MVM_VECTOR_DESTROY(instance->jit_breakpoints); } /* Clean up cross-thread-write-logging mutex */ uv_mutex_destroy(&instance->mutex_cross_thread_write_logging); /* Clean up NFG. */ uv_mutex_destroy(&instance->nfg->update_mutex); MVM_nfg_destroy(instance->main_thread); /* Clean up fixed size allocator */ MVM_fixed_size_destroy(instance->fsa); /* Clean up integer constant and string cache. */ uv_mutex_destroy(&instance->mutex_int_const_cache); MVM_free(instance->int_const_cache); MVM_free(instance->int_to_str_cache); /* Clean up event loop starting mutex. */ uv_mutex_destroy(&instance->mutex_event_loop_start); /* Destroy main thread contexts and thread list mutex. */ MVM_tc_destroy(instance->main_thread); uv_mutex_destroy(&instance->mutex_threads); /* Clear up VM instance memory. */ MVM_free(instance); } void MVM_vm_set_clargs(MVMInstance *instance, int argc, char **argv) { instance->num_clargs = argc; instance->raw_clargs = argv; } void MVM_vm_set_exec_name(MVMInstance *instance, const char *exec_name) { instance->exec_name = exec_name; } void MVM_vm_set_prog_name(MVMInstance *instance, const char *prog_name) { instance->prog_name = prog_name; } void MVM_vm_set_lib_path(MVMInstance *instance, int count, const char **lib_path) { enum { MAX_COUNT = sizeof instance->lib_path / sizeof *instance->lib_path }; int i = 0; if (count > MAX_COUNT) MVM_panic(1, "Cannot set more than %i library paths", MAX_COUNT); for (; i < count; ++i) instance->lib_path[i] = lib_path[i]; /* Clear remainder to allow repeated calls */ for (; i < MAX_COUNT; ++i) instance->lib_path[i] = NULL; } MoarVM-2018.03/src/moar.h0000644000175000017510000001627713252330426015116 0ustar samanthasamantha#include #include #include #include #include /* Configuration. */ #include "gen/config.h" /* Standard integer types. */ #include /* platform-specific setjmp override */ #include /* stuff for uthash */ #define uthash_fatal(msg) MVM_exception_throw_adhoc(tc, "internal hash error: " msg) #include /* libuv * must precede atomic_ops.h so we get the ordering of Winapi headers right */ #include /* libatomic_ops */ #define AO_REQUIRE_CAS #include /* libffi or dynload/dyncall/dyncallback */ #ifdef HAVE_LIBFFI #include #else #include #include #include #endif /* forward declarations */ #include "types.h" /* Sized types. */ typedef int8_t MVMint8; typedef uint8_t MVMuint8; typedef int16_t MVMint16; typedef uint16_t MVMuint16; typedef int32_t MVMint32; typedef uint32_t MVMuint32; typedef int64_t MVMint64; typedef uint64_t MVMuint64; typedef float MVMnum32; typedef double MVMnum64; /* Alignment. */ #if HAVE_ALIGNOF /* A GCC extension. */ #define ALIGNOF(t) __alignof__(t) #elif defined _MSC_VER /* MSVC extension. */ #define ALIGNOF(t) __alignof(t) #else /* Alignment by measuring structure padding. */ #define ALIGNOF(t) ((char *)(&((struct { char c; t _h; } *)0)->_h) - (char *)0) #endif #define MVM_ALIGN_SECTION_MASK ((MVMuint32)ALIGNOF(MVMint64) - 1) #define MVM_ALIGN_SECTION(offset) (((offset) + (MVM_ALIGN_SECTION_MASK)) & ~(MVM_ALIGN_SECTION_MASK)) #if defined MVM_BUILD_SHARED # define MVM_PUBLIC MVM_DLL_EXPORT # define MVM_PRIVATE MVM_DLL_LOCAL #elif defined MVM_SHARED # define MVM_PUBLIC MVM_DLL_IMPORT # define MVM_PRIVATE MVM_DLL_LOCAL #else # define MVM_PUBLIC # define MVM_PRIVATE #endif #if MVM_PTR_SIZE < 8 # define MVM_USE_OVERFLOW_SERIALIZATION_INDEX #endif #if defined _MSC_VER # define MVM_USED_BY_JIT __pragma(optimize( "g", off )) #else # define MVM_USED_BY_JIT #endif MVM_PUBLIC const MVMint32 MVM_jit_support(void); /* Headers for various other data structures and APIs. */ #include "6model/6model.h" #include "gc/collect.h" #include "gc/debug.h" #include "gc/wb.h" #include "core/vector.h" #include "core/threadcontext.h" #include "core/instance.h" #include "core/interp.h" #include "core/callsite.h" #include "core/args.h" #include "core/exceptions.h" #include "core/alloc.h" #include "core/frame.h" #include "core/callstack.h" #include "core/validation.h" #include "core/bytecode.h" #include "core/bytecodedump.h" #include "core/ops.h" #include "core/threads.h" #include "core/hll.h" #include "core/loadbytecode.h" #include "core/bitmap.h" #include "math/num.h" #include "core/coerce.h" #include "core/ext.h" #ifdef HAVE_LIBFFI #include "core/nativecall_libffi.h" #else #include "core/nativecall_dyncall.h" #endif #include "core/nativecall.h" #include "core/dll.h" #include "core/continuation.h" #include "debug/debugserver.h" #include "6model/reprs.h" #include "6model/reprconv.h" #include "6model/bootstrap.h" #include "6model/containers.h" #include "6model/sc.h" #include "6model/serialization.h" #include "6model/parametric.h" #include "core/compunit.h" #include "gc/gen2.h" #include "gc/allocation.h" #include "gc/worklist.h" #include "gc/orchestrate.h" #include "gc/roots.h" #include "gc/objectid.h" #include "gc/finalize.h" #include "core/regionalloc.h" #include "spesh/dump.h" #include "spesh/graph.h" #include "spesh/codegen.h" #include "spesh/candidate.h" #include "spesh/manipulate.h" #include "spesh/args.h" #include "spesh/facts.h" #include "spesh/optimize.h" #include "spesh/dead_bb_elimination.h" #include "spesh/deopt.h" #include "spesh/log.h" #include "spesh/threshold.h" #include "spesh/inline.h" #include "spesh/osr.h" #include "spesh/iterator.h" #include "spesh/lookup.h" #include "spesh/worker.h" #include "spesh/stats.h" #include "spesh/plan.h" #include "spesh/arg_guard.h" #include "strings/nfg.h" #include "strings/normalize.h" #include "strings/decode_stream.h" #include "strings/ascii.h" #include "strings/parse_num.h" #include "strings/utf8.h" #include "strings/utf8_c8.h" #include "strings/utf16.h" #include "strings/iter.h" #include "strings/ops.h" #include "strings/unicode_gen.h" #include "strings/unicode.h" #include "strings/latin1.h" #include "strings/windows1252.h" #include "io/io.h" #include "io/eventloop.h" #include "io/syncfile.h" #include "io/syncsocket.h" #include "io/fileops.h" #include "io/dirops.h" #include "io/procops.h" #include "io/timers.h" #include "io/filewatchers.h" #include "io/signals.h" #include "io/asyncsocket.h" #include "io/asyncsocketudp.h" #include "math/bigintops.h" #include "mast/driver.h" #include "core/intcache.h" #include "core/fixedsizealloc.h" #include "jit/graph.h" #include "jit/label.h" #include "jit/expr.h" #include "jit/register.h" #include "jit/tile.h" #include "jit/compile.h" #include "jit/log.h" #include "profiler/instrument.h" #include "profiler/log.h" #include "profiler/profile.h" #include "profiler/heapsnapshot.h" #include "profiler/telemeh.h" #include "instrument/crossthreadwrite.h" #include "instrument/line_coverage.h" MVMObject *MVM_backend_config(MVMThreadContext *tc); /* Top level VM API functions. */ MVM_PUBLIC MVMInstance * MVM_vm_create_instance(void); MVM_PUBLIC void MVM_vm_run_file(MVMInstance *instance, const char *filename); MVM_PUBLIC void MVM_vm_dump_file(MVMInstance *instance, const char *filename); MVM_PUBLIC MVM_NO_RETURN void MVM_vm_exit(MVMInstance *instance) MVM_NO_RETURN_GCC; MVM_PUBLIC void MVM_vm_destroy_instance(MVMInstance *instance); MVM_PUBLIC void MVM_vm_set_clargs(MVMInstance *instance, int argc, char **argv); MVM_PUBLIC void MVM_vm_set_exec_name(MVMInstance *instance, const char *exec_name); MVM_PUBLIC void MVM_vm_set_prog_name(MVMInstance *instance, const char *prog_name); MVM_PUBLIC void MVM_vm_set_lib_path(MVMInstance *instance, int count, const char **lib_path); #if defined(__s390__) AO_t AO_fetch_compare_and_swap_emulation(volatile AO_t *addr, AO_t old_val, AO_t new_val); # define AO_fetch_compare_and_swap_full(addr, old, newval) \ AO_fetch_compare_and_swap_emulation(addr, old, newval) #endif /* Returns original. Use only on AO_t-sized values (including pointers). */ #define MVM_incr(addr) AO_fetch_and_add1_full((volatile AO_t *)(addr)) #define MVM_decr(addr) AO_fetch_and_sub1_full((volatile AO_t *)(addr)) #define MVM_add(addr, add) AO_fetch_and_add_full((volatile AO_t *)(addr), (AO_t)(add)) /* Returns non-zero for success. Use for both AO_t numbers and pointers. */ #define MVM_trycas(addr, old, new) AO_compare_and_swap_full((volatile AO_t *)(addr), (AO_t)(old), (AO_t)(new)) /* Returns the old value dereferenced at addr. */ #define MVM_cas(addr, old, new) AO_fetch_compare_and_swap_full((addr), (old), (new)) /* Returns the old pointer value dereferenced at addr. Provided for a tiny bit of type safety. */ #define MVM_casptr(addr, old, new) ((void *)MVM_cas((AO_t *)(addr), (AO_t)(old), (AO_t)(new))) /* Full memory barrier. */ #define MVM_barrier() AO_nop_full() /* Need to use these to assign to or read from any memory locations on * which the other atomic operation macros are used... */ #define MVM_store(addr, new) AO_store_full((volatile AO_t *)(addr), (AO_t)(new)) #define MVM_load(addr) AO_load_full((volatile AO_t *)(addr)) MoarVM-2018.03/src/platform/inttypes.h0000644000175000017510000000043013242626641017651 0ustar samanthasamantha#if defined(_MSC_VER) && (_MSC_VER < 1800) #include /* Print size_t values. */ #define MVM_PRSz "Iu" #elif defined(_WIN32) && !defined(_MSC_VER) #include #define MVM_PRSz "Iu" #else #include #define MVM_PRSz "zu" /* C99 */ #endif MoarVM-2018.03/src/platform/io.h0000644000175000017510000000072613237701240016402 0ustar samanthasamantha#if defined _WIN32 MVMint64 MVM_platform_lseek(int fd, MVMint64 offset, int origin); MVMint64 MVM_platform_unlink(const char *pathname); int MVM_platform_fsync(int fd); #else #define MVM_platform_lseek lseek #define MVM_platform_unlink unlink #define MVM_platform_fsync fsync #endif #if defined(__APPLE__) || defined(__Darwin__) short MVM_platform_is_fd_seekable(int fd); #else #define MVM_platform_is_fd_seekable(x) (MVM_platform_lseek((x), 0, SEEK_CUR) != -1) #endif MoarVM-2018.03/src/platform/memmem.h0000644000175000017510000000172713237701240017252 0ustar samanthasamantha/* On Linux we use glibc's memmem which uses the Knuth-Morris-Pratt algorithm. * We use FreeBSD's libc memmem on Windows and MacOS, which uses * Crochemore-Perrin two-way string matching. * Reasoning: * Windows, does not include any native memmem * MacOS has a memmem but is slower and originates from FreeBSD dated to 2005 * Solaris doesn't seem to have memmem */ #if defined(_WIN32) || defined(__APPLE__) || defined(__Darwin__) || defined(__sun) #include "../3rdparty/freebsd/memmem.c" #else /* On systems that use glibc, you must define _GNU_SOURCE before including string.h * to get access to memmem. */ #define _GNU_SOURCE #include #endif void * MVM_memmem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen) { return memmem(haystack, haystacklen, needle, needlelen); } /* Extended info: * In glibc, the Knuth-Morris-Pratt algorithm was added as of git tag glibc-2.8-44-g0caca71ac9 */ MoarVM-2018.03/src/platform/mmap.h0000644000175000017510000000063113237701240016720 0ustar samanthasamantha#define MVM_PAGE_READ 1 #define MVM_PAGE_WRITE 2 #define MVM_PAGE_EXEC 4 void *MVM_platform_alloc_pages(size_t size, int mode); int MVM_platform_set_page_mode(void * block, size_t size, int mode); int MVM_platform_free_pages(void *block, size_t size); void *MVM_platform_map_file(int fd, void **handle, size_t size, int writable); int MVM_platform_unmap_file(void *block, void *handle, size_t size); MoarVM-2018.03/src/platform/posix/io.c0000644000175000017510000000125613237701240017536 0ustar samanthasamantha#if defined(__APPLE__) || defined(__Darwin__) #include #include #include #include short MVM_platform_is_fd_seekable(int fd) { off_t can_seek = MVM_platform_lseek(fd, 0, SEEK_CUR); if (can_seek != -1) { /* On MacOS, lseek of TTYs still returns some seek position, which makes us think they're seekable handles and messes up our EOF detection. So if lseek tells us it's a seekable handle, we do an extra check for whether it's a TTY and claim non-seekability if it is one. */ return isatty(fd) ? 0 : 1; } else return 0; } #endif MoarVM-2018.03/src/platform/posix/mmap.c0000644000175000017510000000376013237701240020063 0ustar samanthasamantha#include #include #include "moar.h" #include "platform/mmap.h" #include /* MAP_ANONYMOUS is Linux, MAP_ANON is BSD */ #ifndef MVM_MAP_ANON #if defined(MAP_ANONYMOUS) #define MVM_MAP_ANON MAP_ANONYMOUS #elif defined(MAP_ANON) #define MVM_MAP_ANON MAP_ANON #else #error "Anonymous mmap() not supported. You need to define MVM_MAP_ANON manually if it is." #endif #endif static int page_mode_to_prot_mode(int page_mode) { switch (page_mode) { case MVM_PAGE_READ: return PROT_READ; case MVM_PAGE_WRITE: return PROT_WRITE; case (MVM_PAGE_READ|MVM_PAGE_WRITE): return PROT_READ|PROT_WRITE; case MVM_PAGE_EXEC: return PROT_EXEC; case (MVM_PAGE_READ|MVM_PAGE_EXEC): return PROT_READ|PROT_EXEC; case (MVM_PAGE_WRITE|MVM_PAGE_EXEC): return PROT_WRITE|PROT_EXEC; case (MVM_PAGE_READ|MVM_PAGE_WRITE|MVM_PAGE_EXEC): return PROT_READ|PROT_WRITE|PROT_EXEC; default: return PROT_NONE; } } void *MVM_platform_alloc_pages(size_t size, int page_mode) { int prot_mode = page_mode_to_prot_mode(page_mode); void *block = mmap(NULL, size, prot_mode, MVM_MAP_ANON | MAP_PRIVATE, -1, 0); if (block == MAP_FAILED) MVM_panic(1, "MVM_platform_alloc_pages failed: %d", errno); return block; } int MVM_platform_set_page_mode(void * block, size_t size, int page_mode) { int prot_mode = page_mode_to_prot_mode(page_mode); return mprotect(block, size, prot_mode) == 0; } int MVM_platform_free_pages(void *block, size_t size) { return munmap(block, size) == 0; } void *MVM_platform_map_file(int fd, void **handle, size_t size, int writable) { void *block = mmap(NULL, size, writable ? PROT_READ | PROT_WRITE : PROT_READ, writable ? MAP_SHARED : MAP_PRIVATE, fd, 0); (void)handle; return block != MAP_FAILED ? block : NULL; } int MVM_platform_unmap_file(void *block, void *handle, size_t size) { (void)handle; return munmap(block, size) == 0; } MoarVM-2018.03/src/platform/posix/time.c0000644000175000017510000000251213237701240020061 0ustar samanthasamantha#include "moar.h" #include "platform/time.h" #include #include #ifdef __MACH__ #include #include #endif #define E9 1000000000 #define E9F 1000000000.0f MVMuint64 MVM_platform_now(void) { #ifdef __MACH__ // OS X does not have clock_gettime, use clock_get_time clock_serv_t cclock; mach_timespec_t ts; host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock); clock_get_time(cclock, &ts); mach_port_deallocate(mach_task_self(), cclock); return (MVMuint64)ts.tv_sec * E9 + ts.tv_nsec; #else # ifdef CLOCK_REALTIME struct timespec ts; if (clock_gettime(CLOCK_REALTIME, &ts) != 0) return 0; return (MVMuint64)ts.tv_sec * E9 + ts.tv_nsec; # else struct timeval tv; if (gettimeofday(&tv, NULL) != 0) return 0; return (MVMuint64)tv.tv_sec * E9 + tv.tv_usec * 1000; # endif #endif } void MVM_platform_sleep(MVMnum64 second) { struct timespec timeout; timeout.tv_sec = (time_t)second; timeout.tv_nsec = (long)((second - timeout.tv_sec) * E9F); while (nanosleep(&timeout, &timeout) && errno == EINTR); } void MVM_platform_nanosleep(MVMuint64 nanos) { struct timespec timeout; timeout.tv_sec = nanos / E9; timeout.tv_nsec = nanos % E9; while (nanosleep(&timeout, &timeout) && errno == EINTR); } MoarVM-2018.03/src/platform/setjmp.h0000644000175000017510000000105613237701240017272 0ustar samanthasamantha/* MinGW x64 BUGFIX: Pass a NULL argument instead of the frame pointer to the * setjmp implementation to make the JIT not choke on exceptions on MinGW. * cygx++ for fix */ #ifdef __MINGW32__ # ifndef USE_NO_MINGW_SETJMP_TWO_ARGS # undef setjmp # ifndef _INC_SETJMPEX # ifdef _WIN64 # define setjmp(BUF) _setjmp((BUF), NULL) # else # define setjmp(BUF) _setjmp3((BUF), NULL) # endif # else # define setjmp(BUF) _setjmpex((BUF), NULL) # define setjmpex(BUF) _setjmpex((BUF), NULL) # endif # endif #endif MoarVM-2018.03/src/platform/stdint.h0000644000175000017510000000015313237701240017272 0ustar samanthasamantha#if defined(_MSC_VER) && (_MSC_VER < 1800) #include #else #include #endif MoarVM-2018.03/src/platform/sys.c0000644000175000017510000000032713237701240016601 0ustar samanthasamantha#include "moar.h" #include "platform/sys.h" MVMuint32 MVM_platform_cpu_count(void) { int count; uv_cpu_info_t *info; uv_cpu_info(&info, &count); uv_free_cpu_info(info, count); return count; } MoarVM-2018.03/src/platform/sys.h0000755000175000017510000000022113237701240016602 0ustar samanthasamantha/* Tries to determine the number of logical CPUs available to the process. * May return 0 on error. */ MVMuint32 MVM_platform_cpu_count(void); MoarVM-2018.03/src/platform/threads.h0000644000175000017510000000101513237701240017415 0ustar samanthasamantha#if defined _WIN32 #define MVM_platform_thread_yield SwitchToThread #elif defined MVM_HAS_PTHREAD_YIELD #include #define MVM_platform_thread_yield pthread_yield #else #include #define MVM_platform_thread_yield sched_yield #endif #if defined _WIN32 #define MVM_platform_thread_exit(status) ExitThread(0) #define MVM_platform_thread_id() (MVMint64)GetCurrentThreadId() #else #define MVM_platform_thread_exit(status) pthread_exit(status) #define MVM_platform_thread_id() (MVMint64)uv_thread_self() #endif MoarVM-2018.03/src/platform/time.h0000644000175000017510000000043713237701240016730 0ustar samanthasamantha/* Gets time since the epoch in nanoseconds. * In principle, may return 0 on error. */ MVMuint64 MVM_platform_now(void); /* Tries to sleep for at least the requested number * of nanoseconds. */ void MVM_platform_sleep(MVMnum64 second); void MVM_platform_nanosleep(MVMuint64 nanos); MoarVM-2018.03/src/platform/win32/io.c0000644000175000017510000000606213237701240017336 0ustar samanthasamantha#include #include /* undocumented, so check if these really hold */ #if SEEK_SET != FILE_BEGIN || \ SEEK_CUR != FILE_CURRENT || \ SEEK_END != FILE_END #error "Standard and WinAPI seek modes not compatible" #endif static wchar_t * UTF8ToUnicode(const char *str) { const int len = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0); wchar_t * const result = (wchar_t *)MVM_malloc(len * sizeof(wchar_t)); MultiByteToWideChar(CP_UTF8, 0, str, -1, result, len); return result; } MVMint64 MVM_platform_lseek(int fd, MVMint64 offset, int origin) { HANDLE hf; LARGE_INTEGER li; hf = (HANDLE)_get_osfhandle(fd); if (hf == INVALID_HANDLE_VALUE) { errno = EBADF; return -1; } if (GetFileType(hf) != 1) { errno = ESPIPE; return -1; } li.QuadPart = offset; li.LowPart = SetFilePointer(hf, li.LowPart, &li.HighPart, origin); if (li.LowPart == INVALID_SET_FILE_POINTER) { errno = ESPIPE; return -1; } return li.QuadPart; } MVMint64 MVM_platform_unlink(const char *pathname) { /* Must using UTF8ToUnicode for supporting CJK Windows file name. */ wchar_t *wpathname = UTF8ToUnicode(pathname); int str_len = wcslen(wpathname); int r; DWORD attrs; if (str_len > MAX_PATH) { wchar_t abs_wpathname[4096]; /* 4096 should be enough for absolute path */ wchar_t *lpp_part; /* You cannot use the "\\?\" prefix with a relative path, * relative paths are always limited to a total of MAX_PATH characters. * see http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx */ if (!GetFullPathNameW(wpathname, 4096, abs_wpathname, &lpp_part)) { errno = ENOENT; return -1; } MVM_free(wpathname); str_len = wcslen(abs_wpathname); wpathname = (wchar_t *)MVM_malloc((str_len + 4) * sizeof(wchar_t)); wcscpy(wpathname, L"\\\\?\\"); wcscat(wpathname, abs_wpathname); } attrs = GetFileAttributesW(wpathname); if (attrs == INVALID_FILE_ATTRIBUTES) { MVM_free(wpathname); errno = ENOENT; return -1; } else if (attrs & FILE_ATTRIBUTE_READONLY) { (void)SetFileAttributesW(wpathname, attrs & ~FILE_ATTRIBUTE_READONLY); r = DeleteFileW(wpathname); if (r == 0) { (void)SetFileAttributesW(wpathname, attrs); } } else { r = DeleteFileW(wpathname); } if (r == 0) { DWORD LastError = GetLastError(); MVM_free(wpathname); if (LastError == ERROR_FILE_NOT_FOUND) { errno = ENOENT; } else if (LastError == ERROR_ACCESS_DENIED) { errno = EACCES; } return -1; } MVM_free(wpathname); return 0; } int MVM_platform_fsync(int fd) { if (FlushFileBuffers((HANDLE)_get_osfhandle(fd))) return 0; errno = GetLastError(); if (errno == ENXIO) return 0; /* Not something we can flush. */ return -1; } MoarVM-2018.03/src/platform/win32/mmap.c0000644000175000017510000000434313237701240017661 0ustar samanthasamantha#include #include #include "platform/mmap.h" static int page_mode_to_prot_mode(int page_mode) { switch (page_mode) { case MVM_PAGE_READ: return PAGE_READONLY; case MVM_PAGE_WRITE: case (MVM_PAGE_WRITE | MVM_PAGE_READ): return PAGE_READWRITE; case MVM_PAGE_EXEC: return PAGE_EXECUTE; case (MVM_PAGE_READ|MVM_PAGE_EXEC): return PAGE_EXECUTE_READ; case (MVM_PAGE_WRITE|MVM_PAGE_EXEC): case (MVM_PAGE_READ|MVM_PAGE_WRITE|MVM_PAGE_EXEC): return PAGE_EXECUTE_READWRITE; } /* I pity the fools that enter an invalid mode */ return PAGE_NOACCESS; } void *MVM_platform_alloc_pages(size_t size, int page_mode) { int prot_mode = page_mode_to_prot_mode(page_mode); void * allocd = VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, prot_mode); if (!allocd) MVM_panic(1, "MVM_platform_alloc_pages failed: %d", GetLastError()); return allocd; } int MVM_platform_set_page_mode(void * pages, size_t size, int page_mode) { int prot_mode = page_mode_to_prot_mode(page_mode); DWORD oldMode; return VirtualProtect(pages, size, prot_mode, &oldMode); } int MVM_platform_free_pages(void *pages, size_t size) { (void)size; return VirtualFree(pages, 0, MEM_RELEASE); } void *MVM_platform_map_file(int fd, void **handle, size_t size, int writable) { HANDLE fh, mapping; LARGE_INTEGER li; void *block; fh = (HANDLE)_get_osfhandle(fd); if (fh == INVALID_HANDLE_VALUE) return NULL; li.QuadPart = size; mapping = CreateFileMapping(fh, NULL, writable ? PAGE_READWRITE : PAGE_READONLY, li.HighPart, li.LowPart, NULL); if(mapping == NULL) return NULL; block = MapViewOfFile(mapping, writable ? FILE_MAP_READ | FILE_MAP_WRITE : FILE_MAP_READ, 0, 0, size); if (block == NULL) { CloseHandle(mapping); return NULL; } if (handle) *handle = mapping; return block; } int MVM_platform_unmap_file(void *block, void *handle, size_t size) { BOOL unmapped = UnmapViewOfFile(block); BOOL closed = !handle || CloseHandle(handle); (void)size; return unmapped && closed; } MoarVM-2018.03/src/platform/win32/time.c0000644000175000017510000000143013237701240017657 0ustar samanthasamantha#include "moar.h" #include "platform/time.h" #include /* see http://support.microsoft.com/kb/167296 */ #define OFFSET 116444736000000000 #define E6 1000000 MVMuint64 MVM_platform_now(void) { union { FILETIME ft; MVMuint64 u; } now; GetSystemTimeAsFileTime(&now.ft); return (now.u - OFFSET) * 100; } void MVM_platform_sleep(MVMnum64 second) { DWORD millis = (DWORD)(second * 1000); Sleep(millis); } void MVM_platform_nanosleep(MVMuint64 nanos) { MVMuint64 now; DWORD millis; const MVMuint64 end = MVM_platform_now() + nanos; millis = (DWORD)((nanos + E6 - 1) / E6); while(1) { Sleep(millis); now = MVM_platform_now(); if (now >= end) break; millis = (DWORD)((end - now) / E6); } } MoarVM-2018.03/src/profiler/heapsnapshot.c0000644000175000017510000011530513243116442020462 0ustar samanthasamantha#include "moar.h" #ifndef MAX #define MAX(x, y) ((y) > (x) ? (y) : (x)) #endif /* Check if we're currently taking heap snapshots. */ MVMint32 MVM_profile_heap_profiling(MVMThreadContext *tc) { return tc->instance->heap_snapshots != NULL; } /* Start heap profiling. */ void MVM_profile_heap_start(MVMThreadContext *tc, MVMObject *config) { MVMHeapSnapshotCollection *col = MVM_calloc(1, sizeof(MVMHeapSnapshotCollection)); char *path; MVMString *path_str; col->index = MVM_calloc(1, sizeof(MVMHeapDumpIndex)); col->index->snapshot_sizes = MVM_calloc(1, sizeof(MVMHeapDumpIndexSnapshotEntry)); tc->instance->heap_snapshots = col; path_str = MVM_repr_get_str(tc, MVM_repr_at_key_o(tc, config, tc->instance->str_consts.path)); if (MVM_is_null(tc, (MVMObject*)path_str)) { MVM_exception_throw_adhoc(tc, "Didn't specify a path for the heap snapshot profiler"); } path = MVM_string_utf8_encode_C_string(tc, path_str); col->fh = fopen(path, "w"); if (!col->fh) { char *waste[2] = {path, NULL}; MVM_exception_throw_adhoc_free(tc, waste, "Couldn't open heap snapshot target file %s: %s", path, strerror(errno)); } MVM_free(path); fputs("MoarHeapDumpv002", col->fh); } /* Grows storage if it's full, zeroing the extension. Assumes it's only being * grown for one more item. */ static void grow_storage(void *store_ptr, MVMuint64 *num, MVMuint64 *alloc, size_t size) { void **store = (void **)store_ptr; if (*num == *alloc) { *alloc = *alloc ? 2 * *alloc : 32; *store = MVM_realloc(*store, *alloc * size); memset(((char *)*store) + *num * size, 0, (*alloc - *num) * size); } } /* Get a string heap index for the specified C string, adding it if needed. */ #define STR_MODE_OWN 0 #define STR_MODE_CONST 1 #define STR_MODE_DUP 2 static MVMuint64 get_string_index(MVMThreadContext *tc, MVMHeapSnapshotState *ss, char *str, char str_mode) { MVMuint64 i; /* Add a lookup hash here if it gets to be a hotspot. */ MVMHeapSnapshotCollection *col = ss->col; for (i = 0; i < col->num_strings; i++) { if (strcmp(col->strings[i], str) == 0) { if (str_mode == STR_MODE_OWN) MVM_free(str); return i; } } grow_storage((void **)&(col->strings), &(col->num_strings), &(col->alloc_strings), sizeof(char *)); grow_storage(&(col->strings_free), &(col->num_strings_free), &(col->alloc_strings_free), sizeof(char)); col->strings_free[col->num_strings_free] = str_mode != STR_MODE_CONST; col->num_strings_free++; col->strings[col->num_strings] = str_mode == STR_MODE_DUP ? strdup(str) : str; return col->num_strings++; } /* Gets a string index in the string heap for a VM string. */ static MVMuint64 get_vm_string_index(MVMThreadContext *tc, MVMHeapSnapshotState *ss, MVMString *str) { return str ? get_string_index(tc, ss, MVM_string_utf8_encode_C_string(tc, str), STR_MODE_OWN) : get_string_index(tc, ss, "", STR_MODE_CONST); } /* Push a collectable to the list of work items, allocating space for it and * returning the collectable index. */ static MVMuint64 push_workitem(MVMThreadContext *tc, MVMHeapSnapshotState *ss, MVMuint16 kind, void *target) { MVMHeapSnapshotWorkItem *wi; MVMuint64 col_idx; /* Mark space in collectables collection, and allocate an index. */ grow_storage(&(ss->hs->collectables), &(ss->hs->num_collectables), &(ss->hs->alloc_collectables), sizeof(MVMHeapSnapshotCollectable)); col_idx = ss->hs->num_collectables; ss->hs->num_collectables++; /* Add to the worklist. */ grow_storage(&(ss->workitems), &(ss->num_workitems), &(ss->alloc_workitems), sizeof(MVMHeapSnapshotWorkItem)); wi = &(ss->workitems[ss->num_workitems]); wi->kind = kind; wi->col_idx = col_idx; wi->target = target; ss->num_workitems++; return col_idx; } /* Pop a work item. */ static MVMHeapSnapshotWorkItem pop_workitem(MVMThreadContext *tc, MVMHeapSnapshotState *ss) { ss->num_workitems--; return ss->workitems[ss->num_workitems]; } /* Sets the current reference "from" collectable. */ static void set_ref_from(MVMThreadContext *tc, MVMHeapSnapshotState *ss, MVMuint64 col_idx) { /* The references should be contiguous, so if this collectable already * has any, something's wrong. */ if (ss->hs->collectables[col_idx].num_refs) MVM_panic(1, "Heap snapshot corruption: can not add non-contiguous refs"); ss->ref_from = col_idx; ss->hs->collectables[col_idx].refs_start = ss->hs->num_references; } /* Adds a reference. */ static void add_reference(MVMThreadContext *tc, MVMHeapSnapshotState *ss, MVMuint16 ref_kind, MVMuint64 index, MVMuint64 to) { /* Add to the references collection. */ MVMHeapSnapshotReference *ref; MVMuint64 description = (index << MVM_SNAPSHOT_REF_KIND_BITS) | ref_kind; grow_storage(&(ss->hs->references), &(ss->hs->num_references), &(ss->hs->alloc_references), sizeof(MVMHeapSnapshotReference)); ref = &(ss->hs->references[ss->hs->num_references]); ref->description = description; ref->collectable_index = to; ss->hs->num_references++; /* Increment collectable's number of references. */ ss->hs->collectables[ss->ref_from].num_refs++; } /* Adds a reference with an integer description. */ static void add_reference_idx(MVMThreadContext *tc, MVMHeapSnapshotState *ss, MVMuint64 idx, MVMuint64 to) { add_reference(tc, ss, MVM_SNAPSHOT_REF_KIND_INDEX, idx, to); } /* Adds a reference with a C string description. */ static void add_reference_cstr(MVMThreadContext *tc, MVMHeapSnapshotState *ss, char *cstr, MVMuint64 to) { MVMuint64 str_idx = get_string_index(tc, ss, cstr, STR_MODE_OWN); add_reference(tc, ss, MVM_SNAPSHOT_REF_KIND_STRING, str_idx, to); } /* Adds a reference with a constant C string description. */ static void add_reference_const_cstr(MVMThreadContext *tc, MVMHeapSnapshotState *ss, const char *cstr, MVMuint64 to) { MVMuint64 str_idx = get_string_index(tc, ss, (char *)cstr, STR_MODE_CONST); add_reference(tc, ss, MVM_SNAPSHOT_REF_KIND_STRING, str_idx, to); } /* Adds a reference with a VM string description. */ static void add_reference_vm_str(MVMThreadContext *tc, MVMHeapSnapshotState *ss, MVMString *str, MVMuint64 to) { MVMuint64 str_idx = get_vm_string_index(tc, ss, str); add_reference(tc, ss, MVM_SNAPSHOT_REF_KIND_STRING, str_idx, to); } /* Adds an entry to the seen hash. */ static void saw(MVMThreadContext *tc, MVMHeapSnapshotState *ss, void *addr, MVMuint64 idx) { MVMHeapSnapshotSeen *seen = MVM_calloc(1, sizeof(MVMHeapSnapshotSeen)); seen->address = addr; seen->idx = idx; HASH_ADD_KEYPTR(hash_handle, ss->seen, (char *)&(seen->address), sizeof(void *), seen); } /* Checks for an entry in the seen hash. If we find an entry, write the index * into the index pointer passed. */ static MVMuint32 seen(MVMThreadContext *tc, MVMHeapSnapshotState *ss, void *addr, MVMuint64 *idx) { MVMHeapSnapshotSeen *entry; HASH_FIND(hash_handle, ss->seen, (char *)&(addr), sizeof(void *), entry); if (entry) { *idx = entry->idx; return 1; } else { return 0; } } /* Gets the index of a collectable, either returning an existing index if we've * seen it before or adding it if not. */ static MVMuint64 get_collectable_idx(MVMThreadContext *tc, MVMHeapSnapshotState *ss, MVMCollectable *collectable) { MVMuint64 idx; if (!seen(tc, ss, collectable, &idx)) { if (collectable->flags & MVM_CF_STABLE) idx = push_workitem(tc, ss, MVM_SNAPSHOT_COL_KIND_STABLE, collectable); else if (collectable->flags & MVM_CF_TYPE_OBJECT) idx = push_workitem(tc, ss, MVM_SNAPSHOT_COL_KIND_TYPE_OBJECT, collectable); else if (collectable->flags & MVM_CF_FRAME) idx = push_workitem(tc, ss, MVM_SNAPSHOT_COL_KIND_FRAME, collectable); else idx = push_workitem(tc, ss, MVM_SNAPSHOT_COL_KIND_OBJECT, collectable); saw(tc, ss, collectable, idx); } return idx; } /* Gets the index of a frame, either returning an existing index if we've seen * it before or adding it if not. */ static MVMuint64 get_frame_idx(MVMThreadContext *tc, MVMHeapSnapshotState *ss, MVMFrame *frame) { MVMuint64 idx; if (!seen(tc, ss, frame, &idx)) { idx = push_workitem(tc, ss, MVM_SNAPSHOT_COL_KIND_FRAME, frame); saw(tc, ss, frame, idx); } return idx; } /* Adds a type table index reference to the collectable snapshot entry, either * using an existing type table entry or adding a new one. */ static void set_type_index(MVMThreadContext *tc, MVMHeapSnapshotState *ss, MVMHeapSnapshotCollectable *col, MVMSTable *st) { MVMuint64 repr_idx = get_string_index(tc, ss, (char *)st->REPR->name, STR_MODE_CONST); MVMuint64 type_idx = MVM_6model_get_stable_debug_name(tc, st) ? get_string_index(tc, ss, MVM_6model_get_stable_debug_name(tc, st), STR_MODE_DUP) : get_string_index(tc, ss, "", STR_MODE_CONST); MVMuint64 i; MVMHeapSnapshotType *t; for (i = 0; i < ss->col->num_types; i++) { t = &(ss->col->types[i]); if (t->repr_name == repr_idx && t->type_name == type_idx) { col->type_or_frame_index = i; return; } } grow_storage(&(ss->col->types), &(ss->col->num_types), &(ss->col->alloc_types), sizeof(MVMHeapSnapshotType)); t = &(ss->col->types[ss->col->num_types]); t->repr_name = repr_idx; t->type_name = type_idx; col->type_or_frame_index = ss->col->num_types; ss->col->num_types++; } /* Adds a static frame table index reference to the collectable snapshot entry, * either using an existing table entry or adding a new one. */ static void set_static_frame_index(MVMThreadContext *tc, MVMHeapSnapshotState *ss, MVMHeapSnapshotCollectable *col, MVMStaticFrame *sf) { MVMuint64 name_idx = get_vm_string_index(tc, ss, sf->body.name); MVMuint64 cuid_idx = get_vm_string_index(tc, ss, sf->body.cuuid); MVMCompUnit *cu = sf->body.cu; MVMBytecodeAnnotation *ann = MVM_bytecode_resolve_annotation(tc, &(sf->body), 0); MVMuint64 line = ann ? ann->line_number : 1; MVMuint64 file_idx = ann && ann->filename_string_heap_index < cu->body.num_strings ? get_vm_string_index(tc, ss, MVM_cu_string(tc, cu, ann->filename_string_heap_index)) : get_vm_string_index(tc, ss, cu->body.filename); MVMuint64 i; MVMHeapSnapshotStaticFrame *s; for (i = 0; i < ss->col->num_static_frames; i++) { s = &(ss->col->static_frames[i]); if (s->name == name_idx && s->cuid == cuid_idx && s->line == line && s->file == file_idx) { col->type_or_frame_index = i; MVM_free(ann); return; } } MVM_free(ann); grow_storage(&(ss->col->static_frames), &(ss->col->num_static_frames), &(ss->col->alloc_static_frames), sizeof(MVMHeapSnapshotStaticFrame)); s = &(ss->col->static_frames[ss->col->num_static_frames]); s->name = name_idx; s->cuid = cuid_idx; s->line = line; s->file = file_idx; col->type_or_frame_index = ss->col->num_static_frames; ss->col->num_static_frames++; } /* Processes the work items, until we've none left. */ static void process_collectable(MVMThreadContext *tc, MVMHeapSnapshotState *ss, MVMHeapSnapshotCollectable *col, MVMCollectable *c) { MVMuint32 sc_idx = MVM_sc_get_idx_of_sc(c); if (sc_idx > 0) add_reference_const_cstr(tc, ss, "", get_collectable_idx(tc, ss, (MVMCollectable *)tc->instance->all_scs[sc_idx]->sc)); col->collectable_size = c->size; } static void process_gc_worklist(MVMThreadContext *tc, MVMHeapSnapshotState *ss, char *desc) { MVMCollectable **c_ptr; MVMuint16 ref_kind = desc ? MVM_SNAPSHOT_REF_KIND_STRING : MVM_SNAPSHOT_REF_KIND_UNKNOWN; MVMuint16 ref_index = desc ? get_string_index(tc, ss, desc, STR_MODE_CONST) : 0; while (( c_ptr = MVM_gc_worklist_get(tc, ss->gcwl) )) { MVMCollectable *c = *c_ptr; if (c) add_reference(tc, ss, ref_kind, ref_index, get_collectable_idx(tc, ss, c)); } } static void process_object(MVMThreadContext *tc, MVMHeapSnapshotState *ss, MVMHeapSnapshotCollectable *col, MVMObject *obj) { process_collectable(tc, ss, col, (MVMCollectable *)obj); set_type_index(tc, ss, col, obj->st); add_reference_const_cstr(tc, ss, "", get_collectable_idx(tc, ss, (MVMCollectable *)obj->st)); if (IS_CONCRETE(obj)) { /* Use object's gc_mark function to find what it references. */ /* XXX We'll also add an API for getting better information, e.g. * attribute names. */ if (REPR(obj)->describe_refs) REPR(obj)->describe_refs(tc, ss, STABLE(obj), OBJECT_BODY(obj)); else if (REPR(obj)->gc_mark) { REPR(obj)->gc_mark(tc, STABLE(obj), OBJECT_BODY(obj), ss->gcwl); process_gc_worklist(tc, ss, NULL); } if (REPR(obj)->unmanaged_size) col->unmanaged_size += REPR(obj)->unmanaged_size(tc, STABLE(obj), OBJECT_BODY(obj)); } } static void process_workitems(MVMThreadContext *tc, MVMHeapSnapshotState *ss) { while (ss->num_workitems > 0) { MVMHeapSnapshotWorkItem item = pop_workitem(tc, ss); /* We take our own working copy of the collectable info, since the * collectables array can grow and be reallocated. */ MVMHeapSnapshotCollectable col; set_ref_from(tc, ss, item.col_idx); col = ss->hs->collectables[item.col_idx]; col.kind = item.kind; switch (item.kind) { case MVM_SNAPSHOT_COL_KIND_OBJECT: case MVM_SNAPSHOT_COL_KIND_TYPE_OBJECT: process_object(tc, ss, &col, (MVMObject *)item.target); break; case MVM_SNAPSHOT_COL_KIND_STABLE: { MVMuint16 i; MVMSTable *st = (MVMSTable *)item.target; process_collectable(tc, ss, &col, (MVMCollectable *)st); set_type_index(tc, ss, &col, st); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)st->method_cache, "Method cache"); for (i = 0; i < st->type_check_cache_length; i++) MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)st->type_check_cache[i], "Type cache entry"); if (st->container_spec && st->container_spec->gc_mark_data) { st->container_spec->gc_mark_data(tc, st, ss->gcwl); process_gc_worklist(tc, ss, "Container spec data item"); } if (st->boolification_spec) MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)st->boolification_spec->method, "Boolification method"); if (st->invocation_spec) { MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)st->invocation_spec->class_handle, "Invocation spec class handle"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)st->invocation_spec->attr_name, "Invocation spec attribute name"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)st->invocation_spec->invocation_handler, "Invocation spec invocation handler"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)st->invocation_spec->md_class_handle, "Invocation spec class handle (multi)"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)st->invocation_spec->md_cache_attr_name, "Invocation spec cache attribute name (multi)"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)st->invocation_spec->md_valid_attr_name, "Invocation spec valid attribute name (multi)"); } MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)st->WHO, "WHO"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)st->WHAT, "WHAT"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)st->HOW, "HOW"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)st->HOW_sc, "HOW serialization context"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)st->method_cache_sc, "Method cache serialization context"); if (st->mode_flags & MVM_PARAMETRIC_TYPE) { MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)st->paramet.ric.parameterizer, "Parametric type parameterizer"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)st->paramet.ric.lookup, "Parametric type intern table"); } else if (st->mode_flags & MVM_PARAMETERIZED_TYPE) { MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)st->paramet.erized.parametric_type, "Parameterized type's parametric type"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)st->paramet.erized.parameters, "Parameterized type's parameters"); } if (st->REPR->gc_mark_repr_data) { st->REPR->gc_mark_repr_data(tc, st, ss->gcwl); process_gc_worklist(tc, ss, "REPR data item"); } break; } case MVM_SNAPSHOT_COL_KIND_FRAME: { MVMFrame *frame = (MVMFrame *)item.target; col.collectable_size = sizeof(MVMFrame); set_static_frame_index(tc, ss, &col, frame->static_info); if (frame->caller && !MVM_FRAME_IS_ON_CALLSTACK(tc, frame)) add_reference_const_cstr(tc, ss, "Caller", get_frame_idx(tc, ss, frame->caller)); if (frame->outer) add_reference_const_cstr(tc, ss, "Outer", get_frame_idx(tc, ss, frame->outer)); MVM_gc_root_add_frame_registers_to_worklist(tc, ss->gcwl, frame); process_gc_worklist(tc, ss, "Register"); if (frame->work) col.unmanaged_size += frame->allocd_work; if (frame->env) { MVMuint16 i, count; MVMuint16 *type_map; MVMuint16 name_count = frame->static_info->body.num_lexicals; MVMLexicalRegistry **names = frame->static_info->body.lexical_names_list; if (frame->spesh_cand && frame->spesh_cand->lexical_types) { type_map = frame->spesh_cand->lexical_types; count = frame->spesh_cand->num_lexicals; } else { type_map = frame->static_info->body.lexical_types; count = frame->static_info->body.num_lexicals; } for (i = 0; i < count; i++) { if (type_map[i] == MVM_reg_str || type_map[i] == MVM_reg_obj) { if (i < name_count) MVM_profile_heap_add_collectable_rel_vm_str(tc, ss, (MVMCollectable *)frame->env[i].o, names[i]->key); else MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)frame->env[i].o, "Lexical (inlined)"); } } col.unmanaged_size += frame->allocd_env; } MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)frame->code_ref, "Code reference"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)frame->static_info, "Static frame"); if (frame->extra) { MVMFrameExtra *e = frame->extra; if (e->special_return_data && e->mark_special_return_data) { e->mark_special_return_data(tc, frame, ss->gcwl); process_gc_worklist(tc, ss, "Special return data"); } if (e->continuation_tags) { MVMContinuationTag *tag = e->continuation_tags; while (tag) { MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)tag->tag, "Continuation tag"); col.unmanaged_size += sizeof(MVMContinuationTag); tag = tag->next; } } MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable *)e->dynlex_cache_name, "Dynamic lexical cache name"); } break; } case MVM_SNAPSHOT_COL_KIND_PERM_ROOTS: MVM_gc_root_add_permanents_to_worklist(tc, NULL, ss); break; case MVM_SNAPSHOT_COL_KIND_INSTANCE_ROOTS: MVM_gc_root_add_instance_roots_to_worklist(tc, NULL, ss); break; case MVM_SNAPSHOT_COL_KIND_CSTACK_ROOTS: MVM_gc_root_add_temps_to_worklist((MVMThreadContext *)item.target, NULL, ss); break; case MVM_SNAPSHOT_COL_KIND_THREAD_ROOTS: { MVMThreadContext *thread_tc = (MVMThreadContext *)item.target; MVM_gc_root_add_tc_roots_to_worklist(thread_tc, NULL, ss); if (thread_tc->cur_frame && !MVM_FRAME_IS_ON_CALLSTACK(thread_tc, thread_tc->cur_frame)) add_reference_const_cstr(tc, ss, "Current frame", get_frame_idx(tc, ss, thread_tc->cur_frame)); break; } case MVM_SNAPSHOT_COL_KIND_ROOT: { MVMThread *cur_thread; add_reference_const_cstr(tc, ss, "Permanent Roots", push_workitem(tc, ss, MVM_SNAPSHOT_COL_KIND_PERM_ROOTS, NULL)); add_reference_const_cstr(tc, ss, "VM Instance Roots", push_workitem(tc, ss, MVM_SNAPSHOT_COL_KIND_INSTANCE_ROOTS, NULL)); cur_thread = tc->instance->threads; while (cur_thread) { if (cur_thread->body.tc) { add_reference_const_cstr(tc, ss, "C Stack Roots", push_workitem(tc, ss, MVM_SNAPSHOT_COL_KIND_CSTACK_ROOTS, cur_thread->body.tc)); add_reference_const_cstr(tc, ss, "Thread Roots", push_workitem(tc, ss, MVM_SNAPSHOT_COL_KIND_THREAD_ROOTS, cur_thread->body.tc)); add_reference_const_cstr(tc, ss, "Inter-generational Roots", push_workitem(tc, ss, MVM_SNAPSHOT_COL_KIND_INTERGEN_ROOTS, cur_thread->body.tc)); add_reference_const_cstr(tc, ss, "Thread Call Stack Roots", push_workitem(tc, ss, MVM_SNAPSHOT_COL_KIND_CALLSTACK_ROOTS, cur_thread->body.tc)); } cur_thread = cur_thread->body.next; } break; } case MVM_SNAPSHOT_COL_KIND_INTERGEN_ROOTS: { MVMThreadContext *thread_tc = (MVMThreadContext *)item.target; MVM_gc_root_add_gen2s_to_snapshot(thread_tc, ss); break; } case MVM_SNAPSHOT_COL_KIND_CALLSTACK_ROOTS: { MVMThreadContext *thread_tc = (MVMThreadContext *)item.target; if (thread_tc->cur_frame && MVM_FRAME_IS_ON_CALLSTACK(tc, thread_tc->cur_frame)) { MVMFrame *cur_frame = thread_tc->cur_frame; MVMint32 idx = 0; while (cur_frame && MVM_FRAME_IS_ON_CALLSTACK(tc, cur_frame)) { add_reference_idx(tc, ss, idx, push_workitem(tc, ss, MVM_SNAPSHOT_COL_KIND_FRAME, (MVMCollectable *)cur_frame)); idx++; cur_frame = cur_frame->caller; } } break; } default: MVM_panic(1, "Unknown heap snapshot worklist item kind %d", item.kind); } /* Store updated collectable info into array. Note that num_refs was * updated "at a distance". */ col.num_refs = ss->hs->collectables[item.col_idx].num_refs; ss->hs->collectables[item.col_idx] = col; } } /* API function for adding a collectable to the snapshot, describing its * relation to the current collectable with a constant C string that we * should not free. */ void MVM_profile_heap_add_collectable_rel_const_cstr(MVMThreadContext *tc, MVMHeapSnapshotState *ss, MVMCollectable *collectable, char *desc) { if (collectable) add_reference_const_cstr(tc, ss, desc, get_collectable_idx(tc, ss, collectable)); } /* API function for adding a collectable to the snapshot, describing its * relation to the current collectable with an MVMString. */ void MVM_profile_heap_add_collectable_rel_vm_str(MVMThreadContext *tc, MVMHeapSnapshotState *ss, MVMCollectable *collectable, MVMString *desc) { if (collectable) add_reference_vm_str(tc, ss, desc, get_collectable_idx(tc, ss, collectable)); } /* API function for adding a collectable to the snapshot, describing its * relation to the current collectable with an integer index. */ void MVM_profile_heap_add_collectable_rel_idx(MVMThreadContext *tc, MVMHeapSnapshotState *ss, MVMCollectable *collectable, MVMuint64 idx) { if (collectable) add_reference_idx(tc, ss, idx, get_collectable_idx(tc, ss, collectable)); } /* Drives the overall process of recording a snapshot of the heap. */ static void record_snapshot(MVMThreadContext *tc, MVMHeapSnapshotCollection *col, MVMHeapSnapshot *hs) { /* Initialize state for taking a snapshot. */ MVMHeapSnapshotState ss; memset(&ss, 0, sizeof(MVMHeapSnapshotState)); ss.col = col; ss.hs = hs; ss.gcwl = MVM_gc_worklist_create(tc, 1); /* We push the ultimate "root of roots" onto the worklist to get things * going, then set off on our merry way. */ push_workitem(tc, &ss, MVM_SNAPSHOT_COL_KIND_ROOT, NULL); process_workitems(tc, &ss); /* Clean up temporary state. */ MVM_free(ss.workitems); MVM_HASH_DESTROY(hash_handle, MVMHeapSnapshotSeen, ss.seen); MVM_gc_worklist_destroy(tc, ss.gcwl); } static void destroy_current_heap_snapshot(MVMThreadContext *tc) { MVMHeapSnapshotCollection *col = tc->instance->heap_snapshots; MVM_free(col->snapshot->collectables); MVM_free(col->snapshot->references); MVM_free(col->snapshot); col->snapshot = NULL; } /* Frees all memory associated with the heap snapshot. */ static void destroy_heap_snapshot_collection(MVMThreadContext *tc) { MVMHeapSnapshotCollection *col = tc->instance->heap_snapshots; MVMuint64 i; for (i = 0; i < col->num_strings; i++) if (col->strings_free[i]) MVM_free(col->strings[i]); MVM_free(col->strings); MVM_free(col->strings_free); MVM_free(col->types); MVM_free(col->static_frames); MVM_free(col->index->snapshot_sizes); MVM_free(col->index); MVM_free(col); tc->instance->heap_snapshots = NULL; } void string_heap_to_filehandle(MVMThreadContext *tc, MVMHeapSnapshotCollection *col) { MVMuint64 i; MVMHeapDumpIndex *index = col->index; FILE *fh = col->fh; fputs("strs", fh); /* Write out the number of strings we have and record the "header" size * in the index. */ i = col->num_strings - col->strings_written; fwrite(&i, sizeof(MVMuint64), 1, fh); index->stringheap_size = sizeof(MVMuint64) + 4; for (i = col->strings_written; i < col->num_strings; i++) { char *str = col->strings[i]; MVMuint64 output_size = strlen(str); /* Every string is stored as a 64 bit integer length followed by utf8- * encoded string data. */ fwrite(&output_size, sizeof(MVMuint64), 1, fh); fwrite(str, sizeof(MVMuint8), output_size, fh); /* Adjust the size by how much we wrote, including the size prefix */ index->stringheap_size += sizeof(MVMuint64) + sizeof(MVMuint8) * output_size; } col->strings_written = col->num_strings; } /* The following functions all act the exact same way: * * Write a little introductory text of 4 bytes for the parser to ensure * the index is correct, write the number of entries and the size of each entry * as 64bit integers, calculate the complete size for the index, and then * just write out each entry * * We also write a partial table after every snapshot so that if the process * crashes we still have a usable file. */ void types_to_filehandle(MVMThreadContext *tc, MVMHeapSnapshotCollection *col) { MVMuint64 i; MVMHeapDumpIndex *index = col->index; FILE *fh = col->fh; fputs("type", fh); i = col->num_types - col->types_written; fwrite(&i, sizeof(MVMuint64), 1, fh); i = sizeof(MVMuint64) * 2; fwrite(&i, sizeof(MVMuint64), 1, fh); index->types_size = sizeof(MVMuint64) * 2 + 4 + sizeof(MVMuint64) * 2 * (col->num_types - col->types_written); for (i = col->types_written; i < col->num_types; i++) { MVMHeapSnapshotType *t = &col->types[i]; fwrite(&t->repr_name, sizeof(MVMuint64), 1, fh); fwrite(&t->type_name, sizeof(MVMuint64), 1, fh); } col->types_written = col->num_types; } void static_frames_to_filehandle(MVMThreadContext *tc, MVMHeapSnapshotCollection *col) { MVMuint64 i; MVMHeapDumpIndex *index = col->index; FILE *fh = col->fh; fputs("fram", fh); i = col->num_static_frames - col->static_frames_written; fwrite(&i, sizeof(MVMuint64), 1, fh); i = sizeof(MVMuint64) * 4; fwrite(&i, sizeof(MVMuint64), 1, fh); index->staticframes_size = sizeof(MVMuint64) * 2 + 4 + sizeof(MVMuint64) * 4 * (col->num_static_frames - col->static_frames_written); for (i = col->static_frames_written; i < col->num_static_frames; i++) { MVMHeapSnapshotStaticFrame *sf = &col->static_frames[i]; fwrite(&sf->name, sizeof(MVMuint64), 1, fh); fwrite(&sf->cuid, sizeof(MVMuint64), 1, fh); fwrite(&sf->line, sizeof(MVMuint64), 1, fh); fwrite(&sf->file, sizeof(MVMuint64), 1, fh); } col->static_frames_written = col->num_static_frames; } /* The collectables table gets an entry in the additional "snapshot sizes * table" that ends up before the general index at the end of the file. * * This sizes table has three entries for each entry. The first one is the * size of the collectables table. */ void collectables_to_filehandle(MVMThreadContext *tc, MVMHeapSnapshotCollection *col, MVMHeapDumpIndexSnapshotEntry *entry) { MVMuint64 i; FILE *fh = col->fh; MVMHeapSnapshot *s = col->snapshot; fputs("coll", fh); fwrite(&s->num_collectables, sizeof(MVMuint64), 1, fh); i = sizeof(MVMuint16) * 2 + sizeof(MVMuint32) * 2 + sizeof(MVMuint64) * 2; fwrite(&i, sizeof(MVMuint64), 1, fh); entry->collectables_size += s->num_collectables * i + 4 + sizeof(MVMuint64) * 2; for (i = 0; i < s->num_collectables; i++) { MVMHeapSnapshotCollectable *coll = &s->collectables[i]; fwrite(&coll->kind, sizeof(MVMuint16), 1, fh); fwrite(&coll->type_or_frame_index, sizeof(MVMuint32), 1, fh); fwrite(&coll->collectable_size, sizeof(MVMuint16), 1, fh); fwrite(&coll->unmanaged_size, sizeof(MVMuint64), 1, fh); if (coll->num_refs) fwrite(&coll->refs_start, sizeof(MVMuint64), 1, fh); else { MVMuint64 refs_start = 0; fwrite(&refs_start, sizeof(MVMuint64), 1, fh); } fwrite(&coll->num_refs, sizeof(MVMuint32), 1, fh); } } /* The references table has extreme potential for compression by first writing * out a "how many bytes per field" byte, then writing each field with the * determined size. * * That's why there's two entries in the snapshot size table for references: * so that the parser can confidently skip to the exact middle of * the references table and parse it with two threads in parallel. */ void references_to_filehandle(MVMThreadContext *tc, MVMHeapSnapshotCollection *col, MVMHeapDumpIndexSnapshotEntry *entry) { MVMuint64 i; MVMuint64 halfway; FILE *fh = col->fh; MVMHeapSnapshot *s = col->snapshot; fputs("refs", fh); fwrite(&s->num_references, sizeof(MVMuint64), 1, fh); i = sizeof(MVMuint64) * 2 + 1; fwrite(&i, sizeof(MVMuint64), 1, fh); entry->full_refs_size = 4 + sizeof(MVMuint64) * 2; halfway = s->num_references / 2 - 1; for (i = 0; i < s->num_references; i++) { MVMHeapSnapshotReference *ref = &s->references[i]; MVMuint8 descr = ref->description & ((1 << MVM_SNAPSHOT_REF_KIND_BITS) - 1); MVMuint64 kind = ref->description >> MVM_SNAPSHOT_REF_KIND_BITS; MVMuint64 cindex = ref->collectable_index; MVMuint64 maxval = MAX(kind, cindex); if (maxval + 1 >= 1LL << 32) { fputc('6', fh); fwrite(&descr, sizeof(MVMuint8), 1, fh); fwrite(&kind, sizeof(MVMuint64), 1, fh); fwrite(&cindex, sizeof(MVMuint64), 1, fh); entry->full_refs_size += sizeof(MVMuint64) * 2 + 2; } else if (maxval + 1 >= 1 << 16) { MVMuint32 kind32, index32; kind32 = kind; index32 = cindex; fputc('3', fh); fwrite(&descr, sizeof(MVMuint8), 1, fh); fwrite(&kind32, sizeof(MVMuint32), 1, fh); fwrite(&index32, sizeof(MVMuint32), 1, fh); entry->full_refs_size += sizeof(MVMuint32) * 2 + 2; } else if (maxval + 1 >= 1 << 8) { MVMuint16 kind16, index16; kind16 = kind; index16 = cindex; fputc('1', fh); fwrite(&descr, sizeof(MVMuint8), 1, fh); fwrite(&kind16, sizeof(MVMuint16), 1, fh); fwrite(&index16, sizeof(MVMuint16), 1, fh); entry->full_refs_size += sizeof(MVMuint16) * 2 + 2; } else { MVMuint8 descr8, kind8, index8; kind8 = kind; index8 = cindex; fputc('0', fh); fwrite(&descr, sizeof(MVMuint8), 1, fh); fwrite(&kind8, sizeof(MVMuint8), 1, fh); fwrite(&index8, sizeof(MVMuint8), 1, fh); entry->full_refs_size += sizeof(MVMuint8) * 3 + 1; } if (i == halfway) { entry->refs_middlepoint = entry->full_refs_size; } } } void snapshot_to_filehandle(MVMThreadContext *tc, MVMHeapSnapshotCollection *col) { MVMHeapDumpIndex *index = col->index; MVMuint64 i = col->snapshot_idx; MVMHeapDumpIndexSnapshotEntry *entry; grow_storage((void **)&(index->snapshot_sizes), &(index->snapshot_size_entries), &(index->snapshot_sizes_alloced), sizeof(MVMHeapDumpIndexSnapshotEntry)); index->snapshot_size_entries++; entry = &(index->snapshot_sizes[i]); entry->collectables_size = 0; entry->full_refs_size = 0; entry->refs_middlepoint = 0; entry->incremental_data = 0; collectables_to_filehandle(tc, col, entry); references_to_filehandle(tc, col, entry); /*string_heap_to_filehandle(tc, col);*/ /*types_to_filehandle(tc, col);*/ /*static_frames_to_filehandle(tc, col);*/ /*entry->incremental_data = index->stringheap_size + index->types_size + index->staticframes_size;*/ } void index_to_filehandle(MVMThreadContext *tc, MVMHeapSnapshotCollection *col) { MVMHeapDumpIndex *index = col->index; FILE *fh = col->fh; fwrite(index->snapshot_sizes, sizeof(MVMHeapDumpIndexSnapshotEntry), index->snapshot_size_entries, fh); fwrite(&index->stringheap_size, sizeof(MVMuint64), 1, fh); fwrite(&index->types_size, sizeof(MVMuint64), 1, fh); fwrite(&index->staticframes_size, sizeof(MVMuint64), 1, fh); fwrite(&index->snapshot_size_entries, sizeof(MVMuint64), 1, fh); } void finish_collection_to_filehandle(MVMThreadContext *tc, MVMHeapSnapshotCollection *col) { col->strings_written = 0; col->types_written = 0; col->static_frames_written = 0; string_heap_to_filehandle(tc, col); types_to_filehandle(tc, col); static_frames_to_filehandle(tc, col); index_to_filehandle(tc, col); } /* Takes a snapshot of the heap, outputting it to the filehandle */ void MVM_profile_heap_take_snapshot(MVMThreadContext *tc) { if (MVM_profile_heap_profiling(tc)) { MVMHeapSnapshotCollection *col = tc->instance->heap_snapshots; col->snapshot = MVM_calloc(1, sizeof(MVMHeapSnapshot)); record_snapshot(tc, col, col->snapshot); snapshot_to_filehandle(tc, col); fflush(col->fh); destroy_current_heap_snapshot(tc); col->snapshot_idx++; } } /* Finishes heap profiling, getting the data. */ MVMObject * MVM_profile_heap_end(MVMThreadContext *tc) { MVMHeapSnapshotCollection *col = tc->instance->heap_snapshots; MVMObject *dataset; /* Trigger a GC run, to ensure we get at least one heap snapshot. */ MVM_gc_enter_from_allocator(tc); dataset = tc->instance->VMNull; finish_collection_to_filehandle(tc, tc->instance->heap_snapshots); fclose(col->fh); destroy_heap_snapshot_collection(tc); return dataset; } MoarVM-2018.03/src/profiler/heapsnapshot.h0000644000175000017510000001613513237701240020467 0ustar samanthasamanthastruct MVMHeapDumpIndexSnapshotEntry { MVMuint64 collectables_size; MVMuint64 full_refs_size; MVMuint64 refs_middlepoint; MVMuint64 incremental_data; }; struct MVMHeapDumpIndex { MVMuint64 stringheap_size; MVMuint64 types_size; MVMuint64 staticframes_size; MVMuint64 snapshot_size_entries; MVMHeapDumpIndexSnapshotEntry *snapshot_sizes; MVMuint64 snapshot_sizes_alloced; }; /* A collection of heap snapshots, with common type and static frame names. * Note that we take care to never refer to heap objects themselves in here, * including for types and frames, since to do so would extend their lifetime * for the whole program, which would render the results pretty bogus. */ struct MVMHeapSnapshotCollection { /* Snapshot we are currently taking and its index */ MVMHeapSnapshot *snapshot; MVMuint64 snapshot_idx; /* Known types/REPRs. Just a list for now, but we might like to look at a * hash or trie if this ends up making taking a snapshot wicked slow. */ MVMHeapSnapshotType *types; MVMuint64 num_types; MVMuint64 alloc_types; /* Known static frames. Same applies to searching this as to the above. */ MVMHeapSnapshotStaticFrame *static_frames; MVMuint64 num_static_frames; MVMuint64 alloc_static_frames; /* Strings, referenced by index from various places. Also a "should we * free it" flag for each one. */ char **strings; MVMuint64 num_strings; MVMuint64 alloc_strings; char *strings_free; MVMuint64 num_strings_free; MVMuint64 alloc_strings_free; MVMuint64 types_written; MVMuint64 static_frames_written; MVMuint64 strings_written; MVMHeapDumpIndex *index; /* The file handle we are outputting to */ FILE *fh; }; /* An individual heap snapshot. */ struct MVMHeapSnapshot { /* Array of data about collectables on the heap. */ MVMHeapSnapshotCollectable *collectables; MVMuint64 num_collectables; MVMuint64 alloc_collectables; /* References. */ MVMHeapSnapshotReference *references; MVMuint64 num_references; MVMuint64 alloc_references; }; /* An object/type object/STable type in the snapshot. */ struct MVMHeapSnapshotType { /* String heap index of the REPR name. */ MVMuint64 repr_name; /* String heap index of the type's debug name. */ MVMuint64 type_name; }; /* A static frame in the snapshot. */ struct MVMHeapSnapshotStaticFrame { /* The static frame name; index into the snapshot collection string heap. */ MVMuint64 name; /* The static frame compilation unit ID, for added uniqueness checking. * Also an index into the string heap. */ MVMuint64 cuid; /* The line number where it's declared. */ MVMuint64 line; /* And the filename; also an index into snapshot collection string heap. */ MVMuint64 file; }; /* Kinds of collectable, plus a few "virtual" kinds to cover the various places * we find roots. MVM_SNAPSHOT_COL_KIND_ROOT is the ultimate root of the heap * snapshot and everything hangs off it. */ #define MVM_SNAPSHOT_COL_KIND_OBJECT 1 #define MVM_SNAPSHOT_COL_KIND_TYPE_OBJECT 2 #define MVM_SNAPSHOT_COL_KIND_STABLE 3 #define MVM_SNAPSHOT_COL_KIND_FRAME 4 #define MVM_SNAPSHOT_COL_KIND_PERM_ROOTS 5 #define MVM_SNAPSHOT_COL_KIND_INSTANCE_ROOTS 6 #define MVM_SNAPSHOT_COL_KIND_CSTACK_ROOTS 7 #define MVM_SNAPSHOT_COL_KIND_THREAD_ROOTS 8 #define MVM_SNAPSHOT_COL_KIND_ROOT 9 #define MVM_SNAPSHOT_COL_KIND_INTERGEN_ROOTS 10 #define MVM_SNAPSHOT_COL_KIND_CALLSTACK_ROOTS 11 /* Data about an individual collectable in the heap snapshot. Ordered to avoid * holes. */ struct MVMHeapSnapshotCollectable { /* What kind of collectable is it? */ MVMuint16 kind; /* Self-size (from the collectable header). */ MVMuint16 collectable_size; /* Index into the snapshot collection type name or frame info array, * depending on kind. */ MVMuint32 type_or_frame_index; /* The number of other collectables this one references. */ MVMuint32 num_refs; /* Index into the references info list. */ MVMuint64 refs_start; /* Unmanaged size (memory held but not under the GC's contorl). */ MVMuint64 unmanaged_size; }; /* Reference identifier kinds. */ #define MVM_SNAPSHOT_REF_KIND_UNKNOWN 0 #define MVM_SNAPSHOT_REF_KIND_INDEX 1 #define MVM_SNAPSHOT_REF_KIND_STRING 2 /* Number of bits needed for ref kind. */ #define MVM_SNAPSHOT_REF_KIND_BITS 2 /* A reference from one collectable to another. */ struct MVMHeapSnapshotReference { /* The lower MVM_SNAPSHOT_REF_KIND_BITS bits indicate the type of reference. * After shifting those away, we either have a numeric index (e.g. for * array indexes) or an index into the string heap (for lexicals in frames * and attributes in objects). If kind is MVM_SNAPSHOT_REF_KIND_UNKNOWN the * rest of the bits will be zero; we know nothing of the relationship. */ MVMuint64 description; /* The index of the collectable referenced. */ MVMuint64 collectable_index; }; /* Current state object whlie taking a heap snapshot. */ struct MVMHeapSnapshotState { /* The heap snapshot collection and current working snapshot. */ MVMHeapSnapshotCollection *col; MVMHeapSnapshot *hs; /* Our current collectable worklist. */ MVMHeapSnapshotWorkItem *workitems; MVMuint64 num_workitems; MVMuint64 alloc_workitems; /* The collectable we're currently adding references for. */ MVMuint64 ref_from; /* The seen hash of collectables (including frames). */ MVMHeapSnapshotSeen *seen; /* We sometimes use GC mark functions to find references. Keep a worklist * around for those times (much cheaper than allocating it whenever we * need it). */ MVMGCWorklist *gcwl; }; /* Work item used while taking a heap snapshot. */ struct MVMHeapSnapshotWorkItem { /* The kind of collectable. */ MVMuint16 kind; /* Index in the collectables (assigned upon adding to the worklist). */ MVMuint64 col_idx; /* Target collectable, if any. */ void *target; }; /* Heap seen hash entry used while taking a heap snapshot. */ struct MVMHeapSnapshotSeen { /* The seen address. */ void *address; /* The collectables index it has. */ MVMuint64 idx; /* Hash handle. */ UT_hash_handle hash_handle; }; MVMint32 MVM_profile_heap_profiling(MVMThreadContext *tc); void MVM_profile_heap_start(MVMThreadContext *tc, MVMObject *config); void MVM_profile_heap_take_snapshot(MVMThreadContext *tc); MVMObject * MVM_profile_heap_end(MVMThreadContext *tc); /* API for things that want to contribute more detailed data to the heap * profile. */ MVM_PUBLIC void MVM_profile_heap_add_collectable_rel_const_cstr(MVMThreadContext *tc, MVMHeapSnapshotState *ss, MVMCollectable *collectable, char *desc); MVM_PUBLIC void MVM_profile_heap_add_collectable_rel_vm_str(MVMThreadContext *tc, MVMHeapSnapshotState *ss, MVMCollectable *collectable, MVMString *desc); MVM_PUBLIC void MVM_profile_heap_add_collectable_rel_idx(MVMThreadContext *tc, MVMHeapSnapshotState *ss, MVMCollectable *collectable, MVMuint64 idx); MoarVM-2018.03/src/profiler/instrument.c0000644000175000017510000006317113247173402020203 0ustar samanthasamantha#include "moar.h" typedef struct { MVMuint32 items; MVMuint32 start; MVMuint32 alloc; MVMProfileCallNode **list; } NodeWorklist; static void add_node(MVMThreadContext *tc, NodeWorklist *list, MVMProfileCallNode *node) { if (list->start + list->items + 1 < list->alloc) { /* Add at the end */ list->items++; list->list[list->start + list->items] = node; } else if (list->start > 0) { /* End reached, add to the start now */ list->start--; list->list[list->start] = node; } else { /* Filled up the whole list. Make it bigger */ list->alloc *= 2; list->list = MVM_realloc(list->list, list->alloc * sizeof(MVMProfileCallNode *)); } } static MVMProfileCallNode *take_node(MVMThreadContext *tc, NodeWorklist *list) { MVMProfileCallNode *result = NULL; if (list->items == 0) { MVM_panic(1, "profiler: tried to take a node from an empty node worklist"); } if (list->start > 0) { result = list->list[list->start]; list->start++; } else { result = list->list[list->start + list->items]; list->items--; } return result; } /* Adds an instruction to log an allocation. */ static void add_allocation_logging(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMSpeshIns *alloc_ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); alloc_ins->info = MVM_op_get_op(MVM_OP_prof_allocated); alloc_ins->operands = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshOperand)); alloc_ins->operands[0] = ins->operands[0]; MVM_spesh_manipulate_insert_ins(tc, bb, ins, alloc_ins); } static void add_nativecall_logging(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMSpeshIns *enter_ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); MVMSpeshIns *exit_ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); enter_ins->info = MVM_op_get_op(MVM_OP_prof_enternative); enter_ins->operands = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshOperand)); enter_ins->operands[0] = ins->operands[2]; MVM_spesh_manipulate_insert_ins(tc, bb, ins->prev, enter_ins); exit_ins->info = MVM_op_get_op(MVM_OP_prof_exit); MVM_spesh_manipulate_insert_ins(tc, bb, ins, exit_ins); } static void instrument_graph(MVMThreadContext *tc, MVMSpeshGraph *g) { /* Insert entry instruction. */ MVMSpeshBB *bb = g->entry->linear_next; MVMSpeshIns *enter_ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); enter_ins->info = MVM_op_get_op(MVM_OP_prof_enter); MVM_spesh_manipulate_insert_ins(tc, bb, NULL, enter_ins); /* Walk the code and insert profile logging instructions as needed. */ while (bb) { MVMSpeshIns *ins = bb->first_ins; while (ins) { switch (ins->info->opcode) { case MVM_OP_return_i: case MVM_OP_return_n: case MVM_OP_return_s: case MVM_OP_return_o: case MVM_OP_return: { /* Log a normal exit prior to returning. */ MVMSpeshIns *exit_ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); exit_ins->info = MVM_op_get_op(MVM_OP_prof_exit); MVM_spesh_manipulate_insert_ins(tc, bb, ins->prev, exit_ins); /* If the return instruction is a goto target, move to the * instrumentation instruction. */ if (ins->annotations) { MVMSpeshAnn *ann = ins->annotations; MVMSpeshAnn *prev_ann = NULL; while (ann) { if (ann->type == MVM_SPESH_ANN_FH_GOTO) { if (prev_ann) prev_ann->next = ann->next; else ins->annotations = ann->next; exit_ins->annotations = ann; ann->next = NULL; break; } prev_ann = ann; ann = ann->next; } } break; } case MVM_OP_invoke_o: case MVM_OP_param_rp_o: case MVM_OP_param_op_o: case MVM_OP_param_rn_o: case MVM_OP_param_on_o: case MVM_OP_param_sp: case MVM_OP_param_sn: case MVM_OP_newexception: case MVM_OP_usecapture: case MVM_OP_savecapture: case MVM_OP_takeclosure: case MVM_OP_getattr_o: case MVM_OP_getattrs_o: case MVM_OP_sp_p6ogetvc_o: case MVM_OP_create: case MVM_OP_sp_fastcreate: case MVM_OP_clone: case MVM_OP_box_i: case MVM_OP_box_n: case MVM_OP_box_s: case MVM_OP_iter: case MVM_OP_add_I: case MVM_OP_sub_I: case MVM_OP_mul_I: case MVM_OP_div_I: case MVM_OP_mod_I: case MVM_OP_neg_I: case MVM_OP_abs_I: case MVM_OP_bor_I: case MVM_OP_bxor_I: case MVM_OP_band_I: case MVM_OP_bnot_I: case MVM_OP_blshift_I: case MVM_OP_brshift_I: case MVM_OP_pow_I: case MVM_OP_gcd_I: case MVM_OP_lcm_I: case MVM_OP_expmod_I: case MVM_OP_rand_I: case MVM_OP_coerce_nI: case MVM_OP_coerce_sI: case MVM_OP_radix_I: { add_allocation_logging(tc, g, bb, ins); break; } case MVM_OP_getlex: case MVM_OP_getlex_no: case MVM_OP_getlexstatic_o: case MVM_OP_getlexperinvtype_o: case MVM_OP_getlexouter: case MVM_OP_getlexrel: case MVM_OP_getlexreldyn: case MVM_OP_getlexrelcaller: case MVM_OP_getlexcaller: { /* We have to check if the target register is actually * an object register. */ if ((g->local_types && g->local_types[ins->operands[0].reg.orig] == MVM_reg_obj) || (!g->local_types && g->sf->body.local_types[ins->operands[0].reg.orig] == MVM_reg_obj)) add_allocation_logging(tc, g, bb, ins); break; } case MVM_OP_getlexref_i: case MVM_OP_getlexref_n: case MVM_OP_getlexref_s: case MVM_OP_getlexref_ni: case MVM_OP_getlexref_nn: case MVM_OP_getlexref_ns: case MVM_OP_atposref_i: case MVM_OP_atposref_n: case MVM_OP_atposref_s: case MVM_OP_getattrref_i: case MVM_OP_getattrref_n: case MVM_OP_getattrref_s: case MVM_OP_getattrsref_i: case MVM_OP_getattrsref_n: case MVM_OP_getattrsref_s: add_allocation_logging(tc, g, bb, ins); break; case MVM_OP_nativecallinvoke: add_nativecall_logging(tc, g, bb, ins); break; default: /* See if it's an allocating extop. */ if (ins->info->opcode == (MVMuint16)-1) { MVMExtOpRecord *extops = g->sf->body.cu->body.extops; MVMuint16 num_extops = g->sf->body.cu->body.num_extops; MVMuint16 i; for (i = 0; i < num_extops; i++) { if (extops[i].info == ins->info) { if (extops[i].allocating && extops[i].info->num_operands >= 1) add_allocation_logging(tc, g, bb, ins); break; } } } break; } ins = ins->next; } bb = bb->linear_next; } } /* Adds instrumented versions of the unspecialized bytecode. */ static void add_instrumentation(MVMThreadContext *tc, MVMStaticFrame *sf) { MVMSpeshCode *sc; MVMStaticFrameInstrumentation *ins; MVMSpeshGraph *sg = MVM_spesh_graph_create(tc, sf, 1, 0); instrument_graph(tc, sg); sc = MVM_spesh_codegen(tc, sg); ins = MVM_calloc(1, sizeof(MVMStaticFrameInstrumentation)); ins->instrumented_bytecode = sc->bytecode; ins->instrumented_handlers = sc->handlers; ins->instrumented_bytecode_size = sc->bytecode_size; ins->uninstrumented_bytecode = sf->body.bytecode; ins->uninstrumented_handlers = sf->body.handlers; ins->uninstrumented_bytecode_size = sf->body.bytecode_size; sf->body.instrumentation = ins; MVM_spesh_graph_destroy(tc, sg); MVM_free(sc); } /* Instruments a static frame for profiling, or uses an existing * instrumentation if it exists. */ void MVM_profile_instrument(MVMThreadContext *tc, MVMStaticFrame *sf) { if (!sf->body.instrumentation || sf->body.bytecode != sf->body.instrumentation->instrumented_bytecode) { /* Handle main, non-specialized, bytecode. */ if (!sf->body.instrumentation) add_instrumentation(tc, sf); sf->body.bytecode = sf->body.instrumentation->instrumented_bytecode; sf->body.handlers = sf->body.instrumentation->instrumented_handlers; sf->body.bytecode_size = sf->body.instrumentation->instrumented_bytecode_size; /* Throw away any argument guard so we'll never resolve prior * specializations again. */ MVM_spesh_arg_guard_discard(tc, sf); } } /* Ensures we're no longer in instrumented code. */ void MVM_profile_ensure_uninstrumented(MVMThreadContext *tc, MVMStaticFrame *sf) { if (sf->body.instrumentation && sf->body.bytecode == sf->body.instrumentation->instrumented_bytecode) { /* Switch to uninstrumented code. */ sf->body.bytecode = sf->body.instrumentation->uninstrumented_bytecode; sf->body.handlers = sf->body.instrumentation->uninstrumented_handlers; sf->body.bytecode_size = sf->body.instrumentation->uninstrumented_bytecode_size; /* Throw away specializations, which may also be instrumented. */ MVM_spesh_arg_guard_discard(tc, sf); /* XXX For now, due to bugs, disable spesh here. */ tc->instance->spesh_enabled = 0; } } /* Starts instrumented profiling. */ void MVM_profile_instrumented_start(MVMThreadContext *tc, MVMObject *config) { /* Wait for specialization thread to stop working, so it won't trip over * bytecode instrumentation, then enable profiling. */ uv_mutex_lock(&(tc->instance->mutex_spesh_sync)); while (tc->instance->spesh_working != 0) uv_cond_wait(&(tc->instance->cond_spesh_sync), &(tc->instance->mutex_spesh_sync)); tc->instance->profiling = 1; tc->instance->instrumentation_level++; uv_mutex_unlock(&(tc->instance->mutex_spesh_sync)); } /* Simple allocation functions. */ static MVMObject * new_array(MVMThreadContext *tc) { return MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_array_type); } static MVMObject * new_hash(MVMThreadContext *tc) { return MVM_repr_alloc_init(tc, MVM_hll_current(tc)->slurpy_hash_type); } static MVMObject * box_i(MVMThreadContext *tc, MVMint64 i) { return MVM_repr_box_int(tc, MVM_hll_current(tc)->int_box_type, i); } static MVMObject * box_s(MVMThreadContext *tc, MVMString *s) { return MVM_repr_box_str(tc, MVM_hll_current(tc)->str_box_type, s); } static MVMString * str(MVMThreadContext *tc, const char *buf) { return MVM_string_ascii_decode_nt(tc, tc->instance->VMString, buf); } /* String constants we'll reuse. */ typedef struct { MVMString *total_time; MVMString *call_graph; MVMString *name; MVMString *id; MVMString *file; MVMString *line; MVMString *entries; MVMString *spesh_entries; MVMString *jit_entries; MVMString *inlined_entries; MVMString *inclusive_time; MVMString *exclusive_time; MVMString *callees; MVMString *allocations; MVMString *spesh; MVMString *jit; MVMString *type; MVMString *count; MVMString *gcs; MVMString *time; MVMString *full; MVMString *sequence; MVMString *responsible; MVMString *cleared_bytes; MVMString *retained_bytes; MVMString *promoted_bytes; MVMString *gen2_roots; MVMString *start_time; MVMString *osr; MVMString *deopt_one; MVMString *deopt_all; MVMString *spesh_time; MVMString *thread; MVMString *native_lib; } ProfDumpStrs; /* Dumps a call graph node. */ static MVMObject * dump_call_graph_node(MVMThreadContext *tc, ProfDumpStrs *pds, const MVMProfileCallNode *pcn) { MVMObject *node_hash = new_hash(tc); MVMuint32 i; /* Let's see if we're dealing with a native call or a regular moar call */ if (pcn->sf) { /* Try to resolve the code filename and line number. */ MVMBytecodeAnnotation *annot = MVM_bytecode_resolve_annotation(tc, &(pcn->sf->body), 0); MVMint32 fshi = annot ? (MVMint32)annot->filename_string_heap_index : -1; /* Add name of code object. */ MVM_repr_bind_key_o(tc, node_hash, pds->name, box_s(tc, pcn->sf->body.name)); /* Add line number and file name. */ if (fshi >= 0 && fshi < pcn->sf->body.cu->body.num_strings) MVM_repr_bind_key_o(tc, node_hash, pds->file, box_s(tc, MVM_cu_string(tc, pcn->sf->body.cu, fshi))); else if (pcn->sf->body.cu->body.filename) MVM_repr_bind_key_o(tc, node_hash, pds->file, box_s(tc, pcn->sf->body.cu->body.filename)); else MVM_repr_bind_key_o(tc, node_hash, pds->file, box_s(tc, tc->instance->str_consts.empty)); MVM_repr_bind_key_o(tc, node_hash, pds->line, box_i(tc, annot ? (MVMint32)annot->line_number : -1)); MVM_free(annot); /* Use static frame memory address to get a unique ID. */ MVM_repr_bind_key_o(tc, node_hash, pds->id, box_i(tc, (MVMint64)pcn->sf)); } else { MVMString *function_name_string = MVM_string_utf8_c8_decode(tc, tc->instance->VMString, pcn->native_target_name, strlen(pcn->native_target_name)); MVM_repr_bind_key_o(tc, node_hash, pds->name, box_s(tc, function_name_string)); MVM_repr_bind_key_o(tc, node_hash, pds->file, box_s(tc, pds->native_lib)); MVM_repr_bind_key_o(tc, node_hash, pds->line, box_i(tc, -2)); /* Use the address of the name string as unique ID. a hack, but oh well. */ MVM_repr_bind_key_o(tc, node_hash, pds->id, box_i(tc, (MVMint64)pcn->native_target_name)); } /* Entry counts. */ if (pcn->total_entries) MVM_repr_bind_key_o(tc, node_hash, pds->entries, box_i(tc, pcn->total_entries)); if (pcn->specialized_entries) MVM_repr_bind_key_o(tc, node_hash, pds->spesh_entries, box_i(tc, pcn->specialized_entries)); if (pcn->jit_entries) MVM_repr_bind_key_o(tc, node_hash, pds->jit_entries, box_i(tc, pcn->jit_entries)); if (pcn->inlined_entries) MVM_repr_bind_key_o(tc, node_hash, pds->inlined_entries, box_i(tc, pcn->inlined_entries)); /* Total (inclusive) time. */ MVM_repr_bind_key_o(tc, node_hash, pds->inclusive_time, box_i(tc, pcn->total_time / 1000)); /* OSR and deopt counts. */ if (pcn->osr_count) MVM_repr_bind_key_o(tc, node_hash, pds->osr, box_i(tc, pcn->osr_count)); if (pcn->deopt_one_count) MVM_repr_bind_key_o(tc, node_hash, pds->deopt_one, box_i(tc, pcn->deopt_one_count)); if (pcn->deopt_all_count) MVM_repr_bind_key_o(tc, node_hash, pds->deopt_all, box_i(tc, pcn->deopt_all_count)); /* Visit successors in the call graph, dumping them and working out the * exclusive time. */ if (pcn->num_succ) { MVMObject *callees = new_array(tc); MVMuint64 exclusive_time = pcn->total_time; for (i = 0; i < pcn->num_succ; i++) { MVM_repr_push_o(tc, callees, dump_call_graph_node(tc, pds, pcn->succ[i])); exclusive_time -= pcn->succ[i]->total_time; } MVM_repr_bind_key_o(tc, node_hash, pds->exclusive_time, box_i(tc, exclusive_time / 1000)); MVM_repr_bind_key_o(tc, node_hash, pds->callees, callees); } else { MVM_repr_bind_key_o(tc, node_hash, pds->exclusive_time, box_i(tc, pcn->total_time / 1000)); } if (pcn->num_alloc) { /* Emit allocations. */ MVMObject *alloc_list = new_array(tc); MVM_repr_bind_key_o(tc, node_hash, pds->allocations, alloc_list); for (i = 0; i < pcn->num_alloc; i++) { MVMObject *alloc_info = new_hash(tc); MVMProfileAllocationCount *alloc = &pcn->alloc[i]; MVMObject *type = pcn->alloc[i].type; MVM_repr_bind_key_o(tc, alloc_info, pds->id, box_i(tc, (MVMint64)type)); MVM_repr_bind_key_o(tc, alloc_info, pds->type, type); if (alloc->allocations_spesh) MVM_repr_bind_key_o(tc, alloc_info, pds->spesh, box_i(tc, alloc->allocations_spesh)); if (alloc->allocations_jit) MVM_repr_bind_key_o(tc, alloc_info, pds->jit, box_i(tc, alloc->allocations_jit)); MVM_repr_bind_key_o(tc, alloc_info, pds->count, box_i(tc, alloc->allocations_interp + alloc->allocations_spesh + alloc->allocations_jit)); MVM_repr_push_o(tc, alloc_list, alloc_info); } } return node_hash; } /* Dumps data from a single thread. */ static MVMObject * dump_thread_data(MVMThreadContext *tc, ProfDumpStrs *pds, MVMThreadContext *othertc, const MVMProfileThreadData *ptd) { MVMObject *thread_hash = new_hash(tc); MVMObject *thread_gcs = new_array(tc); MVMuint64 absolute_start_time; MVMuint32 i; /* Use the main thread's start time for absolute timings */ absolute_start_time = tc->instance->main_thread->prof_data->start_time; /* Add time. */ MVM_repr_bind_key_o(tc, thread_hash, pds->total_time, box_i(tc, (ptd->end_time - ptd->start_time) / 1000)); /* Add call graph. */ if (ptd->call_graph) MVM_repr_bind_key_o(tc, thread_hash, pds->call_graph, dump_call_graph_node(tc, pds, ptd->call_graph)); /* Add GCs. */ for (i = 0; i < ptd->num_gcs; i++) { MVMObject *gc_hash = new_hash(tc); MVM_repr_bind_key_o(tc, gc_hash, pds->time, box_i(tc, ptd->gcs[i].time / 1000)); MVM_repr_bind_key_o(tc, gc_hash, pds->full, box_i(tc, ptd->gcs[i].full)); MVM_repr_bind_key_o(tc, gc_hash, pds->sequence, box_i(tc, ptd->gcs[i].gc_seq_num - 2)); MVM_repr_bind_key_o(tc, gc_hash, pds->responsible, box_i(tc, ptd->gcs[i].responsible)); MVM_repr_bind_key_o(tc, gc_hash, pds->cleared_bytes, box_i(tc, ptd->gcs[i].cleared_bytes)); MVM_repr_bind_key_o(tc, gc_hash, pds->retained_bytes, box_i(tc, ptd->gcs[i].retained_bytes)); MVM_repr_bind_key_o(tc, gc_hash, pds->promoted_bytes, box_i(tc, ptd->gcs[i].promoted_bytes)); MVM_repr_bind_key_o(tc, gc_hash, pds->gen2_roots, box_i(tc, ptd->gcs[i].num_gen2roots)); MVM_repr_bind_key_o(tc, gc_hash, pds->start_time, box_i(tc, (ptd->gcs[i].abstime - absolute_start_time) / 1000)); MVM_repr_push_o(tc, thread_gcs, gc_hash); } MVM_repr_bind_key_o(tc, thread_hash, pds->gcs, thread_gcs); /* Add spesh time. */ MVM_repr_bind_key_o(tc, thread_hash, pds->spesh_time, box_i(tc, ptd->spesh_time / 1000)); /* Add thread id. */ MVM_repr_bind_key_o(tc, thread_hash, pds->thread, box_i(tc, othertc->thread_id)); return thread_hash; } void MVM_profile_dump_instrumented_data(MVMThreadContext *tc) { if (tc->prof_data && tc->prof_data->collected_data) { ProfDumpStrs pds; MVMThread *thread; /* We'll allocate the data in gen2, but as we want to keep it, but to be * sure we don't trigger a GC run. */ MVM_gc_allocate_gen2_default_set(tc); /* Some string constants to re-use. */ pds.total_time = str(tc, "total_time"); pds.call_graph = str(tc, "call_graph"); pds.name = str(tc, "name"); pds.id = str(tc, "id"); pds.file = str(tc, "file"); pds.line = str(tc, "line"); pds.entries = str(tc, "entries"); pds.spesh_entries = str(tc, "spesh_entries"); pds.jit_entries = str(tc, "jit_entries"); pds.inlined_entries = str(tc, "inlined_entries"); pds.inclusive_time = str(tc, "inclusive_time"); pds.exclusive_time = str(tc, "exclusive_time"); pds.callees = str(tc, "callees"); pds.allocations = str(tc, "allocations"); pds.type = str(tc, "type"); pds.count = str(tc, "count"); pds.spesh = str(tc, "spesh"); pds.jit = str(tc, "jit"); pds.gcs = str(tc, "gcs"); pds.time = str(tc, "time"); pds.full = str(tc, "full"); pds.sequence = str(tc, "sequence"); pds.responsible = str(tc, "responsible"); pds.cleared_bytes = str(tc, "cleared_bytes"); pds.retained_bytes = str(tc, "retained_bytes"); pds.promoted_bytes = str(tc, "promoted_bytes"); pds.gen2_roots = str(tc, "gen2_roots"); pds.start_time = str(tc, "start_time"); pds.osr = str(tc, "osr"); pds.deopt_one = str(tc, "deopt_one"); pds.deopt_all = str(tc, "deopt_all"); pds.spesh_time = str(tc, "spesh_time"); pds.thread = str(tc, "thread"); pds.native_lib = str(tc, "native library"); /* Record end time. */ tc->prof_data->end_time = uv_hrtime(); MVM_repr_push_o(tc, tc->prof_data->collected_data, dump_thread_data(tc, &pds, tc, tc->prof_data)); while (tc->prof_data->current_call) MVM_profile_log_exit(tc); /* Get all thread's data */ thread = tc->instance->threads; while (thread) { MVMThreadContext *othertc = thread->body.tc; /* Check for othertc to exist because joining threads nulls out * the tc entry in the thread object. */ if (othertc && othertc->prof_data && othertc != tc) { /* If we have any call frames still on the profile stack, exit them. */ while (othertc->prof_data->current_call) MVM_profile_log_exit(othertc); /* Record end time. */ othertc->prof_data->end_time = uv_hrtime(); MVM_gc_allocate_gen2_default_set(othertc); MVM_repr_push_o(tc, tc->prof_data->collected_data, dump_thread_data(tc, &pds, othertc, othertc->prof_data)); MVM_gc_allocate_gen2_default_clear(othertc); } thread = thread->body.next; } MVM_gc_allocate_gen2_default_clear(tc); } } /* Dumps data from all threads into an array of per-thread data. */ static MVMObject * dump_data(MVMThreadContext *tc) { MVMObject *collected_data; /* Build up threads array. */ /* XXX Only main thread for now. */ tc->prof_data->collected_data = new_array(tc); /* We rely on the GC orchestration to stop all threads and the * "main" gc thread to dump all thread data for us */ MVM_gc_enter_from_allocator(tc); collected_data = tc->prof_data->collected_data; tc->prof_data->collected_data = NULL; return collected_data; } /* Ends profiling, builds the result data structure, and returns it. */ MVMObject * MVM_profile_instrumented_end(MVMThreadContext *tc) { /* Disable profiling. */ uv_mutex_lock(&(tc->instance->mutex_spesh_sync)); while (tc->instance->spesh_working != 0) uv_cond_wait(&(tc->instance->cond_spesh_sync), &(tc->instance->mutex_spesh_sync)); tc->instance->profiling = 0; tc->instance->instrumentation_level++; uv_mutex_unlock(&(tc->instance->mutex_spesh_sync)); /* Build and return result data structure. */ return dump_data(tc); } /* Marks objects held in the profiling graph. */ static void mark_call_graph_node(MVMThreadContext *tc, MVMProfileCallNode *node, NodeWorklist *nodelist, MVMGCWorklist *worklist) { MVMuint32 i; MVM_gc_worklist_add(tc, worklist, &(node->sf)); for (i = 0; i < node->num_alloc; i++) MVM_gc_worklist_add(tc, worklist, &(node->alloc[i].type)); for (i = 0; i < node->num_succ; i++) add_node(tc, nodelist, node->succ[i]); } void MVM_profile_instrumented_mark_data(MVMThreadContext *tc, MVMGCWorklist *worklist) { if (tc->prof_data) { /* Allocate our worklist on the stack. */ NodeWorklist nodelist; nodelist.items = 0; nodelist.start = 0; nodelist.alloc = 256; nodelist.list = MVM_malloc(nodelist.alloc * sizeof(MVMProfileCallNode *)); add_node(tc, &nodelist, tc->prof_data->call_graph); while (nodelist.items) { MVMProfileCallNode *node = take_node(tc, &nodelist); if (node) mark_call_graph_node(tc, node, &nodelist, worklist); } MVM_gc_worklist_add(tc, worklist, &(tc->prof_data->collected_data)); MVM_free(nodelist.list); } } MoarVM-2018.03/src/profiler/instrument.h0000644000175000017510000000067613244342404020206 0ustar samanthasamanthavoid MVM_profile_dump_instrumented_data(MVMThreadContext *tc); void MVM_profile_instrument(MVMThreadContext *tc, MVMStaticFrame *sf); void MVM_profile_ensure_uninstrumented(MVMThreadContext *tc, MVMStaticFrame *sf); void MVM_profile_instrumented_start(MVMThreadContext *tc, MVMObject *config); MVMObject * MVM_profile_instrumented_end(MVMThreadContext *tc); void MVM_profile_instrumented_mark_data(MVMThreadContext *tc, MVMGCWorklist *worklist); MoarVM-2018.03/src/profiler/log.c0000644000175000017510000003353713247173402016557 0ustar samanthasamantha#include "moar.h" /* Gets the current thread's profiling data structure, creating it if needed. */ static MVMProfileThreadData * get_thread_data(MVMThreadContext *tc) { if (!tc->prof_data) { tc->prof_data = MVM_calloc(1, sizeof(MVMProfileThreadData)); tc->prof_data->start_time = uv_hrtime(); } return tc->prof_data; } /* Log that we're entering a new frame. */ void MVM_profile_log_enter(MVMThreadContext *tc, MVMStaticFrame *sf, MVMuint64 mode) { MVMProfileThreadData *ptd = get_thread_data(tc); /* Try to locate the entry node, if it's in the call graph already. */ MVMProfileCallNode *pcn = NULL; MVMuint32 i; if (ptd->current_call) for (i = 0; i < ptd->current_call->num_succ; i++) if (ptd->current_call->succ[i]->sf == sf) pcn = ptd->current_call->succ[i]; /* If we didn't find a call graph node, then create one and add it to the * graph. */ if (!pcn) { pcn = MVM_calloc(1, sizeof(MVMProfileCallNode)); pcn->sf = sf; if (ptd->current_call) { MVMProfileCallNode *pred = ptd->current_call; pcn->pred = pred; if (pred->num_succ == pred->alloc_succ) { pred->alloc_succ += 8; pred->succ = MVM_realloc(pred->succ, pred->alloc_succ * sizeof(MVMProfileCallNode *)); } pred->succ[pred->num_succ] = pcn; pred->num_succ++; } else { if (!ptd->call_graph) ptd->call_graph = pcn; } } /* Increment entry counts. */ pcn->total_entries++; switch (mode) { case MVM_PROFILE_ENTER_SPESH: pcn->specialized_entries++; break; case MVM_PROFILE_ENTER_SPESH_INLINE: pcn->specialized_entries++; pcn->inlined_entries++; break; case MVM_PROFILE_ENTER_JIT: pcn->jit_entries++; break; case MVM_PROFILE_ENTER_JIT_INLINE: pcn->jit_entries++; pcn->inlined_entries++; break; } pcn->entry_mode = mode; /* Log entry time; clear skip time. */ pcn->cur_entry_time = uv_hrtime(); pcn->cur_skip_time = 0; /* The current call graph node becomes this one. */ ptd->current_call = pcn; } /* Log that we've entered a native routine */ void MVM_profile_log_enter_native(MVMThreadContext *tc, MVMObject *nativecallsite) { MVMProfileThreadData *ptd = get_thread_data(tc); MVMProfileCallNode *pcn = NULL; MVMNativeCallBody *callbody; MVMuint32 i; /* We locate the right call node by looking at sf being NULL and the * native_target_name matching our intended target. */ callbody = MVM_nativecall_get_nc_body(tc, nativecallsite); if (ptd->current_call) for (i = 0; i < ptd->current_call->num_succ; i++) if (ptd->current_call->succ[i]->sf == NULL) if (strcmp(callbody->sym_name, ptd->current_call->succ[i]->native_target_name) == 0) { pcn = ptd->current_call->succ[i]; break; } /* If we didn't find a call graph node, then create one and add it to the * graph. */ if (!pcn) { pcn = MVM_calloc(1, sizeof(MVMProfileCallNode)); pcn->native_target_name = callbody->sym_name; if (ptd->current_call) { MVMProfileCallNode *pred = ptd->current_call; pcn->pred = pred; if (pred->num_succ == pred->alloc_succ) { pred->alloc_succ += 8; pred->succ = MVM_realloc(pred->succ, pred->alloc_succ * sizeof(MVMProfileCallNode *)); } pred->succ[pred->num_succ] = pcn; pred->num_succ++; } else { if (!ptd->call_graph) ptd->call_graph = pcn; } } /* Increment entry counts. */ pcn->total_entries++; pcn->entry_mode = 0; /* Log entry time; clear skip time. */ pcn->cur_entry_time = uv_hrtime(); pcn->cur_skip_time = 0; /* The current call graph node becomes this one. */ ptd->current_call = pcn; } /* Frame exit handler, used for unwind and normal exit. */ static void log_exit(MVMThreadContext *tc, MVMuint32 unwind) { MVMProfileThreadData *ptd = get_thread_data(tc); /* Ensure we've a current frame. */ MVMProfileCallNode *pcn = ptd->current_call; if (!pcn) { if (tc->instance->profiling) { /* No frame but still profiling; corruption. */ MVM_dump_backtrace(tc); MVM_panic(1, "Profiler lost sequence"); } else { /* We already finished profiling. */ return; } } /* Add to total time. */ pcn->total_time += (uv_hrtime() - pcn->cur_entry_time) - pcn->cur_skip_time; /* Move back to predecessor in call graph. */ ptd->current_call = pcn->pred; } /* Log that we're exiting a frame normally. */ void MVM_profile_log_exit(MVMThreadContext *tc) { log_exit(tc, 0); } /* Called when we unwind. Since we're also potentially leaving some inlined * frames, we need to exit until we hit the target one. */ void MVM_profile_log_unwind(MVMThreadContext *tc) { MVMProfileThreadData *ptd = get_thread_data(tc); MVMProfileCallNode *lpcn; do { MVMProfileCallNode *pcn = ptd->current_call; if (!pcn) return; lpcn = pcn; log_exit(tc, 1); } while (lpcn->sf != tc->cur_frame->static_info); } /* Called when we take a continuation. Leaves the static frames from the point * of view of the profiler, and saves each of them. */ MVMProfileContinuationData * MVM_profile_log_continuation_control(MVMThreadContext *tc, const MVMFrame *root_frame) { MVMProfileThreadData *ptd = get_thread_data(tc); MVMProfileContinuationData *cd = MVM_malloc(sizeof(MVMProfileContinuationData)); MVMStaticFrame **sfs = NULL; MVMuint64 *modes = NULL; MVMFrame *cur_frame = tc->cur_frame; MVMuint64 alloc_sfs = 0; MVMuint64 num_sfs = 0; MVMFrame *last_frame; do { MVMProfileCallNode *lpcn; do { MVMProfileCallNode *pcn = ptd->current_call; if (!pcn) MVM_panic(1, "Profiler lost sequence in continuation control"); if (num_sfs == alloc_sfs) { alloc_sfs += 16; sfs = MVM_realloc(sfs, alloc_sfs * sizeof(MVMStaticFrame *)); modes = MVM_realloc(modes, alloc_sfs * sizeof(MVMuint64)); } sfs[num_sfs] = pcn->sf; modes[num_sfs] = pcn->entry_mode; num_sfs++; lpcn = pcn; log_exit(tc, 1); } while (lpcn->sf != cur_frame->static_info); last_frame = cur_frame; cur_frame = cur_frame->caller; } while (last_frame != root_frame); cd->sfs = sfs; cd->num_sfs = num_sfs; cd->modes = modes; return cd; } /* Called when we invoke a continuation. Enters all the static frames we left * at the point we took the continuation. */ void MVM_profile_log_continuation_invoke(MVMThreadContext *tc, const MVMProfileContinuationData *cd) { MVMuint64 i = cd->num_sfs; while (i--) MVM_profile_log_enter(tc, cd->sfs[i], cd->modes[i]); } /* Log that we've just allocated the passed object (just log the type). */ void MVM_profile_log_allocated(MVMThreadContext *tc, MVMObject *obj) { MVMProfileThreadData *ptd = get_thread_data(tc); MVMProfileCallNode *pcn = ptd->current_call; if (pcn) { /* First, let's see if the allocation is actually at the end of the * nursery; we may have generated some "allocated" log instructions * after operations that may or may not allocate what they return. */ MVMuint32 distance = ((MVMuint64)tc->nursery_alloc - (MVMuint64)obj); if (!obj) { return; } /* Since some ops first allocate, then call something else that may * also allocate, we may have to allow for a bit of grace distance. */ if ((MVMuint64)obj > (MVMuint64)tc->nursery_tospace && distance <= obj->header.size && obj != ptd->last_counted_allocation) { /* See if there's an existing node to update. */ MVMObject *what = STABLE(obj)->WHAT; MVMuint32 i; MVMuint8 allocation_target; if (pcn->entry_mode == MVM_PROFILE_ENTER_SPESH || pcn->entry_mode == MVM_PROFILE_ENTER_SPESH_INLINE) { allocation_target = 1; } else if (pcn->entry_mode == MVM_PROFILE_ENTER_JIT || pcn->entry_mode == MVM_PROFILE_ENTER_JIT_INLINE) { allocation_target = 2; } else { allocation_target = 0; } for (i = 0; i < pcn->num_alloc; i++) { if (pcn->alloc[i].type == what) { if (allocation_target == 0) pcn->alloc[i].allocations_interp++; else if (allocation_target == 1) pcn->alloc[i].allocations_spesh++; else if (allocation_target == 2) pcn->alloc[i].allocations_jit++; ptd->last_counted_allocation = obj; return; } } /* No entry; create one. */ if (pcn->num_alloc == pcn->alloc_alloc) { pcn->alloc_alloc += 8; pcn->alloc = MVM_realloc(pcn->alloc, pcn->alloc_alloc * sizeof(MVMProfileAllocationCount)); } pcn->alloc[pcn->num_alloc].type = what; pcn->alloc[pcn->num_alloc].allocations_interp = allocation_target == 0; pcn->alloc[pcn->num_alloc].allocations_spesh = allocation_target == 1; pcn->alloc[pcn->num_alloc].allocations_jit = allocation_target == 2; ptd->last_counted_allocation = obj; pcn->num_alloc++; } } } /* Logs the start of a GC run. */ void MVM_profiler_log_gc_start(MVMThreadContext *tc, MVMuint32 full, MVMuint32 this_thread_responsible) { MVMProfileThreadData *ptd = get_thread_data(tc); MVMProfileGC *gc; /* Make a new entry in the GCs. We use the cleared_bytes to store the * maximum that could be cleared, and after GC is done will subtract * retained bytes and promoted bytes. */ if (ptd->num_gcs == ptd->alloc_gcs) { ptd->alloc_gcs += 16; ptd->gcs = MVM_realloc(ptd->gcs, ptd->alloc_gcs * sizeof(MVMProfileGC)); } gc = &ptd->gcs[ptd->num_gcs]; gc->full = full; gc->cleared_bytes = (char *)tc->nursery_alloc - (char *)tc->nursery_tospace; gc->responsible = this_thread_responsible; gc->gc_seq_num = MVM_load(&tc->instance->gc_seq_number); /* Record start time. */ ptd->cur_gc_start_time = uv_hrtime(); /* Also store this time in the GC data */ gc->abstime = ptd->cur_gc_start_time; } /* Logs the end of a GC run. */ void MVM_profiler_log_gc_end(MVMThreadContext *tc) { MVMProfileThreadData *ptd = get_thread_data(tc); MVMProfileCallNode *pcn = ptd->current_call; MVMuint64 gc_time; MVMint32 retained_bytes; /* Record time spent. */ gc_time = uv_hrtime() - ptd->cur_gc_start_time; ptd->gcs[ptd->num_gcs].time = gc_time; /* Record retained and promoted bytes. */ retained_bytes = (char *)tc->nursery_alloc - (char *)tc->nursery_tospace; ptd->gcs[ptd->num_gcs].promoted_bytes = tc->gc_promoted_bytes; ptd->gcs[ptd->num_gcs].retained_bytes = retained_bytes; /* Tweak cleared bytes count. */ ptd->gcs[ptd->num_gcs].cleared_bytes -= (retained_bytes + tc->gc_promoted_bytes); /* Record number of gen 2 roots (from gen2 to nursery) */ ptd->gcs[ptd->num_gcs].num_gen2roots = tc->num_gen2roots; /* Increment the number of GCs we've done. */ ptd->num_gcs++; /* Discount GC time from all active frames. */ while (pcn) { pcn->cur_skip_time += gc_time; pcn = pcn->pred; } } /* Log that we're starting some work on bytecode specialization or JIT. */ void MVM_profiler_log_spesh_start(MVMThreadContext *tc) { /* Record start time. */ MVMProfileThreadData *ptd = get_thread_data(tc->instance->main_thread); ptd->cur_spesh_start_time = uv_hrtime(); } /* Log that we've finished doing bytecode specialization or JIT. */ void MVM_profiler_log_spesh_end(MVMThreadContext *tc) { MVMProfileThreadData *ptd = get_thread_data(tc->instance->main_thread); MVMuint64 spesh_time; /* Because spesh workers might start before profiling starts, * MVM_profiler_log_spesh_end might get called before * MVM_profiler_log_spesh_start. */ if (ptd->cur_spesh_start_time == 0) ptd->cur_spesh_start_time = ptd->start_time; /* Record time spent. */ spesh_time = uv_hrtime() - ptd->cur_spesh_start_time; ptd->spesh_time += spesh_time; } /* Log that an on stack replacement took place. */ void MVM_profiler_log_osr(MVMThreadContext *tc, MVMuint64 jitted) { MVMProfileThreadData *ptd = get_thread_data(tc); MVMProfileCallNode *pcn = ptd->current_call; if (pcn) { pcn->osr_count++; if (jitted) pcn->jit_entries++; else pcn->specialized_entries++; } } /* Log that local deoptimization took pace. */ void MVM_profiler_log_deopt_one(MVMThreadContext *tc) { MVMProfileThreadData *ptd = get_thread_data(tc); MVMProfileCallNode *pcn = ptd->current_call; if (pcn) pcn->deopt_one_count++; } /* Log that full-stack deoptimization took pace. */ void MVM_profiler_log_deopt_all(MVMThreadContext *tc) { MVMProfileThreadData *ptd = get_thread_data(tc); MVMProfileCallNode *pcn = ptd->current_call; if (pcn) pcn->deopt_all_count++; } MoarVM-2018.03/src/profiler/log.h0000644000175000017510000001312313244342404016546 0ustar samanthasamantha/* Per-thread profiling data. */ struct MVMProfileThreadData { /* The root of the call graph. */ MVMProfileCallNode *call_graph; /* The current call graph node we're in. */ MVMProfileCallNode *current_call; /* The time we started profiling. */ MVMuint64 start_time; /* The time we finished profiling, if we got there already. */ MVMuint64 end_time; /* Garbage collection time measurements. */ MVMProfileGC *gcs; MVMuint32 num_gcs; MVMuint32 alloc_gcs; /* Amount of time spent in spesh. */ MVMuint64 spesh_time; /* Current spesh work start time, if any. */ MVMuint64 cur_spesh_start_time; /* Current GC start time, if any. */ MVMuint64 cur_gc_start_time; /* We have to make sure to not count the newest allocation infinitely * often if there's a conditionally-allocating operation (like getlex) * that gets called multiple times with no actual allocations in between */ MVMObject *last_counted_allocation; /* Used to pass generated data structure from the gc-orchestrated * dumping function back to the dump function that ends the profile */ MVMObject *collected_data; }; /* Information collected about a GC run. */ struct MVMProfileGC { /* How long the collection took. */ MVMuint64 time; /* When, relative to program start, did this GC take place? */ MVMuint64 abstime; /* Was it a full collection? */ MVMuint16 full; /* Was this thread responsible? */ MVMuint16 responsible; /* Which GC run does this belong to? * (Good to know in multithreaded situations where * some threads have their work stolen) */ AO_t gc_seq_num; /* Nursery statistics. */ MVMuint32 cleared_bytes; MVMuint32 retained_bytes; MVMuint32 promoted_bytes; /* Inter-generation links count */ MVMuint32 num_gen2roots; }; /* Call graph node, which is kept per thread. */ struct MVMProfileCallNode { /* The frame this data is for. * If this CallNode is for a native call, this is NULL. */ MVMStaticFrame *sf; /* If the static frame is NULL, we're collecting data on a native call */ char *native_target_name; /* The timestamp when we entered the node. */ MVMuint64 cur_entry_time; /* Time we should skip since cur_entry_time because execution was * suspended due to GC or spesh. */ MVMuint64 cur_skip_time; /* The node in the profiling call graph that we came from. */ MVMProfileCallNode *pred; /* Successor nodes so far. */ MVMProfileCallNode **succ; /* Number of successors we have, and have allocated space for. */ MVMuint32 num_succ; MVMuint32 alloc_succ; /* Allocations of different types, and the number of allocation * counts we have so far. */ MVMProfileAllocationCount *alloc; MVMuint32 num_alloc; MVMuint32 alloc_alloc; /* The total inclusive time so far spent in this node. */ MVMuint64 total_time; /* The total number of times this node was entered. */ MVMuint64 total_entries; /* Entries that were to specialized bytecode. */ MVMuint64 specialized_entries; /* Entries that were inlined. */ MVMuint64 inlined_entries; /* Entries that were to JITted code. */ MVMuint64 jit_entries; /* Number of times OSR took place. */ MVMuint64 osr_count; /* Number of times deopt_one happened. */ MVMuint64 deopt_one_count; /* Number of times deopt_all happened. */ MVMuint64 deopt_all_count; /* Entry mode, persisted for the sake of continuations. */ MVMuint64 entry_mode; }; /* Allocation counts for a call node. */ struct MVMProfileAllocationCount { /* The type we're counting allocations of. */ MVMObject *type; /* The number of allocations we've counted. */ /* a) in regularly interpreted code */ MVMuint64 allocations_interp; /* b) in spesh'd code */ MVMuint64 allocations_spesh; /* c) in jitted code */ MVMuint64 allocations_jit; }; /* When a continuation is taken, we attach one of these to it. It carries the * data needed to restore profiler state if the continuation is invoked. */ struct MVMProfileContinuationData { /* List of static frames we should restore, in reverse order. */ MVMStaticFrame **sfs; /* Entry modes to restore also. */ MVMuint64 *modes; /* Number of static frames in the list. */ MVMuint64 num_sfs; }; /* Ways we might enter a frame. */ #define MVM_PROFILE_ENTER_NORMAL 0 #define MVM_PROFILE_ENTER_SPESH 1 #define MVM_PROFILE_ENTER_SPESH_INLINE 2 #define MVM_PROFILE_ENTER_JIT 3 #define MVM_PROFILE_ENTER_JIT_INLINE 4 /* Logging functions. */ void MVM_profile_log_enter(MVMThreadContext *tc, MVMStaticFrame *sf, MVMuint64 mode); void MVM_profile_log_enter_native(MVMThreadContext *tc, MVMObject *nativecallsite); void MVM_profile_log_exit(MVMThreadContext *tc); void MVM_profile_log_unwind(MVMThreadContext *tc); MVMProfileContinuationData * MVM_profile_log_continuation_control(MVMThreadContext *tc, const MVMFrame *root_frame); void MVM_profile_log_continuation_invoke(MVMThreadContext *tc, const MVMProfileContinuationData *cd); void MVM_profile_log_allocated(MVMThreadContext *tc, MVMObject *obj); void MVM_profiler_log_gc_start(MVMThreadContext *tc, MVMuint32 full, MVMuint32 this_thread_responsible); void MVM_profiler_log_gc_end(MVMThreadContext *tc); void MVM_profiler_log_spesh_start(MVMThreadContext *tc); void MVM_profiler_log_spesh_end(MVMThreadContext *tc); void MVM_profiler_log_osr(MVMThreadContext *tc, MVMuint64 jitted); void MVM_profiler_log_deopt_one(MVMThreadContext *tc); void MVM_profiler_log_deopt_all(MVMThreadContext *tc); MoarVM-2018.03/src/profiler/profile.c0000644000175000017510000000257013237701240017423 0ustar samanthasamantha#include "moar.h" /* Starts profiling with the specified configuration. */ void MVM_profile_start(MVMThreadContext *tc, MVMObject *config) { if (tc->instance->profiling || MVM_profile_heap_profiling(tc)) MVM_exception_throw_adhoc(tc, "Profiling is already started"); if (MVM_repr_exists_key(tc, config, tc->instance->str_consts.kind)) { MVMString *kind = MVM_repr_get_str(tc, MVM_repr_at_key_o(tc, config, tc->instance->str_consts.kind)); if (MVM_string_equal(tc, kind, tc->instance->str_consts.instrumented)) MVM_profile_instrumented_start(tc, config); else if (MVM_string_equal(tc, kind, tc->instance->str_consts.heap)) MVM_profile_heap_start(tc, config); else MVM_exception_throw_adhoc(tc, "Unknown profiler specified"); } else { /* Default to instrumented if no profiler kind specified, since that * used to be the only one we supported. */ MVM_profile_instrumented_start(tc, config); } } /* Ends profiling and returns the result data structure. */ MVMObject * MVM_profile_end(MVMThreadContext *tc) { if (tc->instance->profiling) return MVM_profile_instrumented_end(tc); else if (MVM_profile_heap_profiling(tc)) return MVM_profile_heap_end(tc); else MVM_exception_throw_adhoc(tc, "Cannot end profiling if not profiling"); } MoarVM-2018.03/src/profiler/profile.h0000644000175000017510000000016413237701240017425 0ustar samanthasamanthavoid MVM_profile_start(MVMThreadContext *tc, MVMObject *config); MVMObject * MVM_profile_end(MVMThreadContext *tc); MoarVM-2018.03/src/profiler/telemeh.c0000644000175000017510000002301213237701240017400 0ustar samanthasamantha#include #ifdef HAVE_TELEMEH #include #include #include #if MVM_RDTSCP # ifdef _WIN32 # include # else # if defined(__x86_64__) || defined(__i386__) # include # else unsigned int __rdtscp(unsigned int *inval) { *inval = 0; return 0; } # endif # endif #else unsigned int __rdtscp(unsigned int *inval) { *inval = 0; return 0; } #endif double ticksPerSecond; // use RDTSCP instruction to get the required pipeline flush implicitly #define READ_TSC(tscValue) \ { \ unsigned int _tsc_aux; \ tscValue = __rdtscp(&_tsc_aux); \ } #ifdef __clang__ #if !__has_builtin(__builtin_ia32_rdtscp) #undef READ_TSC #define READ_TSC(tscValue) { tscValue = 0; } #warning "not using rdtscp" #endif #endif #ifdef _WIN32 #include #define MVM_sleep(ms) do { Sleep(ms); } while (0) #else #include #define MVM_sleep(ms) do { usleep(ms * 1000); } while (0) #endif enum RecordType { Calibration, Epoch, TimeStamp, IntervalStart, IntervalEnd, IntervalAnnotation, DynamicString }; struct CalibrationRecord { double ticksPerSecond; }; struct EpochRecord { unsigned long long time; }; struct TimeStampRecord { unsigned long long time; const char *description; }; struct IntervalRecord { unsigned long long time; unsigned int intervalID; const char *description; }; struct IntervalAnnotation { unsigned int intervalID; const char *description; }; struct DynamicString { unsigned int intervalID; char *description; }; struct TelemetryRecord { enum RecordType recordType; uintptr_t threadID; union { struct CalibrationRecord calibration; struct EpochRecord epoch; struct TimeStampRecord timeStamp; struct IntervalRecord interval; struct IntervalAnnotation annotation; struct DynamicString annotation_dynamic; } u; }; #define RECORD_BUFFER_SIZE 10000 // this is a ring buffer of telemetry events static struct TelemetryRecord recordBuffer[RECORD_BUFFER_SIZE]; static AO_t recordBufferIndex = 0; static unsigned int lastSerializedIndex = 0; static unsigned long long beginningEpoch = 0; static unsigned int telemetry_active = 0; struct TelemetryRecord *newRecord() { AO_t newBufferIndex, recordIndex; struct TelemetryRecord *record; do { recordIndex = MVM_load(&recordBufferIndex); newBufferIndex = (recordBufferIndex + 1) % RECORD_BUFFER_SIZE; } while(!MVM_trycas(&recordBufferIndex, recordIndex, newBufferIndex)); record = &recordBuffer[recordIndex]; return record; } static unsigned int intervalIDCounter = 0; MVM_PUBLIC void MVM_telemetry_timestamp(MVMThreadContext *threadID, const char *description) { struct TelemetryRecord *record; if (!telemetry_active) { return; } record = newRecord(); READ_TSC(record->u.timeStamp.time); record->recordType = TimeStamp; record->threadID = (uintptr_t)threadID; record->u.timeStamp.description = description; } MVM_PUBLIC unsigned int MVM_telemetry_interval_start(MVMThreadContext *threadID, const char *description) { struct TelemetryRecord *record; unsigned int intervalID; if (!telemetry_active) { return 0; } record = newRecord(); MVM_incr(&intervalIDCounter); intervalID = MVM_load(&intervalIDCounter); READ_TSC(record->u.interval.time); record->recordType = IntervalStart; record->threadID = (uintptr_t)threadID; record->u.interval.intervalID = intervalID; record->u.interval.description = description; return intervalID; } MVM_PUBLIC void MVM_telemetry_interval_stop(MVMThreadContext *threadID, int intervalID, const char *description) { struct TelemetryRecord *record; if (!telemetry_active) { return; } record = newRecord(); READ_TSC(record->u.interval.time); record->recordType = IntervalEnd; record->threadID = (uintptr_t)threadID; record->u.interval.intervalID = intervalID; record->u.interval.description = description; } MVM_PUBLIC void MVM_telemetry_interval_annotate(uintptr_t subject, int intervalID, const char *description) { struct TelemetryRecord *record; if (!telemetry_active) { return; } record = newRecord(); record->recordType = IntervalAnnotation; record->threadID = subject; record->u.annotation.intervalID = intervalID; record->u.annotation.description = description; } MVM_PUBLIC void MVM_telemetry_interval_annotate_dynamic(uintptr_t subject, int intervalID, char *description) { struct TelemetryRecord *record; char *temp; if (!telemetry_active) { return; } temp = malloc(strlen(description) + 1); strncpy(temp, description, strlen(description) + 1); record = newRecord(); record->recordType = DynamicString; record->threadID = subject; record->u.annotation_dynamic.intervalID = intervalID; record->u.annotation_dynamic.description = temp; } void calibrateTSC(FILE *outfile) { unsigned long long startTsc, endTsc; uint64_t startTime, endTime; startTime = uv_hrtime(); READ_TSC(startTsc) MVM_sleep(1000); endTime = uv_hrtime(); READ_TSC(endTsc) { unsigned long long ticks = endTsc - startTsc; unsigned long long wallClockTime = endTime - startTime; ticksPerSecond = (double)ticks / (double)wallClockTime; ticksPerSecond *= 1000000000.0; } } static uv_thread_t backgroundSerializationThread; static volatile int continueBackgroundSerialization = 1; void serializeTelemetryBufferRange(FILE *outfile, unsigned int serializationStart, unsigned int serializationEnd) { unsigned int i; for(i = serializationStart; i < serializationEnd; i++) { struct TelemetryRecord *record = &recordBuffer[i]; fprintf(outfile, "%10" PRIxPTR " ", record->threadID); switch(record->recordType) { case Calibration: fprintf(outfile, "Calibration: %f ticks per second\n", record->u.calibration.ticksPerSecond); break; case Epoch: fprintf(outfile, "Epoch counter: %lld\n", record->u.epoch.time); break; case TimeStamp: fprintf(outfile, "%15lld -|- \"%s\"\n", record->u.timeStamp.time - beginningEpoch, record->u.timeStamp.description); break; case IntervalStart: fprintf(outfile, "%15lld (- \"%s\" (%d)\n", record->u.interval.time - beginningEpoch, record->u.interval.description, record->u.interval.intervalID); break; case IntervalEnd: fprintf(outfile, "%15lld -) \"%s\" (%d)\n", record->u.interval.time - beginningEpoch, record->u.interval.description, record->u.interval.intervalID); break; case IntervalAnnotation: fprintf(outfile, "%15s ??? \"%s\" (%d)\n", " ", record->u.annotation.description, record->u.annotation.intervalID); break; case DynamicString: fprintf(outfile, "%15s ??? \"%s\" (%d)\n", " ", record->u.annotation_dynamic.description, record->u.annotation_dynamic.intervalID); free(record->u.annotation_dynamic.description); break; } } } void serializeTelemetryBuffer(FILE *outfile) { unsigned int serializationEnd = recordBufferIndex; unsigned int serializationStart = lastSerializedIndex; if(serializationEnd < serializationStart) { serializeTelemetryBufferRange(outfile, serializationStart, RECORD_BUFFER_SIZE); serializeTelemetryBufferRange(outfile, 0, serializationEnd); } else { serializeTelemetryBufferRange(outfile, serializationStart, serializationEnd); } lastSerializedIndex = serializationEnd; } void *backgroundSerialization(void *outfile) { while(continueBackgroundSerialization) { MVM_sleep(500); serializeTelemetryBuffer((FILE *)outfile); } fclose((FILE *)outfile); return NULL; } MVM_PUBLIC void MVM_telemetry_init(FILE *outfile) { struct TelemetryRecord *calibrationRecord; struct TelemetryRecord *epochRecord; int threadCreateError; telemetry_active = 1; calibrateTSC(outfile); calibrationRecord = newRecord(); calibrationRecord->u.calibration.ticksPerSecond = ticksPerSecond; calibrationRecord->recordType = Calibration; epochRecord = newRecord(); READ_TSC(epochRecord->u.epoch.time) epochRecord->recordType = Epoch; beginningEpoch = epochRecord->u.epoch.time; threadCreateError = uv_thread_create(&backgroundSerializationThread, (uv_thread_cb)backgroundSerialization, (void *)outfile); if (threadCreateError != 0) { telemetry_active = 0; fprintf(stderr, "MoarVM: Could not initialize telemetry: %s\n", uv_strerror(threadCreateError)); } } MVM_PUBLIC void MVM_telemetry_finish() { continueBackgroundSerialization = 0; uv_thread_join(&backgroundSerializationThread); } #else MVM_PUBLIC void MVM_telemetry_timestamp(MVMThreadContext *threadID, const char *description) { } MVM_PUBLIC unsigned int MVM_telemetry_interval_start(MVMThreadContext *threadID, const char *description) { return 0; } MVM_PUBLIC void MVM_telemetry_interval_stop(MVMThreadContext *threadID, int intervalID, const char *description) { } MVM_PUBLIC void MVM_telemetry_interval_annotate(uintptr_t subject, int intervalID, const char *description) { } MVM_PUBLIC void MVM_telemetry_interval_annotate_dynamic(uintptr_t subject, int intervalID, char *description) { } MVM_PUBLIC void MVM_telemetry_init(FILE *outfile) { } MVM_PUBLIC void MVM_telemetry_finish() { } #endif MoarVM-2018.03/src/profiler/telemeh.h0000644000175000017510000000121113237701240017402 0ustar samanthasamantha#include "stdint.h" MVM_PUBLIC void MVM_telemetry_timestamp(MVMThreadContext *threadID, const char *description); MVM_PUBLIC unsigned int MVM_telemetry_interval_start(MVMThreadContext *threadID, const char *description); MVM_PUBLIC void MVM_telemetry_interval_stop(MVMThreadContext *threadID, int intervalID, const char *description); MVM_PUBLIC void MVM_telemetry_interval_annotate(uintptr_t subject, int intervalID, const char *description); MVM_PUBLIC void MVM_telemetry_interval_annotate_dynamic(uintptr_t subject, int intervalID, char *description); MVM_PUBLIC void MVM_telemetry_init(FILE *outfile); MVM_PUBLIC void MVM_telemetry_finish(); MoarVM-2018.03/src/spesh/arg_guard.c0000644000175000017510000006051213237701240017216 0ustar samanthasamantha#include "moar.h" /* Calculates the maxium number of new nodes that might be needed to add a * guard for the specified callsite and types. (It may be less in reality * due to head sharing.) */ static size_t max_new_nodes(MVMCallsite *cs, MVMSpeshStatsType *types) { size_t needed = 2; /* One for callsite, one for result */ if (types) { MVMuint32 i; for (i = 0; i < cs->flag_count; i++) { if (cs->arg_flags[i] & MVM_CALLSITE_ARG_OBJ) { if (types[i].type) needed += 2; /* One to read arg, one to check */ if (types[i].rw_cont) needed++; if (types[i].decont_type) needed += 2; /* One to decont, one to check */ } } } return needed + 1; } /* Allocates a new set of spesh argument guards extended by the extras amount * of nodes specified. Copies the original argument guards into it. */ static MVMSpeshArgGuard * copy_and_extend(MVMThreadContext *tc, MVMSpeshArgGuard *orig, size_t extra) { size_t orig_nodes = orig ? orig->used_nodes : 0; size_t total_nodes = orig_nodes + extra; size_t node_size = total_nodes * sizeof(MVMSpeshArgGuardNode); size_t size = sizeof(MVMSpeshArgGuard) + node_size; MVMSpeshArgGuard *copy = MVM_fixed_size_alloc(tc, tc->instance->fsa, size); copy->nodes = (MVMSpeshArgGuardNode *)((char *)copy + sizeof(MVMSpeshArgGuard)); copy->used_nodes = orig_nodes; copy->num_nodes = total_nodes; if (orig_nodes) memcpy(copy->nodes, orig->nodes, orig_nodes * sizeof(MVMSpeshArgGuardNode)); return copy; } /* Locates an existing node that matches a particular callsite. If there is * no such node, adds it. */ static MVMuint32 get_callsite_node(MVMThreadContext *tc, MVMSpeshArgGuard *ag, MVMCallsite *cs) { MVMuint32 have_fixup_node = 0; MVMuint32 fixup_node; if (ag->used_nodes) { MVMuint32 current_node = 0; do { MVMSpeshArgGuardNode *agn = &(ag->nodes[current_node]); if (agn->op == MVM_SPESH_GUARD_OP_CALLSITE) { /* If it matches, we've found it. */ if (agn->cs == cs) return current_node; /* Otherwise, treat this as the working fixup node, and take * the no branch. */ fixup_node = current_node; have_fixup_node = 1; current_node = agn->no; } else { /* We only expect callsite nodes at the top level. */ MVM_panic(1, "Spesh arg guard: unexpected callsite structure in tree"); } } while (current_node != 0); } /* If we get here, we need to add a node for this callsite. */ ag->nodes[ag->used_nodes].op = MVM_SPESH_GUARD_OP_CALLSITE; ag->nodes[ag->used_nodes].cs = cs; ag->nodes[ag->used_nodes].yes = 0; ag->nodes[ag->used_nodes].no = 0; if (have_fixup_node) ag->nodes[fixup_node].no = ag->used_nodes; return ag->used_nodes++; } /* Resolves or inserts the argument load node. This is a little complex, in * that we may (though it should be quite unusual) have multiple starting * points in the argument list to consider. For example, there may be for * ($obj, $obj) specializations of (Foo, ) and (, Foo). * In that case, we tweak the previous tree(s) of other starting points so * any "no result" points to instead try the added subtree. */ static MVMuint32 get_load_node(MVMThreadContext *tc, MVMSpeshArgGuard *ag, MVMuint32 base_node, MVMuint16 arg_idx) { MVMuint16 new_no = 0; if (ag->nodes[base_node].yes) { MVMuint32 check_node = ag->nodes[base_node].yes; MVMSpeshArgGuardOp op = ag->nodes[check_node].op; if (op == MVM_SPESH_GUARD_OP_LOAD_ARG) { if (ag->nodes[check_node].arg_index == arg_idx) return check_node; MVM_panic(1, "Spesh arg guard: unimplemented sparse guard case"); } else if (op == MVM_SPESH_GUARD_OP_RESULT) { new_no = check_node; } else { MVM_panic(1, "Spesh arg guard: unexpected op %d in get_load_node", op); } } /* If we get here, need to add a new load node. */ ag->nodes[ag->used_nodes].op = MVM_SPESH_GUARD_OP_LOAD_ARG; ag->nodes[ag->used_nodes].arg_index = arg_idx; ag->nodes[ag->used_nodes].yes = 0; ag->nodes[ag->used_nodes].no = new_no; ag->nodes[base_node].yes = ag->used_nodes; return ag->used_nodes++; } /* Resolves or inserts a node for testing the curernt type loaded into the * test buffer. If it needs to insert a new node, it chains it on to the * end of the existing set of type tests. */ static MVMuint32 get_type_check_node(MVMThreadContext *tc, MVMSpeshArgGuard *ag, MVMuint32 base_node, MVMObject *type, MVMuint8 concrete) { MVMuint32 current_node = ag->nodes[base_node].yes; MVMuint32 have_fixup_node = 0; MVMuint32 fixup_node; while (current_node != 0) { MVMSpeshArgGuardNode *agn = &(ag->nodes[current_node]); if (agn->op == MVM_SPESH_GUARD_OP_STABLE_CONC) { /* If it matches, we've found it. */ if (concrete && agn->st == type->st) return current_node; /* Otherwise, treat this as the working fixup node, and take * the no branch. */ fixup_node = current_node; have_fixup_node = 1; current_node = agn->no; } else if (agn->op == MVM_SPESH_GUARD_OP_STABLE_TYPE) { /* If it matches, we've found it. */ if (!concrete && agn->st == type->st) return current_node; /* Otherwise, treat this as the working fixup node, and take * the no branch. */ fixup_node = current_node; have_fixup_node = 1; current_node = agn->no; } else { /* We only expect type matching nodes at the top level. */ MVM_panic(1, "Spesh arg guard: unexpected type structure in tree"); } } /* If we get here, we need to add a node for this callsite. */ ag->nodes[ag->used_nodes].op = concrete ? MVM_SPESH_GUARD_OP_STABLE_CONC : MVM_SPESH_GUARD_OP_STABLE_TYPE; ag->nodes[ag->used_nodes].st = type->st; ag->nodes[ag->used_nodes].yes = 0; ag->nodes[ag->used_nodes].no = 0; if (have_fixup_node) ag->nodes[fixup_node].no = ag->used_nodes; else ag->nodes[base_node].yes = ag->used_nodes; return ag->used_nodes++; } /* Resolves or inserts a guard for "is this an rw container" hanging off the * specified base node. We will always have the rw-or-not check right after * the container type check, so if there's already a "yes" branch off the base * node that is not an rw container check, we'll add the rw container check in * its place and attach the "no" branch to where it used to point. This means * we can know if there is such a node for this container type by just looking * at the "yes" branch of the base node we are passed. */ static MVMuint32 get_rw_cont_node(MVMThreadContext *tc, MVMSpeshArgGuard *ag, MVMuint32 base_node) { MVMuint32 yes_node = ag->nodes[base_node].yes; if (yes_node && ag->nodes[yes_node].op == MVM_SPESH_GUARD_OP_DEREF_RW) return yes_node; ag->nodes[ag->used_nodes].op = MVM_SPESH_GUARD_OP_DEREF_RW; ag->nodes[ag->used_nodes].offset = 0; /* TODO populate this properly */ ag->nodes[ag->used_nodes].yes = 0; ag->nodes[ag->used_nodes].no = yes_node; ag->nodes[base_node].yes = ag->used_nodes; return ag->used_nodes++; } /* Resolves or inserts a guard op that decontainerizes the current test * register content. We only do this once before a possible chain of nodes * that test the decontainerized type. Therefore, we can expect that such a * node is already in the tree at this point, *or* that there is an RW * guard node and *then* the one we're looking for. */ static MVMuint32 get_decont_node(MVMThreadContext *tc, MVMSpeshArgGuard *ag, MVMuint32 base_node) { MVMuint32 check_node = ag->nodes[base_node].yes; MVMuint32 update_no_node = 0; if (check_node) { if (ag->nodes[check_node].op == MVM_SPESH_GUARD_OP_DEREF_VALUE) { return check_node; } else if (ag->nodes[check_node].op == MVM_SPESH_GUARD_OP_DEREF_RW) { MVMuint32 no_node = ag->nodes[check_node].no; if (no_node) { if (ag->nodes[no_node].op == MVM_SPESH_GUARD_OP_DEREF_VALUE) return no_node; } else { update_no_node = check_node; } } if (!update_no_node) MVM_panic(1, "Spesh arg guard: unexpected tree structure adding deref value"); } ag->nodes[ag->used_nodes].op = MVM_SPESH_GUARD_OP_DEREF_VALUE; ag->nodes[ag->used_nodes].offset = 0; /* TODO populate this properly */ ag->nodes[ag->used_nodes].yes = 0; ag->nodes[ag->used_nodes].no = 0; if (update_no_node) ag->nodes[update_no_node].no = ag->used_nodes; else ag->nodes[base_node].yes = ag->used_nodes; return ag->used_nodes++; } /* Resolves or inserts guards for the specified type information, rooted off * the given node. */ static MVMuint32 get_type_node(MVMThreadContext *tc, MVMSpeshArgGuard *ag, MVMuint32 base_node, MVMSpeshStatsType *type, MVMuint16 arg_idx) { MVMuint32 current_node = get_load_node(tc, ag, base_node, arg_idx); current_node = get_type_check_node(tc, ag, current_node, type->type, type->type_concrete); if (type->rw_cont) current_node = get_rw_cont_node(tc, ag, current_node); if (type->decont_type) { current_node = get_decont_node(tc, ag, current_node); current_node = get_type_check_node(tc, ag, current_node, type->decont_type, type->decont_type_concrete); } return current_node; } /* Inserts a guard for the specified types into the tree. */ static MVMint32 try_add_guard(MVMThreadContext *tc, MVMSpeshArgGuard *ag, MVMCallsite *cs, MVMSpeshStatsType *types, MVMuint32 candidate) { MVMuint32 current_node = get_callsite_node(tc, ag, cs); if (types) { /* We're adding a type-based result, and thus for a speculative * specialization. Certain specializations come ahead of those, and * hang off the callsite node; skip over any such node. */ MVMuint16 arg_idx = 0; MVMuint16 i; if (ag->nodes[ag->nodes[current_node].yes].op == MVM_SPESH_GUARD_OP_CERTAIN_RESULT) current_node = ag->nodes[current_node].yes; for (i = 0; i < cs->flag_count; i++) { if (cs->arg_flags[i] & MVM_CALLSITE_ARG_NAMED) arg_idx++; /* Skip over name */ if (cs->arg_flags[i] & MVM_CALLSITE_ARG_OBJ) { MVMSpeshStatsType *type = &(types[i]); if (type->type) current_node = get_type_node(tc, ag, current_node, type, arg_idx); } arg_idx++; } if (ag->nodes[current_node].yes) return 0; ag->nodes[ag->used_nodes].op = MVM_SPESH_GUARD_OP_RESULT; ag->nodes[ag->used_nodes].yes = 0; ag->nodes[ag->used_nodes].no = 0; } else { /* We're adding a certain result. If there already is such a node, we * already have that specialization. Otherwise, we need to insert it * and redirect the current_node's .yes to point to it, and it to * point to whatever current_node's .yes used to point to (so it goes * in ahead of type guards etc.). */ if (ag->nodes[ag->nodes[current_node].yes].op == MVM_SPESH_GUARD_OP_CERTAIN_RESULT) return 0; ag->nodes[ag->used_nodes].op = MVM_SPESH_GUARD_OP_CERTAIN_RESULT; ag->nodes[ag->used_nodes].yes = ag->nodes[current_node].yes; ag->nodes[ag->used_nodes].no = 0; } ag->nodes[ag->used_nodes].result = candidate; ag->nodes[current_node].yes = ag->used_nodes++; return 1; } /* Takes a pointer to a guard set. Replaces it with a guard set that also * includes a guard for the specified type tuple (passed with callsite to * know how many types are involved), and resolving to the specified spesh * candidate index. Any previous guard set will be scheduled for freeing at * the next safepoint. */ void MVM_spesh_arg_guard_add(MVMThreadContext *tc, MVMSpeshArgGuard **orig, MVMCallsite *cs, MVMSpeshStatsType *types, MVMuint32 candidate) { MVMSpeshArgGuard *new_guard = copy_and_extend(tc, *orig, max_new_nodes(cs, types)); if (!try_add_guard(tc, new_guard, cs, types, candidate)) MVM_panic(1, "Spesh arg guard: trying to add duplicate result for same guard"); if (*orig) { MVMSpeshArgGuard *prev = *orig; *orig = new_guard; MVM_spesh_arg_guard_destroy(tc, prev, 1); } else { *orig = new_guard; } } /* Checks if we already have a guard that precisely matches the specified * pair of callsite and type tuple. This is a more exact check that "would * the guard match", since a less precise specialization would match if we * just ran the guard tree against the arguments. This answers the question of * "if I added this, would it collide with an existing entry" instead. */ MVMint32 MVM_spesh_arg_guard_exists(MVMThreadContext *tc, MVMSpeshArgGuard *ag, MVMCallsite *cs, MVMSpeshStatsType *types) { MVMSpeshArgGuard *try_guard = copy_and_extend(tc, ag, max_new_nodes(cs, types)); MVMint32 exists = !try_add_guard(tc, try_guard, cs, types, 0); MVM_spesh_arg_guard_destroy(tc, try_guard, 0); return exists; } /* Runs the guard against a type tuple, which is used primarily for detecting * if an existing specialization already exists. Returns the index of that * specialization, or -1 if there is no match. */ MVMint32 MVM_spesh_arg_guard_run_types(MVMThreadContext *tc, MVMSpeshArgGuard *ag, MVMCallsite *cs, MVMSpeshStatsType *types) { MVMuint32 current_node = 0; MVMSpeshStatsType *test = NULL; MVMuint32 use_decont_type = 0; MVMint32 current_result = -1; if (!ag) return -1; do { MVMSpeshArgGuardNode *agn = &(ag->nodes[current_node]); switch (agn->op) { case MVM_SPESH_GUARD_OP_CALLSITE: current_node = agn->cs == cs ? agn->yes : agn->no; break; case MVM_SPESH_GUARD_OP_LOAD_ARG: { test = &(types[agn->arg_index < cs->num_pos ? agn->arg_index : cs->num_pos + (((agn->arg_index - 1) - cs->num_pos) / 2)]); use_decont_type = 0; current_node = agn->yes; break; case MVM_SPESH_GUARD_OP_STABLE_CONC: if (use_decont_type) current_node = test->decont_type_concrete && test->decont_type && test->decont_type->st == agn->st ? agn->yes : agn->no; else current_node = test->type_concrete && test->type && test->type->st == agn->st ? agn->yes : agn->no; break; case MVM_SPESH_GUARD_OP_STABLE_TYPE: if (use_decont_type) current_node = !test->decont_type_concrete && test->decont_type && test->decont_type->st == agn->st ? agn->yes : agn->no; else current_node = !test->type_concrete && test->type && test->type->st == agn->st ? agn->yes : agn->no; break; case MVM_SPESH_GUARD_OP_DEREF_VALUE: if (test->decont_type) { use_decont_type = 1; current_node = agn->yes; } else { current_node = agn->no; } break; } case MVM_SPESH_GUARD_OP_DEREF_RW: current_node = test->rw_cont ? agn->yes : agn->no; break; case MVM_SPESH_GUARD_OP_CERTAIN_RESULT: current_result = agn->result; current_node = agn->yes; break; case MVM_SPESH_GUARD_OP_RESULT: return agn->result; } } while (current_node != 0); return current_result; } /* Evaluates the argument guards. Returns >= 0 if there is a matching spesh * candidate, or -1 if there is not. */ MVMint32 MVM_spesh_arg_guard_run(MVMThreadContext *tc, MVMSpeshArgGuard *ag, MVMCallsite *cs, MVMRegister *args, MVMint32 *certain) { MVMuint32 current_node = 0; MVMObject *test = NULL; MVMint32 current_result = -1; if (!ag) return -1; do { MVMSpeshArgGuardNode *agn = &(ag->nodes[current_node]); switch (agn->op) { case MVM_SPESH_GUARD_OP_CALLSITE: current_node = agn->cs == cs ? agn->yes : agn->no; break; case MVM_SPESH_GUARD_OP_LOAD_ARG: test = args[agn->arg_index].o; current_node = agn->yes; break; case MVM_SPESH_GUARD_OP_STABLE_CONC: current_node = IS_CONCRETE(test) && test->st == agn->st ? agn->yes : agn->no; break; case MVM_SPESH_GUARD_OP_STABLE_TYPE: current_node = !IS_CONCRETE(test) && test->st == agn->st ? agn->yes : agn->no; break; case MVM_SPESH_GUARD_OP_DEREF_VALUE: { /* TODO Use offset approach later to avoid these calls. */ MVMRegister dc; test->st->container_spec->fetch(tc, test, &dc); test = dc.o; current_node = test ? agn->yes : agn->no; break; } case MVM_SPESH_GUARD_OP_DEREF_RW: /* TODO Use offset approach later to avoid these calls. */ current_node = STABLE(test)->container_spec->can_store(tc, test) ? agn->yes : agn->no; break; case MVM_SPESH_GUARD_OP_CERTAIN_RESULT: current_result = agn->result; if (certain) *certain = agn->result; current_node = agn->yes; break; case MVM_SPESH_GUARD_OP_RESULT: return agn->result; } } while (current_node != 0); return current_result; } /* Runs the guards using call information gathered by the optimizer. This is * used for finding existing candidates to emit fast calls to or inline. */ MVMint32 MVM_spesh_arg_guard_run_callinfo(MVMThreadContext *tc, MVMSpeshArgGuard *ag, MVMSpeshCallInfo *arg_info) { MVMuint32 current_node = 0; MVMSpeshFacts *facts = NULL; MVMuint8 use_decont_facts = 0; MVMint32 current_result = -1; if (!ag) return -1; do { MVMSpeshArgGuardNode *agn = &(ag->nodes[current_node]); switch (agn->op) { case MVM_SPESH_GUARD_OP_CALLSITE: current_node = agn->cs == arg_info->cs ? agn->yes : agn->no; break; case MVM_SPESH_GUARD_OP_LOAD_ARG: if (agn->arg_index >= MAX_ARGS_FOR_OPT) return -1; facts = arg_info->arg_facts[agn->arg_index]; use_decont_facts = 0; current_node = agn->yes; break; case MVM_SPESH_GUARD_OP_STABLE_CONC: if (use_decont_facts) { current_node = facts->flags & MVM_SPESH_FACT_DECONT_CONCRETE && facts->flags & MVM_SPESH_FACT_KNOWN_DECONT_TYPE && facts->decont_type->st == agn->st ? agn->yes : agn->no; } else { current_node = facts->flags & MVM_SPESH_FACT_CONCRETE && facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && facts->type->st == agn->st ? agn->yes : agn->no; } break; case MVM_SPESH_GUARD_OP_STABLE_TYPE: if (use_decont_facts) { current_node = facts->flags & MVM_SPESH_FACT_DECONT_TYPEOBJ && facts->flags & MVM_SPESH_FACT_KNOWN_DECONT_TYPE && facts->decont_type->st == agn->st ? agn->yes : agn->no; } else { current_node = facts->flags & MVM_SPESH_FACT_TYPEOBJ && facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && facts->type->st == agn->st ? agn->yes : agn->no; } break; case MVM_SPESH_GUARD_OP_DEREF_VALUE: { if (facts->flags & MVM_SPESH_FACT_KNOWN_DECONT_TYPE) { use_decont_facts = 1; current_node = agn->yes; } else { current_node = agn->no; } break; } case MVM_SPESH_GUARD_OP_DEREF_RW: current_node = facts->flags & MVM_SPESH_FACT_RW_CONT ? agn->yes : agn->no; break; case MVM_SPESH_GUARD_OP_CERTAIN_RESULT: current_result = agn->result; current_node = agn->yes; break; case MVM_SPESH_GUARD_OP_RESULT: return agn->result; } } while (current_node != 0); return current_result; } /* Marks any objects held by an argument guard. */ void MVM_spesh_arg_guard_gc_mark(MVMThreadContext *tc, MVMSpeshArgGuard *ag, MVMGCWorklist *worklist) { if (ag) { MVMuint32 i; for (i = 0; i < ag->used_nodes; i++) { switch (ag->nodes[i].op) { case MVM_SPESH_GUARD_OP_STABLE_CONC: case MVM_SPESH_GUARD_OP_STABLE_TYPE: MVM_gc_worklist_add(tc, worklist, &(ag->nodes[i].st)); break; } } } } void MVM_spesh_arg_guard_gc_describe(MVMThreadContext *tc, MVMHeapSnapshotState *ss, MVMSpeshArgGuard *ag) { if (ag) { MVMuint32 i; for (i = 0; i < ag->used_nodes; i++) { switch (ag->nodes[i].op) { case MVM_SPESH_GUARD_OP_STABLE_CONC: case MVM_SPESH_GUARD_OP_STABLE_TYPE: MVM_profile_heap_add_collectable_rel_idx(tc, ss, (MVMCollectable*)(ag->nodes[i].st), i); break; } } } } /* Frees the memory associated with an argument guard. If `safe` is set to a * non-zero value then the memory is freed at the next safepoint. If it is set * to zero, the memory is freed immediately. */ void MVM_spesh_arg_guard_destroy(MVMThreadContext *tc, MVMSpeshArgGuard *ag, MVMuint32 safe) { if (ag) { size_t total_size = sizeof(MVMSpeshArgGuard) + ag->num_nodes * sizeof(MVMSpeshArgGuardNode); if (safe) MVM_fixed_size_free_at_safepoint(tc, tc->instance->fsa, total_size, ag); else MVM_fixed_size_free(tc, tc->instance->fsa, total_size, ag); } } /* Discards an arg guard held on a static frame, if any, NULLing it out so the * candidates will no longer be reachable. */ void MVM_spesh_arg_guard_discard(MVMThreadContext *tc, MVMStaticFrame *sf) { MVMStaticFrameSpesh *spesh = sf->body.spesh; if (spesh && spesh->body.spesh_arg_guard) { MVM_spesh_arg_guard_destroy(tc, spesh->body.spesh_arg_guard, 1); spesh->body.spesh_arg_guard = NULL; } } MoarVM-2018.03/src/spesh/arg_guard.h0000644000175000017510000001027113237701240017220 0ustar samanthasamantha/* Specializations are selected using argument guards. These are arranged in * a tree, which is walked by a small interpreter. In the future, it may also * be compiled into machine code. */ struct MVMSpeshArgGuard { /* The nodes making up the guard. */ MVMSpeshArgGuardNode *nodes; /* How many nodes we have. */ MVMuint32 num_nodes; /* How many nodes are actually used. */ MVMuint32 used_nodes; }; /* Operations we may perform when evaluating a guard. */ typedef enum { /* Check if the callsite matches. */ MVM_SPESH_GUARD_OP_CALLSITE, /* Load an arg from the args buffer into the test register. Always takes * "yes" branch. */ MVM_SPESH_GUARD_OP_LOAD_ARG, /* Tests if the test register value matches the specified STable and is * a concrete value. */ MVM_SPESH_GUARD_OP_STABLE_CONC, /* Tests if the test register value matches the specified STable and is * a type object. */ MVM_SPESH_GUARD_OP_STABLE_TYPE, /* Dereferences the value at the specified offset into the current contents * of the test register and puts that value into the test register. Takes * the no branch if it is NULL and the yes branch otherwise. (Used for * a decont of a container value.) */ MVM_SPESH_GUARD_OP_DEREF_VALUE, /* Dereferences the 64-bit integer value offset into the current contents * of the test register. Takes the no branch if it's zero and the yes * branch otherwise. Does *not* update the test register. (Used for a * rw-ness test of a container.) */ MVM_SPESH_GUARD_OP_DEREF_RW, /* Indicates a certain specialization that can be used as a result, should * a better one not be reached by further evaluation of the tree. This is * used to put certain specializations up front rather than having to * replicate them throughout the tree; it also means there will be a way * in the future to get both certain and speculative specializations out * of the arg guard tree, which would be useful in that we could deopt into * the latter rather than falling back to the interpreter. Always follows * the "yes" branch if there is one. */ MVM_SPESH_GUARD_OP_CERTAIN_RESULT, /* Selects a specialization, if this node is reached. Ignores yes/no; * terminates execution of the guard check. */ MVM_SPESH_GUARD_OP_RESULT } MVMSpeshArgGuardOp; /* A node in the guard tree. */ struct MVMSpeshArgGuardNode { /* The operation. */ MVMSpeshArgGuardOp op; /* Where to go on match of the guard or no match. These are indexes into * the guard tree node array. A "no" value of zero indicates that there * are no more options, and the match should be termianted without a * result. */ MVMuint16 yes; MVMuint16 no; /* Data for the operation; union discriminated by op. */ union { /* Used by CALLSITE */ MVMCallsite *cs; /* Used by LOAD_ARG */ MVMuint16 arg_index; /* Used by STABLE_CONC, STABLE_TYPE */ MVMSTable *st; /* Used by DEREF_VALUE and DEREF_RW. */ MVMuint32 offset; /* Used by RESULT. */ MVMuint32 result; }; }; void MVM_spesh_arg_guard_add(MVMThreadContext *tc, MVMSpeshArgGuard **orig, MVMCallsite *cs, MVMSpeshStatsType *types, MVMuint32 candidate); MVMint32 MVM_spesh_arg_guard_exists(MVMThreadContext *tc, MVMSpeshArgGuard *ag, MVMCallsite *cs, MVMSpeshStatsType *types); MVMint32 MVM_spesh_arg_guard_run_types(MVMThreadContext *tc, MVMSpeshArgGuard *ag, MVMCallsite *cs, MVMSpeshStatsType *types); MVMint32 MVM_spesh_arg_guard_run(MVMThreadContext *tc, MVMSpeshArgGuard *ag, MVMCallsite *cs, MVMRegister *args, MVMint32 *certain); MVMint32 MVM_spesh_arg_guard_run_callinfo(MVMThreadContext *tc, MVMSpeshArgGuard *ag, MVMSpeshCallInfo *info); void MVM_spesh_arg_guard_gc_mark(MVMThreadContext *tc, MVMSpeshArgGuard *ag, MVMGCWorklist *worklist); void MVM_spesh_arg_guard_gc_describe(MVMThreadContext *tc, MVMHeapSnapshotState *ss, MVMSpeshArgGuard *ag); void MVM_spesh_arg_guard_destroy(MVMThreadContext *tc, MVMSpeshArgGuard *ag, MVMuint32 safe); void MVM_spesh_arg_guard_discard(MVMThreadContext *tc, MVMStaticFrame *sf); MoarVM-2018.03/src/spesh/args.c0000644000175000017510000011163013237701240016215 0ustar samanthasamantha#include "moar.h" /* Maximum number of positional args we'll consider for optimization purposes. */ #define MAX_POS_ARGS 8 /* Maximum number of named args we'll consider for optimization purposes. */ #define MAX_NAMED_ARGS 8 /* Adds facts for an object arg. */ static void add_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMint32 slot, MVMSpeshStatsType type_tuple_entry, MVMSpeshIns *arg_ins) { /* Add appropriate facts from the arg type tuple. */ MVMint16 orig = arg_ins->operands[0].reg.orig; MVMint16 i = arg_ins->operands[0].reg.i; MVMObject *type = type_tuple_entry.type; g->facts[orig][i].type = type; g->facts[orig][i].flags |= MVM_SPESH_FACT_KNOWN_TYPE; if (type_tuple_entry.type_concrete) { g->facts[orig][i].flags |= MVM_SPESH_FACT_CONCRETE; if (!type->st->container_spec) g->facts[orig][i].flags |= MVM_SPESH_FACT_DECONTED; } else { g->facts[orig][i].flags |= MVM_SPESH_FACT_TYPEOBJ | MVM_SPESH_FACT_DECONTED; } /* Add any decontainerized type info. */ if (type_tuple_entry.decont_type) { g->facts[orig][i].decont_type = type_tuple_entry.decont_type; g->facts[orig][i].flags |= MVM_SPESH_FACT_KNOWN_DECONT_TYPE; if (type_tuple_entry.decont_type_concrete) g->facts[orig][i].flags |= MVM_SPESH_FACT_DECONT_CONCRETE; else g->facts[orig][i].flags |= MVM_SPESH_FACT_DECONT_TYPEOBJ; if (type_tuple_entry.rw_cont) g->facts[orig][i].flags |= MVM_SPESH_FACT_RW_CONT; } } /* Handles a pos arg that needs unboxing. */ static void pos_unbox(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins, const MVMOpInfo *unbox_op) { MVMSpeshOperand temp = MVM_spesh_manipulate_get_temp_reg(tc, g, MVM_reg_obj); MVMSpeshIns *unbox = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); unbox->info = unbox_op; unbox->operands = MVM_spesh_alloc(tc, g, 2 * sizeof(MVMSpeshOperand)); unbox->operands[0] = ins->operands[0]; unbox->operands[1] = temp; ins->info = MVM_op_get_op(MVM_OP_sp_getarg_o); ins->operands[0] = temp; MVM_spesh_manipulate_insert_ins(tc, bb, ins, unbox); MVM_spesh_manipulate_release_temp_reg(tc, g, temp); } /* Handles a pos arg that needs boxing. */ static void pos_box(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins, const MVMOpInfo *hlltype_op, const MVMOpInfo *box_op, const MVMOpInfo *arg_op, MVMuint8 kind) { MVMSpeshOperand temp_bt, temp_arg; MVMSpeshIns *hlltype, *box; /* Add HLL type op. */ temp_bt = MVM_spesh_manipulate_get_temp_reg(tc, g, MVM_reg_obj); hlltype = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); hlltype->info = hlltype_op; hlltype->operands = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshOperand)); hlltype->operands[0] = temp_bt; MVM_spesh_manipulate_insert_ins(tc, bb, ins, hlltype); /* Add box op. */ temp_arg = MVM_spesh_manipulate_get_temp_reg(tc, g, kind); box = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); box->info = box_op; box->operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand)); box->operands[0] = ins->operands[0]; box->operands[1] = temp_arg; box->operands[2] = temp_bt; MVM_spesh_manipulate_insert_ins(tc, bb, hlltype, box); /* Update instruction to receive unboxed arg. */ ins->info = arg_op; ins->operands[0] = temp_arg; /* Release temporary registers. */ MVM_spesh_manipulate_release_temp_reg(tc, g, temp_bt); MVM_spesh_manipulate_release_temp_reg(tc, g, temp_arg); } /* Gets the primitive boxed by a type. */ static MVMuint16 prim_spec(MVMThreadContext *tc, MVMSpeshStatsType *type_tuple, MVMint32 i) { MVMObject *type = type_tuple ? type_tuple[i].type : NULL; return type ? REPR(type)->get_storage_spec(tc, STABLE(type))->boxed_primitive : 0; } /* Puts a single named argument into a slurpy hash, boxing if needed. */ static void slurp_named_arg(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *hash_ins, MVMint32 named_idx) { MVMSpeshIns *key_ins; /* Look up arg flags and name, and compute index. */ MVMCallsiteFlags flags = g->cs->arg_flags[g->cs->num_pos + named_idx]; MVMString *name = g->cs->arg_names[named_idx]; MVMuint16 arg_idx = g->cs->num_pos + 2 * named_idx + 1; /* Allocate temporary registers for the key and value. */ MVMSpeshOperand key_temp = MVM_spesh_manipulate_get_temp_reg(tc, g, MVM_reg_str); MVMSpeshOperand value_temp = MVM_spesh_manipulate_get_temp_reg(tc, g, MVM_reg_obj); /* Insert bind key instruction after slurpy hash creation instruction (we * do it first as below we prepend instructions to obtain the key and the * value. */ MVMSpeshIns *bindkey_ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); bindkey_ins->info = MVM_op_get_op(MVM_OP_bindkey_o); bindkey_ins->operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand)); bindkey_ins->operands[0] = hash_ins->operands[0]; bindkey_ins->operands[1] = key_temp; bindkey_ins->operands[2] = value_temp; MVM_spesh_manipulate_insert_ins(tc, bb, hash_ins, bindkey_ins); /* Instruction to get value depends on argument type. */ if ((flags & MVM_CALLSITE_ARG_MASK) == MVM_CALLSITE_ARG_OBJ) { /* It's already a boxed object, so just fetch it into the value * register. */ MVMSpeshIns *fetch_ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); fetch_ins->info = MVM_op_get_op(MVM_OP_sp_getarg_o); fetch_ins->operands = MVM_spesh_alloc(tc, g, 2 * sizeof(MVMSpeshOperand)); fetch_ins->operands[0] = value_temp; fetch_ins->operands[1].lit_ui16 = arg_idx; MVM_spesh_manipulate_insert_ins(tc, bb, hash_ins, fetch_ins); } else { MVMSpeshIns *box_ins, *hlltype_ins, *fetch_ins; /* We need to box it. Get a temporary register to box into. To * only use one extra register, we will re-use the temp value * one to load the box type into, and only add a temporary for. */ MVMSpeshOperand unboxed_temp; MVMuint16 box_op; MVMuint16 hlltype_op; MVMuint16 fetch_op; switch (flags & MVM_CALLSITE_ARG_MASK) { case MVM_CALLSITE_ARG_INT: unboxed_temp = MVM_spesh_manipulate_get_temp_reg(tc, g, MVM_reg_int64); box_op = MVM_OP_box_i; hlltype_op = MVM_OP_hllboxtype_i; fetch_op = MVM_OP_sp_getarg_i; break; case MVM_CALLSITE_ARG_NUM: unboxed_temp = MVM_spesh_manipulate_get_temp_reg(tc, g, MVM_reg_num64); box_op = MVM_OP_box_n; hlltype_op = MVM_OP_hllboxtype_n; fetch_op = MVM_OP_sp_getarg_n; break; case MVM_CALLSITE_ARG_STR: unboxed_temp = MVM_spesh_manipulate_get_temp_reg(tc, g, MVM_reg_str); box_op = MVM_OP_box_s; hlltype_op = MVM_OP_hllboxtype_s; fetch_op = MVM_OP_sp_getarg_s; break; default: MVM_panic(1, "Spesh args: unexpected named argument type %d", flags); } /* Emit instruction to box value. */ box_ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); box_ins->info = MVM_op_get_op(box_op); box_ins->operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand)); box_ins->operands[0] = value_temp; box_ins->operands[1] = unboxed_temp; box_ins->operands[2] = value_temp; MVM_spesh_manipulate_insert_ins(tc, bb, hash_ins, box_ins); /* Prepend the instruction get box type. */ hlltype_ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); hlltype_ins->info = MVM_op_get_op(hlltype_op); hlltype_ins->operands = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshOperand)); hlltype_ins->operands[0] = value_temp; MVM_spesh_manipulate_insert_ins(tc, bb, hash_ins, hlltype_ins); /* Prepend fetch instruction. */ fetch_ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); fetch_ins->info = MVM_op_get_op(fetch_op); fetch_ins->operands = MVM_spesh_alloc(tc, g, 2 * sizeof(MVMSpeshOperand)); fetch_ins->operands[0] = unboxed_temp; fetch_ins->operands[1].lit_ui16 = arg_idx; MVM_spesh_manipulate_insert_ins(tc, bb, hash_ins, fetch_ins); /* Can release the temporary register now. */ MVM_spesh_manipulate_release_temp_reg(tc, g, unboxed_temp); } /* Insert key fetching instruciton; we just store the string in a spesh * slot. */ key_ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); key_ins->info = MVM_op_get_op(MVM_OP_sp_getspeshslot); key_ins->operands = MVM_spesh_alloc(tc, g, 2 * sizeof(MVMSpeshOperand)); key_ins->operands[0] = key_temp; key_ins->operands[1].lit_i16 = MVM_spesh_add_spesh_slot(tc, g, (MVMCollectable *)name); MVM_spesh_manipulate_insert_ins(tc, bb, hash_ins, key_ins); /* Release temporary registers after. */ MVM_spesh_manipulate_release_temp_reg(tc, g, key_temp); MVM_spesh_manipulate_release_temp_reg(tc, g, value_temp); } /* Takes information about the incoming callsite and arguments, and performs * various optimizations based on that information. */ void MVM_spesh_args(MVMThreadContext *tc, MVMSpeshGraph *g, MVMCallsite *cs, MVMSpeshStatsType *type_tuple) { /* We need to identify the various arg-related instructions in the graph, * then manipulate them as a whole. */ MVMSpeshIns *checkarity_ins = NULL; MVMSpeshBB *checkarity_bb = NULL; MVMSpeshIns *paramnamesused_ins = NULL; MVMSpeshBB *paramnamesused_bb = NULL; MVMSpeshIns *param_sn_ins = NULL; MVMSpeshBB *param_sn_bb = NULL; MVMSpeshIns **pos_ins = MVM_calloc(MAX_POS_ARGS, sizeof(MVMSpeshIns *)); MVMSpeshBB **pos_bb = MVM_calloc(MAX_POS_ARGS, sizeof(MVMSpeshBB *)); MVMuint8 *pos_added = MVM_calloc(MAX_POS_ARGS, sizeof(MVMuint8)); MVMSpeshIns **named_ins = MVM_calloc(MAX_NAMED_ARGS, sizeof(MVMSpeshIns *)); MVMSpeshBB **named_bb = MVM_calloc(MAX_NAMED_ARGS, sizeof(MVMSpeshBB *)); MVMint32 req_max = -1; MVMint32 opt_min = -1; MVMint32 opt_max = -1; MVMint32 num_named = 0; MVMint32 named_used = 0; MVMint32 named_passed = (cs->arg_count - cs->num_pos) / 2; MVMint32 cs_flags = cs->num_pos + named_passed; MVMint32 cur_ins = 0; /* We use a bit field to track named argument use; on deopt we will put it * into the deoptimized frame. */ MVMuint64 named_used_bit_field = 0; MVMSpeshBB *bb = g->entry; g->cs = cs; /* Walk through the graph, looking for arg related instructions. */ while (bb) { MVMSpeshIns *ins = bb->first_ins; while (ins) { switch (ins->info->opcode) { case MVM_OP_checkarity: if (checkarity_ins) goto cleanup; /* Dupe; weird; bail out! */ checkarity_ins = ins; checkarity_bb = bb; break; case MVM_OP_param_rp_i: case MVM_OP_param_rp_n: case MVM_OP_param_rp_s: case MVM_OP_param_rp_o: { /* Required positional. */ MVMint16 idx = ins->operands[1].lit_i16; if (idx < 0 || idx >= MAX_POS_ARGS) goto cleanup; if (pos_ins[idx]) /* Dupe; weird. */ goto cleanup; pos_ins[idx] = ins; pos_bb[idx] = bb; if (idx > req_max) req_max = idx; break; } case MVM_OP_param_op_i: case MVM_OP_param_op_n: case MVM_OP_param_op_s: case MVM_OP_param_op_o: { /* Optional Positional int/num/string/object */ MVMint16 idx = ins->operands[1].lit_i16; if (idx < 0 || idx >= MAX_POS_ARGS) goto cleanup; if (pos_ins[idx]) /* Dupe; weird. */ goto cleanup; pos_ins[idx] = ins; pos_bb[idx] = bb; if (idx > opt_max) opt_max = idx; if (opt_min == -1 || idx < opt_min) opt_min = idx; break; } case MVM_OP_param_on_i: case MVM_OP_param_on_n: case MVM_OP_param_on_s: case MVM_OP_param_on_o: case MVM_OP_param_rn_i: case MVM_OP_param_rn_n: case MVM_OP_param_rn_s: case MVM_OP_param_rn_o: /* Named (optional or required). */ if (num_named == MAX_NAMED_ARGS) goto cleanup; named_ins[num_named] = ins; named_bb[num_named] = bb; num_named++; break; case MVM_OP_param_sp: break; case MVM_OP_param_sn: param_sn_ins = ins; param_sn_bb = bb; break; case MVM_OP_usecapture: case MVM_OP_savecapture: /* Require full args processing context for now; bail. */ goto cleanup; case MVM_OP_paramnamesused: if (paramnamesused_ins) goto cleanup; /* Dupe; weird; bail out! */ paramnamesused_ins = ins; paramnamesused_bb = bb; break; case MVM_OP_param_rn2_i: case MVM_OP_param_rn2_n: case MVM_OP_param_rn2_s: case MVM_OP_param_rn2_o: case MVM_OP_param_on2_i: case MVM_OP_param_on2_n: case MVM_OP_param_on2_s: case MVM_OP_param_on2_o: case MVM_OP_param_rp_u: case MVM_OP_param_op_u: case MVM_OP_param_rn_u: case MVM_OP_param_on_u: case MVM_OP_param_rn2_u: case MVM_OP_param_on2_u: /* Don't understand how to specialize these yet. */ goto cleanup; default: break; } cur_ins++; ins = ins->next; } bb = bb->linear_next; } /* If we didn't find a checkarity instruction, bail. */ if (!checkarity_ins) goto cleanup; /* If required and optional aren't contiguous, bail. */ if (opt_min >= 0 && req_max + 1 != opt_min) goto cleanup; /* If the number of passed args is in range... */ if (cs->num_pos >= req_max + 1 && (opt_max < 0 || cs->num_pos <= opt_max + 1)) { /* Ensure we've got all the arg fetch instructions we need, and that * types match or it's a box/unbox. */ MVMint32 i; for (i = 0; i < cs->num_pos; i++) { MVMCallsiteEntry arg_flag = cs->arg_flags[i]; if (!pos_ins[i]) goto cleanup; switch (pos_ins[i]->info->opcode) { case MVM_OP_param_rp_i: case MVM_OP_param_op_i: if (arg_flag != MVM_CALLSITE_ARG_INT) if (arg_flag != MVM_CALLSITE_ARG_OBJ || prim_spec(tc, type_tuple, i) != MVM_STORAGE_SPEC_BP_INT) goto cleanup; break; case MVM_OP_param_rp_n: case MVM_OP_param_op_n: if (arg_flag != MVM_CALLSITE_ARG_NUM) if (arg_flag != MVM_CALLSITE_ARG_OBJ || prim_spec(tc, type_tuple, i) != MVM_STORAGE_SPEC_BP_NUM) goto cleanup; break; case MVM_OP_param_rp_s: case MVM_OP_param_op_s: if (arg_flag != MVM_CALLSITE_ARG_STR) if (arg_flag != MVM_CALLSITE_ARG_OBJ || prim_spec(tc, type_tuple, i) != MVM_STORAGE_SPEC_BP_STR) goto cleanup; break; case MVM_OP_param_rp_o: case MVM_OP_param_op_o: if (arg_flag != MVM_CALLSITE_ARG_OBJ && arg_flag != MVM_CALLSITE_ARG_INT && arg_flag != MVM_CALLSITE_ARG_NUM && arg_flag != MVM_CALLSITE_ARG_STR) goto cleanup; break; default: break; } } /* We can optimize. Toss checkarity. */ MVM_spesh_manipulate_delete_ins(tc, g, checkarity_bb, checkarity_ins); /* Re-write the passed required positionals to spesh ops, and add any * facts. */ for (i = 0; i < cs->num_pos; i++) { MVMCallsiteEntry arg_flag = cs->arg_flags[i]; switch (pos_ins[i]->info->opcode) { case MVM_OP_param_rp_i: case MVM_OP_param_op_i: if (arg_flag == MVM_CALLSITE_ARG_INT) { pos_ins[i]->info = MVM_op_get_op(MVM_OP_sp_getarg_i); } else { pos_unbox(tc, g, pos_bb[i], pos_ins[i], MVM_op_get_op(MVM_OP_unbox_i)); pos_added[i]++; if (type_tuple && type_tuple[i].type) add_facts(tc, g, i, type_tuple[i], pos_ins[i]); } break; case MVM_OP_param_rp_n: case MVM_OP_param_op_n: if (arg_flag == MVM_CALLSITE_ARG_NUM) { pos_ins[i]->info = MVM_op_get_op(MVM_OP_sp_getarg_n); } else { pos_unbox(tc, g, pos_bb[i], pos_ins[i], MVM_op_get_op(MVM_OP_unbox_n)); pos_added[i]++; if (type_tuple && type_tuple[i].type) add_facts(tc, g, i, type_tuple[i], pos_ins[i]); } break; case MVM_OP_param_rp_s: case MVM_OP_param_op_s: if (arg_flag == MVM_CALLSITE_ARG_STR) { pos_ins[i]->info = MVM_op_get_op(MVM_OP_sp_getarg_s); } else { pos_unbox(tc, g, pos_bb[i], pos_ins[i], MVM_op_get_op(MVM_OP_unbox_s)); pos_added[i]++; if (type_tuple && type_tuple[i].type) add_facts(tc, g, i, type_tuple[i], pos_ins[i]); } break; case MVM_OP_param_rp_o: case MVM_OP_param_op_o: if (arg_flag == MVM_CALLSITE_ARG_OBJ) { pos_ins[i]->info = MVM_op_get_op(MVM_OP_sp_getarg_o); if (type_tuple && type_tuple[i].type) { add_facts(tc, g, i, type_tuple[i], pos_ins[i]); if (i == 0) g->specialized_on_invocant = 1; } } else if (arg_flag == MVM_CALLSITE_ARG_INT) { pos_box(tc, g, pos_bb[i], pos_ins[i], MVM_op_get_op(MVM_OP_hllboxtype_i), MVM_op_get_op(MVM_OP_box_i), MVM_op_get_op(MVM_OP_sp_getarg_i), MVM_reg_int64); pos_added[i] += 2; } else if (arg_flag == MVM_CALLSITE_ARG_NUM) { pos_box(tc, g, pos_bb[i], pos_ins[i], MVM_op_get_op(MVM_OP_hllboxtype_n), MVM_op_get_op(MVM_OP_box_n), MVM_op_get_op(MVM_OP_sp_getarg_n), MVM_reg_num64); pos_added[i] += 2; } else if (arg_flag == MVM_CALLSITE_ARG_STR) { pos_box(tc, g, pos_bb[i], pos_ins[i], MVM_op_get_op(MVM_OP_hllboxtype_s), MVM_op_get_op(MVM_OP_box_s), MVM_op_get_op(MVM_OP_sp_getarg_s), MVM_reg_str); pos_added[i] += 2; } break; default: break; } pos_ins[i]->operands[1].lit_i16 = (MVMint16)i; } /* Now consider any optionals. */ if (opt_min >= 0) { for (i = opt_min; i <= opt_max; i++) { MVMuint8 passed = i < cs->num_pos; if (passed) { /* If we know the argument has been passed, then add a goto * to the "passed" code. */ MVMSpeshIns *after = pos_ins[i]; while (pos_added[i]--) after = after->next; MVM_spesh_manipulate_insert_goto(tc, g, pos_bb[i], after, pos_ins[i]->operands[2].ins_bb); /* Inserting an unconditional goto makes the linear_next BB * unreachable, so we remove it from the succ list. */ MVM_spesh_manipulate_remove_successor(tc, pos_bb[i], pos_bb[i]->linear_next); } else { /* If we didn't pass this, just fall through the original * operation and we'll get the default value set. */ MVM_spesh_manipulate_delete_ins(tc, g, pos_bb[i], pos_ins[i]); MVM_spesh_manipulate_remove_successor(tc, pos_bb[i], pos_ins[i]->operands[2].ins_bb); } } } /* Now consider any nameds. */ for (i = 0; i < num_named; i++) { /* See if the arg was passed. */ MVMString *arg_name = MVM_spesh_get_string(tc, g, named_ins[i]->operands[1]); MVMint32 cur_idx = 0; MVMint32 cur_named = 0; MVMuint8 found_flag = 0; MVMint32 found_idx = -1; MVMint32 found_flag_idx = -1; MVMint32 j; for (j = 0; j < cs_flags; j++) { if (cs->arg_flags[j] & MVM_CALLSITE_ARG_NAMED) { if (MVM_string_equal(tc, arg_name, cs->arg_names[cur_named])) { /* Found it. */ found_flag_idx = j; found_flag = cs->arg_flags[j]; found_idx = cur_idx; break; } cur_idx += 2; cur_named++; } else { cur_idx++; } } /* Now go by instruction. */ switch (named_ins[i]->info->opcode) { case MVM_OP_param_rn_i: if (found_idx == -1) goto cleanup; if (found_flag & MVM_CALLSITE_ARG_INT) { named_ins[i]->info = MVM_op_get_op(MVM_OP_sp_getarg_i); named_ins[i]->operands[1].lit_i16 = found_idx + 1; named_used_bit_field |= (MVMuint64)1 << cur_named; } else if (found_flag & MVM_CALLSITE_ARG_OBJ && prim_spec(tc, type_tuple, found_flag_idx) == MVM_STORAGE_SPEC_BP_INT) { named_ins[i]->operands[1].lit_i16 = found_idx + 1; pos_unbox(tc, g, named_bb[i], named_ins[i], MVM_op_get_op(MVM_OP_unbox_i)); named_used_bit_field |= (MVMuint64)1 << cur_named; } named_used++; break; case MVM_OP_param_rn_n: if (found_idx == -1) goto cleanup; if (found_flag & MVM_CALLSITE_ARG_NUM) { named_ins[i]->info = MVM_op_get_op(MVM_OP_sp_getarg_n); named_ins[i]->operands[1].lit_i16 = found_idx + 1; named_used_bit_field |= (MVMuint64)1 << cur_named; } else if (found_flag & MVM_CALLSITE_ARG_OBJ && prim_spec(tc, type_tuple, found_flag_idx) == MVM_STORAGE_SPEC_BP_NUM) { named_ins[i]->operands[1].lit_i16 = found_idx + 1; pos_unbox(tc, g, named_bb[i], named_ins[i], MVM_op_get_op(MVM_OP_unbox_n)); named_used_bit_field |= (MVMuint64)1 << cur_named; } named_used++; break; case MVM_OP_param_rn_s: if (found_idx == -1) goto cleanup; if (found_flag & MVM_CALLSITE_ARG_STR) { named_ins[i]->info = MVM_op_get_op(MVM_OP_sp_getarg_s); named_ins[i]->operands[1].lit_i16 = found_idx + 1; named_used_bit_field |= (MVMuint64)1 << cur_named; } else if (found_flag & MVM_CALLSITE_ARG_OBJ && prim_spec(tc, type_tuple, found_flag_idx) == MVM_STORAGE_SPEC_BP_STR) { named_ins[i]->operands[1].lit_i16 = found_idx + 1; pos_unbox(tc, g, named_bb[i], named_ins[i], MVM_op_get_op(MVM_OP_unbox_s)); named_used_bit_field |= (MVMuint64)1 << cur_named; } named_used++; break; case MVM_OP_param_rn_o: if (found_idx == -1) goto cleanup; if (found_flag & MVM_CALLSITE_ARG_OBJ) { MVMuint16 arg_idx = found_idx + 1; named_ins[i]->info = MVM_op_get_op(MVM_OP_sp_getarg_o); named_ins[i]->operands[1].lit_i16 = arg_idx; named_used_bit_field |= (MVMuint64)1 << cur_named; if (type_tuple && type_tuple[found_flag_idx].type) add_facts(tc, g, arg_idx, type_tuple[found_flag_idx], named_ins[i]); } else if (found_flag & (MVM_CALLSITE_ARG_INT | MVM_CALLSITE_ARG_NUM | MVM_CALLSITE_ARG_STR)) { MVMuint16 arg_idx = found_idx + 1; named_ins[i]->operands[1].lit_i16 = arg_idx; if (found_flag & MVM_CALLSITE_ARG_INT) pos_box(tc, g, named_bb[i], named_ins[i], MVM_op_get_op(MVM_OP_hllboxtype_i), MVM_op_get_op(MVM_OP_box_i), MVM_op_get_op(MVM_OP_sp_getarg_i), MVM_reg_int64); else if (found_flag & MVM_CALLSITE_ARG_NUM) pos_box(tc, g, named_bb[i], named_ins[i], MVM_op_get_op(MVM_OP_hllboxtype_n), MVM_op_get_op(MVM_OP_box_n), MVM_op_get_op(MVM_OP_sp_getarg_n), MVM_reg_num64); else if (found_flag & MVM_CALLSITE_ARG_STR) pos_box(tc, g, named_bb[i], named_ins[i], MVM_op_get_op(MVM_OP_hllboxtype_s), MVM_op_get_op(MVM_OP_box_s), MVM_op_get_op(MVM_OP_sp_getarg_s), MVM_reg_str); named_used_bit_field |= (MVMuint64)1 << cur_named; } named_used++; break; case MVM_OP_param_on_i: if (found_idx == -1) { MVM_spesh_manipulate_delete_ins(tc, g, named_bb[i], named_ins[i]); MVM_spesh_manipulate_remove_successor(tc, named_bb[i], named_ins[i]->operands[2].ins_bb); } else if (found_flag & MVM_CALLSITE_ARG_INT) { named_ins[i]->info = MVM_op_get_op(MVM_OP_sp_getarg_i); named_ins[i]->operands[1].lit_i16 = found_idx + 1; MVM_spesh_manipulate_insert_goto(tc, g, named_bb[i], named_ins[i], named_ins[i]->operands[2].ins_bb); MVM_spesh_manipulate_remove_successor(tc, named_bb[i], named_bb[i]->linear_next); named_used_bit_field |= (MVMuint64)1 << cur_named; named_used++; } else if (found_flag & MVM_CALLSITE_ARG_OBJ && prim_spec(tc, type_tuple, found_flag_idx) == MVM_STORAGE_SPEC_BP_INT) { named_ins[i]->operands[1].lit_i16 = found_idx + 1; pos_unbox(tc, g, named_bb[i], named_ins[i], MVM_op_get_op(MVM_OP_unbox_i)); MVM_spesh_manipulate_insert_goto(tc, g, named_bb[i], named_ins[i]->next, named_ins[i]->operands[2].ins_bb); MVM_spesh_manipulate_remove_successor(tc, named_bb[i], named_bb[i]->linear_next); named_used_bit_field |= (MVMuint64)1 << cur_named; named_used++; } break; case MVM_OP_param_on_n: if (found_idx == -1) { MVM_spesh_manipulate_delete_ins(tc, g, named_bb[i], named_ins[i]); MVM_spesh_manipulate_remove_successor(tc, named_bb[i], named_ins[i]->operands[2].ins_bb); } else if (found_flag & MVM_CALLSITE_ARG_NUM) { named_ins[i]->info = MVM_op_get_op(MVM_OP_sp_getarg_n); named_ins[i]->operands[1].lit_i16 = found_idx + 1; MVM_spesh_manipulate_insert_goto(tc, g, named_bb[i], named_ins[i], named_ins[i]->operands[2].ins_bb); MVM_spesh_manipulate_remove_successor(tc, named_bb[i], named_bb[i]->linear_next); named_used_bit_field |= (MVMuint64)1 << cur_named; named_used++; } else if (found_flag & MVM_CALLSITE_ARG_OBJ && prim_spec(tc, type_tuple, found_flag_idx) == MVM_STORAGE_SPEC_BP_NUM) { named_ins[i]->operands[1].lit_i16 = found_idx + 1; pos_unbox(tc, g, named_bb[i], named_ins[i], MVM_op_get_op(MVM_OP_unbox_n)); MVM_spesh_manipulate_insert_goto(tc, g, named_bb[i], named_ins[i]->next, named_ins[i]->operands[2].ins_bb); MVM_spesh_manipulate_remove_successor(tc, named_bb[i], named_bb[i]->linear_next); named_used_bit_field |= (MVMuint64)1 << cur_named; named_used++; } break; case MVM_OP_param_on_s: if (found_idx == -1) { MVM_spesh_manipulate_delete_ins(tc, g, named_bb[i], named_ins[i]); MVM_spesh_manipulate_remove_successor(tc, named_bb[i], named_ins[i]->operands[2].ins_bb); } else if (found_flag & MVM_CALLSITE_ARG_STR) { named_ins[i]->info = MVM_op_get_op(MVM_OP_sp_getarg_s); named_ins[i]->operands[1].lit_i16 = found_idx + 1; MVM_spesh_manipulate_insert_goto(tc, g, named_bb[i], named_ins[i], named_ins[i]->operands[2].ins_bb); MVM_spesh_manipulate_remove_successor(tc, named_bb[i], named_bb[i]->linear_next); named_used_bit_field |= (MVMuint64)1 << cur_named; named_used++; } else if (found_flag & MVM_CALLSITE_ARG_OBJ && prim_spec(tc, type_tuple, found_flag_idx) == MVM_STORAGE_SPEC_BP_STR) { named_ins[i]->operands[1].lit_i16 = found_idx + 1; pos_unbox(tc, g, named_bb[i], named_ins[i], MVM_op_get_op(MVM_OP_unbox_s)); MVM_spesh_manipulate_insert_goto(tc, g, named_bb[i], named_ins[i]->next, named_ins[i]->operands[2].ins_bb); MVM_spesh_manipulate_remove_successor(tc, named_bb[i], named_bb[i]->linear_next); named_used_bit_field |= (MVMuint64)1 << cur_named; named_used++; } break; case MVM_OP_param_on_o: if (found_idx == -1) { MVM_spesh_manipulate_delete_ins(tc, g, named_bb[i], named_ins[i]); MVM_spesh_manipulate_remove_successor(tc, named_bb[i], named_ins[i]->operands[2].ins_bb); } else if (found_flag & MVM_CALLSITE_ARG_OBJ) { MVMuint16 arg_idx = found_idx + 1; named_ins[i]->info = MVM_op_get_op(MVM_OP_sp_getarg_o); named_ins[i]->operands[1].lit_i16 = arg_idx; MVM_spesh_manipulate_insert_goto(tc, g, named_bb[i], named_ins[i], named_ins[i]->operands[2].ins_bb); MVM_spesh_manipulate_remove_successor(tc, named_bb[i], named_bb[i]->linear_next); named_used_bit_field |= (MVMuint64)1 << cur_named; if (type_tuple && type_tuple[found_flag_idx].type) add_facts(tc, g, arg_idx, type_tuple[found_flag_idx], named_ins[i]); named_used++; } else if (found_flag & (MVM_CALLSITE_ARG_INT | MVM_CALLSITE_ARG_NUM | MVM_CALLSITE_ARG_STR)) { MVMuint16 arg_idx = found_idx + 1; named_ins[i]->operands[1].lit_i16 = arg_idx; if (found_flag & MVM_CALLSITE_ARG_INT) pos_box(tc, g, named_bb[i], named_ins[i], MVM_op_get_op(MVM_OP_hllboxtype_i), MVM_op_get_op(MVM_OP_box_i), MVM_op_get_op(MVM_OP_sp_getarg_i), MVM_reg_int64); else if (found_flag & MVM_CALLSITE_ARG_NUM) pos_box(tc, g, named_bb[i], named_ins[i], MVM_op_get_op(MVM_OP_hllboxtype_n), MVM_op_get_op(MVM_OP_box_n), MVM_op_get_op(MVM_OP_sp_getarg_n), MVM_reg_num64); else if (found_flag & MVM_CALLSITE_ARG_STR) pos_box(tc, g, named_bb[i], named_ins[i], MVM_op_get_op(MVM_OP_hllboxtype_s), MVM_op_get_op(MVM_OP_box_s), MVM_op_get_op(MVM_OP_sp_getarg_s), MVM_reg_str); MVM_spesh_manipulate_insert_goto(tc, g, named_bb[i], named_ins[i]->next->next, named_ins[i]->operands[2].ins_bb); MVM_spesh_manipulate_remove_successor(tc, named_bb[i], named_bb[i]->linear_next); named_used_bit_field |= (MVMuint64)1 << cur_named; named_used++; } break; default: break; } } /* If we have an instruction to check all nameds were used... */ if (paramnamesused_ins) { /* Delete it if they were. */ if (named_passed == named_used) { MVM_spesh_manipulate_delete_ins(tc, g, paramnamesused_bb, paramnamesused_ins); } /* Otherwise, we have unexpected named arguments. Turn it into an * error. */ else { MVMuint16 i; for (i = 0; i < named_passed; i++) { if (!(named_used_bit_field & ((MVMuint64)1 << i))) { paramnamesused_ins->info = MVM_op_get_op(MVM_OP_sp_paramnamesused); paramnamesused_ins->operands = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshOperand)); paramnamesused_ins->operands[0].lit_i16 = MVM_spesh_add_spesh_slot(tc, g, (MVMCollectable *)g->cs->arg_names[i]); break; } } } } /* If we have a slurpy hash... */ if (param_sn_ins) { /* Construct it as a hash. */ MVMObject *hash_type = g->sf->body.cu->body.hll_config->slurpy_hash_type; if (REPR(hash_type)->ID == MVM_REPR_ID_MVMHash) { MVMSpeshOperand target = param_sn_ins->operands[0]; param_sn_ins->info = MVM_op_get_op(MVM_OP_sp_fastcreate); param_sn_ins->operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand)); param_sn_ins->operands[0] = target; param_sn_ins->operands[1].lit_i16 = sizeof(MVMHash); param_sn_ins->operands[2].lit_i16 = MVM_spesh_add_spesh_slot(tc, g, (MVMCollectable *)STABLE(hash_type)); } else { MVM_oops(tc, "Arg spesh: slurpy hash type was not a VMHash as expected"); } /* Populate it with unused named args, if needed, boxing them on * the way. */ if (named_passed > named_used) for (i = 0; i < named_passed; i++) if (!(named_used_bit_field & ((MVMuint64)1 << i))) slurp_named_arg(tc, g, param_sn_bb, param_sn_ins, i); } /* Stash the named used bit field in the graph; will need to make it * into the candidate and all the way to deopt. */ g->deopt_named_used_bit_field = named_used_bit_field; } cleanup: MVM_free(pos_ins); MVM_free(pos_bb); MVM_free(pos_added); MVM_free(named_ins); MVM_free(named_bb); } MoarVM-2018.03/src/spesh/args.h0000644000175000017510000000016113237701240016216 0ustar samanthasamanthavoid MVM_spesh_args(MVMThreadContext *tc, MVMSpeshGraph *g, MVMCallsite *cs, MVMSpeshStatsType *type_tuple); MoarVM-2018.03/src/spesh/candidate.c0000644000175000017510000001604013237701240017174 0ustar samanthasamantha#include "moar.h" /* Calculates the work and env sizes based on the number of locals and * lexicals. */ static void calculate_work_env_sizes(MVMThreadContext *tc, MVMStaticFrame *sf, MVMSpeshCandidate *c) { MVMuint32 max_callsite_size, jit_spill_size; MVMint32 i; max_callsite_size = sf->body.cu->body.max_callsite_size; jit_spill_size = (c->jitcode ? c->jitcode->spill_size: 0); for (i = 0; i < c->num_inlines; i++) { MVMuint32 cs = c->inlines[i].sf->body.cu->body.max_callsite_size; if (cs > max_callsite_size) max_callsite_size = cs; } c->work_size = (c->num_locals + max_callsite_size + jit_spill_size) * sizeof(MVMRegister); c->env_size = c->num_lexicals * sizeof(MVMRegister); } /* Produces and installs a specialized version of the code, according to the * specified plan. */ void MVM_spesh_candidate_add(MVMThreadContext *tc, MVMSpeshPlanned *p) { MVMSpeshGraph *sg; MVMSpeshCode *sc; MVMSpeshCandidate *candidate; MVMSpeshCandidate **new_candidate_list; MVMStaticFrameSpesh *spesh; MVMuint64 start_time; /* If we've reached our specialization limit, don't continue. */ if (tc->instance->spesh_limit) if (++tc->instance->spesh_produced > tc->instance->spesh_limit) return; /* Produce the specialization graph and, if we're logging, dump it out * pre-transformation. */ #if MVM_GC_DEBUG tc->in_spesh = 1; #endif if (tc->instance->spesh_log_fh) start_time = uv_hrtime(); sg = MVM_spesh_graph_create(tc, p->sf, 0, 1); if (tc->instance->spesh_log_fh) { char *c_name = MVM_string_utf8_encode_C_string(tc, p->sf->body.name); char *c_cuid = MVM_string_utf8_encode_C_string(tc, p->sf->body.cuuid); char *before = MVM_spesh_dump(tc, sg); fprintf(tc->instance->spesh_log_fh, "Specialization of '%s' (cuid: %s)\n\n", c_name, c_cuid); fprintf(tc->instance->spesh_log_fh, "Before:\n%s", before); MVM_free(c_name); MVM_free(c_cuid); MVM_free(before); fflush(tc->instance->spesh_log_fh); } /* Perform the optimization and, if we're logging, dump out the result. */ if (p->cs_stats->cs) MVM_spesh_args(tc, sg, p->cs_stats->cs, p->type_tuple); MVM_spesh_facts_discover(tc, sg, p); MVM_spesh_optimize(tc, sg, p); if (tc->instance->spesh_log_fh) { char *after = MVM_spesh_dump(tc, sg); fprintf(tc->instance->spesh_log_fh, "After:\n%s", after); fprintf(tc->instance->spesh_log_fh, "Specialization took %dus\n\n========\n\n", (int)((uv_hrtime() - start_time) / 1000)); MVM_free(after); fflush(tc->instance->spesh_log_fh); } /* Generate code and install it into the candidate. */ sc = MVM_spesh_codegen(tc, sg); candidate = MVM_calloc(1, sizeof(MVMSpeshCandidate)); candidate->bytecode = sc->bytecode; candidate->bytecode_size = sc->bytecode_size; candidate->handlers = sc->handlers; candidate->num_handlers = sg->num_handlers; candidate->num_deopts = sg->num_deopt_addrs; candidate->deopts = sg->deopt_addrs; candidate->deopt_named_used_bit_field = sg->deopt_named_used_bit_field; candidate->num_locals = sg->num_locals; candidate->num_lexicals = sg->num_lexicals; candidate->num_inlines = sg->num_inlines; candidate->inlines = sg->inlines; candidate->local_types = sg->local_types; candidate->lexical_types = sg->lexical_types; MVM_free(sc); /* Try to JIT compile the optimised graph. The JIT graph hangs from * the spesh graph and can safely be deleted with it. */ if (tc->instance->jit_enabled) { MVMJitGraph *jg = MVM_jit_try_make_graph(tc, sg); if (jg != NULL) { candidate->jitcode = MVM_jit_compile_graph(tc, jg); MVM_jit_graph_destroy(tc, jg); } } /* calculate work environment taking JIT spill area into account */ calculate_work_env_sizes(tc, sg->sf, candidate); /* Update spesh slots. */ candidate->num_spesh_slots = sg->num_spesh_slots; candidate->spesh_slots = sg->spesh_slots; /* Clean up after specialization work. */ if (candidate->num_inlines) { MVMint32 i; for (i = 0; i < candidate->num_inlines; i++) if (candidate->inlines[i].g) { MVM_spesh_graph_destroy(tc, candidate->inlines[i].g); candidate->inlines[i].g = NULL; } } MVM_spesh_graph_destroy(tc, sg); /* Create a new candidate list and copy any existing ones. Free memory * using the FSA safepoint mechanism. */ spesh = p->sf->body.spesh; new_candidate_list = MVM_fixed_size_alloc(tc, tc->instance->fsa, (spesh->body.num_spesh_candidates + 1) * sizeof(MVMSpeshCandidate *)); if (spesh->body.num_spesh_candidates) { size_t orig_size = spesh->body.num_spesh_candidates * sizeof(MVMSpeshCandidate *); memcpy(new_candidate_list, spesh->body.spesh_candidates, orig_size); MVM_fixed_size_free_at_safepoint(tc, tc->instance->fsa, orig_size, spesh->body.spesh_candidates); } new_candidate_list[spesh->body.num_spesh_candidates] = candidate; spesh->body.spesh_candidates = new_candidate_list; /* May now be referencing nursery objects, so barrier just in case. */ if (spesh->common.header.flags & MVM_CF_SECOND_GEN) MVM_gc_write_barrier_hit(tc, (MVMCollectable *)spesh); /* Update the guards, and bump the candidate count. This means there is a * period when we can read, in another thread, a candidate ahead of the * count being updated. Since we set it up above, that's fine enough. The * updating of the count *after* this, plus the barrier, is to make sure * the guards are in place before the count is bumped, since OSR will * watch the number of candidates to see if there's one for it to try and * jump in to, and if the guards aren't in place first will see there is * not, and not bother checking again. */ MVM_spesh_arg_guard_add(tc, &(spesh->body.spesh_arg_guard), p->cs_stats->cs, p->type_tuple, spesh->body.num_spesh_candidates); MVM_barrier(); spesh->body.num_spesh_candidates++; /* If we're logging, dump the updated arg guards also. */ if (tc->instance->spesh_log_fh) { char *guard_dump = MVM_spesh_dump_arg_guard(tc, p->sf); fprintf(tc->instance->spesh_log_fh, "%s========\n\n", guard_dump); fflush(tc->instance->spesh_log_fh); MVM_free(guard_dump); } #if MVM_GC_DEBUG tc->in_spesh = 0; #endif } /* Frees the memory associated with a spesh candidate. */ void MVM_spesh_candidate_destroy(MVMThreadContext *tc, MVMSpeshCandidate *candidate) { MVM_free(candidate->bytecode); MVM_free(candidate->handlers); MVM_free(candidate->spesh_slots); MVM_free(candidate->deopts); MVM_free(candidate->inlines); MVM_free(candidate->local_types); MVM_free(candidate->lexical_types); if (candidate->jitcode) MVM_jit_destroy_code(tc, candidate->jitcode); } MoarVM-2018.03/src/spesh/candidate.h0000644000175000017510000000356013237701240017204 0ustar samanthasamantha/* A specialization candidate. */ struct MVMSpeshCandidate { /* The callsite we should have for a match. */ MVMCallsite *cs; /* Length of the specialized bytecode in bytes. */ MVMuint32 bytecode_size; /* The specialized bytecode. */ MVMuint8 *bytecode; /* Frame handlers for this specialization. */ MVMFrameHandler *handlers; /* Spesh slots, used to hold information for fast access. */ MVMCollectable **spesh_slots; /* Number of spesh slots. */ MVMuint32 num_spesh_slots; /* The number of deoptimization mappings we have. */ MVMuint32 num_deopts; /* Deoptimization mappings. */ MVMint32 *deopts; /* Bit field of named args used to put in place during deopt, since we * typically don't update the array in specialized code. */ MVMuint64 deopt_named_used_bit_field; /* Number of inlines and inlines table; see graph.h for description of * the table format. */ MVMint32 num_inlines; MVMSpeshInline *inlines; /* The list of local types (only set up if we do inlines). */ MVMuint16 *local_types; /* The list of lexical types (only set up if we do inlines). */ MVMuint16 *lexical_types; /* Number of locals the specialized code has (may be different from the * original frame thanks to inlining). */ MVMuint16 num_locals; /* Number of lexicals the specialized code has. */ MVMuint16 num_lexicals; /* Memory sizes to allocate for work/env, taking into account inlining. */ MVMuint32 work_size; MVMuint32 env_size; /* Number of handlers. */ MVMuint32 num_handlers; /* JIT-code structure. */ MVMJitCode *jitcode; }; /* Functions for creating and clearing up specializations. */ void MVM_spesh_candidate_add(MVMThreadContext *tc, MVMSpeshPlanned *p); void MVM_spesh_candidate_destroy(MVMThreadContext *tc, MVMSpeshCandidate *candidate); MoarVM-2018.03/src/spesh/codegen.c0000644000175000017510000003213513242626641016676 0ustar samanthasamantha#include "moar.h" /* Here we turn a spesh tree back into MoarVM bytecode, after optimizations * have been applied to it. */ /* Writer state. */ typedef struct { /* Bytecode output buffer. */ MVMuint8 *bytecode; MVMuint32 bytecode_pos; MVMuint32 bytecode_alloc; /* Offsets where basic blocks are. */ MVMint32 *bb_offsets; /* Fixups we need to do by basic block. */ MVMint32 *fixup_locations; MVMSpeshBB **fixup_bbs; MVMint32 num_fixups; MVMint32 alloc_fixups; /* Copied frame handlers (which we'll update offsets of). */ MVMFrameHandler *handlers; } SpeshWriterState; /* Write functions; all native endian. */ static void ensure_space(SpeshWriterState *ws, int bytes) { if (ws->bytecode_pos + bytes >= ws->bytecode_alloc) { ws->bytecode_alloc *= 2; ws->bytecode = MVM_realloc(ws->bytecode, ws->bytecode_alloc); } } static void write_int64(SpeshWriterState *ws, MVMuint64 value) { ensure_space(ws, 8); memcpy(ws->bytecode + ws->bytecode_pos, &value, 8); ws->bytecode_pos += 8; } static void write_int32(SpeshWriterState *ws, MVMuint32 value) { ensure_space(ws, 4); memcpy(ws->bytecode + ws->bytecode_pos, &value, 4); ws->bytecode_pos += 4; } static void write_int16(SpeshWriterState *ws, MVMuint16 value) { ensure_space(ws, 2); memcpy(ws->bytecode + ws->bytecode_pos, &value, 2); ws->bytecode_pos += 2; } static void write_int8(SpeshWriterState *ws, MVMuint8 value) { ensure_space(ws, 1); memcpy(ws->bytecode + ws->bytecode_pos, &value, 1); ws->bytecode_pos++; } static void write_num32(SpeshWriterState *ws, MVMnum32 value) { ensure_space(ws, 4); memcpy(ws->bytecode + ws->bytecode_pos, &value, 4); ws->bytecode_pos += 4; } static void write_num64(SpeshWriterState *ws, MVMnum64 value) { ensure_space(ws, 8); memcpy(ws->bytecode + ws->bytecode_pos, &value, 8); ws->bytecode_pos += 8; } /* Writes instructions within a basic block boundary. */ static void write_instructions(MVMThreadContext *tc, MVMSpeshGraph *g, SpeshWriterState *ws, MVMSpeshBB *bb) { MVMSpeshIns *ins = bb->first_ins; while (ins) { MVMint32 i; /* Process any annotations. */ MVMSpeshAnn *ann = ins->annotations; MVMSpeshAnn *deopt_one_ann = NULL; MVMSpeshAnn *deopt_all_ann = NULL; MVMSpeshAnn *deopt_inline_ann = NULL; while (ann) { switch (ann->type) { case MVM_SPESH_ANN_FH_START: ws->handlers[ann->data.frame_handler_index].start_offset = ws->bytecode_pos; break; case MVM_SPESH_ANN_FH_END: ws->handlers[ann->data.frame_handler_index].end_offset = ws->bytecode_pos; break; case MVM_SPESH_ANN_FH_GOTO: ws->handlers[ann->data.frame_handler_index].goto_offset = ws->bytecode_pos; break; case MVM_SPESH_ANN_DEOPT_ONE_INS: deopt_one_ann = ann; break; case MVM_SPESH_ANN_DEOPT_ALL_INS: deopt_all_ann = ann; break; case MVM_SPESH_ANN_INLINE_START: g->inlines[ann->data.inline_idx].start = ws->bytecode_pos; break; case MVM_SPESH_ANN_INLINE_END: g->inlines[ann->data.inline_idx].end = ws->bytecode_pos; break; case MVM_SPESH_ANN_DEOPT_INLINE: deopt_inline_ann = ann; break; case MVM_SPESH_ANN_DEOPT_OSR: g->deopt_addrs[2 * ann->data.deopt_idx + 1] = ws->bytecode_pos; break; } ann = ann->next; } if (ins->info->opcode != MVM_SSA_PHI) { /* Real instruction, not a phi. Emit opcode. */ if (ins->info->opcode == (MVMuint16)-1) { /* Ext op; resolve. */ MVMExtOpRecord *extops = g->sf->body.cu->body.extops; MVMuint16 num_extops = g->sf->body.cu->body.num_extops; MVMint32 found = 0; for (i = 0; i < num_extops; i++) { if (extops[i].info == ins->info) { write_int16(ws, MVM_OP_EXT_BASE + i); found = 1; break; } } if (!found) MVM_oops(tc, "Spesh: failed to resolve extop in code-gen"); } else { /* Core op. */ write_int16(ws, ins->info->opcode); } /* Write out operands. */ for (i = 0; i < ins->info->num_operands; i++) { MVMuint8 flags = ins->info->operands[i]; MVMuint8 rw = flags & MVM_operand_rw_mask; switch (rw) { case MVM_operand_read_reg: case MVM_operand_write_reg: write_int16(ws, ins->operands[i].reg.orig); break; case MVM_operand_read_lex: case MVM_operand_write_lex: write_int16(ws, ins->operands[i].lex.idx); write_int16(ws, ins->operands[i].lex.outers); break; case MVM_operand_literal: { MVMuint8 type = flags & MVM_operand_type_mask; switch (type) { case MVM_operand_int8: write_int8(ws, ins->operands[i].lit_i8); break; case MVM_operand_int16: write_int16(ws, ins->operands[i].lit_i16); break; case MVM_operand_int32: write_int32(ws, ins->operands[i].lit_i32); break; case MVM_operand_uint32: write_int32(ws, ins->operands[i].lit_ui32); break; case MVM_operand_int64: write_int64(ws, ins->operands[i].lit_i64); break; case MVM_operand_num32: write_num32(ws, ins->operands[i].lit_n32); break; case MVM_operand_num64: write_num64(ws, ins->operands[i].lit_n64); break; case MVM_operand_callsite: write_int16(ws, ins->operands[i].callsite_idx); break; case MVM_operand_coderef: write_int16(ws, ins->operands[i].coderef_idx); break; case MVM_operand_str: write_int32(ws, ins->operands[i].lit_str_idx); break; case MVM_operand_ins: { MVMint32 bb_idx = ins->operands[i].ins_bb->idx; MVMint32 offset; if (bb_idx >= g->num_bbs) MVM_panic(1, "Spesh codegen: out of range BB index %d", bb_idx); offset = ws->bb_offsets[bb_idx]; if (offset >= 0) { /* Already know where it is, so just write it. */ write_int32(ws, offset); } else { /* Need to fix it up. */ if (ws->num_fixups == ws->alloc_fixups) { ws->alloc_fixups *= 2; ws->fixup_locations = MVM_realloc(ws->fixup_locations, ws->alloc_fixups * sizeof(MVMint32)); ws->fixup_bbs = MVM_realloc(ws->fixup_bbs, ws->alloc_fixups * sizeof(MVMSpeshBB *)); } ws->fixup_locations[ws->num_fixups] = ws->bytecode_pos; ws->fixup_bbs[ws->num_fixups] = ins->operands[i].ins_bb; write_int32(ws, 0); ws->num_fixups++; } break; } case MVM_operand_spesh_slot: write_int16(ws, ins->operands[i].lit_i16); break; default: MVM_oops(tc, "Spesh: unknown operand type %d in codegen (op %s)", (int)type, ins->info->name); } } break; default: MVM_oops(tc, "Spesh: unknown operand type in codegen"); } } } /* If there was a deopt point annotation, update table. */ if (deopt_one_ann) g->deopt_addrs[2 * deopt_one_ann->data.deopt_idx + 1] = ws->bytecode_pos; if (deopt_all_ann) g->deopt_addrs[2 * deopt_all_ann->data.deopt_idx + 1] = ws->bytecode_pos; if (deopt_inline_ann) g->deopt_addrs[2 * deopt_inline_ann->data.deopt_idx + 1] = ws->bytecode_pos; ins = ins->next; } } /* Generate bytecode from a spesh graph. */ MVMSpeshCode * MVM_spesh_codegen(MVMThreadContext *tc, MVMSpeshGraph *g) { MVMSpeshCode *res; MVMSpeshBB *bb; MVMint32 i, hanlen; /* Initialize writer state. */ SpeshWriterState *ws = MVM_malloc(sizeof(SpeshWriterState)); ws->bytecode_pos = 0; ws->bytecode_alloc = 1024; ws->bytecode = MVM_malloc(ws->bytecode_alloc); ws->bb_offsets = MVM_malloc(g->num_bbs * sizeof(MVMint32)); ws->num_fixups = 0; ws->alloc_fixups = 64; ws->fixup_locations = MVM_malloc(ws->alloc_fixups * sizeof(MVMint32)); ws->fixup_bbs = MVM_malloc(ws->alloc_fixups * sizeof(MVMSpeshBB *)); for (i = 0; i < g->num_bbs; i++) ws->bb_offsets[i] = -1; /* Create copy of handlers, and -1 all offsets so we can catch missing * updates. */ hanlen = g->num_handlers * sizeof(MVMFrameHandler); if (hanlen) { ws->handlers = MVM_malloc(hanlen); memcpy(ws->handlers, g->handlers, hanlen); for (i = 0; i < g->num_handlers; i++) { ws->handlers[i].start_offset = -1; ws->handlers[i].end_offset = -1; ws->handlers[i].goto_offset = -1; } } else { ws->handlers = NULL; } /* -1 all the deopt targets, so we'll easily catch those that don't get * mapped if we try to use them. Same for inlines. */ for (i = 0; i < g->num_deopt_addrs; i++) g->deopt_addrs[i * 2 + 1] = -1; for (i = 0; i < g->num_inlines; i++) { g->inlines[i].start = -1; g->inlines[i].end = -1; } /* Write out each of the basic blocks, in linear order. Skip the first, * dummy, block. */ bb = g->entry->linear_next; while (bb) { ws->bb_offsets[bb->idx] = ws->bytecode_pos; write_instructions(tc, g, ws, bb); bb = bb->linear_next; } /* Fixup labels we were too early for. */ for (i = 0; i < ws->num_fixups; i++) *((MVMuint32 *)(ws->bytecode + ws->fixup_locations[i])) = ws->bb_offsets[ws->fixup_bbs[i]->idx]; /* Ensure all handlers that are reachable got fixed up. */ for (i = 0; i < g->num_handlers; i++) { if (g->unreachable_handlers && g->unreachable_handlers[i]) { ws->handlers[i].start_offset = -1; ws->handlers[i].end_offset = -1; ws->handlers[i].goto_offset = -1; } else if (ws->handlers[i].start_offset == -1 || ws->handlers[i].end_offset == -1 || ws->handlers[i].goto_offset == -1) { MVM_oops(tc, "Spesh: failed to fix up handler %d in %s (%d, %d, %d)", i, MVM_string_utf8_maybe_encode_C_string(tc, g->sf->body.name), (int)ws->handlers[i].start_offset, (int)ws->handlers[i].end_offset, (int)ws->handlers[i].goto_offset); } } /* Ensure all inlines got fixed up. */ for (i = 0; i < g->num_inlines; i++) { if (g->inlines[i].unreachable) { g->inlines[i].start = -1; g->inlines[i].end = -1; } else { if (g->inlines[i].start == -1 || g->inlines[i].end == -1) MVM_oops(tc, "Spesh: failed to fix up inline %d %p (%s) %d %d", i, g->inlines[i].g, MVM_string_utf8_maybe_encode_C_string(tc, g->inlines[i].sf->body.name), g->inlines[i].start, g->inlines[i].end ); } } /* Produce result data structure. */ res = MVM_malloc(sizeof(MVMSpeshCode)); res->bytecode = ws->bytecode; res->bytecode_size = ws->bytecode_pos; res->handlers = ws->handlers; /* Cleanup. */ MVM_free(ws->bb_offsets); MVM_free(ws->fixup_locations); MVM_free(ws->fixup_bbs); MVM_free(ws); return res; } MoarVM-2018.03/src/spesh/codegen.h0000644000175000017510000000055213237701240016672 0ustar samanthasamantha/* The result produced from specializing bytecode. */ struct MVMSpeshCode { /* The specialized bytecode. */ MVMuint8 *bytecode; /* The size of the produced bytecode. */ MVMuint32 bytecode_size; /* Updated set of frame handlers. */ MVMFrameHandler *handlers; }; MVMSpeshCode * MVM_spesh_codegen(MVMThreadContext *tc, MVMSpeshGraph *g); MoarVM-2018.03/src/spesh/dead_bb_elimination.c0000644000175000017510000001137413242626641021224 0ustar samanthasamantha#include "moar.h" static void mark_handler_unreachable(MVMThreadContext *tc, MVMSpeshGraph *g, MVMint32 index) { if (!g->unreachable_handlers) g->unreachable_handlers = MVM_spesh_alloc(tc, g, g->num_handlers); g->unreachable_handlers[index] = 1; } static void cleanup_dead_bb_instructions(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *dead_bb, MVMint32 cleanup_facts) { MVMSpeshIns *ins = dead_bb->first_ins; MVMint8 *frame_handlers_started = MVM_calloc(g->num_handlers, 1); while (ins) { /* Look over any annotations on the instruction. */ MVMSpeshAnn *ann = ins->annotations; while (ann) { MVMSpeshAnn *next_ann = ann->next; switch (ann->type) { case MVM_SPESH_ANN_INLINE_START: /* If an inline's entrypoint becomes impossible to reach * the whole inline will too. Just mark it as being * unreachable. */ g->inlines[ann->data.inline_idx].unreachable = 1; break; case MVM_SPESH_ANN_FH_START: /* Move the start to the next basic block if possible. If * not, just mark the handler deleted; its end must be in * this block also. */ frame_handlers_started[ann->data.frame_handler_index] = 1; if (dead_bb->linear_next) { MVMSpeshIns *move_to_ins = dead_bb->linear_next->first_ins; ann->next = move_to_ins->annotations; move_to_ins->annotations = ann; } else { mark_handler_unreachable(tc, g, ann->data.frame_handler_index); } break; case MVM_SPESH_ANN_FH_END: { /* If we already saw the start, then we'll just mark it as * deleted. */ if (frame_handlers_started[ann->data.frame_handler_index]) { mark_handler_unreachable(tc, g, ann->data.frame_handler_index); } /* Otherwise, move it to the end of the previous basic * block (which should always exist). */ else { MVMSpeshBB *linear_prev = MVM_spesh_graph_linear_prev(tc, g, dead_bb); MVMSpeshIns *move_to_ins = linear_prev->last_ins; ann->next = move_to_ins->annotations; move_to_ins->annotations = ann; } break; } case MVM_SPESH_ANN_FH_GOTO: mark_handler_unreachable(tc, g, ann->data.frame_handler_index); break; } ann = next_ann; } if (cleanup_facts) MVM_spesh_manipulate_cleanup_ins_deps(tc, g, ins); ins = ins->next; } dead_bb->first_ins = NULL; dead_bb->last_ins = NULL; MVM_free(frame_handlers_started); } static void mark_bb_seen(MVMThreadContext *tc, MVMSpeshBB *bb, MVMint8 *seen) { if (!seen[bb->idx]) { MVMuint16 i; seen[bb->idx] = 1; for (i = 0; i < bb->num_succ; i++) mark_bb_seen(tc, bb->succ[i], seen); } } /* Eliminates dead basic blocks, optionally cleaning up facts. (In the case * this is called during spesh graph construction, the facts do not yet * exist). */ void MVM_spesh_eliminate_dead_bbs(MVMThreadContext *tc, MVMSpeshGraph *g, MVMint32 update_facts) { MVMSpeshBB *cur_bb; /* First pass: mark every basic block that is reachable from the * entrypoint. */ MVMint32 orig_bbs = g->num_bbs; MVMint8 *seen = MVM_calloc(1, g->num_bbs); mark_bb_seen(tc, g->entry, seen); /* Second pass: remove dead BBs from the graph. Do not get * rid of any that are from inlines or that contain handler related * annotations. */ cur_bb = g->entry; while (cur_bb && cur_bb->linear_next) { MVMSpeshBB *death_cand = cur_bb->linear_next; if (!seen[death_cand->idx]) { cleanup_dead_bb_instructions(tc, g, death_cand, update_facts); death_cand->dead = 1; g->num_bbs--; cur_bb->linear_next = cur_bb->linear_next->linear_next; } else { cur_bb = cur_bb->linear_next; } } MVM_free(seen); /* Re-number BBs so we get sequential ordering again. */ if (g->num_bbs != orig_bbs) { MVMint32 new_idx = 0; MVMSpeshBB *cur_bb = g->entry; while (cur_bb) { cur_bb->idx = new_idx; new_idx++; cur_bb = cur_bb->linear_next; } } } MoarVM-2018.03/src/spesh/dead_bb_elimination.h0000644000175000017510000000014213237701240021211 0ustar samanthasamanthavoid MVM_spesh_eliminate_dead_bbs(MVMThreadContext *tc, MVMSpeshGraph *g, MVMint32 update_facts); MoarVM-2018.03/src/spesh/deopt.c0000644000175000017510000003554713242626641016417 0ustar samanthasamantha#include "moar.h" /* In some cases, we may have specialized bytecode "on the stack" and need to * back out of it, because some assumption it made has been invalidated. This * file contains implementations of those various forms of de-opt. */ #define MVM_LOG_DEOPTS 0 /* Uninlining can invalidate what the dynlex cache points to, so we'll * clear it in various caches. */ MVM_STATIC_INLINE void clear_dynlex_cache(MVMThreadContext *tc, MVMFrame *f) { MVMFrameExtra *e = f->extra; if (e) { e->dynlex_cache_name = NULL; e->dynlex_cache_reg = NULL; } } /* If we have to deopt inside of a frame containing inlines, and we're in * an inlined frame at the point we hit deopt, we need to undo the inlining * by switching all levels of inlined frame out for a bunch of frames that * are running the de-optimized code. We may, of course, be in the original, * non-inline, bit of the code - in which case we've nothing to do. */ static void uninline(MVMThreadContext *tc, MVMFrame *f, MVMSpeshCandidate *cand, MVMint32 offset, MVMint32 deopt_offset, MVMFrame *callee) { MVMFrame *last_uninlined = NULL; MVMuint16 last_res_reg; MVMReturnType last_res_type; MVMuint32 last_return_deopt_idx; MVMint32 i; for (i = 0; i < cand->num_inlines; i++) { if (offset > cand->inlines[i].start && offset <= cand->inlines[i].end) { /* Create the frame. */ MVMCode *ucode = (MVMCode *)f->work[cand->inlines[i].code_ref_reg].o; MVMStaticFrame *usf = cand->inlines[i].sf; MVMFrame *uf; if (REPR(ucode)->ID != MVM_REPR_ID_MVMCode) MVM_panic(1, "Deopt: did not find code object when uninlining"); MVMROOT4(tc, f, callee, last_uninlined, usf, { uf = MVM_frame_create_for_deopt(tc, usf, ucode); }); #if MVM_LOG_DEOPTS fprintf(stderr, "Recreated frame '%s' (cuid '%s')\n", MVM_string_utf8_encode_C_string(tc, usf->body.name), MVM_string_utf8_encode_C_string(tc, usf->body.cuuid)); #endif /* Copy the locals and lexicals into place. */ if (usf->body.num_locals) memcpy(uf->work, f->work + cand->inlines[i].locals_start, usf->body.num_locals * sizeof(MVMRegister)); if (usf->body.num_lexicals) memcpy(uf->env, f->env + cand->inlines[i].lexicals_start, usf->body.num_lexicals * sizeof(MVMRegister)); /* Store the named argument used bit field, since if we deopt in * argument handling code we may have missed some. */ if (cand->inlines[i].deopt_named_used_bit_field) uf->params.named_used.bit_field = cand->inlines[i].deopt_named_used_bit_field; /* Did we already uninline a frame? */ if (last_uninlined) { /* Yes; multi-level un-inline. Switch it back to deopt'd * code. */ uf->effective_spesh_slots = NULL; uf->spesh_cand = NULL; /* Set up the return location. */ uf->return_address = usf->body.bytecode + cand->deopts[2 * last_return_deopt_idx]; /* Set result type and register. */ uf->return_type = last_res_type; if (last_res_type == MVM_RETURN_VOID) uf->return_value = NULL; else uf->return_value = uf->work + last_res_reg; /* Set up last uninlined's caller to us. */ MVM_ASSERT_NOT_FROMSPACE(tc, uf); MVM_ASSIGN_REF(tc, &(last_uninlined->header), last_uninlined->caller, uf); } else { /* First uninlined frame. Are we in the middle of the call * stack (and thus in deopt_all)? */ if (callee) { /* Tweak the callee's caller to the uninlined frame, not * the frame holding the inlinings. */ MVM_ASSERT_NOT_FROMSPACE(tc, uf); MVM_ASSIGN_REF(tc, &(callee->header), callee->caller, uf); /* Copy over the return location. */ uf->return_address = usf->body.bytecode + deopt_offset; /* Set result type and register. */ uf->return_type = f->return_type; if (uf->return_type == MVM_RETURN_VOID) { uf->return_value = NULL; } else { MVMuint16 orig_reg = (MVMuint16)(f->return_value - f->work); MVMuint16 ret_reg = orig_reg - cand->inlines[i].locals_start; uf->return_value = uf->work + ret_reg; } } else { /* No, it's the deopt_one case, so this is where we'll point * the interpreter. */ tc->cur_frame = uf; tc->current_frame_nr = uf->sequence_nr; *(tc->interp_cur_op) = usf->body.bytecode + deopt_offset; *(tc->interp_bytecode_start) = usf->body.bytecode; *(tc->interp_reg_base) = uf->work; *(tc->interp_cu) = usf->body.cu; } } /* Update tracking variables for last uninline. */ last_uninlined = uf; last_res_reg = cand->inlines[i].res_reg; last_res_type = cand->inlines[i].res_type; last_return_deopt_idx = cand->inlines[i].return_deopt_idx; } } if (last_uninlined) { /* Set return address, which we need to resolve to the deopt'd one. */ f->return_address = f->static_info->body.bytecode + cand->deopts[2 * last_return_deopt_idx]; /* Set result type and register. */ f->return_type = last_res_type; if (last_res_type == MVM_RETURN_VOID) f->return_value = NULL; else f->return_value = f->work + last_res_reg; /* Set up inliner as the caller, given we now have a direct inline. */ MVM_ASSERT_NOT_FROMSPACE(tc, f); MVM_ASSIGN_REF(tc, &(last_uninlined->header), last_uninlined->caller, f); } else { /* Weren't in an inline after all. What kind of deopt? */ if (callee) { /* Deopt all. Move return address. */ f->return_address = f->static_info->body.bytecode + deopt_offset; } else { /* Deopt one. Move interpreter. */ *(tc->interp_cur_op) = f->static_info->body.bytecode + deopt_offset; *(tc->interp_bytecode_start) = f->static_info->body.bytecode; } } } static void deopt_named_args_used(MVMThreadContext *tc, MVMFrame *f) { if (f->spesh_cand->deopt_named_used_bit_field) f->params.named_used.bit_field = f->spesh_cand->deopt_named_used_bit_field; } static void deopt_frame(MVMThreadContext *tc, MVMFrame *f, MVMint32 deopt_offset, MVMint32 deopt_target) { /* Found it; are we in an inline? */ MVMSpeshInline *inlines = f->spesh_cand->inlines; deopt_named_args_used(tc, f); if (inlines) { /* Yes, going to have to re-create the frames; uninline * moves the interpreter, so we can just tweak the last * frame. For the moment, uninlining creates its frames * on the heap, so we'll force the current call stack to * the heap to preserve the "no heap -> stack pointers" * invariant. */ f = MVM_frame_force_to_heap(tc, f); MVMROOT(tc, f, { uninline(tc, f, f->spesh_cand, deopt_offset, deopt_target, NULL); }); f->effective_spesh_slots = NULL; f->spesh_cand = NULL; #if MVM_LOG_DEOPTS fprintf(stderr, "Completed deopt_one in '%s' (cuid '%s') with uninlining\n", MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.name), MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.cuuid)); #endif } else { /* No inlining; simple case. Switch back to the original code. */ *(tc->interp_cur_op) = f->static_info->body.bytecode + deopt_target; *(tc->interp_bytecode_start) = f->static_info->body.bytecode; f->effective_spesh_slots = NULL; f->spesh_cand = NULL; #if MVM_LOG_DEOPTS fprintf(stderr, "Completed deopt_one in '%s' (cuid '%s')\n", MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.name), MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.cuuid)); #endif } } /* De-optimizes the currently executing frame, provided it is specialized and * at a valid de-optimization point. Typically used when a guard fails. */ void MVM_spesh_deopt_one(MVMThreadContext *tc, MVMuint32 deopt_target) { MVMFrame *f = tc->cur_frame; if (tc->instance->profiling) MVM_profiler_log_deopt_one(tc); #if MVM_LOG_DEOPTS fprintf(stderr, "Deopt one requested by interpreter in frame '%s' (cuid '%s')\n", MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.name), MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.cuuid)); #endif clear_dynlex_cache(tc, f); if (f->spesh_cand) { MVMuint32 deopt_offset = *(tc->interp_cur_op) - f->spesh_cand->bytecode; #if MVM_LOG_DEOPTS fprintf(stderr, "Will deopt %u -> %u\n", deopt_offset, deopt_target); #endif deopt_frame(tc, tc->cur_frame, deopt_offset, deopt_target); } else { MVM_oops(tc, "deopt_one failed for %s (%s)", MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.name), MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.cuuid)); } MVM_CHECK_CALLER_CHAIN(tc, tc->cur_frame); } /* De-optimizes the current frame by directly specifying the addresses */ void MVM_spesh_deopt_one_direct(MVMThreadContext *tc, MVMuint32 deopt_offset, MVMuint32 deopt_target) { MVMFrame *f = tc->cur_frame; #if MVM_LOG_DEOPTS fprintf(stderr, "Deopt one requested by JIT in frame '%s' (cuid '%s') (%u -> %u)\n", MVM_string_utf8_encode_C_string(tc, f->static_info->body.name), MVM_string_utf8_encode_C_string(tc, f->static_info->body.cuuid), deopt_offset, deopt_target); #endif if (tc->instance->profiling) MVM_profiler_log_deopt_one(tc); clear_dynlex_cache(tc, f); deopt_frame(tc, tc->cur_frame, deopt_offset, deopt_target); MVM_CHECK_CALLER_CHAIN(tc, tc->cur_frame); } /* De-optimizes all specialized frames on the call stack. Used when a change * is made the could invalidate all kinds of assumptions all over the place * (such as a mix-in). */ void MVM_spesh_deopt_all(MVMThreadContext *tc) { /* Walk frames looking for any callers in specialized bytecode. */ MVMFrame *l = MVM_frame_force_to_heap(tc, tc->cur_frame); MVMFrame *f = tc->cur_frame->caller; #if MVM_LOG_DEOPTS fprintf(stderr, "Deopt all requested in frame '%s' (cuid '%s')\n", MVM_string_utf8_encode_C_string(tc, l->static_info->body.name), MVM_string_utf8_encode_C_string(tc, l->static_info->body.cuuid)); #endif if (tc->instance->profiling) MVM_profiler_log_deopt_all(tc); while (f) { clear_dynlex_cache(tc, f); if (f->spesh_cand) { /* Found one. Is it JITted code? */ if (f->spesh_cand->jitcode && f->jit_entry_label) { MVMint32 num_deopts = f->spesh_cand->jitcode->num_deopts; MVMJitDeopt *deopts = f->spesh_cand->jitcode->deopts; void **labels = f->spesh_cand->jitcode->labels; MVMint32 i; for (i = 0; i < num_deopts; i++) { if (labels[deopts[i].label] == f->jit_entry_label) { /* Resolve offset and target. */ MVMint32 deopt_idx = deopts[i].idx; MVMint32 deopt_offset = f->spesh_cand->deopts[2 * deopt_idx + 1]; MVMint32 deopt_target = f->spesh_cand->deopts[2 * deopt_idx]; #if MVM_LOG_DEOPTS fprintf(stderr, "Found deopt label for JIT (%d) (label %d idx %d)\n", i, deopts[i].label, deopts[i].idx); #endif /* Re-create any frames needed if we're in an inline; if not, * just update return address. */ if (f->spesh_cand->inlines) { MVMROOT2(tc, f, l, { uninline(tc, f, f->spesh_cand, deopt_offset, deopt_target, l); }); } else { f->return_address = f->static_info->body.bytecode + deopt_target; } /* No spesh cand/slots needed now. */ deopt_named_args_used(tc, f); f->effective_spesh_slots = NULL; f->spesh_cand = NULL; f->jit_entry_label = NULL; break; } } #if MVM_LOG_DEOPTS if (i == num_deopts) fprintf(stderr, "JIT: can't find deopt all idx\n"); #endif } else { /* Not JITted; see if we can find the return address in the deopt table. */ MVMint32 ret_offset = f->return_address - f->spesh_cand->bytecode; MVMint32 n = f->spesh_cand->num_deopts * 2; MVMint32 i; for (i = 0; i < n; i += 2) { if (f->spesh_cand->deopts[i + 1] == ret_offset) { /* Re-create any frames needed if we're in an inline; if not, * just update return address. */ if (f->spesh_cand->inlines) { MVMROOT2(tc, f, l, { uninline(tc, f, f->spesh_cand, ret_offset, f->spesh_cand->deopts[i], l); }); } else { f->return_address = f->static_info->body.bytecode + f->spesh_cand->deopts[i]; } /* No spesh cand/slots needed now. */ f->effective_spesh_slots = NULL; f->spesh_cand = NULL; break; } } #if MVM_LOG_DEOPTS if (i == n) fprintf(stderr, "Interpreter: can't find deopt all idx\n"); #endif } } l = f; f = f->caller; } MVM_CHECK_CALLER_CHAIN(tc, tc->cur_frame); } MoarVM-2018.03/src/spesh/deopt.h0000644000175000017510000000037713237701240016406 0ustar samanthasamanthavoid MVM_spesh_deopt_all(MVMThreadContext *tc); void MVM_spesh_deopt_one(MVMThreadContext *tc, MVMuint32 deopt_target); void MVM_spesh_deopt_one_direct(MVMThreadContext *tc, MVMuint32 deopt_offset, MVMuint32 deopt_target); MoarVM-2018.03/src/spesh/dump.c0000644000175000017510000007604513237701240016240 0ustar samanthasamantha#include "moar.h" /* Auto-growing buffer. */ typedef struct { char *buffer; size_t alloc; size_t pos; } DumpStr; static void append(DumpStr *ds, char *to_add) { size_t len = strlen(to_add); if (ds->pos + len >= ds->alloc) { ds->alloc *= 4; if (ds->pos + len >= ds->alloc) ds->alloc += len; ds->buffer = MVM_realloc(ds->buffer, ds->alloc); } memcpy(ds->buffer + ds->pos, to_add, len); ds->pos += len; } static size_t tell_ds(DumpStr *ds) { return ds->pos; } static void rewind_ds(DumpStr *ds, size_t target) { if (ds->pos > target) { ds->pos = target; ds->buffer[ds->pos + 1] = '\0'; } } /* Formats a string and then appends it. */ MVM_FORMAT(printf, 2, 3) static void appendf(DumpStr *ds, const char *fmt, ...) { char *c_message = MVM_malloc(1024); va_list args; va_start(args, fmt); vsnprintf(c_message, 1023, fmt, args); append(ds, c_message); MVM_free(c_message); va_end(args); } /* Turns a MoarVM string into a C string and appends it. */ static void append_str(MVMThreadContext *tc, DumpStr *ds, MVMString *s) { char *cs = MVM_string_utf8_encode_C_string(tc, s); append(ds, cs); MVM_free(cs); } /* Appends a null at the end. */ static void append_null(DumpStr *ds) { append(ds, " "); /* Delegate realloc if we're really unlucky. */ ds->buffer[ds->pos - 1] = '\0'; } /* Dumps a basic block. */ static void dump_bb(MVMThreadContext *tc, DumpStr *ds, MVMSpeshGraph *g, MVMSpeshBB *bb) { MVMSpeshIns *cur_ins; MVMint64 i; /* Heading. */ appendf(ds, " BB %d (%p):\n", bb->idx, bb); if (bb->inlined) { append(ds, " Inlined\n"); } { /* Also, we have a line number */ MVMBytecodeAnnotation *bbba = MVM_bytecode_resolve_annotation(tc, &g->sf->body, bb->initial_pc); MVMuint32 line_number; if (bbba) { line_number = bbba->line_number; MVM_free(bbba); } else { line_number = -1; } appendf(ds, " line: %d (pc %d)\n", line_number, bb->initial_pc); } /* Instructions. */ append(ds, " Instructions:\n"); cur_ins = bb->first_ins; while (cur_ins) { MVMSpeshAnn *ann = cur_ins->annotations; MVMuint32 line_number; while (ann) { /* These four annotations carry a deopt index that we can find a * corresponding line number for */ if (ann->type == MVM_SPESH_ANN_DEOPT_ONE_INS || ann->type == MVM_SPESH_ANN_DEOPT_ALL_INS || ann->type == MVM_SPESH_ANN_DEOPT_INLINE || ann->type == MVM_SPESH_ANN_DEOPT_OSR) { MVMBytecodeAnnotation *ba = MVM_bytecode_resolve_annotation(tc, &g->sf->body, g->deopt_addrs[2 * ann->data.deopt_idx]); if (ba) { line_number = ba->line_number; MVM_free(ba); } else { line_number = -1; } } switch (ann->type) { case MVM_SPESH_ANN_FH_START: appendf(ds, " [Annotation: FH Start (%d)]\n", ann->data.frame_handler_index); break; case MVM_SPESH_ANN_FH_END: appendf(ds, " [Annotation: FH End (%d)]\n", ann->data.frame_handler_index); break; case MVM_SPESH_ANN_FH_GOTO: appendf(ds, " [Annotation: FH Goto (%d)]\n", ann->data.frame_handler_index); break; case MVM_SPESH_ANN_DEOPT_ONE_INS: appendf(ds, " [Annotation: INS Deopt One (idx %d -> pc %d; line %d)]\n", ann->data.deopt_idx, g->deopt_addrs[2 * ann->data.deopt_idx], line_number); break; case MVM_SPESH_ANN_DEOPT_ALL_INS: appendf(ds, " [Annotation: INS Deopt All (idx %d -> pc %d; line %d)]\n", ann->data.deopt_idx, g->deopt_addrs[2 * ann->data.deopt_idx], line_number); break; case MVM_SPESH_ANN_INLINE_START: appendf(ds, " [Annotation: Inline Start (%d)]\n", ann->data.inline_idx); break; case MVM_SPESH_ANN_INLINE_END: appendf(ds, " [Annotation: Inline End (%d)]\n", ann->data.inline_idx); break; case MVM_SPESH_ANN_DEOPT_INLINE: appendf(ds, " [Annotation: INS Deopt Inline (idx %d -> pc %d; line %d)]\n", ann->data.deopt_idx, g->deopt_addrs[2 * ann->data.deopt_idx], line_number); break; case MVM_SPESH_ANN_DEOPT_OSR: appendf(ds, " [Annotation: INS Deopt OSR (idx %d -> pc %d); line %d]\n", ann->data.deopt_idx, g->deopt_addrs[2 * ann->data.deopt_idx], line_number); break; case MVM_SPESH_ANN_LINENO: { char *cstr = MVM_string_utf8_encode_C_string(tc, MVM_cu_string(tc, g->sf->body.cu, ann->data.lineno.filename_string_index)); appendf(ds, " [Annotation: Line Number: %s:%d]\n", cstr, ann->data.lineno.line_number); MVM_free(cstr); break; } case MVM_SPESH_ANN_LOGGED: appendf(ds, " [Annotation: Logged (bytecode offset %d)]\n", ann->data.bytecode_offset); break; default: appendf(ds, " [Annotation: %d (unknown)]\n", ann->type); } ann = ann->next; } appendf(ds, " %-15s ", cur_ins->info->name); if (cur_ins->info->opcode == MVM_SSA_PHI) { for (i = 0; i < cur_ins->info->num_operands; i++) { MVMint16 orig = cur_ins->operands[i].reg.orig; MVMint16 regi = cur_ins->operands[i].reg.i; if (i) append(ds, ", "); if (orig < 10) append(ds, " "); if (regi < 10) append(ds, " "); appendf(ds, "r%d(%d)", orig, regi); } } else { for (i = 0; i < cur_ins->info->num_operands; i++) { if (i) append(ds, ", "); switch (cur_ins->info->operands[i] & MVM_operand_rw_mask) { case MVM_operand_read_reg: case MVM_operand_write_reg: { MVMint16 orig = cur_ins->operands[i].reg.orig; MVMint16 regi = cur_ins->operands[i].reg.i; if (orig < 10) append(ds, " "); if (regi < 10) append(ds, " "); appendf(ds, "r%d(%d)", orig, regi); break; } case MVM_operand_read_lex: case MVM_operand_write_lex: { MVMStaticFrameBody *cursor = &g->sf->body; MVMuint32 ascension; appendf(ds, "lex(idx=%d,outers=%d", cur_ins->operands[i].lex.idx, cur_ins->operands[i].lex.outers); for (ascension = 0; ascension < cur_ins->operands[i].lex.outers; ascension++, cursor = &cursor->outer->body) { }; if (cursor->fully_deserialized) { if (cur_ins->operands[i].lex.idx < cursor->num_lexicals) { char *cstr = MVM_string_utf8_encode_C_string(tc, cursor->lexical_names_list[cur_ins->operands[i].lex.idx]->key); appendf(ds, ",%s)", cstr); MVM_free(cstr); } else { append(ds, ",)"); } } else { append(ds, ",)"); } break; } case MVM_operand_literal: { MVMuint32 type = cur_ins->info->operands[i] & MVM_operand_type_mask; switch (type) { case MVM_operand_ins: { MVMint32 bb_idx = cur_ins->operands[i].ins_bb->idx; if (bb_idx < 100) append(ds, " "); if (bb_idx < 10) append(ds, " "); appendf(ds, "BB(%d)", bb_idx); break; } case MVM_operand_int8: appendf(ds, "liti8(%"PRId8")", cur_ins->operands[i].lit_i8); break; case MVM_operand_int16: appendf(ds, "liti16(%"PRId16")", cur_ins->operands[i].lit_i16); break; case MVM_operand_int32: appendf(ds, "liti32(%"PRId32")", cur_ins->operands[i].lit_i32); break; case MVM_operand_uint32: appendf(ds, "litui32(%"PRIu32")", cur_ins->operands[i].lit_ui32); break; case MVM_operand_int64: appendf(ds, "liti64(%"PRId64")", cur_ins->operands[i].lit_i64); break; case MVM_operand_num32: appendf(ds, "litn32(%f)", cur_ins->operands[i].lit_n32); break; case MVM_operand_num64: appendf(ds, "litn64(%g)", cur_ins->operands[i].lit_n64); break; case MVM_operand_str: { char *cstr = MVM_string_utf8_encode_C_string(tc, MVM_cu_string(tc, g->sf->body.cu, cur_ins->operands[i].lit_str_idx)); appendf(ds, "lits(%s)", cstr); MVM_free(cstr); break; } case MVM_operand_callsite: { MVMCallsite *callsite = g->sf->body.cu->body.callsites[cur_ins->operands[i].callsite_idx]; appendf(ds, "callsite(%p, %d arg, %d pos, %s, %s)", callsite, callsite->arg_count, callsite->num_pos, callsite->has_flattening ? "flattening" : "nonflattening", callsite->is_interned ? "interned" : "noninterned"); break; } case MVM_operand_spesh_slot: appendf(ds, "sslot(%"PRId16")", cur_ins->operands[i].lit_i16); break; case MVM_operand_coderef: { MVMCodeBody *body = &((MVMCode*)g->sf->body.cu->body.coderefs[cur_ins->operands[i].coderef_idx])->body; MVMBytecodeAnnotation *anno = MVM_bytecode_resolve_annotation(tc, &body->sf->body, 0); append(ds, "coderef("); if (anno) { char *filestr = MVM_string_utf8_encode_C_string(tc, MVM_cu_string(tc, g->sf->body.cu, anno->filename_string_heap_index)); appendf(ds, "%s:%d%s)", filestr, anno->line_number, body->outer ? " (closure)" : ""); MVM_free(filestr); } else { append(ds, "??\?)"); } MVM_free(anno); break; } default: append(ds, ""); } break; } default: append(ds, ""); } } if (cur_ins->info->opcode == MVM_OP_wval || cur_ins->info->opcode == MVM_OP_wval_wide) { /* We can try to find out what the debug_name of this thing is. */ MVMint16 dep = cur_ins->operands[1].lit_i16; MVMint64 idx; MVMCollectable *result = NULL; MVMSerializationContext *sc; char *debug_name = NULL; const char *repr_name = NULL; if (cur_ins->info->opcode == MVM_OP_wval) { idx = cur_ins->operands[2].lit_i16; } else { idx = cur_ins->operands[2].lit_i64; } sc = MVM_sc_get_sc(tc, g->sf->body.cu, dep); if (sc) result = (MVMCollectable *)MVM_sc_try_get_object(tc, sc, idx); if (result) { if (result->flags & MVM_CF_STABLE) { debug_name = MVM_6model_get_stable_debug_name(tc, (MVMSTable *)result); repr_name = ((MVMSTable *)result)->REPR->name; } else { debug_name = MVM_6model_get_debug_name(tc, (MVMObject *)result); repr_name = REPR(result)->name; } if (debug_name) { appendf(ds, " (%s: %s)", repr_name, debug_name); } else { appendf(ds, " (%s: ?)", repr_name); } } else { appendf(ds, " (not deserialized)"); } } } append(ds, "\n"); cur_ins = cur_ins->next; } /* Predecessors and successors. */ append(ds, " Successors: "); for (i = 0; i < bb->num_succ; i++) appendf(ds, (i == 0 ? "%d" : ", %d"), bb->succ[i]->idx); append(ds, "\n Predecessors: "); for (i = 0; i < bb->num_pred; i++) appendf(ds, (i == 0 ? "%d" : ", %d"), bb->pred[i]->idx); append(ds, "\n Dominance children: "); for (i = 0; i < bb->num_children; i++) appendf(ds, (i == 0 ? "%d" : ", %d"), bb->children[i]->idx); append(ds, "\n\n"); } /* Dumps the facts table. */ static void dump_facts(MVMThreadContext *tc, DumpStr *ds, MVMSpeshGraph *g) { MVMuint16 i, j, num_locals, num_facts; num_locals = g->num_locals; for (i = 0; i < num_locals; i++) { num_facts = g->fact_counts[i]; for (j = 0; j < num_facts; j++) { MVMint32 usages = g->facts[i][j].usages; MVMint32 flags = g->facts[i][j].flags; if (i < 10) append(ds, " "); if (j < 10) append(ds, " "); if (flags || g->facts[i][j].dead_writer || g->facts[i][j].writer && g->facts[i][j].writer->info->opcode == MVM_SSA_PHI) { appendf(ds, " r%d(%d): usages=%d, flags=%-5d", i, j, usages, flags); if (flags & 1) { append(ds, " KnTyp"); } if (flags & 2) { append(ds, " KnVal"); } if (flags & 4) { append(ds, " Dcntd"); } if (flags & 8) { append(ds, " Concr"); } if (flags & 16) { append(ds, " TyObj"); } if (flags & 32) { append(ds, " KnDcT"); } if (flags & 64) { append(ds, " DCncr"); } if (flags & 128) { append(ds, " DcTyO"); } if (flags & 256) { append(ds, " LogGd"); } if (flags & 512) { append(ds, " HashI"); } if (flags & 1024) { append(ds, " ArrIt"); } if (flags & 2048) { append(ds, " KBxSr"); } if (flags & 4096) { append(ds, " MgWLG"); } if (flags & 8192) { append(ds, " KRWCn"); } if (g->facts[i][j].dead_writer) { append(ds, " DeadWriter"); } if (g->facts[i][j].writer && g->facts[i][j].writer->info->opcode == MVM_SSA_PHI) { appendf(ds, " (merged from %d regs)", g->facts[i][j].writer->info->num_operands - 1); } } else appendf(ds, " r%d(%d): usages=%d, flags=%d", i, j, usages, flags); append(ds, "\n"); } append(ds, "\n"); } } static void dump_callsite(MVMThreadContext *tc, DumpStr *ds, MVMCallsite *cs) { MVMuint16 i; appendf(ds, "Callsite %p (%d args, %d pos)\n", cs, cs->arg_count, cs->num_pos); for (i = 0; i < (cs->arg_count - cs->num_pos) / 2; i++) { if (cs->arg_names[i]) { char * argname_utf8 = MVM_string_utf8_encode_C_string(tc, cs->arg_names[i]); appendf(ds, " - %s\n", argname_utf8); MVM_free(argname_utf8); } } if (cs->num_pos) append(ds, "Positional flags: "); for (i = 0; i < cs->num_pos; i++) { MVMCallsiteEntry arg_flag = cs->arg_flags[i]; if (i) append(ds, ", "); if (arg_flag == MVM_CALLSITE_ARG_OBJ) { append(ds, "obj"); } else if (arg_flag == MVM_CALLSITE_ARG_INT) { append(ds, "int"); } else if (arg_flag == MVM_CALLSITE_ARG_NUM) { append(ds, "num"); } else if (arg_flag == MVM_CALLSITE_ARG_STR) { append(ds, "str"); } } if (cs->num_pos) append(ds, "\n"); append(ds, "\n"); } static void dump_fileinfo(MVMThreadContext *tc, DumpStr *ds, MVMStaticFrame *sf) { MVMBytecodeAnnotation *ann = MVM_bytecode_resolve_annotation(tc, &sf->body, 0); MVMCompUnit *cu = sf->body.cu; MVMint32 str_idx = ann ? ann->filename_string_heap_index : 0; MVMint32 line_nr = ann ? ann->line_number : 1; MVMString *filename = cu->body.filename; char *filename_utf8 = ""; if (ann && str_idx < cu->body.num_strings) { filename = MVM_cu_string(tc, cu, str_idx); } if (filename) filename_utf8 = MVM_string_utf8_encode_C_string(tc, filename); appendf(ds, "%s:%d", filename_utf8, line_nr); if (filename) MVM_free(filename_utf8); MVM_free(ann); } /* Dump a spesh graph into string form, for debugging purposes. */ char * MVM_spesh_dump(MVMThreadContext *tc, MVMSpeshGraph *g) { MVMSpeshBB *cur_bb; /* Allocate buffer. */ DumpStr ds; ds.alloc = 8192; ds.buffer = MVM_malloc(ds.alloc); ds.pos = 0; /* Dump name and CUID. */ append(&ds, "Spesh of '"); append_str(tc, &ds, g->sf->body.name); append(&ds, "' (cuid: "); append_str(tc, &ds, g->sf->body.cuuid); append(&ds, ", file: "); dump_fileinfo(tc, &ds, g->sf); append(&ds, ")\n"); if (g->cs) dump_callsite(tc, &ds, g->cs); if (!g->cs) append(&ds, "\n"); /* Go over all the basic blocks and dump them. */ cur_bb = g->entry; while (cur_bb) { dump_bb(tc, &ds, g, cur_bb); cur_bb = cur_bb->linear_next; } /* Dump facts. */ if (g->facts) { append(&ds, "\nFacts:\n"); dump_facts(tc, &ds, g); } /* Dump spesh slots. */ if (g->num_spesh_slots) { MVMuint32 i; append(&ds, "\nSpesh slots:\n"); for (i = 0; i < g->num_spesh_slots; i++) { MVMCollectable *value = g->spesh_slots[i]; if (value == NULL) appendf(&ds, " %d = NULL\n", i); else if (value->flags & MVM_CF_STABLE) appendf(&ds, " %d = STable (%s)\n", i, MVM_6model_get_stable_debug_name(tc, (MVMSTable *)value)); else if (value->flags & MVM_CF_TYPE_OBJECT) appendf(&ds, " %d = Type Object (%s)\n", i, MVM_6model_get_debug_name(tc, (MVMObject *)value)); else appendf(&ds, " %d = Instance (%s)\n", i, MVM_6model_get_debug_name(tc, (MVMObject *)value)); } } append(&ds, "\n"); append_null(&ds); return ds.buffer; } /* Dumps a spesh stats type typle. */ void dump_stats_type_tuple(MVMThreadContext *tc, DumpStr *ds, MVMCallsite *cs, MVMSpeshStatsType *type_tuple, char *prefix) { MVMuint32 j; for (j = 0; j < cs->flag_count; j++) { MVMObject *type = type_tuple[j].type; if (type) { MVMObject *decont_type = type_tuple[j].decont_type; appendf(ds, "%sType %d: %s%s (%s)", prefix, j, (type_tuple[j].rw_cont ? "RW " : ""), MVM_6model_get_stable_debug_name(tc, type->st), (type_tuple[j].type_concrete ? "Conc" : "TypeObj")); if (decont_type) appendf(ds, " of %s (%s)", MVM_6model_get_stable_debug_name(tc, decont_type->st), (type_tuple[j].decont_type_concrete ? "Conc" : "TypeObj")); append(ds, "\n"); } } } /* Dumps the statistics associated with a particular callsite object. */ void dump_stats_by_callsite(MVMThreadContext *tc, DumpStr *ds, MVMSpeshStatsByCallsite *css) { MVMuint32 i, j, k; if (css->cs) dump_callsite(tc, ds, css->cs); else append(ds, "No interned callsite\n"); appendf(ds, " Callsite hits: %d\n\n", css->hits); if (css->osr_hits) appendf(ds, " OSR hits: %d\n\n", css->osr_hits); appendf(ds, " Maximum stack depth: %d\n\n", css->max_depth); for (i = 0; i < css->num_by_type; i++) { MVMSpeshStatsByType *tss = &(css->by_type[i]); appendf(ds, " Type tuple %d\n", i); dump_stats_type_tuple(tc, ds, css->cs, tss->arg_types, " "); appendf(ds, " Hits: %d\n", tss->hits); if (tss->osr_hits) appendf(ds, " OSR hits: %d\n", tss->osr_hits); appendf(ds, " Maximum stack depth: %d\n", tss->max_depth); if (tss->num_by_offset) { append(ds, " Logged at offset:\n"); for (j = 0; j < tss->num_by_offset; j++) { MVMSpeshStatsByOffset *oss = &(tss->by_offset[j]); appendf(ds, " %d:\n", oss->bytecode_offset); for (k = 0; k < oss->num_types; k++) appendf(ds, " %d x type %s (%s)\n", oss->types[k].count, MVM_6model_get_stable_debug_name(tc, oss->types[k].type->st), (oss->types[k].type_concrete ? "Conc" : "TypeObj")); for (k = 0; k < oss->num_invokes; k++) appendf(ds, " %d x static frame '%s' (%s) (caller is outer: %d, multi %d)\n", oss->invokes[k].count, MVM_string_utf8_encode_C_string(tc, oss->invokes[k].sf->body.name), MVM_string_utf8_encode_C_string(tc, oss->invokes[k].sf->body.cuuid), oss->invokes[k].caller_is_outer_count, oss->invokes[k].was_multi_count); for (k = 0; k < oss->num_type_tuples; k++) { appendf(ds, " %d x type tuple:\n", oss->type_tuples[k].count); dump_stats_type_tuple(tc, ds, oss->type_tuples[k].cs, oss->type_tuples[k].arg_types, " "); } } } append(ds, "\n"); } } /* Dumps the statistics associated with a static frame into a string. */ char * MVM_spesh_dump_stats(MVMThreadContext *tc, MVMStaticFrame *sf) { MVMSpeshStats *ss = sf->body.spesh->body.spesh_stats; DumpStr ds; ds.alloc = 8192; ds.buffer = MVM_malloc(ds.alloc); ds.pos = 0; /* Dump name and CUID. */ append(&ds, "Latest statistics for '"); append_str(tc, &ds, sf->body.name); append(&ds, "' (cuid: "); append_str(tc, &ds, sf->body.cuuid); append(&ds, ", file: "); dump_fileinfo(tc, &ds, sf); append(&ds, ")\n\n"); /* Dump the spesh stats if present. */ if (ss) { MVMuint32 i; appendf(&ds, "Total hits: %d\n", ss->hits); if (ss->osr_hits) appendf(&ds, "OSR hits: %d\n", ss->osr_hits); append(&ds, "\n"); for (i = 0; i < ss->num_by_callsite; i++) dump_stats_by_callsite(tc, &ds, &(ss->by_callsite[i])); if (ss->num_static_values) { append(&ds, "Static values:\n"); for (i = 0; i < ss->num_static_values; i++) appendf(&ds, " - %s (%p) @ %d\n", MVM_6model_get_stable_debug_name(tc, ss->static_values[i].value->st), ss->static_values[i].value, ss->static_values[i].bytecode_offset); } } else { append(&ds, "No spesh stats for this static frame\n"); } append(&ds, "\n"); append_null(&ds); return ds.buffer; } /* Dumps a planned specialization into a string. */ char * MVM_spesh_dump_planned(MVMThreadContext *tc, MVMSpeshPlanned *p) { DumpStr ds; ds.alloc = 8192; ds.buffer = MVM_malloc(ds.alloc); ds.pos = 0; /* Dump kind of specialization and target. */ switch (p->kind) { case MVM_SPESH_PLANNED_CERTAIN: append(&ds, "Certain"); break; case MVM_SPESH_PLANNED_OBSERVED_TYPES: append(&ds, "Observed type"); break; case MVM_SPESH_PLANNED_DERIVED_TYPES: append(&ds, "Derived type"); break; } append(&ds, " specialization of '"); append_str(tc, &ds, p->sf->body.name); append(&ds, "' (cuid: "); append_str(tc, &ds, p->sf->body.cuuid); append(&ds, ", file: "); dump_fileinfo(tc, &ds, p->sf); append(&ds, ")\n\n"); /* Dump the callsite of the specialization. */ if (p->cs_stats->cs) { append(&ds, "The specialization is for the callsite:\n"); dump_callsite(tc, &ds, p->cs_stats->cs); } else { append(&ds, "The specialization is for when there is no interned callsite.\n"); } /* Dump reasoning. */ switch (p->kind) { case MVM_SPESH_PLANNED_CERTAIN: if (p->cs_stats->hits >= MVM_spesh_threshold(tc, p->sf)) appendf(&ds, "It was planned due to the callsite receiving %u hits.\n", p->cs_stats->hits); else if (p->cs_stats->osr_hits >= MVM_SPESH_PLAN_CS_MIN_OSR) appendf(&ds, "It was planned due to the callsite receiving %u OSR hits.\n", p->cs_stats->osr_hits); else append(&ds, "It was planned for unknown reasons.\n"); break; case MVM_SPESH_PLANNED_OBSERVED_TYPES: { MVMCallsite *cs = p->cs_stats->cs; MVMuint32 hit_percent = p->cs_stats->hits ? (100 * p->type_stats[0]->hits) / p->cs_stats->hits : 0; MVMuint32 osr_hit_percent = p->cs_stats->osr_hits ? (100 * p->type_stats[0]->osr_hits) / p->cs_stats->osr_hits : 0; append(&ds, "It was planned for the type tuple:\n"); dump_stats_type_tuple(tc, &ds, cs, p->type_tuple, " "); if (osr_hit_percent >= MVM_SPESH_PLAN_TT_OBS_PERCENT_OSR) appendf(&ds, "Which received %u OSR hits (%u%% of the %u callsite OSR hits).\n", p->type_stats[0]->osr_hits, osr_hit_percent, p->cs_stats->osr_hits); else if (hit_percent >= MVM_SPESH_PLAN_TT_OBS_PERCENT) appendf(&ds, "Which received %u hits (%u%% of the %u callsite hits).\n", p->type_stats[0]->hits, hit_percent, p->cs_stats->hits); else append(&ds, "For unknown reasons.\n"); break; } case MVM_SPESH_PLANNED_DERIVED_TYPES: break; } appendf(&ds, "\nThe maximum stack depth is %d.\n\n", p->max_depth); append_null(&ds); return ds.buffer; } /* Dumps a static frame's guard set into a string. */ char * MVM_spesh_dump_arg_guard(MVMThreadContext *tc, MVMStaticFrame *sf) { MVMSpeshArgGuard *ag = sf->body.spesh->body.spesh_arg_guard; DumpStr ds; ds.alloc = 8192; ds.buffer = MVM_malloc(ds.alloc); ds.pos = 0; /* Dump name and CUID. */ append(&ds, "Latest guard tree for '"); append_str(tc, &ds, sf->body.name); append(&ds, "' (cuid: "); append_str(tc, &ds, sf->body.cuuid); append(&ds, ", file: "); dump_fileinfo(tc, &ds, sf); append(&ds, ")\n\n"); /* Dump nodes. */ if (ag) { MVMuint32 i = 0; for (i = 0; i < ag->used_nodes; i++) { MVMSpeshArgGuardNode *agn = &(ag->nodes[i]); switch (agn->op) { case MVM_SPESH_GUARD_OP_CALLSITE: appendf(&ds, "%u: CALLSITE %p | Y: %u, N: %u\n", i, agn->cs, agn->yes, agn->no); break; case MVM_SPESH_GUARD_OP_LOAD_ARG: appendf(&ds, "%u: LOAD ARG %d | Y: %u\n", i, agn->arg_index, agn->yes); break; case MVM_SPESH_GUARD_OP_STABLE_CONC: appendf(&ds, "%u: STABLE CONC %s | Y: %u, N: %u\n", i, MVM_6model_get_stable_debug_name(tc, agn->st), agn->yes, agn->no); break; case MVM_SPESH_GUARD_OP_STABLE_TYPE: appendf(&ds, "%u: STABLE CONC %s | Y: %u, N: %u\n", i, MVM_6model_get_stable_debug_name(tc, agn->st), agn->yes, agn->no); break; case MVM_SPESH_GUARD_OP_DEREF_VALUE: appendf(&ds, "%u: DEREF_VALUE %u | Y: %u, N: %u\n", i, agn->offset, agn->yes, agn->no); break; case MVM_SPESH_GUARD_OP_DEREF_RW: appendf(&ds, "%u: DEREF_RW %u | Y: %u, N: %u\n", i, agn->offset, agn->yes, agn->no); break; case MVM_SPESH_GUARD_OP_CERTAIN_RESULT: appendf(&ds, "%u: CERTAIN RESULT %u\n", i, agn->result); break; case MVM_SPESH_GUARD_OP_RESULT: appendf(&ds, "%u: RESULT %u\n", i, agn->result); break; } } } else { append(&ds, "No argument guard nodes\n"); } append(&ds, "\n"); append_null(&ds); return ds.buffer; } MoarVM-2018.03/src/spesh/dump.h0000644000175000017510000000050613237701240016232 0ustar samanthasamanthaMVM_PUBLIC char * MVM_spesh_dump(MVMThreadContext *tc, MVMSpeshGraph *g); MVM_PUBLIC char * MVM_spesh_dump_stats(MVMThreadContext *tc, MVMStaticFrame *sf); MVM_PUBLIC char * MVM_spesh_dump_planned(MVMThreadContext *tc, MVMSpeshPlanned *p); MVM_PUBLIC char * MVM_spesh_dump_arg_guard(MVMThreadContext *tc, MVMStaticFrame *sf); MoarVM-2018.03/src/spesh/facts.c0000644000175000017510000006556613242626641016410 0ustar samanthasamantha#include "moar.h" /* The code in this file walks the spesh graph, recording facts we discover * about each version of each local variable, and propagating the info as it * can. */ /* Copies facts from one var to another. */ static void copy_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMuint16 to_orig, MVMuint16 to_i, MVMuint16 from_orig, MVMuint16 from_i) { MVMSpeshFacts *tfacts = &g->facts[to_orig][to_i]; MVMSpeshFacts *ffacts = &g->facts[from_orig][from_i]; tfacts->flags = ffacts->flags; tfacts->type = ffacts->type; tfacts->decont_type = ffacts->decont_type; tfacts->value = ffacts->value; tfacts->log_guard = ffacts->log_guard; } /* Called when one set of facts depend on another, allowing any log guard * that is to thank to be marked used as needed later on. */ void MVM_spesh_facts_depend(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshFacts *target, MVMSpeshFacts *source) { if (source->flags & MVM_SPESH_FACT_FROM_LOG_GUARD) { target->flags |= MVM_SPESH_FACT_FROM_LOG_GUARD; target->log_guard = source->log_guard; } } /* Handles object-creating instructions. */ static void create_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMuint16 obj_orig, MVMuint16 obj_i, MVMuint16 type_orig, MVMuint16 type_i) { MVMSpeshFacts *type_facts = &(g->facts[type_orig][type_i]); MVMSpeshFacts *obj_facts = &(g->facts[obj_orig][obj_i]); /* The type is carried. */ if (type_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE) { obj_facts->type = type_facts->type; obj_facts->flags |= MVM_SPESH_FACT_KNOWN_TYPE; MVM_spesh_facts_depend(tc, g, obj_facts, type_facts); } /* We know it's a concrete object. */ obj_facts->flags |= MVM_SPESH_FACT_CONCRETE; /* If we know the type object, then we can check to see if * it's a container type. */ if (type_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE) { MVMObject *type = type_facts->type; if (type && !STABLE(type)->container_spec) obj_facts->flags |= MVM_SPESH_FACT_DECONTED; } } static void create_facts_with_type(MVMThreadContext *tc, MVMSpeshGraph *g, MVMuint16 obj_orig, MVMuint16 obj_i, MVMObject *type) { MVMSpeshFacts *obj_facts = &(g->facts[obj_orig][obj_i]); /* The type is carried. */ obj_facts->type = type; obj_facts->flags |= MVM_SPESH_FACT_KNOWN_TYPE; /* We know it's a concrete object. */ obj_facts->flags |= MVM_SPESH_FACT_CONCRETE; /* If we know the type object, then we can check to see if * it's a container type. */ if (type && !STABLE(type)->container_spec) obj_facts->flags |= MVM_SPESH_FACT_DECONTED; } /* Adds facts from knowing the exact value being put into an object local. */ static void object_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMuint16 tgt_orig, MVMuint16 tgt_i, MVMObject *obj) { /* Ensure it's non-null. */ if (!obj) return; /* Set the value itself. */ g->facts[tgt_orig][tgt_i].value.o = obj; g->facts[tgt_orig][tgt_i].flags |= MVM_SPESH_FACT_KNOWN_VALUE; /* We also know the type. */ g->facts[tgt_orig][tgt_i].type = STABLE(obj)->WHAT; g->facts[tgt_orig][tgt_i].flags |= MVM_SPESH_FACT_KNOWN_TYPE; /* Set concreteness and decontainerized flags. */ if (IS_CONCRETE(obj)) { g->facts[tgt_orig][tgt_i].flags |= MVM_SPESH_FACT_CONCRETE; if (!STABLE(obj)->container_spec) g->facts[tgt_orig][tgt_i].flags |= MVM_SPESH_FACT_DECONTED; } else { g->facts[tgt_orig][tgt_i].flags |= MVM_SPESH_FACT_TYPEOBJ | MVM_SPESH_FACT_DECONTED; } } /* Propagates information relating to decontainerization. */ static void decont_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins, MVMuint16 out_orig, MVMuint16 out_i, MVMuint16 in_orig, MVMuint16 in_i) { MVMSpeshFacts *out_facts = &(g->facts[out_orig][out_i]); MVMSpeshFacts *in_facts = &(g->facts[in_orig][in_i]); /* If we know the original is decontainerized already, just copy its * info. */ MVMint32 in_flags = in_facts->flags; if (in_flags & MVM_SPESH_FACT_DECONTED) copy_facts(tc, g, out_orig, out_i, in_orig, in_i); /* We know the result is decontainerized. */ out_facts->flags |= MVM_SPESH_FACT_DECONTED; /* We may also know the original was containerized, and have some facts * about its contents. */ if (in_flags & MVM_SPESH_FACT_KNOWN_DECONT_TYPE) { out_facts->type = in_facts->decont_type; out_facts->flags |= MVM_SPESH_FACT_KNOWN_TYPE; } if (in_flags & MVM_SPESH_FACT_DECONT_CONCRETE) out_facts->flags |= MVM_SPESH_FACT_CONCRETE; else if (in_flags & MVM_SPESH_FACT_DECONT_TYPEOBJ) out_facts->flags |= MVM_SPESH_FACT_TYPEOBJ; if (in_flags & (MVM_SPESH_FACT_KNOWN_DECONT_TYPE | MVM_SPESH_FACT_DECONT_CONCRETE | MVM_SPESH_FACT_DECONT_TYPEOBJ)) MVM_spesh_facts_depend(tc, g, out_facts, in_facts); } /* Looks up a wval and adds information based on it. */ static void wval_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMuint16 tgt_orig, MVMuint16 tgt_i, MVMuint16 dep, MVMint64 idx) { MVMCompUnit *cu = g->sf->body.cu; if (dep < cu->body.num_scs) { MVMSerializationContext *sc = MVM_sc_get_sc(tc, cu, dep); if (sc) object_facts(tc, g, tgt_orig, tgt_i, MVM_sc_try_get_object(tc, sc, idx)); } } /* Let's figure out what exact type of iter we'll get from an iter op */ static void iter_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMuint16 out_orig, MVMuint16 out_i, MVMuint16 in_orig, MVMuint16 in_i) { MVMSpeshFacts *out_facts = &(g->facts[out_orig][out_i]); MVMSpeshFacts *in_facts = &(g->facts[in_orig][in_i]); if (in_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE) { switch (REPR(in_facts->type)->ID) { case MVM_REPR_ID_VMArray: out_facts->type = g->sf->body.cu->body.hll_config->array_iterator_type; out_facts->flags |= MVM_SPESH_FACT_ARRAY_ITER; break; case MVM_REPR_ID_MVMHash: case MVM_REPR_ID_MVMContext: out_facts->type = g->sf->body.cu->body.hll_config->hash_iterator_type; out_facts->flags |= MVM_SPESH_FACT_HASH_ITER; break; default: return; } out_facts->flags |= MVM_SPESH_FACT_KNOWN_TYPE | MVM_SPESH_FACT_CONCRETE; } } /* constant ops on literals give us a specialize-time-known value */ static void literal_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins) { MVMSpeshFacts *tgt_facts = &g->facts[ins->operands[0].reg.orig][ins->operands[0].reg.i]; switch (ins->info->opcode) { case MVM_OP_const_i64: tgt_facts->value.i = ins->operands[1].lit_i64; break; case MVM_OP_const_i32: tgt_facts->value.i = ins->operands[1].lit_i32; break; case MVM_OP_const_i16: tgt_facts->value.i = ins->operands[1].lit_i16; break; case MVM_OP_const_i8: tgt_facts->value.i = ins->operands[1].lit_i8; break; case MVM_OP_const_n32: tgt_facts->value.n = ins->operands[1].lit_n32; break; case MVM_OP_const_n64: tgt_facts->value.n = ins->operands[1].lit_n64; break; case MVM_OP_const_i64_32: tgt_facts->value.i = ins->operands[1].lit_i32; break; case MVM_OP_const_i64_16: tgt_facts->value.i = ins->operands[1].lit_i16; break; case MVM_OP_const_s: tgt_facts->value.s = MVM_cu_string(tc, g->sf->body.cu, ins->operands[1].lit_str_idx); break; default: return; } tgt_facts->flags |= MVM_SPESH_FACT_KNOWN_VALUE; } /* Discover facts from extops. */ static void discover_extop(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins) { MVMExtOpRecord *extops = g->sf->body.cu->body.extops; MVMuint16 num_extops = g->sf->body.cu->body.num_extops; MVMuint16 i; for (i = 0; i < num_extops; i++) { if (extops[i].info == ins->info) { /* Found op; call its discovery function, if any. */ if (extops[i].discover) extops[i].discover(tc, g, ins); return; } } } /* Considers logged types and, if they are stable, adds facts and a guard. */ static void log_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins, MVMSpeshPlanned *p, MVMSpeshAnn *deopt_one_ann, MVMSpeshAnn *logged_ann) { /* See if we have stable type information. For now, we need consistent * types, since a mis-match will force a deopt. In the future we may be * able to do Basic Block Versioning inspired tricks, like producing two * different code paths ahead when there are a small number of options. */ MVMObject *agg_type = NULL; MVMuint32 agg_type_count = 0; MVMuint32 agg_type_object = 0; MVMuint32 agg_concrete = 0; MVMuint32 i; for (i = 0; i < p->num_type_stats; i++) { MVMSpeshStatsByType *ts = p->type_stats[i]; MVMuint32 j; for (j = 0; j < ts->num_by_offset; j++) { if (ts->by_offset[j].bytecode_offset == logged_ann->data.bytecode_offset) { /* Go over the logged types. */ MVMuint32 num_types = ts->by_offset[j].num_types; MVMuint32 k; for (k = 0; k < num_types; k++) { /* If it's inconsistent with the aggregated type so far, * then first check if the type we're now seeing is either * massively more popular or massively less popular. If * massively less, disregard this one. If massively more, * disregard the previous one. Otherwise, tot up the type * object vs. concrete. */ MVMObject *cur_type = ts->by_offset[j].types[k].type; MVMuint32 count = ts->by_offset[j].types[k].count; if (agg_type) { if (agg_type != cur_type) { if (count > 100 * agg_type_count) { /* This one is hugely more popular. */ agg_type = cur_type; agg_type_count = 0; agg_concrete = 0; agg_type_object = 0; } else if (agg_type_count > 100 * count) { /* This one is hugely less popular. */ continue; } else { /* Unstable types. */ return; } } } else { agg_type = cur_type; } agg_type_count += count; if (ts->by_offset[j].types[k].type_concrete) agg_concrete++; else agg_type_object++; } /* No need to consider searching after this offset. */ break; } } } if (agg_type) { MVMSpeshIns *guard; MVMSpeshAnn *ann; MVMuint16 guard_op; /* Add facts and choose guard op. */ MVMSpeshFacts *facts = &g->facts[ins->operands[0].reg.orig][ins->operands[0].reg.i]; facts->type = agg_type; facts->flags |= MVM_SPESH_FACT_KNOWN_TYPE; if (agg_concrete && !agg_type_object) { facts->flags |= MVM_SPESH_FACT_CONCRETE; if (!agg_type->st->container_spec) facts->flags |= MVM_SPESH_FACT_DECONTED; guard_op = MVM_OP_sp_guardconc; } else if (agg_type_object && !agg_concrete) { facts->flags |= MVM_SPESH_FACT_TYPEOBJ | MVM_SPESH_FACT_DECONTED; guard_op = MVM_OP_sp_guardtype; } else { if (!agg_type->st->container_spec) facts->flags |= MVM_SPESH_FACT_DECONTED; guard_op = MVM_OP_sp_guard; } /* Insert guard instruction. */ guard = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); guard->info = MVM_op_get_op(guard_op); guard->operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand)); guard->operands[0] = ins->operands[0]; guard->operands[1].lit_i16 = MVM_spesh_add_spesh_slot_try_reuse(tc, g, (MVMCollectable *)agg_type->st); guard->operands[2].lit_ui32 = g->deopt_addrs[2 * deopt_one_ann->data.deopt_idx]; if (ins->next) MVM_spesh_manipulate_insert_ins(tc, bb, ins, guard); else MVM_spesh_manipulate_insert_ins(tc, bb->linear_next, NULL, guard); /* Move deopt annotation to the guard instruction. */ ann = ins->annotations; if (ann == deopt_one_ann) { ins->annotations = ann->next; } else { while (ann) { if (ann->next == deopt_one_ann) { ann->next = deopt_one_ann->next; break; } ann = ann->next; } } deopt_one_ann->next = NULL; guard->annotations = deopt_one_ann; /* Add entry in log guards table, and mark facts as depending on it. */ if (g->num_log_guards % 16 == 0) { MVMSpeshLogGuard *orig_log_guards = g->log_guards; g->log_guards = MVM_spesh_alloc(tc, g, (g->num_log_guards + 16) * sizeof(MVMSpeshLogGuard)); if (orig_log_guards) memcpy(g->log_guards, orig_log_guards, g->num_log_guards * sizeof(MVMSpeshLogGuard)); } g->log_guards[g->num_log_guards].ins = guard; g->log_guards[g->num_log_guards].bb = ins->next ? bb : bb->linear_next; facts->flags |= MVM_SPESH_FACT_FROM_LOG_GUARD; facts->log_guard = g->num_log_guards; g->num_log_guards++; } } /* Visits the blocks in dominator tree order, recursively. */ static void add_bb_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshPlanned *p, MVMint32 cur_deopt_idx) { MVMint32 i, is_phi; /* Look for instructions that provide or propagate facts. */ MVMSpeshIns *ins = bb->first_ins; while (ins) { /* See if there's deopt and logged annotations. Sync cur_deopt_idx * and, for logged+deopt-one, add logged facts and guards. */ MVMSpeshAnn *ann = ins->annotations; MVMSpeshAnn *ann_deopt_one = NULL; MVMSpeshAnn *ann_logged = NULL; MVMint32 is_deopt_ins = 0; while (ann) { switch (ann->type) { case MVM_SPESH_ANN_DEOPT_ONE_INS: ann_deopt_one = ann; cur_deopt_idx = ann->data.deopt_idx; is_deopt_ins = 1; break; case MVM_SPESH_ANN_DEOPT_ALL_INS: cur_deopt_idx = ann->data.deopt_idx; break; case MVM_SPESH_ANN_LOGGED: ann_logged = ann; } ann = ann->next; } if (ann_deopt_one && ann_logged) log_facts(tc, g, bb, ins, p, ann_deopt_one, ann_logged); /* Look through operands for reads and writes. */ is_phi = ins->info->opcode == MVM_SSA_PHI; for (i = 0; i < ins->info->num_operands; i++) { /* Reads need usage tracking; if the read is after a deopt point * relative to the write then give it an extra usage bump. */ if ((is_phi && i > 0) || (!is_phi && (ins->info->operands[i] & MVM_operand_rw_mask) == MVM_operand_read_reg)) { MVMSpeshFacts *facts = &(g->facts[ins->operands[i].reg.orig][ins->operands[i].reg.i]); facts->usages += facts->deopt_idx == cur_deopt_idx ? 1 : 2; } /* Writes need the current deopt index and the writing instruction * to be specified. A write that's on a deopt instruction bumps * the usage too. */ if ((is_phi && i == 0) || (!is_phi && (ins->info->operands[i] & MVM_operand_rw_mask) == MVM_operand_write_reg)) { MVMSpeshFacts *facts = &(g->facts[ins->operands[i].reg.orig][ins->operands[i].reg.i]); facts->deopt_idx = cur_deopt_idx; facts->writer = ins; if (is_deopt_ins) facts->usages++; } } /* Look for ops that are fact-interesting. */ switch (ins->info->opcode) { case MVM_OP_inc_i: case MVM_OP_inc_u: case MVM_OP_dec_i: case MVM_OP_dec_u: /* These all read as well as write a value, so bump usages. */ g->facts[ins->operands[0].reg.orig][ins->operands[0].reg.i - 1].usages++; break; case MVM_OP_set: copy_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, ins->operands[1].reg.orig, ins->operands[1].reg.i); break; case MVM_OP_create: create_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, ins->operands[1].reg.orig, ins->operands[1].reg.i); break; case MVM_OP_clone: copy_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, ins->operands[1].reg.orig, ins->operands[1].reg.i); break; case MVM_OP_box_s: case MVM_OP_box_i: case MVM_OP_box_n: { MVMSpeshFacts *target_facts = &(g->facts[ins->operands[0].reg.orig][ins->operands[0].reg.i]); create_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, ins->operands[2].reg.orig, ins->operands[2].reg.i); target_facts->flags |= MVM_SPESH_FACT_KNOWN_BOX_SRC; break; } case MVM_OP_add_I: case MVM_OP_sub_I: case MVM_OP_mul_I: case MVM_OP_div_I: case MVM_OP_mod_I: create_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, ins->operands[3].reg.orig, ins->operands[3].reg.i); break; case MVM_OP_neg_I: case MVM_OP_abs_I: create_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, ins->operands[2].reg.orig, ins->operands[2].reg.i); break; case MVM_OP_bootint: object_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, tc->instance->boot_types.BOOTInt); break; case MVM_OP_bootnum: object_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, tc->instance->boot_types.BOOTNum); break; case MVM_OP_bootstr: object_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, tc->instance->boot_types.BOOTStr); break; case MVM_OP_bootarray: object_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, tc->instance->boot_types.BOOTArray); break; case MVM_OP_bootintarray: object_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, tc->instance->boot_types.BOOTIntArray); break; case MVM_OP_bootnumarray: object_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, tc->instance->boot_types.BOOTNumArray); break; case MVM_OP_bootstrarray: object_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, tc->instance->boot_types.BOOTStrArray); break; case MVM_OP_boothash: object_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, tc->instance->boot_types.BOOTHash); break; case MVM_OP_hllboxtype_i: object_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, g->sf->body.cu->body.hll_config->int_box_type); break; case MVM_OP_hllboxtype_n: object_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, g->sf->body.cu->body.hll_config->num_box_type); break; case MVM_OP_hllboxtype_s: object_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, g->sf->body.cu->body.hll_config->str_box_type); break; case MVM_OP_hlllist: object_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, g->sf->body.cu->body.hll_config->slurpy_array_type); break; case MVM_OP_hllhash: object_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, g->sf->body.cu->body.hll_config->slurpy_hash_type); break; case MVM_OP_decont: decont_facts(tc, g, ins, ins->operands[0].reg.orig, ins->operands[0].reg.i, ins->operands[1].reg.orig, ins->operands[1].reg.i); break; case MVM_OP_wval: wval_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, ins->operands[1].lit_i16, ins->operands[2].lit_i16); break; case MVM_OP_wval_wide: wval_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, ins->operands[1].lit_i16, ins->operands[2].lit_i64); break; case MVM_OP_iter: iter_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, ins->operands[1].reg.orig, ins->operands[1].reg.i); break; case MVM_OP_newexception: create_facts_with_type(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, tc->instance->boot_types.BOOTException); break; case MVM_OP_getlexref_i: case MVM_OP_getlexref_i32: case MVM_OP_getlexref_i16: case MVM_OP_getlexref_i8: case MVM_OP_getlexref_u32: case MVM_OP_getlexref_u16: case MVM_OP_getlexref_u8: create_facts_with_type(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, g->sf->body.cu->body.hll_config->int_lex_ref); break; case MVM_OP_getlexref_n: case MVM_OP_getlexref_n32: create_facts_with_type(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, g->sf->body.cu->body.hll_config->num_lex_ref); break; case MVM_OP_getlexref_s: create_facts_with_type(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, g->sf->body.cu->body.hll_config->str_lex_ref); break; case MVM_OP_getattrref_i: case MVM_OP_getattrsref_i: create_facts_with_type(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, g->sf->body.cu->body.hll_config->int_attr_ref); break; case MVM_OP_getattrref_n: case MVM_OP_getattrsref_n: create_facts_with_type(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, g->sf->body.cu->body.hll_config->num_attr_ref); break; case MVM_OP_getattrref_s: case MVM_OP_getattrsref_s: create_facts_with_type(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, g->sf->body.cu->body.hll_config->str_attr_ref); break; case MVM_OP_atposref_i: create_facts_with_type(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, g->sf->body.cu->body.hll_config->int_pos_ref); break; case MVM_OP_atposref_n: create_facts_with_type(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, g->sf->body.cu->body.hll_config->num_pos_ref); break; case MVM_OP_atposref_s: create_facts_with_type(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, g->sf->body.cu->body.hll_config->str_pos_ref); break; case MVM_OP_const_i64: case MVM_OP_const_i32: case MVM_OP_const_i16: case MVM_OP_const_i8: case MVM_OP_const_n64: case MVM_OP_const_n32: case MVM_OP_const_i64_32: case MVM_OP_const_i64_16: case MVM_OP_const_s: literal_facts(tc, g, ins); break; case MVM_OP_encode: create_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, ins->operands[3].reg.orig, ins->operands[3].reg.i); break; case MVM_OP_encoderep: create_facts(tc, g, ins->operands[0].reg.orig, ins->operands[0].reg.i, ins->operands[4].reg.orig, ins->operands[4].reg.i); break; case MVM_OP_cas_o: case MVM_OP_atomicload_o: { MVMSpeshOperand result = ins->operands[0]; g->facts[result.reg.orig][result.reg.i].flags |= MVM_SPESH_FACT_DECONTED; break; } default: if (ins->info->opcode == (MVMuint16)-1) discover_extop(tc, g, ins); } ins = ins->next; } /* Visit children. */ for (i = 0; i < bb->num_children; i++) add_bb_facts(tc, g, bb->children[i], p, cur_deopt_idx); } /* Exception handlers that use a block to store the handler must not have the * instructions that install the block eliminated. This tweaks the usage of * them. */ static void tweak_block_handler_usage(MVMThreadContext *tc, MVMSpeshGraph *g) { MVMint32 i; for (i = 0; i < g->sf->body.num_handlers; i++) { if (g->sf->body.handlers[i].action == MVM_EX_ACTION_INVOKE) g->facts[g->sf->body.handlers[i].block_reg][1].usages++; } } /* Kicks off fact discovery from the top of the (dominator) tree. */ void MVM_spesh_facts_discover(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshPlanned *p) { add_bb_facts(tc, g, g->entry, p, -1); tweak_block_handler_usage(tc, g); } MoarVM-2018.03/src/spesh/facts.h0000644000175000017510000000502313237701240016364 0ustar samanthasamantha/* Facts we might have about a local. */ struct MVMSpeshFacts { /* Flags indicating things we know. */ MVMint32 flags; /* The number of usages it has. */ MVMint32 usages; /* Known type, if any. */ MVMObject *type; /* Known type post-decontainerization, if any. */ MVMObject *decont_type; /* Known value, if any. */ union { MVMObject *o; MVMint64 i; MVMnum64 n; MVMString *s; } value; /* The instruction that writes the register (noting we're in SSA form, so * this is unique). */ MVMSpeshIns *writer; /* The deoptimization index in effect at the point of declaration, or -1 * if none yet. */ MVMint32 deopt_idx; /* The log guard the facts depend on, if any. */ MVMuint32 log_guard; /* Has the instruction that wrote this value been deleted? */ MVMuint32 dead_writer; }; /* Various fact flags. */ #define MVM_SPESH_FACT_KNOWN_TYPE 1 /* Has a known type. */ #define MVM_SPESH_FACT_KNOWN_VALUE 2 /* Has a known value. */ #define MVM_SPESH_FACT_DECONTED 4 /* Know it's decontainerized. */ #define MVM_SPESH_FACT_CONCRETE 8 /* Know it's a concrete object. */ #define MVM_SPESH_FACT_TYPEOBJ 16 /* Know it's a type object. */ #define MVM_SPESH_FACT_KNOWN_DECONT_TYPE 32 /* Has a known type after decont. */ #define MVM_SPESH_FACT_DECONT_CONCRETE 64 /* Is concrete after decont. */ #define MVM_SPESH_FACT_DECONT_TYPEOBJ 128 /* Is a type object after decont. */ #define MVM_SPESH_FACT_FROM_LOG_GUARD 256 /* Depends on a guard being met. */ #define MVM_SPESH_FACT_HASH_ITER 512 /* Is an iter over hashes. */ #define MVM_SPESH_FACT_ARRAY_ITER 1024 /* Is an iter over arrays (mutually exclusive with HASH_ITER, but neither of them is necessarily set) */ #define MVM_SPESH_FACT_KNOWN_BOX_SRC 2048 /* We know what register this value was boxed from */ #define MVM_SPESH_FACT_MERGED_WITH_LOG_GUARD 4096 /* These facts were merged at a PHI node, but at least one of the incoming facts had a "from log guard" flag set, so we'll have to look for that fact and increment its uses if we use this here fact. */ #define MVM_SPESH_FACT_RW_CONT 8192 /* Known to be an rw container */ void MVM_spesh_facts_discover(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshPlanned *p); void MVM_spesh_facts_depend(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshFacts *target, MVMSpeshFacts *source); MoarVM-2018.03/src/spesh/graph.c0000644000175000017510000015413713242626641016402 0ustar samanthasamantha#include "moar.h" /* This is where the spesh stuff all begins. The logic in here takes bytecode * and builds a spesh graph from it. This is a CFG in SSA form. Transforming * to SSA involves computing dominance frontiers, done by the algorithm found * in http://www.cs.rice.edu/~keith/EMBED/dom.pdf. The SSA algorithm itself is * from http://www.cs.utexas.edu/~pingali/CS380C/2010/papers/ssaCytron.pdf. */ #define GET_I8(pc, idx) *((MVMint8 *)((pc) + (idx))) #define GET_UI8(pc, idx) *((MVMuint8 *)((pc) + (idx))) #define GET_I16(pc, idx) *((MVMint16 *)((pc) + (idx))) #define GET_UI16(pc, idx) *((MVMuint16 *)((pc) + (idx))) #define GET_I32(pc, idx) *((MVMint32 *)((pc) + (idx))) #define GET_UI32(pc, idx) *((MVMuint32 *)((pc) + (idx))) #define GET_N32(pc, idx) *((MVMnum32 *)((pc) + (idx))) /* Allocate a piece of memory from the spesh graph's region * allocator. Deallocated when the spesh graph is. */ void * MVM_spesh_alloc(MVMThreadContext *tc, MVMSpeshGraph *g, size_t bytes) { return MVM_region_alloc(tc, &g->region_alloc, bytes); } /* Looks up op info; doesn't sanity check, since we should be working on code * that already pass validation. */ static const MVMOpInfo * get_op_info(MVMThreadContext *tc, MVMCompUnit *cu, MVMuint16 opcode) { if (opcode < MVM_OP_EXT_BASE) { return MVM_op_get_op(opcode); } else { MVMuint16 index = opcode - MVM_OP_EXT_BASE; MVMExtOpRecord *record = &cu->body.extops[index]; return MVM_ext_resolve_extop_record(tc, record); } } /* Records a de-optimization annotation and mapping pair. */ void MVM_spesh_graph_add_deopt_annotation(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins_node, MVMuint32 deopt_target, MVMint32 type) { /* Add an annotations. */ MVMSpeshAnn *ann = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshAnn)); ann->type = type; ann->data.deopt_idx = g->num_deopt_addrs; ann->next = ins_node->annotations; ins_node->annotations = ann; /* Record PC in the deopt entries table. */ if (g->num_deopt_addrs == g->alloc_deopt_addrs) { g->alloc_deopt_addrs += 4; if (g->deopt_addrs) g->deopt_addrs = MVM_realloc(g->deopt_addrs, g->alloc_deopt_addrs * sizeof(MVMint32) * 2); else g->deopt_addrs = MVM_malloc(g->alloc_deopt_addrs * sizeof(MVMint32) * 2); } g->deopt_addrs[2 * g->num_deopt_addrs] = deopt_target; g->num_deopt_addrs++; } /* Records the current bytecode position as a logged annotation. Used for * resolving logged values. */ static void add_logged_annotation(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins_node, MVMuint8 *pc) { MVMSpeshAnn *ann = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshAnn)); ann->type = MVM_SPESH_ANN_LOGGED; ann->data.bytecode_offset = pc - g->bytecode; ann->next = ins_node->annotations; ins_node->annotations = ann; } /* Finds the linearly previous basic block (not cheap, but uncommon). */ MVMSpeshBB * MVM_spesh_graph_linear_prev(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *search) { MVMSpeshBB *bb = g->entry; while (bb) { if (bb->linear_next == search) return bb; bb = bb->linear_next; } return NULL; } /* Checks if a handler is a catch handler or a control handler. */ static MVMint32 is_catch_handler(MVMThreadContext *tc, MVMSpeshGraph *g, MVMint32 handler_idx) { return g->handlers[handler_idx].category_mask & MVM_EX_CAT_CATCH; } /* Checks if a basic block already has a particular successor. */ static MVMint32 already_succs(MVMThreadContext *tc, MVMSpeshBB *bb, MVMSpeshBB *succ) { MVMint32 i = 0; for (i = 0; i < bb->num_succ; i++) if (bb->succ[i] == succ) return 1; return 0; } /* Builds the control flow graph, populating the passed spesh graph structure * with it. This also makes nodes for all of the instruction. */ #define MVM_CFG_BB_START 1 #define MVM_CFG_BB_END 2 #define MVM_CFG_BB_JUMPLIST 4 static void build_cfg(MVMThreadContext *tc, MVMSpeshGraph *g, MVMStaticFrame *sf, MVMint32 *existing_deopts, MVMint32 num_existing_deopts) { MVMSpeshBB *cur_bb, *prev_bb; MVMSpeshIns *last_ins; MVMint64 i; MVMint32 bb_idx; /* Temporary array of all MVMSpeshIns we create (one per instruction). * Overestimate at size. Has the flat view, matching the bytecode. */ MVMSpeshIns **ins_flat = MVM_calloc(g->bytecode_size / 2, sizeof(MVMSpeshIns *)); /* Temporary array where each byte in the input bytecode gets a 32-bit * integer. This is used for two things: * A) When we make the MVMSpeshIns for an instruction starting at the * byte, we put the instruction index (into ins_flat) in the slot, * shifting it by 3 bits to the left. We will use this to do fixups. * B) The first bit is "I have an incoming branch" - that is, start of * a basic block. The second bit is "I can branch" - that is, end of * a basic block. It's possible to have both bits set. If it's part * of a jumplist, it gets the third bit set also. * Anything that's just a zero has no instruction starting there. */ MVMuint32 *byte_to_ins_flags = MVM_calloc(g->bytecode_size, sizeof(MVMuint32)); /* Instruction to basic block mapping. Initialized later. */ MVMSpeshBB **ins_to_bb = NULL; /* Which handlers are active; used for placing edges from blocks covered * by exception handlers. */ MVMuint8 *active_handlers = MVM_calloc(1, g->num_handlers); MVMint32 num_active_handlers = 0; /* Make first pass through the bytecode. In this pass, we make MVMSpeshIns * nodes for each instruction and set the start/end of block bits. Also * set handler targets as basic block starters. */ MVMCompUnit *cu = sf->body.cu; MVMuint8 *pc = g->bytecode; MVMuint8 *end = g->bytecode + g->bytecode_size; MVMuint32 ins_idx = 0; MVMuint8 next_bbs = 1; /* Next iteration (here, first) starts a BB. */ MVMuint32 lineno_ann_offs = 0; MVMuint32 num_osr_points = 0; MVMBytecodeAnnotation *ann_ptr = MVM_bytecode_resolve_annotation(tc, &sf->body, sf->body.bytecode - pc); for (i = 0; i < g->num_handlers; i++) { if (g->handlers[i].start_offset != -1 && g->handlers[i].goto_offset != -1) { byte_to_ins_flags[g->handlers[i].start_offset] |= MVM_CFG_BB_START; byte_to_ins_flags[g->handlers[i].end_offset] |= MVM_CFG_BB_START; byte_to_ins_flags[g->handlers[i].goto_offset] |= MVM_CFG_BB_START; } } while (pc < end) { /* Look up op info. */ MVMuint16 opcode = *(MVMuint16 *)pc; MVMuint8 *args = pc + 2; MVMuint8 arg_size = 0; const MVMOpInfo *info = get_op_info(tc, cu, opcode); /* Create an instruction node, add it, and record its position. */ MVMSpeshIns *ins_node = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); ins_flat[ins_idx] = ins_node; byte_to_ins_flags[pc - g->bytecode] |= ins_idx << 3; /* Did previous instruction end a basic block? */ if (next_bbs) { byte_to_ins_flags[pc - g->bytecode] |= MVM_CFG_BB_START; next_bbs = 0; } /* Also check we're not already a BB start due to being a branch * target, in which case we should ensure our prior is marked as * a BB end. */ else { if (byte_to_ins_flags[pc - g->bytecode] & MVM_CFG_BB_START) { MVMuint32 hunt = pc - g->bytecode; while (!byte_to_ins_flags[--hunt]); byte_to_ins_flags[hunt] |= MVM_CFG_BB_END; } } /* Store opcode. */ ins_node->info = info; /* If this is a pre-instruction deopt point opcode, annotate. */ if (!existing_deopts && (info->deopt_point & MVM_DEOPT_MARK_ONE_PRE)) MVM_spesh_graph_add_deopt_annotation(tc, g, ins_node, pc - g->bytecode, MVM_SPESH_ANN_DEOPT_ONE_INS); /* Let's see if we have a line-number annotation. */ if (ann_ptr && pc - sf->body.bytecode == ann_ptr->bytecode_offset) { MVMSpeshAnn *lineno_ann = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshAnn)); lineno_ann->next = ins_node->annotations; lineno_ann->type = MVM_SPESH_ANN_LINENO; lineno_ann->data.lineno.filename_string_index = ann_ptr->filename_string_heap_index; lineno_ann->data.lineno.line_number = ann_ptr->line_number; ins_node->annotations = lineno_ann; MVM_bytecode_advance_annotation(tc, &sf->body, ann_ptr); } /* Go over operands. */ ins_node->operands = MVM_spesh_alloc(tc, g, info->num_operands * sizeof(MVMSpeshOperand)); for (i = 0; i < info->num_operands; i++) { MVMuint8 flags = info->operands[i]; MVMuint8 rw = flags & MVM_operand_rw_mask; switch (rw) { case MVM_operand_read_reg: case MVM_operand_write_reg: ins_node->operands[i].reg.orig = GET_UI16(args, arg_size); arg_size += 2; break; case MVM_operand_read_lex: case MVM_operand_write_lex: ins_node->operands[i].lex.idx = GET_UI16(args, arg_size); ins_node->operands[i].lex.outers = GET_UI16(args, arg_size + 2); arg_size += 4; break; case MVM_operand_literal: { MVMuint32 type = flags & MVM_operand_type_mask; switch (type) { case MVM_operand_int8: ins_node->operands[i].lit_i8 = GET_I8(args, arg_size); arg_size += 1; break; case MVM_operand_int16: ins_node->operands[i].lit_i16 = GET_I16(args, arg_size); arg_size += 2; break; case MVM_operand_int32: ins_node->operands[i].lit_i32 = GET_I32(args, arg_size); arg_size += 4; break; case MVM_operand_uint32: ins_node->operands[i].lit_ui32 = GET_UI32(args, arg_size); arg_size += 4; break; case MVM_operand_int64: ins_node->operands[i].lit_i64 = MVM_BC_get_I64(args, arg_size); arg_size += 8; break; case MVM_operand_num32: ins_node->operands[i].lit_n32 = GET_N32(args, arg_size); arg_size += 4; break; case MVM_operand_num64: ins_node->operands[i].lit_n64 = MVM_BC_get_N64(args, arg_size); arg_size += 8; break; case MVM_operand_callsite: ins_node->operands[i].callsite_idx = GET_UI16(args, arg_size); arg_size += 2; break; case MVM_operand_coderef: ins_node->operands[i].coderef_idx = GET_UI16(args, arg_size); arg_size += 2; break; case MVM_operand_str: ins_node->operands[i].lit_str_idx = GET_UI32(args, arg_size); arg_size += 4; break; case MVM_operand_ins: { /* Stash instruction offset. */ MVMuint32 target = GET_UI32(args, arg_size); ins_node->operands[i].ins_offset = target; /* This is a branching instruction, so it's a BB end. */ byte_to_ins_flags[pc - g->bytecode] |= MVM_CFG_BB_END; /* Its target is a BB start, and any previous instruction * we already passed needs marking as a BB end. */ byte_to_ins_flags[target] |= MVM_CFG_BB_START; if (target > 0 && target < pc - g->bytecode) { while (!byte_to_ins_flags[--target]); byte_to_ins_flags[target] |= MVM_CFG_BB_END; } /* Next instruction is also a BB start. */ next_bbs = 1; arg_size += 4; break; } case MVM_operand_spesh_slot: ins_node->operands[i].lit_i16 = GET_I16(args, arg_size); arg_size += 2; break; default: MVM_oops(tc, "Spesh: unknown operand type %d in graph building (op %s)", (int)type, ins_node->info->name); } break; default: break; } } } /* We specially handle the jumplist case, which needs to mark all of * the possible places we could jump to in the following instructions * as starts of basic blocks. It is, in itself, the end of one. Note * we jump to the instruction after the n jump points if none match, * so that is marked too. */ if (opcode == MVM_OP_jumplist) { MVMint64 n = MVM_BC_get_I64(args, 0); for (i = 0; i <= n; i++) byte_to_ins_flags[(pc - g->bytecode) + 12 + i * 6] |= MVM_CFG_BB_START | MVM_CFG_BB_JUMPLIST; byte_to_ins_flags[pc - g->bytecode] |= MVM_CFG_BB_END; } /* Invoke and return end a basic block. Anything that is marked as * invokish and throwish are also basic block ends. OSR points are * basic block starts. */ switch (opcode) { case MVM_OP_invoke_v: case MVM_OP_invoke_i: case MVM_OP_invoke_n: case MVM_OP_invoke_s: case MVM_OP_invoke_o: case MVM_OP_return_i: case MVM_OP_return_n: case MVM_OP_return_s: case MVM_OP_return_o: case MVM_OP_return: byte_to_ins_flags[pc - g->bytecode] |= MVM_CFG_BB_END; next_bbs = 1; break; case MVM_OP_osrpoint: byte_to_ins_flags[pc - g->bytecode] |= MVM_CFG_BB_START; if (pc - g->bytecode > 0) { MVMuint32 prev = pc - g->bytecode; while (!byte_to_ins_flags[--prev]); byte_to_ins_flags[prev] |= MVM_CFG_BB_END; } num_osr_points++; break; default: if (info->jittivity & (MVM_JIT_INFO_THROWISH | MVM_JIT_INFO_INVOKISH)) { byte_to_ins_flags[pc - g->bytecode] |= MVM_CFG_BB_END; next_bbs = 1; } break; } /* Final instruction is basic block end. */ if (pc + 2 + arg_size == end) byte_to_ins_flags[pc - g->bytecode] |= MVM_CFG_BB_END; /* If the instruction is logged, store its program counter so we can * associate it with a static value later. */ if (info->logged) add_logged_annotation(tc, g, ins_node, pc); /* Caculate next instruction's PC. */ pc += 2 + arg_size; /* If this is a post-instruction deopt point opcode... */ if (!existing_deopts && (info->deopt_point & MVM_DEOPT_MARK_ONE)) MVM_spesh_graph_add_deopt_annotation(tc, g, ins_node, pc - g->bytecode, MVM_SPESH_ANN_DEOPT_ONE_INS); if (!existing_deopts && (info->deopt_point & MVM_DEOPT_MARK_ALL)) MVM_spesh_graph_add_deopt_annotation(tc, g, ins_node, pc - g->bytecode, MVM_SPESH_ANN_DEOPT_ALL_INS); if (!existing_deopts && (info->deopt_point & MVM_DEOPT_MARK_OSR)) MVM_spesh_graph_add_deopt_annotation(tc, g, ins_node, pc - g->bytecode, MVM_SPESH_ANN_DEOPT_OSR); /* Go to next instruction. */ ins_idx++; } /* Annotate instructions that are handler-significant. */ for (i = 0; i < g->num_handlers; i++) { /* Start or got may be -1 if the code the handler covered became * dead. If so, mark the handler as removed. */ if (g->handlers[i].start_offset == -1 || g->handlers[i].goto_offset == -1) { if (!g->unreachable_handlers) g->unreachable_handlers = MVM_spesh_alloc(tc, g, g->num_handlers); g->unreachable_handlers[i] = 1; } else { MVMSpeshIns *start_ins = ins_flat[byte_to_ins_flags[g->handlers[i].start_offset] >> 3]; MVMSpeshIns *end_ins = ins_flat[byte_to_ins_flags[g->handlers[i].end_offset] >> 3]; MVMSpeshAnn *start_ann = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshAnn)); MVMSpeshAnn *end_ann = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshAnn)); MVMSpeshIns *goto_ins = ins_flat[byte_to_ins_flags[g->handlers[i].goto_offset] >> 3]; MVMSpeshAnn *goto_ann = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshAnn)); start_ann->next = start_ins->annotations; start_ann->type = MVM_SPESH_ANN_FH_START; start_ann->data.frame_handler_index = i; start_ins->annotations = start_ann; end_ann->next = end_ins->annotations; end_ann->type = MVM_SPESH_ANN_FH_END; end_ann->data.frame_handler_index = i; end_ins->annotations = end_ann; goto_ann->next = goto_ins->annotations; goto_ann->type = MVM_SPESH_ANN_FH_GOTO; goto_ann->data.frame_handler_index = i; goto_ins->annotations = goto_ann; } } /* Annotate instructions that are inline start/end points. */ for (i = 0; i < g->num_inlines; i++) { if (!g->inlines[i].unreachable) { MVMSpeshIns *start_ins = ins_flat[byte_to_ins_flags[g->inlines[i].start] >> 3]; MVMSpeshIns *end_ins = ins_flat[byte_to_ins_flags[g->inlines[i].end] >> 3]; MVMSpeshAnn *start_ann = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshAnn)); MVMSpeshAnn *end_ann = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshAnn)); start_ann->next = start_ins->annotations; start_ann->type = MVM_SPESH_ANN_INLINE_START; start_ann->data.inline_idx = i; start_ins->annotations = start_ann; end_ann->next = end_ins->annotations; end_ann->type = MVM_SPESH_ANN_INLINE_END; end_ann->data.inline_idx = i; end_ins->annotations = end_ann; } } /* Now for the second pass, where we assemble the basic blocks. Also we * build a lookup table of instructions that start a basic block to that * basic block, for the final CFG construction. We make the entry block a * special one, containing a noop; it will have any catch exception * handler targets linked from it, so they show up in the graph. For any * control exceptions, we will insert */ g->entry = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshBB)); g->entry->first_ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); g->entry->first_ins->info = get_op_info(tc, cu, 0); g->entry->last_ins = g->entry->first_ins; g->entry->idx = 0; cur_bb = NULL; prev_bb = g->entry; last_ins = NULL; ins_to_bb = MVM_calloc(ins_idx, sizeof(MVMSpeshBB *)); ins_idx = 0; bb_idx = 1; for (i = 0; i < g->bytecode_size; i++) { MVMSpeshIns *cur_ins; /* Skip zeros; no instruction here. */ if (!byte_to_ins_flags[i]) continue; /* Get current instruction. */ cur_ins = ins_flat[byte_to_ins_flags[i] >> 3]; /* Start of a basic block? */ if (byte_to_ins_flags[i] & MVM_CFG_BB_START) { /* Should not already be in a basic block. */ if (cur_bb) { MVM_spesh_graph_destroy(tc, g); MVM_oops(tc, "Spesh: confused during basic block analysis (in block)"); } /* Create it, and set first instruction and index. */ cur_bb = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshBB)); cur_bb->first_ins = cur_ins; cur_bb->idx = bb_idx; cur_bb->initial_pc = i; cur_bb->jumplist = byte_to_ins_flags[i] & MVM_CFG_BB_JUMPLIST; bb_idx++; /* Record instruction -> BB start mapping. */ ins_to_bb[ins_idx] = cur_bb; /* Link it to the previous one. */ prev_bb->linear_next = cur_bb; } /* Should always be in a BB at this point. */ if (!cur_bb) { MVM_spesh_graph_destroy(tc, g); MVM_oops(tc, "Spesh: confused during basic block analysis (no block)"); } /* Add instruction into double-linked per-block instruction list. */ if (last_ins) { last_ins->next = cur_ins; cur_ins->prev = last_ins; } last_ins = cur_ins; /* End of a basic block? */ if (byte_to_ins_flags[i] & MVM_CFG_BB_END) { cur_bb->last_ins = cur_ins; prev_bb = cur_bb; cur_bb = NULL; last_ins = NULL; } ins_idx++; } g->num_bbs = bb_idx; /* Finally, link the basic blocks up to form a CFG. Along the way, any of * the instruction operands get the target BB stored. This is where we * link basic blocks covered by control exception handlers to the goto * block of the handler also. */ cur_bb = g->entry; while (cur_bb) { /* If it's the first block, it's a special case; successors are the * real successor, all catch exception handlers, and all OSR points. */ if (cur_bb == g->entry) { MVMint32 num_bbs = 1 + g->num_handlers + num_osr_points; MVMint32 insert_pos = 1; cur_bb->succ = MVM_spesh_alloc(tc, g, num_bbs * sizeof(MVMSpeshBB *)); cur_bb->handler_succ = MVM_spesh_alloc(tc, g, g->num_handlers * sizeof(MVMSpeshBB *)); cur_bb->succ[0] = cur_bb->linear_next; for (i = 0; i < g->num_handlers; i++) { if (is_catch_handler(tc, g, i)) { MVMuint32 offset = g->handlers[i].goto_offset; if (offset != -1) cur_bb->succ[insert_pos++] = ins_to_bb[byte_to_ins_flags[offset] >> 3]; } } if (num_osr_points > 0) { MVMSpeshBB *search_bb = cur_bb->linear_next; while (search_bb) { if (search_bb->first_ins->info->opcode == MVM_OP_osrpoint) cur_bb->succ[insert_pos++] = search_bb; search_bb = search_bb->linear_next; } } cur_bb->num_succ = insert_pos; } /* Otherwise, non-entry basic block. */ else { /* If this is the start of a frame handler that is not a catch, * mark it as an active handler. Unmark those where we see the * end of the handler. */ if (cur_bb->first_ins->annotations) { MVMSpeshAnn *ann = cur_bb->first_ins->annotations; while (ann) { switch (ann->type) { case MVM_SPESH_ANN_FH_START: if (!is_catch_handler(tc, g, ann->data.frame_handler_index)) { active_handlers[ann->data.frame_handler_index] = 1; num_active_handlers++; } break; case MVM_SPESH_ANN_FH_END: if (!is_catch_handler(tc, g, ann->data.frame_handler_index)) { active_handlers[ann->data.frame_handler_index] = 0; num_active_handlers--; } break; } ann = ann->next; } } /* Consider the last instruction, to see how we leave the BB. */ switch (cur_bb->last_ins->info->opcode) { case MVM_OP_jumplist: { /* Jumplist, so successors are next N+1 basic blocks. */ MVMint64 jump_bbs = cur_bb->last_ins->operands[0].lit_i64 + 1; MVMint64 num_bbs = jump_bbs + num_active_handlers; MVMSpeshBB *bb_to_add = cur_bb->linear_next; cur_bb->succ = MVM_spesh_alloc(tc, g, num_bbs * sizeof(MVMSpeshBB *)); for (i = 0; i < jump_bbs; i++) { cur_bb->succ[i] = bb_to_add; bb_to_add = bb_to_add->linear_next; } cur_bb->num_succ = jump_bbs; } break; case MVM_OP_goto: { /* Unconditional branch, so one successor. */ MVMint64 num_bbs = 1 + num_active_handlers; MVMuint32 offset = cur_bb->last_ins->operands[0].ins_offset; MVMSpeshBB *tgt = ins_to_bb[byte_to_ins_flags[offset] >> 3]; cur_bb->succ = MVM_spesh_alloc(tc, g, num_bbs * sizeof(MVMSpeshBB *)); cur_bb->succ[0] = tgt; cur_bb->num_succ = 1; cur_bb->last_ins->operands[0].ins_bb = tgt; } break; default: { /* Probably conditional branch, so two successors: one from * the instruction, another from fall-through. Or may just be * a non-branch that exits for other reasons. */ MVMint64 num_bbs = 2 + num_active_handlers; cur_bb->succ = MVM_spesh_alloc(tc, g, num_bbs * sizeof(MVMSpeshBB *)); for (i = 0; i < cur_bb->last_ins->info->num_operands; i++) { if (cur_bb->last_ins->info->operands[i] == MVM_operand_ins) { MVMuint32 offset = cur_bb->last_ins->operands[i].ins_offset; cur_bb->succ[0] = ins_to_bb[byte_to_ins_flags[offset] >> 3]; cur_bb->num_succ++; cur_bb->last_ins->operands[i].ins_bb = cur_bb->succ[0]; } } if (cur_bb->num_succ > 1) { /* If we ever get instructions with multiple targets, this * area of the code needs an update. */ MVM_spesh_graph_destroy(tc, g); MVM_oops(tc, "Spesh: unhandled multi-target branch"); } if (cur_bb->linear_next) { cur_bb->succ[cur_bb->num_succ] = cur_bb->linear_next; cur_bb->num_succ++; } } break; } /* Attach this block to the goto block of any active handlers. */ if ( num_active_handlers && ( cur_bb->last_ins->info->jittivity & (MVM_JIT_INFO_THROWISH | MVM_JIT_INFO_INVOKISH) || cur_bb->last_ins->info->opcode == MVM_OP_invoke_v || cur_bb->last_ins->info->opcode == MVM_OP_invoke_i || cur_bb->last_ins->info->opcode == MVM_OP_invoke_n || cur_bb->last_ins->info->opcode == MVM_OP_invoke_s || cur_bb->last_ins->info->opcode == MVM_OP_invoke_o ) ) { cur_bb->handler_succ = MVM_spesh_alloc(tc, g, num_active_handlers * sizeof(MVMSpeshBB *)); for (i = 0; i < g->num_handlers; i++) { if (active_handlers[i]) { MVMuint32 offset = g->handlers[i].goto_offset; MVMSpeshBB *target = ins_to_bb[byte_to_ins_flags[offset] >> 3]; if (!already_succs(tc, cur_bb, target)) { cur_bb->succ[cur_bb->num_succ] = target; cur_bb->num_succ++; cur_bb->handler_succ[cur_bb->num_handler_succ++] = target; } } } } else cur_bb->handler_succ = NULL; } /* Move on to next block. */ cur_bb = cur_bb->linear_next; } /* If we're building the graph for optimized bytecode, insert existing * deopt points. */ if (existing_deopts) { for (i = 0; i < num_existing_deopts; i ++) { if (existing_deopts[2 * i + 1] >= 0) { MVMSpeshIns *post_ins = ins_flat[byte_to_ins_flags[existing_deopts[2 * i + 1]] >> 3]; MVMSpeshIns *deopt_ins = post_ins->prev ? post_ins->prev : MVM_spesh_graph_linear_prev(tc, g, ins_to_bb[byte_to_ins_flags[existing_deopts[2 * i + 1]] >> 3])->last_ins; MVMSpeshAnn *deopt_ann = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshAnn)); deopt_ann->next = deopt_ins->annotations; deopt_ann->type = MVM_SPESH_ANN_DEOPT_INLINE; deopt_ann->data.deopt_idx = i; deopt_ins->annotations = deopt_ann; } } } /* Clear up the temporary arrays. */ MVM_free(byte_to_ins_flags); MVM_free(ins_flat); MVM_free(ins_to_bb); MVM_free(ann_ptr); MVM_free(active_handlers); } /* Inserts nulling of object reigsters. A later stage of the optimizer will * throw out any that are unrequired, leaving only those that cover (rare) * "register read before assigned" cases. (We can thus just start off with * them NULL, since zeroed memory is cheaper than copying a VMNull in to * place). */ static MVMint32 is_handler_reg(MVMThreadContext *tc, MVMSpeshGraph *g, MVMuint16 reg) { MVMuint32 num_handlers = g->num_handlers; MVMuint32 i; for (i = 0; i < num_handlers; i++) if (g->handlers[i].action == MVM_EX_ACTION_INVOKE) if (g->handlers[i].block_reg == reg) return 1; return 0; } static void insert_object_null_instructions(MVMThreadContext *tc, MVMSpeshGraph *g) { MVMSpeshBB *insert_bb = g->entry->linear_next; MVMuint16 *local_types = g->sf->body.local_types; MVMuint16 num_locals = g->sf->body.num_locals; MVMuint16 i; for (i = 0; i < num_locals; i++) { if (local_types[i] == MVM_reg_obj && !is_handler_reg(tc, g, i)) { MVMSpeshIns *null_ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); null_ins->info = MVM_op_get_op(MVM_OP_null); null_ins->operands = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshOperand)); null_ins->operands[0].reg.orig = i; MVM_spesh_manipulate_insert_ins(tc, insert_bb, NULL, null_ins); } } } /* Annotates the control flow graph with predecessors. */ static void add_predecessors(MVMThreadContext *tc, MVMSpeshGraph *g) { MVMSpeshBB *cur_bb = g->entry; while (cur_bb) { MVMuint16 i; for (i = 0; i < cur_bb->num_succ; i++) { MVMSpeshBB *tgt = cur_bb->succ[i]; MVMSpeshBB **new_pred = MVM_spesh_alloc(tc, g, (tgt->num_pred + 1) * sizeof(MVMSpeshBB *)); if (tgt->num_pred) memcpy(new_pred, tgt->pred, tgt->num_pred * sizeof(MVMSpeshBB *)); new_pred[tgt->num_pred] = cur_bb; tgt->pred = new_pred; tgt->num_pred++; } cur_bb = cur_bb->linear_next; } } /* Produces an array of the basic blocks, sorted in reverse postorder from * the entry point. */ static void dfs(MVMSpeshBB **rpo, MVMint32 *insert_pos, MVMuint8 *seen, MVMSpeshBB *bb) { MVMint32 i; seen[bb->idx] = 1; for (i = 0; i < bb->num_succ; i++) { MVMSpeshBB *succ = bb->succ[i]; if (!seen[succ->idx]) dfs(rpo, insert_pos, seen, succ); } rpo[*insert_pos] = bb; bb->rpo_idx = *insert_pos; (*insert_pos)--; } static MVMSpeshBB ** reverse_postorder(MVMThreadContext *tc, MVMSpeshGraph *g) { MVMSpeshBB **rpo = MVM_calloc(g->num_bbs, sizeof(MVMSpeshBB *)); MVMuint8 *seen = MVM_calloc(g->num_bbs, 1); MVMint32 ins = g->num_bbs - 1; dfs(rpo, &ins, seen, g->entry); MVM_free(seen); if (ins != -1) { char *dump_msg = MVM_spesh_dump(tc, g); printf("%s", dump_msg); MVM_free(dump_msg); MVM_spesh_graph_destroy(tc, g); MVM_oops(tc, "Spesh: reverse postorder calculation failed"); } return rpo; } /* 2-finger intersection algorithm, to find new immediate dominator. */ static void iter_check(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB **rpo, MVMint32 *doms, MVMint32 iters) { if (iters > 100000) { #ifdef NDEBUG MVMint32 k; char *dump_msg = MVM_spesh_dump(tc, g); printf("%s", dump_msg); MVM_free(dump_msg); printf("RPO: "); for (k = 0; k < g->num_bbs; k++) printf("%d, ", rpo[k]->idx); printf("\n"); printf("Doms: "); for (k = 0; k < g->num_bbs; k++) printf("%d (%d), ", doms[k], doms[k] >= 0 ? rpo[doms[k]]->idx : -1); printf("\n"); #endif MVM_spesh_graph_destroy(tc, g); MVM_oops(tc, "Spesh: dominator intersection went infinite"); } } static MVMint32 intersect(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB **rpo, MVMint32 *doms, MVMint32 finger1, MVMint32 finger2) { MVMint32 iters = 0; while (finger1 != finger2) { while (finger1 > finger2) { iter_check(tc, g, rpo, doms, iters++); finger1 = doms[finger1]; } while (finger2 > finger1) { iter_check(tc, g, rpo, doms, iters++); finger2 = doms[finger2]; } } return finger1; } /* Computes dominator information about the basic blocks. */ static MVMint32 * compute_dominators(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB **rpo) { MVMint32 i, j, changed; /* Create result list, with all initialized to undefined (use -1, as it's * not a valid basic block index). Start node dominates itself. */ MVMint32 *doms = MVM_malloc(g->num_bbs * sizeof(MVMint32)); doms[0] = 0; for (i = 1; i < g->num_bbs; i++) doms[i] = -1; /* Iterate to fixed point. */ changed = 1; while (changed) { changed = 0; /* Visit all except the start node in reverse postorder. */ for (i = 1; i < g->num_bbs; i++) { MVMSpeshBB *b = rpo[i]; /* See if there's a better dominator. */ MVMint32 chosen_pred = -1; MVMint32 new_idom; for (j = 0; j < b->num_pred; j++) { new_idom = b->pred[j]->rpo_idx; if (doms[new_idom] != -1) { chosen_pred = j; break; } } if (chosen_pred == -1) { MVM_spesh_graph_destroy(tc, g); MVM_oops(tc, "Spesh: could not find processed initial dominator"); } for (j = 0; j < b->num_pred; j++) { if (j != chosen_pred) { MVMint32 p_idx = b->pred[j]->rpo_idx; if (doms[p_idx] != -1) new_idom = intersect(tc, g, rpo, doms, p_idx, new_idom); } } if (doms[i] != new_idom) { doms[i] = new_idom; changed = 1; } } } return doms; } /* Builds the dominance tree children lists for each node. */ static void add_child(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *target, MVMSpeshBB *to_add) { MVMSpeshBB **new_children; MVMint32 i; /* Already in the child list? */ for (i = 0; i < target->num_children; i++) if (target->children[i] == to_add) return; /* Nope, so insert. */ new_children = MVM_spesh_alloc(tc, g, (target->num_children + 1) * sizeof(MVMSpeshBB *)); if (target->num_children) memcpy(new_children, target->children, target->num_children * sizeof(MVMSpeshBB *)); new_children[target->num_children] = to_add; target->children = new_children; target->num_children++; } static void add_children(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB **rpo, MVMint32 *doms) { MVMint32 i; for (i = 0; i < g->num_bbs; i++) { MVMSpeshBB *bb = rpo[i]; MVMint32 idom = doms[i]; if (idom != i) add_child(tc, g, rpo[idom], bb); } } /* Builds the dominance frontier set for each node. */ static void add_to_frontier_set(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *target, MVMSpeshBB *to_add) { MVMSpeshBB **new_df; MVMint32 i; /* Already in the set? */ for (i = 0; i < target->num_df; i++) if (target->df[i] == to_add) return; /* Nope, so insert. */ new_df = MVM_spesh_alloc(tc, g, (target->num_df + 1) * sizeof(MVMSpeshBB *)); if (target->num_df) memcpy(new_df, target->df, target->num_df * sizeof(MVMSpeshBB *)); new_df[target->num_df] = to_add; target->df = new_df; target->num_df++; } static void add_dominance_frontiers(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB **rpo, MVMint32 *doms) { MVMint32 j; MVMSpeshBB *b = g->entry; while (b) { if (b->num_pred >= 2) { /* Thus it's a join point. */ for (j = 0; j < b->num_pred; j++) { MVMint32 runner = b->pred[j]->rpo_idx; MVMint32 finish_line = doms[b->rpo_idx]; while (runner != finish_line) { add_to_frontier_set(tc, g, rpo[runner], b); runner = doms[runner]; } } } b = b->linear_next; } } /* Per-local SSA info. */ typedef struct { /* Nodes that assign to the variable. */ MVMSpeshBB **ass_nodes; MVMuint16 num_ass_nodes; /* Count of processed assignments aka. C(V). */ MVMint32 count; /* Stack of integers aka. S(V). */ MVMint32 *stack; MVMint32 stack_top; MVMint32 stack_alloc; } SSAVarInfo; /* Creates an SSAVarInfo for each local, initializing it with a list of nodes * that assign to the local. */ static SSAVarInfo * initialize_ssa_var_info(MVMThreadContext *tc, MVMSpeshGraph *g) { SSAVarInfo *var_info = MVM_calloc(g->num_locals, sizeof(SSAVarInfo)); MVMint32 i; /* Visit all instructions, looking for local writes. */ MVMSpeshBB *bb = g->entry; while (bb) { MVMSpeshIns *ins = bb->first_ins; while (ins) { for (i = 0; i < ins->info->num_operands; i++) { if ((ins->info->operands[i] & MVM_operand_rw_mask) == MVM_operand_write_reg) { MVMuint16 written = ins->operands[i].reg.orig; MVMint32 found = 0; MVMint32 j; for (j = 0; j < var_info[written].num_ass_nodes; j++) if (var_info[written].ass_nodes[j] == bb) { found = 1; break; } if (!found) { if (var_info[written].num_ass_nodes % 8 == 0) { MVMint32 new_size = var_info[written].num_ass_nodes + 8; var_info[written].ass_nodes = MVM_realloc( var_info[written].ass_nodes, new_size * sizeof(MVMSpeshBB *)); } var_info[written].ass_nodes[var_info[written].num_ass_nodes] = bb; var_info[written].num_ass_nodes++; } } } ins = ins->next; } bb = bb->linear_next; } /* Set stack top to -1 sentinel for all nodes, and count = 1 (as we may * read the default value of a register). */ for (i = 0; i < g->num_locals; i++) { var_info[i].count = 1; var_info[i].stack_top = -1; } return var_info; } MVMOpInfo *get_phi(MVMThreadContext *tc, MVMSpeshGraph *g, MVMuint32 nrargs) { MVMOpInfo *result = NULL; /* Check number of args to phi isn't huge. */ if (nrargs > 0xFFFF) MVM_panic(1, "Spesh: SSA calculation failed; cannot allocate enormous PHI node"); /* Up to 64 args, almost every number is represented, but after that * we have a sparse array through which we must search. */ if (nrargs - 2 < MVMPhiNodeCacheSparseBegin) { result = &g->phi_infos[nrargs - 2]; } else { MVMint32 cache_idx; for (cache_idx = MVMPhiNodeCacheSparseBegin; !result && cache_idx < MVMPhiNodeCacheSize; cache_idx++) { if (g->phi_infos[cache_idx].opcode == MVM_SSA_PHI) { if (g->phi_infos[cache_idx].num_operands == nrargs) { result = &g->phi_infos[cache_idx]; } } else { result = &g->phi_infos[cache_idx]; } } } if (result == NULL) { result = MVM_spesh_alloc(tc, g, sizeof(MVMOpInfo)); result->opcode = 0; } if (result->opcode != MVM_SSA_PHI) { result->opcode = MVM_SSA_PHI; result->name = "PHI"; result->num_operands = nrargs; } return result; } /* Inserts SSA phi functions at the required places in the graph. */ static void place_phi(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMint32 n, MVMuint16 var) { MVMint32 i; MVMOpInfo *phi_op = get_phi(tc, g, n + 1); MVMSpeshIns *ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); ins->info = phi_op; ins->operands = MVM_spesh_alloc(tc, g, phi_op->num_operands * sizeof(MVMSpeshOperand)); for (i = 0; i < phi_op->num_operands; i++) ins->operands[i].reg.orig = var; ins->next = bb->first_ins; bb->first_ins->prev = ins; bb->first_ins = ins; } static void insert_phi_functions(MVMThreadContext *tc, MVMSpeshGraph *g, SSAVarInfo *var_info) { MVMint32 *has_already = MVM_calloc(g->num_bbs, sizeof(MVMint32)); MVMint32 *work = MVM_calloc(g->num_bbs, sizeof(MVMint32)); MVMSpeshBB **worklist = MVM_calloc(g->num_bbs, sizeof(MVMSpeshBB *)); MVMint32 worklist_top = 0; MVMint32 iter_count = 0; /* Go over all locals. */ MVMint32 var, i, j, found; for (var = 0; var < g->num_locals; var++) { /* Move to next iteration. */ iter_count++; /* Add blocks assigning to this variable to the worklist. */ for (i = 0; i < var_info[var].num_ass_nodes; i++) { MVMSpeshBB *bb = var_info[var].ass_nodes[i]; work[bb->idx] = iter_count; worklist[worklist_top++] = bb; /* Algo unions, but ass_nodes unique. */ } /* Process the worklist. */ while (worklist_top) { MVMSpeshBB *x = worklist[--worklist_top]; for (i = 0; i < x->num_df; i++) { MVMSpeshBB *y = x->df[i]; if (has_already[y->idx] < iter_count) { /* Place phi function, and mark we have. */ place_phi(tc, g, y, y->num_pred, var); has_already[y->idx] = iter_count; /* Add this block to worklist if needed. */ if (work[y->idx] < iter_count) { work[y->idx] = iter_count; found = 0; for (j = 0; j < worklist_top; j++) if (worklist[j] == y) { found = 1; break; } if (!found) worklist[worklist_top++] = y; } } } } } MVM_free(has_already); MVM_free(work); MVM_free(worklist); } /* Renames the local variables such that we end up with SSA form. */ static MVMint32 which_pred(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *y, MVMSpeshBB *x) { MVMint32 i; for (i = 0; i < y->num_pred; i++) if (y->pred[i] == x) return i; MVM_spesh_graph_destroy(tc, g); MVM_oops(tc, "Spesh: which_pred failed to find x"); } static void rename_locals(MVMThreadContext *tc, MVMSpeshGraph *g, SSAVarInfo *var_info, MVMSpeshBB *x) { MVMint32 i; /* Visit instructions and do renames in normal (non-phi) instructions. */ MVMSpeshIns *a = x->first_ins; while (a) { /* Rename reads, provided it's not a PHI. */ MVMint32 is_phi = a->info->opcode == MVM_SSA_PHI; if (!is_phi) { for (i = 0; i < a->info->num_operands; i++) { if ((a->info->operands[i] & MVM_operand_rw_mask) == MVM_operand_read_reg) { MVMuint16 orig = a->operands[i].reg.orig; MVMint32 st = var_info[orig].stack_top; if (st >= 0) a->operands[i].reg.i = var_info[orig].stack[st]; else a->operands[i].reg.i = 0; } } } /* Rename writes. */ for (i = 0; i < a->info->num_operands; i++) { if (is_phi || (a->info->operands[i] & MVM_operand_rw_mask) == MVM_operand_write_reg) { MVMuint16 orig = a->operands[i].reg.orig; MVMint32 reg_i = var_info[orig].count; a->operands[i].reg.i = reg_i; if (var_info[orig].stack_top + 1 >= var_info[orig].stack_alloc) { if (var_info[orig].stack_alloc) var_info[orig].stack_alloc *= 2; else var_info[orig].stack_alloc = 8; var_info[orig].stack = MVM_realloc(var_info[orig].stack, var_info[orig].stack_alloc * sizeof(MVMint32)); } var_info[orig].stack[++var_info[orig].stack_top] = reg_i; var_info[orig].count++; } if (is_phi) break; } a = a->next; } /* Visit successors and update their phi functions. */ for (i = 0; i < x->num_succ; i++) { MVMSpeshBB *y = x->succ[i]; MVMint32 j = which_pred(tc, g, y, x); MVMSpeshIns *p = y->first_ins; while (p && p->info->opcode == MVM_SSA_PHI) { MVMuint16 orig = p->operands[j + 1].reg.orig; MVMint32 st = var_info[orig].stack_top; if (st >= 0) p->operands[j + 1].reg.i = var_info[orig].stack[st]; else p->operands[j + 1].reg.i = 0; p = p->next; } } /* Rename for all the children in the dominator tree. */ for (i = 0; i < x->num_children; i++) rename_locals(tc, g, var_info, x->children[i]); /* Go over assignments and pop new variable names. */ a = x->first_ins; while (a) { MVMint32 is_phi = a->info->opcode == MVM_SSA_PHI; for (i = 0; i < a->info->num_operands; i++) { if (is_phi || (a->info->operands[i] & MVM_operand_rw_mask) == MVM_operand_write_reg) { MVMuint16 orig = a->operands[i].reg.orig; var_info[orig].stack_top--; } if (is_phi) break; } a = a->next; } } /* Transforms a spesh graph into SSA form. After this, the graph will have all * register accesses given an SSA "version", and phi instructions inserted as * needed. */ static void ssa(MVMThreadContext *tc, MVMSpeshGraph *g) { SSAVarInfo *var_info; MVMint32 i, num_locals; /* Compute dominance frontiers. */ MVMSpeshBB **rpo = reverse_postorder(tc, g); MVMint32 *doms = compute_dominators(tc, g, rpo); add_children(tc, g, rpo, doms); add_dominance_frontiers(tc, g, rpo, doms); MVM_free(rpo); MVM_free(doms); /* Initialize per-local data for SSA analysis. */ var_info = initialize_ssa_var_info(tc, g); /* Compute SSA itself. */ insert_phi_functions(tc, g, var_info); rename_locals(tc, g, var_info, g->entry); /* Allocate space for spesh facts for each local; clean up stacks while * we're at it. */ num_locals = g->num_locals; g->facts = MVM_spesh_alloc(tc, g, num_locals * sizeof(MVMSpeshFacts *)); g->fact_counts = MVM_spesh_alloc(tc, g, num_locals * sizeof(MVMuint16)); for (i = 0; i < num_locals; i++) { g->fact_counts[i] = var_info[i].count; g->facts[i] = MVM_spesh_alloc(tc, g, var_info[i].count * sizeof(MVMSpeshFacts)); if (var_info[i].stack_alloc) { MVM_free(var_info[i].stack); MVM_free(var_info[i].ass_nodes); } } MVM_free(var_info); } /* Takes a static frame and creates a spesh graph for it. */ MVMSpeshGraph * MVM_spesh_graph_create(MVMThreadContext *tc, MVMStaticFrame *sf, MVMuint32 cfg_only, MVMuint32 insert_object_nulls) { /* Create top-level graph object. */ MVMSpeshGraph *g = MVM_calloc(1, sizeof(MVMSpeshGraph)); g->sf = sf; g->bytecode = sf->body.bytecode; g->bytecode_size = sf->body.bytecode_size; g->handlers = sf->body.handlers; g->num_handlers = sf->body.num_handlers; g->num_locals = sf->body.num_locals; g->num_lexicals = sf->body.num_lexicals; g->phi_infos = MVM_spesh_alloc(tc, g, MVMPhiNodeCacheSize * sizeof(MVMOpInfo)); /* Ensure the frame is validated, since we'll rely on this. */ if (sf->body.instrumentation_level == 0) { MVM_spesh_graph_destroy(tc, g); MVM_oops(tc, "Spesh: cannot build CFG from unvalidated frame"); } /* Build the CFG out of the static frame, and transform it to SSA. */ build_cfg(tc, g, sf, NULL, 0); if (insert_object_nulls) insert_object_null_instructions(tc, g); if (!cfg_only) { MVM_spesh_eliminate_dead_bbs(tc, g, 0); add_predecessors(tc, g); ssa(tc, g); } /* Hand back the completed graph. */ return g; } /* Takes a static frame and creates a spesh graph for it. */ MVMSpeshGraph * MVM_spesh_graph_create_from_cand(MVMThreadContext *tc, MVMStaticFrame *sf, MVMSpeshCandidate *cand, MVMuint32 cfg_only) { /* Create top-level graph object. */ MVMSpeshGraph *g = MVM_calloc(1, sizeof(MVMSpeshGraph)); g->sf = sf; g->bytecode = cand->bytecode; g->bytecode_size = cand->bytecode_size; g->handlers = cand->handlers; g->num_handlers = cand->num_handlers; g->num_locals = cand->num_locals; g->num_lexicals = cand->num_lexicals; g->inlines = cand->inlines; g->num_inlines = cand->num_inlines; g->deopt_addrs = cand->deopts; g->num_deopt_addrs = cand->num_deopts; g->alloc_deopt_addrs = cand->num_deopts; g->deopt_named_used_bit_field = cand->deopt_named_used_bit_field; g->local_types = cand->local_types; g->lexical_types = cand->lexical_types; g->spesh_slots = cand->spesh_slots; g->num_spesh_slots = cand->num_spesh_slots; g->phi_infos = MVM_spesh_alloc(tc, g, MVMPhiNodeCacheSize * sizeof(MVMOpInfo)); g->cand = cand; /* Ensure the frame is validated, since we'll rely on this. */ if (sf->body.instrumentation_level == 0) { MVM_spesh_graph_destroy(tc, g); MVM_oops(tc, "Spesh: cannot build CFG from unvalidated frame"); } /* Build the CFG out of the static frame, and transform it to SSA. */ build_cfg(tc, g, sf, cand->deopts, cand->num_deopts); if (!cfg_only) { MVM_spesh_eliminate_dead_bbs(tc, g, 0); add_predecessors(tc, g); ssa(tc, g); } /* Hand back the completed graph. */ return g; } /* Recomputes the dominance tree, after modifications to the CFG. */ void MVM_spesh_graph_recompute_dominance(MVMThreadContext *tc, MVMSpeshGraph *g) { MVMSpeshBB **rpo; MVMint32 *doms; /* First, clear away all existing dominance tree information; we also toss * out all of the predecessors, in case they got out of sync (should try * and fix things up to not need this in the future). */ MVMSpeshBB *cur_bb = g->entry; while (cur_bb) { cur_bb->children = NULL; cur_bb->num_children = 0; cur_bb->pred = NULL; cur_bb->num_pred = 0; cur_bb = cur_bb->linear_next; } /* Now form the new dominance tree. */ add_predecessors(tc, g); rpo = reverse_postorder(tc, g); doms = compute_dominators(tc, g, rpo); add_children(tc, g, rpo, doms); MVM_free(rpo); MVM_free(doms); } /* Marks GCables held in a spesh graph. */ void MVM_spesh_graph_mark(MVMThreadContext *tc, MVMSpeshGraph *g, MVMGCWorklist *worklist) { MVMuint16 i, j, num_locals, num_facts, *local_types; /* Mark static frame. */ MVM_gc_worklist_add(tc, worklist, &g->sf); /* Mark facts. */ num_locals = g->num_locals; local_types = g->local_types ? g->local_types : g->sf->body.local_types; for (i = 0; i < num_locals; i++) { num_facts = g->fact_counts[i]; for (j = 0; j < num_facts; j++) { MVMint32 flags = g->facts[i][j].flags; if (flags & MVM_SPESH_FACT_KNOWN_TYPE) MVM_gc_worklist_add(tc, worklist, &(g->facts[i][j].type)); if (flags & MVM_SPESH_FACT_KNOWN_DECONT_TYPE) MVM_gc_worklist_add(tc, worklist, &(g->facts[i][j].decont_type)); if (flags & MVM_SPESH_FACT_KNOWN_VALUE) { if (local_types[i] == MVM_reg_obj) MVM_gc_worklist_add(tc, worklist, &(g->facts[i][j].value.o)); else if (local_types[i] == MVM_reg_str) MVM_gc_worklist_add(tc, worklist, &(g->facts[i][j].value.s)); } } } } /* Destroys a spesh graph, deallocating all its associated memory. */ void MVM_spesh_graph_destroy(MVMThreadContext *tc, MVMSpeshGraph *g) { /* Free all of the allocated node memory. */ MVM_region_destroy(tc, &g->region_alloc); /* Free handlers array, if different from the static frame. */ if (!g->cand && g->handlers && g->handlers != g->sf->body.handlers) MVM_free(g->handlers); /* Free the graph itself. */ MVM_free(g); } MoarVM-2018.03/src/spesh/graph.h0000644000175000017510000002106513242626641016400 0ustar samanthasamantha#define MVMPhiNodeCacheSize 48 #define MVMPhiNodeCacheSparseBegin 32 /* Top level of a spesh graph, representing a particular static frame (and * potentially having others inlined into it). */ struct MVMSpeshGraph { /* The static frame this is the spesh graph for. */ MVMStaticFrame *sf; /* The callsite this spesh graph has been tailored to. */ MVMCallsite *cs; /* The bytecode we're building the graph out of. */ MVMuint8 *bytecode; /* Exception handler map for that bytecode. */ MVMFrameHandler *handlers; /* Handlers that have become unreachable due to dead code removal. */ MVMint8 *unreachable_handlers; /* The size of the bytecode we're building the graph out of. */ MVMuint32 bytecode_size; /* Number of exception handlers. */ MVMuint32 num_handlers; /* The entry basic block. */ MVMSpeshBB *entry; /* Gathered facts about each version of a local (top-level array is per * local, then array hanging off it is per version). */ MVMSpeshFacts **facts; /* Number of fact entries per local. */ MVMuint16 *fact_counts; /* Log-based guards added. */ MVMSpeshLogGuard *log_guards; /* Number of log-based guards we have. */ MVMint32 num_log_guards; /* Region allocator for spesh nodes */ MVMRegionAlloc region_alloc; /* Values placed in spesh slots. */ MVMCollectable **spesh_slots; /* Number of spesh slots we have used and allocated. */ MVMint32 num_spesh_slots; MVMint32 alloc_spesh_slots; /* De-opt indexes, as pairs of integers. The first integer, set when we * build the graph, is the return address in the original bytecode. The * code-gen phase for the specialized bytecode will fill in the second * integers afterwards, which are the return address in the specialized * bytecode. */ MVMint32 *deopt_addrs; MVMint32 num_deopt_addrs; MVMint32 alloc_deopt_addrs; /* Bit field of named args used to put in place during deopt, since we * don't typically don't update the array in specialized code. */ MVMuint64 deopt_named_used_bit_field; /* Table of information about inlines, laid out in order of nesting * depth. Thus, going through the table in order and finding when we * are within the bounds will show up each call frame that needs to * be created in deopt. */ MVMSpeshInline *inlines; MVMint32 num_inlines; /* Number of basic blocks we have. */ MVMint32 num_bbs; /* The list of local types (only set up if we do inlines). */ MVMuint16 *local_types; /* The list of lexical types (only set up if we do inlines). */ MVMuint16 *lexical_types; /* The total number of locals, accounting for any inlining done and * added temporaries. */ MVMuint16 num_locals; /* The total number of lexicals, accounting for any inlining done. */ MVMuint16 num_lexicals; /* Temporary local registers added to aid transformations, along with a * count of the number we have and have allocated space for so far. */ MVMuint16 num_temps; MVMuint16 alloc_temps; MVMSpeshTemporary *temps; /* We need to create new MVMOpInfo structs for each number of * arguments a PHI node can take. We cache them here, so that we * allocate fewer of them across our spesh alloc blocks. */ MVMOpInfo *phi_infos; /* If this graph was formed from a spesh candidate rather than an * original static frame, the candidate will be stored here. */ MVMSpeshCandidate *cand; /* Did we specialize on the invocant type? */ MVMuint8 specialized_on_invocant; }; /* A temporary register, added to support transformations. */ struct MVMSpeshTemporary { /* The number of the local along with the current SSA index. */ MVMuint16 orig; MVMuint16 i; /* What kind of register is it? */ MVMuint16 kind; /* Is it currently in use? */ MVMuint16 in_use; }; /* A basic block in the graph (sequences of instructions where control will * always enter at the start and leave at the end). */ struct MVMSpeshBB { /* Head/tail of doubly linked list of instructions. */ MVMSpeshIns *first_ins; MVMSpeshIns *last_ins; /* Basic blocks we may go to after this one. */ MVMSpeshBB **succ; /* Basic blocks that we may arrive into this one from. */ MVMSpeshBB **pred; /* Children in the dominator tree. */ MVMSpeshBB **children; /* Dominance frontier set. */ MVMSpeshBB **df; /* Basic blocks that we may go to if we throw. */ MVMSpeshBB **handler_succ; /* Counts for the above, grouped together to avoid alignment holes. */ MVMuint16 num_succ; MVMuint16 num_pred; MVMuint16 num_children; MVMuint16 num_df; MVMuint16 num_handler_succ; /* The next basic block in original linear code order. */ MVMSpeshBB *linear_next; /* Index (just an ascending integer along the linear_next chain), used as * the block identifier in dominance computation and for debug output. */ MVMint32 idx; /* The block's reverse post-order index, assinged when computing * dominance. */ MVMint32 rpo_idx; /* We cache the instruction pointer of the very first instruction so that * we can output a line number for every BB */ MVMuint32 initial_pc; /* Is this block an inlining of another one? */ MVMint8 inlined; /* Is this basic block part of a jump list? */ MVMint8 jumplist; /* Is this basic block dead (removed due to being unreachable)? */ MVMint8 dead; }; /* The SSA phi instruction. */ #define MVM_SSA_PHI 32767 /* An instruction in the spesh graph. */ struct MVMSpeshIns { /* Instruction information. */ const MVMOpInfo *info; /* Operand information. */ MVMSpeshOperand *operands; /* Previous and next instructions, within a basic block boundary. */ MVMSpeshIns *prev; MVMSpeshIns *next; /* Any annotations on the instruction. */ MVMSpeshAnn *annotations; }; /* Union type of operands in a spesh instruction; the op info and phase of the * optimizer we're in determines which of these we look at. */ union MVMSpeshOperand { MVMint64 lit_i64; MVMint32 lit_i32; MVMuint16 lit_ui32; MVMint16 lit_i16; MVMuint16 lit_ui16; MVMint8 lit_i8; MVMnum64 lit_n64; MVMnum32 lit_n32; MVMuint32 lit_str_idx; MVMuint16 callsite_idx; MVMuint16 coderef_idx; MVMuint32 ins_offset; MVMSpeshBB *ins_bb; struct { MVMuint16 idx; MVMuint16 outers; } lex; struct { MVMint32 i; /* SSA-computed version. */ MVMuint16 orig; /* Original register number. */ } reg; }; /* Annotations base. */ struct MVMSpeshAnn { /* The next annotation in the chain, if any. */ MVMSpeshAnn *next; /* The type of annotation we have. */ MVMint32 type; /* Data (meaning depends on type). */ union { MVMint32 frame_handler_index; MVMint32 deopt_idx; MVMint32 inline_idx; MVMuint32 bytecode_offset; struct { MVMuint32 filename_string_index; MVMuint32 line_number; } lineno; } data; }; /* Annotation types. */ #define MVM_SPESH_ANN_FH_START 1 #define MVM_SPESH_ANN_FH_END 2 #define MVM_SPESH_ANN_FH_GOTO 3 #define MVM_SPESH_ANN_DEOPT_ONE_INS 4 #define MVM_SPESH_ANN_DEOPT_ALL_INS 5 #define MVM_SPESH_ANN_INLINE_START 6 #define MVM_SPESH_ANN_INLINE_END 7 #define MVM_SPESH_ANN_DEOPT_INLINE 8 #define MVM_SPESH_ANN_DEOPT_OSR 9 #define MVM_SPESH_ANN_LINENO 10 #define MVM_SPESH_ANN_LOGGED 11 /* Functions to create/destroy the spesh graph. */ MVMSpeshGraph * MVM_spesh_graph_create(MVMThreadContext *tc, MVMStaticFrame *sf, MVMuint32 cfg_only, MVMuint32 insert_object_nulls); MVMSpeshGraph * MVM_spesh_graph_create_from_cand(MVMThreadContext *tc, MVMStaticFrame *sf, MVMSpeshCandidate *cand, MVMuint32 cfg_only); MVMSpeshBB * MVM_spesh_graph_linear_prev(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *search); void MVM_spesh_graph_add_deopt_annotation(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins_node, MVMuint32 deopt_target, MVMint32 type); void MVM_spesh_graph_recompute_dominance(MVMThreadContext *tc, MVMSpeshGraph *g); void MVM_spesh_graph_mark(MVMThreadContext *tc, MVMSpeshGraph *g, MVMGCWorklist *worklist); void MVM_spesh_graph_destroy(MVMThreadContext *tc, MVMSpeshGraph *g); MVM_PUBLIC void * MVM_spesh_alloc(MVMThreadContext *tc, MVMSpeshGraph *g, size_t bytes); MVMOpInfo *get_phi(MVMThreadContext *tc, MVMSpeshGraph *g, MVMuint32 nrargs); MoarVM-2018.03/src/spesh/inline.c0000644000175000017510000012435513242626641016556 0ustar samanthasamantha#include "moar.h" /* Ensures that a given compilation unit has access to the specified extop. */ static void demand_extop(MVMThreadContext *tc, MVMCompUnit *target_cu, MVMCompUnit *source_cu, const MVMOpInfo *info) { MVMExtOpRecord *extops; MVMuint16 i, num_extops; uv_mutex_lock(target_cu->body.inline_tweak_mutex); /* See if the target compunit already has the extop. */ extops = target_cu->body.extops; num_extops = target_cu->body.num_extops; for (i = 0; i < num_extops; i++) if (extops[i].info == info) { uv_mutex_unlock(target_cu->body.inline_tweak_mutex); return; } /* If not, need to add it. Locate it in the source CU. */ extops = source_cu->body.extops; num_extops = source_cu->body.num_extops; for (i = 0; i < num_extops; i++) { if (extops[i].info == info) { MVMuint32 orig_size = target_cu->body.num_extops * sizeof(MVMExtOpRecord); MVMuint32 new_size = (target_cu->body.num_extops + 1) * sizeof(MVMExtOpRecord); MVMExtOpRecord *new_extops = MVM_fixed_size_alloc(tc, tc->instance->fsa, new_size); memcpy(new_extops, target_cu->body.extops, orig_size); memcpy(&new_extops[target_cu->body.num_extops], &extops[i], sizeof(MVMExtOpRecord)); if (target_cu->body.extops) MVM_fixed_size_free_at_safepoint(tc, tc->instance->fsa, orig_size, target_cu->body.extops); target_cu->body.extops = new_extops; target_cu->body.num_extops++; uv_mutex_unlock(target_cu->body.inline_tweak_mutex); return; } } /* Didn't find it; should be impossible. */ uv_mutex_unlock(target_cu->body.inline_tweak_mutex); MVM_oops(tc, "Spesh: inline failed to find source CU extop entry"); } /* Sees if it will be possible to inline the target code ref, given we could * already identify a spesh candidate. Returns NULL if no inlining is possible * or a graph ready to be merged if it will be possible. */ MVMSpeshGraph * MVM_spesh_inline_try_get_graph(MVMThreadContext *tc, MVMSpeshGraph *inliner, MVMStaticFrame *target_sf, MVMSpeshCandidate *cand, MVMSpeshIns *invoke_ins, char **no_inline_reason) { MVMSpeshGraph *ig; MVMSpeshBB *bb; MVMint32 same_hll; /* Check inlining is enabled. */ if (!tc->instance->spesh_inline_enabled) { *no_inline_reason = "inlining is disabled"; return NULL; } /* Check frame is not marked as not being allowed to be inlined. */ if (target_sf->body.no_inline) { *no_inline_reason = "the frame is marked as no-inline"; return NULL; } /* Check bytecode size is within the inline limit. */ if (cand->bytecode_size > MVM_SPESH_MAX_INLINE_SIZE) { *no_inline_reason = "bytecode is too large to inline"; return NULL; } /* Ensure that this isn't a recursive inlining. */ if (target_sf == inliner->sf) { *no_inline_reason = "recursive calls cannot be inlined"; return NULL; } /* Ensure it has no state vars (these need the setup code in frame * invoke). */ if (target_sf->body.has_state_vars) { *no_inline_reason = "cannot inline code that declares a state variable"; return NULL; } /* Ensure it's not a thunk (need to skip over those in exception search). */ if (target_sf->body.is_thunk) { *no_inline_reason = "cannot inline code marked as a thunk"; return NULL; } /* If they're from the same HLL, we'll need to watch out for ops that are * HLL sensitive. */ same_hll = target_sf->body.cu->body.hll_config == inliner->sf->body.cu->body.hll_config; /* Build graph from the already-specialized bytecode. */ ig = MVM_spesh_graph_create_from_cand(tc, target_sf, cand, 0); /* Traverse graph, looking for anything that might prevent inlining and * also building usage counts up. */ bb = ig->entry; while (bb) { MVMSpeshIns *ins = bb->first_ins; while (ins) { /* Track usages. */ MVMint32 opcode = ins->info->opcode; MVMint32 is_phi = opcode == MVM_SSA_PHI; MVMuint8 i; for (i = 0; i < ins->info->num_operands; i++) if ((is_phi && i > 0) || (!is_phi && (ins->info->operands[i] & MVM_operand_rw_mask) == MVM_operand_read_reg)) ig->facts[ins->operands[i].reg.orig][ins->operands[i].reg.i].usages++; if (opcode == MVM_OP_inc_i || opcode == MVM_OP_inc_u || opcode == MVM_OP_dec_i || opcode == MVM_OP_dec_u) ig->facts[ins->operands[0].reg.orig][ins->operands[0].reg.i - 1].usages++; /* Instruction may be marked directly as not being inlinable, in * which case we're done. */ if (!is_phi && ins->info->no_inline) { *no_inline_reason = "target has a :noinline instruction"; goto not_inlinable; } /* If we don't have the same HLL and there's a :useshll op, we * cannot inline. */ if (!same_hll && ins->info->uses_hll) { *no_inline_reason = "target has a :useshll instruction and HLLs are different"; goto not_inlinable; } /* If we have an invoke_o, but a return_[ins] that would require * boxing, we can't inline if it's not the same HLL. */ if (!same_hll && invoke_ins->info->opcode == MVM_OP_invoke_o) { switch (ins->info->opcode) { case MVM_OP_return_i: case MVM_OP_return_n: case MVM_OP_return_s: *no_inline_reason = "target needs a return boxing and HLLs are different"; goto not_inlinable; } } /* If we have lexical bind, make sure it's within the frame. */ if (ins->info->opcode == MVM_OP_bindlex) { if (ins->operands[0].lex.outers > 0) { *no_inline_reason = "target has bind to outer lexical"; goto not_inlinable; } } /* Check we don't have too many args for inlining to work out. */ else if (ins->info->opcode == MVM_OP_sp_getarg_o || ins->info->opcode == MVM_OP_sp_getarg_i || ins->info->opcode == MVM_OP_sp_getarg_n || ins->info->opcode == MVM_OP_sp_getarg_s) { if (ins->operands[1].lit_i16 >= MAX_ARGS_FOR_OPT) { *no_inline_reason = "too many arguments to inline"; goto not_inlinable; } } /* Ext-ops need special care in inter-comp-unit inlines. */ if (ins->info->opcode == (MVMuint16)-1) { MVMCompUnit *target_cu = inliner->sf->body.cu; MVMCompUnit *source_cu = target_sf->body.cu; if (source_cu != target_cu) demand_extop(tc, target_cu, source_cu, ins->info); } ins = ins->next; } bb = bb->linear_next; } /* If we found nothing we can't inline, inlining is fine. */ return ig; /* If we can't find a way to inline, we end up here. */ not_inlinable: MVM_spesh_graph_destroy(tc, ig); return NULL; } /* Finds the deopt index of the return. */ static MVMint32 return_deopt_idx(MVMThreadContext *tc, MVMSpeshIns *invoke_ins) { MVMSpeshAnn *ann = invoke_ins->annotations; while (ann) { if (ann->type == MVM_SPESH_ANN_DEOPT_ALL_INS) return ann->data.deopt_idx; ann = ann->next; } MVM_oops(tc, "Spesh inline: return_deopt_idx failed"); } /* The following routines fix references to per-compilation-unit things * that would be broken by inlining. */ static void fix_callsite(MVMThreadContext *tc, MVMSpeshGraph *inliner, MVMSpeshGraph *inlinee, MVMSpeshOperand *to_fix) { to_fix->callsite_idx = MVM_cu_callsite_add(tc, inliner->sf->body.cu, inlinee->sf->body.cu->body.callsites[to_fix->callsite_idx]); } static void fix_coderef(MVMThreadContext *tc, MVMSpeshGraph *inliner, MVMSpeshGraph *inlinee, MVMSpeshOperand *to_fix) { MVM_oops(tc, "Spesh inline: fix_coderef NYI"); } static void fix_str(MVMThreadContext *tc, MVMSpeshGraph *inliner, MVMSpeshGraph *inlinee, MVMSpeshOperand *to_fix) { to_fix->lit_str_idx = MVM_cu_string_add(tc, inliner->sf->body.cu, MVM_cu_string(tc, inlinee->sf->body.cu, to_fix->lit_str_idx)); } static void fix_wval(MVMThreadContext *tc, MVMSpeshGraph *inliner, MVMSpeshGraph *inlinee, MVMSpeshIns *to_fix) { /* Resolve object, then just put it into a spesh slot. (Could do some * smarter things like trying to see if the SC is referenced by both * compilation units, too.) */ MVMCompUnit *cu = inlinee->sf->body.cu; MVMint16 dep = to_fix->operands[1].lit_i16; MVMint64 idx = to_fix->info->opcode == MVM_OP_wval ? to_fix->operands[2].lit_i16 : to_fix->operands[2].lit_i64; if (dep >= 0 && dep < cu->body.num_scs) { MVMSerializationContext *sc = MVM_sc_get_sc(tc, cu, dep); if (sc) { MVMObject *obj = MVM_sc_get_object(tc, sc, idx); MVMint16 ss = MVM_spesh_add_spesh_slot(tc, inliner, (MVMCollectable *)obj); to_fix->info = MVM_op_get_op(MVM_OP_sp_getspeshslot); to_fix->operands[1].lit_i16 = ss; } else { MVM_oops(tc, "Spesh inline: SC not yet resolved; lookup failed"); } } else { MVM_oops(tc, "Spesh inline: invalid SC index %d found", dep); } } /* Resizes the handlers table, making a copy if needed. */ static void resize_handlers_table(MVMThreadContext *tc, MVMSpeshGraph *inliner, MVMuint32 new_handler_count) { if (inliner->handlers == inliner->sf->body.handlers) { /* Original handlers table; need a copy. */ MVMFrameHandler *new_handlers = MVM_malloc(new_handler_count * sizeof(MVMFrameHandler)); if (inliner->handlers) memcpy(new_handlers, inliner->handlers, inliner->num_handlers * sizeof(MVMFrameHandler)); inliner->handlers = new_handlers; } else { /* Probably already did some inlines into this frame; resize. */ inliner->handlers = MVM_realloc(inliner->handlers, new_handler_count * sizeof(MVMFrameHandler)); } } /* Rewrites a lexical lookup to an outer to be done via. a register holding * the outer coderef. */ static void rewrite_outer_lookup(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins, MVMuint16 num_locals, MVMuint16 op, MVMSpeshOperand code_ref_reg) { MVMSpeshOperand *new_operands = MVM_spesh_alloc(tc, g, 4 * sizeof(MVMSpeshOperand)); new_operands[0] = ins->operands[0]; new_operands[0].reg.orig += num_locals; new_operands[1].lit_ui16 = ins->operands[1].lex.idx; new_operands[2].lit_ui16 = ins->operands[1].lex.outers; new_operands[3] = code_ref_reg; ins->info = MVM_op_get_op(op); ins->operands = new_operands; } /* Merges the inlinee's spesh graph into the inliner. */ MVMSpeshBB * merge_graph(MVMThreadContext *tc, MVMSpeshGraph *inliner, MVMSpeshGraph *inlinee, MVMStaticFrame *inlinee_sf, MVMSpeshBB *invoke_bb, MVMSpeshIns *invoke_ins, MVMSpeshOperand code_ref_reg, MVMuint32 *inline_boundary_handler) { MVMSpeshFacts **merged_facts; MVMuint16 *merged_fact_counts; MVMint32 i, orig_inlines, total_inlines, orig_deopt_addrs; MVMuint32 total_handlers = inliner->num_handlers + inlinee->num_handlers + 1; MVMSpeshBB *inlinee_first_bb = NULL, *inlinee_last_bb = NULL; /* If the inliner and inlinee are from different compilation units, we * potentially have to fix up extra things. */ MVMint32 same_comp_unit = inliner->sf->body.cu == inlinee->sf->body.cu; /* Renumber the locals, lexicals, and basic blocks of the inlinee; also * re-write any indexes in annotations that need it. */ MVMSpeshBB *bb = inlinee->entry; while (bb) { MVMSpeshIns *ins = bb->first_ins; while (ins) { MVMuint16 opcode = ins->info->opcode; MVMSpeshAnn *ann = ins->annotations; while (ann) { switch (ann->type) { case MVM_SPESH_ANN_DEOPT_INLINE: ann->data.deopt_idx += inliner->num_deopt_addrs; break; case MVM_SPESH_ANN_INLINE_START: case MVM_SPESH_ANN_INLINE_END: ann->data.inline_idx += inliner->num_inlines; break; } ann = ann->next; } if (opcode == MVM_SSA_PHI) { for (i = 0; i < ins->info->num_operands; i++) ins->operands[i].reg.orig += inliner->num_locals; } else if (opcode == MVM_OP_sp_getlex_o && ins->operands[1].lex.outers > 0) { rewrite_outer_lookup(tc, inliner, ins, inliner->num_locals, MVM_OP_sp_getlexvia_o, code_ref_reg); } else if (opcode == MVM_OP_sp_getlex_ins && ins->operands[1].lex.outers > 0) { rewrite_outer_lookup(tc, inliner, ins, inliner->num_locals, MVM_OP_sp_getlexvia_ins, code_ref_reg); } else if (opcode == MVM_OP_getlex && ins->operands[1].lex.outers > 0) { MVMuint16 outers = ins->operands[1].lex.outers; MVMStaticFrame *outer = inlinee_sf; while (outers--) outer = outer->body.outer; if (outer->body.lexical_types[ins->operands[1].lex.idx] == MVM_reg_obj) rewrite_outer_lookup(tc, inliner, ins, inliner->num_locals, MVM_OP_sp_getlexvia_o, code_ref_reg); else rewrite_outer_lookup(tc, inliner, ins, inliner->num_locals, MVM_OP_sp_getlexvia_ins, code_ref_reg); } else { for (i = 0; i < ins->info->num_operands; i++) { MVMuint8 flags = ins->info->operands[i]; switch (flags & MVM_operand_rw_mask) { case MVM_operand_read_reg: case MVM_operand_write_reg: ins->operands[i].reg.orig += inliner->num_locals; break; case MVM_operand_read_lex: case MVM_operand_write_lex: ins->operands[i].lex.idx += inliner->num_lexicals; break; default: { MVMuint32 type = flags & MVM_operand_type_mask; if (type == MVM_operand_spesh_slot) { ins->operands[i].lit_i16 += inliner->num_spesh_slots; } else if (type == MVM_operand_callsite) { if (!same_comp_unit) fix_callsite(tc, inliner, inlinee, &(ins->operands[i])); } else if (type == MVM_operand_coderef) { if (!same_comp_unit) fix_coderef(tc, inliner, inlinee, &(ins->operands[i])); } else if (type == MVM_operand_str) { if (!same_comp_unit) fix_str(tc, inliner, inlinee, &(ins->operands[i])); } break; } } } } ins = ins->next; } bb->idx += inliner->num_bbs - 1; /* -1 as we won't include entry */ bb->inlined = 1; if (!bb->linear_next) inlinee_last_bb = bb; bb = bb->linear_next; } bb = invoke_bb->linear_next; invoke_bb->linear_next = inlinee_first_bb = inlinee->entry->linear_next; inlinee_last_bb->linear_next = bb; bb = NULL; /* Make all of the inlinee's entry block's successors (except the linear * next) also be successors of the inliner's entry block; this keeps any * exception handlers alive in the graph. */ while (inlinee->entry->num_succ > 1) { MVMSpeshBB *move = inlinee->entry->succ[0] == inlinee->entry->linear_next ? inlinee->entry->succ[1] : inlinee->entry->succ[0]; MVM_spesh_manipulate_remove_successor(tc, inlinee->entry, move); MVM_spesh_manipulate_add_successor(tc, inliner, inliner->entry, move); } /* Merge facts. */ merged_facts = MVM_spesh_alloc(tc, inliner, (inliner->num_locals + inlinee->num_locals) * sizeof(MVMSpeshFacts *)); memcpy(merged_facts, inliner->facts, inliner->num_locals * sizeof(MVMSpeshFacts *)); memcpy(merged_facts + inliner->num_locals, inlinee->facts, inlinee->num_locals * sizeof(MVMSpeshFacts *)); inliner->facts = merged_facts; merged_fact_counts = MVM_spesh_alloc(tc, inliner, (inliner->num_locals + inlinee->num_locals) * sizeof(MVMuint16)); memcpy(merged_fact_counts, inliner->fact_counts, inliner->num_locals * sizeof(MVMuint16)); memcpy(merged_fact_counts + inliner->num_locals, inlinee->fact_counts, inlinee->num_locals * sizeof(MVMuint16)); inliner->fact_counts = merged_fact_counts; /* Copy over spesh slots. */ for (i = 0; i < inlinee->num_spesh_slots; i++) MVM_spesh_add_spesh_slot(tc, inliner, inlinee->spesh_slots[i]); /* If they are from separate compilation units, make another pass through * to fix up on wvals. Note we can't do this in the first pass as we must * not modify the spesh slots once we've got started with the rewrites. * Now we've resolved all that, we're good to map wvals elsewhere into * some extra spesh slots. */ if (!same_comp_unit) { bb = inlinee->entry; while (1) { MVMSpeshIns *ins = bb->first_ins; while (ins) { MVMuint16 opcode = ins->info->opcode; if (opcode == MVM_OP_wval || opcode == MVM_OP_wval_wide) fix_wval(tc, inliner, inlinee, ins); ins = ins->next; } if (bb == inlinee_last_bb) break; bb = bb->linear_next; } } /* Merge de-opt tables, if needed. */ orig_deopt_addrs = inliner->num_deopt_addrs; if (inlinee->num_deopt_addrs) { assert(inlinee->deopt_addrs != inliner->deopt_addrs); inliner->alloc_deopt_addrs += inlinee->alloc_deopt_addrs; if (inliner->deopt_addrs) inliner->deopt_addrs = MVM_realloc(inliner->deopt_addrs, inliner->alloc_deopt_addrs * sizeof(MVMint32) * 2); else inliner->deopt_addrs = MVM_malloc(inliner->alloc_deopt_addrs * sizeof(MVMint32) * 2); memcpy(inliner->deopt_addrs + inliner->num_deopt_addrs * 2, inlinee->deopt_addrs, inlinee->alloc_deopt_addrs * sizeof(MVMint32) * 2); inliner->num_deopt_addrs += inlinee->num_deopt_addrs; } /* Merge inlines table, and add us an entry too. */ orig_inlines = inliner->num_inlines; total_inlines = inliner->num_inlines + inlinee->num_inlines + 1; inliner->inlines = inliner->num_inlines ? MVM_realloc(inliner->inlines, total_inlines * sizeof(MVMSpeshInline)) : MVM_malloc(total_inlines * sizeof(MVMSpeshInline)); if (inlinee->num_inlines) memcpy(inliner->inlines + inliner->num_inlines, inlinee->inlines, inlinee->num_inlines * sizeof(MVMSpeshInline)); for (i = inliner->num_inlines; i < total_inlines - 1; i++) { inliner->inlines[i].code_ref_reg += inliner->num_locals; inliner->inlines[i].locals_start += inliner->num_locals; inliner->inlines[i].lexicals_start += inliner->num_lexicals; inliner->inlines[i].return_deopt_idx += orig_deopt_addrs; } inliner->inlines[total_inlines - 1].sf = inlinee_sf; inliner->inlines[total_inlines - 1].code_ref_reg = code_ref_reg.reg.orig; inliner->inlines[total_inlines - 1].g = inlinee; inliner->inlines[total_inlines - 1].locals_start = inliner->num_locals; inliner->inlines[total_inlines - 1].lexicals_start = inliner->num_lexicals; inliner->inlines[total_inlines - 1].num_locals = inlinee->num_locals; switch (invoke_ins->info->opcode) { case MVM_OP_invoke_v: inliner->inlines[total_inlines - 1].res_type = MVM_RETURN_VOID; break; case MVM_OP_invoke_o: inliner->inlines[total_inlines - 1].res_reg = invoke_ins->operands[0].reg.orig; inliner->inlines[total_inlines - 1].res_type = MVM_RETURN_OBJ; break; case MVM_OP_invoke_i: inliner->inlines[total_inlines - 1].res_reg = invoke_ins->operands[0].reg.orig; inliner->inlines[total_inlines - 1].res_type = MVM_RETURN_INT; break; case MVM_OP_invoke_n: inliner->inlines[total_inlines - 1].res_reg = invoke_ins->operands[0].reg.orig; inliner->inlines[total_inlines - 1].res_type = MVM_RETURN_NUM; break; case MVM_OP_invoke_s: inliner->inlines[total_inlines - 1].res_reg = invoke_ins->operands[0].reg.orig; inliner->inlines[total_inlines - 1].res_type = MVM_RETURN_STR; break; default: MVM_oops(tc, "Spesh inline: unknown invoke instruction"); } inliner->inlines[total_inlines - 1].return_deopt_idx = return_deopt_idx(tc, invoke_ins); inliner->inlines[total_inlines - 1].unreachable = 0; inliner->inlines[total_inlines - 1].deopt_named_used_bit_field = inlinee->deopt_named_used_bit_field; inliner->num_inlines = total_inlines; /* Create/update per-specialization local and lexical type maps. */ if (!inliner->local_types && inliner->num_locals) { MVMint32 local_types_size = inliner->num_locals * sizeof(MVMuint16); inliner->local_types = MVM_malloc(local_types_size); memcpy(inliner->local_types, inliner->sf->body.local_types, local_types_size); } inliner->local_types = MVM_realloc(inliner->local_types, (inliner->num_locals + inlinee->num_locals) * sizeof(MVMuint16)); if (inlinee->num_locals) memcpy(inliner->local_types + inliner->num_locals, inlinee->local_types ? inlinee->local_types : inlinee->sf->body.local_types, inlinee->num_locals * sizeof(MVMuint16)); if (!inliner->lexical_types && inliner->num_lexicals) { MVMint32 lexical_types_size = inliner->num_lexicals * sizeof(MVMuint16); inliner->lexical_types = MVM_malloc(lexical_types_size); memcpy(inliner->lexical_types, inliner->sf->body.lexical_types, lexical_types_size); } inliner->lexical_types = MVM_realloc(inliner->lexical_types, (inliner->num_lexicals + inlinee->num_lexicals) * sizeof(MVMuint16)); if (inlinee->num_lexicals) memcpy(inliner->lexical_types + inliner->num_lexicals, inlinee->lexical_types ? inlinee->lexical_types : inlinee->sf->body.lexical_types, inlinee->num_lexicals * sizeof(MVMuint16)); /* Merge unreachable handlers array if needed. */ if (inliner->unreachable_handlers || inlinee->unreachable_handlers) { MVMint8 *new_uh = MVM_spesh_alloc(tc, inliner, total_handlers); if (inlinee->unreachable_handlers) memcpy(new_uh, inlinee->unreachable_handlers, inlinee->num_handlers); new_uh[inlinee->num_handlers] = 0; if (inliner->unreachable_handlers) memcpy(new_uh + inlinee->num_handlers + 1, inliner->unreachable_handlers, inliner->num_handlers); inliner->unreachable_handlers = new_uh; } /* Merge handlers from inlinee. */ resize_handlers_table(tc, inliner, total_handlers); if (inliner->num_handlers > 0) memmove(inliner->handlers + inlinee->num_handlers + 1, inliner->handlers, inliner->num_handlers * sizeof(MVMFrameHandler)); if (inlinee->num_handlers > 0) { memcpy(inliner->handlers, inlinee->handlers, inlinee->num_handlers * sizeof(MVMFrameHandler)); for (i = 0; i < inlinee->num_handlers; i++) { inliner->handlers[i].block_reg += inliner->num_locals; inliner->handlers[i].label_reg += inliner->num_locals; if (inliner->handlers[i].inlinee == -1) inliner->handlers[i].inlinee = total_inlines - 1; else inliner->handlers[i].inlinee += orig_inlines; } } /* Adjust indexes in inliner's frame handler annotations */ bb = inliner->entry; while (bb) { if (bb == inlinee_first_bb) /* No need to adjust inlinee's annotations */ bb = inlinee_last_bb->linear_next; if (bb) { MVMSpeshIns *ins = bb->first_ins; while (ins) { MVMSpeshAnn *ann = ins->annotations; while (ann) { switch (ann->type) { case MVM_SPESH_ANN_FH_START: case MVM_SPESH_ANN_FH_END: case MVM_SPESH_ANN_FH_GOTO: ann->data.frame_handler_index += inlinee->num_handlers + 1; } ann = ann->next; } ins = ins->next; } bb = bb->linear_next; } } /* Insert inline boundary entry into the handlers table. */ *inline_boundary_handler = inlinee->num_handlers; inliner->handlers[*inline_boundary_handler].category_mask = MVM_EX_INLINE_BOUNDARY; inliner->handlers[*inline_boundary_handler].action = 0; inliner->handlers[*inline_boundary_handler].inlinee = total_inlines - 1; /* Update total locals, lexicals, basic blocks, and handlers of the * inliner. */ inliner->num_bbs += inlinee->num_bbs - 1; inliner->num_locals += inlinee->num_locals; inliner->num_lexicals += inlinee->num_lexicals; inliner->num_handlers += inlinee->num_handlers + 1; return inlinee_last_bb; } /* Tweak the successor of a BB, also updating the target BBs pred. */ static void tweak_succ(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshBB *new_succ) { if (bb->num_succ == 0) { /* It had no successors, so we'll add one. */ bb->succ = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshBB *)); bb->num_succ = 1; bb->succ[0] = new_succ; } else { /* Otherwise, we can assume that the first successor is the one to * update; others will be there as a result of control handlers, but * these are always added last. */ bb->succ[0] = new_succ; } if (new_succ->num_pred == 0) { new_succ->pred = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshBB *)); new_succ->num_pred = 1; new_succ->pred[0] = bb; } else { MVMint32 found = 0; MVMint32 i; for (i = 0; i < new_succ->num_pred; i++) if (new_succ->pred[i]->idx + 1 == new_succ->idx) { new_succ->pred[i] = bb; found = 1; break; } if (!found) MVM_oops(tc, "Spesh inline: could not find appropriate pred to update\n"); } } /* Finds return instructions and re-writes them into gotos, doing any needed * boxing or unboxing. */ static void return_to_set(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *return_ins, MVMSpeshOperand target) { MVMSpeshOperand *operands = MVM_spesh_alloc(tc, g, 2 * sizeof(MVMSpeshOperand)); operands[0] = target; operands[1] = return_ins->operands[0]; return_ins->info = MVM_op_get_op(MVM_OP_set); return_ins->operands = operands; } static void return_to_box(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *return_bb, MVMSpeshIns *return_ins, MVMSpeshOperand target, MVMuint16 box_type_op, MVMuint16 box_op) { /* Create and insert boxing instruction after current return instruction. */ MVMSpeshIns *box_ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); MVMSpeshOperand *box_operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand)); box_ins->info = MVM_op_get_op(box_op); box_ins->operands = box_operands; box_operands[0] = target; box_operands[1] = return_ins->operands[0]; box_operands[2] = target; MVM_spesh_manipulate_insert_ins(tc, return_bb, return_ins, box_ins); /* Now turn return instruction node into lookup of appropriate box * type. */ return_ins->info = MVM_op_get_op(box_type_op); return_ins->operands[0] = target; } static void rewrite_int_return(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *return_bb, MVMSpeshIns *return_ins, MVMSpeshBB *invoke_bb, MVMSpeshIns *invoke_ins) { switch (invoke_ins->info->opcode) { case MVM_OP_invoke_v: MVM_spesh_manipulate_delete_ins(tc, g, return_bb, return_ins); break; case MVM_OP_invoke_i: return_to_set(tc, g, return_ins, invoke_ins->operands[0]); break; case MVM_OP_invoke_o: return_to_box(tc, g, return_bb, return_ins, invoke_ins->operands[0], MVM_OP_hllboxtype_i, MVM_OP_box_i); break; default: MVM_oops(tc, "Spesh inline: unhandled case of return_i"); } } static void rewrite_num_return(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *return_bb, MVMSpeshIns *return_ins, MVMSpeshBB *invoke_bb, MVMSpeshIns *invoke_ins) { switch (invoke_ins->info->opcode) { case MVM_OP_invoke_v: MVM_spesh_manipulate_delete_ins(tc, g, return_bb, return_ins); break; case MVM_OP_invoke_n: return_to_set(tc, g, return_ins, invoke_ins->operands[0]); break; case MVM_OP_invoke_o: return_to_box(tc, g, return_bb, return_ins, invoke_ins->operands[0], MVM_OP_hllboxtype_n, MVM_OP_box_n); break; default: MVM_oops(tc, "Spesh inline: unhandled case of return_n"); } } static void rewrite_str_return(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *return_bb, MVMSpeshIns *return_ins, MVMSpeshBB *invoke_bb, MVMSpeshIns *invoke_ins) { switch (invoke_ins->info->opcode) { case MVM_OP_invoke_v: MVM_spesh_manipulate_delete_ins(tc, g, return_bb, return_ins); break; case MVM_OP_invoke_s: return_to_set(tc, g, return_ins, invoke_ins->operands[0]); break; case MVM_OP_invoke_o: return_to_box(tc, g, return_bb, return_ins, invoke_ins->operands[0], MVM_OP_hllboxtype_s, MVM_OP_box_s); break; default: MVM_oops(tc, "Spesh inline: unhandled case of return_s"); } } static void rewrite_obj_return(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *return_bb, MVMSpeshIns *return_ins, MVMSpeshBB *invoke_bb, MVMSpeshIns *invoke_ins) { switch (invoke_ins->info->opcode) { case MVM_OP_invoke_v: MVM_spesh_manipulate_delete_ins(tc, g, return_bb, return_ins); break; case MVM_OP_invoke_o: return_to_set(tc, g, return_ins, invoke_ins->operands[0]); break; default: MVM_oops(tc, "Spesh inline: unhandled case of return_o"); } } static void rewrite_returns(MVMThreadContext *tc, MVMSpeshGraph *inliner, MVMSpeshGraph *inlinee, MVMSpeshBB *invoke_bb, MVMSpeshIns *invoke_ins, MVMSpeshBB *inlinee_last_bb) { /* Locate return instructions. */ MVMSpeshBB *bb = inlinee->entry; while (bb) { MVMSpeshIns *ins = bb->first_ins; while (ins) { MVMuint16 opcode = ins->info->opcode; switch (opcode) { case MVM_OP_return: if (invoke_ins->info->opcode == MVM_OP_invoke_v) { MVM_spesh_manipulate_insert_goto(tc, inliner, bb, ins, invoke_bb->succ[0]); tweak_succ(tc, inliner, bb, invoke_bb->succ[0]); } else { MVM_oops(tc, "Spesh inline: return_v/invoke_[!v] mismatch"); } break; case MVM_OP_return_i: MVM_spesh_manipulate_insert_goto(tc, inliner, bb, ins, invoke_bb->succ[0]); tweak_succ(tc, inliner, bb, invoke_bb->succ[0]); rewrite_int_return(tc, inliner, bb, ins, invoke_bb, invoke_ins); break; case MVM_OP_return_n: MVM_spesh_manipulate_insert_goto(tc, inliner, bb, ins, invoke_bb->succ[0]); tweak_succ(tc, inliner, bb, invoke_bb->succ[0]); rewrite_num_return(tc, inliner, bb, ins, invoke_bb, invoke_ins); break; case MVM_OP_return_s: MVM_spesh_manipulate_insert_goto(tc, inliner, bb, ins, invoke_bb->succ[0]); tweak_succ(tc, inliner, bb, invoke_bb->succ[0]); rewrite_str_return(tc, inliner, bb, ins, invoke_bb, invoke_ins); break; case MVM_OP_return_o: MVM_spesh_manipulate_insert_goto(tc, inliner, bb, ins, invoke_bb->succ[0]); tweak_succ(tc, inliner, bb, invoke_bb->succ[0]); rewrite_obj_return(tc, inliner, bb, ins, invoke_bb, invoke_ins); break; } ins = ins->next; } if (bb == inlinee_last_bb) break; bb = bb->linear_next; } } /* Re-writes argument passing and parameter taking instructions to simple * register set operations. */ static void rewrite_args(MVMThreadContext *tc, MVMSpeshGraph *inliner, MVMSpeshGraph *inlinee, MVMSpeshBB *invoke_bb, MVMSpeshCallInfo *call_info, MVMSpeshBB *inlinee_last_bb) { /* Look for param-taking instructions. Track what arg instructions we * use in the process. */ MVMSpeshBB *bb = inlinee->entry; while (bb) { MVMSpeshIns *ins = bb->first_ins; while (ins) { MVMuint16 opcode = ins->info->opcode; MVMSpeshIns *next = ins->next; switch (opcode) { case MVM_OP_sp_getarg_o: case MVM_OP_sp_getarg_i: case MVM_OP_sp_getarg_n: case MVM_OP_sp_getarg_s: { MVMuint16 idx = ins->operands[1].lit_i16; MVMSpeshIns *arg_ins = call_info->arg_ins[idx]; switch (arg_ins->info->opcode) { case MVM_OP_arg_i: case MVM_OP_arg_n: case MVM_OP_arg_s: case MVM_OP_arg_o: /* Receiver just becomes a set instruction; delete the * argument passing instruction. */ ins->info = MVM_op_get_op(MVM_OP_set); ins->operands[1] = arg_ins->operands[1]; MVM_spesh_get_facts(tc, inliner, ins->operands[1])->usages++; MVM_spesh_manipulate_delete_ins(tc, inliner, call_info->prepargs_bb, arg_ins); break; case MVM_OP_argconst_i: arg_ins->info = MVM_op_get_op(MVM_OP_const_i64); arg_ins->operands[0] = ins->operands[0]; MVM_spesh_manipulate_delete_ins(tc, inliner, bb, ins); MVM_spesh_get_facts(tc, inliner, arg_ins->operands[0])->usages++; break; case MVM_OP_argconst_n: arg_ins->info = MVM_op_get_op(MVM_OP_const_n64); arg_ins->operands[0] = ins->operands[0]; MVM_spesh_manipulate_delete_ins(tc, inliner, bb, ins); MVM_spesh_get_facts(tc, inliner, arg_ins->operands[0])->usages++; break; case MVM_OP_argconst_s: arg_ins->info = MVM_op_get_op(MVM_OP_const_s); arg_ins->operands[0] = ins->operands[0]; MVM_spesh_manipulate_delete_ins(tc, inliner, bb, ins); MVM_spesh_get_facts(tc, inliner, arg_ins->operands[0])->usages++; break; default: MVM_oops(tc, "Spesh inline: unhandled arg instruction %d", arg_ins->info->opcode); } break; } } ins = next; } if (bb == inlinee_last_bb) break; bb = bb->linear_next; } { MVMSpeshIns *arg_ins = call_info->prepargs_ins->next; /* If there's some args that are not fetched by our inlinee, * we have to kick them out, as arg_* ops are only valid between * a prepargs and invoke_* op. */ while (arg_ins) { MVMuint16 opcode = arg_ins->info->opcode; MVMSpeshIns *next = arg_ins->next; switch (opcode) { case MVM_OP_arg_i: case MVM_OP_arg_n: case MVM_OP_arg_s: case MVM_OP_arg_o: case MVM_OP_argconst_i: case MVM_OP_argconst_n: case MVM_OP_argconst_s: MVM_spesh_manipulate_delete_ins(tc, inliner, call_info->prepargs_bb, arg_ins); break; case MVM_OP_set: break; case MVM_OP_invoke_i: case MVM_OP_invoke_n: case MVM_OP_invoke_s: case MVM_OP_invoke_o: case MVM_OP_invoke_v: default: next = NULL; } arg_ins = next; } } /* Delete the prepargs instruction. */ MVM_spesh_manipulate_delete_ins(tc, inliner, invoke_bb, call_info->prepargs_ins); } /* Annotates first and last instruction in post-processed inlinee with start * and end inline annotations. */ static void annotate_inline_start_end(MVMThreadContext *tc, MVMSpeshGraph *inliner, MVMSpeshGraph *inlinee, MVMint32 idx, MVMSpeshBB *inlinee_last_bb, MVMuint32 inline_boundary_handler) { /* Annotate first instruction as an inline start. */ MVMSpeshAnn *start_ann = MVM_spesh_alloc(tc, inliner, sizeof(MVMSpeshAnn)); MVMSpeshAnn *end_ann = MVM_spesh_alloc(tc, inliner, sizeof(MVMSpeshAnn)); MVMSpeshBB *bb = inlinee->entry->succ[0]; start_ann->next = bb->first_ins->annotations; start_ann->type = MVM_SPESH_ANN_INLINE_START; start_ann->data.inline_idx = idx; bb->first_ins->annotations = start_ann; /* Insert annotation for handler boundary indicator fixup. */ start_ann = MVM_spesh_alloc(tc, inliner, sizeof(MVMSpeshAnn)); start_ann->next = bb->first_ins->annotations; start_ann->type = MVM_SPESH_ANN_FH_START; start_ann->data.frame_handler_index = inline_boundary_handler; bb->first_ins->annotations = start_ann; /* Now look for last instruction and annotate it. */ end_ann->next = inlinee_last_bb->last_ins->annotations; end_ann->type = MVM_SPESH_ANN_INLINE_END; end_ann->data.inline_idx = idx; inlinee_last_bb->last_ins->annotations = end_ann; /* Insert annotation for handler boundary fixup; we add the end * one that is needed and also a dummy goto one to keep things * that want all three happy. */ end_ann = MVM_spesh_alloc(tc, inliner, sizeof(MVMSpeshAnn)); end_ann->next = inlinee_last_bb->last_ins->annotations; end_ann->type = MVM_SPESH_ANN_FH_END; end_ann->data.frame_handler_index = inline_boundary_handler; inlinee_last_bb->last_ins->annotations = end_ann; end_ann = MVM_spesh_alloc(tc, inliner, sizeof(MVMSpeshAnn)); end_ann->next = inlinee_last_bb->last_ins->annotations; end_ann->type = MVM_SPESH_ANN_FH_GOTO; end_ann->data.frame_handler_index = inline_boundary_handler; inlinee_last_bb->last_ins->annotations = end_ann; return; } /* Drives the overall inlining process. */ void MVM_spesh_inline(MVMThreadContext *tc, MVMSpeshGraph *inliner, MVMSpeshCallInfo *call_info, MVMSpeshBB *invoke_bb, MVMSpeshIns *invoke_ins, MVMSpeshGraph *inlinee, MVMStaticFrame *inlinee_sf, MVMSpeshOperand code_ref_reg) { /* Merge inlinee's graph into the inliner. */ MVMuint32 inline_boundary_handler; MVMSpeshBB *inlinee_last_bb = merge_graph(tc, inliner, inlinee, inlinee_sf, invoke_bb, invoke_ins, code_ref_reg, &inline_boundary_handler); /* If we're profiling, note it's an inline. */ if (inlinee->entry->linear_next->first_ins->info->opcode == MVM_OP_prof_enterspesh) { MVMSpeshIns *profenter = inlinee->entry->linear_next->first_ins; profenter->info = MVM_op_get_op(MVM_OP_prof_enterinline); profenter->operands = MVM_spesh_alloc(tc, inliner, sizeof(MVMSpeshOperand)); profenter->operands[0].lit_i16 = MVM_spesh_add_spesh_slot(tc, inliner, (MVMCollectable *)inlinee->sf); } /* Re-write returns to a set and goto. */ rewrite_returns(tc, inliner, inlinee, invoke_bb, invoke_ins, inlinee_last_bb); /* Re-write the argument passing instructions to poke values into the * appropriate slots. */ rewrite_args(tc, inliner, inlinee, invoke_bb, call_info, inlinee_last_bb); /* Annotate first and last instruction with inline table annotations; also * add annotations for fixing up the handlers table inline boundary * indicators. */ annotate_inline_start_end(tc, inliner, inlinee, inliner->num_inlines - 1, inlinee_last_bb, inline_boundary_handler); /* Finally, turn the invoke instruction into a goto. */ invoke_ins->info = MVM_op_get_op(MVM_OP_goto); invoke_ins->operands[0].ins_bb = inlinee->entry->linear_next; tweak_succ(tc, inliner, invoke_bb, inlinee->entry->linear_next); } MoarVM-2018.03/src/spesh/inline.h0000644000175000017510000000332013242626641016547 0ustar samanthasamantha/* Maximum size of bytecode we'll inline. */ #define MVM_SPESH_MAX_INLINE_SIZE 384 /* Inline table entry. The data is primarily used in deopt. */ struct MVMSpeshInline { /* Start and end position in the bytecode where we're inside of this * inline. */ MVMuint32 start; MVMuint32 end; /* The static frame that was inlined. */ MVMStaticFrame *sf; /* The register holding the inlined code ref. */ MVMuint16 code_ref_reg; /* Start position of the locals and lexicals, so we can extract them * to the new frame. */ MVMuint16 locals_start; MVMuint16 lexicals_start; /* The number of locals in the inline. */ MVMuint16 num_locals; /* Result register and result type. */ MVMuint16 res_reg; MVMReturnType res_type; /* Deopt index used to find return address. */ MVMuint32 return_deopt_idx; /* If the inline became unreachable after being made, we'll mark it as * such, so we won't try and fix it up later. */ MVMuint8 unreachable; /* Bit field of named args used to put in place during deopt, since we * typically don't update the array in specialized code. */ MVMuint64 deopt_named_used_bit_field; /* Inlinee's spesh graph, so we can free it up after code-gen. */ MVMSpeshGraph *g; }; MVMSpeshGraph * MVM_spesh_inline_try_get_graph(MVMThreadContext *tc, MVMSpeshGraph *inliner, MVMStaticFrame *target_sf, MVMSpeshCandidate *cand, MVMSpeshIns *invoke_ins, char **no_inline_reason); void MVM_spesh_inline(MVMThreadContext *tc, MVMSpeshGraph *inliner, MVMSpeshCallInfo *call_info, MVMSpeshBB *invoke_bb, MVMSpeshIns *invoke, MVMSpeshGraph *inlinee, MVMStaticFrame *inlinee_sf, MVMSpeshOperand code_ref_reg); MoarVM-2018.03/src/spesh/iterator.c0000644000175000017510000000207113237701240017110 0ustar samanthasamantha#include "moar.h" void MVM_spesh_iterator_init(MVMThreadContext *tc, MVMSpeshIterator *iterator, MVMSpeshGraph *graph) { iterator->graph = graph; iterator->bb = graph->entry; if (graph->entry) iterator->ins = graph->entry->first_ins; } void MVM_spesh_iterator_copy(MVMThreadContext *tc, MVMSpeshIterator *from, MVMSpeshIterator *to) { memcpy(to, from, sizeof(MVMSpeshIterator)); } MVMSpeshIns * MVM_spesh_iterator_next_ins(MVMThreadContext *tc, MVMSpeshIterator *iterator) { if (iterator->ins) iterator->ins = iterator->ins->next; return iterator->ins; } MVMSpeshBB * MVM_spesh_iterator_next_bb(MVMThreadContext *tc, MVMSpeshIterator *iterator) { if (iterator->bb) iterator->bb = iterator->bb->linear_next; if (iterator->bb) iterator->ins = iterator->bb->first_ins; return iterator->bb; } void MVM_spesh_iterator_skip_phi(MVMThreadContext *tc, MVMSpeshIterator *iterator) { while (iterator->ins && iterator->ins->info->opcode == MVM_SSA_PHI) { iterator->ins = iterator->ins->next; } } MoarVM-2018.03/src/spesh/iterator.h0000644000175000017510000000107013237701240017113 0ustar samanthasamanthastruct MVMSpeshIterator { MVMSpeshGraph *graph; MVMSpeshBB *bb; MVMSpeshIns *ins; }; void MVM_spesh_iterator_init(MVMThreadContext *tc, MVMSpeshIterator *iterator, MVMSpeshGraph *graph); void MVM_spesh_iterator_copy(MVMThreadContext *tc, MVMSpeshIterator *a, MVMSpeshIterator *b); MVMSpeshIns * MVM_spesh_iterator_next_ins(MVMThreadContext *tc, MVMSpeshIterator *iterator); MVMSpeshBB * MVM_spesh_iterator_next_bb(MVMThreadContext *tc, MVMSpeshIterator *iterator); void MVM_spesh_iterator_skip_phi(MVMThreadContext *tc, MVMSpeshIterator *iterator); MoarVM-2018.03/src/spesh/log.c0000644000175000017510000002137513242626641016057 0ustar samanthasamantha#include "moar.h" /* Provided spesh is enabled, set up specialization data logging for the * current thread. */ void MVM_spesh_log_initialize_thread(MVMThreadContext *tc, MVMint32 main_thread) { if (tc->instance->spesh_enabled) { tc->spesh_log = MVM_spesh_log_create(tc, tc->thread_obj); tc->spesh_log_quota = main_thread ? MVM_SPESH_LOG_QUOTA_MAIN_THREAD : MVM_SPESH_LOG_QUOTA; } } /* Creates a spesh log for the specified target thread. */ MVMSpeshLog * MVM_spesh_log_create(MVMThreadContext *tc, MVMThread *target_thread) { MVMSpeshLog *result; MVMROOT(tc, target_thread, { result = (MVMSpeshLog *)MVM_repr_alloc_init(tc, tc->instance->SpeshLog); MVM_ASSIGN_REF(tc, &(result->common.header), result->body.thread, target_thread); }); return result; } /* Increments the used count and - if it hits the limit - sends the log off * to the worker thread and NULLs it out. */ void send_log(MVMThreadContext *tc, MVMSpeshLog *sl) { if (tc->instance->spesh_blocking) { uv_mutex_t *block_mutex; uv_cond_t *block_condvar; block_mutex = sl->body.block_mutex = MVM_malloc(sizeof(uv_mutex_t)); uv_mutex_init(sl->body.block_mutex); block_condvar = sl->body.block_condvar = MVM_malloc(sizeof(uv_cond_t)); uv_cond_init(sl->body.block_condvar); uv_mutex_lock(sl->body.block_mutex); MVMROOT(tc, sl, { MVM_repr_push_o(tc, tc->instance->spesh_queue, (MVMObject *)sl); MVM_gc_mark_thread_blocked(tc); while (!MVM_load(&(sl->body.completed))) uv_cond_wait(block_condvar, block_mutex); MVM_gc_mark_thread_unblocked(tc); }); uv_mutex_unlock(sl->body.block_mutex); } else { MVM_repr_push_o(tc, tc->instance->spesh_queue, (MVMObject *)sl); } if (MVM_decr(&(tc->spesh_log_quota)) > 1) { tc->spesh_log = MVM_spesh_log_create(tc, tc->thread_obj); } else { MVM_telemetry_timestamp(tc, "ran out of spesh log quota"); tc->spesh_log = NULL; } } void commit_entry(MVMThreadContext *tc, MVMSpeshLog *sl) { sl->body.used++; if (sl->body.used == sl->body.limit) send_log(tc, sl); } /* Handles the case where we enter a new compilation unit and have either no * spesh log or a spesh log that's quite full. This might hinder us in getting * enough data recorded for a tight outer loop in a benchmark. Either grant a * bonus log or send the log early so we can have a fresh one. */ void MVM_spesh_log_new_compunit(MVMThreadContext *tc) { if (tc->num_compunit_extra_logs++ < 5) { if (tc->spesh_log) if (tc->spesh_log->body.used > tc->spesh_log->body.limit / 4) send_log(tc, tc->spesh_log); if (!tc->spesh_log) { if (MVM_incr(&(tc->spesh_log_quota)) == 0) { tc->spesh_log = MVM_spesh_log_create(tc, tc->thread_obj); tc->spesh_log->body.was_compunit_bumped = 1; } } } } /* Log the entry to a call frame. */ void MVM_spesh_log_entry(MVMThreadContext *tc, MVMint32 cid, MVMStaticFrame *sf, MVMCallsite *cs) { MVMSpeshLog *sl = tc->spesh_log; if (sl) { MVMSpeshLogEntry *entry = &(sl->body.entries[sl->body.used]); entry->kind = MVM_SPESH_LOG_ENTRY; entry->id = cid; MVM_ASSIGN_REF(tc, &(sl->common.header), entry->entry.sf, sf); entry->entry.cs = cs->is_interned ? cs : NULL; commit_entry(tc, sl); } } /* Log an OSR point being hit. */ void MVM_spesh_log_osr(MVMThreadContext *tc) { MVMSpeshLog *sl = tc->spesh_log; MVMint32 cid = tc->cur_frame->spesh_correlation_id; MVMSpeshLogEntry *entry = &(sl->body.entries[sl->body.used]); entry->kind = MVM_SPESH_LOG_OSR; entry->id = cid; entry->osr.bytecode_offset = (*(tc->interp_cur_op) - *(tc->interp_bytecode_start)) - 2; commit_entry(tc, sl); } /* Log a type. */ void MVM_spesh_log_type(MVMThreadContext *tc, MVMObject *value) { MVMSpeshLog *sl = tc->spesh_log; MVMint32 cid = tc->cur_frame->spesh_correlation_id; MVMSpeshLogEntry *entry = &(sl->body.entries[sl->body.used]); entry->kind = MVM_SPESH_LOG_TYPE; entry->id = cid; MVM_ASSIGN_REF(tc, &(sl->common.header), entry->type.type, value->st->WHAT); entry->type.flags = IS_CONCRETE(value) ? MVM_SPESH_LOG_TYPE_FLAG_CONCRETE : 0; entry->type.bytecode_offset = (*(tc->interp_cur_op) - *(tc->interp_bytecode_start)) - 2; commit_entry(tc, sl); } /* Log a parameter type and, maybe, decontainerized type. */ static void log_param_type(MVMThreadContext *tc, MVMint32 cid, MVMuint16 arg_idx, MVMObject *value, MVMSpeshLogEntryKind kind, MVMint32 rw_cont) { MVMSpeshLog *sl = tc->spesh_log; MVMSpeshLogEntry *entry = &(sl->body.entries[sl->body.used]); entry->kind = kind; entry->id = cid; MVM_ASSIGN_REF(tc, &(sl->common.header), entry->param.type, value->st->WHAT); entry->param.flags = IS_CONCRETE(value) ? MVM_SPESH_LOG_TYPE_FLAG_CONCRETE : 0; if (rw_cont) entry->param.flags |= MVM_SPESH_LOG_TYPE_FLAG_RW_CONT; entry->param.arg_idx = arg_idx; commit_entry(tc, sl); } void MVM_spesh_log_parameter(MVMThreadContext *tc, MVMuint16 arg_idx, MVMObject *param) { MVMint32 cid = tc->cur_frame->spesh_correlation_id; MVMContainerSpec const *cs = STABLE(param)->container_spec; MVMROOT(tc, param, { log_param_type(tc, cid, arg_idx, param, MVM_SPESH_LOG_PARAMETER, cs && IS_CONCRETE(param) && cs->fetch_never_invokes ? cs->can_store(tc, param) : 0); }); if (tc->spesh_log && IS_CONCRETE(param)) { if (cs && cs->fetch_never_invokes && REPR(param)->ID != MVM_REPR_ID_NativeRef) { MVMRegister r; cs->fetch(tc, param, &r); log_param_type(tc, cid, arg_idx, r.o, MVM_SPESH_LOG_PARAMETER_DECONT, 0); } } } /* Log a static value. */ void MVM_spesh_log_static(MVMThreadContext *tc, MVMObject *value) { MVMSpeshLog *sl = tc->spesh_log; MVMint32 cid = tc->cur_frame->spesh_correlation_id; MVMSpeshLogEntry *entry = &(sl->body.entries[sl->body.used]); entry->kind = MVM_SPESH_LOG_STATIC; entry->id = cid; MVM_ASSIGN_REF(tc, &(sl->common.header), entry->value.value, value); entry->value.bytecode_offset = (*(tc->interp_cur_op) - *(tc->interp_bytecode_start)) - 2; commit_entry(tc, sl); } /* Log a decont, only those that did not invoke. */ void MVM_spesh_log_decont(MVMThreadContext *tc, MVMuint8 *prev_op, MVMObject *value) { MVMSpeshLog *sl = tc->spesh_log; MVMint32 cid = tc->cur_frame->spesh_correlation_id; if (prev_op + 4 == *(tc->interp_cur_op)) { MVMSpeshLogEntry *entry = &(sl->body.entries[sl->body.used]); entry->kind = MVM_SPESH_LOG_TYPE; entry->id = cid; MVM_ASSIGN_REF(tc, &(sl->common.header), entry->type.type, value->st->WHAT); entry->type.flags = IS_CONCRETE(value) ? MVM_SPESH_LOG_TYPE_FLAG_CONCRETE : 0; entry->type.bytecode_offset = (prev_op - *(tc->interp_bytecode_start)) - 2; commit_entry(tc, sl); } } /* Log the target of an invocation; we log the static frame and whether the * outer of the code object is the current frame. */ void MVM_spesh_log_invoke_target(MVMThreadContext *tc, MVMObject *invoke_target, MVMuint16 was_multi) { if (REPR(invoke_target)->ID == MVM_REPR_ID_MVMCode && IS_CONCRETE(invoke_target)) { MVMCode *invoke_code = (MVMCode *)invoke_target; MVMSpeshLog *sl = tc->spesh_log; MVMint32 cid = tc->cur_frame->spesh_correlation_id; MVMSpeshLogEntry *entry = &(sl->body.entries[sl->body.used]); entry->kind = MVM_SPESH_LOG_INVOKE; entry->id = cid; MVM_ASSIGN_REF(tc, &(sl->common.header), entry->invoke.sf, invoke_code->body.sf); entry->invoke.caller_is_outer = invoke_code->body.outer == tc->cur_frame; entry->invoke.was_multi = was_multi; entry->invoke.bytecode_offset = (*(tc->interp_cur_op) - *(tc->interp_bytecode_start)) - 2; commit_entry(tc, sl); } } /* Log the type returned to a frame after an invocation. */ void MVM_spesh_log_return_type(MVMThreadContext *tc, MVMObject *value) { MVMSpeshLog *sl = tc->spesh_log; MVMint32 cid = tc->cur_frame->spesh_correlation_id; MVMSpeshLogEntry *entry = &(sl->body.entries[sl->body.used]); entry->kind = MVM_SPESH_LOG_RETURN; entry->id = cid; if (value) { MVM_ASSIGN_REF(tc, &(sl->common.header), entry->type.type, value->st->WHAT); entry->type.flags = IS_CONCRETE(value) ? MVM_SPESH_LOG_TYPE_FLAG_CONCRETE : 0; } else { entry->type.type = NULL; entry->type.flags = 0; } entry->type.bytecode_offset = 0; /* Not relevant for this case. */ commit_entry(tc, sl); } MoarVM-2018.03/src/spesh/log.h0000644000175000017510000000420513243117024016044 0ustar samanthasamantha/* Information about an inserted guard instruction due to logging. */ struct MVMSpeshLogGuard { /* Instruction and containing basic block. */ MVMSpeshIns *ins; MVMSpeshBB *bb; /* Have we made use of the gurad? */ MVMuint32 used; }; /* The default number of entries collected into a thread's spesh log buffer * before it is sent to a specialization worker. */ #define MVM_SPESH_LOG_DEFAULT_ENTRIES 16384 /* The number of spesh log buffers a thread can write before the spesh worker * thread allows it to write more (effectively, the limit on the number of * outstanding work per thread). Threads other than the main one getting a * bit less buffer space helps reduce memory use a bit. */ #define MVM_SPESH_LOG_QUOTA_MAIN_THREAD 2 #define MVM_SPESH_LOG_QUOTA 1 /* The number of logged invocations before we decide we've enough data for * the time being; should be at least the maximum threshold value in * thresholds.c, but we set it higher to allow more data collection. */ #define MVM_SPESH_LOG_LOGGED_ENOUGH 1000 /* Quick check if we are logging, to save function call overhead. */ MVM_STATIC_INLINE MVMint32 MVM_spesh_log_is_logging(MVMThreadContext *tc) { MVMFrame *cur_frame = tc->cur_frame; return cur_frame->spesh_cand == NULL && cur_frame->spesh_correlation_id && tc->spesh_log; } void MVM_spesh_log_initialize_thread(MVMThreadContext *tc, MVMint32 main_thread); MVMSpeshLog * MVM_spesh_log_create(MVMThreadContext *tc, MVMThread *target_thread); void MVM_spesh_log_new_compunit(MVMThreadContext *tc); void MVM_spesh_log_entry(MVMThreadContext *tc, MVMint32 cid, MVMStaticFrame *sf, MVMCallsite *cs); void MVM_spesh_log_osr(MVMThreadContext *tc); void MVM_spesh_log_parameter(MVMThreadContext *tc, MVMuint16 arg_idx, MVMObject *param); void MVM_spesh_log_type(MVMThreadContext *tc, MVMObject *value); void MVM_spesh_log_static(MVMThreadContext *tc, MVMObject *value); void MVM_spesh_log_decont(MVMThreadContext *tc, MVMuint8 *prev_op, MVMObject *value); void MVM_spesh_log_invoke_target(MVMThreadContext *tc, MVMObject *invoke_target, MVMuint16 was_multi); void MVM_spesh_log_return_type(MVMThreadContext *tc, MVMObject *value); MoarVM-2018.03/src/spesh/lookup.c0000644000175000017510000000374613237701240016602 0ustar samanthasamantha/* This file contains a number of functions that do lookups of data held in * data structures outside of the realm of spesh. We need to be very careful * how we do these, in various cases. For example, in the past we had cases * where we tried to look up a method, which in turn triggered method cache * deserialization, which acquired a mutex, which would block for GC and so * could end up with a collection taking place while spesh was working. This * broke the "no GC during spesh" invariant. */ #include "moar.h" /* Tries to get the HOW (meta-object) of an object - but only if it's already * available (e.g. deserialized). In the case it's not, returns NULL. */ MVMObject * MVM_spesh_try_get_how(MVMThreadContext *tc, MVMObject *obj) { return STABLE(obj)->HOW; } /* Tries to look up the method using the method cache, provided that the * method cache has already been deserialized. */ MVMObject * MVM_spesh_try_find_method(MVMThreadContext *tc, MVMObject *obj, MVMString *name) { return STABLE(obj)->method_cache ? MVM_6model_find_method_cache_only(tc, obj, name) : NULL; } /* Tries to check if the method exists on the object using the method cache, * provided the method cache has already been deserialized. */ MVMint64 MVM_spesh_try_can_method(MVMThreadContext *tc, MVMObject *obj, MVMString *name) { return STABLE(obj)->method_cache ? MVM_6model_can_method_cache_only(tc, obj, name) : -1; } MVMint8 MVM_spesh_get_reg_type(MVMThreadContext *tc, MVMSpeshGraph *sg, MVMuint16 reg) { return sg->local_types ? sg->local_types[reg] : sg->sf->body.local_types[reg]; } MVMint8 MVM_spesh_get_lex_type(MVMThreadContext *tc, MVMSpeshGraph *sg, MVMuint16 outers, MVMuint16 idx) { if (outers == 0) { return sg->lexical_types ? sg->lexical_types[idx] : sg->sf->body.lexical_types[idx]; } else { MVMStaticFrame *sf; for (sf = sg->sf; sf != NULL && outers--; sf = sf->body.outer); return sf->body.lexical_types[idx]; } } MoarVM-2018.03/src/spesh/lookup.h0000644000175000017510000000070313237701240016575 0ustar samanthasamanthaMVMObject * MVM_spesh_try_get_how(MVMThreadContext *tc, MVMObject *obj); MVMObject * MVM_spesh_try_find_method(MVMThreadContext *tc, MVMObject *obj, MVMString *name); MVMint64 MVM_spesh_try_can_method(MVMThreadContext *tc, MVMObject *obj, MVMString *name); MVMint8 MVM_spesh_get_reg_type(MVMThreadContext *tc, MVMSpeshGraph *sg, MVMuint16 reg); MVMint8 MVM_spesh_get_lex_type(MVMThreadContext *tc, MVMSpeshGraph *sg, MVMuint16 outers, MVMuint16 idx); MoarVM-2018.03/src/spesh/manipulate.c0000644000175000017510000003332013242626641017426 0ustar samanthasamantha#include "moar.h" /* This file contains various routines for manipulating a spesh graph, such * as adding/removing/replacing instructions. */ /* Deletes an instruction, and does any fact changes as a result. */ void MVM_spesh_manipulate_delete_ins(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMSpeshIns *prev, *next; /* If the instruction is in an already dead basic block, nothing to do. */ if (bb->dead) return; /* Remove it from the double linked list. */ prev = ins->prev; next = ins->next; if (prev) prev->next = next; else bb->first_ins = next; if (next) next->prev = prev; else bb->last_ins = prev; /* Move its annotations. */ while (ins->annotations) { MVMSpeshAnn *ann = ins->annotations; MVMSpeshAnn *ann_next = ann->next; switch (ann->type) { case MVM_SPESH_ANN_FH_START: case MVM_SPESH_ANN_FH_GOTO: case MVM_SPESH_ANN_INLINE_START: case MVM_SPESH_ANN_DEOPT_OSR: /* These move to the next instruction. */ if (!next) { MVMSpeshBB *dest_bb = bb->linear_next; while (dest_bb && !dest_bb->first_ins) dest_bb = dest_bb->linear_next; if (dest_bb) next = dest_bb->first_ins; } if (next) { ann->next = next->annotations; next->annotations = ann; } break; case MVM_SPESH_ANN_INLINE_END: case MVM_SPESH_ANN_FH_END: /* This moves to the previous instruction. */ if (!prev) { MVMSpeshBB *prev_bb = MVM_spesh_graph_linear_prev(tc, g, bb); while (prev_bb && !prev_bb->last_ins) prev_bb = MVM_spesh_graph_linear_prev(tc, g, prev_bb); if (prev_bb) prev = prev_bb->last_ins; } if (prev) { ann->next = prev->annotations; prev->annotations = ann; } break; case MVM_SPESH_ANN_DEOPT_ONE_INS: /* This moves to the previous instruction, but we need to put * it on the end of the list, so the earlier deopt point will * win when searching for deopt points. Otherwise, we can * deopt to a later place than we should have. */ if (!prev) { MVMSpeshBB *prev_bb = MVM_spesh_graph_linear_prev(tc, g, bb); while (prev_bb && !prev_bb->last_ins) prev_bb = MVM_spesh_graph_linear_prev(tc, g, prev_bb); if (prev_bb) prev = prev_bb->last_ins; } if (prev) { MVMSpeshAnn *append_to = prev->annotations; while (append_to && append_to->next) append_to = append_to->next; if (append_to) append_to->next = ann; else prev->annotations = ann; ann->next = NULL; } break; } ins->annotations = ann_next; } MVM_spesh_manipulate_cleanup_ins_deps(tc, g, ins); } /* When deleting an instruction, we can mark any writes of the instruction as * dead, and also decrement the usage counts on anything that is read. This is * called by MVM_spesh_manipulate_delete_ins, but provided separately for when * an instruction goes away by virtue of a whole basic block dying. */ void MVM_spesh_manipulate_cleanup_ins_deps(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins) { if (ins->info->opcode == MVM_SSA_PHI) { MVMint32 i; MVM_spesh_get_facts(tc, g, ins->operands[0])->dead_writer = 1; for (i = 1; i < ins->info->num_operands; i++) MVM_spesh_get_facts(tc, g, ins->operands[i])->usages--; } else { MVMint32 i; for (i = 0; i < ins->info->num_operands; i++) { MVMint32 rw = ins->info->operands[i] & MVM_operand_rw_mask; if (rw == MVM_operand_write_reg) MVM_spesh_get_facts(tc, g, ins->operands[i])->dead_writer = 1; else if (rw == MVM_operand_read_reg) MVM_spesh_get_facts(tc, g, ins->operands[i])->usages--; } } } /* Inserts an instruction after the specified instruciton, or at the start of * the basic block if the instruction is NULL. */ void MVM_spesh_manipulate_insert_ins(MVMThreadContext *tc, MVMSpeshBB *bb, MVMSpeshIns *previous, MVMSpeshIns *to_insert) { MVMSpeshIns *next; if (previous) { next = previous->next; previous->next = to_insert; } else { next = bb->first_ins; bb->first_ins = to_insert; } to_insert->next = next; if (next) { next->prev = to_insert; } else { bb->last_ins = to_insert; } to_insert->prev = previous; } /* Inserts a goto. */ void MVM_spesh_manipulate_insert_goto(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins, MVMSpeshBB *target) { MVMSpeshIns *inserted_goto = MVM_spesh_alloc(tc, g, sizeof( MVMSpeshIns )); MVMSpeshOperand *operands = MVM_spesh_alloc(tc, g, sizeof( MVMSpeshOperand )); inserted_goto->info = MVM_op_get_op(MVM_OP_goto); inserted_goto->operands = operands; operands[0].ins_bb = target; MVM_spesh_manipulate_insert_ins(tc, bb, ins, inserted_goto); } /* Adds a successor to a basic block, also adding to the list of * predecessors of the added successor. */ void MVM_spesh_manipulate_add_successor(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshBB *succ) { MVMSpeshBB **new_succ, **new_pred; /* Add to successors. */ new_succ = MVM_spesh_alloc(tc, g, (bb->num_succ + 1) * sizeof(MVMSpeshBB *)); if (bb->num_succ) memcpy(new_succ, bb->succ, bb->num_succ * sizeof(MVMSpeshBB *)); new_succ[bb->num_succ] = succ; bb->succ = new_succ; bb->num_succ++; /* And to successor's predecessors. */ new_pred = MVM_spesh_alloc(tc, g, (succ->num_pred + 1) * sizeof(MVMSpeshBB *)); if (succ->num_pred) memcpy(new_pred, succ->pred, succ->num_pred * sizeof(MVMSpeshBB *)); new_pred[succ->num_pred] = bb; succ->pred = new_pred; succ->num_pred++; } /* Removes a successor to a basic block, also removing it from the list of * predecessors. */ void MVM_spesh_manipulate_remove_successor(MVMThreadContext *tc, MVMSpeshBB *bb, MVMSpeshBB *succ) { MVMSpeshBB ** const bb_succ = bb->succ; MVMSpeshBB ** const succ_pred = succ->pred; const MVMuint16 bb_num_succ = --bb->num_succ; const MVMuint16 succ_num_pred = --succ->num_pred; MVMuint16 i, k; for (i = 0; i <= bb_num_succ; i++) { if (bb_succ[i] == succ) { break; } } if (bb_succ[i] != succ) { MVM_oops(tc, "Didn't find the successor to remove from a Spesh Basic Block"); } /* Remove the succ from the list, shuffle other successors back in place. */ for (k = i; k < bb_num_succ; k++) { bb_succ[k] = bb_succ[k + 1]; } bb_succ[bb_num_succ] = NULL; /* Now hunt the bb in the succ's pred, so that we remove all traces of the connection. */ for (i = 0; i <= succ_num_pred; i++) { if (succ_pred[i] == bb) { break; } } if (succ_pred[i] != bb) { MVM_oops(tc, "Didn't find the predecessor to remove from a Spesh Basic Block"); } for (k = i; k < succ_num_pred; k++) { succ_pred[k] = succ_pred[k + 1]; } succ_pred[succ_num_pred] = NULL; } /* Removes successors from a basic block that point to handlers. Useful for optimizations that turn throwish ops into non-throwing ones. */ void MVM_spesh_manipulate_remove_handler_successors(MVMThreadContext *tc, MVMSpeshBB *bb) { int i; for (i = 0; i < bb->num_handler_succ; i++) { MVM_spesh_manipulate_remove_successor(tc, bb, bb->handler_succ[i]); bb->handler_succ[i] = NULL; } bb->num_handler_succ = 0; } /* Gets a temporary register of the specified kind to use in some transform. * Will only actually extend the frame if needed; if an existing temporary * was requested and then released, then it will just use a new version of * that. */ MVMSpeshOperand MVM_spesh_manipulate_get_temp_reg(MVMThreadContext *tc, MVMSpeshGraph *g, MVMuint16 kind) { MVMSpeshOperand result; MVMSpeshFacts **new_facts; MVMuint16 *new_fact_counts; MVMuint16 i; /* First, see if we can find an existing free temporary; use it if so. */ for (i = 0; i < g->num_temps; i++) { if (g->temps[i].kind == kind && !g->temps[i].in_use) { /* Add new facts slot. */ MVMuint16 orig = g->temps[i].orig; MVMSpeshFacts *new_fact_row = MVM_spesh_alloc(tc, g, (g->fact_counts[orig] + 1) * sizeof(MVMSpeshFacts)); memcpy(new_fact_row, g->facts[orig], g->fact_counts[orig] * sizeof(MVMSpeshFacts)); g->facts[orig] = new_fact_row; g->fact_counts[orig]++; /* Mark it in use and add extra version. */ g->temps[i].in_use++; g->temps[i].i++; /* Produce and return result. */ result.reg.orig = orig; result.reg.i = g->temps[i].i; return result; } } /* Make sure we've space in the temporaries store. */ if (g->num_temps == g->alloc_temps) { MVMSpeshTemporary *new_temps; g->alloc_temps += 4; new_temps = MVM_spesh_alloc(tc, g, g->alloc_temps * sizeof(MVMSpeshTemporary)); if (g->num_temps) memcpy(new_temps, g->temps, g->num_temps * sizeof(MVMSpeshTemporary)); g->temps = new_temps; } /* Allocate temporary and set up result. */ g->temps[g->num_temps].orig = result.reg.orig = g->num_locals; g->temps[g->num_temps].i = result.reg.i = 0; g->temps[g->num_temps].kind = kind; g->temps[g->num_temps].in_use = 1; g->num_temps++; /* Add locals table entry. */ if (!g->local_types) { MVMint32 local_types_size = g->num_locals * sizeof(MVMuint16); g->local_types = MVM_malloc(local_types_size); memcpy(g->local_types, g->sf->body.local_types, local_types_size); } g->local_types = MVM_realloc(g->local_types, (g->num_locals + 1) * sizeof(MVMuint16)); g->local_types[g->num_locals] = kind; /* Add facts table entry. */ new_facts = MVM_spesh_alloc(tc, g, (g->num_locals + 1) * sizeof(MVMSpeshFacts *)); new_fact_counts = MVM_spesh_alloc(tc, g, (g->num_locals + 1) * sizeof(MVMuint16)); memcpy(new_facts, g->facts, g->num_locals * sizeof(MVMSpeshFacts *)); memcpy(new_fact_counts, g->fact_counts, g->num_locals * sizeof(MVMuint16)); new_facts[g->num_locals] = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshFacts)); new_fact_counts[g->num_locals] = 1; g->facts = new_facts; g->fact_counts = new_fact_counts; /* Increment number of locals. */ g->num_locals++; return result; } /* Releases a temporary register, so it can be used again later. */ void MVM_spesh_manipulate_release_temp_reg(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshOperand temp) { MVMuint16 i; for (i = 0; i < g->num_temps; i++) { if (g->temps[i].orig == temp.reg.orig && g->temps[i].i == temp.reg.i) { if (g->temps[i].in_use) g->temps[i].in_use = 0; else MVM_oops(tc, "Spesh: releasing temp not in use"); return; } } MVM_oops(tc, "Spesh: releasing non-existing temp"); } MVMSpeshBB *MVM_spesh_manipulate_split_BB_at(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMSpeshBB *new_bb = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshBB)); MVMSpeshBB *linear_next = bb->linear_next; /* Step one: insert the new BB into the linear order. */ bb->linear_next = new_bb; new_bb->linear_next = linear_next; /* Step two: update all idx fields. */ new_bb->idx = bb->idx + 1; { MVMSpeshBB *ptr = linear_next; while (ptr != NULL) { ptr->idx += 1; ptr = ptr->linear_next; } } /* Step three: fix up the dominator tree. */ new_bb->children = bb->children; new_bb->num_children = bb->num_children; /* We expect the user of this API to fill whatever BB the code * will additionally branch into into the children list, as well. * Hopefully, setting num_children to 2 makes the code crash in case * that step has been forgotten. */ bb->children = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshBB *) * 2); bb->num_children = 2; bb->children[0] = new_bb; bb->children[1] = 0; /* Step three: fix up succs and preds. */ new_bb->pred = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshBB *)); new_bb->num_pred = 1; new_bb->pred[0] = bb; new_bb->succ = bb->succ; /* We assume the reason for the split is to add a new succ in the middle * which is why we allocate two slots instead of 1. */ bb->succ = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshBB *) * 2); bb->num_succ = 2; bb->succ[0] = new_bb; bb->succ[1] = 0; new_bb->initial_pc = bb->initial_pc; new_bb->num_df = 0; /* Last step: Transfer over the instructions after the split point. */ new_bb->last_ins = bb->last_ins; bb->last_ins = ins->prev; new_bb->first_ins = ins; ins->prev->next = NULL; ins->prev = NULL; return new_bb; } MoarVM-2018.03/src/spesh/manipulate.h0000644000175000017510000000221513242626641017432 0ustar samanthasamanthaMVM_PUBLIC void MVM_spesh_manipulate_delete_ins(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins); MVM_PUBLIC void MVM_spesh_manipulate_cleanup_ins_deps(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins); MVM_PUBLIC void MVM_spesh_manipulate_insert_ins(MVMThreadContext *tc, MVMSpeshBB *bb, MVMSpeshIns *previous, MVMSpeshIns *to_insert); MVM_PUBLIC void MVM_spesh_manipulate_insert_goto(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins, MVMSpeshBB *target); void MVM_spesh_manipulate_add_successor(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshBB *succ); void MVM_spesh_manipulate_remove_successor(MVMThreadContext *tc, MVMSpeshBB *bb, MVMSpeshBB *succ); MVM_PUBLIC void MVM_spesh_manipulate_remove_handler_successors(MVMThreadContext *tc, MVMSpeshBB *bb); MVMSpeshOperand MVM_spesh_manipulate_get_temp_reg(MVMThreadContext *tc, MVMSpeshGraph *g, MVMuint16 kind); void MVM_spesh_manipulate_release_temp_reg(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshOperand temp); MVMSpeshBB *MVM_spesh_manipulate_split_BB_at(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins); MoarVM-2018.03/src/spesh/optimize.c0000644000175000017510000033235313244342404017131 0ustar samanthasamantha#include "moar.h" /* This is where the main optimization work on a spesh graph takes place, * using facts discovered during analysis. */ /* Writes to stderr about each inline that we perform. */ #define MVM_LOG_INLINES 0 /* Obtains facts for an operand, just directly accessing them without * inferring any kind of usage. */ static MVMSpeshFacts * get_facts_direct(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshOperand o) { return &g->facts[o.reg.orig][o.reg.i]; } /* Obtains facts for an operand, indicating they are being used. */ MVMSpeshFacts * MVM_spesh_get_and_use_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshOperand o) { MVMSpeshFacts *facts = get_facts_direct(tc, g, o); MVM_spesh_use_facts(tc, g, facts); return facts; } /* Obtains facts for an operand, but doesn't (yet) indicate usefulness. */ MVMSpeshFacts * MVM_spesh_get_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshOperand o) { return get_facts_direct(tc, g, o); } /* Mark facts for an operand as being relied upon. */ void MVM_spesh_use_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshFacts *facts) { if (facts->flags & MVM_SPESH_FACT_FROM_LOG_GUARD) g->log_guards[facts->log_guard].used = 1; if (facts->flags & MVM_SPESH_FACT_MERGED_WITH_LOG_GUARD) { MVMSpeshIns *thePHI = facts->writer; MVMuint32 op_i; for (op_i = 1; op_i < thePHI->info->num_operands; op_i++) { MVM_spesh_get_and_use_facts(tc, g, thePHI->operands[op_i]); } } } /* Obtains a string constant. */ MVMString * MVM_spesh_get_string(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshOperand o) { return MVM_cu_string(tc, g->sf->body.cu, o.lit_str_idx); } /* Copy facts between two register operands. */ static void copy_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshOperand to, MVMSpeshOperand from) { MVMSpeshFacts *tfacts = get_facts_direct(tc, g, to); MVMSpeshFacts *ffacts = get_facts_direct(tc, g, from); tfacts->flags = ffacts->flags; tfacts->type = ffacts->type; tfacts->decont_type = ffacts->decont_type; tfacts->value = ffacts->value; tfacts->log_guard = ffacts->log_guard; } /* Adds a value into a spesh slot and returns its index. * If a spesh slot already holds this value, return that instead. */ MVMint16 MVM_spesh_add_spesh_slot_try_reuse(MVMThreadContext *tc, MVMSpeshGraph *g, MVMCollectable *c) { MVMint16 prev_slot; for (prev_slot = 0; prev_slot < g->num_spesh_slots; prev_slot++) { if (g->spesh_slots[prev_slot] == c) return prev_slot; } return MVM_spesh_add_spesh_slot(tc, g, c); } /* Adds a value into a spesh slot and returns its index. */ MVMint16 MVM_spesh_add_spesh_slot(MVMThreadContext *tc, MVMSpeshGraph *g, MVMCollectable *c) { if (g->num_spesh_slots >= g->alloc_spesh_slots) { g->alloc_spesh_slots += 8; if (g->spesh_slots) g->spesh_slots = MVM_realloc(g->spesh_slots, g->alloc_spesh_slots * sizeof(MVMCollectable *)); else g->spesh_slots = MVM_malloc(g->alloc_spesh_slots * sizeof(MVMCollectable *)); } g->spesh_slots[g->num_spesh_slots] = c; return g->num_spesh_slots++; } static void optimize_repr_op(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins, MVMint32 type_operand); static void optimize_findmeth_s_perhaps_constant(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins) { MVMSpeshFacts *name_facts = MVM_spesh_get_facts(tc, g, ins->operands[2]); if (name_facts->flags & MVM_SPESH_FACT_KNOWN_VALUE) { if (name_facts->writer && name_facts->writer->info->opcode == MVM_OP_const_s) { name_facts->usages--; ins->info = ins->info->opcode == MVM_OP_findmeth_s ? MVM_op_get_op(MVM_OP_findmeth) : MVM_op_get_op(MVM_OP_tryfindmeth); ins->operands[2].lit_i64 = 0; ins->operands[2].lit_str_idx = name_facts->writer->operands[1].lit_str_idx; MVM_spesh_use_facts(tc, g, name_facts); } } } /* Performs optimization on a method lookup. If we know the type that we'll * be dispatching on, resolve it right off. If not, add a cache. */ static void optimize_method_lookup(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins) { /* See if we can resolve the method right off due to knowing the type. */ MVMSpeshFacts *obj_facts = MVM_spesh_get_facts(tc, g, ins->operands[1]); MVMint32 resolved = 0; if (obj_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE) { /* Try to resolve. */ MVMString *name = MVM_spesh_get_string(tc, g, ins->operands[2]); MVMObject *meth = MVM_spesh_try_find_method(tc, obj_facts->type, name); if (!MVM_is_null(tc, meth)) { /* Could compile-time resolve the method. Add it in a spesh slot. */ MVMint16 ss = MVM_spesh_add_spesh_slot(tc, g, (MVMCollectable *)meth); /* Tweak facts for the target, given we know the method. */ MVMSpeshFacts *meth_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[0]); meth_facts->flags |= MVM_SPESH_FACT_KNOWN_VALUE; meth_facts->value.o = meth; /* Update the instruction to grab the spesh slot. */ ins->info = MVM_op_get_op(MVM_OP_sp_getspeshslot); ins->operands[1].lit_i16 = ss; resolved = 1; MVM_spesh_use_facts(tc, g, obj_facts); obj_facts->usages--; } } /* If not, add space to cache a single type/method pair, to save hash * lookups in the (common) monomorphic case, and rewrite to caching * version of the instruction. */ if (!resolved && ins->info->opcode == MVM_OP_findmeth) { MVMSpeshOperand *orig_o = ins->operands; ins->info = MVM_op_get_op(MVM_OP_sp_findmeth); ins->operands = MVM_spesh_alloc(tc, g, 4 * sizeof(MVMSpeshOperand)); memcpy(ins->operands, orig_o, 3 * sizeof(MVMSpeshOperand)); ins->operands[3].lit_i16 = MVM_spesh_add_spesh_slot(tc, g, NULL); MVM_spesh_add_spesh_slot(tc, g, NULL); } } /* Sees if we can resolve an istype at compile time. */ static void optimize_istype(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins) { MVMSpeshFacts *obj_facts = MVM_spesh_get_facts(tc, g, ins->operands[1]); MVMSpeshFacts *type_facts = MVM_spesh_get_facts(tc, g, ins->operands[2]); MVMSpeshFacts *result_facts; if (type_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && obj_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE) { MVMint32 result; if (!MVM_6model_try_cache_type_check(tc, obj_facts->type, type_facts->type, &result)) return; ins->info = MVM_op_get_op(MVM_OP_const_i64_16); result_facts = MVM_spesh_get_facts(tc, g, ins->operands[0]); result_facts->flags |= MVM_SPESH_FACT_KNOWN_VALUE; ins->operands[1].lit_i16 = result; result_facts->value.i = result; obj_facts->usages--; type_facts->usages--; MVM_spesh_facts_depend(tc, g, result_facts, obj_facts); MVM_spesh_use_facts(tc, g, obj_facts); MVM_spesh_facts_depend(tc, g, result_facts, type_facts); MVM_spesh_use_facts(tc, g, type_facts); } } static void optimize_is_reprid(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins) { MVMSpeshFacts *obj_facts = MVM_spesh_get_facts(tc, g, ins->operands[1]); MVMuint32 wanted_repr_id; MVMuint64 result_value; if (!(obj_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE)) { return; } switch (ins->info->opcode) { case MVM_OP_islist: wanted_repr_id = MVM_REPR_ID_VMArray; break; case MVM_OP_ishash: wanted_repr_id = MVM_REPR_ID_MVMHash; break; case MVM_OP_isint: wanted_repr_id = MVM_REPR_ID_P6int; break; case MVM_OP_isnum: wanted_repr_id = MVM_REPR_ID_P6num; break; case MVM_OP_isstr: wanted_repr_id = MVM_REPR_ID_P6str; break; default: return; } MVM_spesh_use_facts(tc, g, obj_facts); result_value = REPR(obj_facts->type)->ID == wanted_repr_id; if (result_value == 0) { MVMSpeshFacts *result_facts = MVM_spesh_get_facts(tc, g, ins->operands[0]); ins->info = MVM_op_get_op(MVM_OP_const_i64_16); ins->operands[1].lit_i16 = 0; result_facts->flags |= MVM_SPESH_FACT_KNOWN_VALUE; result_facts->value.i = 0; MVM_spesh_facts_depend(tc, g, result_facts, obj_facts); } else { ins->info = MVM_op_get_op(MVM_OP_isnonnull); } } static void optimize_gethow(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins) { MVMSpeshFacts *obj_facts = MVM_spesh_get_facts(tc, g, ins->operands[1]); MVMObject *how_obj = NULL; if (obj_facts->flags & (MVM_SPESH_FACT_KNOWN_TYPE)) how_obj = MVM_spesh_try_get_how(tc, obj_facts->type); /* There may be other valid ways to get the facts (known value?) */ if (how_obj) { MVMSpeshFacts *how_facts; /* Transform gethow lookup to spesh slot lookup */ MVMint16 spesh_slot = MVM_spesh_add_spesh_slot_try_reuse(tc, g, (MVMCollectable*)how_obj); MVM_spesh_get_facts(tc, g, ins->operands[1])->usages--; ins->info = MVM_op_get_op(MVM_OP_sp_getspeshslot); ins->operands[1].lit_i16 = spesh_slot; /* Store facts about the value in the write operand */ how_facts = MVM_spesh_get_facts(tc, g, ins->operands[0]); how_facts->flags |= (MVM_SPESH_FACT_KNOWN_VALUE | MVM_SPESH_FACT_KNOWN_TYPE); how_facts->value.o = how_obj; how_facts->type = STABLE(how_obj)->WHAT; } } /* Sees if we can resolve an isconcrete at compile time. */ static void optimize_isconcrete(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins) { MVMSpeshFacts *obj_facts = MVM_spesh_get_facts(tc, g, ins->operands[1]); if (obj_facts->flags & (MVM_SPESH_FACT_CONCRETE | MVM_SPESH_FACT_TYPEOBJ)) { MVMSpeshFacts *result_facts = MVM_spesh_get_facts(tc, g, ins->operands[0]); ins->info = MVM_op_get_op(MVM_OP_const_i64_16); result_facts->flags |= MVM_SPESH_FACT_KNOWN_VALUE; result_facts->value.i = obj_facts->flags & MVM_SPESH_FACT_CONCRETE ? 1 : 0; ins->operands[1].lit_i16 = result_facts->value.i; MVM_spesh_use_facts(tc, g, obj_facts); MVM_spesh_facts_depend(tc, g, result_facts, obj_facts); obj_facts->usages--; } } static void optimize_exception_ops(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMuint16 op = ins->info->opcode; if (op == MVM_OP_newexception) { MVMSpeshOperand target = ins->operands[0]; MVMObject *type = tc->instance->boot_types.BOOTException; MVMSTable *st = STABLE(type); ins->info = MVM_op_get_op(MVM_OP_sp_fastcreate); ins->operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand)); ins->operands[0] = target; ins->operands[1].lit_i16 = st->size; ins->operands[2].lit_i16 = MVM_spesh_add_spesh_slot(tc, g, (MVMCollectable *)st); } else { /* MVMSpeshFacts *target_facts; */ /* XXX This currently still causes problems. */ return; /* switch (op) { case MVM_OP_bindexmessage: case MVM_OP_bindexpayload: { MVMSpeshOperand target = ins->operands[0]; MVMSpeshOperand value = ins->operands[1]; target_facts = MVM_spesh_get_facts(tc, g, target); if (!(target_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE) || !(REPR(target_facts->type)->ID == MVM_REPR_ID_MVMException)) break; ins->info = MVM_op_get_op(op == MVM_OP_bindexmessage ? MVM_OP_sp_bind_s : MVM_OP_sp_bind_o); ins->operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand)); ins->operands[0] = target; ins->operands[1].lit_i16 = op == MVM_OP_bindexmessage ? offsetof(MVMException, body.message) : offsetof(MVMException, body.payload); ins->operands[2] = value; break; } case MVM_OP_bindexcategory: { MVMSpeshOperand target = ins->operands[0]; MVMSpeshOperand category = ins->operands[1]; target_facts = MVM_spesh_get_facts(tc, g, target); if (!(target_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE) || !(REPR(target_facts->type)->ID == MVM_REPR_ID_MVMException)) break; ins->info = MVM_op_get_op(MVM_OP_sp_bind_i32); ins->operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand)); ins->operands[0] = target; ins->operands[1].lit_i16 = offsetof(MVMException, body.category); ins->operands[2] = category; break; } case MVM_OP_getexmessage: case MVM_OP_getexpayload: { MVMSpeshOperand destination = ins->operands[0]; MVMSpeshOperand target = ins->operands[1]; target_facts = MVM_spesh_get_facts(tc, g, target); if (!(target_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE) || !(REPR(target_facts->type)->ID == MVM_REPR_ID_MVMException)) break; ins->info = MVM_op_get_op(op == MVM_OP_getexmessage ? MVM_OP_sp_get_s : MVM_OP_sp_get_o); ins->operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand)); ins->operands[0] = destination; ins->operands[1] = target; ins->operands[2].lit_i16 = op == MVM_OP_getexmessage ? offsetof(MVMException, body.message) : offsetof(MVMException, body.payload); break; } case MVM_OP_getexcategory: { MVMSpeshOperand destination = ins->operands[0]; MVMSpeshOperand target = ins->operands[1]; target_facts = MVM_spesh_get_facts(tc, g, target); if (!(target_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE) || !(REPR(target_facts->type)->ID == MVM_REPR_ID_MVMException)) break; ins->info = MVM_op_get_op(MVM_OP_sp_get_i32); ins->operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand)); ins->operands[0] = destination; ins->operands[1] = target; ins->operands[2].lit_i16 = offsetof(MVMException, body.category); break; } } */ } } /* iffy ops that operate on a known value register can turn into goto * or be dropped. */ static void optimize_iffy(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins, MVMSpeshBB *bb) { MVMSpeshFacts *flag_facts = MVM_spesh_get_facts(tc, g, ins->operands[0]); MVMuint8 negated_op; MVMuint8 truthvalue; switch (ins->info->opcode) { case MVM_OP_if_i: case MVM_OP_if_s: case MVM_OP_if_n: case MVM_OP_if_o: case MVM_OP_ifnonnull: negated_op = 0; break; case MVM_OP_unless_i: case MVM_OP_unless_s: case MVM_OP_unless_n: case MVM_OP_unless_o: negated_op = 1; break; default: return; } if (flag_facts->flags & MVM_SPESH_FACT_KNOWN_VALUE) { switch (ins->info->opcode) { case MVM_OP_if_i: case MVM_OP_unless_i: truthvalue = flag_facts->value.i; break; case MVM_OP_if_o: case MVM_OP_unless_o: { MVMObject *objval = flag_facts->value.o; MVMBoolificationSpec *bs = objval->st->boolification_spec; MVMRegister resultreg; switch (bs == NULL ? MVM_BOOL_MODE_NOT_TYPE_OBJECT : bs->mode) { case MVM_BOOL_MODE_UNBOX_INT: case MVM_BOOL_MODE_UNBOX_NUM: case MVM_BOOL_MODE_UNBOX_STR_NOT_EMPTY: case MVM_BOOL_MODE_UNBOX_STR_NOT_EMPTY_OR_ZERO: case MVM_BOOL_MODE_BIGINT: case MVM_BOOL_MODE_ITER: case MVM_BOOL_MODE_HAS_ELEMS: case MVM_BOOL_MODE_NOT_TYPE_OBJECT: MVM_coerce_istrue(tc, objval, &resultreg, NULL, NULL, 0); truthvalue = resultreg.i64; break; case MVM_BOOL_MODE_CALL_METHOD: default: return; } break; } case MVM_OP_if_n: case MVM_OP_unless_n: truthvalue = flag_facts->value.n != 0.0; break; default: return; } MVM_spesh_use_facts(tc, g, flag_facts); flag_facts->usages--; truthvalue = truthvalue ? 1 : 0; if (truthvalue != negated_op) { /* This conditional can be turned into an unconditional jump. */ ins->info = MVM_op_get_op(MVM_OP_goto); ins->operands[0] = ins->operands[1]; /* Since we have an unconditional jump now, we can remove the successor * that's in the linear_next. */ MVM_spesh_manipulate_remove_successor(tc, bb, bb->linear_next); } else { /* This conditional can be dropped completely. */ MVM_spesh_manipulate_remove_successor(tc, bb, ins->operands[1].ins_bb); MVM_spesh_manipulate_delete_ins(tc, g, bb, ins); } /* Since the CFG has changed, we may have some dead basic blocks; do * an elimination pass. */ MVM_spesh_eliminate_dead_bbs(tc, g, 1); return; } /* Sometimes our code-gen ends up boxing an integer and immediately * calling if_o or unless_o on it. If we if_i/unless_i/... instead, * we can get rid of the unboxing and perhaps the boxing as well. */ if ((ins->info->opcode == MVM_OP_if_o || ins->info->opcode == MVM_OP_unless_o) && flag_facts->flags & MVM_SPESH_FACT_KNOWN_BOX_SRC && flag_facts->writer) { /* We may have to go through several layers of set instructions to find * the proper writer. */ MVMSpeshIns *cur = flag_facts->writer; while (cur && cur->info->opcode == MVM_OP_set) { cur = MVM_spesh_get_facts(tc, g, cur->operands[1])->writer; } if (cur) { MVMSpeshIns *safety_cur; MVMuint8 orig_operand_type = cur->info->operands[1] & MVM_operand_type_mask; MVMuint8 succ = 0; /* Now we have to be extra careful. Any operation that writes to * our "unboxed flag" register (in any register version) will be * trouble. Also, we'd have to take more care with PHI nodes, * which we'll just consider immediate failure for now. */ safety_cur = ins; while (safety_cur) { if (safety_cur == cur) { /* If we've made it to here without finding anything * dangerous, we can consider this optimization * a winner. */ break; } if (safety_cur->info->opcode == MVM_SSA_PHI) { /* Oh dear god in heaven! A PHI! */ safety_cur = NULL; break; } if (((safety_cur->info->operands[0] & MVM_operand_rw_mask) == MVM_operand_write_reg) && (safety_cur->operands[0].reg.orig == cur->operands[1].reg.orig)) { /* Someone's clobbering our register between the boxing and * our attempt to unbox it. We shall give up. * Maybe in the future we can be clever/sneaky and use * some other register for bridging the gap? */ safety_cur = NULL; break; } safety_cur = safety_cur->prev; } if (safety_cur) { switch (orig_operand_type) { case MVM_operand_int64: ins->info = MVM_op_get_op(negated_op ? MVM_OP_unless_i : MVM_OP_if_i); succ = 1; break; case MVM_operand_num64: ins->info = MVM_op_get_op(negated_op ? MVM_OP_unless_n : MVM_OP_if_n); succ = 1; break; case MVM_operand_str: ins->info = MVM_op_get_op(negated_op ? MVM_OP_unless_s : MVM_OP_if_s); succ = 1; break; } if (succ) { ins->operands[0] = cur->operands[1]; flag_facts->usages--; MVM_spesh_get_and_use_facts(tc, g, cur->operands[1])->usages++; optimize_iffy(tc, g, ins, bb); return; } } } } } /* break if_o/unless_o into an istrue/if_i, which is much JIT friendlier */ static void decompose_object_conditional(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins, MVMSpeshBB *bb) { MVMSpeshFacts *flag_facts = MVM_spesh_get_facts(tc, g, ins->operands[0]); const MVMOpInfo *op_info = MVM_op_get_op(MVM_OP_istrue); MVMSpeshOperand temp = MVM_spesh_manipulate_get_temp_reg(tc, g, MVM_reg_int64); MVMSpeshIns *new_ins = MVM_spesh_alloc(tc, g, sizeof( MVMSpeshIns )); MVMint32 reoptimize = 0; /* If we know the type, we can devirtualize if_o and unless_o. */ if (flag_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && flag_facts->type) { /* Go by boolification mode to pick a new instruction, if any. */ MVMObject *type = flag_facts->type; MVMBoolificationSpec *bs = type->st->boolification_spec; MVMuint8 guaranteed_concrete = flag_facts->flags & MVM_SPESH_FACT_CONCRETE; MVMuint8 mode = bs == NULL ? MVM_BOOL_MODE_NOT_TYPE_OBJECT : bs->mode; switch (mode) { case MVM_BOOL_MODE_ITER: if (!guaranteed_concrete) break; if (flag_facts->flags & MVM_SPESH_FACT_ARRAY_ITER) { op_info = MVM_op_get_op(MVM_OP_sp_boolify_iter_arr); } else if (flag_facts->flags & MVM_SPESH_FACT_HASH_ITER) { op_info = MVM_op_get_op(MVM_OP_sp_boolify_iter_hash); } else { op_info = MVM_op_get_op(MVM_OP_sp_boolify_iter); } break; case MVM_BOOL_MODE_UNBOX_INT: if (!guaranteed_concrete) break; op_info = MVM_op_get_op(MVM_OP_unbox_i); break; /* We need to change the register type for our temporary register for this. case MVM_BOOL_MODE_UNBOX_NUM: op_info = MVM_op_get_op(MVM_OP_unbox_i); break; */ case MVM_BOOL_MODE_BIGINT: if (!guaranteed_concrete) break; op_info = MVM_op_get_op(MVM_OP_bool_I); break; case MVM_BOOL_MODE_HAS_ELEMS: if (!guaranteed_concrete) break; op_info = MVM_op_get_op(MVM_OP_elems); break; case MVM_BOOL_MODE_NOT_TYPE_OBJECT: op_info = MVM_op_get_op(MVM_OP_isconcrete); reoptimize = 1; break; default: break; } } /* We're infserting a new instruction for the test (which we may have made * cheaper) and put the result into the temporary register. */ new_ins->info = op_info; new_ins->operands = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshOperand) * 2); new_ins->operands[0] = temp; new_ins->operands[1] = ins->operands[0]; MVM_spesh_manipulate_insert_ins(tc, bb, ins->prev, new_ins); /* Tweak the new instruction into an if_i/unless_i on the temp. */ ins->info = MVM_op_get_op(ins->info->opcode == MVM_OP_unless_o ? MVM_OP_unless_i : MVM_OP_if_i); ins->operands[0] = temp; MVM_spesh_get_facts(tc, g, temp)->usages++; MVM_spesh_use_facts(tc, g, flag_facts); MVM_spesh_manipulate_release_temp_reg(tc, g, temp); /* Now that we *have* decomposed the if_o, annotations should be moved to * the new_ins */ new_ins->annotations = ins->annotations; ins->annotations = NULL; /* If the boolification mode was "not type object" then we might know * that from the facts, and may even be able to elimiante this * conditional altogether. */ if (reoptimize) { optimize_isconcrete(tc, g, new_ins); optimize_iffy(tc, g, ins, bb); } } /* A not_i on a known value can be turned into a constant. */ static void optimize_not_i(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins, MVMSpeshBB *bb) { MVMSpeshFacts *src_facts = MVM_spesh_get_facts(tc, g, ins->operands[1]); if (src_facts->flags & MVM_SPESH_FACT_KNOWN_VALUE) { /* Do the not_i. */ MVMint64 value = src_facts->value.i; MVMint16 result = value ? 0 : 1; /* Turn the op into a constant and set result facts. */ MVMSpeshFacts *dest_facts = MVM_spesh_get_facts(tc, g, ins->operands[0]); dest_facts->flags |= MVM_SPESH_FACT_KNOWN_VALUE; dest_facts->value.i = result; ins->info = MVM_op_get_op(MVM_OP_const_i64_16); ins->operands[1].lit_i16 = result; /* This op no longer uses the source value. */ src_facts->usages--; /* Need to depend on the source facts. */ MVM_spesh_use_facts(tc, g, src_facts); MVM_spesh_facts_depend(tc, g, dest_facts, src_facts); } } /* objprimspec can be done at spesh-time if we know the type of something. * Another thing is, that if we rely on the type being known, we'll be assured * we'll have a guard that promises the object in question to be non-null. */ static void optimize_objprimspec(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins) { MVMSpeshFacts *obj_facts = MVM_spesh_get_facts(tc, g, ins->operands[1]); if (obj_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && obj_facts->type) { MVMSpeshFacts *result_facts = MVM_spesh_get_facts(tc, g, ins->operands[0]); ins->info = MVM_op_get_op(MVM_OP_const_i64_16); result_facts->flags |= MVM_SPESH_FACT_KNOWN_VALUE; result_facts->value.i = REPR(obj_facts->type)->get_storage_spec(tc, STABLE(obj_facts->type))->boxed_primitive; ins->operands[1].lit_i16 = result_facts->value.i; MVM_spesh_use_facts(tc, g, obj_facts); obj_facts->usages--; } } /* Optimizes a hllize instruction away if the type is known and already in the * right HLL, by turning it into a set. */ static void optimize_hllize(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins) { MVMSpeshFacts *obj_facts = MVM_spesh_get_facts(tc, g, ins->operands[1]); if (obj_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && obj_facts->type) { if (STABLE(obj_facts->type)->hll_owner == g->sf->body.cu->body.hll_config) { ins->info = MVM_op_get_op(MVM_OP_set); MVM_spesh_use_facts(tc, g, obj_facts); copy_facts(tc, g, ins->operands[0], ins->operands[1]); } } } /* Turns a decont into a set, if we know it's not needed. Also make sure we * propagate any needed information. */ static void optimize_decont(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMSpeshFacts *obj_facts = MVM_spesh_get_facts(tc, g, ins->operands[1]); if (obj_facts->flags & (MVM_SPESH_FACT_DECONTED | MVM_SPESH_FACT_TYPEOBJ)) { /* Know that we don't need to decont. */ ins->info = MVM_op_get_op(MVM_OP_set); MVM_spesh_use_facts(tc, g, obj_facts); copy_facts(tc, g, ins->operands[0], ins->operands[1]); MVM_spesh_manipulate_remove_handler_successors(tc, bb); } else { /* Propagate facts if we know what this deconts to. */ MVMSpeshFacts *res_facts = MVM_spesh_get_facts(tc, g, ins->operands[0]); int set_facts = 0; if (obj_facts->flags & MVM_SPESH_FACT_KNOWN_DECONT_TYPE) { res_facts->type = obj_facts->decont_type; res_facts->flags |= MVM_SPESH_FACT_KNOWN_TYPE; set_facts = 1; } if (obj_facts->flags & MVM_SPESH_FACT_DECONT_CONCRETE) { res_facts->flags |= MVM_SPESH_FACT_CONCRETE; set_facts = 1; } else if (obj_facts->flags & MVM_SPESH_FACT_DECONT_TYPEOBJ) { res_facts->flags |= MVM_SPESH_FACT_TYPEOBJ; set_facts = 1; } /* If it's a known type... */ if (obj_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && obj_facts->type) { /* Can try to specialize the fetch. */ MVMSTable *stable = STABLE(obj_facts->type); MVMContainerSpec const *contspec = stable->container_spec; if (contspec && contspec->fetch_never_invokes && contspec->spesh) { MVMSpeshAnn *ann = ins->annotations; /* Remove deopt annotation since we know we won't invoke. */ if (ann && ann->type == MVM_SPESH_ANN_DEOPT_ONE_INS) { ins->annotations = ann->next; } else { while (ann) { if (ann->next && ann->next->type == MVM_SPESH_ANN_DEOPT_ONE_INS) { ann->next = ann->next->next; break; } ann = ann->next; } } contspec->spesh(tc, stable, g, bb, ins); MVM_spesh_use_facts(tc, g, obj_facts); } /* If we didn't yet set facts, and the incoming type is a native * reference, then we can set facts based on knowing what it will * decont/box to. */ if (!set_facts && stable->REPR->ID == MVM_REPR_ID_NativeRef) { MVMNativeRefREPRData *repr_data = (MVMNativeRefREPRData *)stable->REPR_data; MVMHLLConfig *hll = stable->hll_owner; MVMObject *out_type = NULL; if (!hll) hll = g->sf->body.cu->body.hll_config; switch (repr_data->primitive_type) { case MVM_STORAGE_SPEC_BP_INT: out_type = hll->int_box_type; break; case MVM_STORAGE_SPEC_BP_NUM: out_type = hll->num_box_type; break; case MVM_STORAGE_SPEC_BP_STR: out_type = hll->str_box_type; break; } if (out_type) { res_facts->type = out_type; res_facts->flags |= MVM_SPESH_FACT_KNOWN_TYPE | MVM_SPESH_FACT_CONCRETE; set_facts = 1; } } } /* Depend on incoming facts if we used them. */ if (set_facts) MVM_spesh_facts_depend(tc, g, res_facts, obj_facts); /* If the op is still a decont, then turn it into sp_decont, which * will at least not write log entries. */ if (ins->info->opcode == MVM_OP_decont) ins->info = MVM_op_get_op(MVM_OP_sp_decont); } } /* Checks like iscont, iscont_[ins] and isrwcont can be done at spesh time. */ static void optimize_container_check(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMSpeshFacts *facts = MVM_spesh_get_facts(tc, g, ins->operands[1]); MVMSpeshFacts *result_facts = MVM_spesh_get_facts(tc, g, ins->operands[0]); MVMint32 known_result = -1; if (ins->info->opcode == MVM_OP_isrwcont) { if (facts->flags & MVM_SPESH_FACT_RW_CONT) known_result = 1; } else { if (facts->flags & MVM_SPESH_FACT_TYPEOBJ) { /* Type object can never be a container. */ known_result = 0; } else if ((facts->flags & MVM_SPESH_FACT_CONCRETE) && (facts->flags & MVM_SPESH_FACT_KNOWN_TYPE)) { /* Know the type and know it's concrete. */ MVMContainerSpec const *cs = facts->type->st->container_spec; if (!cs) { /* No container spec, so can be sure it's not a container. */ known_result = 0; } else if (ins->info->opcode == MVM_OP_iscont) { /* General is container check, so answer is yes. */ known_result = 1; } else { if (REPR(facts->type)->ID == MVM_REPR_ID_NativeRef) { /* Which native ref primitive? */ switch (((MVMNativeRefREPRData *)STABLE(facts->type)->REPR_data)->primitive_type) { case MVM_STORAGE_SPEC_BP_INT: known_result = ins->info->opcode == MVM_OP_iscont_i; break; case MVM_STORAGE_SPEC_BP_NUM: known_result = ins->info->opcode == MVM_OP_iscont_n; break; case MVM_STORAGE_SPEC_BP_STR: known_result = ins->info->opcode == MVM_OP_iscont_s; break; } } else { /* Need a native ref but don't have one, so certain no. */ known_result = 0; } } } } if (known_result != -1) { ins->info = MVM_op_get_op(MVM_OP_const_i64_16); result_facts->flags |= MVM_SPESH_FACT_KNOWN_VALUE; result_facts->value.i = known_result; ins->operands[1].lit_i16 = known_result; MVM_spesh_use_facts(tc, g, facts); facts->usages--; } } /* Optimize away assertparamcheck if we know it will pass. */ static void optimize_assertparamcheck(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMSpeshFacts *facts = MVM_spesh_get_facts(tc, g, ins->operands[0]); if (facts->flags & MVM_SPESH_FACT_KNOWN_VALUE && facts->value.i) { MVM_spesh_use_facts(tc, g, facts); MVM_spesh_manipulate_delete_ins(tc, g, bb, ins); } } static void optimize_can_op(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { /* This used to cause problems, Spesh: failed to fix up handlers (-1, 110, 110) */ MVMSpeshFacts *obj_facts = MVM_spesh_get_facts(tc, g, ins->operands[1]); MVMString *method_name; MVMint64 can_result; if (ins->info->opcode == MVM_OP_can_s) { MVMSpeshFacts *name_facts = MVM_spesh_get_facts(tc, g, ins->operands[2]); if (!(name_facts->flags & MVM_SPESH_FACT_KNOWN_VALUE)) { return; } method_name = name_facts->value.s; name_facts->usages--; ins->info = MVM_op_get_op(MVM_OP_can); ins->operands[2].lit_str_idx = name_facts->writer->operands[1].lit_str_idx; } else { method_name = MVM_spesh_get_string(tc, g, ins->operands[2]); } if (!(obj_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE) || !obj_facts->type) { return; } if (MVM_is_null(tc, obj_facts->type)) can_result = 0; /* VMNull can't have any methods. */ else can_result = MVM_spesh_try_can_method(tc, obj_facts->type, method_name); if (can_result == -1) { return; } else { MVMSpeshFacts *result_facts; if (ins->info->opcode == MVM_OP_can_s) MVM_spesh_get_facts(tc, g, ins->operands[2])->usages--; result_facts = MVM_spesh_get_facts(tc, g, ins->operands[0]); ins->info = MVM_op_get_op(MVM_OP_const_i64_16); result_facts->flags |= MVM_SPESH_FACT_KNOWN_VALUE; ins->operands[1].lit_i16 = can_result; result_facts->value.i = can_result; obj_facts->usages--; MVM_spesh_use_facts(tc, g, obj_facts); } } /* If we have a const_i and a coerce_in, we can emit a const_n instead. */ static void optimize_coerce(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMSpeshFacts *facts = MVM_spesh_get_facts(tc, g, ins->operands[1]); if (facts->flags & MVM_SPESH_FACT_KNOWN_VALUE) { MVMSpeshFacts *result_facts = MVM_spesh_get_facts(tc, g, ins->operands[0]); MVMnum64 result = facts->value.i; MVM_spesh_use_facts(tc, g, facts); facts->usages--; ins->info = MVM_op_get_op(MVM_OP_const_n64); ins->operands[1].lit_n64 = result; result_facts->flags |= MVM_SPESH_FACT_KNOWN_VALUE; result_facts->value.n = result; } } /* If we know the type of a significant operand, we might try to specialize by * representation. */ static void optimize_repr_op(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins, MVMint32 type_operand) { /* Immediately mark guards as used, as the JIT would like to devirtualize * repr ops later and we don't want guards to be thrown out before that */ MVMSpeshFacts *facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[type_operand]); if (facts->flags & MVM_SPESH_FACT_KNOWN_TYPE && facts->type) if (REPR(facts->type)->spesh) { REPR(facts->type)->spesh(tc, STABLE(facts->type), g, bb, ins); MVM_spesh_use_facts(tc, g, facts); } } /* smrt_strify and smrt_numify can turn into unboxes, but at least * for smrt_numify it's "complicated". Also, later when we know how * to put new invocations into spesh'd code, we could make direct * invoke calls to the .Str and .Num methods. */ static void optimize_smart_coerce(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMSpeshFacts *facts = MVM_spesh_get_facts(tc, g, ins->operands[1]); MVMuint16 is_strify = ins->info->opcode == MVM_OP_smrt_strify; if (facts->flags & (MVM_SPESH_FACT_KNOWN_TYPE | MVM_SPESH_FACT_CONCRETE) && facts->type) { const MVMStorageSpec *ss; MVMint64 can_result; ss = REPR(facts->type)->get_storage_spec(tc, STABLE(facts->type)); if (is_strify && ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_STR) { MVM_spesh_use_facts(tc, g, facts); ins->info = MVM_op_get_op(MVM_OP_unbox_s); /* And now that we have a repr op, we can try to optimize * it even further. */ optimize_repr_op(tc, g, bb, ins, 1); return; } can_result = MVM_spesh_try_can_method(tc, facts->type, is_strify ? tc->instance->str_consts.Str : tc->instance->str_consts.Num); if (can_result == -1) { /* Couldn't safely figure out if the type has a Str method or not. */ return; } else if (can_result == 0) { MVM_spesh_use_facts(tc, g, facts); /* We can't .Str this object, so we'll duplicate the "guessing" * logic from smrt_strify here to remove indirection. */ if (is_strify && REPR(facts->type)->ID == MVM_REPR_ID_MVMException) { MVMSpeshOperand *operands = MVM_spesh_alloc(tc, g, sizeof( MVMSpeshOperand ) * 3); MVMSpeshOperand *old_opers = ins->operands; ins->info = MVM_op_get_op(MVM_OP_sp_get_s); ins->operands = operands; operands[0] = old_opers[0]; operands[1] = old_opers[1]; operands[2].lit_i16 = offsetof( MVMException, body.message ); } else if(ss->can_box & (MVM_STORAGE_SPEC_CAN_BOX_NUM | MVM_STORAGE_SPEC_CAN_BOX_INT)) { MVMuint16 register_type = ss->can_box & MVM_STORAGE_SPEC_CAN_BOX_INT ? MVM_reg_int64 : MVM_reg_num64; MVMSpeshIns *new_ins = MVM_spesh_alloc(tc, g, sizeof( MVMSpeshIns )); MVMSpeshOperand *operands = MVM_spesh_alloc(tc, g, sizeof( MVMSpeshOperand ) * 2); MVMSpeshOperand temp = MVM_spesh_manipulate_get_temp_reg(tc, g, register_type); MVMSpeshOperand orig_dst = ins->operands[0]; ins->info = MVM_op_get_op(register_type == MVM_reg_num64 ? MVM_OP_unbox_n : MVM_OP_unbox_i); ins->operands[0] = temp; if (is_strify) new_ins->info = MVM_op_get_op(register_type == MVM_reg_num64 ? MVM_OP_coerce_ns : MVM_OP_coerce_is); else new_ins->info = MVM_op_get_op(register_type == MVM_reg_num64 ? MVM_OP_set : MVM_OP_coerce_in); new_ins->operands = operands; operands[0] = orig_dst; operands[1] = temp; /* We can directly "eliminate" a set instruction here. */ if (new_ins->info->opcode != MVM_OP_set) { MVM_spesh_manipulate_insert_ins(tc, bb, ins, new_ins); MVM_spesh_get_facts(tc, g, temp)->usages++; } else { ins->operands[0] = orig_dst; } /* Finally, let's try to optimize the unboxing REPROp. */ optimize_repr_op(tc, g, bb, ins, 1); /* And as a last clean-up step, we release the temporary register. */ MVM_spesh_manipulate_release_temp_reg(tc, g, temp); return; } else if (!is_strify && (REPR(facts->type)->ID == MVM_REPR_ID_VMArray || (REPR(facts->type)->ID == MVM_REPR_ID_MVMHash))) { /* A smrt_numify on an array or hash can be replaced by an * elems operation, that can then be optimized by our * versatile and dilligent friend optimize_repr_op. */ MVMSpeshIns *new_ins = MVM_spesh_alloc(tc, g, sizeof( MVMSpeshIns )); MVMSpeshOperand *operands = MVM_spesh_alloc(tc, g, sizeof( MVMSpeshOperand ) * 2); MVMSpeshOperand temp = MVM_spesh_manipulate_get_temp_reg(tc, g, MVM_reg_int64); MVMSpeshOperand orig_dst = ins->operands[0]; ins->info = MVM_op_get_op(MVM_OP_elems); ins->operands[0] = temp; new_ins->info = MVM_op_get_op(MVM_OP_coerce_in); new_ins->operands = operands; operands[0] = orig_dst; operands[1] = temp; MVM_spesh_manipulate_insert_ins(tc, bb, ins, new_ins); optimize_repr_op(tc, g, bb, ins, 1); MVM_spesh_get_facts(tc, g, temp)->usages++; MVM_spesh_manipulate_release_temp_reg(tc, g, temp); return; } } else if (can_result == 1) { /* When we know how to generate additional callsites, we could * make an invocation to .Str or .Num here and perhaps have it * in-lined. */ } } } /* Optimize string equality if one param is the empty string */ static void optimize_string_equality(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMSpeshFacts *a_facts = MVM_spesh_get_facts(tc, g, ins->operands[1]); MVMSpeshFacts *b_facts = MVM_spesh_get_facts(tc, g, ins->operands[2]); MVMuint8 was_eq = 0; return; if (ins->info->opcode == MVM_OP_eq_s) was_eq = 1; if (a_facts->flags & MVM_SPESH_FACT_KNOWN_VALUE && b_facts->flags & MVM_SPESH_FACT_KNOWN_VALUE) { /* Cool, we can constant-fold this. */ MVMSpeshFacts *target_facts = MVM_spesh_get_facts(tc, g, ins->operands[0]); a_facts->usages--; b_facts->usages--; ins->operands[1].lit_i16 = MVM_string_equal(tc, a_facts->value.s, b_facts->value.s); if (!was_eq) ins->operands[1].lit_i16 = !ins->operands[1].lit_i16; ins->info = MVM_op_get_op(MVM_OP_const_i64_16); target_facts->flags |= MVM_SPESH_FACT_KNOWN_VALUE; target_facts->value.i = ins->operands[1].lit_i16; fprintf(stderr, "turned an eq or ne into a constant\n"); } else if (a_facts->flags & MVM_SPESH_FACT_KNOWN_VALUE || b_facts->flags & MVM_SPESH_FACT_KNOWN_VALUE) { MVMSpeshFacts *the_facts = a_facts->flags & MVM_SPESH_FACT_KNOWN_VALUE ? a_facts : b_facts; if (MVM_string_graphs(tc, the_facts->value.s) == 0) { /* Turn this into an istrue_s or isfalse_s */ ins->info = MVM_op_get_op(was_eq ? MVM_OP_isfalse_s : MVM_OP_istrue_s); /* Throw out the string argument that was the empty string */ if (the_facts == a_facts) { ins->operands[1] = ins->operands[2]; } the_facts->usages--; fprintf(stderr, "turned an eq or ne into an istrue/isfalse\n"); } } } /* boolification has a major indirection, which we can spesh away. * Afterwards, we may be able to spesh even further, so we defer * to other optimization methods. */ static void optimize_istrue_isfalse(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMuint8 negated_op; MVMSpeshFacts *facts = MVM_spesh_get_facts(tc, g, ins->operands[1]); if (ins->info->opcode == MVM_OP_istrue) { negated_op = 0; } else if (ins->info->opcode == MVM_OP_isfalse) { negated_op = 1; } else { return; } /* Let's try to figure out the boolification spec. */ if (facts->flags & MVM_SPESH_FACT_KNOWN_TYPE) { MVMBoolificationSpec *bs = STABLE(facts->type)->boolification_spec; MVMSpeshOperand orig = ins->operands[0]; MVMSpeshOperand temp; if (negated_op) temp = MVM_spesh_manipulate_get_temp_reg(tc, g, MVM_reg_int64); switch (bs == NULL ? MVM_BOOL_MODE_NOT_TYPE_OBJECT : bs->mode) { case MVM_BOOL_MODE_UNBOX_INT: /* This optimization can only handle values known to be concrete. */ if (!(facts->flags & MVM_SPESH_FACT_CONCRETE)) { return; } /* We can just unbox the int and pretend it's a bool. */ ins->info = MVM_op_get_op(MVM_OP_unbox_i); if (negated_op) ins->operands[0] = temp; /* And then we might be able to optimize this even further. */ optimize_repr_op(tc, g, bb, ins, 1); break; case MVM_BOOL_MODE_NOT_TYPE_OBJECT: /* This is the same as isconcrete. */ ins->info = MVM_op_get_op(MVM_OP_isconcrete); if (negated_op) ins->operands[0] = temp; /* And now defer another bit of optimization */ optimize_isconcrete(tc, g, ins); break; /* TODO implement MODE_UNBOX_NUM and the string ones */ default: return; } /* Now we can take care of the negation. */ if (negated_op) { /* Insert a not_i instruction that negates temp. This not_i is * subject to further optimization in the case that temp has a * known value set on it. */ MVMSpeshIns *new_ins = MVM_spesh_alloc(tc, g, sizeof( MVMSpeshIns )); MVMSpeshOperand *operands = MVM_spesh_alloc(tc, g, sizeof( MVMSpeshOperand ) * 2); new_ins->info = MVM_op_get_op(MVM_OP_not_i); new_ins->operands = operands; operands[0] = orig; operands[1] = temp; MVM_spesh_manipulate_insert_ins(tc, bb, ins, new_ins); MVM_spesh_get_facts(tc, g, temp)->usages++; MVM_spesh_manipulate_release_temp_reg(tc, g, temp); } MVM_spesh_use_facts(tc, g, facts); } } /* Turns a getlex instruction into getlex_o or getlex_ins depending on type; * these get rid of some branching as well as don't log. */ static void optimize_getlex(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins) { MVMuint16 *lexical_types; MVMuint16 i; MVMStaticFrame *sf = g->sf; for (i = 0; i < ins->operands[1].lex.outers; i++) sf = sf->body.outer; lexical_types = sf == g->sf && g->lexical_types ? g->lexical_types : sf->body.lexical_types; ins->info = MVM_op_get_op(lexical_types[ins->operands[1].lex.idx] == MVM_reg_obj ? MVM_OP_sp_getlex_o : MVM_OP_sp_getlex_ins); } /* Transforms a late-bound lexical lookup into a constant. */ static void lex_to_constant(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins, MVMObject *log_obj) { MVMSpeshFacts *facts; /* Place in a spesh slot. */ MVMuint16 ss = MVM_spesh_add_spesh_slot_try_reuse(tc, g, (MVMCollectable *)log_obj); /* Transform lookup instruction into spesh slot read. */ MVM_spesh_get_facts(tc, g, ins->operands[1])->usages--; ins->info = MVM_op_get_op(MVM_OP_sp_getspeshslot); ins->operands[1].lit_i16 = ss; /* Set up facts. */ facts = MVM_spesh_get_facts(tc, g, ins->operands[0]); facts->flags |= MVM_SPESH_FACT_KNOWN_TYPE | MVM_SPESH_FACT_KNOWN_VALUE; facts->type = STABLE(log_obj)->WHAT; facts->value.o = log_obj; if (IS_CONCRETE(log_obj)) { facts->flags |= MVM_SPESH_FACT_CONCRETE; if (!STABLE(log_obj)->container_spec) facts->flags |= MVM_SPESH_FACT_DECONTED; } else { facts->flags |= MVM_SPESH_FACT_TYPEOBJ; } } /* Optimizes away a lexical lookup when we know the value won't change from * the logged one. */ static void optimize_getlex_known(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { /* Try to find logged offset. */ MVMSpeshAnn *ann = ins->annotations; while (ann) { if (ann->type == MVM_SPESH_ANN_LOGGED) break; ann = ann->next; } if (ann) { /* See if we can find a logged static value. */ MVMSpeshStats *ss = g->sf->body.spesh->body.spesh_stats; MVMuint32 n = ss->num_static_values; MVMuint32 i; for (i = 0; i < n; i++) { if (ss->static_values[i].bytecode_offset == ann->data.bytecode_offset) { MVMObject *log_obj = ss->static_values[i].value; if (log_obj) lex_to_constant(tc, g, ins, log_obj); return; } } } } /* Optimizes away a lexical lookup when we know the value won't change for a * given invocant type (this relies on us being in a typed specialization). */ static void optimize_getlex_per_invocant(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins, MVMSpeshPlanned *p) { MVMSpeshAnn *ann; /* Can only do this when we've specialized on the first argument type. */ if (!g->specialized_on_invocant) return; /* Try to find logged offset. */ ann = ins->annotations; while (ann) { if (ann->type == MVM_SPESH_ANN_LOGGED) break; ann = ann->next; } if (ann) { MVMuint32 i; for (i = 0; i < p->num_type_stats; i++) { MVMSpeshStatsByType *ts = p->type_stats[i]; MVMuint32 j; for (j = 0; j < ts->num_by_offset; j++) { if (ts->by_offset[j].bytecode_offset == ann->data.bytecode_offset) { if (ts->by_offset[j].num_types) { MVMObject *log_obj = ts->by_offset[j].types[0].type; if (log_obj && !ts->by_offset[j].types[0].type_concrete) lex_to_constant(tc, g, ins, log_obj); return; } break; } } } } } /* Determines if there's a matching spesh candidate for a callee and a given * set of argument info. */ static MVMint32 try_find_spesh_candidate(MVMThreadContext *tc, MVMStaticFrame *sf, MVMSpeshCallInfo *arg_info, MVMSpeshStatsType *type_tuple) { MVMSpeshArgGuard *ag = sf->body.spesh->body.spesh_arg_guard; return type_tuple ? MVM_spesh_arg_guard_run_types(tc, ag, arg_info->cs, type_tuple) : MVM_spesh_arg_guard_run_callinfo(tc, ag, arg_info); } /* Given an invoke instruction, find its logging bytecode offset. Returns 0 * if not found. */ MVMuint32 find_invoke_offset(MVMThreadContext *tc, MVMSpeshIns *ins) { MVMSpeshAnn *ann = ins->annotations; while (ann) { if (ann->type == MVM_SPESH_ANN_LOGGED) return ann->data.bytecode_offset; ann = ann->next; } return 0; } /* Given an instruction, finds the deopt target on it. Panics if there is not * one there. */ MVMuint32 find_deopt_target(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins) { MVMuint32 deopt_target; MVMSpeshAnn *deopt_ann = ins->annotations; while (deopt_ann) { if (deopt_ann->type == MVM_SPESH_ANN_DEOPT_ONE_INS) return g->deopt_addrs[2 * deopt_ann->data.deopt_idx]; deopt_ann = deopt_ann->next; } MVM_panic(1, "Spesh: unexpectedly missing deopt annotation on prepargs"); } /* Given a callsite instruction, finds the type tuples there and checks if * there is a relatively stable one. */ static MVMSpeshStatsType * find_invokee_type_tuple(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins, MVMSpeshPlanned *p, MVMCallsite *expect_cs) { MVMuint32 i; MVMSpeshStatsType *best_result = NULL; MVMuint32 best_result_hits = 0; MVMuint32 total_hits = 0; size_t tt_size = expect_cs->flag_count * sizeof(MVMSpeshStatsType); /* First try to find logging bytecode offset. */ MVMuint32 invoke_offset = find_invoke_offset(tc, ins); if (!invoke_offset) return NULL; /* Now look for the best type tuple. */ for (i = 0; i < p->num_type_stats; i++) { MVMSpeshStatsByType *ts = p->type_stats[i]; MVMuint32 j; for (j = 0; j < ts->num_by_offset; j++) { if (ts->by_offset[j].bytecode_offset == invoke_offset) { MVMSpeshStatsByOffset *by_offset = &(ts->by_offset[j]); MVMuint32 k; for (k = 0; k < by_offset->num_type_tuples; k++) { MVMSpeshStatsTypeTupleCount *tt = &(by_offset->type_tuples[k]); /* Callsite should always match but skip if not. */ if (tt->cs != expect_cs) continue; /* Add hits to total we've seen. */ total_hits += tt->count; /* If it's the same as the best so far, add hits. */ if (best_result && memcmp(best_result, tt->arg_types, tt_size) == 0) { best_result_hits += tt->count; } /* Otherwise, if it beats the best result in hits, use. */ else if (tt->count > best_result_hits) { best_result = tt->arg_types; best_result_hits = tt->count; } } } } } /* If the type tuple is used consistently enough, return it. */ return total_hits && (100 * best_result_hits) / total_hits >= MVM_SPESH_CALLSITE_STABLE_PERCENT ? best_result : NULL; } /* Inserts an argument type guard as suggested by a logged type tuple. */ static void insert_arg_type_guard(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshStatsType *type_info, MVMSpeshCallInfo *arg_info, MVMuint32 arg_idx) { /* Insert guard before prepargs (this means they stack up in order). */ MVMuint32 deopt_target = find_deopt_target(tc, g, arg_info->prepargs_ins); MVMSpeshIns *guard = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); guard->info = MVM_op_get_op(type_info->type_concrete ? MVM_OP_sp_guardconc : MVM_OP_sp_guardtype); guard->operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand)); guard->operands[0] = arg_info->arg_ins[arg_idx]->operands[1]; guard->operands[1].lit_i16 = MVM_spesh_add_spesh_slot_try_reuse(tc, g, (MVMCollectable *)type_info->type->st); guard->operands[2].lit_ui32 = deopt_target; MVM_spesh_manipulate_insert_ins(tc, arg_info->prepargs_bb, arg_info->prepargs_ins->prev, guard); /* Also give the instruction a deopt annotation. */ MVM_spesh_graph_add_deopt_annotation(tc, g, guard, deopt_target, MVM_SPESH_ANN_DEOPT_ONE_INS); } /* Inserts an argument decont type guard as suggested by a logged type tuple. */ static void insert_arg_decont_type_guard(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshStatsType *type_info, MVMSpeshCallInfo *arg_info, MVMuint32 arg_idx) { MVMSpeshIns *decont, *guard; MVMuint32 deopt_target; /* We need a temporary register to decont into. */ MVMSpeshOperand temp = MVM_spesh_manipulate_get_temp_reg(tc, g, MVM_reg_obj); /* Insert the decont, then try to optimize it into something cheaper. */ decont = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); decont->info = MVM_op_get_op(MVM_OP_decont); decont->operands = MVM_spesh_alloc(tc, g, 2 * sizeof(MVMSpeshOperand)); decont->operands[0] = temp; decont->operands[1] = arg_info->arg_ins[arg_idx]->operands[1]; MVM_spesh_manipulate_insert_ins(tc, arg_info->prepargs_bb, arg_info->prepargs_ins->prev, decont); MVM_spesh_get_facts(tc, g, temp)->usages++; optimize_decont(tc, g, arg_info->prepargs_bb, decont); /* Guard the decontainerized value. */ deopt_target = find_deopt_target(tc, g, arg_info->prepargs_ins); guard = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); guard->info = MVM_op_get_op(type_info->decont_type_concrete ? MVM_OP_sp_guardconc : MVM_OP_sp_guardtype); guard->operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand)); guard->operands[0] = temp; guard->operands[1].lit_i16 = MVM_spesh_add_spesh_slot_try_reuse(tc, g, (MVMCollectable *)type_info->decont_type->st); guard->operands[2].lit_ui32 = deopt_target; MVM_spesh_manipulate_insert_ins(tc, arg_info->prepargs_bb, arg_info->prepargs_ins->prev, guard); /* Also give the instruction a deopt annotation. */ MVM_spesh_graph_add_deopt_annotation(tc, g, guard, deopt_target, MVM_SPESH_ANN_DEOPT_ONE_INS); /* Release the temp register. */ MVM_spesh_manipulate_release_temp_reg(tc, g, temp); } /* Look through the call info and the type tuple, see what guards we are * missing, and insert them. */ static void check_and_tweak_arg_guards(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshStatsType *type_tuple, MVMSpeshCallInfo *arg_info) { MVMuint32 n = arg_info->cs->flag_count; MVMuint32 arg_idx = 0; MVMuint32 i; for (i = 0; i < n; i++, arg_idx++) { if (arg_info->cs->arg_flags[i] & MVM_CALLSITE_ARG_NAMED) arg_idx++; if (arg_info->cs->arg_flags[i] & MVM_CALLSITE_ARG_OBJ) { MVMObject *t_type = type_tuple[i].type; MVMObject *t_decont_type = type_tuple[i].decont_type; if (t_type) { /* Add a guard unless the facts already match. */ MVMSpeshFacts *arg_facts = arg_info->arg_facts[arg_idx]; MVMuint32 need_guard = !arg_facts || !(arg_facts->flags & MVM_SPESH_FACT_KNOWN_TYPE) || arg_facts->type != t_type || type_tuple[i].type_concrete && !(arg_facts->flags & MVM_SPESH_FACT_CONCRETE) || !type_tuple[i].type_concrete && !(arg_facts->flags & MVM_SPESH_FACT_TYPEOBJ); if (need_guard) insert_arg_type_guard(tc, g, &type_tuple[i], arg_info, arg_idx); } if (t_decont_type) insert_arg_decont_type_guard(tc, g, &type_tuple[i], arg_info, arg_idx); } } } /* Sees if any static frames were logged for this invoke instruction, and * if so checks if there was a stable one. A static frame chosen by multi * dispatch will for now never count as stable, as we don't have a good way * to handle this situation yet and trying results in deopts. */ MVMStaticFrame * find_invokee_static_frame(MVMThreadContext *tc, MVMSpeshPlanned *p, MVMSpeshIns *ins) { MVMuint32 i; MVMStaticFrame *best_result = NULL; MVMuint32 best_result_hits = 0; MVMuint32 best_result_was_multi_hits = 0; MVMuint32 total_hits = 0; /* First try to find logging bytecode offset. */ MVMuint32 invoke_offset = find_invoke_offset(tc, ins); if (!invoke_offset) return NULL; /* Now look for a stable invokee. */ for (i = 0; i < p->num_type_stats; i++) { MVMSpeshStatsByType *ts = p->type_stats[i]; MVMuint32 j; for (j = 0; j < ts->num_by_offset; j++) { if (ts->by_offset[j].bytecode_offset == invoke_offset) { MVMSpeshStatsByOffset *by_offset = &(ts->by_offset[j]); MVMuint32 k; for (k = 0; k < by_offset->num_invokes; k++) { MVMSpeshStatsInvokeCount *ic = &(by_offset->invokes[k]); /* Add hits to total we've seen. */ total_hits += ic->count; /* If it's the same as the best so far, add hits. */ if (best_result && ic->sf == best_result) { best_result_hits += ic->count; best_result_was_multi_hits += ic->was_multi_count; } /* Otherwise, if it beats the best result in hits, use. */ else if (ic->count > best_result_hits) { best_result = ic->sf; best_result_hits = ic->count; best_result_was_multi_hits = ic->was_multi_count; } } } } } /* If the chosen frame was a multi, give up. */ if (best_result_was_multi_hits) return NULL; /* If the static frame is consistent enough, return it. */ return total_hits && (100 * best_result_hits) / total_hits >= MVM_SPESH_CALLSITE_STABLE_PERCENT ? best_result : NULL; } /* Inserts resolution of the invokee to an MVMCode and the guard on the * invocation, and then tweaks the invoke instruction to use the resolved * code object (for the case it is further optimized into a fast invoke). */ static void tweak_for_target_sf(MVMThreadContext *tc, MVMSpeshGraph *g, MVMStaticFrame *target_sf, MVMSpeshIns *ins, MVMSpeshCallInfo *arg_info, MVMSpeshOperand temp) { MVMSpeshIns *guard, *resolve; MVMuint32 deopt_target; /* Work out which operand of the invoke instruction has the invokee. */ MVMuint32 inv_code_index = ins->info->opcode == MVM_OP_invoke_v ? 0 : 1; /* Insert instruction to resolve any code wrapper into the MVMCode before * prepargs. */ resolve = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); resolve->info = MVM_op_get_op(MVM_OP_sp_resolvecode); resolve->operands = MVM_spesh_alloc(tc, g, 2 * sizeof(MVMSpeshOperand)); resolve->operands[0] = temp; resolve->operands[1] = ins->operands[inv_code_index]; MVM_spesh_manipulate_insert_ins(tc, arg_info->prepargs_bb, arg_info->prepargs_ins->prev, resolve); /* Insert guard instruction before the prepargs. */ deopt_target = find_deopt_target(tc, g, arg_info->prepargs_ins); guard = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); guard->info = MVM_op_get_op(MVM_OP_sp_guardsf); guard->operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand)); guard->operands[0] = temp; guard->operands[1].lit_i16 = MVM_spesh_add_spesh_slot_try_reuse(tc, g, (MVMCollectable *)target_sf); guard->operands[2].lit_ui32 = deopt_target; MVM_spesh_manipulate_insert_ins(tc, arg_info->prepargs_bb, arg_info->prepargs_ins->prev, guard); /* Also give the guard instruction a deopt annotation. */ MVM_spesh_graph_add_deopt_annotation(tc, g, guard, deopt_target, MVM_SPESH_ANN_DEOPT_ONE_INS); /* Make the invoke instruction call the resolved result. */ ins->operands[inv_code_index] = temp; /* Bump temp usage (one for the guard, one for the invoke). */ MVM_spesh_get_facts(tc, g, temp)->usages += 2; } /* Drives optimization of a call. */ static void optimize_call(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins, MVMSpeshPlanned *p, MVMint32 callee_idx, MVMSpeshCallInfo *arg_info) { MVMSpeshStatsType *stable_type_tuple; MVMObject *target = NULL; MVMuint32 num_arg_slots; MVMSpeshOperand code_temp; /* Check we know what we're going to be invoking. */ MVMSpeshFacts *callee_facts = MVM_spesh_get_and_use_facts(tc, g, ins->operands[callee_idx]); MVMObject *code = NULL; MVMStaticFrame *target_sf = NULL; MVMint32 have_code_temp = 0; if (callee_facts->flags & MVM_SPESH_FACT_KNOWN_VALUE) { /* Already know the target code object based on existing guards or * a static value. */ code = callee_facts->value.o; } else { /* See if there is a stable static frame at the callsite. If so, add * the resolution and guard instruction. Note that we must keep the * temporary alive throughout the whole guard and invocation sequence, * as an inline may use it during deopt to find the code ref. */ target_sf = find_invokee_static_frame(tc, p, ins); if (target_sf) { code_temp = MVM_spesh_manipulate_get_temp_reg(tc, g, MVM_reg_obj); have_code_temp = 1; tweak_for_target_sf(tc, g, target_sf, ins, arg_info, code_temp); } } if (!code && !target_sf) return; /* See if there's a stable type tuple at this callsite. If so, see if we * are missing any guards required, and try to insert them if so. Only do * this if the callsite isn't too big for arg_info. */ num_arg_slots = arg_info->cs->num_pos + 2 * (arg_info->cs->flag_count - arg_info->cs->num_pos); stable_type_tuple = num_arg_slots <= MAX_ARGS_FOR_OPT ? find_invokee_type_tuple(tc, g, bb, ins, p, arg_info->cs) : NULL; if (stable_type_tuple) check_and_tweak_arg_guards(tc, g, stable_type_tuple, arg_info); /* If we don't have a target static frame from speculation, check on what * we're going to be invoking and see if we can further resolve it. */ if (!target_sf) { if (REPR(code)->ID == MVM_REPR_ID_MVMCode) { /* Already have a code object we know we'll call. */ target = code; } else if (IS_CONCRETE(code) && STABLE(code)->invocation_spec) { /* What kind of invocation will it be? */ MVMInvocationSpec *is = STABLE(code)->invocation_spec; if (!MVM_is_null(tc, is->md_class_handle)) { /* Multi-dispatch. Check if this is a dispatch where we can * use the cache directly. */ MVMRegister dest; REPR(code)->attr_funcs.get_attribute(tc, STABLE(code), code, OBJECT_BODY(code), is->md_class_handle, is->md_valid_attr_name, is->md_valid_hint, &dest, MVM_reg_int64); if (dest.i64) { /* Yes. Try to obtain the cache. */ REPR(code)->attr_funcs.get_attribute(tc, STABLE(code), code, OBJECT_BODY(code), is->md_class_handle, is->md_cache_attr_name, is->md_cache_hint, &dest, MVM_reg_obj); if (!MVM_is_null(tc, dest.o)) { MVMObject *found = MVM_multi_cache_find_spesh(tc, dest.o, arg_info, stable_type_tuple); if (found) { /* Found it. Is it a code object already, or do we * have futher unpacking to do? */ if (REPR(found)->ID == MVM_REPR_ID_MVMCode) { target = found; } else if (STABLE(found)->invocation_spec) { MVMInvocationSpec *m_is = STABLE(found)->invocation_spec; if (!MVM_is_null(tc, m_is->class_handle)) { REPR(found)->attr_funcs.get_attribute(tc, STABLE(found), found, OBJECT_BODY(found), is->class_handle, is->attr_name, is->hint, &dest, MVM_reg_obj); if (REPR(dest.o)->ID == MVM_REPR_ID_MVMCode) target = dest.o; } } } } } else if (!MVM_is_null(tc, is->class_handle)) { /* This type of code object supports multi-dispatch, * but we actually have a single dispatch routine. */ MVMRegister dest; REPR(code)->attr_funcs.get_attribute(tc, STABLE(code), code, OBJECT_BODY(code), is->class_handle, is->attr_name, is->hint, &dest, MVM_reg_obj); if (REPR(dest.o)->ID == MVM_REPR_ID_MVMCode) target = dest.o; } } else if (!MVM_is_null(tc, is->class_handle)) { /* Single dispatch; retrieve the code object. */ MVMRegister dest; REPR(code)->attr_funcs.get_attribute(tc, STABLE(code), code, OBJECT_BODY(code), is->class_handle, is->attr_name, is->hint, &dest, MVM_reg_obj); if (REPR(dest.o)->ID == MVM_REPR_ID_MVMCode) target = dest.o; } } if (!target || !IS_CONCRETE(target)) return; /* If we resolved to something better than the code object, then add * the resolved item in a spesh slot and insert a lookup. */ if (target != code && !((MVMCode *)target)->body.is_compiler_stub) { MVMSpeshIns *pa_ins = arg_info->prepargs_ins; MVMSpeshIns *ss_ins = MVM_spesh_alloc(tc, g, sizeof(MVMSpeshIns)); ss_ins->info = MVM_op_get_op(MVM_OP_sp_getspeshslot); ss_ins->operands = MVM_spesh_alloc(tc, g, 2 * sizeof(MVMSpeshOperand)); ss_ins->operands[0] = ins->operands[callee_idx]; ss_ins->operands[1].lit_i16 = MVM_spesh_add_spesh_slot_try_reuse(tc, g, (MVMCollectable *)target); /* Basically, we're inserting between arg* and invoke_*. * Since invoke_* directly uses the code in the register, * the register must have held the code during the arg* * instructions as well, because none of {prepargs, arg*} * can manipulate the register that holds the code. * * To make a long story very short, I think it should be * safe to move the sp_getspeshslot to /before/ the * prepargs instruction. And this is very convenient for * me, as it allows me to treat set of prepargs, arg*, * invoke, as a /single node/, and this greatly simplifies * invoke JIT compilation */ MVM_spesh_manipulate_insert_ins(tc, bb, pa_ins->prev, ss_ins); /* XXX TODO: Do this differently so we can eliminate the original * lookup of the enclosing code object also. */ } /* Extract the target static frame from the target code object; we * will work in terms of that from here on. */ target_sf = ((MVMCode *)target)->body.sf; } /* See if we can point the call at a particular specialization. */ if (target_sf->body.instrumentation_level == tc->instance->instrumentation_level) { MVMint32 spesh_cand = try_find_spesh_candidate(tc, target_sf, arg_info, stable_type_tuple); if (spesh_cand >= 0) { /* Yes. Will we be able to inline? */ char *no_inline_reason = NULL; MVMSpeshGraph *inline_graph = MVM_spesh_inline_try_get_graph(tc, g, target_sf, target_sf->body.spesh->body.spesh_candidates[spesh_cand], ins, &no_inline_reason); #if MVM_LOG_INLINES { char *c_name_i = MVM_string_utf8_encode_C_string(tc, target_sf->body.name); char *c_cuid_i = MVM_string_utf8_encode_C_string(tc, target_sf->body.cuuid); char *c_name_t = MVM_string_utf8_encode_C_string(tc, g->sf->body.name); char *c_cuid_t = MVM_string_utf8_encode_C_string(tc, g->sf->body.cuuid); if (inline_graph) { fprintf(stderr, "Can inline %s (%s) into %s (%s)\n", c_name_i, c_cuid_i, c_name_t, c_cuid_t); } else { fprintf(stderr, "Can NOT inline %s (%s) into %s (%s): %s\n", c_name_i, c_cuid_i, c_name_t, c_cuid_t, no_inline_reason); } MVM_free(c_name_i); MVM_free(c_cuid_i); MVM_free(c_name_t); MVM_free(c_cuid_t); } #endif if (inline_graph) { /* Yes, have inline graph, so go ahead and do it. Make sure we * keep the code ref reg alive by giving it a usage count as * it will be referenced from the deopt table. */ MVMSpeshOperand code_ref_reg = ins->info->opcode == MVM_OP_invoke_v ? ins->operands[0] : ins->operands[1]; MVM_spesh_facts_discover(tc, inline_graph, p); MVM_spesh_get_facts(tc, g, code_ref_reg)->usages++; MVM_spesh_inline(tc, g, arg_info, bb, ins, inline_graph, target_sf, code_ref_reg); } else { /* Can't inline, so just identify candidate. */ MVMSpeshOperand *new_operands = MVM_spesh_alloc(tc, g, 3 * sizeof(MVMSpeshOperand)); if (ins->info->opcode == MVM_OP_invoke_v) { new_operands[0] = ins->operands[0]; new_operands[1].lit_i16 = spesh_cand; ins->operands = new_operands; ins->info = MVM_op_get_op(MVM_OP_sp_fastinvoke_v); } else { new_operands[0] = ins->operands[0]; new_operands[1] = ins->operands[1]; new_operands[2].lit_i16 = spesh_cand; ins->operands = new_operands; switch (ins->info->opcode) { case MVM_OP_invoke_i: ins->info = MVM_op_get_op(MVM_OP_sp_fastinvoke_i); break; case MVM_OP_invoke_n: ins->info = MVM_op_get_op(MVM_OP_sp_fastinvoke_n); break; case MVM_OP_invoke_s: ins->info = MVM_op_get_op(MVM_OP_sp_fastinvoke_s); break; case MVM_OP_invoke_o: ins->info = MVM_op_get_op(MVM_OP_sp_fastinvoke_o); break; default: MVM_oops(tc, "Spesh: unhandled invoke instruction"); } } } } } /* If we have a speculated target static frame, then it's now safe to * release the code temporary (no need to keep it). */ if (have_code_temp) MVM_spesh_manipulate_release_temp_reg(tc, g, code_temp); } static void optimize_coverage_log(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { char *cache = (char *)ins->operands[3].lit_i64; MVMint32 cache_idx = ins->operands[2].lit_i32; if (cache[cache_idx] != 0) { MVM_spesh_manipulate_delete_ins(tc, g, bb, ins); } } /* Optimizes an extension op. */ static void optimize_extop(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMExtOpRecord *extops = g->sf->body.cu->body.extops; MVMuint16 num_extops = g->sf->body.cu->body.num_extops; MVMuint16 i; for (i = 0; i < num_extops; i++) { if (extops[i].info == ins->info) { /* Found op; call its spesh function, if any. */ if (extops[i].spesh) extops[i].spesh(tc, g, bb, ins); return; } } } static void optimize_uniprop_ops(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMSpeshFacts *arg1_facts = MVM_spesh_get_facts(tc, g, ins->operands[1]); MVMSpeshFacts *result_facts = MVM_spesh_get_facts(tc, g, ins->operands[0]); if (arg1_facts->flags & MVM_SPESH_FACT_KNOWN_VALUE) { if (ins->info->opcode == MVM_OP_unipropcode) { result_facts->flags |= MVM_SPESH_FACT_KNOWN_VALUE; result_facts->value.i = (MVMint64)MVM_unicode_name_to_property_code(tc, arg1_facts->value.s); ins->info = MVM_op_get_op(MVM_OP_const_i64); ins->operands[1].lit_i64 = result_facts->value.i; arg1_facts->usages--; } else if (ins->info->opcode == MVM_OP_unipvalcode) { MVMSpeshFacts *arg2_facts = MVM_spesh_get_facts(tc, g, ins->operands[2]); if (arg2_facts->flags & MVM_SPESH_FACT_KNOWN_VALUE) { result_facts->flags |= MVM_SPESH_FACT_KNOWN_VALUE; result_facts->value.i = (MVMint64)MVM_unicode_name_to_property_value_code(tc, arg1_facts->value.i, arg2_facts->value.s); ins->info = MVM_op_get_op(MVM_OP_const_i64); ins->operands[1].lit_i64 = result_facts->value.i; arg1_facts->usages--; arg2_facts->usages--; } } } } /* If something is only kept alive because we log its allocation, kick out * the allocation logging and let the op that creates it die. */ static void optimize_prof_allocated(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { MVMSpeshFacts *logee_facts = MVM_spesh_get_facts(tc, g, ins->operands[0]); if (logee_facts->usages == 1) { MVM_spesh_manipulate_delete_ins(tc, g, bb, ins); logee_facts->usages = 0; /* This check should always succeed, but just in case ... */ if (logee_facts->writer) MVM_spesh_manipulate_delete_ins(tc, g, bb, logee_facts->writer); } } /* Tries to optimize a throwcat instruction. Note that within a given frame * (we don't consider inlines here) the throwcat instructions all have the * same semantics. */ static void optimize_throwcat(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { /* First, see if we have any goto handlers for this category. */ MVMint32 *handlers_found = MVM_malloc(g->num_handlers * sizeof(MVMint32)); MVMint32 num_found = 0; MVMuint32 category = (MVMuint32)ins->operands[1].lit_i64; MVMint32 i; for (i = 0; i < g->num_handlers; i++) if (g->handlers[i].action == MVM_EX_ACTION_GOTO) if (g->handlers[i].category_mask & category) handlers_found[num_found++] = i; /* If we found any appropriate handlers, we'll now do a scan through the * graph to see if we're in the scope of any of them. Note we can't keep * track of this in optimize_bb as it walks the dominance children, but * we need a linear view. */ if (num_found) { MVMint32 *in_handlers = MVM_calloc(g->num_handlers, sizeof(MVMint32)); MVMSpeshBB **goto_bbs = MVM_calloc(g->num_handlers, sizeof(MVMSpeshBB *)); MVMSpeshBB *search_bb = g->entry; MVMint32 picked = -1; while (search_bb) { MVMSpeshIns *search_ins = search_bb->first_ins; while (search_ins) { /* Track handlers. */ MVMSpeshAnn *ann = search_ins->annotations; while (ann) { switch (ann->type) { case MVM_SPESH_ANN_FH_START: in_handlers[ann->data.frame_handler_index] = 1; break; case MVM_SPESH_ANN_FH_END: in_handlers[ann->data.frame_handler_index] = 0; break; case MVM_SPESH_ANN_FH_GOTO: if (ann->data.frame_handler_index < g->num_handlers) { goto_bbs[ann->data.frame_handler_index] = search_bb; if (picked >= 0 && ann->data.frame_handler_index == picked) goto search_over; } break; } ann = ann->next; } /* Is this instruction the one we're trying to optimize? */ if (search_ins == ins) { /* See if we're in any acceptable handler (rely on the * table being pre-sorted by nesting depth here, just like * normal exception handler search does). */ for (i = 0; i < num_found; i++) { if (in_handlers[handlers_found[i]]) { /* Got it! If we already found its goto target, we * can finish the search. */ picked = handlers_found[i]; if (goto_bbs[picked]) goto search_over; break; } } } search_ins = search_ins->next; } search_bb = search_bb->linear_next; } search_over: /* If we picked a handler and know where it should goto, we can do the * rewrite into a goto. */ if (picked >= 0 && goto_bbs[picked]) { ins->info = MVM_op_get_op(MVM_OP_goto); ins->operands[0].ins_bb = goto_bbs[picked]; bb->succ[0] = goto_bbs[picked]; } MVM_free(in_handlers); MVM_free(goto_bbs); } MVM_free(handlers_found); } /* Updates rebless with rebless_sp, which will deopt from the current code. */ static void tweak_rebless(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins) { MVMuint32 deopt_target = find_deopt_target(tc, g, ins); MVMSpeshOperand *new_operands = MVM_spesh_alloc(tc, g, 4 * sizeof(MVMSpeshOperand)); new_operands[0] = ins->operands[0]; new_operands[1] = ins->operands[1]; new_operands[2] = ins->operands[2]; new_operands[3].lit_ui32 = deopt_target; ins->info = MVM_op_get_op(MVM_OP_sp_rebless); ins->operands = new_operands; } /* Replaces atomic ops with a version that needs no checking of the target's * container spec and concreteness, when we have the facts to hand. */ static void optimize_container_atomic(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins, MVMuint16 target_reg) { MVMSpeshFacts *facts = MVM_spesh_get_facts(tc, g, ins->operands[target_reg]); if ((facts->flags & MVM_SPESH_FACT_CONCRETE) && (facts->flags & MVM_SPESH_FACT_KNOWN_TYPE)) { MVMContainerSpec const *cs = facts->type->st->container_spec; if (!cs) return; switch (ins->info->opcode) { case MVM_OP_cas_o: if (!cs->cas) return; ins->info = MVM_op_get_op(MVM_OP_sp_cas_o); break; case MVM_OP_atomicstore_o: if (!cs->atomic_store) return; ins->info = MVM_op_get_op(MVM_OP_sp_atomicstore_o); break; case MVM_OP_atomicload_o: if (!cs->cas) return; ins->info = MVM_op_get_op(MVM_OP_sp_atomicload_o); break; } MVM_spesh_use_facts(tc, g, facts); } } static void eliminate_phi_dead_reads(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins) { MVMuint32 operand = 1; MVMuint32 insert_pos = 1; MVMuint32 num_operands = ins->info->num_operands; while (operand < ins->info->num_operands) { if (get_facts_direct(tc, g, ins->operands[operand])->dead_writer) { num_operands--; } else { ins->operands[insert_pos] = ins->operands[operand]; insert_pos++; } operand++; } if (num_operands != ins->info->num_operands) ins->info = get_phi(tc, g, num_operands); } static void analyze_phi(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns *ins) { MVMuint32 operand; MVMint32 common_flags; MVMObject *common_type; MVMObject *common_decont_type; MVMuint32 needs_merged_with_log_guard = 0; MVMSpeshFacts *target_facts = get_facts_direct(tc, g, ins->operands[0]); eliminate_phi_dead_reads(tc, g, ins); common_flags = get_facts_direct(tc, g, ins->operands[1])->flags; common_type = get_facts_direct(tc, g, ins->operands[1])->type; common_decont_type = get_facts_direct(tc, g, ins->operands[1])->decont_type; needs_merged_with_log_guard = common_flags & MVM_SPESH_FACT_FROM_LOG_GUARD; for(operand = 2; operand < ins->info->num_operands; operand++) { common_flags = common_flags & get_facts_direct(tc, g, ins->operands[operand])->flags; common_type = common_type == get_facts_direct(tc, g, ins->operands[operand])->type && common_type ? common_type : NULL; common_decont_type = common_decont_type == get_facts_direct(tc, g, ins->operands[operand])->decont_type && common_decont_type ? common_decont_type : NULL; /* We have to be a bit more careful if one or more of the facts we're * merging came from a log guard, as that means we'll have to propagate * the information what guards have been relied upon back "outwards" * through the PHI node we've merged stuff with. */ if (get_facts_direct(tc, g, ins->operands[operand])->flags & MVM_SPESH_FACT_FROM_LOG_GUARD) needs_merged_with_log_guard = 1; } if (common_flags) { /*fprintf(stderr, "at a PHI node of %d operands: ", ins->info->num_operands);*/ if (common_flags & MVM_SPESH_FACT_KNOWN_TYPE) { /*fprintf(stderr, "type ");*/ if (common_type) { /*fprintf(stderr, "(same type) ");*/ target_facts->flags |= MVM_SPESH_FACT_KNOWN_TYPE; target_facts->type = common_type; } /*else fprintf(stderr, "(diverging type) ");*/ } /*if (common_flags & MVM_SPESH_FACT_KNOWN_VALUE) fprintf(stderr, "value ");*/ if (common_flags & MVM_SPESH_FACT_DECONTED) { /*fprintf(stderr, "deconted ");*/ target_facts->flags |= MVM_SPESH_FACT_DECONTED; } if (common_flags & MVM_SPESH_FACT_CONCRETE) { /*fprintf(stderr, "concrete ");*/ target_facts->flags |= MVM_SPESH_FACT_CONCRETE; } if (common_flags & MVM_SPESH_FACT_TYPEOBJ) { /*fprintf(stderr, "type_object ");*/ } if (common_flags & MVM_SPESH_FACT_KNOWN_DECONT_TYPE) { /*fprintf(stderr, "decont_type ");*/ if (common_decont_type) { /*fprintf(stderr, "(same type) ");*/ target_facts->flags |= MVM_SPESH_FACT_KNOWN_DECONT_TYPE; target_facts->decont_type = common_decont_type; } /*else fprintf(stderr, "(diverging type) ");*/ } if (common_flags & MVM_SPESH_FACT_DECONT_CONCRETE) { /*fprintf(stderr, "decont_concrete ");*/ target_facts->flags |= MVM_SPESH_FACT_DECONT_CONCRETE; } if (common_flags & MVM_SPESH_FACT_DECONT_TYPEOBJ) { /*fprintf(stderr, "decont_typeobj ");*/ target_facts->flags |= MVM_SPESH_FACT_DECONT_TYPEOBJ; } if (common_flags & MVM_SPESH_FACT_RW_CONT) { /*fprintf(stderr, "rw_cont ");*/ target_facts->flags |= MVM_SPESH_FACT_RW_CONT; } /*if (common_flags & MVM_SPESH_FACT_FROM_LOG_GUARD) fprintf(stderr, "from_log_guard ");*/ /*if (common_flags & MVM_SPESH_FACT_HASH_ITER) fprintf(stderr, "hash_iter ");*/ /*if (common_flags & MVM_SPESH_FACT_ARRAY_ITER) fprintf(stderr, "array_iter ");*/ /*if (common_flags & MVM_SPESH_FACT_KNOWN_BOX_SRC) fprintf(stderr, "box_source ");*/ /*fprintf(stderr, "\n");*/ if (needs_merged_with_log_guard) { target_facts->flags |= MVM_SPESH_FACT_MERGED_WITH_LOG_GUARD; } } else { /*fprintf(stderr, "a PHI node of %d operands had no intersecting flags\n", ins->info->num_operands);*/ } } static void optimize_bb_switch(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshPlanned *p) { MVMSpeshCallInfo arg_info; /* Look for instructions that are interesting to optimize. */ MVMSpeshIns *ins = bb->first_ins; while (ins) { switch (ins->info->opcode) { case MVM_SSA_PHI: analyze_phi(tc, g, ins); break; case MVM_OP_set: copy_facts(tc, g, ins->operands[0], ins->operands[1]); break; case MVM_OP_istrue: case MVM_OP_isfalse: optimize_istrue_isfalse(tc, g, bb, ins); break; case MVM_OP_if_i: case MVM_OP_unless_i: case MVM_OP_if_n: case MVM_OP_unless_n: case MVM_OP_if_o: case MVM_OP_unless_o: optimize_iffy(tc, g, ins, bb); if (ins->info->opcode == MVM_OP_if_o || ins->info->opcode == MVM_OP_unless_o) { decompose_object_conditional(tc, g, ins, bb); } break; case MVM_OP_not_i: optimize_not_i(tc, g, ins, bb); break; case MVM_OP_prepargs: arg_info.cs = g->sf->body.cu->body.callsites[ins->operands[0].callsite_idx]; arg_info.prepargs_ins = ins; arg_info.prepargs_bb = bb; break; case MVM_OP_arg_i: case MVM_OP_arg_n: case MVM_OP_arg_s: case MVM_OP_arg_o: { MVMint16 idx = ins->operands[0].lit_i16; if (idx < MAX_ARGS_FOR_OPT) { arg_info.arg_is_const[idx] = 0; arg_info.arg_facts[idx] = MVM_spesh_get_and_use_facts(tc, g, ins->operands[1]); arg_info.arg_ins[idx] = ins; } break; } case MVM_OP_argconst_i: case MVM_OP_argconst_n: case MVM_OP_argconst_s: { MVMint16 idx = ins->operands[0].lit_i16; if (idx < MAX_ARGS_FOR_OPT) { arg_info.arg_is_const[idx] = 1; arg_info.arg_ins[idx] = ins; } break; } case MVM_OP_coerce_in: optimize_coerce(tc, g, bb, ins); break; case MVM_OP_smrt_numify: case MVM_OP_smrt_strify: optimize_smart_coerce(tc, g, bb, ins); break; case MVM_OP_invoke_v: optimize_call(tc, g, bb, ins, p, 0, &arg_info); break; case MVM_OP_invoke_i: case MVM_OP_invoke_n: case MVM_OP_invoke_s: case MVM_OP_invoke_o: optimize_call(tc, g, bb, ins, p, 1, &arg_info); break; case MVM_OP_islist: case MVM_OP_ishash: case MVM_OP_isint: case MVM_OP_isnum: case MVM_OP_isstr: optimize_is_reprid(tc, g, ins); break; case MVM_OP_findmeth_s: optimize_findmeth_s_perhaps_constant(tc, g, ins); if (ins->info->opcode == MVM_OP_findmeth_s) break; case MVM_OP_findmeth: optimize_method_lookup(tc, g, ins); break; case MVM_OP_tryfindmeth_s: optimize_findmeth_s_perhaps_constant(tc, g, ins); if (ins->info->opcode == MVM_OP_tryfindmeth_s) break; case MVM_OP_tryfindmeth: optimize_method_lookup(tc, g, ins); break; case MVM_OP_can: case MVM_OP_can_s: optimize_can_op(tc, g, bb, ins); break; case MVM_OP_gethow: optimize_gethow(tc, g, ins); break; case MVM_OP_isconcrete: optimize_isconcrete(tc, g, ins); break; case MVM_OP_istype: optimize_istype(tc, g, ins); break; case MVM_OP_objprimspec: optimize_objprimspec(tc, g, ins); break; case MVM_OP_unipropcode: case MVM_OP_unipvalcode: optimize_uniprop_ops(tc, g, bb, ins); break; case MVM_OP_unshift_i: case MVM_OP_unshift_n: case MVM_OP_unshift_s: case MVM_OP_unshift_o: case MVM_OP_bindkey_i: case MVM_OP_bindkey_n: case MVM_OP_bindkey_s: case MVM_OP_bindkey_o: case MVM_OP_bindpos_i: case MVM_OP_bindpos_n: case MVM_OP_bindpos_s: case MVM_OP_bindpos_o: case MVM_OP_pop_i: case MVM_OP_pop_n: case MVM_OP_pop_s: case MVM_OP_pop_o: case MVM_OP_deletekey: case MVM_OP_setelemspos: case MVM_OP_splice: case MVM_OP_bindattr_i: case MVM_OP_bindattr_n: case MVM_OP_bindattr_s: case MVM_OP_bindattr_o: case MVM_OP_bindattrs_i: case MVM_OP_bindattrs_n: case MVM_OP_bindattrs_s: case MVM_OP_bindattrs_o: case MVM_OP_assign_i: case MVM_OP_assign_n: optimize_repr_op(tc, g, bb, ins, 0); break; case MVM_OP_atpos_i: case MVM_OP_atpos_n: case MVM_OP_atpos_s: case MVM_OP_atpos_o: case MVM_OP_atkey_i: case MVM_OP_atkey_n: case MVM_OP_atkey_s: case MVM_OP_atkey_o: case MVM_OP_elems: case MVM_OP_shift_i: case MVM_OP_shift_n: case MVM_OP_shift_s: case MVM_OP_shift_o: case MVM_OP_push_i: case MVM_OP_push_n: case MVM_OP_push_s: case MVM_OP_push_o: case MVM_OP_existskey: case MVM_OP_existspos: case MVM_OP_getattr_i: case MVM_OP_getattr_n: case MVM_OP_getattr_s: case MVM_OP_getattr_o: case MVM_OP_getattrs_i: case MVM_OP_getattrs_n: case MVM_OP_getattrs_s: case MVM_OP_getattrs_o: case MVM_OP_decont_i: case MVM_OP_decont_n: case MVM_OP_decont_s: case MVM_OP_decont_u: case MVM_OP_create: optimize_repr_op(tc, g, bb, ins, 1); break; case MVM_OP_box_i: case MVM_OP_box_n: case MVM_OP_box_s: optimize_repr_op(tc, g, bb, ins, 2); break; case MVM_OP_ne_s: case MVM_OP_eq_s: optimize_string_equality(tc, g, bb, ins); break; case MVM_OP_newexception: case MVM_OP_bindexmessage: case MVM_OP_bindexpayload: case MVM_OP_getexmessage: case MVM_OP_getexpayload: optimize_exception_ops(tc, g, bb, ins); break; case MVM_OP_hllize: optimize_hllize(tc, g, ins); break; case MVM_OP_decont: optimize_decont(tc, g, bb, ins); break; case MVM_OP_assertparamcheck: optimize_assertparamcheck(tc, g, bb, ins); break; case MVM_OP_getlex: optimize_getlex(tc, g, ins); break; case MVM_OP_getlex_no: /* Use non-logging variant. */ ins->info = MVM_op_get_op(MVM_OP_sp_getlex_no); break; case MVM_OP_getlexstatic_o: optimize_getlex_known(tc, g, bb, ins); break; case MVM_OP_getlexperinvtype_o: optimize_getlex_per_invocant(tc, g, bb, ins, p); break; case MVM_OP_iscont: case MVM_OP_isrwcont: case MVM_OP_iscont_i: case MVM_OP_iscont_n: case MVM_OP_iscont_s: optimize_container_check(tc, g, bb, ins); break; case MVM_OP_osrpoint: /* We don't need to poll for OSR in hot loops. (This also moves * the OSR annotation onto the next instruction.) */ MVM_spesh_manipulate_delete_ins(tc, g, bb, ins); break; case MVM_OP_rebless: tweak_rebless(tc, g, ins); break; case MVM_OP_cas_o: case MVM_OP_atomicload_o: optimize_container_atomic(tc, g, ins, 1); break; case MVM_OP_atomicstore_o: optimize_container_atomic(tc, g, ins, 0); break; case MVM_OP_prof_enter: /* Profiling entered from spesh should indicate so. */ ins->info = MVM_op_get_op(MVM_OP_prof_enterspesh); break; case MVM_OP_coverage_log: /* A coverage_log op that has already fired can be thrown out. */ optimize_coverage_log(tc, g, bb, ins); break; default: if (ins->info->opcode == (MVMuint16)-1) optimize_extop(tc, g, bb, ins); } ins = ins->next; } } /* Visits the blocks in dominator tree order, recursively. */ static void optimize_bb(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshPlanned *p) { MVMint64 i = 0; /* Because optimize_bb() can be deeply recursive, separate as much code * as possible into a separate function optimize_bb_switch(), so we don't * trash the stack. (needed on musl) */ optimize_bb_switch(tc, g, bb, p); /* Optimize the case where we only have one child. This avoids having * to do a recursive call to optimize_bb() */ while (bb->num_children == 1) { bb = bb->children[0]; /* Keep following the nodes and running optimize_bb_switch() on them * until we hit one with more than 1 child. */ optimize_bb_switch(tc, g, bb, p); } /* Visit children. */ for (; i < bb->num_children; i++) optimize_bb(tc, g, bb->children[i], p); } /* Eliminates any unused instructions. */ static void eliminate_dead_ins(MVMThreadContext *tc, MVMSpeshGraph *g) { /* Keep eliminating to a fixed point. */ MVMint8 death = 1; while (death) { MVMSpeshBB *bb = g->entry; death = 0; while (bb) { if (!bb->inlined) { MVMSpeshIns *ins = bb->last_ins; while (ins) { MVMSpeshIns *prev = ins->prev; if (ins->info->opcode == MVM_SSA_PHI) { MVMSpeshFacts *facts = get_facts_direct(tc, g, ins->operands[0]); if (facts->usages == 0) { /* Remove this phi. */ MVM_spesh_manipulate_delete_ins(tc, g, bb, ins); death = 1; } } else if (ins->info->pure) { /* Sanity check to make sure it's a write reg as first operand. */ if ((ins->info->operands[0] & MVM_operand_rw_mask) == MVM_operand_write_reg) { MVMSpeshFacts *facts = get_facts_direct(tc, g, ins->operands[0]); if (facts->usages == 0) { /* Remove this instruction. */ MVM_spesh_manipulate_delete_ins(tc, g, bb, ins); death = 1; } } } ins = prev; } } bb = bb->linear_next; } } } /* Optimization turns many things into simple set instructions, which we can * often further eliminate; others may become unrequired due to eliminated * branches, and some may be from sub-optimizal original code. */ static MVMint32 within_inline(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshOperand target) { if (bb->inlined) { MVMSpeshBB *check_bb = bb; while (check_bb) { MVMSpeshIns *last_ins = check_bb->last_ins; MVMSpeshAnn *ann = last_ins->annotations; MVMint32 max_inline = -1; while (ann) { if (ann->type == MVM_SPESH_ANN_INLINE_END) if (ann->data.inline_idx > max_inline) max_inline = ann->data.inline_idx; ann = ann->next; } if (max_inline >= 0) { /* We've found the inline that we're inside of. Check if the * register is within its range of registers. */ MVMuint16 locals_start = g->inlines[max_inline].locals_start; MVMuint16 num_locals = g->inlines[max_inline].num_locals; return target.reg.orig >= locals_start && target.reg.orig < locals_start + num_locals; } check_bb = check_bb->linear_next; } } return 1; /* We're not in an inline at all, so automatically yes. */ } static void try_eliminate_set(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb, MVMSpeshIns *ins) { /* Sometimes, a set takes place between two versions of the same register. * This can go. * XXX Should rewrite the graph properly. */ if (ins->operands[0].reg.orig == ins->operands[1].reg.orig) { MVM_spesh_manipulate_delete_ins(tc, g, bb, ins); } /* Other optimizations depend on having a previous op. */ else if (!ins->prev) { return; } /* If we have: * set rT(j), rO(i) * set rO(i + 1), rT(j) * Then the second instruction can go away. * XXX Should rewrite the graph properly. */ else if (ins->prev->info->opcode == MVM_OP_set) { if (ins->operands[0].reg.orig == ins->prev->operands[1].reg.orig && ins->operands[0].reg.i == ins->prev->operands[1].reg.i + 1 && ins->operands[1].reg.orig == ins->prev->operands[0].reg.orig && ins->operands[1].reg.i == ins->prev->operands[0].reg.i) MVM_spesh_manipulate_delete_ins(tc, g, bb, ins); } /* If a write operation is immediately followed by a set, we can look at * the usages of the intermediate register and make sure it's only ever * read by the set, and not, for example, required by a deopt barrier to * have a copy of the value. In that case, we don't need the temporary * and can assign the result of the instruction directly into the * target register. We must also check, if we're in an inline, that the * final target register is within the inline, since deopt depends on the * target register of an invoke being within a frame. */ else if ((ins->prev->info->operands[0] & MVM_operand_rw_mask) == MVM_operand_write_reg && ins->prev->info->opcode != MVM_SSA_PHI && ins->prev->operands[0].reg.orig == ins->operands[1].reg.orig && ins->prev->operands[0].reg.i == ins->operands[1].reg.i) { MVMSpeshFacts *elim_facts = get_facts_direct(tc, g, ins->operands[1]); if (elim_facts->usages == 1 && within_inline(tc, g, bb, ins->operands[0])) { ins->prev->operands[0].reg = ins->operands[0].reg; get_facts_direct(tc, g, ins->prev->operands[0])->writer = ins->prev; MVM_spesh_manipulate_delete_ins(tc, g, bb, ins); } } } /* Drives the second, post-inline, optimization pass. */ static void second_pass(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshBB *bb) { MVMint32 i; MVMSpeshIns *ins = bb->first_ins; while (ins) { MVMSpeshIns *next = ins->next; switch (ins->info->opcode) { case MVM_OP_set: try_eliminate_set(tc, g, bb, ins); break; case MVM_OP_sp_getspeshslot: /* Sometimes we emit two getspeshslots in a row that write into the * exact same register. That's clearly wasteful and we can save a * tiny shred of code size here. */ if (ins->prev && ins->prev->info->opcode == ins->info->opcode && ins->operands[0].reg.orig == ins->prev->operands[0].reg.orig) MVM_spesh_manipulate_delete_ins(tc, g, bb, ins->prev); break; case MVM_OP_prof_allocated: optimize_prof_allocated(tc, g, bb, ins); break; case MVM_OP_throwcatdyn: case MVM_OP_throwcatlex: case MVM_OP_throwcatlexotic: optimize_throwcat(tc, g, bb, ins); break; } ins = next; } /* Visit children. */ for (i = 0; i < bb->num_children; i++) second_pass(tc, g, bb->children[i]); } /* Goes through the various log-based guard instructions and removes any that * are not being used. */ static void eliminate_unused_log_guards(MVMThreadContext *tc, MVMSpeshGraph *g) { MVMint32 i; for (i = 0; i < g->num_log_guards; i++) if (!g->log_guards[i].used) MVM_spesh_manipulate_delete_ins(tc, g, g->log_guards[i].bb, g->log_guards[i].ins); } /* Sometimes - almost always due to other optmimizations having done their * work - we end up with an unconditional goto at the end of a basic block * that points right to the very next basic block. Delete these. */ static void eliminate_pointless_gotos(MVMThreadContext *tc, MVMSpeshGraph *g) { MVMSpeshBB *cur_bb = g->entry; while (cur_bb) { if (!cur_bb->jumplist) { MVMSpeshIns *last_ins = cur_bb->last_ins; if ( last_ins && last_ins->info->opcode == MVM_OP_goto && last_ins->operands[0].ins_bb == cur_bb->linear_next ) { MVM_spesh_manipulate_delete_ins(tc, g, cur_bb, last_ins); } } cur_bb = cur_bb->linear_next; } } static void merge_bbs(MVMThreadContext *tc, MVMSpeshGraph *g) { MVMSpeshBB *bb = g->entry; MVMint32 orig_bbs = g->num_bbs; if (!bb || !bb->linear_next) return; /* looks like there's only a single bb anyway */ bb = bb->linear_next; while (bb->linear_next) { if (bb->num_succ == 1 && bb->succ[0] == bb->linear_next && bb->linear_next->num_pred == 1 && !bb->inlined && !bb->linear_next->inlined) { if (bb->linear_next->first_ins) { bb->linear_next->first_ins->prev = bb->last_ins; if (bb->last_ins) { bb->last_ins->next = bb->linear_next->first_ins; bb->last_ins->next->prev = bb->last_ins; bb->last_ins = bb->linear_next->last_ins; } else { bb->first_ins = bb->linear_next->first_ins; bb->last_ins = bb->linear_next->last_ins; } bb->linear_next->first_ins = bb->linear_next->last_ins = NULL; } if (bb->linear_next->num_succ) { MVMSpeshBB **succ = MVM_spesh_alloc(tc, g, (bb->num_succ - 1 + bb->linear_next->num_succ) * sizeof(MVMSpeshBB *)); int i, j = 0; for (i = 0; i < bb->num_succ; i++) if (bb->succ[i] != bb->linear_next) succ[j++] = bb->succ[i]; for (i = 0; i < bb->linear_next->num_succ; i++) succ[j++] = bb->linear_next->succ[i]; bb->succ = succ; } bb->num_succ--; bb->num_succ += bb->linear_next->num_succ; bb->linear_next = bb->linear_next->linear_next; g->num_bbs--; } else { bb = bb->linear_next; } } /* Re-number BBs so we get sequential ordering again. */ if (g->num_bbs != orig_bbs) { MVMint32 new_idx = 0; MVMSpeshBB *cur_bb = g->entry; while (cur_bb) { cur_bb->idx = new_idx; new_idx++; cur_bb = cur_bb->linear_next; } } } /* Drives the overall optimization work taking place on a spesh graph. */ void MVM_spesh_optimize(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshPlanned *p) { /* Before starting, we eliminate dead basic blocks that were tossed by * arg spesh, to simplify the graph. */ MVM_spesh_eliminate_dead_bbs(tc, g, 1); /* Perform initial optimization pass, which performs a range of opts * including, most notably, inlining. */ optimize_bb(tc, g, g->entry, p); /* Clear up the graph after this initial pass. */ MVM_spesh_eliminate_dead_bbs(tc, g, 1); eliminate_unused_log_guards(tc, g); eliminate_pointless_gotos(tc, g); eliminate_dead_ins(tc, g); merge_bbs(tc, g); /* Make a second pass through the graph doing things that are better * done after inlinings have taken place. The dominance tree is first * recomputed, to account for any inlinings. */ MVM_spesh_graph_recompute_dominance(tc, g); second_pass(tc, g, g->entry); } MoarVM-2018.03/src/spesh/optimize.h0000644000175000017510000000265713237701240017136 0ustar samanthasamantha/* Maximum args a call can take for us to consider it for optimization. */ #define MAX_ARGS_FOR_OPT 8 /* Percentage of type tuples that we expect to match at a callsite in order to * consider those what we should guard agaisnt (causing a deopt on mismatch). * So if this is 99, then we expect 1% of calls may deopt. */ #define MVM_SPESH_CALLSITE_STABLE_PERCENT 99 /* Information we've gathered about the current call we're optimizing, and the * arguments it will take. */ struct MVMSpeshCallInfo { MVMCallsite *cs; MVMint8 arg_is_const[MAX_ARGS_FOR_OPT]; MVMSpeshFacts *arg_facts[MAX_ARGS_FOR_OPT]; MVMSpeshIns *prepargs_ins; MVMSpeshBB *prepargs_bb; MVMSpeshIns *arg_ins[MAX_ARGS_FOR_OPT]; }; void MVM_spesh_optimize(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshPlanned *p); MVM_PUBLIC MVMint16 MVM_spesh_add_spesh_slot(MVMThreadContext *tc, MVMSpeshGraph *g, MVMCollectable *c); MVMint16 MVM_spesh_add_spesh_slot_try_reuse(MVMThreadContext *tc, MVMSpeshGraph *g, MVMCollectable *c); MVM_PUBLIC MVMSpeshFacts * MVM_spesh_get_and_use_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshOperand o); MVM_PUBLIC MVMSpeshFacts * MVM_spesh_get_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshOperand o); MVM_PUBLIC void MVM_spesh_use_facts(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshFacts *f); MVM_PUBLIC MVMString * MVM_spesh_get_string(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshOperand o); MoarVM-2018.03/src/spesh/osr.c0000644000175000017510000001455113242626641016077 0ustar samanthasamantha#include "moar.h" /* Writes to stderr about each OSR that we perform. */ #define MVM_LOG_OSR 0 /* Locates deopt index matching OSR point. */ static MVMint32 get_osr_deopt_index(MVMThreadContext *tc, MVMSpeshCandidate *cand) { /* Calculate offset. */ MVMint32 offset = (*(tc->interp_cur_op) - *(tc->interp_bytecode_start)); /* Locate it in the deopt table. */ MVMint32 i; for (i = 0; i < cand->num_deopts; i++) if (cand->deopts[2 * i] == offset) return i; /* If we couldn't locate it, something is really very wrong. */ MVM_oops(tc, "Spesh: get_osr_deopt_index failed"); } /* Does the jump into the optimized code. */ void perform_osr(MVMThreadContext *tc, MVMSpeshCandidate *specialized) { MVMJitCode *jit_code; MVMint32 num_locals; /* Work out the OSR deopt index, to locate the entry point. */ MVMint32 osr_index = get_osr_deopt_index(tc, specialized); #if MVM_LOG_OSR fprintf(stderr, "Performing OSR of frame '%s' (cuid: %s) at index %d\n", MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.name), MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.cuuid), osr_index); #endif jit_code = specialized->jitcode; num_locals = jit_code && jit_code->local_types ? jit_code->num_locals : specialized->num_locals; /* Resize work area if needed. */ if (specialized->work_size > tc->cur_frame->allocd_work) { /* Resize work area. */ MVMRegister *new_work = MVM_fixed_size_alloc_zeroed(tc, tc->instance->fsa, specialized->work_size); MVMRegister *new_args = new_work + num_locals; memcpy(new_work, tc->cur_frame->work, tc->cur_frame->static_info->body.num_locals * sizeof(MVMRegister)); memcpy(new_args, tc->cur_frame->args, tc->cur_frame->static_info->body.cu->body.max_callsite_size * sizeof(MVMRegister)); MVM_fixed_size_free(tc, tc->instance->fsa, tc->cur_frame->allocd_work, tc->cur_frame->work); tc->cur_frame->work = new_work; tc->cur_frame->allocd_work = specialized->work_size; tc->cur_frame->args = new_args; #if MVM_LOG_OSR fprintf(stderr, "OSR resized work area of frame '%s' (cuid: %s)\n", MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.name), MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.cuuid)); #endif } else if (specialized->work_size > tc->cur_frame->static_info->body.work_size) { size_t keep_bytes = tc->cur_frame->static_info->body.num_locals * sizeof(MVMRegister); size_t to_null = specialized->work_size - keep_bytes; memset((char *)tc->cur_frame->work + keep_bytes, 0, to_null); } /* Resize environment if needed. */ if (specialized->num_lexicals > tc->cur_frame->static_info->body.num_lexicals) { MVMRegister *new_env = MVM_fixed_size_alloc_zeroed(tc, tc->instance->fsa, specialized->env_size); if (tc->cur_frame->allocd_env) { memcpy(new_env, tc->cur_frame->env, tc->cur_frame->static_info->body.num_lexicals * sizeof(MVMRegister)); MVM_fixed_size_free(tc, tc->instance->fsa, tc->cur_frame->allocd_env, tc->cur_frame->env); } tc->cur_frame->env = new_env; tc->cur_frame->allocd_env = specialized->env_size; #if MVM_LOG_OSR fprintf(stderr, "OSR resized environment of frame '%s' (cuid: %s)\n", MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.name), MVM_string_utf8_encode_C_string(tc, tc->cur_frame->static_info->body.cuuid)); #endif } else if (specialized->env_size > tc->cur_frame->static_info->body.env_size) { size_t keep_bytes = tc->cur_frame->static_info->body.num_lexicals * sizeof(MVMRegister); size_t to_null = specialized->env_size - keep_bytes; memset((char *)tc->cur_frame->env + keep_bytes, 0, to_null); } /* Set up frame to point to spesh candidate/slots. */ tc->cur_frame->effective_spesh_slots = specialized->spesh_slots; tc->cur_frame->spesh_cand = specialized; /* Move into the optimized (and maybe JIT-compiled) code. */ if (jit_code && jit_code->num_deopts) { MVMint32 i; *(tc->interp_bytecode_start) = jit_code->bytecode; *(tc->interp_cur_op) = jit_code->bytecode; for (i = 0; i < jit_code->num_deopts; i++) { if (jit_code->deopts[i].idx == osr_index) { tc->cur_frame->jit_entry_label = jit_code->labels[jit_code->deopts[i].label]; break; } } if (i == jit_code->num_deopts) MVM_oops(tc, "JIT: Could not find OSR label"); if (tc->instance->profiling) MVM_profiler_log_osr(tc, 1); } else { *(tc->interp_bytecode_start) = specialized->bytecode; *(tc->interp_cur_op) = specialized->bytecode + specialized->deopts[2 * osr_index + 1]; if (tc->instance->profiling) MVM_profiler_log_osr(tc, 0); } *(tc->interp_reg_base) = tc->cur_frame->work; } /* Polls for an optimization and, when one is produced, jumps into it. */ void MVM_spesh_osr_poll_for_result(MVMThreadContext *tc) { MVMStaticFrameSpesh *spesh = tc->cur_frame->static_info->body.spesh; MVMint32 num_cands = spesh->body.num_spesh_candidates; MVMint32 seq_nr = tc->cur_frame->sequence_nr; if (seq_nr != tc->osr_hunt_frame_nr || num_cands != tc->osr_hunt_num_spesh_candidates) { /* Provided OSR is enabled... */ if (tc->instance->spesh_osr_enabled) { /* Check if there's a candidate available and install it if so. */ MVMFrame *caller = tc->cur_frame->caller; MVMCallsite *cs = caller ? caller->cur_args_callsite : MVM_callsite_get_common(tc, MVM_CALLSITE_ID_NULL_ARGS); MVMint32 ag_result = MVM_spesh_arg_guard_run(tc, spesh->body.spesh_arg_guard, (cs && cs->is_interned ? cs : NULL), (caller ? caller->args : NULL), NULL); if (ag_result >= 0) perform_osr(tc, spesh->body.spesh_candidates[ag_result]); } /* Update state for avoiding checks in the common case. */ tc->osr_hunt_frame_nr = seq_nr; tc->osr_hunt_num_spesh_candidates = num_cands; } } MoarVM-2018.03/src/spesh/osr.h0000644000175000017510000000007213237701240016066 0ustar samanthasamanthavoid MVM_spesh_osr_poll_for_result(MVMThreadContext *tc); MoarVM-2018.03/src/spesh/plan.c0000644000175000017510000001763413242626641016233 0ustar samanthasamantha#include "moar.h" /* Adds a planned specialization, provided it doesn't already exist (this may * happen due to further data suggesting it being logged while it was being * produced). */ void add_planned(MVMThreadContext *tc, MVMSpeshPlan *plan, MVMSpeshPlannedKind kind, MVMStaticFrame *sf, MVMSpeshStatsByCallsite *cs_stats, MVMSpeshStatsType *type_tuple, MVMSpeshStatsByType **type_stats, MVMuint32 num_type_stats) { MVMSpeshPlanned *p; if (sf->body.bytecode_size > MVM_SPESH_MAX_BYTECODE_SIZE || MVM_spesh_arg_guard_exists(tc, sf->body.spesh->body.spesh_arg_guard, cs_stats->cs, type_tuple)) { /* Clean up allocated memory. * NB - the only caller is plan_for_cs, which means that we could do the * allocations in here, except that we need the type tuple for the * lookup already. So this is messy but it works. */ MVM_free(type_stats); MVM_free(type_tuple); return; } if (plan->num_planned == plan->alloc_planned) { plan->alloc_planned += 16; plan->planned = MVM_realloc(plan->planned, plan->alloc_planned * sizeof(MVMSpeshPlanned)); } p = &(plan->planned[plan->num_planned++]); p->kind = kind; p->sf = sf; p->cs_stats = cs_stats; p->type_tuple = type_tuple; p->type_stats = type_stats; p->num_type_stats = num_type_stats; if (num_type_stats) { MVMuint32 i; p->max_depth = type_stats[0]->max_depth; for (i = 1; i < num_type_stats; i++) if (type_stats[i]->max_depth > p->max_depth) p->max_depth = type_stats[i]->max_depth; } else { p->max_depth = cs_stats->max_depth; } } /* Makes a copy of an argument type tuple. */ MVMSpeshStatsType * copy_type_tuple(MVMThreadContext *tc, MVMCallsite *cs, MVMSpeshStatsType *to_copy) { size_t stats_size = cs->flag_count * sizeof(MVMSpeshStatsType); MVMSpeshStatsType *result = MVM_malloc(stats_size); memcpy(result, to_copy, stats_size); return result; } /* Considers the statistics of a given callsite + static frame pairing and * plans specializations to produce for it. */ void plan_for_cs(MVMThreadContext *tc, MVMSpeshPlan *plan, MVMStaticFrame *sf, MVMSpeshStatsByCallsite *by_cs) { /* See if any types tuples are hot enough. */ MVMuint32 i; MVMuint32 unaccounted_hits = by_cs->hits; MVMuint32 unaccounted_osr_hits = by_cs->osr_hits; for (i = 0; i < by_cs->num_by_type; i++) { MVMSpeshStatsByType *by_type = &(by_cs->by_type[i]); MVMuint32 hit_percent = by_cs->hits ? (100 * by_type->hits) / by_cs->hits : 0; MVMuint32 osr_hit_percent = by_cs->osr_hits ? (100 * by_type->osr_hits) / by_cs->osr_hits : 0; if (by_cs->cs && (hit_percent >= MVM_SPESH_PLAN_TT_OBS_PERCENT || osr_hit_percent >= MVM_SPESH_PLAN_TT_OBS_PERCENT_OSR)) { MVMSpeshStatsByType **evidence = MVM_malloc(sizeof(MVMSpeshStatsByType *)); evidence[0] = by_type; add_planned(tc, plan, MVM_SPESH_PLANNED_OBSERVED_TYPES, sf, by_cs, copy_type_tuple(tc, by_cs->cs, by_type->arg_types), evidence, 1); unaccounted_hits -= by_type->hits; unaccounted_osr_hits -= by_type->osr_hits; } else { /* TODO derived specialization planning */ } } /* If there are enough unaccounted for hits by type specializations, then * plan a certain specialization. */ if (unaccounted_hits && unaccounted_hits >= MVM_spesh_threshold(tc, sf) || unaccounted_osr_hits >= MVM_SPESH_PLAN_CS_MIN_OSR) add_planned(tc, plan, MVM_SPESH_PLANNED_CERTAIN, sf, by_cs, NULL, NULL, 0); } /* Considers the statistics of a given static frame and plans specializtions * to produce for it. */ void plan_for_sf(MVMThreadContext *tc, MVMSpeshPlan *plan, MVMStaticFrame *sf) { MVMSpeshStats *ss = sf->body.spesh->body.spesh_stats; MVMuint32 threshold = MVM_spesh_threshold(tc, sf); if (ss->hits >= threshold || ss->osr_hits >= MVM_SPESH_PLAN_SF_MIN_OSR) { /* The frame is hot enough; look through its callsites to see if any * of those are. */ MVMuint32 i; for (i = 0; i < ss->num_by_callsite; i++) { MVMSpeshStatsByCallsite *by_cs = &(ss->by_callsite[i]); if (by_cs->hits >= threshold || by_cs->osr_hits >= MVM_SPESH_PLAN_CS_MIN_OSR) plan_for_cs(tc, plan, sf, by_cs); } } } /* Sorts the plan in descending order of maximum call depth. */ void sort_plan(MVMThreadContext *tc, MVMSpeshPlanned *planned, MVMuint32 n) { if (n >= 2) { MVMSpeshPlanned pivot = planned[n / 2]; MVMuint32 i, j; for (i = 0, j = n - 1; ; i++, j--) { MVMSpeshPlanned temp; while (planned[i].max_depth > pivot.max_depth) i++; while (planned[j].max_depth < pivot.max_depth) j--; if (i >= j) break; temp = planned[i]; planned[i] = planned[j]; planned[j] = temp; } sort_plan(tc, planned, i); sort_plan(tc, planned + i, n - i); } } /* Forms a specialization plan from considering all frames whose statics have * changed. */ MVMSpeshPlan * MVM_spesh_plan(MVMThreadContext *tc, MVMObject *updated_static_frames) { MVMSpeshPlan *plan = MVM_calloc(1, sizeof(MVMSpeshPlan)); MVMint64 updated = MVM_repr_elems(tc, updated_static_frames); MVMint64 i; #if MVM_GC_DEBUG tc->in_spesh = 1; #endif for (i = 0; i < updated; i++) { MVMObject *sf = MVM_repr_at_pos_o(tc, updated_static_frames, i); plan_for_sf(tc, plan, (MVMStaticFrame *)sf); } sort_plan(tc, plan->planned, plan->num_planned); #if MVM_GC_DEBUG tc->in_spesh = 0; #endif return plan; } /* Marks garbage-collectable objects held in the spesh plan. */ void MVM_spesh_plan_gc_mark(MVMThreadContext *tc, MVMSpeshPlan *plan, MVMGCWorklist *worklist) { MVMuint32 i; if (!plan) return; for (i = 0; i < plan->num_planned; i++) { MVMSpeshPlanned *p = &(plan->planned[i]); MVM_gc_worklist_add(tc, worklist, &(p->sf)); if (p->type_tuple) { MVMCallsite *cs = p->cs_stats->cs; MVMuint32 j; for (j = 0; j < cs->flag_count; j++) { if (cs->arg_flags[j] & MVM_CALLSITE_ARG_OBJ) { MVM_gc_worklist_add(tc, worklist, &(p->type_tuple[j].type)); MVM_gc_worklist_add(tc, worklist, &(p->type_tuple[j].decont_type)); } } } } } void MVM_spesh_plan_gc_describe(MVMThreadContext *tc, MVMHeapSnapshotState *ss, MVMSpeshPlan *plan) { MVMuint32 i; if (!plan) return; for (i = 0; i < plan->num_planned; i++) { MVMSpeshPlanned *p = &(plan->planned[i]); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable*)(p->sf), "staticframe"); if (p->type_tuple) { MVMCallsite *cs = p->cs_stats->cs; MVMuint32 j; for (j = 0; j < cs->flag_count; j++) { if (cs->arg_flags[j] & MVM_CALLSITE_ARG_OBJ) { MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable*)(p->type_tuple[j].type), "argument type"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable*)(p->type_tuple[j].decont_type), "argument decont type"); } } } } } /* Frees all memory associated with a specialization plan. */ void MVM_spesh_plan_destroy(MVMThreadContext *tc, MVMSpeshPlan *plan) { MVMuint32 i; for (i = 0; i < plan->num_planned; i++) { MVM_free(plan->planned[i].type_stats); MVM_free(plan->planned[i].type_tuple); } MVM_free(plan->planned); MVM_free(plan); } MoarVM-2018.03/src/spesh/plan.h0000644000175000017510000000611013237701240016214 0ustar samanthasamantha/* The minimum number OSR hits a static frame as a whole has to receive * (across all callsites and type tuples) before it is hot enough to further * consider. */ #define MVM_SPESH_PLAN_SF_MIN_OSR 100 /* The minimum number of hits or OSR hits a given static frame and interned * callsite combination have to have before it is hot enough to further * consider. */ #define MVM_SPESH_PLAN_CS_MIN_OSR 100 /* The percentage of hits or OSR hits that a type tuple should receive, out of * the total callsite hits, to receive an "observed types" specialization. */ #define MVM_SPESH_PLAN_TT_OBS_PERCENT 25 #define MVM_SPESH_PLAN_TT_OBS_PERCENT_OSR 25 /* The plan of what specializations to produce. */ struct MVMSpeshPlan { /* List of planned specializations. */ MVMSpeshPlanned *planned; /* Number of planned specializations. */ MVMuint32 num_planned; /* The number of specialization plans space is allocated for. */ MVMuint32 alloc_planned; }; /* Kinds of specializations we might decide to produce. */ typedef enum { /* A certain specialization based only on callsite. */ MVM_SPESH_PLANNED_CERTAIN, /* A specialization based on an exact observed argument type tuple. */ MVM_SPESH_PLANNED_OBSERVED_TYPES, /* A specialization based on analysis of various argument types that * showed up. This may happen when one argument type is predcitable, but * others are not. */ MVM_SPESH_PLANNED_DERIVED_TYPES } MVMSpeshPlannedKind; /* An planned specialization that should be produced. */ struct MVMSpeshPlanned { /* What kind of specialization we're planning. */ MVMSpeshPlannedKind kind; /* The maximum stack depth this was seen at; used to sort the plan so we * can specialize deepest first, in hope of having callees specialized * ahead of callers. */ MVMuint32 max_depth; /* The static frame with the code to specialize. */ MVMStaticFrame *sf; /* The callsite statistics entry that this specialization was planned as * a result of (by extension, we find the callsite, if any). */ MVMSpeshStatsByCallsite *cs_stats; /* The type tuple to produce the specialization for, if this is a type * based specialization. NULL for certain specializations. The memory * associated with this tuple will always have been allocated by the * planner, not shared with the statistics structure, even if this is a * specialization for an exactly observed type. */ MVMSpeshStatsType *type_tuple; /* Type statistics, if any, that the plan was formed based upon. */ MVMSpeshStatsByType **type_stats; /* Number of entries in the type_stats array. (For an observed type * specialization, this would be 1.) */ MVMuint32 num_type_stats; }; MVMSpeshPlan * MVM_spesh_plan(MVMThreadContext *tc, MVMObject *updated_static_frames); void MVM_spesh_plan_gc_mark(MVMThreadContext *tc, MVMSpeshPlan *plan, MVMGCWorklist *worklist); void MVM_spesh_plan_gc_describe(MVMThreadContext *tc, MVMHeapSnapshotState *ss, MVMSpeshPlan *plan); void MVM_spesh_plan_destroy(MVMThreadContext *tc, MVMSpeshPlan *plan); MoarVM-2018.03/src/spesh/stats.c0000644000175000017510000010103313242626641016422 0ustar samanthasamantha#include "moar.h" /* Gets the statistics for a static frame, creating them if needed. */ MVMSpeshStats * stats_for(MVMThreadContext *tc, MVMStaticFrame *sf) { MVMStaticFrameSpesh *spesh = sf->body.spesh; if (!spesh->body.spesh_stats) spesh->body.spesh_stats = MVM_calloc(1, sizeof(MVMSpeshStats)); return spesh->body.spesh_stats; } /* Gets the stats by callsite, adding it if it's missing. */ MVMuint32 by_callsite_idx(MVMThreadContext *tc, MVMSpeshStats *ss, MVMCallsite *cs) { /* See if we already have it. */ MVMuint32 found; MVMuint32 n = ss->num_by_callsite; for (found = 0; found < n; found++) if (ss->by_callsite[found].cs == cs) return found; /* If not, we need a new record. */ found = ss->num_by_callsite; ss->num_by_callsite++; ss->by_callsite = MVM_realloc(ss->by_callsite, ss->num_by_callsite * sizeof(MVMSpeshStatsByCallsite)); memset(&(ss->by_callsite[found]), 0, sizeof(MVMSpeshStatsByCallsite)); ss->by_callsite[found].cs = cs; return found; } /* Checks if a type tuple is incomplete (no types logged for some passed * objects, or no decont type logged for a container type). */ MVMint32 incomplete_type_tuple(MVMThreadContext *tc, MVMCallsite *cs, MVMSpeshStatsType *arg_types) { MVMuint32 i; for (i = 0; i < cs->flag_count; i++) { if (cs->arg_flags[i] & MVM_CALLSITE_ARG_OBJ) { MVMObject *type = arg_types[i].type; if (!type) return 1; if (arg_types[i].type_concrete && type->st->container_spec) if (!arg_types[i].decont_type && REPR(type)->ID != MVM_REPR_ID_NativeRef) return 1; } } return 0; } /* Returns true if the callsite has no object arguments, false otherwise. */ MVMint32 cs_without_object_args(MVMThreadContext *tc, MVMCallsite *cs) { MVMuint32 i; for (i = 0; i < cs->flag_count; i++) if (cs->arg_flags[i] & MVM_CALLSITE_ARG_OBJ) return 0; return 1; } /* Gets the stats by type, adding it if it's missing. Frees arg_types. Returns * the index in the by type array, or -1 if unresolved. */ MVMint32 by_type(MVMThreadContext *tc, MVMSpeshStats *ss, MVMuint32 callsite_idx, MVMSpeshStatsType *arg_types) { /* Resolve type by callsite level info. If this is the no-callsite * specialization there is nothing further to do. */ MVMSpeshStatsByCallsite *css = &(ss->by_callsite[callsite_idx]); MVMCallsite *cs = css->cs; if (!cs) { MVM_free(arg_types); return -1; } /* Otherwise if there's no object args, then we'll use a single "by type" * specialization, so we can have data tracked by offset at least. */ else if (cs_without_object_args(tc, cs)) { if (css->num_by_type == 0) { css->num_by_type++; css->by_type = MVM_calloc(1, sizeof(MVMSpeshStatsByType)); css->by_type[0].arg_types = arg_types; } else { MVM_free(arg_types); } return 0; } /* Maybe the type tuple is incomplete, maybe because the log buffer ended * prior to having all the type information. Discard. */ else if (incomplete_type_tuple(tc, cs, arg_types)) { MVM_free(arg_types); return -1; } /* Can produce by-type stats. */ else { /* See if we already have it. */ size_t args_length = cs->flag_count * sizeof(MVMSpeshStatsType); MVMuint32 found; MVMuint32 n = css->num_by_type; for (found = 0; found < n; found++) { if (memcmp(css->by_type[found].arg_types, arg_types, args_length) == 0) { MVM_free(arg_types); return found; } } /* If not, we need a new record. */ found = css->num_by_type; css->num_by_type++; css->by_type = MVM_realloc(css->by_type, css->num_by_type * sizeof(MVMSpeshStatsByType)); memset(&(css->by_type[found]), 0, sizeof(MVMSpeshStatsByType)); css->by_type[found].arg_types = arg_types; return found; } } /* Get the stats by offset entry, adding it if it's missing. */ MVMSpeshStatsByOffset * by_offset(MVMThreadContext *tc, MVMSpeshStatsByType *tss, MVMuint32 bytecode_offset) { /* See if we already have it. */ MVMuint32 found; MVMuint32 n = tss->num_by_offset; for (found = 0; found < n; found++) if (tss->by_offset[found].bytecode_offset == bytecode_offset) return &(tss->by_offset[found]); /* If not, we need a new record. */ found = tss->num_by_offset; tss->num_by_offset++; tss->by_offset = MVM_realloc(tss->by_offset, tss->num_by_offset * sizeof(MVMSpeshStatsByOffset)); memset(&(tss->by_offset[found]), 0, sizeof(MVMSpeshStatsByOffset)); tss->by_offset[found].bytecode_offset = bytecode_offset; return &(tss->by_offset[found]); } /* Adds/increments the count of a certain type seen at the given offset. */ void add_type_at_offset(MVMThreadContext *tc, MVMSpeshStatsByOffset *oss, MVMStaticFrame *sf, MVMObject *type, MVMuint8 concrete) { /* If we have it already, increment the count. */ MVMuint32 found; MVMuint32 n = oss->num_types; for (found = 0; found < n; found++) { if (oss->types[found].type == type && oss->types[found].type_concrete == concrete) { oss->types[found].count++; return; } } /* Otherwise, add it to the list. */ found = oss->num_types; oss->num_types++; oss->types = MVM_realloc(oss->types, oss->num_types * sizeof(MVMSpeshStatsTypeCount)); MVM_ASSIGN_REF(tc, &(sf->body.spesh->common.header), oss->types[found].type, type); oss->types[found].type_concrete = concrete; oss->types[found].count = 1; } /* Adds/increments the count of a certain invocation target seen at the given * offset. */ void add_invoke_at_offset(MVMThreadContext *tc, MVMSpeshStatsByOffset *oss, MVMStaticFrame *sf, MVMStaticFrame *target_sf, MVMint16 caller_is_outer, MVMint16 was_multi) { /* If we have it already, increment the count. */ MVMuint32 found; MVMuint32 n = oss->num_invokes; for (found = 0; found < n; found++) { if (oss->invokes[found].sf == target_sf) { oss->invokes[found].count++; if (caller_is_outer) oss->invokes[found].caller_is_outer_count++; if (was_multi) oss->invokes[found].was_multi_count++; return; } } /* Otherwise, add it to the list. */ found = oss->num_invokes; oss->num_invokes++; oss->invokes = MVM_realloc(oss->invokes, oss->num_invokes * sizeof(MVMSpeshStatsInvokeCount)); MVM_ASSIGN_REF(tc, &(sf->body.spesh->common.header), oss->invokes[found].sf, target_sf); oss->invokes[found].count = 1; oss->invokes[found].caller_is_outer_count = caller_is_outer ? 1 : 0; oss->invokes[found].was_multi_count = was_multi ? 1 : 0; } /* Adds/increments the count of a type tuple seen at the given offset. */ void add_type_tuple_at_offset(MVMThreadContext *tc, MVMSpeshStatsByOffset *oss, MVMStaticFrame *sf, MVMSpeshSimCallType *info) { /* Compute type tuple size. */ size_t tt_size = info->cs->flag_count * sizeof(MVMSpeshStatsType); /* If we have it already, increment the count. */ MVMuint32 found, i; MVMuint32 n = oss->num_type_tuples; for (found = 0; found < n; found++) { if (oss->type_tuples[found].cs == info->cs) { if (memcmp(oss->type_tuples[found].arg_types, info->arg_types, tt_size) == 0) { oss->type_tuples[found].count++; return; } } } /* Otherwise, add it to the list; copy type tuple to ease memory * management, but also need to write barrier any types. */ found = oss->num_type_tuples; oss->num_type_tuples++; oss->type_tuples = MVM_realloc(oss->type_tuples, oss->num_type_tuples * sizeof(MVMSpeshStatsTypeTupleCount)); oss->type_tuples[found].cs = info->cs; oss->type_tuples[found].arg_types = MVM_malloc(tt_size); memcpy(oss->type_tuples[found].arg_types, info->arg_types, tt_size); for (i = 0; i < info->cs->flag_count; i++) { if (info->arg_types[i].type) MVM_gc_write_barrier(tc, &(sf->body.spesh->common.header), &(info->arg_types[i].type->header)); if (info->arg_types[i].decont_type) MVM_gc_write_barrier(tc, &(sf->body.spesh->common.header), &(info->arg_types[i].decont_type->header)); } oss->type_tuples[found].count = 1; } /* Initializes the stack simulation. */ void sim_stack_init(MVMThreadContext *tc, MVMSpeshSimStack *sims) { sims->used = 0; sims->limit = 32; sims->frames = MVM_malloc(sims->limit * sizeof(MVMSpeshSimStackFrame)); sims->depth = 0; } /* Pushes an entry onto the stack frame model. */ void sim_stack_push(MVMThreadContext *tc, MVMSpeshSimStack *sims, MVMStaticFrame *sf, MVMSpeshStats *ss, MVMuint32 cid, MVMuint32 callsite_idx) { MVMSpeshSimStackFrame *frame; MVMCallsite *cs; if (sims->used == sims->limit) { sims->limit *= 2; sims->frames = MVM_realloc(sims->frames, sims->limit * sizeof(MVMSpeshSimStackFrame)); } frame = &(sims->frames[sims->used++]); frame->sf = sf; frame->ss = ss; frame->cid = cid; frame->callsite_idx = callsite_idx; frame->type_idx = -1; frame->arg_types = (cs = ss->by_callsite[callsite_idx].cs) ? MVM_calloc(cs->flag_count, sizeof(MVMSpeshStatsType)) : NULL; frame->offset_logs = NULL; frame->offset_logs_used = frame->offset_logs_limit = 0; frame->osr_hits = 0; frame->call_type_info = NULL; frame->call_type_info_used = frame->call_type_info_limit = 0; frame->last_invoke_offset = 0; frame->last_invoke_sf = NULL; sims->depth++; } /* Adds an entry to a sim frame's callsite type info list, for later * inclusion in the callsite stats. */ void add_sim_call_type_info(MVMThreadContext *tc, MVMSpeshSimStackFrame *simf, MVMuint32 bytecode_offset, MVMCallsite *cs, MVMSpeshStatsType *arg_types) { MVMSpeshSimCallType *info; if (simf->call_type_info_used == simf->call_type_info_limit) { simf->call_type_info_limit += 32; simf->call_type_info = MVM_realloc(simf->call_type_info, simf->call_type_info_limit * sizeof(MVMSpeshSimCallType)); } info = &(simf->call_type_info[simf->call_type_info_used++]); info->bytecode_offset = bytecode_offset; info->cs = cs; info->arg_types = arg_types; } /* Incorporate information collected into a sim stack frame. */ void incorporate_stats(MVMThreadContext *tc, MVMSpeshSimStackFrame *simf, MVMuint32 frame_depth, MVMSpeshSimStackFrame *caller, MVMObject *sf_updated) { MVMSpeshStatsByType *tss; MVMint32 first_type_hit = 0; /* Bump version if needed. */ if (simf->ss->last_update != tc->instance->spesh_stats_version) { simf->ss->last_update = tc->instance->spesh_stats_version; MVM_repr_push_o(tc, sf_updated, (MVMObject *)simf->sf); } /* Add OSR hits at callsite level and update depth. */ if (simf->osr_hits) { simf->ss->osr_hits += simf->osr_hits; simf->ss->by_callsite[simf->callsite_idx].osr_hits += simf->osr_hits; } if (frame_depth > simf->ss->by_callsite[simf->callsite_idx].max_depth) simf->ss->by_callsite[simf->callsite_idx].max_depth = frame_depth; /* See if there's a type tuple to attach type-based stats to. */ if (simf->type_idx < 0 && simf->arg_types) { simf->type_idx = by_type(tc, simf->ss, simf->callsite_idx, simf->arg_types); simf->arg_types = NULL; first_type_hit = 1; } tss = simf->type_idx >= 0 ? &(simf->ss->by_callsite[simf->callsite_idx].by_type[simf->type_idx]) : NULL; if (tss) { /* Incorporate data logged at offsets. */ MVMuint32 i; for (i = 0; i < simf->offset_logs_used; i++) { MVMSpeshLogEntry *e = simf->offset_logs[i]; switch (e->kind) { case MVM_SPESH_LOG_TYPE: case MVM_SPESH_LOG_RETURN: { MVMSpeshStatsByOffset *oss = by_offset(tc, tss, e->type.bytecode_offset); add_type_at_offset(tc, oss, simf->sf, e->type.type, e->type.flags & MVM_SPESH_LOG_TYPE_FLAG_CONCRETE); break; } case MVM_SPESH_LOG_INVOKE: { MVMSpeshStatsByOffset *oss = by_offset(tc, tss, e->invoke.bytecode_offset); add_invoke_at_offset(tc, oss, simf->sf, e->invoke.sf, e->invoke.caller_is_outer, e->invoke.was_multi); break; } } } /* Incorporate callsite type stats (what type tuples did we make a * call with). */ for (i = 0; i < simf->call_type_info_used; i++) { MVMSpeshSimCallType *info = &(simf->call_type_info[i]); MVMSpeshStatsByOffset *oss = by_offset(tc, tss, info->bytecode_offset); add_type_tuple_at_offset(tc, oss, simf->sf, info); } /* Incorporate OSR hits and bump max depth. */ if (first_type_hit) tss->hits++; tss->osr_hits += simf->osr_hits; if (frame_depth > tss->max_depth) tss->max_depth = frame_depth; /* If the callee's last incovation matches the frame just invoked, * then log the type tuple against the callsite. */ if (caller && caller->last_invoke_sf == simf->sf) add_sim_call_type_info(tc, caller, caller->last_invoke_offset, simf->ss->by_callsite[simf->callsite_idx].cs, tss->arg_types); } /* Clear up offset logs and call type info; they're either incorproated or * to be tossed. Also zero OSR hits, so we don't over-inflate them if this * frame entry survives. */ MVM_free(simf->offset_logs); simf->offset_logs = NULL; simf->offset_logs_used = simf->offset_logs_limit = 0; MVM_free(simf->call_type_info); simf->call_type_info = NULL; simf->call_type_info_used = simf->call_type_info_limit = 0; simf->osr_hits = 0; } /* Pops the top frame from the sim stack. */ void sim_stack_pop(MVMThreadContext *tc, MVMSpeshSimStack *sims, MVMObject *sf_updated) { MVMSpeshSimStackFrame *simf; MVMuint32 frame_depth; /* Pop off the simulated frame and incorporate logged data into the spesh * stats model. */ if (sims->used == 0) MVM_panic(1, "Spesh stats: cannot pop an empty simulation stack"); sims->used--; simf = &(sims->frames[sims->used]); frame_depth = sims->depth--; /* Incorporate logged data into the statistics model. */ incorporate_stats(tc, simf, frame_depth, sims->used > 0 ? &(sims->frames[sims->used - 1]) : NULL, sf_updated); } /* Gets the simulation stack frame for the specified correlation ID. If it is * not on the top, searches to see if it's further down. If it is, then pops * off the top to reach it. If it's not found at all, returns NULL and does * nothing to the simulation stack. */ MVMSpeshSimStackFrame * sim_stack_find(MVMThreadContext *tc, MVMSpeshSimStack *sims, MVMuint32 cid, MVMObject *sf_updated) { MVMuint32 found_at = sims->used; while (found_at != 0) { found_at--; if (sims->frames[found_at].cid == cid) { MVMint32 pop = (sims->used - found_at) - 1; MVMint32 i; for (i = 0; i < pop; i++) sim_stack_pop(tc, sims, sf_updated); return &(sims->frames[found_at]); } } return NULL; } /* Pops all the frames in the stack simulation and frees the frames storage. */ void sim_stack_teardown(MVMThreadContext *tc, MVMSpeshSimStack *sims, MVMObject *sf_updated) { while (sims->used) sim_stack_pop(tc, sims, sf_updated); MVM_free(sims->frames); } /* Gets the parameter type slot from a simulation frame. */ MVMSpeshStatsType * param_type(MVMThreadContext *tc, MVMSpeshSimStackFrame *simf, MVMSpeshLogEntry *e) { if (simf->arg_types) { MVMuint16 idx = e->param.arg_idx; MVMCallsite *cs = simf->ss->by_callsite[simf->callsite_idx].cs; if (cs) { MVMint32 flag_idx = idx < cs->num_pos ? idx : cs->num_pos + (((idx - 1) - cs->num_pos) / 2); if (flag_idx >= cs->flag_count) MVM_panic(1, "Spesh stats: argument flag index out of bounds"); if (cs->arg_flags[flag_idx] & MVM_CALLSITE_ARG_OBJ) return &(simf->arg_types[flag_idx]); } } return NULL; } /* Records a static value for a frame, unless it's already in the log. */ void add_static_value(MVMThreadContext *tc, MVMSpeshSimStackFrame *simf, MVMint32 bytecode_offset, MVMObject *value) { MVMSpeshStats *ss = simf->ss; MVMuint32 i, id; for (i = 0; i < ss->num_static_values; i++) if (ss->static_values[i].bytecode_offset == bytecode_offset) return; id = ss->num_static_values++; ss->static_values = MVM_realloc(ss->static_values, ss->num_static_values * sizeof(MVMSpeshStatsStatic)); ss->static_values[id].bytecode_offset = bytecode_offset; MVM_ASSIGN_REF(tc, &(simf->sf->body.spesh->common.header), ss->static_values[id].value, value); } /* Decides whether to save or free the simulation stack. */ static void save_or_free_sim_stack(MVMThreadContext *tc, MVMSpeshSimStack *sims, MVMThreadContext *save_on_tc, MVMObject *sf_updated) { MVMint32 first_survivor = -1; MVMint32 i; if (save_on_tc) { for (i = 0; i < sims->used; i++) { MVMSpeshSimStackFrame *simf = &(sims->frames[i]); MVMuint32 age = tc->instance->spesh_stats_version - simf->ss->last_update; if (age < MVM_SPESH_STATS_MAX_AGE - 1) { first_survivor = i; break; } } } if (first_survivor >= 0) { /* Move survivors to the start. */ if (first_survivor > 0) { sims->used -= first_survivor; memmove(sims->frames, sims->frames + first_survivor, sims->used * sizeof(MVMSpeshSimStackFrame)); } /* Incorporate data from the rest into the stats model, clearing it * away. */ i = sims->used - 1; while (i >= 0) { incorporate_stats(tc, &(sims->frames[i]), first_survivor + i, i > 0 ? &(sims->frames[i - 1]) : NULL, sf_updated); i--; } /* Save frames for next time. */ save_on_tc->spesh_sim_stack = sims; } else { /* Everything on the simulated stack is too old; throw it away. */ sim_stack_teardown(tc, sims, sf_updated); MVM_free(sims); } } /* Receives a spesh log and updates static frame statistics. Each static frame * that is updated is pushed once into sf_updated. */ void MVM_spesh_stats_update(MVMThreadContext *tc, MVMSpeshLog *sl, MVMObject *sf_updated) { MVMuint32 i; MVMuint32 n = sl->body.used; MVMSpeshSimStack *sims; MVMThreadContext *log_from_tc = sl->body.thread->body.tc; #if MVM_GC_DEBUG tc->in_spesh = 1; #endif /* See if we have a simulation stack left over from before; create a new * one if not. */ if (log_from_tc && log_from_tc->spesh_sim_stack) { /* Filter out those whose stats pointer is outdated. */ MVMuint32 insert_pos = 0; sims = log_from_tc->spesh_sim_stack; for (i = 0; i < sims->used; i++) { MVMSpeshStats *cur_stats = sims->frames[i].sf->body.spesh->body.spesh_stats; if (cur_stats == sims->frames[i].ss) { if (i != insert_pos) sims->frames[insert_pos] = sims->frames[i]; insert_pos++; } } sims->used = insert_pos; log_from_tc->spesh_sim_stack = NULL; } else { sims = MVM_malloc(sizeof(MVMSpeshSimStack)); sim_stack_init(tc, sims); } /* Process the log entries. */ for (i = 0; i < n; i++) { MVMSpeshLogEntry *e = &(sl->body.entries[i]); switch (e->kind) { case MVM_SPESH_LOG_ENTRY: { MVMSpeshStats *ss = stats_for(tc, e->entry.sf); MVMuint32 callsite_idx; if (ss->last_update != tc->instance->spesh_stats_version) { ss->last_update = tc->instance->spesh_stats_version; MVM_repr_push_o(tc, sf_updated, (MVMObject *)e->entry.sf); } ss->hits++; callsite_idx = by_callsite_idx(tc, ss, e->entry.cs); ss->by_callsite[callsite_idx].hits++; sim_stack_push(tc, sims, e->entry.sf, ss, e->id, callsite_idx); break; } case MVM_SPESH_LOG_PARAMETER: { MVMSpeshSimStackFrame *simf = sim_stack_find(tc, sims, e->id, sf_updated); if (simf) { MVMSpeshStatsType *type_slot = param_type(tc, simf, e); if (type_slot) { MVM_ASSIGN_REF(tc, &(simf->sf->body.spesh->common.header), type_slot->type, e->param.type); type_slot->type_concrete = e->param.flags & MVM_SPESH_LOG_TYPE_FLAG_CONCRETE ? 1 : 0; type_slot->rw_cont = e->param.flags & MVM_SPESH_LOG_TYPE_FLAG_RW_CONT ? 1 : 0; } } break; } case MVM_SPESH_LOG_PARAMETER_DECONT: { MVMSpeshSimStackFrame *simf = sim_stack_find(tc, sims, e->id, sf_updated); if (simf) { MVMSpeshStatsType *type_slot = param_type(tc, simf, e); if (type_slot) { MVM_ASSIGN_REF(tc, &(simf->sf->body.spesh->common.header), type_slot->decont_type, e->param.type); type_slot->decont_type_concrete = e->param.flags & MVM_SPESH_LOG_TYPE_FLAG_CONCRETE; } } break; } case MVM_SPESH_LOG_TYPE: case MVM_SPESH_LOG_INVOKE: { /* We only incorporate these into the model later, and only * then if we need to. For now, just keep references to * them. */ MVMSpeshSimStackFrame *simf = sim_stack_find(tc, sims, e->id, sf_updated); if (simf) { if (simf->offset_logs_used == simf->offset_logs_limit) { simf->offset_logs_limit += 32; simf->offset_logs = MVM_realloc(simf->offset_logs, simf->offset_logs_limit * sizeof(MVMSpeshLogEntry *)); } simf->offset_logs[simf->offset_logs_used++] = e; if (e->kind == MVM_SPESH_LOG_INVOKE) { simf->last_invoke_offset = e->invoke.bytecode_offset; simf->last_invoke_sf = e->invoke.sf; } } break; } case MVM_SPESH_LOG_OSR: { MVMSpeshSimStackFrame *simf = sim_stack_find(tc, sims, e->id, sf_updated); if (simf) simf->osr_hits++; break; } case MVM_SPESH_LOG_STATIC: { MVMSpeshSimStackFrame *simf = sim_stack_find(tc, sims, e->id, sf_updated); if (simf) add_static_value(tc, simf, e->value.bytecode_offset, e->value.value); break; } case MVM_SPESH_LOG_RETURN: { MVMSpeshSimStackFrame *simf = sim_stack_find(tc, sims, e->id, sf_updated); if (simf) { MVMStaticFrame *called_sf = simf->sf; sim_stack_pop(tc, sims, sf_updated); if (e->type.type && sims->used) { MVMSpeshSimStackFrame *caller = &(sims->frames[sims->used - 1]); if (called_sf == caller->last_invoke_sf) { if (caller->offset_logs_used == caller->offset_logs_limit) { caller->offset_logs_limit += 32; caller->offset_logs = MVM_realloc(caller->offset_logs, caller->offset_logs_limit * sizeof(MVMSpeshLogEntry *)); } e->type.bytecode_offset = caller->last_invoke_offset; caller->offset_logs[caller->offset_logs_used++] = e; } } } break; } } } save_or_free_sim_stack(tc, sims, log_from_tc, sf_updated); #if MVM_GC_DEBUG tc->in_spesh = 0; #endif } /* Takes an array of frames we recently updated the stats in. If they weren't * updated in a while, clears them out. */ void MVM_spesh_stats_cleanup(MVMThreadContext *tc, MVMObject *check_frames) { MVMint64 elems = MVM_repr_elems(tc, check_frames); MVMint64 insert_pos = 0; MVMint64 i; for (i = 0; i < elems; i++) { MVMStaticFrame *sf = (MVMStaticFrame *)MVM_repr_at_pos_o(tc, check_frames, i); MVMStaticFrameSpesh *spesh = sf->body.spesh; MVMSpeshStats *ss = spesh->body.spesh_stats; if (!ss) { /* No stats; already destroyed, don't keep this frame under * consideration. */ } else if (tc->instance->spesh_stats_version - ss->last_update > MVM_SPESH_STATS_MAX_AGE) { MVM_spesh_stats_destroy(tc, ss); MVM_free(spesh->body.spesh_stats); spesh->body.spesh_stats = NULL; } else { MVM_repr_bind_pos_o(tc, check_frames, insert_pos++, (MVMObject *)sf); } } MVM_repr_pos_set_elems(tc, check_frames, insert_pos); } void MVM_spesh_stats_gc_mark(MVMThreadContext *tc, MVMSpeshStats *ss, MVMGCWorklist *worklist) { if (ss) { MVMuint32 i, j, k, l, m; for (i = 0; i < ss->num_by_callsite; i++) { MVMSpeshStatsByCallsite *by_cs = &(ss->by_callsite[i]); for (j = 0; j < by_cs->num_by_type; j++) { MVMSpeshStatsByType *by_type = &(by_cs->by_type[j]); MVMuint32 num_types = by_cs->cs->flag_count; for (k = 0; k < num_types; k++) { MVM_gc_worklist_add(tc, worklist, &(by_type->arg_types[k].type)); MVM_gc_worklist_add(tc, worklist, &(by_type->arg_types[k].decont_type)); } for (k = 0; k < by_type->num_by_offset; k++) { MVMSpeshStatsByOffset *by_offset = &(by_type->by_offset[k]); for (l = 0; l < by_offset->num_types; l++) MVM_gc_worklist_add(tc, worklist, &(by_offset->types[l].type)); for (l = 0; l < by_offset->num_invokes; l++) MVM_gc_worklist_add(tc, worklist, &(by_offset->invokes[l].sf)); for (l = 0; l < by_offset->num_type_tuples; l++) { MVMSpeshStatsType *off_types = by_offset->type_tuples[l].arg_types; MVMuint32 num_off_types = by_offset->type_tuples[l].cs->flag_count; for (m = 0; m < num_off_types; m++) { MVM_gc_worklist_add(tc, worklist, &(off_types[m].type)); MVM_gc_worklist_add(tc, worklist, &(off_types[m].decont_type)); } } } } } for (i = 0; i < ss->num_static_values; i++) MVM_gc_worklist_add(tc, worklist, &(ss->static_values[i].value)); } } void MVM_spesh_stats_gc_describe(MVMThreadContext *tc, MVMHeapSnapshotState *snapshot, MVMSpeshStats *ss) { if (ss) { MVMuint32 i, j, k, l, m; for (i = 0; i < ss->num_by_callsite; i++) { MVMSpeshStatsByCallsite *by_cs = &(ss->by_callsite[i]); for (j = 0; j < by_cs->num_by_type; j++) { MVMSpeshStatsByType *by_type = &(by_cs->by_type[j]); MVMuint32 num_types = by_cs->cs->flag_count; for (k = 0; k < num_types; k++) { MVM_profile_heap_add_collectable_rel_const_cstr(tc, snapshot, (MVMCollectable*)(by_type->arg_types[k].type), "type"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, snapshot, (MVMCollectable*)(by_type->arg_types[k].decont_type), "decont type"); } for (k = 0; k < by_type->num_by_offset; k++) { MVMSpeshStatsByOffset *by_offset = &(by_type->by_offset[k]); for (l = 0; l < by_offset->num_types; l++) MVM_profile_heap_add_collectable_rel_const_cstr(tc, snapshot, (MVMCollectable*)(by_offset->types[l].type), "type at offset"); for (l = 0; l < by_offset->num_invokes; l++) MVM_profile_heap_add_collectable_rel_const_cstr(tc, snapshot, (MVMCollectable*)(by_offset->invokes[l].sf), "invoke"); for (l = 0; l < by_offset->num_type_tuples; l++) { MVMSpeshStatsType *off_types = by_offset->type_tuples[l].arg_types; MVMuint32 num_off_types = by_offset->type_tuples[l].cs->flag_count; for (m = 0; m < num_off_types; m++) { MVM_profile_heap_add_collectable_rel_const_cstr(tc, snapshot, (MVMCollectable*)(off_types[m].type), "type tuple type"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, snapshot, (MVMCollectable*)(off_types[m].decont_type), "type tuple deconted type"); } } } } } for (i = 0; i < ss->num_static_values; i++) MVM_profile_heap_add_collectable_rel_const_cstr(tc, snapshot, (MVMCollectable*)(ss->static_values[i].value), "static value"); } } void MVM_spesh_stats_destroy(MVMThreadContext *tc, MVMSpeshStats *ss) { if (ss) { MVMuint32 i, j, k, l; for (i = 0; i < ss->num_by_callsite; i++) { MVMSpeshStatsByCallsite *by_cs = &(ss->by_callsite[i]); for (j = 0; j < by_cs->num_by_type; j++) { MVMSpeshStatsByType *by_type = &(by_cs->by_type[j]); for (k = 0; k < by_type->num_by_offset; k++) { MVMSpeshStatsByOffset *by_offset = &(by_type->by_offset[k]); MVM_free(by_offset->types); MVM_free(by_offset->invokes); for (l = 0; l < by_offset->num_type_tuples; l++) MVM_free(by_offset->type_tuples[l].arg_types); MVM_free(by_offset->type_tuples); } MVM_free(by_type->by_offset); MVM_free(by_type->arg_types); } MVM_free(by_cs->by_type); } MVM_free(ss->by_callsite); MVM_free(ss->static_values); } } void MVM_spesh_sim_stack_gc_mark(MVMThreadContext *tc, MVMSpeshSimStack *sims, MVMGCWorklist *worklist) { MVMuint32 n = sims ? sims->used : 0; MVMuint32 i; for (i = 0; i < n; i++) { MVMSpeshSimStackFrame *simf = &(sims->frames[i]); MVM_gc_worklist_add(tc, worklist, &(simf->sf)); MVM_gc_worklist_add(tc, worklist, &(simf->last_invoke_sf)); } } void MVM_spesh_sim_stack_gc_describe(MVMThreadContext *tc, MVMHeapSnapshotState *ss, MVMSpeshSimStack *sims) { MVMuint32 n = sims ? sims->used : 0; MVMuint32 i; for (i = 0; i < n; i++) { MVMSpeshSimStackFrame *simf = &(sims->frames[i]); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable*)(simf->sf), "staticframe"); MVM_profile_heap_add_collectable_rel_const_cstr(tc, ss, (MVMCollectable*)(simf->last_invoke_sf), "last invoked staticframe"); } } void MVM_spesh_sim_stack_destroy(MVMThreadContext *tc, MVMSpeshSimStack *sims) { if (sims) { MVM_free(sims->frames); MVM_free(sims); } } MoarVM-2018.03/src/spesh/stats.h0000644000175000017510000001647413237701240016436 0ustar samanthasamantha/* Statistics are stored per static frame. This data structure is only ever * read/written by the specializer thread. */ struct MVMSpeshStats { /* Statistics on a per-callsite basis. */ MVMSpeshStatsByCallsite *by_callsite; /* Map of MVM_SPESH_LOG_STATIC entries for this routine. Held at the top * level as they represent static resolutions, so no need to duplicate * this information across callsites. */ MVMSpeshStatsStatic *static_values; /* The number of entries in by_callsite. */ MVMuint32 num_by_callsite; /* The number of entries in static_values. */ MVMuint32 num_static_values; /* Total calls across all callsites. */ MVMuint32 hits; /* Total OSR hits across all callsites. */ MVMuint32 osr_hits; /* The latest version of the statistics when this was updated. Used to * help decide when to throw out data that is no longer evolving, to * reduce memory use. */ MVMuint32 last_update; }; /* Statistics by callsite. */ struct MVMSpeshStatsByCallsite { /* The callsite, or NULL for the case of no interned callsite. */ MVMCallsite *cs; /* Statistics aggregated by parameter type information. */ MVMSpeshStatsByType *by_type; /* The number of entries in by_type. Zero if cs == NULL. */ MVMuint32 num_by_type; /* Total calls to this callsite. */ MVMuint32 hits; /* Total OSR hits for this callsite. */ MVMuint32 osr_hits; /* The maximum callstack depth we observed this at. */ MVMuint32 max_depth; }; /* Statistics by type. */ struct MVMSpeshStatsByType { /* Argument type information. Length of this is determined by the callsite * of the specialization. */ MVMSpeshStatsType *arg_types; /* Total calls with this callsite/type combination. */ MVMuint32 hits; /* Total OSR hits for this callsite/type combination. */ MVMuint32 osr_hits; /* Logged type and logged value counts, by bytecode offset. */ MVMSpeshStatsByOffset *by_offset; /* Number of stats by offset we have. */ MVMuint32 num_by_offset; /* The maximum callstack depth we observed this at. */ MVMuint32 max_depth; }; /* Type statistics. */ struct MVMSpeshStatsType { /* The type logged. */ MVMObject *type; /* If applicable, and if the type is a container type, the type of the * value logged inside of it. */ MVMObject *decont_type; /* Whether the type and decont type were concrete. */ MVMuint8 type_concrete; MVMuint8 decont_type_concrete; /* If there is a container type, whether it must be rw. */ MVMuint8 rw_cont; }; /* Statistics by bytecode offset. */ struct MVMSpeshStatsByOffset { /* The bytecode offset these types/values were recorded at. */ MVMuint32 bytecode_offset; /* Number of types recorded, with counts. */ MVMuint32 num_types; MVMSpeshStatsTypeCount *types; /* Number of invocation targets recorded, with counts. */ MVMuint32 num_invokes; MVMSpeshStatsInvokeCount *invokes; /* Number of type tuples recorded, with counts. (Type tuples are actually * recorded by the callee, and then also accumulated at the callsite of * the caller.) */ MVMuint32 num_type_tuples; MVMSpeshStatsTypeTupleCount *type_tuples; }; /* Counts of a given type that has shown up at a bytecode offset. */ struct MVMSpeshStatsTypeCount { /* The type and its concreteness. */ MVMObject *type; MVMuint8 type_concrete; /* The number of times we've seen it. */ MVMuint32 count; }; /* Counts of a given static frame that was invoked at a bytecode offset. */ struct MVMSpeshStatsInvokeCount { /* The static frame. */ MVMStaticFrame *sf; /* The number of times the caller frame was also the outer frame. */ MVMuint32 caller_is_outer_count; /* The number of times it was resolved from a multi-dispatch. */ MVMuint32 was_multi_count; /* The number of times we've seen it. */ MVMuint32 count; }; /* Counts of a given type tuple has shown up at the callsite at a bytecode * offset. */ struct MVMSpeshStatsTypeTupleCount { /* The callsite. */ MVMCallsite *cs; /* The type tuple. */ MVMSpeshStatsType *arg_types; /* The number of times we've seen it. */ MVMuint32 count; }; /* Static values table entry. */ struct MVMSpeshStatsStatic { /* The value. */ MVMObject *value; /* The bytecode offset it was recorded at. */ MVMint32 bytecode_offset; }; /* The maximum number of spesh stats updates before we consider a frame's * stats out of date and throw them out. */ #define MVM_SPESH_STATS_MAX_AGE 10 /* Logs are linear recordings marked with frame correlation IDs. We need to * simulate the call stack as part of the analysis. This is the model for the * stack simulation. */ struct MVMSpeshSimStack { /* Array of frames. */ MVMSpeshSimStackFrame *frames; /* Current frame index and allocated space. */ MVMuint32 used; MVMuint32 limit; /* Current stack depth. */ MVMuint32 depth; }; /* This is the model of a frame on the simulated stack. */ struct MVMSpeshSimStackFrame { /* The static frame. */ MVMStaticFrame *sf; /* Spesh stats for the stack frame. */ MVMSpeshStats *ss; /* Correlation ID. */ MVMuint32 cid; /* Callsite stats index (not pointer in case of realloc). */ MVMuint32 callsite_idx; /* Type stats index (not pointer in case of realloc); -1 if not yet set. * This is resolved once using arg_types, and then remembered, so we can * correlate the statistics across spesh log buffers. */ MVMint32 type_idx; /* Argument types logged. Sized by number of callsite flags. */ MVMSpeshStatsType *arg_types; /* Spesh log entries for types and values, for later processing. */ MVMSpeshLogEntry **offset_logs; MVMuint32 offset_logs_used; MVMuint32 offset_logs_limit; /* Type tuples observed at a given callsite offset, for later * processing. */ MVMSpeshSimCallType *call_type_info; MVMuint32 call_type_info_used; MVMuint32 call_type_info_limit; /* Number of times we crossed an OSR point. */ MVMuint32 osr_hits; /* The last bytecode offset and static frame seen in an invoke recording; * used for producing callsite type stats based on callee type tuples. */ MVMuint32 last_invoke_offset; MVMStaticFrame *last_invoke_sf; }; /* We associate recoded type tuples in callees with their caller's callsites. * This is kept as a flat view, and then folded in when the caller's sim * frame (see next) is popped. */ struct MVMSpeshSimCallType { MVMuint32 bytecode_offset; MVMCallsite *cs; MVMSpeshStatsType *arg_types; }; void MVM_spesh_stats_update(MVMThreadContext *tc, MVMSpeshLog *sl, MVMObject *sf_updated); void MVM_spesh_stats_cleanup(MVMThreadContext *tc, MVMObject *check_frames); void MVM_spesh_stats_gc_mark(MVMThreadContext *tc, MVMSpeshStats *ss, MVMGCWorklist *worklist); void MVM_spesh_stats_gc_describe(MVMThreadContext *tc, MVMHeapSnapshotState *snapshot, MVMSpeshStats *ss); void MVM_spesh_stats_destroy(MVMThreadContext *tc, MVMSpeshStats *ss); void MVM_spesh_sim_stack_gc_mark(MVMThreadContext *tc, MVMSpeshSimStack *sims, MVMGCWorklist *worklist); void MVM_spesh_sim_stack_gc_describe(MVMThreadContext *tc, MVMHeapSnapshotState *ss, MVMSpeshSimStack *sims); void MVM_spesh_sim_stack_destroy(MVMThreadContext *tc, MVMSpeshSimStack *sims); MoarVM-2018.03/src/spesh/threshold.c0000644000175000017510000000076113237701240017257 0ustar samanthasamantha#include "moar.h" /* Choose the threshold for a given static frame before we start applying * specialization to it. */ MVMuint32 MVM_spesh_threshold(MVMThreadContext *tc, MVMStaticFrame *sf) { MVMuint32 bs = sf->body.bytecode_size; if (tc->instance->spesh_nodelay) return 1; if (bs <= 256) return 100; else if (bs <= 512) return 150; else if (bs <= 2048) return 200; else if (bs <= 8192) return 250; else return 300; } MoarVM-2018.03/src/spesh/threshold.h0000644000175000017510000000026713237701240017265 0ustar samanthasamantha/* The maximum size of bytecode we'll ever attempt to optimize. */ #define MVM_SPESH_MAX_BYTECODE_SIZE 65536 MVMuint32 MVM_spesh_threshold(MVMThreadContext *tc, MVMStaticFrame *sf); MoarVM-2018.03/src/spesh/worker.c0000644000175000017510000001720513252330426016576 0ustar samanthasamantha#include "moar.h" /* The specialization worker thread receives logs from other threads about * calls and types that showed up at runtime. It uses this to produce * specialized versions of code. */ /* Enters the work loop. */ static void worker(MVMThreadContext *tc, MVMCallsite *callsite, MVMRegister *args) { MVMObject *updated_static_frames = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); MVMObject *previous_static_frames = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTArray); tc->instance->speshworker_thread_id = tc->thread_obj->body.thread_id; MVMROOT2(tc, updated_static_frames, previous_static_frames, { while (1) { MVMObject *log_obj; MVMuint64 start_time; unsigned int interval_id; if (tc->instance->spesh_log_fh) start_time = uv_hrtime(); log_obj = MVM_repr_shift_o(tc, tc->instance->spesh_queue); if (tc->instance->spesh_log_fh) { fprintf(tc->instance->spesh_log_fh, "Received Logs\n" "=============\n\n" "Was waiting %dus for logs on the log queue.\n\n", (int)((uv_hrtime() - start_time) / 1000)); } if (tc->instance->main_thread->prof_data) MVM_profiler_log_spesh_start(tc); interval_id = MVM_telemetry_interval_start(tc, "spesh worker consuming a log"); uv_mutex_lock(&(tc->instance->mutex_spesh_sync)); tc->instance->spesh_working = 1; uv_mutex_unlock(&(tc->instance->mutex_spesh_sync)); tc->instance->spesh_stats_version++; if (log_obj->st->REPR->ID == MVM_REPR_ID_MVMSpeshLog) { MVMSpeshLog *sl = (MVMSpeshLog *)log_obj; MVM_telemetry_interval_annotate((uintptr_t)sl->body.thread->body.tc, interval_id, "from this thread"); MVMROOT(tc, sl, { MVMThreadContext *stc; MVMuint32 i; MVMuint32 n; /* Update stats, and if we're logging dump each of them. */ tc->instance->spesh_stats_version++; if (tc->instance->spesh_log_fh) start_time = uv_hrtime(); MVM_spesh_stats_update(tc, sl, updated_static_frames); n = MVM_repr_elems(tc, updated_static_frames); if (tc->instance->spesh_log_fh) { fprintf(tc->instance->spesh_log_fh, "Statistics Updated\n" "==================\n" "%d frames had their statistics updated in %dus.\n\n", (int)n, (int)((uv_hrtime() - start_time) / 1000)); for (i = 0; i < n; i++) { char *dump = MVM_spesh_dump_stats(tc, (MVMStaticFrame* ) MVM_repr_at_pos_o(tc, updated_static_frames, i)); fprintf(tc->instance->spesh_log_fh, "%s==========\n\n", dump); MVM_free(dump); } } MVM_telemetry_interval_annotate((uintptr_t)n, interval_id, "stats for this many frames"); GC_SYNC_POINT(tc); /* Form a specialization plan. */ if (tc->instance->spesh_log_fh) start_time = uv_hrtime(); tc->instance->spesh_plan = MVM_spesh_plan(tc, updated_static_frames); if (tc->instance->spesh_log_fh) { n = tc->instance->spesh_plan->num_planned; fprintf(tc->instance->spesh_log_fh, "Specialization Plan\n" "===================\n" "%u specialization(s) will be produced (planned in %dus).\n\n", n, (int)((uv_hrtime() - start_time) / 1000)); for (i = 0; i < n; i++) { char *dump = MVM_spesh_dump_planned(tc, &(tc->instance->spesh_plan->planned[i])); fprintf(tc->instance->spesh_log_fh, "%s==========\n\n", dump); MVM_free(dump); } } MVM_telemetry_interval_annotate((uintptr_t)tc->instance->spesh_plan->num_planned, interval_id, "this many specializations planned"); GC_SYNC_POINT(tc); /* Implement the plan and then discard it. */ n = tc->instance->spesh_plan->num_planned; for (i = 0; i < n; i++) { MVM_spesh_candidate_add(tc, &(tc->instance->spesh_plan->planned[i])); GC_SYNC_POINT(tc); } MVM_spesh_plan_destroy(tc, tc->instance->spesh_plan); tc->instance->spesh_plan = NULL; /* Clear up stats that didn't get updated for a while, * then add frames updated this time into the previously * updated array. */ MVM_spesh_stats_cleanup(tc, previous_static_frames); n = MVM_repr_elems(tc, updated_static_frames); for (i = 0; i < n; i++) MVM_repr_push_o(tc, previous_static_frames, MVM_repr_at_pos_o(tc, updated_static_frames, i)); /* Clear updated static frames array. */ MVM_repr_pos_set_elems(tc, updated_static_frames, 0); /* Allow the sending thread to produce more logs again, * putting a new spesh log in place if needed. */ stc = sl->body.thread->body.tc; if (stc && !sl->body.was_compunit_bumped) if (MVM_incr(&(stc->spesh_log_quota)) == 0) { stc->spesh_log = MVM_spesh_log_create(tc, sl->body.thread); MVM_telemetry_timestamp(stc, "logging restored after quota had run out"); } /* If needed, signal sending thread that it can continue. */ if (sl->body.block_mutex) { uv_mutex_lock(sl->body.block_mutex); MVM_store(&(sl->body.completed), 1); uv_cond_signal(sl->body.block_condvar); uv_mutex_unlock(sl->body.block_mutex); } }); } else { MVM_panic(1, "Unexpected object sent to specialization worker"); } MVM_telemetry_interval_stop(tc, interval_id, "spesh worker finished"); if (tc->instance->main_thread->prof_data) MVM_profiler_log_spesh_end(tc); uv_mutex_lock(&(tc->instance->mutex_spesh_sync)); tc->instance->spesh_working = 0; uv_cond_broadcast(&(tc->instance->cond_spesh_sync)); uv_mutex_unlock(&(tc->instance->mutex_spesh_sync)); } }); } void MVM_spesh_worker_setup(MVMThreadContext *tc) { if (tc->instance->spesh_enabled) { MVMObject *worker_entry_point; tc->instance->spesh_queue = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTQueue); worker_entry_point = MVM_repr_alloc_init(tc, tc->instance->boot_types.BOOTCCode); ((MVMCFunction *)worker_entry_point)->body.func = worker; MVM_thread_run(tc, MVM_thread_new(tc, worker_entry_point, 1)); } } MoarVM-2018.03/src/spesh/worker.h0000644000175000017510000000006313237701240016574 0ustar samanthasamanthavoid MVM_spesh_worker_setup(MVMThreadContext *tc); MoarVM-2018.03/src/strings/ascii.c0000644000175000017510000001774513237701241016735 0ustar samanthasamantha#include "moar.h" /* Decodes the specified number of bytes of ASCII into an NFG string, creating * a result of the specified type. The type must have the MVMString REPR. */ MVMString * MVM_string_ascii_decode(MVMThreadContext *tc, const MVMObject *result_type, const char *ascii, size_t bytes) { MVMString *result = (MVMString *)REPR(result_type)->allocate(tc, STABLE(result_type)); size_t i, result_graphs; result->body.storage_type = MVM_STRING_GRAPHEME_32; result->body.storage.blob_32 = MVM_malloc(sizeof(MVMGrapheme32) * bytes); result_graphs = 0; for (i = 0; i < bytes; i++) { if (ascii[i] == '\r' && i + 1 < bytes && ascii[i + 1] == '\n') { result->body.storage.blob_32[result_graphs++] = MVM_nfg_crlf_grapheme(tc); i++; } else if (ascii[i] >= 0) { result->body.storage.blob_32[result_graphs++] = ascii[i]; } else { MVM_exception_throw_adhoc(tc, "Will not decode invalid ASCII (code point > 127 found)"); } } result->body.num_graphs = result_graphs; return result; } /* Decodes a NULL-terminated ASCII string into an NFG string, creating * a result of the specified type. The type must have the MVMString REPR. */ MVMString * MVM_string_ascii_decode_nt(MVMThreadContext *tc, const MVMObject *result_type, const char *ascii) { return MVM_string_ascii_decode(tc, result_type, ascii, strlen(ascii)); } /* Decodes using a decodestream. Decodes as far as it can with the input * buffers, or until a stopper is reached. */ MVMuint32 MVM_string_ascii_decodestream(MVMThreadContext *tc, MVMDecodeStream *ds, const MVMint32 *stopper_chars, MVMDecodeStreamSeparators *seps) { MVMint32 count = 0, total = 0; MVMint32 bufsize; MVMGrapheme32 *buffer; MVMDecodeStreamBytes *cur_bytes; MVMDecodeStreamBytes *last_accept_bytes = ds->bytes_head; MVMint32 last_accept_pos, last_was_cr; MVMuint32 reached_stopper; /* If there's no buffers, we're done. */ if (!ds->bytes_head) return 0; last_accept_pos = ds->bytes_head_pos; /* If we're asked for zero chars, also done. */ if (stopper_chars && *stopper_chars == 0) return 1; bufsize = ds->result_size_guess; buffer = MVM_malloc(bufsize * sizeof(MVMGrapheme32)); /* Decode each of the buffers. */ cur_bytes = ds->bytes_head; last_was_cr = 0; reached_stopper = 0; while (cur_bytes) { /* Process this buffer. */ MVMint32 pos = cur_bytes == ds->bytes_head ? ds->bytes_head_pos : 0; MVMuint8 *bytes = cur_bytes->bytes; while (pos < cur_bytes->length) { MVMCodepoint codepoint = bytes[pos++]; MVMGrapheme32 graph; if (codepoint > 127) MVM_exception_throw_adhoc(tc, "Will not decode invalid ASCII (code point > 127 found)"); if (last_was_cr) { if (codepoint == '\n') { graph = MVM_unicode_normalizer_translated_crlf(tc, &(ds->norm)); } else { graph = '\r'; pos--; } last_was_cr = 0; } else if (codepoint == '\r') { last_was_cr = 1; continue; } else { graph = codepoint; } if (count == bufsize) { /* We filled the buffer. Attach this one to the buffers * linked list, and continue with a new one. */ MVM_string_decodestream_add_chars(tc, ds, buffer, bufsize); buffer = MVM_malloc(bufsize * sizeof(MVMGrapheme32)); count = 0; } buffer[count++] = graph; last_accept_bytes = cur_bytes; last_accept_pos = pos; total++; if (MVM_string_decode_stream_maybe_sep(tc, seps, codepoint)) { reached_stopper = 1; goto done; } else if (stopper_chars && *stopper_chars == total) { reached_stopper = 1; goto done; } } cur_bytes = cur_bytes->next; } done: /* Attach what we successfully parsed as a result buffer, and trim away * what we chewed through. */ if (count) { MVM_string_decodestream_add_chars(tc, ds, buffer, count); } else { MVM_free(buffer); } MVM_string_decodestream_discard_to(tc, ds, last_accept_bytes, last_accept_pos); return reached_stopper; } /* Encodes the specified substring to ASCII. Anything outside of ASCII range * will become replaced with the supplied replacement, or an exception will be * thrown if there isn't one. The result string is NULL terminated, but the * specified size is the non-null part. */ char * MVM_string_ascii_encode_substr(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint64 start, MVMint64 length, MVMString *replacement, MVMint32 translate_newlines) { /* ASCII is a single byte encoding, but \r\n is a 2-byte grapheme, so we * may have to resize as we go. */ MVMStringIndex strgraphs = MVM_string_graphs(tc, str); MVMuint32 lengthu = (MVMuint32)(length == -1 ? strgraphs - (MVMuint32)start : length); MVMuint8 *result; size_t result_alloc; MVMuint8 *repl_bytes = NULL; MVMuint64 repl_length; /* must check start first since it's used in the length check */ if (start < 0 || start > strgraphs) MVM_exception_throw_adhoc(tc, "start out of range"); if (length < -1 || start + lengthu > strgraphs) MVM_exception_throw_adhoc(tc, "length out of range"); if (replacement) repl_bytes = (MVMuint8 *) MVM_string_ascii_encode_substr(tc, replacement, &repl_length, 0, -1, NULL, translate_newlines); result_alloc = lengthu; result = MVM_malloc(result_alloc + 1); if (str->body.storage_type == MVM_STRING_GRAPHEME_ASCII) { /* No encoding needed; directly copy. */ memcpy(result, str->body.storage.blob_ascii, lengthu); result[lengthu] = 0; if (output_size) *output_size = lengthu; } else { MVMuint32 i = 0; MVMCodepointIter ci; MVM_string_ci_init(tc, &ci, str, translate_newlines, 0); while (MVM_string_ci_has_more(tc, &ci)) { MVMCodepoint ord = MVM_string_ci_get_codepoint(tc, &ci); if (i == result_alloc) { result_alloc += 8; result = MVM_realloc(result, result_alloc + 1); } if (0 <= ord && ord <= 127) { result[i] = (MVMuint8)ord; i++; } else if (replacement) { if (repl_length >= result_alloc || i >= result_alloc - repl_length) { result_alloc += repl_length; result = MVM_realloc(result, result_alloc + 1); } memcpy(result + i, repl_bytes, repl_length); i += repl_length; } else { MVM_free(result); MVM_free(repl_bytes); MVM_exception_throw_adhoc(tc, "Error encoding ASCII string: could not encode codepoint %d", ord); } } result[i] = 0; if (output_size) *output_size = i; } MVM_free(repl_bytes); return (char *)result; } /* Encodes the specified string to ASCII. */ char * MVM_string_ascii_encode(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint32 translate_newlines) { return MVM_string_ascii_encode_substr(tc, str, output_size, 0, -1, NULL, translate_newlines); } /* Encodes the specified string to ASCII not returning length. */ char * MVM_string_ascii_encode_any(MVMThreadContext *tc, MVMString *str) { return MVM_string_ascii_encode(tc, str, NULL, 0); } MoarVM-2018.03/src/strings/ascii.h0000644000175000017510000000146413237701241016731 0ustar samanthasamanthaMVM_PUBLIC MVMString * MVM_string_ascii_decode(MVMThreadContext *tc, const MVMObject *result_type, const char *ascii, size_t bytes); MVM_PUBLIC MVMString * MVM_string_ascii_decode_nt(MVMThreadContext *tc, const MVMObject *result_type, const char *ascii); MVM_PUBLIC MVMuint32 MVM_string_ascii_decodestream(MVMThreadContext *tc, MVMDecodeStream *ds, const MVMint32 *stopper_chars, MVMDecodeStreamSeparators *seps); MVM_PUBLIC char * MVM_string_ascii_encode_substr(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint64 start, MVMint64 length, MVMString *replacement, MVMint32 translate_newlines); MVM_PUBLIC char * MVM_string_ascii_encode(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint32 translate_newlines); char * MVM_string_ascii_encode_any(MVMThreadContext *tc, MVMString *str); MoarVM-2018.03/src/strings/decode_stream.c0000644000175000017510000006533213251137566020447 0ustar samanthasamantha#include "moar.h" /* A decode stream represents an on-going decoding process, from bytes into * characters. Bytes can be contributed to the decode stream, and chars can be * obtained. Byte buffers and decoded char buffers are kept in linked lists. * Note that characters may start at the end of one byte buffer and finish in * the next, which is taken care of by the logic in here and the decoders * themselves. Additionally, normalization may be applied using the normalizer * in the decode stream, at the discretion of the encoding in question (some, * such as ASCII and Latin-1, are normalized by definition). */ #define DECODE_NOT_EOF 0 #define DECODE_EOF 1 /* Creates a new decoding stream. */ MVMDecodeStream * MVM_string_decodestream_create(MVMThreadContext *tc, MVMint32 encoding, MVMint64 abs_byte_pos, MVMint32 translate_newlines) { MVMDecodeStream *ds = MVM_calloc(1, sizeof(MVMDecodeStream)); ds->encoding = encoding; ds->abs_byte_pos = abs_byte_pos; MVM_unicode_normalizer_init(tc, &(ds->norm), MVM_NORMALIZE_NFG); if (translate_newlines) MVM_unicode_normalizer_translate_newlines(tc, &(ds->norm)); ds->result_size_guess = 64; return ds; } /* Adds another byte buffer into the decoding stream. */ void MVM_string_decodestream_add_bytes(MVMThreadContext *tc, MVMDecodeStream *ds, char *bytes, MVMint32 length) { if (length > 0) { MVMDecodeStreamBytes *new_bytes = MVM_calloc(1, sizeof(MVMDecodeStreamBytes)); new_bytes->bytes = bytes; new_bytes->length = length; if (ds->bytes_tail) ds->bytes_tail->next = new_bytes; ds->bytes_tail = new_bytes; if (!ds->bytes_head) ds->bytes_head = new_bytes; } else { /* It's empty, so free the buffer right away and don't add. */ MVM_free(bytes); } } /* Adds another char result buffer into the decoding stream. */ void MVM_string_decodestream_add_chars(MVMThreadContext *tc, MVMDecodeStream *ds, MVMGrapheme32 *chars, MVMint32 length) { MVMDecodeStreamChars *new_chars; if (ds->chars_reuse) { new_chars = ds->chars_reuse; ds->chars_reuse = NULL; } else { new_chars = MVM_malloc(sizeof(MVMDecodeStreamChars)); } new_chars->chars = chars; new_chars->length = length; new_chars->next = NULL; if (ds->chars_tail) ds->chars_tail->next = new_chars; ds->chars_tail = new_chars; if (!ds->chars_head) ds->chars_head = new_chars; } /* Internal function to free a chars result structure, putting it into the * re-use slot if it's empty. */ static void free_chars(MVMThreadContext *tc, MVMDecodeStream *ds, MVMDecodeStreamChars *chars) { if (ds->chars_reuse) MVM_free(chars); else ds->chars_reuse = chars; } /* Throws away byte buffers no longer needed. */ void MVM_string_decodestream_discard_to(MVMThreadContext *tc, MVMDecodeStream *ds, const MVMDecodeStreamBytes *bytes, MVMint32 pos) { while (ds->bytes_head != bytes) { MVMDecodeStreamBytes *discard = ds->bytes_head; ds->abs_byte_pos += discard->length - ds->bytes_head_pos; ds->bytes_head = discard->next; ds->bytes_head_pos = 0; MVM_free(discard->bytes); MVM_free(discard); } if (!ds->bytes_head && pos == 0) return; if (ds->bytes_head->length == pos) { /* We ate all of the new head buffer too; also free it. */ MVMDecodeStreamBytes *discard = ds->bytes_head; ds->abs_byte_pos += discard->length - ds->bytes_head_pos; ds->bytes_head = discard->next; ds->bytes_head_pos = 0; MVM_free(discard->bytes); MVM_free(discard); if (ds->bytes_head == NULL) ds->bytes_tail = NULL; } else { ds->abs_byte_pos += pos - ds->bytes_head_pos; ds->bytes_head_pos = pos; } } /* Does a decode run, selected by encoding. Returns non-zero if we actually * decoded more chars. */ #define RUN_DECODE_NOTHING_DECODED 0 #define RUN_DECODE_STOPPER_NOT_REACHED 1 #define RUN_DECODE_STOPPER_REACHED 2 static MVMuint32 run_decode(MVMThreadContext *tc, MVMDecodeStream *ds, const MVMint32 *stopper_chars, MVMDecodeStreamSeparators *sep_spec, MVMint32 eof) { MVMDecodeStreamChars *prev_chars_tail = ds->chars_tail; MVMuint32 reached_stopper; switch (ds->encoding) { case MVM_encoding_type_utf8: reached_stopper = MVM_string_utf8_decodestream(tc, ds, stopper_chars, sep_spec); break; case MVM_encoding_type_ascii: reached_stopper = MVM_string_ascii_decodestream(tc, ds, stopper_chars, sep_spec); break; case MVM_encoding_type_latin1: reached_stopper = MVM_string_latin1_decodestream(tc, ds, stopper_chars, sep_spec); break; case MVM_encoding_type_windows1252: reached_stopper = MVM_string_windows1252_decodestream(tc, ds, stopper_chars, sep_spec); break; case MVM_encoding_type_windows1251: reached_stopper = MVM_string_windows1251_decodestream(tc, ds, stopper_chars, sep_spec); break; case MVM_encoding_type_utf8_c8: reached_stopper = MVM_string_utf8_c8_decodestream(tc, ds, stopper_chars, sep_spec, eof); break; default: MVM_exception_throw_adhoc(tc, "Streaming decode NYI for encoding %d", (int)ds->encoding); } if (ds->chars_tail == prev_chars_tail) return RUN_DECODE_NOTHING_DECODED; else if (reached_stopper) return RUN_DECODE_STOPPER_REACHED; else return RUN_DECODE_STOPPER_NOT_REACHED; } /* In situations where we have hit EOF, we need to decode what's left and flush * the normalization buffer also. */ static void reached_eof(MVMThreadContext *tc, MVMDecodeStream *ds) { /* Decode all the things. */ if (ds->bytes_head) run_decode(tc, ds, NULL, NULL, DECODE_EOF); /* If there's some things left in the normalization buffer, take them. */ MVM_unicode_normalizer_eof(tc, &(ds->norm)); if (MVM_unicode_normalizer_available(tc, &(ds->norm))) { MVMint32 ready = MVM_unicode_normalizer_available(tc, &(ds->norm)); MVMGrapheme32 *buffer = MVM_malloc(ready * sizeof(MVMGrapheme32)); MVMint32 count = 0; while (ready--) buffer[count++] = MVM_unicode_normalizer_get_grapheme(tc, &(ds->norm)); MVM_string_decodestream_add_chars(tc, ds, buffer, count); } } /* Gets the specified number of characters. If we are not yet able to decode * that many, returns NULL. This may mean more input buffers are needed. The * exclude parameter specifies a number of chars that should be taken from the * input buffer, but not included in the result string (for chomping a line * separator). */ static MVMint32 missing_chars(MVMThreadContext *tc, const MVMDecodeStream *ds, MVMint32 wanted) { MVMint32 got = 0; MVMDecodeStreamChars *cur_chars = ds->chars_head; while (cur_chars && got < wanted) { if (cur_chars == ds->chars_head) got += cur_chars->length - ds->chars_head_pos; else got += cur_chars->length; cur_chars = cur_chars->next; } return got >= wanted ? 0 : wanted - got; } static MVMString * take_chars(MVMThreadContext *tc, MVMDecodeStream *ds, MVMint32 chars, MVMint32 exclude) { MVMString *result; MVMint32 found = 0; MVMint32 result_found = 0; MVMint32 result_chars = chars - exclude; if (result_chars < 0) MVM_exception_throw_adhoc(tc, "DecodeStream take_chars: chars - exclude < 0 should never happen"); result = (MVMString *)MVM_repr_alloc_init(tc, tc->instance->VMString); result->body.storage_type = MVM_STRING_GRAPHEME_32; result->body.num_graphs = result_chars; /* In the best case, the head char buffer has exactly what we need. This * will typically happen when it a steady state of decoding lines. */ if (ds->chars_head->length == chars && ds->chars_head_pos == 0) { MVMDecodeStreamChars *cur_chars = ds->chars_head; result->body.storage.blob_32 = cur_chars->chars; ds->chars_head = cur_chars->next; if (ds->chars_head == NULL) ds->chars_tail = NULL; free_chars(tc, ds, cur_chars); } /* Otherwise, need to take and copy. */ else { result->body.storage.blob_32 = MVM_malloc(result_chars * sizeof(MVMGrapheme32)); while (found < chars) { MVMDecodeStreamChars *cur_chars = ds->chars_head; MVMint32 available = cur_chars->length - ds->chars_head_pos; if (available <= chars - found) { /* We need all that's left in this buffer and likely * more. */ MVMDecodeStreamChars *next_chars = cur_chars->next; if (available <= result_chars - result_found) { memcpy(result->body.storage.blob_32 + result_found, cur_chars->chars + ds->chars_head_pos, available * sizeof(MVMGrapheme32)); result_found += available; } else { MVMint32 to_copy = result_chars - result_found; memcpy(result->body.storage.blob_32 + result_found, cur_chars->chars + ds->chars_head_pos, to_copy * sizeof(MVMGrapheme32)); result_found += to_copy; } found += available; MVM_free(cur_chars->chars); free_chars(tc, ds, cur_chars); ds->chars_head = next_chars; ds->chars_head_pos = 0; if (ds->chars_head == NULL) ds->chars_tail = NULL; } else { /* There's enough in this buffer to satisfy us, and we'll leave * some behind. */ MVMint32 take = chars - found; MVMint32 to_copy = result_chars - result_found; memcpy(result->body.storage.blob_32 + result_found, cur_chars->chars + ds->chars_head_pos, to_copy * sizeof(MVMGrapheme32)); result_found += to_copy; found += take; ds->chars_head_pos += take; } } } return result; } MVMString * MVM_string_decodestream_get_chars(MVMThreadContext *tc, MVMDecodeStream *ds, MVMint32 chars, MVMint64 eof) { MVMint32 missing; /* If we request nothing, give empty string. */ if (chars == 0) return tc->instance->str_consts.empty; /* If we don't already have enough chars, try and decode more. */ missing = missing_chars(tc, ds, chars); ds->result_size_guess = missing; if (missing) run_decode(tc, ds, &missing, NULL, DECODE_NOT_EOF); /* If we've got enough, assemble a string. Otherwise, flag EOF and retry, * falling back to returning what's available. */ if (missing_chars(tc, ds, chars) == 0) { return take_chars(tc, ds, chars, 0); } else if (eof) { reached_eof(tc, ds); return missing_chars(tc, ds, chars) == 0 ? take_chars(tc, ds, chars, 0) : MVM_string_decodestream_get_all(tc, ds); } else { return NULL; } } /* Gets characters up until one of the specified separators is encountered. If * we do not encounter it, returns 0. This may mean more input buffers are needed * or that we reached the end of the stream. Note that it assumes the separator * will exist near the end of the buffer, if it occurs at all, due to decode * streams looking for stoppers. */ static MVMint32 have_separator(MVMThreadContext *tc, MVMDecodeStreamChars *start_chars, MVMint32 start_pos, MVMDecodeStreamSeparators *sep_spec, MVMint32 sep_idx, MVMint32 sep_graph_pos) { MVMint32 sep_pos = 1; MVMint32 sep_length = sep_spec->sep_lengths[sep_idx]; MVMDecodeStreamChars *cur_chars = start_chars; while (cur_chars) { MVMint32 start = cur_chars == start_chars ? start_pos : 0; MVMint32 i; for (i = start; i < cur_chars->length; i++) { if (cur_chars->chars[i] != sep_spec->sep_graphemes[sep_graph_pos]) return 0; sep_pos++; if (sep_pos == sep_length) return 1; sep_graph_pos++; } cur_chars = cur_chars->next; } return 0; } static MVMint32 find_separator(MVMThreadContext *tc, const MVMDecodeStream *ds, MVMDecodeStreamSeparators *sep_spec, MVMint32 *sep_length, int eof) { MVMint32 sep_loc = 0; MVMDecodeStreamChars *cur_chars = ds->chars_head; /* First, skip over any buffers we need not consider. */ MVMint32 max_sep_length = sep_spec->max_sep_length; while (cur_chars && cur_chars->next) { if (cur_chars->next->length < max_sep_length) break; sep_loc += cur_chars->length; cur_chars = cur_chars->next; } /* Now scan for the separator. */ while (cur_chars) { MVMint32 i, j; MVMint32 start; if (eof) { start = cur_chars == ds->chars_head ? ds->chars_head_pos : 0; } else { start = cur_chars->length - max_sep_length; if (cur_chars == ds->chars_head) { if (start >= ds->chars_head_pos) sep_loc += start - ds->chars_head_pos; else start = ds->chars_head_pos; } else { if (start >= 0) sep_loc += start; else start = 0; } } for (i = start; i < cur_chars->length; i++) { MVMint32 sep_graph_pos = 0; MVMGrapheme32 cur_char = cur_chars->chars[i]; sep_loc++; for (j = 0; j < sep_spec->num_seps; j++) { if (sep_spec->sep_graphemes[sep_graph_pos] == cur_char) { if (sep_spec->sep_lengths[j] == 1) { *sep_length = 1; return sep_loc; } else if (have_separator(tc, cur_chars, i + 1, sep_spec, j, sep_graph_pos + 1)) { *sep_length = sep_spec->sep_lengths[j]; sep_loc += sep_spec->sep_lengths[j] - 1; return sep_loc; } } sep_graph_pos += sep_spec->sep_lengths[j]; } } cur_chars = cur_chars->next; } return 0; } MVMString * MVM_string_decodestream_get_until_sep(MVMThreadContext *tc, MVMDecodeStream *ds, MVMDecodeStreamSeparators *sep_spec, MVMint32 chomp) { MVMint32 sep_loc, sep_length; /* Look for separator, trying more decoding if it fails. We get the place * just beyond the separator, so can use take_chars to get what's need. * Note that decoders are only responsible for finding the final char of * the separator, so we may need to loop a few times around this. */ sep_loc = find_separator(tc, ds, sep_spec, &sep_length, 0); while (!sep_loc) { MVMuint32 decode_outcome = run_decode(tc, ds, NULL, sep_spec, DECODE_NOT_EOF); if (decode_outcome == RUN_DECODE_NOTHING_DECODED) break; if (decode_outcome == RUN_DECODE_STOPPER_REACHED) sep_loc = find_separator(tc, ds, sep_spec, &sep_length, 0); } if (sep_loc) { /* Use this line length as a guesstimate of the next, unless it's tiny * in which case we treat it as an outlier (probably an empty line or * some such). Also round up and to a nice power of 2. */ if (sep_loc > 32) ds->result_size_guess = (sep_loc << 1) & ~0xF; return take_chars(tc, ds, sep_loc, chomp ? sep_length : 0); } else { return NULL; } } /* Variant of MVM_string_decodestream_get_until_sep that is called when we * reach EOF. Trims the final separator if there is one, or returns the last * line without the EOF marker. */ MVMString * MVM_string_decodestream_get_until_sep_eof(MVMThreadContext *tc, MVMDecodeStream *ds, MVMDecodeStreamSeparators *sep_spec, MVMint32 chomp) { MVMint32 sep_loc, sep_length; /* Decode anything remaining and flush normalization buffer. */ reached_eof(tc, ds); /* Look for separator, which should by now be at the end, and chomp it * off if needed. */ sep_loc = find_separator(tc, ds, sep_spec, &sep_length, 1); if (sep_loc) return take_chars(tc, ds, sep_loc, chomp ? sep_length : 0); /* Otherwise, take all remaining chars. */ return MVM_string_decodestream_get_all(tc, ds); } /* Produces a string consisting of the characters available now in all decdoed * buffers. */ static MVMString * get_all_in_buffer(MVMThreadContext *tc, MVMDecodeStream *ds) { MVMString *result = (MVMString *)MVM_repr_alloc_init(tc, tc->instance->VMString); result->body.storage_type = MVM_STRING_GRAPHEME_32; /* If there's no codepoint buffer, then return the empty string. */ if (!ds->chars_head) { result->body.storage.blob_32 = NULL; result->body.num_graphs = 0; } /* If there's exactly one resulting codepoint buffer and we swallowed none * of it, just use it. */ else if (ds->chars_head == ds->chars_tail && ds->chars_head_pos == 0) { /* Set up result string. */ result->body.storage.blob_32 = ds->chars_head->chars; result->body.num_graphs = ds->chars_head->length; /* Don't free the buffer's memory itself, just the holder, as we * stole that for the buffer into the string above. */ free_chars(tc, ds, ds->chars_head); ds->chars_head = ds->chars_tail = NULL; } /* Otherwise, need to assemble all the things. */ else { /* Calculate length. */ MVMint32 length = 0, pos = 0; MVMDecodeStreamChars *cur_chars = ds->chars_head; while (cur_chars) { if (cur_chars == ds->chars_head) length += cur_chars->length - ds->chars_head_pos; else length += cur_chars->length; cur_chars = cur_chars->next; } /* Allocate a result buffer of the right size. */ result->body.storage.blob_32 = MVM_malloc(length * sizeof(MVMGrapheme32)); result->body.num_graphs = length; /* Copy all the things into the target, freeing as we go. */ cur_chars = ds->chars_head; while (cur_chars) { MVMDecodeStreamChars *next_chars = cur_chars->next; if (cur_chars == ds->chars_head) { MVMint32 to_copy = ds->chars_head->length - ds->chars_head_pos; memcpy(result->body.storage.blob_32 + pos, cur_chars->chars + ds->chars_head_pos, to_copy * sizeof(MVMGrapheme32)); pos += to_copy; } else { memcpy(result->body.storage.blob_32 + pos, cur_chars->chars, cur_chars->length * sizeof(MVMGrapheme32)); pos += cur_chars->length; } MVM_free(cur_chars->chars); free_chars(tc, ds, cur_chars); cur_chars = next_chars; } ds->chars_head = ds->chars_tail = NULL; } return result; } /* Decodes all the buffers, signals EOF to flush any normalization buffers, and * returns a string of all decoded chars. */ MVMString * MVM_string_decodestream_get_all(MVMThreadContext *tc, MVMDecodeStream *ds) { reached_eof(tc, ds); return get_all_in_buffer(tc, ds); } /* Decodes all the buffers we have, and returns a string of all decoded chars. * There may still be more to read after this, due to incomplete multi-byte * or multi-codepoint sequences that are not yet completely processed. */ MVMString * MVM_string_decodestream_get_available(MVMThreadContext *tc, MVMDecodeStream *ds) { if (ds->bytes_head) { ds->result_size_guess = ds->bytes_head->length; run_decode(tc, ds, NULL, NULL, DECODE_NOT_EOF); } return get_all_in_buffer(tc, ds); } /* Checks if we have the number of bytes requested. */ MVMint64 MVM_string_decodestream_have_bytes(MVMThreadContext *tc, const MVMDecodeStream *ds, MVMint32 bytes) { MVMDecodeStreamBytes *cur_bytes = ds->bytes_head; MVMint32 found = 0; while (cur_bytes) { found += cur_bytes == ds->bytes_head ? cur_bytes->length - ds->bytes_head_pos : cur_bytes->length; if (found >= bytes) return 1; cur_bytes = cur_bytes->next; } return 0; } /* Gets the number of bytes available. */ MVMint64 MVM_string_decodestream_bytes_available(MVMThreadContext *tc, const MVMDecodeStream *ds) { MVMDecodeStreamBytes *cur_bytes = ds->bytes_head; MVMint32 available = 0; while (cur_bytes) { available += cur_bytes == ds->bytes_head ? cur_bytes->length - ds->bytes_head_pos : cur_bytes->length; cur_bytes = cur_bytes->next; } return available; } /* Copies up to the requested number of bytes into the supplied buffer, and * returns the number of bytes we actually copied. Takes from from the start * of the stream. */ MVMint64 MVM_string_decodestream_bytes_to_buf(MVMThreadContext *tc, MVMDecodeStream *ds, char **buf, MVMint32 bytes) { MVMint32 taken = 0; *buf = NULL; while (taken < bytes && ds->bytes_head) { /* Take what we can. */ MVMDecodeStreamBytes *cur_bytes = ds->bytes_head; MVMint32 required = bytes - taken; MVMint32 available = cur_bytes->length - ds->bytes_head_pos; if (available <= required) { /* Take everything in this buffer and remove it. */ if (!*buf) *buf = MVM_malloc(cur_bytes->next ? bytes : available); memcpy(*buf + taken, cur_bytes->bytes + ds->bytes_head_pos, available); taken += available; ds->bytes_head = cur_bytes->next; ds->bytes_head_pos = 0; MVM_free(cur_bytes->bytes); MVM_free(cur_bytes); } else { /* Just take what we need. */ if (!*buf) *buf = MVM_malloc(required); memcpy(*buf + taken, cur_bytes->bytes + ds->bytes_head_pos, required); taken += required; ds->bytes_head_pos += required; } } if (ds->bytes_head == NULL) ds->bytes_tail = NULL; ds->abs_byte_pos += taken; return taken; } /* Gets the absolute byte offset (the amount we started with plus what we've * chewed and handed back in decoded characters). */ MVMint64 MVM_string_decodestream_tell_bytes(MVMThreadContext *tc, const MVMDecodeStream *ds) { return ds->abs_byte_pos; } /* Checks if the decode stream is empty. */ MVMint32 MVM_string_decodestream_is_empty(MVMThreadContext *tc, MVMDecodeStream *ds) { return !ds->bytes_head && !ds->chars_head && MVM_unicode_normalizer_empty(tc, &(ds->norm)); } /* Destroys a decoding stream, freeing all associated memory (including the * buffers). */ void MVM_string_decodestream_destroy(MVMThreadContext *tc, MVMDecodeStream *ds) { MVMDecodeStreamBytes *cur_bytes = ds->bytes_head; MVMDecodeStreamChars *cur_chars = ds->chars_head; while (cur_bytes) { MVMDecodeStreamBytes *next_bytes = cur_bytes->next; MVM_free(cur_bytes->bytes); MVM_free(cur_bytes); cur_bytes = next_bytes; } while (cur_chars) { MVMDecodeStreamChars *next_chars = cur_chars->next; MVM_free(cur_chars->chars); MVM_free(cur_chars); cur_chars = next_chars; } MVM_unicode_normalizer_cleanup(tc, &(ds->norm)); MVM_free(ds->decoder_state); MVM_free(ds->chars_reuse); MVM_free(ds); } /* Calculates and caches various bits of information about separators, for * faster line reading. */ static void cache_sep_info(MVMThreadContext *tc, MVMDecodeStreamSeparators *sep_spec) { MVMGrapheme32 *final_graphemes = MVM_malloc(sep_spec->num_seps * sizeof(MVMGrapheme32)); MVMint32 max_final_grapheme = -1; MVMint32 max_sep_length = 1; MVMint32 cur_sep_pos = 0; MVMint32 i; for (i = 0; i < sep_spec->num_seps; i++) { MVMint32 length = sep_spec->sep_lengths[i]; if (length > max_sep_length) max_sep_length = length; cur_sep_pos += length; final_graphemes[i] = sep_spec->sep_graphemes[cur_sep_pos - 1]; if (final_graphemes[i] > max_final_grapheme) max_final_grapheme = final_graphemes[i]; } sep_spec->max_sep_length = max_sep_length; sep_spec->final_graphemes = final_graphemes; sep_spec->max_final_grapheme = max_final_grapheme; } /* Sets a decode stream separator to its default value. */ void MVM_string_decode_stream_sep_default(MVMThreadContext *tc, MVMDecodeStreamSeparators *sep_spec) { sep_spec->num_seps = 2; sep_spec->sep_lengths = MVM_malloc(sep_spec->num_seps * sizeof(MVMint32)); sep_spec->sep_graphemes = MVM_malloc(sep_spec->num_seps * sizeof(MVMGrapheme32)); sep_spec->sep_lengths[0] = 1; sep_spec->sep_graphemes[0] = '\n'; sep_spec->sep_lengths[1] = 1; sep_spec->sep_graphemes[1] = MVM_nfg_crlf_grapheme(tc); cache_sep_info(tc, sep_spec); } /* Takes a string and sets it up as a decode stream separator. */ void MVM_string_decode_stream_sep_from_strings(MVMThreadContext *tc, MVMDecodeStreamSeparators *sep_spec, MVMString **seps, MVMint32 num_seps) { MVMGraphemeIter gi; MVMint32 i, graph_length, graph_pos; if (num_seps > 0xFFF) MVM_exception_throw_adhoc(tc, "Too many line separators"); MVM_free(sep_spec->sep_lengths); MVM_free(sep_spec->sep_graphemes); MVM_free(sep_spec->final_graphemes); sep_spec->num_seps = num_seps; sep_spec->sep_lengths = MVM_malloc(num_seps * sizeof(MVMint32)); graph_length = 0; for (i = 0; i < num_seps; i++) { MVMuint32 num_graphs = MVM_string_graphs(tc, seps[i]); if (num_graphs > 0xFFFF) MVM_exception_throw_adhoc(tc, "Line separator too long"); sep_spec->sep_lengths[i] = num_graphs; graph_length += num_graphs; } sep_spec->sep_graphemes = MVM_malloc(graph_length * sizeof(MVMGrapheme32)); graph_pos = 0; for (i = 0; i < num_seps; i++) { MVM_string_gi_init(tc, &gi, seps[i]); while (MVM_string_gi_has_more(tc, &gi)) sep_spec->sep_graphemes[graph_pos++] = MVM_string_gi_get_grapheme(tc, &gi); } cache_sep_info(tc, sep_spec); } /* Cleans up memory associated with a stream separator set. */ void MVM_string_decode_stream_sep_destroy(MVMThreadContext *tc, MVMDecodeStreamSeparators *sep_spec) { MVM_free(sep_spec->sep_lengths); MVM_free(sep_spec->sep_graphemes); MVM_free(sep_spec->final_graphemes); } MoarVM-2018.03/src/strings/decode_stream.h0000644000175000017510000001341713252330426020440 0ustar samanthasamantha/* Represents a bytes => chars decoding stream. */ struct MVMDecodeStream { /* Head and tail of the input byte buffers. */ MVMDecodeStreamBytes *bytes_head; MVMDecodeStreamBytes *bytes_tail; /* Head and tail of the output char buffers. */ MVMDecodeStreamChars *chars_head; MVMDecodeStreamChars *chars_tail; /* Often, when reading lines or chunks, we'll fill up one char buffer * and then immediately take it. That results in a lot of allocating * and freeing of MVMDecodeStreamChars structures. Keeping a free one * avoids this. (There's not really a common steady state where we * have multiple free ones, so a free isn't worth the extra work.) */ MVMDecodeStreamChars *chars_reuse; /* The byte position (for tell). */ MVMint64 abs_byte_pos; /* How far we've eaten into the current head bytes buffer. */ MVMint32 bytes_head_pos; /* How far we've eaten into the current head char buffer. */ MVMint32 chars_head_pos; /* The encoding we're using. */ MVMint32 encoding; /* Suggestion for decoders of how many bytes to guess at when allocating * decoded result buffers. */ MVMint32 result_size_guess; /* Normalizer. */ MVMNormalizer norm; /* Optional place for the decoder to keep any extra state it needs between * decode calls. Will be freed when the decode stream is destroyed. */ void *decoder_state; /* Stores a replacement which is used upon encountering undecodable characters. * Set to NULL if a replacement is not desired. */ MVMString *replacement; /* Currently stores only whether or not the decoder should decode strictly or * permissively. Set to 1 for permissive decoding, default is strict */ MVMuint32 config; }; /* A single bunch of bytes added to a decode stream, with a link to the next * one, if any. */ struct MVMDecodeStreamBytes { char *bytes; MVMint32 length; MVMDecodeStreamBytes *next; }; /* A bunch of characters already decoded, with a link to the next bunch. */ struct MVMDecodeStreamChars { MVMGrapheme32 *chars; MVMint32 length; MVMDecodeStreamChars *next; }; /* For situations where we need to decode up to some separators, this data * structure holds the information about them. */ struct MVMDecodeStreamSeparators { /* The lengths of the separators, in graphemes. */ MVMint32 *sep_lengths; /* The grapehemes themselves, in a single array (use sep_lengths to find * out how many there are in each separator). */ MVMGrapheme32 *sep_graphemes; /* The number of separators we have. */ MVMint32 num_seps; /* Cached maximum separator length, to save regular recalculation. */ MVMint32 max_sep_length; /* Cached final graphemes, for quick lookups in stream_maybe_sep. */ MVMGrapheme32 *final_graphemes; /* Since separators are most often control chars, we can quickly filter * out many graphemes without a separator search by keeping around the * maximum codepoint/synthetic index of any final grapheme and doing a * quick comparison. */ MVMGrapheme32 max_final_grapheme; }; /* Checks if we may have encountered one of the separators. This just looks to * see if we hit the final grapheme of any of the separators, which is all we * demand the actual encodings themselves work out (multi-grapheme separators * are handled in the decode stream logic itself). */ MVM_STATIC_INLINE MVMint32 MVM_string_decode_stream_maybe_sep(MVMThreadContext *tc, MVMDecodeStreamSeparators *sep_spec, MVMGrapheme32 g) { if (sep_spec && g <= sep_spec->max_final_grapheme) { MVMint32 i; for (i = 0; i < sep_spec->num_seps; i++) if (sep_spec->final_graphemes[i] == g) return 1; } return 0; } MVMDecodeStream * MVM_string_decodestream_create(MVMThreadContext *tc, MVMint32 encoding, MVMint64 abs_byte_pos, MVMint32 translate_newlines); void MVM_string_decodestream_add_bytes(MVMThreadContext *tc, MVMDecodeStream *ds, char *bytes, MVMint32 length); void MVM_string_decodestream_add_chars(MVMThreadContext *tc, MVMDecodeStream *ds, MVMGrapheme32 *chars, MVMint32 length); void MVM_string_decodestream_discard_to(MVMThreadContext *tc, MVMDecodeStream *ds, const MVMDecodeStreamBytes *bytes, MVMint32 pos); MVMString * MVM_string_decodestream_get_chars(MVMThreadContext *tc, MVMDecodeStream *ds, MVMint32 chars, MVMint64 eof); MVMString * MVM_string_decodestream_get_until_sep(MVMThreadContext *tc, MVMDecodeStream *ds, MVMDecodeStreamSeparators *seps, MVMint32 chomp); MVMString * MVM_string_decodestream_get_until_sep_eof(MVMThreadContext *tc, MVMDecodeStream *ds, MVMDecodeStreamSeparators *sep_spec, MVMint32 chomp); MVMString * MVM_string_decodestream_get_all(MVMThreadContext *tc, MVMDecodeStream *ds); MVMString * MVM_string_decodestream_get_available(MVMThreadContext *tc, MVMDecodeStream *ds); MVMint64 MVM_string_decodestream_have_bytes(MVMThreadContext *tc, const MVMDecodeStream *ds, MVMint32 bytes); MVMint64 MVM_string_decodestream_bytes_available(MVMThreadContext *tc, const MVMDecodeStream *ds); MVMint64 MVM_string_decodestream_bytes_to_buf(MVMThreadContext *tc, MVMDecodeStream *ds, char **buf, MVMint32 bytes); MVMint64 MVM_string_decodestream_tell_bytes(MVMThreadContext *tc, const MVMDecodeStream *ds); MVMint32 MVM_string_decodestream_is_empty(MVMThreadContext *tc, MVMDecodeStream *ds); void MVM_string_decodestream_destroy(MVMThreadContext *tc, MVMDecodeStream *ds); void MVM_string_decode_stream_sep_default(MVMThreadContext *tc, MVMDecodeStreamSeparators *sep_spec); void MVM_string_decode_stream_sep_from_strings(MVMThreadContext *tc, MVMDecodeStreamSeparators *sep_spec, MVMString **seps, MVMint32 num_seps); void MVM_string_decode_stream_sep_destroy(MVMThreadContext *tc, MVMDecodeStreamSeparators *sep_spec); MoarVM-2018.03/src/strings/iter.h0000644000175000017510000003351113237701240016601 0ustar samanthasamantha/* Grapheme iterator structure; iterates through graphemes in a string. */ struct MVMGraphemeIter { /* The blob we're currently iterating over. */ union { MVMGrapheme32 *blob_32; MVMGraphemeASCII *blob_ascii; MVMGrapheme8 *blob_8; void *any; } active_blob; /* The type of blob we have. */ MVMuint16 blob_type; /* The number of strands remaining, if any. */ MVMuint16 strands_remaining; /* The current position, and the end position. */ MVMStringIndex pos; MVMStringIndex end; /* Repetition count, and the start index in the blob (only needed if we're * doing an iteration over a repetition). */ MVMStringIndex start; MVMuint32 repetitions; /* The next strand, if we're doing a strand-based iteration. */ MVMStringStrand *next_strand; }; /* Initializes a grapheme iterator. */ MVM_STATIC_INLINE void MVM_string_gi_init(MVMThreadContext *tc, MVMGraphemeIter *gi, MVMString *s) { if (s->body.storage_type == MVM_STRING_STRAND) { MVMStringStrand *strands = s->body.storage.strands; MVMString *first = strands[0].blob_string; gi->active_blob.any = first->body.storage.any; gi->blob_type = first->body.storage_type; gi->strands_remaining = s->body.num_strands - 1; gi->pos = gi->start = strands[0].start; gi->end = strands[0].end; gi->repetitions = strands[0].repetitions; gi->next_strand = strands + 1; } else { gi->active_blob.any = s->body.storage.any; gi->blob_type = s->body.storage_type; gi->end = s->body.num_graphs; gi->strands_remaining = gi->start = gi->pos = gi->repetitions = 0; } }; /* Gets the number of graphemes remaining in the current strand of the grapheme * iterator */ #define MVM_string_gi_graphs_left_in_strand(gi) \ (gi->end - gi->pos + gi->repetitions * (gi->end - gi->start)) /* graphs left in strand + graphs left in repetitions of current strand */ /* Sets the position of the iterator. (Can be optimized in many ways in the * repetitions and strands branches.) */ MVM_STATIC_INLINE void MVM_string_gi_move_to(MVMThreadContext *tc, MVMGraphemeIter *gi, MVMuint32 pos) { MVMuint32 remaining = pos; MVMuint32 strand_graphs; MVMStringStrand *next = NULL; /* Find the appropriate strand. */ /* Set strand_graphs to the number of graphemes */ while (remaining > (strand_graphs = MVM_string_gi_graphs_left_in_strand(gi))) { remaining -= strand_graphs; if (!(gi->strands_remaining--)) MVM_exception_throw_adhoc(tc, "Iteration past end of grapheme iterator"); next = (gi->next_strand)++; gi->pos = gi->start = next->start; gi->end = next->end; gi->repetitions = next->repetitions; } if (next) { gi->blob_type = next->blob_string->body.storage_type; gi->active_blob.any = next->blob_string->body.storage.any; } /* Now look within the strand. */ if (!remaining) return; /* Most common case where we move within the strand */ if (gi->pos + remaining <= gi->end) { gi->pos += remaining; return; } /* If we are here we are encountering a repetition */ if (gi->repetitions) { MVMuint32 rep_graphs = gi->end - gi->start; MVMuint32 remaining_reps; /* If we aren't at the end of the repetition, move to the end */ if (gi->pos < gi->end) { remaining -= gi->end - gi->pos; gi->pos = gi->end; } remaining_reps = remaining / rep_graphs; if (gi->repetitions < remaining_reps) MVM_exception_throw_adhoc(tc, "Iteration past end of grapheme iterator:" " no more repetitions remaining\n"); gi->repetitions -= remaining_reps; /* Since we're still at the end, if there's repetitions left over * we are going to have to seek forward */ if (remaining -= remaining_reps * rep_graphs) { gi->repetitions--; /* Move to the next repetition. */ gi->pos = gi->start + remaining; /* remaining = 0 now for all purposes now, but since we return, no * need to set it */ } return; } MVM_exception_throw_adhoc(tc, "Iteration past end of grapheme iterator"); } /* Checks if there is more to read from a grapheme iterator. */ MVM_STATIC_INLINE MVMint32 MVM_string_gi_has_more(MVMThreadContext *tc, MVMGraphemeIter *gi) { return gi->pos < gi->end || gi->repetitions || gi->strands_remaining; } /* Gets the next grapheme. */ MVM_STATIC_INLINE MVMGrapheme32 MVM_string_gi_get_grapheme(MVMThreadContext *tc, MVMGraphemeIter *gi) { while (1) { if (gi->pos < gi->end) { switch (gi->blob_type) { case MVM_STRING_GRAPHEME_32: return gi->active_blob.blob_32[gi->pos++]; case MVM_STRING_GRAPHEME_ASCII: return gi->active_blob.blob_ascii[gi->pos++]; case MVM_STRING_GRAPHEME_8: return gi->active_blob.blob_8[gi->pos++]; } } else if (gi->repetitions) { gi->pos = gi->start; gi->repetitions--; } else if (gi->strands_remaining) { MVMStringStrand *next = gi->next_strand; gi->active_blob.any = next->blob_string->body.storage.any; gi->blob_type = next->blob_string->body.storage_type; gi->pos = next->start; gi->end = next->end; gi->start = next->start; gi->repetitions = next->repetitions; gi->strands_remaining--; gi->next_strand++; } else { MVM_exception_throw_adhoc(tc, "Iteration past end of grapheme iterator"); } } } /* Returns the codepoint without doing checks, for internal VM use only. */ MVM_STATIC_INLINE MVMGrapheme32 MVM_string_get_grapheme_at_nocheck(MVMThreadContext *tc, MVMString *a, MVMint64 index) { switch (a->body.storage_type) { case MVM_STRING_GRAPHEME_32: return a->body.storage.blob_32[index]; case MVM_STRING_GRAPHEME_ASCII: return a->body.storage.blob_ascii[index]; case MVM_STRING_GRAPHEME_8: return a->body.storage.blob_8[index]; case MVM_STRING_STRAND: { MVMGraphemeIter gi; MVM_string_gi_init(tc, &gi, a); MVM_string_gi_move_to(tc, &gi, index); return MVM_string_gi_get_grapheme(tc, &gi); } default: MVM_exception_throw_adhoc(tc, "String corruption detected: bad storage type"); } } /* Code point iterator. Uses the grapheme iterator, and adds some extra bits * in order to iterate the code points in synthetics. */ struct MVMCodepointIter { /* The grapheme iterator. */ MVMGraphemeIter gi; /* The codes of the current synthetic we're walking through, if any, with * the number of combiners we returned so far, and the total number of * combiners there are. */ MVMCodepoint *synth_codes; MVMint32 visited_synth_codes; MVMint32 total_synth_codes; /* base_code is only used for string_grapheme_ci functions */ MVMCodepoint base_code; /* If we should translate newline \n into \r\n. */ MVMint32 translate_newlines; /* Used to pass through utf8-c8 synthetics, but not any others so we can * renomalize text without getting rid of utf8-c8 synthetics */ MVMint32 pass_utfc8_synthetics; }; /* Initializes a code point iterator. */ MVM_STATIC_INLINE void MVM_string_ci_init(MVMThreadContext *tc, MVMCodepointIter *ci, MVMString *s, MVMint32 translate_newlines, MVMint32 pass_utfc8_synthetics) { /* Initialize our underlying grapheme iterator. */ MVM_string_gi_init(tc, &(ci->gi), s); /* We've no currently active synthetic codepoint (and other fields are * unused until we do, so leave them alone for now). */ ci->synth_codes = NULL; ci->translate_newlines = translate_newlines; ci->pass_utfc8_synthetics = pass_utfc8_synthetics; }; /* Iterates on a grapheme. Returns the number of codepoints in the grapheme */ MVM_STATIC_INLINE MVMGrapheme32 MVM_string_grapheme_ci_init(MVMThreadContext *tc, MVMCodepointIter *ci, MVMGrapheme32 g, MVMint32 pass_utfc8_synthetics) { MVMNFGSynthetic *synth = NULL; if (g < 0) { /* Get the synthetics info. */ synth = MVM_nfg_get_synthetic_info(tc, g); } /* If we got a synth, but *not* if we are supposed to pass utf8-c8 synthetics * and it is a utf8-c8 synthetic */ if (synth && !(pass_utfc8_synthetics && synth->is_utf8_c8)) { /* Set up the iterator so in the next iteration we will start to * hand back codepoints after the initial */ /* TODO: for now assumes synthetics start 1 after the first codepoint */ ci->synth_codes = synth->codes + 1; ci->visited_synth_codes = -1; ci->total_synth_codes = synth->num_codes - 1; /* TODO: for now assumes index 0 is the base character */ ci->base_code = synth->codes[0]; } else { ci->synth_codes = NULL; ci->visited_synth_codes = -1; ci->total_synth_codes = 0; ci->base_code = g; } return ci->total_synth_codes + 1; } /* Only for string_grapheme_ci ops */ MVM_STATIC_INLINE MVMCodepoint MVM_string_grapheme_ci_get_codepoint(MVMThreadContext *tc, MVMCodepointIter *ci) { MVMCodepoint result = ci->visited_synth_codes < 0 ? ci->base_code : ci->synth_codes[ci->visited_synth_codes]; ci->visited_synth_codes++; return result; } /* Checks if there is more to read from a code point iterator; this is the * case if we're still walking through a synthetic or we have more things * available from the underlying grapheme iterator. */ MVM_STATIC_INLINE MVMint32 MVM_string_ci_has_more(MVMThreadContext *tc, MVMCodepointIter *ci) { return ci->synth_codes || MVM_string_gi_has_more(tc, &(ci->gi)); } /* Only for use with string_grapheme_ci ops */ MVM_STATIC_INLINE MVMint32 MVM_string_grapheme_ci_has_more(MVMThreadContext *tc, MVMCodepointIter *ci) { return ci->visited_synth_codes < ci->total_synth_codes; } /* Gets the next code point. */ MVM_STATIC_INLINE MVMCodepoint MVM_string_ci_get_codepoint(MVMThreadContext *tc, MVMCodepointIter *ci) { MVMCodepoint result; /* Do we have combiners from a synthetic to return? */ if (ci->synth_codes) { /* Take the current combiner as the result. */ result = ci->synth_codes[ci->visited_synth_codes]; /* If we've seen all of the synthetics, clear up so we'll take another * grapheme next time around. */ ci->visited_synth_codes++; if (ci->visited_synth_codes == ci->total_synth_codes) ci->synth_codes = NULL; } /* Otherwise, proceed to the next grapheme. */ else { MVMGrapheme32 g = MVM_string_gi_get_grapheme(tc, &(ci->gi)); #ifdef _WIN32 if (ci->translate_newlines && g == '\n') g = MVM_nfg_crlf_grapheme(tc); #endif if (g >= 0) { /* It's not a synthetic, so we're done. */ result = (MVMCodepoint)g; } else { /* It's a synthetic. Look it up. */ MVMNFGSynthetic *synth = MVM_nfg_get_synthetic_info(tc, g); /* If we have pass_utfc8_synthetics set and it's a utf_c8 codepoint * pass it back unchanged */ if (ci->pass_utfc8_synthetics && synth->is_utf8_c8) { result = g; } else { /* Set up the iterator so in the next iteration we will start to * hand back codepoints. */ ci->synth_codes = synth->codes + 1; ci->visited_synth_codes = 0; /* Emulate num_combs and subtract one from num_codes */ ci->total_synth_codes = synth->num_codes - 1; /* Result is the first codepoint of the `codes` array */ result = synth->codes[0]; } } } return result; } /* The MVMGraphemeIter_cached is used for the Knuth-Morris-Pratt algorithm * because often it will request the same grapheme again, and our grapheme * iterators only return the next grapheme */ struct MVMGraphemeIter_cached { MVMGraphemeIter gi; MVMGrapheme32 last_g; MVMStringIndex last_location; MVMString *string; }; typedef struct MVMGraphemeIter_cached MVMGraphemeIter_cached; MVM_STATIC_INLINE void MVM_string_gi_cached_init (MVMThreadContext *tc, MVMGraphemeIter_cached *gic, MVMString *s, MVMint64 index) { MVM_string_gi_init(tc, &(gic->gi), s); if (index) MVM_string_gi_move_to(tc, &(gic->gi), index); gic->last_location = index; gic->last_g = MVM_string_gi_get_grapheme(tc, &(gic->gi)); gic->string = s; } MVM_STATIC_INLINE MVMGrapheme32 MVM_string_gi_cached_get_grapheme(MVMThreadContext *tc, MVMGraphemeIter_cached *gic, MVMint64 index) { /* Most likely case is we are getting the next grapheme. When that happens * we will go directly to the end. */ if (index == gic->last_location + 1) { } /* Second most likely is getting the cached grapheme */ else if (index == gic->last_location) { return gic->last_g; } /* If we have to move forward */ else if (gic->last_location < index) { MVM_string_gi_move_to(tc, &(gic->gi), index - gic->last_location - 1); } /* If we have to backtrack we need to reinitialize the grapheme iterator */ else { MVM_string_gi_cached_init(tc, gic, gic->string, index); return gic->last_g; } gic->last_location = index; return (gic->last_g = MVM_string_gi_get_grapheme(tc, &(gic->gi))); } MoarVM-2018.03/src/strings/latin1.c0000644000175000017510000002002713237701241017020 0ustar samanthasamantha#include "moar.h" /* Decodes the specified number of bytes of latin1 into an NFG string, * creating a result of the specified type. The type must have the MVMString * REPR. */ MVMString * MVM_string_latin1_decode(MVMThreadContext *tc, const MVMObject *result_type, char *latin1_c, size_t bytes) { MVMuint8 *latin1 = (MVMuint8 *)latin1_c; MVMString *result = (MVMString *)REPR(result_type)->allocate(tc, STABLE(result_type)); size_t i, k, result_graphs; MVMuint8 writing_32bit = 0; result->body.storage_type = MVM_STRING_GRAPHEME_8; result->body.storage.blob_8 = MVM_malloc(sizeof(MVMint8) * bytes); result_graphs = 0; for (i = 0; i < bytes; i++) { if (latin1[i] == '\r' && i + 1 < bytes && latin1[i + 1] == '\n') { if (writing_32bit) result->body.storage.blob_32[result_graphs++] = MVM_nfg_crlf_grapheme(tc); else result->body.storage.blob_8[result_graphs++] = MVM_nfg_crlf_grapheme(tc); i++; } else { if (latin1[i] > 127 && !writing_32bit) { MVMGrapheme8 *old_storage = result->body.storage.blob_8; result->body.storage.blob_32 = MVM_malloc(sizeof(MVMGrapheme32) * bytes); result->body.storage_type = MVM_STRING_GRAPHEME_32; writing_32bit = 1; for (k = 0; k < i; k++) result->body.storage.blob_32[k] = old_storage[k]; MVM_free(old_storage); } if (writing_32bit) result->body.storage.blob_32[result_graphs++] = latin1[i]; else result->body.storage.blob_8[result_graphs++] = latin1[i]; } } result->body.num_graphs = result_graphs; return result; } /* Decodes using a decodestream. Decodes as far as it can with the input * buffers, or until a stopper is reached. */ MVMuint32 MVM_string_latin1_decodestream(MVMThreadContext *tc, MVMDecodeStream *ds, const MVMint32 *stopper_chars, MVMDecodeStreamSeparators *seps) { MVMint32 count = 0, total = 0; MVMint32 bufsize; MVMGrapheme32 *buffer; MVMDecodeStreamBytes *cur_bytes; MVMDecodeStreamBytes *last_accept_bytes = ds->bytes_head; MVMint32 last_accept_pos, last_was_cr; MVMuint32 reached_stopper; /* If there's no buffers, we're done. */ if (!ds->bytes_head) return 0; last_accept_pos = ds->bytes_head_pos; /* If we're asked for zero chars, also done. */ if (stopper_chars && *stopper_chars == 0) return 1; bufsize = ds->result_size_guess; buffer = MVM_malloc(bufsize * sizeof(MVMGrapheme32)); /* Decode each of the buffers. */ cur_bytes = ds->bytes_head; last_was_cr = 0; reached_stopper = 0; while (cur_bytes) { /* Process this buffer. */ MVMint32 pos = cur_bytes == ds->bytes_head ? ds->bytes_head_pos : 0; unsigned char *bytes = (unsigned char *)cur_bytes->bytes; while (pos < cur_bytes->length) { MVMCodepoint codepoint = bytes[pos++]; MVMGrapheme32 graph; if (last_was_cr) { if (codepoint == '\n') { graph = MVM_unicode_normalizer_translated_crlf(tc, &(ds->norm)); } else { graph = '\r'; pos--; } last_was_cr = 0; } else if (codepoint == '\r') { last_was_cr = 1; continue; } else { graph = codepoint; } if (count == bufsize) { /* We filled the buffer. Attach this one to the buffers * linked list, and continue with a new one. */ MVM_string_decodestream_add_chars(tc, ds, buffer, bufsize); buffer = MVM_malloc(bufsize * sizeof(MVMGrapheme32)); count = 0; } buffer[count++] = graph; last_accept_bytes = cur_bytes; last_accept_pos = pos; total++; if (MVM_string_decode_stream_maybe_sep(tc, seps, codepoint)) { reached_stopper = 1; goto done; } else if (stopper_chars && *stopper_chars == total) { reached_stopper = 1; goto done; } } cur_bytes = cur_bytes->next; } done: /* Attach what we successfully parsed as a result buffer, and trim away * what we chewed through. */ if (count) { MVM_string_decodestream_add_chars(tc, ds, buffer, count); } else { MVM_free(buffer); } MVM_string_decodestream_discard_to(tc, ds, last_accept_bytes, last_accept_pos); return reached_stopper; } /* Encodes the specified substring to latin-1. Anything outside of latin-1 range * will become a ?. The result string is NULL terminated, but the specified * size is the non-null part. */ char * MVM_string_latin1_encode_substr(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint64 start, MVMint64 length, MVMString *replacement, MVMint32 translate_newlines) { /* Latin-1 is a single byte encoding, but \r\n is a 2-byte grapheme, so we * may have to resize as we go. */ MVMStringIndex strgraphs = MVM_string_graphs(tc, str); MVMuint32 lengthu = (MVMuint32)(length == -1 ? strgraphs - (MVMuint32)start : length); MVMuint8 *result; size_t result_alloc; MVMuint8 *repl_bytes = NULL; MVMuint64 repl_length; /* must check start first since it's used in the length check */ if (start < 0 || start > strgraphs) MVM_exception_throw_adhoc(tc, "start out of range"); if (length < -1 || start + lengthu > strgraphs) MVM_exception_throw_adhoc(tc, "length out of range"); if (replacement) repl_bytes = (MVMuint8 *) MVM_string_latin1_encode_substr(tc, replacement, &repl_length, 0, -1, NULL, translate_newlines); result_alloc = lengthu; result = MVM_malloc(result_alloc + 1); if (str->body.storage_type == MVM_STRING_GRAPHEME_ASCII) { /* No encoding needed; directly copy. */ memcpy(result, str->body.storage.blob_ascii, lengthu); result[lengthu] = 0; if (output_size) *output_size = lengthu; } else { MVMuint32 i = 0; MVMCodepointIter ci; MVM_string_ci_init(tc, &ci, str, translate_newlines, 0); while (MVM_string_ci_has_more(tc, &ci)) { MVMCodepoint ord = MVM_string_ci_get_codepoint(tc, &ci); if (i == result_alloc) { result_alloc += 8; result = MVM_realloc(result, result_alloc + 1); } if (ord >= 0 && ord <= 255) { result[i] = (MVMuint8)ord; i++; } else if (replacement) { if (repl_length >= result_alloc || i >= result_alloc - repl_length) { result_alloc += repl_length; result = MVM_realloc(result, result_alloc + 1); } memcpy(result + i, repl_bytes, repl_length); i += repl_length; } else { MVM_free(result); MVM_free(repl_bytes); MVM_exception_throw_adhoc(tc, "Error encoding Latin-1 string: could not encode codepoint %d", ord); } } result[i] = 0; if (output_size) *output_size = i; } MVM_free(repl_bytes); return (char *)result; } /* Encodes the specified string to latin-1. Anything outside of latin-1 range * will become a ?. The result string is NULL terminated, but the specified * size is the non-null part. */ char * MVM_string_latin1_encode(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint32 translate_newlines) { return MVM_string_latin1_encode_substr(tc, str, output_size, 0, -1, NULL, translate_newlines); } MoarVM-2018.03/src/strings/latin1.h0000644000175000017510000000111613237701240017022 0ustar samanthasamanthaMVMString * MVM_string_latin1_decode(MVMThreadContext *tc, const MVMObject *result_type, char *latin1, size_t bytes); MVM_PUBLIC MVMuint32 MVM_string_latin1_decodestream(MVMThreadContext *tc, MVMDecodeStream *ds, const MVMint32 *stopper_chars, MVMDecodeStreamSeparators *seps); char * MVM_string_latin1_encode_substr(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint64 start, MVMint64 length, MVMString *replacement, MVMint32 translate_newlines); char * MVM_string_latin1_encode(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint32 translate_newlines); MoarVM-2018.03/src/strings/nfg.c0000644000175000017510000005425713237701241016416 0ustar samanthasamantha#include "moar.h" /* Number of extra elements we add to the synthetics table each time we need * to grow it. */ #define MVM_SYNTHETIC_GROW_ELEMS 32 /* Finds the index of a given codepoint within a trie node. Returns it if * there is one, or negative if there is not (note 0 is a valid index). */ static MVMint32 find_child_node_idx(MVMThreadContext *tc, const MVMNFGTrieNode *node, MVMCodepoint cp) { if (node) { /* TODO: update this to do a binary search later on. */ MVMint32 i; for (i = 0; i < node->num_entries; i++) if (node->next_codes[i].code == cp) return i; } return -1; } /* Does a lookup in the trie for a synthetic for the specified codepoints. */ MVMNFGTrieNode * find_child_node(MVMThreadContext *tc, const MVMNFGTrieNode *node, MVMCodepoint cp) { MVMint32 idx = find_child_node_idx(tc, node, cp); return idx >= 0 ? node->next_codes[idx].node : NULL; } static MVMGrapheme32 lookup_synthetic(MVMThreadContext *tc, MVMCodepoint *codes, MVMint32 num_codes) { MVMNFGTrieNode *cur_node = tc->instance->nfg->grapheme_lookup; MVMCodepoint *cur_code = codes; MVMint32 codes_remaining = num_codes; while (cur_node && codes_remaining) { cur_node = find_child_node(tc, cur_node, *cur_code); cur_code++; codes_remaining--; } return cur_node ? cur_node->graph : 0; } /* Recursive algorithm to add to the trie. Descends existing trie nodes so far * as we have them following the code points, then passes on a NULL for the * levels of current below that do not exist. Once we bottom out, makes a copy * of or creates a node for the synthetic. As we walk back up we create or * copy+tweak nodes until we have produced a new trie, re-using what we can of * the existing one. */ static MVMNFGTrieNode * twiddle_trie_node(MVMThreadContext *tc, MVMNFGTrieNode *current, MVMCodepoint *cur_code, MVMint32 codes_remaining, MVMGrapheme32 synthetic) { /* Make a new empty node, which we'll maybe copy some things from the * current node into. */ MVMNFGTrieNode *new_node = MVM_fixed_size_alloc(tc, tc->instance->fsa, sizeof(MVMNFGTrieNode)); /* If we've more codes remaining... */ if (codes_remaining > 0) { /* Recurse, to get a new child node. */ MVMint32 idx = find_child_node_idx(tc, current, *cur_code); MVMNFGTrieNode *new_child = twiddle_trie_node(tc, idx >= 0 ? current->next_codes[idx].node : NULL, cur_code + 1, codes_remaining - 1, synthetic); /* If we had an existing child node... */ if (idx >= 0) { /* Make a copy of the next_codes list. */ size_t the_size = current->num_entries * sizeof(MVMNFGTrieNodeEntry); MVMNFGTrieNodeEntry *new_next_codes = MVM_fixed_size_alloc(tc, tc->instance->fsa, the_size); memcpy(new_next_codes, current->next_codes, the_size); /* Update the copy to point to the new child. */ new_next_codes[idx].node = new_child; /* Install the new next_codes list in the new node, and free the * existing child list at the next safe point. */ new_node->num_entries = current->num_entries; new_node->next_codes = new_next_codes; MVM_fixed_size_free_at_safepoint(tc, tc->instance->fsa, the_size, current->next_codes); } /* Otherwise, we're going to need to insert the new child into a * (possibly existing) child list. */ else { /* Calculate new child node list size and allocate it. */ MVMint32 orig_entries = current ? current->num_entries : 0; MVMint32 new_entries = orig_entries + 1; size_t new_size = new_entries * sizeof(MVMNFGTrieNodeEntry); MVMNFGTrieNodeEntry *new_next_codes = MVM_fixed_size_alloc(tc, tc->instance->fsa, new_size); /* Go through original entries, copying those that are for a lower * code point than the one we're inserting a child for. */ MVMint32 insert_pos = 0; MVMint32 orig_pos = 0; while (orig_pos < orig_entries && current->next_codes[orig_pos].code < *cur_code) new_next_codes[insert_pos++] = current->next_codes[orig_pos++]; /* Insert the new child. */ new_next_codes[insert_pos].code = *cur_code; new_next_codes[insert_pos].node = new_child; insert_pos++; /* Copy the rest. */ while (orig_pos < orig_entries) new_next_codes[insert_pos++] = current->next_codes[orig_pos++]; /* Install the new next_codes list in the new node, and free any * existing child list at the next safe point. */ new_node->num_entries = new_entries; new_node->next_codes = new_next_codes; if (orig_entries) MVM_fixed_size_free_at_safepoint(tc, tc->instance->fsa, orig_entries * sizeof(MVMNFGTrieNodeEntry), current->next_codes); } /* Always need to copy synthetic set on the existing node also; * otherwise make sure to clear it. */ new_node->graph = current ? current->graph : 0; } /* Otherwise, we reached the point where we need to install the synthetic. * If we already had a node here, we re-use the children of it. */ else { new_node->graph = synthetic; if (current) { new_node->num_entries = current->num_entries; new_node->next_codes = current->next_codes; } else { new_node->num_entries = 0; new_node->next_codes = NULL; } } /* Free any existing node at next safe point, return the new one. */ if (current) MVM_fixed_size_free_at_safepoint(tc, tc->instance->fsa, sizeof(MVMNFGTrieNode), current); return new_node; } static void add_synthetic_to_trie(MVMThreadContext *tc, MVMCodepoint *codes, MVMint32 num_codes, MVMGrapheme32 synthetic) { MVMNFGState *nfg = tc->instance->nfg; MVMNFGTrieNode *new_trie = twiddle_trie_node(tc, nfg->grapheme_lookup, codes, num_codes, synthetic); MVM_barrier(); nfg->grapheme_lookup = new_trie; } /* Assumes that we are holding the lock that serializes updates, and already * checked that the synthetic does not exist. Adds it to the lookup trie and * synthetics table, making sure to do enough copy/free-at-safe-point work to * not upset other threads possibly doing concurrent reads. */ static MVMGrapheme32 add_synthetic(MVMThreadContext *tc, MVMCodepoint *codes, MVMint32 num_codes, MVMint32 utf8_c8) { MVMNFGState *nfg = tc->instance->nfg; MVMNFGSynthetic *synth; MVMGrapheme32 result; /* Grow the synthetics table if needed. */ if (nfg->num_synthetics % MVM_SYNTHETIC_GROW_ELEMS == 0) { size_t orig_size = nfg->num_synthetics * sizeof(MVMNFGSynthetic); size_t new_size = (nfg->num_synthetics + MVM_SYNTHETIC_GROW_ELEMS) * sizeof(MVMNFGSynthetic); MVMNFGSynthetic *new_synthetics = MVM_fixed_size_alloc(tc, tc->instance->fsa, new_size); if (orig_size) { memcpy(new_synthetics, nfg->synthetics, orig_size); MVM_fixed_size_free_at_safepoint(tc, tc->instance->fsa, orig_size, nfg->synthetics); } nfg->synthetics = new_synthetics; } /* Set up the new synthetic entry. */ synth = &(nfg->synthetics[nfg->num_synthetics]); synth->num_codes = num_codes; /* Find which codepoint is the base codepoint. It is always index 0 unless * there are Prepend codepoints */ if (!utf8_c8 && MVM_unicode_codepoint_get_property_int(tc, codes[0], MVM_UNICODE_PROPERTY_GRAPHEME_CLUSTER_BREAK) == MVM_UNICODE_PVALUE_GCB_PREPEND) { MVMint64 i = 0; MVMCodepoint cached = codes[i++]; MVMint64 cached_GCB = MVM_UNICODE_PVALUE_GCB_PREPEND; while (i < num_codes) { /* If it's the same codepoint as before, don't need to request * the property value again */ if (cached == codes[i] || MVM_UNICODE_PVALUE_GCB_PREPEND == (cached_GCB = MVM_unicode_codepoint_get_property_int(tc, (cached = codes[i]), MVM_UNICODE_PROPERTY_GRAPHEME_CLUSTER_BREAK))) { } else { /* If we see an Extend then this is a degenerate without any * base character, so set i to num_codes so base_index gets set * to 0 */ if (cached_GCB == MVM_UNICODE_PVALUE_GCB_EXTEND) i = num_codes; break; } i++; } /* If all the codepoints were prepend then we need to set it to 0 */ synth->base_index = num_codes == i ? 0 : i; } else { synth->base_index = 0; } synth->codes = MVM_fixed_size_alloc(tc, tc->instance->fsa, num_codes * sizeof(MVMCodepoint)); memcpy(synth->codes, codes, (synth->num_codes * sizeof(MVMCodepoint))); synth->case_uc = 0; synth->case_lc = 0; synth->case_tc = 0; synth->case_fc = 0; synth->is_utf8_c8 = utf8_c8; /* Memory barrier to make sure the synthetic is fully in place before we * bump the count. */ MVM_barrier(); nfg->num_synthetics++; /* Give the synthetic an ID by negating the new number of synthetics. */ result = -(nfg->num_synthetics); /* Make an entry in the lookup trie for the new synthetic, so we can use * it in the future when seeing the same codepoint sequence. */ add_synthetic_to_trie(tc, codes, num_codes, result); return result; } /* Does a lookup of a synthetic in the trie. If we find one, returns it. If * not, acquires the update lock, re-checks that we really are missing the * synthetic, and then adds it. */ static MVMGrapheme32 lookup_or_add_synthetic(MVMThreadContext *tc, MVMCodepoint *codes, MVMint32 num_codes, MVMint32 utf8_c8) { MVMGrapheme32 result = lookup_synthetic(tc, codes, num_codes); if (!result) { uv_mutex_lock(&tc->instance->nfg->update_mutex); result = lookup_synthetic(tc, codes, num_codes); if (!result) result = add_synthetic(tc, codes, num_codes, utf8_c8); uv_mutex_unlock(&tc->instance->nfg->update_mutex); } return result; } /* Takes one or more code points. If only one code point is passed, it is * returned as the grapheme. Otherwise, resolves it to a synthetic - either an * already existing one if we saw it before, or a new one if not. Assumes * that the code points are already in NFC, and as such canonical ordering has * been applied. */ MVMGrapheme32 MVM_nfg_codes_to_grapheme(MVMThreadContext *tc, MVMCodepoint *codes, MVMint32 num_codes) { if (num_codes == 1) return codes[0]; else if (num_codes < MVM_GRAPHEME_MAX_CODEPOINTS) return lookup_or_add_synthetic(tc, codes, num_codes, 0); else MVM_exception_throw_adhoc(tc, "Too many codepoints (%d) in grapheme", num_codes); } /* Does the same as MVM_nfg_codes_to_grapheme, but flags the added grapheme as * being an UTF8-C8 synthetic. */ MVMGrapheme32 MVM_nfg_codes_to_grapheme_utf8_c8(MVMThreadContext *tc, MVMCodepoint *codes, MVMint32 num_codes) { if (num_codes == 1) return codes[0]; else return lookup_or_add_synthetic(tc, codes, num_codes, 1); } /* Gets the \r\n synthetic. */ MVMGrapheme32 MVM_nfg_crlf_grapheme(MVMThreadContext *tc) { return tc->instance->nfg->crlf_grapheme; } /* Does a lookup of information held about a synthetic. The synth parameter * must be a synthetic codepoint (that is, negative). The memory returned is * not to be freed by the caller; it also is only valid until the next GC * safe point. */ MVMNFGSynthetic * MVM_nfg_get_synthetic_info(MVMThreadContext *tc, MVMGrapheme32 synth) { MVMNFGState *nfg = tc->instance->nfg; MVMint32 synth_idx = -synth - 1; if (synth >= 0) MVM_oops(tc, "MVM_nfg_get_synthetic_info illegally called on a non-synthetic codepoint.\nRequested codepoint %i.", synth); if (synth_idx >= nfg->num_synthetics) MVM_oops(tc, "MVM_nfg_get_synthetic_info call requested a synthetic codepoint that does not exist.\nRequested synthetic %i when only %i have been created.", -synth, nfg->num_synthetics); return &(nfg->synthetics[synth_idx]); } /* Gets the cached case change if we already computed it, or computes it if * this is the first time we're using it. */ static MVMGrapheme32 CASE_UNCHANGED[1] = {0}; static void compute_case_change(MVMThreadContext *tc, MVMGrapheme32 synth_g, MVMNFGSynthetic *synth_info, MVMint32 case_) { MVMint32 num_result_graphs; MVMGrapheme32 *result = NULL; const MVMCodepoint *result_cps = NULL; /* Transform the base character. */ MVMuint32 num_result_cps = MVM_unicode_get_case_change(tc, synth_info->codes[synth_info->base_index], case_, &result_cps); if (num_result_cps == 0 || (num_result_cps == 1 && result_cps[0] == synth_info->codes[synth_info->base_index])) { /* Base character does not change, so grapheme stays the same. We * install a non-null sentinel for this case, and set the result * grapheme count to zero, which indicates no change. */ result = CASE_UNCHANGED; num_result_graphs = 0; } else { /* We can potentially get multiple graphemes back. We may also get * into situations where we case change the base and suddenly we * can normalize the whole thing to a non-synthetic. So, we take * a trip through the normalizer. We push any codepoints before the * base in the synthetic (only happens with Prepend codepoints). * We then push the first codepoint we get back from the case change * then the codeponits after the base characters (generally Extend * codepoints). * Finally we push anything else the case change produced. This should * do about the right thing for both case changes that produce a * base and a combiner, and those that produce a base and a base, * since the normalizer applies canonical combining class sorting. */ MVMNormalizer norm; MVMint32 i; MVM_unicode_normalizer_init(tc, &norm, MVM_NORMALIZE_NFG); if (0 < synth_info->base_index) MVM_unicode_normalizer_push_codepoints(tc, &norm, synth_info->codes, synth_info->base_index); /* Push the first result on */ MVM_unicode_normalizer_push_codepoints(tc, &norm, result_cps, 1); /* Push any combiners after that codepoint so the combiners attach to the * first codepoint of the casechange not the second or more */ MVM_unicode_normalizer_push_codepoints(tc, &norm, synth_info->codes + synth_info->base_index + 1, synth_info->num_codes - synth_info->base_index - 1); if (1 < num_result_cps) MVM_unicode_normalizer_push_codepoints(tc, &norm, result_cps + 1, num_result_cps - 1); MVM_unicode_normalizer_eof(tc, &norm); num_result_graphs = MVM_unicode_normalizer_available(tc, &norm); result = MVM_malloc(num_result_graphs * sizeof(MVMGrapheme32)); for (i = 0; i < num_result_graphs; i++) result[i] = MVM_unicode_normalizer_get_grapheme(tc, &norm); MVM_unicode_normalizer_cleanup(tc, &norm); } switch (case_) { case MVM_unicode_case_change_type_upper: synth_info->case_uc = result; synth_info->case_uc_graphs = num_result_graphs; break; case MVM_unicode_case_change_type_lower: synth_info->case_lc = result; synth_info->case_lc_graphs = num_result_graphs; break; case MVM_unicode_case_change_type_title: synth_info->case_tc = result; synth_info->case_tc_graphs = num_result_graphs; break; case MVM_unicode_case_change_type_fold: synth_info->case_fc = result; synth_info->case_fc_graphs = num_result_graphs; break; default: MVM_panic(1, "NFG: invalid case change %d", case_); } } MVMuint32 MVM_nfg_get_case_change(MVMThreadContext *tc, MVMGrapheme32 synth, MVMint32 case_, MVMGrapheme32 **result) { MVMNFGSynthetic *synth_info = MVM_nfg_get_synthetic_info(tc, synth); switch (case_) { case MVM_unicode_case_change_type_upper: if (!synth_info->case_uc) compute_case_change(tc, synth, synth_info, case_); *result = synth_info->case_uc; return synth_info->case_uc_graphs; case MVM_unicode_case_change_type_lower: if (!synth_info->case_lc) compute_case_change(tc, synth, synth_info, case_); *result = synth_info->case_lc; return synth_info->case_lc_graphs; case MVM_unicode_case_change_type_title: if (!synth_info->case_tc) compute_case_change(tc, synth, synth_info, case_); *result = synth_info->case_tc; return synth_info->case_tc_graphs; case MVM_unicode_case_change_type_fold: if (!synth_info->case_fc) compute_case_change(tc, synth, synth_info, case_); *result = synth_info->case_fc; return synth_info->case_fc_graphs; default: MVM_panic(1, "NFG: invalid case change %d", case_); } } MVM_STATIC_INLINE MVMint32 passes_quickcheck_and_zero_ccc(MVMThreadContext *tc, MVMCodepoint cp) { return MVM_unicode_codepoint_get_property_int(tc, cp, MVM_UNICODE_PROPERTY_NFG_QC) && MVM_unicode_codepoint_get_property_int(tc, cp, MVM_UNICODE_PROPERTY_CANONICAL_COMBINING_CLASS) <= MVM_UNICODE_PVALUE_CCC_0; } /* Returns true for cps with Grapheme_Cluster_Break = Control */ MVM_STATIC_INLINE MVMint32 codepoint_GCB_Control (MVMThreadContext *tc, MVMCodepoint codepoint) { return MVM_unicode_codepoint_get_property_int(tc, codepoint, MVM_UNICODE_PROPERTY_GRAPHEME_CLUSTER_BREAK) == MVM_UNICODE_PVALUE_GCB_CONTROL; } /* Returns non-zero if the result of concatenating the two strings will freely * leave us in NFG without any further effort. */ MVMint32 MVM_nfg_is_concat_stable(MVMThreadContext *tc, MVMString *a, MVMString *b) { MVMGrapheme32 last_a; MVMGrapheme32 first_b; MVMGrapheme32 crlf; /* If either string is empty, we're good. */ if (a->body.num_graphs == 0 || b->body.num_graphs == 0) return 1; /* Get first and last graphemes of the strings. */ last_a = MVM_string_get_grapheme_at_nocheck(tc, a, a->body.num_graphs - 1); first_b = MVM_string_get_grapheme_at_nocheck(tc, b, 0); /* Put the case where we are adding a lf or crlf line ending */ if (first_b == '\n') /* If we see \r + \n we need to renormalize. Otherwise we're good */ return last_a == '\r' ? 0 : 1; crlf = MVM_nfg_crlf_grapheme(tc); /* As a control code we are always going to break if we see one of these. * Check first_b for speeding up line endings */ if (first_b == crlf || last_a == crlf) return 0; /* If either is synthetic other than "\r\n", assume we'll have to re-normalize * (this is an over-estimate, most likely). Note if you optimize this that it * serves as a guard for what follows. * TODO get the last codepoint of last_a and first codepoint of first_b and call * MVM_unicode_normalize_should_break */ if (last_a < 0 || first_b < 0) return 0; /* If both less than the first significant char for NFC we are good */ if (last_a < MVM_NORMALIZE_FIRST_SIG_NFC && first_b < MVM_NORMALIZE_FIRST_SIG_NFC) { return 1; } else { /* Check if the two codepoints would be joined during normalization. * Returns 1 if they would break and thus is safe under concat, or 0 if * they would be joined. */ MVMNormalizer norm; int rtrn; MVM_unicode_normalizer_init(tc, &norm, MVM_NORMALIZE_NFG); rtrn = MVM_unicode_normalize_should_break(tc, last_a, first_b, &norm); MVM_unicode_normalizer_cleanup(tc, &norm); /* If both CCC are non-zero then it may need to be reordered. For now return 0. * This can be optimized. */ if (MVM_unicode_relative_ccc(tc, last_a) != 0 && MVM_unicode_relative_ccc(tc, first_b) != 0) return 0; return rtrn; } } /* Initialize NFG subsystem. */ static void cache_crlf(MVMThreadContext *tc) { MVMCodepoint codes[2] = { '\r', '\n' }; tc->instance->nfg->crlf_grapheme = lookup_or_add_synthetic(tc, codes, 2, 0); } void MVM_nfg_init(MVMThreadContext *tc) { int init_stat; tc->instance->nfg = calloc(1, sizeof(MVMNFGState)); if ((init_stat = uv_mutex_init(&(tc->instance->nfg->update_mutex))) < 0) { fprintf(stderr, "MoarVM: Initialization of NFG update mutex failed\n %s\n", uv_strerror(init_stat)); exit(1); } cache_crlf(tc); } /* Free all memory allocated to hold synthetic graphemes. These are global * to a VM instance. */ void MVM_nfg_destroy(MVMThreadContext *tc) { MVMNFGState *nfg = tc->instance->nfg; MVMint32 i; /* Free all synthetics. */ if (nfg->synthetics) { size_t used_synths_in_block = nfg->num_synthetics % MVM_SYNTHETIC_GROW_ELEMS; size_t synths_to_free = used_synths_in_block ? nfg->num_synthetics + (MVM_SYNTHETIC_GROW_ELEMS - used_synths_in_block) : nfg->num_synthetics; for (i = 0; i < nfg->num_synthetics; i++) { MVM_fixed_size_free(tc, tc->instance->fsa, nfg->synthetics[i].num_codes * sizeof(MVMCodepoint), nfg->synthetics[i].codes); if (nfg->synthetics[i].case_uc != CASE_UNCHANGED) MVM_free(nfg->synthetics[i].case_uc); if (nfg->synthetics[i].case_lc != CASE_UNCHANGED) MVM_free(nfg->synthetics[i].case_lc); if (nfg->synthetics[i].case_tc != CASE_UNCHANGED) MVM_free(nfg->synthetics[i].case_tc); if (nfg->synthetics[i].case_fc != CASE_UNCHANGED) MVM_free(nfg->synthetics[i].case_fc); } MVM_fixed_size_free(tc, tc->instance->fsa, synths_to_free * sizeof(MVMNFGSynthetic), nfg->synthetics); } MVM_free(nfg); } MoarVM-2018.03/src/strings/nfg.h0000644000175000017510000000665613237701241016423 0ustar samanthasamantha/* State kept around for implementing Normal Form Grapheme. The design is such * that we can always do lookups without needing to acquire a lock. When we * do additions of new synthetics, we must acquire the lock before doing so, * and be sure to validate nothing changed. We also must do sufficient copying * to ensure that we never break another thread doing a read. Memory to be * freed is thus done at a global safe point, which means we never have one * thread reading memory freed by another. */ struct MVMNFGState { /* Table of information about synthetic graphemes. Given some (negative) * synthetic S, we look up in this table with (-S - 1). */ MVMNFGSynthetic *synthetics; /* Trie used to do lookups by codepoints (already in NFC) to an (NFG) * grapheme. */ MVMNFGTrieNode *grapheme_lookup; /* Mutex used when we wish to do updates to the grapheme table. */ uv_mutex_t update_mutex; /* Number of synthetics we have. */ MVMint32 num_synthetics; /* Cached CRLF grapheme index, since we need it so often. */ MVMGrapheme32 crlf_grapheme; }; /* State held about a synthetic. */ struct MVMNFGSynthetic { /* The base (non-combining) grapheme. */ /* The index of the base (non-combining) grapheme * set to -1 if it does not exist */ MVMint32 base_index; /* The number of codepoints we have. */ MVMint32 num_codes; /* Array of codepoints. */ MVMCodepoint *codes; /* Cached case transforms, NULL if not calculated. */ MVMGrapheme32 *case_uc; MVMGrapheme32 *case_lc; MVMGrapheme32 *case_tc; MVMGrapheme32 *case_fc; /* Grapheme counts of cached case transforms. */ MVMint32 case_uc_graphs; MVMint32 case_lc_graphs; MVMint32 case_tc_graphs; MVMint32 case_fc_graphs; /* Is this a UTF-8 C-8 synthetic? */ MVMint32 is_utf8_c8; }; /* A node in the NFG trie. */ struct MVMNFGTrieNode { /* Set of entries for further traversal, sorted ascending on codepoint * so we can find an entry using binary search. */ MVMNFGTrieNodeEntry *next_codes; /* Number of entries in next_cps. */ MVMint32 num_entries; /* Non-zero if we reach a result at this node (and will always be negative * since it's an NFG synthetic). */ MVMGrapheme32 graph; }; /* An entry in the list of next possible codepoints in the NFG trie. */ struct MVMNFGTrieNodeEntry { /* The codepoint. */ MVMCodepoint code; /* Trie node to traverse to if we find this node. */ MVMNFGTrieNode *node; }; /* The maximum number of codepoints we will allow in a synthetic grapheme. * This is a good bit higher than any real-world use case is going to run * in to. */ #define MVM_GRAPHEME_MAX_CODEPOINTS 1024 /* Functions related to grapheme handling. */ MVMGrapheme32 MVM_nfg_codes_to_grapheme(MVMThreadContext *tc, MVMCodepoint *codes, MVMint32 num_codes); MVMGrapheme32 MVM_nfg_codes_to_grapheme_utf8_c8(MVMThreadContext *tc, MVMCodepoint *codes, MVMint32 num_codes); MVMGrapheme32 MVM_nfg_crlf_grapheme(MVMThreadContext *tc); MVMNFGSynthetic * MVM_nfg_get_synthetic_info(MVMThreadContext *tc, MVMGrapheme32 synth); MVMuint32 MVM_nfg_get_case_change(MVMThreadContext *tc, MVMGrapheme32 codepoint, MVMint32 case_, MVMGrapheme32 **result); MVMint32 MVM_nfg_is_concat_stable(MVMThreadContext *tc, MVMString *a, MVMString *b); /* NFG subsystem initialization and cleanup. */ void MVM_nfg_init(MVMThreadContext *tc); void MVM_nfg_destroy(MVMThreadContext *tc); MoarVM-2018.03/src/strings/normalize.c0000644000175000017510000010634313242626641017644 0ustar samanthasamantha#include "moar.h" #define UNI_CP_MALE_SIGN 0x2642 #define UNI_CP_FEMALE_SIGN 0x2640 #define UNI_CP_ZERO_WIDTH_JOINER 0x200D #define UNI_CP_ZERO_WIDTH_NON_JOINER 0x200C /* Maps outside-world normalization form codes to our internal set, validating * that we got something valid. */ MVMNormalization MVM_unicode_normalizer_form(MVMThreadContext *tc, MVMint64 form_in) { switch (form_in) { case 1: return MVM_NORMALIZE_NFC; case 2: return MVM_NORMALIZE_NFD; case 3: return MVM_NORMALIZE_NFKC; case 4: return MVM_NORMALIZE_NFKD; default: MVM_exception_throw_adhoc(tc, "Invalid normalization form %d", (int)form_in); } } /* Takes two objects, which must be of VMArray representation and holding * 32-bit integers. Performs normalization to the specified form. */ static void assert_codepoint_array(MVMThreadContext *tc, const MVMObject *arr, char *error) { if (IS_CONCRETE(arr) && REPR(arr)->ID == MVM_REPR_ID_VMArray) { MVMuint8 slot_type = ((MVMArrayREPRData *)STABLE(arr)->REPR_data)->slot_type; if (slot_type == MVM_ARRAY_I32 || slot_type == MVM_ARRAY_U32) return; } MVM_exception_throw_adhoc(tc, "%s", error); } MVM_STATIC_INLINE void maybe_grow_result(MVMCodepoint **result, MVMint64 *result_alloc, MVMint64 needed) { if (needed >= *result_alloc) { while (needed >= *result_alloc) *result_alloc += 32; *result = MVM_realloc(*result, *result_alloc * sizeof(MVMCodepoint)); } } void MVM_unicode_normalize_codepoints(MVMThreadContext *tc, const MVMObject *in, MVMObject *out, MVMNormalization form) { MVMNormalizer norm; MVMCodepoint *input; MVMCodepoint *result; MVMint64 input_pos, input_codes, result_pos, result_alloc; MVMint32 ready; /* Validate input/output array. */ assert_codepoint_array(tc, in, "Normalization input must be native array of 32-bit integers"); assert_codepoint_array(tc, out, "Normalization output must be native array of 32-bit integers"); /* Get input array; if it's empty, we're done already. */ input = (MVMCodepoint *)((MVMArray *)in)->body.slots.u32 + ((MVMArray *)in)->body.start; input_codes = ((MVMArray *)in)->body.elems; if (input_codes == 0) return; /* Guess output size based on input size. */ result_alloc = input_codes; result = MVM_malloc(result_alloc * sizeof(MVMCodepoint)); /* Perform normalization. */ MVM_unicode_normalizer_init(tc, &norm, form); input_pos = 0; result_pos = 0; while (input_pos < input_codes) { MVMCodepoint cp; ready = MVM_unicode_normalizer_process_codepoint(tc, &norm, input[input_pos], &cp); if (ready) { maybe_grow_result(&result, &result_alloc, result_pos + ready); result[result_pos++] = cp; while (--ready > 0) result[result_pos++] = MVM_unicode_normalizer_get_codepoint(tc, &norm); } input_pos++; } MVM_unicode_normalizer_eof(tc, &norm); ready = MVM_unicode_normalizer_available(tc, &norm); maybe_grow_result(&result, &result_alloc, result_pos + ready); while (ready--) result[result_pos++] = MVM_unicode_normalizer_get_codepoint(tc, &norm); MVM_unicode_normalizer_cleanup(tc, &norm); /* Put result into array body. */ ((MVMArray *)out)->body.slots.u32 = (MVMuint32 *) result; ((MVMArray *)out)->body.start = 0; ((MVMArray *)out)->body.elems = result_pos; } MVMString * MVM_unicode_codepoints_c_array_to_nfg_string(MVMThreadContext *tc, MVMCodepoint * cp_v, MVMint64 cp_count) { MVMNormalizer norm; MVMint64 input_pos, result_pos, result_alloc; MVMGrapheme32 *result; MVMint32 ready; MVMString *str; if (cp_count == 0) return tc->instance->str_consts.empty; /* Guess output size based on cp_v size. */ result_alloc = cp_count; result = MVM_malloc(result_alloc * sizeof(MVMCodepoint)); /* Perform normalization at grapheme level. */ MVM_unicode_normalizer_init(tc, &norm, MVM_NORMALIZE_NFG); input_pos = 0; result_pos = 0; while (input_pos < cp_count) { MVMGrapheme32 g; ready = MVM_unicode_normalizer_process_codepoint_to_grapheme(tc, &norm, cp_v[input_pos], &g); if (ready) { maybe_grow_result(&result, &result_alloc, result_pos + ready); result[result_pos++] = g; while (--ready > 0) result[result_pos++] = MVM_unicode_normalizer_get_grapheme(tc, &norm); } input_pos++; } MVM_unicode_normalizer_eof(tc, &norm); ready = MVM_unicode_normalizer_available(tc, &norm); maybe_grow_result(&result, &result_alloc, result_pos + ready); while (ready--) result[result_pos++] = MVM_unicode_normalizer_get_grapheme(tc, &norm); MVM_unicode_normalizer_cleanup(tc, &norm); /* Produce an MVMString of the result. */ str = (MVMString *)MVM_repr_alloc_init(tc, tc->instance->VMString); str->body.storage.blob_32 = result; str->body.storage_type = MVM_STRING_GRAPHEME_32; str->body.num_graphs = result_pos; return str; } /* Takes an object, which must be of VMArray representation and holding * 32-bit integers. Treats them as Unicode codepoints, normalizes them at * Grapheme level, and returns the resulting NFG string. */ MVMString * MVM_unicode_codepoints_to_nfg_string(MVMThreadContext *tc, const MVMObject *codes) { MVMCodepoint *input; MVMint64 input_codes; assert_codepoint_array(tc, codes, "Code points to string input must be native array of 32-bit integers"); input = (MVMCodepoint *)((MVMArray *)codes)->body.slots.u32 + ((MVMArray *)codes)->body.start; input_codes = ((MVMArray *)codes)->body.elems; return MVM_unicode_codepoints_c_array_to_nfg_string(tc, input, input_codes); } /* Takes an NFG string and populates the array out, which must be a 32-bit * integer array, with codepoints normalized according to the specified * normalization form. */ void MVM_unicode_string_to_codepoints(MVMThreadContext *tc, MVMString *s, MVMNormalization form, MVMObject *out) { MVMCodepoint *result; MVMint64 result_pos, result_alloc; MVMCodepointIter ci; /* Validate output array and set up result storage. */ assert_codepoint_array(tc, out, "Normalization output must be native array of 32-bit integers"); result_alloc = s->body.num_graphs; result = MVM_malloc(result_alloc * sizeof(MVMCodepoint)); result_pos = 0; /* Create codepoint iterator. */ MVM_string_ci_init(tc, &ci, s, 0, 0); /* If we want NFC, just iterate, since NFG is constructed out of NFC. */ if (form == MVM_NORMALIZE_NFC) { while (MVM_string_ci_has_more(tc, &ci)) { maybe_grow_result(&result, &result_alloc, result_pos + 1); result[result_pos++] = MVM_string_ci_get_codepoint(tc, &ci); } } /* Otherwise, need to feed it through a normalizer. */ else { MVMNormalizer norm; MVMint32 ready; MVM_unicode_normalizer_init(tc, &norm, form); while (MVM_string_ci_has_more(tc, &ci)) { MVMCodepoint cp; ready = MVM_unicode_normalizer_process_codepoint(tc, &norm, MVM_string_ci_get_codepoint(tc, &ci), &cp); if (ready) { maybe_grow_result(&result, &result_alloc, result_pos + ready); result[result_pos++] = cp; while (--ready > 0) result[result_pos++] = MVM_unicode_normalizer_get_codepoint(tc, &norm); } } MVM_unicode_normalizer_eof(tc, &norm); ready = MVM_unicode_normalizer_available(tc, &norm); maybe_grow_result(&result, &result_alloc, result_pos + ready); while (ready--) result[result_pos++] = MVM_unicode_normalizer_get_codepoint(tc, &norm); MVM_unicode_normalizer_cleanup(tc, &norm); } /* Put result into array body. */ ((MVMArray *)out)->body.slots.u32 = (MVMuint32 *)result; ((MVMArray *)out)->body.start = 0; ((MVMArray *)out)->body.elems = result_pos; } /* Initialize the MVMNormalizer pointed to to perform the specified kind of * normalization. */ void MVM_unicode_normalizer_init(MVMThreadContext *tc, MVMNormalizer *n, MVMNormalization form) { n->form = form; n->buffer_size = 32; n->buffer = MVM_malloc(n->buffer_size * sizeof(MVMCodepoint)); n->buffer_start = 0; n->buffer_end = 0; n->buffer_norm_end = 0; n->translate_newlines = 0; n->prepend_buffer = 0; n->regional_indicator = 0; switch (n->form) { case MVM_NORMALIZE_NFD: n->first_significant = MVM_NORMALIZE_FIRST_SIG_NFD; n->quick_check_property = MVM_UNICODE_PROPERTY_NFD_QC; break; case MVM_NORMALIZE_NFKD: n->first_significant = MVM_NORMALIZE_FIRST_SIG_NFKD; n->quick_check_property = MVM_UNICODE_PROPERTY_NFKD_QC; break; case MVM_NORMALIZE_NFC: n->first_significant = MVM_NORMALIZE_FIRST_SIG_NFC; n->quick_check_property = MVM_UNICODE_PROPERTY_NFC_QC; break; case MVM_NORMALIZE_NFKC: n->first_significant = MVM_NORMALIZE_FIRST_SIG_NFKC; n->quick_check_property = MVM_UNICODE_PROPERTY_NFKC_QC; break; case MVM_NORMALIZE_NFG: n->quick_check_property = MVM_UNICODE_PROPERTY_NFG_QC; n->first_significant = MVM_NORMALIZE_FIRST_SIG_NFC; break; default: abort(); } } /* Enable translation of newlines from \r\n to \n. */ void MVM_unicode_normalizer_translate_newlines(MVMThreadContext *tc, MVMNormalizer *n) { n->translate_newlines = 1; } /* Cleanup an MVMNormalization once we're done normalizing. */ void MVM_unicode_normalizer_cleanup(MVMThreadContext *tc, MVMNormalizer *n) { free(n->buffer); } /* Adds a codepoint into the buffer, making sure there's space. */ static void add_codepoint_to_buffer(MVMThreadContext *tc, MVMNormalizer *n, MVMCodepoint cp) { if (n->buffer_end == n->buffer_size) { if (n->buffer_start != 0) { MVMint32 shuffle = n->buffer_start; MVMint32 to_move = n->buffer_end - n->buffer_start; memmove(n->buffer, n->buffer + n->buffer_start, to_move * sizeof(MVMCodepoint)); n->buffer_start = 0; n->buffer_end -= shuffle; n->buffer_norm_end -= shuffle; } else { n->buffer_size *= 2; n->buffer = MVM_realloc(n->buffer, n->buffer_size * sizeof(MVMCodepoint)); } } n->buffer[n->buffer_end++] = cp; } /* Hangul-related constants from Unicode spec 3.12, following naming * convention from spec. */ static const int SBase = 0xAC00, LBase = 0x1100, VBase = 0x1161, TBase = 0x11A7, LCount = 19, VCount = 21, TCount = 28, NCount = 588, /* VCount * TCount */ SCount = 11172; /* LCount * NCount */ /* Decomposes a Hangul codepoint and add it into the buffer. */ static void decomp_hangul_to_buffer(MVMThreadContext *tc, MVMNormalizer *n, MVMCodepoint s) { /* Algorithm from Unicode spec 3.12, following naming convention from spec. */ int SIndex = s - SBase; if (SIndex < 0 || SIndex >= SCount) { add_codepoint_to_buffer(tc, n, s); } else { int L = LBase + SIndex / NCount; int V = VBase + (SIndex % NCount) / TCount; int T = TBase + SIndex % TCount; add_codepoint_to_buffer(tc, n, (MVMCodepoint)L); add_codepoint_to_buffer(tc, n, (MVMCodepoint)V); if (T != TBase) add_codepoint_to_buffer(tc, n, (MVMCodepoint)T); } } /* Decompose the codepoint and add it into the buffer. */ static void decomp_codepoint_to_buffer(MVMThreadContext *tc, MVMNormalizer *n, MVMCodepoint cp) { /* See if we actually need to decompose (can skip if the decomposition * type is None, or we're only doing Canonical decomposition and it is * anything except Canonical). */ MVMint16 cp_DT = MVM_unicode_codepoint_get_property_int(tc, cp, MVM_UNICODE_PROPERTY_DECOMPOSITION_TYPE); MVMint64 decompose = 1; if (cp_DT == MVM_UNICODE_PVALUE_DT_NONE) decompose = 0; else if (!MVM_NORMALIZE_COMPAT_DECOMP(n->form) && cp_DT != MVM_UNICODE_PVALUE_DT_CANONICAL ) decompose = 0; if (decompose) { /* We need to decompose. Get the decomp spec and go over the things in * it; things without a decomp spec are presumably Hangul and need the * algorithmic treatment. */ char *spec = (char *)MVM_unicode_codepoint_get_property_cstr(tc, cp, MVM_UNICODE_PROPERTY_DECOMP_SPEC); if (spec && spec[0]) { char *end = spec + strlen(spec); while (spec < end) { /* Parse hex character code, and then recurse to do any further * decomposition on it; this recursion terminates when we find a * non-decomposable thing and add it to the buffer. */ MVMCodepoint decomp_char = (MVMCodepoint)strtol(spec, &spec, 16); decomp_codepoint_to_buffer(tc, n, decomp_char); } } else { decomp_hangul_to_buffer(tc, n, cp); } } else { /* Don't need to decompose; add it right into the buffer. */ add_codepoint_to_buffer(tc, n, cp); } } /* Checks if the specified character answers "yes" on the appropriate quick check. */ static MVMint64 passes_quickcheck(MVMThreadContext *tc, const MVMNormalizer *n, MVMCodepoint cp) { const char *pval = MVM_unicode_codepoint_get_property_cstr(tc, cp, n->quick_check_property); return pval && pval[0] == 'Y'; } /* Gets the CCC (actual value) but is slower as it looks up with string properties * Exact values are not needed for normalization. * Returns 0 for Not_Reordered codepoints *and* CCC 0 codepoints */ static MVMint64 ccc_old(MVMThreadContext *tc, MVMCodepoint cp) { if (cp < MVM_NORMALIZE_FIRST_NONZERO_CCC) { return 0; } else { const char *ccc_str = MVM_unicode_codepoint_get_property_cstr(tc, cp, MVM_UNICODE_PROPERTY_CANONICAL_COMBINING_CLASS); return !ccc_str || strlen(ccc_str) > 3 ? 0 : fast_atoi(ccc_str); } } /* Gets the canonical combining class for a codepoint. Does a shortcut * since CCC is stored as a string property, though because they are all sorted * numerically it is ok to get the internal integer value as stored instead of * the string. * Returns 0 for Not_Reordered codepoints *and* CCC 0 codepoints */ MVMint64 MVM_unicode_relative_ccc(MVMThreadContext *tc, MVMCodepoint cp) { if (cp < MVM_NORMALIZE_FIRST_NONZERO_CCC) { return 0; } else { int ccc_int = MVM_unicode_codepoint_get_property_int(tc, cp, MVM_UNICODE_PROPERTY_CANONICAL_COMBINING_CLASS); return ccc_int <= MVM_UNICODE_PVALUE_CCC_0 ? 0 : ccc_int - MVM_UNICODE_PVALUE_CCC_0; } } /* Checks if the thing we have is a control character (for the definition in * the Unicode Standard Annex #29). Full path. Fast path checks for controls * in the Latin-1 range. This works for those as well but needs a property lookup */ MVMint32 MVM_string_is_control_full(MVMThreadContext *tc, MVMCodepoint in) { /* U+200C ZERO WIDTH NON-JOINER and U+200D ZERO WIDTH JOINER are excluded because * they are Cf but not Control's */ if (in != UNI_CP_ZERO_WIDTH_NON_JOINER && in != UNI_CP_ZERO_WIDTH_JOINER) { /* Consider general property: * Cc, Zl, Zp, and Cn which are also Default_Ignorable_Code_Point=True */ const char *genprop = MVM_unicode_codepoint_get_property_cstr(tc, in, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY); switch (genprop[0]) { case 'Z': /* Line_Separator and Paragraph_Separator are controls. */ return genprop[1] == 'l' || genprop[1] == 'p'; case 'C': /* Control, Surrogate are controls. */ if (genprop[1] == 'c' || genprop[1] == 's') { return 1; } if (genprop[1] == 'f' ) { /* Format can have special properties (not control) */ return 0; } /* Unassigned is, but only for Default_Ignorable_Code_Point. */ if (genprop[1] == 'n') { return MVM_unicode_codepoint_get_property_int(tc, in, MVM_UNICODE_PROPERTY_DEFAULT_IGNORABLE_CODE_POINT) != 0; } } } return 0; } /* Implements the Unicode Canonical Ordering algorithm (3.11, D109). */ static void canonical_sort(MVMThreadContext *tc, MVMNormalizer *n, MVMint32 from, MVMint32 to) { /* Yes, this is the simplest possible thing. Key thing if you decide to * replace it with something more optimal: it must not re-order code * points with equal CCC. */ MVMint32 reordered = 1; while (reordered) { MVMint32 i = from; reordered = 0; while (i < to - 1) { MVMint64 cccA = MVM_unicode_relative_ccc(tc, n->buffer[i]); MVMint64 cccB = MVM_unicode_relative_ccc(tc, n->buffer[i + 1]); if (cccA > cccB && cccB > 0) { MVMCodepoint tmp = n->buffer[i]; n->buffer[i] = n->buffer[i + 1]; n->buffer[i + 1] = tmp; reordered = 1; } i++; } } } /* Implements the Unicode Canonical Composition algorithm (3.11, D117). */ static void canonical_composition(MVMThreadContext *tc, MVMNormalizer *n, MVMint32 from, MVMint32 to) { MVMint32 c_idx = from + 1; while (c_idx < to) { /* Search for the last non-blocked starter. */ MVMint32 ss_idx = c_idx - 1; MVMint32 c_ccc = MVM_unicode_relative_ccc(tc, n->buffer[c_idx]); while (ss_idx >= from) { /* Make sure we don't go past a code point that blocks a starter * from the current character we're considering. */ MVMint32 ss_ccc = MVM_unicode_relative_ccc(tc, n->buffer[ss_idx]); if (ss_ccc >= c_ccc && ss_ccc != 0) break; /* Have we found a starter? */ if (ss_ccc == 0) { /* See if there's a primary composite for the starter and the * current code point under consideration. */ MVMCodepoint pc = MVM_unicode_find_primary_composite(tc, n->buffer[ss_idx], n->buffer[c_idx]); if (pc > 0) { /* Replace the starter with the primary composite. */ n->buffer[ss_idx] = pc; /* Move the rest of the buffer back one position. */ memmove(n->buffer + c_idx, n->buffer + c_idx + 1, (n->buffer_end - (c_idx + 1)) * sizeof(MVMCodepoint)); n->buffer_end--; /* Sync cc_idx and to with the change. */ c_idx--; to--; } /* Don't look back beyond this starter; covers the ccc(B) = 0 * case of D105. */ break; } ss_idx--; } /* Move on to the next character. */ c_idx++; } /* Make another pass for the Hangul special case. (A future optimization * may be to incorporate this into the above loop.) */ c_idx = from; while (c_idx < to - 1) { /* Do we have a potential LPart? */ MVMCodepoint LPart = n->buffer[c_idx]; if (LPart >= LBase && LPart <= (LBase + LCount)) { /* Yes, now see if it's followed by a VPart (always safe to look * due to "to - 1" in loop condition above). */ MVMCodepoint LIndex = LPart - LBase; MVMCodepoint VPart = n->buffer[c_idx + 1]; if (VPart >= VBase && VPart <= (VBase + VCount)) { /* Certainly something to compose; compute that. */ MVMCodepoint VIndex = VPart - VBase; MVMCodepoint LVIndex = LIndex * NCount + VIndex * TCount; MVMCodepoint s = SBase + LVIndex; MVMint32 composed = 1; /* Is there a TPart too? */ if (c_idx < to - 2) { MVMCodepoint TPart = n->buffer[c_idx + 2]; if (TPart >= TBase && TPart <= (TBase + TCount)) { /* We need to compose 3 things. */ MVMCodepoint TIndex = TPart - TBase; s += TIndex; composed = 2; } } /* Put composed codepoint into the buffer. */ n->buffer[c_idx] = s; /* Shuffle codepoints after this in the buffer back. */ memmove(n->buffer + c_idx + 1, n->buffer + c_idx + 1 + composed, (n->buffer_end - (c_idx + 1 + composed)) * sizeof(MVMCodepoint)); n->buffer_end -= composed; /* Sync to with updated buffer size. */ to -= composed; } } c_idx++; } } /* Performs grapheme composition (to get Normal Form Grapheme) on the range of * codepoints provided. This follows the algorithm in the Unicode Standard * Annex #29 on grapheme cluster boundaries. Note that we have already done * the handling of breaking around controls much earlier, so don't have to * consider that case. */ static MVMint32 maybe_hangul(MVMCodepoint cp) { return (0x1100 <= cp && cp < 0x1200) || (0xA960 <= cp && cp < 0xD7FC); } static MVMint32 is_grapheme_extend(MVMThreadContext *tc, MVMCodepoint cp) { return MVM_unicode_codepoint_get_property_int(tc, cp, MVM_UNICODE_PROPERTY_GRAPHEME_EXTEND); } static MVMint32 is_grapheme_prepend(MVMThreadContext *tc, MVMCodepoint cp) { return MVM_unicode_codepoint_get_property_int(tc, cp, MVM_UNICODE_PROPERTY_PREPENDED_CONCATENATION_MARK); } /* Returns 0 if the two graphemes should be combined and returns 1 or 2 if * the graphemes should break. 2 is returned if more than the currenly seen * graphemes may be needed to determine the breaking (this is only needed if * we are checking two arbitrary codepoints. If we are normalizing linearly from * the start of the string this has no more significance than returning 1) */ MVMint32 MVM_unicode_normalize_should_break(MVMThreadContext *tc, MVMCodepoint a, MVMCodepoint b, MVMNormalizer *norm) { int GCB_a, GCB_b; /* Don't break between \r and \n, but otherwise break around \r. */ if (a == 0x0D && b == 0x0A) return 0; if (a == 0x0D || b == 0x0D) return 1; /* For utf8-c8 graphemes. These we can't request property values and act like * control's */ if (a < 0 || b < 0) { if ((a < 0 && MVM_nfg_get_synthetic_info(tc, a)->is_utf8_c8) || (b < 0 && MVM_nfg_get_synthetic_info(tc, b)->is_utf8_c8)) return 1; MVM_exception_throw_adhoc(tc, "Internal error: synthetic grapheme found when computing grapheme segmentation"); } GCB_a = MVM_unicode_codepoint_get_property_int(tc, a, MVM_UNICODE_PROPERTY_GRAPHEME_CLUSTER_BREAK); GCB_b = MVM_unicode_codepoint_get_property_int(tc, b, MVM_UNICODE_PROPERTY_GRAPHEME_CLUSTER_BREAK); switch (GCB_a) { case MVM_UNICODE_PVALUE_GCB_REGIONAL_INDICATOR: if (2 <= norm->regional_indicator) { norm->regional_indicator = 0; if (GCB_b == MVM_UNICODE_PVALUE_GCB_REGIONAL_INDICATOR) /* Return 2 here so is_concat_stable can know to run re_nfg */ return 2; } if (GCB_b == MVM_UNICODE_PVALUE_GCB_REGIONAL_INDICATOR) { if (!norm->regional_indicator) norm->regional_indicator = 2; else norm->regional_indicator++; return 0; } break; /* Don't break after Prepend Grapheme_Cluster_Break=Prepend */ case MVM_UNICODE_PVALUE_GCB_PREPEND: /* If it's a control character remember to break */ if (MVM_string_is_control_full(tc, b )) { return 1; } /* Otherwise don't break */ return 0; /* Don't break after ZWJ for E_Base_GAZ or Glue_After_ZWJ */ case MVM_UNICODE_PVALUE_GCB_ZWJ: switch (GCB_b) { case MVM_UNICODE_PVALUE_GCB_E_BASE_GAZ: case MVM_UNICODE_PVALUE_GCB_ZWJ: case MVM_UNICODE_PVALUE_GCB_GLUE_AFTER_ZWJ: return 0; } if ( b == UNI_CP_FEMALE_SIGN || b == UNI_CP_MALE_SIGN ) return 0; /* Don't break after ZWJ for Emoji property characters that have * GCB=Other. This is *not* a unicode text segmentation rule but * is needed to not break inside Emoji sequences. As the rule to * not break in Emoji sequences is specified by Unicode to need * customization to perform properly. */ if (GCB_b == MVM_UNICODE_PVALUE_GCB_OTHER && 127 < b /* Numbers and # have property Emoji. So make sure we're not in ASCII range */ && MVM_unicode_codepoint_get_property_int(tc, b, MVM_UNICODE_PROPERTY_EMOJI) ) return 0; case MVM_UNICODE_PVALUE_GCB_E_MODIFIER: if (MVM_unicode_codepoint_get_property_int(tc, b, MVM_UNICODE_PROPERTY_EMOJI_MODIFIER_BASE)) { /* Don't break after ZWJ if it's an Emoji Sequence. * At the moment FEMALE SIGN and MALE SIGN don't have different * GCB properties, or any special Emoji properties (Unicode 9.0), * so we explictly check these codepoints here */ if ( b == UNI_CP_FEMALE_SIGN || b == UNI_CP_MALE_SIGN ) return 0; } break; case MVM_UNICODE_PVALUE_GCB_L: if (GCB_b == MVM_UNICODE_PVALUE_GCB_L || GCB_b == MVM_UNICODE_PVALUE_GCB_V || GCB_b == MVM_UNICODE_PVALUE_GCB_LV || GCB_b == MVM_UNICODE_PVALUE_GCB_LVT) return 0; break; case MVM_UNICODE_PVALUE_GCB_LV: case MVM_UNICODE_PVALUE_GCB_V: if (GCB_b == MVM_UNICODE_PVALUE_GCB_V || GCB_b == MVM_UNICODE_PVALUE_GCB_T) return 0; break; case MVM_UNICODE_PVALUE_GCB_LVT: case MVM_UNICODE_PVALUE_GCB_T: if (GCB_b == MVM_UNICODE_PVALUE_GCB_T) return 0; break; } switch (GCB_b) { /* Don't break before extending chars */ case MVM_UNICODE_PVALUE_GCB_EXTEND: return 0; /* Don't break before ZWJ */ case MVM_UNICODE_PVALUE_GCB_ZWJ: return 0; case MVM_UNICODE_PVALUE_GCB_E_MODIFIER: switch (GCB_a) { case MVM_UNICODE_PVALUE_GCB_E_BASE_GAZ: return 0; case MVM_UNICODE_PVALUE_GCB_E_BASE: return 0; } if (MVM_unicode_codepoint_get_property_int(tc, a, MVM_UNICODE_PROPERTY_EMOJI_MODIFIER_BASE)) { /* Not all emoji modifiers have E_BASE or E_BASE_GAZ, some cases we need to check the * Emoji_Modifier_Base property */ return 0; } break; /* Don't break before spacing marks. */ case MVM_UNICODE_PVALUE_GCB_SPACINGMARK: return 0; } /* Otherwise break. */ return 1; } static void grapheme_composition(MVMThreadContext *tc, MVMNormalizer *n, MVMint32 from, MVMint32 to) { if (to - from >= 2) { MVMint32 starterish = from; MVMint32 insert_pos = from; MVMint32 pos = from; while (pos < to) { MVMint32 next_pos = pos + 1; if (next_pos == to || MVM_unicode_normalize_should_break(tc, n->buffer[pos], n->buffer[next_pos], n)) { /* Last in buffer or next code point is a non-starter; turn * sequence into a synthetic. */ MVMGrapheme32 g = MVM_nfg_codes_to_grapheme(tc, n->buffer + starterish, next_pos - starterish); if (n->translate_newlines && g == MVM_nfg_crlf_grapheme(tc)) g = '\n'; n->buffer[insert_pos++] = g; /* The next code point is our new starterish (harmless if we * are already at the end of the buffer). */ starterish = next_pos; } pos++; } memmove(n->buffer + insert_pos, n->buffer + to, (n->buffer_end - to) * sizeof(MVMCodepoint)); n->buffer_end -= to - insert_pos; } } /* Called when the very fast case of normalization fails (that is, when we get * any two codepoints in a row where at least one is greater than the first * significant codepoint identified by a quick check for the target form). We * may find the quick check itself is enough; if not, we have to do real work * compute the normalization. */ MVMint32 MVM_unicode_normalizer_process_codepoint_full(MVMThreadContext *tc, MVMNormalizer *norm, MVMCodepoint in, MVMCodepoint *out) { MVMint64 qc_in, ccc_in; int is_prepend = is_grapheme_prepend(tc, in); if (0 < norm->prepend_buffer) norm->prepend_buffer--; if (is_prepend) norm->prepend_buffer = 2; /* If it's a control character (outside of the range we checked in the * fast path) then it's a normalization terminator. */ if (in > 0xFF && MVM_string_is_control_full(tc, in) && !is_prepend) { return MVM_unicode_normalizer_process_codepoint_norm_terminator(tc, norm, in, out); } /* Do a quickcheck on the codepoint we got in and get its CCC. */ qc_in = passes_quickcheck(tc, norm, in); ccc_in = MVM_unicode_relative_ccc(tc, in); /* Fast cases when we pass quick check and what we got in has CCC = 0, * and it does not follow a prepend character. */ if (qc_in && ccc_in == 0 && norm->prepend_buffer == 0) { if (MVM_NORMALIZE_COMPOSE(norm->form)) { /* We're composing. If we have exactly one thing in the buffer and * it also passes the quick check, and both it and the thing in the * buffer have a CCC of zero, we can hand back the first of the * two - effectively replacing what's in the buffer with the new * codepoint coming in. Note that the NFG quick-check property * factors in grapheme extenders that don't have a CCC of zero, * so we're safe. */ if (norm->buffer_end - norm->buffer_start == 1) { MVMCodepoint maybe_result = norm->buffer[norm->buffer_start]; if (passes_quickcheck(tc, norm, maybe_result) && MVM_unicode_relative_ccc(tc, maybe_result) == 0) { *out = norm->buffer[norm->buffer_start]; norm->buffer[norm->buffer_start] = in; return 1; } } } else { /* We're only decomposing. There should probably be nothing in the * buffer in this case; if so we can simply return the codepoint. */ if (norm->buffer_start == norm->buffer_end) { *out = in; return 1; } } } /* If we didn't pass quick check... */ if (!qc_in || 0 < norm->prepend_buffer) { /* If we're composing, then decompose the last thing placed in the * buffer, if any. We need to do this since it may have passed * quickcheck, but having seen some character that does pass then we * must make sure we decomposed the prior passing one too. */ if (MVM_NORMALIZE_COMPOSE(norm->form) && norm->buffer_end != norm->buffer_norm_end && !is_prepend) { MVMCodepoint decomp = norm->buffer[norm->buffer_end - 1]; norm->buffer_end--; decomp_codepoint_to_buffer(tc, norm, decomp); } /* Decompose this new character into the buffer. We'll need to see * more before we can go any further. */ decomp_codepoint_to_buffer(tc, norm, in); return 0; } /* Since anything we have at this point does pass quick check, add it to * the buffer directly. */ add_codepoint_to_buffer(tc, norm, in); /* If the codepoint has a CCC that is non-zero, it's not a starter so we * should see more before normalizing. */ if (ccc_in > 0) return 0; /* If we don't have at least one codepoint in the buffer, it's too early * to hand anything back. */ if (norm->buffer_end - norm->buffer_start <= 1) return 0; /* Perform canonical sorting on everything from the start of the not yet * normalized things in the buffer, up to but excluding the quick-check * passing thing we just added. */ canonical_sort(tc, norm, norm->buffer_norm_end, norm->buffer_end - 1); /* Perform canonical composition and grapheme composition if needed. */ if (MVM_NORMALIZE_COMPOSE(norm->form)) { canonical_composition(tc, norm, norm->buffer_norm_end, norm->buffer_end - 1); if (MVM_NORMALIZE_GRAPHEME(norm->form)) grapheme_composition(tc, norm, norm->buffer_norm_end, norm->buffer_end - 1); } /* We've now normalized all except the latest, quick-check-passing * codepoint. */ norm->buffer_norm_end = norm->buffer_end - 1; /* Hand back a codepoint, and flag how many more are available. */ *out = norm->buffer[norm->buffer_start]; return norm->buffer_norm_end - norm->buffer_start++; } /* Push a number of codepoints into the "to normalize" buffer. */ void MVM_unicode_normalizer_push_codepoints(MVMThreadContext *tc, MVMNormalizer *n, const MVMCodepoint *in, MVMint32 num_codepoints) { MVMint32 i; for (i = 0; i < num_codepoints; i++) decomp_codepoint_to_buffer(tc, n, in[i]); } /* Processes a codepoint that we regard as a "normalization terminator". These * never have a decomposition, and for all practical purposes will not have a * combiner on them. We treat them specially so we don't, during I/O, block on * seeing a codepoint after them, which for things like REPLs that need to see * input right after a \n makes for problems. */ MVMint32 MVM_unicode_normalizer_process_codepoint_norm_terminator(MVMThreadContext *tc, MVMNormalizer *n, MVMCodepoint in, MVMCodepoint *out) { /* Add the codepoint into the buffer. */ add_codepoint_to_buffer(tc, n, in); /* Treat this as an "eof", which really means "normalize what ya got". */ MVM_unicode_normalizer_eof(tc, n); /* Hand back a normalized codepoint, and the number available (have to * compensate for the one we steal for *out). */ *out = MVM_unicode_normalizer_get_codepoint(tc, n); return 1 + MVM_unicode_normalizer_available(tc, n); } /* Called when we are expecting no more codepoints. */ void MVM_unicode_normalizer_eof(MVMThreadContext *tc, MVMNormalizer *n) { /* Perform canonical ordering and, if needed, canonical composition on * what remains. */ canonical_sort(tc, n, n->buffer_norm_end, n->buffer_end); if (MVM_NORMALIZE_COMPOSE(n->form)) { canonical_composition(tc, n, n->buffer_norm_end, n->buffer_end); if (MVM_NORMALIZE_GRAPHEME(n->form)) grapheme_composition(tc, n, n->buffer_norm_end, n->buffer_end); } /* Reset these two to ensure their value doesn't stick around */ n->prepend_buffer = 0; n->regional_indicator = 0; /* We've now normalized all that remains. */ n->buffer_norm_end = n->buffer_end; } MoarVM-2018.03/src/strings/normalize.h0000644000175000017510000002363113237701241017641 0ustar samanthasamantha/* Normalization modes. Numbers picked so that: * - The LSB tells us whether to do canonical or compatibility normalization * - The second bit tells us whether to do canonical normalization * - The third bit tells us to go a step further and create synthetic codes * for graphemes. */ typedef enum { MVM_NORMALIZE_NFD = 0, MVM_NORMALIZE_NFKD = 1, MVM_NORMALIZE_NFC = 2, MVM_NORMALIZE_NFKC = 3, MVM_NORMALIZE_NFG = 6 } MVMNormalization; /* Ways of checking various properties of the normalization form. */ #define MVM_NORMALIZE_COMPAT_DECOMP(form) (form & 1) #define MVM_NORMALIZE_COMPOSE(form) (form & 2) #define MVM_NORMALIZE_GRAPHEME(form) (form & 4) /* First codepoint where we have to actually do a real check and maybe some * work when normalizing. */ #define MVM_NORMALIZE_FIRST_SIG_NFD 0x00C0 #define MVM_NORMALIZE_FIRST_SIG_NFC 0x0300 #define MVM_NORMALIZE_FIRST_SIG_NFKD 0x00A0 #define MVM_NORMALIZE_FIRST_SIG_NFKC 0x00A0 /* First codepoint with a non-zero canonical combining class. */ #define MVM_NORMALIZE_FIRST_NONZERO_CCC 0x300 /* Streaming Unicode normalizer structure. */ struct MVMNormalizer { /* What form of normalization are we doing? */ MVMNormalization form; /* Current buffer of codepoints we're working to normalize. */ MVMCodepoint *buffer; /* Size of the normalization buffer. */ MVMint32 buffer_size; /* Start offset in the buffer where we're still processing. */ MVMint32 buffer_start; /* End offset in the buffer, and where to add the next thing to process. */ MVMint32 buffer_end; /* End offset in the buffer for things we've normalized and so can return. */ MVMint32 buffer_norm_end; /* The first significant codepoint in this normalization form that we may * have to do something with. If we see two things beneath the limit in a * row then we know the first one below it is good to spit out. */ MVMCodepoint first_significant; /* The quickcheck property for the normalization form in question. */ MVMint32 quick_check_property; /* If we should translate the \r\n grapheme to \n (only applicable when * normalizing to NFG). */ MVMint32 translate_newlines; MVMint32 prepend_buffer; MVMint32 regional_indicator; }; /* Guts-y functions, called by the API level ones below. */ MVMint32 MVM_unicode_normalizer_process_codepoint_full(MVMThreadContext *tc, MVMNormalizer *n, MVMCodepoint in, MVMCodepoint *out); MVMint32 MVM_unicode_normalizer_process_codepoint_norm_terminator(MVMThreadContext *tc, MVMNormalizer *n, MVMCodepoint in, MVMCodepoint *out); /* Takes a codepoint to process for normalization as the "in" parameter. If we * are able to produce one or more normalized codepoints right off, then we * put it into the location pointed to by "out", and return the number of * codepoints now available including the one we just passed out. If we can't * produce a normalized codepoint right now, we return a 0. */ MVM_STATIC_INLINE MVMint32 MVM_unicode_normalizer_process_codepoint(MVMThreadContext *tc, MVMNormalizer *n, MVMCodepoint in, MVMCodepoint *out) { /* Control characters in the Latin-1 range are normalization terminators - * that is, we know we can spit out whatever codepoints we have seen so * far in normalized form without having to consider them into the * normalization process. The exception is if we're computing NFG, and * we got \r, which can form a grapheme in the case of \r\n. */ if (in < 0x20 || (0x7F <= in && in <= 0x9F) || in == 0xAD) { /* For utf8-c8 synthetic graphemes. May be able to be removed after * changing and further testing of the TODO marked below. */ if (in < 0) { if (MVM_nfg_get_synthetic_info(tc, in)->is_utf8_c8) return MVM_unicode_normalizer_process_codepoint_norm_terminator(tc, n, in, out); MVM_exception_throw_adhoc(tc, "Internal error: encountered non-utf8-c8 synthetic during normalization"); } /* TODO this does not seem to do what the comment above shows. Likely * needs changing */ if (!(MVM_NORMALIZE_GRAPHEME(n->form) && in == 0x0D)) return MVM_unicode_normalizer_process_codepoint_norm_terminator(tc, n, in, out); } /* Fast-paths apply when the codepoint to consider is too low to have any * interesting properties in the target normalization form AND * it doesn't follow a prepend character */ if (in < n->first_significant && !n->prepend_buffer) { if (MVM_NORMALIZE_COMPOSE(n->form)) { /* For the composition fast path we always have to know that we've * seen two codepoints in a row that are below those needing a full * check. Then we can spit out the first one. Exception: we are * normalizing to graphemes and see \r. */ if (!(MVM_NORMALIZE_GRAPHEME(n->form) && in == 0x0D)) { if (n->buffer_end - n->buffer_start == 1) { if (n->buffer[n->buffer_start] < n->first_significant) { *out = n->buffer[n->buffer_start]; n->buffer[n->buffer_start] = in; return 1; } } } } else { /* For decomposition fast-path, the buffer should be empty. In * that case, we just hand back what we got. */ if (n->buffer_start == n->buffer_end) { *out = in; return 1; } } } /* Fall back to slow path. */ return MVM_unicode_normalizer_process_codepoint_full(tc, n, in, out); } /* Grapheme version of the above. Note that this exists mostly for API clarity * rather than adding any semantics; the normalizer must be configured to * produce NFG to get synthetics out. */ MVM_STATIC_INLINE MVMint32 MVM_unicode_normalizer_process_codepoint_to_grapheme(MVMThreadContext *tc, MVMNormalizer *n, MVMCodepoint in, MVMGrapheme32 *out) { assert(sizeof(MVMCodepoint) == sizeof(MVMGrapheme32)); return MVM_unicode_normalizer_process_codepoint(tc, n, in, (MVMGrapheme32 *)out); } /* Push a number of codepoints into the "to normalize" buffer. */ void MVM_unicode_normalizer_push_codepoints(MVMThreadContext *tc, MVMNormalizer *n, const MVMCodepoint *in, MVMint32 num_codepoints); /* Get the number of codepoints/graphemes ready to fetch. */ MVM_STATIC_INLINE MVMint32 MVM_unicode_normalizer_available(MVMThreadContext *tc, MVMNormalizer *n) { return n->buffer_norm_end - n->buffer_start; } /* Get the number of codepoints/graphemes ready to fetch. */ MVM_STATIC_INLINE MVMint32 MVM_unicode_normalizer_empty(MVMThreadContext *tc, MVMNormalizer *n) { return n->buffer_end == n->buffer_start; } /* Indicate that we've reached the end of the input stream. Any codepoints * left to normalize now can be. */ void MVM_unicode_normalizer_eof(MVMThreadContext *tc, MVMNormalizer *n); /* Get a normalized codepoint; should only ever be called if there are some * known to be available, either because normalize_to_codepoint returned a * value greater than 1, or normalize_available returned a non-zero value. */ MVM_STATIC_INLINE MVMCodepoint MVM_unicode_normalizer_get_codepoint(MVMThreadContext *tc, MVMNormalizer *n) { if (n->buffer_norm_end == n->buffer_start) MVM_exception_throw_adhoc(tc, "Normalization: illegal call to get codepoint"); return n->buffer[n->buffer_start++]; } /* Grapheme version of the above. Note that this exists mostly for API clarity * rather than adding any semantics; the normalizer must be configured to * produce NFG to get synthetics out. */ MVM_STATIC_INLINE MVMGrapheme32 MVM_unicode_normalizer_get_grapheme(MVMThreadContext *tc, MVMNormalizer *n) { assert(sizeof(MVMCodepoint) == sizeof(MVMGrapheme32)); if (n->buffer_norm_end == n->buffer_start) MVM_exception_throw_adhoc(tc, "Normalization: illegal call to get grapheme"); return (MVMGrapheme32)n->buffer[n->buffer_start++]; } /* Setup and teardown of the MVMNormalizer struct. */ MVMNormalization MVM_unicode_normalizer_form(MVMThreadContext *tc, MVMint64 form_in); void MVM_unicode_normalizer_init(MVMThreadContext *tc, MVMNormalizer *n, MVMNormalization norm); void MVM_unicode_normalizer_translate_newlines(MVMThreadContext *tc, MVMNormalizer *n); void MVM_unicode_normalizer_cleanup(MVMThreadContext *tc, MVMNormalizer *n); /* High-level normalize implementation, working from an input array of * codepoints and producing an output array of codepoints. */ void MVM_unicode_normalize_codepoints(MVMThreadContext *tc, const MVMObject *in, MVMObject *out, MVMNormalization form); /* High-level function to produces an NFG string from an input array of * codepoints. */ MVMString * MVM_unicode_codepoints_to_nfg_string(MVMThreadContext *tc,const MVMObject *codes); MVMString * MVM_unicode_codepoints_c_array_to_nfg_string(MVMThreadContext *tc, MVMCodepoint * cp_v, MVMint64 cp_count); /* High-level function to produce an array of codepoints from a string. */ void MVM_unicode_string_to_codepoints(MVMThreadContext *tc, MVMString *s, MVMNormalization form, MVMObject *out); /* faster atoi function */ MVM_STATIC_INLINE MVMint32 fast_atoi( const char * dec_str ) { MVMint32 value = 0; while( *dec_str ) { value = value*10 + (*dec_str++ - '0'); } return value; } MVMint64 MVM_unicode_relative_ccc(MVMThreadContext *tc, MVMCodepoint cp); MVMint32 MVM_unicode_normalize_should_break(MVMThreadContext *tc, MVMCodepoint a, MVMCodepoint b, MVMNormalizer *norm); MVMint64 MVM_unicode_relative_ccc(MVMThreadContext *tc, MVMCodepoint cp); MVMint32 MVM_string_is_control_full(MVMThreadContext *tc, MVMCodepoint in); /* Function for choosing the appropriate line-ending grapheme depending on if * newline translation is enabled. */ MVM_STATIC_INLINE MVMGrapheme32 MVM_unicode_normalizer_translated_crlf(MVMThreadContext *tc, MVMNormalizer *n) { return n->translate_newlines ? '\n' : MVM_nfg_crlf_grapheme(tc); } MoarVM-2018.03/src/strings/ops.c0000644000175000017510000035131613243117024016436 0ustar samanthasamantha#include "platform/memmem.h" #include "moar.h" #define MVM_DEBUG_STRANDS 0 #define MVM_string_KMP_max_pattern_length 8192 /* Max value possible for MVMuint32 MVMStringBody.num_graphs */ #define MAX_GRAPHEMES 0xFFFFFFFFLL #if MVM_DEBUG_STRANDS static void check_strand_sanity(MVMThreadContext *tc, MVMString *s) { MVMGraphemeIter gi; MVMuint32 len; MVM_string_gi_init(tc, &gi, s); len = 0; while (MVM_string_gi_has_more(tc, &gi)) { MVM_string_gi_get_grapheme(tc, &gi); len++; } if (len != MVM_string_graphs(tc, s)) MVM_exception_throw_adhoc(tc, "Strand sanity check failed (strand length %d != num_graphs %d)", len, MVM_string_graphs(tc, s)); } #define STRAND_CHECK(tc, s) check_strand_sanity(tc, s); #else #define STRAND_CHECK(tc, s) #endif static MVMString * re_nfg(MVMThreadContext *tc, MVMString *in); #if MVM_DEBUG_NFG static char * NFG_check_make_debug_string (MVMThreadContext *tc, MVMGrapheme32 g) { char *result = NULL; char *picked = NULL; if (g == '\r') picked = "\\r"; else if (g == '\n') picked = "\\n"; else if (g == MVM_nfg_crlf_grapheme(tc)) picked = "\\r\\n"; else if (0 <= g && !MVM_string_is_control_full(tc, g)) result = MVM_string_utf8_encode_C_string(tc, MVM_string_chr(tc, g)); else if (g < 0) { MVMNFGSynthetic *synth = MVM_nfg_get_synthetic_info(tc, g); char *format_str = " with num_codes = "; char *format_str2 = " first, second cp = "; char *synthtype_str = synth->is_utf8_c8 ? "utf8-8 Synthetic" : "Normal Synthetic"; int this_len = strlen(format_str) + strlen(synthtype_str) + 6 + strlen(format_str2) + 11 + 1 + 11 + 1; result = MVM_malloc(this_len); if (2 <= synth->num_codes) sprintf(result, "%s%s%5i%s%.10"PRIi32",%.10"PRIi32"", synthtype_str, format_str, synth->num_codes, format_str2, synth->codes[0], synth->codes[1]); else sprintf(result, "WARNING synth has less than 2 codes"); fprintf(stderr, "synth numcodes %i %"PRIi32"\n", MVM_nfg_get_synthetic_info(tc, synth->codes[1])->num_codes, MVM_nfg_get_synthetic_info(tc, synth->codes[1])->codes[0] ); } else picked = "[Control]"; if (picked) { result = MVM_malloc(sizeof(char) * (strlen(picked) + 1)); strcpy(result, picked); } if (!result) { result = MVM_malloc(sizeof(char) * 1); result[0] = 0; } return result; } static char * NFG_checker (MVMThreadContext *tc, MVMString *orig, char *varname); void NFG_check (MVMThreadContext *tc, MVMString *orig, char *varname) { char *out = NFG_checker(tc, orig, varname); char *waste[2] = { out, NULL }; if (!out) return; MVM_exception_throw_adhoc_free(tc, waste, "%s", out); } static char * NFG_checker (MVMThreadContext *tc, MVMString *orig, char *varname) { MVMString *renorm = NULL; MVMStringIndex orig_graphs = MVM_string_graphs(tc, orig), renorm_graphs = -1; MVMROOT2(tc, orig, renorm, { renorm = re_nfg(tc, orig); renorm_graphs = MVM_string_graphs(tc, renorm); }); if (MVM_DEBUG_NFG_STRICT || orig_graphs != renorm_graphs) { MVMGraphemeIter orig_gi, renorm_gi; MVMint64 index = 0; MVM_string_gi_init(tc, &orig_gi, orig); MVM_string_gi_init(tc, &renorm_gi, renorm); while (MVM_string_gi_has_more(tc, &orig_gi) && MVM_string_gi_has_more(tc, &renorm_gi)) { MVMGrapheme32 orig_g = MVM_string_gi_get_grapheme(tc, &orig_gi), renorm_g = MVM_string_gi_get_grapheme(tc, &renorm_gi); if (orig_g != renorm_g) { char *orig_render = NFG_check_make_debug_string(tc, orig_g), *renorm_render = NFG_check_make_debug_string(tc, renorm_g); char *format = "NFG failure. Got different grapheme count of %s. " "Got %i but after re_nfg got %i\n" "Differing grapheme at index %"PRIi64"\n" "orig: %"PRIi32" (%s) after re_nfg: %"PRIi32" (%s)\n"; int out_size = strlen(orig_render) + strlen(renorm_render) + strlen(varname) + strlen(format) + (5 * 7) + 1; char *out = MVM_malloc(sizeof(char) * out_size); char *waste[] = {orig_render, renorm_render, NULL}; char **w = waste; snprintf(out, out_size, format, varname, orig_graphs, renorm_graphs, index, orig_g, orig_render, renorm_g, renorm_render); MVM_free(orig_render); MVM_free(renorm_render); return out; } index++; } } return NULL; } void NFG_check_concat (MVMThreadContext *tc, MVMString *result, MVMString *a, MVMString *b, char *varname) { char *a_out = NFG_checker(tc, a, "string ‘a’"); char *b_out = NFG_checker(tc, b, "string ‘b’"); char *out = NFG_checker(tc, result, varname); char *strings[] = { a_out, b_out, out }; char *names[] = { "\nconcat string ‘a’: ", "\nconcat string ‘b’: ", "\nconcat result: " }; int i = 0, elems = 4; int rtrn = 0; char * empty = ""; if (!a_out && !b_out && !out) return; else { MVMGrapheme32 last_a = MVM_string_get_grapheme_at_nocheck(tc, a, a->body.num_graphs - 1), first_b = MVM_string_get_grapheme_at_nocheck(tc, b, 0); char *debug_a = NFG_check_make_debug_string(tc, last_a), *debug_b = NFG_check_make_debug_string(tc, first_b), *escaped_a = MVM_string_utf8_encode_C_string(tc, MVM_string_escape(tc, a)), *escaped_b = MVM_string_utf8_encode_C_string(tc, MVM_string_escape(tc, b)), *escaped_result = MVM_string_utf8_encode_C_string(tc, MVM_string_escape(tc, result)); char *waste[] = { out, debug_a, debug_b, escaped_a, escaped_b, escaped_result, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "In concat: a graphs: %"PRIi32" b graphs: %"PRIi32"\n" "last_a: %"PRIi32" (%s) first_b %"PRIi32" (%s)\n" "a: “%sâ€\n" "b: “%sâ€\n" "result: “%sâ€\n" "%s%s%s%s%s%s", MVM_string_graphs(tc, a), MVM_string_graphs(tc, b), last_a, debug_a, first_b, debug_b, escaped_a, escaped_b, escaped_result, (a_out?names[0]:""), (a_out?a_out:""), (b_out?names[1]:""), (b_out?b_out:""), (out?names[2]:""), (out?out:"")); } } #endif MVM_STATIC_INLINE MVMint64 string_equal_at_ignore_case_INTERNAL_loop(MVMThreadContext *tc, void *Hs_or_gic, MVMString *needle_fc, MVMint64 H_start, MVMint64 H_graphs, MVMint64 n_fc_graphs, int ignoremark, int ignorecase, int is_gic); static MVMint64 knuth_morris_pratt_string_index (MVMThreadContext *tc, MVMString *needle, MVMString *Haystack, MVMint64 H_offset); /* Allocates strand storage. */ static MVMStringStrand * allocate_strands(MVMThreadContext *tc, MVMuint16 num_strands) { return MVM_malloc(num_strands * sizeof(MVMStringStrand)); } /* Copies strands from one strand string to another. */ static void copy_strands(MVMThreadContext *tc, const MVMString *from, MVMuint16 from_offset, MVMString *to, MVMuint16 to_offset, MVMuint16 num_strands) { assert(from->body.storage_type == MVM_STRING_STRAND); assert(to->body.storage_type == MVM_STRING_STRAND); memcpy( to->body.storage.strands + to_offset, from->body.storage.strands + from_offset, num_strands * sizeof(MVMStringStrand)); } /* Move strands inside the same strand string. */ static void move_strands(MVMThreadContext *tc, const MVMString *from, MVMuint16 from_offset, MVMString *to, MVMuint16 to_offset, MVMuint16 num_strands) { assert(from->body.storage_type == MVM_STRING_STRAND); assert(to->body.storage_type == MVM_STRING_STRAND); memmove( to->body.storage.strands + to_offset, from->body.storage.strands + from_offset, num_strands * sizeof(MVMStringStrand)); } MVM_STATIC_INLINE int can_fit_into_8bit (MVMGrapheme32 g) { return -128 <= g && g <= 127; } MVM_STATIC_INLINE int can_fit_into_ascii (MVMGrapheme32 g) { return 0 <= g && g <= 127; } /* If a string is currently using 32bit storage, turn it into using * 8 bit storage. Doesn't do any checks at all. */ static void turn_32bit_into_8bit_unchecked(MVMThreadContext *tc, MVMString *str) { MVMGrapheme32 *old_buf = str->body.storage.blob_32; MVMStringIndex i; str->body.storage_type = MVM_STRING_GRAPHEME_8; str->body.storage.blob_8 = MVM_malloc(str->body.num_graphs * sizeof(MVMGrapheme8)); for (i = 0; i < str->body.num_graphs; i++) { str->body.storage.blob_8[i] = old_buf[i]; } MVM_free(old_buf); } /* Accepts an allocated string that should have body.num_graphs set but the blob * unallocated. This function will allocate the space for the blob and iterate * the supplied grapheme iterator for the length of body.num_graphs */ static void iterate_gi_into_string(MVMThreadContext *tc, MVMGraphemeIter *gi, MVMString *result) { MVMuint64 i; result->body.storage_type = MVM_STRING_GRAPHEME_8; result->body.storage.blob_8 = MVM_malloc(result->body.num_graphs * sizeof(MVMGrapheme8)); for (i = 0; i < result->body.num_graphs; i++) { MVMGrapheme32 g = MVM_string_gi_get_grapheme(tc, gi); result->body.storage.blob_8[i] = g; if (!can_fit_into_8bit(g)) { /* If we get here, we saw a codepoint lower than -127 or higher than 127 * so turn it into a 32 bit string instead */ /* Store the old string pointer and previous value of i */ MVMGrapheme8 *old_ref = result->body.storage.blob_8; MVMuint64 prev_i = i; /* Set up the string as 32bit now and allocate space for it */ result->body.storage_type = MVM_STRING_GRAPHEME_32; result->body.storage.blob_32 = MVM_malloc(result->body.num_graphs * sizeof(MVMGrapheme32)); /* Copy the data so far copied from the 8bit blob since it's faster than * setting up the grapheme iterator again */ for (i = 0; i < prev_i; i++) { result->body.storage.blob_32[i] = old_ref[i]; } MVM_free(old_ref); /* Store the grapheme which interupted the sequence. After that we can * continue from where we left off using the grapheme iterator */ result->body.storage.blob_32[prev_i] = g; for (i = prev_i + 1; i < result->body.num_graphs; i++) { result->body.storage.blob_32[i] = MVM_string_gi_get_grapheme(tc, gi); } } } } #define copy_strands_memcpy(BLOB_TYPE, SIZEOF_TYPE, STORAGE_TYPE) { \ result->body.storage.BLOB_TYPE = MVM_malloc(sizeof(SIZEOF_TYPE) * MVM_string_graphs_nocheck(tc, orig)); \ for (i = 0; i < orig->body.num_strands; i++) { \ size_t graphs_this_strand = orig->body.storage.strands[i].end - orig->body.storage.strands[i].start; \ /* If it's 8bit format and there's only one grapheme */ \ if ((STORAGE_TYPE == MVM_STRING_GRAPHEME_ASCII || STORAGE_TYPE == MVM_STRING_GRAPHEME_8) && graphs_this_strand == 1) { \ /* If there are not repetitions we can directly set the grapheme */ \ if (!orig->body.storage.strands[i].repetitions) \ result->body.storage.BLOB_TYPE[graphs_so_far] = orig->body.storage.strands[i].blob_string->body.storage.BLOB_TYPE[orig->body.storage.strands[i].start]; \ /* Otherwise, use memset for the correct number of repetitions */ \ else { \ graphs_this_strand += orig->body.storage.strands[i].repetitions; \ memset(graphs_so_far + result->body.storage.BLOB_TYPE, \ orig->body.storage.strands[i].blob_string->body.storage.BLOB_TYPE[orig->body.storage.strands[i].start], \ graphs_this_strand \ ); \ } \ graphs_so_far += graphs_this_strand; \ } \ else { \ int j = 0; \ for (; j <= orig->body.storage.strands[i].repetitions; j++) { \ memcpy(graphs_so_far + result->body.storage.BLOB_TYPE, \ orig->body.storage.strands[i].blob_string->body.storage.BLOB_TYPE + orig->body.storage.strands[i].start, \ sizeof(SIZEOF_TYPE) * graphs_this_strand \ ); \ graphs_so_far += graphs_this_strand; \ } \ } \ } \ } /* Collapses a bunch of strands into a single blob string. */ static MVMString * collapse_strands(MVMThreadContext *tc, MVMString *orig) { MVMString *result = NULL; size_t graphs_so_far = 0; /* If it's not a strand, just return it */ if (orig->body.storage_type != MVM_STRING_STRAND) return orig; /* If the original string is a STRAND and all the composite strands are * of the same type, then we will collapse it using memcpy instead of * using a grapheme iterator. */ else { size_t i; MVMint32 common_storage_type = orig->body.storage.strands[0].blob_string->body.storage_type; MVMROOT(tc, orig, { result = (MVMString *)MVM_repr_alloc_init(tc, tc->instance->VMString); result->body.num_graphs = MVM_string_graphs(tc, orig); for (i = 1; i < orig->body.num_strands; i++) { if (common_storage_type != orig->body.storage.strands[i].blob_string->body.storage_type) { common_storage_type = -1; break; } } result->body.storage_type = common_storage_type; switch (common_storage_type) { case MVM_STRING_GRAPHEME_32: copy_strands_memcpy(blob_32, MVMGrapheme32, MVM_STRING_GRAPHEME_32); break; case MVM_STRING_GRAPHEME_ASCII: case MVM_STRING_GRAPHEME_8: copy_strands_memcpy(blob_8, MVMGrapheme8, MVM_STRING_GRAPHEME_8); break; default: { MVMGraphemeIter gi; MVM_string_gi_init(tc, &gi, orig); iterate_gi_into_string(tc, &gi, result); } } }); } #if (MVM_DEBUG_STRANDS || MVM_DEBUG_NFG) if (!MVM_string_equal(tc, result, orig)) MVM_exception_throw_adhoc(tc, "result and original were not eq in collapse_strands"); #endif return result; } /* Takes a string that is no longer in NFG form after some concatenation-style * operation, and returns a new string that is in NFG. Note that we could do a * much, much, smarter thing in the future that doesn't involve all of this * copying and allocation and re-doing the whole string, but cases like this * should be fairly rare anyway, so go with simplicity for now. */ static MVMString * re_nfg(MVMThreadContext *tc, MVMString *in) { MVMNormalizer norm; MVMCodepointIter ci; MVMint32 ready; MVMString *out = NULL; MVMuint32 bufsize = in->body.num_graphs; /* Create the output buffer. We used to believe it can't ever be bigger * than the initial estimate, but utf8-c8 showed us otherwise. */ MVMGrapheme32 *out_buffer = MVM_malloc(bufsize * sizeof(MVMGrapheme32)); MVMint64 out_pos = 0; /* Iterate codepoints and normalizer. */ MVM_unicode_normalizer_init(tc, &norm, MVM_NORMALIZE_NFG); /* Codepoint iterator that passes back utf8-c8 graphemes unchanged */ MVM_string_ci_init(tc, &ci, in, 0, 1); while (MVM_string_ci_has_more(tc, &ci)) { MVMGrapheme32 g; ready = MVM_unicode_normalizer_process_codepoint_to_grapheme(tc, &norm, MVM_string_ci_get_codepoint(tc, &ci), &g); if (ready) { if (out_pos + ready > bufsize) { /* Doubling up the buffer size seems excessive, so just * add a generous amount of storage */ bufsize += ready + 32; out_buffer = MVM_realloc(out_buffer, bufsize * sizeof(MVMGrapheme32)); } out_buffer[out_pos++] = g; while (--ready > 0) { out_buffer[out_pos++] = MVM_unicode_normalizer_get_grapheme(tc, &norm); } } } MVM_unicode_normalizer_eof(tc, &norm); ready = MVM_unicode_normalizer_available(tc, &norm); if (out_pos + ready > bufsize) { bufsize += ready + 1; out_buffer = MVM_realloc(out_buffer, bufsize * sizeof(MVMGrapheme32)); } while (ready--) { out_buffer[out_pos++] = MVM_unicode_normalizer_get_grapheme(tc, &norm); } MVM_unicode_normalizer_cleanup(tc, &norm); /* Build result string. */ out = (MVMString *)MVM_repr_alloc_init(tc, tc->instance->VMString); out->body.storage.blob_32 = out_buffer; out->body.storage_type = MVM_STRING_GRAPHEME_32; out->body.num_graphs = out_pos; return out; } /* Returns nonzero if two substrings are equal, doesn't check bounds */ MVMint64 MVM_string_substrings_equal_nocheck(MVMThreadContext *tc, MVMString *a, MVMint64 starta, MVMint64 length, MVMString *b, MVMint64 startb) { MVMint64 i; /* Fast paths when storage types are identical. */ switch (a->body.storage_type) { case MVM_STRING_GRAPHEME_32: if (b->body.storage_type == MVM_STRING_GRAPHEME_32) return 0 == memcmp( a->body.storage.blob_32 + starta, b->body.storage.blob_32 + startb, length * sizeof(MVMGrapheme32)); break; case MVM_STRING_GRAPHEME_ASCII: case MVM_STRING_GRAPHEME_8: if (b->body.storage_type == MVM_STRING_GRAPHEME_ASCII || b->body.storage_type == MVM_STRING_GRAPHEME_8) return 0 == memcmp( a->body.storage.blob_8 + starta, b->body.storage.blob_8 + startb, length); break; } /* If both are flat, use MVM_string_get_grapheme_at_nocheck on both for speed */ if (a->body.storage_type != MVM_STRING_STRAND && b->body.storage_type != MVM_STRING_STRAND) { for (i = 0; i < length; i++) if (MVM_string_get_grapheme_at_nocheck(tc, a, starta + i) != MVM_string_get_grapheme_at_nocheck(tc, b, startb + i)) return 0; return 1; } else if (a->body.storage_type == MVM_STRING_STRAND && b->body.storage_type == MVM_STRING_STRAND) { MVMGraphemeIter gia, gib; /* Normal path, for the rest of the time. */ MVM_string_gi_init(tc, &gia, a); MVM_string_gi_init(tc, &gib, b); /* Move the grapheme iterator if start is not 0 */ if (starta) MVM_string_gi_move_to(tc, &gia, starta); if (startb) MVM_string_gi_move_to(tc, &gib, startb); for (i = 0; i < length; i++) if (MVM_string_gi_get_grapheme(tc, &gia) != MVM_string_gi_get_grapheme(tc, &gib)) return 0; return 1; } else { MVMGraphemeIter gi_y; MVMString *y = NULL, *z = NULL; MVMint64 starty, startz; if (a->body.storage_type == MVM_STRING_STRAND) { y = a; z = b; starty = starta; startz = startb; } else { y = b; z = a; starty = startb; startz = starta; } MVM_string_gi_init(tc, &gi_y, y); if (starty) MVM_string_gi_move_to(tc, &gi_y, starty); for (i = 0; i < length; i++) if (MVM_string_gi_get_grapheme(tc, &gi_y) != MVM_string_get_grapheme_at_nocheck(tc, z, startz + i)) return 0; return 1; } } /* Returns the location of one string in another or -1 */ MVMint64 MVM_string_index(MVMThreadContext *tc, MVMString *Haystack, MVMString *needle, MVMint64 start) { size_t index = (size_t)start; MVMStringIndex H_graphs = MVM_string_graphs(tc, Haystack), n_graphs = MVM_string_graphs(tc, needle); MVM_string_check_arg(tc, Haystack, "index search target"); MVM_string_check_arg(tc, needle, "index search term"); if (!n_graphs) return start <= H_graphs ? start : -1; /* the empty string is in any other string */ if (!H_graphs) return -1; if (start < 0 || H_graphs <= start) return -1; if (H_graphs < n_graphs || n_graphs < 1) return -1; /* Fast paths when storage types are identical. Uses memmem function, which * uses Knuth-Morris-Pratt algorithm on Linux and on others * Crochemore+Perrin two-way string matching */ switch (Haystack->body.storage_type) { case MVM_STRING_GRAPHEME_32: if (needle->body.storage_type == MVM_STRING_GRAPHEME_32) { void *start_ptr = Haystack->body.storage.blob_32 + start; void *mm_return_32; void *end_ptr = (char*)start_ptr + sizeof(MVMGrapheme32) * (H_graphs - start); do { /* Keep as void* to not lose precision */ mm_return_32 = MVM_memmem( start_ptr, /* start position */ (char*)end_ptr - (char*)start_ptr, /* length of Haystack from start position to end */ needle->body.storage.blob_32, /* needle start */ n_graphs * sizeof(MVMGrapheme32) /* needle length */ ); if (mm_return_32 == NULL) return -1; } /* If we aren't on a 32 bit boundary then continue from where we left off (unlikely but possible) */ while ( ( (char*)mm_return_32 - (char*)Haystack->body.storage.blob_32) % sizeof(MVMGrapheme32) && ( start_ptr = mm_return_32 ) /* Set the new start pointer at where we left off */ && ( start_ptr < end_ptr ) /* Check we aren't past the end of the string just in case */ ); return (MVMGrapheme32*)mm_return_32 - Haystack->body.storage.blob_32; } break; case MVM_STRING_GRAPHEME_8: if (needle->body.storage_type == MVM_STRING_GRAPHEME_8) { void *mm_return_8 = MVM_memmem( Haystack->body.storage.blob_8 + start, /* start position */ (H_graphs - start) * sizeof(MVMGrapheme8), /* length of Haystack from start position to end */ needle->body.storage.blob_8, /* needle start */ n_graphs * sizeof(MVMGrapheme8) /* needle length */ ); if (mm_return_8 == NULL) return -1; else return (MVMGrapheme8*)mm_return_8 - Haystack->body.storage.blob_8; } break; } /* Minimal code version for needles of size 1 */ if (n_graphs == 1) { MVMGraphemeIter H_gi; MVMGrapheme32 n_g = MVM_string_get_grapheme_at_nocheck(tc, needle, 0); MVM_string_gi_init(tc, &H_gi, Haystack); if (index) MVM_string_gi_move_to(tc, &H_gi, index); while (index < H_graphs) { if (n_g == MVM_string_gi_get_grapheme(tc, &H_gi)) return (MVMint64)index; index++; } } else if (n_graphs <= MVM_string_KMP_max_pattern_length) return knuth_morris_pratt_string_index(tc, needle, Haystack, start); else { int is_gic = Haystack->body.storage_type == MVM_STRING_STRAND ? 1 : 0; void *Hs_or_gic = Haystack; /* If Haystack is a strand allocate space for a MVMGraphemeIter_cached * and initialize it */ if (is_gic) { Hs_or_gic = alloca(sizeof(MVMGraphemeIter_cached)); MVM_string_gi_cached_init(tc, Hs_or_gic, Haystack, start); } /* For needles > MVM_string_KMP_max_pattern_length we must revert to brute force for now. * Eventually we can implement brute force after it matches the whole needle OR * allocate more space for the pattern on reaching the end of the pattern */ while (index <= H_graphs - n_graphs) { if (string_equal_at_ignore_case_INTERNAL_loop(tc, Hs_or_gic, needle, index, H_graphs, n_graphs, 0, 0, is_gic) != -1) return (MVMint64)index; index++; } } return -1; } /* Returns the location of one string in another or -1 */ MVMint64 MVM_string_index_from_end(MVMThreadContext *tc, MVMString *Haystack, MVMString *needle, MVMint64 start) { MVMint64 result = -1; size_t index; MVMStringIndex H_graphs, n_graphs; MVM_string_check_arg(tc, Haystack, "rindex search target"); MVM_string_check_arg(tc, needle, "rindex search term"); H_graphs = MVM_string_graphs_nocheck(tc, Haystack); n_graphs = MVM_string_graphs_nocheck(tc, needle); if (!n_graphs) { if (0 <= start) return start <= H_graphs ? start : -1; /* the empty string is in any other string */ else return H_graphs; /* no start, so return end */ } if (!H_graphs) return -1; if (H_graphs < n_graphs || n_graphs < 1) return -1; if (start == -1) start = H_graphs - n_graphs; if (start < 0 || H_graphs <= start) /* maybe return -1 instead? */ MVM_exception_throw_adhoc(tc, "index start offset out of range"); index = start; if (H_graphs < index + n_graphs) { index = H_graphs - n_graphs; } /* brute force for now. horrible, yes. halp. */ do { if (MVM_string_substrings_equal_nocheck(tc, needle, 0, n_graphs, Haystack, index)) { result = (MVMint64)index; break; } } while (0 < index--); return result; } /* Returns a substring of the given string */ MVMString * MVM_string_substring(MVMThreadContext *tc, MVMString *a, MVMint64 offset, MVMint64 length) { MVMString *result; MVMint64 start_pos, end_pos; MVMint64 agraphs; MVM_string_check_arg(tc, a, "substring"); /* convert to signed to avoid implicit arithmetic conversions */ agraphs = (MVMint64)MVM_string_graphs_nocheck(tc, a); /* -1 signifies go to the end of the string; anything less is a bug */ if (length < -1) MVM_exception_throw_adhoc(tc, "Substring length (%"PRId64") cannot be negative", length); /* negative offsets count from the end */ start_pos = offset < 0 ? offset + agraphs : offset; end_pos = length == -1 ? agraphs : start_pos + length; /* return an empty string if start_pos is out of bounds but positive */ if (agraphs < start_pos) { start_pos = 0; end_pos = 0; } if (end_pos < 0) MVM_exception_throw_adhoc(tc, "Substring end (%"PRId64") cannot be less than 0", end_pos); /* Ensure we're within bounds. */ if (start_pos < 0) start_pos = 0; if (agraphs < end_pos) end_pos = agraphs; /* Check trivial cases: empty string and whole string. */ if (start_pos == end_pos) return tc->instance->str_consts.empty; if (start_pos == 0 && end_pos == agraphs) return a; /* Construct a result; how we efficiently do so will vary based on the * input string. */ MVMROOT(tc, a, { result = (MVMString *)MVM_repr_alloc_init(tc, tc->instance->VMString); result->body.num_graphs = end_pos - start_pos; if (a->body.storage_type != MVM_STRING_STRAND) { /* It's some kind of buffer. Construct a strand view into it. */ result->body.storage_type = MVM_STRING_STRAND; result->body.storage.strands = allocate_strands(tc, 1); result->body.num_strands = 1; result->body.storage.strands[0].blob_string = a; result->body.storage.strands[0].start = start_pos; result->body.storage.strands[0].end = end_pos; result->body.storage.strands[0].repetitions = 0; } else if (a->body.num_strands == 1 && a->body.storage.strands[0].repetitions == 0) { /* Single strand string; quite possibly already a substring. We'll * just produce an updated view. */ MVMStringStrand *orig_strand = &(a->body.storage.strands[0]); result->body.storage_type = MVM_STRING_STRAND; result->body.storage.strands = allocate_strands(tc, 1); result->body.num_strands = 1; result->body.storage.strands[0].blob_string = orig_strand->blob_string; result->body.storage.strands[0].start = orig_strand->start + start_pos; result->body.storage.strands[0].end = orig_strand->start + end_pos; result->body.storage.strands[0].repetitions = 0; } else { /* Produce a new blob string, collapsing the strands. */ MVMGraphemeIter gi; MVM_string_gi_init(tc, &gi, a); MVM_string_gi_move_to(tc, &gi, start_pos); iterate_gi_into_string(tc, &gi, result); } }); STRAND_CHECK(tc, result); return result; } MVMString * MVM_string_replace(MVMThreadContext *tc, MVMString *original, MVMint64 start, MVMint64 count, MVMString *replacement) { /* XXX this could probably be done more efficiently directly. */ MVMString *first_part = NULL; MVMString *rest_part = NULL; MVMString *result = NULL; MVM_gc_root_temp_push(tc, (MVMCollectable **)&replacement); MVM_gc_root_temp_push(tc, (MVMCollectable **)&original); MVM_gc_root_temp_push(tc, (MVMCollectable **)&first_part); first_part = MVM_string_substring(tc, original, 0, start); rest_part = MVM_string_substring(tc, original, start + count, -1); rest_part = MVM_string_concatenate(tc, replacement, rest_part); result = MVM_string_concatenate(tc, first_part, rest_part); STRAND_CHECK(tc, result); NFG_CHECK(tc, result, "MVM_string_replace"); MVM_gc_root_temp_pop_n(tc, 3); return result; } static MVMString * string_from_strand_at_index(MVMThreadContext *tc, MVMString *a, MVMuint16 index) { MVMStringStrand *ss = &(a->body.storage.strands[index]); return MVM_string_substring(tc, ss->blob_string, ss->start, ss->end - ss->start); } static MVMuint16 final_strand_match_with_repetition_count(MVMThreadContext *tc, MVMString *a, MVMString *b) { if (a->body.storage_type == MVM_STRING_STRAND) { MVMStringStrand *sa = &(a->body.storage.strands[a->body.num_strands - 1]); /* If the final strand of a eq b, we'll just increment the final strand of a's repetitions. */ if (sa->end - sa->start == MVM_string_graphs_nocheck(tc, b)) { if (MVM_string_equal_at(tc, sa->blob_string, b, sa->start)) return 1; } /* If the final strand of a eq the first (and only) strand of b, we'll just add b's repetitions * (plus 1 for the strand itself) to the final strand of a's repetitions. */ else if (b->body.storage_type == MVM_STRING_STRAND && b->body.num_strands == 1) { MVMStringStrand *sb = &(b->body.storage.strands[0]); if (sa->end - sa->start == sb->end - sb->start) if (MVM_string_equal(tc, string_from_strand_at_index(tc, a, a->body.num_strands - 1), string_from_strand_at_index(tc, b, 0))) return b->body.storage.strands[0].repetitions + 1; } } return 0; } /* Append one string to another. */ MVMString * MVM_string_concatenate(MVMThreadContext *tc, MVMString *a, MVMString *b) { MVMString *result = NULL, *renormalized_section = NULL; int renormalized_section_graphs = 0, consumed_a = 0, consumed_b = 0; MVMuint32 agraphs, bgraphs; MVMuint64 total_graphs; int lost_strands = 0; int is_concat_stable = 0; int index_ss_b; MVMuint16 matching_repetition_count; MVM_string_check_arg(tc, a, "concatenate"); MVM_string_check_arg(tc, b, "concatenate"); /* Simple empty-string cases. */ agraphs = MVM_string_graphs_nocheck(tc, a); if (agraphs == 0) return b; bgraphs = MVM_string_graphs_nocheck(tc, b); if (bgraphs == 0) return a; is_concat_stable = MVM_nfg_is_concat_stable(tc, a, b); /* If is_concat_stable equals 0 and a and b are not repetitions. */ if (is_concat_stable == 0 && !(a->body.storage_type == MVM_STRING_STRAND && a->body.storage.strands[a->body.num_strands - 1].repetitions) && !(b->body.storage_type == MVM_STRING_STRAND && b->body.storage.strands[0].repetitions)) { MVMCodepoint last_a_first_b[2] = { MVM_string_get_grapheme_at_nocheck(tc, a, a->body.num_graphs - 1), MVM_string_get_grapheme_at_nocheck(tc, b, 0) }; MVMROOT2(tc, a, b, { /* If both are not synthetics, we can can pass those values unchanged * instead of iterating by codepoint */ if (0 <= last_a_first_b[0] && 0 <= last_a_first_b[1]) { renormalized_section = MVM_unicode_codepoints_c_array_to_nfg_string(tc, last_a_first_b, 2); consumed_a = 1; consumed_b = 1; } else { MVMCodepointIter last_a_ci; MVMCodepointIter first_b_ci; MVMuint32 a_codes = MVM_string_grapheme_ci_init(tc, &last_a_ci, last_a_first_b[0], 1); MVMuint32 b_codes = MVM_string_grapheme_ci_init(tc, &first_b_ci, last_a_first_b[1], 1); /* MSVC doesn't allow variable length arrays so use alloca to allocate onto the stack */ MVMCodepoint *last_a_first_b_codes = alloca((a_codes + b_codes) * sizeof(MVMCodepoint)); MVMuint32 i = 0; for (; MVM_string_grapheme_ci_has_more(tc, &last_a_ci); i++) { last_a_first_b_codes[i] = MVM_string_grapheme_ci_get_codepoint(tc, &last_a_ci); } for (; MVM_string_grapheme_ci_has_more(tc, &first_b_ci); i++) { last_a_first_b_codes[i] = MVM_string_grapheme_ci_get_codepoint(tc, &first_b_ci); } renormalized_section = MVM_unicode_codepoints_c_array_to_nfg_string(tc, last_a_first_b_codes, a_codes + b_codes); consumed_a = 1; consumed_b = 1; } }); if (renormalized_section) { if (agraphs == consumed_a && bgraphs == consumed_b) { NFG_CHECK_CONCAT(tc, renormalized_section, a, b, "renormalized_section"); return renormalized_section; } renormalized_section_graphs = MVM_string_graphs_nocheck(tc, renormalized_section); } } /* Total size of the resulting string can't be bigger than an MVMString is allowed to be. */ total_graphs = (MVMuint64)agraphs + (MVMuint64)bgraphs; if (MAX_GRAPHEMES < total_graphs) MVM_exception_throw_adhoc(tc, "Can't concatenate strings, required number of graphemes %"PRIu64" > max allowed of %lld", total_graphs, MAX_GRAPHEMES); /* Otherwise, we'll assemble a result string. */ MVMROOT4(tc, a, b, renormalized_section, result, { /* Allocate it. */ result = (MVMString *)MVM_repr_alloc_init(tc, tc->instance->VMString); /* Total graphemes is trivial; just total up inputs. */ result->body.num_graphs = (MVMuint32)total_graphs; /* Result string will be made of strands. */ result->body.storage_type = MVM_STRING_STRAND; /* Detect the wonderful case where we're repeatedly concating the same * string again and again, and thus can just bump a repetition. */ if (is_concat_stable == 1 && (matching_repetition_count = final_strand_match_with_repetition_count(tc, a, b))) { /* We have it; just copy the strands to a new string and bump the * repetitions count of the last one. */ result->body.storage.strands = allocate_strands(tc, a->body.num_strands); copy_strands(tc, a, 0, result, 0, a->body.num_strands); result->body.storage.strands[a->body.num_strands - 1].repetitions += matching_repetition_count; result->body.num_strands = a->body.num_strands; } /* Otherwise, construct a new strand string. */ else { /* See if we have too many strands between the two. If so, we will * collapse the biggest side. */ MVMuint16 strands_a = a->body.storage_type == MVM_STRING_STRAND ? a->body.num_strands : 1; MVMuint16 strands_b = b->body.storage_type == MVM_STRING_STRAND ? b->body.num_strands : 1; MVMString *effective_a = a; MVMString *effective_b = b; if (MVM_STRING_MAX_STRANDS < strands_a + strands_b) { MVMROOT(tc, result, { if (strands_b <= strands_a) { effective_a = collapse_strands(tc, effective_a); strands_a = 1; } else { effective_b = collapse_strands(tc, effective_b); strands_b = 1; } }); } /* Assemble the result. */ result->body.num_strands = strands_a + strands_b + (renormalized_section_graphs ? 1 : 0); result->body.storage.strands = allocate_strands(tc, result->body.num_strands); /* START 1 */ if (effective_a->body.storage_type == MVM_STRING_STRAND) { copy_strands(tc, effective_a, 0, result, 0, strands_a); } else { int index_ss_a = 0; MVMStringStrand *ss_a = &(result->body.storage.strands[index_ss_a]); ss_a->blob_string = effective_a; ss_a->start = 0; ss_a->end = effective_a->body.num_graphs; ss_a->repetitions = 0; } if (renormalized_section) { int index_ss_re; int index_ss_a = strands_a - 1; /* Tweak the end of the last strand of string a. Since if a is made up of multiple strands, we can't just refer to index 0 and instead erfer to strands_a - 1 */ MVMStringStrand *ss_a = &(result->body.storage.strands[index_ss_a]); MVMStringStrand *ss_re = NULL; ss_a->end -= consumed_a; /* If the strands ends up to be zero length we need to reduce the number of strand_index and also incease lost_strands so the next operation writes over it */ if (ss_a->start == ss_a->end) lost_strands++; /* END 1 */ /* START 1.5 (only triggered in some cases) */ index_ss_re = strands_a - lost_strands; ss_re = &(result->body.storage.strands[index_ss_re]); /* Add the renormalized section in as a strand */ ss_re->blob_string = renormalized_section; ss_re->start = 0; ss_re->end = renormalized_section->body.num_graphs; ss_re->repetitions = 0; if (ss_re->start == ss_re->end) { MVM_exception_throw_adhoc(tc, "Unexpected error in concatenation: renormalized_section is 0 graphemes.\n"); /* renormalized_section should always be at least one grapheme * in length so throw if it does not (zero length is an error * we shouldn't lost_strands++ unlike the other strands */ } /* END 1.5 */ } /* START 2 */ index_ss_b = strands_a - lost_strands + (renormalized_section_graphs ? 1 : 0 ); if (effective_b->body.storage_type == MVM_STRING_STRAND) { copy_strands(tc, effective_b, 0, result, index_ss_b, strands_b); } else { MVMStringStrand *ss_b = &(result->body.storage.strands[index_ss_b]); ss_b->blob_string = effective_b; ss_b->start = 0; ss_b->end = effective_b->body.num_graphs; ss_b->repetitions = 0; } if (renormalized_section_graphs) { /* Tweak the beginning of the first strand of string b */ MVMStringStrand *ss_b = &(result->body.storage.strands[index_ss_b]); ss_b->start += consumed_b; if (ss_b->start == ss_b->end) { lost_strands++; move_strands(tc, result, index_ss_b + 1, result, index_ss_b, strands_b - 1); } /* END 2 */ /* Adjust result->num_strands */ if (lost_strands) result->body.num_strands -= lost_strands; /* Adjust result->num_graphs */ result->body.num_graphs += renormalized_section_graphs - consumed_b - consumed_a; } } STRAND_CHECK(tc, result); if (is_concat_stable == 1 || (is_concat_stable == 0 && renormalized_section)) NFG_CHECK_CONCAT(tc, result, a, b, "'result'"); }); if (is_concat_stable == 1 || (is_concat_stable == 0 && renormalized_section)) return result; /* If it's regional indicator (is_concat_stable == 2) */ return re_nfg(tc, result); } MVMString * MVM_string_repeat(MVMThreadContext *tc, MVMString *a, MVMint64 count) { MVMString *result = NULL; MVMuint32 agraphs; MVMuint64 total_graphs; MVM_string_check_arg(tc, a, "repeat"); /* Validate count; handle common cases. */ if (count == 0) return tc->instance->str_consts.empty; if (count == 1) return a; if (count < 0) MVM_exception_throw_adhoc(tc, "Repeat count (%"PRId64") cannot be negative", count); if (MAX_GRAPHEMES < count) MVM_exception_throw_adhoc(tc, "Repeat count (%"PRId64") cannot be greater than max allowed number of graphemes %lld", count, MAX_GRAPHEMES); /* If input string is empty, repeating it is empty. */ agraphs = MVM_string_graphs_nocheck(tc, a); if (agraphs == 0) return tc->instance->str_consts.empty; /* Total size of the resulting string can't be bigger than an MVMString is allowed to be. */ total_graphs = (MVMuint64)agraphs * (MVMuint64)count; if (MAX_GRAPHEMES < total_graphs) MVM_exception_throw_adhoc(tc, "Can't repeat string, required number of graphemes (%"PRIu32" * %"PRIu64") greater than max allowed of %lld", agraphs, count, MAX_GRAPHEMES); /* Now build a result string with the repetition set. */ MVMROOT(tc, a, { result = (MVMString *)MVM_repr_alloc_init(tc, tc->instance->VMString); result->body.num_graphs = agraphs * count; result->body.storage_type = MVM_STRING_STRAND; result->body.storage.strands = allocate_strands(tc, 1); if (a->body.storage_type == MVM_STRING_STRAND) { if (a->body.num_strands == 1 && a->body.storage.strands[0].repetitions == 0) { copy_strands(tc, a, 0, result, 0, 1); } else { MVMROOT(tc, result, { a = collapse_strands(tc, a); }); result->body.storage.strands[0].blob_string = a; result->body.storage.strands[0].start = 0; result->body.storage.strands[0].end = agraphs; } } else { result->body.storage.strands[0].blob_string = a; result->body.storage.strands[0].start = 0; result->body.storage.strands[0].end = agraphs; } result->body.storage.strands[0].repetitions = count - 1; result->body.num_strands = 1; }); /* If string a is not stable under concatenation, we need to create a flat * string and ensure it is normalized */ if (!MVM_nfg_is_concat_stable(tc, a, a)) result = re_nfg(tc, result); STRAND_CHECK(tc, result); return result; } void MVM_string_say(MVMThreadContext *tc, MVMString *a) { MVM_string_check_arg(tc, a, "say"); MVM_string_print(tc, MVM_string_concatenate(tc, a, tc->instance->str_consts.platform_newline)); } void MVM_string_print(MVMThreadContext *tc, MVMString *a) { MVMOSHandle *handle = (MVMOSHandle *)tc->instance->stdout_handle; MVMuint64 encoded_size; char *encoded; MVM_string_check_arg(tc, a, "print"); encoded = MVM_string_utf8_encode(tc, a, &encoded_size, MVM_TRANSLATE_NEWLINE_OUTPUT); MVM_io_write_bytes_c(tc, tc->instance->stdout_handle, encoded, encoded_size); MVM_free(encoded); } /* Meant to be pased in a MVMNormalizer of type MVM_NORMALIZE_NFD */ static MVMGrapheme32 ord_getbasechar (MVMThreadContext *tc, MVMGrapheme32 g) { /* If we get a synthetic, extract the base codepoint and call ord_getbasechar again */ if (g < 0) { MVMNFGSynthetic *synth = MVM_nfg_get_synthetic_info(tc, g); return ord_getbasechar(tc, synth->codes[synth->base_index]); } else { MVMGrapheme32 return_g; MVMint32 ready; MVMNormalizer norm; MVM_unicode_normalizer_init(tc, &norm, MVM_NORMALIZE_NFD); ready = MVM_unicode_normalizer_process_codepoint_to_grapheme(tc, &norm, g, &return_g); MVM_unicode_normalizer_eof(tc, &norm); if (!ready) return_g = MVM_unicode_normalizer_get_grapheme(tc, &norm); MVM_unicode_normalizer_cleanup(tc, &norm); return return_g; } } /* Tests whether one string a has the other string b as a substring at that index */ MVMint64 MVM_string_equal_at(MVMThreadContext *tc, MVMString *a, MVMString *b, MVMint64 offset) { MVMStringIndex agraphs, bgraphs; MVM_string_check_arg(tc, a, "equal_at"); MVM_string_check_arg(tc, b, "equal_at"); agraphs = MVM_string_graphs_nocheck(tc, a); bgraphs = MVM_string_graphs_nocheck(tc, b); if (offset < 0) { offset += agraphs; if (offset < 0) offset = 0; /* XXX I think this is the right behavior here */ } if (agraphs - offset < bgraphs) return 0; return MVM_string_substrings_equal_nocheck(tc, a, offset, bgraphs, b, 0); } /* Ensure return value can hold numbers at least 3x higher than MVMStringIndex. * Theoretically if the string has all ffi ligatures and 1/3 the max size of * MVMStringIndex in length, we could have some weird results. */ /* ignoremark is 0 for normal operation and 1 for ignoring diacritics */ MVM_STATIC_INLINE MVMint64 string_equal_at_ignore_case_INTERNAL_loop(MVMThreadContext *tc, void *Hs_or_gic, MVMString *needle_fc, MVMint64 H_start, MVMint64 H_graphs, MVMint64 n_fc_graphs, int ignoremark, int ignorecase, int is_gic) { MVMuint32 H_fc_cps; /* An additional needle offset which is used only when codepoints expand * when casefolded. The offset is the number of additional codepoints that * have been seen so Haystack and needle stay aligned */ MVMint64 n_offset = 0; MVMint64 i, j; MVMGrapheme32 H_g, n_g; for (i = 0; i + H_start < H_graphs && i + n_offset < n_fc_graphs; i++) { const MVMCodepoint* H_result_cps; H_g = is_gic ? MVM_string_gi_cached_get_grapheme(tc, Hs_or_gic, H_start + i) : MVM_string_get_grapheme_at_nocheck(tc, Hs_or_gic, H_start + i); if (!ignorecase) { H_fc_cps = 0; } else if (0 <= H_g) { /* For codeponits we can get the case change directly */ H_fc_cps = MVM_unicode_get_case_change(tc, H_g, MVM_unicode_case_change_type_fold, &H_result_cps); } else { /* Synthetics must use this function */ H_fc_cps = MVM_nfg_get_case_change(tc, H_g, MVM_unicode_case_change_type_fold, (MVMGrapheme32**) &H_result_cps); } /* If we get 0 for the number that means the cp doesn't change when casefolded */ if (H_fc_cps == 0) { n_g = MVM_string_get_grapheme_at_nocheck(tc, needle_fc, i + n_offset); if (ignoremark) { H_g = ord_getbasechar(tc, H_g); n_g = ord_getbasechar(tc, n_g); } if (H_g != n_g) return -1; } else if (1 <= H_fc_cps) { for (j = 0; j < H_fc_cps; j++) { n_g = MVM_string_get_grapheme_at_nocheck(tc, needle_fc, i + n_offset); H_g = H_result_cps[j]; if (ignoremark) { H_g = ord_getbasechar(tc, H_g); n_g = ord_getbasechar(tc, n_g); } if (H_g != n_g) return -1; n_offset++; } n_offset--; } } return n_offset; /* We return -1 if the strings are not equal and 0 or more if they are equal * The return values from 0, 1 etc designate how many Haystack graphemes * were expanded. * This may seem like an odd arangement, but this extra information is needed * to determine the length of the Haystack which was traversed, as it can * differ from the length of the needle if there are expansions. */ } /* Checks if needle exists at the offset, but ignores case. * Sometimes there is a difference in length of a string before and after foldcase, * because of this we must compare this differently than just foldcasing both * strings to ensure the offset is correct */ static MVMint64 string_equal_at_ignore_case(MVMThreadContext *tc, MVMString *Haystack, MVMString *needle, MVMint64 H_offset, int ignoremark, int ignorecase) { /* Foldcase version of needle */ MVMString *needle_fc = NULL; MVMStringIndex H_graphs = MVM_string_graphs(tc, Haystack); MVMStringIndex n_graphs = MVM_string_graphs(tc, needle); MVMStringIndex n_fc_graphs; /* H_expansion must be able to hold integers 3x larger than MVMStringIndex */ MVMint64 H_expansion; if (H_offset < 0) { H_offset += H_graphs; if (H_offset < 0) H_offset = 0; /* XXX I think this is the right behavior here */ } /* If the offset is greater or equal to the number of Haystack graphemes * return 0. Since size of graphemes could change under casefolding, we * can't assume too much. If optimizing this be careful */ if (H_graphs <= H_offset) return 0; MVMROOT(tc, Haystack, { needle_fc = ignorecase ? MVM_string_fc(tc, needle) : needle; }); n_fc_graphs = MVM_string_graphs(tc, needle_fc); if (Haystack->body.storage_type == MVM_STRING_STRAND) { MVMGraphemeIter_cached H_gic; MVM_string_gi_cached_init(tc, &H_gic, Haystack, H_offset); H_expansion = string_equal_at_ignore_case_INTERNAL_loop(tc, &H_gic, needle_fc, H_offset, H_graphs, n_fc_graphs, ignoremark, ignorecase, 1); } else { H_expansion = string_equal_at_ignore_case_INTERNAL_loop(tc, Haystack, needle_fc, H_offset, H_graphs, n_fc_graphs, ignoremark, ignorecase, 0); } if (0 <= H_expansion) return n_fc_graphs <= H_graphs + H_expansion - H_offset ? 1 : 0; return 0; } /* Processes the pattern. The pattern must be able to store negative and positive * numbers. It must be able to store at least 1/2 the length of the needle, * though possibly more (though I am not sure it's possible for it to be more than * 1/2). */ static void knuth_morris_pratt_process_pattern (MVMThreadContext *tc, MVMString *pat, MVMint16 *next, MVMStringIndex pat_graphs) { MVMint64 i = 0; MVMint64 j = next[0] = -1; while (i < pat_graphs) { if (j == -1 || MVM_string_get_grapheme_at_nocheck(tc, pat, i) == MVM_string_get_grapheme_at_nocheck(tc, pat, j)) { i++; j++; next[i] = (i < pat_graphs && MVM_string_get_grapheme_at_nocheck(tc, pat, j) == MVM_string_get_grapheme_at_nocheck(tc, pat, i)) ? next[j] : j; } else j = next[j]; } } static MVMint64 knuth_morris_pratt_string_index (MVMThreadContext *tc, MVMString *needle, MVMString *Haystack, MVMint64 H_offset) { MVMint64 needle_offset = 0; MVMint64 text_offset = H_offset; MVMStringIndex Haystack_graphs = MVM_string_graphs_nocheck(tc, Haystack); MVMStringIndex needle_graphs = MVM_string_graphs_nocheck(tc, needle); MVMint16 *next = NULL; MVMString *flat_needle = NULL; size_t next_size = (1 + needle_graphs) * sizeof(MVMint16); int next_is_malloced = 0; assert(needle_graphs <= MVM_string_KMP_max_pattern_length); /* Empty string is found at start of string */ if (needle_graphs == 0) return 0; /* Allocate max 8K onto the stack, otherwise malloc */ if (next_size < 3000) next = alloca(next_size); else { next = MVM_malloc(next_size); next_is_malloced = 1; } /* If the needle is a strand, flatten it, otherwise use the original string */ flat_needle = needle->body.storage_type == MVM_STRING_STRAND ? collapse_strands(tc, needle) : needle; /* Process the needle into a jump table put into variable 'next' */ knuth_morris_pratt_process_pattern(tc, flat_needle, next, needle_graphs); /* If the Haystack is a strand, use MVM_string_gi_cached_get_grapheme * since it retains its grapheme iterator over invocations unlike * MVM_string_get_grapheme_at_nocheck and caches the previous grapheme. It * is slower for flat Haystacks though. */ #define MVM_kmp_loop(Haystack_function) {\ while (text_offset < Haystack_graphs && needle_offset < needle_graphs) {\ if (needle_offset == -1 || MVM_string_get_grapheme_at_nocheck(tc, flat_needle, needle_offset)\ == (Haystack_function)) {\ text_offset++; needle_offset++;\ if (needle_offset == needle_graphs) {\ if (next_is_malloced) MVM_free(next);\ return text_offset - needle_offset;\ }\ }\ else needle_offset = next[needle_offset];\ }\ } if (Haystack->body.storage_type == MVM_STRING_STRAND) { MVMGraphemeIter_cached H_gic; MVM_string_gi_cached_init(tc, &H_gic, Haystack, H_offset); MVM_kmp_loop(MVM_string_gi_cached_get_grapheme(tc, &H_gic, text_offset)); } else { MVM_kmp_loop(MVM_string_get_grapheme_at_nocheck(tc, Haystack, text_offset)); } if (next_is_malloced) MVM_free(next); return -1; } static MVMint64 string_index_ignore_case(MVMThreadContext *tc, MVMString *Haystack, MVMString *needle, MVMint64 start, int ignoremark, int ignorecase) { /* Foldcase version of needle */ MVMString *needle_fc = NULL; MVMStringIndex n_fc_graphs; size_t index = (size_t)start; MVMStringIndex H_graphs, n_graphs; /* H_expansion must be able to hold integers 3x larger than MVMStringIndex */ MVMint64 H_expansion; MVMint64 return_val = -1; int is_gic = Haystack->body.storage_type == MVM_STRING_STRAND ? 1 : 0; void *Hs_or_gic = Haystack; MVM_string_check_arg(tc, Haystack, ignoremark ? "index ignore case ignore mark search target" : "index ignore case search target"); MVM_string_check_arg(tc, needle, ignoremark ? "index ignore case ignore mark search term" : "index ignore case search term"); H_graphs = MVM_string_graphs_nocheck(tc, Haystack); n_graphs = MVM_string_graphs_nocheck(tc, needle); if (!n_graphs) return start <= H_graphs ? start : -1; /* Empty string is in any other string */ if (!H_graphs) return -1; if (start < 0 || H_graphs <= start) return -1; /* Codepoints can expand into up to THREE codepoints (as of Unicode 9.0). The next check * checks if it is at all possible for the needle grapheme number to be higher * than the Haystack */ if (H_graphs * 3 < n_graphs) return -1; if (n_graphs < 1) return -1; MVMROOT(tc, Haystack, { needle_fc = ignorecase ? MVM_string_fc(tc, needle) : needle; }); n_fc_graphs = MVM_string_graphs(tc, needle_fc); /* brute force for now. horrible, yes. halp. */ if (is_gic) { Hs_or_gic = alloca(sizeof(MVMGraphemeIter_cached)); MVM_string_gi_cached_init(tc, Hs_or_gic, Haystack, start); } while (index <= H_graphs) { H_expansion = string_equal_at_ignore_case_INTERNAL_loop(tc, Hs_or_gic, needle_fc, index, H_graphs, n_fc_graphs, ignoremark, ignorecase, is_gic); if (0 <= H_expansion) return n_fc_graphs <= H_graphs + H_expansion - index ? (MVMint64)index : -1; index++; } return -1; } MVMint64 MVM_string_equal_at_ignore_case(MVMThreadContext *tc, MVMString *Haystack, MVMString *needle, MVMint64 H_offset) { return string_equal_at_ignore_case(tc, Haystack, needle, H_offset, 0, 1); } MVMint64 MVM_string_index_ignore_case(MVMThreadContext *tc, MVMString *Haystack, MVMString *needle, MVMint64 start) { return string_index_ignore_case(tc, Haystack, needle, start, 0, 1); } MVMint64 MVM_string_equal_at_ignore_mark(MVMThreadContext *tc, MVMString *Haystack, MVMString *needle, MVMint64 H_offset) { return string_equal_at_ignore_case(tc, Haystack, needle, H_offset, 1, 0); } MVMint64 MVM_string_index_ignore_mark(MVMThreadContext *tc, MVMString *Haystack, MVMString *needle, MVMint64 start) { return string_index_ignore_case(tc, Haystack, needle, start, 1, 0); } MVMint64 MVM_string_equal_at_ignore_case_ignore_mark(MVMThreadContext *tc, MVMString *Haystack, MVMString *needle, MVMint64 H_offset) { return string_equal_at_ignore_case(tc, Haystack, needle, H_offset, 1, 1); } MVMint64 MVM_string_index_ignore_case_ignore_mark(MVMThreadContext *tc, MVMString *Haystack, MVMString *needle, MVMint64 start) { return string_index_ignore_case(tc, Haystack, needle, start, 1, 1); } MVMGrapheme32 MVM_string_ord_at(MVMThreadContext *tc, MVMString *s, MVMint64 offset) { MVMStringIndex agraphs; MVMGrapheme32 g; MVM_string_check_arg(tc, s, "grapheme_at"); agraphs = MVM_string_graphs(tc, s); if (offset < 0 || agraphs <= offset) return -1; g = MVM_string_get_grapheme_at_nocheck(tc, s, offset); return 0 <= g ? g : MVM_nfg_get_synthetic_info(tc, g)->codes[0]; } /* Gets the base character at a grapheme position, ignoring things like diacritics */ MVMGrapheme32 MVM_string_ord_basechar_at(MVMThreadContext *tc, MVMString *s, MVMint64 offset) { MVMStringIndex agraphs; MVMint32 ready; MVM_string_check_arg(tc, s, "ord_basechar_at"); agraphs = MVM_string_graphs_nocheck(tc, s); if (offset < 0 || agraphs <= offset) return -1; /* fixes RT #126771 */ return ord_getbasechar(tc, MVM_string_get_grapheme_at_nocheck(tc, s, offset)); } /* Compares two strings for equality. */ MVMint64 MVM_string_equal(MVMThreadContext *tc, MVMString *a, MVMString *b) { MVMStringIndex agraphs, bgraphs; MVM_string_check_arg(tc, a, "equal"); MVM_string_check_arg(tc, b, "equal"); if (a == b) return 1; agraphs = MVM_string_graphs_nocheck(tc, a); bgraphs = MVM_string_graphs_nocheck(tc, b); if (agraphs != bgraphs) return 0; return MVM_string_substrings_equal_nocheck(tc, a, 0, bgraphs, b, 0); } /* more general form of has_at; compares two substrings for equality */ MVMint64 MVM_string_have_at(MVMThreadContext *tc, MVMString *a, MVMint64 starta, MVMint64 length, MVMString *b, MVMint64 startb) { MVM_string_check_arg(tc, a, "have_at"); MVM_string_check_arg(tc, b, "have_at"); if (starta < 0 || startb < 0) return 0; if (length == 0) return 1; if (MVM_string_graphs_nocheck(tc, a) < starta + length || MVM_string_graphs_nocheck(tc, b) < startb + length) return 0; return MVM_string_substrings_equal_nocheck(tc, a, starta, length, b, startb); } /* Returns the grapheme at a given index of the string */ MVMint64 MVM_string_get_grapheme_at(MVMThreadContext *tc, MVMString *a, MVMint64 index) { MVMStringIndex agraphs; MVM_string_check_arg(tc, a, "grapheme_at"); agraphs = MVM_string_graphs_nocheck(tc, a); if (index < 0 || agraphs <= index) MVM_exception_throw_adhoc(tc, "Invalid string index: max %"PRId32", got %"PRId64, agraphs - 1, index); return (MVMint64)MVM_string_get_grapheme_at_nocheck(tc, a, index); } /* Finds the location of a grapheme in a string. Useful for small character class lookup */ MVMint64 MVM_string_index_of_grapheme(MVMThreadContext *tc, MVMString *a, MVMGrapheme32 grapheme) { size_t index = -1; MVMGraphemeIter gi; MVM_string_check_arg(tc, a, "string_index_of_grapheme"); MVM_string_gi_init(tc, &gi, a); while (MVM_string_gi_has_more(tc, &gi)) { index++; if (MVM_string_gi_get_grapheme(tc, &gi) == grapheme) return index; } return -1; } /* Case change functions. */ static MVMint64 grapheme_is_cclass(MVMThreadContext *tc, MVMint64 cclass, MVMGrapheme32 g); static MVMString * do_case_change(MVMThreadContext *tc, MVMString *s, MVMint32 type, char *error) { MVMint64 sgraphs; MVM_string_check_arg(tc, s, error); sgraphs = MVM_string_graphs_nocheck(tc, s); if (sgraphs) { MVMString *result; MVMGraphemeIter gi; MVMint64 result_graphs = sgraphs; MVMGrapheme32 *result_buf = MVM_malloc(result_graphs * sizeof(MVMGrapheme32)); MVMint32 changed = 0; MVMint64 i = 0; MVM_string_gi_init(tc, &gi, s); while (MVM_string_gi_has_more(tc, &gi)) { MVMGrapheme32 g = MVM_string_gi_get_grapheme(tc, &gi); peeked: if (g == 0x03A3) { /* Greek sigma needs special handling when lowercased. */ switch (type) { case MVM_unicode_case_change_type_upper: case MVM_unicode_case_change_type_title: result_buf[i++] = g; break; case MVM_unicode_case_change_type_lower: changed = 1; if (i == 0) { /* Start of string, so not final. */ result_buf[i++] = 0x03C3; } else if (!grapheme_is_cclass(tc, MVM_CCLASS_ALPHABETIC, result_buf[i - 1])) { /* Previous char is not a letter; not final (as has * to be at end of a word and not only thing in a * word). */ result_buf[i++] = 0x03C3; } else if (!MVM_string_gi_has_more(tc, &gi)) { /* End of string. We only reach here if we have a * letter before us, so it must be final. */ result_buf[i++] = 0x03C2; } else { /* Letter before us, something ahead of us. Need to * peek ahead to see if it's a letter, to decide if * we have final sigma or not. */ g = MVM_string_gi_get_grapheme(tc, &gi); if (grapheme_is_cclass(tc, MVM_CCLASS_ALPHABETIC, g)) result_buf[i++] = 0x03C3; else result_buf[i++] = 0x03C2; goto peeked; } break; case MVM_unicode_case_change_type_fold: result_buf[i++] = 0x03C3; changed = 1; break; } } else if (0 <= g) { const MVMCodepoint *result_cps; MVMuint32 num_result_cps = MVM_unicode_get_case_change(tc, g, type, &result_cps); if (num_result_cps == 0) { result_buf[i++] = g; } else if (num_result_cps == 1) { result_buf[i++] = *result_cps; changed = 1; } else { /* To maintain NFG, we need to re-normalize when we get an * expansion. */ MVMNormalizer norm; MVMint32 num_result_graphs; MVM_unicode_normalizer_init(tc, &norm, MVM_NORMALIZE_NFG); MVM_unicode_normalizer_push_codepoints(tc, &norm, result_cps, num_result_cps); MVM_unicode_normalizer_eof(tc, &norm); num_result_graphs = MVM_unicode_normalizer_available(tc, &norm); /* Make space for any extra graphemes. */ if (1 < num_result_graphs) { result_graphs += num_result_graphs - 1; result_buf = MVM_realloc(result_buf, result_graphs * sizeof(MVMGrapheme32)); } /* Copy resulting graphemes. */ while (0 < num_result_graphs) { result_buf[i++] = MVM_unicode_normalizer_get_grapheme(tc, &norm); num_result_graphs--; } changed = 1; /* Clean up normalizer (we could init one per transform * and keep it around in the future, if we find it's a * worthwhile gain). */ MVM_unicode_normalizer_cleanup(tc, &norm); } } else { MVMGrapheme32 *transformed; MVMint32 num_transformed = MVM_nfg_get_case_change(tc, g, type, &transformed); if (num_transformed == 0) { result_buf[i++] = g; } else if (num_transformed == 1) { result_buf[i++] = *transformed; changed = 1; } else { MVMuint32 j; result_graphs += num_transformed - 1; result_buf = MVM_realloc(result_buf, result_graphs * sizeof(MVMGrapheme32)); for (j = 0; j < num_transformed; j++) result_buf[i++] = transformed[j]; changed = 1; } } } if (changed) { result = (MVMString *)MVM_repr_alloc_init(tc, tc->instance->VMString); result->body.num_graphs = result_graphs; result->body.storage_type = MVM_STRING_GRAPHEME_32; result->body.storage.blob_32 = result_buf; return result; } else { MVM_free(result_buf); } } STRAND_CHECK(tc, s); return s; } MVMString * MVM_string_uc(MVMThreadContext *tc, MVMString *s) { return do_case_change(tc, s, MVM_unicode_case_change_type_upper, "uc"); } MVMString * MVM_string_lc(MVMThreadContext *tc, MVMString *s) { return do_case_change(tc, s, MVM_unicode_case_change_type_lower, "lc"); } MVMString * MVM_string_tc(MVMThreadContext *tc, MVMString *s) { return do_case_change(tc, s, MVM_unicode_case_change_type_title, "tc"); } MVMString * MVM_string_fc(MVMThreadContext *tc, MVMString *s) { return do_case_change(tc, s, MVM_unicode_case_change_type_fold, "fc"); } /* "Strict"ly (if possible) decodes a C buffer to an MVMString, dependent on the * encoding type flag. Unlike MVM_string_decode, it will not pass through * codepoints which have no official mapping. `config` can be set to 1 to indicate * that you want to decode non-strict ("permissive"), which will try and decode * as long as it's possible (For example codepoint 129 in windows-1252 is invalid, * but is technically possible to use Unicode codepoint 129 instead (though it's * most likely this means the input is actually *not* windows-1252). * For now windows-1252 and windows-1251 are the only ones this makes a difference * on. And it is mostly irrelevant for utf8/utf8-c8 encodings since they can * already represent all codepoints below 0x10FFFF */ MVMString * MVM_string_decode_config(MVMThreadContext *tc, const MVMObject *type_object, char *Cbuf, MVMint64 byte_length, MVMint64 encoding_flag, MVMString *replacement, MVMint64 config) { switch(encoding_flag) { case MVM_encoding_type_utf8: return MVM_string_utf8_decode_strip_bom(tc, type_object, Cbuf, byte_length); case MVM_encoding_type_ascii: return MVM_string_ascii_decode(tc, type_object, Cbuf, byte_length); case MVM_encoding_type_latin1: return MVM_string_latin1_decode(tc, type_object, Cbuf, byte_length); case MVM_encoding_type_utf16: return MVM_string_utf16_decode(tc, type_object, Cbuf, byte_length); case MVM_encoding_type_windows1252: return MVM_string_windows1252_decode_config(tc, type_object, Cbuf, byte_length, replacement, config); case MVM_encoding_type_windows1251: return MVM_string_windows1251_decode_config(tc, type_object, Cbuf, byte_length, replacement, config); case MVM_encoding_type_utf8_c8: return MVM_string_utf8_c8_decode(tc, type_object, Cbuf, byte_length); default: MVM_exception_throw_adhoc(tc, "invalid encoding type flag: %"PRId64, encoding_flag); } } /* Strictly decodes a C buffer to an MVMString, dependent on the encoding type flag. * See the comments above MVM_string_decode_config() above for more details. */ MVMString * MVM_string_decode(MVMThreadContext *tc, const MVMObject *type_object, char *Cbuf, MVMint64 byte_length, MVMint64 encoding_flag) { return MVM_string_decode_config(tc, type_object, Cbuf, byte_length, encoding_flag, NULL, MVM_ENCODING_PERMISSIVE); } /* Strictly encodes an MVMString to a C buffer, dependent on the encoding type flag. * See comments for MVM_string_decode_config() above for more details. */ char * MVM_string_encode_config(MVMThreadContext *tc, MVMString *s, MVMint64 start, MVMint64 length, MVMuint64 *output_size, MVMint64 encoding_flag, MVMString *replacement, MVMint32 translate_newlines, MVMuint8 config) { switch(encoding_flag) { case MVM_encoding_type_utf8: return MVM_string_utf8_encode_substr(tc, s, output_size, start, length, replacement, translate_newlines); case MVM_encoding_type_ascii: return MVM_string_ascii_encode_substr(tc, s, output_size, start, length, replacement, translate_newlines); case MVM_encoding_type_latin1: return MVM_string_latin1_encode_substr(tc, s, output_size, start, length, replacement, translate_newlines); case MVM_encoding_type_utf16: return MVM_string_utf16_encode_substr(tc, s, output_size, start, length, replacement, translate_newlines); case MVM_encoding_type_windows1252: return MVM_string_windows1252_encode_substr_config(tc, s, output_size, start, length, replacement, translate_newlines, config); case MVM_encoding_type_windows1251: return MVM_string_windows1251_encode_substr_config(tc, s, output_size, start, length, replacement, translate_newlines, config); case MVM_encoding_type_utf8_c8: return MVM_string_utf8_c8_encode_substr(tc, s, output_size, start, length, replacement); default: MVM_exception_throw_adhoc(tc, "invalid encoding type flag: %"PRId64, encoding_flag); } } char * MVM_string_encode(MVMThreadContext *tc, MVMString *s, MVMint64 start, MVMint64 length, MVMuint64 *output_size, MVMint64 encoding_flag, MVMString *replacement, MVMint32 translate_newlines) { return MVM_string_encode_config(tc, s, start, length, output_size, encoding_flag, replacement, translate_newlines, MVM_ENCODING_PERMISSIVE); } /* Strictly encodes a string, and writes the encoding string into the supplied Buf * instance, which should be an integer array with MVMArray REPR. */ MVMObject * MVM_string_encode_to_buf_config(MVMThreadContext *tc, MVMString *s, MVMString *enc_name, MVMObject *buf, MVMString *replacement, MVMint64 config) { MVMuint64 output_size; MVMuint8 *encoded; MVMArrayREPRData *buf_rd; MVMuint8 elem_size = 0; /* Ensure the target is in the correct form. */ MVM_string_check_arg(tc, s, "encode"); if (!IS_CONCRETE(buf) || REPR(buf)->ID != MVM_REPR_ID_VMArray) MVM_exception_throw_adhoc(tc, "encode requires a native array to write into"); buf_rd = (MVMArrayREPRData *)STABLE(buf)->REPR_data; if (buf_rd) { switch (buf_rd->slot_type) { case MVM_ARRAY_I64: elem_size = 8; break; case MVM_ARRAY_I32: elem_size = 4; break; case MVM_ARRAY_I16: elem_size = 2; break; case MVM_ARRAY_I8: elem_size = 1; break; case MVM_ARRAY_U64: elem_size = 8; break; case MVM_ARRAY_U32: elem_size = 4; break; case MVM_ARRAY_U16: elem_size = 2; break; case MVM_ARRAY_U8: elem_size = 1; break; } } if (!elem_size) MVM_exception_throw_adhoc(tc, "encode requires a native int array"); if (((MVMArray *)buf)->body.slots.any) MVM_exception_throw_adhoc(tc, "encode requires an empty array"); /* At least find_encoding may allocate on first call, so root just * in case. */ MVMROOT2(tc, buf, s, { const MVMuint8 encoding_flag = MVM_string_find_encoding(tc, enc_name); encoded = (MVMuint8 *)MVM_string_encode_config(tc, s, 0, MVM_string_graphs_nocheck(tc, s), &output_size, encoding_flag, replacement, 0, config); }); /* Stash the encoded data in the VMArray. */ ((MVMArray *)buf)->body.slots.i8 = (MVMint8 *)encoded; ((MVMArray *)buf)->body.start = 0; ((MVMArray *)buf)->body.ssize = output_size / elem_size; ((MVMArray *)buf)->body.elems = output_size / elem_size; return buf; } MVMObject * MVM_string_encode_to_buf(MVMThreadContext *tc, MVMString *s, MVMString *enc_name, MVMObject *buf, MVMString *replacement) { return MVM_string_encode_to_buf_config(tc, s, enc_name, buf, replacement, MVM_ENCODING_PERMISSIVE); } /* Decodes a string using the data from the specified Buf. Decodes "strict" by * default, but optionally can be "permissive". */ MVMString * MVM_string_decode_from_buf_config(MVMThreadContext *tc, MVMObject *buf, MVMString *enc_name, MVMString *replacement, MVMint64 config) { MVMArrayREPRData *buf_rd; MVMuint8 encoding_flag; MVMuint8 elem_size = 0; /* Ensure the source is in the correct form. */ if (!IS_CONCRETE(buf) || REPR(buf)->ID != MVM_REPR_ID_VMArray) MVM_exception_throw_adhoc(tc, "decode requires a native array to read from"); buf_rd = (MVMArrayREPRData *)STABLE(buf)->REPR_data; if (buf_rd) { switch (buf_rd->slot_type) { case MVM_ARRAY_I64: elem_size = 8; break; case MVM_ARRAY_I32: elem_size = 4; break; case MVM_ARRAY_I16: elem_size = 2; break; case MVM_ARRAY_I8: elem_size = 1; break; case MVM_ARRAY_U64: elem_size = 8; break; case MVM_ARRAY_U32: elem_size = 4; break; case MVM_ARRAY_U16: elem_size = 2; break; case MVM_ARRAY_U8: elem_size = 1; break; } } if (!elem_size) MVM_exception_throw_adhoc(tc, "encode requires a native int array"); /* Decode. */ MVMROOT(tc, buf, { encoding_flag = MVM_string_find_encoding(tc, enc_name); }); return MVM_string_decode_config(tc, tc->instance->VMString, (char *)(((MVMArray *)buf)->body.slots.i8 + ((MVMArray *)buf)->body.start), ((MVMArray *)buf)->body.elems * elem_size, encoding_flag, replacement, config); } MVMString * MVM_string_decode_from_buf(MVMThreadContext *tc, MVMObject *buf, MVMString *enc_name) { return MVM_string_decode_from_buf_config(tc, buf, enc_name, NULL, MVM_ENCODING_PERMISSIVE); } MVMObject * MVM_string_split(MVMThreadContext *tc, MVMString *separator, MVMString *input) { MVMObject *result = NULL; MVMStringIndex start, end, sep_length; MVMHLLConfig *hll = MVM_hll_current(tc); MVM_string_check_arg(tc, separator, "split separator"); MVM_string_check_arg(tc, input, "split input"); MVMROOT3(tc, input, separator, result, { result = MVM_repr_alloc_init(tc, hll->slurpy_array_type); start = 0; end = MVM_string_graphs_nocheck(tc, input); sep_length = MVM_string_graphs_nocheck(tc, separator); while (start < end) { MVMString *portion; MVMStringIndex index; MVMStringIndex length; /* XXX make this use the dual-traverse iterator, but such that it can reset the index of what it's comparing... */ index = MVM_string_index(tc, input, separator, start); length = sep_length ? (index == -1 ? end : index) - start : 1; if (0 < length || (sep_length && length == 0)) { portion = MVM_string_substring(tc, input, start, length); MVMROOT(tc, portion, { MVMObject *pobj = MVM_repr_alloc_init(tc, hll->str_box_type); MVM_repr_set_str(tc, pobj, portion); MVM_repr_push_o(tc, result, pobj); }); } start += length + sep_length; /* Gather an empty string if the delimiter is found at the end. */ if (sep_length && start == end) { MVMObject *pobj = MVM_repr_alloc_init(tc, hll->str_box_type); MVM_repr_set_str(tc, pobj, tc->instance->str_consts.empty); MVM_repr_push_o(tc, result, pobj); } } }); return result; } /* Used in the MVM_string_join function. Moved here to simplify the code */ void copy_to_32bit (MVMThreadContext *tc, MVMString *source, MVMString *dest, MVMint64 *position, MVMGraphemeIter *gi) { /* Add source. */ switch (source->body.storage_type) { case MVM_STRING_GRAPHEME_32: { memcpy( dest->body.storage.blob_32 + *position, source->body.storage.blob_32, source->body.num_graphs * sizeof(MVMGrapheme32)); *position += source->body.num_graphs; break; } case MVM_STRING_GRAPHEME_ASCII: case MVM_STRING_GRAPHEME_8: { MVMStringIndex sindex = 0; while (sindex < source->body.num_graphs) dest->body.storage.blob_32[(*position)++] = source->body.storage.blob_8[sindex++]; break; } default: MVM_string_gi_init(tc, gi, source); while (MVM_string_gi_has_more(tc, gi)) dest->body.storage.blob_32[(*position)++] = MVM_string_gi_get_grapheme(tc, gi); break; } } /* Used in MVM_string_join to check stability of adding the next piece */ MVM_STATIC_INLINE void join_check_stability(MVMThreadContext *tc, MVMString *piece, MVMString *separator, MVMString **pieces, MVMint32 *concats_stable, MVMint64 num_pieces, MVMint64 sgraphs, MVMint64 piece_index) { if (!sgraphs) { /* If there's no separator and one piece is The Empty String we * have to be extra careful about concat stability */ if (!MVM_string_graphs_nocheck(tc, piece) && piece_index + 1 < num_pieces && !MVM_nfg_is_concat_stable(tc, pieces[piece_index - 1], pieces[piece_index + 1])) { *concats_stable = 0; } /* Separator has no graphemes, so NFG stability check * should consider pieces. */ else if (!MVM_nfg_is_concat_stable(tc, pieces[piece_index - 1], piece)) *concats_stable = 0; } /* If we have a separator, check concat stability */ else { if (!MVM_nfg_is_concat_stable(tc, pieces[piece_index - 1], separator) /* Before */ || !MVM_nfg_is_concat_stable(tc, separator, piece)) { /* And after separator */ *concats_stable = 0; } } } MVM_STATIC_INLINE MVMString * join_get_str_from_pos(MVMThreadContext *tc, MVMObject *array, MVMint64 index, MVMint64 is_str_array) { if (is_str_array) { MVMString *piece = MVM_repr_at_pos_s(tc, array, index); if (piece) return piece; } else { MVMObject *item = MVM_repr_at_pos_o(tc, array, index); if (item && IS_CONCRETE(item)) return MVM_repr_get_str(tc, item); } return (MVMString*)NULL; } MVMString * MVM_string_join(MVMThreadContext *tc, MVMString *separator, MVMObject *input) { MVMString *result = NULL; MVMString **pieces = NULL; MVMint64 elems, num_pieces, sgraphs, i, is_str_array, total_graphs; MVMuint16 sstrands, total_strands; MVMint32 concats_stable = 1, all_strands; size_t bytes; MVM_string_check_arg(tc, separator, "join separator"); if (!IS_CONCRETE(input)) MVM_exception_throw_adhoc(tc, "join needs a concrete array to join"); /* See how many things we have to join; if the answer is "none" then we * can make a hasty escape. */ elems = MVM_repr_elems(tc, input); if (elems == 0) return tc->instance->str_consts.empty; bytes = elems * sizeof(MVMString *); is_str_array = REPR(input)->pos_funcs.get_elem_storage_spec(tc, STABLE(input)).boxed_primitive == MVM_STORAGE_SPEC_BP_STR; /* If there's only one element to join, just return it. */ if (elems == 1) { MVMString *piece = join_get_str_from_pos(tc, input, 0, is_str_array); if (piece) return piece; } /* Allocate result. */ MVMROOT2(tc, separator, input, { result = (MVMString *)MVM_repr_alloc_init(tc, tc->instance->VMString); }); /* Take a first pass through the string, counting up length and the total * number of strands we encounter as well as building a flat array of the * strings (so we only have to do the indirect calls once). */ sgraphs = MVM_string_graphs_nocheck(tc, separator); if (sgraphs) sstrands = separator->body.storage_type == MVM_STRING_STRAND ? separator->body.num_strands : 1; else sstrands = 1; pieces = MVM_fixed_size_alloc(tc, tc->instance->fsa, bytes); num_pieces = 0; total_graphs = 0; total_strands = 0; /* Is the separator a strand? */ all_strands = separator->body.storage_type == MVM_STRING_STRAND; for (i = 0; i < elems; i++) { /* Get piece of the string. */ MVMString *piece = join_get_str_from_pos(tc, input, i, is_str_array); MVMint64 piece_graphs; if (!piece) continue; /* Check that all the pieces are strands. */ if (all_strands) all_strands = piece->body.storage_type == MVM_STRING_STRAND; /* If it wasn't the first piece, add separator here. */ if (num_pieces) { total_strands += sstrands; total_graphs += sgraphs; } /* Add on the piece's strands and graphs. */ piece_graphs = MVM_string_graphs(tc, piece); if (piece_graphs) { total_strands += piece->body.storage_type == MVM_STRING_STRAND ? piece->body.num_strands : 1; total_graphs += piece_graphs; } /* Store piece. */ pieces[num_pieces++] = piece; } /* This guards the joining by method of multiple concats, and will be faster * if we only end up with one piece after going through each element of the array */ if (num_pieces == 1) return pieces[0]; /* We now know the total eventual number of graphemes. */ if (total_graphs == 0) { MVM_fixed_size_free(tc, tc->instance->fsa, bytes, pieces); return tc->instance->str_consts.empty; } result->body.num_graphs = total_graphs; MVMROOT(tc, result, { /* If the separator and pieces are all strands, and there are * on average at least 16 graphemes in each of the strands. */ if (all_strands && total_strands < MVM_STRING_MAX_STRANDS && total_strands * 16 <= total_graphs) { MVMuint16 offset = 0; result->body.storage_type = MVM_STRING_STRAND; result->body.storage.strands = allocate_strands(tc, total_strands); result->body.num_strands = total_strands; for (i = 0; i < num_pieces; i++) { MVMString *piece = pieces[i]; if (0 < i) { /* No more checks unless still stable */ if (concats_stable) join_check_stability(tc, piece, separator, pieces, &concats_stable, num_pieces, sgraphs, i); copy_strands(tc, separator, 0, result, offset, separator->body.num_strands); offset += separator->body.num_strands; } copy_strands(tc, piece, 0, result, offset, piece->body.num_strands); offset += piece->body.num_strands; } } /* Doing multiple concats is only faster if we have about 300 graphemes per piece or if we have less than for pieces and more than 150 graphemes per piece */ else if (total_strands < MVM_STRING_MAX_STRANDS && (300 < num_pieces/total_graphs || (num_pieces < 4 && 150 < num_pieces/total_graphs))) { MVMString *result = NULL; MVMROOT(tc, result, { if (sgraphs) { i = 0; result = MVM_string_concatenate(tc, pieces[i++], separator); result = MVM_string_concatenate(tc, result, pieces[i++]); for (; i < num_pieces;) { result = MVM_string_concatenate(tc, result, separator); result = MVM_string_concatenate(tc, result, pieces[i++]); } } else { result = MVM_string_concatenate(tc, pieces[0], pieces[1]); i = 2; for (; i < num_pieces;) { result = MVM_string_concatenate(tc, result, pieces[i++]); } } }); return result; } else { /* We'll produce a single, flat string. */ MVMint64 position = 0; MVMGraphemeIter gi; result->body.storage_type = MVM_STRING_GRAPHEME_32; result->body.storage.blob_32 = MVM_malloc(total_graphs * sizeof(MVMGrapheme32)); for (i = 0; i < num_pieces; i++) { /* Get piece. */ MVMString *piece = pieces[i]; /* Add separator if needed. */ if (0 < i) { /* No more checks unless still stable */ if (concats_stable) join_check_stability(tc, piece, separator, pieces, &concats_stable, num_pieces, sgraphs, i); /* Add separator */ if (sgraphs) copy_to_32bit(tc, separator, result, &position, &gi); } /* Add piece */ copy_to_32bit(tc, piece, result, &position, &gi); } } MVM_fixed_size_free(tc, tc->instance->fsa, bytes, pieces); STRAND_CHECK(tc, result); /* if concat is stable and NFG_CHECK on, run a NFG_CHECK on it since it * should be properly constructed now */ if (concats_stable) NFG_CHECK(tc, result, "MVM_string_join"); }); return concats_stable ? result : re_nfg(tc, result); } /* Returning nonzero means it found the char at the position specified in 'a' in 'b'. * For character enumerations in regexes. */ MVMint64 MVM_string_char_at_in_string(MVMThreadContext *tc, MVMString *a, MVMint64 offset, MVMString *b) { MVMuint32 bgraphs; MVMGrapheme32 search; MVM_string_check_arg(tc, a, "char_at_in_string"); MVM_string_check_arg(tc, b, "char_at_in_string"); /* We return -2 here only to be able to distinguish between "out of bounds" and "not in string". */ if (offset < 0 || MVM_string_graphs_nocheck(tc, a) <= offset) return -2; search = MVM_string_get_grapheme_at_nocheck(tc, a, offset); bgraphs = MVM_string_graphs_nocheck(tc, b); switch (b->body.storage_type) { case MVM_STRING_GRAPHEME_32: { MVMStringIndex i; for (i = 0; i < bgraphs; i++) if (b->body.storage.blob_32[i] == search) return i; break; } case MVM_STRING_GRAPHEME_ASCII: if (can_fit_into_ascii(search)) { MVMStringIndex i; for (i = 0; i < bgraphs; i++) if (b->body.storage.blob_ascii[i] == search) return i; } break; case MVM_STRING_GRAPHEME_8: if (can_fit_into_8bit(search)) { MVMStringIndex i; for (i = 0; i < bgraphs; i++) if (b->body.storage.blob_8[i] == search) return i; } break; case MVM_STRING_STRAND: { MVMGraphemeIter gi; MVMStringIndex i; MVM_string_gi_init(tc, &gi, b); for (i = 0; i < bgraphs; i++) if (MVM_string_gi_get_grapheme(tc, &gi) == search) return i; } } return -1; } MVMint64 MVM_string_offset_has_unicode_property_value(MVMThreadContext *tc, MVMString *s, MVMint64 offset, MVMint64 property_code, MVMint64 property_value_code) { MVMGrapheme32 g; MVMCodepoint cp; MVM_string_check_arg(tc, s, "uniprop"); if (offset < 0 || offset >= MVM_string_graphs_nocheck(tc, s)) return 0; g = MVM_string_get_grapheme_at_nocheck(tc, s, offset); if (g >= 0) cp = (MVMCodepoint)g; else cp = MVM_nfg_get_synthetic_info(tc, g)->codes[0]; return MVM_unicode_codepoint_has_property_value(tc, cp, property_code, property_value_code); } /* If the string is made up of strands, then produces a flattend string * representing the exact same graphemes but without strands. Otherwise, * returns the input string. Intended for strings that will be indexed * into heavily (when evaluating regexes, for example). */ MVMString * MVM_string_indexing_optimized(MVMThreadContext *tc, MVMString *s) { MVM_string_check_arg(tc, s, "indexingoptimized"); if (s->body.storage_type == MVM_STRING_STRAND) return collapse_strands(tc, s); else return s; } /* Escapes a string, replacing various chars like \n with \\n. Can no doubt be * further optimized. */ MVMString * MVM_string_escape(MVMThreadContext *tc, MVMString *s) { MVMString *res = NULL; MVMStringIndex spos = 0; MVMStringIndex bpos = 0; MVMStringIndex sgraphs, balloc; MVMGrapheme32 *buffer = NULL; MVMGrapheme32 crlf; MVMint8 string_can_fit_into_8bit = 1; MVM_string_check_arg(tc, s, "escape"); sgraphs = MVM_string_graphs_nocheck(tc, s); balloc = sgraphs; buffer = MVM_malloc(sizeof(MVMGrapheme32) * balloc); crlf = MVM_nfg_crlf_grapheme(tc); for (; spos < sgraphs; spos++) { MVMGrapheme32 graph = MVM_string_get_grapheme_at_nocheck(tc, s, spos); MVMGrapheme32 esc = 0; switch (graph) { case '\\': esc = '\\'; break; case 7: esc = 'a'; break; case '\b': esc = 'b'; break; case '\n': esc = 'n'; break; case '\r': esc = 'r'; break; case '\t': esc = 't'; break; case '\f': esc = 'f'; break; case '"': esc = '"'; break; case 27: esc = 'e'; break; } if (esc) { if (bpos + 2 > balloc) { balloc += 32; buffer = MVM_realloc(buffer, sizeof(MVMGrapheme32) * balloc); } buffer[bpos++] = '\\'; buffer[bpos++] = esc; } else if (graph == crlf) { if (bpos + 4 > balloc) { balloc += 32; buffer = MVM_realloc(buffer, sizeof(MVMGrapheme32) * balloc); } buffer[bpos++] = '\\'; buffer[bpos++] = 'r'; buffer[bpos++] = '\\'; buffer[bpos++] = 'n'; } else { if (bpos + 1 > balloc) { balloc += 32; buffer = MVM_realloc(buffer, sizeof(MVMGrapheme32) * balloc); } if (!can_fit_into_8bit(graph)) string_can_fit_into_8bit = 0; buffer[bpos++] = graph; } } res = (MVMString *)MVM_repr_alloc_init(tc, tc->instance->VMString); res->body.storage_type = MVM_STRING_GRAPHEME_32; res->body.storage.blob_32 = buffer; res->body.num_graphs = bpos; if (string_can_fit_into_8bit) turn_32bit_into_8bit_unchecked(tc, res); STRAND_CHECK(tc, res); return res; } /* Takes a string and reverses its characters. */ MVMString * MVM_string_flip(MVMThreadContext *tc, MVMString *s) { MVMString *res = NULL; MVMStringIndex spos = 0; MVMStringIndex sgraphs; MVMStringIndex rpos; MVM_string_check_arg(tc, s, "flip"); sgraphs = MVM_string_graphs_nocheck(tc, s); rpos = sgraphs; if (s->body.storage_type == MVM_STRING_GRAPHEME_8) { MVMGrapheme8 *rbuffer; rbuffer = MVM_malloc(sizeof(MVMGrapheme8) * sgraphs); for (; spos < sgraphs; spos++) rbuffer[--rpos] = s->body.storage.blob_8[spos]; res = (MVMString *)MVM_repr_alloc_init(tc, tc->instance->VMString); res->body.storage_type = MVM_STRING_GRAPHEME_8; res->body.storage.blob_8 = rbuffer; } else { MVMGrapheme32 *rbuffer; rbuffer = MVM_malloc(sizeof(MVMGrapheme32) * sgraphs); if (s->body.storage_type == MVM_STRING_GRAPHEME_32) for (; spos < sgraphs; spos++) rbuffer[--rpos] = s->body.storage.blob_32[spos]; else for (; spos < sgraphs; spos++) rbuffer[--rpos] = MVM_string_get_grapheme_at_nocheck(tc, s, spos); res = (MVMString *)MVM_repr_alloc_init(tc, tc->instance->VMString); res->body.storage_type = MVM_STRING_GRAPHEME_32; res->body.storage.blob_32 = rbuffer; } res->body.num_graphs = sgraphs; STRAND_CHECK(tc, res); return res; } /* Compares two strings, returning -1, 0 or 1 to indicate less than, * equal or greater than. */ MVMint64 MVM_string_compare(MVMThreadContext *tc, MVMString *a, MVMString *b) { MVMStringIndex alen, blen, i, scanlen; MVM_string_check_arg(tc, a, "compare"); MVM_string_check_arg(tc, b, "compare"); /* Simple cases when one or both are zero length. */ alen = MVM_string_graphs_nocheck(tc, a); blen = MVM_string_graphs_nocheck(tc, b); if (alen == 0) return blen == 0 ? 0 : -1; if (blen == 0) return 1; /* Otherwise, need to scan them. */ scanlen = blen < alen ? blen : alen; for (i = 0; i < scanlen; i++) { MVMGrapheme32 g_a = MVM_string_get_grapheme_at_nocheck(tc, a, i); MVMGrapheme32 g_b = MVM_string_get_grapheme_at_nocheck(tc, b, i); if (g_a != g_b) { MVMint64 rtrn; /* If one of the deciding graphemes is a synthetic then we need to * iterate the codepoints inside it */ if (g_a < 0 || g_b < 0) { MVMCodepointIter ci_a, ci_b; MVM_string_grapheme_ci_init(tc, &ci_a, g_a, 0); MVM_string_grapheme_ci_init(tc, &ci_b, g_b, 0); while (MVM_string_grapheme_ci_has_more(tc, &ci_a) && MVM_string_grapheme_ci_has_more(tc, &ci_b)) { g_a = MVM_string_grapheme_ci_get_codepoint(tc, &ci_a); g_b = MVM_string_grapheme_ci_get_codepoint(tc, &ci_b); if (g_a != g_b) break; } rtrn = g_a < g_b ? -1 : g_b < g_a ? 1 : 0 ; /* If we get here, all the codepoints in the synthetics have matched * so go based on which has more codepoints left in that grapheme */ if (!rtrn) { MVMint32 a_has_more = MVM_string_grapheme_ci_has_more(tc, &ci_a), b_has_more = MVM_string_grapheme_ci_has_more(tc, &ci_b); return a_has_more < b_has_more ? -1 : b_has_more < a_has_more ? 1 : 0 ; } return rtrn; } return g_a < g_b ? -1 : g_b < g_a ? 1 : 0 ; } } /* All shared chars equal, so go on length. */ return alen < blen ? -1 : blen < alen ? 1 : 0 ; } /* Takes two strings and AND's their characters. */ MVMString * MVM_string_bitand(MVMThreadContext *tc, MVMString *a, MVMString *b) { MVMString *res = NULL; MVMGrapheme32 *buffer = NULL; MVMStringIndex i, alen, blen, sgraphs; MVM_string_check_arg(tc, a, "bitwise and"); MVM_string_check_arg(tc, b, "bitwise and"); alen = MVM_string_graphs_nocheck(tc, a); blen = MVM_string_graphs_nocheck(tc, b); sgraphs = alen < blen ? alen : blen; buffer = MVM_malloc(sizeof(MVMGrapheme32) * sgraphs); /* Binary-and up to the length of the shortest string. */ for (i = 0; i < sgraphs; i++) buffer[i] = (MVM_string_get_grapheme_at_nocheck(tc, a, i) & MVM_string_get_grapheme_at_nocheck(tc, b, i)); res = (MVMString *)MVM_repr_alloc_init(tc, tc->instance->VMString); res->body.storage_type = MVM_STRING_GRAPHEME_32; res->body.storage.blob_32 = buffer; res->body.num_graphs = sgraphs; STRAND_CHECK(tc, res); return res; } /* Takes two strings and OR's their characters. */ MVMString * MVM_string_bitor(MVMThreadContext *tc, MVMString *a, MVMString *b) { MVMString *res = NULL; MVMGrapheme32 *buffer = NULL; MVMStringIndex alen, blen, sgraphs, i, scanlen; MVM_string_check_arg(tc, a, "bitwise or"); MVM_string_check_arg(tc, b, "bitwise or"); alen = MVM_string_graphs_nocheck(tc, a); blen = MVM_string_graphs_nocheck(tc, b); sgraphs = (alen > blen ? alen : blen); buffer = MVM_malloc(sizeof(MVMGrapheme32) * sgraphs); /* First, binary-or up to the length of the shortest string. */ scanlen = alen > blen ? blen : alen; for (i = 0; i < scanlen; i++) buffer[i] = (MVM_string_get_grapheme_at_nocheck(tc, a, i) | MVM_string_get_grapheme_at_nocheck(tc, b, i)); /* Second pass, fill with characters of the longest string. */ if (alen > blen) for (; i < sgraphs; i++) buffer[i] = MVM_string_get_grapheme_at_nocheck(tc, a, i); else for (; i < sgraphs; i++) buffer[i] = MVM_string_get_grapheme_at_nocheck(tc, b, i); res = (MVMString *)MVM_repr_alloc_init(tc, tc->instance->VMString); res->body.storage_type = MVM_STRING_GRAPHEME_32; res->body.storage.blob_32 = buffer; res->body.num_graphs = sgraphs; STRAND_CHECK(tc, res); return res; } /* Takes two strings and XOR's their characters. */ MVMString * MVM_string_bitxor(MVMThreadContext *tc, MVMString *a, MVMString *b) { MVMString *res = NULL; MVMGrapheme32 *buffer = NULL; MVMStringIndex alen, blen, sgraphs, i, scanlen; MVM_string_check_arg(tc, a, "bitwise xor"); MVM_string_check_arg(tc, b, "bitwise xor"); alen = MVM_string_graphs_nocheck(tc, a); blen = MVM_string_graphs_nocheck(tc, b); sgraphs = (alen > blen ? alen : blen); buffer = MVM_malloc(sizeof(MVMGrapheme32) * sgraphs); /* First, binary-xor up to the length of the shorter string. */ scanlen = alen > blen ? blen : alen; for (i = 0; i < scanlen; i++) buffer[i] = (MVM_string_get_grapheme_at_nocheck(tc, a, i) ^ MVM_string_get_grapheme_at_nocheck(tc, b, i)); /* Second pass, fill with characters of the longest string. */ if (alen > blen) for (; i < sgraphs; i++) buffer[i] = MVM_string_get_grapheme_at_nocheck(tc, a, i); else for (; i < sgraphs; i++) buffer[i] = MVM_string_get_grapheme_at_nocheck(tc, b, i); res = (MVMString *)MVM_repr_alloc_init(tc, tc->instance->VMString); res->body.storage_type = MVM_STRING_GRAPHEME_32; res->body.storage.blob_32 = buffer; res->body.num_graphs = sgraphs; STRAND_CHECK(tc, res); return res; } /* The following statics hold on to various unicode property values we will * resolve once so we don't have to do it repeatedly. */ static MVMint64 UPV_Nd = 0; static MVMint64 UPV_Lu = 0; static MVMint64 UPV_Ll = 0; static MVMint64 UPV_Lt = 0; static MVMint64 UPV_Lm = 0; static MVMint64 UPV_Lo = 0; static MVMint64 UPV_Zs = 0; static MVMint64 UPV_Zl = 0; static MVMint64 UPV_Pc = 0; static MVMint64 UPV_Pd = 0; static MVMint64 UPV_Ps = 0; static MVMint64 UPV_Pe = 0; static MVMint64 UPV_Pi = 0; static MVMint64 UPV_Pf = 0; static MVMint64 UPV_Po = 0; /* concatenating with "" ensures that only literal strings are accepted as argument. */ #define STR_WITH_LEN(str) ("" str ""), (sizeof(str) - 1) /* Resolves various unicode property values that we'll need. */ void MVM_string_cclass_init(MVMThreadContext *tc) { UPV_Nd = MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Nd")); UPV_Lu = MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Lu")); UPV_Ll = MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Ll")); UPV_Lt = MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Lt")); UPV_Lm = MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Lm")); UPV_Lo = MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Lo")); UPV_Zs = MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Zs")); UPV_Zl = MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Zl")); UPV_Pc = MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Pc")); UPV_Pd = MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Pd")); UPV_Ps = MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Ps")); UPV_Pe = MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Pe")); UPV_Pi = MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Pi")); UPV_Pf = MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Pf")); UPV_Po = MVM_unicode_cname_to_property_value_code(tc, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, STR_WITH_LEN("Po")); } /* Checks if the specified grapheme is in the given character class. */ static MVMint64 grapheme_is_cclass(MVMThreadContext *tc, MVMint64 cclass, MVMGrapheme32 g) { /* If it's a synthetic, then grab the base codepoint. */ MVMCodepoint cp; if (g >= 0) cp = (MVMCodepoint)g; else cp = MVM_nfg_get_synthetic_info(tc, g)->codes[0]; switch (cclass) { case MVM_CCLASS_ANY: return 1; case MVM_CCLASS_UPPERCASE: return MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Lu); case MVM_CCLASS_LOWERCASE: return MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Ll); case MVM_CCLASS_WORD: if (cp <= 'z') { /* short circuit common case */ if (cp >= 'a' || cp == '_' || (cp >= 'A' && cp <= 'Z') || (cp >= '0' && cp <= '9')) return 1; else return 0; } /* Deliberate fall-through; word is _ or digit or alphabetic. */ case MVM_CCLASS_ALPHANUMERIC: if (cp <= '9' && cp >= '0') /* short circuit common case */ return 1; if (MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Nd)) return 1; /* Deliberate fall-through; alphanumeric is digit or alphabetic. */ case MVM_CCLASS_ALPHABETIC: if (cp <= 'z') { /* short circuit common case */ if (cp >= 'a' || (cp >= 'A' && cp <= 'Z')) return 1; else return 0; } return MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Lo) /* lots of CJK chars */ || MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Ll) /* (ascii handled above) */ || MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Lu) || MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Lt) || MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Lm); case MVM_CCLASS_NUMERIC: if (cp <= '9' && cp >= '0') /* short circuit common case */ return 1; return MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Nd); case MVM_CCLASS_HEXADECIMAL: return MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_ASCII_HEX_DIGIT, 1); case MVM_CCLASS_WHITESPACE: if (cp <= '~') { if (cp == ' ' || (cp <= 13 && cp >= 9)) return 1; else return 0; } return MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_WHITE_SPACE, 1); case MVM_CCLASS_BLANK: if (cp == '\t') return 1; return MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Zs); case MVM_CCLASS_CONTROL: { return (cp >= 0 && cp < 32) || (cp >= 127 && cp < 160); } case MVM_CCLASS_PRINTING: { return !((cp >= 0 && cp < 32) || (cp >= 127 && cp < 160)); } case MVM_CCLASS_PUNCTUATION: return MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Pc) || MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Pd) || MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Ps) || MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Pe) || MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Pi) || MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Pf) || MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Po); case MVM_CCLASS_NEWLINE: { if (cp == '\n' || cp == 0x0b || cp == 0x0c || cp == '\r' || cp == 0x85 || cp == 0x2028 || cp == 0x2029) return 1; return MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY, UPV_Zl); } default: return 0; } } /* Checks if the character at the specified offset is a member of the * indicated character class. */ MVMint64 MVM_string_is_cclass(MVMThreadContext *tc, MVMint64 cclass, MVMString *s, MVMint64 offset) { MVMGrapheme32 g; MVM_string_check_arg(tc, s, "is_cclass"); if (offset < 0 || offset >= MVM_string_graphs_nocheck(tc, s)) return 0; g = MVM_string_get_grapheme_at_nocheck(tc, s, offset); return grapheme_is_cclass(tc, cclass, g); } /* Searches for the next char that is in the specified character class. */ MVMint64 MVM_string_find_cclass(MVMThreadContext *tc, MVMint64 cclass, MVMString *s, MVMint64 offset, MVMint64 count) { MVMGraphemeIter gi; MVMint64 length, end, pos; MVM_string_check_arg(tc, s, "find_cclass"); length = MVM_string_graphs_nocheck(tc, s); end = offset + count; end = length < end ? length : end; if (offset < 0 || offset >= length) return end; MVM_string_gi_init(tc, &gi, s); MVM_string_gi_move_to(tc, &gi, offset); for (pos = offset; pos < end; pos++) { MVMGrapheme32 g = MVM_string_gi_get_grapheme(tc, &gi); if (grapheme_is_cclass(tc, cclass, g) > 0) return pos; } return end; } /* Searches for the next char that is not in the specified character class. */ MVMint64 MVM_string_find_not_cclass(MVMThreadContext *tc, MVMint64 cclass, MVMString *s, MVMint64 offset, MVMint64 count) { MVMGraphemeIter gi; MVMint64 length, end, pos; MVM_string_check_arg(tc, s, "find_not_cclass"); length = MVM_string_graphs_nocheck(tc, s); end = offset + count; end = length < end ? length : end; if (offset < 0 || offset >= length) return end; MVM_string_gi_init(tc, &gi, s); MVM_string_gi_move_to(tc, &gi, offset); for (pos = offset; pos < end; pos++) { MVMGrapheme32 g = MVM_string_gi_get_grapheme(tc, &gi); if (grapheme_is_cclass(tc, cclass, g) == 0) return pos; } return end; } static MVMint16 encoding_name_init = 0; static MVMString *encoding_utf8_name = NULL; static MVMString *encoding_ascii_name = NULL; static MVMString *encoding_latin1_name = NULL; static MVMString *encoding_utf16_name = NULL; static MVMString *encoding_windows1252_name = NULL; static MVMString *encoding_windows1251_name = NULL; static MVMString *encoding_utf8_c8_name = NULL; MVMuint8 MVM_string_find_encoding(MVMThreadContext *tc, MVMString *name) { MVM_string_check_arg(tc, name, "find encoding"); if (!encoding_name_init) { MVM_gc_allocate_gen2_default_set(tc); encoding_utf8_name = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "utf8"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&encoding_utf8_name, "Encoding name"); encoding_ascii_name = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "ascii"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&encoding_ascii_name, "Encoding name"); encoding_latin1_name = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "iso-8859-1"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&encoding_latin1_name, "Encoding name"); encoding_utf16_name = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "utf16"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&encoding_utf16_name, "Encoding name"); encoding_windows1252_name = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "windows-1252"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&encoding_windows1252_name, "Encoding name"); encoding_windows1251_name = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "windows-1251"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&encoding_windows1251_name, "Encoding name"); encoding_utf8_c8_name = MVM_string_ascii_decode_nt(tc, tc->instance->VMString, "utf8-c8"); MVM_gc_root_add_permanent_desc(tc, (MVMCollectable **)&encoding_utf8_c8_name, "Encoding name"); encoding_name_init = 1; MVM_gc_allocate_gen2_default_clear(tc); } if (MVM_string_equal(tc, name, encoding_utf8_name)) { return MVM_encoding_type_utf8; } else if (MVM_string_equal(tc, name, encoding_ascii_name)) { return MVM_encoding_type_ascii; } else if (MVM_string_equal(tc, name, encoding_latin1_name)) { return MVM_encoding_type_latin1; } else if (MVM_string_equal(tc, name, encoding_windows1252_name)) { return MVM_encoding_type_windows1252; } else if (MVM_string_equal(tc, name, encoding_windows1251_name)) { return MVM_encoding_type_windows1251; } else if (MVM_string_equal(tc, name, encoding_utf16_name)) { return MVM_encoding_type_utf16; } else if (MVM_string_equal(tc, name, encoding_utf8_c8_name)) { return MVM_encoding_type_utf8_c8; } else { char *c_name = MVM_string_utf8_encode_C_string(tc, name); char *waste[] = { c_name, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Unknown string encoding: '%s'", c_name); } } /* Turns a codepoint into a string. If required uses the normalizer to ensure * that we get a valid NFG string (NFG is a superset of NFC, and singleton * decompositions exist). */ MVMString * MVM_string_chr(MVMThreadContext *tc, MVMint64 cp) { MVMString *s = NULL; MVMGrapheme32 g; if (cp < 0) MVM_exception_throw_adhoc(tc, "chr codepoint cannot be negative"); /* If the codepoint decomposes we may need to normalize it. * The first cp that decomposes is U+0340, but to be on the safe side * for now we go with the first significant character which at the time * of writing (Unicode 9.0) is COMBINING GRAVE ACCENT U+300 */ if (cp >= MVM_NORMALIZE_FIRST_SIG_NFC && MVM_unicode_codepoint_get_property_int(tc, cp, MVM_UNICODE_PROPERTY_DECOMPOSITION_TYPE) != MVM_UNICODE_PVALUE_DT_NONE) { MVMNormalizer norm; MVM_unicode_normalizer_init(tc, &norm, MVM_NORMALIZE_NFG); if (!MVM_unicode_normalizer_process_codepoint_to_grapheme(tc, &norm, cp, &g)) { MVM_unicode_normalizer_eof(tc, &norm); g = MVM_unicode_normalizer_get_grapheme(tc, &norm); } MVM_unicode_normalizer_cleanup(tc, &norm); } else { g = (MVMGrapheme32) cp; } s = (MVMString *)REPR(tc->instance->VMString)->allocate(tc, STABLE(tc->instance->VMString)); if (can_fit_into_8bit(g)) { s->body.storage_type = MVM_STRING_GRAPHEME_8; s->body.storage.blob_8 = MVM_malloc(sizeof(MVMGrapheme8)); s->body.storage.blob_8[0] = g; } else { s->body.storage_type = MVM_STRING_GRAPHEME_32; s->body.storage.blob_32 = MVM_malloc(sizeof(MVMGrapheme32)); s->body.storage.blob_32[0] = g; } s->body.num_graphs = 1; return s; } /* Takes a string and computes a hash code for it, storing it in the hash code * cache field of the string. Hashing code is derived from the Jenkins hash * implementation in uthash.h. */ typedef union { MVMint32 graphs[3]; unsigned char bytes[12]; } MVMJenHashGraphemeView; void MVM_string_compute_hash_code(MVMThreadContext *tc, MVMString *s) { /* The hash algorithm works in bytes. Since we can represent strings in a * number of ways, and we want consistent hashing, then we'll read the * strings using the grapheme iterator in groups of 3, using 32-bit ints * for the graphemes no matter what the string really holds them as. Then * we'll use the bytes view of that in the hashing function. */ MVMJenHashGraphemeView hash_block; MVMGraphemeIter gi; MVMuint32 graphs_remaining = MVM_string_graphs(tc, s); /* Initialize hash state. */ MVMuint32 hashv = 0xfeedbeef; MVMuint32 _hj_i, _hj_j; _hj_i = _hj_j = 0x9e3779b9; /* Work through the string 3 graphemes at a time. */ MVM_string_gi_init(tc, &gi, s); while (graphs_remaining >= 3) { hash_block.graphs[0] = MVM_string_gi_get_grapheme(tc, &gi); hash_block.graphs[1] = MVM_string_gi_get_grapheme(tc, &gi); hash_block.graphs[2] = MVM_string_gi_get_grapheme(tc, &gi); _hj_i += (hash_block.bytes[0] + ( (unsigned)hash_block.bytes[1] << 8 ) + ( (unsigned)hash_block.bytes[2] << 16 ) + ( (unsigned)hash_block.bytes[3] << 24 ) ); _hj_j += (hash_block.bytes[4] + ( (unsigned)hash_block.bytes[5] << 8 ) + ( (unsigned)hash_block.bytes[6] << 16 ) + ( (unsigned)hash_block.bytes[7] << 24 ) ); hashv += (hash_block.bytes[8] + ( (unsigned)hash_block.bytes[9] << 8 ) + ( (unsigned)hash_block.bytes[10] << 16 ) + ( (unsigned)hash_block.bytes[11] << 24 ) ); HASH_JEN_MIX(_hj_i, _hj_j, hashv); graphs_remaining -= 3; } /* Mix in key length (in bytes, not graphemes). */ hashv += MVM_string_graphs(tc, s) * sizeof(MVMGrapheme32); /* Now handle trailing graphemes (must be 2, 1, or 0). */ switch (graphs_remaining) { case 2: hash_block.graphs[1] = MVM_string_gi_get_grapheme(tc, &gi); _hj_j += ( (unsigned)hash_block.bytes[7] << 24 ) + ( (unsigned)hash_block.bytes[6] << 16 ) + ( (unsigned)hash_block.bytes[5] << 8 ) + hash_block.bytes[4]; /* Fallthrough */ case 1: hash_block.graphs[0] = MVM_string_gi_get_grapheme(tc, &gi); _hj_i += ( (unsigned)hash_block.bytes[3] << 24 ) + ( (unsigned)hash_block.bytes[2] << 16 ) + ( (unsigned)hash_block.bytes[1] << 8 ) + hash_block.bytes[0]; } HASH_JEN_MIX(_hj_i, _hj_j, hashv); /* Store computed hash value. */ s->body.cached_hash_code = hashv; } MoarVM-2018.03/src/strings/ops.h0000644000175000017510000002117113243117024016434 0ustar samanthasamantha/* Encoding types and encoding validity check. */ #define MVM_encoding_type_MIN 1 #define MVM_encoding_type_utf8 1 #define MVM_encoding_type_ascii 2 #define MVM_encoding_type_latin1 3 #define MVM_encoding_type_utf16 4 #define MVM_encoding_type_windows1252 5 #define MVM_encoding_type_utf8_c8 6 #define MVM_encoding_type_windows1251 7 #define MVM_encoding_type_MAX 7 #define ENCODING_VALID(enc) \ (((enc) >= MVM_encoding_type_MIN && (enc) <= MVM_encoding_type_MAX) \ || (MVM_exception_throw_adhoc(tc, "invalid encoding type flag: %d", (enc)),1)) /* Character class constants (map to nqp::const::CCLASS_* values). */ #define MVM_CCLASS_ANY 65535 #define MVM_CCLASS_UPPERCASE 1 #define MVM_CCLASS_LOWERCASE 2 #define MVM_CCLASS_ALPHABETIC 4 #define MVM_CCLASS_NUMERIC 8 #define MVM_CCLASS_HEXADECIMAL 16 #define MVM_CCLASS_WHITESPACE 32 #define MVM_CCLASS_PRINTING 64 #define MVM_CCLASS_BLANK 256 #define MVM_CCLASS_CONTROL 512 #define MVM_CCLASS_PUNCTUATION 1024 #define MVM_CCLASS_ALPHANUMERIC 2048 #define MVM_CCLASS_NEWLINE 4096 #define MVM_CCLASS_WORD 8192 /* Checks a string is not null or non-concrete and throws if so. */ MVM_STATIC_INLINE void MVM_string_check_arg(MVMThreadContext *tc, const MVMString *s, const char *operation) { if (!s || !IS_CONCRETE(s)) MVM_exception_throw_adhoc(tc, "%s requires a concrete string, but got %s", operation, s ? "a type object" : "null"); } MVM_STATIC_INLINE MVMuint32 MVM_string_graphs(MVMThreadContext *tc, MVMString *s) { MVM_string_check_arg(tc, s, "chars"); return s->body.num_graphs; } MVM_STATIC_INLINE MVMuint32 MVM_string_graphs_nocheck(MVMThreadContext *tc, MVMString *s) { return s->body.num_graphs; } MVM_STATIC_INLINE MVMuint32 MVM_string_codes(MVMThreadContext *tc, MVMString *s) { MVMGraphemeIter gi; MVMint64 codes = 0; MVM_string_check_arg(tc, s, "codes"); if (MVM_string_graphs_nocheck(tc, s) == 0) return 0; MVM_string_gi_init(tc, &gi, s); while(MVM_string_gi_has_more(tc, &gi)) { MVMGrapheme32 g = MVM_string_gi_get_grapheme(tc, &gi); codes += g < 0 ? MVM_nfg_get_synthetic_info(tc, g)->num_codes : 1; } return codes; } MVMGrapheme32 MVM_string_get_grapheme_at_nocheck(MVMThreadContext *tc, MVMString *a, MVMint64 index); MVMint64 MVM_string_equal(MVMThreadContext *tc, MVMString *a, MVMString *b); MVMint64 MVM_string_index(MVMThreadContext *tc, MVMString *haystack, MVMString *needle, MVMint64 start); MVMint64 MVM_string_index_ignore_case(MVMThreadContext *tc, MVMString *haystack, MVMString *needle, MVMint64 start); MVMint64 MVM_string_index_ignore_mark(MVMThreadContext *tc, MVMString *Haystack, MVMString *needle, MVMint64 start); MVMint64 MVM_string_index_ignore_case_ignore_mark(MVMThreadContext *tc, MVMString *haystack, MVMString *needle, MVMint64 start); MVMint64 MVM_string_index_from_end(MVMThreadContext *tc, MVMString *haystack, MVMString *needle, MVMint64 start); MVMString * MVM_string_concatenate(MVMThreadContext *tc, MVMString *a, MVMString *b); MVMString * MVM_string_repeat(MVMThreadContext *tc, MVMString *a, MVMint64 count); MVMString * MVM_string_substring(MVMThreadContext *tc, MVMString *a, MVMint64 start, MVMint64 length); MVMString * MVM_string_replace(MVMThreadContext *tc, MVMString *a, MVMint64 start, MVMint64 length, MVMString *replacement); void MVM_string_say(MVMThreadContext *tc, MVMString *a); void MVM_string_print(MVMThreadContext *tc, MVMString *a); MVMint64 MVM_string_equal_at(MVMThreadContext *tc, MVMString *a, MVMString *b, MVMint64 offset); MVMint64 MVM_string_equal_at_ignore_case(MVMThreadContext *tc, MVMString *a, MVMString *b, MVMint64 offset); MVMint64 MVM_string_equal_at_ignore_mark(MVMThreadContext *tc, MVMString *Haystack, MVMString *needle, MVMint64 H_offset); MVMint64 MVM_string_equal_at_ignore_case_ignore_mark(MVMThreadContext *tc, MVMString *a, MVMString *b, MVMint64 offset); MVMGrapheme32 MVM_string_ord_basechar_at(MVMThreadContext *tc, MVMString *s, MVMint64 offset); MVMGrapheme32 MVM_string_ord_at(MVMThreadContext *tc, MVMString *s, MVMint64 offset); MVMint64 MVM_string_have_at(MVMThreadContext *tc, MVMString *a, MVMint64 starta, MVMint64 length, MVMString *b, MVMint64 startb); MVMint64 MVM_string_get_grapheme_at(MVMThreadContext *tc, MVMString *a, MVMint64 index); MVMint64 MVM_string_index_of_grapheme(MVMThreadContext *tc, MVMString *a, MVMGrapheme32 codepoint); MVMString * MVM_string_uc(MVMThreadContext *tc, MVMString *s); MVMString * MVM_string_lc(MVMThreadContext *tc, MVMString *s); MVMString * MVM_string_tc(MVMThreadContext *tc, MVMString *s); MVMString * MVM_string_fc(MVMThreadContext *tc, MVMString *s); MVMString * MVM_string_decode(MVMThreadContext *tc, const MVMObject *type_object, char *Cbuf, MVMint64 byte_length, MVMint64 encoding_flag); char * MVM_string_encode(MVMThreadContext *tc, MVMString *s, MVMint64 start, MVMint64 length, MVMuint64 *output_size, MVMint64 encoding_flag, MVMString *replacement, MVMint32 translate_newlines); MVMObject * MVM_string_encode_to_buf(MVMThreadContext *tc, MVMString *s, MVMString *enc_name, MVMObject *buf, MVMString *replacement); MVMObject * MVM_string_encode_to_buf_config(MVMThreadContext *tc, MVMString *s, MVMString *enc_name, MVMObject *buf, MVMString *replacement, MVMint64 bitmap); MVMString * MVM_string_decode_from_buf(MVMThreadContext *tc, MVMObject *buf, MVMString *enc_name); MVMString * MVM_string_decode_from_buf_config(MVMThreadContext *tc, MVMObject *buf, MVMString *enc_name, MVMString *replacement, MVMint64 bitmap); MVMObject * MVM_string_split(MVMThreadContext *tc, MVMString *separator, MVMString *input); MVMString * MVM_string_join(MVMThreadContext *tc, MVMString *separator, MVMObject *input); MVMint64 MVM_string_char_at_in_string(MVMThreadContext *tc, MVMString *a, MVMint64 offset, MVMString *b); MVMint64 MVM_string_offset_has_unicode_property_value(MVMThreadContext *tc, MVMString *s, MVMint64 offset, MVMint64 property_code, MVMint64 property_value_code); MVMint64 MVM_unicode_codepoint_has_property_value(MVMThreadContext *tc, MVMint64 grapheme, MVMint64 property_code, MVMint64 property_value_code); MVMString * MVM_unicode_codepoint_get_property_str(MVMThreadContext *tc, MVMint64 grapheme, MVMint64 property_code); const char * MVM_unicode_codepoint_get_property_cstr(MVMThreadContext *tc, MVMint64 grapheme, MVMint64 property_code); MVMint64 MVM_unicode_codepoint_get_property_int(MVMThreadContext *tc, MVMint64 grapheme, MVMint64 property_code); MVMint64 MVM_unicode_codepoint_get_property_bool(MVMThreadContext *tc, MVMint64 grapheme, MVMint64 property_code); MVMString * MVM_unicode_get_name(MVMThreadContext *tc, MVMint64 grapheme); MVMString * MVM_string_indexing_optimized(MVMThreadContext *tc, MVMString *s); MVMString * MVM_string_escape(MVMThreadContext *tc, MVMString *s); MVMString * MVM_string_flip(MVMThreadContext *tc, MVMString *s); MVMint64 MVM_string_compare(MVMThreadContext *tc, MVMString *a, MVMString *b); MVMString * MVM_string_bitand(MVMThreadContext *tc, MVMString *a, MVMString *b); MVMString * MVM_string_bitor(MVMThreadContext *tc, MVMString *a, MVMString *b); MVMString * MVM_string_bitxor(MVMThreadContext *tc, MVMString *a, MVMString *b); void MVM_string_cclass_init(MVMThreadContext *tc); MVMint64 MVM_string_is_cclass(MVMThreadContext *tc, MVMint64 cclass, MVMString *s, MVMint64 offset); MVMint64 MVM_string_find_cclass(MVMThreadContext *tc, MVMint64 cclass, MVMString *s, MVMint64 offset, MVMint64 count); MVMint64 MVM_string_find_not_cclass(MVMThreadContext *tc, MVMint64 cclass, MVMString *s, MVMint64 offset, MVMint64 count); MVMuint8 MVM_string_find_encoding(MVMThreadContext *tc, MVMString *name); MVMString * MVM_string_chr(MVMThreadContext *tc, MVMint64 cp); void MVM_string_compute_hash_code(MVMThreadContext *tc, MVMString *s); /* If MVM_DEBUG_NFG is 1, calls to NFG_CHECK will re_nfg the given string * and compare num_graphs before and after the normalization. * If it is different debug information will be printed out. #define MVM_DEBUG_NFG 1 */ /* MVM_DEBUG_NFG_STRICT does as above but does not only rely on num_graphs. It * always checks every grapheme manually. Slower. (requires MVM_DEBUG_NFG) #define MVM_DEBUG_NFG_STRICT 0 */ #if MVM_DEBUG_NFG void NFG_check (MVMThreadContext *tc, MVMString *orig, char *varname); void NFG_check_concat (MVMThreadContext *tc, MVMString *result, MVMString *a, MVMString *b, char *varname); #define NFG_CHECK(tc, s, varname) NFG_check(tc, s, varname); #define NFG_CHECK_CONCAT(tc, s, a, b, varname) NFG_check_concat(tc, s, a, b, varname); #else #define NFG_CHECK(tc, s, varname) #define NFG_CHECK_CONCAT(tc, s, a, b, varname) #endif MoarVM-2018.03/src/strings/parse_num.c0000644000175000017510000002344713237701241017632 0ustar samanthasamantha#include "moar.h" #include /* We put a ' ' into the current code point buffer when we reach the end of the string, * as it's something that can be harmlessly added to the end of a number */ #define END_OF_NUM ' ' static int is_whitespace(MVMThreadContext *tc, MVMCodepoint cp) { if (cp <= '~') { if (cp == ' ' || (cp <= 13 && cp >= 9)) return 1; else return 0; } return MVM_unicode_codepoint_has_property_value(tc, cp, MVM_UNICODE_PROPERTY_WHITE_SPACE, 1); } static int cp_value(MVMThreadContext *tc, MVMCodepoint cp) { if (cp >= '0' && cp <= '9') return cp - '0'; /* fast-path for ASCII 0..9 */ else if (cp >= 'a' && cp <= 'z') return cp - 'a' + 10; else if (cp >= 'A' && cp <= 'Z') return cp - 'A' + 10; else if (cp >= 0xFF21 && cp <= 0xFF3A) return cp - 0xFF21 + 10; /* uppercase fullwidth */ else if (cp >= 0xFF41 && cp <= 0xFF5A) return cp - 0xFF41 + 10; /* lowercase fullwidth */ else if (cp > 0 && MVM_unicode_codepoint_get_property_int(tc, cp, MVM_UNICODE_PROPERTY_NUMERIC_TYPE) == MVM_UNICODE_PVALUE_Numeric_Type_DECIMAL) { /* as of Unicode 9.0.0, characters with the 'de' Numeric Type (and are * thus also of General Category Nd, since 4.0.0) are contiguous * sequences of 10 chars whose Numeric Values ascend from 0 through 9. */ /* the string returned for NUMERIC_VALUE_NUMERATOR contains an integer * value. We can use numerator because they all are from 0-9 and have * denominator of 1 */ return fast_atoi(MVM_unicode_codepoint_get_property_cstr(tc, cp, MVM_UNICODE_PROPERTY_NUMERIC_VALUE_NUMERATOR)); } return -1; } int static get_cp(MVMThreadContext *tc, MVMCodepointIter *ci, MVMCodepoint *cp) { if (!MVM_string_ci_has_more(tc, ci)) { *cp = END_OF_NUM; // FIXME pick a safe value return 1; } else { *cp = MVM_string_ci_get_codepoint(tc, ci); return 0; } } static void parse_error(MVMThreadContext *tc, MVMString *s, const char* reason) { char* got = MVM_string_utf8_c8_encode_C_string(tc, s); char *waste[] = { got, NULL }; MVM_exception_throw_adhoc_free(tc, waste, "Can't convert '%s' to num: %s", got, reason); } static void skip_whitespace(MVMThreadContext *tc, MVMCodepointIter *ci, MVMCodepoint *cp) { while (is_whitespace(tc, *cp)) { if (get_cp(tc, ci, cp)) return; } } static int parse_sign(MVMThreadContext *tc, MVMCodepointIter *ci, MVMCodepoint *cp) { // Handle any leading +/-/− sign int has_minus = (*cp == '-' || *cp == 8722); // '-', '−' if (has_minus || *cp == '+') { // '-', '−', '+' get_cp(tc, ci, cp); } return (has_minus ? -1 : 1); } static double parse_decimal_integer(MVMThreadContext *tc, MVMCodepointIter *ci, MVMCodepoint *cp, MVMString* s) { int ends_with_underscore = 0; double value = 0; int digit; if (*cp == '_') parse_error(tc, s, "number can't be start with _"); while (*cp == '_' || (digit = cp_value(tc, *cp)) != -1) { ends_with_underscore = *cp == '_'; if (*cp != '_') { if (digit >= 10) parse_error(tc, s, "expecting comma seprated decimal numbers after :$radix[]"); value = value * 10 + digit; } get_cp(tc, ci, cp); } if (ends_with_underscore) parse_error(tc, s, "a number can't end in underscore"); return value; } static double parse_int_frac_exp(MVMThreadContext *tc, MVMCodepointIter *ci, MVMCodepoint *cp, MVMString* s, double radix, int leading_zero) { double integer = 0; double frac = 0; double base = 1; int digits = 0; int frac_digits = 0; int digit; int ends_with_underscore = 0; if (*cp == '_') parse_error(tc, s, "number can't start with _"); if (*cp != '.') { while (*cp == '_' || (digit = cp_value(tc, *cp)) != -1) { ends_with_underscore = *cp == '_'; if (*cp != '_') { if (digit >= radix) break; integer = integer * radix + digit; digits++; } get_cp(tc, ci, cp); } if (ends_with_underscore) parse_error(tc, s, "a number can't end in underscore"); } if (*cp == '.') { get_cp(tc, ci, cp); if (*cp == '_') parse_error(tc, s, "radix point can't be followed by _"); while (*cp == '_' || (digit = cp_value(tc, *cp)) != -1) { ends_with_underscore = *cp == '_'; if (*cp != '_') { if (digit >= radix) break; frac = frac * radix + digit; base = base * radix; frac_digits++; } get_cp(tc, ci, cp); } if (frac_digits == 0) { parse_error(tc, s, "radix point must be followed by one or more valid digits"); } if (ends_with_underscore) parse_error(tc, s, "a number can't end in underscore"); } if (digits == 0 && frac_digits == 0 && !leading_zero) parse_error(tc, s, "expecting a number"); if (*cp == 'E' || *cp == 'e') { int e_digits = 0; double exponent = 0; double sign; get_cp(tc, ci, cp); sign = parse_sign(tc, ci, cp); if (*cp == '_') parse_error(tc, s, "'e' or 'E' can't be followed by _"); while (*cp == '_' || (digit = cp_value(tc, *cp)) != -1) { if (*cp != '_') { if (digit >= radix) break; exponent = exponent * radix + digit; e_digits++; } get_cp(tc, ci, cp); } if (e_digits == 0) { parse_error(tc, s, "'e' or 'E' must be followed by one or more valid digits"); } return (integer + frac/base) * pow(10, sign * exponent); } else { return integer + frac/base; } } static int match_word(MVMThreadContext *tc, MVMCodepointIter *ci, MVMCodepoint *cp, char word[3], MVMString *s) { if (*cp == word[0]) { get_cp(tc, ci, cp); if (*cp == word[1]) { get_cp(tc, ci, cp); if (*cp == word[2]) { get_cp(tc, ci, cp); return 1; } else { parse_error(tc, s, "that's not a number"); } } else { parse_error(tc, s, "that's not a number"); } } return 0; } static double parse_simple_number(MVMThreadContext *tc, MVMCodepointIter *ci, MVMCodepoint *cp, MVMString *s) { double sign; // Handle NaN here, to make later parsing simpler if (match_word(tc, ci, cp, "NaN", s)) { return MVM_num_nan(tc); } sign = parse_sign(tc, ci, cp); if (match_word(tc, ci, cp, "Inf", s)) { return sign * MVM_num_posinf(tc); } else if (*cp == ':') { int radix; double body; get_cp(tc, ci, cp); radix = (int) parse_int_frac_exp(tc, ci, cp, s, 10, 0); if (*cp == '<') { get_cp(tc, ci, cp); body = parse_int_frac_exp(tc, ci, cp, s, radix, 0); if (*cp == '>') { get_cp(tc, ci, cp); return sign * body; } else { parse_error(tc, s, "malformed ':radix<>' style radix number, expecting '>' after the body"); } } else if (*cp == 171) { // « get_cp(tc, ci, cp); body = parse_int_frac_exp(tc, ci, cp, s, radix, 0); if (*cp == 187) { // » get_cp(tc, ci, cp); return sign * body; } else { parse_error(tc, s, "malformed ':radix«»' style radix number, expecting '>' after the body"); } } else if (*cp == '[') { // « double result = 0; get_cp(tc, ci, cp); while (*cp != ']' && MVM_string_ci_has_more(tc, ci)) { double digit = parse_decimal_integer(tc, ci, cp, s); result = result * radix + digit; if (*cp == ',') { get_cp(tc, ci, cp); } } if (*cp == ']') { // » get_cp(tc, ci, cp); return sign * result; } else { parse_error(tc, s, "malformed ':radix[]' style radix number, expecting ']' after the body"); } } } else if (*cp == '0') { int radix = 0; get_cp(tc, ci, cp); if (*cp == 'b') radix = 2; else if (*cp == 'o') radix = 8; else if (*cp == 'd') radix = 10; else if (*cp == 'x') radix = 16; if (radix) { get_cp(tc, ci, cp); if (*cp == '_') get_cp(tc, ci, cp); return sign * parse_int_frac_exp(tc, ci, cp, s, radix, 1); } else { return sign * parse_int_frac_exp(tc, ci, cp, s, 10, 1); } } else { return sign * parse_int_frac_exp(tc, ci, cp, s, 10, 0); } } static double parse_real(MVMThreadContext *tc, MVMCodepointIter *ci, MVMCodepoint *cp, MVMString *s) { double result = parse_simple_number(tc, ci, cp, s); double denom; // Check for '/' indicating Rat denominator if (*cp == '/') { get_cp(tc, ci, cp); denom = parse_simple_number(tc, ci, cp, s); result = result / denom; } return result; } MVMnum64 MVM_coerce_s_n(MVMThreadContext *tc, MVMString *s) { MVMCodepointIter ci; MVMCodepoint cp; MVMnum64 n = 123; MVM_string_ci_init(tc, &ci, s, 0, 0); if (get_cp(tc, &ci, &cp)) return 0; skip_whitespace(tc, &ci, &cp); // Do we have only whitespace if (!MVM_string_ci_has_more(tc, &ci) && cp == END_OF_NUM) { return 0; } n = parse_real(tc, &ci, &cp, s); skip_whitespace(tc, &ci, &cp); if (MVM_string_ci_has_more(tc, &ci) || cp != END_OF_NUM) { parse_error(tc, s, "trailing characters"); } return n; } MoarVM-2018.03/src/strings/parse_num.h0000644000175000017510000000007513237701241017627 0ustar samanthasamanthaMVMnum64 MVM_coerce_s_n(MVMThreadContext *tc, MVMString *s); MoarVM-2018.03/src/strings/unicode.h0000644000175000017510000000241113237701240017257 0ustar samanthasamanthaMVMint32 MVM_unicode_lookup_by_name(MVMThreadContext *tc, MVMString *name); MVMint64 MVM_unicode_has_property_value(MVMThreadContext *tc, MVMGrapheme32 codepoint, MVMint64 property_code, MVMint64 property_value_code); MVMuint32 MVM_unicode_get_case_change(MVMThreadContext *tc, MVMCodepoint codepoint, MVMint32 case_, const MVMCodepoint **result); MVMint32 MVM_unicode_name_to_property_code(MVMThreadContext *tc, MVMString *name); MVMint32 MVM_unicode_name_to_property_value_code(MVMThreadContext *tc, MVMint64 property_code, MVMString *name); MVMint32 MVM_unicode_cname_to_property_value_code(MVMThreadContext *tc, MVMint64 property_code, const char *cname, size_t cname_length); MVMCodepoint MVM_unicode_find_primary_composite(MVMThreadContext *tc, MVMCodepoint l, MVMCodepoint c); #define MVM_unicode_case_change_type_upper 0 #define MVM_unicode_case_change_type_lower 1 #define MVM_unicode_case_change_type_title 2 #define MVM_unicode_case_change_type_fold 3 struct MVMUnicodeNameRegistry { char *name; MVMGrapheme32 codepoint; UT_hash_handle hash_handle; }; struct MVMUnicodeGraphemeNameRegistry { char *name; MVMint32 structindex; UT_hash_handle hash_handle; }; void MVM_unicode_init(MVMThreadContext *tc); void MVM_unicode_release(MVMThreadContext *tc); MoarVM-2018.03/src/strings/unicode_db.c0000644000175000017510003376170313242626641017754 0ustar samanthasamantha /* DO NOT MODIFY THIS FILE! YOU WILL LOSE YOUR CHANGES! This file is generated by ucd2c.pl from the Unicode database. From ReadMe.txt in the Unicode Database Sources this file was generated from: # Unicode Character Database # Date: 2017-06-18, 23:32:00 GMT [KW] # © 2017 Unicode®, Inc. # For terms of use, see http://www.unicode.org/terms_of_use.html # # For documentation, see the following: # NamesList.html # UAX #38, "Unicode Han Database (Unihan)" # UAX #44, "Unicode Character Database." # # The UAXes can be accessed at http://www.unicode.org/versions/Unicode10.0.0/ From http://unicode.org/copyright.html#Exhibit1 on 2017-11-28: COPYRIGHT AND PERMISSION NOTICE Copyright © 1991-2017 Unicode, Inc. All rights reserved. Distributed under the Terms of Use in http://www.unicode.org/copyright.html. Permission is hereby granted, free of charge, to any person obtaining a copy of the Unicode data files and any associated documentation (the "Data Files") or Unicode software and any associated documentation (the "Software") to deal in the Data Files or Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, and/or sell copies of the Data Files or Software, and to permit persons to whom the Data Files or Software are furnished to do so, provided that either (a) this copyright and permission notice appear with all copies of the Data Files or Software, or (b) this copyright and permission notice appear in associated Documentation. THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA FILES OR SOFTWARE. Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in these Data Files or Software without prior written authorization of the copyright holder. */ #include "moar.h" /* Unicode Name Aliases */ static const MVMUnicodeNamedAlias uni_namealias_pairs[464] = { {"ACK",0x6,3},{"ACKNOWLEDGE",0x6,11},{"ALERT",0x7,5},{"ALM",0x61C,3},{"APC",0x9F,3}, {"APPLICATION PROGRAM COMMAND",0x9F,27},{"BACKSPACE",0x8,9},{"BEL",0x7,3},{"BOM",0xFEFF,3}, {"BPH",0x82,3},{"BREAK PERMITTED HERE",0x82,20},{"BS",0x8,2},{"BYTE ORDER MARK",0xFEFF,15}, {"BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA VASIS",0x1D0C5,52},{"CAN",0x18,3}, {"CANCEL",0x18,6},{"CANCEL CHARACTER",0x94,16},{"CARRIAGE RETURN",0xD,15},{"CCH",0x94,3}, {"CGJ",0x34F,3},{"CHARACTER TABULATION",0x9,20},{"CHARACTER TABULATION SET",0x88,24}, {"CHARACTER TABULATION WITH JUSTIFICATION",0x89,39},{"CONTROL SEQUENCE INTRODUCER",0x9B,27}, {"CR",0xD,2},{"CSI",0x9B,3},{"CUNEIFORM SIGN NU11 OVER NU11 BUR OVER BUR",0x122D5,42}, {"CUNEIFORM SIGN NU11 TENU",0x122D4,24},{"DATA LINK ESCAPE",0x10,16},{"DC1",0x11,3}, {"DC2",0x12,3},{"DC3",0x13,3},{"DC4",0x14,3},{"DCS",0x90,3},{"DEL",0x7F,3},{"DELETE",0x7F,6}, {"DEVICE CONTROL FOUR",0x14,19},{"DEVICE CONTROL ONE",0x11,18},{"DEVICE CONTROL STRING",0x90,21}, {"DEVICE CONTROL THREE",0x13,20},{"DEVICE CONTROL TWO",0x12,18},{"DLE",0x10,3},{"END OF GUARDED AREA",0x97,19}, {"END OF LINE",0xA,11},{"END OF MEDIUM",0x19,13},{"END OF PROTECTED AREA",0x97,21}, {"END OF SELECTED AREA",0x87,20},{"END OF TEXT",0x3,11},{"END OF TRANSMISSION",0x4,19}, {"END OF TRANSMISSION BLOCK",0x17,25},{"ENQ",0x5,3},{"ENQUIRY",0x5,7},{"EOL",0xA,3}, {"EOM",0x19,3},{"EOT",0x4,3},{"EPA",0x97,3},{"ESA",0x87,3},{"ESC",0x1B,3},{"ESCAPE",0x1B,6}, {"ETB",0x17,3},{"ETX",0x3,3},{"FF",0xC,2},{"FILE SEPARATOR",0x1C,14},{"FORM FEED",0xC,9}, {"FS",0x1C,2},{"FSI",0x2068,3},{"FVS1",0x180B,4},{"FVS2",0x180C,4},{"FVS3",0x180D,4}, {"GROUP SEPARATOR",0x1D,15},{"GS",0x1D,2},{"HANGUL JONGSEONG SSANGYESIEUNG",0x11EE,30}, {"HANGUL JONGSEONG YESIEUNG-KHIEUKH",0x11EF,33},{"HANGUL JONGSEONG YESIEUNG-KIYEOK",0x11EC,32}, {"HANGUL JONGSEONG YESIEUNG-SSANGKIYEOK",0x11ED,37},{"HENTAIGANA LETTER E-1",0x1B001,21}, {"HIGH OCTET PRESET",0x81,17},{"HOP",0x81,3},{"HORIZONTAL TABULATION",0x9,21},{"HORIZONTAL TABULATION SET",0x88,25}, {"HORIZONTAL TABULATION WITH JUSTIFICATION",0x89,40},{"HT",0x9,2},{"HTJ",0x89,3}, {"HTS",0x88,3},{"IND",0x84,3},{"INDEX",0x84,5},{"INFORMATION SEPARATOR FOUR",0x1C,26}, {"INFORMATION SEPARATOR ONE",0x1F,25},{"INFORMATION SEPARATOR THREE",0x1D,27},{"INFORMATION SEPARATOR TWO",0x1E,25}, {"KANNADA LETTER LLLA",0xCDE,19},{"LAO LETTER FO FAY",0xE9F,17},{"LAO LETTER FO FON",0xE9D,17}, {"LAO LETTER LO",0xEA5,13},{"LAO LETTER RO",0xEA3,13},{"LATIN CAPITAL LETTER GHA",0x1A2,24}, {"LATIN SMALL LETTER GHA",0x1A3,22},{"LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE VERTICAL STROKE",0x2B7A,59}, {"LF",0xA,2},{"LINE FEED",0xA,9},{"LINE TABULATION",0xB,15},{"LINE TABULATION SET",0x8A,19}, {"LOCKING-SHIFT ONE",0xE,17},{"LOCKING-SHIFT ZERO",0xF,18},{"LRE",0x202A,3},{"LRI",0x2066,3}, {"LRM",0x200E,3},{"LRO",0x202D,3},{"MESSAGE WAITING",0x95,15},{"MICR DASH SYMBOL",0x2449,16}, {"MICR ON US SYMBOL",0x2448,17},{"MMSP",0x205F,4},{"MVS",0x180E,3},{"MW",0x95,2}, {"NAK",0x15,3},{"NBH",0x83,3},{"NBSP",0xA0,4},{"NEGATIVE ACKNOWLEDGE",0x15,20},{"NEL",0x85,3}, {"NEW LINE",0xA,8},{"NEXT LINE",0x85,9},{"NL",0xA,2},{"NNBSP",0x202F,5},{"NO BREAK HERE",0x83,13}, {"NUL",0x0,3},{"NULL",0x0,4},{"OPERATING SYSTEM COMMAND",0x9D,24},{"OSC",0x9D,3}, {"PAD",0x80,3},{"PADDING CHARACTER",0x80,17},{"PARTIAL LINE BACKWARD",0x8C,21},{"PARTIAL LINE DOWN",0x8B,17}, {"PARTIAL LINE FORWARD",0x8B,20},{"PARTIAL LINE UP",0x8C,15},{"PDF",0x202C,3},{"PDI",0x2069,3}, {"PLD",0x8B,3},{"PLU",0x8C,3},{"PM",0x9E,2},{"PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRACKET",0xFE18,61}, {"PRIVACY MESSAGE",0x9E,15},{"PRIVATE USE ONE",0x91,15},{"PRIVATE USE TWO",0x92,15}, {"PRIVATE USE-1",0x91,13},{"PRIVATE USE-2",0x92,13},{"PU1",0x91,3},{"PU2",0x92,3}, {"RECORD SEPARATOR",0x1E,16},{"REVERSE INDEX",0x8D,13},{"REVERSE LINE FEED",0x8D,17}, {"RI",0x8D,2},{"RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE VERTICAL STROKE",0x2B7C,60}, {"RLE",0x202B,3},{"RLI",0x2067,3},{"RLM",0x200F,3},{"RLO",0x202E,3},{"RS",0x1E,2}, {"SCI",0x9A,3},{"SET TRANSMIT STATE",0x93,18},{"SGC",0x99,3},{"SHIFT IN",0xF,8},{"SHIFT OUT",0xE,9}, {"SHY",0xAD,3},{"SI",0xF,2},{"SINGLE CHARACTER INTRODUCER",0x9A,27},{"SINGLE GRAPHIC CHARACTER INTRODUCER",0x99,35}, {"SINGLE SHIFT THREE",0x8F,18},{"SINGLE SHIFT TWO",0x8E,16},{"SINGLE-SHIFT-2",0x8E,14}, {"SINGLE-SHIFT-3",0x8F,14},{"SO",0xE,2},{"SOH",0x1,3},{"SOS",0x98,3},{"SP",0x20,2}, {"SPA",0x96,3},{"SS2",0x8E,3},{"SS3",0x8F,3},{"SSA",0x86,3},{"ST",0x9C,2},{"START OF GUARDED AREA",0x96,21}, {"START OF HEADING",0x1,16},{"START OF PROTECTED AREA",0x96,23},{"START OF SELECTED AREA",0x86,22}, {"START OF STRING",0x98,15},{"START OF TEXT",0x2,13},{"STRING TERMINATOR",0x9C,17}, {"STS",0x93,3},{"STX",0x2,3},{"SUB",0x1A,3},{"SUBSTITUTE",0x1A,10},{"SYN",0x16,3}, {"SYNCHRONOUS IDLE",0x16,16},{"SYRIAC SUBLINEAR COLON SKEWED LEFT",0x709,34},{"TAB",0x9,3}, {"TIBETAN MARK BKA- SHOG GI MGO RGYAN",0xFD0,35},{"UNIT SEPARATOR",0x1F,14},{"US",0x1F,2}, {"VERTICAL TABULATION",0xB,19},{"VERTICAL TABULATION SET",0x8A,23},{"VS1",0xFE00,3}, {"VS10",0xFE09,4},{"VS100",0xE0153,5},{"VS101",0xE0154,5},{"VS102",0xE0155,5},{"VS103",0xE0156,5}, {"VS104",0xE0157,5},{"VS105",0xE0158,5},{"VS106",0xE0159,5},{"VS107",0xE015A,5},{"VS108",0xE015B,5}, {"VS109",0xE015C,5},{"VS11",0xFE0A,4},{"VS110",0xE015D,5},{"VS111",0xE015E,5},{"VS112",0xE015F,5}, {"VS113",0xE0160,5},{"VS114",0xE0161,5},{"VS115",0xE0162,5},{"VS116",0xE0163,5},{"VS117",0xE0164,5}, {"VS118",0xE0165,5},{"VS119",0xE0166,5},{"VS12",0xFE0B,4},{"VS120",0xE0167,5},{"VS121",0xE0168,5}, {"VS122",0xE0169,5},{"VS123",0xE016A,5},{"VS124",0xE016B,5},{"VS125",0xE016C,5},{"VS126",0xE016D,5}, {"VS127",0xE016E,5},{"VS128",0xE016F,5},{"VS129",0xE0170,5},{"VS13",0xFE0C,4},{"VS130",0xE0171,5}, {"VS131",0xE0172,5},{"VS132",0xE0173,5},{"VS133",0xE0174,5},{"VS134",0xE0175,5},{"VS135",0xE0176,5}, {"VS136",0xE0177,5},{"VS137",0xE0178,5},{"VS138",0xE0179,5},{"VS139",0xE017A,5},{"VS14",0xFE0D,4}, {"VS140",0xE017B,5},{"VS141",0xE017C,5},{"VS142",0xE017D,5},{"VS143",0xE017E,5},{"VS144",0xE017F,5}, {"VS145",0xE0180,5},{"VS146",0xE0181,5},{"VS147",0xE0182,5},{"VS148",0xE0183,5},{"VS149",0xE0184,5}, {"VS15",0xFE0E,4},{"VS150",0xE0185,5},{"VS151",0xE0186,5},{"VS152",0xE0187,5},{"VS153",0xE0188,5}, {"VS154",0xE0189,5},{"VS155",0xE018A,5},{"VS156",0xE018B,5},{"VS157",0xE018C,5},{"VS158",0xE018D,5}, {"VS159",0xE018E,5},{"VS16",0xFE0F,4},{"VS160",0xE018F,5},{"VS161",0xE0190,5},{"VS162",0xE0191,5}, {"VS163",0xE0192,5},{"VS164",0xE0193,5},{"VS165",0xE0194,5},{"VS166",0xE0195,5},{"VS167",0xE0196,5}, {"VS168",0xE0197,5},{"VS169",0xE0198,5},{"VS17",0xE0100,4},{"VS170",0xE0199,5},{"VS171",0xE019A,5}, {"VS172",0xE019B,5},{"VS173",0xE019C,5},{"VS174",0xE019D,5},{"VS175",0xE019E,5},{"VS176",0xE019F,5}, {"VS177",0xE01A0,5},{"VS178",0xE01A1,5},{"VS179",0xE01A2,5},{"VS18",0xE0101,4},{"VS180",0xE01A3,5}, {"VS181",0xE01A4,5},{"VS182",0xE01A5,5},{"VS183",0xE01A6,5},{"VS184",0xE01A7,5},{"VS185",0xE01A8,5}, {"VS186",0xE01A9,5},{"VS187",0xE01AA,5},{"VS188",0xE01AB,5},{"VS189",0xE01AC,5},{"VS19",0xE0102,4}, {"VS190",0xE01AD,5},{"VS191",0xE01AE,5},{"VS192",0xE01AF,5},{"VS193",0xE01B0,5},{"VS194",0xE01B1,5}, {"VS195",0xE01B2,5},{"VS196",0xE01B3,5},{"VS197",0xE01B4,5},{"VS198",0xE01B5,5},{"VS199",0xE01B6,5}, {"VS2",0xFE01,3},{"VS20",0xE0103,4},{"VS200",0xE01B7,5},{"VS201",0xE01B8,5},{"VS202",0xE01B9,5}, {"VS203",0xE01BA,5},{"VS204",0xE01BB,5},{"VS205",0xE01BC,5},{"VS206",0xE01BD,5},{"VS207",0xE01BE,5}, {"VS208",0xE01BF,5},{"VS209",0xE01C0,5},{"VS21",0xE0104,4},{"VS210",0xE01C1,5},{"VS211",0xE01C2,5}, {"VS212",0xE01C3,5},{"VS213",0xE01C4,5},{"VS214",0xE01C5,5},{"VS215",0xE01C6,5},{"VS216",0xE01C7,5}, {"VS217",0xE01C8,5},{"VS218",0xE01C9,5},{"VS219",0xE01CA,5},{"VS22",0xE0105,4},{"VS220",0xE01CB,5}, {"VS221",0xE01CC,5},{"VS222",0xE01CD,5},{"VS223",0xE01CE,5},{"VS224",0xE01CF,5},{"VS225",0xE01D0,5}, {"VS226",0xE01D1,5},{"VS227",0xE01D2,5},{"VS228",0xE01D3,5},{"VS229",0xE01D4,5},{"VS23",0xE0106,4}, {"VS230",0xE01D5,5},{"VS231",0xE01D6,5},{"VS232",0xE01D7,5},{"VS233",0xE01D8,5},{"VS234",0xE01D9,5}, {"VS235",0xE01DA,5},{"VS236",0xE01DB,5},{"VS237",0xE01DC,5},{"VS238",0xE01DD,5},{"VS239",0xE01DE,5}, {"VS24",0xE0107,4},{"VS240",0xE01DF,5},{"VS241",0xE01E0,5},{"VS242",0xE01E1,5},{"VS243",0xE01E2,5}, {"VS244",0xE01E3,5},{"VS245",0xE01E4,5},{"VS246",0xE01E5,5},{"VS247",0xE01E6,5},{"VS248",0xE01E7,5}, {"VS249",0xE01E8,5},{"VS25",0xE0108,4},{"VS250",0xE01E9,5},{"VS251",0xE01EA,5},{"VS252",0xE01EB,5}, {"VS253",0xE01EC,5},{"VS254",0xE01ED,5},{"VS255",0xE01EE,5},{"VS256",0xE01EF,5},{"VS26",0xE0109,4}, {"VS27",0xE010A,4},{"VS28",0xE010B,4},{"VS29",0xE010C,4},{"VS3",0xFE02,3},{"VS30",0xE010D,4}, {"VS31",0xE010E,4},{"VS32",0xE010F,4},{"VS33",0xE0110,4},{"VS34",0xE0111,4},{"VS35",0xE0112,4}, {"VS36",0xE0113,4},{"VS37",0xE0114,4},{"VS38",0xE0115,4},{"VS39",0xE0116,4},{"VS4",0xFE03,3}, {"VS40",0xE0117,4},{"VS41",0xE0118,4},{"VS42",0xE0119,4},{"VS43",0xE011A,4},{"VS44",0xE011B,4}, {"VS45",0xE011C,4},{"VS46",0xE011D,4},{"VS47",0xE011E,4},{"VS48",0xE011F,4},{"VS49",0xE0120,4}, {"VS5",0xFE04,3},{"VS50",0xE0121,4},{"VS51",0xE0122,4},{"VS52",0xE0123,4},{"VS53",0xE0124,4}, {"VS54",0xE0125,4},{"VS55",0xE0126,4},{"VS56",0xE0127,4},{"VS57",0xE0128,4},{"VS58",0xE0129,4}, {"VS59",0xE012A,4},{"VS6",0xFE05,3},{"VS60",0xE012B,4},{"VS61",0xE012C,4},{"VS62",0xE012D,4}, {"VS63",0xE012E,4},{"VS64",0xE012F,4},{"VS65",0xE0130,4},{"VS66",0xE0131,4},{"VS67",0xE0132,4}, {"VS68",0xE0133,4},{"VS69",0xE0134,4},{"VS7",0xFE06,3},{"VS70",0xE0135,4},{"VS71",0xE0136,4}, {"VS72",0xE0137,4},{"VS73",0xE0138,4},{"VS74",0xE0139,4},{"VS75",0xE013A,4},{"VS76",0xE013B,4}, {"VS77",0xE013C,4},{"VS78",0xE013D,4},{"VS79",0xE013E,4},{"VS8",0xFE07,3},{"VS80",0xE013F,4}, {"VS81",0xE0140,4},{"VS82",0xE0141,4},{"VS83",0xE0142,4},{"VS84",0xE0143,4},{"VS85",0xE0144,4}, {"VS86",0xE0145,4},{"VS87",0xE0146,4},{"VS88",0xE0147,4},{"VS89",0xE0148,4},{"VS9",0xFE08,3}, {"VS90",0xE0149,4},{"VS91",0xE014A,4},{"VS92",0xE014B,4},{"VS93",0xE014C,4},{"VS94",0xE014D,4}, {"VS95",0xE014E,4},{"VS96",0xE014F,4},{"VS97",0xE0150,4},{"VS98",0xE0151,4},{"VS99",0xE0152,4}, {"VT",0xB,2},{"VTS",0x8A,3},{"WEIERSTRASS ELLIPTIC FUNCTION",0x2118,29},{"WJ",0x2060,2}, {"YI SYLLABLE ITERATION MARK",0xA015,26},{"ZWJ",0x200D,3},{"ZWNBSP",0xFEFF,6},{"ZWNJ",0x200C,4}, {"ZWSP",0x200B,4} }; static const MVMint32 CaseFolding_grows_table[105][3] = { {0x0,0x0,0x0}, {0x0073,0x0073,0x0},{0x0069,0x0307,0x0},{0x02BC,0x006E,0x0},{0x006A,0x030C,0x0},{0x03B9,0x0308,0x0301}, {0x03C5,0x0308,0x0301},{0x0565,0x0582,0x0},{0x0068,0x0331,0x0},{0x0074,0x0308,0x0},{0x0077,0x030A,0x0}, {0x0079,0x030A,0x0},{0x0061,0x02BE,0x0},{0x0073,0x0073,0x0},{0x03C5,0x0313,0x0},{0x03C5,0x0313,0x0300}, {0x03C5,0x0313,0x0301},{0x03C5,0x0313,0x0342},{0x1F00,0x03B9,0x0},{0x1F01,0x03B9,0x0},{0x1F02,0x03B9,0x0}, {0x1F03,0x03B9,0x0},{0x1F04,0x03B9,0x0},{0x1F05,0x03B9,0x0},{0x1F06,0x03B9,0x0},{0x1F07,0x03B9,0x0},{0x1F00,0x03B9,0x0}, {0x1F01,0x03B9,0x0},{0x1F02,0x03B9,0x0},{0x1F03,0x03B9,0x0},{0x1F04,0x03B9,0x0},{0x1F05,0x03B9,0x0},{0x1F06,0x03B9,0x0}, {0x1F07,0x03B9,0x0},{0x1F20,0x03B9,0x0},{0x1F21,0x03B9,0x0},{0x1F22,0x03B9,0x0},{0x1F23,0x03B9,0x0},{0x1F24,0x03B9,0x0}, {0x1F25,0x03B9,0x0},{0x1F26,0x03B9,0x0},{0x1F27,0x03B9,0x0},{0x1F20,0x03B9,0x0},{0x1F21,0x03B9,0x0},{0x1F22,0x03B9,0x0}, {0x1F23,0x03B9,0x0},{0x1F24,0x03B9,0x0},{0x1F25,0x03B9,0x0},{0x1F26,0x03B9,0x0},{0x1F27,0x03B9,0x0},{0x1F60,0x03B9,0x0}, {0x1F61,0x03B9,0x0},{0x1F62,0x03B9,0x0},{0x1F63,0x03B9,0x0},{0x1F64,0x03B9,0x0},{0x1F65,0x03B9,0x0},{0x1F66,0x03B9,0x0}, {0x1F67,0x03B9,0x0},{0x1F60,0x03B9,0x0},{0x1F61,0x03B9,0x0},{0x1F62,0x03B9,0x0},{0x1F63,0x03B9,0x0},{0x1F64,0x03B9,0x0}, {0x1F65,0x03B9,0x0},{0x1F66,0x03B9,0x0},{0x1F67,0x03B9,0x0},{0x1F70,0x03B9,0x0},{0x03B1,0x03B9,0x0},{0x03AC,0x03B9,0x0}, {0x03B1,0x0342,0x0},{0x03B1,0x0342,0x03B9},{0x03B1,0x03B9,0x0},{0x1F74,0x03B9,0x0},{0x03B7,0x03B9,0x0}, {0x03AE,0x03B9,0x0},{0x03B7,0x0342,0x0},{0x03B7,0x0342,0x03B9},{0x03B7,0x03B9,0x0},{0x03B9,0x0308,0x0300}, {0x03B9,0x0308,0x0301},{0x03B9,0x0342,0x0},{0x03B9,0x0308,0x0342},{0x03C5,0x0308,0x0300},{0x03C5,0x0308,0x0301}, {0x03C1,0x0313,0x0},{0x03C5,0x0342,0x0},{0x03C5,0x0308,0x0342},{0x1F7C,0x03B9,0x0},{0x03C9,0x03B9,0x0}, {0x03CE,0x03B9,0x0},{0x03C9,0x0342,0x0},{0x03C9,0x0342,0x03B9},{0x03C9,0x03B9,0x0},{0x0066,0x0066,0x0}, {0x0066,0x0069,0x0},{0x0066,0x006C,0x0},{0x0066,0x0066,0x0069},{0x0066,0x0066,0x006C},{0x0073,0x0074,0x0}, {0x0073,0x0074,0x0},{0x0574,0x0576,0x0},{0x0574,0x0565,0x0},{0x0574,0x056B,0x0},{0x057E,0x0576,0x0},{0x0574,0x056D,0x0} }; static const MVMint32 CaseFolding_simple_table[1298] = { 0x0, 0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,0x0070,0x0071, 0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,0x0078,0x0079,0x007A,0x03BC,0x00E0,0x00E1,0x00E2,0x00E3,0x00E4,0x00E5,0x00E6, 0x00E7,0x00E8,0x00E9,0x00EA,0x00EB,0x00EC,0x00ED,0x00EE,0x00EF,0x00F0,0x00F1,0x00F2,0x00F3,0x00F4,0x00F5,0x00F6,0x00F8, 0x00F9,0x00FA,0x00FB,0x00FC,0x00FD,0x00FE,0x0101,0x0103,0x0105,0x0107,0x0109,0x010B,0x010D,0x010F,0x0111,0x0113,0x0115, 0x0117,0x0119,0x011B,0x011D,0x011F,0x0121,0x0123,0x0125,0x0127,0x0129,0x012B,0x012D,0x012F,0x0133,0x0135,0x0137,0x013A, 0x013C,0x013E,0x0140,0x0142,0x0144,0x0146,0x0148,0x014B,0x014D,0x014F,0x0151,0x0153,0x0155,0x0157,0x0159,0x015B,0x015D, 0x015F,0x0161,0x0163,0x0165,0x0167,0x0169,0x016B,0x016D,0x016F,0x0171,0x0173,0x0175,0x0177,0x00FF,0x017A,0x017C,0x017E, 0x0073,0x0253,0x0183,0x0185,0x0254,0x0188,0x0256,0x0257,0x018C,0x01DD,0x0259,0x025B,0x0192,0x0260,0x0263,0x0269,0x0268, 0x0199,0x026F,0x0272,0x0275,0x01A1,0x01A3,0x01A5,0x0280,0x01A8,0x0283,0x01AD,0x0288,0x01B0,0x028A,0x028B,0x01B4,0x01B6, 0x0292,0x01B9,0x01BD,0x01C6,0x01C6,0x01C9,0x01C9,0x01CC,0x01CC,0x01CE,0x01D0,0x01D2,0x01D4,0x01D6,0x01D8,0x01DA,0x01DC, 0x01DF,0x01E1,0x01E3,0x01E5,0x01E7,0x01E9,0x01EB,0x01ED,0x01EF,0x01F3,0x01F3,0x01F5,0x0195,0x01BF,0x01F9,0x01FB,0x01FD, 0x01FF,0x0201,0x0203,0x0205,0x0207,0x0209,0x020B,0x020D,0x020F,0x0211,0x0213,0x0215,0x0217,0x0219,0x021B,0x021D,0x021F, 0x019E,0x0223,0x0225,0x0227,0x0229,0x022B,0x022D,0x022F,0x0231,0x0233,0x2C65,0x023C,0x019A,0x2C66,0x0242,0x0180,0x0289, 0x028C,0x0247,0x0249,0x024B,0x024D,0x024F,0x03B9,0x0371,0x0373,0x0377,0x03F3,0x03AC,0x03AD,0x03AE,0x03AF,0x03CC,0x03CD, 0x03CE,0x03B1,0x03B2,0x03B3,0x03B4,0x03B5,0x03B6,0x03B7,0x03B8,0x03B9,0x03BA,0x03BB,0x03BC,0x03BD,0x03BE,0x03BF,0x03C0, 0x03C1,0x03C3,0x03C4,0x03C5,0x03C6,0x03C7,0x03C8,0x03C9,0x03CA,0x03CB,0x03C3,0x03D7,0x03B2,0x03B8,0x03C6,0x03C0,0x03D9, 0x03DB,0x03DD,0x03DF,0x03E1,0x03E3,0x03E5,0x03E7,0x03E9,0x03EB,0x03ED,0x03EF,0x03BA,0x03C1,0x03B8,0x03B5,0x03F8,0x03F2, 0x03FB,0x037B,0x037C,0x037D,0x0450,0x0451,0x0452,0x0453,0x0454,0x0455,0x0456,0x0457,0x0458,0x0459,0x045A,0x045B,0x045C, 0x045D,0x045E,0x045F,0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0436,0x0437,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D, 0x043E,0x043F,0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446,0x0447,0x0448,0x0449,0x044A,0x044B,0x044C,0x044D,0x044E, 0x044F,0x0461,0x0463,0x0465,0x0467,0x0469,0x046B,0x046D,0x046F,0x0471,0x0473,0x0475,0x0477,0x0479,0x047B,0x047D,0x047F, 0x0481,0x048B,0x048D,0x048F,0x0491,0x0493,0x0495,0x0497,0x0499,0x049B,0x049D,0x049F,0x04A1,0x04A3,0x04A5,0x04A7,0x04A9, 0x04AB,0x04AD,0x04AF,0x04B1,0x04B3,0x04B5,0x04B7,0x04B9,0x04BB,0x04BD,0x04BF,0x04CF,0x04C2,0x04C4,0x04C6,0x04C8,0x04CA, 0x04CC,0x04CE,0x04D1,0x04D3,0x04D5,0x04D7,0x04D9,0x04DB,0x04DD,0x04DF,0x04E1,0x04E3,0x04E5,0x04E7,0x04E9,0x04EB,0x04ED, 0x04EF,0x04F1,0x04F3,0x04F5,0x04F7,0x04F9,0x04FB,0x04FD,0x04FF,0x0501,0x0503,0x0505,0x0507,0x0509,0x050B,0x050D,0x050F, 0x0511,0x0513,0x0515,0x0517,0x0519,0x051B,0x051D,0x051F,0x0521,0x0523,0x0525,0x0527,0x0529,0x052B,0x052D,0x052F,0x0561, 0x0562,0x0563,0x0564,0x0565,0x0566,0x0567,0x0568,0x0569,0x056A,0x056B,0x056C,0x056D,0x056E,0x056F,0x0570,0x0571,0x0572, 0x0573,0x0574,0x0575,0x0576,0x0577,0x0578,0x0579,0x057A,0x057B,0x057C,0x057D,0x057E,0x057F,0x0580,0x0581,0x0582,0x0583, 0x0584,0x0585,0x0586,0x2D00,0x2D01,0x2D02,0x2D03,0x2D04,0x2D05,0x2D06,0x2D07,0x2D08,0x2D09,0x2D0A,0x2D0B,0x2D0C,0x2D0D, 0x2D0E,0x2D0F,0x2D10,0x2D11,0x2D12,0x2D13,0x2D14,0x2D15,0x2D16,0x2D17,0x2D18,0x2D19,0x2D1A,0x2D1B,0x2D1C,0x2D1D,0x2D1E, 0x2D1F,0x2D20,0x2D21,0x2D22,0x2D23,0x2D24,0x2D25,0x2D27,0x2D2D,0x13F0,0x13F1,0x13F2,0x13F3,0x13F4,0x13F5,0x0432,0x0434, 0x043E,0x0441,0x0442,0x0442,0x044A,0x0463,0xA64B,0x1E01,0x1E03,0x1E05,0x1E07,0x1E09,0x1E0B,0x1E0D,0x1E0F,0x1E11,0x1E13, 0x1E15,0x1E17,0x1E19,0x1E1B,0x1E1D,0x1E1F,0x1E21,0x1E23,0x1E25,0x1E27,0x1E29,0x1E2B,0x1E2D,0x1E2F,0x1E31,0x1E33,0x1E35, 0x1E37,0x1E39,0x1E3B,0x1E3D,0x1E3F,0x1E41,0x1E43,0x1E45,0x1E47,0x1E49,0x1E4B,0x1E4D,0x1E4F,0x1E51,0x1E53,0x1E55,0x1E57, 0x1E59,0x1E5B,0x1E5D,0x1E5F,0x1E61,0x1E63,0x1E65,0x1E67,0x1E69,0x1E6B,0x1E6D,0x1E6F,0x1E71,0x1E73,0x1E75,0x1E77,0x1E79, 0x1E7B,0x1E7D,0x1E7F,0x1E81,0x1E83,0x1E85,0x1E87,0x1E89,0x1E8B,0x1E8D,0x1E8F,0x1E91,0x1E93,0x1E95,0x1E61,0x1EA1,0x1EA3, 0x1EA5,0x1EA7,0x1EA9,0x1EAB,0x1EAD,0x1EAF,0x1EB1,0x1EB3,0x1EB5,0x1EB7,0x1EB9,0x1EBB,0x1EBD,0x1EBF,0x1EC1,0x1EC3,0x1EC5, 0x1EC7,0x1EC9,0x1ECB,0x1ECD,0x1ECF,0x1ED1,0x1ED3,0x1ED5,0x1ED7,0x1ED9,0x1EDB,0x1EDD,0x1EDF,0x1EE1,0x1EE3,0x1EE5,0x1EE7, 0x1EE9,0x1EEB,0x1EED,0x1EEF,0x1EF1,0x1EF3,0x1EF5,0x1EF7,0x1EF9,0x1EFB,0x1EFD,0x1EFF,0x1F00,0x1F01,0x1F02,0x1F03,0x1F04, 0x1F05,0x1F06,0x1F07,0x1F10,0x1F11,0x1F12,0x1F13,0x1F14,0x1F15,0x1F20,0x1F21,0x1F22,0x1F23,0x1F24,0x1F25,0x1F26,0x1F27, 0x1F30,0x1F31,0x1F32,0x1F33,0x1F34,0x1F35,0x1F36,0x1F37,0x1F40,0x1F41,0x1F42,0x1F43,0x1F44,0x1F45,0x1F51,0x1F53,0x1F55, 0x1F57,0x1F60,0x1F61,0x1F62,0x1F63,0x1F64,0x1F65,0x1F66,0x1F67,0x1FB0,0x1FB1,0x1F70,0x1F71,0x03B9,0x1F72,0x1F73,0x1F74, 0x1F75,0x1FD0,0x1FD1,0x1F76,0x1F77,0x1FE0,0x1FE1,0x1F7A,0x1F7B,0x1FE5,0x1F78,0x1F79,0x1F7C,0x1F7D,0x03C9,0x006B,0x00E5, 0x214E,0x2170,0x2171,0x2172,0x2173,0x2174,0x2175,0x2176,0x2177,0x2178,0x2179,0x217A,0x217B,0x217C,0x217D,0x217E,0x217F, 0x2184,0x24D0,0x24D1,0x24D2,0x24D3,0x24D4,0x24D5,0x24D6,0x24D7,0x24D8,0x24D9,0x24DA,0x24DB,0x24DC,0x24DD,0x24DE,0x24DF, 0x24E0,0x24E1,0x24E2,0x24E3,0x24E4,0x24E5,0x24E6,0x24E7,0x24E8,0x24E9,0x2C30,0x2C31,0x2C32,0x2C33,0x2C34,0x2C35,0x2C36, 0x2C37,0x2C38,0x2C39,0x2C3A,0x2C3B,0x2C3C,0x2C3D,0x2C3E,0x2C3F,0x2C40,0x2C41,0x2C42,0x2C43,0x2C44,0x2C45,0x2C46,0x2C47, 0x2C48,0x2C49,0x2C4A,0x2C4B,0x2C4C,0x2C4D,0x2C4E,0x2C4F,0x2C50,0x2C51,0x2C52,0x2C53,0x2C54,0x2C55,0x2C56,0x2C57,0x2C58, 0x2C59,0x2C5A,0x2C5B,0x2C5C,0x2C5D,0x2C5E,0x2C61,0x026B,0x1D7D,0x027D,0x2C68,0x2C6A,0x2C6C,0x0251,0x0271,0x0250,0x0252, 0x2C73,0x2C76,0x023F,0x0240,0x2C81,0x2C83,0x2C85,0x2C87,0x2C89,0x2C8B,0x2C8D,0x2C8F,0x2C91,0x2C93,0x2C95,0x2C97,0x2C99, 0x2C9B,0x2C9D,0x2C9F,0x2CA1,0x2CA3,0x2CA5,0x2CA7,0x2CA9,0x2CAB,0x2CAD,0x2CAF,0x2CB1,0x2CB3,0x2CB5,0x2CB7,0x2CB9,0x2CBB, 0x2CBD,0x2CBF,0x2CC1,0x2CC3,0x2CC5,0x2CC7,0x2CC9,0x2CCB,0x2CCD,0x2CCF,0x2CD1,0x2CD3,0x2CD5,0x2CD7,0x2CD9,0x2CDB,0x2CDD, 0x2CDF,0x2CE1,0x2CE3,0x2CEC,0x2CEE,0x2CF3,0xA641,0xA643,0xA645,0xA647,0xA649,0xA64B,0xA64D,0xA64F,0xA651,0xA653,0xA655, 0xA657,0xA659,0xA65B,0xA65D,0xA65F,0xA661,0xA663,0xA665,0xA667,0xA669,0xA66B,0xA66D,0xA681,0xA683,0xA685,0xA687,0xA689, 0xA68B,0xA68D,0xA68F,0xA691,0xA693,0xA695,0xA697,0xA699,0xA69B,0xA723,0xA725,0xA727,0xA729,0xA72B,0xA72D,0xA72F,0xA733, 0xA735,0xA737,0xA739,0xA73B,0xA73D,0xA73F,0xA741,0xA743,0xA745,0xA747,0xA749,0xA74B,0xA74D,0xA74F,0xA751,0xA753,0xA755, 0xA757,0xA759,0xA75B,0xA75D,0xA75F,0xA761,0xA763,0xA765,0xA767,0xA769,0xA76B,0xA76D,0xA76F,0xA77A,0xA77C,0x1D79,0xA77F, 0xA781,0xA783,0xA785,0xA787,0xA78C,0x0265,0xA791,0xA793,0xA797,0xA799,0xA79B,0xA79D,0xA79F,0xA7A1,0xA7A3,0xA7A5,0xA7A7, 0xA7A9,0x0266,0x025C,0x0261,0x026C,0x026A,0x029E,0x0287,0x029D,0xAB53,0xA7B5,0xA7B7,0x13A0,0x13A1,0x13A2,0x13A3,0x13A4, 0x13A5,0x13A6,0x13A7,0x13A8,0x13A9,0x13AA,0x13AB,0x13AC,0x13AD,0x13AE,0x13AF,0x13B0,0x13B1,0x13B2,0x13B3,0x13B4,0x13B5, 0x13B6,0x13B7,0x13B8,0x13B9,0x13BA,0x13BB,0x13BC,0x13BD,0x13BE,0x13BF,0x13C0,0x13C1,0x13C2,0x13C3,0x13C4,0x13C5,0x13C6, 0x13C7,0x13C8,0x13C9,0x13CA,0x13CB,0x13CC,0x13CD,0x13CE,0x13CF,0x13D0,0x13D1,0x13D2,0x13D3,0x13D4,0x13D5,0x13D6,0x13D7, 0x13D8,0x13D9,0x13DA,0x13DB,0x13DC,0x13DD,0x13DE,0x13DF,0x13E0,0x13E1,0x13E2,0x13E3,0x13E4,0x13E5,0x13E6,0x13E7,0x13E8, 0x13E9,0x13EA,0x13EB,0x13EC,0x13ED,0x13EE,0x13EF,0xFF41,0xFF42,0xFF43,0xFF44,0xFF45,0xFF46,0xFF47,0xFF48,0xFF49,0xFF4A, 0xFF4B,0xFF4C,0xFF4D,0xFF4E,0xFF4F,0xFF50,0xFF51,0xFF52,0xFF53,0xFF54,0xFF55,0xFF56,0xFF57,0xFF58,0xFF59,0xFF5A,0x10428, 0x10429,0x1042A,0x1042B,0x1042C,0x1042D,0x1042E,0x1042F,0x10430,0x10431,0x10432,0x10433,0x10434,0x10435,0x10436,0x10437, 0x10438,0x10439,0x1043A,0x1043B,0x1043C,0x1043D,0x1043E,0x1043F,0x10440,0x10441,0x10442,0x10443,0x10444,0x10445,0x10446, 0x10447,0x10448,0x10449,0x1044A,0x1044B,0x1044C,0x1044D,0x1044E,0x1044F,0x104D8,0x104D9,0x104DA,0x104DB,0x104DC,0x104DD, 0x104DE,0x104DF,0x104E0,0x104E1,0x104E2,0x104E3,0x104E4,0x104E5,0x104E6,0x104E7,0x104E8,0x104E9,0x104EA,0x104EB,0x104EC, 0x104ED,0x104EE,0x104EF,0x104F0,0x104F1,0x104F2,0x104F3,0x104F4,0x104F5,0x104F6,0x104F7,0x104F8,0x104F9,0x104FA,0x104FB, 0x10CC0,0x10CC1,0x10CC2,0x10CC3,0x10CC4,0x10CC5,0x10CC6,0x10CC7,0x10CC8,0x10CC9,0x10CCA,0x10CCB,0x10CCC,0x10CCD,0x10CCE, 0x10CCF,0x10CD0,0x10CD1,0x10CD2,0x10CD3,0x10CD4,0x10CD5,0x10CD6,0x10CD7,0x10CD8,0x10CD9,0x10CDA,0x10CDB,0x10CDC,0x10CDD, 0x10CDE,0x10CDF,0x10CE0,0x10CE1,0x10CE2,0x10CE3,0x10CE4,0x10CE5,0x10CE6,0x10CE7,0x10CE8,0x10CE9,0x10CEA,0x10CEB,0x10CEC, 0x10CED,0x10CEE,0x10CEF,0x10CF0,0x10CF1,0x10CF2,0x118C0,0x118C1,0x118C2,0x118C3,0x118C4,0x118C5,0x118C6,0x118C7,0x118C8, 0x118C9,0x118CA,0x118CB,0x118CC,0x118CD,0x118CE,0x118CF,0x118D0,0x118D1,0x118D2,0x118D3,0x118D4,0x118D5,0x118D6,0x118D7, 0x118D8,0x118D9,0x118DA,0x118DB,0x118DC,0x118DD,0x118DE,0x118DF,0x1E922,0x1E923,0x1E924,0x1E925,0x1E926,0x1E927,0x1E928, 0x1E929,0x1E92A,0x1E92B,0x1E92C,0x1E92D,0x1E92E,0x1E92F,0x1E930,0x1E931,0x1E932,0x1E933,0x1E934,0x1E935,0x1E936,0x1E937, 0x1E938,0x1E939,0x1E93A,0x1E93B,0x1E93C,0x1E93D,0x1E93E,0x1E93F,0x1E940,0x1E941,0x1E942,0x1E943 }; static const MVMint32 SpecialCasing_table[104][3][3] = { {0x0,0x0,0x0}, { { 0x0053, 0x0053, 0x0 }, { 0x00DF, 0x0, 0x0 }, { 0x0053, 0x0073, 0x0 } }, { { 0x0130, 0x0, 0x0 }, { 0x0069, 0x0307, 0x0 }, { 0x0130, 0x0, 0x0 } }, { { 0x0046, 0x0046, 0x0 }, { 0xFB00, 0x0, 0x0 }, { 0x0046, 0x0066, 0x0 } }, { { 0x0046, 0x0049, 0x0 }, { 0xFB01, 0x0, 0x0 }, { 0x0046, 0x0069, 0x0 } }, { { 0x0046, 0x004C, 0x0 }, { 0xFB02, 0x0, 0x0 }, { 0x0046, 0x006C, 0x0 } }, { { 0x0046, 0x0046, 0x0049 }, { 0xFB03, 0x0, 0x0 }, { 0x0046, 0x0066, 0x0069 } }, { { 0x0046, 0x0046, 0x004C }, { 0xFB04, 0x0, 0x0 }, { 0x0046, 0x0066, 0x006C } }, { { 0x0053, 0x0054, 0x0 }, { 0xFB05, 0x0, 0x0 }, { 0x0053, 0x0074, 0x0 } }, { { 0x0053, 0x0054, 0x0 }, { 0xFB06, 0x0, 0x0 }, { 0x0053, 0x0074, 0x0 } }, { { 0x0535, 0x0552, 0x0 }, { 0x0587, 0x0, 0x0 }, { 0x0535, 0x0582, 0x0 } }, { { 0x0544, 0x0546, 0x0 }, { 0xFB13, 0x0, 0x0 }, { 0x0544, 0x0576, 0x0 } }, { { 0x0544, 0x0535, 0x0 }, { 0xFB14, 0x0, 0x0 }, { 0x0544, 0x0565, 0x0 } }, { { 0x0544, 0x053B, 0x0 }, { 0xFB15, 0x0, 0x0 }, { 0x0544, 0x056B, 0x0 } }, { { 0x054E, 0x0546, 0x0 }, { 0xFB16, 0x0, 0x0 }, { 0x054E, 0x0576, 0x0 } }, { { 0x0544, 0x053D, 0x0 }, { 0xFB17, 0x0, 0x0 }, { 0x0544, 0x056D, 0x0 } }, { { 0x02BC, 0x004E, 0x0 }, { 0x0149, 0x0, 0x0 }, { 0x02BC, 0x004E, 0x0 } }, { { 0x0399, 0x0308, 0x0301 }, { 0x0390, 0x0, 0x0 }, { 0x0399, 0x0308, 0x0301 } }, { { 0x03A5, 0x0308, 0x0301 }, { 0x03B0, 0x0, 0x0 }, { 0x03A5, 0x0308, 0x0301 } }, { { 0x004A, 0x030C, 0x0 }, { 0x01F0, 0x0, 0x0 }, { 0x004A, 0x030C, 0x0 } }, { { 0x0048, 0x0331, 0x0 }, { 0x1E96, 0x0, 0x0 }, { 0x0048, 0x0331, 0x0 } }, { { 0x0054, 0x0308, 0x0 }, { 0x1E97, 0x0, 0x0 }, { 0x0054, 0x0308, 0x0 } }, { { 0x0057, 0x030A, 0x0 }, { 0x1E98, 0x0, 0x0 }, { 0x0057, 0x030A, 0x0 } }, { { 0x0059, 0x030A, 0x0 }, { 0x1E99, 0x0, 0x0 }, { 0x0059, 0x030A, 0x0 } }, { { 0x0041, 0x02BE, 0x0 }, { 0x1E9A, 0x0, 0x0 }, { 0x0041, 0x02BE, 0x0 } }, { { 0x03A5, 0x0313, 0x0 }, { 0x1F50, 0x0, 0x0 }, { 0x03A5, 0x0313, 0x0 } }, { { 0x03A5, 0x0313, 0x0300 }, { 0x1F52, 0x0, 0x0 }, { 0x03A5, 0x0313, 0x0300 } }, { { 0x03A5, 0x0313, 0x0301 }, { 0x1F54, 0x0, 0x0 }, { 0x03A5, 0x0313, 0x0301 } }, { { 0x03A5, 0x0313, 0x0342 }, { 0x1F56, 0x0, 0x0 }, { 0x03A5, 0x0313, 0x0342 } }, { { 0x0391, 0x0342, 0x0 }, { 0x1FB6, 0x0, 0x0 }, { 0x0391, 0x0342, 0x0 } }, { { 0x0397, 0x0342, 0x0 }, { 0x1FC6, 0x0, 0x0 }, { 0x0397, 0x0342, 0x0 } }, { { 0x0399, 0x0308, 0x0300 }, { 0x1FD2, 0x0, 0x0 }, { 0x0399, 0x0308, 0x0300 } }, { { 0x0399, 0x0308, 0x0301 }, { 0x1FD3, 0x0, 0x0 }, { 0x0399, 0x0308, 0x0301 } }, { { 0x0399, 0x0342, 0x0 }, { 0x1FD6, 0x0, 0x0 }, { 0x0399, 0x0342, 0x0 } }, { { 0x0399, 0x0308, 0x0342 }, { 0x1FD7, 0x0, 0x0 }, { 0x0399, 0x0308, 0x0342 } }, { { 0x03A5, 0x0308, 0x0300 }, { 0x1FE2, 0x0, 0x0 }, { 0x03A5, 0x0308, 0x0300 } }, { { 0x03A5, 0x0308, 0x0301 }, { 0x1FE3, 0x0, 0x0 }, { 0x03A5, 0x0308, 0x0301 } }, { { 0x03A1, 0x0313, 0x0 }, { 0x1FE4, 0x0, 0x0 }, { 0x03A1, 0x0313, 0x0 } }, { { 0x03A5, 0x0342, 0x0 }, { 0x1FE6, 0x0, 0x0 }, { 0x03A5, 0x0342, 0x0 } }, { { 0x03A5, 0x0308, 0x0342 }, { 0x1FE7, 0x0, 0x0 }, { 0x03A5, 0x0308, 0x0342 } }, { { 0x03A9, 0x0342, 0x0 }, { 0x1FF6, 0x0, 0x0 }, { 0x03A9, 0x0342, 0x0 } }, { { 0x1F08, 0x0399, 0x0 }, { 0x1F80, 0x0, 0x0 }, { 0x1F88, 0x0, 0x0 } }, { { 0x1F09, 0x0399, 0x0 }, { 0x1F81, 0x0, 0x0 }, { 0x1F89, 0x0, 0x0 } }, { { 0x1F0A, 0x0399, 0x0 }, { 0x1F82, 0x0, 0x0 }, { 0x1F8A, 0x0, 0x0 } }, { { 0x1F0B, 0x0399, 0x0 }, { 0x1F83, 0x0, 0x0 }, { 0x1F8B, 0x0, 0x0 } }, { { 0x1F0C, 0x0399, 0x0 }, { 0x1F84, 0x0, 0x0 }, { 0x1F8C, 0x0, 0x0 } }, { { 0x1F0D, 0x0399, 0x0 }, { 0x1F85, 0x0, 0x0 }, { 0x1F8D, 0x0, 0x0 } }, { { 0x1F0E, 0x0399, 0x0 }, { 0x1F86, 0x0, 0x0 }, { 0x1F8E, 0x0, 0x0 } }, { { 0x1F0F, 0x0399, 0x0 }, { 0x1F87, 0x0, 0x0 }, { 0x1F8F, 0x0, 0x0 } }, { { 0x1F08, 0x0399, 0x0 }, { 0x1F80, 0x0, 0x0 }, { 0x1F88, 0x0, 0x0 } }, { { 0x1F09, 0x0399, 0x0 }, { 0x1F81, 0x0, 0x0 }, { 0x1F89, 0x0, 0x0 } }, { { 0x1F0A, 0x0399, 0x0 }, { 0x1F82, 0x0, 0x0 }, { 0x1F8A, 0x0, 0x0 } }, { { 0x1F0B, 0x0399, 0x0 }, { 0x1F83, 0x0, 0x0 }, { 0x1F8B, 0x0, 0x0 } }, { { 0x1F0C, 0x0399, 0x0 }, { 0x1F84, 0x0, 0x0 }, { 0x1F8C, 0x0, 0x0 } }, { { 0x1F0D, 0x0399, 0x0 }, { 0x1F85, 0x0, 0x0 }, { 0x1F8D, 0x0, 0x0 } }, { { 0x1F0E, 0x0399, 0x0 }, { 0x1F86, 0x0, 0x0 }, { 0x1F8E, 0x0, 0x0 } }, { { 0x1F0F, 0x0399, 0x0 }, { 0x1F87, 0x0, 0x0 }, { 0x1F8F, 0x0, 0x0 } }, { { 0x1F28, 0x0399, 0x0 }, { 0x1F90, 0x0, 0x0 }, { 0x1F98, 0x0, 0x0 } }, { { 0x1F29, 0x0399, 0x0 }, { 0x1F91, 0x0, 0x0 }, { 0x1F99, 0x0, 0x0 } }, { { 0x1F2A, 0x0399, 0x0 }, { 0x1F92, 0x0, 0x0 }, { 0x1F9A, 0x0, 0x0 } }, { { 0x1F2B, 0x0399, 0x0 }, { 0x1F93, 0x0, 0x0 }, { 0x1F9B, 0x0, 0x0 } }, { { 0x1F2C, 0x0399, 0x0 }, { 0x1F94, 0x0, 0x0 }, { 0x1F9C, 0x0, 0x0 } }, { { 0x1F2D, 0x0399, 0x0 }, { 0x1F95, 0x0, 0x0 }, { 0x1F9D, 0x0, 0x0 } }, { { 0x1F2E, 0x0399, 0x0 }, { 0x1F96, 0x0, 0x0 }, { 0x1F9E, 0x0, 0x0 } }, { { 0x1F2F, 0x0399, 0x0 }, { 0x1F97, 0x0, 0x0 }, { 0x1F9F, 0x0, 0x0 } }, { { 0x1F28, 0x0399, 0x0 }, { 0x1F90, 0x0, 0x0 }, { 0x1F98, 0x0, 0x0 } }, { { 0x1F29, 0x0399, 0x0 }, { 0x1F91, 0x0, 0x0 }, { 0x1F99, 0x0, 0x0 } }, { { 0x1F2A, 0x0399, 0x0 }, { 0x1F92, 0x0, 0x0 }, { 0x1F9A, 0x0, 0x0 } }, { { 0x1F2B, 0x0399, 0x0 }, { 0x1F93, 0x0, 0x0 }, { 0x1F9B, 0x0, 0x0 } }, { { 0x1F2C, 0x0399, 0x0 }, { 0x1F94, 0x0, 0x0 }, { 0x1F9C, 0x0, 0x0 } }, { { 0x1F2D, 0x0399, 0x0 }, { 0x1F95, 0x0, 0x0 }, { 0x1F9D, 0x0, 0x0 } }, { { 0x1F2E, 0x0399, 0x0 }, { 0x1F96, 0x0, 0x0 }, { 0x1F9E, 0x0, 0x0 } }, { { 0x1F2F, 0x0399, 0x0 }, { 0x1F97, 0x0, 0x0 }, { 0x1F9F, 0x0, 0x0 } }, { { 0x1F68, 0x0399, 0x0 }, { 0x1FA0, 0x0, 0x0 }, { 0x1FA8, 0x0, 0x0 } }, { { 0x1F69, 0x0399, 0x0 }, { 0x1FA1, 0x0, 0x0 }, { 0x1FA9, 0x0, 0x0 } }, { { 0x1F6A, 0x0399, 0x0 }, { 0x1FA2, 0x0, 0x0 }, { 0x1FAA, 0x0, 0x0 } }, { { 0x1F6B, 0x0399, 0x0 }, { 0x1FA3, 0x0, 0x0 }, { 0x1FAB, 0x0, 0x0 } }, { { 0x1F6C, 0x0399, 0x0 }, { 0x1FA4, 0x0, 0x0 }, { 0x1FAC, 0x0, 0x0 } }, { { 0x1F6D, 0x0399, 0x0 }, { 0x1FA5, 0x0, 0x0 }, { 0x1FAD, 0x0, 0x0 } }, { { 0x1F6E, 0x0399, 0x0 }, { 0x1FA6, 0x0, 0x0 }, { 0x1FAE, 0x0, 0x0 } }, { { 0x1F6F, 0x0399, 0x0 }, { 0x1FA7, 0x0, 0x0 }, { 0x1FAF, 0x0, 0x0 } }, { { 0x1F68, 0x0399, 0x0 }, { 0x1FA0, 0x0, 0x0 }, { 0x1FA8, 0x0, 0x0 } }, { { 0x1F69, 0x0399, 0x0 }, { 0x1FA1, 0x0, 0x0 }, { 0x1FA9, 0x0, 0x0 } }, { { 0x1F6A, 0x0399, 0x0 }, { 0x1FA2, 0x0, 0x0 }, { 0x1FAA, 0x0, 0x0 } }, { { 0x1F6B, 0x0399, 0x0 }, { 0x1FA3, 0x0, 0x0 }, { 0x1FAB, 0x0, 0x0 } }, { { 0x1F6C, 0x0399, 0x0 }, { 0x1FA4, 0x0, 0x0 }, { 0x1FAC, 0x0, 0x0 } }, { { 0x1F6D, 0x0399, 0x0 }, { 0x1FA5, 0x0, 0x0 }, { 0x1FAD, 0x0, 0x0 } }, { { 0x1F6E, 0x0399, 0x0 }, { 0x1FA6, 0x0, 0x0 }, { 0x1FAE, 0x0, 0x0 } }, { { 0x1F6F, 0x0399, 0x0 }, { 0x1FA7, 0x0, 0x0 }, { 0x1FAF, 0x0, 0x0 } }, { { 0x0391, 0x0399, 0x0 }, { 0x1FB3, 0x0, 0x0 }, { 0x1FBC, 0x0, 0x0 } }, { { 0x0391, 0x0399, 0x0 }, { 0x1FB3, 0x0, 0x0 }, { 0x1FBC, 0x0, 0x0 } }, { { 0x0397, 0x0399, 0x0 }, { 0x1FC3, 0x0, 0x0 }, { 0x1FCC, 0x0, 0x0 } }, { { 0x0397, 0x0399, 0x0 }, { 0x1FC3, 0x0, 0x0 }, { 0x1FCC, 0x0, 0x0 } }, { { 0x03A9, 0x0399, 0x0 }, { 0x1FF3, 0x0, 0x0 }, { 0x1FFC, 0x0, 0x0 } }, { { 0x03A9, 0x0399, 0x0 }, { 0x1FF3, 0x0, 0x0 }, { 0x1FFC, 0x0, 0x0 } }, { { 0x1FBA, 0x0399, 0x0 }, { 0x1FB2, 0x0, 0x0 }, { 0x1FBA, 0x0345, 0x0 } }, { { 0x0386, 0x0399, 0x0 }, { 0x1FB4, 0x0, 0x0 }, { 0x0386, 0x0345, 0x0 } }, { { 0x1FCA, 0x0399, 0x0 }, { 0x1FC2, 0x0, 0x0 }, { 0x1FCA, 0x0345, 0x0 } }, { { 0x0389, 0x0399, 0x0 }, { 0x1FC4, 0x0, 0x0 }, { 0x0389, 0x0345, 0x0 } }, { { 0x1FFA, 0x0399, 0x0 }, { 0x1FF2, 0x0, 0x0 }, { 0x1FFA, 0x0345, 0x0 } }, { { 0x038F, 0x0399, 0x0 }, { 0x1FF4, 0x0, 0x0 }, { 0x038F, 0x0345, 0x0 } }, { { 0x0391, 0x0342, 0x0399 }, { 0x1FB7, 0x0, 0x0 }, { 0x0391, 0x0342, 0x0345 } }, { { 0x0397, 0x0342, 0x0399 }, { 0x1FC7, 0x0, 0x0 }, { 0x0397, 0x0342, 0x0345 } }, { { 0x03A9, 0x0342, 0x0399 }, { 0x1FF7, 0x0, 0x0 }, { 0x03A9, 0x0342, 0x0345 } } }; static const MVMint32 case_changes[2622][3] = { {0x0,0x0,0x0}, /*1*/{0x0,0x0061,0x0}/* 0041 */,/*2*/{0x0,0x0062,0x0}/* 0042 */,/*3*/{0x0,0x0063,0x0}/* 0043 */, /*4*/{0x0,0x0064,0x0}/* 0044 */,/*5*/{0x0,0x0065,0x0}/* 0045 */,/*6*/{0x0,0x0066,0x0}/* 0046 */, /*7*/{0x0,0x0067,0x0}/* 0047 */,/*8*/{0x0,0x0068,0x0}/* 0048 */,/*9*/{0x0,0x0069,0x0}/* 0049 */, /*10*/{0x0,0x006A,0x0}/* 004A */,/*11*/{0x0,0x006B,0x0}/* 004B */,/*12*/{0x0,0x006C,0x0}/* 004C */, /*13*/{0x0,0x006D,0x0}/* 004D */,/*14*/{0x0,0x006E,0x0}/* 004E */,/*15*/{0x0,0x006F,0x0}/* 004F */, /*16*/{0x0,0x0070,0x0}/* 0050 */,/*17*/{0x0,0x0071,0x0}/* 0051 */,/*18*/{0x0,0x0072,0x0}/* 0052 */, /*19*/{0x0,0x0073,0x0}/* 0053 */,/*20*/{0x0,0x0074,0x0}/* 0054 */,/*21*/{0x0,0x0075,0x0}/* 0055 */, /*22*/{0x0,0x0076,0x0}/* 0056 */,/*23*/{0x0,0x0077,0x0}/* 0057 */,/*24*/{0x0,0x0078,0x0}/* 0058 */, /*25*/{0x0,0x0079,0x0}/* 0059 */,/*26*/{0x0,0x007A,0x0}/* 005A */,/*27*/{0x0041,0x0,0x0041}/* 0061 */, /*28*/{0x0042,0x0,0x0042}/* 0062 */,/*29*/{0x0043,0x0,0x0043}/* 0063 */,/*30*/{0x0044,0x0,0x0044}/* 0064 */, /*31*/{0x0045,0x0,0x0045}/* 0065 */,/*32*/{0x0046,0x0,0x0046}/* 0066 */,/*33*/{0x0047,0x0,0x0047}/* 0067 */, /*34*/{0x0048,0x0,0x0048}/* 0068 */,/*35*/{0x0049,0x0,0x0049}/* 0069 */,/*36*/{0x004A,0x0,0x004A}/* 006A */, /*37*/{0x004B,0x0,0x004B}/* 006B */,/*38*/{0x004C,0x0,0x004C}/* 006C */,/*39*/{0x004D,0x0,0x004D}/* 006D */, /*40*/{0x004E,0x0,0x004E}/* 006E */,/*41*/{0x004F,0x0,0x004F}/* 006F */,/*42*/{0x0050,0x0,0x0050}/* 0070 */, /*43*/{0x0051,0x0,0x0051}/* 0071 */,/*44*/{0x0052,0x0,0x0052}/* 0072 */,/*45*/{0x0053,0x0,0x0053}/* 0073 */, /*46*/{0x0054,0x0,0x0054}/* 0074 */,/*47*/{0x0055,0x0,0x0055}/* 0075 */,/*48*/{0x0056,0x0,0x0056}/* 0076 */, /*49*/{0x0057,0x0,0x0057}/* 0077 */,/*50*/{0x0058,0x0,0x0058}/* 0078 */,/*51*/{0x0059,0x0,0x0059}/* 0079 */, /*52*/{0x005A,0x0,0x005A}/* 007A */,/*53*/{0x039C,0x0,0x039C}/* 00B5 */,/*54*/{0x0,0x00E0,0x0}/* 00C0 */, /*55*/{0x0,0x00E1,0x0}/* 00C1 */,/*56*/{0x0,0x00E2,0x0}/* 00C2 */,/*57*/{0x0,0x00E3,0x0}/* 00C3 */, /*58*/{0x0,0x00E4,0x0}/* 00C4 */,/*59*/{0x0,0x00E5,0x0}/* 00C5 */,/*60*/{0x0,0x00E6,0x0}/* 00C6 */, /*61*/{0x0,0x00E7,0x0}/* 00C7 */,/*62*/{0x0,0x00E8,0x0}/* 00C8 */,/*63*/{0x0,0x00E9,0x0}/* 00C9 */, /*64*/{0x0,0x00EA,0x0}/* 00CA */,/*65*/{0x0,0x00EB,0x0}/* 00CB */,/*66*/{0x0,0x00EC,0x0}/* 00CC */, /*67*/{0x0,0x00ED,0x0}/* 00CD */,/*68*/{0x0,0x00EE,0x0}/* 00CE */,/*69*/{0x0,0x00EF,0x0}/* 00CF */, /*70*/{0x0,0x00F0,0x0}/* 00D0 */,/*71*/{0x0,0x00F1,0x0}/* 00D1 */,/*72*/{0x0,0x00F2,0x0}/* 00D2 */, /*73*/{0x0,0x00F3,0x0}/* 00D3 */,/*74*/{0x0,0x00F4,0x0}/* 00D4 */,/*75*/{0x0,0x00F5,0x0}/* 00D5 */, /*76*/{0x0,0x00F6,0x0}/* 00D6 */,/*77*/{0x0,0x00F8,0x0}/* 00D8 */,/*78*/{0x0,0x00F9,0x0}/* 00D9 */, /*79*/{0x0,0x00FA,0x0}/* 00DA */,/*80*/{0x0,0x00FB,0x0}/* 00DB */,/*81*/{0x0,0x00FC,0x0}/* 00DC */, /*82*/{0x0,0x00FD,0x0}/* 00DD */,/*83*/{0x0,0x00FE,0x0}/* 00DE */,/*84*/{0x00C0,0x0,0x00C0}/* 00E0 */, /*85*/{0x00C1,0x0,0x00C1}/* 00E1 */,/*86*/{0x00C2,0x0,0x00C2}/* 00E2 */,/*87*/{0x00C3,0x0,0x00C3}/* 00E3 */, /*88*/{0x00C4,0x0,0x00C4}/* 00E4 */,/*89*/{0x00C5,0x0,0x00C5}/* 00E5 */,/*90*/{0x00C6,0x0,0x00C6}/* 00E6 */, /*91*/{0x00C7,0x0,0x00C7}/* 00E7 */,/*92*/{0x00C8,0x0,0x00C8}/* 00E8 */,/*93*/{0x00C9,0x0,0x00C9}/* 00E9 */, /*94*/{0x00CA,0x0,0x00CA}/* 00EA */,/*95*/{0x00CB,0x0,0x00CB}/* 00EB */,/*96*/{0x00CC,0x0,0x00CC}/* 00EC */, /*97*/{0x00CD,0x0,0x00CD}/* 00ED */,/*98*/{0x00CE,0x0,0x00CE}/* 00EE */,/*99*/{0x00CF,0x0,0x00CF}/* 00EF */, /*100*/{0x00D0,0x0,0x00D0}/* 00F0 */,/*101*/{0x00D1,0x0,0x00D1}/* 00F1 */,/*102*/{0x00D2,0x0,0x00D2}/* 00F2 */, /*103*/{0x00D3,0x0,0x00D3}/* 00F3 */,/*104*/{0x00D4,0x0,0x00D4}/* 00F4 */,/*105*/{0x00D5,0x0,0x00D5}/* 00F5 */, /*106*/{0x00D6,0x0,0x00D6}/* 00F6 */,/*107*/{0x00D8,0x0,0x00D8}/* 00F8 */,/*108*/{0x00D9,0x0,0x00D9}/* 00F9 */, /*109*/{0x00DA,0x0,0x00DA}/* 00FA */,/*110*/{0x00DB,0x0,0x00DB}/* 00FB */,/*111*/{0x00DC,0x0,0x00DC}/* 00FC */, /*112*/{0x00DD,0x0,0x00DD}/* 00FD */,/*113*/{0x00DE,0x0,0x00DE}/* 00FE */,/*114*/{0x0178,0x0,0x0178}/* 00FF */, /*115*/{0x0,0x0101,0x0}/* 0100 */,/*116*/{0x0100,0x0,0x0100}/* 0101 */,/*117*/{0x0,0x0103,0x0}/* 0102 */, /*118*/{0x0102,0x0,0x0102}/* 0103 */,/*119*/{0x0,0x0105,0x0}/* 0104 */,/*120*/{0x0104,0x0,0x0104}/* 0105 */, /*121*/{0x0,0x0107,0x0}/* 0106 */,/*122*/{0x0106,0x0,0x0106}/* 0107 */,/*123*/{0x0,0x0109,0x0}/* 0108 */, /*124*/{0x0108,0x0,0x0108}/* 0109 */,/*125*/{0x0,0x010B,0x0}/* 010A */,/*126*/{0x010A,0x0,0x010A}/* 010B */, /*127*/{0x0,0x010D,0x0}/* 010C */,/*128*/{0x010C,0x0,0x010C}/* 010D */,/*129*/{0x0,0x010F,0x0}/* 010E */, /*130*/{0x010E,0x0,0x010E}/* 010F */,/*131*/{0x0,0x0111,0x0}/* 0110 */,/*132*/{0x0110,0x0,0x0110}/* 0111 */, /*133*/{0x0,0x0113,0x0}/* 0112 */,/*134*/{0x0112,0x0,0x0112}/* 0113 */,/*135*/{0x0,0x0115,0x0}/* 0114 */, /*136*/{0x0114,0x0,0x0114}/* 0115 */,/*137*/{0x0,0x0117,0x0}/* 0116 */,/*138*/{0x0116,0x0,0x0116}/* 0117 */, /*139*/{0x0,0x0119,0x0}/* 0118 */,/*140*/{0x0118,0x0,0x0118}/* 0119 */,/*141*/{0x0,0x011B,0x0}/* 011A */, /*142*/{0x011A,0x0,0x011A}/* 011B */,/*143*/{0x0,0x011D,0x0}/* 011C */,/*144*/{0x011C,0x0,0x011C}/* 011D */, /*145*/{0x0,0x011F,0x0}/* 011E */,/*146*/{0x011E,0x0,0x011E}/* 011F */,/*147*/{0x0,0x0121,0x0}/* 0120 */, /*148*/{0x0120,0x0,0x0120}/* 0121 */,/*149*/{0x0,0x0123,0x0}/* 0122 */,/*150*/{0x0122,0x0,0x0122}/* 0123 */, /*151*/{0x0,0x0125,0x0}/* 0124 */,/*152*/{0x0124,0x0,0x0124}/* 0125 */,/*153*/{0x0,0x0127,0x0}/* 0126 */, /*154*/{0x0126,0x0,0x0126}/* 0127 */,/*155*/{0x0,0x0129,0x0}/* 0128 */,/*156*/{0x0128,0x0,0x0128}/* 0129 */, /*157*/{0x0,0x012B,0x0}/* 012A */,/*158*/{0x012A,0x0,0x012A}/* 012B */,/*159*/{0x0,0x012D,0x0}/* 012C */, /*160*/{0x012C,0x0,0x012C}/* 012D */,/*161*/{0x0,0x012F,0x0}/* 012E */,/*162*/{0x012E,0x0,0x012E}/* 012F */, /*163*/{0x0,0x0069,0x0}/* 0130 */,/*164*/{0x0049,0x0,0x0049}/* 0131 */,/*165*/{0x0,0x0133,0x0}/* 0132 */, /*166*/{0x0132,0x0,0x0132}/* 0133 */,/*167*/{0x0,0x0135,0x0}/* 0134 */,/*168*/{0x0134,0x0,0x0134}/* 0135 */, /*169*/{0x0,0x0137,0x0}/* 0136 */,/*170*/{0x0136,0x0,0x0136}/* 0137 */,/*171*/{0x0,0x013A,0x0}/* 0139 */, /*172*/{0x0139,0x0,0x0139}/* 013A */,/*173*/{0x0,0x013C,0x0}/* 013B */,/*174*/{0x013B,0x0,0x013B}/* 013C */, /*175*/{0x0,0x013E,0x0}/* 013D */,/*176*/{0x013D,0x0,0x013D}/* 013E */,/*177*/{0x0,0x0140,0x0}/* 013F */, /*178*/{0x013F,0x0,0x013F}/* 0140 */,/*179*/{0x0,0x0142,0x0}/* 0141 */,/*180*/{0x0141,0x0,0x0141}/* 0142 */, /*181*/{0x0,0x0144,0x0}/* 0143 */,/*182*/{0x0143,0x0,0x0143}/* 0144 */,/*183*/{0x0,0x0146,0x0}/* 0145 */, /*184*/{0x0145,0x0,0x0145}/* 0146 */,/*185*/{0x0,0x0148,0x0}/* 0147 */,/*186*/{0x0147,0x0,0x0147}/* 0148 */, /*187*/{0x0,0x014B,0x0}/* 014A */,/*188*/{0x014A,0x0,0x014A}/* 014B */,/*189*/{0x0,0x014D,0x0}/* 014C */, /*190*/{0x014C,0x0,0x014C}/* 014D */,/*191*/{0x0,0x014F,0x0}/* 014E */,/*192*/{0x014E,0x0,0x014E}/* 014F */, /*193*/{0x0,0x0151,0x0}/* 0150 */,/*194*/{0x0150,0x0,0x0150}/* 0151 */,/*195*/{0x0,0x0153,0x0}/* 0152 */, /*196*/{0x0152,0x0,0x0152}/* 0153 */,/*197*/{0x0,0x0155,0x0}/* 0154 */,/*198*/{0x0154,0x0,0x0154}/* 0155 */, /*199*/{0x0,0x0157,0x0}/* 0156 */,/*200*/{0x0156,0x0,0x0156}/* 0157 */,/*201*/{0x0,0x0159,0x0}/* 0158 */, /*202*/{0x0158,0x0,0x0158}/* 0159 */,/*203*/{0x0,0x015B,0x0}/* 015A */,/*204*/{0x015A,0x0,0x015A}/* 015B */, /*205*/{0x0,0x015D,0x0}/* 015C */,/*206*/{0x015C,0x0,0x015C}/* 015D */,/*207*/{0x0,0x015F,0x0}/* 015E */, /*208*/{0x015E,0x0,0x015E}/* 015F */,/*209*/{0x0,0x0161,0x0}/* 0160 */,/*210*/{0x0160,0x0,0x0160}/* 0161 */, /*211*/{0x0,0x0163,0x0}/* 0162 */,/*212*/{0x0162,0x0,0x0162}/* 0163 */,/*213*/{0x0,0x0165,0x0}/* 0164 */, /*214*/{0x0164,0x0,0x0164}/* 0165 */,/*215*/{0x0,0x0167,0x0}/* 0166 */,/*216*/{0x0166,0x0,0x0166}/* 0167 */, /*217*/{0x0,0x0169,0x0}/* 0168 */,/*218*/{0x0168,0x0,0x0168}/* 0169 */,/*219*/{0x0,0x016B,0x0}/* 016A */, /*220*/{0x016A,0x0,0x016A}/* 016B */,/*221*/{0x0,0x016D,0x0}/* 016C */,/*222*/{0x016C,0x0,0x016C}/* 016D */, /*223*/{0x0,0x016F,0x0}/* 016E */,/*224*/{0x016E,0x0,0x016E}/* 016F */,/*225*/{0x0,0x0171,0x0}/* 0170 */, /*226*/{0x0170,0x0,0x0170}/* 0171 */,/*227*/{0x0,0x0173,0x0}/* 0172 */,/*228*/{0x0172,0x0,0x0172}/* 0173 */, /*229*/{0x0,0x0175,0x0}/* 0174 */,/*230*/{0x0174,0x0,0x0174}/* 0175 */,/*231*/{0x0,0x0177,0x0}/* 0176 */, /*232*/{0x0176,0x0,0x0176}/* 0177 */,/*233*/{0x0,0x00FF,0x0}/* 0178 */,/*234*/{0x0,0x017A,0x0}/* 0179 */, /*235*/{0x0179,0x0,0x0179}/* 017A */,/*236*/{0x0,0x017C,0x0}/* 017B */,/*237*/{0x017B,0x0,0x017B}/* 017C */, /*238*/{0x0,0x017E,0x0}/* 017D */,/*239*/{0x017D,0x0,0x017D}/* 017E */,/*240*/{0x0053,0x0,0x0053}/* 017F */, /*241*/{0x0243,0x0,0x0243}/* 0180 */,/*242*/{0x0,0x0253,0x0}/* 0181 */,/*243*/{0x0,0x0183,0x0}/* 0182 */, /*244*/{0x0182,0x0,0x0182}/* 0183 */,/*245*/{0x0,0x0185,0x0}/* 0184 */,/*246*/{0x0184,0x0,0x0184}/* 0185 */, /*247*/{0x0,0x0254,0x0}/* 0186 */,/*248*/{0x0,0x0188,0x0}/* 0187 */,/*249*/{0x0187,0x0,0x0187}/* 0188 */, /*250*/{0x0,0x0256,0x0}/* 0189 */,/*251*/{0x0,0x0257,0x0}/* 018A */,/*252*/{0x0,0x018C,0x0}/* 018B */, /*253*/{0x018B,0x0,0x018B}/* 018C */,/*254*/{0x0,0x01DD,0x0}/* 018E */,/*255*/{0x0,0x0259,0x0}/* 018F */, /*256*/{0x0,0x025B,0x0}/* 0190 */,/*257*/{0x0,0x0192,0x0}/* 0191 */,/*258*/{0x0191,0x0,0x0191}/* 0192 */, /*259*/{0x0,0x0260,0x0}/* 0193 */,/*260*/{0x0,0x0263,0x0}/* 0194 */,/*261*/{0x01F6,0x0,0x01F6}/* 0195 */, /*262*/{0x0,0x0269,0x0}/* 0196 */,/*263*/{0x0,0x0268,0x0}/* 0197 */,/*264*/{0x0,0x0199,0x0}/* 0198 */, /*265*/{0x0198,0x0,0x0198}/* 0199 */,/*266*/{0x023D,0x0,0x023D}/* 019A */,/*267*/{0x0,0x026F,0x0}/* 019C */, /*268*/{0x0,0x0272,0x0}/* 019D */,/*269*/{0x0220,0x0,0x0220}/* 019E */,/*270*/{0x0,0x0275,0x0}/* 019F */, /*271*/{0x0,0x01A1,0x0}/* 01A0 */,/*272*/{0x01A0,0x0,0x01A0}/* 01A1 */,/*273*/{0x0,0x01A3,0x0}/* 01A2 */, /*274*/{0x01A2,0x0,0x01A2}/* 01A3 */,/*275*/{0x0,0x01A5,0x0}/* 01A4 */,/*276*/{0x01A4,0x0,0x01A4}/* 01A5 */, /*277*/{0x0,0x0280,0x0}/* 01A6 */,/*278*/{0x0,0x01A8,0x0}/* 01A7 */,/*279*/{0x01A7,0x0,0x01A7}/* 01A8 */, /*280*/{0x0,0x0283,0x0}/* 01A9 */,/*281*/{0x0,0x01AD,0x0}/* 01AC */,/*282*/{0x01AC,0x0,0x01AC}/* 01AD */, /*283*/{0x0,0x0288,0x0}/* 01AE */,/*284*/{0x0,0x01B0,0x0}/* 01AF */,/*285*/{0x01AF,0x0,0x01AF}/* 01B0 */, /*286*/{0x0,0x028A,0x0}/* 01B1 */,/*287*/{0x0,0x028B,0x0}/* 01B2 */,/*288*/{0x0,0x01B4,0x0}/* 01B3 */, /*289*/{0x01B3,0x0,0x01B3}/* 01B4 */,/*290*/{0x0,0x01B6,0x0}/* 01B5 */,/*291*/{0x01B5,0x0,0x01B5}/* 01B6 */, /*292*/{0x0,0x0292,0x0}/* 01B7 */,/*293*/{0x0,0x01B9,0x0}/* 01B8 */,/*294*/{0x01B8,0x0,0x01B8}/* 01B9 */, /*295*/{0x0,0x01BD,0x0}/* 01BC */,/*296*/{0x01BC,0x0,0x01BC}/* 01BD */,/*297*/{0x01F7,0x0,0x01F7}/* 01BF */, /*298*/{0x0,0x01C6,0x01C5}/* 01C4 */,/*299*/{0x01C4,0x01C6,0x01C5}/* 01C5 */,/*300*/{0x01C4,0x0,0x01C5}/* 01C6 */, /*301*/{0x0,0x01C9,0x01C8}/* 01C7 */,/*302*/{0x01C7,0x01C9,0x01C8}/* 01C8 */,/*303*/{0x01C7,0x0,0x01C8}/* 01C9 */, /*304*/{0x0,0x01CC,0x01CB}/* 01CA */,/*305*/{0x01CA,0x01CC,0x01CB}/* 01CB */,/*306*/{0x01CA,0x0,0x01CB}/* 01CC */, /*307*/{0x0,0x01CE,0x0}/* 01CD */,/*308*/{0x01CD,0x0,0x01CD}/* 01CE */,/*309*/{0x0,0x01D0,0x0}/* 01CF */, /*310*/{0x01CF,0x0,0x01CF}/* 01D0 */,/*311*/{0x0,0x01D2,0x0}/* 01D1 */,/*312*/{0x01D1,0x0,0x01D1}/* 01D2 */, /*313*/{0x0,0x01D4,0x0}/* 01D3 */,/*314*/{0x01D3,0x0,0x01D3}/* 01D4 */,/*315*/{0x0,0x01D6,0x0}/* 01D5 */, /*316*/{0x01D5,0x0,0x01D5}/* 01D6 */,/*317*/{0x0,0x01D8,0x0}/* 01D7 */,/*318*/{0x01D7,0x0,0x01D7}/* 01D8 */, /*319*/{0x0,0x01DA,0x0}/* 01D9 */,/*320*/{0x01D9,0x0,0x01D9}/* 01DA */,/*321*/{0x0,0x01DC,0x0}/* 01DB */, /*322*/{0x01DB,0x0,0x01DB}/* 01DC */,/*323*/{0x018E,0x0,0x018E}/* 01DD */,/*324*/{0x0,0x01DF,0x0}/* 01DE */, /*325*/{0x01DE,0x0,0x01DE}/* 01DF */,/*326*/{0x0,0x01E1,0x0}/* 01E0 */,/*327*/{0x01E0,0x0,0x01E0}/* 01E1 */, /*328*/{0x0,0x01E3,0x0}/* 01E2 */,/*329*/{0x01E2,0x0,0x01E2}/* 01E3 */,/*330*/{0x0,0x01E5,0x0}/* 01E4 */, /*331*/{0x01E4,0x0,0x01E4}/* 01E5 */,/*332*/{0x0,0x01E7,0x0}/* 01E6 */,/*333*/{0x01E6,0x0,0x01E6}/* 01E7 */, /*334*/{0x0,0x01E9,0x0}/* 01E8 */,/*335*/{0x01E8,0x0,0x01E8}/* 01E9 */,/*336*/{0x0,0x01EB,0x0}/* 01EA */, /*337*/{0x01EA,0x0,0x01EA}/* 01EB */,/*338*/{0x0,0x01ED,0x0}/* 01EC */,/*339*/{0x01EC,0x0,0x01EC}/* 01ED */, /*340*/{0x0,0x01EF,0x0}/* 01EE */,/*341*/{0x01EE,0x0,0x01EE}/* 01EF */,/*342*/{0x0,0x01F3,0x01F2}/* 01F1 */, /*343*/{0x01F1,0x01F3,0x01F2}/* 01F2 */,/*344*/{0x01F1,0x0,0x01F2}/* 01F3 */,/*345*/{0x0,0x01F5,0x0}/* 01F4 */, /*346*/{0x01F4,0x0,0x01F4}/* 01F5 */,/*347*/{0x0,0x0195,0x0}/* 01F6 */,/*348*/{0x0,0x01BF,0x0}/* 01F7 */, /*349*/{0x0,0x01F9,0x0}/* 01F8 */,/*350*/{0x01F8,0x0,0x01F8}/* 01F9 */,/*351*/{0x0,0x01FB,0x0}/* 01FA */, /*352*/{0x01FA,0x0,0x01FA}/* 01FB */,/*353*/{0x0,0x01FD,0x0}/* 01FC */,/*354*/{0x01FC,0x0,0x01FC}/* 01FD */, /*355*/{0x0,0x01FF,0x0}/* 01FE */,/*356*/{0x01FE,0x0,0x01FE}/* 01FF */,/*357*/{0x0,0x0201,0x0}/* 0200 */, /*358*/{0x0200,0x0,0x0200}/* 0201 */,/*359*/{0x0,0x0203,0x0}/* 0202 */,/*360*/{0x0202,0x0,0x0202}/* 0203 */, /*361*/{0x0,0x0205,0x0}/* 0204 */,/*362*/{0x0204,0x0,0x0204}/* 0205 */,/*363*/{0x0,0x0207,0x0}/* 0206 */, /*364*/{0x0206,0x0,0x0206}/* 0207 */,/*365*/{0x0,0x0209,0x0}/* 0208 */,/*366*/{0x0208,0x0,0x0208}/* 0209 */, /*367*/{0x0,0x020B,0x0}/* 020A */,/*368*/{0x020A,0x0,0x020A}/* 020B */,/*369*/{0x0,0x020D,0x0}/* 020C */, /*370*/{0x020C,0x0,0x020C}/* 020D */,/*371*/{0x0,0x020F,0x0}/* 020E */,/*372*/{0x020E,0x0,0x020E}/* 020F */, /*373*/{0x0,0x0211,0x0}/* 0210 */,/*374*/{0x0210,0x0,0x0210}/* 0211 */,/*375*/{0x0,0x0213,0x0}/* 0212 */, /*376*/{0x0212,0x0,0x0212}/* 0213 */,/*377*/{0x0,0x0215,0x0}/* 0214 */,/*378*/{0x0214,0x0,0x0214}/* 0215 */, /*379*/{0x0,0x0217,0x0}/* 0216 */,/*380*/{0x0216,0x0,0x0216}/* 0217 */,/*381*/{0x0,0x0219,0x0}/* 0218 */, /*382*/{0x0218,0x0,0x0218}/* 0219 */,/*383*/{0x0,0x021B,0x0}/* 021A */,/*384*/{0x021A,0x0,0x021A}/* 021B */, /*385*/{0x0,0x021D,0x0}/* 021C */,/*386*/{0x021C,0x0,0x021C}/* 021D */,/*387*/{0x0,0x021F,0x0}/* 021E */, /*388*/{0x021E,0x0,0x021E}/* 021F */,/*389*/{0x0,0x019E,0x0}/* 0220 */,/*390*/{0x0,0x0223,0x0}/* 0222 */, /*391*/{0x0222,0x0,0x0222}/* 0223 */,/*392*/{0x0,0x0225,0x0}/* 0224 */,/*393*/{0x0224,0x0,0x0224}/* 0225 */, /*394*/{0x0,0x0227,0x0}/* 0226 */,/*395*/{0x0226,0x0,0x0226}/* 0227 */,/*396*/{0x0,0x0229,0x0}/* 0228 */, /*397*/{0x0228,0x0,0x0228}/* 0229 */,/*398*/{0x0,0x022B,0x0}/* 022A */,/*399*/{0x022A,0x0,0x022A}/* 022B */, /*400*/{0x0,0x022D,0x0}/* 022C */,/*401*/{0x022C,0x0,0x022C}/* 022D */,/*402*/{0x0,0x022F,0x0}/* 022E */, /*403*/{0x022E,0x0,0x022E}/* 022F */,/*404*/{0x0,0x0231,0x0}/* 0230 */,/*405*/{0x0230,0x0,0x0230}/* 0231 */, /*406*/{0x0,0x0233,0x0}/* 0232 */,/*407*/{0x0232,0x0,0x0232}/* 0233 */,/*408*/{0x0,0x2C65,0x0}/* 023A */, /*409*/{0x0,0x023C,0x0}/* 023B */,/*410*/{0x023B,0x0,0x023B}/* 023C */,/*411*/{0x0,0x019A,0x0}/* 023D */, /*412*/{0x0,0x2C66,0x0}/* 023E */,/*413*/{0x2C7E,0x0,0x2C7E}/* 023F */,/*414*/{0x2C7F,0x0,0x2C7F}/* 0240 */, /*415*/{0x0,0x0242,0x0}/* 0241 */,/*416*/{0x0241,0x0,0x0241}/* 0242 */,/*417*/{0x0,0x0180,0x0}/* 0243 */, /*418*/{0x0,0x0289,0x0}/* 0244 */,/*419*/{0x0,0x028C,0x0}/* 0245 */,/*420*/{0x0,0x0247,0x0}/* 0246 */, /*421*/{0x0246,0x0,0x0246}/* 0247 */,/*422*/{0x0,0x0249,0x0}/* 0248 */,/*423*/{0x0248,0x0,0x0248}/* 0249 */, /*424*/{0x0,0x024B,0x0}/* 024A */,/*425*/{0x024A,0x0,0x024A}/* 024B */,/*426*/{0x0,0x024D,0x0}/* 024C */, /*427*/{0x024C,0x0,0x024C}/* 024D */,/*428*/{0x0,0x024F,0x0}/* 024E */,/*429*/{0x024E,0x0,0x024E}/* 024F */, /*430*/{0x2C6F,0x0,0x2C6F}/* 0250 */,/*431*/{0x2C6D,0x0,0x2C6D}/* 0251 */,/*432*/{0x2C70,0x0,0x2C70}/* 0252 */, /*433*/{0x0181,0x0,0x0181}/* 0253 */,/*434*/{0x0186,0x0,0x0186}/* 0254 */,/*435*/{0x0189,0x0,0x0189}/* 0256 */, /*436*/{0x018A,0x0,0x018A}/* 0257 */,/*437*/{0x018F,0x0,0x018F}/* 0259 */,/*438*/{0x0190,0x0,0x0190}/* 025B */, /*439*/{0xA7AB,0x0,0xA7AB}/* 025C */,/*440*/{0x0193,0x0,0x0193}/* 0260 */,/*441*/{0xA7AC,0x0,0xA7AC}/* 0261 */, /*442*/{0x0194,0x0,0x0194}/* 0263 */,/*443*/{0xA78D,0x0,0xA78D}/* 0265 */,/*444*/{0xA7AA,0x0,0xA7AA}/* 0266 */, /*445*/{0x0197,0x0,0x0197}/* 0268 */,/*446*/{0x0196,0x0,0x0196}/* 0269 */,/*447*/{0xA7AE,0x0,0xA7AE}/* 026A */, /*448*/{0x2C62,0x0,0x2C62}/* 026B */,/*449*/{0xA7AD,0x0,0xA7AD}/* 026C */,/*450*/{0x019C,0x0,0x019C}/* 026F */, /*451*/{0x2C6E,0x0,0x2C6E}/* 0271 */,/*452*/{0x019D,0x0,0x019D}/* 0272 */,/*453*/{0x019F,0x0,0x019F}/* 0275 */, /*454*/{0x2C64,0x0,0x2C64}/* 027D */,/*455*/{0x01A6,0x0,0x01A6}/* 0280 */,/*456*/{0x01A9,0x0,0x01A9}/* 0283 */, /*457*/{0xA7B1,0x0,0xA7B1}/* 0287 */,/*458*/{0x01AE,0x0,0x01AE}/* 0288 */,/*459*/{0x0244,0x0,0x0244}/* 0289 */, /*460*/{0x01B1,0x0,0x01B1}/* 028A */,/*461*/{0x01B2,0x0,0x01B2}/* 028B */,/*462*/{0x0245,0x0,0x0245}/* 028C */, /*463*/{0x01B7,0x0,0x01B7}/* 0292 */,/*464*/{0xA7B2,0x0,0xA7B2}/* 029D */,/*465*/{0xA7B0,0x0,0xA7B0}/* 029E */, /*466*/{0x0399,0x0,0x0399}/* 0345 */,/*467*/{0x0,0x0371,0x0}/* 0370 */,/*468*/{0x0370,0x0,0x0370}/* 0371 */, /*469*/{0x0,0x0373,0x0}/* 0372 */,/*470*/{0x0372,0x0,0x0372}/* 0373 */,/*471*/{0x0,0x0377,0x0}/* 0376 */, /*472*/{0x0376,0x0,0x0376}/* 0377 */,/*473*/{0x03FD,0x0,0x03FD}/* 037B */,/*474*/{0x03FE,0x0,0x03FE}/* 037C */, /*475*/{0x03FF,0x0,0x03FF}/* 037D */,/*476*/{0x0,0x03F3,0x0}/* 037F */,/*477*/{0x0,0x03AC,0x0}/* 0386 */, /*478*/{0x0,0x03AD,0x0}/* 0388 */,/*479*/{0x0,0x03AE,0x0}/* 0389 */,/*480*/{0x0,0x03AF,0x0}/* 038A */, /*481*/{0x0,0x03CC,0x0}/* 038C */,/*482*/{0x0,0x03CD,0x0}/* 038E */,/*483*/{0x0,0x03CE,0x0}/* 038F */, /*484*/{0x0,0x03B1,0x0}/* 0391 */,/*485*/{0x0,0x03B2,0x0}/* 0392 */,/*486*/{0x0,0x03B3,0x0}/* 0393 */, /*487*/{0x0,0x03B4,0x0}/* 0394 */,/*488*/{0x0,0x03B5,0x0}/* 0395 */,/*489*/{0x0,0x03B6,0x0}/* 0396 */, /*490*/{0x0,0x03B7,0x0}/* 0397 */,/*491*/{0x0,0x03B8,0x0}/* 0398 */,/*492*/{0x0,0x03B9,0x0}/* 0399 */, /*493*/{0x0,0x03BA,0x0}/* 039A */,/*494*/{0x0,0x03BB,0x0}/* 039B */,/*495*/{0x0,0x03BC,0x0}/* 039C */, /*496*/{0x0,0x03BD,0x0}/* 039D */,/*497*/{0x0,0x03BE,0x0}/* 039E */,/*498*/{0x0,0x03BF,0x0}/* 039F */, /*499*/{0x0,0x03C0,0x0}/* 03A0 */,/*500*/{0x0,0x03C1,0x0}/* 03A1 */,/*501*/{0x0,0x03C3,0x0}/* 03A3 */, /*502*/{0x0,0x03C4,0x0}/* 03A4 */,/*503*/{0x0,0x03C5,0x0}/* 03A5 */,/*504*/{0x0,0x03C6,0x0}/* 03A6 */, /*505*/{0x0,0x03C7,0x0}/* 03A7 */,/*506*/{0x0,0x03C8,0x0}/* 03A8 */,/*507*/{0x0,0x03C9,0x0}/* 03A9 */, /*508*/{0x0,0x03CA,0x0}/* 03AA */,/*509*/{0x0,0x03CB,0x0}/* 03AB */,/*510*/{0x0386,0x0,0x0386}/* 03AC */, /*511*/{0x0388,0x0,0x0388}/* 03AD */,/*512*/{0x0389,0x0,0x0389}/* 03AE */,/*513*/{0x038A,0x0,0x038A}/* 03AF */, /*514*/{0x0391,0x0,0x0391}/* 03B1 */,/*515*/{0x0392,0x0,0x0392}/* 03B2 */,/*516*/{0x0393,0x0,0x0393}/* 03B3 */, /*517*/{0x0394,0x0,0x0394}/* 03B4 */,/*518*/{0x0395,0x0,0x0395}/* 03B5 */,/*519*/{0x0396,0x0,0x0396}/* 03B6 */, /*520*/{0x0397,0x0,0x0397}/* 03B7 */,/*521*/{0x0398,0x0,0x0398}/* 03B8 */,/*522*/{0x0399,0x0,0x0399}/* 03B9 */, /*523*/{0x039A,0x0,0x039A}/* 03BA */,/*524*/{0x039B,0x0,0x039B}/* 03BB */,/*525*/{0x039C,0x0,0x039C}/* 03BC */, /*526*/{0x039D,0x0,0x039D}/* 03BD */,/*527*/{0x039E,0x0,0x039E}/* 03BE */,/*528*/{0x039F,0x0,0x039F}/* 03BF */, /*529*/{0x03A0,0x0,0x03A0}/* 03C0 */,/*530*/{0x03A1,0x0,0x03A1}/* 03C1 */,/*531*/{0x03A3,0x0,0x03A3}/* 03C2 */, /*532*/{0x03A3,0x0,0x03A3}/* 03C3 */,/*533*/{0x03A4,0x0,0x03A4}/* 03C4 */,/*534*/{0x03A5,0x0,0x03A5}/* 03C5 */, /*535*/{0x03A6,0x0,0x03A6}/* 03C6 */,/*536*/{0x03A7,0x0,0x03A7}/* 03C7 */,/*537*/{0x03A8,0x0,0x03A8}/* 03C8 */, /*538*/{0x03A9,0x0,0x03A9}/* 03C9 */,/*539*/{0x03AA,0x0,0x03AA}/* 03CA */,/*540*/{0x03AB,0x0,0x03AB}/* 03CB */, /*541*/{0x038C,0x0,0x038C}/* 03CC */,/*542*/{0x038E,0x0,0x038E}/* 03CD */,/*543*/{0x038F,0x0,0x038F}/* 03CE */, /*544*/{0x0,0x03D7,0x0}/* 03CF */,/*545*/{0x0392,0x0,0x0392}/* 03D0 */,/*546*/{0x0398,0x0,0x0398}/* 03D1 */, /*547*/{0x03A6,0x0,0x03A6}/* 03D5 */,/*548*/{0x03A0,0x0,0x03A0}/* 03D6 */,/*549*/{0x03CF,0x0,0x03CF}/* 03D7 */, /*550*/{0x0,0x03D9,0x0}/* 03D8 */,/*551*/{0x03D8,0x0,0x03D8}/* 03D9 */,/*552*/{0x0,0x03DB,0x0}/* 03DA */, /*553*/{0x03DA,0x0,0x03DA}/* 03DB */,/*554*/{0x0,0x03DD,0x0}/* 03DC */,/*555*/{0x03DC,0x0,0x03DC}/* 03DD */, /*556*/{0x0,0x03DF,0x0}/* 03DE */,/*557*/{0x03DE,0x0,0x03DE}/* 03DF */,/*558*/{0x0,0x03E1,0x0}/* 03E0 */, /*559*/{0x03E0,0x0,0x03E0}/* 03E1 */,/*560*/{0x0,0x03E3,0x0}/* 03E2 */,/*561*/{0x03E2,0x0,0x03E2}/* 03E3 */, /*562*/{0x0,0x03E5,0x0}/* 03E4 */,/*563*/{0x03E4,0x0,0x03E4}/* 03E5 */,/*564*/{0x0,0x03E7,0x0}/* 03E6 */, /*565*/{0x03E6,0x0,0x03E6}/* 03E7 */,/*566*/{0x0,0x03E9,0x0}/* 03E8 */,/*567*/{0x03E8,0x0,0x03E8}/* 03E9 */, /*568*/{0x0,0x03EB,0x0}/* 03EA */,/*569*/{0x03EA,0x0,0x03EA}/* 03EB */,/*570*/{0x0,0x03ED,0x0}/* 03EC */, /*571*/{0x03EC,0x0,0x03EC}/* 03ED */,/*572*/{0x0,0x03EF,0x0}/* 03EE */,/*573*/{0x03EE,0x0,0x03EE}/* 03EF */, /*574*/{0x039A,0x0,0x039A}/* 03F0 */,/*575*/{0x03A1,0x0,0x03A1}/* 03F1 */,/*576*/{0x03F9,0x0,0x03F9}/* 03F2 */, /*577*/{0x037F,0x0,0x037F}/* 03F3 */,/*578*/{0x0,0x03B8,0x0}/* 03F4 */,/*579*/{0x0395,0x0,0x0395}/* 03F5 */, /*580*/{0x0,0x03F8,0x0}/* 03F7 */,/*581*/{0x03F7,0x0,0x03F7}/* 03F8 */,/*582*/{0x0,0x03F2,0x0}/* 03F9 */, /*583*/{0x0,0x03FB,0x0}/* 03FA */,/*584*/{0x03FA,0x0,0x03FA}/* 03FB */,/*585*/{0x0,0x037B,0x0}/* 03FD */, /*586*/{0x0,0x037C,0x0}/* 03FE */,/*587*/{0x0,0x037D,0x0}/* 03FF */,/*588*/{0x0,0x0450,0x0}/* 0400 */, /*589*/{0x0,0x0451,0x0}/* 0401 */,/*590*/{0x0,0x0452,0x0}/* 0402 */,/*591*/{0x0,0x0453,0x0}/* 0403 */, /*592*/{0x0,0x0454,0x0}/* 0404 */,/*593*/{0x0,0x0455,0x0}/* 0405 */,/*594*/{0x0,0x0456,0x0}/* 0406 */, /*595*/{0x0,0x0457,0x0}/* 0407 */,/*596*/{0x0,0x0458,0x0}/* 0408 */,/*597*/{0x0,0x0459,0x0}/* 0409 */, /*598*/{0x0,0x045A,0x0}/* 040A */,/*599*/{0x0,0x045B,0x0}/* 040B */,/*600*/{0x0,0x045C,0x0}/* 040C */, /*601*/{0x0,0x045D,0x0}/* 040D */,/*602*/{0x0,0x045E,0x0}/* 040E */,/*603*/{0x0,0x045F,0x0}/* 040F */, /*604*/{0x0,0x0430,0x0}/* 0410 */,/*605*/{0x0,0x0431,0x0}/* 0411 */,/*606*/{0x0,0x0432,0x0}/* 0412 */, /*607*/{0x0,0x0433,0x0}/* 0413 */,/*608*/{0x0,0x0434,0x0}/* 0414 */,/*609*/{0x0,0x0435,0x0}/* 0415 */, /*610*/{0x0,0x0436,0x0}/* 0416 */,/*611*/{0x0,0x0437,0x0}/* 0417 */,/*612*/{0x0,0x0438,0x0}/* 0418 */, /*613*/{0x0,0x0439,0x0}/* 0419 */,/*614*/{0x0,0x043A,0x0}/* 041A */,/*615*/{0x0,0x043B,0x0}/* 041B */, /*616*/{0x0,0x043C,0x0}/* 041C */,/*617*/{0x0,0x043D,0x0}/* 041D */,/*618*/{0x0,0x043E,0x0}/* 041E */, /*619*/{0x0,0x043F,0x0}/* 041F */,/*620*/{0x0,0x0440,0x0}/* 0420 */,/*621*/{0x0,0x0441,0x0}/* 0421 */, /*622*/{0x0,0x0442,0x0}/* 0422 */,/*623*/{0x0,0x0443,0x0}/* 0423 */,/*624*/{0x0,0x0444,0x0}/* 0424 */, /*625*/{0x0,0x0445,0x0}/* 0425 */,/*626*/{0x0,0x0446,0x0}/* 0426 */,/*627*/{0x0,0x0447,0x0}/* 0427 */, /*628*/{0x0,0x0448,0x0}/* 0428 */,/*629*/{0x0,0x0449,0x0}/* 0429 */,/*630*/{0x0,0x044A,0x0}/* 042A */, /*631*/{0x0,0x044B,0x0}/* 042B */,/*632*/{0x0,0x044C,0x0}/* 042C */,/*633*/{0x0,0x044D,0x0}/* 042D */, /*634*/{0x0,0x044E,0x0}/* 042E */,/*635*/{0x0,0x044F,0x0}/* 042F */,/*636*/{0x0410,0x0,0x0410}/* 0430 */, /*637*/{0x0411,0x0,0x0411}/* 0431 */,/*638*/{0x0412,0x0,0x0412}/* 0432 */,/*639*/{0x0413,0x0,0x0413}/* 0433 */, /*640*/{0x0414,0x0,0x0414}/* 0434 */,/*641*/{0x0415,0x0,0x0415}/* 0435 */,/*642*/{0x0416,0x0,0x0416}/* 0436 */, /*643*/{0x0417,0x0,0x0417}/* 0437 */,/*644*/{0x0418,0x0,0x0418}/* 0438 */,/*645*/{0x0419,0x0,0x0419}/* 0439 */, /*646*/{0x041A,0x0,0x041A}/* 043A */,/*647*/{0x041B,0x0,0x041B}/* 043B */,/*648*/{0x041C,0x0,0x041C}/* 043C */, /*649*/{0x041D,0x0,0x041D}/* 043D */,/*650*/{0x041E,0x0,0x041E}/* 043E */,/*651*/{0x041F,0x0,0x041F}/* 043F */, /*652*/{0x0420,0x0,0x0420}/* 0440 */,/*653*/{0x0421,0x0,0x0421}/* 0441 */,/*654*/{0x0422,0x0,0x0422}/* 0442 */, /*655*/{0x0423,0x0,0x0423}/* 0443 */,/*656*/{0x0424,0x0,0x0424}/* 0444 */,/*657*/{0x0425,0x0,0x0425}/* 0445 */, /*658*/{0x0426,0x0,0x0426}/* 0446 */,/*659*/{0x0427,0x0,0x0427}/* 0447 */,/*660*/{0x0428,0x0,0x0428}/* 0448 */, /*661*/{0x0429,0x0,0x0429}/* 0449 */,/*662*/{0x042A,0x0,0x042A}/* 044A */,/*663*/{0x042B,0x0,0x042B}/* 044B */, /*664*/{0x042C,0x0,0x042C}/* 044C */,/*665*/{0x042D,0x0,0x042D}/* 044D */,/*666*/{0x042E,0x0,0x042E}/* 044E */, /*667*/{0x042F,0x0,0x042F}/* 044F */,/*668*/{0x0400,0x0,0x0400}/* 0450 */,/*669*/{0x0401,0x0,0x0401}/* 0451 */, /*670*/{0x0402,0x0,0x0402}/* 0452 */,/*671*/{0x0403,0x0,0x0403}/* 0453 */,/*672*/{0x0404,0x0,0x0404}/* 0454 */, /*673*/{0x0405,0x0,0x0405}/* 0455 */,/*674*/{0x0406,0x0,0x0406}/* 0456 */,/*675*/{0x0407,0x0,0x0407}/* 0457 */, /*676*/{0x0408,0x0,0x0408}/* 0458 */,/*677*/{0x0409,0x0,0x0409}/* 0459 */,/*678*/{0x040A,0x0,0x040A}/* 045A */, /*679*/{0x040B,0x0,0x040B}/* 045B */,/*680*/{0x040C,0x0,0x040C}/* 045C */,/*681*/{0x040D,0x0,0x040D}/* 045D */, /*682*/{0x040E,0x0,0x040E}/* 045E */,/*683*/{0x040F,0x0,0x040F}/* 045F */,/*684*/{0x0,0x0461,0x0}/* 0460 */, /*685*/{0x0460,0x0,0x0460}/* 0461 */,/*686*/{0x0,0x0463,0x0}/* 0462 */,/*687*/{0x0462,0x0,0x0462}/* 0463 */, /*688*/{0x0,0x0465,0x0}/* 0464 */,/*689*/{0x0464,0x0,0x0464}/* 0465 */,/*690*/{0x0,0x0467,0x0}/* 0466 */, /*691*/{0x0466,0x0,0x0466}/* 0467 */,/*692*/{0x0,0x0469,0x0}/* 0468 */,/*693*/{0x0468,0x0,0x0468}/* 0469 */, /*694*/{0x0,0x046B,0x0}/* 046A */,/*695*/{0x046A,0x0,0x046A}/* 046B */,/*696*/{0x0,0x046D,0x0}/* 046C */, /*697*/{0x046C,0x0,0x046C}/* 046D */,/*698*/{0x0,0x046F,0x0}/* 046E */,/*699*/{0x046E,0x0,0x046E}/* 046F */, /*700*/{0x0,0x0471,0x0}/* 0470 */,/*701*/{0x0470,0x0,0x0470}/* 0471 */,/*702*/{0x0,0x0473,0x0}/* 0472 */, /*703*/{0x0472,0x0,0x0472}/* 0473 */,/*704*/{0x0,0x0475,0x0}/* 0474 */,/*705*/{0x0474,0x0,0x0474}/* 0475 */, /*706*/{0x0,0x0477,0x0}/* 0476 */,/*707*/{0x0476,0x0,0x0476}/* 0477 */,/*708*/{0x0,0x0479,0x0}/* 0478 */, /*709*/{0x0478,0x0,0x0478}/* 0479 */,/*710*/{0x0,0x047B,0x0}/* 047A */,/*711*/{0x047A,0x0,0x047A}/* 047B */, /*712*/{0x0,0x047D,0x0}/* 047C */,/*713*/{0x047C,0x0,0x047C}/* 047D */,/*714*/{0x0,0x047F,0x0}/* 047E */, /*715*/{0x047E,0x0,0x047E}/* 047F */,/*716*/{0x0,0x0481,0x0}/* 0480 */,/*717*/{0x0480,0x0,0x0480}/* 0481 */, /*718*/{0x0,0x048B,0x0}/* 048A */,/*719*/{0x048A,0x0,0x048A}/* 048B */,/*720*/{0x0,0x048D,0x0}/* 048C */, /*721*/{0x048C,0x0,0x048C}/* 048D */,/*722*/{0x0,0x048F,0x0}/* 048E */,/*723*/{0x048E,0x0,0x048E}/* 048F */, /*724*/{0x0,0x0491,0x0}/* 0490 */,/*725*/{0x0490,0x0,0x0490}/* 0491 */,/*726*/{0x0,0x0493,0x0}/* 0492 */, /*727*/{0x0492,0x0,0x0492}/* 0493 */,/*728*/{0x0,0x0495,0x0}/* 0494 */,/*729*/{0x0494,0x0,0x0494}/* 0495 */, /*730*/{0x0,0x0497,0x0}/* 0496 */,/*731*/{0x0496,0x0,0x0496}/* 0497 */,/*732*/{0x0,0x0499,0x0}/* 0498 */, /*733*/{0x0498,0x0,0x0498}/* 0499 */,/*734*/{0x0,0x049B,0x0}/* 049A */,/*735*/{0x049A,0x0,0x049A}/* 049B */, /*736*/{0x0,0x049D,0x0}/* 049C */,/*737*/{0x049C,0x0,0x049C}/* 049D */,/*738*/{0x0,0x049F,0x0}/* 049E */, /*739*/{0x049E,0x0,0x049E}/* 049F */,/*740*/{0x0,0x04A1,0x0}/* 04A0 */,/*741*/{0x04A0,0x0,0x04A0}/* 04A1 */, /*742*/{0x0,0x04A3,0x0}/* 04A2 */,/*743*/{0x04A2,0x0,0x04A2}/* 04A3 */,/*744*/{0x0,0x04A5,0x0}/* 04A4 */, /*745*/{0x04A4,0x0,0x04A4}/* 04A5 */,/*746*/{0x0,0x04A7,0x0}/* 04A6 */,/*747*/{0x04A6,0x0,0x04A6}/* 04A7 */, /*748*/{0x0,0x04A9,0x0}/* 04A8 */,/*749*/{0x04A8,0x0,0x04A8}/* 04A9 */,/*750*/{0x0,0x04AB,0x0}/* 04AA */, /*751*/{0x04AA,0x0,0x04AA}/* 04AB */,/*752*/{0x0,0x04AD,0x0}/* 04AC */,/*753*/{0x04AC,0x0,0x04AC}/* 04AD */, /*754*/{0x0,0x04AF,0x0}/* 04AE */,/*755*/{0x04AE,0x0,0x04AE}/* 04AF */,/*756*/{0x0,0x04B1,0x0}/* 04B0 */, /*757*/{0x04B0,0x0,0x04B0}/* 04B1 */,/*758*/{0x0,0x04B3,0x0}/* 04B2 */,/*759*/{0x04B2,0x0,0x04B2}/* 04B3 */, /*760*/{0x0,0x04B5,0x0}/* 04B4 */,/*761*/{0x04B4,0x0,0x04B4}/* 04B5 */,/*762*/{0x0,0x04B7,0x0}/* 04B6 */, /*763*/{0x04B6,0x0,0x04B6}/* 04B7 */,/*764*/{0x0,0x04B9,0x0}/* 04B8 */,/*765*/{0x04B8,0x0,0x04B8}/* 04B9 */, /*766*/{0x0,0x04BB,0x0}/* 04BA */,/*767*/{0x04BA,0x0,0x04BA}/* 04BB */,/*768*/{0x0,0x04BD,0x0}/* 04BC */, /*769*/{0x04BC,0x0,0x04BC}/* 04BD */,/*770*/{0x0,0x04BF,0x0}/* 04BE */,/*771*/{0x04BE,0x0,0x04BE}/* 04BF */, /*772*/{0x0,0x04CF,0x0}/* 04C0 */,/*773*/{0x0,0x04C2,0x0}/* 04C1 */,/*774*/{0x04C1,0x0,0x04C1}/* 04C2 */, /*775*/{0x0,0x04C4,0x0}/* 04C3 */,/*776*/{0x04C3,0x0,0x04C3}/* 04C4 */,/*777*/{0x0,0x04C6,0x0}/* 04C5 */, /*778*/{0x04C5,0x0,0x04C5}/* 04C6 */,/*779*/{0x0,0x04C8,0x0}/* 04C7 */,/*780*/{0x04C7,0x0,0x04C7}/* 04C8 */, /*781*/{0x0,0x04CA,0x0}/* 04C9 */,/*782*/{0x04C9,0x0,0x04C9}/* 04CA */,/*783*/{0x0,0x04CC,0x0}/* 04CB */, /*784*/{0x04CB,0x0,0x04CB}/* 04CC */,/*785*/{0x0,0x04CE,0x0}/* 04CD */,/*786*/{0x04CD,0x0,0x04CD}/* 04CE */, /*787*/{0x04C0,0x0,0x04C0}/* 04CF */,/*788*/{0x0,0x04D1,0x0}/* 04D0 */,/*789*/{0x04D0,0x0,0x04D0}/* 04D1 */, /*790*/{0x0,0x04D3,0x0}/* 04D2 */,/*791*/{0x04D2,0x0,0x04D2}/* 04D3 */,/*792*/{0x0,0x04D5,0x0}/* 04D4 */, /*793*/{0x04D4,0x0,0x04D4}/* 04D5 */,/*794*/{0x0,0x04D7,0x0}/* 04D6 */,/*795*/{0x04D6,0x0,0x04D6}/* 04D7 */, /*796*/{0x0,0x04D9,0x0}/* 04D8 */,/*797*/{0x04D8,0x0,0x04D8}/* 04D9 */,/*798*/{0x0,0x04DB,0x0}/* 04DA */, /*799*/{0x04DA,0x0,0x04DA}/* 04DB */,/*800*/{0x0,0x04DD,0x0}/* 04DC */,/*801*/{0x04DC,0x0,0x04DC}/* 04DD */, /*802*/{0x0,0x04DF,0x0}/* 04DE */,/*803*/{0x04DE,0x0,0x04DE}/* 04DF */,/*804*/{0x0,0x04E1,0x0}/* 04E0 */, /*805*/{0x04E0,0x0,0x04E0}/* 04E1 */,/*806*/{0x0,0x04E3,0x0}/* 04E2 */,/*807*/{0x04E2,0x0,0x04E2}/* 04E3 */, /*808*/{0x0,0x04E5,0x0}/* 04E4 */,/*809*/{0x04E4,0x0,0x04E4}/* 04E5 */,/*810*/{0x0,0x04E7,0x0}/* 04E6 */, /*811*/{0x04E6,0x0,0x04E6}/* 04E7 */,/*812*/{0x0,0x04E9,0x0}/* 04E8 */,/*813*/{0x04E8,0x0,0x04E8}/* 04E9 */, /*814*/{0x0,0x04EB,0x0}/* 04EA */,/*815*/{0x04EA,0x0,0x04EA}/* 04EB */,/*816*/{0x0,0x04ED,0x0}/* 04EC */, /*817*/{0x04EC,0x0,0x04EC}/* 04ED */,/*818*/{0x0,0x04EF,0x0}/* 04EE */,/*819*/{0x04EE,0x0,0x04EE}/* 04EF */, /*820*/{0x0,0x04F1,0x0}/* 04F0 */,/*821*/{0x04F0,0x0,0x04F0}/* 04F1 */,/*822*/{0x0,0x04F3,0x0}/* 04F2 */, /*823*/{0x04F2,0x0,0x04F2}/* 04F3 */,/*824*/{0x0,0x04F5,0x0}/* 04F4 */,/*825*/{0x04F4,0x0,0x04F4}/* 04F5 */, /*826*/{0x0,0x04F7,0x0}/* 04F6 */,/*827*/{0x04F6,0x0,0x04F6}/* 04F7 */,/*828*/{0x0,0x04F9,0x0}/* 04F8 */, /*829*/{0x04F8,0x0,0x04F8}/* 04F9 */,/*830*/{0x0,0x04FB,0x0}/* 04FA */,/*831*/{0x04FA,0x0,0x04FA}/* 04FB */, /*832*/{0x0,0x04FD,0x0}/* 04FC */,/*833*/{0x04FC,0x0,0x04FC}/* 04FD */,/*834*/{0x0,0x04FF,0x0}/* 04FE */, /*835*/{0x04FE,0x0,0x04FE}/* 04FF */,/*836*/{0x0,0x0501,0x0}/* 0500 */,/*837*/{0x0500,0x0,0x0500}/* 0501 */, /*838*/{0x0,0x0503,0x0}/* 0502 */,/*839*/{0x0502,0x0,0x0502}/* 0503 */,/*840*/{0x0,0x0505,0x0}/* 0504 */, /*841*/{0x0504,0x0,0x0504}/* 0505 */,/*842*/{0x0,0x0507,0x0}/* 0506 */,/*843*/{0x0506,0x0,0x0506}/* 0507 */, /*844*/{0x0,0x0509,0x0}/* 0508 */,/*845*/{0x0508,0x0,0x0508}/* 0509 */,/*846*/{0x0,0x050B,0x0}/* 050A */, /*847*/{0x050A,0x0,0x050A}/* 050B */,/*848*/{0x0,0x050D,0x0}/* 050C */,/*849*/{0x050C,0x0,0x050C}/* 050D */, /*850*/{0x0,0x050F,0x0}/* 050E */,/*851*/{0x050E,0x0,0x050E}/* 050F */,/*852*/{0x0,0x0511,0x0}/* 0510 */, /*853*/{0x0510,0x0,0x0510}/* 0511 */,/*854*/{0x0,0x0513,0x0}/* 0512 */,/*855*/{0x0512,0x0,0x0512}/* 0513 */, /*856*/{0x0,0x0515,0x0}/* 0514 */,/*857*/{0x0514,0x0,0x0514}/* 0515 */,/*858*/{0x0,0x0517,0x0}/* 0516 */, /*859*/{0x0516,0x0,0x0516}/* 0517 */,/*860*/{0x0,0x0519,0x0}/* 0518 */,/*861*/{0x0518,0x0,0x0518}/* 0519 */, /*862*/{0x0,0x051B,0x0}/* 051A */,/*863*/{0x051A,0x0,0x051A}/* 051B */,/*864*/{0x0,0x051D,0x0}/* 051C */, /*865*/{0x051C,0x0,0x051C}/* 051D */,/*866*/{0x0,0x051F,0x0}/* 051E */,/*867*/{0x051E,0x0,0x051E}/* 051F */, /*868*/{0x0,0x0521,0x0}/* 0520 */,/*869*/{0x0520,0x0,0x0520}/* 0521 */,/*870*/{0x0,0x0523,0x0}/* 0522 */, /*871*/{0x0522,0x0,0x0522}/* 0523 */,/*872*/{0x0,0x0525,0x0}/* 0524 */,/*873*/{0x0524,0x0,0x0524}/* 0525 */, /*874*/{0x0,0x0527,0x0}/* 0526 */,/*875*/{0x0526,0x0,0x0526}/* 0527 */,/*876*/{0x0,0x0529,0x0}/* 0528 */, /*877*/{0x0528,0x0,0x0528}/* 0529 */,/*878*/{0x0,0x052B,0x0}/* 052A */,/*879*/{0x052A,0x0,0x052A}/* 052B */, /*880*/{0x0,0x052D,0x0}/* 052C */,/*881*/{0x052C,0x0,0x052C}/* 052D */,/*882*/{0x0,0x052F,0x0}/* 052E */, /*883*/{0x052E,0x0,0x052E}/* 052F */,/*884*/{0x0,0x0561,0x0}/* 0531 */,/*885*/{0x0,0x0562,0x0}/* 0532 */, /*886*/{0x0,0x0563,0x0}/* 0533 */,/*887*/{0x0,0x0564,0x0}/* 0534 */,/*888*/{0x0,0x0565,0x0}/* 0535 */, /*889*/{0x0,0x0566,0x0}/* 0536 */,/*890*/{0x0,0x0567,0x0}/* 0537 */,/*891*/{0x0,0x0568,0x0}/* 0538 */, /*892*/{0x0,0x0569,0x0}/* 0539 */,/*893*/{0x0,0x056A,0x0}/* 053A */,/*894*/{0x0,0x056B,0x0}/* 053B */, /*895*/{0x0,0x056C,0x0}/* 053C */,/*896*/{0x0,0x056D,0x0}/* 053D */,/*897*/{0x0,0x056E,0x0}/* 053E */, /*898*/{0x0,0x056F,0x0}/* 053F */,/*899*/{0x0,0x0570,0x0}/* 0540 */,/*900*/{0x0,0x0571,0x0}/* 0541 */, /*901*/{0x0,0x0572,0x0}/* 0542 */,/*902*/{0x0,0x0573,0x0}/* 0543 */,/*903*/{0x0,0x0574,0x0}/* 0544 */, /*904*/{0x0,0x0575,0x0}/* 0545 */,/*905*/{0x0,0x0576,0x0}/* 0546 */,/*906*/{0x0,0x0577,0x0}/* 0547 */, /*907*/{0x0,0x0578,0x0}/* 0548 */,/*908*/{0x0,0x0579,0x0}/* 0549 */,/*909*/{0x0,0x057A,0x0}/* 054A */, /*910*/{0x0,0x057B,0x0}/* 054B */,/*911*/{0x0,0x057C,0x0}/* 054C */,/*912*/{0x0,0x057D,0x0}/* 054D */, /*913*/{0x0,0x057E,0x0}/* 054E */,/*914*/{0x0,0x057F,0x0}/* 054F */,/*915*/{0x0,0x0580,0x0}/* 0550 */, /*916*/{0x0,0x0581,0x0}/* 0551 */,/*917*/{0x0,0x0582,0x0}/* 0552 */,/*918*/{0x0,0x0583,0x0}/* 0553 */, /*919*/{0x0,0x0584,0x0}/* 0554 */,/*920*/{0x0,0x0585,0x0}/* 0555 */,/*921*/{0x0,0x0586,0x0}/* 0556 */, /*922*/{0x0531,0x0,0x0531}/* 0561 */,/*923*/{0x0532,0x0,0x0532}/* 0562 */,/*924*/{0x0533,0x0,0x0533}/* 0563 */, /*925*/{0x0534,0x0,0x0534}/* 0564 */,/*926*/{0x0535,0x0,0x0535}/* 0565 */,/*927*/{0x0536,0x0,0x0536}/* 0566 */, /*928*/{0x0537,0x0,0x0537}/* 0567 */,/*929*/{0x0538,0x0,0x0538}/* 0568 */,/*930*/{0x0539,0x0,0x0539}/* 0569 */, /*931*/{0x053A,0x0,0x053A}/* 056A */,/*932*/{0x053B,0x0,0x053B}/* 056B */,/*933*/{0x053C,0x0,0x053C}/* 056C */, /*934*/{0x053D,0x0,0x053D}/* 056D */,/*935*/{0x053E,0x0,0x053E}/* 056E */,/*936*/{0x053F,0x0,0x053F}/* 056F */, /*937*/{0x0540,0x0,0x0540}/* 0570 */,/*938*/{0x0541,0x0,0x0541}/* 0571 */,/*939*/{0x0542,0x0,0x0542}/* 0572 */, /*940*/{0x0543,0x0,0x0543}/* 0573 */,/*941*/{0x0544,0x0,0x0544}/* 0574 */,/*942*/{0x0545,0x0,0x0545}/* 0575 */, /*943*/{0x0546,0x0,0x0546}/* 0576 */,/*944*/{0x0547,0x0,0x0547}/* 0577 */,/*945*/{0x0548,0x0,0x0548}/* 0578 */, /*946*/{0x0549,0x0,0x0549}/* 0579 */,/*947*/{0x054A,0x0,0x054A}/* 057A */,/*948*/{0x054B,0x0,0x054B}/* 057B */, /*949*/{0x054C,0x0,0x054C}/* 057C */,/*950*/{0x054D,0x0,0x054D}/* 057D */,/*951*/{0x054E,0x0,0x054E}/* 057E */, /*952*/{0x054F,0x0,0x054F}/* 057F */,/*953*/{0x0550,0x0,0x0550}/* 0580 */,/*954*/{0x0551,0x0,0x0551}/* 0581 */, /*955*/{0x0552,0x0,0x0552}/* 0582 */,/*956*/{0x0553,0x0,0x0553}/* 0583 */,/*957*/{0x0554,0x0,0x0554}/* 0584 */, /*958*/{0x0555,0x0,0x0555}/* 0585 */,/*959*/{0x0556,0x0,0x0556}/* 0586 */,/*960*/{0x0,0x2D00,0x0}/* 10A0 */, /*961*/{0x0,0x2D01,0x0}/* 10A1 */,/*962*/{0x0,0x2D02,0x0}/* 10A2 */,/*963*/{0x0,0x2D03,0x0}/* 10A3 */, /*964*/{0x0,0x2D04,0x0}/* 10A4 */,/*965*/{0x0,0x2D05,0x0}/* 10A5 */,/*966*/{0x0,0x2D06,0x0}/* 10A6 */, /*967*/{0x0,0x2D07,0x0}/* 10A7 */,/*968*/{0x0,0x2D08,0x0}/* 10A8 */,/*969*/{0x0,0x2D09,0x0}/* 10A9 */, /*970*/{0x0,0x2D0A,0x0}/* 10AA */,/*971*/{0x0,0x2D0B,0x0}/* 10AB */,/*972*/{0x0,0x2D0C,0x0}/* 10AC */, /*973*/{0x0,0x2D0D,0x0}/* 10AD */,/*974*/{0x0,0x2D0E,0x0}/* 10AE */,/*975*/{0x0,0x2D0F,0x0}/* 10AF */, /*976*/{0x0,0x2D10,0x0}/* 10B0 */,/*977*/{0x0,0x2D11,0x0}/* 10B1 */,/*978*/{0x0,0x2D12,0x0}/* 10B2 */, /*979*/{0x0,0x2D13,0x0}/* 10B3 */,/*980*/{0x0,0x2D14,0x0}/* 10B4 */,/*981*/{0x0,0x2D15,0x0}/* 10B5 */, /*982*/{0x0,0x2D16,0x0}/* 10B6 */,/*983*/{0x0,0x2D17,0x0}/* 10B7 */,/*984*/{0x0,0x2D18,0x0}/* 10B8 */, /*985*/{0x0,0x2D19,0x0}/* 10B9 */,/*986*/{0x0,0x2D1A,0x0}/* 10BA */,/*987*/{0x0,0x2D1B,0x0}/* 10BB */, /*988*/{0x0,0x2D1C,0x0}/* 10BC */,/*989*/{0x0,0x2D1D,0x0}/* 10BD */,/*990*/{0x0,0x2D1E,0x0}/* 10BE */, /*991*/{0x0,0x2D1F,0x0}/* 10BF */,/*992*/{0x0,0x2D20,0x0}/* 10C0 */,/*993*/{0x0,0x2D21,0x0}/* 10C1 */, /*994*/{0x0,0x2D22,0x0}/* 10C2 */,/*995*/{0x0,0x2D23,0x0}/* 10C3 */,/*996*/{0x0,0x2D24,0x0}/* 10C4 */, /*997*/{0x0,0x2D25,0x0}/* 10C5 */,/*998*/{0x0,0x2D27,0x0}/* 10C7 */,/*999*/{0x0,0x2D2D,0x0}/* 10CD */, /*1000*/{0x0,0xAB70,0x0}/* 13A0 */,/*1001*/{0x0,0xAB71,0x0}/* 13A1 */,/*1002*/{0x0,0xAB72,0x0}/* 13A2 */, /*1003*/{0x0,0xAB73,0x0}/* 13A3 */,/*1004*/{0x0,0xAB74,0x0}/* 13A4 */,/*1005*/{0x0,0xAB75,0x0}/* 13A5 */, /*1006*/{0x0,0xAB76,0x0}/* 13A6 */,/*1007*/{0x0,0xAB77,0x0}/* 13A7 */,/*1008*/{0x0,0xAB78,0x0}/* 13A8 */, /*1009*/{0x0,0xAB79,0x0}/* 13A9 */,/*1010*/{0x0,0xAB7A,0x0}/* 13AA */,/*1011*/{0x0,0xAB7B,0x0}/* 13AB */, /*1012*/{0x0,0xAB7C,0x0}/* 13AC */,/*1013*/{0x0,0xAB7D,0x0}/* 13AD */,/*1014*/{0x0,0xAB7E,0x0}/* 13AE */, /*1015*/{0x0,0xAB7F,0x0}/* 13AF */,/*1016*/{0x0,0xAB80,0x0}/* 13B0 */,/*1017*/{0x0,0xAB81,0x0}/* 13B1 */, /*1018*/{0x0,0xAB82,0x0}/* 13B2 */,/*1019*/{0x0,0xAB83,0x0}/* 13B3 */,/*1020*/{0x0,0xAB84,0x0}/* 13B4 */, /*1021*/{0x0,0xAB85,0x0}/* 13B5 */,/*1022*/{0x0,0xAB86,0x0}/* 13B6 */,/*1023*/{0x0,0xAB87,0x0}/* 13B7 */, /*1024*/{0x0,0xAB88,0x0}/* 13B8 */,/*1025*/{0x0,0xAB89,0x0}/* 13B9 */,/*1026*/{0x0,0xAB8A,0x0}/* 13BA */, /*1027*/{0x0,0xAB8B,0x0}/* 13BB */,/*1028*/{0x0,0xAB8C,0x0}/* 13BC */,/*1029*/{0x0,0xAB8D,0x0}/* 13BD */, /*1030*/{0x0,0xAB8E,0x0}/* 13BE */,/*1031*/{0x0,0xAB8F,0x0}/* 13BF */,/*1032*/{0x0,0xAB90,0x0}/* 13C0 */, /*1033*/{0x0,0xAB91,0x0}/* 13C1 */,/*1034*/{0x0,0xAB92,0x0}/* 13C2 */,/*1035*/{0x0,0xAB93,0x0}/* 13C3 */, /*1036*/{0x0,0xAB94,0x0}/* 13C4 */,/*1037*/{0x0,0xAB95,0x0}/* 13C5 */,/*1038*/{0x0,0xAB96,0x0}/* 13C6 */, /*1039*/{0x0,0xAB97,0x0}/* 13C7 */,/*1040*/{0x0,0xAB98,0x0}/* 13C8 */,/*1041*/{0x0,0xAB99,0x0}/* 13C9 */, /*1042*/{0x0,0xAB9A,0x0}/* 13CA */,/*1043*/{0x0,0xAB9B,0x0}/* 13CB */,/*1044*/{0x0,0xAB9C,0x0}/* 13CC */, /*1045*/{0x0,0xAB9D,0x0}/* 13CD */,/*1046*/{0x0,0xAB9E,0x0}/* 13CE */,/*1047*/{0x0,0xAB9F,0x0}/* 13CF */, /*1048*/{0x0,0xABA0,0x0}/* 13D0 */,/*1049*/{0x0,0xABA1,0x0}/* 13D1 */,/*1050*/{0x0,0xABA2,0x0}/* 13D2 */, /*1051*/{0x0,0xABA3,0x0}/* 13D3 */,/*1052*/{0x0,0xABA4,0x0}/* 13D4 */,/*1053*/{0x0,0xABA5,0x0}/* 13D5 */, /*1054*/{0x0,0xABA6,0x0}/* 13D6 */,/*1055*/{0x0,0xABA7,0x0}/* 13D7 */,/*1056*/{0x0,0xABA8,0x0}/* 13D8 */, /*1057*/{0x0,0xABA9,0x0}/* 13D9 */,/*1058*/{0x0,0xABAA,0x0}/* 13DA */,/*1059*/{0x0,0xABAB,0x0}/* 13DB */, /*1060*/{0x0,0xABAC,0x0}/* 13DC */,/*1061*/{0x0,0xABAD,0x0}/* 13DD */,/*1062*/{0x0,0xABAE,0x0}/* 13DE */, /*1063*/{0x0,0xABAF,0x0}/* 13DF */,/*1064*/{0x0,0xABB0,0x0}/* 13E0 */,/*1065*/{0x0,0xABB1,0x0}/* 13E1 */, /*1066*/{0x0,0xABB2,0x0}/* 13E2 */,/*1067*/{0x0,0xABB3,0x0}/* 13E3 */,/*1068*/{0x0,0xABB4,0x0}/* 13E4 */, /*1069*/{0x0,0xABB5,0x0}/* 13E5 */,/*1070*/{0x0,0xABB6,0x0}/* 13E6 */,/*1071*/{0x0,0xABB7,0x0}/* 13E7 */, /*1072*/{0x0,0xABB8,0x0}/* 13E8 */,/*1073*/{0x0,0xABB9,0x0}/* 13E9 */,/*1074*/{0x0,0xABBA,0x0}/* 13EA */, /*1075*/{0x0,0xABBB,0x0}/* 13EB */,/*1076*/{0x0,0xABBC,0x0}/* 13EC */,/*1077*/{0x0,0xABBD,0x0}/* 13ED */, /*1078*/{0x0,0xABBE,0x0}/* 13EE */,/*1079*/{0x0,0xABBF,0x0}/* 13EF */,/*1080*/{0x0,0x13F8,0x0}/* 13F0 */, /*1081*/{0x0,0x13F9,0x0}/* 13F1 */,/*1082*/{0x0,0x13FA,0x0}/* 13F2 */,/*1083*/{0x0,0x13FB,0x0}/* 13F3 */, /*1084*/{0x0,0x13FC,0x0}/* 13F4 */,/*1085*/{0x0,0x13FD,0x0}/* 13F5 */,/*1086*/{0x13F0,0x0,0x13F0}/* 13F8 */, /*1087*/{0x13F1,0x0,0x13F1}/* 13F9 */,/*1088*/{0x13F2,0x0,0x13F2}/* 13FA */,/*1089*/{0x13F3,0x0,0x13F3}/* 13FB */, /*1090*/{0x13F4,0x0,0x13F4}/* 13FC */,/*1091*/{0x13F5,0x0,0x13F5}/* 13FD */,/*1092*/{0x0412,0x0,0x0412}/* 1C80 */, /*1093*/{0x0414,0x0,0x0414}/* 1C81 */,/*1094*/{0x041E,0x0,0x041E}/* 1C82 */,/*1095*/{0x0421,0x0,0x0421}/* 1C83 */, /*1096*/{0x0422,0x0,0x0422}/* 1C84 */,/*1097*/{0x0422,0x0,0x0422}/* 1C85 */,/*1098*/{0x042A,0x0,0x042A}/* 1C86 */, /*1099*/{0x0462,0x0,0x0462}/* 1C87 */,/*1100*/{0xA64A,0x0,0xA64A}/* 1C88 */,/*1101*/{0xA77D,0x0,0xA77D}/* 1D79 */, /*1102*/{0x2C63,0x0,0x2C63}/* 1D7D */,/*1103*/{0x0,0x1E01,0x0}/* 1E00 */,/*1104*/{0x1E00,0x0,0x1E00}/* 1E01 */, /*1105*/{0x0,0x1E03,0x0}/* 1E02 */,/*1106*/{0x1E02,0x0,0x1E02}/* 1E03 */,/*1107*/{0x0,0x1E05,0x0}/* 1E04 */, /*1108*/{0x1E04,0x0,0x1E04}/* 1E05 */,/*1109*/{0x0,0x1E07,0x0}/* 1E06 */,/*1110*/{0x1E06,0x0,0x1E06}/* 1E07 */, /*1111*/{0x0,0x1E09,0x0}/* 1E08 */,/*1112*/{0x1E08,0x0,0x1E08}/* 1E09 */,/*1113*/{0x0,0x1E0B,0x0}/* 1E0A */, /*1114*/{0x1E0A,0x0,0x1E0A}/* 1E0B */,/*1115*/{0x0,0x1E0D,0x0}/* 1E0C */,/*1116*/{0x1E0C,0x0,0x1E0C}/* 1E0D */, /*1117*/{0x0,0x1E0F,0x0}/* 1E0E */,/*1118*/{0x1E0E,0x0,0x1E0E}/* 1E0F */,/*1119*/{0x0,0x1E11,0x0}/* 1E10 */, /*1120*/{0x1E10,0x0,0x1E10}/* 1E11 */,/*1121*/{0x0,0x1E13,0x0}/* 1E12 */,/*1122*/{0x1E12,0x0,0x1E12}/* 1E13 */, /*1123*/{0x0,0x1E15,0x0}/* 1E14 */,/*1124*/{0x1E14,0x0,0x1E14}/* 1E15 */,/*1125*/{0x0,0x1E17,0x0}/* 1E16 */, /*1126*/{0x1E16,0x0,0x1E16}/* 1E17 */,/*1127*/{0x0,0x1E19,0x0}/* 1E18 */,/*1128*/{0x1E18,0x0,0x1E18}/* 1E19 */, /*1129*/{0x0,0x1E1B,0x0}/* 1E1A */,/*1130*/{0x1E1A,0x0,0x1E1A}/* 1E1B */,/*1131*/{0x0,0x1E1D,0x0}/* 1E1C */, /*1132*/{0x1E1C,0x0,0x1E1C}/* 1E1D */,/*1133*/{0x0,0x1E1F,0x0}/* 1E1E */,/*1134*/{0x1E1E,0x0,0x1E1E}/* 1E1F */, /*1135*/{0x0,0x1E21,0x0}/* 1E20 */,/*1136*/{0x1E20,0x0,0x1E20}/* 1E21 */,/*1137*/{0x0,0x1E23,0x0}/* 1E22 */, /*1138*/{0x1E22,0x0,0x1E22}/* 1E23 */,/*1139*/{0x0,0x1E25,0x0}/* 1E24 */,/*1140*/{0x1E24,0x0,0x1E24}/* 1E25 */, /*1141*/{0x0,0x1E27,0x0}/* 1E26 */,/*1142*/{0x1E26,0x0,0x1E26}/* 1E27 */,/*1143*/{0x0,0x1E29,0x0}/* 1E28 */, /*1144*/{0x1E28,0x0,0x1E28}/* 1E29 */,/*1145*/{0x0,0x1E2B,0x0}/* 1E2A */,/*1146*/{0x1E2A,0x0,0x1E2A}/* 1E2B */, /*1147*/{0x0,0x1E2D,0x0}/* 1E2C */,/*1148*/{0x1E2C,0x0,0x1E2C}/* 1E2D */,/*1149*/{0x0,0x1E2F,0x0}/* 1E2E */, /*1150*/{0x1E2E,0x0,0x1E2E}/* 1E2F */,/*1151*/{0x0,0x1E31,0x0}/* 1E30 */,/*1152*/{0x1E30,0x0,0x1E30}/* 1E31 */, /*1153*/{0x0,0x1E33,0x0}/* 1E32 */,/*1154*/{0x1E32,0x0,0x1E32}/* 1E33 */,/*1155*/{0x0,0x1E35,0x0}/* 1E34 */, /*1156*/{0x1E34,0x0,0x1E34}/* 1E35 */,/*1157*/{0x0,0x1E37,0x0}/* 1E36 */,/*1158*/{0x1E36,0x0,0x1E36}/* 1E37 */, /*1159*/{0x0,0x1E39,0x0}/* 1E38 */,/*1160*/{0x1E38,0x0,0x1E38}/* 1E39 */,/*1161*/{0x0,0x1E3B,0x0}/* 1E3A */, /*1162*/{0x1E3A,0x0,0x1E3A}/* 1E3B */,/*1163*/{0x0,0x1E3D,0x0}/* 1E3C */,/*1164*/{0x1E3C,0x0,0x1E3C}/* 1E3D */, /*1165*/{0x0,0x1E3F,0x0}/* 1E3E */,/*1166*/{0x1E3E,0x0,0x1E3E}/* 1E3F */,/*1167*/{0x0,0x1E41,0x0}/* 1E40 */, /*1168*/{0x1E40,0x0,0x1E40}/* 1E41 */,/*1169*/{0x0,0x1E43,0x0}/* 1E42 */,/*1170*/{0x1E42,0x0,0x1E42}/* 1E43 */, /*1171*/{0x0,0x1E45,0x0}/* 1E44 */,/*1172*/{0x1E44,0x0,0x1E44}/* 1E45 */,/*1173*/{0x0,0x1E47,0x0}/* 1E46 */, /*1174*/{0x1E46,0x0,0x1E46}/* 1E47 */,/*1175*/{0x0,0x1E49,0x0}/* 1E48 */,/*1176*/{0x1E48,0x0,0x1E48}/* 1E49 */, /*1177*/{0x0,0x1E4B,0x0}/* 1E4A */,/*1178*/{0x1E4A,0x0,0x1E4A}/* 1E4B */,/*1179*/{0x0,0x1E4D,0x0}/* 1E4C */, /*1180*/{0x1E4C,0x0,0x1E4C}/* 1E4D */,/*1181*/{0x0,0x1E4F,0x0}/* 1E4E */,/*1182*/{0x1E4E,0x0,0x1E4E}/* 1E4F */, /*1183*/{0x0,0x1E51,0x0}/* 1E50 */,/*1184*/{0x1E50,0x0,0x1E50}/* 1E51 */,/*1185*/{0x0,0x1E53,0x0}/* 1E52 */, /*1186*/{0x1E52,0x0,0x1E52}/* 1E53 */,/*1187*/{0x0,0x1E55,0x0}/* 1E54 */,/*1188*/{0x1E54,0x0,0x1E54}/* 1E55 */, /*1189*/{0x0,0x1E57,0x0}/* 1E56 */,/*1190*/{0x1E56,0x0,0x1E56}/* 1E57 */,/*1191*/{0x0,0x1E59,0x0}/* 1E58 */, /*1192*/{0x1E58,0x0,0x1E58}/* 1E59 */,/*1193*/{0x0,0x1E5B,0x0}/* 1E5A */,/*1194*/{0x1E5A,0x0,0x1E5A}/* 1E5B */, /*1195*/{0x0,0x1E5D,0x0}/* 1E5C */,/*1196*/{0x1E5C,0x0,0x1E5C}/* 1E5D */,/*1197*/{0x0,0x1E5F,0x0}/* 1E5E */, /*1198*/{0x1E5E,0x0,0x1E5E}/* 1E5F */,/*1199*/{0x0,0x1E61,0x0}/* 1E60 */,/*1200*/{0x1E60,0x0,0x1E60}/* 1E61 */, /*1201*/{0x0,0x1E63,0x0}/* 1E62 */,/*1202*/{0x1E62,0x0,0x1E62}/* 1E63 */,/*1203*/{0x0,0x1E65,0x0}/* 1E64 */, /*1204*/{0x1E64,0x0,0x1E64}/* 1E65 */,/*1205*/{0x0,0x1E67,0x0}/* 1E66 */,/*1206*/{0x1E66,0x0,0x1E66}/* 1E67 */, /*1207*/{0x0,0x1E69,0x0}/* 1E68 */,/*1208*/{0x1E68,0x0,0x1E68}/* 1E69 */,/*1209*/{0x0,0x1E6B,0x0}/* 1E6A */, /*1210*/{0x1E6A,0x0,0x1E6A}/* 1E6B */,/*1211*/{0x0,0x1E6D,0x0}/* 1E6C */,/*1212*/{0x1E6C,0x0,0x1E6C}/* 1E6D */, /*1213*/{0x0,0x1E6F,0x0}/* 1E6E */,/*1214*/{0x1E6E,0x0,0x1E6E}/* 1E6F */,/*1215*/{0x0,0x1E71,0x0}/* 1E70 */, /*1216*/{0x1E70,0x0,0x1E70}/* 1E71 */,/*1217*/{0x0,0x1E73,0x0}/* 1E72 */,/*1218*/{0x1E72,0x0,0x1E72}/* 1E73 */, /*1219*/{0x0,0x1E75,0x0}/* 1E74 */,/*1220*/{0x1E74,0x0,0x1E74}/* 1E75 */,/*1221*/{0x0,0x1E77,0x0}/* 1E76 */, /*1222*/{0x1E76,0x0,0x1E76}/* 1E77 */,/*1223*/{0x0,0x1E79,0x0}/* 1E78 */,/*1224*/{0x1E78,0x0,0x1E78}/* 1E79 */, /*1225*/{0x0,0x1E7B,0x0}/* 1E7A */,/*1226*/{0x1E7A,0x0,0x1E7A}/* 1E7B */,/*1227*/{0x0,0x1E7D,0x0}/* 1E7C */, /*1228*/{0x1E7C,0x0,0x1E7C}/* 1E7D */,/*1229*/{0x0,0x1E7F,0x0}/* 1E7E */,/*1230*/{0x1E7E,0x0,0x1E7E}/* 1E7F */, /*1231*/{0x0,0x1E81,0x0}/* 1E80 */,/*1232*/{0x1E80,0x0,0x1E80}/* 1E81 */,/*1233*/{0x0,0x1E83,0x0}/* 1E82 */, /*1234*/{0x1E82,0x0,0x1E82}/* 1E83 */,/*1235*/{0x0,0x1E85,0x0}/* 1E84 */,/*1236*/{0x1E84,0x0,0x1E84}/* 1E85 */, /*1237*/{0x0,0x1E87,0x0}/* 1E86 */,/*1238*/{0x1E86,0x0,0x1E86}/* 1E87 */,/*1239*/{0x0,0x1E89,0x0}/* 1E88 */, /*1240*/{0x1E88,0x0,0x1E88}/* 1E89 */,/*1241*/{0x0,0x1E8B,0x0}/* 1E8A */,/*1242*/{0x1E8A,0x0,0x1E8A}/* 1E8B */, /*1243*/{0x0,0x1E8D,0x0}/* 1E8C */,/*1244*/{0x1E8C,0x0,0x1E8C}/* 1E8D */,/*1245*/{0x0,0x1E8F,0x0}/* 1E8E */, /*1246*/{0x1E8E,0x0,0x1E8E}/* 1E8F */,/*1247*/{0x0,0x1E91,0x0}/* 1E90 */,/*1248*/{0x1E90,0x0,0x1E90}/* 1E91 */, /*1249*/{0x0,0x1E93,0x0}/* 1E92 */,/*1250*/{0x1E92,0x0,0x1E92}/* 1E93 */,/*1251*/{0x0,0x1E95,0x0}/* 1E94 */, /*1252*/{0x1E94,0x0,0x1E94}/* 1E95 */,/*1253*/{0x1E60,0x0,0x1E60}/* 1E9B */,/*1254*/{0x0,0x00DF,0x0}/* 1E9E */, /*1255*/{0x0,0x1EA1,0x0}/* 1EA0 */,/*1256*/{0x1EA0,0x0,0x1EA0}/* 1EA1 */,/*1257*/{0x0,0x1EA3,0x0}/* 1EA2 */, /*1258*/{0x1EA2,0x0,0x1EA2}/* 1EA3 */,/*1259*/{0x0,0x1EA5,0x0}/* 1EA4 */,/*1260*/{0x1EA4,0x0,0x1EA4}/* 1EA5 */, /*1261*/{0x0,0x1EA7,0x0}/* 1EA6 */,/*1262*/{0x1EA6,0x0,0x1EA6}/* 1EA7 */,/*1263*/{0x0,0x1EA9,0x0}/* 1EA8 */, /*1264*/{0x1EA8,0x0,0x1EA8}/* 1EA9 */,/*1265*/{0x0,0x1EAB,0x0}/* 1EAA */,/*1266*/{0x1EAA,0x0,0x1EAA}/* 1EAB */, /*1267*/{0x0,0x1EAD,0x0}/* 1EAC */,/*1268*/{0x1EAC,0x0,0x1EAC}/* 1EAD */,/*1269*/{0x0,0x1EAF,0x0}/* 1EAE */, /*1270*/{0x1EAE,0x0,0x1EAE}/* 1EAF */,/*1271*/{0x0,0x1EB1,0x0}/* 1EB0 */,/*1272*/{0x1EB0,0x0,0x1EB0}/* 1EB1 */, /*1273*/{0x0,0x1EB3,0x0}/* 1EB2 */,/*1274*/{0x1EB2,0x0,0x1EB2}/* 1EB3 */,/*1275*/{0x0,0x1EB5,0x0}/* 1EB4 */, /*1276*/{0x1EB4,0x0,0x1EB4}/* 1EB5 */,/*1277*/{0x0,0x1EB7,0x0}/* 1EB6 */,/*1278*/{0x1EB6,0x0,0x1EB6}/* 1EB7 */, /*1279*/{0x0,0x1EB9,0x0}/* 1EB8 */,/*1280*/{0x1EB8,0x0,0x1EB8}/* 1EB9 */,/*1281*/{0x0,0x1EBB,0x0}/* 1EBA */, /*1282*/{0x1EBA,0x0,0x1EBA}/* 1EBB */,/*1283*/{0x0,0x1EBD,0x0}/* 1EBC */,/*1284*/{0x1EBC,0x0,0x1EBC}/* 1EBD */, /*1285*/{0x0,0x1EBF,0x0}/* 1EBE */,/*1286*/{0x1EBE,0x0,0x1EBE}/* 1EBF */,/*1287*/{0x0,0x1EC1,0x0}/* 1EC0 */, /*1288*/{0x1EC0,0x0,0x1EC0}/* 1EC1 */,/*1289*/{0x0,0x1EC3,0x0}/* 1EC2 */,/*1290*/{0x1EC2,0x0,0x1EC2}/* 1EC3 */, /*1291*/{0x0,0x1EC5,0x0}/* 1EC4 */,/*1292*/{0x1EC4,0x0,0x1EC4}/* 1EC5 */,/*1293*/{0x0,0x1EC7,0x0}/* 1EC6 */, /*1294*/{0x1EC6,0x0,0x1EC6}/* 1EC7 */,/*1295*/{0x0,0x1EC9,0x0}/* 1EC8 */,/*1296*/{0x1EC8,0x0,0x1EC8}/* 1EC9 */, /*1297*/{0x0,0x1ECB,0x0}/* 1ECA */,/*1298*/{0x1ECA,0x0,0x1ECA}/* 1ECB */,/*1299*/{0x0,0x1ECD,0x0}/* 1ECC */, /*1300*/{0x1ECC,0x0,0x1ECC}/* 1ECD */,/*1301*/{0x0,0x1ECF,0x0}/* 1ECE */,/*1302*/{0x1ECE,0x0,0x1ECE}/* 1ECF */, /*1303*/{0x0,0x1ED1,0x0}/* 1ED0 */,/*1304*/{0x1ED0,0x0,0x1ED0}/* 1ED1 */,/*1305*/{0x0,0x1ED3,0x0}/* 1ED2 */, /*1306*/{0x1ED2,0x0,0x1ED2}/* 1ED3 */,/*1307*/{0x0,0x1ED5,0x0}/* 1ED4 */,/*1308*/{0x1ED4,0x0,0x1ED4}/* 1ED5 */, /*1309*/{0x0,0x1ED7,0x0}/* 1ED6 */,/*1310*/{0x1ED6,0x0,0x1ED6}/* 1ED7 */,/*1311*/{0x0,0x1ED9,0x0}/* 1ED8 */, /*1312*/{0x1ED8,0x0,0x1ED8}/* 1ED9 */,/*1313*/{0x0,0x1EDB,0x0}/* 1EDA */,/*1314*/{0x1EDA,0x0,0x1EDA}/* 1EDB */, /*1315*/{0x0,0x1EDD,0x0}/* 1EDC */,/*1316*/{0x1EDC,0x0,0x1EDC}/* 1EDD */,/*1317*/{0x0,0x1EDF,0x0}/* 1EDE */, /*1318*/{0x1EDE,0x0,0x1EDE}/* 1EDF */,/*1319*/{0x0,0x1EE1,0x0}/* 1EE0 */,/*1320*/{0x1EE0,0x0,0x1EE0}/* 1EE1 */, /*1321*/{0x0,0x1EE3,0x0}/* 1EE2 */,/*1322*/{0x1EE2,0x0,0x1EE2}/* 1EE3 */,/*1323*/{0x0,0x1EE5,0x0}/* 1EE4 */, /*1324*/{0x1EE4,0x0,0x1EE4}/* 1EE5 */,/*1325*/{0x0,0x1EE7,0x0}/* 1EE6 */,/*1326*/{0x1EE6,0x0,0x1EE6}/* 1EE7 */, /*1327*/{0x0,0x1EE9,0x0}/* 1EE8 */,/*1328*/{0x1EE8,0x0,0x1EE8}/* 1EE9 */,/*1329*/{0x0,0x1EEB,0x0}/* 1EEA */, /*1330*/{0x1EEA,0x0,0x1EEA}/* 1EEB */,/*1331*/{0x0,0x1EED,0x0}/* 1EEC */,/*1332*/{0x1EEC,0x0,0x1EEC}/* 1EED */, /*1333*/{0x0,0x1EEF,0x0}/* 1EEE */,/*1334*/{0x1EEE,0x0,0x1EEE}/* 1EEF */,/*1335*/{0x0,0x1EF1,0x0}/* 1EF0 */, /*1336*/{0x1EF0,0x0,0x1EF0}/* 1EF1 */,/*1337*/{0x0,0x1EF3,0x0}/* 1EF2 */,/*1338*/{0x1EF2,0x0,0x1EF2}/* 1EF3 */, /*1339*/{0x0,0x1EF5,0x0}/* 1EF4 */,/*1340*/{0x1EF4,0x0,0x1EF4}/* 1EF5 */,/*1341*/{0x0,0x1EF7,0x0}/* 1EF6 */, /*1342*/{0x1EF6,0x0,0x1EF6}/* 1EF7 */,/*1343*/{0x0,0x1EF9,0x0}/* 1EF8 */,/*1344*/{0x1EF8,0x0,0x1EF8}/* 1EF9 */, /*1345*/{0x0,0x1EFB,0x0}/* 1EFA */,/*1346*/{0x1EFA,0x0,0x1EFA}/* 1EFB */,/*1347*/{0x0,0x1EFD,0x0}/* 1EFC */, /*1348*/{0x1EFC,0x0,0x1EFC}/* 1EFD */,/*1349*/{0x0,0x1EFF,0x0}/* 1EFE */,/*1350*/{0x1EFE,0x0,0x1EFE}/* 1EFF */, /*1351*/{0x1F08,0x0,0x1F08}/* 1F00 */,/*1352*/{0x1F09,0x0,0x1F09}/* 1F01 */,/*1353*/{0x1F0A,0x0,0x1F0A}/* 1F02 */, /*1354*/{0x1F0B,0x0,0x1F0B}/* 1F03 */,/*1355*/{0x1F0C,0x0,0x1F0C}/* 1F04 */,/*1356*/{0x1F0D,0x0,0x1F0D}/* 1F05 */, /*1357*/{0x1F0E,0x0,0x1F0E}/* 1F06 */,/*1358*/{0x1F0F,0x0,0x1F0F}/* 1F07 */,/*1359*/{0x0,0x1F00,0x0}/* 1F08 */, /*1360*/{0x0,0x1F01,0x0}/* 1F09 */,/*1361*/{0x0,0x1F02,0x0}/* 1F0A */,/*1362*/{0x0,0x1F03,0x0}/* 1F0B */, /*1363*/{0x0,0x1F04,0x0}/* 1F0C */,/*1364*/{0x0,0x1F05,0x0}/* 1F0D */,/*1365*/{0x0,0x1F06,0x0}/* 1F0E */, /*1366*/{0x0,0x1F07,0x0}/* 1F0F */,/*1367*/{0x1F18,0x0,0x1F18}/* 1F10 */,/*1368*/{0x1F19,0x0,0x1F19}/* 1F11 */, /*1369*/{0x1F1A,0x0,0x1F1A}/* 1F12 */,/*1370*/{0x1F1B,0x0,0x1F1B}/* 1F13 */,/*1371*/{0x1F1C,0x0,0x1F1C}/* 1F14 */, /*1372*/{0x1F1D,0x0,0x1F1D}/* 1F15 */,/*1373*/{0x0,0x1F10,0x0}/* 1F18 */,/*1374*/{0x0,0x1F11,0x0}/* 1F19 */, /*1375*/{0x0,0x1F12,0x0}/* 1F1A */,/*1376*/{0x0,0x1F13,0x0}/* 1F1B */,/*1377*/{0x0,0x1F14,0x0}/* 1F1C */, /*1378*/{0x0,0x1F15,0x0}/* 1F1D */,/*1379*/{0x1F28,0x0,0x1F28}/* 1F20 */,/*1380*/{0x1F29,0x0,0x1F29}/* 1F21 */, /*1381*/{0x1F2A,0x0,0x1F2A}/* 1F22 */,/*1382*/{0x1F2B,0x0,0x1F2B}/* 1F23 */,/*1383*/{0x1F2C,0x0,0x1F2C}/* 1F24 */, /*1384*/{0x1F2D,0x0,0x1F2D}/* 1F25 */,/*1385*/{0x1F2E,0x0,0x1F2E}/* 1F26 */,/*1386*/{0x1F2F,0x0,0x1F2F}/* 1F27 */, /*1387*/{0x0,0x1F20,0x0}/* 1F28 */,/*1388*/{0x0,0x1F21,0x0}/* 1F29 */,/*1389*/{0x0,0x1F22,0x0}/* 1F2A */, /*1390*/{0x0,0x1F23,0x0}/* 1F2B */,/*1391*/{0x0,0x1F24,0x0}/* 1F2C */,/*1392*/{0x0,0x1F25,0x0}/* 1F2D */, /*1393*/{0x0,0x1F26,0x0}/* 1F2E */,/*1394*/{0x0,0x1F27,0x0}/* 1F2F */,/*1395*/{0x1F38,0x0,0x1F38}/* 1F30 */, /*1396*/{0x1F39,0x0,0x1F39}/* 1F31 */,/*1397*/{0x1F3A,0x0,0x1F3A}/* 1F32 */,/*1398*/{0x1F3B,0x0,0x1F3B}/* 1F33 */, /*1399*/{0x1F3C,0x0,0x1F3C}/* 1F34 */,/*1400*/{0x1F3D,0x0,0x1F3D}/* 1F35 */,/*1401*/{0x1F3E,0x0,0x1F3E}/* 1F36 */, /*1402*/{0x1F3F,0x0,0x1F3F}/* 1F37 */,/*1403*/{0x0,0x1F30,0x0}/* 1F38 */,/*1404*/{0x0,0x1F31,0x0}/* 1F39 */, /*1405*/{0x0,0x1F32,0x0}/* 1F3A */,/*1406*/{0x0,0x1F33,0x0}/* 1F3B */,/*1407*/{0x0,0x1F34,0x0}/* 1F3C */, /*1408*/{0x0,0x1F35,0x0}/* 1F3D */,/*1409*/{0x0,0x1F36,0x0}/* 1F3E */,/*1410*/{0x0,0x1F37,0x0}/* 1F3F */, /*1411*/{0x1F48,0x0,0x1F48}/* 1F40 */,/*1412*/{0x1F49,0x0,0x1F49}/* 1F41 */,/*1413*/{0x1F4A,0x0,0x1F4A}/* 1F42 */, /*1414*/{0x1F4B,0x0,0x1F4B}/* 1F43 */,/*1415*/{0x1F4C,0x0,0x1F4C}/* 1F44 */,/*1416*/{0x1F4D,0x0,0x1F4D}/* 1F45 */, /*1417*/{0x0,0x1F40,0x0}/* 1F48 */,/*1418*/{0x0,0x1F41,0x0}/* 1F49 */,/*1419*/{0x0,0x1F42,0x0}/* 1F4A */, /*1420*/{0x0,0x1F43,0x0}/* 1F4B */,/*1421*/{0x0,0x1F44,0x0}/* 1F4C */,/*1422*/{0x0,0x1F45,0x0}/* 1F4D */, /*1423*/{0x1F59,0x0,0x1F59}/* 1F51 */,/*1424*/{0x1F5B,0x0,0x1F5B}/* 1F53 */,/*1425*/{0x1F5D,0x0,0x1F5D}/* 1F55 */, /*1426*/{0x1F5F,0x0,0x1F5F}/* 1F57 */,/*1427*/{0x0,0x1F51,0x0}/* 1F59 */,/*1428*/{0x0,0x1F53,0x0}/* 1F5B */, /*1429*/{0x0,0x1F55,0x0}/* 1F5D */,/*1430*/{0x0,0x1F57,0x0}/* 1F5F */,/*1431*/{0x1F68,0x0,0x1F68}/* 1F60 */, /*1432*/{0x1F69,0x0,0x1F69}/* 1F61 */,/*1433*/{0x1F6A,0x0,0x1F6A}/* 1F62 */,/*1434*/{0x1F6B,0x0,0x1F6B}/* 1F63 */, /*1435*/{0x1F6C,0x0,0x1F6C}/* 1F64 */,/*1436*/{0x1F6D,0x0,0x1F6D}/* 1F65 */,/*1437*/{0x1F6E,0x0,0x1F6E}/* 1F66 */, /*1438*/{0x1F6F,0x0,0x1F6F}/* 1F67 */,/*1439*/{0x0,0x1F60,0x0}/* 1F68 */,/*1440*/{0x0,0x1F61,0x0}/* 1F69 */, /*1441*/{0x0,0x1F62,0x0}/* 1F6A */,/*1442*/{0x0,0x1F63,0x0}/* 1F6B */,/*1443*/{0x0,0x1F64,0x0}/* 1F6C */, /*1444*/{0x0,0x1F65,0x0}/* 1F6D */,/*1445*/{0x0,0x1F66,0x0}/* 1F6E */,/*1446*/{0x0,0x1F67,0x0}/* 1F6F */, /*1447*/{0x1FBA,0x0,0x1FBA}/* 1F70 */,/*1448*/{0x1FBB,0x0,0x1FBB}/* 1F71 */,/*1449*/{0x1FC8,0x0,0x1FC8}/* 1F72 */, /*1450*/{0x1FC9,0x0,0x1FC9}/* 1F73 */,/*1451*/{0x1FCA,0x0,0x1FCA}/* 1F74 */,/*1452*/{0x1FCB,0x0,0x1FCB}/* 1F75 */, /*1453*/{0x1FDA,0x0,0x1FDA}/* 1F76 */,/*1454*/{0x1FDB,0x0,0x1FDB}/* 1F77 */,/*1455*/{0x1FF8,0x0,0x1FF8}/* 1F78 */, /*1456*/{0x1FF9,0x0,0x1FF9}/* 1F79 */,/*1457*/{0x1FEA,0x0,0x1FEA}/* 1F7A */,/*1458*/{0x1FEB,0x0,0x1FEB}/* 1F7B */, /*1459*/{0x1FFA,0x0,0x1FFA}/* 1F7C */,/*1460*/{0x1FFB,0x0,0x1FFB}/* 1F7D */,/*1461*/{0x1F88,0x0,0x1F88}/* 1F80 */, /*1462*/{0x1F89,0x0,0x1F89}/* 1F81 */,/*1463*/{0x1F8A,0x0,0x1F8A}/* 1F82 */,/*1464*/{0x1F8B,0x0,0x1F8B}/* 1F83 */, /*1465*/{0x1F8C,0x0,0x1F8C}/* 1F84 */,/*1466*/{0x1F8D,0x0,0x1F8D}/* 1F85 */,/*1467*/{0x1F8E,0x0,0x1F8E}/* 1F86 */, /*1468*/{0x1F8F,0x0,0x1F8F}/* 1F87 */,/*1469*/{0x0,0x1F80,0x0}/* 1F88 */,/*1470*/{0x0,0x1F81,0x0}/* 1F89 */, /*1471*/{0x0,0x1F82,0x0}/* 1F8A */,/*1472*/{0x0,0x1F83,0x0}/* 1F8B */,/*1473*/{0x0,0x1F84,0x0}/* 1F8C */, /*1474*/{0x0,0x1F85,0x0}/* 1F8D */,/*1475*/{0x0,0x1F86,0x0}/* 1F8E */,/*1476*/{0x0,0x1F87,0x0}/* 1F8F */, /*1477*/{0x1F98,0x0,0x1F98}/* 1F90 */,/*1478*/{0x1F99,0x0,0x1F99}/* 1F91 */,/*1479*/{0x1F9A,0x0,0x1F9A}/* 1F92 */, /*1480*/{0x1F9B,0x0,0x1F9B}/* 1F93 */,/*1481*/{0x1F9C,0x0,0x1F9C}/* 1F94 */,/*1482*/{0x1F9D,0x0,0x1F9D}/* 1F95 */, /*1483*/{0x1F9E,0x0,0x1F9E}/* 1F96 */,/*1484*/{0x1F9F,0x0,0x1F9F}/* 1F97 */,/*1485*/{0x0,0x1F90,0x0}/* 1F98 */, /*1486*/{0x0,0x1F91,0x0}/* 1F99 */,/*1487*/{0x0,0x1F92,0x0}/* 1F9A */,/*1488*/{0x0,0x1F93,0x0}/* 1F9B */, /*1489*/{0x0,0x1F94,0x0}/* 1F9C */,/*1490*/{0x0,0x1F95,0x0}/* 1F9D */,/*1491*/{0x0,0x1F96,0x0}/* 1F9E */, /*1492*/{0x0,0x1F97,0x0}/* 1F9F */,/*1493*/{0x1FA8,0x0,0x1FA8}/* 1FA0 */,/*1494*/{0x1FA9,0x0,0x1FA9}/* 1FA1 */, /*1495*/{0x1FAA,0x0,0x1FAA}/* 1FA2 */,/*1496*/{0x1FAB,0x0,0x1FAB}/* 1FA3 */,/*1497*/{0x1FAC,0x0,0x1FAC}/* 1FA4 */, /*1498*/{0x1FAD,0x0,0x1FAD}/* 1FA5 */,/*1499*/{0x1FAE,0x0,0x1FAE}/* 1FA6 */,/*1500*/{0x1FAF,0x0,0x1FAF}/* 1FA7 */, /*1501*/{0x0,0x1FA0,0x0}/* 1FA8 */,/*1502*/{0x0,0x1FA1,0x0}/* 1FA9 */,/*1503*/{0x0,0x1FA2,0x0}/* 1FAA */, /*1504*/{0x0,0x1FA3,0x0}/* 1FAB */,/*1505*/{0x0,0x1FA4,0x0}/* 1FAC */,/*1506*/{0x0,0x1FA5,0x0}/* 1FAD */, /*1507*/{0x0,0x1FA6,0x0}/* 1FAE */,/*1508*/{0x0,0x1FA7,0x0}/* 1FAF */,/*1509*/{0x1FB8,0x0,0x1FB8}/* 1FB0 */, /*1510*/{0x1FB9,0x0,0x1FB9}/* 1FB1 */,/*1511*/{0x1FBC,0x0,0x1FBC}/* 1FB3 */,/*1512*/{0x0,0x1FB0,0x0}/* 1FB8 */, /*1513*/{0x0,0x1FB1,0x0}/* 1FB9 */,/*1514*/{0x0,0x1F70,0x0}/* 1FBA */,/*1515*/{0x0,0x1F71,0x0}/* 1FBB */, /*1516*/{0x0,0x1FB3,0x0}/* 1FBC */,/*1517*/{0x0399,0x0,0x0399}/* 1FBE */,/*1518*/{0x1FCC,0x0,0x1FCC}/* 1FC3 */, /*1519*/{0x0,0x1F72,0x0}/* 1FC8 */,/*1520*/{0x0,0x1F73,0x0}/* 1FC9 */,/*1521*/{0x0,0x1F74,0x0}/* 1FCA */, /*1522*/{0x0,0x1F75,0x0}/* 1FCB */,/*1523*/{0x0,0x1FC3,0x0}/* 1FCC */,/*1524*/{0x1FD8,0x0,0x1FD8}/* 1FD0 */, /*1525*/{0x1FD9,0x0,0x1FD9}/* 1FD1 */,/*1526*/{0x0,0x1FD0,0x0}/* 1FD8 */,/*1527*/{0x0,0x1FD1,0x0}/* 1FD9 */, /*1528*/{0x0,0x1F76,0x0}/* 1FDA */,/*1529*/{0x0,0x1F77,0x0}/* 1FDB */,/*1530*/{0x1FE8,0x0,0x1FE8}/* 1FE0 */, /*1531*/{0x1FE9,0x0,0x1FE9}/* 1FE1 */,/*1532*/{0x1FEC,0x0,0x1FEC}/* 1FE5 */,/*1533*/{0x0,0x1FE0,0x0}/* 1FE8 */, /*1534*/{0x0,0x1FE1,0x0}/* 1FE9 */,/*1535*/{0x0,0x1F7A,0x0}/* 1FEA */,/*1536*/{0x0,0x1F7B,0x0}/* 1FEB */, /*1537*/{0x0,0x1FE5,0x0}/* 1FEC */,/*1538*/{0x1FFC,0x0,0x1FFC}/* 1FF3 */,/*1539*/{0x0,0x1F78,0x0}/* 1FF8 */, /*1540*/{0x0,0x1F79,0x0}/* 1FF9 */,/*1541*/{0x0,0x1F7C,0x0}/* 1FFA */,/*1542*/{0x0,0x1F7D,0x0}/* 1FFB */, /*1543*/{0x0,0x1FF3,0x0}/* 1FFC */,/*1544*/{0x0,0x03C9,0x0}/* 2126 */,/*1545*/{0x0,0x006B,0x0}/* 212A */, /*1546*/{0x0,0x00E5,0x0}/* 212B */,/*1547*/{0x0,0x214E,0x0}/* 2132 */,/*1548*/{0x2132,0x0,0x2132}/* 214E */, /*1549*/{0x0,0x2170,0x0}/* 2160 */,/*1550*/{0x0,0x2171,0x0}/* 2161 */,/*1551*/{0x0,0x2172,0x0}/* 2162 */, /*1552*/{0x0,0x2173,0x0}/* 2163 */,/*1553*/{0x0,0x2174,0x0}/* 2164 */,/*1554*/{0x0,0x2175,0x0}/* 2165 */, /*1555*/{0x0,0x2176,0x0}/* 2166 */,/*1556*/{0x0,0x2177,0x0}/* 2167 */,/*1557*/{0x0,0x2178,0x0}/* 2168 */, /*1558*/{0x0,0x2179,0x0}/* 2169 */,/*1559*/{0x0,0x217A,0x0}/* 216A */,/*1560*/{0x0,0x217B,0x0}/* 216B */, /*1561*/{0x0,0x217C,0x0}/* 216C */,/*1562*/{0x0,0x217D,0x0}/* 216D */,/*1563*/{0x0,0x217E,0x0}/* 216E */, /*1564*/{0x0,0x217F,0x0}/* 216F */,/*1565*/{0x2160,0x0,0x2160}/* 2170 */,/*1566*/{0x2161,0x0,0x2161}/* 2171 */, /*1567*/{0x2162,0x0,0x2162}/* 2172 */,/*1568*/{0x2163,0x0,0x2163}/* 2173 */,/*1569*/{0x2164,0x0,0x2164}/* 2174 */, /*1570*/{0x2165,0x0,0x2165}/* 2175 */,/*1571*/{0x2166,0x0,0x2166}/* 2176 */,/*1572*/{0x2167,0x0,0x2167}/* 2177 */, /*1573*/{0x2168,0x0,0x2168}/* 2178 */,/*1574*/{0x2169,0x0,0x2169}/* 2179 */,/*1575*/{0x216A,0x0,0x216A}/* 217A */, /*1576*/{0x216B,0x0,0x216B}/* 217B */,/*1577*/{0x216C,0x0,0x216C}/* 217C */,/*1578*/{0x216D,0x0,0x216D}/* 217D */, /*1579*/{0x216E,0x0,0x216E}/* 217E */,/*1580*/{0x216F,0x0,0x216F}/* 217F */,/*1581*/{0x0,0x2184,0x0}/* 2183 */, /*1582*/{0x2183,0x0,0x2183}/* 2184 */,/*1583*/{0x0,0x24D0,0x0}/* 24B6 */,/*1584*/{0x0,0x24D1,0x0}/* 24B7 */, /*1585*/{0x0,0x24D2,0x0}/* 24B8 */,/*1586*/{0x0,0x24D3,0x0}/* 24B9 */,/*1587*/{0x0,0x24D4,0x0}/* 24BA */, /*1588*/{0x0,0x24D5,0x0}/* 24BB */,/*1589*/{0x0,0x24D6,0x0}/* 24BC */,/*1590*/{0x0,0x24D7,0x0}/* 24BD */, /*1591*/{0x0,0x24D8,0x0}/* 24BE */,/*1592*/{0x0,0x24D9,0x0}/* 24BF */,/*1593*/{0x0,0x24DA,0x0}/* 24C0 */, /*1594*/{0x0,0x24DB,0x0}/* 24C1 */,/*1595*/{0x0,0x24DC,0x0}/* 24C2 */,/*1596*/{0x0,0x24DD,0x0}/* 24C3 */, /*1597*/{0x0,0x24DE,0x0}/* 24C4 */,/*1598*/{0x0,0x24DF,0x0}/* 24C5 */,/*1599*/{0x0,0x24E0,0x0}/* 24C6 */, /*1600*/{0x0,0x24E1,0x0}/* 24C7 */,/*1601*/{0x0,0x24E2,0x0}/* 24C8 */,/*1602*/{0x0,0x24E3,0x0}/* 24C9 */, /*1603*/{0x0,0x24E4,0x0}/* 24CA */,/*1604*/{0x0,0x24E5,0x0}/* 24CB */,/*1605*/{0x0,0x24E6,0x0}/* 24CC */, /*1606*/{0x0,0x24E7,0x0}/* 24CD */,/*1607*/{0x0,0x24E8,0x0}/* 24CE */,/*1608*/{0x0,0x24E9,0x0}/* 24CF */, /*1609*/{0x24B6,0x0,0x24B6}/* 24D0 */,/*1610*/{0x24B7,0x0,0x24B7}/* 24D1 */,/*1611*/{0x24B8,0x0,0x24B8}/* 24D2 */, /*1612*/{0x24B9,0x0,0x24B9}/* 24D3 */,/*1613*/{0x24BA,0x0,0x24BA}/* 24D4 */,/*1614*/{0x24BB,0x0,0x24BB}/* 24D5 */, /*1615*/{0x24BC,0x0,0x24BC}/* 24D6 */,/*1616*/{0x24BD,0x0,0x24BD}/* 24D7 */,/*1617*/{0x24BE,0x0,0x24BE}/* 24D8 */, /*1618*/{0x24BF,0x0,0x24BF}/* 24D9 */,/*1619*/{0x24C0,0x0,0x24C0}/* 24DA */,/*1620*/{0x24C1,0x0,0x24C1}/* 24DB */, /*1621*/{0x24C2,0x0,0x24C2}/* 24DC */,/*1622*/{0x24C3,0x0,0x24C3}/* 24DD */,/*1623*/{0x24C4,0x0,0x24C4}/* 24DE */, /*1624*/{0x24C5,0x0,0x24C5}/* 24DF */,/*1625*/{0x24C6,0x0,0x24C6}/* 24E0 */,/*1626*/{0x24C7,0x0,0x24C7}/* 24E1 */, /*1627*/{0x24C8,0x0,0x24C8}/* 24E2 */,/*1628*/{0x24C9,0x0,0x24C9}/* 24E3 */,/*1629*/{0x24CA,0x0,0x24CA}/* 24E4 */, /*1630*/{0x24CB,0x0,0x24CB}/* 24E5 */,/*1631*/{0x24CC,0x0,0x24CC}/* 24E6 */,/*1632*/{0x24CD,0x0,0x24CD}/* 24E7 */, /*1633*/{0x24CE,0x0,0x24CE}/* 24E8 */,/*1634*/{0x24CF,0x0,0x24CF}/* 24E9 */,/*1635*/{0x0,0x2C30,0x0}/* 2C00 */, /*1636*/{0x0,0x2C31,0x0}/* 2C01 */,/*1637*/{0x0,0x2C32,0x0}/* 2C02 */,/*1638*/{0x0,0x2C33,0x0}/* 2C03 */, /*1639*/{0x0,0x2C34,0x0}/* 2C04 */,/*1640*/{0x0,0x2C35,0x0}/* 2C05 */,/*1641*/{0x0,0x2C36,0x0}/* 2C06 */, /*1642*/{0x0,0x2C37,0x0}/* 2C07 */,/*1643*/{0x0,0x2C38,0x0}/* 2C08 */,/*1644*/{0x0,0x2C39,0x0}/* 2C09 */, /*1645*/{0x0,0x2C3A,0x0}/* 2C0A */,/*1646*/{0x0,0x2C3B,0x0}/* 2C0B */,/*1647*/{0x0,0x2C3C,0x0}/* 2C0C */, /*1648*/{0x0,0x2C3D,0x0}/* 2C0D */,/*1649*/{0x0,0x2C3E,0x0}/* 2C0E */,/*1650*/{0x0,0x2C3F,0x0}/* 2C0F */, /*1651*/{0x0,0x2C40,0x0}/* 2C10 */,/*1652*/{0x0,0x2C41,0x0}/* 2C11 */,/*1653*/{0x0,0x2C42,0x0}/* 2C12 */, /*1654*/{0x0,0x2C43,0x0}/* 2C13 */,/*1655*/{0x0,0x2C44,0x0}/* 2C14 */,/*1656*/{0x0,0x2C45,0x0}/* 2C15 */, /*1657*/{0x0,0x2C46,0x0}/* 2C16 */,/*1658*/{0x0,0x2C47,0x0}/* 2C17 */,/*1659*/{0x0,0x2C48,0x0}/* 2C18 */, /*1660*/{0x0,0x2C49,0x0}/* 2C19 */,/*1661*/{0x0,0x2C4A,0x0}/* 2C1A */,/*1662*/{0x0,0x2C4B,0x0}/* 2C1B */, /*1663*/{0x0,0x2C4C,0x0}/* 2C1C */,/*1664*/{0x0,0x2C4D,0x0}/* 2C1D */,/*1665*/{0x0,0x2C4E,0x0}/* 2C1E */, /*1666*/{0x0,0x2C4F,0x0}/* 2C1F */,/*1667*/{0x0,0x2C50,0x0}/* 2C20 */,/*1668*/{0x0,0x2C51,0x0}/* 2C21 */, /*1669*/{0x0,0x2C52,0x0}/* 2C22 */,/*1670*/{0x0,0x2C53,0x0}/* 2C23 */,/*1671*/{0x0,0x2C54,0x0}/* 2C24 */, /*1672*/{0x0,0x2C55,0x0}/* 2C25 */,/*1673*/{0x0,0x2C56,0x0}/* 2C26 */,/*1674*/{0x0,0x2C57,0x0}/* 2C27 */, /*1675*/{0x0,0x2C58,0x0}/* 2C28 */,/*1676*/{0x0,0x2C59,0x0}/* 2C29 */,/*1677*/{0x0,0x2C5A,0x0}/* 2C2A */, /*1678*/{0x0,0x2C5B,0x0}/* 2C2B */,/*1679*/{0x0,0x2C5C,0x0}/* 2C2C */,/*1680*/{0x0,0x2C5D,0x0}/* 2C2D */, /*1681*/{0x0,0x2C5E,0x0}/* 2C2E */,/*1682*/{0x2C00,0x0,0x2C00}/* 2C30 */,/*1683*/{0x2C01,0x0,0x2C01}/* 2C31 */, /*1684*/{0x2C02,0x0,0x2C02}/* 2C32 */,/*1685*/{0x2C03,0x0,0x2C03}/* 2C33 */,/*1686*/{0x2C04,0x0,0x2C04}/* 2C34 */, /*1687*/{0x2C05,0x0,0x2C05}/* 2C35 */,/*1688*/{0x2C06,0x0,0x2C06}/* 2C36 */,/*1689*/{0x2C07,0x0,0x2C07}/* 2C37 */, /*1690*/{0x2C08,0x0,0x2C08}/* 2C38 */,/*1691*/{0x2C09,0x0,0x2C09}/* 2C39 */,/*1692*/{0x2C0A,0x0,0x2C0A}/* 2C3A */, /*1693*/{0x2C0B,0x0,0x2C0B}/* 2C3B */,/*1694*/{0x2C0C,0x0,0x2C0C}/* 2C3C */,/*1695*/{0x2C0D,0x0,0x2C0D}/* 2C3D */, /*1696*/{0x2C0E,0x0,0x2C0E}/* 2C3E */,/*1697*/{0x2C0F,0x0,0x2C0F}/* 2C3F */,/*1698*/{0x2C10,0x0,0x2C10}/* 2C40 */, /*1699*/{0x2C11,0x0,0x2C11}/* 2C41 */,/*1700*/{0x2C12,0x0,0x2C12}/* 2C42 */,/*1701*/{0x2C13,0x0,0x2C13}/* 2C43 */, /*1702*/{0x2C14,0x0,0x2C14}/* 2C44 */,/*1703*/{0x2C15,0x0,0x2C15}/* 2C45 */,/*1704*/{0x2C16,0x0,0x2C16}/* 2C46 */, /*1705*/{0x2C17,0x0,0x2C17}/* 2C47 */,/*1706*/{0x2C18,0x0,0x2C18}/* 2C48 */,/*1707*/{0x2C19,0x0,0x2C19}/* 2C49 */, /*1708*/{0x2C1A,0x0,0x2C1A}/* 2C4A */,/*1709*/{0x2C1B,0x0,0x2C1B}/* 2C4B */,/*1710*/{0x2C1C,0x0,0x2C1C}/* 2C4C */, /*1711*/{0x2C1D,0x0,0x2C1D}/* 2C4D */,/*1712*/{0x2C1E,0x0,0x2C1E}/* 2C4E */,/*1713*/{0x2C1F,0x0,0x2C1F}/* 2C4F */, /*1714*/{0x2C20,0x0,0x2C20}/* 2C50 */,/*1715*/{0x2C21,0x0,0x2C21}/* 2C51 */,/*1716*/{0x2C22,0x0,0x2C22}/* 2C52 */, /*1717*/{0x2C23,0x0,0x2C23}/* 2C53 */,/*1718*/{0x2C24,0x0,0x2C24}/* 2C54 */,/*1719*/{0x2C25,0x0,0x2C25}/* 2C55 */, /*1720*/{0x2C26,0x0,0x2C26}/* 2C56 */,/*1721*/{0x2C27,0x0,0x2C27}/* 2C57 */,/*1722*/{0x2C28,0x0,0x2C28}/* 2C58 */, /*1723*/{0x2C29,0x0,0x2C29}/* 2C59 */,/*1724*/{0x2C2A,0x0,0x2C2A}/* 2C5A */,/*1725*/{0x2C2B,0x0,0x2C2B}/* 2C5B */, /*1726*/{0x2C2C,0x0,0x2C2C}/* 2C5C */,/*1727*/{0x2C2D,0x0,0x2C2D}/* 2C5D */,/*1728*/{0x2C2E,0x0,0x2C2E}/* 2C5E */, /*1729*/{0x0,0x2C61,0x0}/* 2C60 */,/*1730*/{0x2C60,0x0,0x2C60}/* 2C61 */,/*1731*/{0x0,0x026B,0x0}/* 2C62 */, /*1732*/{0x0,0x1D7D,0x0}/* 2C63 */,/*1733*/{0x0,0x027D,0x0}/* 2C64 */,/*1734*/{0x023A,0x0,0x023A}/* 2C65 */, /*1735*/{0x023E,0x0,0x023E}/* 2C66 */,/*1736*/{0x0,0x2C68,0x0}/* 2C67 */,/*1737*/{0x2C67,0x0,0x2C67}/* 2C68 */, /*1738*/{0x0,0x2C6A,0x0}/* 2C69 */,/*1739*/{0x2C69,0x0,0x2C69}/* 2C6A */,/*1740*/{0x0,0x2C6C,0x0}/* 2C6B */, /*1741*/{0x2C6B,0x0,0x2C6B}/* 2C6C */,/*1742*/{0x0,0x0251,0x0}/* 2C6D */,/*1743*/{0x0,0x0271,0x0}/* 2C6E */, /*1744*/{0x0,0x0250,0x0}/* 2C6F */,/*1745*/{0x0,0x0252,0x0}/* 2C70 */,/*1746*/{0x0,0x2C73,0x0}/* 2C72 */, /*1747*/{0x2C72,0x0,0x2C72}/* 2C73 */,/*1748*/{0x0,0x2C76,0x0}/* 2C75 */,/*1749*/{0x2C75,0x0,0x2C75}/* 2C76 */, /*1750*/{0x0,0x023F,0x0}/* 2C7E */,/*1751*/{0x0,0x0240,0x0}/* 2C7F */,/*1752*/{0x0,0x2C81,0x0}/* 2C80 */, /*1753*/{0x2C80,0x0,0x2C80}/* 2C81 */,/*1754*/{0x0,0x2C83,0x0}/* 2C82 */,/*1755*/{0x2C82,0x0,0x2C82}/* 2C83 */, /*1756*/{0x0,0x2C85,0x0}/* 2C84 */,/*1757*/{0x2C84,0x0,0x2C84}/* 2C85 */,/*1758*/{0x0,0x2C87,0x0}/* 2C86 */, /*1759*/{0x2C86,0x0,0x2C86}/* 2C87 */,/*1760*/{0x0,0x2C89,0x0}/* 2C88 */,/*1761*/{0x2C88,0x0,0x2C88}/* 2C89 */, /*1762*/{0x0,0x2C8B,0x0}/* 2C8A */,/*1763*/{0x2C8A,0x0,0x2C8A}/* 2C8B */,/*1764*/{0x0,0x2C8D,0x0}/* 2C8C */, /*1765*/{0x2C8C,0x0,0x2C8C}/* 2C8D */,/*1766*/{0x0,0x2C8F,0x0}/* 2C8E */,/*1767*/{0x2C8E,0x0,0x2C8E}/* 2C8F */, /*1768*/{0x0,0x2C91,0x0}/* 2C90 */,/*1769*/{0x2C90,0x0,0x2C90}/* 2C91 */,/*1770*/{0x0,0x2C93,0x0}/* 2C92 */, /*1771*/{0x2C92,0x0,0x2C92}/* 2C93 */,/*1772*/{0x0,0x2C95,0x0}/* 2C94 */,/*1773*/{0x2C94,0x0,0x2C94}/* 2C95 */, /*1774*/{0x0,0x2C97,0x0}/* 2C96 */,/*1775*/{0x2C96,0x0,0x2C96}/* 2C97 */,/*1776*/{0x0,0x2C99,0x0}/* 2C98 */, /*1777*/{0x2C98,0x0,0x2C98}/* 2C99 */,/*1778*/{0x0,0x2C9B,0x0}/* 2C9A */,/*1779*/{0x2C9A,0x0,0x2C9A}/* 2C9B */, /*1780*/{0x0,0x2C9D,0x0}/* 2C9C */,/*1781*/{0x2C9C,0x0,0x2C9C}/* 2C9D */,/*1782*/{0x0,0x2C9F,0x0}/* 2C9E */, /*1783*/{0x2C9E,0x0,0x2C9E}/* 2C9F */,/*1784*/{0x0,0x2CA1,0x0}/* 2CA0 */,/*1785*/{0x2CA0,0x0,0x2CA0}/* 2CA1 */, /*1786*/{0x0,0x2CA3,0x0}/* 2CA2 */,/*1787*/{0x2CA2,0x0,0x2CA2}/* 2CA3 */,/*1788*/{0x0,0x2CA5,0x0}/* 2CA4 */, /*1789*/{0x2CA4,0x0,0x2CA4}/* 2CA5 */,/*1790*/{0x0,0x2CA7,0x0}/* 2CA6 */,/*1791*/{0x2CA6,0x0,0x2CA6}/* 2CA7 */, /*1792*/{0x0,0x2CA9,0x0}/* 2CA8 */,/*1793*/{0x2CA8,0x0,0x2CA8}/* 2CA9 */,/*1794*/{0x0,0x2CAB,0x0}/* 2CAA */, /*1795*/{0x2CAA,0x0,0x2CAA}/* 2CAB */,/*1796*/{0x0,0x2CAD,0x0}/* 2CAC */,/*1797*/{0x2CAC,0x0,0x2CAC}/* 2CAD */, /*1798*/{0x0,0x2CAF,0x0}/* 2CAE */,/*1799*/{0x2CAE,0x0,0x2CAE}/* 2CAF */,/*1800*/{0x0,0x2CB1,0x0}/* 2CB0 */, /*1801*/{0x2CB0,0x0,0x2CB0}/* 2CB1 */,/*1802*/{0x0,0x2CB3,0x0}/* 2CB2 */,/*1803*/{0x2CB2,0x0,0x2CB2}/* 2CB3 */, /*1804*/{0x0,0x2CB5,0x0}/* 2CB4 */,/*1805*/{0x2CB4,0x0,0x2CB4}/* 2CB5 */,/*1806*/{0x0,0x2CB7,0x0}/* 2CB6 */, /*1807*/{0x2CB6,0x0,0x2CB6}/* 2CB7 */,/*1808*/{0x0,0x2CB9,0x0}/* 2CB8 */,/*1809*/{0x2CB8,0x0,0x2CB8}/* 2CB9 */, /*1810*/{0x0,0x2CBB,0x0}/* 2CBA */,/*1811*/{0x2CBA,0x0,0x2CBA}/* 2CBB */,/*1812*/{0x0,0x2CBD,0x0}/* 2CBC */, /*1813*/{0x2CBC,0x0,0x2CBC}/* 2CBD */,/*1814*/{0x0,0x2CBF,0x0}/* 2CBE */,/*1815*/{0x2CBE,0x0,0x2CBE}/* 2CBF */, /*1816*/{0x0,0x2CC1,0x0}/* 2CC0 */,/*1817*/{0x2CC0,0x0,0x2CC0}/* 2CC1 */,/*1818*/{0x0,0x2CC3,0x0}/* 2CC2 */, /*1819*/{0x2CC2,0x0,0x2CC2}/* 2CC3 */,/*1820*/{0x0,0x2CC5,0x0}/* 2CC4 */,/*1821*/{0x2CC4,0x0,0x2CC4}/* 2CC5 */, /*1822*/{0x0,0x2CC7,0x0}/* 2CC6 */,/*1823*/{0x2CC6,0x0,0x2CC6}/* 2CC7 */,/*1824*/{0x0,0x2CC9,0x0}/* 2CC8 */, /*1825*/{0x2CC8,0x0,0x2CC8}/* 2CC9 */,/*1826*/{0x0,0x2CCB,0x0}/* 2CCA */,/*1827*/{0x2CCA,0x0,0x2CCA}/* 2CCB */, /*1828*/{0x0,0x2CCD,0x0}/* 2CCC */,/*1829*/{0x2CCC,0x0,0x2CCC}/* 2CCD */,/*1830*/{0x0,0x2CCF,0x0}/* 2CCE */, /*1831*/{0x2CCE,0x0,0x2CCE}/* 2CCF */,/*1832*/{0x0,0x2CD1,0x0}/* 2CD0 */,/*1833*/{0x2CD0,0x0,0x2CD0}/* 2CD1 */, /*1834*/{0x0,0x2CD3,0x0}/* 2CD2 */,/*1835*/{0x2CD2,0x0,0x2CD2}/* 2CD3 */,/*1836*/{0x0,0x2CD5,0x0}/* 2CD4 */, /*1837*/{0x2CD4,0x0,0x2CD4}/* 2CD5 */,/*1838*/{0x0,0x2CD7,0x0}/* 2CD6 */,/*1839*/{0x2CD6,0x0,0x2CD6}/* 2CD7 */, /*1840*/{0x0,0x2CD9,0x0}/* 2CD8 */,/*1841*/{0x2CD8,0x0,0x2CD8}/* 2CD9 */,/*1842*/{0x0,0x2CDB,0x0}/* 2CDA */, /*1843*/{0x2CDA,0x0,0x2CDA}/* 2CDB */,/*1844*/{0x0,0x2CDD,0x0}/* 2CDC */,/*1845*/{0x2CDC,0x0,0x2CDC}/* 2CDD */, /*1846*/{0x0,0x2CDF,0x0}/* 2CDE */,/*1847*/{0x2CDE,0x0,0x2CDE}/* 2CDF */,/*1848*/{0x0,0x2CE1,0x0}/* 2CE0 */, /*1849*/{0x2CE0,0x0,0x2CE0}/* 2CE1 */,/*1850*/{0x0,0x2CE3,0x0}/* 2CE2 */,/*1851*/{0x2CE2,0x0,0x2CE2}/* 2CE3 */, /*1852*/{0x0,0x2CEC,0x0}/* 2CEB */,/*1853*/{0x2CEB,0x0,0x2CEB}/* 2CEC */,/*1854*/{0x0,0x2CEE,0x0}/* 2CED */, /*1855*/{0x2CED,0x0,0x2CED}/* 2CEE */,/*1856*/{0x0,0x2CF3,0x0}/* 2CF2 */,/*1857*/{0x2CF2,0x0,0x2CF2}/* 2CF3 */, /*1858*/{0x10A0,0x0,0x10A0}/* 2D00 */,/*1859*/{0x10A1,0x0,0x10A1}/* 2D01 */,/*1860*/{0x10A2,0x0,0x10A2}/* 2D02 */, /*1861*/{0x10A3,0x0,0x10A3}/* 2D03 */,/*1862*/{0x10A4,0x0,0x10A4}/* 2D04 */,/*1863*/{0x10A5,0x0,0x10A5}/* 2D05 */, /*1864*/{0x10A6,0x0,0x10A6}/* 2D06 */,/*1865*/{0x10A7,0x0,0x10A7}/* 2D07 */,/*1866*/{0x10A8,0x0,0x10A8}/* 2D08 */, /*1867*/{0x10A9,0x0,0x10A9}/* 2D09 */,/*1868*/{0x10AA,0x0,0x10AA}/* 2D0A */,/*1869*/{0x10AB,0x0,0x10AB}/* 2D0B */, /*1870*/{0x10AC,0x0,0x10AC}/* 2D0C */,/*1871*/{0x10AD,0x0,0x10AD}/* 2D0D */,/*1872*/{0x10AE,0x0,0x10AE}/* 2D0E */, /*1873*/{0x10AF,0x0,0x10AF}/* 2D0F */,/*1874*/{0x10B0,0x0,0x10B0}/* 2D10 */,/*1875*/{0x10B1,0x0,0x10B1}/* 2D11 */, /*1876*/{0x10B2,0x0,0x10B2}/* 2D12 */,/*1877*/{0x10B3,0x0,0x10B3}/* 2D13 */,/*1878*/{0x10B4,0x0,0x10B4}/* 2D14 */, /*1879*/{0x10B5,0x0,0x10B5}/* 2D15 */,/*1880*/{0x10B6,0x0,0x10B6}/* 2D16 */,/*1881*/{0x10B7,0x0,0x10B7}/* 2D17 */, /*1882*/{0x10B8,0x0,0x10B8}/* 2D18 */,/*1883*/{0x10B9,0x0,0x10B9}/* 2D19 */,/*1884*/{0x10BA,0x0,0x10BA}/* 2D1A */, /*1885*/{0x10BB,0x0,0x10BB}/* 2D1B */,/*1886*/{0x10BC,0x0,0x10BC}/* 2D1C */,/*1887*/{0x10BD,0x0,0x10BD}/* 2D1D */, /*1888*/{0x10BE,0x0,0x10BE}/* 2D1E */,/*1889*/{0x10BF,0x0,0x10BF}/* 2D1F */,/*1890*/{0x10C0,0x0,0x10C0}/* 2D20 */, /*1891*/{0x10C1,0x0,0x10C1}/* 2D21 */,/*1892*/{0x10C2,0x0,0x10C2}/* 2D22 */,/*1893*/{0x10C3,0x0,0x10C3}/* 2D23 */, /*1894*/{0x10C4,0x0,0x10C4}/* 2D24 */,/*1895*/{0x10C5,0x0,0x10C5}/* 2D25 */,/*1896*/{0x10C7,0x0,0x10C7}/* 2D27 */, /*1897*/{0x10CD,0x0,0x10CD}/* 2D2D */,/*1898*/{0x0,0xA641,0x0}/* A640 */,/*1899*/{0xA640,0x0,0xA640}/* A641 */, /*1900*/{0x0,0xA643,0x0}/* A642 */,/*1901*/{0xA642,0x0,0xA642}/* A643 */,/*1902*/{0x0,0xA645,0x0}/* A644 */, /*1903*/{0xA644,0x0,0xA644}/* A645 */,/*1904*/{0x0,0xA647,0x0}/* A646 */,/*1905*/{0xA646,0x0,0xA646}/* A647 */, /*1906*/{0x0,0xA649,0x0}/* A648 */,/*1907*/{0xA648,0x0,0xA648}/* A649 */,/*1908*/{0x0,0xA64B,0x0}/* A64A */, /*1909*/{0xA64A,0x0,0xA64A}/* A64B */,/*1910*/{0x0,0xA64D,0x0}/* A64C */,/*1911*/{0xA64C,0x0,0xA64C}/* A64D */, /*1912*/{0x0,0xA64F,0x0}/* A64E */,/*1913*/{0xA64E,0x0,0xA64E}/* A64F */,/*1914*/{0x0,0xA651,0x0}/* A650 */, /*1915*/{0xA650,0x0,0xA650}/* A651 */,/*1916*/{0x0,0xA653,0x0}/* A652 */,/*1917*/{0xA652,0x0,0xA652}/* A653 */, /*1918*/{0x0,0xA655,0x0}/* A654 */,/*1919*/{0xA654,0x0,0xA654}/* A655 */,/*1920*/{0x0,0xA657,0x0}/* A656 */, /*1921*/{0xA656,0x0,0xA656}/* A657 */,/*1922*/{0x0,0xA659,0x0}/* A658 */,/*1923*/{0xA658,0x0,0xA658}/* A659 */, /*1924*/{0x0,0xA65B,0x0}/* A65A */,/*1925*/{0xA65A,0x0,0xA65A}/* A65B */,/*1926*/{0x0,0xA65D,0x0}/* A65C */, /*1927*/{0xA65C,0x0,0xA65C}/* A65D */,/*1928*/{0x0,0xA65F,0x0}/* A65E */,/*1929*/{0xA65E,0x0,0xA65E}/* A65F */, /*1930*/{0x0,0xA661,0x0}/* A660 */,/*1931*/{0xA660,0x0,0xA660}/* A661 */,/*1932*/{0x0,0xA663,0x0}/* A662 */, /*1933*/{0xA662,0x0,0xA662}/* A663 */,/*1934*/{0x0,0xA665,0x0}/* A664 */,/*1935*/{0xA664,0x0,0xA664}/* A665 */, /*1936*/{0x0,0xA667,0x0}/* A666 */,/*1937*/{0xA666,0x0,0xA666}/* A667 */,/*1938*/{0x0,0xA669,0x0}/* A668 */, /*1939*/{0xA668,0x0,0xA668}/* A669 */,/*1940*/{0x0,0xA66B,0x0}/* A66A */,/*1941*/{0xA66A,0x0,0xA66A}/* A66B */, /*1942*/{0x0,0xA66D,0x0}/* A66C */,/*1943*/{0xA66C,0x0,0xA66C}/* A66D */,/*1944*/{0x0,0xA681,0x0}/* A680 */, /*1945*/{0xA680,0x0,0xA680}/* A681 */,/*1946*/{0x0,0xA683,0x0}/* A682 */,/*1947*/{0xA682,0x0,0xA682}/* A683 */, /*1948*/{0x0,0xA685,0x0}/* A684 */,/*1949*/{0xA684,0x0,0xA684}/* A685 */,/*1950*/{0x0,0xA687,0x0}/* A686 */, /*1951*/{0xA686,0x0,0xA686}/* A687 */,/*1952*/{0x0,0xA689,0x0}/* A688 */,/*1953*/{0xA688,0x0,0xA688}/* A689 */, /*1954*/{0x0,0xA68B,0x0}/* A68A */,/*1955*/{0xA68A,0x0,0xA68A}/* A68B */,/*1956*/{0x0,0xA68D,0x0}/* A68C */, /*1957*/{0xA68C,0x0,0xA68C}/* A68D */,/*1958*/{0x0,0xA68F,0x0}/* A68E */,/*1959*/{0xA68E,0x0,0xA68E}/* A68F */, /*1960*/{0x0,0xA691,0x0}/* A690 */,/*1961*/{0xA690,0x0,0xA690}/* A691 */,/*1962*/{0x0,0xA693,0x0}/* A692 */, /*1963*/{0xA692,0x0,0xA692}/* A693 */,/*1964*/{0x0,0xA695,0x0}/* A694 */,/*1965*/{0xA694,0x0,0xA694}/* A695 */, /*1966*/{0x0,0xA697,0x0}/* A696 */,/*1967*/{0xA696,0x0,0xA696}/* A697 */,/*1968*/{0x0,0xA699,0x0}/* A698 */, /*1969*/{0xA698,0x0,0xA698}/* A699 */,/*1970*/{0x0,0xA69B,0x0}/* A69A */,/*1971*/{0xA69A,0x0,0xA69A}/* A69B */, /*1972*/{0x0,0xA723,0x0}/* A722 */,/*1973*/{0xA722,0x0,0xA722}/* A723 */,/*1974*/{0x0,0xA725,0x0}/* A724 */, /*1975*/{0xA724,0x0,0xA724}/* A725 */,/*1976*/{0x0,0xA727,0x0}/* A726 */,/*1977*/{0xA726,0x0,0xA726}/* A727 */, /*1978*/{0x0,0xA729,0x0}/* A728 */,/*1979*/{0xA728,0x0,0xA728}/* A729 */,/*1980*/{0x0,0xA72B,0x0}/* A72A */, /*1981*/{0xA72A,0x0,0xA72A}/* A72B */,/*1982*/{0x0,0xA72D,0x0}/* A72C */,/*1983*/{0xA72C,0x0,0xA72C}/* A72D */, /*1984*/{0x0,0xA72F,0x0}/* A72E */,/*1985*/{0xA72E,0x0,0xA72E}/* A72F */,/*1986*/{0x0,0xA733,0x0}/* A732 */, /*1987*/{0xA732,0x0,0xA732}/* A733 */,/*1988*/{0x0,0xA735,0x0}/* A734 */,/*1989*/{0xA734,0x0,0xA734}/* A735 */, /*1990*/{0x0,0xA737,0x0}/* A736 */,/*1991*/{0xA736,0x0,0xA736}/* A737 */,/*1992*/{0x0,0xA739,0x0}/* A738 */, /*1993*/{0xA738,0x0,0xA738}/* A739 */,/*1994*/{0x0,0xA73B,0x0}/* A73A */,/*1995*/{0xA73A,0x0,0xA73A}/* A73B */, /*1996*/{0x0,0xA73D,0x0}/* A73C */,/*1997*/{0xA73C,0x0,0xA73C}/* A73D */,/*1998*/{0x0,0xA73F,0x0}/* A73E */, /*1999*/{0xA73E,0x0,0xA73E}/* A73F */,/*2000*/{0x0,0xA741,0x0}/* A740 */,/*2001*/{0xA740,0x0,0xA740}/* A741 */, /*2002*/{0x0,0xA743,0x0}/* A742 */,/*2003*/{0xA742,0x0,0xA742}/* A743 */,/*2004*/{0x0,0xA745,0x0}/* A744 */, /*2005*/{0xA744,0x0,0xA744}/* A745 */,/*2006*/{0x0,0xA747,0x0}/* A746 */,/*2007*/{0xA746,0x0,0xA746}/* A747 */, /*2008*/{0x0,0xA749,0x0}/* A748 */,/*2009*/{0xA748,0x0,0xA748}/* A749 */,/*2010*/{0x0,0xA74B,0x0}/* A74A */, /*2011*/{0xA74A,0x0,0xA74A}/* A74B */,/*2012*/{0x0,0xA74D,0x0}/* A74C */,/*2013*/{0xA74C,0x0,0xA74C}/* A74D */, /*2014*/{0x0,0xA74F,0x0}/* A74E */,/*2015*/{0xA74E,0x0,0xA74E}/* A74F */,/*2016*/{0x0,0xA751,0x0}/* A750 */, /*2017*/{0xA750,0x0,0xA750}/* A751 */,/*2018*/{0x0,0xA753,0x0}/* A752 */,/*2019*/{0xA752,0x0,0xA752}/* A753 */, /*2020*/{0x0,0xA755,0x0}/* A754 */,/*2021*/{0xA754,0x0,0xA754}/* A755 */,/*2022*/{0x0,0xA757,0x0}/* A756 */, /*2023*/{0xA756,0x0,0xA756}/* A757 */,/*2024*/{0x0,0xA759,0x0}/* A758 */,/*2025*/{0xA758,0x0,0xA758}/* A759 */, /*2026*/{0x0,0xA75B,0x0}/* A75A */,/*2027*/{0xA75A,0x0,0xA75A}/* A75B */,/*2028*/{0x0,0xA75D,0x0}/* A75C */, /*2029*/{0xA75C,0x0,0xA75C}/* A75D */,/*2030*/{0x0,0xA75F,0x0}/* A75E */,/*2031*/{0xA75E,0x0,0xA75E}/* A75F */, /*2032*/{0x0,0xA761,0x0}/* A760 */,/*2033*/{0xA760,0x0,0xA760}/* A761 */,/*2034*/{0x0,0xA763,0x0}/* A762 */, /*2035*/{0xA762,0x0,0xA762}/* A763 */,/*2036*/{0x0,0xA765,0x0}/* A764 */,/*2037*/{0xA764,0x0,0xA764}/* A765 */, /*2038*/{0x0,0xA767,0x0}/* A766 */,/*2039*/{0xA766,0x0,0xA766}/* A767 */,/*2040*/{0x0,0xA769,0x0}/* A768 */, /*2041*/{0xA768,0x0,0xA768}/* A769 */,/*2042*/{0x0,0xA76B,0x0}/* A76A */,/*2043*/{0xA76A,0x0,0xA76A}/* A76B */, /*2044*/{0x0,0xA76D,0x0}/* A76C */,/*2045*/{0xA76C,0x0,0xA76C}/* A76D */,/*2046*/{0x0,0xA76F,0x0}/* A76E */, /*2047*/{0xA76E,0x0,0xA76E}/* A76F */,/*2048*/{0x0,0xA77A,0x0}/* A779 */,/*2049*/{0xA779,0x0,0xA779}/* A77A */, /*2050*/{0x0,0xA77C,0x0}/* A77B */,/*2051*/{0xA77B,0x0,0xA77B}/* A77C */,/*2052*/{0x0,0x1D79,0x0}/* A77D */, /*2053*/{0x0,0xA77F,0x0}/* A77E */,/*2054*/{0xA77E,0x0,0xA77E}/* A77F */,/*2055*/{0x0,0xA781,0x0}/* A780 */, /*2056*/{0xA780,0x0,0xA780}/* A781 */,/*2057*/{0x0,0xA783,0x0}/* A782 */,/*2058*/{0xA782,0x0,0xA782}/* A783 */, /*2059*/{0x0,0xA785,0x0}/* A784 */,/*2060*/{0xA784,0x0,0xA784}/* A785 */,/*2061*/{0x0,0xA787,0x0}/* A786 */, /*2062*/{0xA786,0x0,0xA786}/* A787 */,/*2063*/{0x0,0xA78C,0x0}/* A78B */,/*2064*/{0xA78B,0x0,0xA78B}/* A78C */, /*2065*/{0x0,0x0265,0x0}/* A78D */,/*2066*/{0x0,0xA791,0x0}/* A790 */,/*2067*/{0xA790,0x0,0xA790}/* A791 */, /*2068*/{0x0,0xA793,0x0}/* A792 */,/*2069*/{0xA792,0x0,0xA792}/* A793 */,/*2070*/{0x0,0xA797,0x0}/* A796 */, /*2071*/{0xA796,0x0,0xA796}/* A797 */,/*2072*/{0x0,0xA799,0x0}/* A798 */,/*2073*/{0xA798,0x0,0xA798}/* A799 */, /*2074*/{0x0,0xA79B,0x0}/* A79A */,/*2075*/{0xA79A,0x0,0xA79A}/* A79B */,/*2076*/{0x0,0xA79D,0x0}/* A79C */, /*2077*/{0xA79C,0x0,0xA79C}/* A79D */,/*2078*/{0x0,0xA79F,0x0}/* A79E */,/*2079*/{0xA79E,0x0,0xA79E}/* A79F */, /*2080*/{0x0,0xA7A1,0x0}/* A7A0 */,/*2081*/{0xA7A0,0x0,0xA7A0}/* A7A1 */,/*2082*/{0x0,0xA7A3,0x0}/* A7A2 */, /*2083*/{0xA7A2,0x0,0xA7A2}/* A7A3 */,/*2084*/{0x0,0xA7A5,0x0}/* A7A4 */,/*2085*/{0xA7A4,0x0,0xA7A4}/* A7A5 */, /*2086*/{0x0,0xA7A7,0x0}/* A7A6 */,/*2087*/{0xA7A6,0x0,0xA7A6}/* A7A7 */,/*2088*/{0x0,0xA7A9,0x0}/* A7A8 */, /*2089*/{0xA7A8,0x0,0xA7A8}/* A7A9 */,/*2090*/{0x0,0x0266,0x0}/* A7AA */,/*2091*/{0x0,0x025C,0x0}/* A7AB */, /*2092*/{0x0,0x0261,0x0}/* A7AC */,/*2093*/{0x0,0x026C,0x0}/* A7AD */,/*2094*/{0x0,0x026A,0x0}/* A7AE */, /*2095*/{0x0,0x029E,0x0}/* A7B0 */,/*2096*/{0x0,0x0287,0x0}/* A7B1 */,/*2097*/{0x0,0x029D,0x0}/* A7B2 */, /*2098*/{0x0,0xAB53,0x0}/* A7B3 */,/*2099*/{0x0,0xA7B5,0x0}/* A7B4 */,/*2100*/{0xA7B4,0x0,0xA7B4}/* A7B5 */, /*2101*/{0x0,0xA7B7,0x0}/* A7B6 */,/*2102*/{0xA7B6,0x0,0xA7B6}/* A7B7 */,/*2103*/{0xA7B3,0x0,0xA7B3}/* AB53 */, /*2104*/{0x13A0,0x0,0x13A0}/* AB70 */,/*2105*/{0x13A1,0x0,0x13A1}/* AB71 */,/*2106*/{0x13A2,0x0,0x13A2}/* AB72 */, /*2107*/{0x13A3,0x0,0x13A3}/* AB73 */,/*2108*/{0x13A4,0x0,0x13A4}/* AB74 */,/*2109*/{0x13A5,0x0,0x13A5}/* AB75 */, /*2110*/{0x13A6,0x0,0x13A6}/* AB76 */,/*2111*/{0x13A7,0x0,0x13A7}/* AB77 */,/*2112*/{0x13A8,0x0,0x13A8}/* AB78 */, /*2113*/{0x13A9,0x0,0x13A9}/* AB79 */,/*2114*/{0x13AA,0x0,0x13AA}/* AB7A */,/*2115*/{0x13AB,0x0,0x13AB}/* AB7B */, /*2116*/{0x13AC,0x0,0x13AC}/* AB7C */,/*2117*/{0x13AD,0x0,0x13AD}/* AB7D */,/*2118*/{0x13AE,0x0,0x13AE}/* AB7E */, /*2119*/{0x13AF,0x0,0x13AF}/* AB7F */,/*2120*/{0x13B0,0x0,0x13B0}/* AB80 */,/*2121*/{0x13B1,0x0,0x13B1}/* AB81 */, /*2122*/{0x13B2,0x0,0x13B2}/* AB82 */,/*2123*/{0x13B3,0x0,0x13B3}/* AB83 */,/*2124*/{0x13B4,0x0,0x13B4}/* AB84 */, /*2125*/{0x13B5,0x0,0x13B5}/* AB85 */,/*2126*/{0x13B6,0x0,0x13B6}/* AB86 */,/*2127*/{0x13B7,0x0,0x13B7}/* AB87 */, /*2128*/{0x13B8,0x0,0x13B8}/* AB88 */,/*2129*/{0x13B9,0x0,0x13B9}/* AB89 */,/*2130*/{0x13BA,0x0,0x13BA}/* AB8A */, /*2131*/{0x13BB,0x0,0x13BB}/* AB8B */,/*2132*/{0x13BC,0x0,0x13BC}/* AB8C */,/*2133*/{0x13BD,0x0,0x13BD}/* AB8D */, /*2134*/{0x13BE,0x0,0x13BE}/* AB8E */,/*2135*/{0x13BF,0x0,0x13BF}/* AB8F */,/*2136*/{0x13C0,0x0,0x13C0}/* AB90 */, /*2137*/{0x13C1,0x0,0x13C1}/* AB91 */,/*2138*/{0x13C2,0x0,0x13C2}/* AB92 */,/*2139*/{0x13C3,0x0,0x13C3}/* AB93 */, /*2140*/{0x13C4,0x0,0x13C4}/* AB94 */,/*2141*/{0x13C5,0x0,0x13C5}/* AB95 */,/*2142*/{0x13C6,0x0,0x13C6}/* AB96 */, /*2143*/{0x13C7,0x0,0x13C7}/* AB97 */,/*2144*/{0x13C8,0x0,0x13C8}/* AB98 */,/*2145*/{0x13C9,0x0,0x13C9}/* AB99 */, /*2146*/{0x13CA,0x0,0x13CA}/* AB9A */,/*2147*/{0x13CB,0x0,0x13CB}/* AB9B */,/*2148*/{0x13CC,0x0,0x13CC}/* AB9C */, /*2149*/{0x13CD,0x0,0x13CD}/* AB9D */,/*2150*/{0x13CE,0x0,0x13CE}/* AB9E */,/*2151*/{0x13CF,0x0,0x13CF}/* AB9F */, /*2152*/{0x13D0,0x0,0x13D0}/* ABA0 */,/*2153*/{0x13D1,0x0,0x13D1}/* ABA1 */,/*2154*/{0x13D2,0x0,0x13D2}/* ABA2 */, /*2155*/{0x13D3,0x0,0x13D3}/* ABA3 */,/*2156*/{0x13D4,0x0,0x13D4}/* ABA4 */,/*2157*/{0x13D5,0x0,0x13D5}/* ABA5 */, /*2158*/{0x13D6,0x0,0x13D6}/* ABA6 */,/*2159*/{0x13D7,0x0,0x13D7}/* ABA7 */,/*2160*/{0x13D8,0x0,0x13D8}/* ABA8 */, /*2161*/{0x13D9,0x0,0x13D9}/* ABA9 */,/*2162*/{0x13DA,0x0,0x13DA}/* ABAA */,/*2163*/{0x13DB,0x0,0x13DB}/* ABAB */, /*2164*/{0x13DC,0x0,0x13DC}/* ABAC */,/*2165*/{0x13DD,0x0,0x13DD}/* ABAD */,/*2166*/{0x13DE,0x0,0x13DE}/* ABAE */, /*2167*/{0x13DF,0x0,0x13DF}/* ABAF */,/*2168*/{0x13E0,0x0,0x13E0}/* ABB0 */,/*2169*/{0x13E1,0x0,0x13E1}/* ABB1 */, /*2170*/{0x13E2,0x0,0x13E2}/* ABB2 */,/*2171*/{0x13E3,0x0,0x13E3}/* ABB3 */,/*2172*/{0x13E4,0x0,0x13E4}/* ABB4 */, /*2173*/{0x13E5,0x0,0x13E5}/* ABB5 */,/*2174*/{0x13E6,0x0,0x13E6}/* ABB6 */,/*2175*/{0x13E7,0x0,0x13E7}/* ABB7 */, /*2176*/{0x13E8,0x0,0x13E8}/* ABB8 */,/*2177*/{0x13E9,0x0,0x13E9}/* ABB9 */,/*2178*/{0x13EA,0x0,0x13EA}/* ABBA */, /*2179*/{0x13EB,0x0,0x13EB}/* ABBB */,/*2180*/{0x13EC,0x0,0x13EC}/* ABBC */,/*2181*/{0x13ED,0x0,0x13ED}/* ABBD */, /*2182*/{0x13EE,0x0,0x13EE}/* ABBE */,/*2183*/{0x13EF,0x0,0x13EF}/* ABBF */,/*2184*/{0x0,0xFF41,0x0}/* FF21 */, /*2185*/{0x0,0xFF42,0x0}/* FF22 */,/*2186*/{0x0,0xFF43,0x0}/* FF23 */,/*2187*/{0x0,0xFF44,0x0}/* FF24 */, /*2188*/{0x0,0xFF45,0x0}/* FF25 */,/*2189*/{0x0,0xFF46,0x0}/* FF26 */,/*2190*/{0x0,0xFF47,0x0}/* FF27 */, /*2191*/{0x0,0xFF48,0x0}/* FF28 */,/*2192*/{0x0,0xFF49,0x0}/* FF29 */,/*2193*/{0x0,0xFF4A,0x0}/* FF2A */, /*2194*/{0x0,0xFF4B,0x0}/* FF2B */,/*2195*/{0x0,0xFF4C,0x0}/* FF2C */,/*2196*/{0x0,0xFF4D,0x0}/* FF2D */, /*2197*/{0x0,0xFF4E,0x0}/* FF2E */,/*2198*/{0x0,0xFF4F,0x0}/* FF2F */,/*2199*/{0x0,0xFF50,0x0}/* FF30 */, /*2200*/{0x0,0xFF51,0x0}/* FF31 */,/*2201*/{0x0,0xFF52,0x0}/* FF32 */,/*2202*/{0x0,0xFF53,0x0}/* FF33 */, /*2203*/{0x0,0xFF54,0x0}/* FF34 */,/*2204*/{0x0,0xFF55,0x0}/* FF35 */,/*2205*/{0x0,0xFF56,0x0}/* FF36 */, /*2206*/{0x0,0xFF57,0x0}/* FF37 */,/*2207*/{0x0,0xFF58,0x0}/* FF38 */,/*2208*/{0x0,0xFF59,0x0}/* FF39 */, /*2209*/{0x0,0xFF5A,0x0}/* FF3A */,/*2210*/{0xFF21,0x0,0xFF21}/* FF41 */,/*2211*/{0xFF22,0x0,0xFF22}/* FF42 */, /*2212*/{0xFF23,0x0,0xFF23}/* FF43 */,/*2213*/{0xFF24,0x0,0xFF24}/* FF44 */,/*2214*/{0xFF25,0x0,0xFF25}/* FF45 */, /*2215*/{0xFF26,0x0,0xFF26}/* FF46 */,/*2216*/{0xFF27,0x0,0xFF27}/* FF47 */,/*2217*/{0xFF28,0x0,0xFF28}/* FF48 */, /*2218*/{0xFF29,0x0,0xFF29}/* FF49 */,/*2219*/{0xFF2A,0x0,0xFF2A}/* FF4A */,/*2220*/{0xFF2B,0x0,0xFF2B}/* FF4B */, /*2221*/{0xFF2C,0x0,0xFF2C}/* FF4C */,/*2222*/{0xFF2D,0x0,0xFF2D}/* FF4D */,/*2223*/{0xFF2E,0x0,0xFF2E}/* FF4E */, /*2224*/{0xFF2F,0x0,0xFF2F}/* FF4F */,/*2225*/{0xFF30,0x0,0xFF30}/* FF50 */,/*2226*/{0xFF31,0x0,0xFF31}/* FF51 */, /*2227*/{0xFF32,0x0,0xFF32}/* FF52 */,/*2228*/{0xFF33,0x0,0xFF33}/* FF53 */,/*2229*/{0xFF34,0x0,0xFF34}/* FF54 */, /*2230*/{0xFF35,0x0,0xFF35}/* FF55 */,/*2231*/{0xFF36,0x0,0xFF36}/* FF56 */,/*2232*/{0xFF37,0x0,0xFF37}/* FF57 */, /*2233*/{0xFF38,0x0,0xFF38}/* FF58 */,/*2234*/{0xFF39,0x0,0xFF39}/* FF59 */,/*2235*/{0xFF3A,0x0,0xFF3A}/* FF5A */, /*2236*/{0x0,0x10428,0x0}/* 10400 */,/*2237*/{0x0,0x10429,0x0}/* 10401 */,/*2238*/{0x0,0x1042A,0x0}/* 10402 */, /*2239*/{0x0,0x1042B,0x0}/* 10403 */,/*2240*/{0x0,0x1042C,0x0}/* 10404 */,/*2241*/{0x0,0x1042D,0x0}/* 10405 */, /*2242*/{0x0,0x1042E,0x0}/* 10406 */,/*2243*/{0x0,0x1042F,0x0}/* 10407 */,/*2244*/{0x0,0x10430,0x0}/* 10408 */, /*2245*/{0x0,0x10431,0x0}/* 10409 */,/*2246*/{0x0,0x10432,0x0}/* 1040A */,/*2247*/{0x0,0x10433,0x0}/* 1040B */, /*2248*/{0x0,0x10434,0x0}/* 1040C */,/*2249*/{0x0,0x10435,0x0}/* 1040D */,/*2250*/{0x0,0x10436,0x0}/* 1040E */, /*2251*/{0x0,0x10437,0x0}/* 1040F */,/*2252*/{0x0,0x10438,0x0}/* 10410 */,/*2253*/{0x0,0x10439,0x0}/* 10411 */, /*2254*/{0x0,0x1043A,0x0}/* 10412 */,/*2255*/{0x0,0x1043B,0x0}/* 10413 */,/*2256*/{0x0,0x1043C,0x0}/* 10414 */, /*2257*/{0x0,0x1043D,0x0}/* 10415 */,/*2258*/{0x0,0x1043E,0x0}/* 10416 */,/*2259*/{0x0,0x1043F,0x0}/* 10417 */, /*2260*/{0x0,0x10440,0x0}/* 10418 */,/*2261*/{0x0,0x10441,0x0}/* 10419 */,/*2262*/{0x0,0x10442,0x0}/* 1041A */, /*2263*/{0x0,0x10443,0x0}/* 1041B */,/*2264*/{0x0,0x10444,0x0}/* 1041C */,/*2265*/{0x0,0x10445,0x0}/* 1041D */, /*2266*/{0x0,0x10446,0x0}/* 1041E */,/*2267*/{0x0,0x10447,0x0}/* 1041F */,/*2268*/{0x0,0x10448,0x0}/* 10420 */, /*2269*/{0x0,0x10449,0x0}/* 10421 */,/*2270*/{0x0,0x1044A,0x0}/* 10422 */,/*2271*/{0x0,0x1044B,0x0}/* 10423 */, /*2272*/{0x0,0x1044C,0x0}/* 10424 */,/*2273*/{0x0,0x1044D,0x0}/* 10425 */,/*2274*/{0x0,0x1044E,0x0}/* 10426 */, /*2275*/{0x0,0x1044F,0x0}/* 10427 */,/*2276*/{0x10400,0x0,0x10400}/* 10428 */,/*2277*/{0x10401,0x0,0x10401}/* 10429 */, /*2278*/{0x10402,0x0,0x10402}/* 1042A */,/*2279*/{0x10403,0x0,0x10403}/* 1042B */, /*2280*/{0x10404,0x0,0x10404}/* 1042C */,/*2281*/{0x10405,0x0,0x10405}/* 1042D */, /*2282*/{0x10406,0x0,0x10406}/* 1042E */,/*2283*/{0x10407,0x0,0x10407}/* 1042F */, /*2284*/{0x10408,0x0,0x10408}/* 10430 */,/*2285*/{0x10409,0x0,0x10409}/* 10431 */, /*2286*/{0x1040A,0x0,0x1040A}/* 10432 */,/*2287*/{0x1040B,0x0,0x1040B}/* 10433 */, /*2288*/{0x1040C,0x0,0x1040C}/* 10434 */,/*2289*/{0x1040D,0x0,0x1040D}/* 10435 */, /*2290*/{0x1040E,0x0,0x1040E}/* 10436 */,/*2291*/{0x1040F,0x0,0x1040F}/* 10437 */, /*2292*/{0x10410,0x0,0x10410}/* 10438 */,/*2293*/{0x10411,0x0,0x10411}/* 10439 */, /*2294*/{0x10412,0x0,0x10412}/* 1043A */,/*2295*/{0x10413,0x0,0x10413}/* 1043B */, /*2296*/{0x10414,0x0,0x10414}/* 1043C */,/*2297*/{0x10415,0x0,0x10415}/* 1043D */, /*2298*/{0x10416,0x0,0x10416}/* 1043E */,/*2299*/{0x10417,0x0,0x10417}/* 1043F */, /*2300*/{0x10418,0x0,0x10418}/* 10440 */,/*2301*/{0x10419,0x0,0x10419}/* 10441 */, /*2302*/{0x1041A,0x0,0x1041A}/* 10442 */,/*2303*/{0x1041B,0x0,0x1041B}/* 10443 */, /*2304*/{0x1041C,0x0,0x1041C}/* 10444 */,/*2305*/{0x1041D,0x0,0x1041D}/* 10445 */, /*2306*/{0x1041E,0x0,0x1041E}/* 10446 */,/*2307*/{0x1041F,0x0,0x1041F}/* 10447 */, /*2308*/{0x10420,0x0,0x10420}/* 10448 */,/*2309*/{0x10421,0x0,0x10421}/* 10449 */, /*2310*/{0x10422,0x0,0x10422}/* 1044A */,/*2311*/{0x10423,0x0,0x10423}/* 1044B */, /*2312*/{0x10424,0x0,0x10424}/* 1044C */,/*2313*/{0x10425,0x0,0x10425}/* 1044D */, /*2314*/{0x10426,0x0,0x10426}/* 1044E */,/*2315*/{0x10427,0x0,0x10427}/* 1044F */,/*2316*/{0x0,0x104D8,0x0}/* 104B0 */, /*2317*/{0x0,0x104D9,0x0}/* 104B1 */,/*2318*/{0x0,0x104DA,0x0}/* 104B2 */,/*2319*/{0x0,0x104DB,0x0}/* 104B3 */, /*2320*/{0x0,0x104DC,0x0}/* 104B4 */,/*2321*/{0x0,0x104DD,0x0}/* 104B5 */,/*2322*/{0x0,0x104DE,0x0}/* 104B6 */, /*2323*/{0x0,0x104DF,0x0}/* 104B7 */,/*2324*/{0x0,0x104E0,0x0}/* 104B8 */,/*2325*/{0x0,0x104E1,0x0}/* 104B9 */, /*2326*/{0x0,0x104E2,0x0}/* 104BA */,/*2327*/{0x0,0x104E3,0x0}/* 104BB */,/*2328*/{0x0,0x104E4,0x0}/* 104BC */, /*2329*/{0x0,0x104E5,0x0}/* 104BD */,/*2330*/{0x0,0x104E6,0x0}/* 104BE */,/*2331*/{0x0,0x104E7,0x0}/* 104BF */, /*2332*/{0x0,0x104E8,0x0}/* 104C0 */,/*2333*/{0x0,0x104E9,0x0}/* 104C1 */,/*2334*/{0x0,0x104EA,0x0}/* 104C2 */, /*2335*/{0x0,0x104EB,0x0}/* 104C3 */,/*2336*/{0x0,0x104EC,0x0}/* 104C4 */,/*2337*/{0x0,0x104ED,0x0}/* 104C5 */, /*2338*/{0x0,0x104EE,0x0}/* 104C6 */,/*2339*/{0x0,0x104EF,0x0}/* 104C7 */,/*2340*/{0x0,0x104F0,0x0}/* 104C8 */, /*2341*/{0x0,0x104F1,0x0}/* 104C9 */,/*2342*/{0x0,0x104F2,0x0}/* 104CA */,/*2343*/{0x0,0x104F3,0x0}/* 104CB */, /*2344*/{0x0,0x104F4,0x0}/* 104CC */,/*2345*/{0x0,0x104F5,0x0}/* 104CD */,/*2346*/{0x0,0x104F6,0x0}/* 104CE */, /*2347*/{0x0,0x104F7,0x0}/* 104CF */,/*2348*/{0x0,0x104F8,0x0}/* 104D0 */,/*2349*/{0x0,0x104F9,0x0}/* 104D1 */, /*2350*/{0x0,0x104FA,0x0}/* 104D2 */,/*2351*/{0x0,0x104FB,0x0}/* 104D3 */,/*2352*/{0x104B0,0x0,0x104B0}/* 104D8 */, /*2353*/{0x104B1,0x0,0x104B1}/* 104D9 */,/*2354*/{0x104B2,0x0,0x104B2}/* 104DA */, /*2355*/{0x104B3,0x0,0x104B3}/* 104DB */,/*2356*/{0x104B4,0x0,0x104B4}/* 104DC */, /*2357*/{0x104B5,0x0,0x104B5}/* 104DD */,/*2358*/{0x104B6,0x0,0x104B6}/* 104DE */, /*2359*/{0x104B7,0x0,0x104B7}/* 104DF */,/*2360*/{0x104B8,0x0,0x104B8}/* 104E0 */, /*2361*/{0x104B9,0x0,0x104B9}/* 104E1 */,/*2362*/{0x104BA,0x0,0x104BA}/* 104E2 */, /*2363*/{0x104BB,0x0,0x104BB}/* 104E3 */,/*2364*/{0x104BC,0x0,0x104BC}/* 104E4 */, /*2365*/{0x104BD,0x0,0x104BD}/* 104E5 */,/*2366*/{0x104BE,0x0,0x104BE}/* 104E6 */, /*2367*/{0x104BF,0x0,0x104BF}/* 104E7 */,/*2368*/{0x104C0,0x0,0x104C0}/* 104E8 */, /*2369*/{0x104C1,0x0,0x104C1}/* 104E9 */,/*2370*/{0x104C2,0x0,0x104C2}/* 104EA */, /*2371*/{0x104C3,0x0,0x104C3}/* 104EB */,/*2372*/{0x104C4,0x0,0x104C4}/* 104EC */, /*2373*/{0x104C5,0x0,0x104C5}/* 104ED */,/*2374*/{0x104C6,0x0,0x104C6}/* 104EE */, /*2375*/{0x104C7,0x0,0x104C7}/* 104EF */,/*2376*/{0x104C8,0x0,0x104C8}/* 104F0 */, /*2377*/{0x104C9,0x0,0x104C9}/* 104F1 */,/*2378*/{0x104CA,0x0,0x104CA}/* 104F2 */, /*2379*/{0x104CB,0x0,0x104CB}/* 104F3 */,/*2380*/{0x104CC,0x0,0x104CC}/* 104F4 */, /*2381*/{0x104CD,0x0,0x104CD}/* 104F5 */,/*2382*/{0x104CE,0x0,0x104CE}/* 104F6 */, /*2383*/{0x104CF,0x0,0x104CF}/* 104F7 */,/*2384*/{0x104D0,0x0,0x104D0}/* 104F8 */, /*2385*/{0x104D1,0x0,0x104D1}/* 104F9 */,/*2386*/{0x104D2,0x0,0x104D2}/* 104FA */, /*2387*/{0x104D3,0x0,0x104D3}/* 104FB */,/*2388*/{0x0,0x10CC0,0x0}/* 10C80 */,/*2389*/{0x0,0x10CC1,0x0}/* 10C81 */, /*2390*/{0x0,0x10CC2,0x0}/* 10C82 */,/*2391*/{0x0,0x10CC3,0x0}/* 10C83 */,/*2392*/{0x0,0x10CC4,0x0}/* 10C84 */, /*2393*/{0x0,0x10CC5,0x0}/* 10C85 */,/*2394*/{0x0,0x10CC6,0x0}/* 10C86 */,/*2395*/{0x0,0x10CC7,0x0}/* 10C87 */, /*2396*/{0x0,0x10CC8,0x0}/* 10C88 */,/*2397*/{0x0,0x10CC9,0x0}/* 10C89 */,/*2398*/{0x0,0x10CCA,0x0}/* 10C8A */, /*2399*/{0x0,0x10CCB,0x0}/* 10C8B */,/*2400*/{0x0,0x10CCC,0x0}/* 10C8C */,/*2401*/{0x0,0x10CCD,0x0}/* 10C8D */, /*2402*/{0x0,0x10CCE,0x0}/* 10C8E */,/*2403*/{0x0,0x10CCF,0x0}/* 10C8F */,/*2404*/{0x0,0x10CD0,0x0}/* 10C90 */, /*2405*/{0x0,0x10CD1,0x0}/* 10C91 */,/*2406*/{0x0,0x10CD2,0x0}/* 10C92 */,/*2407*/{0x0,0x10CD3,0x0}/* 10C93 */, /*2408*/{0x0,0x10CD4,0x0}/* 10C94 */,/*2409*/{0x0,0x10CD5,0x0}/* 10C95 */,/*2410*/{0x0,0x10CD6,0x0}/* 10C96 */, /*2411*/{0x0,0x10CD7,0x0}/* 10C97 */,/*2412*/{0x0,0x10CD8,0x0}/* 10C98 */,/*2413*/{0x0,0x10CD9,0x0}/* 10C99 */, /*2414*/{0x0,0x10CDA,0x0}/* 10C9A */,/*2415*/{0x0,0x10CDB,0x0}/* 10C9B */,/*2416*/{0x0,0x10CDC,0x0}/* 10C9C */, /*2417*/{0x0,0x10CDD,0x0}/* 10C9D */,/*2418*/{0x0,0x10CDE,0x0}/* 10C9E */,/*2419*/{0x0,0x10CDF,0x0}/* 10C9F */, /*2420*/{0x0,0x10CE0,0x0}/* 10CA0 */,/*2421*/{0x0,0x10CE1,0x0}/* 10CA1 */,/*2422*/{0x0,0x10CE2,0x0}/* 10CA2 */, /*2423*/{0x0,0x10CE3,0x0}/* 10CA3 */,/*2424*/{0x0,0x10CE4,0x0}/* 10CA4 */,/*2425*/{0x0,0x10CE5,0x0}/* 10CA5 */, /*2426*/{0x0,0x10CE6,0x0}/* 10CA6 */,/*2427*/{0x0,0x10CE7,0x0}/* 10CA7 */,/*2428*/{0x0,0x10CE8,0x0}/* 10CA8 */, /*2429*/{0x0,0x10CE9,0x0}/* 10CA9 */,/*2430*/{0x0,0x10CEA,0x0}/* 10CAA */,/*2431*/{0x0,0x10CEB,0x0}/* 10CAB */, /*2432*/{0x0,0x10CEC,0x0}/* 10CAC */,/*2433*/{0x0,0x10CED,0x0}/* 10CAD */,/*2434*/{0x0,0x10CEE,0x0}/* 10CAE */, /*2435*/{0x0,0x10CEF,0x0}/* 10CAF */,/*2436*/{0x0,0x10CF0,0x0}/* 10CB0 */,/*2437*/{0x0,0x10CF1,0x0}/* 10CB1 */, /*2438*/{0x0,0x10CF2,0x0}/* 10CB2 */,/*2439*/{0x10C80,0x0,0x10C80}/* 10CC0 */,/*2440*/{0x10C81,0x0,0x10C81}/* 10CC1 */, /*2441*/{0x10C82,0x0,0x10C82}/* 10CC2 */,/*2442*/{0x10C83,0x0,0x10C83}/* 10CC3 */, /*2443*/{0x10C84,0x0,0x10C84}/* 10CC4 */,/*2444*/{0x10C85,0x0,0x10C85}/* 10CC5 */, /*2445*/{0x10C86,0x0,0x10C86}/* 10CC6 */,/*2446*/{0x10C87,0x0,0x10C87}/* 10CC7 */, /*2447*/{0x10C88,0x0,0x10C88}/* 10CC8 */,/*2448*/{0x10C89,0x0,0x10C89}/* 10CC9 */, /*2449*/{0x10C8A,0x0,0x10C8A}/* 10CCA */,/*2450*/{0x10C8B,0x0,0x10C8B}/* 10CCB */, /*2451*/{0x10C8C,0x0,0x10C8C}/* 10CCC */,/*2452*/{0x10C8D,0x0,0x10C8D}/* 10CCD */, /*2453*/{0x10C8E,0x0,0x10C8E}/* 10CCE */,/*2454*/{0x10C8F,0x0,0x10C8F}/* 10CCF */, /*2455*/{0x10C90,0x0,0x10C90}/* 10CD0 */,/*2456*/{0x10C91,0x0,0x10C91}/* 10CD1 */, /*2457*/{0x10C92,0x0,0x10C92}/* 10CD2 */,/*2458*/{0x10C93,0x0,0x10C93}/* 10CD3 */, /*2459*/{0x10C94,0x0,0x10C94}/* 10CD4 */,/*2460*/{0x10C95,0x0,0x10C95}/* 10CD5 */, /*2461*/{0x10C96,0x0,0x10C96}/* 10CD6 */,/*2462*/{0x10C97,0x0,0x10C97}/* 10CD7 */, /*2463*/{0x10C98,0x0,0x10C98}/* 10CD8 */,/*2464*/{0x10C99,0x0,0x10C99}/* 10CD9 */, /*2465*/{0x10C9A,0x0,0x10C9A}/* 10CDA */,/*2466*/{0x10C9B,0x0,0x10C9B}/* 10CDB */, /*2467*/{0x10C9C,0x0,0x10C9C}/* 10CDC */,/*2468*/{0x10C9D,0x0,0x10C9D}/* 10CDD */, /*2469*/{0x10C9E,0x0,0x10C9E}/* 10CDE */,/*2470*/{0x10C9F,0x0,0x10C9F}/* 10CDF */, /*2471*/{0x10CA0,0x0,0x10CA0}/* 10CE0 */,/*2472*/{0x10CA1,0x0,0x10CA1}/* 10CE1 */, /*2473*/{0x10CA2,0x0,0x10CA2}/* 10CE2 */,/*2474*/{0x10CA3,0x0,0x10CA3}/* 10CE3 */, /*2475*/{0x10CA4,0x0,0x10CA4}/* 10CE4 */,/*2476*/{0x10CA5,0x0,0x10CA5}/* 10CE5 */, /*2477*/{0x10CA6,0x0,0x10CA6}/* 10CE6 */,/*2478*/{0x10CA7,0x0,0x10CA7}/* 10CE7 */, /*2479*/{0x10CA8,0x0,0x10CA8}/* 10CE8 */,/*2480*/{0x10CA9,0x0,0x10CA9}/* 10CE9 */, /*2481*/{0x10CAA,0x0,0x10CAA}/* 10CEA */,/*2482*/{0x10CAB,0x0,0x10CAB}/* 10CEB */, /*2483*/{0x10CAC,0x0,0x10CAC}/* 10CEC */,/*2484*/{0x10CAD,0x0,0x10CAD}/* 10CED */, /*2485*/{0x10CAE,0x0,0x10CAE}/* 10CEE */,/*2486*/{0x10CAF,0x0,0x10CAF}/* 10CEF */, /*2487*/{0x10CB0,0x0,0x10CB0}/* 10CF0 */,/*2488*/{0x10CB1,0x0,0x10CB1}/* 10CF1 */, /*2489*/{0x10CB2,0x0,0x10CB2}/* 10CF2 */,/*2490*/{0x0,0x118C0,0x0}/* 118A0 */,/*2491*/{0x0,0x118C1,0x0}/* 118A1 */, /*2492*/{0x0,0x118C2,0x0}/* 118A2 */,/*2493*/{0x0,0x118C3,0x0}/* 118A3 */,/*2494*/{0x0,0x118C4,0x0}/* 118A4 */, /*2495*/{0x0,0x118C5,0x0}/* 118A5 */,/*2496*/{0x0,0x118C6,0x0}/* 118A6 */,/*2497*/{0x0,0x118C7,0x0}/* 118A7 */, /*2498*/{0x0,0x118C8,0x0}/* 118A8 */,/*2499*/{0x0,0x118C9,0x0}/* 118A9 */,/*2500*/{0x0,0x118CA,0x0}/* 118AA */, /*2501*/{0x0,0x118CB,0x0}/* 118AB */,/*2502*/{0x0,0x118CC,0x0}/* 118AC */,/*2503*/{0x0,0x118CD,0x0}/* 118AD */, /*2504*/{0x0,0x118CE,0x0}/* 118AE */,/*2505*/{0x0,0x118CF,0x0}/* 118AF */,/*2506*/{0x0,0x118D0,0x0}/* 118B0 */, /*2507*/{0x0,0x118D1,0x0}/* 118B1 */,/*2508*/{0x0,0x118D2,0x0}/* 118B2 */,/*2509*/{0x0,0x118D3,0x0}/* 118B3 */, /*2510*/{0x0,0x118D4,0x0}/* 118B4 */,/*2511*/{0x0,0x118D5,0x0}/* 118B5 */,/*2512*/{0x0,0x118D6,0x0}/* 118B6 */, /*2513*/{0x0,0x118D7,0x0}/* 118B7 */,/*2514*/{0x0,0x118D8,0x0}/* 118B8 */,/*2515*/{0x0,0x118D9,0x0}/* 118B9 */, /*2516*/{0x0,0x118DA,0x0}/* 118BA */,/*2517*/{0x0,0x118DB,0x0}/* 118BB */,/*2518*/{0x0,0x118DC,0x0}/* 118BC */, /*2519*/{0x0,0x118DD,0x0}/* 118BD */,/*2520*/{0x0,0x118DE,0x0}/* 118BE */,/*2521*/{0x0,0x118DF,0x0}/* 118BF */, /*2522*/{0x118A0,0x0,0x118A0}/* 118C0 */,/*2523*/{0x118A1,0x0,0x118A1}/* 118C1 */, /*2524*/{0x118A2,0x0,0x118A2}/* 118C2 */,/*2525*/{0x118A3,0x0,0x118A3}/* 118C3 */, /*2526*/{0x118A4,0x0,0x118A4}/* 118C4 */,/*2527*/{0x118A5,0x0,0x118A5}/* 118C5 */, /*2528*/{0x118A6,0x0,0x118A6}/* 118C6 */,/*2529*/{0x118A7,0x0,0x118A7}/* 118C7 */, /*2530*/{0x118A8,0x0,0x118A8}/* 118C8 */,/*2531*/{0x118A9,0x0,0x118A9}/* 118C9 */, /*2532*/{0x118AA,0x0,0x118AA}/* 118CA */,/*2533*/{0x118AB,0x0,0x118AB}/* 118CB */, /*2534*/{0x118AC,0x0,0x118AC}/* 118CC */,/*2535*/{0x118AD,0x0,0x118AD}/* 118CD */, /*2536*/{0x118AE,0x0,0x118AE}/* 118CE */,/*2537*/{0x118AF,0x0,0x118AF}/* 118CF */, /*2538*/{0x118B0,0x0,0x118B0}/* 118D0 */,/*2539*/{0x118B1,0x0,0x118B1}/* 118D1 */, /*2540*/{0x118B2,0x0,0x118B2}/* 118D2 */,/*2541*/{0x118B3,0x0,0x118B3}/* 118D3 */, /*2542*/{0x118B4,0x0,0x118B4}/* 118D4 */,/*2543*/{0x118B5,0x0,0x118B5}/* 118D5 */, /*2544*/{0x118B6,0x0,0x118B6}/* 118D6 */,/*2545*/{0x118B7,0x0,0x118B7}/* 118D7 */, /*2546*/{0x118B8,0x0,0x118B8}/* 118D8 */,/*2547*/{0x118B9,0x0,0x118B9}/* 118D9 */, /*2548*/{0x118BA,0x0,0x118BA}/* 118DA */,/*2549*/{0x118BB,0x0,0x118BB}/* 118DB */, /*2550*/{0x118BC,0x0,0x118BC}/* 118DC */,/*2551*/{0x118BD,0x0,0x118BD}/* 118DD */, /*2552*/{0x118BE,0x0,0x118BE}/* 118DE */,/*2553*/{0x118BF,0x0,0x118BF}/* 118DF */,/*2554*/{0x0,0x1E922,0x0}/* 1E900 */, /*2555*/{0x0,0x1E923,0x0}/* 1E901 */,/*2556*/{0x0,0x1E924,0x0}/* 1E902 */,/*2557*/{0x0,0x1E925,0x0}/* 1E903 */, /*2558*/{0x0,0x1E926,0x0}/* 1E904 */,/*2559*/{0x0,0x1E927,0x0}/* 1E905 */,/*2560*/{0x0,0x1E928,0x0}/* 1E906 */, /*2561*/{0x0,0x1E929,0x0}/* 1E907 */,/*2562*/{0x0,0x1E92A,0x0}/* 1E908 */,/*2563*/{0x0,0x1E92B,0x0}/* 1E909 */, /*2564*/{0x0,0x1E92C,0x0}/* 1E90A */,/*2565*/{0x0,0x1E92D,0x0}/* 1E90B */,/*2566*/{0x0,0x1E92E,0x0}/* 1E90C */, /*2567*/{0x0,0x1E92F,0x0}/* 1E90D */,/*2568*/{0x0,0x1E930,0x0}/* 1E90E */,/*2569*/{0x0,0x1E931,0x0}/* 1E90F */, /*2570*/{0x0,0x1E932,0x0}/* 1E910 */,/*2571*/{0x0,0x1E933,0x0}/* 1E911 */,/*2572*/{0x0,0x1E934,0x0}/* 1E912 */, /*2573*/{0x0,0x1E935,0x0}/* 1E913 */,/*2574*/{0x0,0x1E936,0x0}/* 1E914 */,/*2575*/{0x0,0x1E937,0x0}/* 1E915 */, /*2576*/{0x0,0x1E938,0x0}/* 1E916 */,/*2577*/{0x0,0x1E939,0x0}/* 1E917 */,/*2578*/{0x0,0x1E93A,0x0}/* 1E918 */, /*2579*/{0x0,0x1E93B,0x0}/* 1E919 */,/*2580*/{0x0,0x1E93C,0x0}/* 1E91A */,/*2581*/{0x0,0x1E93D,0x0}/* 1E91B */, /*2582*/{0x0,0x1E93E,0x0}/* 1E91C */,/*2583*/{0x0,0x1E93F,0x0}/* 1E91D */,/*2584*/{0x0,0x1E940,0x0}/* 1E91E */, /*2585*/{0x0,0x1E941,0x0}/* 1E91F */,/*2586*/{0x0,0x1E942,0x0}/* 1E920 */,/*2587*/{0x0,0x1E943,0x0}/* 1E921 */, /*2588*/{0x1E900,0x0,0x1E900}/* 1E922 */,/*2589*/{0x1E901,0x0,0x1E901}/* 1E923 */, /*2590*/{0x1E902,0x0,0x1E902}/* 1E924 */,/*2591*/{0x1E903,0x0,0x1E903}/* 1E925 */, /*2592*/{0x1E904,0x0,0x1E904}/* 1E926 */,/*2593*/{0x1E905,0x0,0x1E905}/* 1E927 */, /*2594*/{0x1E906,0x0,0x1E906}/* 1E928 */,/*2595*/{0x1E907,0x0,0x1E907}/* 1E929 */, /*2596*/{0x1E908,0x0,0x1E908}/* 1E92A */,/*2597*/{0x1E909,0x0,0x1E909}/* 1E92B */, /*2598*/{0x1E90A,0x0,0x1E90A}/* 1E92C */,/*2599*/{0x1E90B,0x0,0x1E90B}/* 1E92D */, /*2600*/{0x1E90C,0x0,0x1E90C}/* 1E92E */,/*2601*/{0x1E90D,0x0,0x1E90D}/* 1E92F */, /*2602*/{0x1E90E,0x0,0x1E90E}/* 1E930 */,/*2603*/{0x1E90F,0x0,0x1E90F}/* 1E931 */, /*2604*/{0x1E910,0x0,0x1E910}/* 1E932 */,/*2605*/{0x1E911,0x0,0x1E911}/* 1E933 */, /*2606*/{0x1E912,0x0,0x1E912}/* 1E934 */,/*2607*/{0x1E913,0x0,0x1E913}/* 1E935 */, /*2608*/{0x1E914,0x0,0x1E914}/* 1E936 */,/*2609*/{0x1E915,0x0,0x1E915}/* 1E937 */, /*2610*/{0x1E916,0x0,0x1E916}/* 1E938 */,/*2611*/{0x1E917,0x0,0x1E917}/* 1E939 */, /*2612*/{0x1E918,0x0,0x1E918}/* 1E93A */,/*2613*/{0x1E919,0x0,0x1E919}/* 1E93B */, /*2614*/{0x1E91A,0x0,0x1E91A}/* 1E93C */,/*2615*/{0x1E91B,0x0,0x1E91B}/* 1E93D */, /*2616*/{0x1E91C,0x0,0x1E91C}/* 1E93E */,/*2617*/{0x1E91D,0x0,0x1E91D}/* 1E93F */, /*2618*/{0x1E91E,0x0,0x1E91E}/* 1E940 */,/*2619*/{0x1E91F,0x0,0x1E91F}/* 1E941 */, /*2620*/{0x1E920,0x0,0x1E920}/* 1E942 */,/*2621*/{0x1E921,0x0,0x1E921}/* 1E943 */ }; static const MVMuint16 codepoint_bitfield_indexes[52915] = { /*0*/1/* 0000 */,/*1*/1/* 0001 */,/*2*/1/* 0002 */,/*3*/1/* 0003 */,/*4*/1/* 0004 */,/*5*/1/* 0005 */,/*6*/1/* 0006 */, /*7*/1/* 0007 */,/*8*/1/* 0008 */,/*9*/2/* 0009 */,/*10*/3/* 000A */,/*11*/4/* 000B */,/*12*/5/* 000C */, /*13*/6/* 000D */,/*14*/1/* 000E */,/*15*/1/* 000F */,/*16*/1/* 0010 */,/*17*/1/* 0011 */,/*18*/1/* 0012 */, /*19*/1/* 0013 */,/*20*/1/* 0014 */,/*21*/1/* 0015 */,/*22*/1/* 0016 */,/*23*/1/* 0017 */,/*24*/1/* 0018 */, /*25*/1/* 0019 */,/*26*/1/* 001A */,/*27*/1/* 001B */,/*28*/7/* 001C */,/*29*/7/* 001D */,/*30*/7/* 001E */, /*31*/8/* 001F */,/*32*/9/* 0020 */,/*33*/10/* 0021 */,/*34*/11/* 0022 */,/*35*/12/* 0023 */,/*36*/13/* 0024 */, /*37*/14/* 0025 */,/*38*/15/* 0026 */,/*39*/16/* 0027 */,/*40*/17/* 0028 */,/*41*/18/* 0029 */,/*42*/19/* 002A */, /*43*/20/* 002B */,/*44*/21/* 002C */,/*45*/22/* 002D */,/*46*/23/* 002E */,/*47*/24/* 002F */,/*48*/25/* 0030 */, /*49*/26/* 0031 */,/*50*/27/* 0032 */,/*51*/28/* 0033 */,/*52*/29/* 0034 */,/*53*/30/* 0035 */,/*54*/31/* 0036 */, /*55*/32/* 0037 */,/*56*/33/* 0038 */,/*57*/34/* 0039 */,/*58*/35/* 003A */,/*59*/36/* 003B */,/*60*/37/* 003C */, /*61*/38/* 003D */,/*62*/39/* 003E */,/*63*/40/* 003F */,/*64*/41/* 0040 */,/*65*/42/* 0041 */,/*66*/43/* 0042 */, /*67*/44/* 0043 */,/*68*/45/* 0044 */,/*69*/46/* 0045 */,/*70*/47/* 0046 */,/*71*/48/* 0047 */,/*72*/49/* 0048 */, /*73*/50/* 0049 */,/*74*/51/* 004A */,/*75*/52/* 004B */,/*76*/53/* 004C */,/*77*/54/* 004D */,/*78*/55/* 004E */, /*79*/56/* 004F */,/*80*/57/* 0050 */,/*81*/58/* 0051 */,/*82*/59/* 0052 */,/*83*/60/* 0053 */,/*84*/61/* 0054 */, /*85*/62/* 0055 */,/*86*/63/* 0056 */,/*87*/64/* 0057 */,/*88*/65/* 0058 */,/*89*/66/* 0059 */,/*90*/67/* 005A */, /*91*/68/* 005B */,/*92*/69/* 005C */,/*93*/70/* 005D */,/*94*/71/* 005E */,/*95*/72/* 005F */,/*96*/73/* 0060 */, /*97*/74/* 0061 */,/*98*/75/* 0062 */,/*99*/76/* 0063 */,/*100*/77/* 0064 */,/*101*/78/* 0065 */,/*102*/79/* 0066 */, /*103*/80/* 0067 */,/*104*/81/* 0068 */,/*105*/82/* 0069 */,/*106*/83/* 006A */,/*107*/84/* 006B */,/*108*/85/* 006C */, /*109*/86/* 006D */,/*110*/87/* 006E */,/*111*/88/* 006F */,/*112*/89/* 0070 */,/*113*/90/* 0071 */,/*114*/91/* 0072 */, /*115*/92/* 0073 */,/*116*/93/* 0074 */,/*117*/94/* 0075 */,/*118*/95/* 0076 */,/*119*/96/* 0077 */,/*120*/97/* 0078 */, /*121*/98/* 0079 */,/*122*/99/* 007A */,/*123*/100/* 007B */,/*124*/101/* 007C */,/*125*/102/* 007D */, /*126*/103/* 007E */,/*127*/1/* 007F */,/*128*/104/* 0080 */,/*129*/104/* 0081 */,/*130*/104/* 0082 */, /*131*/104/* 0083 */,/*132*/104/* 0084 */,/*133*/105/* 0085 */,/*134*/104/* 0086 */,/*135*/104/* 0087 */, /*136*/104/* 0088 */,/*137*/104/* 0089 */,/*138*/104/* 008A */,/*139*/104/* 008B */,/*140*/104/* 008C */, /*141*/104/* 008D */,/*142*/104/* 008E */,/*143*/104/* 008F */,/*144*/104/* 0090 */,/*145*/104/* 0091 */, /*146*/104/* 0092 */,/*147*/104/* 0093 */,/*148*/104/* 0094 */,/*149*/104/* 0095 */,/*150*/104/* 0096 */, /*151*/104/* 0097 */,/*152*/104/* 0098 */,/*153*/104/* 0099 */,/*154*/104/* 009A */,/*155*/104/* 009B */, /*156*/104/* 009C */,/*157*/104/* 009D */,/*158*/104/* 009E */,/*159*/104/* 009F */,/*160*/106/* 00A0 */, /*161*/107/* 00A1 */,/*162*/108/* 00A2 */,/*163*/109/* 00A3 */,/*164*/110/* 00A4 */,/*165*/111/* 00A5 */, /*166*/112/* 00A6 */,/*167*/113/* 00A7 */,/*168*/114/* 00A8 */,/*169*/115/* 00A9 */,/*170*/116/* 00AA */, /*171*/117/* 00AB */,/*172*/118/* 00AC */,/*173*/119/* 00AD */,/*174*/120/* 00AE */,/*175*/121/* 00AF */, /*176*/122/* 00B0 */,/*177*/123/* 00B1 */,/*178*/124/* 00B2 */,/*179*/125/* 00B3 */,/*180*/126/* 00B4 */, /*181*/127/* 00B5 */,/*182*/128/* 00B6 */,/*183*/129/* 00B7 */,/*184*/130/* 00B8 */,/*185*/131/* 00B9 */, /*186*/132/* 00BA */,/*187*/133/* 00BB */,/*188*/134/* 00BC */,/*189*/135/* 00BD */,/*190*/136/* 00BE */, /*191*/137/* 00BF */,/*192*/138/* 00C0 */,/*193*/139/* 00C1 */,/*194*/140/* 00C2 */,/*195*/141/* 00C3 */, /*196*/142/* 00C4 */,/*197*/143/* 00C5 */,/*198*/144/* 00C6 */,/*199*/145/* 00C7 */,/*200*/146/* 00C8 */, /*201*/147/* 00C9 */,/*202*/148/* 00CA */,/*203*/149/* 00CB */,/*204*/150/* 00CC */,/*205*/151/* 00CD */, /*206*/152/* 00CE */,/*207*/153/* 00CF */,/*208*/154/* 00D0 */,/*209*/155/* 00D1 */,/*210*/156/* 00D2 */, /*211*/157/* 00D3 */,/*212*/158/* 00D4 */,/*213*/159/* 00D5 */,/*214*/160/* 00D6 */,/*215*/161/* 00D7 */, /*216*/162/* 00D8 */,/*217*/163/* 00D9 */,/*218*/164/* 00DA */,/*219*/165/* 00DB */,/*220*/166/* 00DC */, /*221*/167/* 00DD */,/*222*/168/* 00DE */,/*223*/169/* 00DF */,/*224*/170/* 00E0 */,/*225*/171/* 00E1 */, /*226*/172/* 00E2 */,/*227*/173/* 00E3 */,/*228*/174/* 00E4 */,/*229*/175/* 00E5 */,/*230*/176/* 00E6 */, /*231*/177/* 00E7 */,/*232*/178/* 00E8 */,/*233*/179/* 00E9 */,/*234*/180/* 00EA */,/*235*/181/* 00EB */, /*236*/182/* 00EC */,/*237*/183/* 00ED */,/*238*/184/* 00EE */,/*239*/185/* 00EF */,/*240*/186/* 00F0 */, /*241*/187/* 00F1 */,/*242*/188/* 00F2 */,/*243*/189/* 00F3 */,/*244*/190/* 00F4 */,/*245*/191/* 00F5 */, /*246*/192/* 00F6 */,/*247*/193/* 00F7 */,/*248*/194/* 00F8 */,/*249*/195/* 00F9 */,/*250*/196/* 00FA */, /*251*/197/* 00FB */,/*252*/198/* 00FC */,/*253*/199/* 00FD */,/*254*/200/* 00FE */,/*255*/201/* 00FF */, /*256*/202/* 0100 */,/*257*/203/* 0101 */,/*258*/204/* 0102 */,/*259*/205/* 0103 */,/*260*/206/* 0104 */, /*261*/207/* 0105 */,/*262*/208/* 0106 */,/*263*/209/* 0107 */,/*264*/210/* 0108 */,/*265*/211/* 0109 */, /*266*/212/* 010A */,/*267*/213/* 010B */,/*268*/214/* 010C */,/*269*/215/* 010D */,/*270*/216/* 010E */, /*271*/217/* 010F */,/*272*/218/* 0110 */,/*273*/219/* 0111 */,/*274*/220/* 0112 */,/*275*/221/* 0113 */, /*276*/222/* 0114 */,/*277*/223/* 0115 */,/*278*/224/* 0116 */,/*279*/225/* 0117 */,/*280*/226/* 0118 */, /*281*/227/* 0119 */,/*282*/228/* 011A */,/*283*/229/* 011B */,/*284*/230/* 011C */,/*285*/231/* 011D */, /*286*/232/* 011E */,/*287*/233/* 011F */,/*288*/234/* 0120 */,/*289*/235/* 0121 */,/*290*/236/* 0122 */, /*291*/237/* 0123 */,/*292*/238/* 0124 */,/*293*/239/* 0125 */,/*294*/240/* 0126 */,/*295*/241/* 0127 */, /*296*/242/* 0128 */,/*297*/243/* 0129 */,/*298*/244/* 012A */,/*299*/245/* 012B */,/*300*/246/* 012C */, /*301*/247/* 012D */,/*302*/248/* 012E */,/*303*/249/* 012F */,/*304*/250/* 0130 */,/*305*/251/* 0131 */, /*306*/252/* 0132 */,/*307*/253/* 0133 */,/*308*/254/* 0134 */,/*309*/255/* 0135 */,/*310*/256/* 0136 */, /*311*/257/* 0137 */,/*312*/258/* 0138 */,/*313*/259/* 0139 */,/*314*/260/* 013A */,/*315*/261/* 013B */, /*316*/262/* 013C */,/*317*/263/* 013D */,/*318*/264/* 013E */,/*319*/265/* 013F */,/*320*/266/* 0140 */, /*321*/267/* 0141 */,/*322*/268/* 0142 */,/*323*/269/* 0143 */,/*324*/270/* 0144 */,/*325*/271/* 0145 */, /*326*/272/* 0146 */,/*327*/273/* 0147 */,/*328*/274/* 0148 */,/*329*/275/* 0149 */,/*330*/276/* 014A */, /*331*/277/* 014B */,/*332*/278/* 014C */,/*333*/279/* 014D */,/*334*/280/* 014E */,/*335*/281/* 014F */, /*336*/282/* 0150 */,/*337*/283/* 0151 */,/*338*/284/* 0152 */,/*339*/285/* 0153 */,/*340*/286/* 0154 */, /*341*/287/* 0155 */,/*342*/288/* 0156 */,/*343*/289/* 0157 */,/*344*/290/* 0158 */,/*345*/291/* 0159 */, /*346*/292/* 015A */,/*347*/293/* 015B */,/*348*/294/* 015C */,/*349*/295/* 015D */,/*350*/296/* 015E */, /*351*/297/* 015F */,/*352*/298/* 0160 */,/*353*/299/* 0161 */,/*354*/300/* 0162 */,/*355*/301/* 0163 */, /*356*/302/* 0164 */,/*357*/303/* 0165 */,/*358*/304/* 0166 */,/*359*/305/* 0167 */,/*360*/306/* 0168 */, /*361*/307/* 0169 */,/*362*/308/* 016A */,/*363*/309/* 016B */,/*364*/310/* 016C */,/*365*/311/* 016D */, /*366*/312/* 016E */,/*367*/313/* 016F */,/*368*/314/* 0170 */,/*369*/315/* 0171 */,/*370*/316/* 0172 */, /*371*/317/* 0173 */,/*372*/318/* 0174 */,/*373*/319/* 0175 */,/*374*/320/* 0176 */,/*375*/321/* 0177 */, /*376*/322/* 0178 */,/*377*/323/* 0179 */,/*378*/324/* 017A */,/*379*/325/* 017B */,/*380*/326/* 017C */, /*381*/327/* 017D */,/*382*/328/* 017E */,/*383*/329/* 017F */,/*384*/330/* 0180 */,/*385*/331/* 0181 */, /*386*/332/* 0182 */,/*387*/333/* 0183 */,/*388*/334/* 0184 */,/*389*/335/* 0185 */,/*390*/336/* 0186 */, /*391*/337/* 0187 */,/*392*/338/* 0188 */,/*393*/339/* 0189 */,/*394*/340/* 018A */,/*395*/341/* 018B */, /*396*/342/* 018C */,/*397*/343/* 018D */,/*398*/344/* 018E */,/*399*/345/* 018F */,/*400*/346/* 0190 */, /*401*/347/* 0191 */,/*402*/348/* 0192 */,/*403*/349/* 0193 */,/*404*/350/* 0194 */,/*405*/351/* 0195 */, /*406*/352/* 0196 */,/*407*/353/* 0197 */,/*408*/354/* 0198 */,/*409*/355/* 0199 */,/*410*/356/* 019A */, /*411*/357/* 019B */,/*412*/358/* 019C */,/*413*/359/* 019D */,/*414*/360/* 019E */,/*415*/361/* 019F */, /*416*/362/* 01A0 */,/*417*/363/* 01A1 */,/*418*/364/* 01A2 */,/*419*/365/* 01A3 */,/*420*/366/* 01A4 */, /*421*/367/* 01A5 */,/*422*/368/* 01A6 */,/*423*/369/* 01A7 */,/*424*/370/* 01A8 */,/*425*/371/* 01A9 */, /*426*/372/* 01AA */,/*427*/373/* 01AB */,/*428*/374/* 01AC */,/*429*/375/* 01AD */,/*430*/376/* 01AE */, /*431*/377/* 01AF */,/*432*/378/* 01B0 */,/*433*/379/* 01B1 */,/*434*/380/* 01B2 */,/*435*/381/* 01B3 */, /*436*/382/* 01B4 */,/*437*/383/* 01B5 */,/*438*/384/* 01B6 */,/*439*/385/* 01B7 */,/*440*/386/* 01B8 */, /*441*/387/* 01B9 */,/*442*/388/* 01BA */,/*443*/389/* 01BB */,/*444*/390/* 01BC */,/*445*/391/* 01BD */, /*446*/392/* 01BE */,/*447*/393/* 01BF */,/*448*/394/* 01C0 */,/*449*/395/* 01C1 */,/*450*/396/* 01C2 */, /*451*/397/* 01C3 */,/*452*/398/* 01C4 */,/*453*/399/* 01C5 */,/*454*/400/* 01C6 */,/*455*/401/* 01C7 */, /*456*/402/* 01C8 */,/*457*/403/* 01C9 */,/*458*/404/* 01CA */,/*459*/405/* 01CB */,/*460*/406/* 01CC */, /*461*/407/* 01CD */,/*462*/408/* 01CE */,/*463*/409/* 01CF */,/*464*/410/* 01D0 */,/*465*/411/* 01D1 */, /*466*/412/* 01D2 */,/*467*/413/* 01D3 */,/*468*/414/* 01D4 */,/*469*/415/* 01D5 */,/*470*/416/* 01D6 */, /*471*/417/* 01D7 */,/*472*/418/* 01D8 */,/*473*/419/* 01D9 */,/*474*/420/* 01DA */,/*475*/421/* 01DB */, /*476*/422/* 01DC */,/*477*/423/* 01DD */,/*478*/424/* 01DE */,/*479*/425/* 01DF */,/*480*/426/* 01E0 */, /*481*/427/* 01E1 */,/*482*/428/* 01E2 */,/*483*/429/* 01E3 */,/*484*/430/* 01E4 */,/*485*/431/* 01E5 */, /*486*/432/* 01E6 */,/*487*/433/* 01E7 */,/*488*/434/* 01E8 */,/*489*/435/* 01E9 */,/*490*/436/* 01EA */, /*491*/437/* 01EB */,/*492*/438/* 01EC */,/*493*/439/* 01ED */,/*494*/440/* 01EE */,/*495*/441/* 01EF */, /*496*/442/* 01F0 */,/*497*/443/* 01F1 */,/*498*/444/* 01F2 */,/*499*/445/* 01F3 */,/*500*/446/* 01F4 */, /*501*/447/* 01F5 */,/*502*/448/* 01F6 */,/*503*/449/* 01F7 */,/*504*/450/* 01F8 */,/*505*/451/* 01F9 */, /*506*/452/* 01FA */,/*507*/453/* 01FB */,/*508*/454/* 01FC */,/*509*/455/* 01FD */,/*510*/456/* 01FE */, /*511*/457/* 01FF */,/*512*/458/* 0200 */,/*513*/459/* 0201 */,/*514*/460/* 0202 */,/*515*/461/* 0203 */, /*516*/462/* 0204 */,/*517*/463/* 0205 */,/*518*/464/* 0206 */,/*519*/465/* 0207 */,/*520*/466/* 0208 */, /*521*/467/* 0209 */,/*522*/468/* 020A */,/*523*/469/* 020B */,/*524*/470/* 020C */,/*525*/471/* 020D */, /*526*/472/* 020E */,/*527*/473/* 020F */,/*528*/474/* 0210 */,/*529*/475/* 0211 */,/*530*/476/* 0212 */, /*531*/477/* 0213 */,/*532*/478/* 0214 */,/*533*/479/* 0215 */,/*534*/480/* 0216 */,/*535*/481/* 0217 */, /*536*/482/* 0218 */,/*537*/483/* 0219 */,/*538*/484/* 021A */,/*539*/485/* 021B */,/*540*/486/* 021C */, /*541*/487/* 021D */,/*542*/488/* 021E */,/*543*/489/* 021F */,/*544*/490/* 0220 */,/*545*/491/* 0221 */, /*546*/492/* 0222 */,/*547*/493/* 0223 */,/*548*/494/* 0224 */,/*549*/495/* 0225 */,/*550*/496/* 0226 */, /*551*/497/* 0227 */,/*552*/498/* 0228 */,/*553*/499/* 0229 */,/*554*/500/* 022A */,/*555*/501/* 022B */, /*556*/502/* 022C */,/*557*/503/* 022D */,/*558*/504/* 022E */,/*559*/505/* 022F */,/*560*/506/* 0230 */, /*561*/507/* 0231 */,/*562*/508/* 0232 */,/*563*/509/* 0233 */,/*564*/510/* 0234 */,/*565*/511/* 0235 */, /*566*/512/* 0236 */,/*567*/513/* 0237 */,/*568*/514/* 0238 */,/*569*/515/* 0239 */,/*570*/516/* 023A */, /*571*/517/* 023B */,/*572*/518/* 023C */,/*573*/519/* 023D */,/*574*/520/* 023E */,/*575*/521/* 023F */, /*576*/522/* 0240 */,/*577*/523/* 0241 */,/*578*/524/* 0242 */,/*579*/525/* 0243 */,/*580*/526/* 0244 */, /*581*/527/* 0245 */,/*582*/528/* 0246 */,/*583*/529/* 0247 */,/*584*/530/* 0248 */,/*585*/531/* 0249 */, /*586*/532/* 024A */,/*587*/533/* 024B */,/*588*/534/* 024C */,/*589*/535/* 024D */,/*590*/536/* 024E */, /*591*/537/* 024F */,/*592*/538/* 0250 */,/*593*/539/* 0251 */,/*594*/540/* 0252 */,/*595*/541/* 0253 */, /*596*/542/* 0254 */,/*597*/543/* 0255 */,/*598*/544/* 0256 */,/*599*/545/* 0257 */,/*600*/546/* 0258 */, /*601*/547/* 0259 */,/*602*/548/* 025A */,/*603*/549/* 025B */,/*604*/550/* 025C */,/*605*/551/* 025D */, /*606*/552/* 025E */,/*607*/553/* 025F */,/*608*/554/* 0260 */,/*609*/555/* 0261 */,/*610*/556/* 0262 */, /*611*/557/* 0263 */,/*612*/558/* 0264 */,/*613*/559/* 0265 */,/*614*/560/* 0266 */,/*615*/561/* 0267 */, /*616*/562/* 0268 */,/*617*/563/* 0269 */,/*618*/564/* 026A */,/*619*/565/* 026B */,/*620*/566/* 026C */, /*621*/567/* 026D */,/*622*/568/* 026E */,/*623*/569/* 026F */,/*624*/570/* 0270 */,/*625*/571/* 0271 */, /*626*/572/* 0272 */,/*627*/573/* 0273 */,/*628*/574/* 0274 */,/*629*/575/* 0275 */,/*630*/576/* 0276 */, /*631*/577/* 0277 */,/*632*/578/* 0278 */,/*633*/579/* 0279 */,/*634*/580/* 027A */,/*635*/581/* 027B */, /*636*/582/* 027C */,/*637*/583/* 027D */,/*638*/584/* 027E */,/*639*/585/* 027F */,/*640*/586/* 0280 */, /*641*/587/* 0281 */,/*642*/588/* 0282 */,/*643*/589/* 0283 */,/*644*/590/* 0284 */,/*645*/591/* 0285 */, /*646*/592/* 0286 */,/*647*/593/* 0287 */,/*648*/594/* 0288 */,/*649*/595/* 0289 */,/*650*/596/* 028A */, /*651*/597/* 028B */,/*652*/598/* 028C */,/*653*/599/* 028D */,/*654*/600/* 028E */,/*655*/601/* 028F */, /*656*/602/* 0290 */,/*657*/603/* 0291 */,/*658*/604/* 0292 */,/*659*/605/* 0293 */,/*660*/606/* 0294 */, /*661*/607/* 0295 */,/*662*/608/* 0296 */,/*663*/609/* 0297 */,/*664*/610/* 0298 */,/*665*/611/* 0299 */, /*666*/612/* 029A */,/*667*/613/* 029B */,/*668*/614/* 029C */,/*669*/615/* 029D */,/*670*/616/* 029E */, /*671*/617/* 029F */,/*672*/618/* 02A0 */,/*673*/619/* 02A1 */,/*674*/620/* 02A2 */,/*675*/621/* 02A3 */, /*676*/622/* 02A4 */,/*677*/623/* 02A5 */,/*678*/624/* 02A6 */,/*679*/625/* 02A7 */,/*680*/626/* 02A8 */, /*681*/627/* 02A9 */,/*682*/628/* 02AA */,/*683*/629/* 02AB */,/*684*/630/* 02AC */,/*685*/631/* 02AD */, /*686*/632/* 02AE */,/*687*/633/* 02AF */,/*688*/634/* 02B0 */,/*689*/635/* 02B1 */,/*690*/636/* 02B2 */, /*691*/637/* 02B3 */,/*692*/638/* 02B4 */,/*693*/639/* 02B5 */,/*694*/640/* 02B6 */,/*695*/641/* 02B7 */, /*696*/642/* 02B8 */,/*697*/643/* 02B9 */,/*698*/644/* 02BA */,/*699*/645/* 02BB */,/*700*/646/* 02BC */, /*701*/647/* 02BD */,/*702*/648/* 02BE */,/*703*/649/* 02BF */,/*704*/650/* 02C0 */,/*705*/651/* 02C1 */, /*706*/652/* 02C2 */,/*707*/653/* 02C3 */,/*708*/654/* 02C4 */,/*709*/655/* 02C5 */,/*710*/656/* 02C6 */, /*711*/657/* 02C7 */,/*712*/658/* 02C8 */,/*713*/659/* 02C9 */,/*714*/660/* 02CA */,/*715*/661/* 02CB */, /*716*/662/* 02CC */,/*717*/663/* 02CD */,/*718*/664/* 02CE */,/*719*/665/* 02CF */,/*720*/666/* 02D0 */, /*721*/667/* 02D1 */,/*722*/668/* 02D2 */,/*723*/669/* 02D3 */,/*724*/670/* 02D4 */,/*725*/671/* 02D5 */, /*726*/672/* 02D6 */,/*727*/673/* 02D7 */,/*728*/674/* 02D8 */,/*729*/675/* 02D9 */,/*730*/676/* 02DA */, /*731*/677/* 02DB */,/*732*/678/* 02DC */,/*733*/679/* 02DD */,/*734*/680/* 02DE */,/*735*/681/* 02DF */, /*736*/682/* 02E0 */,/*737*/683/* 02E1 */,/*738*/684/* 02E2 */,/*739*/685/* 02E3 */,/*740*/686/* 02E4 */, /*741*/687/* 02E5 */,/*742*/688/* 02E6 */,/*743*/689/* 02E7 */,/*744*/690/* 02E8 */,/*745*/691/* 02E9 */, /*746*/692/* 02EA */,/*747*/693/* 02EB */,/*748*/694/* 02EC */,/*749*/695/* 02ED */,/*750*/696/* 02EE */, /*751*/697/* 02EF */,/*752*/698/* 02F0 */,/*753*/699/* 02F1 */,/*754*/700/* 02F2 */,/*755*/701/* 02F3 */, /*756*/702/* 02F4 */,/*757*/703/* 02F5 */,/*758*/704/* 02F6 */,/*759*/705/* 02F7 */,/*760*/706/* 02F8 */, /*761*/707/* 02F9 */,/*762*/708/* 02FA */,/*763*/709/* 02FB */,/*764*/710/* 02FC */,/*765*/711/* 02FD */, /*766*/712/* 02FE */,/*767*/713/* 02FF */,/*768*/714/* 0300 */,/*769*/715/* 0301 */,/*770*/716/* 0302 */, /*771*/717/* 0303 */,/*772*/718/* 0304 */,/*773*/719/* 0305 */,/*774*/720/* 0306 */,/*775*/721/* 0307 */, /*776*/722/* 0308 */,/*777*/723/* 0309 */,/*778*/724/* 030A */,/*779*/725/* 030B */,/*780*/726/* 030C */, /*781*/727/* 030D */,/*782*/727/* 030E */,/*783*/728/* 030F */,/*784*/729/* 0310 */,/*785*/730/* 0311 */, /*786*/727/* 0312 */,/*787*/731/* 0313 */,/*788*/732/* 0314 */,/*789*/733/* 0315 */,/*790*/734/* 0316 */, /*791*/734/* 0317 */,/*792*/734/* 0318 */,/*793*/734/* 0319 */,/*794*/733/* 031A */,/*795*/735/* 031B */, /*796*/734/* 031C */,/*797*/734/* 031D */,/*798*/734/* 031E */,/*799*/734/* 031F */,/*800*/734/* 0320 */, /*801*/736/* 0321 */,/*802*/737/* 0322 */,/*803*/738/* 0323 */,/*804*/739/* 0324 */,/*805*/740/* 0325 */, /*806*/741/* 0326 */,/*807*/742/* 0327 */,/*808*/743/* 0328 */,/*809*/734/* 0329 */,/*810*/734/* 032A */, /*811*/734/* 032B */,/*812*/734/* 032C */,/*813*/744/* 032D */,/*814*/745/* 032E */,/*815*/734/* 032F */, /*816*/746/* 0330 */,/*817*/747/* 0331 */,/*818*/748/* 0332 */,/*819*/734/* 0333 */,/*820*/749/* 0334 */, /*821*/750/* 0335 */,/*822*/751/* 0336 */,/*823*/751/* 0337 */,/*824*/752/* 0338 */,/*825*/753/* 0339 */, /*826*/734/* 033A */,/*827*/734/* 033B */,/*828*/734/* 033C */,/*829*/727/* 033D */,/*830*/727/* 033E */, /*831*/727/* 033F */,/*832*/754/* 0340 */,/*833*/755/* 0341 */,/*834*/756/* 0342 */,/*835*/757/* 0343 */, /*836*/758/* 0344 */,/*837*/759/* 0345 */,/*838*/760/* 0346 */,/*839*/761/* 0347 */,/*840*/761/* 0348 */, /*841*/761/* 0349 */,/*842*/760/* 034A */,/*843*/760/* 034B */,/*844*/760/* 034C */,/*845*/761/* 034D */, /*846*/761/* 034E */,/*847*/762/* 034F */,/*848*/763/* 0350 */,/*849*/763/* 0351 */,/*850*/763/* 0352 */, /*851*/764/* 0353 */,/*852*/764/* 0354 */,/*853*/764/* 0355 */,/*854*/764/* 0356 */,/*855*/763/* 0357 */, /*856*/765/* 0358 */,/*857*/766/* 0359 */,/*858*/766/* 035A */,/*859*/767/* 035B */,/*860*/768/* 035C */, /*861*/769/* 035D */,/*862*/769/* 035E */,/*863*/770/* 035F */,/*864*/771/* 0360 */,/*865*/772/* 0361 */, /*866*/773/* 0362 */,/*867*/774/* 0363 */,/*868*/775/* 0364 */,/*869*/776/* 0365 */,/*870*/777/* 0366 */, /*871*/778/* 0367 */,/*872*/779/* 0368 */,/*873*/780/* 0369 */,/*874*/781/* 036A */,/*875*/782/* 036B */, /*876*/783/* 036C */,/*877*/784/* 036D */,/*878*/785/* 036E */,/*879*/786/* 036F */,/*880*/787/* 0370 */, /*881*/788/* 0371 */,/*882*/789/* 0372 */,/*883*/790/* 0373 */,/*884*/791/* 0374 */,/*885*/792/* 0375 */, /*886*/793/* 0376 */,/*887*/794/* 0377 */,0,0,/*890*/795/* 037A */,/*891*/796/* 037B */,/*892*/797/* 037C */, /*893*/798/* 037D */,/*894*/799/* 037E */,/*895*/800/* 037F */,0,0,0,0,/*900*/801/* 0384 */,/*901*/802/* 0385 */, /*902*/803/* 0386 */,/*903*/804/* 0387 */,/*904*/805/* 0388 */,/*905*/806/* 0389 */,/*906*/807/* 038A */,0, /*908*/808/* 038C */,0,/*910*/809/* 038E */,/*911*/810/* 038F */,/*912*/811/* 0390 */,/*913*/812/* 0391 */, /*914*/813/* 0392 */,/*915*/814/* 0393 */,/*916*/815/* 0394 */,/*917*/816/* 0395 */,/*918*/817/* 0396 */, /*919*/818/* 0397 */,/*920*/819/* 0398 */,/*921*/820/* 0399 */,/*922*/821/* 039A */,/*923*/822/* 039B */, /*924*/823/* 039C */,/*925*/824/* 039D */,/*926*/825/* 039E */,/*927*/826/* 039F */,/*928*/827/* 03A0 */, /*929*/828/* 03A1 */,0,/*931*/829/* 03A3 */,/*932*/830/* 03A4 */,/*933*/831/* 03A5 */,/*934*/832/* 03A6 */, /*935*/833/* 03A7 */,/*936*/834/* 03A8 */,/*937*/835/* 03A9 */,/*938*/836/* 03AA */,/*939*/837/* 03AB */, /*940*/838/* 03AC */,/*941*/839/* 03AD */,/*942*/840/* 03AE */,/*943*/841/* 03AF */,/*944*/842/* 03B0 */, /*945*/843/* 03B1 */,/*946*/844/* 03B2 */,/*947*/845/* 03B3 */,/*948*/846/* 03B4 */,/*949*/847/* 03B5 */, /*950*/848/* 03B6 */,/*951*/849/* 03B7 */,/*952*/850/* 03B8 */,/*953*/851/* 03B9 */,/*954*/852/* 03BA */, /*955*/853/* 03BB */,/*956*/854/* 03BC */,/*957*/855/* 03BD */,/*958*/856/* 03BE */,/*959*/857/* 03BF */, /*960*/858/* 03C0 */,/*961*/859/* 03C1 */,/*962*/860/* 03C2 */,/*963*/861/* 03C3 */,/*964*/862/* 03C4 */, /*965*/863/* 03C5 */,/*966*/864/* 03C6 */,/*967*/865/* 03C7 */,/*968*/866/* 03C8 */,/*969*/867/* 03C9 */, /*970*/868/* 03CA */,/*971*/869/* 03CB */,/*972*/870/* 03CC */,/*973*/871/* 03CD */,/*974*/872/* 03CE */, /*975*/873/* 03CF */,/*976*/874/* 03D0 */,/*977*/875/* 03D1 */,/*978*/876/* 03D2 */,/*979*/877/* 03D3 */, /*980*/878/* 03D4 */,/*981*/879/* 03D5 */,/*982*/880/* 03D6 */,/*983*/881/* 03D7 */,/*984*/882/* 03D8 */, /*985*/883/* 03D9 */,/*986*/884/* 03DA */,/*987*/885/* 03DB */,/*988*/886/* 03DC */,/*989*/887/* 03DD */, /*990*/888/* 03DE */,/*991*/889/* 03DF */,/*992*/890/* 03E0 */,/*993*/891/* 03E1 */,/*994*/892/* 03E2 */, /*995*/893/* 03E3 */,/*996*/894/* 03E4 */,/*997*/895/* 03E5 */,/*998*/896/* 03E6 */,/*999*/897/* 03E7 */, /*1000*/898/* 03E8 */,/*1001*/899/* 03E9 */,/*1002*/900/* 03EA */,/*1003*/901/* 03EB */,/*1004*/902/* 03EC */, /*1005*/903/* 03ED */,/*1006*/904/* 03EE */,/*1007*/905/* 03EF */,/*1008*/906/* 03F0 */,/*1009*/907/* 03F1 */, /*1010*/908/* 03F2 */,/*1011*/909/* 03F3 */,/*1012*/910/* 03F4 */,/*1013*/911/* 03F5 */,/*1014*/912/* 03F6 */, /*1015*/913/* 03F7 */,/*1016*/914/* 03F8 */,/*1017*/915/* 03F9 */,/*1018*/916/* 03FA */,/*1019*/917/* 03FB */, /*1020*/918/* 03FC */,/*1021*/919/* 03FD */,/*1022*/920/* 03FE */,/*1023*/921/* 03FF */,/*1024*/922/* 0400 */, /*1025*/923/* 0401 */,/*1026*/924/* 0402 */,/*1027*/925/* 0403 */,/*1028*/926/* 0404 */,/*1029*/927/* 0405 */, /*1030*/928/* 0406 */,/*1031*/929/* 0407 */,/*1032*/930/* 0408 */,/*1033*/931/* 0409 */,/*1034*/932/* 040A */, /*1035*/933/* 040B */,/*1036*/934/* 040C */,/*1037*/935/* 040D */,/*1038*/936/* 040E */,/*1039*/937/* 040F */, /*1040*/938/* 0410 */,/*1041*/939/* 0411 */,/*1042*/940/* 0412 */,/*1043*/941/* 0413 */,/*1044*/942/* 0414 */, /*1045*/943/* 0415 */,/*1046*/944/* 0416 */,/*1047*/945/* 0417 */,/*1048*/946/* 0418 */,/*1049*/947/* 0419 */, /*1050*/948/* 041A */,/*1051*/949/* 041B */,/*1052*/950/* 041C */,/*1053*/951/* 041D */,/*1054*/952/* 041E */, /*1055*/953/* 041F */,/*1056*/954/* 0420 */,/*1057*/955/* 0421 */,/*1058*/956/* 0422 */,/*1059*/957/* 0423 */, /*1060*/958/* 0424 */,/*1061*/959/* 0425 */,/*1062*/960/* 0426 */,/*1063*/961/* 0427 */,/*1064*/962/* 0428 */, /*1065*/963/* 0429 */,/*1066*/964/* 042A */,/*1067*/965/* 042B */,/*1068*/966/* 042C */,/*1069*/967/* 042D */, /*1070*/968/* 042E */,/*1071*/969/* 042F */,/*1072*/970/* 0430 */,/*1073*/971/* 0431 */,/*1074*/972/* 0432 */, /*1075*/973/* 0433 */,/*1076*/974/* 0434 */,/*1077*/975/* 0435 */,/*1078*/976/* 0436 */,/*1079*/977/* 0437 */, /*1080*/978/* 0438 */,/*1081*/979/* 0439 */,/*1082*/980/* 043A */,/*1083*/981/* 043B */,/*1084*/982/* 043C */, /*1085*/983/* 043D */,/*1086*/984/* 043E */,/*1087*/985/* 043F */,/*1088*/986/* 0440 */,/*1089*/987/* 0441 */, /*1090*/988/* 0442 */,/*1091*/989/* 0443 */,/*1092*/990/* 0444 */,/*1093*/991/* 0445 */,/*1094*/992/* 0446 */, /*1095*/993/* 0447 */,/*1096*/994/* 0448 */,/*1097*/995/* 0449 */,/*1098*/996/* 044A */,/*1099*/997/* 044B */, /*1100*/998/* 044C */,/*1101*/999/* 044D */,/*1102*/1000/* 044E */,/*1103*/1001/* 044F */,/*1104*/1002/* 0450 */, /*1105*/1003/* 0451 */,/*1106*/1004/* 0452 */,/*1107*/1005/* 0453 */,/*1108*/1006/* 0454 */,/*1109*/1007/* 0455 */, /*1110*/1008/* 0456 */,/*1111*/1009/* 0457 */,/*1112*/1010/* 0458 */,/*1113*/1011/* 0459 */,/*1114*/1012/* 045A */, /*1115*/1013/* 045B */,/*1116*/1014/* 045C */,/*1117*/1015/* 045D */,/*1118*/1016/* 045E */,/*1119*/1017/* 045F */, /*1120*/1018/* 0460 */,/*1121*/1019/* 0461 */,/*1122*/1020/* 0462 */,/*1123*/1021/* 0463 */,/*1124*/1022/* 0464 */, /*1125*/1023/* 0465 */,/*1126*/1024/* 0466 */,/*1127*/1025/* 0467 */,/*1128*/1026/* 0468 */,/*1129*/1027/* 0469 */, /*1130*/1028/* 046A */,/*1131*/1029/* 046B */,/*1132*/1030/* 046C */,/*1133*/1031/* 046D */,/*1134*/1032/* 046E */, /*1135*/1033/* 046F */,/*1136*/1034/* 0470 */,/*1137*/1035/* 0471 */,/*1138*/1036/* 0472 */,/*1139*/1037/* 0473 */, /*1140*/1038/* 0474 */,/*1141*/1039/* 0475 */,/*1142*/1040/* 0476 */,/*1143*/1041/* 0477 */,/*1144*/1042/* 0478 */, /*1145*/1043/* 0479 */,/*1146*/1044/* 047A */,/*1147*/1045/* 047B */,/*1148*/1046/* 047C */,/*1149*/1047/* 047D */, /*1150*/1048/* 047E */,/*1151*/1049/* 047F */,/*1152*/1050/* 0480 */,/*1153*/1051/* 0481 */,/*1154*/1052/* 0482 */, /*1155*/1053/* 0483 */,/*1156*/1054/* 0484 */,/*1157*/1055/* 0485 */,/*1158*/1056/* 0486 */,/*1159*/1057/* 0487 */, /*1160*/1058/* 0488 */,/*1161*/1058/* 0489 */,/*1162*/1059/* 048A */,/*1163*/1060/* 048B */,/*1164*/1061/* 048C */, /*1165*/1062/* 048D */,/*1166*/1063/* 048E */,/*1167*/1064/* 048F */,/*1168*/1065/* 0490 */,/*1169*/1066/* 0491 */, /*1170*/1067/* 0492 */,/*1171*/1068/* 0493 */,/*1172*/1069/* 0494 */,/*1173*/1070/* 0495 */,/*1174*/1071/* 0496 */, /*1175*/1072/* 0497 */,/*1176*/1073/* 0498 */,/*1177*/1074/* 0499 */,/*1178*/1075/* 049A */,/*1179*/1076/* 049B */, /*1180*/1077/* 049C */,/*1181*/1078/* 049D */,/*1182*/1079/* 049E */,/*1183*/1080/* 049F */,/*1184*/1081/* 04A0 */, /*1185*/1082/* 04A1 */,/*1186*/1083/* 04A2 */,/*1187*/1084/* 04A3 */,/*1188*/1085/* 04A4 */,/*1189*/1086/* 04A5 */, /*1190*/1087/* 04A6 */,/*1191*/1088/* 04A7 */,/*1192*/1089/* 04A8 */,/*1193*/1090/* 04A9 */,/*1194*/1091/* 04AA */, /*1195*/1092/* 04AB */,/*1196*/1093/* 04AC */,/*1197*/1094/* 04AD */,/*1198*/1095/* 04AE */,/*1199*/1096/* 04AF */, /*1200*/1097/* 04B0 */,/*1201*/1098/* 04B1 */,/*1202*/1099/* 04B2 */,/*1203*/1100/* 04B3 */,/*1204*/1101/* 04B4 */, /*1205*/1102/* 04B5 */,/*1206*/1103/* 04B6 */,/*1207*/1104/* 04B7 */,/*1208*/1105/* 04B8 */,/*1209*/1106/* 04B9 */, /*1210*/1107/* 04BA */,/*1211*/1108/* 04BB */,/*1212*/1109/* 04BC */,/*1213*/1110/* 04BD */,/*1214*/1111/* 04BE */, /*1215*/1112/* 04BF */,/*1216*/1113/* 04C0 */,/*1217*/1114/* 04C1 */,/*1218*/1115/* 04C2 */,/*1219*/1116/* 04C3 */, /*1220*/1117/* 04C4 */,/*1221*/1118/* 04C5 */,/*1222*/1119/* 04C6 */,/*1223*/1120/* 04C7 */,/*1224*/1121/* 04C8 */, /*1225*/1122/* 04C9 */,/*1226*/1123/* 04CA */,/*1227*/1124/* 04CB */,/*1228*/1125/* 04CC */,/*1229*/1126/* 04CD */, /*1230*/1127/* 04CE */,/*1231*/1128/* 04CF */,/*1232*/1129/* 04D0 */,/*1233*/1130/* 04D1 */,/*1234*/1131/* 04D2 */, /*1235*/1132/* 04D3 */,/*1236*/1133/* 04D4 */,/*1237*/1134/* 04D5 */,/*1238*/1135/* 04D6 */,/*1239*/1136/* 04D7 */, /*1240*/1137/* 04D8 */,/*1241*/1138/* 04D9 */,/*1242*/1139/* 04DA */,/*1243*/1140/* 04DB */,/*1244*/1141/* 04DC */, /*1245*/1142/* 04DD */,/*1246*/1143/* 04DE */,/*1247*/1144/* 04DF */,/*1248*/1145/* 04E0 */,/*1249*/1146/* 04E1 */, /*1250*/1147/* 04E2 */,/*1251*/1148/* 04E3 */,/*1252*/1149/* 04E4 */,/*1253*/1150/* 04E5 */,/*1254*/1151/* 04E6 */, /*1255*/1152/* 04E7 */,/*1256*/1153/* 04E8 */,/*1257*/1154/* 04E9 */,/*1258*/1155/* 04EA */,/*1259*/1156/* 04EB */, /*1260*/1157/* 04EC */,/*1261*/1158/* 04ED */,/*1262*/1159/* 04EE */,/*1263*/1160/* 04EF */,/*1264*/1161/* 04F0 */, /*1265*/1162/* 04F1 */,/*1266*/1163/* 04F2 */,/*1267*/1164/* 04F3 */,/*1268*/1165/* 04F4 */,/*1269*/1166/* 04F5 */, /*1270*/1167/* 04F6 */,/*1271*/1168/* 04F7 */,/*1272*/1169/* 04F8 */,/*1273*/1170/* 04F9 */,/*1274*/1171/* 04FA */, /*1275*/1172/* 04FB */,/*1276*/1173/* 04FC */,/*1277*/1174/* 04FD */,/*1278*/1175/* 04FE */,/*1279*/1176/* 04FF */, /*1280*/1177/* 0500 */,/*1281*/1178/* 0501 */,/*1282*/1179/* 0502 */,/*1283*/1180/* 0503 */,/*1284*/1181/* 0504 */, /*1285*/1182/* 0505 */,/*1286*/1183/* 0506 */,/*1287*/1184/* 0507 */,/*1288*/1185/* 0508 */,/*1289*/1186/* 0509 */, /*1290*/1187/* 050A */,/*1291*/1188/* 050B */,/*1292*/1189/* 050C */,/*1293*/1190/* 050D */,/*1294*/1191/* 050E */, /*1295*/1192/* 050F */,/*1296*/1193/* 0510 */,/*1297*/1194/* 0511 */,/*1298*/1195/* 0512 */,/*1299*/1196/* 0513 */, /*1300*/1197/* 0514 */,/*1301*/1198/* 0515 */,/*1302*/1199/* 0516 */,/*1303*/1200/* 0517 */,/*1304*/1201/* 0518 */, /*1305*/1202/* 0519 */,/*1306*/1203/* 051A */,/*1307*/1204/* 051B */,/*1308*/1205/* 051C */,/*1309*/1206/* 051D */, /*1310*/1207/* 051E */,/*1311*/1208/* 051F */,/*1312*/1209/* 0520 */,/*1313*/1210/* 0521 */,/*1314*/1211/* 0522 */, /*1315*/1212/* 0523 */,/*1316*/1213/* 0524 */,/*1317*/1214/* 0525 */,/*1318*/1215/* 0526 */,/*1319*/1216/* 0527 */, /*1320*/1217/* 0528 */,/*1321*/1218/* 0529 */,/*1322*/1219/* 052A */,/*1323*/1220/* 052B */,/*1324*/1221/* 052C */, /*1325*/1222/* 052D */,/*1326*/1223/* 052E */,/*1327*/1224/* 052F */,0,/*1329*/1225/* 0531 */,/*1330*/1226/* 0532 */, /*1331*/1227/* 0533 */,/*1332*/1228/* 0534 */,/*1333*/1229/* 0535 */,/*1334*/1230/* 0536 */,/*1335*/1231/* 0537 */, /*1336*/1232/* 0538 */,/*1337*/1233/* 0539 */,/*1338*/1234/* 053A */,/*1339*/1235/* 053B */,/*1340*/1236/* 053C */, /*1341*/1237/* 053D */,/*1342*/1238/* 053E */,/*1343*/1239/* 053F */,/*1344*/1240/* 0540 */,/*1345*/1241/* 0541 */, /*1346*/1242/* 0542 */,/*1347*/1243/* 0543 */,/*1348*/1244/* 0544 */,/*1349*/1245/* 0545 */,/*1350*/1246/* 0546 */, /*1351*/1247/* 0547 */,/*1352*/1248/* 0548 */,/*1353*/1249/* 0549 */,/*1354*/1250/* 054A */,/*1355*/1251/* 054B */, /*1356*/1252/* 054C */,/*1357*/1253/* 054D */,/*1358*/1254/* 054E */,/*1359*/1255/* 054F */,/*1360*/1256/* 0550 */, /*1361*/1257/* 0551 */,/*1362*/1258/* 0552 */,/*1363*/1259/* 0553 */,/*1364*/1260/* 0554 */,/*1365*/1261/* 0555 */, /*1366*/1262/* 0556 */,0,0,/*1369*/1263/* 0559 */,/*1370*/1264/* 055A */,/*1371*/1265/* 055B */,/*1372*/1266/* 055C */, /*1373*/1267/* 055D */,/*1374*/1268/* 055E */,/*1375*/1269/* 055F */,0,/*1377*/1270/* 0561 */,/*1378*/1271/* 0562 */, /*1379*/1272/* 0563 */,/*1380*/1273/* 0564 */,/*1381*/1274/* 0565 */,/*1382*/1275/* 0566 */,/*1383*/1276/* 0567 */, /*1384*/1277/* 0568 */,/*1385*/1278/* 0569 */,/*1386*/1279/* 056A */,/*1387*/1280/* 056B */,/*1388*/1281/* 056C */, /*1389*/1282/* 056D */,/*1390*/1283/* 056E */,/*1391*/1284/* 056F */,/*1392*/1285/* 0570 */,/*1393*/1286/* 0571 */, /*1394*/1287/* 0572 */,/*1395*/1288/* 0573 */,/*1396*/1289/* 0574 */,/*1397*/1290/* 0575 */,/*1398*/1291/* 0576 */, /*1399*/1292/* 0577 */,/*1400*/1293/* 0578 */,/*1401*/1294/* 0579 */,/*1402*/1295/* 057A */,/*1403*/1296/* 057B */, /*1404*/1297/* 057C */,/*1405*/1298/* 057D */,/*1406*/1299/* 057E */,/*1407*/1300/* 057F */,/*1408*/1301/* 0580 */, /*1409*/1302/* 0581 */,/*1410*/1303/* 0582 */,/*1411*/1304/* 0583 */,/*1412*/1305/* 0584 */,/*1413*/1306/* 0585 */, /*1414*/1307/* 0586 */,/*1415*/1308/* 0587 */,0,/*1417*/1309/* 0589 */,/*1418*/1310/* 058A */,0,0,/*1421*/1311/* 058D */, /*1422*/1312/* 058E */,/*1423*/1313/* 058F */,0,/*1425*/1314/* 0591 */,/*1426*/1315/* 0592 */,/*1427*/1315/* 0593 */, /*1428*/1315/* 0594 */,/*1429*/1315/* 0595 */,/*1430*/1314/* 0596 */,/*1431*/1315/* 0597 */,/*1432*/1315/* 0598 */, /*1433*/1315/* 0599 */,/*1434*/1316/* 059A */,/*1435*/1314/* 059B */,/*1436*/1315/* 059C */,/*1437*/1315/* 059D */, /*1438*/1315/* 059E */,/*1439*/1315/* 059F */,/*1440*/1315/* 05A0 */,/*1441*/1315/* 05A1 */,/*1442*/1317/* 05A2 */, /*1443*/1314/* 05A3 */,/*1444*/1314/* 05A4 */,/*1445*/1314/* 05A5 */,/*1446*/1314/* 05A6 */,/*1447*/1314/* 05A7 */, /*1448*/1315/* 05A8 */,/*1449*/1315/* 05A9 */,/*1450*/1314/* 05AA */,/*1451*/1315/* 05AB */,/*1452*/1315/* 05AC */, /*1453*/1316/* 05AD */,/*1454*/1318/* 05AE */,/*1455*/1315/* 05AF */,/*1456*/1319/* 05B0 */,/*1457*/1320/* 05B1 */, /*1458*/1321/* 05B2 */,/*1459*/1322/* 05B3 */,/*1460*/1323/* 05B4 */,/*1461*/1324/* 05B5 */,/*1462*/1325/* 05B6 */, /*1463*/1326/* 05B7 */,/*1464*/1327/* 05B8 */,/*1465*/1328/* 05B9 */,/*1466*/1329/* 05BA */,/*1467*/1330/* 05BB */, /*1468*/1331/* 05BC */,/*1469*/1332/* 05BD */,/*1470*/1333/* 05BE */,/*1471*/1334/* 05BF */,/*1472*/1335/* 05C0 */, /*1473*/1336/* 05C1 */,/*1474*/1337/* 05C2 */,/*1475*/1338/* 05C3 */,/*1476*/1339/* 05C4 */,/*1477*/1340/* 05C5 */, /*1478*/1341/* 05C6 */,/*1479*/1342/* 05C7 */,0,0,0,0,0,0,0,0,/*1488*/1343/* 05D0 */,/*1489*/1344/* 05D1 */, /*1490*/1345/* 05D2 */,/*1491*/1346/* 05D3 */,/*1492*/1347/* 05D4 */,/*1493*/1348/* 05D5 */,/*1494*/1349/* 05D6 */, /*1495*/1350/* 05D7 */,/*1496*/1351/* 05D8 */,/*1497*/1352/* 05D9 */,/*1498*/1353/* 05DA */,/*1499*/1354/* 05DB */, /*1500*/1355/* 05DC */,/*1501*/1356/* 05DD */,/*1502*/1357/* 05DE */,/*1503*/1358/* 05DF */,/*1504*/1359/* 05E0 */, /*1505*/1360/* 05E1 */,/*1506*/1361/* 05E2 */,/*1507*/1362/* 05E3 */,/*1508*/1363/* 05E4 */,/*1509*/1364/* 05E5 */, /*1510*/1365/* 05E6 */,/*1511*/1366/* 05E7 */,/*1512*/1367/* 05E8 */,/*1513*/1368/* 05E9 */,/*1514*/1369/* 05EA */,0,0,0, 0,0,/*1520*/1370/* 05F0 */,/*1521*/1371/* 05F1 */,/*1522*/1372/* 05F2 */,/*1523*/1373/* 05F3 */,/*1524*/1374/* 05F4 */,0, 0,0,0,0,0,0,0,0,0,0,/*1536*/1375/* 0600 */,/*1537*/1375/* 0601 */,/*1538*/1375/* 0602 */,/*1539*/1375/* 0603 */, /*1540*/1376/* 0604 */,/*1541*/1377/* 0605 */,/*1542*/1378/* 0606 */,/*1543*/1379/* 0607 */,/*1544*/1380/* 0608 */, /*1545*/1381/* 0609 */,/*1546*/1382/* 060A */,/*1547*/1383/* 060B */,/*1548*/1384/* 060C */,/*1549*/1385/* 060D */, /*1550*/1386/* 060E */,/*1551*/1387/* 060F */,/*1552*/1388/* 0610 */,/*1553*/1388/* 0611 */,/*1554*/1388/* 0612 */, /*1555*/1388/* 0613 */,/*1556*/1388/* 0614 */,/*1557*/1388/* 0615 */,/*1558*/1389/* 0616 */,/*1559*/1389/* 0617 */, /*1560*/1390/* 0618 */,/*1561*/1391/* 0619 */,/*1562*/1392/* 061A */,/*1563*/1393/* 061B */,/*1564*/1394/* 061C */,0, /*1566*/1395/* 061E */,/*1567*/1396/* 061F */,/*1568*/1397/* 0620 */,/*1569*/1398/* 0621 */,/*1570*/1399/* 0622 */, /*1571*/1400/* 0623 */,/*1572*/1401/* 0624 */,/*1573*/1402/* 0625 */,/*1574*/1403/* 0626 */,/*1575*/1404/* 0627 */, /*1576*/1405/* 0628 */,/*1577*/1406/* 0629 */,/*1578*/1407/* 062A */,/*1579*/1408/* 062B */,/*1580*/1409/* 062C */, /*1581*/1410/* 062D */,/*1582*/1411/* 062E */,/*1583*/1412/* 062F */,/*1584*/1413/* 0630 */,/*1585*/1414/* 0631 */, /*1586*/1415/* 0632 */,/*1587*/1416/* 0633 */,/*1588*/1417/* 0634 */,/*1589*/1418/* 0635 */,/*1590*/1419/* 0636 */, /*1591*/1420/* 0637 */,/*1592*/1421/* 0638 */,/*1593*/1422/* 0639 */,/*1594*/1423/* 063A */,/*1595*/1424/* 063B */, /*1596*/1425/* 063C */,/*1597*/1426/* 063D */,/*1598*/1427/* 063E */,/*1599*/1428/* 063F */,/*1600*/1429/* 0640 */, /*1601*/1430/* 0641 */,/*1602*/1431/* 0642 */,/*1603*/1432/* 0643 */,/*1604*/1433/* 0644 */,/*1605*/1434/* 0645 */, /*1606*/1435/* 0646 */,/*1607*/1436/* 0647 */,/*1608*/1437/* 0648 */,/*1609*/1438/* 0649 */,/*1610*/1439/* 064A */, /*1611*/1440/* 064B */,/*1612*/1441/* 064C */,/*1613*/1442/* 064D */,/*1614*/1443/* 064E */,/*1615*/1444/* 064F */, /*1616*/1445/* 0650 */,/*1617*/1446/* 0651 */,/*1618*/1447/* 0652 */,/*1619*/1448/* 0653 */,/*1620*/1449/* 0654 */, /*1621*/1450/* 0655 */,/*1622*/1451/* 0656 */,/*1623*/1452/* 0657 */,/*1624*/1453/* 0658 */,/*1625*/1454/* 0659 */, /*1626*/1455/* 065A */,/*1627*/1456/* 065B */,/*1628*/1457/* 065C */,/*1629*/1458/* 065D */,/*1630*/1459/* 065E */, /*1631*/1460/* 065F */,/*1632*/1461/* 0660 */,/*1633*/1462/* 0661 */,/*1634*/1463/* 0662 */,/*1635*/1464/* 0663 */, /*1636*/1465/* 0664 */,/*1637*/1466/* 0665 */,/*1638*/1467/* 0666 */,/*1639*/1468/* 0667 */,/*1640*/1469/* 0668 */, /*1641*/1470/* 0669 */,/*1642*/1471/* 066A */,/*1643*/1472/* 066B */,/*1644*/1473/* 066C */,/*1645*/1474/* 066D */, /*1646*/1475/* 066E */,/*1647*/1476/* 066F */,/*1648*/1477/* 0670 */,/*1649*/1478/* 0671 */,/*1650*/1479/* 0672 */, /*1651*/1480/* 0673 */,/*1652*/1481/* 0674 */,/*1653*/1482/* 0675 */,/*1654*/1483/* 0676 */,/*1655*/1484/* 0677 */, /*1656*/1485/* 0678 */,/*1657*/1486/* 0679 */,/*1658*/1487/* 067A */,/*1659*/1488/* 067B */,/*1660*/1489/* 067C */, /*1661*/1490/* 067D */,/*1662*/1491/* 067E */,/*1663*/1492/* 067F */,/*1664*/1493/* 0680 */,/*1665*/1494/* 0681 */, /*1666*/1495/* 0682 */,/*1667*/1496/* 0683 */,/*1668*/1497/* 0684 */,/*1669*/1498/* 0685 */,/*1670*/1499/* 0686 */, /*1671*/1500/* 0687 */,/*1672*/1501/* 0688 */,/*1673*/1502/* 0689 */,/*1674*/1503/* 068A */,/*1675*/1504/* 068B */, /*1676*/1505/* 068C */,/*1677*/1506/* 068D */,/*1678*/1507/* 068E */,/*1679*/1508/* 068F */,/*1680*/1509/* 0690 */, /*1681*/1510/* 0691 */,/*1682*/1511/* 0692 */,/*1683*/1512/* 0693 */,/*1684*/1513/* 0694 */,/*1685*/1514/* 0695 */, /*1686*/1515/* 0696 */,/*1687*/1516/* 0697 */,/*1688*/1517/* 0698 */,/*1689*/1518/* 0699 */,/*1690*/1519/* 069A */, /*1691*/1520/* 069B */,/*1692*/1521/* 069C */,/*1693*/1522/* 069D */,/*1694*/1523/* 069E */,/*1695*/1524/* 069F */, /*1696*/1525/* 06A0 */,/*1697*/1526/* 06A1 */,/*1698*/1527/* 06A2 */,/*1699*/1528/* 06A3 */,/*1700*/1529/* 06A4 */, /*1701*/1530/* 06A5 */,/*1702*/1531/* 06A6 */,/*1703*/1532/* 06A7 */,/*1704*/1533/* 06A8 */,/*1705*/1534/* 06A9 */, /*1706*/1535/* 06AA */,/*1707*/1536/* 06AB */,/*1708*/1537/* 06AC */,/*1709*/1538/* 06AD */,/*1710*/1539/* 06AE */, /*1711*/1540/* 06AF */,/*1712*/1541/* 06B0 */,/*1713*/1542/* 06B1 */,/*1714*/1543/* 06B2 */,/*1715*/1544/* 06B3 */, /*1716*/1545/* 06B4 */,/*1717*/1546/* 06B5 */,/*1718*/1547/* 06B6 */,/*1719*/1548/* 06B7 */,/*1720*/1549/* 06B8 */, /*1721*/1550/* 06B9 */,/*1722*/1551/* 06BA */,/*1723*/1552/* 06BB */,/*1724*/1553/* 06BC */,/*1725*/1554/* 06BD */, /*1726*/1555/* 06BE */,/*1727*/1556/* 06BF */,/*1728*/1557/* 06C0 */,/*1729*/1558/* 06C1 */,/*1730*/1559/* 06C2 */, /*1731*/1560/* 06C3 */,/*1732*/1561/* 06C4 */,/*1733*/1562/* 06C5 */,/*1734*/1563/* 06C6 */,/*1735*/1564/* 06C7 */, /*1736*/1565/* 06C8 */,/*1737*/1566/* 06C9 */,/*1738*/1567/* 06CA */,/*1739*/1568/* 06CB */,/*1740*/1569/* 06CC */, /*1741*/1570/* 06CD */,/*1742*/1571/* 06CE */,/*1743*/1572/* 06CF */,/*1744*/1573/* 06D0 */,/*1745*/1574/* 06D1 */, /*1746*/1575/* 06D2 */,/*1747*/1576/* 06D3 */,/*1748*/1577/* 06D4 */,/*1749*/1578/* 06D5 */,/*1750*/1579/* 06D6 */, /*1751*/1579/* 06D7 */,/*1752*/1579/* 06D8 */,/*1753*/1579/* 06D9 */,/*1754*/1579/* 06DA */,/*1755*/1579/* 06DB */, /*1756*/1579/* 06DC */,/*1757*/1580/* 06DD */,/*1758*/1581/* 06DE */,/*1759*/1582/* 06DF */,/*1760*/1582/* 06E0 */, /*1761*/1579/* 06E1 */,/*1762*/1579/* 06E2 */,/*1763*/1583/* 06E3 */,/*1764*/1579/* 06E4 */,/*1765*/1584/* 06E5 */, /*1766*/1585/* 06E6 */,/*1767*/1579/* 06E7 */,/*1768*/1579/* 06E8 */,/*1769*/1586/* 06E9 */,/*1770*/1587/* 06EA */, /*1771*/1582/* 06EB */,/*1772*/1582/* 06EC */,/*1773*/1583/* 06ED */,/*1774*/1588/* 06EE */,/*1775*/1589/* 06EF */, /*1776*/1590/* 06F0 */,/*1777*/1591/* 06F1 */,/*1778*/1592/* 06F2 */,/*1779*/1593/* 06F3 */,/*1780*/1594/* 06F4 */, /*1781*/1595/* 06F5 */,/*1782*/1596/* 06F6 */,/*1783*/1597/* 06F7 */,/*1784*/1598/* 06F8 */,/*1785*/1599/* 06F9 */, /*1786*/1600/* 06FA */,/*1787*/1601/* 06FB */,/*1788*/1602/* 06FC */,/*1789*/1603/* 06FD */,/*1790*/1604/* 06FE */, /*1791*/1605/* 06FF */,/*1792*/1606/* 0700 */,/*1793*/1607/* 0701 */,/*1794*/1608/* 0702 */,/*1795*/1609/* 0703 */, /*1796*/1610/* 0704 */,/*1797*/1611/* 0705 */,/*1798*/1612/* 0706 */,/*1799*/1613/* 0707 */,/*1800*/1614/* 0708 */, /*1801*/1615/* 0709 */,/*1802*/1616/* 070A */,/*1803*/1617/* 070B */,/*1804*/1618/* 070C */,/*1805*/1619/* 070D */,0, /*1807*/1620/* 070F */,/*1808*/1621/* 0710 */,/*1809*/1622/* 0711 */,/*1810*/1623/* 0712 */,/*1811*/1624/* 0713 */, /*1812*/1625/* 0714 */,/*1813*/1626/* 0715 */,/*1814*/1627/* 0716 */,/*1815*/1628/* 0717 */,/*1816*/1629/* 0718 */, /*1817*/1630/* 0719 */,/*1818*/1631/* 071A */,/*1819*/1632/* 071B */,/*1820*/1633/* 071C */,/*1821*/1634/* 071D */, /*1822*/1635/* 071E */,/*1823*/1636/* 071F */,/*1824*/1637/* 0720 */,/*1825*/1638/* 0721 */,/*1826*/1639/* 0722 */, /*1827*/1640/* 0723 */,/*1828*/1641/* 0724 */,/*1829*/1642/* 0725 */,/*1830*/1643/* 0726 */,/*1831*/1644/* 0727 */, /*1832*/1645/* 0728 */,/*1833*/1646/* 0729 */,/*1834*/1647/* 072A */,/*1835*/1648/* 072B */,/*1836*/1649/* 072C */, /*1837*/1650/* 072D */,/*1838*/1651/* 072E */,/*1839*/1652/* 072F */,/*1840*/1653/* 0730 */,/*1841*/1654/* 0731 */, /*1842*/1655/* 0732 */,/*1843*/1656/* 0733 */,/*1844*/1657/* 0734 */,/*1845*/1658/* 0735 */,/*1846*/1659/* 0736 */, /*1847*/1660/* 0737 */,/*1848*/1661/* 0738 */,/*1849*/1662/* 0739 */,/*1850*/1663/* 073A */,/*1851*/1664/* 073B */, /*1852*/1665/* 073C */,/*1853*/1666/* 073D */,/*1854*/1667/* 073E */,/*1855*/1668/* 073F */,/*1856*/1669/* 0740 */, /*1857*/1670/* 0741 */,/*1858*/1671/* 0742 */,/*1859*/1669/* 0743 */,/*1860*/1672/* 0744 */,/*1861*/1670/* 0745 */, /*1862*/1671/* 0746 */,/*1863*/1669/* 0747 */,/*1864*/1672/* 0748 */,/*1865*/1669/* 0749 */,/*1866*/1669/* 074A */,0,0, /*1869*/1673/* 074D */,/*1870*/1674/* 074E */,/*1871*/1675/* 074F */,/*1872*/1676/* 0750 */,/*1873*/1677/* 0751 */, /*1874*/1678/* 0752 */,/*1875*/1679/* 0753 */,/*1876*/1680/* 0754 */,/*1877*/1681/* 0755 */,/*1878*/1682/* 0756 */, /*1879*/1683/* 0757 */,/*1880*/1684/* 0758 */,/*1881*/1685/* 0759 */,/*1882*/1686/* 075A */,/*1883*/1687/* 075B */, /*1884*/1688/* 075C */,/*1885*/1689/* 075D */,/*1886*/1690/* 075E */,/*1887*/1691/* 075F */,/*1888*/1692/* 0760 */, /*1889*/1693/* 0761 */,/*1890*/1694/* 0762 */,/*1891*/1695/* 0763 */,/*1892*/1696/* 0764 */,/*1893*/1697/* 0765 */, /*1894*/1698/* 0766 */,/*1895*/1699/* 0767 */,/*1896*/1700/* 0768 */,/*1897*/1701/* 0769 */,/*1898*/1702/* 076A */, /*1899*/1703/* 076B */,/*1900*/1704/* 076C */,/*1901*/1705/* 076D */,/*1902*/1706/* 076E */,/*1903*/1707/* 076F */, /*1904*/1708/* 0770 */,/*1905*/1709/* 0771 */,/*1906*/1710/* 0772 */,/*1907*/1711/* 0773 */,/*1908*/1712/* 0774 */, /*1909*/1713/* 0775 */,/*1910*/1714/* 0776 */,/*1911*/1715/* 0777 */,/*1912*/1716/* 0778 */,/*1913*/1717/* 0779 */, /*1914*/1718/* 077A */,/*1915*/1719/* 077B */,/*1916*/1720/* 077C */,/*1917*/1721/* 077D */,/*1918*/1722/* 077E */, /*1919*/1723/* 077F */,/*1920*/1724/* 0780 */,/*1921*/1725/* 0781 */,/*1922*/1726/* 0782 */,/*1923*/1727/* 0783 */, /*1924*/1728/* 0784 */,/*1925*/1729/* 0785 */,/*1926*/1730/* 0786 */,/*1927*/1731/* 0787 */,/*1928*/1732/* 0788 */, /*1929*/1733/* 0789 */,/*1930*/1734/* 078A */,/*1931*/1735/* 078B */,/*1932*/1736/* 078C */,/*1933*/1737/* 078D */, /*1934*/1738/* 078E */,/*1935*/1739/* 078F */,/*1936*/1740/* 0790 */,/*1937*/1741/* 0791 */,/*1938*/1742/* 0792 */, /*1939*/1743/* 0793 */,/*1940*/1744/* 0794 */,/*1941*/1745/* 0795 */,/*1942*/1746/* 0796 */,/*1943*/1747/* 0797 */, /*1944*/1748/* 0798 */,/*1945*/1749/* 0799 */,/*1946*/1750/* 079A */,/*1947*/1751/* 079B */,/*1948*/1752/* 079C */, /*1949*/1753/* 079D */,/*1950*/1754/* 079E */,/*1951*/1755/* 079F */,/*1952*/1756/* 07A0 */,/*1953*/1757/* 07A1 */, /*1954*/1758/* 07A2 */,/*1955*/1759/* 07A3 */,/*1956*/1760/* 07A4 */,/*1957*/1761/* 07A5 */,/*1958*/1762/* 07A6 */, /*1959*/1763/* 07A7 */,/*1960*/1764/* 07A8 */,/*1961*/1765/* 07A9 */,/*1962*/1766/* 07AA */,/*1963*/1767/* 07AB */, /*1964*/1768/* 07AC */,/*1965*/1769/* 07AD */,/*1966*/1770/* 07AE */,/*1967*/1771/* 07AF */,/*1968*/1772/* 07B0 */, /*1969*/1773/* 07B1 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*1984*/1774/* 07C0 */,/*1985*/1775/* 07C1 */,/*1986*/1776/* 07C2 */, /*1987*/1777/* 07C3 */,/*1988*/1778/* 07C4 */,/*1989*/1779/* 07C5 */,/*1990*/1780/* 07C6 */,/*1991*/1781/* 07C7 */, /*1992*/1782/* 07C8 */,/*1993*/1783/* 07C9 */,/*1994*/1784/* 07CA */,/*1995*/1785/* 07CB */,/*1996*/1786/* 07CC */, /*1997*/1787/* 07CD */,/*1998*/1788/* 07CE */,/*1999*/1789/* 07CF */,/*2000*/1790/* 07D0 */,/*2001*/1791/* 07D1 */, /*2002*/1792/* 07D2 */,/*2003*/1793/* 07D3 */,/*2004*/1794/* 07D4 */,/*2005*/1795/* 07D5 */,/*2006*/1796/* 07D6 */, /*2007*/1797/* 07D7 */,/*2008*/1798/* 07D8 */,/*2009*/1799/* 07D9 */,/*2010*/1800/* 07DA */,/*2011*/1801/* 07DB */, /*2012*/1802/* 07DC */,/*2013*/1803/* 07DD */,/*2014*/1804/* 07DE */,/*2015*/1805/* 07DF */,/*2016*/1806/* 07E0 */, /*2017*/1807/* 07E1 */,/*2018*/1808/* 07E2 */,/*2019*/1809/* 07E3 */,/*2020*/1810/* 07E4 */,/*2021*/1811/* 07E5 */, /*2022*/1812/* 07E6 */,/*2023*/1813/* 07E7 */,/*2024*/1814/* 07E8 */,/*2025*/1815/* 07E9 */,/*2026*/1816/* 07EA */, /*2027*/1817/* 07EB */,/*2028*/1818/* 07EC */,/*2029*/1819/* 07ED */,/*2030*/1820/* 07EE */,/*2031*/1821/* 07EF */, /*2032*/1822/* 07F0 */,/*2033*/1823/* 07F1 */,/*2034*/1824/* 07F2 */,/*2035*/1825/* 07F3 */,/*2036*/1826/* 07F4 */, /*2037*/1827/* 07F5 */,/*2038*/1828/* 07F6 */,/*2039*/1829/* 07F7 */,/*2040*/1830/* 07F8 */,/*2041*/1831/* 07F9 */, /*2042*/1832/* 07FA */,0,0,0,0,0,/*2048*/1833/* 0800 */,/*2049*/1834/* 0801 */,/*2050*/1835/* 0802 */, /*2051*/1836/* 0803 */,/*2052*/1837/* 0804 */,/*2053*/1838/* 0805 */,/*2054*/1839/* 0806 */,/*2055*/1840/* 0807 */, /*2056*/1841/* 0808 */,/*2057*/1842/* 0809 */,/*2058*/1843/* 080A */,/*2059*/1844/* 080B */,/*2060*/1845/* 080C */, /*2061*/1846/* 080D */,/*2062*/1847/* 080E */,/*2063*/1848/* 080F */,/*2064*/1849/* 0810 */,/*2065*/1850/* 0811 */, /*2066*/1851/* 0812 */,/*2067*/1852/* 0813 */,/*2068*/1853/* 0814 */,/*2069*/1854/* 0815 */,/*2070*/1855/* 0816 */, /*2071*/1856/* 0817 */,/*2072*/1857/* 0818 */,/*2073*/1858/* 0819 */,/*2074*/1859/* 081A */,/*2075*/1860/* 081B */, /*2076*/1861/* 081C */,/*2077*/1861/* 081D */,/*2078*/1862/* 081E */,/*2079*/1862/* 081F */,/*2080*/1862/* 0820 */, /*2081*/1863/* 0821 */,/*2082*/1863/* 0822 */,/*2083*/1863/* 0823 */,/*2084*/1864/* 0824 */,/*2085*/1865/* 0825 */, /*2086*/1866/* 0826 */,/*2087*/1866/* 0827 */,/*2088*/1867/* 0828 */,/*2089*/1868/* 0829 */,/*2090*/1868/* 082A */, /*2091*/1869/* 082B */,/*2092*/1870/* 082C */,/*2093*/1871/* 082D */,0,0,/*2096*/1872/* 0830 */,/*2097*/1873/* 0831 */, /*2098*/1874/* 0832 */,/*2099*/1875/* 0833 */,/*2100*/1876/* 0834 */,/*2101*/1877/* 0835 */,/*2102*/1878/* 0836 */, /*2103*/1879/* 0837 */,/*2104*/1880/* 0838 */,/*2105*/1881/* 0839 */,/*2106*/1882/* 083A */,/*2107*/1883/* 083B */, /*2108*/1884/* 083C */,/*2109*/1885/* 083D */,/*2110*/1886/* 083E */,0,/*2112*/1887/* 0840 */,/*2113*/1888/* 0841 */, /*2114*/1889/* 0842 */,/*2115*/1890/* 0843 */,/*2116*/1891/* 0844 */,/*2117*/1892/* 0845 */,/*2118*/1893/* 0846 */, /*2119*/1894/* 0847 */,/*2120*/1895/* 0848 */,/*2121*/1896/* 0849 */,/*2122*/1897/* 084A */,/*2123*/1898/* 084B */, /*2124*/1899/* 084C */,/*2125*/1900/* 084D */,/*2126*/1901/* 084E */,/*2127*/1902/* 084F */,/*2128*/1903/* 0850 */, /*2129*/1904/* 0851 */,/*2130*/1905/* 0852 */,/*2131*/1906/* 0853 */,/*2132*/1907/* 0854 */,/*2133*/1908/* 0855 */, /*2134*/1909/* 0856 */,/*2135*/1910/* 0857 */,/*2136*/1911/* 0858 */,/*2137*/1912/* 0859 */,/*2138*/1912/* 085A */, /*2139*/1912/* 085B */,0,0,/*2142*/1913/* 085E */,0,/*2144*/1914/* 0860 */,/*2145*/1915/* 0861 */,/*2146*/1916/* 0862 */, /*2147*/1917/* 0863 */,/*2148*/1918/* 0864 */,/*2149*/1919/* 0865 */,/*2150*/1920/* 0866 */,/*2151*/1921/* 0867 */, /*2152*/1922/* 0868 */,/*2153*/1923/* 0869 */,/*2154*/1924/* 086A */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*2208*/1925/* 08A0 */,/*2209*/1926/* 08A1 */, /*2210*/1927/* 08A2 */,/*2211*/1928/* 08A3 */,/*2212*/1929/* 08A4 */,/*2213*/1930/* 08A5 */,/*2214*/1931/* 08A6 */, /*2215*/1932/* 08A7 */,/*2216*/1933/* 08A8 */,/*2217*/1934/* 08A9 */,/*2218*/1935/* 08AA */,/*2219*/1936/* 08AB */, /*2220*/1937/* 08AC */,/*2221*/1938/* 08AD */,/*2222*/1939/* 08AE */,/*2223*/1940/* 08AF */,/*2224*/1941/* 08B0 */, /*2225*/1942/* 08B1 */,/*2226*/1943/* 08B2 */,/*2227*/1944/* 08B3 */,/*2228*/1945/* 08B4 */,0,/*2230*/1946/* 08B6 */, /*2231*/1947/* 08B7 */,/*2232*/1948/* 08B8 */,/*2233*/1949/* 08B9 */,/*2234*/1950/* 08BA */,/*2235*/1951/* 08BB */, /*2236*/1952/* 08BC */,/*2237*/1953/* 08BD */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*2260*/1954/* 08D4 */, /*2261*/1954/* 08D5 */,/*2262*/1954/* 08D6 */,/*2263*/1954/* 08D7 */,/*2264*/1954/* 08D8 */,/*2265*/1954/* 08D9 */, /*2266*/1954/* 08DA */,/*2267*/1954/* 08DB */,/*2268*/1954/* 08DC */,/*2269*/1954/* 08DD */,/*2270*/1954/* 08DE */, /*2271*/1954/* 08DF */,/*2272*/1955/* 08E0 */,/*2273*/1955/* 08E1 */,/*2274*/1956/* 08E2 */,/*2275*/1957/* 08E3 */, /*2276*/1958/* 08E4 */,/*2277*/1959/* 08E5 */,/*2278*/1960/* 08E6 */,/*2279*/1961/* 08E7 */,/*2280*/1962/* 08E8 */, /*2281*/1963/* 08E9 */,/*2282*/1964/* 08EA */,/*2283*/1964/* 08EB */,/*2284*/1964/* 08EC */,/*2285*/1965/* 08ED */, /*2286*/1965/* 08EE */,/*2287*/1965/* 08EF */,/*2288*/1966/* 08F0 */,/*2289*/1967/* 08F1 */,/*2290*/1968/* 08F2 */, /*2291*/1969/* 08F3 */,/*2292*/1970/* 08F4 */,/*2293*/1971/* 08F5 */,/*2294*/1972/* 08F6 */,/*2295*/1973/* 08F7 */, /*2296*/1974/* 08F8 */,/*2297*/1975/* 08F9 */,/*2298*/1976/* 08FA */,/*2299*/1977/* 08FB */,/*2300*/1978/* 08FC */, /*2301*/1979/* 08FD */,/*2302*/1980/* 08FE */,/*2303*/1981/* 08FF */,/*2304*/1982/* 0900 */,/*2305*/1983/* 0901 */, /*2306*/1984/* 0902 */,/*2307*/1985/* 0903 */,/*2308*/1986/* 0904 */,/*2309*/1987/* 0905 */,/*2310*/1988/* 0906 */, /*2311*/1989/* 0907 */,/*2312*/1990/* 0908 */,/*2313*/1991/* 0909 */,/*2314*/1992/* 090A */,/*2315*/1993/* 090B */, /*2316*/1994/* 090C */,/*2317*/1995/* 090D */,/*2318*/1996/* 090E */,/*2319*/1997/* 090F */,/*2320*/1998/* 0910 */, /*2321*/1999/* 0911 */,/*2322*/2000/* 0912 */,/*2323*/2001/* 0913 */,/*2324*/2002/* 0914 */,/*2325*/2003/* 0915 */, /*2326*/2004/* 0916 */,/*2327*/2005/* 0917 */,/*2328*/2006/* 0918 */,/*2329*/2007/* 0919 */,/*2330*/2008/* 091A */, /*2331*/2009/* 091B */,/*2332*/2010/* 091C */,/*2333*/2011/* 091D */,/*2334*/2012/* 091E */,/*2335*/2013/* 091F */, /*2336*/2014/* 0920 */,/*2337*/2015/* 0921 */,/*2338*/2016/* 0922 */,/*2339*/2017/* 0923 */,/*2340*/2018/* 0924 */, /*2341*/2019/* 0925 */,/*2342*/2020/* 0926 */,/*2343*/2021/* 0927 */,/*2344*/2022/* 0928 */,/*2345*/2023/* 0929 */, /*2346*/2024/* 092A */,/*2347*/2025/* 092B */,/*2348*/2026/* 092C */,/*2349*/2027/* 092D */,/*2350*/2028/* 092E */, /*2351*/2029/* 092F */,/*2352*/2030/* 0930 */,/*2353*/2031/* 0931 */,/*2354*/2032/* 0932 */,/*2355*/2033/* 0933 */, /*2356*/2034/* 0934 */,/*2357*/2035/* 0935 */,/*2358*/2036/* 0936 */,/*2359*/2037/* 0937 */,/*2360*/2038/* 0938 */, /*2361*/2039/* 0939 */,/*2362*/2040/* 093A */,/*2363*/2041/* 093B */,/*2364*/2042/* 093C */,/*2365*/2043/* 093D */, /*2366*/2044/* 093E */,/*2367*/2045/* 093F */,/*2368*/2046/* 0940 */,/*2369*/2047/* 0941 */,/*2370*/2048/* 0942 */, /*2371*/2049/* 0943 */,/*2372*/2050/* 0944 */,/*2373*/2051/* 0945 */,/*2374*/2052/* 0946 */,/*2375*/2053/* 0947 */, /*2376*/2054/* 0948 */,/*2377*/2055/* 0949 */,/*2378*/2056/* 094A */,/*2379*/2057/* 094B */,/*2380*/2058/* 094C */, /*2381*/2059/* 094D */,/*2382*/2060/* 094E */,/*2383*/2061/* 094F */,/*2384*/2062/* 0950 */,/*2385*/2063/* 0951 */, /*2386*/2064/* 0952 */,/*2387*/2065/* 0953 */,/*2388*/2066/* 0954 */,/*2389*/2067/* 0955 */,/*2390*/2068/* 0956 */, /*2391*/2069/* 0957 */,/*2392*/2070/* 0958 */,/*2393*/2071/* 0959 */,/*2394*/2072/* 095A */,/*2395*/2073/* 095B */, /*2396*/2074/* 095C */,/*2397*/2075/* 095D */,/*2398*/2076/* 095E */,/*2399*/2077/* 095F */,/*2400*/2078/* 0960 */, /*2401*/2079/* 0961 */,/*2402*/2080/* 0962 */,/*2403*/2081/* 0963 */,/*2404*/2082/* 0964 */,/*2405*/2083/* 0965 */, /*2406*/2084/* 0966 */,/*2407*/2085/* 0967 */,/*2408*/2086/* 0968 */,/*2409*/2087/* 0969 */,/*2410*/2088/* 096A */, /*2411*/2089/* 096B */,/*2412*/2090/* 096C */,/*2413*/2091/* 096D */,/*2414*/2092/* 096E */,/*2415*/2093/* 096F */, /*2416*/2094/* 0970 */,/*2417*/2095/* 0971 */,/*2418*/2096/* 0972 */,/*2419*/2097/* 0973 */,/*2420*/2098/* 0974 */, /*2421*/2099/* 0975 */,/*2422*/2100/* 0976 */,/*2423*/2101/* 0977 */,/*2424*/2102/* 0978 */,/*2425*/2103/* 0979 */, /*2426*/2104/* 097A */,/*2427*/2105/* 097B */,/*2428*/2106/* 097C */,/*2429*/2107/* 097D */,/*2430*/2108/* 097E */, /*2431*/2109/* 097F */,/*2432*/2110/* 0980 */,/*2433*/2111/* 0981 */,/*2434*/2112/* 0982 */,/*2435*/2113/* 0983 */,0, /*2437*/2114/* 0985 */,/*2438*/2115/* 0986 */,/*2439*/2116/* 0987 */,/*2440*/2117/* 0988 */,/*2441*/2118/* 0989 */, /*2442*/2119/* 098A */,/*2443*/2120/* 098B */,/*2444*/2121/* 098C */,0,0,/*2447*/2122/* 098F */,/*2448*/2123/* 0990 */,0, 0,/*2451*/2124/* 0993 */,/*2452*/2125/* 0994 */,/*2453*/2126/* 0995 */,/*2454*/2127/* 0996 */,/*2455*/2128/* 0997 */, /*2456*/2129/* 0998 */,/*2457*/2130/* 0999 */,/*2458*/2131/* 099A */,/*2459*/2132/* 099B */,/*2460*/2133/* 099C */, /*2461*/2134/* 099D */,/*2462*/2135/* 099E */,/*2463*/2136/* 099F */,/*2464*/2137/* 09A0 */,/*2465*/2138/* 09A1 */, /*2466*/2139/* 09A2 */,/*2467*/2140/* 09A3 */,/*2468*/2141/* 09A4 */,/*2469*/2142/* 09A5 */,/*2470*/2143/* 09A6 */, /*2471*/2144/* 09A7 */,/*2472*/2145/* 09A8 */,0,/*2474*/2146/* 09AA */,/*2475*/2147/* 09AB */,/*2476*/2148/* 09AC */, /*2477*/2149/* 09AD */,/*2478*/2150/* 09AE */,/*2479*/2151/* 09AF */,/*2480*/2152/* 09B0 */,0,/*2482*/2153/* 09B2 */,0,0, 0,/*2486*/2154/* 09B6 */,/*2487*/2155/* 09B7 */,/*2488*/2156/* 09B8 */,/*2489*/2157/* 09B9 */,0,0,/*2492*/2158/* 09BC */, /*2493*/2159/* 09BD */,/*2494*/2160/* 09BE */,/*2495*/2161/* 09BF */,/*2496*/2162/* 09C0 */,/*2497*/2163/* 09C1 */, /*2498*/2164/* 09C2 */,/*2499*/2165/* 09C3 */,/*2500*/2166/* 09C4 */,0,0,/*2503*/2167/* 09C7 */,/*2504*/2168/* 09C8 */,0, 0,/*2507*/2169/* 09CB */,/*2508*/2170/* 09CC */,/*2509*/2171/* 09CD */,/*2510*/2172/* 09CE */,0,0,0,0,0,0,0,0, /*2519*/2173/* 09D7 */,0,0,0,0,/*2524*/2174/* 09DC */,/*2525*/2175/* 09DD */,0,/*2527*/2176/* 09DF */, /*2528*/2177/* 09E0 */,/*2529*/2178/* 09E1 */,/*2530*/2179/* 09E2 */,/*2531*/2180/* 09E3 */,0,0,/*2534*/2181/* 09E6 */, /*2535*/2182/* 09E7 */,/*2536*/2183/* 09E8 */,/*2537*/2184/* 09E9 */,/*2538*/2185/* 09EA */,/*2539*/2186/* 09EB */, /*2540*/2187/* 09EC */,/*2541*/2188/* 09ED */,/*2542*/2189/* 09EE */,/*2543*/2190/* 09EF */,/*2544*/2191/* 09F0 */, /*2545*/2192/* 09F1 */,/*2546*/2193/* 09F2 */,/*2547*/2194/* 09F3 */,/*2548*/2195/* 09F4 */,/*2549*/2196/* 09F5 */, /*2550*/2197/* 09F6 */,/*2551*/2198/* 09F7 */,/*2552*/2199/* 09F8 */,/*2553*/2200/* 09F9 */,/*2554*/2201/* 09FA */, /*2555*/2202/* 09FB */,/*2556*/2203/* 09FC */,/*2557*/2204/* 09FD */,0,0,0,/*2561*/2205/* 0A01 */,/*2562*/2206/* 0A02 */, /*2563*/2207/* 0A03 */,0,/*2565*/2208/* 0A05 */,/*2566*/2209/* 0A06 */,/*2567*/2210/* 0A07 */,/*2568*/2211/* 0A08 */, /*2569*/2212/* 0A09 */,/*2570*/2213/* 0A0A */,0,0,0,0,/*2575*/2214/* 0A0F */,/*2576*/2215/* 0A10 */,0,0, /*2579*/2216/* 0A13 */,/*2580*/2217/* 0A14 */,/*2581*/2218/* 0A15 */,/*2582*/2219/* 0A16 */,/*2583*/2220/* 0A17 */, /*2584*/2221/* 0A18 */,/*2585*/2222/* 0A19 */,/*2586*/2223/* 0A1A */,/*2587*/2224/* 0A1B */,/*2588*/2225/* 0A1C */, /*2589*/2226/* 0A1D */,/*2590*/2227/* 0A1E */,/*2591*/2228/* 0A1F */,/*2592*/2229/* 0A20 */,/*2593*/2230/* 0A21 */, /*2594*/2231/* 0A22 */,/*2595*/2232/* 0A23 */,/*2596*/2233/* 0A24 */,/*2597*/2234/* 0A25 */,/*2598*/2235/* 0A26 */, /*2599*/2236/* 0A27 */,/*2600*/2237/* 0A28 */,0,/*2602*/2238/* 0A2A */,/*2603*/2239/* 0A2B */,/*2604*/2240/* 0A2C */, /*2605*/2241/* 0A2D */,/*2606*/2242/* 0A2E */,/*2607*/2243/* 0A2F */,/*2608*/2244/* 0A30 */,0,/*2610*/2245/* 0A32 */, /*2611*/2246/* 0A33 */,0,/*2613*/2247/* 0A35 */,/*2614*/2248/* 0A36 */,0,/*2616*/2249/* 0A38 */,/*2617*/2250/* 0A39 */,0, 0,/*2620*/2251/* 0A3C */,0,/*2622*/2252/* 0A3E */,/*2623*/2253/* 0A3F */,/*2624*/2254/* 0A40 */,/*2625*/2255/* 0A41 */, /*2626*/2256/* 0A42 */,0,0,0,0,/*2631*/2257/* 0A47 */,/*2632*/2258/* 0A48 */,0,0,/*2635*/2259/* 0A4B */, /*2636*/2260/* 0A4C */,/*2637*/2261/* 0A4D */,0,0,0,/*2641*/2262/* 0A51 */,0,0,0,0,0,0,0,/*2649*/2263/* 0A59 */, /*2650*/2264/* 0A5A */,/*2651*/2265/* 0A5B */,/*2652*/2266/* 0A5C */,0,/*2654*/2267/* 0A5E */,0,0,0,0,0,0,0, /*2662*/2268/* 0A66 */,/*2663*/2269/* 0A67 */,/*2664*/2270/* 0A68 */,/*2665*/2271/* 0A69 */,/*2666*/2272/* 0A6A */, /*2667*/2273/* 0A6B */,/*2668*/2274/* 0A6C */,/*2669*/2275/* 0A6D */,/*2670*/2276/* 0A6E */,/*2671*/2277/* 0A6F */, /*2672*/2278/* 0A70 */,/*2673*/2279/* 0A71 */,/*2674*/2280/* 0A72 */,/*2675*/2281/* 0A73 */,/*2676*/2282/* 0A74 */, /*2677*/2283/* 0A75 */,0,0,0,0,0,0,0,0,0,0,0,/*2689*/2284/* 0A81 */,/*2690*/2285/* 0A82 */,/*2691*/2286/* 0A83 */,0, /*2693*/2287/* 0A85 */,/*2694*/2288/* 0A86 */,/*2695*/2289/* 0A87 */,/*2696*/2290/* 0A88 */,/*2697*/2291/* 0A89 */, /*2698*/2292/* 0A8A */,/*2699*/2293/* 0A8B */,/*2700*/2294/* 0A8C */,/*2701*/2295/* 0A8D */,0,/*2703*/2296/* 0A8F */, /*2704*/2297/* 0A90 */,/*2705*/2298/* 0A91 */,0,/*2707*/2299/* 0A93 */,/*2708*/2300/* 0A94 */,/*2709*/2301/* 0A95 */, /*2710*/2302/* 0A96 */,/*2711*/2303/* 0A97 */,/*2712*/2304/* 0A98 */,/*2713*/2305/* 0A99 */,/*2714*/2306/* 0A9A */, /*2715*/2307/* 0A9B */,/*2716*/2308/* 0A9C */,/*2717*/2309/* 0A9D */,/*2718*/2310/* 0A9E */,/*2719*/2311/* 0A9F */, /*2720*/2312/* 0AA0 */,/*2721*/2313/* 0AA1 */,/*2722*/2314/* 0AA2 */,/*2723*/2315/* 0AA3 */,/*2724*/2316/* 0AA4 */, /*2725*/2317/* 0AA5 */,/*2726*/2318/* 0AA6 */,/*2727*/2319/* 0AA7 */,/*2728*/2320/* 0AA8 */,0,/*2730*/2321/* 0AAA */, /*2731*/2322/* 0AAB */,/*2732*/2323/* 0AAC */,/*2733*/2324/* 0AAD */,/*2734*/2325/* 0AAE */,/*2735*/2326/* 0AAF */, /*2736*/2327/* 0AB0 */,0,/*2738*/2328/* 0AB2 */,/*2739*/2329/* 0AB3 */,0,/*2741*/2330/* 0AB5 */,/*2742*/2331/* 0AB6 */, /*2743*/2332/* 0AB7 */,/*2744*/2333/* 0AB8 */,/*2745*/2334/* 0AB9 */,0,0,/*2748*/2335/* 0ABC */,/*2749*/2336/* 0ABD */, /*2750*/2337/* 0ABE */,/*2751*/2338/* 0ABF */,/*2752*/2339/* 0AC0 */,/*2753*/2340/* 0AC1 */,/*2754*/2341/* 0AC2 */, /*2755*/2342/* 0AC3 */,/*2756*/2343/* 0AC4 */,/*2757*/2344/* 0AC5 */,0,/*2759*/2345/* 0AC7 */,/*2760*/2346/* 0AC8 */, /*2761*/2347/* 0AC9 */,0,/*2763*/2348/* 0ACB */,/*2764*/2349/* 0ACC */,/*2765*/2350/* 0ACD */,0,0,/*2768*/2351/* 0AD0 */, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*2784*/2352/* 0AE0 */,/*2785*/2353/* 0AE1 */,/*2786*/2354/* 0AE2 */, /*2787*/2355/* 0AE3 */,0,0,/*2790*/2356/* 0AE6 */,/*2791*/2357/* 0AE7 */,/*2792*/2358/* 0AE8 */,/*2793*/2359/* 0AE9 */, /*2794*/2360/* 0AEA */,/*2795*/2361/* 0AEB */,/*2796*/2362/* 0AEC */,/*2797*/2363/* 0AED */,/*2798*/2364/* 0AEE */, /*2799*/2365/* 0AEF */,/*2800*/2366/* 0AF0 */,/*2801*/2367/* 0AF1 */,0,0,0,0,0,0,0,/*2809*/2368/* 0AF9 */, /*2810*/2369/* 0AFA */,/*2811*/2370/* 0AFB */,/*2812*/2371/* 0AFC */,/*2813*/2372/* 0AFD */,/*2814*/2372/* 0AFE */, /*2815*/2372/* 0AFF */,0,/*2817*/2373/* 0B01 */,/*2818*/2374/* 0B02 */,/*2819*/2375/* 0B03 */,0,/*2821*/2376/* 0B05 */, /*2822*/2377/* 0B06 */,/*2823*/2378/* 0B07 */,/*2824*/2379/* 0B08 */,/*2825*/2380/* 0B09 */,/*2826*/2381/* 0B0A */, /*2827*/2382/* 0B0B */,/*2828*/2383/* 0B0C */,0,0,/*2831*/2384/* 0B0F */,/*2832*/2385/* 0B10 */,0,0, /*2835*/2386/* 0B13 */,/*2836*/2387/* 0B14 */,/*2837*/2388/* 0B15 */,/*2838*/2389/* 0B16 */,/*2839*/2390/* 0B17 */, /*2840*/2391/* 0B18 */,/*2841*/2392/* 0B19 */,/*2842*/2393/* 0B1A */,/*2843*/2394/* 0B1B */,/*2844*/2395/* 0B1C */, /*2845*/2396/* 0B1D */,/*2846*/2397/* 0B1E */,/*2847*/2398/* 0B1F */,/*2848*/2399/* 0B20 */,/*2849*/2400/* 0B21 */, /*2850*/2401/* 0B22 */,/*2851*/2402/* 0B23 */,/*2852*/2403/* 0B24 */,/*2853*/2404/* 0B25 */,/*2854*/2405/* 0B26 */, /*2855*/2406/* 0B27 */,/*2856*/2407/* 0B28 */,0,/*2858*/2408/* 0B2A */,/*2859*/2409/* 0B2B */,/*2860*/2410/* 0B2C */, /*2861*/2411/* 0B2D */,/*2862*/2412/* 0B2E */,/*2863*/2413/* 0B2F */,/*2864*/2414/* 0B30 */,0,/*2866*/2415/* 0B32 */, /*2867*/2416/* 0B33 */,0,/*2869*/2417/* 0B35 */,/*2870*/2418/* 0B36 */,/*2871*/2419/* 0B37 */,/*2872*/2420/* 0B38 */, /*2873*/2421/* 0B39 */,0,0,/*2876*/2422/* 0B3C */,/*2877*/2423/* 0B3D */,/*2878*/2424/* 0B3E */,/*2879*/2425/* 0B3F */, /*2880*/2426/* 0B40 */,/*2881*/2427/* 0B41 */,/*2882*/2428/* 0B42 */,/*2883*/2429/* 0B43 */,/*2884*/2430/* 0B44 */,0,0, /*2887*/2431/* 0B47 */,/*2888*/2432/* 0B48 */,0,0,/*2891*/2433/* 0B4B */,/*2892*/2434/* 0B4C */,/*2893*/2435/* 0B4D */,0, 0,0,0,0,0,0,0,/*2902*/2436/* 0B56 */,/*2903*/2437/* 0B57 */,0,0,0,0,/*2908*/2438/* 0B5C */,/*2909*/2439/* 0B5D */,0, /*2911*/2440/* 0B5F */,/*2912*/2441/* 0B60 */,/*2913*/2442/* 0B61 */,/*2914*/2443/* 0B62 */,/*2915*/2444/* 0B63 */,0,0, /*2918*/2445/* 0B66 */,/*2919*/2446/* 0B67 */,/*2920*/2447/* 0B68 */,/*2921*/2448/* 0B69 */,/*2922*/2449/* 0B6A */, /*2923*/2450/* 0B6B */,/*2924*/2451/* 0B6C */,/*2925*/2452/* 0B6D */,/*2926*/2453/* 0B6E */,/*2927*/2454/* 0B6F */, /*2928*/2455/* 0B70 */,/*2929*/2456/* 0B71 */,/*2930*/2457/* 0B72 */,/*2931*/2458/* 0B73 */,/*2932*/2459/* 0B74 */, /*2933*/2460/* 0B75 */,/*2934*/2461/* 0B76 */,/*2935*/2462/* 0B77 */,0,0,0,0,0,0,0,0,0,0,/*2946*/2463/* 0B82 */, /*2947*/2464/* 0B83 */,0,/*2949*/2465/* 0B85 */,/*2950*/2466/* 0B86 */,/*2951*/2467/* 0B87 */,/*2952*/2468/* 0B88 */, /*2953*/2469/* 0B89 */,/*2954*/2470/* 0B8A */,0,0,0,/*2958*/2471/* 0B8E */,/*2959*/2472/* 0B8F */,/*2960*/2473/* 0B90 */, 0,/*2962*/2474/* 0B92 */,/*2963*/2475/* 0B93 */,/*2964*/2476/* 0B94 */,/*2965*/2477/* 0B95 */,0,0,0, /*2969*/2478/* 0B99 */,/*2970*/2479/* 0B9A */,0,/*2972*/2480/* 0B9C */,0,/*2974*/2481/* 0B9E */,/*2975*/2482/* 0B9F */,0, 0,0,/*2979*/2483/* 0BA3 */,/*2980*/2484/* 0BA4 */,0,0,0,/*2984*/2485/* 0BA8 */,/*2985*/2486/* 0BA9 */, /*2986*/2487/* 0BAA */,0,0,0,/*2990*/2488/* 0BAE */,/*2991*/2489/* 0BAF */,/*2992*/2490/* 0BB0 */,/*2993*/2491/* 0BB1 */, /*2994*/2492/* 0BB2 */,/*2995*/2493/* 0BB3 */,/*2996*/2494/* 0BB4 */,/*2997*/2495/* 0BB5 */,/*2998*/2496/* 0BB6 */, /*2999*/2497/* 0BB7 */,/*3000*/2498/* 0BB8 */,/*3001*/2499/* 0BB9 */,0,0,0,0,/*3006*/2500/* 0BBE */, /*3007*/2501/* 0BBF */,/*3008*/2502/* 0BC0 */,/*3009*/2503/* 0BC1 */,/*3010*/2504/* 0BC2 */,0,0,0,/*3014*/2505/* 0BC6 */, /*3015*/2506/* 0BC7 */,/*3016*/2507/* 0BC8 */,0,/*3018*/2508/* 0BCA */,/*3019*/2509/* 0BCB */,/*3020*/2510/* 0BCC */, /*3021*/2511/* 0BCD */,0,0,/*3024*/2512/* 0BD0 */,0,0,0,0,0,0,/*3031*/2513/* 0BD7 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*3046*/2514/* 0BE6 */,/*3047*/2515/* 0BE7 */,/*3048*/2516/* 0BE8 */,/*3049*/2517/* 0BE9 */,/*3050*/2518/* 0BEA */, /*3051*/2519/* 0BEB */,/*3052*/2520/* 0BEC */,/*3053*/2521/* 0BED */,/*3054*/2522/* 0BEE */,/*3055*/2523/* 0BEF */, /*3056*/2524/* 0BF0 */,/*3057*/2525/* 0BF1 */,/*3058*/2526/* 0BF2 */,/*3059*/2527/* 0BF3 */,/*3060*/2528/* 0BF4 */, /*3061*/2529/* 0BF5 */,/*3062*/2530/* 0BF6 */,/*3063*/2531/* 0BF7 */,/*3064*/2532/* 0BF8 */,/*3065*/2533/* 0BF9 */, /*3066*/2534/* 0BFA */,0,0,0,0,0,/*3072*/2535/* 0C00 */,/*3073*/2536/* 0C01 */,/*3074*/2537/* 0C02 */, /*3075*/2538/* 0C03 */,0,/*3077*/2539/* 0C05 */,/*3078*/2540/* 0C06 */,/*3079*/2541/* 0C07 */,/*3080*/2542/* 0C08 */, /*3081*/2543/* 0C09 */,/*3082*/2544/* 0C0A */,/*3083*/2545/* 0C0B */,/*3084*/2546/* 0C0C */,0,/*3086*/2547/* 0C0E */, /*3087*/2548/* 0C0F */,/*3088*/2549/* 0C10 */,0,/*3090*/2550/* 0C12 */,/*3091*/2551/* 0C13 */,/*3092*/2552/* 0C14 */, /*3093*/2553/* 0C15 */,/*3094*/2554/* 0C16 */,/*3095*/2555/* 0C17 */,/*3096*/2556/* 0C18 */,/*3097*/2557/* 0C19 */, /*3098*/2558/* 0C1A */,/*3099*/2559/* 0C1B */,/*3100*/2560/* 0C1C */,/*3101*/2561/* 0C1D */,/*3102*/2562/* 0C1E */, /*3103*/2563/* 0C1F */,/*3104*/2564/* 0C20 */,/*3105*/2565/* 0C21 */,/*3106*/2566/* 0C22 */,/*3107*/2567/* 0C23 */, /*3108*/2568/* 0C24 */,/*3109*/2569/* 0C25 */,/*3110*/2570/* 0C26 */,/*3111*/2571/* 0C27 */,/*3112*/2572/* 0C28 */,0, /*3114*/2573/* 0C2A */,/*3115*/2574/* 0C2B */,/*3116*/2575/* 0C2C */,/*3117*/2576/* 0C2D */,/*3118*/2577/* 0C2E */, /*3119*/2578/* 0C2F */,/*3120*/2579/* 0C30 */,/*3121*/2580/* 0C31 */,/*3122*/2581/* 0C32 */,/*3123*/2582/* 0C33 */, /*3124*/2583/* 0C34 */,/*3125*/2584/* 0C35 */,/*3126*/2585/* 0C36 */,/*3127*/2586/* 0C37 */,/*3128*/2587/* 0C38 */, /*3129*/2588/* 0C39 */,0,0,0,/*3133*/2589/* 0C3D */,/*3134*/2590/* 0C3E */,/*3135*/2591/* 0C3F */,/*3136*/2592/* 0C40 */, /*3137*/2593/* 0C41 */,/*3138*/2594/* 0C42 */,/*3139*/2595/* 0C43 */,/*3140*/2596/* 0C44 */,0,/*3142*/2597/* 0C46 */, /*3143*/2598/* 0C47 */,/*3144*/2599/* 0C48 */,0,/*3146*/2600/* 0C4A */,/*3147*/2601/* 0C4B */,/*3148*/2602/* 0C4C */, /*3149*/2603/* 0C4D */,0,0,0,0,0,0,0,/*3157*/2604/* 0C55 */,/*3158*/2605/* 0C56 */,0,/*3160*/2606/* 0C58 */, /*3161*/2607/* 0C59 */,/*3162*/2608/* 0C5A */,0,0,0,0,0,/*3168*/2609/* 0C60 */,/*3169*/2610/* 0C61 */, /*3170*/2611/* 0C62 */,/*3171*/2612/* 0C63 */,0,0,/*3174*/2613/* 0C66 */,/*3175*/2614/* 0C67 */,/*3176*/2615/* 0C68 */, /*3177*/2616/* 0C69 */,/*3178*/2617/* 0C6A */,/*3179*/2618/* 0C6B */,/*3180*/2619/* 0C6C */,/*3181*/2620/* 0C6D */, /*3182*/2621/* 0C6E */,/*3183*/2622/* 0C6F */,0,0,0,0,0,0,0,0,/*3192*/2623/* 0C78 */,/*3193*/2624/* 0C79 */, /*3194*/2625/* 0C7A */,/*3195*/2626/* 0C7B */,/*3196*/2624/* 0C7C */,/*3197*/2625/* 0C7D */,/*3198*/2626/* 0C7E */, /*3199*/2627/* 0C7F */,/*3200*/2628/* 0C80 */,/*3201*/2629/* 0C81 */,/*3202*/2630/* 0C82 */,/*3203*/2631/* 0C83 */,0, /*3205*/2632/* 0C85 */,/*3206*/2633/* 0C86 */,/*3207*/2634/* 0C87 */,/*3208*/2635/* 0C88 */,/*3209*/2636/* 0C89 */, /*3210*/2637/* 0C8A */,/*3211*/2638/* 0C8B */,/*3212*/2639/* 0C8C */,0,/*3214*/2640/* 0C8E */,/*3215*/2641/* 0C8F */, /*3216*/2642/* 0C90 */,0,/*3218*/2643/* 0C92 */,/*3219*/2644/* 0C93 */,/*3220*/2645/* 0C94 */,/*3221*/2646/* 0C95 */, /*3222*/2647/* 0C96 */,/*3223*/2648/* 0C97 */,/*3224*/2649/* 0C98 */,/*3225*/2650/* 0C99 */,/*3226*/2651/* 0C9A */, /*3227*/2652/* 0C9B */,/*3228*/2653/* 0C9C */,/*3229*/2654/* 0C9D */,/*3230*/2655/* 0C9E */,/*3231*/2656/* 0C9F */, /*3232*/2657/* 0CA0 */,/*3233*/2658/* 0CA1 */,/*3234*/2659/* 0CA2 */,/*3235*/2660/* 0CA3 */,/*3236*/2661/* 0CA4 */, /*3237*/2662/* 0CA5 */,/*3238*/2663/* 0CA6 */,/*3239*/2664/* 0CA7 */,/*3240*/2665/* 0CA8 */,0,/*3242*/2666/* 0CAA */, /*3243*/2667/* 0CAB */,/*3244*/2668/* 0CAC */,/*3245*/2669/* 0CAD */,/*3246*/2670/* 0CAE */,/*3247*/2671/* 0CAF */, /*3248*/2672/* 0CB0 */,/*3249*/2673/* 0CB1 */,/*3250*/2674/* 0CB2 */,/*3251*/2675/* 0CB3 */,0,/*3253*/2676/* 0CB5 */, /*3254*/2677/* 0CB6 */,/*3255*/2678/* 0CB7 */,/*3256*/2679/* 0CB8 */,/*3257*/2680/* 0CB9 */,0,0,/*3260*/2681/* 0CBC */, /*3261*/2682/* 0CBD */,/*3262*/2683/* 0CBE */,/*3263*/2684/* 0CBF */,/*3264*/2685/* 0CC0 */,/*3265*/2686/* 0CC1 */, /*3266*/2687/* 0CC2 */,/*3267*/2688/* 0CC3 */,/*3268*/2689/* 0CC4 */,0,/*3270*/2690/* 0CC6 */,/*3271*/2691/* 0CC7 */, /*3272*/2692/* 0CC8 */,0,/*3274*/2693/* 0CCA */,/*3275*/2694/* 0CCB */,/*3276*/2695/* 0CCC */,/*3277*/2696/* 0CCD */,0,0, 0,0,0,0,0,/*3285*/2697/* 0CD5 */,/*3286*/2698/* 0CD6 */,0,0,0,0,0,0,0,/*3294*/2699/* 0CDE */,0,/*3296*/2700/* 0CE0 */, /*3297*/2701/* 0CE1 */,/*3298*/2702/* 0CE2 */,/*3299*/2703/* 0CE3 */,0,0,/*3302*/2704/* 0CE6 */,/*3303*/2705/* 0CE7 */, /*3304*/2706/* 0CE8 */,/*3305*/2707/* 0CE9 */,/*3306*/2708/* 0CEA */,/*3307*/2709/* 0CEB */,/*3308*/2710/* 0CEC */, /*3309*/2711/* 0CED */,/*3310*/2712/* 0CEE */,/*3311*/2713/* 0CEF */,0,/*3313*/2714/* 0CF1 */,/*3314*/2715/* 0CF2 */,0,0, 0,0,0,0,0,0,0,0,0,0,0,/*3328*/2716/* 0D00 */,/*3329*/2717/* 0D01 */,/*3330*/2718/* 0D02 */,/*3331*/2719/* 0D03 */,0, /*3333*/2720/* 0D05 */,/*3334*/2721/* 0D06 */,/*3335*/2722/* 0D07 */,/*3336*/2723/* 0D08 */,/*3337*/2724/* 0D09 */, /*3338*/2725/* 0D0A */,/*3339*/2726/* 0D0B */,/*3340*/2727/* 0D0C */,0,/*3342*/2728/* 0D0E */,/*3343*/2729/* 0D0F */, /*3344*/2730/* 0D10 */,0,/*3346*/2731/* 0D12 */,/*3347*/2732/* 0D13 */,/*3348*/2733/* 0D14 */,/*3349*/2734/* 0D15 */, /*3350*/2735/* 0D16 */,/*3351*/2736/* 0D17 */,/*3352*/2737/* 0D18 */,/*3353*/2738/* 0D19 */,/*3354*/2739/* 0D1A */, /*3355*/2740/* 0D1B */,/*3356*/2741/* 0D1C */,/*3357*/2742/* 0D1D */,/*3358*/2743/* 0D1E */,/*3359*/2744/* 0D1F */, /*3360*/2745/* 0D20 */,/*3361*/2746/* 0D21 */,/*3362*/2747/* 0D22 */,/*3363*/2748/* 0D23 */,/*3364*/2749/* 0D24 */, /*3365*/2750/* 0D25 */,/*3366*/2751/* 0D26 */,/*3367*/2752/* 0D27 */,/*3368*/2753/* 0D28 */,/*3369*/2754/* 0D29 */, /*3370*/2755/* 0D2A */,/*3371*/2756/* 0D2B */,/*3372*/2757/* 0D2C */,/*3373*/2758/* 0D2D */,/*3374*/2759/* 0D2E */, /*3375*/2760/* 0D2F */,/*3376*/2761/* 0D30 */,/*3377*/2762/* 0D31 */,/*3378*/2763/* 0D32 */,/*3379*/2764/* 0D33 */, /*3380*/2765/* 0D34 */,/*3381*/2766/* 0D35 */,/*3382*/2767/* 0D36 */,/*3383*/2768/* 0D37 */,/*3384*/2769/* 0D38 */, /*3385*/2770/* 0D39 */,/*3386*/2771/* 0D3A */,/*3387*/2772/* 0D3B */,/*3388*/2772/* 0D3C */,/*3389*/2773/* 0D3D */, /*3390*/2774/* 0D3E */,/*3391*/2775/* 0D3F */,/*3392*/2776/* 0D40 */,/*3393*/2777/* 0D41 */,/*3394*/2778/* 0D42 */, /*3395*/2779/* 0D43 */,/*3396*/2780/* 0D44 */,0,/*3398*/2781/* 0D46 */,/*3399*/2782/* 0D47 */,/*3400*/2783/* 0D48 */,0, /*3402*/2784/* 0D4A */,/*3403*/2785/* 0D4B */,/*3404*/2786/* 0D4C */,/*3405*/2787/* 0D4D */,/*3406*/2788/* 0D4E */, /*3407*/2789/* 0D4F */,0,0,0,0,/*3412*/2790/* 0D54 */,/*3413*/2791/* 0D55 */,/*3414*/2792/* 0D56 */, /*3415*/2793/* 0D57 */,/*3416*/2794/* 0D58 */,/*3417*/2795/* 0D59 */,/*3418*/2796/* 0D5A */,/*3419*/2797/* 0D5B */, /*3420*/2798/* 0D5C */,/*3421*/2799/* 0D5D */,/*3422*/2800/* 0D5E */,/*3423*/2801/* 0D5F */,/*3424*/2802/* 0D60 */, /*3425*/2803/* 0D61 */,/*3426*/2804/* 0D62 */,/*3427*/2805/* 0D63 */,0,0,/*3430*/2806/* 0D66 */,/*3431*/2807/* 0D67 */, /*3432*/2808/* 0D68 */,/*3433*/2809/* 0D69 */,/*3434*/2810/* 0D6A */,/*3435*/2811/* 0D6B */,/*3436*/2812/* 0D6C */, /*3437*/2813/* 0D6D */,/*3438*/2814/* 0D6E */,/*3439*/2815/* 0D6F */,/*3440*/2816/* 0D70 */,/*3441*/2817/* 0D71 */, /*3442*/2818/* 0D72 */,/*3443*/2819/* 0D73 */,/*3444*/2820/* 0D74 */,/*3445*/2821/* 0D75 */,/*3446*/2822/* 0D76 */, /*3447*/2823/* 0D77 */,/*3448*/2824/* 0D78 */,/*3449*/2825/* 0D79 */,/*3450*/2826/* 0D7A */,/*3451*/2827/* 0D7B */, /*3452*/2828/* 0D7C */,/*3453*/2829/* 0D7D */,/*3454*/2830/* 0D7E */,/*3455*/2831/* 0D7F */,0,0,/*3458*/2832/* 0D82 */, /*3459*/2833/* 0D83 */,0,/*3461*/2834/* 0D85 */,/*3462*/2835/* 0D86 */,/*3463*/2836/* 0D87 */,/*3464*/2837/* 0D88 */, /*3465*/2838/* 0D89 */,/*3466*/2839/* 0D8A */,/*3467*/2840/* 0D8B */,/*3468*/2841/* 0D8C */,/*3469*/2842/* 0D8D */, /*3470*/2843/* 0D8E */,/*3471*/2844/* 0D8F */,/*3472*/2845/* 0D90 */,/*3473*/2846/* 0D91 */,/*3474*/2847/* 0D92 */, /*3475*/2848/* 0D93 */,/*3476*/2849/* 0D94 */,/*3477*/2850/* 0D95 */,/*3478*/2851/* 0D96 */,0,0,0,/*3482*/2852/* 0D9A */, /*3483*/2853/* 0D9B */,/*3484*/2854/* 0D9C */,/*3485*/2855/* 0D9D */,/*3486*/2856/* 0D9E */,/*3487*/2857/* 0D9F */, /*3488*/2858/* 0DA0 */,/*3489*/2859/* 0DA1 */,/*3490*/2860/* 0DA2 */,/*3491*/2861/* 0DA3 */,/*3492*/2862/* 0DA4 */, /*3493*/2863/* 0DA5 */,/*3494*/2864/* 0DA6 */,/*3495*/2865/* 0DA7 */,/*3496*/2866/* 0DA8 */,/*3497*/2867/* 0DA9 */, /*3498*/2868/* 0DAA */,/*3499*/2869/* 0DAB */,/*3500*/2870/* 0DAC */,/*3501*/2871/* 0DAD */,/*3502*/2872/* 0DAE */, /*3503*/2873/* 0DAF */,/*3504*/2874/* 0DB0 */,/*3505*/2875/* 0DB1 */,0,/*3507*/2876/* 0DB3 */,/*3508*/2877/* 0DB4 */, /*3509*/2878/* 0DB5 */,/*3510*/2879/* 0DB6 */,/*3511*/2880/* 0DB7 */,/*3512*/2881/* 0DB8 */,/*3513*/2882/* 0DB9 */, /*3514*/2883/* 0DBA */,/*3515*/2884/* 0DBB */,0,/*3517*/2885/* 0DBD */,0,0,/*3520*/2886/* 0DC0 */,/*3521*/2887/* 0DC1 */, /*3522*/2888/* 0DC2 */,/*3523*/2889/* 0DC3 */,/*3524*/2890/* 0DC4 */,/*3525*/2891/* 0DC5 */,/*3526*/2892/* 0DC6 */,0,0,0, /*3530*/2893/* 0DCA */,0,0,0,0,/*3535*/2894/* 0DCF */,/*3536*/2895/* 0DD0 */,/*3537*/2896/* 0DD1 */, /*3538*/2897/* 0DD2 */,/*3539*/2898/* 0DD3 */,/*3540*/2899/* 0DD4 */,0,/*3542*/2900/* 0DD6 */,0,/*3544*/2901/* 0DD8 */, /*3545*/2902/* 0DD9 */,/*3546*/2903/* 0DDA */,/*3547*/2904/* 0DDB */,/*3548*/2905/* 0DDC */,/*3549*/2906/* 0DDD */, /*3550*/2907/* 0DDE */,/*3551*/2908/* 0DDF */,0,0,0,0,0,0,/*3558*/2909/* 0DE6 */,/*3559*/2910/* 0DE7 */, /*3560*/2911/* 0DE8 */,/*3561*/2912/* 0DE9 */,/*3562*/2913/* 0DEA */,/*3563*/2914/* 0DEB */,/*3564*/2915/* 0DEC */, /*3565*/2916/* 0DED */,/*3566*/2917/* 0DEE */,/*3567*/2918/* 0DEF */,0,0,/*3570*/2919/* 0DF2 */,/*3571*/2920/* 0DF3 */, /*3572*/2921/* 0DF4 */,0,0,0,0,0,0,0,0,0,0,0,0,/*3585*/2922/* 0E01 */,/*3586*/2923/* 0E02 */,/*3587*/2924/* 0E03 */, /*3588*/2925/* 0E04 */,/*3589*/2926/* 0E05 */,/*3590*/2927/* 0E06 */,/*3591*/2928/* 0E07 */,/*3592*/2929/* 0E08 */, /*3593*/2930/* 0E09 */,/*3594*/2931/* 0E0A */,/*3595*/2932/* 0E0B */,/*3596*/2933/* 0E0C */,/*3597*/2934/* 0E0D */, /*3598*/2935/* 0E0E */,/*3599*/2936/* 0E0F */,/*3600*/2937/* 0E10 */,/*3601*/2938/* 0E11 */,/*3602*/2939/* 0E12 */, /*3603*/2940/* 0E13 */,/*3604*/2941/* 0E14 */,/*3605*/2942/* 0E15 */,/*3606*/2943/* 0E16 */,/*3607*/2944/* 0E17 */, /*3608*/2945/* 0E18 */,/*3609*/2946/* 0E19 */,/*3610*/2947/* 0E1A */,/*3611*/2948/* 0E1B */,/*3612*/2949/* 0E1C */, /*3613*/2950/* 0E1D */,/*3614*/2951/* 0E1E */,/*3615*/2952/* 0E1F */,/*3616*/2953/* 0E20 */,/*3617*/2954/* 0E21 */, /*3618*/2955/* 0E22 */,/*3619*/2956/* 0E23 */,/*3620*/2957/* 0E24 */,/*3621*/2958/* 0E25 */,/*3622*/2959/* 0E26 */, /*3623*/2960/* 0E27 */,/*3624*/2961/* 0E28 */,/*3625*/2962/* 0E29 */,/*3626*/2963/* 0E2A */,/*3627*/2964/* 0E2B */, /*3628*/2965/* 0E2C */,/*3629*/2966/* 0E2D */,/*3630*/2967/* 0E2E */,/*3631*/2968/* 0E2F */,/*3632*/2969/* 0E30 */, /*3633*/2970/* 0E31 */,/*3634*/2971/* 0E32 */,/*3635*/2972/* 0E33 */,/*3636*/2973/* 0E34 */,/*3637*/2974/* 0E35 */, /*3638*/2975/* 0E36 */,/*3639*/2976/* 0E37 */,/*3640*/2977/* 0E38 */,/*3641*/2978/* 0E39 */,/*3642*/2979/* 0E3A */,0,0,0, 0,/*3647*/2980/* 0E3F */,/*3648*/2981/* 0E40 */,/*3649*/2982/* 0E41 */,/*3650*/2983/* 0E42 */,/*3651*/2984/* 0E43 */, /*3652*/2985/* 0E44 */,/*3653*/2986/* 0E45 */,/*3654*/2987/* 0E46 */,/*3655*/2988/* 0E47 */,/*3656*/2989/* 0E48 */, /*3657*/2990/* 0E49 */,/*3658*/2991/* 0E4A */,/*3659*/2992/* 0E4B */,/*3660*/2993/* 0E4C */,/*3661*/2994/* 0E4D */, /*3662*/2995/* 0E4E */,/*3663*/2996/* 0E4F */,/*3664*/2997/* 0E50 */,/*3665*/2998/* 0E51 */,/*3666*/2999/* 0E52 */, /*3667*/3000/* 0E53 */,/*3668*/3001/* 0E54 */,/*3669*/3002/* 0E55 */,/*3670*/3003/* 0E56 */,/*3671*/3004/* 0E57 */, /*3672*/3005/* 0E58 */,/*3673*/3006/* 0E59 */,/*3674*/3007/* 0E5A */,/*3675*/3008/* 0E5B */,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*3713*/3009/* 0E81 */,/*3714*/3010/* 0E82 */,0,/*3716*/3011/* 0E84 */,0,0, /*3719*/3012/* 0E87 */,/*3720*/3013/* 0E88 */,0,/*3722*/3014/* 0E8A */,0,0,/*3725*/3015/* 0E8D */,0,0,0,0,0,0, /*3732*/3016/* 0E94 */,/*3733*/3017/* 0E95 */,/*3734*/3018/* 0E96 */,/*3735*/3019/* 0E97 */,0,/*3737*/3020/* 0E99 */, /*3738*/3021/* 0E9A */,/*3739*/3022/* 0E9B */,/*3740*/3023/* 0E9C */,/*3741*/3024/* 0E9D */,/*3742*/3025/* 0E9E */, /*3743*/3026/* 0E9F */,0,/*3745*/3027/* 0EA1 */,/*3746*/3028/* 0EA2 */,/*3747*/3029/* 0EA3 */,0,/*3749*/3030/* 0EA5 */,0, /*3751*/3031/* 0EA7 */,0,0,/*3754*/3032/* 0EAA */,/*3755*/3033/* 0EAB */,0,/*3757*/3034/* 0EAD */,/*3758*/3035/* 0EAE */, /*3759*/3036/* 0EAF */,/*3760*/3037/* 0EB0 */,/*3761*/3038/* 0EB1 */,/*3762*/3039/* 0EB2 */,/*3763*/3040/* 0EB3 */, /*3764*/3041/* 0EB4 */,/*3765*/3042/* 0EB5 */,/*3766*/3043/* 0EB6 */,/*3767*/3044/* 0EB7 */,/*3768*/3045/* 0EB8 */, /*3769*/3046/* 0EB9 */,0,/*3771*/3047/* 0EBB */,/*3772*/3048/* 0EBC */,/*3773*/3049/* 0EBD */,0,0,/*3776*/3050/* 0EC0 */, /*3777*/3051/* 0EC1 */,/*3778*/3052/* 0EC2 */,/*3779*/3053/* 0EC3 */,/*3780*/3054/* 0EC4 */,0,/*3782*/3055/* 0EC6 */,0, /*3784*/3056/* 0EC8 */,/*3785*/3057/* 0EC9 */,/*3786*/3058/* 0ECA */,/*3787*/3059/* 0ECB */,/*3788*/3060/* 0ECC */, /*3789*/3061/* 0ECD */,0,0,/*3792*/3062/* 0ED0 */,/*3793*/3063/* 0ED1 */,/*3794*/3064/* 0ED2 */,/*3795*/3065/* 0ED3 */, /*3796*/3066/* 0ED4 */,/*3797*/3067/* 0ED5 */,/*3798*/3068/* 0ED6 */,/*3799*/3069/* 0ED7 */,/*3800*/3070/* 0ED8 */, /*3801*/3071/* 0ED9 */,0,0,/*3804*/3072/* 0EDC */,/*3805*/3073/* 0EDD */,/*3806*/3074/* 0EDE */,/*3807*/3075/* 0EDF */,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*3840*/3076/* 0F00 */,/*3841*/3077/* 0F01 */, /*3842*/3078/* 0F02 */,/*3843*/3079/* 0F03 */,/*3844*/3080/* 0F04 */,/*3845*/3081/* 0F05 */,/*3846*/3082/* 0F06 */, /*3847*/3083/* 0F07 */,/*3848*/3084/* 0F08 */,/*3849*/3085/* 0F09 */,/*3850*/3086/* 0F0A */,/*3851*/3087/* 0F0B */, /*3852*/3088/* 0F0C */,/*3853*/3089/* 0F0D */,/*3854*/3090/* 0F0E */,/*3855*/3091/* 0F0F */,/*3856*/3092/* 0F10 */, /*3857*/3093/* 0F11 */,/*3858*/3094/* 0F12 */,/*3859*/3095/* 0F13 */,/*3860*/3096/* 0F14 */,/*3861*/3097/* 0F15 */, /*3862*/3098/* 0F16 */,/*3863*/3099/* 0F17 */,/*3864*/3100/* 0F18 */,/*3865*/3100/* 0F19 */,/*3866*/3101/* 0F1A */, /*3867*/3102/* 0F1B */,/*3868*/3103/* 0F1C */,/*3869*/3104/* 0F1D */,/*3870*/3105/* 0F1E */,/*3871*/3106/* 0F1F */, /*3872*/3107/* 0F20 */,/*3873*/3108/* 0F21 */,/*3874*/3109/* 0F22 */,/*3875*/3110/* 0F23 */,/*3876*/3111/* 0F24 */, /*3877*/3112/* 0F25 */,/*3878*/3113/* 0F26 */,/*3879*/3114/* 0F27 */,/*3880*/3115/* 0F28 */,/*3881*/3116/* 0F29 */, /*3882*/3117/* 0F2A */,/*3883*/3118/* 0F2B */,/*3884*/3119/* 0F2C */,/*3885*/3120/* 0F2D */,/*3886*/3121/* 0F2E */, /*3887*/3122/* 0F2F */,/*3888*/3123/* 0F30 */,/*3889*/3124/* 0F31 */,/*3890*/3125/* 0F32 */,/*3891*/3126/* 0F33 */, /*3892*/3127/* 0F34 */,/*3893*/3100/* 0F35 */,/*3894*/3128/* 0F36 */,/*3895*/3100/* 0F37 */,/*3896*/3129/* 0F38 */, /*3897*/3130/* 0F39 */,/*3898*/3131/* 0F3A */,/*3899*/3132/* 0F3B */,/*3900*/3133/* 0F3C */,/*3901*/3134/* 0F3D */, /*3902*/3135/* 0F3E */,/*3903*/3135/* 0F3F */,/*3904*/3136/* 0F40 */,/*3905*/3137/* 0F41 */,/*3906*/3138/* 0F42 */, /*3907*/3139/* 0F43 */,/*3908*/3140/* 0F44 */,/*3909*/3141/* 0F45 */,/*3910*/3142/* 0F46 */,/*3911*/3143/* 0F47 */,0, /*3913*/3144/* 0F49 */,/*3914*/3145/* 0F4A */,/*3915*/3146/* 0F4B */,/*3916*/3147/* 0F4C */,/*3917*/3148/* 0F4D */, /*3918*/3149/* 0F4E */,/*3919*/3150/* 0F4F */,/*3920*/3151/* 0F50 */,/*3921*/3152/* 0F51 */,/*3922*/3153/* 0F52 */, /*3923*/3154/* 0F53 */,/*3924*/3155/* 0F54 */,/*3925*/3156/* 0F55 */,/*3926*/3157/* 0F56 */,/*3927*/3158/* 0F57 */, /*3928*/3159/* 0F58 */,/*3929*/3160/* 0F59 */,/*3930*/3161/* 0F5A */,/*3931*/3162/* 0F5B */,/*3932*/3163/* 0F5C */, /*3933*/3164/* 0F5D */,/*3934*/3165/* 0F5E */,/*3935*/3166/* 0F5F */,/*3936*/3167/* 0F60 */,/*3937*/3168/* 0F61 */, /*3938*/3169/* 0F62 */,/*3939*/3170/* 0F63 */,/*3940*/3171/* 0F64 */,/*3941*/3172/* 0F65 */,/*3942*/3173/* 0F66 */, /*3943*/3174/* 0F67 */,/*3944*/3175/* 0F68 */,/*3945*/3176/* 0F69 */,/*3946*/3177/* 0F6A */,/*3947*/3178/* 0F6B */, /*3948*/3179/* 0F6C */,0,0,0,0,/*3953*/3180/* 0F71 */,/*3954*/3181/* 0F72 */,/*3955*/3182/* 0F73 */, /*3956*/3183/* 0F74 */,/*3957*/3184/* 0F75 */,/*3958*/3185/* 0F76 */,/*3959*/3186/* 0F77 */,/*3960*/3187/* 0F78 */, /*3961*/3188/* 0F79 */,/*3962*/3189/* 0F7A */,/*3963*/3190/* 0F7B */,/*3964*/3191/* 0F7C */,/*3965*/3192/* 0F7D */, /*3966*/3193/* 0F7E */,/*3967*/3194/* 0F7F */,/*3968*/3195/* 0F80 */,/*3969*/3196/* 0F81 */,/*3970*/3197/* 0F82 */, /*3971*/3197/* 0F83 */,/*3972*/3198/* 0F84 */,/*3973*/3199/* 0F85 */,/*3974*/3197/* 0F86 */,/*3975*/3197/* 0F87 */, /*3976*/3200/* 0F88 */,/*3977*/3201/* 0F89 */,/*3978*/3202/* 0F8A */,/*3979*/3203/* 0F8B */,/*3980*/3204/* 0F8C */, /*3981*/3205/* 0F8D */,/*3982*/3206/* 0F8E */,/*3983*/3207/* 0F8F */,/*3984*/3208/* 0F90 */,/*3985*/3209/* 0F91 */, /*3986*/3210/* 0F92 */,/*3987*/3211/* 0F93 */,/*3988*/3212/* 0F94 */,/*3989*/3213/* 0F95 */,/*3990*/3214/* 0F96 */, /*3991*/3215/* 0F97 */,0,/*3993*/3216/* 0F99 */,/*3994*/3217/* 0F9A */,/*3995*/3218/* 0F9B */,/*3996*/3219/* 0F9C */, /*3997*/3220/* 0F9D */,/*3998*/3221/* 0F9E */,/*3999*/3222/* 0F9F */,/*4000*/3223/* 0FA0 */,/*4001*/3224/* 0FA1 */, /*4002*/3225/* 0FA2 */,/*4003*/3226/* 0FA3 */,/*4004*/3227/* 0FA4 */,/*4005*/3228/* 0FA5 */,/*4006*/3229/* 0FA6 */, /*4007*/3230/* 0FA7 */,/*4008*/3231/* 0FA8 */,/*4009*/3232/* 0FA9 */,/*4010*/3233/* 0FAA */,/*4011*/3234/* 0FAB */, /*4012*/3235/* 0FAC */,/*4013*/3236/* 0FAD */,/*4014*/3237/* 0FAE */,/*4015*/3238/* 0FAF */,/*4016*/3239/* 0FB0 */, /*4017*/3240/* 0FB1 */,/*4018*/3241/* 0FB2 */,/*4019*/3242/* 0FB3 */,/*4020*/3243/* 0FB4 */,/*4021*/3244/* 0FB5 */, /*4022*/3245/* 0FB6 */,/*4023*/3246/* 0FB7 */,/*4024*/3247/* 0FB8 */,/*4025*/3248/* 0FB9 */,/*4026*/3249/* 0FBA */, /*4027*/3250/* 0FBB */,/*4028*/3251/* 0FBC */,0,/*4030*/3252/* 0FBE */,/*4031*/3253/* 0FBF */,/*4032*/3254/* 0FC0 */, /*4033*/3255/* 0FC1 */,/*4034*/3256/* 0FC2 */,/*4035*/3257/* 0FC3 */,/*4036*/3258/* 0FC4 */,/*4037*/3259/* 0FC5 */, /*4038*/3260/* 0FC6 */,/*4039*/3261/* 0FC7 */,/*4040*/3262/* 0FC8 */,/*4041*/3263/* 0FC9 */,/*4042*/3264/* 0FCA */, /*4043*/3265/* 0FCB */,/*4044*/3266/* 0FCC */,0,/*4046*/3267/* 0FCE */,/*4047*/3268/* 0FCF */,/*4048*/3269/* 0FD0 */, /*4049*/3270/* 0FD1 */,/*4050*/3271/* 0FD2 */,/*4051*/3272/* 0FD3 */,/*4052*/3273/* 0FD4 */,/*4053*/3274/* 0FD5 */, /*4054*/3275/* 0FD6 */,/*4055*/3276/* 0FD7 */,/*4056*/3277/* 0FD8 */,/*4057*/3278/* 0FD9 */,/*4058*/3279/* 0FDA */,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*4096*/3280/* 1000 */,/*4097*/3281/* 1001 */, /*4098*/3282/* 1002 */,/*4099*/3283/* 1003 */,/*4100*/3284/* 1004 */,/*4101*/3285/* 1005 */,/*4102*/3286/* 1006 */, /*4103*/3287/* 1007 */,/*4104*/3288/* 1008 */,/*4105*/3289/* 1009 */,/*4106*/3290/* 100A */,/*4107*/3291/* 100B */, /*4108*/3292/* 100C */,/*4109*/3293/* 100D */,/*4110*/3294/* 100E */,/*4111*/3295/* 100F */,/*4112*/3296/* 1010 */, /*4113*/3297/* 1011 */,/*4114*/3298/* 1012 */,/*4115*/3299/* 1013 */,/*4116*/3300/* 1014 */,/*4117*/3301/* 1015 */, /*4118*/3302/* 1016 */,/*4119*/3303/* 1017 */,/*4120*/3304/* 1018 */,/*4121*/3305/* 1019 */,/*4122*/3306/* 101A */, /*4123*/3307/* 101B */,/*4124*/3308/* 101C */,/*4125*/3309/* 101D */,/*4126*/3310/* 101E */,/*4127*/3311/* 101F */, /*4128*/3312/* 1020 */,/*4129*/3313/* 1021 */,/*4130*/3314/* 1022 */,/*4131*/3315/* 1023 */,/*4132*/3316/* 1024 */, /*4133*/3317/* 1025 */,/*4134*/3318/* 1026 */,/*4135*/3319/* 1027 */,/*4136*/3320/* 1028 */,/*4137*/3321/* 1029 */, /*4138*/3322/* 102A */,/*4139*/3323/* 102B */,/*4140*/3324/* 102C */,/*4141*/3325/* 102D */,/*4142*/3326/* 102E */, /*4143*/3327/* 102F */,/*4144*/3328/* 1030 */,/*4145*/3329/* 1031 */,/*4146*/3330/* 1032 */,/*4147*/3331/* 1033 */, /*4148*/3332/* 1034 */,/*4149*/3333/* 1035 */,/*4150*/3334/* 1036 */,/*4151*/3335/* 1037 */,/*4152*/3336/* 1038 */, /*4153*/3337/* 1039 */,/*4154*/3338/* 103A */,/*4155*/3339/* 103B */,/*4156*/3340/* 103C */,/*4157*/3341/* 103D */, /*4158*/3342/* 103E */,/*4159*/3343/* 103F */,/*4160*/3344/* 1040 */,/*4161*/3345/* 1041 */,/*4162*/3346/* 1042 */, /*4163*/3347/* 1043 */,/*4164*/3348/* 1044 */,/*4165*/3349/* 1045 */,/*4166*/3350/* 1046 */,/*4167*/3351/* 1047 */, /*4168*/3352/* 1048 */,/*4169*/3353/* 1049 */,/*4170*/3354/* 104A */,/*4171*/3355/* 104B */,/*4172*/3356/* 104C */, /*4173*/3357/* 104D */,/*4174*/3358/* 104E */,/*4175*/3359/* 104F */,/*4176*/3360/* 1050 */,/*4177*/3361/* 1051 */, /*4178*/3362/* 1052 */,/*4179*/3363/* 1053 */,/*4180*/3364/* 1054 */,/*4181*/3365/* 1055 */,/*4182*/3366/* 1056 */, /*4183*/3367/* 1057 */,/*4184*/3368/* 1058 */,/*4185*/3369/* 1059 */,/*4186*/3370/* 105A */,/*4187*/3371/* 105B */, /*4188*/3372/* 105C */,/*4189*/3373/* 105D */,/*4190*/3374/* 105E */,/*4191*/3375/* 105F */,/*4192*/3376/* 1060 */, /*4193*/3377/* 1061 */,/*4194*/3378/* 1062 */,/*4195*/3379/* 1063 */,/*4196*/3380/* 1064 */,/*4197*/3381/* 1065 */, /*4198*/3382/* 1066 */,/*4199*/3383/* 1067 */,/*4200*/3384/* 1068 */,/*4201*/3385/* 1069 */,/*4202*/3386/* 106A */, /*4203*/3387/* 106B */,/*4204*/3388/* 106C */,/*4205*/3389/* 106D */,/*4206*/3390/* 106E */,/*4207*/3391/* 106F */, /*4208*/3392/* 1070 */,/*4209*/3393/* 1071 */,/*4210*/3394/* 1072 */,/*4211*/3395/* 1073 */,/*4212*/3396/* 1074 */, /*4213*/3397/* 1075 */,/*4214*/3398/* 1076 */,/*4215*/3399/* 1077 */,/*4216*/3400/* 1078 */,/*4217*/3401/* 1079 */, /*4218*/3402/* 107A */,/*4219*/3403/* 107B */,/*4220*/3404/* 107C */,/*4221*/3405/* 107D */,/*4222*/3406/* 107E */, /*4223*/3407/* 107F */,/*4224*/3408/* 1080 */,/*4225*/3409/* 1081 */,/*4226*/3410/* 1082 */,/*4227*/3411/* 1083 */, /*4228*/3412/* 1084 */,/*4229*/3413/* 1085 */,/*4230*/3414/* 1086 */,/*4231*/3415/* 1087 */,/*4232*/3416/* 1088 */, /*4233*/3417/* 1089 */,/*4234*/3418/* 108A */,/*4235*/3419/* 108B */,/*4236*/3420/* 108C */,/*4237*/3421/* 108D */, /*4238*/3422/* 108E */,/*4239*/3423/* 108F */,/*4240*/3424/* 1090 */,/*4241*/3425/* 1091 */,/*4242*/3426/* 1092 */, /*4243*/3427/* 1093 */,/*4244*/3428/* 1094 */,/*4245*/3429/* 1095 */,/*4246*/3430/* 1096 */,/*4247*/3431/* 1097 */, /*4248*/3432/* 1098 */,/*4249*/3433/* 1099 */,/*4250*/3434/* 109A */,/*4251*/3435/* 109B */,/*4252*/3436/* 109C */, /*4253*/3437/* 109D */,/*4254*/3438/* 109E */,/*4255*/3439/* 109F */,/*4256*/3440/* 10A0 */,/*4257*/3441/* 10A1 */, /*4258*/3442/* 10A2 */,/*4259*/3443/* 10A3 */,/*4260*/3444/* 10A4 */,/*4261*/3445/* 10A5 */,/*4262*/3446/* 10A6 */, /*4263*/3447/* 10A7 */,/*4264*/3448/* 10A8 */,/*4265*/3449/* 10A9 */,/*4266*/3450/* 10AA */,/*4267*/3451/* 10AB */, /*4268*/3452/* 10AC */,/*4269*/3453/* 10AD */,/*4270*/3454/* 10AE */,/*4271*/3455/* 10AF */,/*4272*/3456/* 10B0 */, /*4273*/3457/* 10B1 */,/*4274*/3458/* 10B2 */,/*4275*/3459/* 10B3 */,/*4276*/3460/* 10B4 */,/*4277*/3461/* 10B5 */, /*4278*/3462/* 10B6 */,/*4279*/3463/* 10B7 */,/*4280*/3464/* 10B8 */,/*4281*/3465/* 10B9 */,/*4282*/3466/* 10BA */, /*4283*/3467/* 10BB */,/*4284*/3468/* 10BC */,/*4285*/3469/* 10BD */,/*4286*/3470/* 10BE */,/*4287*/3471/* 10BF */, /*4288*/3472/* 10C0 */,/*4289*/3473/* 10C1 */,/*4290*/3474/* 10C2 */,/*4291*/3475/* 10C3 */,/*4292*/3476/* 10C4 */, /*4293*/3477/* 10C5 */,0,/*4295*/3478/* 10C7 */,0,0,0,0,0,/*4301*/3479/* 10CD */,0,0,/*4304*/3480/* 10D0 */, /*4305*/3481/* 10D1 */,/*4306*/3482/* 10D2 */,/*4307*/3483/* 10D3 */,/*4308*/3484/* 10D4 */,/*4309*/3485/* 10D5 */, /*4310*/3486/* 10D6 */,/*4311*/3487/* 10D7 */,/*4312*/3488/* 10D8 */,/*4313*/3489/* 10D9 */,/*4314*/3490/* 10DA */, /*4315*/3491/* 10DB */,/*4316*/3492/* 10DC */,/*4317*/3493/* 10DD */,/*4318*/3494/* 10DE */,/*4319*/3495/* 10DF */, /*4320*/3496/* 10E0 */,/*4321*/3497/* 10E1 */,/*4322*/3498/* 10E2 */,/*4323*/3499/* 10E3 */,/*4324*/3500/* 10E4 */, /*4325*/3501/* 10E5 */,/*4326*/3502/* 10E6 */,/*4327*/3503/* 10E7 */,/*4328*/3504/* 10E8 */,/*4329*/3505/* 10E9 */, /*4330*/3506/* 10EA */,/*4331*/3507/* 10EB */,/*4332*/3508/* 10EC */,/*4333*/3509/* 10ED */,/*4334*/3510/* 10EE */, /*4335*/3511/* 10EF */,/*4336*/3512/* 10F0 */,/*4337*/3513/* 10F1 */,/*4338*/3514/* 10F2 */,/*4339*/3515/* 10F3 */, /*4340*/3516/* 10F4 */,/*4341*/3517/* 10F5 */,/*4342*/3518/* 10F6 */,/*4343*/3519/* 10F7 */,/*4344*/3520/* 10F8 */, /*4345*/3521/* 10F9 */,/*4346*/3522/* 10FA */,/*4347*/3523/* 10FB */,/*4348*/3524/* 10FC */,/*4349*/3525/* 10FD */, /*4350*/3526/* 10FE */,/*4351*/3527/* 10FF */,/*4352*/3528/* 1100 */,/*4353*/3529/* 1101 */,/*4354*/3530/* 1102 */, /*4355*/3531/* 1103 */,/*4356*/3532/* 1104 */,/*4357*/3533/* 1105 */,/*4358*/3534/* 1106 */,/*4359*/3535/* 1107 */, /*4360*/3536/* 1108 */,/*4361*/3537/* 1109 */,/*4362*/3538/* 110A */,/*4363*/3539/* 110B */,/*4364*/3540/* 110C */, /*4365*/3541/* 110D */,/*4366*/3542/* 110E */,/*4367*/3543/* 110F */,/*4368*/3544/* 1110 */,/*4369*/3545/* 1111 */, /*4370*/3546/* 1112 */,/*4371*/3547/* 1113 */,/*4372*/3548/* 1114 */,/*4373*/3549/* 1115 */,/*4374*/3550/* 1116 */, /*4375*/3551/* 1117 */,/*4376*/3552/* 1118 */,/*4377*/3553/* 1119 */,/*4378*/3554/* 111A */,/*4379*/3555/* 111B */, /*4380*/3556/* 111C */,/*4381*/3557/* 111D */,/*4382*/3558/* 111E */,/*4383*/3559/* 111F */,/*4384*/3560/* 1120 */, /*4385*/3561/* 1121 */,/*4386*/3562/* 1122 */,/*4387*/3563/* 1123 */,/*4388*/3564/* 1124 */,/*4389*/3565/* 1125 */, /*4390*/3566/* 1126 */,/*4391*/3567/* 1127 */,/*4392*/3568/* 1128 */,/*4393*/3569/* 1129 */,/*4394*/3570/* 112A */, /*4395*/3571/* 112B */,/*4396*/3572/* 112C */,/*4397*/3573/* 112D */,/*4398*/3574/* 112E */,/*4399*/3575/* 112F */, /*4400*/3576/* 1130 */,/*4401*/3577/* 1131 */,/*4402*/3578/* 1132 */,/*4403*/3579/* 1133 */,/*4404*/3580/* 1134 */, /*4405*/3581/* 1135 */,/*4406*/3582/* 1136 */,/*4407*/3583/* 1137 */,/*4408*/3584/* 1138 */,/*4409*/3585/* 1139 */, /*4410*/3586/* 113A */,/*4411*/3587/* 113B */,/*4412*/3588/* 113C */,/*4413*/3589/* 113D */,/*4414*/3590/* 113E */, /*4415*/3591/* 113F */,/*4416*/3592/* 1140 */,/*4417*/3593/* 1141 */,/*4418*/3594/* 1142 */,/*4419*/3595/* 1143 */, /*4420*/3596/* 1144 */,/*4421*/3597/* 1145 */,/*4422*/3598/* 1146 */,/*4423*/3599/* 1147 */,/*4424*/3600/* 1148 */, /*4425*/3601/* 1149 */,/*4426*/3602/* 114A */,/*4427*/3603/* 114B */,/*4428*/3604/* 114C */,/*4429*/3605/* 114D */, /*4430*/3606/* 114E */,/*4431*/3607/* 114F */,/*4432*/3608/* 1150 */,/*4433*/3609/* 1151 */,/*4434*/3610/* 1152 */, /*4435*/3611/* 1153 */,/*4436*/3612/* 1154 */,/*4437*/3613/* 1155 */,/*4438*/3614/* 1156 */,/*4439*/3615/* 1157 */, /*4440*/3616/* 1158 */,/*4441*/3617/* 1159 */,/*4442*/3618/* 115A */,/*4443*/3619/* 115B */,/*4444*/3620/* 115C */, /*4445*/3621/* 115D */,/*4446*/3622/* 115E */,/*4447*/3623/* 115F */,/*4448*/3624/* 1160 */,/*4449*/3625/* 1161 */, /*4450*/3626/* 1162 */,/*4451*/3627/* 1163 */,/*4452*/3628/* 1164 */,/*4453*/3629/* 1165 */,/*4454*/3630/* 1166 */, /*4455*/3631/* 1167 */,/*4456*/3632/* 1168 */,/*4457*/3633/* 1169 */,/*4458*/3634/* 116A */,/*4459*/3635/* 116B */, /*4460*/3636/* 116C */,/*4461*/3637/* 116D */,/*4462*/3638/* 116E */,/*4463*/3639/* 116F */,/*4464*/3640/* 1170 */, /*4465*/3641/* 1171 */,/*4466*/3642/* 1172 */,/*4467*/3643/* 1173 */,/*4468*/3644/* 1174 */,/*4469*/3645/* 1175 */, /*4470*/3646/* 1176 */,/*4471*/3647/* 1177 */,/*4472*/3648/* 1178 */,/*4473*/3649/* 1179 */,/*4474*/3650/* 117A */, /*4475*/3651/* 117B */,/*4476*/3652/* 117C */,/*4477*/3653/* 117D */,/*4478*/3654/* 117E */,/*4479*/3655/* 117F */, /*4480*/3656/* 1180 */,/*4481*/3657/* 1181 */,/*4482*/3658/* 1182 */,/*4483*/3659/* 1183 */,/*4484*/3660/* 1184 */, /*4485*/3661/* 1185 */,/*4486*/3662/* 1186 */,/*4487*/3663/* 1187 */,/*4488*/3664/* 1188 */,/*4489*/3665/* 1189 */, /*4490*/3666/* 118A */,/*4491*/3667/* 118B */,/*4492*/3668/* 118C */,/*4493*/3669/* 118D */,/*4494*/3670/* 118E */, /*4495*/3671/* 118F */,/*4496*/3672/* 1190 */,/*4497*/3673/* 1191 */,/*4498*/3674/* 1192 */,/*4499*/3675/* 1193 */, /*4500*/3676/* 1194 */,/*4501*/3677/* 1195 */,/*4502*/3678/* 1196 */,/*4503*/3679/* 1197 */,/*4504*/3680/* 1198 */, /*4505*/3681/* 1199 */,/*4506*/3682/* 119A */,/*4507*/3683/* 119B */,/*4508*/3684/* 119C */,/*4509*/3685/* 119D */, /*4510*/3686/* 119E */,/*4511*/3687/* 119F */,/*4512*/3688/* 11A0 */,/*4513*/3689/* 11A1 */,/*4514*/3690/* 11A2 */, /*4515*/3691/* 11A3 */,/*4516*/3692/* 11A4 */,/*4517*/3693/* 11A5 */,/*4518*/3694/* 11A6 */,/*4519*/3695/* 11A7 */, /*4520*/3696/* 11A8 */,/*4521*/3697/* 11A9 */,/*4522*/3698/* 11AA */,/*4523*/3699/* 11AB */,/*4524*/3700/* 11AC */, /*4525*/3701/* 11AD */,/*4526*/3702/* 11AE */,/*4527*/3703/* 11AF */,/*4528*/3704/* 11B0 */,/*4529*/3705/* 11B1 */, /*4530*/3706/* 11B2 */,/*4531*/3707/* 11B3 */,/*4532*/3708/* 11B4 */,/*4533*/3709/* 11B5 */,/*4534*/3710/* 11B6 */, /*4535*/3711/* 11B7 */,/*4536*/3712/* 11B8 */,/*4537*/3713/* 11B9 */,/*4538*/3714/* 11BA */,/*4539*/3715/* 11BB */, /*4540*/3716/* 11BC */,/*4541*/3717/* 11BD */,/*4542*/3718/* 11BE */,/*4543*/3719/* 11BF */,/*4544*/3720/* 11C0 */, /*4545*/3721/* 11C1 */,/*4546*/3722/* 11C2 */,/*4547*/3723/* 11C3 */,/*4548*/3724/* 11C4 */,/*4549*/3725/* 11C5 */, /*4550*/3726/* 11C6 */,/*4551*/3727/* 11C7 */,/*4552*/3728/* 11C8 */,/*4553*/3729/* 11C9 */,/*4554*/3730/* 11CA */, /*4555*/3731/* 11CB */,/*4556*/3732/* 11CC */,/*4557*/3733/* 11CD */,/*4558*/3734/* 11CE */,/*4559*/3735/* 11CF */, /*4560*/3736/* 11D0 */,/*4561*/3737/* 11D1 */,/*4562*/3738/* 11D2 */,/*4563*/3739/* 11D3 */,/*4564*/3740/* 11D4 */, /*4565*/3741/* 11D5 */,/*4566*/3742/* 11D6 */,/*4567*/3743/* 11D7 */,/*4568*/3744/* 11D8 */,/*4569*/3745/* 11D9 */, /*4570*/3746/* 11DA */,/*4571*/3747/* 11DB */,/*4572*/3748/* 11DC */,/*4573*/3749/* 11DD */,/*4574*/3750/* 11DE */, /*4575*/3751/* 11DF */,/*4576*/3752/* 11E0 */,/*4577*/3753/* 11E1 */,/*4578*/3754/* 11E2 */,/*4579*/3755/* 11E3 */, /*4580*/3756/* 11E4 */,/*4581*/3757/* 11E5 */,/*4582*/3758/* 11E6 */,/*4583*/3759/* 11E7 */,/*4584*/3760/* 11E8 */, /*4585*/3761/* 11E9 */,/*4586*/3762/* 11EA */,/*4587*/3763/* 11EB */,/*4588*/3764/* 11EC */,/*4589*/3765/* 11ED */, /*4590*/3766/* 11EE */,/*4591*/3767/* 11EF */,/*4592*/3768/* 11F0 */,/*4593*/3769/* 11F1 */,/*4594*/3770/* 11F2 */, /*4595*/3771/* 11F3 */,/*4596*/3772/* 11F4 */,/*4597*/3773/* 11F5 */,/*4598*/3774/* 11F6 */,/*4599*/3775/* 11F7 */, /*4600*/3776/* 11F8 */,/*4601*/3777/* 11F9 */,/*4602*/3778/* 11FA */,/*4603*/3779/* 11FB */,/*4604*/3780/* 11FC */, /*4605*/3781/* 11FD */,/*4606*/3782/* 11FE */,/*4607*/3783/* 11FF */,/*4608*/3784/* 1200 */,/*4609*/3785/* 1201 */, /*4610*/3786/* 1202 */,/*4611*/3787/* 1203 */,/*4612*/3788/* 1204 */,/*4613*/3789/* 1205 */,/*4614*/3790/* 1206 */, /*4615*/3791/* 1207 */,/*4616*/3792/* 1208 */,/*4617*/3793/* 1209 */,/*4618*/3794/* 120A */,/*4619*/3795/* 120B */, /*4620*/3796/* 120C */,/*4621*/3797/* 120D */,/*4622*/3798/* 120E */,/*4623*/3799/* 120F */,/*4624*/3800/* 1210 */, /*4625*/3801/* 1211 */,/*4626*/3802/* 1212 */,/*4627*/3803/* 1213 */,/*4628*/3804/* 1214 */,/*4629*/3805/* 1215 */, /*4630*/3806/* 1216 */,/*4631*/3807/* 1217 */,/*4632*/3808/* 1218 */,/*4633*/3809/* 1219 */,/*4634*/3810/* 121A */, /*4635*/3811/* 121B */,/*4636*/3812/* 121C */,/*4637*/3813/* 121D */,/*4638*/3814/* 121E */,/*4639*/3815/* 121F */, /*4640*/3816/* 1220 */,/*4641*/3817/* 1221 */,/*4642*/3818/* 1222 */,/*4643*/3819/* 1223 */,/*4644*/3820/* 1224 */, /*4645*/3821/* 1225 */,/*4646*/3822/* 1226 */,/*4647*/3823/* 1227 */,/*4648*/3824/* 1228 */,/*4649*/3825/* 1229 */, /*4650*/3826/* 122A */,/*4651*/3827/* 122B */,/*4652*/3828/* 122C */,/*4653*/3829/* 122D */,/*4654*/3830/* 122E */, /*4655*/3831/* 122F */,/*4656*/3832/* 1230 */,/*4657*/3833/* 1231 */,/*4658*/3834/* 1232 */,/*4659*/3835/* 1233 */, /*4660*/3836/* 1234 */,/*4661*/3837/* 1235 */,/*4662*/3838/* 1236 */,/*4663*/3839/* 1237 */,/*4664*/3840/* 1238 */, /*4665*/3841/* 1239 */,/*4666*/3842/* 123A */,/*4667*/3843/* 123B */,/*4668*/3844/* 123C */,/*4669*/3845/* 123D */, /*4670*/3846/* 123E */,/*4671*/3847/* 123F */,/*4672*/3848/* 1240 */,/*4673*/3849/* 1241 */,/*4674*/3850/* 1242 */, /*4675*/3851/* 1243 */,/*4676*/3852/* 1244 */,/*4677*/3853/* 1245 */,/*4678*/3854/* 1246 */,/*4679*/3855/* 1247 */, /*4680*/3856/* 1248 */,0,/*4682*/3857/* 124A */,/*4683*/3858/* 124B */,/*4684*/3859/* 124C */,/*4685*/3860/* 124D */,0,0, /*4688*/3861/* 1250 */,/*4689*/3862/* 1251 */,/*4690*/3863/* 1252 */,/*4691*/3864/* 1253 */,/*4692*/3865/* 1254 */, /*4693*/3866/* 1255 */,/*4694*/3867/* 1256 */,0,/*4696*/3868/* 1258 */,0,/*4698*/3869/* 125A */,/*4699*/3870/* 125B */, /*4700*/3871/* 125C */,/*4701*/3872/* 125D */,0,0,/*4704*/3873/* 1260 */,/*4705*/3874/* 1261 */,/*4706*/3875/* 1262 */, /*4707*/3876/* 1263 */,/*4708*/3877/* 1264 */,/*4709*/3878/* 1265 */,/*4710*/3879/* 1266 */,/*4711*/3880/* 1267 */, /*4712*/3881/* 1268 */,/*4713*/3882/* 1269 */,/*4714*/3883/* 126A */,/*4715*/3884/* 126B */,/*4716*/3885/* 126C */, /*4717*/3886/* 126D */,/*4718*/3887/* 126E */,/*4719*/3888/* 126F */,/*4720*/3889/* 1270 */,/*4721*/3890/* 1271 */, /*4722*/3891/* 1272 */,/*4723*/3892/* 1273 */,/*4724*/3893/* 1274 */,/*4725*/3894/* 1275 */,/*4726*/3895/* 1276 */, /*4727*/3896/* 1277 */,/*4728*/3897/* 1278 */,/*4729*/3898/* 1279 */,/*4730*/3899/* 127A */,/*4731*/3900/* 127B */, /*4732*/3901/* 127C */,/*4733*/3902/* 127D */,/*4734*/3903/* 127E */,/*4735*/3904/* 127F */,/*4736*/3905/* 1280 */, /*4737*/3906/* 1281 */,/*4738*/3907/* 1282 */,/*4739*/3908/* 1283 */,/*4740*/3909/* 1284 */,/*4741*/3910/* 1285 */, /*4742*/3911/* 1286 */,/*4743*/3912/* 1287 */,/*4744*/3913/* 1288 */,0,/*4746*/3914/* 128A */,/*4747*/3915/* 128B */, /*4748*/3916/* 128C */,/*4749*/3917/* 128D */,0,0,/*4752*/3918/* 1290 */,/*4753*/3919/* 1291 */,/*4754*/3920/* 1292 */, /*4755*/3921/* 1293 */,/*4756*/3922/* 1294 */,/*4757*/3923/* 1295 */,/*4758*/3924/* 1296 */,/*4759*/3925/* 1297 */, /*4760*/3926/* 1298 */,/*4761*/3927/* 1299 */,/*4762*/3928/* 129A */,/*4763*/3929/* 129B */,/*4764*/3930/* 129C */, /*4765*/3931/* 129D */,/*4766*/3932/* 129E */,/*4767*/3933/* 129F */,/*4768*/3934/* 12A0 */,/*4769*/3935/* 12A1 */, /*4770*/3936/* 12A2 */,/*4771*/3937/* 12A3 */,/*4772*/3938/* 12A4 */,/*4773*/3939/* 12A5 */,/*4774*/3940/* 12A6 */, /*4775*/3941/* 12A7 */,/*4776*/3942/* 12A8 */,/*4777*/3943/* 12A9 */,/*4778*/3944/* 12AA */,/*4779*/3945/* 12AB */, /*4780*/3946/* 12AC */,/*4781*/3947/* 12AD */,/*4782*/3948/* 12AE */,/*4783*/3949/* 12AF */,/*4784*/3950/* 12B0 */,0, /*4786*/3951/* 12B2 */,/*4787*/3952/* 12B3 */,/*4788*/3953/* 12B4 */,/*4789*/3954/* 12B5 */,0,0,/*4792*/3955/* 12B8 */, /*4793*/3956/* 12B9 */,/*4794*/3957/* 12BA */,/*4795*/3958/* 12BB */,/*4796*/3959/* 12BC */,/*4797*/3960/* 12BD */, /*4798*/3961/* 12BE */,0,/*4800*/3962/* 12C0 */,0,/*4802*/3963/* 12C2 */,/*4803*/3964/* 12C3 */,/*4804*/3965/* 12C4 */, /*4805*/3966/* 12C5 */,0,0,/*4808*/3967/* 12C8 */,/*4809*/3968/* 12C9 */,/*4810*/3969/* 12CA */,/*4811*/3970/* 12CB */, /*4812*/3971/* 12CC */,/*4813*/3972/* 12CD */,/*4814*/3973/* 12CE */,/*4815*/3974/* 12CF */,/*4816*/3975/* 12D0 */, /*4817*/3976/* 12D1 */,/*4818*/3977/* 12D2 */,/*4819*/3978/* 12D3 */,/*4820*/3979/* 12D4 */,/*4821*/3980/* 12D5 */, /*4822*/3981/* 12D6 */,0,/*4824*/3982/* 12D8 */,/*4825*/3983/* 12D9 */,/*4826*/3984/* 12DA */,/*4827*/3985/* 12DB */, /*4828*/3986/* 12DC */,/*4829*/3987/* 12DD */,/*4830*/3988/* 12DE */,/*4831*/3989/* 12DF */,/*4832*/3990/* 12E0 */, /*4833*/3991/* 12E1 */,/*4834*/3992/* 12E2 */,/*4835*/3993/* 12E3 */,/*4836*/3994/* 12E4 */,/*4837*/3995/* 12E5 */, /*4838*/3996/* 12E6 */,/*4839*/3997/* 12E7 */,/*4840*/3998/* 12E8 */,/*4841*/3999/* 12E9 */,/*4842*/4000/* 12EA */, /*4843*/4001/* 12EB */,/*4844*/4002/* 12EC */,/*4845*/4003/* 12ED */,/*4846*/4004/* 12EE */,/*4847*/4005/* 12EF */, /*4848*/4006/* 12F0 */,/*4849*/4007/* 12F1 */,/*4850*/4008/* 12F2 */,/*4851*/4009/* 12F3 */,/*4852*/4010/* 12F4 */, /*4853*/4011/* 12F5 */,/*4854*/4012/* 12F6 */,/*4855*/4013/* 12F7 */,/*4856*/4014/* 12F8 */,/*4857*/4015/* 12F9 */, /*4858*/4016/* 12FA */,/*4859*/4017/* 12FB */,/*4860*/4018/* 12FC */,/*4861*/4019/* 12FD */,/*4862*/4020/* 12FE */, /*4863*/4021/* 12FF */,/*4864*/4022/* 1300 */,/*4865*/4023/* 1301 */,/*4866*/4024/* 1302 */,/*4867*/4025/* 1303 */, /*4868*/4026/* 1304 */,/*4869*/4027/* 1305 */,/*4870*/4028/* 1306 */,/*4871*/4029/* 1307 */,/*4872*/4030/* 1308 */, /*4873*/4031/* 1309 */,/*4874*/4032/* 130A */,/*4875*/4033/* 130B */,/*4876*/4034/* 130C */,/*4877*/4035/* 130D */, /*4878*/4036/* 130E */,/*4879*/4037/* 130F */,/*4880*/4038/* 1310 */,0,/*4882*/4039/* 1312 */,/*4883*/4040/* 1313 */, /*4884*/4041/* 1314 */,/*4885*/4042/* 1315 */,0,0,/*4888*/4043/* 1318 */,/*4889*/4044/* 1319 */,/*4890*/4045/* 131A */, /*4891*/4046/* 131B */,/*4892*/4047/* 131C */,/*4893*/4048/* 131D */,/*4894*/4049/* 131E */,/*4895*/4050/* 131F */, /*4896*/4051/* 1320 */,/*4897*/4052/* 1321 */,/*4898*/4053/* 1322 */,/*4899*/4054/* 1323 */,/*4900*/4055/* 1324 */, /*4901*/4056/* 1325 */,/*4902*/4057/* 1326 */,/*4903*/4058/* 1327 */,/*4904*/4059/* 1328 */,/*4905*/4060/* 1329 */, /*4906*/4061/* 132A */,/*4907*/4062/* 132B */,/*4908*/4063/* 132C */,/*4909*/4064/* 132D */,/*4910*/4065/* 132E */, /*4911*/4066/* 132F */,/*4912*/4067/* 1330 */,/*4913*/4068/* 1331 */,/*4914*/4069/* 1332 */,/*4915*/4070/* 1333 */, /*4916*/4071/* 1334 */,/*4917*/4072/* 1335 */,/*4918*/4073/* 1336 */,/*4919*/4074/* 1337 */,/*4920*/4075/* 1338 */, /*4921*/4076/* 1339 */,/*4922*/4077/* 133A */,/*4923*/4078/* 133B */,/*4924*/4079/* 133C */,/*4925*/4080/* 133D */, /*4926*/4081/* 133E */,/*4927*/4082/* 133F */,/*4928*/4083/* 1340 */,/*4929*/4084/* 1341 */,/*4930*/4085/* 1342 */, /*4931*/4086/* 1343 */,/*4932*/4087/* 1344 */,/*4933*/4088/* 1345 */,/*4934*/4089/* 1346 */,/*4935*/4090/* 1347 */, /*4936*/4091/* 1348 */,/*4937*/4092/* 1349 */,/*4938*/4093/* 134A */,/*4939*/4094/* 134B */,/*4940*/4095/* 134C */, /*4941*/4096/* 134D */,/*4942*/4097/* 134E */,/*4943*/4098/* 134F */,/*4944*/4099/* 1350 */,/*4945*/4100/* 1351 */, /*4946*/4101/* 1352 */,/*4947*/4102/* 1353 */,/*4948*/4103/* 1354 */,/*4949*/4104/* 1355 */,/*4950*/4105/* 1356 */, /*4951*/4106/* 1357 */,/*4952*/4107/* 1358 */,/*4953*/4108/* 1359 */,/*4954*/4109/* 135A */,0,0,/*4957*/4110/* 135D */, /*4958*/4111/* 135E */,/*4959*/4112/* 135F */,/*4960*/4113/* 1360 */,/*4961*/4114/* 1361 */,/*4962*/4115/* 1362 */, /*4963*/4116/* 1363 */,/*4964*/4117/* 1364 */,/*4965*/4118/* 1365 */,/*4966*/4119/* 1366 */,/*4967*/4120/* 1367 */, /*4968*/4121/* 1368 */,/*4969*/4122/* 1369 */,/*4970*/4123/* 136A */,/*4971*/4124/* 136B */,/*4972*/4125/* 136C */, /*4973*/4126/* 136D */,/*4974*/4127/* 136E */,/*4975*/4128/* 136F */,/*4976*/4129/* 1370 */,/*4977*/4130/* 1371 */, /*4978*/4131/* 1372 */,/*4979*/4132/* 1373 */,/*4980*/4133/* 1374 */,/*4981*/4134/* 1375 */,/*4982*/4135/* 1376 */, /*4983*/4136/* 1377 */,/*4984*/4137/* 1378 */,/*4985*/4138/* 1379 */,/*4986*/4139/* 137A */,/*4987*/4140/* 137B */, /*4988*/4141/* 137C */,0,0,0,/*4992*/4142/* 1380 */,/*4993*/4143/* 1381 */,/*4994*/4144/* 1382 */,/*4995*/4145/* 1383 */, /*4996*/4146/* 1384 */,/*4997*/4147/* 1385 */,/*4998*/4148/* 1386 */,/*4999*/4149/* 1387 */,/*5000*/4150/* 1388 */, /*5001*/4151/* 1389 */,/*5002*/4152/* 138A */,/*5003*/4153/* 138B */,/*5004*/4154/* 138C */,/*5005*/4155/* 138D */, /*5006*/4156/* 138E */,/*5007*/4157/* 138F */,/*5008*/4158/* 1390 */,/*5009*/4159/* 1391 */,/*5010*/4160/* 1392 */, /*5011*/4161/* 1393 */,/*5012*/4162/* 1394 */,/*5013*/4163/* 1395 */,/*5014*/4164/* 1396 */,/*5015*/4165/* 1397 */, /*5016*/4166/* 1398 */,/*5017*/4167/* 1399 */,0,0,0,0,0,0,/*5024*/4168/* 13A0 */,/*5025*/4169/* 13A1 */, /*5026*/4170/* 13A2 */,/*5027*/4171/* 13A3 */,/*5028*/4172/* 13A4 */,/*5029*/4173/* 13A5 */,/*5030*/4174/* 13A6 */, /*5031*/4175/* 13A7 */,/*5032*/4176/* 13A8 */,/*5033*/4177/* 13A9 */,/*5034*/4178/* 13AA */,/*5035*/4179/* 13AB */, /*5036*/4180/* 13AC */,/*5037*/4181/* 13AD */,/*5038*/4182/* 13AE */,/*5039*/4183/* 13AF */,/*5040*/4184/* 13B0 */, /*5041*/4185/* 13B1 */,/*5042*/4186/* 13B2 */,/*5043*/4187/* 13B3 */,/*5044*/4188/* 13B4 */,/*5045*/4189/* 13B5 */, /*5046*/4190/* 13B6 */,/*5047*/4191/* 13B7 */,/*5048*/4192/* 13B8 */,/*5049*/4193/* 13B9 */,/*5050*/4194/* 13BA */, /*5051*/4195/* 13BB */,/*5052*/4196/* 13BC */,/*5053*/4197/* 13BD */,/*5054*/4198/* 13BE */,/*5055*/4199/* 13BF */, /*5056*/4200/* 13C0 */,/*5057*/4201/* 13C1 */,/*5058*/4202/* 13C2 */,/*5059*/4203/* 13C3 */,/*5060*/4204/* 13C4 */, /*5061*/4205/* 13C5 */,/*5062*/4206/* 13C6 */,/*5063*/4207/* 13C7 */,/*5064*/4208/* 13C8 */,/*5065*/4209/* 13C9 */, /*5066*/4210/* 13CA */,/*5067*/4211/* 13CB */,/*5068*/4212/* 13CC */,/*5069*/4213/* 13CD */,/*5070*/4214/* 13CE */, /*5071*/4215/* 13CF */,/*5072*/4216/* 13D0 */,/*5073*/4217/* 13D1 */,/*5074*/4218/* 13D2 */,/*5075*/4219/* 13D3 */, /*5076*/4220/* 13D4 */,/*5077*/4221/* 13D5 */,/*5078*/4222/* 13D6 */,/*5079*/4223/* 13D7 */,/*5080*/4224/* 13D8 */, /*5081*/4225/* 13D9 */,/*5082*/4226/* 13DA */,/*5083*/4227/* 13DB */,/*5084*/4228/* 13DC */,/*5085*/4229/* 13DD */, /*5086*/4230/* 13DE */,/*5087*/4231/* 13DF */,/*5088*/4232/* 13E0 */,/*5089*/4233/* 13E1 */,/*5090*/4234/* 13E2 */, /*5091*/4235/* 13E3 */,/*5092*/4236/* 13E4 */,/*5093*/4237/* 13E5 */,/*5094*/4238/* 13E6 */,/*5095*/4239/* 13E7 */, /*5096*/4240/* 13E8 */,/*5097*/4241/* 13E9 */,/*5098*/4242/* 13EA */,/*5099*/4243/* 13EB */,/*5100*/4244/* 13EC */, /*5101*/4245/* 13ED */,/*5102*/4246/* 13EE */,/*5103*/4247/* 13EF */,/*5104*/4248/* 13F0 */,/*5105*/4249/* 13F1 */, /*5106*/4250/* 13F2 */,/*5107*/4251/* 13F3 */,/*5108*/4252/* 13F4 */,/*5109*/4253/* 13F5 */,0,0,/*5112*/4254/* 13F8 */, /*5113*/4255/* 13F9 */,/*5114*/4256/* 13FA */,/*5115*/4257/* 13FB */,/*5116*/4258/* 13FC */,/*5117*/4259/* 13FD */,0,0, /*5120*/4260/* 1400 */,/*5121*/4261/* 1401 */,/*5122*/4262/* 1402 */,/*5123*/4263/* 1403 */,/*5124*/4264/* 1404 */, /*5125*/4265/* 1405 */,/*5126*/4266/* 1406 */,/*5127*/4267/* 1407 */,/*5128*/4268/* 1408 */,/*5129*/4269/* 1409 */, /*5130*/4270/* 140A */,/*5131*/4271/* 140B */,/*5132*/4272/* 140C */,/*5133*/4273/* 140D */,/*5134*/4274/* 140E */, /*5135*/4275/* 140F */,/*5136*/4276/* 1410 */,/*5137*/4277/* 1411 */,/*5138*/4278/* 1412 */,/*5139*/4279/* 1413 */, /*5140*/4280/* 1414 */,/*5141*/4281/* 1415 */,/*5142*/4282/* 1416 */,/*5143*/4283/* 1417 */,/*5144*/4284/* 1418 */, /*5145*/4285/* 1419 */,/*5146*/4286/* 141A */,/*5147*/4287/* 141B */,/*5148*/4288/* 141C */,/*5149*/4289/* 141D */, /*5150*/4290/* 141E */,/*5151*/4291/* 141F */,/*5152*/4292/* 1420 */,/*5153*/4293/* 1421 */,/*5154*/4294/* 1422 */, /*5155*/4295/* 1423 */,/*5156*/4296/* 1424 */,/*5157*/4297/* 1425 */,/*5158*/4298/* 1426 */,/*5159*/4299/* 1427 */, /*5160*/4300/* 1428 */,/*5161*/4301/* 1429 */,/*5162*/4302/* 142A */,/*5163*/4303/* 142B */,/*5164*/4304/* 142C */, /*5165*/4305/* 142D */,/*5166*/4306/* 142E */,/*5167*/4307/* 142F */,/*5168*/4308/* 1430 */,/*5169*/4309/* 1431 */, /*5170*/4310/* 1432 */,/*5171*/4311/* 1433 */,/*5172*/4312/* 1434 */,/*5173*/4313/* 1435 */,/*5174*/4314/* 1436 */, /*5175*/4315/* 1437 */,/*5176*/4316/* 1438 */,/*5177*/4317/* 1439 */,/*5178*/4318/* 143A */,/*5179*/4319/* 143B */, /*5180*/4320/* 143C */,/*5181*/4321/* 143D */,/*5182*/4322/* 143E */,/*5183*/4323/* 143F */,/*5184*/4324/* 1440 */, /*5185*/4325/* 1441 */,/*5186*/4326/* 1442 */,/*5187*/4327/* 1443 */,/*5188*/4328/* 1444 */,/*5189*/4329/* 1445 */, /*5190*/4330/* 1446 */,/*5191*/4331/* 1447 */,/*5192*/4332/* 1448 */,/*5193*/4333/* 1449 */,/*5194*/4334/* 144A */, /*5195*/4335/* 144B */,/*5196*/4336/* 144C */,/*5197*/4337/* 144D */,/*5198*/4338/* 144E */,/*5199*/4339/* 144F */, /*5200*/4340/* 1450 */,/*5201*/4341/* 1451 */,/*5202*/4342/* 1452 */,/*5203*/4343/* 1453 */,/*5204*/4344/* 1454 */, /*5205*/4345/* 1455 */,/*5206*/4346/* 1456 */,/*5207*/4347/* 1457 */,/*5208*/4348/* 1458 */,/*5209*/4349/* 1459 */, /*5210*/4350/* 145A */,/*5211*/4351/* 145B */,/*5212*/4352/* 145C */,/*5213*/4353/* 145D */,/*5214*/4354/* 145E */, /*5215*/4355/* 145F */,/*5216*/4356/* 1460 */,/*5217*/4357/* 1461 */,/*5218*/4358/* 1462 */,/*5219*/4359/* 1463 */, /*5220*/4360/* 1464 */,/*5221*/4361/* 1465 */,/*5222*/4362/* 1466 */,/*5223*/4363/* 1467 */,/*5224*/4364/* 1468 */, /*5225*/4365/* 1469 */,/*5226*/4366/* 146A */,/*5227*/4367/* 146B */,/*5228*/4368/* 146C */,/*5229*/4369/* 146D */, /*5230*/4370/* 146E */,/*5231*/4371/* 146F */,/*5232*/4372/* 1470 */,/*5233*/4373/* 1471 */,/*5234*/4374/* 1472 */, /*5235*/4375/* 1473 */,/*5236*/4376/* 1474 */,/*5237*/4377/* 1475 */,/*5238*/4378/* 1476 */,/*5239*/4379/* 1477 */, /*5240*/4380/* 1478 */,/*5241*/4381/* 1479 */,/*5242*/4382/* 147A */,/*5243*/4383/* 147B */,/*5244*/4384/* 147C */, /*5245*/4385/* 147D */,/*5246*/4386/* 147E */,/*5247*/4387/* 147F */,/*5248*/4388/* 1480 */,/*5249*/4389/* 1481 */, /*5250*/4390/* 1482 */,/*5251*/4391/* 1483 */,/*5252*/4392/* 1484 */,/*5253*/4393/* 1485 */,/*5254*/4394/* 1486 */, /*5255*/4395/* 1487 */,/*5256*/4396/* 1488 */,/*5257*/4397/* 1489 */,/*5258*/4398/* 148A */,/*5259*/4399/* 148B */, /*5260*/4400/* 148C */,/*5261*/4401/* 148D */,/*5262*/4402/* 148E */,/*5263*/4403/* 148F */,/*5264*/4404/* 1490 */, /*5265*/4405/* 1491 */,/*5266*/4406/* 1492 */,/*5267*/4407/* 1493 */,/*5268*/4408/* 1494 */,/*5269*/4409/* 1495 */, /*5270*/4410/* 1496 */,/*5271*/4411/* 1497 */,/*5272*/4412/* 1498 */,/*5273*/4413/* 1499 */,/*5274*/4414/* 149A */, /*5275*/4415/* 149B */,/*5276*/4416/* 149C */,/*5277*/4417/* 149D */,/*5278*/4418/* 149E */,/*5279*/4419/* 149F */, /*5280*/4420/* 14A0 */,/*5281*/4421/* 14A1 */,/*5282*/4422/* 14A2 */,/*5283*/4423/* 14A3 */,/*5284*/4424/* 14A4 */, /*5285*/4425/* 14A5 */,/*5286*/4426/* 14A6 */,/*5287*/4427/* 14A7 */,/*5288*/4428/* 14A8 */,/*5289*/4429/* 14A9 */, /*5290*/4430/* 14AA */,/*5291*/4431/* 14AB */,/*5292*/4432/* 14AC */,/*5293*/4433/* 14AD */,/*5294*/4434/* 14AE */, /*5295*/4435/* 14AF */,/*5296*/4436/* 14B0 */,/*5297*/4437/* 14B1 */,/*5298*/4438/* 14B2 */,/*5299*/4439/* 14B3 */, /*5300*/4440/* 14B4 */,/*5301*/4441/* 14B5 */,/*5302*/4442/* 14B6 */,/*5303*/4443/* 14B7 */,/*5304*/4444/* 14B8 */, /*5305*/4445/* 14B9 */,/*5306*/4446/* 14BA */,/*5307*/4447/* 14BB */,/*5308*/4448/* 14BC */,/*5309*/4449/* 14BD */, /*5310*/4450/* 14BE */,/*5311*/4451/* 14BF */,/*5312*/4452/* 14C0 */,/*5313*/4453/* 14C1 */,/*5314*/4454/* 14C2 */, /*5315*/4455/* 14C3 */,/*5316*/4456/* 14C4 */,/*5317*/4457/* 14C5 */,/*5318*/4458/* 14C6 */,/*5319*/4459/* 14C7 */, /*5320*/4460/* 14C8 */,/*5321*/4461/* 14C9 */,/*5322*/4462/* 14CA */,/*5323*/4463/* 14CB */,/*5324*/4464/* 14CC */, /*5325*/4465/* 14CD */,/*5326*/4466/* 14CE */,/*5327*/4467/* 14CF */,/*5328*/4468/* 14D0 */,/*5329*/4469/* 14D1 */, /*5330*/4470/* 14D2 */,/*5331*/4471/* 14D3 */,/*5332*/4472/* 14D4 */,/*5333*/4473/* 14D5 */,/*5334*/4474/* 14D6 */, /*5335*/4475/* 14D7 */,/*5336*/4476/* 14D8 */,/*5337*/4477/* 14D9 */,/*5338*/4478/* 14DA */,/*5339*/4479/* 14DB */, /*5340*/4480/* 14DC */,/*5341*/4481/* 14DD */,/*5342*/4482/* 14DE */,/*5343*/4483/* 14DF */,/*5344*/4484/* 14E0 */, /*5345*/4485/* 14E1 */,/*5346*/4486/* 14E2 */,/*5347*/4487/* 14E3 */,/*5348*/4488/* 14E4 */,/*5349*/4489/* 14E5 */, /*5350*/4490/* 14E6 */,/*5351*/4491/* 14E7 */,/*5352*/4492/* 14E8 */,/*5353*/4493/* 14E9 */,/*5354*/4494/* 14EA */, /*5355*/4495/* 14EB */,/*5356*/4496/* 14EC */,/*5357*/4497/* 14ED */,/*5358*/4498/* 14EE */,/*5359*/4499/* 14EF */, /*5360*/4500/* 14F0 */,/*5361*/4501/* 14F1 */,/*5362*/4502/* 14F2 */,/*5363*/4503/* 14F3 */,/*5364*/4504/* 14F4 */, /*5365*/4505/* 14F5 */,/*5366*/4506/* 14F6 */,/*5367*/4507/* 14F7 */,/*5368*/4508/* 14F8 */,/*5369*/4509/* 14F9 */, /*5370*/4510/* 14FA */,/*5371*/4511/* 14FB */,/*5372*/4512/* 14FC */,/*5373*/4513/* 14FD */,/*5374*/4514/* 14FE */, /*5375*/4515/* 14FF */,/*5376*/4516/* 1500 */,/*5377*/4517/* 1501 */,/*5378*/4518/* 1502 */,/*5379*/4519/* 1503 */, /*5380*/4520/* 1504 */,/*5381*/4521/* 1505 */,/*5382*/4522/* 1506 */,/*5383*/4523/* 1507 */,/*5384*/4524/* 1508 */, /*5385*/4525/* 1509 */,/*5386*/4526/* 150A */,/*5387*/4527/* 150B */,/*5388*/4528/* 150C */,/*5389*/4529/* 150D */, /*5390*/4530/* 150E */,/*5391*/4531/* 150F */,/*5392*/4532/* 1510 */,/*5393*/4533/* 1511 */,/*5394*/4534/* 1512 */, /*5395*/4535/* 1513 */,/*5396*/4536/* 1514 */,/*5397*/4537/* 1515 */,/*5398*/4538/* 1516 */,/*5399*/4539/* 1517 */, /*5400*/4540/* 1518 */,/*5401*/4541/* 1519 */,/*5402*/4542/* 151A */,/*5403*/4543/* 151B */,/*5404*/4544/* 151C */, /*5405*/4545/* 151D */,/*5406*/4546/* 151E */,/*5407*/4547/* 151F */,/*5408*/4548/* 1520 */,/*5409*/4549/* 1521 */, /*5410*/4550/* 1522 */,/*5411*/4551/* 1523 */,/*5412*/4552/* 1524 */,/*5413*/4553/* 1525 */,/*5414*/4554/* 1526 */, /*5415*/4555/* 1527 */,/*5416*/4556/* 1528 */,/*5417*/4557/* 1529 */,/*5418*/4558/* 152A */,/*5419*/4559/* 152B */, /*5420*/4560/* 152C */,/*5421*/4561/* 152D */,/*5422*/4562/* 152E */,/*5423*/4563/* 152F */,/*5424*/4564/* 1530 */, /*5425*/4565/* 1531 */,/*5426*/4566/* 1532 */,/*5427*/4567/* 1533 */,/*5428*/4568/* 1534 */,/*5429*/4569/* 1535 */, /*5430*/4570/* 1536 */,/*5431*/4571/* 1537 */,/*5432*/4572/* 1538 */,/*5433*/4573/* 1539 */,/*5434*/4574/* 153A */, /*5435*/4575/* 153B */,/*5436*/4576/* 153C */,/*5437*/4577/* 153D */,/*5438*/4578/* 153E */,/*5439*/4579/* 153F */, /*5440*/4580/* 1540 */,/*5441*/4581/* 1541 */,/*5442*/4582/* 1542 */,/*5443*/4583/* 1543 */,/*5444*/4584/* 1544 */, /*5445*/4585/* 1545 */,/*5446*/4586/* 1546 */,/*5447*/4587/* 1547 */,/*5448*/4588/* 1548 */,/*5449*/4589/* 1549 */, /*5450*/4590/* 154A */,/*5451*/4591/* 154B */,/*5452*/4592/* 154C */,/*5453*/4593/* 154D */,/*5454*/4594/* 154E */, /*5455*/4595/* 154F */,/*5456*/4596/* 1550 */,/*5457*/4597/* 1551 */,/*5458*/4598/* 1552 */,/*5459*/4599/* 1553 */, /*5460*/4600/* 1554 */,/*5461*/4601/* 1555 */,/*5462*/4602/* 1556 */,/*5463*/4603/* 1557 */,/*5464*/4604/* 1558 */, /*5465*/4605/* 1559 */,/*5466*/4606/* 155A */,/*5467*/4607/* 155B */,/*5468*/4608/* 155C */,/*5469*/4609/* 155D */, /*5470*/4610/* 155E */,/*5471*/4611/* 155F */,/*5472*/4612/* 1560 */,/*5473*/4613/* 1561 */,/*5474*/4614/* 1562 */, /*5475*/4615/* 1563 */,/*5476*/4616/* 1564 */,/*5477*/4617/* 1565 */,/*5478*/4618/* 1566 */,/*5479*/4619/* 1567 */, /*5480*/4620/* 1568 */,/*5481*/4621/* 1569 */,/*5482*/4622/* 156A */,/*5483*/4623/* 156B */,/*5484*/4624/* 156C */, /*5485*/4625/* 156D */,/*5486*/4626/* 156E */,/*5487*/4627/* 156F */,/*5488*/4628/* 1570 */,/*5489*/4629/* 1571 */, /*5490*/4630/* 1572 */,/*5491*/4631/* 1573 */,/*5492*/4632/* 1574 */,/*5493*/4633/* 1575 */,/*5494*/4634/* 1576 */, /*5495*/4635/* 1577 */,/*5496*/4636/* 1578 */,/*5497*/4637/* 1579 */,/*5498*/4638/* 157A */,/*5499*/4639/* 157B */, /*5500*/4640/* 157C */,/*5501*/4641/* 157D */,/*5502*/4642/* 157E */,/*5503*/4643/* 157F */,/*5504*/4644/* 1580 */, /*5505*/4645/* 1581 */,/*5506*/4646/* 1582 */,/*5507*/4647/* 1583 */,/*5508*/4648/* 1584 */,/*5509*/4649/* 1585 */, /*5510*/4650/* 1586 */,/*5511*/4651/* 1587 */,/*5512*/4652/* 1588 */,/*5513*/4653/* 1589 */,/*5514*/4654/* 158A */, /*5515*/4655/* 158B */,/*5516*/4656/* 158C */,/*5517*/4657/* 158D */,/*5518*/4658/* 158E */,/*5519*/4659/* 158F */, /*5520*/4660/* 1590 */,/*5521*/4661/* 1591 */,/*5522*/4662/* 1592 */,/*5523*/4663/* 1593 */,/*5524*/4664/* 1594 */, /*5525*/4665/* 1595 */,/*5526*/4666/* 1596 */,/*5527*/4667/* 1597 */,/*5528*/4668/* 1598 */,/*5529*/4669/* 1599 */, /*5530*/4670/* 159A */,/*5531*/4671/* 159B */,/*5532*/4672/* 159C */,/*5533*/4673/* 159D */,/*5534*/4674/* 159E */, /*5535*/4675/* 159F */,/*5536*/4676/* 15A0 */,/*5537*/4677/* 15A1 */,/*5538*/4678/* 15A2 */,/*5539*/4679/* 15A3 */, /*5540*/4680/* 15A4 */,/*5541*/4681/* 15A5 */,/*5542*/4682/* 15A6 */,/*5543*/4683/* 15A7 */,/*5544*/4684/* 15A8 */, /*5545*/4685/* 15A9 */,/*5546*/4686/* 15AA */,/*5547*/4687/* 15AB */,/*5548*/4688/* 15AC */,/*5549*/4689/* 15AD */, /*5550*/4690/* 15AE */,/*5551*/4691/* 15AF */,/*5552*/4692/* 15B0 */,/*5553*/4693/* 15B1 */,/*5554*/4694/* 15B2 */, /*5555*/4695/* 15B3 */,/*5556*/4696/* 15B4 */,/*5557*/4697/* 15B5 */,/*5558*/4698/* 15B6 */,/*5559*/4699/* 15B7 */, /*5560*/4700/* 15B8 */,/*5561*/4701/* 15B9 */,/*5562*/4702/* 15BA */,/*5563*/4703/* 15BB */,/*5564*/4704/* 15BC */, /*5565*/4705/* 15BD */,/*5566*/4706/* 15BE */,/*5567*/4707/* 15BF */,/*5568*/4708/* 15C0 */,/*5569*/4709/* 15C1 */, /*5570*/4710/* 15C2 */,/*5571*/4711/* 15C3 */,/*5572*/4712/* 15C4 */,/*5573*/4713/* 15C5 */,/*5574*/4714/* 15C6 */, /*5575*/4715/* 15C7 */,/*5576*/4716/* 15C8 */,/*5577*/4717/* 15C9 */,/*5578*/4718/* 15CA */,/*5579*/4719/* 15CB */, /*5580*/4720/* 15CC */,/*5581*/4721/* 15CD */,/*5582*/4722/* 15CE */,/*5583*/4723/* 15CF */,/*5584*/4724/* 15D0 */, /*5585*/4725/* 15D1 */,/*5586*/4726/* 15D2 */,/*5587*/4727/* 15D3 */,/*5588*/4728/* 15D4 */,/*5589*/4729/* 15D5 */, /*5590*/4730/* 15D6 */,/*5591*/4731/* 15D7 */,/*5592*/4732/* 15D8 */,/*5593*/4733/* 15D9 */,/*5594*/4734/* 15DA */, /*5595*/4735/* 15DB */,/*5596*/4736/* 15DC */,/*5597*/4737/* 15DD */,/*5598*/4738/* 15DE */,/*5599*/4739/* 15DF */, /*5600*/4740/* 15E0 */,/*5601*/4741/* 15E1 */,/*5602*/4742/* 15E2 */,/*5603*/4743/* 15E3 */,/*5604*/4744/* 15E4 */, /*5605*/4745/* 15E5 */,/*5606*/4746/* 15E6 */,/*5607*/4747/* 15E7 */,/*5608*/4748/* 15E8 */,/*5609*/4749/* 15E9 */, /*5610*/4750/* 15EA */,/*5611*/4751/* 15EB */,/*5612*/4752/* 15EC */,/*5613*/4753/* 15ED */,/*5614*/4754/* 15EE */, /*5615*/4755/* 15EF */,/*5616*/4756/* 15F0 */,/*5617*/4757/* 15F1 */,/*5618*/4758/* 15F2 */,/*5619*/4759/* 15F3 */, /*5620*/4760/* 15F4 */,/*5621*/4761/* 15F5 */,/*5622*/4762/* 15F6 */,/*5623*/4763/* 15F7 */,/*5624*/4764/* 15F8 */, /*5625*/4765/* 15F9 */,/*5626*/4766/* 15FA */,/*5627*/4767/* 15FB */,/*5628*/4768/* 15FC */,/*5629*/4769/* 15FD */, /*5630*/4770/* 15FE */,/*5631*/4771/* 15FF */,/*5632*/4772/* 1600 */,/*5633*/4773/* 1601 */,/*5634*/4774/* 1602 */, /*5635*/4775/* 1603 */,/*5636*/4776/* 1604 */,/*5637*/4777/* 1605 */,/*5638*/4778/* 1606 */,/*5639*/4779/* 1607 */, /*5640*/4780/* 1608 */,/*5641*/4781/* 1609 */,/*5642*/4782/* 160A */,/*5643*/4783/* 160B */,/*5644*/4784/* 160C */, /*5645*/4785/* 160D */,/*5646*/4786/* 160E */,/*5647*/4787/* 160F */,/*5648*/4788/* 1610 */,/*5649*/4789/* 1611 */, /*5650*/4790/* 1612 */,/*5651*/4791/* 1613 */,/*5652*/4792/* 1614 */,/*5653*/4793/* 1615 */,/*5654*/4794/* 1616 */, /*5655*/4795/* 1617 */,/*5656*/4796/* 1618 */,/*5657*/4797/* 1619 */,/*5658*/4798/* 161A */,/*5659*/4799/* 161B */, /*5660*/4800/* 161C */,/*5661*/4801/* 161D */,/*5662*/4802/* 161E */,/*5663*/4803/* 161F */,/*5664*/4804/* 1620 */, /*5665*/4805/* 1621 */,/*5666*/4806/* 1622 */,/*5667*/4807/* 1623 */,/*5668*/4808/* 1624 */,/*5669*/4809/* 1625 */, /*5670*/4810/* 1626 */,/*5671*/4811/* 1627 */,/*5672*/4812/* 1628 */,/*5673*/4813/* 1629 */,/*5674*/4814/* 162A */, /*5675*/4815/* 162B */,/*5676*/4816/* 162C */,/*5677*/4817/* 162D */,/*5678*/4818/* 162E */,/*5679*/4819/* 162F */, /*5680*/4820/* 1630 */,/*5681*/4821/* 1631 */,/*5682*/4822/* 1632 */,/*5683*/4823/* 1633 */,/*5684*/4824/* 1634 */, /*5685*/4825/* 1635 */,/*5686*/4826/* 1636 */,/*5687*/4827/* 1637 */,/*5688*/4828/* 1638 */,/*5689*/4829/* 1639 */, /*5690*/4830/* 163A */,/*5691*/4831/* 163B */,/*5692*/4832/* 163C */,/*5693*/4833/* 163D */,/*5694*/4834/* 163E */, /*5695*/4835/* 163F */,/*5696*/4836/* 1640 */,/*5697*/4837/* 1641 */,/*5698*/4838/* 1642 */,/*5699*/4839/* 1643 */, /*5700*/4840/* 1644 */,/*5701*/4841/* 1645 */,/*5702*/4842/* 1646 */,/*5703*/4843/* 1647 */,/*5704*/4844/* 1648 */, /*5705*/4845/* 1649 */,/*5706*/4846/* 164A */,/*5707*/4847/* 164B */,/*5708*/4848/* 164C */,/*5709*/4849/* 164D */, /*5710*/4850/* 164E */,/*5711*/4851/* 164F */,/*5712*/4852/* 1650 */,/*5713*/4853/* 1651 */,/*5714*/4854/* 1652 */, /*5715*/4855/* 1653 */,/*5716*/4856/* 1654 */,/*5717*/4857/* 1655 */,/*5718*/4858/* 1656 */,/*5719*/4859/* 1657 */, /*5720*/4860/* 1658 */,/*5721*/4861/* 1659 */,/*5722*/4862/* 165A */,/*5723*/4863/* 165B */,/*5724*/4864/* 165C */, /*5725*/4865/* 165D */,/*5726*/4866/* 165E */,/*5727*/4867/* 165F */,/*5728*/4868/* 1660 */,/*5729*/4869/* 1661 */, /*5730*/4870/* 1662 */,/*5731*/4871/* 1663 */,/*5732*/4872/* 1664 */,/*5733*/4873/* 1665 */,/*5734*/4874/* 1666 */, /*5735*/4875/* 1667 */,/*5736*/4876/* 1668 */,/*5737*/4877/* 1669 */,/*5738*/4878/* 166A */,/*5739*/4879/* 166B */, /*5740*/4880/* 166C */,/*5741*/4881/* 166D */,/*5742*/4882/* 166E */,/*5743*/4883/* 166F */,/*5744*/4884/* 1670 */, /*5745*/4885/* 1671 */,/*5746*/4886/* 1672 */,/*5747*/4887/* 1673 */,/*5748*/4888/* 1674 */,/*5749*/4889/* 1675 */, /*5750*/4890/* 1676 */,/*5751*/4891/* 1677 */,/*5752*/4892/* 1678 */,/*5753*/4893/* 1679 */,/*5754*/4894/* 167A */, /*5755*/4895/* 167B */,/*5756*/4896/* 167C */,/*5757*/4897/* 167D */,/*5758*/4898/* 167E */,/*5759*/4899/* 167F */, /*5760*/4900/* 1680 */,/*5761*/4901/* 1681 */,/*5762*/4902/* 1682 */,/*5763*/4903/* 1683 */,/*5764*/4904/* 1684 */, /*5765*/4905/* 1685 */,/*5766*/4906/* 1686 */,/*5767*/4907/* 1687 */,/*5768*/4908/* 1688 */,/*5769*/4909/* 1689 */, /*5770*/4910/* 168A */,/*5771*/4911/* 168B */,/*5772*/4912/* 168C */,/*5773*/4913/* 168D */,/*5774*/4914/* 168E */, /*5775*/4915/* 168F */,/*5776*/4916/* 1690 */,/*5777*/4917/* 1691 */,/*5778*/4918/* 1692 */,/*5779*/4919/* 1693 */, /*5780*/4920/* 1694 */,/*5781*/4921/* 1695 */,/*5782*/4922/* 1696 */,/*5783*/4923/* 1697 */,/*5784*/4924/* 1698 */, /*5785*/4925/* 1699 */,/*5786*/4926/* 169A */,/*5787*/4927/* 169B */,/*5788*/4928/* 169C */,0,0,0,/*5792*/4929/* 16A0 */, /*5793*/4930/* 16A1 */,/*5794*/4931/* 16A2 */,/*5795*/4932/* 16A3 */,/*5796*/4933/* 16A4 */,/*5797*/4934/* 16A5 */, /*5798*/4935/* 16A6 */,/*5799*/4936/* 16A7 */,/*5800*/4937/* 16A8 */,/*5801*/4938/* 16A9 */,/*5802*/4939/* 16AA */, /*5803*/4940/* 16AB */,/*5804*/4941/* 16AC */,/*5805*/4942/* 16AD */,/*5806*/4943/* 16AE */,/*5807*/4944/* 16AF */, /*5808*/4945/* 16B0 */,/*5809*/4946/* 16B1 */,/*5810*/4947/* 16B2 */,/*5811*/4948/* 16B3 */,/*5812*/4949/* 16B4 */, /*5813*/4950/* 16B5 */,/*5814*/4951/* 16B6 */,/*5815*/4952/* 16B7 */,/*5816*/4953/* 16B8 */,/*5817*/4954/* 16B9 */, /*5818*/4955/* 16BA */,/*5819*/4956/* 16BB */,/*5820*/4957/* 16BC */,/*5821*/4958/* 16BD */,/*5822*/4959/* 16BE */, /*5823*/4960/* 16BF */,/*5824*/4961/* 16C0 */,/*5825*/4962/* 16C1 */,/*5826*/4963/* 16C2 */,/*5827*/4964/* 16C3 */, /*5828*/4965/* 16C4 */,/*5829*/4966/* 16C5 */,/*5830*/4967/* 16C6 */,/*5831*/4968/* 16C7 */,/*5832*/4969/* 16C8 */, /*5833*/4970/* 16C9 */,/*5834*/4971/* 16CA */,/*5835*/4972/* 16CB */,/*5836*/4973/* 16CC */,/*5837*/4974/* 16CD */, /*5838*/4975/* 16CE */,/*5839*/4976/* 16CF */,/*5840*/4977/* 16D0 */,/*5841*/4978/* 16D1 */,/*5842*/4979/* 16D2 */, /*5843*/4980/* 16D3 */,/*5844*/4981/* 16D4 */,/*5845*/4982/* 16D5 */,/*5846*/4983/* 16D6 */,/*5847*/4984/* 16D7 */, /*5848*/4985/* 16D8 */,/*5849*/4986/* 16D9 */,/*5850*/4987/* 16DA */,/*5851*/4988/* 16DB */,/*5852*/4989/* 16DC */, /*5853*/4990/* 16DD */,/*5854*/4991/* 16DE */,/*5855*/4992/* 16DF */,/*5856*/4993/* 16E0 */,/*5857*/4994/* 16E1 */, /*5858*/4995/* 16E2 */,/*5859*/4996/* 16E3 */,/*5860*/4997/* 16E4 */,/*5861*/4998/* 16E5 */,/*5862*/4999/* 16E6 */, /*5863*/5000/* 16E7 */,/*5864*/5001/* 16E8 */,/*5865*/5002/* 16E9 */,/*5866*/5003/* 16EA */,/*5867*/5004/* 16EB */, /*5868*/5005/* 16EC */,/*5869*/5006/* 16ED */,/*5870*/5007/* 16EE */,/*5871*/5008/* 16EF */,/*5872*/5009/* 16F0 */, /*5873*/5010/* 16F1 */,/*5874*/5011/* 16F2 */,/*5875*/5012/* 16F3 */,/*5876*/5013/* 16F4 */,/*5877*/5014/* 16F5 */, /*5878*/5015/* 16F6 */,/*5879*/5016/* 16F7 */,/*5880*/5017/* 16F8 */,0,0,0,0,0,0,0,/*5888*/5018/* 1700 */, /*5889*/5019/* 1701 */,/*5890*/5020/* 1702 */,/*5891*/5021/* 1703 */,/*5892*/5022/* 1704 */,/*5893*/5023/* 1705 */, /*5894*/5024/* 1706 */,/*5895*/5025/* 1707 */,/*5896*/5026/* 1708 */,/*5897*/5027/* 1709 */,/*5898*/5028/* 170A */, /*5899*/5029/* 170B */,/*5900*/5030/* 170C */,0,/*5902*/5031/* 170E */,/*5903*/5032/* 170F */,/*5904*/5033/* 1710 */, /*5905*/5034/* 1711 */,/*5906*/5035/* 1712 */,/*5907*/5036/* 1713 */,/*5908*/5037/* 1714 */,0,0,0,0,0,0,0,0,0,0,0, /*5920*/5038/* 1720 */,/*5921*/5039/* 1721 */,/*5922*/5040/* 1722 */,/*5923*/5041/* 1723 */,/*5924*/5042/* 1724 */, /*5925*/5043/* 1725 */,/*5926*/5044/* 1726 */,/*5927*/5045/* 1727 */,/*5928*/5046/* 1728 */,/*5929*/5047/* 1729 */, /*5930*/5048/* 172A */,/*5931*/5049/* 172B */,/*5932*/5050/* 172C */,/*5933*/5051/* 172D */,/*5934*/5052/* 172E */, /*5935*/5053/* 172F */,/*5936*/5054/* 1730 */,/*5937*/5055/* 1731 */,/*5938*/5056/* 1732 */,/*5939*/5057/* 1733 */, /*5940*/5058/* 1734 */,/*5941*/5059/* 1735 */,/*5942*/5060/* 1736 */,0,0,0,0,0,0,0,0,0,/*5952*/5061/* 1740 */, /*5953*/5062/* 1741 */,/*5954*/5063/* 1742 */,/*5955*/5064/* 1743 */,/*5956*/5065/* 1744 */,/*5957*/5066/* 1745 */, /*5958*/5067/* 1746 */,/*5959*/5068/* 1747 */,/*5960*/5069/* 1748 */,/*5961*/5070/* 1749 */,/*5962*/5071/* 174A */, /*5963*/5072/* 174B */,/*5964*/5073/* 174C */,/*5965*/5074/* 174D */,/*5966*/5075/* 174E */,/*5967*/5076/* 174F */, /*5968*/5077/* 1750 */,/*5969*/5078/* 1751 */,/*5970*/5079/* 1752 */,/*5971*/5080/* 1753 */,0,0,0,0,0,0,0,0,0,0,0,0, /*5984*/5081/* 1760 */,/*5985*/5082/* 1761 */,/*5986*/5083/* 1762 */,/*5987*/5084/* 1763 */,/*5988*/5085/* 1764 */, /*5989*/5086/* 1765 */,/*5990*/5087/* 1766 */,/*5991*/5088/* 1767 */,/*5992*/5089/* 1768 */,/*5993*/5090/* 1769 */, /*5994*/5091/* 176A */,/*5995*/5092/* 176B */,/*5996*/5093/* 176C */,0,/*5998*/5094/* 176E */,/*5999*/5095/* 176F */, /*6000*/5096/* 1770 */,0,/*6002*/5097/* 1772 */,/*6003*/5098/* 1773 */,0,0,0,0,0,0,0,0,0,0,0,0,/*6016*/5099/* 1780 */, /*6017*/5100/* 1781 */,/*6018*/5101/* 1782 */,/*6019*/5102/* 1783 */,/*6020*/5103/* 1784 */,/*6021*/5104/* 1785 */, /*6022*/5105/* 1786 */,/*6023*/5106/* 1787 */,/*6024*/5107/* 1788 */,/*6025*/5108/* 1789 */,/*6026*/5109/* 178A */, /*6027*/5110/* 178B */,/*6028*/5111/* 178C */,/*6029*/5112/* 178D */,/*6030*/5113/* 178E */,/*6031*/5114/* 178F */, /*6032*/5115/* 1790 */,/*6033*/5116/* 1791 */,/*6034*/5117/* 1792 */,/*6035*/5118/* 1793 */,/*6036*/5119/* 1794 */, /*6037*/5120/* 1795 */,/*6038*/5121/* 1796 */,/*6039*/5122/* 1797 */,/*6040*/5123/* 1798 */,/*6041*/5124/* 1799 */, /*6042*/5125/* 179A */,/*6043*/5126/* 179B */,/*6044*/5127/* 179C */,/*6045*/5128/* 179D */,/*6046*/5129/* 179E */, /*6047*/5130/* 179F */,/*6048*/5131/* 17A0 */,/*6049*/5132/* 17A1 */,/*6050*/5133/* 17A2 */,/*6051*/5134/* 17A3 */, /*6052*/5135/* 17A4 */,/*6053*/5136/* 17A5 */,/*6054*/5137/* 17A6 */,/*6055*/5138/* 17A7 */,/*6056*/5139/* 17A8 */, /*6057*/5140/* 17A9 */,/*6058*/5141/* 17AA */,/*6059*/5142/* 17AB */,/*6060*/5143/* 17AC */,/*6061*/5144/* 17AD */, /*6062*/5145/* 17AE */,/*6063*/5146/* 17AF */,/*6064*/5147/* 17B0 */,/*6065*/5148/* 17B1 */,/*6066*/5149/* 17B2 */, /*6067*/5150/* 17B3 */,/*6068*/5151/* 17B4 */,/*6069*/5151/* 17B5 */,/*6070*/5152/* 17B6 */,/*6071*/5153/* 17B7 */, /*6072*/5154/* 17B8 */,/*6073*/5155/* 17B9 */,/*6074*/5156/* 17BA */,/*6075*/5157/* 17BB */,/*6076*/5158/* 17BC */, /*6077*/5159/* 17BD */,/*6078*/5160/* 17BE */,/*6079*/5161/* 17BF */,/*6080*/5162/* 17C0 */,/*6081*/5163/* 17C1 */, /*6082*/5164/* 17C2 */,/*6083*/5165/* 17C3 */,/*6084*/5166/* 17C4 */,/*6085*/5167/* 17C5 */,/*6086*/5168/* 17C6 */, /*6087*/5169/* 17C7 */,/*6088*/5170/* 17C8 */,/*6089*/5171/* 17C9 */,/*6090*/5172/* 17CA */,/*6091*/5173/* 17CB */, /*6092*/5173/* 17CC */,/*6093*/5173/* 17CD */,/*6094*/5173/* 17CE */,/*6095*/5173/* 17CF */,/*6096*/5173/* 17D0 */, /*6097*/5173/* 17D1 */,/*6098*/5174/* 17D2 */,/*6099*/5175/* 17D3 */,/*6100*/5176/* 17D4 */,/*6101*/5177/* 17D5 */, /*6102*/5178/* 17D6 */,/*6103*/5179/* 17D7 */,/*6104*/5180/* 17D8 */,/*6105*/5181/* 17D9 */,/*6106*/5182/* 17DA */, /*6107*/5183/* 17DB */,/*6108*/5184/* 17DC */,/*6109*/5185/* 17DD */,0,0,/*6112*/5186/* 17E0 */,/*6113*/5187/* 17E1 */, /*6114*/5188/* 17E2 */,/*6115*/5189/* 17E3 */,/*6116*/5190/* 17E4 */,/*6117*/5191/* 17E5 */,/*6118*/5192/* 17E6 */, /*6119*/5193/* 17E7 */,/*6120*/5194/* 17E8 */,/*6121*/5195/* 17E9 */,0,0,0,0,0,0,/*6128*/5196/* 17F0 */, /*6129*/5197/* 17F1 */,/*6130*/5198/* 17F2 */,/*6131*/5199/* 17F3 */,/*6132*/5200/* 17F4 */,/*6133*/5201/* 17F5 */, /*6134*/5202/* 17F6 */,/*6135*/5203/* 17F7 */,/*6136*/5204/* 17F8 */,/*6137*/5205/* 17F9 */,0,0,0,0,0,0, /*6144*/5206/* 1800 */,/*6145*/5207/* 1801 */,/*6146*/5208/* 1802 */,/*6147*/5209/* 1803 */,/*6148*/5210/* 1804 */, /*6149*/5211/* 1805 */,/*6150*/5212/* 1806 */,/*6151*/5213/* 1807 */,/*6152*/5214/* 1808 */,/*6153*/5215/* 1809 */, /*6154*/5216/* 180A */,/*6155*/5217/* 180B */,/*6156*/5217/* 180C */,/*6157*/5217/* 180D */,/*6158*/5218/* 180E */,0, /*6160*/5219/* 1810 */,/*6161*/5220/* 1811 */,/*6162*/5221/* 1812 */,/*6163*/5222/* 1813 */,/*6164*/5223/* 1814 */, /*6165*/5224/* 1815 */,/*6166*/5225/* 1816 */,/*6167*/5226/* 1817 */,/*6168*/5227/* 1818 */,/*6169*/5228/* 1819 */,0,0,0, 0,0,0,/*6176*/5229/* 1820 */,/*6177*/5230/* 1821 */,/*6178*/5231/* 1822 */,/*6179*/5232/* 1823 */,/*6180*/5233/* 1824 */, /*6181*/5234/* 1825 */,/*6182*/5235/* 1826 */,/*6183*/5236/* 1827 */,/*6184*/5237/* 1828 */,/*6185*/5238/* 1829 */, /*6186*/5239/* 182A */,/*6187*/5240/* 182B */,/*6188*/5241/* 182C */,/*6189*/5242/* 182D */,/*6190*/5243/* 182E */, /*6191*/5244/* 182F */,/*6192*/5245/* 1830 */,/*6193*/5246/* 1831 */,/*6194*/5247/* 1832 */,/*6195*/5248/* 1833 */, /*6196*/5249/* 1834 */,/*6197*/5250/* 1835 */,/*6198*/5251/* 1836 */,/*6199*/5252/* 1837 */,/*6200*/5253/* 1838 */, /*6201*/5254/* 1839 */,/*6202*/5255/* 183A */,/*6203*/5256/* 183B */,/*6204*/5257/* 183C */,/*6205*/5258/* 183D */, /*6206*/5259/* 183E */,/*6207*/5260/* 183F */,/*6208*/5261/* 1840 */,/*6209*/5262/* 1841 */,/*6210*/5263/* 1842 */, /*6211*/5264/* 1843 */,/*6212*/5265/* 1844 */,/*6213*/5266/* 1845 */,/*6214*/5267/* 1846 */,/*6215*/5268/* 1847 */, /*6216*/5269/* 1848 */,/*6217*/5270/* 1849 */,/*6218*/5271/* 184A */,/*6219*/5272/* 184B */,/*6220*/5273/* 184C */, /*6221*/5274/* 184D */,/*6222*/5275/* 184E */,/*6223*/5276/* 184F */,/*6224*/5277/* 1850 */,/*6225*/5278/* 1851 */, /*6226*/5279/* 1852 */,/*6227*/5280/* 1853 */,/*6228*/5281/* 1854 */,/*6229*/5282/* 1855 */,/*6230*/5283/* 1856 */, /*6231*/5284/* 1857 */,/*6232*/5285/* 1858 */,/*6233*/5286/* 1859 */,/*6234*/5287/* 185A */,/*6235*/5288/* 185B */, /*6236*/5289/* 185C */,/*6237*/5290/* 185D */,/*6238*/5291/* 185E */,/*6239*/5292/* 185F */,/*6240*/5293/* 1860 */, /*6241*/5294/* 1861 */,/*6242*/5295/* 1862 */,/*6243*/5296/* 1863 */,/*6244*/5297/* 1864 */,/*6245*/5298/* 1865 */, /*6246*/5299/* 1866 */,/*6247*/5300/* 1867 */,/*6248*/5301/* 1868 */,/*6249*/5302/* 1869 */,/*6250*/5303/* 186A */, /*6251*/5304/* 186B */,/*6252*/5305/* 186C */,/*6253*/5306/* 186D */,/*6254*/5307/* 186E */,/*6255*/5308/* 186F */, /*6256*/5309/* 1870 */,/*6257*/5310/* 1871 */,/*6258*/5311/* 1872 */,/*6259*/5312/* 1873 */,/*6260*/5313/* 1874 */, /*6261*/5314/* 1875 */,/*6262*/5315/* 1876 */,/*6263*/5316/* 1877 */,0,0,0,0,0,0,0,0,/*6272*/5317/* 1880 */, /*6273*/5318/* 1881 */,/*6274*/5319/* 1882 */,/*6275*/5320/* 1883 */,/*6276*/5321/* 1884 */,/*6277*/5322/* 1885 */, /*6278*/5323/* 1886 */,/*6279*/5324/* 1887 */,/*6280*/5325/* 1888 */,/*6281*/5326/* 1889 */,/*6282*/5327/* 188A */, /*6283*/5328/* 188B */,/*6284*/5329/* 188C */,/*6285*/5330/* 188D */,/*6286*/5331/* 188E */,/*6287*/5332/* 188F */, /*6288*/5333/* 1890 */,/*6289*/5334/* 1891 */,/*6290*/5335/* 1892 */,/*6291*/5336/* 1893 */,/*6292*/5337/* 1894 */, /*6293*/5338/* 1895 */,/*6294*/5339/* 1896 */,/*6295*/5340/* 1897 */,/*6296*/5341/* 1898 */,/*6297*/5342/* 1899 */, /*6298*/5343/* 189A */,/*6299*/5344/* 189B */,/*6300*/5345/* 189C */,/*6301*/5346/* 189D */,/*6302*/5347/* 189E */, /*6303*/5348/* 189F */,/*6304*/5349/* 18A0 */,/*6305*/5350/* 18A1 */,/*6306*/5351/* 18A2 */,/*6307*/5352/* 18A3 */, /*6308*/5353/* 18A4 */,/*6309*/5354/* 18A5 */,/*6310*/5355/* 18A6 */,/*6311*/5356/* 18A7 */,/*6312*/5357/* 18A8 */, /*6313*/5358/* 18A9 */,/*6314*/5359/* 18AA */,0,0,0,0,0,/*6320*/5360/* 18B0 */,/*6321*/5361/* 18B1 */, /*6322*/5362/* 18B2 */,/*6323*/5363/* 18B3 */,/*6324*/5364/* 18B4 */,/*6325*/5365/* 18B5 */,/*6326*/5366/* 18B6 */, /*6327*/5367/* 18B7 */,/*6328*/5368/* 18B8 */,/*6329*/5369/* 18B9 */,/*6330*/5370/* 18BA */,/*6331*/5371/* 18BB */, /*6332*/5372/* 18BC */,/*6333*/5373/* 18BD */,/*6334*/5374/* 18BE */,/*6335*/5375/* 18BF */,/*6336*/5376/* 18C0 */, /*6337*/5377/* 18C1 */,/*6338*/5378/* 18C2 */,/*6339*/5379/* 18C3 */,/*6340*/5380/* 18C4 */,/*6341*/5381/* 18C5 */, /*6342*/5382/* 18C6 */,/*6343*/5383/* 18C7 */,/*6344*/5384/* 18C8 */,/*6345*/5385/* 18C9 */,/*6346*/5386/* 18CA */, /*6347*/5387/* 18CB */,/*6348*/5388/* 18CC */,/*6349*/5389/* 18CD */,/*6350*/5390/* 18CE */,/*6351*/5391/* 18CF */, /*6352*/5392/* 18D0 */,/*6353*/5393/* 18D1 */,/*6354*/5394/* 18D2 */,/*6355*/5395/* 18D3 */,/*6356*/5396/* 18D4 */, /*6357*/5397/* 18D5 */,/*6358*/5398/* 18D6 */,/*6359*/5399/* 18D7 */,/*6360*/5400/* 18D8 */,/*6361*/5401/* 18D9 */, /*6362*/5402/* 18DA */,/*6363*/5403/* 18DB */,/*6364*/5404/* 18DC */,/*6365*/5405/* 18DD */,/*6366*/5406/* 18DE */, /*6367*/5407/* 18DF */,/*6368*/5408/* 18E0 */,/*6369*/5409/* 18E1 */,/*6370*/5410/* 18E2 */,/*6371*/5411/* 18E3 */, /*6372*/5412/* 18E4 */,/*6373*/5413/* 18E5 */,/*6374*/5414/* 18E6 */,/*6375*/5415/* 18E7 */,/*6376*/5416/* 18E8 */, /*6377*/5417/* 18E9 */,/*6378*/5418/* 18EA */,/*6379*/5419/* 18EB */,/*6380*/5420/* 18EC */,/*6381*/5421/* 18ED */, /*6382*/5422/* 18EE */,/*6383*/5423/* 18EF */,/*6384*/5424/* 18F0 */,/*6385*/5425/* 18F1 */,/*6386*/5426/* 18F2 */, /*6387*/5427/* 18F3 */,/*6388*/5428/* 18F4 */,/*6389*/5429/* 18F5 */,0,0,0,0,0,0,0,0,0,0,/*6400*/5430/* 1900 */, /*6401*/5431/* 1901 */,/*6402*/5432/* 1902 */,/*6403*/5433/* 1903 */,/*6404*/5434/* 1904 */,/*6405*/5435/* 1905 */, /*6406*/5436/* 1906 */,/*6407*/5437/* 1907 */,/*6408*/5438/* 1908 */,/*6409*/5439/* 1909 */,/*6410*/5440/* 190A */, /*6411*/5441/* 190B */,/*6412*/5442/* 190C */,/*6413*/5443/* 190D */,/*6414*/5444/* 190E */,/*6415*/5445/* 190F */, /*6416*/5446/* 1910 */,/*6417*/5447/* 1911 */,/*6418*/5448/* 1912 */,/*6419*/5449/* 1913 */,/*6420*/5450/* 1914 */, /*6421*/5451/* 1915 */,/*6422*/5452/* 1916 */,/*6423*/5453/* 1917 */,/*6424*/5454/* 1918 */,/*6425*/5455/* 1919 */, /*6426*/5456/* 191A */,/*6427*/5457/* 191B */,/*6428*/5458/* 191C */,/*6429*/5459/* 191D */,/*6430*/5460/* 191E */,0, /*6432*/5461/* 1920 */,/*6433*/5462/* 1921 */,/*6434*/5463/* 1922 */,/*6435*/5464/* 1923 */,/*6436*/5465/* 1924 */, /*6437*/5466/* 1925 */,/*6438*/5467/* 1926 */,/*6439*/5468/* 1927 */,/*6440*/5469/* 1928 */,/*6441*/5470/* 1929 */, /*6442*/5471/* 192A */,/*6443*/5472/* 192B */,0,0,0,0,/*6448*/5473/* 1930 */,/*6449*/5474/* 1931 */, /*6450*/5475/* 1932 */,/*6451*/5476/* 1933 */,/*6452*/5477/* 1934 */,/*6453*/5478/* 1935 */,/*6454*/5479/* 1936 */, /*6455*/5480/* 1937 */,/*6456*/5481/* 1938 */,/*6457*/5482/* 1939 */,/*6458*/5483/* 193A */,/*6459*/5484/* 193B */,0,0,0, 0,/*6464*/5485/* 1940 */,0,0,0,/*6468*/5486/* 1944 */,/*6469*/5487/* 1945 */,/*6470*/5488/* 1946 */, /*6471*/5489/* 1947 */,/*6472*/5490/* 1948 */,/*6473*/5491/* 1949 */,/*6474*/5492/* 194A */,/*6475*/5493/* 194B */, /*6476*/5494/* 194C */,/*6477*/5495/* 194D */,/*6478*/5496/* 194E */,/*6479*/5497/* 194F */,/*6480*/5498/* 1950 */, /*6481*/5499/* 1951 */,/*6482*/5500/* 1952 */,/*6483*/5501/* 1953 */,/*6484*/5502/* 1954 */,/*6485*/5503/* 1955 */, /*6486*/5504/* 1956 */,/*6487*/5505/* 1957 */,/*6488*/5506/* 1958 */,/*6489*/5507/* 1959 */,/*6490*/5508/* 195A */, /*6491*/5509/* 195B */,/*6492*/5510/* 195C */,/*6493*/5511/* 195D */,/*6494*/5512/* 195E */,/*6495*/5513/* 195F */, /*6496*/5514/* 1960 */,/*6497*/5515/* 1961 */,/*6498*/5516/* 1962 */,/*6499*/5517/* 1963 */,/*6500*/5518/* 1964 */, /*6501*/5519/* 1965 */,/*6502*/5520/* 1966 */,/*6503*/5521/* 1967 */,/*6504*/5522/* 1968 */,/*6505*/5523/* 1969 */, /*6506*/5524/* 196A */,/*6507*/5525/* 196B */,/*6508*/5526/* 196C */,/*6509*/5527/* 196D */,0,0,/*6512*/5528/* 1970 */, /*6513*/5529/* 1971 */,/*6514*/5530/* 1972 */,/*6515*/5531/* 1973 */,/*6516*/5532/* 1974 */,0,0,0,0,0,0,0,0,0,0,0, /*6528*/5533/* 1980 */,/*6529*/5534/* 1981 */,/*6530*/5535/* 1982 */,/*6531*/5536/* 1983 */,/*6532*/5537/* 1984 */, /*6533*/5538/* 1985 */,/*6534*/5539/* 1986 */,/*6535*/5540/* 1987 */,/*6536*/5541/* 1988 */,/*6537*/5542/* 1989 */, /*6538*/5543/* 198A */,/*6539*/5544/* 198B */,/*6540*/5545/* 198C */,/*6541*/5546/* 198D */,/*6542*/5547/* 198E */, /*6543*/5548/* 198F */,/*6544*/5549/* 1990 */,/*6545*/5550/* 1991 */,/*6546*/5551/* 1992 */,/*6547*/5552/* 1993 */, /*6548*/5553/* 1994 */,/*6549*/5554/* 1995 */,/*6550*/5555/* 1996 */,/*6551*/5556/* 1997 */,/*6552*/5557/* 1998 */, /*6553*/5558/* 1999 */,/*6554*/5559/* 199A */,/*6555*/5560/* 199B */,/*6556*/5561/* 199C */,/*6557*/5562/* 199D */, /*6558*/5563/* 199E */,/*6559*/5564/* 199F */,/*6560*/5565/* 19A0 */,/*6561*/5566/* 19A1 */,/*6562*/5567/* 19A2 */, /*6563*/5568/* 19A3 */,/*6564*/5569/* 19A4 */,/*6565*/5570/* 19A5 */,/*6566*/5571/* 19A6 */,/*6567*/5572/* 19A7 */, /*6568*/5573/* 19A8 */,/*6569*/5574/* 19A9 */,/*6570*/5575/* 19AA */,/*6571*/5576/* 19AB */,0,0,0,0, /*6576*/5577/* 19B0 */,/*6577*/5578/* 19B1 */,/*6578*/5579/* 19B2 */,/*6579*/5580/* 19B3 */,/*6580*/5581/* 19B4 */, /*6581*/5582/* 19B5 */,/*6582*/5583/* 19B6 */,/*6583*/5584/* 19B7 */,/*6584*/5585/* 19B8 */,/*6585*/5586/* 19B9 */, /*6586*/5587/* 19BA */,/*6587*/5588/* 19BB */,/*6588*/5589/* 19BC */,/*6589*/5590/* 19BD */,/*6590*/5591/* 19BE */, /*6591*/5592/* 19BF */,/*6592*/5593/* 19C0 */,/*6593*/5594/* 19C1 */,/*6594*/5595/* 19C2 */,/*6595*/5596/* 19C3 */, /*6596*/5597/* 19C4 */,/*6597*/5598/* 19C5 */,/*6598*/5599/* 19C6 */,/*6599*/5600/* 19C7 */,/*6600*/5601/* 19C8 */, /*6601*/5602/* 19C9 */,0,0,0,0,0,0,/*6608*/5603/* 19D0 */,/*6609*/5604/* 19D1 */,/*6610*/5605/* 19D2 */, /*6611*/5606/* 19D3 */,/*6612*/5607/* 19D4 */,/*6613*/5608/* 19D5 */,/*6614*/5609/* 19D6 */,/*6615*/5610/* 19D7 */, /*6616*/5611/* 19D8 */,/*6617*/5612/* 19D9 */,/*6618*/5613/* 19DA */,0,0,0,/*6622*/5614/* 19DE */,/*6623*/5615/* 19DF */, /*6624*/5616/* 19E0 */,/*6625*/5617/* 19E1 */,/*6626*/5618/* 19E2 */,/*6627*/5619/* 19E3 */,/*6628*/5620/* 19E4 */, /*6629*/5621/* 19E5 */,/*6630*/5622/* 19E6 */,/*6631*/5623/* 19E7 */,/*6632*/5624/* 19E8 */,/*6633*/5625/* 19E9 */, /*6634*/5626/* 19EA */,/*6635*/5627/* 19EB */,/*6636*/5628/* 19EC */,/*6637*/5629/* 19ED */,/*6638*/5630/* 19EE */, /*6639*/5631/* 19EF */,/*6640*/5632/* 19F0 */,/*6641*/5633/* 19F1 */,/*6642*/5634/* 19F2 */,/*6643*/5635/* 19F3 */, /*6644*/5636/* 19F4 */,/*6645*/5637/* 19F5 */,/*6646*/5638/* 19F6 */,/*6647*/5639/* 19F7 */,/*6648*/5640/* 19F8 */, /*6649*/5641/* 19F9 */,/*6650*/5642/* 19FA */,/*6651*/5643/* 19FB */,/*6652*/5644/* 19FC */,/*6653*/5645/* 19FD */, /*6654*/5646/* 19FE */,/*6655*/5647/* 19FF */,/*6656*/5648/* 1A00 */,/*6657*/5649/* 1A01 */,/*6658*/5650/* 1A02 */, /*6659*/5651/* 1A03 */,/*6660*/5652/* 1A04 */,/*6661*/5653/* 1A05 */,/*6662*/5654/* 1A06 */,/*6663*/5655/* 1A07 */, /*6664*/5656/* 1A08 */,/*6665*/5657/* 1A09 */,/*6666*/5658/* 1A0A */,/*6667*/5659/* 1A0B */,/*6668*/5660/* 1A0C */, /*6669*/5661/* 1A0D */,/*6670*/5662/* 1A0E */,/*6671*/5663/* 1A0F */,/*6672*/5664/* 1A10 */,/*6673*/5665/* 1A11 */, /*6674*/5666/* 1A12 */,/*6675*/5667/* 1A13 */,/*6676*/5668/* 1A14 */,/*6677*/5669/* 1A15 */,/*6678*/5670/* 1A16 */, /*6679*/5671/* 1A17 */,/*6680*/5672/* 1A18 */,/*6681*/5673/* 1A19 */,/*6682*/5674/* 1A1A */,/*6683*/5675/* 1A1B */,0,0, /*6686*/5676/* 1A1E */,/*6687*/5677/* 1A1F */,/*6688*/5678/* 1A20 */,/*6689*/5679/* 1A21 */,/*6690*/5680/* 1A22 */, /*6691*/5681/* 1A23 */,/*6692*/5682/* 1A24 */,/*6693*/5683/* 1A25 */,/*6694*/5684/* 1A26 */,/*6695*/5685/* 1A27 */, /*6696*/5686/* 1A28 */,/*6697*/5687/* 1A29 */,/*6698*/5688/* 1A2A */,/*6699*/5689/* 1A2B */,/*6700*/5690/* 1A2C */, /*6701*/5691/* 1A2D */,/*6702*/5692/* 1A2E */,/*6703*/5693/* 1A2F */,/*6704*/5694/* 1A30 */,/*6705*/5695/* 1A31 */, /*6706*/5696/* 1A32 */,/*6707*/5697/* 1A33 */,/*6708*/5698/* 1A34 */,/*6709*/5699/* 1A35 */,/*6710*/5700/* 1A36 */, /*6711*/5701/* 1A37 */,/*6712*/5702/* 1A38 */,/*6713*/5703/* 1A39 */,/*6714*/5704/* 1A3A */,/*6715*/5705/* 1A3B */, /*6716*/5706/* 1A3C */,/*6717*/5707/* 1A3D */,/*6718*/5708/* 1A3E */,/*6719*/5709/* 1A3F */,/*6720*/5710/* 1A40 */, /*6721*/5711/* 1A41 */,/*6722*/5712/* 1A42 */,/*6723*/5713/* 1A43 */,/*6724*/5714/* 1A44 */,/*6725*/5715/* 1A45 */, /*6726*/5716/* 1A46 */,/*6727*/5717/* 1A47 */,/*6728*/5718/* 1A48 */,/*6729*/5719/* 1A49 */,/*6730*/5720/* 1A4A */, /*6731*/5721/* 1A4B */,/*6732*/5722/* 1A4C */,/*6733*/5723/* 1A4D */,/*6734*/5724/* 1A4E */,/*6735*/5725/* 1A4F */, /*6736*/5726/* 1A50 */,/*6737*/5727/* 1A51 */,/*6738*/5728/* 1A52 */,/*6739*/5729/* 1A53 */,/*6740*/5730/* 1A54 */, /*6741*/5731/* 1A55 */,/*6742*/5732/* 1A56 */,/*6743*/5733/* 1A57 */,/*6744*/5734/* 1A58 */,/*6745*/5734/* 1A59 */, /*6746*/5735/* 1A5A */,/*6747*/5735/* 1A5B */,/*6748*/5736/* 1A5C */,/*6749*/5737/* 1A5D */,/*6750*/5738/* 1A5E */,0, /*6752*/5739/* 1A60 */,/*6753*/5740/* 1A61 */,/*6754*/5741/* 1A62 */,/*6755*/5742/* 1A63 */,/*6756*/5743/* 1A64 */, /*6757*/5744/* 1A65 */,/*6758*/5745/* 1A66 */,/*6759*/5746/* 1A67 */,/*6760*/5747/* 1A68 */,/*6761*/5748/* 1A69 */, /*6762*/5749/* 1A6A */,/*6763*/5750/* 1A6B */,/*6764*/5751/* 1A6C */,/*6765*/5752/* 1A6D */,/*6766*/5753/* 1A6E */, /*6767*/5754/* 1A6F */,/*6768*/5755/* 1A70 */,/*6769*/5756/* 1A71 */,/*6770*/5757/* 1A72 */,/*6771*/5758/* 1A73 */, /*6772*/5759/* 1A74 */,/*6773*/5760/* 1A75 */,/*6774*/5761/* 1A76 */,/*6775*/5762/* 1A77 */,/*6776*/5763/* 1A78 */, /*6777*/5764/* 1A79 */,/*6778*/5765/* 1A7A */,/*6779*/5766/* 1A7B */,/*6780*/5767/* 1A7C */,0,0,/*6783*/5768/* 1A7F */, /*6784*/5769/* 1A80 */,/*6785*/5770/* 1A81 */,/*6786*/5771/* 1A82 */,/*6787*/5772/* 1A83 */,/*6788*/5773/* 1A84 */, /*6789*/5774/* 1A85 */,/*6790*/5775/* 1A86 */,/*6791*/5776/* 1A87 */,/*6792*/5777/* 1A88 */,/*6793*/5778/* 1A89 */,0,0,0, 0,0,0,/*6800*/5769/* 1A90 */,/*6801*/5770/* 1A91 */,/*6802*/5771/* 1A92 */,/*6803*/5772/* 1A93 */,/*6804*/5773/* 1A94 */, /*6805*/5774/* 1A95 */,/*6806*/5775/* 1A96 */,/*6807*/5776/* 1A97 */,/*6808*/5777/* 1A98 */,/*6809*/5778/* 1A99 */,0,0,0, 0,0,0,/*6816*/5779/* 1AA0 */,/*6817*/5780/* 1AA1 */,/*6818*/5781/* 1AA2 */,/*6819*/5782/* 1AA3 */,/*6820*/5783/* 1AA4 */, /*6821*/5784/* 1AA5 */,/*6822*/5785/* 1AA6 */,/*6823*/5786/* 1AA7 */,/*6824*/5787/* 1AA8 */,/*6825*/5788/* 1AA9 */, /*6826*/5789/* 1AAA */,/*6827*/5790/* 1AAB */,/*6828*/5791/* 1AAC */,/*6829*/5792/* 1AAD */,0,0,/*6832*/5793/* 1AB0 */, /*6833*/5793/* 1AB1 */,/*6834*/5793/* 1AB2 */,/*6835*/5793/* 1AB3 */,/*6836*/5793/* 1AB4 */,/*6837*/5794/* 1AB5 */, /*6838*/5794/* 1AB6 */,/*6839*/5794/* 1AB7 */,/*6840*/5794/* 1AB8 */,/*6841*/5794/* 1AB9 */,/*6842*/5794/* 1ABA */, /*6843*/5793/* 1ABB */,/*6844*/5793/* 1ABC */,/*6845*/5794/* 1ABD */,/*6846*/5795/* 1ABE */,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*6912*/5796/* 1B00 */,/*6913*/5796/* 1B01 */,/*6914*/5797/* 1B02 */,/*6915*/5798/* 1B03 */,/*6916*/5799/* 1B04 */, /*6917*/5800/* 1B05 */,/*6918*/5801/* 1B06 */,/*6919*/5802/* 1B07 */,/*6920*/5803/* 1B08 */,/*6921*/5804/* 1B09 */, /*6922*/5805/* 1B0A */,/*6923*/5806/* 1B0B */,/*6924*/5807/* 1B0C */,/*6925*/5808/* 1B0D */,/*6926*/5809/* 1B0E */, /*6927*/5810/* 1B0F */,/*6928*/5811/* 1B10 */,/*6929*/5812/* 1B11 */,/*6930*/5813/* 1B12 */,/*6931*/5814/* 1B13 */, /*6932*/5815/* 1B14 */,/*6933*/5816/* 1B15 */,/*6934*/5817/* 1B16 */,/*6935*/5818/* 1B17 */,/*6936*/5819/* 1B18 */, /*6937*/5820/* 1B19 */,/*6938*/5821/* 1B1A */,/*6939*/5822/* 1B1B */,/*6940*/5823/* 1B1C */,/*6941*/5824/* 1B1D */, /*6942*/5825/* 1B1E */,/*6943*/5826/* 1B1F */,/*6944*/5827/* 1B20 */,/*6945*/5828/* 1B21 */,/*6946*/5829/* 1B22 */, /*6947*/5830/* 1B23 */,/*6948*/5831/* 1B24 */,/*6949*/5832/* 1B25 */,/*6950*/5833/* 1B26 */,/*6951*/5834/* 1B27 */, /*6952*/5835/* 1B28 */,/*6953*/5836/* 1B29 */,/*6954*/5837/* 1B2A */,/*6955*/5838/* 1B2B */,/*6956*/5839/* 1B2C */, /*6957*/5840/* 1B2D */,/*6958*/5841/* 1B2E */,/*6959*/5842/* 1B2F */,/*6960*/5843/* 1B30 */,/*6961*/5844/* 1B31 */, /*6962*/5845/* 1B32 */,/*6963*/5846/* 1B33 */,/*6964*/5847/* 1B34 */,/*6965*/5848/* 1B35 */,/*6966*/5849/* 1B36 */, /*6967*/5850/* 1B37 */,/*6968*/5851/* 1B38 */,/*6969*/5852/* 1B39 */,/*6970*/5853/* 1B3A */,/*6971*/5854/* 1B3B */, /*6972*/5855/* 1B3C */,/*6973*/5856/* 1B3D */,/*6974*/5857/* 1B3E */,/*6975*/5858/* 1B3F */,/*6976*/5859/* 1B40 */, /*6977*/5860/* 1B41 */,/*6978*/5861/* 1B42 */,/*6979*/5862/* 1B43 */,/*6980*/5863/* 1B44 */,/*6981*/5864/* 1B45 */, /*6982*/5865/* 1B46 */,/*6983*/5866/* 1B47 */,/*6984*/5867/* 1B48 */,/*6985*/5868/* 1B49 */,/*6986*/5869/* 1B4A */, /*6987*/5870/* 1B4B */,0,0,0,0,/*6992*/5871/* 1B50 */,/*6993*/5872/* 1B51 */,/*6994*/5873/* 1B52 */, /*6995*/5874/* 1B53 */,/*6996*/5875/* 1B54 */,/*6997*/5876/* 1B55 */,/*6998*/5877/* 1B56 */,/*6999*/5878/* 1B57 */, /*7000*/5879/* 1B58 */,/*7001*/5880/* 1B59 */,/*7002*/5881/* 1B5A */,/*7003*/5882/* 1B5B */,/*7004*/5883/* 1B5C */, /*7005*/5884/* 1B5D */,/*7006*/5885/* 1B5E */,/*7007*/5886/* 1B5F */,/*7008*/5887/* 1B60 */,/*7009*/5888/* 1B61 */, /*7010*/5889/* 1B62 */,/*7011*/5890/* 1B63 */,/*7012*/5891/* 1B64 */,/*7013*/5892/* 1B65 */,/*7014*/5893/* 1B66 */, /*7015*/5894/* 1B67 */,/*7016*/5895/* 1B68 */,/*7017*/5896/* 1B69 */,/*7018*/5897/* 1B6A */,/*7019*/5898/* 1B6B */, /*7020*/5899/* 1B6C */,/*7021*/5898/* 1B6D */,/*7022*/5898/* 1B6E */,/*7023*/5898/* 1B6F */,/*7024*/5898/* 1B70 */, /*7025*/5898/* 1B71 */,/*7026*/5898/* 1B72 */,/*7027*/5898/* 1B73 */,/*7028*/5900/* 1B74 */,/*7029*/5901/* 1B75 */, /*7030*/5902/* 1B76 */,/*7031*/5903/* 1B77 */,/*7032*/5904/* 1B78 */,/*7033*/5905/* 1B79 */,/*7034*/5906/* 1B7A */, /*7035*/5907/* 1B7B */,/*7036*/5908/* 1B7C */,0,0,0,/*7040*/5909/* 1B80 */,/*7041*/5910/* 1B81 */,/*7042*/5911/* 1B82 */, /*7043*/5912/* 1B83 */,/*7044*/5913/* 1B84 */,/*7045*/5914/* 1B85 */,/*7046*/5915/* 1B86 */,/*7047*/5916/* 1B87 */, /*7048*/5917/* 1B88 */,/*7049*/5918/* 1B89 */,/*7050*/5919/* 1B8A */,/*7051*/5920/* 1B8B */,/*7052*/5921/* 1B8C */, /*7053*/5922/* 1B8D */,/*7054*/5923/* 1B8E */,/*7055*/5924/* 1B8F */,/*7056*/5925/* 1B90 */,/*7057*/5926/* 1B91 */, /*7058*/5927/* 1B92 */,/*7059*/5928/* 1B93 */,/*7060*/5929/* 1B94 */,/*7061*/5930/* 1B95 */,/*7062*/5931/* 1B96 */, /*7063*/5932/* 1B97 */,/*7064*/5933/* 1B98 */,/*7065*/5934/* 1B99 */,/*7066*/5935/* 1B9A */,/*7067*/5936/* 1B9B */, /*7068*/5937/* 1B9C */,/*7069*/5938/* 1B9D */,/*7070*/5939/* 1B9E */,/*7071*/5940/* 1B9F */,/*7072*/5941/* 1BA0 */, /*7073*/5942/* 1BA1 */,/*7074*/5943/* 1BA2 */,/*7075*/5944/* 1BA3 */,/*7076*/5945/* 1BA4 */,/*7077*/5946/* 1BA5 */, /*7078*/5947/* 1BA6 */,/*7079*/5948/* 1BA7 */,/*7080*/5949/* 1BA8 */,/*7081*/5950/* 1BA9 */,/*7082*/5951/* 1BAA */, /*7083*/5952/* 1BAB */,/*7084*/5953/* 1BAC */,/*7085*/5954/* 1BAD */,/*7086*/5955/* 1BAE */,/*7087*/5956/* 1BAF */, /*7088*/5957/* 1BB0 */,/*7089*/5958/* 1BB1 */,/*7090*/5959/* 1BB2 */,/*7091*/5960/* 1BB3 */,/*7092*/5961/* 1BB4 */, /*7093*/5962/* 1BB5 */,/*7094*/5963/* 1BB6 */,/*7095*/5964/* 1BB7 */,/*7096*/5965/* 1BB8 */,/*7097*/5966/* 1BB9 */, /*7098*/5967/* 1BBA */,/*7099*/5968/* 1BBB */,/*7100*/5969/* 1BBC */,/*7101*/5970/* 1BBD */,/*7102*/5971/* 1BBE */, /*7103*/5972/* 1BBF */,/*7104*/5973/* 1BC0 */,/*7105*/5974/* 1BC1 */,/*7106*/5975/* 1BC2 */,/*7107*/5976/* 1BC3 */, /*7108*/5976/* 1BC4 */,/*7109*/5977/* 1BC5 */,/*7110*/5978/* 1BC6 */,/*7111*/5979/* 1BC7 */,/*7112*/5980/* 1BC8 */, /*7113*/5981/* 1BC9 */,/*7114*/5982/* 1BCA */,/*7115*/5983/* 1BCB */,/*7116*/5984/* 1BCC */,/*7117*/5984/* 1BCD */, /*7118*/5985/* 1BCE */,/*7119*/5986/* 1BCF */,/*7120*/5987/* 1BD0 */,/*7121*/5988/* 1BD1 */,/*7122*/5989/* 1BD2 */, /*7123*/5990/* 1BD3 */,/*7124*/5991/* 1BD4 */,/*7125*/5992/* 1BD5 */,/*7126*/5993/* 1BD6 */,/*7127*/5994/* 1BD7 */, /*7128*/5995/* 1BD8 */,/*7129*/5996/* 1BD9 */,/*7130*/5996/* 1BDA */,/*7131*/5997/* 1BDB */,/*7132*/5998/* 1BDC */, /*7133*/5999/* 1BDD */,/*7134*/6000/* 1BDE */,/*7135*/6001/* 1BDF */,/*7136*/6002/* 1BE0 */,/*7137*/6003/* 1BE1 */, /*7138*/6004/* 1BE2 */,/*7139*/6005/* 1BE3 */,/*7140*/6006/* 1BE4 */,/*7141*/6007/* 1BE5 */,/*7142*/6008/* 1BE6 */, /*7143*/6009/* 1BE7 */,/*7144*/6010/* 1BE8 */,/*7145*/6011/* 1BE9 */,/*7146*/6012/* 1BEA */,/*7147*/6013/* 1BEB */, /*7148*/6014/* 1BEC */,/*7149*/6015/* 1BED */,/*7150*/6016/* 1BEE */,/*7151*/6017/* 1BEF */,/*7152*/6018/* 1BF0 */, /*7153*/6019/* 1BF1 */,/*7154*/6020/* 1BF2 */,/*7155*/6021/* 1BF3 */,0,0,0,0,0,0,0,0,/*7164*/6022/* 1BFC */, /*7165*/6023/* 1BFD */,/*7166*/6024/* 1BFE */,/*7167*/6025/* 1BFF */,/*7168*/6026/* 1C00 */,/*7169*/6027/* 1C01 */, /*7170*/6028/* 1C02 */,/*7171*/6029/* 1C03 */,/*7172*/6030/* 1C04 */,/*7173*/6031/* 1C05 */,/*7174*/6032/* 1C06 */, /*7175*/6033/* 1C07 */,/*7176*/6034/* 1C08 */,/*7177*/6035/* 1C09 */,/*7178*/6036/* 1C0A */,/*7179*/6037/* 1C0B */, /*7180*/6038/* 1C0C */,/*7181*/6039/* 1C0D */,/*7182*/6040/* 1C0E */,/*7183*/6041/* 1C0F */,/*7184*/6042/* 1C10 */, /*7185*/6043/* 1C11 */,/*7186*/6044/* 1C12 */,/*7187*/6045/* 1C13 */,/*7188*/6046/* 1C14 */,/*7189*/6047/* 1C15 */, /*7190*/6048/* 1C16 */,/*7191*/6049/* 1C17 */,/*7192*/6050/* 1C18 */,/*7193*/6051/* 1C19 */,/*7194*/6052/* 1C1A */, /*7195*/6053/* 1C1B */,/*7196*/6054/* 1C1C */,/*7197*/6055/* 1C1D */,/*7198*/6056/* 1C1E */,/*7199*/6057/* 1C1F */, /*7200*/6058/* 1C20 */,/*7201*/6059/* 1C21 */,/*7202*/6060/* 1C22 */,/*7203*/6061/* 1C23 */,/*7204*/6062/* 1C24 */, /*7205*/6063/* 1C25 */,/*7206*/6064/* 1C26 */,/*7207*/6065/* 1C27 */,/*7208*/6066/* 1C28 */,/*7209*/6067/* 1C29 */, /*7210*/6068/* 1C2A */,/*7211*/6069/* 1C2B */,/*7212*/6070/* 1C2C */,/*7213*/6071/* 1C2D */,/*7214*/6072/* 1C2E */, /*7215*/6073/* 1C2F */,/*7216*/6074/* 1C30 */,/*7217*/6075/* 1C31 */,/*7218*/6076/* 1C32 */,/*7219*/6077/* 1C33 */, /*7220*/6078/* 1C34 */,/*7221*/6079/* 1C35 */,/*7222*/6080/* 1C36 */,/*7223*/6081/* 1C37 */,0,0,0,/*7227*/6082/* 1C3B */, /*7228*/6083/* 1C3C */,/*7229*/6084/* 1C3D */,/*7230*/6085/* 1C3E */,/*7231*/6086/* 1C3F */,/*7232*/6087/* 1C40 */, /*7233*/6088/* 1C41 */,/*7234*/6089/* 1C42 */,/*7235*/6090/* 1C43 */,/*7236*/6091/* 1C44 */,/*7237*/6092/* 1C45 */, /*7238*/6093/* 1C46 */,/*7239*/6094/* 1C47 */,/*7240*/6095/* 1C48 */,/*7241*/6096/* 1C49 */,0,0,0,/*7245*/6097/* 1C4D */, /*7246*/6098/* 1C4E */,/*7247*/6099/* 1C4F */,/*7248*/6100/* 1C50 */,/*7249*/6101/* 1C51 */,/*7250*/6102/* 1C52 */, /*7251*/6103/* 1C53 */,/*7252*/6104/* 1C54 */,/*7253*/6105/* 1C55 */,/*7254*/6106/* 1C56 */,/*7255*/6107/* 1C57 */, /*7256*/6108/* 1C58 */,/*7257*/6109/* 1C59 */,/*7258*/6110/* 1C5A */,/*7259*/6111/* 1C5B */,/*7260*/6112/* 1C5C */, /*7261*/6113/* 1C5D */,/*7262*/6114/* 1C5E */,/*7263*/6115/* 1C5F */,/*7264*/6116/* 1C60 */,/*7265*/6117/* 1C61 */, /*7266*/6118/* 1C62 */,/*7267*/6119/* 1C63 */,/*7268*/6120/* 1C64 */,/*7269*/6121/* 1C65 */,/*7270*/6122/* 1C66 */, /*7271*/6123/* 1C67 */,/*7272*/6124/* 1C68 */,/*7273*/6125/* 1C69 */,/*7274*/6126/* 1C6A */,/*7275*/6127/* 1C6B */, /*7276*/6128/* 1C6C */,/*7277*/6129/* 1C6D */,/*7278*/6130/* 1C6E */,/*7279*/6131/* 1C6F */,/*7280*/6132/* 1C70 */, /*7281*/6133/* 1C71 */,/*7282*/6134/* 1C72 */,/*7283*/6135/* 1C73 */,/*7284*/6136/* 1C74 */,/*7285*/6137/* 1C75 */, /*7286*/6138/* 1C76 */,/*7287*/6139/* 1C77 */,/*7288*/6140/* 1C78 */,/*7289*/6141/* 1C79 */,/*7290*/6142/* 1C7A */, /*7291*/6143/* 1C7B */,/*7292*/6144/* 1C7C */,/*7293*/6145/* 1C7D */,/*7294*/6146/* 1C7E */,/*7295*/6147/* 1C7F */, /*7296*/6148/* 1C80 */,/*7297*/6149/* 1C81 */,/*7298*/6150/* 1C82 */,/*7299*/6151/* 1C83 */,/*7300*/6152/* 1C84 */, /*7301*/6153/* 1C85 */,/*7302*/6154/* 1C86 */,/*7303*/6155/* 1C87 */,/*7304*/6156/* 1C88 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*7360*/6157/* 1CC0 */, /*7361*/6158/* 1CC1 */,/*7362*/6159/* 1CC2 */,/*7363*/6160/* 1CC3 */,/*7364*/6161/* 1CC4 */,/*7365*/6162/* 1CC5 */, /*7366*/6163/* 1CC6 */,/*7367*/6164/* 1CC7 */,0,0,0,0,0,0,0,0,/*7376*/6165/* 1CD0 */,/*7377*/6165/* 1CD1 */, /*7378*/6165/* 1CD2 */,/*7379*/6166/* 1CD3 */,/*7380*/6167/* 1CD4 */,/*7381*/6168/* 1CD5 */,/*7382*/6168/* 1CD6 */, /*7383*/6168/* 1CD7 */,/*7384*/6168/* 1CD8 */,/*7385*/6168/* 1CD9 */,/*7386*/6165/* 1CDA */,/*7387*/6165/* 1CDB */, /*7388*/6168/* 1CDC */,/*7389*/6168/* 1CDD */,/*7390*/6168/* 1CDE */,/*7391*/6168/* 1CDF */,/*7392*/6165/* 1CE0 */, /*7393*/6169/* 1CE1 */,/*7394*/6167/* 1CE2 */,/*7395*/6167/* 1CE3 */,/*7396*/6167/* 1CE4 */,/*7397*/6167/* 1CE5 */, /*7398*/6167/* 1CE6 */,/*7399*/6167/* 1CE7 */,/*7400*/6167/* 1CE8 */,/*7401*/6170/* 1CE9 */,/*7402*/6171/* 1CEA */, /*7403*/6171/* 1CEB */,/*7404*/6171/* 1CEC */,/*7405*/6172/* 1CED */,/*7406*/6171/* 1CEE */,/*7407*/6171/* 1CEF */, /*7408*/6171/* 1CF0 */,/*7409*/6171/* 1CF1 */,/*7410*/6173/* 1CF2 */,/*7411*/6174/* 1CF3 */,/*7412*/6175/* 1CF4 */, /*7413*/6176/* 1CF5 */,/*7414*/6177/* 1CF6 */,/*7415*/6178/* 1CF7 */,/*7416*/6179/* 1CF8 */,/*7417*/6179/* 1CF9 */,0,0,0, 0,0,0,/*7424*/6180/* 1D00 */,/*7425*/6181/* 1D01 */,/*7426*/6182/* 1D02 */,/*7427*/6183/* 1D03 */,/*7428*/6184/* 1D04 */, /*7429*/6185/* 1D05 */,/*7430*/6186/* 1D06 */,/*7431*/6187/* 1D07 */,/*7432*/6188/* 1D08 */,/*7433*/6189/* 1D09 */, /*7434*/6190/* 1D0A */,/*7435*/6191/* 1D0B */,/*7436*/6192/* 1D0C */,/*7437*/6193/* 1D0D */,/*7438*/6194/* 1D0E */, /*7439*/6195/* 1D0F */,/*7440*/6196/* 1D10 */,/*7441*/6197/* 1D11 */,/*7442*/6198/* 1D12 */,/*7443*/6199/* 1D13 */, /*7444*/6200/* 1D14 */,/*7445*/6201/* 1D15 */,/*7446*/6202/* 1D16 */,/*7447*/6203/* 1D17 */,/*7448*/6204/* 1D18 */, /*7449*/6205/* 1D19 */,/*7450*/6206/* 1D1A */,/*7451*/6207/* 1D1B */,/*7452*/6208/* 1D1C */,/*7453*/6209/* 1D1D */, /*7454*/6210/* 1D1E */,/*7455*/6211/* 1D1F */,/*7456*/6212/* 1D20 */,/*7457*/6213/* 1D21 */,/*7458*/6214/* 1D22 */, /*7459*/6215/* 1D23 */,/*7460*/6216/* 1D24 */,/*7461*/6217/* 1D25 */,/*7462*/6218/* 1D26 */,/*7463*/6219/* 1D27 */, /*7464*/6220/* 1D28 */,/*7465*/6221/* 1D29 */,/*7466*/6222/* 1D2A */,/*7467*/6223/* 1D2B */,/*7468*/6224/* 1D2C */, /*7469*/6225/* 1D2D */,/*7470*/6226/* 1D2E */,/*7471*/6227/* 1D2F */,/*7472*/6228/* 1D30 */,/*7473*/6229/* 1D31 */, /*7474*/6230/* 1D32 */,/*7475*/6231/* 1D33 */,/*7476*/6232/* 1D34 */,/*7477*/6233/* 1D35 */,/*7478*/6234/* 1D36 */, /*7479*/6235/* 1D37 */,/*7480*/6236/* 1D38 */,/*7481*/6237/* 1D39 */,/*7482*/6238/* 1D3A */,/*7483*/6239/* 1D3B */, /*7484*/6240/* 1D3C */,/*7485*/6241/* 1D3D */,/*7486*/6242/* 1D3E */,/*7487*/6243/* 1D3F */,/*7488*/6244/* 1D40 */, /*7489*/6245/* 1D41 */,/*7490*/6246/* 1D42 */,/*7491*/6247/* 1D43 */,/*7492*/6248/* 1D44 */,/*7493*/6249/* 1D45 */, /*7494*/6250/* 1D46 */,/*7495*/6251/* 1D47 */,/*7496*/6252/* 1D48 */,/*7497*/6253/* 1D49 */,/*7498*/6254/* 1D4A */, /*7499*/6255/* 1D4B */,/*7500*/6256/* 1D4C */,/*7501*/6257/* 1D4D */,/*7502*/6258/* 1D4E */,/*7503*/6259/* 1D4F */, /*7504*/6260/* 1D50 */,/*7505*/6261/* 1D51 */,/*7506*/6262/* 1D52 */,/*7507*/6263/* 1D53 */,/*7508*/6264/* 1D54 */, /*7509*/6265/* 1D55 */,/*7510*/6266/* 1D56 */,/*7511*/6267/* 1D57 */,/*7512*/6268/* 1D58 */,/*7513*/6269/* 1D59 */, /*7514*/6270/* 1D5A */,/*7515*/6271/* 1D5B */,/*7516*/6272/* 1D5C */,/*7517*/6273/* 1D5D */,/*7518*/6274/* 1D5E */, /*7519*/6275/* 1D5F */,/*7520*/6276/* 1D60 */,/*7521*/6277/* 1D61 */,/*7522*/6278/* 1D62 */,/*7523*/6279/* 1D63 */, /*7524*/6280/* 1D64 */,/*7525*/6281/* 1D65 */,/*7526*/6282/* 1D66 */,/*7527*/6283/* 1D67 */,/*7528*/6284/* 1D68 */, /*7529*/6285/* 1D69 */,/*7530*/6286/* 1D6A */,/*7531*/6287/* 1D6B */,/*7532*/6288/* 1D6C */,/*7533*/6289/* 1D6D */, /*7534*/6290/* 1D6E */,/*7535*/6291/* 1D6F */,/*7536*/6292/* 1D70 */,/*7537*/6293/* 1D71 */,/*7538*/6294/* 1D72 */, /*7539*/6295/* 1D73 */,/*7540*/6296/* 1D74 */,/*7541*/6297/* 1D75 */,/*7542*/6298/* 1D76 */,/*7543*/6299/* 1D77 */, /*7544*/6300/* 1D78 */,/*7545*/6301/* 1D79 */,/*7546*/6302/* 1D7A */,/*7547*/6303/* 1D7B */,/*7548*/6304/* 1D7C */, /*7549*/6305/* 1D7D */,/*7550*/6306/* 1D7E */,/*7551*/6307/* 1D7F */,/*7552*/6308/* 1D80 */,/*7553*/6309/* 1D81 */, /*7554*/6310/* 1D82 */,/*7555*/6311/* 1D83 */,/*7556*/6312/* 1D84 */,/*7557*/6313/* 1D85 */,/*7558*/6314/* 1D86 */, /*7559*/6315/* 1D87 */,/*7560*/6316/* 1D88 */,/*7561*/6317/* 1D89 */,/*7562*/6318/* 1D8A */,/*7563*/6319/* 1D8B */, /*7564*/6320/* 1D8C */,/*7565*/6321/* 1D8D */,/*7566*/6322/* 1D8E */,/*7567*/6323/* 1D8F */,/*7568*/6324/* 1D90 */, /*7569*/6325/* 1D91 */,/*7570*/6326/* 1D92 */,/*7571*/6327/* 1D93 */,/*7572*/6328/* 1D94 */,/*7573*/6329/* 1D95 */, /*7574*/6330/* 1D96 */,/*7575*/6331/* 1D97 */,/*7576*/6332/* 1D98 */,/*7577*/6333/* 1D99 */,/*7578*/6334/* 1D9A */, /*7579*/6335/* 1D9B */,/*7580*/6336/* 1D9C */,/*7581*/6337/* 1D9D */,/*7582*/6338/* 1D9E */,/*7583*/6339/* 1D9F */, /*7584*/6340/* 1DA0 */,/*7585*/6341/* 1DA1 */,/*7586*/6342/* 1DA2 */,/*7587*/6343/* 1DA3 */,/*7588*/6344/* 1DA4 */, /*7589*/6345/* 1DA5 */,/*7590*/6346/* 1DA6 */,/*7591*/6347/* 1DA7 */,/*7592*/6348/* 1DA8 */,/*7593*/6349/* 1DA9 */, /*7594*/6350/* 1DAA */,/*7595*/6351/* 1DAB */,/*7596*/6352/* 1DAC */,/*7597*/6353/* 1DAD */,/*7598*/6354/* 1DAE */, /*7599*/6355/* 1DAF */,/*7600*/6356/* 1DB0 */,/*7601*/6357/* 1DB1 */,/*7602*/6358/* 1DB2 */,/*7603*/6359/* 1DB3 */, /*7604*/6360/* 1DB4 */,/*7605*/6361/* 1DB5 */,/*7606*/6362/* 1DB6 */,/*7607*/6363/* 1DB7 */,/*7608*/6364/* 1DB8 */, /*7609*/6365/* 1DB9 */,/*7610*/6366/* 1DBA */,/*7611*/6367/* 1DBB */,/*7612*/6368/* 1DBC */,/*7613*/6369/* 1DBD */, /*7614*/6370/* 1DBE */,/*7615*/6371/* 1DBF */,/*7616*/6372/* 1DC0 */,/*7617*/6372/* 1DC1 */,/*7618*/6373/* 1DC2 */, /*7619*/6372/* 1DC3 */,/*7620*/6374/* 1DC4 */,/*7621*/6374/* 1DC5 */,/*7622*/6374/* 1DC6 */,/*7623*/6374/* 1DC7 */, /*7624*/6374/* 1DC8 */,/*7625*/6374/* 1DC9 */,/*7626*/6375/* 1DCA */,/*7627*/6376/* 1DCB */,/*7628*/6376/* 1DCC */, /*7629*/6377/* 1DCD */,/*7630*/6378/* 1DCE */,/*7631*/6379/* 1DCF */,/*7632*/6380/* 1DD0 */,/*7633*/6381/* 1DD1 */, /*7634*/6382/* 1DD2 */,/*7635*/6383/* 1DD3 */,/*7636*/6384/* 1DD4 */,/*7637*/6385/* 1DD5 */,/*7638*/6386/* 1DD6 */, /*7639*/6387/* 1DD7 */,/*7640*/6388/* 1DD8 */,/*7641*/6389/* 1DD9 */,/*7642*/6390/* 1DDA */,/*7643*/6391/* 1DDB */, /*7644*/6392/* 1DDC */,/*7645*/6393/* 1DDD */,/*7646*/6394/* 1DDE */,/*7647*/6395/* 1DDF */,/*7648*/6396/* 1DE0 */, /*7649*/6397/* 1DE1 */,/*7650*/6398/* 1DE2 */,/*7651*/6399/* 1DE3 */,/*7652*/6400/* 1DE4 */,/*7653*/6401/* 1DE5 */, /*7654*/6402/* 1DE6 */,/*7655*/6403/* 1DE7 */,/*7656*/6404/* 1DE8 */,/*7657*/6405/* 1DE9 */,/*7658*/6406/* 1DEA */, /*7659*/6407/* 1DEB */,/*7660*/6408/* 1DEC */,/*7661*/6409/* 1DED */,/*7662*/6410/* 1DEE */,/*7663*/6411/* 1DEF */, /*7664*/6412/* 1DF0 */,/*7665*/6413/* 1DF1 */,/*7666*/6414/* 1DF2 */,/*7667*/6415/* 1DF3 */,/*7668*/6416/* 1DF4 */, /*7669*/6417/* 1DF5 */,/*7670*/6418/* 1DF6 */,/*7671*/6419/* 1DF7 */,/*7672*/6419/* 1DF8 */,/*7673*/6420/* 1DF9 */,0, /*7675*/6421/* 1DFB */,/*7676*/6422/* 1DFC */,/*7677*/6423/* 1DFD */,/*7678*/6374/* 1DFE */,/*7679*/6424/* 1DFF */, /*7680*/6425/* 1E00 */,/*7681*/6426/* 1E01 */,/*7682*/6427/* 1E02 */,/*7683*/6428/* 1E03 */,/*7684*/6429/* 1E04 */, /*7685*/6430/* 1E05 */,/*7686*/6431/* 1E06 */,/*7687*/6432/* 1E07 */,/*7688*/6433/* 1E08 */,/*7689*/6434/* 1E09 */, /*7690*/6435/* 1E0A */,/*7691*/6436/* 1E0B */,/*7692*/6437/* 1E0C */,/*7693*/6438/* 1E0D */,/*7694*/6439/* 1E0E */, /*7695*/6440/* 1E0F */,/*7696*/6441/* 1E10 */,/*7697*/6442/* 1E11 */,/*7698*/6443/* 1E12 */,/*7699*/6444/* 1E13 */, /*7700*/6445/* 1E14 */,/*7701*/6446/* 1E15 */,/*7702*/6447/* 1E16 */,/*7703*/6448/* 1E17 */,/*7704*/6449/* 1E18 */, /*7705*/6450/* 1E19 */,/*7706*/6451/* 1E1A */,/*7707*/6452/* 1E1B */,/*7708*/6453/* 1E1C */,/*7709*/6454/* 1E1D */, /*7710*/6455/* 1E1E */,/*7711*/6456/* 1E1F */,/*7712*/6457/* 1E20 */,/*7713*/6458/* 1E21 */,/*7714*/6459/* 1E22 */, /*7715*/6460/* 1E23 */,/*7716*/6461/* 1E24 */,/*7717*/6462/* 1E25 */,/*7718*/6463/* 1E26 */,/*7719*/6464/* 1E27 */, /*7720*/6465/* 1E28 */,/*7721*/6466/* 1E29 */,/*7722*/6467/* 1E2A */,/*7723*/6468/* 1E2B */,/*7724*/6469/* 1E2C */, /*7725*/6470/* 1E2D */,/*7726*/6471/* 1E2E */,/*7727*/6472/* 1E2F */,/*7728*/6473/* 1E30 */,/*7729*/6474/* 1E31 */, /*7730*/6475/* 1E32 */,/*7731*/6476/* 1E33 */,/*7732*/6477/* 1E34 */,/*7733*/6478/* 1E35 */,/*7734*/6479/* 1E36 */, /*7735*/6480/* 1E37 */,/*7736*/6481/* 1E38 */,/*7737*/6482/* 1E39 */,/*7738*/6483/* 1E3A */,/*7739*/6484/* 1E3B */, /*7740*/6485/* 1E3C */,/*7741*/6486/* 1E3D */,/*7742*/6487/* 1E3E */,/*7743*/6488/* 1E3F */,/*7744*/6489/* 1E40 */, /*7745*/6490/* 1E41 */,/*7746*/6491/* 1E42 */,/*7747*/6492/* 1E43 */,/*7748*/6493/* 1E44 */,/*7749*/6494/* 1E45 */, /*7750*/6495/* 1E46 */,/*7751*/6496/* 1E47 */,/*7752*/6497/* 1E48 */,/*7753*/6498/* 1E49 */,/*7754*/6499/* 1E4A */, /*7755*/6500/* 1E4B */,/*7756*/6501/* 1E4C */,/*7757*/6502/* 1E4D */,/*7758*/6503/* 1E4E */,/*7759*/6504/* 1E4F */, /*7760*/6505/* 1E50 */,/*7761*/6506/* 1E51 */,/*7762*/6507/* 1E52 */,/*7763*/6508/* 1E53 */,/*7764*/6509/* 1E54 */, /*7765*/6510/* 1E55 */,/*7766*/6511/* 1E56 */,/*7767*/6512/* 1E57 */,/*7768*/6513/* 1E58 */,/*7769*/6514/* 1E59 */, /*7770*/6515/* 1E5A */,/*7771*/6516/* 1E5B */,/*7772*/6517/* 1E5C */,/*7773*/6518/* 1E5D */,/*7774*/6519/* 1E5E */, /*7775*/6520/* 1E5F */,/*7776*/6521/* 1E60 */,/*7777*/6522/* 1E61 */,/*7778*/6523/* 1E62 */,/*7779*/6524/* 1E63 */, /*7780*/6525/* 1E64 */,/*7781*/6526/* 1E65 */,/*7782*/6527/* 1E66 */,/*7783*/6528/* 1E67 */,/*7784*/6529/* 1E68 */, /*7785*/6530/* 1E69 */,/*7786*/6531/* 1E6A */,/*7787*/6532/* 1E6B */,/*7788*/6533/* 1E6C */,/*7789*/6534/* 1E6D */, /*7790*/6535/* 1E6E */,/*7791*/6536/* 1E6F */,/*7792*/6537/* 1E70 */,/*7793*/6538/* 1E71 */,/*7794*/6539/* 1E72 */, /*7795*/6540/* 1E73 */,/*7796*/6541/* 1E74 */,/*7797*/6542/* 1E75 */,/*7798*/6543/* 1E76 */,/*7799*/6544/* 1E77 */, /*7800*/6545/* 1E78 */,/*7801*/6546/* 1E79 */,/*7802*/6547/* 1E7A */,/*7803*/6548/* 1E7B */,/*7804*/6549/* 1E7C */, /*7805*/6550/* 1E7D */,/*7806*/6551/* 1E7E */,/*7807*/6552/* 1E7F */,/*7808*/6553/* 1E80 */,/*7809*/6554/* 1E81 */, /*7810*/6555/* 1E82 */,/*7811*/6556/* 1E83 */,/*7812*/6557/* 1E84 */,/*7813*/6558/* 1E85 */,/*7814*/6559/* 1E86 */, /*7815*/6560/* 1E87 */,/*7816*/6561/* 1E88 */,/*7817*/6562/* 1E89 */,/*7818*/6563/* 1E8A */,/*7819*/6564/* 1E8B */, /*7820*/6565/* 1E8C */,/*7821*/6566/* 1E8D */,/*7822*/6567/* 1E8E */,/*7823*/6568/* 1E8F */,/*7824*/6569/* 1E90 */, /*7825*/6570/* 1E91 */,/*7826*/6571/* 1E92 */,/*7827*/6572/* 1E93 */,/*7828*/6573/* 1E94 */,/*7829*/6574/* 1E95 */, /*7830*/6575/* 1E96 */,/*7831*/6576/* 1E97 */,/*7832*/6577/* 1E98 */,/*7833*/6578/* 1E99 */,/*7834*/6579/* 1E9A */, /*7835*/6580/* 1E9B */,/*7836*/6581/* 1E9C */,/*7837*/6582/* 1E9D */,/*7838*/6583/* 1E9E */,/*7839*/6584/* 1E9F */, /*7840*/6585/* 1EA0 */,/*7841*/6586/* 1EA1 */,/*7842*/6587/* 1EA2 */,/*7843*/6588/* 1EA3 */,/*7844*/6589/* 1EA4 */, /*7845*/6590/* 1EA5 */,/*7846*/6591/* 1EA6 */,/*7847*/6592/* 1EA7 */,/*7848*/6593/* 1EA8 */,/*7849*/6594/* 1EA9 */, /*7850*/6595/* 1EAA */,/*7851*/6596/* 1EAB */,/*7852*/6597/* 1EAC */,/*7853*/6598/* 1EAD */,/*7854*/6599/* 1EAE */, /*7855*/6600/* 1EAF */,/*7856*/6601/* 1EB0 */,/*7857*/6602/* 1EB1 */,/*7858*/6603/* 1EB2 */,/*7859*/6604/* 1EB3 */, /*7860*/6605/* 1EB4 */,/*7861*/6606/* 1EB5 */,/*7862*/6607/* 1EB6 */,/*7863*/6608/* 1EB7 */,/*7864*/6609/* 1EB8 */, /*7865*/6610/* 1EB9 */,/*7866*/6611/* 1EBA */,/*7867*/6612/* 1EBB */,/*7868*/6613/* 1EBC */,/*7869*/6614/* 1EBD */, /*7870*/6615/* 1EBE */,/*7871*/6616/* 1EBF */,/*7872*/6617/* 1EC0 */,/*7873*/6618/* 1EC1 */,/*7874*/6619/* 1EC2 */, /*7875*/6620/* 1EC3 */,/*7876*/6621/* 1EC4 */,/*7877*/6622/* 1EC5 */,/*7878*/6623/* 1EC6 */,/*7879*/6624/* 1EC7 */, /*7880*/6625/* 1EC8 */,/*7881*/6626/* 1EC9 */,/*7882*/6627/* 1ECA */,/*7883*/6628/* 1ECB */,/*7884*/6629/* 1ECC */, /*7885*/6630/* 1ECD */,/*7886*/6631/* 1ECE */,/*7887*/6632/* 1ECF */,/*7888*/6633/* 1ED0 */,/*7889*/6634/* 1ED1 */, /*7890*/6635/* 1ED2 */,/*7891*/6636/* 1ED3 */,/*7892*/6637/* 1ED4 */,/*7893*/6638/* 1ED5 */,/*7894*/6639/* 1ED6 */, /*7895*/6640/* 1ED7 */,/*7896*/6641/* 1ED8 */,/*7897*/6642/* 1ED9 */,/*7898*/6643/* 1EDA */,/*7899*/6644/* 1EDB */, /*7900*/6645/* 1EDC */,/*7901*/6646/* 1EDD */,/*7902*/6647/* 1EDE */,/*7903*/6648/* 1EDF */,/*7904*/6649/* 1EE0 */, /*7905*/6650/* 1EE1 */,/*7906*/6651/* 1EE2 */,/*7907*/6652/* 1EE3 */,/*7908*/6653/* 1EE4 */,/*7909*/6654/* 1EE5 */, /*7910*/6655/* 1EE6 */,/*7911*/6656/* 1EE7 */,/*7912*/6657/* 1EE8 */,/*7913*/6658/* 1EE9 */,/*7914*/6659/* 1EEA */, /*7915*/6660/* 1EEB */,/*7916*/6661/* 1EEC */,/*7917*/6662/* 1EED */,/*7918*/6663/* 1EEE */,/*7919*/6664/* 1EEF */, /*7920*/6665/* 1EF0 */,/*7921*/6666/* 1EF1 */,/*7922*/6667/* 1EF2 */,/*7923*/6668/* 1EF3 */,/*7924*/6669/* 1EF4 */, /*7925*/6670/* 1EF5 */,/*7926*/6671/* 1EF6 */,/*7927*/6672/* 1EF7 */,/*7928*/6673/* 1EF8 */,/*7929*/6674/* 1EF9 */, /*7930*/6675/* 1EFA */,/*7931*/6676/* 1EFB */,/*7932*/6677/* 1EFC */,/*7933*/6678/* 1EFD */,/*7934*/6679/* 1EFE */, /*7935*/6680/* 1EFF */,/*7936*/6681/* 1F00 */,/*7937*/6682/* 1F01 */,/*7938*/6683/* 1F02 */,/*7939*/6684/* 1F03 */, /*7940*/6685/* 1F04 */,/*7941*/6686/* 1F05 */,/*7942*/6687/* 1F06 */,/*7943*/6688/* 1F07 */,/*7944*/6689/* 1F08 */, /*7945*/6690/* 1F09 */,/*7946*/6691/* 1F0A */,/*7947*/6692/* 1F0B */,/*7948*/6693/* 1F0C */,/*7949*/6694/* 1F0D */, /*7950*/6695/* 1F0E */,/*7951*/6696/* 1F0F */,/*7952*/6697/* 1F10 */,/*7953*/6698/* 1F11 */,/*7954*/6699/* 1F12 */, /*7955*/6700/* 1F13 */,/*7956*/6701/* 1F14 */,/*7957*/6702/* 1F15 */,0,0,/*7960*/6703/* 1F18 */,/*7961*/6704/* 1F19 */, /*7962*/6705/* 1F1A */,/*7963*/6706/* 1F1B */,/*7964*/6707/* 1F1C */,/*7965*/6708/* 1F1D */,0,0,/*7968*/6709/* 1F20 */, /*7969*/6710/* 1F21 */,/*7970*/6711/* 1F22 */,/*7971*/6712/* 1F23 */,/*7972*/6713/* 1F24 */,/*7973*/6714/* 1F25 */, /*7974*/6715/* 1F26 */,/*7975*/6716/* 1F27 */,/*7976*/6717/* 1F28 */,/*7977*/6718/* 1F29 */,/*7978*/6719/* 1F2A */, /*7979*/6720/* 1F2B */,/*7980*/6721/* 1F2C */,/*7981*/6722/* 1F2D */,/*7982*/6723/* 1F2E */,/*7983*/6724/* 1F2F */, /*7984*/6725/* 1F30 */,/*7985*/6726/* 1F31 */,/*7986*/6727/* 1F32 */,/*7987*/6728/* 1F33 */,/*7988*/6729/* 1F34 */, /*7989*/6730/* 1F35 */,/*7990*/6731/* 1F36 */,/*7991*/6732/* 1F37 */,/*7992*/6733/* 1F38 */,/*7993*/6734/* 1F39 */, /*7994*/6735/* 1F3A */,/*7995*/6736/* 1F3B */,/*7996*/6737/* 1F3C */,/*7997*/6738/* 1F3D */,/*7998*/6739/* 1F3E */, /*7999*/6740/* 1F3F */,/*8000*/6741/* 1F40 */,/*8001*/6742/* 1F41 */,/*8002*/6743/* 1F42 */,/*8003*/6744/* 1F43 */, /*8004*/6745/* 1F44 */,/*8005*/6746/* 1F45 */,0,0,/*8008*/6747/* 1F48 */,/*8009*/6748/* 1F49 */,/*8010*/6749/* 1F4A */, /*8011*/6750/* 1F4B */,/*8012*/6751/* 1F4C */,/*8013*/6752/* 1F4D */,0,0,/*8016*/6753/* 1F50 */,/*8017*/6754/* 1F51 */, /*8018*/6755/* 1F52 */,/*8019*/6756/* 1F53 */,/*8020*/6757/* 1F54 */,/*8021*/6758/* 1F55 */,/*8022*/6759/* 1F56 */, /*8023*/6760/* 1F57 */,0,/*8025*/6761/* 1F59 */,0,/*8027*/6762/* 1F5B */,0,/*8029*/6763/* 1F5D */,0, /*8031*/6764/* 1F5F */,/*8032*/6765/* 1F60 */,/*8033*/6766/* 1F61 */,/*8034*/6767/* 1F62 */,/*8035*/6768/* 1F63 */, /*8036*/6769/* 1F64 */,/*8037*/6770/* 1F65 */,/*8038*/6771/* 1F66 */,/*8039*/6772/* 1F67 */,/*8040*/6773/* 1F68 */, /*8041*/6774/* 1F69 */,/*8042*/6775/* 1F6A */,/*8043*/6776/* 1F6B */,/*8044*/6777/* 1F6C */,/*8045*/6778/* 1F6D */, /*8046*/6779/* 1F6E */,/*8047*/6780/* 1F6F */,/*8048*/6781/* 1F70 */,/*8049*/6782/* 1F71 */,/*8050*/6783/* 1F72 */, /*8051*/6784/* 1F73 */,/*8052*/6785/* 1F74 */,/*8053*/6786/* 1F75 */,/*8054*/6787/* 1F76 */,/*8055*/6788/* 1F77 */, /*8056*/6789/* 1F78 */,/*8057*/6790/* 1F79 */,/*8058*/6791/* 1F7A */,/*8059*/6792/* 1F7B */,/*8060*/6793/* 1F7C */, /*8061*/6794/* 1F7D */,0,0,/*8064*/6795/* 1F80 */,/*8065*/6796/* 1F81 */,/*8066*/6797/* 1F82 */,/*8067*/6798/* 1F83 */, /*8068*/6799/* 1F84 */,/*8069*/6800/* 1F85 */,/*8070*/6801/* 1F86 */,/*8071*/6802/* 1F87 */,/*8072*/6803/* 1F88 */, /*8073*/6804/* 1F89 */,/*8074*/6805/* 1F8A */,/*8075*/6806/* 1F8B */,/*8076*/6807/* 1F8C */,/*8077*/6808/* 1F8D */, /*8078*/6809/* 1F8E */,/*8079*/6810/* 1F8F */,/*8080*/6811/* 1F90 */,/*8081*/6812/* 1F91 */,/*8082*/6813/* 1F92 */, /*8083*/6814/* 1F93 */,/*8084*/6815/* 1F94 */,/*8085*/6816/* 1F95 */,/*8086*/6817/* 1F96 */,/*8087*/6818/* 1F97 */, /*8088*/6819/* 1F98 */,/*8089*/6820/* 1F99 */,/*8090*/6821/* 1F9A */,/*8091*/6822/* 1F9B */,/*8092*/6823/* 1F9C */, /*8093*/6824/* 1F9D */,/*8094*/6825/* 1F9E */,/*8095*/6826/* 1F9F */,/*8096*/6827/* 1FA0 */,/*8097*/6828/* 1FA1 */, /*8098*/6829/* 1FA2 */,/*8099*/6830/* 1FA3 */,/*8100*/6831/* 1FA4 */,/*8101*/6832/* 1FA5 */,/*8102*/6833/* 1FA6 */, /*8103*/6834/* 1FA7 */,/*8104*/6835/* 1FA8 */,/*8105*/6836/* 1FA9 */,/*8106*/6837/* 1FAA */,/*8107*/6838/* 1FAB */, /*8108*/6839/* 1FAC */,/*8109*/6840/* 1FAD */,/*8110*/6841/* 1FAE */,/*8111*/6842/* 1FAF */,/*8112*/6843/* 1FB0 */, /*8113*/6844/* 1FB1 */,/*8114*/6845/* 1FB2 */,/*8115*/6846/* 1FB3 */,/*8116*/6847/* 1FB4 */,0,/*8118*/6848/* 1FB6 */, /*8119*/6849/* 1FB7 */,/*8120*/6850/* 1FB8 */,/*8121*/6851/* 1FB9 */,/*8122*/6852/* 1FBA */,/*8123*/6853/* 1FBB */, /*8124*/6854/* 1FBC */,/*8125*/6855/* 1FBD */,/*8126*/6856/* 1FBE */,/*8127*/6857/* 1FBF */,/*8128*/6858/* 1FC0 */, /*8129*/6859/* 1FC1 */,/*8130*/6860/* 1FC2 */,/*8131*/6861/* 1FC3 */,/*8132*/6862/* 1FC4 */,0,/*8134*/6863/* 1FC6 */, /*8135*/6864/* 1FC7 */,/*8136*/6865/* 1FC8 */,/*8137*/6866/* 1FC9 */,/*8138*/6867/* 1FCA */,/*8139*/6868/* 1FCB */, /*8140*/6869/* 1FCC */,/*8141*/6870/* 1FCD */,/*8142*/6871/* 1FCE */,/*8143*/6872/* 1FCF */,/*8144*/6873/* 1FD0 */, /*8145*/6874/* 1FD1 */,/*8146*/6875/* 1FD2 */,/*8147*/6876/* 1FD3 */,0,0,/*8150*/6877/* 1FD6 */,/*8151*/6878/* 1FD7 */, /*8152*/6879/* 1FD8 */,/*8153*/6880/* 1FD9 */,/*8154*/6881/* 1FDA */,/*8155*/6882/* 1FDB */,0,/*8157*/6883/* 1FDD */, /*8158*/6884/* 1FDE */,/*8159*/6885/* 1FDF */,/*8160*/6886/* 1FE0 */,/*8161*/6887/* 1FE1 */,/*8162*/6888/* 1FE2 */, /*8163*/6889/* 1FE3 */,/*8164*/6890/* 1FE4 */,/*8165*/6891/* 1FE5 */,/*8166*/6892/* 1FE6 */,/*8167*/6893/* 1FE7 */, /*8168*/6894/* 1FE8 */,/*8169*/6895/* 1FE9 */,/*8170*/6896/* 1FEA */,/*8171*/6897/* 1FEB */,/*8172*/6898/* 1FEC */, /*8173*/6899/* 1FED */,/*8174*/6900/* 1FEE */,/*8175*/6901/* 1FEF */,0,0,/*8178*/6902/* 1FF2 */,/*8179*/6903/* 1FF3 */, /*8180*/6904/* 1FF4 */,0,/*8182*/6905/* 1FF6 */,/*8183*/6906/* 1FF7 */,/*8184*/6907/* 1FF8 */,/*8185*/6908/* 1FF9 */, /*8186*/6909/* 1FFA */,/*8187*/6910/* 1FFB */,/*8188*/6911/* 1FFC */,/*8189*/6912/* 1FFD */,/*8190*/6913/* 1FFE */,0, /*8192*/6914/* 2000 */,/*8193*/6915/* 2001 */,/*8194*/6916/* 2002 */,/*8195*/6917/* 2003 */,/*8196*/6918/* 2004 */, /*8197*/6919/* 2005 */,/*8198*/6920/* 2006 */,/*8199*/6921/* 2007 */,/*8200*/6922/* 2008 */,/*8201*/6923/* 2009 */, /*8202*/6924/* 200A */,/*8203*/6925/* 200B */,/*8204*/6926/* 200C */,/*8205*/6927/* 200D */,/*8206*/6928/* 200E */, /*8207*/6929/* 200F */,/*8208*/6930/* 2010 */,/*8209*/6931/* 2011 */,/*8210*/6932/* 2012 */,/*8211*/6933/* 2013 */, /*8212*/6934/* 2014 */,/*8213*/6935/* 2015 */,/*8214*/6936/* 2016 */,/*8215*/6937/* 2017 */,/*8216*/6938/* 2018 */, /*8217*/6939/* 2019 */,/*8218*/6940/* 201A */,/*8219*/6941/* 201B */,/*8220*/6942/* 201C */,/*8221*/6943/* 201D */, /*8222*/6944/* 201E */,/*8223*/6945/* 201F */,/*8224*/6946/* 2020 */,/*8225*/6947/* 2021 */,/*8226*/6948/* 2022 */, /*8227*/6949/* 2023 */,/*8228*/6950/* 2024 */,/*8229*/6951/* 2025 */,/*8230*/6952/* 2026 */,/*8231*/6953/* 2027 */, /*8232*/6954/* 2028 */,/*8233*/6955/* 2029 */,/*8234*/6956/* 202A */,/*8235*/6957/* 202B */,/*8236*/6958/* 202C */, /*8237*/6959/* 202D */,/*8238*/6960/* 202E */,/*8239*/6961/* 202F */,/*8240*/6962/* 2030 */,/*8241*/6963/* 2031 */, /*8242*/6964/* 2032 */,/*8243*/6965/* 2033 */,/*8244*/6966/* 2034 */,/*8245*/6967/* 2035 */,/*8246*/6968/* 2036 */, /*8247*/6969/* 2037 */,/*8248*/6970/* 2038 */,/*8249*/6971/* 2039 */,/*8250*/6972/* 203A */,/*8251*/6973/* 203B */, /*8252*/6974/* 203C */,/*8253*/6975/* 203D */,/*8254*/6976/* 203E */,/*8255*/6977/* 203F */,/*8256*/6978/* 2040 */, /*8257*/6979/* 2041 */,/*8258*/6980/* 2042 */,/*8259*/6981/* 2043 */,/*8260*/6982/* 2044 */,/*8261*/6983/* 2045 */, /*8262*/6984/* 2046 */,/*8263*/6985/* 2047 */,/*8264*/6986/* 2048 */,/*8265*/6987/* 2049 */,/*8266*/6988/* 204A */, /*8267*/6989/* 204B */,/*8268*/6990/* 204C */,/*8269*/6991/* 204D */,/*8270*/6992/* 204E */,/*8271*/6993/* 204F */, /*8272*/6994/* 2050 */,/*8273*/6995/* 2051 */,/*8274*/6996/* 2052 */,/*8275*/6997/* 2053 */,/*8276*/6998/* 2054 */, /*8277*/6999/* 2055 */,/*8278*/7000/* 2056 */,/*8279*/7001/* 2057 */,/*8280*/7002/* 2058 */,/*8281*/7003/* 2059 */, /*8282*/7004/* 205A */,/*8283*/7005/* 205B */,/*8284*/7006/* 205C */,/*8285*/7007/* 205D */,/*8286*/7008/* 205E */, /*8287*/7009/* 205F */,/*8288*/7010/* 2060 */,/*8289*/7011/* 2061 */,/*8290*/7011/* 2062 */,/*8291*/7011/* 2063 */, /*8292*/7012/* 2064 */,0,/*8294*/7013/* 2066 */,/*8295*/7014/* 2067 */,/*8296*/7015/* 2068 */,/*8297*/7016/* 2069 */, /*8298*/7017/* 206A */,/*8299*/7017/* 206B */,/*8300*/7017/* 206C */,/*8301*/7017/* 206D */,/*8302*/7017/* 206E */, /*8303*/7017/* 206F */,/*8304*/7018/* 2070 */,/*8305*/7019/* 2071 */,0,0,/*8308*/7020/* 2074 */,/*8309*/7021/* 2075 */, /*8310*/7022/* 2076 */,/*8311*/7023/* 2077 */,/*8312*/7024/* 2078 */,/*8313*/7025/* 2079 */,/*8314*/7026/* 207A */, /*8315*/7027/* 207B */,/*8316*/7028/* 207C */,/*8317*/7029/* 207D */,/*8318*/7030/* 207E */,/*8319*/7031/* 207F */, /*8320*/7032/* 2080 */,/*8321*/7033/* 2081 */,/*8322*/7034/* 2082 */,/*8323*/7035/* 2083 */,/*8324*/7036/* 2084 */, /*8325*/7037/* 2085 */,/*8326*/7038/* 2086 */,/*8327*/7039/* 2087 */,/*8328*/7040/* 2088 */,/*8329*/7041/* 2089 */, /*8330*/7042/* 208A */,/*8331*/7043/* 208B */,/*8332*/7044/* 208C */,/*8333*/7045/* 208D */,/*8334*/7046/* 208E */,0, /*8336*/7047/* 2090 */,/*8337*/7048/* 2091 */,/*8338*/7049/* 2092 */,/*8339*/7050/* 2093 */,/*8340*/7051/* 2094 */, /*8341*/7052/* 2095 */,/*8342*/7053/* 2096 */,/*8343*/7054/* 2097 */,/*8344*/7055/* 2098 */,/*8345*/7056/* 2099 */, /*8346*/7057/* 209A */,/*8347*/7058/* 209B */,/*8348*/7059/* 209C */,0,0,0,/*8352*/7060/* 20A0 */,/*8353*/7061/* 20A1 */, /*8354*/7062/* 20A2 */,/*8355*/7063/* 20A3 */,/*8356*/7064/* 20A4 */,/*8357*/7065/* 20A5 */,/*8358*/7066/* 20A6 */, /*8359*/7067/* 20A7 */,/*8360*/7068/* 20A8 */,/*8361*/7069/* 20A9 */,/*8362*/7070/* 20AA */,/*8363*/7071/* 20AB */, /*8364*/7072/* 20AC */,/*8365*/7073/* 20AD */,/*8366*/7074/* 20AE */,/*8367*/7075/* 20AF */,/*8368*/7076/* 20B0 */, /*8369*/7077/* 20B1 */,/*8370*/7078/* 20B2 */,/*8371*/7079/* 20B3 */,/*8372*/7080/* 20B4 */,/*8373*/7081/* 20B5 */, /*8374*/7082/* 20B6 */,/*8375*/7083/* 20B7 */,/*8376*/7084/* 20B8 */,/*8377*/7085/* 20B9 */,/*8378*/7086/* 20BA */, /*8379*/7087/* 20BB */,/*8380*/7088/* 20BC */,/*8381*/7089/* 20BD */,/*8382*/7090/* 20BE */,/*8383*/7091/* 20BF */,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,/*8400*/7092/* 20D0 */,/*8401*/7093/* 20D1 */,/*8402*/7094/* 20D2 */,/*8403*/7094/* 20D3 */, /*8404*/7095/* 20D4 */,/*8405*/7096/* 20D5 */,/*8406*/7097/* 20D6 */,/*8407*/7098/* 20D7 */,/*8408*/7099/* 20D8 */, /*8409*/7099/* 20D9 */,/*8410*/7099/* 20DA */,/*8411*/7100/* 20DB */,/*8412*/7101/* 20DC */,/*8413*/7102/* 20DD */, /*8414*/7102/* 20DE */,/*8415*/7102/* 20DF */,/*8416*/7102/* 20E0 */,/*8417*/7103/* 20E1 */,/*8418*/7104/* 20E2 */, /*8419*/7104/* 20E3 */,/*8420*/7105/* 20E4 */,/*8421*/7106/* 20E5 */,/*8422*/7107/* 20E6 */,/*8423*/7108/* 20E7 */, /*8424*/7109/* 20E8 */,/*8425*/7110/* 20E9 */,/*8426*/7111/* 20EA */,/*8427*/7112/* 20EB */,/*8428*/7113/* 20EC */, /*8429*/7113/* 20ED */,/*8430*/7113/* 20EE */,/*8431*/7113/* 20EF */,/*8432*/7114/* 20F0 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,/*8448*/7115/* 2100 */,/*8449*/7116/* 2101 */,/*8450*/7117/* 2102 */,/*8451*/7118/* 2103 */,/*8452*/7119/* 2104 */, /*8453*/7120/* 2105 */,/*8454*/7121/* 2106 */,/*8455*/7122/* 2107 */,/*8456*/7123/* 2108 */,/*8457*/7124/* 2109 */, /*8458*/7125/* 210A */,/*8459*/7126/* 210B */,/*8460*/7127/* 210C */,/*8461*/7128/* 210D */,/*8462*/7129/* 210E */, /*8463*/7130/* 210F */,/*8464*/7131/* 2110 */,/*8465*/7132/* 2111 */,/*8466*/7133/* 2112 */,/*8467*/7134/* 2113 */, /*8468*/7135/* 2114 */,/*8469*/7136/* 2115 */,/*8470*/7137/* 2116 */,/*8471*/7138/* 2117 */,/*8472*/7139/* 2118 */, /*8473*/7140/* 2119 */,/*8474*/7141/* 211A */,/*8475*/7142/* 211B */,/*8476*/7143/* 211C */,/*8477*/7144/* 211D */, /*8478*/7145/* 211E */,/*8479*/7146/* 211F */,/*8480*/7147/* 2120 */,/*8481*/7148/* 2121 */,/*8482*/7149/* 2122 */, /*8483*/7150/* 2123 */,/*8484*/7151/* 2124 */,/*8485*/7152/* 2125 */,/*8486*/7153/* 2126 */,/*8487*/7154/* 2127 */, /*8488*/7155/* 2128 */,/*8489*/7156/* 2129 */,/*8490*/7157/* 212A */,/*8491*/7158/* 212B */,/*8492*/7159/* 212C */, /*8493*/7160/* 212D */,/*8494*/7161/* 212E */,/*8495*/7162/* 212F */,/*8496*/7163/* 2130 */,/*8497*/7164/* 2131 */, /*8498*/7165/* 2132 */,/*8499*/7166/* 2133 */,/*8500*/7167/* 2134 */,/*8501*/7168/* 2135 */,/*8502*/7169/* 2136 */, /*8503*/7170/* 2137 */,/*8504*/7171/* 2138 */,/*8505*/7172/* 2139 */,/*8506*/7173/* 213A */,/*8507*/7174/* 213B */, /*8508*/7175/* 213C */,/*8509*/7176/* 213D */,/*8510*/7177/* 213E */,/*8511*/7178/* 213F */,/*8512*/7179/* 2140 */, /*8513*/7180/* 2141 */,/*8514*/7181/* 2142 */,/*8515*/7182/* 2143 */,/*8516*/7183/* 2144 */,/*8517*/7184/* 2145 */, /*8518*/7185/* 2146 */,/*8519*/7186/* 2147 */,/*8520*/7187/* 2148 */,/*8521*/7188/* 2149 */,/*8522*/7189/* 214A */, /*8523*/7190/* 214B */,/*8524*/7191/* 214C */,/*8525*/7192/* 214D */,/*8526*/7193/* 214E */,/*8527*/7194/* 214F */, /*8528*/7195/* 2150 */,/*8529*/7196/* 2151 */,/*8530*/7197/* 2152 */,/*8531*/7198/* 2153 */,/*8532*/7199/* 2154 */, /*8533*/7200/* 2155 */,/*8534*/7201/* 2156 */,/*8535*/7202/* 2157 */,/*8536*/7203/* 2158 */,/*8537*/7204/* 2159 */, /*8538*/7205/* 215A */,/*8539*/7206/* 215B */,/*8540*/7207/* 215C */,/*8541*/7208/* 215D */,/*8542*/7209/* 215E */, /*8543*/7210/* 215F */,/*8544*/7211/* 2160 */,/*8545*/7212/* 2161 */,/*8546*/7213/* 2162 */,/*8547*/7214/* 2163 */, /*8548*/7215/* 2164 */,/*8549*/7216/* 2165 */,/*8550*/7217/* 2166 */,/*8551*/7218/* 2167 */,/*8552*/7219/* 2168 */, /*8553*/7220/* 2169 */,/*8554*/7221/* 216A */,/*8555*/7222/* 216B */,/*8556*/7223/* 216C */,/*8557*/7224/* 216D */, /*8558*/7225/* 216E */,/*8559*/7226/* 216F */,/*8560*/7227/* 2170 */,/*8561*/7228/* 2171 */,/*8562*/7229/* 2172 */, /*8563*/7230/* 2173 */,/*8564*/7231/* 2174 */,/*8565*/7232/* 2175 */,/*8566*/7233/* 2176 */,/*8567*/7234/* 2177 */, /*8568*/7235/* 2178 */,/*8569*/7236/* 2179 */,/*8570*/7237/* 217A */,/*8571*/7238/* 217B */,/*8572*/7239/* 217C */, /*8573*/7240/* 217D */,/*8574*/7241/* 217E */,/*8575*/7242/* 217F */,/*8576*/7243/* 2180 */,/*8577*/7244/* 2181 */, /*8578*/7245/* 2182 */,/*8579*/7246/* 2183 */,/*8580*/7247/* 2184 */,/*8581*/7248/* 2185 */,/*8582*/7249/* 2186 */, /*8583*/7250/* 2187 */,/*8584*/7251/* 2188 */,/*8585*/7252/* 2189 */,/*8586*/7253/* 218A */,/*8587*/7254/* 218B */,0,0,0, 0,/*8592*/7255/* 2190 */,/*8593*/7256/* 2191 */,/*8594*/7257/* 2192 */,/*8595*/7258/* 2193 */,/*8596*/7259/* 2194 */, /*8597*/7260/* 2195 */,/*8598*/7261/* 2196 */,/*8599*/7262/* 2197 */,/*8600*/7263/* 2198 */,/*8601*/7264/* 2199 */, /*8602*/7265/* 219A */,/*8603*/7266/* 219B */,/*8604*/7267/* 219C */,/*8605*/7268/* 219D */,/*8606*/7269/* 219E */, /*8607*/7270/* 219F */,/*8608*/7271/* 21A0 */,/*8609*/7272/* 21A1 */,/*8610*/7273/* 21A2 */,/*8611*/7274/* 21A3 */, /*8612*/7275/* 21A4 */,/*8613*/7276/* 21A5 */,/*8614*/7277/* 21A6 */,/*8615*/7278/* 21A7 */,/*8616*/7279/* 21A8 */, /*8617*/7280/* 21A9 */,/*8618*/7281/* 21AA */,/*8619*/7282/* 21AB */,/*8620*/7283/* 21AC */,/*8621*/7284/* 21AD */, /*8622*/7285/* 21AE */,/*8623*/7286/* 21AF */,/*8624*/7287/* 21B0 */,/*8625*/7288/* 21B1 */,/*8626*/7289/* 21B2 */, /*8627*/7290/* 21B3 */,/*8628*/7291/* 21B4 */,/*8629*/7292/* 21B5 */,/*8630*/7293/* 21B6 */,/*8631*/7294/* 21B7 */, /*8632*/7295/* 21B8 */,/*8633*/7296/* 21B9 */,/*8634*/7297/* 21BA */,/*8635*/7298/* 21BB */,/*8636*/7299/* 21BC */, /*8637*/7300/* 21BD */,/*8638*/7301/* 21BE */,/*8639*/7302/* 21BF */,/*8640*/7303/* 21C0 */,/*8641*/7304/* 21C1 */, /*8642*/7305/* 21C2 */,/*8643*/7306/* 21C3 */,/*8644*/7307/* 21C4 */,/*8645*/7308/* 21C5 */,/*8646*/7309/* 21C6 */, /*8647*/7310/* 21C7 */,/*8648*/7311/* 21C8 */,/*8649*/7312/* 21C9 */,/*8650*/7313/* 21CA */,/*8651*/7314/* 21CB */, /*8652*/7315/* 21CC */,/*8653*/7316/* 21CD */,/*8654*/7317/* 21CE */,/*8655*/7318/* 21CF */,/*8656*/7319/* 21D0 */, /*8657*/7320/* 21D1 */,/*8658*/7321/* 21D2 */,/*8659*/7322/* 21D3 */,/*8660*/7323/* 21D4 */,/*8661*/7324/* 21D5 */, /*8662*/7325/* 21D6 */,/*8663*/7326/* 21D7 */,/*8664*/7327/* 21D8 */,/*8665*/7328/* 21D9 */,/*8666*/7329/* 21DA */, /*8667*/7330/* 21DB */,/*8668*/7331/* 21DC */,/*8669*/7332/* 21DD */,/*8670*/7333/* 21DE */,/*8671*/7334/* 21DF */, /*8672*/7335/* 21E0 */,/*8673*/7336/* 21E1 */,/*8674*/7337/* 21E2 */,/*8675*/7338/* 21E3 */,/*8676*/7339/* 21E4 */, /*8677*/7340/* 21E5 */,/*8678*/7341/* 21E6 */,/*8679*/7342/* 21E7 */,/*8680*/7343/* 21E8 */,/*8681*/7344/* 21E9 */, /*8682*/7345/* 21EA */,/*8683*/7346/* 21EB */,/*8684*/7347/* 21EC */,/*8685*/7348/* 21ED */,/*8686*/7349/* 21EE */, /*8687*/7350/* 21EF */,/*8688*/7351/* 21F0 */,/*8689*/7352/* 21F1 */,/*8690*/7353/* 21F2 */,/*8691*/7354/* 21F3 */, /*8692*/7355/* 21F4 */,/*8693*/7356/* 21F5 */,/*8694*/7357/* 21F6 */,/*8695*/7358/* 21F7 */,/*8696*/7359/* 21F8 */, /*8697*/7360/* 21F9 */,/*8698*/7361/* 21FA */,/*8699*/7362/* 21FB */,/*8700*/7363/* 21FC */,/*8701*/7364/* 21FD */, /*8702*/7365/* 21FE */,/*8703*/7366/* 21FF */,/*8704*/7367/* 2200 */,/*8705*/7368/* 2201 */,/*8706*/7369/* 2202 */, /*8707*/7370/* 2203 */,/*8708*/7371/* 2204 */,/*8709*/7372/* 2205 */,/*8710*/7373/* 2206 */,/*8711*/7374/* 2207 */, /*8712*/7375/* 2208 */,/*8713*/7376/* 2209 */,/*8714*/7377/* 220A */,/*8715*/7378/* 220B */,/*8716*/7379/* 220C */, /*8717*/7380/* 220D */,/*8718*/7381/* 220E */,/*8719*/7382/* 220F */,/*8720*/7383/* 2210 */,/*8721*/7384/* 2211 */, /*8722*/7385/* 2212 */,/*8723*/7386/* 2213 */,/*8724*/7387/* 2214 */,/*8725*/7388/* 2215 */,/*8726*/7389/* 2216 */, /*8727*/7390/* 2217 */,/*8728*/7391/* 2218 */,/*8729*/7392/* 2219 */,/*8730*/7393/* 221A */,/*8731*/7394/* 221B */, /*8732*/7395/* 221C */,/*8733*/7396/* 221D */,/*8734*/7397/* 221E */,/*8735*/7398/* 221F */,/*8736*/7399/* 2220 */, /*8737*/7400/* 2221 */,/*8738*/7401/* 2222 */,/*8739*/7402/* 2223 */,/*8740*/7403/* 2224 */,/*8741*/7404/* 2225 */, /*8742*/7405/* 2226 */,/*8743*/7406/* 2227 */,/*8744*/7407/* 2228 */,/*8745*/7408/* 2229 */,/*8746*/7409/* 222A */, /*8747*/7410/* 222B */,/*8748*/7411/* 222C */,/*8749*/7412/* 222D */,/*8750*/7413/* 222E */,/*8751*/7414/* 222F */, /*8752*/7415/* 2230 */,/*8753*/7416/* 2231 */,/*8754*/7417/* 2232 */,/*8755*/7418/* 2233 */,/*8756*/7419/* 2234 */, /*8757*/7420/* 2235 */,/*8758*/7421/* 2236 */,/*8759*/7422/* 2237 */,/*8760*/7423/* 2238 */,/*8761*/7424/* 2239 */, /*8762*/7425/* 223A */,/*8763*/7426/* 223B */,/*8764*/7427/* 223C */,/*8765*/7428/* 223D */,/*8766*/7429/* 223E */, /*8767*/7430/* 223F */,/*8768*/7431/* 2240 */,/*8769*/7432/* 2241 */,/*8770*/7433/* 2242 */,/*8771*/7434/* 2243 */, /*8772*/7435/* 2244 */,/*8773*/7436/* 2245 */,/*8774*/7437/* 2246 */,/*8775*/7438/* 2247 */,/*8776*/7439/* 2248 */, /*8777*/7440/* 2249 */,/*8778*/7441/* 224A */,/*8779*/7442/* 224B */,/*8780*/7443/* 224C */,/*8781*/7444/* 224D */, /*8782*/7445/* 224E */,/*8783*/7446/* 224F */,/*8784*/7447/* 2250 */,/*8785*/7448/* 2251 */,/*8786*/7449/* 2252 */, /*8787*/7450/* 2253 */,/*8788*/7451/* 2254 */,/*8789*/7452/* 2255 */,/*8790*/7453/* 2256 */,/*8791*/7454/* 2257 */, /*8792*/7455/* 2258 */,/*8793*/7456/* 2259 */,/*8794*/7457/* 225A */,/*8795*/7458/* 225B */,/*8796*/7459/* 225C */, /*8797*/7460/* 225D */,/*8798*/7461/* 225E */,/*8799*/7462/* 225F */,/*8800*/7463/* 2260 */,/*8801*/7464/* 2261 */, /*8802*/7465/* 2262 */,/*8803*/7466/* 2263 */,/*8804*/7467/* 2264 */,/*8805*/7468/* 2265 */,/*8806*/7469/* 2266 */, /*8807*/7470/* 2267 */,/*8808*/7471/* 2268 */,/*8809*/7472/* 2269 */,/*8810*/7473/* 226A */,/*8811*/7474/* 226B */, /*8812*/7475/* 226C */,/*8813*/7476/* 226D */,/*8814*/7477/* 226E */,/*8815*/7478/* 226F */,/*8816*/7479/* 2270 */, /*8817*/7480/* 2271 */,/*8818*/7481/* 2272 */,/*8819*/7482/* 2273 */,/*8820*/7483/* 2274 */,/*8821*/7484/* 2275 */, /*8822*/7485/* 2276 */,/*8823*/7486/* 2277 */,/*8824*/7487/* 2278 */,/*8825*/7488/* 2279 */,/*8826*/7489/* 227A */, /*8827*/7490/* 227B */,/*8828*/7491/* 227C */,/*8829*/7492/* 227D */,/*8830*/7493/* 227E */,/*8831*/7494/* 227F */, /*8832*/7495/* 2280 */,/*8833*/7496/* 2281 */,/*8834*/7497/* 2282 */,/*8835*/7498/* 2283 */,/*8836*/7499/* 2284 */, /*8837*/7500/* 2285 */,/*8838*/7501/* 2286 */,/*8839*/7502/* 2287 */,/*8840*/7503/* 2288 */,/*8841*/7504/* 2289 */, /*8842*/7505/* 228A */,/*8843*/7506/* 228B */,/*8844*/7507/* 228C */,/*8845*/7508/* 228D */,/*8846*/7509/* 228E */, /*8847*/7510/* 228F */,/*8848*/7511/* 2290 */,/*8849*/7512/* 2291 */,/*8850*/7513/* 2292 */,/*8851*/7514/* 2293 */, /*8852*/7515/* 2294 */,/*8853*/7516/* 2295 */,/*8854*/7517/* 2296 */,/*8855*/7518/* 2297 */,/*8856*/7519/* 2298 */, /*8857*/7520/* 2299 */,/*8858*/7521/* 229A */,/*8859*/7522/* 229B */,/*8860*/7523/* 229C */,/*8861*/7524/* 229D */, /*8862*/7525/* 229E */,/*8863*/7526/* 229F */,/*8864*/7527/* 22A0 */,/*8865*/7528/* 22A1 */,/*8866*/7529/* 22A2 */, /*8867*/7530/* 22A3 */,/*8868*/7531/* 22A4 */,/*8869*/7532/* 22A5 */,/*8870*/7533/* 22A6 */,/*8871*/7534/* 22A7 */, /*8872*/7535/* 22A8 */,/*8873*/7536/* 22A9 */,/*8874*/7537/* 22AA */,/*8875*/7538/* 22AB */,/*8876*/7539/* 22AC */, /*8877*/7540/* 22AD */,/*8878*/7541/* 22AE */,/*8879*/7542/* 22AF */,/*8880*/7543/* 22B0 */,/*8881*/7544/* 22B1 */, /*8882*/7545/* 22B2 */,/*8883*/7546/* 22B3 */,/*8884*/7547/* 22B4 */,/*8885*/7548/* 22B5 */,/*8886*/7549/* 22B6 */, /*8887*/7550/* 22B7 */,/*8888*/7551/* 22B8 */,/*8889*/7552/* 22B9 */,/*8890*/7553/* 22BA */,/*8891*/7554/* 22BB */, /*8892*/7555/* 22BC */,/*8893*/7556/* 22BD */,/*8894*/7557/* 22BE */,/*8895*/7558/* 22BF */,/*8896*/7559/* 22C0 */, /*8897*/7560/* 22C1 */,/*8898*/7561/* 22C2 */,/*8899*/7562/* 22C3 */,/*8900*/7563/* 22C4 */,/*8901*/7564/* 22C5 */, /*8902*/7565/* 22C6 */,/*8903*/7566/* 22C7 */,/*8904*/7567/* 22C8 */,/*8905*/7568/* 22C9 */,/*8906*/7569/* 22CA */, /*8907*/7570/* 22CB */,/*8908*/7571/* 22CC */,/*8909*/7572/* 22CD */,/*8910*/7573/* 22CE */,/*8911*/7574/* 22CF */, /*8912*/7575/* 22D0 */,/*8913*/7576/* 22D1 */,/*8914*/7577/* 22D2 */,/*8915*/7578/* 22D3 */,/*8916*/7579/* 22D4 */, /*8917*/7580/* 22D5 */,/*8918*/7581/* 22D6 */,/*8919*/7582/* 22D7 */,/*8920*/7583/* 22D8 */,/*8921*/7584/* 22D9 */, /*8922*/7585/* 22DA */,/*8923*/7586/* 22DB */,/*8924*/7587/* 22DC */,/*8925*/7588/* 22DD */,/*8926*/7589/* 22DE */, /*8927*/7590/* 22DF */,/*8928*/7591/* 22E0 */,/*8929*/7592/* 22E1 */,/*8930*/7593/* 22E2 */,/*8931*/7594/* 22E3 */, /*8932*/7595/* 22E4 */,/*8933*/7596/* 22E5 */,/*8934*/7597/* 22E6 */,/*8935*/7598/* 22E7 */,/*8936*/7599/* 22E8 */, /*8937*/7600/* 22E9 */,/*8938*/7601/* 22EA */,/*8939*/7602/* 22EB */,/*8940*/7603/* 22EC */,/*8941*/7604/* 22ED */, /*8942*/7605/* 22EE */,/*8943*/7606/* 22EF */,/*8944*/7607/* 22F0 */,/*8945*/7608/* 22F1 */,/*8946*/7609/* 22F2 */, /*8947*/7610/* 22F3 */,/*8948*/7611/* 22F4 */,/*8949*/7612/* 22F5 */,/*8950*/7613/* 22F6 */,/*8951*/7614/* 22F7 */, /*8952*/7615/* 22F8 */,/*8953*/7616/* 22F9 */,/*8954*/7617/* 22FA */,/*8955*/7618/* 22FB */,/*8956*/7619/* 22FC */, /*8957*/7620/* 22FD */,/*8958*/7621/* 22FE */,/*8959*/7622/* 22FF */,/*8960*/7623/* 2300 */,/*8961*/7624/* 2301 */, /*8962*/7625/* 2302 */,/*8963*/7626/* 2303 */,/*8964*/7627/* 2304 */,/*8965*/7628/* 2305 */,/*8966*/7629/* 2306 */, /*8967*/7630/* 2307 */,/*8968*/7631/* 2308 */,/*8969*/7632/* 2309 */,/*8970*/7633/* 230A */,/*8971*/7634/* 230B */, /*8972*/7635/* 230C */,/*8973*/7636/* 230D */,/*8974*/7637/* 230E */,/*8975*/7638/* 230F */,/*8976*/7639/* 2310 */, /*8977*/7640/* 2311 */,/*8978*/7641/* 2312 */,/*8979*/7642/* 2313 */,/*8980*/7643/* 2314 */,/*8981*/7644/* 2315 */, /*8982*/7645/* 2316 */,/*8983*/7646/* 2317 */,/*8984*/7647/* 2318 */,/*8985*/7648/* 2319 */,/*8986*/7649/* 231A */, /*8987*/7650/* 231B */,/*8988*/7651/* 231C */,/*8989*/7652/* 231D */,/*8990*/7653/* 231E */,/*8991*/7654/* 231F */, /*8992*/7655/* 2320 */,/*8993*/7656/* 2321 */,/*8994*/7657/* 2322 */,/*8995*/7658/* 2323 */,/*8996*/7659/* 2324 */, /*8997*/7660/* 2325 */,/*8998*/7661/* 2326 */,/*8999*/7662/* 2327 */,/*9000*/7663/* 2328 */,/*9001*/7664/* 2329 */, /*9002*/7665/* 232A */,/*9003*/7666/* 232B */,/*9004*/7667/* 232C */,/*9005*/7668/* 232D */,/*9006*/7669/* 232E */, /*9007*/7670/* 232F */,/*9008*/7671/* 2330 */,/*9009*/7672/* 2331 */,/*9010*/7673/* 2332 */,/*9011*/7674/* 2333 */, /*9012*/7675/* 2334 */,/*9013*/7676/* 2335 */,/*9014*/7677/* 2336 */,/*9015*/7678/* 2337 */,/*9016*/7679/* 2338 */, /*9017*/7680/* 2339 */,/*9018*/7681/* 233A */,/*9019*/7682/* 233B */,/*9020*/7683/* 233C */,/*9021*/7684/* 233D */, /*9022*/7685/* 233E */,/*9023*/7686/* 233F */,/*9024*/7687/* 2340 */,/*9025*/7688/* 2341 */,/*9026*/7689/* 2342 */, /*9027*/7690/* 2343 */,/*9028*/7691/* 2344 */,/*9029*/7692/* 2345 */,/*9030*/7693/* 2346 */,/*9031*/7694/* 2347 */, /*9032*/7695/* 2348 */,/*9033*/7696/* 2349 */,/*9034*/7697/* 234A */,/*9035*/7698/* 234B */,/*9036*/7699/* 234C */, /*9037*/7700/* 234D */,/*9038*/7701/* 234E */,/*9039*/7702/* 234F */,/*9040*/7703/* 2350 */,/*9041*/7704/* 2351 */, /*9042*/7705/* 2352 */,/*9043*/7706/* 2353 */,/*9044*/7707/* 2354 */,/*9045*/7708/* 2355 */,/*9046*/7709/* 2356 */, /*9047*/7710/* 2357 */,/*9048*/7711/* 2358 */,/*9049*/7712/* 2359 */,/*9050*/7713/* 235A */,/*9051*/7714/* 235B */, /*9052*/7715/* 235C */,/*9053*/7716/* 235D */,/*9054*/7717/* 235E */,/*9055*/7718/* 235F */,/*9056*/7719/* 2360 */, /*9057*/7720/* 2361 */,/*9058*/7721/* 2362 */,/*9059*/7722/* 2363 */,/*9060*/7723/* 2364 */,/*9061*/7724/* 2365 */, /*9062*/7725/* 2366 */,/*9063*/7726/* 2367 */,/*9064*/7727/* 2368 */,/*9065*/7728/* 2369 */,/*9066*/7729/* 236A */, /*9067*/7730/* 236B */,/*9068*/7731/* 236C */,/*9069*/7732/* 236D */,/*9070*/7733/* 236E */,/*9071*/7734/* 236F */, /*9072*/7735/* 2370 */,/*9073*/7736/* 2371 */,/*9074*/7737/* 2372 */,/*9075*/7738/* 2373 */,/*9076*/7739/* 2374 */, /*9077*/7740/* 2375 */,/*9078*/7741/* 2376 */,/*9079*/7742/* 2377 */,/*9080*/7743/* 2378 */,/*9081*/7744/* 2379 */, /*9082*/7745/* 237A */,/*9083*/7746/* 237B */,/*9084*/7747/* 237C */,/*9085*/7748/* 237D */,/*9086*/7749/* 237E */, /*9087*/7750/* 237F */,/*9088*/7751/* 2380 */,/*9089*/7752/* 2381 */,/*9090*/7753/* 2382 */,/*9091*/7754/* 2383 */, /*9092*/7755/* 2384 */,/*9093*/7756/* 2385 */,/*9094*/7757/* 2386 */,/*9095*/7758/* 2387 */,/*9096*/7759/* 2388 */, /*9097*/7760/* 2389 */,/*9098*/7761/* 238A */,/*9099*/7762/* 238B */,/*9100*/7763/* 238C */,/*9101*/7764/* 238D */, /*9102*/7765/* 238E */,/*9103*/7766/* 238F */,/*9104*/7767/* 2390 */,/*9105*/7768/* 2391 */,/*9106*/7769/* 2392 */, /*9107*/7770/* 2393 */,/*9108*/7771/* 2394 */,/*9109*/7772/* 2395 */,/*9110*/7773/* 2396 */,/*9111*/7774/* 2397 */, /*9112*/7775/* 2398 */,/*9113*/7776/* 2399 */,/*9114*/7777/* 239A */,/*9115*/7778/* 239B */,/*9116*/7779/* 239C */, /*9117*/7780/* 239D */,/*9118*/7781/* 239E */,/*9119*/7782/* 239F */,/*9120*/7783/* 23A0 */,/*9121*/7784/* 23A1 */, /*9122*/7785/* 23A2 */,/*9123*/7786/* 23A3 */,/*9124*/7787/* 23A4 */,/*9125*/7788/* 23A5 */,/*9126*/7789/* 23A6 */, /*9127*/7790/* 23A7 */,/*9128*/7791/* 23A8 */,/*9129*/7792/* 23A9 */,/*9130*/7793/* 23AA */,/*9131*/7794/* 23AB */, /*9132*/7795/* 23AC */,/*9133*/7796/* 23AD */,/*9134*/7797/* 23AE */,/*9135*/7798/* 23AF */,/*9136*/7799/* 23B0 */, /*9137*/7800/* 23B1 */,/*9138*/7801/* 23B2 */,/*9139*/7802/* 23B3 */,/*9140*/7803/* 23B4 */,/*9141*/7804/* 23B5 */, /*9142*/7805/* 23B6 */,/*9143*/7806/* 23B7 */,/*9144*/7807/* 23B8 */,/*9145*/7808/* 23B9 */,/*9146*/7809/* 23BA */, /*9147*/7810/* 23BB */,/*9148*/7811/* 23BC */,/*9149*/7812/* 23BD */,/*9150*/7813/* 23BE */,/*9151*/7814/* 23BF */, /*9152*/7815/* 23C0 */,/*9153*/7816/* 23C1 */,/*9154*/7817/* 23C2 */,/*9155*/7818/* 23C3 */,/*9156*/7819/* 23C4 */, /*9157*/7820/* 23C5 */,/*9158*/7821/* 23C6 */,/*9159*/7822/* 23C7 */,/*9160*/7823/* 23C8 */,/*9161*/7824/* 23C9 */, /*9162*/7825/* 23CA */,/*9163*/7826/* 23CB */,/*9164*/7827/* 23CC */,/*9165*/7828/* 23CD */,/*9166*/7829/* 23CE */, /*9167*/7830/* 23CF */,/*9168*/7831/* 23D0 */,/*9169*/7832/* 23D1 */,/*9170*/7833/* 23D2 */,/*9171*/7834/* 23D3 */, /*9172*/7835/* 23D4 */,/*9173*/7836/* 23D5 */,/*9174*/7837/* 23D6 */,/*9175*/7838/* 23D7 */,/*9176*/7839/* 23D8 */, /*9177*/7840/* 23D9 */,/*9178*/7841/* 23DA */,/*9179*/7842/* 23DB */,/*9180*/7843/* 23DC */,/*9181*/7844/* 23DD */, /*9182*/7845/* 23DE */,/*9183*/7846/* 23DF */,/*9184*/7847/* 23E0 */,/*9185*/7848/* 23E1 */,/*9186*/7849/* 23E2 */, /*9187*/7850/* 23E3 */,/*9188*/7851/* 23E4 */,/*9189*/7852/* 23E5 */,/*9190*/7853/* 23E6 */,/*9191*/7854/* 23E7 */, /*9192*/7855/* 23E8 */,/*9193*/7856/* 23E9 */,/*9194*/7857/* 23EA */,/*9195*/7858/* 23EB */,/*9196*/7859/* 23EC */, /*9197*/7860/* 23ED */,/*9198*/7861/* 23EE */,/*9199*/7862/* 23EF */,/*9200*/7863/* 23F0 */,/*9201*/7864/* 23F1 */, /*9202*/7865/* 23F2 */,/*9203*/7866/* 23F3 */,/*9204*/7867/* 23F4 */,/*9205*/7868/* 23F5 */,/*9206*/7869/* 23F6 */, /*9207*/7870/* 23F7 */,/*9208*/7871/* 23F8 */,/*9209*/7872/* 23F9 */,/*9210*/7873/* 23FA */,/*9211*/7874/* 23FB */, /*9212*/7875/* 23FC */,/*9213*/7876/* 23FD */,/*9214*/7877/* 23FE */,/*9215*/7878/* 23FF */,/*9216*/7879/* 2400 */, /*9217*/7880/* 2401 */,/*9218*/7881/* 2402 */,/*9219*/7882/* 2403 */,/*9220*/7883/* 2404 */,/*9221*/7884/* 2405 */, /*9222*/7885/* 2406 */,/*9223*/7886/* 2407 */,/*9224*/7887/* 2408 */,/*9225*/7888/* 2409 */,/*9226*/7889/* 240A */, /*9227*/7890/* 240B */,/*9228*/7891/* 240C */,/*9229*/7892/* 240D */,/*9230*/7893/* 240E */,/*9231*/7894/* 240F */, /*9232*/7895/* 2410 */,/*9233*/7896/* 2411 */,/*9234*/7897/* 2412 */,/*9235*/7898/* 2413 */,/*9236*/7899/* 2414 */, /*9237*/7900/* 2415 */,/*9238*/7901/* 2416 */,/*9239*/7902/* 2417 */,/*9240*/7903/* 2418 */,/*9241*/7904/* 2419 */, /*9242*/7905/* 241A */,/*9243*/7906/* 241B */,/*9244*/7907/* 241C */,/*9245*/7908/* 241D */,/*9246*/7909/* 241E */, /*9247*/7910/* 241F */,/*9248*/7911/* 2420 */,/*9249*/7912/* 2421 */,/*9250*/7913/* 2422 */,/*9251*/7914/* 2423 */, /*9252*/7915/* 2424 */,/*9253*/7916/* 2425 */,/*9254*/7917/* 2426 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*9280*/7918/* 2440 */,/*9281*/7919/* 2441 */,/*9282*/7920/* 2442 */,/*9283*/7921/* 2443 */,/*9284*/7922/* 2444 */, /*9285*/7923/* 2445 */,/*9286*/7924/* 2446 */,/*9287*/7925/* 2447 */,/*9288*/7926/* 2448 */,/*9289*/7927/* 2449 */, /*9290*/7928/* 244A */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*9312*/7929/* 2460 */,/*9313*/7930/* 2461 */, /*9314*/7931/* 2462 */,/*9315*/7932/* 2463 */,/*9316*/7933/* 2464 */,/*9317*/7934/* 2465 */,/*9318*/7935/* 2466 */, /*9319*/7936/* 2467 */,/*9320*/7937/* 2468 */,/*9321*/7938/* 2469 */,/*9322*/7939/* 246A */,/*9323*/7940/* 246B */, /*9324*/7941/* 246C */,/*9325*/7942/* 246D */,/*9326*/7943/* 246E */,/*9327*/7944/* 246F */,/*9328*/7945/* 2470 */, /*9329*/7946/* 2471 */,/*9330*/7947/* 2472 */,/*9331*/7948/* 2473 */,/*9332*/7949/* 2474 */,/*9333*/7950/* 2475 */, /*9334*/7951/* 2476 */,/*9335*/7952/* 2477 */,/*9336*/7953/* 2478 */,/*9337*/7954/* 2479 */,/*9338*/7955/* 247A */, /*9339*/7956/* 247B */,/*9340*/7957/* 247C */,/*9341*/7958/* 247D */,/*9342*/7959/* 247E */,/*9343*/7960/* 247F */, /*9344*/7961/* 2480 */,/*9345*/7962/* 2481 */,/*9346*/7963/* 2482 */,/*9347*/7964/* 2483 */,/*9348*/7965/* 2484 */, /*9349*/7966/* 2485 */,/*9350*/7967/* 2486 */,/*9351*/7968/* 2487 */,/*9352*/7969/* 2488 */,/*9353*/7970/* 2489 */, /*9354*/7971/* 248A */,/*9355*/7972/* 248B */,/*9356*/7973/* 248C */,/*9357*/7974/* 248D */,/*9358*/7975/* 248E */, /*9359*/7976/* 248F */,/*9360*/7977/* 2490 */,/*9361*/7978/* 2491 */,/*9362*/7979/* 2492 */,/*9363*/7980/* 2493 */, /*9364*/7981/* 2494 */,/*9365*/7982/* 2495 */,/*9366*/7983/* 2496 */,/*9367*/7984/* 2497 */,/*9368*/7985/* 2498 */, /*9369*/7986/* 2499 */,/*9370*/7987/* 249A */,/*9371*/7988/* 249B */,/*9372*/7989/* 249C */,/*9373*/7990/* 249D */, /*9374*/7991/* 249E */,/*9375*/7992/* 249F */,/*9376*/7993/* 24A0 */,/*9377*/7994/* 24A1 */,/*9378*/7995/* 24A2 */, /*9379*/7996/* 24A3 */,/*9380*/7997/* 24A4 */,/*9381*/7998/* 24A5 */,/*9382*/7999/* 24A6 */,/*9383*/8000/* 24A7 */, /*9384*/8001/* 24A8 */,/*9385*/8002/* 24A9 */,/*9386*/8003/* 24AA */,/*9387*/8004/* 24AB */,/*9388*/8005/* 24AC */, /*9389*/8006/* 24AD */,/*9390*/8007/* 24AE */,/*9391*/8008/* 24AF */,/*9392*/8009/* 24B0 */,/*9393*/8010/* 24B1 */, /*9394*/8011/* 24B2 */,/*9395*/8012/* 24B3 */,/*9396*/8013/* 24B4 */,/*9397*/8014/* 24B5 */,/*9398*/8015/* 24B6 */, /*9399*/8016/* 24B7 */,/*9400*/8017/* 24B8 */,/*9401*/8018/* 24B9 */,/*9402*/8019/* 24BA */,/*9403*/8020/* 24BB */, /*9404*/8021/* 24BC */,/*9405*/8022/* 24BD */,/*9406*/8023/* 24BE */,/*9407*/8024/* 24BF */,/*9408*/8025/* 24C0 */, /*9409*/8026/* 24C1 */,/*9410*/8027/* 24C2 */,/*9411*/8028/* 24C3 */,/*9412*/8029/* 24C4 */,/*9413*/8030/* 24C5 */, /*9414*/8031/* 24C6 */,/*9415*/8032/* 24C7 */,/*9416*/8033/* 24C8 */,/*9417*/8034/* 24C9 */,/*9418*/8035/* 24CA */, /*9419*/8036/* 24CB */,/*9420*/8037/* 24CC */,/*9421*/8038/* 24CD */,/*9422*/8039/* 24CE */,/*9423*/8040/* 24CF */, /*9424*/8041/* 24D0 */,/*9425*/8042/* 24D1 */,/*9426*/8043/* 24D2 */,/*9427*/8044/* 24D3 */,/*9428*/8045/* 24D4 */, /*9429*/8046/* 24D5 */,/*9430*/8047/* 24D6 */,/*9431*/8048/* 24D7 */,/*9432*/8049/* 24D8 */,/*9433*/8050/* 24D9 */, /*9434*/8051/* 24DA */,/*9435*/8052/* 24DB */,/*9436*/8053/* 24DC */,/*9437*/8054/* 24DD */,/*9438*/8055/* 24DE */, /*9439*/8056/* 24DF */,/*9440*/8057/* 24E0 */,/*9441*/8058/* 24E1 */,/*9442*/8059/* 24E2 */,/*9443*/8060/* 24E3 */, /*9444*/8061/* 24E4 */,/*9445*/8062/* 24E5 */,/*9446*/8063/* 24E6 */,/*9447*/8064/* 24E7 */,/*9448*/8065/* 24E8 */, /*9449*/8066/* 24E9 */,/*9450*/8067/* 24EA */,/*9451*/8068/* 24EB */,/*9452*/8069/* 24EC */,/*9453*/8070/* 24ED */, /*9454*/8071/* 24EE */,/*9455*/8072/* 24EF */,/*9456*/8073/* 24F0 */,/*9457*/8074/* 24F1 */,/*9458*/8075/* 24F2 */, /*9459*/8076/* 24F3 */,/*9460*/8077/* 24F4 */,/*9461*/8078/* 24F5 */,/*9462*/8079/* 24F6 */,/*9463*/8080/* 24F7 */, /*9464*/8081/* 24F8 */,/*9465*/8082/* 24F9 */,/*9466*/8083/* 24FA */,/*9467*/8084/* 24FB */,/*9468*/8085/* 24FC */, /*9469*/8086/* 24FD */,/*9470*/8087/* 24FE */,/*9471*/8088/* 24FF */,/*9472*/8089/* 2500 */,/*9473*/8090/* 2501 */, /*9474*/8091/* 2502 */,/*9475*/8092/* 2503 */,/*9476*/8093/* 2504 */,/*9477*/8094/* 2505 */,/*9478*/8095/* 2506 */, /*9479*/8096/* 2507 */,/*9480*/8097/* 2508 */,/*9481*/8098/* 2509 */,/*9482*/8099/* 250A */,/*9483*/8100/* 250B */, /*9484*/8101/* 250C */,/*9485*/8102/* 250D */,/*9486*/8103/* 250E */,/*9487*/8104/* 250F */,/*9488*/8105/* 2510 */, /*9489*/8106/* 2511 */,/*9490*/8107/* 2512 */,/*9491*/8108/* 2513 */,/*9492*/8109/* 2514 */,/*9493*/8110/* 2515 */, /*9494*/8111/* 2516 */,/*9495*/8112/* 2517 */,/*9496*/8113/* 2518 */,/*9497*/8114/* 2519 */,/*9498*/8115/* 251A */, /*9499*/8116/* 251B */,/*9500*/8117/* 251C */,/*9501*/8118/* 251D */,/*9502*/8119/* 251E */,/*9503*/8120/* 251F */, /*9504*/8121/* 2520 */,/*9505*/8122/* 2521 */,/*9506*/8123/* 2522 */,/*9507*/8124/* 2523 */,/*9508*/8125/* 2524 */, /*9509*/8126/* 2525 */,/*9510*/8127/* 2526 */,/*9511*/8128/* 2527 */,/*9512*/8129/* 2528 */,/*9513*/8130/* 2529 */, /*9514*/8131/* 252A */,/*9515*/8132/* 252B */,/*9516*/8133/* 252C */,/*9517*/8134/* 252D */,/*9518*/8135/* 252E */, /*9519*/8136/* 252F */,/*9520*/8137/* 2530 */,/*9521*/8138/* 2531 */,/*9522*/8139/* 2532 */,/*9523*/8140/* 2533 */, /*9524*/8141/* 2534 */,/*9525*/8142/* 2535 */,/*9526*/8143/* 2536 */,/*9527*/8144/* 2537 */,/*9528*/8145/* 2538 */, /*9529*/8146/* 2539 */,/*9530*/8147/* 253A */,/*9531*/8148/* 253B */,/*9532*/8149/* 253C */,/*9533*/8150/* 253D */, /*9534*/8151/* 253E */,/*9535*/8152/* 253F */,/*9536*/8153/* 2540 */,/*9537*/8154/* 2541 */,/*9538*/8155/* 2542 */, /*9539*/8156/* 2543 */,/*9540*/8157/* 2544 */,/*9541*/8158/* 2545 */,/*9542*/8159/* 2546 */,/*9543*/8160/* 2547 */, /*9544*/8161/* 2548 */,/*9545*/8162/* 2549 */,/*9546*/8163/* 254A */,/*9547*/8164/* 254B */,/*9548*/8165/* 254C */, /*9549*/8166/* 254D */,/*9550*/8167/* 254E */,/*9551*/8168/* 254F */,/*9552*/8169/* 2550 */,/*9553*/8170/* 2551 */, /*9554*/8171/* 2552 */,/*9555*/8172/* 2553 */,/*9556*/8173/* 2554 */,/*9557*/8174/* 2555 */,/*9558*/8175/* 2556 */, /*9559*/8176/* 2557 */,/*9560*/8177/* 2558 */,/*9561*/8178/* 2559 */,/*9562*/8179/* 255A */,/*9563*/8180/* 255B */, /*9564*/8181/* 255C */,/*9565*/8182/* 255D */,/*9566*/8183/* 255E */,/*9567*/8184/* 255F */,/*9568*/8185/* 2560 */, /*9569*/8186/* 2561 */,/*9570*/8187/* 2562 */,/*9571*/8188/* 2563 */,/*9572*/8189/* 2564 */,/*9573*/8190/* 2565 */, /*9574*/8191/* 2566 */,/*9575*/8192/* 2567 */,/*9576*/8193/* 2568 */,/*9577*/8194/* 2569 */,/*9578*/8195/* 256A */, /*9579*/8196/* 256B */,/*9580*/8197/* 256C */,/*9581*/8198/* 256D */,/*9582*/8199/* 256E */,/*9583*/8200/* 256F */, /*9584*/8201/* 2570 */,/*9585*/8202/* 2571 */,/*9586*/8203/* 2572 */,/*9587*/8204/* 2573 */,/*9588*/8205/* 2574 */, /*9589*/8206/* 2575 */,/*9590*/8207/* 2576 */,/*9591*/8208/* 2577 */,/*9592*/8209/* 2578 */,/*9593*/8210/* 2579 */, /*9594*/8211/* 257A */,/*9595*/8212/* 257B */,/*9596*/8213/* 257C */,/*9597*/8214/* 257D */,/*9598*/8215/* 257E */, /*9599*/8216/* 257F */,/*9600*/8217/* 2580 */,/*9601*/8218/* 2581 */,/*9602*/8219/* 2582 */,/*9603*/8220/* 2583 */, /*9604*/8221/* 2584 */,/*9605*/8222/* 2585 */,/*9606*/8223/* 2586 */,/*9607*/8224/* 2587 */,/*9608*/8225/* 2588 */, /*9609*/8226/* 2589 */,/*9610*/8227/* 258A */,/*9611*/8228/* 258B */,/*9612*/8229/* 258C */,/*9613*/8230/* 258D */, /*9614*/8231/* 258E */,/*9615*/8232/* 258F */,/*9616*/8233/* 2590 */,/*9617*/8234/* 2591 */,/*9618*/8235/* 2592 */, /*9619*/8236/* 2593 */,/*9620*/8237/* 2594 */,/*9621*/8238/* 2595 */,/*9622*/8239/* 2596 */,/*9623*/8240/* 2597 */, /*9624*/8241/* 2598 */,/*9625*/8242/* 2599 */,/*9626*/8243/* 259A */,/*9627*/8244/* 259B */,/*9628*/8245/* 259C */, /*9629*/8246/* 259D */,/*9630*/8247/* 259E */,/*9631*/8248/* 259F */,/*9632*/8249/* 25A0 */,/*9633*/8250/* 25A1 */, /*9634*/8251/* 25A2 */,/*9635*/8252/* 25A3 */,/*9636*/8253/* 25A4 */,/*9637*/8254/* 25A5 */,/*9638*/8255/* 25A6 */, /*9639*/8256/* 25A7 */,/*9640*/8257/* 25A8 */,/*9641*/8258/* 25A9 */,/*9642*/8259/* 25AA */,/*9643*/8260/* 25AB */, /*9644*/8261/* 25AC */,/*9645*/8262/* 25AD */,/*9646*/8263/* 25AE */,/*9647*/8264/* 25AF */,/*9648*/8265/* 25B0 */, /*9649*/8266/* 25B1 */,/*9650*/8267/* 25B2 */,/*9651*/8268/* 25B3 */,/*9652*/8269/* 25B4 */,/*9653*/8270/* 25B5 */, /*9654*/8271/* 25B6 */,/*9655*/8272/* 25B7 */,/*9656*/8273/* 25B8 */,/*9657*/8274/* 25B9 */,/*9658*/8275/* 25BA */, /*9659*/8276/* 25BB */,/*9660*/8277/* 25BC */,/*9661*/8278/* 25BD */,/*9662*/8279/* 25BE */,/*9663*/8280/* 25BF */, /*9664*/8281/* 25C0 */,/*9665*/8282/* 25C1 */,/*9666*/8283/* 25C2 */,/*9667*/8284/* 25C3 */,/*9668*/8285/* 25C4 */, /*9669*/8286/* 25C5 */,/*9670*/8287/* 25C6 */,/*9671*/8288/* 25C7 */,/*9672*/8289/* 25C8 */,/*9673*/8290/* 25C9 */, /*9674*/8291/* 25CA */,/*9675*/8292/* 25CB */,/*9676*/8293/* 25CC */,/*9677*/8294/* 25CD */,/*9678*/8295/* 25CE */, /*9679*/8296/* 25CF */,/*9680*/8297/* 25D0 */,/*9681*/8298/* 25D1 */,/*9682*/8299/* 25D2 */,/*9683*/8300/* 25D3 */, /*9684*/8301/* 25D4 */,/*9685*/8302/* 25D5 */,/*9686*/8303/* 25D6 */,/*9687*/8304/* 25D7 */,/*9688*/8305/* 25D8 */, /*9689*/8306/* 25D9 */,/*9690*/8307/* 25DA */,/*9691*/8308/* 25DB */,/*9692*/8309/* 25DC */,/*9693*/8310/* 25DD */, /*9694*/8311/* 25DE */,/*9695*/8312/* 25DF */,/*9696*/8313/* 25E0 */,/*9697*/8314/* 25E1 */,/*9698*/8315/* 25E2 */, /*9699*/8316/* 25E3 */,/*9700*/8317/* 25E4 */,/*9701*/8318/* 25E5 */,/*9702*/8319/* 25E6 */,/*9703*/8320/* 25E7 */, /*9704*/8321/* 25E8 */,/*9705*/8322/* 25E9 */,/*9706*/8323/* 25EA */,/*9707*/8324/* 25EB */,/*9708*/8325/* 25EC */, /*9709*/8326/* 25ED */,/*9710*/8327/* 25EE */,/*9711*/8328/* 25EF */,/*9712*/8329/* 25F0 */,/*9713*/8330/* 25F1 */, /*9714*/8331/* 25F2 */,/*9715*/8332/* 25F3 */,/*9716*/8333/* 25F4 */,/*9717*/8334/* 25F5 */,/*9718*/8335/* 25F6 */, /*9719*/8336/* 25F7 */,/*9720*/8337/* 25F8 */,/*9721*/8338/* 25F9 */,/*9722*/8339/* 25FA */,/*9723*/8340/* 25FB */, /*9724*/8341/* 25FC */,/*9725*/8342/* 25FD */,/*9726*/8343/* 25FE */,/*9727*/8344/* 25FF */,/*9728*/8345/* 2600 */, /*9729*/8346/* 2601 */,/*9730*/8347/* 2602 */,/*9731*/8348/* 2603 */,/*9732*/8349/* 2604 */,/*9733*/8350/* 2605 */, /*9734*/8351/* 2606 */,/*9735*/8352/* 2607 */,/*9736*/8353/* 2608 */,/*9737*/8354/* 2609 */,/*9738*/8355/* 260A */, /*9739*/8356/* 260B */,/*9740*/8357/* 260C */,/*9741*/8358/* 260D */,/*9742*/8359/* 260E */,/*9743*/8360/* 260F */, /*9744*/8361/* 2610 */,/*9745*/8362/* 2611 */,/*9746*/8363/* 2612 */,/*9747*/8364/* 2613 */,/*9748*/8365/* 2614 */, /*9749*/8366/* 2615 */,/*9750*/8367/* 2616 */,/*9751*/8368/* 2617 */,/*9752*/8369/* 2618 */,/*9753*/8370/* 2619 */, /*9754*/8371/* 261A */,/*9755*/8372/* 261B */,/*9756*/8373/* 261C */,/*9757*/8374/* 261D */,/*9758*/8375/* 261E */, /*9759*/8376/* 261F */,/*9760*/8377/* 2620 */,/*9761*/8378/* 2621 */,/*9762*/8379/* 2622 */,/*9763*/8380/* 2623 */, /*9764*/8381/* 2624 */,/*9765*/8382/* 2625 */,/*9766*/8383/* 2626 */,/*9767*/8384/* 2627 */,/*9768*/8385/* 2628 */, /*9769*/8386/* 2629 */,/*9770*/8387/* 262A */,/*9771*/8388/* 262B */,/*9772*/8389/* 262C */,/*9773*/8390/* 262D */, /*9774*/8391/* 262E */,/*9775*/8392/* 262F */,/*9776*/8393/* 2630 */,/*9777*/8394/* 2631 */,/*9778*/8395/* 2632 */, /*9779*/8396/* 2633 */,/*9780*/8397/* 2634 */,/*9781*/8398/* 2635 */,/*9782*/8399/* 2636 */,/*9783*/8400/* 2637 */, /*9784*/8401/* 2638 */,/*9785*/8402/* 2639 */,/*9786*/8403/* 263A */,/*9787*/8404/* 263B */,/*9788*/8405/* 263C */, /*9789*/8406/* 263D */,/*9790*/8407/* 263E */,/*9791*/8408/* 263F */,/*9792*/8409/* 2640 */,/*9793*/8410/* 2641 */, /*9794*/8411/* 2642 */,/*9795*/8412/* 2643 */,/*9796*/8413/* 2644 */,/*9797*/8414/* 2645 */,/*9798*/8415/* 2646 */, /*9799*/8416/* 2647 */,/*9800*/8417/* 2648 */,/*9801*/8418/* 2649 */,/*9802*/8419/* 264A */,/*9803*/8420/* 264B */, /*9804*/8421/* 264C */,/*9805*/8422/* 264D */,/*9806*/8423/* 264E */,/*9807*/8424/* 264F */,/*9808*/8425/* 2650 */, /*9809*/8426/* 2651 */,/*9810*/8427/* 2652 */,/*9811*/8428/* 2653 */,/*9812*/8429/* 2654 */,/*9813*/8430/* 2655 */, /*9814*/8431/* 2656 */,/*9815*/8432/* 2657 */,/*9816*/8433/* 2658 */,/*9817*/8434/* 2659 */,/*9818*/8435/* 265A */, /*9819*/8436/* 265B */,/*9820*/8437/* 265C */,/*9821*/8438/* 265D */,/*9822*/8439/* 265E */,/*9823*/8440/* 265F */, /*9824*/8441/* 2660 */,/*9825*/8442/* 2661 */,/*9826*/8443/* 2662 */,/*9827*/8444/* 2663 */,/*9828*/8445/* 2664 */, /*9829*/8446/* 2665 */,/*9830*/8447/* 2666 */,/*9831*/8448/* 2667 */,/*9832*/8449/* 2668 */,/*9833*/8450/* 2669 */, /*9834*/8451/* 266A */,/*9835*/8452/* 266B */,/*9836*/8453/* 266C */,/*9837*/8454/* 266D */,/*9838*/8455/* 266E */, /*9839*/8456/* 266F */,/*9840*/8457/* 2670 */,/*9841*/8458/* 2671 */,/*9842*/8459/* 2672 */,/*9843*/8460/* 2673 */, /*9844*/8461/* 2674 */,/*9845*/8462/* 2675 */,/*9846*/8463/* 2676 */,/*9847*/8464/* 2677 */,/*9848*/8465/* 2678 */, /*9849*/8466/* 2679 */,/*9850*/8467/* 267A */,/*9851*/8468/* 267B */,/*9852*/8469/* 267C */,/*9853*/8470/* 267D */, /*9854*/8471/* 267E */,/*9855*/8472/* 267F */,/*9856*/8473/* 2680 */,/*9857*/8474/* 2681 */,/*9858*/8475/* 2682 */, /*9859*/8476/* 2683 */,/*9860*/8477/* 2684 */,/*9861*/8478/* 2685 */,/*9862*/8479/* 2686 */,/*9863*/8480/* 2687 */, /*9864*/8481/* 2688 */,/*9865*/8482/* 2689 */,/*9866*/8483/* 268A */,/*9867*/8484/* 268B */,/*9868*/8485/* 268C */, /*9869*/8486/* 268D */,/*9870*/8487/* 268E */,/*9871*/8488/* 268F */,/*9872*/8489/* 2690 */,/*9873*/8490/* 2691 */, /*9874*/8491/* 2692 */,/*9875*/8492/* 2693 */,/*9876*/8493/* 2694 */,/*9877*/8494/* 2695 */,/*9878*/8495/* 2696 */, /*9879*/8496/* 2697 */,/*9880*/8497/* 2698 */,/*9881*/8498/* 2699 */,/*9882*/8499/* 269A */,/*9883*/8500/* 269B */, /*9884*/8501/* 269C */,/*9885*/8502/* 269D */,/*9886*/8503/* 269E */,/*9887*/8504/* 269F */,/*9888*/8505/* 26A0 */, /*9889*/8506/* 26A1 */,/*9890*/8507/* 26A2 */,/*9891*/8508/* 26A3 */,/*9892*/8509/* 26A4 */,/*9893*/8510/* 26A5 */, /*9894*/8511/* 26A6 */,/*9895*/8512/* 26A7 */,/*9896*/8513/* 26A8 */,/*9897*/8514/* 26A9 */,/*9898*/8515/* 26AA */, /*9899*/8516/* 26AB */,/*9900*/8517/* 26AC */,/*9901*/8518/* 26AD */,/*9902*/8519/* 26AE */,/*9903*/8520/* 26AF */, /*9904*/8521/* 26B0 */,/*9905*/8522/* 26B1 */,/*9906*/8523/* 26B2 */,/*9907*/8524/* 26B3 */,/*9908*/8525/* 26B4 */, /*9909*/8526/* 26B5 */,/*9910*/8527/* 26B6 */,/*9911*/8528/* 26B7 */,/*9912*/8529/* 26B8 */,/*9913*/8530/* 26B9 */, /*9914*/8531/* 26BA */,/*9915*/8532/* 26BB */,/*9916*/8533/* 26BC */,/*9917*/8534/* 26BD */,/*9918*/8535/* 26BE */, /*9919*/8536/* 26BF */,/*9920*/8537/* 26C0 */,/*9921*/8538/* 26C1 */,/*9922*/8539/* 26C2 */,/*9923*/8540/* 26C3 */, /*9924*/8541/* 26C4 */,/*9925*/8542/* 26C5 */,/*9926*/8543/* 26C6 */,/*9927*/8544/* 26C7 */,/*9928*/8545/* 26C8 */, /*9929*/8546/* 26C9 */,/*9930*/8547/* 26CA */,/*9931*/8548/* 26CB */,/*9932*/8549/* 26CC */,/*9933*/8550/* 26CD */, /*9934*/8551/* 26CE */,/*9935*/8552/* 26CF */,/*9936*/8553/* 26D0 */,/*9937*/8554/* 26D1 */,/*9938*/8555/* 26D2 */, /*9939*/8556/* 26D3 */,/*9940*/8557/* 26D4 */,/*9941*/8558/* 26D5 */,/*9942*/8559/* 26D6 */,/*9943*/8560/* 26D7 */, /*9944*/8561/* 26D8 */,/*9945*/8562/* 26D9 */,/*9946*/8563/* 26DA */,/*9947*/8564/* 26DB */,/*9948*/8565/* 26DC */, /*9949*/8566/* 26DD */,/*9950*/8567/* 26DE */,/*9951*/8568/* 26DF */,/*9952*/8569/* 26E0 */,/*9953*/8570/* 26E1 */, /*9954*/8571/* 26E2 */,/*9955*/8572/* 26E3 */,/*9956*/8573/* 26E4 */,/*9957*/8574/* 26E5 */,/*9958*/8575/* 26E6 */, /*9959*/8576/* 26E7 */,/*9960*/8577/* 26E8 */,/*9961*/8578/* 26E9 */,/*9962*/8579/* 26EA */,/*9963*/8580/* 26EB */, /*9964*/8581/* 26EC */,/*9965*/8582/* 26ED */,/*9966*/8583/* 26EE */,/*9967*/8584/* 26EF */,/*9968*/8585/* 26F0 */, /*9969*/8586/* 26F1 */,/*9970*/8587/* 26F2 */,/*9971*/8588/* 26F3 */,/*9972*/8589/* 26F4 */,/*9973*/8590/* 26F5 */, /*9974*/8591/* 26F6 */,/*9975*/8592/* 26F7 */,/*9976*/8593/* 26F8 */,/*9977*/8594/* 26F9 */,/*9978*/8595/* 26FA */, /*9979*/8596/* 26FB */,/*9980*/8597/* 26FC */,/*9981*/8598/* 26FD */,/*9982*/8599/* 26FE */,/*9983*/8600/* 26FF */, /*9984*/8601/* 2700 */,/*9985*/8602/* 2701 */,/*9986*/8603/* 2702 */,/*9987*/8604/* 2703 */,/*9988*/8605/* 2704 */, /*9989*/8606/* 2705 */,/*9990*/8607/* 2706 */,/*9991*/8608/* 2707 */,/*9992*/8609/* 2708 */,/*9993*/8610/* 2709 */, /*9994*/8611/* 270A */,/*9995*/8612/* 270B */,/*9996*/8613/* 270C */,/*9997*/8614/* 270D */,/*9998*/8615/* 270E */, /*9999*/8616/* 270F */,/*10000*/8617/* 2710 */,/*10001*/8618/* 2711 */,/*10002*/8619/* 2712 */,/*10003*/8620/* 2713 */, /*10004*/8621/* 2714 */,/*10005*/8622/* 2715 */,/*10006*/8623/* 2716 */,/*10007*/8624/* 2717 */,/*10008*/8625/* 2718 */, /*10009*/8626/* 2719 */,/*10010*/8627/* 271A */,/*10011*/8628/* 271B */,/*10012*/8629/* 271C */,/*10013*/8630/* 271D */, /*10014*/8631/* 271E */,/*10015*/8632/* 271F */,/*10016*/8633/* 2720 */,/*10017*/8634/* 2721 */,/*10018*/8635/* 2722 */, /*10019*/8636/* 2723 */,/*10020*/8637/* 2724 */,/*10021*/8638/* 2725 */,/*10022*/8639/* 2726 */,/*10023*/8640/* 2727 */, /*10024*/8641/* 2728 */,/*10025*/8642/* 2729 */,/*10026*/8643/* 272A */,/*10027*/8644/* 272B */,/*10028*/8645/* 272C */, /*10029*/8646/* 272D */,/*10030*/8647/* 272E */,/*10031*/8648/* 272F */,/*10032*/8649/* 2730 */,/*10033*/8650/* 2731 */, /*10034*/8651/* 2732 */,/*10035*/8652/* 2733 */,/*10036*/8653/* 2734 */,/*10037*/8654/* 2735 */,/*10038*/8655/* 2736 */, /*10039*/8656/* 2737 */,/*10040*/8657/* 2738 */,/*10041*/8658/* 2739 */,/*10042*/8659/* 273A */,/*10043*/8660/* 273B */, /*10044*/8661/* 273C */,/*10045*/8662/* 273D */,/*10046*/8663/* 273E */,/*10047*/8664/* 273F */,/*10048*/8665/* 2740 */, /*10049*/8666/* 2741 */,/*10050*/8667/* 2742 */,/*10051*/8668/* 2743 */,/*10052*/8669/* 2744 */,/*10053*/8670/* 2745 */, /*10054*/8671/* 2746 */,/*10055*/8672/* 2747 */,/*10056*/8673/* 2748 */,/*10057*/8674/* 2749 */,/*10058*/8675/* 274A */, /*10059*/8676/* 274B */,/*10060*/8677/* 274C */,/*10061*/8678/* 274D */,/*10062*/8679/* 274E */,/*10063*/8680/* 274F */, /*10064*/8681/* 2750 */,/*10065*/8682/* 2751 */,/*10066*/8683/* 2752 */,/*10067*/8684/* 2753 */,/*10068*/8685/* 2754 */, /*10069*/8686/* 2755 */,/*10070*/8687/* 2756 */,/*10071*/8688/* 2757 */,/*10072*/8689/* 2758 */,/*10073*/8690/* 2759 */, /*10074*/8691/* 275A */,/*10075*/8692/* 275B */,/*10076*/8693/* 275C */,/*10077*/8694/* 275D */,/*10078*/8695/* 275E */, /*10079*/8696/* 275F */,/*10080*/8697/* 2760 */,/*10081*/8698/* 2761 */,/*10082*/8699/* 2762 */,/*10083*/8700/* 2763 */, /*10084*/8701/* 2764 */,/*10085*/8702/* 2765 */,/*10086*/8703/* 2766 */,/*10087*/8704/* 2767 */,/*10088*/8705/* 2768 */, /*10089*/8706/* 2769 */,/*10090*/8707/* 276A */,/*10091*/8708/* 276B */,/*10092*/8709/* 276C */,/*10093*/8710/* 276D */, /*10094*/8711/* 276E */,/*10095*/8712/* 276F */,/*10096*/8713/* 2770 */,/*10097*/8714/* 2771 */,/*10098*/8715/* 2772 */, /*10099*/8716/* 2773 */,/*10100*/8717/* 2774 */,/*10101*/8718/* 2775 */,/*10102*/8719/* 2776 */,/*10103*/8720/* 2777 */, /*10104*/8721/* 2778 */,/*10105*/8722/* 2779 */,/*10106*/8723/* 277A */,/*10107*/8724/* 277B */,/*10108*/8725/* 277C */, /*10109*/8726/* 277D */,/*10110*/8727/* 277E */,/*10111*/8728/* 277F */,/*10112*/8729/* 2780 */,/*10113*/8730/* 2781 */, /*10114*/8731/* 2782 */,/*10115*/8732/* 2783 */,/*10116*/8733/* 2784 */,/*10117*/8734/* 2785 */,/*10118*/8735/* 2786 */, /*10119*/8736/* 2787 */,/*10120*/8737/* 2788 */,/*10121*/8738/* 2789 */,/*10122*/8729/* 278A */,/*10123*/8730/* 278B */, /*10124*/8731/* 278C */,/*10125*/8732/* 278D */,/*10126*/8733/* 278E */,/*10127*/8734/* 278F */,/*10128*/8735/* 2790 */, /*10129*/8736/* 2791 */,/*10130*/8737/* 2792 */,/*10131*/8738/* 2793 */,/*10132*/8739/* 2794 */,/*10133*/8740/* 2795 */, /*10134*/8741/* 2796 */,/*10135*/8742/* 2797 */,/*10136*/8743/* 2798 */,/*10137*/8744/* 2799 */,/*10138*/8745/* 279A */, /*10139*/8746/* 279B */,/*10140*/8747/* 279C */,/*10141*/8748/* 279D */,/*10142*/8749/* 279E */,/*10143*/8750/* 279F */, /*10144*/8751/* 27A0 */,/*10145*/8752/* 27A1 */,/*10146*/8753/* 27A2 */,/*10147*/8754/* 27A3 */,/*10148*/8755/* 27A4 */, /*10149*/8756/* 27A5 */,/*10150*/8757/* 27A6 */,/*10151*/8758/* 27A7 */,/*10152*/8759/* 27A8 */,/*10153*/8760/* 27A9 */, /*10154*/8761/* 27AA */,/*10155*/8762/* 27AB */,/*10156*/8763/* 27AC */,/*10157*/8764/* 27AD */,/*10158*/8765/* 27AE */, /*10159*/8766/* 27AF */,/*10160*/8767/* 27B0 */,/*10161*/8768/* 27B1 */,/*10162*/8769/* 27B2 */,/*10163*/8770/* 27B3 */, /*10164*/8771/* 27B4 */,/*10165*/8772/* 27B5 */,/*10166*/8773/* 27B6 */,/*10167*/8774/* 27B7 */,/*10168*/8775/* 27B8 */, /*10169*/8776/* 27B9 */,/*10170*/8777/* 27BA */,/*10171*/8778/* 27BB */,/*10172*/8779/* 27BC */,/*10173*/8780/* 27BD */, /*10174*/8781/* 27BE */,/*10175*/8782/* 27BF */,/*10176*/8783/* 27C0 */,/*10177*/8784/* 27C1 */,/*10178*/8785/* 27C2 */, /*10179*/8786/* 27C3 */,/*10180*/8787/* 27C4 */,/*10181*/8788/* 27C5 */,/*10182*/8789/* 27C6 */,/*10183*/8790/* 27C7 */, /*10184*/8791/* 27C8 */,/*10185*/8792/* 27C9 */,/*10186*/8793/* 27CA */,/*10187*/8794/* 27CB */,/*10188*/8795/* 27CC */, /*10189*/8796/* 27CD */,/*10190*/8797/* 27CE */,/*10191*/8798/* 27CF */,/*10192*/8799/* 27D0 */,/*10193*/8800/* 27D1 */, /*10194*/8801/* 27D2 */,/*10195*/8802/* 27D3 */,/*10196*/8803/* 27D4 */,/*10197*/8804/* 27D5 */,/*10198*/8805/* 27D6 */, /*10199*/8806/* 27D7 */,/*10200*/8807/* 27D8 */,/*10201*/8808/* 27D9 */,/*10202*/8809/* 27DA */,/*10203*/8810/* 27DB */, /*10204*/8811/* 27DC */,/*10205*/8812/* 27DD */,/*10206*/8813/* 27DE */,/*10207*/8814/* 27DF */,/*10208*/8815/* 27E0 */, /*10209*/8816/* 27E1 */,/*10210*/8817/* 27E2 */,/*10211*/8818/* 27E3 */,/*10212*/8819/* 27E4 */,/*10213*/8820/* 27E5 */, /*10214*/8821/* 27E6 */,/*10215*/8822/* 27E7 */,/*10216*/8823/* 27E8 */,/*10217*/8824/* 27E9 */,/*10218*/8825/* 27EA */, /*10219*/8826/* 27EB */,/*10220*/8827/* 27EC */,/*10221*/8828/* 27ED */,/*10222*/8829/* 27EE */,/*10223*/8830/* 27EF */, /*10224*/8831/* 27F0 */,/*10225*/8832/* 27F1 */,/*10226*/8833/* 27F2 */,/*10227*/8834/* 27F3 */,/*10228*/8835/* 27F4 */, /*10229*/8836/* 27F5 */,/*10230*/8837/* 27F6 */,/*10231*/8838/* 27F7 */,/*10232*/8839/* 27F8 */,/*10233*/8840/* 27F9 */, /*10234*/8841/* 27FA */,/*10235*/8842/* 27FB */,/*10236*/8843/* 27FC */,/*10237*/8844/* 27FD */,/*10238*/8845/* 27FE */, /*10239*/8846/* 27FF */,/*10240*/8847/* 2800 */,/*10241*/8848/* 2801 */,/*10242*/8849/* 2802 */,/*10243*/8850/* 2803 */, /*10244*/8851/* 2804 */,/*10245*/8852/* 2805 */,/*10246*/8853/* 2806 */,/*10247*/8854/* 2807 */,/*10248*/8855/* 2808 */, /*10249*/8856/* 2809 */,/*10250*/8857/* 280A */,/*10251*/8858/* 280B */,/*10252*/8859/* 280C */,/*10253*/8860/* 280D */, /*10254*/8861/* 280E */,/*10255*/8862/* 280F */,/*10256*/8863/* 2810 */,/*10257*/8864/* 2811 */,/*10258*/8865/* 2812 */, /*10259*/8866/* 2813 */,/*10260*/8867/* 2814 */,/*10261*/8868/* 2815 */,/*10262*/8869/* 2816 */,/*10263*/8870/* 2817 */, /*10264*/8871/* 2818 */,/*10265*/8872/* 2819 */,/*10266*/8873/* 281A */,/*10267*/8874/* 281B */,/*10268*/8875/* 281C */, /*10269*/8876/* 281D */,/*10270*/8877/* 281E */,/*10271*/8878/* 281F */,/*10272*/8879/* 2820 */,/*10273*/8880/* 2821 */, /*10274*/8881/* 2822 */,/*10275*/8882/* 2823 */,/*10276*/8883/* 2824 */,/*10277*/8884/* 2825 */,/*10278*/8885/* 2826 */, /*10279*/8886/* 2827 */,/*10280*/8887/* 2828 */,/*10281*/8888/* 2829 */,/*10282*/8889/* 282A */,/*10283*/8890/* 282B */, /*10284*/8891/* 282C */,/*10285*/8892/* 282D */,/*10286*/8893/* 282E */,/*10287*/8894/* 282F */,/*10288*/8895/* 2830 */, /*10289*/8896/* 2831 */,/*10290*/8897/* 2832 */,/*10291*/8898/* 2833 */,/*10292*/8899/* 2834 */,/*10293*/8900/* 2835 */, /*10294*/8901/* 2836 */,/*10295*/8902/* 2837 */,/*10296*/8903/* 2838 */,/*10297*/8904/* 2839 */,/*10298*/8905/* 283A */, /*10299*/8906/* 283B */,/*10300*/8907/* 283C */,/*10301*/8908/* 283D */,/*10302*/8909/* 283E */,/*10303*/8910/* 283F */, /*10304*/8911/* 2840 */,/*10305*/8912/* 2841 */,/*10306*/8913/* 2842 */,/*10307*/8914/* 2843 */,/*10308*/8915/* 2844 */, /*10309*/8916/* 2845 */,/*10310*/8917/* 2846 */,/*10311*/8918/* 2847 */,/*10312*/8919/* 2848 */,/*10313*/8920/* 2849 */, /*10314*/8921/* 284A */,/*10315*/8922/* 284B */,/*10316*/8923/* 284C */,/*10317*/8924/* 284D */,/*10318*/8925/* 284E */, /*10319*/8926/* 284F */,/*10320*/8927/* 2850 */,/*10321*/8928/* 2851 */,/*10322*/8929/* 2852 */,/*10323*/8930/* 2853 */, /*10324*/8931/* 2854 */,/*10325*/8932/* 2855 */,/*10326*/8933/* 2856 */,/*10327*/8934/* 2857 */,/*10328*/8935/* 2858 */, /*10329*/8936/* 2859 */,/*10330*/8937/* 285A */,/*10331*/8938/* 285B */,/*10332*/8939/* 285C */,/*10333*/8940/* 285D */, /*10334*/8941/* 285E */,/*10335*/8942/* 285F */,/*10336*/8943/* 2860 */,/*10337*/8944/* 2861 */,/*10338*/8945/* 2862 */, /*10339*/8946/* 2863 */,/*10340*/8947/* 2864 */,/*10341*/8948/* 2865 */,/*10342*/8949/* 2866 */,/*10343*/8950/* 2867 */, /*10344*/8951/* 2868 */,/*10345*/8952/* 2869 */,/*10346*/8953/* 286A */,/*10347*/8954/* 286B */,/*10348*/8955/* 286C */, /*10349*/8956/* 286D */,/*10350*/8957/* 286E */,/*10351*/8958/* 286F */,/*10352*/8959/* 2870 */,/*10353*/8960/* 2871 */, /*10354*/8961/* 2872 */,/*10355*/8962/* 2873 */,/*10356*/8963/* 2874 */,/*10357*/8964/* 2875 */,/*10358*/8965/* 2876 */, /*10359*/8966/* 2877 */,/*10360*/8967/* 2878 */,/*10361*/8968/* 2879 */,/*10362*/8969/* 287A */,/*10363*/8970/* 287B */, /*10364*/8971/* 287C */,/*10365*/8972/* 287D */,/*10366*/8973/* 287E */,/*10367*/8974/* 287F */,/*10368*/8975/* 2880 */, /*10369*/8976/* 2881 */,/*10370*/8977/* 2882 */,/*10371*/8978/* 2883 */,/*10372*/8979/* 2884 */,/*10373*/8980/* 2885 */, /*10374*/8981/* 2886 */,/*10375*/8982/* 2887 */,/*10376*/8983/* 2888 */,/*10377*/8984/* 2889 */,/*10378*/8985/* 288A */, /*10379*/8986/* 288B */,/*10380*/8987/* 288C */,/*10381*/8988/* 288D */,/*10382*/8989/* 288E */,/*10383*/8990/* 288F */, /*10384*/8991/* 2890 */,/*10385*/8992/* 2891 */,/*10386*/8993/* 2892 */,/*10387*/8994/* 2893 */,/*10388*/8995/* 2894 */, /*10389*/8996/* 2895 */,/*10390*/8997/* 2896 */,/*10391*/8998/* 2897 */,/*10392*/8999/* 2898 */,/*10393*/9000/* 2899 */, /*10394*/9001/* 289A */,/*10395*/9002/* 289B */,/*10396*/9003/* 289C */,/*10397*/9004/* 289D */,/*10398*/9005/* 289E */, /*10399*/9006/* 289F */,/*10400*/9007/* 28A0 */,/*10401*/9008/* 28A1 */,/*10402*/9009/* 28A2 */,/*10403*/9010/* 28A3 */, /*10404*/9011/* 28A4 */,/*10405*/9012/* 28A5 */,/*10406*/9013/* 28A6 */,/*10407*/9014/* 28A7 */,/*10408*/9015/* 28A8 */, /*10409*/9016/* 28A9 */,/*10410*/9017/* 28AA */,/*10411*/9018/* 28AB */,/*10412*/9019/* 28AC */,/*10413*/9020/* 28AD */, /*10414*/9021/* 28AE */,/*10415*/9022/* 28AF */,/*10416*/9023/* 28B0 */,/*10417*/9024/* 28B1 */,/*10418*/9025/* 28B2 */, /*10419*/9026/* 28B3 */,/*10420*/9027/* 28B4 */,/*10421*/9028/* 28B5 */,/*10422*/9029/* 28B6 */,/*10423*/9030/* 28B7 */, /*10424*/9031/* 28B8 */,/*10425*/9032/* 28B9 */,/*10426*/9033/* 28BA */,/*10427*/9034/* 28BB */,/*10428*/9035/* 28BC */, /*10429*/9036/* 28BD */,/*10430*/9037/* 28BE */,/*10431*/9038/* 28BF */,/*10432*/9039/* 28C0 */,/*10433*/9040/* 28C1 */, /*10434*/9041/* 28C2 */,/*10435*/9042/* 28C3 */,/*10436*/9043/* 28C4 */,/*10437*/9044/* 28C5 */,/*10438*/9045/* 28C6 */, /*10439*/9046/* 28C7 */,/*10440*/9047/* 28C8 */,/*10441*/9048/* 28C9 */,/*10442*/9049/* 28CA */,/*10443*/9050/* 28CB */, /*10444*/9051/* 28CC */,/*10445*/9052/* 28CD */,/*10446*/9053/* 28CE */,/*10447*/9054/* 28CF */,/*10448*/9055/* 28D0 */, /*10449*/9056/* 28D1 */,/*10450*/9057/* 28D2 */,/*10451*/9058/* 28D3 */,/*10452*/9059/* 28D4 */,/*10453*/9060/* 28D5 */, /*10454*/9061/* 28D6 */,/*10455*/9062/* 28D7 */,/*10456*/9063/* 28D8 */,/*10457*/9064/* 28D9 */,/*10458*/9065/* 28DA */, /*10459*/9066/* 28DB */,/*10460*/9067/* 28DC */,/*10461*/9068/* 28DD */,/*10462*/9069/* 28DE */,/*10463*/9070/* 28DF */, /*10464*/9071/* 28E0 */,/*10465*/9072/* 28E1 */,/*10466*/9073/* 28E2 */,/*10467*/9074/* 28E3 */,/*10468*/9075/* 28E4 */, /*10469*/9076/* 28E5 */,/*10470*/9077/* 28E6 */,/*10471*/9078/* 28E7 */,/*10472*/9079/* 28E8 */,/*10473*/9080/* 28E9 */, /*10474*/9081/* 28EA */,/*10475*/9082/* 28EB */,/*10476*/9083/* 28EC */,/*10477*/9084/* 28ED */,/*10478*/9085/* 28EE */, /*10479*/9086/* 28EF */,/*10480*/9087/* 28F0 */,/*10481*/9088/* 28F1 */,/*10482*/9089/* 28F2 */,/*10483*/9090/* 28F3 */, /*10484*/9091/* 28F4 */,/*10485*/9092/* 28F5 */,/*10486*/9093/* 28F6 */,/*10487*/9094/* 28F7 */,/*10488*/9095/* 28F8 */, /*10489*/9096/* 28F9 */,/*10490*/9097/* 28FA */,/*10491*/9098/* 28FB */,/*10492*/9099/* 28FC */,/*10493*/9100/* 28FD */, /*10494*/9101/* 28FE */,/*10495*/9102/* 28FF */,/*10496*/9103/* 2900 */,/*10497*/9104/* 2901 */,/*10498*/9105/* 2902 */, /*10499*/9106/* 2903 */,/*10500*/9107/* 2904 */,/*10501*/9108/* 2905 */,/*10502*/9109/* 2906 */,/*10503*/9110/* 2907 */, /*10504*/9111/* 2908 */,/*10505*/9112/* 2909 */,/*10506*/9113/* 290A */,/*10507*/9114/* 290B */,/*10508*/9115/* 290C */, /*10509*/9116/* 290D */,/*10510*/9117/* 290E */,/*10511*/9118/* 290F */,/*10512*/9119/* 2910 */,/*10513*/9120/* 2911 */, /*10514*/9121/* 2912 */,/*10515*/9122/* 2913 */,/*10516*/9123/* 2914 */,/*10517*/9124/* 2915 */,/*10518*/9125/* 2916 */, /*10519*/9126/* 2917 */,/*10520*/9127/* 2918 */,/*10521*/9128/* 2919 */,/*10522*/9129/* 291A */,/*10523*/9130/* 291B */, /*10524*/9131/* 291C */,/*10525*/9132/* 291D */,/*10526*/9133/* 291E */,/*10527*/9134/* 291F */,/*10528*/9135/* 2920 */, /*10529*/9136/* 2921 */,/*10530*/9137/* 2922 */,/*10531*/9138/* 2923 */,/*10532*/9139/* 2924 */,/*10533*/9140/* 2925 */, /*10534*/9141/* 2926 */,/*10535*/9142/* 2927 */,/*10536*/9143/* 2928 */,/*10537*/9144/* 2929 */,/*10538*/9145/* 292A */, /*10539*/9146/* 292B */,/*10540*/9147/* 292C */,/*10541*/9148/* 292D */,/*10542*/9149/* 292E */,/*10543*/9150/* 292F */, /*10544*/9151/* 2930 */,/*10545*/9152/* 2931 */,/*10546*/9153/* 2932 */,/*10547*/9154/* 2933 */,/*10548*/9155/* 2934 */, /*10549*/9156/* 2935 */,/*10550*/9157/* 2936 */,/*10551*/9158/* 2937 */,/*10552*/9159/* 2938 */,/*10553*/9160/* 2939 */, /*10554*/9161/* 293A */,/*10555*/9162/* 293B */,/*10556*/9163/* 293C */,/*10557*/9164/* 293D */,/*10558*/9165/* 293E */, /*10559*/9166/* 293F */,/*10560*/9167/* 2940 */,/*10561*/9168/* 2941 */,/*10562*/9169/* 2942 */,/*10563*/9170/* 2943 */, /*10564*/9171/* 2944 */,/*10565*/9172/* 2945 */,/*10566*/9173/* 2946 */,/*10567*/9174/* 2947 */,/*10568*/9175/* 2948 */, /*10569*/9176/* 2949 */,/*10570*/9177/* 294A */,/*10571*/9178/* 294B */,/*10572*/9179/* 294C */,/*10573*/9180/* 294D */, /*10574*/9181/* 294E */,/*10575*/9182/* 294F */,/*10576*/9183/* 2950 */,/*10577*/9184/* 2951 */,/*10578*/9185/* 2952 */, /*10579*/9186/* 2953 */,/*10580*/9187/* 2954 */,/*10581*/9188/* 2955 */,/*10582*/9189/* 2956 */,/*10583*/9190/* 2957 */, /*10584*/9191/* 2958 */,/*10585*/9192/* 2959 */,/*10586*/9193/* 295A */,/*10587*/9194/* 295B */,/*10588*/9195/* 295C */, /*10589*/9196/* 295D */,/*10590*/9197/* 295E */,/*10591*/9198/* 295F */,/*10592*/9199/* 2960 */,/*10593*/9200/* 2961 */, /*10594*/9201/* 2962 */,/*10595*/9202/* 2963 */,/*10596*/9203/* 2964 */,/*10597*/9204/* 2965 */,/*10598*/9205/* 2966 */, /*10599*/9206/* 2967 */,/*10600*/9207/* 2968 */,/*10601*/9208/* 2969 */,/*10602*/9209/* 296A */,/*10603*/9210/* 296B */, /*10604*/9211/* 296C */,/*10605*/9212/* 296D */,/*10606*/9213/* 296E */,/*10607*/9214/* 296F */,/*10608*/9215/* 2970 */, /*10609*/9216/* 2971 */,/*10610*/9217/* 2972 */,/*10611*/9218/* 2973 */,/*10612*/9219/* 2974 */,/*10613*/9220/* 2975 */, /*10614*/9221/* 2976 */,/*10615*/9222/* 2977 */,/*10616*/9223/* 2978 */,/*10617*/9224/* 2979 */,/*10618*/9225/* 297A */, /*10619*/9226/* 297B */,/*10620*/9227/* 297C */,/*10621*/9228/* 297D */,/*10622*/9229/* 297E */,/*10623*/9230/* 297F */, /*10624*/9231/* 2980 */,/*10625*/9232/* 2981 */,/*10626*/9233/* 2982 */,/*10627*/9234/* 2983 */,/*10628*/9235/* 2984 */, /*10629*/9236/* 2985 */,/*10630*/9237/* 2986 */,/*10631*/9238/* 2987 */,/*10632*/9239/* 2988 */,/*10633*/9240/* 2989 */, /*10634*/9241/* 298A */,/*10635*/9242/* 298B */,/*10636*/9243/* 298C */,/*10637*/9244/* 298D */,/*10638*/9245/* 298E */, /*10639*/9246/* 298F */,/*10640*/9247/* 2990 */,/*10641*/9248/* 2991 */,/*10642*/9249/* 2992 */,/*10643*/9250/* 2993 */, /*10644*/9251/* 2994 */,/*10645*/9252/* 2995 */,/*10646*/9253/* 2996 */,/*10647*/9254/* 2997 */,/*10648*/9255/* 2998 */, /*10649*/9256/* 2999 */,/*10650*/9257/* 299A */,/*10651*/9258/* 299B */,/*10652*/9259/* 299C */,/*10653*/9260/* 299D */, /*10654*/9261/* 299E */,/*10655*/9262/* 299F */,/*10656*/9263/* 29A0 */,/*10657*/9264/* 29A1 */,/*10658*/9265/* 29A2 */, /*10659*/9266/* 29A3 */,/*10660*/9267/* 29A4 */,/*10661*/9268/* 29A5 */,/*10662*/9269/* 29A6 */,/*10663*/9270/* 29A7 */, /*10664*/9271/* 29A8 */,/*10665*/9272/* 29A9 */,/*10666*/9273/* 29AA */,/*10667*/9274/* 29AB */,/*10668*/9275/* 29AC */, /*10669*/9276/* 29AD */,/*10670*/9277/* 29AE */,/*10671*/9278/* 29AF */,/*10672*/9279/* 29B0 */,/*10673*/9280/* 29B1 */, /*10674*/9281/* 29B2 */,/*10675*/9282/* 29B3 */,/*10676*/9283/* 29B4 */,/*10677*/9284/* 29B5 */,/*10678*/9285/* 29B6 */, /*10679*/9286/* 29B7 */,/*10680*/9287/* 29B8 */,/*10681*/9288/* 29B9 */,/*10682*/9289/* 29BA */,/*10683*/9290/* 29BB */, /*10684*/9291/* 29BC */,/*10685*/9292/* 29BD */,/*10686*/9293/* 29BE */,/*10687*/9294/* 29BF */,/*10688*/9295/* 29C0 */, /*10689*/9296/* 29C1 */,/*10690*/9297/* 29C2 */,/*10691*/9298/* 29C3 */,/*10692*/9299/* 29C4 */,/*10693*/9300/* 29C5 */, /*10694*/9301/* 29C6 */,/*10695*/9302/* 29C7 */,/*10696*/9303/* 29C8 */,/*10697*/9304/* 29C9 */,/*10698*/9305/* 29CA */, /*10699*/9306/* 29CB */,/*10700*/9307/* 29CC */,/*10701*/9308/* 29CD */,/*10702*/9309/* 29CE */,/*10703*/9310/* 29CF */, /*10704*/9311/* 29D0 */,/*10705*/9312/* 29D1 */,/*10706*/9313/* 29D2 */,/*10707*/9314/* 29D3 */,/*10708*/9315/* 29D4 */, /*10709*/9316/* 29D5 */,/*10710*/9317/* 29D6 */,/*10711*/9318/* 29D7 */,/*10712*/9319/* 29D8 */,/*10713*/9320/* 29D9 */, /*10714*/9321/* 29DA */,/*10715*/9322/* 29DB */,/*10716*/9323/* 29DC */,/*10717*/9324/* 29DD */,/*10718*/9325/* 29DE */, /*10719*/9326/* 29DF */,/*10720*/9327/* 29E0 */,/*10721*/9328/* 29E1 */,/*10722*/9329/* 29E2 */,/*10723*/9330/* 29E3 */, /*10724*/9331/* 29E4 */,/*10725*/9332/* 29E5 */,/*10726*/9333/* 29E6 */,/*10727*/9334/* 29E7 */,/*10728*/9335/* 29E8 */, /*10729*/9336/* 29E9 */,/*10730*/9337/* 29EA */,/*10731*/9338/* 29EB */,/*10732*/9339/* 29EC */,/*10733*/9340/* 29ED */, /*10734*/9341/* 29EE */,/*10735*/9342/* 29EF */,/*10736*/9343/* 29F0 */,/*10737*/9344/* 29F1 */,/*10738*/9345/* 29F2 */, /*10739*/9346/* 29F3 */,/*10740*/9347/* 29F4 */,/*10741*/9348/* 29F5 */,/*10742*/9349/* 29F6 */,/*10743*/9350/* 29F7 */, /*10744*/9351/* 29F8 */,/*10745*/9352/* 29F9 */,/*10746*/9353/* 29FA */,/*10747*/9354/* 29FB */,/*10748*/9355/* 29FC */, /*10749*/9356/* 29FD */,/*10750*/9357/* 29FE */,/*10751*/9358/* 29FF */,/*10752*/9359/* 2A00 */,/*10753*/9360/* 2A01 */, /*10754*/9361/* 2A02 */,/*10755*/9362/* 2A03 */,/*10756*/9363/* 2A04 */,/*10757*/9364/* 2A05 */,/*10758*/9365/* 2A06 */, /*10759*/9366/* 2A07 */,/*10760*/9367/* 2A08 */,/*10761*/9368/* 2A09 */,/*10762*/9369/* 2A0A */,/*10763*/9370/* 2A0B */, /*10764*/9371/* 2A0C */,/*10765*/9372/* 2A0D */,/*10766*/9373/* 2A0E */,/*10767*/9374/* 2A0F */,/*10768*/9375/* 2A10 */, /*10769*/9376/* 2A11 */,/*10770*/9377/* 2A12 */,/*10771*/9378/* 2A13 */,/*10772*/9379/* 2A14 */,/*10773*/9380/* 2A15 */, /*10774*/9381/* 2A16 */,/*10775*/9382/* 2A17 */,/*10776*/9383/* 2A18 */,/*10777*/9384/* 2A19 */,/*10778*/9385/* 2A1A */, /*10779*/9386/* 2A1B */,/*10780*/9387/* 2A1C */,/*10781*/9388/* 2A1D */,/*10782*/9389/* 2A1E */,/*10783*/9390/* 2A1F */, /*10784*/9391/* 2A20 */,/*10785*/9392/* 2A21 */,/*10786*/9393/* 2A22 */,/*10787*/9394/* 2A23 */,/*10788*/9395/* 2A24 */, /*10789*/9396/* 2A25 */,/*10790*/9397/* 2A26 */,/*10791*/9398/* 2A27 */,/*10792*/9399/* 2A28 */,/*10793*/9400/* 2A29 */, /*10794*/9401/* 2A2A */,/*10795*/9402/* 2A2B */,/*10796*/9403/* 2A2C */,/*10797*/9404/* 2A2D */,/*10798*/9405/* 2A2E */, /*10799*/9406/* 2A2F */,/*10800*/9407/* 2A30 */,/*10801*/9408/* 2A31 */,/*10802*/9409/* 2A32 */,/*10803*/9410/* 2A33 */, /*10804*/9411/* 2A34 */,/*10805*/9412/* 2A35 */,/*10806*/9413/* 2A36 */,/*10807*/9414/* 2A37 */,/*10808*/9415/* 2A38 */, /*10809*/9416/* 2A39 */,/*10810*/9417/* 2A3A */,/*10811*/9418/* 2A3B */,/*10812*/9419/* 2A3C */,/*10813*/9420/* 2A3D */, /*10814*/9421/* 2A3E */,/*10815*/9422/* 2A3F */,/*10816*/9423/* 2A40 */,/*10817*/9424/* 2A41 */,/*10818*/9425/* 2A42 */, /*10819*/9426/* 2A43 */,/*10820*/9427/* 2A44 */,/*10821*/9428/* 2A45 */,/*10822*/9429/* 2A46 */,/*10823*/9430/* 2A47 */, /*10824*/9431/* 2A48 */,/*10825*/9432/* 2A49 */,/*10826*/9433/* 2A4A */,/*10827*/9434/* 2A4B */,/*10828*/9435/* 2A4C */, /*10829*/9436/* 2A4D */,/*10830*/9437/* 2A4E */,/*10831*/9438/* 2A4F */,/*10832*/9439/* 2A50 */,/*10833*/9440/* 2A51 */, /*10834*/9441/* 2A52 */,/*10835*/9442/* 2A53 */,/*10836*/9443/* 2A54 */,/*10837*/9444/* 2A55 */,/*10838*/9445/* 2A56 */, /*10839*/9446/* 2A57 */,/*10840*/9447/* 2A58 */,/*10841*/9448/* 2A59 */,/*10842*/9449/* 2A5A */,/*10843*/9450/* 2A5B */, /*10844*/9451/* 2A5C */,/*10845*/9452/* 2A5D */,/*10846*/9453/* 2A5E */,/*10847*/9454/* 2A5F */,/*10848*/9455/* 2A60 */, /*10849*/9456/* 2A61 */,/*10850*/9457/* 2A62 */,/*10851*/9458/* 2A63 */,/*10852*/9459/* 2A64 */,/*10853*/9460/* 2A65 */, /*10854*/9461/* 2A66 */,/*10855*/9462/* 2A67 */,/*10856*/9463/* 2A68 */,/*10857*/9464/* 2A69 */,/*10858*/9465/* 2A6A */, /*10859*/9466/* 2A6B */,/*10860*/9467/* 2A6C */,/*10861*/9468/* 2A6D */,/*10862*/9469/* 2A6E */,/*10863*/9470/* 2A6F */, /*10864*/9471/* 2A70 */,/*10865*/9472/* 2A71 */,/*10866*/9473/* 2A72 */,/*10867*/9474/* 2A73 */,/*10868*/9475/* 2A74 */, /*10869*/9476/* 2A75 */,/*10870*/9477/* 2A76 */,/*10871*/9478/* 2A77 */,/*10872*/9479/* 2A78 */,/*10873*/9480/* 2A79 */, /*10874*/9481/* 2A7A */,/*10875*/9482/* 2A7B */,/*10876*/9483/* 2A7C */,/*10877*/9484/* 2A7D */,/*10878*/9485/* 2A7E */, /*10879*/9486/* 2A7F */,/*10880*/9487/* 2A80 */,/*10881*/9488/* 2A81 */,/*10882*/9489/* 2A82 */,/*10883*/9490/* 2A83 */, /*10884*/9491/* 2A84 */,/*10885*/9492/* 2A85 */,/*10886*/9493/* 2A86 */,/*10887*/9494/* 2A87 */,/*10888*/9495/* 2A88 */, /*10889*/9496/* 2A89 */,/*10890*/9497/* 2A8A */,/*10891*/9498/* 2A8B */,/*10892*/9499/* 2A8C */,/*10893*/9500/* 2A8D */, /*10894*/9501/* 2A8E */,/*10895*/9502/* 2A8F */,/*10896*/9503/* 2A90 */,/*10897*/9504/* 2A91 */,/*10898*/9505/* 2A92 */, /*10899*/9506/* 2A93 */,/*10900*/9507/* 2A94 */,/*10901*/9508/* 2A95 */,/*10902*/9509/* 2A96 */,/*10903*/9510/* 2A97 */, /*10904*/9511/* 2A98 */,/*10905*/9512/* 2A99 */,/*10906*/9513/* 2A9A */,/*10907*/9514/* 2A9B */,/*10908*/9515/* 2A9C */, /*10909*/9516/* 2A9D */,/*10910*/9517/* 2A9E */,/*10911*/9518/* 2A9F */,/*10912*/9519/* 2AA0 */,/*10913*/9520/* 2AA1 */, /*10914*/9521/* 2AA2 */,/*10915*/9522/* 2AA3 */,/*10916*/9523/* 2AA4 */,/*10917*/9524/* 2AA5 */,/*10918*/9525/* 2AA6 */, /*10919*/9526/* 2AA7 */,/*10920*/9527/* 2AA8 */,/*10921*/9528/* 2AA9 */,/*10922*/9529/* 2AAA */,/*10923*/9530/* 2AAB */, /*10924*/9531/* 2AAC */,/*10925*/9532/* 2AAD */,/*10926*/9533/* 2AAE */,/*10927*/9534/* 2AAF */,/*10928*/9535/* 2AB0 */, /*10929*/9536/* 2AB1 */,/*10930*/9537/* 2AB2 */,/*10931*/9538/* 2AB3 */,/*10932*/9539/* 2AB4 */,/*10933*/9540/* 2AB5 */, /*10934*/9541/* 2AB6 */,/*10935*/9542/* 2AB7 */,/*10936*/9543/* 2AB8 */,/*10937*/9544/* 2AB9 */,/*10938*/9545/* 2ABA */, /*10939*/9546/* 2ABB */,/*10940*/9547/* 2ABC */,/*10941*/9548/* 2ABD */,/*10942*/9549/* 2ABE */,/*10943*/9550/* 2ABF */, /*10944*/9551/* 2AC0 */,/*10945*/9552/* 2AC1 */,/*10946*/9553/* 2AC2 */,/*10947*/9554/* 2AC3 */,/*10948*/9555/* 2AC4 */, /*10949*/9556/* 2AC5 */,/*10950*/9557/* 2AC6 */,/*10951*/9558/* 2AC7 */,/*10952*/9559/* 2AC8 */,/*10953*/9560/* 2AC9 */, /*10954*/9561/* 2ACA */,/*10955*/9562/* 2ACB */,/*10956*/9563/* 2ACC */,/*10957*/9564/* 2ACD */,/*10958*/9565/* 2ACE */, /*10959*/9566/* 2ACF */,/*10960*/9567/* 2AD0 */,/*10961*/9568/* 2AD1 */,/*10962*/9569/* 2AD2 */,/*10963*/9570/* 2AD3 */, /*10964*/9571/* 2AD4 */,/*10965*/9572/* 2AD5 */,/*10966*/9573/* 2AD6 */,/*10967*/9574/* 2AD7 */,/*10968*/9575/* 2AD8 */, /*10969*/9576/* 2AD9 */,/*10970*/9577/* 2ADA */,/*10971*/9578/* 2ADB */,/*10972*/9579/* 2ADC */,/*10973*/9580/* 2ADD */, /*10974*/9581/* 2ADE */,/*10975*/9582/* 2ADF */,/*10976*/9583/* 2AE0 */,/*10977*/9584/* 2AE1 */,/*10978*/9585/* 2AE2 */, /*10979*/9586/* 2AE3 */,/*10980*/9587/* 2AE4 */,/*10981*/9588/* 2AE5 */,/*10982*/9589/* 2AE6 */,/*10983*/9590/* 2AE7 */, /*10984*/9591/* 2AE8 */,/*10985*/9592/* 2AE9 */,/*10986*/9593/* 2AEA */,/*10987*/9594/* 2AEB */,/*10988*/9595/* 2AEC */, /*10989*/9596/* 2AED */,/*10990*/9597/* 2AEE */,/*10991*/9598/* 2AEF */,/*10992*/9599/* 2AF0 */,/*10993*/9600/* 2AF1 */, /*10994*/9601/* 2AF2 */,/*10995*/9602/* 2AF3 */,/*10996*/9603/* 2AF4 */,/*10997*/9604/* 2AF5 */,/*10998*/9605/* 2AF6 */, /*10999*/9606/* 2AF7 */,/*11000*/9607/* 2AF8 */,/*11001*/9608/* 2AF9 */,/*11002*/9609/* 2AFA */,/*11003*/9610/* 2AFB */, /*11004*/9611/* 2AFC */,/*11005*/9612/* 2AFD */,/*11006*/9613/* 2AFE */,/*11007*/9614/* 2AFF */,/*11008*/9615/* 2B00 */, /*11009*/9616/* 2B01 */,/*11010*/9617/* 2B02 */,/*11011*/9618/* 2B03 */,/*11012*/9619/* 2B04 */,/*11013*/9620/* 2B05 */, /*11014*/9621/* 2B06 */,/*11015*/9622/* 2B07 */,/*11016*/9623/* 2B08 */,/*11017*/9624/* 2B09 */,/*11018*/9625/* 2B0A */, /*11019*/9626/* 2B0B */,/*11020*/9627/* 2B0C */,/*11021*/9628/* 2B0D */,/*11022*/9629/* 2B0E */,/*11023*/9630/* 2B0F */, /*11024*/9631/* 2B10 */,/*11025*/9632/* 2B11 */,/*11026*/9633/* 2B12 */,/*11027*/9634/* 2B13 */,/*11028*/9635/* 2B14 */, /*11029*/9636/* 2B15 */,/*11030*/9637/* 2B16 */,/*11031*/9638/* 2B17 */,/*11032*/9639/* 2B18 */,/*11033*/9640/* 2B19 */, /*11034*/9641/* 2B1A */,/*11035*/9642/* 2B1B */,/*11036*/9643/* 2B1C */,/*11037*/9644/* 2B1D */,/*11038*/9645/* 2B1E */, /*11039*/9646/* 2B1F */,/*11040*/9647/* 2B20 */,/*11041*/9648/* 2B21 */,/*11042*/9649/* 2B22 */,/*11043*/9650/* 2B23 */, /*11044*/9651/* 2B24 */,/*11045*/9652/* 2B25 */,/*11046*/9653/* 2B26 */,/*11047*/9654/* 2B27 */,/*11048*/9655/* 2B28 */, /*11049*/9656/* 2B29 */,/*11050*/9657/* 2B2A */,/*11051*/9658/* 2B2B */,/*11052*/9659/* 2B2C */,/*11053*/9660/* 2B2D */, /*11054*/9661/* 2B2E */,/*11055*/9662/* 2B2F */,/*11056*/9663/* 2B30 */,/*11057*/9664/* 2B31 */,/*11058*/9665/* 2B32 */, /*11059*/9666/* 2B33 */,/*11060*/9667/* 2B34 */,/*11061*/9668/* 2B35 */,/*11062*/9669/* 2B36 */,/*11063*/9670/* 2B37 */, /*11064*/9671/* 2B38 */,/*11065*/9672/* 2B39 */,/*11066*/9673/* 2B3A */,/*11067*/9674/* 2B3B */,/*11068*/9675/* 2B3C */, /*11069*/9676/* 2B3D */,/*11070*/9677/* 2B3E */,/*11071*/9678/* 2B3F */,/*11072*/9679/* 2B40 */,/*11073*/9680/* 2B41 */, /*11074*/9681/* 2B42 */,/*11075*/9682/* 2B43 */,/*11076*/9683/* 2B44 */,/*11077*/9684/* 2B45 */,/*11078*/9685/* 2B46 */, /*11079*/9686/* 2B47 */,/*11080*/9687/* 2B48 */,/*11081*/9688/* 2B49 */,/*11082*/9689/* 2B4A */,/*11083*/9690/* 2B4B */, /*11084*/9691/* 2B4C */,/*11085*/9692/* 2B4D */,/*11086*/9693/* 2B4E */,/*11087*/9694/* 2B4F */,/*11088*/9695/* 2B50 */, /*11089*/9696/* 2B51 */,/*11090*/9697/* 2B52 */,/*11091*/9698/* 2B53 */,/*11092*/9699/* 2B54 */,/*11093*/9700/* 2B55 */, /*11094*/9701/* 2B56 */,/*11095*/9702/* 2B57 */,/*11096*/9703/* 2B58 */,/*11097*/9704/* 2B59 */,/*11098*/9705/* 2B5A */, /*11099*/9706/* 2B5B */,/*11100*/9707/* 2B5C */,/*11101*/9708/* 2B5D */,/*11102*/9709/* 2B5E */,/*11103*/9710/* 2B5F */, /*11104*/9711/* 2B60 */,/*11105*/9712/* 2B61 */,/*11106*/9713/* 2B62 */,/*11107*/9714/* 2B63 */,/*11108*/9715/* 2B64 */, /*11109*/9716/* 2B65 */,/*11110*/9717/* 2B66 */,/*11111*/9718/* 2B67 */,/*11112*/9719/* 2B68 */,/*11113*/9720/* 2B69 */, /*11114*/9721/* 2B6A */,/*11115*/9722/* 2B6B */,/*11116*/9723/* 2B6C */,/*11117*/9724/* 2B6D */,/*11118*/9725/* 2B6E */, /*11119*/9726/* 2B6F */,/*11120*/9727/* 2B70 */,/*11121*/9728/* 2B71 */,/*11122*/9729/* 2B72 */,/*11123*/9730/* 2B73 */, 0,0,/*11126*/9731/* 2B76 */,/*11127*/9732/* 2B77 */,/*11128*/9733/* 2B78 */,/*11129*/9734/* 2B79 */, /*11130*/9735/* 2B7A */,/*11131*/9736/* 2B7B */,/*11132*/9737/* 2B7C */,/*11133*/9738/* 2B7D */,/*11134*/9739/* 2B7E */, /*11135*/9740/* 2B7F */,/*11136*/9741/* 2B80 */,/*11137*/9742/* 2B81 */,/*11138*/9743/* 2B82 */,/*11139*/9744/* 2B83 */, /*11140*/9745/* 2B84 */,/*11141*/9746/* 2B85 */,/*11142*/9747/* 2B86 */,/*11143*/9748/* 2B87 */,/*11144*/9749/* 2B88 */, /*11145*/9750/* 2B89 */,/*11146*/9751/* 2B8A */,/*11147*/9752/* 2B8B */,/*11148*/9753/* 2B8C */,/*11149*/9754/* 2B8D */, /*11150*/9755/* 2B8E */,/*11151*/9756/* 2B8F */,/*11152*/9757/* 2B90 */,/*11153*/9758/* 2B91 */,/*11154*/9759/* 2B92 */, /*11155*/9760/* 2B93 */,/*11156*/9761/* 2B94 */,/*11157*/9762/* 2B95 */,0,0,/*11160*/9763/* 2B98 */, /*11161*/9764/* 2B99 */,/*11162*/9765/* 2B9A */,/*11163*/9766/* 2B9B */,/*11164*/9767/* 2B9C */,/*11165*/9768/* 2B9D */, /*11166*/9769/* 2B9E */,/*11167*/9770/* 2B9F */,/*11168*/9771/* 2BA0 */,/*11169*/9772/* 2BA1 */,/*11170*/9773/* 2BA2 */, /*11171*/9774/* 2BA3 */,/*11172*/9775/* 2BA4 */,/*11173*/9776/* 2BA5 */,/*11174*/9777/* 2BA6 */,/*11175*/9778/* 2BA7 */, /*11176*/9779/* 2BA8 */,/*11177*/9780/* 2BA9 */,/*11178*/9781/* 2BAA */,/*11179*/9782/* 2BAB */,/*11180*/9783/* 2BAC */, /*11181*/9784/* 2BAD */,/*11182*/9785/* 2BAE */,/*11183*/9786/* 2BAF */,/*11184*/9787/* 2BB0 */,/*11185*/9788/* 2BB1 */, /*11186*/9789/* 2BB2 */,/*11187*/9790/* 2BB3 */,/*11188*/9791/* 2BB4 */,/*11189*/9792/* 2BB5 */,/*11190*/9793/* 2BB6 */, /*11191*/9794/* 2BB7 */,/*11192*/9795/* 2BB8 */,/*11193*/9796/* 2BB9 */,0,0,0,/*11197*/9797/* 2BBD */, /*11198*/9798/* 2BBE */,/*11199*/9799/* 2BBF */,/*11200*/9800/* 2BC0 */,/*11201*/9801/* 2BC1 */,/*11202*/9802/* 2BC2 */, /*11203*/9803/* 2BC3 */,/*11204*/9804/* 2BC4 */,/*11205*/9805/* 2BC5 */,/*11206*/9806/* 2BC6 */,/*11207*/9807/* 2BC7 */, /*11208*/9808/* 2BC8 */,0,/*11210*/9809/* 2BCA */,/*11211*/9810/* 2BCB */,/*11212*/9811/* 2BCC */, /*11213*/9812/* 2BCD */,/*11214*/9813/* 2BCE */,/*11215*/9814/* 2BCF */,/*11216*/9815/* 2BD0 */,/*11217*/9816/* 2BD1 */, /*11218*/9817/* 2BD2 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*11244*/9818/* 2BEC */, /*11245*/9819/* 2BED */,/*11246*/9820/* 2BEE */,/*11247*/9821/* 2BEF */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*11264*/9822/* 2C00 */,/*11265*/9823/* 2C01 */,/*11266*/9824/* 2C02 */,/*11267*/9825/* 2C03 */,/*11268*/9826/* 2C04 */, /*11269*/9827/* 2C05 */,/*11270*/9828/* 2C06 */,/*11271*/9829/* 2C07 */,/*11272*/9830/* 2C08 */,/*11273*/9831/* 2C09 */, /*11274*/9832/* 2C0A */,/*11275*/9833/* 2C0B */,/*11276*/9834/* 2C0C */,/*11277*/9835/* 2C0D */,/*11278*/9836/* 2C0E */, /*11279*/9837/* 2C0F */,/*11280*/9838/* 2C10 */,/*11281*/9839/* 2C11 */,/*11282*/9840/* 2C12 */,/*11283*/9841/* 2C13 */, /*11284*/9842/* 2C14 */,/*11285*/9843/* 2C15 */,/*11286*/9844/* 2C16 */,/*11287*/9845/* 2C17 */,/*11288*/9846/* 2C18 */, /*11289*/9847/* 2C19 */,/*11290*/9848/* 2C1A */,/*11291*/9849/* 2C1B */,/*11292*/9850/* 2C1C */,/*11293*/9851/* 2C1D */, /*11294*/9852/* 2C1E */,/*11295*/9853/* 2C1F */,/*11296*/9854/* 2C20 */,/*11297*/9855/* 2C21 */,/*11298*/9856/* 2C22 */, /*11299*/9857/* 2C23 */,/*11300*/9858/* 2C24 */,/*11301*/9859/* 2C25 */,/*11302*/9860/* 2C26 */,/*11303*/9861/* 2C27 */, /*11304*/9862/* 2C28 */,/*11305*/9863/* 2C29 */,/*11306*/9864/* 2C2A */,/*11307*/9865/* 2C2B */,/*11308*/9866/* 2C2C */, /*11309*/9867/* 2C2D */,/*11310*/9868/* 2C2E */,0,/*11312*/9869/* 2C30 */,/*11313*/9870/* 2C31 */, /*11314*/9871/* 2C32 */,/*11315*/9872/* 2C33 */,/*11316*/9873/* 2C34 */,/*11317*/9874/* 2C35 */,/*11318*/9875/* 2C36 */, /*11319*/9876/* 2C37 */,/*11320*/9877/* 2C38 */,/*11321*/9878/* 2C39 */,/*11322*/9879/* 2C3A */,/*11323*/9880/* 2C3B */, /*11324*/9881/* 2C3C */,/*11325*/9882/* 2C3D */,/*11326*/9883/* 2C3E */,/*11327*/9884/* 2C3F */,/*11328*/9885/* 2C40 */, /*11329*/9886/* 2C41 */,/*11330*/9887/* 2C42 */,/*11331*/9888/* 2C43 */,/*11332*/9889/* 2C44 */,/*11333*/9890/* 2C45 */, /*11334*/9891/* 2C46 */,/*11335*/9892/* 2C47 */,/*11336*/9893/* 2C48 */,/*11337*/9894/* 2C49 */,/*11338*/9895/* 2C4A */, /*11339*/9896/* 2C4B */,/*11340*/9897/* 2C4C */,/*11341*/9898/* 2C4D */,/*11342*/9899/* 2C4E */,/*11343*/9900/* 2C4F */, /*11344*/9901/* 2C50 */,/*11345*/9902/* 2C51 */,/*11346*/9903/* 2C52 */,/*11347*/9904/* 2C53 */,/*11348*/9905/* 2C54 */, /*11349*/9906/* 2C55 */,/*11350*/9907/* 2C56 */,/*11351*/9908/* 2C57 */,/*11352*/9909/* 2C58 */,/*11353*/9910/* 2C59 */, /*11354*/9911/* 2C5A */,/*11355*/9912/* 2C5B */,/*11356*/9913/* 2C5C */,/*11357*/9914/* 2C5D */,/*11358*/9915/* 2C5E */, 0,/*11360*/9916/* 2C60 */,/*11361*/9917/* 2C61 */,/*11362*/9918/* 2C62 */,/*11363*/9919/* 2C63 */, /*11364*/9920/* 2C64 */,/*11365*/9921/* 2C65 */,/*11366*/9922/* 2C66 */,/*11367*/9923/* 2C67 */,/*11368*/9924/* 2C68 */, /*11369*/9925/* 2C69 */,/*11370*/9926/* 2C6A */,/*11371*/9927/* 2C6B */,/*11372*/9928/* 2C6C */,/*11373*/9929/* 2C6D */, /*11374*/9930/* 2C6E */,/*11375*/9931/* 2C6F */,/*11376*/9932/* 2C70 */,/*11377*/9933/* 2C71 */,/*11378*/9934/* 2C72 */, /*11379*/9935/* 2C73 */,/*11380*/9936/* 2C74 */,/*11381*/9937/* 2C75 */,/*11382*/9938/* 2C76 */,/*11383*/9939/* 2C77 */, /*11384*/9940/* 2C78 */,/*11385*/9941/* 2C79 */,/*11386*/9942/* 2C7A */,/*11387*/9943/* 2C7B */,/*11388*/9944/* 2C7C */, /*11389*/9945/* 2C7D */,/*11390*/9946/* 2C7E */,/*11391*/9947/* 2C7F */,/*11392*/9948/* 2C80 */,/*11393*/9949/* 2C81 */, /*11394*/9950/* 2C82 */,/*11395*/9951/* 2C83 */,/*11396*/9952/* 2C84 */,/*11397*/9953/* 2C85 */,/*11398*/9954/* 2C86 */, /*11399*/9955/* 2C87 */,/*11400*/9956/* 2C88 */,/*11401*/9957/* 2C89 */,/*11402*/9958/* 2C8A */,/*11403*/9959/* 2C8B */, /*11404*/9960/* 2C8C */,/*11405*/9961/* 2C8D */,/*11406*/9962/* 2C8E */,/*11407*/9963/* 2C8F */,/*11408*/9964/* 2C90 */, /*11409*/9965/* 2C91 */,/*11410*/9966/* 2C92 */,/*11411*/9967/* 2C93 */,/*11412*/9968/* 2C94 */,/*11413*/9969/* 2C95 */, /*11414*/9970/* 2C96 */,/*11415*/9971/* 2C97 */,/*11416*/9972/* 2C98 */,/*11417*/9973/* 2C99 */,/*11418*/9974/* 2C9A */, /*11419*/9975/* 2C9B */,/*11420*/9976/* 2C9C */,/*11421*/9977/* 2C9D */,/*11422*/9978/* 2C9E */,/*11423*/9979/* 2C9F */, /*11424*/9980/* 2CA0 */,/*11425*/9981/* 2CA1 */,/*11426*/9982/* 2CA2 */,/*11427*/9983/* 2CA3 */,/*11428*/9984/* 2CA4 */, /*11429*/9985/* 2CA5 */,/*11430*/9986/* 2CA6 */,/*11431*/9987/* 2CA7 */,/*11432*/9988/* 2CA8 */,/*11433*/9989/* 2CA9 */, /*11434*/9990/* 2CAA */,/*11435*/9991/* 2CAB */,/*11436*/9992/* 2CAC */,/*11437*/9993/* 2CAD */,/*11438*/9994/* 2CAE */, /*11439*/9995/* 2CAF */,/*11440*/9996/* 2CB0 */,/*11441*/9997/* 2CB1 */,/*11442*/9998/* 2CB2 */,/*11443*/9999/* 2CB3 */, /*11444*/10000/* 2CB4 */,/*11445*/10001/* 2CB5 */,/*11446*/10002/* 2CB6 */,/*11447*/10003/* 2CB7 */, /*11448*/10004/* 2CB8 */,/*11449*/10005/* 2CB9 */,/*11450*/10006/* 2CBA */,/*11451*/10007/* 2CBB */, /*11452*/10008/* 2CBC */,/*11453*/10009/* 2CBD */,/*11454*/10010/* 2CBE */,/*11455*/10011/* 2CBF */, /*11456*/10012/* 2CC0 */,/*11457*/10013/* 2CC1 */,/*11458*/10014/* 2CC2 */,/*11459*/10015/* 2CC3 */, /*11460*/10016/* 2CC4 */,/*11461*/10017/* 2CC5 */,/*11462*/10018/* 2CC6 */,/*11463*/10019/* 2CC7 */, /*11464*/10020/* 2CC8 */,/*11465*/10021/* 2CC9 */,/*11466*/10022/* 2CCA */,/*11467*/10023/* 2CCB */, /*11468*/10024/* 2CCC */,/*11469*/10025/* 2CCD */,/*11470*/10026/* 2CCE */,/*11471*/10027/* 2CCF */, /*11472*/10028/* 2CD0 */,/*11473*/10029/* 2CD1 */,/*11474*/10030/* 2CD2 */,/*11475*/10031/* 2CD3 */, /*11476*/10032/* 2CD4 */,/*11477*/10033/* 2CD5 */,/*11478*/10034/* 2CD6 */,/*11479*/10035/* 2CD7 */, /*11480*/10036/* 2CD8 */,/*11481*/10037/* 2CD9 */,/*11482*/10038/* 2CDA */,/*11483*/10039/* 2CDB */, /*11484*/10040/* 2CDC */,/*11485*/10041/* 2CDD */,/*11486*/10042/* 2CDE */,/*11487*/10043/* 2CDF */, /*11488*/10044/* 2CE0 */,/*11489*/10045/* 2CE1 */,/*11490*/10046/* 2CE2 */,/*11491*/10047/* 2CE3 */, /*11492*/10048/* 2CE4 */,/*11493*/10049/* 2CE5 */,/*11494*/10050/* 2CE6 */,/*11495*/10051/* 2CE7 */, /*11496*/10052/* 2CE8 */,/*11497*/10053/* 2CE9 */,/*11498*/10054/* 2CEA */,/*11499*/10055/* 2CEB */, /*11500*/10056/* 2CEC */,/*11501*/10057/* 2CED */,/*11502*/10058/* 2CEE */,/*11503*/10059/* 2CEF */, /*11504*/10060/* 2CF0 */,/*11505*/10061/* 2CF1 */,/*11506*/10062/* 2CF2 */,/*11507*/10063/* 2CF3 */,0,0,0,0,0, /*11513*/10064/* 2CF9 */,/*11514*/10065/* 2CFA */,/*11515*/10066/* 2CFB */,/*11516*/10067/* 2CFC */, /*11517*/10068/* 2CFD */,/*11518*/10069/* 2CFE */,/*11519*/10070/* 2CFF */,/*11520*/10071/* 2D00 */, /*11521*/10072/* 2D01 */,/*11522*/10073/* 2D02 */,/*11523*/10074/* 2D03 */,/*11524*/10075/* 2D04 */, /*11525*/10076/* 2D05 */,/*11526*/10077/* 2D06 */,/*11527*/10078/* 2D07 */,/*11528*/10079/* 2D08 */, /*11529*/10080/* 2D09 */,/*11530*/10081/* 2D0A */,/*11531*/10082/* 2D0B */,/*11532*/10083/* 2D0C */, /*11533*/10084/* 2D0D */,/*11534*/10085/* 2D0E */,/*11535*/10086/* 2D0F */,/*11536*/10087/* 2D10 */, /*11537*/10088/* 2D11 */,/*11538*/10089/* 2D12 */,/*11539*/10090/* 2D13 */,/*11540*/10091/* 2D14 */, /*11541*/10092/* 2D15 */,/*11542*/10093/* 2D16 */,/*11543*/10094/* 2D17 */,/*11544*/10095/* 2D18 */, /*11545*/10096/* 2D19 */,/*11546*/10097/* 2D1A */,/*11547*/10098/* 2D1B */,/*11548*/10099/* 2D1C */, /*11549*/10100/* 2D1D */,/*11550*/10101/* 2D1E */,/*11551*/10102/* 2D1F */,/*11552*/10103/* 2D20 */, /*11553*/10104/* 2D21 */,/*11554*/10105/* 2D22 */,/*11555*/10106/* 2D23 */,/*11556*/10107/* 2D24 */, /*11557*/10108/* 2D25 */,0,/*11559*/10109/* 2D27 */,0,0,0,0,0,/*11565*/10110/* 2D2D */,0,0,/*11568*/10111/* 2D30 */, /*11569*/10112/* 2D31 */,/*11570*/10113/* 2D32 */,/*11571*/10114/* 2D33 */,/*11572*/10115/* 2D34 */, /*11573*/10116/* 2D35 */,/*11574*/10117/* 2D36 */,/*11575*/10118/* 2D37 */,/*11576*/10119/* 2D38 */, /*11577*/10120/* 2D39 */,/*11578*/10121/* 2D3A */,/*11579*/10122/* 2D3B */,/*11580*/10123/* 2D3C */, /*11581*/10124/* 2D3D */,/*11582*/10125/* 2D3E */,/*11583*/10126/* 2D3F */,/*11584*/10127/* 2D40 */, /*11585*/10128/* 2D41 */,/*11586*/10129/* 2D42 */,/*11587*/10130/* 2D43 */,/*11588*/10131/* 2D44 */, /*11589*/10132/* 2D45 */,/*11590*/10133/* 2D46 */,/*11591*/10134/* 2D47 */,/*11592*/10135/* 2D48 */, /*11593*/10136/* 2D49 */,/*11594*/10137/* 2D4A */,/*11595*/10138/* 2D4B */,/*11596*/10139/* 2D4C */, /*11597*/10140/* 2D4D */,/*11598*/10141/* 2D4E */,/*11599*/10142/* 2D4F */,/*11600*/10143/* 2D50 */, /*11601*/10144/* 2D51 */,/*11602*/10145/* 2D52 */,/*11603*/10146/* 2D53 */,/*11604*/10147/* 2D54 */, /*11605*/10148/* 2D55 */,/*11606*/10149/* 2D56 */,/*11607*/10150/* 2D57 */,/*11608*/10151/* 2D58 */, /*11609*/10152/* 2D59 */,/*11610*/10153/* 2D5A */,/*11611*/10154/* 2D5B */,/*11612*/10155/* 2D5C */, /*11613*/10156/* 2D5D */,/*11614*/10157/* 2D5E */,/*11615*/10158/* 2D5F */,/*11616*/10159/* 2D60 */, /*11617*/10160/* 2D61 */,/*11618*/10161/* 2D62 */,/*11619*/10162/* 2D63 */,/*11620*/10163/* 2D64 */, /*11621*/10164/* 2D65 */,/*11622*/10165/* 2D66 */,/*11623*/10166/* 2D67 */,0,0,0,0,0,0,0,/*11631*/10167/* 2D6F */, /*11632*/10168/* 2D70 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*11647*/10169/* 2D7F */,/*11648*/10170/* 2D80 */, /*11649*/10171/* 2D81 */,/*11650*/10172/* 2D82 */,/*11651*/10173/* 2D83 */,/*11652*/10174/* 2D84 */, /*11653*/10175/* 2D85 */,/*11654*/10176/* 2D86 */,/*11655*/10177/* 2D87 */,/*11656*/10178/* 2D88 */, /*11657*/10179/* 2D89 */,/*11658*/10180/* 2D8A */,/*11659*/10181/* 2D8B */,/*11660*/10182/* 2D8C */, /*11661*/10183/* 2D8D */,/*11662*/10184/* 2D8E */,/*11663*/10185/* 2D8F */,/*11664*/10186/* 2D90 */, /*11665*/10187/* 2D91 */,/*11666*/10188/* 2D92 */,/*11667*/10189/* 2D93 */,/*11668*/10190/* 2D94 */, /*11669*/10191/* 2D95 */,/*11670*/10192/* 2D96 */,0,0,0,0,0,0,0,0,0,/*11680*/10193/* 2DA0 */,/*11681*/10194/* 2DA1 */, /*11682*/10195/* 2DA2 */,/*11683*/10196/* 2DA3 */,/*11684*/10197/* 2DA4 */,/*11685*/10198/* 2DA5 */, /*11686*/10199/* 2DA6 */,0,/*11688*/10200/* 2DA8 */,/*11689*/10201/* 2DA9 */,/*11690*/10202/* 2DAA */, /*11691*/10203/* 2DAB */,/*11692*/10204/* 2DAC */,/*11693*/10205/* 2DAD */,/*11694*/10206/* 2DAE */,0, /*11696*/10207/* 2DB0 */,/*11697*/10208/* 2DB1 */,/*11698*/10209/* 2DB2 */,/*11699*/10210/* 2DB3 */, /*11700*/10211/* 2DB4 */,/*11701*/10212/* 2DB5 */,/*11702*/10213/* 2DB6 */,0,/*11704*/10214/* 2DB8 */, /*11705*/10215/* 2DB9 */,/*11706*/10216/* 2DBA */,/*11707*/10217/* 2DBB */,/*11708*/10218/* 2DBC */, /*11709*/10219/* 2DBD */,/*11710*/10220/* 2DBE */,0,/*11712*/10221/* 2DC0 */,/*11713*/10222/* 2DC1 */, /*11714*/10223/* 2DC2 */,/*11715*/10224/* 2DC3 */,/*11716*/10225/* 2DC4 */,/*11717*/10226/* 2DC5 */, /*11718*/10227/* 2DC6 */,0,/*11720*/10228/* 2DC8 */,/*11721*/10229/* 2DC9 */,/*11722*/10230/* 2DCA */, /*11723*/10231/* 2DCB */,/*11724*/10232/* 2DCC */,/*11725*/10233/* 2DCD */,/*11726*/10234/* 2DCE */,0, /*11728*/10235/* 2DD0 */,/*11729*/10236/* 2DD1 */,/*11730*/10237/* 2DD2 */,/*11731*/10238/* 2DD3 */, /*11732*/10239/* 2DD4 */,/*11733*/10240/* 2DD5 */,/*11734*/10241/* 2DD6 */,0,/*11736*/10242/* 2DD8 */, /*11737*/10243/* 2DD9 */,/*11738*/10244/* 2DDA */,/*11739*/10245/* 2DDB */,/*11740*/10246/* 2DDC */, /*11741*/10247/* 2DDD */,/*11742*/10248/* 2DDE */,0,/*11744*/10249/* 2DE0 */,/*11745*/10250/* 2DE1 */, /*11746*/10251/* 2DE2 */,/*11747*/10252/* 2DE3 */,/*11748*/10253/* 2DE4 */,/*11749*/10254/* 2DE5 */, /*11750*/10255/* 2DE6 */,/*11751*/10256/* 2DE7 */,/*11752*/10257/* 2DE8 */,/*11753*/10258/* 2DE9 */, /*11754*/10259/* 2DEA */,/*11755*/10260/* 2DEB */,/*11756*/10261/* 2DEC */,/*11757*/10262/* 2DED */, /*11758*/10263/* 2DEE */,/*11759*/10264/* 2DEF */,/*11760*/10265/* 2DF0 */,/*11761*/10266/* 2DF1 */, /*11762*/10267/* 2DF2 */,/*11763*/10268/* 2DF3 */,/*11764*/10269/* 2DF4 */,/*11765*/10270/* 2DF5 */, /*11766*/10271/* 2DF6 */,/*11767*/10272/* 2DF7 */,/*11768*/10273/* 2DF8 */,/*11769*/10274/* 2DF9 */, /*11770*/10275/* 2DFA */,/*11771*/10276/* 2DFB */,/*11772*/10277/* 2DFC */,/*11773*/10278/* 2DFD */, /*11774*/10279/* 2DFE */,/*11775*/10280/* 2DFF */,/*11776*/10281/* 2E00 */,/*11777*/10282/* 2E01 */, /*11778*/10283/* 2E02 */,/*11779*/10284/* 2E03 */,/*11780*/10285/* 2E04 */,/*11781*/10286/* 2E05 */, /*11782*/10287/* 2E06 */,/*11783*/10288/* 2E07 */,/*11784*/10289/* 2E08 */,/*11785*/10290/* 2E09 */, /*11786*/10291/* 2E0A */,/*11787*/10292/* 2E0B */,/*11788*/10293/* 2E0C */,/*11789*/10294/* 2E0D */, /*11790*/10295/* 2E0E */,/*11791*/10296/* 2E0F */,/*11792*/10297/* 2E10 */,/*11793*/10298/* 2E11 */, /*11794*/10299/* 2E12 */,/*11795*/10300/* 2E13 */,/*11796*/10301/* 2E14 */,/*11797*/10302/* 2E15 */, /*11798*/10303/* 2E16 */,/*11799*/10304/* 2E17 */,/*11800*/10305/* 2E18 */,/*11801*/10306/* 2E19 */, /*11802*/10307/* 2E1A */,/*11803*/10308/* 2E1B */,/*11804*/10309/* 2E1C */,/*11805*/10310/* 2E1D */, /*11806*/10311/* 2E1E */,/*11807*/10312/* 2E1F */,/*11808*/10313/* 2E20 */,/*11809*/10314/* 2E21 */, /*11810*/10315/* 2E22 */,/*11811*/10316/* 2E23 */,/*11812*/10317/* 2E24 */,/*11813*/10318/* 2E25 */, /*11814*/10319/* 2E26 */,/*11815*/10320/* 2E27 */,/*11816*/10321/* 2E28 */,/*11817*/10322/* 2E29 */, /*11818*/10323/* 2E2A */,/*11819*/10324/* 2E2B */,/*11820*/10325/* 2E2C */,/*11821*/10326/* 2E2D */, /*11822*/10327/* 2E2E */,/*11823*/10328/* 2E2F */,/*11824*/10329/* 2E30 */,/*11825*/10330/* 2E31 */, /*11826*/10331/* 2E32 */,/*11827*/10332/* 2E33 */,/*11828*/10333/* 2E34 */,/*11829*/10334/* 2E35 */, /*11830*/10335/* 2E36 */,/*11831*/10336/* 2E37 */,/*11832*/10337/* 2E38 */,/*11833*/10338/* 2E39 */, /*11834*/10339/* 2E3A */,/*11835*/10340/* 2E3B */,/*11836*/10341/* 2E3C */,/*11837*/10342/* 2E3D */, /*11838*/10343/* 2E3E */,/*11839*/10344/* 2E3F */,/*11840*/10345/* 2E40 */,/*11841*/10346/* 2E41 */, /*11842*/10347/* 2E42 */,/*11843*/10348/* 2E43 */,/*11844*/10349/* 2E44 */,/*11845*/10350/* 2E45 */, /*11846*/10351/* 2E46 */,/*11847*/10352/* 2E47 */,/*11848*/10353/* 2E48 */,/*11849*/10354/* 2E49 */,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*11904*/10355/* 2E80 */, /*11905*/10356/* 2E81 */,/*11906*/10357/* 2E82 */,/*11907*/10358/* 2E83 */,/*11908*/10359/* 2E84 */, /*11909*/10360/* 2E85 */,/*11910*/10361/* 2E86 */,/*11911*/10362/* 2E87 */,/*11912*/10363/* 2E88 */, /*11913*/10364/* 2E89 */,/*11914*/10365/* 2E8A */,/*11915*/10366/* 2E8B */,/*11916*/10367/* 2E8C */, /*11917*/10368/* 2E8D */,/*11918*/10369/* 2E8E */,/*11919*/10370/* 2E8F */,/*11920*/10371/* 2E90 */, /*11921*/10372/* 2E91 */,/*11922*/10373/* 2E92 */,/*11923*/10374/* 2E93 */,/*11924*/10375/* 2E94 */, /*11925*/10376/* 2E95 */,/*11926*/10377/* 2E96 */,/*11927*/10378/* 2E97 */,/*11928*/10379/* 2E98 */, /*11929*/10380/* 2E99 */,0,/*11931*/10381/* 2E9B */,/*11932*/10382/* 2E9C */,/*11933*/10383/* 2E9D */, /*11934*/10384/* 2E9E */,/*11935*/10385/* 2E9F */,/*11936*/10386/* 2EA0 */,/*11937*/10387/* 2EA1 */, /*11938*/10388/* 2EA2 */,/*11939*/10389/* 2EA3 */,/*11940*/10390/* 2EA4 */,/*11941*/10391/* 2EA5 */, /*11942*/10392/* 2EA6 */,/*11943*/10393/* 2EA7 */,/*11944*/10394/* 2EA8 */,/*11945*/10395/* 2EA9 */, /*11946*/10396/* 2EAA */,/*11947*/10397/* 2EAB */,/*11948*/10398/* 2EAC */,/*11949*/10399/* 2EAD */, /*11950*/10400/* 2EAE */,/*11951*/10401/* 2EAF */,/*11952*/10402/* 2EB0 */,/*11953*/10403/* 2EB1 */, /*11954*/10404/* 2EB2 */,/*11955*/10405/* 2EB3 */,/*11956*/10406/* 2EB4 */,/*11957*/10407/* 2EB5 */, /*11958*/10408/* 2EB6 */,/*11959*/10409/* 2EB7 */,/*11960*/10410/* 2EB8 */,/*11961*/10411/* 2EB9 */, /*11962*/10412/* 2EBA */,/*11963*/10413/* 2EBB */,/*11964*/10414/* 2EBC */,/*11965*/10415/* 2EBD */, /*11966*/10416/* 2EBE */,/*11967*/10417/* 2EBF */,/*11968*/10418/* 2EC0 */,/*11969*/10419/* 2EC1 */, /*11970*/10420/* 2EC2 */,/*11971*/10421/* 2EC3 */,/*11972*/10422/* 2EC4 */,/*11973*/10423/* 2EC5 */, /*11974*/10424/* 2EC6 */,/*11975*/10425/* 2EC7 */,/*11976*/10426/* 2EC8 */,/*11977*/10427/* 2EC9 */, /*11978*/10428/* 2ECA */,/*11979*/10429/* 2ECB */,/*11980*/10430/* 2ECC */,/*11981*/10431/* 2ECD */, /*11982*/10432/* 2ECE */,/*11983*/10433/* 2ECF */,/*11984*/10434/* 2ED0 */,/*11985*/10435/* 2ED1 */, /*11986*/10436/* 2ED2 */,/*11987*/10437/* 2ED3 */,/*11988*/10438/* 2ED4 */,/*11989*/10439/* 2ED5 */, /*11990*/10440/* 2ED6 */,/*11991*/10441/* 2ED7 */,/*11992*/10442/* 2ED8 */,/*11993*/10443/* 2ED9 */, /*11994*/10444/* 2EDA */,/*11995*/10445/* 2EDB */,/*11996*/10446/* 2EDC */,/*11997*/10447/* 2EDD */, /*11998*/10448/* 2EDE */,/*11999*/10449/* 2EDF */,/*12000*/10450/* 2EE0 */,/*12001*/10451/* 2EE1 */, /*12002*/10452/* 2EE2 */,/*12003*/10453/* 2EE3 */,/*12004*/10454/* 2EE4 */,/*12005*/10455/* 2EE5 */, /*12006*/10456/* 2EE6 */,/*12007*/10457/* 2EE7 */,/*12008*/10458/* 2EE8 */,/*12009*/10459/* 2EE9 */, /*12010*/10460/* 2EEA */,/*12011*/10461/* 2EEB */,/*12012*/10462/* 2EEC */,/*12013*/10463/* 2EED */, /*12014*/10464/* 2EEE */,/*12015*/10465/* 2EEF */,/*12016*/10466/* 2EF0 */,/*12017*/10467/* 2EF1 */, /*12018*/10468/* 2EF2 */,/*12019*/10469/* 2EF3 */,0,0,0,0,0,0,0,0,0,0,0,0,/*12032*/10470/* 2F00 */, /*12033*/10471/* 2F01 */,/*12034*/10472/* 2F02 */,/*12035*/10473/* 2F03 */,/*12036*/10474/* 2F04 */, /*12037*/10475/* 2F05 */,/*12038*/10476/* 2F06 */,/*12039*/10477/* 2F07 */,/*12040*/10478/* 2F08 */, /*12041*/10479/* 2F09 */,/*12042*/10480/* 2F0A */,/*12043*/10481/* 2F0B */,/*12044*/10482/* 2F0C */, /*12045*/10483/* 2F0D */,/*12046*/10484/* 2F0E */,/*12047*/10485/* 2F0F */,/*12048*/10486/* 2F10 */, /*12049*/10487/* 2F11 */,/*12050*/10488/* 2F12 */,/*12051*/10489/* 2F13 */,/*12052*/10490/* 2F14 */, /*12053*/10491/* 2F15 */,/*12054*/10492/* 2F16 */,/*12055*/10493/* 2F17 */,/*12056*/10494/* 2F18 */, /*12057*/10495/* 2F19 */,/*12058*/10496/* 2F1A */,/*12059*/10497/* 2F1B */,/*12060*/10498/* 2F1C */, /*12061*/10499/* 2F1D */,/*12062*/10500/* 2F1E */,/*12063*/10501/* 2F1F */,/*12064*/10502/* 2F20 */, /*12065*/10503/* 2F21 */,/*12066*/10504/* 2F22 */,/*12067*/10505/* 2F23 */,/*12068*/10506/* 2F24 */, /*12069*/10507/* 2F25 */,/*12070*/10508/* 2F26 */,/*12071*/10509/* 2F27 */,/*12072*/10510/* 2F28 */, /*12073*/10511/* 2F29 */,/*12074*/10512/* 2F2A */,/*12075*/10513/* 2F2B */,/*12076*/10514/* 2F2C */, /*12077*/10515/* 2F2D */,/*12078*/10516/* 2F2E */,/*12079*/10517/* 2F2F */,/*12080*/10518/* 2F30 */, /*12081*/10519/* 2F31 */,/*12082*/10520/* 2F32 */,/*12083*/10521/* 2F33 */,/*12084*/10522/* 2F34 */, /*12085*/10523/* 2F35 */,/*12086*/10524/* 2F36 */,/*12087*/10525/* 2F37 */,/*12088*/10526/* 2F38 */, /*12089*/10527/* 2F39 */,/*12090*/10528/* 2F3A */,/*12091*/10529/* 2F3B */,/*12092*/10530/* 2F3C */, /*12093*/10531/* 2F3D */,/*12094*/10532/* 2F3E */,/*12095*/10533/* 2F3F */,/*12096*/10534/* 2F40 */, /*12097*/10535/* 2F41 */,/*12098*/10536/* 2F42 */,/*12099*/10537/* 2F43 */,/*12100*/10538/* 2F44 */, /*12101*/10539/* 2F45 */,/*12102*/10540/* 2F46 */,/*12103*/10541/* 2F47 */,/*12104*/10542/* 2F48 */, /*12105*/10543/* 2F49 */,/*12106*/10544/* 2F4A */,/*12107*/10545/* 2F4B */,/*12108*/10546/* 2F4C */, /*12109*/10547/* 2F4D */,/*12110*/10548/* 2F4E */,/*12111*/10549/* 2F4F */,/*12112*/10550/* 2F50 */, /*12113*/10551/* 2F51 */,/*12114*/10552/* 2F52 */,/*12115*/10553/* 2F53 */,/*12116*/10554/* 2F54 */, /*12117*/10555/* 2F55 */,/*12118*/10556/* 2F56 */,/*12119*/10557/* 2F57 */,/*12120*/10558/* 2F58 */, /*12121*/10559/* 2F59 */,/*12122*/10560/* 2F5A */,/*12123*/10561/* 2F5B */,/*12124*/10562/* 2F5C */, /*12125*/10563/* 2F5D */,/*12126*/10564/* 2F5E */,/*12127*/10565/* 2F5F */,/*12128*/10566/* 2F60 */, /*12129*/10567/* 2F61 */,/*12130*/10568/* 2F62 */,/*12131*/10569/* 2F63 */,/*12132*/10570/* 2F64 */, /*12133*/10571/* 2F65 */,/*12134*/10572/* 2F66 */,/*12135*/10573/* 2F67 */,/*12136*/10574/* 2F68 */, /*12137*/10575/* 2F69 */,/*12138*/10576/* 2F6A */,/*12139*/10577/* 2F6B */,/*12140*/10578/* 2F6C */, /*12141*/10579/* 2F6D */,/*12142*/10580/* 2F6E */,/*12143*/10581/* 2F6F */,/*12144*/10582/* 2F70 */, /*12145*/10583/* 2F71 */,/*12146*/10584/* 2F72 */,/*12147*/10585/* 2F73 */,/*12148*/10586/* 2F74 */, /*12149*/10587/* 2F75 */,/*12150*/10588/* 2F76 */,/*12151*/10589/* 2F77 */,/*12152*/10590/* 2F78 */, /*12153*/10591/* 2F79 */,/*12154*/10592/* 2F7A */,/*12155*/10593/* 2F7B */,/*12156*/10594/* 2F7C */, /*12157*/10595/* 2F7D */,/*12158*/10596/* 2F7E */,/*12159*/10597/* 2F7F */,/*12160*/10598/* 2F80 */, /*12161*/10599/* 2F81 */,/*12162*/10600/* 2F82 */,/*12163*/10601/* 2F83 */,/*12164*/10602/* 2F84 */, /*12165*/10603/* 2F85 */,/*12166*/10604/* 2F86 */,/*12167*/10605/* 2F87 */,/*12168*/10606/* 2F88 */, /*12169*/10607/* 2F89 */,/*12170*/10608/* 2F8A */,/*12171*/10609/* 2F8B */,/*12172*/10610/* 2F8C */, /*12173*/10611/* 2F8D */,/*12174*/10612/* 2F8E */,/*12175*/10613/* 2F8F */,/*12176*/10614/* 2F90 */, /*12177*/10615/* 2F91 */,/*12178*/10616/* 2F92 */,/*12179*/10617/* 2F93 */,/*12180*/10618/* 2F94 */, /*12181*/10619/* 2F95 */,/*12182*/10620/* 2F96 */,/*12183*/10621/* 2F97 */,/*12184*/10622/* 2F98 */, /*12185*/10623/* 2F99 */,/*12186*/10624/* 2F9A */,/*12187*/10625/* 2F9B */,/*12188*/10626/* 2F9C */, /*12189*/10627/* 2F9D */,/*12190*/10628/* 2F9E */,/*12191*/10629/* 2F9F */,/*12192*/10630/* 2FA0 */, /*12193*/10631/* 2FA1 */,/*12194*/10632/* 2FA2 */,/*12195*/10633/* 2FA3 */,/*12196*/10634/* 2FA4 */, /*12197*/10635/* 2FA5 */,/*12198*/10636/* 2FA6 */,/*12199*/10637/* 2FA7 */,/*12200*/10638/* 2FA8 */, /*12201*/10639/* 2FA9 */,/*12202*/10640/* 2FAA */,/*12203*/10641/* 2FAB */,/*12204*/10642/* 2FAC */, /*12205*/10643/* 2FAD */,/*12206*/10644/* 2FAE */,/*12207*/10645/* 2FAF */,/*12208*/10646/* 2FB0 */, /*12209*/10647/* 2FB1 */,/*12210*/10648/* 2FB2 */,/*12211*/10649/* 2FB3 */,/*12212*/10650/* 2FB4 */, /*12213*/10651/* 2FB5 */,/*12214*/10652/* 2FB6 */,/*12215*/10653/* 2FB7 */,/*12216*/10654/* 2FB8 */, /*12217*/10655/* 2FB9 */,/*12218*/10656/* 2FBA */,/*12219*/10657/* 2FBB */,/*12220*/10658/* 2FBC */, /*12221*/10659/* 2FBD */,/*12222*/10660/* 2FBE */,/*12223*/10661/* 2FBF */,/*12224*/10662/* 2FC0 */, /*12225*/10663/* 2FC1 */,/*12226*/10664/* 2FC2 */,/*12227*/10665/* 2FC3 */,/*12228*/10666/* 2FC4 */, /*12229*/10667/* 2FC5 */,/*12230*/10668/* 2FC6 */,/*12231*/10669/* 2FC7 */,/*12232*/10670/* 2FC8 */, /*12233*/10671/* 2FC9 */,/*12234*/10672/* 2FCA */,/*12235*/10673/* 2FCB */,/*12236*/10674/* 2FCC */, /*12237*/10675/* 2FCD */,/*12238*/10676/* 2FCE */,/*12239*/10677/* 2FCF */,/*12240*/10678/* 2FD0 */, /*12241*/10679/* 2FD1 */,/*12242*/10680/* 2FD2 */,/*12243*/10681/* 2FD3 */,/*12244*/10682/* 2FD4 */, /*12245*/10683/* 2FD5 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*12272*/10684/* 2FF0 */, /*12273*/10685/* 2FF1 */,/*12274*/10686/* 2FF2 */,/*12275*/10687/* 2FF3 */,/*12276*/10688/* 2FF4 */, /*12277*/10689/* 2FF5 */,/*12278*/10690/* 2FF6 */,/*12279*/10691/* 2FF7 */,/*12280*/10692/* 2FF8 */, /*12281*/10693/* 2FF9 */,/*12282*/10694/* 2FFA */,/*12283*/10695/* 2FFB */,0,0,0,0,/*12288*/10696/* 3000 */, /*12289*/10697/* 3001 */,/*12290*/10698/* 3002 */,/*12291*/10699/* 3003 */,/*12292*/10700/* 3004 */, /*12293*/10701/* 3005 */,/*12294*/10702/* 3006 */,/*12295*/10703/* 3007 */,/*12296*/10704/* 3008 */, /*12297*/10705/* 3009 */,/*12298*/10706/* 300A */,/*12299*/10707/* 300B */,/*12300*/10708/* 300C */, /*12301*/10709/* 300D */,/*12302*/10710/* 300E */,/*12303*/10711/* 300F */,/*12304*/10712/* 3010 */, /*12305*/10713/* 3011 */,/*12306*/10714/* 3012 */,/*12307*/10715/* 3013 */,/*12308*/10716/* 3014 */, /*12309*/10717/* 3015 */,/*12310*/10718/* 3016 */,/*12311*/10719/* 3017 */,/*12312*/10720/* 3018 */, /*12313*/10721/* 3019 */,/*12314*/10722/* 301A */,/*12315*/10723/* 301B */,/*12316*/10724/* 301C */, /*12317*/10725/* 301D */,/*12318*/10726/* 301E */,/*12319*/10727/* 301F */,/*12320*/10728/* 3020 */, /*12321*/10729/* 3021 */,/*12322*/10730/* 3022 */,/*12323*/10731/* 3023 */,/*12324*/10732/* 3024 */, /*12325*/10733/* 3025 */,/*12326*/10734/* 3026 */,/*12327*/10735/* 3027 */,/*12328*/10736/* 3028 */, /*12329*/10737/* 3029 */,/*12330*/10738/* 302A */,/*12331*/10739/* 302B */,/*12332*/10740/* 302C */, /*12333*/10741/* 302D */,/*12334*/10742/* 302E */,/*12335*/10743/* 302F */,/*12336*/10744/* 3030 */, /*12337*/10745/* 3031 */,/*12338*/10746/* 3032 */,/*12339*/10747/* 3033 */,/*12340*/10748/* 3034 */, /*12341*/10749/* 3035 */,/*12342*/10750/* 3036 */,/*12343*/10751/* 3037 */,/*12344*/10752/* 3038 */, /*12345*/10753/* 3039 */,/*12346*/10754/* 303A */,/*12347*/10755/* 303B */,/*12348*/10756/* 303C */, /*12349*/10757/* 303D */,/*12350*/10758/* 303E */,/*12351*/10759/* 303F */,0,/*12353*/10760/* 3041 */, /*12354*/10761/* 3042 */,/*12355*/10762/* 3043 */,/*12356*/10763/* 3044 */,/*12357*/10764/* 3045 */, /*12358*/10765/* 3046 */,/*12359*/10766/* 3047 */,/*12360*/10767/* 3048 */,/*12361*/10768/* 3049 */, /*12362*/10769/* 304A */,/*12363*/10770/* 304B */,/*12364*/10771/* 304C */,/*12365*/10772/* 304D */, /*12366*/10773/* 304E */,/*12367*/10774/* 304F */,/*12368*/10775/* 3050 */,/*12369*/10776/* 3051 */, /*12370*/10777/* 3052 */,/*12371*/10778/* 3053 */,/*12372*/10779/* 3054 */,/*12373*/10780/* 3055 */, /*12374*/10781/* 3056 */,/*12375*/10782/* 3057 */,/*12376*/10783/* 3058 */,/*12377*/10784/* 3059 */, /*12378*/10785/* 305A */,/*12379*/10786/* 305B */,/*12380*/10787/* 305C */,/*12381*/10788/* 305D */, /*12382*/10789/* 305E */,/*12383*/10790/* 305F */,/*12384*/10791/* 3060 */,/*12385*/10792/* 3061 */, /*12386*/10793/* 3062 */,/*12387*/10794/* 3063 */,/*12388*/10795/* 3064 */,/*12389*/10796/* 3065 */, /*12390*/10797/* 3066 */,/*12391*/10798/* 3067 */,/*12392*/10799/* 3068 */,/*12393*/10800/* 3069 */, /*12394*/10801/* 306A */,/*12395*/10802/* 306B */,/*12396*/10803/* 306C */,/*12397*/10804/* 306D */, /*12398*/10805/* 306E */,/*12399*/10806/* 306F */,/*12400*/10807/* 3070 */,/*12401*/10808/* 3071 */, /*12402*/10809/* 3072 */,/*12403*/10810/* 3073 */,/*12404*/10811/* 3074 */,/*12405*/10812/* 3075 */, /*12406*/10813/* 3076 */,/*12407*/10814/* 3077 */,/*12408*/10815/* 3078 */,/*12409*/10816/* 3079 */, /*12410*/10817/* 307A */,/*12411*/10818/* 307B */,/*12412*/10819/* 307C */,/*12413*/10820/* 307D */, /*12414*/10821/* 307E */,/*12415*/10822/* 307F */,/*12416*/10823/* 3080 */,/*12417*/10824/* 3081 */, /*12418*/10825/* 3082 */,/*12419*/10826/* 3083 */,/*12420*/10827/* 3084 */,/*12421*/10828/* 3085 */, /*12422*/10829/* 3086 */,/*12423*/10830/* 3087 */,/*12424*/10831/* 3088 */,/*12425*/10832/* 3089 */, /*12426*/10833/* 308A */,/*12427*/10834/* 308B */,/*12428*/10835/* 308C */,/*12429*/10836/* 308D */, /*12430*/10837/* 308E */,/*12431*/10838/* 308F */,/*12432*/10839/* 3090 */,/*12433*/10840/* 3091 */, /*12434*/10841/* 3092 */,/*12435*/10842/* 3093 */,/*12436*/10843/* 3094 */,/*12437*/10844/* 3095 */, /*12438*/10845/* 3096 */,0,0,/*12441*/10846/* 3099 */,/*12442*/10847/* 309A */,/*12443*/10848/* 309B */, /*12444*/10849/* 309C */,/*12445*/10850/* 309D */,/*12446*/10851/* 309E */,/*12447*/10852/* 309F */, /*12448*/10853/* 30A0 */,/*12449*/10854/* 30A1 */,/*12450*/10855/* 30A2 */,/*12451*/10856/* 30A3 */, /*12452*/10857/* 30A4 */,/*12453*/10858/* 30A5 */,/*12454*/10859/* 30A6 */,/*12455*/10860/* 30A7 */, /*12456*/10861/* 30A8 */,/*12457*/10862/* 30A9 */,/*12458*/10863/* 30AA */,/*12459*/10864/* 30AB */, /*12460*/10865/* 30AC */,/*12461*/10866/* 30AD */,/*12462*/10867/* 30AE */,/*12463*/10868/* 30AF */, /*12464*/10869/* 30B0 */,/*12465*/10870/* 30B1 */,/*12466*/10871/* 30B2 */,/*12467*/10872/* 30B3 */, /*12468*/10873/* 30B4 */,/*12469*/10874/* 30B5 */,/*12470*/10875/* 30B6 */,/*12471*/10876/* 30B7 */, /*12472*/10877/* 30B8 */,/*12473*/10878/* 30B9 */,/*12474*/10879/* 30BA */,/*12475*/10880/* 30BB */, /*12476*/10881/* 30BC */,/*12477*/10882/* 30BD */,/*12478*/10883/* 30BE */,/*12479*/10884/* 30BF */, /*12480*/10885/* 30C0 */,/*12481*/10886/* 30C1 */,/*12482*/10887/* 30C2 */,/*12483*/10888/* 30C3 */, /*12484*/10889/* 30C4 */,/*12485*/10890/* 30C5 */,/*12486*/10891/* 30C6 */,/*12487*/10892/* 30C7 */, /*12488*/10893/* 30C8 */,/*12489*/10894/* 30C9 */,/*12490*/10895/* 30CA */,/*12491*/10896/* 30CB */, /*12492*/10897/* 30CC */,/*12493*/10898/* 30CD */,/*12494*/10899/* 30CE */,/*12495*/10900/* 30CF */, /*12496*/10901/* 30D0 */,/*12497*/10902/* 30D1 */,/*12498*/10903/* 30D2 */,/*12499*/10904/* 30D3 */, /*12500*/10905/* 30D4 */,/*12501*/10906/* 30D5 */,/*12502*/10907/* 30D6 */,/*12503*/10908/* 30D7 */, /*12504*/10909/* 30D8 */,/*12505*/10910/* 30D9 */,/*12506*/10911/* 30DA */,/*12507*/10912/* 30DB */, /*12508*/10913/* 30DC */,/*12509*/10914/* 30DD */,/*12510*/10915/* 30DE */,/*12511*/10916/* 30DF */, /*12512*/10917/* 30E0 */,/*12513*/10918/* 30E1 */,/*12514*/10919/* 30E2 */,/*12515*/10920/* 30E3 */, /*12516*/10921/* 30E4 */,/*12517*/10922/* 30E5 */,/*12518*/10923/* 30E6 */,/*12519*/10924/* 30E7 */, /*12520*/10925/* 30E8 */,/*12521*/10926/* 30E9 */,/*12522*/10927/* 30EA */,/*12523*/10928/* 30EB */, /*12524*/10929/* 30EC */,/*12525*/10930/* 30ED */,/*12526*/10931/* 30EE */,/*12527*/10932/* 30EF */, /*12528*/10933/* 30F0 */,/*12529*/10934/* 30F1 */,/*12530*/10935/* 30F2 */,/*12531*/10936/* 30F3 */, /*12532*/10937/* 30F4 */,/*12533*/10938/* 30F5 */,/*12534*/10939/* 30F6 */,/*12535*/10940/* 30F7 */, /*12536*/10941/* 30F8 */,/*12537*/10942/* 30F9 */,/*12538*/10943/* 30FA */,/*12539*/10944/* 30FB */, /*12540*/10945/* 30FC */,/*12541*/10946/* 30FD */,/*12542*/10947/* 30FE */,/*12543*/10948/* 30FF */,0,0,0,0,0, /*12549*/10949/* 3105 */,/*12550*/10950/* 3106 */,/*12551*/10951/* 3107 */,/*12552*/10952/* 3108 */, /*12553*/10953/* 3109 */,/*12554*/10954/* 310A */,/*12555*/10955/* 310B */,/*12556*/10956/* 310C */, /*12557*/10957/* 310D */,/*12558*/10958/* 310E */,/*12559*/10959/* 310F */,/*12560*/10960/* 3110 */, /*12561*/10961/* 3111 */,/*12562*/10962/* 3112 */,/*12563*/10963/* 3113 */,/*12564*/10964/* 3114 */, /*12565*/10965/* 3115 */,/*12566*/10966/* 3116 */,/*12567*/10967/* 3117 */,/*12568*/10968/* 3118 */, /*12569*/10969/* 3119 */,/*12570*/10970/* 311A */,/*12571*/10971/* 311B */,/*12572*/10972/* 311C */, /*12573*/10973/* 311D */,/*12574*/10974/* 311E */,/*12575*/10975/* 311F */,/*12576*/10976/* 3120 */, /*12577*/10977/* 3121 */,/*12578*/10978/* 3122 */,/*12579*/10979/* 3123 */,/*12580*/10980/* 3124 */, /*12581*/10981/* 3125 */,/*12582*/10982/* 3126 */,/*12583*/10983/* 3127 */,/*12584*/10984/* 3128 */, /*12585*/10985/* 3129 */,/*12586*/10986/* 312A */,/*12587*/10987/* 312B */,/*12588*/10988/* 312C */, /*12589*/10989/* 312D */,/*12590*/10990/* 312E */,0,0,/*12593*/10991/* 3131 */,/*12594*/10992/* 3132 */, /*12595*/10993/* 3133 */,/*12596*/10994/* 3134 */,/*12597*/10995/* 3135 */,/*12598*/10996/* 3136 */, /*12599*/10997/* 3137 */,/*12600*/10998/* 3138 */,/*12601*/10999/* 3139 */,/*12602*/11000/* 313A */, /*12603*/11001/* 313B */,/*12604*/11002/* 313C */,/*12605*/11003/* 313D */,/*12606*/11004/* 313E */, /*12607*/11005/* 313F */,/*12608*/11006/* 3140 */,/*12609*/11007/* 3141 */,/*12610*/11008/* 3142 */, /*12611*/11009/* 3143 */,/*12612*/11010/* 3144 */,/*12613*/11011/* 3145 */,/*12614*/11012/* 3146 */, /*12615*/11013/* 3147 */,/*12616*/11014/* 3148 */,/*12617*/11015/* 3149 */,/*12618*/11016/* 314A */, /*12619*/11017/* 314B */,/*12620*/11018/* 314C */,/*12621*/11019/* 314D */,/*12622*/11020/* 314E */, /*12623*/11021/* 314F */,/*12624*/11022/* 3150 */,/*12625*/11023/* 3151 */,/*12626*/11024/* 3152 */, /*12627*/11025/* 3153 */,/*12628*/11026/* 3154 */,/*12629*/11027/* 3155 */,/*12630*/11028/* 3156 */, /*12631*/11029/* 3157 */,/*12632*/11030/* 3158 */,/*12633*/11031/* 3159 */,/*12634*/11032/* 315A */, /*12635*/11033/* 315B */,/*12636*/11034/* 315C */,/*12637*/11035/* 315D */,/*12638*/11036/* 315E */, /*12639*/11037/* 315F */,/*12640*/11038/* 3160 */,/*12641*/11039/* 3161 */,/*12642*/11040/* 3162 */, /*12643*/11041/* 3163 */,/*12644*/11042/* 3164 */,/*12645*/11043/* 3165 */,/*12646*/11044/* 3166 */, /*12647*/11045/* 3167 */,/*12648*/11046/* 3168 */,/*12649*/11047/* 3169 */,/*12650*/11048/* 316A */, /*12651*/11049/* 316B */,/*12652*/11050/* 316C */,/*12653*/11051/* 316D */,/*12654*/11052/* 316E */, /*12655*/11053/* 316F */,/*12656*/11054/* 3170 */,/*12657*/11055/* 3171 */,/*12658*/11056/* 3172 */, /*12659*/11057/* 3173 */,/*12660*/11058/* 3174 */,/*12661*/11059/* 3175 */,/*12662*/11060/* 3176 */, /*12663*/11061/* 3177 */,/*12664*/11062/* 3178 */,/*12665*/11063/* 3179 */,/*12666*/11064/* 317A */, /*12667*/11065/* 317B */,/*12668*/11066/* 317C */,/*12669*/11067/* 317D */,/*12670*/11068/* 317E */, /*12671*/11069/* 317F */,/*12672*/11070/* 3180 */,/*12673*/11071/* 3181 */,/*12674*/11072/* 3182 */, /*12675*/11073/* 3183 */,/*12676*/11074/* 3184 */,/*12677*/11075/* 3185 */,/*12678*/11076/* 3186 */, /*12679*/11077/* 3187 */,/*12680*/11078/* 3188 */,/*12681*/11079/* 3189 */,/*12682*/11080/* 318A */, /*12683*/11081/* 318B */,/*12684*/11082/* 318C */,/*12685*/11083/* 318D */,/*12686*/11084/* 318E */,0, /*12688*/11085/* 3190 */,/*12689*/11086/* 3191 */,/*12690*/11087/* 3192 */,/*12691*/11088/* 3193 */, /*12692*/11089/* 3194 */,/*12693*/11090/* 3195 */,/*12694*/11091/* 3196 */,/*12695*/11092/* 3197 */, /*12696*/11093/* 3198 */,/*12697*/11094/* 3199 */,/*12698*/11095/* 319A */,/*12699*/11096/* 319B */, /*12700*/11097/* 319C */,/*12701*/11098/* 319D */,/*12702*/11099/* 319E */,/*12703*/11100/* 319F */, /*12704*/11101/* 31A0 */,/*12705*/11102/* 31A1 */,/*12706*/11103/* 31A2 */,/*12707*/11104/* 31A3 */, /*12708*/11105/* 31A4 */,/*12709*/11106/* 31A5 */,/*12710*/11107/* 31A6 */,/*12711*/11108/* 31A7 */, /*12712*/11109/* 31A8 */,/*12713*/11110/* 31A9 */,/*12714*/11111/* 31AA */,/*12715*/11112/* 31AB */, /*12716*/11113/* 31AC */,/*12717*/11114/* 31AD */,/*12718*/11115/* 31AE */,/*12719*/11116/* 31AF */, /*12720*/11117/* 31B0 */,/*12721*/11118/* 31B1 */,/*12722*/11119/* 31B2 */,/*12723*/11120/* 31B3 */, /*12724*/11121/* 31B4 */,/*12725*/11122/* 31B5 */,/*12726*/11123/* 31B6 */,/*12727*/11124/* 31B7 */, /*12728*/11125/* 31B8 */,/*12729*/11126/* 31B9 */,/*12730*/11127/* 31BA */,0,0,0,0,0,/*12736*/11128/* 31C0 */, /*12737*/11129/* 31C1 */,/*12738*/11130/* 31C2 */,/*12739*/11131/* 31C3 */,/*12740*/11132/* 31C4 */, /*12741*/11133/* 31C5 */,/*12742*/11134/* 31C6 */,/*12743*/11135/* 31C7 */,/*12744*/11136/* 31C8 */, /*12745*/11137/* 31C9 */,/*12746*/11138/* 31CA */,/*12747*/11139/* 31CB */,/*12748*/11140/* 31CC */, /*12749*/11141/* 31CD */,/*12750*/11142/* 31CE */,/*12751*/11143/* 31CF */,/*12752*/11144/* 31D0 */, /*12753*/11145/* 31D1 */,/*12754*/11146/* 31D2 */,/*12755*/11147/* 31D3 */,/*12756*/11148/* 31D4 */, /*12757*/11149/* 31D5 */,/*12758*/11150/* 31D6 */,/*12759*/11151/* 31D7 */,/*12760*/11152/* 31D8 */, /*12761*/11153/* 31D9 */,/*12762*/11154/* 31DA */,/*12763*/11155/* 31DB */,/*12764*/11156/* 31DC */, /*12765*/11157/* 31DD */,/*12766*/11158/* 31DE */,/*12767*/11159/* 31DF */,/*12768*/11160/* 31E0 */, /*12769*/11161/* 31E1 */,/*12770*/11162/* 31E2 */,/*12771*/11163/* 31E3 */,0,0,0,0,0,0,0,0,0,0,0,0, /*12784*/11164/* 31F0 */,/*12785*/11165/* 31F1 */,/*12786*/11166/* 31F2 */,/*12787*/11167/* 31F3 */, /*12788*/11168/* 31F4 */,/*12789*/11169/* 31F5 */,/*12790*/11170/* 31F6 */,/*12791*/11171/* 31F7 */, /*12792*/11172/* 31F8 */,/*12793*/11173/* 31F9 */,/*12794*/11174/* 31FA */,/*12795*/11175/* 31FB */, /*12796*/11176/* 31FC */,/*12797*/11177/* 31FD */,/*12798*/11178/* 31FE */,/*12799*/11179/* 31FF */, /*12800*/11180/* 3200 */,/*12801*/11181/* 3201 */,/*12802*/11182/* 3202 */,/*12803*/11183/* 3203 */, /*12804*/11184/* 3204 */,/*12805*/11185/* 3205 */,/*12806*/11186/* 3206 */,/*12807*/11187/* 3207 */, /*12808*/11188/* 3208 */,/*12809*/11189/* 3209 */,/*12810*/11190/* 320A */,/*12811*/11191/* 320B */, /*12812*/11192/* 320C */,/*12813*/11193/* 320D */,/*12814*/11194/* 320E */,/*12815*/11195/* 320F */, /*12816*/11196/* 3210 */,/*12817*/11197/* 3211 */,/*12818*/11198/* 3212 */,/*12819*/11199/* 3213 */, /*12820*/11200/* 3214 */,/*12821*/11201/* 3215 */,/*12822*/11202/* 3216 */,/*12823*/11203/* 3217 */, /*12824*/11204/* 3218 */,/*12825*/11205/* 3219 */,/*12826*/11206/* 321A */,/*12827*/11207/* 321B */, /*12828*/11208/* 321C */,/*12829*/11209/* 321D */,/*12830*/11210/* 321E */,0,/*12832*/11211/* 3220 */, /*12833*/11212/* 3221 */,/*12834*/11213/* 3222 */,/*12835*/11214/* 3223 */,/*12836*/11215/* 3224 */, /*12837*/11216/* 3225 */,/*12838*/11217/* 3226 */,/*12839*/11218/* 3227 */,/*12840*/11219/* 3228 */, /*12841*/11220/* 3229 */,/*12842*/11221/* 322A */,/*12843*/11222/* 322B */,/*12844*/11223/* 322C */, /*12845*/11224/* 322D */,/*12846*/11225/* 322E */,/*12847*/11226/* 322F */,/*12848*/11227/* 3230 */, /*12849*/11228/* 3231 */,/*12850*/11229/* 3232 */,/*12851*/11230/* 3233 */,/*12852*/11231/* 3234 */, /*12853*/11232/* 3235 */,/*12854*/11233/* 3236 */,/*12855*/11234/* 3237 */,/*12856*/11235/* 3238 */, /*12857*/11236/* 3239 */,/*12858*/11237/* 323A */,/*12859*/11238/* 323B */,/*12860*/11239/* 323C */, /*12861*/11240/* 323D */,/*12862*/11241/* 323E */,/*12863*/11242/* 323F */,/*12864*/11243/* 3240 */, /*12865*/11244/* 3241 */,/*12866*/11245/* 3242 */,/*12867*/11246/* 3243 */,/*12868*/11247/* 3244 */, /*12869*/11248/* 3245 */,/*12870*/11249/* 3246 */,/*12871*/11250/* 3247 */,/*12872*/11251/* 3248 */, /*12873*/11252/* 3249 */,/*12874*/11253/* 324A */,/*12875*/11254/* 324B */,/*12876*/11255/* 324C */, /*12877*/11256/* 324D */,/*12878*/11257/* 324E */,/*12879*/11258/* 324F */,/*12880*/11259/* 3250 */, /*12881*/11260/* 3251 */,/*12882*/11261/* 3252 */,/*12883*/11262/* 3253 */,/*12884*/11263/* 3254 */, /*12885*/11264/* 3255 */,/*12886*/11265/* 3256 */,/*12887*/11266/* 3257 */,/*12888*/11267/* 3258 */, /*12889*/11268/* 3259 */,/*12890*/11269/* 325A */,/*12891*/11270/* 325B */,/*12892*/11271/* 325C */, /*12893*/11272/* 325D */,/*12894*/11273/* 325E */,/*12895*/11274/* 325F */,/*12896*/11275/* 3260 */, /*12897*/11276/* 3261 */,/*12898*/11277/* 3262 */,/*12899*/11278/* 3263 */,/*12900*/11279/* 3264 */, /*12901*/11280/* 3265 */,/*12902*/11281/* 3266 */,/*12903*/11282/* 3267 */,/*12904*/11283/* 3268 */, /*12905*/11284/* 3269 */,/*12906*/11285/* 326A */,/*12907*/11286/* 326B */,/*12908*/11287/* 326C */, /*12909*/11288/* 326D */,/*12910*/11289/* 326E */,/*12911*/11290/* 326F */,/*12912*/11291/* 3270 */, /*12913*/11292/* 3271 */,/*12914*/11293/* 3272 */,/*12915*/11294/* 3273 */,/*12916*/11295/* 3274 */, /*12917*/11296/* 3275 */,/*12918*/11297/* 3276 */,/*12919*/11298/* 3277 */,/*12920*/11299/* 3278 */, /*12921*/11300/* 3279 */,/*12922*/11301/* 327A */,/*12923*/11302/* 327B */,/*12924*/11303/* 327C */, /*12925*/11304/* 327D */,/*12926*/11305/* 327E */,/*12927*/11306/* 327F */,/*12928*/11307/* 3280 */, /*12929*/11308/* 3281 */,/*12930*/11309/* 3282 */,/*12931*/11310/* 3283 */,/*12932*/11311/* 3284 */, /*12933*/11312/* 3285 */,/*12934*/11313/* 3286 */,/*12935*/11314/* 3287 */,/*12936*/11315/* 3288 */, /*12937*/11316/* 3289 */,/*12938*/11317/* 328A */,/*12939*/11318/* 328B */,/*12940*/11319/* 328C */, /*12941*/11320/* 328D */,/*12942*/11321/* 328E */,/*12943*/11322/* 328F */,/*12944*/11323/* 3290 */, /*12945*/11324/* 3291 */,/*12946*/11325/* 3292 */,/*12947*/11326/* 3293 */,/*12948*/11327/* 3294 */, /*12949*/11328/* 3295 */,/*12950*/11329/* 3296 */,/*12951*/11330/* 3297 */,/*12952*/11331/* 3298 */, /*12953*/11332/* 3299 */,/*12954*/11333/* 329A */,/*12955*/11334/* 329B */,/*12956*/11335/* 329C */, /*12957*/11336/* 329D */,/*12958*/11337/* 329E */,/*12959*/11338/* 329F */,/*12960*/11339/* 32A0 */, /*12961*/11340/* 32A1 */,/*12962*/11341/* 32A2 */,/*12963*/11342/* 32A3 */,/*12964*/11343/* 32A4 */, /*12965*/11344/* 32A5 */,/*12966*/11345/* 32A6 */,/*12967*/11346/* 32A7 */,/*12968*/11347/* 32A8 */, /*12969*/11348/* 32A9 */,/*12970*/11349/* 32AA */,/*12971*/11350/* 32AB */,/*12972*/11351/* 32AC */, /*12973*/11352/* 32AD */,/*12974*/11353/* 32AE */,/*12975*/11354/* 32AF */,/*12976*/11355/* 32B0 */, /*12977*/11356/* 32B1 */,/*12978*/11357/* 32B2 */,/*12979*/11358/* 32B3 */,/*12980*/11359/* 32B4 */, /*12981*/11360/* 32B5 */,/*12982*/11361/* 32B6 */,/*12983*/11362/* 32B7 */,/*12984*/11363/* 32B8 */, /*12985*/11364/* 32B9 */,/*12986*/11365/* 32BA */,/*12987*/11366/* 32BB */,/*12988*/11367/* 32BC */, /*12989*/11368/* 32BD */,/*12990*/11369/* 32BE */,/*12991*/11370/* 32BF */,/*12992*/11371/* 32C0 */, /*12993*/11372/* 32C1 */,/*12994*/11373/* 32C2 */,/*12995*/11374/* 32C3 */,/*12996*/11375/* 32C4 */, /*12997*/11376/* 32C5 */,/*12998*/11377/* 32C6 */,/*12999*/11378/* 32C7 */,/*13000*/11379/* 32C8 */, /*13001*/11380/* 32C9 */,/*13002*/11381/* 32CA */,/*13003*/11382/* 32CB */,/*13004*/11383/* 32CC */, /*13005*/11384/* 32CD */,/*13006*/11385/* 32CE */,/*13007*/11386/* 32CF */,/*13008*/11387/* 32D0 */, /*13009*/11388/* 32D1 */,/*13010*/11389/* 32D2 */,/*13011*/11390/* 32D3 */,/*13012*/11391/* 32D4 */, /*13013*/11392/* 32D5 */,/*13014*/11393/* 32D6 */,/*13015*/11394/* 32D7 */,/*13016*/11395/* 32D8 */, /*13017*/11396/* 32D9 */,/*13018*/11397/* 32DA */,/*13019*/11398/* 32DB */,/*13020*/11399/* 32DC */, /*13021*/11400/* 32DD */,/*13022*/11401/* 32DE */,/*13023*/11402/* 32DF */,/*13024*/11403/* 32E0 */, /*13025*/11404/* 32E1 */,/*13026*/11405/* 32E2 */,/*13027*/11406/* 32E3 */,/*13028*/11407/* 32E4 */, /*13029*/11408/* 32E5 */,/*13030*/11409/* 32E6 */,/*13031*/11410/* 32E7 */,/*13032*/11411/* 32E8 */, /*13033*/11412/* 32E9 */,/*13034*/11413/* 32EA */,/*13035*/11414/* 32EB */,/*13036*/11415/* 32EC */, /*13037*/11416/* 32ED */,/*13038*/11417/* 32EE */,/*13039*/11418/* 32EF */,/*13040*/11419/* 32F0 */, /*13041*/11420/* 32F1 */,/*13042*/11421/* 32F2 */,/*13043*/11422/* 32F3 */,/*13044*/11423/* 32F4 */, /*13045*/11424/* 32F5 */,/*13046*/11425/* 32F6 */,/*13047*/11426/* 32F7 */,/*13048*/11427/* 32F8 */, /*13049*/11428/* 32F9 */,/*13050*/11429/* 32FA */,/*13051*/11430/* 32FB */,/*13052*/11431/* 32FC */, /*13053*/11432/* 32FD */,/*13054*/11433/* 32FE */,0,/*13056*/11434/* 3300 */,/*13057*/11435/* 3301 */, /*13058*/11436/* 3302 */,/*13059*/11437/* 3303 */,/*13060*/11438/* 3304 */,/*13061*/11439/* 3305 */, /*13062*/11440/* 3306 */,/*13063*/11441/* 3307 */,/*13064*/11442/* 3308 */,/*13065*/11443/* 3309 */, /*13066*/11444/* 330A */,/*13067*/11445/* 330B */,/*13068*/11446/* 330C */,/*13069*/11447/* 330D */, /*13070*/11448/* 330E */,/*13071*/11449/* 330F */,/*13072*/11450/* 3310 */,/*13073*/11451/* 3311 */, /*13074*/11452/* 3312 */,/*13075*/11453/* 3313 */,/*13076*/11454/* 3314 */,/*13077*/11455/* 3315 */, /*13078*/11456/* 3316 */,/*13079*/11457/* 3317 */,/*13080*/11458/* 3318 */,/*13081*/11459/* 3319 */, /*13082*/11460/* 331A */,/*13083*/11461/* 331B */,/*13084*/11462/* 331C */,/*13085*/11463/* 331D */, /*13086*/11464/* 331E */,/*13087*/11465/* 331F */,/*13088*/11466/* 3320 */,/*13089*/11467/* 3321 */, /*13090*/11468/* 3322 */,/*13091*/11469/* 3323 */,/*13092*/11470/* 3324 */,/*13093*/11471/* 3325 */, /*13094*/11472/* 3326 */,/*13095*/11473/* 3327 */,/*13096*/11474/* 3328 */,/*13097*/11475/* 3329 */, /*13098*/11476/* 332A */,/*13099*/11477/* 332B */,/*13100*/11478/* 332C */,/*13101*/11479/* 332D */, /*13102*/11480/* 332E */,/*13103*/11481/* 332F */,/*13104*/11482/* 3330 */,/*13105*/11483/* 3331 */, /*13106*/11484/* 3332 */,/*13107*/11485/* 3333 */,/*13108*/11486/* 3334 */,/*13109*/11487/* 3335 */, /*13110*/11488/* 3336 */,/*13111*/11489/* 3337 */,/*13112*/11490/* 3338 */,/*13113*/11491/* 3339 */, /*13114*/11492/* 333A */,/*13115*/11493/* 333B */,/*13116*/11494/* 333C */,/*13117*/11495/* 333D */, /*13118*/11496/* 333E */,/*13119*/11497/* 333F */,/*13120*/11498/* 3340 */,/*13121*/11499/* 3341 */, /*13122*/11500/* 3342 */,/*13123*/11501/* 3343 */,/*13124*/11502/* 3344 */,/*13125*/11503/* 3345 */, /*13126*/11504/* 3346 */,/*13127*/11505/* 3347 */,/*13128*/11506/* 3348 */,/*13129*/11507/* 3349 */, /*13130*/11508/* 334A */,/*13131*/11509/* 334B */,/*13132*/11510/* 334C */,/*13133*/11511/* 334D */, /*13134*/11512/* 334E */,/*13135*/11513/* 334F */,/*13136*/11514/* 3350 */,/*13137*/11515/* 3351 */, /*13138*/11516/* 3352 */,/*13139*/11517/* 3353 */,/*13140*/11518/* 3354 */,/*13141*/11519/* 3355 */, /*13142*/11520/* 3356 */,/*13143*/11521/* 3357 */,/*13144*/11522/* 3358 */,/*13145*/11523/* 3359 */, /*13146*/11524/* 335A */,/*13147*/11525/* 335B */,/*13148*/11526/* 335C */,/*13149*/11527/* 335D */, /*13150*/11528/* 335E */,/*13151*/11529/* 335F */,/*13152*/11530/* 3360 */,/*13153*/11531/* 3361 */, /*13154*/11532/* 3362 */,/*13155*/11533/* 3363 */,/*13156*/11534/* 3364 */,/*13157*/11535/* 3365 */, /*13158*/11536/* 3366 */,/*13159*/11537/* 3367 */,/*13160*/11538/* 3368 */,/*13161*/11539/* 3369 */, /*13162*/11540/* 336A */,/*13163*/11541/* 336B */,/*13164*/11542/* 336C */,/*13165*/11543/* 336D */, /*13166*/11544/* 336E */,/*13167*/11545/* 336F */,/*13168*/11546/* 3370 */,/*13169*/11547/* 3371 */, /*13170*/11548/* 3372 */,/*13171*/11549/* 3373 */,/*13172*/11550/* 3374 */,/*13173*/11551/* 3375 */, /*13174*/11552/* 3376 */,/*13175*/11553/* 3377 */,/*13176*/11554/* 3378 */,/*13177*/11555/* 3379 */, /*13178*/11556/* 337A */,/*13179*/11557/* 337B */,/*13180*/11558/* 337C */,/*13181*/11559/* 337D */, /*13182*/11560/* 337E */,/*13183*/11561/* 337F */,/*13184*/11562/* 3380 */,/*13185*/11563/* 3381 */, /*13186*/11564/* 3382 */,/*13187*/11565/* 3383 */,/*13188*/11566/* 3384 */,/*13189*/11567/* 3385 */, /*13190*/11568/* 3386 */,/*13191*/11569/* 3387 */,/*13192*/11570/* 3388 */,/*13193*/11571/* 3389 */, /*13194*/11572/* 338A */,/*13195*/11573/* 338B */,/*13196*/11574/* 338C */,/*13197*/11575/* 338D */, /*13198*/11576/* 338E */,/*13199*/11577/* 338F */,/*13200*/11578/* 3390 */,/*13201*/11579/* 3391 */, /*13202*/11580/* 3392 */,/*13203*/11581/* 3393 */,/*13204*/11582/* 3394 */,/*13205*/11583/* 3395 */, /*13206*/11584/* 3396 */,/*13207*/11585/* 3397 */,/*13208*/11586/* 3398 */,/*13209*/11587/* 3399 */, /*13210*/11588/* 339A */,/*13211*/11589/* 339B */,/*13212*/11590/* 339C */,/*13213*/11591/* 339D */, /*13214*/11592/* 339E */,/*13215*/11593/* 339F */,/*13216*/11594/* 33A0 */,/*13217*/11595/* 33A1 */, /*13218*/11596/* 33A2 */,/*13219*/11597/* 33A3 */,/*13220*/11598/* 33A4 */,/*13221*/11599/* 33A5 */, /*13222*/11600/* 33A6 */,/*13223*/11601/* 33A7 */,/*13224*/11602/* 33A8 */,/*13225*/11603/* 33A9 */, /*13226*/11604/* 33AA */,/*13227*/11605/* 33AB */,/*13228*/11606/* 33AC */,/*13229*/11607/* 33AD */, /*13230*/11608/* 33AE */,/*13231*/11609/* 33AF */,/*13232*/11610/* 33B0 */,/*13233*/11611/* 33B1 */, /*13234*/11612/* 33B2 */,/*13235*/11613/* 33B3 */,/*13236*/11614/* 33B4 */,/*13237*/11615/* 33B5 */, /*13238*/11616/* 33B6 */,/*13239*/11617/* 33B7 */,/*13240*/11618/* 33B8 */,/*13241*/11619/* 33B9 */, /*13242*/11620/* 33BA */,/*13243*/11621/* 33BB */,/*13244*/11622/* 33BC */,/*13245*/11623/* 33BD */, /*13246*/11624/* 33BE */,/*13247*/11625/* 33BF */,/*13248*/11626/* 33C0 */,/*13249*/11627/* 33C1 */, /*13250*/11628/* 33C2 */,/*13251*/11629/* 33C3 */,/*13252*/11630/* 33C4 */,/*13253*/11631/* 33C5 */, /*13254*/11632/* 33C6 */,/*13255*/11633/* 33C7 */,/*13256*/11634/* 33C8 */,/*13257*/11635/* 33C9 */, /*13258*/11636/* 33CA */,/*13259*/11637/* 33CB */,/*13260*/11638/* 33CC */,/*13261*/11639/* 33CD */, /*13262*/11640/* 33CE */,/*13263*/11641/* 33CF */,/*13264*/11642/* 33D0 */,/*13265*/11643/* 33D1 */, /*13266*/11644/* 33D2 */,/*13267*/11645/* 33D3 */,/*13268*/11646/* 33D4 */,/*13269*/11647/* 33D5 */, /*13270*/11648/* 33D6 */,/*13271*/11649/* 33D7 */,/*13272*/11650/* 33D8 */,/*13273*/11651/* 33D9 */, /*13274*/11652/* 33DA */,/*13275*/11653/* 33DB */,/*13276*/11654/* 33DC */,/*13277*/11655/* 33DD */, /*13278*/11656/* 33DE */,/*13279*/11657/* 33DF */,/*13280*/11658/* 33E0 */,/*13281*/11659/* 33E1 */, /*13282*/11660/* 33E2 */,/*13283*/11661/* 33E3 */,/*13284*/11662/* 33E4 */,/*13285*/11663/* 33E5 */, /*13286*/11664/* 33E6 */,/*13287*/11665/* 33E7 */,/*13288*/11666/* 33E8 */,/*13289*/11667/* 33E9 */, /*13290*/11668/* 33EA */,/*13291*/11669/* 33EB */,/*13292*/11670/* 33EC */,/*13293*/11671/* 33ED */, /*13294*/11672/* 33EE */,/*13295*/11673/* 33EF */,/*13296*/11674/* 33F0 */,/*13297*/11675/* 33F1 */, /*13298*/11676/* 33F2 */,/*13299*/11677/* 33F3 */,/*13300*/11678/* 33F4 */,/*13301*/11679/* 33F5 */, /*13302*/11680/* 33F6 */,/*13303*/11681/* 33F7 */,/*13304*/11682/* 33F8 */,/*13305*/11683/* 33F9 */, /*13306*/11684/* 33FA */,/*13307*/11685/* 33FB */,/*13308*/11686/* 33FC */,/*13309*/11687/* 33FD */, /*13310*/11688/* 33FE */,/*13311*/11689/* 33FF */,/*13312*/11690/* 3400 */,/*13313*/11690/*3401 */, /*13314*/11690/*3402 */,/*13315*/11690/*3403 */,/*13316*/11690/*3404 */,/*13317*/11691/* 3405 */, /*13318*/11690/* 3406 */,/*13319*/11692/* 3483 */,/*13320*/11690/* 3484 */,/*13321*/11691/* 382A */, /*13322*/11690/* 382B */,/*13323*/11693/* 3B4D */,/*13324*/11690/* 3B4E */,0,0,0,0,0,0,0,0,0,0,/*13335*/11694/* 4DC0 */, /*13336*/11695/* 4DC1 */,/*13337*/11696/* 4DC2 */,/*13338*/11697/* 4DC3 */,/*13339*/11698/* 4DC4 */, /*13340*/11699/* 4DC5 */,/*13341*/11700/* 4DC6 */,/*13342*/11701/* 4DC7 */,/*13343*/11702/* 4DC8 */, /*13344*/11703/* 4DC9 */,/*13345*/11704/* 4DCA */,/*13346*/11705/* 4DCB */,/*13347*/11706/* 4DCC */, /*13348*/11707/* 4DCD */,/*13349*/11708/* 4DCE */,/*13350*/11709/* 4DCF */,/*13351*/11710/* 4DD0 */, /*13352*/11711/* 4DD1 */,/*13353*/11712/* 4DD2 */,/*13354*/11713/* 4DD3 */,/*13355*/11714/* 4DD4 */, /*13356*/11715/* 4DD5 */,/*13357*/11716/* 4DD6 */,/*13358*/11717/* 4DD7 */,/*13359*/11718/* 4DD8 */, /*13360*/11719/* 4DD9 */,/*13361*/11720/* 4DDA */,/*13362*/11721/* 4DDB */,/*13363*/11722/* 4DDC */, /*13364*/11723/* 4DDD */,/*13365*/11724/* 4DDE */,/*13366*/11725/* 4DDF */,/*13367*/11726/* 4DE0 */, /*13368*/11727/* 4DE1 */,/*13369*/11728/* 4DE2 */,/*13370*/11729/* 4DE3 */,/*13371*/11730/* 4DE4 */, /*13372*/11731/* 4DE5 */,/*13373*/11732/* 4DE6 */,/*13374*/11733/* 4DE7 */,/*13375*/11734/* 4DE8 */, /*13376*/11735/* 4DE9 */,/*13377*/11736/* 4DEA */,/*13378*/11737/* 4DEB */,/*13379*/11738/* 4DEC */, /*13380*/11739/* 4DED */,/*13381*/11740/* 4DEE */,/*13382*/11741/* 4DEF */,/*13383*/11742/* 4DF0 */, /*13384*/11743/* 4DF1 */,/*13385*/11744/* 4DF2 */,/*13386*/11745/* 4DF3 */,/*13387*/11746/* 4DF4 */, /*13388*/11747/* 4DF5 */,/*13389*/11748/* 4DF6 */,/*13390*/11749/* 4DF7 */,/*13391*/11750/* 4DF8 */, /*13392*/11751/* 4DF9 */,/*13393*/11752/* 4DFA */,/*13394*/11753/* 4DFB */,/*13395*/11754/* 4DFC */, /*13396*/11755/* 4DFD */,/*13397*/11756/* 4DFE */,/*13398*/11757/* 4DFF */,/*13399*/11758/* 4E00 */, /*13400*/11759/* 4E01 */,/*13401*/11759/*4E02 */,/*13402*/11760/* 4E03 */,/*13403*/11759/* 4E04 */, /*13404*/11759/*4E05 */,/*13405*/11759/*4E06 */,/*13406*/11761/* 4E07 */,/*13407*/11759/* 4E08 */, /*13408*/11762/* 4E09 */,/*13409*/11759/* 4E0A */,/*13410*/11759/*4E0B */,/*13411*/11759/*4E0C */, /*13412*/11759/*4E0D */,/*13413*/11759/*4E0E */,/*13414*/11759/*4E0F */,/*13415*/11759/*4E10 */,/*13416*/11759/*4E11 */, /*13417*/11759/*4E12 */,/*13418*/11759/*4E13 */,/*13419*/11759/*4E14 */,/*13420*/11759/*4E15 */,/*13421*/11759/*4E16 */, /*13422*/11759/*4E17 */,/*13423*/11759/*4E18 */,/*13424*/11759/*4E19 */,/*13425*/11759/*4E1A */,/*13426*/11759/*4E1B */, /*13427*/11759/*4E1C */,/*13428*/11759/*4E1D */,/*13429*/11759/*4E1E */,/*13430*/11759/*4E1F */,/*13431*/11759/*4E20 */, /*13432*/11759/*4E21 */,/*13433*/11759/*4E22 */,/*13434*/11759/* 4E23 */,/*13435*/11759/*4E24 */,/*13436*/11759/*4E25 */, /*13437*/11759/*4E26 */,/*13438*/11759/*4E27 */,/*13439*/11759/*4E28 */,/*13440*/11759/*4E29 */,/*13441*/11759/*4E2A */, /*13442*/11759/*4E2B */,/*13443*/11759/*4E2C */,/*13444*/11759/*4E2D */,/*13445*/11759/*4E2E */,/*13446*/11759/*4E2F */, /*13447*/11759/*4E30 */,/*13448*/11759/*4E31 */,/*13449*/11759/*4E32 */,/*13450*/11759/*4E33 */,/*13451*/11759/*4E34 */, /*13452*/11759/*4E35 */,/*13453*/11759/*4E36 */,/*13454*/11759/*4E37 */,/*13455*/11759/*4E38 */,/*13456*/11759/*4E39 */, /*13457*/11759/*4E3A */,/*13458*/11759/*4E3B */,/*13459*/11759/* 4E3C */,/*13460*/11759/*4E3D */,/*13461*/11759/*4E3E */, /*13462*/11759/*4E3F */,/*13463*/11759/*4E40 */,/*13464*/11759/*4E41 */,/*13465*/11759/*4E42 */,/*13466*/11759/*4E43 */, /*13467*/11759/*4E44 */,/*13468*/11759/*4E45 */,/*13469*/11759/*4E46 */,/*13470*/11759/*4E47 */,/*13471*/11759/*4E48 */, /*13472*/11759/*4E49 */,/*13473*/11759/*4E4A */,/*13474*/11759/*4E4B */,/*13475*/11759/*4E4C */,/*13476*/11759/*4E4D */, /*13477*/11759/*4E4E */,/*13478*/11759/*4E4F */,/*13479*/11759/*4E50 */,/*13480*/11759/*4E51 */,/*13481*/11759/*4E52 */, /*13482*/11759/*4E53 */,/*13483*/11759/*4E54 */,/*13484*/11759/* 4E55 */,/*13485*/11759/*4E56 */,/*13486*/11759/*4E57 */, /*13487*/11759/*4E58 */,/*13488*/11759/*4E59 */,/*13489*/11759/*4E5A */,/*13490*/11759/*4E5B */,/*13491*/11759/*4E5C */, /*13492*/11763/* 4E5D */,/*13493*/11759/* 4E5E */,/*13494*/11759/*4E5F */,/*13495*/11759/*4E60 */, /*13496*/11759/*4E61 */,/*13497*/11759/*4E62 */,/*13498*/11759/*4E63 */,/*13499*/11759/*4E64 */,/*13500*/11759/*4E65 */, /*13501*/11759/*4E66 */,/*13502*/11759/*4E67 */,/*13503*/11759/*4E68 */,/*13504*/11759/*4E69 */,/*13505*/11759/*4E6A */, /*13506*/11759/*4E6B */,/*13507*/11759/*4E6C */,/*13508*/11759/*4E6D */,/*13509*/11759/*4E6E */,/*13510*/11759/*4E6F */, /*13511*/11759/*4E70 */,/*13512*/11759/*4E71 */,/*13513*/11759/*4E72 */,/*13514*/11759/*4E73 */,/*13515*/11759/*4E74 */, /*13516*/11759/*4E75 */,/*13517*/11759/*4E76 */,/*13518*/11759/* 4E77 */,/*13519*/11759/*4E78 */,/*13520*/11759/*4E79 */, /*13521*/11759/*4E7A */,/*13522*/11759/*4E7B */,/*13523*/11759/*4E7C */,/*13524*/11759/*4E7D */,/*13525*/11759/*4E7E */, /*13526*/11759/*4E7F */,/*13527*/11759/*4E80 */,/*13528*/11759/*4E81 */,/*13529*/11759/*4E82 */,/*13530*/11759/*4E83 */, /*13531*/11759/*4E84 */,/*13532*/11759/*4E85 */,/*13533*/11759/*4E86 */,/*13534*/11759/*4E87 */,/*13535*/11759/*4E88 */, /*13536*/11759/*4E89 */,/*13537*/11759/*4E8A */,/*13538*/11759/*4E8B */,/*13539*/11764/* 4E8C */, /*13540*/11759/* 4E8D */,/*13541*/11759/*4E8E */,/*13542*/11759/*4E8F */,/*13543*/11759/*4E90 */,/*13544*/11759/*4E91 */, /*13545*/11759/*4E92 */,/*13546*/11759/*4E93 */,/*13547*/11765/* 4E94 */,/*13548*/11759/* 4E95 */, /*13549*/11766/* 4E96 */,/*13550*/11759/* 4E97 */,/*13551*/11759/*4E98 */,/*13552*/11759/*4E99 */, /*13553*/11759/*4E9A */,/*13554*/11759/*4E9B */,/*13555*/11759/*4E9C */,/*13556*/11759/*4E9D */,/*13557*/11759/*4E9E */, /*13558*/11759/*4E9F */,/*13559*/11759/*4EA0 */,/*13560*/11759/*4EA1 */,/*13561*/11759/*4EA2 */,/*13562*/11759/*4EA3 */, /*13563*/11759/*4EA4 */,/*13564*/11759/*4EA5 */,/*13565*/11759/*4EA6 */,/*13566*/11759/*4EA7 */,/*13567*/11759/*4EA8 */, /*13568*/11759/*4EA9 */,/*13569*/11759/*4EAA */,/*13570*/11759/*4EAB */,/*13571*/11759/*4EAC */,/*13572*/11759/*4EAD */, /*13573*/11759/*4EAE */,/*13574*/11759/*4EAF */,/*13575*/11759/* 4EB0 */,/*13576*/11759/*4EB1 */,/*13577*/11759/*4EB2 */, /*13578*/11759/*4EB3 */,/*13579*/11759/*4EB4 */,/*13580*/11759/*4EB5 */,/*13581*/11759/*4EB6 */,/*13582*/11759/*4EB7 */, /*13583*/11759/*4EB8 */,/*13584*/11759/*4EB9 */,/*13585*/11759/*4EBA */,/*13586*/11759/*4EBB */,/*13587*/11759/*4EBC */, /*13588*/11759/*4EBD */,/*13589*/11759/*4EBE */,/*13590*/11767/* 4EBF */,/*13591*/11768/* 4EC0 */, /*13592*/11759/* 4EC1 */,/*13593*/11759/*4EC2 */,/*13594*/11759/*4EC3 */,/*13595*/11759/*4EC4 */,/*13596*/11759/*4EC5 */, /*13597*/11759/*4EC6 */,/*13598*/11759/*4EC7 */,/*13599*/11759/*4EC8 */,/*13600*/11759/*4EC9 */,/*13601*/11759/*4ECA */, /*13602*/11759/*4ECB */,/*13603*/11759/*4ECC */,/*13604*/11759/*4ECD */,/*13605*/11759/*4ECE */,/*13606*/11759/*4ECF */, /*13607*/11759/*4ED0 */,/*13608*/11759/*4ED1 */,/*13609*/11759/*4ED2 */,/*13610*/11759/*4ED3 */,/*13611*/11759/*4ED4 */, /*13612*/11759/*4ED5 */,/*13613*/11759/*4ED6 */,/*13614*/11759/*4ED7 */,/*13615*/11759/*4ED8 */,/*13616*/11759/*4ED9 */, /*13617*/11759/* 4EDA */,/*13618*/11759/*4EDB */,/*13619*/11759/*4EDC */,/*13620*/11759/*4EDD */,/*13621*/11759/*4EDE */, /*13622*/11769/* 4EDF */,/*13623*/11759/* 4EE0 */,/*13624*/11759/*4EE1 */,/*13625*/11759/*4EE2 */, /*13626*/11759/*4EE3 */,/*13627*/11759/*4EE4 */,/*13628*/11759/*4EE5 */,/*13629*/11759/*4EE6 */,/*13630*/11759/*4EE7 */, /*13631*/11762/* 4EE8 */,/*13632*/11759/* 4EE9 */,/*13633*/11759/*4EEA */,/*13634*/11759/*4EEB */, /*13635*/11759/*4EEC */,/*13636*/11759/*4EED */,/*13637*/11759/*4EEE */,/*13638*/11759/*4EEF */,/*13639*/11759/*4EF0 */, /*13640*/11759/*4EF1 */,/*13641*/11759/*4EF2 */,/*13642*/11759/*4EF3 */,/*13643*/11759/*4EF4 */,/*13644*/11759/*4EF5 */, /*13645*/11759/*4EF6 */,/*13646*/11759/*4EF7 */,/*13647*/11759/*4EF8 */,/*13648*/11759/*4EF9 */,/*13649*/11759/*4EFA */, /*13650*/11759/*4EFB */,/*13651*/11759/*4EFC */,/*13652*/11759/*4EFD */,/*13653*/11759/*4EFE */,/*13654*/11759/*4EFF */, /*13655*/11759/*4F00 */,/*13656*/11759/*4F01 */,/*13657*/11759/* 4F02 */,/*13658*/11759/*4F03 */,/*13659*/11759/*4F04 */, /*13660*/11759/*4F05 */,/*13661*/11759/*4F06 */,/*13662*/11759/*4F07 */,/*13663*/11759/*4F08 */,/*13664*/11759/*4F09 */, /*13665*/11759/*4F0A */,/*13666*/11759/*4F0B */,/*13667*/11759/*4F0C */,/*13668*/11765/* 4F0D */, /*13669*/11759/* 4F0E */,/*13670*/11759/*4F0F */,/*13671*/11759/*4F10 */,/*13672*/11759/*4F11 */,/*13673*/11759/*4F12 */, /*13674*/11759/*4F13 */,/*13675*/11759/*4F14 */,/*13676*/11759/*4F15 */,/*13677*/11759/*4F16 */,/*13678*/11759/*4F17 */, /*13679*/11759/*4F18 */,/*13680*/11759/*4F19 */,/*13681*/11759/*4F1A */,/*13682*/11759/*4F1B */,/*13683*/11759/*4F1C */, /*13684*/11759/*4F1D */,/*13685*/11759/*4F1E */,/*13686*/11759/*4F1F */,/*13687*/11759/*4F20 */,/*13688*/11759/*4F21 */, /*13689*/11759/*4F22 */,/*13690*/11759/*4F23 */,/*13691*/11759/*4F24 */,/*13692*/11759/*4F25 */,/*13693*/11759/*4F26 */, /*13694*/11759/* 4F27 */,/*13695*/11759/*4F28 */,/*13696*/11759/*4F29 */,/*13697*/11759/*4F2A */,/*13698*/11759/*4F2B */, /*13699*/11759/*4F2C */,/*13700*/11759/*4F2D */,/*13701*/11759/*4F2E */,/*13702*/11759/*4F2F */,/*13703*/11759/*4F30 */, /*13704*/11759/*4F31 */,/*13705*/11759/*4F32 */,/*13706*/11759/*4F33 */,/*13707*/11759/*4F34 */,/*13708*/11759/*4F35 */, /*13709*/11759/*4F36 */,/*13710*/11759/*4F37 */,/*13711*/11759/*4F38 */,/*13712*/11759/*4F39 */,/*13713*/11759/*4F3A */, /*13714*/11759/*4F3B */,/*13715*/11759/*4F3C */,/*13716*/11759/*4F3D */,/*13717*/11759/*4F3E */,/*13718*/11759/*4F3F */, /*13719*/11759/* 4F40 */,/*13720*/11759/*4F41 */,/*13721*/11759/*4F42 */,/*13722*/11759/*4F43 */,/*13723*/11759/*4F44 */, /*13724*/11759/*4F45 */,/*13725*/11759/*4F46 */,/*13726*/11759/*4F47 */,/*13727*/11759/*4F48 */,/*13728*/11759/*4F49 */, /*13729*/11759/*4F4A */,/*13730*/11759/*4F4B */,/*13731*/11759/*4F4C */,/*13732*/11759/*4F4D */,/*13733*/11759/*4F4E */, /*13734*/11759/*4F4F */,/*13735*/11759/*4F50 */,/*13736*/11759/*4F51 */,/*13737*/11759/*4F52 */,/*13738*/11759/*4F53 */, /*13739*/11759/*4F54 */,/*13740*/11759/*4F55 */,/*13741*/11759/*4F56 */,/*13742*/11759/*4F57 */,/*13743*/11759/*4F58 */, /*13744*/11759/* 4F59 */,/*13745*/11759/*4F5A */,/*13746*/11759/*4F5B */,/*13747*/11759/*4F5C */,/*13748*/11759/*4F5D */, /*13749*/11759/*4F5E */,/*13750*/11759/*4F5F */,/*13751*/11759/*4F60 */,/*13752*/11759/*4F61 */,/*13753*/11759/*4F62 */, /*13754*/11759/*4F63 */,/*13755*/11759/*4F64 */,/*13756*/11759/*4F65 */,/*13757*/11759/*4F66 */,/*13758*/11759/*4F67 */, /*13759*/11759/*4F68 */,/*13760*/11759/*4F69 */,/*13761*/11759/*4F6A */,/*13762*/11759/*4F6B */,/*13763*/11759/*4F6C */, /*13764*/11759/*4F6D */,/*13765*/11759/*4F6E */,/*13766*/11759/*4F6F */,/*13767*/11770/* 4F70 */, /*13768*/11759/* 4F71 */,/*13769*/11767/* 5104 */,/*13770*/11759/* 5105 */,/*13771*/11759/*5106 */, /*13772*/11759/*5107 */,/*13773*/11759/*5108 */,/*13774*/11759/*5109 */,/*13775*/11759/*510A */,/*13776*/11759/*510B */, /*13777*/11759/*510C */,/*13778*/11759/*510D */,/*13779*/11759/*510E */,/*13780*/11759/*510F */,/*13781*/11759/*5110 */, /*13782*/11759/*5111 */,/*13783*/11759/*5112 */,/*13784*/11759/*5113 */,/*13785*/11759/*5114 */,/*13786*/11759/*5115 */, /*13787*/11759/*5116 */,/*13788*/11759/*5117 */,/*13789*/11759/*5118 */,/*13790*/11759/*5119 */,/*13791*/11759/*511A */, /*13792*/11759/*511B */,/*13793*/11759/*511C */,/*13794*/11759/*511D */,/*13795*/11759/* 511E */,/*13796*/11759/*511F */, /*13797*/11759/*5120 */,/*13798*/11759/*5121 */,/*13799*/11759/*5122 */,/*13800*/11759/*5123 */,/*13801*/11759/*5124 */, /*13802*/11759/*5125 */,/*13803*/11759/*5126 */,/*13804*/11759/*5127 */,/*13805*/11759/*5128 */,/*13806*/11759/*5129 */, /*13807*/11759/*512A */,/*13808*/11759/*512B */,/*13809*/11759/*512C */,/*13810*/11759/*512D */,/*13811*/11759/*512E */, /*13812*/11759/*512F */,/*13813*/11759/*5130 */,/*13814*/11759/*5131 */,/*13815*/11759/*5132 */,/*13816*/11759/*5133 */, /*13817*/11759/*5134 */,/*13818*/11759/*5135 */,/*13819*/11759/*5136 */,/*13820*/11759/* 5137 */,/*13821*/11759/*5138 */, /*13822*/11759/*5139 */,/*13823*/11759/*513A */,/*13824*/11759/*513B */,/*13825*/11759/*513C */,/*13826*/11759/*513D */, /*13827*/11759/*513E */,/*13828*/11759/*513F */,/*13829*/11759/*5140 */,/*13830*/11759/*5141 */,/*13831*/11759/*5142 */, /*13832*/11759/*5143 */,/*13833*/11759/*5144 */,/*13834*/11759/*5145 */,/*13835*/11771/* 5146 */, /*13836*/11759/* 5147 */,/*13837*/11759/*5148 */,/*13838*/11759/*5149 */,/*13839*/11759/*514A */,/*13840*/11759/*514B */, /*13841*/11759/*514C */,/*13842*/11759/*514D */,/*13843*/11759/*514E */,/*13844*/11759/*514F */,/*13845*/11759/*5150 */, /*13846*/11759/*5151 */,/*13847*/11759/*5152 */,/*13848*/11759/*5153 */,/*13849*/11759/*5154 */,/*13850*/11759/*5155 */, /*13851*/11759/*5156 */,/*13852*/11759/*5157 */,/*13853*/11759/*5158 */,/*13854*/11759/*5159 */,/*13855*/11759/*515A */, /*13856*/11759/*515B */,/*13857*/11759/*515C */,/*13858*/11759/*515D */,/*13859*/11759/*515E */,/*13860*/11759/*515F */, /*13861*/11759/* 5160 */,/*13862*/11759/*5161 */,/*13863*/11759/*5162 */,/*13864*/11759/*5163 */,/*13865*/11759/*5164 */, /*13866*/11759/*5165 */,/*13867*/11759/*5166 */,/*13868*/11759/*5167 */,/*13869*/11759/*5168 */,/*13870*/11764/* 5169 */, /*13871*/11759/* 516A */,/*13872*/11772/* 516B */,/*13873*/11759/* 516C */,/*13874*/11773/* 516D */, /*13875*/11759/* 516E */,/*13876*/11768/* 5341 */,/*13877*/11759/* 5342 */,/*13878*/11769/* 5343 */, /*13879*/11774/* 5344 */,/*13880*/11775/* 5345 */,/*13881*/11759/* 5346 */,/*13882*/11759/*5347 */, /*13883*/11759/*5348 */,/*13884*/11759/*5349 */,/*13885*/11759/*534A */,/*13886*/11759/*534B */,/*13887*/11776/* 534C */, /*13888*/11759/* 534D */,/*13889*/11762/* 53C1 */,/*13890*/11762/*53C2 */,/*13891*/11762/*53C3 */, /*13892*/11762/*53C4 */,/*13893*/11759/* 53C5 */,/*13894*/11766/* 56DB */,/*13895*/11759/* 56DC */, /*13896*/11758/* 58F1 */,/*13897*/11759/* 58F2 */,/*13898*/11759/*58F3 */,/*13899*/11759/*58F4 */, /*13900*/11759/*58F5 */,/*13901*/11759/*58F6 */,/*13902*/11759/*58F7 */,/*13903*/11759/*58F8 */,/*13904*/11758/* 58F9 */, /*13905*/11759/* 58FA */,/*13906*/11758/* 5E7A */,/*13907*/11759/* 5E7B */,/*13908*/11763/* 5EFE */, /*13909*/11774/* 5EFF */,/*13910*/11759/* 5F00 */,/*13911*/11759/*5F01 */,/*13912*/11759/*5F02 */, /*13913*/11759/*5F03 */,/*13914*/11759/*5F04 */,/*13915*/11759/*5F05 */,/*13916*/11759/*5F06 */,/*13917*/11759/*5F07 */, /*13918*/11759/*5F08 */,/*13919*/11759/*5F09 */,/*13920*/11759/*5F0A */,/*13921*/11759/*5F0B */,/*13922*/11758/* 5F0C */, /*13923*/11764/* 5F0D */,/*13924*/11762/* 5F0E */,/*13925*/11759/* 5F0F */,/*13926*/11764/* 5F10 */, /*13927*/11759/* 5F11 */,/*13928*/11768/* 62FE */,/*13929*/11759/* 62FF */,/*13930*/11759/*6300 */, /*13931*/11759/*6301 */,/*13932*/11759/*6302 */,/*13933*/11759/*6303 */,/*13934*/11759/*6304 */,/*13935*/11759/*6305 */, /*13936*/11759/*6306 */,/*13937*/11759/*6307 */,/*13938*/11759/*6308 */,/*13939*/11759/*6309 */,/*13940*/11759/*630A */, /*13941*/11759/*630B */,/*13942*/11759/*630C */,/*13943*/11759/*630D */,/*13944*/11759/*630E */,/*13945*/11759/*630F */, /*13946*/11759/*6310 */,/*13947*/11759/*6311 */,/*13948*/11759/*6312 */,/*13949*/11759/*6313 */,/*13950*/11759/*6314 */, /*13951*/11759/*6315 */,/*13952*/11759/*6316 */,/*13953*/11759/*6317 */,/*13954*/11759/* 6318 */,/*13955*/11759/*6319 */, /*13956*/11759/*631A */,/*13957*/11759/*631B */,/*13958*/11759/*631C */,/*13959*/11759/*631D */,/*13960*/11759/*631E */, /*13961*/11759/*631F */,/*13962*/11759/*6320 */,/*13963*/11759/*6321 */,/*13964*/11759/*6322 */,/*13965*/11759/*6323 */, /*13966*/11759/*6324 */,/*13967*/11759/*6325 */,/*13968*/11759/*6326 */,/*13969*/11759/*6327 */,/*13970*/11759/*6328 */, /*13971*/11759/*6329 */,/*13972*/11759/*632A */,/*13973*/11759/*632B */,/*13974*/11759/*632C */,/*13975*/11759/*632D */, /*13976*/11759/*632E */,/*13977*/11759/*632F */,/*13978*/11759/*6330 */,/*13979*/11759/* 6331 */,/*13980*/11759/*6332 */, /*13981*/11759/*6333 */,/*13982*/11759/*6334 */,/*13983*/11759/*6335 */,/*13984*/11759/*6336 */,/*13985*/11759/*6337 */, /*13986*/11759/*6338 */,/*13987*/11759/*6339 */,/*13988*/11759/*633A */,/*13989*/11759/*633B */,/*13990*/11759/*633C */, /*13991*/11759/*633D */,/*13992*/11759/*633E */,/*13993*/11759/*633F */,/*13994*/11759/*6340 */,/*13995*/11759/*6341 */, /*13996*/11759/*6342 */,/*13997*/11759/*6343 */,/*13998*/11759/*6344 */,/*13999*/11759/*6345 */,/*14000*/11759/*6346 */, /*14001*/11759/*6347 */,/*14002*/11759/*6348 */,/*14003*/11759/*6349 */,/*14004*/11759/* 634A */,/*14005*/11759/*634B */, /*14006*/11772/* 634C */,/*14007*/11759/* 634D */,/*14008*/11760/* 67D2 */,/*14009*/11759/* 67D3 */, /*14010*/11760/* 6F06 */,/*14011*/11759/* 6F07 */,/*14012*/11763/* 7396 */,/*14013*/11759/* 7397 */, /*14014*/11770/* 767E */,/*14015*/11759/* 767F */,/*14016*/11766/* 8086 */,/*14017*/11759/* 8087 */, /*14018*/11761/* 842C */,/*14019*/11759/* 842D */,/*14020*/11764/* 8CAE */,/*14021*/11759/* 8CAF */, /*14022*/11759/*8CB0 */,/*14023*/11759/*8CB1 */,/*14024*/11759/*8CB2 */,/*14025*/11764/* 8CB3 */, /*14026*/11759/* 8CB4 */,/*14027*/11764/* 8D30 */,/*14028*/11759/* 8D31 */,/*14029*/11769/* 9621 */, /*14030*/11759/* 9622 */,/*14031*/11759/*9623 */,/*14032*/11759/*9624 */,/*14033*/11759/*9625 */,/*14034*/11759/*9626 */, /*14035*/11759/*9627 */,/*14036*/11759/*9628 */,/*14037*/11759/*9629 */,/*14038*/11759/*962A */,/*14039*/11759/*962B */, /*14040*/11759/*962C */,/*14041*/11759/*962D */,/*14042*/11759/*962E */,/*14043*/11759/*962F */,/*14044*/11759/*9630 */, /*14045*/11759/*9631 */,/*14046*/11759/*9632 */,/*14047*/11759/*9633 */,/*14048*/11759/*9634 */,/*14049*/11759/*9635 */, /*14050*/11759/*9636 */,/*14051*/11759/*9637 */,/*14052*/11759/*9638 */,/*14053*/11759/*9639 */,/*14054*/11759/*963A */, /*14055*/11759/* 963B */,/*14056*/11759/*963C */,/*14057*/11759/*963D */,/*14058*/11759/*963E */,/*14059*/11759/*963F */, /*14060*/11759/*9640 */,/*14061*/11759/*9641 */,/*14062*/11759/*9642 */,/*14063*/11759/*9643 */,/*14064*/11759/*9644 */, /*14065*/11759/*9645 */,/*14066*/11773/* 9646 */,/*14067*/11759/* 9647 */,/*14068*/11759/*9648 */, /*14069*/11759/*9649 */,/*14070*/11759/*964A */,/*14071*/11759/*964B */,/*14072*/11770/* 964C */, /*14073*/11759/* 964D */,/*14074*/11759/*964E */,/*14075*/11759/*964F */,/*14076*/11759/*9650 */,/*14077*/11759/*9651 */, /*14078*/11759/*9652 */,/*14079*/11759/*9653 */,/*14080*/11759/*9654 */,/*14081*/11759/*9655 */,/*14082*/11759/*9656 */, /*14083*/11759/*9657 */,/*14084*/11759/*9658 */,/*14085*/11759/*9659 */,/*14086*/11759/*965A */,/*14087*/11759/*965B */, /*14088*/11759/*965C */,/*14089*/11759/*965D */,/*14090*/11759/*965E */,/*14091*/11759/*965F */,/*14092*/11759/*9660 */, /*14093*/11759/*9661 */,/*14094*/11759/*9662 */,/*14095*/11759/*9663 */,/*14096*/11759/*9664 */,/*14097*/11759/*9665 */, /*14098*/11759/* 9666 */,/*14099*/11759/*9667 */,/*14100*/11759/*9668 */,/*14101*/11759/*9669 */,/*14102*/11759/*966A */, /*14103*/11759/*966B */,/*14104*/11759/*966C */,/*14105*/11759/*966D */,/*14106*/11759/*966E */,/*14107*/11759/*966F */, /*14108*/11759/*9670 */,/*14109*/11759/*9671 */,/*14110*/11759/*9672 */,/*14111*/11759/*9673 */,/*14112*/11759/*9674 */, /*14113*/11759/*9675 */,/*14114*/11759/*9676 */,/*14115*/11759/*9677 */,/*14116*/11773/* 9678 */, /*14117*/11759/* 9679 */,/*14118*/11777/* 96F6 */,/*14119*/11759/* 96F7 */,/*14120*/11778/* 9FA6 */, /*14121*/11778/*9FA7 */,/*14122*/11778/*9FA8 */,/*14123*/11778/*9FA9 */,/*14124*/11778/*9FAA */,/*14125*/11778/*9FAB */, /*14126*/11778/*9FAC */,/*14127*/11778/*9FAD */,/*14128*/11778/*9FAE */,/*14129*/11778/*9FAF */,/*14130*/11778/*9FB0 */, /*14131*/11778/*9FB1 */,/*14132*/11778/*9FB2 */,/*14133*/11778/*9FB3 */,/*14134*/11778/*9FB4 */,/*14135*/11778/*9FB5 */, /*14136*/11778/*9FB6 */,/*14137*/11778/*9FB7 */,/*14138*/11778/*9FB8 */,/*14139*/11778/*9FB9 */,/*14140*/11778/*9FBA */, /*14141*/11778/*9FBB */,/*14142*/11779/* 9FBC */,/*14143*/11779/*9FBD */,/*14144*/11779/*9FBE */,/*14145*/11779/*9FBF */, /*14146*/11779/*9FC0 */,/*14147*/11779/*9FC1 */,/*14148*/11779/*9FC2 */,/*14149*/11779/*9FC3 */,/*14150*/11780/* 9FC4 */, /*14151*/11780/*9FC5 */,/*14152*/11780/*9FC6 */,/*14153*/11780/*9FC7 */,/*14154*/11780/*9FC8 */,/*14155*/11780/*9FC9 */, /*14156*/11780/*9FCA */,/*14157*/11780/*9FCB */,/*14158*/11781/* 9FCC */,/*14159*/11782/* 9FCD */, /*14160*/11782/*9FCE */,/*14161*/11782/*9FCF */,/*14162*/11782/*9FD0 */,/*14163*/11782/*9FD1 */,/*14164*/11782/*9FD2 */, /*14165*/11782/*9FD3 */,/*14166*/11782/*9FD4 */,/*14167*/11782/*9FD5 */,/*14168*/11783/* 9FD6 */,/*14169*/11783/*9FD7 */, /*14170*/11783/*9FD8 */,/*14171*/11783/*9FD9 */,/*14172*/11783/*9FDA */,/*14173*/11783/*9FDB */,/*14174*/11783/*9FDC */, /*14175*/11783/*9FDD */,/*14176*/11783/*9FDE */,/*14177*/11783/*9FDF */,/*14178*/11783/*9FE0 */,/*14179*/11783/*9FE1 */, /*14180*/11783/*9FE2 */,/*14181*/11783/*9FE3 */,/*14182*/11783/*9FE4 */,/*14183*/11783/*9FE5 */,/*14184*/11783/*9FE6 */, /*14185*/11783/*9FE7 */,/*14186*/11783/*9FE8 */,/*14187*/11783/*9FE9 */,/*14188*/11783/*9FEA */,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,/*14210*/11784/* A000 */,/*14211*/11785/* A001 */,/*14212*/11786/* A002 */,/*14213*/11787/* A003 */, /*14214*/11788/* A004 */,/*14215*/11789/* A005 */,/*14216*/11790/* A006 */,/*14217*/11791/* A007 */, /*14218*/11792/* A008 */,/*14219*/11793/* A009 */,/*14220*/11794/* A00A */,/*14221*/11795/* A00B */, /*14222*/11796/* A00C */,/*14223*/11797/* A00D */,/*14224*/11798/* A00E */,/*14225*/11799/* A00F */, /*14226*/11800/* A010 */,/*14227*/11801/* A011 */,/*14228*/11802/* A012 */,/*14229*/11803/* A013 */, /*14230*/11804/* A014 */,/*14231*/11805/* A015 */,/*14232*/11806/* A016 */,/*14233*/11807/* A017 */, /*14234*/11808/* A018 */,/*14235*/11809/* A019 */,/*14236*/11810/* A01A */,/*14237*/11811/* A01B */, /*14238*/11812/* A01C */,/*14239*/11813/* A01D */,/*14240*/11814/* A01E */,/*14241*/11815/* A01F */, /*14242*/11816/* A020 */,/*14243*/11817/* A021 */,/*14244*/11818/* A022 */,/*14245*/11819/* A023 */, /*14246*/11820/* A024 */,/*14247*/11821/* A025 */,/*14248*/11822/* A026 */,/*14249*/11823/* A027 */, /*14250*/11824/* A028 */,/*14251*/11825/* A029 */,/*14252*/11826/* A02A */,/*14253*/11827/* A02B */, /*14254*/11828/* A02C */,/*14255*/11829/* A02D */,/*14256*/11830/* A02E */,/*14257*/11831/* A02F */, /*14258*/11832/* A030 */,/*14259*/11833/* A031 */,/*14260*/11834/* A032 */,/*14261*/11835/* A033 */, /*14262*/11836/* A034 */,/*14263*/11837/* A035 */,/*14264*/11838/* A036 */,/*14265*/11839/* A037 */, /*14266*/11840/* A038 */,/*14267*/11841/* A039 */,/*14268*/11842/* A03A */,/*14269*/11843/* A03B */, /*14270*/11844/* A03C */,/*14271*/11845/* A03D */,/*14272*/11846/* A03E */,/*14273*/11847/* A03F */, /*14274*/11848/* A040 */,/*14275*/11849/* A041 */,/*14276*/11850/* A042 */,/*14277*/11851/* A043 */, /*14278*/11852/* A044 */,/*14279*/11853/* A045 */,/*14280*/11854/* A046 */,/*14281*/11855/* A047 */, /*14282*/11856/* A048 */,/*14283*/11857/* A049 */,/*14284*/11858/* A04A */,/*14285*/11859/* A04B */, /*14286*/11860/* A04C */,/*14287*/11861/* A04D */,/*14288*/11862/* A04E */,/*14289*/11863/* A04F */, /*14290*/11864/* A050 */,/*14291*/11865/* A051 */,/*14292*/11866/* A052 */,/*14293*/11867/* A053 */, /*14294*/11868/* A054 */,/*14295*/11869/* A055 */,/*14296*/11870/* A056 */,/*14297*/11871/* A057 */, /*14298*/11872/* A058 */,/*14299*/11873/* A059 */,/*14300*/11874/* A05A */,/*14301*/11875/* A05B */, /*14302*/11876/* A05C */,/*14303*/11877/* A05D */,/*14304*/11878/* A05E */,/*14305*/11879/* A05F */, /*14306*/11880/* A060 */,/*14307*/11881/* A061 */,/*14308*/11882/* A062 */,/*14309*/11883/* A063 */, /*14310*/11884/* A064 */,/*14311*/11885/* A065 */,/*14312*/11886/* A066 */,/*14313*/11887/* A067 */, /*14314*/11888/* A068 */,/*14315*/11889/* A069 */,/*14316*/11890/* A06A */,/*14317*/11891/* A06B */, /*14318*/11892/* A06C */,/*14319*/11893/* A06D */,/*14320*/11894/* A06E */,/*14321*/11895/* A06F */, /*14322*/11896/* A070 */,/*14323*/11897/* A071 */,/*14324*/11898/* A072 */,/*14325*/11899/* A073 */, /*14326*/11900/* A074 */,/*14327*/11901/* A075 */,/*14328*/11902/* A076 */,/*14329*/11903/* A077 */, /*14330*/11904/* A078 */,/*14331*/11905/* A079 */,/*14332*/11906/* A07A */,/*14333*/11907/* A07B */, /*14334*/11908/* A07C */,/*14335*/11909/* A07D */,/*14336*/11910/* A07E */,/*14337*/11911/* A07F */, /*14338*/11912/* A080 */,/*14339*/11913/* A081 */,/*14340*/11914/* A082 */,/*14341*/11915/* A083 */, /*14342*/11916/* A084 */,/*14343*/11917/* A085 */,/*14344*/11918/* A086 */,/*14345*/11919/* A087 */, /*14346*/11920/* A088 */,/*14347*/11921/* A089 */,/*14348*/11922/* A08A */,/*14349*/11923/* A08B */, /*14350*/11924/* A08C */,/*14351*/11925/* A08D */,/*14352*/11926/* A08E */,/*14353*/11927/* A08F */, /*14354*/11928/* A090 */,/*14355*/11929/* A091 */,/*14356*/11930/* A092 */,/*14357*/11931/* A093 */, /*14358*/11932/* A094 */,/*14359*/11933/* A095 */,/*14360*/11934/* A096 */,/*14361*/11935/* A097 */, /*14362*/11936/* A098 */,/*14363*/11937/* A099 */,/*14364*/11938/* A09A */,/*14365*/11939/* A09B */, /*14366*/11940/* A09C */,/*14367*/11941/* A09D */,/*14368*/11942/* A09E */,/*14369*/11943/* A09F */, /*14370*/11944/* A0A0 */,/*14371*/11945/* A0A1 */,/*14372*/11946/* A0A2 */,/*14373*/11947/* A0A3 */, /*14374*/11948/* A0A4 */,/*14375*/11949/* A0A5 */,/*14376*/11950/* A0A6 */,/*14377*/11951/* A0A7 */, /*14378*/11952/* A0A8 */,/*14379*/11953/* A0A9 */,/*14380*/11954/* A0AA */,/*14381*/11955/* A0AB */, /*14382*/11956/* A0AC */,/*14383*/11957/* A0AD */,/*14384*/11958/* A0AE */,/*14385*/11959/* A0AF */, /*14386*/11960/* A0B0 */,/*14387*/11961/* A0B1 */,/*14388*/11962/* A0B2 */,/*14389*/11963/* A0B3 */, /*14390*/11964/* A0B4 */,/*14391*/11965/* A0B5 */,/*14392*/11966/* A0B6 */,/*14393*/11967/* A0B7 */, /*14394*/11968/* A0B8 */,/*14395*/11969/* A0B9 */,/*14396*/11970/* A0BA */,/*14397*/11971/* A0BB */, /*14398*/11972/* A0BC */,/*14399*/11973/* A0BD */,/*14400*/11974/* A0BE */,/*14401*/11975/* A0BF */, /*14402*/11976/* A0C0 */,/*14403*/11977/* A0C1 */,/*14404*/11978/* A0C2 */,/*14405*/11979/* A0C3 */, /*14406*/11980/* A0C4 */,/*14407*/11981/* A0C5 */,/*14408*/11982/* A0C6 */,/*14409*/11983/* A0C7 */, /*14410*/11984/* A0C8 */,/*14411*/11985/* A0C9 */,/*14412*/11986/* A0CA */,/*14413*/11987/* A0CB */, /*14414*/11988/* A0CC */,/*14415*/11989/* A0CD */,/*14416*/11990/* A0CE */,/*14417*/11991/* A0CF */, /*14418*/11992/* A0D0 */,/*14419*/11993/* A0D1 */,/*14420*/11994/* A0D2 */,/*14421*/11995/* A0D3 */, /*14422*/11996/* A0D4 */,/*14423*/11997/* A0D5 */,/*14424*/11998/* A0D6 */,/*14425*/11999/* A0D7 */, /*14426*/12000/* A0D8 */,/*14427*/12001/* A0D9 */,/*14428*/12002/* A0DA */,/*14429*/12003/* A0DB */, /*14430*/12004/* A0DC */,/*14431*/12005/* A0DD */,/*14432*/12006/* A0DE */,/*14433*/12007/* A0DF */, /*14434*/12008/* A0E0 */,/*14435*/12009/* A0E1 */,/*14436*/12010/* A0E2 */,/*14437*/12011/* A0E3 */, /*14438*/12012/* A0E4 */,/*14439*/12013/* A0E5 */,/*14440*/12014/* A0E6 */,/*14441*/12015/* A0E7 */, /*14442*/12016/* A0E8 */,/*14443*/12017/* A0E9 */,/*14444*/12018/* A0EA */,/*14445*/12019/* A0EB */, /*14446*/12020/* A0EC */,/*14447*/12021/* A0ED */,/*14448*/12022/* A0EE */,/*14449*/12023/* A0EF */, /*14450*/12024/* A0F0 */,/*14451*/12025/* A0F1 */,/*14452*/12026/* A0F2 */,/*14453*/12027/* A0F3 */, /*14454*/12028/* A0F4 */,/*14455*/12029/* A0F5 */,/*14456*/12030/* A0F6 */,/*14457*/12031/* A0F7 */, /*14458*/12032/* A0F8 */,/*14459*/12033/* A0F9 */,/*14460*/12034/* A0FA */,/*14461*/12035/* A0FB */, /*14462*/12036/* A0FC */,/*14463*/12037/* A0FD */,/*14464*/12038/* A0FE */,/*14465*/12039/* A0FF */, /*14466*/12040/* A100 */,/*14467*/12041/* A101 */,/*14468*/12042/* A102 */,/*14469*/12043/* A103 */, /*14470*/12044/* A104 */,/*14471*/12045/* A105 */,/*14472*/12046/* A106 */,/*14473*/12047/* A107 */, /*14474*/12048/* A108 */,/*14475*/12049/* A109 */,/*14476*/12050/* A10A */,/*14477*/12051/* A10B */, /*14478*/12052/* A10C */,/*14479*/12053/* A10D */,/*14480*/12054/* A10E */,/*14481*/12055/* A10F */, /*14482*/12056/* A110 */,/*14483*/12057/* A111 */,/*14484*/12058/* A112 */,/*14485*/12059/* A113 */, /*14486*/12060/* A114 */,/*14487*/12061/* A115 */,/*14488*/12062/* A116 */,/*14489*/12063/* A117 */, /*14490*/12064/* A118 */,/*14491*/12065/* A119 */,/*14492*/12066/* A11A */,/*14493*/12067/* A11B */, /*14494*/12068/* A11C */,/*14495*/12069/* A11D */,/*14496*/12070/* A11E */,/*14497*/12071/* A11F */, /*14498*/12072/* A120 */,/*14499*/12073/* A121 */,/*14500*/12074/* A122 */,/*14501*/12075/* A123 */, /*14502*/12076/* A124 */,/*14503*/12077/* A125 */,/*14504*/12078/* A126 */,/*14505*/12079/* A127 */, /*14506*/12080/* A128 */,/*14507*/12081/* A129 */,/*14508*/12082/* A12A */,/*14509*/12083/* A12B */, /*14510*/12084/* A12C */,/*14511*/12085/* A12D */,/*14512*/12086/* A12E */,/*14513*/12087/* A12F */, /*14514*/12088/* A130 */,/*14515*/12089/* A131 */,/*14516*/12090/* A132 */,/*14517*/12091/* A133 */, /*14518*/12092/* A134 */,/*14519*/12093/* A135 */,/*14520*/12094/* A136 */,/*14521*/12095/* A137 */, /*14522*/12096/* A138 */,/*14523*/12097/* A139 */,/*14524*/12098/* A13A */,/*14525*/12099/* A13B */, /*14526*/12100/* A13C */,/*14527*/12101/* A13D */,/*14528*/12102/* A13E */,/*14529*/12103/* A13F */, /*14530*/12104/* A140 */,/*14531*/12105/* A141 */,/*14532*/12106/* A142 */,/*14533*/12107/* A143 */, /*14534*/12108/* A144 */,/*14535*/12109/* A145 */,/*14536*/12110/* A146 */,/*14537*/12111/* A147 */, /*14538*/12112/* A148 */,/*14539*/12113/* A149 */,/*14540*/12114/* A14A */,/*14541*/12115/* A14B */, /*14542*/12116/* A14C */,/*14543*/12117/* A14D */,/*14544*/12118/* A14E */,/*14545*/12119/* A14F */, /*14546*/12120/* A150 */,/*14547*/12121/* A151 */,/*14548*/12122/* A152 */,/*14549*/12123/* A153 */, /*14550*/12124/* A154 */,/*14551*/12125/* A155 */,/*14552*/12126/* A156 */,/*14553*/12127/* A157 */, /*14554*/12128/* A158 */,/*14555*/12129/* A159 */,/*14556*/12130/* A15A */,/*14557*/12131/* A15B */, /*14558*/12132/* A15C */,/*14559*/12133/* A15D */,/*14560*/12134/* A15E */,/*14561*/12135/* A15F */, /*14562*/12136/* A160 */,/*14563*/12137/* A161 */,/*14564*/12138/* A162 */,/*14565*/12139/* A163 */, /*14566*/12140/* A164 */,/*14567*/12141/* A165 */,/*14568*/12142/* A166 */,/*14569*/12143/* A167 */, /*14570*/12144/* A168 */,/*14571*/12145/* A169 */,/*14572*/12146/* A16A */,/*14573*/12147/* A16B */, /*14574*/12148/* A16C */,/*14575*/12149/* A16D */,/*14576*/12150/* A16E */,/*14577*/12151/* A16F */, /*14578*/12152/* A170 */,/*14579*/12153/* A171 */,/*14580*/12154/* A172 */,/*14581*/12155/* A173 */, /*14582*/12156/* A174 */,/*14583*/12157/* A175 */,/*14584*/12158/* A176 */,/*14585*/12159/* A177 */, /*14586*/12160/* A178 */,/*14587*/12161/* A179 */,/*14588*/12162/* A17A */,/*14589*/12163/* A17B */, /*14590*/12164/* A17C */,/*14591*/12165/* A17D */,/*14592*/12166/* A17E */,/*14593*/12167/* A17F */, /*14594*/12168/* A180 */,/*14595*/12169/* A181 */,/*14596*/12170/* A182 */,/*14597*/12171/* A183 */, /*14598*/12172/* A184 */,/*14599*/12173/* A185 */,/*14600*/12174/* A186 */,/*14601*/12175/* A187 */, /*14602*/12176/* A188 */,/*14603*/12177/* A189 */,/*14604*/12178/* A18A */,/*14605*/12179/* A18B */, /*14606*/12180/* A18C */,/*14607*/12181/* A18D */,/*14608*/12182/* A18E */,/*14609*/12183/* A18F */, /*14610*/12184/* A190 */,/*14611*/12185/* A191 */,/*14612*/12186/* A192 */,/*14613*/12187/* A193 */, /*14614*/12188/* A194 */,/*14615*/12189/* A195 */,/*14616*/12190/* A196 */,/*14617*/12191/* A197 */, /*14618*/12192/* A198 */,/*14619*/12193/* A199 */,/*14620*/12194/* A19A */,/*14621*/12195/* A19B */, /*14622*/12196/* A19C */,/*14623*/12197/* A19D */,/*14624*/12198/* A19E */,/*14625*/12199/* A19F */, /*14626*/12200/* A1A0 */,/*14627*/12201/* A1A1 */,/*14628*/12202/* A1A2 */,/*14629*/12203/* A1A3 */, /*14630*/12204/* A1A4 */,/*14631*/12205/* A1A5 */,/*14632*/12206/* A1A6 */,/*14633*/12207/* A1A7 */, /*14634*/12208/* A1A8 */,/*14635*/12209/* A1A9 */,/*14636*/12210/* A1AA */,/*14637*/12211/* A1AB */, /*14638*/12212/* A1AC */,/*14639*/12213/* A1AD */,/*14640*/12214/* A1AE */,/*14641*/12215/* A1AF */, /*14642*/12216/* A1B0 */,/*14643*/12217/* A1B1 */,/*14644*/12218/* A1B2 */,/*14645*/12219/* A1B3 */, /*14646*/12220/* A1B4 */,/*14647*/12221/* A1B5 */,/*14648*/12222/* A1B6 */,/*14649*/12223/* A1B7 */, /*14650*/12224/* A1B8 */,/*14651*/12225/* A1B9 */,/*14652*/12226/* A1BA */,/*14653*/12227/* A1BB */, /*14654*/12228/* A1BC */,/*14655*/12229/* A1BD */,/*14656*/12230/* A1BE */,/*14657*/12231/* A1BF */, /*14658*/12232/* A1C0 */,/*14659*/12233/* A1C1 */,/*14660*/12234/* A1C2 */,/*14661*/12235/* A1C3 */, /*14662*/12236/* A1C4 */,/*14663*/12237/* A1C5 */,/*14664*/12238/* A1C6 */,/*14665*/12239/* A1C7 */, /*14666*/12240/* A1C8 */,/*14667*/12241/* A1C9 */,/*14668*/12242/* A1CA */,/*14669*/12243/* A1CB */, /*14670*/12244/* A1CC */,/*14671*/12245/* A1CD */,/*14672*/12246/* A1CE */,/*14673*/12247/* A1CF */, /*14674*/12248/* A1D0 */,/*14675*/12249/* A1D1 */,/*14676*/12250/* A1D2 */,/*14677*/12251/* A1D3 */, /*14678*/12252/* A1D4 */,/*14679*/12253/* A1D5 */,/*14680*/12254/* A1D6 */,/*14681*/12255/* A1D7 */, /*14682*/12256/* A1D8 */,/*14683*/12257/* A1D9 */,/*14684*/12258/* A1DA */,/*14685*/12259/* A1DB */, /*14686*/12260/* A1DC */,/*14687*/12261/* A1DD */,/*14688*/12262/* A1DE */,/*14689*/12263/* A1DF */, /*14690*/12264/* A1E0 */,/*14691*/12265/* A1E1 */,/*14692*/12266/* A1E2 */,/*14693*/12267/* A1E3 */, /*14694*/12268/* A1E4 */,/*14695*/12269/* A1E5 */,/*14696*/12270/* A1E6 */,/*14697*/12271/* A1E7 */, /*14698*/12272/* A1E8 */,/*14699*/12273/* A1E9 */,/*14700*/12274/* A1EA */,/*14701*/12275/* A1EB */, /*14702*/12276/* A1EC */,/*14703*/12277/* A1ED */,/*14704*/12278/* A1EE */,/*14705*/12279/* A1EF */, /*14706*/12280/* A1F0 */,/*14707*/12281/* A1F1 */,/*14708*/12282/* A1F2 */,/*14709*/12283/* A1F3 */, /*14710*/12284/* A1F4 */,/*14711*/12285/* A1F5 */,/*14712*/12286/* A1F6 */,/*14713*/12287/* A1F7 */, /*14714*/12288/* A1F8 */,/*14715*/12289/* A1F9 */,/*14716*/12290/* A1FA */,/*14717*/12291/* A1FB */, /*14718*/12292/* A1FC */,/*14719*/12293/* A1FD */,/*14720*/12294/* A1FE */,/*14721*/12295/* A1FF */, /*14722*/12296/* A200 */,/*14723*/12297/* A201 */,/*14724*/12298/* A202 */,/*14725*/12299/* A203 */, /*14726*/12300/* A204 */,/*14727*/12301/* A205 */,/*14728*/12302/* A206 */,/*14729*/12303/* A207 */, /*14730*/12304/* A208 */,/*14731*/12305/* A209 */,/*14732*/12306/* A20A */,/*14733*/12307/* A20B */, /*14734*/12308/* A20C */,/*14735*/12309/* A20D */,/*14736*/12310/* A20E */,/*14737*/12311/* A20F */, /*14738*/12312/* A210 */,/*14739*/12313/* A211 */,/*14740*/12314/* A212 */,/*14741*/12315/* A213 */, /*14742*/12316/* A214 */,/*14743*/12317/* A215 */,/*14744*/12318/* A216 */,/*14745*/12319/* A217 */, /*14746*/12320/* A218 */,/*14747*/12321/* A219 */,/*14748*/12322/* A21A */,/*14749*/12323/* A21B */, /*14750*/12324/* A21C */,/*14751*/12325/* A21D */,/*14752*/12326/* A21E */,/*14753*/12327/* A21F */, /*14754*/12328/* A220 */,/*14755*/12329/* A221 */,/*14756*/12330/* A222 */,/*14757*/12331/* A223 */, /*14758*/12332/* A224 */,/*14759*/12333/* A225 */,/*14760*/12334/* A226 */,/*14761*/12335/* A227 */, /*14762*/12336/* A228 */,/*14763*/12337/* A229 */,/*14764*/12338/* A22A */,/*14765*/12339/* A22B */, /*14766*/12340/* A22C */,/*14767*/12341/* A22D */,/*14768*/12342/* A22E */,/*14769*/12343/* A22F */, /*14770*/12344/* A230 */,/*14771*/12345/* A231 */,/*14772*/12346/* A232 */,/*14773*/12347/* A233 */, /*14774*/12348/* A234 */,/*14775*/12349/* A235 */,/*14776*/12350/* A236 */,/*14777*/12351/* A237 */, /*14778*/12352/* A238 */,/*14779*/12353/* A239 */,/*14780*/12354/* A23A */,/*14781*/12355/* A23B */, /*14782*/12356/* A23C */,/*14783*/12357/* A23D */,/*14784*/12358/* A23E */,/*14785*/12359/* A23F */, /*14786*/12360/* A240 */,/*14787*/12361/* A241 */,/*14788*/12362/* A242 */,/*14789*/12363/* A243 */, /*14790*/12364/* A244 */,/*14791*/12365/* A245 */,/*14792*/12366/* A246 */,/*14793*/12367/* A247 */, /*14794*/12368/* A248 */,/*14795*/12369/* A249 */,/*14796*/12370/* A24A */,/*14797*/12371/* A24B */, /*14798*/12372/* A24C */,/*14799*/12373/* A24D */,/*14800*/12374/* A24E */,/*14801*/12375/* A24F */, /*14802*/12376/* A250 */,/*14803*/12377/* A251 */,/*14804*/12378/* A252 */,/*14805*/12379/* A253 */, /*14806*/12380/* A254 */,/*14807*/12381/* A255 */,/*14808*/12382/* A256 */,/*14809*/12383/* A257 */, /*14810*/12384/* A258 */,/*14811*/12385/* A259 */,/*14812*/12386/* A25A */,/*14813*/12387/* A25B */, /*14814*/12388/* A25C */,/*14815*/12389/* A25D */,/*14816*/12390/* A25E */,/*14817*/12391/* A25F */, /*14818*/12392/* A260 */,/*14819*/12393/* A261 */,/*14820*/12394/* A262 */,/*14821*/12395/* A263 */, /*14822*/12396/* A264 */,/*14823*/12397/* A265 */,/*14824*/12398/* A266 */,/*14825*/12399/* A267 */, /*14826*/12400/* A268 */,/*14827*/12401/* A269 */,/*14828*/12402/* A26A */,/*14829*/12403/* A26B */, /*14830*/12404/* A26C */,/*14831*/12405/* A26D */,/*14832*/12406/* A26E */,/*14833*/12407/* A26F */, /*14834*/12408/* A270 */,/*14835*/12409/* A271 */,/*14836*/12410/* A272 */,/*14837*/12411/* A273 */, /*14838*/12412/* A274 */,/*14839*/12413/* A275 */,/*14840*/12414/* A276 */,/*14841*/12415/* A277 */, /*14842*/12416/* A278 */,/*14843*/12417/* A279 */,/*14844*/12418/* A27A */,/*14845*/12419/* A27B */, /*14846*/12420/* A27C */,/*14847*/12421/* A27D */,/*14848*/12422/* A27E */,/*14849*/12423/* A27F */, /*14850*/12424/* A280 */,/*14851*/12425/* A281 */,/*14852*/12426/* A282 */,/*14853*/12427/* A283 */, /*14854*/12428/* A284 */,/*14855*/12429/* A285 */,/*14856*/12430/* A286 */,/*14857*/12431/* A287 */, /*14858*/12432/* A288 */,/*14859*/12433/* A289 */,/*14860*/12434/* A28A */,/*14861*/12435/* A28B */, /*14862*/12436/* A28C */,/*14863*/12437/* A28D */,/*14864*/12438/* A28E */,/*14865*/12439/* A28F */, /*14866*/12440/* A290 */,/*14867*/12441/* A291 */,/*14868*/12442/* A292 */,/*14869*/12443/* A293 */, /*14870*/12444/* A294 */,/*14871*/12445/* A295 */,/*14872*/12446/* A296 */,/*14873*/12447/* A297 */, /*14874*/12448/* A298 */,/*14875*/12449/* A299 */,/*14876*/12450/* A29A */,/*14877*/12451/* A29B */, /*14878*/12452/* A29C */,/*14879*/12453/* A29D */,/*14880*/12454/* A29E */,/*14881*/12455/* A29F */, /*14882*/12456/* A2A0 */,/*14883*/12457/* A2A1 */,/*14884*/12458/* A2A2 */,/*14885*/12459/* A2A3 */, /*14886*/12460/* A2A4 */,/*14887*/12461/* A2A5 */,/*14888*/12462/* A2A6 */,/*14889*/12463/* A2A7 */, /*14890*/12464/* A2A8 */,/*14891*/12465/* A2A9 */,/*14892*/12466/* A2AA */,/*14893*/12467/* A2AB */, /*14894*/12468/* A2AC */,/*14895*/12469/* A2AD */,/*14896*/12470/* A2AE */,/*14897*/12471/* A2AF */, /*14898*/12472/* A2B0 */,/*14899*/12473/* A2B1 */,/*14900*/12474/* A2B2 */,/*14901*/12475/* A2B3 */, /*14902*/12476/* A2B4 */,/*14903*/12477/* A2B5 */,/*14904*/12478/* A2B6 */,/*14905*/12479/* A2B7 */, /*14906*/12480/* A2B8 */,/*14907*/12481/* A2B9 */,/*14908*/12482/* A2BA */,/*14909*/12483/* A2BB */, /*14910*/12484/* A2BC */,/*14911*/12485/* A2BD */,/*14912*/12486/* A2BE */,/*14913*/12487/* A2BF */, /*14914*/12488/* A2C0 */,/*14915*/12489/* A2C1 */,/*14916*/12490/* A2C2 */,/*14917*/12491/* A2C3 */, /*14918*/12492/* A2C4 */,/*14919*/12493/* A2C5 */,/*14920*/12494/* A2C6 */,/*14921*/12495/* A2C7 */, /*14922*/12496/* A2C8 */,/*14923*/12497/* A2C9 */,/*14924*/12498/* A2CA */,/*14925*/12499/* A2CB */, /*14926*/12500/* A2CC */,/*14927*/12501/* A2CD */,/*14928*/12502/* A2CE */,/*14929*/12503/* A2CF */, /*14930*/12504/* A2D0 */,/*14931*/12505/* A2D1 */,/*14932*/12506/* A2D2 */,/*14933*/12507/* A2D3 */, /*14934*/12508/* A2D4 */,/*14935*/12509/* A2D5 */,/*14936*/12510/* A2D6 */,/*14937*/12511/* A2D7 */, /*14938*/12512/* A2D8 */,/*14939*/12513/* A2D9 */,/*14940*/12514/* A2DA */,/*14941*/12515/* A2DB */, /*14942*/12516/* A2DC */,/*14943*/12517/* A2DD */,/*14944*/12518/* A2DE */,/*14945*/12519/* A2DF */, /*14946*/12520/* A2E0 */,/*14947*/12521/* A2E1 */,/*14948*/12522/* A2E2 */,/*14949*/12523/* A2E3 */, /*14950*/12524/* A2E4 */,/*14951*/12525/* A2E5 */,/*14952*/12526/* A2E6 */,/*14953*/12527/* A2E7 */, /*14954*/12528/* A2E8 */,/*14955*/12529/* A2E9 */,/*14956*/12530/* A2EA */,/*14957*/12531/* A2EB */, /*14958*/12532/* A2EC */,/*14959*/12533/* A2ED */,/*14960*/12534/* A2EE */,/*14961*/12535/* A2EF */, /*14962*/12536/* A2F0 */,/*14963*/12537/* A2F1 */,/*14964*/12538/* A2F2 */,/*14965*/12539/* A2F3 */, /*14966*/12540/* A2F4 */,/*14967*/12541/* A2F5 */,/*14968*/12542/* A2F6 */,/*14969*/12543/* A2F7 */, /*14970*/12544/* A2F8 */,/*14971*/12545/* A2F9 */,/*14972*/12546/* A2FA */,/*14973*/12547/* A2FB */, /*14974*/12548/* A2FC */,/*14975*/12549/* A2FD */,/*14976*/12550/* A2FE */,/*14977*/12551/* A2FF */, /*14978*/12552/* A300 */,/*14979*/12553/* A301 */,/*14980*/12554/* A302 */,/*14981*/12555/* A303 */, /*14982*/12556/* A304 */,/*14983*/12557/* A305 */,/*14984*/12558/* A306 */,/*14985*/12559/* A307 */, /*14986*/12560/* A308 */,/*14987*/12561/* A309 */,/*14988*/12562/* A30A */,/*14989*/12563/* A30B */, /*14990*/12564/* A30C */,/*14991*/12565/* A30D */,/*14992*/12566/* A30E */,/*14993*/12567/* A30F */, /*14994*/12568/* A310 */,/*14995*/12569/* A311 */,/*14996*/12570/* A312 */,/*14997*/12571/* A313 */, /*14998*/12572/* A314 */,/*14999*/12573/* A315 */,/*15000*/12574/* A316 */,/*15001*/12575/* A317 */, /*15002*/12576/* A318 */,/*15003*/12577/* A319 */,/*15004*/12578/* A31A */,/*15005*/12579/* A31B */, /*15006*/12580/* A31C */,/*15007*/12581/* A31D */,/*15008*/12582/* A31E */,/*15009*/12583/* A31F */, /*15010*/12584/* A320 */,/*15011*/12585/* A321 */,/*15012*/12586/* A322 */,/*15013*/12587/* A323 */, /*15014*/12588/* A324 */,/*15015*/12589/* A325 */,/*15016*/12590/* A326 */,/*15017*/12591/* A327 */, /*15018*/12592/* A328 */,/*15019*/12593/* A329 */,/*15020*/12594/* A32A */,/*15021*/12595/* A32B */, /*15022*/12596/* A32C */,/*15023*/12597/* A32D */,/*15024*/12598/* A32E */,/*15025*/12599/* A32F */, /*15026*/12600/* A330 */,/*15027*/12601/* A331 */,/*15028*/12602/* A332 */,/*15029*/12603/* A333 */, /*15030*/12604/* A334 */,/*15031*/12605/* A335 */,/*15032*/12606/* A336 */,/*15033*/12607/* A337 */, /*15034*/12608/* A338 */,/*15035*/12609/* A339 */,/*15036*/12610/* A33A */,/*15037*/12611/* A33B */, /*15038*/12612/* A33C */,/*15039*/12613/* A33D */,/*15040*/12614/* A33E */,/*15041*/12615/* A33F */, /*15042*/12616/* A340 */,/*15043*/12617/* A341 */,/*15044*/12618/* A342 */,/*15045*/12619/* A343 */, /*15046*/12620/* A344 */,/*15047*/12621/* A345 */,/*15048*/12622/* A346 */,/*15049*/12623/* A347 */, /*15050*/12624/* A348 */,/*15051*/12625/* A349 */,/*15052*/12626/* A34A */,/*15053*/12627/* A34B */, /*15054*/12628/* A34C */,/*15055*/12629/* A34D */,/*15056*/12630/* A34E */,/*15057*/12631/* A34F */, /*15058*/12632/* A350 */,/*15059*/12633/* A351 */,/*15060*/12634/* A352 */,/*15061*/12635/* A353 */, /*15062*/12636/* A354 */,/*15063*/12637/* A355 */,/*15064*/12638/* A356 */,/*15065*/12639/* A357 */, /*15066*/12640/* A358 */,/*15067*/12641/* A359 */,/*15068*/12642/* A35A */,/*15069*/12643/* A35B */, /*15070*/12644/* A35C */,/*15071*/12645/* A35D */,/*15072*/12646/* A35E */,/*15073*/12647/* A35F */, /*15074*/12648/* A360 */,/*15075*/12649/* A361 */,/*15076*/12650/* A362 */,/*15077*/12651/* A363 */, /*15078*/12652/* A364 */,/*15079*/12653/* A365 */,/*15080*/12654/* A366 */,/*15081*/12655/* A367 */, /*15082*/12656/* A368 */,/*15083*/12657/* A369 */,/*15084*/12658/* A36A */,/*15085*/12659/* A36B */, /*15086*/12660/* A36C */,/*15087*/12661/* A36D */,/*15088*/12662/* A36E */,/*15089*/12663/* A36F */, /*15090*/12664/* A370 */,/*15091*/12665/* A371 */,/*15092*/12666/* A372 */,/*15093*/12667/* A373 */, /*15094*/12668/* A374 */,/*15095*/12669/* A375 */,/*15096*/12670/* A376 */,/*15097*/12671/* A377 */, /*15098*/12672/* A378 */,/*15099*/12673/* A379 */,/*15100*/12674/* A37A */,/*15101*/12675/* A37B */, /*15102*/12676/* A37C */,/*15103*/12677/* A37D */,/*15104*/12678/* A37E */,/*15105*/12679/* A37F */, /*15106*/12680/* A380 */,/*15107*/12681/* A381 */,/*15108*/12682/* A382 */,/*15109*/12683/* A383 */, /*15110*/12684/* A384 */,/*15111*/12685/* A385 */,/*15112*/12686/* A386 */,/*15113*/12687/* A387 */, /*15114*/12688/* A388 */,/*15115*/12689/* A389 */,/*15116*/12690/* A38A */,/*15117*/12691/* A38B */, /*15118*/12692/* A38C */,/*15119*/12693/* A38D */,/*15120*/12694/* A38E */,/*15121*/12695/* A38F */, /*15122*/12696/* A390 */,/*15123*/12697/* A391 */,/*15124*/12698/* A392 */,/*15125*/12699/* A393 */, /*15126*/12700/* A394 */,/*15127*/12701/* A395 */,/*15128*/12702/* A396 */,/*15129*/12703/* A397 */, /*15130*/12704/* A398 */,/*15131*/12705/* A399 */,/*15132*/12706/* A39A */,/*15133*/12707/* A39B */, /*15134*/12708/* A39C */,/*15135*/12709/* A39D */,/*15136*/12710/* A39E */,/*15137*/12711/* A39F */, /*15138*/12712/* A3A0 */,/*15139*/12713/* A3A1 */,/*15140*/12714/* A3A2 */,/*15141*/12715/* A3A3 */, /*15142*/12716/* A3A4 */,/*15143*/12717/* A3A5 */,/*15144*/12718/* A3A6 */,/*15145*/12719/* A3A7 */, /*15146*/12720/* A3A8 */,/*15147*/12721/* A3A9 */,/*15148*/12722/* A3AA */,/*15149*/12723/* A3AB */, /*15150*/12724/* A3AC */,/*15151*/12725/* A3AD */,/*15152*/12726/* A3AE */,/*15153*/12727/* A3AF */, /*15154*/12728/* A3B0 */,/*15155*/12729/* A3B1 */,/*15156*/12730/* A3B2 */,/*15157*/12731/* A3B3 */, /*15158*/12732/* A3B4 */,/*15159*/12733/* A3B5 */,/*15160*/12734/* A3B6 */,/*15161*/12735/* A3B7 */, /*15162*/12736/* A3B8 */,/*15163*/12737/* A3B9 */,/*15164*/12738/* A3BA */,/*15165*/12739/* A3BB */, /*15166*/12740/* A3BC */,/*15167*/12741/* A3BD */,/*15168*/12742/* A3BE */,/*15169*/12743/* A3BF */, /*15170*/12744/* A3C0 */,/*15171*/12745/* A3C1 */,/*15172*/12746/* A3C2 */,/*15173*/12747/* A3C3 */, /*15174*/12748/* A3C4 */,/*15175*/12749/* A3C5 */,/*15176*/12750/* A3C6 */,/*15177*/12751/* A3C7 */, /*15178*/12752/* A3C8 */,/*15179*/12753/* A3C9 */,/*15180*/12754/* A3CA */,/*15181*/12755/* A3CB */, /*15182*/12756/* A3CC */,/*15183*/12757/* A3CD */,/*15184*/12758/* A3CE */,/*15185*/12759/* A3CF */, /*15186*/12760/* A3D0 */,/*15187*/12761/* A3D1 */,/*15188*/12762/* A3D2 */,/*15189*/12763/* A3D3 */, /*15190*/12764/* A3D4 */,/*15191*/12765/* A3D5 */,/*15192*/12766/* A3D6 */,/*15193*/12767/* A3D7 */, /*15194*/12768/* A3D8 */,/*15195*/12769/* A3D9 */,/*15196*/12770/* A3DA */,/*15197*/12771/* A3DB */, /*15198*/12772/* A3DC */,/*15199*/12773/* A3DD */,/*15200*/12774/* A3DE */,/*15201*/12775/* A3DF */, /*15202*/12776/* A3E0 */,/*15203*/12777/* A3E1 */,/*15204*/12778/* A3E2 */,/*15205*/12779/* A3E3 */, /*15206*/12780/* A3E4 */,/*15207*/12781/* A3E5 */,/*15208*/12782/* A3E6 */,/*15209*/12783/* A3E7 */, /*15210*/12784/* A3E8 */,/*15211*/12785/* A3E9 */,/*15212*/12786/* A3EA */,/*15213*/12787/* A3EB */, /*15214*/12788/* A3EC */,/*15215*/12789/* A3ED */,/*15216*/12790/* A3EE */,/*15217*/12791/* A3EF */, /*15218*/12792/* A3F0 */,/*15219*/12793/* A3F1 */,/*15220*/12794/* A3F2 */,/*15221*/12795/* A3F3 */, /*15222*/12796/* A3F4 */,/*15223*/12797/* A3F5 */,/*15224*/12798/* A3F6 */,/*15225*/12799/* A3F7 */, /*15226*/12800/* A3F8 */,/*15227*/12801/* A3F9 */,/*15228*/12802/* A3FA */,/*15229*/12803/* A3FB */, /*15230*/12804/* A3FC */,/*15231*/12805/* A3FD */,/*15232*/12806/* A3FE */,/*15233*/12807/* A3FF */, /*15234*/12808/* A400 */,/*15235*/12809/* A401 */,/*15236*/12810/* A402 */,/*15237*/12811/* A403 */, /*15238*/12812/* A404 */,/*15239*/12813/* A405 */,/*15240*/12814/* A406 */,/*15241*/12815/* A407 */, /*15242*/12816/* A408 */,/*15243*/12817/* A409 */,/*15244*/12818/* A40A */,/*15245*/12819/* A40B */, /*15246*/12820/* A40C */,/*15247*/12821/* A40D */,/*15248*/12822/* A40E */,/*15249*/12823/* A40F */, /*15250*/12824/* A410 */,/*15251*/12825/* A411 */,/*15252*/12826/* A412 */,/*15253*/12827/* A413 */, /*15254*/12828/* A414 */,/*15255*/12829/* A415 */,/*15256*/12830/* A416 */,/*15257*/12831/* A417 */, /*15258*/12832/* A418 */,/*15259*/12833/* A419 */,/*15260*/12834/* A41A */,/*15261*/12835/* A41B */, /*15262*/12836/* A41C */,/*15263*/12837/* A41D */,/*15264*/12838/* A41E */,/*15265*/12839/* A41F */, /*15266*/12840/* A420 */,/*15267*/12841/* A421 */,/*15268*/12842/* A422 */,/*15269*/12843/* A423 */, /*15270*/12844/* A424 */,/*15271*/12845/* A425 */,/*15272*/12846/* A426 */,/*15273*/12847/* A427 */, /*15274*/12848/* A428 */,/*15275*/12849/* A429 */,/*15276*/12850/* A42A */,/*15277*/12851/* A42B */, /*15278*/12852/* A42C */,/*15279*/12853/* A42D */,/*15280*/12854/* A42E */,/*15281*/12855/* A42F */, /*15282*/12856/* A430 */,/*15283*/12857/* A431 */,/*15284*/12858/* A432 */,/*15285*/12859/* A433 */, /*15286*/12860/* A434 */,/*15287*/12861/* A435 */,/*15288*/12862/* A436 */,/*15289*/12863/* A437 */, /*15290*/12864/* A438 */,/*15291*/12865/* A439 */,/*15292*/12866/* A43A */,/*15293*/12867/* A43B */, /*15294*/12868/* A43C */,/*15295*/12869/* A43D */,/*15296*/12870/* A43E */,/*15297*/12871/* A43F */, /*15298*/12872/* A440 */,/*15299*/12873/* A441 */,/*15300*/12874/* A442 */,/*15301*/12875/* A443 */, /*15302*/12876/* A444 */,/*15303*/12877/* A445 */,/*15304*/12878/* A446 */,/*15305*/12879/* A447 */, /*15306*/12880/* A448 */,/*15307*/12881/* A449 */,/*15308*/12882/* A44A */,/*15309*/12883/* A44B */, /*15310*/12884/* A44C */,/*15311*/12885/* A44D */,/*15312*/12886/* A44E */,/*15313*/12887/* A44F */, /*15314*/12888/* A450 */,/*15315*/12889/* A451 */,/*15316*/12890/* A452 */,/*15317*/12891/* A453 */, /*15318*/12892/* A454 */,/*15319*/12893/* A455 */,/*15320*/12894/* A456 */,/*15321*/12895/* A457 */, /*15322*/12896/* A458 */,/*15323*/12897/* A459 */,/*15324*/12898/* A45A */,/*15325*/12899/* A45B */, /*15326*/12900/* A45C */,/*15327*/12901/* A45D */,/*15328*/12902/* A45E */,/*15329*/12903/* A45F */, /*15330*/12904/* A460 */,/*15331*/12905/* A461 */,/*15332*/12906/* A462 */,/*15333*/12907/* A463 */, /*15334*/12908/* A464 */,/*15335*/12909/* A465 */,/*15336*/12910/* A466 */,/*15337*/12911/* A467 */, /*15338*/12912/* A468 */,/*15339*/12913/* A469 */,/*15340*/12914/* A46A */,/*15341*/12915/* A46B */, /*15342*/12916/* A46C */,/*15343*/12917/* A46D */,/*15344*/12918/* A46E */,/*15345*/12919/* A46F */, /*15346*/12920/* A470 */,/*15347*/12921/* A471 */,/*15348*/12922/* A472 */,/*15349*/12923/* A473 */, /*15350*/12924/* A474 */,/*15351*/12925/* A475 */,/*15352*/12926/* A476 */,/*15353*/12927/* A477 */, /*15354*/12928/* A478 */,/*15355*/12929/* A479 */,/*15356*/12930/* A47A */,/*15357*/12931/* A47B */, /*15358*/12932/* A47C */,/*15359*/12933/* A47D */,/*15360*/12934/* A47E */,/*15361*/12935/* A47F */, /*15362*/12936/* A480 */,/*15363*/12937/* A481 */,/*15364*/12938/* A482 */,/*15365*/12939/* A483 */, /*15366*/12940/* A484 */,/*15367*/12941/* A485 */,/*15368*/12942/* A486 */,/*15369*/12943/* A487 */, /*15370*/12944/* A488 */,/*15371*/12945/* A489 */,/*15372*/12946/* A48A */,/*15373*/12947/* A48B */, /*15374*/12948/* A48C */,0,0,0,/*15378*/12949/* A490 */,/*15379*/12950/* A491 */,/*15380*/12951/* A492 */, /*15381*/12952/* A493 */,/*15382*/12953/* A494 */,/*15383*/12954/* A495 */,/*15384*/12955/* A496 */, /*15385*/12956/* A497 */,/*15386*/12957/* A498 */,/*15387*/12958/* A499 */,/*15388*/12959/* A49A */, /*15389*/12960/* A49B */,/*15390*/12961/* A49C */,/*15391*/12962/* A49D */,/*15392*/12963/* A49E */, /*15393*/12964/* A49F */,/*15394*/12965/* A4A0 */,/*15395*/12966/* A4A1 */,/*15396*/12967/* A4A2 */, /*15397*/12968/* A4A3 */,/*15398*/12969/* A4A4 */,/*15399*/12970/* A4A5 */,/*15400*/12971/* A4A6 */, /*15401*/12972/* A4A7 */,/*15402*/12973/* A4A8 */,/*15403*/12974/* A4A9 */,/*15404*/12975/* A4AA */, /*15405*/12976/* A4AB */,/*15406*/12977/* A4AC */,/*15407*/12978/* A4AD */,/*15408*/12979/* A4AE */, /*15409*/12980/* A4AF */,/*15410*/12981/* A4B0 */,/*15411*/12982/* A4B1 */,/*15412*/12983/* A4B2 */, /*15413*/12984/* A4B3 */,/*15414*/12985/* A4B4 */,/*15415*/12986/* A4B5 */,/*15416*/12987/* A4B6 */, /*15417*/12988/* A4B7 */,/*15418*/12989/* A4B8 */,/*15419*/12990/* A4B9 */,/*15420*/12991/* A4BA */, /*15421*/12992/* A4BB */,/*15422*/12993/* A4BC */,/*15423*/12994/* A4BD */,/*15424*/12995/* A4BE */, /*15425*/12996/* A4BF */,/*15426*/12997/* A4C0 */,/*15427*/12998/* A4C1 */,/*15428*/12999/* A4C2 */, /*15429*/13000/* A4C3 */,/*15430*/13001/* A4C4 */,/*15431*/13002/* A4C5 */,/*15432*/13003/* A4C6 */,0,0,0,0,0,0,0,0,0, /*15442*/13004/* A4D0 */,/*15443*/13005/* A4D1 */,/*15444*/13006/* A4D2 */,/*15445*/13007/* A4D3 */, /*15446*/13008/* A4D4 */,/*15447*/13009/* A4D5 */,/*15448*/13010/* A4D6 */,/*15449*/13011/* A4D7 */, /*15450*/13012/* A4D8 */,/*15451*/13013/* A4D9 */,/*15452*/13014/* A4DA */,/*15453*/13015/* A4DB */, /*15454*/13016/* A4DC */,/*15455*/13017/* A4DD */,/*15456*/13018/* A4DE */,/*15457*/13019/* A4DF */, /*15458*/13020/* A4E0 */,/*15459*/13021/* A4E1 */,/*15460*/13022/* A4E2 */,/*15461*/13023/* A4E3 */, /*15462*/13024/* A4E4 */,/*15463*/13025/* A4E5 */,/*15464*/13026/* A4E6 */,/*15465*/13027/* A4E7 */, /*15466*/13028/* A4E8 */,/*15467*/13029/* A4E9 */,/*15468*/13030/* A4EA */,/*15469*/13031/* A4EB */, /*15470*/13032/* A4EC */,/*15471*/13033/* A4ED */,/*15472*/13034/* A4EE */,/*15473*/13035/* A4EF */, /*15474*/13036/* A4F0 */,/*15475*/13037/* A4F1 */,/*15476*/13038/* A4F2 */,/*15477*/13039/* A4F3 */, /*15478*/13040/* A4F4 */,/*15479*/13041/* A4F5 */,/*15480*/13042/* A4F6 */,/*15481*/13043/* A4F7 */, /*15482*/13044/* A4F8 */,/*15483*/13045/* A4F9 */,/*15484*/13046/* A4FA */,/*15485*/13047/* A4FB */, /*15486*/13048/* A4FC */,/*15487*/13049/* A4FD */,/*15488*/13050/* A4FE */,/*15489*/13051/* A4FF */, /*15490*/13052/* A500 */,/*15491*/13053/* A501 */,/*15492*/13054/* A502 */,/*15493*/13055/* A503 */, /*15494*/13056/* A504 */,/*15495*/13057/* A505 */,/*15496*/13058/* A506 */,/*15497*/13059/* A507 */, /*15498*/13060/* A508 */,/*15499*/13061/* A509 */,/*15500*/13062/* A50A */,/*15501*/13063/* A50B */, /*15502*/13064/* A50C */,/*15503*/13065/* A50D */,/*15504*/13066/* A50E */,/*15505*/13067/* A50F */, /*15506*/13068/* A510 */,/*15507*/13069/* A511 */,/*15508*/13070/* A512 */,/*15509*/13071/* A513 */, /*15510*/13072/* A514 */,/*15511*/13073/* A515 */,/*15512*/13074/* A516 */,/*15513*/13075/* A517 */, /*15514*/13076/* A518 */,/*15515*/13077/* A519 */,/*15516*/13078/* A51A */,/*15517*/13079/* A51B */, /*15518*/13080/* A51C */,/*15519*/13081/* A51D */,/*15520*/13082/* A51E */,/*15521*/13083/* A51F */, /*15522*/13084/* A520 */,/*15523*/13085/* A521 */,/*15524*/13086/* A522 */,/*15525*/13087/* A523 */, /*15526*/13088/* A524 */,/*15527*/13089/* A525 */,/*15528*/13090/* A526 */,/*15529*/13091/* A527 */, /*15530*/13092/* A528 */,/*15531*/13093/* A529 */,/*15532*/13094/* A52A */,/*15533*/13095/* A52B */, /*15534*/13096/* A52C */,/*15535*/13097/* A52D */,/*15536*/13098/* A52E */,/*15537*/13099/* A52F */, /*15538*/13100/* A530 */,/*15539*/13101/* A531 */,/*15540*/13102/* A532 */,/*15541*/13103/* A533 */, /*15542*/13104/* A534 */,/*15543*/13105/* A535 */,/*15544*/13106/* A536 */,/*15545*/13107/* A537 */, /*15546*/13108/* A538 */,/*15547*/13109/* A539 */,/*15548*/13110/* A53A */,/*15549*/13111/* A53B */, /*15550*/13112/* A53C */,/*15551*/13113/* A53D */,/*15552*/13114/* A53E */,/*15553*/13115/* A53F */, /*15554*/13116/* A540 */,/*15555*/13117/* A541 */,/*15556*/13118/* A542 */,/*15557*/13119/* A543 */, /*15558*/13120/* A544 */,/*15559*/13121/* A545 */,/*15560*/13122/* A546 */,/*15561*/13123/* A547 */, /*15562*/13124/* A548 */,/*15563*/13125/* A549 */,/*15564*/13126/* A54A */,/*15565*/13127/* A54B */, /*15566*/13128/* A54C */,/*15567*/13129/* A54D */,/*15568*/13130/* A54E */,/*15569*/13131/* A54F */, /*15570*/13132/* A550 */,/*15571*/13133/* A551 */,/*15572*/13134/* A552 */,/*15573*/13135/* A553 */, /*15574*/13136/* A554 */,/*15575*/13137/* A555 */,/*15576*/13138/* A556 */,/*15577*/13139/* A557 */, /*15578*/13140/* A558 */,/*15579*/13141/* A559 */,/*15580*/13142/* A55A */,/*15581*/13143/* A55B */, /*15582*/13144/* A55C */,/*15583*/13145/* A55D */,/*15584*/13146/* A55E */,/*15585*/13147/* A55F */, /*15586*/13148/* A560 */,/*15587*/13149/* A561 */,/*15588*/13150/* A562 */,/*15589*/13151/* A563 */, /*15590*/13152/* A564 */,/*15591*/13153/* A565 */,/*15592*/13154/* A566 */,/*15593*/13155/* A567 */, /*15594*/13156/* A568 */,/*15595*/13157/* A569 */,/*15596*/13158/* A56A */,/*15597*/13159/* A56B */, /*15598*/13160/* A56C */,/*15599*/13161/* A56D */,/*15600*/13162/* A56E */,/*15601*/13163/* A56F */, /*15602*/13164/* A570 */,/*15603*/13165/* A571 */,/*15604*/13166/* A572 */,/*15605*/13167/* A573 */, /*15606*/13168/* A574 */,/*15607*/13169/* A575 */,/*15608*/13170/* A576 */,/*15609*/13171/* A577 */, /*15610*/13172/* A578 */,/*15611*/13173/* A579 */,/*15612*/13174/* A57A */,/*15613*/13175/* A57B */, /*15614*/13176/* A57C */,/*15615*/13177/* A57D */,/*15616*/13178/* A57E */,/*15617*/13179/* A57F */, /*15618*/13180/* A580 */,/*15619*/13181/* A581 */,/*15620*/13182/* A582 */,/*15621*/13183/* A583 */, /*15622*/13184/* A584 */,/*15623*/13185/* A585 */,/*15624*/13186/* A586 */,/*15625*/13187/* A587 */, /*15626*/13188/* A588 */,/*15627*/13189/* A589 */,/*15628*/13190/* A58A */,/*15629*/13191/* A58B */, /*15630*/13192/* A58C */,/*15631*/13193/* A58D */,/*15632*/13194/* A58E */,/*15633*/13195/* A58F */, /*15634*/13196/* A590 */,/*15635*/13197/* A591 */,/*15636*/13198/* A592 */,/*15637*/13199/* A593 */, /*15638*/13200/* A594 */,/*15639*/13201/* A595 */,/*15640*/13202/* A596 */,/*15641*/13203/* A597 */, /*15642*/13204/* A598 */,/*15643*/13205/* A599 */,/*15644*/13206/* A59A */,/*15645*/13207/* A59B */, /*15646*/13208/* A59C */,/*15647*/13209/* A59D */,/*15648*/13210/* A59E */,/*15649*/13211/* A59F */, /*15650*/13212/* A5A0 */,/*15651*/13213/* A5A1 */,/*15652*/13214/* A5A2 */,/*15653*/13215/* A5A3 */, /*15654*/13216/* A5A4 */,/*15655*/13217/* A5A5 */,/*15656*/13218/* A5A6 */,/*15657*/13219/* A5A7 */, /*15658*/13220/* A5A8 */,/*15659*/13221/* A5A9 */,/*15660*/13222/* A5AA */,/*15661*/13223/* A5AB */, /*15662*/13224/* A5AC */,/*15663*/13225/* A5AD */,/*15664*/13226/* A5AE */,/*15665*/13227/* A5AF */, /*15666*/13228/* A5B0 */,/*15667*/13229/* A5B1 */,/*15668*/13230/* A5B2 */,/*15669*/13231/* A5B3 */, /*15670*/13232/* A5B4 */,/*15671*/13233/* A5B5 */,/*15672*/13234/* A5B6 */,/*15673*/13235/* A5B7 */, /*15674*/13236/* A5B8 */,/*15675*/13237/* A5B9 */,/*15676*/13238/* A5BA */,/*15677*/13239/* A5BB */, /*15678*/13240/* A5BC */,/*15679*/13241/* A5BD */,/*15680*/13242/* A5BE */,/*15681*/13243/* A5BF */, /*15682*/13244/* A5C0 */,/*15683*/13245/* A5C1 */,/*15684*/13246/* A5C2 */,/*15685*/13247/* A5C3 */, /*15686*/13248/* A5C4 */,/*15687*/13249/* A5C5 */,/*15688*/13250/* A5C6 */,/*15689*/13251/* A5C7 */, /*15690*/13252/* A5C8 */,/*15691*/13253/* A5C9 */,/*15692*/13254/* A5CA */,/*15693*/13255/* A5CB */, /*15694*/13256/* A5CC */,/*15695*/13257/* A5CD */,/*15696*/13258/* A5CE */,/*15697*/13259/* A5CF */, /*15698*/13260/* A5D0 */,/*15699*/13261/* A5D1 */,/*15700*/13262/* A5D2 */,/*15701*/13263/* A5D3 */, /*15702*/13264/* A5D4 */,/*15703*/13265/* A5D5 */,/*15704*/13266/* A5D6 */,/*15705*/13267/* A5D7 */, /*15706*/13268/* A5D8 */,/*15707*/13269/* A5D9 */,/*15708*/13270/* A5DA */,/*15709*/13271/* A5DB */, /*15710*/13272/* A5DC */,/*15711*/13273/* A5DD */,/*15712*/13274/* A5DE */,/*15713*/13275/* A5DF */, /*15714*/13276/* A5E0 */,/*15715*/13277/* A5E1 */,/*15716*/13278/* A5E2 */,/*15717*/13279/* A5E3 */, /*15718*/13280/* A5E4 */,/*15719*/13281/* A5E5 */,/*15720*/13282/* A5E6 */,/*15721*/13283/* A5E7 */, /*15722*/13284/* A5E8 */,/*15723*/13285/* A5E9 */,/*15724*/13286/* A5EA */,/*15725*/13287/* A5EB */, /*15726*/13288/* A5EC */,/*15727*/13289/* A5ED */,/*15728*/13290/* A5EE */,/*15729*/13291/* A5EF */, /*15730*/13292/* A5F0 */,/*15731*/13293/* A5F1 */,/*15732*/13294/* A5F2 */,/*15733*/13295/* A5F3 */, /*15734*/13296/* A5F4 */,/*15735*/13297/* A5F5 */,/*15736*/13298/* A5F6 */,/*15737*/13299/* A5F7 */, /*15738*/13300/* A5F8 */,/*15739*/13301/* A5F9 */,/*15740*/13302/* A5FA */,/*15741*/13303/* A5FB */, /*15742*/13304/* A5FC */,/*15743*/13305/* A5FD */,/*15744*/13306/* A5FE */,/*15745*/13307/* A5FF */, /*15746*/13308/* A600 */,/*15747*/13309/* A601 */,/*15748*/13310/* A602 */,/*15749*/13311/* A603 */, /*15750*/13312/* A604 */,/*15751*/13313/* A605 */,/*15752*/13314/* A606 */,/*15753*/13315/* A607 */, /*15754*/13316/* A608 */,/*15755*/13317/* A609 */,/*15756*/13318/* A60A */,/*15757*/13319/* A60B */, /*15758*/13320/* A60C */,/*15759*/13321/* A60D */,/*15760*/13322/* A60E */,/*15761*/13323/* A60F */, /*15762*/13324/* A610 */,/*15763*/13325/* A611 */,/*15764*/13326/* A612 */,/*15765*/13327/* A613 */, /*15766*/13328/* A614 */,/*15767*/13329/* A615 */,/*15768*/13330/* A616 */,/*15769*/13331/* A617 */, /*15770*/13332/* A618 */,/*15771*/13333/* A619 */,/*15772*/13334/* A61A */,/*15773*/13335/* A61B */, /*15774*/13336/* A61C */,/*15775*/13337/* A61D */,/*15776*/13338/* A61E */,/*15777*/13339/* A61F */, /*15778*/13340/* A620 */,/*15779*/13341/* A621 */,/*15780*/13342/* A622 */,/*15781*/13343/* A623 */, /*15782*/13344/* A624 */,/*15783*/13345/* A625 */,/*15784*/13346/* A626 */,/*15785*/13347/* A627 */, /*15786*/13348/* A628 */,/*15787*/13349/* A629 */,/*15788*/13350/* A62A */,/*15789*/13351/* A62B */,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,/*15810*/13352/* A640 */,/*15811*/13353/* A641 */,/*15812*/13354/* A642 */,/*15813*/13355/* A643 */, /*15814*/13356/* A644 */,/*15815*/13357/* A645 */,/*15816*/13358/* A646 */,/*15817*/13359/* A647 */, /*15818*/13360/* A648 */,/*15819*/13361/* A649 */,/*15820*/13362/* A64A */,/*15821*/13363/* A64B */, /*15822*/13364/* A64C */,/*15823*/13365/* A64D */,/*15824*/13366/* A64E */,/*15825*/13367/* A64F */, /*15826*/13368/* A650 */,/*15827*/13369/* A651 */,/*15828*/13370/* A652 */,/*15829*/13371/* A653 */, /*15830*/13372/* A654 */,/*15831*/13373/* A655 */,/*15832*/13374/* A656 */,/*15833*/13375/* A657 */, /*15834*/13376/* A658 */,/*15835*/13377/* A659 */,/*15836*/13378/* A65A */,/*15837*/13379/* A65B */, /*15838*/13380/* A65C */,/*15839*/13381/* A65D */,/*15840*/13382/* A65E */,/*15841*/13383/* A65F */, /*15842*/13384/* A660 */,/*15843*/13385/* A661 */,/*15844*/13386/* A662 */,/*15845*/13387/* A663 */, /*15846*/13388/* A664 */,/*15847*/13389/* A665 */,/*15848*/13390/* A666 */,/*15849*/13391/* A667 */, /*15850*/13392/* A668 */,/*15851*/13393/* A669 */,/*15852*/13394/* A66A */,/*15853*/13395/* A66B */, /*15854*/13396/* A66C */,/*15855*/13397/* A66D */,/*15856*/13398/* A66E */,/*15857*/13399/* A66F */, /*15858*/13400/* A670 */,/*15859*/13400/* A671 */,/*15860*/13400/* A672 */,/*15861*/13401/* A673 */, /*15862*/13402/* A674 */,/*15863*/13403/* A675 */,/*15864*/13404/* A676 */,/*15865*/13405/* A677 */, /*15866*/13406/* A678 */,/*15867*/13407/* A679 */,/*15868*/13408/* A67A */,/*15869*/13409/* A67B */, /*15870*/13410/* A67C */,/*15871*/13410/* A67D */,/*15872*/13411/* A67E */,/*15873*/13412/* A67F */, /*15874*/13413/* A680 */,/*15875*/13414/* A681 */,/*15876*/13415/* A682 */,/*15877*/13416/* A683 */, /*15878*/13417/* A684 */,/*15879*/13418/* A685 */,/*15880*/13419/* A686 */,/*15881*/13420/* A687 */, /*15882*/13421/* A688 */,/*15883*/13422/* A689 */,/*15884*/13423/* A68A */,/*15885*/13424/* A68B */, /*15886*/13425/* A68C */,/*15887*/13426/* A68D */,/*15888*/13427/* A68E */,/*15889*/13428/* A68F */, /*15890*/13429/* A690 */,/*15891*/13430/* A691 */,/*15892*/13431/* A692 */,/*15893*/13432/* A693 */, /*15894*/13433/* A694 */,/*15895*/13434/* A695 */,/*15896*/13435/* A696 */,/*15897*/13436/* A697 */, /*15898*/13437/* A698 */,/*15899*/13438/* A699 */,/*15900*/13439/* A69A */,/*15901*/13440/* A69B */, /*15902*/13441/* A69C */,/*15903*/13442/* A69D */,/*15904*/13443/* A69E */,/*15905*/13444/* A69F */, /*15906*/13445/* A6A0 */,/*15907*/13446/* A6A1 */,/*15908*/13447/* A6A2 */,/*15909*/13448/* A6A3 */, /*15910*/13449/* A6A4 */,/*15911*/13450/* A6A5 */,/*15912*/13451/* A6A6 */,/*15913*/13452/* A6A7 */, /*15914*/13453/* A6A8 */,/*15915*/13454/* A6A9 */,/*15916*/13455/* A6AA */,/*15917*/13456/* A6AB */, /*15918*/13457/* A6AC */,/*15919*/13458/* A6AD */,/*15920*/13459/* A6AE */,/*15921*/13460/* A6AF */, /*15922*/13461/* A6B0 */,/*15923*/13462/* A6B1 */,/*15924*/13463/* A6B2 */,/*15925*/13464/* A6B3 */, /*15926*/13465/* A6B4 */,/*15927*/13466/* A6B5 */,/*15928*/13467/* A6B6 */,/*15929*/13468/* A6B7 */, /*15930*/13469/* A6B8 */,/*15931*/13470/* A6B9 */,/*15932*/13471/* A6BA */,/*15933*/13472/* A6BB */, /*15934*/13473/* A6BC */,/*15935*/13474/* A6BD */,/*15936*/13475/* A6BE */,/*15937*/13476/* A6BF */, /*15938*/13477/* A6C0 */,/*15939*/13478/* A6C1 */,/*15940*/13479/* A6C2 */,/*15941*/13480/* A6C3 */, /*15942*/13481/* A6C4 */,/*15943*/13482/* A6C5 */,/*15944*/13483/* A6C6 */,/*15945*/13484/* A6C7 */, /*15946*/13485/* A6C8 */,/*15947*/13486/* A6C9 */,/*15948*/13487/* A6CA */,/*15949*/13488/* A6CB */, /*15950*/13489/* A6CC */,/*15951*/13490/* A6CD */,/*15952*/13491/* A6CE */,/*15953*/13492/* A6CF */, /*15954*/13493/* A6D0 */,/*15955*/13494/* A6D1 */,/*15956*/13495/* A6D2 */,/*15957*/13496/* A6D3 */, /*15958*/13497/* A6D4 */,/*15959*/13498/* A6D5 */,/*15960*/13499/* A6D6 */,/*15961*/13500/* A6D7 */, /*15962*/13501/* A6D8 */,/*15963*/13502/* A6D9 */,/*15964*/13503/* A6DA */,/*15965*/13504/* A6DB */, /*15966*/13505/* A6DC */,/*15967*/13506/* A6DD */,/*15968*/13507/* A6DE */,/*15969*/13508/* A6DF */, /*15970*/13509/* A6E0 */,/*15971*/13510/* A6E1 */,/*15972*/13511/* A6E2 */,/*15973*/13512/* A6E3 */, /*15974*/13513/* A6E4 */,/*15975*/13514/* A6E5 */,/*15976*/13515/* A6E6 */,/*15977*/13516/* A6E7 */, /*15978*/13517/* A6E8 */,/*15979*/13518/* A6E9 */,/*15980*/13519/* A6EA */,/*15981*/13520/* A6EB */, /*15982*/13521/* A6EC */,/*15983*/13522/* A6ED */,/*15984*/13523/* A6EE */,/*15985*/13524/* A6EF */, /*15986*/13525/* A6F0 */,/*15987*/13526/* A6F1 */,/*15988*/13527/* A6F2 */,/*15989*/13528/* A6F3 */, /*15990*/13529/* A6F4 */,/*15991*/13530/* A6F5 */,/*15992*/13531/* A6F6 */,/*15993*/13532/* A6F7 */,0,0,0,0,0,0,0,0, /*16002*/13533/* A700 */,/*16003*/13534/* A701 */,/*16004*/13535/* A702 */,/*16005*/13536/* A703 */, /*16006*/13537/* A704 */,/*16007*/13538/* A705 */,/*16008*/13539/* A706 */,/*16009*/13540/* A707 */, /*16010*/13541/* A708 */,/*16011*/13542/* A709 */,/*16012*/13543/* A70A */,/*16013*/13544/* A70B */, /*16014*/13545/* A70C */,/*16015*/13546/* A70D */,/*16016*/13547/* A70E */,/*16017*/13548/* A70F */, /*16018*/13549/* A710 */,/*16019*/13550/* A711 */,/*16020*/13551/* A712 */,/*16021*/13552/* A713 */, /*16022*/13553/* A714 */,/*16023*/13554/* A715 */,/*16024*/13555/* A716 */,/*16025*/13556/* A717 */, /*16026*/13557/* A718 */,/*16027*/13558/* A719 */,/*16028*/13559/* A71A */,/*16029*/13560/* A71B */, /*16030*/13561/* A71C */,/*16031*/13562/* A71D */,/*16032*/13563/* A71E */,/*16033*/13564/* A71F */, /*16034*/13565/* A720 */,/*16035*/13566/* A721 */,/*16036*/13567/* A722 */,/*16037*/13568/* A723 */, /*16038*/13569/* A724 */,/*16039*/13570/* A725 */,/*16040*/13571/* A726 */,/*16041*/13572/* A727 */, /*16042*/13573/* A728 */,/*16043*/13574/* A729 */,/*16044*/13575/* A72A */,/*16045*/13576/* A72B */, /*16046*/13577/* A72C */,/*16047*/13578/* A72D */,/*16048*/13579/* A72E */,/*16049*/13580/* A72F */, /*16050*/13581/* A730 */,/*16051*/13582/* A731 */,/*16052*/13583/* A732 */,/*16053*/13584/* A733 */, /*16054*/13585/* A734 */,/*16055*/13586/* A735 */,/*16056*/13587/* A736 */,/*16057*/13588/* A737 */, /*16058*/13589/* A738 */,/*16059*/13590/* A739 */,/*16060*/13591/* A73A */,/*16061*/13592/* A73B */, /*16062*/13593/* A73C */,/*16063*/13594/* A73D */,/*16064*/13595/* A73E */,/*16065*/13596/* A73F */, /*16066*/13597/* A740 */,/*16067*/13598/* A741 */,/*16068*/13599/* A742 */,/*16069*/13600/* A743 */, /*16070*/13601/* A744 */,/*16071*/13602/* A745 */,/*16072*/13603/* A746 */,/*16073*/13604/* A747 */, /*16074*/13605/* A748 */,/*16075*/13606/* A749 */,/*16076*/13607/* A74A */,/*16077*/13608/* A74B */, /*16078*/13609/* A74C */,/*16079*/13610/* A74D */,/*16080*/13611/* A74E */,/*16081*/13612/* A74F */, /*16082*/13613/* A750 */,/*16083*/13614/* A751 */,/*16084*/13615/* A752 */,/*16085*/13616/* A753 */, /*16086*/13617/* A754 */,/*16087*/13618/* A755 */,/*16088*/13619/* A756 */,/*16089*/13620/* A757 */, /*16090*/13621/* A758 */,/*16091*/13622/* A759 */,/*16092*/13623/* A75A */,/*16093*/13624/* A75B */, /*16094*/13625/* A75C */,/*16095*/13626/* A75D */,/*16096*/13627/* A75E */,/*16097*/13628/* A75F */, /*16098*/13629/* A760 */,/*16099*/13630/* A761 */,/*16100*/13631/* A762 */,/*16101*/13632/* A763 */, /*16102*/13633/* A764 */,/*16103*/13634/* A765 */,/*16104*/13635/* A766 */,/*16105*/13636/* A767 */, /*16106*/13637/* A768 */,/*16107*/13638/* A769 */,/*16108*/13639/* A76A */,/*16109*/13640/* A76B */, /*16110*/13641/* A76C */,/*16111*/13642/* A76D */,/*16112*/13643/* A76E */,/*16113*/13644/* A76F */, /*16114*/13645/* A770 */,/*16115*/13646/* A771 */,/*16116*/13647/* A772 */,/*16117*/13648/* A773 */, /*16118*/13649/* A774 */,/*16119*/13650/* A775 */,/*16120*/13651/* A776 */,/*16121*/13652/* A777 */, /*16122*/13653/* A778 */,/*16123*/13654/* A779 */,/*16124*/13655/* A77A */,/*16125*/13656/* A77B */, /*16126*/13657/* A77C */,/*16127*/13658/* A77D */,/*16128*/13659/* A77E */,/*16129*/13660/* A77F */, /*16130*/13661/* A780 */,/*16131*/13662/* A781 */,/*16132*/13663/* A782 */,/*16133*/13664/* A783 */, /*16134*/13665/* A784 */,/*16135*/13666/* A785 */,/*16136*/13667/* A786 */,/*16137*/13668/* A787 */, /*16138*/13669/* A788 */,/*16139*/13670/* A789 */,/*16140*/13671/* A78A */,/*16141*/13672/* A78B */, /*16142*/13673/* A78C */,/*16143*/13674/* A78D */,/*16144*/13675/* A78E */,/*16145*/13676/* A78F */, /*16146*/13677/* A790 */,/*16147*/13678/* A791 */,/*16148*/13679/* A792 */,/*16149*/13680/* A793 */, /*16150*/13681/* A794 */,/*16151*/13682/* A795 */,/*16152*/13683/* A796 */,/*16153*/13684/* A797 */, /*16154*/13685/* A798 */,/*16155*/13686/* A799 */,/*16156*/13687/* A79A */,/*16157*/13688/* A79B */, /*16158*/13689/* A79C */,/*16159*/13690/* A79D */,/*16160*/13691/* A79E */,/*16161*/13692/* A79F */, /*16162*/13693/* A7A0 */,/*16163*/13694/* A7A1 */,/*16164*/13695/* A7A2 */,/*16165*/13696/* A7A3 */, /*16166*/13697/* A7A4 */,/*16167*/13698/* A7A5 */,/*16168*/13699/* A7A6 */,/*16169*/13700/* A7A7 */, /*16170*/13701/* A7A8 */,/*16171*/13702/* A7A9 */,/*16172*/13703/* A7AA */,/*16173*/13704/* A7AB */, /*16174*/13705/* A7AC */,/*16175*/13706/* A7AD */,/*16176*/13707/* A7AE */,0,/*16178*/13708/* A7B0 */, /*16179*/13709/* A7B1 */,/*16180*/13710/* A7B2 */,/*16181*/13711/* A7B3 */,/*16182*/13712/* A7B4 */, /*16183*/13713/* A7B5 */,/*16184*/13714/* A7B6 */,/*16185*/13715/* A7B7 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*16249*/13716/* A7F7 */, /*16250*/13717/* A7F8 */,/*16251*/13718/* A7F9 */,/*16252*/13719/* A7FA */,/*16253*/13720/* A7FB */, /*16254*/13721/* A7FC */,/*16255*/13722/* A7FD */,/*16256*/13723/* A7FE */,/*16257*/13724/* A7FF */, /*16258*/13725/* A800 */,/*16259*/13726/* A801 */,/*16260*/13727/* A802 */,/*16261*/13728/* A803 */, /*16262*/13729/* A804 */,/*16263*/13730/* A805 */,/*16264*/13731/* A806 */,/*16265*/13732/* A807 */, /*16266*/13733/* A808 */,/*16267*/13734/* A809 */,/*16268*/13735/* A80A */,/*16269*/13736/* A80B */, /*16270*/13737/* A80C */,/*16271*/13738/* A80D */,/*16272*/13739/* A80E */,/*16273*/13740/* A80F */, /*16274*/13741/* A810 */,/*16275*/13742/* A811 */,/*16276*/13743/* A812 */,/*16277*/13744/* A813 */, /*16278*/13745/* A814 */,/*16279*/13746/* A815 */,/*16280*/13747/* A816 */,/*16281*/13748/* A817 */, /*16282*/13749/* A818 */,/*16283*/13750/* A819 */,/*16284*/13751/* A81A */,/*16285*/13752/* A81B */, /*16286*/13753/* A81C */,/*16287*/13754/* A81D */,/*16288*/13755/* A81E */,/*16289*/13756/* A81F */, /*16290*/13757/* A820 */,/*16291*/13758/* A821 */,/*16292*/13759/* A822 */,/*16293*/13760/* A823 */, /*16294*/13761/* A824 */,/*16295*/13762/* A825 */,/*16296*/13763/* A826 */,/*16297*/13764/* A827 */, /*16298*/13765/* A828 */,/*16299*/13766/* A829 */,/*16300*/13767/* A82A */,/*16301*/13768/* A82B */,0,0,0,0, /*16306*/13769/* A830 */,/*16307*/13770/* A831 */,/*16308*/13771/* A832 */,/*16309*/13772/* A833 */, /*16310*/13773/* A834 */,/*16311*/13774/* A835 */,/*16312*/13775/* A836 */,/*16313*/13776/* A837 */, /*16314*/13777/* A838 */,/*16315*/13778/* A839 */,0,0,0,0,0,0,/*16322*/13779/* A840 */,/*16323*/13780/* A841 */, /*16324*/13781/* A842 */,/*16325*/13782/* A843 */,/*16326*/13783/* A844 */,/*16327*/13784/* A845 */, /*16328*/13785/* A846 */,/*16329*/13786/* A847 */,/*16330*/13787/* A848 */,/*16331*/13788/* A849 */, /*16332*/13789/* A84A */,/*16333*/13790/* A84B */,/*16334*/13791/* A84C */,/*16335*/13792/* A84D */, /*16336*/13793/* A84E */,/*16337*/13794/* A84F */,/*16338*/13795/* A850 */,/*16339*/13796/* A851 */, /*16340*/13797/* A852 */,/*16341*/13798/* A853 */,/*16342*/13799/* A854 */,/*16343*/13800/* A855 */, /*16344*/13801/* A856 */,/*16345*/13802/* A857 */,/*16346*/13803/* A858 */,/*16347*/13804/* A859 */, /*16348*/13805/* A85A */,/*16349*/13806/* A85B */,/*16350*/13807/* A85C */,/*16351*/13808/* A85D */, /*16352*/13809/* A85E */,/*16353*/13810/* A85F */,/*16354*/13811/* A860 */,/*16355*/13812/* A861 */, /*16356*/13813/* A862 */,/*16357*/13814/* A863 */,/*16358*/13815/* A864 */,/*16359*/13816/* A865 */, /*16360*/13817/* A866 */,/*16361*/13818/* A867 */,/*16362*/13819/* A868 */,/*16363*/13820/* A869 */, /*16364*/13821/* A86A */,/*16365*/13822/* A86B */,/*16366*/13823/* A86C */,/*16367*/13824/* A86D */, /*16368*/13825/* A86E */,/*16369*/13826/* A86F */,/*16370*/13827/* A870 */,/*16371*/13828/* A871 */, /*16372*/13829/* A872 */,/*16373*/13830/* A873 */,/*16374*/13831/* A874 */,/*16375*/13832/* A875 */, /*16376*/13833/* A876 */,/*16377*/13834/* A877 */,0,0,0,0,0,0,0,0,/*16386*/13835/* A880 */,/*16387*/13836/* A881 */, /*16388*/13837/* A882 */,/*16389*/13838/* A883 */,/*16390*/13839/* A884 */,/*16391*/13840/* A885 */, /*16392*/13841/* A886 */,/*16393*/13842/* A887 */,/*16394*/13843/* A888 */,/*16395*/13844/* A889 */, /*16396*/13845/* A88A */,/*16397*/13846/* A88B */,/*16398*/13847/* A88C */,/*16399*/13848/* A88D */, /*16400*/13849/* A88E */,/*16401*/13850/* A88F */,/*16402*/13851/* A890 */,/*16403*/13852/* A891 */, /*16404*/13853/* A892 */,/*16405*/13854/* A893 */,/*16406*/13855/* A894 */,/*16407*/13856/* A895 */, /*16408*/13857/* A896 */,/*16409*/13858/* A897 */,/*16410*/13859/* A898 */,/*16411*/13860/* A899 */, /*16412*/13861/* A89A */,/*16413*/13862/* A89B */,/*16414*/13863/* A89C */,/*16415*/13864/* A89D */, /*16416*/13865/* A89E */,/*16417*/13866/* A89F */,/*16418*/13867/* A8A0 */,/*16419*/13868/* A8A1 */, /*16420*/13869/* A8A2 */,/*16421*/13870/* A8A3 */,/*16422*/13871/* A8A4 */,/*16423*/13872/* A8A5 */, /*16424*/13873/* A8A6 */,/*16425*/13874/* A8A7 */,/*16426*/13875/* A8A8 */,/*16427*/13876/* A8A9 */, /*16428*/13877/* A8AA */,/*16429*/13878/* A8AB */,/*16430*/13879/* A8AC */,/*16431*/13880/* A8AD */, /*16432*/13881/* A8AE */,/*16433*/13882/* A8AF */,/*16434*/13883/* A8B0 */,/*16435*/13884/* A8B1 */, /*16436*/13885/* A8B2 */,/*16437*/13886/* A8B3 */,/*16438*/13887/* A8B4 */,/*16439*/13888/* A8B5 */, /*16440*/13889/* A8B6 */,/*16441*/13890/* A8B7 */,/*16442*/13891/* A8B8 */,/*16443*/13892/* A8B9 */, /*16444*/13893/* A8BA */,/*16445*/13894/* A8BB */,/*16446*/13895/* A8BC */,/*16447*/13896/* A8BD */, /*16448*/13897/* A8BE */,/*16449*/13898/* A8BF */,/*16450*/13899/* A8C0 */,/*16451*/13900/* A8C1 */, /*16452*/13901/* A8C2 */,/*16453*/13902/* A8C3 */,/*16454*/13903/* A8C4 */,/*16455*/13904/* A8C5 */,0,0,0,0,0,0,0,0, /*16464*/13905/* A8CE */,/*16465*/13906/* A8CF */,/*16466*/13907/* A8D0 */,/*16467*/13908/* A8D1 */, /*16468*/13909/* A8D2 */,/*16469*/13910/* A8D3 */,/*16470*/13911/* A8D4 */,/*16471*/13912/* A8D5 */, /*16472*/13913/* A8D6 */,/*16473*/13914/* A8D7 */,/*16474*/13915/* A8D8 */,/*16475*/13916/* A8D9 */,0,0,0,0,0,0, /*16482*/13917/* A8E0 */,/*16483*/13917/* A8E1 */,/*16484*/13917/* A8E2 */,/*16485*/13917/* A8E3 */, /*16486*/13917/* A8E4 */,/*16487*/13917/* A8E5 */,/*16488*/13917/* A8E6 */,/*16489*/13917/* A8E7 */, /*16490*/13917/* A8E8 */,/*16491*/13917/* A8E9 */,/*16492*/13917/* A8EA */,/*16493*/13917/* A8EB */, /*16494*/13917/* A8EC */,/*16495*/13917/* A8ED */,/*16496*/13917/* A8EE */,/*16497*/13917/* A8EF */, /*16498*/13917/* A8F0 */,/*16499*/13917/* A8F1 */,/*16500*/13918/* A8F2 */,/*16501*/13919/* A8F3 */, /*16502*/13919/* A8F4 */,/*16503*/13919/* A8F5 */,/*16504*/13919/* A8F6 */,/*16505*/13919/* A8F7 */, /*16506*/13920/* A8F8 */,/*16507*/13921/* A8F9 */,/*16508*/13922/* A8FA */,/*16509*/13923/* A8FB */, /*16510*/13924/* A8FC */,/*16511*/13925/* A8FD */,0,0,/*16514*/13926/* A900 */,/*16515*/13927/* A901 */, /*16516*/13928/* A902 */,/*16517*/13929/* A903 */,/*16518*/13930/* A904 */,/*16519*/13931/* A905 */, /*16520*/13932/* A906 */,/*16521*/13933/* A907 */,/*16522*/13934/* A908 */,/*16523*/13935/* A909 */, /*16524*/13936/* A90A */,/*16525*/13937/* A90B */,/*16526*/13938/* A90C */,/*16527*/13939/* A90D */, /*16528*/13940/* A90E */,/*16529*/13941/* A90F */,/*16530*/13942/* A910 */,/*16531*/13943/* A911 */, /*16532*/13944/* A912 */,/*16533*/13945/* A913 */,/*16534*/13946/* A914 */,/*16535*/13947/* A915 */, /*16536*/13948/* A916 */,/*16537*/13949/* A917 */,/*16538*/13950/* A918 */,/*16539*/13951/* A919 */, /*16540*/13952/* A91A */,/*16541*/13953/* A91B */,/*16542*/13954/* A91C */,/*16543*/13955/* A91D */, /*16544*/13956/* A91E */,/*16545*/13957/* A91F */,/*16546*/13958/* A920 */,/*16547*/13959/* A921 */, /*16548*/13960/* A922 */,/*16549*/13961/* A923 */,/*16550*/13962/* A924 */,/*16551*/13963/* A925 */, /*16552*/13964/* A926 */,/*16553*/13965/* A927 */,/*16554*/13966/* A928 */,/*16555*/13967/* A929 */, /*16556*/13968/* A92A */,/*16557*/13969/* A92B */,/*16558*/13970/* A92C */,/*16559*/13971/* A92D */, /*16560*/13972/* A92E */,/*16561*/13973/* A92F */,/*16562*/13974/* A930 */,/*16563*/13975/* A931 */, /*16564*/13976/* A932 */,/*16565*/13977/* A933 */,/*16566*/13978/* A934 */,/*16567*/13979/* A935 */, /*16568*/13980/* A936 */,/*16569*/13981/* A937 */,/*16570*/13982/* A938 */,/*16571*/13983/* A939 */, /*16572*/13984/* A93A */,/*16573*/13985/* A93B */,/*16574*/13986/* A93C */,/*16575*/13987/* A93D */, /*16576*/13988/* A93E */,/*16577*/13989/* A93F */,/*16578*/13990/* A940 */,/*16579*/13991/* A941 */, /*16580*/13992/* A942 */,/*16581*/13993/* A943 */,/*16582*/13994/* A944 */,/*16583*/13995/* A945 */, /*16584*/13996/* A946 */,/*16585*/13997/* A947 */,/*16586*/13998/* A948 */,/*16587*/13999/* A949 */, /*16588*/14000/* A94A */,/*16589*/14001/* A94B */,/*16590*/14002/* A94C */,/*16591*/14003/* A94D */, /*16592*/14004/* A94E */,/*16593*/14005/* A94F */,/*16594*/14006/* A950 */,/*16595*/14007/* A951 */, /*16596*/14008/* A952 */,/*16597*/14009/* A953 */,0,0,0,0,0,0,0,0,0,0,0,/*16609*/14010/* A95F */, /*16610*/14011/* A960 */,/*16611*/14012/* A961 */,/*16612*/14013/* A962 */,/*16613*/14014/* A963 */, /*16614*/14015/* A964 */,/*16615*/14016/* A965 */,/*16616*/14017/* A966 */,/*16617*/14018/* A967 */, /*16618*/14019/* A968 */,/*16619*/14020/* A969 */,/*16620*/14021/* A96A */,/*16621*/14022/* A96B */, /*16622*/14023/* A96C */,/*16623*/14024/* A96D */,/*16624*/14025/* A96E */,/*16625*/14026/* A96F */, /*16626*/14027/* A970 */,/*16627*/14028/* A971 */,/*16628*/14029/* A972 */,/*16629*/14030/* A973 */, /*16630*/14031/* A974 */,/*16631*/14032/* A975 */,/*16632*/14033/* A976 */,/*16633*/14034/* A977 */, /*16634*/14035/* A978 */,/*16635*/14036/* A979 */,/*16636*/14037/* A97A */,/*16637*/14038/* A97B */, /*16638*/14039/* A97C */,0,0,0,/*16642*/14040/* A980 */,/*16643*/14041/* A981 */,/*16644*/14042/* A982 */, /*16645*/14043/* A983 */,/*16646*/14044/* A984 */,/*16647*/14045/* A985 */,/*16648*/14046/* A986 */, /*16649*/14047/* A987 */,/*16650*/14048/* A988 */,/*16651*/14049/* A989 */,/*16652*/14050/* A98A */, /*16653*/14051/* A98B */,/*16654*/14052/* A98C */,/*16655*/14053/* A98D */,/*16656*/14054/* A98E */, /*16657*/14055/* A98F */,/*16658*/14056/* A990 */,/*16659*/14057/* A991 */,/*16660*/14058/* A992 */, /*16661*/14059/* A993 */,/*16662*/14060/* A994 */,/*16663*/14061/* A995 */,/*16664*/14062/* A996 */, /*16665*/14063/* A997 */,/*16666*/14064/* A998 */,/*16667*/14065/* A999 */,/*16668*/14066/* A99A */, /*16669*/14067/* A99B */,/*16670*/14068/* A99C */,/*16671*/14069/* A99D */,/*16672*/14070/* A99E */, /*16673*/14071/* A99F */,/*16674*/14072/* A9A0 */,/*16675*/14073/* A9A1 */,/*16676*/14074/* A9A2 */, /*16677*/14075/* A9A3 */,/*16678*/14076/* A9A4 */,/*16679*/14077/* A9A5 */,/*16680*/14078/* A9A6 */, /*16681*/14079/* A9A7 */,/*16682*/14080/* A9A8 */,/*16683*/14081/* A9A9 */,/*16684*/14082/* A9AA */, /*16685*/14083/* A9AB */,/*16686*/14084/* A9AC */,/*16687*/14085/* A9AD */,/*16688*/14086/* A9AE */, /*16689*/14087/* A9AF */,/*16690*/14088/* A9B0 */,/*16691*/14089/* A9B1 */,/*16692*/14090/* A9B2 */, /*16693*/14091/* A9B3 */,/*16694*/14092/* A9B4 */,/*16695*/14093/* A9B5 */,/*16696*/14094/* A9B6 */, /*16697*/14095/* A9B7 */,/*16698*/14096/* A9B8 */,/*16699*/14097/* A9B9 */,/*16700*/14098/* A9BA */, /*16701*/14099/* A9BB */,/*16702*/14100/* A9BC */,/*16703*/14101/* A9BD */,/*16704*/14102/* A9BE */, /*16705*/14103/* A9BF */,/*16706*/14104/* A9C0 */,/*16707*/14105/* A9C1 */,/*16708*/14106/* A9C2 */, /*16709*/14107/* A9C3 */,/*16710*/14108/* A9C4 */,/*16711*/14109/* A9C5 */,/*16712*/14110/* A9C6 */, /*16713*/14111/* A9C7 */,/*16714*/14112/* A9C8 */,/*16715*/14113/* A9C9 */,/*16716*/14114/* A9CA */, /*16717*/14115/* A9CB */,/*16718*/14116/* A9CC */,/*16719*/14117/* A9CD */,0,/*16721*/14118/* A9CF */, /*16722*/14119/* A9D0 */,/*16723*/14120/* A9D1 */,/*16724*/14121/* A9D2 */,/*16725*/14122/* A9D3 */, /*16726*/14123/* A9D4 */,/*16727*/14124/* A9D5 */,/*16728*/14125/* A9D6 */,/*16729*/14126/* A9D7 */, /*16730*/14127/* A9D8 */,/*16731*/14128/* A9D9 */,0,0,0,0,/*16736*/14129/* A9DE */,/*16737*/14130/* A9DF */, /*16738*/14131/* A9E0 */,/*16739*/14132/* A9E1 */,/*16740*/14133/* A9E2 */,/*16741*/14134/* A9E3 */, /*16742*/14135/* A9E4 */,/*16743*/14136/* A9E5 */,/*16744*/14137/* A9E6 */,/*16745*/14138/* A9E7 */, /*16746*/14139/* A9E8 */,/*16747*/14140/* A9E9 */,/*16748*/14141/* A9EA */,/*16749*/14142/* A9EB */, /*16750*/14143/* A9EC */,/*16751*/14144/* A9ED */,/*16752*/14145/* A9EE */,/*16753*/14146/* A9EF */, /*16754*/14147/* A9F0 */,/*16755*/14148/* A9F1 */,/*16756*/14149/* A9F2 */,/*16757*/14150/* A9F3 */, /*16758*/14151/* A9F4 */,/*16759*/14152/* A9F5 */,/*16760*/14153/* A9F6 */,/*16761*/14154/* A9F7 */, /*16762*/14155/* A9F8 */,/*16763*/14156/* A9F9 */,/*16764*/14157/* A9FA */,/*16765*/14158/* A9FB */, /*16766*/14159/* A9FC */,/*16767*/14160/* A9FD */,/*16768*/14161/* A9FE */,0,/*16770*/14162/* AA00 */, /*16771*/14163/* AA01 */,/*16772*/14164/* AA02 */,/*16773*/14165/* AA03 */,/*16774*/14166/* AA04 */, /*16775*/14167/* AA05 */,/*16776*/14168/* AA06 */,/*16777*/14169/* AA07 */,/*16778*/14170/* AA08 */, /*16779*/14171/* AA09 */,/*16780*/14172/* AA0A */,/*16781*/14173/* AA0B */,/*16782*/14174/* AA0C */, /*16783*/14175/* AA0D */,/*16784*/14176/* AA0E */,/*16785*/14177/* AA0F */,/*16786*/14178/* AA10 */, /*16787*/14179/* AA11 */,/*16788*/14180/* AA12 */,/*16789*/14181/* AA13 */,/*16790*/14182/* AA14 */, /*16791*/14183/* AA15 */,/*16792*/14184/* AA16 */,/*16793*/14185/* AA17 */,/*16794*/14186/* AA18 */, /*16795*/14187/* AA19 */,/*16796*/14188/* AA1A */,/*16797*/14189/* AA1B */,/*16798*/14190/* AA1C */, /*16799*/14191/* AA1D */,/*16800*/14192/* AA1E */,/*16801*/14193/* AA1F */,/*16802*/14194/* AA20 */, /*16803*/14195/* AA21 */,/*16804*/14196/* AA22 */,/*16805*/14197/* AA23 */,/*16806*/14198/* AA24 */, /*16807*/14199/* AA25 */,/*16808*/14200/* AA26 */,/*16809*/14201/* AA27 */,/*16810*/14202/* AA28 */, /*16811*/14203/* AA29 */,/*16812*/14204/* AA2A */,/*16813*/14205/* AA2B */,/*16814*/14206/* AA2C */, /*16815*/14207/* AA2D */,/*16816*/14208/* AA2E */,/*16817*/14209/* AA2F */,/*16818*/14210/* AA30 */, /*16819*/14211/* AA31 */,/*16820*/14212/* AA32 */,/*16821*/14213/* AA33 */,/*16822*/14214/* AA34 */, /*16823*/14215/* AA35 */,/*16824*/14216/* AA36 */,0,0,0,0,0,0,0,0,0,/*16834*/14217/* AA40 */,/*16835*/14218/* AA41 */, /*16836*/14219/* AA42 */,/*16837*/14220/* AA43 */,/*16838*/14221/* AA44 */,/*16839*/14222/* AA45 */, /*16840*/14223/* AA46 */,/*16841*/14224/* AA47 */,/*16842*/14225/* AA48 */,/*16843*/14226/* AA49 */, /*16844*/14227/* AA4A */,/*16845*/14228/* AA4B */,/*16846*/14229/* AA4C */,/*16847*/14230/* AA4D */,0,0, /*16850*/14231/* AA50 */,/*16851*/14232/* AA51 */,/*16852*/14233/* AA52 */,/*16853*/14234/* AA53 */, /*16854*/14235/* AA54 */,/*16855*/14236/* AA55 */,/*16856*/14237/* AA56 */,/*16857*/14238/* AA57 */, /*16858*/14239/* AA58 */,/*16859*/14240/* AA59 */,0,0,/*16862*/14241/* AA5C */,/*16863*/14242/* AA5D */, /*16864*/14243/* AA5E */,/*16865*/14244/* AA5F */,/*16866*/14245/* AA60 */,/*16867*/14246/* AA61 */, /*16868*/14247/* AA62 */,/*16869*/14248/* AA63 */,/*16870*/14249/* AA64 */,/*16871*/14250/* AA65 */, /*16872*/14251/* AA66 */,/*16873*/14252/* AA67 */,/*16874*/14253/* AA68 */,/*16875*/14254/* AA69 */, /*16876*/14255/* AA6A */,/*16877*/14256/* AA6B */,/*16878*/14257/* AA6C */,/*16879*/14258/* AA6D */, /*16880*/14259/* AA6E */,/*16881*/14260/* AA6F */,/*16882*/14261/* AA70 */,/*16883*/14262/* AA71 */, /*16884*/14263/* AA72 */,/*16885*/14264/* AA73 */,/*16886*/14265/* AA74 */,/*16887*/14266/* AA75 */, /*16888*/14267/* AA76 */,/*16889*/14268/* AA77 */,/*16890*/14269/* AA78 */,/*16891*/14270/* AA79 */, /*16892*/14271/* AA7A */,/*16893*/14272/* AA7B */,/*16894*/14273/* AA7C */,/*16895*/14274/* AA7D */, /*16896*/14275/* AA7E */,/*16897*/14276/* AA7F */,/*16898*/14277/* AA80 */,/*16899*/14278/* AA81 */, /*16900*/14279/* AA82 */,/*16901*/14280/* AA83 */,/*16902*/14281/* AA84 */,/*16903*/14282/* AA85 */, /*16904*/14283/* AA86 */,/*16905*/14284/* AA87 */,/*16906*/14285/* AA88 */,/*16907*/14286/* AA89 */, /*16908*/14287/* AA8A */,/*16909*/14288/* AA8B */,/*16910*/14289/* AA8C */,/*16911*/14290/* AA8D */, /*16912*/14291/* AA8E */,/*16913*/14292/* AA8F */,/*16914*/14293/* AA90 */,/*16915*/14294/* AA91 */, /*16916*/14295/* AA92 */,/*16917*/14296/* AA93 */,/*16918*/14297/* AA94 */,/*16919*/14298/* AA95 */, /*16920*/14299/* AA96 */,/*16921*/14300/* AA97 */,/*16922*/14301/* AA98 */,/*16923*/14302/* AA99 */, /*16924*/14303/* AA9A */,/*16925*/14304/* AA9B */,/*16926*/14305/* AA9C */,/*16927*/14306/* AA9D */, /*16928*/14307/* AA9E */,/*16929*/14308/* AA9F */,/*16930*/14309/* AAA0 */,/*16931*/14310/* AAA1 */, /*16932*/14311/* AAA2 */,/*16933*/14312/* AAA3 */,/*16934*/14313/* AAA4 */,/*16935*/14314/* AAA5 */, /*16936*/14315/* AAA6 */,/*16937*/14316/* AAA7 */,/*16938*/14317/* AAA8 */,/*16939*/14318/* AAA9 */, /*16940*/14319/* AAAA */,/*16941*/14320/* AAAB */,/*16942*/14321/* AAAC */,/*16943*/14322/* AAAD */, /*16944*/14323/* AAAE */,/*16945*/14324/* AAAF */,/*16946*/14325/* AAB0 */,/*16947*/14326/* AAB1 */, /*16948*/14327/* AAB2 */,/*16949*/14328/* AAB3 */,/*16950*/14329/* AAB4 */,/*16951*/14330/* AAB5 */, /*16952*/14331/* AAB6 */,/*16953*/14332/* AAB7 */,/*16954*/14333/* AAB8 */,/*16955*/14334/* AAB9 */, /*16956*/14335/* AABA */,/*16957*/14336/* AABB */,/*16958*/14337/* AABC */,/*16959*/14338/* AABD */, /*16960*/14339/* AABE */,/*16961*/14340/* AABF */,/*16962*/14341/* AAC0 */,/*16963*/14342/* AAC1 */, /*16964*/14343/* AAC2 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*16989*/14344/* AADB */, /*16990*/14345/* AADC */,/*16991*/14346/* AADD */,/*16992*/14347/* AADE */,/*16993*/14348/* AADF */, /*16994*/14349/* AAE0 */,/*16995*/14350/* AAE1 */,/*16996*/14351/* AAE2 */,/*16997*/14352/* AAE3 */, /*16998*/14353/* AAE4 */,/*16999*/14354/* AAE5 */,/*17000*/14355/* AAE6 */,/*17001*/14356/* AAE7 */, /*17002*/14357/* AAE8 */,/*17003*/14358/* AAE9 */,/*17004*/14359/* AAEA */,/*17005*/14360/* AAEB */, /*17006*/14361/* AAEC */,/*17007*/14362/* AAED */,/*17008*/14363/* AAEE */,/*17009*/14364/* AAEF */, /*17010*/14365/* AAF0 */,/*17011*/14366/* AAF1 */,/*17012*/14367/* AAF2 */,/*17013*/14368/* AAF3 */, /*17014*/14369/* AAF4 */,/*17015*/14370/* AAF5 */,/*17016*/14371/* AAF6 */,0,0,0,0,0,0,0,0,0,0,/*17027*/14372/* AB01 */, /*17028*/14373/* AB02 */,/*17029*/14374/* AB03 */,/*17030*/14375/* AB04 */,/*17031*/14376/* AB05 */, /*17032*/14377/* AB06 */,0,0,/*17035*/14378/* AB09 */,/*17036*/14379/* AB0A */,/*17037*/14380/* AB0B */, /*17038*/14381/* AB0C */,/*17039*/14382/* AB0D */,/*17040*/14383/* AB0E */,0,0,/*17043*/14384/* AB11 */, /*17044*/14385/* AB12 */,/*17045*/14386/* AB13 */,/*17046*/14387/* AB14 */,/*17047*/14388/* AB15 */, /*17048*/14389/* AB16 */,0,0,0,0,0,0,0,0,0,/*17058*/14390/* AB20 */,/*17059*/14391/* AB21 */,/*17060*/14392/* AB22 */, /*17061*/14393/* AB23 */,/*17062*/14394/* AB24 */,/*17063*/14395/* AB25 */,/*17064*/14396/* AB26 */,0, /*17066*/14397/* AB28 */,/*17067*/14398/* AB29 */,/*17068*/14399/* AB2A */,/*17069*/14400/* AB2B */, /*17070*/14401/* AB2C */,/*17071*/14402/* AB2D */,/*17072*/14403/* AB2E */,0,/*17074*/14404/* AB30 */, /*17075*/14405/* AB31 */,/*17076*/14406/* AB32 */,/*17077*/14407/* AB33 */,/*17078*/14408/* AB34 */, /*17079*/14409/* AB35 */,/*17080*/14410/* AB36 */,/*17081*/14411/* AB37 */,/*17082*/14412/* AB38 */, /*17083*/14413/* AB39 */,/*17084*/14414/* AB3A */,/*17085*/14415/* AB3B */,/*17086*/14416/* AB3C */, /*17087*/14417/* AB3D */,/*17088*/14418/* AB3E */,/*17089*/14419/* AB3F */,/*17090*/14420/* AB40 */, /*17091*/14421/* AB41 */,/*17092*/14422/* AB42 */,/*17093*/14423/* AB43 */,/*17094*/14424/* AB44 */, /*17095*/14425/* AB45 */,/*17096*/14426/* AB46 */,/*17097*/14427/* AB47 */,/*17098*/14428/* AB48 */, /*17099*/14429/* AB49 */,/*17100*/14430/* AB4A */,/*17101*/14431/* AB4B */,/*17102*/14432/* AB4C */, /*17103*/14433/* AB4D */,/*17104*/14434/* AB4E */,/*17105*/14435/* AB4F */,/*17106*/14436/* AB50 */, /*17107*/14437/* AB51 */,/*17108*/14438/* AB52 */,/*17109*/14439/* AB53 */,/*17110*/14440/* AB54 */, /*17111*/14441/* AB55 */,/*17112*/14442/* AB56 */,/*17113*/14443/* AB57 */,/*17114*/14444/* AB58 */, /*17115*/14445/* AB59 */,/*17116*/14446/* AB5A */,/*17117*/14447/* AB5B */,/*17118*/14448/* AB5C */, /*17119*/14449/* AB5D */,/*17120*/14450/* AB5E */,/*17121*/14451/* AB5F */,/*17122*/14452/* AB60 */, /*17123*/14453/* AB61 */,/*17124*/14454/* AB62 */,/*17125*/14455/* AB63 */,/*17126*/14456/* AB64 */, /*17127*/14457/* AB65 */,0,0,0,0,0,0,0,0,0,0,/*17138*/14458/* AB70 */,/*17139*/14459/* AB71 */,/*17140*/14460/* AB72 */, /*17141*/14461/* AB73 */,/*17142*/14462/* AB74 */,/*17143*/14463/* AB75 */,/*17144*/14464/* AB76 */, /*17145*/14465/* AB77 */,/*17146*/14466/* AB78 */,/*17147*/14467/* AB79 */,/*17148*/14468/* AB7A */, /*17149*/14469/* AB7B */,/*17150*/14470/* AB7C */,/*17151*/14471/* AB7D */,/*17152*/14472/* AB7E */, /*17153*/14473/* AB7F */,/*17154*/14474/* AB80 */,/*17155*/14475/* AB81 */,/*17156*/14476/* AB82 */, /*17157*/14477/* AB83 */,/*17158*/14478/* AB84 */,/*17159*/14479/* AB85 */,/*17160*/14480/* AB86 */, /*17161*/14481/* AB87 */,/*17162*/14482/* AB88 */,/*17163*/14483/* AB89 */,/*17164*/14484/* AB8A */, /*17165*/14485/* AB8B */,/*17166*/14486/* AB8C */,/*17167*/14487/* AB8D */,/*17168*/14488/* AB8E */, /*17169*/14489/* AB8F */,/*17170*/14490/* AB90 */,/*17171*/14491/* AB91 */,/*17172*/14492/* AB92 */, /*17173*/14493/* AB93 */,/*17174*/14494/* AB94 */,/*17175*/14495/* AB95 */,/*17176*/14496/* AB96 */, /*17177*/14497/* AB97 */,/*17178*/14498/* AB98 */,/*17179*/14499/* AB99 */,/*17180*/14500/* AB9A */, /*17181*/14501/* AB9B */,/*17182*/14502/* AB9C */,/*17183*/14503/* AB9D */,/*17184*/14504/* AB9E */, /*17185*/14505/* AB9F */,/*17186*/14506/* ABA0 */,/*17187*/14507/* ABA1 */,/*17188*/14508/* ABA2 */, /*17189*/14509/* ABA3 */,/*17190*/14510/* ABA4 */,/*17191*/14511/* ABA5 */,/*17192*/14512/* ABA6 */, /*17193*/14513/* ABA7 */,/*17194*/14514/* ABA8 */,/*17195*/14515/* ABA9 */,/*17196*/14516/* ABAA */, /*17197*/14517/* ABAB */,/*17198*/14518/* ABAC */,/*17199*/14519/* ABAD */,/*17200*/14520/* ABAE */, /*17201*/14521/* ABAF */,/*17202*/14522/* ABB0 */,/*17203*/14523/* ABB1 */,/*17204*/14524/* ABB2 */, /*17205*/14525/* ABB3 */,/*17206*/14526/* ABB4 */,/*17207*/14527/* ABB5 */,/*17208*/14528/* ABB6 */, /*17209*/14529/* ABB7 */,/*17210*/14530/* ABB8 */,/*17211*/14531/* ABB9 */,/*17212*/14532/* ABBA */, /*17213*/14533/* ABBB */,/*17214*/14534/* ABBC */,/*17215*/14535/* ABBD */,/*17216*/14536/* ABBE */, /*17217*/14537/* ABBF */,/*17218*/14538/* ABC0 */,/*17219*/14539/* ABC1 */,/*17220*/14540/* ABC2 */, /*17221*/14541/* ABC3 */,/*17222*/14542/* ABC4 */,/*17223*/14543/* ABC5 */,/*17224*/14544/* ABC6 */, /*17225*/14545/* ABC7 */,/*17226*/14546/* ABC8 */,/*17227*/14547/* ABC9 */,/*17228*/14548/* ABCA */, /*17229*/14549/* ABCB */,/*17230*/14550/* ABCC */,/*17231*/14551/* ABCD */,/*17232*/14552/* ABCE */, /*17233*/14553/* ABCF */,/*17234*/14554/* ABD0 */,/*17235*/14555/* ABD1 */,/*17236*/14556/* ABD2 */, /*17237*/14557/* ABD3 */,/*17238*/14558/* ABD4 */,/*17239*/14559/* ABD5 */,/*17240*/14560/* ABD6 */, /*17241*/14561/* ABD7 */,/*17242*/14562/* ABD8 */,/*17243*/14563/* ABD9 */,/*17244*/14564/* ABDA */, /*17245*/14565/* ABDB */,/*17246*/14566/* ABDC */,/*17247*/14567/* ABDD */,/*17248*/14568/* ABDE */, /*17249*/14569/* ABDF */,/*17250*/14570/* ABE0 */,/*17251*/14571/* ABE1 */,/*17252*/14572/* ABE2 */, /*17253*/14573/* ABE3 */,/*17254*/14574/* ABE4 */,/*17255*/14575/* ABE5 */,/*17256*/14576/* ABE6 */, /*17257*/14577/* ABE7 */,/*17258*/14578/* ABE8 */,/*17259*/14579/* ABE9 */,/*17260*/14580/* ABEA */, /*17261*/14581/* ABEB */,/*17262*/14582/* ABEC */,/*17263*/14583/* ABED */,0,0,/*17266*/14584/* ABF0 */, /*17267*/14585/* ABF1 */,/*17268*/14586/* ABF2 */,/*17269*/14587/* ABF3 */,/*17270*/14588/* ABF4 */, /*17271*/14589/* ABF5 */,/*17272*/14590/* ABF6 */,/*17273*/14591/* ABF7 */,/*17274*/14592/* ABF8 */, /*17275*/14593/* ABF9 */,0,0,0,0,0,0,/*17282*/14594/* AC00 */,/*17283*/14595/* AC01 */,/*17284*/14595/* AC02 */, /*17285*/14595/* AC03 */,/*17286*/14595/* AC04 */,/*17287*/14595/* AC05 */,/*17288*/14595/* AC06 */, /*17289*/14595/* AC07 */,/*17290*/14595/* AC08 */,/*17291*/14595/* AC09 */,/*17292*/14595/* AC0A */, /*17293*/14595/* AC0B */,/*17294*/14595/* AC0C */,/*17295*/14595/* AC0D */,/*17296*/14595/* AC0E */, /*17297*/14595/* AC0F */,/*17298*/14595/* AC10 */,/*17299*/14595/* AC11 */,/*17300*/14595/* AC12 */, /*17301*/14595/* AC13 */,/*17302*/14595/* AC14 */,/*17303*/14595/* AC15 */,/*17304*/14595/* AC16 */, /*17305*/14595/* AC17 */,/*17306*/14595/* AC18 */,/*17307*/14595/* AC19 */,/*17308*/14595/* AC1A */, /*17309*/14595/* AC1B */,/*17310*/14594/* AC1C */,/*17311*/14595/* AC1D */,/*17312*/14595/* AC1E */, /*17313*/14595/* AC1F */,/*17314*/14595/* AC20 */,/*17315*/14595/* AC21 */,/*17316*/14595/* AC22 */, /*17317*/14595/* AC23 */,/*17318*/14595/* AC24 */,/*17319*/14595/* AC25 */,/*17320*/14595/* AC26 */, /*17321*/14595/* AC27 */,/*17322*/14595/* AC28 */,/*17323*/14595/* AC29 */,/*17324*/14595/* AC2A */, /*17325*/14595/* AC2B */,/*17326*/14595/* AC2C */,/*17327*/14595/* AC2D */,/*17328*/14595/* AC2E */, /*17329*/14595/* AC2F */,/*17330*/14595/* AC30 */,/*17331*/14595/* AC31 */,/*17332*/14595/* AC32 */, /*17333*/14595/* AC33 */,/*17334*/14595/* AC34 */,/*17335*/14595/* AC35 */,/*17336*/14595/* AC36 */, /*17337*/14595/* AC37 */,/*17338*/14594/* AC38 */,/*17339*/14595/* AC39 */,/*17340*/14595/* AC3A */, /*17341*/14595/* AC3B */,/*17342*/14595/* AC3C */,/*17343*/14595/* AC3D */,/*17344*/14595/* AC3E */, /*17345*/14595/* AC3F */,/*17346*/14595/* AC40 */,/*17347*/14595/* AC41 */,/*17348*/14595/* AC42 */, /*17349*/14595/* AC43 */,/*17350*/14595/* AC44 */,/*17351*/14595/* AC45 */,/*17352*/14595/* AC46 */, /*17353*/14595/* AC47 */,/*17354*/14595/* AC48 */,/*17355*/14595/* AC49 */,/*17356*/14595/* AC4A */, /*17357*/14595/* AC4B */,/*17358*/14595/* AC4C */,/*17359*/14595/* AC4D */,/*17360*/14595/* AC4E */, /*17361*/14595/* AC4F */,/*17362*/14595/* AC50 */,/*17363*/14595/* AC51 */,/*17364*/14595/* AC52 */, /*17365*/14595/* AC53 */,/*17366*/14594/* AC54 */,/*17367*/14595/* AC55 */,/*17368*/14595/* AC56 */, /*17369*/14595/* AC57 */,/*17370*/14595/* AC58 */,/*17371*/14595/* AC59 */,/*17372*/14595/* AC5A */, /*17373*/14595/* AC5B */,/*17374*/14595/* AC5C */,/*17375*/14595/* AC5D */,/*17376*/14595/* AC5E */, /*17377*/14595/* AC5F */,/*17378*/14595/* AC60 */,/*17379*/14595/* AC61 */,/*17380*/14595/* AC62 */, /*17381*/14595/* AC63 */,/*17382*/14595/* AC64 */,/*17383*/14595/* AC65 */,/*17384*/14595/* AC66 */, /*17385*/14595/* AC67 */,/*17386*/14595/* AC68 */,/*17387*/14595/* AC69 */,/*17388*/14595/* AC6A */, /*17389*/14595/* AC6B */,/*17390*/14595/* AC6C */,/*17391*/14595/* AC6D */,/*17392*/14595/* AC6E */, /*17393*/14595/* AC6F */,/*17394*/14594/* AC70 */,/*17395*/14595/* AC71 */,/*17396*/14595/* AC72 */, /*17397*/14595/* AC73 */,/*17398*/14595/* AC74 */,/*17399*/14595/* AC75 */,/*17400*/14595/* AC76 */, /*17401*/14595/* AC77 */,/*17402*/14595/* AC78 */,/*17403*/14595/* AC79 */,/*17404*/14595/* AC7A */, /*17405*/14595/* AC7B */,/*17406*/14595/* AC7C */,/*17407*/14595/* AC7D */,/*17408*/14595/* AC7E */, /*17409*/14595/* AC7F */,/*17410*/14595/* AC80 */,/*17411*/14595/* AC81 */,/*17412*/14595/* AC82 */, /*17413*/14595/* AC83 */,/*17414*/14595/* AC84 */,/*17415*/14595/* AC85 */,/*17416*/14595/* AC86 */, /*17417*/14595/* AC87 */,/*17418*/14595/* AC88 */,/*17419*/14595/* AC89 */,/*17420*/14595/* AC8A */, /*17421*/14595/* AC8B */,/*17422*/14594/* AC8C */,/*17423*/14595/* AC8D */,/*17424*/14595/* AC8E */, /*17425*/14595/* AC8F */,/*17426*/14595/* AC90 */,/*17427*/14595/* AC91 */,/*17428*/14595/* AC92 */, /*17429*/14595/* AC93 */,/*17430*/14595/* AC94 */,/*17431*/14595/* AC95 */,/*17432*/14595/* AC96 */, /*17433*/14595/* AC97 */,/*17434*/14595/* AC98 */,/*17435*/14595/* AC99 */,/*17436*/14595/* AC9A */, /*17437*/14595/* AC9B */,/*17438*/14595/* AC9C */,/*17439*/14595/* AC9D */,/*17440*/14595/* AC9E */, /*17441*/14595/* AC9F */,/*17442*/14595/* ACA0 */,/*17443*/14595/* ACA1 */,/*17444*/14595/* ACA2 */, /*17445*/14595/* ACA3 */,/*17446*/14595/* ACA4 */,/*17447*/14595/* ACA5 */,/*17448*/14595/* ACA6 */, /*17449*/14595/* ACA7 */,/*17450*/14594/* ACA8 */,/*17451*/14595/* ACA9 */,/*17452*/14595/* ACAA */, /*17453*/14595/* ACAB */,/*17454*/14595/* ACAC */,/*17455*/14595/* ACAD */,/*17456*/14595/* ACAE */, /*17457*/14595/* ACAF */,/*17458*/14595/* ACB0 */,/*17459*/14595/* ACB1 */,/*17460*/14595/* ACB2 */, /*17461*/14595/* ACB3 */,/*17462*/14595/* ACB4 */,/*17463*/14595/* ACB5 */,/*17464*/14595/* ACB6 */, /*17465*/14595/* ACB7 */,/*17466*/14595/* ACB8 */,/*17467*/14595/* ACB9 */,/*17468*/14595/* ACBA */, /*17469*/14595/* ACBB */,/*17470*/14595/* ACBC */,/*17471*/14595/* ACBD */,/*17472*/14595/* ACBE */, /*17473*/14595/* ACBF */,/*17474*/14595/* ACC0 */,/*17475*/14595/* ACC1 */,/*17476*/14595/* ACC2 */, /*17477*/14595/* ACC3 */,/*17478*/14594/* ACC4 */,/*17479*/14595/* ACC5 */,/*17480*/14595/* ACC6 */, /*17481*/14595/* ACC7 */,/*17482*/14595/* ACC8 */,/*17483*/14595/* ACC9 */,/*17484*/14595/* ACCA */, /*17485*/14595/* ACCB */,/*17486*/14595/* ACCC */,/*17487*/14595/* ACCD */,/*17488*/14595/* ACCE */, /*17489*/14595/* ACCF */,/*17490*/14595/* ACD0 */,/*17491*/14595/* ACD1 */,/*17492*/14595/* ACD2 */, /*17493*/14595/* ACD3 */,/*17494*/14595/* ACD4 */,/*17495*/14595/* ACD5 */,/*17496*/14595/* ACD6 */, /*17497*/14595/* ACD7 */,/*17498*/14595/* ACD8 */,/*17499*/14595/* ACD9 */,/*17500*/14595/* ACDA */, /*17501*/14595/* ACDB */,/*17502*/14595/* ACDC */,/*17503*/14595/* ACDD */,/*17504*/14595/* ACDE */, /*17505*/14595/* ACDF */,/*17506*/14594/* ACE0 */,/*17507*/14595/* ACE1 */,/*17508*/14595/* ACE2 */, /*17509*/14595/* ACE3 */,/*17510*/14595/* ACE4 */,/*17511*/14595/* ACE5 */,/*17512*/14595/* ACE6 */, /*17513*/14595/* ACE7 */,/*17514*/14595/* ACE8 */,/*17515*/14595/* ACE9 */,/*17516*/14595/* ACEA */, /*17517*/14595/* ACEB */,/*17518*/14595/* ACEC */,/*17519*/14595/* ACED */,/*17520*/14595/* ACEE */, /*17521*/14595/* ACEF */,/*17522*/14595/* ACF0 */,/*17523*/14595/* ACF1 */,/*17524*/14595/* ACF2 */, /*17525*/14595/* ACF3 */,/*17526*/14595/* ACF4 */,/*17527*/14595/* ACF5 */,/*17528*/14595/* ACF6 */, /*17529*/14595/* ACF7 */,/*17530*/14595/* ACF8 */,/*17531*/14595/* ACF9 */,/*17532*/14595/* ACFA */, /*17533*/14595/* ACFB */,/*17534*/14594/* ACFC */,/*17535*/14595/* ACFD */,/*17536*/14595/* ACFE */, /*17537*/14595/* ACFF */,/*17538*/14595/* AD00 */,/*17539*/14595/* AD01 */,/*17540*/14595/* AD02 */, /*17541*/14595/* AD03 */,/*17542*/14595/* AD04 */,/*17543*/14595/* AD05 */,/*17544*/14595/* AD06 */, /*17545*/14595/* AD07 */,/*17546*/14595/* AD08 */,/*17547*/14595/* AD09 */,/*17548*/14595/* AD0A */, /*17549*/14595/* AD0B */,/*17550*/14595/* AD0C */,/*17551*/14595/* AD0D */,/*17552*/14595/* AD0E */, /*17553*/14595/* AD0F */,/*17554*/14595/* AD10 */,/*17555*/14595/* AD11 */,/*17556*/14595/* AD12 */, /*17557*/14595/* AD13 */,/*17558*/14595/* AD14 */,/*17559*/14595/* AD15 */,/*17560*/14595/* AD16 */, /*17561*/14595/* AD17 */,/*17562*/14594/* AD18 */,/*17563*/14595/* AD19 */,/*17564*/14595/* AD1A */, /*17565*/14595/* AD1B */,/*17566*/14595/* AD1C */,/*17567*/14595/* AD1D */,/*17568*/14595/* AD1E */, /*17569*/14595/* AD1F */,/*17570*/14595/* AD20 */,/*17571*/14595/* AD21 */,/*17572*/14595/* AD22 */, /*17573*/14595/* AD23 */,/*17574*/14595/* AD24 */,/*17575*/14595/* AD25 */,/*17576*/14595/* AD26 */, /*17577*/14595/* AD27 */,/*17578*/14595/* AD28 */,/*17579*/14595/* AD29 */,/*17580*/14595/* AD2A */, /*17581*/14595/* AD2B */,/*17582*/14595/* AD2C */,/*17583*/14595/* AD2D */,/*17584*/14595/* AD2E */, /*17585*/14595/* AD2F */,/*17586*/14595/* AD30 */,/*17587*/14595/* AD31 */,/*17588*/14595/* AD32 */, /*17589*/14595/* AD33 */,/*17590*/14594/* AD34 */,/*17591*/14595/* AD35 */,/*17592*/14595/* AD36 */, /*17593*/14595/* AD37 */,/*17594*/14595/* AD38 */,/*17595*/14595/* AD39 */,/*17596*/14595/* AD3A */, /*17597*/14595/* AD3B */,/*17598*/14595/* AD3C */,/*17599*/14595/* AD3D */,/*17600*/14595/* AD3E */, /*17601*/14595/* AD3F */,/*17602*/14595/* AD40 */,/*17603*/14595/* AD41 */,/*17604*/14595/* AD42 */, /*17605*/14595/* AD43 */,/*17606*/14595/* AD44 */,/*17607*/14595/* AD45 */,/*17608*/14595/* AD46 */, /*17609*/14595/* AD47 */,/*17610*/14595/* AD48 */,/*17611*/14595/* AD49 */,/*17612*/14595/* AD4A */, /*17613*/14595/* AD4B */,/*17614*/14595/* AD4C */,/*17615*/14595/* AD4D */,/*17616*/14595/* AD4E */, /*17617*/14595/* AD4F */,/*17618*/14594/* AD50 */,/*17619*/14595/* AD51 */,/*17620*/14595/* AD52 */, /*17621*/14595/* AD53 */,/*17622*/14595/* AD54 */,/*17623*/14595/* AD55 */,/*17624*/14595/* AD56 */, /*17625*/14595/* AD57 */,/*17626*/14595/* AD58 */,/*17627*/14595/* AD59 */,/*17628*/14595/* AD5A */, /*17629*/14595/* AD5B */,/*17630*/14595/* AD5C */,/*17631*/14595/* AD5D */,/*17632*/14595/* AD5E */, /*17633*/14595/* AD5F */,/*17634*/14595/* AD60 */,/*17635*/14595/* AD61 */,/*17636*/14595/* AD62 */, /*17637*/14595/* AD63 */,/*17638*/14595/* AD64 */,/*17639*/14595/* AD65 */,/*17640*/14595/* AD66 */, /*17641*/14595/* AD67 */,/*17642*/14595/* AD68 */,/*17643*/14595/* AD69 */,/*17644*/14595/* AD6A */, /*17645*/14595/* AD6B */,/*17646*/14594/* AD6C */,/*17647*/14595/* AD6D */,/*17648*/14595/* AD6E */, /*17649*/14595/* AD6F */,/*17650*/14595/* AD70 */,/*17651*/14595/* AD71 */,/*17652*/14595/* AD72 */, /*17653*/14595/* AD73 */,/*17654*/14595/* AD74 */,/*17655*/14595/* AD75 */,/*17656*/14595/* AD76 */, /*17657*/14595/* AD77 */,/*17658*/14595/* AD78 */,/*17659*/14595/* AD79 */,/*17660*/14595/* AD7A */, /*17661*/14595/* AD7B */,/*17662*/14595/* AD7C */,/*17663*/14595/* AD7D */,/*17664*/14595/* AD7E */, /*17665*/14595/* AD7F */,/*17666*/14595/* AD80 */,/*17667*/14595/* AD81 */,/*17668*/14595/* AD82 */, /*17669*/14595/* AD83 */,/*17670*/14595/* AD84 */,/*17671*/14595/* AD85 */,/*17672*/14595/* AD86 */, /*17673*/14595/* AD87 */,/*17674*/14594/* AD88 */,/*17675*/14595/* AD89 */,/*17676*/14595/* AD8A */, /*17677*/14595/* AD8B */,/*17678*/14595/* AD8C */,/*17679*/14595/* AD8D */,/*17680*/14595/* AD8E */, /*17681*/14595/* AD8F */,/*17682*/14595/* AD90 */,/*17683*/14595/* AD91 */,/*17684*/14595/* AD92 */, /*17685*/14595/* AD93 */,/*17686*/14595/* AD94 */,/*17687*/14595/* AD95 */,/*17688*/14595/* AD96 */, /*17689*/14595/* AD97 */,/*17690*/14595/* AD98 */,/*17691*/14595/* AD99 */,/*17692*/14595/* AD9A */, /*17693*/14595/* AD9B */,/*17694*/14595/* AD9C */,/*17695*/14595/* AD9D */,/*17696*/14595/* AD9E */, /*17697*/14595/* AD9F */,/*17698*/14595/* ADA0 */,/*17699*/14595/* ADA1 */,/*17700*/14595/* ADA2 */, /*17701*/14595/* ADA3 */,/*17702*/14594/* ADA4 */,/*17703*/14595/* ADA5 */,/*17704*/14595/* ADA6 */, /*17705*/14595/* ADA7 */,/*17706*/14595/* ADA8 */,/*17707*/14595/* ADA9 */,/*17708*/14595/* ADAA */, /*17709*/14595/* ADAB */,/*17710*/14595/* ADAC */,/*17711*/14595/* ADAD */,/*17712*/14595/* ADAE */, /*17713*/14595/* ADAF */,/*17714*/14595/* ADB0 */,/*17715*/14595/* ADB1 */,/*17716*/14595/* ADB2 */, /*17717*/14595/* ADB3 */,/*17718*/14595/* ADB4 */,/*17719*/14595/* ADB5 */,/*17720*/14595/* ADB6 */, /*17721*/14595/* ADB7 */,/*17722*/14595/* ADB8 */,/*17723*/14595/* ADB9 */,/*17724*/14595/* ADBA */, /*17725*/14595/* ADBB */,/*17726*/14595/* ADBC */,/*17727*/14595/* ADBD */,/*17728*/14595/* ADBE */, /*17729*/14595/* ADBF */,/*17730*/14594/* ADC0 */,/*17731*/14595/* ADC1 */,/*17732*/14595/* ADC2 */, /*17733*/14595/* ADC3 */,/*17734*/14595/* ADC4 */,/*17735*/14595/* ADC5 */,/*17736*/14595/* ADC6 */, /*17737*/14595/* ADC7 */,/*17738*/14595/* ADC8 */,/*17739*/14595/* ADC9 */,/*17740*/14595/* ADCA */, /*17741*/14595/* ADCB */,/*17742*/14595/* ADCC */,/*17743*/14595/* ADCD */,/*17744*/14595/* ADCE */, /*17745*/14595/* ADCF */,/*17746*/14595/* ADD0 */,/*17747*/14595/* ADD1 */,/*17748*/14595/* ADD2 */, /*17749*/14595/* ADD3 */,/*17750*/14595/* ADD4 */,/*17751*/14595/* ADD5 */,/*17752*/14595/* ADD6 */, /*17753*/14595/* ADD7 */,/*17754*/14595/* ADD8 */,/*17755*/14595/* ADD9 */,/*17756*/14595/* ADDA */, /*17757*/14595/* ADDB */,/*17758*/14594/* ADDC */,/*17759*/14595/* ADDD */,/*17760*/14595/* ADDE */, /*17761*/14595/* ADDF */,/*17762*/14595/* ADE0 */,/*17763*/14595/* ADE1 */,/*17764*/14595/* ADE2 */, /*17765*/14595/* ADE3 */,/*17766*/14595/* ADE4 */,/*17767*/14595/* ADE5 */,/*17768*/14595/* ADE6 */, /*17769*/14595/* ADE7 */,/*17770*/14595/* ADE8 */,/*17771*/14595/* ADE9 */,/*17772*/14595/* ADEA */, /*17773*/14595/* ADEB */,/*17774*/14595/* ADEC */,/*17775*/14595/* ADED */,/*17776*/14595/* ADEE */, /*17777*/14595/* ADEF */,/*17778*/14595/* ADF0 */,/*17779*/14595/* ADF1 */,/*17780*/14595/* ADF2 */, /*17781*/14595/* ADF3 */,/*17782*/14595/* ADF4 */,/*17783*/14595/* ADF5 */,/*17784*/14595/* ADF6 */, /*17785*/14595/* ADF7 */,/*17786*/14594/* ADF8 */,/*17787*/14595/* ADF9 */,/*17788*/14595/* ADFA */, /*17789*/14595/* ADFB */,/*17790*/14595/* ADFC */,/*17791*/14595/* ADFD */,/*17792*/14595/* ADFE */, /*17793*/14595/* ADFF */,/*17794*/14595/* AE00 */,/*17795*/14595/* AE01 */,/*17796*/14595/* AE02 */, /*17797*/14595/* AE03 */,/*17798*/14595/* AE04 */,/*17799*/14595/* AE05 */,/*17800*/14595/* AE06 */, /*17801*/14595/* AE07 */,/*17802*/14595/* AE08 */,/*17803*/14595/* AE09 */,/*17804*/14595/* AE0A */, /*17805*/14595/* AE0B */,/*17806*/14595/* AE0C */,/*17807*/14595/* AE0D */,/*17808*/14595/* AE0E */, /*17809*/14595/* AE0F */,/*17810*/14595/* AE10 */,/*17811*/14595/* AE11 */,/*17812*/14595/* AE12 */, /*17813*/14595/* AE13 */,/*17814*/14594/* AE14 */,/*17815*/14595/* AE15 */,/*17816*/14595/* AE16 */, /*17817*/14595/* AE17 */,/*17818*/14595/* AE18 */,/*17819*/14595/* AE19 */,/*17820*/14595/* AE1A */, /*17821*/14595/* AE1B */,/*17822*/14595/* AE1C */,/*17823*/14595/* AE1D */,/*17824*/14595/* AE1E */, /*17825*/14595/* AE1F */,/*17826*/14595/* AE20 */,/*17827*/14595/* AE21 */,/*17828*/14595/* AE22 */, /*17829*/14595/* AE23 */,/*17830*/14595/* AE24 */,/*17831*/14595/* AE25 */,/*17832*/14595/* AE26 */, /*17833*/14595/* AE27 */,/*17834*/14595/* AE28 */,/*17835*/14595/* AE29 */,/*17836*/14595/* AE2A */, /*17837*/14595/* AE2B */,/*17838*/14595/* AE2C */,/*17839*/14595/* AE2D */,/*17840*/14595/* AE2E */, /*17841*/14595/* AE2F */,/*17842*/14594/* AE30 */,/*17843*/14595/* AE31 */,/*17844*/14595/* AE32 */, /*17845*/14595/* AE33 */,/*17846*/14595/* AE34 */,/*17847*/14595/* AE35 */,/*17848*/14595/* AE36 */, /*17849*/14595/* AE37 */,/*17850*/14595/* AE38 */,/*17851*/14595/* AE39 */,/*17852*/14595/* AE3A */, /*17853*/14595/* AE3B */,/*17854*/14595/* AE3C */,/*17855*/14595/* AE3D */,/*17856*/14595/* AE3E */, /*17857*/14595/* AE3F */,/*17858*/14595/* AE40 */,/*17859*/14595/* AE41 */,/*17860*/14595/* AE42 */, /*17861*/14595/* AE43 */,/*17862*/14595/* AE44 */,/*17863*/14595/* AE45 */,/*17864*/14595/* AE46 */, /*17865*/14595/* AE47 */,/*17866*/14595/* AE48 */,/*17867*/14595/* AE49 */,/*17868*/14595/* AE4A */, /*17869*/14595/* AE4B */,/*17870*/14594/* AE4C */,/*17871*/14595/* AE4D */,/*17872*/14595/* AE4E */, /*17873*/14595/* AE4F */,/*17874*/14595/* AE50 */,/*17875*/14595/* AE51 */,/*17876*/14595/* AE52 */, /*17877*/14595/* AE53 */,/*17878*/14595/* AE54 */,/*17879*/14595/* AE55 */,/*17880*/14595/* AE56 */, /*17881*/14595/* AE57 */,/*17882*/14595/* AE58 */,/*17883*/14595/* AE59 */,/*17884*/14595/* AE5A */, /*17885*/14595/* AE5B */,/*17886*/14595/* AE5C */,/*17887*/14595/* AE5D */,/*17888*/14595/* AE5E */, /*17889*/14595/* AE5F */,/*17890*/14595/* AE60 */,/*17891*/14595/* AE61 */,/*17892*/14595/* AE62 */, /*17893*/14595/* AE63 */,/*17894*/14595/* AE64 */,/*17895*/14595/* AE65 */,/*17896*/14595/* AE66 */, /*17897*/14595/* AE67 */,/*17898*/14594/* AE68 */,/*17899*/14595/* AE69 */,/*17900*/14595/* AE6A */, /*17901*/14595/* AE6B */,/*17902*/14595/* AE6C */,/*17903*/14595/* AE6D */,/*17904*/14595/* AE6E */, /*17905*/14595/* AE6F */,/*17906*/14595/* AE70 */,/*17907*/14595/* AE71 */,/*17908*/14595/* AE72 */, /*17909*/14595/* AE73 */,/*17910*/14595/* AE74 */,/*17911*/14595/* AE75 */,/*17912*/14595/* AE76 */, /*17913*/14595/* AE77 */,/*17914*/14595/* AE78 */,/*17915*/14595/* AE79 */,/*17916*/14595/* AE7A */, /*17917*/14595/* AE7B */,/*17918*/14595/* AE7C */,/*17919*/14595/* AE7D */,/*17920*/14595/* AE7E */, /*17921*/14595/* AE7F */,/*17922*/14595/* AE80 */,/*17923*/14595/* AE81 */,/*17924*/14595/* AE82 */, /*17925*/14595/* AE83 */,/*17926*/14594/* AE84 */,/*17927*/14595/* AE85 */,/*17928*/14595/* AE86 */, /*17929*/14595/* AE87 */,/*17930*/14595/* AE88 */,/*17931*/14595/* AE89 */,/*17932*/14595/* AE8A */, /*17933*/14595/* AE8B */,/*17934*/14595/* AE8C */,/*17935*/14595/* AE8D */,/*17936*/14595/* AE8E */, /*17937*/14595/* AE8F */,/*17938*/14595/* AE90 */,/*17939*/14595/* AE91 */,/*17940*/14595/* AE92 */, /*17941*/14595/* AE93 */,/*17942*/14595/* AE94 */,/*17943*/14595/* AE95 */,/*17944*/14595/* AE96 */, /*17945*/14595/* AE97 */,/*17946*/14595/* AE98 */,/*17947*/14595/* AE99 */,/*17948*/14595/* AE9A */, /*17949*/14595/* AE9B */,/*17950*/14595/* AE9C */,/*17951*/14595/* AE9D */,/*17952*/14595/* AE9E */, /*17953*/14595/* AE9F */,/*17954*/14594/* AEA0 */,/*17955*/14595/* AEA1 */,/*17956*/14595/* AEA2 */, /*17957*/14595/* AEA3 */,/*17958*/14595/* AEA4 */,/*17959*/14595/* AEA5 */,/*17960*/14595/* AEA6 */, /*17961*/14595/* AEA7 */,/*17962*/14595/* AEA8 */,/*17963*/14595/* AEA9 */,/*17964*/14595/* AEAA */, /*17965*/14595/* AEAB */,/*17966*/14595/* AEAC */,/*17967*/14595/* AEAD */,/*17968*/14595/* AEAE */, /*17969*/14595/* AEAF */,/*17970*/14595/* AEB0 */,/*17971*/14595/* AEB1 */,/*17972*/14595/* AEB2 */, /*17973*/14595/* AEB3 */,/*17974*/14595/* AEB4 */,/*17975*/14595/* AEB5 */,/*17976*/14595/* AEB6 */, /*17977*/14595/* AEB7 */,/*17978*/14595/* AEB8 */,/*17979*/14595/* AEB9 */,/*17980*/14595/* AEBA */, /*17981*/14595/* AEBB */,/*17982*/14594/* AEBC */,/*17983*/14595/* AEBD */,/*17984*/14595/* AEBE */, /*17985*/14595/* AEBF */,/*17986*/14595/* AEC0 */,/*17987*/14595/* AEC1 */,/*17988*/14595/* AEC2 */, /*17989*/14595/* AEC3 */,/*17990*/14595/* AEC4 */,/*17991*/14595/* AEC5 */,/*17992*/14595/* AEC6 */, /*17993*/14595/* AEC7 */,/*17994*/14595/* AEC8 */,/*17995*/14595/* AEC9 */,/*17996*/14595/* AECA */, /*17997*/14595/* AECB */,/*17998*/14595/* AECC */,/*17999*/14595/* AECD */,/*18000*/14595/* AECE */, /*18001*/14595/* AECF */,/*18002*/14595/* AED0 */,/*18003*/14595/* AED1 */,/*18004*/14595/* AED2 */, /*18005*/14595/* AED3 */,/*18006*/14595/* AED4 */,/*18007*/14595/* AED5 */,/*18008*/14595/* AED6 */, /*18009*/14595/* AED7 */,/*18010*/14594/* AED8 */,/*18011*/14595/* AED9 */,/*18012*/14595/* AEDA */, /*18013*/14595/* AEDB */,/*18014*/14595/* AEDC */,/*18015*/14595/* AEDD */,/*18016*/14595/* AEDE */, /*18017*/14595/* AEDF */,/*18018*/14595/* AEE0 */,/*18019*/14595/* AEE1 */,/*18020*/14595/* AEE2 */, /*18021*/14595/* AEE3 */,/*18022*/14595/* AEE4 */,/*18023*/14595/* AEE5 */,/*18024*/14595/* AEE6 */, /*18025*/14595/* AEE7 */,/*18026*/14595/* AEE8 */,/*18027*/14595/* AEE9 */,/*18028*/14595/* AEEA */, /*18029*/14595/* AEEB */,/*18030*/14595/* AEEC */,/*18031*/14595/* AEED */,/*18032*/14595/* AEEE */, /*18033*/14595/* AEEF */,/*18034*/14595/* AEF0 */,/*18035*/14595/* AEF1 */,/*18036*/14595/* AEF2 */, /*18037*/14595/* AEF3 */,/*18038*/14594/* AEF4 */,/*18039*/14595/* AEF5 */,/*18040*/14595/* AEF6 */, /*18041*/14595/* AEF7 */,/*18042*/14595/* AEF8 */,/*18043*/14595/* AEF9 */,/*18044*/14595/* AEFA */, /*18045*/14595/* AEFB */,/*18046*/14595/* AEFC */,/*18047*/14595/* AEFD */,/*18048*/14595/* AEFE */, /*18049*/14595/* AEFF */,/*18050*/14595/* AF00 */,/*18051*/14595/* AF01 */,/*18052*/14595/* AF02 */, /*18053*/14595/* AF03 */,/*18054*/14595/* AF04 */,/*18055*/14595/* AF05 */,/*18056*/14595/* AF06 */, /*18057*/14595/* AF07 */,/*18058*/14595/* AF08 */,/*18059*/14595/* AF09 */,/*18060*/14595/* AF0A */, /*18061*/14595/* AF0B */,/*18062*/14595/* AF0C */,/*18063*/14595/* AF0D */,/*18064*/14595/* AF0E */, /*18065*/14595/* AF0F */,/*18066*/14594/* AF10 */,/*18067*/14595/* AF11 */,/*18068*/14595/* AF12 */, /*18069*/14595/* AF13 */,/*18070*/14595/* AF14 */,/*18071*/14595/* AF15 */,/*18072*/14595/* AF16 */, /*18073*/14595/* AF17 */,/*18074*/14595/* AF18 */,/*18075*/14595/* AF19 */,/*18076*/14595/* AF1A */, /*18077*/14595/* AF1B */,/*18078*/14595/* AF1C */,/*18079*/14595/* AF1D */,/*18080*/14595/* AF1E */, /*18081*/14595/* AF1F */,/*18082*/14595/* AF20 */,/*18083*/14595/* AF21 */,/*18084*/14595/* AF22 */, /*18085*/14595/* AF23 */,/*18086*/14595/* AF24 */,/*18087*/14595/* AF25 */,/*18088*/14595/* AF26 */, /*18089*/14595/* AF27 */,/*18090*/14595/* AF28 */,/*18091*/14595/* AF29 */,/*18092*/14595/* AF2A */, /*18093*/14595/* AF2B */,/*18094*/14594/* AF2C */,/*18095*/14595/* AF2D */,/*18096*/14595/* AF2E */, /*18097*/14595/* AF2F */,/*18098*/14595/* AF30 */,/*18099*/14595/* AF31 */,/*18100*/14595/* AF32 */, /*18101*/14595/* AF33 */,/*18102*/14595/* AF34 */,/*18103*/14595/* AF35 */,/*18104*/14595/* AF36 */, /*18105*/14595/* AF37 */,/*18106*/14595/* AF38 */,/*18107*/14595/* AF39 */,/*18108*/14595/* AF3A */, /*18109*/14595/* AF3B */,/*18110*/14595/* AF3C */,/*18111*/14595/* AF3D */,/*18112*/14595/* AF3E */, /*18113*/14595/* AF3F */,/*18114*/14595/* AF40 */,/*18115*/14595/* AF41 */,/*18116*/14595/* AF42 */, /*18117*/14595/* AF43 */,/*18118*/14595/* AF44 */,/*18119*/14595/* AF45 */,/*18120*/14595/* AF46 */, /*18121*/14595/* AF47 */,/*18122*/14594/* AF48 */,/*18123*/14595/* AF49 */,/*18124*/14595/* AF4A */, /*18125*/14595/* AF4B */,/*18126*/14595/* AF4C */,/*18127*/14595/* AF4D */,/*18128*/14595/* AF4E */, /*18129*/14595/* AF4F */,/*18130*/14595/* AF50 */,/*18131*/14595/* AF51 */,/*18132*/14595/* AF52 */, /*18133*/14595/* AF53 */,/*18134*/14595/* AF54 */,/*18135*/14595/* AF55 */,/*18136*/14595/* AF56 */, /*18137*/14595/* AF57 */,/*18138*/14595/* AF58 */,/*18139*/14595/* AF59 */,/*18140*/14595/* AF5A */, /*18141*/14595/* AF5B */,/*18142*/14595/* AF5C */,/*18143*/14595/* AF5D */,/*18144*/14595/* AF5E */, /*18145*/14595/* AF5F */,/*18146*/14595/* AF60 */,/*18147*/14595/* AF61 */,/*18148*/14595/* AF62 */, /*18149*/14595/* AF63 */,/*18150*/14594/* AF64 */,/*18151*/14595/* AF65 */,/*18152*/14595/* AF66 */, /*18153*/14595/* AF67 */,/*18154*/14595/* AF68 */,/*18155*/14595/* AF69 */,/*18156*/14595/* AF6A */, /*18157*/14595/* AF6B */,/*18158*/14595/* AF6C */,/*18159*/14595/* AF6D */,/*18160*/14595/* AF6E */, /*18161*/14595/* AF6F */,/*18162*/14595/* AF70 */,/*18163*/14595/* AF71 */,/*18164*/14595/* AF72 */, /*18165*/14595/* AF73 */,/*18166*/14595/* AF74 */,/*18167*/14595/* AF75 */,/*18168*/14595/* AF76 */, /*18169*/14595/* AF77 */,/*18170*/14595/* AF78 */,/*18171*/14595/* AF79 */,/*18172*/14595/* AF7A */, /*18173*/14595/* AF7B */,/*18174*/14595/* AF7C */,/*18175*/14595/* AF7D */,/*18176*/14595/* AF7E */, /*18177*/14595/* AF7F */,/*18178*/14594/* AF80 */,/*18179*/14595/* AF81 */,/*18180*/14595/* AF82 */, /*18181*/14595/* AF83 */,/*18182*/14595/* AF84 */,/*18183*/14595/* AF85 */,/*18184*/14595/* AF86 */, /*18185*/14595/* AF87 */,/*18186*/14595/* AF88 */,/*18187*/14595/* AF89 */,/*18188*/14595/* AF8A */, /*18189*/14595/* AF8B */,/*18190*/14595/* AF8C */,/*18191*/14595/* AF8D */,/*18192*/14595/* AF8E */, /*18193*/14595/* AF8F */,/*18194*/14595/* AF90 */,/*18195*/14595/* AF91 */,/*18196*/14595/* AF92 */, /*18197*/14595/* AF93 */,/*18198*/14595/* AF94 */,/*18199*/14595/* AF95 */,/*18200*/14595/* AF96 */, /*18201*/14595/* AF97 */,/*18202*/14595/* AF98 */,/*18203*/14595/* AF99 */,/*18204*/14595/* AF9A */, /*18205*/14595/* AF9B */,/*18206*/14594/* AF9C */,/*18207*/14595/* AF9D */,/*18208*/14595/* AF9E */, /*18209*/14595/* AF9F */,/*18210*/14595/* AFA0 */,/*18211*/14595/* AFA1 */,/*18212*/14595/* AFA2 */, /*18213*/14595/* AFA3 */,/*18214*/14595/* AFA4 */,/*18215*/14595/* AFA5 */,/*18216*/14595/* AFA6 */, /*18217*/14595/* AFA7 */,/*18218*/14595/* AFA8 */,/*18219*/14595/* AFA9 */,/*18220*/14595/* AFAA */, /*18221*/14595/* AFAB */,/*18222*/14595/* AFAC */,/*18223*/14595/* AFAD */,/*18224*/14595/* AFAE */, /*18225*/14595/* AFAF */,/*18226*/14595/* AFB0 */,/*18227*/14595/* AFB1 */,/*18228*/14595/* AFB2 */, /*18229*/14595/* AFB3 */,/*18230*/14595/* AFB4 */,/*18231*/14595/* AFB5 */,/*18232*/14595/* AFB6 */, /*18233*/14595/* AFB7 */,/*18234*/14594/* AFB8 */,/*18235*/14595/* AFB9 */,/*18236*/14595/* AFBA */, /*18237*/14595/* AFBB */,/*18238*/14595/* AFBC */,/*18239*/14595/* AFBD */,/*18240*/14595/* AFBE */, /*18241*/14595/* AFBF */,/*18242*/14595/* AFC0 */,/*18243*/14595/* AFC1 */,/*18244*/14595/* AFC2 */, /*18245*/14595/* AFC3 */,/*18246*/14595/* AFC4 */,/*18247*/14595/* AFC5 */,/*18248*/14595/* AFC6 */, /*18249*/14595/* AFC7 */,/*18250*/14595/* AFC8 */,/*18251*/14595/* AFC9 */,/*18252*/14595/* AFCA */, /*18253*/14595/* AFCB */,/*18254*/14595/* AFCC */,/*18255*/14595/* AFCD */,/*18256*/14595/* AFCE */, /*18257*/14595/* AFCF */,/*18258*/14595/* AFD0 */,/*18259*/14595/* AFD1 */,/*18260*/14595/* AFD2 */, /*18261*/14595/* AFD3 */,/*18262*/14594/* AFD4 */,/*18263*/14595/* AFD5 */,/*18264*/14595/* AFD6 */, /*18265*/14595/* AFD7 */,/*18266*/14595/* AFD8 */,/*18267*/14595/* AFD9 */,/*18268*/14595/* AFDA */, /*18269*/14595/* AFDB */,/*18270*/14595/* AFDC */,/*18271*/14595/* AFDD */,/*18272*/14595/* AFDE */, /*18273*/14595/* AFDF */,/*18274*/14595/* AFE0 */,/*18275*/14595/* AFE1 */,/*18276*/14595/* AFE2 */, /*18277*/14595/* AFE3 */,/*18278*/14595/* AFE4 */,/*18279*/14595/* AFE5 */,/*18280*/14595/* AFE6 */, /*18281*/14595/* AFE7 */,/*18282*/14595/* AFE8 */,/*18283*/14595/* AFE9 */,/*18284*/14595/* AFEA */, /*18285*/14595/* AFEB */,/*18286*/14595/* AFEC */,/*18287*/14595/* AFED */,/*18288*/14595/* AFEE */, /*18289*/14595/* AFEF */,/*18290*/14594/* AFF0 */,/*18291*/14595/* AFF1 */,/*18292*/14595/* AFF2 */, /*18293*/14595/* AFF3 */,/*18294*/14595/* AFF4 */,/*18295*/14595/* AFF5 */,/*18296*/14595/* AFF6 */, /*18297*/14595/* AFF7 */,/*18298*/14595/* AFF8 */,/*18299*/14595/* AFF9 */,/*18300*/14595/* AFFA */, /*18301*/14595/* AFFB */,/*18302*/14595/* AFFC */,/*18303*/14595/* AFFD */,/*18304*/14595/* AFFE */, /*18305*/14595/* AFFF */,/*18306*/14595/* B000 */,/*18307*/14595/* B001 */,/*18308*/14595/* B002 */, /*18309*/14595/* B003 */,/*18310*/14595/* B004 */,/*18311*/14595/* B005 */,/*18312*/14595/* B006 */, /*18313*/14595/* B007 */,/*18314*/14595/* B008 */,/*18315*/14595/* B009 */,/*18316*/14595/* B00A */, /*18317*/14595/* B00B */,/*18318*/14594/* B00C */,/*18319*/14595/* B00D */,/*18320*/14595/* B00E */, /*18321*/14595/* B00F */,/*18322*/14595/* B010 */,/*18323*/14595/* B011 */,/*18324*/14595/* B012 */, /*18325*/14595/* B013 */,/*18326*/14595/* B014 */,/*18327*/14595/* B015 */,/*18328*/14595/* B016 */, /*18329*/14595/* B017 */,/*18330*/14595/* B018 */,/*18331*/14595/* B019 */,/*18332*/14595/* B01A */, /*18333*/14595/* B01B */,/*18334*/14595/* B01C */,/*18335*/14595/* B01D */,/*18336*/14595/* B01E */, /*18337*/14595/* B01F */,/*18338*/14595/* B020 */,/*18339*/14595/* B021 */,/*18340*/14595/* B022 */, /*18341*/14595/* B023 */,/*18342*/14595/* B024 */,/*18343*/14595/* B025 */,/*18344*/14595/* B026 */, /*18345*/14595/* B027 */,/*18346*/14594/* B028 */,/*18347*/14595/* B029 */,/*18348*/14595/* B02A */, /*18349*/14595/* B02B */,/*18350*/14595/* B02C */,/*18351*/14595/* B02D */,/*18352*/14595/* B02E */, /*18353*/14595/* B02F */,/*18354*/14595/* B030 */,/*18355*/14595/* B031 */,/*18356*/14595/* B032 */, /*18357*/14595/* B033 */,/*18358*/14595/* B034 */,/*18359*/14595/* B035 */,/*18360*/14595/* B036 */, /*18361*/14595/* B037 */,/*18362*/14595/* B038 */,/*18363*/14595/* B039 */,/*18364*/14595/* B03A */, /*18365*/14595/* B03B */,/*18366*/14595/* B03C */,/*18367*/14595/* B03D */,/*18368*/14595/* B03E */, /*18369*/14595/* B03F */,/*18370*/14595/* B040 */,/*18371*/14595/* B041 */,/*18372*/14595/* B042 */, /*18373*/14595/* B043 */,/*18374*/14594/* B044 */,/*18375*/14595/* B045 */,/*18376*/14595/* B046 */, /*18377*/14595/* B047 */,/*18378*/14595/* B048 */,/*18379*/14595/* B049 */,/*18380*/14595/* B04A */, /*18381*/14595/* B04B */,/*18382*/14595/* B04C */,/*18383*/14595/* B04D */,/*18384*/14595/* B04E */, /*18385*/14595/* B04F */,/*18386*/14595/* B050 */,/*18387*/14595/* B051 */,/*18388*/14595/* B052 */, /*18389*/14595/* B053 */,/*18390*/14595/* B054 */,/*18391*/14595/* B055 */,/*18392*/14595/* B056 */, /*18393*/14595/* B057 */,/*18394*/14595/* B058 */,/*18395*/14595/* B059 */,/*18396*/14595/* B05A */, /*18397*/14595/* B05B */,/*18398*/14595/* B05C */,/*18399*/14595/* B05D */,/*18400*/14595/* B05E */, /*18401*/14595/* B05F */,/*18402*/14594/* B060 */,/*18403*/14595/* B061 */,/*18404*/14595/* B062 */, /*18405*/14595/* B063 */,/*18406*/14595/* B064 */,/*18407*/14595/* B065 */,/*18408*/14595/* B066 */, /*18409*/14595/* B067 */,/*18410*/14595/* B068 */,/*18411*/14595/* B069 */,/*18412*/14595/* B06A */, /*18413*/14595/* B06B */,/*18414*/14595/* B06C */,/*18415*/14595/* B06D */,/*18416*/14595/* B06E */, /*18417*/14595/* B06F */,/*18418*/14595/* B070 */,/*18419*/14595/* B071 */,/*18420*/14595/* B072 */, /*18421*/14595/* B073 */,/*18422*/14595/* B074 */,/*18423*/14595/* B075 */,/*18424*/14595/* B076 */, /*18425*/14595/* B077 */,/*18426*/14595/* B078 */,/*18427*/14595/* B079 */,/*18428*/14595/* B07A */, /*18429*/14595/* B07B */,/*18430*/14594/* B07C */,/*18431*/14595/* B07D */,/*18432*/14595/* B07E */, /*18433*/14595/* B07F */,/*18434*/14595/* B080 */,/*18435*/14595/* B081 */,/*18436*/14595/* B082 */, /*18437*/14595/* B083 */,/*18438*/14595/* B084 */,/*18439*/14595/* B085 */,/*18440*/14595/* B086 */, /*18441*/14595/* B087 */,/*18442*/14595/* B088 */,/*18443*/14595/* B089 */,/*18444*/14595/* B08A */, /*18445*/14595/* B08B */,/*18446*/14595/* B08C */,/*18447*/14595/* B08D */,/*18448*/14595/* B08E */, /*18449*/14595/* B08F */,/*18450*/14595/* B090 */,/*18451*/14595/* B091 */,/*18452*/14595/* B092 */, /*18453*/14595/* B093 */,/*18454*/14595/* B094 */,/*18455*/14595/* B095 */,/*18456*/14595/* B096 */, /*18457*/14595/* B097 */,/*18458*/14594/* B098 */,/*18459*/14595/* B099 */,/*18460*/14595/* B09A */, /*18461*/14595/* B09B */,/*18462*/14595/* B09C */,/*18463*/14595/* B09D */,/*18464*/14595/* B09E */, /*18465*/14595/* B09F */,/*18466*/14595/* B0A0 */,/*18467*/14595/* B0A1 */,/*18468*/14595/* B0A2 */, /*18469*/14595/* B0A3 */,/*18470*/14595/* B0A4 */,/*18471*/14595/* B0A5 */,/*18472*/14595/* B0A6 */, /*18473*/14595/* B0A7 */,/*18474*/14595/* B0A8 */,/*18475*/14595/* B0A9 */,/*18476*/14595/* B0AA */, /*18477*/14595/* B0AB */,/*18478*/14595/* B0AC */,/*18479*/14595/* B0AD */,/*18480*/14595/* B0AE */, /*18481*/14595/* B0AF */,/*18482*/14595/* B0B0 */,/*18483*/14595/* B0B1 */,/*18484*/14595/* B0B2 */, /*18485*/14595/* B0B3 */,/*18486*/14594/* B0B4 */,/*18487*/14595/* B0B5 */,/*18488*/14595/* B0B6 */, /*18489*/14595/* B0B7 */,/*18490*/14595/* B0B8 */,/*18491*/14595/* B0B9 */,/*18492*/14595/* B0BA */, /*18493*/14595/* B0BB */,/*18494*/14595/* B0BC */,/*18495*/14595/* B0BD */,/*18496*/14595/* B0BE */, /*18497*/14595/* B0BF */,/*18498*/14595/* B0C0 */,/*18499*/14595/* B0C1 */,/*18500*/14595/* B0C2 */, /*18501*/14595/* B0C3 */,/*18502*/14595/* B0C4 */,/*18503*/14595/* B0C5 */,/*18504*/14595/* B0C6 */, /*18505*/14595/* B0C7 */,/*18506*/14595/* B0C8 */,/*18507*/14595/* B0C9 */,/*18508*/14595/* B0CA */, /*18509*/14595/* B0CB */,/*18510*/14595/* B0CC */,/*18511*/14595/* B0CD */,/*18512*/14595/* B0CE */, /*18513*/14595/* B0CF */,/*18514*/14594/* B0D0 */,/*18515*/14595/* B0D1 */,/*18516*/14595/* B0D2 */, /*18517*/14595/* B0D3 */,/*18518*/14595/* B0D4 */,/*18519*/14595/* B0D5 */,/*18520*/14595/* B0D6 */, /*18521*/14595/* B0D7 */,/*18522*/14595/* B0D8 */,/*18523*/14595/* B0D9 */,/*18524*/14595/* B0DA */, /*18525*/14595/* B0DB */,/*18526*/14595/* B0DC */,/*18527*/14595/* B0DD */,/*18528*/14595/* B0DE */, /*18529*/14595/* B0DF */,/*18530*/14595/* B0E0 */,/*18531*/14595/* B0E1 */,/*18532*/14595/* B0E2 */, /*18533*/14595/* B0E3 */,/*18534*/14595/* B0E4 */,/*18535*/14595/* B0E5 */,/*18536*/14595/* B0E6 */, /*18537*/14595/* B0E7 */,/*18538*/14595/* B0E8 */,/*18539*/14595/* B0E9 */,/*18540*/14595/* B0EA */, /*18541*/14595/* B0EB */,/*18542*/14594/* B0EC */,/*18543*/14595/* B0ED */,/*18544*/14595/* B0EE */, /*18545*/14595/* B0EF */,/*18546*/14595/* B0F0 */,/*18547*/14595/* B0F1 */,/*18548*/14595/* B0F2 */, /*18549*/14595/* B0F3 */,/*18550*/14595/* B0F4 */,/*18551*/14595/* B0F5 */,/*18552*/14595/* B0F6 */, /*18553*/14595/* B0F7 */,/*18554*/14595/* B0F8 */,/*18555*/14595/* B0F9 */,/*18556*/14595/* B0FA */, /*18557*/14595/* B0FB */,/*18558*/14595/* B0FC */,/*18559*/14595/* B0FD */,/*18560*/14595/* B0FE */, /*18561*/14595/* B0FF */,/*18562*/14595/* B100 */,/*18563*/14595/* B101 */,/*18564*/14595/* B102 */, /*18565*/14595/* B103 */,/*18566*/14595/* B104 */,/*18567*/14595/* B105 */,/*18568*/14595/* B106 */, /*18569*/14595/* B107 */,/*18570*/14594/* B108 */,/*18571*/14595/* B109 */,/*18572*/14595/* B10A */, /*18573*/14595/* B10B */,/*18574*/14595/* B10C */,/*18575*/14595/* B10D */,/*18576*/14595/* B10E */, /*18577*/14595/* B10F */,/*18578*/14595/* B110 */,/*18579*/14595/* B111 */,/*18580*/14595/* B112 */, /*18581*/14595/* B113 */,/*18582*/14595/* B114 */,/*18583*/14595/* B115 */,/*18584*/14595/* B116 */, /*18585*/14595/* B117 */,/*18586*/14595/* B118 */,/*18587*/14595/* B119 */,/*18588*/14595/* B11A */, /*18589*/14595/* B11B */,/*18590*/14595/* B11C */,/*18591*/14595/* B11D */,/*18592*/14595/* B11E */, /*18593*/14595/* B11F */,/*18594*/14595/* B120 */,/*18595*/14595/* B121 */,/*18596*/14595/* B122 */, /*18597*/14595/* B123 */,/*18598*/14594/* B124 */,/*18599*/14595/* B125 */,/*18600*/14595/* B126 */, /*18601*/14595/* B127 */,/*18602*/14595/* B128 */,/*18603*/14595/* B129 */,/*18604*/14595/* B12A */, /*18605*/14595/* B12B */,/*18606*/14595/* B12C */,/*18607*/14595/* B12D */,/*18608*/14595/* B12E */, /*18609*/14595/* B12F */,/*18610*/14595/* B130 */,/*18611*/14595/* B131 */,/*18612*/14595/* B132 */, /*18613*/14595/* B133 */,/*18614*/14595/* B134 */,/*18615*/14595/* B135 */,/*18616*/14595/* B136 */, /*18617*/14595/* B137 */,/*18618*/14595/* B138 */,/*18619*/14595/* B139 */,/*18620*/14595/* B13A */, /*18621*/14595/* B13B */,/*18622*/14595/* B13C */,/*18623*/14595/* B13D */,/*18624*/14595/* B13E */, /*18625*/14595/* B13F */,/*18626*/14594/* B140 */,/*18627*/14595/* B141 */,/*18628*/14595/* B142 */, /*18629*/14595/* B143 */,/*18630*/14595/* B144 */,/*18631*/14595/* B145 */,/*18632*/14595/* B146 */, /*18633*/14595/* B147 */,/*18634*/14595/* B148 */,/*18635*/14595/* B149 */,/*18636*/14595/* B14A */, /*18637*/14595/* B14B */,/*18638*/14595/* B14C */,/*18639*/14595/* B14D */,/*18640*/14595/* B14E */, /*18641*/14595/* B14F */,/*18642*/14595/* B150 */,/*18643*/14595/* B151 */,/*18644*/14595/* B152 */, /*18645*/14595/* B153 */,/*18646*/14595/* B154 */,/*18647*/14595/* B155 */,/*18648*/14595/* B156 */, /*18649*/14595/* B157 */,/*18650*/14595/* B158 */,/*18651*/14595/* B159 */,/*18652*/14595/* B15A */, /*18653*/14595/* B15B */,/*18654*/14594/* B15C */,/*18655*/14595/* B15D */,/*18656*/14595/* B15E */, /*18657*/14595/* B15F */,/*18658*/14595/* B160 */,/*18659*/14595/* B161 */,/*18660*/14595/* B162 */, /*18661*/14595/* B163 */,/*18662*/14595/* B164 */,/*18663*/14595/* B165 */,/*18664*/14595/* B166 */, /*18665*/14595/* B167 */,/*18666*/14595/* B168 */,/*18667*/14595/* B169 */,/*18668*/14595/* B16A */, /*18669*/14595/* B16B */,/*18670*/14595/* B16C */,/*18671*/14595/* B16D */,/*18672*/14595/* B16E */, /*18673*/14595/* B16F */,/*18674*/14595/* B170 */,/*18675*/14595/* B171 */,/*18676*/14595/* B172 */, /*18677*/14595/* B173 */,/*18678*/14595/* B174 */,/*18679*/14595/* B175 */,/*18680*/14595/* B176 */, /*18681*/14595/* B177 */,/*18682*/14594/* B178 */,/*18683*/14595/* B179 */,/*18684*/14595/* B17A */, /*18685*/14595/* B17B */,/*18686*/14595/* B17C */,/*18687*/14595/* B17D */,/*18688*/14595/* B17E */, /*18689*/14595/* B17F */,/*18690*/14595/* B180 */,/*18691*/14595/* B181 */,/*18692*/14595/* B182 */, /*18693*/14595/* B183 */,/*18694*/14595/* B184 */,/*18695*/14595/* B185 */,/*18696*/14595/* B186 */, /*18697*/14595/* B187 */,/*18698*/14595/* B188 */,/*18699*/14595/* B189 */,/*18700*/14595/* B18A */, /*18701*/14595/* B18B */,/*18702*/14595/* B18C */,/*18703*/14595/* B18D */,/*18704*/14595/* B18E */, /*18705*/14595/* B18F */,/*18706*/14595/* B190 */,/*18707*/14595/* B191 */,/*18708*/14595/* B192 */, /*18709*/14595/* B193 */,/*18710*/14594/* B194 */,/*18711*/14595/* B195 */,/*18712*/14595/* B196 */, /*18713*/14595/* B197 */,/*18714*/14595/* B198 */,/*18715*/14595/* B199 */,/*18716*/14595/* B19A */, /*18717*/14595/* B19B */,/*18718*/14595/* B19C */,/*18719*/14595/* B19D */,/*18720*/14595/* B19E */, /*18721*/14595/* B19F */,/*18722*/14595/* B1A0 */,/*18723*/14595/* B1A1 */,/*18724*/14595/* B1A2 */, /*18725*/14595/* B1A3 */,/*18726*/14595/* B1A4 */,/*18727*/14595/* B1A5 */,/*18728*/14595/* B1A6 */, /*18729*/14595/* B1A7 */,/*18730*/14595/* B1A8 */,/*18731*/14595/* B1A9 */,/*18732*/14595/* B1AA */, /*18733*/14595/* B1AB */,/*18734*/14595/* B1AC */,/*18735*/14595/* B1AD */,/*18736*/14595/* B1AE */, /*18737*/14595/* B1AF */,/*18738*/14594/* B1B0 */,/*18739*/14595/* B1B1 */,/*18740*/14595/* B1B2 */, /*18741*/14595/* B1B3 */,/*18742*/14595/* B1B4 */,/*18743*/14595/* B1B5 */,/*18744*/14595/* B1B6 */, /*18745*/14595/* B1B7 */,/*18746*/14595/* B1B8 */,/*18747*/14595/* B1B9 */,/*18748*/14595/* B1BA */, /*18749*/14595/* B1BB */,/*18750*/14595/* B1BC */,/*18751*/14595/* B1BD */,/*18752*/14595/* B1BE */, /*18753*/14595/* B1BF */,/*18754*/14595/* B1C0 */,/*18755*/14595/* B1C1 */,/*18756*/14595/* B1C2 */, /*18757*/14595/* B1C3 */,/*18758*/14595/* B1C4 */,/*18759*/14595/* B1C5 */,/*18760*/14595/* B1C6 */, /*18761*/14595/* B1C7 */,/*18762*/14595/* B1C8 */,/*18763*/14595/* B1C9 */,/*18764*/14595/* B1CA */, /*18765*/14595/* B1CB */,/*18766*/14594/* B1CC */,/*18767*/14595/* B1CD */,/*18768*/14595/* B1CE */, /*18769*/14595/* B1CF */,/*18770*/14595/* B1D0 */,/*18771*/14595/* B1D1 */,/*18772*/14595/* B1D2 */, /*18773*/14595/* B1D3 */,/*18774*/14595/* B1D4 */,/*18775*/14595/* B1D5 */,/*18776*/14595/* B1D6 */, /*18777*/14595/* B1D7 */,/*18778*/14595/* B1D8 */,/*18779*/14595/* B1D9 */,/*18780*/14595/* B1DA */, /*18781*/14595/* B1DB */,/*18782*/14595/* B1DC */,/*18783*/14595/* B1DD */,/*18784*/14595/* B1DE */, /*18785*/14595/* B1DF */,/*18786*/14595/* B1E0 */,/*18787*/14595/* B1E1 */,/*18788*/14595/* B1E2 */, /*18789*/14595/* B1E3 */,/*18790*/14595/* B1E4 */,/*18791*/14595/* B1E5 */,/*18792*/14595/* B1E6 */, /*18793*/14595/* B1E7 */,/*18794*/14594/* B1E8 */,/*18795*/14595/* B1E9 */,/*18796*/14595/* B1EA */, /*18797*/14595/* B1EB */,/*18798*/14595/* B1EC */,/*18799*/14595/* B1ED */,/*18800*/14595/* B1EE */, /*18801*/14595/* B1EF */,/*18802*/14595/* B1F0 */,/*18803*/14595/* B1F1 */,/*18804*/14595/* B1F2 */, /*18805*/14595/* B1F3 */,/*18806*/14595/* B1F4 */,/*18807*/14595/* B1F5 */,/*18808*/14595/* B1F6 */, /*18809*/14595/* B1F7 */,/*18810*/14595/* B1F8 */,/*18811*/14595/* B1F9 */,/*18812*/14595/* B1FA */, /*18813*/14595/* B1FB */,/*18814*/14595/* B1FC */,/*18815*/14595/* B1FD */,/*18816*/14595/* B1FE */, /*18817*/14595/* B1FF */,/*18818*/14595/* B200 */,/*18819*/14595/* B201 */,/*18820*/14595/* B202 */, /*18821*/14595/* B203 */,/*18822*/14594/* B204 */,/*18823*/14595/* B205 */,/*18824*/14595/* B206 */, /*18825*/14595/* B207 */,/*18826*/14595/* B208 */,/*18827*/14595/* B209 */,/*18828*/14595/* B20A */, /*18829*/14595/* B20B */,/*18830*/14595/* B20C */,/*18831*/14595/* B20D */,/*18832*/14595/* B20E */, /*18833*/14595/* B20F */,/*18834*/14595/* B210 */,/*18835*/14595/* B211 */,/*18836*/14595/* B212 */, /*18837*/14595/* B213 */,/*18838*/14595/* B214 */,/*18839*/14595/* B215 */,/*18840*/14595/* B216 */, /*18841*/14595/* B217 */,/*18842*/14595/* B218 */,/*18843*/14595/* B219 */,/*18844*/14595/* B21A */, /*18845*/14595/* B21B */,/*18846*/14595/* B21C */,/*18847*/14595/* B21D */,/*18848*/14595/* B21E */, /*18849*/14595/* B21F */,/*18850*/14594/* B220 */,/*18851*/14595/* B221 */,/*18852*/14595/* B222 */, /*18853*/14595/* B223 */,/*18854*/14595/* B224 */,/*18855*/14595/* B225 */,/*18856*/14595/* B226 */, /*18857*/14595/* B227 */,/*18858*/14595/* B228 */,/*18859*/14595/* B229 */,/*18860*/14595/* B22A */, /*18861*/14595/* B22B */,/*18862*/14595/* B22C */,/*18863*/14595/* B22D */,/*18864*/14595/* B22E */, /*18865*/14595/* B22F */,/*18866*/14595/* B230 */,/*18867*/14595/* B231 */,/*18868*/14595/* B232 */, /*18869*/14595/* B233 */,/*18870*/14595/* B234 */,/*18871*/14595/* B235 */,/*18872*/14595/* B236 */, /*18873*/14595/* B237 */,/*18874*/14595/* B238 */,/*18875*/14595/* B239 */,/*18876*/14595/* B23A */, /*18877*/14595/* B23B */,/*18878*/14594/* B23C */,/*18879*/14595/* B23D */,/*18880*/14595/* B23E */, /*18881*/14595/* B23F */,/*18882*/14595/* B240 */,/*18883*/14595/* B241 */,/*18884*/14595/* B242 */, /*18885*/14595/* B243 */,/*18886*/14595/* B244 */,/*18887*/14595/* B245 */,/*18888*/14595/* B246 */, /*18889*/14595/* B247 */,/*18890*/14595/* B248 */,/*18891*/14595/* B249 */,/*18892*/14595/* B24A */, /*18893*/14595/* B24B */,/*18894*/14595/* B24C */,/*18895*/14595/* B24D */,/*18896*/14595/* B24E */, /*18897*/14595/* B24F */,/*18898*/14595/* B250 */,/*18899*/14595/* B251 */,/*18900*/14595/* B252 */, /*18901*/14595/* B253 */,/*18902*/14595/* B254 */,/*18903*/14595/* B255 */,/*18904*/14595/* B256 */, /*18905*/14595/* B257 */,/*18906*/14594/* B258 */,/*18907*/14595/* B259 */,/*18908*/14595/* B25A */, /*18909*/14595/* B25B */,/*18910*/14595/* B25C */,/*18911*/14595/* B25D */,/*18912*/14595/* B25E */, /*18913*/14595/* B25F */,/*18914*/14595/* B260 */,/*18915*/14595/* B261 */,/*18916*/14595/* B262 */, /*18917*/14595/* B263 */,/*18918*/14595/* B264 */,/*18919*/14595/* B265 */,/*18920*/14595/* B266 */, /*18921*/14595/* B267 */,/*18922*/14595/* B268 */,/*18923*/14595/* B269 */,/*18924*/14595/* B26A */, /*18925*/14595/* B26B */,/*18926*/14595/* B26C */,/*18927*/14595/* B26D */,/*18928*/14595/* B26E */, /*18929*/14595/* B26F */,/*18930*/14595/* B270 */,/*18931*/14595/* B271 */,/*18932*/14595/* B272 */, /*18933*/14595/* B273 */,/*18934*/14594/* B274 */,/*18935*/14595/* B275 */,/*18936*/14595/* B276 */, /*18937*/14595/* B277 */,/*18938*/14595/* B278 */,/*18939*/14595/* B279 */,/*18940*/14595/* B27A */, /*18941*/14595/* B27B */,/*18942*/14595/* B27C */,/*18943*/14595/* B27D */,/*18944*/14595/* B27E */, /*18945*/14595/* B27F */,/*18946*/14595/* B280 */,/*18947*/14595/* B281 */,/*18948*/14595/* B282 */, /*18949*/14595/* B283 */,/*18950*/14595/* B284 */,/*18951*/14595/* B285 */,/*18952*/14595/* B286 */, /*18953*/14595/* B287 */,/*18954*/14595/* B288 */,/*18955*/14595/* B289 */,/*18956*/14595/* B28A */, /*18957*/14595/* B28B */,/*18958*/14595/* B28C */,/*18959*/14595/* B28D */,/*18960*/14595/* B28E */, /*18961*/14595/* B28F */,/*18962*/14594/* B290 */,/*18963*/14595/* B291 */,/*18964*/14595/* B292 */, /*18965*/14595/* B293 */,/*18966*/14595/* B294 */,/*18967*/14595/* B295 */,/*18968*/14595/* B296 */, /*18969*/14595/* B297 */,/*18970*/14595/* B298 */,/*18971*/14595/* B299 */,/*18972*/14595/* B29A */, /*18973*/14595/* B29B */,/*18974*/14595/* B29C */,/*18975*/14595/* B29D */,/*18976*/14595/* B29E */, /*18977*/14595/* B29F */,/*18978*/14595/* B2A0 */,/*18979*/14595/* B2A1 */,/*18980*/14595/* B2A2 */, /*18981*/14595/* B2A3 */,/*18982*/14595/* B2A4 */,/*18983*/14595/* B2A5 */,/*18984*/14595/* B2A6 */, /*18985*/14595/* B2A7 */,/*18986*/14595/* B2A8 */,/*18987*/14595/* B2A9 */,/*18988*/14595/* B2AA */, /*18989*/14595/* B2AB */,/*18990*/14594/* B2AC */,/*18991*/14595/* B2AD */,/*18992*/14595/* B2AE */, /*18993*/14595/* B2AF */,/*18994*/14595/* B2B0 */,/*18995*/14595/* B2B1 */,/*18996*/14595/* B2B2 */, /*18997*/14595/* B2B3 */,/*18998*/14595/* B2B4 */,/*18999*/14595/* B2B5 */,/*19000*/14595/* B2B6 */, /*19001*/14595/* B2B7 */,/*19002*/14595/* B2B8 */,/*19003*/14595/* B2B9 */,/*19004*/14595/* B2BA */, /*19005*/14595/* B2BB */,/*19006*/14595/* B2BC */,/*19007*/14595/* B2BD */,/*19008*/14595/* B2BE */, /*19009*/14595/* B2BF */,/*19010*/14595/* B2C0 */,/*19011*/14595/* B2C1 */,/*19012*/14595/* B2C2 */, /*19013*/14595/* B2C3 */,/*19014*/14595/* B2C4 */,/*19015*/14595/* B2C5 */,/*19016*/14595/* B2C6 */, /*19017*/14595/* B2C7 */,/*19018*/14594/* B2C8 */,/*19019*/14595/* B2C9 */,/*19020*/14595/* B2CA */, /*19021*/14595/* B2CB */,/*19022*/14595/* B2CC */,/*19023*/14595/* B2CD */,/*19024*/14595/* B2CE */, /*19025*/14595/* B2CF */,/*19026*/14595/* B2D0 */,/*19027*/14595/* B2D1 */,/*19028*/14595/* B2D2 */, /*19029*/14595/* B2D3 */,/*19030*/14595/* B2D4 */,/*19031*/14595/* B2D5 */,/*19032*/14595/* B2D6 */, /*19033*/14595/* B2D7 */,/*19034*/14595/* B2D8 */,/*19035*/14595/* B2D9 */,/*19036*/14595/* B2DA */, /*19037*/14595/* B2DB */,/*19038*/14595/* B2DC */,/*19039*/14595/* B2DD */,/*19040*/14595/* B2DE */, /*19041*/14595/* B2DF */,/*19042*/14595/* B2E0 */,/*19043*/14595/* B2E1 */,/*19044*/14595/* B2E2 */, /*19045*/14595/* B2E3 */,/*19046*/14594/* B2E4 */,/*19047*/14595/* B2E5 */,/*19048*/14595/* B2E6 */, /*19049*/14595/* B2E7 */,/*19050*/14595/* B2E8 */,/*19051*/14595/* B2E9 */,/*19052*/14595/* B2EA */, /*19053*/14595/* B2EB */,/*19054*/14595/* B2EC */,/*19055*/14595/* B2ED */,/*19056*/14595/* B2EE */, /*19057*/14595/* B2EF */,/*19058*/14595/* B2F0 */,/*19059*/14595/* B2F1 */,/*19060*/14595/* B2F2 */, /*19061*/14595/* B2F3 */,/*19062*/14595/* B2F4 */,/*19063*/14595/* B2F5 */,/*19064*/14595/* B2F6 */, /*19065*/14595/* B2F7 */,/*19066*/14595/* B2F8 */,/*19067*/14595/* B2F9 */,/*19068*/14595/* B2FA */, /*19069*/14595/* B2FB */,/*19070*/14595/* B2FC */,/*19071*/14595/* B2FD */,/*19072*/14595/* B2FE */, /*19073*/14595/* B2FF */,/*19074*/14594/* B300 */,/*19075*/14595/* B301 */,/*19076*/14595/* B302 */, /*19077*/14595/* B303 */,/*19078*/14595/* B304 */,/*19079*/14595/* B305 */,/*19080*/14595/* B306 */, /*19081*/14595/* B307 */,/*19082*/14595/* B308 */,/*19083*/14595/* B309 */,/*19084*/14595/* B30A */, /*19085*/14595/* B30B */,/*19086*/14595/* B30C */,/*19087*/14595/* B30D */,/*19088*/14595/* B30E */, /*19089*/14595/* B30F */,/*19090*/14595/* B310 */,/*19091*/14595/* B311 */,/*19092*/14595/* B312 */, /*19093*/14595/* B313 */,/*19094*/14595/* B314 */,/*19095*/14595/* B315 */,/*19096*/14595/* B316 */, /*19097*/14595/* B317 */,/*19098*/14595/* B318 */,/*19099*/14595/* B319 */,/*19100*/14595/* B31A */, /*19101*/14595/* B31B */,/*19102*/14594/* B31C */,/*19103*/14595/* B31D */,/*19104*/14595/* B31E */, /*19105*/14595/* B31F */,/*19106*/14595/* B320 */,/*19107*/14595/* B321 */,/*19108*/14595/* B322 */, /*19109*/14595/* B323 */,/*19110*/14595/* B324 */,/*19111*/14595/* B325 */,/*19112*/14595/* B326 */, /*19113*/14595/* B327 */,/*19114*/14595/* B328 */,/*19115*/14595/* B329 */,/*19116*/14595/* B32A */, /*19117*/14595/* B32B */,/*19118*/14595/* B32C */,/*19119*/14595/* B32D */,/*19120*/14595/* B32E */, /*19121*/14595/* B32F */,/*19122*/14595/* B330 */,/*19123*/14595/* B331 */,/*19124*/14595/* B332 */, /*19125*/14595/* B333 */,/*19126*/14595/* B334 */,/*19127*/14595/* B335 */,/*19128*/14595/* B336 */, /*19129*/14595/* B337 */,/*19130*/14594/* B338 */,/*19131*/14595/* B339 */,/*19132*/14595/* B33A */, /*19133*/14595/* B33B */,/*19134*/14595/* B33C */,/*19135*/14595/* B33D */,/*19136*/14595/* B33E */, /*19137*/14595/* B33F */,/*19138*/14595/* B340 */,/*19139*/14595/* B341 */,/*19140*/14595/* B342 */, /*19141*/14595/* B343 */,/*19142*/14595/* B344 */,/*19143*/14595/* B345 */,/*19144*/14595/* B346 */, /*19145*/14595/* B347 */,/*19146*/14595/* B348 */,/*19147*/14595/* B349 */,/*19148*/14595/* B34A */, /*19149*/14595/* B34B */,/*19150*/14595/* B34C */,/*19151*/14595/* B34D */,/*19152*/14595/* B34E */, /*19153*/14595/* B34F */,/*19154*/14595/* B350 */,/*19155*/14595/* B351 */,/*19156*/14595/* B352 */, /*19157*/14595/* B353 */,/*19158*/14594/* B354 */,/*19159*/14595/* B355 */,/*19160*/14595/* B356 */, /*19161*/14595/* B357 */,/*19162*/14595/* B358 */,/*19163*/14595/* B359 */,/*19164*/14595/* B35A */, /*19165*/14595/* B35B */,/*19166*/14595/* B35C */,/*19167*/14595/* B35D */,/*19168*/14595/* B35E */, /*19169*/14595/* B35F */,/*19170*/14595/* B360 */,/*19171*/14595/* B361 */,/*19172*/14595/* B362 */, /*19173*/14595/* B363 */,/*19174*/14595/* B364 */,/*19175*/14595/* B365 */,/*19176*/14595/* B366 */, /*19177*/14595/* B367 */,/*19178*/14595/* B368 */,/*19179*/14595/* B369 */,/*19180*/14595/* B36A */, /*19181*/14595/* B36B */,/*19182*/14595/* B36C */,/*19183*/14595/* B36D */,/*19184*/14595/* B36E */, /*19185*/14595/* B36F */,/*19186*/14594/* B370 */,/*19187*/14595/* B371 */,/*19188*/14595/* B372 */, /*19189*/14595/* B373 */,/*19190*/14595/* B374 */,/*19191*/14595/* B375 */,/*19192*/14595/* B376 */, /*19193*/14595/* B377 */,/*19194*/14595/* B378 */,/*19195*/14595/* B379 */,/*19196*/14595/* B37A */, /*19197*/14595/* B37B */,/*19198*/14595/* B37C */,/*19199*/14595/* B37D */,/*19200*/14595/* B37E */, /*19201*/14595/* B37F */,/*19202*/14595/* B380 */,/*19203*/14595/* B381 */,/*19204*/14595/* B382 */, /*19205*/14595/* B383 */,/*19206*/14595/* B384 */,/*19207*/14595/* B385 */,/*19208*/14595/* B386 */, /*19209*/14595/* B387 */,/*19210*/14595/* B388 */,/*19211*/14595/* B389 */,/*19212*/14595/* B38A */, /*19213*/14595/* B38B */,/*19214*/14594/* B38C */,/*19215*/14595/* B38D */,/*19216*/14595/* B38E */, /*19217*/14595/* B38F */,/*19218*/14595/* B390 */,/*19219*/14595/* B391 */,/*19220*/14595/* B392 */, /*19221*/14595/* B393 */,/*19222*/14595/* B394 */,/*19223*/14595/* B395 */,/*19224*/14595/* B396 */, /*19225*/14595/* B397 */,/*19226*/14595/* B398 */,/*19227*/14595/* B399 */,/*19228*/14595/* B39A */, /*19229*/14595/* B39B */,/*19230*/14595/* B39C */,/*19231*/14595/* B39D */,/*19232*/14595/* B39E */, /*19233*/14595/* B39F */,/*19234*/14595/* B3A0 */,/*19235*/14595/* B3A1 */,/*19236*/14595/* B3A2 */, /*19237*/14595/* B3A3 */,/*19238*/14595/* B3A4 */,/*19239*/14595/* B3A5 */,/*19240*/14595/* B3A6 */, /*19241*/14595/* B3A7 */,/*19242*/14594/* B3A8 */,/*19243*/14595/* B3A9 */,/*19244*/14595/* B3AA */, /*19245*/14595/* B3AB */,/*19246*/14595/* B3AC */,/*19247*/14595/* B3AD */,/*19248*/14595/* B3AE */, /*19249*/14595/* B3AF */,/*19250*/14595/* B3B0 */,/*19251*/14595/* B3B1 */,/*19252*/14595/* B3B2 */, /*19253*/14595/* B3B3 */,/*19254*/14595/* B3B4 */,/*19255*/14595/* B3B5 */,/*19256*/14595/* B3B6 */, /*19257*/14595/* B3B7 */,/*19258*/14595/* B3B8 */,/*19259*/14595/* B3B9 */,/*19260*/14595/* B3BA */, /*19261*/14595/* B3BB */,/*19262*/14595/* B3BC */,/*19263*/14595/* B3BD */,/*19264*/14595/* B3BE */, /*19265*/14595/* B3BF */,/*19266*/14595/* B3C0 */,/*19267*/14595/* B3C1 */,/*19268*/14595/* B3C2 */, /*19269*/14595/* B3C3 */,/*19270*/14594/* B3C4 */,/*19271*/14595/* B3C5 */,/*19272*/14595/* B3C6 */, /*19273*/14595/* B3C7 */,/*19274*/14595/* B3C8 */,/*19275*/14595/* B3C9 */,/*19276*/14595/* B3CA */, /*19277*/14595/* B3CB */,/*19278*/14595/* B3CC */,/*19279*/14595/* B3CD */,/*19280*/14595/* B3CE */, /*19281*/14595/* B3CF */,/*19282*/14595/* B3D0 */,/*19283*/14595/* B3D1 */,/*19284*/14595/* B3D2 */, /*19285*/14595/* B3D3 */,/*19286*/14595/* B3D4 */,/*19287*/14595/* B3D5 */,/*19288*/14595/* B3D6 */, /*19289*/14595/* B3D7 */,/*19290*/14595/* B3D8 */,/*19291*/14595/* B3D9 */,/*19292*/14595/* B3DA */, /*19293*/14595/* B3DB */,/*19294*/14595/* B3DC */,/*19295*/14595/* B3DD */,/*19296*/14595/* B3DE */, /*19297*/14595/* B3DF */,/*19298*/14594/* B3E0 */,/*19299*/14595/* B3E1 */,/*19300*/14595/* B3E2 */, /*19301*/14595/* B3E3 */,/*19302*/14595/* B3E4 */,/*19303*/14595/* B3E5 */,/*19304*/14595/* B3E6 */, /*19305*/14595/* B3E7 */,/*19306*/14595/* B3E8 */,/*19307*/14595/* B3E9 */,/*19308*/14595/* B3EA */, /*19309*/14595/* B3EB */,/*19310*/14595/* B3EC */,/*19311*/14595/* B3ED */,/*19312*/14595/* B3EE */, /*19313*/14595/* B3EF */,/*19314*/14595/* B3F0 */,/*19315*/14595/* B3F1 */,/*19316*/14595/* B3F2 */, /*19317*/14595/* B3F3 */,/*19318*/14595/* B3F4 */,/*19319*/14595/* B3F5 */,/*19320*/14595/* B3F6 */, /*19321*/14595/* B3F7 */,/*19322*/14595/* B3F8 */,/*19323*/14595/* B3F9 */,/*19324*/14595/* B3FA */, /*19325*/14595/* B3FB */,/*19326*/14594/* B3FC */,/*19327*/14595/* B3FD */,/*19328*/14595/* B3FE */, /*19329*/14595/* B3FF */,/*19330*/14595/* B400 */,/*19331*/14595/* B401 */,/*19332*/14595/* B402 */, /*19333*/14595/* B403 */,/*19334*/14595/* B404 */,/*19335*/14595/* B405 */,/*19336*/14595/* B406 */, /*19337*/14595/* B407 */,/*19338*/14595/* B408 */,/*19339*/14595/* B409 */,/*19340*/14595/* B40A */, /*19341*/14595/* B40B */,/*19342*/14595/* B40C */,/*19343*/14595/* B40D */,/*19344*/14595/* B40E */, /*19345*/14595/* B40F */,/*19346*/14595/* B410 */,/*19347*/14595/* B411 */,/*19348*/14595/* B412 */, /*19349*/14595/* B413 */,/*19350*/14595/* B414 */,/*19351*/14595/* B415 */,/*19352*/14595/* B416 */, /*19353*/14595/* B417 */,/*19354*/14594/* B418 */,/*19355*/14595/* B419 */,/*19356*/14595/* B41A */, /*19357*/14595/* B41B */,/*19358*/14595/* B41C */,/*19359*/14595/* B41D */,/*19360*/14595/* B41E */, /*19361*/14595/* B41F */,/*19362*/14595/* B420 */,/*19363*/14595/* B421 */,/*19364*/14595/* B422 */, /*19365*/14595/* B423 */,/*19366*/14595/* B424 */,/*19367*/14595/* B425 */,/*19368*/14595/* B426 */, /*19369*/14595/* B427 */,/*19370*/14595/* B428 */,/*19371*/14595/* B429 */,/*19372*/14595/* B42A */, /*19373*/14595/* B42B */,/*19374*/14595/* B42C */,/*19375*/14595/* B42D */,/*19376*/14595/* B42E */, /*19377*/14595/* B42F */,/*19378*/14595/* B430 */,/*19379*/14595/* B431 */,/*19380*/14595/* B432 */, /*19381*/14595/* B433 */,/*19382*/14594/* B434 */,/*19383*/14595/* B435 */,/*19384*/14595/* B436 */, /*19385*/14595/* B437 */,/*19386*/14595/* B438 */,/*19387*/14595/* B439 */,/*19388*/14595/* B43A */, /*19389*/14595/* B43B */,/*19390*/14595/* B43C */,/*19391*/14595/* B43D */,/*19392*/14595/* B43E */, /*19393*/14595/* B43F */,/*19394*/14595/* B440 */,/*19395*/14595/* B441 */,/*19396*/14595/* B442 */, /*19397*/14595/* B443 */,/*19398*/14595/* B444 */,/*19399*/14595/* B445 */,/*19400*/14595/* B446 */, /*19401*/14595/* B447 */,/*19402*/14595/* B448 */,/*19403*/14595/* B449 */,/*19404*/14595/* B44A */, /*19405*/14595/* B44B */,/*19406*/14595/* B44C */,/*19407*/14595/* B44D */,/*19408*/14595/* B44E */, /*19409*/14595/* B44F */,/*19410*/14594/* B450 */,/*19411*/14595/* B451 */,/*19412*/14595/* B452 */, /*19413*/14595/* B453 */,/*19414*/14595/* B454 */,/*19415*/14595/* B455 */,/*19416*/14595/* B456 */, /*19417*/14595/* B457 */,/*19418*/14595/* B458 */,/*19419*/14595/* B459 */,/*19420*/14595/* B45A */, /*19421*/14595/* B45B */,/*19422*/14595/* B45C */,/*19423*/14595/* B45D */,/*19424*/14595/* B45E */, /*19425*/14595/* B45F */,/*19426*/14595/* B460 */,/*19427*/14595/* B461 */,/*19428*/14595/* B462 */, /*19429*/14595/* B463 */,/*19430*/14595/* B464 */,/*19431*/14595/* B465 */,/*19432*/14595/* B466 */, /*19433*/14595/* B467 */,/*19434*/14595/* B468 */,/*19435*/14595/* B469 */,/*19436*/14595/* B46A */, /*19437*/14595/* B46B */,/*19438*/14594/* B46C */,/*19439*/14595/* B46D */,/*19440*/14595/* B46E */, /*19441*/14595/* B46F */,/*19442*/14595/* B470 */,/*19443*/14595/* B471 */,/*19444*/14595/* B472 */, /*19445*/14595/* B473 */,/*19446*/14595/* B474 */,/*19447*/14595/* B475 */,/*19448*/14595/* B476 */, /*19449*/14595/* B477 */,/*19450*/14595/* B478 */,/*19451*/14595/* B479 */,/*19452*/14595/* B47A */, /*19453*/14595/* B47B */,/*19454*/14595/* B47C */,/*19455*/14595/* B47D */,/*19456*/14595/* B47E */, /*19457*/14595/* B47F */,/*19458*/14595/* B480 */,/*19459*/14595/* B481 */,/*19460*/14595/* B482 */, /*19461*/14595/* B483 */,/*19462*/14595/* B484 */,/*19463*/14595/* B485 */,/*19464*/14595/* B486 */, /*19465*/14595/* B487 */,/*19466*/14594/* B488 */,/*19467*/14595/* B489 */,/*19468*/14595/* B48A */, /*19469*/14595/* B48B */,/*19470*/14595/* B48C */,/*19471*/14595/* B48D */,/*19472*/14595/* B48E */, /*19473*/14595/* B48F */,/*19474*/14595/* B490 */,/*19475*/14595/* B491 */,/*19476*/14595/* B492 */, /*19477*/14595/* B493 */,/*19478*/14595/* B494 */,/*19479*/14595/* B495 */,/*19480*/14595/* B496 */, /*19481*/14595/* B497 */,/*19482*/14595/* B498 */,/*19483*/14595/* B499 */,/*19484*/14595/* B49A */, /*19485*/14595/* B49B */,/*19486*/14595/* B49C */,/*19487*/14595/* B49D */,/*19488*/14595/* B49E */, /*19489*/14595/* B49F */,/*19490*/14595/* B4A0 */,/*19491*/14595/* B4A1 */,/*19492*/14595/* B4A2 */, /*19493*/14595/* B4A3 */,/*19494*/14594/* B4A4 */,/*19495*/14595/* B4A5 */,/*19496*/14595/* B4A6 */, /*19497*/14595/* B4A7 */,/*19498*/14595/* B4A8 */,/*19499*/14595/* B4A9 */,/*19500*/14595/* B4AA */, /*19501*/14595/* B4AB */,/*19502*/14595/* B4AC */,/*19503*/14595/* B4AD */,/*19504*/14595/* B4AE */, /*19505*/14595/* B4AF */,/*19506*/14595/* B4B0 */,/*19507*/14595/* B4B1 */,/*19508*/14595/* B4B2 */, /*19509*/14595/* B4B3 */,/*19510*/14595/* B4B4 */,/*19511*/14595/* B4B5 */,/*19512*/14595/* B4B6 */, /*19513*/14595/* B4B7 */,/*19514*/14595/* B4B8 */,/*19515*/14595/* B4B9 */,/*19516*/14595/* B4BA */, /*19517*/14595/* B4BB */,/*19518*/14595/* B4BC */,/*19519*/14595/* B4BD */,/*19520*/14595/* B4BE */, /*19521*/14595/* B4BF */,/*19522*/14594/* B4C0 */,/*19523*/14595/* B4C1 */,/*19524*/14595/* B4C2 */, /*19525*/14595/* B4C3 */,/*19526*/14595/* B4C4 */,/*19527*/14595/* B4C5 */,/*19528*/14595/* B4C6 */, /*19529*/14595/* B4C7 */,/*19530*/14595/* B4C8 */,/*19531*/14595/* B4C9 */,/*19532*/14595/* B4CA */, /*19533*/14595/* B4CB */,/*19534*/14595/* B4CC */,/*19535*/14595/* B4CD */,/*19536*/14595/* B4CE */, /*19537*/14595/* B4CF */,/*19538*/14595/* B4D0 */,/*19539*/14595/* B4D1 */,/*19540*/14595/* B4D2 */, /*19541*/14595/* B4D3 */,/*19542*/14595/* B4D4 */,/*19543*/14595/* B4D5 */,/*19544*/14595/* B4D6 */, /*19545*/14595/* B4D7 */,/*19546*/14595/* B4D8 */,/*19547*/14595/* B4D9 */,/*19548*/14595/* B4DA */, /*19549*/14595/* B4DB */,/*19550*/14594/* B4DC */,/*19551*/14595/* B4DD */,/*19552*/14595/* B4DE */, /*19553*/14595/* B4DF */,/*19554*/14595/* B4E0 */,/*19555*/14595/* B4E1 */,/*19556*/14595/* B4E2 */, /*19557*/14595/* B4E3 */,/*19558*/14595/* B4E4 */,/*19559*/14595/* B4E5 */,/*19560*/14595/* B4E6 */, /*19561*/14595/* B4E7 */,/*19562*/14595/* B4E8 */,/*19563*/14595/* B4E9 */,/*19564*/14595/* B4EA */, /*19565*/14595/* B4EB */,/*19566*/14595/* B4EC */,/*19567*/14595/* B4ED */,/*19568*/14595/* B4EE */, /*19569*/14595/* B4EF */,/*19570*/14595/* B4F0 */,/*19571*/14595/* B4F1 */,/*19572*/14595/* B4F2 */, /*19573*/14595/* B4F3 */,/*19574*/14595/* B4F4 */,/*19575*/14595/* B4F5 */,/*19576*/14595/* B4F6 */, /*19577*/14595/* B4F7 */,/*19578*/14594/* B4F8 */,/*19579*/14595/* B4F9 */,/*19580*/14595/* B4FA */, /*19581*/14595/* B4FB */,/*19582*/14595/* B4FC */,/*19583*/14595/* B4FD */,/*19584*/14595/* B4FE */, /*19585*/14595/* B4FF */,/*19586*/14595/* B500 */,/*19587*/14595/* B501 */,/*19588*/14595/* B502 */, /*19589*/14595/* B503 */,/*19590*/14595/* B504 */,/*19591*/14595/* B505 */,/*19592*/14595/* B506 */, /*19593*/14595/* B507 */,/*19594*/14595/* B508 */,/*19595*/14595/* B509 */,/*19596*/14595/* B50A */, /*19597*/14595/* B50B */,/*19598*/14595/* B50C */,/*19599*/14595/* B50D */,/*19600*/14595/* B50E */, /*19601*/14595/* B50F */,/*19602*/14595/* B510 */,/*19603*/14595/* B511 */,/*19604*/14595/* B512 */, /*19605*/14595/* B513 */,/*19606*/14594/* B514 */,/*19607*/14595/* B515 */,/*19608*/14595/* B516 */, /*19609*/14595/* B517 */,/*19610*/14595/* B518 */,/*19611*/14595/* B519 */,/*19612*/14595/* B51A */, /*19613*/14595/* B51B */,/*19614*/14595/* B51C */,/*19615*/14595/* B51D */,/*19616*/14595/* B51E */, /*19617*/14595/* B51F */,/*19618*/14595/* B520 */,/*19619*/14595/* B521 */,/*19620*/14595/* B522 */, /*19621*/14595/* B523 */,/*19622*/14595/* B524 */,/*19623*/14595/* B525 */,/*19624*/14595/* B526 */, /*19625*/14595/* B527 */,/*19626*/14595/* B528 */,/*19627*/14595/* B529 */,/*19628*/14595/* B52A */, /*19629*/14595/* B52B */,/*19630*/14595/* B52C */,/*19631*/14595/* B52D */,/*19632*/14595/* B52E */, /*19633*/14595/* B52F */,/*19634*/14594/* B530 */,/*19635*/14595/* B531 */,/*19636*/14595/* B532 */, /*19637*/14595/* B533 */,/*19638*/14595/* B534 */,/*19639*/14595/* B535 */,/*19640*/14595/* B536 */, /*19641*/14595/* B537 */,/*19642*/14595/* B538 */,/*19643*/14595/* B539 */,/*19644*/14595/* B53A */, /*19645*/14595/* B53B */,/*19646*/14595/* B53C */,/*19647*/14595/* B53D */,/*19648*/14595/* B53E */, /*19649*/14595/* B53F */,/*19650*/14595/* B540 */,/*19651*/14595/* B541 */,/*19652*/14595/* B542 */, /*19653*/14595/* B543 */,/*19654*/14595/* B544 */,/*19655*/14595/* B545 */,/*19656*/14595/* B546 */, /*19657*/14595/* B547 */,/*19658*/14595/* B548 */,/*19659*/14595/* B549 */,/*19660*/14595/* B54A */, /*19661*/14595/* B54B */,/*19662*/14594/* B54C */,/*19663*/14595/* B54D */,/*19664*/14595/* B54E */, /*19665*/14595/* B54F */,/*19666*/14595/* B550 */,/*19667*/14595/* B551 */,/*19668*/14595/* B552 */, /*19669*/14595/* B553 */,/*19670*/14595/* B554 */,/*19671*/14595/* B555 */,/*19672*/14595/* B556 */, /*19673*/14595/* B557 */,/*19674*/14595/* B558 */,/*19675*/14595/* B559 */,/*19676*/14595/* B55A */, /*19677*/14595/* B55B */,/*19678*/14595/* B55C */,/*19679*/14595/* B55D */,/*19680*/14595/* B55E */, /*19681*/14595/* B55F */,/*19682*/14595/* B560 */,/*19683*/14595/* B561 */,/*19684*/14595/* B562 */, /*19685*/14595/* B563 */,/*19686*/14595/* B564 */,/*19687*/14595/* B565 */,/*19688*/14595/* B566 */, /*19689*/14595/* B567 */,/*19690*/14594/* B568 */,/*19691*/14595/* B569 */,/*19692*/14595/* B56A */, /*19693*/14595/* B56B */,/*19694*/14595/* B56C */,/*19695*/14595/* B56D */,/*19696*/14595/* B56E */, /*19697*/14595/* B56F */,/*19698*/14595/* B570 */,/*19699*/14595/* B571 */,/*19700*/14595/* B572 */, /*19701*/14595/* B573 */,/*19702*/14595/* B574 */,/*19703*/14595/* B575 */,/*19704*/14595/* B576 */, /*19705*/14595/* B577 */,/*19706*/14595/* B578 */,/*19707*/14595/* B579 */,/*19708*/14595/* B57A */, /*19709*/14595/* B57B */,/*19710*/14595/* B57C */,/*19711*/14595/* B57D */,/*19712*/14595/* B57E */, /*19713*/14595/* B57F */,/*19714*/14595/* B580 */,/*19715*/14595/* B581 */,/*19716*/14595/* B582 */, /*19717*/14595/* B583 */,/*19718*/14594/* B584 */,/*19719*/14595/* B585 */,/*19720*/14595/* B586 */, /*19721*/14595/* B587 */,/*19722*/14595/* B588 */,/*19723*/14595/* B589 */,/*19724*/14595/* B58A */, /*19725*/14595/* B58B */,/*19726*/14595/* B58C */,/*19727*/14595/* B58D */,/*19728*/14595/* B58E */, /*19729*/14595/* B58F */,/*19730*/14595/* B590 */,/*19731*/14595/* B591 */,/*19732*/14595/* B592 */, /*19733*/14595/* B593 */,/*19734*/14595/* B594 */,/*19735*/14595/* B595 */,/*19736*/14595/* B596 */, /*19737*/14595/* B597 */,/*19738*/14595/* B598 */,/*19739*/14595/* B599 */,/*19740*/14595/* B59A */, /*19741*/14595/* B59B */,/*19742*/14595/* B59C */,/*19743*/14595/* B59D */,/*19744*/14595/* B59E */, /*19745*/14595/* B59F */,/*19746*/14594/* B5A0 */,/*19747*/14595/* B5A1 */,/*19748*/14595/* B5A2 */, /*19749*/14595/* B5A3 */,/*19750*/14595/* B5A4 */,/*19751*/14595/* B5A5 */,/*19752*/14595/* B5A6 */, /*19753*/14595/* B5A7 */,/*19754*/14595/* B5A8 */,/*19755*/14595/* B5A9 */,/*19756*/14595/* B5AA */, /*19757*/14595/* B5AB */,/*19758*/14595/* B5AC */,/*19759*/14595/* B5AD */,/*19760*/14595/* B5AE */, /*19761*/14595/* B5AF */,/*19762*/14595/* B5B0 */,/*19763*/14595/* B5B1 */,/*19764*/14595/* B5B2 */, /*19765*/14595/* B5B3 */,/*19766*/14595/* B5B4 */,/*19767*/14595/* B5B5 */,/*19768*/14595/* B5B6 */, /*19769*/14595/* B5B7 */,/*19770*/14595/* B5B8 */,/*19771*/14595/* B5B9 */,/*19772*/14595/* B5BA */, /*19773*/14595/* B5BB */,/*19774*/14594/* B5BC */,/*19775*/14595/* B5BD */,/*19776*/14595/* B5BE */, /*19777*/14595/* B5BF */,/*19778*/14595/* B5C0 */,/*19779*/14595/* B5C1 */,/*19780*/14595/* B5C2 */, /*19781*/14595/* B5C3 */,/*19782*/14595/* B5C4 */,/*19783*/14595/* B5C5 */,/*19784*/14595/* B5C6 */, /*19785*/14595/* B5C7 */,/*19786*/14595/* B5C8 */,/*19787*/14595/* B5C9 */,/*19788*/14595/* B5CA */, /*19789*/14595/* B5CB */,/*19790*/14595/* B5CC */,/*19791*/14595/* B5CD */,/*19792*/14595/* B5CE */, /*19793*/14595/* B5CF */,/*19794*/14595/* B5D0 */,/*19795*/14595/* B5D1 */,/*19796*/14595/* B5D2 */, /*19797*/14595/* B5D3 */,/*19798*/14595/* B5D4 */,/*19799*/14595/* B5D5 */,/*19800*/14595/* B5D6 */, /*19801*/14595/* B5D7 */,/*19802*/14594/* B5D8 */,/*19803*/14595/* B5D9 */,/*19804*/14595/* B5DA */, /*19805*/14595/* B5DB */,/*19806*/14595/* B5DC */,/*19807*/14595/* B5DD */,/*19808*/14595/* B5DE */, /*19809*/14595/* B5DF */,/*19810*/14595/* B5E0 */,/*19811*/14595/* B5E1 */,/*19812*/14595/* B5E2 */, /*19813*/14595/* B5E3 */,/*19814*/14595/* B5E4 */,/*19815*/14595/* B5E5 */,/*19816*/14595/* B5E6 */, /*19817*/14595/* B5E7 */,/*19818*/14595/* B5E8 */,/*19819*/14595/* B5E9 */,/*19820*/14595/* B5EA */, /*19821*/14595/* B5EB */,/*19822*/14595/* B5EC */,/*19823*/14595/* B5ED */,/*19824*/14595/* B5EE */, /*19825*/14595/* B5EF */,/*19826*/14595/* B5F0 */,/*19827*/14595/* B5F1 */,/*19828*/14595/* B5F2 */, /*19829*/14595/* B5F3 */,/*19830*/14594/* B5F4 */,/*19831*/14595/* B5F5 */,/*19832*/14595/* B5F6 */, /*19833*/14595/* B5F7 */,/*19834*/14595/* B5F8 */,/*19835*/14595/* B5F9 */,/*19836*/14595/* B5FA */, /*19837*/14595/* B5FB */,/*19838*/14595/* B5FC */,/*19839*/14595/* B5FD */,/*19840*/14595/* B5FE */, /*19841*/14595/* B5FF */,/*19842*/14595/* B600 */,/*19843*/14595/* B601 */,/*19844*/14595/* B602 */, /*19845*/14595/* B603 */,/*19846*/14595/* B604 */,/*19847*/14595/* B605 */,/*19848*/14595/* B606 */, /*19849*/14595/* B607 */,/*19850*/14595/* B608 */,/*19851*/14595/* B609 */,/*19852*/14595/* B60A */, /*19853*/14595/* B60B */,/*19854*/14595/* B60C */,/*19855*/14595/* B60D */,/*19856*/14595/* B60E */, /*19857*/14595/* B60F */,/*19858*/14594/* B610 */,/*19859*/14595/* B611 */,/*19860*/14595/* B612 */, /*19861*/14595/* B613 */,/*19862*/14595/* B614 */,/*19863*/14595/* B615 */,/*19864*/14595/* B616 */, /*19865*/14595/* B617 */,/*19866*/14595/* B618 */,/*19867*/14595/* B619 */,/*19868*/14595/* B61A */, /*19869*/14595/* B61B */,/*19870*/14595/* B61C */,/*19871*/14595/* B61D */,/*19872*/14595/* B61E */, /*19873*/14595/* B61F */,/*19874*/14595/* B620 */,/*19875*/14595/* B621 */,/*19876*/14595/* B622 */, /*19877*/14595/* B623 */,/*19878*/14595/* B624 */,/*19879*/14595/* B625 */,/*19880*/14595/* B626 */, /*19881*/14595/* B627 */,/*19882*/14595/* B628 */,/*19883*/14595/* B629 */,/*19884*/14595/* B62A */, /*19885*/14595/* B62B */,/*19886*/14594/* B62C */,/*19887*/14595/* B62D */,/*19888*/14595/* B62E */, /*19889*/14595/* B62F */,/*19890*/14595/* B630 */,/*19891*/14595/* B631 */,/*19892*/14595/* B632 */, /*19893*/14595/* B633 */,/*19894*/14595/* B634 */,/*19895*/14595/* B635 */,/*19896*/14595/* B636 */, /*19897*/14595/* B637 */,/*19898*/14595/* B638 */,/*19899*/14595/* B639 */,/*19900*/14595/* B63A */, /*19901*/14595/* B63B */,/*19902*/14595/* B63C */,/*19903*/14595/* B63D */,/*19904*/14595/* B63E */, /*19905*/14595/* B63F */,/*19906*/14595/* B640 */,/*19907*/14595/* B641 */,/*19908*/14595/* B642 */, /*19909*/14595/* B643 */,/*19910*/14595/* B644 */,/*19911*/14595/* B645 */,/*19912*/14595/* B646 */, /*19913*/14595/* B647 */,/*19914*/14594/* B648 */,/*19915*/14595/* B649 */,/*19916*/14595/* B64A */, /*19917*/14595/* B64B */,/*19918*/14595/* B64C */,/*19919*/14595/* B64D */,/*19920*/14595/* B64E */, /*19921*/14595/* B64F */,/*19922*/14595/* B650 */,/*19923*/14595/* B651 */,/*19924*/14595/* B652 */, /*19925*/14595/* B653 */,/*19926*/14595/* B654 */,/*19927*/14595/* B655 */,/*19928*/14595/* B656 */, /*19929*/14595/* B657 */,/*19930*/14595/* B658 */,/*19931*/14595/* B659 */,/*19932*/14595/* B65A */, /*19933*/14595/* B65B */,/*19934*/14595/* B65C */,/*19935*/14595/* B65D */,/*19936*/14595/* B65E */, /*19937*/14595/* B65F */,/*19938*/14595/* B660 */,/*19939*/14595/* B661 */,/*19940*/14595/* B662 */, /*19941*/14595/* B663 */,/*19942*/14594/* B664 */,/*19943*/14595/* B665 */,/*19944*/14595/* B666 */, /*19945*/14595/* B667 */,/*19946*/14595/* B668 */,/*19947*/14595/* B669 */,/*19948*/14595/* B66A */, /*19949*/14595/* B66B */,/*19950*/14595/* B66C */,/*19951*/14595/* B66D */,/*19952*/14595/* B66E */, /*19953*/14595/* B66F */,/*19954*/14595/* B670 */,/*19955*/14595/* B671 */,/*19956*/14595/* B672 */, /*19957*/14595/* B673 */,/*19958*/14595/* B674 */,/*19959*/14595/* B675 */,/*19960*/14595/* B676 */, /*19961*/14595/* B677 */,/*19962*/14595/* B678 */,/*19963*/14595/* B679 */,/*19964*/14595/* B67A */, /*19965*/14595/* B67B */,/*19966*/14595/* B67C */,/*19967*/14595/* B67D */,/*19968*/14595/* B67E */, /*19969*/14595/* B67F */,/*19970*/14594/* B680 */,/*19971*/14595/* B681 */,/*19972*/14595/* B682 */, /*19973*/14595/* B683 */,/*19974*/14595/* B684 */,/*19975*/14595/* B685 */,/*19976*/14595/* B686 */, /*19977*/14595/* B687 */,/*19978*/14595/* B688 */,/*19979*/14595/* B689 */,/*19980*/14595/* B68A */, /*19981*/14595/* B68B */,/*19982*/14595/* B68C */,/*19983*/14595/* B68D */,/*19984*/14595/* B68E */, /*19985*/14595/* B68F */,/*19986*/14595/* B690 */,/*19987*/14595/* B691 */,/*19988*/14595/* B692 */, /*19989*/14595/* B693 */,/*19990*/14595/* B694 */,/*19991*/14595/* B695 */,/*19992*/14595/* B696 */, /*19993*/14595/* B697 */,/*19994*/14595/* B698 */,/*19995*/14595/* B699 */,/*19996*/14595/* B69A */, /*19997*/14595/* B69B */,/*19998*/14594/* B69C */,/*19999*/14595/* B69D */,/*20000*/14595/* B69E */, /*20001*/14595/* B69F */,/*20002*/14595/* B6A0 */,/*20003*/14595/* B6A1 */,/*20004*/14595/* B6A2 */, /*20005*/14595/* B6A3 */,/*20006*/14595/* B6A4 */,/*20007*/14595/* B6A5 */,/*20008*/14595/* B6A6 */, /*20009*/14595/* B6A7 */,/*20010*/14595/* B6A8 */,/*20011*/14595/* B6A9 */,/*20012*/14595/* B6AA */, /*20013*/14595/* B6AB */,/*20014*/14595/* B6AC */,/*20015*/14595/* B6AD */,/*20016*/14595/* B6AE */, /*20017*/14595/* B6AF */,/*20018*/14595/* B6B0 */,/*20019*/14595/* B6B1 */,/*20020*/14595/* B6B2 */, /*20021*/14595/* B6B3 */,/*20022*/14595/* B6B4 */,/*20023*/14595/* B6B5 */,/*20024*/14595/* B6B6 */, /*20025*/14595/* B6B7 */,/*20026*/14594/* B6B8 */,/*20027*/14595/* B6B9 */,/*20028*/14595/* B6BA */, /*20029*/14595/* B6BB */,/*20030*/14595/* B6BC */,/*20031*/14595/* B6BD */,/*20032*/14595/* B6BE */, /*20033*/14595/* B6BF */,/*20034*/14595/* B6C0 */,/*20035*/14595/* B6C1 */,/*20036*/14595/* B6C2 */, /*20037*/14595/* B6C3 */,/*20038*/14595/* B6C4 */,/*20039*/14595/* B6C5 */,/*20040*/14595/* B6C6 */, /*20041*/14595/* B6C7 */,/*20042*/14595/* B6C8 */,/*20043*/14595/* B6C9 */,/*20044*/14595/* B6CA */, /*20045*/14595/* B6CB */,/*20046*/14595/* B6CC */,/*20047*/14595/* B6CD */,/*20048*/14595/* B6CE */, /*20049*/14595/* B6CF */,/*20050*/14595/* B6D0 */,/*20051*/14595/* B6D1 */,/*20052*/14595/* B6D2 */, /*20053*/14595/* B6D3 */,/*20054*/14594/* B6D4 */,/*20055*/14595/* B6D5 */,/*20056*/14595/* B6D6 */, /*20057*/14595/* B6D7 */,/*20058*/14595/* B6D8 */,/*20059*/14595/* B6D9 */,/*20060*/14595/* B6DA */, /*20061*/14595/* B6DB */,/*20062*/14595/* B6DC */,/*20063*/14595/* B6DD */,/*20064*/14595/* B6DE */, /*20065*/14595/* B6DF */,/*20066*/14595/* B6E0 */,/*20067*/14595/* B6E1 */,/*20068*/14595/* B6E2 */, /*20069*/14595/* B6E3 */,/*20070*/14595/* B6E4 */,/*20071*/14595/* B6E5 */,/*20072*/14595/* B6E6 */, /*20073*/14595/* B6E7 */,/*20074*/14595/* B6E8 */,/*20075*/14595/* B6E9 */,/*20076*/14595/* B6EA */, /*20077*/14595/* B6EB */,/*20078*/14595/* B6EC */,/*20079*/14595/* B6ED */,/*20080*/14595/* B6EE */, /*20081*/14595/* B6EF */,/*20082*/14594/* B6F0 */,/*20083*/14595/* B6F1 */,/*20084*/14595/* B6F2 */, /*20085*/14595/* B6F3 */,/*20086*/14595/* B6F4 */,/*20087*/14595/* B6F5 */,/*20088*/14595/* B6F6 */, /*20089*/14595/* B6F7 */,/*20090*/14595/* B6F8 */,/*20091*/14595/* B6F9 */,/*20092*/14595/* B6FA */, /*20093*/14595/* B6FB */,/*20094*/14595/* B6FC */,/*20095*/14595/* B6FD */,/*20096*/14595/* B6FE */, /*20097*/14595/* B6FF */,/*20098*/14595/* B700 */,/*20099*/14595/* B701 */,/*20100*/14595/* B702 */, /*20101*/14595/* B703 */,/*20102*/14595/* B704 */,/*20103*/14595/* B705 */,/*20104*/14595/* B706 */, /*20105*/14595/* B707 */,/*20106*/14595/* B708 */,/*20107*/14595/* B709 */,/*20108*/14595/* B70A */, /*20109*/14595/* B70B */,/*20110*/14594/* B70C */,/*20111*/14595/* B70D */,/*20112*/14595/* B70E */, /*20113*/14595/* B70F */,/*20114*/14595/* B710 */,/*20115*/14595/* B711 */,/*20116*/14595/* B712 */, /*20117*/14595/* B713 */,/*20118*/14595/* B714 */,/*20119*/14595/* B715 */,/*20120*/14595/* B716 */, /*20121*/14595/* B717 */,/*20122*/14595/* B718 */,/*20123*/14595/* B719 */,/*20124*/14595/* B71A */, /*20125*/14595/* B71B */,/*20126*/14595/* B71C */,/*20127*/14595/* B71D */,/*20128*/14595/* B71E */, /*20129*/14595/* B71F */,/*20130*/14595/* B720 */,/*20131*/14595/* B721 */,/*20132*/14595/* B722 */, /*20133*/14595/* B723 */,/*20134*/14595/* B724 */,/*20135*/14595/* B725 */,/*20136*/14595/* B726 */, /*20137*/14595/* B727 */,/*20138*/14594/* B728 */,/*20139*/14595/* B729 */,/*20140*/14595/* B72A */, /*20141*/14595/* B72B */,/*20142*/14595/* B72C */,/*20143*/14595/* B72D */,/*20144*/14595/* B72E */, /*20145*/14595/* B72F */,/*20146*/14595/* B730 */,/*20147*/14595/* B731 */,/*20148*/14595/* B732 */, /*20149*/14595/* B733 */,/*20150*/14595/* B734 */,/*20151*/14595/* B735 */,/*20152*/14595/* B736 */, /*20153*/14595/* B737 */,/*20154*/14595/* B738 */,/*20155*/14595/* B739 */,/*20156*/14595/* B73A */, /*20157*/14595/* B73B */,/*20158*/14595/* B73C */,/*20159*/14595/* B73D */,/*20160*/14595/* B73E */, /*20161*/14595/* B73F */,/*20162*/14595/* B740 */,/*20163*/14595/* B741 */,/*20164*/14595/* B742 */, /*20165*/14595/* B743 */,/*20166*/14594/* B744 */,/*20167*/14595/* B745 */,/*20168*/14595/* B746 */, /*20169*/14595/* B747 */,/*20170*/14595/* B748 */,/*20171*/14595/* B749 */,/*20172*/14595/* B74A */, /*20173*/14595/* B74B */,/*20174*/14595/* B74C */,/*20175*/14595/* B74D */,/*20176*/14595/* B74E */, /*20177*/14595/* B74F */,/*20178*/14595/* B750 */,/*20179*/14595/* B751 */,/*20180*/14595/* B752 */, /*20181*/14595/* B753 */,/*20182*/14595/* B754 */,/*20183*/14595/* B755 */,/*20184*/14595/* B756 */, /*20185*/14595/* B757 */,/*20186*/14595/* B758 */,/*20187*/14595/* B759 */,/*20188*/14595/* B75A */, /*20189*/14595/* B75B */,/*20190*/14595/* B75C */,/*20191*/14595/* B75D */,/*20192*/14595/* B75E */, /*20193*/14595/* B75F */,/*20194*/14594/* B760 */,/*20195*/14595/* B761 */,/*20196*/14595/* B762 */, /*20197*/14595/* B763 */,/*20198*/14595/* B764 */,/*20199*/14595/* B765 */,/*20200*/14595/* B766 */, /*20201*/14595/* B767 */,/*20202*/14595/* B768 */,/*20203*/14595/* B769 */,/*20204*/14595/* B76A */, /*20205*/14595/* B76B */,/*20206*/14595/* B76C */,/*20207*/14595/* B76D */,/*20208*/14595/* B76E */, /*20209*/14595/* B76F */,/*20210*/14595/* B770 */,/*20211*/14595/* B771 */,/*20212*/14595/* B772 */, /*20213*/14595/* B773 */,/*20214*/14595/* B774 */,/*20215*/14595/* B775 */,/*20216*/14595/* B776 */, /*20217*/14595/* B777 */,/*20218*/14595/* B778 */,/*20219*/14595/* B779 */,/*20220*/14595/* B77A */, /*20221*/14595/* B77B */,/*20222*/14594/* B77C */,/*20223*/14595/* B77D */,/*20224*/14595/* B77E */, /*20225*/14595/* B77F */,/*20226*/14595/* B780 */,/*20227*/14595/* B781 */,/*20228*/14595/* B782 */, /*20229*/14595/* B783 */,/*20230*/14595/* B784 */,/*20231*/14595/* B785 */,/*20232*/14595/* B786 */, /*20233*/14595/* B787 */,/*20234*/14595/* B788 */,/*20235*/14595/* B789 */,/*20236*/14595/* B78A */, /*20237*/14595/* B78B */,/*20238*/14595/* B78C */,/*20239*/14595/* B78D */,/*20240*/14595/* B78E */, /*20241*/14595/* B78F */,/*20242*/14595/* B790 */,/*20243*/14595/* B791 */,/*20244*/14595/* B792 */, /*20245*/14595/* B793 */,/*20246*/14595/* B794 */,/*20247*/14595/* B795 */,/*20248*/14595/* B796 */, /*20249*/14595/* B797 */,/*20250*/14594/* B798 */,/*20251*/14595/* B799 */,/*20252*/14595/* B79A */, /*20253*/14595/* B79B */,/*20254*/14595/* B79C */,/*20255*/14595/* B79D */,/*20256*/14595/* B79E */, /*20257*/14595/* B79F */,/*20258*/14595/* B7A0 */,/*20259*/14595/* B7A1 */,/*20260*/14595/* B7A2 */, /*20261*/14595/* B7A3 */,/*20262*/14595/* B7A4 */,/*20263*/14595/* B7A5 */,/*20264*/14595/* B7A6 */, /*20265*/14595/* B7A7 */,/*20266*/14595/* B7A8 */,/*20267*/14595/* B7A9 */,/*20268*/14595/* B7AA */, /*20269*/14595/* B7AB */,/*20270*/14595/* B7AC */,/*20271*/14595/* B7AD */,/*20272*/14595/* B7AE */, /*20273*/14595/* B7AF */,/*20274*/14595/* B7B0 */,/*20275*/14595/* B7B1 */,/*20276*/14595/* B7B2 */, /*20277*/14595/* B7B3 */,/*20278*/14594/* B7B4 */,/*20279*/14595/* B7B5 */,/*20280*/14595/* B7B6 */, /*20281*/14595/* B7B7 */,/*20282*/14595/* B7B8 */,/*20283*/14595/* B7B9 */,/*20284*/14595/* B7BA */, /*20285*/14595/* B7BB */,/*20286*/14595/* B7BC */,/*20287*/14595/* B7BD */,/*20288*/14595/* B7BE */, /*20289*/14595/* B7BF */,/*20290*/14595/* B7C0 */,/*20291*/14595/* B7C1 */,/*20292*/14595/* B7C2 */, /*20293*/14595/* B7C3 */,/*20294*/14595/* B7C4 */,/*20295*/14595/* B7C5 */,/*20296*/14595/* B7C6 */, /*20297*/14595/* B7C7 */,/*20298*/14595/* B7C8 */,/*20299*/14595/* B7C9 */,/*20300*/14595/* B7CA */, /*20301*/14595/* B7CB */,/*20302*/14595/* B7CC */,/*20303*/14595/* B7CD */,/*20304*/14595/* B7CE */, /*20305*/14595/* B7CF */,/*20306*/14594/* B7D0 */,/*20307*/14595/* B7D1 */,/*20308*/14595/* B7D2 */, /*20309*/14595/* B7D3 */,/*20310*/14595/* B7D4 */,/*20311*/14595/* B7D5 */,/*20312*/14595/* B7D6 */, /*20313*/14595/* B7D7 */,/*20314*/14595/* B7D8 */,/*20315*/14595/* B7D9 */,/*20316*/14595/* B7DA */, /*20317*/14595/* B7DB */,/*20318*/14595/* B7DC */,/*20319*/14595/* B7DD */,/*20320*/14595/* B7DE */, /*20321*/14595/* B7DF */,/*20322*/14595/* B7E0 */,/*20323*/14595/* B7E1 */,/*20324*/14595/* B7E2 */, /*20325*/14595/* B7E3 */,/*20326*/14595/* B7E4 */,/*20327*/14595/* B7E5 */,/*20328*/14595/* B7E6 */, /*20329*/14595/* B7E7 */,/*20330*/14595/* B7E8 */,/*20331*/14595/* B7E9 */,/*20332*/14595/* B7EA */, /*20333*/14595/* B7EB */,/*20334*/14594/* B7EC */,/*20335*/14595/* B7ED */,/*20336*/14595/* B7EE */, /*20337*/14595/* B7EF */,/*20338*/14595/* B7F0 */,/*20339*/14595/* B7F1 */,/*20340*/14595/* B7F2 */, /*20341*/14595/* B7F3 */,/*20342*/14595/* B7F4 */,/*20343*/14595/* B7F5 */,/*20344*/14595/* B7F6 */, /*20345*/14595/* B7F7 */,/*20346*/14595/* B7F8 */,/*20347*/14595/* B7F9 */,/*20348*/14595/* B7FA */, /*20349*/14595/* B7FB */,/*20350*/14595/* B7FC */,/*20351*/14595/* B7FD */,/*20352*/14595/* B7FE */, /*20353*/14595/* B7FF */,/*20354*/14595/* B800 */,/*20355*/14595/* B801 */,/*20356*/14595/* B802 */, /*20357*/14595/* B803 */,/*20358*/14595/* B804 */,/*20359*/14595/* B805 */,/*20360*/14595/* B806 */, /*20361*/14595/* B807 */,/*20362*/14594/* B808 */,/*20363*/14595/* B809 */,/*20364*/14595/* B80A */, /*20365*/14595/* B80B */,/*20366*/14595/* B80C */,/*20367*/14595/* B80D */,/*20368*/14595/* B80E */, /*20369*/14595/* B80F */,/*20370*/14595/* B810 */,/*20371*/14595/* B811 */,/*20372*/14595/* B812 */, /*20373*/14595/* B813 */,/*20374*/14595/* B814 */,/*20375*/14595/* B815 */,/*20376*/14595/* B816 */, /*20377*/14595/* B817 */,/*20378*/14595/* B818 */,/*20379*/14595/* B819 */,/*20380*/14595/* B81A */, /*20381*/14595/* B81B */,/*20382*/14595/* B81C */,/*20383*/14595/* B81D */,/*20384*/14595/* B81E */, /*20385*/14595/* B81F */,/*20386*/14595/* B820 */,/*20387*/14595/* B821 */,/*20388*/14595/* B822 */, /*20389*/14595/* B823 */,/*20390*/14594/* B824 */,/*20391*/14595/* B825 */,/*20392*/14595/* B826 */, /*20393*/14595/* B827 */,/*20394*/14595/* B828 */,/*20395*/14595/* B829 */,/*20396*/14595/* B82A */, /*20397*/14595/* B82B */,/*20398*/14595/* B82C */,/*20399*/14595/* B82D */,/*20400*/14595/* B82E */, /*20401*/14595/* B82F */,/*20402*/14595/* B830 */,/*20403*/14595/* B831 */,/*20404*/14595/* B832 */, /*20405*/14595/* B833 */,/*20406*/14595/* B834 */,/*20407*/14595/* B835 */,/*20408*/14595/* B836 */, /*20409*/14595/* B837 */,/*20410*/14595/* B838 */,/*20411*/14595/* B839 */,/*20412*/14595/* B83A */, /*20413*/14595/* B83B */,/*20414*/14595/* B83C */,/*20415*/14595/* B83D */,/*20416*/14595/* B83E */, /*20417*/14595/* B83F */,/*20418*/14594/* B840 */,/*20419*/14595/* B841 */,/*20420*/14595/* B842 */, /*20421*/14595/* B843 */,/*20422*/14595/* B844 */,/*20423*/14595/* B845 */,/*20424*/14595/* B846 */, /*20425*/14595/* B847 */,/*20426*/14595/* B848 */,/*20427*/14595/* B849 */,/*20428*/14595/* B84A */, /*20429*/14595/* B84B */,/*20430*/14595/* B84C */,/*20431*/14595/* B84D */,/*20432*/14595/* B84E */, /*20433*/14595/* B84F */,/*20434*/14595/* B850 */,/*20435*/14595/* B851 */,/*20436*/14595/* B852 */, /*20437*/14595/* B853 */,/*20438*/14595/* B854 */,/*20439*/14595/* B855 */,/*20440*/14595/* B856 */, /*20441*/14595/* B857 */,/*20442*/14595/* B858 */,/*20443*/14595/* B859 */,/*20444*/14595/* B85A */, /*20445*/14595/* B85B */,/*20446*/14594/* B85C */,/*20447*/14595/* B85D */,/*20448*/14595/* B85E */, /*20449*/14595/* B85F */,/*20450*/14595/* B860 */,/*20451*/14595/* B861 */,/*20452*/14595/* B862 */, /*20453*/14595/* B863 */,/*20454*/14595/* B864 */,/*20455*/14595/* B865 */,/*20456*/14595/* B866 */, /*20457*/14595/* B867 */,/*20458*/14595/* B868 */,/*20459*/14595/* B869 */,/*20460*/14595/* B86A */, /*20461*/14595/* B86B */,/*20462*/14595/* B86C */,/*20463*/14595/* B86D */,/*20464*/14595/* B86E */, /*20465*/14595/* B86F */,/*20466*/14595/* B870 */,/*20467*/14595/* B871 */,/*20468*/14595/* B872 */, /*20469*/14595/* B873 */,/*20470*/14595/* B874 */,/*20471*/14595/* B875 */,/*20472*/14595/* B876 */, /*20473*/14595/* B877 */,/*20474*/14594/* B878 */,/*20475*/14595/* B879 */,/*20476*/14595/* B87A */, /*20477*/14595/* B87B */,/*20478*/14595/* B87C */,/*20479*/14595/* B87D */,/*20480*/14595/* B87E */, /*20481*/14595/* B87F */,/*20482*/14595/* B880 */,/*20483*/14595/* B881 */,/*20484*/14595/* B882 */, /*20485*/14595/* B883 */,/*20486*/14595/* B884 */,/*20487*/14595/* B885 */,/*20488*/14595/* B886 */, /*20489*/14595/* B887 */,/*20490*/14595/* B888 */,/*20491*/14595/* B889 */,/*20492*/14595/* B88A */, /*20493*/14595/* B88B */,/*20494*/14595/* B88C */,/*20495*/14595/* B88D */,/*20496*/14595/* B88E */, /*20497*/14595/* B88F */,/*20498*/14595/* B890 */,/*20499*/14595/* B891 */,/*20500*/14595/* B892 */, /*20501*/14595/* B893 */,/*20502*/14594/* B894 */,/*20503*/14595/* B895 */,/*20504*/14595/* B896 */, /*20505*/14595/* B897 */,/*20506*/14595/* B898 */,/*20507*/14595/* B899 */,/*20508*/14595/* B89A */, /*20509*/14595/* B89B */,/*20510*/14595/* B89C */,/*20511*/14595/* B89D */,/*20512*/14595/* B89E */, /*20513*/14595/* B89F */,/*20514*/14595/* B8A0 */,/*20515*/14595/* B8A1 */,/*20516*/14595/* B8A2 */, /*20517*/14595/* B8A3 */,/*20518*/14595/* B8A4 */,/*20519*/14595/* B8A5 */,/*20520*/14595/* B8A6 */, /*20521*/14595/* B8A7 */,/*20522*/14595/* B8A8 */,/*20523*/14595/* B8A9 */,/*20524*/14595/* B8AA */, /*20525*/14595/* B8AB */,/*20526*/14595/* B8AC */,/*20527*/14595/* B8AD */,/*20528*/14595/* B8AE */, /*20529*/14595/* B8AF */,/*20530*/14594/* B8B0 */,/*20531*/14595/* B8B1 */,/*20532*/14595/* B8B2 */, /*20533*/14595/* B8B3 */,/*20534*/14595/* B8B4 */,/*20535*/14595/* B8B5 */,/*20536*/14595/* B8B6 */, /*20537*/14595/* B8B7 */,/*20538*/14595/* B8B8 */,/*20539*/14595/* B8B9 */,/*20540*/14595/* B8BA */, /*20541*/14595/* B8BB */,/*20542*/14595/* B8BC */,/*20543*/14595/* B8BD */,/*20544*/14595/* B8BE */, /*20545*/14595/* B8BF */,/*20546*/14595/* B8C0 */,/*20547*/14595/* B8C1 */,/*20548*/14595/* B8C2 */, /*20549*/14595/* B8C3 */,/*20550*/14595/* B8C4 */,/*20551*/14595/* B8C5 */,/*20552*/14595/* B8C6 */, /*20553*/14595/* B8C7 */,/*20554*/14595/* B8C8 */,/*20555*/14595/* B8C9 */,/*20556*/14595/* B8CA */, /*20557*/14595/* B8CB */,/*20558*/14594/* B8CC */,/*20559*/14595/* B8CD */,/*20560*/14595/* B8CE */, /*20561*/14595/* B8CF */,/*20562*/14595/* B8D0 */,/*20563*/14595/* B8D1 */,/*20564*/14595/* B8D2 */, /*20565*/14595/* B8D3 */,/*20566*/14595/* B8D4 */,/*20567*/14595/* B8D5 */,/*20568*/14595/* B8D6 */, /*20569*/14595/* B8D7 */,/*20570*/14595/* B8D8 */,/*20571*/14595/* B8D9 */,/*20572*/14595/* B8DA */, /*20573*/14595/* B8DB */,/*20574*/14595/* B8DC */,/*20575*/14595/* B8DD */,/*20576*/14595/* B8DE */, /*20577*/14595/* B8DF */,/*20578*/14595/* B8E0 */,/*20579*/14595/* B8E1 */,/*20580*/14595/* B8E2 */, /*20581*/14595/* B8E3 */,/*20582*/14595/* B8E4 */,/*20583*/14595/* B8E5 */,/*20584*/14595/* B8E6 */, /*20585*/14595/* B8E7 */,/*20586*/14594/* B8E8 */,/*20587*/14595/* B8E9 */,/*20588*/14595/* B8EA */, /*20589*/14595/* B8EB */,/*20590*/14595/* B8EC */,/*20591*/14595/* B8ED */,/*20592*/14595/* B8EE */, /*20593*/14595/* B8EF */,/*20594*/14595/* B8F0 */,/*20595*/14595/* B8F1 */,/*20596*/14595/* B8F2 */, /*20597*/14595/* B8F3 */,/*20598*/14595/* B8F4 */,/*20599*/14595/* B8F5 */,/*20600*/14595/* B8F6 */, /*20601*/14595/* B8F7 */,/*20602*/14595/* B8F8 */,/*20603*/14595/* B8F9 */,/*20604*/14595/* B8FA */, /*20605*/14595/* B8FB */,/*20606*/14595/* B8FC */,/*20607*/14595/* B8FD */,/*20608*/14595/* B8FE */, /*20609*/14595/* B8FF */,/*20610*/14595/* B900 */,/*20611*/14595/* B901 */,/*20612*/14595/* B902 */, /*20613*/14595/* B903 */,/*20614*/14594/* B904 */,/*20615*/14595/* B905 */,/*20616*/14595/* B906 */, /*20617*/14595/* B907 */,/*20618*/14595/* B908 */,/*20619*/14595/* B909 */,/*20620*/14595/* B90A */, /*20621*/14595/* B90B */,/*20622*/14595/* B90C */,/*20623*/14595/* B90D */,/*20624*/14595/* B90E */, /*20625*/14595/* B90F */,/*20626*/14595/* B910 */,/*20627*/14595/* B911 */,/*20628*/14595/* B912 */, /*20629*/14595/* B913 */,/*20630*/14595/* B914 */,/*20631*/14595/* B915 */,/*20632*/14595/* B916 */, /*20633*/14595/* B917 */,/*20634*/14595/* B918 */,/*20635*/14595/* B919 */,/*20636*/14595/* B91A */, /*20637*/14595/* B91B */,/*20638*/14595/* B91C */,/*20639*/14595/* B91D */,/*20640*/14595/* B91E */, /*20641*/14595/* B91F */,/*20642*/14594/* B920 */,/*20643*/14595/* B921 */,/*20644*/14595/* B922 */, /*20645*/14595/* B923 */,/*20646*/14595/* B924 */,/*20647*/14595/* B925 */,/*20648*/14595/* B926 */, /*20649*/14595/* B927 */,/*20650*/14595/* B928 */,/*20651*/14595/* B929 */,/*20652*/14595/* B92A */, /*20653*/14595/* B92B */,/*20654*/14595/* B92C */,/*20655*/14595/* B92D */,/*20656*/14595/* B92E */, /*20657*/14595/* B92F */,/*20658*/14595/* B930 */,/*20659*/14595/* B931 */,/*20660*/14595/* B932 */, /*20661*/14595/* B933 */,/*20662*/14595/* B934 */,/*20663*/14595/* B935 */,/*20664*/14595/* B936 */, /*20665*/14595/* B937 */,/*20666*/14595/* B938 */,/*20667*/14595/* B939 */,/*20668*/14595/* B93A */, /*20669*/14595/* B93B */,/*20670*/14594/* B93C */,/*20671*/14595/* B93D */,/*20672*/14595/* B93E */, /*20673*/14595/* B93F */,/*20674*/14595/* B940 */,/*20675*/14595/* B941 */,/*20676*/14595/* B942 */, /*20677*/14595/* B943 */,/*20678*/14595/* B944 */,/*20679*/14595/* B945 */,/*20680*/14595/* B946 */, /*20681*/14595/* B947 */,/*20682*/14595/* B948 */,/*20683*/14595/* B949 */,/*20684*/14595/* B94A */, /*20685*/14595/* B94B */,/*20686*/14595/* B94C */,/*20687*/14595/* B94D */,/*20688*/14595/* B94E */, /*20689*/14595/* B94F */,/*20690*/14595/* B950 */,/*20691*/14595/* B951 */,/*20692*/14595/* B952 */, /*20693*/14595/* B953 */,/*20694*/14595/* B954 */,/*20695*/14595/* B955 */,/*20696*/14595/* B956 */, /*20697*/14595/* B957 */,/*20698*/14594/* B958 */,/*20699*/14595/* B959 */,/*20700*/14595/* B95A */, /*20701*/14595/* B95B */,/*20702*/14595/* B95C */,/*20703*/14595/* B95D */,/*20704*/14595/* B95E */, /*20705*/14595/* B95F */,/*20706*/14595/* B960 */,/*20707*/14595/* B961 */,/*20708*/14595/* B962 */, /*20709*/14595/* B963 */,/*20710*/14595/* B964 */,/*20711*/14595/* B965 */,/*20712*/14595/* B966 */, /*20713*/14595/* B967 */,/*20714*/14595/* B968 */,/*20715*/14595/* B969 */,/*20716*/14595/* B96A */, /*20717*/14595/* B96B */,/*20718*/14595/* B96C */,/*20719*/14595/* B96D */,/*20720*/14595/* B96E */, /*20721*/14595/* B96F */,/*20722*/14595/* B970 */,/*20723*/14595/* B971 */,/*20724*/14595/* B972 */, /*20725*/14595/* B973 */,/*20726*/14594/* B974 */,/*20727*/14595/* B975 */,/*20728*/14595/* B976 */, /*20729*/14595/* B977 */,/*20730*/14595/* B978 */,/*20731*/14595/* B979 */,/*20732*/14595/* B97A */, /*20733*/14595/* B97B */,/*20734*/14595/* B97C */,/*20735*/14595/* B97D */,/*20736*/14595/* B97E */, /*20737*/14595/* B97F */,/*20738*/14595/* B980 */,/*20739*/14595/* B981 */,/*20740*/14595/* B982 */, /*20741*/14595/* B983 */,/*20742*/14595/* B984 */,/*20743*/14595/* B985 */,/*20744*/14595/* B986 */, /*20745*/14595/* B987 */,/*20746*/14595/* B988 */,/*20747*/14595/* B989 */,/*20748*/14595/* B98A */, /*20749*/14595/* B98B */,/*20750*/14595/* B98C */,/*20751*/14595/* B98D */,/*20752*/14595/* B98E */, /*20753*/14595/* B98F */,/*20754*/14594/* B990 */,/*20755*/14595/* B991 */,/*20756*/14595/* B992 */, /*20757*/14595/* B993 */,/*20758*/14595/* B994 */,/*20759*/14595/* B995 */,/*20760*/14595/* B996 */, /*20761*/14595/* B997 */,/*20762*/14595/* B998 */,/*20763*/14595/* B999 */,/*20764*/14595/* B99A */, /*20765*/14595/* B99B */,/*20766*/14595/* B99C */,/*20767*/14595/* B99D */,/*20768*/14595/* B99E */, /*20769*/14595/* B99F */,/*20770*/14595/* B9A0 */,/*20771*/14595/* B9A1 */,/*20772*/14595/* B9A2 */, /*20773*/14595/* B9A3 */,/*20774*/14595/* B9A4 */,/*20775*/14595/* B9A5 */,/*20776*/14595/* B9A6 */, /*20777*/14595/* B9A7 */,/*20778*/14595/* B9A8 */,/*20779*/14595/* B9A9 */,/*20780*/14595/* B9AA */, /*20781*/14595/* B9AB */,/*20782*/14594/* B9AC */,/*20783*/14595/* B9AD */,/*20784*/14595/* B9AE */, /*20785*/14595/* B9AF */,/*20786*/14595/* B9B0 */,/*20787*/14595/* B9B1 */,/*20788*/14595/* B9B2 */, /*20789*/14595/* B9B3 */,/*20790*/14595/* B9B4 */,/*20791*/14595/* B9B5 */,/*20792*/14595/* B9B6 */, /*20793*/14595/* B9B7 */,/*20794*/14595/* B9B8 */,/*20795*/14595/* B9B9 */,/*20796*/14595/* B9BA */, /*20797*/14595/* B9BB */,/*20798*/14595/* B9BC */,/*20799*/14595/* B9BD */,/*20800*/14595/* B9BE */, /*20801*/14595/* B9BF */,/*20802*/14595/* B9C0 */,/*20803*/14595/* B9C1 */,/*20804*/14595/* B9C2 */, /*20805*/14595/* B9C3 */,/*20806*/14595/* B9C4 */,/*20807*/14595/* B9C5 */,/*20808*/14595/* B9C6 */, /*20809*/14595/* B9C7 */,/*20810*/14594/* B9C8 */,/*20811*/14595/* B9C9 */,/*20812*/14595/* B9CA */, /*20813*/14595/* B9CB */,/*20814*/14595/* B9CC */,/*20815*/14595/* B9CD */,/*20816*/14595/* B9CE */, /*20817*/14595/* B9CF */,/*20818*/14595/* B9D0 */,/*20819*/14595/* B9D1 */,/*20820*/14595/* B9D2 */, /*20821*/14595/* B9D3 */,/*20822*/14595/* B9D4 */,/*20823*/14595/* B9D5 */,/*20824*/14595/* B9D6 */, /*20825*/14595/* B9D7 */,/*20826*/14595/* B9D8 */,/*20827*/14595/* B9D9 */,/*20828*/14595/* B9DA */, /*20829*/14595/* B9DB */,/*20830*/14595/* B9DC */,/*20831*/14595/* B9DD */,/*20832*/14595/* B9DE */, /*20833*/14595/* B9DF */,/*20834*/14595/* B9E0 */,/*20835*/14595/* B9E1 */,/*20836*/14595/* B9E2 */, /*20837*/14595/* B9E3 */,/*20838*/14594/* B9E4 */,/*20839*/14595/* B9E5 */,/*20840*/14595/* B9E6 */, /*20841*/14595/* B9E7 */,/*20842*/14595/* B9E8 */,/*20843*/14595/* B9E9 */,/*20844*/14595/* B9EA */, /*20845*/14595/* B9EB */,/*20846*/14595/* B9EC */,/*20847*/14595/* B9ED */,/*20848*/14595/* B9EE */, /*20849*/14595/* B9EF */,/*20850*/14595/* B9F0 */,/*20851*/14595/* B9F1 */,/*20852*/14595/* B9F2 */, /*20853*/14595/* B9F3 */,/*20854*/14595/* B9F4 */,/*20855*/14595/* B9F5 */,/*20856*/14595/* B9F6 */, /*20857*/14595/* B9F7 */,/*20858*/14595/* B9F8 */,/*20859*/14595/* B9F9 */,/*20860*/14595/* B9FA */, /*20861*/14595/* B9FB */,/*20862*/14595/* B9FC */,/*20863*/14595/* B9FD */,/*20864*/14595/* B9FE */, /*20865*/14595/* B9FF */,/*20866*/14594/* BA00 */,/*20867*/14595/* BA01 */,/*20868*/14595/* BA02 */, /*20869*/14595/* BA03 */,/*20870*/14595/* BA04 */,/*20871*/14595/* BA05 */,/*20872*/14595/* BA06 */, /*20873*/14595/* BA07 */,/*20874*/14595/* BA08 */,/*20875*/14595/* BA09 */,/*20876*/14595/* BA0A */, /*20877*/14595/* BA0B */,/*20878*/14595/* BA0C */,/*20879*/14595/* BA0D */,/*20880*/14595/* BA0E */, /*20881*/14595/* BA0F */,/*20882*/14595/* BA10 */,/*20883*/14595/* BA11 */,/*20884*/14595/* BA12 */, /*20885*/14595/* BA13 */,/*20886*/14595/* BA14 */,/*20887*/14595/* BA15 */,/*20888*/14595/* BA16 */, /*20889*/14595/* BA17 */,/*20890*/14595/* BA18 */,/*20891*/14595/* BA19 */,/*20892*/14595/* BA1A */, /*20893*/14595/* BA1B */,/*20894*/14594/* BA1C */,/*20895*/14595/* BA1D */,/*20896*/14595/* BA1E */, /*20897*/14595/* BA1F */,/*20898*/14595/* BA20 */,/*20899*/14595/* BA21 */,/*20900*/14595/* BA22 */, /*20901*/14595/* BA23 */,/*20902*/14595/* BA24 */,/*20903*/14595/* BA25 */,/*20904*/14595/* BA26 */, /*20905*/14595/* BA27 */,/*20906*/14595/* BA28 */,/*20907*/14595/* BA29 */,/*20908*/14595/* BA2A */, /*20909*/14595/* BA2B */,/*20910*/14595/* BA2C */,/*20911*/14595/* BA2D */,/*20912*/14595/* BA2E */, /*20913*/14595/* BA2F */,/*20914*/14595/* BA30 */,/*20915*/14595/* BA31 */,/*20916*/14595/* BA32 */, /*20917*/14595/* BA33 */,/*20918*/14595/* BA34 */,/*20919*/14595/* BA35 */,/*20920*/14595/* BA36 */, /*20921*/14595/* BA37 */,/*20922*/14594/* BA38 */,/*20923*/14595/* BA39 */,/*20924*/14595/* BA3A */, /*20925*/14595/* BA3B */,/*20926*/14595/* BA3C */,/*20927*/14595/* BA3D */,/*20928*/14595/* BA3E */, /*20929*/14595/* BA3F */,/*20930*/14595/* BA40 */,/*20931*/14595/* BA41 */,/*20932*/14595/* BA42 */, /*20933*/14595/* BA43 */,/*20934*/14595/* BA44 */,/*20935*/14595/* BA45 */,/*20936*/14595/* BA46 */, /*20937*/14595/* BA47 */,/*20938*/14595/* BA48 */,/*20939*/14595/* BA49 */,/*20940*/14595/* BA4A */, /*20941*/14595/* BA4B */,/*20942*/14595/* BA4C */,/*20943*/14595/* BA4D */,/*20944*/14595/* BA4E */, /*20945*/14595/* BA4F */,/*20946*/14595/* BA50 */,/*20947*/14595/* BA51 */,/*20948*/14595/* BA52 */, /*20949*/14595/* BA53 */,/*20950*/14594/* BA54 */,/*20951*/14595/* BA55 */,/*20952*/14595/* BA56 */, /*20953*/14595/* BA57 */,/*20954*/14595/* BA58 */,/*20955*/14595/* BA59 */,/*20956*/14595/* BA5A */, /*20957*/14595/* BA5B */,/*20958*/14595/* BA5C */,/*20959*/14595/* BA5D */,/*20960*/14595/* BA5E */, /*20961*/14595/* BA5F */,/*20962*/14595/* BA60 */,/*20963*/14595/* BA61 */,/*20964*/14595/* BA62 */, /*20965*/14595/* BA63 */,/*20966*/14595/* BA64 */,/*20967*/14595/* BA65 */,/*20968*/14595/* BA66 */, /*20969*/14595/* BA67 */,/*20970*/14595/* BA68 */,/*20971*/14595/* BA69 */,/*20972*/14595/* BA6A */, /*20973*/14595/* BA6B */,/*20974*/14595/* BA6C */,/*20975*/14595/* BA6D */,/*20976*/14595/* BA6E */, /*20977*/14595/* BA6F */,/*20978*/14594/* BA70 */,/*20979*/14595/* BA71 */,/*20980*/14595/* BA72 */, /*20981*/14595/* BA73 */,/*20982*/14595/* BA74 */,/*20983*/14595/* BA75 */,/*20984*/14595/* BA76 */, /*20985*/14595/* BA77 */,/*20986*/14595/* BA78 */,/*20987*/14595/* BA79 */,/*20988*/14595/* BA7A */, /*20989*/14595/* BA7B */,/*20990*/14595/* BA7C */,/*20991*/14595/* BA7D */,/*20992*/14595/* BA7E */, /*20993*/14595/* BA7F */,/*20994*/14595/* BA80 */,/*20995*/14595/* BA81 */,/*20996*/14595/* BA82 */, /*20997*/14595/* BA83 */,/*20998*/14595/* BA84 */,/*20999*/14595/* BA85 */,/*21000*/14595/* BA86 */, /*21001*/14595/* BA87 */,/*21002*/14595/* BA88 */,/*21003*/14595/* BA89 */,/*21004*/14595/* BA8A */, /*21005*/14595/* BA8B */,/*21006*/14594/* BA8C */,/*21007*/14595/* BA8D */,/*21008*/14595/* BA8E */, /*21009*/14595/* BA8F */,/*21010*/14595/* BA90 */,/*21011*/14595/* BA91 */,/*21012*/14595/* BA92 */, /*21013*/14595/* BA93 */,/*21014*/14595/* BA94 */,/*21015*/14595/* BA95 */,/*21016*/14595/* BA96 */, /*21017*/14595/* BA97 */,/*21018*/14595/* BA98 */,/*21019*/14595/* BA99 */,/*21020*/14595/* BA9A */, /*21021*/14595/* BA9B */,/*21022*/14595/* BA9C */,/*21023*/14595/* BA9D */,/*21024*/14595/* BA9E */, /*21025*/14595/* BA9F */,/*21026*/14595/* BAA0 */,/*21027*/14595/* BAA1 */,/*21028*/14595/* BAA2 */, /*21029*/14595/* BAA3 */,/*21030*/14595/* BAA4 */,/*21031*/14595/* BAA5 */,/*21032*/14595/* BAA6 */, /*21033*/14595/* BAA7 */,/*21034*/14594/* BAA8 */,/*21035*/14595/* BAA9 */,/*21036*/14595/* BAAA */, /*21037*/14595/* BAAB */,/*21038*/14595/* BAAC */,/*21039*/14595/* BAAD */,/*21040*/14595/* BAAE */, /*21041*/14595/* BAAF */,/*21042*/14595/* BAB0 */,/*21043*/14595/* BAB1 */,/*21044*/14595/* BAB2 */, /*21045*/14595/* BAB3 */,/*21046*/14595/* BAB4 */,/*21047*/14595/* BAB5 */,/*21048*/14595/* BAB6 */, /*21049*/14595/* BAB7 */,/*21050*/14595/* BAB8 */,/*21051*/14595/* BAB9 */,/*21052*/14595/* BABA */, /*21053*/14595/* BABB */,/*21054*/14595/* BABC */,/*21055*/14595/* BABD */,/*21056*/14595/* BABE */, /*21057*/14595/* BABF */,/*21058*/14595/* BAC0 */,/*21059*/14595/* BAC1 */,/*21060*/14595/* BAC2 */, /*21061*/14595/* BAC3 */,/*21062*/14594/* BAC4 */,/*21063*/14595/* BAC5 */,/*21064*/14595/* BAC6 */, /*21065*/14595/* BAC7 */,/*21066*/14595/* BAC8 */,/*21067*/14595/* BAC9 */,/*21068*/14595/* BACA */, /*21069*/14595/* BACB */,/*21070*/14595/* BACC */,/*21071*/14595/* BACD */,/*21072*/14595/* BACE */, /*21073*/14595/* BACF */,/*21074*/14595/* BAD0 */,/*21075*/14595/* BAD1 */,/*21076*/14595/* BAD2 */, /*21077*/14595/* BAD3 */,/*21078*/14595/* BAD4 */,/*21079*/14595/* BAD5 */,/*21080*/14595/* BAD6 */, /*21081*/14595/* BAD7 */,/*21082*/14595/* BAD8 */,/*21083*/14595/* BAD9 */,/*21084*/14595/* BADA */, /*21085*/14595/* BADB */,/*21086*/14595/* BADC */,/*21087*/14595/* BADD */,/*21088*/14595/* BADE */, /*21089*/14595/* BADF */,/*21090*/14594/* BAE0 */,/*21091*/14595/* BAE1 */,/*21092*/14595/* BAE2 */, /*21093*/14595/* BAE3 */,/*21094*/14595/* BAE4 */,/*21095*/14595/* BAE5 */,/*21096*/14595/* BAE6 */, /*21097*/14595/* BAE7 */,/*21098*/14595/* BAE8 */,/*21099*/14595/* BAE9 */,/*21100*/14595/* BAEA */, /*21101*/14595/* BAEB */,/*21102*/14595/* BAEC */,/*21103*/14595/* BAED */,/*21104*/14595/* BAEE */, /*21105*/14595/* BAEF */,/*21106*/14595/* BAF0 */,/*21107*/14595/* BAF1 */,/*21108*/14595/* BAF2 */, /*21109*/14595/* BAF3 */,/*21110*/14595/* BAF4 */,/*21111*/14595/* BAF5 */,/*21112*/14595/* BAF6 */, /*21113*/14595/* BAF7 */,/*21114*/14595/* BAF8 */,/*21115*/14595/* BAF9 */,/*21116*/14595/* BAFA */, /*21117*/14595/* BAFB */,/*21118*/14594/* BAFC */,/*21119*/14595/* BAFD */,/*21120*/14595/* BAFE */, /*21121*/14595/* BAFF */,/*21122*/14595/* BB00 */,/*21123*/14595/* BB01 */,/*21124*/14595/* BB02 */, /*21125*/14595/* BB03 */,/*21126*/14595/* BB04 */,/*21127*/14595/* BB05 */,/*21128*/14595/* BB06 */, /*21129*/14595/* BB07 */,/*21130*/14595/* BB08 */,/*21131*/14595/* BB09 */,/*21132*/14595/* BB0A */, /*21133*/14595/* BB0B */,/*21134*/14595/* BB0C */,/*21135*/14595/* BB0D */,/*21136*/14595/* BB0E */, /*21137*/14595/* BB0F */,/*21138*/14595/* BB10 */,/*21139*/14595/* BB11 */,/*21140*/14595/* BB12 */, /*21141*/14595/* BB13 */,/*21142*/14595/* BB14 */,/*21143*/14595/* BB15 */,/*21144*/14595/* BB16 */, /*21145*/14595/* BB17 */,/*21146*/14594/* BB18 */,/*21147*/14595/* BB19 */,/*21148*/14595/* BB1A */, /*21149*/14595/* BB1B */,/*21150*/14595/* BB1C */,/*21151*/14595/* BB1D */,/*21152*/14595/* BB1E */, /*21153*/14595/* BB1F */,/*21154*/14595/* BB20 */,/*21155*/14595/* BB21 */,/*21156*/14595/* BB22 */, /*21157*/14595/* BB23 */,/*21158*/14595/* BB24 */,/*21159*/14595/* BB25 */,/*21160*/14595/* BB26 */, /*21161*/14595/* BB27 */,/*21162*/14595/* BB28 */,/*21163*/14595/* BB29 */,/*21164*/14595/* BB2A */, /*21165*/14595/* BB2B */,/*21166*/14595/* BB2C */,/*21167*/14595/* BB2D */,/*21168*/14595/* BB2E */, /*21169*/14595/* BB2F */,/*21170*/14595/* BB30 */,/*21171*/14595/* BB31 */,/*21172*/14595/* BB32 */, /*21173*/14595/* BB33 */,/*21174*/14594/* BB34 */,/*21175*/14595/* BB35 */,/*21176*/14595/* BB36 */, /*21177*/14595/* BB37 */,/*21178*/14595/* BB38 */,/*21179*/14595/* BB39 */,/*21180*/14595/* BB3A */, /*21181*/14595/* BB3B */,/*21182*/14595/* BB3C */,/*21183*/14595/* BB3D */,/*21184*/14595/* BB3E */, /*21185*/14595/* BB3F */,/*21186*/14595/* BB40 */,/*21187*/14595/* BB41 */,/*21188*/14595/* BB42 */, /*21189*/14595/* BB43 */,/*21190*/14595/* BB44 */,/*21191*/14595/* BB45 */,/*21192*/14595/* BB46 */, /*21193*/14595/* BB47 */,/*21194*/14595/* BB48 */,/*21195*/14595/* BB49 */,/*21196*/14595/* BB4A */, /*21197*/14595/* BB4B */,/*21198*/14595/* BB4C */,/*21199*/14595/* BB4D */,/*21200*/14595/* BB4E */, /*21201*/14595/* BB4F */,/*21202*/14594/* BB50 */,/*21203*/14595/* BB51 */,/*21204*/14595/* BB52 */, /*21205*/14595/* BB53 */,/*21206*/14595/* BB54 */,/*21207*/14595/* BB55 */,/*21208*/14595/* BB56 */, /*21209*/14595/* BB57 */,/*21210*/14595/* BB58 */,/*21211*/14595/* BB59 */,/*21212*/14595/* BB5A */, /*21213*/14595/* BB5B */,/*21214*/14595/* BB5C */,/*21215*/14595/* BB5D */,/*21216*/14595/* BB5E */, /*21217*/14595/* BB5F */,/*21218*/14595/* BB60 */,/*21219*/14595/* BB61 */,/*21220*/14595/* BB62 */, /*21221*/14595/* BB63 */,/*21222*/14595/* BB64 */,/*21223*/14595/* BB65 */,/*21224*/14595/* BB66 */, /*21225*/14595/* BB67 */,/*21226*/14595/* BB68 */,/*21227*/14595/* BB69 */,/*21228*/14595/* BB6A */, /*21229*/14595/* BB6B */,/*21230*/14594/* BB6C */,/*21231*/14595/* BB6D */,/*21232*/14595/* BB6E */, /*21233*/14595/* BB6F */,/*21234*/14595/* BB70 */,/*21235*/14595/* BB71 */,/*21236*/14595/* BB72 */, /*21237*/14595/* BB73 */,/*21238*/14595/* BB74 */,/*21239*/14595/* BB75 */,/*21240*/14595/* BB76 */, /*21241*/14595/* BB77 */,/*21242*/14595/* BB78 */,/*21243*/14595/* BB79 */,/*21244*/14595/* BB7A */, /*21245*/14595/* BB7B */,/*21246*/14595/* BB7C */,/*21247*/14595/* BB7D */,/*21248*/14595/* BB7E */, /*21249*/14595/* BB7F */,/*21250*/14595/* BB80 */,/*21251*/14595/* BB81 */,/*21252*/14595/* BB82 */, /*21253*/14595/* BB83 */,/*21254*/14595/* BB84 */,/*21255*/14595/* BB85 */,/*21256*/14595/* BB86 */, /*21257*/14595/* BB87 */,/*21258*/14594/* BB88 */,/*21259*/14595/* BB89 */,/*21260*/14595/* BB8A */, /*21261*/14595/* BB8B */,/*21262*/14595/* BB8C */,/*21263*/14595/* BB8D */,/*21264*/14595/* BB8E */, /*21265*/14595/* BB8F */,/*21266*/14595/* BB90 */,/*21267*/14595/* BB91 */,/*21268*/14595/* BB92 */, /*21269*/14595/* BB93 */,/*21270*/14595/* BB94 */,/*21271*/14595/* BB95 */,/*21272*/14595/* BB96 */, /*21273*/14595/* BB97 */,/*21274*/14595/* BB98 */,/*21275*/14595/* BB99 */,/*21276*/14595/* BB9A */, /*21277*/14595/* BB9B */,/*21278*/14595/* BB9C */,/*21279*/14595/* BB9D */,/*21280*/14595/* BB9E */, /*21281*/14595/* BB9F */,/*21282*/14595/* BBA0 */,/*21283*/14595/* BBA1 */,/*21284*/14595/* BBA2 */, /*21285*/14595/* BBA3 */,/*21286*/14594/* BBA4 */,/*21287*/14595/* BBA5 */,/*21288*/14595/* BBA6 */, /*21289*/14595/* BBA7 */,/*21290*/14595/* BBA8 */,/*21291*/14595/* BBA9 */,/*21292*/14595/* BBAA */, /*21293*/14595/* BBAB */,/*21294*/14595/* BBAC */,/*21295*/14595/* BBAD */,/*21296*/14595/* BBAE */, /*21297*/14595/* BBAF */,/*21298*/14595/* BBB0 */,/*21299*/14595/* BBB1 */,/*21300*/14595/* BBB2 */, /*21301*/14595/* BBB3 */,/*21302*/14595/* BBB4 */,/*21303*/14595/* BBB5 */,/*21304*/14595/* BBB6 */, /*21305*/14595/* BBB7 */,/*21306*/14595/* BBB8 */,/*21307*/14595/* BBB9 */,/*21308*/14595/* BBBA */, /*21309*/14595/* BBBB */,/*21310*/14595/* BBBC */,/*21311*/14595/* BBBD */,/*21312*/14595/* BBBE */, /*21313*/14595/* BBBF */,/*21314*/14594/* BBC0 */,/*21315*/14595/* BBC1 */,/*21316*/14595/* BBC2 */, /*21317*/14595/* BBC3 */,/*21318*/14595/* BBC4 */,/*21319*/14595/* BBC5 */,/*21320*/14595/* BBC6 */, /*21321*/14595/* BBC7 */,/*21322*/14595/* BBC8 */,/*21323*/14595/* BBC9 */,/*21324*/14595/* BBCA */, /*21325*/14595/* BBCB */,/*21326*/14595/* BBCC */,/*21327*/14595/* BBCD */,/*21328*/14595/* BBCE */, /*21329*/14595/* BBCF */,/*21330*/14595/* BBD0 */,/*21331*/14595/* BBD1 */,/*21332*/14595/* BBD2 */, /*21333*/14595/* BBD3 */,/*21334*/14595/* BBD4 */,/*21335*/14595/* BBD5 */,/*21336*/14595/* BBD6 */, /*21337*/14595/* BBD7 */,/*21338*/14595/* BBD8 */,/*21339*/14595/* BBD9 */,/*21340*/14595/* BBDA */, /*21341*/14595/* BBDB */,/*21342*/14594/* BBDC */,/*21343*/14595/* BBDD */,/*21344*/14595/* BBDE */, /*21345*/14595/* BBDF */,/*21346*/14595/* BBE0 */,/*21347*/14595/* BBE1 */,/*21348*/14595/* BBE2 */, /*21349*/14595/* BBE3 */,/*21350*/14595/* BBE4 */,/*21351*/14595/* BBE5 */,/*21352*/14595/* BBE6 */, /*21353*/14595/* BBE7 */,/*21354*/14595/* BBE8 */,/*21355*/14595/* BBE9 */,/*21356*/14595/* BBEA */, /*21357*/14595/* BBEB */,/*21358*/14595/* BBEC */,/*21359*/14595/* BBED */,/*21360*/14595/* BBEE */, /*21361*/14595/* BBEF */,/*21362*/14595/* BBF0 */,/*21363*/14595/* BBF1 */,/*21364*/14595/* BBF2 */, /*21365*/14595/* BBF3 */,/*21366*/14595/* BBF4 */,/*21367*/14595/* BBF5 */,/*21368*/14595/* BBF6 */, /*21369*/14595/* BBF7 */,/*21370*/14594/* BBF8 */,/*21371*/14595/* BBF9 */,/*21372*/14595/* BBFA */, /*21373*/14595/* BBFB */,/*21374*/14595/* BBFC */,/*21375*/14595/* BBFD */,/*21376*/14595/* BBFE */, /*21377*/14595/* BBFF */,/*21378*/14595/* BC00 */,/*21379*/14595/* BC01 */,/*21380*/14595/* BC02 */, /*21381*/14595/* BC03 */,/*21382*/14595/* BC04 */,/*21383*/14595/* BC05 */,/*21384*/14595/* BC06 */, /*21385*/14595/* BC07 */,/*21386*/14595/* BC08 */,/*21387*/14595/* BC09 */,/*21388*/14595/* BC0A */, /*21389*/14595/* BC0B */,/*21390*/14595/* BC0C */,/*21391*/14595/* BC0D */,/*21392*/14595/* BC0E */, /*21393*/14595/* BC0F */,/*21394*/14595/* BC10 */,/*21395*/14595/* BC11 */,/*21396*/14595/* BC12 */, /*21397*/14595/* BC13 */,/*21398*/14594/* BC14 */,/*21399*/14595/* BC15 */,/*21400*/14595/* BC16 */, /*21401*/14595/* BC17 */,/*21402*/14595/* BC18 */,/*21403*/14595/* BC19 */,/*21404*/14595/* BC1A */, /*21405*/14595/* BC1B */,/*21406*/14595/* BC1C */,/*21407*/14595/* BC1D */,/*21408*/14595/* BC1E */, /*21409*/14595/* BC1F */,/*21410*/14595/* BC20 */,/*21411*/14595/* BC21 */,/*21412*/14595/* BC22 */, /*21413*/14595/* BC23 */,/*21414*/14595/* BC24 */,/*21415*/14595/* BC25 */,/*21416*/14595/* BC26 */, /*21417*/14595/* BC27 */,/*21418*/14595/* BC28 */,/*21419*/14595/* BC29 */,/*21420*/14595/* BC2A */, /*21421*/14595/* BC2B */,/*21422*/14595/* BC2C */,/*21423*/14595/* BC2D */,/*21424*/14595/* BC2E */, /*21425*/14595/* BC2F */,/*21426*/14594/* BC30 */,/*21427*/14595/* BC31 */,/*21428*/14595/* BC32 */, /*21429*/14595/* BC33 */,/*21430*/14595/* BC34 */,/*21431*/14595/* BC35 */,/*21432*/14595/* BC36 */, /*21433*/14595/* BC37 */,/*21434*/14595/* BC38 */,/*21435*/14595/* BC39 */,/*21436*/14595/* BC3A */, /*21437*/14595/* BC3B */,/*21438*/14595/* BC3C */,/*21439*/14595/* BC3D */,/*21440*/14595/* BC3E */, /*21441*/14595/* BC3F */,/*21442*/14595/* BC40 */,/*21443*/14595/* BC41 */,/*21444*/14595/* BC42 */, /*21445*/14595/* BC43 */,/*21446*/14595/* BC44 */,/*21447*/14595/* BC45 */,/*21448*/14595/* BC46 */, /*21449*/14595/* BC47 */,/*21450*/14595/* BC48 */,/*21451*/14595/* BC49 */,/*21452*/14595/* BC4A */, /*21453*/14595/* BC4B */,/*21454*/14594/* BC4C */,/*21455*/14595/* BC4D */,/*21456*/14595/* BC4E */, /*21457*/14595/* BC4F */,/*21458*/14595/* BC50 */,/*21459*/14595/* BC51 */,/*21460*/14595/* BC52 */, /*21461*/14595/* BC53 */,/*21462*/14595/* BC54 */,/*21463*/14595/* BC55 */,/*21464*/14595/* BC56 */, /*21465*/14595/* BC57 */,/*21466*/14595/* BC58 */,/*21467*/14595/* BC59 */,/*21468*/14595/* BC5A */, /*21469*/14595/* BC5B */,/*21470*/14595/* BC5C */,/*21471*/14595/* BC5D */,/*21472*/14595/* BC5E */, /*21473*/14595/* BC5F */,/*21474*/14595/* BC60 */,/*21475*/14595/* BC61 */,/*21476*/14595/* BC62 */, /*21477*/14595/* BC63 */,/*21478*/14595/* BC64 */,/*21479*/14595/* BC65 */,/*21480*/14595/* BC66 */, /*21481*/14595/* BC67 */,/*21482*/14594/* BC68 */,/*21483*/14595/* BC69 */,/*21484*/14595/* BC6A */, /*21485*/14595/* BC6B */,/*21486*/14595/* BC6C */,/*21487*/14595/* BC6D */,/*21488*/14595/* BC6E */, /*21489*/14595/* BC6F */,/*21490*/14595/* BC70 */,/*21491*/14595/* BC71 */,/*21492*/14595/* BC72 */, /*21493*/14595/* BC73 */,/*21494*/14595/* BC74 */,/*21495*/14595/* BC75 */,/*21496*/14595/* BC76 */, /*21497*/14595/* BC77 */,/*21498*/14595/* BC78 */,/*21499*/14595/* BC79 */,/*21500*/14595/* BC7A */, /*21501*/14595/* BC7B */,/*21502*/14595/* BC7C */,/*21503*/14595/* BC7D */,/*21504*/14595/* BC7E */, /*21505*/14595/* BC7F */,/*21506*/14595/* BC80 */,/*21507*/14595/* BC81 */,/*21508*/14595/* BC82 */, /*21509*/14595/* BC83 */,/*21510*/14594/* BC84 */,/*21511*/14595/* BC85 */,/*21512*/14595/* BC86 */, /*21513*/14595/* BC87 */,/*21514*/14595/* BC88 */,/*21515*/14595/* BC89 */,/*21516*/14595/* BC8A */, /*21517*/14595/* BC8B */,/*21518*/14595/* BC8C */,/*21519*/14595/* BC8D */,/*21520*/14595/* BC8E */, /*21521*/14595/* BC8F */,/*21522*/14595/* BC90 */,/*21523*/14595/* BC91 */,/*21524*/14595/* BC92 */, /*21525*/14595/* BC93 */,/*21526*/14595/* BC94 */,/*21527*/14595/* BC95 */,/*21528*/14595/* BC96 */, /*21529*/14595/* BC97 */,/*21530*/14595/* BC98 */,/*21531*/14595/* BC99 */,/*21532*/14595/* BC9A */, /*21533*/14595/* BC9B */,/*21534*/14595/* BC9C */,/*21535*/14595/* BC9D */,/*21536*/14595/* BC9E */, /*21537*/14595/* BC9F */,/*21538*/14594/* BCA0 */,/*21539*/14595/* BCA1 */,/*21540*/14595/* BCA2 */, /*21541*/14595/* BCA3 */,/*21542*/14595/* BCA4 */,/*21543*/14595/* BCA5 */,/*21544*/14595/* BCA6 */, /*21545*/14595/* BCA7 */,/*21546*/14595/* BCA8 */,/*21547*/14595/* BCA9 */,/*21548*/14595/* BCAA */, /*21549*/14595/* BCAB */,/*21550*/14595/* BCAC */,/*21551*/14595/* BCAD */,/*21552*/14595/* BCAE */, /*21553*/14595/* BCAF */,/*21554*/14595/* BCB0 */,/*21555*/14595/* BCB1 */,/*21556*/14595/* BCB2 */, /*21557*/14595/* BCB3 */,/*21558*/14595/* BCB4 */,/*21559*/14595/* BCB5 */,/*21560*/14595/* BCB6 */, /*21561*/14595/* BCB7 */,/*21562*/14595/* BCB8 */,/*21563*/14595/* BCB9 */,/*21564*/14595/* BCBA */, /*21565*/14595/* BCBB */,/*21566*/14594/* BCBC */,/*21567*/14595/* BCBD */,/*21568*/14595/* BCBE */, /*21569*/14595/* BCBF */,/*21570*/14595/* BCC0 */,/*21571*/14595/* BCC1 */,/*21572*/14595/* BCC2 */, /*21573*/14595/* BCC3 */,/*21574*/14595/* BCC4 */,/*21575*/14595/* BCC5 */,/*21576*/14595/* BCC6 */, /*21577*/14595/* BCC7 */,/*21578*/14595/* BCC8 */,/*21579*/14595/* BCC9 */,/*21580*/14595/* BCCA */, /*21581*/14595/* BCCB */,/*21582*/14595/* BCCC */,/*21583*/14595/* BCCD */,/*21584*/14595/* BCCE */, /*21585*/14595/* BCCF */,/*21586*/14595/* BCD0 */,/*21587*/14595/* BCD1 */,/*21588*/14595/* BCD2 */, /*21589*/14595/* BCD3 */,/*21590*/14595/* BCD4 */,/*21591*/14595/* BCD5 */,/*21592*/14595/* BCD6 */, /*21593*/14595/* BCD7 */,/*21594*/14594/* BCD8 */,/*21595*/14595/* BCD9 */,/*21596*/14595/* BCDA */, /*21597*/14595/* BCDB */,/*21598*/14595/* BCDC */,/*21599*/14595/* BCDD */,/*21600*/14595/* BCDE */, /*21601*/14595/* BCDF */,/*21602*/14595/* BCE0 */,/*21603*/14595/* BCE1 */,/*21604*/14595/* BCE2 */, /*21605*/14595/* BCE3 */,/*21606*/14595/* BCE4 */,/*21607*/14595/* BCE5 */,/*21608*/14595/* BCE6 */, /*21609*/14595/* BCE7 */,/*21610*/14595/* BCE8 */,/*21611*/14595/* BCE9 */,/*21612*/14595/* BCEA */, /*21613*/14595/* BCEB */,/*21614*/14595/* BCEC */,/*21615*/14595/* BCED */,/*21616*/14595/* BCEE */, /*21617*/14595/* BCEF */,/*21618*/14595/* BCF0 */,/*21619*/14595/* BCF1 */,/*21620*/14595/* BCF2 */, /*21621*/14595/* BCF3 */,/*21622*/14594/* BCF4 */,/*21623*/14595/* BCF5 */,/*21624*/14595/* BCF6 */, /*21625*/14595/* BCF7 */,/*21626*/14595/* BCF8 */,/*21627*/14595/* BCF9 */,/*21628*/14595/* BCFA */, /*21629*/14595/* BCFB */,/*21630*/14595/* BCFC */,/*21631*/14595/* BCFD */,/*21632*/14595/* BCFE */, /*21633*/14595/* BCFF */,/*21634*/14595/* BD00 */,/*21635*/14595/* BD01 */,/*21636*/14595/* BD02 */, /*21637*/14595/* BD03 */,/*21638*/14595/* BD04 */,/*21639*/14595/* BD05 */,/*21640*/14595/* BD06 */, /*21641*/14595/* BD07 */,/*21642*/14595/* BD08 */,/*21643*/14595/* BD09 */,/*21644*/14595/* BD0A */, /*21645*/14595/* BD0B */,/*21646*/14595/* BD0C */,/*21647*/14595/* BD0D */,/*21648*/14595/* BD0E */, /*21649*/14595/* BD0F */,/*21650*/14594/* BD10 */,/*21651*/14595/* BD11 */,/*21652*/14595/* BD12 */, /*21653*/14595/* BD13 */,/*21654*/14595/* BD14 */,/*21655*/14595/* BD15 */,/*21656*/14595/* BD16 */, /*21657*/14595/* BD17 */,/*21658*/14595/* BD18 */,/*21659*/14595/* BD19 */,/*21660*/14595/* BD1A */, /*21661*/14595/* BD1B */,/*21662*/14595/* BD1C */,/*21663*/14595/* BD1D */,/*21664*/14595/* BD1E */, /*21665*/14595/* BD1F */,/*21666*/14595/* BD20 */,/*21667*/14595/* BD21 */,/*21668*/14595/* BD22 */, /*21669*/14595/* BD23 */,/*21670*/14595/* BD24 */,/*21671*/14595/* BD25 */,/*21672*/14595/* BD26 */, /*21673*/14595/* BD27 */,/*21674*/14595/* BD28 */,/*21675*/14595/* BD29 */,/*21676*/14595/* BD2A */, /*21677*/14595/* BD2B */,/*21678*/14594/* BD2C */,/*21679*/14595/* BD2D */,/*21680*/14595/* BD2E */, /*21681*/14595/* BD2F */,/*21682*/14595/* BD30 */,/*21683*/14595/* BD31 */,/*21684*/14595/* BD32 */, /*21685*/14595/* BD33 */,/*21686*/14595/* BD34 */,/*21687*/14595/* BD35 */,/*21688*/14595/* BD36 */, /*21689*/14595/* BD37 */,/*21690*/14595/* BD38 */,/*21691*/14595/* BD39 */,/*21692*/14595/* BD3A */, /*21693*/14595/* BD3B */,/*21694*/14595/* BD3C */,/*21695*/14595/* BD3D */,/*21696*/14595/* BD3E */, /*21697*/14595/* BD3F */,/*21698*/14595/* BD40 */,/*21699*/14595/* BD41 */,/*21700*/14595/* BD42 */, /*21701*/14595/* BD43 */,/*21702*/14595/* BD44 */,/*21703*/14595/* BD45 */,/*21704*/14595/* BD46 */, /*21705*/14595/* BD47 */,/*21706*/14594/* BD48 */,/*21707*/14595/* BD49 */,/*21708*/14595/* BD4A */, /*21709*/14595/* BD4B */,/*21710*/14595/* BD4C */,/*21711*/14595/* BD4D */,/*21712*/14595/* BD4E */, /*21713*/14595/* BD4F */,/*21714*/14595/* BD50 */,/*21715*/14595/* BD51 */,/*21716*/14595/* BD52 */, /*21717*/14595/* BD53 */,/*21718*/14595/* BD54 */,/*21719*/14595/* BD55 */,/*21720*/14595/* BD56 */, /*21721*/14595/* BD57 */,/*21722*/14595/* BD58 */,/*21723*/14595/* BD59 */,/*21724*/14595/* BD5A */, /*21725*/14595/* BD5B */,/*21726*/14595/* BD5C */,/*21727*/14595/* BD5D */,/*21728*/14595/* BD5E */, /*21729*/14595/* BD5F */,/*21730*/14595/* BD60 */,/*21731*/14595/* BD61 */,/*21732*/14595/* BD62 */, /*21733*/14595/* BD63 */,/*21734*/14594/* BD64 */,/*21735*/14595/* BD65 */,/*21736*/14595/* BD66 */, /*21737*/14595/* BD67 */,/*21738*/14595/* BD68 */,/*21739*/14595/* BD69 */,/*21740*/14595/* BD6A */, /*21741*/14595/* BD6B */,/*21742*/14595/* BD6C */,/*21743*/14595/* BD6D */,/*21744*/14595/* BD6E */, /*21745*/14595/* BD6F */,/*21746*/14595/* BD70 */,/*21747*/14595/* BD71 */,/*21748*/14595/* BD72 */, /*21749*/14595/* BD73 */,/*21750*/14595/* BD74 */,/*21751*/14595/* BD75 */,/*21752*/14595/* BD76 */, /*21753*/14595/* BD77 */,/*21754*/14595/* BD78 */,/*21755*/14595/* BD79 */,/*21756*/14595/* BD7A */, /*21757*/14595/* BD7B */,/*21758*/14595/* BD7C */,/*21759*/14595/* BD7D */,/*21760*/14595/* BD7E */, /*21761*/14595/* BD7F */,/*21762*/14594/* BD80 */,/*21763*/14595/* BD81 */,/*21764*/14595/* BD82 */, /*21765*/14595/* BD83 */,/*21766*/14595/* BD84 */,/*21767*/14595/* BD85 */,/*21768*/14595/* BD86 */, /*21769*/14595/* BD87 */,/*21770*/14595/* BD88 */,/*21771*/14595/* BD89 */,/*21772*/14595/* BD8A */, /*21773*/14595/* BD8B */,/*21774*/14595/* BD8C */,/*21775*/14595/* BD8D */,/*21776*/14595/* BD8E */, /*21777*/14595/* BD8F */,/*21778*/14595/* BD90 */,/*21779*/14595/* BD91 */,/*21780*/14595/* BD92 */, /*21781*/14595/* BD93 */,/*21782*/14595/* BD94 */,/*21783*/14595/* BD95 */,/*21784*/14595/* BD96 */, /*21785*/14595/* BD97 */,/*21786*/14595/* BD98 */,/*21787*/14595/* BD99 */,/*21788*/14595/* BD9A */, /*21789*/14595/* BD9B */,/*21790*/14594/* BD9C */,/*21791*/14595/* BD9D */,/*21792*/14595/* BD9E */, /*21793*/14595/* BD9F */,/*21794*/14595/* BDA0 */,/*21795*/14595/* BDA1 */,/*21796*/14595/* BDA2 */, /*21797*/14595/* BDA3 */,/*21798*/14595/* BDA4 */,/*21799*/14595/* BDA5 */,/*21800*/14595/* BDA6 */, /*21801*/14595/* BDA7 */,/*21802*/14595/* BDA8 */,/*21803*/14595/* BDA9 */,/*21804*/14595/* BDAA */, /*21805*/14595/* BDAB */,/*21806*/14595/* BDAC */,/*21807*/14595/* BDAD */,/*21808*/14595/* BDAE */, /*21809*/14595/* BDAF */,/*21810*/14595/* BDB0 */,/*21811*/14595/* BDB1 */,/*21812*/14595/* BDB2 */, /*21813*/14595/* BDB3 */,/*21814*/14595/* BDB4 */,/*21815*/14595/* BDB5 */,/*21816*/14595/* BDB6 */, /*21817*/14595/* BDB7 */,/*21818*/14594/* BDB8 */,/*21819*/14595/* BDB9 */,/*21820*/14595/* BDBA */, /*21821*/14595/* BDBB */,/*21822*/14595/* BDBC */,/*21823*/14595/* BDBD */,/*21824*/14595/* BDBE */, /*21825*/14595/* BDBF */,/*21826*/14595/* BDC0 */,/*21827*/14595/* BDC1 */,/*21828*/14595/* BDC2 */, /*21829*/14595/* BDC3 */,/*21830*/14595/* BDC4 */,/*21831*/14595/* BDC5 */,/*21832*/14595/* BDC6 */, /*21833*/14595/* BDC7 */,/*21834*/14595/* BDC8 */,/*21835*/14595/* BDC9 */,/*21836*/14595/* BDCA */, /*21837*/14595/* BDCB */,/*21838*/14595/* BDCC */,/*21839*/14595/* BDCD */,/*21840*/14595/* BDCE */, /*21841*/14595/* BDCF */,/*21842*/14595/* BDD0 */,/*21843*/14595/* BDD1 */,/*21844*/14595/* BDD2 */, /*21845*/14595/* BDD3 */,/*21846*/14594/* BDD4 */,/*21847*/14595/* BDD5 */,/*21848*/14595/* BDD6 */, /*21849*/14595/* BDD7 */,/*21850*/14595/* BDD8 */,/*21851*/14595/* BDD9 */,/*21852*/14595/* BDDA */, /*21853*/14595/* BDDB */,/*21854*/14595/* BDDC */,/*21855*/14595/* BDDD */,/*21856*/14595/* BDDE */, /*21857*/14595/* BDDF */,/*21858*/14595/* BDE0 */,/*21859*/14595/* BDE1 */,/*21860*/14595/* BDE2 */, /*21861*/14595/* BDE3 */,/*21862*/14595/* BDE4 */,/*21863*/14595/* BDE5 */,/*21864*/14595/* BDE6 */, /*21865*/14595/* BDE7 */,/*21866*/14595/* BDE8 */,/*21867*/14595/* BDE9 */,/*21868*/14595/* BDEA */, /*21869*/14595/* BDEB */,/*21870*/14595/* BDEC */,/*21871*/14595/* BDED */,/*21872*/14595/* BDEE */, /*21873*/14595/* BDEF */,/*21874*/14594/* BDF0 */,/*21875*/14595/* BDF1 */,/*21876*/14595/* BDF2 */, /*21877*/14595/* BDF3 */,/*21878*/14595/* BDF4 */,/*21879*/14595/* BDF5 */,/*21880*/14595/* BDF6 */, /*21881*/14595/* BDF7 */,/*21882*/14595/* BDF8 */,/*21883*/14595/* BDF9 */,/*21884*/14595/* BDFA */, /*21885*/14595/* BDFB */,/*21886*/14595/* BDFC */,/*21887*/14595/* BDFD */,/*21888*/14595/* BDFE */, /*21889*/14595/* BDFF */,/*21890*/14595/* BE00 */,/*21891*/14595/* BE01 */,/*21892*/14595/* BE02 */, /*21893*/14595/* BE03 */,/*21894*/14595/* BE04 */,/*21895*/14595/* BE05 */,/*21896*/14595/* BE06 */, /*21897*/14595/* BE07 */,/*21898*/14595/* BE08 */,/*21899*/14595/* BE09 */,/*21900*/14595/* BE0A */, /*21901*/14595/* BE0B */,/*21902*/14594/* BE0C */,/*21903*/14595/* BE0D */,/*21904*/14595/* BE0E */, /*21905*/14595/* BE0F */,/*21906*/14595/* BE10 */,/*21907*/14595/* BE11 */,/*21908*/14595/* BE12 */, /*21909*/14595/* BE13 */,/*21910*/14595/* BE14 */,/*21911*/14595/* BE15 */,/*21912*/14595/* BE16 */, /*21913*/14595/* BE17 */,/*21914*/14595/* BE18 */,/*21915*/14595/* BE19 */,/*21916*/14595/* BE1A */, /*21917*/14595/* BE1B */,/*21918*/14595/* BE1C */,/*21919*/14595/* BE1D */,/*21920*/14595/* BE1E */, /*21921*/14595/* BE1F */,/*21922*/14595/* BE20 */,/*21923*/14595/* BE21 */,/*21924*/14595/* BE22 */, /*21925*/14595/* BE23 */,/*21926*/14595/* BE24 */,/*21927*/14595/* BE25 */,/*21928*/14595/* BE26 */, /*21929*/14595/* BE27 */,/*21930*/14594/* BE28 */,/*21931*/14595/* BE29 */,/*21932*/14595/* BE2A */, /*21933*/14595/* BE2B */,/*21934*/14595/* BE2C */,/*21935*/14595/* BE2D */,/*21936*/14595/* BE2E */, /*21937*/14595/* BE2F */,/*21938*/14595/* BE30 */,/*21939*/14595/* BE31 */,/*21940*/14595/* BE32 */, /*21941*/14595/* BE33 */,/*21942*/14595/* BE34 */,/*21943*/14595/* BE35 */,/*21944*/14595/* BE36 */, /*21945*/14595/* BE37 */,/*21946*/14595/* BE38 */,/*21947*/14595/* BE39 */,/*21948*/14595/* BE3A */, /*21949*/14595/* BE3B */,/*21950*/14595/* BE3C */,/*21951*/14595/* BE3D */,/*21952*/14595/* BE3E */, /*21953*/14595/* BE3F */,/*21954*/14595/* BE40 */,/*21955*/14595/* BE41 */,/*21956*/14595/* BE42 */, /*21957*/14595/* BE43 */,/*21958*/14594/* BE44 */,/*21959*/14595/* BE45 */,/*21960*/14595/* BE46 */, /*21961*/14595/* BE47 */,/*21962*/14595/* BE48 */,/*21963*/14595/* BE49 */,/*21964*/14595/* BE4A */, /*21965*/14595/* BE4B */,/*21966*/14595/* BE4C */,/*21967*/14595/* BE4D */,/*21968*/14595/* BE4E */, /*21969*/14595/* BE4F */,/*21970*/14595/* BE50 */,/*21971*/14595/* BE51 */,/*21972*/14595/* BE52 */, /*21973*/14595/* BE53 */,/*21974*/14595/* BE54 */,/*21975*/14595/* BE55 */,/*21976*/14595/* BE56 */, /*21977*/14595/* BE57 */,/*21978*/14595/* BE58 */,/*21979*/14595/* BE59 */,/*21980*/14595/* BE5A */, /*21981*/14595/* BE5B */,/*21982*/14595/* BE5C */,/*21983*/14595/* BE5D */,/*21984*/14595/* BE5E */, /*21985*/14595/* BE5F */,/*21986*/14594/* BE60 */,/*21987*/14595/* BE61 */,/*21988*/14595/* BE62 */, /*21989*/14595/* BE63 */,/*21990*/14595/* BE64 */,/*21991*/14595/* BE65 */,/*21992*/14595/* BE66 */, /*21993*/14595/* BE67 */,/*21994*/14595/* BE68 */,/*21995*/14595/* BE69 */,/*21996*/14595/* BE6A */, /*21997*/14595/* BE6B */,/*21998*/14595/* BE6C */,/*21999*/14595/* BE6D */,/*22000*/14595/* BE6E */, /*22001*/14595/* BE6F */,/*22002*/14595/* BE70 */,/*22003*/14595/* BE71 */,/*22004*/14595/* BE72 */, /*22005*/14595/* BE73 */,/*22006*/14595/* BE74 */,/*22007*/14595/* BE75 */,/*22008*/14595/* BE76 */, /*22009*/14595/* BE77 */,/*22010*/14595/* BE78 */,/*22011*/14595/* BE79 */,/*22012*/14595/* BE7A */, /*22013*/14595/* BE7B */,/*22014*/14594/* BE7C */,/*22015*/14595/* BE7D */,/*22016*/14595/* BE7E */, /*22017*/14595/* BE7F */,/*22018*/14595/* BE80 */,/*22019*/14595/* BE81 */,/*22020*/14595/* BE82 */, /*22021*/14595/* BE83 */,/*22022*/14595/* BE84 */,/*22023*/14595/* BE85 */,/*22024*/14595/* BE86 */, /*22025*/14595/* BE87 */,/*22026*/14595/* BE88 */,/*22027*/14595/* BE89 */,/*22028*/14595/* BE8A */, /*22029*/14595/* BE8B */,/*22030*/14595/* BE8C */,/*22031*/14595/* BE8D */,/*22032*/14595/* BE8E */, /*22033*/14595/* BE8F */,/*22034*/14595/* BE90 */,/*22035*/14595/* BE91 */,/*22036*/14595/* BE92 */, /*22037*/14595/* BE93 */,/*22038*/14595/* BE94 */,/*22039*/14595/* BE95 */,/*22040*/14595/* BE96 */, /*22041*/14595/* BE97 */,/*22042*/14594/* BE98 */,/*22043*/14595/* BE99 */,/*22044*/14595/* BE9A */, /*22045*/14595/* BE9B */,/*22046*/14595/* BE9C */,/*22047*/14595/* BE9D */,/*22048*/14595/* BE9E */, /*22049*/14595/* BE9F */,/*22050*/14595/* BEA0 */,/*22051*/14595/* BEA1 */,/*22052*/14595/* BEA2 */, /*22053*/14595/* BEA3 */,/*22054*/14595/* BEA4 */,/*22055*/14595/* BEA5 */,/*22056*/14595/* BEA6 */, /*22057*/14595/* BEA7 */,/*22058*/14595/* BEA8 */,/*22059*/14595/* BEA9 */,/*22060*/14595/* BEAA */, /*22061*/14595/* BEAB */,/*22062*/14595/* BEAC */,/*22063*/14595/* BEAD */,/*22064*/14595/* BEAE */, /*22065*/14595/* BEAF */,/*22066*/14595/* BEB0 */,/*22067*/14595/* BEB1 */,/*22068*/14595/* BEB2 */, /*22069*/14595/* BEB3 */,/*22070*/14594/* BEB4 */,/*22071*/14595/* BEB5 */,/*22072*/14595/* BEB6 */, /*22073*/14595/* BEB7 */,/*22074*/14595/* BEB8 */,/*22075*/14595/* BEB9 */,/*22076*/14595/* BEBA */, /*22077*/14595/* BEBB */,/*22078*/14595/* BEBC */,/*22079*/14595/* BEBD */,/*22080*/14595/* BEBE */, /*22081*/14595/* BEBF */,/*22082*/14595/* BEC0 */,/*22083*/14595/* BEC1 */,/*22084*/14595/* BEC2 */, /*22085*/14595/* BEC3 */,/*22086*/14595/* BEC4 */,/*22087*/14595/* BEC5 */,/*22088*/14595/* BEC6 */, /*22089*/14595/* BEC7 */,/*22090*/14595/* BEC8 */,/*22091*/14595/* BEC9 */,/*22092*/14595/* BECA */, /*22093*/14595/* BECB */,/*22094*/14595/* BECC */,/*22095*/14595/* BECD */,/*22096*/14595/* BECE */, /*22097*/14595/* BECF */,/*22098*/14594/* BED0 */,/*22099*/14595/* BED1 */,/*22100*/14595/* BED2 */, /*22101*/14595/* BED3 */,/*22102*/14595/* BED4 */,/*22103*/14595/* BED5 */,/*22104*/14595/* BED6 */, /*22105*/14595/* BED7 */,/*22106*/14595/* BED8 */,/*22107*/14595/* BED9 */,/*22108*/14595/* BEDA */, /*22109*/14595/* BEDB */,/*22110*/14595/* BEDC */,/*22111*/14595/* BEDD */,/*22112*/14595/* BEDE */, /*22113*/14595/* BEDF */,/*22114*/14595/* BEE0 */,/*22115*/14595/* BEE1 */,/*22116*/14595/* BEE2 */, /*22117*/14595/* BEE3 */,/*22118*/14595/* BEE4 */,/*22119*/14595/* BEE5 */,/*22120*/14595/* BEE6 */, /*22121*/14595/* BEE7 */,/*22122*/14595/* BEE8 */,/*22123*/14595/* BEE9 */,/*22124*/14595/* BEEA */, /*22125*/14595/* BEEB */,/*22126*/14594/* BEEC */,/*22127*/14595/* BEED */,/*22128*/14595/* BEEE */, /*22129*/14595/* BEEF */,/*22130*/14595/* BEF0 */,/*22131*/14595/* BEF1 */,/*22132*/14595/* BEF2 */, /*22133*/14595/* BEF3 */,/*22134*/14595/* BEF4 */,/*22135*/14595/* BEF5 */,/*22136*/14595/* BEF6 */, /*22137*/14595/* BEF7 */,/*22138*/14595/* BEF8 */,/*22139*/14595/* BEF9 */,/*22140*/14595/* BEFA */, /*22141*/14595/* BEFB */,/*22142*/14595/* BEFC */,/*22143*/14595/* BEFD */,/*22144*/14595/* BEFE */, /*22145*/14595/* BEFF */,/*22146*/14595/* BF00 */,/*22147*/14595/* BF01 */,/*22148*/14595/* BF02 */, /*22149*/14595/* BF03 */,/*22150*/14595/* BF04 */,/*22151*/14595/* BF05 */,/*22152*/14595/* BF06 */, /*22153*/14595/* BF07 */,/*22154*/14594/* BF08 */,/*22155*/14595/* BF09 */,/*22156*/14595/* BF0A */, /*22157*/14595/* BF0B */,/*22158*/14595/* BF0C */,/*22159*/14595/* BF0D */,/*22160*/14595/* BF0E */, /*22161*/14595/* BF0F */,/*22162*/14595/* BF10 */,/*22163*/14595/* BF11 */,/*22164*/14595/* BF12 */, /*22165*/14595/* BF13 */,/*22166*/14595/* BF14 */,/*22167*/14595/* BF15 */,/*22168*/14595/* BF16 */, /*22169*/14595/* BF17 */,/*22170*/14595/* BF18 */,/*22171*/14595/* BF19 */,/*22172*/14595/* BF1A */, /*22173*/14595/* BF1B */,/*22174*/14595/* BF1C */,/*22175*/14595/* BF1D */,/*22176*/14595/* BF1E */, /*22177*/14595/* BF1F */,/*22178*/14595/* BF20 */,/*22179*/14595/* BF21 */,/*22180*/14595/* BF22 */, /*22181*/14595/* BF23 */,/*22182*/14594/* BF24 */,/*22183*/14595/* BF25 */,/*22184*/14595/* BF26 */, /*22185*/14595/* BF27 */,/*22186*/14595/* BF28 */,/*22187*/14595/* BF29 */,/*22188*/14595/* BF2A */, /*22189*/14595/* BF2B */,/*22190*/14595/* BF2C */,/*22191*/14595/* BF2D */,/*22192*/14595/* BF2E */, /*22193*/14595/* BF2F */,/*22194*/14595/* BF30 */,/*22195*/14595/* BF31 */,/*22196*/14595/* BF32 */, /*22197*/14595/* BF33 */,/*22198*/14595/* BF34 */,/*22199*/14595/* BF35 */,/*22200*/14595/* BF36 */, /*22201*/14595/* BF37 */,/*22202*/14595/* BF38 */,/*22203*/14595/* BF39 */,/*22204*/14595/* BF3A */, /*22205*/14595/* BF3B */,/*22206*/14595/* BF3C */,/*22207*/14595/* BF3D */,/*22208*/14595/* BF3E */, /*22209*/14595/* BF3F */,/*22210*/14594/* BF40 */,/*22211*/14595/* BF41 */,/*22212*/14595/* BF42 */, /*22213*/14595/* BF43 */,/*22214*/14595/* BF44 */,/*22215*/14595/* BF45 */,/*22216*/14595/* BF46 */, /*22217*/14595/* BF47 */,/*22218*/14595/* BF48 */,/*22219*/14595/* BF49 */,/*22220*/14595/* BF4A */, /*22221*/14595/* BF4B */,/*22222*/14595/* BF4C */,/*22223*/14595/* BF4D */,/*22224*/14595/* BF4E */, /*22225*/14595/* BF4F */,/*22226*/14595/* BF50 */,/*22227*/14595/* BF51 */,/*22228*/14595/* BF52 */, /*22229*/14595/* BF53 */,/*22230*/14595/* BF54 */,/*22231*/14595/* BF55 */,/*22232*/14595/* BF56 */, /*22233*/14595/* BF57 */,/*22234*/14595/* BF58 */,/*22235*/14595/* BF59 */,/*22236*/14595/* BF5A */, /*22237*/14595/* BF5B */,/*22238*/14594/* BF5C */,/*22239*/14595/* BF5D */,/*22240*/14595/* BF5E */, /*22241*/14595/* BF5F */,/*22242*/14595/* BF60 */,/*22243*/14595/* BF61 */,/*22244*/14595/* BF62 */, /*22245*/14595/* BF63 */,/*22246*/14595/* BF64 */,/*22247*/14595/* BF65 */,/*22248*/14595/* BF66 */, /*22249*/14595/* BF67 */,/*22250*/14595/* BF68 */,/*22251*/14595/* BF69 */,/*22252*/14595/* BF6A */, /*22253*/14595/* BF6B */,/*22254*/14595/* BF6C */,/*22255*/14595/* BF6D */,/*22256*/14595/* BF6E */, /*22257*/14595/* BF6F */,/*22258*/14595/* BF70 */,/*22259*/14595/* BF71 */,/*22260*/14595/* BF72 */, /*22261*/14595/* BF73 */,/*22262*/14595/* BF74 */,/*22263*/14595/* BF75 */,/*22264*/14595/* BF76 */, /*22265*/14595/* BF77 */,/*22266*/14594/* BF78 */,/*22267*/14595/* BF79 */,/*22268*/14595/* BF7A */, /*22269*/14595/* BF7B */,/*22270*/14595/* BF7C */,/*22271*/14595/* BF7D */,/*22272*/14595/* BF7E */, /*22273*/14595/* BF7F */,/*22274*/14595/* BF80 */,/*22275*/14595/* BF81 */,/*22276*/14595/* BF82 */, /*22277*/14595/* BF83 */,/*22278*/14595/* BF84 */,/*22279*/14595/* BF85 */,/*22280*/14595/* BF86 */, /*22281*/14595/* BF87 */,/*22282*/14595/* BF88 */,/*22283*/14595/* BF89 */,/*22284*/14595/* BF8A */, /*22285*/14595/* BF8B */,/*22286*/14595/* BF8C */,/*22287*/14595/* BF8D */,/*22288*/14595/* BF8E */, /*22289*/14595/* BF8F */,/*22290*/14595/* BF90 */,/*22291*/14595/* BF91 */,/*22292*/14595/* BF92 */, /*22293*/14595/* BF93 */,/*22294*/14594/* BF94 */,/*22295*/14595/* BF95 */,/*22296*/14595/* BF96 */, /*22297*/14595/* BF97 */,/*22298*/14595/* BF98 */,/*22299*/14595/* BF99 */,/*22300*/14595/* BF9A */, /*22301*/14595/* BF9B */,/*22302*/14595/* BF9C */,/*22303*/14595/* BF9D */,/*22304*/14595/* BF9E */, /*22305*/14595/* BF9F */,/*22306*/14595/* BFA0 */,/*22307*/14595/* BFA1 */,/*22308*/14595/* BFA2 */, /*22309*/14595/* BFA3 */,/*22310*/14595/* BFA4 */,/*22311*/14595/* BFA5 */,/*22312*/14595/* BFA6 */, /*22313*/14595/* BFA7 */,/*22314*/14595/* BFA8 */,/*22315*/14595/* BFA9 */,/*22316*/14595/* BFAA */, /*22317*/14595/* BFAB */,/*22318*/14595/* BFAC */,/*22319*/14595/* BFAD */,/*22320*/14595/* BFAE */, /*22321*/14595/* BFAF */,/*22322*/14594/* BFB0 */,/*22323*/14595/* BFB1 */,/*22324*/14595/* BFB2 */, /*22325*/14595/* BFB3 */,/*22326*/14595/* BFB4 */,/*22327*/14595/* BFB5 */,/*22328*/14595/* BFB6 */, /*22329*/14595/* BFB7 */,/*22330*/14595/* BFB8 */,/*22331*/14595/* BFB9 */,/*22332*/14595/* BFBA */, /*22333*/14595/* BFBB */,/*22334*/14595/* BFBC */,/*22335*/14595/* BFBD */,/*22336*/14595/* BFBE */, /*22337*/14595/* BFBF */,/*22338*/14595/* BFC0 */,/*22339*/14595/* BFC1 */,/*22340*/14595/* BFC2 */, /*22341*/14595/* BFC3 */,/*22342*/14595/* BFC4 */,/*22343*/14595/* BFC5 */,/*22344*/14595/* BFC6 */, /*22345*/14595/* BFC7 */,/*22346*/14595/* BFC8 */,/*22347*/14595/* BFC9 */,/*22348*/14595/* BFCA */, /*22349*/14595/* BFCB */,/*22350*/14594/* BFCC */,/*22351*/14595/* BFCD */,/*22352*/14595/* BFCE */, /*22353*/14595/* BFCF */,/*22354*/14595/* BFD0 */,/*22355*/14595/* BFD1 */,/*22356*/14595/* BFD2 */, /*22357*/14595/* BFD3 */,/*22358*/14595/* BFD4 */,/*22359*/14595/* BFD5 */,/*22360*/14595/* BFD6 */, /*22361*/14595/* BFD7 */,/*22362*/14595/* BFD8 */,/*22363*/14595/* BFD9 */,/*22364*/14595/* BFDA */, /*22365*/14595/* BFDB */,/*22366*/14595/* BFDC */,/*22367*/14595/* BFDD */,/*22368*/14595/* BFDE */, /*22369*/14595/* BFDF */,/*22370*/14595/* BFE0 */,/*22371*/14595/* BFE1 */,/*22372*/14595/* BFE2 */, /*22373*/14595/* BFE3 */,/*22374*/14595/* BFE4 */,/*22375*/14595/* BFE5 */,/*22376*/14595/* BFE6 */, /*22377*/14595/* BFE7 */,/*22378*/14594/* BFE8 */,/*22379*/14595/* BFE9 */,/*22380*/14595/* BFEA */, /*22381*/14595/* BFEB */,/*22382*/14595/* BFEC */,/*22383*/14595/* BFED */,/*22384*/14595/* BFEE */, /*22385*/14595/* BFEF */,/*22386*/14595/* BFF0 */,/*22387*/14595/* BFF1 */,/*22388*/14595/* BFF2 */, /*22389*/14595/* BFF3 */,/*22390*/14595/* BFF4 */,/*22391*/14595/* BFF5 */,/*22392*/14595/* BFF6 */, /*22393*/14595/* BFF7 */,/*22394*/14595/* BFF8 */,/*22395*/14595/* BFF9 */,/*22396*/14595/* BFFA */, /*22397*/14595/* BFFB */,/*22398*/14595/* BFFC */,/*22399*/14595/* BFFD */,/*22400*/14595/* BFFE */, /*22401*/14595/* BFFF */,/*22402*/14595/* C000 */,/*22403*/14595/* C001 */,/*22404*/14595/* C002 */, /*22405*/14595/* C003 */,/*22406*/14594/* C004 */,/*22407*/14595/* C005 */,/*22408*/14595/* C006 */, /*22409*/14595/* C007 */,/*22410*/14595/* C008 */,/*22411*/14595/* C009 */,/*22412*/14595/* C00A */, /*22413*/14595/* C00B */,/*22414*/14595/* C00C */,/*22415*/14595/* C00D */,/*22416*/14595/* C00E */, /*22417*/14595/* C00F */,/*22418*/14595/* C010 */,/*22419*/14595/* C011 */,/*22420*/14595/* C012 */, /*22421*/14595/* C013 */,/*22422*/14595/* C014 */,/*22423*/14595/* C015 */,/*22424*/14595/* C016 */, /*22425*/14595/* C017 */,/*22426*/14595/* C018 */,/*22427*/14595/* C019 */,/*22428*/14595/* C01A */, /*22429*/14595/* C01B */,/*22430*/14595/* C01C */,/*22431*/14595/* C01D */,/*22432*/14595/* C01E */, /*22433*/14595/* C01F */,/*22434*/14594/* C020 */,/*22435*/14595/* C021 */,/*22436*/14595/* C022 */, /*22437*/14595/* C023 */,/*22438*/14595/* C024 */,/*22439*/14595/* C025 */,/*22440*/14595/* C026 */, /*22441*/14595/* C027 */,/*22442*/14595/* C028 */,/*22443*/14595/* C029 */,/*22444*/14595/* C02A */, /*22445*/14595/* C02B */,/*22446*/14595/* C02C */,/*22447*/14595/* C02D */,/*22448*/14595/* C02E */, /*22449*/14595/* C02F */,/*22450*/14595/* C030 */,/*22451*/14595/* C031 */,/*22452*/14595/* C032 */, /*22453*/14595/* C033 */,/*22454*/14595/* C034 */,/*22455*/14595/* C035 */,/*22456*/14595/* C036 */, /*22457*/14595/* C037 */,/*22458*/14595/* C038 */,/*22459*/14595/* C039 */,/*22460*/14595/* C03A */, /*22461*/14595/* C03B */,/*22462*/14594/* C03C */,/*22463*/14595/* C03D */,/*22464*/14595/* C03E */, /*22465*/14595/* C03F */,/*22466*/14595/* C040 */,/*22467*/14595/* C041 */,/*22468*/14595/* C042 */, /*22469*/14595/* C043 */,/*22470*/14595/* C044 */,/*22471*/14595/* C045 */,/*22472*/14595/* C046 */, /*22473*/14595/* C047 */,/*22474*/14595/* C048 */,/*22475*/14595/* C049 */,/*22476*/14595/* C04A */, /*22477*/14595/* C04B */,/*22478*/14595/* C04C */,/*22479*/14595/* C04D */,/*22480*/14595/* C04E */, /*22481*/14595/* C04F */,/*22482*/14595/* C050 */,/*22483*/14595/* C051 */,/*22484*/14595/* C052 */, /*22485*/14595/* C053 */,/*22486*/14595/* C054 */,/*22487*/14595/* C055 */,/*22488*/14595/* C056 */, /*22489*/14595/* C057 */,/*22490*/14594/* C058 */,/*22491*/14595/* C059 */,/*22492*/14595/* C05A */, /*22493*/14595/* C05B */,/*22494*/14595/* C05C */,/*22495*/14595/* C05D */,/*22496*/14595/* C05E */, /*22497*/14595/* C05F */,/*22498*/14595/* C060 */,/*22499*/14595/* C061 */,/*22500*/14595/* C062 */, /*22501*/14595/* C063 */,/*22502*/14595/* C064 */,/*22503*/14595/* C065 */,/*22504*/14595/* C066 */, /*22505*/14595/* C067 */,/*22506*/14595/* C068 */,/*22507*/14595/* C069 */,/*22508*/14595/* C06A */, /*22509*/14595/* C06B */,/*22510*/14595/* C06C */,/*22511*/14595/* C06D */,/*22512*/14595/* C06E */, /*22513*/14595/* C06F */,/*22514*/14595/* C070 */,/*22515*/14595/* C071 */,/*22516*/14595/* C072 */, /*22517*/14595/* C073 */,/*22518*/14594/* C074 */,/*22519*/14595/* C075 */,/*22520*/14595/* C076 */, /*22521*/14595/* C077 */,/*22522*/14595/* C078 */,/*22523*/14595/* C079 */,/*22524*/14595/* C07A */, /*22525*/14595/* C07B */,/*22526*/14595/* C07C */,/*22527*/14595/* C07D */,/*22528*/14595/* C07E */, /*22529*/14595/* C07F */,/*22530*/14595/* C080 */,/*22531*/14595/* C081 */,/*22532*/14595/* C082 */, /*22533*/14595/* C083 */,/*22534*/14595/* C084 */,/*22535*/14595/* C085 */,/*22536*/14595/* C086 */, /*22537*/14595/* C087 */,/*22538*/14595/* C088 */,/*22539*/14595/* C089 */,/*22540*/14595/* C08A */, /*22541*/14595/* C08B */,/*22542*/14595/* C08C */,/*22543*/14595/* C08D */,/*22544*/14595/* C08E */, /*22545*/14595/* C08F */,/*22546*/14594/* C090 */,/*22547*/14595/* C091 */,/*22548*/14595/* C092 */, /*22549*/14595/* C093 */,/*22550*/14595/* C094 */,/*22551*/14595/* C095 */,/*22552*/14595/* C096 */, /*22553*/14595/* C097 */,/*22554*/14595/* C098 */,/*22555*/14595/* C099 */,/*22556*/14595/* C09A */, /*22557*/14595/* C09B */,/*22558*/14595/* C09C */,/*22559*/14595/* C09D */,/*22560*/14595/* C09E */, /*22561*/14595/* C09F */,/*22562*/14595/* C0A0 */,/*22563*/14595/* C0A1 */,/*22564*/14595/* C0A2 */, /*22565*/14595/* C0A3 */,/*22566*/14595/* C0A4 */,/*22567*/14595/* C0A5 */,/*22568*/14595/* C0A6 */, /*22569*/14595/* C0A7 */,/*22570*/14595/* C0A8 */,/*22571*/14595/* C0A9 */,/*22572*/14595/* C0AA */, /*22573*/14595/* C0AB */,/*22574*/14594/* C0AC */,/*22575*/14595/* C0AD */,/*22576*/14595/* C0AE */, /*22577*/14595/* C0AF */,/*22578*/14595/* C0B0 */,/*22579*/14595/* C0B1 */,/*22580*/14595/* C0B2 */, /*22581*/14595/* C0B3 */,/*22582*/14595/* C0B4 */,/*22583*/14595/* C0B5 */,/*22584*/14595/* C0B6 */, /*22585*/14595/* C0B7 */,/*22586*/14595/* C0B8 */,/*22587*/14595/* C0B9 */,/*22588*/14595/* C0BA */, /*22589*/14595/* C0BB */,/*22590*/14595/* C0BC */,/*22591*/14595/* C0BD */,/*22592*/14595/* C0BE */, /*22593*/14595/* C0BF */,/*22594*/14595/* C0C0 */,/*22595*/14595/* C0C1 */,/*22596*/14595/* C0C2 */, /*22597*/14595/* C0C3 */,/*22598*/14595/* C0C4 */,/*22599*/14595/* C0C5 */,/*22600*/14595/* C0C6 */, /*22601*/14595/* C0C7 */,/*22602*/14594/* C0C8 */,/*22603*/14595/* C0C9 */,/*22604*/14595/* C0CA */, /*22605*/14595/* C0CB */,/*22606*/14595/* C0CC */,/*22607*/14595/* C0CD */,/*22608*/14595/* C0CE */, /*22609*/14595/* C0CF */,/*22610*/14595/* C0D0 */,/*22611*/14595/* C0D1 */,/*22612*/14595/* C0D2 */, /*22613*/14595/* C0D3 */,/*22614*/14595/* C0D4 */,/*22615*/14595/* C0D5 */,/*22616*/14595/* C0D6 */, /*22617*/14595/* C0D7 */,/*22618*/14595/* C0D8 */,/*22619*/14595/* C0D9 */,/*22620*/14595/* C0DA */, /*22621*/14595/* C0DB */,/*22622*/14595/* C0DC */,/*22623*/14595/* C0DD */,/*22624*/14595/* C0DE */, /*22625*/14595/* C0DF */,/*22626*/14595/* C0E0 */,/*22627*/14595/* C0E1 */,/*22628*/14595/* C0E2 */, /*22629*/14595/* C0E3 */,/*22630*/14594/* C0E4 */,/*22631*/14595/* C0E5 */,/*22632*/14595/* C0E6 */, /*22633*/14595/* C0E7 */,/*22634*/14595/* C0E8 */,/*22635*/14595/* C0E9 */,/*22636*/14595/* C0EA */, /*22637*/14595/* C0EB */,/*22638*/14595/* C0EC */,/*22639*/14595/* C0ED */,/*22640*/14595/* C0EE */, /*22641*/14595/* C0EF */,/*22642*/14595/* C0F0 */,/*22643*/14595/* C0F1 */,/*22644*/14595/* C0F2 */, /*22645*/14595/* C0F3 */,/*22646*/14595/* C0F4 */,/*22647*/14595/* C0F5 */,/*22648*/14595/* C0F6 */, /*22649*/14595/* C0F7 */,/*22650*/14595/* C0F8 */,/*22651*/14595/* C0F9 */,/*22652*/14595/* C0FA */, /*22653*/14595/* C0FB */,/*22654*/14595/* C0FC */,/*22655*/14595/* C0FD */,/*22656*/14595/* C0FE */, /*22657*/14595/* C0FF */,/*22658*/14594/* C100 */,/*22659*/14595/* C101 */,/*22660*/14595/* C102 */, /*22661*/14595/* C103 */,/*22662*/14595/* C104 */,/*22663*/14595/* C105 */,/*22664*/14595/* C106 */, /*22665*/14595/* C107 */,/*22666*/14595/* C108 */,/*22667*/14595/* C109 */,/*22668*/14595/* C10A */, /*22669*/14595/* C10B */,/*22670*/14595/* C10C */,/*22671*/14595/* C10D */,/*22672*/14595/* C10E */, /*22673*/14595/* C10F */,/*22674*/14595/* C110 */,/*22675*/14595/* C111 */,/*22676*/14595/* C112 */, /*22677*/14595/* C113 */,/*22678*/14595/* C114 */,/*22679*/14595/* C115 */,/*22680*/14595/* C116 */, /*22681*/14595/* C117 */,/*22682*/14595/* C118 */,/*22683*/14595/* C119 */,/*22684*/14595/* C11A */, /*22685*/14595/* C11B */,/*22686*/14594/* C11C */,/*22687*/14595/* C11D */,/*22688*/14595/* C11E */, /*22689*/14595/* C11F */,/*22690*/14595/* C120 */,/*22691*/14595/* C121 */,/*22692*/14595/* C122 */, /*22693*/14595/* C123 */,/*22694*/14595/* C124 */,/*22695*/14595/* C125 */,/*22696*/14595/* C126 */, /*22697*/14595/* C127 */,/*22698*/14595/* C128 */,/*22699*/14595/* C129 */,/*22700*/14595/* C12A */, /*22701*/14595/* C12B */,/*22702*/14595/* C12C */,/*22703*/14595/* C12D */,/*22704*/14595/* C12E */, /*22705*/14595/* C12F */,/*22706*/14595/* C130 */,/*22707*/14595/* C131 */,/*22708*/14595/* C132 */, /*22709*/14595/* C133 */,/*22710*/14595/* C134 */,/*22711*/14595/* C135 */,/*22712*/14595/* C136 */, /*22713*/14595/* C137 */,/*22714*/14594/* C138 */,/*22715*/14595/* C139 */,/*22716*/14595/* C13A */, /*22717*/14595/* C13B */,/*22718*/14595/* C13C */,/*22719*/14595/* C13D */,/*22720*/14595/* C13E */, /*22721*/14595/* C13F */,/*22722*/14595/* C140 */,/*22723*/14595/* C141 */,/*22724*/14595/* C142 */, /*22725*/14595/* C143 */,/*22726*/14595/* C144 */,/*22727*/14595/* C145 */,/*22728*/14595/* C146 */, /*22729*/14595/* C147 */,/*22730*/14595/* C148 */,/*22731*/14595/* C149 */,/*22732*/14595/* C14A */, /*22733*/14595/* C14B */,/*22734*/14595/* C14C */,/*22735*/14595/* C14D */,/*22736*/14595/* C14E */, /*22737*/14595/* C14F */,/*22738*/14595/* C150 */,/*22739*/14595/* C151 */,/*22740*/14595/* C152 */, /*22741*/14595/* C153 */,/*22742*/14594/* C154 */,/*22743*/14595/* C155 */,/*22744*/14595/* C156 */, /*22745*/14595/* C157 */,/*22746*/14595/* C158 */,/*22747*/14595/* C159 */,/*22748*/14595/* C15A */, /*22749*/14595/* C15B */,/*22750*/14595/* C15C */,/*22751*/14595/* C15D */,/*22752*/14595/* C15E */, /*22753*/14595/* C15F */,/*22754*/14595/* C160 */,/*22755*/14595/* C161 */,/*22756*/14595/* C162 */, /*22757*/14595/* C163 */,/*22758*/14595/* C164 */,/*22759*/14595/* C165 */,/*22760*/14595/* C166 */, /*22761*/14595/* C167 */,/*22762*/14595/* C168 */,/*22763*/14595/* C169 */,/*22764*/14595/* C16A */, /*22765*/14595/* C16B */,/*22766*/14595/* C16C */,/*22767*/14595/* C16D */,/*22768*/14595/* C16E */, /*22769*/14595/* C16F */,/*22770*/14594/* C170 */,/*22771*/14595/* C171 */,/*22772*/14595/* C172 */, /*22773*/14595/* C173 */,/*22774*/14595/* C174 */,/*22775*/14595/* C175 */,/*22776*/14595/* C176 */, /*22777*/14595/* C177 */,/*22778*/14595/* C178 */,/*22779*/14595/* C179 */,/*22780*/14595/* C17A */, /*22781*/14595/* C17B */,/*22782*/14595/* C17C */,/*22783*/14595/* C17D */,/*22784*/14595/* C17E */, /*22785*/14595/* C17F */,/*22786*/14595/* C180 */,/*22787*/14595/* C181 */,/*22788*/14595/* C182 */, /*22789*/14595/* C183 */,/*22790*/14595/* C184 */,/*22791*/14595/* C185 */,/*22792*/14595/* C186 */, /*22793*/14595/* C187 */,/*22794*/14595/* C188 */,/*22795*/14595/* C189 */,/*22796*/14595/* C18A */, /*22797*/14595/* C18B */,/*22798*/14594/* C18C */,/*22799*/14595/* C18D */,/*22800*/14595/* C18E */, /*22801*/14595/* C18F */,/*22802*/14595/* C190 */,/*22803*/14595/* C191 */,/*22804*/14595/* C192 */, /*22805*/14595/* C193 */,/*22806*/14595/* C194 */,/*22807*/14595/* C195 */,/*22808*/14595/* C196 */, /*22809*/14595/* C197 */,/*22810*/14595/* C198 */,/*22811*/14595/* C199 */,/*22812*/14595/* C19A */, /*22813*/14595/* C19B */,/*22814*/14595/* C19C */,/*22815*/14595/* C19D */,/*22816*/14595/* C19E */, /*22817*/14595/* C19F */,/*22818*/14595/* C1A0 */,/*22819*/14595/* C1A1 */,/*22820*/14595/* C1A2 */, /*22821*/14595/* C1A3 */,/*22822*/14595/* C1A4 */,/*22823*/14595/* C1A5 */,/*22824*/14595/* C1A6 */, /*22825*/14595/* C1A7 */,/*22826*/14594/* C1A8 */,/*22827*/14595/* C1A9 */,/*22828*/14595/* C1AA */, /*22829*/14595/* C1AB */,/*22830*/14595/* C1AC */,/*22831*/14595/* C1AD */,/*22832*/14595/* C1AE */, /*22833*/14595/* C1AF */,/*22834*/14595/* C1B0 */,/*22835*/14595/* C1B1 */,/*22836*/14595/* C1B2 */, /*22837*/14595/* C1B3 */,/*22838*/14595/* C1B4 */,/*22839*/14595/* C1B5 */,/*22840*/14595/* C1B6 */, /*22841*/14595/* C1B7 */,/*22842*/14595/* C1B8 */,/*22843*/14595/* C1B9 */,/*22844*/14595/* C1BA */, /*22845*/14595/* C1BB */,/*22846*/14595/* C1BC */,/*22847*/14595/* C1BD */,/*22848*/14595/* C1BE */, /*22849*/14595/* C1BF */,/*22850*/14595/* C1C0 */,/*22851*/14595/* C1C1 */,/*22852*/14595/* C1C2 */, /*22853*/14595/* C1C3 */,/*22854*/14594/* C1C4 */,/*22855*/14595/* C1C5 */,/*22856*/14595/* C1C6 */, /*22857*/14595/* C1C7 */,/*22858*/14595/* C1C8 */,/*22859*/14595/* C1C9 */,/*22860*/14595/* C1CA */, /*22861*/14595/* C1CB */,/*22862*/14595/* C1CC */,/*22863*/14595/* C1CD */,/*22864*/14595/* C1CE */, /*22865*/14595/* C1CF */,/*22866*/14595/* C1D0 */,/*22867*/14595/* C1D1 */,/*22868*/14595/* C1D2 */, /*22869*/14595/* C1D3 */,/*22870*/14595/* C1D4 */,/*22871*/14595/* C1D5 */,/*22872*/14595/* C1D6 */, /*22873*/14595/* C1D7 */,/*22874*/14595/* C1D8 */,/*22875*/14595/* C1D9 */,/*22876*/14595/* C1DA */, /*22877*/14595/* C1DB */,/*22878*/14595/* C1DC */,/*22879*/14595/* C1DD */,/*22880*/14595/* C1DE */, /*22881*/14595/* C1DF */,/*22882*/14594/* C1E0 */,/*22883*/14595/* C1E1 */,/*22884*/14595/* C1E2 */, /*22885*/14595/* C1E3 */,/*22886*/14595/* C1E4 */,/*22887*/14595/* C1E5 */,/*22888*/14595/* C1E6 */, /*22889*/14595/* C1E7 */,/*22890*/14595/* C1E8 */,/*22891*/14595/* C1E9 */,/*22892*/14595/* C1EA */, /*22893*/14595/* C1EB */,/*22894*/14595/* C1EC */,/*22895*/14595/* C1ED */,/*22896*/14595/* C1EE */, /*22897*/14595/* C1EF */,/*22898*/14595/* C1F0 */,/*22899*/14595/* C1F1 */,/*22900*/14595/* C1F2 */, /*22901*/14595/* C1F3 */,/*22902*/14595/* C1F4 */,/*22903*/14595/* C1F5 */,/*22904*/14595/* C1F6 */, /*22905*/14595/* C1F7 */,/*22906*/14595/* C1F8 */,/*22907*/14595/* C1F9 */,/*22908*/14595/* C1FA */, /*22909*/14595/* C1FB */,/*22910*/14594/* C1FC */,/*22911*/14595/* C1FD */,/*22912*/14595/* C1FE */, /*22913*/14595/* C1FF */,/*22914*/14595/* C200 */,/*22915*/14595/* C201 */,/*22916*/14595/* C202 */, /*22917*/14595/* C203 */,/*22918*/14595/* C204 */,/*22919*/14595/* C205 */,/*22920*/14595/* C206 */, /*22921*/14595/* C207 */,/*22922*/14595/* C208 */,/*22923*/14595/* C209 */,/*22924*/14595/* C20A */, /*22925*/14595/* C20B */,/*22926*/14595/* C20C */,/*22927*/14595/* C20D */,/*22928*/14595/* C20E */, /*22929*/14595/* C20F */,/*22930*/14595/* C210 */,/*22931*/14595/* C211 */,/*22932*/14595/* C212 */, /*22933*/14595/* C213 */,/*22934*/14595/* C214 */,/*22935*/14595/* C215 */,/*22936*/14595/* C216 */, /*22937*/14595/* C217 */,/*22938*/14594/* C218 */,/*22939*/14595/* C219 */,/*22940*/14595/* C21A */, /*22941*/14595/* C21B */,/*22942*/14595/* C21C */,/*22943*/14595/* C21D */,/*22944*/14595/* C21E */, /*22945*/14595/* C21F */,/*22946*/14595/* C220 */,/*22947*/14595/* C221 */,/*22948*/14595/* C222 */, /*22949*/14595/* C223 */,/*22950*/14595/* C224 */,/*22951*/14595/* C225 */,/*22952*/14595/* C226 */, /*22953*/14595/* C227 */,/*22954*/14595/* C228 */,/*22955*/14595/* C229 */,/*22956*/14595/* C22A */, /*22957*/14595/* C22B */,/*22958*/14595/* C22C */,/*22959*/14595/* C22D */,/*22960*/14595/* C22E */, /*22961*/14595/* C22F */,/*22962*/14595/* C230 */,/*22963*/14595/* C231 */,/*22964*/14595/* C232 */, /*22965*/14595/* C233 */,/*22966*/14594/* C234 */,/*22967*/14595/* C235 */,/*22968*/14595/* C236 */, /*22969*/14595/* C237 */,/*22970*/14595/* C238 */,/*22971*/14595/* C239 */,/*22972*/14595/* C23A */, /*22973*/14595/* C23B */,/*22974*/14595/* C23C */,/*22975*/14595/* C23D */,/*22976*/14595/* C23E */, /*22977*/14595/* C23F */,/*22978*/14595/* C240 */,/*22979*/14595/* C241 */,/*22980*/14595/* C242 */, /*22981*/14595/* C243 */,/*22982*/14595/* C244 */,/*22983*/14595/* C245 */,/*22984*/14595/* C246 */, /*22985*/14595/* C247 */,/*22986*/14595/* C248 */,/*22987*/14595/* C249 */,/*22988*/14595/* C24A */, /*22989*/14595/* C24B */,/*22990*/14595/* C24C */,/*22991*/14595/* C24D */,/*22992*/14595/* C24E */, /*22993*/14595/* C24F */,/*22994*/14594/* C250 */,/*22995*/14595/* C251 */,/*22996*/14595/* C252 */, /*22997*/14595/* C253 */,/*22998*/14595/* C254 */,/*22999*/14595/* C255 */,/*23000*/14595/* C256 */, /*23001*/14595/* C257 */,/*23002*/14595/* C258 */,/*23003*/14595/* C259 */,/*23004*/14595/* C25A */, /*23005*/14595/* C25B */,/*23006*/14595/* C25C */,/*23007*/14595/* C25D */,/*23008*/14595/* C25E */, /*23009*/14595/* C25F */,/*23010*/14595/* C260 */,/*23011*/14595/* C261 */,/*23012*/14595/* C262 */, /*23013*/14595/* C263 */,/*23014*/14595/* C264 */,/*23015*/14595/* C265 */,/*23016*/14595/* C266 */, /*23017*/14595/* C267 */,/*23018*/14595/* C268 */,/*23019*/14595/* C269 */,/*23020*/14595/* C26A */, /*23021*/14595/* C26B */,/*23022*/14594/* C26C */,/*23023*/14595/* C26D */,/*23024*/14595/* C26E */, /*23025*/14595/* C26F */,/*23026*/14595/* C270 */,/*23027*/14595/* C271 */,/*23028*/14595/* C272 */, /*23029*/14595/* C273 */,/*23030*/14595/* C274 */,/*23031*/14595/* C275 */,/*23032*/14595/* C276 */, /*23033*/14595/* C277 */,/*23034*/14595/* C278 */,/*23035*/14595/* C279 */,/*23036*/14595/* C27A */, /*23037*/14595/* C27B */,/*23038*/14595/* C27C */,/*23039*/14595/* C27D */,/*23040*/14595/* C27E */, /*23041*/14595/* C27F */,/*23042*/14595/* C280 */,/*23043*/14595/* C281 */,/*23044*/14595/* C282 */, /*23045*/14595/* C283 */,/*23046*/14595/* C284 */,/*23047*/14595/* C285 */,/*23048*/14595/* C286 */, /*23049*/14595/* C287 */,/*23050*/14594/* C288 */,/*23051*/14595/* C289 */,/*23052*/14595/* C28A */, /*23053*/14595/* C28B */,/*23054*/14595/* C28C */,/*23055*/14595/* C28D */,/*23056*/14595/* C28E */, /*23057*/14595/* C28F */,/*23058*/14595/* C290 */,/*23059*/14595/* C291 */,/*23060*/14595/* C292 */, /*23061*/14595/* C293 */,/*23062*/14595/* C294 */,/*23063*/14595/* C295 */,/*23064*/14595/* C296 */, /*23065*/14595/* C297 */,/*23066*/14595/* C298 */,/*23067*/14595/* C299 */,/*23068*/14595/* C29A */, /*23069*/14595/* C29B */,/*23070*/14595/* C29C */,/*23071*/14595/* C29D */,/*23072*/14595/* C29E */, /*23073*/14595/* C29F */,/*23074*/14595/* C2A0 */,/*23075*/14595/* C2A1 */,/*23076*/14595/* C2A2 */, /*23077*/14595/* C2A3 */,/*23078*/14594/* C2A4 */,/*23079*/14595/* C2A5 */,/*23080*/14595/* C2A6 */, /*23081*/14595/* C2A7 */,/*23082*/14595/* C2A8 */,/*23083*/14595/* C2A9 */,/*23084*/14595/* C2AA */, /*23085*/14595/* C2AB */,/*23086*/14595/* C2AC */,/*23087*/14595/* C2AD */,/*23088*/14595/* C2AE */, /*23089*/14595/* C2AF */,/*23090*/14595/* C2B0 */,/*23091*/14595/* C2B1 */,/*23092*/14595/* C2B2 */, /*23093*/14595/* C2B3 */,/*23094*/14595/* C2B4 */,/*23095*/14595/* C2B5 */,/*23096*/14595/* C2B6 */, /*23097*/14595/* C2B7 */,/*23098*/14595/* C2B8 */,/*23099*/14595/* C2B9 */,/*23100*/14595/* C2BA */, /*23101*/14595/* C2BB */,/*23102*/14595/* C2BC */,/*23103*/14595/* C2BD */,/*23104*/14595/* C2BE */, /*23105*/14595/* C2BF */,/*23106*/14594/* C2C0 */,/*23107*/14595/* C2C1 */,/*23108*/14595/* C2C2 */, /*23109*/14595/* C2C3 */,/*23110*/14595/* C2C4 */,/*23111*/14595/* C2C5 */,/*23112*/14595/* C2C6 */, /*23113*/14595/* C2C7 */,/*23114*/14595/* C2C8 */,/*23115*/14595/* C2C9 */,/*23116*/14595/* C2CA */, /*23117*/14595/* C2CB */,/*23118*/14595/* C2CC */,/*23119*/14595/* C2CD */,/*23120*/14595/* C2CE */, /*23121*/14595/* C2CF */,/*23122*/14595/* C2D0 */,/*23123*/14595/* C2D1 */,/*23124*/14595/* C2D2 */, /*23125*/14595/* C2D3 */,/*23126*/14595/* C2D4 */,/*23127*/14595/* C2D5 */,/*23128*/14595/* C2D6 */, /*23129*/14595/* C2D7 */,/*23130*/14595/* C2D8 */,/*23131*/14595/* C2D9 */,/*23132*/14595/* C2DA */, /*23133*/14595/* C2DB */,/*23134*/14594/* C2DC */,/*23135*/14595/* C2DD */,/*23136*/14595/* C2DE */, /*23137*/14595/* C2DF */,/*23138*/14595/* C2E0 */,/*23139*/14595/* C2E1 */,/*23140*/14595/* C2E2 */, /*23141*/14595/* C2E3 */,/*23142*/14595/* C2E4 */,/*23143*/14595/* C2E5 */,/*23144*/14595/* C2E6 */, /*23145*/14595/* C2E7 */,/*23146*/14595/* C2E8 */,/*23147*/14595/* C2E9 */,/*23148*/14595/* C2EA */, /*23149*/14595/* C2EB */,/*23150*/14595/* C2EC */,/*23151*/14595/* C2ED */,/*23152*/14595/* C2EE */, /*23153*/14595/* C2EF */,/*23154*/14595/* C2F0 */,/*23155*/14595/* C2F1 */,/*23156*/14595/* C2F2 */, /*23157*/14595/* C2F3 */,/*23158*/14595/* C2F4 */,/*23159*/14595/* C2F5 */,/*23160*/14595/* C2F6 */, /*23161*/14595/* C2F7 */,/*23162*/14594/* C2F8 */,/*23163*/14595/* C2F9 */,/*23164*/14595/* C2FA */, /*23165*/14595/* C2FB */,/*23166*/14595/* C2FC */,/*23167*/14595/* C2FD */,/*23168*/14595/* C2FE */, /*23169*/14595/* C2FF */,/*23170*/14595/* C300 */,/*23171*/14595/* C301 */,/*23172*/14595/* C302 */, /*23173*/14595/* C303 */,/*23174*/14595/* C304 */,/*23175*/14595/* C305 */,/*23176*/14595/* C306 */, /*23177*/14595/* C307 */,/*23178*/14595/* C308 */,/*23179*/14595/* C309 */,/*23180*/14595/* C30A */, /*23181*/14595/* C30B */,/*23182*/14595/* C30C */,/*23183*/14595/* C30D */,/*23184*/14595/* C30E */, /*23185*/14595/* C30F */,/*23186*/14595/* C310 */,/*23187*/14595/* C311 */,/*23188*/14595/* C312 */, /*23189*/14595/* C313 */,/*23190*/14594/* C314 */,/*23191*/14595/* C315 */,/*23192*/14595/* C316 */, /*23193*/14595/* C317 */,/*23194*/14595/* C318 */,/*23195*/14595/* C319 */,/*23196*/14595/* C31A */, /*23197*/14595/* C31B */,/*23198*/14595/* C31C */,/*23199*/14595/* C31D */,/*23200*/14595/* C31E */, /*23201*/14595/* C31F */,/*23202*/14595/* C320 */,/*23203*/14595/* C321 */,/*23204*/14595/* C322 */, /*23205*/14595/* C323 */,/*23206*/14595/* C324 */,/*23207*/14595/* C325 */,/*23208*/14595/* C326 */, /*23209*/14595/* C327 */,/*23210*/14595/* C328 */,/*23211*/14595/* C329 */,/*23212*/14595/* C32A */, /*23213*/14595/* C32B */,/*23214*/14595/* C32C */,/*23215*/14595/* C32D */,/*23216*/14595/* C32E */, /*23217*/14595/* C32F */,/*23218*/14594/* C330 */,/*23219*/14595/* C331 */,/*23220*/14595/* C332 */, /*23221*/14595/* C333 */,/*23222*/14595/* C334 */,/*23223*/14595/* C335 */,/*23224*/14595/* C336 */, /*23225*/14595/* C337 */,/*23226*/14595/* C338 */,/*23227*/14595/* C339 */,/*23228*/14595/* C33A */, /*23229*/14595/* C33B */,/*23230*/14595/* C33C */,/*23231*/14595/* C33D */,/*23232*/14595/* C33E */, /*23233*/14595/* C33F */,/*23234*/14595/* C340 */,/*23235*/14595/* C341 */,/*23236*/14595/* C342 */, /*23237*/14595/* C343 */,/*23238*/14595/* C344 */,/*23239*/14595/* C345 */,/*23240*/14595/* C346 */, /*23241*/14595/* C347 */,/*23242*/14595/* C348 */,/*23243*/14595/* C349 */,/*23244*/14595/* C34A */, /*23245*/14595/* C34B */,/*23246*/14594/* C34C */,/*23247*/14595/* C34D */,/*23248*/14595/* C34E */, /*23249*/14595/* C34F */,/*23250*/14595/* C350 */,/*23251*/14595/* C351 */,/*23252*/14595/* C352 */, /*23253*/14595/* C353 */,/*23254*/14595/* C354 */,/*23255*/14595/* C355 */,/*23256*/14595/* C356 */, /*23257*/14595/* C357 */,/*23258*/14595/* C358 */,/*23259*/14595/* C359 */,/*23260*/14595/* C35A */, /*23261*/14595/* C35B */,/*23262*/14595/* C35C */,/*23263*/14595/* C35D */,/*23264*/14595/* C35E */, /*23265*/14595/* C35F */,/*23266*/14595/* C360 */,/*23267*/14595/* C361 */,/*23268*/14595/* C362 */, /*23269*/14595/* C363 */,/*23270*/14595/* C364 */,/*23271*/14595/* C365 */,/*23272*/14595/* C366 */, /*23273*/14595/* C367 */,/*23274*/14594/* C368 */,/*23275*/14595/* C369 */,/*23276*/14595/* C36A */, /*23277*/14595/* C36B */,/*23278*/14595/* C36C */,/*23279*/14595/* C36D */,/*23280*/14595/* C36E */, /*23281*/14595/* C36F */,/*23282*/14595/* C370 */,/*23283*/14595/* C371 */,/*23284*/14595/* C372 */, /*23285*/14595/* C373 */,/*23286*/14595/* C374 */,/*23287*/14595/* C375 */,/*23288*/14595/* C376 */, /*23289*/14595/* C377 */,/*23290*/14595/* C378 */,/*23291*/14595/* C379 */,/*23292*/14595/* C37A */, /*23293*/14595/* C37B */,/*23294*/14595/* C37C */,/*23295*/14595/* C37D */,/*23296*/14595/* C37E */, /*23297*/14595/* C37F */,/*23298*/14595/* C380 */,/*23299*/14595/* C381 */,/*23300*/14595/* C382 */, /*23301*/14595/* C383 */,/*23302*/14594/* C384 */,/*23303*/14595/* C385 */,/*23304*/14595/* C386 */, /*23305*/14595/* C387 */,/*23306*/14595/* C388 */,/*23307*/14595/* C389 */,/*23308*/14595/* C38A */, /*23309*/14595/* C38B */,/*23310*/14595/* C38C */,/*23311*/14595/* C38D */,/*23312*/14595/* C38E */, /*23313*/14595/* C38F */,/*23314*/14595/* C390 */,/*23315*/14595/* C391 */,/*23316*/14595/* C392 */, /*23317*/14595/* C393 */,/*23318*/14595/* C394 */,/*23319*/14595/* C395 */,/*23320*/14595/* C396 */, /*23321*/14595/* C397 */,/*23322*/14595/* C398 */,/*23323*/14595/* C399 */,/*23324*/14595/* C39A */, /*23325*/14595/* C39B */,/*23326*/14595/* C39C */,/*23327*/14595/* C39D */,/*23328*/14595/* C39E */, /*23329*/14595/* C39F */,/*23330*/14594/* C3A0 */,/*23331*/14595/* C3A1 */,/*23332*/14595/* C3A2 */, /*23333*/14595/* C3A3 */,/*23334*/14595/* C3A4 */,/*23335*/14595/* C3A5 */,/*23336*/14595/* C3A6 */, /*23337*/14595/* C3A7 */,/*23338*/14595/* C3A8 */,/*23339*/14595/* C3A9 */,/*23340*/14595/* C3AA */, /*23341*/14595/* C3AB */,/*23342*/14595/* C3AC */,/*23343*/14595/* C3AD */,/*23344*/14595/* C3AE */, /*23345*/14595/* C3AF */,/*23346*/14595/* C3B0 */,/*23347*/14595/* C3B1 */,/*23348*/14595/* C3B2 */, /*23349*/14595/* C3B3 */,/*23350*/14595/* C3B4 */,/*23351*/14595/* C3B5 */,/*23352*/14595/* C3B6 */, /*23353*/14595/* C3B7 */,/*23354*/14595/* C3B8 */,/*23355*/14595/* C3B9 */,/*23356*/14595/* C3BA */, /*23357*/14595/* C3BB */,/*23358*/14594/* C3BC */,/*23359*/14595/* C3BD */,/*23360*/14595/* C3BE */, /*23361*/14595/* C3BF */,/*23362*/14595/* C3C0 */,/*23363*/14595/* C3C1 */,/*23364*/14595/* C3C2 */, /*23365*/14595/* C3C3 */,/*23366*/14595/* C3C4 */,/*23367*/14595/* C3C5 */,/*23368*/14595/* C3C6 */, /*23369*/14595/* C3C7 */,/*23370*/14595/* C3C8 */,/*23371*/14595/* C3C9 */,/*23372*/14595/* C3CA */, /*23373*/14595/* C3CB */,/*23374*/14595/* C3CC */,/*23375*/14595/* C3CD */,/*23376*/14595/* C3CE */, /*23377*/14595/* C3CF */,/*23378*/14595/* C3D0 */,/*23379*/14595/* C3D1 */,/*23380*/14595/* C3D2 */, /*23381*/14595/* C3D3 */,/*23382*/14595/* C3D4 */,/*23383*/14595/* C3D5 */,/*23384*/14595/* C3D6 */, /*23385*/14595/* C3D7 */,/*23386*/14594/* C3D8 */,/*23387*/14595/* C3D9 */,/*23388*/14595/* C3DA */, /*23389*/14595/* C3DB */,/*23390*/14595/* C3DC */,/*23391*/14595/* C3DD */,/*23392*/14595/* C3DE */, /*23393*/14595/* C3DF */,/*23394*/14595/* C3E0 */,/*23395*/14595/* C3E1 */,/*23396*/14595/* C3E2 */, /*23397*/14595/* C3E3 */,/*23398*/14595/* C3E4 */,/*23399*/14595/* C3E5 */,/*23400*/14595/* C3E6 */, /*23401*/14595/* C3E7 */,/*23402*/14595/* C3E8 */,/*23403*/14595/* C3E9 */,/*23404*/14595/* C3EA */, /*23405*/14595/* C3EB */,/*23406*/14595/* C3EC */,/*23407*/14595/* C3ED */,/*23408*/14595/* C3EE */, /*23409*/14595/* C3EF */,/*23410*/14595/* C3F0 */,/*23411*/14595/* C3F1 */,/*23412*/14595/* C3F2 */, /*23413*/14595/* C3F3 */,/*23414*/14594/* C3F4 */,/*23415*/14595/* C3F5 */,/*23416*/14595/* C3F6 */, /*23417*/14595/* C3F7 */,/*23418*/14595/* C3F8 */,/*23419*/14595/* C3F9 */,/*23420*/14595/* C3FA */, /*23421*/14595/* C3FB */,/*23422*/14595/* C3FC */,/*23423*/14595/* C3FD */,/*23424*/14595/* C3FE */, /*23425*/14595/* C3FF */,/*23426*/14595/* C400 */,/*23427*/14595/* C401 */,/*23428*/14595/* C402 */, /*23429*/14595/* C403 */,/*23430*/14595/* C404 */,/*23431*/14595/* C405 */,/*23432*/14595/* C406 */, /*23433*/14595/* C407 */,/*23434*/14595/* C408 */,/*23435*/14595/* C409 */,/*23436*/14595/* C40A */, /*23437*/14595/* C40B */,/*23438*/14595/* C40C */,/*23439*/14595/* C40D */,/*23440*/14595/* C40E */, /*23441*/14595/* C40F */,/*23442*/14594/* C410 */,/*23443*/14595/* C411 */,/*23444*/14595/* C412 */, /*23445*/14595/* C413 */,/*23446*/14595/* C414 */,/*23447*/14595/* C415 */,/*23448*/14595/* C416 */, /*23449*/14595/* C417 */,/*23450*/14595/* C418 */,/*23451*/14595/* C419 */,/*23452*/14595/* C41A */, /*23453*/14595/* C41B */,/*23454*/14595/* C41C */,/*23455*/14595/* C41D */,/*23456*/14595/* C41E */, /*23457*/14595/* C41F */,/*23458*/14595/* C420 */,/*23459*/14595/* C421 */,/*23460*/14595/* C422 */, /*23461*/14595/* C423 */,/*23462*/14595/* C424 */,/*23463*/14595/* C425 */,/*23464*/14595/* C426 */, /*23465*/14595/* C427 */,/*23466*/14595/* C428 */,/*23467*/14595/* C429 */,/*23468*/14595/* C42A */, /*23469*/14595/* C42B */,/*23470*/14594/* C42C */,/*23471*/14595/* C42D */,/*23472*/14595/* C42E */, /*23473*/14595/* C42F */,/*23474*/14595/* C430 */,/*23475*/14595/* C431 */,/*23476*/14595/* C432 */, /*23477*/14595/* C433 */,/*23478*/14595/* C434 */,/*23479*/14595/* C435 */,/*23480*/14595/* C436 */, /*23481*/14595/* C437 */,/*23482*/14595/* C438 */,/*23483*/14595/* C439 */,/*23484*/14595/* C43A */, /*23485*/14595/* C43B */,/*23486*/14595/* C43C */,/*23487*/14595/* C43D */,/*23488*/14595/* C43E */, /*23489*/14595/* C43F */,/*23490*/14595/* C440 */,/*23491*/14595/* C441 */,/*23492*/14595/* C442 */, /*23493*/14595/* C443 */,/*23494*/14595/* C444 */,/*23495*/14595/* C445 */,/*23496*/14595/* C446 */, /*23497*/14595/* C447 */,/*23498*/14594/* C448 */,/*23499*/14595/* C449 */,/*23500*/14595/* C44A */, /*23501*/14595/* C44B */,/*23502*/14595/* C44C */,/*23503*/14595/* C44D */,/*23504*/14595/* C44E */, /*23505*/14595/* C44F */,/*23506*/14595/* C450 */,/*23507*/14595/* C451 */,/*23508*/14595/* C452 */, /*23509*/14595/* C453 */,/*23510*/14595/* C454 */,/*23511*/14595/* C455 */,/*23512*/14595/* C456 */, /*23513*/14595/* C457 */,/*23514*/14595/* C458 */,/*23515*/14595/* C459 */,/*23516*/14595/* C45A */, /*23517*/14595/* C45B */,/*23518*/14595/* C45C */,/*23519*/14595/* C45D */,/*23520*/14595/* C45E */, /*23521*/14595/* C45F */,/*23522*/14595/* C460 */,/*23523*/14595/* C461 */,/*23524*/14595/* C462 */, /*23525*/14595/* C463 */,/*23526*/14594/* C464 */,/*23527*/14595/* C465 */,/*23528*/14595/* C466 */, /*23529*/14595/* C467 */,/*23530*/14595/* C468 */,/*23531*/14595/* C469 */,/*23532*/14595/* C46A */, /*23533*/14595/* C46B */,/*23534*/14595/* C46C */,/*23535*/14595/* C46D */,/*23536*/14595/* C46E */, /*23537*/14595/* C46F */,/*23538*/14595/* C470 */,/*23539*/14595/* C471 */,/*23540*/14595/* C472 */, /*23541*/14595/* C473 */,/*23542*/14595/* C474 */,/*23543*/14595/* C475 */,/*23544*/14595/* C476 */, /*23545*/14595/* C477 */,/*23546*/14595/* C478 */,/*23547*/14595/* C479 */,/*23548*/14595/* C47A */, /*23549*/14595/* C47B */,/*23550*/14595/* C47C */,/*23551*/14595/* C47D */,/*23552*/14595/* C47E */, /*23553*/14595/* C47F */,/*23554*/14594/* C480 */,/*23555*/14595/* C481 */,/*23556*/14595/* C482 */, /*23557*/14595/* C483 */,/*23558*/14595/* C484 */,/*23559*/14595/* C485 */,/*23560*/14595/* C486 */, /*23561*/14595/* C487 */,/*23562*/14595/* C488 */,/*23563*/14595/* C489 */,/*23564*/14595/* C48A */, /*23565*/14595/* C48B */,/*23566*/14595/* C48C */,/*23567*/14595/* C48D */,/*23568*/14595/* C48E */, /*23569*/14595/* C48F */,/*23570*/14595/* C490 */,/*23571*/14595/* C491 */,/*23572*/14595/* C492 */, /*23573*/14595/* C493 */,/*23574*/14595/* C494 */,/*23575*/14595/* C495 */,/*23576*/14595/* C496 */, /*23577*/14595/* C497 */,/*23578*/14595/* C498 */,/*23579*/14595/* C499 */,/*23580*/14595/* C49A */, /*23581*/14595/* C49B */,/*23582*/14594/* C49C */,/*23583*/14595/* C49D */,/*23584*/14595/* C49E */, /*23585*/14595/* C49F */,/*23586*/14595/* C4A0 */,/*23587*/14595/* C4A1 */,/*23588*/14595/* C4A2 */, /*23589*/14595/* C4A3 */,/*23590*/14595/* C4A4 */,/*23591*/14595/* C4A5 */,/*23592*/14595/* C4A6 */, /*23593*/14595/* C4A7 */,/*23594*/14595/* C4A8 */,/*23595*/14595/* C4A9 */,/*23596*/14595/* C4AA */, /*23597*/14595/* C4AB */,/*23598*/14595/* C4AC */,/*23599*/14595/* C4AD */,/*23600*/14595/* C4AE */, /*23601*/14595/* C4AF */,/*23602*/14595/* C4B0 */,/*23603*/14595/* C4B1 */,/*23604*/14595/* C4B2 */, /*23605*/14595/* C4B3 */,/*23606*/14595/* C4B4 */,/*23607*/14595/* C4B5 */,/*23608*/14595/* C4B6 */, /*23609*/14595/* C4B7 */,/*23610*/14594/* C4B8 */,/*23611*/14595/* C4B9 */,/*23612*/14595/* C4BA */, /*23613*/14595/* C4BB */,/*23614*/14595/* C4BC */,/*23615*/14595/* C4BD */,/*23616*/14595/* C4BE */, /*23617*/14595/* C4BF */,/*23618*/14595/* C4C0 */,/*23619*/14595/* C4C1 */,/*23620*/14595/* C4C2 */, /*23621*/14595/* C4C3 */,/*23622*/14595/* C4C4 */,/*23623*/14595/* C4C5 */,/*23624*/14595/* C4C6 */, /*23625*/14595/* C4C7 */,/*23626*/14595/* C4C8 */,/*23627*/14595/* C4C9 */,/*23628*/14595/* C4CA */, /*23629*/14595/* C4CB */,/*23630*/14595/* C4CC */,/*23631*/14595/* C4CD */,/*23632*/14595/* C4CE */, /*23633*/14595/* C4CF */,/*23634*/14595/* C4D0 */,/*23635*/14595/* C4D1 */,/*23636*/14595/* C4D2 */, /*23637*/14595/* C4D3 */,/*23638*/14594/* C4D4 */,/*23639*/14595/* C4D5 */,/*23640*/14595/* C4D6 */, /*23641*/14595/* C4D7 */,/*23642*/14595/* C4D8 */,/*23643*/14595/* C4D9 */,/*23644*/14595/* C4DA */, /*23645*/14595/* C4DB */,/*23646*/14595/* C4DC */,/*23647*/14595/* C4DD */,/*23648*/14595/* C4DE */, /*23649*/14595/* C4DF */,/*23650*/14595/* C4E0 */,/*23651*/14595/* C4E1 */,/*23652*/14595/* C4E2 */, /*23653*/14595/* C4E3 */,/*23654*/14595/* C4E4 */,/*23655*/14595/* C4E5 */,/*23656*/14595/* C4E6 */, /*23657*/14595/* C4E7 */,/*23658*/14595/* C4E8 */,/*23659*/14595/* C4E9 */,/*23660*/14595/* C4EA */, /*23661*/14595/* C4EB */,/*23662*/14595/* C4EC */,/*23663*/14595/* C4ED */,/*23664*/14595/* C4EE */, /*23665*/14595/* C4EF */,/*23666*/14594/* C4F0 */,/*23667*/14595/* C4F1 */,/*23668*/14595/* C4F2 */, /*23669*/14595/* C4F3 */,/*23670*/14595/* C4F4 */,/*23671*/14595/* C4F5 */,/*23672*/14595/* C4F6 */, /*23673*/14595/* C4F7 */,/*23674*/14595/* C4F8 */,/*23675*/14595/* C4F9 */,/*23676*/14595/* C4FA */, /*23677*/14595/* C4FB */,/*23678*/14595/* C4FC */,/*23679*/14595/* C4FD */,/*23680*/14595/* C4FE */, /*23681*/14595/* C4FF */,/*23682*/14595/* C500 */,/*23683*/14595/* C501 */,/*23684*/14595/* C502 */, /*23685*/14595/* C503 */,/*23686*/14595/* C504 */,/*23687*/14595/* C505 */,/*23688*/14595/* C506 */, /*23689*/14595/* C507 */,/*23690*/14595/* C508 */,/*23691*/14595/* C509 */,/*23692*/14595/* C50A */, /*23693*/14595/* C50B */,/*23694*/14594/* C50C */,/*23695*/14595/* C50D */,/*23696*/14595/* C50E */, /*23697*/14595/* C50F */,/*23698*/14595/* C510 */,/*23699*/14595/* C511 */,/*23700*/14595/* C512 */, /*23701*/14595/* C513 */,/*23702*/14595/* C514 */,/*23703*/14595/* C515 */,/*23704*/14595/* C516 */, /*23705*/14595/* C517 */,/*23706*/14595/* C518 */,/*23707*/14595/* C519 */,/*23708*/14595/* C51A */, /*23709*/14595/* C51B */,/*23710*/14595/* C51C */,/*23711*/14595/* C51D */,/*23712*/14595/* C51E */, /*23713*/14595/* C51F */,/*23714*/14595/* C520 */,/*23715*/14595/* C521 */,/*23716*/14595/* C522 */, /*23717*/14595/* C523 */,/*23718*/14595/* C524 */,/*23719*/14595/* C525 */,/*23720*/14595/* C526 */, /*23721*/14595/* C527 */,/*23722*/14594/* C528 */,/*23723*/14595/* C529 */,/*23724*/14595/* C52A */, /*23725*/14595/* C52B */,/*23726*/14595/* C52C */,/*23727*/14595/* C52D */,/*23728*/14595/* C52E */, /*23729*/14595/* C52F */,/*23730*/14595/* C530 */,/*23731*/14595/* C531 */,/*23732*/14595/* C532 */, /*23733*/14595/* C533 */,/*23734*/14595/* C534 */,/*23735*/14595/* C535 */,/*23736*/14595/* C536 */, /*23737*/14595/* C537 */,/*23738*/14595/* C538 */,/*23739*/14595/* C539 */,/*23740*/14595/* C53A */, /*23741*/14595/* C53B */,/*23742*/14595/* C53C */,/*23743*/14595/* C53D */,/*23744*/14595/* C53E */, /*23745*/14595/* C53F */,/*23746*/14595/* C540 */,/*23747*/14595/* C541 */,/*23748*/14595/* C542 */, /*23749*/14595/* C543 */,/*23750*/14594/* C544 */,/*23751*/14595/* C545 */,/*23752*/14595/* C546 */, /*23753*/14595/* C547 */,/*23754*/14595/* C548 */,/*23755*/14595/* C549 */,/*23756*/14595/* C54A */, /*23757*/14595/* C54B */,/*23758*/14595/* C54C */,/*23759*/14595/* C54D */,/*23760*/14595/* C54E */, /*23761*/14595/* C54F */,/*23762*/14595/* C550 */,/*23763*/14595/* C551 */,/*23764*/14595/* C552 */, /*23765*/14595/* C553 */,/*23766*/14595/* C554 */,/*23767*/14595/* C555 */,/*23768*/14595/* C556 */, /*23769*/14595/* C557 */,/*23770*/14595/* C558 */,/*23771*/14595/* C559 */,/*23772*/14595/* C55A */, /*23773*/14595/* C55B */,/*23774*/14595/* C55C */,/*23775*/14595/* C55D */,/*23776*/14595/* C55E */, /*23777*/14595/* C55F */,/*23778*/14594/* C560 */,/*23779*/14595/* C561 */,/*23780*/14595/* C562 */, /*23781*/14595/* C563 */,/*23782*/14595/* C564 */,/*23783*/14595/* C565 */,/*23784*/14595/* C566 */, /*23785*/14595/* C567 */,/*23786*/14595/* C568 */,/*23787*/14595/* C569 */,/*23788*/14595/* C56A */, /*23789*/14595/* C56B */,/*23790*/14595/* C56C */,/*23791*/14595/* C56D */,/*23792*/14595/* C56E */, /*23793*/14595/* C56F */,/*23794*/14595/* C570 */,/*23795*/14595/* C571 */,/*23796*/14595/* C572 */, /*23797*/14595/* C573 */,/*23798*/14595/* C574 */,/*23799*/14595/* C575 */,/*23800*/14595/* C576 */, /*23801*/14595/* C577 */,/*23802*/14595/* C578 */,/*23803*/14595/* C579 */,/*23804*/14595/* C57A */, /*23805*/14595/* C57B */,/*23806*/14594/* C57C */,/*23807*/14595/* C57D */,/*23808*/14595/* C57E */, /*23809*/14595/* C57F */,/*23810*/14595/* C580 */,/*23811*/14595/* C581 */,/*23812*/14595/* C582 */, /*23813*/14595/* C583 */,/*23814*/14595/* C584 */,/*23815*/14595/* C585 */,/*23816*/14595/* C586 */, /*23817*/14595/* C587 */,/*23818*/14595/* C588 */,/*23819*/14595/* C589 */,/*23820*/14595/* C58A */, /*23821*/14595/* C58B */,/*23822*/14595/* C58C */,/*23823*/14595/* C58D */,/*23824*/14595/* C58E */, /*23825*/14595/* C58F */,/*23826*/14595/* C590 */,/*23827*/14595/* C591 */,/*23828*/14595/* C592 */, /*23829*/14595/* C593 */,/*23830*/14595/* C594 */,/*23831*/14595/* C595 */,/*23832*/14595/* C596 */, /*23833*/14595/* C597 */,/*23834*/14594/* C598 */,/*23835*/14595/* C599 */,/*23836*/14595/* C59A */, /*23837*/14595/* C59B */,/*23838*/14595/* C59C */,/*23839*/14595/* C59D */,/*23840*/14595/* C59E */, /*23841*/14595/* C59F */,/*23842*/14595/* C5A0 */,/*23843*/14595/* C5A1 */,/*23844*/14595/* C5A2 */, /*23845*/14595/* C5A3 */,/*23846*/14595/* C5A4 */,/*23847*/14595/* C5A5 */,/*23848*/14595/* C5A6 */, /*23849*/14595/* C5A7 */,/*23850*/14595/* C5A8 */,/*23851*/14595/* C5A9 */,/*23852*/14595/* C5AA */, /*23853*/14595/* C5AB */,/*23854*/14595/* C5AC */,/*23855*/14595/* C5AD */,/*23856*/14595/* C5AE */, /*23857*/14595/* C5AF */,/*23858*/14595/* C5B0 */,/*23859*/14595/* C5B1 */,/*23860*/14595/* C5B2 */, /*23861*/14595/* C5B3 */,/*23862*/14594/* C5B4 */,/*23863*/14595/* C5B5 */,/*23864*/14595/* C5B6 */, /*23865*/14595/* C5B7 */,/*23866*/14595/* C5B8 */,/*23867*/14595/* C5B9 */,/*23868*/14595/* C5BA */, /*23869*/14595/* C5BB */,/*23870*/14595/* C5BC */,/*23871*/14595/* C5BD */,/*23872*/14595/* C5BE */, /*23873*/14595/* C5BF */,/*23874*/14595/* C5C0 */,/*23875*/14595/* C5C1 */,/*23876*/14595/* C5C2 */, /*23877*/14595/* C5C3 */,/*23878*/14595/* C5C4 */,/*23879*/14595/* C5C5 */,/*23880*/14595/* C5C6 */, /*23881*/14595/* C5C7 */,/*23882*/14595/* C5C8 */,/*23883*/14595/* C5C9 */,/*23884*/14595/* C5CA */, /*23885*/14595/* C5CB */,/*23886*/14595/* C5CC */,/*23887*/14595/* C5CD */,/*23888*/14595/* C5CE */, /*23889*/14595/* C5CF */,/*23890*/14594/* C5D0 */,/*23891*/14595/* C5D1 */,/*23892*/14595/* C5D2 */, /*23893*/14595/* C5D3 */,/*23894*/14595/* C5D4 */,/*23895*/14595/* C5D5 */,/*23896*/14595/* C5D6 */, /*23897*/14595/* C5D7 */,/*23898*/14595/* C5D8 */,/*23899*/14595/* C5D9 */,/*23900*/14595/* C5DA */, /*23901*/14595/* C5DB */,/*23902*/14595/* C5DC */,/*23903*/14595/* C5DD */,/*23904*/14595/* C5DE */, /*23905*/14595/* C5DF */,/*23906*/14595/* C5E0 */,/*23907*/14595/* C5E1 */,/*23908*/14595/* C5E2 */, /*23909*/14595/* C5E3 */,/*23910*/14595/* C5E4 */,/*23911*/14595/* C5E5 */,/*23912*/14595/* C5E6 */, /*23913*/14595/* C5E7 */,/*23914*/14595/* C5E8 */,/*23915*/14595/* C5E9 */,/*23916*/14595/* C5EA */, /*23917*/14595/* C5EB */,/*23918*/14594/* C5EC */,/*23919*/14595/* C5ED */,/*23920*/14595/* C5EE */, /*23921*/14595/* C5EF */,/*23922*/14595/* C5F0 */,/*23923*/14595/* C5F1 */,/*23924*/14595/* C5F2 */, /*23925*/14595/* C5F3 */,/*23926*/14595/* C5F4 */,/*23927*/14595/* C5F5 */,/*23928*/14595/* C5F6 */, /*23929*/14595/* C5F7 */,/*23930*/14595/* C5F8 */,/*23931*/14595/* C5F9 */,/*23932*/14595/* C5FA */, /*23933*/14595/* C5FB */,/*23934*/14595/* C5FC */,/*23935*/14595/* C5FD */,/*23936*/14595/* C5FE */, /*23937*/14595/* C5FF */,/*23938*/14595/* C600 */,/*23939*/14595/* C601 */,/*23940*/14595/* C602 */, /*23941*/14595/* C603 */,/*23942*/14595/* C604 */,/*23943*/14595/* C605 */,/*23944*/14595/* C606 */, /*23945*/14595/* C607 */,/*23946*/14594/* C608 */,/*23947*/14595/* C609 */,/*23948*/14595/* C60A */, /*23949*/14595/* C60B */,/*23950*/14595/* C60C */,/*23951*/14595/* C60D */,/*23952*/14595/* C60E */, /*23953*/14595/* C60F */,/*23954*/14595/* C610 */,/*23955*/14595/* C611 */,/*23956*/14595/* C612 */, /*23957*/14595/* C613 */,/*23958*/14595/* C614 */,/*23959*/14595/* C615 */,/*23960*/14595/* C616 */, /*23961*/14595/* C617 */,/*23962*/14595/* C618 */,/*23963*/14595/* C619 */,/*23964*/14595/* C61A */, /*23965*/14595/* C61B */,/*23966*/14595/* C61C */,/*23967*/14595/* C61D */,/*23968*/14595/* C61E */, /*23969*/14595/* C61F */,/*23970*/14595/* C620 */,/*23971*/14595/* C621 */,/*23972*/14595/* C622 */, /*23973*/14595/* C623 */,/*23974*/14594/* C624 */,/*23975*/14595/* C625 */,/*23976*/14595/* C626 */, /*23977*/14595/* C627 */,/*23978*/14595/* C628 */,/*23979*/14595/* C629 */,/*23980*/14595/* C62A */, /*23981*/14595/* C62B */,/*23982*/14595/* C62C */,/*23983*/14595/* C62D */,/*23984*/14595/* C62E */, /*23985*/14595/* C62F */,/*23986*/14595/* C630 */,/*23987*/14595/* C631 */,/*23988*/14595/* C632 */, /*23989*/14595/* C633 */,/*23990*/14595/* C634 */,/*23991*/14595/* C635 */,/*23992*/14595/* C636 */, /*23993*/14595/* C637 */,/*23994*/14595/* C638 */,/*23995*/14595/* C639 */,/*23996*/14595/* C63A */, /*23997*/14595/* C63B */,/*23998*/14595/* C63C */,/*23999*/14595/* C63D */,/*24000*/14595/* C63E */, /*24001*/14595/* C63F */,/*24002*/14594/* C640 */,/*24003*/14595/* C641 */,/*24004*/14595/* C642 */, /*24005*/14595/* C643 */,/*24006*/14595/* C644 */,/*24007*/14595/* C645 */,/*24008*/14595/* C646 */, /*24009*/14595/* C647 */,/*24010*/14595/* C648 */,/*24011*/14595/* C649 */,/*24012*/14595/* C64A */, /*24013*/14595/* C64B */,/*24014*/14595/* C64C */,/*24015*/14595/* C64D */,/*24016*/14595/* C64E */, /*24017*/14595/* C64F */,/*24018*/14595/* C650 */,/*24019*/14595/* C651 */,/*24020*/14595/* C652 */, /*24021*/14595/* C653 */,/*24022*/14595/* C654 */,/*24023*/14595/* C655 */,/*24024*/14595/* C656 */, /*24025*/14595/* C657 */,/*24026*/14595/* C658 */,/*24027*/14595/* C659 */,/*24028*/14595/* C65A */, /*24029*/14595/* C65B */,/*24030*/14594/* C65C */,/*24031*/14595/* C65D */,/*24032*/14595/* C65E */, /*24033*/14595/* C65F */,/*24034*/14595/* C660 */,/*24035*/14595/* C661 */,/*24036*/14595/* C662 */, /*24037*/14595/* C663 */,/*24038*/14595/* C664 */,/*24039*/14595/* C665 */,/*24040*/14595/* C666 */, /*24041*/14595/* C667 */,/*24042*/14595/* C668 */,/*24043*/14595/* C669 */,/*24044*/14595/* C66A */, /*24045*/14595/* C66B */,/*24046*/14595/* C66C */,/*24047*/14595/* C66D */,/*24048*/14595/* C66E */, /*24049*/14595/* C66F */,/*24050*/14595/* C670 */,/*24051*/14595/* C671 */,/*24052*/14595/* C672 */, /*24053*/14595/* C673 */,/*24054*/14595/* C674 */,/*24055*/14595/* C675 */,/*24056*/14595/* C676 */, /*24057*/14595/* C677 */,/*24058*/14594/* C678 */,/*24059*/14595/* C679 */,/*24060*/14595/* C67A */, /*24061*/14595/* C67B */,/*24062*/14595/* C67C */,/*24063*/14595/* C67D */,/*24064*/14595/* C67E */, /*24065*/14595/* C67F */,/*24066*/14595/* C680 */,/*24067*/14595/* C681 */,/*24068*/14595/* C682 */, /*24069*/14595/* C683 */,/*24070*/14595/* C684 */,/*24071*/14595/* C685 */,/*24072*/14595/* C686 */, /*24073*/14595/* C687 */,/*24074*/14595/* C688 */,/*24075*/14595/* C689 */,/*24076*/14595/* C68A */, /*24077*/14595/* C68B */,/*24078*/14595/* C68C */,/*24079*/14595/* C68D */,/*24080*/14595/* C68E */, /*24081*/14595/* C68F */,/*24082*/14595/* C690 */,/*24083*/14595/* C691 */,/*24084*/14595/* C692 */, /*24085*/14595/* C693 */,/*24086*/14594/* C694 */,/*24087*/14595/* C695 */,/*24088*/14595/* C696 */, /*24089*/14595/* C697 */,/*24090*/14595/* C698 */,/*24091*/14595/* C699 */,/*24092*/14595/* C69A */, /*24093*/14595/* C69B */,/*24094*/14595/* C69C */,/*24095*/14595/* C69D */,/*24096*/14595/* C69E */, /*24097*/14595/* C69F */,/*24098*/14595/* C6A0 */,/*24099*/14595/* C6A1 */,/*24100*/14595/* C6A2 */, /*24101*/14595/* C6A3 */,/*24102*/14595/* C6A4 */,/*24103*/14595/* C6A5 */,/*24104*/14595/* C6A6 */, /*24105*/14595/* C6A7 */,/*24106*/14595/* C6A8 */,/*24107*/14595/* C6A9 */,/*24108*/14595/* C6AA */, /*24109*/14595/* C6AB */,/*24110*/14595/* C6AC */,/*24111*/14595/* C6AD */,/*24112*/14595/* C6AE */, /*24113*/14595/* C6AF */,/*24114*/14594/* C6B0 */,/*24115*/14595/* C6B1 */,/*24116*/14595/* C6B2 */, /*24117*/14595/* C6B3 */,/*24118*/14595/* C6B4 */,/*24119*/14595/* C6B5 */,/*24120*/14595/* C6B6 */, /*24121*/14595/* C6B7 */,/*24122*/14595/* C6B8 */,/*24123*/14595/* C6B9 */,/*24124*/14595/* C6BA */, /*24125*/14595/* C6BB */,/*24126*/14595/* C6BC */,/*24127*/14595/* C6BD */,/*24128*/14595/* C6BE */, /*24129*/14595/* C6BF */,/*24130*/14595/* C6C0 */,/*24131*/14595/* C6C1 */,/*24132*/14595/* C6C2 */, /*24133*/14595/* C6C3 */,/*24134*/14595/* C6C4 */,/*24135*/14595/* C6C5 */,/*24136*/14595/* C6C6 */, /*24137*/14595/* C6C7 */,/*24138*/14595/* C6C8 */,/*24139*/14595/* C6C9 */,/*24140*/14595/* C6CA */, /*24141*/14595/* C6CB */,/*24142*/14594/* C6CC */,/*24143*/14595/* C6CD */,/*24144*/14595/* C6CE */, /*24145*/14595/* C6CF */,/*24146*/14595/* C6D0 */,/*24147*/14595/* C6D1 */,/*24148*/14595/* C6D2 */, /*24149*/14595/* C6D3 */,/*24150*/14595/* C6D4 */,/*24151*/14595/* C6D5 */,/*24152*/14595/* C6D6 */, /*24153*/14595/* C6D7 */,/*24154*/14595/* C6D8 */,/*24155*/14595/* C6D9 */,/*24156*/14595/* C6DA */, /*24157*/14595/* C6DB */,/*24158*/14595/* C6DC */,/*24159*/14595/* C6DD */,/*24160*/14595/* C6DE */, /*24161*/14595/* C6DF */,/*24162*/14595/* C6E0 */,/*24163*/14595/* C6E1 */,/*24164*/14595/* C6E2 */, /*24165*/14595/* C6E3 */,/*24166*/14595/* C6E4 */,/*24167*/14595/* C6E5 */,/*24168*/14595/* C6E6 */, /*24169*/14595/* C6E7 */,/*24170*/14594/* C6E8 */,/*24171*/14595/* C6E9 */,/*24172*/14595/* C6EA */, /*24173*/14595/* C6EB */,/*24174*/14595/* C6EC */,/*24175*/14595/* C6ED */,/*24176*/14595/* C6EE */, /*24177*/14595/* C6EF */,/*24178*/14595/* C6F0 */,/*24179*/14595/* C6F1 */,/*24180*/14595/* C6F2 */, /*24181*/14595/* C6F3 */,/*24182*/14595/* C6F4 */,/*24183*/14595/* C6F5 */,/*24184*/14595/* C6F6 */, /*24185*/14595/* C6F7 */,/*24186*/14595/* C6F8 */,/*24187*/14595/* C6F9 */,/*24188*/14595/* C6FA */, /*24189*/14595/* C6FB */,/*24190*/14595/* C6FC */,/*24191*/14595/* C6FD */,/*24192*/14595/* C6FE */, /*24193*/14595/* C6FF */,/*24194*/14595/* C700 */,/*24195*/14595/* C701 */,/*24196*/14595/* C702 */, /*24197*/14595/* C703 */,/*24198*/14594/* C704 */,/*24199*/14595/* C705 */,/*24200*/14595/* C706 */, /*24201*/14595/* C707 */,/*24202*/14595/* C708 */,/*24203*/14595/* C709 */,/*24204*/14595/* C70A */, /*24205*/14595/* C70B */,/*24206*/14595/* C70C */,/*24207*/14595/* C70D */,/*24208*/14595/* C70E */, /*24209*/14595/* C70F */,/*24210*/14595/* C710 */,/*24211*/14595/* C711 */,/*24212*/14595/* C712 */, /*24213*/14595/* C713 */,/*24214*/14595/* C714 */,/*24215*/14595/* C715 */,/*24216*/14595/* C716 */, /*24217*/14595/* C717 */,/*24218*/14595/* C718 */,/*24219*/14595/* C719 */,/*24220*/14595/* C71A */, /*24221*/14595/* C71B */,/*24222*/14595/* C71C */,/*24223*/14595/* C71D */,/*24224*/14595/* C71E */, /*24225*/14595/* C71F */,/*24226*/14594/* C720 */,/*24227*/14595/* C721 */,/*24228*/14595/* C722 */, /*24229*/14595/* C723 */,/*24230*/14595/* C724 */,/*24231*/14595/* C725 */,/*24232*/14595/* C726 */, /*24233*/14595/* C727 */,/*24234*/14595/* C728 */,/*24235*/14595/* C729 */,/*24236*/14595/* C72A */, /*24237*/14595/* C72B */,/*24238*/14595/* C72C */,/*24239*/14595/* C72D */,/*24240*/14595/* C72E */, /*24241*/14595/* C72F */,/*24242*/14595/* C730 */,/*24243*/14595/* C731 */,/*24244*/14595/* C732 */, /*24245*/14595/* C733 */,/*24246*/14595/* C734 */,/*24247*/14595/* C735 */,/*24248*/14595/* C736 */, /*24249*/14595/* C737 */,/*24250*/14595/* C738 */,/*24251*/14595/* C739 */,/*24252*/14595/* C73A */, /*24253*/14595/* C73B */,/*24254*/14594/* C73C */,/*24255*/14595/* C73D */,/*24256*/14595/* C73E */, /*24257*/14595/* C73F */,/*24258*/14595/* C740 */,/*24259*/14595/* C741 */,/*24260*/14595/* C742 */, /*24261*/14595/* C743 */,/*24262*/14595/* C744 */,/*24263*/14595/* C745 */,/*24264*/14595/* C746 */, /*24265*/14595/* C747 */,/*24266*/14595/* C748 */,/*24267*/14595/* C749 */,/*24268*/14595/* C74A */, /*24269*/14595/* C74B */,/*24270*/14595/* C74C */,/*24271*/14595/* C74D */,/*24272*/14595/* C74E */, /*24273*/14595/* C74F */,/*24274*/14595/* C750 */,/*24275*/14595/* C751 */,/*24276*/14595/* C752 */, /*24277*/14595/* C753 */,/*24278*/14595/* C754 */,/*24279*/14595/* C755 */,/*24280*/14595/* C756 */, /*24281*/14595/* C757 */,/*24282*/14594/* C758 */,/*24283*/14595/* C759 */,/*24284*/14595/* C75A */, /*24285*/14595/* C75B */,/*24286*/14595/* C75C */,/*24287*/14595/* C75D */,/*24288*/14595/* C75E */, /*24289*/14595/* C75F */,/*24290*/14595/* C760 */,/*24291*/14595/* C761 */,/*24292*/14595/* C762 */, /*24293*/14595/* C763 */,/*24294*/14595/* C764 */,/*24295*/14595/* C765 */,/*24296*/14595/* C766 */, /*24297*/14595/* C767 */,/*24298*/14595/* C768 */,/*24299*/14595/* C769 */,/*24300*/14595/* C76A */, /*24301*/14595/* C76B */,/*24302*/14595/* C76C */,/*24303*/14595/* C76D */,/*24304*/14595/* C76E */, /*24305*/14595/* C76F */,/*24306*/14595/* C770 */,/*24307*/14595/* C771 */,/*24308*/14595/* C772 */, /*24309*/14595/* C773 */,/*24310*/14594/* C774 */,/*24311*/14595/* C775 */,/*24312*/14595/* C776 */, /*24313*/14595/* C777 */,/*24314*/14595/* C778 */,/*24315*/14595/* C779 */,/*24316*/14595/* C77A */, /*24317*/14595/* C77B */,/*24318*/14595/* C77C */,/*24319*/14595/* C77D */,/*24320*/14595/* C77E */, /*24321*/14595/* C77F */,/*24322*/14595/* C780 */,/*24323*/14595/* C781 */,/*24324*/14595/* C782 */, /*24325*/14595/* C783 */,/*24326*/14595/* C784 */,/*24327*/14595/* C785 */,/*24328*/14595/* C786 */, /*24329*/14595/* C787 */,/*24330*/14595/* C788 */,/*24331*/14595/* C789 */,/*24332*/14595/* C78A */, /*24333*/14595/* C78B */,/*24334*/14595/* C78C */,/*24335*/14595/* C78D */,/*24336*/14595/* C78E */, /*24337*/14595/* C78F */,/*24338*/14594/* C790 */,/*24339*/14595/* C791 */,/*24340*/14595/* C792 */, /*24341*/14595/* C793 */,/*24342*/14595/* C794 */,/*24343*/14595/* C795 */,/*24344*/14595/* C796 */, /*24345*/14595/* C797 */,/*24346*/14595/* C798 */,/*24347*/14595/* C799 */,/*24348*/14595/* C79A */, /*24349*/14595/* C79B */,/*24350*/14595/* C79C */,/*24351*/14595/* C79D */,/*24352*/14595/* C79E */, /*24353*/14595/* C79F */,/*24354*/14595/* C7A0 */,/*24355*/14595/* C7A1 */,/*24356*/14595/* C7A2 */, /*24357*/14595/* C7A3 */,/*24358*/14595/* C7A4 */,/*24359*/14595/* C7A5 */,/*24360*/14595/* C7A6 */, /*24361*/14595/* C7A7 */,/*24362*/14595/* C7A8 */,/*24363*/14595/* C7A9 */,/*24364*/14595/* C7AA */, /*24365*/14595/* C7AB */,/*24366*/14594/* C7AC */,/*24367*/14595/* C7AD */,/*24368*/14595/* C7AE */, /*24369*/14595/* C7AF */,/*24370*/14595/* C7B0 */,/*24371*/14595/* C7B1 */,/*24372*/14595/* C7B2 */, /*24373*/14595/* C7B3 */,/*24374*/14595/* C7B4 */,/*24375*/14595/* C7B5 */,/*24376*/14595/* C7B6 */, /*24377*/14595/* C7B7 */,/*24378*/14595/* C7B8 */,/*24379*/14595/* C7B9 */,/*24380*/14595/* C7BA */, /*24381*/14595/* C7BB */,/*24382*/14595/* C7BC */,/*24383*/14595/* C7BD */,/*24384*/14595/* C7BE */, /*24385*/14595/* C7BF */,/*24386*/14595/* C7C0 */,/*24387*/14595/* C7C1 */,/*24388*/14595/* C7C2 */, /*24389*/14595/* C7C3 */,/*24390*/14595/* C7C4 */,/*24391*/14595/* C7C5 */,/*24392*/14595/* C7C6 */, /*24393*/14595/* C7C7 */,/*24394*/14594/* C7C8 */,/*24395*/14595/* C7C9 */,/*24396*/14595/* C7CA */, /*24397*/14595/* C7CB */,/*24398*/14595/* C7CC */,/*24399*/14595/* C7CD */,/*24400*/14595/* C7CE */, /*24401*/14595/* C7CF */,/*24402*/14595/* C7D0 */,/*24403*/14595/* C7D1 */,/*24404*/14595/* C7D2 */, /*24405*/14595/* C7D3 */,/*24406*/14595/* C7D4 */,/*24407*/14595/* C7D5 */,/*24408*/14595/* C7D6 */, /*24409*/14595/* C7D7 */,/*24410*/14595/* C7D8 */,/*24411*/14595/* C7D9 */,/*24412*/14595/* C7DA */, /*24413*/14595/* C7DB */,/*24414*/14595/* C7DC */,/*24415*/14595/* C7DD */,/*24416*/14595/* C7DE */, /*24417*/14595/* C7DF */,/*24418*/14595/* C7E0 */,/*24419*/14595/* C7E1 */,/*24420*/14595/* C7E2 */, /*24421*/14595/* C7E3 */,/*24422*/14594/* C7E4 */,/*24423*/14595/* C7E5 */,/*24424*/14595/* C7E6 */, /*24425*/14595/* C7E7 */,/*24426*/14595/* C7E8 */,/*24427*/14595/* C7E9 */,/*24428*/14595/* C7EA */, /*24429*/14595/* C7EB */,/*24430*/14595/* C7EC */,/*24431*/14595/* C7ED */,/*24432*/14595/* C7EE */, /*24433*/14595/* C7EF */,/*24434*/14595/* C7F0 */,/*24435*/14595/* C7F1 */,/*24436*/14595/* C7F2 */, /*24437*/14595/* C7F3 */,/*24438*/14595/* C7F4 */,/*24439*/14595/* C7F5 */,/*24440*/14595/* C7F6 */, /*24441*/14595/* C7F7 */,/*24442*/14595/* C7F8 */,/*24443*/14595/* C7F9 */,/*24444*/14595/* C7FA */, /*24445*/14595/* C7FB */,/*24446*/14595/* C7FC */,/*24447*/14595/* C7FD */,/*24448*/14595/* C7FE */, /*24449*/14595/* C7FF */,/*24450*/14594/* C800 */,/*24451*/14595/* C801 */,/*24452*/14595/* C802 */, /*24453*/14595/* C803 */,/*24454*/14595/* C804 */,/*24455*/14595/* C805 */,/*24456*/14595/* C806 */, /*24457*/14595/* C807 */,/*24458*/14595/* C808 */,/*24459*/14595/* C809 */,/*24460*/14595/* C80A */, /*24461*/14595/* C80B */,/*24462*/14595/* C80C */,/*24463*/14595/* C80D */,/*24464*/14595/* C80E */, /*24465*/14595/* C80F */,/*24466*/14595/* C810 */,/*24467*/14595/* C811 */,/*24468*/14595/* C812 */, /*24469*/14595/* C813 */,/*24470*/14595/* C814 */,/*24471*/14595/* C815 */,/*24472*/14595/* C816 */, /*24473*/14595/* C817 */,/*24474*/14595/* C818 */,/*24475*/14595/* C819 */,/*24476*/14595/* C81A */, /*24477*/14595/* C81B */,/*24478*/14594/* C81C */,/*24479*/14595/* C81D */,/*24480*/14595/* C81E */, /*24481*/14595/* C81F */,/*24482*/14595/* C820 */,/*24483*/14595/* C821 */,/*24484*/14595/* C822 */, /*24485*/14595/* C823 */,/*24486*/14595/* C824 */,/*24487*/14595/* C825 */,/*24488*/14595/* C826 */, /*24489*/14595/* C827 */,/*24490*/14595/* C828 */,/*24491*/14595/* C829 */,/*24492*/14595/* C82A */, /*24493*/14595/* C82B */,/*24494*/14595/* C82C */,/*24495*/14595/* C82D */,/*24496*/14595/* C82E */, /*24497*/14595/* C82F */,/*24498*/14595/* C830 */,/*24499*/14595/* C831 */,/*24500*/14595/* C832 */, /*24501*/14595/* C833 */,/*24502*/14595/* C834 */,/*24503*/14595/* C835 */,/*24504*/14595/* C836 */, /*24505*/14595/* C837 */,/*24506*/14594/* C838 */,/*24507*/14595/* C839 */,/*24508*/14595/* C83A */, /*24509*/14595/* C83B */,/*24510*/14595/* C83C */,/*24511*/14595/* C83D */,/*24512*/14595/* C83E */, /*24513*/14595/* C83F */,/*24514*/14595/* C840 */,/*24515*/14595/* C841 */,/*24516*/14595/* C842 */, /*24517*/14595/* C843 */,/*24518*/14595/* C844 */,/*24519*/14595/* C845 */,/*24520*/14595/* C846 */, /*24521*/14595/* C847 */,/*24522*/14595/* C848 */,/*24523*/14595/* C849 */,/*24524*/14595/* C84A */, /*24525*/14595/* C84B */,/*24526*/14595/* C84C */,/*24527*/14595/* C84D */,/*24528*/14595/* C84E */, /*24529*/14595/* C84F */,/*24530*/14595/* C850 */,/*24531*/14595/* C851 */,/*24532*/14595/* C852 */, /*24533*/14595/* C853 */,/*24534*/14594/* C854 */,/*24535*/14595/* C855 */,/*24536*/14595/* C856 */, /*24537*/14595/* C857 */,/*24538*/14595/* C858 */,/*24539*/14595/* C859 */,/*24540*/14595/* C85A */, /*24541*/14595/* C85B */,/*24542*/14595/* C85C */,/*24543*/14595/* C85D */,/*24544*/14595/* C85E */, /*24545*/14595/* C85F */,/*24546*/14595/* C860 */,/*24547*/14595/* C861 */,/*24548*/14595/* C862 */, /*24549*/14595/* C863 */,/*24550*/14595/* C864 */,/*24551*/14595/* C865 */,/*24552*/14595/* C866 */, /*24553*/14595/* C867 */,/*24554*/14595/* C868 */,/*24555*/14595/* C869 */,/*24556*/14595/* C86A */, /*24557*/14595/* C86B */,/*24558*/14595/* C86C */,/*24559*/14595/* C86D */,/*24560*/14595/* C86E */, /*24561*/14595/* C86F */,/*24562*/14594/* C870 */,/*24563*/14595/* C871 */,/*24564*/14595/* C872 */, /*24565*/14595/* C873 */,/*24566*/14595/* C874 */,/*24567*/14595/* C875 */,/*24568*/14595/* C876 */, /*24569*/14595/* C877 */,/*24570*/14595/* C878 */,/*24571*/14595/* C879 */,/*24572*/14595/* C87A */, /*24573*/14595/* C87B */,/*24574*/14595/* C87C */,/*24575*/14595/* C87D */,/*24576*/14595/* C87E */, /*24577*/14595/* C87F */,/*24578*/14595/* C880 */,/*24579*/14595/* C881 */,/*24580*/14595/* C882 */, /*24581*/14595/* C883 */,/*24582*/14595/* C884 */,/*24583*/14595/* C885 */,/*24584*/14595/* C886 */, /*24585*/14595/* C887 */,/*24586*/14595/* C888 */,/*24587*/14595/* C889 */,/*24588*/14595/* C88A */, /*24589*/14595/* C88B */,/*24590*/14594/* C88C */,/*24591*/14595/* C88D */,/*24592*/14595/* C88E */, /*24593*/14595/* C88F */,/*24594*/14595/* C890 */,/*24595*/14595/* C891 */,/*24596*/14595/* C892 */, /*24597*/14595/* C893 */,/*24598*/14595/* C894 */,/*24599*/14595/* C895 */,/*24600*/14595/* C896 */, /*24601*/14595/* C897 */,/*24602*/14595/* C898 */,/*24603*/14595/* C899 */,/*24604*/14595/* C89A */, /*24605*/14595/* C89B */,/*24606*/14595/* C89C */,/*24607*/14595/* C89D */,/*24608*/14595/* C89E */, /*24609*/14595/* C89F */,/*24610*/14595/* C8A0 */,/*24611*/14595/* C8A1 */,/*24612*/14595/* C8A2 */, /*24613*/14595/* C8A3 */,/*24614*/14595/* C8A4 */,/*24615*/14595/* C8A5 */,/*24616*/14595/* C8A6 */, /*24617*/14595/* C8A7 */,/*24618*/14594/* C8A8 */,/*24619*/14595/* C8A9 */,/*24620*/14595/* C8AA */, /*24621*/14595/* C8AB */,/*24622*/14595/* C8AC */,/*24623*/14595/* C8AD */,/*24624*/14595/* C8AE */, /*24625*/14595/* C8AF */,/*24626*/14595/* C8B0 */,/*24627*/14595/* C8B1 */,/*24628*/14595/* C8B2 */, /*24629*/14595/* C8B3 */,/*24630*/14595/* C8B4 */,/*24631*/14595/* C8B5 */,/*24632*/14595/* C8B6 */, /*24633*/14595/* C8B7 */,/*24634*/14595/* C8B8 */,/*24635*/14595/* C8B9 */,/*24636*/14595/* C8BA */, /*24637*/14595/* C8BB */,/*24638*/14595/* C8BC */,/*24639*/14595/* C8BD */,/*24640*/14595/* C8BE */, /*24641*/14595/* C8BF */,/*24642*/14595/* C8C0 */,/*24643*/14595/* C8C1 */,/*24644*/14595/* C8C2 */, /*24645*/14595/* C8C3 */,/*24646*/14594/* C8C4 */,/*24647*/14595/* C8C5 */,/*24648*/14595/* C8C6 */, /*24649*/14595/* C8C7 */,/*24650*/14595/* C8C8 */,/*24651*/14595/* C8C9 */,/*24652*/14595/* C8CA */, /*24653*/14595/* C8CB */,/*24654*/14595/* C8CC */,/*24655*/14595/* C8CD */,/*24656*/14595/* C8CE */, /*24657*/14595/* C8CF */,/*24658*/14595/* C8D0 */,/*24659*/14595/* C8D1 */,/*24660*/14595/* C8D2 */, /*24661*/14595/* C8D3 */,/*24662*/14595/* C8D4 */,/*24663*/14595/* C8D5 */,/*24664*/14595/* C8D6 */, /*24665*/14595/* C8D7 */,/*24666*/14595/* C8D8 */,/*24667*/14595/* C8D9 */,/*24668*/14595/* C8DA */, /*24669*/14595/* C8DB */,/*24670*/14595/* C8DC */,/*24671*/14595/* C8DD */,/*24672*/14595/* C8DE */, /*24673*/14595/* C8DF */,/*24674*/14594/* C8E0 */,/*24675*/14595/* C8E1 */,/*24676*/14595/* C8E2 */, /*24677*/14595/* C8E3 */,/*24678*/14595/* C8E4 */,/*24679*/14595/* C8E5 */,/*24680*/14595/* C8E6 */, /*24681*/14595/* C8E7 */,/*24682*/14595/* C8E8 */,/*24683*/14595/* C8E9 */,/*24684*/14595/* C8EA */, /*24685*/14595/* C8EB */,/*24686*/14595/* C8EC */,/*24687*/14595/* C8ED */,/*24688*/14595/* C8EE */, /*24689*/14595/* C8EF */,/*24690*/14595/* C8F0 */,/*24691*/14595/* C8F1 */,/*24692*/14595/* C8F2 */, /*24693*/14595/* C8F3 */,/*24694*/14595/* C8F4 */,/*24695*/14595/* C8F5 */,/*24696*/14595/* C8F6 */, /*24697*/14595/* C8F7 */,/*24698*/14595/* C8F8 */,/*24699*/14595/* C8F9 */,/*24700*/14595/* C8FA */, /*24701*/14595/* C8FB */,/*24702*/14594/* C8FC */,/*24703*/14595/* C8FD */,/*24704*/14595/* C8FE */, /*24705*/14595/* C8FF */,/*24706*/14595/* C900 */,/*24707*/14595/* C901 */,/*24708*/14595/* C902 */, /*24709*/14595/* C903 */,/*24710*/14595/* C904 */,/*24711*/14595/* C905 */,/*24712*/14595/* C906 */, /*24713*/14595/* C907 */,/*24714*/14595/* C908 */,/*24715*/14595/* C909 */,/*24716*/14595/* C90A */, /*24717*/14595/* C90B */,/*24718*/14595/* C90C */,/*24719*/14595/* C90D */,/*24720*/14595/* C90E */, /*24721*/14595/* C90F */,/*24722*/14595/* C910 */,/*24723*/14595/* C911 */,/*24724*/14595/* C912 */, /*24725*/14595/* C913 */,/*24726*/14595/* C914 */,/*24727*/14595/* C915 */,/*24728*/14595/* C916 */, /*24729*/14595/* C917 */,/*24730*/14594/* C918 */,/*24731*/14595/* C919 */,/*24732*/14595/* C91A */, /*24733*/14595/* C91B */,/*24734*/14595/* C91C */,/*24735*/14595/* C91D */,/*24736*/14595/* C91E */, /*24737*/14595/* C91F */,/*24738*/14595/* C920 */,/*24739*/14595/* C921 */,/*24740*/14595/* C922 */, /*24741*/14595/* C923 */,/*24742*/14595/* C924 */,/*24743*/14595/* C925 */,/*24744*/14595/* C926 */, /*24745*/14595/* C927 */,/*24746*/14595/* C928 */,/*24747*/14595/* C929 */,/*24748*/14595/* C92A */, /*24749*/14595/* C92B */,/*24750*/14595/* C92C */,/*24751*/14595/* C92D */,/*24752*/14595/* C92E */, /*24753*/14595/* C92F */,/*24754*/14595/* C930 */,/*24755*/14595/* C931 */,/*24756*/14595/* C932 */, /*24757*/14595/* C933 */,/*24758*/14594/* C934 */,/*24759*/14595/* C935 */,/*24760*/14595/* C936 */, /*24761*/14595/* C937 */,/*24762*/14595/* C938 */,/*24763*/14595/* C939 */,/*24764*/14595/* C93A */, /*24765*/14595/* C93B */,/*24766*/14595/* C93C */,/*24767*/14595/* C93D */,/*24768*/14595/* C93E */, /*24769*/14595/* C93F */,/*24770*/14595/* C940 */,/*24771*/14595/* C941 */,/*24772*/14595/* C942 */, /*24773*/14595/* C943 */,/*24774*/14595/* C944 */,/*24775*/14595/* C945 */,/*24776*/14595/* C946 */, /*24777*/14595/* C947 */,/*24778*/14595/* C948 */,/*24779*/14595/* C949 */,/*24780*/14595/* C94A */, /*24781*/14595/* C94B */,/*24782*/14595/* C94C */,/*24783*/14595/* C94D */,/*24784*/14595/* C94E */, /*24785*/14595/* C94F */,/*24786*/14594/* C950 */,/*24787*/14595/* C951 */,/*24788*/14595/* C952 */, /*24789*/14595/* C953 */,/*24790*/14595/* C954 */,/*24791*/14595/* C955 */,/*24792*/14595/* C956 */, /*24793*/14595/* C957 */,/*24794*/14595/* C958 */,/*24795*/14595/* C959 */,/*24796*/14595/* C95A */, /*24797*/14595/* C95B */,/*24798*/14595/* C95C */,/*24799*/14595/* C95D */,/*24800*/14595/* C95E */, /*24801*/14595/* C95F */,/*24802*/14595/* C960 */,/*24803*/14595/* C961 */,/*24804*/14595/* C962 */, /*24805*/14595/* C963 */,/*24806*/14595/* C964 */,/*24807*/14595/* C965 */,/*24808*/14595/* C966 */, /*24809*/14595/* C967 */,/*24810*/14595/* C968 */,/*24811*/14595/* C969 */,/*24812*/14595/* C96A */, /*24813*/14595/* C96B */,/*24814*/14594/* C96C */,/*24815*/14595/* C96D */,/*24816*/14595/* C96E */, /*24817*/14595/* C96F */,/*24818*/14595/* C970 */,/*24819*/14595/* C971 */,/*24820*/14595/* C972 */, /*24821*/14595/* C973 */,/*24822*/14595/* C974 */,/*24823*/14595/* C975 */,/*24824*/14595/* C976 */, /*24825*/14595/* C977 */,/*24826*/14595/* C978 */,/*24827*/14595/* C979 */,/*24828*/14595/* C97A */, /*24829*/14595/* C97B */,/*24830*/14595/* C97C */,/*24831*/14595/* C97D */,/*24832*/14595/* C97E */, /*24833*/14595/* C97F */,/*24834*/14595/* C980 */,/*24835*/14595/* C981 */,/*24836*/14595/* C982 */, /*24837*/14595/* C983 */,/*24838*/14595/* C984 */,/*24839*/14595/* C985 */,/*24840*/14595/* C986 */, /*24841*/14595/* C987 */,/*24842*/14594/* C988 */,/*24843*/14595/* C989 */,/*24844*/14595/* C98A */, /*24845*/14595/* C98B */,/*24846*/14595/* C98C */,/*24847*/14595/* C98D */,/*24848*/14595/* C98E */, /*24849*/14595/* C98F */,/*24850*/14595/* C990 */,/*24851*/14595/* C991 */,/*24852*/14595/* C992 */, /*24853*/14595/* C993 */,/*24854*/14595/* C994 */,/*24855*/14595/* C995 */,/*24856*/14595/* C996 */, /*24857*/14595/* C997 */,/*24858*/14595/* C998 */,/*24859*/14595/* C999 */,/*24860*/14595/* C99A */, /*24861*/14595/* C99B */,/*24862*/14595/* C99C */,/*24863*/14595/* C99D */,/*24864*/14595/* C99E */, /*24865*/14595/* C99F */,/*24866*/14595/* C9A0 */,/*24867*/14595/* C9A1 */,/*24868*/14595/* C9A2 */, /*24869*/14595/* C9A3 */,/*24870*/14594/* C9A4 */,/*24871*/14595/* C9A5 */,/*24872*/14595/* C9A6 */, /*24873*/14595/* C9A7 */,/*24874*/14595/* C9A8 */,/*24875*/14595/* C9A9 */,/*24876*/14595/* C9AA */, /*24877*/14595/* C9AB */,/*24878*/14595/* C9AC */,/*24879*/14595/* C9AD */,/*24880*/14595/* C9AE */, /*24881*/14595/* C9AF */,/*24882*/14595/* C9B0 */,/*24883*/14595/* C9B1 */,/*24884*/14595/* C9B2 */, /*24885*/14595/* C9B3 */,/*24886*/14595/* C9B4 */,/*24887*/14595/* C9B5 */,/*24888*/14595/* C9B6 */, /*24889*/14595/* C9B7 */,/*24890*/14595/* C9B8 */,/*24891*/14595/* C9B9 */,/*24892*/14595/* C9BA */, /*24893*/14595/* C9BB */,/*24894*/14595/* C9BC */,/*24895*/14595/* C9BD */,/*24896*/14595/* C9BE */, /*24897*/14595/* C9BF */,/*24898*/14594/* C9C0 */,/*24899*/14595/* C9C1 */,/*24900*/14595/* C9C2 */, /*24901*/14595/* C9C3 */,/*24902*/14595/* C9C4 */,/*24903*/14595/* C9C5 */,/*24904*/14595/* C9C6 */, /*24905*/14595/* C9C7 */,/*24906*/14595/* C9C8 */,/*24907*/14595/* C9C9 */,/*24908*/14595/* C9CA */, /*24909*/14595/* C9CB */,/*24910*/14595/* C9CC */,/*24911*/14595/* C9CD */,/*24912*/14595/* C9CE */, /*24913*/14595/* C9CF */,/*24914*/14595/* C9D0 */,/*24915*/14595/* C9D1 */,/*24916*/14595/* C9D2 */, /*24917*/14595/* C9D3 */,/*24918*/14595/* C9D4 */,/*24919*/14595/* C9D5 */,/*24920*/14595/* C9D6 */, /*24921*/14595/* C9D7 */,/*24922*/14595/* C9D8 */,/*24923*/14595/* C9D9 */,/*24924*/14595/* C9DA */, /*24925*/14595/* C9DB */,/*24926*/14594/* C9DC */,/*24927*/14595/* C9DD */,/*24928*/14595/* C9DE */, /*24929*/14595/* C9DF */,/*24930*/14595/* C9E0 */,/*24931*/14595/* C9E1 */,/*24932*/14595/* C9E2 */, /*24933*/14595/* C9E3 */,/*24934*/14595/* C9E4 */,/*24935*/14595/* C9E5 */,/*24936*/14595/* C9E6 */, /*24937*/14595/* C9E7 */,/*24938*/14595/* C9E8 */,/*24939*/14595/* C9E9 */,/*24940*/14595/* C9EA */, /*24941*/14595/* C9EB */,/*24942*/14595/* C9EC */,/*24943*/14595/* C9ED */,/*24944*/14595/* C9EE */, /*24945*/14595/* C9EF */,/*24946*/14595/* C9F0 */,/*24947*/14595/* C9F1 */,/*24948*/14595/* C9F2 */, /*24949*/14595/* C9F3 */,/*24950*/14595/* C9F4 */,/*24951*/14595/* C9F5 */,/*24952*/14595/* C9F6 */, /*24953*/14595/* C9F7 */,/*24954*/14594/* C9F8 */,/*24955*/14595/* C9F9 */,/*24956*/14595/* C9FA */, /*24957*/14595/* C9FB */,/*24958*/14595/* C9FC */,/*24959*/14595/* C9FD */,/*24960*/14595/* C9FE */, /*24961*/14595/* C9FF */,/*24962*/14595/* CA00 */,/*24963*/14595/* CA01 */,/*24964*/14595/* CA02 */, /*24965*/14595/* CA03 */,/*24966*/14595/* CA04 */,/*24967*/14595/* CA05 */,/*24968*/14595/* CA06 */, /*24969*/14595/* CA07 */,/*24970*/14595/* CA08 */,/*24971*/14595/* CA09 */,/*24972*/14595/* CA0A */, /*24973*/14595/* CA0B */,/*24974*/14595/* CA0C */,/*24975*/14595/* CA0D */,/*24976*/14595/* CA0E */, /*24977*/14595/* CA0F */,/*24978*/14595/* CA10 */,/*24979*/14595/* CA11 */,/*24980*/14595/* CA12 */, /*24981*/14595/* CA13 */,/*24982*/14594/* CA14 */,/*24983*/14595/* CA15 */,/*24984*/14595/* CA16 */, /*24985*/14595/* CA17 */,/*24986*/14595/* CA18 */,/*24987*/14595/* CA19 */,/*24988*/14595/* CA1A */, /*24989*/14595/* CA1B */,/*24990*/14595/* CA1C */,/*24991*/14595/* CA1D */,/*24992*/14595/* CA1E */, /*24993*/14595/* CA1F */,/*24994*/14595/* CA20 */,/*24995*/14595/* CA21 */,/*24996*/14595/* CA22 */, /*24997*/14595/* CA23 */,/*24998*/14595/* CA24 */,/*24999*/14595/* CA25 */,/*25000*/14595/* CA26 */, /*25001*/14595/* CA27 */,/*25002*/14595/* CA28 */,/*25003*/14595/* CA29 */,/*25004*/14595/* CA2A */, /*25005*/14595/* CA2B */,/*25006*/14595/* CA2C */,/*25007*/14595/* CA2D */,/*25008*/14595/* CA2E */, /*25009*/14595/* CA2F */,/*25010*/14594/* CA30 */,/*25011*/14595/* CA31 */,/*25012*/14595/* CA32 */, /*25013*/14595/* CA33 */,/*25014*/14595/* CA34 */,/*25015*/14595/* CA35 */,/*25016*/14595/* CA36 */, /*25017*/14595/* CA37 */,/*25018*/14595/* CA38 */,/*25019*/14595/* CA39 */,/*25020*/14595/* CA3A */, /*25021*/14595/* CA3B */,/*25022*/14595/* CA3C */,/*25023*/14595/* CA3D */,/*25024*/14595/* CA3E */, /*25025*/14595/* CA3F */,/*25026*/14595/* CA40 */,/*25027*/14595/* CA41 */,/*25028*/14595/* CA42 */, /*25029*/14595/* CA43 */,/*25030*/14595/* CA44 */,/*25031*/14595/* CA45 */,/*25032*/14595/* CA46 */, /*25033*/14595/* CA47 */,/*25034*/14595/* CA48 */,/*25035*/14595/* CA49 */,/*25036*/14595/* CA4A */, /*25037*/14595/* CA4B */,/*25038*/14594/* CA4C */,/*25039*/14595/* CA4D */,/*25040*/14595/* CA4E */, /*25041*/14595/* CA4F */,/*25042*/14595/* CA50 */,/*25043*/14595/* CA51 */,/*25044*/14595/* CA52 */, /*25045*/14595/* CA53 */,/*25046*/14595/* CA54 */,/*25047*/14595/* CA55 */,/*25048*/14595/* CA56 */, /*25049*/14595/* CA57 */,/*25050*/14595/* CA58 */,/*25051*/14595/* CA59 */,/*25052*/14595/* CA5A */, /*25053*/14595/* CA5B */,/*25054*/14595/* CA5C */,/*25055*/14595/* CA5D */,/*25056*/14595/* CA5E */, /*25057*/14595/* CA5F */,/*25058*/14595/* CA60 */,/*25059*/14595/* CA61 */,/*25060*/14595/* CA62 */, /*25061*/14595/* CA63 */,/*25062*/14595/* CA64 */,/*25063*/14595/* CA65 */,/*25064*/14595/* CA66 */, /*25065*/14595/* CA67 */,/*25066*/14594/* CA68 */,/*25067*/14595/* CA69 */,/*25068*/14595/* CA6A */, /*25069*/14595/* CA6B */,/*25070*/14595/* CA6C */,/*25071*/14595/* CA6D */,/*25072*/14595/* CA6E */, /*25073*/14595/* CA6F */,/*25074*/14595/* CA70 */,/*25075*/14595/* CA71 */,/*25076*/14595/* CA72 */, /*25077*/14595/* CA73 */,/*25078*/14595/* CA74 */,/*25079*/14595/* CA75 */,/*25080*/14595/* CA76 */, /*25081*/14595/* CA77 */,/*25082*/14595/* CA78 */,/*25083*/14595/* CA79 */,/*25084*/14595/* CA7A */, /*25085*/14595/* CA7B */,/*25086*/14595/* CA7C */,/*25087*/14595/* CA7D */,/*25088*/14595/* CA7E */, /*25089*/14595/* CA7F */,/*25090*/14595/* CA80 */,/*25091*/14595/* CA81 */,/*25092*/14595/* CA82 */, /*25093*/14595/* CA83 */,/*25094*/14594/* CA84 */,/*25095*/14595/* CA85 */,/*25096*/14595/* CA86 */, /*25097*/14595/* CA87 */,/*25098*/14595/* CA88 */,/*25099*/14595/* CA89 */,/*25100*/14595/* CA8A */, /*25101*/14595/* CA8B */,/*25102*/14595/* CA8C */,/*25103*/14595/* CA8D */,/*25104*/14595/* CA8E */, /*25105*/14595/* CA8F */,/*25106*/14595/* CA90 */,/*25107*/14595/* CA91 */,/*25108*/14595/* CA92 */, /*25109*/14595/* CA93 */,/*25110*/14595/* CA94 */,/*25111*/14595/* CA95 */,/*25112*/14595/* CA96 */, /*25113*/14595/* CA97 */,/*25114*/14595/* CA98 */,/*25115*/14595/* CA99 */,/*25116*/14595/* CA9A */, /*25117*/14595/* CA9B */,/*25118*/14595/* CA9C */,/*25119*/14595/* CA9D */,/*25120*/14595/* CA9E */, /*25121*/14595/* CA9F */,/*25122*/14594/* CAA0 */,/*25123*/14595/* CAA1 */,/*25124*/14595/* CAA2 */, /*25125*/14595/* CAA3 */,/*25126*/14595/* CAA4 */,/*25127*/14595/* CAA5 */,/*25128*/14595/* CAA6 */, /*25129*/14595/* CAA7 */,/*25130*/14595/* CAA8 */,/*25131*/14595/* CAA9 */,/*25132*/14595/* CAAA */, /*25133*/14595/* CAAB */,/*25134*/14595/* CAAC */,/*25135*/14595/* CAAD */,/*25136*/14595/* CAAE */, /*25137*/14595/* CAAF */,/*25138*/14595/* CAB0 */,/*25139*/14595/* CAB1 */,/*25140*/14595/* CAB2 */, /*25141*/14595/* CAB3 */,/*25142*/14595/* CAB4 */,/*25143*/14595/* CAB5 */,/*25144*/14595/* CAB6 */, /*25145*/14595/* CAB7 */,/*25146*/14595/* CAB8 */,/*25147*/14595/* CAB9 */,/*25148*/14595/* CABA */, /*25149*/14595/* CABB */,/*25150*/14594/* CABC */,/*25151*/14595/* CABD */,/*25152*/14595/* CABE */, /*25153*/14595/* CABF */,/*25154*/14595/* CAC0 */,/*25155*/14595/* CAC1 */,/*25156*/14595/* CAC2 */, /*25157*/14595/* CAC3 */,/*25158*/14595/* CAC4 */,/*25159*/14595/* CAC5 */,/*25160*/14595/* CAC6 */, /*25161*/14595/* CAC7 */,/*25162*/14595/* CAC8 */,/*25163*/14595/* CAC9 */,/*25164*/14595/* CACA */, /*25165*/14595/* CACB */,/*25166*/14595/* CACC */,/*25167*/14595/* CACD */,/*25168*/14595/* CACE */, /*25169*/14595/* CACF */,/*25170*/14595/* CAD0 */,/*25171*/14595/* CAD1 */,/*25172*/14595/* CAD2 */, /*25173*/14595/* CAD3 */,/*25174*/14595/* CAD4 */,/*25175*/14595/* CAD5 */,/*25176*/14595/* CAD6 */, /*25177*/14595/* CAD7 */,/*25178*/14594/* CAD8 */,/*25179*/14595/* CAD9 */,/*25180*/14595/* CADA */, /*25181*/14595/* CADB */,/*25182*/14595/* CADC */,/*25183*/14595/* CADD */,/*25184*/14595/* CADE */, /*25185*/14595/* CADF */,/*25186*/14595/* CAE0 */,/*25187*/14595/* CAE1 */,/*25188*/14595/* CAE2 */, /*25189*/14595/* CAE3 */,/*25190*/14595/* CAE4 */,/*25191*/14595/* CAE5 */,/*25192*/14595/* CAE6 */, /*25193*/14595/* CAE7 */,/*25194*/14595/* CAE8 */,/*25195*/14595/* CAE9 */,/*25196*/14595/* CAEA */, /*25197*/14595/* CAEB */,/*25198*/14595/* CAEC */,/*25199*/14595/* CAED */,/*25200*/14595/* CAEE */, /*25201*/14595/* CAEF */,/*25202*/14595/* CAF0 */,/*25203*/14595/* CAF1 */,/*25204*/14595/* CAF2 */, /*25205*/14595/* CAF3 */,/*25206*/14594/* CAF4 */,/*25207*/14595/* CAF5 */,/*25208*/14595/* CAF6 */, /*25209*/14595/* CAF7 */,/*25210*/14595/* CAF8 */,/*25211*/14595/* CAF9 */,/*25212*/14595/* CAFA */, /*25213*/14595/* CAFB */,/*25214*/14595/* CAFC */,/*25215*/14595/* CAFD */,/*25216*/14595/* CAFE */, /*25217*/14595/* CAFF */,/*25218*/14595/* CB00 */,/*25219*/14595/* CB01 */,/*25220*/14595/* CB02 */, /*25221*/14595/* CB03 */,/*25222*/14595/* CB04 */,/*25223*/14595/* CB05 */,/*25224*/14595/* CB06 */, /*25225*/14595/* CB07 */,/*25226*/14595/* CB08 */,/*25227*/14595/* CB09 */,/*25228*/14595/* CB0A */, /*25229*/14595/* CB0B */,/*25230*/14595/* CB0C */,/*25231*/14595/* CB0D */,/*25232*/14595/* CB0E */, /*25233*/14595/* CB0F */,/*25234*/14594/* CB10 */,/*25235*/14595/* CB11 */,/*25236*/14595/* CB12 */, /*25237*/14595/* CB13 */,/*25238*/14595/* CB14 */,/*25239*/14595/* CB15 */,/*25240*/14595/* CB16 */, /*25241*/14595/* CB17 */,/*25242*/14595/* CB18 */,/*25243*/14595/* CB19 */,/*25244*/14595/* CB1A */, /*25245*/14595/* CB1B */,/*25246*/14595/* CB1C */,/*25247*/14595/* CB1D */,/*25248*/14595/* CB1E */, /*25249*/14595/* CB1F */,/*25250*/14595/* CB20 */,/*25251*/14595/* CB21 */,/*25252*/14595/* CB22 */, /*25253*/14595/* CB23 */,/*25254*/14595/* CB24 */,/*25255*/14595/* CB25 */,/*25256*/14595/* CB26 */, /*25257*/14595/* CB27 */,/*25258*/14595/* CB28 */,/*25259*/14595/* CB29 */,/*25260*/14595/* CB2A */, /*25261*/14595/* CB2B */,/*25262*/14594/* CB2C */,/*25263*/14595/* CB2D */,/*25264*/14595/* CB2E */, /*25265*/14595/* CB2F */,/*25266*/14595/* CB30 */,/*25267*/14595/* CB31 */,/*25268*/14595/* CB32 */, /*25269*/14595/* CB33 */,/*25270*/14595/* CB34 */,/*25271*/14595/* CB35 */,/*25272*/14595/* CB36 */, /*25273*/14595/* CB37 */,/*25274*/14595/* CB38 */,/*25275*/14595/* CB39 */,/*25276*/14595/* CB3A */, /*25277*/14595/* CB3B */,/*25278*/14595/* CB3C */,/*25279*/14595/* CB3D */,/*25280*/14595/* CB3E */, /*25281*/14595/* CB3F */,/*25282*/14595/* CB40 */,/*25283*/14595/* CB41 */,/*25284*/14595/* CB42 */, /*25285*/14595/* CB43 */,/*25286*/14595/* CB44 */,/*25287*/14595/* CB45 */,/*25288*/14595/* CB46 */, /*25289*/14595/* CB47 */,/*25290*/14594/* CB48 */,/*25291*/14595/* CB49 */,/*25292*/14595/* CB4A */, /*25293*/14595/* CB4B */,/*25294*/14595/* CB4C */,/*25295*/14595/* CB4D */,/*25296*/14595/* CB4E */, /*25297*/14595/* CB4F */,/*25298*/14595/* CB50 */,/*25299*/14595/* CB51 */,/*25300*/14595/* CB52 */, /*25301*/14595/* CB53 */,/*25302*/14595/* CB54 */,/*25303*/14595/* CB55 */,/*25304*/14595/* CB56 */, /*25305*/14595/* CB57 */,/*25306*/14595/* CB58 */,/*25307*/14595/* CB59 */,/*25308*/14595/* CB5A */, /*25309*/14595/* CB5B */,/*25310*/14595/* CB5C */,/*25311*/14595/* CB5D */,/*25312*/14595/* CB5E */, /*25313*/14595/* CB5F */,/*25314*/14595/* CB60 */,/*25315*/14595/* CB61 */,/*25316*/14595/* CB62 */, /*25317*/14595/* CB63 */,/*25318*/14594/* CB64 */,/*25319*/14595/* CB65 */,/*25320*/14595/* CB66 */, /*25321*/14595/* CB67 */,/*25322*/14595/* CB68 */,/*25323*/14595/* CB69 */,/*25324*/14595/* CB6A */, /*25325*/14595/* CB6B */,/*25326*/14595/* CB6C */,/*25327*/14595/* CB6D */,/*25328*/14595/* CB6E */, /*25329*/14595/* CB6F */,/*25330*/14595/* CB70 */,/*25331*/14595/* CB71 */,/*25332*/14595/* CB72 */, /*25333*/14595/* CB73 */,/*25334*/14595/* CB74 */,/*25335*/14595/* CB75 */,/*25336*/14595/* CB76 */, /*25337*/14595/* CB77 */,/*25338*/14595/* CB78 */,/*25339*/14595/* CB79 */,/*25340*/14595/* CB7A */, /*25341*/14595/* CB7B */,/*25342*/14595/* CB7C */,/*25343*/14595/* CB7D */,/*25344*/14595/* CB7E */, /*25345*/14595/* CB7F */,/*25346*/14594/* CB80 */,/*25347*/14595/* CB81 */,/*25348*/14595/* CB82 */, /*25349*/14595/* CB83 */,/*25350*/14595/* CB84 */,/*25351*/14595/* CB85 */,/*25352*/14595/* CB86 */, /*25353*/14595/* CB87 */,/*25354*/14595/* CB88 */,/*25355*/14595/* CB89 */,/*25356*/14595/* CB8A */, /*25357*/14595/* CB8B */,/*25358*/14595/* CB8C */,/*25359*/14595/* CB8D */,/*25360*/14595/* CB8E */, /*25361*/14595/* CB8F */,/*25362*/14595/* CB90 */,/*25363*/14595/* CB91 */,/*25364*/14595/* CB92 */, /*25365*/14595/* CB93 */,/*25366*/14595/* CB94 */,/*25367*/14595/* CB95 */,/*25368*/14595/* CB96 */, /*25369*/14595/* CB97 */,/*25370*/14595/* CB98 */,/*25371*/14595/* CB99 */,/*25372*/14595/* CB9A */, /*25373*/14595/* CB9B */,/*25374*/14594/* CB9C */,/*25375*/14595/* CB9D */,/*25376*/14595/* CB9E */, /*25377*/14595/* CB9F */,/*25378*/14595/* CBA0 */,/*25379*/14595/* CBA1 */,/*25380*/14595/* CBA2 */, /*25381*/14595/* CBA3 */,/*25382*/14595/* CBA4 */,/*25383*/14595/* CBA5 */,/*25384*/14595/* CBA6 */, /*25385*/14595/* CBA7 */,/*25386*/14595/* CBA8 */,/*25387*/14595/* CBA9 */,/*25388*/14595/* CBAA */, /*25389*/14595/* CBAB */,/*25390*/14595/* CBAC */,/*25391*/14595/* CBAD */,/*25392*/14595/* CBAE */, /*25393*/14595/* CBAF */,/*25394*/14595/* CBB0 */,/*25395*/14595/* CBB1 */,/*25396*/14595/* CBB2 */, /*25397*/14595/* CBB3 */,/*25398*/14595/* CBB4 */,/*25399*/14595/* CBB5 */,/*25400*/14595/* CBB6 */, /*25401*/14595/* CBB7 */,/*25402*/14594/* CBB8 */,/*25403*/14595/* CBB9 */,/*25404*/14595/* CBBA */, /*25405*/14595/* CBBB */,/*25406*/14595/* CBBC */,/*25407*/14595/* CBBD */,/*25408*/14595/* CBBE */, /*25409*/14595/* CBBF */,/*25410*/14595/* CBC0 */,/*25411*/14595/* CBC1 */,/*25412*/14595/* CBC2 */, /*25413*/14595/* CBC3 */,/*25414*/14595/* CBC4 */,/*25415*/14595/* CBC5 */,/*25416*/14595/* CBC6 */, /*25417*/14595/* CBC7 */,/*25418*/14595/* CBC8 */,/*25419*/14595/* CBC9 */,/*25420*/14595/* CBCA */, /*25421*/14595/* CBCB */,/*25422*/14595/* CBCC */,/*25423*/14595/* CBCD */,/*25424*/14595/* CBCE */, /*25425*/14595/* CBCF */,/*25426*/14595/* CBD0 */,/*25427*/14595/* CBD1 */,/*25428*/14595/* CBD2 */, /*25429*/14595/* CBD3 */,/*25430*/14594/* CBD4 */,/*25431*/14595/* CBD5 */,/*25432*/14595/* CBD6 */, /*25433*/14595/* CBD7 */,/*25434*/14595/* CBD8 */,/*25435*/14595/* CBD9 */,/*25436*/14595/* CBDA */, /*25437*/14595/* CBDB */,/*25438*/14595/* CBDC */,/*25439*/14595/* CBDD */,/*25440*/14595/* CBDE */, /*25441*/14595/* CBDF */,/*25442*/14595/* CBE0 */,/*25443*/14595/* CBE1 */,/*25444*/14595/* CBE2 */, /*25445*/14595/* CBE3 */,/*25446*/14595/* CBE4 */,/*25447*/14595/* CBE5 */,/*25448*/14595/* CBE6 */, /*25449*/14595/* CBE7 */,/*25450*/14595/* CBE8 */,/*25451*/14595/* CBE9 */,/*25452*/14595/* CBEA */, /*25453*/14595/* CBEB */,/*25454*/14595/* CBEC */,/*25455*/14595/* CBED */,/*25456*/14595/* CBEE */, /*25457*/14595/* CBEF */,/*25458*/14594/* CBF0 */,/*25459*/14595/* CBF1 */,/*25460*/14595/* CBF2 */, /*25461*/14595/* CBF3 */,/*25462*/14595/* CBF4 */,/*25463*/14595/* CBF5 */,/*25464*/14595/* CBF6 */, /*25465*/14595/* CBF7 */,/*25466*/14595/* CBF8 */,/*25467*/14595/* CBF9 */,/*25468*/14595/* CBFA */, /*25469*/14595/* CBFB */,/*25470*/14595/* CBFC */,/*25471*/14595/* CBFD */,/*25472*/14595/* CBFE */, /*25473*/14595/* CBFF */,/*25474*/14595/* CC00 */,/*25475*/14595/* CC01 */,/*25476*/14595/* CC02 */, /*25477*/14595/* CC03 */,/*25478*/14595/* CC04 */,/*25479*/14595/* CC05 */,/*25480*/14595/* CC06 */, /*25481*/14595/* CC07 */,/*25482*/14595/* CC08 */,/*25483*/14595/* CC09 */,/*25484*/14595/* CC0A */, /*25485*/14595/* CC0B */,/*25486*/14594/* CC0C */,/*25487*/14595/* CC0D */,/*25488*/14595/* CC0E */, /*25489*/14595/* CC0F */,/*25490*/14595/* CC10 */,/*25491*/14595/* CC11 */,/*25492*/14595/* CC12 */, /*25493*/14595/* CC13 */,/*25494*/14595/* CC14 */,/*25495*/14595/* CC15 */,/*25496*/14595/* CC16 */, /*25497*/14595/* CC17 */,/*25498*/14595/* CC18 */,/*25499*/14595/* CC19 */,/*25500*/14595/* CC1A */, /*25501*/14595/* CC1B */,/*25502*/14595/* CC1C */,/*25503*/14595/* CC1D */,/*25504*/14595/* CC1E */, /*25505*/14595/* CC1F */,/*25506*/14595/* CC20 */,/*25507*/14595/* CC21 */,/*25508*/14595/* CC22 */, /*25509*/14595/* CC23 */,/*25510*/14595/* CC24 */,/*25511*/14595/* CC25 */,/*25512*/14595/* CC26 */, /*25513*/14595/* CC27 */,/*25514*/14594/* CC28 */,/*25515*/14595/* CC29 */,/*25516*/14595/* CC2A */, /*25517*/14595/* CC2B */,/*25518*/14595/* CC2C */,/*25519*/14595/* CC2D */,/*25520*/14595/* CC2E */, /*25521*/14595/* CC2F */,/*25522*/14595/* CC30 */,/*25523*/14595/* CC31 */,/*25524*/14595/* CC32 */, /*25525*/14595/* CC33 */,/*25526*/14595/* CC34 */,/*25527*/14595/* CC35 */,/*25528*/14595/* CC36 */, /*25529*/14595/* CC37 */,/*25530*/14595/* CC38 */,/*25531*/14595/* CC39 */,/*25532*/14595/* CC3A */, /*25533*/14595/* CC3B */,/*25534*/14595/* CC3C */,/*25535*/14595/* CC3D */,/*25536*/14595/* CC3E */, /*25537*/14595/* CC3F */,/*25538*/14595/* CC40 */,/*25539*/14595/* CC41 */,/*25540*/14595/* CC42 */, /*25541*/14595/* CC43 */,/*25542*/14594/* CC44 */,/*25543*/14595/* CC45 */,/*25544*/14595/* CC46 */, /*25545*/14595/* CC47 */,/*25546*/14595/* CC48 */,/*25547*/14595/* CC49 */,/*25548*/14595/* CC4A */, /*25549*/14595/* CC4B */,/*25550*/14595/* CC4C */,/*25551*/14595/* CC4D */,/*25552*/14595/* CC4E */, /*25553*/14595/* CC4F */,/*25554*/14595/* CC50 */,/*25555*/14595/* CC51 */,/*25556*/14595/* CC52 */, /*25557*/14595/* CC53 */,/*25558*/14595/* CC54 */,/*25559*/14595/* CC55 */,/*25560*/14595/* CC56 */, /*25561*/14595/* CC57 */,/*25562*/14595/* CC58 */,/*25563*/14595/* CC59 */,/*25564*/14595/* CC5A */, /*25565*/14595/* CC5B */,/*25566*/14595/* CC5C */,/*25567*/14595/* CC5D */,/*25568*/14595/* CC5E */, /*25569*/14595/* CC5F */,/*25570*/14594/* CC60 */,/*25571*/14595/* CC61 */,/*25572*/14595/* CC62 */, /*25573*/14595/* CC63 */,/*25574*/14595/* CC64 */,/*25575*/14595/* CC65 */,/*25576*/14595/* CC66 */, /*25577*/14595/* CC67 */,/*25578*/14595/* CC68 */,/*25579*/14595/* CC69 */,/*25580*/14595/* CC6A */, /*25581*/14595/* CC6B */,/*25582*/14595/* CC6C */,/*25583*/14595/* CC6D */,/*25584*/14595/* CC6E */, /*25585*/14595/* CC6F */,/*25586*/14595/* CC70 */,/*25587*/14595/* CC71 */,/*25588*/14595/* CC72 */, /*25589*/14595/* CC73 */,/*25590*/14595/* CC74 */,/*25591*/14595/* CC75 */,/*25592*/14595/* CC76 */, /*25593*/14595/* CC77 */,/*25594*/14595/* CC78 */,/*25595*/14595/* CC79 */,/*25596*/14595/* CC7A */, /*25597*/14595/* CC7B */,/*25598*/14594/* CC7C */,/*25599*/14595/* CC7D */,/*25600*/14595/* CC7E */, /*25601*/14595/* CC7F */,/*25602*/14595/* CC80 */,/*25603*/14595/* CC81 */,/*25604*/14595/* CC82 */, /*25605*/14595/* CC83 */,/*25606*/14595/* CC84 */,/*25607*/14595/* CC85 */,/*25608*/14595/* CC86 */, /*25609*/14595/* CC87 */,/*25610*/14595/* CC88 */,/*25611*/14595/* CC89 */,/*25612*/14595/* CC8A */, /*25613*/14595/* CC8B */,/*25614*/14595/* CC8C */,/*25615*/14595/* CC8D */,/*25616*/14595/* CC8E */, /*25617*/14595/* CC8F */,/*25618*/14595/* CC90 */,/*25619*/14595/* CC91 */,/*25620*/14595/* CC92 */, /*25621*/14595/* CC93 */,/*25622*/14595/* CC94 */,/*25623*/14595/* CC95 */,/*25624*/14595/* CC96 */, /*25625*/14595/* CC97 */,/*25626*/14594/* CC98 */,/*25627*/14595/* CC99 */,/*25628*/14595/* CC9A */, /*25629*/14595/* CC9B */,/*25630*/14595/* CC9C */,/*25631*/14595/* CC9D */,/*25632*/14595/* CC9E */, /*25633*/14595/* CC9F */,/*25634*/14595/* CCA0 */,/*25635*/14595/* CCA1 */,/*25636*/14595/* CCA2 */, /*25637*/14595/* CCA3 */,/*25638*/14595/* CCA4 */,/*25639*/14595/* CCA5 */,/*25640*/14595/* CCA6 */, /*25641*/14595/* CCA7 */,/*25642*/14595/* CCA8 */,/*25643*/14595/* CCA9 */,/*25644*/14595/* CCAA */, /*25645*/14595/* CCAB */,/*25646*/14595/* CCAC */,/*25647*/14595/* CCAD */,/*25648*/14595/* CCAE */, /*25649*/14595/* CCAF */,/*25650*/14595/* CCB0 */,/*25651*/14595/* CCB1 */,/*25652*/14595/* CCB2 */, /*25653*/14595/* CCB3 */,/*25654*/14594/* CCB4 */,/*25655*/14595/* CCB5 */,/*25656*/14595/* CCB6 */, /*25657*/14595/* CCB7 */,/*25658*/14595/* CCB8 */,/*25659*/14595/* CCB9 */,/*25660*/14595/* CCBA */, /*25661*/14595/* CCBB */,/*25662*/14595/* CCBC */,/*25663*/14595/* CCBD */,/*25664*/14595/* CCBE */, /*25665*/14595/* CCBF */,/*25666*/14595/* CCC0 */,/*25667*/14595/* CCC1 */,/*25668*/14595/* CCC2 */, /*25669*/14595/* CCC3 */,/*25670*/14595/* CCC4 */,/*25671*/14595/* CCC5 */,/*25672*/14595/* CCC6 */, /*25673*/14595/* CCC7 */,/*25674*/14595/* CCC8 */,/*25675*/14595/* CCC9 */,/*25676*/14595/* CCCA */, /*25677*/14595/* CCCB */,/*25678*/14595/* CCCC */,/*25679*/14595/* CCCD */,/*25680*/14595/* CCCE */, /*25681*/14595/* CCCF */,/*25682*/14594/* CCD0 */,/*25683*/14595/* CCD1 */,/*25684*/14595/* CCD2 */, /*25685*/14595/* CCD3 */,/*25686*/14595/* CCD4 */,/*25687*/14595/* CCD5 */,/*25688*/14595/* CCD6 */, /*25689*/14595/* CCD7 */,/*25690*/14595/* CCD8 */,/*25691*/14595/* CCD9 */,/*25692*/14595/* CCDA */, /*25693*/14595/* CCDB */,/*25694*/14595/* CCDC */,/*25695*/14595/* CCDD */,/*25696*/14595/* CCDE */, /*25697*/14595/* CCDF */,/*25698*/14595/* CCE0 */,/*25699*/14595/* CCE1 */,/*25700*/14595/* CCE2 */, /*25701*/14595/* CCE3 */,/*25702*/14595/* CCE4 */,/*25703*/14595/* CCE5 */,/*25704*/14595/* CCE6 */, /*25705*/14595/* CCE7 */,/*25706*/14595/* CCE8 */,/*25707*/14595/* CCE9 */,/*25708*/14595/* CCEA */, /*25709*/14595/* CCEB */,/*25710*/14594/* CCEC */,/*25711*/14595/* CCED */,/*25712*/14595/* CCEE */, /*25713*/14595/* CCEF */,/*25714*/14595/* CCF0 */,/*25715*/14595/* CCF1 */,/*25716*/14595/* CCF2 */, /*25717*/14595/* CCF3 */,/*25718*/14595/* CCF4 */,/*25719*/14595/* CCF5 */,/*25720*/14595/* CCF6 */, /*25721*/14595/* CCF7 */,/*25722*/14595/* CCF8 */,/*25723*/14595/* CCF9 */,/*25724*/14595/* CCFA */, /*25725*/14595/* CCFB */,/*25726*/14595/* CCFC */,/*25727*/14595/* CCFD */,/*25728*/14595/* CCFE */, /*25729*/14595/* CCFF */,/*25730*/14595/* CD00 */,/*25731*/14595/* CD01 */,/*25732*/14595/* CD02 */, /*25733*/14595/* CD03 */,/*25734*/14595/* CD04 */,/*25735*/14595/* CD05 */,/*25736*/14595/* CD06 */, /*25737*/14595/* CD07 */,/*25738*/14594/* CD08 */,/*25739*/14595/* CD09 */,/*25740*/14595/* CD0A */, /*25741*/14595/* CD0B */,/*25742*/14595/* CD0C */,/*25743*/14595/* CD0D */,/*25744*/14595/* CD0E */, /*25745*/14595/* CD0F */,/*25746*/14595/* CD10 */,/*25747*/14595/* CD11 */,/*25748*/14595/* CD12 */, /*25749*/14595/* CD13 */,/*25750*/14595/* CD14 */,/*25751*/14595/* CD15 */,/*25752*/14595/* CD16 */, /*25753*/14595/* CD17 */,/*25754*/14595/* CD18 */,/*25755*/14595/* CD19 */,/*25756*/14595/* CD1A */, /*25757*/14595/* CD1B */,/*25758*/14595/* CD1C */,/*25759*/14595/* CD1D */,/*25760*/14595/* CD1E */, /*25761*/14595/* CD1F */,/*25762*/14595/* CD20 */,/*25763*/14595/* CD21 */,/*25764*/14595/* CD22 */, /*25765*/14595/* CD23 */,/*25766*/14594/* CD24 */,/*25767*/14595/* CD25 */,/*25768*/14595/* CD26 */, /*25769*/14595/* CD27 */,/*25770*/14595/* CD28 */,/*25771*/14595/* CD29 */,/*25772*/14595/* CD2A */, /*25773*/14595/* CD2B */,/*25774*/14595/* CD2C */,/*25775*/14595/* CD2D */,/*25776*/14595/* CD2E */, /*25777*/14595/* CD2F */,/*25778*/14595/* CD30 */,/*25779*/14595/* CD31 */,/*25780*/14595/* CD32 */, /*25781*/14595/* CD33 */,/*25782*/14595/* CD34 */,/*25783*/14595/* CD35 */,/*25784*/14595/* CD36 */, /*25785*/14595/* CD37 */,/*25786*/14595/* CD38 */,/*25787*/14595/* CD39 */,/*25788*/14595/* CD3A */, /*25789*/14595/* CD3B */,/*25790*/14595/* CD3C */,/*25791*/14595/* CD3D */,/*25792*/14595/* CD3E */, /*25793*/14595/* CD3F */,/*25794*/14594/* CD40 */,/*25795*/14595/* CD41 */,/*25796*/14595/* CD42 */, /*25797*/14595/* CD43 */,/*25798*/14595/* CD44 */,/*25799*/14595/* CD45 */,/*25800*/14595/* CD46 */, /*25801*/14595/* CD47 */,/*25802*/14595/* CD48 */,/*25803*/14595/* CD49 */,/*25804*/14595/* CD4A */, /*25805*/14595/* CD4B */,/*25806*/14595/* CD4C */,/*25807*/14595/* CD4D */,/*25808*/14595/* CD4E */, /*25809*/14595/* CD4F */,/*25810*/14595/* CD50 */,/*25811*/14595/* CD51 */,/*25812*/14595/* CD52 */, /*25813*/14595/* CD53 */,/*25814*/14595/* CD54 */,/*25815*/14595/* CD55 */,/*25816*/14595/* CD56 */, /*25817*/14595/* CD57 */,/*25818*/14595/* CD58 */,/*25819*/14595/* CD59 */,/*25820*/14595/* CD5A */, /*25821*/14595/* CD5B */,/*25822*/14594/* CD5C */,/*25823*/14595/* CD5D */,/*25824*/14595/* CD5E */, /*25825*/14595/* CD5F */,/*25826*/14595/* CD60 */,/*25827*/14595/* CD61 */,/*25828*/14595/* CD62 */, /*25829*/14595/* CD63 */,/*25830*/14595/* CD64 */,/*25831*/14595/* CD65 */,/*25832*/14595/* CD66 */, /*25833*/14595/* CD67 */,/*25834*/14595/* CD68 */,/*25835*/14595/* CD69 */,/*25836*/14595/* CD6A */, /*25837*/14595/* CD6B */,/*25838*/14595/* CD6C */,/*25839*/14595/* CD6D */,/*25840*/14595/* CD6E */, /*25841*/14595/* CD6F */,/*25842*/14595/* CD70 */,/*25843*/14595/* CD71 */,/*25844*/14595/* CD72 */, /*25845*/14595/* CD73 */,/*25846*/14595/* CD74 */,/*25847*/14595/* CD75 */,/*25848*/14595/* CD76 */, /*25849*/14595/* CD77 */,/*25850*/14594/* CD78 */,/*25851*/14595/* CD79 */,/*25852*/14595/* CD7A */, /*25853*/14595/* CD7B */,/*25854*/14595/* CD7C */,/*25855*/14595/* CD7D */,/*25856*/14595/* CD7E */, /*25857*/14595/* CD7F */,/*25858*/14595/* CD80 */,/*25859*/14595/* CD81 */,/*25860*/14595/* CD82 */, /*25861*/14595/* CD83 */,/*25862*/14595/* CD84 */,/*25863*/14595/* CD85 */,/*25864*/14595/* CD86 */, /*25865*/14595/* CD87 */,/*25866*/14595/* CD88 */,/*25867*/14595/* CD89 */,/*25868*/14595/* CD8A */, /*25869*/14595/* CD8B */,/*25870*/14595/* CD8C */,/*25871*/14595/* CD8D */,/*25872*/14595/* CD8E */, /*25873*/14595/* CD8F */,/*25874*/14595/* CD90 */,/*25875*/14595/* CD91 */,/*25876*/14595/* CD92 */, /*25877*/14595/* CD93 */,/*25878*/14594/* CD94 */,/*25879*/14595/* CD95 */,/*25880*/14595/* CD96 */, /*25881*/14595/* CD97 */,/*25882*/14595/* CD98 */,/*25883*/14595/* CD99 */,/*25884*/14595/* CD9A */, /*25885*/14595/* CD9B */,/*25886*/14595/* CD9C */,/*25887*/14595/* CD9D */,/*25888*/14595/* CD9E */, /*25889*/14595/* CD9F */,/*25890*/14595/* CDA0 */,/*25891*/14595/* CDA1 */,/*25892*/14595/* CDA2 */, /*25893*/14595/* CDA3 */,/*25894*/14595/* CDA4 */,/*25895*/14595/* CDA5 */,/*25896*/14595/* CDA6 */, /*25897*/14595/* CDA7 */,/*25898*/14595/* CDA8 */,/*25899*/14595/* CDA9 */,/*25900*/14595/* CDAA */, /*25901*/14595/* CDAB */,/*25902*/14595/* CDAC */,/*25903*/14595/* CDAD */,/*25904*/14595/* CDAE */, /*25905*/14595/* CDAF */,/*25906*/14594/* CDB0 */,/*25907*/14595/* CDB1 */,/*25908*/14595/* CDB2 */, /*25909*/14595/* CDB3 */,/*25910*/14595/* CDB4 */,/*25911*/14595/* CDB5 */,/*25912*/14595/* CDB6 */, /*25913*/14595/* CDB7 */,/*25914*/14595/* CDB8 */,/*25915*/14595/* CDB9 */,/*25916*/14595/* CDBA */, /*25917*/14595/* CDBB */,/*25918*/14595/* CDBC */,/*25919*/14595/* CDBD */,/*25920*/14595/* CDBE */, /*25921*/14595/* CDBF */,/*25922*/14595/* CDC0 */,/*25923*/14595/* CDC1 */,/*25924*/14595/* CDC2 */, /*25925*/14595/* CDC3 */,/*25926*/14595/* CDC4 */,/*25927*/14595/* CDC5 */,/*25928*/14595/* CDC6 */, /*25929*/14595/* CDC7 */,/*25930*/14595/* CDC8 */,/*25931*/14595/* CDC9 */,/*25932*/14595/* CDCA */, /*25933*/14595/* CDCB */,/*25934*/14594/* CDCC */,/*25935*/14595/* CDCD */,/*25936*/14595/* CDCE */, /*25937*/14595/* CDCF */,/*25938*/14595/* CDD0 */,/*25939*/14595/* CDD1 */,/*25940*/14595/* CDD2 */, /*25941*/14595/* CDD3 */,/*25942*/14595/* CDD4 */,/*25943*/14595/* CDD5 */,/*25944*/14595/* CDD6 */, /*25945*/14595/* CDD7 */,/*25946*/14595/* CDD8 */,/*25947*/14595/* CDD9 */,/*25948*/14595/* CDDA */, /*25949*/14595/* CDDB */,/*25950*/14595/* CDDC */,/*25951*/14595/* CDDD */,/*25952*/14595/* CDDE */, /*25953*/14595/* CDDF */,/*25954*/14595/* CDE0 */,/*25955*/14595/* CDE1 */,/*25956*/14595/* CDE2 */, /*25957*/14595/* CDE3 */,/*25958*/14595/* CDE4 */,/*25959*/14595/* CDE5 */,/*25960*/14595/* CDE6 */, /*25961*/14595/* CDE7 */,/*25962*/14594/* CDE8 */,/*25963*/14595/* CDE9 */,/*25964*/14595/* CDEA */, /*25965*/14595/* CDEB */,/*25966*/14595/* CDEC */,/*25967*/14595/* CDED */,/*25968*/14595/* CDEE */, /*25969*/14595/* CDEF */,/*25970*/14595/* CDF0 */,/*25971*/14595/* CDF1 */,/*25972*/14595/* CDF2 */, /*25973*/14595/* CDF3 */,/*25974*/14595/* CDF4 */,/*25975*/14595/* CDF5 */,/*25976*/14595/* CDF6 */, /*25977*/14595/* CDF7 */,/*25978*/14595/* CDF8 */,/*25979*/14595/* CDF9 */,/*25980*/14595/* CDFA */, /*25981*/14595/* CDFB */,/*25982*/14595/* CDFC */,/*25983*/14595/* CDFD */,/*25984*/14595/* CDFE */, /*25985*/14595/* CDFF */,/*25986*/14595/* CE00 */,/*25987*/14595/* CE01 */,/*25988*/14595/* CE02 */, /*25989*/14595/* CE03 */,/*25990*/14594/* CE04 */,/*25991*/14595/* CE05 */,/*25992*/14595/* CE06 */, /*25993*/14595/* CE07 */,/*25994*/14595/* CE08 */,/*25995*/14595/* CE09 */,/*25996*/14595/* CE0A */, /*25997*/14595/* CE0B */,/*25998*/14595/* CE0C */,/*25999*/14595/* CE0D */,/*26000*/14595/* CE0E */, /*26001*/14595/* CE0F */,/*26002*/14595/* CE10 */,/*26003*/14595/* CE11 */,/*26004*/14595/* CE12 */, /*26005*/14595/* CE13 */,/*26006*/14595/* CE14 */,/*26007*/14595/* CE15 */,/*26008*/14595/* CE16 */, /*26009*/14595/* CE17 */,/*26010*/14595/* CE18 */,/*26011*/14595/* CE19 */,/*26012*/14595/* CE1A */, /*26013*/14595/* CE1B */,/*26014*/14595/* CE1C */,/*26015*/14595/* CE1D */,/*26016*/14595/* CE1E */, /*26017*/14595/* CE1F */,/*26018*/14594/* CE20 */,/*26019*/14595/* CE21 */,/*26020*/14595/* CE22 */, /*26021*/14595/* CE23 */,/*26022*/14595/* CE24 */,/*26023*/14595/* CE25 */,/*26024*/14595/* CE26 */, /*26025*/14595/* CE27 */,/*26026*/14595/* CE28 */,/*26027*/14595/* CE29 */,/*26028*/14595/* CE2A */, /*26029*/14595/* CE2B */,/*26030*/14595/* CE2C */,/*26031*/14595/* CE2D */,/*26032*/14595/* CE2E */, /*26033*/14595/* CE2F */,/*26034*/14595/* CE30 */,/*26035*/14595/* CE31 */,/*26036*/14595/* CE32 */, /*26037*/14595/* CE33 */,/*26038*/14595/* CE34 */,/*26039*/14595/* CE35 */,/*26040*/14595/* CE36 */, /*26041*/14595/* CE37 */,/*26042*/14595/* CE38 */,/*26043*/14595/* CE39 */,/*26044*/14595/* CE3A */, /*26045*/14595/* CE3B */,/*26046*/14594/* CE3C */,/*26047*/14595/* CE3D */,/*26048*/14595/* CE3E */, /*26049*/14595/* CE3F */,/*26050*/14595/* CE40 */,/*26051*/14595/* CE41 */,/*26052*/14595/* CE42 */, /*26053*/14595/* CE43 */,/*26054*/14595/* CE44 */,/*26055*/14595/* CE45 */,/*26056*/14595/* CE46 */, /*26057*/14595/* CE47 */,/*26058*/14595/* CE48 */,/*26059*/14595/* CE49 */,/*26060*/14595/* CE4A */, /*26061*/14595/* CE4B */,/*26062*/14595/* CE4C */,/*26063*/14595/* CE4D */,/*26064*/14595/* CE4E */, /*26065*/14595/* CE4F */,/*26066*/14595/* CE50 */,/*26067*/14595/* CE51 */,/*26068*/14595/* CE52 */, /*26069*/14595/* CE53 */,/*26070*/14595/* CE54 */,/*26071*/14595/* CE55 */,/*26072*/14595/* CE56 */, /*26073*/14595/* CE57 */,/*26074*/14594/* CE58 */,/*26075*/14595/* CE59 */,/*26076*/14595/* CE5A */, /*26077*/14595/* CE5B */,/*26078*/14595/* CE5C */,/*26079*/14595/* CE5D */,/*26080*/14595/* CE5E */, /*26081*/14595/* CE5F */,/*26082*/14595/* CE60 */,/*26083*/14595/* CE61 */,/*26084*/14595/* CE62 */, /*26085*/14595/* CE63 */,/*26086*/14595/* CE64 */,/*26087*/14595/* CE65 */,/*26088*/14595/* CE66 */, /*26089*/14595/* CE67 */,/*26090*/14595/* CE68 */,/*26091*/14595/* CE69 */,/*26092*/14595/* CE6A */, /*26093*/14595/* CE6B */,/*26094*/14595/* CE6C */,/*26095*/14595/* CE6D */,/*26096*/14595/* CE6E */, /*26097*/14595/* CE6F */,/*26098*/14595/* CE70 */,/*26099*/14595/* CE71 */,/*26100*/14595/* CE72 */, /*26101*/14595/* CE73 */,/*26102*/14594/* CE74 */,/*26103*/14595/* CE75 */,/*26104*/14595/* CE76 */, /*26105*/14595/* CE77 */,/*26106*/14595/* CE78 */,/*26107*/14595/* CE79 */,/*26108*/14595/* CE7A */, /*26109*/14595/* CE7B */,/*26110*/14595/* CE7C */,/*26111*/14595/* CE7D */,/*26112*/14595/* CE7E */, /*26113*/14595/* CE7F */,/*26114*/14595/* CE80 */,/*26115*/14595/* CE81 */,/*26116*/14595/* CE82 */, /*26117*/14595/* CE83 */,/*26118*/14595/* CE84 */,/*26119*/14595/* CE85 */,/*26120*/14595/* CE86 */, /*26121*/14595/* CE87 */,/*26122*/14595/* CE88 */,/*26123*/14595/* CE89 */,/*26124*/14595/* CE8A */, /*26125*/14595/* CE8B */,/*26126*/14595/* CE8C */,/*26127*/14595/* CE8D */,/*26128*/14595/* CE8E */, /*26129*/14595/* CE8F */,/*26130*/14594/* CE90 */,/*26131*/14595/* CE91 */,/*26132*/14595/* CE92 */, /*26133*/14595/* CE93 */,/*26134*/14595/* CE94 */,/*26135*/14595/* CE95 */,/*26136*/14595/* CE96 */, /*26137*/14595/* CE97 */,/*26138*/14595/* CE98 */,/*26139*/14595/* CE99 */,/*26140*/14595/* CE9A */, /*26141*/14595/* CE9B */,/*26142*/14595/* CE9C */,/*26143*/14595/* CE9D */,/*26144*/14595/* CE9E */, /*26145*/14595/* CE9F */,/*26146*/14595/* CEA0 */,/*26147*/14595/* CEA1 */,/*26148*/14595/* CEA2 */, /*26149*/14595/* CEA3 */,/*26150*/14595/* CEA4 */,/*26151*/14595/* CEA5 */,/*26152*/14595/* CEA6 */, /*26153*/14595/* CEA7 */,/*26154*/14595/* CEA8 */,/*26155*/14595/* CEA9 */,/*26156*/14595/* CEAA */, /*26157*/14595/* CEAB */,/*26158*/14594/* CEAC */,/*26159*/14595/* CEAD */,/*26160*/14595/* CEAE */, /*26161*/14595/* CEAF */,/*26162*/14595/* CEB0 */,/*26163*/14595/* CEB1 */,/*26164*/14595/* CEB2 */, /*26165*/14595/* CEB3 */,/*26166*/14595/* CEB4 */,/*26167*/14595/* CEB5 */,/*26168*/14595/* CEB6 */, /*26169*/14595/* CEB7 */,/*26170*/14595/* CEB8 */,/*26171*/14595/* CEB9 */,/*26172*/14595/* CEBA */, /*26173*/14595/* CEBB */,/*26174*/14595/* CEBC */,/*26175*/14595/* CEBD */,/*26176*/14595/* CEBE */, /*26177*/14595/* CEBF */,/*26178*/14595/* CEC0 */,/*26179*/14595/* CEC1 */,/*26180*/14595/* CEC2 */, /*26181*/14595/* CEC3 */,/*26182*/14595/* CEC4 */,/*26183*/14595/* CEC5 */,/*26184*/14595/* CEC6 */, /*26185*/14595/* CEC7 */,/*26186*/14594/* CEC8 */,/*26187*/14595/* CEC9 */,/*26188*/14595/* CECA */, /*26189*/14595/* CECB */,/*26190*/14595/* CECC */,/*26191*/14595/* CECD */,/*26192*/14595/* CECE */, /*26193*/14595/* CECF */,/*26194*/14595/* CED0 */,/*26195*/14595/* CED1 */,/*26196*/14595/* CED2 */, /*26197*/14595/* CED3 */,/*26198*/14595/* CED4 */,/*26199*/14595/* CED5 */,/*26200*/14595/* CED6 */, /*26201*/14595/* CED7 */,/*26202*/14595/* CED8 */,/*26203*/14595/* CED9 */,/*26204*/14595/* CEDA */, /*26205*/14595/* CEDB */,/*26206*/14595/* CEDC */,/*26207*/14595/* CEDD */,/*26208*/14595/* CEDE */, /*26209*/14595/* CEDF */,/*26210*/14595/* CEE0 */,/*26211*/14595/* CEE1 */,/*26212*/14595/* CEE2 */, /*26213*/14595/* CEE3 */,/*26214*/14594/* CEE4 */,/*26215*/14595/* CEE5 */,/*26216*/14595/* CEE6 */, /*26217*/14595/* CEE7 */,/*26218*/14595/* CEE8 */,/*26219*/14595/* CEE9 */,/*26220*/14595/* CEEA */, /*26221*/14595/* CEEB */,/*26222*/14595/* CEEC */,/*26223*/14595/* CEED */,/*26224*/14595/* CEEE */, /*26225*/14595/* CEEF */,/*26226*/14595/* CEF0 */,/*26227*/14595/* CEF1 */,/*26228*/14595/* CEF2 */, /*26229*/14595/* CEF3 */,/*26230*/14595/* CEF4 */,/*26231*/14595/* CEF5 */,/*26232*/14595/* CEF6 */, /*26233*/14595/* CEF7 */,/*26234*/14595/* CEF8 */,/*26235*/14595/* CEF9 */,/*26236*/14595/* CEFA */, /*26237*/14595/* CEFB */,/*26238*/14595/* CEFC */,/*26239*/14595/* CEFD */,/*26240*/14595/* CEFE */, /*26241*/14595/* CEFF */,/*26242*/14594/* CF00 */,/*26243*/14595/* CF01 */,/*26244*/14595/* CF02 */, /*26245*/14595/* CF03 */,/*26246*/14595/* CF04 */,/*26247*/14595/* CF05 */,/*26248*/14595/* CF06 */, /*26249*/14595/* CF07 */,/*26250*/14595/* CF08 */,/*26251*/14595/* CF09 */,/*26252*/14595/* CF0A */, /*26253*/14595/* CF0B */,/*26254*/14595/* CF0C */,/*26255*/14595/* CF0D */,/*26256*/14595/* CF0E */, /*26257*/14595/* CF0F */,/*26258*/14595/* CF10 */,/*26259*/14595/* CF11 */,/*26260*/14595/* CF12 */, /*26261*/14595/* CF13 */,/*26262*/14595/* CF14 */,/*26263*/14595/* CF15 */,/*26264*/14595/* CF16 */, /*26265*/14595/* CF17 */,/*26266*/14595/* CF18 */,/*26267*/14595/* CF19 */,/*26268*/14595/* CF1A */, /*26269*/14595/* CF1B */,/*26270*/14594/* CF1C */,/*26271*/14595/* CF1D */,/*26272*/14595/* CF1E */, /*26273*/14595/* CF1F */,/*26274*/14595/* CF20 */,/*26275*/14595/* CF21 */,/*26276*/14595/* CF22 */, /*26277*/14595/* CF23 */,/*26278*/14595/* CF24 */,/*26279*/14595/* CF25 */,/*26280*/14595/* CF26 */, /*26281*/14595/* CF27 */,/*26282*/14595/* CF28 */,/*26283*/14595/* CF29 */,/*26284*/14595/* CF2A */, /*26285*/14595/* CF2B */,/*26286*/14595/* CF2C */,/*26287*/14595/* CF2D */,/*26288*/14595/* CF2E */, /*26289*/14595/* CF2F */,/*26290*/14595/* CF30 */,/*26291*/14595/* CF31 */,/*26292*/14595/* CF32 */, /*26293*/14595/* CF33 */,/*26294*/14595/* CF34 */,/*26295*/14595/* CF35 */,/*26296*/14595/* CF36 */, /*26297*/14595/* CF37 */,/*26298*/14594/* CF38 */,/*26299*/14595/* CF39 */,/*26300*/14595/* CF3A */, /*26301*/14595/* CF3B */,/*26302*/14595/* CF3C */,/*26303*/14595/* CF3D */,/*26304*/14595/* CF3E */, /*26305*/14595/* CF3F */,/*26306*/14595/* CF40 */,/*26307*/14595/* CF41 */,/*26308*/14595/* CF42 */, /*26309*/14595/* CF43 */,/*26310*/14595/* CF44 */,/*26311*/14595/* CF45 */,/*26312*/14595/* CF46 */, /*26313*/14595/* CF47 */,/*26314*/14595/* CF48 */,/*26315*/14595/* CF49 */,/*26316*/14595/* CF4A */, /*26317*/14595/* CF4B */,/*26318*/14595/* CF4C */,/*26319*/14595/* CF4D */,/*26320*/14595/* CF4E */, /*26321*/14595/* CF4F */,/*26322*/14595/* CF50 */,/*26323*/14595/* CF51 */,/*26324*/14595/* CF52 */, /*26325*/14595/* CF53 */,/*26326*/14594/* CF54 */,/*26327*/14595/* CF55 */,/*26328*/14595/* CF56 */, /*26329*/14595/* CF57 */,/*26330*/14595/* CF58 */,/*26331*/14595/* CF59 */,/*26332*/14595/* CF5A */, /*26333*/14595/* CF5B */,/*26334*/14595/* CF5C */,/*26335*/14595/* CF5D */,/*26336*/14595/* CF5E */, /*26337*/14595/* CF5F */,/*26338*/14595/* CF60 */,/*26339*/14595/* CF61 */,/*26340*/14595/* CF62 */, /*26341*/14595/* CF63 */,/*26342*/14595/* CF64 */,/*26343*/14595/* CF65 */,/*26344*/14595/* CF66 */, /*26345*/14595/* CF67 */,/*26346*/14595/* CF68 */,/*26347*/14595/* CF69 */,/*26348*/14595/* CF6A */, /*26349*/14595/* CF6B */,/*26350*/14595/* CF6C */,/*26351*/14595/* CF6D */,/*26352*/14595/* CF6E */, /*26353*/14595/* CF6F */,/*26354*/14594/* CF70 */,/*26355*/14595/* CF71 */,/*26356*/14595/* CF72 */, /*26357*/14595/* CF73 */,/*26358*/14595/* CF74 */,/*26359*/14595/* CF75 */,/*26360*/14595/* CF76 */, /*26361*/14595/* CF77 */,/*26362*/14595/* CF78 */,/*26363*/14595/* CF79 */,/*26364*/14595/* CF7A */, /*26365*/14595/* CF7B */,/*26366*/14595/* CF7C */,/*26367*/14595/* CF7D */,/*26368*/14595/* CF7E */, /*26369*/14595/* CF7F */,/*26370*/14595/* CF80 */,/*26371*/14595/* CF81 */,/*26372*/14595/* CF82 */, /*26373*/14595/* CF83 */,/*26374*/14595/* CF84 */,/*26375*/14595/* CF85 */,/*26376*/14595/* CF86 */, /*26377*/14595/* CF87 */,/*26378*/14595/* CF88 */,/*26379*/14595/* CF89 */,/*26380*/14595/* CF8A */, /*26381*/14595/* CF8B */,/*26382*/14594/* CF8C */,/*26383*/14595/* CF8D */,/*26384*/14595/* CF8E */, /*26385*/14595/* CF8F */,/*26386*/14595/* CF90 */,/*26387*/14595/* CF91 */,/*26388*/14595/* CF92 */, /*26389*/14595/* CF93 */,/*26390*/14595/* CF94 */,/*26391*/14595/* CF95 */,/*26392*/14595/* CF96 */, /*26393*/14595/* CF97 */,/*26394*/14595/* CF98 */,/*26395*/14595/* CF99 */,/*26396*/14595/* CF9A */, /*26397*/14595/* CF9B */,/*26398*/14595/* CF9C */,/*26399*/14595/* CF9D */,/*26400*/14595/* CF9E */, /*26401*/14595/* CF9F */,/*26402*/14595/* CFA0 */,/*26403*/14595/* CFA1 */,/*26404*/14595/* CFA2 */, /*26405*/14595/* CFA3 */,/*26406*/14595/* CFA4 */,/*26407*/14595/* CFA5 */,/*26408*/14595/* CFA6 */, /*26409*/14595/* CFA7 */,/*26410*/14594/* CFA8 */,/*26411*/14595/* CFA9 */,/*26412*/14595/* CFAA */, /*26413*/14595/* CFAB */,/*26414*/14595/* CFAC */,/*26415*/14595/* CFAD */,/*26416*/14595/* CFAE */, /*26417*/14595/* CFAF */,/*26418*/14595/* CFB0 */,/*26419*/14595/* CFB1 */,/*26420*/14595/* CFB2 */, /*26421*/14595/* CFB3 */,/*26422*/14595/* CFB4 */,/*26423*/14595/* CFB5 */,/*26424*/14595/* CFB6 */, /*26425*/14595/* CFB7 */,/*26426*/14595/* CFB8 */,/*26427*/14595/* CFB9 */,/*26428*/14595/* CFBA */, /*26429*/14595/* CFBB */,/*26430*/14595/* CFBC */,/*26431*/14595/* CFBD */,/*26432*/14595/* CFBE */, /*26433*/14595/* CFBF */,/*26434*/14595/* CFC0 */,/*26435*/14595/* CFC1 */,/*26436*/14595/* CFC2 */, /*26437*/14595/* CFC3 */,/*26438*/14594/* CFC4 */,/*26439*/14595/* CFC5 */,/*26440*/14595/* CFC6 */, /*26441*/14595/* CFC7 */,/*26442*/14595/* CFC8 */,/*26443*/14595/* CFC9 */,/*26444*/14595/* CFCA */, /*26445*/14595/* CFCB */,/*26446*/14595/* CFCC */,/*26447*/14595/* CFCD */,/*26448*/14595/* CFCE */, /*26449*/14595/* CFCF */,/*26450*/14595/* CFD0 */,/*26451*/14595/* CFD1 */,/*26452*/14595/* CFD2 */, /*26453*/14595/* CFD3 */,/*26454*/14595/* CFD4 */,/*26455*/14595/* CFD5 */,/*26456*/14595/* CFD6 */, /*26457*/14595/* CFD7 */,/*26458*/14595/* CFD8 */,/*26459*/14595/* CFD9 */,/*26460*/14595/* CFDA */, /*26461*/14595/* CFDB */,/*26462*/14595/* CFDC */,/*26463*/14595/* CFDD */,/*26464*/14595/* CFDE */, /*26465*/14595/* CFDF */,/*26466*/14594/* CFE0 */,/*26467*/14595/* CFE1 */,/*26468*/14595/* CFE2 */, /*26469*/14595/* CFE3 */,/*26470*/14595/* CFE4 */,/*26471*/14595/* CFE5 */,/*26472*/14595/* CFE6 */, /*26473*/14595/* CFE7 */,/*26474*/14595/* CFE8 */,/*26475*/14595/* CFE9 */,/*26476*/14595/* CFEA */, /*26477*/14595/* CFEB */,/*26478*/14595/* CFEC */,/*26479*/14595/* CFED */,/*26480*/14595/* CFEE */, /*26481*/14595/* CFEF */,/*26482*/14595/* CFF0 */,/*26483*/14595/* CFF1 */,/*26484*/14595/* CFF2 */, /*26485*/14595/* CFF3 */,/*26486*/14595/* CFF4 */,/*26487*/14595/* CFF5 */,/*26488*/14595/* CFF6 */, /*26489*/14595/* CFF7 */,/*26490*/14595/* CFF8 */,/*26491*/14595/* CFF9 */,/*26492*/14595/* CFFA */, /*26493*/14595/* CFFB */,/*26494*/14594/* CFFC */,/*26495*/14595/* CFFD */,/*26496*/14595/* CFFE */, /*26497*/14595/* CFFF */,/*26498*/14595/* D000 */,/*26499*/14595/* D001 */,/*26500*/14595/* D002 */, /*26501*/14595/* D003 */,/*26502*/14595/* D004 */,/*26503*/14595/* D005 */,/*26504*/14595/* D006 */, /*26505*/14595/* D007 */,/*26506*/14595/* D008 */,/*26507*/14595/* D009 */,/*26508*/14595/* D00A */, /*26509*/14595/* D00B */,/*26510*/14595/* D00C */,/*26511*/14595/* D00D */,/*26512*/14595/* D00E */, /*26513*/14595/* D00F */,/*26514*/14595/* D010 */,/*26515*/14595/* D011 */,/*26516*/14595/* D012 */, /*26517*/14595/* D013 */,/*26518*/14595/* D014 */,/*26519*/14595/* D015 */,/*26520*/14595/* D016 */, /*26521*/14595/* D017 */,/*26522*/14594/* D018 */,/*26523*/14595/* D019 */,/*26524*/14595/* D01A */, /*26525*/14595/* D01B */,/*26526*/14595/* D01C */,/*26527*/14595/* D01D */,/*26528*/14595/* D01E */, /*26529*/14595/* D01F */,/*26530*/14595/* D020 */,/*26531*/14595/* D021 */,/*26532*/14595/* D022 */, /*26533*/14595/* D023 */,/*26534*/14595/* D024 */,/*26535*/14595/* D025 */,/*26536*/14595/* D026 */, /*26537*/14595/* D027 */,/*26538*/14595/* D028 */,/*26539*/14595/* D029 */,/*26540*/14595/* D02A */, /*26541*/14595/* D02B */,/*26542*/14595/* D02C */,/*26543*/14595/* D02D */,/*26544*/14595/* D02E */, /*26545*/14595/* D02F */,/*26546*/14595/* D030 */,/*26547*/14595/* D031 */,/*26548*/14595/* D032 */, /*26549*/14595/* D033 */,/*26550*/14594/* D034 */,/*26551*/14595/* D035 */,/*26552*/14595/* D036 */, /*26553*/14595/* D037 */,/*26554*/14595/* D038 */,/*26555*/14595/* D039 */,/*26556*/14595/* D03A */, /*26557*/14595/* D03B */,/*26558*/14595/* D03C */,/*26559*/14595/* D03D */,/*26560*/14595/* D03E */, /*26561*/14595/* D03F */,/*26562*/14595/* D040 */,/*26563*/14595/* D041 */,/*26564*/14595/* D042 */, /*26565*/14595/* D043 */,/*26566*/14595/* D044 */,/*26567*/14595/* D045 */,/*26568*/14595/* D046 */, /*26569*/14595/* D047 */,/*26570*/14595/* D048 */,/*26571*/14595/* D049 */,/*26572*/14595/* D04A */, /*26573*/14595/* D04B */,/*26574*/14595/* D04C */,/*26575*/14595/* D04D */,/*26576*/14595/* D04E */, /*26577*/14595/* D04F */,/*26578*/14594/* D050 */,/*26579*/14595/* D051 */,/*26580*/14595/* D052 */, /*26581*/14595/* D053 */,/*26582*/14595/* D054 */,/*26583*/14595/* D055 */,/*26584*/14595/* D056 */, /*26585*/14595/* D057 */,/*26586*/14595/* D058 */,/*26587*/14595/* D059 */,/*26588*/14595/* D05A */, /*26589*/14595/* D05B */,/*26590*/14595/* D05C */,/*26591*/14595/* D05D */,/*26592*/14595/* D05E */, /*26593*/14595/* D05F */,/*26594*/14595/* D060 */,/*26595*/14595/* D061 */,/*26596*/14595/* D062 */, /*26597*/14595/* D063 */,/*26598*/14595/* D064 */,/*26599*/14595/* D065 */,/*26600*/14595/* D066 */, /*26601*/14595/* D067 */,/*26602*/14595/* D068 */,/*26603*/14595/* D069 */,/*26604*/14595/* D06A */, /*26605*/14595/* D06B */,/*26606*/14594/* D06C */,/*26607*/14595/* D06D */,/*26608*/14595/* D06E */, /*26609*/14595/* D06F */,/*26610*/14595/* D070 */,/*26611*/14595/* D071 */,/*26612*/14595/* D072 */, /*26613*/14595/* D073 */,/*26614*/14595/* D074 */,/*26615*/14595/* D075 */,/*26616*/14595/* D076 */, /*26617*/14595/* D077 */,/*26618*/14595/* D078 */,/*26619*/14595/* D079 */,/*26620*/14595/* D07A */, /*26621*/14595/* D07B */,/*26622*/14595/* D07C */,/*26623*/14595/* D07D */,/*26624*/14595/* D07E */, /*26625*/14595/* D07F */,/*26626*/14595/* D080 */,/*26627*/14595/* D081 */,/*26628*/14595/* D082 */, /*26629*/14595/* D083 */,/*26630*/14595/* D084 */,/*26631*/14595/* D085 */,/*26632*/14595/* D086 */, /*26633*/14595/* D087 */,/*26634*/14594/* D088 */,/*26635*/14595/* D089 */,/*26636*/14595/* D08A */, /*26637*/14595/* D08B */,/*26638*/14595/* D08C */,/*26639*/14595/* D08D */,/*26640*/14595/* D08E */, /*26641*/14595/* D08F */,/*26642*/14595/* D090 */,/*26643*/14595/* D091 */,/*26644*/14595/* D092 */, /*26645*/14595/* D093 */,/*26646*/14595/* D094 */,/*26647*/14595/* D095 */,/*26648*/14595/* D096 */, /*26649*/14595/* D097 */,/*26650*/14595/* D098 */,/*26651*/14595/* D099 */,/*26652*/14595/* D09A */, /*26653*/14595/* D09B */,/*26654*/14595/* D09C */,/*26655*/14595/* D09D */,/*26656*/14595/* D09E */, /*26657*/14595/* D09F */,/*26658*/14595/* D0A0 */,/*26659*/14595/* D0A1 */,/*26660*/14595/* D0A2 */, /*26661*/14595/* D0A3 */,/*26662*/14594/* D0A4 */,/*26663*/14595/* D0A5 */,/*26664*/14595/* D0A6 */, /*26665*/14595/* D0A7 */,/*26666*/14595/* D0A8 */,/*26667*/14595/* D0A9 */,/*26668*/14595/* D0AA */, /*26669*/14595/* D0AB */,/*26670*/14595/* D0AC */,/*26671*/14595/* D0AD */,/*26672*/14595/* D0AE */, /*26673*/14595/* D0AF */,/*26674*/14595/* D0B0 */,/*26675*/14595/* D0B1 */,/*26676*/14595/* D0B2 */, /*26677*/14595/* D0B3 */,/*26678*/14595/* D0B4 */,/*26679*/14595/* D0B5 */,/*26680*/14595/* D0B6 */, /*26681*/14595/* D0B7 */,/*26682*/14595/* D0B8 */,/*26683*/14595/* D0B9 */,/*26684*/14595/* D0BA */, /*26685*/14595/* D0BB */,/*26686*/14595/* D0BC */,/*26687*/14595/* D0BD */,/*26688*/14595/* D0BE */, /*26689*/14595/* D0BF */,/*26690*/14594/* D0C0 */,/*26691*/14595/* D0C1 */,/*26692*/14595/* D0C2 */, /*26693*/14595/* D0C3 */,/*26694*/14595/* D0C4 */,/*26695*/14595/* D0C5 */,/*26696*/14595/* D0C6 */, /*26697*/14595/* D0C7 */,/*26698*/14595/* D0C8 */,/*26699*/14595/* D0C9 */,/*26700*/14595/* D0CA */, /*26701*/14595/* D0CB */,/*26702*/14595/* D0CC */,/*26703*/14595/* D0CD */,/*26704*/14595/* D0CE */, /*26705*/14595/* D0CF */,/*26706*/14595/* D0D0 */,/*26707*/14595/* D0D1 */,/*26708*/14595/* D0D2 */, /*26709*/14595/* D0D3 */,/*26710*/14595/* D0D4 */,/*26711*/14595/* D0D5 */,/*26712*/14595/* D0D6 */, /*26713*/14595/* D0D7 */,/*26714*/14595/* D0D8 */,/*26715*/14595/* D0D9 */,/*26716*/14595/* D0DA */, /*26717*/14595/* D0DB */,/*26718*/14594/* D0DC */,/*26719*/14595/* D0DD */,/*26720*/14595/* D0DE */, /*26721*/14595/* D0DF */,/*26722*/14595/* D0E0 */,/*26723*/14595/* D0E1 */,/*26724*/14595/* D0E2 */, /*26725*/14595/* D0E3 */,/*26726*/14595/* D0E4 */,/*26727*/14595/* D0E5 */,/*26728*/14595/* D0E6 */, /*26729*/14595/* D0E7 */,/*26730*/14595/* D0E8 */,/*26731*/14595/* D0E9 */,/*26732*/14595/* D0EA */, /*26733*/14595/* D0EB */,/*26734*/14595/* D0EC */,/*26735*/14595/* D0ED */,/*26736*/14595/* D0EE */, /*26737*/14595/* D0EF */,/*26738*/14595/* D0F0 */,/*26739*/14595/* D0F1 */,/*26740*/14595/* D0F2 */, /*26741*/14595/* D0F3 */,/*26742*/14595/* D0F4 */,/*26743*/14595/* D0F5 */,/*26744*/14595/* D0F6 */, /*26745*/14595/* D0F7 */,/*26746*/14594/* D0F8 */,/*26747*/14595/* D0F9 */,/*26748*/14595/* D0FA */, /*26749*/14595/* D0FB */,/*26750*/14595/* D0FC */,/*26751*/14595/* D0FD */,/*26752*/14595/* D0FE */, /*26753*/14595/* D0FF */,/*26754*/14595/* D100 */,/*26755*/14595/* D101 */,/*26756*/14595/* D102 */, /*26757*/14595/* D103 */,/*26758*/14595/* D104 */,/*26759*/14595/* D105 */,/*26760*/14595/* D106 */, /*26761*/14595/* D107 */,/*26762*/14595/* D108 */,/*26763*/14595/* D109 */,/*26764*/14595/* D10A */, /*26765*/14595/* D10B */,/*26766*/14595/* D10C */,/*26767*/14595/* D10D */,/*26768*/14595/* D10E */, /*26769*/14595/* D10F */,/*26770*/14595/* D110 */,/*26771*/14595/* D111 */,/*26772*/14595/* D112 */, /*26773*/14595/* D113 */,/*26774*/14594/* D114 */,/*26775*/14595/* D115 */,/*26776*/14595/* D116 */, /*26777*/14595/* D117 */,/*26778*/14595/* D118 */,/*26779*/14595/* D119 */,/*26780*/14595/* D11A */, /*26781*/14595/* D11B */,/*26782*/14595/* D11C */,/*26783*/14595/* D11D */,/*26784*/14595/* D11E */, /*26785*/14595/* D11F */,/*26786*/14595/* D120 */,/*26787*/14595/* D121 */,/*26788*/14595/* D122 */, /*26789*/14595/* D123 */,/*26790*/14595/* D124 */,/*26791*/14595/* D125 */,/*26792*/14595/* D126 */, /*26793*/14595/* D127 */,/*26794*/14595/* D128 */,/*26795*/14595/* D129 */,/*26796*/14595/* D12A */, /*26797*/14595/* D12B */,/*26798*/14595/* D12C */,/*26799*/14595/* D12D */,/*26800*/14595/* D12E */, /*26801*/14595/* D12F */,/*26802*/14594/* D130 */,/*26803*/14595/* D131 */,/*26804*/14595/* D132 */, /*26805*/14595/* D133 */,/*26806*/14595/* D134 */,/*26807*/14595/* D135 */,/*26808*/14595/* D136 */, /*26809*/14595/* D137 */,/*26810*/14595/* D138 */,/*26811*/14595/* D139 */,/*26812*/14595/* D13A */, /*26813*/14595/* D13B */,/*26814*/14595/* D13C */,/*26815*/14595/* D13D */,/*26816*/14595/* D13E */, /*26817*/14595/* D13F */,/*26818*/14595/* D140 */,/*26819*/14595/* D141 */,/*26820*/14595/* D142 */, /*26821*/14595/* D143 */,/*26822*/14595/* D144 */,/*26823*/14595/* D145 */,/*26824*/14595/* D146 */, /*26825*/14595/* D147 */,/*26826*/14595/* D148 */,/*26827*/14595/* D149 */,/*26828*/14595/* D14A */, /*26829*/14595/* D14B */,/*26830*/14594/* D14C */,/*26831*/14595/* D14D */,/*26832*/14595/* D14E */, /*26833*/14595/* D14F */,/*26834*/14595/* D150 */,/*26835*/14595/* D151 */,/*26836*/14595/* D152 */, /*26837*/14595/* D153 */,/*26838*/14595/* D154 */,/*26839*/14595/* D155 */,/*26840*/14595/* D156 */, /*26841*/14595/* D157 */,/*26842*/14595/* D158 */,/*26843*/14595/* D159 */,/*26844*/14595/* D15A */, /*26845*/14595/* D15B */,/*26846*/14595/* D15C */,/*26847*/14595/* D15D */,/*26848*/14595/* D15E */, /*26849*/14595/* D15F */,/*26850*/14595/* D160 */,/*26851*/14595/* D161 */,/*26852*/14595/* D162 */, /*26853*/14595/* D163 */,/*26854*/14595/* D164 */,/*26855*/14595/* D165 */,/*26856*/14595/* D166 */, /*26857*/14595/* D167 */,/*26858*/14594/* D168 */,/*26859*/14595/* D169 */,/*26860*/14595/* D16A */, /*26861*/14595/* D16B */,/*26862*/14595/* D16C */,/*26863*/14595/* D16D */,/*26864*/14595/* D16E */, /*26865*/14595/* D16F */,/*26866*/14595/* D170 */,/*26867*/14595/* D171 */,/*26868*/14595/* D172 */, /*26869*/14595/* D173 */,/*26870*/14595/* D174 */,/*26871*/14595/* D175 */,/*26872*/14595/* D176 */, /*26873*/14595/* D177 */,/*26874*/14595/* D178 */,/*26875*/14595/* D179 */,/*26876*/14595/* D17A */, /*26877*/14595/* D17B */,/*26878*/14595/* D17C */,/*26879*/14595/* D17D */,/*26880*/14595/* D17E */, /*26881*/14595/* D17F */,/*26882*/14595/* D180 */,/*26883*/14595/* D181 */,/*26884*/14595/* D182 */, /*26885*/14595/* D183 */,/*26886*/14594/* D184 */,/*26887*/14595/* D185 */,/*26888*/14595/* D186 */, /*26889*/14595/* D187 */,/*26890*/14595/* D188 */,/*26891*/14595/* D189 */,/*26892*/14595/* D18A */, /*26893*/14595/* D18B */,/*26894*/14595/* D18C */,/*26895*/14595/* D18D */,/*26896*/14595/* D18E */, /*26897*/14595/* D18F */,/*26898*/14595/* D190 */,/*26899*/14595/* D191 */,/*26900*/14595/* D192 */, /*26901*/14595/* D193 */,/*26902*/14595/* D194 */,/*26903*/14595/* D195 */,/*26904*/14595/* D196 */, /*26905*/14595/* D197 */,/*26906*/14595/* D198 */,/*26907*/14595/* D199 */,/*26908*/14595/* D19A */, /*26909*/14595/* D19B */,/*26910*/14595/* D19C */,/*26911*/14595/* D19D */,/*26912*/14595/* D19E */, /*26913*/14595/* D19F */,/*26914*/14594/* D1A0 */,/*26915*/14595/* D1A1 */,/*26916*/14595/* D1A2 */, /*26917*/14595/* D1A3 */,/*26918*/14595/* D1A4 */,/*26919*/14595/* D1A5 */,/*26920*/14595/* D1A6 */, /*26921*/14595/* D1A7 */,/*26922*/14595/* D1A8 */,/*26923*/14595/* D1A9 */,/*26924*/14595/* D1AA */, /*26925*/14595/* D1AB */,/*26926*/14595/* D1AC */,/*26927*/14595/* D1AD */,/*26928*/14595/* D1AE */, /*26929*/14595/* D1AF */,/*26930*/14595/* D1B0 */,/*26931*/14595/* D1B1 */,/*26932*/14595/* D1B2 */, /*26933*/14595/* D1B3 */,/*26934*/14595/* D1B4 */,/*26935*/14595/* D1B5 */,/*26936*/14595/* D1B6 */, /*26937*/14595/* D1B7 */,/*26938*/14595/* D1B8 */,/*26939*/14595/* D1B9 */,/*26940*/14595/* D1BA */, /*26941*/14595/* D1BB */,/*26942*/14594/* D1BC */,/*26943*/14595/* D1BD */,/*26944*/14595/* D1BE */, /*26945*/14595/* D1BF */,/*26946*/14595/* D1C0 */,/*26947*/14595/* D1C1 */,/*26948*/14595/* D1C2 */, /*26949*/14595/* D1C3 */,/*26950*/14595/* D1C4 */,/*26951*/14595/* D1C5 */,/*26952*/14595/* D1C6 */, /*26953*/14595/* D1C7 */,/*26954*/14595/* D1C8 */,/*26955*/14595/* D1C9 */,/*26956*/14595/* D1CA */, /*26957*/14595/* D1CB */,/*26958*/14595/* D1CC */,/*26959*/14595/* D1CD */,/*26960*/14595/* D1CE */, /*26961*/14595/* D1CF */,/*26962*/14595/* D1D0 */,/*26963*/14595/* D1D1 */,/*26964*/14595/* D1D2 */, /*26965*/14595/* D1D3 */,/*26966*/14595/* D1D4 */,/*26967*/14595/* D1D5 */,/*26968*/14595/* D1D6 */, /*26969*/14595/* D1D7 */,/*26970*/14594/* D1D8 */,/*26971*/14595/* D1D9 */,/*26972*/14595/* D1DA */, /*26973*/14595/* D1DB */,/*26974*/14595/* D1DC */,/*26975*/14595/* D1DD */,/*26976*/14595/* D1DE */, /*26977*/14595/* D1DF */,/*26978*/14595/* D1E0 */,/*26979*/14595/* D1E1 */,/*26980*/14595/* D1E2 */, /*26981*/14595/* D1E3 */,/*26982*/14595/* D1E4 */,/*26983*/14595/* D1E5 */,/*26984*/14595/* D1E6 */, /*26985*/14595/* D1E7 */,/*26986*/14595/* D1E8 */,/*26987*/14595/* D1E9 */,/*26988*/14595/* D1EA */, /*26989*/14595/* D1EB */,/*26990*/14595/* D1EC */,/*26991*/14595/* D1ED */,/*26992*/14595/* D1EE */, /*26993*/14595/* D1EF */,/*26994*/14595/* D1F0 */,/*26995*/14595/* D1F1 */,/*26996*/14595/* D1F2 */, /*26997*/14595/* D1F3 */,/*26998*/14594/* D1F4 */,/*26999*/14595/* D1F5 */,/*27000*/14595/* D1F6 */, /*27001*/14595/* D1F7 */,/*27002*/14595/* D1F8 */,/*27003*/14595/* D1F9 */,/*27004*/14595/* D1FA */, /*27005*/14595/* D1FB */,/*27006*/14595/* D1FC */,/*27007*/14595/* D1FD */,/*27008*/14595/* D1FE */, /*27009*/14595/* D1FF */,/*27010*/14595/* D200 */,/*27011*/14595/* D201 */,/*27012*/14595/* D202 */, /*27013*/14595/* D203 */,/*27014*/14595/* D204 */,/*27015*/14595/* D205 */,/*27016*/14595/* D206 */, /*27017*/14595/* D207 */,/*27018*/14595/* D208 */,/*27019*/14595/* D209 */,/*27020*/14595/* D20A */, /*27021*/14595/* D20B */,/*27022*/14595/* D20C */,/*27023*/14595/* D20D */,/*27024*/14595/* D20E */, /*27025*/14595/* D20F */,/*27026*/14594/* D210 */,/*27027*/14595/* D211 */,/*27028*/14595/* D212 */, /*27029*/14595/* D213 */,/*27030*/14595/* D214 */,/*27031*/14595/* D215 */,/*27032*/14595/* D216 */, /*27033*/14595/* D217 */,/*27034*/14595/* D218 */,/*27035*/14595/* D219 */,/*27036*/14595/* D21A */, /*27037*/14595/* D21B */,/*27038*/14595/* D21C */,/*27039*/14595/* D21D */,/*27040*/14595/* D21E */, /*27041*/14595/* D21F */,/*27042*/14595/* D220 */,/*27043*/14595/* D221 */,/*27044*/14595/* D222 */, /*27045*/14595/* D223 */,/*27046*/14595/* D224 */,/*27047*/14595/* D225 */,/*27048*/14595/* D226 */, /*27049*/14595/* D227 */,/*27050*/14595/* D228 */,/*27051*/14595/* D229 */,/*27052*/14595/* D22A */, /*27053*/14595/* D22B */,/*27054*/14594/* D22C */,/*27055*/14595/* D22D */,/*27056*/14595/* D22E */, /*27057*/14595/* D22F */,/*27058*/14595/* D230 */,/*27059*/14595/* D231 */,/*27060*/14595/* D232 */, /*27061*/14595/* D233 */,/*27062*/14595/* D234 */,/*27063*/14595/* D235 */,/*27064*/14595/* D236 */, /*27065*/14595/* D237 */,/*27066*/14595/* D238 */,/*27067*/14595/* D239 */,/*27068*/14595/* D23A */, /*27069*/14595/* D23B */,/*27070*/14595/* D23C */,/*27071*/14595/* D23D */,/*27072*/14595/* D23E */, /*27073*/14595/* D23F */,/*27074*/14595/* D240 */,/*27075*/14595/* D241 */,/*27076*/14595/* D242 */, /*27077*/14595/* D243 */,/*27078*/14595/* D244 */,/*27079*/14595/* D245 */,/*27080*/14595/* D246 */, /*27081*/14595/* D247 */,/*27082*/14594/* D248 */,/*27083*/14595/* D249 */,/*27084*/14595/* D24A */, /*27085*/14595/* D24B */,/*27086*/14595/* D24C */,/*27087*/14595/* D24D */,/*27088*/14595/* D24E */, /*27089*/14595/* D24F */,/*27090*/14595/* D250 */,/*27091*/14595/* D251 */,/*27092*/14595/* D252 */, /*27093*/14595/* D253 */,/*27094*/14595/* D254 */,/*27095*/14595/* D255 */,/*27096*/14595/* D256 */, /*27097*/14595/* D257 */,/*27098*/14595/* D258 */,/*27099*/14595/* D259 */,/*27100*/14595/* D25A */, /*27101*/14595/* D25B */,/*27102*/14595/* D25C */,/*27103*/14595/* D25D */,/*27104*/14595/* D25E */, /*27105*/14595/* D25F */,/*27106*/14595/* D260 */,/*27107*/14595/* D261 */,/*27108*/14595/* D262 */, /*27109*/14595/* D263 */,/*27110*/14594/* D264 */,/*27111*/14595/* D265 */,/*27112*/14595/* D266 */, /*27113*/14595/* D267 */,/*27114*/14595/* D268 */,/*27115*/14595/* D269 */,/*27116*/14595/* D26A */, /*27117*/14595/* D26B */,/*27118*/14595/* D26C */,/*27119*/14595/* D26D */,/*27120*/14595/* D26E */, /*27121*/14595/* D26F */,/*27122*/14595/* D270 */,/*27123*/14595/* D271 */,/*27124*/14595/* D272 */, /*27125*/14595/* D273 */,/*27126*/14595/* D274 */,/*27127*/14595/* D275 */,/*27128*/14595/* D276 */, /*27129*/14595/* D277 */,/*27130*/14595/* D278 */,/*27131*/14595/* D279 */,/*27132*/14595/* D27A */, /*27133*/14595/* D27B */,/*27134*/14595/* D27C */,/*27135*/14595/* D27D */,/*27136*/14595/* D27E */, /*27137*/14595/* D27F */,/*27138*/14594/* D280 */,/*27139*/14595/* D281 */,/*27140*/14595/* D282 */, /*27141*/14595/* D283 */,/*27142*/14595/* D284 */,/*27143*/14595/* D285 */,/*27144*/14595/* D286 */, /*27145*/14595/* D287 */,/*27146*/14595/* D288 */,/*27147*/14595/* D289 */,/*27148*/14595/* D28A */, /*27149*/14595/* D28B */,/*27150*/14595/* D28C */,/*27151*/14595/* D28D */,/*27152*/14595/* D28E */, /*27153*/14595/* D28F */,/*27154*/14595/* D290 */,/*27155*/14595/* D291 */,/*27156*/14595/* D292 */, /*27157*/14595/* D293 */,/*27158*/14595/* D294 */,/*27159*/14595/* D295 */,/*27160*/14595/* D296 */, /*27161*/14595/* D297 */,/*27162*/14595/* D298 */,/*27163*/14595/* D299 */,/*27164*/14595/* D29A */, /*27165*/14595/* D29B */,/*27166*/14594/* D29C */,/*27167*/14595/* D29D */,/*27168*/14595/* D29E */, /*27169*/14595/* D29F */,/*27170*/14595/* D2A0 */,/*27171*/14595/* D2A1 */,/*27172*/14595/* D2A2 */, /*27173*/14595/* D2A3 */,/*27174*/14595/* D2A4 */,/*27175*/14595/* D2A5 */,/*27176*/14595/* D2A6 */, /*27177*/14595/* D2A7 */,/*27178*/14595/* D2A8 */,/*27179*/14595/* D2A9 */,/*27180*/14595/* D2AA */, /*27181*/14595/* D2AB */,/*27182*/14595/* D2AC */,/*27183*/14595/* D2AD */,/*27184*/14595/* D2AE */, /*27185*/14595/* D2AF */,/*27186*/14595/* D2B0 */,/*27187*/14595/* D2B1 */,/*27188*/14595/* D2B2 */, /*27189*/14595/* D2B3 */,/*27190*/14595/* D2B4 */,/*27191*/14595/* D2B5 */,/*27192*/14595/* D2B6 */, /*27193*/14595/* D2B7 */,/*27194*/14594/* D2B8 */,/*27195*/14595/* D2B9 */,/*27196*/14595/* D2BA */, /*27197*/14595/* D2BB */,/*27198*/14595/* D2BC */,/*27199*/14595/* D2BD */,/*27200*/14595/* D2BE */, /*27201*/14595/* D2BF */,/*27202*/14595/* D2C0 */,/*27203*/14595/* D2C1 */,/*27204*/14595/* D2C2 */, /*27205*/14595/* D2C3 */,/*27206*/14595/* D2C4 */,/*27207*/14595/* D2C5 */,/*27208*/14595/* D2C6 */, /*27209*/14595/* D2C7 */,/*27210*/14595/* D2C8 */,/*27211*/14595/* D2C9 */,/*27212*/14595/* D2CA */, /*27213*/14595/* D2CB */,/*27214*/14595/* D2CC */,/*27215*/14595/* D2CD */,/*27216*/14595/* D2CE */, /*27217*/14595/* D2CF */,/*27218*/14595/* D2D0 */,/*27219*/14595/* D2D1 */,/*27220*/14595/* D2D2 */, /*27221*/14595/* D2D3 */,/*27222*/14594/* D2D4 */,/*27223*/14595/* D2D5 */,/*27224*/14595/* D2D6 */, /*27225*/14595/* D2D7 */,/*27226*/14595/* D2D8 */,/*27227*/14595/* D2D9 */,/*27228*/14595/* D2DA */, /*27229*/14595/* D2DB */,/*27230*/14595/* D2DC */,/*27231*/14595/* D2DD */,/*27232*/14595/* D2DE */, /*27233*/14595/* D2DF */,/*27234*/14595/* D2E0 */,/*27235*/14595/* D2E1 */,/*27236*/14595/* D2E2 */, /*27237*/14595/* D2E3 */,/*27238*/14595/* D2E4 */,/*27239*/14595/* D2E5 */,/*27240*/14595/* D2E6 */, /*27241*/14595/* D2E7 */,/*27242*/14595/* D2E8 */,/*27243*/14595/* D2E9 */,/*27244*/14595/* D2EA */, /*27245*/14595/* D2EB */,/*27246*/14595/* D2EC */,/*27247*/14595/* D2ED */,/*27248*/14595/* D2EE */, /*27249*/14595/* D2EF */,/*27250*/14594/* D2F0 */,/*27251*/14595/* D2F1 */,/*27252*/14595/* D2F2 */, /*27253*/14595/* D2F3 */,/*27254*/14595/* D2F4 */,/*27255*/14595/* D2F5 */,/*27256*/14595/* D2F6 */, /*27257*/14595/* D2F7 */,/*27258*/14595/* D2F8 */,/*27259*/14595/* D2F9 */,/*27260*/14595/* D2FA */, /*27261*/14595/* D2FB */,/*27262*/14595/* D2FC */,/*27263*/14595/* D2FD */,/*27264*/14595/* D2FE */, /*27265*/14595/* D2FF */,/*27266*/14595/* D300 */,/*27267*/14595/* D301 */,/*27268*/14595/* D302 */, /*27269*/14595/* D303 */,/*27270*/14595/* D304 */,/*27271*/14595/* D305 */,/*27272*/14595/* D306 */, /*27273*/14595/* D307 */,/*27274*/14595/* D308 */,/*27275*/14595/* D309 */,/*27276*/14595/* D30A */, /*27277*/14595/* D30B */,/*27278*/14594/* D30C */,/*27279*/14595/* D30D */,/*27280*/14595/* D30E */, /*27281*/14595/* D30F */,/*27282*/14595/* D310 */,/*27283*/14595/* D311 */,/*27284*/14595/* D312 */, /*27285*/14595/* D313 */,/*27286*/14595/* D314 */,/*27287*/14595/* D315 */,/*27288*/14595/* D316 */, /*27289*/14595/* D317 */,/*27290*/14595/* D318 */,/*27291*/14595/* D319 */,/*27292*/14595/* D31A */, /*27293*/14595/* D31B */,/*27294*/14595/* D31C */,/*27295*/14595/* D31D */,/*27296*/14595/* D31E */, /*27297*/14595/* D31F */,/*27298*/14595/* D320 */,/*27299*/14595/* D321 */,/*27300*/14595/* D322 */, /*27301*/14595/* D323 */,/*27302*/14595/* D324 */,/*27303*/14595/* D325 */,/*27304*/14595/* D326 */, /*27305*/14595/* D327 */,/*27306*/14594/* D328 */,/*27307*/14595/* D329 */,/*27308*/14595/* D32A */, /*27309*/14595/* D32B */,/*27310*/14595/* D32C */,/*27311*/14595/* D32D */,/*27312*/14595/* D32E */, /*27313*/14595/* D32F */,/*27314*/14595/* D330 */,/*27315*/14595/* D331 */,/*27316*/14595/* D332 */, /*27317*/14595/* D333 */,/*27318*/14595/* D334 */,/*27319*/14595/* D335 */,/*27320*/14595/* D336 */, /*27321*/14595/* D337 */,/*27322*/14595/* D338 */,/*27323*/14595/* D339 */,/*27324*/14595/* D33A */, /*27325*/14595/* D33B */,/*27326*/14595/* D33C */,/*27327*/14595/* D33D */,/*27328*/14595/* D33E */, /*27329*/14595/* D33F */,/*27330*/14595/* D340 */,/*27331*/14595/* D341 */,/*27332*/14595/* D342 */, /*27333*/14595/* D343 */,/*27334*/14594/* D344 */,/*27335*/14595/* D345 */,/*27336*/14595/* D346 */, /*27337*/14595/* D347 */,/*27338*/14595/* D348 */,/*27339*/14595/* D349 */,/*27340*/14595/* D34A */, /*27341*/14595/* D34B */,/*27342*/14595/* D34C */,/*27343*/14595/* D34D */,/*27344*/14595/* D34E */, /*27345*/14595/* D34F */,/*27346*/14595/* D350 */,/*27347*/14595/* D351 */,/*27348*/14595/* D352 */, /*27349*/14595/* D353 */,/*27350*/14595/* D354 */,/*27351*/14595/* D355 */,/*27352*/14595/* D356 */, /*27353*/14595/* D357 */,/*27354*/14595/* D358 */,/*27355*/14595/* D359 */,/*27356*/14595/* D35A */, /*27357*/14595/* D35B */,/*27358*/14595/* D35C */,/*27359*/14595/* D35D */,/*27360*/14595/* D35E */, /*27361*/14595/* D35F */,/*27362*/14594/* D360 */,/*27363*/14595/* D361 */,/*27364*/14595/* D362 */, /*27365*/14595/* D363 */,/*27366*/14595/* D364 */,/*27367*/14595/* D365 */,/*27368*/14595/* D366 */, /*27369*/14595/* D367 */,/*27370*/14595/* D368 */,/*27371*/14595/* D369 */,/*27372*/14595/* D36A */, /*27373*/14595/* D36B */,/*27374*/14595/* D36C */,/*27375*/14595/* D36D */,/*27376*/14595/* D36E */, /*27377*/14595/* D36F */,/*27378*/14595/* D370 */,/*27379*/14595/* D371 */,/*27380*/14595/* D372 */, /*27381*/14595/* D373 */,/*27382*/14595/* D374 */,/*27383*/14595/* D375 */,/*27384*/14595/* D376 */, /*27385*/14595/* D377 */,/*27386*/14595/* D378 */,/*27387*/14595/* D379 */,/*27388*/14595/* D37A */, /*27389*/14595/* D37B */,/*27390*/14594/* D37C */,/*27391*/14595/* D37D */,/*27392*/14595/* D37E */, /*27393*/14595/* D37F */,/*27394*/14595/* D380 */,/*27395*/14595/* D381 */,/*27396*/14595/* D382 */, /*27397*/14595/* D383 */,/*27398*/14595/* D384 */,/*27399*/14595/* D385 */,/*27400*/14595/* D386 */, /*27401*/14595/* D387 */,/*27402*/14595/* D388 */,/*27403*/14595/* D389 */,/*27404*/14595/* D38A */, /*27405*/14595/* D38B */,/*27406*/14595/* D38C */,/*27407*/14595/* D38D */,/*27408*/14595/* D38E */, /*27409*/14595/* D38F */,/*27410*/14595/* D390 */,/*27411*/14595/* D391 */,/*27412*/14595/* D392 */, /*27413*/14595/* D393 */,/*27414*/14595/* D394 */,/*27415*/14595/* D395 */,/*27416*/14595/* D396 */, /*27417*/14595/* D397 */,/*27418*/14594/* D398 */,/*27419*/14595/* D399 */,/*27420*/14595/* D39A */, /*27421*/14595/* D39B */,/*27422*/14595/* D39C */,/*27423*/14595/* D39D */,/*27424*/14595/* D39E */, /*27425*/14595/* D39F */,/*27426*/14595/* D3A0 */,/*27427*/14595/* D3A1 */,/*27428*/14595/* D3A2 */, /*27429*/14595/* D3A3 */,/*27430*/14595/* D3A4 */,/*27431*/14595/* D3A5 */,/*27432*/14595/* D3A6 */, /*27433*/14595/* D3A7 */,/*27434*/14595/* D3A8 */,/*27435*/14595/* D3A9 */,/*27436*/14595/* D3AA */, /*27437*/14595/* D3AB */,/*27438*/14595/* D3AC */,/*27439*/14595/* D3AD */,/*27440*/14595/* D3AE */, /*27441*/14595/* D3AF */,/*27442*/14595/* D3B0 */,/*27443*/14595/* D3B1 */,/*27444*/14595/* D3B2 */, /*27445*/14595/* D3B3 */,/*27446*/14594/* D3B4 */,/*27447*/14595/* D3B5 */,/*27448*/14595/* D3B6 */, /*27449*/14595/* D3B7 */,/*27450*/14595/* D3B8 */,/*27451*/14595/* D3B9 */,/*27452*/14595/* D3BA */, /*27453*/14595/* D3BB */,/*27454*/14595/* D3BC */,/*27455*/14595/* D3BD */,/*27456*/14595/* D3BE */, /*27457*/14595/* D3BF */,/*27458*/14595/* D3C0 */,/*27459*/14595/* D3C1 */,/*27460*/14595/* D3C2 */, /*27461*/14595/* D3C3 */,/*27462*/14595/* D3C4 */,/*27463*/14595/* D3C5 */,/*27464*/14595/* D3C6 */, /*27465*/14595/* D3C7 */,/*27466*/14595/* D3C8 */,/*27467*/14595/* D3C9 */,/*27468*/14595/* D3CA */, /*27469*/14595/* D3CB */,/*27470*/14595/* D3CC */,/*27471*/14595/* D3CD */,/*27472*/14595/* D3CE */, /*27473*/14595/* D3CF */,/*27474*/14594/* D3D0 */,/*27475*/14595/* D3D1 */,/*27476*/14595/* D3D2 */, /*27477*/14595/* D3D3 */,/*27478*/14595/* D3D4 */,/*27479*/14595/* D3D5 */,/*27480*/14595/* D3D6 */, /*27481*/14595/* D3D7 */,/*27482*/14595/* D3D8 */,/*27483*/14595/* D3D9 */,/*27484*/14595/* D3DA */, /*27485*/14595/* D3DB */,/*27486*/14595/* D3DC */,/*27487*/14595/* D3DD */,/*27488*/14595/* D3DE */, /*27489*/14595/* D3DF */,/*27490*/14595/* D3E0 */,/*27491*/14595/* D3E1 */,/*27492*/14595/* D3E2 */, /*27493*/14595/* D3E3 */,/*27494*/14595/* D3E4 */,/*27495*/14595/* D3E5 */,/*27496*/14595/* D3E6 */, /*27497*/14595/* D3E7 */,/*27498*/14595/* D3E8 */,/*27499*/14595/* D3E9 */,/*27500*/14595/* D3EA */, /*27501*/14595/* D3EB */,/*27502*/14594/* D3EC */,/*27503*/14595/* D3ED */,/*27504*/14595/* D3EE */, /*27505*/14595/* D3EF */,/*27506*/14595/* D3F0 */,/*27507*/14595/* D3F1 */,/*27508*/14595/* D3F2 */, /*27509*/14595/* D3F3 */,/*27510*/14595/* D3F4 */,/*27511*/14595/* D3F5 */,/*27512*/14595/* D3F6 */, /*27513*/14595/* D3F7 */,/*27514*/14595/* D3F8 */,/*27515*/14595/* D3F9 */,/*27516*/14595/* D3FA */, /*27517*/14595/* D3FB */,/*27518*/14595/* D3FC */,/*27519*/14595/* D3FD */,/*27520*/14595/* D3FE */, /*27521*/14595/* D3FF */,/*27522*/14595/* D400 */,/*27523*/14595/* D401 */,/*27524*/14595/* D402 */, /*27525*/14595/* D403 */,/*27526*/14595/* D404 */,/*27527*/14595/* D405 */,/*27528*/14595/* D406 */, /*27529*/14595/* D407 */,/*27530*/14594/* D408 */,/*27531*/14595/* D409 */,/*27532*/14595/* D40A */, /*27533*/14595/* D40B */,/*27534*/14595/* D40C */,/*27535*/14595/* D40D */,/*27536*/14595/* D40E */, /*27537*/14595/* D40F */,/*27538*/14595/* D410 */,/*27539*/14595/* D411 */,/*27540*/14595/* D412 */, /*27541*/14595/* D413 */,/*27542*/14595/* D414 */,/*27543*/14595/* D415 */,/*27544*/14595/* D416 */, /*27545*/14595/* D417 */,/*27546*/14595/* D418 */,/*27547*/14595/* D419 */,/*27548*/14595/* D41A */, /*27549*/14595/* D41B */,/*27550*/14595/* D41C */,/*27551*/14595/* D41D */,/*27552*/14595/* D41E */, /*27553*/14595/* D41F */,/*27554*/14595/* D420 */,/*27555*/14595/* D421 */,/*27556*/14595/* D422 */, /*27557*/14595/* D423 */,/*27558*/14594/* D424 */,/*27559*/14595/* D425 */,/*27560*/14595/* D426 */, /*27561*/14595/* D427 */,/*27562*/14595/* D428 */,/*27563*/14595/* D429 */,/*27564*/14595/* D42A */, /*27565*/14595/* D42B */,/*27566*/14595/* D42C */,/*27567*/14595/* D42D */,/*27568*/14595/* D42E */, /*27569*/14595/* D42F */,/*27570*/14595/* D430 */,/*27571*/14595/* D431 */,/*27572*/14595/* D432 */, /*27573*/14595/* D433 */,/*27574*/14595/* D434 */,/*27575*/14595/* D435 */,/*27576*/14595/* D436 */, /*27577*/14595/* D437 */,/*27578*/14595/* D438 */,/*27579*/14595/* D439 */,/*27580*/14595/* D43A */, /*27581*/14595/* D43B */,/*27582*/14595/* D43C */,/*27583*/14595/* D43D */,/*27584*/14595/* D43E */, /*27585*/14595/* D43F */,/*27586*/14594/* D440 */,/*27587*/14595/* D441 */,/*27588*/14595/* D442 */, /*27589*/14595/* D443 */,/*27590*/14595/* D444 */,/*27591*/14595/* D445 */,/*27592*/14595/* D446 */, /*27593*/14595/* D447 */,/*27594*/14595/* D448 */,/*27595*/14595/* D449 */,/*27596*/14595/* D44A */, /*27597*/14595/* D44B */,/*27598*/14595/* D44C */,/*27599*/14595/* D44D */,/*27600*/14595/* D44E */, /*27601*/14595/* D44F */,/*27602*/14595/* D450 */,/*27603*/14595/* D451 */,/*27604*/14595/* D452 */, /*27605*/14595/* D453 */,/*27606*/14595/* D454 */,/*27607*/14595/* D455 */,/*27608*/14595/* D456 */, /*27609*/14595/* D457 */,/*27610*/14595/* D458 */,/*27611*/14595/* D459 */,/*27612*/14595/* D45A */, /*27613*/14595/* D45B */,/*27614*/14594/* D45C */,/*27615*/14595/* D45D */,/*27616*/14595/* D45E */, /*27617*/14595/* D45F */,/*27618*/14595/* D460 */,/*27619*/14595/* D461 */,/*27620*/14595/* D462 */, /*27621*/14595/* D463 */,/*27622*/14595/* D464 */,/*27623*/14595/* D465 */,/*27624*/14595/* D466 */, /*27625*/14595/* D467 */,/*27626*/14595/* D468 */,/*27627*/14595/* D469 */,/*27628*/14595/* D46A */, /*27629*/14595/* D46B */,/*27630*/14595/* D46C */,/*27631*/14595/* D46D */,/*27632*/14595/* D46E */, /*27633*/14595/* D46F */,/*27634*/14595/* D470 */,/*27635*/14595/* D471 */,/*27636*/14595/* D472 */, /*27637*/14595/* D473 */,/*27638*/14595/* D474 */,/*27639*/14595/* D475 */,/*27640*/14595/* D476 */, /*27641*/14595/* D477 */,/*27642*/14594/* D478 */,/*27643*/14595/* D479 */,/*27644*/14595/* D47A */, /*27645*/14595/* D47B */,/*27646*/14595/* D47C */,/*27647*/14595/* D47D */,/*27648*/14595/* D47E */, /*27649*/14595/* D47F */,/*27650*/14595/* D480 */,/*27651*/14595/* D481 */,/*27652*/14595/* D482 */, /*27653*/14595/* D483 */,/*27654*/14595/* D484 */,/*27655*/14595/* D485 */,/*27656*/14595/* D486 */, /*27657*/14595/* D487 */,/*27658*/14595/* D488 */,/*27659*/14595/* D489 */,/*27660*/14595/* D48A */, /*27661*/14595/* D48B */,/*27662*/14595/* D48C */,/*27663*/14595/* D48D */,/*27664*/14595/* D48E */, /*27665*/14595/* D48F */,/*27666*/14595/* D490 */,/*27667*/14595/* D491 */,/*27668*/14595/* D492 */, /*27669*/14595/* D493 */,/*27670*/14594/* D494 */,/*27671*/14595/* D495 */,/*27672*/14595/* D496 */, /*27673*/14595/* D497 */,/*27674*/14595/* D498 */,/*27675*/14595/* D499 */,/*27676*/14595/* D49A */, /*27677*/14595/* D49B */,/*27678*/14595/* D49C */,/*27679*/14595/* D49D */,/*27680*/14595/* D49E */, /*27681*/14595/* D49F */,/*27682*/14595/* D4A0 */,/*27683*/14595/* D4A1 */,/*27684*/14595/* D4A2 */, /*27685*/14595/* D4A3 */,/*27686*/14595/* D4A4 */,/*27687*/14595/* D4A5 */,/*27688*/14595/* D4A6 */, /*27689*/14595/* D4A7 */,/*27690*/14595/* D4A8 */,/*27691*/14595/* D4A9 */,/*27692*/14595/* D4AA */, /*27693*/14595/* D4AB */,/*27694*/14595/* D4AC */,/*27695*/14595/* D4AD */,/*27696*/14595/* D4AE */, /*27697*/14595/* D4AF */,/*27698*/14594/* D4B0 */,/*27699*/14595/* D4B1 */,/*27700*/14595/* D4B2 */, /*27701*/14595/* D4B3 */,/*27702*/14595/* D4B4 */,/*27703*/14595/* D4B5 */,/*27704*/14595/* D4B6 */, /*27705*/14595/* D4B7 */,/*27706*/14595/* D4B8 */,/*27707*/14595/* D4B9 */,/*27708*/14595/* D4BA */, /*27709*/14595/* D4BB */,/*27710*/14595/* D4BC */,/*27711*/14595/* D4BD */,/*27712*/14595/* D4BE */, /*27713*/14595/* D4BF */,/*27714*/14595/* D4C0 */,/*27715*/14595/* D4C1 */,/*27716*/14595/* D4C2 */, /*27717*/14595/* D4C3 */,/*27718*/14595/* D4C4 */,/*27719*/14595/* D4C5 */,/*27720*/14595/* D4C6 */, /*27721*/14595/* D4C7 */,/*27722*/14595/* D4C8 */,/*27723*/14595/* D4C9 */,/*27724*/14595/* D4CA */, /*27725*/14595/* D4CB */,/*27726*/14594/* D4CC */,/*27727*/14595/* D4CD */,/*27728*/14595/* D4CE */, /*27729*/14595/* D4CF */,/*27730*/14595/* D4D0 */,/*27731*/14595/* D4D1 */,/*27732*/14595/* D4D2 */, /*27733*/14595/* D4D3 */,/*27734*/14595/* D4D4 */,/*27735*/14595/* D4D5 */,/*27736*/14595/* D4D6 */, /*27737*/14595/* D4D7 */,/*27738*/14595/* D4D8 */,/*27739*/14595/* D4D9 */,/*27740*/14595/* D4DA */, /*27741*/14595/* D4DB */,/*27742*/14595/* D4DC */,/*27743*/14595/* D4DD */,/*27744*/14595/* D4DE */, /*27745*/14595/* D4DF */,/*27746*/14595/* D4E0 */,/*27747*/14595/* D4E1 */,/*27748*/14595/* D4E2 */, /*27749*/14595/* D4E3 */,/*27750*/14595/* D4E4 */,/*27751*/14595/* D4E5 */,/*27752*/14595/* D4E6 */, /*27753*/14595/* D4E7 */,/*27754*/14594/* D4E8 */,/*27755*/14595/* D4E9 */,/*27756*/14595/* D4EA */, /*27757*/14595/* D4EB */,/*27758*/14595/* D4EC */,/*27759*/14595/* D4ED */,/*27760*/14595/* D4EE */, /*27761*/14595/* D4EF */,/*27762*/14595/* D4F0 */,/*27763*/14595/* D4F1 */,/*27764*/14595/* D4F2 */, /*27765*/14595/* D4F3 */,/*27766*/14595/* D4F4 */,/*27767*/14595/* D4F5 */,/*27768*/14595/* D4F6 */, /*27769*/14595/* D4F7 */,/*27770*/14595/* D4F8 */,/*27771*/14595/* D4F9 */,/*27772*/14595/* D4FA */, /*27773*/14595/* D4FB */,/*27774*/14595/* D4FC */,/*27775*/14595/* D4FD */,/*27776*/14595/* D4FE */, /*27777*/14595/* D4FF */,/*27778*/14595/* D500 */,/*27779*/14595/* D501 */,/*27780*/14595/* D502 */, /*27781*/14595/* D503 */,/*27782*/14594/* D504 */,/*27783*/14595/* D505 */,/*27784*/14595/* D506 */, /*27785*/14595/* D507 */,/*27786*/14595/* D508 */,/*27787*/14595/* D509 */,/*27788*/14595/* D50A */, /*27789*/14595/* D50B */,/*27790*/14595/* D50C */,/*27791*/14595/* D50D */,/*27792*/14595/* D50E */, /*27793*/14595/* D50F */,/*27794*/14595/* D510 */,/*27795*/14595/* D511 */,/*27796*/14595/* D512 */, /*27797*/14595/* D513 */,/*27798*/14595/* D514 */,/*27799*/14595/* D515 */,/*27800*/14595/* D516 */, /*27801*/14595/* D517 */,/*27802*/14595/* D518 */,/*27803*/14595/* D519 */,/*27804*/14595/* D51A */, /*27805*/14595/* D51B */,/*27806*/14595/* D51C */,/*27807*/14595/* D51D */,/*27808*/14595/* D51E */, /*27809*/14595/* D51F */,/*27810*/14594/* D520 */,/*27811*/14595/* D521 */,/*27812*/14595/* D522 */, /*27813*/14595/* D523 */,/*27814*/14595/* D524 */,/*27815*/14595/* D525 */,/*27816*/14595/* D526 */, /*27817*/14595/* D527 */,/*27818*/14595/* D528 */,/*27819*/14595/* D529 */,/*27820*/14595/* D52A */, /*27821*/14595/* D52B */,/*27822*/14595/* D52C */,/*27823*/14595/* D52D */,/*27824*/14595/* D52E */, /*27825*/14595/* D52F */,/*27826*/14595/* D530 */,/*27827*/14595/* D531 */,/*27828*/14595/* D532 */, /*27829*/14595/* D533 */,/*27830*/14595/* D534 */,/*27831*/14595/* D535 */,/*27832*/14595/* D536 */, /*27833*/14595/* D537 */,/*27834*/14595/* D538 */,/*27835*/14595/* D539 */,/*27836*/14595/* D53A */, /*27837*/14595/* D53B */,/*27838*/14594/* D53C */,/*27839*/14595/* D53D */,/*27840*/14595/* D53E */, /*27841*/14595/* D53F */,/*27842*/14595/* D540 */,/*27843*/14595/* D541 */,/*27844*/14595/* D542 */, /*27845*/14595/* D543 */,/*27846*/14595/* D544 */,/*27847*/14595/* D545 */,/*27848*/14595/* D546 */, /*27849*/14595/* D547 */,/*27850*/14595/* D548 */,/*27851*/14595/* D549 */,/*27852*/14595/* D54A */, /*27853*/14595/* D54B */,/*27854*/14595/* D54C */,/*27855*/14595/* D54D */,/*27856*/14595/* D54E */, /*27857*/14595/* D54F */,/*27858*/14595/* D550 */,/*27859*/14595/* D551 */,/*27860*/14595/* D552 */, /*27861*/14595/* D553 */,/*27862*/14595/* D554 */,/*27863*/14595/* D555 */,/*27864*/14595/* D556 */, /*27865*/14595/* D557 */,/*27866*/14594/* D558 */,/*27867*/14595/* D559 */,/*27868*/14595/* D55A */, /*27869*/14595/* D55B */,/*27870*/14595/* D55C */,/*27871*/14595/* D55D */,/*27872*/14595/* D55E */, /*27873*/14595/* D55F */,/*27874*/14595/* D560 */,/*27875*/14595/* D561 */,/*27876*/14595/* D562 */, /*27877*/14595/* D563 */,/*27878*/14595/* D564 */,/*27879*/14595/* D565 */,/*27880*/14595/* D566 */, /*27881*/14595/* D567 */,/*27882*/14595/* D568 */,/*27883*/14595/* D569 */,/*27884*/14595/* D56A */, /*27885*/14595/* D56B */,/*27886*/14595/* D56C */,/*27887*/14595/* D56D */,/*27888*/14595/* D56E */, /*27889*/14595/* D56F */,/*27890*/14595/* D570 */,/*27891*/14595/* D571 */,/*27892*/14595/* D572 */, /*27893*/14595/* D573 */,/*27894*/14594/* D574 */,/*27895*/14595/* D575 */,/*27896*/14595/* D576 */, /*27897*/14595/* D577 */,/*27898*/14595/* D578 */,/*27899*/14595/* D579 */,/*27900*/14595/* D57A */, /*27901*/14595/* D57B */,/*27902*/14595/* D57C */,/*27903*/14595/* D57D */,/*27904*/14595/* D57E */, /*27905*/14595/* D57F */,/*27906*/14595/* D580 */,/*27907*/14595/* D581 */,/*27908*/14595/* D582 */, /*27909*/14595/* D583 */,/*27910*/14595/* D584 */,/*27911*/14595/* D585 */,/*27912*/14595/* D586 */, /*27913*/14595/* D587 */,/*27914*/14595/* D588 */,/*27915*/14595/* D589 */,/*27916*/14595/* D58A */, /*27917*/14595/* D58B */,/*27918*/14595/* D58C */,/*27919*/14595/* D58D */,/*27920*/14595/* D58E */, /*27921*/14595/* D58F */,/*27922*/14594/* D590 */,/*27923*/14595/* D591 */,/*27924*/14595/* D592 */, /*27925*/14595/* D593 */,/*27926*/14595/* D594 */,/*27927*/14595/* D595 */,/*27928*/14595/* D596 */, /*27929*/14595/* D597 */,/*27930*/14595/* D598 */,/*27931*/14595/* D599 */,/*27932*/14595/* D59A */, /*27933*/14595/* D59B */,/*27934*/14595/* D59C */,/*27935*/14595/* D59D */,/*27936*/14595/* D59E */, /*27937*/14595/* D59F */,/*27938*/14595/* D5A0 */,/*27939*/14595/* D5A1 */,/*27940*/14595/* D5A2 */, /*27941*/14595/* D5A3 */,/*27942*/14595/* D5A4 */,/*27943*/14595/* D5A5 */,/*27944*/14595/* D5A6 */, /*27945*/14595/* D5A7 */,/*27946*/14595/* D5A8 */,/*27947*/14595/* D5A9 */,/*27948*/14595/* D5AA */, /*27949*/14595/* D5AB */,/*27950*/14594/* D5AC */,/*27951*/14595/* D5AD */,/*27952*/14595/* D5AE */, /*27953*/14595/* D5AF */,/*27954*/14595/* D5B0 */,/*27955*/14595/* D5B1 */,/*27956*/14595/* D5B2 */, /*27957*/14595/* D5B3 */,/*27958*/14595/* D5B4 */,/*27959*/14595/* D5B5 */,/*27960*/14595/* D5B6 */, /*27961*/14595/* D5B7 */,/*27962*/14595/* D5B8 */,/*27963*/14595/* D5B9 */,/*27964*/14595/* D5BA */, /*27965*/14595/* D5BB */,/*27966*/14595/* D5BC */,/*27967*/14595/* D5BD */,/*27968*/14595/* D5BE */, /*27969*/14595/* D5BF */,/*27970*/14595/* D5C0 */,/*27971*/14595/* D5C1 */,/*27972*/14595/* D5C2 */, /*27973*/14595/* D5C3 */,/*27974*/14595/* D5C4 */,/*27975*/14595/* D5C5 */,/*27976*/14595/* D5C6 */, /*27977*/14595/* D5C7 */,/*27978*/14594/* D5C8 */,/*27979*/14595/* D5C9 */,/*27980*/14595/* D5CA */, /*27981*/14595/* D5CB */,/*27982*/14595/* D5CC */,/*27983*/14595/* D5CD */,/*27984*/14595/* D5CE */, /*27985*/14595/* D5CF */,/*27986*/14595/* D5D0 */,/*27987*/14595/* D5D1 */,/*27988*/14595/* D5D2 */, /*27989*/14595/* D5D3 */,/*27990*/14595/* D5D4 */,/*27991*/14595/* D5D5 */,/*27992*/14595/* D5D6 */, /*27993*/14595/* D5D7 */,/*27994*/14595/* D5D8 */,/*27995*/14595/* D5D9 */,/*27996*/14595/* D5DA */, /*27997*/14595/* D5DB */,/*27998*/14595/* D5DC */,/*27999*/14595/* D5DD */,/*28000*/14595/* D5DE */, /*28001*/14595/* D5DF */,/*28002*/14595/* D5E0 */,/*28003*/14595/* D5E1 */,/*28004*/14595/* D5E2 */, /*28005*/14595/* D5E3 */,/*28006*/14594/* D5E4 */,/*28007*/14595/* D5E5 */,/*28008*/14595/* D5E6 */, /*28009*/14595/* D5E7 */,/*28010*/14595/* D5E8 */,/*28011*/14595/* D5E9 */,/*28012*/14595/* D5EA */, /*28013*/14595/* D5EB */,/*28014*/14595/* D5EC */,/*28015*/14595/* D5ED */,/*28016*/14595/* D5EE */, /*28017*/14595/* D5EF */,/*28018*/14595/* D5F0 */,/*28019*/14595/* D5F1 */,/*28020*/14595/* D5F2 */, /*28021*/14595/* D5F3 */,/*28022*/14595/* D5F4 */,/*28023*/14595/* D5F5 */,/*28024*/14595/* D5F6 */, /*28025*/14595/* D5F7 */,/*28026*/14595/* D5F8 */,/*28027*/14595/* D5F9 */,/*28028*/14595/* D5FA */, /*28029*/14595/* D5FB */,/*28030*/14595/* D5FC */,/*28031*/14595/* D5FD */,/*28032*/14595/* D5FE */, /*28033*/14595/* D5FF */,/*28034*/14594/* D600 */,/*28035*/14595/* D601 */,/*28036*/14595/* D602 */, /*28037*/14595/* D603 */,/*28038*/14595/* D604 */,/*28039*/14595/* D605 */,/*28040*/14595/* D606 */, /*28041*/14595/* D607 */,/*28042*/14595/* D608 */,/*28043*/14595/* D609 */,/*28044*/14595/* D60A */, /*28045*/14595/* D60B */,/*28046*/14595/* D60C */,/*28047*/14595/* D60D */,/*28048*/14595/* D60E */, /*28049*/14595/* D60F */,/*28050*/14595/* D610 */,/*28051*/14595/* D611 */,/*28052*/14595/* D612 */, /*28053*/14595/* D613 */,/*28054*/14595/* D614 */,/*28055*/14595/* D615 */,/*28056*/14595/* D616 */, /*28057*/14595/* D617 */,/*28058*/14595/* D618 */,/*28059*/14595/* D619 */,/*28060*/14595/* D61A */, /*28061*/14595/* D61B */,/*28062*/14594/* D61C */,/*28063*/14595/* D61D */,/*28064*/14595/* D61E */, /*28065*/14595/* D61F */,/*28066*/14595/* D620 */,/*28067*/14595/* D621 */,/*28068*/14595/* D622 */, /*28069*/14595/* D623 */,/*28070*/14595/* D624 */,/*28071*/14595/* D625 */,/*28072*/14595/* D626 */, /*28073*/14595/* D627 */,/*28074*/14595/* D628 */,/*28075*/14595/* D629 */,/*28076*/14595/* D62A */, /*28077*/14595/* D62B */,/*28078*/14595/* D62C */,/*28079*/14595/* D62D */,/*28080*/14595/* D62E */, /*28081*/14595/* D62F */,/*28082*/14595/* D630 */,/*28083*/14595/* D631 */,/*28084*/14595/* D632 */, /*28085*/14595/* D633 */,/*28086*/14595/* D634 */,/*28087*/14595/* D635 */,/*28088*/14595/* D636 */, /*28089*/14595/* D637 */,/*28090*/14594/* D638 */,/*28091*/14595/* D639 */,/*28092*/14595/* D63A */, /*28093*/14595/* D63B */,/*28094*/14595/* D63C */,/*28095*/14595/* D63D */,/*28096*/14595/* D63E */, /*28097*/14595/* D63F */,/*28098*/14595/* D640 */,/*28099*/14595/* D641 */,/*28100*/14595/* D642 */, /*28101*/14595/* D643 */,/*28102*/14595/* D644 */,/*28103*/14595/* D645 */,/*28104*/14595/* D646 */, /*28105*/14595/* D647 */,/*28106*/14595/* D648 */,/*28107*/14595/* D649 */,/*28108*/14595/* D64A */, /*28109*/14595/* D64B */,/*28110*/14595/* D64C */,/*28111*/14595/* D64D */,/*28112*/14595/* D64E */, /*28113*/14595/* D64F */,/*28114*/14595/* D650 */,/*28115*/14595/* D651 */,/*28116*/14595/* D652 */, /*28117*/14595/* D653 */,/*28118*/14594/* D654 */,/*28119*/14595/* D655 */,/*28120*/14595/* D656 */, /*28121*/14595/* D657 */,/*28122*/14595/* D658 */,/*28123*/14595/* D659 */,/*28124*/14595/* D65A */, /*28125*/14595/* D65B */,/*28126*/14595/* D65C */,/*28127*/14595/* D65D */,/*28128*/14595/* D65E */, /*28129*/14595/* D65F */,/*28130*/14595/* D660 */,/*28131*/14595/* D661 */,/*28132*/14595/* D662 */, /*28133*/14595/* D663 */,/*28134*/14595/* D664 */,/*28135*/14595/* D665 */,/*28136*/14595/* D666 */, /*28137*/14595/* D667 */,/*28138*/14595/* D668 */,/*28139*/14595/* D669 */,/*28140*/14595/* D66A */, /*28141*/14595/* D66B */,/*28142*/14595/* D66C */,/*28143*/14595/* D66D */,/*28144*/14595/* D66E */, /*28145*/14595/* D66F */,/*28146*/14594/* D670 */,/*28147*/14595/* D671 */,/*28148*/14595/* D672 */, /*28149*/14595/* D673 */,/*28150*/14595/* D674 */,/*28151*/14595/* D675 */,/*28152*/14595/* D676 */, /*28153*/14595/* D677 */,/*28154*/14595/* D678 */,/*28155*/14595/* D679 */,/*28156*/14595/* D67A */, /*28157*/14595/* D67B */,/*28158*/14595/* D67C */,/*28159*/14595/* D67D */,/*28160*/14595/* D67E */, /*28161*/14595/* D67F */,/*28162*/14595/* D680 */,/*28163*/14595/* D681 */,/*28164*/14595/* D682 */, /*28165*/14595/* D683 */,/*28166*/14595/* D684 */,/*28167*/14595/* D685 */,/*28168*/14595/* D686 */, /*28169*/14595/* D687 */,/*28170*/14595/* D688 */,/*28171*/14595/* D689 */,/*28172*/14595/* D68A */, /*28173*/14595/* D68B */,/*28174*/14594/* D68C */,/*28175*/14595/* D68D */,/*28176*/14595/* D68E */, /*28177*/14595/* D68F */,/*28178*/14595/* D690 */,/*28179*/14595/* D691 */,/*28180*/14595/* D692 */, /*28181*/14595/* D693 */,/*28182*/14595/* D694 */,/*28183*/14595/* D695 */,/*28184*/14595/* D696 */, /*28185*/14595/* D697 */,/*28186*/14595/* D698 */,/*28187*/14595/* D699 */,/*28188*/14595/* D69A */, /*28189*/14595/* D69B */,/*28190*/14595/* D69C */,/*28191*/14595/* D69D */,/*28192*/14595/* D69E */, /*28193*/14595/* D69F */,/*28194*/14595/* D6A0 */,/*28195*/14595/* D6A1 */,/*28196*/14595/* D6A2 */, /*28197*/14595/* D6A3 */,/*28198*/14595/* D6A4 */,/*28199*/14595/* D6A5 */,/*28200*/14595/* D6A6 */, /*28201*/14595/* D6A7 */,/*28202*/14594/* D6A8 */,/*28203*/14595/* D6A9 */,/*28204*/14595/* D6AA */, /*28205*/14595/* D6AB */,/*28206*/14595/* D6AC */,/*28207*/14595/* D6AD */,/*28208*/14595/* D6AE */, /*28209*/14595/* D6AF */,/*28210*/14595/* D6B0 */,/*28211*/14595/* D6B1 */,/*28212*/14595/* D6B2 */, /*28213*/14595/* D6B3 */,/*28214*/14595/* D6B4 */,/*28215*/14595/* D6B5 */,/*28216*/14595/* D6B6 */, /*28217*/14595/* D6B7 */,/*28218*/14595/* D6B8 */,/*28219*/14595/* D6B9 */,/*28220*/14595/* D6BA */, /*28221*/14595/* D6BB */,/*28222*/14595/* D6BC */,/*28223*/14595/* D6BD */,/*28224*/14595/* D6BE */, /*28225*/14595/* D6BF */,/*28226*/14595/* D6C0 */,/*28227*/14595/* D6C1 */,/*28228*/14595/* D6C2 */, /*28229*/14595/* D6C3 */,/*28230*/14594/* D6C4 */,/*28231*/14595/* D6C5 */,/*28232*/14595/* D6C6 */, /*28233*/14595/* D6C7 */,/*28234*/14595/* D6C8 */,/*28235*/14595/* D6C9 */,/*28236*/14595/* D6CA */, /*28237*/14595/* D6CB */,/*28238*/14595/* D6CC */,/*28239*/14595/* D6CD */,/*28240*/14595/* D6CE */, /*28241*/14595/* D6CF */,/*28242*/14595/* D6D0 */,/*28243*/14595/* D6D1 */,/*28244*/14595/* D6D2 */, /*28245*/14595/* D6D3 */,/*28246*/14595/* D6D4 */,/*28247*/14595/* D6D5 */,/*28248*/14595/* D6D6 */, /*28249*/14595/* D6D7 */,/*28250*/14595/* D6D8 */,/*28251*/14595/* D6D9 */,/*28252*/14595/* D6DA */, /*28253*/14595/* D6DB */,/*28254*/14595/* D6DC */,/*28255*/14595/* D6DD */,/*28256*/14595/* D6DE */, /*28257*/14595/* D6DF */,/*28258*/14594/* D6E0 */,/*28259*/14595/* D6E1 */,/*28260*/14595/* D6E2 */, /*28261*/14595/* D6E3 */,/*28262*/14595/* D6E4 */,/*28263*/14595/* D6E5 */,/*28264*/14595/* D6E6 */, /*28265*/14595/* D6E7 */,/*28266*/14595/* D6E8 */,/*28267*/14595/* D6E9 */,/*28268*/14595/* D6EA */, /*28269*/14595/* D6EB */,/*28270*/14595/* D6EC */,/*28271*/14595/* D6ED */,/*28272*/14595/* D6EE */, /*28273*/14595/* D6EF */,/*28274*/14595/* D6F0 */,/*28275*/14595/* D6F1 */,/*28276*/14595/* D6F2 */, /*28277*/14595/* D6F3 */,/*28278*/14595/* D6F4 */,/*28279*/14595/* D6F5 */,/*28280*/14595/* D6F6 */, /*28281*/14595/* D6F7 */,/*28282*/14595/* D6F8 */,/*28283*/14595/* D6F9 */,/*28284*/14595/* D6FA */, /*28285*/14595/* D6FB */,/*28286*/14594/* D6FC */,/*28287*/14595/* D6FD */,/*28288*/14595/* D6FE */, /*28289*/14595/* D6FF */,/*28290*/14595/* D700 */,/*28291*/14595/* D701 */,/*28292*/14595/* D702 */, /*28293*/14595/* D703 */,/*28294*/14595/* D704 */,/*28295*/14595/* D705 */,/*28296*/14595/* D706 */, /*28297*/14595/* D707 */,/*28298*/14595/* D708 */,/*28299*/14595/* D709 */,/*28300*/14595/* D70A */, /*28301*/14595/* D70B */,/*28302*/14595/* D70C */,/*28303*/14595/* D70D */,/*28304*/14595/* D70E */, /*28305*/14595/* D70F */,/*28306*/14595/* D710 */,/*28307*/14595/* D711 */,/*28308*/14595/* D712 */, /*28309*/14595/* D713 */,/*28310*/14595/* D714 */,/*28311*/14595/* D715 */,/*28312*/14595/* D716 */, /*28313*/14595/* D717 */,/*28314*/14594/* D718 */,/*28315*/14595/* D719 */,/*28316*/14595/* D71A */, /*28317*/14595/* D71B */,/*28318*/14595/* D71C */,/*28319*/14595/* D71D */,/*28320*/14595/* D71E */, /*28321*/14595/* D71F */,/*28322*/14595/* D720 */,/*28323*/14595/* D721 */,/*28324*/14595/* D722 */, /*28325*/14595/* D723 */,/*28326*/14595/* D724 */,/*28327*/14595/* D725 */,/*28328*/14595/* D726 */, /*28329*/14595/* D727 */,/*28330*/14595/* D728 */,/*28331*/14595/* D729 */,/*28332*/14595/* D72A */, /*28333*/14595/* D72B */,/*28334*/14595/* D72C */,/*28335*/14595/* D72D */,/*28336*/14595/* D72E */, /*28337*/14595/* D72F */,/*28338*/14595/* D730 */,/*28339*/14595/* D731 */,/*28340*/14595/* D732 */, /*28341*/14595/* D733 */,/*28342*/14594/* D734 */,/*28343*/14595/* D735 */,/*28344*/14595/* D736 */, /*28345*/14595/* D737 */,/*28346*/14595/* D738 */,/*28347*/14595/* D739 */,/*28348*/14595/* D73A */, /*28349*/14595/* D73B */,/*28350*/14595/* D73C */,/*28351*/14595/* D73D */,/*28352*/14595/* D73E */, /*28353*/14595/* D73F */,/*28354*/14595/* D740 */,/*28355*/14595/* D741 */,/*28356*/14595/* D742 */, /*28357*/14595/* D743 */,/*28358*/14595/* D744 */,/*28359*/14595/* D745 */,/*28360*/14595/* D746 */, /*28361*/14595/* D747 */,/*28362*/14595/* D748 */,/*28363*/14595/* D749 */,/*28364*/14595/* D74A */, /*28365*/14595/* D74B */,/*28366*/14595/* D74C */,/*28367*/14595/* D74D */,/*28368*/14595/* D74E */, /*28369*/14595/* D74F */,/*28370*/14594/* D750 */,/*28371*/14595/* D751 */,/*28372*/14595/* D752 */, /*28373*/14595/* D753 */,/*28374*/14595/* D754 */,/*28375*/14595/* D755 */,/*28376*/14595/* D756 */, /*28377*/14595/* D757 */,/*28378*/14595/* D758 */,/*28379*/14595/* D759 */,/*28380*/14595/* D75A */, /*28381*/14595/* D75B */,/*28382*/14595/* D75C */,/*28383*/14595/* D75D */,/*28384*/14595/* D75E */, /*28385*/14595/* D75F */,/*28386*/14595/* D760 */,/*28387*/14595/* D761 */,/*28388*/14595/* D762 */, /*28389*/14595/* D763 */,/*28390*/14595/* D764 */,/*28391*/14595/* D765 */,/*28392*/14595/* D766 */, /*28393*/14595/* D767 */,/*28394*/14595/* D768 */,/*28395*/14595/* D769 */,/*28396*/14595/* D76A */, /*28397*/14595/* D76B */,/*28398*/14594/* D76C */,/*28399*/14595/* D76D */,/*28400*/14595/* D76E */, /*28401*/14595/* D76F */,/*28402*/14595/* D770 */,/*28403*/14595/* D771 */,/*28404*/14595/* D772 */, /*28405*/14595/* D773 */,/*28406*/14595/* D774 */,/*28407*/14595/* D775 */,/*28408*/14595/* D776 */, /*28409*/14595/* D777 */,/*28410*/14595/* D778 */,/*28411*/14595/* D779 */,/*28412*/14595/* D77A */, /*28413*/14595/* D77B */,/*28414*/14595/* D77C */,/*28415*/14595/* D77D */,/*28416*/14595/* D77E */, /*28417*/14595/* D77F */,/*28418*/14595/* D780 */,/*28419*/14595/* D781 */,/*28420*/14595/* D782 */, /*28421*/14595/* D783 */,/*28422*/14595/* D784 */,/*28423*/14595/* D785 */,/*28424*/14595/* D786 */, /*28425*/14595/* D787 */,/*28426*/14594/* D788 */,/*28427*/14595/* D789 */,/*28428*/14595/* D78A */, /*28429*/14595/* D78B */,/*28430*/14595/* D78C */,/*28431*/14595/* D78D */,/*28432*/14595/* D78E */, /*28433*/14595/* D78F */,/*28434*/14595/* D790 */,/*28435*/14595/* D791 */,/*28436*/14595/* D792 */, /*28437*/14595/* D793 */,/*28438*/14595/* D794 */,/*28439*/14595/* D795 */,/*28440*/14595/* D796 */, /*28441*/14595/* D797 */,/*28442*/14595/* D798 */,/*28443*/14595/* D799 */,/*28444*/14595/* D79A */, /*28445*/14595/* D79B */,/*28446*/14595/* D79C */,/*28447*/14595/* D79D */,/*28448*/14595/* D79E */, /*28449*/14595/* D79F */,/*28450*/14595/* D7A0 */,/*28451*/14595/* D7A1 */,/*28452*/14595/* D7A2 */, /*28453*/14595/* D7A3 */,0,0,0,0,0,0,0,0,0,0,0,0,/*28466*/14596/* D7B0 */,/*28467*/14597/* D7B1 */, /*28468*/14598/* D7B2 */,/*28469*/14599/* D7B3 */,/*28470*/14600/* D7B4 */,/*28471*/14601/* D7B5 */, /*28472*/14602/* D7B6 */,/*28473*/14603/* D7B7 */,/*28474*/14604/* D7B8 */,/*28475*/14605/* D7B9 */, /*28476*/14606/* D7BA */,/*28477*/14607/* D7BB */,/*28478*/14608/* D7BC */,/*28479*/14609/* D7BD */, /*28480*/14610/* D7BE */,/*28481*/14611/* D7BF */,/*28482*/14612/* D7C0 */,/*28483*/14613/* D7C1 */, /*28484*/14614/* D7C2 */,/*28485*/14615/* D7C3 */,/*28486*/14616/* D7C4 */,/*28487*/14617/* D7C5 */, /*28488*/14618/* D7C6 */,0,0,0,0,/*28493*/14619/* D7CB */,/*28494*/14620/* D7CC */,/*28495*/14621/* D7CD */, /*28496*/14622/* D7CE */,/*28497*/14623/* D7CF */,/*28498*/14624/* D7D0 */,/*28499*/14625/* D7D1 */, /*28500*/14626/* D7D2 */,/*28501*/14627/* D7D3 */,/*28502*/14628/* D7D4 */,/*28503*/14629/* D7D5 */, /*28504*/14630/* D7D6 */,/*28505*/14631/* D7D7 */,/*28506*/14632/* D7D8 */,/*28507*/14633/* D7D9 */, /*28508*/14634/* D7DA */,/*28509*/14635/* D7DB */,/*28510*/14636/* D7DC */,/*28511*/14637/* D7DD */, /*28512*/14638/* D7DE */,/*28513*/14639/* D7DF */,/*28514*/14640/* D7E0 */,/*28515*/14641/* D7E1 */, /*28516*/14642/* D7E2 */,/*28517*/14643/* D7E3 */,/*28518*/14644/* D7E4 */,/*28519*/14645/* D7E5 */, /*28520*/14646/* D7E6 */,/*28521*/14647/* D7E7 */,/*28522*/14648/* D7E8 */,/*28523*/14649/* D7E9 */, /*28524*/14650/* D7EA */,/*28525*/14651/* D7EB */,/*28526*/14652/* D7EC */,/*28527*/14653/* D7ED */, /*28528*/14654/* D7EE */,/*28529*/14655/* D7EF */,/*28530*/14656/* D7F0 */,/*28531*/14657/* D7F1 */, /*28532*/14658/* D7F2 */,/*28533*/14659/* D7F3 */,/*28534*/14660/* D7F4 */,/*28535*/14661/* D7F5 */, /*28536*/14662/* D7F6 */,/*28537*/14663/* D7F7 */,/*28538*/14664/* D7F8 */,/*28539*/14665/* D7F9 */, /*28540*/14666/* D7FA */,/*28541*/14667/* D7FB */,0,0,0,0,/*28546*/14668/* D800 */,/*28547*/14669/* DB80 */, /*28548*/14670/* DC00 */,/*28549*/14671/* E000 */,/*28550*/14672/* F900 */,/*28551*/14673/* F901 */, /*28552*/14674/* F902 */,/*28553*/14675/* F903 */,/*28554*/14676/* F904 */,/*28555*/14677/* F905 */, /*28556*/14678/* F906 */,/*28557*/14679/* F907 */,/*28558*/14680/* F908 */,/*28559*/14681/* F909 */, /*28560*/14682/* F90A */,/*28561*/14683/* F90B */,/*28562*/14684/* F90C */,/*28563*/14685/* F90D */, /*28564*/14686/* F90E */,/*28565*/14687/* F90F */,/*28566*/14688/* F910 */,/*28567*/14689/* F911 */, /*28568*/14690/* F912 */,/*28569*/14691/* F913 */,/*28570*/14692/* F914 */,/*28571*/14693/* F915 */, /*28572*/14694/* F916 */,/*28573*/14695/* F917 */,/*28574*/14696/* F918 */,/*28575*/14697/* F919 */, /*28576*/14698/* F91A */,/*28577*/14699/* F91B */,/*28578*/14700/* F91C */,/*28579*/14701/* F91D */, /*28580*/14702/* F91E */,/*28581*/14703/* F91F */,/*28582*/14704/* F920 */,/*28583*/14705/* F921 */, /*28584*/14706/* F922 */,/*28585*/14707/* F923 */,/*28586*/14708/* F924 */,/*28587*/14709/* F925 */, /*28588*/14710/* F926 */,/*28589*/14711/* F927 */,/*28590*/14712/* F928 */,/*28591*/14713/* F929 */, /*28592*/14714/* F92A */,/*28593*/14715/* F92B */,/*28594*/14716/* F92C */,/*28595*/14717/* F92D */, /*28596*/14718/* F92E */,/*28597*/14719/* F92F */,/*28598*/14720/* F930 */,/*28599*/14721/* F931 */, /*28600*/14722/* F932 */,/*28601*/14723/* F933 */,/*28602*/14724/* F934 */,/*28603*/14725/* F935 */, /*28604*/14726/* F936 */,/*28605*/14727/* F937 */,/*28606*/14728/* F938 */,/*28607*/14729/* F939 */, /*28608*/14730/* F93A */,/*28609*/14731/* F93B */,/*28610*/14732/* F93C */,/*28611*/14733/* F93D */, /*28612*/14734/* F93E */,/*28613*/14735/* F93F */,/*28614*/14736/* F940 */,/*28615*/14737/* F941 */, /*28616*/14738/* F942 */,/*28617*/14739/* F943 */,/*28618*/14740/* F944 */,/*28619*/14741/* F945 */, /*28620*/14742/* F946 */,/*28621*/14743/* F947 */,/*28622*/14744/* F948 */,/*28623*/14745/* F949 */, /*28624*/14746/* F94A */,/*28625*/14747/* F94B */,/*28626*/14748/* F94C */,/*28627*/14749/* F94D */, /*28628*/14750/* F94E */,/*28629*/14751/* F94F */,/*28630*/14752/* F950 */,/*28631*/14753/* F951 */, /*28632*/14754/* F952 */,/*28633*/14755/* F953 */,/*28634*/14756/* F954 */,/*28635*/14757/* F955 */, /*28636*/14758/* F956 */,/*28637*/14759/* F957 */,/*28638*/14760/* F958 */,/*28639*/14761/* F959 */, /*28640*/14762/* F95A */,/*28641*/14763/* F95B */,/*28642*/14764/* F95C */,/*28643*/14765/* F95D */, /*28644*/14766/* F95E */,/*28645*/14767/* F95F */,/*28646*/14768/* F960 */,/*28647*/14769/* F961 */, /*28648*/14770/* F962 */,/*28649*/14771/* F963 */,/*28650*/14772/* F964 */,/*28651*/14773/* F965 */, /*28652*/14774/* F966 */,/*28653*/14775/* F967 */,/*28654*/14776/* F968 */,/*28655*/14777/* F969 */, /*28656*/14778/* F96A */,/*28657*/14779/* F96B */,/*28658*/14780/* F96C */,/*28659*/14781/* F96D */, /*28660*/14782/* F96E */,/*28661*/14783/* F96F */,/*28662*/14784/* F970 */,/*28663*/14785/* F971 */, /*28664*/14786/* F972 */,/*28665*/14787/* F973 */,/*28666*/14788/* F974 */,/*28667*/14789/* F975 */, /*28668*/14790/* F976 */,/*28669*/14791/* F977 */,/*28670*/14792/* F978 */,/*28671*/14793/* F979 */, /*28672*/14794/* F97A */,/*28673*/14795/* F97B */,/*28674*/14796/* F97C */,/*28675*/14797/* F97D */, /*28676*/14798/* F97E */,/*28677*/14799/* F97F */,/*28678*/14800/* F980 */,/*28679*/14801/* F981 */, /*28680*/14802/* F982 */,/*28681*/14803/* F983 */,/*28682*/14804/* F984 */,/*28683*/14805/* F985 */, /*28684*/14806/* F986 */,/*28685*/14807/* F987 */,/*28686*/14808/* F988 */,/*28687*/14809/* F989 */, /*28688*/14810/* F98A */,/*28689*/14811/* F98B */,/*28690*/14812/* F98C */,/*28691*/14813/* F98D */, /*28692*/14814/* F98E */,/*28693*/14815/* F98F */,/*28694*/14816/* F990 */,/*28695*/14817/* F991 */, /*28696*/14818/* F992 */,/*28697*/14819/* F993 */,/*28698*/14820/* F994 */,/*28699*/14821/* F995 */, /*28700*/14822/* F996 */,/*28701*/14823/* F997 */,/*28702*/14824/* F998 */,/*28703*/14825/* F999 */, /*28704*/14826/* F99A */,/*28705*/14827/* F99B */,/*28706*/14828/* F99C */,/*28707*/14829/* F99D */, /*28708*/14830/* F99E */,/*28709*/14831/* F99F */,/*28710*/14832/* F9A0 */,/*28711*/14833/* F9A1 */, /*28712*/14834/* F9A2 */,/*28713*/14835/* F9A3 */,/*28714*/14836/* F9A4 */,/*28715*/14837/* F9A5 */, /*28716*/14838/* F9A6 */,/*28717*/14839/* F9A7 */,/*28718*/14840/* F9A8 */,/*28719*/14841/* F9A9 */, /*28720*/14842/* F9AA */,/*28721*/14843/* F9AB */,/*28722*/14844/* F9AC */,/*28723*/14845/* F9AD */, /*28724*/14846/* F9AE */,/*28725*/14847/* F9AF */,/*28726*/14848/* F9B0 */,/*28727*/14849/* F9B1 */, /*28728*/14850/* F9B2 */,/*28729*/14851/* F9B3 */,/*28730*/14852/* F9B4 */,/*28731*/14853/* F9B5 */, /*28732*/14854/* F9B6 */,/*28733*/14855/* F9B7 */,/*28734*/14856/* F9B8 */,/*28735*/14857/* F9B9 */, /*28736*/14858/* F9BA */,/*28737*/14859/* F9BB */,/*28738*/14860/* F9BC */,/*28739*/14861/* F9BD */, /*28740*/14862/* F9BE */,/*28741*/14863/* F9BF */,/*28742*/14864/* F9C0 */,/*28743*/14865/* F9C1 */, /*28744*/14866/* F9C2 */,/*28745*/14867/* F9C3 */,/*28746*/14868/* F9C4 */,/*28747*/14869/* F9C5 */, /*28748*/14870/* F9C6 */,/*28749*/14871/* F9C7 */,/*28750*/14872/* F9C8 */,/*28751*/14873/* F9C9 */, /*28752*/14874/* F9CA */,/*28753*/14875/* F9CB */,/*28754*/14876/* F9CC */,/*28755*/14877/* F9CD */, /*28756*/14878/* F9CE */,/*28757*/14879/* F9CF */,/*28758*/14880/* F9D0 */,/*28759*/14881/* F9D1 */, /*28760*/14882/* F9D2 */,/*28761*/14883/* F9D3 */,/*28762*/14884/* F9D4 */,/*28763*/14885/* F9D5 */, /*28764*/14886/* F9D6 */,/*28765*/14887/* F9D7 */,/*28766*/14888/* F9D8 */,/*28767*/14889/* F9D9 */, /*28768*/14890/* F9DA */,/*28769*/14891/* F9DB */,/*28770*/14892/* F9DC */,/*28771*/14893/* F9DD */, /*28772*/14894/* F9DE */,/*28773*/14895/* F9DF */,/*28774*/14896/* F9E0 */,/*28775*/14897/* F9E1 */, /*28776*/14898/* F9E2 */,/*28777*/14899/* F9E3 */,/*28778*/14900/* F9E4 */,/*28779*/14901/* F9E5 */, /*28780*/14902/* F9E6 */,/*28781*/14903/* F9E7 */,/*28782*/14904/* F9E8 */,/*28783*/14905/* F9E9 */, /*28784*/14906/* F9EA */,/*28785*/14907/* F9EB */,/*28786*/14908/* F9EC */,/*28787*/14909/* F9ED */, /*28788*/14910/* F9EE */,/*28789*/14911/* F9EF */,/*28790*/14912/* F9F0 */,/*28791*/14913/* F9F1 */, /*28792*/14914/* F9F2 */,/*28793*/14915/* F9F3 */,/*28794*/14916/* F9F4 */,/*28795*/14917/* F9F5 */, /*28796*/14918/* F9F6 */,/*28797*/14919/* F9F7 */,/*28798*/14920/* F9F8 */,/*28799*/14921/* F9F9 */, /*28800*/14922/* F9FA */,/*28801*/14923/* F9FB */,/*28802*/14924/* F9FC */,/*28803*/14925/* F9FD */, /*28804*/14926/* F9FE */,/*28805*/14927/* F9FF */,/*28806*/14928/* FA00 */,/*28807*/14929/* FA01 */, /*28808*/14930/* FA02 */,/*28809*/14931/* FA03 */,/*28810*/14932/* FA04 */,/*28811*/14933/* FA05 */, /*28812*/14934/* FA06 */,/*28813*/14935/* FA07 */,/*28814*/14936/* FA08 */,/*28815*/14937/* FA09 */, /*28816*/14938/* FA0A */,/*28817*/14939/* FA0B */,/*28818*/14940/* FA0C */,/*28819*/14941/* FA0D */, /*28820*/14942/* FA0E */,/*28821*/14943/* FA0F */,/*28822*/14944/* FA10 */,/*28823*/14945/* FA11 */, /*28824*/14946/* FA12 */,/*28825*/14947/* FA13 */,/*28826*/14948/* FA14 */,/*28827*/14949/* FA15 */, /*28828*/14950/* FA16 */,/*28829*/14951/* FA17 */,/*28830*/14952/* FA18 */,/*28831*/14953/* FA19 */, /*28832*/14954/* FA1A */,/*28833*/14955/* FA1B */,/*28834*/14956/* FA1C */,/*28835*/14957/* FA1D */, /*28836*/14958/* FA1E */,/*28837*/14959/* FA1F */,/*28838*/14960/* FA20 */,/*28839*/14961/* FA21 */, /*28840*/14962/* FA22 */,/*28841*/14963/* FA23 */,/*28842*/14964/* FA24 */,/*28843*/14965/* FA25 */, /*28844*/14966/* FA26 */,/*28845*/14967/* FA27 */,/*28846*/14968/* FA28 */,/*28847*/14969/* FA29 */, /*28848*/14970/* FA2A */,/*28849*/14971/* FA2B */,/*28850*/14972/* FA2C */,/*28851*/14973/* FA2D */, /*28852*/14974/* FA2E */,/*28853*/14975/* FA2F */,/*28854*/14976/* FA30 */,/*28855*/14977/* FA31 */, /*28856*/14978/* FA32 */,/*28857*/14979/* FA33 */,/*28858*/14980/* FA34 */,/*28859*/14981/* FA35 */, /*28860*/14982/* FA36 */,/*28861*/14983/* FA37 */,/*28862*/14984/* FA38 */,/*28863*/14985/* FA39 */, /*28864*/14986/* FA3A */,/*28865*/14987/* FA3B */,/*28866*/14988/* FA3C */,/*28867*/14989/* FA3D */, /*28868*/14990/* FA3E */,/*28869*/14991/* FA3F */,/*28870*/14992/* FA40 */,/*28871*/14993/* FA41 */, /*28872*/14994/* FA42 */,/*28873*/14995/* FA43 */,/*28874*/14996/* FA44 */,/*28875*/14997/* FA45 */, /*28876*/14998/* FA46 */,/*28877*/14999/* FA47 */,/*28878*/15000/* FA48 */,/*28879*/15001/* FA49 */, /*28880*/15002/* FA4A */,/*28881*/15003/* FA4B */,/*28882*/15004/* FA4C */,/*28883*/15005/* FA4D */, /*28884*/15006/* FA4E */,/*28885*/15007/* FA4F */,/*28886*/15008/* FA50 */,/*28887*/15009/* FA51 */, /*28888*/15010/* FA52 */,/*28889*/15011/* FA53 */,/*28890*/15012/* FA54 */,/*28891*/15013/* FA55 */, /*28892*/15014/* FA56 */,/*28893*/15015/* FA57 */,/*28894*/15016/* FA58 */,/*28895*/15017/* FA59 */, /*28896*/15018/* FA5A */,/*28897*/15019/* FA5B */,/*28898*/15020/* FA5C */,/*28899*/15021/* FA5D */, /*28900*/15022/* FA5E */,/*28901*/15023/* FA5F */,/*28902*/15024/* FA60 */,/*28903*/15025/* FA61 */, /*28904*/15026/* FA62 */,/*28905*/15027/* FA63 */,/*28906*/15028/* FA64 */,/*28907*/15029/* FA65 */, /*28908*/15030/* FA66 */,/*28909*/15031/* FA67 */,/*28910*/15032/* FA68 */,/*28911*/15033/* FA69 */, /*28912*/15034/* FA6A */,/*28913*/15035/* FA6B */,/*28914*/15036/* FA6C */,/*28915*/15037/* FA6D */,0,0, /*28918*/15038/* FA70 */,/*28919*/15039/* FA71 */,/*28920*/15040/* FA72 */,/*28921*/15041/* FA73 */, /*28922*/15042/* FA74 */,/*28923*/15043/* FA75 */,/*28924*/15044/* FA76 */,/*28925*/15045/* FA77 */, /*28926*/15046/* FA78 */,/*28927*/15047/* FA79 */,/*28928*/15048/* FA7A */,/*28929*/15049/* FA7B */, /*28930*/15050/* FA7C */,/*28931*/15051/* FA7D */,/*28932*/15052/* FA7E */,/*28933*/15053/* FA7F */, /*28934*/15054/* FA80 */,/*28935*/15055/* FA81 */,/*28936*/15056/* FA82 */,/*28937*/15057/* FA83 */, /*28938*/15058/* FA84 */,/*28939*/15059/* FA85 */,/*28940*/15060/* FA86 */,/*28941*/15061/* FA87 */, /*28942*/15062/* FA88 */,/*28943*/15063/* FA89 */,/*28944*/15064/* FA8A */,/*28945*/15065/* FA8B */, /*28946*/15066/* FA8C */,/*28947*/15067/* FA8D */,/*28948*/15068/* FA8E */,/*28949*/15069/* FA8F */, /*28950*/15070/* FA90 */,/*28951*/15071/* FA91 */,/*28952*/15072/* FA92 */,/*28953*/15073/* FA93 */, /*28954*/15074/* FA94 */,/*28955*/15075/* FA95 */,/*28956*/15076/* FA96 */,/*28957*/15077/* FA97 */, /*28958*/15078/* FA98 */,/*28959*/15079/* FA99 */,/*28960*/15080/* FA9A */,/*28961*/15081/* FA9B */, /*28962*/15082/* FA9C */,/*28963*/15083/* FA9D */,/*28964*/15084/* FA9E */,/*28965*/15085/* FA9F */, /*28966*/15086/* FAA0 */,/*28967*/15087/* FAA1 */,/*28968*/15088/* FAA2 */,/*28969*/15089/* FAA3 */, /*28970*/15090/* FAA4 */,/*28971*/15091/* FAA5 */,/*28972*/15092/* FAA6 */,/*28973*/15093/* FAA7 */, /*28974*/15094/* FAA8 */,/*28975*/15095/* FAA9 */,/*28976*/15096/* FAAA */,/*28977*/15097/* FAAB */, /*28978*/15098/* FAAC */,/*28979*/15099/* FAAD */,/*28980*/15100/* FAAE */,/*28981*/15101/* FAAF */, /*28982*/15102/* FAB0 */,/*28983*/15103/* FAB1 */,/*28984*/15104/* FAB2 */,/*28985*/15105/* FAB3 */, /*28986*/15106/* FAB4 */,/*28987*/15107/* FAB5 */,/*28988*/15108/* FAB6 */,/*28989*/15109/* FAB7 */, /*28990*/15110/* FAB8 */,/*28991*/15111/* FAB9 */,/*28992*/15112/* FABA */,/*28993*/15113/* FABB */, /*28994*/15114/* FABC */,/*28995*/15115/* FABD */,/*28996*/15116/* FABE */,/*28997*/15117/* FABF */, /*28998*/15118/* FAC0 */,/*28999*/15119/* FAC1 */,/*29000*/15120/* FAC2 */,/*29001*/15121/* FAC3 */, /*29002*/15122/* FAC4 */,/*29003*/15123/* FAC5 */,/*29004*/15124/* FAC6 */,/*29005*/15125/* FAC7 */, /*29006*/15126/* FAC8 */,/*29007*/15127/* FAC9 */,/*29008*/15128/* FACA */,/*29009*/15129/* FACB */, /*29010*/15130/* FACC */,/*29011*/15131/* FACD */,/*29012*/15132/* FACE */,/*29013*/15133/* FACF */, /*29014*/15134/* FAD0 */,/*29015*/15135/* FAD1 */,/*29016*/15136/* FAD2 */,/*29017*/15137/* FAD3 */, /*29018*/15138/* FAD4 */,/*29019*/15139/* FAD5 */,/*29020*/15140/* FAD6 */,/*29021*/15141/* FAD7 */, /*29022*/15142/* FAD8 */,/*29023*/15143/* FAD9 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,/*29062*/15144/* FB00 */,/*29063*/15145/* FB01 */,/*29064*/15146/* FB02 */,/*29065*/15147/* FB03 */, /*29066*/15148/* FB04 */,/*29067*/15149/* FB05 */,/*29068*/15150/* FB06 */,0,0,0,0,0,0,0,0,0,0,0,0, /*29081*/15151/* FB13 */,/*29082*/15152/* FB14 */,/*29083*/15153/* FB15 */,/*29084*/15154/* FB16 */, /*29085*/15155/* FB17 */,0,0,0,0,0,/*29091*/15156/* FB1D */,/*29092*/15157/* FB1E */,/*29093*/15158/* FB1F */, /*29094*/15159/* FB20 */,/*29095*/15160/* FB21 */,/*29096*/15161/* FB22 */,/*29097*/15162/* FB23 */, /*29098*/15163/* FB24 */,/*29099*/15164/* FB25 */,/*29100*/15165/* FB26 */,/*29101*/15166/* FB27 */, /*29102*/15167/* FB28 */,/*29103*/15168/* FB29 */,/*29104*/15169/* FB2A */,/*29105*/15170/* FB2B */, /*29106*/15171/* FB2C */,/*29107*/15172/* FB2D */,/*29108*/15173/* FB2E */,/*29109*/15174/* FB2F */, /*29110*/15175/* FB30 */,/*29111*/15176/* FB31 */,/*29112*/15177/* FB32 */,/*29113*/15178/* FB33 */, /*29114*/15179/* FB34 */,/*29115*/15180/* FB35 */,/*29116*/15181/* FB36 */,0,/*29118*/15182/* FB38 */, /*29119*/15183/* FB39 */,/*29120*/15184/* FB3A */,/*29121*/15185/* FB3B */,/*29122*/15186/* FB3C */,0, /*29124*/15187/* FB3E */,0,/*29126*/15188/* FB40 */,/*29127*/15189/* FB41 */,0,/*29129*/15190/* FB43 */, /*29130*/15191/* FB44 */,0,/*29132*/15192/* FB46 */,/*29133*/15193/* FB47 */,/*29134*/15194/* FB48 */, /*29135*/15195/* FB49 */,/*29136*/15196/* FB4A */,/*29137*/15197/* FB4B */,/*29138*/15198/* FB4C */, /*29139*/15199/* FB4D */,/*29140*/15200/* FB4E */,/*29141*/15201/* FB4F */,/*29142*/15202/* FB50 */, /*29143*/15203/* FB51 */,/*29144*/15204/* FB52 */,/*29145*/15205/* FB53 */,/*29146*/15206/* FB54 */, /*29147*/15207/* FB55 */,/*29148*/15208/* FB56 */,/*29149*/15209/* FB57 */,/*29150*/15210/* FB58 */, /*29151*/15211/* FB59 */,/*29152*/15212/* FB5A */,/*29153*/15213/* FB5B */,/*29154*/15214/* FB5C */, /*29155*/15215/* FB5D */,/*29156*/15216/* FB5E */,/*29157*/15217/* FB5F */,/*29158*/15218/* FB60 */, /*29159*/15219/* FB61 */,/*29160*/15220/* FB62 */,/*29161*/15221/* FB63 */,/*29162*/15222/* FB64 */, /*29163*/15223/* FB65 */,/*29164*/15224/* FB66 */,/*29165*/15225/* FB67 */,/*29166*/15226/* FB68 */, /*29167*/15227/* FB69 */,/*29168*/15228/* FB6A */,/*29169*/15229/* FB6B */,/*29170*/15230/* FB6C */, /*29171*/15231/* FB6D */,/*29172*/15232/* FB6E */,/*29173*/15233/* FB6F */,/*29174*/15234/* FB70 */, /*29175*/15235/* FB71 */,/*29176*/15236/* FB72 */,/*29177*/15237/* FB73 */,/*29178*/15238/* FB74 */, /*29179*/15239/* FB75 */,/*29180*/15240/* FB76 */,/*29181*/15241/* FB77 */,/*29182*/15242/* FB78 */, /*29183*/15243/* FB79 */,/*29184*/15244/* FB7A */,/*29185*/15245/* FB7B */,/*29186*/15246/* FB7C */, /*29187*/15247/* FB7D */,/*29188*/15248/* FB7E */,/*29189*/15249/* FB7F */,/*29190*/15250/* FB80 */, /*29191*/15251/* FB81 */,/*29192*/15252/* FB82 */,/*29193*/15253/* FB83 */,/*29194*/15254/* FB84 */, /*29195*/15255/* FB85 */,/*29196*/15256/* FB86 */,/*29197*/15257/* FB87 */,/*29198*/15258/* FB88 */, /*29199*/15259/* FB89 */,/*29200*/15260/* FB8A */,/*29201*/15261/* FB8B */,/*29202*/15262/* FB8C */, /*29203*/15263/* FB8D */,/*29204*/15264/* FB8E */,/*29205*/15265/* FB8F */,/*29206*/15266/* FB90 */, /*29207*/15267/* FB91 */,/*29208*/15268/* FB92 */,/*29209*/15269/* FB93 */,/*29210*/15270/* FB94 */, /*29211*/15271/* FB95 */,/*29212*/15272/* FB96 */,/*29213*/15273/* FB97 */,/*29214*/15274/* FB98 */, /*29215*/15275/* FB99 */,/*29216*/15276/* FB9A */,/*29217*/15277/* FB9B */,/*29218*/15278/* FB9C */, /*29219*/15279/* FB9D */,/*29220*/15280/* FB9E */,/*29221*/15281/* FB9F */,/*29222*/15282/* FBA0 */, /*29223*/15283/* FBA1 */,/*29224*/15284/* FBA2 */,/*29225*/15285/* FBA3 */,/*29226*/15286/* FBA4 */, /*29227*/15287/* FBA5 */,/*29228*/15288/* FBA6 */,/*29229*/15289/* FBA7 */,/*29230*/15290/* FBA8 */, /*29231*/15291/* FBA9 */,/*29232*/15292/* FBAA */,/*29233*/15293/* FBAB */,/*29234*/15294/* FBAC */, /*29235*/15295/* FBAD */,/*29236*/15296/* FBAE */,/*29237*/15297/* FBAF */,/*29238*/15298/* FBB0 */, /*29239*/15299/* FBB1 */,/*29240*/15300/* FBB2 */,/*29241*/15301/* FBB3 */,/*29242*/15302/* FBB4 */, /*29243*/15303/* FBB5 */,/*29244*/15304/* FBB6 */,/*29245*/15305/* FBB7 */,/*29246*/15306/* FBB8 */, /*29247*/15307/* FBB9 */,/*29248*/15308/* FBBA */,/*29249*/15309/* FBBB */,/*29250*/15310/* FBBC */, /*29251*/15311/* FBBD */,/*29252*/15312/* FBBE */,/*29253*/15313/* FBBF */,/*29254*/15314/* FBC0 */, /*29255*/15315/* FBC1 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*29273*/15316/* FBD3 */,/*29274*/15317/* FBD4 */, /*29275*/15318/* FBD5 */,/*29276*/15319/* FBD6 */,/*29277*/15320/* FBD7 */,/*29278*/15321/* FBD8 */, /*29279*/15322/* FBD9 */,/*29280*/15323/* FBDA */,/*29281*/15324/* FBDB */,/*29282*/15325/* FBDC */, /*29283*/15326/* FBDD */,/*29284*/15327/* FBDE */,/*29285*/15328/* FBDF */,/*29286*/15329/* FBE0 */, /*29287*/15330/* FBE1 */,/*29288*/15331/* FBE2 */,/*29289*/15332/* FBE3 */,/*29290*/15333/* FBE4 */, /*29291*/15334/* FBE5 */,/*29292*/15335/* FBE6 */,/*29293*/15336/* FBE7 */,/*29294*/15337/* FBE8 */, /*29295*/15338/* FBE9 */,/*29296*/15339/* FBEA */,/*29297*/15340/* FBEB */,/*29298*/15341/* FBEC */, /*29299*/15342/* FBED */,/*29300*/15343/* FBEE */,/*29301*/15344/* FBEF */,/*29302*/15345/* FBF0 */, /*29303*/15346/* FBF1 */,/*29304*/15347/* FBF2 */,/*29305*/15348/* FBF3 */,/*29306*/15349/* FBF4 */, /*29307*/15350/* FBF5 */,/*29308*/15351/* FBF6 */,/*29309*/15352/* FBF7 */,/*29310*/15353/* FBF8 */, /*29311*/15354/* FBF9 */,/*29312*/15355/* FBFA */,/*29313*/15356/* FBFB */,/*29314*/15357/* FBFC */, /*29315*/15358/* FBFD */,/*29316*/15359/* FBFE */,/*29317*/15360/* FBFF */,/*29318*/15361/* FC00 */, /*29319*/15362/* FC01 */,/*29320*/15363/* FC02 */,/*29321*/15364/* FC03 */,/*29322*/15365/* FC04 */, /*29323*/15366/* FC05 */,/*29324*/15367/* FC06 */,/*29325*/15368/* FC07 */,/*29326*/15369/* FC08 */, /*29327*/15370/* FC09 */,/*29328*/15371/* FC0A */,/*29329*/15372/* FC0B */,/*29330*/15373/* FC0C */, /*29331*/15374/* FC0D */,/*29332*/15375/* FC0E */,/*29333*/15376/* FC0F */,/*29334*/15377/* FC10 */, /*29335*/15378/* FC11 */,/*29336*/15379/* FC12 */,/*29337*/15380/* FC13 */,/*29338*/15381/* FC14 */, /*29339*/15382/* FC15 */,/*29340*/15383/* FC16 */,/*29341*/15384/* FC17 */,/*29342*/15385/* FC18 */, /*29343*/15386/* FC19 */,/*29344*/15387/* FC1A */,/*29345*/15388/* FC1B */,/*29346*/15389/* FC1C */, /*29347*/15390/* FC1D */,/*29348*/15391/* FC1E */,/*29349*/15392/* FC1F */,/*29350*/15393/* FC20 */, /*29351*/15394/* FC21 */,/*29352*/15395/* FC22 */,/*29353*/15396/* FC23 */,/*29354*/15397/* FC24 */, /*29355*/15398/* FC25 */,/*29356*/15399/* FC26 */,/*29357*/15400/* FC27 */,/*29358*/15401/* FC28 */, /*29359*/15402/* FC29 */,/*29360*/15403/* FC2A */,/*29361*/15404/* FC2B */,/*29362*/15405/* FC2C */, /*29363*/15406/* FC2D */,/*29364*/15407/* FC2E */,/*29365*/15408/* FC2F */,/*29366*/15409/* FC30 */, /*29367*/15410/* FC31 */,/*29368*/15411/* FC32 */,/*29369*/15412/* FC33 */,/*29370*/15413/* FC34 */, /*29371*/15414/* FC35 */,/*29372*/15415/* FC36 */,/*29373*/15416/* FC37 */,/*29374*/15417/* FC38 */, /*29375*/15418/* FC39 */,/*29376*/15419/* FC3A */,/*29377*/15420/* FC3B */,/*29378*/15421/* FC3C */, /*29379*/15422/* FC3D */,/*29380*/15423/* FC3E */,/*29381*/15424/* FC3F */,/*29382*/15425/* FC40 */, /*29383*/15426/* FC41 */,/*29384*/15427/* FC42 */,/*29385*/15428/* FC43 */,/*29386*/15429/* FC44 */, /*29387*/15430/* FC45 */,/*29388*/15431/* FC46 */,/*29389*/15432/* FC47 */,/*29390*/15433/* FC48 */, /*29391*/15434/* FC49 */,/*29392*/15435/* FC4A */,/*29393*/15436/* FC4B */,/*29394*/15437/* FC4C */, /*29395*/15438/* FC4D */,/*29396*/15439/* FC4E */,/*29397*/15440/* FC4F */,/*29398*/15441/* FC50 */, /*29399*/15442/* FC51 */,/*29400*/15443/* FC52 */,/*29401*/15444/* FC53 */,/*29402*/15445/* FC54 */, /*29403*/15446/* FC55 */,/*29404*/15447/* FC56 */,/*29405*/15448/* FC57 */,/*29406*/15449/* FC58 */, /*29407*/15450/* FC59 */,/*29408*/15451/* FC5A */,/*29409*/15452/* FC5B */,/*29410*/15453/* FC5C */, /*29411*/15454/* FC5D */,/*29412*/15455/* FC5E */,/*29413*/15456/* FC5F */,/*29414*/15457/* FC60 */, /*29415*/15458/* FC61 */,/*29416*/15459/* FC62 */,/*29417*/15460/* FC63 */,/*29418*/15461/* FC64 */, /*29419*/15462/* FC65 */,/*29420*/15463/* FC66 */,/*29421*/15464/* FC67 */,/*29422*/15465/* FC68 */, /*29423*/15466/* FC69 */,/*29424*/15467/* FC6A */,/*29425*/15468/* FC6B */,/*29426*/15469/* FC6C */, /*29427*/15470/* FC6D */,/*29428*/15471/* FC6E */,/*29429*/15472/* FC6F */,/*29430*/15473/* FC70 */, /*29431*/15474/* FC71 */,/*29432*/15475/* FC72 */,/*29433*/15476/* FC73 */,/*29434*/15477/* FC74 */, /*29435*/15478/* FC75 */,/*29436*/15479/* FC76 */,/*29437*/15480/* FC77 */,/*29438*/15481/* FC78 */, /*29439*/15482/* FC79 */,/*29440*/15483/* FC7A */,/*29441*/15484/* FC7B */,/*29442*/15485/* FC7C */, /*29443*/15486/* FC7D */,/*29444*/15487/* FC7E */,/*29445*/15488/* FC7F */,/*29446*/15489/* FC80 */, /*29447*/15490/* FC81 */,/*29448*/15491/* FC82 */,/*29449*/15492/* FC83 */,/*29450*/15493/* FC84 */, /*29451*/15494/* FC85 */,/*29452*/15495/* FC86 */,/*29453*/15496/* FC87 */,/*29454*/15497/* FC88 */, /*29455*/15498/* FC89 */,/*29456*/15499/* FC8A */,/*29457*/15500/* FC8B */,/*29458*/15501/* FC8C */, /*29459*/15502/* FC8D */,/*29460*/15503/* FC8E */,/*29461*/15504/* FC8F */,/*29462*/15505/* FC90 */, /*29463*/15506/* FC91 */,/*29464*/15507/* FC92 */,/*29465*/15508/* FC93 */,/*29466*/15509/* FC94 */, /*29467*/15510/* FC95 */,/*29468*/15511/* FC96 */,/*29469*/15512/* FC97 */,/*29470*/15513/* FC98 */, /*29471*/15514/* FC99 */,/*29472*/15515/* FC9A */,/*29473*/15516/* FC9B */,/*29474*/15517/* FC9C */, /*29475*/15518/* FC9D */,/*29476*/15519/* FC9E */,/*29477*/15520/* FC9F */,/*29478*/15521/* FCA0 */, /*29479*/15522/* FCA1 */,/*29480*/15523/* FCA2 */,/*29481*/15524/* FCA3 */,/*29482*/15525/* FCA4 */, /*29483*/15526/* FCA5 */,/*29484*/15527/* FCA6 */,/*29485*/15528/* FCA7 */,/*29486*/15529/* FCA8 */, /*29487*/15530/* FCA9 */,/*29488*/15531/* FCAA */,/*29489*/15532/* FCAB */,/*29490*/15533/* FCAC */, /*29491*/15534/* FCAD */,/*29492*/15535/* FCAE */,/*29493*/15536/* FCAF */,/*29494*/15537/* FCB0 */, /*29495*/15538/* FCB1 */,/*29496*/15539/* FCB2 */,/*29497*/15540/* FCB3 */,/*29498*/15541/* FCB4 */, /*29499*/15542/* FCB5 */,/*29500*/15543/* FCB6 */,/*29501*/15544/* FCB7 */,/*29502*/15545/* FCB8 */, /*29503*/15546/* FCB9 */,/*29504*/15547/* FCBA */,/*29505*/15548/* FCBB */,/*29506*/15549/* FCBC */, /*29507*/15550/* FCBD */,/*29508*/15551/* FCBE */,/*29509*/15552/* FCBF */,/*29510*/15553/* FCC0 */, /*29511*/15554/* FCC1 */,/*29512*/15555/* FCC2 */,/*29513*/15556/* FCC3 */,/*29514*/15557/* FCC4 */, /*29515*/15558/* FCC5 */,/*29516*/15559/* FCC6 */,/*29517*/15560/* FCC7 */,/*29518*/15561/* FCC8 */, /*29519*/15562/* FCC9 */,/*29520*/15563/* FCCA */,/*29521*/15564/* FCCB */,/*29522*/15565/* FCCC */, /*29523*/15566/* FCCD */,/*29524*/15567/* FCCE */,/*29525*/15568/* FCCF */,/*29526*/15569/* FCD0 */, /*29527*/15570/* FCD1 */,/*29528*/15571/* FCD2 */,/*29529*/15572/* FCD3 */,/*29530*/15573/* FCD4 */, /*29531*/15574/* FCD5 */,/*29532*/15575/* FCD6 */,/*29533*/15576/* FCD7 */,/*29534*/15577/* FCD8 */, /*29535*/15578/* FCD9 */,/*29536*/15579/* FCDA */,/*29537*/15580/* FCDB */,/*29538*/15581/* FCDC */, /*29539*/15582/* FCDD */,/*29540*/15583/* FCDE */,/*29541*/15584/* FCDF */,/*29542*/15585/* FCE0 */, /*29543*/15586/* FCE1 */,/*29544*/15587/* FCE2 */,/*29545*/15588/* FCE3 */,/*29546*/15589/* FCE4 */, /*29547*/15590/* FCE5 */,/*29548*/15591/* FCE6 */,/*29549*/15592/* FCE7 */,/*29550*/15593/* FCE8 */, /*29551*/15594/* FCE9 */,/*29552*/15595/* FCEA */,/*29553*/15596/* FCEB */,/*29554*/15597/* FCEC */, /*29555*/15598/* FCED */,/*29556*/15599/* FCEE */,/*29557*/15600/* FCEF */,/*29558*/15601/* FCF0 */, /*29559*/15602/* FCF1 */,/*29560*/15603/* FCF2 */,/*29561*/15604/* FCF3 */,/*29562*/15605/* FCF4 */, /*29563*/15606/* FCF5 */,/*29564*/15607/* FCF6 */,/*29565*/15608/* FCF7 */,/*29566*/15609/* FCF8 */, /*29567*/15610/* FCF9 */,/*29568*/15611/* FCFA */,/*29569*/15612/* FCFB */,/*29570*/15613/* FCFC */, /*29571*/15614/* FCFD */,/*29572*/15615/* FCFE */,/*29573*/15616/* FCFF */,/*29574*/15617/* FD00 */, /*29575*/15618/* FD01 */,/*29576*/15619/* FD02 */,/*29577*/15620/* FD03 */,/*29578*/15621/* FD04 */, /*29579*/15622/* FD05 */,/*29580*/15623/* FD06 */,/*29581*/15624/* FD07 */,/*29582*/15625/* FD08 */, /*29583*/15626/* FD09 */,/*29584*/15627/* FD0A */,/*29585*/15628/* FD0B */,/*29586*/15629/* FD0C */, /*29587*/15630/* FD0D */,/*29588*/15631/* FD0E */,/*29589*/15632/* FD0F */,/*29590*/15633/* FD10 */, /*29591*/15634/* FD11 */,/*29592*/15635/* FD12 */,/*29593*/15636/* FD13 */,/*29594*/15637/* FD14 */, /*29595*/15638/* FD15 */,/*29596*/15639/* FD16 */,/*29597*/15640/* FD17 */,/*29598*/15641/* FD18 */, /*29599*/15642/* FD19 */,/*29600*/15643/* FD1A */,/*29601*/15644/* FD1B */,/*29602*/15645/* FD1C */, /*29603*/15646/* FD1D */,/*29604*/15647/* FD1E */,/*29605*/15648/* FD1F */,/*29606*/15649/* FD20 */, /*29607*/15650/* FD21 */,/*29608*/15651/* FD22 */,/*29609*/15652/* FD23 */,/*29610*/15653/* FD24 */, /*29611*/15654/* FD25 */,/*29612*/15655/* FD26 */,/*29613*/15656/* FD27 */,/*29614*/15657/* FD28 */, /*29615*/15658/* FD29 */,/*29616*/15659/* FD2A */,/*29617*/15660/* FD2B */,/*29618*/15661/* FD2C */, /*29619*/15662/* FD2D */,/*29620*/15663/* FD2E */,/*29621*/15664/* FD2F */,/*29622*/15665/* FD30 */, /*29623*/15666/* FD31 */,/*29624*/15667/* FD32 */,/*29625*/15668/* FD33 */,/*29626*/15669/* FD34 */, /*29627*/15670/* FD35 */,/*29628*/15671/* FD36 */,/*29629*/15672/* FD37 */,/*29630*/15673/* FD38 */, /*29631*/15674/* FD39 */,/*29632*/15675/* FD3A */,/*29633*/15676/* FD3B */,/*29634*/15677/* FD3C */, /*29635*/15678/* FD3D */,/*29636*/15679/* FD3E */,/*29637*/15680/* FD3F */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*29654*/15681/* FD50 */,/*29655*/15682/* FD51 */,/*29656*/15683/* FD52 */,/*29657*/15684/* FD53 */, /*29658*/15685/* FD54 */,/*29659*/15686/* FD55 */,/*29660*/15687/* FD56 */,/*29661*/15688/* FD57 */, /*29662*/15689/* FD58 */,/*29663*/15690/* FD59 */,/*29664*/15691/* FD5A */,/*29665*/15692/* FD5B */, /*29666*/15693/* FD5C */,/*29667*/15694/* FD5D */,/*29668*/15695/* FD5E */,/*29669*/15696/* FD5F */, /*29670*/15697/* FD60 */,/*29671*/15698/* FD61 */,/*29672*/15699/* FD62 */,/*29673*/15700/* FD63 */, /*29674*/15701/* FD64 */,/*29675*/15702/* FD65 */,/*29676*/15703/* FD66 */,/*29677*/15704/* FD67 */, /*29678*/15705/* FD68 */,/*29679*/15706/* FD69 */,/*29680*/15707/* FD6A */,/*29681*/15708/* FD6B */, /*29682*/15709/* FD6C */,/*29683*/15710/* FD6D */,/*29684*/15711/* FD6E */,/*29685*/15712/* FD6F */, /*29686*/15713/* FD70 */,/*29687*/15714/* FD71 */,/*29688*/15715/* FD72 */,/*29689*/15716/* FD73 */, /*29690*/15717/* FD74 */,/*29691*/15718/* FD75 */,/*29692*/15719/* FD76 */,/*29693*/15720/* FD77 */, /*29694*/15721/* FD78 */,/*29695*/15722/* FD79 */,/*29696*/15723/* FD7A */,/*29697*/15724/* FD7B */, /*29698*/15725/* FD7C */,/*29699*/15726/* FD7D */,/*29700*/15727/* FD7E */,/*29701*/15728/* FD7F */, /*29702*/15729/* FD80 */,/*29703*/15730/* FD81 */,/*29704*/15731/* FD82 */,/*29705*/15732/* FD83 */, /*29706*/15733/* FD84 */,/*29707*/15734/* FD85 */,/*29708*/15735/* FD86 */,/*29709*/15736/* FD87 */, /*29710*/15737/* FD88 */,/*29711*/15738/* FD89 */,/*29712*/15739/* FD8A */,/*29713*/15740/* FD8B */, /*29714*/15741/* FD8C */,/*29715*/15742/* FD8D */,/*29716*/15743/* FD8E */,/*29717*/15744/* FD8F */,0,0, /*29720*/15745/* FD92 */,/*29721*/15746/* FD93 */,/*29722*/15747/* FD94 */,/*29723*/15748/* FD95 */, /*29724*/15749/* FD96 */,/*29725*/15750/* FD97 */,/*29726*/15751/* FD98 */,/*29727*/15752/* FD99 */, /*29728*/15753/* FD9A */,/*29729*/15754/* FD9B */,/*29730*/15755/* FD9C */,/*29731*/15756/* FD9D */, /*29732*/15757/* FD9E */,/*29733*/15758/* FD9F */,/*29734*/15759/* FDA0 */,/*29735*/15760/* FDA1 */, /*29736*/15761/* FDA2 */,/*29737*/15762/* FDA3 */,/*29738*/15763/* FDA4 */,/*29739*/15764/* FDA5 */, /*29740*/15765/* FDA6 */,/*29741*/15766/* FDA7 */,/*29742*/15767/* FDA8 */,/*29743*/15768/* FDA9 */, /*29744*/15769/* FDAA */,/*29745*/15770/* FDAB */,/*29746*/15771/* FDAC */,/*29747*/15772/* FDAD */, /*29748*/15773/* FDAE */,/*29749*/15774/* FDAF */,/*29750*/15775/* FDB0 */,/*29751*/15776/* FDB1 */, /*29752*/15777/* FDB2 */,/*29753*/15778/* FDB3 */,/*29754*/15779/* FDB4 */,/*29755*/15780/* FDB5 */, /*29756*/15781/* FDB6 */,/*29757*/15782/* FDB7 */,/*29758*/15783/* FDB8 */,/*29759*/15784/* FDB9 */, /*29760*/15785/* FDBA */,/*29761*/15786/* FDBB */,/*29762*/15787/* FDBC */,/*29763*/15788/* FDBD */, /*29764*/15789/* FDBE */,/*29765*/15790/* FDBF */,/*29766*/15791/* FDC0 */,/*29767*/15792/* FDC1 */, /*29768*/15793/* FDC2 */,/*29769*/15794/* FDC3 */,/*29770*/15795/* FDC4 */,/*29771*/15796/* FDC5 */, /*29772*/15797/* FDC6 */,/*29773*/15798/* FDC7 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,/*29814*/15799/* FDF0 */,/*29815*/15800/* FDF1 */,/*29816*/15801/* FDF2 */,/*29817*/15802/* FDF3 */, /*29818*/15803/* FDF4 */,/*29819*/15804/* FDF5 */,/*29820*/15805/* FDF6 */,/*29821*/15806/* FDF7 */, /*29822*/15807/* FDF8 */,/*29823*/15808/* FDF9 */,/*29824*/15809/* FDFA */,/*29825*/15810/* FDFB */, /*29826*/15811/* FDFC */,/*29827*/15812/* FDFD */,0,0,/*29830*/15813/* FE00 */,/*29831*/15813/* FE01 */, /*29832*/15813/* FE02 */,/*29833*/15813/* FE03 */,/*29834*/15813/* FE04 */,/*29835*/15813/* FE05 */, /*29836*/15813/* FE06 */,/*29837*/15813/* FE07 */,/*29838*/15813/* FE08 */,/*29839*/15813/* FE09 */, /*29840*/15813/* FE0A */,/*29841*/15813/* FE0B */,/*29842*/15813/* FE0C */,/*29843*/15813/* FE0D */, /*29844*/15813/* FE0E */,/*29845*/15813/* FE0F */,/*29846*/15814/* FE10 */,/*29847*/15815/* FE11 */, /*29848*/15816/* FE12 */,/*29849*/15817/* FE13 */,/*29850*/15818/* FE14 */,/*29851*/15819/* FE15 */, /*29852*/15820/* FE16 */,/*29853*/15821/* FE17 */,/*29854*/15822/* FE18 */,/*29855*/15823/* FE19 */,0,0,0,0,0,0, /*29862*/15824/* FE20 */,/*29863*/15825/* FE21 */,/*29864*/15826/* FE22 */,/*29865*/15825/* FE23 */, /*29866*/15827/* FE24 */,/*29867*/15827/* FE25 */,/*29868*/15827/* FE26 */,/*29869*/15828/* FE27 */, /*29870*/15829/* FE28 */,/*29871*/15830/* FE29 */,/*29872*/15829/* FE2A */,/*29873*/15829/* FE2B */, /*29874*/15829/* FE2C */,/*29875*/15829/* FE2D */,/*29876*/15831/* FE2E */,/*29877*/15832/* FE2F */, /*29878*/15833/* FE30 */,/*29879*/15834/* FE31 */,/*29880*/15835/* FE32 */,/*29881*/15836/* FE33 */, /*29882*/15837/* FE34 */,/*29883*/15838/* FE35 */,/*29884*/15839/* FE36 */,/*29885*/15840/* FE37 */, /*29886*/15841/* FE38 */,/*29887*/15842/* FE39 */,/*29888*/15843/* FE3A */,/*29889*/15844/* FE3B */, /*29890*/15845/* FE3C */,/*29891*/15846/* FE3D */,/*29892*/15847/* FE3E */,/*29893*/15848/* FE3F */, /*29894*/15849/* FE40 */,/*29895*/15850/* FE41 */,/*29896*/15851/* FE42 */,/*29897*/15852/* FE43 */, /*29898*/15853/* FE44 */,/*29899*/15854/* FE45 */,/*29900*/15855/* FE46 */,/*29901*/15856/* FE47 */, /*29902*/15857/* FE48 */,/*29903*/15858/* FE49 */,/*29904*/15859/* FE4A */,/*29905*/15860/* FE4B */, /*29906*/15861/* FE4C */,/*29907*/15862/* FE4D */,/*29908*/15863/* FE4E */,/*29909*/15864/* FE4F */, /*29910*/15865/* FE50 */,/*29911*/15866/* FE51 */,/*29912*/15867/* FE52 */,0,/*29914*/15868/* FE54 */, /*29915*/15869/* FE55 */,/*29916*/15870/* FE56 */,/*29917*/15871/* FE57 */,/*29918*/15872/* FE58 */, /*29919*/15873/* FE59 */,/*29920*/15874/* FE5A */,/*29921*/15875/* FE5B */,/*29922*/15876/* FE5C */, /*29923*/15877/* FE5D */,/*29924*/15878/* FE5E */,/*29925*/15879/* FE5F */,/*29926*/15880/* FE60 */, /*29927*/15881/* FE61 */,/*29928*/15882/* FE62 */,/*29929*/15883/* FE63 */,/*29930*/15884/* FE64 */, /*29931*/15885/* FE65 */,/*29932*/15886/* FE66 */,0,/*29934*/15887/* FE68 */,/*29935*/15888/* FE69 */, /*29936*/15889/* FE6A */,/*29937*/15890/* FE6B */,0,0,0,0,/*29942*/15891/* FE70 */,/*29943*/15892/* FE71 */, /*29944*/15893/* FE72 */,/*29945*/15894/* FE73 */,/*29946*/15895/* FE74 */,0,/*29948*/15896/* FE76 */, /*29949*/15897/* FE77 */,/*29950*/15898/* FE78 */,/*29951*/15899/* FE79 */,/*29952*/15900/* FE7A */, /*29953*/15901/* FE7B */,/*29954*/15902/* FE7C */,/*29955*/15903/* FE7D */,/*29956*/15904/* FE7E */, /*29957*/15905/* FE7F */,/*29958*/15906/* FE80 */,/*29959*/15907/* FE81 */,/*29960*/15908/* FE82 */, /*29961*/15909/* FE83 */,/*29962*/15910/* FE84 */,/*29963*/15911/* FE85 */,/*29964*/15912/* FE86 */, /*29965*/15913/* FE87 */,/*29966*/15914/* FE88 */,/*29967*/15915/* FE89 */,/*29968*/15916/* FE8A */, /*29969*/15917/* FE8B */,/*29970*/15918/* FE8C */,/*29971*/15919/* FE8D */,/*29972*/15920/* FE8E */, /*29973*/15921/* FE8F */,/*29974*/15922/* FE90 */,/*29975*/15923/* FE91 */,/*29976*/15924/* FE92 */, /*29977*/15925/* FE93 */,/*29978*/15926/* FE94 */,/*29979*/15927/* FE95 */,/*29980*/15928/* FE96 */, /*29981*/15929/* FE97 */,/*29982*/15930/* FE98 */,/*29983*/15931/* FE99 */,/*29984*/15932/* FE9A */, /*29985*/15933/* FE9B */,/*29986*/15934/* FE9C */,/*29987*/15935/* FE9D */,/*29988*/15936/* FE9E */, /*29989*/15937/* FE9F */,/*29990*/15938/* FEA0 */,/*29991*/15939/* FEA1 */,/*29992*/15940/* FEA2 */, /*29993*/15941/* FEA3 */,/*29994*/15942/* FEA4 */,/*29995*/15943/* FEA5 */,/*29996*/15944/* FEA6 */, /*29997*/15945/* FEA7 */,/*29998*/15946/* FEA8 */,/*29999*/15947/* FEA9 */,/*30000*/15948/* FEAA */, /*30001*/15949/* FEAB */,/*30002*/15950/* FEAC */,/*30003*/15951/* FEAD */,/*30004*/15952/* FEAE */, /*30005*/15953/* FEAF */,/*30006*/15954/* FEB0 */,/*30007*/15955/* FEB1 */,/*30008*/15956/* FEB2 */, /*30009*/15957/* FEB3 */,/*30010*/15958/* FEB4 */,/*30011*/15959/* FEB5 */,/*30012*/15960/* FEB6 */, /*30013*/15961/* FEB7 */,/*30014*/15962/* FEB8 */,/*30015*/15963/* FEB9 */,/*30016*/15964/* FEBA */, /*30017*/15965/* FEBB */,/*30018*/15966/* FEBC */,/*30019*/15967/* FEBD */,/*30020*/15968/* FEBE */, /*30021*/15969/* FEBF */,/*30022*/15970/* FEC0 */,/*30023*/15971/* FEC1 */,/*30024*/15972/* FEC2 */, /*30025*/15973/* FEC3 */,/*30026*/15974/* FEC4 */,/*30027*/15975/* FEC5 */,/*30028*/15976/* FEC6 */, /*30029*/15977/* FEC7 */,/*30030*/15978/* FEC8 */,/*30031*/15979/* FEC9 */,/*30032*/15980/* FECA */, /*30033*/15981/* FECB */,/*30034*/15982/* FECC */,/*30035*/15983/* FECD */,/*30036*/15984/* FECE */, /*30037*/15985/* FECF */,/*30038*/15986/* FED0 */,/*30039*/15987/* FED1 */,/*30040*/15988/* FED2 */, /*30041*/15989/* FED3 */,/*30042*/15990/* FED4 */,/*30043*/15991/* FED5 */,/*30044*/15992/* FED6 */, /*30045*/15993/* FED7 */,/*30046*/15994/* FED8 */,/*30047*/15995/* FED9 */,/*30048*/15996/* FEDA */, /*30049*/15997/* FEDB */,/*30050*/15998/* FEDC */,/*30051*/15999/* FEDD */,/*30052*/16000/* FEDE */, /*30053*/16001/* FEDF */,/*30054*/16002/* FEE0 */,/*30055*/16003/* FEE1 */,/*30056*/16004/* FEE2 */, /*30057*/16005/* FEE3 */,/*30058*/16006/* FEE4 */,/*30059*/16007/* FEE5 */,/*30060*/16008/* FEE6 */, /*30061*/16009/* FEE7 */,/*30062*/16010/* FEE8 */,/*30063*/16011/* FEE9 */,/*30064*/16012/* FEEA */, /*30065*/16013/* FEEB */,/*30066*/16014/* FEEC */,/*30067*/16015/* FEED */,/*30068*/16016/* FEEE */, /*30069*/16017/* FEEF */,/*30070*/16018/* FEF0 */,/*30071*/16019/* FEF1 */,/*30072*/16020/* FEF2 */, /*30073*/16021/* FEF3 */,/*30074*/16022/* FEF4 */,/*30075*/16023/* FEF5 */,/*30076*/16024/* FEF6 */, /*30077*/16025/* FEF7 */,/*30078*/16026/* FEF8 */,/*30079*/16027/* FEF9 */,/*30080*/16028/* FEFA */, /*30081*/16029/* FEFB */,/*30082*/16030/* FEFC */,0,0,/*30085*/16031/* FEFF */,0,/*30087*/16032/* FF01 */, /*30088*/16033/* FF02 */,/*30089*/16034/* FF03 */,/*30090*/16035/* FF04 */,/*30091*/16036/* FF05 */, /*30092*/16037/* FF06 */,/*30093*/16038/* FF07 */,/*30094*/16039/* FF08 */,/*30095*/16040/* FF09 */, /*30096*/16041/* FF0A */,/*30097*/16042/* FF0B */,/*30098*/16043/* FF0C */,/*30099*/16044/* FF0D */, /*30100*/16045/* FF0E */,/*30101*/16046/* FF0F */,/*30102*/16047/* FF10 */,/*30103*/16048/* FF11 */, /*30104*/16049/* FF12 */,/*30105*/16050/* FF13 */,/*30106*/16051/* FF14 */,/*30107*/16052/* FF15 */, /*30108*/16053/* FF16 */,/*30109*/16054/* FF17 */,/*30110*/16055/* FF18 */,/*30111*/16056/* FF19 */, /*30112*/16057/* FF1A */,/*30113*/16058/* FF1B */,/*30114*/16059/* FF1C */,/*30115*/16060/* FF1D */, /*30116*/16061/* FF1E */,/*30117*/16062/* FF1F */,/*30118*/16063/* FF20 */,/*30119*/16064/* FF21 */, /*30120*/16065/* FF22 */,/*30121*/16066/* FF23 */,/*30122*/16067/* FF24 */,/*30123*/16068/* FF25 */, /*30124*/16069/* FF26 */,/*30125*/16070/* FF27 */,/*30126*/16071/* FF28 */,/*30127*/16072/* FF29 */, /*30128*/16073/* FF2A */,/*30129*/16074/* FF2B */,/*30130*/16075/* FF2C */,/*30131*/16076/* FF2D */, /*30132*/16077/* FF2E */,/*30133*/16078/* FF2F */,/*30134*/16079/* FF30 */,/*30135*/16080/* FF31 */, /*30136*/16081/* FF32 */,/*30137*/16082/* FF33 */,/*30138*/16083/* FF34 */,/*30139*/16084/* FF35 */, /*30140*/16085/* FF36 */,/*30141*/16086/* FF37 */,/*30142*/16087/* FF38 */,/*30143*/16088/* FF39 */, /*30144*/16089/* FF3A */,/*30145*/16090/* FF3B */,/*30146*/16091/* FF3C */,/*30147*/16092/* FF3D */, /*30148*/16093/* FF3E */,/*30149*/16094/* FF3F */,/*30150*/16095/* FF40 */,/*30151*/16096/* FF41 */, /*30152*/16097/* FF42 */,/*30153*/16098/* FF43 */,/*30154*/16099/* FF44 */,/*30155*/16100/* FF45 */, /*30156*/16101/* FF46 */,/*30157*/16102/* FF47 */,/*30158*/16103/* FF48 */,/*30159*/16104/* FF49 */, /*30160*/16105/* FF4A */,/*30161*/16106/* FF4B */,/*30162*/16107/* FF4C */,/*30163*/16108/* FF4D */, /*30164*/16109/* FF4E */,/*30165*/16110/* FF4F */,/*30166*/16111/* FF50 */,/*30167*/16112/* FF51 */, /*30168*/16113/* FF52 */,/*30169*/16114/* FF53 */,/*30170*/16115/* FF54 */,/*30171*/16116/* FF55 */, /*30172*/16117/* FF56 */,/*30173*/16118/* FF57 */,/*30174*/16119/* FF58 */,/*30175*/16120/* FF59 */, /*30176*/16121/* FF5A */,/*30177*/16122/* FF5B */,/*30178*/16123/* FF5C */,/*30179*/16124/* FF5D */, /*30180*/16125/* FF5E */,/*30181*/16126/* FF5F */,/*30182*/16127/* FF60 */,/*30183*/16128/* FF61 */, /*30184*/16129/* FF62 */,/*30185*/16130/* FF63 */,/*30186*/16131/* FF64 */,/*30187*/16132/* FF65 */, /*30188*/16133/* FF66 */,/*30189*/16134/* FF67 */,/*30190*/16135/* FF68 */,/*30191*/16136/* FF69 */, /*30192*/16137/* FF6A */,/*30193*/16138/* FF6B */,/*30194*/16139/* FF6C */,/*30195*/16140/* FF6D */, /*30196*/16141/* FF6E */,/*30197*/16142/* FF6F */,/*30198*/16143/* FF70 */,/*30199*/16144/* FF71 */, /*30200*/16145/* FF72 */,/*30201*/16146/* FF73 */,/*30202*/16147/* FF74 */,/*30203*/16148/* FF75 */, /*30204*/16149/* FF76 */,/*30205*/16150/* FF77 */,/*30206*/16151/* FF78 */,/*30207*/16152/* FF79 */, /*30208*/16153/* FF7A */,/*30209*/16154/* FF7B */,/*30210*/16155/* FF7C */,/*30211*/16156/* FF7D */, /*30212*/16157/* FF7E */,/*30213*/16158/* FF7F */,/*30214*/16159/* FF80 */,/*30215*/16160/* FF81 */, /*30216*/16161/* FF82 */,/*30217*/16162/* FF83 */,/*30218*/16163/* FF84 */,/*30219*/16164/* FF85 */, /*30220*/16165/* FF86 */,/*30221*/16166/* FF87 */,/*30222*/16167/* FF88 */,/*30223*/16168/* FF89 */, /*30224*/16169/* FF8A */,/*30225*/16170/* FF8B */,/*30226*/16171/* FF8C */,/*30227*/16172/* FF8D */, /*30228*/16173/* FF8E */,/*30229*/16174/* FF8F */,/*30230*/16175/* FF90 */,/*30231*/16176/* FF91 */, /*30232*/16177/* FF92 */,/*30233*/16178/* FF93 */,/*30234*/16179/* FF94 */,/*30235*/16180/* FF95 */, /*30236*/16181/* FF96 */,/*30237*/16182/* FF97 */,/*30238*/16183/* FF98 */,/*30239*/16184/* FF99 */, /*30240*/16185/* FF9A */,/*30241*/16186/* FF9B */,/*30242*/16187/* FF9C */,/*30243*/16188/* FF9D */, /*30244*/16189/* FF9E */,/*30245*/16190/* FF9F */,/*30246*/16191/* FFA0 */,/*30247*/16192/* FFA1 */, /*30248*/16193/* FFA2 */,/*30249*/16194/* FFA3 */,/*30250*/16195/* FFA4 */,/*30251*/16196/* FFA5 */, /*30252*/16197/* FFA6 */,/*30253*/16198/* FFA7 */,/*30254*/16199/* FFA8 */,/*30255*/16200/* FFA9 */, /*30256*/16201/* FFAA */,/*30257*/16202/* FFAB */,/*30258*/16203/* FFAC */,/*30259*/16204/* FFAD */, /*30260*/16205/* FFAE */,/*30261*/16206/* FFAF */,/*30262*/16207/* FFB0 */,/*30263*/16208/* FFB1 */, /*30264*/16209/* FFB2 */,/*30265*/16210/* FFB3 */,/*30266*/16211/* FFB4 */,/*30267*/16212/* FFB5 */, /*30268*/16213/* FFB6 */,/*30269*/16214/* FFB7 */,/*30270*/16215/* FFB8 */,/*30271*/16216/* FFB9 */, /*30272*/16217/* FFBA */,/*30273*/16218/* FFBB */,/*30274*/16219/* FFBC */,/*30275*/16220/* FFBD */, /*30276*/16221/* FFBE */,0,0,0,/*30280*/16222/* FFC2 */,/*30281*/16223/* FFC3 */,/*30282*/16224/* FFC4 */, /*30283*/16225/* FFC5 */,/*30284*/16226/* FFC6 */,/*30285*/16227/* FFC7 */,0,0,/*30288*/16228/* FFCA */, /*30289*/16229/* FFCB */,/*30290*/16230/* FFCC */,/*30291*/16231/* FFCD */,/*30292*/16232/* FFCE */, /*30293*/16233/* FFCF */,0,0,/*30296*/16234/* FFD2 */,/*30297*/16235/* FFD3 */,/*30298*/16236/* FFD4 */, /*30299*/16237/* FFD5 */,/*30300*/16238/* FFD6 */,/*30301*/16239/* FFD7 */,0,0,/*30304*/16240/* FFDA */, /*30305*/16241/* FFDB */,/*30306*/16242/* FFDC */,0,0,0,/*30310*/16243/* FFE0 */,/*30311*/16244/* FFE1 */, /*30312*/16245/* FFE2 */,/*30313*/16246/* FFE3 */,/*30314*/16247/* FFE4 */,/*30315*/16248/* FFE5 */, /*30316*/16249/* FFE6 */,0,/*30318*/16250/* FFE8 */,/*30319*/16251/* FFE9 */,/*30320*/16252/* FFEA */, /*30321*/16253/* FFEB */,/*30322*/16254/* FFEC */,/*30323*/16255/* FFED */,/*30324*/16256/* FFEE */,0,0,0,0,0,0,0,0,0,0, /*30335*/16257/* FFF9 */,/*30336*/16257/* FFFA */,/*30337*/16257/* FFFB */,/*30338*/16258/* FFFC */, /*30339*/16259/* FFFD */,/*30340*/16260/* 10000 */,/*30341*/16261/* 10001 */,/*30342*/16262/* 10002 */, /*30343*/16263/* 10003 */,/*30344*/16264/* 10004 */,/*30345*/16265/* 10005 */,/*30346*/16266/* 10006 */, /*30347*/16267/* 10007 */,/*30348*/16268/* 10008 */,/*30349*/16269/* 10009 */,/*30350*/16270/* 1000A */, /*30351*/16271/* 1000B */,0,/*30353*/16272/* 1000D */,/*30354*/16273/* 1000E */,/*30355*/16274/* 1000F */, /*30356*/16275/* 10010 */,/*30357*/16276/* 10011 */,/*30358*/16277/* 10012 */,/*30359*/16278/* 10013 */, /*30360*/16279/* 10014 */,/*30361*/16280/* 10015 */,/*30362*/16281/* 10016 */,/*30363*/16282/* 10017 */, /*30364*/16283/* 10018 */,/*30365*/16284/* 10019 */,/*30366*/16285/* 1001A */,/*30367*/16286/* 1001B */, /*30368*/16287/* 1001C */,/*30369*/16288/* 1001D */,/*30370*/16289/* 1001E */,/*30371*/16290/* 1001F */, /*30372*/16291/* 10020 */,/*30373*/16292/* 10021 */,/*30374*/16293/* 10022 */,/*30375*/16294/* 10023 */, /*30376*/16295/* 10024 */,/*30377*/16296/* 10025 */,/*30378*/16297/* 10026 */,0,/*30380*/16298/* 10028 */, /*30381*/16299/* 10029 */,/*30382*/16300/* 1002A */,/*30383*/16301/* 1002B */,/*30384*/16302/* 1002C */, /*30385*/16303/* 1002D */,/*30386*/16304/* 1002E */,/*30387*/16305/* 1002F */,/*30388*/16306/* 10030 */, /*30389*/16307/* 10031 */,/*30390*/16308/* 10032 */,/*30391*/16309/* 10033 */,/*30392*/16310/* 10034 */, /*30393*/16311/* 10035 */,/*30394*/16312/* 10036 */,/*30395*/16313/* 10037 */,/*30396*/16314/* 10038 */, /*30397*/16315/* 10039 */,/*30398*/16316/* 1003A */,0,/*30400*/16317/* 1003C */,/*30401*/16318/* 1003D */,0, /*30403*/16319/* 1003F */,/*30404*/16320/* 10040 */,/*30405*/16321/* 10041 */,/*30406*/16322/* 10042 */, /*30407*/16323/* 10043 */,/*30408*/16324/* 10044 */,/*30409*/16325/* 10045 */,/*30410*/16326/* 10046 */, /*30411*/16327/* 10047 */,/*30412*/16328/* 10048 */,/*30413*/16329/* 10049 */,/*30414*/16330/* 1004A */, /*30415*/16331/* 1004B */,/*30416*/16332/* 1004C */,/*30417*/16333/* 1004D */,0,0,/*30420*/16334/* 10050 */, /*30421*/16335/* 10051 */,/*30422*/16336/* 10052 */,/*30423*/16337/* 10053 */,/*30424*/16338/* 10054 */, /*30425*/16339/* 10055 */,/*30426*/16340/* 10056 */,/*30427*/16341/* 10057 */,/*30428*/16342/* 10058 */, /*30429*/16343/* 10059 */,/*30430*/16344/* 1005A */,/*30431*/16345/* 1005B */,/*30432*/16346/* 1005C */, /*30433*/16347/* 1005D */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*30468*/16348/* 10080 */, /*30469*/16349/* 10081 */,/*30470*/16350/* 10082 */,/*30471*/16351/* 10083 */,/*30472*/16352/* 10084 */, /*30473*/16353/* 10085 */,/*30474*/16354/* 10086 */,/*30475*/16355/* 10087 */,/*30476*/16356/* 10088 */, /*30477*/16357/* 10089 */,/*30478*/16358/* 1008A */,/*30479*/16359/* 1008B */,/*30480*/16360/* 1008C */, /*30481*/16361/* 1008D */,/*30482*/16362/* 1008E */,/*30483*/16363/* 1008F */,/*30484*/16364/* 10090 */, /*30485*/16365/* 10091 */,/*30486*/16366/* 10092 */,/*30487*/16367/* 10093 */,/*30488*/16368/* 10094 */, /*30489*/16369/* 10095 */,/*30490*/16370/* 10096 */,/*30491*/16371/* 10097 */,/*30492*/16372/* 10098 */, /*30493*/16373/* 10099 */,/*30494*/16374/* 1009A */,/*30495*/16375/* 1009B */,/*30496*/16376/* 1009C */, /*30497*/16377/* 1009D */,/*30498*/16378/* 1009E */,/*30499*/16379/* 1009F */,/*30500*/16380/* 100A0 */, /*30501*/16381/* 100A1 */,/*30502*/16382/* 100A2 */,/*30503*/16383/* 100A3 */,/*30504*/16384/* 100A4 */, /*30505*/16385/* 100A5 */,/*30506*/16386/* 100A6 */,/*30507*/16387/* 100A7 */,/*30508*/16388/* 100A8 */, /*30509*/16389/* 100A9 */,/*30510*/16390/* 100AA */,/*30511*/16391/* 100AB */,/*30512*/16392/* 100AC */, /*30513*/16393/* 100AD */,/*30514*/16394/* 100AE */,/*30515*/16395/* 100AF */,/*30516*/16396/* 100B0 */, /*30517*/16397/* 100B1 */,/*30518*/16398/* 100B2 */,/*30519*/16399/* 100B3 */,/*30520*/16400/* 100B4 */, /*30521*/16401/* 100B5 */,/*30522*/16402/* 100B6 */,/*30523*/16403/* 100B7 */,/*30524*/16404/* 100B8 */, /*30525*/16405/* 100B9 */,/*30526*/16406/* 100BA */,/*30527*/16407/* 100BB */,/*30528*/16408/* 100BC */, /*30529*/16409/* 100BD */,/*30530*/16410/* 100BE */,/*30531*/16411/* 100BF */,/*30532*/16412/* 100C0 */, /*30533*/16413/* 100C1 */,/*30534*/16414/* 100C2 */,/*30535*/16415/* 100C3 */,/*30536*/16416/* 100C4 */, /*30537*/16417/* 100C5 */,/*30538*/16418/* 100C6 */,/*30539*/16419/* 100C7 */,/*30540*/16420/* 100C8 */, /*30541*/16421/* 100C9 */,/*30542*/16422/* 100CA */,/*30543*/16423/* 100CB */,/*30544*/16424/* 100CC */, /*30545*/16425/* 100CD */,/*30546*/16426/* 100CE */,/*30547*/16427/* 100CF */,/*30548*/16428/* 100D0 */, /*30549*/16429/* 100D1 */,/*30550*/16430/* 100D2 */,/*30551*/16431/* 100D3 */,/*30552*/16432/* 100D4 */, /*30553*/16433/* 100D5 */,/*30554*/16434/* 100D6 */,/*30555*/16435/* 100D7 */,/*30556*/16436/* 100D8 */, /*30557*/16437/* 100D9 */,/*30558*/16438/* 100DA */,/*30559*/16439/* 100DB */,/*30560*/16440/* 100DC */, /*30561*/16441/* 100DD */,/*30562*/16442/* 100DE */,/*30563*/16443/* 100DF */,/*30564*/16444/* 100E0 */, /*30565*/16445/* 100E1 */,/*30566*/16446/* 100E2 */,/*30567*/16447/* 100E3 */,/*30568*/16448/* 100E4 */, /*30569*/16449/* 100E5 */,/*30570*/16450/* 100E6 */,/*30571*/16451/* 100E7 */,/*30572*/16452/* 100E8 */, /*30573*/16453/* 100E9 */,/*30574*/16454/* 100EA */,/*30575*/16455/* 100EB */,/*30576*/16456/* 100EC */, /*30577*/16457/* 100ED */,/*30578*/16458/* 100EE */,/*30579*/16459/* 100EF */,/*30580*/16460/* 100F0 */, /*30581*/16461/* 100F1 */,/*30582*/16462/* 100F2 */,/*30583*/16463/* 100F3 */,/*30584*/16464/* 100F4 */, /*30585*/16465/* 100F5 */,/*30586*/16466/* 100F6 */,/*30587*/16467/* 100F7 */,/*30588*/16468/* 100F8 */, /*30589*/16469/* 100F9 */,/*30590*/16470/* 100FA */,0,0,0,0,0,/*30596*/16471/* 10100 */,/*30597*/16472/* 10101 */, /*30598*/16473/* 10102 */,0,0,0,0,/*30603*/16474/* 10107 */,/*30604*/16475/* 10108 */,/*30605*/16476/* 10109 */, /*30606*/16477/* 1010A */,/*30607*/16478/* 1010B */,/*30608*/16479/* 1010C */,/*30609*/16480/* 1010D */, /*30610*/16481/* 1010E */,/*30611*/16482/* 1010F */,/*30612*/16483/* 10110 */,/*30613*/16484/* 10111 */, /*30614*/16485/* 10112 */,/*30615*/16486/* 10113 */,/*30616*/16487/* 10114 */,/*30617*/16488/* 10115 */, /*30618*/16489/* 10116 */,/*30619*/16490/* 10117 */,/*30620*/16491/* 10118 */,/*30621*/16492/* 10119 */, /*30622*/16493/* 1011A */,/*30623*/16494/* 1011B */,/*30624*/16495/* 1011C */,/*30625*/16496/* 1011D */, /*30626*/16497/* 1011E */,/*30627*/16498/* 1011F */,/*30628*/16499/* 10120 */,/*30629*/16500/* 10121 */, /*30630*/16501/* 10122 */,/*30631*/16502/* 10123 */,/*30632*/16503/* 10124 */,/*30633*/16504/* 10125 */, /*30634*/16505/* 10126 */,/*30635*/16506/* 10127 */,/*30636*/16507/* 10128 */,/*30637*/16508/* 10129 */, /*30638*/16509/* 1012A */,/*30639*/16510/* 1012B */,/*30640*/16511/* 1012C */,/*30641*/16512/* 1012D */, /*30642*/16513/* 1012E */,/*30643*/16514/* 1012F */,/*30644*/16515/* 10130 */,/*30645*/16516/* 10131 */, /*30646*/16517/* 10132 */,/*30647*/16518/* 10133 */,0,0,0,/*30651*/16519/* 10137 */,/*30652*/16520/* 10138 */, /*30653*/16521/* 10139 */,/*30654*/16522/* 1013A */,/*30655*/16523/* 1013B */,/*30656*/16524/* 1013C */, /*30657*/16525/* 1013D */,/*30658*/16526/* 1013E */,/*30659*/16527/* 1013F */,/*30660*/16528/* 10140 */, /*30661*/16529/* 10141 */,/*30662*/16530/* 10142 */,/*30663*/16531/* 10143 */,/*30664*/16532/* 10144 */, /*30665*/16533/* 10145 */,/*30666*/16534/* 10146 */,/*30667*/16535/* 10147 */,/*30668*/16531/* 10148 */, /*30669*/16536/* 10149 */,/*30670*/16537/* 1014A */,/*30671*/16538/* 1014B */,/*30672*/16539/* 1014C */, /*30673*/16540/* 1014D */,/*30674*/16541/* 1014E */,/*30675*/16531/* 1014F */,/*30676*/16542/* 10150 */, /*30677*/16543/* 10151 */,/*30678*/16544/* 10152 */,/*30679*/16545/* 10153 */,/*30680*/16546/* 10154 */, /*30681*/16547/* 10155 */,/*30682*/16548/* 10156 */,/*30683*/16549/* 10157 */,/*30684*/16530/* 10158 */, /*30685*/16530/* 10159 */,/*30686*/16530/* 1015A */,/*30687*/16550/* 1015B */,/*30688*/16550/* 1015C */, /*30689*/16550/* 1015D */,/*30690*/16550/* 1015E */,/*30691*/16531/* 1015F */,/*30692*/16551/* 10160 */, /*30693*/16552/* 10161 */,/*30694*/16553/* 10162 */,/*30695*/16554/* 10163 */,/*30696*/16555/* 10164 */, /*30697*/16556/* 10165 */,/*30698*/16557/* 10166 */,/*30699*/16558/* 10167 */,/*30700*/16559/* 10168 */, /*30701*/16560/* 10169 */,/*30702*/16561/* 1016A */,/*30703*/16562/* 1016B */,/*30704*/16563/* 1016C */, /*30705*/16564/* 1016D */,/*30706*/16565/* 1016E */,/*30707*/16566/* 1016F */,/*30708*/16567/* 10170 */, /*30709*/16568/* 10171 */,/*30710*/16569/* 10172 */,/*30711*/16531/* 10173 */,/*30712*/16570/* 10174 */, /*30713*/16571/* 10175 */,/*30714*/16572/* 10176 */,/*30715*/16573/* 10177 */,/*30716*/16574/* 10178 */, /*30717*/16575/* 10179 */,/*30718*/16576/* 1017A */,/*30719*/16577/* 1017B */,/*30720*/16578/* 1017C */, /*30721*/16579/* 1017D */,/*30722*/16580/* 1017E */,/*30723*/16581/* 1017F */,/*30724*/16582/* 10180 */, /*30725*/16583/* 10181 */,/*30726*/16584/* 10182 */,/*30727*/16585/* 10183 */,/*30728*/16586/* 10184 */, /*30729*/16587/* 10185 */,/*30730*/16588/* 10186 */,/*30731*/16589/* 10187 */,/*30732*/16590/* 10188 */, /*30733*/16591/* 10189 */,/*30734*/16592/* 1018A */,/*30735*/16593/* 1018B */,/*30736*/16594/* 1018C */, /*30737*/16595/* 1018D */,/*30738*/16596/* 1018E */,0,/*30740*/16597/* 10190 */,/*30741*/16598/* 10191 */, /*30742*/16599/* 10192 */,/*30743*/16600/* 10193 */,/*30744*/16601/* 10194 */,/*30745*/16602/* 10195 */, /*30746*/16603/* 10196 */,/*30747*/16604/* 10197 */,/*30748*/16605/* 10198 */,/*30749*/16606/* 10199 */, /*30750*/16607/* 1019A */,/*30751*/16608/* 1019B */,0,0,0,0,/*30756*/16609/* 101A0 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*30804*/16610/* 101D0 */,/*30805*/16611/* 101D1 */, /*30806*/16612/* 101D2 */,/*30807*/16613/* 101D3 */,/*30808*/16614/* 101D4 */,/*30809*/16615/* 101D5 */, /*30810*/16616/* 101D6 */,/*30811*/16617/* 101D7 */,/*30812*/16618/* 101D8 */,/*30813*/16619/* 101D9 */, /*30814*/16620/* 101DA */,/*30815*/16621/* 101DB */,/*30816*/16622/* 101DC */,/*30817*/16623/* 101DD */, /*30818*/16624/* 101DE */,/*30819*/16625/* 101DF */,/*30820*/16626/* 101E0 */,/*30821*/16627/* 101E1 */, /*30822*/16628/* 101E2 */,/*30823*/16629/* 101E3 */,/*30824*/16630/* 101E4 */,/*30825*/16631/* 101E5 */, /*30826*/16632/* 101E6 */,/*30827*/16633/* 101E7 */,/*30828*/16634/* 101E8 */,/*30829*/16635/* 101E9 */, /*30830*/16636/* 101EA */,/*30831*/16637/* 101EB */,/*30832*/16638/* 101EC */,/*30833*/16639/* 101ED */, /*30834*/16640/* 101EE */,/*30835*/16641/* 101EF */,/*30836*/16642/* 101F0 */,/*30837*/16643/* 101F1 */, /*30838*/16644/* 101F2 */,/*30839*/16645/* 101F3 */,/*30840*/16646/* 101F4 */,/*30841*/16647/* 101F5 */, /*30842*/16648/* 101F6 */,/*30843*/16649/* 101F7 */,/*30844*/16650/* 101F8 */,/*30845*/16651/* 101F9 */, /*30846*/16652/* 101FA */,/*30847*/16653/* 101FB */,/*30848*/16654/* 101FC */,/*30849*/16655/* 101FD */,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,/*30980*/16656/* 10280 */,/*30981*/16657/* 10281 */,/*30982*/16658/* 10282 */,/*30983*/16659/* 10283 */, /*30984*/16660/* 10284 */,/*30985*/16661/* 10285 */,/*30986*/16662/* 10286 */,/*30987*/16663/* 10287 */, /*30988*/16664/* 10288 */,/*30989*/16665/* 10289 */,/*30990*/16666/* 1028A */,/*30991*/16667/* 1028B */, /*30992*/16668/* 1028C */,/*30993*/16669/* 1028D */,/*30994*/16670/* 1028E */,/*30995*/16671/* 1028F */, /*30996*/16672/* 10290 */,/*30997*/16673/* 10291 */,/*30998*/16674/* 10292 */,/*30999*/16675/* 10293 */, /*31000*/16676/* 10294 */,/*31001*/16677/* 10295 */,/*31002*/16678/* 10296 */,/*31003*/16679/* 10297 */, /*31004*/16680/* 10298 */,/*31005*/16681/* 10299 */,/*31006*/16682/* 1029A */,/*31007*/16683/* 1029B */, /*31008*/16684/* 1029C */,0,0,0,/*31012*/16685/* 102A0 */,/*31013*/16686/* 102A1 */,/*31014*/16687/* 102A2 */, /*31015*/16688/* 102A3 */,/*31016*/16689/* 102A4 */,/*31017*/16690/* 102A5 */,/*31018*/16691/* 102A6 */, /*31019*/16692/* 102A7 */,/*31020*/16693/* 102A8 */,/*31021*/16694/* 102A9 */,/*31022*/16695/* 102AA */, /*31023*/16696/* 102AB */,/*31024*/16697/* 102AC */,/*31025*/16698/* 102AD */,/*31026*/16699/* 102AE */, /*31027*/16700/* 102AF */,/*31028*/16701/* 102B0 */,/*31029*/16702/* 102B1 */,/*31030*/16703/* 102B2 */, /*31031*/16704/* 102B3 */,/*31032*/16705/* 102B4 */,/*31033*/16706/* 102B5 */,/*31034*/16707/* 102B6 */, /*31035*/16708/* 102B7 */,/*31036*/16709/* 102B8 */,/*31037*/16710/* 102B9 */,/*31038*/16711/* 102BA */, /*31039*/16712/* 102BB */,/*31040*/16713/* 102BC */,/*31041*/16714/* 102BD */,/*31042*/16715/* 102BE */, /*31043*/16716/* 102BF */,/*31044*/16717/* 102C0 */,/*31045*/16718/* 102C1 */,/*31046*/16719/* 102C2 */, /*31047*/16720/* 102C3 */,/*31048*/16721/* 102C4 */,/*31049*/16722/* 102C5 */,/*31050*/16723/* 102C6 */, /*31051*/16724/* 102C7 */,/*31052*/16725/* 102C8 */,/*31053*/16726/* 102C9 */,/*31054*/16727/* 102CA */, /*31055*/16728/* 102CB */,/*31056*/16729/* 102CC */,/*31057*/16730/* 102CD */,/*31058*/16731/* 102CE */, /*31059*/16732/* 102CF */,/*31060*/16733/* 102D0 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*31076*/16734/* 102E0 */, /*31077*/16735/* 102E1 */,/*31078*/16736/* 102E2 */,/*31079*/16737/* 102E3 */,/*31080*/16738/* 102E4 */, /*31081*/16739/* 102E5 */,/*31082*/16740/* 102E6 */,/*31083*/16741/* 102E7 */,/*31084*/16742/* 102E8 */, /*31085*/16743/* 102E9 */,/*31086*/16744/* 102EA */,/*31087*/16745/* 102EB */,/*31088*/16746/* 102EC */, /*31089*/16747/* 102ED */,/*31090*/16748/* 102EE */,/*31091*/16749/* 102EF */,/*31092*/16750/* 102F0 */, /*31093*/16751/* 102F1 */,/*31094*/16752/* 102F2 */,/*31095*/16753/* 102F3 */,/*31096*/16754/* 102F4 */, /*31097*/16755/* 102F5 */,/*31098*/16756/* 102F6 */,/*31099*/16757/* 102F7 */,/*31100*/16758/* 102F8 */, /*31101*/16759/* 102F9 */,/*31102*/16760/* 102FA */,/*31103*/16761/* 102FB */,0,0,0,0,/*31108*/16762/* 10300 */, /*31109*/16763/* 10301 */,/*31110*/16764/* 10302 */,/*31111*/16765/* 10303 */,/*31112*/16766/* 10304 */, /*31113*/16767/* 10305 */,/*31114*/16768/* 10306 */,/*31115*/16769/* 10307 */,/*31116*/16770/* 10308 */, /*31117*/16771/* 10309 */,/*31118*/16772/* 1030A */,/*31119*/16773/* 1030B */,/*31120*/16774/* 1030C */, /*31121*/16775/* 1030D */,/*31122*/16776/* 1030E */,/*31123*/16777/* 1030F */,/*31124*/16778/* 10310 */, /*31125*/16779/* 10311 */,/*31126*/16780/* 10312 */,/*31127*/16781/* 10313 */,/*31128*/16782/* 10314 */, /*31129*/16783/* 10315 */,/*31130*/16784/* 10316 */,/*31131*/16785/* 10317 */,/*31132*/16786/* 10318 */, /*31133*/16787/* 10319 */,/*31134*/16788/* 1031A */,/*31135*/16789/* 1031B */,/*31136*/16790/* 1031C */, /*31137*/16791/* 1031D */,/*31138*/16792/* 1031E */,/*31139*/16793/* 1031F */,/*31140*/16794/* 10320 */, /*31141*/16795/* 10321 */,/*31142*/16796/* 10322 */,/*31143*/16797/* 10323 */,0,0,0,0,0,0,0,0,0, /*31153*/16798/* 1032D */,/*31154*/16799/* 1032E */,/*31155*/16800/* 1032F */,/*31156*/16801/* 10330 */, /*31157*/16802/* 10331 */,/*31158*/16803/* 10332 */,/*31159*/16804/* 10333 */,/*31160*/16805/* 10334 */, /*31161*/16806/* 10335 */,/*31162*/16807/* 10336 */,/*31163*/16808/* 10337 */,/*31164*/16809/* 10338 */, /*31165*/16810/* 10339 */,/*31166*/16811/* 1033A */,/*31167*/16812/* 1033B */,/*31168*/16813/* 1033C */, /*31169*/16814/* 1033D */,/*31170*/16815/* 1033E */,/*31171*/16816/* 1033F */,/*31172*/16817/* 10340 */, /*31173*/16818/* 10341 */,/*31174*/16819/* 10342 */,/*31175*/16820/* 10343 */,/*31176*/16821/* 10344 */, /*31177*/16822/* 10345 */,/*31178*/16823/* 10346 */,/*31179*/16824/* 10347 */,/*31180*/16825/* 10348 */, /*31181*/16826/* 10349 */,/*31182*/16827/* 1034A */,0,0,0,0,0,/*31188*/16828/* 10350 */,/*31189*/16829/* 10351 */, /*31190*/16830/* 10352 */,/*31191*/16831/* 10353 */,/*31192*/16832/* 10354 */,/*31193*/16833/* 10355 */, /*31194*/16834/* 10356 */,/*31195*/16835/* 10357 */,/*31196*/16836/* 10358 */,/*31197*/16837/* 10359 */, /*31198*/16838/* 1035A */,/*31199*/16839/* 1035B */,/*31200*/16840/* 1035C */,/*31201*/16841/* 1035D */, /*31202*/16842/* 1035E */,/*31203*/16843/* 1035F */,/*31204*/16844/* 10360 */,/*31205*/16845/* 10361 */, /*31206*/16846/* 10362 */,/*31207*/16847/* 10363 */,/*31208*/16848/* 10364 */,/*31209*/16849/* 10365 */, /*31210*/16850/* 10366 */,/*31211*/16851/* 10367 */,/*31212*/16852/* 10368 */,/*31213*/16853/* 10369 */, /*31214*/16854/* 1036A */,/*31215*/16855/* 1036B */,/*31216*/16856/* 1036C */,/*31217*/16857/* 1036D */, /*31218*/16858/* 1036E */,/*31219*/16859/* 1036F */,/*31220*/16860/* 10370 */,/*31221*/16861/* 10371 */, /*31222*/16862/* 10372 */,/*31223*/16863/* 10373 */,/*31224*/16864/* 10374 */,/*31225*/16865/* 10375 */, /*31226*/16866/* 10376 */,/*31227*/16867/* 10377 */,/*31228*/16868/* 10378 */,/*31229*/16869/* 10379 */, /*31230*/16870/* 1037A */,0,0,0,0,0,/*31236*/16871/* 10380 */,/*31237*/16872/* 10381 */,/*31238*/16873/* 10382 */, /*31239*/16874/* 10383 */,/*31240*/16875/* 10384 */,/*31241*/16876/* 10385 */,/*31242*/16877/* 10386 */, /*31243*/16878/* 10387 */,/*31244*/16879/* 10388 */,/*31245*/16880/* 10389 */,/*31246*/16881/* 1038A */, /*31247*/16882/* 1038B */,/*31248*/16883/* 1038C */,/*31249*/16884/* 1038D */,/*31250*/16885/* 1038E */, /*31251*/16886/* 1038F */,/*31252*/16887/* 10390 */,/*31253*/16888/* 10391 */,/*31254*/16889/* 10392 */, /*31255*/16890/* 10393 */,/*31256*/16891/* 10394 */,/*31257*/16892/* 10395 */,/*31258*/16893/* 10396 */, /*31259*/16894/* 10397 */,/*31260*/16895/* 10398 */,/*31261*/16896/* 10399 */,/*31262*/16897/* 1039A */, /*31263*/16898/* 1039B */,/*31264*/16899/* 1039C */,/*31265*/16900/* 1039D */,0,/*31267*/16901/* 1039F */, /*31268*/16902/* 103A0 */,/*31269*/16903/* 103A1 */,/*31270*/16904/* 103A2 */,/*31271*/16905/* 103A3 */, /*31272*/16906/* 103A4 */,/*31273*/16907/* 103A5 */,/*31274*/16908/* 103A6 */,/*31275*/16909/* 103A7 */, /*31276*/16910/* 103A8 */,/*31277*/16911/* 103A9 */,/*31278*/16912/* 103AA */,/*31279*/16913/* 103AB */, /*31280*/16914/* 103AC */,/*31281*/16915/* 103AD */,/*31282*/16916/* 103AE */,/*31283*/16917/* 103AF */, /*31284*/16918/* 103B0 */,/*31285*/16919/* 103B1 */,/*31286*/16920/* 103B2 */,/*31287*/16921/* 103B3 */, /*31288*/16922/* 103B4 */,/*31289*/16923/* 103B5 */,/*31290*/16924/* 103B6 */,/*31291*/16925/* 103B7 */, /*31292*/16926/* 103B8 */,/*31293*/16927/* 103B9 */,/*31294*/16928/* 103BA */,/*31295*/16929/* 103BB */, /*31296*/16930/* 103BC */,/*31297*/16931/* 103BD */,/*31298*/16932/* 103BE */,/*31299*/16933/* 103BF */, /*31300*/16934/* 103C0 */,/*31301*/16935/* 103C1 */,/*31302*/16936/* 103C2 */,/*31303*/16937/* 103C3 */,0,0,0,0, /*31308*/16938/* 103C8 */,/*31309*/16939/* 103C9 */,/*31310*/16940/* 103CA */,/*31311*/16941/* 103CB */, /*31312*/16942/* 103CC */,/*31313*/16943/* 103CD */,/*31314*/16944/* 103CE */,/*31315*/16945/* 103CF */, /*31316*/16946/* 103D0 */,/*31317*/16947/* 103D1 */,/*31318*/16948/* 103D2 */,/*31319*/16949/* 103D3 */, /*31320*/16950/* 103D4 */,/*31321*/16951/* 103D5 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,/*31364*/16952/* 10400 */,/*31365*/16953/* 10401 */,/*31366*/16954/* 10402 */,/*31367*/16955/* 10403 */, /*31368*/16956/* 10404 */,/*31369*/16957/* 10405 */,/*31370*/16958/* 10406 */,/*31371*/16959/* 10407 */, /*31372*/16960/* 10408 */,/*31373*/16961/* 10409 */,/*31374*/16962/* 1040A */,/*31375*/16963/* 1040B */, /*31376*/16964/* 1040C */,/*31377*/16965/* 1040D */,/*31378*/16966/* 1040E */,/*31379*/16967/* 1040F */, /*31380*/16968/* 10410 */,/*31381*/16969/* 10411 */,/*31382*/16970/* 10412 */,/*31383*/16971/* 10413 */, /*31384*/16972/* 10414 */,/*31385*/16973/* 10415 */,/*31386*/16974/* 10416 */,/*31387*/16975/* 10417 */, /*31388*/16976/* 10418 */,/*31389*/16977/* 10419 */,/*31390*/16978/* 1041A */,/*31391*/16979/* 1041B */, /*31392*/16980/* 1041C */,/*31393*/16981/* 1041D */,/*31394*/16982/* 1041E */,/*31395*/16983/* 1041F */, /*31396*/16984/* 10420 */,/*31397*/16985/* 10421 */,/*31398*/16986/* 10422 */,/*31399*/16987/* 10423 */, /*31400*/16988/* 10424 */,/*31401*/16989/* 10425 */,/*31402*/16990/* 10426 */,/*31403*/16991/* 10427 */, /*31404*/16992/* 10428 */,/*31405*/16993/* 10429 */,/*31406*/16994/* 1042A */,/*31407*/16995/* 1042B */, /*31408*/16996/* 1042C */,/*31409*/16997/* 1042D */,/*31410*/16998/* 1042E */,/*31411*/16999/* 1042F */, /*31412*/17000/* 10430 */,/*31413*/17001/* 10431 */,/*31414*/17002/* 10432 */,/*31415*/17003/* 10433 */, /*31416*/17004/* 10434 */,/*31417*/17005/* 10435 */,/*31418*/17006/* 10436 */,/*31419*/17007/* 10437 */, /*31420*/17008/* 10438 */,/*31421*/17009/* 10439 */,/*31422*/17010/* 1043A */,/*31423*/17011/* 1043B */, /*31424*/17012/* 1043C */,/*31425*/17013/* 1043D */,/*31426*/17014/* 1043E */,/*31427*/17015/* 1043F */, /*31428*/17016/* 10440 */,/*31429*/17017/* 10441 */,/*31430*/17018/* 10442 */,/*31431*/17019/* 10443 */, /*31432*/17020/* 10444 */,/*31433*/17021/* 10445 */,/*31434*/17022/* 10446 */,/*31435*/17023/* 10447 */, /*31436*/17024/* 10448 */,/*31437*/17025/* 10449 */,/*31438*/17026/* 1044A */,/*31439*/17027/* 1044B */, /*31440*/17028/* 1044C */,/*31441*/17029/* 1044D */,/*31442*/17030/* 1044E */,/*31443*/17031/* 1044F */, /*31444*/17032/* 10450 */,/*31445*/17033/* 10451 */,/*31446*/17034/* 10452 */,/*31447*/17035/* 10453 */, /*31448*/17036/* 10454 */,/*31449*/17037/* 10455 */,/*31450*/17038/* 10456 */,/*31451*/17039/* 10457 */, /*31452*/17040/* 10458 */,/*31453*/17041/* 10459 */,/*31454*/17042/* 1045A */,/*31455*/17043/* 1045B */, /*31456*/17044/* 1045C */,/*31457*/17045/* 1045D */,/*31458*/17046/* 1045E */,/*31459*/17047/* 1045F */, /*31460*/17048/* 10460 */,/*31461*/17049/* 10461 */,/*31462*/17050/* 10462 */,/*31463*/17051/* 10463 */, /*31464*/17052/* 10464 */,/*31465*/17053/* 10465 */,/*31466*/17054/* 10466 */,/*31467*/17055/* 10467 */, /*31468*/17056/* 10468 */,/*31469*/17057/* 10469 */,/*31470*/17058/* 1046A */,/*31471*/17059/* 1046B */, /*31472*/17060/* 1046C */,/*31473*/17061/* 1046D */,/*31474*/17062/* 1046E */,/*31475*/17063/* 1046F */, /*31476*/17064/* 10470 */,/*31477*/17065/* 10471 */,/*31478*/17066/* 10472 */,/*31479*/17067/* 10473 */, /*31480*/17068/* 10474 */,/*31481*/17069/* 10475 */,/*31482*/17070/* 10476 */,/*31483*/17071/* 10477 */, /*31484*/17072/* 10478 */,/*31485*/17073/* 10479 */,/*31486*/17074/* 1047A */,/*31487*/17075/* 1047B */, /*31488*/17076/* 1047C */,/*31489*/17077/* 1047D */,/*31490*/17078/* 1047E */,/*31491*/17079/* 1047F */, /*31492*/17080/* 10480 */,/*31493*/17081/* 10481 */,/*31494*/17082/* 10482 */,/*31495*/17083/* 10483 */, /*31496*/17084/* 10484 */,/*31497*/17085/* 10485 */,/*31498*/17086/* 10486 */,/*31499*/17087/* 10487 */, /*31500*/17088/* 10488 */,/*31501*/17089/* 10489 */,/*31502*/17090/* 1048A */,/*31503*/17091/* 1048B */, /*31504*/17092/* 1048C */,/*31505*/17093/* 1048D */,/*31506*/17094/* 1048E */,/*31507*/17095/* 1048F */, /*31508*/17096/* 10490 */,/*31509*/17097/* 10491 */,/*31510*/17098/* 10492 */,/*31511*/17099/* 10493 */, /*31512*/17100/* 10494 */,/*31513*/17101/* 10495 */,/*31514*/17102/* 10496 */,/*31515*/17103/* 10497 */, /*31516*/17104/* 10498 */,/*31517*/17105/* 10499 */,/*31518*/17106/* 1049A */,/*31519*/17107/* 1049B */, /*31520*/17108/* 1049C */,/*31521*/17109/* 1049D */,0,0,/*31524*/17110/* 104A0 */,/*31525*/17111/* 104A1 */, /*31526*/17112/* 104A2 */,/*31527*/17113/* 104A3 */,/*31528*/17114/* 104A4 */,/*31529*/17115/* 104A5 */, /*31530*/17116/* 104A6 */,/*31531*/17117/* 104A7 */,/*31532*/17118/* 104A8 */,/*31533*/17119/* 104A9 */,0,0,0,0,0,0, /*31540*/17120/* 104B0 */,/*31541*/17121/* 104B1 */,/*31542*/17122/* 104B2 */,/*31543*/17123/* 104B3 */, /*31544*/17124/* 104B4 */,/*31545*/17125/* 104B5 */,/*31546*/17126/* 104B6 */,/*31547*/17127/* 104B7 */, /*31548*/17128/* 104B8 */,/*31549*/17129/* 104B9 */,/*31550*/17130/* 104BA */,/*31551*/17131/* 104BB */, /*31552*/17132/* 104BC */,/*31553*/17133/* 104BD */,/*31554*/17134/* 104BE */,/*31555*/17135/* 104BF */, /*31556*/17136/* 104C0 */,/*31557*/17137/* 104C1 */,/*31558*/17138/* 104C2 */,/*31559*/17139/* 104C3 */, /*31560*/17140/* 104C4 */,/*31561*/17141/* 104C5 */,/*31562*/17142/* 104C6 */,/*31563*/17143/* 104C7 */, /*31564*/17144/* 104C8 */,/*31565*/17145/* 104C9 */,/*31566*/17146/* 104CA */,/*31567*/17147/* 104CB */, /*31568*/17148/* 104CC */,/*31569*/17149/* 104CD */,/*31570*/17150/* 104CE */,/*31571*/17151/* 104CF */, /*31572*/17152/* 104D0 */,/*31573*/17153/* 104D1 */,/*31574*/17154/* 104D2 */,/*31575*/17155/* 104D3 */,0,0,0,0, /*31580*/17156/* 104D8 */,/*31581*/17157/* 104D9 */,/*31582*/17158/* 104DA */,/*31583*/17159/* 104DB */, /*31584*/17160/* 104DC */,/*31585*/17161/* 104DD */,/*31586*/17162/* 104DE */,/*31587*/17163/* 104DF */, /*31588*/17164/* 104E0 */,/*31589*/17165/* 104E1 */,/*31590*/17166/* 104E2 */,/*31591*/17167/* 104E3 */, /*31592*/17168/* 104E4 */,/*31593*/17169/* 104E5 */,/*31594*/17170/* 104E6 */,/*31595*/17171/* 104E7 */, /*31596*/17172/* 104E8 */,/*31597*/17173/* 104E9 */,/*31598*/17174/* 104EA */,/*31599*/17175/* 104EB */, /*31600*/17176/* 104EC */,/*31601*/17177/* 104ED */,/*31602*/17178/* 104EE */,/*31603*/17179/* 104EF */, /*31604*/17180/* 104F0 */,/*31605*/17181/* 104F1 */,/*31606*/17182/* 104F2 */,/*31607*/17183/* 104F3 */, /*31608*/17184/* 104F4 */,/*31609*/17185/* 104F5 */,/*31610*/17186/* 104F6 */,/*31611*/17187/* 104F7 */, /*31612*/17188/* 104F8 */,/*31613*/17189/* 104F9 */,/*31614*/17190/* 104FA */,/*31615*/17191/* 104FB */,0,0,0,0, /*31620*/17192/* 10500 */,/*31621*/17193/* 10501 */,/*31622*/17194/* 10502 */,/*31623*/17195/* 10503 */, /*31624*/17196/* 10504 */,/*31625*/17197/* 10505 */,/*31626*/17198/* 10506 */,/*31627*/17199/* 10507 */, /*31628*/17200/* 10508 */,/*31629*/17201/* 10509 */,/*31630*/17202/* 1050A */,/*31631*/17203/* 1050B */, /*31632*/17204/* 1050C */,/*31633*/17205/* 1050D */,/*31634*/17206/* 1050E */,/*31635*/17207/* 1050F */, /*31636*/17208/* 10510 */,/*31637*/17209/* 10511 */,/*31638*/17210/* 10512 */,/*31639*/17211/* 10513 */, /*31640*/17212/* 10514 */,/*31641*/17213/* 10515 */,/*31642*/17214/* 10516 */,/*31643*/17215/* 10517 */, /*31644*/17216/* 10518 */,/*31645*/17217/* 10519 */,/*31646*/17218/* 1051A */,/*31647*/17219/* 1051B */, /*31648*/17220/* 1051C */,/*31649*/17221/* 1051D */,/*31650*/17222/* 1051E */,/*31651*/17223/* 1051F */, /*31652*/17224/* 10520 */,/*31653*/17225/* 10521 */,/*31654*/17226/* 10522 */,/*31655*/17227/* 10523 */, /*31656*/17228/* 10524 */,/*31657*/17229/* 10525 */,/*31658*/17230/* 10526 */,/*31659*/17231/* 10527 */,0,0,0,0,0,0,0,0, /*31668*/17232/* 10530 */,/*31669*/17233/* 10531 */,/*31670*/17234/* 10532 */,/*31671*/17235/* 10533 */, /*31672*/17236/* 10534 */,/*31673*/17237/* 10535 */,/*31674*/17238/* 10536 */,/*31675*/17239/* 10537 */, /*31676*/17240/* 10538 */,/*31677*/17241/* 10539 */,/*31678*/17242/* 1053A */,/*31679*/17243/* 1053B */, /*31680*/17244/* 1053C */,/*31681*/17245/* 1053D */,/*31682*/17246/* 1053E */,/*31683*/17247/* 1053F */, /*31684*/17248/* 10540 */,/*31685*/17249/* 10541 */,/*31686*/17250/* 10542 */,/*31687*/17251/* 10543 */, /*31688*/17252/* 10544 */,/*31689*/17253/* 10545 */,/*31690*/17254/* 10546 */,/*31691*/17255/* 10547 */, /*31692*/17256/* 10548 */,/*31693*/17257/* 10549 */,/*31694*/17258/* 1054A */,/*31695*/17259/* 1054B */, /*31696*/17260/* 1054C */,/*31697*/17261/* 1054D */,/*31698*/17262/* 1054E */,/*31699*/17263/* 1054F */, /*31700*/17264/* 10550 */,/*31701*/17265/* 10551 */,/*31702*/17266/* 10552 */,/*31703*/17267/* 10553 */, /*31704*/17268/* 10554 */,/*31705*/17269/* 10555 */,/*31706*/17270/* 10556 */,/*31707*/17271/* 10557 */, /*31708*/17272/* 10558 */,/*31709*/17273/* 10559 */,/*31710*/17274/* 1055A */,/*31711*/17275/* 1055B */, /*31712*/17276/* 1055C */,/*31713*/17277/* 1055D */,/*31714*/17278/* 1055E */,/*31715*/17279/* 1055F */, /*31716*/17280/* 10560 */,/*31717*/17281/* 10561 */,/*31718*/17282/* 10562 */,/*31719*/17283/* 10563 */,0,0,0,0,0,0,0,0, 0,0,0,/*31731*/17284/* 1056F */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*31876*/17285/* 10600 */, /*31877*/17286/* 10601 */,/*31878*/17287/* 10602 */,/*31879*/17288/* 10603 */,/*31880*/17289/* 10604 */, /*31881*/17290/* 10605 */,/*31882*/17291/* 10606 */,/*31883*/17292/* 10607 */,/*31884*/17293/* 10608 */, /*31885*/17294/* 10609 */,/*31886*/17295/* 1060A */,/*31887*/17296/* 1060B */,/*31888*/17297/* 1060C */, /*31889*/17298/* 1060D */,/*31890*/17299/* 1060E */,/*31891*/17300/* 1060F */,/*31892*/17301/* 10610 */, /*31893*/17302/* 10611 */,/*31894*/17303/* 10612 */,/*31895*/17304/* 10613 */,/*31896*/17305/* 10614 */, /*31897*/17306/* 10615 */,/*31898*/17307/* 10616 */,/*31899*/17308/* 10617 */,/*31900*/17309/* 10618 */, /*31901*/17310/* 10619 */,/*31902*/17311/* 1061A */,/*31903*/17312/* 1061B */,/*31904*/17313/* 1061C */, /*31905*/17314/* 1061D */,/*31906*/17315/* 1061E */,/*31907*/17316/* 1061F */,/*31908*/17317/* 10620 */, /*31909*/17318/* 10621 */,/*31910*/17319/* 10622 */,/*31911*/17320/* 10623 */,/*31912*/17321/* 10624 */, /*31913*/17322/* 10625 */,/*31914*/17323/* 10626 */,/*31915*/17324/* 10627 */,/*31916*/17325/* 10628 */, /*31917*/17326/* 10629 */,/*31918*/17327/* 1062A */,/*31919*/17328/* 1062B */,/*31920*/17329/* 1062C */, /*31921*/17330/* 1062D */,/*31922*/17331/* 1062E */,/*31923*/17332/* 1062F */,/*31924*/17333/* 10630 */, /*31925*/17334/* 10631 */,/*31926*/17335/* 10632 */,/*31927*/17336/* 10633 */,/*31928*/17337/* 10634 */, /*31929*/17338/* 10635 */,/*31930*/17339/* 10636 */,/*31931*/17340/* 10637 */,/*31932*/17341/* 10638 */, /*31933*/17342/* 10639 */,/*31934*/17343/* 1063A */,/*31935*/17344/* 1063B */,/*31936*/17345/* 1063C */, /*31937*/17346/* 1063D */,/*31938*/17347/* 1063E */,/*31939*/17348/* 1063F */,/*31940*/17349/* 10640 */, /*31941*/17350/* 10641 */,/*31942*/17351/* 10642 */,/*31943*/17352/* 10643 */,/*31944*/17353/* 10644 */, /*31945*/17354/* 10645 */,/*31946*/17355/* 10646 */,/*31947*/17356/* 10647 */,/*31948*/17357/* 10648 */, /*31949*/17358/* 10649 */,/*31950*/17359/* 1064A */,/*31951*/17360/* 1064B */,/*31952*/17361/* 1064C */, /*31953*/17362/* 1064D */,/*31954*/17363/* 1064E */,/*31955*/17364/* 1064F */,/*31956*/17365/* 10650 */, /*31957*/17366/* 10651 */,/*31958*/17367/* 10652 */,/*31959*/17368/* 10653 */,/*31960*/17369/* 10654 */, /*31961*/17370/* 10655 */,/*31962*/17371/* 10656 */,/*31963*/17372/* 10657 */,/*31964*/17373/* 10658 */, /*31965*/17374/* 10659 */,/*31966*/17375/* 1065A */,/*31967*/17376/* 1065B */,/*31968*/17377/* 1065C */, /*31969*/17378/* 1065D */,/*31970*/17379/* 1065E */,/*31971*/17380/* 1065F */,/*31972*/17381/* 10660 */, /*31973*/17382/* 10661 */,/*31974*/17383/* 10662 */,/*31975*/17384/* 10663 */,/*31976*/17385/* 10664 */, /*31977*/17386/* 10665 */,/*31978*/17387/* 10666 */,/*31979*/17388/* 10667 */,/*31980*/17389/* 10668 */, /*31981*/17390/* 10669 */,/*31982*/17391/* 1066A */,/*31983*/17392/* 1066B */,/*31984*/17393/* 1066C */, /*31985*/17394/* 1066D */,/*31986*/17395/* 1066E */,/*31987*/17396/* 1066F */,/*31988*/17397/* 10670 */, /*31989*/17398/* 10671 */,/*31990*/17399/* 10672 */,/*31991*/17400/* 10673 */,/*31992*/17401/* 10674 */, /*31993*/17402/* 10675 */,/*31994*/17403/* 10676 */,/*31995*/17404/* 10677 */,/*31996*/17405/* 10678 */, /*31997*/17406/* 10679 */,/*31998*/17407/* 1067A */,/*31999*/17408/* 1067B */,/*32000*/17409/* 1067C */, /*32001*/17410/* 1067D */,/*32002*/17411/* 1067E */,/*32003*/17412/* 1067F */,/*32004*/17413/* 10680 */, /*32005*/17414/* 10681 */,/*32006*/17415/* 10682 */,/*32007*/17416/* 10683 */,/*32008*/17417/* 10684 */, /*32009*/17418/* 10685 */,/*32010*/17419/* 10686 */,/*32011*/17420/* 10687 */,/*32012*/17421/* 10688 */, /*32013*/17422/* 10689 */,/*32014*/17423/* 1068A */,/*32015*/17424/* 1068B */,/*32016*/17425/* 1068C */, /*32017*/17426/* 1068D */,/*32018*/17427/* 1068E */,/*32019*/17428/* 1068F */,/*32020*/17429/* 10690 */, /*32021*/17430/* 10691 */,/*32022*/17431/* 10692 */,/*32023*/17432/* 10693 */,/*32024*/17433/* 10694 */, /*32025*/17434/* 10695 */,/*32026*/17435/* 10696 */,/*32027*/17436/* 10697 */,/*32028*/17437/* 10698 */, /*32029*/17438/* 10699 */,/*32030*/17439/* 1069A */,/*32031*/17440/* 1069B */,/*32032*/17441/* 1069C */, /*32033*/17442/* 1069D */,/*32034*/17443/* 1069E */,/*32035*/17444/* 1069F */,/*32036*/17445/* 106A0 */, /*32037*/17446/* 106A1 */,/*32038*/17447/* 106A2 */,/*32039*/17448/* 106A3 */,/*32040*/17449/* 106A4 */, /*32041*/17450/* 106A5 */,/*32042*/17451/* 106A6 */,/*32043*/17452/* 106A7 */,/*32044*/17453/* 106A8 */, /*32045*/17454/* 106A9 */,/*32046*/17455/* 106AA */,/*32047*/17456/* 106AB */,/*32048*/17457/* 106AC */, /*32049*/17458/* 106AD */,/*32050*/17459/* 106AE */,/*32051*/17460/* 106AF */,/*32052*/17461/* 106B0 */, /*32053*/17462/* 106B1 */,/*32054*/17463/* 106B2 */,/*32055*/17464/* 106B3 */,/*32056*/17465/* 106B4 */, /*32057*/17466/* 106B5 */,/*32058*/17467/* 106B6 */,/*32059*/17468/* 106B7 */,/*32060*/17469/* 106B8 */, /*32061*/17470/* 106B9 */,/*32062*/17471/* 106BA */,/*32063*/17472/* 106BB */,/*32064*/17473/* 106BC */, /*32065*/17474/* 106BD */,/*32066*/17475/* 106BE */,/*32067*/17476/* 106BF */,/*32068*/17477/* 106C0 */, /*32069*/17478/* 106C1 */,/*32070*/17479/* 106C2 */,/*32071*/17480/* 106C3 */,/*32072*/17481/* 106C4 */, /*32073*/17482/* 106C5 */,/*32074*/17483/* 106C6 */,/*32075*/17484/* 106C7 */,/*32076*/17485/* 106C8 */, /*32077*/17486/* 106C9 */,/*32078*/17487/* 106CA */,/*32079*/17488/* 106CB */,/*32080*/17489/* 106CC */, /*32081*/17490/* 106CD */,/*32082*/17491/* 106CE */,/*32083*/17492/* 106CF */,/*32084*/17493/* 106D0 */, /*32085*/17494/* 106D1 */,/*32086*/17495/* 106D2 */,/*32087*/17496/* 106D3 */,/*32088*/17497/* 106D4 */, /*32089*/17498/* 106D5 */,/*32090*/17499/* 106D6 */,/*32091*/17500/* 106D7 */,/*32092*/17501/* 106D8 */, /*32093*/17502/* 106D9 */,/*32094*/17503/* 106DA */,/*32095*/17504/* 106DB */,/*32096*/17505/* 106DC */, /*32097*/17506/* 106DD */,/*32098*/17507/* 106DE */,/*32099*/17508/* 106DF */,/*32100*/17509/* 106E0 */, /*32101*/17510/* 106E1 */,/*32102*/17511/* 106E2 */,/*32103*/17512/* 106E3 */,/*32104*/17513/* 106E4 */, /*32105*/17514/* 106E5 */,/*32106*/17515/* 106E6 */,/*32107*/17516/* 106E7 */,/*32108*/17517/* 106E8 */, /*32109*/17518/* 106E9 */,/*32110*/17519/* 106EA */,/*32111*/17520/* 106EB */,/*32112*/17521/* 106EC */, /*32113*/17522/* 106ED */,/*32114*/17523/* 106EE */,/*32115*/17524/* 106EF */,/*32116*/17525/* 106F0 */, /*32117*/17526/* 106F1 */,/*32118*/17527/* 106F2 */,/*32119*/17528/* 106F3 */,/*32120*/17529/* 106F4 */, /*32121*/17530/* 106F5 */,/*32122*/17531/* 106F6 */,/*32123*/17532/* 106F7 */,/*32124*/17533/* 106F8 */, /*32125*/17534/* 106F9 */,/*32126*/17535/* 106FA */,/*32127*/17536/* 106FB */,/*32128*/17537/* 106FC */, /*32129*/17538/* 106FD */,/*32130*/17539/* 106FE */,/*32131*/17540/* 106FF */,/*32132*/17541/* 10700 */, /*32133*/17542/* 10701 */,/*32134*/17543/* 10702 */,/*32135*/17544/* 10703 */,/*32136*/17545/* 10704 */, /*32137*/17546/* 10705 */,/*32138*/17547/* 10706 */,/*32139*/17548/* 10707 */,/*32140*/17549/* 10708 */, /*32141*/17550/* 10709 */,/*32142*/17551/* 1070A */,/*32143*/17552/* 1070B */,/*32144*/17553/* 1070C */, /*32145*/17554/* 1070D */,/*32146*/17555/* 1070E */,/*32147*/17556/* 1070F */,/*32148*/17557/* 10710 */, /*32149*/17558/* 10711 */,/*32150*/17559/* 10712 */,/*32151*/17560/* 10713 */,/*32152*/17561/* 10714 */, /*32153*/17562/* 10715 */,/*32154*/17563/* 10716 */,/*32155*/17564/* 10717 */,/*32156*/17565/* 10718 */, /*32157*/17566/* 10719 */,/*32158*/17567/* 1071A */,/*32159*/17568/* 1071B */,/*32160*/17569/* 1071C */, /*32161*/17570/* 1071D */,/*32162*/17571/* 1071E */,/*32163*/17572/* 1071F */,/*32164*/17573/* 10720 */, /*32165*/17574/* 10721 */,/*32166*/17575/* 10722 */,/*32167*/17576/* 10723 */,/*32168*/17577/* 10724 */, /*32169*/17578/* 10725 */,/*32170*/17579/* 10726 */,/*32171*/17580/* 10727 */,/*32172*/17581/* 10728 */, /*32173*/17582/* 10729 */,/*32174*/17583/* 1072A */,/*32175*/17584/* 1072B */,/*32176*/17585/* 1072C */, /*32177*/17586/* 1072D */,/*32178*/17587/* 1072E */,/*32179*/17588/* 1072F */,/*32180*/17589/* 10730 */, /*32181*/17590/* 10731 */,/*32182*/17591/* 10732 */,/*32183*/17592/* 10733 */,/*32184*/17593/* 10734 */, /*32185*/17594/* 10735 */,/*32186*/17595/* 10736 */,0,0,0,0,0,0,0,0,0,/*32196*/17596/* 10740 */, /*32197*/17597/* 10741 */,/*32198*/17598/* 10742 */,/*32199*/17599/* 10743 */,/*32200*/17600/* 10744 */, /*32201*/17601/* 10745 */,/*32202*/17602/* 10746 */,/*32203*/17603/* 10747 */,/*32204*/17604/* 10748 */, /*32205*/17605/* 10749 */,/*32206*/17606/* 1074A */,/*32207*/17607/* 1074B */,/*32208*/17608/* 1074C */, /*32209*/17609/* 1074D */,/*32210*/17610/* 1074E */,/*32211*/17611/* 1074F */,/*32212*/17612/* 10750 */, /*32213*/17613/* 10751 */,/*32214*/17614/* 10752 */,/*32215*/17615/* 10753 */,/*32216*/17616/* 10754 */, /*32217*/17617/* 10755 */,0,0,0,0,0,0,0,0,0,0,/*32228*/17618/* 10760 */,/*32229*/17619/* 10761 */, /*32230*/17620/* 10762 */,/*32231*/17621/* 10763 */,/*32232*/17622/* 10764 */,/*32233*/17623/* 10765 */, /*32234*/17624/* 10766 */,/*32235*/17625/* 10767 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*32388*/17626/* 10800 */,/*32389*/17627/* 10801 */,/*32390*/17628/* 10802 */,/*32391*/17629/* 10803 */, /*32392*/17630/* 10804 */,/*32393*/17631/* 10805 */,0,0,/*32396*/17632/* 10808 */,0,/*32398*/17633/* 1080A */, /*32399*/17634/* 1080B */,/*32400*/17635/* 1080C */,/*32401*/17636/* 1080D */,/*32402*/17637/* 1080E */, /*32403*/17638/* 1080F */,/*32404*/17639/* 10810 */,/*32405*/17640/* 10811 */,/*32406*/17641/* 10812 */, /*32407*/17642/* 10813 */,/*32408*/17643/* 10814 */,/*32409*/17644/* 10815 */,/*32410*/17645/* 10816 */, /*32411*/17646/* 10817 */,/*32412*/17647/* 10818 */,/*32413*/17648/* 10819 */,/*32414*/17649/* 1081A */, /*32415*/17650/* 1081B */,/*32416*/17651/* 1081C */,/*32417*/17652/* 1081D */,/*32418*/17653/* 1081E */, /*32419*/17654/* 1081F */,/*32420*/17655/* 10820 */,/*32421*/17656/* 10821 */,/*32422*/17657/* 10822 */, /*32423*/17658/* 10823 */,/*32424*/17659/* 10824 */,/*32425*/17660/* 10825 */,/*32426*/17661/* 10826 */, /*32427*/17662/* 10827 */,/*32428*/17663/* 10828 */,/*32429*/17664/* 10829 */,/*32430*/17665/* 1082A */, /*32431*/17666/* 1082B */,/*32432*/17667/* 1082C */,/*32433*/17668/* 1082D */,/*32434*/17669/* 1082E */, /*32435*/17670/* 1082F */,/*32436*/17671/* 10830 */,/*32437*/17672/* 10831 */,/*32438*/17673/* 10832 */, /*32439*/17674/* 10833 */,/*32440*/17675/* 10834 */,/*32441*/17676/* 10835 */,0,/*32443*/17677/* 10837 */, /*32444*/17678/* 10838 */,0,0,0,/*32448*/17679/* 1083C */,0,0,/*32451*/17680/* 1083F */,/*32452*/17681/* 10840 */, /*32453*/17682/* 10841 */,/*32454*/17683/* 10842 */,/*32455*/17684/* 10843 */,/*32456*/17685/* 10844 */, /*32457*/17686/* 10845 */,/*32458*/17687/* 10846 */,/*32459*/17688/* 10847 */,/*32460*/17689/* 10848 */, /*32461*/17690/* 10849 */,/*32462*/17691/* 1084A */,/*32463*/17692/* 1084B */,/*32464*/17693/* 1084C */, /*32465*/17694/* 1084D */,/*32466*/17695/* 1084E */,/*32467*/17696/* 1084F */,/*32468*/17697/* 10850 */, /*32469*/17698/* 10851 */,/*32470*/17699/* 10852 */,/*32471*/17700/* 10853 */,/*32472*/17701/* 10854 */, /*32473*/17702/* 10855 */,0,/*32475*/17703/* 10857 */,/*32476*/17704/* 10858 */,/*32477*/17705/* 10859 */, /*32478*/17706/* 1085A */,/*32479*/17707/* 1085B */,/*32480*/17708/* 1085C */,/*32481*/17709/* 1085D */, /*32482*/17710/* 1085E */,/*32483*/17711/* 1085F */,/*32484*/17712/* 10860 */,/*32485*/17713/* 10861 */, /*32486*/17714/* 10862 */,/*32487*/17715/* 10863 */,/*32488*/17716/* 10864 */,/*32489*/17717/* 10865 */, /*32490*/17718/* 10866 */,/*32491*/17719/* 10867 */,/*32492*/17720/* 10868 */,/*32493*/17721/* 10869 */, /*32494*/17722/* 1086A */,/*32495*/17723/* 1086B */,/*32496*/17724/* 1086C */,/*32497*/17725/* 1086D */, /*32498*/17726/* 1086E */,/*32499*/17727/* 1086F */,/*32500*/17728/* 10870 */,/*32501*/17729/* 10871 */, /*32502*/17730/* 10872 */,/*32503*/17731/* 10873 */,/*32504*/17732/* 10874 */,/*32505*/17733/* 10875 */, /*32506*/17734/* 10876 */,/*32507*/17735/* 10877 */,/*32508*/17736/* 10878 */,/*32509*/17737/* 10879 */, /*32510*/17738/* 1087A */,/*32511*/17739/* 1087B */,/*32512*/17740/* 1087C */,/*32513*/17741/* 1087D */, /*32514*/17742/* 1087E */,/*32515*/17743/* 1087F */,/*32516*/17744/* 10880 */,/*32517*/17745/* 10881 */, /*32518*/17746/* 10882 */,/*32519*/17747/* 10883 */,/*32520*/17748/* 10884 */,/*32521*/17749/* 10885 */, /*32522*/17750/* 10886 */,/*32523*/17751/* 10887 */,/*32524*/17752/* 10888 */,/*32525*/17753/* 10889 */, /*32526*/17754/* 1088A */,/*32527*/17755/* 1088B */,/*32528*/17756/* 1088C */,/*32529*/17757/* 1088D */, /*32530*/17758/* 1088E */,/*32531*/17759/* 1088F */,/*32532*/17760/* 10890 */,/*32533*/17761/* 10891 */, /*32534*/17762/* 10892 */,/*32535*/17763/* 10893 */,/*32536*/17764/* 10894 */,/*32537*/17765/* 10895 */, /*32538*/17766/* 10896 */,/*32539*/17767/* 10897 */,/*32540*/17768/* 10898 */,/*32541*/17769/* 10899 */, /*32542*/17770/* 1089A */,/*32543*/17771/* 1089B */,/*32544*/17772/* 1089C */,/*32545*/17773/* 1089D */, /*32546*/17774/* 1089E */,0,0,0,0,0,0,0,0,/*32555*/17775/* 108A7 */,/*32556*/17776/* 108A8 */,/*32557*/17777/* 108A9 */, /*32558*/17778/* 108AA */,/*32559*/17778/* 108AB */,/*32560*/17779/* 108AC */,/*32561*/17780/* 108AD */, /*32562*/17781/* 108AE */,/*32563*/17782/* 108AF */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*32612*/17783/* 108E0 */,/*32613*/17784/* 108E1 */,/*32614*/17785/* 108E2 */, /*32615*/17786/* 108E3 */,/*32616*/17787/* 108E4 */,/*32617*/17788/* 108E5 */,/*32618*/17789/* 108E6 */, /*32619*/17790/* 108E7 */,/*32620*/17791/* 108E8 */,/*32621*/17792/* 108E9 */,/*32622*/17793/* 108EA */, /*32623*/17794/* 108EB */,/*32624*/17795/* 108EC */,/*32625*/17796/* 108ED */,/*32626*/17797/* 108EE */, /*32627*/17798/* 108EF */,/*32628*/17799/* 108F0 */,/*32629*/17800/* 108F1 */,/*32630*/17801/* 108F2 */,0, /*32632*/17802/* 108F4 */,/*32633*/17803/* 108F5 */,0,0,0,0,0,/*32639*/17804/* 108FB */,/*32640*/17805/* 108FC */, /*32641*/17806/* 108FD */,/*32642*/17807/* 108FE */,/*32643*/17808/* 108FF */,/*32644*/17809/* 10900 */, /*32645*/17810/* 10901 */,/*32646*/17811/* 10902 */,/*32647*/17812/* 10903 */,/*32648*/17813/* 10904 */, /*32649*/17814/* 10905 */,/*32650*/17815/* 10906 */,/*32651*/17816/* 10907 */,/*32652*/17817/* 10908 */, /*32653*/17818/* 10909 */,/*32654*/17819/* 1090A */,/*32655*/17820/* 1090B */,/*32656*/17821/* 1090C */, /*32657*/17822/* 1090D */,/*32658*/17823/* 1090E */,/*32659*/17824/* 1090F */,/*32660*/17825/* 10910 */, /*32661*/17826/* 10911 */,/*32662*/17827/* 10912 */,/*32663*/17828/* 10913 */,/*32664*/17829/* 10914 */, /*32665*/17830/* 10915 */,/*32666*/17831/* 10916 */,/*32667*/17832/* 10917 */,/*32668*/17833/* 10918 */, /*32669*/17834/* 10919 */,/*32670*/17835/* 1091A */,/*32671*/17836/* 1091B */,0,0,0,/*32675*/17837/* 1091F */, /*32676*/17838/* 10920 */,/*32677*/17839/* 10921 */,/*32678*/17840/* 10922 */,/*32679*/17841/* 10923 */, /*32680*/17842/* 10924 */,/*32681*/17843/* 10925 */,/*32682*/17844/* 10926 */,/*32683*/17845/* 10927 */, /*32684*/17846/* 10928 */,/*32685*/17847/* 10929 */,/*32686*/17848/* 1092A */,/*32687*/17849/* 1092B */, /*32688*/17850/* 1092C */,/*32689*/17851/* 1092D */,/*32690*/17852/* 1092E */,/*32691*/17853/* 1092F */, /*32692*/17854/* 10930 */,/*32693*/17855/* 10931 */,/*32694*/17856/* 10932 */,/*32695*/17857/* 10933 */, /*32696*/17858/* 10934 */,/*32697*/17859/* 10935 */,/*32698*/17860/* 10936 */,/*32699*/17861/* 10937 */, /*32700*/17862/* 10938 */,/*32701*/17863/* 10939 */,0,0,0,0,0,/*32707*/17864/* 1093F */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*32772*/17865/* 10980 */,/*32773*/17866/* 10981 */,/*32774*/17867/* 10982 */,/*32775*/17868/* 10983 */, /*32776*/17869/* 10984 */,/*32777*/17870/* 10985 */,/*32778*/17871/* 10986 */,/*32779*/17872/* 10987 */, /*32780*/17873/* 10988 */,/*32781*/17874/* 10989 */,/*32782*/17875/* 1098A */,/*32783*/17876/* 1098B */, /*32784*/17877/* 1098C */,/*32785*/17878/* 1098D */,/*32786*/17879/* 1098E */,/*32787*/17880/* 1098F */, /*32788*/17881/* 10990 */,/*32789*/17882/* 10991 */,/*32790*/17883/* 10992 */,/*32791*/17884/* 10993 */, /*32792*/17885/* 10994 */,/*32793*/17886/* 10995 */,/*32794*/17887/* 10996 */,/*32795*/17888/* 10997 */, /*32796*/17889/* 10998 */,/*32797*/17890/* 10999 */,/*32798*/17891/* 1099A */,/*32799*/17892/* 1099B */, /*32800*/17893/* 1099C */,/*32801*/17894/* 1099D */,/*32802*/17895/* 1099E */,/*32803*/17896/* 1099F */, /*32804*/17897/* 109A0 */,/*32805*/17898/* 109A1 */,/*32806*/17899/* 109A2 */,/*32807*/17900/* 109A3 */, /*32808*/17901/* 109A4 */,/*32809*/17902/* 109A5 */,/*32810*/17903/* 109A6 */,/*32811*/17904/* 109A7 */, /*32812*/17905/* 109A8 */,/*32813*/17906/* 109A9 */,/*32814*/17907/* 109AA */,/*32815*/17908/* 109AB */, /*32816*/17909/* 109AC */,/*32817*/17910/* 109AD */,/*32818*/17911/* 109AE */,/*32819*/17912/* 109AF */, /*32820*/17913/* 109B0 */,/*32821*/17914/* 109B1 */,/*32822*/17915/* 109B2 */,/*32823*/17916/* 109B3 */, /*32824*/17917/* 109B4 */,/*32825*/17918/* 109B5 */,/*32826*/17919/* 109B6 */,/*32827*/17920/* 109B7 */,0,0,0,0, /*32832*/17921/* 109BC */,/*32833*/17922/* 109BD */,/*32834*/17923/* 109BE */,/*32835*/17924/* 109BF */, /*32836*/17925/* 109C0 */,/*32837*/17926/* 109C1 */,/*32838*/17927/* 109C2 */,/*32839*/17928/* 109C3 */, /*32840*/17929/* 109C4 */,/*32841*/17930/* 109C5 */,/*32842*/17931/* 109C6 */,/*32843*/17932/* 109C7 */, /*32844*/17933/* 109C8 */,/*32845*/17934/* 109C9 */,/*32846*/17935/* 109CA */,/*32847*/17936/* 109CB */, /*32848*/17937/* 109CC */,/*32849*/17938/* 109CD */,/*32850*/17939/* 109CE */,/*32851*/17940/* 109CF */,0,0, /*32854*/17941/* 109D2 */,/*32855*/17942/* 109D3 */,/*32856*/17943/* 109D4 */,/*32857*/17944/* 109D5 */, /*32858*/17945/* 109D6 */,/*32859*/17946/* 109D7 */,/*32860*/17947/* 109D8 */,/*32861*/17948/* 109D9 */, /*32862*/17949/* 109DA */,/*32863*/17950/* 109DB */,/*32864*/17951/* 109DC */,/*32865*/17952/* 109DD */, /*32866*/17953/* 109DE */,/*32867*/17954/* 109DF */,/*32868*/17955/* 109E0 */,/*32869*/17956/* 109E1 */, /*32870*/17957/* 109E2 */,/*32871*/17958/* 109E3 */,/*32872*/17959/* 109E4 */,/*32873*/17960/* 109E5 */, /*32874*/17961/* 109E6 */,/*32875*/17962/* 109E7 */,/*32876*/17963/* 109E8 */,/*32877*/17964/* 109E9 */, /*32878*/17965/* 109EA */,/*32879*/17966/* 109EB */,/*32880*/17967/* 109EC */,/*32881*/17968/* 109ED */, /*32882*/17969/* 109EE */,/*32883*/17970/* 109EF */,/*32884*/17971/* 109F0 */,/*32885*/17972/* 109F1 */, /*32886*/17973/* 109F2 */,/*32887*/17974/* 109F3 */,/*32888*/17975/* 109F4 */,/*32889*/17976/* 109F5 */, /*32890*/17977/* 109F6 */,/*32891*/17978/* 109F7 */,/*32892*/17979/* 109F8 */,/*32893*/17980/* 109F9 */, /*32894*/17981/* 109FA */,/*32895*/17982/* 109FB */,/*32896*/17983/* 109FC */,/*32897*/17984/* 109FD */, /*32898*/17985/* 109FE */,/*32899*/17986/* 109FF */,/*32900*/17987/* 10A00 */,/*32901*/17988/* 10A01 */, /*32902*/17989/* 10A02 */,/*32903*/17990/* 10A03 */,0,/*32905*/17991/* 10A05 */,/*32906*/17992/* 10A06 */,0,0,0,0,0, /*32912*/17993/* 10A0C */,/*32913*/17994/* 10A0D */,/*32914*/17995/* 10A0E */,/*32915*/17996/* 10A0F */, /*32916*/17997/* 10A10 */,/*32917*/17998/* 10A11 */,/*32918*/17999/* 10A12 */,/*32919*/18000/* 10A13 */,0, /*32921*/18001/* 10A15 */,/*32922*/18002/* 10A16 */,/*32923*/18003/* 10A17 */,0,/*32925*/18004/* 10A19 */, /*32926*/18005/* 10A1A */,/*32927*/18006/* 10A1B */,/*32928*/18007/* 10A1C */,/*32929*/18008/* 10A1D */, /*32930*/18009/* 10A1E */,/*32931*/18010/* 10A1F */,/*32932*/18011/* 10A20 */,/*32933*/18012/* 10A21 */, /*32934*/18013/* 10A22 */,/*32935*/18014/* 10A23 */,/*32936*/18015/* 10A24 */,/*32937*/18016/* 10A25 */, /*32938*/18017/* 10A26 */,/*32939*/18018/* 10A27 */,/*32940*/18019/* 10A28 */,/*32941*/18020/* 10A29 */, /*32942*/18021/* 10A2A */,/*32943*/18022/* 10A2B */,/*32944*/18023/* 10A2C */,/*32945*/18024/* 10A2D */, /*32946*/18025/* 10A2E */,/*32947*/18026/* 10A2F */,/*32948*/18027/* 10A30 */,/*32949*/18028/* 10A31 */, /*32950*/18029/* 10A32 */,/*32951*/18030/* 10A33 */,0,0,0,0,/*32956*/18031/* 10A38 */,/*32957*/18032/* 10A39 */, /*32958*/18033/* 10A3A */,0,0,0,0,/*32963*/18034/* 10A3F */,/*32964*/18035/* 10A40 */,/*32965*/18036/* 10A41 */, /*32966*/18037/* 10A42 */,/*32967*/18038/* 10A43 */,/*32968*/18039/* 10A44 */,/*32969*/18040/* 10A45 */, /*32970*/18041/* 10A46 */,/*32971*/18042/* 10A47 */,0,0,0,0,0,0,0,0,/*32980*/18043/* 10A50 */,/*32981*/18044/* 10A51 */, /*32982*/18045/* 10A52 */,/*32983*/18046/* 10A53 */,/*32984*/18047/* 10A54 */,/*32985*/18048/* 10A55 */, /*32986*/18049/* 10A56 */,/*32987*/18050/* 10A57 */,/*32988*/18051/* 10A58 */,0,0,0,0,0,0,0,/*32996*/18052/* 10A60 */, /*32997*/18053/* 10A61 */,/*32998*/18054/* 10A62 */,/*32999*/18055/* 10A63 */,/*33000*/18056/* 10A64 */, /*33001*/18057/* 10A65 */,/*33002*/18058/* 10A66 */,/*33003*/18059/* 10A67 */,/*33004*/18060/* 10A68 */, /*33005*/18061/* 10A69 */,/*33006*/18062/* 10A6A */,/*33007*/18063/* 10A6B */,/*33008*/18064/* 10A6C */, /*33009*/18065/* 10A6D */,/*33010*/18066/* 10A6E */,/*33011*/18067/* 10A6F */,/*33012*/18068/* 10A70 */, /*33013*/18069/* 10A71 */,/*33014*/18070/* 10A72 */,/*33015*/18071/* 10A73 */,/*33016*/18072/* 10A74 */, /*33017*/18073/* 10A75 */,/*33018*/18074/* 10A76 */,/*33019*/18075/* 10A77 */,/*33020*/18076/* 10A78 */, /*33021*/18077/* 10A79 */,/*33022*/18078/* 10A7A */,/*33023*/18079/* 10A7B */,/*33024*/18080/* 10A7C */, /*33025*/18081/* 10A7D */,/*33026*/18082/* 10A7E */,/*33027*/18083/* 10A7F */,/*33028*/18084/* 10A80 */, /*33029*/18085/* 10A81 */,/*33030*/18086/* 10A82 */,/*33031*/18087/* 10A83 */,/*33032*/18088/* 10A84 */, /*33033*/18089/* 10A85 */,/*33034*/18090/* 10A86 */,/*33035*/18091/* 10A87 */,/*33036*/18092/* 10A88 */, /*33037*/18093/* 10A89 */,/*33038*/18094/* 10A8A */,/*33039*/18095/* 10A8B */,/*33040*/18096/* 10A8C */, /*33041*/18097/* 10A8D */,/*33042*/18098/* 10A8E */,/*33043*/18099/* 10A8F */,/*33044*/18100/* 10A90 */, /*33045*/18101/* 10A91 */,/*33046*/18102/* 10A92 */,/*33047*/18103/* 10A93 */,/*33048*/18104/* 10A94 */, /*33049*/18105/* 10A95 */,/*33050*/18106/* 10A96 */,/*33051*/18107/* 10A97 */,/*33052*/18108/* 10A98 */, /*33053*/18109/* 10A99 */,/*33054*/18110/* 10A9A */,/*33055*/18111/* 10A9B */,/*33056*/18112/* 10A9C */, /*33057*/18113/* 10A9D */,/*33058*/18114/* 10A9E */,/*33059*/18115/* 10A9F */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,/*33092*/18116/* 10AC0 */,/*33093*/18117/* 10AC1 */,/*33094*/18118/* 10AC2 */, /*33095*/18119/* 10AC3 */,/*33096*/18120/* 10AC4 */,/*33097*/18121/* 10AC5 */,/*33098*/18122/* 10AC6 */, /*33099*/18123/* 10AC7 */,/*33100*/18124/* 10AC8 */,/*33101*/18125/* 10AC9 */,/*33102*/18126/* 10ACA */, /*33103*/18127/* 10ACB */,/*33104*/18128/* 10ACC */,/*33105*/18129/* 10ACD */,/*33106*/18130/* 10ACE */, /*33107*/18131/* 10ACF */,/*33108*/18132/* 10AD0 */,/*33109*/18133/* 10AD1 */,/*33110*/18134/* 10AD2 */, /*33111*/18135/* 10AD3 */,/*33112*/18136/* 10AD4 */,/*33113*/18137/* 10AD5 */,/*33114*/18138/* 10AD6 */, /*33115*/18139/* 10AD7 */,/*33116*/18140/* 10AD8 */,/*33117*/18141/* 10AD9 */,/*33118*/18142/* 10ADA */, /*33119*/18143/* 10ADB */,/*33120*/18144/* 10ADC */,/*33121*/18145/* 10ADD */,/*33122*/18146/* 10ADE */, /*33123*/18147/* 10ADF */,/*33124*/18148/* 10AE0 */,/*33125*/18149/* 10AE1 */,/*33126*/18150/* 10AE2 */, /*33127*/18151/* 10AE3 */,/*33128*/18152/* 10AE4 */,/*33129*/18153/* 10AE5 */,/*33130*/18154/* 10AE6 */,0,0,0,0, /*33135*/18155/* 10AEB */,/*33136*/18156/* 10AEC */,/*33137*/18157/* 10AED */,/*33138*/18158/* 10AEE */, /*33139*/18159/* 10AEF */,/*33140*/18160/* 10AF0 */,/*33141*/18161/* 10AF1 */,/*33142*/18162/* 10AF2 */, /*33143*/18163/* 10AF3 */,/*33144*/18164/* 10AF4 */,/*33145*/18165/* 10AF5 */,/*33146*/18166/* 10AF6 */,0,0,0,0,0,0,0,0, 0,/*33156*/18167/* 10B00 */,/*33157*/18168/* 10B01 */,/*33158*/18169/* 10B02 */,/*33159*/18170/* 10B03 */, /*33160*/18171/* 10B04 */,/*33161*/18172/* 10B05 */,/*33162*/18173/* 10B06 */,/*33163*/18174/* 10B07 */, /*33164*/18175/* 10B08 */,/*33165*/18176/* 10B09 */,/*33166*/18177/* 10B0A */,/*33167*/18178/* 10B0B */, /*33168*/18179/* 10B0C */,/*33169*/18180/* 10B0D */,/*33170*/18181/* 10B0E */,/*33171*/18182/* 10B0F */, /*33172*/18183/* 10B10 */,/*33173*/18184/* 10B11 */,/*33174*/18185/* 10B12 */,/*33175*/18186/* 10B13 */, /*33176*/18187/* 10B14 */,/*33177*/18188/* 10B15 */,/*33178*/18189/* 10B16 */,/*33179*/18190/* 10B17 */, /*33180*/18191/* 10B18 */,/*33181*/18192/* 10B19 */,/*33182*/18193/* 10B1A */,/*33183*/18194/* 10B1B */, /*33184*/18195/* 10B1C */,/*33185*/18196/* 10B1D */,/*33186*/18197/* 10B1E */,/*33187*/18198/* 10B1F */, /*33188*/18199/* 10B20 */,/*33189*/18200/* 10B21 */,/*33190*/18201/* 10B22 */,/*33191*/18202/* 10B23 */, /*33192*/18203/* 10B24 */,/*33193*/18204/* 10B25 */,/*33194*/18205/* 10B26 */,/*33195*/18206/* 10B27 */, /*33196*/18207/* 10B28 */,/*33197*/18208/* 10B29 */,/*33198*/18209/* 10B2A */,/*33199*/18210/* 10B2B */, /*33200*/18211/* 10B2C */,/*33201*/18212/* 10B2D */,/*33202*/18213/* 10B2E */,/*33203*/18214/* 10B2F */, /*33204*/18215/* 10B30 */,/*33205*/18216/* 10B31 */,/*33206*/18217/* 10B32 */,/*33207*/18218/* 10B33 */, /*33208*/18219/* 10B34 */,/*33209*/18220/* 10B35 */,0,0,0,/*33213*/18221/* 10B39 */,/*33214*/18222/* 10B3A */, /*33215*/18223/* 10B3B */,/*33216*/18224/* 10B3C */,/*33217*/18225/* 10B3D */,/*33218*/18226/* 10B3E */, /*33219*/18227/* 10B3F */,/*33220*/18228/* 10B40 */,/*33221*/18229/* 10B41 */,/*33222*/18230/* 10B42 */, /*33223*/18231/* 10B43 */,/*33224*/18232/* 10B44 */,/*33225*/18233/* 10B45 */,/*33226*/18234/* 10B46 */, /*33227*/18235/* 10B47 */,/*33228*/18236/* 10B48 */,/*33229*/18237/* 10B49 */,/*33230*/18238/* 10B4A */, /*33231*/18239/* 10B4B */,/*33232*/18240/* 10B4C */,/*33233*/18241/* 10B4D */,/*33234*/18242/* 10B4E */, /*33235*/18243/* 10B4F */,/*33236*/18244/* 10B50 */,/*33237*/18245/* 10B51 */,/*33238*/18246/* 10B52 */, /*33239*/18247/* 10B53 */,/*33240*/18248/* 10B54 */,/*33241*/18249/* 10B55 */,0,0,/*33244*/18250/* 10B58 */, /*33245*/18251/* 10B59 */,/*33246*/18252/* 10B5A */,/*33247*/18253/* 10B5B */,/*33248*/18254/* 10B5C */, /*33249*/18255/* 10B5D */,/*33250*/18256/* 10B5E */,/*33251*/18257/* 10B5F */,/*33252*/18258/* 10B60 */, /*33253*/18259/* 10B61 */,/*33254*/18260/* 10B62 */,/*33255*/18261/* 10B63 */,/*33256*/18262/* 10B64 */, /*33257*/18263/* 10B65 */,/*33258*/18264/* 10B66 */,/*33259*/18265/* 10B67 */,/*33260*/18266/* 10B68 */, /*33261*/18267/* 10B69 */,/*33262*/18268/* 10B6A */,/*33263*/18269/* 10B6B */,/*33264*/18270/* 10B6C */, /*33265*/18271/* 10B6D */,/*33266*/18272/* 10B6E */,/*33267*/18273/* 10B6F */,/*33268*/18274/* 10B70 */, /*33269*/18275/* 10B71 */,/*33270*/18276/* 10B72 */,0,0,0,0,0,/*33276*/18277/* 10B78 */,/*33277*/18278/* 10B79 */, /*33278*/18279/* 10B7A */,/*33279*/18280/* 10B7B */,/*33280*/18281/* 10B7C */,/*33281*/18282/* 10B7D */, /*33282*/18283/* 10B7E */,/*33283*/18284/* 10B7F */,/*33284*/18285/* 10B80 */,/*33285*/18286/* 10B81 */, /*33286*/18287/* 10B82 */,/*33287*/18288/* 10B83 */,/*33288*/18289/* 10B84 */,/*33289*/18290/* 10B85 */, /*33290*/18291/* 10B86 */,/*33291*/18292/* 10B87 */,/*33292*/18293/* 10B88 */,/*33293*/18294/* 10B89 */, /*33294*/18295/* 10B8A */,/*33295*/18296/* 10B8B */,/*33296*/18297/* 10B8C */,/*33297*/18298/* 10B8D */, /*33298*/18299/* 10B8E */,/*33299*/18300/* 10B8F */,/*33300*/18301/* 10B90 */,/*33301*/18302/* 10B91 */,0,0,0,0,0,0,0, /*33309*/18303/* 10B99 */,/*33310*/18304/* 10B9A */,/*33311*/18305/* 10B9B */,/*33312*/18306/* 10B9C */,0,0,0,0,0,0,0,0, 0,0,0,0,/*33325*/18307/* 10BA9 */,/*33326*/18308/* 10BAA */,/*33327*/18309/* 10BAB */,/*33328*/18310/* 10BAC */, /*33329*/18311/* 10BAD */,/*33330*/18312/* 10BAE */,/*33331*/18313/* 10BAF */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*33412*/18314/* 10C00 */,/*33413*/18315/* 10C01 */,/*33414*/18316/* 10C02 */,/*33415*/18317/* 10C03 */, /*33416*/18318/* 10C04 */,/*33417*/18319/* 10C05 */,/*33418*/18320/* 10C06 */,/*33419*/18321/* 10C07 */, /*33420*/18322/* 10C08 */,/*33421*/18323/* 10C09 */,/*33422*/18324/* 10C0A */,/*33423*/18325/* 10C0B */, /*33424*/18326/* 10C0C */,/*33425*/18327/* 10C0D */,/*33426*/18328/* 10C0E */,/*33427*/18329/* 10C0F */, /*33428*/18330/* 10C10 */,/*33429*/18331/* 10C11 */,/*33430*/18332/* 10C12 */,/*33431*/18333/* 10C13 */, /*33432*/18334/* 10C14 */,/*33433*/18335/* 10C15 */,/*33434*/18336/* 10C16 */,/*33435*/18337/* 10C17 */, /*33436*/18338/* 10C18 */,/*33437*/18339/* 10C19 */,/*33438*/18340/* 10C1A */,/*33439*/18341/* 10C1B */, /*33440*/18342/* 10C1C */,/*33441*/18343/* 10C1D */,/*33442*/18344/* 10C1E */,/*33443*/18345/* 10C1F */, /*33444*/18346/* 10C20 */,/*33445*/18347/* 10C21 */,/*33446*/18348/* 10C22 */,/*33447*/18349/* 10C23 */, /*33448*/18350/* 10C24 */,/*33449*/18351/* 10C25 */,/*33450*/18352/* 10C26 */,/*33451*/18353/* 10C27 */, /*33452*/18354/* 10C28 */,/*33453*/18355/* 10C29 */,/*33454*/18356/* 10C2A */,/*33455*/18357/* 10C2B */, /*33456*/18358/* 10C2C */,/*33457*/18359/* 10C2D */,/*33458*/18360/* 10C2E */,/*33459*/18361/* 10C2F */, /*33460*/18362/* 10C30 */,/*33461*/18363/* 10C31 */,/*33462*/18364/* 10C32 */,/*33463*/18365/* 10C33 */, /*33464*/18366/* 10C34 */,/*33465*/18367/* 10C35 */,/*33466*/18368/* 10C36 */,/*33467*/18369/* 10C37 */, /*33468*/18370/* 10C38 */,/*33469*/18371/* 10C39 */,/*33470*/18372/* 10C3A */,/*33471*/18373/* 10C3B */, /*33472*/18374/* 10C3C */,/*33473*/18375/* 10C3D */,/*33474*/18376/* 10C3E */,/*33475*/18377/* 10C3F */, /*33476*/18378/* 10C40 */,/*33477*/18379/* 10C41 */,/*33478*/18380/* 10C42 */,/*33479*/18381/* 10C43 */, /*33480*/18382/* 10C44 */,/*33481*/18383/* 10C45 */,/*33482*/18384/* 10C46 */,/*33483*/18385/* 10C47 */, /*33484*/18386/* 10C48 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,/*33540*/18387/* 10C80 */,/*33541*/18388/* 10C81 */,/*33542*/18389/* 10C82 */,/*33543*/18390/* 10C83 */, /*33544*/18391/* 10C84 */,/*33545*/18392/* 10C85 */,/*33546*/18393/* 10C86 */,/*33547*/18394/* 10C87 */, /*33548*/18395/* 10C88 */,/*33549*/18396/* 10C89 */,/*33550*/18397/* 10C8A */,/*33551*/18398/* 10C8B */, /*33552*/18399/* 10C8C */,/*33553*/18400/* 10C8D */,/*33554*/18401/* 10C8E */,/*33555*/18402/* 10C8F */, /*33556*/18403/* 10C90 */,/*33557*/18404/* 10C91 */,/*33558*/18405/* 10C92 */,/*33559*/18406/* 10C93 */, /*33560*/18407/* 10C94 */,/*33561*/18408/* 10C95 */,/*33562*/18409/* 10C96 */,/*33563*/18410/* 10C97 */, /*33564*/18411/* 10C98 */,/*33565*/18412/* 10C99 */,/*33566*/18413/* 10C9A */,/*33567*/18414/* 10C9B */, /*33568*/18415/* 10C9C */,/*33569*/18416/* 10C9D */,/*33570*/18417/* 10C9E */,/*33571*/18418/* 10C9F */, /*33572*/18419/* 10CA0 */,/*33573*/18420/* 10CA1 */,/*33574*/18421/* 10CA2 */,/*33575*/18422/* 10CA3 */, /*33576*/18423/* 10CA4 */,/*33577*/18424/* 10CA5 */,/*33578*/18425/* 10CA6 */,/*33579*/18426/* 10CA7 */, /*33580*/18427/* 10CA8 */,/*33581*/18428/* 10CA9 */,/*33582*/18429/* 10CAA */,/*33583*/18430/* 10CAB */, /*33584*/18431/* 10CAC */,/*33585*/18432/* 10CAD */,/*33586*/18433/* 10CAE */,/*33587*/18434/* 10CAF */, /*33588*/18435/* 10CB0 */,/*33589*/18436/* 10CB1 */,/*33590*/18437/* 10CB2 */,0,0,0,0,0,0,0,0,0,0,0,0,0, /*33604*/18438/* 10CC0 */,/*33605*/18439/* 10CC1 */,/*33606*/18440/* 10CC2 */,/*33607*/18441/* 10CC3 */, /*33608*/18442/* 10CC4 */,/*33609*/18443/* 10CC5 */,/*33610*/18444/* 10CC6 */,/*33611*/18445/* 10CC7 */, /*33612*/18446/* 10CC8 */,/*33613*/18447/* 10CC9 */,/*33614*/18448/* 10CCA */,/*33615*/18449/* 10CCB */, /*33616*/18450/* 10CCC */,/*33617*/18451/* 10CCD */,/*33618*/18452/* 10CCE */,/*33619*/18453/* 10CCF */, /*33620*/18454/* 10CD0 */,/*33621*/18455/* 10CD1 */,/*33622*/18456/* 10CD2 */,/*33623*/18457/* 10CD3 */, /*33624*/18458/* 10CD4 */,/*33625*/18459/* 10CD5 */,/*33626*/18460/* 10CD6 */,/*33627*/18461/* 10CD7 */, /*33628*/18462/* 10CD8 */,/*33629*/18463/* 10CD9 */,/*33630*/18464/* 10CDA */,/*33631*/18465/* 10CDB */, /*33632*/18466/* 10CDC */,/*33633*/18467/* 10CDD */,/*33634*/18468/* 10CDE */,/*33635*/18469/* 10CDF */, /*33636*/18470/* 10CE0 */,/*33637*/18471/* 10CE1 */,/*33638*/18472/* 10CE2 */,/*33639*/18473/* 10CE3 */, /*33640*/18474/* 10CE4 */,/*33641*/18475/* 10CE5 */,/*33642*/18476/* 10CE6 */,/*33643*/18477/* 10CE7 */, /*33644*/18478/* 10CE8 */,/*33645*/18479/* 10CE9 */,/*33646*/18480/* 10CEA */,/*33647*/18481/* 10CEB */, /*33648*/18482/* 10CEC */,/*33649*/18483/* 10CED */,/*33650*/18484/* 10CEE */,/*33651*/18485/* 10CEF */, /*33652*/18486/* 10CF0 */,/*33653*/18487/* 10CF1 */,/*33654*/18488/* 10CF2 */,0,0,0,0,0,0,0,/*33662*/18489/* 10CFA */, /*33663*/18490/* 10CFB */,/*33664*/18491/* 10CFC */,/*33665*/18492/* 10CFD */,/*33666*/18493/* 10CFE */, /*33667*/18494/* 10CFF */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,/*34020*/18495/* 10E60 */,/*34021*/18496/* 10E61 */,/*34022*/18497/* 10E62 */,/*34023*/18498/* 10E63 */, /*34024*/18499/* 10E64 */,/*34025*/18500/* 10E65 */,/*34026*/18501/* 10E66 */,/*34027*/18502/* 10E67 */, /*34028*/18503/* 10E68 */,/*34029*/18504/* 10E69 */,/*34030*/18505/* 10E6A */,/*34031*/18506/* 10E6B */, /*34032*/18507/* 10E6C */,/*34033*/18508/* 10E6D */,/*34034*/18509/* 10E6E */,/*34035*/18510/* 10E6F */, /*34036*/18511/* 10E70 */,/*34037*/18512/* 10E71 */,/*34038*/18513/* 10E72 */,/*34039*/18514/* 10E73 */, /*34040*/18515/* 10E74 */,/*34041*/18516/* 10E75 */,/*34042*/18517/* 10E76 */,/*34043*/18518/* 10E77 */, /*34044*/18519/* 10E78 */,/*34045*/18520/* 10E79 */,/*34046*/18521/* 10E7A */,/*34047*/18522/* 10E7B */, /*34048*/18523/* 10E7C */,/*34049*/18524/* 10E7D */,/*34050*/18525/* 10E7E */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,/*34436*/18526/* 11000 */,/*34437*/18527/* 11001 */,/*34438*/18528/* 11002 */,/*34439*/18529/* 11003 */, /*34440*/18530/* 11004 */,/*34441*/18531/* 11005 */,/*34442*/18532/* 11006 */,/*34443*/18533/* 11007 */, /*34444*/18534/* 11008 */,/*34445*/18535/* 11009 */,/*34446*/18536/* 1100A */,/*34447*/18537/* 1100B */, /*34448*/18538/* 1100C */,/*34449*/18539/* 1100D */,/*34450*/18540/* 1100E */,/*34451*/18541/* 1100F */, /*34452*/18542/* 11010 */,/*34453*/18543/* 11011 */,/*34454*/18544/* 11012 */,/*34455*/18545/* 11013 */, /*34456*/18546/* 11014 */,/*34457*/18547/* 11015 */,/*34458*/18548/* 11016 */,/*34459*/18549/* 11017 */, /*34460*/18550/* 11018 */,/*34461*/18551/* 11019 */,/*34462*/18552/* 1101A */,/*34463*/18553/* 1101B */, /*34464*/18554/* 1101C */,/*34465*/18555/* 1101D */,/*34466*/18556/* 1101E */,/*34467*/18557/* 1101F */, /*34468*/18558/* 11020 */,/*34469*/18559/* 11021 */,/*34470*/18560/* 11022 */,/*34471*/18561/* 11023 */, /*34472*/18562/* 11024 */,/*34473*/18563/* 11025 */,/*34474*/18564/* 11026 */,/*34475*/18565/* 11027 */, /*34476*/18566/* 11028 */,/*34477*/18567/* 11029 */,/*34478*/18568/* 1102A */,/*34479*/18569/* 1102B */, /*34480*/18570/* 1102C */,/*34481*/18571/* 1102D */,/*34482*/18572/* 1102E */,/*34483*/18573/* 1102F */, /*34484*/18574/* 11030 */,/*34485*/18575/* 11031 */,/*34486*/18576/* 11032 */,/*34487*/18577/* 11033 */, /*34488*/18578/* 11034 */,/*34489*/18579/* 11035 */,/*34490*/18580/* 11036 */,/*34491*/18581/* 11037 */, /*34492*/18582/* 11038 */,/*34493*/18583/* 11039 */,/*34494*/18584/* 1103A */,/*34495*/18585/* 1103B */, /*34496*/18586/* 1103C */,/*34497*/18587/* 1103D */,/*34498*/18588/* 1103E */,/*34499*/18589/* 1103F */, /*34500*/18590/* 11040 */,/*34501*/18591/* 11041 */,/*34502*/18592/* 11042 */,/*34503*/18593/* 11043 */, /*34504*/18594/* 11044 */,/*34505*/18595/* 11045 */,/*34506*/18596/* 11046 */,/*34507*/18597/* 11047 */, /*34508*/18598/* 11048 */,/*34509*/18599/* 11049 */,/*34510*/18600/* 1104A */,/*34511*/18601/* 1104B */, /*34512*/18602/* 1104C */,/*34513*/18603/* 1104D */,0,0,0,0,/*34518*/18604/* 11052 */,/*34519*/18605/* 11053 */, /*34520*/18606/* 11054 */,/*34521*/18607/* 11055 */,/*34522*/18608/* 11056 */,/*34523*/18609/* 11057 */, /*34524*/18610/* 11058 */,/*34525*/18611/* 11059 */,/*34526*/18612/* 1105A */,/*34527*/18613/* 1105B */, /*34528*/18614/* 1105C */,/*34529*/18615/* 1105D */,/*34530*/18616/* 1105E */,/*34531*/18617/* 1105F */, /*34532*/18618/* 11060 */,/*34533*/18619/* 11061 */,/*34534*/18620/* 11062 */,/*34535*/18621/* 11063 */, /*34536*/18622/* 11064 */,/*34537*/18623/* 11065 */,/*34538*/18624/* 11066 */,/*34539*/18625/* 11067 */, /*34540*/18626/* 11068 */,/*34541*/18627/* 11069 */,/*34542*/18628/* 1106A */,/*34543*/18629/* 1106B */, /*34544*/18630/* 1106C */,/*34545*/18631/* 1106D */,/*34546*/18632/* 1106E */,/*34547*/18633/* 1106F */,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,/*34563*/18634/* 1107F */,/*34564*/18635/* 11080 */,/*34565*/18636/* 11081 */,/*34566*/18637/* 11082 */, /*34567*/18638/* 11083 */,/*34568*/18639/* 11084 */,/*34569*/18640/* 11085 */,/*34570*/18641/* 11086 */, /*34571*/18642/* 11087 */,/*34572*/18643/* 11088 */,/*34573*/18644/* 11089 */,/*34574*/18645/* 1108A */, /*34575*/18646/* 1108B */,/*34576*/18647/* 1108C */,/*34577*/18648/* 1108D */,/*34578*/18649/* 1108E */, /*34579*/18650/* 1108F */,/*34580*/18651/* 11090 */,/*34581*/18652/* 11091 */,/*34582*/18653/* 11092 */, /*34583*/18654/* 11093 */,/*34584*/18655/* 11094 */,/*34585*/18656/* 11095 */,/*34586*/18657/* 11096 */, /*34587*/18658/* 11097 */,/*34588*/18659/* 11098 */,/*34589*/18660/* 11099 */,/*34590*/18661/* 1109A */, /*34591*/18662/* 1109B */,/*34592*/18663/* 1109C */,/*34593*/18664/* 1109D */,/*34594*/18665/* 1109E */, /*34595*/18666/* 1109F */,/*34596*/18667/* 110A0 */,/*34597*/18668/* 110A1 */,/*34598*/18669/* 110A2 */, /*34599*/18670/* 110A3 */,/*34600*/18671/* 110A4 */,/*34601*/18672/* 110A5 */,/*34602*/18673/* 110A6 */, /*34603*/18674/* 110A7 */,/*34604*/18675/* 110A8 */,/*34605*/18676/* 110A9 */,/*34606*/18677/* 110AA */, /*34607*/18678/* 110AB */,/*34608*/18679/* 110AC */,/*34609*/18680/* 110AD */,/*34610*/18681/* 110AE */, /*34611*/18682/* 110AF */,/*34612*/18683/* 110B0 */,/*34613*/18684/* 110B1 */,/*34614*/18685/* 110B2 */, /*34615*/18686/* 110B3 */,/*34616*/18687/* 110B4 */,/*34617*/18688/* 110B5 */,/*34618*/18689/* 110B6 */, /*34619*/18690/* 110B7 */,/*34620*/18691/* 110B8 */,/*34621*/18692/* 110B9 */,/*34622*/18693/* 110BA */, /*34623*/18694/* 110BB */,/*34624*/18695/* 110BC */,/*34625*/18696/* 110BD */,/*34626*/18697/* 110BE */, /*34627*/18698/* 110BF */,/*34628*/18699/* 110C0 */,/*34629*/18700/* 110C1 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*34644*/18701/* 110D0 */,/*34645*/18702/* 110D1 */,/*34646*/18703/* 110D2 */,/*34647*/18704/* 110D3 */, /*34648*/18705/* 110D4 */,/*34649*/18706/* 110D5 */,/*34650*/18707/* 110D6 */,/*34651*/18708/* 110D7 */, /*34652*/18709/* 110D8 */,/*34653*/18710/* 110D9 */,/*34654*/18711/* 110DA */,/*34655*/18712/* 110DB */, /*34656*/18713/* 110DC */,/*34657*/18714/* 110DD */,/*34658*/18715/* 110DE */,/*34659*/18716/* 110DF */, /*34660*/18717/* 110E0 */,/*34661*/18718/* 110E1 */,/*34662*/18719/* 110E2 */,/*34663*/18720/* 110E3 */, /*34664*/18721/* 110E4 */,/*34665*/18722/* 110E5 */,/*34666*/18723/* 110E6 */,/*34667*/18724/* 110E7 */, /*34668*/18725/* 110E8 */,0,0,0,0,0,0,0,/*34676*/18726/* 110F0 */,/*34677*/18727/* 110F1 */,/*34678*/18728/* 110F2 */, /*34679*/18729/* 110F3 */,/*34680*/18730/* 110F4 */,/*34681*/18731/* 110F5 */,/*34682*/18732/* 110F6 */, /*34683*/18733/* 110F7 */,/*34684*/18734/* 110F8 */,/*34685*/18735/* 110F9 */,0,0,0,0,0,0,/*34692*/18736/* 11100 */, /*34693*/18737/* 11101 */,/*34694*/18738/* 11102 */,/*34695*/18739/* 11103 */,/*34696*/18740/* 11104 */, /*34697*/18741/* 11105 */,/*34698*/18742/* 11106 */,/*34699*/18743/* 11107 */,/*34700*/18744/* 11108 */, /*34701*/18745/* 11109 */,/*34702*/18746/* 1110A */,/*34703*/18747/* 1110B */,/*34704*/18748/* 1110C */, /*34705*/18749/* 1110D */,/*34706*/18750/* 1110E */,/*34707*/18751/* 1110F */,/*34708*/18752/* 11110 */, /*34709*/18753/* 11111 */,/*34710*/18754/* 11112 */,/*34711*/18755/* 11113 */,/*34712*/18756/* 11114 */, /*34713*/18757/* 11115 */,/*34714*/18758/* 11116 */,/*34715*/18759/* 11117 */,/*34716*/18760/* 11118 */, /*34717*/18761/* 11119 */,/*34718*/18762/* 1111A */,/*34719*/18763/* 1111B */,/*34720*/18764/* 1111C */, /*34721*/18765/* 1111D */,/*34722*/18766/* 1111E */,/*34723*/18767/* 1111F */,/*34724*/18768/* 11120 */, /*34725*/18769/* 11121 */,/*34726*/18770/* 11122 */,/*34727*/18771/* 11123 */,/*34728*/18772/* 11124 */, /*34729*/18773/* 11125 */,/*34730*/18774/* 11126 */,/*34731*/18775/* 11127 */,/*34732*/18776/* 11128 */, /*34733*/18777/* 11129 */,/*34734*/18778/* 1112A */,/*34735*/18779/* 1112B */,/*34736*/18780/* 1112C */, /*34737*/18781/* 1112D */,/*34738*/18782/* 1112E */,/*34739*/18783/* 1112F */,/*34740*/18784/* 11130 */, /*34741*/18785/* 11131 */,/*34742*/18786/* 11132 */,/*34743*/18787/* 11133 */,/*34744*/18788/* 11134 */,0, /*34746*/18789/* 11136 */,/*34747*/18790/* 11137 */,/*34748*/18791/* 11138 */,/*34749*/18792/* 11139 */, /*34750*/18793/* 1113A */,/*34751*/18794/* 1113B */,/*34752*/18795/* 1113C */,/*34753*/18796/* 1113D */, /*34754*/18797/* 1113E */,/*34755*/18798/* 1113F */,/*34756*/18799/* 11140 */,/*34757*/18800/* 11141 */, /*34758*/18801/* 11142 */,/*34759*/18802/* 11143 */,0,0,0,0,0,0,0,0,0,0,0,0,/*34772*/18803/* 11150 */, /*34773*/18804/* 11151 */,/*34774*/18805/* 11152 */,/*34775*/18806/* 11153 */,/*34776*/18807/* 11154 */, /*34777*/18808/* 11155 */,/*34778*/18809/* 11156 */,/*34779*/18810/* 11157 */,/*34780*/18811/* 11158 */, /*34781*/18812/* 11159 */,/*34782*/18813/* 1115A */,/*34783*/18814/* 1115B */,/*34784*/18815/* 1115C */, /*34785*/18816/* 1115D */,/*34786*/18817/* 1115E */,/*34787*/18818/* 1115F */,/*34788*/18819/* 11160 */, /*34789*/18820/* 11161 */,/*34790*/18821/* 11162 */,/*34791*/18822/* 11163 */,/*34792*/18823/* 11164 */, /*34793*/18824/* 11165 */,/*34794*/18825/* 11166 */,/*34795*/18826/* 11167 */,/*34796*/18827/* 11168 */, /*34797*/18828/* 11169 */,/*34798*/18829/* 1116A */,/*34799*/18830/* 1116B */,/*34800*/18831/* 1116C */, /*34801*/18832/* 1116D */,/*34802*/18833/* 1116E */,/*34803*/18834/* 1116F */,/*34804*/18835/* 11170 */, /*34805*/18836/* 11171 */,/*34806*/18837/* 11172 */,/*34807*/18838/* 11173 */,/*34808*/18839/* 11174 */, /*34809*/18840/* 11175 */,/*34810*/18841/* 11176 */,0,0,0,0,0,0,0,0,0,/*34820*/18842/* 11180 */, /*34821*/18843/* 11181 */,/*34822*/18844/* 11182 */,/*34823*/18845/* 11183 */,/*34824*/18846/* 11184 */, /*34825*/18847/* 11185 */,/*34826*/18848/* 11186 */,/*34827*/18849/* 11187 */,/*34828*/18850/* 11188 */, /*34829*/18851/* 11189 */,/*34830*/18852/* 1118A */,/*34831*/18853/* 1118B */,/*34832*/18854/* 1118C */, /*34833*/18855/* 1118D */,/*34834*/18856/* 1118E */,/*34835*/18857/* 1118F */,/*34836*/18858/* 11190 */, /*34837*/18859/* 11191 */,/*34838*/18860/* 11192 */,/*34839*/18861/* 11193 */,/*34840*/18862/* 11194 */, /*34841*/18863/* 11195 */,/*34842*/18864/* 11196 */,/*34843*/18865/* 11197 */,/*34844*/18866/* 11198 */, /*34845*/18867/* 11199 */,/*34846*/18868/* 1119A */,/*34847*/18869/* 1119B */,/*34848*/18870/* 1119C */, /*34849*/18871/* 1119D */,/*34850*/18872/* 1119E */,/*34851*/18873/* 1119F */,/*34852*/18874/* 111A0 */, /*34853*/18875/* 111A1 */,/*34854*/18876/* 111A2 */,/*34855*/18877/* 111A3 */,/*34856*/18878/* 111A4 */, /*34857*/18879/* 111A5 */,/*34858*/18880/* 111A6 */,/*34859*/18881/* 111A7 */,/*34860*/18882/* 111A8 */, /*34861*/18883/* 111A9 */,/*34862*/18884/* 111AA */,/*34863*/18885/* 111AB */,/*34864*/18886/* 111AC */, /*34865*/18887/* 111AD */,/*34866*/18888/* 111AE */,/*34867*/18889/* 111AF */,/*34868*/18890/* 111B0 */, /*34869*/18891/* 111B1 */,/*34870*/18892/* 111B2 */,/*34871*/18893/* 111B3 */,/*34872*/18894/* 111B4 */, /*34873*/18895/* 111B5 */,/*34874*/18896/* 111B6 */,/*34875*/18897/* 111B7 */,/*34876*/18898/* 111B8 */, /*34877*/18899/* 111B9 */,/*34878*/18900/* 111BA */,/*34879*/18901/* 111BB */,/*34880*/18902/* 111BC */, /*34881*/18903/* 111BD */,/*34882*/18904/* 111BE */,/*34883*/18905/* 111BF */,/*34884*/18906/* 111C0 */, /*34885*/18907/* 111C1 */,/*34886*/18908/* 111C2 */,/*34887*/18909/* 111C3 */,/*34888*/18910/* 111C4 */, /*34889*/18911/* 111C5 */,/*34890*/18912/* 111C6 */,/*34891*/18913/* 111C7 */,/*34892*/18914/* 111C8 */, /*34893*/18915/* 111C9 */,/*34894*/18916/* 111CA */,/*34895*/18917/* 111CB */,/*34896*/18918/* 111CC */, /*34897*/18919/* 111CD */,0,0,/*34900*/18920/* 111D0 */,/*34901*/18921/* 111D1 */,/*34902*/18922/* 111D2 */, /*34903*/18923/* 111D3 */,/*34904*/18924/* 111D4 */,/*34905*/18925/* 111D5 */,/*34906*/18926/* 111D6 */, /*34907*/18927/* 111D7 */,/*34908*/18928/* 111D8 */,/*34909*/18929/* 111D9 */,/*34910*/18930/* 111DA */, /*34911*/18931/* 111DB */,/*34912*/18932/* 111DC */,/*34913*/18933/* 111DD */,/*34914*/18934/* 111DE */, /*34915*/18935/* 111DF */,0,/*34917*/18936/* 111E1 */,/*34918*/18937/* 111E2 */,/*34919*/18938/* 111E3 */, /*34920*/18939/* 111E4 */,/*34921*/18940/* 111E5 */,/*34922*/18941/* 111E6 */,/*34923*/18942/* 111E7 */, /*34924*/18943/* 111E8 */,/*34925*/18944/* 111E9 */,/*34926*/18945/* 111EA */,/*34927*/18946/* 111EB */, /*34928*/18947/* 111EC */,/*34929*/18948/* 111ED */,/*34930*/18949/* 111EE */,/*34931*/18950/* 111EF */, /*34932*/18951/* 111F0 */,/*34933*/18952/* 111F1 */,/*34934*/18953/* 111F2 */,/*34935*/18954/* 111F3 */, /*34936*/18955/* 111F4 */,0,0,0,0,0,0,0,0,0,0,0,/*34948*/18956/* 11200 */,/*34949*/18957/* 11201 */, /*34950*/18958/* 11202 */,/*34951*/18959/* 11203 */,/*34952*/18960/* 11204 */,/*34953*/18961/* 11205 */, /*34954*/18962/* 11206 */,/*34955*/18963/* 11207 */,/*34956*/18964/* 11208 */,/*34957*/18965/* 11209 */, /*34958*/18966/* 1120A */,/*34959*/18967/* 1120B */,/*34960*/18968/* 1120C */,/*34961*/18969/* 1120D */, /*34962*/18970/* 1120E */,/*34963*/18971/* 1120F */,/*34964*/18972/* 11210 */,/*34965*/18973/* 11211 */,0, /*34967*/18974/* 11213 */,/*34968*/18975/* 11214 */,/*34969*/18976/* 11215 */,/*34970*/18977/* 11216 */, /*34971*/18978/* 11217 */,/*34972*/18979/* 11218 */,/*34973*/18980/* 11219 */,/*34974*/18981/* 1121A */, /*34975*/18982/* 1121B */,/*34976*/18983/* 1121C */,/*34977*/18984/* 1121D */,/*34978*/18985/* 1121E */, /*34979*/18986/* 1121F */,/*34980*/18987/* 11220 */,/*34981*/18988/* 11221 */,/*34982*/18989/* 11222 */, /*34983*/18990/* 11223 */,/*34984*/18991/* 11224 */,/*34985*/18992/* 11225 */,/*34986*/18993/* 11226 */, /*34987*/18994/* 11227 */,/*34988*/18995/* 11228 */,/*34989*/18996/* 11229 */,/*34990*/18997/* 1122A */, /*34991*/18998/* 1122B */,/*34992*/18999/* 1122C */,/*34993*/19000/* 1122D */,/*34994*/19001/* 1122E */, /*34995*/19002/* 1122F */,/*34996*/19003/* 11230 */,/*34997*/19004/* 11231 */,/*34998*/19005/* 11232 */, /*34999*/19006/* 11233 */,/*35000*/19007/* 11234 */,/*35001*/19008/* 11235 */,/*35002*/19009/* 11236 */, /*35003*/19010/* 11237 */,/*35004*/19011/* 11238 */,/*35005*/19012/* 11239 */,/*35006*/19013/* 1123A */, /*35007*/19014/* 1123B */,/*35008*/19015/* 1123C */,/*35009*/19016/* 1123D */,/*35010*/19017/* 1123E */,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*35076*/19018/* 11280 */,/*35077*/19019/* 11281 */,/*35078*/19020/* 11282 */,/*35079*/19021/* 11283 */, /*35080*/19022/* 11284 */,/*35081*/19023/* 11285 */,/*35082*/19024/* 11286 */,0,/*35084*/19025/* 11288 */,0, /*35086*/19026/* 1128A */,/*35087*/19027/* 1128B */,/*35088*/19028/* 1128C */,/*35089*/19029/* 1128D */,0, /*35091*/19030/* 1128F */,/*35092*/19031/* 11290 */,/*35093*/19032/* 11291 */,/*35094*/19033/* 11292 */, /*35095*/19034/* 11293 */,/*35096*/19035/* 11294 */,/*35097*/19036/* 11295 */,/*35098*/19037/* 11296 */, /*35099*/19038/* 11297 */,/*35100*/19039/* 11298 */,/*35101*/19040/* 11299 */,/*35102*/19041/* 1129A */, /*35103*/19042/* 1129B */,/*35104*/19043/* 1129C */,/*35105*/19044/* 1129D */,0,/*35107*/19045/* 1129F */, /*35108*/19046/* 112A0 */,/*35109*/19047/* 112A1 */,/*35110*/19048/* 112A2 */,/*35111*/19049/* 112A3 */, /*35112*/19050/* 112A4 */,/*35113*/19051/* 112A5 */,/*35114*/19052/* 112A6 */,/*35115*/19053/* 112A7 */, /*35116*/19054/* 112A8 */,/*35117*/19055/* 112A9 */,0,0,0,0,0,0,/*35124*/19056/* 112B0 */,/*35125*/19057/* 112B1 */, /*35126*/19058/* 112B2 */,/*35127*/19059/* 112B3 */,/*35128*/19060/* 112B4 */,/*35129*/19061/* 112B5 */, /*35130*/19062/* 112B6 */,/*35131*/19063/* 112B7 */,/*35132*/19064/* 112B8 */,/*35133*/19065/* 112B9 */, /*35134*/19066/* 112BA */,/*35135*/19067/* 112BB */,/*35136*/19068/* 112BC */,/*35137*/19069/* 112BD */, /*35138*/19070/* 112BE */,/*35139*/19071/* 112BF */,/*35140*/19072/* 112C0 */,/*35141*/19073/* 112C1 */, /*35142*/19074/* 112C2 */,/*35143*/19075/* 112C3 */,/*35144*/19076/* 112C4 */,/*35145*/19077/* 112C5 */, /*35146*/19078/* 112C6 */,/*35147*/19079/* 112C7 */,/*35148*/19080/* 112C8 */,/*35149*/19081/* 112C9 */, /*35150*/19082/* 112CA */,/*35151*/19083/* 112CB */,/*35152*/19084/* 112CC */,/*35153*/19085/* 112CD */, /*35154*/19086/* 112CE */,/*35155*/19087/* 112CF */,/*35156*/19088/* 112D0 */,/*35157*/19089/* 112D1 */, /*35158*/19090/* 112D2 */,/*35159*/19091/* 112D3 */,/*35160*/19092/* 112D4 */,/*35161*/19093/* 112D5 */, /*35162*/19094/* 112D6 */,/*35163*/19095/* 112D7 */,/*35164*/19096/* 112D8 */,/*35165*/19097/* 112D9 */, /*35166*/19098/* 112DA */,/*35167*/19099/* 112DB */,/*35168*/19100/* 112DC */,/*35169*/19101/* 112DD */, /*35170*/19102/* 112DE */,/*35171*/19103/* 112DF */,/*35172*/19104/* 112E0 */,/*35173*/19105/* 112E1 */, /*35174*/19106/* 112E2 */,/*35175*/19107/* 112E3 */,/*35176*/19108/* 112E4 */,/*35177*/19109/* 112E5 */, /*35178*/19110/* 112E6 */,/*35179*/19111/* 112E7 */,/*35180*/19112/* 112E8 */,/*35181*/19113/* 112E9 */, /*35182*/19114/* 112EA */,0,0,0,0,0,/*35188*/19115/* 112F0 */,/*35189*/19116/* 112F1 */,/*35190*/19117/* 112F2 */, /*35191*/19118/* 112F3 */,/*35192*/19119/* 112F4 */,/*35193*/19120/* 112F5 */,/*35194*/19121/* 112F6 */, /*35195*/19122/* 112F7 */,/*35196*/19123/* 112F8 */,/*35197*/19124/* 112F9 */,0,0,0,0,0,0,/*35204*/19125/* 11300 */, /*35205*/19126/* 11301 */,/*35206*/19127/* 11302 */,/*35207*/19128/* 11303 */,0,/*35209*/19129/* 11305 */, /*35210*/19130/* 11306 */,/*35211*/19131/* 11307 */,/*35212*/19132/* 11308 */,/*35213*/19133/* 11309 */, /*35214*/19134/* 1130A */,/*35215*/19135/* 1130B */,/*35216*/19136/* 1130C */,0,0,/*35219*/19137/* 1130F */, /*35220*/19138/* 11310 */,0,0,/*35223*/19139/* 11313 */,/*35224*/19140/* 11314 */,/*35225*/19141/* 11315 */, /*35226*/19142/* 11316 */,/*35227*/19143/* 11317 */,/*35228*/19144/* 11318 */,/*35229*/19145/* 11319 */, /*35230*/19146/* 1131A */,/*35231*/19147/* 1131B */,/*35232*/19148/* 1131C */,/*35233*/19149/* 1131D */, /*35234*/19150/* 1131E */,/*35235*/19151/* 1131F */,/*35236*/19152/* 11320 */,/*35237*/19153/* 11321 */, /*35238*/19154/* 11322 */,/*35239*/19155/* 11323 */,/*35240*/19156/* 11324 */,/*35241*/19157/* 11325 */, /*35242*/19158/* 11326 */,/*35243*/19159/* 11327 */,/*35244*/19160/* 11328 */,0,/*35246*/19161/* 1132A */, /*35247*/19162/* 1132B */,/*35248*/19163/* 1132C */,/*35249*/19164/* 1132D */,/*35250*/19165/* 1132E */, /*35251*/19166/* 1132F */,/*35252*/19167/* 11330 */,0,/*35254*/19168/* 11332 */,/*35255*/19169/* 11333 */,0, /*35257*/19170/* 11335 */,/*35258*/19171/* 11336 */,/*35259*/19172/* 11337 */,/*35260*/19173/* 11338 */, /*35261*/19174/* 11339 */,0,0,/*35264*/19175/* 1133C */,/*35265*/19176/* 1133D */,/*35266*/19177/* 1133E */, /*35267*/19178/* 1133F */,/*35268*/19179/* 11340 */,/*35269*/19180/* 11341 */,/*35270*/19181/* 11342 */, /*35271*/19182/* 11343 */,/*35272*/19183/* 11344 */,0,0,/*35275*/19184/* 11347 */,/*35276*/19185/* 11348 */,0,0, /*35279*/19186/* 1134B */,/*35280*/19187/* 1134C */,/*35281*/19188/* 1134D */,0,0,/*35284*/19189/* 11350 */,0,0,0,0,0,0, /*35291*/19190/* 11357 */,0,0,0,0,0,/*35297*/19191/* 1135D */,/*35298*/19192/* 1135E */,/*35299*/19193/* 1135F */, /*35300*/19194/* 11360 */,/*35301*/19195/* 11361 */,/*35302*/19196/* 11362 */,/*35303*/19197/* 11363 */,0,0, /*35306*/19198/* 11366 */,/*35307*/19198/* 11367 */,/*35308*/19198/* 11368 */,/*35309*/19198/* 11369 */, /*35310*/19198/* 1136A */,/*35311*/19198/* 1136B */,/*35312*/19198/* 1136C */,0,0,0,/*35316*/19198/* 11370 */, /*35317*/19198/* 11371 */,/*35318*/19198/* 11372 */,/*35319*/19198/* 11373 */,/*35320*/19198/* 11374 */,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,/*35460*/19199/* 11400 */,/*35461*/19200/* 11401 */,/*35462*/19201/* 11402 */, /*35463*/19202/* 11403 */,/*35464*/19203/* 11404 */,/*35465*/19204/* 11405 */,/*35466*/19205/* 11406 */, /*35467*/19206/* 11407 */,/*35468*/19207/* 11408 */,/*35469*/19208/* 11409 */,/*35470*/19209/* 1140A */, /*35471*/19210/* 1140B */,/*35472*/19211/* 1140C */,/*35473*/19212/* 1140D */,/*35474*/19213/* 1140E */, /*35475*/19214/* 1140F */,/*35476*/19215/* 11410 */,/*35477*/19216/* 11411 */,/*35478*/19217/* 11412 */, /*35479*/19218/* 11413 */,/*35480*/19219/* 11414 */,/*35481*/19220/* 11415 */,/*35482*/19221/* 11416 */, /*35483*/19222/* 11417 */,/*35484*/19223/* 11418 */,/*35485*/19224/* 11419 */,/*35486*/19225/* 1141A */, /*35487*/19226/* 1141B */,/*35488*/19227/* 1141C */,/*35489*/19228/* 1141D */,/*35490*/19229/* 1141E */, /*35491*/19230/* 1141F */,/*35492*/19231/* 11420 */,/*35493*/19232/* 11421 */,/*35494*/19233/* 11422 */, /*35495*/19234/* 11423 */,/*35496*/19235/* 11424 */,/*35497*/19236/* 11425 */,/*35498*/19237/* 11426 */, /*35499*/19238/* 11427 */,/*35500*/19239/* 11428 */,/*35501*/19240/* 11429 */,/*35502*/19241/* 1142A */, /*35503*/19242/* 1142B */,/*35504*/19243/* 1142C */,/*35505*/19244/* 1142D */,/*35506*/19245/* 1142E */, /*35507*/19246/* 1142F */,/*35508*/19247/* 11430 */,/*35509*/19248/* 11431 */,/*35510*/19249/* 11432 */, /*35511*/19250/* 11433 */,/*35512*/19251/* 11434 */,/*35513*/19252/* 11435 */,/*35514*/19253/* 11436 */, /*35515*/19254/* 11437 */,/*35516*/19255/* 11438 */,/*35517*/19256/* 11439 */,/*35518*/19257/* 1143A */, /*35519*/19258/* 1143B */,/*35520*/19259/* 1143C */,/*35521*/19260/* 1143D */,/*35522*/19261/* 1143E */, /*35523*/19262/* 1143F */,/*35524*/19263/* 11440 */,/*35525*/19264/* 11441 */,/*35526*/19265/* 11442 */, /*35527*/19266/* 11443 */,/*35528*/19267/* 11444 */,/*35529*/19268/* 11445 */,/*35530*/19269/* 11446 */, /*35531*/19270/* 11447 */,/*35532*/19271/* 11448 */,/*35533*/19272/* 11449 */,/*35534*/19273/* 1144A */, /*35535*/19274/* 1144B */,/*35536*/19275/* 1144C */,/*35537*/19276/* 1144D */,/*35538*/19277/* 1144E */, /*35539*/19278/* 1144F */,/*35540*/19279/* 11450 */,/*35541*/19280/* 11451 */,/*35542*/19281/* 11452 */, /*35543*/19282/* 11453 */,/*35544*/19283/* 11454 */,/*35545*/19284/* 11455 */,/*35546*/19285/* 11456 */, /*35547*/19286/* 11457 */,/*35548*/19287/* 11458 */,/*35549*/19288/* 11459 */,0,/*35551*/19289/* 1145B */,0, /*35553*/19290/* 1145D */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*35588*/19291/* 11480 */, /*35589*/19292/* 11481 */,/*35590*/19293/* 11482 */,/*35591*/19294/* 11483 */,/*35592*/19295/* 11484 */, /*35593*/19296/* 11485 */,/*35594*/19297/* 11486 */,/*35595*/19298/* 11487 */,/*35596*/19299/* 11488 */, /*35597*/19300/* 11489 */,/*35598*/19301/* 1148A */,/*35599*/19302/* 1148B */,/*35600*/19303/* 1148C */, /*35601*/19304/* 1148D */,/*35602*/19305/* 1148E */,/*35603*/19306/* 1148F */,/*35604*/19307/* 11490 */, /*35605*/19308/* 11491 */,/*35606*/19309/* 11492 */,/*35607*/19310/* 11493 */,/*35608*/19311/* 11494 */, /*35609*/19312/* 11495 */,/*35610*/19313/* 11496 */,/*35611*/19314/* 11497 */,/*35612*/19315/* 11498 */, /*35613*/19316/* 11499 */,/*35614*/19317/* 1149A */,/*35615*/19318/* 1149B */,/*35616*/19319/* 1149C */, /*35617*/19320/* 1149D */,/*35618*/19321/* 1149E */,/*35619*/19322/* 1149F */,/*35620*/19323/* 114A0 */, /*35621*/19324/* 114A1 */,/*35622*/19325/* 114A2 */,/*35623*/19326/* 114A3 */,/*35624*/19327/* 114A4 */, /*35625*/19328/* 114A5 */,/*35626*/19329/* 114A6 */,/*35627*/19330/* 114A7 */,/*35628*/19331/* 114A8 */, /*35629*/19332/* 114A9 */,/*35630*/19333/* 114AA */,/*35631*/19334/* 114AB */,/*35632*/19335/* 114AC */, /*35633*/19336/* 114AD */,/*35634*/19337/* 114AE */,/*35635*/19338/* 114AF */,/*35636*/19339/* 114B0 */, /*35637*/19340/* 114B1 */,/*35638*/19341/* 114B2 */,/*35639*/19342/* 114B3 */,/*35640*/19343/* 114B4 */, /*35641*/19344/* 114B5 */,/*35642*/19345/* 114B6 */,/*35643*/19346/* 114B7 */,/*35644*/19347/* 114B8 */, /*35645*/19348/* 114B9 */,/*35646*/19349/* 114BA */,/*35647*/19350/* 114BB */,/*35648*/19351/* 114BC */, /*35649*/19352/* 114BD */,/*35650*/19353/* 114BE */,/*35651*/19354/* 114BF */,/*35652*/19355/* 114C0 */, /*35653*/19356/* 114C1 */,/*35654*/19357/* 114C2 */,/*35655*/19358/* 114C3 */,/*35656*/19359/* 114C4 */, /*35657*/19360/* 114C5 */,/*35658*/19361/* 114C6 */,/*35659*/19362/* 114C7 */,0,0,0,0,0,0,0,0,/*35668*/19363/* 114D0 */, /*35669*/19364/* 114D1 */,/*35670*/19365/* 114D2 */,/*35671*/19366/* 114D3 */,/*35672*/19367/* 114D4 */, /*35673*/19368/* 114D5 */,/*35674*/19369/* 114D6 */,/*35675*/19370/* 114D7 */,/*35676*/19371/* 114D8 */, /*35677*/19372/* 114D9 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*35844*/19373/* 11580 */,/*35845*/19374/* 11581 */,/*35846*/19375/* 11582 */,/*35847*/19376/* 11583 */, /*35848*/19377/* 11584 */,/*35849*/19378/* 11585 */,/*35850*/19379/* 11586 */,/*35851*/19380/* 11587 */, /*35852*/19381/* 11588 */,/*35853*/19382/* 11589 */,/*35854*/19383/* 1158A */,/*35855*/19384/* 1158B */, /*35856*/19385/* 1158C */,/*35857*/19386/* 1158D */,/*35858*/19387/* 1158E */,/*35859*/19388/* 1158F */, /*35860*/19389/* 11590 */,/*35861*/19390/* 11591 */,/*35862*/19391/* 11592 */,/*35863*/19392/* 11593 */, /*35864*/19393/* 11594 */,/*35865*/19394/* 11595 */,/*35866*/19395/* 11596 */,/*35867*/19396/* 11597 */, /*35868*/19397/* 11598 */,/*35869*/19398/* 11599 */,/*35870*/19399/* 1159A */,/*35871*/19400/* 1159B */, /*35872*/19401/* 1159C */,/*35873*/19402/* 1159D */,/*35874*/19403/* 1159E */,/*35875*/19404/* 1159F */, /*35876*/19405/* 115A0 */,/*35877*/19406/* 115A1 */,/*35878*/19407/* 115A2 */,/*35879*/19408/* 115A3 */, /*35880*/19409/* 115A4 */,/*35881*/19410/* 115A5 */,/*35882*/19411/* 115A6 */,/*35883*/19412/* 115A7 */, /*35884*/19413/* 115A8 */,/*35885*/19414/* 115A9 */,/*35886*/19415/* 115AA */,/*35887*/19416/* 115AB */, /*35888*/19417/* 115AC */,/*35889*/19418/* 115AD */,/*35890*/19419/* 115AE */,/*35891*/19420/* 115AF */, /*35892*/19421/* 115B0 */,/*35893*/19422/* 115B1 */,/*35894*/19423/* 115B2 */,/*35895*/19424/* 115B3 */, /*35896*/19425/* 115B4 */,/*35897*/19426/* 115B5 */,0,0,/*35900*/19427/* 115B8 */,/*35901*/19428/* 115B9 */, /*35902*/19429/* 115BA */,/*35903*/19430/* 115BB */,/*35904*/19431/* 115BC */,/*35905*/19432/* 115BD */, /*35906*/19433/* 115BE */,/*35907*/19434/* 115BF */,/*35908*/19435/* 115C0 */,/*35909*/19436/* 115C1 */, /*35910*/19437/* 115C2 */,/*35911*/19438/* 115C3 */,/*35912*/19439/* 115C4 */,/*35913*/19440/* 115C5 */, /*35914*/19441/* 115C6 */,/*35915*/19442/* 115C7 */,/*35916*/19443/* 115C8 */,/*35917*/19444/* 115C9 */, /*35918*/19445/* 115CA */,/*35919*/19446/* 115CB */,/*35920*/19447/* 115CC */,/*35921*/19448/* 115CD */, /*35922*/19449/* 115CE */,/*35923*/19450/* 115CF */,/*35924*/19451/* 115D0 */,/*35925*/19452/* 115D1 */, /*35926*/19453/* 115D2 */,/*35927*/19454/* 115D3 */,/*35928*/19455/* 115D4 */,/*35929*/19456/* 115D5 */, /*35930*/19457/* 115D6 */,/*35931*/19458/* 115D7 */,/*35932*/19459/* 115D8 */,/*35933*/19460/* 115D9 */, /*35934*/19461/* 115DA */,/*35935*/19462/* 115DB */,/*35936*/19463/* 115DC */,/*35937*/19464/* 115DD */,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*35972*/19465/* 11600 */,/*35973*/19466/* 11601 */, /*35974*/19467/* 11602 */,/*35975*/19468/* 11603 */,/*35976*/19469/* 11604 */,/*35977*/19470/* 11605 */, /*35978*/19471/* 11606 */,/*35979*/19472/* 11607 */,/*35980*/19473/* 11608 */,/*35981*/19474/* 11609 */, /*35982*/19475/* 1160A */,/*35983*/19476/* 1160B */,/*35984*/19477/* 1160C */,/*35985*/19478/* 1160D */, /*35986*/19479/* 1160E */,/*35987*/19480/* 1160F */,/*35988*/19481/* 11610 */,/*35989*/19482/* 11611 */, /*35990*/19483/* 11612 */,/*35991*/19484/* 11613 */,/*35992*/19485/* 11614 */,/*35993*/19486/* 11615 */, /*35994*/19487/* 11616 */,/*35995*/19488/* 11617 */,/*35996*/19489/* 11618 */,/*35997*/19490/* 11619 */, /*35998*/19491/* 1161A */,/*35999*/19492/* 1161B */,/*36000*/19493/* 1161C */,/*36001*/19494/* 1161D */, /*36002*/19495/* 1161E */,/*36003*/19496/* 1161F */,/*36004*/19497/* 11620 */,/*36005*/19498/* 11621 */, /*36006*/19499/* 11622 */,/*36007*/19500/* 11623 */,/*36008*/19501/* 11624 */,/*36009*/19502/* 11625 */, /*36010*/19503/* 11626 */,/*36011*/19504/* 11627 */,/*36012*/19505/* 11628 */,/*36013*/19506/* 11629 */, /*36014*/19507/* 1162A */,/*36015*/19508/* 1162B */,/*36016*/19509/* 1162C */,/*36017*/19510/* 1162D */, /*36018*/19511/* 1162E */,/*36019*/19512/* 1162F */,/*36020*/19513/* 11630 */,/*36021*/19514/* 11631 */, /*36022*/19515/* 11632 */,/*36023*/19516/* 11633 */,/*36024*/19517/* 11634 */,/*36025*/19518/* 11635 */, /*36026*/19519/* 11636 */,/*36027*/19520/* 11637 */,/*36028*/19521/* 11638 */,/*36029*/19522/* 11639 */, /*36030*/19523/* 1163A */,/*36031*/19524/* 1163B */,/*36032*/19525/* 1163C */,/*36033*/19526/* 1163D */, /*36034*/19527/* 1163E */,/*36035*/19528/* 1163F */,/*36036*/19529/* 11640 */,/*36037*/19530/* 11641 */, /*36038*/19531/* 11642 */,/*36039*/19532/* 11643 */,/*36040*/19533/* 11644 */,0,0,0,0,0,0,0,0,0,0,0, /*36052*/19534/* 11650 */,/*36053*/19535/* 11651 */,/*36054*/19536/* 11652 */,/*36055*/19537/* 11653 */, /*36056*/19538/* 11654 */,/*36057*/19539/* 11655 */,/*36058*/19540/* 11656 */,/*36059*/19541/* 11657 */, /*36060*/19542/* 11658 */,/*36061*/19543/* 11659 */,0,0,0,0,0,0,/*36068*/19544/* 11660 */,/*36069*/19545/* 11661 */, /*36070*/19546/* 11662 */,/*36071*/19547/* 11663 */,/*36072*/19548/* 11664 */,/*36073*/19549/* 11665 */, /*36074*/19550/* 11666 */,/*36075*/19551/* 11667 */,/*36076*/19552/* 11668 */,/*36077*/19553/* 11669 */, /*36078*/19554/* 1166A */,/*36079*/19555/* 1166B */,/*36080*/19556/* 1166C */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*36100*/19557/* 11680 */,/*36101*/19558/* 11681 */,/*36102*/19559/* 11682 */,/*36103*/19560/* 11683 */, /*36104*/19561/* 11684 */,/*36105*/19562/* 11685 */,/*36106*/19563/* 11686 */,/*36107*/19564/* 11687 */, /*36108*/19565/* 11688 */,/*36109*/19566/* 11689 */,/*36110*/19567/* 1168A */,/*36111*/19568/* 1168B */, /*36112*/19569/* 1168C */,/*36113*/19570/* 1168D */,/*36114*/19571/* 1168E */,/*36115*/19572/* 1168F */, /*36116*/19573/* 11690 */,/*36117*/19574/* 11691 */,/*36118*/19575/* 11692 */,/*36119*/19576/* 11693 */, /*36120*/19577/* 11694 */,/*36121*/19578/* 11695 */,/*36122*/19579/* 11696 */,/*36123*/19580/* 11697 */, /*36124*/19581/* 11698 */,/*36125*/19582/* 11699 */,/*36126*/19583/* 1169A */,/*36127*/19584/* 1169B */, /*36128*/19585/* 1169C */,/*36129*/19586/* 1169D */,/*36130*/19587/* 1169E */,/*36131*/19588/* 1169F */, /*36132*/19589/* 116A0 */,/*36133*/19590/* 116A1 */,/*36134*/19591/* 116A2 */,/*36135*/19592/* 116A3 */, /*36136*/19593/* 116A4 */,/*36137*/19594/* 116A5 */,/*36138*/19595/* 116A6 */,/*36139*/19596/* 116A7 */, /*36140*/19597/* 116A8 */,/*36141*/19598/* 116A9 */,/*36142*/19599/* 116AA */,/*36143*/19600/* 116AB */, /*36144*/19601/* 116AC */,/*36145*/19602/* 116AD */,/*36146*/19603/* 116AE */,/*36147*/19604/* 116AF */, /*36148*/19605/* 116B0 */,/*36149*/19606/* 116B1 */,/*36150*/19607/* 116B2 */,/*36151*/19608/* 116B3 */, /*36152*/19609/* 116B4 */,/*36153*/19610/* 116B5 */,/*36154*/19611/* 116B6 */,/*36155*/19612/* 116B7 */,0,0,0,0,0,0,0,0, /*36164*/19613/* 116C0 */,/*36165*/19614/* 116C1 */,/*36166*/19615/* 116C2 */,/*36167*/19616/* 116C3 */, /*36168*/19617/* 116C4 */,/*36169*/19618/* 116C5 */,/*36170*/19619/* 116C6 */,/*36171*/19620/* 116C7 */, /*36172*/19621/* 116C8 */,/*36173*/19622/* 116C9 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*36228*/19623/* 11700 */,/*36229*/19624/* 11701 */,/*36230*/19625/* 11702 */, /*36231*/19626/* 11703 */,/*36232*/19627/* 11704 */,/*36233*/19628/* 11705 */,/*36234*/19629/* 11706 */, /*36235*/19630/* 11707 */,/*36236*/19631/* 11708 */,/*36237*/19632/* 11709 */,/*36238*/19633/* 1170A */, /*36239*/19634/* 1170B */,/*36240*/19635/* 1170C */,/*36241*/19636/* 1170D */,/*36242*/19637/* 1170E */, /*36243*/19638/* 1170F */,/*36244*/19639/* 11710 */,/*36245*/19640/* 11711 */,/*36246*/19641/* 11712 */, /*36247*/19642/* 11713 */,/*36248*/19643/* 11714 */,/*36249*/19644/* 11715 */,/*36250*/19645/* 11716 */, /*36251*/19646/* 11717 */,/*36252*/19647/* 11718 */,/*36253*/19648/* 11719 */,0,0,0,/*36257*/19649/* 1171D */, /*36258*/19650/* 1171E */,/*36259*/19651/* 1171F */,/*36260*/19652/* 11720 */,/*36261*/19653/* 11721 */, /*36262*/19654/* 11722 */,/*36263*/19655/* 11723 */,/*36264*/19656/* 11724 */,/*36265*/19657/* 11725 */, /*36266*/19658/* 11726 */,/*36267*/19659/* 11727 */,/*36268*/19660/* 11728 */,/*36269*/19661/* 11729 */, /*36270*/19662/* 1172A */,/*36271*/19663/* 1172B */,0,0,0,0,/*36276*/19664/* 11730 */,/*36277*/19665/* 11731 */, /*36278*/19666/* 11732 */,/*36279*/19667/* 11733 */,/*36280*/19668/* 11734 */,/*36281*/19669/* 11735 */, /*36282*/19670/* 11736 */,/*36283*/19671/* 11737 */,/*36284*/19672/* 11738 */,/*36285*/19673/* 11739 */, /*36286*/19674/* 1173A */,/*36287*/19675/* 1173B */,/*36288*/19676/* 1173C */,/*36289*/19677/* 1173D */, /*36290*/19678/* 1173E */,/*36291*/19679/* 1173F */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*36644*/19680/* 118A0 */,/*36645*/19681/* 118A1 */,/*36646*/19682/* 118A2 */, /*36647*/19683/* 118A3 */,/*36648*/19684/* 118A4 */,/*36649*/19685/* 118A5 */,/*36650*/19686/* 118A6 */, /*36651*/19687/* 118A7 */,/*36652*/19688/* 118A8 */,/*36653*/19689/* 118A9 */,/*36654*/19690/* 118AA */, /*36655*/19691/* 118AB */,/*36656*/19692/* 118AC */,/*36657*/19693/* 118AD */,/*36658*/19694/* 118AE */, /*36659*/19695/* 118AF */,/*36660*/19696/* 118B0 */,/*36661*/19697/* 118B1 */,/*36662*/19698/* 118B2 */, /*36663*/19699/* 118B3 */,/*36664*/19700/* 118B4 */,/*36665*/19701/* 118B5 */,/*36666*/19702/* 118B6 */, /*36667*/19703/* 118B7 */,/*36668*/19704/* 118B8 */,/*36669*/19705/* 118B9 */,/*36670*/19706/* 118BA */, /*36671*/19707/* 118BB */,/*36672*/19708/* 118BC */,/*36673*/19709/* 118BD */,/*36674*/19710/* 118BE */, /*36675*/19711/* 118BF */,/*36676*/19712/* 118C0 */,/*36677*/19713/* 118C1 */,/*36678*/19714/* 118C2 */, /*36679*/19715/* 118C3 */,/*36680*/19716/* 118C4 */,/*36681*/19717/* 118C5 */,/*36682*/19718/* 118C6 */, /*36683*/19719/* 118C7 */,/*36684*/19720/* 118C8 */,/*36685*/19721/* 118C9 */,/*36686*/19722/* 118CA */, /*36687*/19723/* 118CB */,/*36688*/19724/* 118CC */,/*36689*/19725/* 118CD */,/*36690*/19726/* 118CE */, /*36691*/19727/* 118CF */,/*36692*/19728/* 118D0 */,/*36693*/19729/* 118D1 */,/*36694*/19730/* 118D2 */, /*36695*/19731/* 118D3 */,/*36696*/19732/* 118D4 */,/*36697*/19733/* 118D5 */,/*36698*/19734/* 118D6 */, /*36699*/19735/* 118D7 */,/*36700*/19736/* 118D8 */,/*36701*/19737/* 118D9 */,/*36702*/19738/* 118DA */, /*36703*/19739/* 118DB */,/*36704*/19740/* 118DC */,/*36705*/19741/* 118DD */,/*36706*/19742/* 118DE */, /*36707*/19743/* 118DF */,/*36708*/19744/* 118E0 */,/*36709*/19745/* 118E1 */,/*36710*/19746/* 118E2 */, /*36711*/19747/* 118E3 */,/*36712*/19748/* 118E4 */,/*36713*/19749/* 118E5 */,/*36714*/19750/* 118E6 */, /*36715*/19751/* 118E7 */,/*36716*/19752/* 118E8 */,/*36717*/19753/* 118E9 */,/*36718*/19754/* 118EA */, /*36719*/19755/* 118EB */,/*36720*/19756/* 118EC */,/*36721*/19757/* 118ED */,/*36722*/19758/* 118EE */, /*36723*/19759/* 118EF */,/*36724*/19760/* 118F0 */,/*36725*/19761/* 118F1 */,/*36726*/19762/* 118F2 */,0,0,0,0,0,0,0,0, 0,0,0,0,/*36739*/19763/* 118FF */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*36996*/19764/* 11A00 */,/*36997*/19765/* 11A01 */, /*36998*/19766/* 11A02 */,/*36999*/19767/* 11A03 */,/*37000*/19768/* 11A04 */,/*37001*/19769/* 11A05 */, /*37002*/19770/* 11A06 */,/*37003*/19771/* 11A07 */,/*37004*/19772/* 11A08 */,/*37005*/19773/* 11A09 */, /*37006*/19774/* 11A0A */,/*37007*/19775/* 11A0B */,/*37008*/19776/* 11A0C */,/*37009*/19777/* 11A0D */, /*37010*/19778/* 11A0E */,/*37011*/19779/* 11A0F */,/*37012*/19780/* 11A10 */,/*37013*/19781/* 11A11 */, /*37014*/19782/* 11A12 */,/*37015*/19783/* 11A13 */,/*37016*/19784/* 11A14 */,/*37017*/19785/* 11A15 */, /*37018*/19786/* 11A16 */,/*37019*/19787/* 11A17 */,/*37020*/19788/* 11A18 */,/*37021*/19789/* 11A19 */, /*37022*/19790/* 11A1A */,/*37023*/19791/* 11A1B */,/*37024*/19792/* 11A1C */,/*37025*/19793/* 11A1D */, /*37026*/19794/* 11A1E */,/*37027*/19795/* 11A1F */,/*37028*/19796/* 11A20 */,/*37029*/19797/* 11A21 */, /*37030*/19798/* 11A22 */,/*37031*/19799/* 11A23 */,/*37032*/19800/* 11A24 */,/*37033*/19801/* 11A25 */, /*37034*/19802/* 11A26 */,/*37035*/19803/* 11A27 */,/*37036*/19804/* 11A28 */,/*37037*/19805/* 11A29 */, /*37038*/19806/* 11A2A */,/*37039*/19807/* 11A2B */,/*37040*/19808/* 11A2C */,/*37041*/19809/* 11A2D */, /*37042*/19810/* 11A2E */,/*37043*/19811/* 11A2F */,/*37044*/19812/* 11A30 */,/*37045*/19813/* 11A31 */, /*37046*/19814/* 11A32 */,/*37047*/19815/* 11A33 */,/*37048*/19816/* 11A34 */,/*37049*/19817/* 11A35 */, /*37050*/19817/* 11A36 */,/*37051*/19817/* 11A37 */,/*37052*/19818/* 11A38 */,/*37053*/19819/* 11A39 */, /*37054*/19820/* 11A3A */,/*37055*/19821/* 11A3B */,/*37056*/19822/* 11A3C */,/*37057*/19823/* 11A3D */, /*37058*/19824/* 11A3E */,/*37059*/19825/* 11A3F */,/*37060*/19826/* 11A40 */,/*37061*/19827/* 11A41 */, /*37062*/19828/* 11A42 */,/*37063*/19829/* 11A43 */,/*37064*/19830/* 11A44 */,/*37065*/19831/* 11A45 */, /*37066*/19832/* 11A46 */,/*37067*/19833/* 11A47 */,0,0,0,0,0,0,0,0,/*37076*/19834/* 11A50 */,/*37077*/19835/* 11A51 */, /*37078*/19836/* 11A52 */,/*37079*/19837/* 11A53 */,/*37080*/19838/* 11A54 */,/*37081*/19839/* 11A55 */, /*37082*/19840/* 11A56 */,/*37083*/19841/* 11A57 */,/*37084*/19842/* 11A58 */,/*37085*/19843/* 11A59 */, /*37086*/19844/* 11A5A */,/*37087*/19845/* 11A5B */,/*37088*/19846/* 11A5C */,/*37089*/19847/* 11A5D */, /*37090*/19848/* 11A5E */,/*37091*/19849/* 11A5F */,/*37092*/19850/* 11A60 */,/*37093*/19851/* 11A61 */, /*37094*/19852/* 11A62 */,/*37095*/19853/* 11A63 */,/*37096*/19854/* 11A64 */,/*37097*/19855/* 11A65 */, /*37098*/19856/* 11A66 */,/*37099*/19857/* 11A67 */,/*37100*/19858/* 11A68 */,/*37101*/19859/* 11A69 */, /*37102*/19860/* 11A6A */,/*37103*/19861/* 11A6B */,/*37104*/19862/* 11A6C */,/*37105*/19863/* 11A6D */, /*37106*/19864/* 11A6E */,/*37107*/19865/* 11A6F */,/*37108*/19866/* 11A70 */,/*37109*/19867/* 11A71 */, /*37110*/19868/* 11A72 */,/*37111*/19869/* 11A73 */,/*37112*/19870/* 11A74 */,/*37113*/19871/* 11A75 */, /*37114*/19872/* 11A76 */,/*37115*/19873/* 11A77 */,/*37116*/19874/* 11A78 */,/*37117*/19875/* 11A79 */, /*37118*/19876/* 11A7A */,/*37119*/19877/* 11A7B */,/*37120*/19878/* 11A7C */,/*37121*/19879/* 11A7D */, /*37122*/19880/* 11A7E */,/*37123*/19881/* 11A7F */,/*37124*/19882/* 11A80 */,/*37125*/19883/* 11A81 */, /*37126*/19884/* 11A82 */,/*37127*/19885/* 11A83 */,0,0,/*37130*/19886/* 11A86 */,/*37131*/19887/* 11A87 */, /*37132*/19888/* 11A88 */,/*37133*/19889/* 11A89 */,/*37134*/19890/* 11A8A */,/*37135*/19891/* 11A8B */, /*37136*/19892/* 11A8C */,/*37137*/19893/* 11A8D */,/*37138*/19894/* 11A8E */,/*37139*/19895/* 11A8F */, /*37140*/19896/* 11A90 */,/*37141*/19897/* 11A91 */,/*37142*/19898/* 11A92 */,/*37143*/19899/* 11A93 */, /*37144*/19900/* 11A94 */,/*37145*/19901/* 11A95 */,/*37146*/19902/* 11A96 */,/*37147*/19903/* 11A97 */, /*37148*/19904/* 11A98 */,/*37149*/19905/* 11A99 */,/*37150*/19906/* 11A9A */,/*37151*/19907/* 11A9B */, /*37152*/19908/* 11A9C */,0,/*37154*/19909/* 11A9E */,/*37155*/19910/* 11A9F */,/*37156*/19911/* 11AA0 */, /*37157*/19912/* 11AA1 */,/*37158*/19913/* 11AA2 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*37188*/19914/* 11AC0 */,/*37189*/19915/* 11AC1 */,/*37190*/19916/* 11AC2 */,/*37191*/19917/* 11AC3 */, /*37192*/19918/* 11AC4 */,/*37193*/19919/* 11AC5 */,/*37194*/19920/* 11AC6 */,/*37195*/19921/* 11AC7 */, /*37196*/19922/* 11AC8 */,/*37197*/19923/* 11AC9 */,/*37198*/19924/* 11ACA */,/*37199*/19925/* 11ACB */, /*37200*/19926/* 11ACC */,/*37201*/19927/* 11ACD */,/*37202*/19928/* 11ACE */,/*37203*/19929/* 11ACF */, /*37204*/19930/* 11AD0 */,/*37205*/19931/* 11AD1 */,/*37206*/19932/* 11AD2 */,/*37207*/19933/* 11AD3 */, /*37208*/19934/* 11AD4 */,/*37209*/19935/* 11AD5 */,/*37210*/19936/* 11AD6 */,/*37211*/19937/* 11AD7 */, /*37212*/19938/* 11AD8 */,/*37213*/19939/* 11AD9 */,/*37214*/19940/* 11ADA */,/*37215*/19941/* 11ADB */, /*37216*/19942/* 11ADC */,/*37217*/19943/* 11ADD */,/*37218*/19944/* 11ADE */,/*37219*/19945/* 11ADF */, /*37220*/19946/* 11AE0 */,/*37221*/19947/* 11AE1 */,/*37222*/19948/* 11AE2 */,/*37223*/19949/* 11AE3 */, /*37224*/19950/* 11AE4 */,/*37225*/19951/* 11AE5 */,/*37226*/19952/* 11AE6 */,/*37227*/19953/* 11AE7 */, /*37228*/19954/* 11AE8 */,/*37229*/19955/* 11AE9 */,/*37230*/19956/* 11AEA */,/*37231*/19957/* 11AEB */, /*37232*/19958/* 11AEC */,/*37233*/19959/* 11AED */,/*37234*/19960/* 11AEE */,/*37235*/19961/* 11AEF */, /*37236*/19962/* 11AF0 */,/*37237*/19963/* 11AF1 */,/*37238*/19964/* 11AF2 */,/*37239*/19965/* 11AF3 */, /*37240*/19966/* 11AF4 */,/*37241*/19967/* 11AF5 */,/*37242*/19968/* 11AF6 */,/*37243*/19969/* 11AF7 */, /*37244*/19970/* 11AF8 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*37508*/19971/* 11C00 */, /*37509*/19972/* 11C01 */,/*37510*/19973/* 11C02 */,/*37511*/19974/* 11C03 */,/*37512*/19975/* 11C04 */, /*37513*/19976/* 11C05 */,/*37514*/19977/* 11C06 */,/*37515*/19978/* 11C07 */,/*37516*/19979/* 11C08 */,0, /*37518*/19980/* 11C0A */,/*37519*/19981/* 11C0B */,/*37520*/19982/* 11C0C */,/*37521*/19983/* 11C0D */, /*37522*/19984/* 11C0E */,/*37523*/19985/* 11C0F */,/*37524*/19986/* 11C10 */,/*37525*/19987/* 11C11 */, /*37526*/19988/* 11C12 */,/*37527*/19989/* 11C13 */,/*37528*/19990/* 11C14 */,/*37529*/19991/* 11C15 */, /*37530*/19992/* 11C16 */,/*37531*/19993/* 11C17 */,/*37532*/19994/* 11C18 */,/*37533*/19995/* 11C19 */, /*37534*/19996/* 11C1A */,/*37535*/19997/* 11C1B */,/*37536*/19998/* 11C1C */,/*37537*/19999/* 11C1D */, /*37538*/20000/* 11C1E */,/*37539*/20001/* 11C1F */,/*37540*/20002/* 11C20 */,/*37541*/20003/* 11C21 */, /*37542*/20004/* 11C22 */,/*37543*/20005/* 11C23 */,/*37544*/20006/* 11C24 */,/*37545*/20007/* 11C25 */, /*37546*/20008/* 11C26 */,/*37547*/20009/* 11C27 */,/*37548*/20010/* 11C28 */,/*37549*/20011/* 11C29 */, /*37550*/20012/* 11C2A */,/*37551*/20013/* 11C2B */,/*37552*/20014/* 11C2C */,/*37553*/20015/* 11C2D */, /*37554*/20016/* 11C2E */,/*37555*/20017/* 11C2F */,/*37556*/20018/* 11C30 */,/*37557*/20019/* 11C31 */, /*37558*/20020/* 11C32 */,/*37559*/20021/* 11C33 */,/*37560*/20022/* 11C34 */,/*37561*/20023/* 11C35 */, /*37562*/20024/* 11C36 */,0,/*37564*/20025/* 11C38 */,/*37565*/20026/* 11C39 */,/*37566*/20027/* 11C3A */, /*37567*/20028/* 11C3B */,/*37568*/20029/* 11C3C */,/*37569*/20030/* 11C3D */,/*37570*/20031/* 11C3E */, /*37571*/20032/* 11C3F */,/*37572*/20033/* 11C40 */,/*37573*/20034/* 11C41 */,/*37574*/20035/* 11C42 */, /*37575*/20036/* 11C43 */,/*37576*/20037/* 11C44 */,/*37577*/20038/* 11C45 */,0,0,0,0,0,0,0,0,0,0, /*37588*/20039/* 11C50 */,/*37589*/20040/* 11C51 */,/*37590*/20041/* 11C52 */,/*37591*/20042/* 11C53 */, /*37592*/20043/* 11C54 */,/*37593*/20044/* 11C55 */,/*37594*/20045/* 11C56 */,/*37595*/20046/* 11C57 */, /*37596*/20047/* 11C58 */,/*37597*/20048/* 11C59 */,/*37598*/20049/* 11C5A */,/*37599*/20050/* 11C5B */, /*37600*/20051/* 11C5C */,/*37601*/20052/* 11C5D */,/*37602*/20053/* 11C5E */,/*37603*/20054/* 11C5F */, /*37604*/20055/* 11C60 */,/*37605*/20056/* 11C61 */,/*37606*/20057/* 11C62 */,/*37607*/20058/* 11C63 */, /*37608*/20059/* 11C64 */,/*37609*/20060/* 11C65 */,/*37610*/20061/* 11C66 */,/*37611*/20062/* 11C67 */, /*37612*/20063/* 11C68 */,/*37613*/20064/* 11C69 */,/*37614*/20065/* 11C6A */,/*37615*/20066/* 11C6B */, /*37616*/20067/* 11C6C */,0,0,0,/*37620*/20068/* 11C70 */,/*37621*/20069/* 11C71 */,/*37622*/20070/* 11C72 */, /*37623*/20071/* 11C73 */,/*37624*/20072/* 11C74 */,/*37625*/20073/* 11C75 */,/*37626*/20074/* 11C76 */, /*37627*/20075/* 11C77 */,/*37628*/20076/* 11C78 */,/*37629*/20077/* 11C79 */,/*37630*/20078/* 11C7A */, /*37631*/20079/* 11C7B */,/*37632*/20080/* 11C7C */,/*37633*/20081/* 11C7D */,/*37634*/20082/* 11C7E */, /*37635*/20083/* 11C7F */,/*37636*/20084/* 11C80 */,/*37637*/20085/* 11C81 */,/*37638*/20086/* 11C82 */, /*37639*/20087/* 11C83 */,/*37640*/20088/* 11C84 */,/*37641*/20089/* 11C85 */,/*37642*/20090/* 11C86 */, /*37643*/20091/* 11C87 */,/*37644*/20092/* 11C88 */,/*37645*/20093/* 11C89 */,/*37646*/20094/* 11C8A */, /*37647*/20095/* 11C8B */,/*37648*/20096/* 11C8C */,/*37649*/20097/* 11C8D */,/*37650*/20098/* 11C8E */, /*37651*/20099/* 11C8F */,0,0,/*37654*/20100/* 11C92 */,/*37655*/20101/* 11C93 */,/*37656*/20102/* 11C94 */, /*37657*/20103/* 11C95 */,/*37658*/20104/* 11C96 */,/*37659*/20105/* 11C97 */,/*37660*/20106/* 11C98 */, /*37661*/20107/* 11C99 */,/*37662*/20108/* 11C9A */,/*37663*/20109/* 11C9B */,/*37664*/20110/* 11C9C */, /*37665*/20111/* 11C9D */,/*37666*/20112/* 11C9E */,/*37667*/20113/* 11C9F */,/*37668*/20114/* 11CA0 */, /*37669*/20115/* 11CA1 */,/*37670*/20116/* 11CA2 */,/*37671*/20117/* 11CA3 */,/*37672*/20118/* 11CA4 */, /*37673*/20119/* 11CA5 */,/*37674*/20120/* 11CA6 */,/*37675*/20121/* 11CA7 */,0,/*37677*/20122/* 11CA9 */, /*37678*/20123/* 11CAA */,/*37679*/20124/* 11CAB */,/*37680*/20125/* 11CAC */,/*37681*/20126/* 11CAD */, /*37682*/20127/* 11CAE */,/*37683*/20128/* 11CAF */,/*37684*/20129/* 11CB0 */,/*37685*/20130/* 11CB1 */, /*37686*/20131/* 11CB2 */,/*37687*/20132/* 11CB3 */,/*37688*/20133/* 11CB4 */,/*37689*/20134/* 11CB5 */, /*37690*/20135/* 11CB6 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*37764*/20136/* 11D00 */,/*37765*/20137/* 11D01 */, /*37766*/20138/* 11D02 */,/*37767*/20139/* 11D03 */,/*37768*/20140/* 11D04 */,/*37769*/20141/* 11D05 */, /*37770*/20142/* 11D06 */,0,/*37772*/20143/* 11D08 */,/*37773*/20144/* 11D09 */,0,/*37775*/20145/* 11D0B */, /*37776*/20146/* 11D0C */,/*37777*/20147/* 11D0D */,/*37778*/20148/* 11D0E */,/*37779*/20149/* 11D0F */, /*37780*/20150/* 11D10 */,/*37781*/20151/* 11D11 */,/*37782*/20152/* 11D12 */,/*37783*/20153/* 11D13 */, /*37784*/20154/* 11D14 */,/*37785*/20155/* 11D15 */,/*37786*/20156/* 11D16 */,/*37787*/20157/* 11D17 */, /*37788*/20158/* 11D18 */,/*37789*/20159/* 11D19 */,/*37790*/20160/* 11D1A */,/*37791*/20161/* 11D1B */, /*37792*/20162/* 11D1C */,/*37793*/20163/* 11D1D */,/*37794*/20164/* 11D1E */,/*37795*/20165/* 11D1F */, /*37796*/20166/* 11D20 */,/*37797*/20167/* 11D21 */,/*37798*/20168/* 11D22 */,/*37799*/20169/* 11D23 */, /*37800*/20170/* 11D24 */,/*37801*/20171/* 11D25 */,/*37802*/20172/* 11D26 */,/*37803*/20173/* 11D27 */, /*37804*/20174/* 11D28 */,/*37805*/20175/* 11D29 */,/*37806*/20176/* 11D2A */,/*37807*/20177/* 11D2B */, /*37808*/20178/* 11D2C */,/*37809*/20179/* 11D2D */,/*37810*/20180/* 11D2E */,/*37811*/20181/* 11D2F */, /*37812*/20182/* 11D30 */,/*37813*/20183/* 11D31 */,/*37814*/20184/* 11D32 */,/*37815*/20185/* 11D33 */, /*37816*/20186/* 11D34 */,/*37817*/20187/* 11D35 */,/*37818*/20188/* 11D36 */,0,0,0,/*37822*/20189/* 11D3A */,0, /*37824*/20190/* 11D3C */,/*37825*/20191/* 11D3D */,0,/*37827*/20192/* 11D3F */,/*37828*/20193/* 11D40 */, /*37829*/20194/* 11D41 */,/*37830*/20195/* 11D42 */,/*37831*/20196/* 11D43 */,/*37832*/20197/* 11D44 */, /*37833*/20198/* 11D45 */,/*37834*/20199/* 11D46 */,/*37835*/20200/* 11D47 */,0,0,0,0,0,0,0,0,/*37844*/20201/* 11D50 */, /*37845*/20202/* 11D51 */,/*37846*/20203/* 11D52 */,/*37847*/20204/* 11D53 */,/*37848*/20205/* 11D54 */, /*37849*/20206/* 11D55 */,/*37850*/20207/* 11D56 */,/*37851*/20208/* 11D57 */,/*37852*/20209/* 11D58 */, /*37853*/20210/* 11D59 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*38532*/20211/* 12000 */,/*38533*/20212/* 12001 */, /*38534*/20213/* 12002 */,/*38535*/20214/* 12003 */,/*38536*/20215/* 12004 */,/*38537*/20216/* 12005 */, /*38538*/20217/* 12006 */,/*38539*/20218/* 12007 */,/*38540*/20219/* 12008 */,/*38541*/20220/* 12009 */, /*38542*/20221/* 1200A */,/*38543*/20222/* 1200B */,/*38544*/20223/* 1200C */,/*38545*/20224/* 1200D */, /*38546*/20225/* 1200E */,/*38547*/20226/* 1200F */,/*38548*/20227/* 12010 */,/*38549*/20228/* 12011 */, /*38550*/20229/* 12012 */,/*38551*/20230/* 12013 */,/*38552*/20231/* 12014 */,/*38553*/20232/* 12015 */, /*38554*/20233/* 12016 */,/*38555*/20234/* 12017 */,/*38556*/20235/* 12018 */,/*38557*/20236/* 12019 */, /*38558*/20237/* 1201A */,/*38559*/20238/* 1201B */,/*38560*/20239/* 1201C */,/*38561*/20240/* 1201D */, /*38562*/20241/* 1201E */,/*38563*/20242/* 1201F */,/*38564*/20243/* 12020 */,/*38565*/20244/* 12021 */, /*38566*/20245/* 12022 */,/*38567*/20246/* 12023 */,/*38568*/20247/* 12024 */,/*38569*/20248/* 12025 */, /*38570*/20249/* 12026 */,/*38571*/20250/* 12027 */,/*38572*/20251/* 12028 */,/*38573*/20252/* 12029 */, /*38574*/20253/* 1202A */,/*38575*/20254/* 1202B */,/*38576*/20255/* 1202C */,/*38577*/20256/* 1202D */, /*38578*/20257/* 1202E */,/*38579*/20258/* 1202F */,/*38580*/20259/* 12030 */,/*38581*/20260/* 12031 */, /*38582*/20261/* 12032 */,/*38583*/20262/* 12033 */,/*38584*/20263/* 12034 */,/*38585*/20264/* 12035 */, /*38586*/20265/* 12036 */,/*38587*/20266/* 12037 */,/*38588*/20267/* 12038 */,/*38589*/20268/* 12039 */, /*38590*/20269/* 1203A */,/*38591*/20270/* 1203B */,/*38592*/20271/* 1203C */,/*38593*/20272/* 1203D */, /*38594*/20273/* 1203E */,/*38595*/20274/* 1203F */,/*38596*/20275/* 12040 */,/*38597*/20276/* 12041 */, /*38598*/20277/* 12042 */,/*38599*/20278/* 12043 */,/*38600*/20279/* 12044 */,/*38601*/20280/* 12045 */, /*38602*/20281/* 12046 */,/*38603*/20282/* 12047 */,/*38604*/20283/* 12048 */,/*38605*/20284/* 12049 */, /*38606*/20285/* 1204A */,/*38607*/20286/* 1204B */,/*38608*/20287/* 1204C */,/*38609*/20288/* 1204D */, /*38610*/20289/* 1204E */,/*38611*/20290/* 1204F */,/*38612*/20291/* 12050 */,/*38613*/20292/* 12051 */, /*38614*/20293/* 12052 */,/*38615*/20294/* 12053 */,/*38616*/20295/* 12054 */,/*38617*/20296/* 12055 */, /*38618*/20297/* 12056 */,/*38619*/20298/* 12057 */,/*38620*/20299/* 12058 */,/*38621*/20300/* 12059 */, /*38622*/20301/* 1205A */,/*38623*/20302/* 1205B */,/*38624*/20303/* 1205C */,/*38625*/20304/* 1205D */, /*38626*/20305/* 1205E */,/*38627*/20306/* 1205F */,/*38628*/20307/* 12060 */,/*38629*/20308/* 12061 */, /*38630*/20309/* 12062 */,/*38631*/20310/* 12063 */,/*38632*/20311/* 12064 */,/*38633*/20312/* 12065 */, /*38634*/20313/* 12066 */,/*38635*/20314/* 12067 */,/*38636*/20315/* 12068 */,/*38637*/20316/* 12069 */, /*38638*/20317/* 1206A */,/*38639*/20318/* 1206B */,/*38640*/20319/* 1206C */,/*38641*/20320/* 1206D */, /*38642*/20321/* 1206E */,/*38643*/20322/* 1206F */,/*38644*/20323/* 12070 */,/*38645*/20324/* 12071 */, /*38646*/20325/* 12072 */,/*38647*/20326/* 12073 */,/*38648*/20327/* 12074 */,/*38649*/20328/* 12075 */, /*38650*/20329/* 12076 */,/*38651*/20330/* 12077 */,/*38652*/20331/* 12078 */,/*38653*/20332/* 12079 */, /*38654*/20333/* 1207A */,/*38655*/20334/* 1207B */,/*38656*/20335/* 1207C */,/*38657*/20336/* 1207D */, /*38658*/20337/* 1207E */,/*38659*/20338/* 1207F */,/*38660*/20339/* 12080 */,/*38661*/20340/* 12081 */, /*38662*/20341/* 12082 */,/*38663*/20342/* 12083 */,/*38664*/20343/* 12084 */,/*38665*/20344/* 12085 */, /*38666*/20345/* 12086 */,/*38667*/20346/* 12087 */,/*38668*/20347/* 12088 */,/*38669*/20348/* 12089 */, /*38670*/20349/* 1208A */,/*38671*/20350/* 1208B */,/*38672*/20351/* 1208C */,/*38673*/20352/* 1208D */, /*38674*/20353/* 1208E */,/*38675*/20354/* 1208F */,/*38676*/20355/* 12090 */,/*38677*/20356/* 12091 */, /*38678*/20357/* 12092 */,/*38679*/20358/* 12093 */,/*38680*/20359/* 12094 */,/*38681*/20360/* 12095 */, /*38682*/20361/* 12096 */,/*38683*/20362/* 12097 */,/*38684*/20363/* 12098 */,/*38685*/20364/* 12099 */, /*38686*/20365/* 1209A */,/*38687*/20366/* 1209B */,/*38688*/20367/* 1209C */,/*38689*/20368/* 1209D */, /*38690*/20369/* 1209E */,/*38691*/20370/* 1209F */,/*38692*/20371/* 120A0 */,/*38693*/20372/* 120A1 */, /*38694*/20373/* 120A2 */,/*38695*/20374/* 120A3 */,/*38696*/20375/* 120A4 */,/*38697*/20376/* 120A5 */, /*38698*/20377/* 120A6 */,/*38699*/20378/* 120A7 */,/*38700*/20379/* 120A8 */,/*38701*/20380/* 120A9 */, /*38702*/20381/* 120AA */,/*38703*/20382/* 120AB */,/*38704*/20383/* 120AC */,/*38705*/20384/* 120AD */, /*38706*/20385/* 120AE */,/*38707*/20386/* 120AF */,/*38708*/20387/* 120B0 */,/*38709*/20388/* 120B1 */, /*38710*/20389/* 120B2 */,/*38711*/20390/* 120B3 */,/*38712*/20391/* 120B4 */,/*38713*/20392/* 120B5 */, /*38714*/20393/* 120B6 */,/*38715*/20394/* 120B7 */,/*38716*/20395/* 120B8 */,/*38717*/20396/* 120B9 */, /*38718*/20397/* 120BA */,/*38719*/20398/* 120BB */,/*38720*/20399/* 120BC */,/*38721*/20400/* 120BD */, /*38722*/20401/* 120BE */,/*38723*/20402/* 120BF */,/*38724*/20403/* 120C0 */,/*38725*/20404/* 120C1 */, /*38726*/20405/* 120C2 */,/*38727*/20406/* 120C3 */,/*38728*/20407/* 120C4 */,/*38729*/20408/* 120C5 */, /*38730*/20409/* 120C6 */,/*38731*/20410/* 120C7 */,/*38732*/20411/* 120C8 */,/*38733*/20412/* 120C9 */, /*38734*/20413/* 120CA */,/*38735*/20414/* 120CB */,/*38736*/20415/* 120CC */,/*38737*/20416/* 120CD */, /*38738*/20417/* 120CE */,/*38739*/20418/* 120CF */,/*38740*/20419/* 120D0 */,/*38741*/20420/* 120D1 */, /*38742*/20421/* 120D2 */,/*38743*/20422/* 120D3 */,/*38744*/20423/* 120D4 */,/*38745*/20424/* 120D5 */, /*38746*/20425/* 120D6 */,/*38747*/20426/* 120D7 */,/*38748*/20427/* 120D8 */,/*38749*/20428/* 120D9 */, /*38750*/20429/* 120DA */,/*38751*/20430/* 120DB */,/*38752*/20431/* 120DC */,/*38753*/20432/* 120DD */, /*38754*/20433/* 120DE */,/*38755*/20434/* 120DF */,/*38756*/20435/* 120E0 */,/*38757*/20436/* 120E1 */, /*38758*/20437/* 120E2 */,/*38759*/20438/* 120E3 */,/*38760*/20439/* 120E4 */,/*38761*/20440/* 120E5 */, /*38762*/20441/* 120E6 */,/*38763*/20442/* 120E7 */,/*38764*/20443/* 120E8 */,/*38765*/20444/* 120E9 */, /*38766*/20445/* 120EA */,/*38767*/20446/* 120EB */,/*38768*/20447/* 120EC */,/*38769*/20448/* 120ED */, /*38770*/20449/* 120EE */,/*38771*/20450/* 120EF */,/*38772*/20451/* 120F0 */,/*38773*/20452/* 120F1 */, /*38774*/20453/* 120F2 */,/*38775*/20454/* 120F3 */,/*38776*/20455/* 120F4 */,/*38777*/20456/* 120F5 */, /*38778*/20457/* 120F6 */,/*38779*/20458/* 120F7 */,/*38780*/20459/* 120F8 */,/*38781*/20460/* 120F9 */, /*38782*/20461/* 120FA */,/*38783*/20462/* 120FB */,/*38784*/20463/* 120FC */,/*38785*/20464/* 120FD */, /*38786*/20465/* 120FE */,/*38787*/20466/* 120FF */,/*38788*/20467/* 12100 */,/*38789*/20468/* 12101 */, /*38790*/20469/* 12102 */,/*38791*/20470/* 12103 */,/*38792*/20471/* 12104 */,/*38793*/20472/* 12105 */, /*38794*/20473/* 12106 */,/*38795*/20474/* 12107 */,/*38796*/20475/* 12108 */,/*38797*/20476/* 12109 */, /*38798*/20477/* 1210A */,/*38799*/20478/* 1210B */,/*38800*/20479/* 1210C */,/*38801*/20480/* 1210D */, /*38802*/20481/* 1210E */,/*38803*/20482/* 1210F */,/*38804*/20483/* 12110 */,/*38805*/20484/* 12111 */, /*38806*/20485/* 12112 */,/*38807*/20486/* 12113 */,/*38808*/20487/* 12114 */,/*38809*/20488/* 12115 */, /*38810*/20489/* 12116 */,/*38811*/20490/* 12117 */,/*38812*/20491/* 12118 */,/*38813*/20492/* 12119 */, /*38814*/20493/* 1211A */,/*38815*/20494/* 1211B */,/*38816*/20495/* 1211C */,/*38817*/20496/* 1211D */, /*38818*/20497/* 1211E */,/*38819*/20498/* 1211F */,/*38820*/20499/* 12120 */,/*38821*/20500/* 12121 */, /*38822*/20501/* 12122 */,/*38823*/20502/* 12123 */,/*38824*/20503/* 12124 */,/*38825*/20504/* 12125 */, /*38826*/20505/* 12126 */,/*38827*/20506/* 12127 */,/*38828*/20507/* 12128 */,/*38829*/20508/* 12129 */, /*38830*/20509/* 1212A */,/*38831*/20510/* 1212B */,/*38832*/20511/* 1212C */,/*38833*/20512/* 1212D */, /*38834*/20513/* 1212E */,/*38835*/20514/* 1212F */,/*38836*/20515/* 12130 */,/*38837*/20516/* 12131 */, /*38838*/20517/* 12132 */,/*38839*/20518/* 12133 */,/*38840*/20519/* 12134 */,/*38841*/20520/* 12135 */, /*38842*/20521/* 12136 */,/*38843*/20522/* 12137 */,/*38844*/20523/* 12138 */,/*38845*/20524/* 12139 */, /*38846*/20525/* 1213A */,/*38847*/20526/* 1213B */,/*38848*/20527/* 1213C */,/*38849*/20528/* 1213D */, /*38850*/20529/* 1213E */,/*38851*/20530/* 1213F */,/*38852*/20531/* 12140 */,/*38853*/20532/* 12141 */, /*38854*/20533/* 12142 */,/*38855*/20534/* 12143 */,/*38856*/20535/* 12144 */,/*38857*/20536/* 12145 */, /*38858*/20537/* 12146 */,/*38859*/20538/* 12147 */,/*38860*/20539/* 12148 */,/*38861*/20540/* 12149 */, /*38862*/20541/* 1214A */,/*38863*/20542/* 1214B */,/*38864*/20543/* 1214C */,/*38865*/20544/* 1214D */, /*38866*/20545/* 1214E */,/*38867*/20546/* 1214F */,/*38868*/20547/* 12150 */,/*38869*/20548/* 12151 */, /*38870*/20549/* 12152 */,/*38871*/20550/* 12153 */,/*38872*/20551/* 12154 */,/*38873*/20552/* 12155 */, /*38874*/20553/* 12156 */,/*38875*/20554/* 12157 */,/*38876*/20555/* 12158 */,/*38877*/20556/* 12159 */, /*38878*/20557/* 1215A */,/*38879*/20558/* 1215B */,/*38880*/20559/* 1215C */,/*38881*/20560/* 1215D */, /*38882*/20561/* 1215E */,/*38883*/20562/* 1215F */,/*38884*/20563/* 12160 */,/*38885*/20564/* 12161 */, /*38886*/20565/* 12162 */,/*38887*/20566/* 12163 */,/*38888*/20567/* 12164 */,/*38889*/20568/* 12165 */, /*38890*/20569/* 12166 */,/*38891*/20570/* 12167 */,/*38892*/20571/* 12168 */,/*38893*/20572/* 12169 */, /*38894*/20573/* 1216A */,/*38895*/20574/* 1216B */,/*38896*/20575/* 1216C */,/*38897*/20576/* 1216D */, /*38898*/20577/* 1216E */,/*38899*/20578/* 1216F */,/*38900*/20579/* 12170 */,/*38901*/20580/* 12171 */, /*38902*/20581/* 12172 */,/*38903*/20582/* 12173 */,/*38904*/20583/* 12174 */,/*38905*/20584/* 12175 */, /*38906*/20585/* 12176 */,/*38907*/20586/* 12177 */,/*38908*/20587/* 12178 */,/*38909*/20588/* 12179 */, /*38910*/20589/* 1217A */,/*38911*/20590/* 1217B */,/*38912*/20591/* 1217C */,/*38913*/20592/* 1217D */, /*38914*/20593/* 1217E */,/*38915*/20594/* 1217F */,/*38916*/20595/* 12180 */,/*38917*/20596/* 12181 */, /*38918*/20597/* 12182 */,/*38919*/20598/* 12183 */,/*38920*/20599/* 12184 */,/*38921*/20600/* 12185 */, /*38922*/20601/* 12186 */,/*38923*/20602/* 12187 */,/*38924*/20603/* 12188 */,/*38925*/20604/* 12189 */, /*38926*/20605/* 1218A */,/*38927*/20606/* 1218B */,/*38928*/20607/* 1218C */,/*38929*/20608/* 1218D */, /*38930*/20609/* 1218E */,/*38931*/20610/* 1218F */,/*38932*/20611/* 12190 */,/*38933*/20612/* 12191 */, /*38934*/20613/* 12192 */,/*38935*/20614/* 12193 */,/*38936*/20615/* 12194 */,/*38937*/20616/* 12195 */, /*38938*/20617/* 12196 */,/*38939*/20618/* 12197 */,/*38940*/20619/* 12198 */,/*38941*/20620/* 12199 */, /*38942*/20621/* 1219A */,/*38943*/20622/* 1219B */,/*38944*/20623/* 1219C */,/*38945*/20624/* 1219D */, /*38946*/20625/* 1219E */,/*38947*/20626/* 1219F */,/*38948*/20627/* 121A0 */,/*38949*/20628/* 121A1 */, /*38950*/20629/* 121A2 */,/*38951*/20630/* 121A3 */,/*38952*/20631/* 121A4 */,/*38953*/20632/* 121A5 */, /*38954*/20633/* 121A6 */,/*38955*/20634/* 121A7 */,/*38956*/20635/* 121A8 */,/*38957*/20636/* 121A9 */, /*38958*/20637/* 121AA */,/*38959*/20638/* 121AB */,/*38960*/20639/* 121AC */,/*38961*/20640/* 121AD */, /*38962*/20641/* 121AE */,/*38963*/20642/* 121AF */,/*38964*/20643/* 121B0 */,/*38965*/20644/* 121B1 */, /*38966*/20645/* 121B2 */,/*38967*/20646/* 121B3 */,/*38968*/20647/* 121B4 */,/*38969*/20648/* 121B5 */, /*38970*/20649/* 121B6 */,/*38971*/20650/* 121B7 */,/*38972*/20651/* 121B8 */,/*38973*/20652/* 121B9 */, /*38974*/20653/* 121BA */,/*38975*/20654/* 121BB */,/*38976*/20655/* 121BC */,/*38977*/20656/* 121BD */, /*38978*/20657/* 121BE */,/*38979*/20658/* 121BF */,/*38980*/20659/* 121C0 */,/*38981*/20660/* 121C1 */, /*38982*/20661/* 121C2 */,/*38983*/20662/* 121C3 */,/*38984*/20663/* 121C4 */,/*38985*/20664/* 121C5 */, /*38986*/20665/* 121C6 */,/*38987*/20666/* 121C7 */,/*38988*/20667/* 121C8 */,/*38989*/20668/* 121C9 */, /*38990*/20669/* 121CA */,/*38991*/20670/* 121CB */,/*38992*/20671/* 121CC */,/*38993*/20672/* 121CD */, /*38994*/20673/* 121CE */,/*38995*/20674/* 121CF */,/*38996*/20675/* 121D0 */,/*38997*/20676/* 121D1 */, /*38998*/20677/* 121D2 */,/*38999*/20678/* 121D3 */,/*39000*/20679/* 121D4 */,/*39001*/20680/* 121D5 */, /*39002*/20681/* 121D6 */,/*39003*/20682/* 121D7 */,/*39004*/20683/* 121D8 */,/*39005*/20684/* 121D9 */, /*39006*/20685/* 121DA */,/*39007*/20686/* 121DB */,/*39008*/20687/* 121DC */,/*39009*/20688/* 121DD */, /*39010*/20689/* 121DE */,/*39011*/20690/* 121DF */,/*39012*/20691/* 121E0 */,/*39013*/20692/* 121E1 */, /*39014*/20693/* 121E2 */,/*39015*/20694/* 121E3 */,/*39016*/20695/* 121E4 */,/*39017*/20696/* 121E5 */, /*39018*/20697/* 121E6 */,/*39019*/20698/* 121E7 */,/*39020*/20699/* 121E8 */,/*39021*/20700/* 121E9 */, /*39022*/20701/* 121EA */,/*39023*/20702/* 121EB */,/*39024*/20703/* 121EC */,/*39025*/20704/* 121ED */, /*39026*/20705/* 121EE */,/*39027*/20706/* 121EF */,/*39028*/20707/* 121F0 */,/*39029*/20708/* 121F1 */, /*39030*/20709/* 121F2 */,/*39031*/20710/* 121F3 */,/*39032*/20711/* 121F4 */,/*39033*/20712/* 121F5 */, /*39034*/20713/* 121F6 */,/*39035*/20714/* 121F7 */,/*39036*/20715/* 121F8 */,/*39037*/20716/* 121F9 */, /*39038*/20717/* 121FA */,/*39039*/20718/* 121FB */,/*39040*/20719/* 121FC */,/*39041*/20720/* 121FD */, /*39042*/20721/* 121FE */,/*39043*/20722/* 121FF */,/*39044*/20723/* 12200 */,/*39045*/20724/* 12201 */, /*39046*/20725/* 12202 */,/*39047*/20726/* 12203 */,/*39048*/20727/* 12204 */,/*39049*/20728/* 12205 */, /*39050*/20729/* 12206 */,/*39051*/20730/* 12207 */,/*39052*/20731/* 12208 */,/*39053*/20732/* 12209 */, /*39054*/20733/* 1220A */,/*39055*/20734/* 1220B */,/*39056*/20735/* 1220C */,/*39057*/20736/* 1220D */, /*39058*/20737/* 1220E */,/*39059*/20738/* 1220F */,/*39060*/20739/* 12210 */,/*39061*/20740/* 12211 */, /*39062*/20741/* 12212 */,/*39063*/20742/* 12213 */,/*39064*/20743/* 12214 */,/*39065*/20744/* 12215 */, /*39066*/20745/* 12216 */,/*39067*/20746/* 12217 */,/*39068*/20747/* 12218 */,/*39069*/20748/* 12219 */, /*39070*/20749/* 1221A */,/*39071*/20750/* 1221B */,/*39072*/20751/* 1221C */,/*39073*/20752/* 1221D */, /*39074*/20753/* 1221E */,/*39075*/20754/* 1221F */,/*39076*/20755/* 12220 */,/*39077*/20756/* 12221 */, /*39078*/20757/* 12222 */,/*39079*/20758/* 12223 */,/*39080*/20759/* 12224 */,/*39081*/20760/* 12225 */, /*39082*/20761/* 12226 */,/*39083*/20762/* 12227 */,/*39084*/20763/* 12228 */,/*39085*/20764/* 12229 */, /*39086*/20765/* 1222A */,/*39087*/20766/* 1222B */,/*39088*/20767/* 1222C */,/*39089*/20768/* 1222D */, /*39090*/20769/* 1222E */,/*39091*/20770/* 1222F */,/*39092*/20771/* 12230 */,/*39093*/20772/* 12231 */, /*39094*/20773/* 12232 */,/*39095*/20774/* 12233 */,/*39096*/20775/* 12234 */,/*39097*/20776/* 12235 */, /*39098*/20777/* 12236 */,/*39099*/20778/* 12237 */,/*39100*/20779/* 12238 */,/*39101*/20780/* 12239 */, /*39102*/20781/* 1223A */,/*39103*/20782/* 1223B */,/*39104*/20783/* 1223C */,/*39105*/20784/* 1223D */, /*39106*/20785/* 1223E */,/*39107*/20786/* 1223F */,/*39108*/20787/* 12240 */,/*39109*/20788/* 12241 */, /*39110*/20789/* 12242 */,/*39111*/20790/* 12243 */,/*39112*/20791/* 12244 */,/*39113*/20792/* 12245 */, /*39114*/20793/* 12246 */,/*39115*/20794/* 12247 */,/*39116*/20795/* 12248 */,/*39117*/20796/* 12249 */, /*39118*/20797/* 1224A */,/*39119*/20798/* 1224B */,/*39120*/20799/* 1224C */,/*39121*/20800/* 1224D */, /*39122*/20801/* 1224E */,/*39123*/20802/* 1224F */,/*39124*/20803/* 12250 */,/*39125*/20804/* 12251 */, /*39126*/20805/* 12252 */,/*39127*/20806/* 12253 */,/*39128*/20807/* 12254 */,/*39129*/20808/* 12255 */, /*39130*/20809/* 12256 */,/*39131*/20810/* 12257 */,/*39132*/20811/* 12258 */,/*39133*/20812/* 12259 */, /*39134*/20813/* 1225A */,/*39135*/20814/* 1225B */,/*39136*/20815/* 1225C */,/*39137*/20816/* 1225D */, /*39138*/20817/* 1225E */,/*39139*/20818/* 1225F */,/*39140*/20819/* 12260 */,/*39141*/20820/* 12261 */, /*39142*/20821/* 12262 */,/*39143*/20822/* 12263 */,/*39144*/20823/* 12264 */,/*39145*/20824/* 12265 */, /*39146*/20825/* 12266 */,/*39147*/20826/* 12267 */,/*39148*/20827/* 12268 */,/*39149*/20828/* 12269 */, /*39150*/20829/* 1226A */,/*39151*/20830/* 1226B */,/*39152*/20831/* 1226C */,/*39153*/20832/* 1226D */, /*39154*/20833/* 1226E */,/*39155*/20834/* 1226F */,/*39156*/20835/* 12270 */,/*39157*/20836/* 12271 */, /*39158*/20837/* 12272 */,/*39159*/20838/* 12273 */,/*39160*/20839/* 12274 */,/*39161*/20840/* 12275 */, /*39162*/20841/* 12276 */,/*39163*/20842/* 12277 */,/*39164*/20843/* 12278 */,/*39165*/20844/* 12279 */, /*39166*/20845/* 1227A */,/*39167*/20846/* 1227B */,/*39168*/20847/* 1227C */,/*39169*/20848/* 1227D */, /*39170*/20849/* 1227E */,/*39171*/20850/* 1227F */,/*39172*/20851/* 12280 */,/*39173*/20852/* 12281 */, /*39174*/20853/* 12282 */,/*39175*/20854/* 12283 */,/*39176*/20855/* 12284 */,/*39177*/20856/* 12285 */, /*39178*/20857/* 12286 */,/*39179*/20858/* 12287 */,/*39180*/20859/* 12288 */,/*39181*/20860/* 12289 */, /*39182*/20861/* 1228A */,/*39183*/20862/* 1228B */,/*39184*/20863/* 1228C */,/*39185*/20864/* 1228D */, /*39186*/20865/* 1228E */,/*39187*/20866/* 1228F */,/*39188*/20867/* 12290 */,/*39189*/20868/* 12291 */, /*39190*/20869/* 12292 */,/*39191*/20870/* 12293 */,/*39192*/20871/* 12294 */,/*39193*/20872/* 12295 */, /*39194*/20873/* 12296 */,/*39195*/20874/* 12297 */,/*39196*/20875/* 12298 */,/*39197*/20876/* 12299 */, /*39198*/20877/* 1229A */,/*39199*/20878/* 1229B */,/*39200*/20879/* 1229C */,/*39201*/20880/* 1229D */, /*39202*/20881/* 1229E */,/*39203*/20882/* 1229F */,/*39204*/20883/* 122A0 */,/*39205*/20884/* 122A1 */, /*39206*/20885/* 122A2 */,/*39207*/20886/* 122A3 */,/*39208*/20887/* 122A4 */,/*39209*/20888/* 122A5 */, /*39210*/20889/* 122A6 */,/*39211*/20890/* 122A7 */,/*39212*/20891/* 122A8 */,/*39213*/20892/* 122A9 */, /*39214*/20893/* 122AA */,/*39215*/20894/* 122AB */,/*39216*/20895/* 122AC */,/*39217*/20896/* 122AD */, /*39218*/20897/* 122AE */,/*39219*/20898/* 122AF */,/*39220*/20899/* 122B0 */,/*39221*/20900/* 122B1 */, /*39222*/20901/* 122B2 */,/*39223*/20902/* 122B3 */,/*39224*/20903/* 122B4 */,/*39225*/20904/* 122B5 */, /*39226*/20905/* 122B6 */,/*39227*/20906/* 122B7 */,/*39228*/20907/* 122B8 */,/*39229*/20908/* 122B9 */, /*39230*/20909/* 122BA */,/*39231*/20910/* 122BB */,/*39232*/20911/* 122BC */,/*39233*/20912/* 122BD */, /*39234*/20913/* 122BE */,/*39235*/20914/* 122BF */,/*39236*/20915/* 122C0 */,/*39237*/20916/* 122C1 */, /*39238*/20917/* 122C2 */,/*39239*/20918/* 122C3 */,/*39240*/20919/* 122C4 */,/*39241*/20920/* 122C5 */, /*39242*/20921/* 122C6 */,/*39243*/20922/* 122C7 */,/*39244*/20923/* 122C8 */,/*39245*/20924/* 122C9 */, /*39246*/20925/* 122CA */,/*39247*/20926/* 122CB */,/*39248*/20927/* 122CC */,/*39249*/20928/* 122CD */, /*39250*/20929/* 122CE */,/*39251*/20930/* 122CF */,/*39252*/20931/* 122D0 */,/*39253*/20932/* 122D1 */, /*39254*/20933/* 122D2 */,/*39255*/20934/* 122D3 */,/*39256*/20935/* 122D4 */,/*39257*/20936/* 122D5 */, /*39258*/20937/* 122D6 */,/*39259*/20938/* 122D7 */,/*39260*/20939/* 122D8 */,/*39261*/20940/* 122D9 */, /*39262*/20941/* 122DA */,/*39263*/20942/* 122DB */,/*39264*/20943/* 122DC */,/*39265*/20944/* 122DD */, /*39266*/20945/* 122DE */,/*39267*/20946/* 122DF */,/*39268*/20947/* 122E0 */,/*39269*/20948/* 122E1 */, /*39270*/20949/* 122E2 */,/*39271*/20950/* 122E3 */,/*39272*/20951/* 122E4 */,/*39273*/20952/* 122E5 */, /*39274*/20953/* 122E6 */,/*39275*/20954/* 122E7 */,/*39276*/20955/* 122E8 */,/*39277*/20956/* 122E9 */, /*39278*/20957/* 122EA */,/*39279*/20958/* 122EB */,/*39280*/20959/* 122EC */,/*39281*/20960/* 122ED */, /*39282*/20961/* 122EE */,/*39283*/20962/* 122EF */,/*39284*/20963/* 122F0 */,/*39285*/20964/* 122F1 */, /*39286*/20965/* 122F2 */,/*39287*/20966/* 122F3 */,/*39288*/20967/* 122F4 */,/*39289*/20968/* 122F5 */, /*39290*/20969/* 122F6 */,/*39291*/20970/* 122F7 */,/*39292*/20971/* 122F8 */,/*39293*/20972/* 122F9 */, /*39294*/20973/* 122FA */,/*39295*/20974/* 122FB */,/*39296*/20975/* 122FC */,/*39297*/20976/* 122FD */, /*39298*/20977/* 122FE */,/*39299*/20978/* 122FF */,/*39300*/20979/* 12300 */,/*39301*/20980/* 12301 */, /*39302*/20981/* 12302 */,/*39303*/20982/* 12303 */,/*39304*/20983/* 12304 */,/*39305*/20984/* 12305 */, /*39306*/20985/* 12306 */,/*39307*/20986/* 12307 */,/*39308*/20987/* 12308 */,/*39309*/20988/* 12309 */, /*39310*/20989/* 1230A */,/*39311*/20990/* 1230B */,/*39312*/20991/* 1230C */,/*39313*/20992/* 1230D */, /*39314*/20993/* 1230E */,/*39315*/20994/* 1230F */,/*39316*/20995/* 12310 */,/*39317*/20996/* 12311 */, /*39318*/20997/* 12312 */,/*39319*/20998/* 12313 */,/*39320*/20999/* 12314 */,/*39321*/21000/* 12315 */, /*39322*/21001/* 12316 */,/*39323*/21002/* 12317 */,/*39324*/21003/* 12318 */,/*39325*/21004/* 12319 */, /*39326*/21005/* 1231A */,/*39327*/21006/* 1231B */,/*39328*/21007/* 1231C */,/*39329*/21008/* 1231D */, /*39330*/21009/* 1231E */,/*39331*/21010/* 1231F */,/*39332*/21011/* 12320 */,/*39333*/21012/* 12321 */, /*39334*/21013/* 12322 */,/*39335*/21014/* 12323 */,/*39336*/21015/* 12324 */,/*39337*/21016/* 12325 */, /*39338*/21017/* 12326 */,/*39339*/21018/* 12327 */,/*39340*/21019/* 12328 */,/*39341*/21020/* 12329 */, /*39342*/21021/* 1232A */,/*39343*/21022/* 1232B */,/*39344*/21023/* 1232C */,/*39345*/21024/* 1232D */, /*39346*/21025/* 1232E */,/*39347*/21026/* 1232F */,/*39348*/21027/* 12330 */,/*39349*/21028/* 12331 */, /*39350*/21029/* 12332 */,/*39351*/21030/* 12333 */,/*39352*/21031/* 12334 */,/*39353*/21032/* 12335 */, /*39354*/21033/* 12336 */,/*39355*/21034/* 12337 */,/*39356*/21035/* 12338 */,/*39357*/21036/* 12339 */, /*39358*/21037/* 1233A */,/*39359*/21038/* 1233B */,/*39360*/21039/* 1233C */,/*39361*/21040/* 1233D */, /*39362*/21041/* 1233E */,/*39363*/21042/* 1233F */,/*39364*/21043/* 12340 */,/*39365*/21044/* 12341 */, /*39366*/21045/* 12342 */,/*39367*/21046/* 12343 */,/*39368*/21047/* 12344 */,/*39369*/21048/* 12345 */, /*39370*/21049/* 12346 */,/*39371*/21050/* 12347 */,/*39372*/21051/* 12348 */,/*39373*/21052/* 12349 */, /*39374*/21053/* 1234A */,/*39375*/21054/* 1234B */,/*39376*/21055/* 1234C */,/*39377*/21056/* 1234D */, /*39378*/21057/* 1234E */,/*39379*/21058/* 1234F */,/*39380*/21059/* 12350 */,/*39381*/21060/* 12351 */, /*39382*/21061/* 12352 */,/*39383*/21062/* 12353 */,/*39384*/21063/* 12354 */,/*39385*/21064/* 12355 */, /*39386*/21065/* 12356 */,/*39387*/21066/* 12357 */,/*39388*/21067/* 12358 */,/*39389*/21068/* 12359 */, /*39390*/21069/* 1235A */,/*39391*/21070/* 1235B */,/*39392*/21071/* 1235C */,/*39393*/21072/* 1235D */, /*39394*/21073/* 1235E */,/*39395*/21074/* 1235F */,/*39396*/21075/* 12360 */,/*39397*/21076/* 12361 */, /*39398*/21077/* 12362 */,/*39399*/21078/* 12363 */,/*39400*/21079/* 12364 */,/*39401*/21080/* 12365 */, /*39402*/21081/* 12366 */,/*39403*/21082/* 12367 */,/*39404*/21083/* 12368 */,/*39405*/21084/* 12369 */, /*39406*/21085/* 1236A */,/*39407*/21086/* 1236B */,/*39408*/21087/* 1236C */,/*39409*/21088/* 1236D */, /*39410*/21089/* 1236E */,/*39411*/21090/* 1236F */,/*39412*/21091/* 12370 */,/*39413*/21092/* 12371 */, /*39414*/21093/* 12372 */,/*39415*/21094/* 12373 */,/*39416*/21095/* 12374 */,/*39417*/21096/* 12375 */, /*39418*/21097/* 12376 */,/*39419*/21098/* 12377 */,/*39420*/21099/* 12378 */,/*39421*/21100/* 12379 */, /*39422*/21101/* 1237A */,/*39423*/21102/* 1237B */,/*39424*/21103/* 1237C */,/*39425*/21104/* 1237D */, /*39426*/21105/* 1237E */,/*39427*/21106/* 1237F */,/*39428*/21107/* 12380 */,/*39429*/21108/* 12381 */, /*39430*/21109/* 12382 */,/*39431*/21110/* 12383 */,/*39432*/21111/* 12384 */,/*39433*/21112/* 12385 */, /*39434*/21113/* 12386 */,/*39435*/21114/* 12387 */,/*39436*/21115/* 12388 */,/*39437*/21116/* 12389 */, /*39438*/21117/* 1238A */,/*39439*/21118/* 1238B */,/*39440*/21119/* 1238C */,/*39441*/21120/* 1238D */, /*39442*/21121/* 1238E */,/*39443*/21122/* 1238F */,/*39444*/21123/* 12390 */,/*39445*/21124/* 12391 */, /*39446*/21125/* 12392 */,/*39447*/21126/* 12393 */,/*39448*/21127/* 12394 */,/*39449*/21128/* 12395 */, /*39450*/21129/* 12396 */,/*39451*/21130/* 12397 */,/*39452*/21131/* 12398 */,/*39453*/21132/* 12399 */,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*39556*/21133/* 12400 */,/*39557*/21134/* 12401 */, /*39558*/21135/* 12402 */,/*39559*/21136/* 12403 */,/*39560*/21137/* 12404 */,/*39561*/21138/* 12405 */, /*39562*/21139/* 12406 */,/*39563*/21140/* 12407 */,/*39564*/21134/* 12408 */,/*39565*/21135/* 12409 */, /*39566*/21136/* 1240A */,/*39567*/21137/* 1240B */,/*39568*/21138/* 1240C */,/*39569*/21139/* 1240D */, /*39570*/21140/* 1240E */,/*39571*/21135/* 1240F */,/*39572*/21136/* 12410 */,/*39573*/21137/* 12411 */, /*39574*/21138/* 12412 */,/*39575*/21139/* 12413 */,/*39576*/21140/* 12414 */,/*39577*/21141/* 12415 */, /*39578*/21133/* 12416 */,/*39579*/21134/* 12417 */,/*39580*/21135/* 12418 */,/*39581*/21136/* 12419 */, /*39582*/21137/* 1241A */,/*39583*/21138/* 1241B */,/*39584*/21139/* 1241C */,/*39585*/21140/* 1241D */, /*39586*/21141/* 1241E */,/*39587*/21133/* 1241F */,/*39588*/21134/* 12420 */,/*39589*/21135/* 12421 */, /*39590*/21136/* 12422 */,/*39591*/21133/* 12423 */,/*39592*/21134/* 12424 */,/*39593*/21134/* 12425 */, /*39594*/21135/* 12426 */,/*39595*/21136/* 12427 */,/*39596*/21137/* 12428 */,/*39597*/21138/* 12429 */, /*39598*/21139/* 1242A */,/*39599*/21140/* 1242B */,/*39600*/21141/* 1242C */,/*39601*/21133/* 1242D */, /*39602*/21134/* 1242E */,/*39603*/21134/* 1242F */,/*39604*/21135/* 12430 */,/*39605*/21136/* 12431 */, /*39606*/21142/* 12432 */,/*39607*/21143/* 12433 */,/*39608*/21141/* 12434 */,/*39609*/21133/* 12435 */, /*39610*/21134/* 12436 */,/*39611*/21134/* 12437 */,/*39612*/21135/* 12438 */,/*39613*/21136/* 12439 */, /*39614*/21134/* 1243A */,/*39615*/21134/* 1243B */,/*39616*/21135/* 1243C */,/*39617*/21135/* 1243D */, /*39618*/21135/* 1243E */,/*39619*/21135/* 1243F */,/*39620*/21137/* 12440 */,/*39621*/21138/* 12441 */, /*39622*/21138/* 12442 */,/*39623*/21138/* 12443 */,/*39624*/21139/* 12444 */,/*39625*/21139/* 12445 */, /*39626*/21140/* 12446 */,/*39627*/21140/* 12447 */,/*39628*/21140/* 12448 */,/*39629*/21140/* 12449 */, /*39630*/21133/* 1244A */,/*39631*/21134/* 1244B */,/*39632*/21135/* 1244C */,/*39633*/21136/* 1244D */, /*39634*/21137/* 1244E */,/*39635*/21141/* 1244F */,/*39636*/21133/* 12450 */,/*39637*/21134/* 12451 */, /*39638*/21135/* 12452 */,/*39639*/21135/* 12453 */,/*39640*/21136/* 12454 */,/*39641*/21136/* 12455 */, /*39642*/21133/* 12456 */,/*39643*/21134/* 12457 */,/*39644*/21141/* 12458 */,/*39645*/21133/* 12459 */, /*39646*/21144/* 1245A */,/*39647*/21145/* 1245B */,/*39648*/21146/* 1245C */,/*39649*/21147/* 1245D */, /*39650*/21148/* 1245E */,/*39651*/21149/* 1245F */,/*39652*/21150/* 12460 */,/*39653*/21151/* 12461 */, /*39654*/21152/* 12462 */,/*39655*/21153/* 12463 */,/*39656*/21154/* 12464 */,/*39657*/21155/* 12465 */, /*39658*/21156/* 12466 */,/*39659*/21157/* 12467 */,/*39660*/21158/* 12468 */,/*39661*/21159/* 12469 */, /*39662*/21160/* 1246A */,/*39663*/21161/* 1246B */,/*39664*/21162/* 1246C */,/*39665*/21163/* 1246D */, /*39666*/21164/* 1246E */,0,/*39668*/21165/* 12470 */,/*39669*/21166/* 12471 */,/*39670*/21167/* 12472 */, /*39671*/21168/* 12473 */,/*39672*/21169/* 12474 */,0,0,0,0,0,0,0,0,0,0,0,/*39684*/21170/* 12480 */, /*39685*/21171/* 12481 */,/*39686*/21172/* 12482 */,/*39687*/21173/* 12483 */,/*39688*/21174/* 12484 */, /*39689*/21175/* 12485 */,/*39690*/21176/* 12486 */,/*39691*/21177/* 12487 */,/*39692*/21178/* 12488 */, /*39693*/21179/* 12489 */,/*39694*/21180/* 1248A */,/*39695*/21181/* 1248B */,/*39696*/21182/* 1248C */, /*39697*/21183/* 1248D */,/*39698*/21184/* 1248E */,/*39699*/21185/* 1248F */,/*39700*/21186/* 12490 */, /*39701*/21187/* 12491 */,/*39702*/21188/* 12492 */,/*39703*/21189/* 12493 */,/*39704*/21190/* 12494 */, /*39705*/21191/* 12495 */,/*39706*/21192/* 12496 */,/*39707*/21193/* 12497 */,/*39708*/21194/* 12498 */, /*39709*/21195/* 12499 */,/*39710*/21196/* 1249A */,/*39711*/21197/* 1249B */,/*39712*/21198/* 1249C */, /*39713*/21199/* 1249D */,/*39714*/21200/* 1249E */,/*39715*/21201/* 1249F */,/*39716*/21202/* 124A0 */, /*39717*/21203/* 124A1 */,/*39718*/21204/* 124A2 */,/*39719*/21205/* 124A3 */,/*39720*/21206/* 124A4 */, /*39721*/21207/* 124A5 */,/*39722*/21208/* 124A6 */,/*39723*/21209/* 124A7 */,/*39724*/21210/* 124A8 */, /*39725*/21211/* 124A9 */,/*39726*/21212/* 124AA */,/*39727*/21213/* 124AB */,/*39728*/21214/* 124AC */, /*39729*/21215/* 124AD */,/*39730*/21216/* 124AE */,/*39731*/21217/* 124AF */,/*39732*/21218/* 124B0 */, /*39733*/21219/* 124B1 */,/*39734*/21220/* 124B2 */,/*39735*/21221/* 124B3 */,/*39736*/21222/* 124B4 */, /*39737*/21223/* 124B5 */,/*39738*/21224/* 124B6 */,/*39739*/21225/* 124B7 */,/*39740*/21226/* 124B8 */, /*39741*/21227/* 124B9 */,/*39742*/21228/* 124BA */,/*39743*/21229/* 124BB */,/*39744*/21230/* 124BC */, /*39745*/21231/* 124BD */,/*39746*/21232/* 124BE */,/*39747*/21233/* 124BF */,/*39748*/21234/* 124C0 */, /*39749*/21235/* 124C1 */,/*39750*/21236/* 124C2 */,/*39751*/21237/* 124C3 */,/*39752*/21238/* 124C4 */, /*39753*/21239/* 124C5 */,/*39754*/21240/* 124C6 */,/*39755*/21241/* 124C7 */,/*39756*/21242/* 124C8 */, /*39757*/21243/* 124C9 */,/*39758*/21244/* 124CA */,/*39759*/21245/* 124CB */,/*39760*/21246/* 124CC */, /*39761*/21247/* 124CD */,/*39762*/21248/* 124CE */,/*39763*/21249/* 124CF */,/*39764*/21250/* 124D0 */, /*39765*/21251/* 124D1 */,/*39766*/21252/* 124D2 */,/*39767*/21253/* 124D3 */,/*39768*/21254/* 124D4 */, /*39769*/21255/* 124D5 */,/*39770*/21256/* 124D6 */,/*39771*/21257/* 124D7 */,/*39772*/21258/* 124D8 */, /*39773*/21259/* 124D9 */,/*39774*/21260/* 124DA */,/*39775*/21261/* 124DB */,/*39776*/21262/* 124DC */, /*39777*/21263/* 124DD */,/*39778*/21264/* 124DE */,/*39779*/21265/* 124DF */,/*39780*/21266/* 124E0 */, /*39781*/21267/* 124E1 */,/*39782*/21268/* 124E2 */,/*39783*/21269/* 124E3 */,/*39784*/21270/* 124E4 */, /*39785*/21271/* 124E5 */,/*39786*/21272/* 124E6 */,/*39787*/21273/* 124E7 */,/*39788*/21274/* 124E8 */, /*39789*/21275/* 124E9 */,/*39790*/21276/* 124EA */,/*39791*/21277/* 124EB */,/*39792*/21278/* 124EC */, /*39793*/21279/* 124ED */,/*39794*/21280/* 124EE */,/*39795*/21281/* 124EF */,/*39796*/21282/* 124F0 */, /*39797*/21283/* 124F1 */,/*39798*/21284/* 124F2 */,/*39799*/21285/* 124F3 */,/*39800*/21286/* 124F4 */, /*39801*/21287/* 124F5 */,/*39802*/21288/* 124F6 */,/*39803*/21289/* 124F7 */,/*39804*/21290/* 124F8 */, /*39805*/21291/* 124F9 */,/*39806*/21292/* 124FA */,/*39807*/21293/* 124FB */,/*39808*/21294/* 124FC */, /*39809*/21295/* 124FD */,/*39810*/21296/* 124FE */,/*39811*/21297/* 124FF */,/*39812*/21298/* 12500 */, /*39813*/21299/* 12501 */,/*39814*/21300/* 12502 */,/*39815*/21301/* 12503 */,/*39816*/21302/* 12504 */, /*39817*/21303/* 12505 */,/*39818*/21304/* 12506 */,/*39819*/21305/* 12507 */,/*39820*/21306/* 12508 */, /*39821*/21307/* 12509 */,/*39822*/21308/* 1250A */,/*39823*/21309/* 1250B */,/*39824*/21310/* 1250C */, /*39825*/21311/* 1250D */,/*39826*/21312/* 1250E */,/*39827*/21313/* 1250F */,/*39828*/21314/* 12510 */, /*39829*/21315/* 12511 */,/*39830*/21316/* 12512 */,/*39831*/21317/* 12513 */,/*39832*/21318/* 12514 */, /*39833*/21319/* 12515 */,/*39834*/21320/* 12516 */,/*39835*/21321/* 12517 */,/*39836*/21322/* 12518 */, /*39837*/21323/* 12519 */,/*39838*/21324/* 1251A */,/*39839*/21325/* 1251B */,/*39840*/21326/* 1251C */, /*39841*/21327/* 1251D */,/*39842*/21328/* 1251E */,/*39843*/21329/* 1251F */,/*39844*/21330/* 12520 */, /*39845*/21331/* 12521 */,/*39846*/21332/* 12522 */,/*39847*/21333/* 12523 */,/*39848*/21334/* 12524 */, /*39849*/21335/* 12525 */,/*39850*/21336/* 12526 */,/*39851*/21337/* 12527 */,/*39852*/21338/* 12528 */, /*39853*/21339/* 12529 */,/*39854*/21340/* 1252A */,/*39855*/21341/* 1252B */,/*39856*/21342/* 1252C */, /*39857*/21343/* 1252D */,/*39858*/21344/* 1252E */,/*39859*/21345/* 1252F */,/*39860*/21346/* 12530 */, /*39861*/21347/* 12531 */,/*39862*/21348/* 12532 */,/*39863*/21349/* 12533 */,/*39864*/21350/* 12534 */, /*39865*/21351/* 12535 */,/*39866*/21352/* 12536 */,/*39867*/21353/* 12537 */,/*39868*/21354/* 12538 */, /*39869*/21355/* 12539 */,/*39870*/21356/* 1253A */,/*39871*/21357/* 1253B */,/*39872*/21358/* 1253C */, /*39873*/21359/* 1253D */,/*39874*/21360/* 1253E */,/*39875*/21361/* 1253F */,/*39876*/21362/* 12540 */, /*39877*/21363/* 12541 */,/*39878*/21364/* 12542 */,/*39879*/21365/* 12543 */,/*39880*/21366/* 13000 */, /*39881*/21367/* 13001 */,/*39882*/21368/* 13002 */,/*39883*/21369/* 13003 */,/*39884*/21370/* 13004 */, /*39885*/21371/* 13005 */,/*39886*/21372/* 13006 */,/*39887*/21373/* 13007 */,/*39888*/21374/* 13008 */, /*39889*/21375/* 13009 */,/*39890*/21376/* 1300A */,/*39891*/21377/* 1300B */,/*39892*/21378/* 1300C */, /*39893*/21379/* 1300D */,/*39894*/21380/* 1300E */,/*39895*/21381/* 1300F */,/*39896*/21382/* 13010 */, /*39897*/21383/* 13011 */,/*39898*/21384/* 13012 */,/*39899*/21385/* 13013 */,/*39900*/21386/* 13014 */, /*39901*/21387/* 13015 */,/*39902*/21388/* 13016 */,/*39903*/21389/* 13017 */,/*39904*/21390/* 13018 */, /*39905*/21391/* 13019 */,/*39906*/21392/* 1301A */,/*39907*/21393/* 1301B */,/*39908*/21394/* 1301C */, /*39909*/21395/* 1301D */,/*39910*/21396/* 1301E */,/*39911*/21397/* 1301F */,/*39912*/21398/* 13020 */, /*39913*/21399/* 13021 */,/*39914*/21400/* 13022 */,/*39915*/21401/* 13023 */,/*39916*/21402/* 13024 */, /*39917*/21403/* 13025 */,/*39918*/21404/* 13026 */,/*39919*/21405/* 13027 */,/*39920*/21406/* 13028 */, /*39921*/21407/* 13029 */,/*39922*/21408/* 1302A */,/*39923*/21409/* 1302B */,/*39924*/21410/* 1302C */, /*39925*/21411/* 1302D */,/*39926*/21412/* 1302E */,/*39927*/21413/* 1302F */,/*39928*/21414/* 13030 */, /*39929*/21415/* 13031 */,/*39930*/21416/* 13032 */,/*39931*/21417/* 13033 */,/*39932*/21418/* 13034 */, /*39933*/21419/* 13035 */,/*39934*/21420/* 13036 */,/*39935*/21421/* 13037 */,/*39936*/21422/* 13038 */, /*39937*/21423/* 13039 */,/*39938*/21424/* 1303A */,/*39939*/21425/* 1303B */,/*39940*/21426/* 1303C */, /*39941*/21427/* 1303D */,/*39942*/21428/* 1303E */,/*39943*/21429/* 1303F */,/*39944*/21430/* 13040 */, /*39945*/21431/* 13041 */,/*39946*/21432/* 13042 */,/*39947*/21433/* 13043 */,/*39948*/21434/* 13044 */, /*39949*/21435/* 13045 */,/*39950*/21436/* 13046 */,/*39951*/21437/* 13047 */,/*39952*/21438/* 13048 */, /*39953*/21439/* 13049 */,/*39954*/21440/* 1304A */,/*39955*/21441/* 1304B */,/*39956*/21442/* 1304C */, /*39957*/21443/* 1304D */,/*39958*/21444/* 1304E */,/*39959*/21445/* 1304F */,/*39960*/21446/* 13050 */, /*39961*/21447/* 13051 */,/*39962*/21448/* 13052 */,/*39963*/21449/* 13053 */,/*39964*/21450/* 13054 */, /*39965*/21451/* 13055 */,/*39966*/21452/* 13056 */,/*39967*/21453/* 13057 */,/*39968*/21454/* 13058 */, /*39969*/21455/* 13059 */,/*39970*/21456/* 1305A */,/*39971*/21457/* 1305B */,/*39972*/21458/* 1305C */, /*39973*/21459/* 1305D */,/*39974*/21460/* 1305E */,/*39975*/21461/* 1305F */,/*39976*/21462/* 13060 */, /*39977*/21463/* 13061 */,/*39978*/21464/* 13062 */,/*39979*/21465/* 13063 */,/*39980*/21466/* 13064 */, /*39981*/21467/* 13065 */,/*39982*/21468/* 13066 */,/*39983*/21469/* 13067 */,/*39984*/21470/* 13068 */, /*39985*/21471/* 13069 */,/*39986*/21472/* 1306A */,/*39987*/21473/* 1306B */,/*39988*/21474/* 1306C */, /*39989*/21475/* 1306D */,/*39990*/21476/* 1306E */,/*39991*/21477/* 1306F */,/*39992*/21478/* 13070 */, /*39993*/21479/* 13071 */,/*39994*/21480/* 13072 */,/*39995*/21481/* 13073 */,/*39996*/21482/* 13074 */, /*39997*/21483/* 13075 */,/*39998*/21484/* 13076 */,/*39999*/21485/* 13077 */,/*40000*/21486/* 13078 */, /*40001*/21487/* 13079 */,/*40002*/21488/* 1307A */,/*40003*/21489/* 1307B */,/*40004*/21490/* 1307C */, /*40005*/21491/* 1307D */,/*40006*/21492/* 1307E */,/*40007*/21493/* 1307F */,/*40008*/21494/* 13080 */, /*40009*/21495/* 13081 */,/*40010*/21496/* 13082 */,/*40011*/21497/* 13083 */,/*40012*/21498/* 13084 */, /*40013*/21499/* 13085 */,/*40014*/21500/* 13086 */,/*40015*/21501/* 13087 */,/*40016*/21502/* 13088 */, /*40017*/21503/* 13089 */,/*40018*/21504/* 1308A */,/*40019*/21505/* 1308B */,/*40020*/21506/* 1308C */, /*40021*/21507/* 1308D */,/*40022*/21508/* 1308E */,/*40023*/21509/* 1308F */,/*40024*/21510/* 13090 */, /*40025*/21511/* 13091 */,/*40026*/21512/* 13092 */,/*40027*/21513/* 13093 */,/*40028*/21514/* 13094 */, /*40029*/21515/* 13095 */,/*40030*/21516/* 13096 */,/*40031*/21517/* 13097 */,/*40032*/21518/* 13098 */, /*40033*/21519/* 13099 */,/*40034*/21520/* 1309A */,/*40035*/21521/* 1309B */,/*40036*/21522/* 1309C */, /*40037*/21523/* 1309D */,/*40038*/21524/* 1309E */,/*40039*/21525/* 1309F */,/*40040*/21526/* 130A0 */, /*40041*/21527/* 130A1 */,/*40042*/21528/* 130A2 */,/*40043*/21529/* 130A3 */,/*40044*/21530/* 130A4 */, /*40045*/21531/* 130A5 */,/*40046*/21532/* 130A6 */,/*40047*/21533/* 130A7 */,/*40048*/21534/* 130A8 */, /*40049*/21535/* 130A9 */,/*40050*/21536/* 130AA */,/*40051*/21537/* 130AB */,/*40052*/21538/* 130AC */, /*40053*/21539/* 130AD */,/*40054*/21540/* 130AE */,/*40055*/21541/* 130AF */,/*40056*/21542/* 130B0 */, /*40057*/21543/* 130B1 */,/*40058*/21544/* 130B2 */,/*40059*/21545/* 130B3 */,/*40060*/21546/* 130B4 */, /*40061*/21547/* 130B5 */,/*40062*/21548/* 130B6 */,/*40063*/21549/* 130B7 */,/*40064*/21550/* 130B8 */, /*40065*/21551/* 130B9 */,/*40066*/21552/* 130BA */,/*40067*/21553/* 130BB */,/*40068*/21554/* 130BC */, /*40069*/21555/* 130BD */,/*40070*/21556/* 130BE */,/*40071*/21557/* 130BF */,/*40072*/21558/* 130C0 */, /*40073*/21559/* 130C1 */,/*40074*/21560/* 130C2 */,/*40075*/21561/* 130C3 */,/*40076*/21562/* 130C4 */, /*40077*/21563/* 130C5 */,/*40078*/21564/* 130C6 */,/*40079*/21565/* 130C7 */,/*40080*/21566/* 130C8 */, /*40081*/21567/* 130C9 */,/*40082*/21568/* 130CA */,/*40083*/21569/* 130CB */,/*40084*/21570/* 130CC */, /*40085*/21571/* 130CD */,/*40086*/21572/* 130CE */,/*40087*/21573/* 130CF */,/*40088*/21574/* 130D0 */, /*40089*/21575/* 130D1 */,/*40090*/21576/* 130D2 */,/*40091*/21577/* 130D3 */,/*40092*/21578/* 130D4 */, /*40093*/21579/* 130D5 */,/*40094*/21580/* 130D6 */,/*40095*/21581/* 130D7 */,/*40096*/21582/* 130D8 */, /*40097*/21583/* 130D9 */,/*40098*/21584/* 130DA */,/*40099*/21585/* 130DB */,/*40100*/21586/* 130DC */, /*40101*/21587/* 130DD */,/*40102*/21588/* 130DE */,/*40103*/21589/* 130DF */,/*40104*/21590/* 130E0 */, /*40105*/21591/* 130E1 */,/*40106*/21592/* 130E2 */,/*40107*/21593/* 130E3 */,/*40108*/21594/* 130E4 */, /*40109*/21595/* 130E5 */,/*40110*/21596/* 130E6 */,/*40111*/21597/* 130E7 */,/*40112*/21598/* 130E8 */, /*40113*/21599/* 130E9 */,/*40114*/21600/* 130EA */,/*40115*/21601/* 130EB */,/*40116*/21602/* 130EC */, /*40117*/21603/* 130ED */,/*40118*/21604/* 130EE */,/*40119*/21605/* 130EF */,/*40120*/21606/* 130F0 */, /*40121*/21607/* 130F1 */,/*40122*/21608/* 130F2 */,/*40123*/21609/* 130F3 */,/*40124*/21610/* 130F4 */, /*40125*/21611/* 130F5 */,/*40126*/21612/* 130F6 */,/*40127*/21613/* 130F7 */,/*40128*/21614/* 130F8 */, /*40129*/21615/* 130F9 */,/*40130*/21616/* 130FA */,/*40131*/21617/* 130FB */,/*40132*/21618/* 130FC */, /*40133*/21619/* 130FD */,/*40134*/21620/* 130FE */,/*40135*/21621/* 130FF */,/*40136*/21622/* 13100 */, /*40137*/21623/* 13101 */,/*40138*/21624/* 13102 */,/*40139*/21625/* 13103 */,/*40140*/21626/* 13104 */, /*40141*/21627/* 13105 */,/*40142*/21628/* 13106 */,/*40143*/21629/* 13107 */,/*40144*/21630/* 13108 */, /*40145*/21631/* 13109 */,/*40146*/21632/* 1310A */,/*40147*/21633/* 1310B */,/*40148*/21634/* 1310C */, /*40149*/21635/* 1310D */,/*40150*/21636/* 1310E */,/*40151*/21637/* 1310F */,/*40152*/21638/* 13110 */, /*40153*/21639/* 13111 */,/*40154*/21640/* 13112 */,/*40155*/21641/* 13113 */,/*40156*/21642/* 13114 */, /*40157*/21643/* 13115 */,/*40158*/21644/* 13116 */,/*40159*/21645/* 13117 */,/*40160*/21646/* 13118 */, /*40161*/21647/* 13119 */,/*40162*/21648/* 1311A */,/*40163*/21649/* 1311B */,/*40164*/21650/* 1311C */, /*40165*/21651/* 1311D */,/*40166*/21652/* 1311E */,/*40167*/21653/* 1311F */,/*40168*/21654/* 13120 */, /*40169*/21655/* 13121 */,/*40170*/21656/* 13122 */,/*40171*/21657/* 13123 */,/*40172*/21658/* 13124 */, /*40173*/21659/* 13125 */,/*40174*/21660/* 13126 */,/*40175*/21661/* 13127 */,/*40176*/21662/* 13128 */, /*40177*/21663/* 13129 */,/*40178*/21664/* 1312A */,/*40179*/21665/* 1312B */,/*40180*/21666/* 1312C */, /*40181*/21667/* 1312D */,/*40182*/21668/* 1312E */,/*40183*/21669/* 1312F */,/*40184*/21670/* 13130 */, /*40185*/21671/* 13131 */,/*40186*/21672/* 13132 */,/*40187*/21673/* 13133 */,/*40188*/21674/* 13134 */, /*40189*/21675/* 13135 */,/*40190*/21676/* 13136 */,/*40191*/21677/* 13137 */,/*40192*/21678/* 13138 */, /*40193*/21679/* 13139 */,/*40194*/21680/* 1313A */,/*40195*/21681/* 1313B */,/*40196*/21682/* 1313C */, /*40197*/21683/* 1313D */,/*40198*/21684/* 1313E */,/*40199*/21685/* 1313F */,/*40200*/21686/* 13140 */, /*40201*/21687/* 13141 */,/*40202*/21688/* 13142 */,/*40203*/21689/* 13143 */,/*40204*/21690/* 13144 */, /*40205*/21691/* 13145 */,/*40206*/21692/* 13146 */,/*40207*/21693/* 13147 */,/*40208*/21694/* 13148 */, /*40209*/21695/* 13149 */,/*40210*/21696/* 1314A */,/*40211*/21697/* 1314B */,/*40212*/21698/* 1314C */, /*40213*/21699/* 1314D */,/*40214*/21700/* 1314E */,/*40215*/21701/* 1314F */,/*40216*/21702/* 13150 */, /*40217*/21703/* 13151 */,/*40218*/21704/* 13152 */,/*40219*/21705/* 13153 */,/*40220*/21706/* 13154 */, /*40221*/21707/* 13155 */,/*40222*/21708/* 13156 */,/*40223*/21709/* 13157 */,/*40224*/21710/* 13158 */, /*40225*/21711/* 13159 */,/*40226*/21712/* 1315A */,/*40227*/21713/* 1315B */,/*40228*/21714/* 1315C */, /*40229*/21715/* 1315D */,/*40230*/21716/* 1315E */,/*40231*/21717/* 1315F */,/*40232*/21718/* 13160 */, /*40233*/21719/* 13161 */,/*40234*/21720/* 13162 */,/*40235*/21721/* 13163 */,/*40236*/21722/* 13164 */, /*40237*/21723/* 13165 */,/*40238*/21724/* 13166 */,/*40239*/21725/* 13167 */,/*40240*/21726/* 13168 */, /*40241*/21727/* 13169 */,/*40242*/21728/* 1316A */,/*40243*/21729/* 1316B */,/*40244*/21730/* 1316C */, /*40245*/21731/* 1316D */,/*40246*/21732/* 1316E */,/*40247*/21733/* 1316F */,/*40248*/21734/* 13170 */, /*40249*/21735/* 13171 */,/*40250*/21736/* 13172 */,/*40251*/21737/* 13173 */,/*40252*/21738/* 13174 */, /*40253*/21739/* 13175 */,/*40254*/21740/* 13176 */,/*40255*/21741/* 13177 */,/*40256*/21742/* 13178 */, /*40257*/21743/* 13179 */,/*40258*/21744/* 1317A */,/*40259*/21745/* 1317B */,/*40260*/21746/* 1317C */, /*40261*/21747/* 1317D */,/*40262*/21748/* 1317E */,/*40263*/21749/* 1317F */,/*40264*/21750/* 13180 */, /*40265*/21751/* 13181 */,/*40266*/21752/* 13182 */,/*40267*/21753/* 13183 */,/*40268*/21754/* 13184 */, /*40269*/21755/* 13185 */,/*40270*/21756/* 13186 */,/*40271*/21757/* 13187 */,/*40272*/21758/* 13188 */, /*40273*/21759/* 13189 */,/*40274*/21760/* 1318A */,/*40275*/21761/* 1318B */,/*40276*/21762/* 1318C */, /*40277*/21763/* 1318D */,/*40278*/21764/* 1318E */,/*40279*/21765/* 1318F */,/*40280*/21766/* 13190 */, /*40281*/21767/* 13191 */,/*40282*/21768/* 13192 */,/*40283*/21769/* 13193 */,/*40284*/21770/* 13194 */, /*40285*/21771/* 13195 */,/*40286*/21772/* 13196 */,/*40287*/21773/* 13197 */,/*40288*/21774/* 13198 */, /*40289*/21775/* 13199 */,/*40290*/21776/* 1319A */,/*40291*/21777/* 1319B */,/*40292*/21778/* 1319C */, /*40293*/21779/* 1319D */,/*40294*/21780/* 1319E */,/*40295*/21781/* 1319F */,/*40296*/21782/* 131A0 */, /*40297*/21783/* 131A1 */,/*40298*/21784/* 131A2 */,/*40299*/21785/* 131A3 */,/*40300*/21786/* 131A4 */, /*40301*/21787/* 131A5 */,/*40302*/21788/* 131A6 */,/*40303*/21789/* 131A7 */,/*40304*/21790/* 131A8 */, /*40305*/21791/* 131A9 */,/*40306*/21792/* 131AA */,/*40307*/21793/* 131AB */,/*40308*/21794/* 131AC */, /*40309*/21795/* 131AD */,/*40310*/21796/* 131AE */,/*40311*/21797/* 131AF */,/*40312*/21798/* 131B0 */, /*40313*/21799/* 131B1 */,/*40314*/21800/* 131B2 */,/*40315*/21801/* 131B3 */,/*40316*/21802/* 131B4 */, /*40317*/21803/* 131B5 */,/*40318*/21804/* 131B6 */,/*40319*/21805/* 131B7 */,/*40320*/21806/* 131B8 */, /*40321*/21807/* 131B9 */,/*40322*/21808/* 131BA */,/*40323*/21809/* 131BB */,/*40324*/21810/* 131BC */, /*40325*/21811/* 131BD */,/*40326*/21812/* 131BE */,/*40327*/21813/* 131BF */,/*40328*/21814/* 131C0 */, /*40329*/21815/* 131C1 */,/*40330*/21816/* 131C2 */,/*40331*/21817/* 131C3 */,/*40332*/21818/* 131C4 */, /*40333*/21819/* 131C5 */,/*40334*/21820/* 131C6 */,/*40335*/21821/* 131C7 */,/*40336*/21822/* 131C8 */, /*40337*/21823/* 131C9 */,/*40338*/21824/* 131CA */,/*40339*/21825/* 131CB */,/*40340*/21826/* 131CC */, /*40341*/21827/* 131CD */,/*40342*/21828/* 131CE */,/*40343*/21829/* 131CF */,/*40344*/21830/* 131D0 */, /*40345*/21831/* 131D1 */,/*40346*/21832/* 131D2 */,/*40347*/21833/* 131D3 */,/*40348*/21834/* 131D4 */, /*40349*/21835/* 131D5 */,/*40350*/21836/* 131D6 */,/*40351*/21837/* 131D7 */,/*40352*/21838/* 131D8 */, /*40353*/21839/* 131D9 */,/*40354*/21840/* 131DA */,/*40355*/21841/* 131DB */,/*40356*/21842/* 131DC */, /*40357*/21843/* 131DD */,/*40358*/21844/* 131DE */,/*40359*/21845/* 131DF */,/*40360*/21846/* 131E0 */, /*40361*/21847/* 131E1 */,/*40362*/21848/* 131E2 */,/*40363*/21849/* 131E3 */,/*40364*/21850/* 131E4 */, /*40365*/21851/* 131E5 */,/*40366*/21852/* 131E6 */,/*40367*/21853/* 131E7 */,/*40368*/21854/* 131E8 */, /*40369*/21855/* 131E9 */,/*40370*/21856/* 131EA */,/*40371*/21857/* 131EB */,/*40372*/21858/* 131EC */, /*40373*/21859/* 131ED */,/*40374*/21860/* 131EE */,/*40375*/21861/* 131EF */,/*40376*/21862/* 131F0 */, /*40377*/21863/* 131F1 */,/*40378*/21864/* 131F2 */,/*40379*/21865/* 131F3 */,/*40380*/21866/* 131F4 */, /*40381*/21867/* 131F5 */,/*40382*/21868/* 131F6 */,/*40383*/21869/* 131F7 */,/*40384*/21870/* 131F8 */, /*40385*/21871/* 131F9 */,/*40386*/21872/* 131FA */,/*40387*/21873/* 131FB */,/*40388*/21874/* 131FC */, /*40389*/21875/* 131FD */,/*40390*/21876/* 131FE */,/*40391*/21877/* 131FF */,/*40392*/21878/* 13200 */, /*40393*/21879/* 13201 */,/*40394*/21880/* 13202 */,/*40395*/21881/* 13203 */,/*40396*/21882/* 13204 */, /*40397*/21883/* 13205 */,/*40398*/21884/* 13206 */,/*40399*/21885/* 13207 */,/*40400*/21886/* 13208 */, /*40401*/21887/* 13209 */,/*40402*/21888/* 1320A */,/*40403*/21889/* 1320B */,/*40404*/21890/* 1320C */, /*40405*/21891/* 1320D */,/*40406*/21892/* 1320E */,/*40407*/21893/* 1320F */,/*40408*/21894/* 13210 */, /*40409*/21895/* 13211 */,/*40410*/21896/* 13212 */,/*40411*/21897/* 13213 */,/*40412*/21898/* 13214 */, /*40413*/21899/* 13215 */,/*40414*/21900/* 13216 */,/*40415*/21901/* 13217 */,/*40416*/21902/* 13218 */, /*40417*/21903/* 13219 */,/*40418*/21904/* 1321A */,/*40419*/21905/* 1321B */,/*40420*/21906/* 1321C */, /*40421*/21907/* 1321D */,/*40422*/21908/* 1321E */,/*40423*/21909/* 1321F */,/*40424*/21910/* 13220 */, /*40425*/21911/* 13221 */,/*40426*/21912/* 13222 */,/*40427*/21913/* 13223 */,/*40428*/21914/* 13224 */, /*40429*/21915/* 13225 */,/*40430*/21916/* 13226 */,/*40431*/21917/* 13227 */,/*40432*/21918/* 13228 */, /*40433*/21919/* 13229 */,/*40434*/21920/* 1322A */,/*40435*/21921/* 1322B */,/*40436*/21922/* 1322C */, /*40437*/21923/* 1322D */,/*40438*/21924/* 1322E */,/*40439*/21925/* 1322F */,/*40440*/21926/* 13230 */, /*40441*/21927/* 13231 */,/*40442*/21928/* 13232 */,/*40443*/21929/* 13233 */,/*40444*/21930/* 13234 */, /*40445*/21931/* 13235 */,/*40446*/21932/* 13236 */,/*40447*/21933/* 13237 */,/*40448*/21934/* 13238 */, /*40449*/21935/* 13239 */,/*40450*/21936/* 1323A */,/*40451*/21937/* 1323B */,/*40452*/21938/* 1323C */, /*40453*/21939/* 1323D */,/*40454*/21940/* 1323E */,/*40455*/21941/* 1323F */,/*40456*/21942/* 13240 */, /*40457*/21943/* 13241 */,/*40458*/21944/* 13242 */,/*40459*/21945/* 13243 */,/*40460*/21946/* 13244 */, /*40461*/21947/* 13245 */,/*40462*/21948/* 13246 */,/*40463*/21949/* 13247 */,/*40464*/21950/* 13248 */, /*40465*/21951/* 13249 */,/*40466*/21952/* 1324A */,/*40467*/21953/* 1324B */,/*40468*/21954/* 1324C */, /*40469*/21955/* 1324D */,/*40470*/21956/* 1324E */,/*40471*/21957/* 1324F */,/*40472*/21958/* 13250 */, /*40473*/21959/* 13251 */,/*40474*/21960/* 13252 */,/*40475*/21961/* 13253 */,/*40476*/21962/* 13254 */, /*40477*/21963/* 13255 */,/*40478*/21964/* 13256 */,/*40479*/21965/* 13257 */,/*40480*/21966/* 13258 */, /*40481*/21967/* 13259 */,/*40482*/21968/* 1325A */,/*40483*/21969/* 1325B */,/*40484*/21970/* 1325C */, /*40485*/21971/* 1325D */,/*40486*/21972/* 1325E */,/*40487*/21973/* 1325F */,/*40488*/21974/* 13260 */, /*40489*/21975/* 13261 */,/*40490*/21976/* 13262 */,/*40491*/21977/* 13263 */,/*40492*/21978/* 13264 */, /*40493*/21979/* 13265 */,/*40494*/21980/* 13266 */,/*40495*/21981/* 13267 */,/*40496*/21982/* 13268 */, /*40497*/21983/* 13269 */,/*40498*/21984/* 1326A */,/*40499*/21985/* 1326B */,/*40500*/21986/* 1326C */, /*40501*/21987/* 1326D */,/*40502*/21988/* 1326E */,/*40503*/21989/* 1326F */,/*40504*/21990/* 13270 */, /*40505*/21991/* 13271 */,/*40506*/21992/* 13272 */,/*40507*/21993/* 13273 */,/*40508*/21994/* 13274 */, /*40509*/21995/* 13275 */,/*40510*/21996/* 13276 */,/*40511*/21997/* 13277 */,/*40512*/21998/* 13278 */, /*40513*/21999/* 13279 */,/*40514*/22000/* 1327A */,/*40515*/22001/* 1327B */,/*40516*/22002/* 1327C */, /*40517*/22003/* 1327D */,/*40518*/22004/* 1327E */,/*40519*/22005/* 1327F */,/*40520*/22006/* 13280 */, /*40521*/22007/* 13281 */,/*40522*/22008/* 13282 */,/*40523*/22009/* 13283 */,/*40524*/22010/* 13284 */, /*40525*/22011/* 13285 */,/*40526*/22012/* 13286 */,/*40527*/22013/* 13287 */,/*40528*/22014/* 13288 */, /*40529*/22015/* 13289 */,/*40530*/22016/* 1328A */,/*40531*/22017/* 1328B */,/*40532*/22018/* 1328C */, /*40533*/22019/* 1328D */,/*40534*/22020/* 1328E */,/*40535*/22021/* 1328F */,/*40536*/22022/* 13290 */, /*40537*/22023/* 13291 */,/*40538*/22024/* 13292 */,/*40539*/22025/* 13293 */,/*40540*/22026/* 13294 */, /*40541*/22027/* 13295 */,/*40542*/22028/* 13296 */,/*40543*/22029/* 13297 */,/*40544*/22030/* 13298 */, /*40545*/22031/* 13299 */,/*40546*/22032/* 1329A */,/*40547*/22033/* 1329B */,/*40548*/22034/* 1329C */, /*40549*/22035/* 1329D */,/*40550*/22036/* 1329E */,/*40551*/22037/* 1329F */,/*40552*/22038/* 132A0 */, /*40553*/22039/* 132A1 */,/*40554*/22040/* 132A2 */,/*40555*/22041/* 132A3 */,/*40556*/22042/* 132A4 */, /*40557*/22043/* 132A5 */,/*40558*/22044/* 132A6 */,/*40559*/22045/* 132A7 */,/*40560*/22046/* 132A8 */, /*40561*/22047/* 132A9 */,/*40562*/22048/* 132AA */,/*40563*/22049/* 132AB */,/*40564*/22050/* 132AC */, /*40565*/22051/* 132AD */,/*40566*/22052/* 132AE */,/*40567*/22053/* 132AF */,/*40568*/22054/* 132B0 */, /*40569*/22055/* 132B1 */,/*40570*/22056/* 132B2 */,/*40571*/22057/* 132B3 */,/*40572*/22058/* 132B4 */, /*40573*/22059/* 132B5 */,/*40574*/22060/* 132B6 */,/*40575*/22061/* 132B7 */,/*40576*/22062/* 132B8 */, /*40577*/22063/* 132B9 */,/*40578*/22064/* 132BA */,/*40579*/22065/* 132BB */,/*40580*/22066/* 132BC */, /*40581*/22067/* 132BD */,/*40582*/22068/* 132BE */,/*40583*/22069/* 132BF */,/*40584*/22070/* 132C0 */, /*40585*/22071/* 132C1 */,/*40586*/22072/* 132C2 */,/*40587*/22073/* 132C3 */,/*40588*/22074/* 132C4 */, /*40589*/22075/* 132C5 */,/*40590*/22076/* 132C6 */,/*40591*/22077/* 132C7 */,/*40592*/22078/* 132C8 */, /*40593*/22079/* 132C9 */,/*40594*/22080/* 132CA */,/*40595*/22081/* 132CB */,/*40596*/22082/* 132CC */, /*40597*/22083/* 132CD */,/*40598*/22084/* 132CE */,/*40599*/22085/* 132CF */,/*40600*/22086/* 132D0 */, /*40601*/22087/* 132D1 */,/*40602*/22088/* 132D2 */,/*40603*/22089/* 132D3 */,/*40604*/22090/* 132D4 */, /*40605*/22091/* 132D5 */,/*40606*/22092/* 132D6 */,/*40607*/22093/* 132D7 */,/*40608*/22094/* 132D8 */, /*40609*/22095/* 132D9 */,/*40610*/22096/* 132DA */,/*40611*/22097/* 132DB */,/*40612*/22098/* 132DC */, /*40613*/22099/* 132DD */,/*40614*/22100/* 132DE */,/*40615*/22101/* 132DF */,/*40616*/22102/* 132E0 */, /*40617*/22103/* 132E1 */,/*40618*/22104/* 132E2 */,/*40619*/22105/* 132E3 */,/*40620*/22106/* 132E4 */, /*40621*/22107/* 132E5 */,/*40622*/22108/* 132E6 */,/*40623*/22109/* 132E7 */,/*40624*/22110/* 132E8 */, /*40625*/22111/* 132E9 */,/*40626*/22112/* 132EA */,/*40627*/22113/* 132EB */,/*40628*/22114/* 132EC */, /*40629*/22115/* 132ED */,/*40630*/22116/* 132EE */,/*40631*/22117/* 132EF */,/*40632*/22118/* 132F0 */, /*40633*/22119/* 132F1 */,/*40634*/22120/* 132F2 */,/*40635*/22121/* 132F3 */,/*40636*/22122/* 132F4 */, /*40637*/22123/* 132F5 */,/*40638*/22124/* 132F6 */,/*40639*/22125/* 132F7 */,/*40640*/22126/* 132F8 */, /*40641*/22127/* 132F9 */,/*40642*/22128/* 132FA */,/*40643*/22129/* 132FB */,/*40644*/22130/* 132FC */, /*40645*/22131/* 132FD */,/*40646*/22132/* 132FE */,/*40647*/22133/* 132FF */,/*40648*/22134/* 13300 */, /*40649*/22135/* 13301 */,/*40650*/22136/* 13302 */,/*40651*/22137/* 13303 */,/*40652*/22138/* 13304 */, /*40653*/22139/* 13305 */,/*40654*/22140/* 13306 */,/*40655*/22141/* 13307 */,/*40656*/22142/* 13308 */, /*40657*/22143/* 13309 */,/*40658*/22144/* 1330A */,/*40659*/22145/* 1330B */,/*40660*/22146/* 1330C */, /*40661*/22147/* 1330D */,/*40662*/22148/* 1330E */,/*40663*/22149/* 1330F */,/*40664*/22150/* 13310 */, /*40665*/22151/* 13311 */,/*40666*/22152/* 13312 */,/*40667*/22153/* 13313 */,/*40668*/22154/* 13314 */, /*40669*/22155/* 13315 */,/*40670*/22156/* 13316 */,/*40671*/22157/* 13317 */,/*40672*/22158/* 13318 */, /*40673*/22159/* 13319 */,/*40674*/22160/* 1331A */,/*40675*/22161/* 1331B */,/*40676*/22162/* 1331C */, /*40677*/22163/* 1331D */,/*40678*/22164/* 1331E */,/*40679*/22165/* 1331F */,/*40680*/22166/* 13320 */, /*40681*/22167/* 13321 */,/*40682*/22168/* 13322 */,/*40683*/22169/* 13323 */,/*40684*/22170/* 13324 */, /*40685*/22171/* 13325 */,/*40686*/22172/* 13326 */,/*40687*/22173/* 13327 */,/*40688*/22174/* 13328 */, /*40689*/22175/* 13329 */,/*40690*/22176/* 1332A */,/*40691*/22177/* 1332B */,/*40692*/22178/* 1332C */, /*40693*/22179/* 1332D */,/*40694*/22180/* 1332E */,/*40695*/22181/* 1332F */,/*40696*/22182/* 13330 */, /*40697*/22183/* 13331 */,/*40698*/22184/* 13332 */,/*40699*/22185/* 13333 */,/*40700*/22186/* 13334 */, /*40701*/22187/* 13335 */,/*40702*/22188/* 13336 */,/*40703*/22189/* 13337 */,/*40704*/22190/* 13338 */, /*40705*/22191/* 13339 */,/*40706*/22192/* 1333A */,/*40707*/22193/* 1333B */,/*40708*/22194/* 1333C */, /*40709*/22195/* 1333D */,/*40710*/22196/* 1333E */,/*40711*/22197/* 1333F */,/*40712*/22198/* 13340 */, /*40713*/22199/* 13341 */,/*40714*/22200/* 13342 */,/*40715*/22201/* 13343 */,/*40716*/22202/* 13344 */, /*40717*/22203/* 13345 */,/*40718*/22204/* 13346 */,/*40719*/22205/* 13347 */,/*40720*/22206/* 13348 */, /*40721*/22207/* 13349 */,/*40722*/22208/* 1334A */,/*40723*/22209/* 1334B */,/*40724*/22210/* 1334C */, /*40725*/22211/* 1334D */,/*40726*/22212/* 1334E */,/*40727*/22213/* 1334F */,/*40728*/22214/* 13350 */, /*40729*/22215/* 13351 */,/*40730*/22216/* 13352 */,/*40731*/22217/* 13353 */,/*40732*/22218/* 13354 */, /*40733*/22219/* 13355 */,/*40734*/22220/* 13356 */,/*40735*/22221/* 13357 */,/*40736*/22222/* 13358 */, /*40737*/22223/* 13359 */,/*40738*/22224/* 1335A */,/*40739*/22225/* 1335B */,/*40740*/22226/* 1335C */, /*40741*/22227/* 1335D */,/*40742*/22228/* 1335E */,/*40743*/22229/* 1335F */,/*40744*/22230/* 13360 */, /*40745*/22231/* 13361 */,/*40746*/22232/* 13362 */,/*40747*/22233/* 13363 */,/*40748*/22234/* 13364 */, /*40749*/22235/* 13365 */,/*40750*/22236/* 13366 */,/*40751*/22237/* 13367 */,/*40752*/22238/* 13368 */, /*40753*/22239/* 13369 */,/*40754*/22240/* 1336A */,/*40755*/22241/* 1336B */,/*40756*/22242/* 1336C */, /*40757*/22243/* 1336D */,/*40758*/22244/* 1336E */,/*40759*/22245/* 1336F */,/*40760*/22246/* 13370 */, /*40761*/22247/* 13371 */,/*40762*/22248/* 13372 */,/*40763*/22249/* 13373 */,/*40764*/22250/* 13374 */, /*40765*/22251/* 13375 */,/*40766*/22252/* 13376 */,/*40767*/22253/* 13377 */,/*40768*/22254/* 13378 */, /*40769*/22255/* 13379 */,/*40770*/22256/* 1337A */,/*40771*/22257/* 1337B */,/*40772*/22258/* 1337C */, /*40773*/22259/* 1337D */,/*40774*/22260/* 1337E */,/*40775*/22261/* 1337F */,/*40776*/22262/* 13380 */, /*40777*/22263/* 13381 */,/*40778*/22264/* 13382 */,/*40779*/22265/* 13383 */,/*40780*/22266/* 13384 */, /*40781*/22267/* 13385 */,/*40782*/22268/* 13386 */,/*40783*/22269/* 13387 */,/*40784*/22270/* 13388 */, /*40785*/22271/* 13389 */,/*40786*/22272/* 1338A */,/*40787*/22273/* 1338B */,/*40788*/22274/* 1338C */, /*40789*/22275/* 1338D */,/*40790*/22276/* 1338E */,/*40791*/22277/* 1338F */,/*40792*/22278/* 13390 */, /*40793*/22279/* 13391 */,/*40794*/22280/* 13392 */,/*40795*/22281/* 13393 */,/*40796*/22282/* 13394 */, /*40797*/22283/* 13395 */,/*40798*/22284/* 13396 */,/*40799*/22285/* 13397 */,/*40800*/22286/* 13398 */, /*40801*/22287/* 13399 */,/*40802*/22288/* 1339A */,/*40803*/22289/* 1339B */,/*40804*/22290/* 1339C */, /*40805*/22291/* 1339D */,/*40806*/22292/* 1339E */,/*40807*/22293/* 1339F */,/*40808*/22294/* 133A0 */, /*40809*/22295/* 133A1 */,/*40810*/22296/* 133A2 */,/*40811*/22297/* 133A3 */,/*40812*/22298/* 133A4 */, /*40813*/22299/* 133A5 */,/*40814*/22300/* 133A6 */,/*40815*/22301/* 133A7 */,/*40816*/22302/* 133A8 */, /*40817*/22303/* 133A9 */,/*40818*/22304/* 133AA */,/*40819*/22305/* 133AB */,/*40820*/22306/* 133AC */, /*40821*/22307/* 133AD */,/*40822*/22308/* 133AE */,/*40823*/22309/* 133AF */,/*40824*/22310/* 133B0 */, /*40825*/22311/* 133B1 */,/*40826*/22312/* 133B2 */,/*40827*/22313/* 133B3 */,/*40828*/22314/* 133B4 */, /*40829*/22315/* 133B5 */,/*40830*/22316/* 133B6 */,/*40831*/22317/* 133B7 */,/*40832*/22318/* 133B8 */, /*40833*/22319/* 133B9 */,/*40834*/22320/* 133BA */,/*40835*/22321/* 133BB */,/*40836*/22322/* 133BC */, /*40837*/22323/* 133BD */,/*40838*/22324/* 133BE */,/*40839*/22325/* 133BF */,/*40840*/22326/* 133C0 */, /*40841*/22327/* 133C1 */,/*40842*/22328/* 133C2 */,/*40843*/22329/* 133C3 */,/*40844*/22330/* 133C4 */, /*40845*/22331/* 133C5 */,/*40846*/22332/* 133C6 */,/*40847*/22333/* 133C7 */,/*40848*/22334/* 133C8 */, /*40849*/22335/* 133C9 */,/*40850*/22336/* 133CA */,/*40851*/22337/* 133CB */,/*40852*/22338/* 133CC */, /*40853*/22339/* 133CD */,/*40854*/22340/* 133CE */,/*40855*/22341/* 133CF */,/*40856*/22342/* 133D0 */, /*40857*/22343/* 133D1 */,/*40858*/22344/* 133D2 */,/*40859*/22345/* 133D3 */,/*40860*/22346/* 133D4 */, /*40861*/22347/* 133D5 */,/*40862*/22348/* 133D6 */,/*40863*/22349/* 133D7 */,/*40864*/22350/* 133D8 */, /*40865*/22351/* 133D9 */,/*40866*/22352/* 133DA */,/*40867*/22353/* 133DB */,/*40868*/22354/* 133DC */, /*40869*/22355/* 133DD */,/*40870*/22356/* 133DE */,/*40871*/22357/* 133DF */,/*40872*/22358/* 133E0 */, /*40873*/22359/* 133E1 */,/*40874*/22360/* 133E2 */,/*40875*/22361/* 133E3 */,/*40876*/22362/* 133E4 */, /*40877*/22363/* 133E5 */,/*40878*/22364/* 133E6 */,/*40879*/22365/* 133E7 */,/*40880*/22366/* 133E8 */, /*40881*/22367/* 133E9 */,/*40882*/22368/* 133EA */,/*40883*/22369/* 133EB */,/*40884*/22370/* 133EC */, /*40885*/22371/* 133ED */,/*40886*/22372/* 133EE */,/*40887*/22373/* 133EF */,/*40888*/22374/* 133F0 */, /*40889*/22375/* 133F1 */,/*40890*/22376/* 133F2 */,/*40891*/22377/* 133F3 */,/*40892*/22378/* 133F4 */, /*40893*/22379/* 133F5 */,/*40894*/22380/* 133F6 */,/*40895*/22381/* 133F7 */,/*40896*/22382/* 133F8 */, /*40897*/22383/* 133F9 */,/*40898*/22384/* 133FA */,/*40899*/22385/* 133FB */,/*40900*/22386/* 133FC */, /*40901*/22387/* 133FD */,/*40902*/22388/* 133FE */,/*40903*/22389/* 133FF */,/*40904*/22390/* 13400 */, /*40905*/22391/* 13401 */,/*40906*/22392/* 13402 */,/*40907*/22393/* 13403 */,/*40908*/22394/* 13404 */, /*40909*/22395/* 13405 */,/*40910*/22396/* 13406 */,/*40911*/22397/* 13407 */,/*40912*/22398/* 13408 */, /*40913*/22399/* 13409 */,/*40914*/22400/* 1340A */,/*40915*/22401/* 1340B */,/*40916*/22402/* 1340C */, /*40917*/22403/* 1340D */,/*40918*/22404/* 1340E */,/*40919*/22405/* 1340F */,/*40920*/22406/* 13410 */, /*40921*/22407/* 13411 */,/*40922*/22408/* 13412 */,/*40923*/22409/* 13413 */,/*40924*/22410/* 13414 */, /*40925*/22411/* 13415 */,/*40926*/22412/* 13416 */,/*40927*/22413/* 13417 */,/*40928*/22414/* 13418 */, /*40929*/22415/* 13419 */,/*40930*/22416/* 1341A */,/*40931*/22417/* 1341B */,/*40932*/22418/* 1341C */, /*40933*/22419/* 1341D */,/*40934*/22420/* 1341E */,/*40935*/22421/* 1341F */,/*40936*/22422/* 13420 */, /*40937*/22423/* 13421 */,/*40938*/22424/* 13422 */,/*40939*/22425/* 13423 */,/*40940*/22426/* 13424 */, /*40941*/22427/* 13425 */,/*40942*/22428/* 13426 */,/*40943*/22429/* 13427 */,/*40944*/22430/* 13428 */, /*40945*/22431/* 13429 */,/*40946*/22432/* 1342A */,/*40947*/22433/* 1342B */,/*40948*/22434/* 1342C */, /*40949*/22435/* 1342D */,/*40950*/22436/* 1342E */,/*40951*/22437/* 14400 */,/*40952*/22438/* 14401 */, /*40953*/22439/* 14402 */,/*40954*/22440/* 14403 */,/*40955*/22441/* 14404 */,/*40956*/22442/* 14405 */, /*40957*/22443/* 14406 */,/*40958*/22444/* 14407 */,/*40959*/22445/* 14408 */,/*40960*/22446/* 14409 */, /*40961*/22447/* 1440A */,/*40962*/22448/* 1440B */,/*40963*/22449/* 1440C */,/*40964*/22450/* 1440D */, /*40965*/22451/* 1440E */,/*40966*/22452/* 1440F */,/*40967*/22453/* 14410 */,/*40968*/22454/* 14411 */, /*40969*/22455/* 14412 */,/*40970*/22456/* 14413 */,/*40971*/22457/* 14414 */,/*40972*/22458/* 14415 */, /*40973*/22459/* 14416 */,/*40974*/22460/* 14417 */,/*40975*/22461/* 14418 */,/*40976*/22462/* 14419 */, /*40977*/22463/* 1441A */,/*40978*/22464/* 1441B */,/*40979*/22465/* 1441C */,/*40980*/22466/* 1441D */, /*40981*/22467/* 1441E */,/*40982*/22468/* 1441F */,/*40983*/22469/* 14420 */,/*40984*/22470/* 14421 */, /*40985*/22471/* 14422 */,/*40986*/22472/* 14423 */,/*40987*/22473/* 14424 */,/*40988*/22474/* 14425 */, /*40989*/22475/* 14426 */,/*40990*/22476/* 14427 */,/*40991*/22477/* 14428 */,/*40992*/22478/* 14429 */, /*40993*/22479/* 1442A */,/*40994*/22480/* 1442B */,/*40995*/22481/* 1442C */,/*40996*/22482/* 1442D */, /*40997*/22483/* 1442E */,/*40998*/22484/* 1442F */,/*40999*/22485/* 14430 */,/*41000*/22486/* 14431 */, /*41001*/22487/* 14432 */,/*41002*/22488/* 14433 */,/*41003*/22489/* 14434 */,/*41004*/22490/* 14435 */, /*41005*/22491/* 14436 */,/*41006*/22492/* 14437 */,/*41007*/22493/* 14438 */,/*41008*/22494/* 14439 */, /*41009*/22495/* 1443A */,/*41010*/22496/* 1443B */,/*41011*/22497/* 1443C */,/*41012*/22498/* 1443D */, /*41013*/22499/* 1443E */,/*41014*/22500/* 1443F */,/*41015*/22501/* 14440 */,/*41016*/22502/* 14441 */, /*41017*/22503/* 14442 */,/*41018*/22504/* 14443 */,/*41019*/22505/* 14444 */,/*41020*/22506/* 14445 */, /*41021*/22507/* 14446 */,/*41022*/22508/* 14447 */,/*41023*/22509/* 14448 */,/*41024*/22510/* 14449 */, /*41025*/22511/* 1444A */,/*41026*/22512/* 1444B */,/*41027*/22513/* 1444C */,/*41028*/22514/* 1444D */, /*41029*/22515/* 1444E */,/*41030*/22516/* 1444F */,/*41031*/22517/* 14450 */,/*41032*/22518/* 14451 */, /*41033*/22519/* 14452 */,/*41034*/22520/* 14453 */,/*41035*/22521/* 14454 */,/*41036*/22522/* 14455 */, /*41037*/22523/* 14456 */,/*41038*/22524/* 14457 */,/*41039*/22525/* 14458 */,/*41040*/22526/* 14459 */, /*41041*/22527/* 1445A */,/*41042*/22528/* 1445B */,/*41043*/22529/* 1445C */,/*41044*/22530/* 1445D */, /*41045*/22531/* 1445E */,/*41046*/22532/* 1445F */,/*41047*/22533/* 14460 */,/*41048*/22534/* 14461 */, /*41049*/22535/* 14462 */,/*41050*/22536/* 14463 */,/*41051*/22537/* 14464 */,/*41052*/22538/* 14465 */, /*41053*/22539/* 14466 */,/*41054*/22540/* 14467 */,/*41055*/22541/* 14468 */,/*41056*/22542/* 14469 */, /*41057*/22543/* 1446A */,/*41058*/22544/* 1446B */,/*41059*/22545/* 1446C */,/*41060*/22546/* 1446D */, /*41061*/22547/* 1446E */,/*41062*/22548/* 1446F */,/*41063*/22549/* 14470 */,/*41064*/22550/* 14471 */, /*41065*/22551/* 14472 */,/*41066*/22552/* 14473 */,/*41067*/22553/* 14474 */,/*41068*/22554/* 14475 */, /*41069*/22555/* 14476 */,/*41070*/22556/* 14477 */,/*41071*/22557/* 14478 */,/*41072*/22558/* 14479 */, /*41073*/22559/* 1447A */,/*41074*/22560/* 1447B */,/*41075*/22561/* 1447C */,/*41076*/22562/* 1447D */, /*41077*/22563/* 1447E */,/*41078*/22564/* 1447F */,/*41079*/22565/* 14480 */,/*41080*/22566/* 14481 */, /*41081*/22567/* 14482 */,/*41082*/22568/* 14483 */,/*41083*/22569/* 14484 */,/*41084*/22570/* 14485 */, /*41085*/22571/* 14486 */,/*41086*/22572/* 14487 */,/*41087*/22573/* 14488 */,/*41088*/22574/* 14489 */, /*41089*/22575/* 1448A */,/*41090*/22576/* 1448B */,/*41091*/22577/* 1448C */,/*41092*/22578/* 1448D */, /*41093*/22579/* 1448E */,/*41094*/22580/* 1448F */,/*41095*/22581/* 14490 */,/*41096*/22582/* 14491 */, /*41097*/22583/* 14492 */,/*41098*/22584/* 14493 */,/*41099*/22585/* 14494 */,/*41100*/22586/* 14495 */, /*41101*/22587/* 14496 */,/*41102*/22588/* 14497 */,/*41103*/22589/* 14498 */,/*41104*/22590/* 14499 */, /*41105*/22591/* 1449A */,/*41106*/22592/* 1449B */,/*41107*/22593/* 1449C */,/*41108*/22594/* 1449D */, /*41109*/22595/* 1449E */,/*41110*/22596/* 1449F */,/*41111*/22597/* 144A0 */,/*41112*/22598/* 144A1 */, /*41113*/22599/* 144A2 */,/*41114*/22600/* 144A3 */,/*41115*/22601/* 144A4 */,/*41116*/22602/* 144A5 */, /*41117*/22603/* 144A6 */,/*41118*/22604/* 144A7 */,/*41119*/22605/* 144A8 */,/*41120*/22606/* 144A9 */, /*41121*/22607/* 144AA */,/*41122*/22608/* 144AB */,/*41123*/22609/* 144AC */,/*41124*/22610/* 144AD */, /*41125*/22611/* 144AE */,/*41126*/22612/* 144AF */,/*41127*/22613/* 144B0 */,/*41128*/22614/* 144B1 */, /*41129*/22615/* 144B2 */,/*41130*/22616/* 144B3 */,/*41131*/22617/* 144B4 */,/*41132*/22618/* 144B5 */, /*41133*/22619/* 144B6 */,/*41134*/22620/* 144B7 */,/*41135*/22621/* 144B8 */,/*41136*/22622/* 144B9 */, /*41137*/22623/* 144BA */,/*41138*/22624/* 144BB */,/*41139*/22625/* 144BC */,/*41140*/22626/* 144BD */, /*41141*/22627/* 144BE */,/*41142*/22628/* 144BF */,/*41143*/22629/* 144C0 */,/*41144*/22630/* 144C1 */, /*41145*/22631/* 144C2 */,/*41146*/22632/* 144C3 */,/*41147*/22633/* 144C4 */,/*41148*/22634/* 144C5 */, /*41149*/22635/* 144C6 */,/*41150*/22636/* 144C7 */,/*41151*/22637/* 144C8 */,/*41152*/22638/* 144C9 */, /*41153*/22639/* 144CA */,/*41154*/22640/* 144CB */,/*41155*/22641/* 144CC */,/*41156*/22642/* 144CD */, /*41157*/22643/* 144CE */,/*41158*/22644/* 144CF */,/*41159*/22645/* 144D0 */,/*41160*/22646/* 144D1 */, /*41161*/22647/* 144D2 */,/*41162*/22648/* 144D3 */,/*41163*/22649/* 144D4 */,/*41164*/22650/* 144D5 */, /*41165*/22651/* 144D6 */,/*41166*/22652/* 144D7 */,/*41167*/22653/* 144D8 */,/*41168*/22654/* 144D9 */, /*41169*/22655/* 144DA */,/*41170*/22656/* 144DB */,/*41171*/22657/* 144DC */,/*41172*/22658/* 144DD */, /*41173*/22659/* 144DE */,/*41174*/22660/* 144DF */,/*41175*/22661/* 144E0 */,/*41176*/22662/* 144E1 */, /*41177*/22663/* 144E2 */,/*41178*/22664/* 144E3 */,/*41179*/22665/* 144E4 */,/*41180*/22666/* 144E5 */, /*41181*/22667/* 144E6 */,/*41182*/22668/* 144E7 */,/*41183*/22669/* 144E8 */,/*41184*/22670/* 144E9 */, /*41185*/22671/* 144EA */,/*41186*/22672/* 144EB */,/*41187*/22673/* 144EC */,/*41188*/22674/* 144ED */, /*41189*/22675/* 144EE */,/*41190*/22676/* 144EF */,/*41191*/22677/* 144F0 */,/*41192*/22678/* 144F1 */, /*41193*/22679/* 144F2 */,/*41194*/22680/* 144F3 */,/*41195*/22681/* 144F4 */,/*41196*/22682/* 144F5 */, /*41197*/22683/* 144F6 */,/*41198*/22684/* 144F7 */,/*41199*/22685/* 144F8 */,/*41200*/22686/* 144F9 */, /*41201*/22687/* 144FA */,/*41202*/22688/* 144FB */,/*41203*/22689/* 144FC */,/*41204*/22690/* 144FD */, /*41205*/22691/* 144FE */,/*41206*/22692/* 144FF */,/*41207*/22693/* 14500 */,/*41208*/22694/* 14501 */, /*41209*/22695/* 14502 */,/*41210*/22696/* 14503 */,/*41211*/22697/* 14504 */,/*41212*/22698/* 14505 */, /*41213*/22699/* 14506 */,/*41214*/22700/* 14507 */,/*41215*/22701/* 14508 */,/*41216*/22702/* 14509 */, /*41217*/22703/* 1450A */,/*41218*/22704/* 1450B */,/*41219*/22705/* 1450C */,/*41220*/22706/* 1450D */, /*41221*/22707/* 1450E */,/*41222*/22708/* 1450F */,/*41223*/22709/* 14510 */,/*41224*/22710/* 14511 */, /*41225*/22711/* 14512 */,/*41226*/22712/* 14513 */,/*41227*/22713/* 14514 */,/*41228*/22714/* 14515 */, /*41229*/22715/* 14516 */,/*41230*/22716/* 14517 */,/*41231*/22717/* 14518 */,/*41232*/22718/* 14519 */, /*41233*/22719/* 1451A */,/*41234*/22720/* 1451B */,/*41235*/22721/* 1451C */,/*41236*/22722/* 1451D */, /*41237*/22723/* 1451E */,/*41238*/22724/* 1451F */,/*41239*/22725/* 14520 */,/*41240*/22726/* 14521 */, /*41241*/22727/* 14522 */,/*41242*/22728/* 14523 */,/*41243*/22729/* 14524 */,/*41244*/22730/* 14525 */, /*41245*/22731/* 14526 */,/*41246*/22732/* 14527 */,/*41247*/22733/* 14528 */,/*41248*/22734/* 14529 */, /*41249*/22735/* 1452A */,/*41250*/22736/* 1452B */,/*41251*/22737/* 1452C */,/*41252*/22738/* 1452D */, /*41253*/22739/* 1452E */,/*41254*/22740/* 1452F */,/*41255*/22741/* 14530 */,/*41256*/22742/* 14531 */, /*41257*/22743/* 14532 */,/*41258*/22744/* 14533 */,/*41259*/22745/* 14534 */,/*41260*/22746/* 14535 */, /*41261*/22747/* 14536 */,/*41262*/22748/* 14537 */,/*41263*/22749/* 14538 */,/*41264*/22750/* 14539 */, /*41265*/22751/* 1453A */,/*41266*/22752/* 1453B */,/*41267*/22753/* 1453C */,/*41268*/22754/* 1453D */, /*41269*/22755/* 1453E */,/*41270*/22756/* 1453F */,/*41271*/22757/* 14540 */,/*41272*/22758/* 14541 */, /*41273*/22759/* 14542 */,/*41274*/22760/* 14543 */,/*41275*/22761/* 14544 */,/*41276*/22762/* 14545 */, /*41277*/22763/* 14546 */,/*41278*/22764/* 14547 */,/*41279*/22765/* 14548 */,/*41280*/22766/* 14549 */, /*41281*/22767/* 1454A */,/*41282*/22768/* 1454B */,/*41283*/22769/* 1454C */,/*41284*/22770/* 1454D */, /*41285*/22771/* 1454E */,/*41286*/22772/* 1454F */,/*41287*/22773/* 14550 */,/*41288*/22774/* 14551 */, /*41289*/22775/* 14552 */,/*41290*/22776/* 14553 */,/*41291*/22777/* 14554 */,/*41292*/22778/* 14555 */, /*41293*/22779/* 14556 */,/*41294*/22780/* 14557 */,/*41295*/22781/* 14558 */,/*41296*/22782/* 14559 */, /*41297*/22783/* 1455A */,/*41298*/22784/* 1455B */,/*41299*/22785/* 1455C */,/*41300*/22786/* 1455D */, /*41301*/22787/* 1455E */,/*41302*/22788/* 1455F */,/*41303*/22789/* 14560 */,/*41304*/22790/* 14561 */, /*41305*/22791/* 14562 */,/*41306*/22792/* 14563 */,/*41307*/22793/* 14564 */,/*41308*/22794/* 14565 */, /*41309*/22795/* 14566 */,/*41310*/22796/* 14567 */,/*41311*/22797/* 14568 */,/*41312*/22798/* 14569 */, /*41313*/22799/* 1456A */,/*41314*/22800/* 1456B */,/*41315*/22801/* 1456C */,/*41316*/22802/* 1456D */, /*41317*/22803/* 1456E */,/*41318*/22804/* 1456F */,/*41319*/22805/* 14570 */,/*41320*/22806/* 14571 */, /*41321*/22807/* 14572 */,/*41322*/22808/* 14573 */,/*41323*/22809/* 14574 */,/*41324*/22810/* 14575 */, /*41325*/22811/* 14576 */,/*41326*/22812/* 14577 */,/*41327*/22813/* 14578 */,/*41328*/22814/* 14579 */, /*41329*/22815/* 1457A */,/*41330*/22816/* 1457B */,/*41331*/22817/* 1457C */,/*41332*/22818/* 1457D */, /*41333*/22819/* 1457E */,/*41334*/22820/* 1457F */,/*41335*/22821/* 14580 */,/*41336*/22822/* 14581 */, /*41337*/22823/* 14582 */,/*41338*/22824/* 14583 */,/*41339*/22825/* 14584 */,/*41340*/22826/* 14585 */, /*41341*/22827/* 14586 */,/*41342*/22828/* 14587 */,/*41343*/22829/* 14588 */,/*41344*/22830/* 14589 */, /*41345*/22831/* 1458A */,/*41346*/22832/* 1458B */,/*41347*/22833/* 1458C */,/*41348*/22834/* 1458D */, /*41349*/22835/* 1458E */,/*41350*/22836/* 1458F */,/*41351*/22837/* 14590 */,/*41352*/22838/* 14591 */, /*41353*/22839/* 14592 */,/*41354*/22840/* 14593 */,/*41355*/22841/* 14594 */,/*41356*/22842/* 14595 */, /*41357*/22843/* 14596 */,/*41358*/22844/* 14597 */,/*41359*/22845/* 14598 */,/*41360*/22846/* 14599 */, /*41361*/22847/* 1459A */,/*41362*/22848/* 1459B */,/*41363*/22849/* 1459C */,/*41364*/22850/* 1459D */, /*41365*/22851/* 1459E */,/*41366*/22852/* 1459F */,/*41367*/22853/* 145A0 */,/*41368*/22854/* 145A1 */, /*41369*/22855/* 145A2 */,/*41370*/22856/* 145A3 */,/*41371*/22857/* 145A4 */,/*41372*/22858/* 145A5 */, /*41373*/22859/* 145A6 */,/*41374*/22860/* 145A7 */,/*41375*/22861/* 145A8 */,/*41376*/22862/* 145A9 */, /*41377*/22863/* 145AA */,/*41378*/22864/* 145AB */,/*41379*/22865/* 145AC */,/*41380*/22866/* 145AD */, /*41381*/22867/* 145AE */,/*41382*/22868/* 145AF */,/*41383*/22869/* 145B0 */,/*41384*/22870/* 145B1 */, /*41385*/22871/* 145B2 */,/*41386*/22872/* 145B3 */,/*41387*/22873/* 145B4 */,/*41388*/22874/* 145B5 */, /*41389*/22875/* 145B6 */,/*41390*/22876/* 145B7 */,/*41391*/22877/* 145B8 */,/*41392*/22878/* 145B9 */, /*41393*/22879/* 145BA */,/*41394*/22880/* 145BB */,/*41395*/22881/* 145BC */,/*41396*/22882/* 145BD */, /*41397*/22883/* 145BE */,/*41398*/22884/* 145BF */,/*41399*/22885/* 145C0 */,/*41400*/22886/* 145C1 */, /*41401*/22887/* 145C2 */,/*41402*/22888/* 145C3 */,/*41403*/22889/* 145C4 */,/*41404*/22890/* 145C5 */, /*41405*/22891/* 145C6 */,/*41406*/22892/* 145C7 */,/*41407*/22893/* 145C8 */,/*41408*/22894/* 145C9 */, /*41409*/22895/* 145CA */,/*41410*/22896/* 145CB */,/*41411*/22897/* 145CC */,/*41412*/22898/* 145CD */, /*41413*/22899/* 145CE */,/*41414*/22900/* 145CF */,/*41415*/22901/* 145D0 */,/*41416*/22902/* 145D1 */, /*41417*/22903/* 145D2 */,/*41418*/22904/* 145D3 */,/*41419*/22905/* 145D4 */,/*41420*/22906/* 145D5 */, /*41421*/22907/* 145D6 */,/*41422*/22908/* 145D7 */,/*41423*/22909/* 145D8 */,/*41424*/22910/* 145D9 */, /*41425*/22911/* 145DA */,/*41426*/22912/* 145DB */,/*41427*/22913/* 145DC */,/*41428*/22914/* 145DD */, /*41429*/22915/* 145DE */,/*41430*/22916/* 145DF */,/*41431*/22917/* 145E0 */,/*41432*/22918/* 145E1 */, /*41433*/22919/* 145E2 */,/*41434*/22920/* 145E3 */,/*41435*/22921/* 145E4 */,/*41436*/22922/* 145E5 */, /*41437*/22923/* 145E6 */,/*41438*/22924/* 145E7 */,/*41439*/22925/* 145E8 */,/*41440*/22926/* 145E9 */, /*41441*/22927/* 145EA */,/*41442*/22928/* 145EB */,/*41443*/22929/* 145EC */,/*41444*/22930/* 145ED */, /*41445*/22931/* 145EE */,/*41446*/22932/* 145EF */,/*41447*/22933/* 145F0 */,/*41448*/22934/* 145F1 */, /*41449*/22935/* 145F2 */,/*41450*/22936/* 145F3 */,/*41451*/22937/* 145F4 */,/*41452*/22938/* 145F5 */, /*41453*/22939/* 145F6 */,/*41454*/22940/* 145F7 */,/*41455*/22941/* 145F8 */,/*41456*/22942/* 145F9 */, /*41457*/22943/* 145FA */,/*41458*/22944/* 145FB */,/*41459*/22945/* 145FC */,/*41460*/22946/* 145FD */, /*41461*/22947/* 145FE */,/*41462*/22948/* 145FF */,/*41463*/22949/* 14600 */,/*41464*/22950/* 14601 */, /*41465*/22951/* 14602 */,/*41466*/22952/* 14603 */,/*41467*/22953/* 14604 */,/*41468*/22954/* 14605 */, /*41469*/22955/* 14606 */,/*41470*/22956/* 14607 */,/*41471*/22957/* 14608 */,/*41472*/22958/* 14609 */, /*41473*/22959/* 1460A */,/*41474*/22960/* 1460B */,/*41475*/22961/* 1460C */,/*41476*/22962/* 1460D */, /*41477*/22963/* 1460E */,/*41478*/22964/* 1460F */,/*41479*/22965/* 14610 */,/*41480*/22966/* 14611 */, /*41481*/22967/* 14612 */,/*41482*/22968/* 14613 */,/*41483*/22969/* 14614 */,/*41484*/22970/* 14615 */, /*41485*/22971/* 14616 */,/*41486*/22972/* 14617 */,/*41487*/22973/* 14618 */,/*41488*/22974/* 14619 */, /*41489*/22975/* 1461A */,/*41490*/22976/* 1461B */,/*41491*/22977/* 1461C */,/*41492*/22978/* 1461D */, /*41493*/22979/* 1461E */,/*41494*/22980/* 1461F */,/*41495*/22981/* 14620 */,/*41496*/22982/* 14621 */, /*41497*/22983/* 14622 */,/*41498*/22984/* 14623 */,/*41499*/22985/* 14624 */,/*41500*/22986/* 14625 */, /*41501*/22987/* 14626 */,/*41502*/22988/* 14627 */,/*41503*/22989/* 14628 */,/*41504*/22990/* 14629 */, /*41505*/22991/* 1462A */,/*41506*/22992/* 1462B */,/*41507*/22993/* 1462C */,/*41508*/22994/* 1462D */, /*41509*/22995/* 1462E */,/*41510*/22996/* 1462F */,/*41511*/22997/* 14630 */,/*41512*/22998/* 14631 */, /*41513*/22999/* 14632 */,/*41514*/23000/* 14633 */,/*41515*/23001/* 14634 */,/*41516*/23002/* 14635 */, /*41517*/23003/* 14636 */,/*41518*/23004/* 14637 */,/*41519*/23005/* 14638 */,/*41520*/23006/* 14639 */, /*41521*/23007/* 1463A */,/*41522*/23008/* 1463B */,/*41523*/23009/* 1463C */,/*41524*/23010/* 1463D */, /*41525*/23011/* 1463E */,/*41526*/23012/* 1463F */,/*41527*/23013/* 14640 */,/*41528*/23014/* 14641 */, /*41529*/23015/* 14642 */,/*41530*/23016/* 14643 */,/*41531*/23017/* 14644 */,/*41532*/23018/* 14645 */, /*41533*/23019/* 14646 */,/*41534*/23020/* 16800 */,/*41535*/23021/* 16801 */,/*41536*/23022/* 16802 */, /*41537*/23023/* 16803 */,/*41538*/23024/* 16804 */,/*41539*/23025/* 16805 */,/*41540*/23026/* 16806 */, /*41541*/23027/* 16807 */,/*41542*/23028/* 16808 */,/*41543*/23029/* 16809 */,/*41544*/23030/* 1680A */, /*41545*/23031/* 1680B */,/*41546*/23032/* 1680C */,/*41547*/23033/* 1680D */,/*41548*/23034/* 1680E */, /*41549*/23035/* 1680F */,/*41550*/23036/* 16810 */,/*41551*/23037/* 16811 */,/*41552*/23038/* 16812 */, /*41553*/23039/* 16813 */,/*41554*/23040/* 16814 */,/*41555*/23041/* 16815 */,/*41556*/23042/* 16816 */, /*41557*/23043/* 16817 */,/*41558*/23044/* 16818 */,/*41559*/23045/* 16819 */,/*41560*/23046/* 1681A */, /*41561*/23047/* 1681B */,/*41562*/23048/* 1681C */,/*41563*/23049/* 1681D */,/*41564*/23050/* 1681E */, /*41565*/23051/* 1681F */,/*41566*/23052/* 16820 */,/*41567*/23053/* 16821 */,/*41568*/23054/* 16822 */, /*41569*/23055/* 16823 */,/*41570*/23056/* 16824 */,/*41571*/23057/* 16825 */,/*41572*/23058/* 16826 */, /*41573*/23059/* 16827 */,/*41574*/23060/* 16828 */,/*41575*/23061/* 16829 */,/*41576*/23062/* 1682A */, /*41577*/23063/* 1682B */,/*41578*/23064/* 1682C */,/*41579*/23065/* 1682D */,/*41580*/23066/* 1682E */, /*41581*/23067/* 1682F */,/*41582*/23068/* 16830 */,/*41583*/23069/* 16831 */,/*41584*/23070/* 16832 */, /*41585*/23071/* 16833 */,/*41586*/23072/* 16834 */,/*41587*/23073/* 16835 */,/*41588*/23074/* 16836 */, /*41589*/23075/* 16837 */,/*41590*/23076/* 16838 */,/*41591*/23077/* 16839 */,/*41592*/23078/* 1683A */, /*41593*/23079/* 1683B */,/*41594*/23080/* 1683C */,/*41595*/23081/* 1683D */,/*41596*/23082/* 1683E */, /*41597*/23083/* 1683F */,/*41598*/23084/* 16840 */,/*41599*/23085/* 16841 */,/*41600*/23086/* 16842 */, /*41601*/23087/* 16843 */,/*41602*/23088/* 16844 */,/*41603*/23089/* 16845 */,/*41604*/23090/* 16846 */, /*41605*/23091/* 16847 */,/*41606*/23092/* 16848 */,/*41607*/23093/* 16849 */,/*41608*/23094/* 1684A */, /*41609*/23095/* 1684B */,/*41610*/23096/* 1684C */,/*41611*/23097/* 1684D */,/*41612*/23098/* 1684E */, /*41613*/23099/* 1684F */,/*41614*/23100/* 16850 */,/*41615*/23101/* 16851 */,/*41616*/23102/* 16852 */, /*41617*/23103/* 16853 */,/*41618*/23104/* 16854 */,/*41619*/23105/* 16855 */,/*41620*/23106/* 16856 */, /*41621*/23107/* 16857 */,/*41622*/23108/* 16858 */,/*41623*/23109/* 16859 */,/*41624*/23110/* 1685A */, /*41625*/23111/* 1685B */,/*41626*/23112/* 1685C */,/*41627*/23113/* 1685D */,/*41628*/23114/* 1685E */, /*41629*/23115/* 1685F */,/*41630*/23116/* 16860 */,/*41631*/23117/* 16861 */,/*41632*/23118/* 16862 */, /*41633*/23119/* 16863 */,/*41634*/23120/* 16864 */,/*41635*/23121/* 16865 */,/*41636*/23122/* 16866 */, /*41637*/23123/* 16867 */,/*41638*/23124/* 16868 */,/*41639*/23125/* 16869 */,/*41640*/23126/* 1686A */, /*41641*/23127/* 1686B */,/*41642*/23128/* 1686C */,/*41643*/23129/* 1686D */,/*41644*/23130/* 1686E */, /*41645*/23131/* 1686F */,/*41646*/23132/* 16870 */,/*41647*/23133/* 16871 */,/*41648*/23134/* 16872 */, /*41649*/23135/* 16873 */,/*41650*/23136/* 16874 */,/*41651*/23137/* 16875 */,/*41652*/23138/* 16876 */, /*41653*/23139/* 16877 */,/*41654*/23140/* 16878 */,/*41655*/23141/* 16879 */,/*41656*/23142/* 1687A */, /*41657*/23143/* 1687B */,/*41658*/23144/* 1687C */,/*41659*/23145/* 1687D */,/*41660*/23146/* 1687E */, /*41661*/23147/* 1687F */,/*41662*/23148/* 16880 */,/*41663*/23149/* 16881 */,/*41664*/23150/* 16882 */, /*41665*/23151/* 16883 */,/*41666*/23152/* 16884 */,/*41667*/23153/* 16885 */,/*41668*/23154/* 16886 */, /*41669*/23155/* 16887 */,/*41670*/23156/* 16888 */,/*41671*/23157/* 16889 */,/*41672*/23158/* 1688A */, /*41673*/23159/* 1688B */,/*41674*/23160/* 1688C */,/*41675*/23161/* 1688D */,/*41676*/23162/* 1688E */, /*41677*/23163/* 1688F */,/*41678*/23164/* 16890 */,/*41679*/23165/* 16891 */,/*41680*/23166/* 16892 */, /*41681*/23167/* 16893 */,/*41682*/23168/* 16894 */,/*41683*/23169/* 16895 */,/*41684*/23170/* 16896 */, /*41685*/23171/* 16897 */,/*41686*/23172/* 16898 */,/*41687*/23173/* 16899 */,/*41688*/23174/* 1689A */, /*41689*/23175/* 1689B */,/*41690*/23176/* 1689C */,/*41691*/23177/* 1689D */,/*41692*/23178/* 1689E */, /*41693*/23179/* 1689F */,/*41694*/23180/* 168A0 */,/*41695*/23181/* 168A1 */,/*41696*/23182/* 168A2 */, /*41697*/23183/* 168A3 */,/*41698*/23184/* 168A4 */,/*41699*/23185/* 168A5 */,/*41700*/23186/* 168A6 */, /*41701*/23187/* 168A7 */,/*41702*/23188/* 168A8 */,/*41703*/23189/* 168A9 */,/*41704*/23190/* 168AA */, /*41705*/23191/* 168AB */,/*41706*/23192/* 168AC */,/*41707*/23193/* 168AD */,/*41708*/23194/* 168AE */, /*41709*/23195/* 168AF */,/*41710*/23196/* 168B0 */,/*41711*/23197/* 168B1 */,/*41712*/23198/* 168B2 */, /*41713*/23199/* 168B3 */,/*41714*/23200/* 168B4 */,/*41715*/23201/* 168B5 */,/*41716*/23202/* 168B6 */, /*41717*/23203/* 168B7 */,/*41718*/23204/* 168B8 */,/*41719*/23205/* 168B9 */,/*41720*/23206/* 168BA */, /*41721*/23207/* 168BB */,/*41722*/23208/* 168BC */,/*41723*/23209/* 168BD */,/*41724*/23210/* 168BE */, /*41725*/23211/* 168BF */,/*41726*/23212/* 168C0 */,/*41727*/23213/* 168C1 */,/*41728*/23214/* 168C2 */, /*41729*/23215/* 168C3 */,/*41730*/23216/* 168C4 */,/*41731*/23217/* 168C5 */,/*41732*/23218/* 168C6 */, /*41733*/23219/* 168C7 */,/*41734*/23220/* 168C8 */,/*41735*/23221/* 168C9 */,/*41736*/23222/* 168CA */, /*41737*/23223/* 168CB */,/*41738*/23224/* 168CC */,/*41739*/23225/* 168CD */,/*41740*/23226/* 168CE */, /*41741*/23227/* 168CF */,/*41742*/23228/* 168D0 */,/*41743*/23229/* 168D1 */,/*41744*/23230/* 168D2 */, /*41745*/23231/* 168D3 */,/*41746*/23232/* 168D4 */,/*41747*/23233/* 168D5 */,/*41748*/23234/* 168D6 */, /*41749*/23235/* 168D7 */,/*41750*/23236/* 168D8 */,/*41751*/23237/* 168D9 */,/*41752*/23238/* 168DA */, /*41753*/23239/* 168DB */,/*41754*/23240/* 168DC */,/*41755*/23241/* 168DD */,/*41756*/23242/* 168DE */, /*41757*/23243/* 168DF */,/*41758*/23244/* 168E0 */,/*41759*/23245/* 168E1 */,/*41760*/23246/* 168E2 */, /*41761*/23247/* 168E3 */,/*41762*/23248/* 168E4 */,/*41763*/23249/* 168E5 */,/*41764*/23250/* 168E6 */, /*41765*/23251/* 168E7 */,/*41766*/23252/* 168E8 */,/*41767*/23253/* 168E9 */,/*41768*/23254/* 168EA */, /*41769*/23255/* 168EB */,/*41770*/23256/* 168EC */,/*41771*/23257/* 168ED */,/*41772*/23258/* 168EE */, /*41773*/23259/* 168EF */,/*41774*/23260/* 168F0 */,/*41775*/23261/* 168F1 */,/*41776*/23262/* 168F2 */, /*41777*/23263/* 168F3 */,/*41778*/23264/* 168F4 */,/*41779*/23265/* 168F5 */,/*41780*/23266/* 168F6 */, /*41781*/23267/* 168F7 */,/*41782*/23268/* 168F8 */,/*41783*/23269/* 168F9 */,/*41784*/23270/* 168FA */, /*41785*/23271/* 168FB */,/*41786*/23272/* 168FC */,/*41787*/23273/* 168FD */,/*41788*/23274/* 168FE */, /*41789*/23275/* 168FF */,/*41790*/23276/* 16900 */,/*41791*/23277/* 16901 */,/*41792*/23278/* 16902 */, /*41793*/23279/* 16903 */,/*41794*/23280/* 16904 */,/*41795*/23281/* 16905 */,/*41796*/23282/* 16906 */, /*41797*/23283/* 16907 */,/*41798*/23284/* 16908 */,/*41799*/23285/* 16909 */,/*41800*/23286/* 1690A */, /*41801*/23287/* 1690B */,/*41802*/23288/* 1690C */,/*41803*/23289/* 1690D */,/*41804*/23290/* 1690E */, /*41805*/23291/* 1690F */,/*41806*/23292/* 16910 */,/*41807*/23293/* 16911 */,/*41808*/23294/* 16912 */, /*41809*/23295/* 16913 */,/*41810*/23296/* 16914 */,/*41811*/23297/* 16915 */,/*41812*/23298/* 16916 */, /*41813*/23299/* 16917 */,/*41814*/23300/* 16918 */,/*41815*/23301/* 16919 */,/*41816*/23302/* 1691A */, /*41817*/23303/* 1691B */,/*41818*/23304/* 1691C */,/*41819*/23305/* 1691D */,/*41820*/23306/* 1691E */, /*41821*/23307/* 1691F */,/*41822*/23308/* 16920 */,/*41823*/23309/* 16921 */,/*41824*/23310/* 16922 */, /*41825*/23311/* 16923 */,/*41826*/23312/* 16924 */,/*41827*/23313/* 16925 */,/*41828*/23314/* 16926 */, /*41829*/23315/* 16927 */,/*41830*/23316/* 16928 */,/*41831*/23317/* 16929 */,/*41832*/23318/* 1692A */, /*41833*/23319/* 1692B */,/*41834*/23320/* 1692C */,/*41835*/23321/* 1692D */,/*41836*/23322/* 1692E */, /*41837*/23323/* 1692F */,/*41838*/23324/* 16930 */,/*41839*/23325/* 16931 */,/*41840*/23326/* 16932 */, /*41841*/23327/* 16933 */,/*41842*/23328/* 16934 */,/*41843*/23329/* 16935 */,/*41844*/23330/* 16936 */, /*41845*/23331/* 16937 */,/*41846*/23332/* 16938 */,/*41847*/23333/* 16939 */,/*41848*/23334/* 1693A */, /*41849*/23335/* 1693B */,/*41850*/23336/* 1693C */,/*41851*/23337/* 1693D */,/*41852*/23338/* 1693E */, /*41853*/23339/* 1693F */,/*41854*/23340/* 16940 */,/*41855*/23341/* 16941 */,/*41856*/23342/* 16942 */, /*41857*/23343/* 16943 */,/*41858*/23344/* 16944 */,/*41859*/23345/* 16945 */,/*41860*/23346/* 16946 */, /*41861*/23347/* 16947 */,/*41862*/23348/* 16948 */,/*41863*/23349/* 16949 */,/*41864*/23350/* 1694A */, /*41865*/23351/* 1694B */,/*41866*/23352/* 1694C */,/*41867*/23353/* 1694D */,/*41868*/23354/* 1694E */, /*41869*/23355/* 1694F */,/*41870*/23356/* 16950 */,/*41871*/23357/* 16951 */,/*41872*/23358/* 16952 */, /*41873*/23359/* 16953 */,/*41874*/23360/* 16954 */,/*41875*/23361/* 16955 */,/*41876*/23362/* 16956 */, /*41877*/23363/* 16957 */,/*41878*/23364/* 16958 */,/*41879*/23365/* 16959 */,/*41880*/23366/* 1695A */, /*41881*/23367/* 1695B */,/*41882*/23368/* 1695C */,/*41883*/23369/* 1695D */,/*41884*/23370/* 1695E */, /*41885*/23371/* 1695F */,/*41886*/23372/* 16960 */,/*41887*/23373/* 16961 */,/*41888*/23374/* 16962 */, /*41889*/23375/* 16963 */,/*41890*/23376/* 16964 */,/*41891*/23377/* 16965 */,/*41892*/23378/* 16966 */, /*41893*/23379/* 16967 */,/*41894*/23380/* 16968 */,/*41895*/23381/* 16969 */,/*41896*/23382/* 1696A */, /*41897*/23383/* 1696B */,/*41898*/23384/* 1696C */,/*41899*/23385/* 1696D */,/*41900*/23386/* 1696E */, /*41901*/23387/* 1696F */,/*41902*/23388/* 16970 */,/*41903*/23389/* 16971 */,/*41904*/23390/* 16972 */, /*41905*/23391/* 16973 */,/*41906*/23392/* 16974 */,/*41907*/23393/* 16975 */,/*41908*/23394/* 16976 */, /*41909*/23395/* 16977 */,/*41910*/23396/* 16978 */,/*41911*/23397/* 16979 */,/*41912*/23398/* 1697A */, /*41913*/23399/* 1697B */,/*41914*/23400/* 1697C */,/*41915*/23401/* 1697D */,/*41916*/23402/* 1697E */, /*41917*/23403/* 1697F */,/*41918*/23404/* 16980 */,/*41919*/23405/* 16981 */,/*41920*/23406/* 16982 */, /*41921*/23407/* 16983 */,/*41922*/23408/* 16984 */,/*41923*/23409/* 16985 */,/*41924*/23410/* 16986 */, /*41925*/23411/* 16987 */,/*41926*/23412/* 16988 */,/*41927*/23413/* 16989 */,/*41928*/23414/* 1698A */, /*41929*/23415/* 1698B */,/*41930*/23416/* 1698C */,/*41931*/23417/* 1698D */,/*41932*/23418/* 1698E */, /*41933*/23419/* 1698F */,/*41934*/23420/* 16990 */,/*41935*/23421/* 16991 */,/*41936*/23422/* 16992 */, /*41937*/23423/* 16993 */,/*41938*/23424/* 16994 */,/*41939*/23425/* 16995 */,/*41940*/23426/* 16996 */, /*41941*/23427/* 16997 */,/*41942*/23428/* 16998 */,/*41943*/23429/* 16999 */,/*41944*/23430/* 1699A */, /*41945*/23431/* 1699B */,/*41946*/23432/* 1699C */,/*41947*/23433/* 1699D */,/*41948*/23434/* 1699E */, /*41949*/23435/* 1699F */,/*41950*/23436/* 169A0 */,/*41951*/23437/* 169A1 */,/*41952*/23438/* 169A2 */, /*41953*/23439/* 169A3 */,/*41954*/23440/* 169A4 */,/*41955*/23441/* 169A5 */,/*41956*/23442/* 169A6 */, /*41957*/23443/* 169A7 */,/*41958*/23444/* 169A8 */,/*41959*/23445/* 169A9 */,/*41960*/23446/* 169AA */, /*41961*/23447/* 169AB */,/*41962*/23448/* 169AC */,/*41963*/23449/* 169AD */,/*41964*/23450/* 169AE */, /*41965*/23451/* 169AF */,/*41966*/23452/* 169B0 */,/*41967*/23453/* 169B1 */,/*41968*/23454/* 169B2 */, /*41969*/23455/* 169B3 */,/*41970*/23456/* 169B4 */,/*41971*/23457/* 169B5 */,/*41972*/23458/* 169B6 */, /*41973*/23459/* 169B7 */,/*41974*/23460/* 169B8 */,/*41975*/23461/* 169B9 */,/*41976*/23462/* 169BA */, /*41977*/23463/* 169BB */,/*41978*/23464/* 169BC */,/*41979*/23465/* 169BD */,/*41980*/23466/* 169BE */, /*41981*/23467/* 169BF */,/*41982*/23468/* 169C0 */,/*41983*/23469/* 169C1 */,/*41984*/23470/* 169C2 */, /*41985*/23471/* 169C3 */,/*41986*/23472/* 169C4 */,/*41987*/23473/* 169C5 */,/*41988*/23474/* 169C6 */, /*41989*/23475/* 169C7 */,/*41990*/23476/* 169C8 */,/*41991*/23477/* 169C9 */,/*41992*/23478/* 169CA */, /*41993*/23479/* 169CB */,/*41994*/23480/* 169CC */,/*41995*/23481/* 169CD */,/*41996*/23482/* 169CE */, /*41997*/23483/* 169CF */,/*41998*/23484/* 169D0 */,/*41999*/23485/* 169D1 */,/*42000*/23486/* 169D2 */, /*42001*/23487/* 169D3 */,/*42002*/23488/* 169D4 */,/*42003*/23489/* 169D5 */,/*42004*/23490/* 169D6 */, /*42005*/23491/* 169D7 */,/*42006*/23492/* 169D8 */,/*42007*/23493/* 169D9 */,/*42008*/23494/* 169DA */, /*42009*/23495/* 169DB */,/*42010*/23496/* 169DC */,/*42011*/23497/* 169DD */,/*42012*/23498/* 169DE */, /*42013*/23499/* 169DF */,/*42014*/23500/* 169E0 */,/*42015*/23501/* 169E1 */,/*42016*/23502/* 169E2 */, /*42017*/23503/* 169E3 */,/*42018*/23504/* 169E4 */,/*42019*/23505/* 169E5 */,/*42020*/23506/* 169E6 */, /*42021*/23507/* 169E7 */,/*42022*/23508/* 169E8 */,/*42023*/23509/* 169E9 */,/*42024*/23510/* 169EA */, /*42025*/23511/* 169EB */,/*42026*/23512/* 169EC */,/*42027*/23513/* 169ED */,/*42028*/23514/* 169EE */, /*42029*/23515/* 169EF */,/*42030*/23516/* 169F0 */,/*42031*/23517/* 169F1 */,/*42032*/23518/* 169F2 */, /*42033*/23519/* 169F3 */,/*42034*/23520/* 169F4 */,/*42035*/23521/* 169F5 */,/*42036*/23522/* 169F6 */, /*42037*/23523/* 169F7 */,/*42038*/23524/* 169F8 */,/*42039*/23525/* 169F9 */,/*42040*/23526/* 169FA */, /*42041*/23527/* 169FB */,/*42042*/23528/* 169FC */,/*42043*/23529/* 169FD */,/*42044*/23530/* 169FE */, /*42045*/23531/* 169FF */,/*42046*/23532/* 16A00 */,/*42047*/23533/* 16A01 */,/*42048*/23534/* 16A02 */, /*42049*/23535/* 16A03 */,/*42050*/23536/* 16A04 */,/*42051*/23537/* 16A05 */,/*42052*/23538/* 16A06 */, /*42053*/23539/* 16A07 */,/*42054*/23540/* 16A08 */,/*42055*/23541/* 16A09 */,/*42056*/23542/* 16A0A */, /*42057*/23543/* 16A0B */,/*42058*/23544/* 16A0C */,/*42059*/23545/* 16A0D */,/*42060*/23546/* 16A0E */, /*42061*/23547/* 16A0F */,/*42062*/23548/* 16A10 */,/*42063*/23549/* 16A11 */,/*42064*/23550/* 16A12 */, /*42065*/23551/* 16A13 */,/*42066*/23552/* 16A14 */,/*42067*/23553/* 16A15 */,/*42068*/23554/* 16A16 */, /*42069*/23555/* 16A17 */,/*42070*/23556/* 16A18 */,/*42071*/23557/* 16A19 */,/*42072*/23558/* 16A1A */, /*42073*/23559/* 16A1B */,/*42074*/23560/* 16A1C */,/*42075*/23561/* 16A1D */,/*42076*/23562/* 16A1E */, /*42077*/23563/* 16A1F */,/*42078*/23564/* 16A20 */,/*42079*/23565/* 16A21 */,/*42080*/23566/* 16A22 */, /*42081*/23567/* 16A23 */,/*42082*/23568/* 16A24 */,/*42083*/23569/* 16A25 */,/*42084*/23570/* 16A26 */, /*42085*/23571/* 16A27 */,/*42086*/23572/* 16A28 */,/*42087*/23573/* 16A29 */,/*42088*/23574/* 16A2A */, /*42089*/23575/* 16A2B */,/*42090*/23576/* 16A2C */,/*42091*/23577/* 16A2D */,/*42092*/23578/* 16A2E */, /*42093*/23579/* 16A2F */,/*42094*/23580/* 16A30 */,/*42095*/23581/* 16A31 */,/*42096*/23582/* 16A32 */, /*42097*/23583/* 16A33 */,/*42098*/23584/* 16A34 */,/*42099*/23585/* 16A35 */,/*42100*/23586/* 16A36 */, /*42101*/23587/* 16A37 */,/*42102*/23588/* 16A38 */,0,0,0,0,0,0,0,/*42110*/23589/* 16A40 */,/*42111*/23590/* 16A41 */, /*42112*/23591/* 16A42 */,/*42113*/23592/* 16A43 */,/*42114*/23593/* 16A44 */,/*42115*/23594/* 16A45 */, /*42116*/23595/* 16A46 */,/*42117*/23596/* 16A47 */,/*42118*/23597/* 16A48 */,/*42119*/23598/* 16A49 */, /*42120*/23599/* 16A4A */,/*42121*/23600/* 16A4B */,/*42122*/23601/* 16A4C */,/*42123*/23602/* 16A4D */, /*42124*/23603/* 16A4E */,/*42125*/23604/* 16A4F */,/*42126*/23605/* 16A50 */,/*42127*/23606/* 16A51 */, /*42128*/23607/* 16A52 */,/*42129*/23608/* 16A53 */,/*42130*/23609/* 16A54 */,/*42131*/23610/* 16A55 */, /*42132*/23611/* 16A56 */,/*42133*/23612/* 16A57 */,/*42134*/23613/* 16A58 */,/*42135*/23614/* 16A59 */, /*42136*/23615/* 16A5A */,/*42137*/23616/* 16A5B */,/*42138*/23617/* 16A5C */,/*42139*/23618/* 16A5D */, /*42140*/23619/* 16A5E */,0,/*42142*/23620/* 16A60 */,/*42143*/23621/* 16A61 */,/*42144*/23622/* 16A62 */, /*42145*/23623/* 16A63 */,/*42146*/23624/* 16A64 */,/*42147*/23625/* 16A65 */,/*42148*/23626/* 16A66 */, /*42149*/23627/* 16A67 */,/*42150*/23628/* 16A68 */,/*42151*/23629/* 16A69 */,0,0,0,0,/*42156*/23630/* 16A6E */, /*42157*/23631/* 16A6F */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*42254*/23632/* 16AD0 */,/*42255*/23633/* 16AD1 */,/*42256*/23634/* 16AD2 */,/*42257*/23635/* 16AD3 */, /*42258*/23636/* 16AD4 */,/*42259*/23637/* 16AD5 */,/*42260*/23638/* 16AD6 */,/*42261*/23639/* 16AD7 */, /*42262*/23640/* 16AD8 */,/*42263*/23641/* 16AD9 */,/*42264*/23642/* 16ADA */,/*42265*/23643/* 16ADB */, /*42266*/23644/* 16ADC */,/*42267*/23645/* 16ADD */,/*42268*/23646/* 16ADE */,/*42269*/23647/* 16ADF */, /*42270*/23648/* 16AE0 */,/*42271*/23649/* 16AE1 */,/*42272*/23650/* 16AE2 */,/*42273*/23651/* 16AE3 */, /*42274*/23652/* 16AE4 */,/*42275*/23653/* 16AE5 */,/*42276*/23654/* 16AE6 */,/*42277*/23655/* 16AE7 */, /*42278*/23656/* 16AE8 */,/*42279*/23657/* 16AE9 */,/*42280*/23658/* 16AEA */,/*42281*/23659/* 16AEB */, /*42282*/23660/* 16AEC */,/*42283*/23661/* 16AED */,0,0,/*42286*/23662/* 16AF0 */,/*42287*/23663/* 16AF1 */, /*42288*/23664/* 16AF2 */,/*42289*/23665/* 16AF3 */,/*42290*/23666/* 16AF4 */,/*42291*/23667/* 16AF5 */,0,0,0,0,0,0,0,0, 0,0,/*42302*/23668/* 16B00 */,/*42303*/23669/* 16B01 */,/*42304*/23670/* 16B02 */,/*42305*/23671/* 16B03 */, /*42306*/23672/* 16B04 */,/*42307*/23673/* 16B05 */,/*42308*/23674/* 16B06 */,/*42309*/23675/* 16B07 */, /*42310*/23676/* 16B08 */,/*42311*/23677/* 16B09 */,/*42312*/23678/* 16B0A */,/*42313*/23679/* 16B0B */, /*42314*/23680/* 16B0C */,/*42315*/23681/* 16B0D */,/*42316*/23682/* 16B0E */,/*42317*/23683/* 16B0F */, /*42318*/23684/* 16B10 */,/*42319*/23685/* 16B11 */,/*42320*/23686/* 16B12 */,/*42321*/23687/* 16B13 */, /*42322*/23688/* 16B14 */,/*42323*/23689/* 16B15 */,/*42324*/23690/* 16B16 */,/*42325*/23691/* 16B17 */, /*42326*/23692/* 16B18 */,/*42327*/23693/* 16B19 */,/*42328*/23694/* 16B1A */,/*42329*/23695/* 16B1B */, /*42330*/23696/* 16B1C */,/*42331*/23697/* 16B1D */,/*42332*/23698/* 16B1E */,/*42333*/23699/* 16B1F */, /*42334*/23700/* 16B20 */,/*42335*/23701/* 16B21 */,/*42336*/23702/* 16B22 */,/*42337*/23703/* 16B23 */, /*42338*/23704/* 16B24 */,/*42339*/23705/* 16B25 */,/*42340*/23706/* 16B26 */,/*42341*/23707/* 16B27 */, /*42342*/23708/* 16B28 */,/*42343*/23709/* 16B29 */,/*42344*/23710/* 16B2A */,/*42345*/23711/* 16B2B */, /*42346*/23712/* 16B2C */,/*42347*/23713/* 16B2D */,/*42348*/23714/* 16B2E */,/*42349*/23715/* 16B2F */, /*42350*/23716/* 16B30 */,/*42351*/23717/* 16B31 */,/*42352*/23718/* 16B32 */,/*42353*/23719/* 16B33 */, /*42354*/23720/* 16B34 */,/*42355*/23721/* 16B35 */,/*42356*/23722/* 16B36 */,/*42357*/23723/* 16B37 */, /*42358*/23724/* 16B38 */,/*42359*/23725/* 16B39 */,/*42360*/23726/* 16B3A */,/*42361*/23727/* 16B3B */, /*42362*/23728/* 16B3C */,/*42363*/23729/* 16B3D */,/*42364*/23730/* 16B3E */,/*42365*/23731/* 16B3F */, /*42366*/23732/* 16B40 */,/*42367*/23733/* 16B41 */,/*42368*/23734/* 16B42 */,/*42369*/23735/* 16B43 */, /*42370*/23736/* 16B44 */,/*42371*/23737/* 16B45 */,0,0,0,0,0,0,0,0,0,0,/*42382*/23738/* 16B50 */, /*42383*/23739/* 16B51 */,/*42384*/23740/* 16B52 */,/*42385*/23741/* 16B53 */,/*42386*/23742/* 16B54 */, /*42387*/23743/* 16B55 */,/*42388*/23744/* 16B56 */,/*42389*/23745/* 16B57 */,/*42390*/23746/* 16B58 */, /*42391*/23747/* 16B59 */,0,/*42393*/23748/* 16B5B */,/*42394*/23749/* 16B5C */,/*42395*/23750/* 16B5D */, /*42396*/23751/* 16B5E */,/*42397*/23752/* 16B5F */,/*42398*/23753/* 16B60 */,/*42399*/23754/* 16B61 */,0, /*42401*/23755/* 16B63 */,/*42402*/23756/* 16B64 */,/*42403*/23757/* 16B65 */,/*42404*/23758/* 16B66 */, /*42405*/23759/* 16B67 */,/*42406*/23760/* 16B68 */,/*42407*/23761/* 16B69 */,/*42408*/23762/* 16B6A */, /*42409*/23763/* 16B6B */,/*42410*/23764/* 16B6C */,/*42411*/23765/* 16B6D */,/*42412*/23766/* 16B6E */, /*42413*/23767/* 16B6F */,/*42414*/23768/* 16B70 */,/*42415*/23769/* 16B71 */,/*42416*/23770/* 16B72 */, /*42417*/23771/* 16B73 */,/*42418*/23772/* 16B74 */,/*42419*/23773/* 16B75 */,/*42420*/23774/* 16B76 */, /*42421*/23775/* 16B77 */,0,0,0,0,0,/*42427*/23776/* 16B7D */,/*42428*/23777/* 16B7E */,/*42429*/23778/* 16B7F */, /*42430*/23779/* 16B80 */,/*42431*/23780/* 16B81 */,/*42432*/23781/* 16B82 */,/*42433*/23782/* 16B83 */, /*42434*/23783/* 16B84 */,/*42435*/23784/* 16B85 */,/*42436*/23785/* 16B86 */,/*42437*/23786/* 16B87 */, /*42438*/23787/* 16B88 */,/*42439*/23788/* 16B89 */,/*42440*/23789/* 16B8A */,/*42441*/23790/* 16B8B */, /*42442*/23791/* 16B8C */,/*42443*/23792/* 16B8D */,/*42444*/23793/* 16B8E */,/*42445*/23794/* 16B8F */,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*43326*/23795/* 16F00 */,/*43327*/23796/* 16F01 */, /*43328*/23797/* 16F02 */,/*43329*/23798/* 16F03 */,/*43330*/23799/* 16F04 */,/*43331*/23800/* 16F05 */, /*43332*/23801/* 16F06 */,/*43333*/23802/* 16F07 */,/*43334*/23803/* 16F08 */,/*43335*/23804/* 16F09 */, /*43336*/23805/* 16F0A */,/*43337*/23806/* 16F0B */,/*43338*/23807/* 16F0C */,/*43339*/23808/* 16F0D */, /*43340*/23809/* 16F0E */,/*43341*/23810/* 16F0F */,/*43342*/23811/* 16F10 */,/*43343*/23812/* 16F11 */, /*43344*/23813/* 16F12 */,/*43345*/23814/* 16F13 */,/*43346*/23815/* 16F14 */,/*43347*/23816/* 16F15 */, /*43348*/23817/* 16F16 */,/*43349*/23818/* 16F17 */,/*43350*/23819/* 16F18 */,/*43351*/23820/* 16F19 */, /*43352*/23821/* 16F1A */,/*43353*/23822/* 16F1B */,/*43354*/23823/* 16F1C */,/*43355*/23824/* 16F1D */, /*43356*/23825/* 16F1E */,/*43357*/23826/* 16F1F */,/*43358*/23827/* 16F20 */,/*43359*/23828/* 16F21 */, /*43360*/23829/* 16F22 */,/*43361*/23830/* 16F23 */,/*43362*/23831/* 16F24 */,/*43363*/23832/* 16F25 */, /*43364*/23833/* 16F26 */,/*43365*/23834/* 16F27 */,/*43366*/23835/* 16F28 */,/*43367*/23836/* 16F29 */, /*43368*/23837/* 16F2A */,/*43369*/23838/* 16F2B */,/*43370*/23839/* 16F2C */,/*43371*/23840/* 16F2D */, /*43372*/23841/* 16F2E */,/*43373*/23842/* 16F2F */,/*43374*/23843/* 16F30 */,/*43375*/23844/* 16F31 */, /*43376*/23845/* 16F32 */,/*43377*/23846/* 16F33 */,/*43378*/23847/* 16F34 */,/*43379*/23848/* 16F35 */, /*43380*/23849/* 16F36 */,/*43381*/23850/* 16F37 */,/*43382*/23851/* 16F38 */,/*43383*/23852/* 16F39 */, /*43384*/23853/* 16F3A */,/*43385*/23854/* 16F3B */,/*43386*/23855/* 16F3C */,/*43387*/23856/* 16F3D */, /*43388*/23857/* 16F3E */,/*43389*/23858/* 16F3F */,/*43390*/23859/* 16F40 */,/*43391*/23860/* 16F41 */, /*43392*/23861/* 16F42 */,/*43393*/23862/* 16F43 */,/*43394*/23863/* 16F44 */,0,0,0,0,0,0,0,0,0,0,0, /*43406*/23864/* 16F50 */,/*43407*/23865/* 16F51 */,/*43408*/23866/* 16F52 */,/*43409*/23867/* 16F53 */, /*43410*/23868/* 16F54 */,/*43411*/23869/* 16F55 */,/*43412*/23870/* 16F56 */,/*43413*/23871/* 16F57 */, /*43414*/23872/* 16F58 */,/*43415*/23873/* 16F59 */,/*43416*/23874/* 16F5A */,/*43417*/23875/* 16F5B */, /*43418*/23876/* 16F5C */,/*43419*/23877/* 16F5D */,/*43420*/23878/* 16F5E */,/*43421*/23879/* 16F5F */, /*43422*/23880/* 16F60 */,/*43423*/23881/* 16F61 */,/*43424*/23882/* 16F62 */,/*43425*/23883/* 16F63 */, /*43426*/23884/* 16F64 */,/*43427*/23885/* 16F65 */,/*43428*/23886/* 16F66 */,/*43429*/23887/* 16F67 */, /*43430*/23888/* 16F68 */,/*43431*/23889/* 16F69 */,/*43432*/23890/* 16F6A */,/*43433*/23891/* 16F6B */, /*43434*/23892/* 16F6C */,/*43435*/23893/* 16F6D */,/*43436*/23894/* 16F6E */,/*43437*/23895/* 16F6F */, /*43438*/23896/* 16F70 */,/*43439*/23897/* 16F71 */,/*43440*/23898/* 16F72 */,/*43441*/23899/* 16F73 */, /*43442*/23900/* 16F74 */,/*43443*/23901/* 16F75 */,/*43444*/23902/* 16F76 */,/*43445*/23903/* 16F77 */, /*43446*/23904/* 16F78 */,/*43447*/23905/* 16F79 */,/*43448*/23906/* 16F7A */,/*43449*/23907/* 16F7B */, /*43450*/23908/* 16F7C */,/*43451*/23909/* 16F7D */,/*43452*/23910/* 16F7E */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*43469*/23911/* 16F8F */,/*43470*/23912/* 16F90 */,/*43471*/23913/* 16F91 */,/*43472*/23914/* 16F92 */, /*43473*/23915/* 16F93 */,/*43474*/23916/* 16F94 */,/*43475*/23917/* 16F95 */,/*43476*/23918/* 16F96 */, /*43477*/23919/* 16F97 */,/*43478*/23920/* 16F98 */,/*43479*/23921/* 16F99 */,/*43480*/23922/* 16F9A */, /*43481*/23923/* 16F9B */,/*43482*/23924/* 16F9C */,/*43483*/23925/* 16F9D */,/*43484*/23926/* 16F9E */, /*43485*/23927/* 16F9F */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*43550*/23928/* 16FE0 */,/*43551*/23929/* 16FE1 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,/*43582*/23930/* 17000 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*43602*/23931/* 18800 */, /*43603*/23931/* 18801 */,/*43604*/23931/* 18802 */,/*43605*/23931/* 18803 */,/*43606*/23931/* 18804 */, /*43607*/23931/* 18805 */,/*43608*/23931/* 18806 */,/*43609*/23931/* 18807 */,/*43610*/23931/* 18808 */, /*43611*/23931/* 18809 */,/*43612*/23931/* 1880A */,/*43613*/23931/* 1880B */,/*43614*/23931/* 1880C */, /*43615*/23931/* 1880D */,/*43616*/23931/* 1880E */,/*43617*/23931/* 1880F */,/*43618*/23931/* 18810 */, /*43619*/23931/* 18811 */,/*43620*/23931/* 18812 */,/*43621*/23931/* 18813 */,/*43622*/23931/* 18814 */, /*43623*/23931/* 18815 */,/*43624*/23931/* 18816 */,/*43625*/23931/* 18817 */,/*43626*/23931/* 18818 */, /*43627*/23931/* 18819 */,/*43628*/23931/* 1881A */,/*43629*/23931/* 1881B */,/*43630*/23931/* 1881C */, /*43631*/23931/* 1881D */,/*43632*/23931/* 1881E */,/*43633*/23931/* 1881F */,/*43634*/23931/* 18820 */, /*43635*/23931/* 18821 */,/*43636*/23931/* 18822 */,/*43637*/23931/* 18823 */,/*43638*/23931/* 18824 */, /*43639*/23931/* 18825 */,/*43640*/23931/* 18826 */,/*43641*/23931/* 18827 */,/*43642*/23931/* 18828 */, /*43643*/23931/* 18829 */,/*43644*/23931/* 1882A */,/*43645*/23931/* 1882B */,/*43646*/23931/* 1882C */, /*43647*/23931/* 1882D */,/*43648*/23931/* 1882E */,/*43649*/23931/* 1882F */,/*43650*/23931/* 18830 */, /*43651*/23931/* 18831 */,/*43652*/23931/* 18832 */,/*43653*/23931/* 18833 */,/*43654*/23931/* 18834 */, /*43655*/23931/* 18835 */,/*43656*/23931/* 18836 */,/*43657*/23931/* 18837 */,/*43658*/23931/* 18838 */, /*43659*/23931/* 18839 */,/*43660*/23931/* 1883A */,/*43661*/23931/* 1883B */,/*43662*/23931/* 1883C */, /*43663*/23931/* 1883D */,/*43664*/23931/* 1883E */,/*43665*/23931/* 1883F */,/*43666*/23931/* 18840 */, /*43667*/23931/* 18841 */,/*43668*/23931/* 18842 */,/*43669*/23931/* 18843 */,/*43670*/23931/* 18844 */, /*43671*/23931/* 18845 */,/*43672*/23931/* 18846 */,/*43673*/23931/* 18847 */,/*43674*/23931/* 18848 */, /*43675*/23931/* 18849 */,/*43676*/23931/* 1884A */,/*43677*/23931/* 1884B */,/*43678*/23931/* 1884C */, /*43679*/23931/* 1884D */,/*43680*/23931/* 1884E */,/*43681*/23931/* 1884F */,/*43682*/23931/* 18850 */, /*43683*/23931/* 18851 */,/*43684*/23931/* 18852 */,/*43685*/23931/* 18853 */,/*43686*/23931/* 18854 */, /*43687*/23931/* 18855 */,/*43688*/23931/* 18856 */,/*43689*/23931/* 18857 */,/*43690*/23931/* 18858 */, /*43691*/23931/* 18859 */,/*43692*/23931/* 1885A */,/*43693*/23931/* 1885B */,/*43694*/23931/* 1885C */, /*43695*/23931/* 1885D */,/*43696*/23931/* 1885E */,/*43697*/23931/* 1885F */,/*43698*/23931/* 18860 */, /*43699*/23931/* 18861 */,/*43700*/23931/* 18862 */,/*43701*/23931/* 18863 */,/*43702*/23931/* 18864 */, /*43703*/23931/* 18865 */,/*43704*/23931/* 18866 */,/*43705*/23931/* 18867 */,/*43706*/23931/* 18868 */, /*43707*/23931/* 18869 */,/*43708*/23931/* 1886A */,/*43709*/23931/* 1886B */,/*43710*/23931/* 1886C */, /*43711*/23931/* 1886D */,/*43712*/23931/* 1886E */,/*43713*/23931/* 1886F */,/*43714*/23931/* 18870 */, /*43715*/23931/* 18871 */,/*43716*/23931/* 18872 */,/*43717*/23931/* 18873 */,/*43718*/23931/* 18874 */, /*43719*/23931/* 18875 */,/*43720*/23931/* 18876 */,/*43721*/23931/* 18877 */,/*43722*/23931/* 18878 */, /*43723*/23931/* 18879 */,/*43724*/23931/* 1887A */,/*43725*/23931/* 1887B */,/*43726*/23931/* 1887C */, /*43727*/23931/* 1887D */,/*43728*/23931/* 1887E */,/*43729*/23931/* 1887F */,/*43730*/23931/* 18880 */, /*43731*/23931/* 18881 */,/*43732*/23931/* 18882 */,/*43733*/23931/* 18883 */,/*43734*/23931/* 18884 */, /*43735*/23931/* 18885 */,/*43736*/23931/* 18886 */,/*43737*/23931/* 18887 */,/*43738*/23931/* 18888 */, /*43739*/23931/* 18889 */,/*43740*/23931/* 1888A */,/*43741*/23931/* 1888B */,/*43742*/23931/* 1888C */, /*43743*/23931/* 1888D */,/*43744*/23931/* 1888E */,/*43745*/23931/* 1888F */,/*43746*/23931/* 18890 */, /*43747*/23931/* 18891 */,/*43748*/23931/* 18892 */,/*43749*/23931/* 18893 */,/*43750*/23931/* 18894 */, /*43751*/23931/* 18895 */,/*43752*/23931/* 18896 */,/*43753*/23931/* 18897 */,/*43754*/23931/* 18898 */, /*43755*/23931/* 18899 */,/*43756*/23931/* 1889A */,/*43757*/23931/* 1889B */,/*43758*/23931/* 1889C */, /*43759*/23931/* 1889D */,/*43760*/23931/* 1889E */,/*43761*/23931/* 1889F */,/*43762*/23931/* 188A0 */, /*43763*/23931/* 188A1 */,/*43764*/23931/* 188A2 */,/*43765*/23931/* 188A3 */,/*43766*/23931/* 188A4 */, /*43767*/23931/* 188A5 */,/*43768*/23931/* 188A6 */,/*43769*/23931/* 188A7 */,/*43770*/23931/* 188A8 */, /*43771*/23931/* 188A9 */,/*43772*/23931/* 188AA */,/*43773*/23931/* 188AB */,/*43774*/23931/* 188AC */, /*43775*/23931/* 188AD */,/*43776*/23931/* 188AE */,/*43777*/23931/* 188AF */,/*43778*/23931/* 188B0 */, /*43779*/23931/* 188B1 */,/*43780*/23931/* 188B2 */,/*43781*/23931/* 188B3 */,/*43782*/23931/* 188B4 */, /*43783*/23931/* 188B5 */,/*43784*/23931/* 188B6 */,/*43785*/23931/* 188B7 */,/*43786*/23931/* 188B8 */, /*43787*/23931/* 188B9 */,/*43788*/23931/* 188BA */,/*43789*/23931/* 188BB */,/*43790*/23931/* 188BC */, /*43791*/23931/* 188BD */,/*43792*/23931/* 188BE */,/*43793*/23931/* 188BF */,/*43794*/23931/* 188C0 */, /*43795*/23931/* 188C1 */,/*43796*/23931/* 188C2 */,/*43797*/23931/* 188C3 */,/*43798*/23931/* 188C4 */, /*43799*/23931/* 188C5 */,/*43800*/23931/* 188C6 */,/*43801*/23931/* 188C7 */,/*43802*/23931/* 188C8 */, /*43803*/23931/* 188C9 */,/*43804*/23931/* 188CA */,/*43805*/23931/* 188CB */,/*43806*/23931/* 188CC */, /*43807*/23931/* 188CD */,/*43808*/23931/* 188CE */,/*43809*/23931/* 188CF */,/*43810*/23931/* 188D0 */, /*43811*/23931/* 188D1 */,/*43812*/23931/* 188D2 */,/*43813*/23931/* 188D3 */,/*43814*/23931/* 188D4 */, /*43815*/23931/* 188D5 */,/*43816*/23931/* 188D6 */,/*43817*/23931/* 188D7 */,/*43818*/23931/* 188D8 */, /*43819*/23931/* 188D9 */,/*43820*/23931/* 188DA */,/*43821*/23931/* 188DB */,/*43822*/23931/* 188DC */, /*43823*/23931/* 188DD */,/*43824*/23931/* 188DE */,/*43825*/23931/* 188DF */,/*43826*/23931/* 188E0 */, /*43827*/23931/* 188E1 */,/*43828*/23931/* 188E2 */,/*43829*/23931/* 188E3 */,/*43830*/23931/* 188E4 */, /*43831*/23931/* 188E5 */,/*43832*/23931/* 188E6 */,/*43833*/23931/* 188E7 */,/*43834*/23931/* 188E8 */, /*43835*/23931/* 188E9 */,/*43836*/23931/* 188EA */,/*43837*/23931/* 188EB */,/*43838*/23931/* 188EC */, /*43839*/23931/* 188ED */,/*43840*/23931/* 188EE */,/*43841*/23931/* 188EF */,/*43842*/23931/* 188F0 */, /*43843*/23931/* 188F1 */,/*43844*/23931/* 188F2 */,/*43845*/23931/* 188F3 */,/*43846*/23931/* 188F4 */, /*43847*/23931/* 188F5 */,/*43848*/23931/* 188F6 */,/*43849*/23931/* 188F7 */,/*43850*/23931/* 188F8 */, /*43851*/23931/* 188F9 */,/*43852*/23931/* 188FA */,/*43853*/23931/* 188FB */,/*43854*/23931/* 188FC */, /*43855*/23931/* 188FD */,/*43856*/23931/* 188FE */,/*43857*/23931/* 188FF */,/*43858*/23931/* 18900 */, /*43859*/23931/* 18901 */,/*43860*/23931/* 18902 */,/*43861*/23931/* 18903 */,/*43862*/23931/* 18904 */, /*43863*/23931/* 18905 */,/*43864*/23931/* 18906 */,/*43865*/23931/* 18907 */,/*43866*/23931/* 18908 */, /*43867*/23931/* 18909 */,/*43868*/23931/* 1890A */,/*43869*/23931/* 1890B */,/*43870*/23931/* 1890C */, /*43871*/23931/* 1890D */,/*43872*/23931/* 1890E */,/*43873*/23931/* 1890F */,/*43874*/23931/* 18910 */, /*43875*/23931/* 18911 */,/*43876*/23931/* 18912 */,/*43877*/23931/* 18913 */,/*43878*/23931/* 18914 */, /*43879*/23931/* 18915 */,/*43880*/23931/* 18916 */,/*43881*/23931/* 18917 */,/*43882*/23931/* 18918 */, /*43883*/23931/* 18919 */,/*43884*/23931/* 1891A */,/*43885*/23931/* 1891B */,/*43886*/23931/* 1891C */, /*43887*/23931/* 1891D */,/*43888*/23931/* 1891E */,/*43889*/23931/* 1891F */,/*43890*/23931/* 18920 */, /*43891*/23931/* 18921 */,/*43892*/23931/* 18922 */,/*43893*/23931/* 18923 */,/*43894*/23931/* 18924 */, /*43895*/23931/* 18925 */,/*43896*/23931/* 18926 */,/*43897*/23931/* 18927 */,/*43898*/23931/* 18928 */, /*43899*/23931/* 18929 */,/*43900*/23931/* 1892A */,/*43901*/23931/* 1892B */,/*43902*/23931/* 1892C */, /*43903*/23931/* 1892D */,/*43904*/23931/* 1892E */,/*43905*/23931/* 1892F */,/*43906*/23931/* 18930 */, /*43907*/23931/* 18931 */,/*43908*/23931/* 18932 */,/*43909*/23931/* 18933 */,/*43910*/23931/* 18934 */, /*43911*/23931/* 18935 */,/*43912*/23931/* 18936 */,/*43913*/23931/* 18937 */,/*43914*/23931/* 18938 */, /*43915*/23931/* 18939 */,/*43916*/23931/* 1893A */,/*43917*/23931/* 1893B */,/*43918*/23931/* 1893C */, /*43919*/23931/* 1893D */,/*43920*/23931/* 1893E */,/*43921*/23931/* 1893F */,/*43922*/23931/* 18940 */, /*43923*/23931/* 18941 */,/*43924*/23931/* 18942 */,/*43925*/23931/* 18943 */,/*43926*/23931/* 18944 */, /*43927*/23931/* 18945 */,/*43928*/23931/* 18946 */,/*43929*/23931/* 18947 */,/*43930*/23931/* 18948 */, /*43931*/23931/* 18949 */,/*43932*/23931/* 1894A */,/*43933*/23931/* 1894B */,/*43934*/23931/* 1894C */, /*43935*/23931/* 1894D */,/*43936*/23931/* 1894E */,/*43937*/23931/* 1894F */,/*43938*/23931/* 18950 */, /*43939*/23931/* 18951 */,/*43940*/23931/* 18952 */,/*43941*/23931/* 18953 */,/*43942*/23931/* 18954 */, /*43943*/23931/* 18955 */,/*43944*/23931/* 18956 */,/*43945*/23931/* 18957 */,/*43946*/23931/* 18958 */, /*43947*/23931/* 18959 */,/*43948*/23931/* 1895A */,/*43949*/23931/* 1895B */,/*43950*/23931/* 1895C */, /*43951*/23931/* 1895D */,/*43952*/23931/* 1895E */,/*43953*/23931/* 1895F */,/*43954*/23931/* 18960 */, /*43955*/23931/* 18961 */,/*43956*/23931/* 18962 */,/*43957*/23931/* 18963 */,/*43958*/23931/* 18964 */, /*43959*/23931/* 18965 */,/*43960*/23931/* 18966 */,/*43961*/23931/* 18967 */,/*43962*/23931/* 18968 */, /*43963*/23931/* 18969 */,/*43964*/23931/* 1896A */,/*43965*/23931/* 1896B */,/*43966*/23931/* 1896C */, /*43967*/23931/* 1896D */,/*43968*/23931/* 1896E */,/*43969*/23931/* 1896F */,/*43970*/23931/* 18970 */, /*43971*/23931/* 18971 */,/*43972*/23931/* 18972 */,/*43973*/23931/* 18973 */,/*43974*/23931/* 18974 */, /*43975*/23931/* 18975 */,/*43976*/23931/* 18976 */,/*43977*/23931/* 18977 */,/*43978*/23931/* 18978 */, /*43979*/23931/* 18979 */,/*43980*/23931/* 1897A */,/*43981*/23931/* 1897B */,/*43982*/23931/* 1897C */, /*43983*/23931/* 1897D */,/*43984*/23931/* 1897E */,/*43985*/23931/* 1897F */,/*43986*/23931/* 18980 */, /*43987*/23931/* 18981 */,/*43988*/23931/* 18982 */,/*43989*/23931/* 18983 */,/*43990*/23931/* 18984 */, /*43991*/23931/* 18985 */,/*43992*/23931/* 18986 */,/*43993*/23931/* 18987 */,/*43994*/23931/* 18988 */, /*43995*/23931/* 18989 */,/*43996*/23931/* 1898A */,/*43997*/23931/* 1898B */,/*43998*/23931/* 1898C */, /*43999*/23931/* 1898D */,/*44000*/23931/* 1898E */,/*44001*/23931/* 1898F */,/*44002*/23931/* 18990 */, /*44003*/23931/* 18991 */,/*44004*/23931/* 18992 */,/*44005*/23931/* 18993 */,/*44006*/23931/* 18994 */, /*44007*/23931/* 18995 */,/*44008*/23931/* 18996 */,/*44009*/23931/* 18997 */,/*44010*/23931/* 18998 */, /*44011*/23931/* 18999 */,/*44012*/23931/* 1899A */,/*44013*/23931/* 1899B */,/*44014*/23931/* 1899C */, /*44015*/23931/* 1899D */,/*44016*/23931/* 1899E */,/*44017*/23931/* 1899F */,/*44018*/23931/* 189A0 */, /*44019*/23931/* 189A1 */,/*44020*/23931/* 189A2 */,/*44021*/23931/* 189A3 */,/*44022*/23931/* 189A4 */, /*44023*/23931/* 189A5 */,/*44024*/23931/* 189A6 */,/*44025*/23931/* 189A7 */,/*44026*/23931/* 189A8 */, /*44027*/23931/* 189A9 */,/*44028*/23931/* 189AA */,/*44029*/23931/* 189AB */,/*44030*/23931/* 189AC */, /*44031*/23931/* 189AD */,/*44032*/23931/* 189AE */,/*44033*/23931/* 189AF */,/*44034*/23931/* 189B0 */, /*44035*/23931/* 189B1 */,/*44036*/23931/* 189B2 */,/*44037*/23931/* 189B3 */,/*44038*/23931/* 189B4 */, /*44039*/23931/* 189B5 */,/*44040*/23931/* 189B6 */,/*44041*/23931/* 189B7 */,/*44042*/23931/* 189B8 */, /*44043*/23931/* 189B9 */,/*44044*/23931/* 189BA */,/*44045*/23931/* 189BB */,/*44046*/23931/* 189BC */, /*44047*/23931/* 189BD */,/*44048*/23931/* 189BE */,/*44049*/23931/* 189BF */,/*44050*/23931/* 189C0 */, /*44051*/23931/* 189C1 */,/*44052*/23931/* 189C2 */,/*44053*/23931/* 189C3 */,/*44054*/23931/* 189C4 */, /*44055*/23931/* 189C5 */,/*44056*/23931/* 189C6 */,/*44057*/23931/* 189C7 */,/*44058*/23931/* 189C8 */, /*44059*/23931/* 189C9 */,/*44060*/23931/* 189CA */,/*44061*/23931/* 189CB */,/*44062*/23931/* 189CC */, /*44063*/23931/* 189CD */,/*44064*/23931/* 189CE */,/*44065*/23931/* 189CF */,/*44066*/23931/* 189D0 */, /*44067*/23931/* 189D1 */,/*44068*/23931/* 189D2 */,/*44069*/23931/* 189D3 */,/*44070*/23931/* 189D4 */, /*44071*/23931/* 189D5 */,/*44072*/23931/* 189D6 */,/*44073*/23931/* 189D7 */,/*44074*/23931/* 189D8 */, /*44075*/23931/* 189D9 */,/*44076*/23931/* 189DA */,/*44077*/23931/* 189DB */,/*44078*/23931/* 189DC */, /*44079*/23931/* 189DD */,/*44080*/23931/* 189DE */,/*44081*/23931/* 189DF */,/*44082*/23931/* 189E0 */, /*44083*/23931/* 189E1 */,/*44084*/23931/* 189E2 */,/*44085*/23931/* 189E3 */,/*44086*/23931/* 189E4 */, /*44087*/23931/* 189E5 */,/*44088*/23931/* 189E6 */,/*44089*/23931/* 189E7 */,/*44090*/23931/* 189E8 */, /*44091*/23931/* 189E9 */,/*44092*/23931/* 189EA */,/*44093*/23931/* 189EB */,/*44094*/23931/* 189EC */, /*44095*/23931/* 189ED */,/*44096*/23931/* 189EE */,/*44097*/23931/* 189EF */,/*44098*/23931/* 189F0 */, /*44099*/23931/* 189F1 */,/*44100*/23931/* 189F2 */,/*44101*/23931/* 189F3 */,/*44102*/23931/* 189F4 */, /*44103*/23931/* 189F5 */,/*44104*/23931/* 189F6 */,/*44105*/23931/* 189F7 */,/*44106*/23931/* 189F8 */, /*44107*/23931/* 189F9 */,/*44108*/23931/* 189FA */,/*44109*/23931/* 189FB */,/*44110*/23931/* 189FC */, /*44111*/23931/* 189FD */,/*44112*/23931/* 189FE */,/*44113*/23931/* 189FF */,/*44114*/23931/* 18A00 */, /*44115*/23931/* 18A01 */,/*44116*/23931/* 18A02 */,/*44117*/23931/* 18A03 */,/*44118*/23931/* 18A04 */, /*44119*/23931/* 18A05 */,/*44120*/23931/* 18A06 */,/*44121*/23931/* 18A07 */,/*44122*/23931/* 18A08 */, /*44123*/23931/* 18A09 */,/*44124*/23931/* 18A0A */,/*44125*/23931/* 18A0B */,/*44126*/23931/* 18A0C */, /*44127*/23931/* 18A0D */,/*44128*/23931/* 18A0E */,/*44129*/23931/* 18A0F */,/*44130*/23931/* 18A10 */, /*44131*/23931/* 18A11 */,/*44132*/23931/* 18A12 */,/*44133*/23931/* 18A13 */,/*44134*/23931/* 18A14 */, /*44135*/23931/* 18A15 */,/*44136*/23931/* 18A16 */,/*44137*/23931/* 18A17 */,/*44138*/23931/* 18A18 */, /*44139*/23931/* 18A19 */,/*44140*/23931/* 18A1A */,/*44141*/23931/* 18A1B */,/*44142*/23931/* 18A1C */, /*44143*/23931/* 18A1D */,/*44144*/23931/* 18A1E */,/*44145*/23931/* 18A1F */,/*44146*/23931/* 18A20 */, /*44147*/23931/* 18A21 */,/*44148*/23931/* 18A22 */,/*44149*/23931/* 18A23 */,/*44150*/23931/* 18A24 */, /*44151*/23931/* 18A25 */,/*44152*/23931/* 18A26 */,/*44153*/23931/* 18A27 */,/*44154*/23931/* 18A28 */, /*44155*/23931/* 18A29 */,/*44156*/23931/* 18A2A */,/*44157*/23931/* 18A2B */,/*44158*/23931/* 18A2C */, /*44159*/23931/* 18A2D */,/*44160*/23931/* 18A2E */,/*44161*/23931/* 18A2F */,/*44162*/23931/* 18A30 */, /*44163*/23931/* 18A31 */,/*44164*/23931/* 18A32 */,/*44165*/23931/* 18A33 */,/*44166*/23931/* 18A34 */, /*44167*/23931/* 18A35 */,/*44168*/23931/* 18A36 */,/*44169*/23931/* 18A37 */,/*44170*/23931/* 18A38 */, /*44171*/23931/* 18A39 */,/*44172*/23931/* 18A3A */,/*44173*/23931/* 18A3B */,/*44174*/23931/* 18A3C */, /*44175*/23931/* 18A3D */,/*44176*/23931/* 18A3E */,/*44177*/23931/* 18A3F */,/*44178*/23931/* 18A40 */, /*44179*/23931/* 18A41 */,/*44180*/23931/* 18A42 */,/*44181*/23931/* 18A43 */,/*44182*/23931/* 18A44 */, /*44183*/23931/* 18A45 */,/*44184*/23931/* 18A46 */,/*44185*/23931/* 18A47 */,/*44186*/23931/* 18A48 */, /*44187*/23931/* 18A49 */,/*44188*/23931/* 18A4A */,/*44189*/23931/* 18A4B */,/*44190*/23931/* 18A4C */, /*44191*/23931/* 18A4D */,/*44192*/23931/* 18A4E */,/*44193*/23931/* 18A4F */,/*44194*/23931/* 18A50 */, /*44195*/23931/* 18A51 */,/*44196*/23931/* 18A52 */,/*44197*/23931/* 18A53 */,/*44198*/23931/* 18A54 */, /*44199*/23931/* 18A55 */,/*44200*/23931/* 18A56 */,/*44201*/23931/* 18A57 */,/*44202*/23931/* 18A58 */, /*44203*/23931/* 18A59 */,/*44204*/23931/* 18A5A */,/*44205*/23931/* 18A5B */,/*44206*/23931/* 18A5C */, /*44207*/23931/* 18A5D */,/*44208*/23931/* 18A5E */,/*44209*/23931/* 18A5F */,/*44210*/23931/* 18A60 */, /*44211*/23931/* 18A61 */,/*44212*/23931/* 18A62 */,/*44213*/23931/* 18A63 */,/*44214*/23931/* 18A64 */, /*44215*/23931/* 18A65 */,/*44216*/23931/* 18A66 */,/*44217*/23931/* 18A67 */,/*44218*/23931/* 18A68 */, /*44219*/23931/* 18A69 */,/*44220*/23931/* 18A6A */,/*44221*/23931/* 18A6B */,/*44222*/23931/* 18A6C */, /*44223*/23931/* 18A6D */,/*44224*/23931/* 18A6E */,/*44225*/23931/* 18A6F */,/*44226*/23931/* 18A70 */, /*44227*/23931/* 18A71 */,/*44228*/23931/* 18A72 */,/*44229*/23931/* 18A73 */,/*44230*/23931/* 18A74 */, /*44231*/23931/* 18A75 */,/*44232*/23931/* 18A76 */,/*44233*/23931/* 18A77 */,/*44234*/23931/* 18A78 */, /*44235*/23931/* 18A79 */,/*44236*/23931/* 18A7A */,/*44237*/23931/* 18A7B */,/*44238*/23931/* 18A7C */, /*44239*/23931/* 18A7D */,/*44240*/23931/* 18A7E */,/*44241*/23931/* 18A7F */,/*44242*/23931/* 18A80 */, /*44243*/23931/* 18A81 */,/*44244*/23931/* 18A82 */,/*44245*/23931/* 18A83 */,/*44246*/23931/* 18A84 */, /*44247*/23931/* 18A85 */,/*44248*/23931/* 18A86 */,/*44249*/23931/* 18A87 */,/*44250*/23931/* 18A88 */, /*44251*/23931/* 18A89 */,/*44252*/23931/* 18A8A */,/*44253*/23931/* 18A8B */,/*44254*/23931/* 18A8C */, /*44255*/23931/* 18A8D */,/*44256*/23931/* 18A8E */,/*44257*/23931/* 18A8F */,/*44258*/23931/* 18A90 */, /*44259*/23931/* 18A91 */,/*44260*/23931/* 18A92 */,/*44261*/23931/* 18A93 */,/*44262*/23931/* 18A94 */, /*44263*/23931/* 18A95 */,/*44264*/23931/* 18A96 */,/*44265*/23931/* 18A97 */,/*44266*/23931/* 18A98 */, /*44267*/23931/* 18A99 */,/*44268*/23931/* 18A9A */,/*44269*/23931/* 18A9B */,/*44270*/23931/* 18A9C */, /*44271*/23931/* 18A9D */,/*44272*/23931/* 18A9E */,/*44273*/23931/* 18A9F */,/*44274*/23931/* 18AA0 */, /*44275*/23931/* 18AA1 */,/*44276*/23931/* 18AA2 */,/*44277*/23931/* 18AA3 */,/*44278*/23931/* 18AA4 */, /*44279*/23931/* 18AA5 */,/*44280*/23931/* 18AA6 */,/*44281*/23931/* 18AA7 */,/*44282*/23931/* 18AA8 */, /*44283*/23931/* 18AA9 */,/*44284*/23931/* 18AAA */,/*44285*/23931/* 18AAB */,/*44286*/23931/* 18AAC */, /*44287*/23931/* 18AAD */,/*44288*/23931/* 18AAE */,/*44289*/23931/* 18AAF */,/*44290*/23931/* 18AB0 */, /*44291*/23931/* 18AB1 */,/*44292*/23931/* 18AB2 */,/*44293*/23931/* 18AB3 */,/*44294*/23931/* 18AB4 */, /*44295*/23931/* 18AB5 */,/*44296*/23931/* 18AB6 */,/*44297*/23931/* 18AB7 */,/*44298*/23931/* 18AB8 */, /*44299*/23931/* 18AB9 */,/*44300*/23931/* 18ABA */,/*44301*/23931/* 18ABB */,/*44302*/23931/* 18ABC */, /*44303*/23931/* 18ABD */,/*44304*/23931/* 18ABE */,/*44305*/23931/* 18ABF */,/*44306*/23931/* 18AC0 */, /*44307*/23931/* 18AC1 */,/*44308*/23931/* 18AC2 */,/*44309*/23931/* 18AC3 */,/*44310*/23931/* 18AC4 */, /*44311*/23931/* 18AC5 */,/*44312*/23931/* 18AC6 */,/*44313*/23931/* 18AC7 */,/*44314*/23931/* 18AC8 */, /*44315*/23931/* 18AC9 */,/*44316*/23931/* 18ACA */,/*44317*/23931/* 18ACB */,/*44318*/23931/* 18ACC */, /*44319*/23931/* 18ACD */,/*44320*/23931/* 18ACE */,/*44321*/23931/* 18ACF */,/*44322*/23931/* 18AD0 */, /*44323*/23931/* 18AD1 */,/*44324*/23931/* 18AD2 */,/*44325*/23931/* 18AD3 */,/*44326*/23931/* 18AD4 */, /*44327*/23931/* 18AD5 */,/*44328*/23931/* 18AD6 */,/*44329*/23931/* 18AD7 */,/*44330*/23931/* 18AD8 */, /*44331*/23931/* 18AD9 */,/*44332*/23931/* 18ADA */,/*44333*/23931/* 18ADB */,/*44334*/23931/* 18ADC */, /*44335*/23931/* 18ADD */,/*44336*/23931/* 18ADE */,/*44337*/23931/* 18ADF */,/*44338*/23931/* 18AE0 */, /*44339*/23931/* 18AE1 */,/*44340*/23931/* 18AE2 */,/*44341*/23931/* 18AE3 */,/*44342*/23931/* 18AE4 */, /*44343*/23931/* 18AE5 */,/*44344*/23931/* 18AE6 */,/*44345*/23931/* 18AE7 */,/*44346*/23931/* 18AE8 */, /*44347*/23931/* 18AE9 */,/*44348*/23931/* 18AEA */,/*44349*/23931/* 18AEB */,/*44350*/23931/* 18AEC */, /*44351*/23931/* 18AED */,/*44352*/23931/* 18AEE */,/*44353*/23931/* 18AEF */,/*44354*/23931/* 18AF0 */, /*44355*/23931/* 18AF1 */,/*44356*/23931/* 18AF2 */,/*44357*/23932/* 1B000 */,/*44358*/23933/* 1B001 */, /*44359*/23934/* 1B002 */,/*44360*/23935/* 1B003 */,/*44361*/23936/* 1B004 */,/*44362*/23937/* 1B005 */, /*44363*/23938/* 1B006 */,/*44364*/23939/* 1B007 */,/*44365*/23940/* 1B008 */,/*44366*/23941/* 1B009 */, /*44367*/23942/* 1B00A */,/*44368*/23943/* 1B00B */,/*44369*/23944/* 1B00C */,/*44370*/23945/* 1B00D */, /*44371*/23946/* 1B00E */,/*44372*/23947/* 1B00F */,/*44373*/23948/* 1B010 */,/*44374*/23949/* 1B011 */, /*44375*/23950/* 1B012 */,/*44376*/23951/* 1B013 */,/*44377*/23952/* 1B014 */,/*44378*/23953/* 1B015 */, /*44379*/23954/* 1B016 */,/*44380*/23955/* 1B017 */,/*44381*/23956/* 1B018 */,/*44382*/23957/* 1B019 */, /*44383*/23958/* 1B01A */,/*44384*/23959/* 1B01B */,/*44385*/23960/* 1B01C */,/*44386*/23961/* 1B01D */, /*44387*/23962/* 1B01E */,/*44388*/23963/* 1B01F */,/*44389*/23964/* 1B020 */,/*44390*/23965/* 1B021 */, /*44391*/23966/* 1B022 */,/*44392*/23967/* 1B023 */,/*44393*/23968/* 1B024 */,/*44394*/23969/* 1B025 */, /*44395*/23970/* 1B026 */,/*44396*/23971/* 1B027 */,/*44397*/23972/* 1B028 */,/*44398*/23973/* 1B029 */, /*44399*/23974/* 1B02A */,/*44400*/23975/* 1B02B */,/*44401*/23976/* 1B02C */,/*44402*/23977/* 1B02D */, /*44403*/23978/* 1B02E */,/*44404*/23979/* 1B02F */,/*44405*/23980/* 1B030 */,/*44406*/23981/* 1B031 */, /*44407*/23982/* 1B032 */,/*44408*/23983/* 1B033 */,/*44409*/23984/* 1B034 */,/*44410*/23985/* 1B035 */, /*44411*/23986/* 1B036 */,/*44412*/23987/* 1B037 */,/*44413*/23988/* 1B038 */,/*44414*/23989/* 1B039 */, /*44415*/23990/* 1B03A */,/*44416*/23991/* 1B03B */,/*44417*/23992/* 1B03C */,/*44418*/23993/* 1B03D */, /*44419*/23994/* 1B03E */,/*44420*/23995/* 1B03F */,/*44421*/23996/* 1B040 */,/*44422*/23997/* 1B041 */, /*44423*/23998/* 1B042 */,/*44424*/23999/* 1B043 */,/*44425*/24000/* 1B044 */,/*44426*/24001/* 1B045 */, /*44427*/24002/* 1B046 */,/*44428*/24003/* 1B047 */,/*44429*/24004/* 1B048 */,/*44430*/24005/* 1B049 */, /*44431*/24006/* 1B04A */,/*44432*/24007/* 1B04B */,/*44433*/24008/* 1B04C */,/*44434*/24009/* 1B04D */, /*44435*/24010/* 1B04E */,/*44436*/24011/* 1B04F */,/*44437*/24012/* 1B050 */,/*44438*/24013/* 1B051 */, /*44439*/24014/* 1B052 */,/*44440*/24015/* 1B053 */,/*44441*/24016/* 1B054 */,/*44442*/24017/* 1B055 */, /*44443*/24018/* 1B056 */,/*44444*/24019/* 1B057 */,/*44445*/24020/* 1B058 */,/*44446*/24021/* 1B059 */, /*44447*/24022/* 1B05A */,/*44448*/24023/* 1B05B */,/*44449*/24024/* 1B05C */,/*44450*/24025/* 1B05D */, /*44451*/24026/* 1B05E */,/*44452*/24027/* 1B05F */,/*44453*/24028/* 1B060 */,/*44454*/24029/* 1B061 */, /*44455*/24030/* 1B062 */,/*44456*/24031/* 1B063 */,/*44457*/24032/* 1B064 */,/*44458*/24033/* 1B065 */, /*44459*/24034/* 1B066 */,/*44460*/24035/* 1B067 */,/*44461*/24036/* 1B068 */,/*44462*/24037/* 1B069 */, /*44463*/24038/* 1B06A */,/*44464*/24039/* 1B06B */,/*44465*/24040/* 1B06C */,/*44466*/24041/* 1B06D */, /*44467*/24042/* 1B06E */,/*44468*/24043/* 1B06F */,/*44469*/24044/* 1B070 */,/*44470*/24045/* 1B071 */, /*44471*/24046/* 1B072 */,/*44472*/24047/* 1B073 */,/*44473*/24048/* 1B074 */,/*44474*/24049/* 1B075 */, /*44475*/24050/* 1B076 */,/*44476*/24051/* 1B077 */,/*44477*/24052/* 1B078 */,/*44478*/24053/* 1B079 */, /*44479*/24054/* 1B07A */,/*44480*/24055/* 1B07B */,/*44481*/24056/* 1B07C */,/*44482*/24057/* 1B07D */, /*44483*/24058/* 1B07E */,/*44484*/24059/* 1B07F */,/*44485*/24060/* 1B080 */,/*44486*/24061/* 1B081 */, /*44487*/24062/* 1B082 */,/*44488*/24063/* 1B083 */,/*44489*/24064/* 1B084 */,/*44490*/24065/* 1B085 */, /*44491*/24066/* 1B086 */,/*44492*/24067/* 1B087 */,/*44493*/24068/* 1B088 */,/*44494*/24069/* 1B089 */, /*44495*/24070/* 1B08A */,/*44496*/24071/* 1B08B */,/*44497*/24072/* 1B08C */,/*44498*/24073/* 1B08D */, /*44499*/24074/* 1B08E */,/*44500*/24075/* 1B08F */,/*44501*/24076/* 1B090 */,/*44502*/24077/* 1B091 */, /*44503*/24078/* 1B092 */,/*44504*/24079/* 1B093 */,/*44505*/24080/* 1B094 */,/*44506*/24081/* 1B095 */, /*44507*/24082/* 1B096 */,/*44508*/24083/* 1B097 */,/*44509*/24084/* 1B098 */,/*44510*/24085/* 1B099 */, /*44511*/24086/* 1B09A */,/*44512*/24087/* 1B09B */,/*44513*/24088/* 1B09C */,/*44514*/24089/* 1B09D */, /*44515*/24090/* 1B09E */,/*44516*/24091/* 1B09F */,/*44517*/24092/* 1B0A0 */,/*44518*/24093/* 1B0A1 */, /*44519*/24094/* 1B0A2 */,/*44520*/24095/* 1B0A3 */,/*44521*/24096/* 1B0A4 */,/*44522*/24097/* 1B0A5 */, /*44523*/24098/* 1B0A6 */,/*44524*/24099/* 1B0A7 */,/*44525*/24100/* 1B0A8 */,/*44526*/24101/* 1B0A9 */, /*44527*/24102/* 1B0AA */,/*44528*/24103/* 1B0AB */,/*44529*/24104/* 1B0AC */,/*44530*/24105/* 1B0AD */, /*44531*/24106/* 1B0AE */,/*44532*/24107/* 1B0AF */,/*44533*/24108/* 1B0B0 */,/*44534*/24109/* 1B0B1 */, /*44535*/24110/* 1B0B2 */,/*44536*/24111/* 1B0B3 */,/*44537*/24112/* 1B0B4 */,/*44538*/24113/* 1B0B5 */, /*44539*/24114/* 1B0B6 */,/*44540*/24115/* 1B0B7 */,/*44541*/24116/* 1B0B8 */,/*44542*/24117/* 1B0B9 */, /*44543*/24118/* 1B0BA */,/*44544*/24119/* 1B0BB */,/*44545*/24120/* 1B0BC */,/*44546*/24121/* 1B0BD */, /*44547*/24122/* 1B0BE */,/*44548*/24123/* 1B0BF */,/*44549*/24124/* 1B0C0 */,/*44550*/24125/* 1B0C1 */, /*44551*/24126/* 1B0C2 */,/*44552*/24127/* 1B0C3 */,/*44553*/24128/* 1B0C4 */,/*44554*/24129/* 1B0C5 */, /*44555*/24130/* 1B0C6 */,/*44556*/24131/* 1B0C7 */,/*44557*/24132/* 1B0C8 */,/*44558*/24133/* 1B0C9 */, /*44559*/24134/* 1B0CA */,/*44560*/24135/* 1B0CB */,/*44561*/24136/* 1B0CC */,/*44562*/24137/* 1B0CD */, /*44563*/24138/* 1B0CE */,/*44564*/24139/* 1B0CF */,/*44565*/24140/* 1B0D0 */,/*44566*/24141/* 1B0D1 */, /*44567*/24142/* 1B0D2 */,/*44568*/24143/* 1B0D3 */,/*44569*/24144/* 1B0D4 */,/*44570*/24145/* 1B0D5 */, /*44571*/24146/* 1B0D6 */,/*44572*/24147/* 1B0D7 */,/*44573*/24148/* 1B0D8 */,/*44574*/24149/* 1B0D9 */, /*44575*/24150/* 1B0DA */,/*44576*/24151/* 1B0DB */,/*44577*/24152/* 1B0DC */,/*44578*/24153/* 1B0DD */, /*44579*/24154/* 1B0DE */,/*44580*/24155/* 1B0DF */,/*44581*/24156/* 1B0E0 */,/*44582*/24157/* 1B0E1 */, /*44583*/24158/* 1B0E2 */,/*44584*/24159/* 1B0E3 */,/*44585*/24160/* 1B0E4 */,/*44586*/24161/* 1B0E5 */, /*44587*/24162/* 1B0E6 */,/*44588*/24163/* 1B0E7 */,/*44589*/24164/* 1B0E8 */,/*44590*/24165/* 1B0E9 */, /*44591*/24166/* 1B0EA */,/*44592*/24167/* 1B0EB */,/*44593*/24168/* 1B0EC */,/*44594*/24169/* 1B0ED */, /*44595*/24170/* 1B0EE */,/*44596*/24171/* 1B0EF */,/*44597*/24172/* 1B0F0 */,/*44598*/24173/* 1B0F1 */, /*44599*/24174/* 1B0F2 */,/*44600*/24175/* 1B0F3 */,/*44601*/24176/* 1B0F4 */,/*44602*/24177/* 1B0F5 */, /*44603*/24178/* 1B0F6 */,/*44604*/24179/* 1B0F7 */,/*44605*/24180/* 1B0F8 */,/*44606*/24181/* 1B0F9 */, /*44607*/24182/* 1B0FA */,/*44608*/24183/* 1B0FB */,/*44609*/24184/* 1B0FC */,/*44610*/24185/* 1B0FD */, /*44611*/24186/* 1B0FE */,/*44612*/24187/* 1B0FF */,/*44613*/24188/* 1B100 */,/*44614*/24189/* 1B101 */, /*44615*/24190/* 1B102 */,/*44616*/24191/* 1B103 */,/*44617*/24192/* 1B104 */,/*44618*/24193/* 1B105 */, /*44619*/24194/* 1B106 */,/*44620*/24195/* 1B107 */,/*44621*/24196/* 1B108 */,/*44622*/24197/* 1B109 */, /*44623*/24198/* 1B10A */,/*44624*/24199/* 1B10B */,/*44625*/24200/* 1B10C */,/*44626*/24201/* 1B10D */, /*44627*/24202/* 1B10E */,/*44628*/24203/* 1B10F */,/*44629*/24204/* 1B110 */,/*44630*/24205/* 1B111 */, /*44631*/24206/* 1B112 */,/*44632*/24207/* 1B113 */,/*44633*/24208/* 1B114 */,/*44634*/24209/* 1B115 */, /*44635*/24210/* 1B116 */,/*44636*/24211/* 1B117 */,/*44637*/24212/* 1B118 */,/*44638*/24213/* 1B119 */, /*44639*/24214/* 1B11A */,/*44640*/24215/* 1B11B */,/*44641*/24216/* 1B11C */,/*44642*/24217/* 1B11D */, /*44643*/24218/* 1B11E */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*44725*/24219/* 1B170 */,/*44726*/24219/* 1B171 */, /*44727*/24219/* 1B172 */,/*44728*/24219/* 1B173 */,/*44729*/24219/* 1B174 */,/*44730*/24219/* 1B175 */, /*44731*/24219/* 1B176 */,/*44732*/24219/* 1B177 */,/*44733*/24219/* 1B178 */,/*44734*/24219/* 1B179 */, /*44735*/24219/* 1B17A */,/*44736*/24219/* 1B17B */,/*44737*/24219/* 1B17C */,/*44738*/24219/* 1B17D */, /*44739*/24219/* 1B17E */,/*44740*/24219/* 1B17F */,/*44741*/24219/* 1B180 */,/*44742*/24219/* 1B181 */, /*44743*/24219/* 1B182 */,/*44744*/24219/* 1B183 */,/*44745*/24219/* 1B184 */,/*44746*/24219/* 1B185 */, /*44747*/24219/* 1B186 */,/*44748*/24219/* 1B187 */,/*44749*/24219/* 1B188 */,/*44750*/24219/* 1B189 */, /*44751*/24219/* 1B18A */,/*44752*/24219/* 1B18B */,/*44753*/24219/* 1B18C */,/*44754*/24219/* 1B18D */, /*44755*/24219/* 1B18E */,/*44756*/24219/* 1B18F */,/*44757*/24219/* 1B190 */,/*44758*/24219/* 1B191 */, /*44759*/24219/* 1B192 */,/*44760*/24219/* 1B193 */,/*44761*/24219/* 1B194 */,/*44762*/24219/* 1B195 */, /*44763*/24219/* 1B196 */,/*44764*/24219/* 1B197 */,/*44765*/24219/* 1B198 */,/*44766*/24219/* 1B199 */, /*44767*/24219/* 1B19A */,/*44768*/24219/* 1B19B */,/*44769*/24219/* 1B19C */,/*44770*/24219/* 1B19D */, /*44771*/24219/* 1B19E */,/*44772*/24219/* 1B19F */,/*44773*/24219/* 1B1A0 */,/*44774*/24219/* 1B1A1 */, /*44775*/24219/* 1B1A2 */,/*44776*/24219/* 1B1A3 */,/*44777*/24219/* 1B1A4 */,/*44778*/24219/* 1B1A5 */, /*44779*/24219/* 1B1A6 */,/*44780*/24219/* 1B1A7 */,/*44781*/24219/* 1B1A8 */,/*44782*/24219/* 1B1A9 */, /*44783*/24219/* 1B1AA */,/*44784*/24219/* 1B1AB */,/*44785*/24219/* 1B1AC */,/*44786*/24219/* 1B1AD */, /*44787*/24219/* 1B1AE */,/*44788*/24219/* 1B1AF */,/*44789*/24219/* 1B1B0 */,/*44790*/24219/* 1B1B1 */, /*44791*/24219/* 1B1B2 */,/*44792*/24219/* 1B1B3 */,/*44793*/24219/* 1B1B4 */,/*44794*/24219/* 1B1B5 */, /*44795*/24219/* 1B1B6 */,/*44796*/24219/* 1B1B7 */,/*44797*/24219/* 1B1B8 */,/*44798*/24219/* 1B1B9 */, /*44799*/24219/* 1B1BA */,/*44800*/24219/* 1B1BB */,/*44801*/24219/* 1B1BC */,/*44802*/24219/* 1B1BD */, /*44803*/24219/* 1B1BE */,/*44804*/24219/* 1B1BF */,/*44805*/24219/* 1B1C0 */,/*44806*/24219/* 1B1C1 */, /*44807*/24219/* 1B1C2 */,/*44808*/24219/* 1B1C3 */,/*44809*/24219/* 1B1C4 */,/*44810*/24219/* 1B1C5 */, /*44811*/24219/* 1B1C6 */,/*44812*/24219/* 1B1C7 */,/*44813*/24219/* 1B1C8 */,/*44814*/24219/* 1B1C9 */, /*44815*/24219/* 1B1CA */,/*44816*/24219/* 1B1CB */,/*44817*/24219/* 1B1CC */,/*44818*/24219/* 1B1CD */, /*44819*/24219/* 1B1CE */,/*44820*/24219/* 1B1CF */,/*44821*/24219/* 1B1D0 */,/*44822*/24219/* 1B1D1 */, /*44823*/24219/* 1B1D2 */,/*44824*/24219/* 1B1D3 */,/*44825*/24219/* 1B1D4 */,/*44826*/24219/* 1B1D5 */, /*44827*/24219/* 1B1D6 */,/*44828*/24219/* 1B1D7 */,/*44829*/24219/* 1B1D8 */,/*44830*/24219/* 1B1D9 */, /*44831*/24219/* 1B1DA */,/*44832*/24219/* 1B1DB */,/*44833*/24219/* 1B1DC */,/*44834*/24219/* 1B1DD */, /*44835*/24219/* 1B1DE */,/*44836*/24219/* 1B1DF */,/*44837*/24219/* 1B1E0 */,/*44838*/24219/* 1B1E1 */, /*44839*/24219/* 1B1E2 */,/*44840*/24219/* 1B1E3 */,/*44841*/24219/* 1B1E4 */,/*44842*/24219/* 1B1E5 */, /*44843*/24219/* 1B1E6 */,/*44844*/24219/* 1B1E7 */,/*44845*/24219/* 1B1E8 */,/*44846*/24219/* 1B1E9 */, /*44847*/24219/* 1B1EA */,/*44848*/24219/* 1B1EB */,/*44849*/24219/* 1B1EC */,/*44850*/24219/* 1B1ED */, /*44851*/24219/* 1B1EE */,/*44852*/24219/* 1B1EF */,/*44853*/24219/* 1B1F0 */,/*44854*/24219/* 1B1F1 */, /*44855*/24219/* 1B1F2 */,/*44856*/24219/* 1B1F3 */,/*44857*/24219/* 1B1F4 */,/*44858*/24219/* 1B1F5 */, /*44859*/24219/* 1B1F6 */,/*44860*/24219/* 1B1F7 */,/*44861*/24219/* 1B1F8 */,/*44862*/24219/* 1B1F9 */, /*44863*/24219/* 1B1FA */,/*44864*/24219/* 1B1FB */,/*44865*/24219/* 1B1FC */,/*44866*/24219/* 1B1FD */, /*44867*/24219/* 1B1FE */,/*44868*/24219/* 1B1FF */,/*44869*/24219/* 1B200 */,/*44870*/24219/* 1B201 */, /*44871*/24219/* 1B202 */,/*44872*/24219/* 1B203 */,/*44873*/24219/* 1B204 */,/*44874*/24219/* 1B205 */, /*44875*/24219/* 1B206 */,/*44876*/24219/* 1B207 */,/*44877*/24219/* 1B208 */,/*44878*/24219/* 1B209 */, /*44879*/24219/* 1B20A */,/*44880*/24219/* 1B20B */,/*44881*/24219/* 1B20C */,/*44882*/24219/* 1B20D */, /*44883*/24219/* 1B20E */,/*44884*/24219/* 1B20F */,/*44885*/24219/* 1B210 */,/*44886*/24219/* 1B211 */, /*44887*/24219/* 1B212 */,/*44888*/24219/* 1B213 */,/*44889*/24219/* 1B214 */,/*44890*/24219/* 1B215 */, /*44891*/24219/* 1B216 */,/*44892*/24219/* 1B217 */,/*44893*/24219/* 1B218 */,/*44894*/24219/* 1B219 */, /*44895*/24219/* 1B21A */,/*44896*/24219/* 1B21B */,/*44897*/24219/* 1B21C */,/*44898*/24219/* 1B21D */, /*44899*/24219/* 1B21E */,/*44900*/24219/* 1B21F */,/*44901*/24219/* 1B220 */,/*44902*/24219/* 1B221 */, /*44903*/24219/* 1B222 */,/*44904*/24219/* 1B223 */,/*44905*/24219/* 1B224 */,/*44906*/24219/* 1B225 */, /*44907*/24219/* 1B226 */,/*44908*/24219/* 1B227 */,/*44909*/24219/* 1B228 */,/*44910*/24219/* 1B229 */, /*44911*/24219/* 1B22A */,/*44912*/24219/* 1B22B */,/*44913*/24219/* 1B22C */,/*44914*/24219/* 1B22D */, /*44915*/24219/* 1B22E */,/*44916*/24219/* 1B22F */,/*44917*/24219/* 1B230 */,/*44918*/24219/* 1B231 */, /*44919*/24219/* 1B232 */,/*44920*/24219/* 1B233 */,/*44921*/24219/* 1B234 */,/*44922*/24219/* 1B235 */, /*44923*/24219/* 1B236 */,/*44924*/24219/* 1B237 */,/*44925*/24219/* 1B238 */,/*44926*/24219/* 1B239 */, /*44927*/24219/* 1B23A */,/*44928*/24219/* 1B23B */,/*44929*/24219/* 1B23C */,/*44930*/24219/* 1B23D */, /*44931*/24219/* 1B23E */,/*44932*/24219/* 1B23F */,/*44933*/24219/* 1B240 */,/*44934*/24219/* 1B241 */, /*44935*/24219/* 1B242 */,/*44936*/24219/* 1B243 */,/*44937*/24219/* 1B244 */,/*44938*/24219/* 1B245 */, /*44939*/24219/* 1B246 */,/*44940*/24219/* 1B247 */,/*44941*/24219/* 1B248 */,/*44942*/24219/* 1B249 */, /*44943*/24219/* 1B24A */,/*44944*/24219/* 1B24B */,/*44945*/24219/* 1B24C */,/*44946*/24219/* 1B24D */, /*44947*/24219/* 1B24E */,/*44948*/24219/* 1B24F */,/*44949*/24219/* 1B250 */,/*44950*/24219/* 1B251 */, /*44951*/24219/* 1B252 */,/*44952*/24219/* 1B253 */,/*44953*/24219/* 1B254 */,/*44954*/24219/* 1B255 */, /*44955*/24219/* 1B256 */,/*44956*/24219/* 1B257 */,/*44957*/24219/* 1B258 */,/*44958*/24219/* 1B259 */, /*44959*/24219/* 1B25A */,/*44960*/24219/* 1B25B */,/*44961*/24219/* 1B25C */,/*44962*/24219/* 1B25D */, /*44963*/24219/* 1B25E */,/*44964*/24219/* 1B25F */,/*44965*/24219/* 1B260 */,/*44966*/24219/* 1B261 */, /*44967*/24219/* 1B262 */,/*44968*/24219/* 1B263 */,/*44969*/24219/* 1B264 */,/*44970*/24219/* 1B265 */, /*44971*/24219/* 1B266 */,/*44972*/24219/* 1B267 */,/*44973*/24219/* 1B268 */,/*44974*/24219/* 1B269 */, /*44975*/24219/* 1B26A */,/*44976*/24219/* 1B26B */,/*44977*/24219/* 1B26C */,/*44978*/24219/* 1B26D */, /*44979*/24219/* 1B26E */,/*44980*/24219/* 1B26F */,/*44981*/24219/* 1B270 */,/*44982*/24219/* 1B271 */, /*44983*/24219/* 1B272 */,/*44984*/24219/* 1B273 */,/*44985*/24219/* 1B274 */,/*44986*/24219/* 1B275 */, /*44987*/24219/* 1B276 */,/*44988*/24219/* 1B277 */,/*44989*/24219/* 1B278 */,/*44990*/24219/* 1B279 */, /*44991*/24219/* 1B27A */,/*44992*/24219/* 1B27B */,/*44993*/24219/* 1B27C */,/*44994*/24219/* 1B27D */, /*44995*/24219/* 1B27E */,/*44996*/24219/* 1B27F */,/*44997*/24219/* 1B280 */,/*44998*/24219/* 1B281 */, /*44999*/24219/* 1B282 */,/*45000*/24219/* 1B283 */,/*45001*/24219/* 1B284 */,/*45002*/24219/* 1B285 */, /*45003*/24219/* 1B286 */,/*45004*/24219/* 1B287 */,/*45005*/24219/* 1B288 */,/*45006*/24219/* 1B289 */, /*45007*/24219/* 1B28A */,/*45008*/24219/* 1B28B */,/*45009*/24219/* 1B28C */,/*45010*/24219/* 1B28D */, /*45011*/24219/* 1B28E */,/*45012*/24219/* 1B28F */,/*45013*/24219/* 1B290 */,/*45014*/24219/* 1B291 */, /*45015*/24219/* 1B292 */,/*45016*/24219/* 1B293 */,/*45017*/24219/* 1B294 */,/*45018*/24219/* 1B295 */, /*45019*/24219/* 1B296 */,/*45020*/24219/* 1B297 */,/*45021*/24219/* 1B298 */,/*45022*/24219/* 1B299 */, /*45023*/24219/* 1B29A */,/*45024*/24219/* 1B29B */,/*45025*/24219/* 1B29C */,/*45026*/24219/* 1B29D */, /*45027*/24219/* 1B29E */,/*45028*/24219/* 1B29F */,/*45029*/24219/* 1B2A0 */,/*45030*/24219/* 1B2A1 */, /*45031*/24219/* 1B2A2 */,/*45032*/24219/* 1B2A3 */,/*45033*/24219/* 1B2A4 */,/*45034*/24219/* 1B2A5 */, /*45035*/24219/* 1B2A6 */,/*45036*/24219/* 1B2A7 */,/*45037*/24219/* 1B2A8 */,/*45038*/24219/* 1B2A9 */, /*45039*/24219/* 1B2AA */,/*45040*/24219/* 1B2AB */,/*45041*/24219/* 1B2AC */,/*45042*/24219/* 1B2AD */, /*45043*/24219/* 1B2AE */,/*45044*/24219/* 1B2AF */,/*45045*/24219/* 1B2B0 */,/*45046*/24219/* 1B2B1 */, /*45047*/24219/* 1B2B2 */,/*45048*/24219/* 1B2B3 */,/*45049*/24219/* 1B2B4 */,/*45050*/24219/* 1B2B5 */, /*45051*/24219/* 1B2B6 */,/*45052*/24219/* 1B2B7 */,/*45053*/24219/* 1B2B8 */,/*45054*/24219/* 1B2B9 */, /*45055*/24219/* 1B2BA */,/*45056*/24219/* 1B2BB */,/*45057*/24219/* 1B2BC */,/*45058*/24219/* 1B2BD */, /*45059*/24219/* 1B2BE */,/*45060*/24219/* 1B2BF */,/*45061*/24219/* 1B2C0 */,/*45062*/24219/* 1B2C1 */, /*45063*/24219/* 1B2C2 */,/*45064*/24219/* 1B2C3 */,/*45065*/24219/* 1B2C4 */,/*45066*/24219/* 1B2C5 */, /*45067*/24219/* 1B2C6 */,/*45068*/24219/* 1B2C7 */,/*45069*/24219/* 1B2C8 */,/*45070*/24219/* 1B2C9 */, /*45071*/24219/* 1B2CA */,/*45072*/24219/* 1B2CB */,/*45073*/24219/* 1B2CC */,/*45074*/24219/* 1B2CD */, /*45075*/24219/* 1B2CE */,/*45076*/24219/* 1B2CF */,/*45077*/24219/* 1B2D0 */,/*45078*/24219/* 1B2D1 */, /*45079*/24219/* 1B2D2 */,/*45080*/24219/* 1B2D3 */,/*45081*/24219/* 1B2D4 */,/*45082*/24219/* 1B2D5 */, /*45083*/24219/* 1B2D6 */,/*45084*/24219/* 1B2D7 */,/*45085*/24219/* 1B2D8 */,/*45086*/24219/* 1B2D9 */, /*45087*/24219/* 1B2DA */,/*45088*/24219/* 1B2DB */,/*45089*/24219/* 1B2DC */,/*45090*/24219/* 1B2DD */, /*45091*/24219/* 1B2DE */,/*45092*/24219/* 1B2DF */,/*45093*/24219/* 1B2E0 */,/*45094*/24219/* 1B2E1 */, /*45095*/24219/* 1B2E2 */,/*45096*/24219/* 1B2E3 */,/*45097*/24219/* 1B2E4 */,/*45098*/24219/* 1B2E5 */, /*45099*/24219/* 1B2E6 */,/*45100*/24219/* 1B2E7 */,/*45101*/24219/* 1B2E8 */,/*45102*/24219/* 1B2E9 */, /*45103*/24219/* 1B2EA */,/*45104*/24219/* 1B2EB */,/*45105*/24219/* 1B2EC */,/*45106*/24219/* 1B2ED */, /*45107*/24219/* 1B2EE */,/*45108*/24219/* 1B2EF */,/*45109*/24219/* 1B2F0 */,/*45110*/24219/* 1B2F1 */, /*45111*/24219/* 1B2F2 */,/*45112*/24219/* 1B2F3 */,/*45113*/24219/* 1B2F4 */,/*45114*/24219/* 1B2F5 */, /*45115*/24219/* 1B2F6 */,/*45116*/24219/* 1B2F7 */,/*45117*/24219/* 1B2F8 */,/*45118*/24219/* 1B2F9 */, /*45119*/24219/* 1B2FA */,/*45120*/24219/* 1B2FB */,/*45121*/24220/* 1BC00 */,/*45122*/24221/* 1BC01 */, /*45123*/24222/* 1BC02 */,/*45124*/24223/* 1BC03 */,/*45125*/24224/* 1BC04 */,/*45126*/24225/* 1BC05 */, /*45127*/24226/* 1BC06 */,/*45128*/24227/* 1BC07 */,/*45129*/24228/* 1BC08 */,/*45130*/24229/* 1BC09 */, /*45131*/24230/* 1BC0A */,/*45132*/24231/* 1BC0B */,/*45133*/24232/* 1BC0C */,/*45134*/24233/* 1BC0D */, /*45135*/24234/* 1BC0E */,/*45136*/24235/* 1BC0F */,/*45137*/24236/* 1BC10 */,/*45138*/24237/* 1BC11 */, /*45139*/24238/* 1BC12 */,/*45140*/24239/* 1BC13 */,/*45141*/24240/* 1BC14 */,/*45142*/24241/* 1BC15 */, /*45143*/24242/* 1BC16 */,/*45144*/24243/* 1BC17 */,/*45145*/24244/* 1BC18 */,/*45146*/24245/* 1BC19 */, /*45147*/24246/* 1BC1A */,/*45148*/24247/* 1BC1B */,/*45149*/24248/* 1BC1C */,/*45150*/24249/* 1BC1D */, /*45151*/24250/* 1BC1E */,/*45152*/24251/* 1BC1F */,/*45153*/24252/* 1BC20 */,/*45154*/24253/* 1BC21 */, /*45155*/24254/* 1BC22 */,/*45156*/24255/* 1BC23 */,/*45157*/24256/* 1BC24 */,/*45158*/24257/* 1BC25 */, /*45159*/24258/* 1BC26 */,/*45160*/24259/* 1BC27 */,/*45161*/24260/* 1BC28 */,/*45162*/24261/* 1BC29 */, /*45163*/24262/* 1BC2A */,/*45164*/24263/* 1BC2B */,/*45165*/24264/* 1BC2C */,/*45166*/24265/* 1BC2D */, /*45167*/24266/* 1BC2E */,/*45168*/24267/* 1BC2F */,/*45169*/24268/* 1BC30 */,/*45170*/24269/* 1BC31 */, /*45171*/24270/* 1BC32 */,/*45172*/24271/* 1BC33 */,/*45173*/24272/* 1BC34 */,/*45174*/24273/* 1BC35 */, /*45175*/24274/* 1BC36 */,/*45176*/24275/* 1BC37 */,/*45177*/24276/* 1BC38 */,/*45178*/24277/* 1BC39 */, /*45179*/24278/* 1BC3A */,/*45180*/24279/* 1BC3B */,/*45181*/24280/* 1BC3C */,/*45182*/24281/* 1BC3D */, /*45183*/24282/* 1BC3E */,/*45184*/24283/* 1BC3F */,/*45185*/24284/* 1BC40 */,/*45186*/24285/* 1BC41 */, /*45187*/24286/* 1BC42 */,/*45188*/24287/* 1BC43 */,/*45189*/24288/* 1BC44 */,/*45190*/24289/* 1BC45 */, /*45191*/24290/* 1BC46 */,/*45192*/24291/* 1BC47 */,/*45193*/24292/* 1BC48 */,/*45194*/24293/* 1BC49 */, /*45195*/24294/* 1BC4A */,/*45196*/24295/* 1BC4B */,/*45197*/24296/* 1BC4C */,/*45198*/24297/* 1BC4D */, /*45199*/24298/* 1BC4E */,/*45200*/24299/* 1BC4F */,/*45201*/24300/* 1BC50 */,/*45202*/24301/* 1BC51 */, /*45203*/24302/* 1BC52 */,/*45204*/24303/* 1BC53 */,/*45205*/24304/* 1BC54 */,/*45206*/24305/* 1BC55 */, /*45207*/24306/* 1BC56 */,/*45208*/24307/* 1BC57 */,/*45209*/24308/* 1BC58 */,/*45210*/24309/* 1BC59 */, /*45211*/24310/* 1BC5A */,/*45212*/24311/* 1BC5B */,/*45213*/24312/* 1BC5C */,/*45214*/24313/* 1BC5D */, /*45215*/24314/* 1BC5E */,/*45216*/24315/* 1BC5F */,/*45217*/24316/* 1BC60 */,/*45218*/24317/* 1BC61 */, /*45219*/24318/* 1BC62 */,/*45220*/24319/* 1BC63 */,/*45221*/24320/* 1BC64 */,/*45222*/24321/* 1BC65 */, /*45223*/24322/* 1BC66 */,/*45224*/24323/* 1BC67 */,/*45225*/24324/* 1BC68 */,/*45226*/24325/* 1BC69 */, /*45227*/24326/* 1BC6A */,0,0,0,0,0,/*45233*/24327/* 1BC70 */,/*45234*/24328/* 1BC71 */,/*45235*/24329/* 1BC72 */, /*45236*/24330/* 1BC73 */,/*45237*/24331/* 1BC74 */,/*45238*/24332/* 1BC75 */,/*45239*/24333/* 1BC76 */, /*45240*/24334/* 1BC77 */,/*45241*/24335/* 1BC78 */,/*45242*/24336/* 1BC79 */,/*45243*/24337/* 1BC7A */, /*45244*/24338/* 1BC7B */,/*45245*/24339/* 1BC7C */,0,0,0,/*45249*/24340/* 1BC80 */,/*45250*/24341/* 1BC81 */, /*45251*/24342/* 1BC82 */,/*45252*/24343/* 1BC83 */,/*45253*/24344/* 1BC84 */,/*45254*/24345/* 1BC85 */, /*45255*/24346/* 1BC86 */,/*45256*/24347/* 1BC87 */,/*45257*/24348/* 1BC88 */,0,0,0,0,0,0,0,/*45265*/24349/* 1BC90 */, /*45266*/24350/* 1BC91 */,/*45267*/24351/* 1BC92 */,/*45268*/24352/* 1BC93 */,/*45269*/24353/* 1BC94 */, /*45270*/24354/* 1BC95 */,/*45271*/24355/* 1BC96 */,/*45272*/24356/* 1BC97 */,/*45273*/24357/* 1BC98 */, /*45274*/24358/* 1BC99 */,0,0,/*45277*/24359/* 1BC9C */,/*45278*/24360/* 1BC9D */,/*45279*/24361/* 1BC9E */, /*45280*/24362/* 1BC9F */,/*45281*/24363/* 1BCA0 */,/*45282*/24363/* 1BCA1 */,/*45283*/24363/* 1BCA2 */, /*45284*/24363/* 1BCA3 */,/*45285*/24364/* 1D000 */,/*45286*/24365/* 1D001 */,/*45287*/24366/* 1D002 */, /*45288*/24367/* 1D003 */,/*45289*/24368/* 1D004 */,/*45290*/24369/* 1D005 */,/*45291*/24370/* 1D006 */, /*45292*/24371/* 1D007 */,/*45293*/24372/* 1D008 */,/*45294*/24373/* 1D009 */,/*45295*/24374/* 1D00A */, /*45296*/24375/* 1D00B */,/*45297*/24376/* 1D00C */,/*45298*/24377/* 1D00D */,/*45299*/24378/* 1D00E */, /*45300*/24379/* 1D00F */,/*45301*/24380/* 1D010 */,/*45302*/24381/* 1D011 */,/*45303*/24382/* 1D012 */, /*45304*/24383/* 1D013 */,/*45305*/24384/* 1D014 */,/*45306*/24385/* 1D015 */,/*45307*/24386/* 1D016 */, /*45308*/24387/* 1D017 */,/*45309*/24388/* 1D018 */,/*45310*/24389/* 1D019 */,/*45311*/24390/* 1D01A */, /*45312*/24391/* 1D01B */,/*45313*/24392/* 1D01C */,/*45314*/24393/* 1D01D */,/*45315*/24394/* 1D01E */, /*45316*/24395/* 1D01F */,/*45317*/24396/* 1D020 */,/*45318*/24397/* 1D021 */,/*45319*/24398/* 1D022 */, /*45320*/24399/* 1D023 */,/*45321*/24400/* 1D024 */,/*45322*/24401/* 1D025 */,/*45323*/24402/* 1D026 */, /*45324*/24403/* 1D027 */,/*45325*/24404/* 1D028 */,/*45326*/24405/* 1D029 */,/*45327*/24406/* 1D02A */, /*45328*/24407/* 1D02B */,/*45329*/24408/* 1D02C */,/*45330*/24409/* 1D02D */,/*45331*/24410/* 1D02E */, /*45332*/24411/* 1D02F */,/*45333*/24412/* 1D030 */,/*45334*/24413/* 1D031 */,/*45335*/24414/* 1D032 */, /*45336*/24415/* 1D033 */,/*45337*/24416/* 1D034 */,/*45338*/24417/* 1D035 */,/*45339*/24418/* 1D036 */, /*45340*/24419/* 1D037 */,/*45341*/24420/* 1D038 */,/*45342*/24421/* 1D039 */,/*45343*/24422/* 1D03A */, /*45344*/24423/* 1D03B */,/*45345*/24424/* 1D03C */,/*45346*/24425/* 1D03D */,/*45347*/24426/* 1D03E */, /*45348*/24427/* 1D03F */,/*45349*/24428/* 1D040 */,/*45350*/24429/* 1D041 */,/*45351*/24430/* 1D042 */, /*45352*/24431/* 1D043 */,/*45353*/24432/* 1D044 */,/*45354*/24433/* 1D045 */,/*45355*/24434/* 1D046 */, /*45356*/24435/* 1D047 */,/*45357*/24436/* 1D048 */,/*45358*/24437/* 1D049 */,/*45359*/24438/* 1D04A */, /*45360*/24439/* 1D04B */,/*45361*/24440/* 1D04C */,/*45362*/24441/* 1D04D */,/*45363*/24442/* 1D04E */, /*45364*/24443/* 1D04F */,/*45365*/24444/* 1D050 */,/*45366*/24445/* 1D051 */,/*45367*/24446/* 1D052 */, /*45368*/24447/* 1D053 */,/*45369*/24448/* 1D054 */,/*45370*/24449/* 1D055 */,/*45371*/24450/* 1D056 */, /*45372*/24451/* 1D057 */,/*45373*/24452/* 1D058 */,/*45374*/24453/* 1D059 */,/*45375*/24454/* 1D05A */, /*45376*/24455/* 1D05B */,/*45377*/24456/* 1D05C */,/*45378*/24457/* 1D05D */,/*45379*/24458/* 1D05E */, /*45380*/24459/* 1D05F */,/*45381*/24460/* 1D060 */,/*45382*/24461/* 1D061 */,/*45383*/24462/* 1D062 */, /*45384*/24463/* 1D063 */,/*45385*/24464/* 1D064 */,/*45386*/24465/* 1D065 */,/*45387*/24466/* 1D066 */, /*45388*/24467/* 1D067 */,/*45389*/24468/* 1D068 */,/*45390*/24469/* 1D069 */,/*45391*/24470/* 1D06A */, /*45392*/24471/* 1D06B */,/*45393*/24472/* 1D06C */,/*45394*/24473/* 1D06D */,/*45395*/24474/* 1D06E */, /*45396*/24475/* 1D06F */,/*45397*/24476/* 1D070 */,/*45398*/24477/* 1D071 */,/*45399*/24478/* 1D072 */, /*45400*/24479/* 1D073 */,/*45401*/24480/* 1D074 */,/*45402*/24481/* 1D075 */,/*45403*/24482/* 1D076 */, /*45404*/24483/* 1D077 */,/*45405*/24484/* 1D078 */,/*45406*/24485/* 1D079 */,/*45407*/24486/* 1D07A */, /*45408*/24487/* 1D07B */,/*45409*/24488/* 1D07C */,/*45410*/24489/* 1D07D */,/*45411*/24490/* 1D07E */, /*45412*/24491/* 1D07F */,/*45413*/24492/* 1D080 */,/*45414*/24493/* 1D081 */,/*45415*/24494/* 1D082 */, /*45416*/24495/* 1D083 */,/*45417*/24496/* 1D084 */,/*45418*/24497/* 1D085 */,/*45419*/24498/* 1D086 */, /*45420*/24499/* 1D087 */,/*45421*/24500/* 1D088 */,/*45422*/24501/* 1D089 */,/*45423*/24502/* 1D08A */, /*45424*/24503/* 1D08B */,/*45425*/24504/* 1D08C */,/*45426*/24505/* 1D08D */,/*45427*/24506/* 1D08E */, /*45428*/24507/* 1D08F */,/*45429*/24508/* 1D090 */,/*45430*/24509/* 1D091 */,/*45431*/24510/* 1D092 */, /*45432*/24511/* 1D093 */,/*45433*/24512/* 1D094 */,/*45434*/24513/* 1D095 */,/*45435*/24514/* 1D096 */, /*45436*/24515/* 1D097 */,/*45437*/24516/* 1D098 */,/*45438*/24517/* 1D099 */,/*45439*/24518/* 1D09A */, /*45440*/24519/* 1D09B */,/*45441*/24520/* 1D09C */,/*45442*/24521/* 1D09D */,/*45443*/24522/* 1D09E */, /*45444*/24523/* 1D09F */,/*45445*/24524/* 1D0A0 */,/*45446*/24525/* 1D0A1 */,/*45447*/24526/* 1D0A2 */, /*45448*/24527/* 1D0A3 */,/*45449*/24528/* 1D0A4 */,/*45450*/24529/* 1D0A5 */,/*45451*/24530/* 1D0A6 */, /*45452*/24531/* 1D0A7 */,/*45453*/24532/* 1D0A8 */,/*45454*/24533/* 1D0A9 */,/*45455*/24534/* 1D0AA */, /*45456*/24535/* 1D0AB */,/*45457*/24536/* 1D0AC */,/*45458*/24537/* 1D0AD */,/*45459*/24538/* 1D0AE */, /*45460*/24539/* 1D0AF */,/*45461*/24540/* 1D0B0 */,/*45462*/24541/* 1D0B1 */,/*45463*/24542/* 1D0B2 */, /*45464*/24543/* 1D0B3 */,/*45465*/24544/* 1D0B4 */,/*45466*/24545/* 1D0B5 */,/*45467*/24546/* 1D0B6 */, /*45468*/24547/* 1D0B7 */,/*45469*/24548/* 1D0B8 */,/*45470*/24549/* 1D0B9 */,/*45471*/24550/* 1D0BA */, /*45472*/24551/* 1D0BB */,/*45473*/24552/* 1D0BC */,/*45474*/24553/* 1D0BD */,/*45475*/24554/* 1D0BE */, /*45476*/24555/* 1D0BF */,/*45477*/24556/* 1D0C0 */,/*45478*/24557/* 1D0C1 */,/*45479*/24558/* 1D0C2 */, /*45480*/24559/* 1D0C3 */,/*45481*/24560/* 1D0C4 */,/*45482*/24561/* 1D0C5 */,/*45483*/24562/* 1D0C6 */, /*45484*/24563/* 1D0C7 */,/*45485*/24564/* 1D0C8 */,/*45486*/24565/* 1D0C9 */,/*45487*/24566/* 1D0CA */, /*45488*/24567/* 1D0CB */,/*45489*/24568/* 1D0CC */,/*45490*/24569/* 1D0CD */,/*45491*/24570/* 1D0CE */, /*45492*/24571/* 1D0CF */,/*45493*/24572/* 1D0D0 */,/*45494*/24573/* 1D0D1 */,/*45495*/24574/* 1D0D2 */, /*45496*/24575/* 1D0D3 */,/*45497*/24576/* 1D0D4 */,/*45498*/24577/* 1D0D5 */,/*45499*/24578/* 1D0D6 */, /*45500*/24579/* 1D0D7 */,/*45501*/24580/* 1D0D8 */,/*45502*/24581/* 1D0D9 */,/*45503*/24582/* 1D0DA */, /*45504*/24583/* 1D0DB */,/*45505*/24584/* 1D0DC */,/*45506*/24585/* 1D0DD */,/*45507*/24586/* 1D0DE */, /*45508*/24587/* 1D0DF */,/*45509*/24588/* 1D0E0 */,/*45510*/24589/* 1D0E1 */,/*45511*/24590/* 1D0E2 */, /*45512*/24591/* 1D0E3 */,/*45513*/24592/* 1D0E4 */,/*45514*/24593/* 1D0E5 */,/*45515*/24594/* 1D0E6 */, /*45516*/24595/* 1D0E7 */,/*45517*/24596/* 1D0E8 */,/*45518*/24597/* 1D0E9 */,/*45519*/24598/* 1D0EA */, /*45520*/24599/* 1D0EB */,/*45521*/24600/* 1D0EC */,/*45522*/24601/* 1D0ED */,/*45523*/24602/* 1D0EE */, /*45524*/24603/* 1D0EF */,/*45525*/24604/* 1D0F0 */,/*45526*/24605/* 1D0F1 */,/*45527*/24606/* 1D0F2 */, /*45528*/24607/* 1D0F3 */,/*45529*/24608/* 1D0F4 */,/*45530*/24609/* 1D0F5 */,0,0,0,0,0,0,0,0,0,0, /*45541*/24610/* 1D100 */,/*45542*/24611/* 1D101 */,/*45543*/24612/* 1D102 */,/*45544*/24613/* 1D103 */, /*45545*/24614/* 1D104 */,/*45546*/24615/* 1D105 */,/*45547*/24616/* 1D106 */,/*45548*/24617/* 1D107 */, /*45549*/24618/* 1D108 */,/*45550*/24619/* 1D109 */,/*45551*/24620/* 1D10A */,/*45552*/24621/* 1D10B */, /*45553*/24622/* 1D10C */,/*45554*/24623/* 1D10D */,/*45555*/24624/* 1D10E */,/*45556*/24625/* 1D10F */, /*45557*/24626/* 1D110 */,/*45558*/24627/* 1D111 */,/*45559*/24628/* 1D112 */,/*45560*/24629/* 1D113 */, /*45561*/24630/* 1D114 */,/*45562*/24631/* 1D115 */,/*45563*/24632/* 1D116 */,/*45564*/24633/* 1D117 */, /*45565*/24634/* 1D118 */,/*45566*/24635/* 1D119 */,/*45567*/24636/* 1D11A */,/*45568*/24637/* 1D11B */, /*45569*/24638/* 1D11C */,/*45570*/24639/* 1D11D */,/*45571*/24640/* 1D11E */,/*45572*/24641/* 1D11F */, /*45573*/24642/* 1D120 */,/*45574*/24643/* 1D121 */,/*45575*/24644/* 1D122 */,/*45576*/24645/* 1D123 */, /*45577*/24646/* 1D124 */,/*45578*/24647/* 1D125 */,/*45579*/24648/* 1D126 */,0,0,/*45582*/24649/* 1D129 */, /*45583*/24650/* 1D12A */,/*45584*/24651/* 1D12B */,/*45585*/24652/* 1D12C */,/*45586*/24653/* 1D12D */, /*45587*/24654/* 1D12E */,/*45588*/24655/* 1D12F */,/*45589*/24656/* 1D130 */,/*45590*/24657/* 1D131 */, /*45591*/24658/* 1D132 */,/*45592*/24659/* 1D133 */,/*45593*/24660/* 1D134 */,/*45594*/24661/* 1D135 */, /*45595*/24662/* 1D136 */,/*45596*/24663/* 1D137 */,/*45597*/24664/* 1D138 */,/*45598*/24665/* 1D139 */, /*45599*/24666/* 1D13A */,/*45600*/24667/* 1D13B */,/*45601*/24668/* 1D13C */,/*45602*/24669/* 1D13D */, /*45603*/24670/* 1D13E */,/*45604*/24671/* 1D13F */,/*45605*/24672/* 1D140 */,/*45606*/24673/* 1D141 */, /*45607*/24674/* 1D142 */,/*45608*/24675/* 1D143 */,/*45609*/24676/* 1D144 */,/*45610*/24677/* 1D145 */, /*45611*/24678/* 1D146 */,/*45612*/24679/* 1D147 */,/*45613*/24680/* 1D148 */,/*45614*/24681/* 1D149 */, /*45615*/24682/* 1D14A */,/*45616*/24683/* 1D14B */,/*45617*/24684/* 1D14C */,/*45618*/24685/* 1D14D */, /*45619*/24686/* 1D14E */,/*45620*/24687/* 1D14F */,/*45621*/24688/* 1D150 */,/*45622*/24689/* 1D151 */, /*45623*/24690/* 1D152 */,/*45624*/24691/* 1D153 */,/*45625*/24692/* 1D154 */,/*45626*/24693/* 1D155 */, /*45627*/24694/* 1D156 */,/*45628*/24695/* 1D157 */,/*45629*/24696/* 1D158 */,/*45630*/24697/* 1D159 */, /*45631*/24698/* 1D15A */,/*45632*/24699/* 1D15B */,/*45633*/24700/* 1D15C */,/*45634*/24701/* 1D15D */, /*45635*/24702/* 1D15E */,/*45636*/24703/* 1D15F */,/*45637*/24704/* 1D160 */,/*45638*/24705/* 1D161 */, /*45639*/24706/* 1D162 */,/*45640*/24707/* 1D163 */,/*45641*/24708/* 1D164 */,/*45642*/24709/* 1D165 */, /*45643*/24710/* 1D166 */,/*45644*/24711/* 1D167 */,/*45645*/24711/* 1D168 */,/*45646*/24711/* 1D169 */, /*45647*/24712/* 1D16A */,/*45648*/24713/* 1D16B */,/*45649*/24714/* 1D16C */,/*45650*/24715/* 1D16D */, /*45651*/24716/* 1D16E */,/*45652*/24716/* 1D16F */,/*45653*/24716/* 1D170 */,/*45654*/24716/* 1D171 */, /*45655*/24716/* 1D172 */,/*45656*/24717/* 1D173 */,/*45657*/24717/* 1D174 */,/*45658*/24717/* 1D175 */, /*45659*/24717/* 1D176 */,/*45660*/24717/* 1D177 */,/*45661*/24717/* 1D178 */,/*45662*/24717/* 1D179 */, /*45663*/24717/* 1D17A */,/*45664*/24718/* 1D17B */,/*45665*/24718/* 1D17C */,/*45666*/24718/* 1D17D */, /*45667*/24718/* 1D17E */,/*45668*/24718/* 1D17F */,/*45669*/24718/* 1D180 */,/*45670*/24718/* 1D181 */, /*45671*/24718/* 1D182 */,/*45672*/24719/* 1D183 */,/*45673*/24720/* 1D184 */,/*45674*/24721/* 1D185 */, /*45675*/24721/* 1D186 */,/*45676*/24721/* 1D187 */,/*45677*/24721/* 1D188 */,/*45678*/24721/* 1D189 */, /*45679*/24718/* 1D18A */,/*45680*/24718/* 1D18B */,/*45681*/24722/* 1D18C */,/*45682*/24723/* 1D18D */, /*45683*/24724/* 1D18E */,/*45684*/24725/* 1D18F */,/*45685*/24726/* 1D190 */,/*45686*/24727/* 1D191 */, /*45687*/24728/* 1D192 */,/*45688*/24729/* 1D193 */,/*45689*/24730/* 1D194 */,/*45690*/24731/* 1D195 */, /*45691*/24732/* 1D196 */,/*45692*/24733/* 1D197 */,/*45693*/24734/* 1D198 */,/*45694*/24735/* 1D199 */, /*45695*/24736/* 1D19A */,/*45696*/24737/* 1D19B */,/*45697*/24738/* 1D19C */,/*45698*/24739/* 1D19D */, /*45699*/24740/* 1D19E */,/*45700*/24741/* 1D19F */,/*45701*/24742/* 1D1A0 */,/*45702*/24743/* 1D1A1 */, /*45703*/24744/* 1D1A2 */,/*45704*/24745/* 1D1A3 */,/*45705*/24746/* 1D1A4 */,/*45706*/24747/* 1D1A5 */, /*45707*/24748/* 1D1A6 */,/*45708*/24749/* 1D1A7 */,/*45709*/24750/* 1D1A8 */,/*45710*/24751/* 1D1A9 */, /*45711*/24721/* 1D1AA */,/*45712*/24721/* 1D1AB */,/*45713*/24721/* 1D1AC */,/*45714*/24721/* 1D1AD */, /*45715*/24752/* 1D1AE */,/*45716*/24753/* 1D1AF */,/*45717*/24754/* 1D1B0 */,/*45718*/24755/* 1D1B1 */, /*45719*/24756/* 1D1B2 */,/*45720*/24757/* 1D1B3 */,/*45721*/24758/* 1D1B4 */,/*45722*/24759/* 1D1B5 */, /*45723*/24760/* 1D1B6 */,/*45724*/24761/* 1D1B7 */,/*45725*/24762/* 1D1B8 */,/*45726*/24763/* 1D1B9 */, /*45727*/24764/* 1D1BA */,/*45728*/24765/* 1D1BB */,/*45729*/24766/* 1D1BC */,/*45730*/24767/* 1D1BD */, /*45731*/24768/* 1D1BE */,/*45732*/24769/* 1D1BF */,/*45733*/24770/* 1D1C0 */,/*45734*/24771/* 1D1C1 */, /*45735*/24772/* 1D1C2 */,/*45736*/24773/* 1D1C3 */,/*45737*/24774/* 1D1C4 */,/*45738*/24775/* 1D1C5 */, /*45739*/24776/* 1D1C6 */,/*45740*/24777/* 1D1C7 */,/*45741*/24778/* 1D1C8 */,/*45742*/24779/* 1D1C9 */, /*45743*/24780/* 1D1CA */,/*45744*/24781/* 1D1CB */,/*45745*/24782/* 1D1CC */,/*45746*/24783/* 1D1CD */, /*45747*/24784/* 1D1CE */,/*45748*/24785/* 1D1CF */,/*45749*/24786/* 1D1D0 */,/*45750*/24787/* 1D1D1 */, /*45751*/24788/* 1D1D2 */,/*45752*/24789/* 1D1D3 */,/*45753*/24790/* 1D1D4 */,/*45754*/24791/* 1D1D5 */, /*45755*/24792/* 1D1D6 */,/*45756*/24793/* 1D1D7 */,/*45757*/24794/* 1D1D8 */,/*45758*/24795/* 1D1D9 */, /*45759*/24796/* 1D1DA */,/*45760*/24797/* 1D1DB */,/*45761*/24798/* 1D1DC */,/*45762*/24799/* 1D1DD */, /*45763*/24800/* 1D1DE */,/*45764*/24801/* 1D1DF */,/*45765*/24802/* 1D1E0 */,/*45766*/24803/* 1D1E1 */, /*45767*/24804/* 1D1E2 */,/*45768*/24805/* 1D1E3 */,/*45769*/24806/* 1D1E4 */,/*45770*/24807/* 1D1E5 */, /*45771*/24808/* 1D1E6 */,/*45772*/24809/* 1D1E7 */,/*45773*/24810/* 1D1E8 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,/*45797*/24811/* 1D200 */,/*45798*/24812/* 1D201 */,/*45799*/24813/* 1D202 */,/*45800*/24814/* 1D203 */, /*45801*/24815/* 1D204 */,/*45802*/24816/* 1D205 */,/*45803*/24817/* 1D206 */,/*45804*/24818/* 1D207 */, /*45805*/24819/* 1D208 */,/*45806*/24820/* 1D209 */,/*45807*/24821/* 1D20A */,/*45808*/24822/* 1D20B */, /*45809*/24823/* 1D20C */,/*45810*/24824/* 1D20D */,/*45811*/24825/* 1D20E */,/*45812*/24826/* 1D20F */, /*45813*/24827/* 1D210 */,/*45814*/24828/* 1D211 */,/*45815*/24829/* 1D212 */,/*45816*/24830/* 1D213 */, /*45817*/24831/* 1D214 */,/*45818*/24832/* 1D215 */,/*45819*/24833/* 1D216 */,/*45820*/24834/* 1D217 */, /*45821*/24835/* 1D218 */,/*45822*/24836/* 1D219 */,/*45823*/24837/* 1D21A */,/*45824*/24838/* 1D21B */, /*45825*/24839/* 1D21C */,/*45826*/24840/* 1D21D */,/*45827*/24841/* 1D21E */,/*45828*/24842/* 1D21F */, /*45829*/24843/* 1D220 */,/*45830*/24844/* 1D221 */,/*45831*/24845/* 1D222 */,/*45832*/24846/* 1D223 */, /*45833*/24847/* 1D224 */,/*45834*/24848/* 1D225 */,/*45835*/24849/* 1D226 */,/*45836*/24850/* 1D227 */, /*45837*/24851/* 1D228 */,/*45838*/24852/* 1D229 */,/*45839*/24853/* 1D22A */,/*45840*/24854/* 1D22B */, /*45841*/24855/* 1D22C */,/*45842*/24856/* 1D22D */,/*45843*/24857/* 1D22E */,/*45844*/24858/* 1D22F */, /*45845*/24859/* 1D230 */,/*45846*/24860/* 1D231 */,/*45847*/24861/* 1D232 */,/*45848*/24862/* 1D233 */, /*45849*/24863/* 1D234 */,/*45850*/24864/* 1D235 */,/*45851*/24865/* 1D236 */,/*45852*/24866/* 1D237 */, /*45853*/24867/* 1D238 */,/*45854*/24868/* 1D239 */,/*45855*/24869/* 1D23A */,/*45856*/24870/* 1D23B */, /*45857*/24871/* 1D23C */,/*45858*/24872/* 1D23D */,/*45859*/24873/* 1D23E */,/*45860*/24874/* 1D23F */, /*45861*/24875/* 1D240 */,/*45862*/24876/* 1D241 */,/*45863*/24877/* 1D242 */,/*45864*/24877/* 1D243 */, /*45865*/24877/* 1D244 */,/*45866*/24878/* 1D245 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*46053*/24879/* 1D300 */,/*46054*/24880/* 1D301 */, /*46055*/24881/* 1D302 */,/*46056*/24882/* 1D303 */,/*46057*/24883/* 1D304 */,/*46058*/24884/* 1D305 */, /*46059*/24885/* 1D306 */,/*46060*/24886/* 1D307 */,/*46061*/24887/* 1D308 */,/*46062*/24888/* 1D309 */, /*46063*/24889/* 1D30A */,/*46064*/24890/* 1D30B */,/*46065*/24891/* 1D30C */,/*46066*/24892/* 1D30D */, /*46067*/24893/* 1D30E */,/*46068*/24894/* 1D30F */,/*46069*/24895/* 1D310 */,/*46070*/24896/* 1D311 */, /*46071*/24897/* 1D312 */,/*46072*/24898/* 1D313 */,/*46073*/24899/* 1D314 */,/*46074*/24900/* 1D315 */, /*46075*/24901/* 1D316 */,/*46076*/24902/* 1D317 */,/*46077*/24903/* 1D318 */,/*46078*/24904/* 1D319 */, /*46079*/24905/* 1D31A */,/*46080*/24906/* 1D31B */,/*46081*/24907/* 1D31C */,/*46082*/24908/* 1D31D */, /*46083*/24909/* 1D31E */,/*46084*/24910/* 1D31F */,/*46085*/24911/* 1D320 */,/*46086*/24912/* 1D321 */, /*46087*/24913/* 1D322 */,/*46088*/24914/* 1D323 */,/*46089*/24915/* 1D324 */,/*46090*/24916/* 1D325 */, /*46091*/24917/* 1D326 */,/*46092*/24918/* 1D327 */,/*46093*/24919/* 1D328 */,/*46094*/24920/* 1D329 */, /*46095*/24921/* 1D32A */,/*46096*/24922/* 1D32B */,/*46097*/24923/* 1D32C */,/*46098*/24924/* 1D32D */, /*46099*/24925/* 1D32E */,/*46100*/24926/* 1D32F */,/*46101*/24927/* 1D330 */,/*46102*/24928/* 1D331 */, /*46103*/24929/* 1D332 */,/*46104*/24930/* 1D333 */,/*46105*/24931/* 1D334 */,/*46106*/24932/* 1D335 */, /*46107*/24933/* 1D336 */,/*46108*/24934/* 1D337 */,/*46109*/24935/* 1D338 */,/*46110*/24936/* 1D339 */, /*46111*/24937/* 1D33A */,/*46112*/24938/* 1D33B */,/*46113*/24939/* 1D33C */,/*46114*/24940/* 1D33D */, /*46115*/24941/* 1D33E */,/*46116*/24942/* 1D33F */,/*46117*/24943/* 1D340 */,/*46118*/24944/* 1D341 */, /*46119*/24945/* 1D342 */,/*46120*/24946/* 1D343 */,/*46121*/24947/* 1D344 */,/*46122*/24948/* 1D345 */, /*46123*/24949/* 1D346 */,/*46124*/24950/* 1D347 */,/*46125*/24951/* 1D348 */,/*46126*/24952/* 1D349 */, /*46127*/24953/* 1D34A */,/*46128*/24954/* 1D34B */,/*46129*/24955/* 1D34C */,/*46130*/24956/* 1D34D */, /*46131*/24957/* 1D34E */,/*46132*/24958/* 1D34F */,/*46133*/24959/* 1D350 */,/*46134*/24960/* 1D351 */, /*46135*/24961/* 1D352 */,/*46136*/24962/* 1D353 */,/*46137*/24963/* 1D354 */,/*46138*/24964/* 1D355 */, /*46139*/24965/* 1D356 */,0,0,0,0,0,0,0,0,0,/*46149*/24966/* 1D360 */,/*46150*/24967/* 1D361 */, /*46151*/24968/* 1D362 */,/*46152*/24969/* 1D363 */,/*46153*/24970/* 1D364 */,/*46154*/24971/* 1D365 */, /*46155*/24972/* 1D366 */,/*46156*/24973/* 1D367 */,/*46157*/24974/* 1D368 */,/*46158*/24975/* 1D369 */, /*46159*/24976/* 1D36A */,/*46160*/24977/* 1D36B */,/*46161*/24978/* 1D36C */,/*46162*/24979/* 1D36D */, /*46163*/24980/* 1D36E */,/*46164*/24981/* 1D36F */,/*46165*/24982/* 1D370 */,/*46166*/24983/* 1D371 */,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*46309*/24984/* 1D400 */,/*46310*/24985/* 1D401 */,/*46311*/24986/* 1D402 */, /*46312*/24987/* 1D403 */,/*46313*/24988/* 1D404 */,/*46314*/24989/* 1D405 */,/*46315*/24990/* 1D406 */, /*46316*/24991/* 1D407 */,/*46317*/24992/* 1D408 */,/*46318*/24993/* 1D409 */,/*46319*/24994/* 1D40A */, /*46320*/24995/* 1D40B */,/*46321*/24996/* 1D40C */,/*46322*/24997/* 1D40D */,/*46323*/24998/* 1D40E */, /*46324*/24999/* 1D40F */,/*46325*/25000/* 1D410 */,/*46326*/25001/* 1D411 */,/*46327*/25002/* 1D412 */, /*46328*/25003/* 1D413 */,/*46329*/25004/* 1D414 */,/*46330*/25005/* 1D415 */,/*46331*/25006/* 1D416 */, /*46332*/25007/* 1D417 */,/*46333*/25008/* 1D418 */,/*46334*/25009/* 1D419 */,/*46335*/25010/* 1D41A */, /*46336*/25011/* 1D41B */,/*46337*/25012/* 1D41C */,/*46338*/25013/* 1D41D */,/*46339*/25014/* 1D41E */, /*46340*/25015/* 1D41F */,/*46341*/25016/* 1D420 */,/*46342*/25017/* 1D421 */,/*46343*/25018/* 1D422 */, /*46344*/25019/* 1D423 */,/*46345*/25020/* 1D424 */,/*46346*/25021/* 1D425 */,/*46347*/25022/* 1D426 */, /*46348*/25023/* 1D427 */,/*46349*/25024/* 1D428 */,/*46350*/25025/* 1D429 */,/*46351*/25026/* 1D42A */, /*46352*/25027/* 1D42B */,/*46353*/25028/* 1D42C */,/*46354*/25029/* 1D42D */,/*46355*/25030/* 1D42E */, /*46356*/25031/* 1D42F */,/*46357*/25032/* 1D430 */,/*46358*/25033/* 1D431 */,/*46359*/25034/* 1D432 */, /*46360*/25035/* 1D433 */,/*46361*/25036/* 1D434 */,/*46362*/25037/* 1D435 */,/*46363*/25038/* 1D436 */, /*46364*/25039/* 1D437 */,/*46365*/25040/* 1D438 */,/*46366*/25041/* 1D439 */,/*46367*/25042/* 1D43A */, /*46368*/25043/* 1D43B */,/*46369*/25044/* 1D43C */,/*46370*/25045/* 1D43D */,/*46371*/25046/* 1D43E */, /*46372*/25047/* 1D43F */,/*46373*/25048/* 1D440 */,/*46374*/25049/* 1D441 */,/*46375*/25050/* 1D442 */, /*46376*/25051/* 1D443 */,/*46377*/25052/* 1D444 */,/*46378*/25053/* 1D445 */,/*46379*/25054/* 1D446 */, /*46380*/25055/* 1D447 */,/*46381*/25056/* 1D448 */,/*46382*/25057/* 1D449 */,/*46383*/25058/* 1D44A */, /*46384*/25059/* 1D44B */,/*46385*/25060/* 1D44C */,/*46386*/25061/* 1D44D */,/*46387*/25062/* 1D44E */, /*46388*/25063/* 1D44F */,/*46389*/25064/* 1D450 */,/*46390*/25065/* 1D451 */,/*46391*/25066/* 1D452 */, /*46392*/25067/* 1D453 */,/*46393*/25068/* 1D454 */,0,/*46395*/25069/* 1D456 */,/*46396*/25070/* 1D457 */, /*46397*/25071/* 1D458 */,/*46398*/25072/* 1D459 */,/*46399*/25073/* 1D45A */,/*46400*/25074/* 1D45B */, /*46401*/25075/* 1D45C */,/*46402*/25076/* 1D45D */,/*46403*/25077/* 1D45E */,/*46404*/25078/* 1D45F */, /*46405*/25079/* 1D460 */,/*46406*/25080/* 1D461 */,/*46407*/25081/* 1D462 */,/*46408*/25082/* 1D463 */, /*46409*/25083/* 1D464 */,/*46410*/25084/* 1D465 */,/*46411*/25085/* 1D466 */,/*46412*/25086/* 1D467 */, /*46413*/25087/* 1D468 */,/*46414*/25088/* 1D469 */,/*46415*/25089/* 1D46A */,/*46416*/25090/* 1D46B */, /*46417*/25091/* 1D46C */,/*46418*/25092/* 1D46D */,/*46419*/25093/* 1D46E */,/*46420*/25094/* 1D46F */, /*46421*/25095/* 1D470 */,/*46422*/25096/* 1D471 */,/*46423*/25097/* 1D472 */,/*46424*/25098/* 1D473 */, /*46425*/25099/* 1D474 */,/*46426*/25100/* 1D475 */,/*46427*/25101/* 1D476 */,/*46428*/25102/* 1D477 */, /*46429*/25103/* 1D478 */,/*46430*/25104/* 1D479 */,/*46431*/25105/* 1D47A */,/*46432*/25106/* 1D47B */, /*46433*/25107/* 1D47C */,/*46434*/25108/* 1D47D */,/*46435*/25109/* 1D47E */,/*46436*/25110/* 1D47F */, /*46437*/25111/* 1D480 */,/*46438*/25112/* 1D481 */,/*46439*/25113/* 1D482 */,/*46440*/25114/* 1D483 */, /*46441*/25115/* 1D484 */,/*46442*/25116/* 1D485 */,/*46443*/25117/* 1D486 */,/*46444*/25118/* 1D487 */, /*46445*/25119/* 1D488 */,/*46446*/25120/* 1D489 */,/*46447*/25121/* 1D48A */,/*46448*/25122/* 1D48B */, /*46449*/25123/* 1D48C */,/*46450*/25124/* 1D48D */,/*46451*/25125/* 1D48E */,/*46452*/25126/* 1D48F */, /*46453*/25127/* 1D490 */,/*46454*/25128/* 1D491 */,/*46455*/25129/* 1D492 */,/*46456*/25130/* 1D493 */, /*46457*/25131/* 1D494 */,/*46458*/25132/* 1D495 */,/*46459*/25133/* 1D496 */,/*46460*/25134/* 1D497 */, /*46461*/25135/* 1D498 */,/*46462*/25136/* 1D499 */,/*46463*/25137/* 1D49A */,/*46464*/25138/* 1D49B */, /*46465*/25139/* 1D49C */,0,/*46467*/25140/* 1D49E */,/*46468*/25141/* 1D49F */,0,0,/*46471*/25142/* 1D4A2 */,0,0, /*46474*/25143/* 1D4A5 */,/*46475*/25144/* 1D4A6 */,0,0,/*46478*/25145/* 1D4A9 */,/*46479*/25146/* 1D4AA */, /*46480*/25147/* 1D4AB */,/*46481*/25148/* 1D4AC */,0,/*46483*/25149/* 1D4AE */,/*46484*/25150/* 1D4AF */, /*46485*/25151/* 1D4B0 */,/*46486*/25152/* 1D4B1 */,/*46487*/25153/* 1D4B2 */,/*46488*/25154/* 1D4B3 */, /*46489*/25155/* 1D4B4 */,/*46490*/25156/* 1D4B5 */,/*46491*/25157/* 1D4B6 */,/*46492*/25158/* 1D4B7 */, /*46493*/25159/* 1D4B8 */,/*46494*/25160/* 1D4B9 */,0,/*46496*/25161/* 1D4BB */,0,/*46498*/25162/* 1D4BD */, /*46499*/25163/* 1D4BE */,/*46500*/25164/* 1D4BF */,/*46501*/25165/* 1D4C0 */,/*46502*/25166/* 1D4C1 */, /*46503*/25167/* 1D4C2 */,/*46504*/25168/* 1D4C3 */,0,/*46506*/25169/* 1D4C5 */,/*46507*/25170/* 1D4C6 */, /*46508*/25171/* 1D4C7 */,/*46509*/25172/* 1D4C8 */,/*46510*/25173/* 1D4C9 */,/*46511*/25174/* 1D4CA */, /*46512*/25175/* 1D4CB */,/*46513*/25176/* 1D4CC */,/*46514*/25177/* 1D4CD */,/*46515*/25178/* 1D4CE */, /*46516*/25179/* 1D4CF */,/*46517*/25180/* 1D4D0 */,/*46518*/25181/* 1D4D1 */,/*46519*/25182/* 1D4D2 */, /*46520*/25183/* 1D4D3 */,/*46521*/25184/* 1D4D4 */,/*46522*/25185/* 1D4D5 */,/*46523*/25186/* 1D4D6 */, /*46524*/25187/* 1D4D7 */,/*46525*/25188/* 1D4D8 */,/*46526*/25189/* 1D4D9 */,/*46527*/25190/* 1D4DA */, /*46528*/25191/* 1D4DB */,/*46529*/25192/* 1D4DC */,/*46530*/25193/* 1D4DD */,/*46531*/25194/* 1D4DE */, /*46532*/25195/* 1D4DF */,/*46533*/25196/* 1D4E0 */,/*46534*/25197/* 1D4E1 */,/*46535*/25198/* 1D4E2 */, /*46536*/25199/* 1D4E3 */,/*46537*/25200/* 1D4E4 */,/*46538*/25201/* 1D4E5 */,/*46539*/25202/* 1D4E6 */, /*46540*/25203/* 1D4E7 */,/*46541*/25204/* 1D4E8 */,/*46542*/25205/* 1D4E9 */,/*46543*/25206/* 1D4EA */, /*46544*/25207/* 1D4EB */,/*46545*/25208/* 1D4EC */,/*46546*/25209/* 1D4ED */,/*46547*/25210/* 1D4EE */, /*46548*/25211/* 1D4EF */,/*46549*/25212/* 1D4F0 */,/*46550*/25213/* 1D4F1 */,/*46551*/25214/* 1D4F2 */, /*46552*/25215/* 1D4F3 */,/*46553*/25216/* 1D4F4 */,/*46554*/25217/* 1D4F5 */,/*46555*/25218/* 1D4F6 */, /*46556*/25219/* 1D4F7 */,/*46557*/25220/* 1D4F8 */,/*46558*/25221/* 1D4F9 */,/*46559*/25222/* 1D4FA */, /*46560*/25223/* 1D4FB */,/*46561*/25224/* 1D4FC */,/*46562*/25225/* 1D4FD */,/*46563*/25226/* 1D4FE */, /*46564*/25227/* 1D4FF */,/*46565*/25228/* 1D500 */,/*46566*/25229/* 1D501 */,/*46567*/25230/* 1D502 */, /*46568*/25231/* 1D503 */,/*46569*/25232/* 1D504 */,/*46570*/25233/* 1D505 */,0,/*46572*/25234/* 1D507 */, /*46573*/25235/* 1D508 */,/*46574*/25236/* 1D509 */,/*46575*/25237/* 1D50A */,0,0,/*46578*/25238/* 1D50D */, /*46579*/25239/* 1D50E */,/*46580*/25240/* 1D50F */,/*46581*/25241/* 1D510 */,/*46582*/25242/* 1D511 */, /*46583*/25243/* 1D512 */,/*46584*/25244/* 1D513 */,/*46585*/25245/* 1D514 */,0,/*46587*/25246/* 1D516 */, /*46588*/25247/* 1D517 */,/*46589*/25248/* 1D518 */,/*46590*/25249/* 1D519 */,/*46591*/25250/* 1D51A */, /*46592*/25251/* 1D51B */,/*46593*/25252/* 1D51C */,0,/*46595*/25253/* 1D51E */,/*46596*/25254/* 1D51F */, /*46597*/25255/* 1D520 */,/*46598*/25256/* 1D521 */,/*46599*/25257/* 1D522 */,/*46600*/25258/* 1D523 */, /*46601*/25259/* 1D524 */,/*46602*/25260/* 1D525 */,/*46603*/25261/* 1D526 */,/*46604*/25262/* 1D527 */, /*46605*/25263/* 1D528 */,/*46606*/25264/* 1D529 */,/*46607*/25265/* 1D52A */,/*46608*/25266/* 1D52B */, /*46609*/25267/* 1D52C */,/*46610*/25268/* 1D52D */,/*46611*/25269/* 1D52E */,/*46612*/25270/* 1D52F */, /*46613*/25271/* 1D530 */,/*46614*/25272/* 1D531 */,/*46615*/25273/* 1D532 */,/*46616*/25274/* 1D533 */, /*46617*/25275/* 1D534 */,/*46618*/25276/* 1D535 */,/*46619*/25277/* 1D536 */,/*46620*/25278/* 1D537 */, /*46621*/25279/* 1D538 */,/*46622*/25280/* 1D539 */,0,/*46624*/25281/* 1D53B */,/*46625*/25282/* 1D53C */, /*46626*/25283/* 1D53D */,/*46627*/25284/* 1D53E */,0,/*46629*/25285/* 1D540 */,/*46630*/25286/* 1D541 */, /*46631*/25287/* 1D542 */,/*46632*/25288/* 1D543 */,/*46633*/25289/* 1D544 */,0,/*46635*/25290/* 1D546 */,0,0,0, /*46639*/25291/* 1D54A */,/*46640*/25292/* 1D54B */,/*46641*/25293/* 1D54C */,/*46642*/25294/* 1D54D */, /*46643*/25295/* 1D54E */,/*46644*/25296/* 1D54F */,/*46645*/25297/* 1D550 */,0,/*46647*/25298/* 1D552 */, /*46648*/25299/* 1D553 */,/*46649*/25300/* 1D554 */,/*46650*/25301/* 1D555 */,/*46651*/25302/* 1D556 */, /*46652*/25303/* 1D557 */,/*46653*/25304/* 1D558 */,/*46654*/25305/* 1D559 */,/*46655*/25306/* 1D55A */, /*46656*/25307/* 1D55B */,/*46657*/25308/* 1D55C */,/*46658*/25309/* 1D55D */,/*46659*/25310/* 1D55E */, /*46660*/25311/* 1D55F */,/*46661*/25312/* 1D560 */,/*46662*/25313/* 1D561 */,/*46663*/25314/* 1D562 */, /*46664*/25315/* 1D563 */,/*46665*/25316/* 1D564 */,/*46666*/25317/* 1D565 */,/*46667*/25318/* 1D566 */, /*46668*/25319/* 1D567 */,/*46669*/25320/* 1D568 */,/*46670*/25321/* 1D569 */,/*46671*/25322/* 1D56A */, /*46672*/25323/* 1D56B */,/*46673*/25324/* 1D56C */,/*46674*/25325/* 1D56D */,/*46675*/25326/* 1D56E */, /*46676*/25327/* 1D56F */,/*46677*/25328/* 1D570 */,/*46678*/25329/* 1D571 */,/*46679*/25330/* 1D572 */, /*46680*/25331/* 1D573 */,/*46681*/25332/* 1D574 */,/*46682*/25333/* 1D575 */,/*46683*/25334/* 1D576 */, /*46684*/25335/* 1D577 */,/*46685*/25336/* 1D578 */,/*46686*/25337/* 1D579 */,/*46687*/25338/* 1D57A */, /*46688*/25339/* 1D57B */,/*46689*/25340/* 1D57C */,/*46690*/25341/* 1D57D */,/*46691*/25342/* 1D57E */, /*46692*/25343/* 1D57F */,/*46693*/25344/* 1D580 */,/*46694*/25345/* 1D581 */,/*46695*/25346/* 1D582 */, /*46696*/25347/* 1D583 */,/*46697*/25348/* 1D584 */,/*46698*/25349/* 1D585 */,/*46699*/25350/* 1D586 */, /*46700*/25351/* 1D587 */,/*46701*/25352/* 1D588 */,/*46702*/25353/* 1D589 */,/*46703*/25354/* 1D58A */, /*46704*/25355/* 1D58B */,/*46705*/25356/* 1D58C */,/*46706*/25357/* 1D58D */,/*46707*/25358/* 1D58E */, /*46708*/25359/* 1D58F */,/*46709*/25360/* 1D590 */,/*46710*/25361/* 1D591 */,/*46711*/25362/* 1D592 */, /*46712*/25363/* 1D593 */,/*46713*/25364/* 1D594 */,/*46714*/25365/* 1D595 */,/*46715*/25366/* 1D596 */, /*46716*/25367/* 1D597 */,/*46717*/25368/* 1D598 */,/*46718*/25369/* 1D599 */,/*46719*/25370/* 1D59A */, /*46720*/25371/* 1D59B */,/*46721*/25372/* 1D59C */,/*46722*/25373/* 1D59D */,/*46723*/25374/* 1D59E */, /*46724*/25375/* 1D59F */,/*46725*/25376/* 1D5A0 */,/*46726*/25377/* 1D5A1 */,/*46727*/25378/* 1D5A2 */, /*46728*/25379/* 1D5A3 */,/*46729*/25380/* 1D5A4 */,/*46730*/25381/* 1D5A5 */,/*46731*/25382/* 1D5A6 */, /*46732*/25383/* 1D5A7 */,/*46733*/25384/* 1D5A8 */,/*46734*/25385/* 1D5A9 */,/*46735*/25386/* 1D5AA */, /*46736*/25387/* 1D5AB */,/*46737*/25388/* 1D5AC */,/*46738*/25389/* 1D5AD */,/*46739*/25390/* 1D5AE */, /*46740*/25391/* 1D5AF */,/*46741*/25392/* 1D5B0 */,/*46742*/25393/* 1D5B1 */,/*46743*/25394/* 1D5B2 */, /*46744*/25395/* 1D5B3 */,/*46745*/25396/* 1D5B4 */,/*46746*/25397/* 1D5B5 */,/*46747*/25398/* 1D5B6 */, /*46748*/25399/* 1D5B7 */,/*46749*/25400/* 1D5B8 */,/*46750*/25401/* 1D5B9 */,/*46751*/25402/* 1D5BA */, /*46752*/25403/* 1D5BB */,/*46753*/25404/* 1D5BC */,/*46754*/25405/* 1D5BD */,/*46755*/25406/* 1D5BE */, /*46756*/25407/* 1D5BF */,/*46757*/25408/* 1D5C0 */,/*46758*/25409/* 1D5C1 */,/*46759*/25410/* 1D5C2 */, /*46760*/25411/* 1D5C3 */,/*46761*/25412/* 1D5C4 */,/*46762*/25413/* 1D5C5 */,/*46763*/25414/* 1D5C6 */, /*46764*/25415/* 1D5C7 */,/*46765*/25416/* 1D5C8 */,/*46766*/25417/* 1D5C9 */,/*46767*/25418/* 1D5CA */, /*46768*/25419/* 1D5CB */,/*46769*/25420/* 1D5CC */,/*46770*/25421/* 1D5CD */,/*46771*/25422/* 1D5CE */, /*46772*/25423/* 1D5CF */,/*46773*/25424/* 1D5D0 */,/*46774*/25425/* 1D5D1 */,/*46775*/25426/* 1D5D2 */, /*46776*/25427/* 1D5D3 */,/*46777*/25428/* 1D5D4 */,/*46778*/25429/* 1D5D5 */,/*46779*/25430/* 1D5D6 */, /*46780*/25431/* 1D5D7 */,/*46781*/25432/* 1D5D8 */,/*46782*/25433/* 1D5D9 */,/*46783*/25434/* 1D5DA */, /*46784*/25435/* 1D5DB */,/*46785*/25436/* 1D5DC */,/*46786*/25437/* 1D5DD */,/*46787*/25438/* 1D5DE */, /*46788*/25439/* 1D5DF */,/*46789*/25440/* 1D5E0 */,/*46790*/25441/* 1D5E1 */,/*46791*/25442/* 1D5E2 */, /*46792*/25443/* 1D5E3 */,/*46793*/25444/* 1D5E4 */,/*46794*/25445/* 1D5E5 */,/*46795*/25446/* 1D5E6 */, /*46796*/25447/* 1D5E7 */,/*46797*/25448/* 1D5E8 */,/*46798*/25449/* 1D5E9 */,/*46799*/25450/* 1D5EA */, /*46800*/25451/* 1D5EB */,/*46801*/25452/* 1D5EC */,/*46802*/25453/* 1D5ED */,/*46803*/25454/* 1D5EE */, /*46804*/25455/* 1D5EF */,/*46805*/25456/* 1D5F0 */,/*46806*/25457/* 1D5F1 */,/*46807*/25458/* 1D5F2 */, /*46808*/25459/* 1D5F3 */,/*46809*/25460/* 1D5F4 */,/*46810*/25461/* 1D5F5 */,/*46811*/25462/* 1D5F6 */, /*46812*/25463/* 1D5F7 */,/*46813*/25464/* 1D5F8 */,/*46814*/25465/* 1D5F9 */,/*46815*/25466/* 1D5FA */, /*46816*/25467/* 1D5FB */,/*46817*/25468/* 1D5FC */,/*46818*/25469/* 1D5FD */,/*46819*/25470/* 1D5FE */, /*46820*/25471/* 1D5FF */,/*46821*/25472/* 1D600 */,/*46822*/25473/* 1D601 */,/*46823*/25474/* 1D602 */, /*46824*/25475/* 1D603 */,/*46825*/25476/* 1D604 */,/*46826*/25477/* 1D605 */,/*46827*/25478/* 1D606 */, /*46828*/25479/* 1D607 */,/*46829*/25480/* 1D608 */,/*46830*/25481/* 1D609 */,/*46831*/25482/* 1D60A */, /*46832*/25483/* 1D60B */,/*46833*/25484/* 1D60C */,/*46834*/25485/* 1D60D */,/*46835*/25486/* 1D60E */, /*46836*/25487/* 1D60F */,/*46837*/25488/* 1D610 */,/*46838*/25489/* 1D611 */,/*46839*/25490/* 1D612 */, /*46840*/25491/* 1D613 */,/*46841*/25492/* 1D614 */,/*46842*/25493/* 1D615 */,/*46843*/25494/* 1D616 */, /*46844*/25495/* 1D617 */,/*46845*/25496/* 1D618 */,/*46846*/25497/* 1D619 */,/*46847*/25498/* 1D61A */, /*46848*/25499/* 1D61B */,/*46849*/25500/* 1D61C */,/*46850*/25501/* 1D61D */,/*46851*/25502/* 1D61E */, /*46852*/25503/* 1D61F */,/*46853*/25504/* 1D620 */,/*46854*/25505/* 1D621 */,/*46855*/25506/* 1D622 */, /*46856*/25507/* 1D623 */,/*46857*/25508/* 1D624 */,/*46858*/25509/* 1D625 */,/*46859*/25510/* 1D626 */, /*46860*/25511/* 1D627 */,/*46861*/25512/* 1D628 */,/*46862*/25513/* 1D629 */,/*46863*/25514/* 1D62A */, /*46864*/25515/* 1D62B */,/*46865*/25516/* 1D62C */,/*46866*/25517/* 1D62D */,/*46867*/25518/* 1D62E */, /*46868*/25519/* 1D62F */,/*46869*/25520/* 1D630 */,/*46870*/25521/* 1D631 */,/*46871*/25522/* 1D632 */, /*46872*/25523/* 1D633 */,/*46873*/25524/* 1D634 */,/*46874*/25525/* 1D635 */,/*46875*/25526/* 1D636 */, /*46876*/25527/* 1D637 */,/*46877*/25528/* 1D638 */,/*46878*/25529/* 1D639 */,/*46879*/25530/* 1D63A */, /*46880*/25531/* 1D63B */,/*46881*/25532/* 1D63C */,/*46882*/25533/* 1D63D */,/*46883*/25534/* 1D63E */, /*46884*/25535/* 1D63F */,/*46885*/25536/* 1D640 */,/*46886*/25537/* 1D641 */,/*46887*/25538/* 1D642 */, /*46888*/25539/* 1D643 */,/*46889*/25540/* 1D644 */,/*46890*/25541/* 1D645 */,/*46891*/25542/* 1D646 */, /*46892*/25543/* 1D647 */,/*46893*/25544/* 1D648 */,/*46894*/25545/* 1D649 */,/*46895*/25546/* 1D64A */, /*46896*/25547/* 1D64B */,/*46897*/25548/* 1D64C */,/*46898*/25549/* 1D64D */,/*46899*/25550/* 1D64E */, /*46900*/25551/* 1D64F */,/*46901*/25552/* 1D650 */,/*46902*/25553/* 1D651 */,/*46903*/25554/* 1D652 */, /*46904*/25555/* 1D653 */,/*46905*/25556/* 1D654 */,/*46906*/25557/* 1D655 */,/*46907*/25558/* 1D656 */, /*46908*/25559/* 1D657 */,/*46909*/25560/* 1D658 */,/*46910*/25561/* 1D659 */,/*46911*/25562/* 1D65A */, /*46912*/25563/* 1D65B */,/*46913*/25564/* 1D65C */,/*46914*/25565/* 1D65D */,/*46915*/25566/* 1D65E */, /*46916*/25567/* 1D65F */,/*46917*/25568/* 1D660 */,/*46918*/25569/* 1D661 */,/*46919*/25570/* 1D662 */, /*46920*/25571/* 1D663 */,/*46921*/25572/* 1D664 */,/*46922*/25573/* 1D665 */,/*46923*/25574/* 1D666 */, /*46924*/25575/* 1D667 */,/*46925*/25576/* 1D668 */,/*46926*/25577/* 1D669 */,/*46927*/25578/* 1D66A */, /*46928*/25579/* 1D66B */,/*46929*/25580/* 1D66C */,/*46930*/25581/* 1D66D */,/*46931*/25582/* 1D66E */, /*46932*/25583/* 1D66F */,/*46933*/25584/* 1D670 */,/*46934*/25585/* 1D671 */,/*46935*/25586/* 1D672 */, /*46936*/25587/* 1D673 */,/*46937*/25588/* 1D674 */,/*46938*/25589/* 1D675 */,/*46939*/25590/* 1D676 */, /*46940*/25591/* 1D677 */,/*46941*/25592/* 1D678 */,/*46942*/25593/* 1D679 */,/*46943*/25594/* 1D67A */, /*46944*/25595/* 1D67B */,/*46945*/25596/* 1D67C */,/*46946*/25597/* 1D67D */,/*46947*/25598/* 1D67E */, /*46948*/25599/* 1D67F */,/*46949*/25600/* 1D680 */,/*46950*/25601/* 1D681 */,/*46951*/25602/* 1D682 */, /*46952*/25603/* 1D683 */,/*46953*/25604/* 1D684 */,/*46954*/25605/* 1D685 */,/*46955*/25606/* 1D686 */, /*46956*/25607/* 1D687 */,/*46957*/25608/* 1D688 */,/*46958*/25609/* 1D689 */,/*46959*/25610/* 1D68A */, /*46960*/25611/* 1D68B */,/*46961*/25612/* 1D68C */,/*46962*/25613/* 1D68D */,/*46963*/25614/* 1D68E */, /*46964*/25615/* 1D68F */,/*46965*/25616/* 1D690 */,/*46966*/25617/* 1D691 */,/*46967*/25618/* 1D692 */, /*46968*/25619/* 1D693 */,/*46969*/25620/* 1D694 */,/*46970*/25621/* 1D695 */,/*46971*/25622/* 1D696 */, /*46972*/25623/* 1D697 */,/*46973*/25624/* 1D698 */,/*46974*/25625/* 1D699 */,/*46975*/25626/* 1D69A */, /*46976*/25627/* 1D69B */,/*46977*/25628/* 1D69C */,/*46978*/25629/* 1D69D */,/*46979*/25630/* 1D69E */, /*46980*/25631/* 1D69F */,/*46981*/25632/* 1D6A0 */,/*46982*/25633/* 1D6A1 */,/*46983*/25634/* 1D6A2 */, /*46984*/25635/* 1D6A3 */,/*46985*/25636/* 1D6A4 */,/*46986*/25637/* 1D6A5 */,0,0,/*46989*/25638/* 1D6A8 */, /*46990*/25639/* 1D6A9 */,/*46991*/25640/* 1D6AA */,/*46992*/25641/* 1D6AB */,/*46993*/25642/* 1D6AC */, /*46994*/25643/* 1D6AD */,/*46995*/25644/* 1D6AE */,/*46996*/25645/* 1D6AF */,/*46997*/25646/* 1D6B0 */, /*46998*/25647/* 1D6B1 */,/*46999*/25648/* 1D6B2 */,/*47000*/25649/* 1D6B3 */,/*47001*/25650/* 1D6B4 */, /*47002*/25651/* 1D6B5 */,/*47003*/25652/* 1D6B6 */,/*47004*/25653/* 1D6B7 */,/*47005*/25654/* 1D6B8 */, /*47006*/25655/* 1D6B9 */,/*47007*/25656/* 1D6BA */,/*47008*/25657/* 1D6BB */,/*47009*/25658/* 1D6BC */, /*47010*/25659/* 1D6BD */,/*47011*/25660/* 1D6BE */,/*47012*/25661/* 1D6BF */,/*47013*/25662/* 1D6C0 */, /*47014*/25663/* 1D6C1 */,/*47015*/25664/* 1D6C2 */,/*47016*/25665/* 1D6C3 */,/*47017*/25666/* 1D6C4 */, /*47018*/25667/* 1D6C5 */,/*47019*/25668/* 1D6C6 */,/*47020*/25669/* 1D6C7 */,/*47021*/25670/* 1D6C8 */, /*47022*/25671/* 1D6C9 */,/*47023*/25672/* 1D6CA */,/*47024*/25673/* 1D6CB */,/*47025*/25674/* 1D6CC */, /*47026*/25675/* 1D6CD */,/*47027*/25676/* 1D6CE */,/*47028*/25677/* 1D6CF */,/*47029*/25678/* 1D6D0 */, /*47030*/25679/* 1D6D1 */,/*47031*/25680/* 1D6D2 */,/*47032*/25681/* 1D6D3 */,/*47033*/25682/* 1D6D4 */, /*47034*/25683/* 1D6D5 */,/*47035*/25684/* 1D6D6 */,/*47036*/25685/* 1D6D7 */,/*47037*/25686/* 1D6D8 */, /*47038*/25687/* 1D6D9 */,/*47039*/25688/* 1D6DA */,/*47040*/25689/* 1D6DB */,/*47041*/25690/* 1D6DC */, /*47042*/25691/* 1D6DD */,/*47043*/25692/* 1D6DE */,/*47044*/25693/* 1D6DF */,/*47045*/25694/* 1D6E0 */, /*47046*/25695/* 1D6E1 */,/*47047*/25696/* 1D6E2 */,/*47048*/25697/* 1D6E3 */,/*47049*/25698/* 1D6E4 */, /*47050*/25699/* 1D6E5 */,/*47051*/25700/* 1D6E6 */,/*47052*/25701/* 1D6E7 */,/*47053*/25702/* 1D6E8 */, /*47054*/25703/* 1D6E9 */,/*47055*/25704/* 1D6EA */,/*47056*/25705/* 1D6EB */,/*47057*/25706/* 1D6EC */, /*47058*/25707/* 1D6ED */,/*47059*/25708/* 1D6EE */,/*47060*/25709/* 1D6EF */,/*47061*/25710/* 1D6F0 */, /*47062*/25711/* 1D6F1 */,/*47063*/25712/* 1D6F2 */,/*47064*/25713/* 1D6F3 */,/*47065*/25714/* 1D6F4 */, /*47066*/25715/* 1D6F5 */,/*47067*/25716/* 1D6F6 */,/*47068*/25717/* 1D6F7 */,/*47069*/25718/* 1D6F8 */, /*47070*/25719/* 1D6F9 */,/*47071*/25720/* 1D6FA */,/*47072*/25721/* 1D6FB */,/*47073*/25722/* 1D6FC */, /*47074*/25723/* 1D6FD */,/*47075*/25724/* 1D6FE */,/*47076*/25725/* 1D6FF */,/*47077*/25726/* 1D700 */, /*47078*/25727/* 1D701 */,/*47079*/25728/* 1D702 */,/*47080*/25729/* 1D703 */,/*47081*/25730/* 1D704 */, /*47082*/25731/* 1D705 */,/*47083*/25732/* 1D706 */,/*47084*/25733/* 1D707 */,/*47085*/25734/* 1D708 */, /*47086*/25735/* 1D709 */,/*47087*/25736/* 1D70A */,/*47088*/25737/* 1D70B */,/*47089*/25738/* 1D70C */, /*47090*/25739/* 1D70D */,/*47091*/25740/* 1D70E */,/*47092*/25741/* 1D70F */,/*47093*/25742/* 1D710 */, /*47094*/25743/* 1D711 */,/*47095*/25744/* 1D712 */,/*47096*/25745/* 1D713 */,/*47097*/25746/* 1D714 */, /*47098*/25747/* 1D715 */,/*47099*/25748/* 1D716 */,/*47100*/25749/* 1D717 */,/*47101*/25750/* 1D718 */, /*47102*/25751/* 1D719 */,/*47103*/25752/* 1D71A */,/*47104*/25753/* 1D71B */,/*47105*/25754/* 1D71C */, /*47106*/25755/* 1D71D */,/*47107*/25756/* 1D71E */,/*47108*/25757/* 1D71F */,/*47109*/25758/* 1D720 */, /*47110*/25759/* 1D721 */,/*47111*/25760/* 1D722 */,/*47112*/25761/* 1D723 */,/*47113*/25762/* 1D724 */, /*47114*/25763/* 1D725 */,/*47115*/25764/* 1D726 */,/*47116*/25765/* 1D727 */,/*47117*/25766/* 1D728 */, /*47118*/25767/* 1D729 */,/*47119*/25768/* 1D72A */,/*47120*/25769/* 1D72B */,/*47121*/25770/* 1D72C */, /*47122*/25771/* 1D72D */,/*47123*/25772/* 1D72E */,/*47124*/25773/* 1D72F */,/*47125*/25774/* 1D730 */, /*47126*/25775/* 1D731 */,/*47127*/25776/* 1D732 */,/*47128*/25777/* 1D733 */,/*47129*/25778/* 1D734 */, /*47130*/25779/* 1D735 */,/*47131*/25780/* 1D736 */,/*47132*/25781/* 1D737 */,/*47133*/25782/* 1D738 */, /*47134*/25783/* 1D739 */,/*47135*/25784/* 1D73A */,/*47136*/25785/* 1D73B */,/*47137*/25786/* 1D73C */, /*47138*/25787/* 1D73D */,/*47139*/25788/* 1D73E */,/*47140*/25789/* 1D73F */,/*47141*/25790/* 1D740 */, /*47142*/25791/* 1D741 */,/*47143*/25792/* 1D742 */,/*47144*/25793/* 1D743 */,/*47145*/25794/* 1D744 */, /*47146*/25795/* 1D745 */,/*47147*/25796/* 1D746 */,/*47148*/25797/* 1D747 */,/*47149*/25798/* 1D748 */, /*47150*/25799/* 1D749 */,/*47151*/25800/* 1D74A */,/*47152*/25801/* 1D74B */,/*47153*/25802/* 1D74C */, /*47154*/25803/* 1D74D */,/*47155*/25804/* 1D74E */,/*47156*/25805/* 1D74F */,/*47157*/25806/* 1D750 */, /*47158*/25807/* 1D751 */,/*47159*/25808/* 1D752 */,/*47160*/25809/* 1D753 */,/*47161*/25810/* 1D754 */, /*47162*/25811/* 1D755 */,/*47163*/25812/* 1D756 */,/*47164*/25813/* 1D757 */,/*47165*/25814/* 1D758 */, /*47166*/25815/* 1D759 */,/*47167*/25816/* 1D75A */,/*47168*/25817/* 1D75B */,/*47169*/25818/* 1D75C */, /*47170*/25819/* 1D75D */,/*47171*/25820/* 1D75E */,/*47172*/25821/* 1D75F */,/*47173*/25822/* 1D760 */, /*47174*/25823/* 1D761 */,/*47175*/25824/* 1D762 */,/*47176*/25825/* 1D763 */,/*47177*/25826/* 1D764 */, /*47178*/25827/* 1D765 */,/*47179*/25828/* 1D766 */,/*47180*/25829/* 1D767 */,/*47181*/25830/* 1D768 */, /*47182*/25831/* 1D769 */,/*47183*/25832/* 1D76A */,/*47184*/25833/* 1D76B */,/*47185*/25834/* 1D76C */, /*47186*/25835/* 1D76D */,/*47187*/25836/* 1D76E */,/*47188*/25837/* 1D76F */,/*47189*/25838/* 1D770 */, /*47190*/25839/* 1D771 */,/*47191*/25840/* 1D772 */,/*47192*/25841/* 1D773 */,/*47193*/25842/* 1D774 */, /*47194*/25843/* 1D775 */,/*47195*/25844/* 1D776 */,/*47196*/25845/* 1D777 */,/*47197*/25846/* 1D778 */, /*47198*/25847/* 1D779 */,/*47199*/25848/* 1D77A */,/*47200*/25849/* 1D77B */,/*47201*/25850/* 1D77C */, /*47202*/25851/* 1D77D */,/*47203*/25852/* 1D77E */,/*47204*/25853/* 1D77F */,/*47205*/25854/* 1D780 */, /*47206*/25855/* 1D781 */,/*47207*/25856/* 1D782 */,/*47208*/25857/* 1D783 */,/*47209*/25858/* 1D784 */, /*47210*/25859/* 1D785 */,/*47211*/25860/* 1D786 */,/*47212*/25861/* 1D787 */,/*47213*/25862/* 1D788 */, /*47214*/25863/* 1D789 */,/*47215*/25864/* 1D78A */,/*47216*/25865/* 1D78B */,/*47217*/25866/* 1D78C */, /*47218*/25867/* 1D78D */,/*47219*/25868/* 1D78E */,/*47220*/25869/* 1D78F */,/*47221*/25870/* 1D790 */, /*47222*/25871/* 1D791 */,/*47223*/25872/* 1D792 */,/*47224*/25873/* 1D793 */,/*47225*/25874/* 1D794 */, /*47226*/25875/* 1D795 */,/*47227*/25876/* 1D796 */,/*47228*/25877/* 1D797 */,/*47229*/25878/* 1D798 */, /*47230*/25879/* 1D799 */,/*47231*/25880/* 1D79A */,/*47232*/25881/* 1D79B */,/*47233*/25882/* 1D79C */, /*47234*/25883/* 1D79D */,/*47235*/25884/* 1D79E */,/*47236*/25885/* 1D79F */,/*47237*/25886/* 1D7A0 */, /*47238*/25887/* 1D7A1 */,/*47239*/25888/* 1D7A2 */,/*47240*/25889/* 1D7A3 */,/*47241*/25890/* 1D7A4 */, /*47242*/25891/* 1D7A5 */,/*47243*/25892/* 1D7A6 */,/*47244*/25893/* 1D7A7 */,/*47245*/25894/* 1D7A8 */, /*47246*/25895/* 1D7A9 */,/*47247*/25896/* 1D7AA */,/*47248*/25897/* 1D7AB */,/*47249*/25898/* 1D7AC */, /*47250*/25899/* 1D7AD */,/*47251*/25900/* 1D7AE */,/*47252*/25901/* 1D7AF */,/*47253*/25902/* 1D7B0 */, /*47254*/25903/* 1D7B1 */,/*47255*/25904/* 1D7B2 */,/*47256*/25905/* 1D7B3 */,/*47257*/25906/* 1D7B4 */, /*47258*/25907/* 1D7B5 */,/*47259*/25908/* 1D7B6 */,/*47260*/25909/* 1D7B7 */,/*47261*/25910/* 1D7B8 */, /*47262*/25911/* 1D7B9 */,/*47263*/25912/* 1D7BA */,/*47264*/25913/* 1D7BB */,/*47265*/25914/* 1D7BC */, /*47266*/25915/* 1D7BD */,/*47267*/25916/* 1D7BE */,/*47268*/25917/* 1D7BF */,/*47269*/25918/* 1D7C0 */, /*47270*/25919/* 1D7C1 */,/*47271*/25920/* 1D7C2 */,/*47272*/25921/* 1D7C3 */,/*47273*/25922/* 1D7C4 */, /*47274*/25923/* 1D7C5 */,/*47275*/25924/* 1D7C6 */,/*47276*/25925/* 1D7C7 */,/*47277*/25926/* 1D7C8 */, /*47278*/25927/* 1D7C9 */,/*47279*/25928/* 1D7CA */,/*47280*/25929/* 1D7CB */,0,0,/*47283*/25930/* 1D7CE */, /*47284*/25931/* 1D7CF */,/*47285*/25932/* 1D7D0 */,/*47286*/25933/* 1D7D1 */,/*47287*/25934/* 1D7D2 */, /*47288*/25935/* 1D7D3 */,/*47289*/25936/* 1D7D4 */,/*47290*/25937/* 1D7D5 */,/*47291*/25938/* 1D7D6 */, /*47292*/25939/* 1D7D7 */,/*47293*/25940/* 1D7D8 */,/*47294*/25941/* 1D7D9 */,/*47295*/25942/* 1D7DA */, /*47296*/25943/* 1D7DB */,/*47297*/25944/* 1D7DC */,/*47298*/25945/* 1D7DD */,/*47299*/25946/* 1D7DE */, /*47300*/25947/* 1D7DF */,/*47301*/25948/* 1D7E0 */,/*47302*/25949/* 1D7E1 */,/*47303*/25950/* 1D7E2 */, /*47304*/25951/* 1D7E3 */,/*47305*/25952/* 1D7E4 */,/*47306*/25953/* 1D7E5 */,/*47307*/25954/* 1D7E6 */, /*47308*/25955/* 1D7E7 */,/*47309*/25956/* 1D7E8 */,/*47310*/25957/* 1D7E9 */,/*47311*/25958/* 1D7EA */, /*47312*/25959/* 1D7EB */,/*47313*/25960/* 1D7EC */,/*47314*/25961/* 1D7ED */,/*47315*/25962/* 1D7EE */, /*47316*/25963/* 1D7EF */,/*47317*/25964/* 1D7F0 */,/*47318*/25965/* 1D7F1 */,/*47319*/25966/* 1D7F2 */, /*47320*/25967/* 1D7F3 */,/*47321*/25968/* 1D7F4 */,/*47322*/25969/* 1D7F5 */,/*47323*/25970/* 1D7F6 */, /*47324*/25971/* 1D7F7 */,/*47325*/25972/* 1D7F8 */,/*47326*/25973/* 1D7F9 */,/*47327*/25974/* 1D7FA */, /*47328*/25975/* 1D7FB */,/*47329*/25976/* 1D7FC */,/*47330*/25977/* 1D7FD */,/*47331*/25978/* 1D7FE */, /*47332*/25979/* 1D7FF */,/*47333*/25980/* 1D800 */,/*47334*/25981/* 1D801 */,/*47335*/25982/* 1D802 */, /*47336*/25983/* 1D803 */,/*47337*/25984/* 1D804 */,/*47338*/25985/* 1D805 */,/*47339*/25986/* 1D806 */, /*47340*/25987/* 1D807 */,/*47341*/25988/* 1D808 */,/*47342*/25989/* 1D809 */,/*47343*/25990/* 1D80A */, /*47344*/25991/* 1D80B */,/*47345*/25992/* 1D80C */,/*47346*/25993/* 1D80D */,/*47347*/25994/* 1D80E */, /*47348*/25995/* 1D80F */,/*47349*/25996/* 1D810 */,/*47350*/25997/* 1D811 */,/*47351*/25998/* 1D812 */, /*47352*/25999/* 1D813 */,/*47353*/26000/* 1D814 */,/*47354*/26001/* 1D815 */,/*47355*/26002/* 1D816 */, /*47356*/26003/* 1D817 */,/*47357*/26004/* 1D818 */,/*47358*/26005/* 1D819 */,/*47359*/26006/* 1D81A */, /*47360*/26007/* 1D81B */,/*47361*/26008/* 1D81C */,/*47362*/26009/* 1D81D */,/*47363*/26010/* 1D81E */, /*47364*/26011/* 1D81F */,/*47365*/26012/* 1D820 */,/*47366*/26013/* 1D821 */,/*47367*/26014/* 1D822 */, /*47368*/26015/* 1D823 */,/*47369*/26016/* 1D824 */,/*47370*/26017/* 1D825 */,/*47371*/26018/* 1D826 */, /*47372*/26019/* 1D827 */,/*47373*/26020/* 1D828 */,/*47374*/26021/* 1D829 */,/*47375*/26022/* 1D82A */, /*47376*/26023/* 1D82B */,/*47377*/26024/* 1D82C */,/*47378*/26025/* 1D82D */,/*47379*/26026/* 1D82E */, /*47380*/26027/* 1D82F */,/*47381*/26028/* 1D830 */,/*47382*/26029/* 1D831 */,/*47383*/26030/* 1D832 */, /*47384*/26031/* 1D833 */,/*47385*/26032/* 1D834 */,/*47386*/26033/* 1D835 */,/*47387*/26034/* 1D836 */, /*47388*/26035/* 1D837 */,/*47389*/26036/* 1D838 */,/*47390*/26037/* 1D839 */,/*47391*/26038/* 1D83A */, /*47392*/26039/* 1D83B */,/*47393*/26040/* 1D83C */,/*47394*/26041/* 1D83D */,/*47395*/26042/* 1D83E */, /*47396*/26043/* 1D83F */,/*47397*/26044/* 1D840 */,/*47398*/26045/* 1D841 */,/*47399*/26046/* 1D842 */, /*47400*/26047/* 1D843 */,/*47401*/26048/* 1D844 */,/*47402*/26049/* 1D845 */,/*47403*/26050/* 1D846 */, /*47404*/26051/* 1D847 */,/*47405*/26052/* 1D848 */,/*47406*/26053/* 1D849 */,/*47407*/26054/* 1D84A */, /*47408*/26055/* 1D84B */,/*47409*/26056/* 1D84C */,/*47410*/26057/* 1D84D */,/*47411*/26058/* 1D84E */, /*47412*/26059/* 1D84F */,/*47413*/26060/* 1D850 */,/*47414*/26061/* 1D851 */,/*47415*/26062/* 1D852 */, /*47416*/26063/* 1D853 */,/*47417*/26064/* 1D854 */,/*47418*/26065/* 1D855 */,/*47419*/26066/* 1D856 */, /*47420*/26067/* 1D857 */,/*47421*/26068/* 1D858 */,/*47422*/26069/* 1D859 */,/*47423*/26070/* 1D85A */, /*47424*/26071/* 1D85B */,/*47425*/26072/* 1D85C */,/*47426*/26073/* 1D85D */,/*47427*/26074/* 1D85E */, /*47428*/26075/* 1D85F */,/*47429*/26076/* 1D860 */,/*47430*/26077/* 1D861 */,/*47431*/26078/* 1D862 */, /*47432*/26079/* 1D863 */,/*47433*/26080/* 1D864 */,/*47434*/26081/* 1D865 */,/*47435*/26082/* 1D866 */, /*47436*/26083/* 1D867 */,/*47437*/26084/* 1D868 */,/*47438*/26085/* 1D869 */,/*47439*/26086/* 1D86A */, /*47440*/26087/* 1D86B */,/*47441*/26088/* 1D86C */,/*47442*/26089/* 1D86D */,/*47443*/26090/* 1D86E */, /*47444*/26091/* 1D86F */,/*47445*/26092/* 1D870 */,/*47446*/26093/* 1D871 */,/*47447*/26094/* 1D872 */, /*47448*/26095/* 1D873 */,/*47449*/26096/* 1D874 */,/*47450*/26097/* 1D875 */,/*47451*/26098/* 1D876 */, /*47452*/26099/* 1D877 */,/*47453*/26100/* 1D878 */,/*47454*/26101/* 1D879 */,/*47455*/26102/* 1D87A */, /*47456*/26103/* 1D87B */,/*47457*/26104/* 1D87C */,/*47458*/26105/* 1D87D */,/*47459*/26106/* 1D87E */, /*47460*/26107/* 1D87F */,/*47461*/26108/* 1D880 */,/*47462*/26109/* 1D881 */,/*47463*/26110/* 1D882 */, /*47464*/26111/* 1D883 */,/*47465*/26112/* 1D884 */,/*47466*/26113/* 1D885 */,/*47467*/26114/* 1D886 */, /*47468*/26115/* 1D887 */,/*47469*/26116/* 1D888 */,/*47470*/26117/* 1D889 */,/*47471*/26118/* 1D88A */, /*47472*/26119/* 1D88B */,/*47473*/26120/* 1D88C */,/*47474*/26121/* 1D88D */,/*47475*/26122/* 1D88E */, /*47476*/26123/* 1D88F */,/*47477*/26124/* 1D890 */,/*47478*/26125/* 1D891 */,/*47479*/26126/* 1D892 */, /*47480*/26127/* 1D893 */,/*47481*/26128/* 1D894 */,/*47482*/26129/* 1D895 */,/*47483*/26130/* 1D896 */, /*47484*/26131/* 1D897 */,/*47485*/26132/* 1D898 */,/*47486*/26133/* 1D899 */,/*47487*/26134/* 1D89A */, /*47488*/26135/* 1D89B */,/*47489*/26136/* 1D89C */,/*47490*/26137/* 1D89D */,/*47491*/26138/* 1D89E */, /*47492*/26139/* 1D89F */,/*47493*/26140/* 1D8A0 */,/*47494*/26141/* 1D8A1 */,/*47495*/26142/* 1D8A2 */, /*47496*/26143/* 1D8A3 */,/*47497*/26144/* 1D8A4 */,/*47498*/26145/* 1D8A5 */,/*47499*/26146/* 1D8A6 */, /*47500*/26147/* 1D8A7 */,/*47501*/26148/* 1D8A8 */,/*47502*/26149/* 1D8A9 */,/*47503*/26150/* 1D8AA */, /*47504*/26151/* 1D8AB */,/*47505*/26152/* 1D8AC */,/*47506*/26153/* 1D8AD */,/*47507*/26154/* 1D8AE */, /*47508*/26155/* 1D8AF */,/*47509*/26156/* 1D8B0 */,/*47510*/26157/* 1D8B1 */,/*47511*/26158/* 1D8B2 */, /*47512*/26159/* 1D8B3 */,/*47513*/26160/* 1D8B4 */,/*47514*/26161/* 1D8B5 */,/*47515*/26162/* 1D8B6 */, /*47516*/26163/* 1D8B7 */,/*47517*/26164/* 1D8B8 */,/*47518*/26165/* 1D8B9 */,/*47519*/26166/* 1D8BA */, /*47520*/26167/* 1D8BB */,/*47521*/26168/* 1D8BC */,/*47522*/26169/* 1D8BD */,/*47523*/26170/* 1D8BE */, /*47524*/26171/* 1D8BF */,/*47525*/26172/* 1D8C0 */,/*47526*/26173/* 1D8C1 */,/*47527*/26174/* 1D8C2 */, /*47528*/26175/* 1D8C3 */,/*47529*/26176/* 1D8C4 */,/*47530*/26177/* 1D8C5 */,/*47531*/26178/* 1D8C6 */, /*47532*/26179/* 1D8C7 */,/*47533*/26180/* 1D8C8 */,/*47534*/26181/* 1D8C9 */,/*47535*/26182/* 1D8CA */, /*47536*/26183/* 1D8CB */,/*47537*/26184/* 1D8CC */,/*47538*/26185/* 1D8CD */,/*47539*/26186/* 1D8CE */, /*47540*/26187/* 1D8CF */,/*47541*/26188/* 1D8D0 */,/*47542*/26189/* 1D8D1 */,/*47543*/26190/* 1D8D2 */, /*47544*/26191/* 1D8D3 */,/*47545*/26192/* 1D8D4 */,/*47546*/26193/* 1D8D5 */,/*47547*/26194/* 1D8D6 */, /*47548*/26195/* 1D8D7 */,/*47549*/26196/* 1D8D8 */,/*47550*/26197/* 1D8D9 */,/*47551*/26198/* 1D8DA */, /*47552*/26199/* 1D8DB */,/*47553*/26200/* 1D8DC */,/*47554*/26201/* 1D8DD */,/*47555*/26202/* 1D8DE */, /*47556*/26203/* 1D8DF */,/*47557*/26204/* 1D8E0 */,/*47558*/26205/* 1D8E1 */,/*47559*/26206/* 1D8E2 */, /*47560*/26207/* 1D8E3 */,/*47561*/26208/* 1D8E4 */,/*47562*/26209/* 1D8E5 */,/*47563*/26210/* 1D8E6 */, /*47564*/26211/* 1D8E7 */,/*47565*/26212/* 1D8E8 */,/*47566*/26213/* 1D8E9 */,/*47567*/26214/* 1D8EA */, /*47568*/26215/* 1D8EB */,/*47569*/26216/* 1D8EC */,/*47570*/26217/* 1D8ED */,/*47571*/26218/* 1D8EE */, /*47572*/26219/* 1D8EF */,/*47573*/26220/* 1D8F0 */,/*47574*/26221/* 1D8F1 */,/*47575*/26222/* 1D8F2 */, /*47576*/26223/* 1D8F3 */,/*47577*/26224/* 1D8F4 */,/*47578*/26225/* 1D8F5 */,/*47579*/26226/* 1D8F6 */, /*47580*/26227/* 1D8F7 */,/*47581*/26228/* 1D8F8 */,/*47582*/26229/* 1D8F9 */,/*47583*/26230/* 1D8FA */, /*47584*/26231/* 1D8FB */,/*47585*/26232/* 1D8FC */,/*47586*/26233/* 1D8FD */,/*47587*/26234/* 1D8FE */, /*47588*/26235/* 1D8FF */,/*47589*/26236/* 1D900 */,/*47590*/26237/* 1D901 */,/*47591*/26238/* 1D902 */, /*47592*/26239/* 1D903 */,/*47593*/26240/* 1D904 */,/*47594*/26241/* 1D905 */,/*47595*/26242/* 1D906 */, /*47596*/26243/* 1D907 */,/*47597*/26244/* 1D908 */,/*47598*/26245/* 1D909 */,/*47599*/26246/* 1D90A */, /*47600*/26247/* 1D90B */,/*47601*/26248/* 1D90C */,/*47602*/26249/* 1D90D */,/*47603*/26250/* 1D90E */, /*47604*/26251/* 1D90F */,/*47605*/26252/* 1D910 */,/*47606*/26253/* 1D911 */,/*47607*/26254/* 1D912 */, /*47608*/26255/* 1D913 */,/*47609*/26256/* 1D914 */,/*47610*/26257/* 1D915 */,/*47611*/26258/* 1D916 */, /*47612*/26259/* 1D917 */,/*47613*/26260/* 1D918 */,/*47614*/26261/* 1D919 */,/*47615*/26262/* 1D91A */, /*47616*/26263/* 1D91B */,/*47617*/26264/* 1D91C */,/*47618*/26265/* 1D91D */,/*47619*/26266/* 1D91E */, /*47620*/26267/* 1D91F */,/*47621*/26268/* 1D920 */,/*47622*/26269/* 1D921 */,/*47623*/26270/* 1D922 */, /*47624*/26271/* 1D923 */,/*47625*/26272/* 1D924 */,/*47626*/26273/* 1D925 */,/*47627*/26274/* 1D926 */, /*47628*/26275/* 1D927 */,/*47629*/26276/* 1D928 */,/*47630*/26277/* 1D929 */,/*47631*/26278/* 1D92A */, /*47632*/26279/* 1D92B */,/*47633*/26280/* 1D92C */,/*47634*/26281/* 1D92D */,/*47635*/26282/* 1D92E */, /*47636*/26283/* 1D92F */,/*47637*/26284/* 1D930 */,/*47638*/26285/* 1D931 */,/*47639*/26286/* 1D932 */, /*47640*/26287/* 1D933 */,/*47641*/26288/* 1D934 */,/*47642*/26289/* 1D935 */,/*47643*/26290/* 1D936 */, /*47644*/26291/* 1D937 */,/*47645*/26292/* 1D938 */,/*47646*/26293/* 1D939 */,/*47647*/26294/* 1D93A */, /*47648*/26295/* 1D93B */,/*47649*/26296/* 1D93C */,/*47650*/26297/* 1D93D */,/*47651*/26298/* 1D93E */, /*47652*/26299/* 1D93F */,/*47653*/26300/* 1D940 */,/*47654*/26301/* 1D941 */,/*47655*/26302/* 1D942 */, /*47656*/26303/* 1D943 */,/*47657*/26304/* 1D944 */,/*47658*/26305/* 1D945 */,/*47659*/26306/* 1D946 */, /*47660*/26307/* 1D947 */,/*47661*/26308/* 1D948 */,/*47662*/26309/* 1D949 */,/*47663*/26310/* 1D94A */, /*47664*/26311/* 1D94B */,/*47665*/26312/* 1D94C */,/*47666*/26313/* 1D94D */,/*47667*/26314/* 1D94E */, /*47668*/26315/* 1D94F */,/*47669*/26316/* 1D950 */,/*47670*/26317/* 1D951 */,/*47671*/26318/* 1D952 */, /*47672*/26319/* 1D953 */,/*47673*/26320/* 1D954 */,/*47674*/26321/* 1D955 */,/*47675*/26322/* 1D956 */, /*47676*/26323/* 1D957 */,/*47677*/26324/* 1D958 */,/*47678*/26325/* 1D959 */,/*47679*/26326/* 1D95A */, /*47680*/26327/* 1D95B */,/*47681*/26328/* 1D95C */,/*47682*/26329/* 1D95D */,/*47683*/26330/* 1D95E */, /*47684*/26331/* 1D95F */,/*47685*/26332/* 1D960 */,/*47686*/26333/* 1D961 */,/*47687*/26334/* 1D962 */, /*47688*/26335/* 1D963 */,/*47689*/26336/* 1D964 */,/*47690*/26337/* 1D965 */,/*47691*/26338/* 1D966 */, /*47692*/26339/* 1D967 */,/*47693*/26340/* 1D968 */,/*47694*/26341/* 1D969 */,/*47695*/26342/* 1D96A */, /*47696*/26343/* 1D96B */,/*47697*/26344/* 1D96C */,/*47698*/26345/* 1D96D */,/*47699*/26346/* 1D96E */, /*47700*/26347/* 1D96F */,/*47701*/26348/* 1D970 */,/*47702*/26349/* 1D971 */,/*47703*/26350/* 1D972 */, /*47704*/26351/* 1D973 */,/*47705*/26352/* 1D974 */,/*47706*/26353/* 1D975 */,/*47707*/26354/* 1D976 */, /*47708*/26355/* 1D977 */,/*47709*/26356/* 1D978 */,/*47710*/26357/* 1D979 */,/*47711*/26358/* 1D97A */, /*47712*/26359/* 1D97B */,/*47713*/26360/* 1D97C */,/*47714*/26361/* 1D97D */,/*47715*/26362/* 1D97E */, /*47716*/26363/* 1D97F */,/*47717*/26364/* 1D980 */,/*47718*/26365/* 1D981 */,/*47719*/26366/* 1D982 */, /*47720*/26367/* 1D983 */,/*47721*/26368/* 1D984 */,/*47722*/26369/* 1D985 */,/*47723*/26370/* 1D986 */, /*47724*/26371/* 1D987 */,/*47725*/26372/* 1D988 */,/*47726*/26373/* 1D989 */,/*47727*/26374/* 1D98A */, /*47728*/26375/* 1D98B */,/*47729*/26376/* 1D98C */,/*47730*/26377/* 1D98D */,/*47731*/26378/* 1D98E */, /*47732*/26379/* 1D98F */,/*47733*/26380/* 1D990 */,/*47734*/26381/* 1D991 */,/*47735*/26382/* 1D992 */, /*47736*/26383/* 1D993 */,/*47737*/26384/* 1D994 */,/*47738*/26385/* 1D995 */,/*47739*/26386/* 1D996 */, /*47740*/26387/* 1D997 */,/*47741*/26388/* 1D998 */,/*47742*/26389/* 1D999 */,/*47743*/26390/* 1D99A */, /*47744*/26391/* 1D99B */,/*47745*/26392/* 1D99C */,/*47746*/26393/* 1D99D */,/*47747*/26394/* 1D99E */, /*47748*/26395/* 1D99F */,/*47749*/26396/* 1D9A0 */,/*47750*/26397/* 1D9A1 */,/*47751*/26398/* 1D9A2 */, /*47752*/26399/* 1D9A3 */,/*47753*/26400/* 1D9A4 */,/*47754*/26401/* 1D9A5 */,/*47755*/26402/* 1D9A6 */, /*47756*/26403/* 1D9A7 */,/*47757*/26404/* 1D9A8 */,/*47758*/26405/* 1D9A9 */,/*47759*/26406/* 1D9AA */, /*47760*/26407/* 1D9AB */,/*47761*/26408/* 1D9AC */,/*47762*/26409/* 1D9AD */,/*47763*/26410/* 1D9AE */, /*47764*/26411/* 1D9AF */,/*47765*/26412/* 1D9B0 */,/*47766*/26413/* 1D9B1 */,/*47767*/26414/* 1D9B2 */, /*47768*/26415/* 1D9B3 */,/*47769*/26416/* 1D9B4 */,/*47770*/26417/* 1D9B5 */,/*47771*/26418/* 1D9B6 */, /*47772*/26419/* 1D9B7 */,/*47773*/26420/* 1D9B8 */,/*47774*/26421/* 1D9B9 */,/*47775*/26422/* 1D9BA */, /*47776*/26423/* 1D9BB */,/*47777*/26424/* 1D9BC */,/*47778*/26425/* 1D9BD */,/*47779*/26426/* 1D9BE */, /*47780*/26427/* 1D9BF */,/*47781*/26428/* 1D9C0 */,/*47782*/26429/* 1D9C1 */,/*47783*/26430/* 1D9C2 */, /*47784*/26431/* 1D9C3 */,/*47785*/26432/* 1D9C4 */,/*47786*/26433/* 1D9C5 */,/*47787*/26434/* 1D9C6 */, /*47788*/26435/* 1D9C7 */,/*47789*/26436/* 1D9C8 */,/*47790*/26437/* 1D9C9 */,/*47791*/26438/* 1D9CA */, /*47792*/26439/* 1D9CB */,/*47793*/26440/* 1D9CC */,/*47794*/26441/* 1D9CD */,/*47795*/26442/* 1D9CE */, /*47796*/26443/* 1D9CF */,/*47797*/26444/* 1D9D0 */,/*47798*/26445/* 1D9D1 */,/*47799*/26446/* 1D9D2 */, /*47800*/26447/* 1D9D3 */,/*47801*/26448/* 1D9D4 */,/*47802*/26449/* 1D9D5 */,/*47803*/26450/* 1D9D6 */, /*47804*/26451/* 1D9D7 */,/*47805*/26452/* 1D9D8 */,/*47806*/26453/* 1D9D9 */,/*47807*/26454/* 1D9DA */, /*47808*/26455/* 1D9DB */,/*47809*/26456/* 1D9DC */,/*47810*/26457/* 1D9DD */,/*47811*/26458/* 1D9DE */, /*47812*/26459/* 1D9DF */,/*47813*/26460/* 1D9E0 */,/*47814*/26461/* 1D9E1 */,/*47815*/26462/* 1D9E2 */, /*47816*/26463/* 1D9E3 */,/*47817*/26464/* 1D9E4 */,/*47818*/26465/* 1D9E5 */,/*47819*/26466/* 1D9E6 */, /*47820*/26467/* 1D9E7 */,/*47821*/26468/* 1D9E8 */,/*47822*/26469/* 1D9E9 */,/*47823*/26470/* 1D9EA */, /*47824*/26471/* 1D9EB */,/*47825*/26472/* 1D9EC */,/*47826*/26473/* 1D9ED */,/*47827*/26474/* 1D9EE */, /*47828*/26475/* 1D9EF */,/*47829*/26476/* 1D9F0 */,/*47830*/26477/* 1D9F1 */,/*47831*/26478/* 1D9F2 */, /*47832*/26479/* 1D9F3 */,/*47833*/26480/* 1D9F4 */,/*47834*/26481/* 1D9F5 */,/*47835*/26482/* 1D9F6 */, /*47836*/26483/* 1D9F7 */,/*47837*/26484/* 1D9F8 */,/*47838*/26485/* 1D9F9 */,/*47839*/26486/* 1D9FA */, /*47840*/26487/* 1D9FB */,/*47841*/26488/* 1D9FC */,/*47842*/26489/* 1D9FD */,/*47843*/26490/* 1D9FE */, /*47844*/26491/* 1D9FF */,/*47845*/26492/* 1DA00 */,/*47846*/26492/* 1DA01 */,/*47847*/26492/* 1DA02 */, /*47848*/26492/* 1DA03 */,/*47849*/26492/* 1DA04 */,/*47850*/26492/* 1DA05 */,/*47851*/26492/* 1DA06 */, /*47852*/26492/* 1DA07 */,/*47853*/26492/* 1DA08 */,/*47854*/26492/* 1DA09 */,/*47855*/26492/* 1DA0A */, /*47856*/26492/* 1DA0B */,/*47857*/26492/* 1DA0C */,/*47858*/26492/* 1DA0D */,/*47859*/26492/* 1DA0E */, /*47860*/26492/* 1DA0F */,/*47861*/26492/* 1DA10 */,/*47862*/26492/* 1DA11 */,/*47863*/26492/* 1DA12 */, /*47864*/26492/* 1DA13 */,/*47865*/26492/* 1DA14 */,/*47866*/26492/* 1DA15 */,/*47867*/26492/* 1DA16 */, /*47868*/26492/* 1DA17 */,/*47869*/26492/* 1DA18 */,/*47870*/26492/* 1DA19 */,/*47871*/26492/* 1DA1A */, /*47872*/26492/* 1DA1B */,/*47873*/26492/* 1DA1C */,/*47874*/26492/* 1DA1D */,/*47875*/26492/* 1DA1E */, /*47876*/26492/* 1DA1F */,/*47877*/26492/* 1DA20 */,/*47878*/26492/* 1DA21 */,/*47879*/26492/* 1DA22 */, /*47880*/26492/* 1DA23 */,/*47881*/26492/* 1DA24 */,/*47882*/26492/* 1DA25 */,/*47883*/26492/* 1DA26 */, /*47884*/26492/* 1DA27 */,/*47885*/26492/* 1DA28 */,/*47886*/26492/* 1DA29 */,/*47887*/26492/* 1DA2A */, /*47888*/26492/* 1DA2B */,/*47889*/26492/* 1DA2C */,/*47890*/26492/* 1DA2D */,/*47891*/26492/* 1DA2E */, /*47892*/26492/* 1DA2F */,/*47893*/26492/* 1DA30 */,/*47894*/26492/* 1DA31 */,/*47895*/26492/* 1DA32 */, /*47896*/26492/* 1DA33 */,/*47897*/26492/* 1DA34 */,/*47898*/26492/* 1DA35 */,/*47899*/26492/* 1DA36 */, /*47900*/26493/* 1DA37 */,/*47901*/26494/* 1DA38 */,/*47902*/26495/* 1DA39 */,/*47903*/26496/* 1DA3A */, /*47904*/26492/* 1DA3B */,/*47905*/26492/* 1DA3C */,/*47906*/26492/* 1DA3D */,/*47907*/26492/* 1DA3E */, /*47908*/26492/* 1DA3F */,/*47909*/26492/* 1DA40 */,/*47910*/26492/* 1DA41 */,/*47911*/26492/* 1DA42 */, /*47912*/26492/* 1DA43 */,/*47913*/26492/* 1DA44 */,/*47914*/26492/* 1DA45 */,/*47915*/26492/* 1DA46 */, /*47916*/26492/* 1DA47 */,/*47917*/26492/* 1DA48 */,/*47918*/26492/* 1DA49 */,/*47919*/26492/* 1DA4A */, /*47920*/26492/* 1DA4B */,/*47921*/26492/* 1DA4C */,/*47922*/26492/* 1DA4D */,/*47923*/26492/* 1DA4E */, /*47924*/26492/* 1DA4F */,/*47925*/26492/* 1DA50 */,/*47926*/26492/* 1DA51 */,/*47927*/26492/* 1DA52 */, /*47928*/26492/* 1DA53 */,/*47929*/26492/* 1DA54 */,/*47930*/26492/* 1DA55 */,/*47931*/26492/* 1DA56 */, /*47932*/26492/* 1DA57 */,/*47933*/26492/* 1DA58 */,/*47934*/26492/* 1DA59 */,/*47935*/26492/* 1DA5A */, /*47936*/26492/* 1DA5B */,/*47937*/26492/* 1DA5C */,/*47938*/26492/* 1DA5D */,/*47939*/26492/* 1DA5E */, /*47940*/26492/* 1DA5F */,/*47941*/26492/* 1DA60 */,/*47942*/26492/* 1DA61 */,/*47943*/26492/* 1DA62 */, /*47944*/26492/* 1DA63 */,/*47945*/26492/* 1DA64 */,/*47946*/26492/* 1DA65 */,/*47947*/26492/* 1DA66 */, /*47948*/26492/* 1DA67 */,/*47949*/26492/* 1DA68 */,/*47950*/26492/* 1DA69 */,/*47951*/26492/* 1DA6A */, /*47952*/26492/* 1DA6B */,/*47953*/26492/* 1DA6C */,/*47954*/26497/* 1DA6D */,/*47955*/26498/* 1DA6E */, /*47956*/26499/* 1DA6F */,/*47957*/26500/* 1DA70 */,/*47958*/26501/* 1DA71 */,/*47959*/26502/* 1DA72 */, /*47960*/26503/* 1DA73 */,/*47961*/26504/* 1DA74 */,/*47962*/26492/* 1DA75 */,/*47963*/26505/* 1DA76 */, /*47964*/26506/* 1DA77 */,/*47965*/26507/* 1DA78 */,/*47966*/26508/* 1DA79 */,/*47967*/26509/* 1DA7A */, /*47968*/26510/* 1DA7B */,/*47969*/26511/* 1DA7C */,/*47970*/26512/* 1DA7D */,/*47971*/26513/* 1DA7E */, /*47972*/26514/* 1DA7F */,/*47973*/26515/* 1DA80 */,/*47974*/26516/* 1DA81 */,/*47975*/26517/* 1DA82 */, /*47976*/26518/* 1DA83 */,/*47977*/26492/* 1DA84 */,/*47978*/26519/* 1DA85 */,/*47979*/26520/* 1DA86 */, /*47980*/26521/* 1DA87 */,/*47981*/26522/* 1DA88 */,/*47982*/26523/* 1DA89 */,/*47983*/26524/* 1DA8A */, /*47984*/26525/* 1DA8B */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*48000*/26492/* 1DA9B */,/*48001*/26492/* 1DA9C */, /*48002*/26492/* 1DA9D */,/*48003*/26492/* 1DA9E */,/*48004*/26492/* 1DA9F */,0,/*48006*/26492/* 1DAA1 */, /*48007*/26492/* 1DAA2 */,/*48008*/26492/* 1DAA3 */,/*48009*/26492/* 1DAA4 */,/*48010*/26492/* 1DAA5 */, /*48011*/26492/* 1DAA6 */,/*48012*/26492/* 1DAA7 */,/*48013*/26492/* 1DAA8 */,/*48014*/26492/* 1DAA9 */, /*48015*/26492/* 1DAAA */,/*48016*/26492/* 1DAAB */,/*48017*/26492/* 1DAAC */,/*48018*/26492/* 1DAAD */, /*48019*/26492/* 1DAAE */,/*48020*/26492/* 1DAAF */,/*48021*/26526/* 1E000 */,/*48022*/26527/* 1E001 */, /*48023*/26528/* 1E002 */,/*48024*/26529/* 1E003 */,/*48025*/26530/* 1E004 */,/*48026*/26531/* 1E005 */, /*48027*/26532/* 1E006 */,0,/*48029*/26533/* 1E008 */,/*48030*/26534/* 1E009 */,/*48031*/26535/* 1E00A */, /*48032*/26536/* 1E00B */,/*48033*/26537/* 1E00C */,/*48034*/26538/* 1E00D */,/*48035*/26539/* 1E00E */, /*48036*/26540/* 1E00F */,/*48037*/26541/* 1E010 */,/*48038*/26542/* 1E011 */,/*48039*/26543/* 1E012 */, /*48040*/26544/* 1E013 */,/*48041*/26545/* 1E014 */,/*48042*/26546/* 1E015 */,/*48043*/26547/* 1E016 */, /*48044*/26548/* 1E017 */,/*48045*/26549/* 1E018 */,0,0,/*48048*/26550/* 1E01B */,/*48049*/26551/* 1E01C */, /*48050*/26552/* 1E01D */,/*48051*/26553/* 1E01E */,/*48052*/26554/* 1E01F */,/*48053*/26555/* 1E020 */, /*48054*/26556/* 1E021 */,0,/*48056*/26557/* 1E023 */,/*48057*/26558/* 1E024 */,0,/*48059*/26559/* 1E026 */, /*48060*/26560/* 1E027 */,/*48061*/26561/* 1E028 */,/*48062*/26562/* 1E029 */,/*48063*/26563/* 1E02A */, /*48064*/26564/* 1E800 */,/*48065*/26565/* 1E801 */,/*48066*/26566/* 1E802 */,/*48067*/26567/* 1E803 */, /*48068*/26568/* 1E804 */,/*48069*/26569/* 1E805 */,/*48070*/26570/* 1E806 */,/*48071*/26571/* 1E807 */, /*48072*/26572/* 1E808 */,/*48073*/26573/* 1E809 */,/*48074*/26574/* 1E80A */,/*48075*/26575/* 1E80B */, /*48076*/26576/* 1E80C */,/*48077*/26577/* 1E80D */,/*48078*/26578/* 1E80E */,/*48079*/26579/* 1E80F */, /*48080*/26580/* 1E810 */,/*48081*/26581/* 1E811 */,/*48082*/26582/* 1E812 */,/*48083*/26583/* 1E813 */, /*48084*/26584/* 1E814 */,/*48085*/26585/* 1E815 */,/*48086*/26586/* 1E816 */,/*48087*/26587/* 1E817 */, /*48088*/26588/* 1E818 */,/*48089*/26589/* 1E819 */,/*48090*/26590/* 1E81A */,/*48091*/26591/* 1E81B */, /*48092*/26592/* 1E81C */,/*48093*/26593/* 1E81D */,/*48094*/26594/* 1E81E */,/*48095*/26595/* 1E81F */, /*48096*/26596/* 1E820 */,/*48097*/26597/* 1E821 */,/*48098*/26598/* 1E822 */,/*48099*/26599/* 1E823 */, /*48100*/26600/* 1E824 */,/*48101*/26601/* 1E825 */,/*48102*/26602/* 1E826 */,/*48103*/26603/* 1E827 */, /*48104*/26604/* 1E828 */,/*48105*/26605/* 1E829 */,/*48106*/26606/* 1E82A */,/*48107*/26607/* 1E82B */, /*48108*/26608/* 1E82C */,/*48109*/26609/* 1E82D */,/*48110*/26610/* 1E82E */,/*48111*/26611/* 1E82F */, /*48112*/26612/* 1E830 */,/*48113*/26613/* 1E831 */,/*48114*/26614/* 1E832 */,/*48115*/26615/* 1E833 */, /*48116*/26616/* 1E834 */,/*48117*/26617/* 1E835 */,/*48118*/26618/* 1E836 */,/*48119*/26619/* 1E837 */, /*48120*/26620/* 1E838 */,/*48121*/26621/* 1E839 */,/*48122*/26622/* 1E83A */,/*48123*/26623/* 1E83B */, /*48124*/26624/* 1E83C */,/*48125*/26625/* 1E83D */,/*48126*/26626/* 1E83E */,/*48127*/26627/* 1E83F */, /*48128*/26628/* 1E840 */,/*48129*/26629/* 1E841 */,/*48130*/26630/* 1E842 */,/*48131*/26631/* 1E843 */, /*48132*/26632/* 1E844 */,/*48133*/26633/* 1E845 */,/*48134*/26634/* 1E846 */,/*48135*/26635/* 1E847 */, /*48136*/26636/* 1E848 */,/*48137*/26637/* 1E849 */,/*48138*/26638/* 1E84A */,/*48139*/26639/* 1E84B */, /*48140*/26640/* 1E84C */,/*48141*/26641/* 1E84D */,/*48142*/26642/* 1E84E */,/*48143*/26643/* 1E84F */, /*48144*/26644/* 1E850 */,/*48145*/26645/* 1E851 */,/*48146*/26646/* 1E852 */,/*48147*/26647/* 1E853 */, /*48148*/26648/* 1E854 */,/*48149*/26649/* 1E855 */,/*48150*/26650/* 1E856 */,/*48151*/26651/* 1E857 */, /*48152*/26652/* 1E858 */,/*48153*/26653/* 1E859 */,/*48154*/26654/* 1E85A */,/*48155*/26655/* 1E85B */, /*48156*/26656/* 1E85C */,/*48157*/26657/* 1E85D */,/*48158*/26658/* 1E85E */,/*48159*/26659/* 1E85F */, /*48160*/26660/* 1E860 */,/*48161*/26661/* 1E861 */,/*48162*/26662/* 1E862 */,/*48163*/26663/* 1E863 */, /*48164*/26664/* 1E864 */,/*48165*/26665/* 1E865 */,/*48166*/26666/* 1E866 */,/*48167*/26667/* 1E867 */, /*48168*/26668/* 1E868 */,/*48169*/26669/* 1E869 */,/*48170*/26670/* 1E86A */,/*48171*/26671/* 1E86B */, /*48172*/26672/* 1E86C */,/*48173*/26673/* 1E86D */,/*48174*/26674/* 1E86E */,/*48175*/26675/* 1E86F */, /*48176*/26676/* 1E870 */,/*48177*/26677/* 1E871 */,/*48178*/26678/* 1E872 */,/*48179*/26679/* 1E873 */, /*48180*/26680/* 1E874 */,/*48181*/26681/* 1E875 */,/*48182*/26682/* 1E876 */,/*48183*/26683/* 1E877 */, /*48184*/26684/* 1E878 */,/*48185*/26685/* 1E879 */,/*48186*/26686/* 1E87A */,/*48187*/26687/* 1E87B */, /*48188*/26688/* 1E87C */,/*48189*/26689/* 1E87D */,/*48190*/26690/* 1E87E */,/*48191*/26691/* 1E87F */, /*48192*/26692/* 1E880 */,/*48193*/26693/* 1E881 */,/*48194*/26694/* 1E882 */,/*48195*/26695/* 1E883 */, /*48196*/26696/* 1E884 */,/*48197*/26697/* 1E885 */,/*48198*/26698/* 1E886 */,/*48199*/26699/* 1E887 */, /*48200*/26700/* 1E888 */,/*48201*/26701/* 1E889 */,/*48202*/26702/* 1E88A */,/*48203*/26703/* 1E88B */, /*48204*/26704/* 1E88C */,/*48205*/26705/* 1E88D */,/*48206*/26706/* 1E88E */,/*48207*/26707/* 1E88F */, /*48208*/26708/* 1E890 */,/*48209*/26709/* 1E891 */,/*48210*/26710/* 1E892 */,/*48211*/26711/* 1E893 */, /*48212*/26712/* 1E894 */,/*48213*/26713/* 1E895 */,/*48214*/26714/* 1E896 */,/*48215*/26715/* 1E897 */, /*48216*/26716/* 1E898 */,/*48217*/26717/* 1E899 */,/*48218*/26718/* 1E89A */,/*48219*/26719/* 1E89B */, /*48220*/26720/* 1E89C */,/*48221*/26721/* 1E89D */,/*48222*/26722/* 1E89E */,/*48223*/26723/* 1E89F */, /*48224*/26724/* 1E8A0 */,/*48225*/26725/* 1E8A1 */,/*48226*/26726/* 1E8A2 */,/*48227*/26727/* 1E8A3 */, /*48228*/26728/* 1E8A4 */,/*48229*/26729/* 1E8A5 */,/*48230*/26730/* 1E8A6 */,/*48231*/26731/* 1E8A7 */, /*48232*/26732/* 1E8A8 */,/*48233*/26733/* 1E8A9 */,/*48234*/26734/* 1E8AA */,/*48235*/26735/* 1E8AB */, /*48236*/26736/* 1E8AC */,/*48237*/26737/* 1E8AD */,/*48238*/26738/* 1E8AE */,/*48239*/26739/* 1E8AF */, /*48240*/26740/* 1E8B0 */,/*48241*/26741/* 1E8B1 */,/*48242*/26742/* 1E8B2 */,/*48243*/26743/* 1E8B3 */, /*48244*/26744/* 1E8B4 */,/*48245*/26745/* 1E8B5 */,/*48246*/26746/* 1E8B6 */,/*48247*/26747/* 1E8B7 */, /*48248*/26748/* 1E8B8 */,/*48249*/26749/* 1E8B9 */,/*48250*/26750/* 1E8BA */,/*48251*/26751/* 1E8BB */, /*48252*/26752/* 1E8BC */,/*48253*/26753/* 1E8BD */,/*48254*/26754/* 1E8BE */,/*48255*/26755/* 1E8BF */, /*48256*/26756/* 1E8C0 */,/*48257*/26757/* 1E8C1 */,/*48258*/26758/* 1E8C2 */,/*48259*/26759/* 1E8C3 */, /*48260*/26760/* 1E8C4 */,0,0,/*48263*/26761/* 1E8C7 */,/*48264*/26762/* 1E8C8 */,/*48265*/26763/* 1E8C9 */, /*48266*/26764/* 1E8CA */,/*48267*/26765/* 1E8CB */,/*48268*/26766/* 1E8CC */,/*48269*/26767/* 1E8CD */, /*48270*/26768/* 1E8CE */,/*48271*/26769/* 1E8CF */,/*48272*/26770/* 1E8D0 */,/*48273*/26770/* 1E8D1 */, /*48274*/26770/* 1E8D2 */,/*48275*/26770/* 1E8D3 */,/*48276*/26770/* 1E8D4 */,/*48277*/26770/* 1E8D5 */, /*48278*/26770/* 1E8D6 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*48320*/26771/* 1E900 */,/*48321*/26772/* 1E901 */,/*48322*/26773/* 1E902 */,/*48323*/26774/* 1E903 */, /*48324*/26775/* 1E904 */,/*48325*/26776/* 1E905 */,/*48326*/26777/* 1E906 */,/*48327*/26778/* 1E907 */, /*48328*/26779/* 1E908 */,/*48329*/26780/* 1E909 */,/*48330*/26781/* 1E90A */,/*48331*/26782/* 1E90B */, /*48332*/26783/* 1E90C */,/*48333*/26784/* 1E90D */,/*48334*/26785/* 1E90E */,/*48335*/26786/* 1E90F */, /*48336*/26787/* 1E910 */,/*48337*/26788/* 1E911 */,/*48338*/26789/* 1E912 */,/*48339*/26790/* 1E913 */, /*48340*/26791/* 1E914 */,/*48341*/26792/* 1E915 */,/*48342*/26793/* 1E916 */,/*48343*/26794/* 1E917 */, /*48344*/26795/* 1E918 */,/*48345*/26796/* 1E919 */,/*48346*/26797/* 1E91A */,/*48347*/26798/* 1E91B */, /*48348*/26799/* 1E91C */,/*48349*/26800/* 1E91D */,/*48350*/26801/* 1E91E */,/*48351*/26802/* 1E91F */, /*48352*/26803/* 1E920 */,/*48353*/26804/* 1E921 */,/*48354*/26805/* 1E922 */,/*48355*/26806/* 1E923 */, /*48356*/26807/* 1E924 */,/*48357*/26808/* 1E925 */,/*48358*/26809/* 1E926 */,/*48359*/26810/* 1E927 */, /*48360*/26811/* 1E928 */,/*48361*/26812/* 1E929 */,/*48362*/26813/* 1E92A */,/*48363*/26814/* 1E92B */, /*48364*/26815/* 1E92C */,/*48365*/26816/* 1E92D */,/*48366*/26817/* 1E92E */,/*48367*/26818/* 1E92F */, /*48368*/26819/* 1E930 */,/*48369*/26820/* 1E931 */,/*48370*/26821/* 1E932 */,/*48371*/26822/* 1E933 */, /*48372*/26823/* 1E934 */,/*48373*/26824/* 1E935 */,/*48374*/26825/* 1E936 */,/*48375*/26826/* 1E937 */, /*48376*/26827/* 1E938 */,/*48377*/26828/* 1E939 */,/*48378*/26829/* 1E93A */,/*48379*/26830/* 1E93B */, /*48380*/26831/* 1E93C */,/*48381*/26832/* 1E93D */,/*48382*/26833/* 1E93E */,/*48383*/26834/* 1E93F */, /*48384*/26835/* 1E940 */,/*48385*/26836/* 1E941 */,/*48386*/26837/* 1E942 */,/*48387*/26838/* 1E943 */, /*48388*/26839/* 1E944 */,/*48389*/26839/* 1E945 */,/*48390*/26839/* 1E946 */,/*48391*/26840/* 1E947 */, /*48392*/26841/* 1E948 */,/*48393*/26842/* 1E949 */,/*48394*/26843/* 1E94A */,0,0,0,0,0,/*48400*/26844/* 1E950 */, /*48401*/26845/* 1E951 */,/*48402*/26846/* 1E952 */,/*48403*/26847/* 1E953 */,/*48404*/26848/* 1E954 */, /*48405*/26849/* 1E955 */,/*48406*/26850/* 1E956 */,/*48407*/26851/* 1E957 */,/*48408*/26852/* 1E958 */, /*48409*/26853/* 1E959 */,0,0,0,0,/*48414*/26854/* 1E95E */,/*48415*/26855/* 1E95F */,/*48416*/26856/* 1EE00 */, /*48417*/26857/* 1EE01 */,/*48418*/26858/* 1EE02 */,/*48419*/26859/* 1EE03 */,0,/*48421*/26860/* 1EE05 */, /*48422*/26861/* 1EE06 */,/*48423*/26862/* 1EE07 */,/*48424*/26863/* 1EE08 */,/*48425*/26864/* 1EE09 */, /*48426*/26865/* 1EE0A */,/*48427*/26866/* 1EE0B */,/*48428*/26867/* 1EE0C */,/*48429*/26868/* 1EE0D */, /*48430*/26869/* 1EE0E */,/*48431*/26870/* 1EE0F */,/*48432*/26871/* 1EE10 */,/*48433*/26872/* 1EE11 */, /*48434*/26873/* 1EE12 */,/*48435*/26874/* 1EE13 */,/*48436*/26875/* 1EE14 */,/*48437*/26876/* 1EE15 */, /*48438*/26877/* 1EE16 */,/*48439*/26878/* 1EE17 */,/*48440*/26879/* 1EE18 */,/*48441*/26880/* 1EE19 */, /*48442*/26881/* 1EE1A */,/*48443*/26882/* 1EE1B */,/*48444*/26883/* 1EE1C */,/*48445*/26884/* 1EE1D */, /*48446*/26885/* 1EE1E */,/*48447*/26886/* 1EE1F */,0,/*48449*/26887/* 1EE21 */,/*48450*/26888/* 1EE22 */,0, /*48452*/26889/* 1EE24 */,0,0,/*48455*/26890/* 1EE27 */,0,/*48457*/26891/* 1EE29 */,/*48458*/26892/* 1EE2A */, /*48459*/26893/* 1EE2B */,/*48460*/26894/* 1EE2C */,/*48461*/26895/* 1EE2D */,/*48462*/26896/* 1EE2E */, /*48463*/26897/* 1EE2F */,/*48464*/26898/* 1EE30 */,/*48465*/26899/* 1EE31 */,/*48466*/26900/* 1EE32 */,0, /*48468*/26901/* 1EE34 */,/*48469*/26902/* 1EE35 */,/*48470*/26903/* 1EE36 */,/*48471*/26904/* 1EE37 */,0, /*48473*/26905/* 1EE39 */,0,/*48475*/26906/* 1EE3B */,0,0,0,0,0,0,/*48482*/26907/* 1EE42 */,0,0,0,0, /*48487*/26908/* 1EE47 */,0,/*48489*/26909/* 1EE49 */,0,/*48491*/26910/* 1EE4B */,0,/*48493*/26911/* 1EE4D */, /*48494*/26912/* 1EE4E */,/*48495*/26913/* 1EE4F */,0,/*48497*/26914/* 1EE51 */,/*48498*/26915/* 1EE52 */,0, /*48500*/26916/* 1EE54 */,0,0,/*48503*/26917/* 1EE57 */,0,/*48505*/26918/* 1EE59 */,0,/*48507*/26919/* 1EE5B */,0, /*48509*/26920/* 1EE5D */,0,/*48511*/26921/* 1EE5F */,0,/*48513*/26922/* 1EE61 */,/*48514*/26923/* 1EE62 */,0, /*48516*/26924/* 1EE64 */,0,0,/*48519*/26925/* 1EE67 */,/*48520*/26926/* 1EE68 */,/*48521*/26927/* 1EE69 */, /*48522*/26928/* 1EE6A */,0,/*48524*/26929/* 1EE6C */,/*48525*/26930/* 1EE6D */,/*48526*/26931/* 1EE6E */, /*48527*/26932/* 1EE6F */,/*48528*/26933/* 1EE70 */,/*48529*/26934/* 1EE71 */,/*48530*/26935/* 1EE72 */,0, /*48532*/26936/* 1EE74 */,/*48533*/26937/* 1EE75 */,/*48534*/26938/* 1EE76 */,/*48535*/26939/* 1EE77 */,0, /*48537*/26940/* 1EE79 */,/*48538*/26941/* 1EE7A */,/*48539*/26942/* 1EE7B */,/*48540*/26943/* 1EE7C */,0, /*48542*/26944/* 1EE7E */,0,/*48544*/26945/* 1EE80 */,/*48545*/26946/* 1EE81 */,/*48546*/26947/* 1EE82 */, /*48547*/26948/* 1EE83 */,/*48548*/26949/* 1EE84 */,/*48549*/26950/* 1EE85 */,/*48550*/26951/* 1EE86 */, /*48551*/26952/* 1EE87 */,/*48552*/26953/* 1EE88 */,/*48553*/26954/* 1EE89 */,0,/*48555*/26955/* 1EE8B */, /*48556*/26956/* 1EE8C */,/*48557*/26957/* 1EE8D */,/*48558*/26958/* 1EE8E */,/*48559*/26959/* 1EE8F */, /*48560*/26960/* 1EE90 */,/*48561*/26961/* 1EE91 */,/*48562*/26962/* 1EE92 */,/*48563*/26963/* 1EE93 */, /*48564*/26964/* 1EE94 */,/*48565*/26965/* 1EE95 */,/*48566*/26966/* 1EE96 */,/*48567*/26967/* 1EE97 */, /*48568*/26968/* 1EE98 */,/*48569*/26969/* 1EE99 */,/*48570*/26970/* 1EE9A */,/*48571*/26971/* 1EE9B */,0,0,0,0,0, /*48577*/26972/* 1EEA1 */,/*48578*/26973/* 1EEA2 */,/*48579*/26974/* 1EEA3 */,0,/*48581*/26975/* 1EEA5 */, /*48582*/26976/* 1EEA6 */,/*48583*/26977/* 1EEA7 */,/*48584*/26978/* 1EEA8 */,/*48585*/26979/* 1EEA9 */,0, /*48587*/26980/* 1EEAB */,/*48588*/26981/* 1EEAC */,/*48589*/26982/* 1EEAD */,/*48590*/26983/* 1EEAE */, /*48591*/26984/* 1EEAF */,/*48592*/26985/* 1EEB0 */,/*48593*/26986/* 1EEB1 */,/*48594*/26987/* 1EEB2 */, /*48595*/26988/* 1EEB3 */,/*48596*/26989/* 1EEB4 */,/*48597*/26990/* 1EEB5 */,/*48598*/26991/* 1EEB6 */, /*48599*/26992/* 1EEB7 */,/*48600*/26993/* 1EEB8 */,/*48601*/26994/* 1EEB9 */,/*48602*/26995/* 1EEBA */, /*48603*/26996/* 1EEBB */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,/*48656*/26997/* 1EEF0 */,/*48657*/26998/* 1EEF1 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,/*48928*/26999/* 1F000 */,/*48929*/27000/* 1F001 */,/*48930*/27001/* 1F002 */,/*48931*/27002/* 1F003 */, /*48932*/27003/* 1F004 */,/*48933*/27004/* 1F005 */,/*48934*/27005/* 1F006 */,/*48935*/27006/* 1F007 */, /*48936*/27007/* 1F008 */,/*48937*/27008/* 1F009 */,/*48938*/27009/* 1F00A */,/*48939*/27010/* 1F00B */, /*48940*/27011/* 1F00C */,/*48941*/27012/* 1F00D */,/*48942*/27013/* 1F00E */,/*48943*/27014/* 1F00F */, /*48944*/27015/* 1F010 */,/*48945*/27016/* 1F011 */,/*48946*/27017/* 1F012 */,/*48947*/27018/* 1F013 */, /*48948*/27019/* 1F014 */,/*48949*/27020/* 1F015 */,/*48950*/27021/* 1F016 */,/*48951*/27022/* 1F017 */, /*48952*/27023/* 1F018 */,/*48953*/27024/* 1F019 */,/*48954*/27025/* 1F01A */,/*48955*/27026/* 1F01B */, /*48956*/27027/* 1F01C */,/*48957*/27028/* 1F01D */,/*48958*/27029/* 1F01E */,/*48959*/27030/* 1F01F */, /*48960*/27031/* 1F020 */,/*48961*/27032/* 1F021 */,/*48962*/27033/* 1F022 */,/*48963*/27034/* 1F023 */, /*48964*/27035/* 1F024 */,/*48965*/27036/* 1F025 */,/*48966*/27037/* 1F026 */,/*48967*/27038/* 1F027 */, /*48968*/27039/* 1F028 */,/*48969*/27040/* 1F029 */,/*48970*/27041/* 1F02A */,/*48971*/27042/* 1F02B */,0,0,0,0, /*48976*/27043/* 1F030 */,/*48977*/27044/* 1F031 */,/*48978*/27045/* 1F032 */,/*48979*/27046/* 1F033 */, /*48980*/27047/* 1F034 */,/*48981*/27048/* 1F035 */,/*48982*/27049/* 1F036 */,/*48983*/27050/* 1F037 */, /*48984*/27051/* 1F038 */,/*48985*/27052/* 1F039 */,/*48986*/27053/* 1F03A */,/*48987*/27054/* 1F03B */, /*48988*/27055/* 1F03C */,/*48989*/27056/* 1F03D */,/*48990*/27057/* 1F03E */,/*48991*/27058/* 1F03F */, /*48992*/27059/* 1F040 */,/*48993*/27060/* 1F041 */,/*48994*/27061/* 1F042 */,/*48995*/27062/* 1F043 */, /*48996*/27063/* 1F044 */,/*48997*/27064/* 1F045 */,/*48998*/27065/* 1F046 */,/*48999*/27066/* 1F047 */, /*49000*/27067/* 1F048 */,/*49001*/27068/* 1F049 */,/*49002*/27069/* 1F04A */,/*49003*/27070/* 1F04B */, /*49004*/27071/* 1F04C */,/*49005*/27072/* 1F04D */,/*49006*/27073/* 1F04E */,/*49007*/27074/* 1F04F */, /*49008*/27075/* 1F050 */,/*49009*/27076/* 1F051 */,/*49010*/27077/* 1F052 */,/*49011*/27078/* 1F053 */, /*49012*/27079/* 1F054 */,/*49013*/27080/* 1F055 */,/*49014*/27081/* 1F056 */,/*49015*/27082/* 1F057 */, /*49016*/27083/* 1F058 */,/*49017*/27084/* 1F059 */,/*49018*/27085/* 1F05A */,/*49019*/27086/* 1F05B */, /*49020*/27087/* 1F05C */,/*49021*/27088/* 1F05D */,/*49022*/27089/* 1F05E */,/*49023*/27090/* 1F05F */, /*49024*/27091/* 1F060 */,/*49025*/27092/* 1F061 */,/*49026*/27093/* 1F062 */,/*49027*/27094/* 1F063 */, /*49028*/27095/* 1F064 */,/*49029*/27096/* 1F065 */,/*49030*/27097/* 1F066 */,/*49031*/27098/* 1F067 */, /*49032*/27099/* 1F068 */,/*49033*/27100/* 1F069 */,/*49034*/27101/* 1F06A */,/*49035*/27102/* 1F06B */, /*49036*/27103/* 1F06C */,/*49037*/27104/* 1F06D */,/*49038*/27105/* 1F06E */,/*49039*/27106/* 1F06F */, /*49040*/27107/* 1F070 */,/*49041*/27108/* 1F071 */,/*49042*/27109/* 1F072 */,/*49043*/27110/* 1F073 */, /*49044*/27111/* 1F074 */,/*49045*/27112/* 1F075 */,/*49046*/27113/* 1F076 */,/*49047*/27114/* 1F077 */, /*49048*/27115/* 1F078 */,/*49049*/27116/* 1F079 */,/*49050*/27117/* 1F07A */,/*49051*/27118/* 1F07B */, /*49052*/27119/* 1F07C */,/*49053*/27120/* 1F07D */,/*49054*/27121/* 1F07E */,/*49055*/27122/* 1F07F */, /*49056*/27123/* 1F080 */,/*49057*/27124/* 1F081 */,/*49058*/27125/* 1F082 */,/*49059*/27126/* 1F083 */, /*49060*/27127/* 1F084 */,/*49061*/27128/* 1F085 */,/*49062*/27129/* 1F086 */,/*49063*/27130/* 1F087 */, /*49064*/27131/* 1F088 */,/*49065*/27132/* 1F089 */,/*49066*/27133/* 1F08A */,/*49067*/27134/* 1F08B */, /*49068*/27135/* 1F08C */,/*49069*/27136/* 1F08D */,/*49070*/27137/* 1F08E */,/*49071*/27138/* 1F08F */, /*49072*/27139/* 1F090 */,/*49073*/27140/* 1F091 */,/*49074*/27141/* 1F092 */,/*49075*/27142/* 1F093 */,0,0,0,0,0,0,0,0, 0,0,0,0,/*49088*/27143/* 1F0A0 */,/*49089*/27144/* 1F0A1 */,/*49090*/27145/* 1F0A2 */,/*49091*/27146/* 1F0A3 */, /*49092*/27147/* 1F0A4 */,/*49093*/27148/* 1F0A5 */,/*49094*/27149/* 1F0A6 */,/*49095*/27150/* 1F0A7 */, /*49096*/27151/* 1F0A8 */,/*49097*/27152/* 1F0A9 */,/*49098*/27153/* 1F0AA */,/*49099*/27154/* 1F0AB */, /*49100*/27155/* 1F0AC */,/*49101*/27156/* 1F0AD */,/*49102*/27157/* 1F0AE */,0,0,/*49105*/27158/* 1F0B1 */, /*49106*/27159/* 1F0B2 */,/*49107*/27160/* 1F0B3 */,/*49108*/27161/* 1F0B4 */,/*49109*/27162/* 1F0B5 */, /*49110*/27163/* 1F0B6 */,/*49111*/27164/* 1F0B7 */,/*49112*/27165/* 1F0B8 */,/*49113*/27166/* 1F0B9 */, /*49114*/27167/* 1F0BA */,/*49115*/27168/* 1F0BB */,/*49116*/27169/* 1F0BC */,/*49117*/27170/* 1F0BD */, /*49118*/27171/* 1F0BE */,/*49119*/27172/* 1F0BF */,0,/*49121*/27173/* 1F0C1 */,/*49122*/27174/* 1F0C2 */, /*49123*/27175/* 1F0C3 */,/*49124*/27176/* 1F0C4 */,/*49125*/27177/* 1F0C5 */,/*49126*/27178/* 1F0C6 */, /*49127*/27179/* 1F0C7 */,/*49128*/27180/* 1F0C8 */,/*49129*/27181/* 1F0C9 */,/*49130*/27182/* 1F0CA */, /*49131*/27183/* 1F0CB */,/*49132*/27184/* 1F0CC */,/*49133*/27185/* 1F0CD */,/*49134*/27186/* 1F0CE */, /*49135*/27187/* 1F0CF */,0,/*49137*/27188/* 1F0D1 */,/*49138*/27189/* 1F0D2 */,/*49139*/27190/* 1F0D3 */, /*49140*/27191/* 1F0D4 */,/*49141*/27192/* 1F0D5 */,/*49142*/27193/* 1F0D6 */,/*49143*/27194/* 1F0D7 */, /*49144*/27195/* 1F0D8 */,/*49145*/27196/* 1F0D9 */,/*49146*/27197/* 1F0DA */,/*49147*/27198/* 1F0DB */, /*49148*/27199/* 1F0DC */,/*49149*/27200/* 1F0DD */,/*49150*/27201/* 1F0DE */,/*49151*/27202/* 1F0DF */, /*49152*/27203/* 1F0E0 */,/*49153*/27204/* 1F0E1 */,/*49154*/27205/* 1F0E2 */,/*49155*/27206/* 1F0E3 */, /*49156*/27207/* 1F0E4 */,/*49157*/27208/* 1F0E5 */,/*49158*/27209/* 1F0E6 */,/*49159*/27210/* 1F0E7 */, /*49160*/27211/* 1F0E8 */,/*49161*/27212/* 1F0E9 */,/*49162*/27213/* 1F0EA */,/*49163*/27214/* 1F0EB */, /*49164*/27215/* 1F0EC */,/*49165*/27216/* 1F0ED */,/*49166*/27217/* 1F0EE */,/*49167*/27218/* 1F0EF */, /*49168*/27219/* 1F0F0 */,/*49169*/27220/* 1F0F1 */,/*49170*/27221/* 1F0F2 */,/*49171*/27222/* 1F0F3 */, /*49172*/27223/* 1F0F4 */,/*49173*/27224/* 1F0F5 */,0,0,0,0,0,0,0,0,0,0,/*49184*/27225/* 1F100 */, /*49185*/27226/* 1F101 */,/*49186*/27227/* 1F102 */,/*49187*/27228/* 1F103 */,/*49188*/27229/* 1F104 */, /*49189*/27230/* 1F105 */,/*49190*/27231/* 1F106 */,/*49191*/27232/* 1F107 */,/*49192*/27233/* 1F108 */, /*49193*/27234/* 1F109 */,/*49194*/27235/* 1F10A */,/*49195*/27236/* 1F10B */,/*49196*/27236/* 1F10C */,0,0,0, /*49200*/27237/* 1F110 */,/*49201*/27238/* 1F111 */,/*49202*/27239/* 1F112 */,/*49203*/27240/* 1F113 */, /*49204*/27241/* 1F114 */,/*49205*/27242/* 1F115 */,/*49206*/27243/* 1F116 */,/*49207*/27244/* 1F117 */, /*49208*/27245/* 1F118 */,/*49209*/27246/* 1F119 */,/*49210*/27247/* 1F11A */,/*49211*/27248/* 1F11B */, /*49212*/27249/* 1F11C */,/*49213*/27250/* 1F11D */,/*49214*/27251/* 1F11E */,/*49215*/27252/* 1F11F */, /*49216*/27253/* 1F120 */,/*49217*/27254/* 1F121 */,/*49218*/27255/* 1F122 */,/*49219*/27256/* 1F123 */, /*49220*/27257/* 1F124 */,/*49221*/27258/* 1F125 */,/*49222*/27259/* 1F126 */,/*49223*/27260/* 1F127 */, /*49224*/27261/* 1F128 */,/*49225*/27262/* 1F129 */,/*49226*/27263/* 1F12A */,/*49227*/27264/* 1F12B */, /*49228*/27265/* 1F12C */,/*49229*/27266/* 1F12D */,/*49230*/27267/* 1F12E */,0,/*49232*/27268/* 1F130 */, /*49233*/27269/* 1F131 */,/*49234*/27270/* 1F132 */,/*49235*/27271/* 1F133 */,/*49236*/27272/* 1F134 */, /*49237*/27273/* 1F135 */,/*49238*/27274/* 1F136 */,/*49239*/27275/* 1F137 */,/*49240*/27276/* 1F138 */, /*49241*/27277/* 1F139 */,/*49242*/27278/* 1F13A */,/*49243*/27279/* 1F13B */,/*49244*/27280/* 1F13C */, /*49245*/27281/* 1F13D */,/*49246*/27282/* 1F13E */,/*49247*/27283/* 1F13F */,/*49248*/27284/* 1F140 */, /*49249*/27285/* 1F141 */,/*49250*/27286/* 1F142 */,/*49251*/27287/* 1F143 */,/*49252*/27288/* 1F144 */, /*49253*/27289/* 1F145 */,/*49254*/27290/* 1F146 */,/*49255*/27291/* 1F147 */,/*49256*/27292/* 1F148 */, /*49257*/27293/* 1F149 */,/*49258*/27294/* 1F14A */,/*49259*/27295/* 1F14B */,/*49260*/27296/* 1F14C */, /*49261*/27297/* 1F14D */,/*49262*/27298/* 1F14E */,/*49263*/27299/* 1F14F */,/*49264*/27300/* 1F150 */, /*49265*/27301/* 1F151 */,/*49266*/27302/* 1F152 */,/*49267*/27303/* 1F153 */,/*49268*/27304/* 1F154 */, /*49269*/27305/* 1F155 */,/*49270*/27306/* 1F156 */,/*49271*/27307/* 1F157 */,/*49272*/27308/* 1F158 */, /*49273*/27309/* 1F159 */,/*49274*/27310/* 1F15A */,/*49275*/27311/* 1F15B */,/*49276*/27312/* 1F15C */, /*49277*/27313/* 1F15D */,/*49278*/27314/* 1F15E */,/*49279*/27315/* 1F15F */,/*49280*/27316/* 1F160 */, /*49281*/27317/* 1F161 */,/*49282*/27318/* 1F162 */,/*49283*/27319/* 1F163 */,/*49284*/27320/* 1F164 */, /*49285*/27321/* 1F165 */,/*49286*/27322/* 1F166 */,/*49287*/27323/* 1F167 */,/*49288*/27324/* 1F168 */, /*49289*/27325/* 1F169 */,/*49290*/27326/* 1F16A */,/*49291*/27327/* 1F16B */,0,0,0,0,/*49296*/27328/* 1F170 */, /*49297*/27329/* 1F171 */,/*49298*/27330/* 1F172 */,/*49299*/27331/* 1F173 */,/*49300*/27332/* 1F174 */, /*49301*/27333/* 1F175 */,/*49302*/27334/* 1F176 */,/*49303*/27335/* 1F177 */,/*49304*/27336/* 1F178 */, /*49305*/27337/* 1F179 */,/*49306*/27338/* 1F17A */,/*49307*/27339/* 1F17B */,/*49308*/27340/* 1F17C */, /*49309*/27341/* 1F17D */,/*49310*/27342/* 1F17E */,/*49311*/27343/* 1F17F */,/*49312*/27344/* 1F180 */, /*49313*/27345/* 1F181 */,/*49314*/27346/* 1F182 */,/*49315*/27347/* 1F183 */,/*49316*/27348/* 1F184 */, /*49317*/27349/* 1F185 */,/*49318*/27350/* 1F186 */,/*49319*/27351/* 1F187 */,/*49320*/27352/* 1F188 */, /*49321*/27353/* 1F189 */,/*49322*/27354/* 1F18A */,/*49323*/27355/* 1F18B */,/*49324*/27356/* 1F18C */, /*49325*/27357/* 1F18D */,/*49326*/27358/* 1F18E */,/*49327*/27359/* 1F18F */,/*49328*/27360/* 1F190 */, /*49329*/27361/* 1F191 */,/*49330*/27362/* 1F192 */,/*49331*/27363/* 1F193 */,/*49332*/27364/* 1F194 */, /*49333*/27365/* 1F195 */,/*49334*/27366/* 1F196 */,/*49335*/27367/* 1F197 */,/*49336*/27368/* 1F198 */, /*49337*/27369/* 1F199 */,/*49338*/27370/* 1F19A */,/*49339*/27371/* 1F19B */,/*49340*/27372/* 1F19C */, /*49341*/27373/* 1F19D */,/*49342*/27374/* 1F19E */,/*49343*/27375/* 1F19F */,/*49344*/27376/* 1F1A0 */, /*49345*/27377/* 1F1A1 */,/*49346*/27378/* 1F1A2 */,/*49347*/27379/* 1F1A3 */,/*49348*/27380/* 1F1A4 */, /*49349*/27381/* 1F1A5 */,/*49350*/27382/* 1F1A6 */,/*49351*/27383/* 1F1A7 */,/*49352*/27384/* 1F1A8 */, /*49353*/27385/* 1F1A9 */,/*49354*/27386/* 1F1AA */,/*49355*/27387/* 1F1AB */,/*49356*/27388/* 1F1AC */,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*49414*/27389/* 1F1E6 */,/*49415*/27390/* 1F1E7 */,/*49416*/27391/* 1F1E8 */,/*49417*/27392/* 1F1E9 */, /*49418*/27393/* 1F1EA */,/*49419*/27394/* 1F1EB */,/*49420*/27395/* 1F1EC */,/*49421*/27396/* 1F1ED */, /*49422*/27397/* 1F1EE */,/*49423*/27398/* 1F1EF */,/*49424*/27399/* 1F1F0 */,/*49425*/27400/* 1F1F1 */, /*49426*/27401/* 1F1F2 */,/*49427*/27402/* 1F1F3 */,/*49428*/27403/* 1F1F4 */,/*49429*/27404/* 1F1F5 */, /*49430*/27405/* 1F1F6 */,/*49431*/27406/* 1F1F7 */,/*49432*/27407/* 1F1F8 */,/*49433*/27408/* 1F1F9 */, /*49434*/27409/* 1F1FA */,/*49435*/27410/* 1F1FB */,/*49436*/27411/* 1F1FC */,/*49437*/27412/* 1F1FD */, /*49438*/27413/* 1F1FE */,/*49439*/27414/* 1F1FF */,/*49440*/27415/* 1F200 */,/*49441*/27416/* 1F201 */, /*49442*/27417/* 1F202 */,0,0,0,0,0,0,0,0,0,0,0,0,0,/*49456*/27418/* 1F210 */,/*49457*/27419/* 1F211 */, /*49458*/27420/* 1F212 */,/*49459*/27421/* 1F213 */,/*49460*/27422/* 1F214 */,/*49461*/27423/* 1F215 */, /*49462*/27424/* 1F216 */,/*49463*/27425/* 1F217 */,/*49464*/27426/* 1F218 */,/*49465*/27427/* 1F219 */, /*49466*/27428/* 1F21A */,/*49467*/27429/* 1F21B */,/*49468*/27430/* 1F21C */,/*49469*/27431/* 1F21D */, /*49470*/27432/* 1F21E */,/*49471*/27433/* 1F21F */,/*49472*/27434/* 1F220 */,/*49473*/27435/* 1F221 */, /*49474*/27436/* 1F222 */,/*49475*/27437/* 1F223 */,/*49476*/27438/* 1F224 */,/*49477*/27439/* 1F225 */, /*49478*/27440/* 1F226 */,/*49479*/27441/* 1F227 */,/*49480*/27442/* 1F228 */,/*49481*/27443/* 1F229 */, /*49482*/27444/* 1F22A */,/*49483*/27445/* 1F22B */,/*49484*/27446/* 1F22C */,/*49485*/27447/* 1F22D */, /*49486*/27448/* 1F22E */,/*49487*/27449/* 1F22F */,/*49488*/27450/* 1F230 */,/*49489*/27451/* 1F231 */, /*49490*/27452/* 1F232 */,/*49491*/27453/* 1F233 */,/*49492*/27454/* 1F234 */,/*49493*/27455/* 1F235 */, /*49494*/27456/* 1F236 */,/*49495*/27457/* 1F237 */,/*49496*/27458/* 1F238 */,/*49497*/27459/* 1F239 */, /*49498*/27460/* 1F23A */,/*49499*/27461/* 1F23B */,0,0,0,0,/*49504*/27462/* 1F240 */,/*49505*/27463/* 1F241 */, /*49506*/27464/* 1F242 */,/*49507*/27465/* 1F243 */,/*49508*/27466/* 1F244 */,/*49509*/27467/* 1F245 */, /*49510*/27468/* 1F246 */,/*49511*/27469/* 1F247 */,/*49512*/27470/* 1F248 */,0,0,0,0,0,0,0,/*49520*/27471/* 1F250 */, /*49521*/27472/* 1F251 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*49536*/27473/* 1F260 */,/*49537*/27474/* 1F261 */, /*49538*/27475/* 1F262 */,/*49539*/27476/* 1F263 */,/*49540*/27477/* 1F264 */,/*49541*/27478/* 1F265 */,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*49696*/27479/* 1F300 */,/*49697*/27480/* 1F301 */, /*49698*/27481/* 1F302 */,/*49699*/27482/* 1F303 */,/*49700*/27483/* 1F304 */,/*49701*/27484/* 1F305 */, /*49702*/27485/* 1F306 */,/*49703*/27486/* 1F307 */,/*49704*/27487/* 1F308 */,/*49705*/27488/* 1F309 */, /*49706*/27489/* 1F30A */,/*49707*/27490/* 1F30B */,/*49708*/27491/* 1F30C */,/*49709*/27492/* 1F30D */, /*49710*/27493/* 1F30E */,/*49711*/27494/* 1F30F */,/*49712*/27495/* 1F310 */,/*49713*/27496/* 1F311 */, /*49714*/27497/* 1F312 */,/*49715*/27498/* 1F313 */,/*49716*/27499/* 1F314 */,/*49717*/27500/* 1F315 */, /*49718*/27501/* 1F316 */,/*49719*/27502/* 1F317 */,/*49720*/27503/* 1F318 */,/*49721*/27504/* 1F319 */, /*49722*/27505/* 1F31A */,/*49723*/27506/* 1F31B */,/*49724*/27507/* 1F31C */,/*49725*/27508/* 1F31D */, /*49726*/27509/* 1F31E */,/*49727*/27510/* 1F31F */,/*49728*/27511/* 1F320 */,/*49729*/27512/* 1F321 */, /*49730*/27513/* 1F322 */,/*49731*/27514/* 1F323 */,/*49732*/27515/* 1F324 */,/*49733*/27516/* 1F325 */, /*49734*/27517/* 1F326 */,/*49735*/27518/* 1F327 */,/*49736*/27519/* 1F328 */,/*49737*/27520/* 1F329 */, /*49738*/27521/* 1F32A */,/*49739*/27522/* 1F32B */,/*49740*/27523/* 1F32C */,/*49741*/27524/* 1F32D */, /*49742*/27525/* 1F32E */,/*49743*/27526/* 1F32F */,/*49744*/27527/* 1F330 */,/*49745*/27528/* 1F331 */, /*49746*/27529/* 1F332 */,/*49747*/27530/* 1F333 */,/*49748*/27531/* 1F334 */,/*49749*/27532/* 1F335 */, /*49750*/27533/* 1F336 */,/*49751*/27534/* 1F337 */,/*49752*/27535/* 1F338 */,/*49753*/27536/* 1F339 */, /*49754*/27537/* 1F33A */,/*49755*/27538/* 1F33B */,/*49756*/27539/* 1F33C */,/*49757*/27540/* 1F33D */, /*49758*/27541/* 1F33E */,/*49759*/27542/* 1F33F */,/*49760*/27543/* 1F340 */,/*49761*/27544/* 1F341 */, /*49762*/27545/* 1F342 */,/*49763*/27546/* 1F343 */,/*49764*/27547/* 1F344 */,/*49765*/27548/* 1F345 */, /*49766*/27549/* 1F346 */,/*49767*/27550/* 1F347 */,/*49768*/27551/* 1F348 */,/*49769*/27552/* 1F349 */, /*49770*/27553/* 1F34A */,/*49771*/27554/* 1F34B */,/*49772*/27555/* 1F34C */,/*49773*/27556/* 1F34D */, /*49774*/27557/* 1F34E */,/*49775*/27558/* 1F34F */,/*49776*/27559/* 1F350 */,/*49777*/27560/* 1F351 */, /*49778*/27561/* 1F352 */,/*49779*/27562/* 1F353 */,/*49780*/27563/* 1F354 */,/*49781*/27564/* 1F355 */, /*49782*/27565/* 1F356 */,/*49783*/27566/* 1F357 */,/*49784*/27567/* 1F358 */,/*49785*/27568/* 1F359 */, /*49786*/27569/* 1F35A */,/*49787*/27570/* 1F35B */,/*49788*/27571/* 1F35C */,/*49789*/27572/* 1F35D */, /*49790*/27573/* 1F35E */,/*49791*/27574/* 1F35F */,/*49792*/27575/* 1F360 */,/*49793*/27576/* 1F361 */, /*49794*/27577/* 1F362 */,/*49795*/27578/* 1F363 */,/*49796*/27579/* 1F364 */,/*49797*/27580/* 1F365 */, /*49798*/27581/* 1F366 */,/*49799*/27582/* 1F367 */,/*49800*/27583/* 1F368 */,/*49801*/27584/* 1F369 */, /*49802*/27585/* 1F36A */,/*49803*/27586/* 1F36B */,/*49804*/27587/* 1F36C */,/*49805*/27588/* 1F36D */, /*49806*/27589/* 1F36E */,/*49807*/27590/* 1F36F */,/*49808*/27591/* 1F370 */,/*49809*/27592/* 1F371 */, /*49810*/27593/* 1F372 */,/*49811*/27594/* 1F373 */,/*49812*/27595/* 1F374 */,/*49813*/27596/* 1F375 */, /*49814*/27597/* 1F376 */,/*49815*/27598/* 1F377 */,/*49816*/27599/* 1F378 */,/*49817*/27600/* 1F379 */, /*49818*/27601/* 1F37A */,/*49819*/27602/* 1F37B */,/*49820*/27603/* 1F37C */,/*49821*/27604/* 1F37D */, /*49822*/27605/* 1F37E */,/*49823*/27606/* 1F37F */,/*49824*/27607/* 1F380 */,/*49825*/27608/* 1F381 */, /*49826*/27609/* 1F382 */,/*49827*/27610/* 1F383 */,/*49828*/27611/* 1F384 */,/*49829*/27612/* 1F385 */, /*49830*/27613/* 1F386 */,/*49831*/27614/* 1F387 */,/*49832*/27615/* 1F388 */,/*49833*/27616/* 1F389 */, /*49834*/27617/* 1F38A */,/*49835*/27618/* 1F38B */,/*49836*/27619/* 1F38C */,/*49837*/27620/* 1F38D */, /*49838*/27621/* 1F38E */,/*49839*/27622/* 1F38F */,/*49840*/27623/* 1F390 */,/*49841*/27624/* 1F391 */, /*49842*/27625/* 1F392 */,/*49843*/27626/* 1F393 */,/*49844*/27627/* 1F394 */,/*49845*/27628/* 1F395 */, /*49846*/27629/* 1F396 */,/*49847*/27630/* 1F397 */,/*49848*/27631/* 1F398 */,/*49849*/27632/* 1F399 */, /*49850*/27633/* 1F39A */,/*49851*/27634/* 1F39B */,/*49852*/27635/* 1F39C */,/*49853*/27636/* 1F39D */, /*49854*/27637/* 1F39E */,/*49855*/27638/* 1F39F */,/*49856*/27639/* 1F3A0 */,/*49857*/27640/* 1F3A1 */, /*49858*/27641/* 1F3A2 */,/*49859*/27642/* 1F3A3 */,/*49860*/27643/* 1F3A4 */,/*49861*/27644/* 1F3A5 */, /*49862*/27645/* 1F3A6 */,/*49863*/27646/* 1F3A7 */,/*49864*/27647/* 1F3A8 */,/*49865*/27648/* 1F3A9 */, /*49866*/27649/* 1F3AA */,/*49867*/27650/* 1F3AB */,/*49868*/27651/* 1F3AC */,/*49869*/27652/* 1F3AD */, /*49870*/27653/* 1F3AE */,/*49871*/27654/* 1F3AF */,/*49872*/27655/* 1F3B0 */,/*49873*/27656/* 1F3B1 */, /*49874*/27657/* 1F3B2 */,/*49875*/27658/* 1F3B3 */,/*49876*/27659/* 1F3B4 */,/*49877*/27660/* 1F3B5 */, /*49878*/27661/* 1F3B6 */,/*49879*/27662/* 1F3B7 */,/*49880*/27663/* 1F3B8 */,/*49881*/27664/* 1F3B9 */, /*49882*/27665/* 1F3BA */,/*49883*/27666/* 1F3BB */,/*49884*/27667/* 1F3BC */,/*49885*/27668/* 1F3BD */, /*49886*/27669/* 1F3BE */,/*49887*/27670/* 1F3BF */,/*49888*/27671/* 1F3C0 */,/*49889*/27672/* 1F3C1 */, /*49890*/27673/* 1F3C2 */,/*49891*/27674/* 1F3C3 */,/*49892*/27675/* 1F3C4 */,/*49893*/27676/* 1F3C5 */, /*49894*/27677/* 1F3C6 */,/*49895*/27678/* 1F3C7 */,/*49896*/27679/* 1F3C8 */,/*49897*/27680/* 1F3C9 */, /*49898*/27681/* 1F3CA */,/*49899*/27682/* 1F3CB */,/*49900*/27683/* 1F3CC */,/*49901*/27684/* 1F3CD */, /*49902*/27685/* 1F3CE */,/*49903*/27686/* 1F3CF */,/*49904*/27687/* 1F3D0 */,/*49905*/27688/* 1F3D1 */, /*49906*/27689/* 1F3D2 */,/*49907*/27690/* 1F3D3 */,/*49908*/27691/* 1F3D4 */,/*49909*/27692/* 1F3D5 */, /*49910*/27693/* 1F3D6 */,/*49911*/27694/* 1F3D7 */,/*49912*/27695/* 1F3D8 */,/*49913*/27696/* 1F3D9 */, /*49914*/27697/* 1F3DA */,/*49915*/27698/* 1F3DB */,/*49916*/27699/* 1F3DC */,/*49917*/27700/* 1F3DD */, /*49918*/27701/* 1F3DE */,/*49919*/27702/* 1F3DF */,/*49920*/27703/* 1F3E0 */,/*49921*/27704/* 1F3E1 */, /*49922*/27705/* 1F3E2 */,/*49923*/27706/* 1F3E3 */,/*49924*/27707/* 1F3E4 */,/*49925*/27708/* 1F3E5 */, /*49926*/27709/* 1F3E6 */,/*49927*/27710/* 1F3E7 */,/*49928*/27711/* 1F3E8 */,/*49929*/27712/* 1F3E9 */, /*49930*/27713/* 1F3EA */,/*49931*/27714/* 1F3EB */,/*49932*/27715/* 1F3EC */,/*49933*/27716/* 1F3ED */, /*49934*/27717/* 1F3EE */,/*49935*/27718/* 1F3EF */,/*49936*/27719/* 1F3F0 */,/*49937*/27720/* 1F3F1 */, /*49938*/27721/* 1F3F2 */,/*49939*/27722/* 1F3F3 */,/*49940*/27723/* 1F3F4 */,/*49941*/27724/* 1F3F5 */, /*49942*/27725/* 1F3F6 */,/*49943*/27726/* 1F3F7 */,/*49944*/27727/* 1F3F8 */,/*49945*/27728/* 1F3F9 */, /*49946*/27729/* 1F3FA */,/*49947*/27730/* 1F3FB */,/*49948*/27731/* 1F3FC */,/*49949*/27732/* 1F3FD */, /*49950*/27733/* 1F3FE */,/*49951*/27734/* 1F3FF */,/*49952*/27735/* 1F400 */,/*49953*/27736/* 1F401 */, /*49954*/27737/* 1F402 */,/*49955*/27738/* 1F403 */,/*49956*/27739/* 1F404 */,/*49957*/27740/* 1F405 */, /*49958*/27741/* 1F406 */,/*49959*/27742/* 1F407 */,/*49960*/27743/* 1F408 */,/*49961*/27744/* 1F409 */, /*49962*/27745/* 1F40A */,/*49963*/27746/* 1F40B */,/*49964*/27747/* 1F40C */,/*49965*/27748/* 1F40D */, /*49966*/27749/* 1F40E */,/*49967*/27750/* 1F40F */,/*49968*/27751/* 1F410 */,/*49969*/27752/* 1F411 */, /*49970*/27753/* 1F412 */,/*49971*/27754/* 1F413 */,/*49972*/27755/* 1F414 */,/*49973*/27756/* 1F415 */, /*49974*/27757/* 1F416 */,/*49975*/27758/* 1F417 */,/*49976*/27759/* 1F418 */,/*49977*/27760/* 1F419 */, /*49978*/27761/* 1F41A */,/*49979*/27762/* 1F41B */,/*49980*/27763/* 1F41C */,/*49981*/27764/* 1F41D */, /*49982*/27765/* 1F41E */,/*49983*/27766/* 1F41F */,/*49984*/27767/* 1F420 */,/*49985*/27768/* 1F421 */, /*49986*/27769/* 1F422 */,/*49987*/27770/* 1F423 */,/*49988*/27771/* 1F424 */,/*49989*/27772/* 1F425 */, /*49990*/27773/* 1F426 */,/*49991*/27774/* 1F427 */,/*49992*/27775/* 1F428 */,/*49993*/27776/* 1F429 */, /*49994*/27777/* 1F42A */,/*49995*/27778/* 1F42B */,/*49996*/27779/* 1F42C */,/*49997*/27780/* 1F42D */, /*49998*/27781/* 1F42E */,/*49999*/27782/* 1F42F */,/*50000*/27783/* 1F430 */,/*50001*/27784/* 1F431 */, /*50002*/27785/* 1F432 */,/*50003*/27786/* 1F433 */,/*50004*/27787/* 1F434 */,/*50005*/27788/* 1F435 */, /*50006*/27789/* 1F436 */,/*50007*/27790/* 1F437 */,/*50008*/27791/* 1F438 */,/*50009*/27792/* 1F439 */, /*50010*/27793/* 1F43A */,/*50011*/27794/* 1F43B */,/*50012*/27795/* 1F43C */,/*50013*/27796/* 1F43D */, /*50014*/27797/* 1F43E */,/*50015*/27798/* 1F43F */,/*50016*/27799/* 1F440 */,/*50017*/27800/* 1F441 */, /*50018*/27801/* 1F442 */,/*50019*/27802/* 1F443 */,/*50020*/27803/* 1F444 */,/*50021*/27804/* 1F445 */, /*50022*/27805/* 1F446 */,/*50023*/27806/* 1F447 */,/*50024*/27807/* 1F448 */,/*50025*/27808/* 1F449 */, /*50026*/27809/* 1F44A */,/*50027*/27810/* 1F44B */,/*50028*/27811/* 1F44C */,/*50029*/27812/* 1F44D */, /*50030*/27813/* 1F44E */,/*50031*/27814/* 1F44F */,/*50032*/27815/* 1F450 */,/*50033*/27816/* 1F451 */, /*50034*/27817/* 1F452 */,/*50035*/27818/* 1F453 */,/*50036*/27819/* 1F454 */,/*50037*/27820/* 1F455 */, /*50038*/27821/* 1F456 */,/*50039*/27822/* 1F457 */,/*50040*/27823/* 1F458 */,/*50041*/27824/* 1F459 */, /*50042*/27825/* 1F45A */,/*50043*/27826/* 1F45B */,/*50044*/27827/* 1F45C */,/*50045*/27828/* 1F45D */, /*50046*/27829/* 1F45E */,/*50047*/27830/* 1F45F */,/*50048*/27831/* 1F460 */,/*50049*/27832/* 1F461 */, /*50050*/27833/* 1F462 */,/*50051*/27834/* 1F463 */,/*50052*/27835/* 1F464 */,/*50053*/27836/* 1F465 */, /*50054*/27837/* 1F466 */,/*50055*/27838/* 1F467 */,/*50056*/27839/* 1F468 */,/*50057*/27840/* 1F469 */, /*50058*/27841/* 1F46A */,/*50059*/27842/* 1F46B */,/*50060*/27843/* 1F46C */,/*50061*/27844/* 1F46D */, /*50062*/27845/* 1F46E */,/*50063*/27846/* 1F46F */,/*50064*/27847/* 1F470 */,/*50065*/27848/* 1F471 */, /*50066*/27849/* 1F472 */,/*50067*/27850/* 1F473 */,/*50068*/27851/* 1F474 */,/*50069*/27852/* 1F475 */, /*50070*/27853/* 1F476 */,/*50071*/27854/* 1F477 */,/*50072*/27855/* 1F478 */,/*50073*/27856/* 1F479 */, /*50074*/27857/* 1F47A */,/*50075*/27858/* 1F47B */,/*50076*/27859/* 1F47C */,/*50077*/27860/* 1F47D */, /*50078*/27861/* 1F47E */,/*50079*/27862/* 1F47F */,/*50080*/27863/* 1F480 */,/*50081*/27864/* 1F481 */, /*50082*/27865/* 1F482 */,/*50083*/27866/* 1F483 */,/*50084*/27867/* 1F484 */,/*50085*/27868/* 1F485 */, /*50086*/27869/* 1F486 */,/*50087*/27870/* 1F487 */,/*50088*/27871/* 1F488 */,/*50089*/27872/* 1F489 */, /*50090*/27873/* 1F48A */,/*50091*/27874/* 1F48B */,/*50092*/27875/* 1F48C */,/*50093*/27876/* 1F48D */, /*50094*/27877/* 1F48E */,/*50095*/27878/* 1F48F */,/*50096*/27879/* 1F490 */,/*50097*/27880/* 1F491 */, /*50098*/27881/* 1F492 */,/*50099*/27882/* 1F493 */,/*50100*/27883/* 1F494 */,/*50101*/27884/* 1F495 */, /*50102*/27885/* 1F496 */,/*50103*/27886/* 1F497 */,/*50104*/27887/* 1F498 */,/*50105*/27888/* 1F499 */, /*50106*/27889/* 1F49A */,/*50107*/27890/* 1F49B */,/*50108*/27891/* 1F49C */,/*50109*/27892/* 1F49D */, /*50110*/27893/* 1F49E */,/*50111*/27894/* 1F49F */,/*50112*/27895/* 1F4A0 */,/*50113*/27896/* 1F4A1 */, /*50114*/27897/* 1F4A2 */,/*50115*/27898/* 1F4A3 */,/*50116*/27899/* 1F4A4 */,/*50117*/27900/* 1F4A5 */, /*50118*/27901/* 1F4A6 */,/*50119*/27902/* 1F4A7 */,/*50120*/27903/* 1F4A8 */,/*50121*/27904/* 1F4A9 */, /*50122*/27905/* 1F4AA */,/*50123*/27906/* 1F4AB */,/*50124*/27907/* 1F4AC */,/*50125*/27908/* 1F4AD */, /*50126*/27909/* 1F4AE */,/*50127*/27910/* 1F4AF */,/*50128*/27911/* 1F4B0 */,/*50129*/27912/* 1F4B1 */, /*50130*/27913/* 1F4B2 */,/*50131*/27914/* 1F4B3 */,/*50132*/27915/* 1F4B4 */,/*50133*/27916/* 1F4B5 */, /*50134*/27917/* 1F4B6 */,/*50135*/27918/* 1F4B7 */,/*50136*/27919/* 1F4B8 */,/*50137*/27920/* 1F4B9 */, /*50138*/27921/* 1F4BA */,/*50139*/27922/* 1F4BB */,/*50140*/27923/* 1F4BC */,/*50141*/27924/* 1F4BD */, /*50142*/27925/* 1F4BE */,/*50143*/27926/* 1F4BF */,/*50144*/27927/* 1F4C0 */,/*50145*/27928/* 1F4C1 */, /*50146*/27929/* 1F4C2 */,/*50147*/27930/* 1F4C3 */,/*50148*/27931/* 1F4C4 */,/*50149*/27932/* 1F4C5 */, /*50150*/27933/* 1F4C6 */,/*50151*/27934/* 1F4C7 */,/*50152*/27935/* 1F4C8 */,/*50153*/27936/* 1F4C9 */, /*50154*/27937/* 1F4CA */,/*50155*/27938/* 1F4CB */,/*50156*/27939/* 1F4CC */,/*50157*/27940/* 1F4CD */, /*50158*/27941/* 1F4CE */,/*50159*/27942/* 1F4CF */,/*50160*/27943/* 1F4D0 */,/*50161*/27944/* 1F4D1 */, /*50162*/27945/* 1F4D2 */,/*50163*/27946/* 1F4D3 */,/*50164*/27947/* 1F4D4 */,/*50165*/27948/* 1F4D5 */, /*50166*/27949/* 1F4D6 */,/*50167*/27950/* 1F4D7 */,/*50168*/27951/* 1F4D8 */,/*50169*/27952/* 1F4D9 */, /*50170*/27953/* 1F4DA */,/*50171*/27954/* 1F4DB */,/*50172*/27955/* 1F4DC */,/*50173*/27956/* 1F4DD */, /*50174*/27957/* 1F4DE */,/*50175*/27958/* 1F4DF */,/*50176*/27959/* 1F4E0 */,/*50177*/27960/* 1F4E1 */, /*50178*/27961/* 1F4E2 */,/*50179*/27962/* 1F4E3 */,/*50180*/27963/* 1F4E4 */,/*50181*/27964/* 1F4E5 */, /*50182*/27965/* 1F4E6 */,/*50183*/27966/* 1F4E7 */,/*50184*/27967/* 1F4E8 */,/*50185*/27968/* 1F4E9 */, /*50186*/27969/* 1F4EA */,/*50187*/27970/* 1F4EB */,/*50188*/27971/* 1F4EC */,/*50189*/27972/* 1F4ED */, /*50190*/27973/* 1F4EE */,/*50191*/27974/* 1F4EF */,/*50192*/27975/* 1F4F0 */,/*50193*/27976/* 1F4F1 */, /*50194*/27977/* 1F4F2 */,/*50195*/27978/* 1F4F3 */,/*50196*/27979/* 1F4F4 */,/*50197*/27980/* 1F4F5 */, /*50198*/27981/* 1F4F6 */,/*50199*/27982/* 1F4F7 */,/*50200*/27983/* 1F4F8 */,/*50201*/27984/* 1F4F9 */, /*50202*/27985/* 1F4FA */,/*50203*/27986/* 1F4FB */,/*50204*/27987/* 1F4FC */,/*50205*/27988/* 1F4FD */, /*50206*/27989/* 1F4FE */,/*50207*/27990/* 1F4FF */,/*50208*/27991/* 1F500 */,/*50209*/27992/* 1F501 */, /*50210*/27993/* 1F502 */,/*50211*/27994/* 1F503 */,/*50212*/27995/* 1F504 */,/*50213*/27996/* 1F505 */, /*50214*/27997/* 1F506 */,/*50215*/27998/* 1F507 */,/*50216*/27999/* 1F508 */,/*50217*/28000/* 1F509 */, /*50218*/28001/* 1F50A */,/*50219*/28002/* 1F50B */,/*50220*/28003/* 1F50C */,/*50221*/28004/* 1F50D */, /*50222*/28005/* 1F50E */,/*50223*/28006/* 1F50F */,/*50224*/28007/* 1F510 */,/*50225*/28008/* 1F511 */, /*50226*/28009/* 1F512 */,/*50227*/28010/* 1F513 */,/*50228*/28011/* 1F514 */,/*50229*/28012/* 1F515 */, /*50230*/28013/* 1F516 */,/*50231*/28014/* 1F517 */,/*50232*/28015/* 1F518 */,/*50233*/28016/* 1F519 */, /*50234*/28017/* 1F51A */,/*50235*/28018/* 1F51B */,/*50236*/28019/* 1F51C */,/*50237*/28020/* 1F51D */, /*50238*/28021/* 1F51E */,/*50239*/28022/* 1F51F */,/*50240*/28023/* 1F520 */,/*50241*/28024/* 1F521 */, /*50242*/28025/* 1F522 */,/*50243*/28026/* 1F523 */,/*50244*/28027/* 1F524 */,/*50245*/28028/* 1F525 */, /*50246*/28029/* 1F526 */,/*50247*/28030/* 1F527 */,/*50248*/28031/* 1F528 */,/*50249*/28032/* 1F529 */, /*50250*/28033/* 1F52A */,/*50251*/28034/* 1F52B */,/*50252*/28035/* 1F52C */,/*50253*/28036/* 1F52D */, /*50254*/28037/* 1F52E */,/*50255*/28038/* 1F52F */,/*50256*/28039/* 1F530 */,/*50257*/28040/* 1F531 */, /*50258*/28041/* 1F532 */,/*50259*/28042/* 1F533 */,/*50260*/28043/* 1F534 */,/*50261*/28044/* 1F535 */, /*50262*/28045/* 1F536 */,/*50263*/28046/* 1F537 */,/*50264*/28047/* 1F538 */,/*50265*/28048/* 1F539 */, /*50266*/28049/* 1F53A */,/*50267*/28050/* 1F53B */,/*50268*/28051/* 1F53C */,/*50269*/28052/* 1F53D */, /*50270*/28053/* 1F53E */,/*50271*/28054/* 1F53F */,/*50272*/28055/* 1F540 */,/*50273*/28056/* 1F541 */, /*50274*/28057/* 1F542 */,/*50275*/28058/* 1F543 */,/*50276*/28059/* 1F544 */,/*50277*/28060/* 1F545 */, /*50278*/28061/* 1F546 */,/*50279*/28062/* 1F547 */,/*50280*/28063/* 1F548 */,/*50281*/28064/* 1F549 */, /*50282*/28065/* 1F54A */,/*50283*/28066/* 1F54B */,/*50284*/28067/* 1F54C */,/*50285*/28068/* 1F54D */, /*50286*/28069/* 1F54E */,/*50287*/28070/* 1F54F */,/*50288*/28071/* 1F550 */,/*50289*/28072/* 1F551 */, /*50290*/28073/* 1F552 */,/*50291*/28074/* 1F553 */,/*50292*/28075/* 1F554 */,/*50293*/28076/* 1F555 */, /*50294*/28077/* 1F556 */,/*50295*/28078/* 1F557 */,/*50296*/28079/* 1F558 */,/*50297*/28080/* 1F559 */, /*50298*/28081/* 1F55A */,/*50299*/28082/* 1F55B */,/*50300*/28083/* 1F55C */,/*50301*/28084/* 1F55D */, /*50302*/28085/* 1F55E */,/*50303*/28086/* 1F55F */,/*50304*/28087/* 1F560 */,/*50305*/28088/* 1F561 */, /*50306*/28089/* 1F562 */,/*50307*/28090/* 1F563 */,/*50308*/28091/* 1F564 */,/*50309*/28092/* 1F565 */, /*50310*/28093/* 1F566 */,/*50311*/28094/* 1F567 */,/*50312*/28095/* 1F568 */,/*50313*/28096/* 1F569 */, /*50314*/28097/* 1F56A */,/*50315*/28098/* 1F56B */,/*50316*/28099/* 1F56C */,/*50317*/28100/* 1F56D */, /*50318*/28101/* 1F56E */,/*50319*/28102/* 1F56F */,/*50320*/28103/* 1F570 */,/*50321*/28104/* 1F571 */, /*50322*/28105/* 1F572 */,/*50323*/28106/* 1F573 */,/*50324*/28107/* 1F574 */,/*50325*/28108/* 1F575 */, /*50326*/28109/* 1F576 */,/*50327*/28110/* 1F577 */,/*50328*/28111/* 1F578 */,/*50329*/28112/* 1F579 */, /*50330*/28113/* 1F57A */,/*50331*/28114/* 1F57B */,/*50332*/28115/* 1F57C */,/*50333*/28116/* 1F57D */, /*50334*/28117/* 1F57E */,/*50335*/28118/* 1F57F */,/*50336*/28119/* 1F580 */,/*50337*/28120/* 1F581 */, /*50338*/28121/* 1F582 */,/*50339*/28122/* 1F583 */,/*50340*/28123/* 1F584 */,/*50341*/28124/* 1F585 */, /*50342*/28125/* 1F586 */,/*50343*/28126/* 1F587 */,/*50344*/28127/* 1F588 */,/*50345*/28128/* 1F589 */, /*50346*/28129/* 1F58A */,/*50347*/28130/* 1F58B */,/*50348*/28131/* 1F58C */,/*50349*/28132/* 1F58D */, /*50350*/28133/* 1F58E */,/*50351*/28134/* 1F58F */,/*50352*/28135/* 1F590 */,/*50353*/28136/* 1F591 */, /*50354*/28137/* 1F592 */,/*50355*/28138/* 1F593 */,/*50356*/28139/* 1F594 */,/*50357*/28140/* 1F595 */, /*50358*/28141/* 1F596 */,/*50359*/28142/* 1F597 */,/*50360*/28143/* 1F598 */,/*50361*/28144/* 1F599 */, /*50362*/28145/* 1F59A */,/*50363*/28146/* 1F59B */,/*50364*/28147/* 1F59C */,/*50365*/28148/* 1F59D */, /*50366*/28149/* 1F59E */,/*50367*/28150/* 1F59F */,/*50368*/28151/* 1F5A0 */,/*50369*/28152/* 1F5A1 */, /*50370*/28153/* 1F5A2 */,/*50371*/28154/* 1F5A3 */,/*50372*/28155/* 1F5A4 */,/*50373*/28156/* 1F5A5 */, /*50374*/28157/* 1F5A6 */,/*50375*/28158/* 1F5A7 */,/*50376*/28159/* 1F5A8 */,/*50377*/28160/* 1F5A9 */, /*50378*/28161/* 1F5AA */,/*50379*/28162/* 1F5AB */,/*50380*/28163/* 1F5AC */,/*50381*/28164/* 1F5AD */, /*50382*/28165/* 1F5AE */,/*50383*/28166/* 1F5AF */,/*50384*/28167/* 1F5B0 */,/*50385*/28168/* 1F5B1 */, /*50386*/28169/* 1F5B2 */,/*50387*/28170/* 1F5B3 */,/*50388*/28171/* 1F5B4 */,/*50389*/28172/* 1F5B5 */, /*50390*/28173/* 1F5B6 */,/*50391*/28174/* 1F5B7 */,/*50392*/28175/* 1F5B8 */,/*50393*/28176/* 1F5B9 */, /*50394*/28177/* 1F5BA */,/*50395*/28178/* 1F5BB */,/*50396*/28179/* 1F5BC */,/*50397*/28180/* 1F5BD */, /*50398*/28181/* 1F5BE */,/*50399*/28182/* 1F5BF */,/*50400*/28183/* 1F5C0 */,/*50401*/28184/* 1F5C1 */, /*50402*/28185/* 1F5C2 */,/*50403*/28186/* 1F5C3 */,/*50404*/28187/* 1F5C4 */,/*50405*/28188/* 1F5C5 */, /*50406*/28189/* 1F5C6 */,/*50407*/28190/* 1F5C7 */,/*50408*/28191/* 1F5C8 */,/*50409*/28192/* 1F5C9 */, /*50410*/28193/* 1F5CA */,/*50411*/28194/* 1F5CB */,/*50412*/28195/* 1F5CC */,/*50413*/28196/* 1F5CD */, /*50414*/28197/* 1F5CE */,/*50415*/28198/* 1F5CF */,/*50416*/28199/* 1F5D0 */,/*50417*/28200/* 1F5D1 */, /*50418*/28201/* 1F5D2 */,/*50419*/28202/* 1F5D3 */,/*50420*/28203/* 1F5D4 */,/*50421*/28204/* 1F5D5 */, /*50422*/28205/* 1F5D6 */,/*50423*/28206/* 1F5D7 */,/*50424*/28207/* 1F5D8 */,/*50425*/28208/* 1F5D9 */, /*50426*/28209/* 1F5DA */,/*50427*/28210/* 1F5DB */,/*50428*/28211/* 1F5DC */,/*50429*/28212/* 1F5DD */, /*50430*/28213/* 1F5DE */,/*50431*/28214/* 1F5DF */,/*50432*/28215/* 1F5E0 */,/*50433*/28216/* 1F5E1 */, /*50434*/28217/* 1F5E2 */,/*50435*/28218/* 1F5E3 */,/*50436*/28219/* 1F5E4 */,/*50437*/28220/* 1F5E5 */, /*50438*/28221/* 1F5E6 */,/*50439*/28222/* 1F5E7 */,/*50440*/28223/* 1F5E8 */,/*50441*/28224/* 1F5E9 */, /*50442*/28225/* 1F5EA */,/*50443*/28226/* 1F5EB */,/*50444*/28227/* 1F5EC */,/*50445*/28228/* 1F5ED */, /*50446*/28229/* 1F5EE */,/*50447*/28230/* 1F5EF */,/*50448*/28231/* 1F5F0 */,/*50449*/28232/* 1F5F1 */, /*50450*/28233/* 1F5F2 */,/*50451*/28234/* 1F5F3 */,/*50452*/28235/* 1F5F4 */,/*50453*/28236/* 1F5F5 */, /*50454*/28237/* 1F5F6 */,/*50455*/28238/* 1F5F7 */,/*50456*/28239/* 1F5F8 */,/*50457*/28240/* 1F5F9 */, /*50458*/28241/* 1F5FA */,/*50459*/28242/* 1F5FB */,/*50460*/28243/* 1F5FC */,/*50461*/28244/* 1F5FD */, /*50462*/28245/* 1F5FE */,/*50463*/28246/* 1F5FF */,/*50464*/28247/* 1F600 */,/*50465*/28248/* 1F601 */, /*50466*/28249/* 1F602 */,/*50467*/28250/* 1F603 */,/*50468*/28251/* 1F604 */,/*50469*/28252/* 1F605 */, /*50470*/28253/* 1F606 */,/*50471*/28254/* 1F607 */,/*50472*/28255/* 1F608 */,/*50473*/28256/* 1F609 */, /*50474*/28257/* 1F60A */,/*50475*/28258/* 1F60B */,/*50476*/28259/* 1F60C */,/*50477*/28260/* 1F60D */, /*50478*/28261/* 1F60E */,/*50479*/28262/* 1F60F */,/*50480*/28263/* 1F610 */,/*50481*/28264/* 1F611 */, /*50482*/28265/* 1F612 */,/*50483*/28266/* 1F613 */,/*50484*/28267/* 1F614 */,/*50485*/28268/* 1F615 */, /*50486*/28269/* 1F616 */,/*50487*/28270/* 1F617 */,/*50488*/28271/* 1F618 */,/*50489*/28272/* 1F619 */, /*50490*/28273/* 1F61A */,/*50491*/28274/* 1F61B */,/*50492*/28275/* 1F61C */,/*50493*/28276/* 1F61D */, /*50494*/28277/* 1F61E */,/*50495*/28278/* 1F61F */,/*50496*/28279/* 1F620 */,/*50497*/28280/* 1F621 */, /*50498*/28281/* 1F622 */,/*50499*/28282/* 1F623 */,/*50500*/28283/* 1F624 */,/*50501*/28284/* 1F625 */, /*50502*/28285/* 1F626 */,/*50503*/28286/* 1F627 */,/*50504*/28287/* 1F628 */,/*50505*/28288/* 1F629 */, /*50506*/28289/* 1F62A */,/*50507*/28290/* 1F62B */,/*50508*/28291/* 1F62C */,/*50509*/28292/* 1F62D */, /*50510*/28293/* 1F62E */,/*50511*/28294/* 1F62F */,/*50512*/28295/* 1F630 */,/*50513*/28296/* 1F631 */, /*50514*/28297/* 1F632 */,/*50515*/28298/* 1F633 */,/*50516*/28299/* 1F634 */,/*50517*/28300/* 1F635 */, /*50518*/28301/* 1F636 */,/*50519*/28302/* 1F637 */,/*50520*/28303/* 1F638 */,/*50521*/28304/* 1F639 */, /*50522*/28305/* 1F63A */,/*50523*/28306/* 1F63B */,/*50524*/28307/* 1F63C */,/*50525*/28308/* 1F63D */, /*50526*/28309/* 1F63E */,/*50527*/28310/* 1F63F */,/*50528*/28311/* 1F640 */,/*50529*/28312/* 1F641 */, /*50530*/28313/* 1F642 */,/*50531*/28314/* 1F643 */,/*50532*/28315/* 1F644 */,/*50533*/28316/* 1F645 */, /*50534*/28317/* 1F646 */,/*50535*/28318/* 1F647 */,/*50536*/28319/* 1F648 */,/*50537*/28320/* 1F649 */, /*50538*/28321/* 1F64A */,/*50539*/28322/* 1F64B */,/*50540*/28323/* 1F64C */,/*50541*/28324/* 1F64D */, /*50542*/28325/* 1F64E */,/*50543*/28326/* 1F64F */,/*50544*/28327/* 1F650 */,/*50545*/28328/* 1F651 */, /*50546*/28329/* 1F652 */,/*50547*/28330/* 1F653 */,/*50548*/28331/* 1F654 */,/*50549*/28332/* 1F655 */, /*50550*/28333/* 1F656 */,/*50551*/28334/* 1F657 */,/*50552*/28335/* 1F658 */,/*50553*/28336/* 1F659 */, /*50554*/28337/* 1F65A */,/*50555*/28338/* 1F65B */,/*50556*/28339/* 1F65C */,/*50557*/28340/* 1F65D */, /*50558*/28341/* 1F65E */,/*50559*/28342/* 1F65F */,/*50560*/28343/* 1F660 */,/*50561*/28344/* 1F661 */, /*50562*/28345/* 1F662 */,/*50563*/28346/* 1F663 */,/*50564*/28347/* 1F664 */,/*50565*/28348/* 1F665 */, /*50566*/28349/* 1F666 */,/*50567*/28350/* 1F667 */,/*50568*/28351/* 1F668 */,/*50569*/28352/* 1F669 */, /*50570*/28353/* 1F66A */,/*50571*/28354/* 1F66B */,/*50572*/28355/* 1F66C */,/*50573*/28356/* 1F66D */, /*50574*/28357/* 1F66E */,/*50575*/28358/* 1F66F */,/*50576*/28359/* 1F670 */,/*50577*/28360/* 1F671 */, /*50578*/28361/* 1F672 */,/*50579*/28362/* 1F673 */,/*50580*/28363/* 1F674 */,/*50581*/28364/* 1F675 */, /*50582*/28365/* 1F676 */,/*50583*/28366/* 1F677 */,/*50584*/28367/* 1F678 */,/*50585*/28368/* 1F679 */, /*50586*/28369/* 1F67A */,/*50587*/28370/* 1F67B */,/*50588*/28371/* 1F67C */,/*50589*/28372/* 1F67D */, /*50590*/28373/* 1F67E */,/*50591*/28374/* 1F67F */,/*50592*/28375/* 1F680 */,/*50593*/28376/* 1F681 */, /*50594*/28377/* 1F682 */,/*50595*/28378/* 1F683 */,/*50596*/28379/* 1F684 */,/*50597*/28380/* 1F685 */, /*50598*/28381/* 1F686 */,/*50599*/28382/* 1F687 */,/*50600*/28383/* 1F688 */,/*50601*/28384/* 1F689 */, /*50602*/28385/* 1F68A */,/*50603*/28386/* 1F68B */,/*50604*/28387/* 1F68C */,/*50605*/28388/* 1F68D */, /*50606*/28389/* 1F68E */,/*50607*/28390/* 1F68F */,/*50608*/28391/* 1F690 */,/*50609*/28392/* 1F691 */, /*50610*/28393/* 1F692 */,/*50611*/28394/* 1F693 */,/*50612*/28395/* 1F694 */,/*50613*/28396/* 1F695 */, /*50614*/28397/* 1F696 */,/*50615*/28398/* 1F697 */,/*50616*/28399/* 1F698 */,/*50617*/28400/* 1F699 */, /*50618*/28401/* 1F69A */,/*50619*/28402/* 1F69B */,/*50620*/28403/* 1F69C */,/*50621*/28404/* 1F69D */, /*50622*/28405/* 1F69E */,/*50623*/28406/* 1F69F */,/*50624*/28407/* 1F6A0 */,/*50625*/28408/* 1F6A1 */, /*50626*/28409/* 1F6A2 */,/*50627*/28410/* 1F6A3 */,/*50628*/28411/* 1F6A4 */,/*50629*/28412/* 1F6A5 */, /*50630*/28413/* 1F6A6 */,/*50631*/28414/* 1F6A7 */,/*50632*/28415/* 1F6A8 */,/*50633*/28416/* 1F6A9 */, /*50634*/28417/* 1F6AA */,/*50635*/28418/* 1F6AB */,/*50636*/28419/* 1F6AC */,/*50637*/28420/* 1F6AD */, /*50638*/28421/* 1F6AE */,/*50639*/28422/* 1F6AF */,/*50640*/28423/* 1F6B0 */,/*50641*/28424/* 1F6B1 */, /*50642*/28425/* 1F6B2 */,/*50643*/28426/* 1F6B3 */,/*50644*/28427/* 1F6B4 */,/*50645*/28428/* 1F6B5 */, /*50646*/28429/* 1F6B6 */,/*50647*/28430/* 1F6B7 */,/*50648*/28431/* 1F6B8 */,/*50649*/28432/* 1F6B9 */, /*50650*/28433/* 1F6BA */,/*50651*/28434/* 1F6BB */,/*50652*/28435/* 1F6BC */,/*50653*/28436/* 1F6BD */, /*50654*/28437/* 1F6BE */,/*50655*/28438/* 1F6BF */,/*50656*/28439/* 1F6C0 */,/*50657*/28440/* 1F6C1 */, /*50658*/28441/* 1F6C2 */,/*50659*/28442/* 1F6C3 */,/*50660*/28443/* 1F6C4 */,/*50661*/28444/* 1F6C5 */, /*50662*/28445/* 1F6C6 */,/*50663*/28446/* 1F6C7 */,/*50664*/28447/* 1F6C8 */,/*50665*/28448/* 1F6C9 */, /*50666*/28449/* 1F6CA */,/*50667*/28450/* 1F6CB */,/*50668*/28451/* 1F6CC */,/*50669*/28452/* 1F6CD */, /*50670*/28453/* 1F6CE */,/*50671*/28454/* 1F6CF */,/*50672*/28455/* 1F6D0 */,/*50673*/28456/* 1F6D1 */, /*50674*/28457/* 1F6D2 */,/*50675*/28458/* 1F6D3 */,/*50676*/28459/* 1F6D4 */,0,0,0,0,0,0,0,0,0,0,0, /*50688*/28460/* 1F6E0 */,/*50689*/28461/* 1F6E1 */,/*50690*/28462/* 1F6E2 */,/*50691*/28463/* 1F6E3 */, /*50692*/28464/* 1F6E4 */,/*50693*/28465/* 1F6E5 */,/*50694*/28466/* 1F6E6 */,/*50695*/28467/* 1F6E7 */, /*50696*/28468/* 1F6E8 */,/*50697*/28469/* 1F6E9 */,/*50698*/28470/* 1F6EA */,/*50699*/28471/* 1F6EB */, /*50700*/28472/* 1F6EC */,0,0,0,/*50704*/28473/* 1F6F0 */,/*50705*/28474/* 1F6F1 */,/*50706*/28475/* 1F6F2 */, /*50707*/28476/* 1F6F3 */,/*50708*/28477/* 1F6F4 */,/*50709*/28478/* 1F6F5 */,/*50710*/28479/* 1F6F6 */, /*50711*/28480/* 1F6F7 */,/*50712*/28481/* 1F6F8 */,0,0,0,0,0,0,0,/*50720*/28482/* 1F700 */,/*50721*/28483/* 1F701 */, /*50722*/28484/* 1F702 */,/*50723*/28485/* 1F703 */,/*50724*/28486/* 1F704 */,/*50725*/28487/* 1F705 */, /*50726*/28488/* 1F706 */,/*50727*/28489/* 1F707 */,/*50728*/28490/* 1F708 */,/*50729*/28491/* 1F709 */, /*50730*/28492/* 1F70A */,/*50731*/28493/* 1F70B */,/*50732*/28494/* 1F70C */,/*50733*/28495/* 1F70D */, /*50734*/28496/* 1F70E */,/*50735*/28497/* 1F70F */,/*50736*/28498/* 1F710 */,/*50737*/28499/* 1F711 */, /*50738*/28500/* 1F712 */,/*50739*/28501/* 1F713 */,/*50740*/28502/* 1F714 */,/*50741*/28503/* 1F715 */, /*50742*/28504/* 1F716 */,/*50743*/28505/* 1F717 */,/*50744*/28506/* 1F718 */,/*50745*/28507/* 1F719 */, /*50746*/28508/* 1F71A */,/*50747*/28509/* 1F71B */,/*50748*/28510/* 1F71C */,/*50749*/28511/* 1F71D */, /*50750*/28512/* 1F71E */,/*50751*/28513/* 1F71F */,/*50752*/28514/* 1F720 */,/*50753*/28515/* 1F721 */, /*50754*/28516/* 1F722 */,/*50755*/28517/* 1F723 */,/*50756*/28518/* 1F724 */,/*50757*/28519/* 1F725 */, /*50758*/28520/* 1F726 */,/*50759*/28521/* 1F727 */,/*50760*/28522/* 1F728 */,/*50761*/28523/* 1F729 */, /*50762*/28524/* 1F72A */,/*50763*/28525/* 1F72B */,/*50764*/28526/* 1F72C */,/*50765*/28527/* 1F72D */, /*50766*/28528/* 1F72E */,/*50767*/28529/* 1F72F */,/*50768*/28530/* 1F730 */,/*50769*/28531/* 1F731 */, /*50770*/28532/* 1F732 */,/*50771*/28533/* 1F733 */,/*50772*/28534/* 1F734 */,/*50773*/28535/* 1F735 */, /*50774*/28536/* 1F736 */,/*50775*/28537/* 1F737 */,/*50776*/28538/* 1F738 */,/*50777*/28539/* 1F739 */, /*50778*/28540/* 1F73A */,/*50779*/28541/* 1F73B */,/*50780*/28542/* 1F73C */,/*50781*/28543/* 1F73D */, /*50782*/28544/* 1F73E */,/*50783*/28545/* 1F73F */,/*50784*/28546/* 1F740 */,/*50785*/28547/* 1F741 */, /*50786*/28548/* 1F742 */,/*50787*/28549/* 1F743 */,/*50788*/28550/* 1F744 */,/*50789*/28551/* 1F745 */, /*50790*/28552/* 1F746 */,/*50791*/28553/* 1F747 */,/*50792*/28554/* 1F748 */,/*50793*/28555/* 1F749 */, /*50794*/28556/* 1F74A */,/*50795*/28557/* 1F74B */,/*50796*/28558/* 1F74C */,/*50797*/28559/* 1F74D */, /*50798*/28560/* 1F74E */,/*50799*/28561/* 1F74F */,/*50800*/28562/* 1F750 */,/*50801*/28563/* 1F751 */, /*50802*/28564/* 1F752 */,/*50803*/28565/* 1F753 */,/*50804*/28566/* 1F754 */,/*50805*/28567/* 1F755 */, /*50806*/28568/* 1F756 */,/*50807*/28569/* 1F757 */,/*50808*/28570/* 1F758 */,/*50809*/28571/* 1F759 */, /*50810*/28572/* 1F75A */,/*50811*/28573/* 1F75B */,/*50812*/28574/* 1F75C */,/*50813*/28575/* 1F75D */, /*50814*/28576/* 1F75E */,/*50815*/28577/* 1F75F */,/*50816*/28578/* 1F760 */,/*50817*/28579/* 1F761 */, /*50818*/28580/* 1F762 */,/*50819*/28581/* 1F763 */,/*50820*/28582/* 1F764 */,/*50821*/28583/* 1F765 */, /*50822*/28584/* 1F766 */,/*50823*/28585/* 1F767 */,/*50824*/28586/* 1F768 */,/*50825*/28587/* 1F769 */, /*50826*/28588/* 1F76A */,/*50827*/28589/* 1F76B */,/*50828*/28590/* 1F76C */,/*50829*/28591/* 1F76D */, /*50830*/28592/* 1F76E */,/*50831*/28593/* 1F76F */,/*50832*/28594/* 1F770 */,/*50833*/28595/* 1F771 */, /*50834*/28596/* 1F772 */,/*50835*/28597/* 1F773 */,0,0,0,0,0,0,0,0,0,0,0,0,/*50848*/28598/* 1F780 */, /*50849*/28599/* 1F781 */,/*50850*/28600/* 1F782 */,/*50851*/28601/* 1F783 */,/*50852*/28602/* 1F784 */, /*50853*/28603/* 1F785 */,/*50854*/28604/* 1F786 */,/*50855*/28605/* 1F787 */,/*50856*/28606/* 1F788 */, /*50857*/28607/* 1F789 */,/*50858*/28608/* 1F78A */,/*50859*/28609/* 1F78B */,/*50860*/28610/* 1F78C */, /*50861*/28611/* 1F78D */,/*50862*/28612/* 1F78E */,/*50863*/28613/* 1F78F */,/*50864*/28614/* 1F790 */, /*50865*/28615/* 1F791 */,/*50866*/28616/* 1F792 */,/*50867*/28617/* 1F793 */,/*50868*/28618/* 1F794 */, /*50869*/28619/* 1F795 */,/*50870*/28620/* 1F796 */,/*50871*/28621/* 1F797 */,/*50872*/28622/* 1F798 */, /*50873*/28623/* 1F799 */,/*50874*/28624/* 1F79A */,/*50875*/28625/* 1F79B */,/*50876*/28626/* 1F79C */, /*50877*/28627/* 1F79D */,/*50878*/28628/* 1F79E */,/*50879*/28629/* 1F79F */,/*50880*/28630/* 1F7A0 */, /*50881*/28631/* 1F7A1 */,/*50882*/28632/* 1F7A2 */,/*50883*/28633/* 1F7A3 */,/*50884*/28634/* 1F7A4 */, /*50885*/28635/* 1F7A5 */,/*50886*/28636/* 1F7A6 */,/*50887*/28637/* 1F7A7 */,/*50888*/28638/* 1F7A8 */, /*50889*/28639/* 1F7A9 */,/*50890*/28640/* 1F7AA */,/*50891*/28641/* 1F7AB */,/*50892*/28642/* 1F7AC */, /*50893*/28643/* 1F7AD */,/*50894*/28644/* 1F7AE */,/*50895*/28645/* 1F7AF */,/*50896*/28646/* 1F7B0 */, /*50897*/28647/* 1F7B1 */,/*50898*/28648/* 1F7B2 */,/*50899*/28649/* 1F7B3 */,/*50900*/28650/* 1F7B4 */, /*50901*/28651/* 1F7B5 */,/*50902*/28652/* 1F7B6 */,/*50903*/28653/* 1F7B7 */,/*50904*/28654/* 1F7B8 */, /*50905*/28655/* 1F7B9 */,/*50906*/28656/* 1F7BA */,/*50907*/28657/* 1F7BB */,/*50908*/28658/* 1F7BC */, /*50909*/28659/* 1F7BD */,/*50910*/28660/* 1F7BE */,/*50911*/28661/* 1F7BF */,/*50912*/28662/* 1F7C0 */, /*50913*/28663/* 1F7C1 */,/*50914*/28664/* 1F7C2 */,/*50915*/28665/* 1F7C3 */,/*50916*/28666/* 1F7C4 */, /*50917*/28667/* 1F7C5 */,/*50918*/28668/* 1F7C6 */,/*50919*/28669/* 1F7C7 */,/*50920*/28670/* 1F7C8 */, /*50921*/28671/* 1F7C9 */,/*50922*/28672/* 1F7CA */,/*50923*/28673/* 1F7CB */,/*50924*/28674/* 1F7CC */, /*50925*/28675/* 1F7CD */,/*50926*/28676/* 1F7CE */,/*50927*/28677/* 1F7CF */,/*50928*/28678/* 1F7D0 */, /*50929*/28679/* 1F7D1 */,/*50930*/28680/* 1F7D2 */,/*50931*/28681/* 1F7D3 */,/*50932*/28682/* 1F7D4 */,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*50976*/28683/* 1F800 */, /*50977*/28684/* 1F801 */,/*50978*/28685/* 1F802 */,/*50979*/28686/* 1F803 */,/*50980*/28687/* 1F804 */, /*50981*/28688/* 1F805 */,/*50982*/28689/* 1F806 */,/*50983*/28690/* 1F807 */,/*50984*/28691/* 1F808 */, /*50985*/28692/* 1F809 */,/*50986*/28693/* 1F80A */,/*50987*/28694/* 1F80B */,0,0,0,0,/*50992*/28695/* 1F810 */, /*50993*/28696/* 1F811 */,/*50994*/28697/* 1F812 */,/*50995*/28698/* 1F813 */,/*50996*/28699/* 1F814 */, /*50997*/28700/* 1F815 */,/*50998*/28701/* 1F816 */,/*50999*/28702/* 1F817 */,/*51000*/28703/* 1F818 */, /*51001*/28704/* 1F819 */,/*51002*/28705/* 1F81A */,/*51003*/28706/* 1F81B */,/*51004*/28707/* 1F81C */, /*51005*/28708/* 1F81D */,/*51006*/28709/* 1F81E */,/*51007*/28710/* 1F81F */,/*51008*/28711/* 1F820 */, /*51009*/28712/* 1F821 */,/*51010*/28713/* 1F822 */,/*51011*/28714/* 1F823 */,/*51012*/28715/* 1F824 */, /*51013*/28716/* 1F825 */,/*51014*/28717/* 1F826 */,/*51015*/28718/* 1F827 */,/*51016*/28719/* 1F828 */, /*51017*/28720/* 1F829 */,/*51018*/28721/* 1F82A */,/*51019*/28722/* 1F82B */,/*51020*/28723/* 1F82C */, /*51021*/28724/* 1F82D */,/*51022*/28725/* 1F82E */,/*51023*/28726/* 1F82F */,/*51024*/28727/* 1F830 */, /*51025*/28728/* 1F831 */,/*51026*/28729/* 1F832 */,/*51027*/28730/* 1F833 */,/*51028*/28731/* 1F834 */, /*51029*/28732/* 1F835 */,/*51030*/28733/* 1F836 */,/*51031*/28734/* 1F837 */,/*51032*/28735/* 1F838 */, /*51033*/28736/* 1F839 */,/*51034*/28737/* 1F83A */,/*51035*/28738/* 1F83B */,/*51036*/28739/* 1F83C */, /*51037*/28740/* 1F83D */,/*51038*/28741/* 1F83E */,/*51039*/28742/* 1F83F */,/*51040*/28743/* 1F840 */, /*51041*/28744/* 1F841 */,/*51042*/28745/* 1F842 */,/*51043*/28746/* 1F843 */,/*51044*/28747/* 1F844 */, /*51045*/28748/* 1F845 */,/*51046*/28749/* 1F846 */,/*51047*/28750/* 1F847 */,0,0,0,0,0,0,0,0,/*51056*/28751/* 1F850 */, /*51057*/28752/* 1F851 */,/*51058*/28753/* 1F852 */,/*51059*/28754/* 1F853 */,/*51060*/28755/* 1F854 */, /*51061*/28756/* 1F855 */,/*51062*/28757/* 1F856 */,/*51063*/28758/* 1F857 */,/*51064*/28759/* 1F858 */, /*51065*/28760/* 1F859 */,0,0,0,0,0,0,/*51072*/28761/* 1F860 */,/*51073*/28762/* 1F861 */,/*51074*/28763/* 1F862 */, /*51075*/28764/* 1F863 */,/*51076*/28765/* 1F864 */,/*51077*/28766/* 1F865 */,/*51078*/28767/* 1F866 */, /*51079*/28768/* 1F867 */,/*51080*/28769/* 1F868 */,/*51081*/28770/* 1F869 */,/*51082*/28771/* 1F86A */, /*51083*/28772/* 1F86B */,/*51084*/28773/* 1F86C */,/*51085*/28774/* 1F86D */,/*51086*/28775/* 1F86E */, /*51087*/28776/* 1F86F */,/*51088*/28777/* 1F870 */,/*51089*/28778/* 1F871 */,/*51090*/28779/* 1F872 */, /*51091*/28780/* 1F873 */,/*51092*/28781/* 1F874 */,/*51093*/28782/* 1F875 */,/*51094*/28783/* 1F876 */, /*51095*/28784/* 1F877 */,/*51096*/28785/* 1F878 */,/*51097*/28786/* 1F879 */,/*51098*/28787/* 1F87A */, /*51099*/28788/* 1F87B */,/*51100*/28789/* 1F87C */,/*51101*/28790/* 1F87D */,/*51102*/28791/* 1F87E */, /*51103*/28792/* 1F87F */,/*51104*/28793/* 1F880 */,/*51105*/28794/* 1F881 */,/*51106*/28795/* 1F882 */, /*51107*/28796/* 1F883 */,/*51108*/28797/* 1F884 */,/*51109*/28798/* 1F885 */,/*51110*/28799/* 1F886 */, /*51111*/28800/* 1F887 */,0,0,0,0,0,0,0,0,/*51120*/28801/* 1F890 */,/*51121*/28802/* 1F891 */,/*51122*/28803/* 1F892 */, /*51123*/28804/* 1F893 */,/*51124*/28805/* 1F894 */,/*51125*/28806/* 1F895 */,/*51126*/28807/* 1F896 */, /*51127*/28808/* 1F897 */,/*51128*/28809/* 1F898 */,/*51129*/28810/* 1F899 */,/*51130*/28811/* 1F89A */, /*51131*/28812/* 1F89B */,/*51132*/28813/* 1F89C */,/*51133*/28814/* 1F89D */,/*51134*/28815/* 1F89E */, /*51135*/28816/* 1F89F */,/*51136*/28817/* 1F8A0 */,/*51137*/28818/* 1F8A1 */,/*51138*/28819/* 1F8A2 */, /*51139*/28820/* 1F8A3 */,/*51140*/28821/* 1F8A4 */,/*51141*/28822/* 1F8A5 */,/*51142*/28823/* 1F8A6 */, /*51143*/28824/* 1F8A7 */,/*51144*/28825/* 1F8A8 */,/*51145*/28826/* 1F8A9 */,/*51146*/28827/* 1F8AA */, /*51147*/28828/* 1F8AB */,/*51148*/28829/* 1F8AC */,/*51149*/28830/* 1F8AD */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,/*51232*/28831/* 1F900 */,/*51233*/28832/* 1F901 */,/*51234*/28833/* 1F902 */,/*51235*/28834/* 1F903 */, /*51236*/28835/* 1F904 */,/*51237*/28836/* 1F905 */,/*51238*/28837/* 1F906 */,/*51239*/28838/* 1F907 */, /*51240*/28839/* 1F908 */,/*51241*/28840/* 1F909 */,/*51242*/28841/* 1F90A */,/*51243*/28842/* 1F90B */,0,0,0,0, /*51248*/28843/* 1F910 */,/*51249*/28844/* 1F911 */,/*51250*/28845/* 1F912 */,/*51251*/28846/* 1F913 */, /*51252*/28847/* 1F914 */,/*51253*/28848/* 1F915 */,/*51254*/28849/* 1F916 */,/*51255*/28850/* 1F917 */, /*51256*/28851/* 1F918 */,/*51257*/28852/* 1F919 */,/*51258*/28853/* 1F91A */,/*51259*/28854/* 1F91B */, /*51260*/28855/* 1F91C */,/*51261*/28856/* 1F91D */,/*51262*/28857/* 1F91E */,/*51263*/28858/* 1F91F */, /*51264*/28859/* 1F920 */,/*51265*/28860/* 1F921 */,/*51266*/28861/* 1F922 */,/*51267*/28862/* 1F923 */, /*51268*/28863/* 1F924 */,/*51269*/28864/* 1F925 */,/*51270*/28865/* 1F926 */,/*51271*/28866/* 1F927 */, /*51272*/28867/* 1F928 */,/*51273*/28868/* 1F929 */,/*51274*/28869/* 1F92A */,/*51275*/28870/* 1F92B */, /*51276*/28871/* 1F92C */,/*51277*/28872/* 1F92D */,/*51278*/28873/* 1F92E */,/*51279*/28874/* 1F92F */, /*51280*/28875/* 1F930 */,/*51281*/28876/* 1F931 */,/*51282*/28877/* 1F932 */,/*51283*/28878/* 1F933 */, /*51284*/28879/* 1F934 */,/*51285*/28880/* 1F935 */,/*51286*/28881/* 1F936 */,/*51287*/28882/* 1F937 */, /*51288*/28883/* 1F938 */,/*51289*/28884/* 1F939 */,/*51290*/28885/* 1F93A */,/*51291*/28886/* 1F93B */, /*51292*/28887/* 1F93C */,/*51293*/28888/* 1F93D */,/*51294*/28889/* 1F93E */,0,/*51296*/28890/* 1F940 */, /*51297*/28891/* 1F941 */,/*51298*/28892/* 1F942 */,/*51299*/28893/* 1F943 */,/*51300*/28894/* 1F944 */, /*51301*/28895/* 1F945 */,/*51302*/28896/* 1F946 */,/*51303*/28897/* 1F947 */,/*51304*/28898/* 1F948 */, /*51305*/28899/* 1F949 */,/*51306*/28900/* 1F94A */,/*51307*/28901/* 1F94B */,/*51308*/28902/* 1F94C */,0,0,0, /*51312*/28903/* 1F950 */,/*51313*/28904/* 1F951 */,/*51314*/28905/* 1F952 */,/*51315*/28906/* 1F953 */, /*51316*/28907/* 1F954 */,/*51317*/28908/* 1F955 */,/*51318*/28909/* 1F956 */,/*51319*/28910/* 1F957 */, /*51320*/28911/* 1F958 */,/*51321*/28912/* 1F959 */,/*51322*/28913/* 1F95A */,/*51323*/28914/* 1F95B */, /*51324*/28915/* 1F95C */,/*51325*/28916/* 1F95D */,/*51326*/28917/* 1F95E */,/*51327*/28918/* 1F95F */, /*51328*/28919/* 1F960 */,/*51329*/28920/* 1F961 */,/*51330*/28921/* 1F962 */,/*51331*/28922/* 1F963 */, /*51332*/28923/* 1F964 */,/*51333*/28924/* 1F965 */,/*51334*/28925/* 1F966 */,/*51335*/28926/* 1F967 */, /*51336*/28927/* 1F968 */,/*51337*/28928/* 1F969 */,/*51338*/28929/* 1F96A */,/*51339*/28930/* 1F96B */,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,/*51360*/28931/* 1F980 */,/*51361*/28932/* 1F981 */,/*51362*/28933/* 1F982 */, /*51363*/28934/* 1F983 */,/*51364*/28935/* 1F984 */,/*51365*/28936/* 1F985 */,/*51366*/28937/* 1F986 */, /*51367*/28938/* 1F987 */,/*51368*/28939/* 1F988 */,/*51369*/28940/* 1F989 */,/*51370*/28941/* 1F98A */, /*51371*/28942/* 1F98B */,/*51372*/28943/* 1F98C */,/*51373*/28944/* 1F98D */,/*51374*/28945/* 1F98E */, /*51375*/28946/* 1F98F */,/*51376*/28947/* 1F990 */,/*51377*/28948/* 1F991 */,/*51378*/28949/* 1F992 */, /*51379*/28950/* 1F993 */,/*51380*/28951/* 1F994 */,/*51381*/28952/* 1F995 */,/*51382*/28953/* 1F996 */, /*51383*/28954/* 1F997 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*51424*/28955/* 1F9C0 */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*51440*/28956/* 1F9D0 */,/*51441*/28957/* 1F9D1 */, /*51442*/28958/* 1F9D2 */,/*51443*/28959/* 1F9D3 */,/*51444*/28960/* 1F9D4 */,/*51445*/28961/* 1F9D5 */, /*51446*/28962/* 1F9D6 */,/*51447*/28963/* 1F9D7 */,/*51448*/28964/* 1F9D8 */,/*51449*/28965/* 1F9D9 */, /*51450*/28966/* 1F9DA */,/*51451*/28967/* 1F9DB */,/*51452*/28968/* 1F9DC */,/*51453*/28969/* 1F9DD */, /*51454*/28970/* 1F9DE */,/*51455*/28971/* 1F9DF */,/*51456*/28972/* 1F9E0 */,/*51457*/28973/* 1F9E1 */, /*51458*/28974/* 1F9E2 */,/*51459*/28975/* 1F9E3 */,/*51460*/28976/* 1F9E4 */,/*51461*/28977/* 1F9E5 */, /*51462*/28978/* 1F9E6 */,/*51463*/28979/* 20000 */,/*51464*/28980/* 20001 */,/*51465*/28979/* 20002 */, /*51466*/28979/*20003 */,/*51467*/28979/*20004 */,/*51468*/28979/*20005 */,/*51469*/28979/*20006 */, /*51470*/28979/*20007 */,/*51471*/28979/*20008 */,/*51472*/28979/*20009 */,/*51473*/28979/*2000A */, /*51474*/28979/*2000B */,/*51475*/28979/*2000C */,/*51476*/28979/*2000D */,/*51477*/28979/*2000E */, /*51478*/28979/*2000F */,/*51479*/28979/*20010 */,/*51480*/28979/*20011 */,/*51481*/28979/*20012 */, /*51482*/28979/*20013 */,/*51483*/28979/*20014 */,/*51484*/28979/*20015 */,/*51485*/28979/*20016 */, /*51486*/28979/*20017 */,/*51487*/28979/*20018 */,/*51488*/28979/*20019 */,/*51489*/28979/*2001A */, /*51490*/28979/* 2001B */,/*51491*/28979/*2001C */,/*51492*/28979/*2001D */,/*51493*/28979/*2001E */, /*51494*/28979/*2001F */,/*51495*/28979/*20020 */,/*51496*/28979/*20021 */,/*51497*/28979/*20022 */, /*51498*/28979/*20023 */,/*51499*/28979/*20024 */,/*51500*/28979/*20025 */,/*51501*/28979/*20026 */, /*51502*/28979/*20027 */,/*51503*/28979/*20028 */,/*51504*/28979/*20029 */,/*51505*/28979/*2002A */, /*51506*/28979/*2002B */,/*51507*/28979/*2002C */,/*51508*/28979/*2002D */,/*51509*/28979/*2002E */, /*51510*/28979/*2002F */,/*51511*/28979/*20030 */,/*51512*/28979/*20031 */,/*51513*/28979/*20032 */, /*51514*/28979/*20033 */,/*51515*/28979/* 20034 */,/*51516*/28979/*20035 */,/*51517*/28979/*20036 */, /*51518*/28979/*20037 */,/*51519*/28979/*20038 */,/*51520*/28979/*20039 */,/*51521*/28979/*2003A */, /*51522*/28979/*2003B */,/*51523*/28979/*2003C */,/*51524*/28979/*2003D */,/*51525*/28979/*2003E */, /*51526*/28979/*2003F */,/*51527*/28979/*20040 */,/*51528*/28979/*20041 */,/*51529*/28979/*20042 */, /*51530*/28979/*20043 */,/*51531*/28979/*20044 */,/*51532*/28979/*20045 */,/*51533*/28979/*20046 */, /*51534*/28979/*20047 */,/*51535*/28979/*20048 */,/*51536*/28979/*20049 */,/*51537*/28979/*2004A */, /*51538*/28979/*2004B */,/*51539*/28979/*2004C */,/*51540*/28979/* 2004D */,/*51541*/28979/*2004E */, /*51542*/28979/*2004F */,/*51543*/28979/*20050 */,/*51544*/28979/*20051 */,/*51545*/28979/*20052 */, /*51546*/28979/*20053 */,/*51547*/28979/*20054 */,/*51548*/28979/*20055 */,/*51549*/28979/*20056 */, /*51550*/28979/*20057 */,/*51551*/28979/*20058 */,/*51552*/28979/*20059 */,/*51553*/28979/*2005A */, /*51554*/28979/*2005B */,/*51555*/28979/*2005C */,/*51556*/28979/*2005D */,/*51557*/28979/*2005E */, /*51558*/28979/*2005F */,/*51559*/28979/*20060 */,/*51560*/28979/*20061 */,/*51561*/28979/*20062 */, /*51562*/28979/*20063 */,/*51563*/28981/* 20064 */,/*51564*/28979/* 20065 */,/*51565*/28981/* 200E2 */, /*51566*/28979/* 200E3 */,/*51567*/28979/*200E4 */,/*51568*/28979/*200E5 */,/*51569*/28979/*200E6 */, /*51570*/28979/*200E7 */,/*51571*/28979/*200E8 */,/*51572*/28979/*200E9 */,/*51573*/28979/*200EA */, /*51574*/28979/*200EB */,/*51575*/28979/*200EC */,/*51576*/28979/*200ED */,/*51577*/28979/*200EE */, /*51578*/28979/*200EF */,/*51579*/28979/*200F0 */,/*51580*/28979/*200F1 */,/*51581*/28979/*200F2 */, /*51582*/28979/*200F3 */,/*51583*/28979/*200F4 */,/*51584*/28979/*200F5 */,/*51585*/28979/*200F6 */, /*51586*/28979/*200F7 */,/*51587*/28979/*200F8 */,/*51588*/28979/*200F9 */,/*51589*/28979/*200FA */, /*51590*/28979/*200FB */,/*51591*/28979/* 200FC */,/*51592*/28979/*200FD */,/*51593*/28979/*200FE */, /*51594*/28979/*200FF */,/*51595*/28979/*20100 */,/*51596*/28979/*20101 */,/*51597*/28979/*20102 */, /*51598*/28979/*20103 */,/*51599*/28979/*20104 */,/*51600*/28979/*20105 */,/*51601*/28979/*20106 */, /*51602*/28979/*20107 */,/*51603*/28979/*20108 */,/*51604*/28979/*20109 */,/*51605*/28979/*2010A */, /*51606*/28979/*2010B */,/*51607*/28979/*2010C */,/*51608*/28979/*2010D */,/*51609*/28979/*2010E */, /*51610*/28979/*2010F */,/*51611*/28979/*20110 */,/*51612*/28979/*20111 */,/*51613*/28979/*20112 */, /*51614*/28979/*20113 */,/*51615*/28979/*20114 */,/*51616*/28979/* 20115 */,/*51617*/28979/*20116 */, /*51618*/28979/*20117 */,/*51619*/28979/*20118 */,/*51620*/28979/*20119 */,/*51621*/28979/*2011A */, /*51622*/28979/*2011B */,/*51623*/28979/*2011C */,/*51624*/28979/*2011D */,/*51625*/28979/*2011E */, /*51626*/28979/*2011F */,/*51627*/28979/*20120 */,/*51628*/28982/* 20121 */,/*51629*/28979/* 20122 */, /*51630*/28983/* 2092A */,/*51631*/28979/* 2092B */,/*51632*/28979/*2092C */,/*51633*/28979/*2092D */, /*51634*/28979/*2092E */,/*51635*/28979/*2092F */,/*51636*/28979/*20930 */,/*51637*/28979/*20931 */, /*51638*/28979/*20932 */,/*51639*/28979/*20933 */,/*51640*/28979/*20934 */,/*51641*/28979/*20935 */, /*51642*/28979/*20936 */,/*51643*/28979/*20937 */,/*51644*/28979/*20938 */,/*51645*/28979/*20939 */, /*51646*/28979/*2093A */,/*51647*/28979/*2093B */,/*51648*/28979/*2093C */,/*51649*/28979/*2093D */, /*51650*/28979/*2093E */,/*51651*/28979/*2093F */,/*51652*/28979/*20940 */,/*51653*/28979/*20941 */, /*51654*/28979/*20942 */,/*51655*/28979/*20943 */,/*51656*/28979/* 20944 */,/*51657*/28979/*20945 */, /*51658*/28979/*20946 */,/*51659*/28979/*20947 */,/*51660*/28979/*20948 */,/*51661*/28979/*20949 */, /*51662*/28979/*2094A */,/*51663*/28979/*2094B */,/*51664*/28979/*2094C */,/*51665*/28979/*2094D */, /*51666*/28979/*2094E */,/*51667*/28979/*2094F */,/*51668*/28979/*20950 */,/*51669*/28979/*20951 */, /*51670*/28979/*20952 */,/*51671*/28979/*20953 */,/*51672*/28979/*20954 */,/*51673*/28979/*20955 */, /*51674*/28979/*20956 */,/*51675*/28979/*20957 */,/*51676*/28979/*20958 */,/*51677*/28979/*20959 */, /*51678*/28979/*2095A */,/*51679*/28979/*2095B */,/*51680*/28979/*2095C */,/*51681*/28979/* 2095D */, /*51682*/28979/*2095E */,/*51683*/28979/*2095F */,/*51684*/28979/*20960 */,/*51685*/28979/*20961 */, /*51686*/28979/*20962 */,/*51687*/28979/*20963 */,/*51688*/28979/*20964 */,/*51689*/28979/*20965 */, /*51690*/28979/*20966 */,/*51691*/28979/*20967 */,/*51692*/28979/*20968 */,/*51693*/28979/*20969 */, /*51694*/28979/*2096A */,/*51695*/28979/*2096B */,/*51696*/28979/*2096C */,/*51697*/28979/*2096D */, /*51698*/28979/*2096E */,/*51699*/28979/*2096F */,/*51700*/28979/*20970 */,/*51701*/28979/*20971 */, /*51702*/28979/*20972 */,/*51703*/28979/*20973 */,/*51704*/28979/*20974 */,/*51705*/28979/*20975 */, /*51706*/28979/* 20976 */,/*51707*/28979/*20977 */,/*51708*/28979/*20978 */,/*51709*/28979/*20979 */, /*51710*/28979/*2097A */,/*51711*/28979/*2097B */,/*51712*/28979/*2097C */,/*51713*/28979/*2097D */, /*51714*/28979/*2097E */,/*51715*/28979/*2097F */,/*51716*/28979/*20980 */,/*51717*/28979/*20981 */, /*51718*/28979/*20982 */,/*51719*/28984/* 20983 */,/*51720*/28979/* 20984 */,/*51721*/28979/*20985 */, /*51722*/28979/*20986 */,/*51723*/28979/*20987 */,/*51724*/28979/*20988 */,/*51725*/28979/*20989 */, /*51726*/28979/*2098A */,/*51727*/28979/*2098B */,/*51728*/28985/* 2098C */,/*51729*/28979/* 2098D */, /*51730*/28979/*2098E */,/*51731*/28979/*2098F */,/*51732*/28979/*20990 */,/*51733*/28979/*20991 */, /*51734*/28979/*20992 */,/*51735*/28979/*20993 */,/*51736*/28979/*20994 */,/*51737*/28979/*20995 */, /*51738*/28979/*20996 */,/*51739*/28979/*20997 */,/*51740*/28979/*20998 */,/*51741*/28979/*20999 */, /*51742*/28979/*2099A */,/*51743*/28979/*2099B */,/*51744*/28985/* 2099C */,/*51745*/28979/* 2099D */, /*51746*/28986/* 20AEA */,/*51747*/28979/* 20AEB */,/*51748*/28979/*20AEC */,/*51749*/28979/*20AED */, /*51750*/28979/*20AEE */,/*51751*/28979/*20AEF */,/*51752*/28979/*20AF0 */,/*51753*/28979/*20AF1 */, /*51754*/28979/*20AF2 */,/*51755*/28979/*20AF3 */,/*51756*/28979/*20AF4 */,/*51757*/28979/*20AF5 */, /*51758*/28979/*20AF6 */,/*51759*/28979/*20AF7 */,/*51760*/28979/*20AF8 */,/*51761*/28979/*20AF9 */, /*51762*/28979/*20AFA */,/*51763*/28979/*20AFB */,/*51764*/28979/*20AFC */,/*51765*/28987/* 20AFD */, /*51766*/28979/* 20AFE */,/*51767*/28979/*20AFF */,/*51768*/28979/*20B00 */,/*51769*/28979/*20B01 */, /*51770*/28979/*20B02 */,/*51771*/28979/*20B03 */,/*51772*/28979/*20B04 */,/*51773*/28979/*20B05 */, /*51774*/28979/*20B06 */,/*51775*/28979/*20B07 */,/*51776*/28979/*20B08 */,/*51777*/28979/*20B09 */, /*51778*/28979/*20B0A */,/*51779*/28979/*20B0B */,/*51780*/28979/*20B0C */,/*51781*/28979/*20B0D */, /*51782*/28979/*20B0E */,/*51783*/28979/*20B0F */,/*51784*/28979/*20B10 */,/*51785*/28979/*20B11 */, /*51786*/28979/*20B12 */,/*51787*/28979/*20B13 */,/*51788*/28979/*20B14 */,/*51789*/28979/*20B15 */, /*51790*/28979/*20B16 */,/*51791*/28979/* 20B17 */,/*51792*/28979/*20B18 */,/*51793*/28987/* 20B19 */, /*51794*/28979/* 20B1A */,/*51795*/28988/* 22390 */,/*51796*/28979/* 22391 */,/*51797*/28987/* 22998 */, /*51798*/28979/* 22999 */,/*51799*/28987/* 23B1B */,/*51800*/28979/* 23B1C */,/*51801*/28981/* 2626D */, /*51802*/28979/* 2626E */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*51844*/28989/* 2A700 */,0,0,0,0,0,0,0,0,0,0,0,/*51856*/28990/* 2B740 */,0,0,/*51859*/28991/* 2B820 */,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,/*51874*/28992/* 2CEB0 */,/*51875*/28993/* 2F800 */,/*51876*/28994/* 2F801 */,/*51877*/28995/* 2F802 */, /*51878*/28996/* 2F803 */,/*51879*/28997/* 2F804 */,/*51880*/28998/* 2F805 */,/*51881*/28999/* 2F806 */, /*51882*/29000/* 2F807 */,/*51883*/29001/* 2F808 */,/*51884*/29002/* 2F809 */,/*51885*/29003/* 2F80A */, /*51886*/29004/* 2F80B */,/*51887*/29005/* 2F80C */,/*51888*/29006/* 2F80D */,/*51889*/29007/* 2F80E */, /*51890*/29008/* 2F80F */,/*51891*/29009/* 2F810 */,/*51892*/29010/* 2F811 */,/*51893*/29011/* 2F812 */, /*51894*/29012/* 2F813 */,/*51895*/29013/* 2F814 */,/*51896*/29014/* 2F815 */,/*51897*/29015/* 2F816 */, /*51898*/29016/* 2F817 */,/*51899*/29017/* 2F818 */,/*51900*/29018/* 2F819 */,/*51901*/29019/* 2F81A */, /*51902*/29020/* 2F81B */,/*51903*/29021/* 2F81C */,/*51904*/29022/* 2F81D */,/*51905*/29023/* 2F81E */, /*51906*/29024/* 2F81F */,/*51907*/29025/* 2F820 */,/*51908*/29026/* 2F821 */,/*51909*/29027/* 2F822 */, /*51910*/29028/* 2F823 */,/*51911*/29029/* 2F824 */,/*51912*/29030/* 2F825 */,/*51913*/29031/* 2F826 */, /*51914*/29032/* 2F827 */,/*51915*/29033/* 2F828 */,/*51916*/29034/* 2F829 */,/*51917*/29035/* 2F82A */, /*51918*/29036/* 2F82B */,/*51919*/29037/* 2F82C */,/*51920*/29038/* 2F82D */,/*51921*/29039/* 2F82E */, /*51922*/29040/* 2F82F */,/*51923*/29041/* 2F830 */,/*51924*/29042/* 2F831 */,/*51925*/29043/* 2F832 */, /*51926*/29044/* 2F833 */,/*51927*/29045/* 2F834 */,/*51928*/29046/* 2F835 */,/*51929*/29047/* 2F836 */, /*51930*/29048/* 2F837 */,/*51931*/29049/* 2F838 */,/*51932*/29050/* 2F839 */,/*51933*/29051/* 2F83A */, /*51934*/29052/* 2F83B */,/*51935*/29053/* 2F83C */,/*51936*/29054/* 2F83D */,/*51937*/29055/* 2F83E */, /*51938*/29056/* 2F83F */,/*51939*/29057/* 2F840 */,/*51940*/29058/* 2F841 */,/*51941*/29059/* 2F842 */, /*51942*/29060/* 2F843 */,/*51943*/29061/* 2F844 */,/*51944*/29062/* 2F845 */,/*51945*/29063/* 2F846 */, /*51946*/29064/* 2F847 */,/*51947*/29065/* 2F848 */,/*51948*/29066/* 2F849 */,/*51949*/29067/* 2F84A */, /*51950*/29068/* 2F84B */,/*51951*/29069/* 2F84C */,/*51952*/29070/* 2F84D */,/*51953*/29071/* 2F84E */, /*51954*/29072/* 2F84F */,/*51955*/29073/* 2F850 */,/*51956*/29074/* 2F851 */,/*51957*/29075/* 2F852 */, /*51958*/29076/* 2F853 */,/*51959*/29077/* 2F854 */,/*51960*/29078/* 2F855 */,/*51961*/29079/* 2F856 */, /*51962*/29080/* 2F857 */,/*51963*/29081/* 2F858 */,/*51964*/29082/* 2F859 */,/*51965*/29083/* 2F85A */, /*51966*/29084/* 2F85B */,/*51967*/29085/* 2F85C */,/*51968*/29086/* 2F85D */,/*51969*/29087/* 2F85E */, /*51970*/29088/* 2F85F */,/*51971*/29089/* 2F860 */,/*51972*/29090/* 2F861 */,/*51973*/29091/* 2F862 */, /*51974*/29092/* 2F863 */,/*51975*/29093/* 2F864 */,/*51976*/29094/* 2F865 */,/*51977*/29095/* 2F866 */, /*51978*/29096/* 2F867 */,/*51979*/29097/* 2F868 */,/*51980*/29098/* 2F869 */,/*51981*/29099/* 2F86A */, /*51982*/29100/* 2F86B */,/*51983*/29101/* 2F86C */,/*51984*/29102/* 2F86D */,/*51985*/29103/* 2F86E */, /*51986*/29104/* 2F86F */,/*51987*/29105/* 2F870 */,/*51988*/29106/* 2F871 */,/*51989*/29107/* 2F872 */, /*51990*/29108/* 2F873 */,/*51991*/29109/* 2F874 */,/*51992*/29110/* 2F875 */,/*51993*/29111/* 2F876 */, /*51994*/29112/* 2F877 */,/*51995*/29113/* 2F878 */,/*51996*/29114/* 2F879 */,/*51997*/29115/* 2F87A */, /*51998*/29116/* 2F87B */,/*51999*/29117/* 2F87C */,/*52000*/29118/* 2F87D */,/*52001*/29119/* 2F87E */, /*52002*/29120/* 2F87F */,/*52003*/29121/* 2F880 */,/*52004*/29122/* 2F881 */,/*52005*/29123/* 2F882 */, /*52006*/29124/* 2F883 */,/*52007*/29125/* 2F884 */,/*52008*/29126/* 2F885 */,/*52009*/29127/* 2F886 */, /*52010*/29128/* 2F887 */,/*52011*/29129/* 2F888 */,/*52012*/29130/* 2F889 */,/*52013*/29131/* 2F88A */, /*52014*/29132/* 2F88B */,/*52015*/29133/* 2F88C */,/*52016*/29134/* 2F88D */,/*52017*/29135/* 2F88E */, /*52018*/29136/* 2F88F */,/*52019*/29137/* 2F890 */,/*52020*/29138/* 2F891 */,/*52021*/29139/* 2F892 */, /*52022*/29140/* 2F893 */,/*52023*/29141/* 2F894 */,/*52024*/29142/* 2F895 */,/*52025*/29143/* 2F896 */, /*52026*/29144/* 2F897 */,/*52027*/29145/* 2F898 */,/*52028*/29146/* 2F899 */,/*52029*/29147/* 2F89A */, /*52030*/29148/* 2F89B */,/*52031*/29149/* 2F89C */,/*52032*/29150/* 2F89D */,/*52033*/29151/* 2F89E */, /*52034*/29152/* 2F89F */,/*52035*/29153/* 2F8A0 */,/*52036*/29154/* 2F8A1 */,/*52037*/29155/* 2F8A2 */, /*52038*/29156/* 2F8A3 */,/*52039*/29157/* 2F8A4 */,/*52040*/29158/* 2F8A5 */,/*52041*/29159/* 2F8A6 */, /*52042*/29160/* 2F8A7 */,/*52043*/29161/* 2F8A8 */,/*52044*/29162/* 2F8A9 */,/*52045*/29163/* 2F8AA */, /*52046*/29164/* 2F8AB */,/*52047*/29165/* 2F8AC */,/*52048*/29166/* 2F8AD */,/*52049*/29167/* 2F8AE */, /*52050*/29168/* 2F8AF */,/*52051*/29169/* 2F8B0 */,/*52052*/29170/* 2F8B1 */,/*52053*/29171/* 2F8B2 */, /*52054*/29172/* 2F8B3 */,/*52055*/29173/* 2F8B4 */,/*52056*/29174/* 2F8B5 */,/*52057*/29175/* 2F8B6 */, /*52058*/29176/* 2F8B7 */,/*52059*/29177/* 2F8B8 */,/*52060*/29178/* 2F8B9 */,/*52061*/29179/* 2F8BA */, /*52062*/29180/* 2F8BB */,/*52063*/29181/* 2F8BC */,/*52064*/29182/* 2F8BD */,/*52065*/29183/* 2F8BE */, /*52066*/29184/* 2F8BF */,/*52067*/29185/* 2F8C0 */,/*52068*/29186/* 2F8C1 */,/*52069*/29187/* 2F8C2 */, /*52070*/29188/* 2F8C3 */,/*52071*/29189/* 2F8C4 */,/*52072*/29190/* 2F8C5 */,/*52073*/29191/* 2F8C6 */, /*52074*/29192/* 2F8C7 */,/*52075*/29193/* 2F8C8 */,/*52076*/29194/* 2F8C9 */,/*52077*/29195/* 2F8CA */, /*52078*/29196/* 2F8CB */,/*52079*/29197/* 2F8CC */,/*52080*/29198/* 2F8CD */,/*52081*/29199/* 2F8CE */, /*52082*/29200/* 2F8CF */,/*52083*/29201/* 2F8D0 */,/*52084*/29202/* 2F8D1 */,/*52085*/29203/* 2F8D2 */, /*52086*/29204/* 2F8D3 */,/*52087*/29205/* 2F8D4 */,/*52088*/29206/* 2F8D5 */,/*52089*/29207/* 2F8D6 */, /*52090*/29208/* 2F8D7 */,/*52091*/29209/* 2F8D8 */,/*52092*/29210/* 2F8D9 */,/*52093*/29211/* 2F8DA */, /*52094*/29212/* 2F8DB */,/*52095*/29213/* 2F8DC */,/*52096*/29214/* 2F8DD */,/*52097*/29215/* 2F8DE */, /*52098*/29216/* 2F8DF */,/*52099*/29217/* 2F8E0 */,/*52100*/29218/* 2F8E1 */,/*52101*/29219/* 2F8E2 */, /*52102*/29220/* 2F8E3 */,/*52103*/29221/* 2F8E4 */,/*52104*/29222/* 2F8E5 */,/*52105*/29223/* 2F8E6 */, /*52106*/29224/* 2F8E7 */,/*52107*/29225/* 2F8E8 */,/*52108*/29226/* 2F8E9 */,/*52109*/29227/* 2F8EA */, /*52110*/29228/* 2F8EB */,/*52111*/29229/* 2F8EC */,/*52112*/29230/* 2F8ED */,/*52113*/29231/* 2F8EE */, /*52114*/29232/* 2F8EF */,/*52115*/29233/* 2F8F0 */,/*52116*/29234/* 2F8F1 */,/*52117*/29235/* 2F8F2 */, /*52118*/29236/* 2F8F3 */,/*52119*/29237/* 2F8F4 */,/*52120*/29238/* 2F8F5 */,/*52121*/29239/* 2F8F6 */, /*52122*/29240/* 2F8F7 */,/*52123*/29241/* 2F8F8 */,/*52124*/29242/* 2F8F9 */,/*52125*/29243/* 2F8FA */, /*52126*/29244/* 2F8FB */,/*52127*/29245/* 2F8FC */,/*52128*/29246/* 2F8FD */,/*52129*/29247/* 2F8FE */, /*52130*/29248/* 2F8FF */,/*52131*/29249/* 2F900 */,/*52132*/29250/* 2F901 */,/*52133*/29251/* 2F902 */, /*52134*/29252/* 2F903 */,/*52135*/29253/* 2F904 */,/*52136*/29254/* 2F905 */,/*52137*/29255/* 2F906 */, /*52138*/29256/* 2F907 */,/*52139*/29257/* 2F908 */,/*52140*/29258/* 2F909 */,/*52141*/29259/* 2F90A */, /*52142*/29260/* 2F90B */,/*52143*/29261/* 2F90C */,/*52144*/29262/* 2F90D */,/*52145*/29263/* 2F90E */, /*52146*/29264/* 2F90F */,/*52147*/29265/* 2F910 */,/*52148*/29266/* 2F911 */,/*52149*/29267/* 2F912 */, /*52150*/29268/* 2F913 */,/*52151*/29269/* 2F914 */,/*52152*/29270/* 2F915 */,/*52153*/29271/* 2F916 */, /*52154*/29272/* 2F917 */,/*52155*/29273/* 2F918 */,/*52156*/29274/* 2F919 */,/*52157*/29275/* 2F91A */, /*52158*/29276/* 2F91B */,/*52159*/29277/* 2F91C */,/*52160*/29278/* 2F91D */,/*52161*/29279/* 2F91E */, /*52162*/29280/* 2F91F */,/*52163*/29281/* 2F920 */,/*52164*/29282/* 2F921 */,/*52165*/29283/* 2F922 */, /*52166*/29284/* 2F923 */,/*52167*/29285/* 2F924 */,/*52168*/29286/* 2F925 */,/*52169*/29287/* 2F926 */, /*52170*/29288/* 2F927 */,/*52171*/29289/* 2F928 */,/*52172*/29290/* 2F929 */,/*52173*/29291/* 2F92A */, /*52174*/29292/* 2F92B */,/*52175*/29293/* 2F92C */,/*52176*/29294/* 2F92D */,/*52177*/29295/* 2F92E */, /*52178*/29296/* 2F92F */,/*52179*/29297/* 2F930 */,/*52180*/29298/* 2F931 */,/*52181*/29299/* 2F932 */, /*52182*/29300/* 2F933 */,/*52183*/29301/* 2F934 */,/*52184*/29302/* 2F935 */,/*52185*/29303/* 2F936 */, /*52186*/29304/* 2F937 */,/*52187*/29305/* 2F938 */,/*52188*/29306/* 2F939 */,/*52189*/29307/* 2F93A */, /*52190*/29308/* 2F93B */,/*52191*/29309/* 2F93C */,/*52192*/29310/* 2F93D */,/*52193*/29311/* 2F93E */, /*52194*/29312/* 2F93F */,/*52195*/29313/* 2F940 */,/*52196*/29314/* 2F941 */,/*52197*/29315/* 2F942 */, /*52198*/29316/* 2F943 */,/*52199*/29317/* 2F944 */,/*52200*/29318/* 2F945 */,/*52201*/29319/* 2F946 */, /*52202*/29320/* 2F947 */,/*52203*/29321/* 2F948 */,/*52204*/29322/* 2F949 */,/*52205*/29323/* 2F94A */, /*52206*/29324/* 2F94B */,/*52207*/29325/* 2F94C */,/*52208*/29326/* 2F94D */,/*52209*/29327/* 2F94E */, /*52210*/29328/* 2F94F */,/*52211*/29329/* 2F950 */,/*52212*/29330/* 2F951 */,/*52213*/29331/* 2F952 */, /*52214*/29332/* 2F953 */,/*52215*/29333/* 2F954 */,/*52216*/29334/* 2F955 */,/*52217*/29335/* 2F956 */, /*52218*/29336/* 2F957 */,/*52219*/29337/* 2F958 */,/*52220*/29338/* 2F959 */,/*52221*/29339/* 2F95A */, /*52222*/29340/* 2F95B */,/*52223*/29341/* 2F95C */,/*52224*/29342/* 2F95D */,/*52225*/29343/* 2F95E */, /*52226*/29344/* 2F95F */,/*52227*/29345/* 2F960 */,/*52228*/29346/* 2F961 */,/*52229*/29347/* 2F962 */, /*52230*/29348/* 2F963 */,/*52231*/29349/* 2F964 */,/*52232*/29350/* 2F965 */,/*52233*/29351/* 2F966 */, /*52234*/29352/* 2F967 */,/*52235*/29353/* 2F968 */,/*52236*/29354/* 2F969 */,/*52237*/29355/* 2F96A */, /*52238*/29356/* 2F96B */,/*52239*/29357/* 2F96C */,/*52240*/29358/* 2F96D */,/*52241*/29359/* 2F96E */, /*52242*/29360/* 2F96F */,/*52243*/29361/* 2F970 */,/*52244*/29362/* 2F971 */,/*52245*/29363/* 2F972 */, /*52246*/29364/* 2F973 */,/*52247*/29365/* 2F974 */,/*52248*/29366/* 2F975 */,/*52249*/29367/* 2F976 */, /*52250*/29368/* 2F977 */,/*52251*/29369/* 2F978 */,/*52252*/29370/* 2F979 */,/*52253*/29371/* 2F97A */, /*52254*/29372/* 2F97B */,/*52255*/29373/* 2F97C */,/*52256*/29374/* 2F97D */,/*52257*/29375/* 2F97E */, /*52258*/29376/* 2F97F */,/*52259*/29377/* 2F980 */,/*52260*/29378/* 2F981 */,/*52261*/29379/* 2F982 */, /*52262*/29380/* 2F983 */,/*52263*/29381/* 2F984 */,/*52264*/29382/* 2F985 */,/*52265*/29383/* 2F986 */, /*52266*/29384/* 2F987 */,/*52267*/29385/* 2F988 */,/*52268*/29386/* 2F989 */,/*52269*/29387/* 2F98A */, /*52270*/29388/* 2F98B */,/*52271*/29389/* 2F98C */,/*52272*/29390/* 2F98D */,/*52273*/29391/* 2F98E */, /*52274*/29392/* 2F98F */,/*52275*/29393/* 2F990 */,/*52276*/29394/* 2F991 */,/*52277*/29395/* 2F992 */, /*52278*/29396/* 2F993 */,/*52279*/29397/* 2F994 */,/*52280*/29398/* 2F995 */,/*52281*/29399/* 2F996 */, /*52282*/29400/* 2F997 */,/*52283*/29401/* 2F998 */,/*52284*/29402/* 2F999 */,/*52285*/29403/* 2F99A */, /*52286*/29404/* 2F99B */,/*52287*/29405/* 2F99C */,/*52288*/29406/* 2F99D */,/*52289*/29407/* 2F99E */, /*52290*/29408/* 2F99F */,/*52291*/29409/* 2F9A0 */,/*52292*/29410/* 2F9A1 */,/*52293*/29411/* 2F9A2 */, /*52294*/29412/* 2F9A3 */,/*52295*/29413/* 2F9A4 */,/*52296*/29414/* 2F9A5 */,/*52297*/29415/* 2F9A6 */, /*52298*/29416/* 2F9A7 */,/*52299*/29417/* 2F9A8 */,/*52300*/29418/* 2F9A9 */,/*52301*/29419/* 2F9AA */, /*52302*/29420/* 2F9AB */,/*52303*/29421/* 2F9AC */,/*52304*/29422/* 2F9AD */,/*52305*/29423/* 2F9AE */, /*52306*/29424/* 2F9AF */,/*52307*/29425/* 2F9B0 */,/*52308*/29426/* 2F9B1 */,/*52309*/29427/* 2F9B2 */, /*52310*/29428/* 2F9B3 */,/*52311*/29429/* 2F9B4 */,/*52312*/29430/* 2F9B5 */,/*52313*/29431/* 2F9B6 */, /*52314*/29432/* 2F9B7 */,/*52315*/29433/* 2F9B8 */,/*52316*/29434/* 2F9B9 */,/*52317*/29435/* 2F9BA */, /*52318*/29436/* 2F9BB */,/*52319*/29437/* 2F9BC */,/*52320*/29438/* 2F9BD */,/*52321*/29439/* 2F9BE */, /*52322*/29440/* 2F9BF */,/*52323*/29441/* 2F9C0 */,/*52324*/29442/* 2F9C1 */,/*52325*/29443/* 2F9C2 */, /*52326*/29444/* 2F9C3 */,/*52327*/29445/* 2F9C4 */,/*52328*/29446/* 2F9C5 */,/*52329*/29447/* 2F9C6 */, /*52330*/29448/* 2F9C7 */,/*52331*/29449/* 2F9C8 */,/*52332*/29450/* 2F9C9 */,/*52333*/29451/* 2F9CA */, /*52334*/29452/* 2F9CB */,/*52335*/29453/* 2F9CC */,/*52336*/29454/* 2F9CD */,/*52337*/29455/* 2F9CE */, /*52338*/29456/* 2F9CF */,/*52339*/29457/* 2F9D0 */,/*52340*/29458/* 2F9D1 */,/*52341*/29459/* 2F9D2 */, /*52342*/29460/* 2F9D3 */,/*52343*/29461/* 2F9D4 */,/*52344*/29462/* 2F9D5 */,/*52345*/29463/* 2F9D6 */, /*52346*/29464/* 2F9D7 */,/*52347*/29465/* 2F9D8 */,/*52348*/29466/* 2F9D9 */,/*52349*/29467/* 2F9DA */, /*52350*/29468/* 2F9DB */,/*52351*/29469/* 2F9DC */,/*52352*/29470/* 2F9DD */,/*52353*/29471/* 2F9DE */, /*52354*/29472/* 2F9DF */,/*52355*/29473/* 2F9E0 */,/*52356*/29474/* 2F9E1 */,/*52357*/29475/* 2F9E2 */, /*52358*/29476/* 2F9E3 */,/*52359*/29477/* 2F9E4 */,/*52360*/29478/* 2F9E5 */,/*52361*/29479/* 2F9E6 */, /*52362*/29480/* 2F9E7 */,/*52363*/29481/* 2F9E8 */,/*52364*/29482/* 2F9E9 */,/*52365*/29483/* 2F9EA */, /*52366*/29484/* 2F9EB */,/*52367*/29485/* 2F9EC */,/*52368*/29486/* 2F9ED */,/*52369*/29487/* 2F9EE */, /*52370*/29488/* 2F9EF */,/*52371*/29489/* 2F9F0 */,/*52372*/29490/* 2F9F1 */,/*52373*/29491/* 2F9F2 */, /*52374*/29492/* 2F9F3 */,/*52375*/29493/* 2F9F4 */,/*52376*/29494/* 2F9F5 */,/*52377*/29495/* 2F9F6 */, /*52378*/29496/* 2F9F7 */,/*52379*/29497/* 2F9F8 */,/*52380*/29498/* 2F9F9 */,/*52381*/29499/* 2F9FA */, /*52382*/29500/* 2F9FB */,/*52383*/29501/* 2F9FC */,/*52384*/29502/* 2F9FD */,/*52385*/29503/* 2F9FE */, /*52386*/29504/* 2F9FF */,/*52387*/29505/* 2FA00 */,/*52388*/29506/* 2FA01 */,/*52389*/29507/* 2FA02 */, /*52390*/29508/* 2FA03 */,/*52391*/29509/* 2FA04 */,/*52392*/29510/* 2FA05 */,/*52393*/29511/* 2FA06 */, /*52394*/29512/* 2FA07 */,/*52395*/29513/* 2FA08 */,/*52396*/29514/* 2FA09 */,/*52397*/29515/* 2FA0A */, /*52398*/29516/* 2FA0B */,/*52399*/29517/* 2FA0C */,/*52400*/29518/* 2FA0D */,/*52401*/29519/* 2FA0E */, /*52402*/29520/* 2FA0F */,/*52403*/29521/* 2FA10 */,/*52404*/29522/* 2FA11 */,/*52405*/29523/* 2FA12 */, /*52406*/29524/* 2FA13 */,/*52407*/29525/* 2FA14 */,/*52408*/29526/* 2FA15 */,/*52409*/29527/* 2FA16 */, /*52410*/29528/* 2FA17 */,/*52411*/29529/* 2FA18 */,/*52412*/29530/* 2FA19 */,/*52413*/29531/* 2FA1A */, /*52414*/29532/* 2FA1B */,/*52415*/29533/* 2FA1C */,/*52416*/29534/* 2FA1D */,/*52417*/29535/* E0001 */,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*52448*/29536/* E0020 */,/*52449*/29536/* E0021 */, /*52450*/29536/* E0022 */,/*52451*/29536/* E0023 */,/*52452*/29536/* E0024 */,/*52453*/29536/* E0025 */, /*52454*/29536/* E0026 */,/*52455*/29536/* E0027 */,/*52456*/29536/* E0028 */,/*52457*/29536/* E0029 */, /*52458*/29536/* E002A */,/*52459*/29536/* E002B */,/*52460*/29536/* E002C */,/*52461*/29536/* E002D */, /*52462*/29536/* E002E */,/*52463*/29536/* E002F */,/*52464*/29536/* E0030 */,/*52465*/29536/* E0031 */, /*52466*/29536/* E0032 */,/*52467*/29536/* E0033 */,/*52468*/29536/* E0034 */,/*52469*/29536/* E0035 */, /*52470*/29536/* E0036 */,/*52471*/29536/* E0037 */,/*52472*/29536/* E0038 */,/*52473*/29536/* E0039 */, /*52474*/29536/* E003A */,/*52475*/29536/* E003B */,/*52476*/29536/* E003C */,/*52477*/29536/* E003D */, /*52478*/29536/* E003E */,/*52479*/29536/* E003F */,/*52480*/29536/* E0040 */,/*52481*/29536/* E0041 */, /*52482*/29536/* E0042 */,/*52483*/29536/* E0043 */,/*52484*/29536/* E0044 */,/*52485*/29536/* E0045 */, /*52486*/29536/* E0046 */,/*52487*/29536/* E0047 */,/*52488*/29536/* E0048 */,/*52489*/29536/* E0049 */, /*52490*/29536/* E004A */,/*52491*/29536/* E004B */,/*52492*/29536/* E004C */,/*52493*/29536/* E004D */, /*52494*/29536/* E004E */,/*52495*/29536/* E004F */,/*52496*/29536/* E0050 */,/*52497*/29536/* E0051 */, /*52498*/29536/* E0052 */,/*52499*/29536/* E0053 */,/*52500*/29536/* E0054 */,/*52501*/29536/* E0055 */, /*52502*/29536/* E0056 */,/*52503*/29536/* E0057 */,/*52504*/29536/* E0058 */,/*52505*/29536/* E0059 */, /*52506*/29536/* E005A */,/*52507*/29536/* E005B */,/*52508*/29536/* E005C */,/*52509*/29536/* E005D */, /*52510*/29536/* E005E */,/*52511*/29536/* E005F */,/*52512*/29536/* E0060 */,/*52513*/29536/* E0061 */, /*52514*/29536/* E0062 */,/*52515*/29536/* E0063 */,/*52516*/29536/* E0064 */,/*52517*/29536/* E0065 */, /*52518*/29536/* E0066 */,/*52519*/29536/* E0067 */,/*52520*/29536/* E0068 */,/*52521*/29536/* E0069 */, /*52522*/29536/* E006A */,/*52523*/29536/* E006B */,/*52524*/29536/* E006C */,/*52525*/29536/* E006D */, /*52526*/29536/* E006E */,/*52527*/29536/* E006F */,/*52528*/29536/* E0070 */,/*52529*/29536/* E0071 */, /*52530*/29536/* E0072 */,/*52531*/29536/* E0073 */,/*52532*/29536/* E0074 */,/*52533*/29536/* E0075 */, /*52534*/29536/* E0076 */,/*52535*/29536/* E0077 */,/*52536*/29536/* E0078 */,/*52537*/29536/* E0079 */, /*52538*/29536/* E007A */,/*52539*/29536/* E007B */,/*52540*/29536/* E007C */,/*52541*/29536/* E007D */, /*52542*/29536/* E007E */,/*52543*/29536/* E007F */,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,/*52672*/29537/* E0100 */,/*52673*/29537/* E0101 */, /*52674*/29537/* E0102 */,/*52675*/29537/* E0103 */,/*52676*/29537/* E0104 */,/*52677*/29537/* E0105 */, /*52678*/29537/* E0106 */,/*52679*/29537/* E0107 */,/*52680*/29537/* E0108 */,/*52681*/29537/* E0109 */, /*52682*/29537/* E010A */,/*52683*/29537/* E010B */,/*52684*/29537/* E010C */,/*52685*/29537/* E010D */, /*52686*/29537/* E010E */,/*52687*/29537/* E010F */,/*52688*/29537/* E0110 */,/*52689*/29537/* E0111 */, /*52690*/29537/* E0112 */,/*52691*/29537/* E0113 */,/*52692*/29537/* E0114 */,/*52693*/29537/* E0115 */, /*52694*/29537/* E0116 */,/*52695*/29537/* E0117 */,/*52696*/29537/* E0118 */,/*52697*/29537/* E0119 */, /*52698*/29537/* E011A */,/*52699*/29537/* E011B */,/*52700*/29537/* E011C */,/*52701*/29537/* E011D */, /*52702*/29537/* E011E */,/*52703*/29537/* E011F */,/*52704*/29537/* E0120 */,/*52705*/29537/* E0121 */, /*52706*/29537/* E0122 */,/*52707*/29537/* E0123 */,/*52708*/29537/* E0124 */,/*52709*/29537/* E0125 */, /*52710*/29537/* E0126 */,/*52711*/29537/* E0127 */,/*52712*/29537/* E0128 */,/*52713*/29537/* E0129 */, /*52714*/29537/* E012A */,/*52715*/29537/* E012B */,/*52716*/29537/* E012C */,/*52717*/29537/* E012D */, /*52718*/29537/* E012E */,/*52719*/29537/* E012F */,/*52720*/29537/* E0130 */,/*52721*/29537/* E0131 */, /*52722*/29537/* E0132 */,/*52723*/29537/* E0133 */,/*52724*/29537/* E0134 */,/*52725*/29537/* E0135 */, /*52726*/29537/* E0136 */,/*52727*/29537/* E0137 */,/*52728*/29537/* E0138 */,/*52729*/29537/* E0139 */, /*52730*/29537/* E013A */,/*52731*/29537/* E013B */,/*52732*/29537/* E013C */,/*52733*/29537/* E013D */, /*52734*/29537/* E013E */,/*52735*/29537/* E013F */,/*52736*/29537/* E0140 */,/*52737*/29537/* E0141 */, /*52738*/29537/* E0142 */,/*52739*/29537/* E0143 */,/*52740*/29537/* E0144 */,/*52741*/29537/* E0145 */, /*52742*/29537/* E0146 */,/*52743*/29537/* E0147 */,/*52744*/29537/* E0148 */,/*52745*/29537/* E0149 */, /*52746*/29537/* E014A */,/*52747*/29537/* E014B */,/*52748*/29537/* E014C */,/*52749*/29537/* E014D */, /*52750*/29537/* E014E */,/*52751*/29537/* E014F */,/*52752*/29537/* E0150 */,/*52753*/29537/* E0151 */, /*52754*/29537/* E0152 */,/*52755*/29537/* E0153 */,/*52756*/29537/* E0154 */,/*52757*/29537/* E0155 */, /*52758*/29537/* E0156 */,/*52759*/29537/* E0157 */,/*52760*/29537/* E0158 */,/*52761*/29537/* E0159 */, /*52762*/29537/* E015A */,/*52763*/29537/* E015B */,/*52764*/29537/* E015C */,/*52765*/29537/* E015D */, /*52766*/29537/* E015E */,/*52767*/29537/* E015F */,/*52768*/29537/* E0160 */,/*52769*/29537/* E0161 */, /*52770*/29537/* E0162 */,/*52771*/29537/* E0163 */,/*52772*/29537/* E0164 */,/*52773*/29537/* E0165 */, /*52774*/29537/* E0166 */,/*52775*/29537/* E0167 */,/*52776*/29537/* E0168 */,/*52777*/29537/* E0169 */, /*52778*/29537/* E016A */,/*52779*/29537/* E016B */,/*52780*/29537/* E016C */,/*52781*/29537/* E016D */, /*52782*/29537/* E016E */,/*52783*/29537/* E016F */,/*52784*/29537/* E0170 */,/*52785*/29537/* E0171 */, /*52786*/29537/* E0172 */,/*52787*/29537/* E0173 */,/*52788*/29537/* E0174 */,/*52789*/29537/* E0175 */, /*52790*/29537/* E0176 */,/*52791*/29537/* E0177 */,/*52792*/29537/* E0178 */,/*52793*/29537/* E0179 */, /*52794*/29537/* E017A */,/*52795*/29537/* E017B */,/*52796*/29537/* E017C */,/*52797*/29537/* E017D */, /*52798*/29537/* E017E */,/*52799*/29537/* E017F */,/*52800*/29537/* E0180 */,/*52801*/29537/* E0181 */, /*52802*/29537/* E0182 */,/*52803*/29537/* E0183 */,/*52804*/29537/* E0184 */,/*52805*/29537/* E0185 */, /*52806*/29537/* E0186 */,/*52807*/29537/* E0187 */,/*52808*/29537/* E0188 */,/*52809*/29537/* E0189 */, /*52810*/29537/* E018A */,/*52811*/29537/* E018B */,/*52812*/29537/* E018C */,/*52813*/29537/* E018D */, /*52814*/29537/* E018E */,/*52815*/29537/* E018F */,/*52816*/29537/* E0190 */,/*52817*/29537/* E0191 */, /*52818*/29537/* E0192 */,/*52819*/29537/* E0193 */,/*52820*/29537/* E0194 */,/*52821*/29537/* E0195 */, /*52822*/29537/* E0196 */,/*52823*/29537/* E0197 */,/*52824*/29537/* E0198 */,/*52825*/29537/* E0199 */, /*52826*/29537/* E019A */,/*52827*/29537/* E019B */,/*52828*/29537/* E019C */,/*52829*/29537/* E019D */, /*52830*/29537/* E019E */,/*52831*/29537/* E019F */,/*52832*/29537/* E01A0 */,/*52833*/29537/* E01A1 */, /*52834*/29537/* E01A2 */,/*52835*/29537/* E01A3 */,/*52836*/29537/* E01A4 */,/*52837*/29537/* E01A5 */, /*52838*/29537/* E01A6 */,/*52839*/29537/* E01A7 */,/*52840*/29537/* E01A8 */,/*52841*/29537/* E01A9 */, /*52842*/29537/* E01AA */,/*52843*/29537/* E01AB */,/*52844*/29537/* E01AC */,/*52845*/29537/* E01AD */, /*52846*/29537/* E01AE */,/*52847*/29537/* E01AF */,/*52848*/29537/* E01B0 */,/*52849*/29537/* E01B1 */, /*52850*/29537/* E01B2 */,/*52851*/29537/* E01B3 */,/*52852*/29537/* E01B4 */,/*52853*/29537/* E01B5 */, /*52854*/29537/* E01B6 */,/*52855*/29537/* E01B7 */,/*52856*/29537/* E01B8 */,/*52857*/29537/* E01B9 */, /*52858*/29537/* E01BA */,/*52859*/29537/* E01BB */,/*52860*/29537/* E01BC */,/*52861*/29537/* E01BD */, /*52862*/29537/* E01BE */,/*52863*/29537/* E01BF */,/*52864*/29537/* E01C0 */,/*52865*/29537/* E01C1 */, /*52866*/29537/* E01C2 */,/*52867*/29537/* E01C3 */,/*52868*/29537/* E01C4 */,/*52869*/29537/* E01C5 */, /*52870*/29537/* E01C6 */,/*52871*/29537/* E01C7 */,/*52872*/29537/* E01C8 */,/*52873*/29537/* E01C9 */, /*52874*/29537/* E01CA */,/*52875*/29537/* E01CB */,/*52876*/29537/* E01CC */,/*52877*/29537/* E01CD */, /*52878*/29537/* E01CE */,/*52879*/29537/* E01CF */,/*52880*/29537/* E01D0 */,/*52881*/29537/* E01D1 */, /*52882*/29537/* E01D2 */,/*52883*/29537/* E01D3 */,/*52884*/29537/* E01D4 */,/*52885*/29537/* E01D5 */, /*52886*/29537/* E01D6 */,/*52887*/29537/* E01D7 */,/*52888*/29537/* E01D8 */,/*52889*/29537/* E01D9 */, /*52890*/29537/* E01DA */,/*52891*/29537/* E01DB */,/*52892*/29537/* E01DC */,/*52893*/29537/* E01DD */, /*52894*/29537/* E01DE */,/*52895*/29537/* E01DF */,/*52896*/29537/* E01E0 */,/*52897*/29537/* E01E1 */, /*52898*/29537/* E01E2 */,/*52899*/29537/* E01E3 */,/*52900*/29537/* E01E4 */,/*52901*/29537/* E01E5 */, /*52902*/29537/* E01E6 */,/*52903*/29537/* E01E7 */,/*52904*/29537/* E01E8 */,/*52905*/29537/* E01E9 */, /*52906*/29537/* E01EA */,/*52907*/29537/* E01EB */,/*52908*/29537/* E01EC */,/*52909*/29537/* E01ED */, /*52910*/29537/* E01EE */,/*52911*/29537/* E01EF */,/*52912*/29538/* F0000 */,/*52913*/29539/* 100000 */, /*52914*/29540/* 110000 */ }; static const char *codepoint_names[52915] = { /*0*/""/* 0000 */,/*1*/""/* 0001 */,/*2*/""/* 0002 */, /*3*/""/* 0003 */,/*4*/""/* 0004 */,/*5*/""/* 0005 */, /*6*/""/* 0006 */,/*7*/""/* 0007 */,/*8*/""/* 0008 */, /*9*/""/* 0009 */,/*10*/""/* 000A */,/*11*/""/* 000B */, /*12*/""/* 000C */,/*13*/""/* 000D */,/*14*/""/* 000E */, /*15*/""/* 000F */,/*16*/""/* 0010 */,/*17*/""/* 0011 */, /*18*/""/* 0012 */,/*19*/""/* 0013 */,/*20*/""/* 0014 */, /*21*/""/* 0015 */,/*22*/""/* 0016 */,/*23*/""/* 0017 */, /*24*/""/* 0018 */,/*25*/""/* 0019 */,/*26*/""/* 001A */, /*27*/""/* 001B */,/*28*/""/* 001C */,/*29*/""/* 001D */, /*30*/""/* 001E */,/*31*/""/* 001F */,/*32*/"SPACE"/* 0020 */, /*33*/"EXCLAMATION MARK"/* 0021 */,/*34*/"QUOTATION MARK"/* 0022 */,/*35*/"NUMBER SIGN"/* 0023 */, /*36*/"DOLLAR SIGN"/* 0024 */,/*37*/"PERCENT SIGN"/* 0025 */,/*38*/"AMPERSAND"/* 0026 */,/*39*/"APOSTROPHE"/* 0027 */, /*40*/"LEFT PARENTHESIS"/* 0028 */,/*41*/"RIGHT PARENTHESIS"/* 0029 */,/*42*/"ASTERISK"/* 002A */, /*43*/"PLUS SIGN"/* 002B */,/*44*/"COMMA"/* 002C */,/*45*/"HYPHEN-MINUS"/* 002D */,/*46*/"FULL STOP"/* 002E */, /*47*/"SOLIDUS"/* 002F */,/*48*/"DIGIT ZERO"/* 0030 */,/*49*/"DIGIT ONE"/* 0031 */,/*50*/"DIGIT TWO"/* 0032 */, /*51*/"DIGIT THREE"/* 0033 */,/*52*/"DIGIT FOUR"/* 0034 */,/*53*/"DIGIT FIVE"/* 0035 */,/*54*/"DIGIT SIX"/* 0036 */, /*55*/"DIGIT SEVEN"/* 0037 */,/*56*/"DIGIT EIGHT"/* 0038 */,/*57*/"DIGIT NINE"/* 0039 */,/*58*/"COLON"/* 003A */, /*59*/"SEMICOLON"/* 003B */,/*60*/"LESS-THAN SIGN"/* 003C */,/*61*/"EQUALS SIGN"/* 003D */, /*62*/"GREATER-THAN SIGN"/* 003E */,/*63*/"QUESTION MARK"/* 003F */,/*64*/"COMMERCIAL AT"/* 0040 */, /*65*/"LATIN CAPITAL LETTER A"/* 0041 */,/*66*/"LATIN CAPITAL LETTER B"/* 0042 */, /*67*/"LATIN CAPITAL LETTER C"/* 0043 */,/*68*/"LATIN CAPITAL LETTER D"/* 0044 */, /*69*/"LATIN CAPITAL LETTER E"/* 0045 */,/*70*/"LATIN CAPITAL LETTER F"/* 0046 */, /*71*/"LATIN CAPITAL LETTER G"/* 0047 */,/*72*/"LATIN CAPITAL LETTER H"/* 0048 */, /*73*/"LATIN CAPITAL LETTER I"/* 0049 */,/*74*/"LATIN CAPITAL LETTER J"/* 004A */, /*75*/"LATIN CAPITAL LETTER K"/* 004B */,/*76*/"LATIN CAPITAL LETTER L"/* 004C */, /*77*/"LATIN CAPITAL LETTER M"/* 004D */,/*78*/"LATIN CAPITAL LETTER N"/* 004E */, /*79*/"LATIN CAPITAL LETTER O"/* 004F */,/*80*/"LATIN CAPITAL LETTER P"/* 0050 */, /*81*/"LATIN CAPITAL LETTER Q"/* 0051 */,/*82*/"LATIN CAPITAL LETTER R"/* 0052 */, /*83*/"LATIN CAPITAL LETTER S"/* 0053 */,/*84*/"LATIN CAPITAL LETTER T"/* 0054 */, /*85*/"LATIN CAPITAL LETTER U"/* 0055 */,/*86*/"LATIN CAPITAL LETTER V"/* 0056 */, /*87*/"LATIN CAPITAL LETTER W"/* 0057 */,/*88*/"LATIN CAPITAL LETTER X"/* 0058 */, /*89*/"LATIN CAPITAL LETTER Y"/* 0059 */,/*90*/"LATIN CAPITAL LETTER Z"/* 005A */,/*91*/"LEFT SQUARE BRACKET"/* 005B */, /*92*/"REVERSE SOLIDUS"/* 005C */,/*93*/"RIGHT SQUARE BRACKET"/* 005D */,/*94*/"CIRCUMFLEX ACCENT"/* 005E */, /*95*/"LOW LINE"/* 005F */,/*96*/"GRAVE ACCENT"/* 0060 */,/*97*/"LATIN SMALL LETTER A"/* 0061 */, /*98*/"LATIN SMALL LETTER B"/* 0062 */,/*99*/"LATIN SMALL LETTER C"/* 0063 */,/*100*/"LATIN SMALL LETTER D"/* 0064 */, /*101*/"LATIN SMALL LETTER E"/* 0065 */,/*102*/"LATIN SMALL LETTER F"/* 0066 */,/*103*/"LATIN SMALL LETTER G"/* 0067 */, /*104*/"LATIN SMALL LETTER H"/* 0068 */,/*105*/"LATIN SMALL LETTER I"/* 0069 */,/*106*/"LATIN SMALL LETTER J"/* 006A */, /*107*/"LATIN SMALL LETTER K"/* 006B */,/*108*/"LATIN SMALL LETTER L"/* 006C */,/*109*/"LATIN SMALL LETTER M"/* 006D */, /*110*/"LATIN SMALL LETTER N"/* 006E */,/*111*/"LATIN SMALL LETTER O"/* 006F */,/*112*/"LATIN SMALL LETTER P"/* 0070 */, /*113*/"LATIN SMALL LETTER Q"/* 0071 */,/*114*/"LATIN SMALL LETTER R"/* 0072 */,/*115*/"LATIN SMALL LETTER S"/* 0073 */, /*116*/"LATIN SMALL LETTER T"/* 0074 */,/*117*/"LATIN SMALL LETTER U"/* 0075 */,/*118*/"LATIN SMALL LETTER V"/* 0076 */, /*119*/"LATIN SMALL LETTER W"/* 0077 */,/*120*/"LATIN SMALL LETTER X"/* 0078 */,/*121*/"LATIN SMALL LETTER Y"/* 0079 */, /*122*/"LATIN SMALL LETTER Z"/* 007A */,/*123*/"LEFT CURLY BRACKET"/* 007B */,/*124*/"VERTICAL LINE"/* 007C */, /*125*/"RIGHT CURLY BRACKET"/* 007D */,/*126*/"TILDE"/* 007E */,/*127*/""/* 007F */, /*128*/""/* 0080 */,/*129*/""/* 0081 */,/*130*/""/* 0082 */, /*131*/""/* 0083 */,/*132*/""/* 0084 */,/*133*/""/* 0085 */, /*134*/""/* 0086 */,/*135*/""/* 0087 */,/*136*/""/* 0088 */, /*137*/""/* 0089 */,/*138*/""/* 008A */,/*139*/""/* 008B */, /*140*/""/* 008C */,/*141*/""/* 008D */,/*142*/""/* 008E */, /*143*/""/* 008F */,/*144*/""/* 0090 */,/*145*/""/* 0091 */, /*146*/""/* 0092 */,/*147*/""/* 0093 */,/*148*/""/* 0094 */, /*149*/""/* 0095 */,/*150*/""/* 0096 */,/*151*/""/* 0097 */, /*152*/""/* 0098 */,/*153*/""/* 0099 */,/*154*/""/* 009A */, /*155*/""/* 009B */,/*156*/""/* 009C */,/*157*/""/* 009D */, /*158*/""/* 009E */,/*159*/""/* 009F */,/*160*/"NO-BREAK SPACE"/* 00A0 */, /*161*/"INVERTED EXCLAMATION MARK"/* 00A1 */,/*162*/"CENT SIGN"/* 00A2 */,/*163*/"POUND SIGN"/* 00A3 */, /*164*/"CURRENCY SIGN"/* 00A4 */,/*165*/"YEN SIGN"/* 00A5 */,/*166*/"BROKEN BAR"/* 00A6 */, /*167*/"SECTION SIGN"/* 00A7 */,/*168*/"DIAERESIS"/* 00A8 */,/*169*/"COPYRIGHT SIGN"/* 00A9 */, /*170*/"FEMININE ORDINAL INDICATOR"/* 00AA */,/*171*/"LEFT-POINTING DOUBLE ANGLE QUOTATION MARK"/* 00AB */, /*172*/"NOT SIGN"/* 00AC */,/*173*/"SOFT HYPHEN"/* 00AD */,/*174*/"REGISTERED SIGN"/* 00AE */,/*175*/"MACRON"/* 00AF */, /*176*/"DEGREE SIGN"/* 00B0 */,/*177*/"PLUS-MINUS SIGN"/* 00B1 */,/*178*/"SUPERSCRIPT TWO"/* 00B2 */, /*179*/"SUPERSCRIPT THREE"/* 00B3 */,/*180*/"ACUTE ACCENT"/* 00B4 */,/*181*/"MICRO SIGN"/* 00B5 */, /*182*/"PILCROW SIGN"/* 00B6 */,/*183*/"MIDDLE DOT"/* 00B7 */,/*184*/"CEDILLA"/* 00B8 */, /*185*/"SUPERSCRIPT ONE"/* 00B9 */,/*186*/"MASCULINE ORDINAL INDICATOR"/* 00BA */, /*187*/"RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK"/* 00BB */,/*188*/"VULGAR FRACTION ONE QUARTER"/* 00BC */, /*189*/"VULGAR FRACTION ONE HALF"/* 00BD */,/*190*/"VULGAR FRACTION THREE QUARTERS"/* 00BE */, /*191*/"INVERTED QUESTION MARK"/* 00BF */,/*192*/"LATIN CAPITAL LETTER A WITH GRAVE"/* 00C0 */, /*193*/"LATIN CAPITAL LETTER A WITH ACUTE"/* 00C1 */,/*194*/"LATIN CAPITAL LETTER A WITH CIRCUMFLEX"/* 00C2 */, /*195*/"LATIN CAPITAL LETTER A WITH TILDE"/* 00C3 */,/*196*/"LATIN CAPITAL LETTER A WITH DIAERESIS"/* 00C4 */, /*197*/"LATIN CAPITAL LETTER A WITH RING ABOVE"/* 00C5 */,/*198*/"LATIN CAPITAL LETTER AE"/* 00C6 */, /*199*/"LATIN CAPITAL LETTER C WITH CEDILLA"/* 00C7 */,/*200*/"LATIN CAPITAL LETTER E WITH GRAVE"/* 00C8 */, /*201*/"LATIN CAPITAL LETTER E WITH ACUTE"/* 00C9 */,/*202*/"LATIN CAPITAL LETTER E WITH CIRCUMFLEX"/* 00CA */, /*203*/"LATIN CAPITAL LETTER E WITH DIAERESIS"/* 00CB */,/*204*/"LATIN CAPITAL LETTER I WITH GRAVE"/* 00CC */, /*205*/"LATIN CAPITAL LETTER I WITH ACUTE"/* 00CD */,/*206*/"LATIN CAPITAL LETTER I WITH CIRCUMFLEX"/* 00CE */, /*207*/"LATIN CAPITAL LETTER I WITH DIAERESIS"/* 00CF */,/*208*/"LATIN CAPITAL LETTER ETH"/* 00D0 */, /*209*/"LATIN CAPITAL LETTER N WITH TILDE"/* 00D1 */,/*210*/"LATIN CAPITAL LETTER O WITH GRAVE"/* 00D2 */, /*211*/"LATIN CAPITAL LETTER O WITH ACUTE"/* 00D3 */,/*212*/"LATIN CAPITAL LETTER O WITH CIRCUMFLEX"/* 00D4 */, /*213*/"LATIN CAPITAL LETTER O WITH TILDE"/* 00D5 */,/*214*/"LATIN CAPITAL LETTER O WITH DIAERESIS"/* 00D6 */, /*215*/"MULTIPLICATION SIGN"/* 00D7 */,/*216*/"LATIN CAPITAL LETTER O WITH STROKE"/* 00D8 */, /*217*/"LATIN CAPITAL LETTER U WITH GRAVE"/* 00D9 */,/*218*/"LATIN CAPITAL LETTER U WITH ACUTE"/* 00DA */, /*219*/"LATIN CAPITAL LETTER U WITH CIRCUMFLEX"/* 00DB */,/*220*/"LATIN CAPITAL LETTER U WITH DIAERESIS"/* 00DC */, /*221*/"LATIN CAPITAL LETTER Y WITH ACUTE"/* 00DD */,/*222*/"LATIN CAPITAL LETTER THORN"/* 00DE */, /*223*/"LATIN SMALL LETTER SHARP S"/* 00DF */,/*224*/"LATIN SMALL LETTER A WITH GRAVE"/* 00E0 */, /*225*/"LATIN SMALL LETTER A WITH ACUTE"/* 00E1 */,/*226*/"LATIN SMALL LETTER A WITH CIRCUMFLEX"/* 00E2 */, /*227*/"LATIN SMALL LETTER A WITH TILDE"/* 00E3 */,/*228*/"LATIN SMALL LETTER A WITH DIAERESIS"/* 00E4 */, /*229*/"LATIN SMALL LETTER A WITH RING ABOVE"/* 00E5 */,/*230*/"LATIN SMALL LETTER AE"/* 00E6 */, /*231*/"LATIN SMALL LETTER C WITH CEDILLA"/* 00E7 */,/*232*/"LATIN SMALL LETTER E WITH GRAVE"/* 00E8 */, /*233*/"LATIN SMALL LETTER E WITH ACUTE"/* 00E9 */,/*234*/"LATIN SMALL LETTER E WITH CIRCUMFLEX"/* 00EA */, /*235*/"LATIN SMALL LETTER E WITH DIAERESIS"/* 00EB */,/*236*/"LATIN SMALL LETTER I WITH GRAVE"/* 00EC */, /*237*/"LATIN SMALL LETTER I WITH ACUTE"/* 00ED */,/*238*/"LATIN SMALL LETTER I WITH CIRCUMFLEX"/* 00EE */, /*239*/"LATIN SMALL LETTER I WITH DIAERESIS"/* 00EF */,/*240*/"LATIN SMALL LETTER ETH"/* 00F0 */, /*241*/"LATIN SMALL LETTER N WITH TILDE"/* 00F1 */,/*242*/"LATIN SMALL LETTER O WITH GRAVE"/* 00F2 */, /*243*/"LATIN SMALL LETTER O WITH ACUTE"/* 00F3 */,/*244*/"LATIN SMALL LETTER O WITH CIRCUMFLEX"/* 00F4 */, /*245*/"LATIN SMALL LETTER O WITH TILDE"/* 00F5 */,/*246*/"LATIN SMALL LETTER O WITH DIAERESIS"/* 00F6 */, /*247*/"DIVISION SIGN"/* 00F7 */,/*248*/"LATIN SMALL LETTER O WITH STROKE"/* 00F8 */, /*249*/"LATIN SMALL LETTER U WITH GRAVE"/* 00F9 */,/*250*/"LATIN SMALL LETTER U WITH ACUTE"/* 00FA */, /*251*/"LATIN SMALL LETTER U WITH CIRCUMFLEX"/* 00FB */,/*252*/"LATIN SMALL LETTER U WITH DIAERESIS"/* 00FC */, /*253*/"LATIN SMALL LETTER Y WITH ACUTE"/* 00FD */,/*254*/"LATIN SMALL LETTER THORN"/* 00FE */, /*255*/"LATIN SMALL LETTER Y WITH DIAERESIS"/* 00FF */,/*256*/"LATIN CAPITAL LETTER A WITH MACRON"/* 0100 */, /*257*/"LATIN SMALL LETTER A WITH MACRON"/* 0101 */,/*258*/"LATIN CAPITAL LETTER A WITH BREVE"/* 0102 */, /*259*/"LATIN SMALL LETTER A WITH BREVE"/* 0103 */,/*260*/"LATIN CAPITAL LETTER A WITH OGONEK"/* 0104 */, /*261*/"LATIN SMALL LETTER A WITH OGONEK"/* 0105 */,/*262*/"LATIN CAPITAL LETTER C WITH ACUTE"/* 0106 */, /*263*/"LATIN SMALL LETTER C WITH ACUTE"/* 0107 */,/*264*/"LATIN CAPITAL LETTER C WITH CIRCUMFLEX"/* 0108 */, /*265*/"LATIN SMALL LETTER C WITH CIRCUMFLEX"/* 0109 */,/*266*/"LATIN CAPITAL LETTER C WITH DOT ABOVE"/* 010A */, /*267*/"LATIN SMALL LETTER C WITH DOT ABOVE"/* 010B */,/*268*/"LATIN CAPITAL LETTER C WITH CARON"/* 010C */, /*269*/"LATIN SMALL LETTER C WITH CARON"/* 010D */,/*270*/"LATIN CAPITAL LETTER D WITH CARON"/* 010E */, /*271*/"LATIN SMALL LETTER D WITH CARON"/* 010F */,/*272*/"LATIN CAPITAL LETTER D WITH STROKE"/* 0110 */, /*273*/"LATIN SMALL LETTER D WITH STROKE"/* 0111 */,/*274*/"LATIN CAPITAL LETTER E WITH MACRON"/* 0112 */, /*275*/"LATIN SMALL LETTER E WITH MACRON"/* 0113 */,/*276*/"LATIN CAPITAL LETTER E WITH BREVE"/* 0114 */, /*277*/"LATIN SMALL LETTER E WITH BREVE"/* 0115 */,/*278*/"LATIN CAPITAL LETTER E WITH DOT ABOVE"/* 0116 */, /*279*/"LATIN SMALL LETTER E WITH DOT ABOVE"/* 0117 */,/*280*/"LATIN CAPITAL LETTER E WITH OGONEK"/* 0118 */, /*281*/"LATIN SMALL LETTER E WITH OGONEK"/* 0119 */,/*282*/"LATIN CAPITAL LETTER E WITH CARON"/* 011A */, /*283*/"LATIN SMALL LETTER E WITH CARON"/* 011B */,/*284*/"LATIN CAPITAL LETTER G WITH CIRCUMFLEX"/* 011C */, /*285*/"LATIN SMALL LETTER G WITH CIRCUMFLEX"/* 011D */,/*286*/"LATIN CAPITAL LETTER G WITH BREVE"/* 011E */, /*287*/"LATIN SMALL LETTER G WITH BREVE"/* 011F */,/*288*/"LATIN CAPITAL LETTER G WITH DOT ABOVE"/* 0120 */, /*289*/"LATIN SMALL LETTER G WITH DOT ABOVE"/* 0121 */,/*290*/"LATIN CAPITAL LETTER G WITH CEDILLA"/* 0122 */, /*291*/"LATIN SMALL LETTER G WITH CEDILLA"/* 0123 */,/*292*/"LATIN CAPITAL LETTER H WITH CIRCUMFLEX"/* 0124 */, /*293*/"LATIN SMALL LETTER H WITH CIRCUMFLEX"/* 0125 */,/*294*/"LATIN CAPITAL LETTER H WITH STROKE"/* 0126 */, /*295*/"LATIN SMALL LETTER H WITH STROKE"/* 0127 */,/*296*/"LATIN CAPITAL LETTER I WITH TILDE"/* 0128 */, /*297*/"LATIN SMALL LETTER I WITH TILDE"/* 0129 */,/*298*/"LATIN CAPITAL LETTER I WITH MACRON"/* 012A */, /*299*/"LATIN SMALL LETTER I WITH MACRON"/* 012B */,/*300*/"LATIN CAPITAL LETTER I WITH BREVE"/* 012C */, /*301*/"LATIN SMALL LETTER I WITH BREVE"/* 012D */,/*302*/"LATIN CAPITAL LETTER I WITH OGONEK"/* 012E */, /*303*/"LATIN SMALL LETTER I WITH OGONEK"/* 012F */,/*304*/"LATIN CAPITAL LETTER I WITH DOT ABOVE"/* 0130 */, /*305*/"LATIN SMALL LETTER DOTLESS I"/* 0131 */,/*306*/"LATIN CAPITAL LIGATURE IJ"/* 0132 */, /*307*/"LATIN SMALL LIGATURE IJ"/* 0133 */,/*308*/"LATIN CAPITAL LETTER J WITH CIRCUMFLEX"/* 0134 */, /*309*/"LATIN SMALL LETTER J WITH CIRCUMFLEX"/* 0135 */,/*310*/"LATIN CAPITAL LETTER K WITH CEDILLA"/* 0136 */, /*311*/"LATIN SMALL LETTER K WITH CEDILLA"/* 0137 */,/*312*/"LATIN SMALL LETTER KRA"/* 0138 */, /*313*/"LATIN CAPITAL LETTER L WITH ACUTE"/* 0139 */,/*314*/"LATIN SMALL LETTER L WITH ACUTE"/* 013A */, /*315*/"LATIN CAPITAL LETTER L WITH CEDILLA"/* 013B */,/*316*/"LATIN SMALL LETTER L WITH CEDILLA"/* 013C */, /*317*/"LATIN CAPITAL LETTER L WITH CARON"/* 013D */,/*318*/"LATIN SMALL LETTER L WITH CARON"/* 013E */, /*319*/"LATIN CAPITAL LETTER L WITH MIDDLE DOT"/* 013F */,/*320*/"LATIN SMALL LETTER L WITH MIDDLE DOT"/* 0140 */, /*321*/"LATIN CAPITAL LETTER L WITH STROKE"/* 0141 */,/*322*/"LATIN SMALL LETTER L WITH STROKE"/* 0142 */, /*323*/"LATIN CAPITAL LETTER N WITH ACUTE"/* 0143 */,/*324*/"LATIN SMALL LETTER N WITH ACUTE"/* 0144 */, /*325*/"LATIN CAPITAL LETTER N WITH CEDILLA"/* 0145 */,/*326*/"LATIN SMALL LETTER N WITH CEDILLA"/* 0146 */, /*327*/"LATIN CAPITAL LETTER N WITH CARON"/* 0147 */,/*328*/"LATIN SMALL LETTER N WITH CARON"/* 0148 */, /*329*/"LATIN SMALL LETTER N PRECEDED BY APOSTROPHE"/* 0149 */,/*330*/"LATIN CAPITAL LETTER ENG"/* 014A */, /*331*/"LATIN SMALL LETTER ENG"/* 014B */,/*332*/"LATIN CAPITAL LETTER O WITH MACRON"/* 014C */, /*333*/"LATIN SMALL LETTER O WITH MACRON"/* 014D */,/*334*/"LATIN CAPITAL LETTER O WITH BREVE"/* 014E */, /*335*/"LATIN SMALL LETTER O WITH BREVE"/* 014F */,/*336*/"LATIN CAPITAL LETTER O WITH DOUBLE ACUTE"/* 0150 */, /*337*/"LATIN SMALL LETTER O WITH DOUBLE ACUTE"/* 0151 */,/*338*/"LATIN CAPITAL LIGATURE OE"/* 0152 */, /*339*/"LATIN SMALL LIGATURE OE"/* 0153 */,/*340*/"LATIN CAPITAL LETTER R WITH ACUTE"/* 0154 */, /*341*/"LATIN SMALL LETTER R WITH ACUTE"/* 0155 */,/*342*/"LATIN CAPITAL LETTER R WITH CEDILLA"/* 0156 */, /*343*/"LATIN SMALL LETTER R WITH CEDILLA"/* 0157 */,/*344*/"LATIN CAPITAL LETTER R WITH CARON"/* 0158 */, /*345*/"LATIN SMALL LETTER R WITH CARON"/* 0159 */,/*346*/"LATIN CAPITAL LETTER S WITH ACUTE"/* 015A */, /*347*/"LATIN SMALL LETTER S WITH ACUTE"/* 015B */,/*348*/"LATIN CAPITAL LETTER S WITH CIRCUMFLEX"/* 015C */, /*349*/"LATIN SMALL LETTER S WITH CIRCUMFLEX"/* 015D */,/*350*/"LATIN CAPITAL LETTER S WITH CEDILLA"/* 015E */, /*351*/"LATIN SMALL LETTER S WITH CEDILLA"/* 015F */,/*352*/"LATIN CAPITAL LETTER S WITH CARON"/* 0160 */, /*353*/"LATIN SMALL LETTER S WITH CARON"/* 0161 */,/*354*/"LATIN CAPITAL LETTER T WITH CEDILLA"/* 0162 */, /*355*/"LATIN SMALL LETTER T WITH CEDILLA"/* 0163 */,/*356*/"LATIN CAPITAL LETTER T WITH CARON"/* 0164 */, /*357*/"LATIN SMALL LETTER T WITH CARON"/* 0165 */,/*358*/"LATIN CAPITAL LETTER T WITH STROKE"/* 0166 */, /*359*/"LATIN SMALL LETTER T WITH STROKE"/* 0167 */,/*360*/"LATIN CAPITAL LETTER U WITH TILDE"/* 0168 */, /*361*/"LATIN SMALL LETTER U WITH TILDE"/* 0169 */,/*362*/"LATIN CAPITAL LETTER U WITH MACRON"/* 016A */, /*363*/"LATIN SMALL LETTER U WITH MACRON"/* 016B */,/*364*/"LATIN CAPITAL LETTER U WITH BREVE"/* 016C */, /*365*/"LATIN SMALL LETTER U WITH BREVE"/* 016D */,/*366*/"LATIN CAPITAL LETTER U WITH RING ABOVE"/* 016E */, /*367*/"LATIN SMALL LETTER U WITH RING ABOVE"/* 016F */,/*368*/"LATIN CAPITAL LETTER U WITH DOUBLE ACUTE"/* 0170 */, /*369*/"LATIN SMALL LETTER U WITH DOUBLE ACUTE"/* 0171 */,/*370*/"LATIN CAPITAL LETTER U WITH OGONEK"/* 0172 */, /*371*/"LATIN SMALL LETTER U WITH OGONEK"/* 0173 */,/*372*/"LATIN CAPITAL LETTER W WITH CIRCUMFLEX"/* 0174 */, /*373*/"LATIN SMALL LETTER W WITH CIRCUMFLEX"/* 0175 */,/*374*/"LATIN CAPITAL LETTER Y WITH CIRCUMFLEX"/* 0176 */, /*375*/"LATIN SMALL LETTER Y WITH CIRCUMFLEX"/* 0177 */,/*376*/"LATIN CAPITAL LETTER Y WITH DIAERESIS"/* 0178 */, /*377*/"LATIN CAPITAL LETTER Z WITH ACUTE"/* 0179 */,/*378*/"LATIN SMALL LETTER Z WITH ACUTE"/* 017A */, /*379*/"LATIN CAPITAL LETTER Z WITH DOT ABOVE"/* 017B */,/*380*/"LATIN SMALL LETTER Z WITH DOT ABOVE"/* 017C */, /*381*/"LATIN CAPITAL LETTER Z WITH CARON"/* 017D */,/*382*/"LATIN SMALL LETTER Z WITH CARON"/* 017E */, /*383*/"LATIN SMALL LETTER LONG S"/* 017F */,/*384*/"LATIN SMALL LETTER B WITH STROKE"/* 0180 */, /*385*/"LATIN CAPITAL LETTER B WITH HOOK"/* 0181 */,/*386*/"LATIN CAPITAL LETTER B WITH TOPBAR"/* 0182 */, /*387*/"LATIN SMALL LETTER B WITH TOPBAR"/* 0183 */,/*388*/"LATIN CAPITAL LETTER TONE SIX"/* 0184 */, /*389*/"LATIN SMALL LETTER TONE SIX"/* 0185 */,/*390*/"LATIN CAPITAL LETTER OPEN O"/* 0186 */, /*391*/"LATIN CAPITAL LETTER C WITH HOOK"/* 0187 */,/*392*/"LATIN SMALL LETTER C WITH HOOK"/* 0188 */, /*393*/"LATIN CAPITAL LETTER AFRICAN D"/* 0189 */,/*394*/"LATIN CAPITAL LETTER D WITH HOOK"/* 018A */, /*395*/"LATIN CAPITAL LETTER D WITH TOPBAR"/* 018B */,/*396*/"LATIN SMALL LETTER D WITH TOPBAR"/* 018C */, /*397*/"LATIN SMALL LETTER TURNED DELTA"/* 018D */,/*398*/"LATIN CAPITAL LETTER REVERSED E"/* 018E */, /*399*/"LATIN CAPITAL LETTER SCHWA"/* 018F */,/*400*/"LATIN CAPITAL LETTER OPEN E"/* 0190 */, /*401*/"LATIN CAPITAL LETTER F WITH HOOK"/* 0191 */,/*402*/"LATIN SMALL LETTER F WITH HOOK"/* 0192 */, /*403*/"LATIN CAPITAL LETTER G WITH HOOK"/* 0193 */,/*404*/"LATIN CAPITAL LETTER GAMMA"/* 0194 */, /*405*/"LATIN SMALL LETTER HV"/* 0195 */,/*406*/"LATIN CAPITAL LETTER IOTA"/* 0196 */, /*407*/"LATIN CAPITAL LETTER I WITH STROKE"/* 0197 */,/*408*/"LATIN CAPITAL LETTER K WITH HOOK"/* 0198 */, /*409*/"LATIN SMALL LETTER K WITH HOOK"/* 0199 */,/*410*/"LATIN SMALL LETTER L WITH BAR"/* 019A */, /*411*/"LATIN SMALL LETTER LAMBDA WITH STROKE"/* 019B */,/*412*/"LATIN CAPITAL LETTER TURNED M"/* 019C */, /*413*/"LATIN CAPITAL LETTER N WITH LEFT HOOK"/* 019D */,/*414*/"LATIN SMALL LETTER N WITH LONG RIGHT LEG"/* 019E */, /*415*/"LATIN CAPITAL LETTER O WITH MIDDLE TILDE"/* 019F */,/*416*/"LATIN CAPITAL LETTER O WITH HORN"/* 01A0 */, /*417*/"LATIN SMALL LETTER O WITH HORN"/* 01A1 */,/*418*/"LATIN CAPITAL LETTER OI"/* 01A2 */, /*419*/"LATIN SMALL LETTER OI"/* 01A3 */,/*420*/"LATIN CAPITAL LETTER P WITH HOOK"/* 01A4 */, /*421*/"LATIN SMALL LETTER P WITH HOOK"/* 01A5 */,/*422*/"LATIN LETTER YR"/* 01A6 */, /*423*/"LATIN CAPITAL LETTER TONE TWO"/* 01A7 */,/*424*/"LATIN SMALL LETTER TONE TWO"/* 01A8 */, /*425*/"LATIN CAPITAL LETTER ESH"/* 01A9 */,/*426*/"LATIN LETTER REVERSED ESH LOOP"/* 01AA */, /*427*/"LATIN SMALL LETTER T WITH PALATAL HOOK"/* 01AB */,/*428*/"LATIN CAPITAL LETTER T WITH HOOK"/* 01AC */, /*429*/"LATIN SMALL LETTER T WITH HOOK"/* 01AD */,/*430*/"LATIN CAPITAL LETTER T WITH RETROFLEX HOOK"/* 01AE */, /*431*/"LATIN CAPITAL LETTER U WITH HORN"/* 01AF */,/*432*/"LATIN SMALL LETTER U WITH HORN"/* 01B0 */, /*433*/"LATIN CAPITAL LETTER UPSILON"/* 01B1 */,/*434*/"LATIN CAPITAL LETTER V WITH HOOK"/* 01B2 */, /*435*/"LATIN CAPITAL LETTER Y WITH HOOK"/* 01B3 */,/*436*/"LATIN SMALL LETTER Y WITH HOOK"/* 01B4 */, /*437*/"LATIN CAPITAL LETTER Z WITH STROKE"/* 01B5 */,/*438*/"LATIN SMALL LETTER Z WITH STROKE"/* 01B6 */, /*439*/"LATIN CAPITAL LETTER EZH"/* 01B7 */,/*440*/"LATIN CAPITAL LETTER EZH REVERSED"/* 01B8 */, /*441*/"LATIN SMALL LETTER EZH REVERSED"/* 01B9 */,/*442*/"LATIN SMALL LETTER EZH WITH TAIL"/* 01BA */, /*443*/"LATIN LETTER TWO WITH STROKE"/* 01BB */,/*444*/"LATIN CAPITAL LETTER TONE FIVE"/* 01BC */, /*445*/"LATIN SMALL LETTER TONE FIVE"/* 01BD */,/*446*/"LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE"/* 01BE */, /*447*/"LATIN LETTER WYNN"/* 01BF */,/*448*/"LATIN LETTER DENTAL CLICK"/* 01C0 */, /*449*/"LATIN LETTER LATERAL CLICK"/* 01C1 */,/*450*/"LATIN LETTER ALVEOLAR CLICK"/* 01C2 */, /*451*/"LATIN LETTER RETROFLEX CLICK"/* 01C3 */,/*452*/"LATIN CAPITAL LETTER DZ WITH CARON"/* 01C4 */, /*453*/"LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON"/* 01C5 */, /*454*/"LATIN SMALL LETTER DZ WITH CARON"/* 01C6 */,/*455*/"LATIN CAPITAL LETTER LJ"/* 01C7 */, /*456*/"LATIN CAPITAL LETTER L WITH SMALL LETTER J"/* 01C8 */,/*457*/"LATIN SMALL LETTER LJ"/* 01C9 */, /*458*/"LATIN CAPITAL LETTER NJ"/* 01CA */,/*459*/"LATIN CAPITAL LETTER N WITH SMALL LETTER J"/* 01CB */, /*460*/"LATIN SMALL LETTER NJ"/* 01CC */,/*461*/"LATIN CAPITAL LETTER A WITH CARON"/* 01CD */, /*462*/"LATIN SMALL LETTER A WITH CARON"/* 01CE */,/*463*/"LATIN CAPITAL LETTER I WITH CARON"/* 01CF */, /*464*/"LATIN SMALL LETTER I WITH CARON"/* 01D0 */,/*465*/"LATIN CAPITAL LETTER O WITH CARON"/* 01D1 */, /*466*/"LATIN SMALL LETTER O WITH CARON"/* 01D2 */,/*467*/"LATIN CAPITAL LETTER U WITH CARON"/* 01D3 */, /*468*/"LATIN SMALL LETTER U WITH CARON"/* 01D4 */,/*469*/"LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON"/* 01D5 */, /*470*/"LATIN SMALL LETTER U WITH DIAERESIS AND MACRON"/* 01D6 */, /*471*/"LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE"/* 01D7 */, /*472*/"LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE"/* 01D8 */, /*473*/"LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON"/* 01D9 */, /*474*/"LATIN SMALL LETTER U WITH DIAERESIS AND CARON"/* 01DA */, /*475*/"LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE"/* 01DB */, /*476*/"LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE"/* 01DC */,/*477*/"LATIN SMALL LETTER TURNED E"/* 01DD */, /*478*/"LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON"/* 01DE */, /*479*/"LATIN SMALL LETTER A WITH DIAERESIS AND MACRON"/* 01DF */, /*480*/"LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON"/* 01E0 */, /*481*/"LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON"/* 01E1 */,/*482*/"LATIN CAPITAL LETTER AE WITH MACRON"/* 01E2 */, /*483*/"LATIN SMALL LETTER AE WITH MACRON"/* 01E3 */,/*484*/"LATIN CAPITAL LETTER G WITH STROKE"/* 01E4 */, /*485*/"LATIN SMALL LETTER G WITH STROKE"/* 01E5 */,/*486*/"LATIN CAPITAL LETTER G WITH CARON"/* 01E6 */, /*487*/"LATIN SMALL LETTER G WITH CARON"/* 01E7 */,/*488*/"LATIN CAPITAL LETTER K WITH CARON"/* 01E8 */, /*489*/"LATIN SMALL LETTER K WITH CARON"/* 01E9 */,/*490*/"LATIN CAPITAL LETTER O WITH OGONEK"/* 01EA */, /*491*/"LATIN SMALL LETTER O WITH OGONEK"/* 01EB */,/*492*/"LATIN CAPITAL LETTER O WITH OGONEK AND MACRON"/* 01EC */, /*493*/"LATIN SMALL LETTER O WITH OGONEK AND MACRON"/* 01ED */,/*494*/"LATIN CAPITAL LETTER EZH WITH CARON"/* 01EE */, /*495*/"LATIN SMALL LETTER EZH WITH CARON"/* 01EF */,/*496*/"LATIN SMALL LETTER J WITH CARON"/* 01F0 */, /*497*/"LATIN CAPITAL LETTER DZ"/* 01F1 */,/*498*/"LATIN CAPITAL LETTER D WITH SMALL LETTER Z"/* 01F2 */, /*499*/"LATIN SMALL LETTER DZ"/* 01F3 */,/*500*/"LATIN CAPITAL LETTER G WITH ACUTE"/* 01F4 */, /*501*/"LATIN SMALL LETTER G WITH ACUTE"/* 01F5 */,/*502*/"LATIN CAPITAL LETTER HWAIR"/* 01F6 */, /*503*/"LATIN CAPITAL LETTER WYNN"/* 01F7 */,/*504*/"LATIN CAPITAL LETTER N WITH GRAVE"/* 01F8 */, /*505*/"LATIN SMALL LETTER N WITH GRAVE"/* 01F9 */,/*506*/"LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE"/* 01FA */, /*507*/"LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE"/* 01FB */,/*508*/"LATIN CAPITAL LETTER AE WITH ACUTE"/* 01FC */, /*509*/"LATIN SMALL LETTER AE WITH ACUTE"/* 01FD */,/*510*/"LATIN CAPITAL LETTER O WITH STROKE AND ACUTE"/* 01FE */, /*511*/"LATIN SMALL LETTER O WITH STROKE AND ACUTE"/* 01FF */, /*512*/"LATIN CAPITAL LETTER A WITH DOUBLE GRAVE"/* 0200 */,/*513*/"LATIN SMALL LETTER A WITH DOUBLE GRAVE"/* 0201 */, /*514*/"LATIN CAPITAL LETTER A WITH INVERTED BREVE"/* 0202 */, /*515*/"LATIN SMALL LETTER A WITH INVERTED BREVE"/* 0203 */,/*516*/"LATIN CAPITAL LETTER E WITH DOUBLE GRAVE"/* 0204 */, /*517*/"LATIN SMALL LETTER E WITH DOUBLE GRAVE"/* 0205 */,/*518*/"LATIN CAPITAL LETTER E WITH INVERTED BREVE"/* 0206 */, /*519*/"LATIN SMALL LETTER E WITH INVERTED BREVE"/* 0207 */,/*520*/"LATIN CAPITAL LETTER I WITH DOUBLE GRAVE"/* 0208 */, /*521*/"LATIN SMALL LETTER I WITH DOUBLE GRAVE"/* 0209 */,/*522*/"LATIN CAPITAL LETTER I WITH INVERTED BREVE"/* 020A */, /*523*/"LATIN SMALL LETTER I WITH INVERTED BREVE"/* 020B */,/*524*/"LATIN CAPITAL LETTER O WITH DOUBLE GRAVE"/* 020C */, /*525*/"LATIN SMALL LETTER O WITH DOUBLE GRAVE"/* 020D */,/*526*/"LATIN CAPITAL LETTER O WITH INVERTED BREVE"/* 020E */, /*527*/"LATIN SMALL LETTER O WITH INVERTED BREVE"/* 020F */,/*528*/"LATIN CAPITAL LETTER R WITH DOUBLE GRAVE"/* 0210 */, /*529*/"LATIN SMALL LETTER R WITH DOUBLE GRAVE"/* 0211 */,/*530*/"LATIN CAPITAL LETTER R WITH INVERTED BREVE"/* 0212 */, /*531*/"LATIN SMALL LETTER R WITH INVERTED BREVE"/* 0213 */,/*532*/"LATIN CAPITAL LETTER U WITH DOUBLE GRAVE"/* 0214 */, /*533*/"LATIN SMALL LETTER U WITH DOUBLE GRAVE"/* 0215 */,/*534*/"LATIN CAPITAL LETTER U WITH INVERTED BREVE"/* 0216 */, /*535*/"LATIN SMALL LETTER U WITH INVERTED BREVE"/* 0217 */,/*536*/"LATIN CAPITAL LETTER S WITH COMMA BELOW"/* 0218 */, /*537*/"LATIN SMALL LETTER S WITH COMMA BELOW"/* 0219 */,/*538*/"LATIN CAPITAL LETTER T WITH COMMA BELOW"/* 021A */, /*539*/"LATIN SMALL LETTER T WITH COMMA BELOW"/* 021B */,/*540*/"LATIN CAPITAL LETTER YOGH"/* 021C */, /*541*/"LATIN SMALL LETTER YOGH"/* 021D */,/*542*/"LATIN CAPITAL LETTER H WITH CARON"/* 021E */, /*543*/"LATIN SMALL LETTER H WITH CARON"/* 021F */,/*544*/"LATIN CAPITAL LETTER N WITH LONG RIGHT LEG"/* 0220 */, /*545*/"LATIN SMALL LETTER D WITH CURL"/* 0221 */,/*546*/"LATIN CAPITAL LETTER OU"/* 0222 */, /*547*/"LATIN SMALL LETTER OU"/* 0223 */,/*548*/"LATIN CAPITAL LETTER Z WITH HOOK"/* 0224 */, /*549*/"LATIN SMALL LETTER Z WITH HOOK"/* 0225 */,/*550*/"LATIN CAPITAL LETTER A WITH DOT ABOVE"/* 0226 */, /*551*/"LATIN SMALL LETTER A WITH DOT ABOVE"/* 0227 */,/*552*/"LATIN CAPITAL LETTER E WITH CEDILLA"/* 0228 */, /*553*/"LATIN SMALL LETTER E WITH CEDILLA"/* 0229 */,/*554*/"LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON"/* 022A */, /*555*/"LATIN SMALL LETTER O WITH DIAERESIS AND MACRON"/* 022B */, /*556*/"LATIN CAPITAL LETTER O WITH TILDE AND MACRON"/* 022C */, /*557*/"LATIN SMALL LETTER O WITH TILDE AND MACRON"/* 022D */,/*558*/"LATIN CAPITAL LETTER O WITH DOT ABOVE"/* 022E */, /*559*/"LATIN SMALL LETTER O WITH DOT ABOVE"/* 022F */, /*560*/"LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON"/* 0230 */, /*561*/"LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON"/* 0231 */,/*562*/"LATIN CAPITAL LETTER Y WITH MACRON"/* 0232 */, /*563*/"LATIN SMALL LETTER Y WITH MACRON"/* 0233 */,/*564*/"LATIN SMALL LETTER L WITH CURL"/* 0234 */, /*565*/"LATIN SMALL LETTER N WITH CURL"/* 0235 */,/*566*/"LATIN SMALL LETTER T WITH CURL"/* 0236 */, /*567*/"LATIN SMALL LETTER DOTLESS J"/* 0237 */,/*568*/"LATIN SMALL LETTER DB DIGRAPH"/* 0238 */, /*569*/"LATIN SMALL LETTER QP DIGRAPH"/* 0239 */,/*570*/"LATIN CAPITAL LETTER A WITH STROKE"/* 023A */, /*571*/"LATIN CAPITAL LETTER C WITH STROKE"/* 023B */,/*572*/"LATIN SMALL LETTER C WITH STROKE"/* 023C */, /*573*/"LATIN CAPITAL LETTER L WITH BAR"/* 023D */,/*574*/"LATIN CAPITAL LETTER T WITH DIAGONAL STROKE"/* 023E */, /*575*/"LATIN SMALL LETTER S WITH SWASH TAIL"/* 023F */,/*576*/"LATIN SMALL LETTER Z WITH SWASH TAIL"/* 0240 */, /*577*/"LATIN CAPITAL LETTER GLOTTAL STOP"/* 0241 */,/*578*/"LATIN SMALL LETTER GLOTTAL STOP"/* 0242 */, /*579*/"LATIN CAPITAL LETTER B WITH STROKE"/* 0243 */,/*580*/"LATIN CAPITAL LETTER U BAR"/* 0244 */, /*581*/"LATIN CAPITAL LETTER TURNED V"/* 0245 */,/*582*/"LATIN CAPITAL LETTER E WITH STROKE"/* 0246 */, /*583*/"LATIN SMALL LETTER E WITH STROKE"/* 0247 */,/*584*/"LATIN CAPITAL LETTER J WITH STROKE"/* 0248 */, /*585*/"LATIN SMALL LETTER J WITH STROKE"/* 0249 */,/*586*/"LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL"/* 024A */, /*587*/"LATIN SMALL LETTER Q WITH HOOK TAIL"/* 024B */,/*588*/"LATIN CAPITAL LETTER R WITH STROKE"/* 024C */, /*589*/"LATIN SMALL LETTER R WITH STROKE"/* 024D */,/*590*/"LATIN CAPITAL LETTER Y WITH STROKE"/* 024E */, /*591*/"LATIN SMALL LETTER Y WITH STROKE"/* 024F */,/*592*/"LATIN SMALL LETTER TURNED A"/* 0250 */, /*593*/"LATIN SMALL LETTER ALPHA"/* 0251 */,/*594*/"LATIN SMALL LETTER TURNED ALPHA"/* 0252 */, /*595*/"LATIN SMALL LETTER B WITH HOOK"/* 0253 */,/*596*/"LATIN SMALL LETTER OPEN O"/* 0254 */, /*597*/"LATIN SMALL LETTER C WITH CURL"/* 0255 */,/*598*/"LATIN SMALL LETTER D WITH TAIL"/* 0256 */, /*599*/"LATIN SMALL LETTER D WITH HOOK"/* 0257 */,/*600*/"LATIN SMALL LETTER REVERSED E"/* 0258 */, /*601*/"LATIN SMALL LETTER SCHWA"/* 0259 */,/*602*/"LATIN SMALL LETTER SCHWA WITH HOOK"/* 025A */, /*603*/"LATIN SMALL LETTER OPEN E"/* 025B */,/*604*/"LATIN SMALL LETTER REVERSED OPEN E"/* 025C */, /*605*/"LATIN SMALL LETTER REVERSED OPEN E WITH HOOK"/* 025D */, /*606*/"LATIN SMALL LETTER CLOSED REVERSED OPEN E"/* 025E */,/*607*/"LATIN SMALL LETTER DOTLESS J WITH STROKE"/* 025F */, /*608*/"LATIN SMALL LETTER G WITH HOOK"/* 0260 */,/*609*/"LATIN SMALL LETTER SCRIPT G"/* 0261 */, /*610*/"LATIN LETTER SMALL CAPITAL G"/* 0262 */,/*611*/"LATIN SMALL LETTER GAMMA"/* 0263 */, /*612*/"LATIN SMALL LETTER RAMS HORN"/* 0264 */,/*613*/"LATIN SMALL LETTER TURNED H"/* 0265 */, /*614*/"LATIN SMALL LETTER H WITH HOOK"/* 0266 */,/*615*/"LATIN SMALL LETTER HENG WITH HOOK"/* 0267 */, /*616*/"LATIN SMALL LETTER I WITH STROKE"/* 0268 */,/*617*/"LATIN SMALL LETTER IOTA"/* 0269 */, /*618*/"LATIN LETTER SMALL CAPITAL I"/* 026A */,/*619*/"LATIN SMALL LETTER L WITH MIDDLE TILDE"/* 026B */, /*620*/"LATIN SMALL LETTER L WITH BELT"/* 026C */,/*621*/"LATIN SMALL LETTER L WITH RETROFLEX HOOK"/* 026D */, /*622*/"LATIN SMALL LETTER LEZH"/* 026E */,/*623*/"LATIN SMALL LETTER TURNED M"/* 026F */, /*624*/"LATIN SMALL LETTER TURNED M WITH LONG LEG"/* 0270 */,/*625*/"LATIN SMALL LETTER M WITH HOOK"/* 0271 */, /*626*/"LATIN SMALL LETTER N WITH LEFT HOOK"/* 0272 */,/*627*/"LATIN SMALL LETTER N WITH RETROFLEX HOOK"/* 0273 */, /*628*/"LATIN LETTER SMALL CAPITAL N"/* 0274 */,/*629*/"LATIN SMALL LETTER BARRED O"/* 0275 */, /*630*/"LATIN LETTER SMALL CAPITAL OE"/* 0276 */,/*631*/"LATIN SMALL LETTER CLOSED OMEGA"/* 0277 */, /*632*/"LATIN SMALL LETTER PHI"/* 0278 */,/*633*/"LATIN SMALL LETTER TURNED R"/* 0279 */, /*634*/"LATIN SMALL LETTER TURNED R WITH LONG LEG"/* 027A */,/*635*/"LATIN SMALL LETTER TURNED R WITH HOOK"/* 027B */, /*636*/"LATIN SMALL LETTER R WITH LONG LEG"/* 027C */,/*637*/"LATIN SMALL LETTER R WITH TAIL"/* 027D */, /*638*/"LATIN SMALL LETTER R WITH FISHHOOK"/* 027E */,/*639*/"LATIN SMALL LETTER REVERSED R WITH FISHHOOK"/* 027F */, /*640*/"LATIN LETTER SMALL CAPITAL R"/* 0280 */,/*641*/"LATIN LETTER SMALL CAPITAL INVERTED R"/* 0281 */, /*642*/"LATIN SMALL LETTER S WITH HOOK"/* 0282 */,/*643*/"LATIN SMALL LETTER ESH"/* 0283 */, /*644*/"LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK"/* 0284 */, /*645*/"LATIN SMALL LETTER SQUAT REVERSED ESH"/* 0285 */,/*646*/"LATIN SMALL LETTER ESH WITH CURL"/* 0286 */, /*647*/"LATIN SMALL LETTER TURNED T"/* 0287 */,/*648*/"LATIN SMALL LETTER T WITH RETROFLEX HOOK"/* 0288 */, /*649*/"LATIN SMALL LETTER U BAR"/* 0289 */,/*650*/"LATIN SMALL LETTER UPSILON"/* 028A */, /*651*/"LATIN SMALL LETTER V WITH HOOK"/* 028B */,/*652*/"LATIN SMALL LETTER TURNED V"/* 028C */, /*653*/"LATIN SMALL LETTER TURNED W"/* 028D */,/*654*/"LATIN SMALL LETTER TURNED Y"/* 028E */, /*655*/"LATIN LETTER SMALL CAPITAL Y"/* 028F */,/*656*/"LATIN SMALL LETTER Z WITH RETROFLEX HOOK"/* 0290 */, /*657*/"LATIN SMALL LETTER Z WITH CURL"/* 0291 */,/*658*/"LATIN SMALL LETTER EZH"/* 0292 */, /*659*/"LATIN SMALL LETTER EZH WITH CURL"/* 0293 */,/*660*/"LATIN LETTER GLOTTAL STOP"/* 0294 */, /*661*/"LATIN LETTER PHARYNGEAL VOICED FRICATIVE"/* 0295 */,/*662*/"LATIN LETTER INVERTED GLOTTAL STOP"/* 0296 */, /*663*/"LATIN LETTER STRETCHED C"/* 0297 */,/*664*/"LATIN LETTER BILABIAL CLICK"/* 0298 */, /*665*/"LATIN LETTER SMALL CAPITAL B"/* 0299 */,/*666*/"LATIN SMALL LETTER CLOSED OPEN E"/* 029A */, /*667*/"LATIN LETTER SMALL CAPITAL G WITH HOOK"/* 029B */,/*668*/"LATIN LETTER SMALL CAPITAL H"/* 029C */, /*669*/"LATIN SMALL LETTER J WITH CROSSED-TAIL"/* 029D */,/*670*/"LATIN SMALL LETTER TURNED K"/* 029E */, /*671*/"LATIN LETTER SMALL CAPITAL L"/* 029F */,/*672*/"LATIN SMALL LETTER Q WITH HOOK"/* 02A0 */, /*673*/"LATIN LETTER GLOTTAL STOP WITH STROKE"/* 02A1 */, /*674*/"LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE"/* 02A2 */,/*675*/"LATIN SMALL LETTER DZ DIGRAPH"/* 02A3 */, /*676*/"LATIN SMALL LETTER DEZH DIGRAPH"/* 02A4 */,/*677*/"LATIN SMALL LETTER DZ DIGRAPH WITH CURL"/* 02A5 */, /*678*/"LATIN SMALL LETTER TS DIGRAPH"/* 02A6 */,/*679*/"LATIN SMALL LETTER TESH DIGRAPH"/* 02A7 */, /*680*/"LATIN SMALL LETTER TC DIGRAPH WITH CURL"/* 02A8 */,/*681*/"LATIN SMALL LETTER FENG DIGRAPH"/* 02A9 */, /*682*/"LATIN SMALL LETTER LS DIGRAPH"/* 02AA */,/*683*/"LATIN SMALL LETTER LZ DIGRAPH"/* 02AB */, /*684*/"LATIN LETTER BILABIAL PERCUSSIVE"/* 02AC */,/*685*/"LATIN LETTER BIDENTAL PERCUSSIVE"/* 02AD */, /*686*/"LATIN SMALL LETTER TURNED H WITH FISHHOOK"/* 02AE */, /*687*/"LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL"/* 02AF */,/*688*/"MODIFIER LETTER SMALL H"/* 02B0 */, /*689*/"MODIFIER LETTER SMALL H WITH HOOK"/* 02B1 */,/*690*/"MODIFIER LETTER SMALL J"/* 02B2 */, /*691*/"MODIFIER LETTER SMALL R"/* 02B3 */,/*692*/"MODIFIER LETTER SMALL TURNED R"/* 02B4 */, /*693*/"MODIFIER LETTER SMALL TURNED R WITH HOOK"/* 02B5 */,/*694*/"MODIFIER LETTER SMALL CAPITAL INVERTED R"/* 02B6 */, /*695*/"MODIFIER LETTER SMALL W"/* 02B7 */,/*696*/"MODIFIER LETTER SMALL Y"/* 02B8 */, /*697*/"MODIFIER LETTER PRIME"/* 02B9 */,/*698*/"MODIFIER LETTER DOUBLE PRIME"/* 02BA */, /*699*/"MODIFIER LETTER TURNED COMMA"/* 02BB */,/*700*/"MODIFIER LETTER APOSTROPHE"/* 02BC */, /*701*/"MODIFIER LETTER REVERSED COMMA"/* 02BD */,/*702*/"MODIFIER LETTER RIGHT HALF RING"/* 02BE */, /*703*/"MODIFIER LETTER LEFT HALF RING"/* 02BF */,/*704*/"MODIFIER LETTER GLOTTAL STOP"/* 02C0 */, /*705*/"MODIFIER LETTER REVERSED GLOTTAL STOP"/* 02C1 */,/*706*/"MODIFIER LETTER LEFT ARROWHEAD"/* 02C2 */, /*707*/"MODIFIER LETTER RIGHT ARROWHEAD"/* 02C3 */,/*708*/"MODIFIER LETTER UP ARROWHEAD"/* 02C4 */, /*709*/"MODIFIER LETTER DOWN ARROWHEAD"/* 02C5 */,/*710*/"MODIFIER LETTER CIRCUMFLEX ACCENT"/* 02C6 */, /*711*/"CARON"/* 02C7 */,/*712*/"MODIFIER LETTER VERTICAL LINE"/* 02C8 */,/*713*/"MODIFIER LETTER MACRON"/* 02C9 */, /*714*/"MODIFIER LETTER ACUTE ACCENT"/* 02CA */,/*715*/"MODIFIER LETTER GRAVE ACCENT"/* 02CB */, /*716*/"MODIFIER LETTER LOW VERTICAL LINE"/* 02CC */,/*717*/"MODIFIER LETTER LOW MACRON"/* 02CD */, /*718*/"MODIFIER LETTER LOW GRAVE ACCENT"/* 02CE */,/*719*/"MODIFIER LETTER LOW ACUTE ACCENT"/* 02CF */, /*720*/"MODIFIER LETTER TRIANGULAR COLON"/* 02D0 */,/*721*/"MODIFIER LETTER HALF TRIANGULAR COLON"/* 02D1 */, /*722*/"MODIFIER LETTER CENTRED RIGHT HALF RING"/* 02D2 */,/*723*/"MODIFIER LETTER CENTRED LEFT HALF RING"/* 02D3 */, /*724*/"MODIFIER LETTER UP TACK"/* 02D4 */,/*725*/"MODIFIER LETTER DOWN TACK"/* 02D5 */, /*726*/"MODIFIER LETTER PLUS SIGN"/* 02D6 */,/*727*/"MODIFIER LETTER MINUS SIGN"/* 02D7 */,/*728*/"BREVE"/* 02D8 */, /*729*/"DOT ABOVE"/* 02D9 */,/*730*/"RING ABOVE"/* 02DA */,/*731*/"OGONEK"/* 02DB */,/*732*/"SMALL TILDE"/* 02DC */, /*733*/"DOUBLE ACUTE ACCENT"/* 02DD */,/*734*/"MODIFIER LETTER RHOTIC HOOK"/* 02DE */, /*735*/"MODIFIER LETTER CROSS ACCENT"/* 02DF */,/*736*/"MODIFIER LETTER SMALL GAMMA"/* 02E0 */, /*737*/"MODIFIER LETTER SMALL L"/* 02E1 */,/*738*/"MODIFIER LETTER SMALL S"/* 02E2 */, /*739*/"MODIFIER LETTER SMALL X"/* 02E3 */,/*740*/"MODIFIER LETTER SMALL REVERSED GLOTTAL STOP"/* 02E4 */, /*741*/"MODIFIER LETTER EXTRA-HIGH TONE BAR"/* 02E5 */,/*742*/"MODIFIER LETTER HIGH TONE BAR"/* 02E6 */, /*743*/"MODIFIER LETTER MID TONE BAR"/* 02E7 */,/*744*/"MODIFIER LETTER LOW TONE BAR"/* 02E8 */, /*745*/"MODIFIER LETTER EXTRA-LOW TONE BAR"/* 02E9 */,/*746*/"MODIFIER LETTER YIN DEPARTING TONE MARK"/* 02EA */, /*747*/"MODIFIER LETTER YANG DEPARTING TONE MARK"/* 02EB */,/*748*/"MODIFIER LETTER VOICING"/* 02EC */, /*749*/"MODIFIER LETTER UNASPIRATED"/* 02ED */,/*750*/"MODIFIER LETTER DOUBLE APOSTROPHE"/* 02EE */, /*751*/"MODIFIER LETTER LOW DOWN ARROWHEAD"/* 02EF */,/*752*/"MODIFIER LETTER LOW UP ARROWHEAD"/* 02F0 */, /*753*/"MODIFIER LETTER LOW LEFT ARROWHEAD"/* 02F1 */,/*754*/"MODIFIER LETTER LOW RIGHT ARROWHEAD"/* 02F2 */, /*755*/"MODIFIER LETTER LOW RING"/* 02F3 */,/*756*/"MODIFIER LETTER MIDDLE GRAVE ACCENT"/* 02F4 */, /*757*/"MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT"/* 02F5 */, /*758*/"MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT"/* 02F6 */,/*759*/"MODIFIER LETTER LOW TILDE"/* 02F7 */, /*760*/"MODIFIER LETTER RAISED COLON"/* 02F8 */,/*761*/"MODIFIER LETTER BEGIN HIGH TONE"/* 02F9 */, /*762*/"MODIFIER LETTER END HIGH TONE"/* 02FA */,/*763*/"MODIFIER LETTER BEGIN LOW TONE"/* 02FB */, /*764*/"MODIFIER LETTER END LOW TONE"/* 02FC */,/*765*/"MODIFIER LETTER SHELF"/* 02FD */, /*766*/"MODIFIER LETTER OPEN SHELF"/* 02FE */,/*767*/"MODIFIER LETTER LOW LEFT ARROW"/* 02FF */, /*768*/"COMBINING GRAVE ACCENT"/* 0300 */,/*769*/"COMBINING ACUTE ACCENT"/* 0301 */, /*770*/"COMBINING CIRCUMFLEX ACCENT"/* 0302 */,/*771*/"COMBINING TILDE"/* 0303 */,/*772*/"COMBINING MACRON"/* 0304 */, /*773*/"COMBINING OVERLINE"/* 0305 */,/*774*/"COMBINING BREVE"/* 0306 */,/*775*/"COMBINING DOT ABOVE"/* 0307 */, /*776*/"COMBINING DIAERESIS"/* 0308 */,/*777*/"COMBINING HOOK ABOVE"/* 0309 */,/*778*/"COMBINING RING ABOVE"/* 030A */, /*779*/"COMBINING DOUBLE ACUTE ACCENT"/* 030B */,/*780*/"COMBINING CARON"/* 030C */, /*781*/"COMBINING VERTICAL LINE ABOVE"/* 030D */,/*782*/"COMBINING DOUBLE VERTICAL LINE ABOVE"/* 030E */, /*783*/"COMBINING DOUBLE GRAVE ACCENT"/* 030F */,/*784*/"COMBINING CANDRABINDU"/* 0310 */, /*785*/"COMBINING INVERTED BREVE"/* 0311 */,/*786*/"COMBINING TURNED COMMA ABOVE"/* 0312 */, /*787*/"COMBINING COMMA ABOVE"/* 0313 */,/*788*/"COMBINING REVERSED COMMA ABOVE"/* 0314 */, /*789*/"COMBINING COMMA ABOVE RIGHT"/* 0315 */,/*790*/"COMBINING GRAVE ACCENT BELOW"/* 0316 */, /*791*/"COMBINING ACUTE ACCENT BELOW"/* 0317 */,/*792*/"COMBINING LEFT TACK BELOW"/* 0318 */, /*793*/"COMBINING RIGHT TACK BELOW"/* 0319 */,/*794*/"COMBINING LEFT ANGLE ABOVE"/* 031A */, /*795*/"COMBINING HORN"/* 031B */,/*796*/"COMBINING LEFT HALF RING BELOW"/* 031C */, /*797*/"COMBINING UP TACK BELOW"/* 031D */,/*798*/"COMBINING DOWN TACK BELOW"/* 031E */, /*799*/"COMBINING PLUS SIGN BELOW"/* 031F */,/*800*/"COMBINING MINUS SIGN BELOW"/* 0320 */, /*801*/"COMBINING PALATALIZED HOOK BELOW"/* 0321 */,/*802*/"COMBINING RETROFLEX HOOK BELOW"/* 0322 */, /*803*/"COMBINING DOT BELOW"/* 0323 */,/*804*/"COMBINING DIAERESIS BELOW"/* 0324 */, /*805*/"COMBINING RING BELOW"/* 0325 */,/*806*/"COMBINING COMMA BELOW"/* 0326 */,/*807*/"COMBINING CEDILLA"/* 0327 */, /*808*/"COMBINING OGONEK"/* 0328 */,/*809*/"COMBINING VERTICAL LINE BELOW"/* 0329 */, /*810*/"COMBINING BRIDGE BELOW"/* 032A */,/*811*/"COMBINING INVERTED DOUBLE ARCH BELOW"/* 032B */, /*812*/"COMBINING CARON BELOW"/* 032C */,/*813*/"COMBINING CIRCUMFLEX ACCENT BELOW"/* 032D */, /*814*/"COMBINING BREVE BELOW"/* 032E */,/*815*/"COMBINING INVERTED BREVE BELOW"/* 032F */, /*816*/"COMBINING TILDE BELOW"/* 0330 */,/*817*/"COMBINING MACRON BELOW"/* 0331 */,/*818*/"COMBINING LOW LINE"/* 0332 */, /*819*/"COMBINING DOUBLE LOW LINE"/* 0333 */,/*820*/"COMBINING TILDE OVERLAY"/* 0334 */, /*821*/"COMBINING SHORT STROKE OVERLAY"/* 0335 */,/*822*/"COMBINING LONG STROKE OVERLAY"/* 0336 */, /*823*/"COMBINING SHORT SOLIDUS OVERLAY"/* 0337 */,/*824*/"COMBINING LONG SOLIDUS OVERLAY"/* 0338 */, /*825*/"COMBINING RIGHT HALF RING BELOW"/* 0339 */,/*826*/"COMBINING INVERTED BRIDGE BELOW"/* 033A */, /*827*/"COMBINING SQUARE BELOW"/* 033B */,/*828*/"COMBINING SEAGULL BELOW"/* 033C */, /*829*/"COMBINING X ABOVE"/* 033D */,/*830*/"COMBINING VERTICAL TILDE"/* 033E */, /*831*/"COMBINING DOUBLE OVERLINE"/* 033F */,/*832*/"COMBINING GRAVE TONE MARK"/* 0340 */, /*833*/"COMBINING ACUTE TONE MARK"/* 0341 */,/*834*/"COMBINING GREEK PERISPOMENI"/* 0342 */, /*835*/"COMBINING GREEK KORONIS"/* 0343 */,/*836*/"COMBINING GREEK DIALYTIKA TONOS"/* 0344 */, /*837*/"COMBINING GREEK YPOGEGRAMMENI"/* 0345 */,/*838*/"COMBINING BRIDGE ABOVE"/* 0346 */, /*839*/"COMBINING EQUALS SIGN BELOW"/* 0347 */,/*840*/"COMBINING DOUBLE VERTICAL LINE BELOW"/* 0348 */, /*841*/"COMBINING LEFT ANGLE BELOW"/* 0349 */,/*842*/"COMBINING NOT TILDE ABOVE"/* 034A */, /*843*/"COMBINING HOMOTHETIC ABOVE"/* 034B */,/*844*/"COMBINING ALMOST EQUAL TO ABOVE"/* 034C */, /*845*/"COMBINING LEFT RIGHT ARROW BELOW"/* 034D */,/*846*/"COMBINING UPWARDS ARROW BELOW"/* 034E */, /*847*/"COMBINING GRAPHEME JOINER"/* 034F */,/*848*/"COMBINING RIGHT ARROWHEAD ABOVE"/* 0350 */, /*849*/"COMBINING LEFT HALF RING ABOVE"/* 0351 */,/*850*/"COMBINING FERMATA"/* 0352 */, /*851*/"COMBINING X BELOW"/* 0353 */,/*852*/"COMBINING LEFT ARROWHEAD BELOW"/* 0354 */, /*853*/"COMBINING RIGHT ARROWHEAD BELOW"/* 0355 */,/*854*/"COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW"/* 0356 */, /*855*/"COMBINING RIGHT HALF RING ABOVE"/* 0357 */,/*856*/"COMBINING DOT ABOVE RIGHT"/* 0358 */, /*857*/"COMBINING ASTERISK BELOW"/* 0359 */,/*858*/"COMBINING DOUBLE RING BELOW"/* 035A */, /*859*/"COMBINING ZIGZAG ABOVE"/* 035B */,/*860*/"COMBINING DOUBLE BREVE BELOW"/* 035C */, /*861*/"COMBINING DOUBLE BREVE"/* 035D */,/*862*/"COMBINING DOUBLE MACRON"/* 035E */, /*863*/"COMBINING DOUBLE MACRON BELOW"/* 035F */,/*864*/"COMBINING DOUBLE TILDE"/* 0360 */, /*865*/"COMBINING DOUBLE INVERTED BREVE"/* 0361 */,/*866*/"COMBINING DOUBLE RIGHTWARDS ARROW BELOW"/* 0362 */, /*867*/"COMBINING LATIN SMALL LETTER A"/* 0363 */,/*868*/"COMBINING LATIN SMALL LETTER E"/* 0364 */, /*869*/"COMBINING LATIN SMALL LETTER I"/* 0365 */,/*870*/"COMBINING LATIN SMALL LETTER O"/* 0366 */, /*871*/"COMBINING LATIN SMALL LETTER U"/* 0367 */,/*872*/"COMBINING LATIN SMALL LETTER C"/* 0368 */, /*873*/"COMBINING LATIN SMALL LETTER D"/* 0369 */,/*874*/"COMBINING LATIN SMALL LETTER H"/* 036A */, /*875*/"COMBINING LATIN SMALL LETTER M"/* 036B */,/*876*/"COMBINING LATIN SMALL LETTER R"/* 036C */, /*877*/"COMBINING LATIN SMALL LETTER T"/* 036D */,/*878*/"COMBINING LATIN SMALL LETTER V"/* 036E */, /*879*/"COMBINING LATIN SMALL LETTER X"/* 036F */,/*880*/"GREEK CAPITAL LETTER HETA"/* 0370 */, /*881*/"GREEK SMALL LETTER HETA"/* 0371 */,/*882*/"GREEK CAPITAL LETTER ARCHAIC SAMPI"/* 0372 */, /*883*/"GREEK SMALL LETTER ARCHAIC SAMPI"/* 0373 */,/*884*/"GREEK NUMERAL SIGN"/* 0374 */, /*885*/"GREEK LOWER NUMERAL SIGN"/* 0375 */,/*886*/"GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA"/* 0376 */, /*887*/"GREEK SMALL LETTER PAMPHYLIAN DIGAMMA"/* 0377 */,NULL,NULL,/*890*/"GREEK YPOGEGRAMMENI"/* 037A */, /*891*/"GREEK SMALL REVERSED LUNATE SIGMA SYMBOL"/* 037B */,/*892*/"GREEK SMALL DOTTED LUNATE SIGMA SYMBOL"/* 037C */, /*893*/"GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL"/* 037D */,/*894*/"GREEK QUESTION MARK"/* 037E */, /*895*/"GREEK CAPITAL LETTER YOT"/* 037F */,NULL,NULL,NULL,NULL,/*900*/"GREEK TONOS"/* 0384 */, /*901*/"GREEK DIALYTIKA TONOS"/* 0385 */,/*902*/"GREEK CAPITAL LETTER ALPHA WITH TONOS"/* 0386 */, /*903*/"GREEK ANO TELEIA"/* 0387 */,/*904*/"GREEK CAPITAL LETTER EPSILON WITH TONOS"/* 0388 */, /*905*/"GREEK CAPITAL LETTER ETA WITH TONOS"/* 0389 */,/*906*/"GREEK CAPITAL LETTER IOTA WITH TONOS"/* 038A */,NULL, /*908*/"GREEK CAPITAL LETTER OMICRON WITH TONOS"/* 038C */,NULL, /*910*/"GREEK CAPITAL LETTER UPSILON WITH TONOS"/* 038E */,/*911*/"GREEK CAPITAL LETTER OMEGA WITH TONOS"/* 038F */, /*912*/"GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS"/* 0390 */,/*913*/"GREEK CAPITAL LETTER ALPHA"/* 0391 */, /*914*/"GREEK CAPITAL LETTER BETA"/* 0392 */,/*915*/"GREEK CAPITAL LETTER GAMMA"/* 0393 */, /*916*/"GREEK CAPITAL LETTER DELTA"/* 0394 */,/*917*/"GREEK CAPITAL LETTER EPSILON"/* 0395 */, /*918*/"GREEK CAPITAL LETTER ZETA"/* 0396 */,/*919*/"GREEK CAPITAL LETTER ETA"/* 0397 */, /*920*/"GREEK CAPITAL LETTER THETA"/* 0398 */,/*921*/"GREEK CAPITAL LETTER IOTA"/* 0399 */, /*922*/"GREEK CAPITAL LETTER KAPPA"/* 039A */,/*923*/"GREEK CAPITAL LETTER LAMDA"/* 039B */, /*924*/"GREEK CAPITAL LETTER MU"/* 039C */,/*925*/"GREEK CAPITAL LETTER NU"/* 039D */, /*926*/"GREEK CAPITAL LETTER XI"/* 039E */,/*927*/"GREEK CAPITAL LETTER OMICRON"/* 039F */, /*928*/"GREEK CAPITAL LETTER PI"/* 03A0 */,/*929*/"GREEK CAPITAL LETTER RHO"/* 03A1 */,NULL, /*931*/"GREEK CAPITAL LETTER SIGMA"/* 03A3 */,/*932*/"GREEK CAPITAL LETTER TAU"/* 03A4 */, /*933*/"GREEK CAPITAL LETTER UPSILON"/* 03A5 */,/*934*/"GREEK CAPITAL LETTER PHI"/* 03A6 */, /*935*/"GREEK CAPITAL LETTER CHI"/* 03A7 */,/*936*/"GREEK CAPITAL LETTER PSI"/* 03A8 */, /*937*/"GREEK CAPITAL LETTER OMEGA"/* 03A9 */,/*938*/"GREEK CAPITAL LETTER IOTA WITH DIALYTIKA"/* 03AA */, /*939*/"GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA"/* 03AB */,/*940*/"GREEK SMALL LETTER ALPHA WITH TONOS"/* 03AC */, /*941*/"GREEK SMALL LETTER EPSILON WITH TONOS"/* 03AD */,/*942*/"GREEK SMALL LETTER ETA WITH TONOS"/* 03AE */, /*943*/"GREEK SMALL LETTER IOTA WITH TONOS"/* 03AF */, /*944*/"GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS"/* 03B0 */,/*945*/"GREEK SMALL LETTER ALPHA"/* 03B1 */, /*946*/"GREEK SMALL LETTER BETA"/* 03B2 */,/*947*/"GREEK SMALL LETTER GAMMA"/* 03B3 */, /*948*/"GREEK SMALL LETTER DELTA"/* 03B4 */,/*949*/"GREEK SMALL LETTER EPSILON"/* 03B5 */, /*950*/"GREEK SMALL LETTER ZETA"/* 03B6 */,/*951*/"GREEK SMALL LETTER ETA"/* 03B7 */, /*952*/"GREEK SMALL LETTER THETA"/* 03B8 */,/*953*/"GREEK SMALL LETTER IOTA"/* 03B9 */, /*954*/"GREEK SMALL LETTER KAPPA"/* 03BA */,/*955*/"GREEK SMALL LETTER LAMDA"/* 03BB */, /*956*/"GREEK SMALL LETTER MU"/* 03BC */,/*957*/"GREEK SMALL LETTER NU"/* 03BD */, /*958*/"GREEK SMALL LETTER XI"/* 03BE */,/*959*/"GREEK SMALL LETTER OMICRON"/* 03BF */, /*960*/"GREEK SMALL LETTER PI"/* 03C0 */,/*961*/"GREEK SMALL LETTER RHO"/* 03C1 */, /*962*/"GREEK SMALL LETTER FINAL SIGMA"/* 03C2 */,/*963*/"GREEK SMALL LETTER SIGMA"/* 03C3 */, /*964*/"GREEK SMALL LETTER TAU"/* 03C4 */,/*965*/"GREEK SMALL LETTER UPSILON"/* 03C5 */, /*966*/"GREEK SMALL LETTER PHI"/* 03C6 */,/*967*/"GREEK SMALL LETTER CHI"/* 03C7 */, /*968*/"GREEK SMALL LETTER PSI"/* 03C8 */,/*969*/"GREEK SMALL LETTER OMEGA"/* 03C9 */, /*970*/"GREEK SMALL LETTER IOTA WITH DIALYTIKA"/* 03CA */,/*971*/"GREEK SMALL LETTER UPSILON WITH DIALYTIKA"/* 03CB */, /*972*/"GREEK SMALL LETTER OMICRON WITH TONOS"/* 03CC */,/*973*/"GREEK SMALL LETTER UPSILON WITH TONOS"/* 03CD */, /*974*/"GREEK SMALL LETTER OMEGA WITH TONOS"/* 03CE */,/*975*/"GREEK CAPITAL KAI SYMBOL"/* 03CF */, /*976*/"GREEK BETA SYMBOL"/* 03D0 */,/*977*/"GREEK THETA SYMBOL"/* 03D1 */, /*978*/"GREEK UPSILON WITH HOOK SYMBOL"/* 03D2 */,/*979*/"GREEK UPSILON WITH ACUTE AND HOOK SYMBOL"/* 03D3 */, /*980*/"GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL"/* 03D4 */,/*981*/"GREEK PHI SYMBOL"/* 03D5 */, /*982*/"GREEK PI SYMBOL"/* 03D6 */,/*983*/"GREEK KAI SYMBOL"/* 03D7 */,/*984*/"GREEK LETTER ARCHAIC KOPPA"/* 03D8 */, /*985*/"GREEK SMALL LETTER ARCHAIC KOPPA"/* 03D9 */,/*986*/"GREEK LETTER STIGMA"/* 03DA */, /*987*/"GREEK SMALL LETTER STIGMA"/* 03DB */,/*988*/"GREEK LETTER DIGAMMA"/* 03DC */, /*989*/"GREEK SMALL LETTER DIGAMMA"/* 03DD */,/*990*/"GREEK LETTER KOPPA"/* 03DE */, /*991*/"GREEK SMALL LETTER KOPPA"/* 03DF */,/*992*/"GREEK LETTER SAMPI"/* 03E0 */, /*993*/"GREEK SMALL LETTER SAMPI"/* 03E1 */,/*994*/"COPTIC CAPITAL LETTER SHEI"/* 03E2 */, /*995*/"COPTIC SMALL LETTER SHEI"/* 03E3 */,/*996*/"COPTIC CAPITAL LETTER FEI"/* 03E4 */, /*997*/"COPTIC SMALL LETTER FEI"/* 03E5 */,/*998*/"COPTIC CAPITAL LETTER KHEI"/* 03E6 */, /*999*/"COPTIC SMALL LETTER KHEI"/* 03E7 */,/*1000*/"COPTIC CAPITAL LETTER HORI"/* 03E8 */, /*1001*/"COPTIC SMALL LETTER HORI"/* 03E9 */,/*1002*/"COPTIC CAPITAL LETTER GANGIA"/* 03EA */, /*1003*/"COPTIC SMALL LETTER GANGIA"/* 03EB */,/*1004*/"COPTIC CAPITAL LETTER SHIMA"/* 03EC */, /*1005*/"COPTIC SMALL LETTER SHIMA"/* 03ED */,/*1006*/"COPTIC CAPITAL LETTER DEI"/* 03EE */, /*1007*/"COPTIC SMALL LETTER DEI"/* 03EF */,/*1008*/"GREEK KAPPA SYMBOL"/* 03F0 */,/*1009*/"GREEK RHO SYMBOL"/* 03F1 */, /*1010*/"GREEK LUNATE SIGMA SYMBOL"/* 03F2 */,/*1011*/"GREEK LETTER YOT"/* 03F3 */, /*1012*/"GREEK CAPITAL THETA SYMBOL"/* 03F4 */,/*1013*/"GREEK LUNATE EPSILON SYMBOL"/* 03F5 */, /*1014*/"GREEK REVERSED LUNATE EPSILON SYMBOL"/* 03F6 */,/*1015*/"GREEK CAPITAL LETTER SHO"/* 03F7 */, /*1016*/"GREEK SMALL LETTER SHO"/* 03F8 */,/*1017*/"GREEK CAPITAL LUNATE SIGMA SYMBOL"/* 03F9 */, /*1018*/"GREEK CAPITAL LETTER SAN"/* 03FA */,/*1019*/"GREEK SMALL LETTER SAN"/* 03FB */, /*1020*/"GREEK RHO WITH STROKE SYMBOL"/* 03FC */,/*1021*/"GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL"/* 03FD */, /*1022*/"GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL"/* 03FE */, /*1023*/"GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL"/* 03FF */, /*1024*/"CYRILLIC CAPITAL LETTER IE WITH GRAVE"/* 0400 */,/*1025*/"CYRILLIC CAPITAL LETTER IO"/* 0401 */, /*1026*/"CYRILLIC CAPITAL LETTER DJE"/* 0402 */,/*1027*/"CYRILLIC CAPITAL LETTER GJE"/* 0403 */, /*1028*/"CYRILLIC CAPITAL LETTER UKRAINIAN IE"/* 0404 */,/*1029*/"CYRILLIC CAPITAL LETTER DZE"/* 0405 */, /*1030*/"CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I"/* 0406 */,/*1031*/"CYRILLIC CAPITAL LETTER YI"/* 0407 */, /*1032*/"CYRILLIC CAPITAL LETTER JE"/* 0408 */,/*1033*/"CYRILLIC CAPITAL LETTER LJE"/* 0409 */, /*1034*/"CYRILLIC CAPITAL LETTER NJE"/* 040A */,/*1035*/"CYRILLIC CAPITAL LETTER TSHE"/* 040B */, /*1036*/"CYRILLIC CAPITAL LETTER KJE"/* 040C */,/*1037*/"CYRILLIC CAPITAL LETTER I WITH GRAVE"/* 040D */, /*1038*/"CYRILLIC CAPITAL LETTER SHORT U"/* 040E */,/*1039*/"CYRILLIC CAPITAL LETTER DZHE"/* 040F */, /*1040*/"CYRILLIC CAPITAL LETTER A"/* 0410 */,/*1041*/"CYRILLIC CAPITAL LETTER BE"/* 0411 */, /*1042*/"CYRILLIC CAPITAL LETTER VE"/* 0412 */,/*1043*/"CYRILLIC CAPITAL LETTER GHE"/* 0413 */, /*1044*/"CYRILLIC CAPITAL LETTER DE"/* 0414 */,/*1045*/"CYRILLIC CAPITAL LETTER IE"/* 0415 */, /*1046*/"CYRILLIC CAPITAL LETTER ZHE"/* 0416 */,/*1047*/"CYRILLIC CAPITAL LETTER ZE"/* 0417 */, /*1048*/"CYRILLIC CAPITAL LETTER I"/* 0418 */,/*1049*/"CYRILLIC CAPITAL LETTER SHORT I"/* 0419 */, /*1050*/"CYRILLIC CAPITAL LETTER KA"/* 041A */,/*1051*/"CYRILLIC CAPITAL LETTER EL"/* 041B */, /*1052*/"CYRILLIC CAPITAL LETTER EM"/* 041C */,/*1053*/"CYRILLIC CAPITAL LETTER EN"/* 041D */, /*1054*/"CYRILLIC CAPITAL LETTER O"/* 041E */,/*1055*/"CYRILLIC CAPITAL LETTER PE"/* 041F */, /*1056*/"CYRILLIC CAPITAL LETTER ER"/* 0420 */,/*1057*/"CYRILLIC CAPITAL LETTER ES"/* 0421 */, /*1058*/"CYRILLIC CAPITAL LETTER TE"/* 0422 */,/*1059*/"CYRILLIC CAPITAL LETTER U"/* 0423 */, /*1060*/"CYRILLIC CAPITAL LETTER EF"/* 0424 */,/*1061*/"CYRILLIC CAPITAL LETTER HA"/* 0425 */, /*1062*/"CYRILLIC CAPITAL LETTER TSE"/* 0426 */,/*1063*/"CYRILLIC CAPITAL LETTER CHE"/* 0427 */, /*1064*/"CYRILLIC CAPITAL LETTER SHA"/* 0428 */,/*1065*/"CYRILLIC CAPITAL LETTER SHCHA"/* 0429 */, /*1066*/"CYRILLIC CAPITAL LETTER HARD SIGN"/* 042A */,/*1067*/"CYRILLIC CAPITAL LETTER YERU"/* 042B */, /*1068*/"CYRILLIC CAPITAL LETTER SOFT SIGN"/* 042C */,/*1069*/"CYRILLIC CAPITAL LETTER E"/* 042D */, /*1070*/"CYRILLIC CAPITAL LETTER YU"/* 042E */,/*1071*/"CYRILLIC CAPITAL LETTER YA"/* 042F */, /*1072*/"CYRILLIC SMALL LETTER A"/* 0430 */,/*1073*/"CYRILLIC SMALL LETTER BE"/* 0431 */, /*1074*/"CYRILLIC SMALL LETTER VE"/* 0432 */,/*1075*/"CYRILLIC SMALL LETTER GHE"/* 0433 */, /*1076*/"CYRILLIC SMALL LETTER DE"/* 0434 */,/*1077*/"CYRILLIC SMALL LETTER IE"/* 0435 */, /*1078*/"CYRILLIC SMALL LETTER ZHE"/* 0436 */,/*1079*/"CYRILLIC SMALL LETTER ZE"/* 0437 */, /*1080*/"CYRILLIC SMALL LETTER I"/* 0438 */,/*1081*/"CYRILLIC SMALL LETTER SHORT I"/* 0439 */, /*1082*/"CYRILLIC SMALL LETTER KA"/* 043A */,/*1083*/"CYRILLIC SMALL LETTER EL"/* 043B */, /*1084*/"CYRILLIC SMALL LETTER EM"/* 043C */,/*1085*/"CYRILLIC SMALL LETTER EN"/* 043D */, /*1086*/"CYRILLIC SMALL LETTER O"/* 043E */,/*1087*/"CYRILLIC SMALL LETTER PE"/* 043F */, /*1088*/"CYRILLIC SMALL LETTER ER"/* 0440 */,/*1089*/"CYRILLIC SMALL LETTER ES"/* 0441 */, /*1090*/"CYRILLIC SMALL LETTER TE"/* 0442 */,/*1091*/"CYRILLIC SMALL LETTER U"/* 0443 */, /*1092*/"CYRILLIC SMALL LETTER EF"/* 0444 */,/*1093*/"CYRILLIC SMALL LETTER HA"/* 0445 */, /*1094*/"CYRILLIC SMALL LETTER TSE"/* 0446 */,/*1095*/"CYRILLIC SMALL LETTER CHE"/* 0447 */, /*1096*/"CYRILLIC SMALL LETTER SHA"/* 0448 */,/*1097*/"CYRILLIC SMALL LETTER SHCHA"/* 0449 */, /*1098*/"CYRILLIC SMALL LETTER HARD SIGN"/* 044A */,/*1099*/"CYRILLIC SMALL LETTER YERU"/* 044B */, /*1100*/"CYRILLIC SMALL LETTER SOFT SIGN"/* 044C */,/*1101*/"CYRILLIC SMALL LETTER E"/* 044D */, /*1102*/"CYRILLIC SMALL LETTER YU"/* 044E */,/*1103*/"CYRILLIC SMALL LETTER YA"/* 044F */, /*1104*/"CYRILLIC SMALL LETTER IE WITH GRAVE"/* 0450 */,/*1105*/"CYRILLIC SMALL LETTER IO"/* 0451 */, /*1106*/"CYRILLIC SMALL LETTER DJE"/* 0452 */,/*1107*/"CYRILLIC SMALL LETTER GJE"/* 0453 */, /*1108*/"CYRILLIC SMALL LETTER UKRAINIAN IE"/* 0454 */,/*1109*/"CYRILLIC SMALL LETTER DZE"/* 0455 */, /*1110*/"CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I"/* 0456 */,/*1111*/"CYRILLIC SMALL LETTER YI"/* 0457 */, /*1112*/"CYRILLIC SMALL LETTER JE"/* 0458 */,/*1113*/"CYRILLIC SMALL LETTER LJE"/* 0459 */, /*1114*/"CYRILLIC SMALL LETTER NJE"/* 045A */,/*1115*/"CYRILLIC SMALL LETTER TSHE"/* 045B */, /*1116*/"CYRILLIC SMALL LETTER KJE"/* 045C */,/*1117*/"CYRILLIC SMALL LETTER I WITH GRAVE"/* 045D */, /*1118*/"CYRILLIC SMALL LETTER SHORT U"/* 045E */,/*1119*/"CYRILLIC SMALL LETTER DZHE"/* 045F */, /*1120*/"CYRILLIC CAPITAL LETTER OMEGA"/* 0460 */,/*1121*/"CYRILLIC SMALL LETTER OMEGA"/* 0461 */, /*1122*/"CYRILLIC CAPITAL LETTER YAT"/* 0462 */,/*1123*/"CYRILLIC SMALL LETTER YAT"/* 0463 */, /*1124*/"CYRILLIC CAPITAL LETTER IOTIFIED E"/* 0464 */,/*1125*/"CYRILLIC SMALL LETTER IOTIFIED E"/* 0465 */, /*1126*/"CYRILLIC CAPITAL LETTER LITTLE YUS"/* 0466 */,/*1127*/"CYRILLIC SMALL LETTER LITTLE YUS"/* 0467 */, /*1128*/"CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS"/* 0468 */, /*1129*/"CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS"/* 0469 */,/*1130*/"CYRILLIC CAPITAL LETTER BIG YUS"/* 046A */, /*1131*/"CYRILLIC SMALL LETTER BIG YUS"/* 046B */,/*1132*/"CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS"/* 046C */, /*1133*/"CYRILLIC SMALL LETTER IOTIFIED BIG YUS"/* 046D */,/*1134*/"CYRILLIC CAPITAL LETTER KSI"/* 046E */, /*1135*/"CYRILLIC SMALL LETTER KSI"/* 046F */,/*1136*/"CYRILLIC CAPITAL LETTER PSI"/* 0470 */, /*1137*/"CYRILLIC SMALL LETTER PSI"/* 0471 */,/*1138*/"CYRILLIC CAPITAL LETTER FITA"/* 0472 */, /*1139*/"CYRILLIC SMALL LETTER FITA"/* 0473 */,/*1140*/"CYRILLIC CAPITAL LETTER IZHITSA"/* 0474 */, /*1141*/"CYRILLIC SMALL LETTER IZHITSA"/* 0475 */, /*1142*/"CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT"/* 0476 */, /*1143*/"CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT"/* 0477 */, /*1144*/"CYRILLIC CAPITAL LETTER UK"/* 0478 */,/*1145*/"CYRILLIC SMALL LETTER UK"/* 0479 */, /*1146*/"CYRILLIC CAPITAL LETTER ROUND OMEGA"/* 047A */,/*1147*/"CYRILLIC SMALL LETTER ROUND OMEGA"/* 047B */, /*1148*/"CYRILLIC CAPITAL LETTER OMEGA WITH TITLO"/* 047C */,/*1149*/"CYRILLIC SMALL LETTER OMEGA WITH TITLO"/* 047D */, /*1150*/"CYRILLIC CAPITAL LETTER OT"/* 047E */,/*1151*/"CYRILLIC SMALL LETTER OT"/* 047F */, /*1152*/"CYRILLIC CAPITAL LETTER KOPPA"/* 0480 */,/*1153*/"CYRILLIC SMALL LETTER KOPPA"/* 0481 */, /*1154*/"CYRILLIC THOUSANDS SIGN"/* 0482 */,/*1155*/"COMBINING CYRILLIC TITLO"/* 0483 */, /*1156*/"COMBINING CYRILLIC PALATALIZATION"/* 0484 */,/*1157*/"COMBINING CYRILLIC DASIA PNEUMATA"/* 0485 */, /*1158*/"COMBINING CYRILLIC PSILI PNEUMATA"/* 0486 */,/*1159*/"COMBINING CYRILLIC POKRYTIE"/* 0487 */, /*1160*/"COMBINING CYRILLIC HUNDRED THOUSANDS SIGN"/* 0488 */,/*1161*/"COMBINING CYRILLIC MILLIONS SIGN"/* 0489 */, /*1162*/"CYRILLIC CAPITAL LETTER SHORT I WITH TAIL"/* 048A */, /*1163*/"CYRILLIC SMALL LETTER SHORT I WITH TAIL"/* 048B */,/*1164*/"CYRILLIC CAPITAL LETTER SEMISOFT SIGN"/* 048C */, /*1165*/"CYRILLIC SMALL LETTER SEMISOFT SIGN"/* 048D */,/*1166*/"CYRILLIC CAPITAL LETTER ER WITH TICK"/* 048E */, /*1167*/"CYRILLIC SMALL LETTER ER WITH TICK"/* 048F */,/*1168*/"CYRILLIC CAPITAL LETTER GHE WITH UPTURN"/* 0490 */, /*1169*/"CYRILLIC SMALL LETTER GHE WITH UPTURN"/* 0491 */,/*1170*/"CYRILLIC CAPITAL LETTER GHE WITH STROKE"/* 0492 */, /*1171*/"CYRILLIC SMALL LETTER GHE WITH STROKE"/* 0493 */, /*1172*/"CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK"/* 0494 */, /*1173*/"CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK"/* 0495 */, /*1174*/"CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER"/* 0496 */, /*1175*/"CYRILLIC SMALL LETTER ZHE WITH DESCENDER"/* 0497 */, /*1176*/"CYRILLIC CAPITAL LETTER ZE WITH DESCENDER"/* 0498 */, /*1177*/"CYRILLIC SMALL LETTER ZE WITH DESCENDER"/* 0499 */, /*1178*/"CYRILLIC CAPITAL LETTER KA WITH DESCENDER"/* 049A */, /*1179*/"CYRILLIC SMALL LETTER KA WITH DESCENDER"/* 049B */, /*1180*/"CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE"/* 049C */, /*1181*/"CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE"/* 049D */, /*1182*/"CYRILLIC CAPITAL LETTER KA WITH STROKE"/* 049E */,/*1183*/"CYRILLIC SMALL LETTER KA WITH STROKE"/* 049F */, /*1184*/"CYRILLIC CAPITAL LETTER BASHKIR KA"/* 04A0 */,/*1185*/"CYRILLIC SMALL LETTER BASHKIR KA"/* 04A1 */, /*1186*/"CYRILLIC CAPITAL LETTER EN WITH DESCENDER"/* 04A2 */, /*1187*/"CYRILLIC SMALL LETTER EN WITH DESCENDER"/* 04A3 */,/*1188*/"CYRILLIC CAPITAL LIGATURE EN GHE"/* 04A4 */, /*1189*/"CYRILLIC SMALL LIGATURE EN GHE"/* 04A5 */,/*1190*/"CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK"/* 04A6 */, /*1191*/"CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK"/* 04A7 */,/*1192*/"CYRILLIC CAPITAL LETTER ABKHASIAN HA"/* 04A8 */, /*1193*/"CYRILLIC SMALL LETTER ABKHASIAN HA"/* 04A9 */,/*1194*/"CYRILLIC CAPITAL LETTER ES WITH DESCENDER"/* 04AA */, /*1195*/"CYRILLIC SMALL LETTER ES WITH DESCENDER"/* 04AB */, /*1196*/"CYRILLIC CAPITAL LETTER TE WITH DESCENDER"/* 04AC */, /*1197*/"CYRILLIC SMALL LETTER TE WITH DESCENDER"/* 04AD */,/*1198*/"CYRILLIC CAPITAL LETTER STRAIGHT U"/* 04AE */, /*1199*/"CYRILLIC SMALL LETTER STRAIGHT U"/* 04AF */,/*1200*/"CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE"/* 04B0 */, /*1201*/"CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE"/* 04B1 */, /*1202*/"CYRILLIC CAPITAL LETTER HA WITH DESCENDER"/* 04B2 */, /*1203*/"CYRILLIC SMALL LETTER HA WITH DESCENDER"/* 04B3 */,/*1204*/"CYRILLIC CAPITAL LIGATURE TE TSE"/* 04B4 */, /*1205*/"CYRILLIC SMALL LIGATURE TE TSE"/* 04B5 */,/*1206*/"CYRILLIC CAPITAL LETTER CHE WITH DESCENDER"/* 04B6 */, /*1207*/"CYRILLIC SMALL LETTER CHE WITH DESCENDER"/* 04B7 */, /*1208*/"CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE"/* 04B8 */, /*1209*/"CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE"/* 04B9 */,/*1210*/"CYRILLIC CAPITAL LETTER SHHA"/* 04BA */, /*1211*/"CYRILLIC SMALL LETTER SHHA"/* 04BB */,/*1212*/"CYRILLIC CAPITAL LETTER ABKHASIAN CHE"/* 04BC */, /*1213*/"CYRILLIC SMALL LETTER ABKHASIAN CHE"/* 04BD */, /*1214*/"CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER"/* 04BE */, /*1215*/"CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER"/* 04BF */,/*1216*/"CYRILLIC LETTER PALOCHKA"/* 04C0 */, /*1217*/"CYRILLIC CAPITAL LETTER ZHE WITH BREVE"/* 04C1 */,/*1218*/"CYRILLIC SMALL LETTER ZHE WITH BREVE"/* 04C2 */, /*1219*/"CYRILLIC CAPITAL LETTER KA WITH HOOK"/* 04C3 */,/*1220*/"CYRILLIC SMALL LETTER KA WITH HOOK"/* 04C4 */, /*1221*/"CYRILLIC CAPITAL LETTER EL WITH TAIL"/* 04C5 */,/*1222*/"CYRILLIC SMALL LETTER EL WITH TAIL"/* 04C6 */, /*1223*/"CYRILLIC CAPITAL LETTER EN WITH HOOK"/* 04C7 */,/*1224*/"CYRILLIC SMALL LETTER EN WITH HOOK"/* 04C8 */, /*1225*/"CYRILLIC CAPITAL LETTER EN WITH TAIL"/* 04C9 */,/*1226*/"CYRILLIC SMALL LETTER EN WITH TAIL"/* 04CA */, /*1227*/"CYRILLIC CAPITAL LETTER KHAKASSIAN CHE"/* 04CB */,/*1228*/"CYRILLIC SMALL LETTER KHAKASSIAN CHE"/* 04CC */, /*1229*/"CYRILLIC CAPITAL LETTER EM WITH TAIL"/* 04CD */,/*1230*/"CYRILLIC SMALL LETTER EM WITH TAIL"/* 04CE */, /*1231*/"CYRILLIC SMALL LETTER PALOCHKA"/* 04CF */,/*1232*/"CYRILLIC CAPITAL LETTER A WITH BREVE"/* 04D0 */, /*1233*/"CYRILLIC SMALL LETTER A WITH BREVE"/* 04D1 */,/*1234*/"CYRILLIC CAPITAL LETTER A WITH DIAERESIS"/* 04D2 */, /*1235*/"CYRILLIC SMALL LETTER A WITH DIAERESIS"/* 04D3 */,/*1236*/"CYRILLIC CAPITAL LIGATURE A IE"/* 04D4 */, /*1237*/"CYRILLIC SMALL LIGATURE A IE"/* 04D5 */,/*1238*/"CYRILLIC CAPITAL LETTER IE WITH BREVE"/* 04D6 */, /*1239*/"CYRILLIC SMALL LETTER IE WITH BREVE"/* 04D7 */,/*1240*/"CYRILLIC CAPITAL LETTER SCHWA"/* 04D8 */, /*1241*/"CYRILLIC SMALL LETTER SCHWA"/* 04D9 */,/*1242*/"CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS"/* 04DA */, /*1243*/"CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS"/* 04DB */, /*1244*/"CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS"/* 04DC */, /*1245*/"CYRILLIC SMALL LETTER ZHE WITH DIAERESIS"/* 04DD */, /*1246*/"CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS"/* 04DE */, /*1247*/"CYRILLIC SMALL LETTER ZE WITH DIAERESIS"/* 04DF */,/*1248*/"CYRILLIC CAPITAL LETTER ABKHASIAN DZE"/* 04E0 */, /*1249*/"CYRILLIC SMALL LETTER ABKHASIAN DZE"/* 04E1 */,/*1250*/"CYRILLIC CAPITAL LETTER I WITH MACRON"/* 04E2 */, /*1251*/"CYRILLIC SMALL LETTER I WITH MACRON"/* 04E3 */,/*1252*/"CYRILLIC CAPITAL LETTER I WITH DIAERESIS"/* 04E4 */, /*1253*/"CYRILLIC SMALL LETTER I WITH DIAERESIS"/* 04E5 */,/*1254*/"CYRILLIC CAPITAL LETTER O WITH DIAERESIS"/* 04E6 */, /*1255*/"CYRILLIC SMALL LETTER O WITH DIAERESIS"/* 04E7 */,/*1256*/"CYRILLIC CAPITAL LETTER BARRED O"/* 04E8 */, /*1257*/"CYRILLIC SMALL LETTER BARRED O"/* 04E9 */,/*1258*/"CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS"/* 04EA */, /*1259*/"CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS"/* 04EB */, /*1260*/"CYRILLIC CAPITAL LETTER E WITH DIAERESIS"/* 04EC */,/*1261*/"CYRILLIC SMALL LETTER E WITH DIAERESIS"/* 04ED */, /*1262*/"CYRILLIC CAPITAL LETTER U WITH MACRON"/* 04EE */,/*1263*/"CYRILLIC SMALL LETTER U WITH MACRON"/* 04EF */, /*1264*/"CYRILLIC CAPITAL LETTER U WITH DIAERESIS"/* 04F0 */,/*1265*/"CYRILLIC SMALL LETTER U WITH DIAERESIS"/* 04F1 */, /*1266*/"CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE"/* 04F2 */, /*1267*/"CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE"/* 04F3 */, /*1268*/"CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS"/* 04F4 */, /*1269*/"CYRILLIC SMALL LETTER CHE WITH DIAERESIS"/* 04F5 */, /*1270*/"CYRILLIC CAPITAL LETTER GHE WITH DESCENDER"/* 04F6 */, /*1271*/"CYRILLIC SMALL LETTER GHE WITH DESCENDER"/* 04F7 */, /*1272*/"CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS"/* 04F8 */, /*1273*/"CYRILLIC SMALL LETTER YERU WITH DIAERESIS"/* 04F9 */, /*1274*/"CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK"/* 04FA */, /*1275*/"CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK"/* 04FB */, /*1276*/"CYRILLIC CAPITAL LETTER HA WITH HOOK"/* 04FC */,/*1277*/"CYRILLIC SMALL LETTER HA WITH HOOK"/* 04FD */, /*1278*/"CYRILLIC CAPITAL LETTER HA WITH STROKE"/* 04FE */,/*1279*/"CYRILLIC SMALL LETTER HA WITH STROKE"/* 04FF */, /*1280*/"CYRILLIC CAPITAL LETTER KOMI DE"/* 0500 */,/*1281*/"CYRILLIC SMALL LETTER KOMI DE"/* 0501 */, /*1282*/"CYRILLIC CAPITAL LETTER KOMI DJE"/* 0502 */,/*1283*/"CYRILLIC SMALL LETTER KOMI DJE"/* 0503 */, /*1284*/"CYRILLIC CAPITAL LETTER KOMI ZJE"/* 0504 */,/*1285*/"CYRILLIC SMALL LETTER KOMI ZJE"/* 0505 */, /*1286*/"CYRILLIC CAPITAL LETTER KOMI DZJE"/* 0506 */,/*1287*/"CYRILLIC SMALL LETTER KOMI DZJE"/* 0507 */, /*1288*/"CYRILLIC CAPITAL LETTER KOMI LJE"/* 0508 */,/*1289*/"CYRILLIC SMALL LETTER KOMI LJE"/* 0509 */, /*1290*/"CYRILLIC CAPITAL LETTER KOMI NJE"/* 050A */,/*1291*/"CYRILLIC SMALL LETTER KOMI NJE"/* 050B */, /*1292*/"CYRILLIC CAPITAL LETTER KOMI SJE"/* 050C */,/*1293*/"CYRILLIC SMALL LETTER KOMI SJE"/* 050D */, /*1294*/"CYRILLIC CAPITAL LETTER KOMI TJE"/* 050E */,/*1295*/"CYRILLIC SMALL LETTER KOMI TJE"/* 050F */, /*1296*/"CYRILLIC CAPITAL LETTER REVERSED ZE"/* 0510 */,/*1297*/"CYRILLIC SMALL LETTER REVERSED ZE"/* 0511 */, /*1298*/"CYRILLIC CAPITAL LETTER EL WITH HOOK"/* 0512 */,/*1299*/"CYRILLIC SMALL LETTER EL WITH HOOK"/* 0513 */, /*1300*/"CYRILLIC CAPITAL LETTER LHA"/* 0514 */,/*1301*/"CYRILLIC SMALL LETTER LHA"/* 0515 */, /*1302*/"CYRILLIC CAPITAL LETTER RHA"/* 0516 */,/*1303*/"CYRILLIC SMALL LETTER RHA"/* 0517 */, /*1304*/"CYRILLIC CAPITAL LETTER YAE"/* 0518 */,/*1305*/"CYRILLIC SMALL LETTER YAE"/* 0519 */, /*1306*/"CYRILLIC CAPITAL LETTER QA"/* 051A */,/*1307*/"CYRILLIC SMALL LETTER QA"/* 051B */, /*1308*/"CYRILLIC CAPITAL LETTER WE"/* 051C */,/*1309*/"CYRILLIC SMALL LETTER WE"/* 051D */, /*1310*/"CYRILLIC CAPITAL LETTER ALEUT KA"/* 051E */,/*1311*/"CYRILLIC SMALL LETTER ALEUT KA"/* 051F */, /*1312*/"CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK"/* 0520 */, /*1313*/"CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK"/* 0521 */, /*1314*/"CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK"/* 0522 */, /*1315*/"CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK"/* 0523 */, /*1316*/"CYRILLIC CAPITAL LETTER PE WITH DESCENDER"/* 0524 */, /*1317*/"CYRILLIC SMALL LETTER PE WITH DESCENDER"/* 0525 */, /*1318*/"CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER"/* 0526 */, /*1319*/"CYRILLIC SMALL LETTER SHHA WITH DESCENDER"/* 0527 */, /*1320*/"CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK"/* 0528 */, /*1321*/"CYRILLIC SMALL LETTER EN WITH LEFT HOOK"/* 0529 */,/*1322*/"CYRILLIC CAPITAL LETTER DZZHE"/* 052A */, /*1323*/"CYRILLIC SMALL LETTER DZZHE"/* 052B */,/*1324*/"CYRILLIC CAPITAL LETTER DCHE"/* 052C */, /*1325*/"CYRILLIC SMALL LETTER DCHE"/* 052D */,/*1326*/"CYRILLIC CAPITAL LETTER EL WITH DESCENDER"/* 052E */, /*1327*/"CYRILLIC SMALL LETTER EL WITH DESCENDER"/* 052F */,NULL,/*1329*/"ARMENIAN CAPITAL LETTER AYB"/* 0531 */, /*1330*/"ARMENIAN CAPITAL LETTER BEN"/* 0532 */,/*1331*/"ARMENIAN CAPITAL LETTER GIM"/* 0533 */, /*1332*/"ARMENIAN CAPITAL LETTER DA"/* 0534 */,/*1333*/"ARMENIAN CAPITAL LETTER ECH"/* 0535 */, /*1334*/"ARMENIAN CAPITAL LETTER ZA"/* 0536 */,/*1335*/"ARMENIAN CAPITAL LETTER EH"/* 0537 */, /*1336*/"ARMENIAN CAPITAL LETTER ET"/* 0538 */,/*1337*/"ARMENIAN CAPITAL LETTER TO"/* 0539 */, /*1338*/"ARMENIAN CAPITAL LETTER ZHE"/* 053A */,/*1339*/"ARMENIAN CAPITAL LETTER INI"/* 053B */, /*1340*/"ARMENIAN CAPITAL LETTER LIWN"/* 053C */,/*1341*/"ARMENIAN CAPITAL LETTER XEH"/* 053D */, /*1342*/"ARMENIAN CAPITAL LETTER CA"/* 053E */,/*1343*/"ARMENIAN CAPITAL LETTER KEN"/* 053F */, /*1344*/"ARMENIAN CAPITAL LETTER HO"/* 0540 */,/*1345*/"ARMENIAN CAPITAL LETTER JA"/* 0541 */, /*1346*/"ARMENIAN CAPITAL LETTER GHAD"/* 0542 */,/*1347*/"ARMENIAN CAPITAL LETTER CHEH"/* 0543 */, /*1348*/"ARMENIAN CAPITAL LETTER MEN"/* 0544 */,/*1349*/"ARMENIAN CAPITAL LETTER YI"/* 0545 */, /*1350*/"ARMENIAN CAPITAL LETTER NOW"/* 0546 */,/*1351*/"ARMENIAN CAPITAL LETTER SHA"/* 0547 */, /*1352*/"ARMENIAN CAPITAL LETTER VO"/* 0548 */,/*1353*/"ARMENIAN CAPITAL LETTER CHA"/* 0549 */, /*1354*/"ARMENIAN CAPITAL LETTER PEH"/* 054A */,/*1355*/"ARMENIAN CAPITAL LETTER JHEH"/* 054B */, /*1356*/"ARMENIAN CAPITAL LETTER RA"/* 054C */,/*1357*/"ARMENIAN CAPITAL LETTER SEH"/* 054D */, /*1358*/"ARMENIAN CAPITAL LETTER VEW"/* 054E */,/*1359*/"ARMENIAN CAPITAL LETTER TIWN"/* 054F */, /*1360*/"ARMENIAN CAPITAL LETTER REH"/* 0550 */,/*1361*/"ARMENIAN CAPITAL LETTER CO"/* 0551 */, /*1362*/"ARMENIAN CAPITAL LETTER YIWN"/* 0552 */,/*1363*/"ARMENIAN CAPITAL LETTER PIWR"/* 0553 */, /*1364*/"ARMENIAN CAPITAL LETTER KEH"/* 0554 */,/*1365*/"ARMENIAN CAPITAL LETTER OH"/* 0555 */, /*1366*/"ARMENIAN CAPITAL LETTER FEH"/* 0556 */,NULL,NULL,/*1369*/"ARMENIAN MODIFIER LETTER LEFT HALF RING"/* 0559 */, /*1370*/"ARMENIAN APOSTROPHE"/* 055A */,/*1371*/"ARMENIAN EMPHASIS MARK"/* 055B */, /*1372*/"ARMENIAN EXCLAMATION MARK"/* 055C */,/*1373*/"ARMENIAN COMMA"/* 055D */, /*1374*/"ARMENIAN QUESTION MARK"/* 055E */,/*1375*/"ARMENIAN ABBREVIATION MARK"/* 055F */,NULL, /*1377*/"ARMENIAN SMALL LETTER AYB"/* 0561 */,/*1378*/"ARMENIAN SMALL LETTER BEN"/* 0562 */, /*1379*/"ARMENIAN SMALL LETTER GIM"/* 0563 */,/*1380*/"ARMENIAN SMALL LETTER DA"/* 0564 */, /*1381*/"ARMENIAN SMALL LETTER ECH"/* 0565 */,/*1382*/"ARMENIAN SMALL LETTER ZA"/* 0566 */, /*1383*/"ARMENIAN SMALL LETTER EH"/* 0567 */,/*1384*/"ARMENIAN SMALL LETTER ET"/* 0568 */, /*1385*/"ARMENIAN SMALL LETTER TO"/* 0569 */,/*1386*/"ARMENIAN SMALL LETTER ZHE"/* 056A */, /*1387*/"ARMENIAN SMALL LETTER INI"/* 056B */,/*1388*/"ARMENIAN SMALL LETTER LIWN"/* 056C */, /*1389*/"ARMENIAN SMALL LETTER XEH"/* 056D */,/*1390*/"ARMENIAN SMALL LETTER CA"/* 056E */, /*1391*/"ARMENIAN SMALL LETTER KEN"/* 056F */,/*1392*/"ARMENIAN SMALL LETTER HO"/* 0570 */, /*1393*/"ARMENIAN SMALL LETTER JA"/* 0571 */,/*1394*/"ARMENIAN SMALL LETTER GHAD"/* 0572 */, /*1395*/"ARMENIAN SMALL LETTER CHEH"/* 0573 */,/*1396*/"ARMENIAN SMALL LETTER MEN"/* 0574 */, /*1397*/"ARMENIAN SMALL LETTER YI"/* 0575 */,/*1398*/"ARMENIAN SMALL LETTER NOW"/* 0576 */, /*1399*/"ARMENIAN SMALL LETTER SHA"/* 0577 */,/*1400*/"ARMENIAN SMALL LETTER VO"/* 0578 */, /*1401*/"ARMENIAN SMALL LETTER CHA"/* 0579 */,/*1402*/"ARMENIAN SMALL LETTER PEH"/* 057A */, /*1403*/"ARMENIAN SMALL LETTER JHEH"/* 057B */,/*1404*/"ARMENIAN SMALL LETTER RA"/* 057C */, /*1405*/"ARMENIAN SMALL LETTER SEH"/* 057D */,/*1406*/"ARMENIAN SMALL LETTER VEW"/* 057E */, /*1407*/"ARMENIAN SMALL LETTER TIWN"/* 057F */,/*1408*/"ARMENIAN SMALL LETTER REH"/* 0580 */, /*1409*/"ARMENIAN SMALL LETTER CO"/* 0581 */,/*1410*/"ARMENIAN SMALL LETTER YIWN"/* 0582 */, /*1411*/"ARMENIAN SMALL LETTER PIWR"/* 0583 */,/*1412*/"ARMENIAN SMALL LETTER KEH"/* 0584 */, /*1413*/"ARMENIAN SMALL LETTER OH"/* 0585 */,/*1414*/"ARMENIAN SMALL LETTER FEH"/* 0586 */, /*1415*/"ARMENIAN SMALL LIGATURE ECH YIWN"/* 0587 */,NULL,/*1417*/"ARMENIAN FULL STOP"/* 0589 */, /*1418*/"ARMENIAN HYPHEN"/* 058A */,NULL,NULL,/*1421*/"RIGHT-FACING ARMENIAN ETERNITY SIGN"/* 058D */, /*1422*/"LEFT-FACING ARMENIAN ETERNITY SIGN"/* 058E */,/*1423*/"ARMENIAN DRAM SIGN"/* 058F */,NULL, /*1425*/"HEBREW ACCENT ETNAHTA"/* 0591 */,/*1426*/"HEBREW ACCENT SEGOL"/* 0592 */, /*1427*/"HEBREW ACCENT SHALSHELET"/* 0593 */,/*1428*/"HEBREW ACCENT ZAQEF QATAN"/* 0594 */, /*1429*/"HEBREW ACCENT ZAQEF GADOL"/* 0595 */,/*1430*/"HEBREW ACCENT TIPEHA"/* 0596 */, /*1431*/"HEBREW ACCENT REVIA"/* 0597 */,/*1432*/"HEBREW ACCENT ZARQA"/* 0598 */,/*1433*/"HEBREW ACCENT PASHTA"/* 0599 */, /*1434*/"HEBREW ACCENT YETIV"/* 059A */,/*1435*/"HEBREW ACCENT TEVIR"/* 059B */,/*1436*/"HEBREW ACCENT GERESH"/* 059C */, /*1437*/"HEBREW ACCENT GERESH MUQDAM"/* 059D */,/*1438*/"HEBREW ACCENT GERSHAYIM"/* 059E */, /*1439*/"HEBREW ACCENT QARNEY PARA"/* 059F */,/*1440*/"HEBREW ACCENT TELISHA GEDOLA"/* 05A0 */, /*1441*/"HEBREW ACCENT PAZER"/* 05A1 */,/*1442*/"HEBREW ACCENT ATNAH HAFUKH"/* 05A2 */, /*1443*/"HEBREW ACCENT MUNAH"/* 05A3 */,/*1444*/"HEBREW ACCENT MAHAPAKH"/* 05A4 */, /*1445*/"HEBREW ACCENT MERKHA"/* 05A5 */,/*1446*/"HEBREW ACCENT MERKHA KEFULA"/* 05A6 */, /*1447*/"HEBREW ACCENT DARGA"/* 05A7 */,/*1448*/"HEBREW ACCENT QADMA"/* 05A8 */, /*1449*/"HEBREW ACCENT TELISHA QETANA"/* 05A9 */,/*1450*/"HEBREW ACCENT YERAH BEN YOMO"/* 05AA */, /*1451*/"HEBREW ACCENT OLE"/* 05AB */,/*1452*/"HEBREW ACCENT ILUY"/* 05AC */,/*1453*/"HEBREW ACCENT DEHI"/* 05AD */, /*1454*/"HEBREW ACCENT ZINOR"/* 05AE */,/*1455*/"HEBREW MARK MASORA CIRCLE"/* 05AF */, /*1456*/"HEBREW POINT SHEVA"/* 05B0 */,/*1457*/"HEBREW POINT HATAF SEGOL"/* 05B1 */, /*1458*/"HEBREW POINT HATAF PATAH"/* 05B2 */,/*1459*/"HEBREW POINT HATAF QAMATS"/* 05B3 */, /*1460*/"HEBREW POINT HIRIQ"/* 05B4 */,/*1461*/"HEBREW POINT TSERE"/* 05B5 */,/*1462*/"HEBREW POINT SEGOL"/* 05B6 */, /*1463*/"HEBREW POINT PATAH"/* 05B7 */,/*1464*/"HEBREW POINT QAMATS"/* 05B8 */,/*1465*/"HEBREW POINT HOLAM"/* 05B9 */, /*1466*/"HEBREW POINT HOLAM HASER FOR VAV"/* 05BA */,/*1467*/"HEBREW POINT QUBUTS"/* 05BB */, /*1468*/"HEBREW POINT DAGESH OR MAPIQ"/* 05BC */,/*1469*/"HEBREW POINT METEG"/* 05BD */, /*1470*/"HEBREW PUNCTUATION MAQAF"/* 05BE */,/*1471*/"HEBREW POINT RAFE"/* 05BF */, /*1472*/"HEBREW PUNCTUATION PASEQ"/* 05C0 */,/*1473*/"HEBREW POINT SHIN DOT"/* 05C1 */, /*1474*/"HEBREW POINT SIN DOT"/* 05C2 */,/*1475*/"HEBREW PUNCTUATION SOF PASUQ"/* 05C3 */, /*1476*/"HEBREW MARK UPPER DOT"/* 05C4 */,/*1477*/"HEBREW MARK LOWER DOT"/* 05C5 */, /*1478*/"HEBREW PUNCTUATION NUN HAFUKHA"/* 05C6 */,/*1479*/"HEBREW POINT QAMATS QATAN"/* 05C7 */,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,/*1488*/"HEBREW LETTER ALEF"/* 05D0 */,/*1489*/"HEBREW LETTER BET"/* 05D1 */, /*1490*/"HEBREW LETTER GIMEL"/* 05D2 */,/*1491*/"HEBREW LETTER DALET"/* 05D3 */,/*1492*/"HEBREW LETTER HE"/* 05D4 */, /*1493*/"HEBREW LETTER VAV"/* 05D5 */,/*1494*/"HEBREW LETTER ZAYIN"/* 05D6 */,/*1495*/"HEBREW LETTER HET"/* 05D7 */, /*1496*/"HEBREW LETTER TET"/* 05D8 */,/*1497*/"HEBREW LETTER YOD"/* 05D9 */,/*1498*/"HEBREW LETTER FINAL KAF"/* 05DA */, /*1499*/"HEBREW LETTER KAF"/* 05DB */,/*1500*/"HEBREW LETTER LAMED"/* 05DC */, /*1501*/"HEBREW LETTER FINAL MEM"/* 05DD */,/*1502*/"HEBREW LETTER MEM"/* 05DE */, /*1503*/"HEBREW LETTER FINAL NUN"/* 05DF */,/*1504*/"HEBREW LETTER NUN"/* 05E0 */, /*1505*/"HEBREW LETTER SAMEKH"/* 05E1 */,/*1506*/"HEBREW LETTER AYIN"/* 05E2 */, /*1507*/"HEBREW LETTER FINAL PE"/* 05E3 */,/*1508*/"HEBREW LETTER PE"/* 05E4 */, /*1509*/"HEBREW LETTER FINAL TSADI"/* 05E5 */,/*1510*/"HEBREW LETTER TSADI"/* 05E6 */, /*1511*/"HEBREW LETTER QOF"/* 05E7 */,/*1512*/"HEBREW LETTER RESH"/* 05E8 */,/*1513*/"HEBREW LETTER SHIN"/* 05E9 */, /*1514*/"HEBREW LETTER TAV"/* 05EA */,NULL,NULL,NULL,NULL,NULL,/*1520*/"HEBREW LIGATURE YIDDISH DOUBLE VAV"/* 05F0 */, /*1521*/"HEBREW LIGATURE YIDDISH VAV YOD"/* 05F1 */,/*1522*/"HEBREW LIGATURE YIDDISH DOUBLE YOD"/* 05F2 */, /*1523*/"HEBREW PUNCTUATION GERESH"/* 05F3 */,/*1524*/"HEBREW PUNCTUATION GERSHAYIM"/* 05F4 */,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,/*1536*/"ARABIC NUMBER SIGN"/* 0600 */,/*1537*/"ARABIC SIGN SANAH"/* 0601 */, /*1538*/"ARABIC FOOTNOTE MARKER"/* 0602 */,/*1539*/"ARABIC SIGN SAFHA"/* 0603 */,/*1540*/"ARABIC SIGN SAMVAT"/* 0604 */, /*1541*/"ARABIC NUMBER MARK ABOVE"/* 0605 */,/*1542*/"ARABIC-INDIC CUBE ROOT"/* 0606 */, /*1543*/"ARABIC-INDIC FOURTH ROOT"/* 0607 */,/*1544*/"ARABIC RAY"/* 0608 */, /*1545*/"ARABIC-INDIC PER MILLE SIGN"/* 0609 */,/*1546*/"ARABIC-INDIC PER TEN THOUSAND SIGN"/* 060A */, /*1547*/"AFGHANI SIGN"/* 060B */,/*1548*/"ARABIC COMMA"/* 060C */,/*1549*/"ARABIC DATE SEPARATOR"/* 060D */, /*1550*/"ARABIC POETIC VERSE SIGN"/* 060E */,/*1551*/"ARABIC SIGN MISRA"/* 060F */, /*1552*/"ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM"/* 0610 */,/*1553*/"ARABIC SIGN ALAYHE ASSALLAM"/* 0611 */, /*1554*/"ARABIC SIGN RAHMATULLAH ALAYHE"/* 0612 */,/*1555*/"ARABIC SIGN RADI ALLAHOU ANHU"/* 0613 */, /*1556*/"ARABIC SIGN TAKHALLUS"/* 0614 */,/*1557*/"ARABIC SMALL HIGH TAH"/* 0615 */, /*1558*/"ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH"/* 0616 */,/*1559*/"ARABIC SMALL HIGH ZAIN"/* 0617 */, /*1560*/"ARABIC SMALL FATHA"/* 0618 */,/*1561*/"ARABIC SMALL DAMMA"/* 0619 */,/*1562*/"ARABIC SMALL KASRA"/* 061A */, /*1563*/"ARABIC SEMICOLON"/* 061B */,/*1564*/"ARABIC LETTER MARK"/* 061C */,NULL, /*1566*/"ARABIC TRIPLE DOT PUNCTUATION MARK"/* 061E */,/*1567*/"ARABIC QUESTION MARK"/* 061F */, /*1568*/"ARABIC LETTER KASHMIRI YEH"/* 0620 */,/*1569*/"ARABIC LETTER HAMZA"/* 0621 */, /*1570*/"ARABIC LETTER ALEF WITH MADDA ABOVE"/* 0622 */,/*1571*/"ARABIC LETTER ALEF WITH HAMZA ABOVE"/* 0623 */, /*1572*/"ARABIC LETTER WAW WITH HAMZA ABOVE"/* 0624 */,/*1573*/"ARABIC LETTER ALEF WITH HAMZA BELOW"/* 0625 */, /*1574*/"ARABIC LETTER YEH WITH HAMZA ABOVE"/* 0626 */,/*1575*/"ARABIC LETTER ALEF"/* 0627 */, /*1576*/"ARABIC LETTER BEH"/* 0628 */,/*1577*/"ARABIC LETTER TEH MARBUTA"/* 0629 */, /*1578*/"ARABIC LETTER TEH"/* 062A */,/*1579*/"ARABIC LETTER THEH"/* 062B */,/*1580*/"ARABIC LETTER JEEM"/* 062C */, /*1581*/"ARABIC LETTER HAH"/* 062D */,/*1582*/"ARABIC LETTER KHAH"/* 062E */,/*1583*/"ARABIC LETTER DAL"/* 062F */, /*1584*/"ARABIC LETTER THAL"/* 0630 */,/*1585*/"ARABIC LETTER REH"/* 0631 */,/*1586*/"ARABIC LETTER ZAIN"/* 0632 */, /*1587*/"ARABIC LETTER SEEN"/* 0633 */,/*1588*/"ARABIC LETTER SHEEN"/* 0634 */,/*1589*/"ARABIC LETTER SAD"/* 0635 */, /*1590*/"ARABIC LETTER DAD"/* 0636 */,/*1591*/"ARABIC LETTER TAH"/* 0637 */,/*1592*/"ARABIC LETTER ZAH"/* 0638 */, /*1593*/"ARABIC LETTER AIN"/* 0639 */,/*1594*/"ARABIC LETTER GHAIN"/* 063A */, /*1595*/"ARABIC LETTER KEHEH WITH TWO DOTS ABOVE"/* 063B */, /*1596*/"ARABIC LETTER KEHEH WITH THREE DOTS BELOW"/* 063C */, /*1597*/"ARABIC LETTER FARSI YEH WITH INVERTED V"/* 063D */, /*1598*/"ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE"/* 063E */, /*1599*/"ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE"/* 063F */,/*1600*/"ARABIC TATWEEL"/* 0640 */, /*1601*/"ARABIC LETTER FEH"/* 0641 */,/*1602*/"ARABIC LETTER QAF"/* 0642 */,/*1603*/"ARABIC LETTER KAF"/* 0643 */, /*1604*/"ARABIC LETTER LAM"/* 0644 */,/*1605*/"ARABIC LETTER MEEM"/* 0645 */,/*1606*/"ARABIC LETTER NOON"/* 0646 */, /*1607*/"ARABIC LETTER HEH"/* 0647 */,/*1608*/"ARABIC LETTER WAW"/* 0648 */, /*1609*/"ARABIC LETTER ALEF MAKSURA"/* 0649 */,/*1610*/"ARABIC LETTER YEH"/* 064A */,/*1611*/"ARABIC FATHATAN"/* 064B */, /*1612*/"ARABIC DAMMATAN"/* 064C */,/*1613*/"ARABIC KASRATAN"/* 064D */,/*1614*/"ARABIC FATHA"/* 064E */, /*1615*/"ARABIC DAMMA"/* 064F */,/*1616*/"ARABIC KASRA"/* 0650 */,/*1617*/"ARABIC SHADDA"/* 0651 */, /*1618*/"ARABIC SUKUN"/* 0652 */,/*1619*/"ARABIC MADDAH ABOVE"/* 0653 */,/*1620*/"ARABIC HAMZA ABOVE"/* 0654 */, /*1621*/"ARABIC HAMZA BELOW"/* 0655 */,/*1622*/"ARABIC SUBSCRIPT ALEF"/* 0656 */, /*1623*/"ARABIC INVERTED DAMMA"/* 0657 */,/*1624*/"ARABIC MARK NOON GHUNNA"/* 0658 */, /*1625*/"ARABIC ZWARAKAY"/* 0659 */,/*1626*/"ARABIC VOWEL SIGN SMALL V ABOVE"/* 065A */, /*1627*/"ARABIC VOWEL SIGN INVERTED SMALL V ABOVE"/* 065B */,/*1628*/"ARABIC VOWEL SIGN DOT BELOW"/* 065C */, /*1629*/"ARABIC REVERSED DAMMA"/* 065D */,/*1630*/"ARABIC FATHA WITH TWO DOTS"/* 065E */, /*1631*/"ARABIC WAVY HAMZA BELOW"/* 065F */,/*1632*/"ARABIC-INDIC DIGIT ZERO"/* 0660 */, /*1633*/"ARABIC-INDIC DIGIT ONE"/* 0661 */,/*1634*/"ARABIC-INDIC DIGIT TWO"/* 0662 */, /*1635*/"ARABIC-INDIC DIGIT THREE"/* 0663 */,/*1636*/"ARABIC-INDIC DIGIT FOUR"/* 0664 */, /*1637*/"ARABIC-INDIC DIGIT FIVE"/* 0665 */,/*1638*/"ARABIC-INDIC DIGIT SIX"/* 0666 */, /*1639*/"ARABIC-INDIC DIGIT SEVEN"/* 0667 */,/*1640*/"ARABIC-INDIC DIGIT EIGHT"/* 0668 */, /*1641*/"ARABIC-INDIC DIGIT NINE"/* 0669 */,/*1642*/"ARABIC PERCENT SIGN"/* 066A */, /*1643*/"ARABIC DECIMAL SEPARATOR"/* 066B */,/*1644*/"ARABIC THOUSANDS SEPARATOR"/* 066C */, /*1645*/"ARABIC FIVE POINTED STAR"/* 066D */,/*1646*/"ARABIC LETTER DOTLESS BEH"/* 066E */, /*1647*/"ARABIC LETTER DOTLESS QAF"/* 066F */,/*1648*/"ARABIC LETTER SUPERSCRIPT ALEF"/* 0670 */, /*1649*/"ARABIC LETTER ALEF WASLA"/* 0671 */,/*1650*/"ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE"/* 0672 */, /*1651*/"ARABIC LETTER ALEF WITH WAVY HAMZA BELOW"/* 0673 */,/*1652*/"ARABIC LETTER HIGH HAMZA"/* 0674 */, /*1653*/"ARABIC LETTER HIGH HAMZA ALEF"/* 0675 */,/*1654*/"ARABIC LETTER HIGH HAMZA WAW"/* 0676 */, /*1655*/"ARABIC LETTER U WITH HAMZA ABOVE"/* 0677 */,/*1656*/"ARABIC LETTER HIGH HAMZA YEH"/* 0678 */, /*1657*/"ARABIC LETTER TTEH"/* 0679 */,/*1658*/"ARABIC LETTER TTEHEH"/* 067A */,/*1659*/"ARABIC LETTER BEEH"/* 067B */, /*1660*/"ARABIC LETTER TEH WITH RING"/* 067C */,/*1661*/"ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS"/* 067D */, /*1662*/"ARABIC LETTER PEH"/* 067E */,/*1663*/"ARABIC LETTER TEHEH"/* 067F */,/*1664*/"ARABIC LETTER BEHEH"/* 0680 */, /*1665*/"ARABIC LETTER HAH WITH HAMZA ABOVE"/* 0681 */, /*1666*/"ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE"/* 0682 */,/*1667*/"ARABIC LETTER NYEH"/* 0683 */, /*1668*/"ARABIC LETTER DYEH"/* 0684 */,/*1669*/"ARABIC LETTER HAH WITH THREE DOTS ABOVE"/* 0685 */, /*1670*/"ARABIC LETTER TCHEH"/* 0686 */,/*1671*/"ARABIC LETTER TCHEHEH"/* 0687 */,/*1672*/"ARABIC LETTER DDAL"/* 0688 */, /*1673*/"ARABIC LETTER DAL WITH RING"/* 0689 */,/*1674*/"ARABIC LETTER DAL WITH DOT BELOW"/* 068A */, /*1675*/"ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH"/* 068B */,/*1676*/"ARABIC LETTER DAHAL"/* 068C */, /*1677*/"ARABIC LETTER DDAHAL"/* 068D */,/*1678*/"ARABIC LETTER DUL"/* 068E */, /*1679*/"ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS"/* 068F */, /*1680*/"ARABIC LETTER DAL WITH FOUR DOTS ABOVE"/* 0690 */,/*1681*/"ARABIC LETTER RREH"/* 0691 */, /*1682*/"ARABIC LETTER REH WITH SMALL V"/* 0692 */,/*1683*/"ARABIC LETTER REH WITH RING"/* 0693 */, /*1684*/"ARABIC LETTER REH WITH DOT BELOW"/* 0694 */,/*1685*/"ARABIC LETTER REH WITH SMALL V BELOW"/* 0695 */, /*1686*/"ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE"/* 0696 */, /*1687*/"ARABIC LETTER REH WITH TWO DOTS ABOVE"/* 0697 */,/*1688*/"ARABIC LETTER JEH"/* 0698 */, /*1689*/"ARABIC LETTER REH WITH FOUR DOTS ABOVE"/* 0699 */, /*1690*/"ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE"/* 069A */, /*1691*/"ARABIC LETTER SEEN WITH THREE DOTS BELOW"/* 069B */, /*1692*/"ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE"/* 069C */, /*1693*/"ARABIC LETTER SAD WITH TWO DOTS BELOW"/* 069D */,/*1694*/"ARABIC LETTER SAD WITH THREE DOTS ABOVE"/* 069E */, /*1695*/"ARABIC LETTER TAH WITH THREE DOTS ABOVE"/* 069F */,/*1696*/"ARABIC LETTER AIN WITH THREE DOTS ABOVE"/* 06A0 */, /*1697*/"ARABIC LETTER DOTLESS FEH"/* 06A1 */,/*1698*/"ARABIC LETTER FEH WITH DOT MOVED BELOW"/* 06A2 */, /*1699*/"ARABIC LETTER FEH WITH DOT BELOW"/* 06A3 */,/*1700*/"ARABIC LETTER VEH"/* 06A4 */, /*1701*/"ARABIC LETTER FEH WITH THREE DOTS BELOW"/* 06A5 */,/*1702*/"ARABIC LETTER PEHEH"/* 06A6 */, /*1703*/"ARABIC LETTER QAF WITH DOT ABOVE"/* 06A7 */,/*1704*/"ARABIC LETTER QAF WITH THREE DOTS ABOVE"/* 06A8 */, /*1705*/"ARABIC LETTER KEHEH"/* 06A9 */,/*1706*/"ARABIC LETTER SWASH KAF"/* 06AA */, /*1707*/"ARABIC LETTER KAF WITH RING"/* 06AB */,/*1708*/"ARABIC LETTER KAF WITH DOT ABOVE"/* 06AC */, /*1709*/"ARABIC LETTER NG"/* 06AD */,/*1710*/"ARABIC LETTER KAF WITH THREE DOTS BELOW"/* 06AE */, /*1711*/"ARABIC LETTER GAF"/* 06AF */,/*1712*/"ARABIC LETTER GAF WITH RING"/* 06B0 */, /*1713*/"ARABIC LETTER NGOEH"/* 06B1 */,/*1714*/"ARABIC LETTER GAF WITH TWO DOTS BELOW"/* 06B2 */, /*1715*/"ARABIC LETTER GUEH"/* 06B3 */,/*1716*/"ARABIC LETTER GAF WITH THREE DOTS ABOVE"/* 06B4 */, /*1717*/"ARABIC LETTER LAM WITH SMALL V"/* 06B5 */,/*1718*/"ARABIC LETTER LAM WITH DOT ABOVE"/* 06B6 */, /*1719*/"ARABIC LETTER LAM WITH THREE DOTS ABOVE"/* 06B7 */,/*1720*/"ARABIC LETTER LAM WITH THREE DOTS BELOW"/* 06B8 */, /*1721*/"ARABIC LETTER NOON WITH DOT BELOW"/* 06B9 */,/*1722*/"ARABIC LETTER NOON GHUNNA"/* 06BA */, /*1723*/"ARABIC LETTER RNOON"/* 06BB */,/*1724*/"ARABIC LETTER NOON WITH RING"/* 06BC */, /*1725*/"ARABIC LETTER NOON WITH THREE DOTS ABOVE"/* 06BD */,/*1726*/"ARABIC LETTER HEH DOACHASHMEE"/* 06BE */, /*1727*/"ARABIC LETTER TCHEH WITH DOT ABOVE"/* 06BF */,/*1728*/"ARABIC LETTER HEH WITH YEH ABOVE"/* 06C0 */, /*1729*/"ARABIC LETTER HEH GOAL"/* 06C1 */,/*1730*/"ARABIC LETTER HEH GOAL WITH HAMZA ABOVE"/* 06C2 */, /*1731*/"ARABIC LETTER TEH MARBUTA GOAL"/* 06C3 */,/*1732*/"ARABIC LETTER WAW WITH RING"/* 06C4 */, /*1733*/"ARABIC LETTER KIRGHIZ OE"/* 06C5 */,/*1734*/"ARABIC LETTER OE"/* 06C6 */,/*1735*/"ARABIC LETTER U"/* 06C7 */, /*1736*/"ARABIC LETTER YU"/* 06C8 */,/*1737*/"ARABIC LETTER KIRGHIZ YU"/* 06C9 */, /*1738*/"ARABIC LETTER WAW WITH TWO DOTS ABOVE"/* 06CA */,/*1739*/"ARABIC LETTER VE"/* 06CB */, /*1740*/"ARABIC LETTER FARSI YEH"/* 06CC */,/*1741*/"ARABIC LETTER YEH WITH TAIL"/* 06CD */, /*1742*/"ARABIC LETTER YEH WITH SMALL V"/* 06CE */,/*1743*/"ARABIC LETTER WAW WITH DOT ABOVE"/* 06CF */, /*1744*/"ARABIC LETTER E"/* 06D0 */,/*1745*/"ARABIC LETTER YEH WITH THREE DOTS BELOW"/* 06D1 */, /*1746*/"ARABIC LETTER YEH BARREE"/* 06D2 */,/*1747*/"ARABIC LETTER YEH BARREE WITH HAMZA ABOVE"/* 06D3 */, /*1748*/"ARABIC FULL STOP"/* 06D4 */,/*1749*/"ARABIC LETTER AE"/* 06D5 */, /*1750*/"ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA"/* 06D6 */, /*1751*/"ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA"/* 06D7 */, /*1752*/"ARABIC SMALL HIGH MEEM INITIAL FORM"/* 06D8 */,/*1753*/"ARABIC SMALL HIGH LAM ALEF"/* 06D9 */, /*1754*/"ARABIC SMALL HIGH JEEM"/* 06DA */,/*1755*/"ARABIC SMALL HIGH THREE DOTS"/* 06DB */, /*1756*/"ARABIC SMALL HIGH SEEN"/* 06DC */,/*1757*/"ARABIC END OF AYAH"/* 06DD */, /*1758*/"ARABIC START OF RUB EL HIZB"/* 06DE */,/*1759*/"ARABIC SMALL HIGH ROUNDED ZERO"/* 06DF */, /*1760*/"ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO"/* 06E0 */, /*1761*/"ARABIC SMALL HIGH DOTLESS HEAD OF KHAH"/* 06E1 */,/*1762*/"ARABIC SMALL HIGH MEEM ISOLATED FORM"/* 06E2 */, /*1763*/"ARABIC SMALL LOW SEEN"/* 06E3 */,/*1764*/"ARABIC SMALL HIGH MADDA"/* 06E4 */, /*1765*/"ARABIC SMALL WAW"/* 06E5 */,/*1766*/"ARABIC SMALL YEH"/* 06E6 */,/*1767*/"ARABIC SMALL HIGH YEH"/* 06E7 */, /*1768*/"ARABIC SMALL HIGH NOON"/* 06E8 */,/*1769*/"ARABIC PLACE OF SAJDAH"/* 06E9 */, /*1770*/"ARABIC EMPTY CENTRE LOW STOP"/* 06EA */,/*1771*/"ARABIC EMPTY CENTRE HIGH STOP"/* 06EB */, /*1772*/"ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE"/* 06EC */,/*1773*/"ARABIC SMALL LOW MEEM"/* 06ED */, /*1774*/"ARABIC LETTER DAL WITH INVERTED V"/* 06EE */,/*1775*/"ARABIC LETTER REH WITH INVERTED V"/* 06EF */, /*1776*/"EXTENDED ARABIC-INDIC DIGIT ZERO"/* 06F0 */,/*1777*/"EXTENDED ARABIC-INDIC DIGIT ONE"/* 06F1 */, /*1778*/"EXTENDED ARABIC-INDIC DIGIT TWO"/* 06F2 */,/*1779*/"EXTENDED ARABIC-INDIC DIGIT THREE"/* 06F3 */, /*1780*/"EXTENDED ARABIC-INDIC DIGIT FOUR"/* 06F4 */,/*1781*/"EXTENDED ARABIC-INDIC DIGIT FIVE"/* 06F5 */, /*1782*/"EXTENDED ARABIC-INDIC DIGIT SIX"/* 06F6 */,/*1783*/"EXTENDED ARABIC-INDIC DIGIT SEVEN"/* 06F7 */, /*1784*/"EXTENDED ARABIC-INDIC DIGIT EIGHT"/* 06F8 */,/*1785*/"EXTENDED ARABIC-INDIC DIGIT NINE"/* 06F9 */, /*1786*/"ARABIC LETTER SHEEN WITH DOT BELOW"/* 06FA */,/*1787*/"ARABIC LETTER DAD WITH DOT BELOW"/* 06FB */, /*1788*/"ARABIC LETTER GHAIN WITH DOT BELOW"/* 06FC */,/*1789*/"ARABIC SIGN SINDHI AMPERSAND"/* 06FD */, /*1790*/"ARABIC SIGN SINDHI POSTPOSITION MEN"/* 06FE */,/*1791*/"ARABIC LETTER HEH WITH INVERTED V"/* 06FF */, /*1792*/"SYRIAC END OF PARAGRAPH"/* 0700 */,/*1793*/"SYRIAC SUPRALINEAR FULL STOP"/* 0701 */, /*1794*/"SYRIAC SUBLINEAR FULL STOP"/* 0702 */,/*1795*/"SYRIAC SUPRALINEAR COLON"/* 0703 */, /*1796*/"SYRIAC SUBLINEAR COLON"/* 0704 */,/*1797*/"SYRIAC HORIZONTAL COLON"/* 0705 */, /*1798*/"SYRIAC COLON SKEWED LEFT"/* 0706 */,/*1799*/"SYRIAC COLON SKEWED RIGHT"/* 0707 */, /*1800*/"SYRIAC SUPRALINEAR COLON SKEWED LEFT"/* 0708 */,/*1801*/"SYRIAC SUBLINEAR COLON SKEWED RIGHT"/* 0709 */, /*1802*/"SYRIAC CONTRACTION"/* 070A */,/*1803*/"SYRIAC HARKLEAN OBELUS"/* 070B */, /*1804*/"SYRIAC HARKLEAN METOBELUS"/* 070C */,/*1805*/"SYRIAC HARKLEAN ASTERISCUS"/* 070D */,NULL, /*1807*/"SYRIAC ABBREVIATION MARK"/* 070F */,/*1808*/"SYRIAC LETTER ALAPH"/* 0710 */, /*1809*/"SYRIAC LETTER SUPERSCRIPT ALAPH"/* 0711 */,/*1810*/"SYRIAC LETTER BETH"/* 0712 */, /*1811*/"SYRIAC LETTER GAMAL"/* 0713 */,/*1812*/"SYRIAC LETTER GAMAL GARSHUNI"/* 0714 */, /*1813*/"SYRIAC LETTER DALATH"/* 0715 */,/*1814*/"SYRIAC LETTER DOTLESS DALATH RISH"/* 0716 */, /*1815*/"SYRIAC LETTER HE"/* 0717 */,/*1816*/"SYRIAC LETTER WAW"/* 0718 */,/*1817*/"SYRIAC LETTER ZAIN"/* 0719 */, /*1818*/"SYRIAC LETTER HETH"/* 071A */,/*1819*/"SYRIAC LETTER TETH"/* 071B */, /*1820*/"SYRIAC LETTER TETH GARSHUNI"/* 071C */,/*1821*/"SYRIAC LETTER YUDH"/* 071D */, /*1822*/"SYRIAC LETTER YUDH HE"/* 071E */,/*1823*/"SYRIAC LETTER KAPH"/* 071F */, /*1824*/"SYRIAC LETTER LAMADH"/* 0720 */,/*1825*/"SYRIAC LETTER MIM"/* 0721 */,/*1826*/"SYRIAC LETTER NUN"/* 0722 */, /*1827*/"SYRIAC LETTER SEMKATH"/* 0723 */,/*1828*/"SYRIAC LETTER FINAL SEMKATH"/* 0724 */, /*1829*/"SYRIAC LETTER E"/* 0725 */,/*1830*/"SYRIAC LETTER PE"/* 0726 */,/*1831*/"SYRIAC LETTER REVERSED PE"/* 0727 */, /*1832*/"SYRIAC LETTER SADHE"/* 0728 */,/*1833*/"SYRIAC LETTER QAPH"/* 0729 */,/*1834*/"SYRIAC LETTER RISH"/* 072A */, /*1835*/"SYRIAC LETTER SHIN"/* 072B */,/*1836*/"SYRIAC LETTER TAW"/* 072C */, /*1837*/"SYRIAC LETTER PERSIAN BHETH"/* 072D */,/*1838*/"SYRIAC LETTER PERSIAN GHAMAL"/* 072E */, /*1839*/"SYRIAC LETTER PERSIAN DHALATH"/* 072F */,/*1840*/"SYRIAC PTHAHA ABOVE"/* 0730 */, /*1841*/"SYRIAC PTHAHA BELOW"/* 0731 */,/*1842*/"SYRIAC PTHAHA DOTTED"/* 0732 */,/*1843*/"SYRIAC ZQAPHA ABOVE"/* 0733 */, /*1844*/"SYRIAC ZQAPHA BELOW"/* 0734 */,/*1845*/"SYRIAC ZQAPHA DOTTED"/* 0735 */,/*1846*/"SYRIAC RBASA ABOVE"/* 0736 */, /*1847*/"SYRIAC RBASA BELOW"/* 0737 */,/*1848*/"SYRIAC DOTTED ZLAMA HORIZONTAL"/* 0738 */, /*1849*/"SYRIAC DOTTED ZLAMA ANGULAR"/* 0739 */,/*1850*/"SYRIAC HBASA ABOVE"/* 073A */, /*1851*/"SYRIAC HBASA BELOW"/* 073B */,/*1852*/"SYRIAC HBASA-ESASA DOTTED"/* 073C */, /*1853*/"SYRIAC ESASA ABOVE"/* 073D */,/*1854*/"SYRIAC ESASA BELOW"/* 073E */,/*1855*/"SYRIAC RWAHA"/* 073F */, /*1856*/"SYRIAC FEMININE DOT"/* 0740 */,/*1857*/"SYRIAC QUSHSHAYA"/* 0741 */,/*1858*/"SYRIAC RUKKAKHA"/* 0742 */, /*1859*/"SYRIAC TWO VERTICAL DOTS ABOVE"/* 0743 */,/*1860*/"SYRIAC TWO VERTICAL DOTS BELOW"/* 0744 */, /*1861*/"SYRIAC THREE DOTS ABOVE"/* 0745 */,/*1862*/"SYRIAC THREE DOTS BELOW"/* 0746 */, /*1863*/"SYRIAC OBLIQUE LINE ABOVE"/* 0747 */,/*1864*/"SYRIAC OBLIQUE LINE BELOW"/* 0748 */, /*1865*/"SYRIAC MUSIC"/* 0749 */,/*1866*/"SYRIAC BARREKH"/* 074A */,NULL,NULL, /*1869*/"SYRIAC LETTER SOGDIAN ZHAIN"/* 074D */,/*1870*/"SYRIAC LETTER SOGDIAN KHAPH"/* 074E */, /*1871*/"SYRIAC LETTER SOGDIAN FE"/* 074F */,/*1872*/"ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW"/* 0750 */, /*1873*/"ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE"/* 0751 */, /*1874*/"ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW"/* 0752 */, /*1875*/"ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE"/* 0753 */, /*1876*/"ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE"/* 0754 */, /*1877*/"ARABIC LETTER BEH WITH INVERTED SMALL V BELOW"/* 0755 */,/*1878*/"ARABIC LETTER BEH WITH SMALL V"/* 0756 */, /*1879*/"ARABIC LETTER HAH WITH TWO DOTS ABOVE"/* 0757 */, /*1880*/"ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW"/* 0758 */, /*1881*/"ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH"/* 0759 */, /*1882*/"ARABIC LETTER DAL WITH INVERTED SMALL V BELOW"/* 075A */,/*1883*/"ARABIC LETTER REH WITH STROKE"/* 075B */, /*1884*/"ARABIC LETTER SEEN WITH FOUR DOTS ABOVE"/* 075C */,/*1885*/"ARABIC LETTER AIN WITH TWO DOTS ABOVE"/* 075D */, /*1886*/"ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE"/* 075E */, /*1887*/"ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE"/* 075F */, /*1888*/"ARABIC LETTER FEH WITH TWO DOTS BELOW"/* 0760 */, /*1889*/"ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW"/* 0761 */, /*1890*/"ARABIC LETTER KEHEH WITH DOT ABOVE"/* 0762 */,/*1891*/"ARABIC LETTER KEHEH WITH THREE DOTS ABOVE"/* 0763 */, /*1892*/"ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW"/* 0764 */, /*1893*/"ARABIC LETTER MEEM WITH DOT ABOVE"/* 0765 */,/*1894*/"ARABIC LETTER MEEM WITH DOT BELOW"/* 0766 */, /*1895*/"ARABIC LETTER NOON WITH TWO DOTS BELOW"/* 0767 */,/*1896*/"ARABIC LETTER NOON WITH SMALL TAH"/* 0768 */, /*1897*/"ARABIC LETTER NOON WITH SMALL V"/* 0769 */,/*1898*/"ARABIC LETTER LAM WITH BAR"/* 076A */, /*1899*/"ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE"/* 076B */, /*1900*/"ARABIC LETTER REH WITH HAMZA ABOVE"/* 076C */, /*1901*/"ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE"/* 076D */, /*1902*/"ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW"/* 076E */, /*1903*/"ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS"/* 076F */, /*1904*/"ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS"/* 0770 */, /*1905*/"ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS"/* 0771 */, /*1906*/"ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE"/* 0772 */, /*1907*/"ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE"/* 0773 */, /*1908*/"ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE"/* 0774 */, /*1909*/"ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE"/* 0775 */, /*1910*/"ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE"/* 0776 */, /*1911*/"ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW"/* 0777 */, /*1912*/"ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE"/* 0778 */, /*1913*/"ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE"/* 0779 */, /*1914*/"ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE"/* 077A */, /*1915*/"ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE"/* 077B */, /*1916*/"ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW"/* 077C */, /*1917*/"ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE"/* 077D */, /*1918*/"ARABIC LETTER SEEN WITH INVERTED V"/* 077E */,/*1919*/"ARABIC LETTER KAF WITH TWO DOTS ABOVE"/* 077F */, /*1920*/"THAANA LETTER HAA"/* 0780 */,/*1921*/"THAANA LETTER SHAVIYANI"/* 0781 */, /*1922*/"THAANA LETTER NOONU"/* 0782 */,/*1923*/"THAANA LETTER RAA"/* 0783 */,/*1924*/"THAANA LETTER BAA"/* 0784 */, /*1925*/"THAANA LETTER LHAVIYANI"/* 0785 */,/*1926*/"THAANA LETTER KAAFU"/* 0786 */, /*1927*/"THAANA LETTER ALIFU"/* 0787 */,/*1928*/"THAANA LETTER VAAVU"/* 0788 */,/*1929*/"THAANA LETTER MEEMU"/* 0789 */, /*1930*/"THAANA LETTER FAAFU"/* 078A */,/*1931*/"THAANA LETTER DHAALU"/* 078B */,/*1932*/"THAANA LETTER THAA"/* 078C */, /*1933*/"THAANA LETTER LAAMU"/* 078D */,/*1934*/"THAANA LETTER GAAFU"/* 078E */, /*1935*/"THAANA LETTER GNAVIYANI"/* 078F */,/*1936*/"THAANA LETTER SEENU"/* 0790 */, /*1937*/"THAANA LETTER DAVIYANI"/* 0791 */,/*1938*/"THAANA LETTER ZAVIYANI"/* 0792 */, /*1939*/"THAANA LETTER TAVIYANI"/* 0793 */,/*1940*/"THAANA LETTER YAA"/* 0794 */, /*1941*/"THAANA LETTER PAVIYANI"/* 0795 */,/*1942*/"THAANA LETTER JAVIYANI"/* 0796 */, /*1943*/"THAANA LETTER CHAVIYANI"/* 0797 */,/*1944*/"THAANA LETTER TTAA"/* 0798 */, /*1945*/"THAANA LETTER HHAA"/* 0799 */,/*1946*/"THAANA LETTER KHAA"/* 079A */,/*1947*/"THAANA LETTER THAALU"/* 079B */, /*1948*/"THAANA LETTER ZAA"/* 079C */,/*1949*/"THAANA LETTER SHEENU"/* 079D */,/*1950*/"THAANA LETTER SAADHU"/* 079E */, /*1951*/"THAANA LETTER DAADHU"/* 079F */,/*1952*/"THAANA LETTER TO"/* 07A0 */,/*1953*/"THAANA LETTER ZO"/* 07A1 */, /*1954*/"THAANA LETTER AINU"/* 07A2 */,/*1955*/"THAANA LETTER GHAINU"/* 07A3 */,/*1956*/"THAANA LETTER QAAFU"/* 07A4 */, /*1957*/"THAANA LETTER WAAVU"/* 07A5 */,/*1958*/"THAANA ABAFILI"/* 07A6 */,/*1959*/"THAANA AABAAFILI"/* 07A7 */, /*1960*/"THAANA IBIFILI"/* 07A8 */,/*1961*/"THAANA EEBEEFILI"/* 07A9 */,/*1962*/"THAANA UBUFILI"/* 07AA */, /*1963*/"THAANA OOBOOFILI"/* 07AB */,/*1964*/"THAANA EBEFILI"/* 07AC */,/*1965*/"THAANA EYBEYFILI"/* 07AD */, /*1966*/"THAANA OBOFILI"/* 07AE */,/*1967*/"THAANA OABOAFILI"/* 07AF */,/*1968*/"THAANA SUKUN"/* 07B0 */, /*1969*/"THAANA LETTER NAA"/* 07B1 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*1984*/"NKO DIGIT ZERO"/* 07C0 */,/*1985*/"NKO DIGIT ONE"/* 07C1 */,/*1986*/"NKO DIGIT TWO"/* 07C2 */, /*1987*/"NKO DIGIT THREE"/* 07C3 */,/*1988*/"NKO DIGIT FOUR"/* 07C4 */,/*1989*/"NKO DIGIT FIVE"/* 07C5 */, /*1990*/"NKO DIGIT SIX"/* 07C6 */,/*1991*/"NKO DIGIT SEVEN"/* 07C7 */,/*1992*/"NKO DIGIT EIGHT"/* 07C8 */, /*1993*/"NKO DIGIT NINE"/* 07C9 */,/*1994*/"NKO LETTER A"/* 07CA */,/*1995*/"NKO LETTER EE"/* 07CB */, /*1996*/"NKO LETTER I"/* 07CC */,/*1997*/"NKO LETTER E"/* 07CD */,/*1998*/"NKO LETTER U"/* 07CE */, /*1999*/"NKO LETTER OO"/* 07CF */,/*2000*/"NKO LETTER O"/* 07D0 */,/*2001*/"NKO LETTER DAGBASINNA"/* 07D1 */, /*2002*/"NKO LETTER N"/* 07D2 */,/*2003*/"NKO LETTER BA"/* 07D3 */,/*2004*/"NKO LETTER PA"/* 07D4 */, /*2005*/"NKO LETTER TA"/* 07D5 */,/*2006*/"NKO LETTER JA"/* 07D6 */,/*2007*/"NKO LETTER CHA"/* 07D7 */, /*2008*/"NKO LETTER DA"/* 07D8 */,/*2009*/"NKO LETTER RA"/* 07D9 */,/*2010*/"NKO LETTER RRA"/* 07DA */, /*2011*/"NKO LETTER SA"/* 07DB */,/*2012*/"NKO LETTER GBA"/* 07DC */,/*2013*/"NKO LETTER FA"/* 07DD */, /*2014*/"NKO LETTER KA"/* 07DE */,/*2015*/"NKO LETTER LA"/* 07DF */,/*2016*/"NKO LETTER NA WOLOSO"/* 07E0 */, /*2017*/"NKO LETTER MA"/* 07E1 */,/*2018*/"NKO LETTER NYA"/* 07E2 */,/*2019*/"NKO LETTER NA"/* 07E3 */, /*2020*/"NKO LETTER HA"/* 07E4 */,/*2021*/"NKO LETTER WA"/* 07E5 */,/*2022*/"NKO LETTER YA"/* 07E6 */, /*2023*/"NKO LETTER NYA WOLOSO"/* 07E7 */,/*2024*/"NKO LETTER JONA JA"/* 07E8 */,/*2025*/"NKO LETTER JONA CHA"/* 07E9 */, /*2026*/"NKO LETTER JONA RA"/* 07EA */,/*2027*/"NKO COMBINING SHORT HIGH TONE"/* 07EB */, /*2028*/"NKO COMBINING SHORT LOW TONE"/* 07EC */,/*2029*/"NKO COMBINING SHORT RISING TONE"/* 07ED */, /*2030*/"NKO COMBINING LONG DESCENDING TONE"/* 07EE */,/*2031*/"NKO COMBINING LONG HIGH TONE"/* 07EF */, /*2032*/"NKO COMBINING LONG LOW TONE"/* 07F0 */,/*2033*/"NKO COMBINING LONG RISING TONE"/* 07F1 */, /*2034*/"NKO COMBINING NASALIZATION MARK"/* 07F2 */,/*2035*/"NKO COMBINING DOUBLE DOT ABOVE"/* 07F3 */, /*2036*/"NKO HIGH TONE APOSTROPHE"/* 07F4 */,/*2037*/"NKO LOW TONE APOSTROPHE"/* 07F5 */, /*2038*/"NKO SYMBOL OO DENNEN"/* 07F6 */,/*2039*/"NKO SYMBOL GBAKURUNEN"/* 07F7 */,/*2040*/"NKO COMMA"/* 07F8 */, /*2041*/"NKO EXCLAMATION MARK"/* 07F9 */,/*2042*/"NKO LAJANYALAN"/* 07FA */,NULL,NULL,NULL,NULL,NULL, /*2048*/"SAMARITAN LETTER ALAF"/* 0800 */,/*2049*/"SAMARITAN LETTER BIT"/* 0801 */, /*2050*/"SAMARITAN LETTER GAMAN"/* 0802 */,/*2051*/"SAMARITAN LETTER DALAT"/* 0803 */, /*2052*/"SAMARITAN LETTER IY"/* 0804 */,/*2053*/"SAMARITAN LETTER BAA"/* 0805 */, /*2054*/"SAMARITAN LETTER ZEN"/* 0806 */,/*2055*/"SAMARITAN LETTER IT"/* 0807 */, /*2056*/"SAMARITAN LETTER TIT"/* 0808 */,/*2057*/"SAMARITAN LETTER YUT"/* 0809 */, /*2058*/"SAMARITAN LETTER KAAF"/* 080A */,/*2059*/"SAMARITAN LETTER LABAT"/* 080B */, /*2060*/"SAMARITAN LETTER MIM"/* 080C */,/*2061*/"SAMARITAN LETTER NUN"/* 080D */, /*2062*/"SAMARITAN LETTER SINGAAT"/* 080E */,/*2063*/"SAMARITAN LETTER IN"/* 080F */, /*2064*/"SAMARITAN LETTER FI"/* 0810 */,/*2065*/"SAMARITAN LETTER TSAADIY"/* 0811 */, /*2066*/"SAMARITAN LETTER QUF"/* 0812 */,/*2067*/"SAMARITAN LETTER RISH"/* 0813 */, /*2068*/"SAMARITAN LETTER SHAN"/* 0814 */,/*2069*/"SAMARITAN LETTER TAAF"/* 0815 */, /*2070*/"SAMARITAN MARK IN"/* 0816 */,/*2071*/"SAMARITAN MARK IN-ALAF"/* 0817 */, /*2072*/"SAMARITAN MARK OCCLUSION"/* 0818 */,/*2073*/"SAMARITAN MARK DAGESH"/* 0819 */, /*2074*/"SAMARITAN MODIFIER LETTER EPENTHETIC YUT"/* 081A */,/*2075*/"SAMARITAN MARK EPENTHETIC YUT"/* 081B */, /*2076*/"SAMARITAN VOWEL SIGN LONG E"/* 081C */,/*2077*/"SAMARITAN VOWEL SIGN E"/* 081D */, /*2078*/"SAMARITAN VOWEL SIGN OVERLONG AA"/* 081E */,/*2079*/"SAMARITAN VOWEL SIGN LONG AA"/* 081F */, /*2080*/"SAMARITAN VOWEL SIGN AA"/* 0820 */,/*2081*/"SAMARITAN VOWEL SIGN OVERLONG A"/* 0821 */, /*2082*/"SAMARITAN VOWEL SIGN LONG A"/* 0822 */,/*2083*/"SAMARITAN VOWEL SIGN A"/* 0823 */, /*2084*/"SAMARITAN MODIFIER LETTER SHORT A"/* 0824 */,/*2085*/"SAMARITAN VOWEL SIGN SHORT A"/* 0825 */, /*2086*/"SAMARITAN VOWEL SIGN LONG U"/* 0826 */,/*2087*/"SAMARITAN VOWEL SIGN U"/* 0827 */, /*2088*/"SAMARITAN MODIFIER LETTER I"/* 0828 */,/*2089*/"SAMARITAN VOWEL SIGN LONG I"/* 0829 */, /*2090*/"SAMARITAN VOWEL SIGN I"/* 082A */,/*2091*/"SAMARITAN VOWEL SIGN O"/* 082B */, /*2092*/"SAMARITAN VOWEL SIGN SUKUN"/* 082C */,/*2093*/"SAMARITAN MARK NEQUDAA"/* 082D */,NULL,NULL, /*2096*/"SAMARITAN PUNCTUATION NEQUDAA"/* 0830 */,/*2097*/"SAMARITAN PUNCTUATION AFSAAQ"/* 0831 */, /*2098*/"SAMARITAN PUNCTUATION ANGED"/* 0832 */,/*2099*/"SAMARITAN PUNCTUATION BAU"/* 0833 */, /*2100*/"SAMARITAN PUNCTUATION ATMAAU"/* 0834 */,/*2101*/"SAMARITAN PUNCTUATION SHIYYAALAA"/* 0835 */, /*2102*/"SAMARITAN ABBREVIATION MARK"/* 0836 */,/*2103*/"SAMARITAN PUNCTUATION MELODIC QITSA"/* 0837 */, /*2104*/"SAMARITAN PUNCTUATION ZIQAA"/* 0838 */,/*2105*/"SAMARITAN PUNCTUATION QITSA"/* 0839 */, /*2106*/"SAMARITAN PUNCTUATION ZAEF"/* 083A */,/*2107*/"SAMARITAN PUNCTUATION TURU"/* 083B */, /*2108*/"SAMARITAN PUNCTUATION ARKAANU"/* 083C */,/*2109*/"SAMARITAN PUNCTUATION SOF MASHFAAT"/* 083D */, /*2110*/"SAMARITAN PUNCTUATION ANNAAU"/* 083E */,NULL,/*2112*/"MANDAIC LETTER HALQA"/* 0840 */, /*2113*/"MANDAIC LETTER AB"/* 0841 */,/*2114*/"MANDAIC LETTER AG"/* 0842 */,/*2115*/"MANDAIC LETTER AD"/* 0843 */, /*2116*/"MANDAIC LETTER AH"/* 0844 */,/*2117*/"MANDAIC LETTER USHENNA"/* 0845 */,/*2118*/"MANDAIC LETTER AZ"/* 0846 */, /*2119*/"MANDAIC LETTER IT"/* 0847 */,/*2120*/"MANDAIC LETTER ATT"/* 0848 */,/*2121*/"MANDAIC LETTER AKSA"/* 0849 */, /*2122*/"MANDAIC LETTER AK"/* 084A */,/*2123*/"MANDAIC LETTER AL"/* 084B */,/*2124*/"MANDAIC LETTER AM"/* 084C */, /*2125*/"MANDAIC LETTER AN"/* 084D */,/*2126*/"MANDAIC LETTER AS"/* 084E */,/*2127*/"MANDAIC LETTER IN"/* 084F */, /*2128*/"MANDAIC LETTER AP"/* 0850 */,/*2129*/"MANDAIC LETTER ASZ"/* 0851 */,/*2130*/"MANDAIC LETTER AQ"/* 0852 */, /*2131*/"MANDAIC LETTER AR"/* 0853 */,/*2132*/"MANDAIC LETTER ASH"/* 0854 */,/*2133*/"MANDAIC LETTER AT"/* 0855 */, /*2134*/"MANDAIC LETTER DUSHENNA"/* 0856 */,/*2135*/"MANDAIC LETTER KAD"/* 0857 */, /*2136*/"MANDAIC LETTER AIN"/* 0858 */,/*2137*/"MANDAIC AFFRICATION MARK"/* 0859 */, /*2138*/"MANDAIC VOCALIZATION MARK"/* 085A */,/*2139*/"MANDAIC GEMINATION MARK"/* 085B */,NULL,NULL, /*2142*/"MANDAIC PUNCTUATION"/* 085E */,NULL,/*2144*/"SYRIAC LETTER MALAYALAM NGA"/* 0860 */, /*2145*/"SYRIAC LETTER MALAYALAM JA"/* 0861 */,/*2146*/"SYRIAC LETTER MALAYALAM NYA"/* 0862 */, /*2147*/"SYRIAC LETTER MALAYALAM TTA"/* 0863 */,/*2148*/"SYRIAC LETTER MALAYALAM NNA"/* 0864 */, /*2149*/"SYRIAC LETTER MALAYALAM NNNA"/* 0865 */,/*2150*/"SYRIAC LETTER MALAYALAM BHA"/* 0866 */, /*2151*/"SYRIAC LETTER MALAYALAM RA"/* 0867 */,/*2152*/"SYRIAC LETTER MALAYALAM LLA"/* 0868 */, /*2153*/"SYRIAC LETTER MALAYALAM LLLA"/* 0869 */,/*2154*/"SYRIAC LETTER MALAYALAM SSA"/* 086A */,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,/*2208*/"ARABIC LETTER BEH WITH SMALL V BELOW"/* 08A0 */,/*2209*/"ARABIC LETTER BEH WITH HAMZA ABOVE"/* 08A1 */, /*2210*/"ARABIC LETTER JEEM WITH TWO DOTS ABOVE"/* 08A2 */,/*2211*/"ARABIC LETTER TAH WITH TWO DOTS ABOVE"/* 08A3 */, /*2212*/"ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE"/* 08A4 */, /*2213*/"ARABIC LETTER QAF WITH DOT BELOW"/* 08A5 */,/*2214*/"ARABIC LETTER LAM WITH DOUBLE BAR"/* 08A6 */, /*2215*/"ARABIC LETTER MEEM WITH THREE DOTS ABOVE"/* 08A7 */, /*2216*/"ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE"/* 08A8 */, /*2217*/"ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE"/* 08A9 */,/*2218*/"ARABIC LETTER REH WITH LOOP"/* 08AA */, /*2219*/"ARABIC LETTER WAW WITH DOT WITHIN"/* 08AB */,/*2220*/"ARABIC LETTER ROHINGYA YEH"/* 08AC */, /*2221*/"ARABIC LETTER LOW ALEF"/* 08AD */,/*2222*/"ARABIC LETTER DAL WITH THREE DOTS BELOW"/* 08AE */, /*2223*/"ARABIC LETTER SAD WITH THREE DOTS BELOW"/* 08AF */,/*2224*/"ARABIC LETTER GAF WITH INVERTED STROKE"/* 08B0 */, /*2225*/"ARABIC LETTER STRAIGHT WAW"/* 08B1 */,/*2226*/"ARABIC LETTER ZAIN WITH INVERTED V ABOVE"/* 08B2 */, /*2227*/"ARABIC LETTER AIN WITH THREE DOTS BELOW"/* 08B3 */,/*2228*/"ARABIC LETTER KAF WITH DOT BELOW"/* 08B4 */,NULL, /*2230*/"ARABIC LETTER BEH WITH SMALL MEEM ABOVE"/* 08B6 */,/*2231*/"ARABIC LETTER PEH WITH SMALL MEEM ABOVE"/* 08B7 */, /*2232*/"ARABIC LETTER TEH WITH SMALL TEH ABOVE"/* 08B8 */,/*2233*/"ARABIC LETTER REH WITH SMALL NOON ABOVE"/* 08B9 */, /*2234*/"ARABIC LETTER YEH WITH TWO DOTS BELOW AND SMALL NOON ABOVE"/* 08BA */, /*2235*/"ARABIC LETTER AFRICAN FEH"/* 08BB */,/*2236*/"ARABIC LETTER AFRICAN QAF"/* 08BC */, /*2237*/"ARABIC LETTER AFRICAN NOON"/* 08BD */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*2260*/"ARABIC SMALL HIGH WORD AR-RUB"/* 08D4 */, /*2261*/"ARABIC SMALL HIGH SAD"/* 08D5 */,/*2262*/"ARABIC SMALL HIGH AIN"/* 08D6 */, /*2263*/"ARABIC SMALL HIGH QAF"/* 08D7 */,/*2264*/"ARABIC SMALL HIGH NOON WITH KASRA"/* 08D8 */, /*2265*/"ARABIC SMALL LOW NOON WITH KASRA"/* 08D9 */,/*2266*/"ARABIC SMALL HIGH WORD ATH-THALATHA"/* 08DA */, /*2267*/"ARABIC SMALL HIGH WORD AS-SAJDA"/* 08DB */,/*2268*/"ARABIC SMALL HIGH WORD AN-NISF"/* 08DC */, /*2269*/"ARABIC SMALL HIGH WORD SAKTA"/* 08DD */,/*2270*/"ARABIC SMALL HIGH WORD QIF"/* 08DE */, /*2271*/"ARABIC SMALL HIGH WORD WAQFA"/* 08DF */,/*2272*/"ARABIC SMALL HIGH FOOTNOTE MARKER"/* 08E0 */, /*2273*/"ARABIC SMALL HIGH SIGN SAFHA"/* 08E1 */,/*2274*/"ARABIC DISPUTED END OF AYAH"/* 08E2 */, /*2275*/"ARABIC TURNED DAMMA BELOW"/* 08E3 */,/*2276*/"ARABIC CURLY FATHA"/* 08E4 */, /*2277*/"ARABIC CURLY DAMMA"/* 08E5 */,/*2278*/"ARABIC CURLY KASRA"/* 08E6 */,/*2279*/"ARABIC CURLY FATHATAN"/* 08E7 */, /*2280*/"ARABIC CURLY DAMMATAN"/* 08E8 */,/*2281*/"ARABIC CURLY KASRATAN"/* 08E9 */, /*2282*/"ARABIC TONE ONE DOT ABOVE"/* 08EA */,/*2283*/"ARABIC TONE TWO DOTS ABOVE"/* 08EB */, /*2284*/"ARABIC TONE LOOP ABOVE"/* 08EC */,/*2285*/"ARABIC TONE ONE DOT BELOW"/* 08ED */, /*2286*/"ARABIC TONE TWO DOTS BELOW"/* 08EE */,/*2287*/"ARABIC TONE LOOP BELOW"/* 08EF */, /*2288*/"ARABIC OPEN FATHATAN"/* 08F0 */,/*2289*/"ARABIC OPEN DAMMATAN"/* 08F1 */, /*2290*/"ARABIC OPEN KASRATAN"/* 08F2 */,/*2291*/"ARABIC SMALL HIGH WAW"/* 08F3 */, /*2292*/"ARABIC FATHA WITH RING"/* 08F4 */,/*2293*/"ARABIC FATHA WITH DOT ABOVE"/* 08F5 */, /*2294*/"ARABIC KASRA WITH DOT BELOW"/* 08F6 */,/*2295*/"ARABIC LEFT ARROWHEAD ABOVE"/* 08F7 */, /*2296*/"ARABIC RIGHT ARROWHEAD ABOVE"/* 08F8 */,/*2297*/"ARABIC LEFT ARROWHEAD BELOW"/* 08F9 */, /*2298*/"ARABIC RIGHT ARROWHEAD BELOW"/* 08FA */,/*2299*/"ARABIC DOUBLE RIGHT ARROWHEAD ABOVE"/* 08FB */, /*2300*/"ARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOT"/* 08FC */, /*2301*/"ARABIC RIGHT ARROWHEAD ABOVE WITH DOT"/* 08FD */,/*2302*/"ARABIC DAMMA WITH DOT"/* 08FE */, /*2303*/"ARABIC MARK SIDEWAYS NOON GHUNNA"/* 08FF */,/*2304*/"DEVANAGARI SIGN INVERTED CANDRABINDU"/* 0900 */, /*2305*/"DEVANAGARI SIGN CANDRABINDU"/* 0901 */,/*2306*/"DEVANAGARI SIGN ANUSVARA"/* 0902 */, /*2307*/"DEVANAGARI SIGN VISARGA"/* 0903 */,/*2308*/"DEVANAGARI LETTER SHORT A"/* 0904 */, /*2309*/"DEVANAGARI LETTER A"/* 0905 */,/*2310*/"DEVANAGARI LETTER AA"/* 0906 */,/*2311*/"DEVANAGARI LETTER I"/* 0907 */, /*2312*/"DEVANAGARI LETTER II"/* 0908 */,/*2313*/"DEVANAGARI LETTER U"/* 0909 */, /*2314*/"DEVANAGARI LETTER UU"/* 090A */,/*2315*/"DEVANAGARI LETTER VOCALIC R"/* 090B */, /*2316*/"DEVANAGARI LETTER VOCALIC L"/* 090C */,/*2317*/"DEVANAGARI LETTER CANDRA E"/* 090D */, /*2318*/"DEVANAGARI LETTER SHORT E"/* 090E */,/*2319*/"DEVANAGARI LETTER E"/* 090F */, /*2320*/"DEVANAGARI LETTER AI"/* 0910 */,/*2321*/"DEVANAGARI LETTER CANDRA O"/* 0911 */, /*2322*/"DEVANAGARI LETTER SHORT O"/* 0912 */,/*2323*/"DEVANAGARI LETTER O"/* 0913 */, /*2324*/"DEVANAGARI LETTER AU"/* 0914 */,/*2325*/"DEVANAGARI LETTER KA"/* 0915 */, /*2326*/"DEVANAGARI LETTER KHA"/* 0916 */,/*2327*/"DEVANAGARI LETTER GA"/* 0917 */, /*2328*/"DEVANAGARI LETTER GHA"/* 0918 */,/*2329*/"DEVANAGARI LETTER NGA"/* 0919 */, /*2330*/"DEVANAGARI LETTER CA"/* 091A */,/*2331*/"DEVANAGARI LETTER CHA"/* 091B */, /*2332*/"DEVANAGARI LETTER JA"/* 091C */,/*2333*/"DEVANAGARI LETTER JHA"/* 091D */, /*2334*/"DEVANAGARI LETTER NYA"/* 091E */,/*2335*/"DEVANAGARI LETTER TTA"/* 091F */, /*2336*/"DEVANAGARI LETTER TTHA"/* 0920 */,/*2337*/"DEVANAGARI LETTER DDA"/* 0921 */, /*2338*/"DEVANAGARI LETTER DDHA"/* 0922 */,/*2339*/"DEVANAGARI LETTER NNA"/* 0923 */, /*2340*/"DEVANAGARI LETTER TA"/* 0924 */,/*2341*/"DEVANAGARI LETTER THA"/* 0925 */, /*2342*/"DEVANAGARI LETTER DA"/* 0926 */,/*2343*/"DEVANAGARI LETTER DHA"/* 0927 */, /*2344*/"DEVANAGARI LETTER NA"/* 0928 */,/*2345*/"DEVANAGARI LETTER NNNA"/* 0929 */, /*2346*/"DEVANAGARI LETTER PA"/* 092A */,/*2347*/"DEVANAGARI LETTER PHA"/* 092B */, /*2348*/"DEVANAGARI LETTER BA"/* 092C */,/*2349*/"DEVANAGARI LETTER BHA"/* 092D */, /*2350*/"DEVANAGARI LETTER MA"/* 092E */,/*2351*/"DEVANAGARI LETTER YA"/* 092F */, /*2352*/"DEVANAGARI LETTER RA"/* 0930 */,/*2353*/"DEVANAGARI LETTER RRA"/* 0931 */, /*2354*/"DEVANAGARI LETTER LA"/* 0932 */,/*2355*/"DEVANAGARI LETTER LLA"/* 0933 */, /*2356*/"DEVANAGARI LETTER LLLA"/* 0934 */,/*2357*/"DEVANAGARI LETTER VA"/* 0935 */, /*2358*/"DEVANAGARI LETTER SHA"/* 0936 */,/*2359*/"DEVANAGARI LETTER SSA"/* 0937 */, /*2360*/"DEVANAGARI LETTER SA"/* 0938 */,/*2361*/"DEVANAGARI LETTER HA"/* 0939 */, /*2362*/"DEVANAGARI VOWEL SIGN OE"/* 093A */,/*2363*/"DEVANAGARI VOWEL SIGN OOE"/* 093B */, /*2364*/"DEVANAGARI SIGN NUKTA"/* 093C */,/*2365*/"DEVANAGARI SIGN AVAGRAHA"/* 093D */, /*2366*/"DEVANAGARI VOWEL SIGN AA"/* 093E */,/*2367*/"DEVANAGARI VOWEL SIGN I"/* 093F */, /*2368*/"DEVANAGARI VOWEL SIGN II"/* 0940 */,/*2369*/"DEVANAGARI VOWEL SIGN U"/* 0941 */, /*2370*/"DEVANAGARI VOWEL SIGN UU"/* 0942 */,/*2371*/"DEVANAGARI VOWEL SIGN VOCALIC R"/* 0943 */, /*2372*/"DEVANAGARI VOWEL SIGN VOCALIC RR"/* 0944 */,/*2373*/"DEVANAGARI VOWEL SIGN CANDRA E"/* 0945 */, /*2374*/"DEVANAGARI VOWEL SIGN SHORT E"/* 0946 */,/*2375*/"DEVANAGARI VOWEL SIGN E"/* 0947 */, /*2376*/"DEVANAGARI VOWEL SIGN AI"/* 0948 */,/*2377*/"DEVANAGARI VOWEL SIGN CANDRA O"/* 0949 */, /*2378*/"DEVANAGARI VOWEL SIGN SHORT O"/* 094A */,/*2379*/"DEVANAGARI VOWEL SIGN O"/* 094B */, /*2380*/"DEVANAGARI VOWEL SIGN AU"/* 094C */,/*2381*/"DEVANAGARI SIGN VIRAMA"/* 094D */, /*2382*/"DEVANAGARI VOWEL SIGN PRISHTHAMATRA E"/* 094E */,/*2383*/"DEVANAGARI VOWEL SIGN AW"/* 094F */, /*2384*/"DEVANAGARI OM"/* 0950 */,/*2385*/"DEVANAGARI STRESS SIGN UDATTA"/* 0951 */, /*2386*/"DEVANAGARI STRESS SIGN ANUDATTA"/* 0952 */,/*2387*/"DEVANAGARI GRAVE ACCENT"/* 0953 */, /*2388*/"DEVANAGARI ACUTE ACCENT"/* 0954 */,/*2389*/"DEVANAGARI VOWEL SIGN CANDRA LONG E"/* 0955 */, /*2390*/"DEVANAGARI VOWEL SIGN UE"/* 0956 */,/*2391*/"DEVANAGARI VOWEL SIGN UUE"/* 0957 */, /*2392*/"DEVANAGARI LETTER QA"/* 0958 */,/*2393*/"DEVANAGARI LETTER KHHA"/* 0959 */, /*2394*/"DEVANAGARI LETTER GHHA"/* 095A */,/*2395*/"DEVANAGARI LETTER ZA"/* 095B */, /*2396*/"DEVANAGARI LETTER DDDHA"/* 095C */,/*2397*/"DEVANAGARI LETTER RHA"/* 095D */, /*2398*/"DEVANAGARI LETTER FA"/* 095E */,/*2399*/"DEVANAGARI LETTER YYA"/* 095F */, /*2400*/"DEVANAGARI LETTER VOCALIC RR"/* 0960 */,/*2401*/"DEVANAGARI LETTER VOCALIC LL"/* 0961 */, /*2402*/"DEVANAGARI VOWEL SIGN VOCALIC L"/* 0962 */,/*2403*/"DEVANAGARI VOWEL SIGN VOCALIC LL"/* 0963 */, /*2404*/"DEVANAGARI DANDA"/* 0964 */,/*2405*/"DEVANAGARI DOUBLE DANDA"/* 0965 */, /*2406*/"DEVANAGARI DIGIT ZERO"/* 0966 */,/*2407*/"DEVANAGARI DIGIT ONE"/* 0967 */, /*2408*/"DEVANAGARI DIGIT TWO"/* 0968 */,/*2409*/"DEVANAGARI DIGIT THREE"/* 0969 */, /*2410*/"DEVANAGARI DIGIT FOUR"/* 096A */,/*2411*/"DEVANAGARI DIGIT FIVE"/* 096B */, /*2412*/"DEVANAGARI DIGIT SIX"/* 096C */,/*2413*/"DEVANAGARI DIGIT SEVEN"/* 096D */, /*2414*/"DEVANAGARI DIGIT EIGHT"/* 096E */,/*2415*/"DEVANAGARI DIGIT NINE"/* 096F */, /*2416*/"DEVANAGARI ABBREVIATION SIGN"/* 0970 */,/*2417*/"DEVANAGARI SIGN HIGH SPACING DOT"/* 0971 */, /*2418*/"DEVANAGARI LETTER CANDRA A"/* 0972 */,/*2419*/"DEVANAGARI LETTER OE"/* 0973 */, /*2420*/"DEVANAGARI LETTER OOE"/* 0974 */,/*2421*/"DEVANAGARI LETTER AW"/* 0975 */, /*2422*/"DEVANAGARI LETTER UE"/* 0976 */,/*2423*/"DEVANAGARI LETTER UUE"/* 0977 */, /*2424*/"DEVANAGARI LETTER MARWARI DDA"/* 0978 */,/*2425*/"DEVANAGARI LETTER ZHA"/* 0979 */, /*2426*/"DEVANAGARI LETTER HEAVY YA"/* 097A */,/*2427*/"DEVANAGARI LETTER GGA"/* 097B */, /*2428*/"DEVANAGARI LETTER JJA"/* 097C */,/*2429*/"DEVANAGARI LETTER GLOTTAL STOP"/* 097D */, /*2430*/"DEVANAGARI LETTER DDDA"/* 097E */,/*2431*/"DEVANAGARI LETTER BBA"/* 097F */,/*2432*/"BENGALI ANJI"/* 0980 */, /*2433*/"BENGALI SIGN CANDRABINDU"/* 0981 */,/*2434*/"BENGALI SIGN ANUSVARA"/* 0982 */, /*2435*/"BENGALI SIGN VISARGA"/* 0983 */,NULL,/*2437*/"BENGALI LETTER A"/* 0985 */,/*2438*/"BENGALI LETTER AA"/* 0986 */, /*2439*/"BENGALI LETTER I"/* 0987 */,/*2440*/"BENGALI LETTER II"/* 0988 */,/*2441*/"BENGALI LETTER U"/* 0989 */, /*2442*/"BENGALI LETTER UU"/* 098A */,/*2443*/"BENGALI LETTER VOCALIC R"/* 098B */, /*2444*/"BENGALI LETTER VOCALIC L"/* 098C */,NULL,NULL,/*2447*/"BENGALI LETTER E"/* 098F */, /*2448*/"BENGALI LETTER AI"/* 0990 */,NULL,NULL,/*2451*/"BENGALI LETTER O"/* 0993 */, /*2452*/"BENGALI LETTER AU"/* 0994 */,/*2453*/"BENGALI LETTER KA"/* 0995 */,/*2454*/"BENGALI LETTER KHA"/* 0996 */, /*2455*/"BENGALI LETTER GA"/* 0997 */,/*2456*/"BENGALI LETTER GHA"/* 0998 */,/*2457*/"BENGALI LETTER NGA"/* 0999 */, /*2458*/"BENGALI LETTER CA"/* 099A */,/*2459*/"BENGALI LETTER CHA"/* 099B */,/*2460*/"BENGALI LETTER JA"/* 099C */, /*2461*/"BENGALI LETTER JHA"/* 099D */,/*2462*/"BENGALI LETTER NYA"/* 099E */,/*2463*/"BENGALI LETTER TTA"/* 099F */, /*2464*/"BENGALI LETTER TTHA"/* 09A0 */,/*2465*/"BENGALI LETTER DDA"/* 09A1 */,/*2466*/"BENGALI LETTER DDHA"/* 09A2 */, /*2467*/"BENGALI LETTER NNA"/* 09A3 */,/*2468*/"BENGALI LETTER TA"/* 09A4 */,/*2469*/"BENGALI LETTER THA"/* 09A5 */, /*2470*/"BENGALI LETTER DA"/* 09A6 */,/*2471*/"BENGALI LETTER DHA"/* 09A7 */,/*2472*/"BENGALI LETTER NA"/* 09A8 */,NULL, /*2474*/"BENGALI LETTER PA"/* 09AA */,/*2475*/"BENGALI LETTER PHA"/* 09AB */,/*2476*/"BENGALI LETTER BA"/* 09AC */, /*2477*/"BENGALI LETTER BHA"/* 09AD */,/*2478*/"BENGALI LETTER MA"/* 09AE */,/*2479*/"BENGALI LETTER YA"/* 09AF */, /*2480*/"BENGALI LETTER RA"/* 09B0 */,NULL,/*2482*/"BENGALI LETTER LA"/* 09B2 */,NULL,NULL,NULL, /*2486*/"BENGALI LETTER SHA"/* 09B6 */,/*2487*/"BENGALI LETTER SSA"/* 09B7 */,/*2488*/"BENGALI LETTER SA"/* 09B8 */, /*2489*/"BENGALI LETTER HA"/* 09B9 */,NULL,NULL,/*2492*/"BENGALI SIGN NUKTA"/* 09BC */, /*2493*/"BENGALI SIGN AVAGRAHA"/* 09BD */,/*2494*/"BENGALI VOWEL SIGN AA"/* 09BE */, /*2495*/"BENGALI VOWEL SIGN I"/* 09BF */,/*2496*/"BENGALI VOWEL SIGN II"/* 09C0 */, /*2497*/"BENGALI VOWEL SIGN U"/* 09C1 */,/*2498*/"BENGALI VOWEL SIGN UU"/* 09C2 */, /*2499*/"BENGALI VOWEL SIGN VOCALIC R"/* 09C3 */,/*2500*/"BENGALI VOWEL SIGN VOCALIC RR"/* 09C4 */,NULL,NULL, /*2503*/"BENGALI VOWEL SIGN E"/* 09C7 */,/*2504*/"BENGALI VOWEL SIGN AI"/* 09C8 */,NULL,NULL, /*2507*/"BENGALI VOWEL SIGN O"/* 09CB */,/*2508*/"BENGALI VOWEL SIGN AU"/* 09CC */, /*2509*/"BENGALI SIGN VIRAMA"/* 09CD */,/*2510*/"BENGALI LETTER KHANDA TA"/* 09CE */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,/*2519*/"BENGALI AU LENGTH MARK"/* 09D7 */,NULL,NULL,NULL,NULL,/*2524*/"BENGALI LETTER RRA"/* 09DC */, /*2525*/"BENGALI LETTER RHA"/* 09DD */,NULL,/*2527*/"BENGALI LETTER YYA"/* 09DF */, /*2528*/"BENGALI LETTER VOCALIC RR"/* 09E0 */,/*2529*/"BENGALI LETTER VOCALIC LL"/* 09E1 */, /*2530*/"BENGALI VOWEL SIGN VOCALIC L"/* 09E2 */,/*2531*/"BENGALI VOWEL SIGN VOCALIC LL"/* 09E3 */,NULL,NULL, /*2534*/"BENGALI DIGIT ZERO"/* 09E6 */,/*2535*/"BENGALI DIGIT ONE"/* 09E7 */,/*2536*/"BENGALI DIGIT TWO"/* 09E8 */, /*2537*/"BENGALI DIGIT THREE"/* 09E9 */,/*2538*/"BENGALI DIGIT FOUR"/* 09EA */,/*2539*/"BENGALI DIGIT FIVE"/* 09EB */, /*2540*/"BENGALI DIGIT SIX"/* 09EC */,/*2541*/"BENGALI DIGIT SEVEN"/* 09ED */,/*2542*/"BENGALI DIGIT EIGHT"/* 09EE */, /*2543*/"BENGALI DIGIT NINE"/* 09EF */,/*2544*/"BENGALI LETTER RA WITH MIDDLE DIAGONAL"/* 09F0 */, /*2545*/"BENGALI LETTER RA WITH LOWER DIAGONAL"/* 09F1 */,/*2546*/"BENGALI RUPEE MARK"/* 09F2 */, /*2547*/"BENGALI RUPEE SIGN"/* 09F3 */,/*2548*/"BENGALI CURRENCY NUMERATOR ONE"/* 09F4 */, /*2549*/"BENGALI CURRENCY NUMERATOR TWO"/* 09F5 */,/*2550*/"BENGALI CURRENCY NUMERATOR THREE"/* 09F6 */, /*2551*/"BENGALI CURRENCY NUMERATOR FOUR"/* 09F7 */, /*2552*/"BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR"/* 09F8 */, /*2553*/"BENGALI CURRENCY DENOMINATOR SIXTEEN"/* 09F9 */,/*2554*/"BENGALI ISSHAR"/* 09FA */, /*2555*/"BENGALI GANDA MARK"/* 09FB */,/*2556*/"BENGALI LETTER VEDIC ANUSVARA"/* 09FC */, /*2557*/"BENGALI ABBREVIATION SIGN"/* 09FD */,NULL,NULL,NULL,/*2561*/"GURMUKHI SIGN ADAK BINDI"/* 0A01 */, /*2562*/"GURMUKHI SIGN BINDI"/* 0A02 */,/*2563*/"GURMUKHI SIGN VISARGA"/* 0A03 */,NULL, /*2565*/"GURMUKHI LETTER A"/* 0A05 */,/*2566*/"GURMUKHI LETTER AA"/* 0A06 */,/*2567*/"GURMUKHI LETTER I"/* 0A07 */, /*2568*/"GURMUKHI LETTER II"/* 0A08 */,/*2569*/"GURMUKHI LETTER U"/* 0A09 */,/*2570*/"GURMUKHI LETTER UU"/* 0A0A */,NULL, NULL,NULL,NULL,/*2575*/"GURMUKHI LETTER EE"/* 0A0F */,/*2576*/"GURMUKHI LETTER AI"/* 0A10 */,NULL,NULL, /*2579*/"GURMUKHI LETTER OO"/* 0A13 */,/*2580*/"GURMUKHI LETTER AU"/* 0A14 */,/*2581*/"GURMUKHI LETTER KA"/* 0A15 */, /*2582*/"GURMUKHI LETTER KHA"/* 0A16 */,/*2583*/"GURMUKHI LETTER GA"/* 0A17 */,/*2584*/"GURMUKHI LETTER GHA"/* 0A18 */, /*2585*/"GURMUKHI LETTER NGA"/* 0A19 */,/*2586*/"GURMUKHI LETTER CA"/* 0A1A */,/*2587*/"GURMUKHI LETTER CHA"/* 0A1B */, /*2588*/"GURMUKHI LETTER JA"/* 0A1C */,/*2589*/"GURMUKHI LETTER JHA"/* 0A1D */,/*2590*/"GURMUKHI LETTER NYA"/* 0A1E */, /*2591*/"GURMUKHI LETTER TTA"/* 0A1F */,/*2592*/"GURMUKHI LETTER TTHA"/* 0A20 */,/*2593*/"GURMUKHI LETTER DDA"/* 0A21 */, /*2594*/"GURMUKHI LETTER DDHA"/* 0A22 */,/*2595*/"GURMUKHI LETTER NNA"/* 0A23 */,/*2596*/"GURMUKHI LETTER TA"/* 0A24 */, /*2597*/"GURMUKHI LETTER THA"/* 0A25 */,/*2598*/"GURMUKHI LETTER DA"/* 0A26 */,/*2599*/"GURMUKHI LETTER DHA"/* 0A27 */, /*2600*/"GURMUKHI LETTER NA"/* 0A28 */,NULL,/*2602*/"GURMUKHI LETTER PA"/* 0A2A */, /*2603*/"GURMUKHI LETTER PHA"/* 0A2B */,/*2604*/"GURMUKHI LETTER BA"/* 0A2C */,/*2605*/"GURMUKHI LETTER BHA"/* 0A2D */, /*2606*/"GURMUKHI LETTER MA"/* 0A2E */,/*2607*/"GURMUKHI LETTER YA"/* 0A2F */,/*2608*/"GURMUKHI LETTER RA"/* 0A30 */, NULL,/*2610*/"GURMUKHI LETTER LA"/* 0A32 */,/*2611*/"GURMUKHI LETTER LLA"/* 0A33 */,NULL, /*2613*/"GURMUKHI LETTER VA"/* 0A35 */,/*2614*/"GURMUKHI LETTER SHA"/* 0A36 */,NULL, /*2616*/"GURMUKHI LETTER SA"/* 0A38 */,/*2617*/"GURMUKHI LETTER HA"/* 0A39 */,NULL,NULL, /*2620*/"GURMUKHI SIGN NUKTA"/* 0A3C */,NULL,/*2622*/"GURMUKHI VOWEL SIGN AA"/* 0A3E */, /*2623*/"GURMUKHI VOWEL SIGN I"/* 0A3F */,/*2624*/"GURMUKHI VOWEL SIGN II"/* 0A40 */, /*2625*/"GURMUKHI VOWEL SIGN U"/* 0A41 */,/*2626*/"GURMUKHI VOWEL SIGN UU"/* 0A42 */,NULL,NULL,NULL,NULL, /*2631*/"GURMUKHI VOWEL SIGN EE"/* 0A47 */,/*2632*/"GURMUKHI VOWEL SIGN AI"/* 0A48 */,NULL,NULL, /*2635*/"GURMUKHI VOWEL SIGN OO"/* 0A4B */,/*2636*/"GURMUKHI VOWEL SIGN AU"/* 0A4C */, /*2637*/"GURMUKHI SIGN VIRAMA"/* 0A4D */,NULL,NULL,NULL,/*2641*/"GURMUKHI SIGN UDAAT"/* 0A51 */,NULL,NULL,NULL,NULL,NULL, NULL,NULL,/*2649*/"GURMUKHI LETTER KHHA"/* 0A59 */,/*2650*/"GURMUKHI LETTER GHHA"/* 0A5A */, /*2651*/"GURMUKHI LETTER ZA"/* 0A5B */,/*2652*/"GURMUKHI LETTER RRA"/* 0A5C */,NULL, /*2654*/"GURMUKHI LETTER FA"/* 0A5E */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*2662*/"GURMUKHI DIGIT ZERO"/* 0A66 */, /*2663*/"GURMUKHI DIGIT ONE"/* 0A67 */,/*2664*/"GURMUKHI DIGIT TWO"/* 0A68 */,/*2665*/"GURMUKHI DIGIT THREE"/* 0A69 */, /*2666*/"GURMUKHI DIGIT FOUR"/* 0A6A */,/*2667*/"GURMUKHI DIGIT FIVE"/* 0A6B */,/*2668*/"GURMUKHI DIGIT SIX"/* 0A6C */, /*2669*/"GURMUKHI DIGIT SEVEN"/* 0A6D */,/*2670*/"GURMUKHI DIGIT EIGHT"/* 0A6E */, /*2671*/"GURMUKHI DIGIT NINE"/* 0A6F */,/*2672*/"GURMUKHI TIPPI"/* 0A70 */,/*2673*/"GURMUKHI ADDAK"/* 0A71 */, /*2674*/"GURMUKHI IRI"/* 0A72 */,/*2675*/"GURMUKHI URA"/* 0A73 */,/*2676*/"GURMUKHI EK ONKAR"/* 0A74 */, /*2677*/"GURMUKHI SIGN YAKASH"/* 0A75 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*2689*/"GUJARATI SIGN CANDRABINDU"/* 0A81 */,/*2690*/"GUJARATI SIGN ANUSVARA"/* 0A82 */, /*2691*/"GUJARATI SIGN VISARGA"/* 0A83 */,NULL,/*2693*/"GUJARATI LETTER A"/* 0A85 */, /*2694*/"GUJARATI LETTER AA"/* 0A86 */,/*2695*/"GUJARATI LETTER I"/* 0A87 */,/*2696*/"GUJARATI LETTER II"/* 0A88 */, /*2697*/"GUJARATI LETTER U"/* 0A89 */,/*2698*/"GUJARATI LETTER UU"/* 0A8A */, /*2699*/"GUJARATI LETTER VOCALIC R"/* 0A8B */,/*2700*/"GUJARATI LETTER VOCALIC L"/* 0A8C */, /*2701*/"GUJARATI VOWEL CANDRA E"/* 0A8D */,NULL,/*2703*/"GUJARATI LETTER E"/* 0A8F */, /*2704*/"GUJARATI LETTER AI"/* 0A90 */,/*2705*/"GUJARATI VOWEL CANDRA O"/* 0A91 */,NULL, /*2707*/"GUJARATI LETTER O"/* 0A93 */,/*2708*/"GUJARATI LETTER AU"/* 0A94 */,/*2709*/"GUJARATI LETTER KA"/* 0A95 */, /*2710*/"GUJARATI LETTER KHA"/* 0A96 */,/*2711*/"GUJARATI LETTER GA"/* 0A97 */,/*2712*/"GUJARATI LETTER GHA"/* 0A98 */, /*2713*/"GUJARATI LETTER NGA"/* 0A99 */,/*2714*/"GUJARATI LETTER CA"/* 0A9A */,/*2715*/"GUJARATI LETTER CHA"/* 0A9B */, /*2716*/"GUJARATI LETTER JA"/* 0A9C */,/*2717*/"GUJARATI LETTER JHA"/* 0A9D */,/*2718*/"GUJARATI LETTER NYA"/* 0A9E */, /*2719*/"GUJARATI LETTER TTA"/* 0A9F */,/*2720*/"GUJARATI LETTER TTHA"/* 0AA0 */,/*2721*/"GUJARATI LETTER DDA"/* 0AA1 */, /*2722*/"GUJARATI LETTER DDHA"/* 0AA2 */,/*2723*/"GUJARATI LETTER NNA"/* 0AA3 */,/*2724*/"GUJARATI LETTER TA"/* 0AA4 */, /*2725*/"GUJARATI LETTER THA"/* 0AA5 */,/*2726*/"GUJARATI LETTER DA"/* 0AA6 */,/*2727*/"GUJARATI LETTER DHA"/* 0AA7 */, /*2728*/"GUJARATI LETTER NA"/* 0AA8 */,NULL,/*2730*/"GUJARATI LETTER PA"/* 0AAA */, /*2731*/"GUJARATI LETTER PHA"/* 0AAB */,/*2732*/"GUJARATI LETTER BA"/* 0AAC */,/*2733*/"GUJARATI LETTER BHA"/* 0AAD */, /*2734*/"GUJARATI LETTER MA"/* 0AAE */,/*2735*/"GUJARATI LETTER YA"/* 0AAF */,/*2736*/"GUJARATI LETTER RA"/* 0AB0 */, NULL,/*2738*/"GUJARATI LETTER LA"/* 0AB2 */,/*2739*/"GUJARATI LETTER LLA"/* 0AB3 */,NULL, /*2741*/"GUJARATI LETTER VA"/* 0AB5 */,/*2742*/"GUJARATI LETTER SHA"/* 0AB6 */,/*2743*/"GUJARATI LETTER SSA"/* 0AB7 */, /*2744*/"GUJARATI LETTER SA"/* 0AB8 */,/*2745*/"GUJARATI LETTER HA"/* 0AB9 */,NULL,NULL, /*2748*/"GUJARATI SIGN NUKTA"/* 0ABC */,/*2749*/"GUJARATI SIGN AVAGRAHA"/* 0ABD */, /*2750*/"GUJARATI VOWEL SIGN AA"/* 0ABE */,/*2751*/"GUJARATI VOWEL SIGN I"/* 0ABF */, /*2752*/"GUJARATI VOWEL SIGN II"/* 0AC0 */,/*2753*/"GUJARATI VOWEL SIGN U"/* 0AC1 */, /*2754*/"GUJARATI VOWEL SIGN UU"/* 0AC2 */,/*2755*/"GUJARATI VOWEL SIGN VOCALIC R"/* 0AC3 */, /*2756*/"GUJARATI VOWEL SIGN VOCALIC RR"/* 0AC4 */,/*2757*/"GUJARATI VOWEL SIGN CANDRA E"/* 0AC5 */,NULL, /*2759*/"GUJARATI VOWEL SIGN E"/* 0AC7 */,/*2760*/"GUJARATI VOWEL SIGN AI"/* 0AC8 */, /*2761*/"GUJARATI VOWEL SIGN CANDRA O"/* 0AC9 */,NULL,/*2763*/"GUJARATI VOWEL SIGN O"/* 0ACB */, /*2764*/"GUJARATI VOWEL SIGN AU"/* 0ACC */,/*2765*/"GUJARATI SIGN VIRAMA"/* 0ACD */,NULL,NULL, /*2768*/"GUJARATI OM"/* 0AD0 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*2784*/"GUJARATI LETTER VOCALIC RR"/* 0AE0 */,/*2785*/"GUJARATI LETTER VOCALIC LL"/* 0AE1 */, /*2786*/"GUJARATI VOWEL SIGN VOCALIC L"/* 0AE2 */,/*2787*/"GUJARATI VOWEL SIGN VOCALIC LL"/* 0AE3 */,NULL,NULL, /*2790*/"GUJARATI DIGIT ZERO"/* 0AE6 */,/*2791*/"GUJARATI DIGIT ONE"/* 0AE7 */,/*2792*/"GUJARATI DIGIT TWO"/* 0AE8 */, /*2793*/"GUJARATI DIGIT THREE"/* 0AE9 */,/*2794*/"GUJARATI DIGIT FOUR"/* 0AEA */,/*2795*/"GUJARATI DIGIT FIVE"/* 0AEB */, /*2796*/"GUJARATI DIGIT SIX"/* 0AEC */,/*2797*/"GUJARATI DIGIT SEVEN"/* 0AED */,/*2798*/"GUJARATI DIGIT EIGHT"/* 0AEE */, /*2799*/"GUJARATI DIGIT NINE"/* 0AEF */,/*2800*/"GUJARATI ABBREVIATION SIGN"/* 0AF0 */, /*2801*/"GUJARATI RUPEE SIGN"/* 0AF1 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*2809*/"GUJARATI LETTER ZHA"/* 0AF9 */, /*2810*/"GUJARATI SIGN SUKUN"/* 0AFA */,/*2811*/"GUJARATI SIGN SHADDA"/* 0AFB */, /*2812*/"GUJARATI SIGN MADDAH"/* 0AFC */,/*2813*/"GUJARATI SIGN THREE-DOT NUKTA ABOVE"/* 0AFD */, /*2814*/"GUJARATI SIGN CIRCLE NUKTA ABOVE"/* 0AFE */,/*2815*/"GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE"/* 0AFF */,NULL, /*2817*/"ORIYA SIGN CANDRABINDU"/* 0B01 */,/*2818*/"ORIYA SIGN ANUSVARA"/* 0B02 */, /*2819*/"ORIYA SIGN VISARGA"/* 0B03 */,NULL,/*2821*/"ORIYA LETTER A"/* 0B05 */,/*2822*/"ORIYA LETTER AA"/* 0B06 */, /*2823*/"ORIYA LETTER I"/* 0B07 */,/*2824*/"ORIYA LETTER II"/* 0B08 */,/*2825*/"ORIYA LETTER U"/* 0B09 */, /*2826*/"ORIYA LETTER UU"/* 0B0A */,/*2827*/"ORIYA LETTER VOCALIC R"/* 0B0B */, /*2828*/"ORIYA LETTER VOCALIC L"/* 0B0C */,NULL,NULL,/*2831*/"ORIYA LETTER E"/* 0B0F */, /*2832*/"ORIYA LETTER AI"/* 0B10 */,NULL,NULL,/*2835*/"ORIYA LETTER O"/* 0B13 */,/*2836*/"ORIYA LETTER AU"/* 0B14 */, /*2837*/"ORIYA LETTER KA"/* 0B15 */,/*2838*/"ORIYA LETTER KHA"/* 0B16 */,/*2839*/"ORIYA LETTER GA"/* 0B17 */, /*2840*/"ORIYA LETTER GHA"/* 0B18 */,/*2841*/"ORIYA LETTER NGA"/* 0B19 */,/*2842*/"ORIYA LETTER CA"/* 0B1A */, /*2843*/"ORIYA LETTER CHA"/* 0B1B */,/*2844*/"ORIYA LETTER JA"/* 0B1C */,/*2845*/"ORIYA LETTER JHA"/* 0B1D */, /*2846*/"ORIYA LETTER NYA"/* 0B1E */,/*2847*/"ORIYA LETTER TTA"/* 0B1F */,/*2848*/"ORIYA LETTER TTHA"/* 0B20 */, /*2849*/"ORIYA LETTER DDA"/* 0B21 */,/*2850*/"ORIYA LETTER DDHA"/* 0B22 */,/*2851*/"ORIYA LETTER NNA"/* 0B23 */, /*2852*/"ORIYA LETTER TA"/* 0B24 */,/*2853*/"ORIYA LETTER THA"/* 0B25 */,/*2854*/"ORIYA LETTER DA"/* 0B26 */, /*2855*/"ORIYA LETTER DHA"/* 0B27 */,/*2856*/"ORIYA LETTER NA"/* 0B28 */,NULL,/*2858*/"ORIYA LETTER PA"/* 0B2A */, /*2859*/"ORIYA LETTER PHA"/* 0B2B */,/*2860*/"ORIYA LETTER BA"/* 0B2C */,/*2861*/"ORIYA LETTER BHA"/* 0B2D */, /*2862*/"ORIYA LETTER MA"/* 0B2E */,/*2863*/"ORIYA LETTER YA"/* 0B2F */,/*2864*/"ORIYA LETTER RA"/* 0B30 */,NULL, /*2866*/"ORIYA LETTER LA"/* 0B32 */,/*2867*/"ORIYA LETTER LLA"/* 0B33 */,NULL,/*2869*/"ORIYA LETTER VA"/* 0B35 */, /*2870*/"ORIYA LETTER SHA"/* 0B36 */,/*2871*/"ORIYA LETTER SSA"/* 0B37 */,/*2872*/"ORIYA LETTER SA"/* 0B38 */, /*2873*/"ORIYA LETTER HA"/* 0B39 */,NULL,NULL,/*2876*/"ORIYA SIGN NUKTA"/* 0B3C */, /*2877*/"ORIYA SIGN AVAGRAHA"/* 0B3D */,/*2878*/"ORIYA VOWEL SIGN AA"/* 0B3E */,/*2879*/"ORIYA VOWEL SIGN I"/* 0B3F */, /*2880*/"ORIYA VOWEL SIGN II"/* 0B40 */,/*2881*/"ORIYA VOWEL SIGN U"/* 0B41 */,/*2882*/"ORIYA VOWEL SIGN UU"/* 0B42 */, /*2883*/"ORIYA VOWEL SIGN VOCALIC R"/* 0B43 */,/*2884*/"ORIYA VOWEL SIGN VOCALIC RR"/* 0B44 */,NULL,NULL, /*2887*/"ORIYA VOWEL SIGN E"/* 0B47 */,/*2888*/"ORIYA VOWEL SIGN AI"/* 0B48 */,NULL,NULL, /*2891*/"ORIYA VOWEL SIGN O"/* 0B4B */,/*2892*/"ORIYA VOWEL SIGN AU"/* 0B4C */,/*2893*/"ORIYA SIGN VIRAMA"/* 0B4D */, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*2902*/"ORIYA AI LENGTH MARK"/* 0B56 */, /*2903*/"ORIYA AU LENGTH MARK"/* 0B57 */,NULL,NULL,NULL,NULL,/*2908*/"ORIYA LETTER RRA"/* 0B5C */, /*2909*/"ORIYA LETTER RHA"/* 0B5D */,NULL,/*2911*/"ORIYA LETTER YYA"/* 0B5F */, /*2912*/"ORIYA LETTER VOCALIC RR"/* 0B60 */,/*2913*/"ORIYA LETTER VOCALIC LL"/* 0B61 */, /*2914*/"ORIYA VOWEL SIGN VOCALIC L"/* 0B62 */,/*2915*/"ORIYA VOWEL SIGN VOCALIC LL"/* 0B63 */,NULL,NULL, /*2918*/"ORIYA DIGIT ZERO"/* 0B66 */,/*2919*/"ORIYA DIGIT ONE"/* 0B67 */,/*2920*/"ORIYA DIGIT TWO"/* 0B68 */, /*2921*/"ORIYA DIGIT THREE"/* 0B69 */,/*2922*/"ORIYA DIGIT FOUR"/* 0B6A */,/*2923*/"ORIYA DIGIT FIVE"/* 0B6B */, /*2924*/"ORIYA DIGIT SIX"/* 0B6C */,/*2925*/"ORIYA DIGIT SEVEN"/* 0B6D */,/*2926*/"ORIYA DIGIT EIGHT"/* 0B6E */, /*2927*/"ORIYA DIGIT NINE"/* 0B6F */,/*2928*/"ORIYA ISSHAR"/* 0B70 */,/*2929*/"ORIYA LETTER WA"/* 0B71 */, /*2930*/"ORIYA FRACTION ONE QUARTER"/* 0B72 */,/*2931*/"ORIYA FRACTION ONE HALF"/* 0B73 */, /*2932*/"ORIYA FRACTION THREE QUARTERS"/* 0B74 */,/*2933*/"ORIYA FRACTION ONE SIXTEENTH"/* 0B75 */, /*2934*/"ORIYA FRACTION ONE EIGHTH"/* 0B76 */,/*2935*/"ORIYA FRACTION THREE SIXTEENTHS"/* 0B77 */,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,/*2946*/"TAMIL SIGN ANUSVARA"/* 0B82 */,/*2947*/"TAMIL SIGN VISARGA"/* 0B83 */,NULL, /*2949*/"TAMIL LETTER A"/* 0B85 */,/*2950*/"TAMIL LETTER AA"/* 0B86 */,/*2951*/"TAMIL LETTER I"/* 0B87 */, /*2952*/"TAMIL LETTER II"/* 0B88 */,/*2953*/"TAMIL LETTER U"/* 0B89 */,/*2954*/"TAMIL LETTER UU"/* 0B8A */,NULL,NULL, NULL,/*2958*/"TAMIL LETTER E"/* 0B8E */,/*2959*/"TAMIL LETTER EE"/* 0B8F */,/*2960*/"TAMIL LETTER AI"/* 0B90 */,NULL, /*2962*/"TAMIL LETTER O"/* 0B92 */,/*2963*/"TAMIL LETTER OO"/* 0B93 */,/*2964*/"TAMIL LETTER AU"/* 0B94 */, /*2965*/"TAMIL LETTER KA"/* 0B95 */,NULL,NULL,NULL,/*2969*/"TAMIL LETTER NGA"/* 0B99 */, /*2970*/"TAMIL LETTER CA"/* 0B9A */,NULL,/*2972*/"TAMIL LETTER JA"/* 0B9C */,NULL,/*2974*/"TAMIL LETTER NYA"/* 0B9E */, /*2975*/"TAMIL LETTER TTA"/* 0B9F */,NULL,NULL,NULL,/*2979*/"TAMIL LETTER NNA"/* 0BA3 */, /*2980*/"TAMIL LETTER TA"/* 0BA4 */,NULL,NULL,NULL,/*2984*/"TAMIL LETTER NA"/* 0BA8 */, /*2985*/"TAMIL LETTER NNNA"/* 0BA9 */,/*2986*/"TAMIL LETTER PA"/* 0BAA */,NULL,NULL,NULL, /*2990*/"TAMIL LETTER MA"/* 0BAE */,/*2991*/"TAMIL LETTER YA"/* 0BAF */,/*2992*/"TAMIL LETTER RA"/* 0BB0 */, /*2993*/"TAMIL LETTER RRA"/* 0BB1 */,/*2994*/"TAMIL LETTER LA"/* 0BB2 */,/*2995*/"TAMIL LETTER LLA"/* 0BB3 */, /*2996*/"TAMIL LETTER LLLA"/* 0BB4 */,/*2997*/"TAMIL LETTER VA"/* 0BB5 */,/*2998*/"TAMIL LETTER SHA"/* 0BB6 */, /*2999*/"TAMIL LETTER SSA"/* 0BB7 */,/*3000*/"TAMIL LETTER SA"/* 0BB8 */,/*3001*/"TAMIL LETTER HA"/* 0BB9 */,NULL,NULL, NULL,NULL,/*3006*/"TAMIL VOWEL SIGN AA"/* 0BBE */,/*3007*/"TAMIL VOWEL SIGN I"/* 0BBF */, /*3008*/"TAMIL VOWEL SIGN II"/* 0BC0 */,/*3009*/"TAMIL VOWEL SIGN U"/* 0BC1 */,/*3010*/"TAMIL VOWEL SIGN UU"/* 0BC2 */, NULL,NULL,NULL,/*3014*/"TAMIL VOWEL SIGN E"/* 0BC6 */,/*3015*/"TAMIL VOWEL SIGN EE"/* 0BC7 */, /*3016*/"TAMIL VOWEL SIGN AI"/* 0BC8 */,NULL,/*3018*/"TAMIL VOWEL SIGN O"/* 0BCA */, /*3019*/"TAMIL VOWEL SIGN OO"/* 0BCB */,/*3020*/"TAMIL VOWEL SIGN AU"/* 0BCC */,/*3021*/"TAMIL SIGN VIRAMA"/* 0BCD */, NULL,NULL,/*3024*/"TAMIL OM"/* 0BD0 */,NULL,NULL,NULL,NULL,NULL,NULL,/*3031*/"TAMIL AU LENGTH MARK"/* 0BD7 */,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*3046*/"TAMIL DIGIT ZERO"/* 0BE6 */, /*3047*/"TAMIL DIGIT ONE"/* 0BE7 */,/*3048*/"TAMIL DIGIT TWO"/* 0BE8 */,/*3049*/"TAMIL DIGIT THREE"/* 0BE9 */, /*3050*/"TAMIL DIGIT FOUR"/* 0BEA */,/*3051*/"TAMIL DIGIT FIVE"/* 0BEB */,/*3052*/"TAMIL DIGIT SIX"/* 0BEC */, /*3053*/"TAMIL DIGIT SEVEN"/* 0BED */,/*3054*/"TAMIL DIGIT EIGHT"/* 0BEE */,/*3055*/"TAMIL DIGIT NINE"/* 0BEF */, /*3056*/"TAMIL NUMBER TEN"/* 0BF0 */,/*3057*/"TAMIL NUMBER ONE HUNDRED"/* 0BF1 */, /*3058*/"TAMIL NUMBER ONE THOUSAND"/* 0BF2 */,/*3059*/"TAMIL DAY SIGN"/* 0BF3 */,/*3060*/"TAMIL MONTH SIGN"/* 0BF4 */, /*3061*/"TAMIL YEAR SIGN"/* 0BF5 */,/*3062*/"TAMIL DEBIT SIGN"/* 0BF6 */,/*3063*/"TAMIL CREDIT SIGN"/* 0BF7 */, /*3064*/"TAMIL AS ABOVE SIGN"/* 0BF8 */,/*3065*/"TAMIL RUPEE SIGN"/* 0BF9 */,/*3066*/"TAMIL NUMBER SIGN"/* 0BFA */,NULL, NULL,NULL,NULL,NULL,/*3072*/"TELUGU SIGN COMBINING CANDRABINDU ABOVE"/* 0C00 */, /*3073*/"TELUGU SIGN CANDRABINDU"/* 0C01 */,/*3074*/"TELUGU SIGN ANUSVARA"/* 0C02 */, /*3075*/"TELUGU SIGN VISARGA"/* 0C03 */,NULL,/*3077*/"TELUGU LETTER A"/* 0C05 */,/*3078*/"TELUGU LETTER AA"/* 0C06 */, /*3079*/"TELUGU LETTER I"/* 0C07 */,/*3080*/"TELUGU LETTER II"/* 0C08 */,/*3081*/"TELUGU LETTER U"/* 0C09 */, /*3082*/"TELUGU LETTER UU"/* 0C0A */,/*3083*/"TELUGU LETTER VOCALIC R"/* 0C0B */, /*3084*/"TELUGU LETTER VOCALIC L"/* 0C0C */,NULL,/*3086*/"TELUGU LETTER E"/* 0C0E */, /*3087*/"TELUGU LETTER EE"/* 0C0F */,/*3088*/"TELUGU LETTER AI"/* 0C10 */,NULL,/*3090*/"TELUGU LETTER O"/* 0C12 */, /*3091*/"TELUGU LETTER OO"/* 0C13 */,/*3092*/"TELUGU LETTER AU"/* 0C14 */,/*3093*/"TELUGU LETTER KA"/* 0C15 */, /*3094*/"TELUGU LETTER KHA"/* 0C16 */,/*3095*/"TELUGU LETTER GA"/* 0C17 */,/*3096*/"TELUGU LETTER GHA"/* 0C18 */, /*3097*/"TELUGU LETTER NGA"/* 0C19 */,/*3098*/"TELUGU LETTER CA"/* 0C1A */,/*3099*/"TELUGU LETTER CHA"/* 0C1B */, /*3100*/"TELUGU LETTER JA"/* 0C1C */,/*3101*/"TELUGU LETTER JHA"/* 0C1D */,/*3102*/"TELUGU LETTER NYA"/* 0C1E */, /*3103*/"TELUGU LETTER TTA"/* 0C1F */,/*3104*/"TELUGU LETTER TTHA"/* 0C20 */,/*3105*/"TELUGU LETTER DDA"/* 0C21 */, /*3106*/"TELUGU LETTER DDHA"/* 0C22 */,/*3107*/"TELUGU LETTER NNA"/* 0C23 */,/*3108*/"TELUGU LETTER TA"/* 0C24 */, /*3109*/"TELUGU LETTER THA"/* 0C25 */,/*3110*/"TELUGU LETTER DA"/* 0C26 */,/*3111*/"TELUGU LETTER DHA"/* 0C27 */, /*3112*/"TELUGU LETTER NA"/* 0C28 */,NULL,/*3114*/"TELUGU LETTER PA"/* 0C2A */,/*3115*/"TELUGU LETTER PHA"/* 0C2B */, /*3116*/"TELUGU LETTER BA"/* 0C2C */,/*3117*/"TELUGU LETTER BHA"/* 0C2D */,/*3118*/"TELUGU LETTER MA"/* 0C2E */, /*3119*/"TELUGU LETTER YA"/* 0C2F */,/*3120*/"TELUGU LETTER RA"/* 0C30 */,/*3121*/"TELUGU LETTER RRA"/* 0C31 */, /*3122*/"TELUGU LETTER LA"/* 0C32 */,/*3123*/"TELUGU LETTER LLA"/* 0C33 */,/*3124*/"TELUGU LETTER LLLA"/* 0C34 */, /*3125*/"TELUGU LETTER VA"/* 0C35 */,/*3126*/"TELUGU LETTER SHA"/* 0C36 */,/*3127*/"TELUGU LETTER SSA"/* 0C37 */, /*3128*/"TELUGU LETTER SA"/* 0C38 */,/*3129*/"TELUGU LETTER HA"/* 0C39 */,NULL,NULL,NULL, /*3133*/"TELUGU SIGN AVAGRAHA"/* 0C3D */,/*3134*/"TELUGU VOWEL SIGN AA"/* 0C3E */, /*3135*/"TELUGU VOWEL SIGN I"/* 0C3F */,/*3136*/"TELUGU VOWEL SIGN II"/* 0C40 */,/*3137*/"TELUGU VOWEL SIGN U"/* 0C41 */, /*3138*/"TELUGU VOWEL SIGN UU"/* 0C42 */,/*3139*/"TELUGU VOWEL SIGN VOCALIC R"/* 0C43 */, /*3140*/"TELUGU VOWEL SIGN VOCALIC RR"/* 0C44 */,NULL,/*3142*/"TELUGU VOWEL SIGN E"/* 0C46 */, /*3143*/"TELUGU VOWEL SIGN EE"/* 0C47 */,/*3144*/"TELUGU VOWEL SIGN AI"/* 0C48 */,NULL, /*3146*/"TELUGU VOWEL SIGN O"/* 0C4A */,/*3147*/"TELUGU VOWEL SIGN OO"/* 0C4B */, /*3148*/"TELUGU VOWEL SIGN AU"/* 0C4C */,/*3149*/"TELUGU SIGN VIRAMA"/* 0C4D */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*3157*/"TELUGU LENGTH MARK"/* 0C55 */,/*3158*/"TELUGU AI LENGTH MARK"/* 0C56 */,NULL, /*3160*/"TELUGU LETTER TSA"/* 0C58 */,/*3161*/"TELUGU LETTER DZA"/* 0C59 */,/*3162*/"TELUGU LETTER RRRA"/* 0C5A */,NULL, NULL,NULL,NULL,NULL,/*3168*/"TELUGU LETTER VOCALIC RR"/* 0C60 */,/*3169*/"TELUGU LETTER VOCALIC LL"/* 0C61 */, /*3170*/"TELUGU VOWEL SIGN VOCALIC L"/* 0C62 */,/*3171*/"TELUGU VOWEL SIGN VOCALIC LL"/* 0C63 */,NULL,NULL, /*3174*/"TELUGU DIGIT ZERO"/* 0C66 */,/*3175*/"TELUGU DIGIT ONE"/* 0C67 */,/*3176*/"TELUGU DIGIT TWO"/* 0C68 */, /*3177*/"TELUGU DIGIT THREE"/* 0C69 */,/*3178*/"TELUGU DIGIT FOUR"/* 0C6A */,/*3179*/"TELUGU DIGIT FIVE"/* 0C6B */, /*3180*/"TELUGU DIGIT SIX"/* 0C6C */,/*3181*/"TELUGU DIGIT SEVEN"/* 0C6D */,/*3182*/"TELUGU DIGIT EIGHT"/* 0C6E */, /*3183*/"TELUGU DIGIT NINE"/* 0C6F */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*3192*/"TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR"/* 0C78 */, /*3193*/"TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR"/* 0C79 */, /*3194*/"TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR"/* 0C7A */, /*3195*/"TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR"/* 0C7B */, /*3196*/"TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR"/* 0C7C */, /*3197*/"TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR"/* 0C7D */, /*3198*/"TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR"/* 0C7E */,/*3199*/"TELUGU SIGN TUUMU"/* 0C7F */, /*3200*/"KANNADA SIGN SPACING CANDRABINDU"/* 0C80 */,/*3201*/"KANNADA SIGN CANDRABINDU"/* 0C81 */, /*3202*/"KANNADA SIGN ANUSVARA"/* 0C82 */,/*3203*/"KANNADA SIGN VISARGA"/* 0C83 */,NULL, /*3205*/"KANNADA LETTER A"/* 0C85 */,/*3206*/"KANNADA LETTER AA"/* 0C86 */,/*3207*/"KANNADA LETTER I"/* 0C87 */, /*3208*/"KANNADA LETTER II"/* 0C88 */,/*3209*/"KANNADA LETTER U"/* 0C89 */,/*3210*/"KANNADA LETTER UU"/* 0C8A */, /*3211*/"KANNADA LETTER VOCALIC R"/* 0C8B */,/*3212*/"KANNADA LETTER VOCALIC L"/* 0C8C */,NULL, /*3214*/"KANNADA LETTER E"/* 0C8E */,/*3215*/"KANNADA LETTER EE"/* 0C8F */,/*3216*/"KANNADA LETTER AI"/* 0C90 */,NULL, /*3218*/"KANNADA LETTER O"/* 0C92 */,/*3219*/"KANNADA LETTER OO"/* 0C93 */,/*3220*/"KANNADA LETTER AU"/* 0C94 */, /*3221*/"KANNADA LETTER KA"/* 0C95 */,/*3222*/"KANNADA LETTER KHA"/* 0C96 */,/*3223*/"KANNADA LETTER GA"/* 0C97 */, /*3224*/"KANNADA LETTER GHA"/* 0C98 */,/*3225*/"KANNADA LETTER NGA"/* 0C99 */,/*3226*/"KANNADA LETTER CA"/* 0C9A */, /*3227*/"KANNADA LETTER CHA"/* 0C9B */,/*3228*/"KANNADA LETTER JA"/* 0C9C */,/*3229*/"KANNADA LETTER JHA"/* 0C9D */, /*3230*/"KANNADA LETTER NYA"/* 0C9E */,/*3231*/"KANNADA LETTER TTA"/* 0C9F */,/*3232*/"KANNADA LETTER TTHA"/* 0CA0 */, /*3233*/"KANNADA LETTER DDA"/* 0CA1 */,/*3234*/"KANNADA LETTER DDHA"/* 0CA2 */,/*3235*/"KANNADA LETTER NNA"/* 0CA3 */, /*3236*/"KANNADA LETTER TA"/* 0CA4 */,/*3237*/"KANNADA LETTER THA"/* 0CA5 */,/*3238*/"KANNADA LETTER DA"/* 0CA6 */, /*3239*/"KANNADA LETTER DHA"/* 0CA7 */,/*3240*/"KANNADA LETTER NA"/* 0CA8 */,NULL,/*3242*/"KANNADA LETTER PA"/* 0CAA */, /*3243*/"KANNADA LETTER PHA"/* 0CAB */,/*3244*/"KANNADA LETTER BA"/* 0CAC */,/*3245*/"KANNADA LETTER BHA"/* 0CAD */, /*3246*/"KANNADA LETTER MA"/* 0CAE */,/*3247*/"KANNADA LETTER YA"/* 0CAF */,/*3248*/"KANNADA LETTER RA"/* 0CB0 */, /*3249*/"KANNADA LETTER RRA"/* 0CB1 */,/*3250*/"KANNADA LETTER LA"/* 0CB2 */,/*3251*/"KANNADA LETTER LLA"/* 0CB3 */,NULL, /*3253*/"KANNADA LETTER VA"/* 0CB5 */,/*3254*/"KANNADA LETTER SHA"/* 0CB6 */,/*3255*/"KANNADA LETTER SSA"/* 0CB7 */, /*3256*/"KANNADA LETTER SA"/* 0CB8 */,/*3257*/"KANNADA LETTER HA"/* 0CB9 */,NULL,NULL, /*3260*/"KANNADA SIGN NUKTA"/* 0CBC */,/*3261*/"KANNADA SIGN AVAGRAHA"/* 0CBD */, /*3262*/"KANNADA VOWEL SIGN AA"/* 0CBE */,/*3263*/"KANNADA VOWEL SIGN I"/* 0CBF */, /*3264*/"KANNADA VOWEL SIGN II"/* 0CC0 */,/*3265*/"KANNADA VOWEL SIGN U"/* 0CC1 */, /*3266*/"KANNADA VOWEL SIGN UU"/* 0CC2 */,/*3267*/"KANNADA VOWEL SIGN VOCALIC R"/* 0CC3 */, /*3268*/"KANNADA VOWEL SIGN VOCALIC RR"/* 0CC4 */,NULL,/*3270*/"KANNADA VOWEL SIGN E"/* 0CC6 */, /*3271*/"KANNADA VOWEL SIGN EE"/* 0CC7 */,/*3272*/"KANNADA VOWEL SIGN AI"/* 0CC8 */,NULL, /*3274*/"KANNADA VOWEL SIGN O"/* 0CCA */,/*3275*/"KANNADA VOWEL SIGN OO"/* 0CCB */, /*3276*/"KANNADA VOWEL SIGN AU"/* 0CCC */,/*3277*/"KANNADA SIGN VIRAMA"/* 0CCD */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*3285*/"KANNADA LENGTH MARK"/* 0CD5 */,/*3286*/"KANNADA AI LENGTH MARK"/* 0CD6 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*3294*/"KANNADA LETTER FA"/* 0CDE */,NULL,/*3296*/"KANNADA LETTER VOCALIC RR"/* 0CE0 */, /*3297*/"KANNADA LETTER VOCALIC LL"/* 0CE1 */,/*3298*/"KANNADA VOWEL SIGN VOCALIC L"/* 0CE2 */, /*3299*/"KANNADA VOWEL SIGN VOCALIC LL"/* 0CE3 */,NULL,NULL,/*3302*/"KANNADA DIGIT ZERO"/* 0CE6 */, /*3303*/"KANNADA DIGIT ONE"/* 0CE7 */,/*3304*/"KANNADA DIGIT TWO"/* 0CE8 */,/*3305*/"KANNADA DIGIT THREE"/* 0CE9 */, /*3306*/"KANNADA DIGIT FOUR"/* 0CEA */,/*3307*/"KANNADA DIGIT FIVE"/* 0CEB */,/*3308*/"KANNADA DIGIT SIX"/* 0CEC */, /*3309*/"KANNADA DIGIT SEVEN"/* 0CED */,/*3310*/"KANNADA DIGIT EIGHT"/* 0CEE */,/*3311*/"KANNADA DIGIT NINE"/* 0CEF */, NULL,/*3313*/"KANNADA SIGN JIHVAMULIYA"/* 0CF1 */,/*3314*/"KANNADA SIGN UPADHMANIYA"/* 0CF2 */,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*3328*/"MALAYALAM SIGN COMBINING ANUSVARA ABOVE"/* 0D00 */, /*3329*/"MALAYALAM SIGN CANDRABINDU"/* 0D01 */,/*3330*/"MALAYALAM SIGN ANUSVARA"/* 0D02 */, /*3331*/"MALAYALAM SIGN VISARGA"/* 0D03 */,NULL,/*3333*/"MALAYALAM LETTER A"/* 0D05 */, /*3334*/"MALAYALAM LETTER AA"/* 0D06 */,/*3335*/"MALAYALAM LETTER I"/* 0D07 */,/*3336*/"MALAYALAM LETTER II"/* 0D08 */, /*3337*/"MALAYALAM LETTER U"/* 0D09 */,/*3338*/"MALAYALAM LETTER UU"/* 0D0A */, /*3339*/"MALAYALAM LETTER VOCALIC R"/* 0D0B */,/*3340*/"MALAYALAM LETTER VOCALIC L"/* 0D0C */,NULL, /*3342*/"MALAYALAM LETTER E"/* 0D0E */,/*3343*/"MALAYALAM LETTER EE"/* 0D0F */,/*3344*/"MALAYALAM LETTER AI"/* 0D10 */, NULL,/*3346*/"MALAYALAM LETTER O"/* 0D12 */,/*3347*/"MALAYALAM LETTER OO"/* 0D13 */, /*3348*/"MALAYALAM LETTER AU"/* 0D14 */,/*3349*/"MALAYALAM LETTER KA"/* 0D15 */,/*3350*/"MALAYALAM LETTER KHA"/* 0D16 */, /*3351*/"MALAYALAM LETTER GA"/* 0D17 */,/*3352*/"MALAYALAM LETTER GHA"/* 0D18 */, /*3353*/"MALAYALAM LETTER NGA"/* 0D19 */,/*3354*/"MALAYALAM LETTER CA"/* 0D1A */, /*3355*/"MALAYALAM LETTER CHA"/* 0D1B */,/*3356*/"MALAYALAM LETTER JA"/* 0D1C */, /*3357*/"MALAYALAM LETTER JHA"/* 0D1D */,/*3358*/"MALAYALAM LETTER NYA"/* 0D1E */, /*3359*/"MALAYALAM LETTER TTA"/* 0D1F */,/*3360*/"MALAYALAM LETTER TTHA"/* 0D20 */, /*3361*/"MALAYALAM LETTER DDA"/* 0D21 */,/*3362*/"MALAYALAM LETTER DDHA"/* 0D22 */, /*3363*/"MALAYALAM LETTER NNA"/* 0D23 */,/*3364*/"MALAYALAM LETTER TA"/* 0D24 */, /*3365*/"MALAYALAM LETTER THA"/* 0D25 */,/*3366*/"MALAYALAM LETTER DA"/* 0D26 */, /*3367*/"MALAYALAM LETTER DHA"/* 0D27 */,/*3368*/"MALAYALAM LETTER NA"/* 0D28 */, /*3369*/"MALAYALAM LETTER NNNA"/* 0D29 */,/*3370*/"MALAYALAM LETTER PA"/* 0D2A */, /*3371*/"MALAYALAM LETTER PHA"/* 0D2B */,/*3372*/"MALAYALAM LETTER BA"/* 0D2C */, /*3373*/"MALAYALAM LETTER BHA"/* 0D2D */,/*3374*/"MALAYALAM LETTER MA"/* 0D2E */,/*3375*/"MALAYALAM LETTER YA"/* 0D2F */, /*3376*/"MALAYALAM LETTER RA"/* 0D30 */,/*3377*/"MALAYALAM LETTER RRA"/* 0D31 */,/*3378*/"MALAYALAM LETTER LA"/* 0D32 */, /*3379*/"MALAYALAM LETTER LLA"/* 0D33 */,/*3380*/"MALAYALAM LETTER LLLA"/* 0D34 */, /*3381*/"MALAYALAM LETTER VA"/* 0D35 */,/*3382*/"MALAYALAM LETTER SHA"/* 0D36 */, /*3383*/"MALAYALAM LETTER SSA"/* 0D37 */,/*3384*/"MALAYALAM LETTER SA"/* 0D38 */,/*3385*/"MALAYALAM LETTER HA"/* 0D39 */, /*3386*/"MALAYALAM LETTER TTTA"/* 0D3A */,/*3387*/"MALAYALAM SIGN VERTICAL BAR VIRAMA"/* 0D3B */, /*3388*/"MALAYALAM SIGN CIRCULAR VIRAMA"/* 0D3C */,/*3389*/"MALAYALAM SIGN AVAGRAHA"/* 0D3D */, /*3390*/"MALAYALAM VOWEL SIGN AA"/* 0D3E */,/*3391*/"MALAYALAM VOWEL SIGN I"/* 0D3F */, /*3392*/"MALAYALAM VOWEL SIGN II"/* 0D40 */,/*3393*/"MALAYALAM VOWEL SIGN U"/* 0D41 */, /*3394*/"MALAYALAM VOWEL SIGN UU"/* 0D42 */,/*3395*/"MALAYALAM VOWEL SIGN VOCALIC R"/* 0D43 */, /*3396*/"MALAYALAM VOWEL SIGN VOCALIC RR"/* 0D44 */,NULL,/*3398*/"MALAYALAM VOWEL SIGN E"/* 0D46 */, /*3399*/"MALAYALAM VOWEL SIGN EE"/* 0D47 */,/*3400*/"MALAYALAM VOWEL SIGN AI"/* 0D48 */,NULL, /*3402*/"MALAYALAM VOWEL SIGN O"/* 0D4A */,/*3403*/"MALAYALAM VOWEL SIGN OO"/* 0D4B */, /*3404*/"MALAYALAM VOWEL SIGN AU"/* 0D4C */,/*3405*/"MALAYALAM SIGN VIRAMA"/* 0D4D */, /*3406*/"MALAYALAM LETTER DOT REPH"/* 0D4E */,/*3407*/"MALAYALAM SIGN PARA"/* 0D4F */,NULL,NULL,NULL,NULL, /*3412*/"MALAYALAM LETTER CHILLU M"/* 0D54 */,/*3413*/"MALAYALAM LETTER CHILLU Y"/* 0D55 */, /*3414*/"MALAYALAM LETTER CHILLU LLL"/* 0D56 */,/*3415*/"MALAYALAM AU LENGTH MARK"/* 0D57 */, /*3416*/"MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH"/* 0D58 */,/*3417*/"MALAYALAM FRACTION ONE FORTIETH"/* 0D59 */, /*3418*/"MALAYALAM FRACTION THREE EIGHTIETHS"/* 0D5A */,/*3419*/"MALAYALAM FRACTION ONE TWENTIETH"/* 0D5B */, /*3420*/"MALAYALAM FRACTION ONE TENTH"/* 0D5C */,/*3421*/"MALAYALAM FRACTION THREE TWENTIETHS"/* 0D5D */, /*3422*/"MALAYALAM FRACTION ONE FIFTH"/* 0D5E */,/*3423*/"MALAYALAM LETTER ARCHAIC II"/* 0D5F */, /*3424*/"MALAYALAM LETTER VOCALIC RR"/* 0D60 */,/*3425*/"MALAYALAM LETTER VOCALIC LL"/* 0D61 */, /*3426*/"MALAYALAM VOWEL SIGN VOCALIC L"/* 0D62 */,/*3427*/"MALAYALAM VOWEL SIGN VOCALIC LL"/* 0D63 */,NULL,NULL, /*3430*/"MALAYALAM DIGIT ZERO"/* 0D66 */,/*3431*/"MALAYALAM DIGIT ONE"/* 0D67 */,/*3432*/"MALAYALAM DIGIT TWO"/* 0D68 */, /*3433*/"MALAYALAM DIGIT THREE"/* 0D69 */,/*3434*/"MALAYALAM DIGIT FOUR"/* 0D6A */, /*3435*/"MALAYALAM DIGIT FIVE"/* 0D6B */,/*3436*/"MALAYALAM DIGIT SIX"/* 0D6C */, /*3437*/"MALAYALAM DIGIT SEVEN"/* 0D6D */,/*3438*/"MALAYALAM DIGIT EIGHT"/* 0D6E */, /*3439*/"MALAYALAM DIGIT NINE"/* 0D6F */,/*3440*/"MALAYALAM NUMBER TEN"/* 0D70 */, /*3441*/"MALAYALAM NUMBER ONE HUNDRED"/* 0D71 */,/*3442*/"MALAYALAM NUMBER ONE THOUSAND"/* 0D72 */, /*3443*/"MALAYALAM FRACTION ONE QUARTER"/* 0D73 */,/*3444*/"MALAYALAM FRACTION ONE HALF"/* 0D74 */, /*3445*/"MALAYALAM FRACTION THREE QUARTERS"/* 0D75 */,/*3446*/"MALAYALAM FRACTION ONE SIXTEENTH"/* 0D76 */, /*3447*/"MALAYALAM FRACTION ONE EIGHTH"/* 0D77 */,/*3448*/"MALAYALAM FRACTION THREE SIXTEENTHS"/* 0D78 */, /*3449*/"MALAYALAM DATE MARK"/* 0D79 */,/*3450*/"MALAYALAM LETTER CHILLU NN"/* 0D7A */, /*3451*/"MALAYALAM LETTER CHILLU N"/* 0D7B */,/*3452*/"MALAYALAM LETTER CHILLU RR"/* 0D7C */, /*3453*/"MALAYALAM LETTER CHILLU L"/* 0D7D */,/*3454*/"MALAYALAM LETTER CHILLU LL"/* 0D7E */, /*3455*/"MALAYALAM LETTER CHILLU K"/* 0D7F */,NULL,NULL,/*3458*/"SINHALA SIGN ANUSVARAYA"/* 0D82 */, /*3459*/"SINHALA SIGN VISARGAYA"/* 0D83 */,NULL,/*3461*/"SINHALA LETTER AYANNA"/* 0D85 */, /*3462*/"SINHALA LETTER AAYANNA"/* 0D86 */,/*3463*/"SINHALA LETTER AEYANNA"/* 0D87 */, /*3464*/"SINHALA LETTER AEEYANNA"/* 0D88 */,/*3465*/"SINHALA LETTER IYANNA"/* 0D89 */, /*3466*/"SINHALA LETTER IIYANNA"/* 0D8A */,/*3467*/"SINHALA LETTER UYANNA"/* 0D8B */, /*3468*/"SINHALA LETTER UUYANNA"/* 0D8C */,/*3469*/"SINHALA LETTER IRUYANNA"/* 0D8D */, /*3470*/"SINHALA LETTER IRUUYANNA"/* 0D8E */,/*3471*/"SINHALA LETTER ILUYANNA"/* 0D8F */, /*3472*/"SINHALA LETTER ILUUYANNA"/* 0D90 */,/*3473*/"SINHALA LETTER EYANNA"/* 0D91 */, /*3474*/"SINHALA LETTER EEYANNA"/* 0D92 */,/*3475*/"SINHALA LETTER AIYANNA"/* 0D93 */, /*3476*/"SINHALA LETTER OYANNA"/* 0D94 */,/*3477*/"SINHALA LETTER OOYANNA"/* 0D95 */, /*3478*/"SINHALA LETTER AUYANNA"/* 0D96 */,NULL,NULL,NULL,/*3482*/"SINHALA LETTER ALPAPRAANA KAYANNA"/* 0D9A */, /*3483*/"SINHALA LETTER MAHAAPRAANA KAYANNA"/* 0D9B */,/*3484*/"SINHALA LETTER ALPAPRAANA GAYANNA"/* 0D9C */, /*3485*/"SINHALA LETTER MAHAAPRAANA GAYANNA"/* 0D9D */,/*3486*/"SINHALA LETTER KANTAJA NAASIKYAYA"/* 0D9E */, /*3487*/"SINHALA LETTER SANYAKA GAYANNA"/* 0D9F */,/*3488*/"SINHALA LETTER ALPAPRAANA CAYANNA"/* 0DA0 */, /*3489*/"SINHALA LETTER MAHAAPRAANA CAYANNA"/* 0DA1 */,/*3490*/"SINHALA LETTER ALPAPRAANA JAYANNA"/* 0DA2 */, /*3491*/"SINHALA LETTER MAHAAPRAANA JAYANNA"/* 0DA3 */,/*3492*/"SINHALA LETTER TAALUJA NAASIKYAYA"/* 0DA4 */, /*3493*/"SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA"/* 0DA5 */,/*3494*/"SINHALA LETTER SANYAKA JAYANNA"/* 0DA6 */, /*3495*/"SINHALA LETTER ALPAPRAANA TTAYANNA"/* 0DA7 */,/*3496*/"SINHALA LETTER MAHAAPRAANA TTAYANNA"/* 0DA8 */, /*3497*/"SINHALA LETTER ALPAPRAANA DDAYANNA"/* 0DA9 */,/*3498*/"SINHALA LETTER MAHAAPRAANA DDAYANNA"/* 0DAA */, /*3499*/"SINHALA LETTER MUURDHAJA NAYANNA"/* 0DAB */,/*3500*/"SINHALA LETTER SANYAKA DDAYANNA"/* 0DAC */, /*3501*/"SINHALA LETTER ALPAPRAANA TAYANNA"/* 0DAD */,/*3502*/"SINHALA LETTER MAHAAPRAANA TAYANNA"/* 0DAE */, /*3503*/"SINHALA LETTER ALPAPRAANA DAYANNA"/* 0DAF */,/*3504*/"SINHALA LETTER MAHAAPRAANA DAYANNA"/* 0DB0 */, /*3505*/"SINHALA LETTER DANTAJA NAYANNA"/* 0DB1 */,NULL,/*3507*/"SINHALA LETTER SANYAKA DAYANNA"/* 0DB3 */, /*3508*/"SINHALA LETTER ALPAPRAANA PAYANNA"/* 0DB4 */,/*3509*/"SINHALA LETTER MAHAAPRAANA PAYANNA"/* 0DB5 */, /*3510*/"SINHALA LETTER ALPAPRAANA BAYANNA"/* 0DB6 */,/*3511*/"SINHALA LETTER MAHAAPRAANA BAYANNA"/* 0DB7 */, /*3512*/"SINHALA LETTER MAYANNA"/* 0DB8 */,/*3513*/"SINHALA LETTER AMBA BAYANNA"/* 0DB9 */, /*3514*/"SINHALA LETTER YAYANNA"/* 0DBA */,/*3515*/"SINHALA LETTER RAYANNA"/* 0DBB */,NULL, /*3517*/"SINHALA LETTER DANTAJA LAYANNA"/* 0DBD */,NULL,NULL,/*3520*/"SINHALA LETTER VAYANNA"/* 0DC0 */, /*3521*/"SINHALA LETTER TAALUJA SAYANNA"/* 0DC1 */,/*3522*/"SINHALA LETTER MUURDHAJA SAYANNA"/* 0DC2 */, /*3523*/"SINHALA LETTER DANTAJA SAYANNA"/* 0DC3 */,/*3524*/"SINHALA LETTER HAYANNA"/* 0DC4 */, /*3525*/"SINHALA LETTER MUURDHAJA LAYANNA"/* 0DC5 */,/*3526*/"SINHALA LETTER FAYANNA"/* 0DC6 */,NULL,NULL,NULL, /*3530*/"SINHALA SIGN AL-LAKUNA"/* 0DCA */,NULL,NULL,NULL,NULL,/*3535*/"SINHALA VOWEL SIGN AELA-PILLA"/* 0DCF */, /*3536*/"SINHALA VOWEL SIGN KETTI AEDA-PILLA"/* 0DD0 */,/*3537*/"SINHALA VOWEL SIGN DIGA AEDA-PILLA"/* 0DD1 */, /*3538*/"SINHALA VOWEL SIGN KETTI IS-PILLA"/* 0DD2 */,/*3539*/"SINHALA VOWEL SIGN DIGA IS-PILLA"/* 0DD3 */, /*3540*/"SINHALA VOWEL SIGN KETTI PAA-PILLA"/* 0DD4 */,NULL,/*3542*/"SINHALA VOWEL SIGN DIGA PAA-PILLA"/* 0DD6 */,NULL, /*3544*/"SINHALA VOWEL SIGN GAETTA-PILLA"/* 0DD8 */,/*3545*/"SINHALA VOWEL SIGN KOMBUVA"/* 0DD9 */, /*3546*/"SINHALA VOWEL SIGN DIGA KOMBUVA"/* 0DDA */,/*3547*/"SINHALA VOWEL SIGN KOMBU DEKA"/* 0DDB */, /*3548*/"SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA"/* 0DDC */, /*3549*/"SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA"/* 0DDD */, /*3550*/"SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA"/* 0DDE */,/*3551*/"SINHALA VOWEL SIGN GAYANUKITTA"/* 0DDF */,NULL, NULL,NULL,NULL,NULL,NULL,/*3558*/"SINHALA LITH DIGIT ZERO"/* 0DE6 */,/*3559*/"SINHALA LITH DIGIT ONE"/* 0DE7 */, /*3560*/"SINHALA LITH DIGIT TWO"/* 0DE8 */,/*3561*/"SINHALA LITH DIGIT THREE"/* 0DE9 */, /*3562*/"SINHALA LITH DIGIT FOUR"/* 0DEA */,/*3563*/"SINHALA LITH DIGIT FIVE"/* 0DEB */, /*3564*/"SINHALA LITH DIGIT SIX"/* 0DEC */,/*3565*/"SINHALA LITH DIGIT SEVEN"/* 0DED */, /*3566*/"SINHALA LITH DIGIT EIGHT"/* 0DEE */,/*3567*/"SINHALA LITH DIGIT NINE"/* 0DEF */,NULL,NULL, /*3570*/"SINHALA VOWEL SIGN DIGA GAETTA-PILLA"/* 0DF2 */,/*3571*/"SINHALA VOWEL SIGN DIGA GAYANUKITTA"/* 0DF3 */, /*3572*/"SINHALA PUNCTUATION KUNDDALIYA"/* 0DF4 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*3585*/"THAI CHARACTER KO KAI"/* 0E01 */,/*3586*/"THAI CHARACTER KHO KHAI"/* 0E02 */, /*3587*/"THAI CHARACTER KHO KHUAT"/* 0E03 */,/*3588*/"THAI CHARACTER KHO KHWAI"/* 0E04 */, /*3589*/"THAI CHARACTER KHO KHON"/* 0E05 */,/*3590*/"THAI CHARACTER KHO RAKHANG"/* 0E06 */, /*3591*/"THAI CHARACTER NGO NGU"/* 0E07 */,/*3592*/"THAI CHARACTER CHO CHAN"/* 0E08 */, /*3593*/"THAI CHARACTER CHO CHING"/* 0E09 */,/*3594*/"THAI CHARACTER CHO CHANG"/* 0E0A */, /*3595*/"THAI CHARACTER SO SO"/* 0E0B */,/*3596*/"THAI CHARACTER CHO CHOE"/* 0E0C */, /*3597*/"THAI CHARACTER YO YING"/* 0E0D */,/*3598*/"THAI CHARACTER DO CHADA"/* 0E0E */, /*3599*/"THAI CHARACTER TO PATAK"/* 0E0F */,/*3600*/"THAI CHARACTER THO THAN"/* 0E10 */, /*3601*/"THAI CHARACTER THO NANGMONTHO"/* 0E11 */,/*3602*/"THAI CHARACTER THO PHUTHAO"/* 0E12 */, /*3603*/"THAI CHARACTER NO NEN"/* 0E13 */,/*3604*/"THAI CHARACTER DO DEK"/* 0E14 */, /*3605*/"THAI CHARACTER TO TAO"/* 0E15 */,/*3606*/"THAI CHARACTER THO THUNG"/* 0E16 */, /*3607*/"THAI CHARACTER THO THAHAN"/* 0E17 */,/*3608*/"THAI CHARACTER THO THONG"/* 0E18 */, /*3609*/"THAI CHARACTER NO NU"/* 0E19 */,/*3610*/"THAI CHARACTER BO BAIMAI"/* 0E1A */, /*3611*/"THAI CHARACTER PO PLA"/* 0E1B */,/*3612*/"THAI CHARACTER PHO PHUNG"/* 0E1C */, /*3613*/"THAI CHARACTER FO FA"/* 0E1D */,/*3614*/"THAI CHARACTER PHO PHAN"/* 0E1E */, /*3615*/"THAI CHARACTER FO FAN"/* 0E1F */,/*3616*/"THAI CHARACTER PHO SAMPHAO"/* 0E20 */, /*3617*/"THAI CHARACTER MO MA"/* 0E21 */,/*3618*/"THAI CHARACTER YO YAK"/* 0E22 */, /*3619*/"THAI CHARACTER RO RUA"/* 0E23 */,/*3620*/"THAI CHARACTER RU"/* 0E24 */, /*3621*/"THAI CHARACTER LO LING"/* 0E25 */,/*3622*/"THAI CHARACTER LU"/* 0E26 */, /*3623*/"THAI CHARACTER WO WAEN"/* 0E27 */,/*3624*/"THAI CHARACTER SO SALA"/* 0E28 */, /*3625*/"THAI CHARACTER SO RUSI"/* 0E29 */,/*3626*/"THAI CHARACTER SO SUA"/* 0E2A */, /*3627*/"THAI CHARACTER HO HIP"/* 0E2B */,/*3628*/"THAI CHARACTER LO CHULA"/* 0E2C */, /*3629*/"THAI CHARACTER O ANG"/* 0E2D */,/*3630*/"THAI CHARACTER HO NOKHUK"/* 0E2E */, /*3631*/"THAI CHARACTER PAIYANNOI"/* 0E2F */,/*3632*/"THAI CHARACTER SARA A"/* 0E30 */, /*3633*/"THAI CHARACTER MAI HAN-AKAT"/* 0E31 */,/*3634*/"THAI CHARACTER SARA AA"/* 0E32 */, /*3635*/"THAI CHARACTER SARA AM"/* 0E33 */,/*3636*/"THAI CHARACTER SARA I"/* 0E34 */, /*3637*/"THAI CHARACTER SARA II"/* 0E35 */,/*3638*/"THAI CHARACTER SARA UE"/* 0E36 */, /*3639*/"THAI CHARACTER SARA UEE"/* 0E37 */,/*3640*/"THAI CHARACTER SARA U"/* 0E38 */, /*3641*/"THAI CHARACTER SARA UU"/* 0E39 */,/*3642*/"THAI CHARACTER PHINTHU"/* 0E3A */,NULL,NULL,NULL,NULL, /*3647*/"THAI CURRENCY SYMBOL BAHT"/* 0E3F */,/*3648*/"THAI CHARACTER SARA E"/* 0E40 */, /*3649*/"THAI CHARACTER SARA AE"/* 0E41 */,/*3650*/"THAI CHARACTER SARA O"/* 0E42 */, /*3651*/"THAI CHARACTER SARA AI MAIMUAN"/* 0E43 */,/*3652*/"THAI CHARACTER SARA AI MAIMALAI"/* 0E44 */, /*3653*/"THAI CHARACTER LAKKHANGYAO"/* 0E45 */,/*3654*/"THAI CHARACTER MAIYAMOK"/* 0E46 */, /*3655*/"THAI CHARACTER MAITAIKHU"/* 0E47 */,/*3656*/"THAI CHARACTER MAI EK"/* 0E48 */, /*3657*/"THAI CHARACTER MAI THO"/* 0E49 */,/*3658*/"THAI CHARACTER MAI TRI"/* 0E4A */, /*3659*/"THAI CHARACTER MAI CHATTAWA"/* 0E4B */,/*3660*/"THAI CHARACTER THANTHAKHAT"/* 0E4C */, /*3661*/"THAI CHARACTER NIKHAHIT"/* 0E4D */,/*3662*/"THAI CHARACTER YAMAKKAN"/* 0E4E */, /*3663*/"THAI CHARACTER FONGMAN"/* 0E4F */,/*3664*/"THAI DIGIT ZERO"/* 0E50 */,/*3665*/"THAI DIGIT ONE"/* 0E51 */, /*3666*/"THAI DIGIT TWO"/* 0E52 */,/*3667*/"THAI DIGIT THREE"/* 0E53 */,/*3668*/"THAI DIGIT FOUR"/* 0E54 */, /*3669*/"THAI DIGIT FIVE"/* 0E55 */,/*3670*/"THAI DIGIT SIX"/* 0E56 */,/*3671*/"THAI DIGIT SEVEN"/* 0E57 */, /*3672*/"THAI DIGIT EIGHT"/* 0E58 */,/*3673*/"THAI DIGIT NINE"/* 0E59 */,/*3674*/"THAI CHARACTER ANGKHANKHU"/* 0E5A */, /*3675*/"THAI CHARACTER KHOMUT"/* 0E5B */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*3713*/"LAO LETTER KO"/* 0E81 */,/*3714*/"LAO LETTER KHO SUNG"/* 0E82 */,NULL,/*3716*/"LAO LETTER KHO TAM"/* 0E84 */, NULL,NULL,/*3719*/"LAO LETTER NGO"/* 0E87 */,/*3720*/"LAO LETTER CO"/* 0E88 */,NULL, /*3722*/"LAO LETTER SO TAM"/* 0E8A */,NULL,NULL,/*3725*/"LAO LETTER NYO"/* 0E8D */,NULL,NULL,NULL,NULL,NULL,NULL, /*3732*/"LAO LETTER DO"/* 0E94 */,/*3733*/"LAO LETTER TO"/* 0E95 */,/*3734*/"LAO LETTER THO SUNG"/* 0E96 */, /*3735*/"LAO LETTER THO TAM"/* 0E97 */,NULL,/*3737*/"LAO LETTER NO"/* 0E99 */,/*3738*/"LAO LETTER BO"/* 0E9A */, /*3739*/"LAO LETTER PO"/* 0E9B */,/*3740*/"LAO LETTER PHO SUNG"/* 0E9C */,/*3741*/"LAO LETTER FO TAM"/* 0E9D */, /*3742*/"LAO LETTER PHO TAM"/* 0E9E */,/*3743*/"LAO LETTER FO SUNG"/* 0E9F */,NULL,/*3745*/"LAO LETTER MO"/* 0EA1 */, /*3746*/"LAO LETTER YO"/* 0EA2 */,/*3747*/"LAO LETTER LO LING"/* 0EA3 */,NULL,/*3749*/"LAO LETTER LO LOOT"/* 0EA5 */, NULL,/*3751*/"LAO LETTER WO"/* 0EA7 */,NULL,NULL,/*3754*/"LAO LETTER SO SUNG"/* 0EAA */, /*3755*/"LAO LETTER HO SUNG"/* 0EAB */,NULL,/*3757*/"LAO LETTER O"/* 0EAD */,/*3758*/"LAO LETTER HO TAM"/* 0EAE */, /*3759*/"LAO ELLIPSIS"/* 0EAF */,/*3760*/"LAO VOWEL SIGN A"/* 0EB0 */,/*3761*/"LAO VOWEL SIGN MAI KAN"/* 0EB1 */, /*3762*/"LAO VOWEL SIGN AA"/* 0EB2 */,/*3763*/"LAO VOWEL SIGN AM"/* 0EB3 */,/*3764*/"LAO VOWEL SIGN I"/* 0EB4 */, /*3765*/"LAO VOWEL SIGN II"/* 0EB5 */,/*3766*/"LAO VOWEL SIGN Y"/* 0EB6 */,/*3767*/"LAO VOWEL SIGN YY"/* 0EB7 */, /*3768*/"LAO VOWEL SIGN U"/* 0EB8 */,/*3769*/"LAO VOWEL SIGN UU"/* 0EB9 */,NULL, /*3771*/"LAO VOWEL SIGN MAI KON"/* 0EBB */,/*3772*/"LAO SEMIVOWEL SIGN LO"/* 0EBC */, /*3773*/"LAO SEMIVOWEL SIGN NYO"/* 0EBD */,NULL,NULL,/*3776*/"LAO VOWEL SIGN E"/* 0EC0 */, /*3777*/"LAO VOWEL SIGN EI"/* 0EC1 */,/*3778*/"LAO VOWEL SIGN O"/* 0EC2 */,/*3779*/"LAO VOWEL SIGN AY"/* 0EC3 */, /*3780*/"LAO VOWEL SIGN AI"/* 0EC4 */,NULL,/*3782*/"LAO KO LA"/* 0EC6 */,NULL,/*3784*/"LAO TONE MAI EK"/* 0EC8 */, /*3785*/"LAO TONE MAI THO"/* 0EC9 */,/*3786*/"LAO TONE MAI TI"/* 0ECA */,/*3787*/"LAO TONE MAI CATAWA"/* 0ECB */, /*3788*/"LAO CANCELLATION MARK"/* 0ECC */,/*3789*/"LAO NIGGAHITA"/* 0ECD */,NULL,NULL,/*3792*/"LAO DIGIT ZERO"/* 0ED0 */, /*3793*/"LAO DIGIT ONE"/* 0ED1 */,/*3794*/"LAO DIGIT TWO"/* 0ED2 */,/*3795*/"LAO DIGIT THREE"/* 0ED3 */, /*3796*/"LAO DIGIT FOUR"/* 0ED4 */,/*3797*/"LAO DIGIT FIVE"/* 0ED5 */,/*3798*/"LAO DIGIT SIX"/* 0ED6 */, /*3799*/"LAO DIGIT SEVEN"/* 0ED7 */,/*3800*/"LAO DIGIT EIGHT"/* 0ED8 */,/*3801*/"LAO DIGIT NINE"/* 0ED9 */,NULL,NULL, /*3804*/"LAO HO NO"/* 0EDC */,/*3805*/"LAO HO MO"/* 0EDD */,/*3806*/"LAO LETTER KHMU GO"/* 0EDE */, /*3807*/"LAO LETTER KHMU NYO"/* 0EDF */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*3840*/"TIBETAN SYLLABLE OM"/* 0F00 */, /*3841*/"TIBETAN MARK GTER YIG MGO TRUNCATED A"/* 0F01 */,/*3842*/"TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA"/* 0F02 */, /*3843*/"TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA"/* 0F03 */,/*3844*/"TIBETAN MARK INITIAL YIG MGO MDUN MA"/* 0F04 */, /*3845*/"TIBETAN MARK CLOSING YIG MGO SGAB MA"/* 0F05 */,/*3846*/"TIBETAN MARK CARET YIG MGO PHUR SHAD MA"/* 0F06 */, /*3847*/"TIBETAN MARK YIG MGO TSHEG SHAD MA"/* 0F07 */,/*3848*/"TIBETAN MARK SBRUL SHAD"/* 0F08 */, /*3849*/"TIBETAN MARK BSKUR YIG MGO"/* 0F09 */,/*3850*/"TIBETAN MARK BKA- SHOG YIG MGO"/* 0F0A */, /*3851*/"TIBETAN MARK INTERSYLLABIC TSHEG"/* 0F0B */,/*3852*/"TIBETAN MARK DELIMITER TSHEG BSTAR"/* 0F0C */, /*3853*/"TIBETAN MARK SHAD"/* 0F0D */,/*3854*/"TIBETAN MARK NYIS SHAD"/* 0F0E */, /*3855*/"TIBETAN MARK TSHEG SHAD"/* 0F0F */,/*3856*/"TIBETAN MARK NYIS TSHEG SHAD"/* 0F10 */, /*3857*/"TIBETAN MARK RIN CHEN SPUNGS SHAD"/* 0F11 */,/*3858*/"TIBETAN MARK RGYA GRAM SHAD"/* 0F12 */, /*3859*/"TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN"/* 0F13 */,/*3860*/"TIBETAN MARK GTER TSHEG"/* 0F14 */, /*3861*/"TIBETAN LOGOTYPE SIGN CHAD RTAGS"/* 0F15 */,/*3862*/"TIBETAN LOGOTYPE SIGN LHAG RTAGS"/* 0F16 */, /*3863*/"TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS"/* 0F17 */, /*3864*/"TIBETAN ASTROLOGICAL SIGN -KHYUD PA"/* 0F18 */,/*3865*/"TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS"/* 0F19 */, /*3866*/"TIBETAN SIGN RDEL DKAR GCIG"/* 0F1A */,/*3867*/"TIBETAN SIGN RDEL DKAR GNYIS"/* 0F1B */, /*3868*/"TIBETAN SIGN RDEL DKAR GSUM"/* 0F1C */,/*3869*/"TIBETAN SIGN RDEL NAG GCIG"/* 0F1D */, /*3870*/"TIBETAN SIGN RDEL NAG GNYIS"/* 0F1E */,/*3871*/"TIBETAN SIGN RDEL DKAR RDEL NAG"/* 0F1F */, /*3872*/"TIBETAN DIGIT ZERO"/* 0F20 */,/*3873*/"TIBETAN DIGIT ONE"/* 0F21 */,/*3874*/"TIBETAN DIGIT TWO"/* 0F22 */, /*3875*/"TIBETAN DIGIT THREE"/* 0F23 */,/*3876*/"TIBETAN DIGIT FOUR"/* 0F24 */,/*3877*/"TIBETAN DIGIT FIVE"/* 0F25 */, /*3878*/"TIBETAN DIGIT SIX"/* 0F26 */,/*3879*/"TIBETAN DIGIT SEVEN"/* 0F27 */,/*3880*/"TIBETAN DIGIT EIGHT"/* 0F28 */, /*3881*/"TIBETAN DIGIT NINE"/* 0F29 */,/*3882*/"TIBETAN DIGIT HALF ONE"/* 0F2A */, /*3883*/"TIBETAN DIGIT HALF TWO"/* 0F2B */,/*3884*/"TIBETAN DIGIT HALF THREE"/* 0F2C */, /*3885*/"TIBETAN DIGIT HALF FOUR"/* 0F2D */,/*3886*/"TIBETAN DIGIT HALF FIVE"/* 0F2E */, /*3887*/"TIBETAN DIGIT HALF SIX"/* 0F2F */,/*3888*/"TIBETAN DIGIT HALF SEVEN"/* 0F30 */, /*3889*/"TIBETAN DIGIT HALF EIGHT"/* 0F31 */,/*3890*/"TIBETAN DIGIT HALF NINE"/* 0F32 */, /*3891*/"TIBETAN DIGIT HALF ZERO"/* 0F33 */,/*3892*/"TIBETAN MARK BSDUS RTAGS"/* 0F34 */, /*3893*/"TIBETAN MARK NGAS BZUNG NYI ZLA"/* 0F35 */,/*3894*/"TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN"/* 0F36 */, /*3895*/"TIBETAN MARK NGAS BZUNG SGOR RTAGS"/* 0F37 */,/*3896*/"TIBETAN MARK CHE MGO"/* 0F38 */, /*3897*/"TIBETAN MARK TSA -PHRU"/* 0F39 */,/*3898*/"TIBETAN MARK GUG RTAGS GYON"/* 0F3A */, /*3899*/"TIBETAN MARK GUG RTAGS GYAS"/* 0F3B */,/*3900*/"TIBETAN MARK ANG KHANG GYON"/* 0F3C */, /*3901*/"TIBETAN MARK ANG KHANG GYAS"/* 0F3D */,/*3902*/"TIBETAN SIGN YAR TSHES"/* 0F3E */, /*3903*/"TIBETAN SIGN MAR TSHES"/* 0F3F */,/*3904*/"TIBETAN LETTER KA"/* 0F40 */,/*3905*/"TIBETAN LETTER KHA"/* 0F41 */, /*3906*/"TIBETAN LETTER GA"/* 0F42 */,/*3907*/"TIBETAN LETTER GHA"/* 0F43 */,/*3908*/"TIBETAN LETTER NGA"/* 0F44 */, /*3909*/"TIBETAN LETTER CA"/* 0F45 */,/*3910*/"TIBETAN LETTER CHA"/* 0F46 */,/*3911*/"TIBETAN LETTER JA"/* 0F47 */,NULL, /*3913*/"TIBETAN LETTER NYA"/* 0F49 */,/*3914*/"TIBETAN LETTER TTA"/* 0F4A */,/*3915*/"TIBETAN LETTER TTHA"/* 0F4B */, /*3916*/"TIBETAN LETTER DDA"/* 0F4C */,/*3917*/"TIBETAN LETTER DDHA"/* 0F4D */,/*3918*/"TIBETAN LETTER NNA"/* 0F4E */, /*3919*/"TIBETAN LETTER TA"/* 0F4F */,/*3920*/"TIBETAN LETTER THA"/* 0F50 */,/*3921*/"TIBETAN LETTER DA"/* 0F51 */, /*3922*/"TIBETAN LETTER DHA"/* 0F52 */,/*3923*/"TIBETAN LETTER NA"/* 0F53 */,/*3924*/"TIBETAN LETTER PA"/* 0F54 */, /*3925*/"TIBETAN LETTER PHA"/* 0F55 */,/*3926*/"TIBETAN LETTER BA"/* 0F56 */,/*3927*/"TIBETAN LETTER BHA"/* 0F57 */, /*3928*/"TIBETAN LETTER MA"/* 0F58 */,/*3929*/"TIBETAN LETTER TSA"/* 0F59 */,/*3930*/"TIBETAN LETTER TSHA"/* 0F5A */, /*3931*/"TIBETAN LETTER DZA"/* 0F5B */,/*3932*/"TIBETAN LETTER DZHA"/* 0F5C */,/*3933*/"TIBETAN LETTER WA"/* 0F5D */, /*3934*/"TIBETAN LETTER ZHA"/* 0F5E */,/*3935*/"TIBETAN LETTER ZA"/* 0F5F */,/*3936*/"TIBETAN LETTER -A"/* 0F60 */, /*3937*/"TIBETAN LETTER YA"/* 0F61 */,/*3938*/"TIBETAN LETTER RA"/* 0F62 */,/*3939*/"TIBETAN LETTER LA"/* 0F63 */, /*3940*/"TIBETAN LETTER SHA"/* 0F64 */,/*3941*/"TIBETAN LETTER SSA"/* 0F65 */,/*3942*/"TIBETAN LETTER SA"/* 0F66 */, /*3943*/"TIBETAN LETTER HA"/* 0F67 */,/*3944*/"TIBETAN LETTER A"/* 0F68 */,/*3945*/"TIBETAN LETTER KSSA"/* 0F69 */, /*3946*/"TIBETAN LETTER FIXED-FORM RA"/* 0F6A */,/*3947*/"TIBETAN LETTER KKA"/* 0F6B */, /*3948*/"TIBETAN LETTER RRA"/* 0F6C */,NULL,NULL,NULL,NULL,/*3953*/"TIBETAN VOWEL SIGN AA"/* 0F71 */, /*3954*/"TIBETAN VOWEL SIGN I"/* 0F72 */,/*3955*/"TIBETAN VOWEL SIGN II"/* 0F73 */, /*3956*/"TIBETAN VOWEL SIGN U"/* 0F74 */,/*3957*/"TIBETAN VOWEL SIGN UU"/* 0F75 */, /*3958*/"TIBETAN VOWEL SIGN VOCALIC R"/* 0F76 */,/*3959*/"TIBETAN VOWEL SIGN VOCALIC RR"/* 0F77 */, /*3960*/"TIBETAN VOWEL SIGN VOCALIC L"/* 0F78 */,/*3961*/"TIBETAN VOWEL SIGN VOCALIC LL"/* 0F79 */, /*3962*/"TIBETAN VOWEL SIGN E"/* 0F7A */,/*3963*/"TIBETAN VOWEL SIGN EE"/* 0F7B */, /*3964*/"TIBETAN VOWEL SIGN O"/* 0F7C */,/*3965*/"TIBETAN VOWEL SIGN OO"/* 0F7D */, /*3966*/"TIBETAN SIGN RJES SU NGA RO"/* 0F7E */,/*3967*/"TIBETAN SIGN RNAM BCAD"/* 0F7F */, /*3968*/"TIBETAN VOWEL SIGN REVERSED I"/* 0F80 */,/*3969*/"TIBETAN VOWEL SIGN REVERSED II"/* 0F81 */, /*3970*/"TIBETAN SIGN NYI ZLA NAA DA"/* 0F82 */,/*3971*/"TIBETAN SIGN SNA LDAN"/* 0F83 */, /*3972*/"TIBETAN MARK HALANTA"/* 0F84 */,/*3973*/"TIBETAN MARK PALUTA"/* 0F85 */, /*3974*/"TIBETAN SIGN LCI RTAGS"/* 0F86 */,/*3975*/"TIBETAN SIGN YANG RTAGS"/* 0F87 */, /*3976*/"TIBETAN SIGN LCE TSA CAN"/* 0F88 */,/*3977*/"TIBETAN SIGN MCHU CAN"/* 0F89 */, /*3978*/"TIBETAN SIGN GRU CAN RGYINGS"/* 0F8A */,/*3979*/"TIBETAN SIGN GRU MED RGYINGS"/* 0F8B */, /*3980*/"TIBETAN SIGN INVERTED MCHU CAN"/* 0F8C */,/*3981*/"TIBETAN SUBJOINED SIGN LCE TSA CAN"/* 0F8D */, /*3982*/"TIBETAN SUBJOINED SIGN MCHU CAN"/* 0F8E */,/*3983*/"TIBETAN SUBJOINED SIGN INVERTED MCHU CAN"/* 0F8F */, /*3984*/"TIBETAN SUBJOINED LETTER KA"/* 0F90 */,/*3985*/"TIBETAN SUBJOINED LETTER KHA"/* 0F91 */, /*3986*/"TIBETAN SUBJOINED LETTER GA"/* 0F92 */,/*3987*/"TIBETAN SUBJOINED LETTER GHA"/* 0F93 */, /*3988*/"TIBETAN SUBJOINED LETTER NGA"/* 0F94 */,/*3989*/"TIBETAN SUBJOINED LETTER CA"/* 0F95 */, /*3990*/"TIBETAN SUBJOINED LETTER CHA"/* 0F96 */,/*3991*/"TIBETAN SUBJOINED LETTER JA"/* 0F97 */,NULL, /*3993*/"TIBETAN SUBJOINED LETTER NYA"/* 0F99 */,/*3994*/"TIBETAN SUBJOINED LETTER TTA"/* 0F9A */, /*3995*/"TIBETAN SUBJOINED LETTER TTHA"/* 0F9B */,/*3996*/"TIBETAN SUBJOINED LETTER DDA"/* 0F9C */, /*3997*/"TIBETAN SUBJOINED LETTER DDHA"/* 0F9D */,/*3998*/"TIBETAN SUBJOINED LETTER NNA"/* 0F9E */, /*3999*/"TIBETAN SUBJOINED LETTER TA"/* 0F9F */,/*4000*/"TIBETAN SUBJOINED LETTER THA"/* 0FA0 */, /*4001*/"TIBETAN SUBJOINED LETTER DA"/* 0FA1 */,/*4002*/"TIBETAN SUBJOINED LETTER DHA"/* 0FA2 */, /*4003*/"TIBETAN SUBJOINED LETTER NA"/* 0FA3 */,/*4004*/"TIBETAN SUBJOINED LETTER PA"/* 0FA4 */, /*4005*/"TIBETAN SUBJOINED LETTER PHA"/* 0FA5 */,/*4006*/"TIBETAN SUBJOINED LETTER BA"/* 0FA6 */, /*4007*/"TIBETAN SUBJOINED LETTER BHA"/* 0FA7 */,/*4008*/"TIBETAN SUBJOINED LETTER MA"/* 0FA8 */, /*4009*/"TIBETAN SUBJOINED LETTER TSA"/* 0FA9 */,/*4010*/"TIBETAN SUBJOINED LETTER TSHA"/* 0FAA */, /*4011*/"TIBETAN SUBJOINED LETTER DZA"/* 0FAB */,/*4012*/"TIBETAN SUBJOINED LETTER DZHA"/* 0FAC */, /*4013*/"TIBETAN SUBJOINED LETTER WA"/* 0FAD */,/*4014*/"TIBETAN SUBJOINED LETTER ZHA"/* 0FAE */, /*4015*/"TIBETAN SUBJOINED LETTER ZA"/* 0FAF */,/*4016*/"TIBETAN SUBJOINED LETTER -A"/* 0FB0 */, /*4017*/"TIBETAN SUBJOINED LETTER YA"/* 0FB1 */,/*4018*/"TIBETAN SUBJOINED LETTER RA"/* 0FB2 */, /*4019*/"TIBETAN SUBJOINED LETTER LA"/* 0FB3 */,/*4020*/"TIBETAN SUBJOINED LETTER SHA"/* 0FB4 */, /*4021*/"TIBETAN SUBJOINED LETTER SSA"/* 0FB5 */,/*4022*/"TIBETAN SUBJOINED LETTER SA"/* 0FB6 */, /*4023*/"TIBETAN SUBJOINED LETTER HA"/* 0FB7 */,/*4024*/"TIBETAN SUBJOINED LETTER A"/* 0FB8 */, /*4025*/"TIBETAN SUBJOINED LETTER KSSA"/* 0FB9 */,/*4026*/"TIBETAN SUBJOINED LETTER FIXED-FORM WA"/* 0FBA */, /*4027*/"TIBETAN SUBJOINED LETTER FIXED-FORM YA"/* 0FBB */,/*4028*/"TIBETAN SUBJOINED LETTER FIXED-FORM RA"/* 0FBC */, NULL,/*4030*/"TIBETAN KU RU KHA"/* 0FBE */,/*4031*/"TIBETAN KU RU KHA BZHI MIG CAN"/* 0FBF */, /*4032*/"TIBETAN CANTILLATION SIGN HEAVY BEAT"/* 0FC0 */,/*4033*/"TIBETAN CANTILLATION SIGN LIGHT BEAT"/* 0FC1 */, /*4034*/"TIBETAN CANTILLATION SIGN CANG TE-U"/* 0FC2 */,/*4035*/"TIBETAN CANTILLATION SIGN SBUB -CHAL"/* 0FC3 */, /*4036*/"TIBETAN SYMBOL DRIL BU"/* 0FC4 */,/*4037*/"TIBETAN SYMBOL RDO RJE"/* 0FC5 */, /*4038*/"TIBETAN SYMBOL PADMA GDAN"/* 0FC6 */,/*4039*/"TIBETAN SYMBOL RDO RJE RGYA GRAM"/* 0FC7 */, /*4040*/"TIBETAN SYMBOL PHUR PA"/* 0FC8 */,/*4041*/"TIBETAN SYMBOL NOR BU"/* 0FC9 */, /*4042*/"TIBETAN SYMBOL NOR BU NYIS -KHYIL"/* 0FCA */,/*4043*/"TIBETAN SYMBOL NOR BU GSUM -KHYIL"/* 0FCB */, /*4044*/"TIBETAN SYMBOL NOR BU BZHI -KHYIL"/* 0FCC */,NULL,/*4046*/"TIBETAN SIGN RDEL NAG RDEL DKAR"/* 0FCE */, /*4047*/"TIBETAN SIGN RDEL NAG GSUM"/* 0FCF */,/*4048*/"TIBETAN MARK BSKA- SHOG GI MGO RGYAN"/* 0FD0 */, /*4049*/"TIBETAN MARK MNYAM YIG GI MGO RGYAN"/* 0FD1 */,/*4050*/"TIBETAN MARK NYIS TSHEG"/* 0FD2 */, /*4051*/"TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA"/* 0FD3 */, /*4052*/"TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA"/* 0FD4 */,/*4053*/"RIGHT-FACING SVASTI SIGN"/* 0FD5 */, /*4054*/"LEFT-FACING SVASTI SIGN"/* 0FD6 */,/*4055*/"RIGHT-FACING SVASTI SIGN WITH DOTS"/* 0FD7 */, /*4056*/"LEFT-FACING SVASTI SIGN WITH DOTS"/* 0FD8 */,/*4057*/"TIBETAN MARK LEADING MCHAN RTAGS"/* 0FD9 */, /*4058*/"TIBETAN MARK TRAILING MCHAN RTAGS"/* 0FDA */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*4096*/"MYANMAR LETTER KA"/* 1000 */,/*4097*/"MYANMAR LETTER KHA"/* 1001 */,/*4098*/"MYANMAR LETTER GA"/* 1002 */, /*4099*/"MYANMAR LETTER GHA"/* 1003 */,/*4100*/"MYANMAR LETTER NGA"/* 1004 */,/*4101*/"MYANMAR LETTER CA"/* 1005 */, /*4102*/"MYANMAR LETTER CHA"/* 1006 */,/*4103*/"MYANMAR LETTER JA"/* 1007 */,/*4104*/"MYANMAR LETTER JHA"/* 1008 */, /*4105*/"MYANMAR LETTER NYA"/* 1009 */,/*4106*/"MYANMAR LETTER NNYA"/* 100A */,/*4107*/"MYANMAR LETTER TTA"/* 100B */, /*4108*/"MYANMAR LETTER TTHA"/* 100C */,/*4109*/"MYANMAR LETTER DDA"/* 100D */,/*4110*/"MYANMAR LETTER DDHA"/* 100E */, /*4111*/"MYANMAR LETTER NNA"/* 100F */,/*4112*/"MYANMAR LETTER TA"/* 1010 */,/*4113*/"MYANMAR LETTER THA"/* 1011 */, /*4114*/"MYANMAR LETTER DA"/* 1012 */,/*4115*/"MYANMAR LETTER DHA"/* 1013 */,/*4116*/"MYANMAR LETTER NA"/* 1014 */, /*4117*/"MYANMAR LETTER PA"/* 1015 */,/*4118*/"MYANMAR LETTER PHA"/* 1016 */,/*4119*/"MYANMAR LETTER BA"/* 1017 */, /*4120*/"MYANMAR LETTER BHA"/* 1018 */,/*4121*/"MYANMAR LETTER MA"/* 1019 */,/*4122*/"MYANMAR LETTER YA"/* 101A */, /*4123*/"MYANMAR LETTER RA"/* 101B */,/*4124*/"MYANMAR LETTER LA"/* 101C */,/*4125*/"MYANMAR LETTER WA"/* 101D */, /*4126*/"MYANMAR LETTER SA"/* 101E */,/*4127*/"MYANMAR LETTER HA"/* 101F */,/*4128*/"MYANMAR LETTER LLA"/* 1020 */, /*4129*/"MYANMAR LETTER A"/* 1021 */,/*4130*/"MYANMAR LETTER SHAN A"/* 1022 */,/*4131*/"MYANMAR LETTER I"/* 1023 */, /*4132*/"MYANMAR LETTER II"/* 1024 */,/*4133*/"MYANMAR LETTER U"/* 1025 */,/*4134*/"MYANMAR LETTER UU"/* 1026 */, /*4135*/"MYANMAR LETTER E"/* 1027 */,/*4136*/"MYANMAR LETTER MON E"/* 1028 */,/*4137*/"MYANMAR LETTER O"/* 1029 */, /*4138*/"MYANMAR LETTER AU"/* 102A */,/*4139*/"MYANMAR VOWEL SIGN TALL AA"/* 102B */, /*4140*/"MYANMAR VOWEL SIGN AA"/* 102C */,/*4141*/"MYANMAR VOWEL SIGN I"/* 102D */, /*4142*/"MYANMAR VOWEL SIGN II"/* 102E */,/*4143*/"MYANMAR VOWEL SIGN U"/* 102F */, /*4144*/"MYANMAR VOWEL SIGN UU"/* 1030 */,/*4145*/"MYANMAR VOWEL SIGN E"/* 1031 */, /*4146*/"MYANMAR VOWEL SIGN AI"/* 1032 */,/*4147*/"MYANMAR VOWEL SIGN MON II"/* 1033 */, /*4148*/"MYANMAR VOWEL SIGN MON O"/* 1034 */,/*4149*/"MYANMAR VOWEL SIGN E ABOVE"/* 1035 */, /*4150*/"MYANMAR SIGN ANUSVARA"/* 1036 */,/*4151*/"MYANMAR SIGN DOT BELOW"/* 1037 */, /*4152*/"MYANMAR SIGN VISARGA"/* 1038 */,/*4153*/"MYANMAR SIGN VIRAMA"/* 1039 */,/*4154*/"MYANMAR SIGN ASAT"/* 103A */, /*4155*/"MYANMAR CONSONANT SIGN MEDIAL YA"/* 103B */,/*4156*/"MYANMAR CONSONANT SIGN MEDIAL RA"/* 103C */, /*4157*/"MYANMAR CONSONANT SIGN MEDIAL WA"/* 103D */,/*4158*/"MYANMAR CONSONANT SIGN MEDIAL HA"/* 103E */, /*4159*/"MYANMAR LETTER GREAT SA"/* 103F */,/*4160*/"MYANMAR DIGIT ZERO"/* 1040 */,/*4161*/"MYANMAR DIGIT ONE"/* 1041 */, /*4162*/"MYANMAR DIGIT TWO"/* 1042 */,/*4163*/"MYANMAR DIGIT THREE"/* 1043 */,/*4164*/"MYANMAR DIGIT FOUR"/* 1044 */, /*4165*/"MYANMAR DIGIT FIVE"/* 1045 */,/*4166*/"MYANMAR DIGIT SIX"/* 1046 */,/*4167*/"MYANMAR DIGIT SEVEN"/* 1047 */, /*4168*/"MYANMAR DIGIT EIGHT"/* 1048 */,/*4169*/"MYANMAR DIGIT NINE"/* 1049 */, /*4170*/"MYANMAR SIGN LITTLE SECTION"/* 104A */,/*4171*/"MYANMAR SIGN SECTION"/* 104B */, /*4172*/"MYANMAR SYMBOL LOCATIVE"/* 104C */,/*4173*/"MYANMAR SYMBOL COMPLETED"/* 104D */, /*4174*/"MYANMAR SYMBOL AFOREMENTIONED"/* 104E */,/*4175*/"MYANMAR SYMBOL GENITIVE"/* 104F */, /*4176*/"MYANMAR LETTER SHA"/* 1050 */,/*4177*/"MYANMAR LETTER SSA"/* 1051 */, /*4178*/"MYANMAR LETTER VOCALIC R"/* 1052 */,/*4179*/"MYANMAR LETTER VOCALIC RR"/* 1053 */, /*4180*/"MYANMAR LETTER VOCALIC L"/* 1054 */,/*4181*/"MYANMAR LETTER VOCALIC LL"/* 1055 */, /*4182*/"MYANMAR VOWEL SIGN VOCALIC R"/* 1056 */,/*4183*/"MYANMAR VOWEL SIGN VOCALIC RR"/* 1057 */, /*4184*/"MYANMAR VOWEL SIGN VOCALIC L"/* 1058 */,/*4185*/"MYANMAR VOWEL SIGN VOCALIC LL"/* 1059 */, /*4186*/"MYANMAR LETTER MON NGA"/* 105A */,/*4187*/"MYANMAR LETTER MON JHA"/* 105B */, /*4188*/"MYANMAR LETTER MON BBA"/* 105C */,/*4189*/"MYANMAR LETTER MON BBE"/* 105D */, /*4190*/"MYANMAR CONSONANT SIGN MON MEDIAL NA"/* 105E */,/*4191*/"MYANMAR CONSONANT SIGN MON MEDIAL MA"/* 105F */, /*4192*/"MYANMAR CONSONANT SIGN MON MEDIAL LA"/* 1060 */,/*4193*/"MYANMAR LETTER SGAW KAREN SHA"/* 1061 */, /*4194*/"MYANMAR VOWEL SIGN SGAW KAREN EU"/* 1062 */,/*4195*/"MYANMAR TONE MARK SGAW KAREN HATHI"/* 1063 */, /*4196*/"MYANMAR TONE MARK SGAW KAREN KE PHO"/* 1064 */,/*4197*/"MYANMAR LETTER WESTERN PWO KAREN THA"/* 1065 */, /*4198*/"MYANMAR LETTER WESTERN PWO KAREN PWA"/* 1066 */,/*4199*/"MYANMAR VOWEL SIGN WESTERN PWO KAREN EU"/* 1067 */, /*4200*/"MYANMAR VOWEL SIGN WESTERN PWO KAREN UE"/* 1068 */,/*4201*/"MYANMAR SIGN WESTERN PWO KAREN TONE-1"/* 1069 */, /*4202*/"MYANMAR SIGN WESTERN PWO KAREN TONE-2"/* 106A */,/*4203*/"MYANMAR SIGN WESTERN PWO KAREN TONE-3"/* 106B */, /*4204*/"MYANMAR SIGN WESTERN PWO KAREN TONE-4"/* 106C */,/*4205*/"MYANMAR SIGN WESTERN PWO KAREN TONE-5"/* 106D */, /*4206*/"MYANMAR LETTER EASTERN PWO KAREN NNA"/* 106E */,/*4207*/"MYANMAR LETTER EASTERN PWO KAREN YWA"/* 106F */, /*4208*/"MYANMAR LETTER EASTERN PWO KAREN GHWA"/* 1070 */,/*4209*/"MYANMAR VOWEL SIGN GEBA KAREN I"/* 1071 */, /*4210*/"MYANMAR VOWEL SIGN KAYAH OE"/* 1072 */,/*4211*/"MYANMAR VOWEL SIGN KAYAH U"/* 1073 */, /*4212*/"MYANMAR VOWEL SIGN KAYAH EE"/* 1074 */,/*4213*/"MYANMAR LETTER SHAN KA"/* 1075 */, /*4214*/"MYANMAR LETTER SHAN KHA"/* 1076 */,/*4215*/"MYANMAR LETTER SHAN GA"/* 1077 */, /*4216*/"MYANMAR LETTER SHAN CA"/* 1078 */,/*4217*/"MYANMAR LETTER SHAN ZA"/* 1079 */, /*4218*/"MYANMAR LETTER SHAN NYA"/* 107A */,/*4219*/"MYANMAR LETTER SHAN DA"/* 107B */, /*4220*/"MYANMAR LETTER SHAN NA"/* 107C */,/*4221*/"MYANMAR LETTER SHAN PHA"/* 107D */, /*4222*/"MYANMAR LETTER SHAN FA"/* 107E */,/*4223*/"MYANMAR LETTER SHAN BA"/* 107F */, /*4224*/"MYANMAR LETTER SHAN THA"/* 1080 */,/*4225*/"MYANMAR LETTER SHAN HA"/* 1081 */, /*4226*/"MYANMAR CONSONANT SIGN SHAN MEDIAL WA"/* 1082 */,/*4227*/"MYANMAR VOWEL SIGN SHAN AA"/* 1083 */, /*4228*/"MYANMAR VOWEL SIGN SHAN E"/* 1084 */,/*4229*/"MYANMAR VOWEL SIGN SHAN E ABOVE"/* 1085 */, /*4230*/"MYANMAR VOWEL SIGN SHAN FINAL Y"/* 1086 */,/*4231*/"MYANMAR SIGN SHAN TONE-2"/* 1087 */, /*4232*/"MYANMAR SIGN SHAN TONE-3"/* 1088 */,/*4233*/"MYANMAR SIGN SHAN TONE-5"/* 1089 */, /*4234*/"MYANMAR SIGN SHAN TONE-6"/* 108A */,/*4235*/"MYANMAR SIGN SHAN COUNCIL TONE-2"/* 108B */, /*4236*/"MYANMAR SIGN SHAN COUNCIL TONE-3"/* 108C */,/*4237*/"MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE"/* 108D */, /*4238*/"MYANMAR LETTER RUMAI PALAUNG FA"/* 108E */,/*4239*/"MYANMAR SIGN RUMAI PALAUNG TONE-5"/* 108F */, /*4240*/"MYANMAR SHAN DIGIT ZERO"/* 1090 */,/*4241*/"MYANMAR SHAN DIGIT ONE"/* 1091 */, /*4242*/"MYANMAR SHAN DIGIT TWO"/* 1092 */,/*4243*/"MYANMAR SHAN DIGIT THREE"/* 1093 */, /*4244*/"MYANMAR SHAN DIGIT FOUR"/* 1094 */,/*4245*/"MYANMAR SHAN DIGIT FIVE"/* 1095 */, /*4246*/"MYANMAR SHAN DIGIT SIX"/* 1096 */,/*4247*/"MYANMAR SHAN DIGIT SEVEN"/* 1097 */, /*4248*/"MYANMAR SHAN DIGIT EIGHT"/* 1098 */,/*4249*/"MYANMAR SHAN DIGIT NINE"/* 1099 */, /*4250*/"MYANMAR SIGN KHAMTI TONE-1"/* 109A */,/*4251*/"MYANMAR SIGN KHAMTI TONE-3"/* 109B */, /*4252*/"MYANMAR VOWEL SIGN AITON A"/* 109C */,/*4253*/"MYANMAR VOWEL SIGN AITON AI"/* 109D */, /*4254*/"MYANMAR SYMBOL SHAN ONE"/* 109E */,/*4255*/"MYANMAR SYMBOL SHAN EXCLAMATION"/* 109F */, /*4256*/"GEORGIAN CAPITAL LETTER AN"/* 10A0 */,/*4257*/"GEORGIAN CAPITAL LETTER BAN"/* 10A1 */, /*4258*/"GEORGIAN CAPITAL LETTER GAN"/* 10A2 */,/*4259*/"GEORGIAN CAPITAL LETTER DON"/* 10A3 */, /*4260*/"GEORGIAN CAPITAL LETTER EN"/* 10A4 */,/*4261*/"GEORGIAN CAPITAL LETTER VIN"/* 10A5 */, /*4262*/"GEORGIAN CAPITAL LETTER ZEN"/* 10A6 */,/*4263*/"GEORGIAN CAPITAL LETTER TAN"/* 10A7 */, /*4264*/"GEORGIAN CAPITAL LETTER IN"/* 10A8 */,/*4265*/"GEORGIAN CAPITAL LETTER KAN"/* 10A9 */, /*4266*/"GEORGIAN CAPITAL LETTER LAS"/* 10AA */,/*4267*/"GEORGIAN CAPITAL LETTER MAN"/* 10AB */, /*4268*/"GEORGIAN CAPITAL LETTER NAR"/* 10AC */,/*4269*/"GEORGIAN CAPITAL LETTER ON"/* 10AD */, /*4270*/"GEORGIAN CAPITAL LETTER PAR"/* 10AE */,/*4271*/"GEORGIAN CAPITAL LETTER ZHAR"/* 10AF */, /*4272*/"GEORGIAN CAPITAL LETTER RAE"/* 10B0 */,/*4273*/"GEORGIAN CAPITAL LETTER SAN"/* 10B1 */, /*4274*/"GEORGIAN CAPITAL LETTER TAR"/* 10B2 */,/*4275*/"GEORGIAN CAPITAL LETTER UN"/* 10B3 */, /*4276*/"GEORGIAN CAPITAL LETTER PHAR"/* 10B4 */,/*4277*/"GEORGIAN CAPITAL LETTER KHAR"/* 10B5 */, /*4278*/"GEORGIAN CAPITAL LETTER GHAN"/* 10B6 */,/*4279*/"GEORGIAN CAPITAL LETTER QAR"/* 10B7 */, /*4280*/"GEORGIAN CAPITAL LETTER SHIN"/* 10B8 */,/*4281*/"GEORGIAN CAPITAL LETTER CHIN"/* 10B9 */, /*4282*/"GEORGIAN CAPITAL LETTER CAN"/* 10BA */,/*4283*/"GEORGIAN CAPITAL LETTER JIL"/* 10BB */, /*4284*/"GEORGIAN CAPITAL LETTER CIL"/* 10BC */,/*4285*/"GEORGIAN CAPITAL LETTER CHAR"/* 10BD */, /*4286*/"GEORGIAN CAPITAL LETTER XAN"/* 10BE */,/*4287*/"GEORGIAN CAPITAL LETTER JHAN"/* 10BF */, /*4288*/"GEORGIAN CAPITAL LETTER HAE"/* 10C0 */,/*4289*/"GEORGIAN CAPITAL LETTER HE"/* 10C1 */, /*4290*/"GEORGIAN CAPITAL LETTER HIE"/* 10C2 */,/*4291*/"GEORGIAN CAPITAL LETTER WE"/* 10C3 */, /*4292*/"GEORGIAN CAPITAL LETTER HAR"/* 10C4 */,/*4293*/"GEORGIAN CAPITAL LETTER HOE"/* 10C5 */,NULL, /*4295*/"GEORGIAN CAPITAL LETTER YN"/* 10C7 */,NULL,NULL,NULL,NULL,NULL,/*4301*/"GEORGIAN CAPITAL LETTER AEN"/* 10CD */, NULL,NULL,/*4304*/"GEORGIAN LETTER AN"/* 10D0 */,/*4305*/"GEORGIAN LETTER BAN"/* 10D1 */, /*4306*/"GEORGIAN LETTER GAN"/* 10D2 */,/*4307*/"GEORGIAN LETTER DON"/* 10D3 */,/*4308*/"GEORGIAN LETTER EN"/* 10D4 */, /*4309*/"GEORGIAN LETTER VIN"/* 10D5 */,/*4310*/"GEORGIAN LETTER ZEN"/* 10D6 */,/*4311*/"GEORGIAN LETTER TAN"/* 10D7 */, /*4312*/"GEORGIAN LETTER IN"/* 10D8 */,/*4313*/"GEORGIAN LETTER KAN"/* 10D9 */,/*4314*/"GEORGIAN LETTER LAS"/* 10DA */, /*4315*/"GEORGIAN LETTER MAN"/* 10DB */,/*4316*/"GEORGIAN LETTER NAR"/* 10DC */,/*4317*/"GEORGIAN LETTER ON"/* 10DD */, /*4318*/"GEORGIAN LETTER PAR"/* 10DE */,/*4319*/"GEORGIAN LETTER ZHAR"/* 10DF */,/*4320*/"GEORGIAN LETTER RAE"/* 10E0 */, /*4321*/"GEORGIAN LETTER SAN"/* 10E1 */,/*4322*/"GEORGIAN LETTER TAR"/* 10E2 */,/*4323*/"GEORGIAN LETTER UN"/* 10E3 */, /*4324*/"GEORGIAN LETTER PHAR"/* 10E4 */,/*4325*/"GEORGIAN LETTER KHAR"/* 10E5 */, /*4326*/"GEORGIAN LETTER GHAN"/* 10E6 */,/*4327*/"GEORGIAN LETTER QAR"/* 10E7 */, /*4328*/"GEORGIAN LETTER SHIN"/* 10E8 */,/*4329*/"GEORGIAN LETTER CHIN"/* 10E9 */, /*4330*/"GEORGIAN LETTER CAN"/* 10EA */,/*4331*/"GEORGIAN LETTER JIL"/* 10EB */,/*4332*/"GEORGIAN LETTER CIL"/* 10EC */, /*4333*/"GEORGIAN LETTER CHAR"/* 10ED */,/*4334*/"GEORGIAN LETTER XAN"/* 10EE */, /*4335*/"GEORGIAN LETTER JHAN"/* 10EF */,/*4336*/"GEORGIAN LETTER HAE"/* 10F0 */,/*4337*/"GEORGIAN LETTER HE"/* 10F1 */, /*4338*/"GEORGIAN LETTER HIE"/* 10F2 */,/*4339*/"GEORGIAN LETTER WE"/* 10F3 */,/*4340*/"GEORGIAN LETTER HAR"/* 10F4 */, /*4341*/"GEORGIAN LETTER HOE"/* 10F5 */,/*4342*/"GEORGIAN LETTER FI"/* 10F6 */,/*4343*/"GEORGIAN LETTER YN"/* 10F7 */, /*4344*/"GEORGIAN LETTER ELIFI"/* 10F8 */,/*4345*/"GEORGIAN LETTER TURNED GAN"/* 10F9 */, /*4346*/"GEORGIAN LETTER AIN"/* 10FA */,/*4347*/"GEORGIAN PARAGRAPH SEPARATOR"/* 10FB */, /*4348*/"MODIFIER LETTER GEORGIAN NAR"/* 10FC */,/*4349*/"GEORGIAN LETTER AEN"/* 10FD */, /*4350*/"GEORGIAN LETTER HARD SIGN"/* 10FE */,/*4351*/"GEORGIAN LETTER LABIAL SIGN"/* 10FF */, /*4352*/"HANGUL CHOSEONG KIYEOK"/* 1100 */,/*4353*/"HANGUL CHOSEONG SSANGKIYEOK"/* 1101 */, /*4354*/"HANGUL CHOSEONG NIEUN"/* 1102 */,/*4355*/"HANGUL CHOSEONG TIKEUT"/* 1103 */, /*4356*/"HANGUL CHOSEONG SSANGTIKEUT"/* 1104 */,/*4357*/"HANGUL CHOSEONG RIEUL"/* 1105 */, /*4358*/"HANGUL CHOSEONG MIEUM"/* 1106 */,/*4359*/"HANGUL CHOSEONG PIEUP"/* 1107 */, /*4360*/"HANGUL CHOSEONG SSANGPIEUP"/* 1108 */,/*4361*/"HANGUL CHOSEONG SIOS"/* 1109 */, /*4362*/"HANGUL CHOSEONG SSANGSIOS"/* 110A */,/*4363*/"HANGUL CHOSEONG IEUNG"/* 110B */, /*4364*/"HANGUL CHOSEONG CIEUC"/* 110C */,/*4365*/"HANGUL CHOSEONG SSANGCIEUC"/* 110D */, /*4366*/"HANGUL CHOSEONG CHIEUCH"/* 110E */,/*4367*/"HANGUL CHOSEONG KHIEUKH"/* 110F */, /*4368*/"HANGUL CHOSEONG THIEUTH"/* 1110 */,/*4369*/"HANGUL CHOSEONG PHIEUPH"/* 1111 */, /*4370*/"HANGUL CHOSEONG HIEUH"/* 1112 */,/*4371*/"HANGUL CHOSEONG NIEUN-KIYEOK"/* 1113 */, /*4372*/"HANGUL CHOSEONG SSANGNIEUN"/* 1114 */,/*4373*/"HANGUL CHOSEONG NIEUN-TIKEUT"/* 1115 */, /*4374*/"HANGUL CHOSEONG NIEUN-PIEUP"/* 1116 */,/*4375*/"HANGUL CHOSEONG TIKEUT-KIYEOK"/* 1117 */, /*4376*/"HANGUL CHOSEONG RIEUL-NIEUN"/* 1118 */,/*4377*/"HANGUL CHOSEONG SSANGRIEUL"/* 1119 */, /*4378*/"HANGUL CHOSEONG RIEUL-HIEUH"/* 111A */,/*4379*/"HANGUL CHOSEONG KAPYEOUNRIEUL"/* 111B */, /*4380*/"HANGUL CHOSEONG MIEUM-PIEUP"/* 111C */,/*4381*/"HANGUL CHOSEONG KAPYEOUNMIEUM"/* 111D */, /*4382*/"HANGUL CHOSEONG PIEUP-KIYEOK"/* 111E */,/*4383*/"HANGUL CHOSEONG PIEUP-NIEUN"/* 111F */, /*4384*/"HANGUL CHOSEONG PIEUP-TIKEUT"/* 1120 */,/*4385*/"HANGUL CHOSEONG PIEUP-SIOS"/* 1121 */, /*4386*/"HANGUL CHOSEONG PIEUP-SIOS-KIYEOK"/* 1122 */,/*4387*/"HANGUL CHOSEONG PIEUP-SIOS-TIKEUT"/* 1123 */, /*4388*/"HANGUL CHOSEONG PIEUP-SIOS-PIEUP"/* 1124 */,/*4389*/"HANGUL CHOSEONG PIEUP-SSANGSIOS"/* 1125 */, /*4390*/"HANGUL CHOSEONG PIEUP-SIOS-CIEUC"/* 1126 */,/*4391*/"HANGUL CHOSEONG PIEUP-CIEUC"/* 1127 */, /*4392*/"HANGUL CHOSEONG PIEUP-CHIEUCH"/* 1128 */,/*4393*/"HANGUL CHOSEONG PIEUP-THIEUTH"/* 1129 */, /*4394*/"HANGUL CHOSEONG PIEUP-PHIEUPH"/* 112A */,/*4395*/"HANGUL CHOSEONG KAPYEOUNPIEUP"/* 112B */, /*4396*/"HANGUL CHOSEONG KAPYEOUNSSANGPIEUP"/* 112C */,/*4397*/"HANGUL CHOSEONG SIOS-KIYEOK"/* 112D */, /*4398*/"HANGUL CHOSEONG SIOS-NIEUN"/* 112E */,/*4399*/"HANGUL CHOSEONG SIOS-TIKEUT"/* 112F */, /*4400*/"HANGUL CHOSEONG SIOS-RIEUL"/* 1130 */,/*4401*/"HANGUL CHOSEONG SIOS-MIEUM"/* 1131 */, /*4402*/"HANGUL CHOSEONG SIOS-PIEUP"/* 1132 */,/*4403*/"HANGUL CHOSEONG SIOS-PIEUP-KIYEOK"/* 1133 */, /*4404*/"HANGUL CHOSEONG SIOS-SSANGSIOS"/* 1134 */,/*4405*/"HANGUL CHOSEONG SIOS-IEUNG"/* 1135 */, /*4406*/"HANGUL CHOSEONG SIOS-CIEUC"/* 1136 */,/*4407*/"HANGUL CHOSEONG SIOS-CHIEUCH"/* 1137 */, /*4408*/"HANGUL CHOSEONG SIOS-KHIEUKH"/* 1138 */,/*4409*/"HANGUL CHOSEONG SIOS-THIEUTH"/* 1139 */, /*4410*/"HANGUL CHOSEONG SIOS-PHIEUPH"/* 113A */,/*4411*/"HANGUL CHOSEONG SIOS-HIEUH"/* 113B */, /*4412*/"HANGUL CHOSEONG CHITUEUMSIOS"/* 113C */,/*4413*/"HANGUL CHOSEONG CHITUEUMSSANGSIOS"/* 113D */, /*4414*/"HANGUL CHOSEONG CEONGCHIEUMSIOS"/* 113E */,/*4415*/"HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS"/* 113F */, /*4416*/"HANGUL CHOSEONG PANSIOS"/* 1140 */,/*4417*/"HANGUL CHOSEONG IEUNG-KIYEOK"/* 1141 */, /*4418*/"HANGUL CHOSEONG IEUNG-TIKEUT"/* 1142 */,/*4419*/"HANGUL CHOSEONG IEUNG-MIEUM"/* 1143 */, /*4420*/"HANGUL CHOSEONG IEUNG-PIEUP"/* 1144 */,/*4421*/"HANGUL CHOSEONG IEUNG-SIOS"/* 1145 */, /*4422*/"HANGUL CHOSEONG IEUNG-PANSIOS"/* 1146 */,/*4423*/"HANGUL CHOSEONG SSANGIEUNG"/* 1147 */, /*4424*/"HANGUL CHOSEONG IEUNG-CIEUC"/* 1148 */,/*4425*/"HANGUL CHOSEONG IEUNG-CHIEUCH"/* 1149 */, /*4426*/"HANGUL CHOSEONG IEUNG-THIEUTH"/* 114A */,/*4427*/"HANGUL CHOSEONG IEUNG-PHIEUPH"/* 114B */, /*4428*/"HANGUL CHOSEONG YESIEUNG"/* 114C */,/*4429*/"HANGUL CHOSEONG CIEUC-IEUNG"/* 114D */, /*4430*/"HANGUL CHOSEONG CHITUEUMCIEUC"/* 114E */,/*4431*/"HANGUL CHOSEONG CHITUEUMSSANGCIEUC"/* 114F */, /*4432*/"HANGUL CHOSEONG CEONGCHIEUMCIEUC"/* 1150 */,/*4433*/"HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC"/* 1151 */, /*4434*/"HANGUL CHOSEONG CHIEUCH-KHIEUKH"/* 1152 */,/*4435*/"HANGUL CHOSEONG CHIEUCH-HIEUH"/* 1153 */, /*4436*/"HANGUL CHOSEONG CHITUEUMCHIEUCH"/* 1154 */,/*4437*/"HANGUL CHOSEONG CEONGCHIEUMCHIEUCH"/* 1155 */, /*4438*/"HANGUL CHOSEONG PHIEUPH-PIEUP"/* 1156 */,/*4439*/"HANGUL CHOSEONG KAPYEOUNPHIEUPH"/* 1157 */, /*4440*/"HANGUL CHOSEONG SSANGHIEUH"/* 1158 */,/*4441*/"HANGUL CHOSEONG YEORINHIEUH"/* 1159 */, /*4442*/"HANGUL CHOSEONG KIYEOK-TIKEUT"/* 115A */,/*4443*/"HANGUL CHOSEONG NIEUN-SIOS"/* 115B */, /*4444*/"HANGUL CHOSEONG NIEUN-CIEUC"/* 115C */,/*4445*/"HANGUL CHOSEONG NIEUN-HIEUH"/* 115D */, /*4446*/"HANGUL CHOSEONG TIKEUT-RIEUL"/* 115E */,/*4447*/"HANGUL CHOSEONG FILLER"/* 115F */, /*4448*/"HANGUL JUNGSEONG FILLER"/* 1160 */,/*4449*/"HANGUL JUNGSEONG A"/* 1161 */, /*4450*/"HANGUL JUNGSEONG AE"/* 1162 */,/*4451*/"HANGUL JUNGSEONG YA"/* 1163 */,/*4452*/"HANGUL JUNGSEONG YAE"/* 1164 */, /*4453*/"HANGUL JUNGSEONG EO"/* 1165 */,/*4454*/"HANGUL JUNGSEONG E"/* 1166 */,/*4455*/"HANGUL JUNGSEONG YEO"/* 1167 */, /*4456*/"HANGUL JUNGSEONG YE"/* 1168 */,/*4457*/"HANGUL JUNGSEONG O"/* 1169 */,/*4458*/"HANGUL JUNGSEONG WA"/* 116A */, /*4459*/"HANGUL JUNGSEONG WAE"/* 116B */,/*4460*/"HANGUL JUNGSEONG OE"/* 116C */,/*4461*/"HANGUL JUNGSEONG YO"/* 116D */, /*4462*/"HANGUL JUNGSEONG U"/* 116E */,/*4463*/"HANGUL JUNGSEONG WEO"/* 116F */,/*4464*/"HANGUL JUNGSEONG WE"/* 1170 */, /*4465*/"HANGUL JUNGSEONG WI"/* 1171 */,/*4466*/"HANGUL JUNGSEONG YU"/* 1172 */,/*4467*/"HANGUL JUNGSEONG EU"/* 1173 */, /*4468*/"HANGUL JUNGSEONG YI"/* 1174 */,/*4469*/"HANGUL JUNGSEONG I"/* 1175 */,/*4470*/"HANGUL JUNGSEONG A-O"/* 1176 */, /*4471*/"HANGUL JUNGSEONG A-U"/* 1177 */,/*4472*/"HANGUL JUNGSEONG YA-O"/* 1178 */, /*4473*/"HANGUL JUNGSEONG YA-YO"/* 1179 */,/*4474*/"HANGUL JUNGSEONG EO-O"/* 117A */, /*4475*/"HANGUL JUNGSEONG EO-U"/* 117B */,/*4476*/"HANGUL JUNGSEONG EO-EU"/* 117C */, /*4477*/"HANGUL JUNGSEONG YEO-O"/* 117D */,/*4478*/"HANGUL JUNGSEONG YEO-U"/* 117E */, /*4479*/"HANGUL JUNGSEONG O-EO"/* 117F */,/*4480*/"HANGUL JUNGSEONG O-E"/* 1180 */, /*4481*/"HANGUL JUNGSEONG O-YE"/* 1181 */,/*4482*/"HANGUL JUNGSEONG O-O"/* 1182 */, /*4483*/"HANGUL JUNGSEONG O-U"/* 1183 */,/*4484*/"HANGUL JUNGSEONG YO-YA"/* 1184 */, /*4485*/"HANGUL JUNGSEONG YO-YAE"/* 1185 */,/*4486*/"HANGUL JUNGSEONG YO-YEO"/* 1186 */, /*4487*/"HANGUL JUNGSEONG YO-O"/* 1187 */,/*4488*/"HANGUL JUNGSEONG YO-I"/* 1188 */, /*4489*/"HANGUL JUNGSEONG U-A"/* 1189 */,/*4490*/"HANGUL JUNGSEONG U-AE"/* 118A */, /*4491*/"HANGUL JUNGSEONG U-EO-EU"/* 118B */,/*4492*/"HANGUL JUNGSEONG U-YE"/* 118C */, /*4493*/"HANGUL JUNGSEONG U-U"/* 118D */,/*4494*/"HANGUL JUNGSEONG YU-A"/* 118E */, /*4495*/"HANGUL JUNGSEONG YU-EO"/* 118F */,/*4496*/"HANGUL JUNGSEONG YU-E"/* 1190 */, /*4497*/"HANGUL JUNGSEONG YU-YEO"/* 1191 */,/*4498*/"HANGUL JUNGSEONG YU-YE"/* 1192 */, /*4499*/"HANGUL JUNGSEONG YU-U"/* 1193 */,/*4500*/"HANGUL JUNGSEONG YU-I"/* 1194 */, /*4501*/"HANGUL JUNGSEONG EU-U"/* 1195 */,/*4502*/"HANGUL JUNGSEONG EU-EU"/* 1196 */, /*4503*/"HANGUL JUNGSEONG YI-U"/* 1197 */,/*4504*/"HANGUL JUNGSEONG I-A"/* 1198 */, /*4505*/"HANGUL JUNGSEONG I-YA"/* 1199 */,/*4506*/"HANGUL JUNGSEONG I-O"/* 119A */, /*4507*/"HANGUL JUNGSEONG I-U"/* 119B */,/*4508*/"HANGUL JUNGSEONG I-EU"/* 119C */, /*4509*/"HANGUL JUNGSEONG I-ARAEA"/* 119D */,/*4510*/"HANGUL JUNGSEONG ARAEA"/* 119E */, /*4511*/"HANGUL JUNGSEONG ARAEA-EO"/* 119F */,/*4512*/"HANGUL JUNGSEONG ARAEA-U"/* 11A0 */, /*4513*/"HANGUL JUNGSEONG ARAEA-I"/* 11A1 */,/*4514*/"HANGUL JUNGSEONG SSANGARAEA"/* 11A2 */, /*4515*/"HANGUL JUNGSEONG A-EU"/* 11A3 */,/*4516*/"HANGUL JUNGSEONG YA-U"/* 11A4 */, /*4517*/"HANGUL JUNGSEONG YEO-YA"/* 11A5 */,/*4518*/"HANGUL JUNGSEONG O-YA"/* 11A6 */, /*4519*/"HANGUL JUNGSEONG O-YAE"/* 11A7 */,/*4520*/"HANGUL JONGSEONG KIYEOK"/* 11A8 */, /*4521*/"HANGUL JONGSEONG SSANGKIYEOK"/* 11A9 */,/*4522*/"HANGUL JONGSEONG KIYEOK-SIOS"/* 11AA */, /*4523*/"HANGUL JONGSEONG NIEUN"/* 11AB */,/*4524*/"HANGUL JONGSEONG NIEUN-CIEUC"/* 11AC */, /*4525*/"HANGUL JONGSEONG NIEUN-HIEUH"/* 11AD */,/*4526*/"HANGUL JONGSEONG TIKEUT"/* 11AE */, /*4527*/"HANGUL JONGSEONG RIEUL"/* 11AF */,/*4528*/"HANGUL JONGSEONG RIEUL-KIYEOK"/* 11B0 */, /*4529*/"HANGUL JONGSEONG RIEUL-MIEUM"/* 11B1 */,/*4530*/"HANGUL JONGSEONG RIEUL-PIEUP"/* 11B2 */, /*4531*/"HANGUL JONGSEONG RIEUL-SIOS"/* 11B3 */,/*4532*/"HANGUL JONGSEONG RIEUL-THIEUTH"/* 11B4 */, /*4533*/"HANGUL JONGSEONG RIEUL-PHIEUPH"/* 11B5 */,/*4534*/"HANGUL JONGSEONG RIEUL-HIEUH"/* 11B6 */, /*4535*/"HANGUL JONGSEONG MIEUM"/* 11B7 */,/*4536*/"HANGUL JONGSEONG PIEUP"/* 11B8 */, /*4537*/"HANGUL JONGSEONG PIEUP-SIOS"/* 11B9 */,/*4538*/"HANGUL JONGSEONG SIOS"/* 11BA */, /*4539*/"HANGUL JONGSEONG SSANGSIOS"/* 11BB */,/*4540*/"HANGUL JONGSEONG IEUNG"/* 11BC */, /*4541*/"HANGUL JONGSEONG CIEUC"/* 11BD */,/*4542*/"HANGUL JONGSEONG CHIEUCH"/* 11BE */, /*4543*/"HANGUL JONGSEONG KHIEUKH"/* 11BF */,/*4544*/"HANGUL JONGSEONG THIEUTH"/* 11C0 */, /*4545*/"HANGUL JONGSEONG PHIEUPH"/* 11C1 */,/*4546*/"HANGUL JONGSEONG HIEUH"/* 11C2 */, /*4547*/"HANGUL JONGSEONG KIYEOK-RIEUL"/* 11C3 */,/*4548*/"HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK"/* 11C4 */, /*4549*/"HANGUL JONGSEONG NIEUN-KIYEOK"/* 11C5 */,/*4550*/"HANGUL JONGSEONG NIEUN-TIKEUT"/* 11C6 */, /*4551*/"HANGUL JONGSEONG NIEUN-SIOS"/* 11C7 */,/*4552*/"HANGUL JONGSEONG NIEUN-PANSIOS"/* 11C8 */, /*4553*/"HANGUL JONGSEONG NIEUN-THIEUTH"/* 11C9 */,/*4554*/"HANGUL JONGSEONG TIKEUT-KIYEOK"/* 11CA */, /*4555*/"HANGUL JONGSEONG TIKEUT-RIEUL"/* 11CB */,/*4556*/"HANGUL JONGSEONG RIEUL-KIYEOK-SIOS"/* 11CC */, /*4557*/"HANGUL JONGSEONG RIEUL-NIEUN"/* 11CD */,/*4558*/"HANGUL JONGSEONG RIEUL-TIKEUT"/* 11CE */, /*4559*/"HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH"/* 11CF */,/*4560*/"HANGUL JONGSEONG SSANGRIEUL"/* 11D0 */, /*4561*/"HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK"/* 11D1 */,/*4562*/"HANGUL JONGSEONG RIEUL-MIEUM-SIOS"/* 11D2 */, /*4563*/"HANGUL JONGSEONG RIEUL-PIEUP-SIOS"/* 11D3 */,/*4564*/"HANGUL JONGSEONG RIEUL-PIEUP-HIEUH"/* 11D4 */, /*4565*/"HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP"/* 11D5 */,/*4566*/"HANGUL JONGSEONG RIEUL-SSANGSIOS"/* 11D6 */, /*4567*/"HANGUL JONGSEONG RIEUL-PANSIOS"/* 11D7 */,/*4568*/"HANGUL JONGSEONG RIEUL-KHIEUKH"/* 11D8 */, /*4569*/"HANGUL JONGSEONG RIEUL-YEORINHIEUH"/* 11D9 */,/*4570*/"HANGUL JONGSEONG MIEUM-KIYEOK"/* 11DA */, /*4571*/"HANGUL JONGSEONG MIEUM-RIEUL"/* 11DB */,/*4572*/"HANGUL JONGSEONG MIEUM-PIEUP"/* 11DC */, /*4573*/"HANGUL JONGSEONG MIEUM-SIOS"/* 11DD */,/*4574*/"HANGUL JONGSEONG MIEUM-SSANGSIOS"/* 11DE */, /*4575*/"HANGUL JONGSEONG MIEUM-PANSIOS"/* 11DF */,/*4576*/"HANGUL JONGSEONG MIEUM-CHIEUCH"/* 11E0 */, /*4577*/"HANGUL JONGSEONG MIEUM-HIEUH"/* 11E1 */,/*4578*/"HANGUL JONGSEONG KAPYEOUNMIEUM"/* 11E2 */, /*4579*/"HANGUL JONGSEONG PIEUP-RIEUL"/* 11E3 */,/*4580*/"HANGUL JONGSEONG PIEUP-PHIEUPH"/* 11E4 */, /*4581*/"HANGUL JONGSEONG PIEUP-HIEUH"/* 11E5 */,/*4582*/"HANGUL JONGSEONG KAPYEOUNPIEUP"/* 11E6 */, /*4583*/"HANGUL JONGSEONG SIOS-KIYEOK"/* 11E7 */,/*4584*/"HANGUL JONGSEONG SIOS-TIKEUT"/* 11E8 */, /*4585*/"HANGUL JONGSEONG SIOS-RIEUL"/* 11E9 */,/*4586*/"HANGUL JONGSEONG SIOS-PIEUP"/* 11EA */, /*4587*/"HANGUL JONGSEONG PANSIOS"/* 11EB */,/*4588*/"HANGUL JONGSEONG IEUNG-KIYEOK"/* 11EC */, /*4589*/"HANGUL JONGSEONG IEUNG-SSANGKIYEOK"/* 11ED */,/*4590*/"HANGUL JONGSEONG SSANGIEUNG"/* 11EE */, /*4591*/"HANGUL JONGSEONG IEUNG-KHIEUKH"/* 11EF */,/*4592*/"HANGUL JONGSEONG YESIEUNG"/* 11F0 */, /*4593*/"HANGUL JONGSEONG YESIEUNG-SIOS"/* 11F1 */,/*4594*/"HANGUL JONGSEONG YESIEUNG-PANSIOS"/* 11F2 */, /*4595*/"HANGUL JONGSEONG PHIEUPH-PIEUP"/* 11F3 */,/*4596*/"HANGUL JONGSEONG KAPYEOUNPHIEUPH"/* 11F4 */, /*4597*/"HANGUL JONGSEONG HIEUH-NIEUN"/* 11F5 */,/*4598*/"HANGUL JONGSEONG HIEUH-RIEUL"/* 11F6 */, /*4599*/"HANGUL JONGSEONG HIEUH-MIEUM"/* 11F7 */,/*4600*/"HANGUL JONGSEONG HIEUH-PIEUP"/* 11F8 */, /*4601*/"HANGUL JONGSEONG YEORINHIEUH"/* 11F9 */,/*4602*/"HANGUL JONGSEONG KIYEOK-NIEUN"/* 11FA */, /*4603*/"HANGUL JONGSEONG KIYEOK-PIEUP"/* 11FB */,/*4604*/"HANGUL JONGSEONG KIYEOK-CHIEUCH"/* 11FC */, /*4605*/"HANGUL JONGSEONG KIYEOK-KHIEUKH"/* 11FD */,/*4606*/"HANGUL JONGSEONG KIYEOK-HIEUH"/* 11FE */, /*4607*/"HANGUL JONGSEONG SSANGNIEUN"/* 11FF */,/*4608*/"ETHIOPIC SYLLABLE HA"/* 1200 */, /*4609*/"ETHIOPIC SYLLABLE HU"/* 1201 */,/*4610*/"ETHIOPIC SYLLABLE HI"/* 1202 */, /*4611*/"ETHIOPIC SYLLABLE HAA"/* 1203 */,/*4612*/"ETHIOPIC SYLLABLE HEE"/* 1204 */, /*4613*/"ETHIOPIC SYLLABLE HE"/* 1205 */,/*4614*/"ETHIOPIC SYLLABLE HO"/* 1206 */, /*4615*/"ETHIOPIC SYLLABLE HOA"/* 1207 */,/*4616*/"ETHIOPIC SYLLABLE LA"/* 1208 */, /*4617*/"ETHIOPIC SYLLABLE LU"/* 1209 */,/*4618*/"ETHIOPIC SYLLABLE LI"/* 120A */, /*4619*/"ETHIOPIC SYLLABLE LAA"/* 120B */,/*4620*/"ETHIOPIC SYLLABLE LEE"/* 120C */, /*4621*/"ETHIOPIC SYLLABLE LE"/* 120D */,/*4622*/"ETHIOPIC SYLLABLE LO"/* 120E */, /*4623*/"ETHIOPIC SYLLABLE LWA"/* 120F */,/*4624*/"ETHIOPIC SYLLABLE HHA"/* 1210 */, /*4625*/"ETHIOPIC SYLLABLE HHU"/* 1211 */,/*4626*/"ETHIOPIC SYLLABLE HHI"/* 1212 */, /*4627*/"ETHIOPIC SYLLABLE HHAA"/* 1213 */,/*4628*/"ETHIOPIC SYLLABLE HHEE"/* 1214 */, /*4629*/"ETHIOPIC SYLLABLE HHE"/* 1215 */,/*4630*/"ETHIOPIC SYLLABLE HHO"/* 1216 */, /*4631*/"ETHIOPIC SYLLABLE HHWA"/* 1217 */,/*4632*/"ETHIOPIC SYLLABLE MA"/* 1218 */, /*4633*/"ETHIOPIC SYLLABLE MU"/* 1219 */,/*4634*/"ETHIOPIC SYLLABLE MI"/* 121A */, /*4635*/"ETHIOPIC SYLLABLE MAA"/* 121B */,/*4636*/"ETHIOPIC SYLLABLE MEE"/* 121C */, /*4637*/"ETHIOPIC SYLLABLE ME"/* 121D */,/*4638*/"ETHIOPIC SYLLABLE MO"/* 121E */, /*4639*/"ETHIOPIC SYLLABLE MWA"/* 121F */,/*4640*/"ETHIOPIC SYLLABLE SZA"/* 1220 */, /*4641*/"ETHIOPIC SYLLABLE SZU"/* 1221 */,/*4642*/"ETHIOPIC SYLLABLE SZI"/* 1222 */, /*4643*/"ETHIOPIC SYLLABLE SZAA"/* 1223 */,/*4644*/"ETHIOPIC SYLLABLE SZEE"/* 1224 */, /*4645*/"ETHIOPIC SYLLABLE SZE"/* 1225 */,/*4646*/"ETHIOPIC SYLLABLE SZO"/* 1226 */, /*4647*/"ETHIOPIC SYLLABLE SZWA"/* 1227 */,/*4648*/"ETHIOPIC SYLLABLE RA"/* 1228 */, /*4649*/"ETHIOPIC SYLLABLE RU"/* 1229 */,/*4650*/"ETHIOPIC SYLLABLE RI"/* 122A */, /*4651*/"ETHIOPIC SYLLABLE RAA"/* 122B */,/*4652*/"ETHIOPIC SYLLABLE REE"/* 122C */, /*4653*/"ETHIOPIC SYLLABLE RE"/* 122D */,/*4654*/"ETHIOPIC SYLLABLE RO"/* 122E */, /*4655*/"ETHIOPIC SYLLABLE RWA"/* 122F */,/*4656*/"ETHIOPIC SYLLABLE SA"/* 1230 */, /*4657*/"ETHIOPIC SYLLABLE SU"/* 1231 */,/*4658*/"ETHIOPIC SYLLABLE SI"/* 1232 */, /*4659*/"ETHIOPIC SYLLABLE SAA"/* 1233 */,/*4660*/"ETHIOPIC SYLLABLE SEE"/* 1234 */, /*4661*/"ETHIOPIC SYLLABLE SE"/* 1235 */,/*4662*/"ETHIOPIC SYLLABLE SO"/* 1236 */, /*4663*/"ETHIOPIC SYLLABLE SWA"/* 1237 */,/*4664*/"ETHIOPIC SYLLABLE SHA"/* 1238 */, /*4665*/"ETHIOPIC SYLLABLE SHU"/* 1239 */,/*4666*/"ETHIOPIC SYLLABLE SHI"/* 123A */, /*4667*/"ETHIOPIC SYLLABLE SHAA"/* 123B */,/*4668*/"ETHIOPIC SYLLABLE SHEE"/* 123C */, /*4669*/"ETHIOPIC SYLLABLE SHE"/* 123D */,/*4670*/"ETHIOPIC SYLLABLE SHO"/* 123E */, /*4671*/"ETHIOPIC SYLLABLE SHWA"/* 123F */,/*4672*/"ETHIOPIC SYLLABLE QA"/* 1240 */, /*4673*/"ETHIOPIC SYLLABLE QU"/* 1241 */,/*4674*/"ETHIOPIC SYLLABLE QI"/* 1242 */, /*4675*/"ETHIOPIC SYLLABLE QAA"/* 1243 */,/*4676*/"ETHIOPIC SYLLABLE QEE"/* 1244 */, /*4677*/"ETHIOPIC SYLLABLE QE"/* 1245 */,/*4678*/"ETHIOPIC SYLLABLE QO"/* 1246 */, /*4679*/"ETHIOPIC SYLLABLE QOA"/* 1247 */,/*4680*/"ETHIOPIC SYLLABLE QWA"/* 1248 */,NULL, /*4682*/"ETHIOPIC SYLLABLE QWI"/* 124A */,/*4683*/"ETHIOPIC SYLLABLE QWAA"/* 124B */, /*4684*/"ETHIOPIC SYLLABLE QWEE"/* 124C */,/*4685*/"ETHIOPIC SYLLABLE QWE"/* 124D */,NULL,NULL, /*4688*/"ETHIOPIC SYLLABLE QHA"/* 1250 */,/*4689*/"ETHIOPIC SYLLABLE QHU"/* 1251 */, /*4690*/"ETHIOPIC SYLLABLE QHI"/* 1252 */,/*4691*/"ETHIOPIC SYLLABLE QHAA"/* 1253 */, /*4692*/"ETHIOPIC SYLLABLE QHEE"/* 1254 */,/*4693*/"ETHIOPIC SYLLABLE QHE"/* 1255 */, /*4694*/"ETHIOPIC SYLLABLE QHO"/* 1256 */,NULL,/*4696*/"ETHIOPIC SYLLABLE QHWA"/* 1258 */,NULL, /*4698*/"ETHIOPIC SYLLABLE QHWI"/* 125A */,/*4699*/"ETHIOPIC SYLLABLE QHWAA"/* 125B */, /*4700*/"ETHIOPIC SYLLABLE QHWEE"/* 125C */,/*4701*/"ETHIOPIC SYLLABLE QHWE"/* 125D */,NULL,NULL, /*4704*/"ETHIOPIC SYLLABLE BA"/* 1260 */,/*4705*/"ETHIOPIC SYLLABLE BU"/* 1261 */, /*4706*/"ETHIOPIC SYLLABLE BI"/* 1262 */,/*4707*/"ETHIOPIC SYLLABLE BAA"/* 1263 */, /*4708*/"ETHIOPIC SYLLABLE BEE"/* 1264 */,/*4709*/"ETHIOPIC SYLLABLE BE"/* 1265 */, /*4710*/"ETHIOPIC SYLLABLE BO"/* 1266 */,/*4711*/"ETHIOPIC SYLLABLE BWA"/* 1267 */, /*4712*/"ETHIOPIC SYLLABLE VA"/* 1268 */,/*4713*/"ETHIOPIC SYLLABLE VU"/* 1269 */, /*4714*/"ETHIOPIC SYLLABLE VI"/* 126A */,/*4715*/"ETHIOPIC SYLLABLE VAA"/* 126B */, /*4716*/"ETHIOPIC SYLLABLE VEE"/* 126C */,/*4717*/"ETHIOPIC SYLLABLE VE"/* 126D */, /*4718*/"ETHIOPIC SYLLABLE VO"/* 126E */,/*4719*/"ETHIOPIC SYLLABLE VWA"/* 126F */, /*4720*/"ETHIOPIC SYLLABLE TA"/* 1270 */,/*4721*/"ETHIOPIC SYLLABLE TU"/* 1271 */, /*4722*/"ETHIOPIC SYLLABLE TI"/* 1272 */,/*4723*/"ETHIOPIC SYLLABLE TAA"/* 1273 */, /*4724*/"ETHIOPIC SYLLABLE TEE"/* 1274 */,/*4725*/"ETHIOPIC SYLLABLE TE"/* 1275 */, /*4726*/"ETHIOPIC SYLLABLE TO"/* 1276 */,/*4727*/"ETHIOPIC SYLLABLE TWA"/* 1277 */, /*4728*/"ETHIOPIC SYLLABLE CA"/* 1278 */,/*4729*/"ETHIOPIC SYLLABLE CU"/* 1279 */, /*4730*/"ETHIOPIC SYLLABLE CI"/* 127A */,/*4731*/"ETHIOPIC SYLLABLE CAA"/* 127B */, /*4732*/"ETHIOPIC SYLLABLE CEE"/* 127C */,/*4733*/"ETHIOPIC SYLLABLE CE"/* 127D */, /*4734*/"ETHIOPIC SYLLABLE CO"/* 127E */,/*4735*/"ETHIOPIC SYLLABLE CWA"/* 127F */, /*4736*/"ETHIOPIC SYLLABLE XA"/* 1280 */,/*4737*/"ETHIOPIC SYLLABLE XU"/* 1281 */, /*4738*/"ETHIOPIC SYLLABLE XI"/* 1282 */,/*4739*/"ETHIOPIC SYLLABLE XAA"/* 1283 */, /*4740*/"ETHIOPIC SYLLABLE XEE"/* 1284 */,/*4741*/"ETHIOPIC SYLLABLE XE"/* 1285 */, /*4742*/"ETHIOPIC SYLLABLE XO"/* 1286 */,/*4743*/"ETHIOPIC SYLLABLE XOA"/* 1287 */, /*4744*/"ETHIOPIC SYLLABLE XWA"/* 1288 */,NULL,/*4746*/"ETHIOPIC SYLLABLE XWI"/* 128A */, /*4747*/"ETHIOPIC SYLLABLE XWAA"/* 128B */,/*4748*/"ETHIOPIC SYLLABLE XWEE"/* 128C */, /*4749*/"ETHIOPIC SYLLABLE XWE"/* 128D */,NULL,NULL,/*4752*/"ETHIOPIC SYLLABLE NA"/* 1290 */, /*4753*/"ETHIOPIC SYLLABLE NU"/* 1291 */,/*4754*/"ETHIOPIC SYLLABLE NI"/* 1292 */, /*4755*/"ETHIOPIC SYLLABLE NAA"/* 1293 */,/*4756*/"ETHIOPIC SYLLABLE NEE"/* 1294 */, /*4757*/"ETHIOPIC SYLLABLE NE"/* 1295 */,/*4758*/"ETHIOPIC SYLLABLE NO"/* 1296 */, /*4759*/"ETHIOPIC SYLLABLE NWA"/* 1297 */,/*4760*/"ETHIOPIC SYLLABLE NYA"/* 1298 */, /*4761*/"ETHIOPIC SYLLABLE NYU"/* 1299 */,/*4762*/"ETHIOPIC SYLLABLE NYI"/* 129A */, /*4763*/"ETHIOPIC SYLLABLE NYAA"/* 129B */,/*4764*/"ETHIOPIC SYLLABLE NYEE"/* 129C */, /*4765*/"ETHIOPIC SYLLABLE NYE"/* 129D */,/*4766*/"ETHIOPIC SYLLABLE NYO"/* 129E */, /*4767*/"ETHIOPIC SYLLABLE NYWA"/* 129F */,/*4768*/"ETHIOPIC SYLLABLE GLOTTAL A"/* 12A0 */, /*4769*/"ETHIOPIC SYLLABLE GLOTTAL U"/* 12A1 */,/*4770*/"ETHIOPIC SYLLABLE GLOTTAL I"/* 12A2 */, /*4771*/"ETHIOPIC SYLLABLE GLOTTAL AA"/* 12A3 */,/*4772*/"ETHIOPIC SYLLABLE GLOTTAL EE"/* 12A4 */, /*4773*/"ETHIOPIC SYLLABLE GLOTTAL E"/* 12A5 */,/*4774*/"ETHIOPIC SYLLABLE GLOTTAL O"/* 12A6 */, /*4775*/"ETHIOPIC SYLLABLE GLOTTAL WA"/* 12A7 */,/*4776*/"ETHIOPIC SYLLABLE KA"/* 12A8 */, /*4777*/"ETHIOPIC SYLLABLE KU"/* 12A9 */,/*4778*/"ETHIOPIC SYLLABLE KI"/* 12AA */, /*4779*/"ETHIOPIC SYLLABLE KAA"/* 12AB */,/*4780*/"ETHIOPIC SYLLABLE KEE"/* 12AC */, /*4781*/"ETHIOPIC SYLLABLE KE"/* 12AD */,/*4782*/"ETHIOPIC SYLLABLE KO"/* 12AE */, /*4783*/"ETHIOPIC SYLLABLE KOA"/* 12AF */,/*4784*/"ETHIOPIC SYLLABLE KWA"/* 12B0 */,NULL, /*4786*/"ETHIOPIC SYLLABLE KWI"/* 12B2 */,/*4787*/"ETHIOPIC SYLLABLE KWAA"/* 12B3 */, /*4788*/"ETHIOPIC SYLLABLE KWEE"/* 12B4 */,/*4789*/"ETHIOPIC SYLLABLE KWE"/* 12B5 */,NULL,NULL, /*4792*/"ETHIOPIC SYLLABLE KXA"/* 12B8 */,/*4793*/"ETHIOPIC SYLLABLE KXU"/* 12B9 */, /*4794*/"ETHIOPIC SYLLABLE KXI"/* 12BA */,/*4795*/"ETHIOPIC SYLLABLE KXAA"/* 12BB */, /*4796*/"ETHIOPIC SYLLABLE KXEE"/* 12BC */,/*4797*/"ETHIOPIC SYLLABLE KXE"/* 12BD */, /*4798*/"ETHIOPIC SYLLABLE KXO"/* 12BE */,NULL,/*4800*/"ETHIOPIC SYLLABLE KXWA"/* 12C0 */,NULL, /*4802*/"ETHIOPIC SYLLABLE KXWI"/* 12C2 */,/*4803*/"ETHIOPIC SYLLABLE KXWAA"/* 12C3 */, /*4804*/"ETHIOPIC SYLLABLE KXWEE"/* 12C4 */,/*4805*/"ETHIOPIC SYLLABLE KXWE"/* 12C5 */,NULL,NULL, /*4808*/"ETHIOPIC SYLLABLE WA"/* 12C8 */,/*4809*/"ETHIOPIC SYLLABLE WU"/* 12C9 */, /*4810*/"ETHIOPIC SYLLABLE WI"/* 12CA */,/*4811*/"ETHIOPIC SYLLABLE WAA"/* 12CB */, /*4812*/"ETHIOPIC SYLLABLE WEE"/* 12CC */,/*4813*/"ETHIOPIC SYLLABLE WE"/* 12CD */, /*4814*/"ETHIOPIC SYLLABLE WO"/* 12CE */,/*4815*/"ETHIOPIC SYLLABLE WOA"/* 12CF */, /*4816*/"ETHIOPIC SYLLABLE PHARYNGEAL A"/* 12D0 */,/*4817*/"ETHIOPIC SYLLABLE PHARYNGEAL U"/* 12D1 */, /*4818*/"ETHIOPIC SYLLABLE PHARYNGEAL I"/* 12D2 */,/*4819*/"ETHIOPIC SYLLABLE PHARYNGEAL AA"/* 12D3 */, /*4820*/"ETHIOPIC SYLLABLE PHARYNGEAL EE"/* 12D4 */,/*4821*/"ETHIOPIC SYLLABLE PHARYNGEAL E"/* 12D5 */, /*4822*/"ETHIOPIC SYLLABLE PHARYNGEAL O"/* 12D6 */,NULL,/*4824*/"ETHIOPIC SYLLABLE ZA"/* 12D8 */, /*4825*/"ETHIOPIC SYLLABLE ZU"/* 12D9 */,/*4826*/"ETHIOPIC SYLLABLE ZI"/* 12DA */, /*4827*/"ETHIOPIC SYLLABLE ZAA"/* 12DB */,/*4828*/"ETHIOPIC SYLLABLE ZEE"/* 12DC */, /*4829*/"ETHIOPIC SYLLABLE ZE"/* 12DD */,/*4830*/"ETHIOPIC SYLLABLE ZO"/* 12DE */, /*4831*/"ETHIOPIC SYLLABLE ZWA"/* 12DF */,/*4832*/"ETHIOPIC SYLLABLE ZHA"/* 12E0 */, /*4833*/"ETHIOPIC SYLLABLE ZHU"/* 12E1 */,/*4834*/"ETHIOPIC SYLLABLE ZHI"/* 12E2 */, /*4835*/"ETHIOPIC SYLLABLE ZHAA"/* 12E3 */,/*4836*/"ETHIOPIC SYLLABLE ZHEE"/* 12E4 */, /*4837*/"ETHIOPIC SYLLABLE ZHE"/* 12E5 */,/*4838*/"ETHIOPIC SYLLABLE ZHO"/* 12E6 */, /*4839*/"ETHIOPIC SYLLABLE ZHWA"/* 12E7 */,/*4840*/"ETHIOPIC SYLLABLE YA"/* 12E8 */, /*4841*/"ETHIOPIC SYLLABLE YU"/* 12E9 */,/*4842*/"ETHIOPIC SYLLABLE YI"/* 12EA */, /*4843*/"ETHIOPIC SYLLABLE YAA"/* 12EB */,/*4844*/"ETHIOPIC SYLLABLE YEE"/* 12EC */, /*4845*/"ETHIOPIC SYLLABLE YE"/* 12ED */,/*4846*/"ETHIOPIC SYLLABLE YO"/* 12EE */, /*4847*/"ETHIOPIC SYLLABLE YOA"/* 12EF */,/*4848*/"ETHIOPIC SYLLABLE DA"/* 12F0 */, /*4849*/"ETHIOPIC SYLLABLE DU"/* 12F1 */,/*4850*/"ETHIOPIC SYLLABLE DI"/* 12F2 */, /*4851*/"ETHIOPIC SYLLABLE DAA"/* 12F3 */,/*4852*/"ETHIOPIC SYLLABLE DEE"/* 12F4 */, /*4853*/"ETHIOPIC SYLLABLE DE"/* 12F5 */,/*4854*/"ETHIOPIC SYLLABLE DO"/* 12F6 */, /*4855*/"ETHIOPIC SYLLABLE DWA"/* 12F7 */,/*4856*/"ETHIOPIC SYLLABLE DDA"/* 12F8 */, /*4857*/"ETHIOPIC SYLLABLE DDU"/* 12F9 */,/*4858*/"ETHIOPIC SYLLABLE DDI"/* 12FA */, /*4859*/"ETHIOPIC SYLLABLE DDAA"/* 12FB */,/*4860*/"ETHIOPIC SYLLABLE DDEE"/* 12FC */, /*4861*/"ETHIOPIC SYLLABLE DDE"/* 12FD */,/*4862*/"ETHIOPIC SYLLABLE DDO"/* 12FE */, /*4863*/"ETHIOPIC SYLLABLE DDWA"/* 12FF */,/*4864*/"ETHIOPIC SYLLABLE JA"/* 1300 */, /*4865*/"ETHIOPIC SYLLABLE JU"/* 1301 */,/*4866*/"ETHIOPIC SYLLABLE JI"/* 1302 */, /*4867*/"ETHIOPIC SYLLABLE JAA"/* 1303 */,/*4868*/"ETHIOPIC SYLLABLE JEE"/* 1304 */, /*4869*/"ETHIOPIC SYLLABLE JE"/* 1305 */,/*4870*/"ETHIOPIC SYLLABLE JO"/* 1306 */, /*4871*/"ETHIOPIC SYLLABLE JWA"/* 1307 */,/*4872*/"ETHIOPIC SYLLABLE GA"/* 1308 */, /*4873*/"ETHIOPIC SYLLABLE GU"/* 1309 */,/*4874*/"ETHIOPIC SYLLABLE GI"/* 130A */, /*4875*/"ETHIOPIC SYLLABLE GAA"/* 130B */,/*4876*/"ETHIOPIC SYLLABLE GEE"/* 130C */, /*4877*/"ETHIOPIC SYLLABLE GE"/* 130D */,/*4878*/"ETHIOPIC SYLLABLE GO"/* 130E */, /*4879*/"ETHIOPIC SYLLABLE GOA"/* 130F */,/*4880*/"ETHIOPIC SYLLABLE GWA"/* 1310 */,NULL, /*4882*/"ETHIOPIC SYLLABLE GWI"/* 1312 */,/*4883*/"ETHIOPIC SYLLABLE GWAA"/* 1313 */, /*4884*/"ETHIOPIC SYLLABLE GWEE"/* 1314 */,/*4885*/"ETHIOPIC SYLLABLE GWE"/* 1315 */,NULL,NULL, /*4888*/"ETHIOPIC SYLLABLE GGA"/* 1318 */,/*4889*/"ETHIOPIC SYLLABLE GGU"/* 1319 */, /*4890*/"ETHIOPIC SYLLABLE GGI"/* 131A */,/*4891*/"ETHIOPIC SYLLABLE GGAA"/* 131B */, /*4892*/"ETHIOPIC SYLLABLE GGEE"/* 131C */,/*4893*/"ETHIOPIC SYLLABLE GGE"/* 131D */, /*4894*/"ETHIOPIC SYLLABLE GGO"/* 131E */,/*4895*/"ETHIOPIC SYLLABLE GGWAA"/* 131F */, /*4896*/"ETHIOPIC SYLLABLE THA"/* 1320 */,/*4897*/"ETHIOPIC SYLLABLE THU"/* 1321 */, /*4898*/"ETHIOPIC SYLLABLE THI"/* 1322 */,/*4899*/"ETHIOPIC SYLLABLE THAA"/* 1323 */, /*4900*/"ETHIOPIC SYLLABLE THEE"/* 1324 */,/*4901*/"ETHIOPIC SYLLABLE THE"/* 1325 */, /*4902*/"ETHIOPIC SYLLABLE THO"/* 1326 */,/*4903*/"ETHIOPIC SYLLABLE THWA"/* 1327 */, /*4904*/"ETHIOPIC SYLLABLE CHA"/* 1328 */,/*4905*/"ETHIOPIC SYLLABLE CHU"/* 1329 */, /*4906*/"ETHIOPIC SYLLABLE CHI"/* 132A */,/*4907*/"ETHIOPIC SYLLABLE CHAA"/* 132B */, /*4908*/"ETHIOPIC SYLLABLE CHEE"/* 132C */,/*4909*/"ETHIOPIC SYLLABLE CHE"/* 132D */, /*4910*/"ETHIOPIC SYLLABLE CHO"/* 132E */,/*4911*/"ETHIOPIC SYLLABLE CHWA"/* 132F */, /*4912*/"ETHIOPIC SYLLABLE PHA"/* 1330 */,/*4913*/"ETHIOPIC SYLLABLE PHU"/* 1331 */, /*4914*/"ETHIOPIC SYLLABLE PHI"/* 1332 */,/*4915*/"ETHIOPIC SYLLABLE PHAA"/* 1333 */, /*4916*/"ETHIOPIC SYLLABLE PHEE"/* 1334 */,/*4917*/"ETHIOPIC SYLLABLE PHE"/* 1335 */, /*4918*/"ETHIOPIC SYLLABLE PHO"/* 1336 */,/*4919*/"ETHIOPIC SYLLABLE PHWA"/* 1337 */, /*4920*/"ETHIOPIC SYLLABLE TSA"/* 1338 */,/*4921*/"ETHIOPIC SYLLABLE TSU"/* 1339 */, /*4922*/"ETHIOPIC SYLLABLE TSI"/* 133A */,/*4923*/"ETHIOPIC SYLLABLE TSAA"/* 133B */, /*4924*/"ETHIOPIC SYLLABLE TSEE"/* 133C */,/*4925*/"ETHIOPIC SYLLABLE TSE"/* 133D */, /*4926*/"ETHIOPIC SYLLABLE TSO"/* 133E */,/*4927*/"ETHIOPIC SYLLABLE TSWA"/* 133F */, /*4928*/"ETHIOPIC SYLLABLE TZA"/* 1340 */,/*4929*/"ETHIOPIC SYLLABLE TZU"/* 1341 */, /*4930*/"ETHIOPIC SYLLABLE TZI"/* 1342 */,/*4931*/"ETHIOPIC SYLLABLE TZAA"/* 1343 */, /*4932*/"ETHIOPIC SYLLABLE TZEE"/* 1344 */,/*4933*/"ETHIOPIC SYLLABLE TZE"/* 1345 */, /*4934*/"ETHIOPIC SYLLABLE TZO"/* 1346 */,/*4935*/"ETHIOPIC SYLLABLE TZOA"/* 1347 */, /*4936*/"ETHIOPIC SYLLABLE FA"/* 1348 */,/*4937*/"ETHIOPIC SYLLABLE FU"/* 1349 */, /*4938*/"ETHIOPIC SYLLABLE FI"/* 134A */,/*4939*/"ETHIOPIC SYLLABLE FAA"/* 134B */, /*4940*/"ETHIOPIC SYLLABLE FEE"/* 134C */,/*4941*/"ETHIOPIC SYLLABLE FE"/* 134D */, /*4942*/"ETHIOPIC SYLLABLE FO"/* 134E */,/*4943*/"ETHIOPIC SYLLABLE FWA"/* 134F */, /*4944*/"ETHIOPIC SYLLABLE PA"/* 1350 */,/*4945*/"ETHIOPIC SYLLABLE PU"/* 1351 */, /*4946*/"ETHIOPIC SYLLABLE PI"/* 1352 */,/*4947*/"ETHIOPIC SYLLABLE PAA"/* 1353 */, /*4948*/"ETHIOPIC SYLLABLE PEE"/* 1354 */,/*4949*/"ETHIOPIC SYLLABLE PE"/* 1355 */, /*4950*/"ETHIOPIC SYLLABLE PO"/* 1356 */,/*4951*/"ETHIOPIC SYLLABLE PWA"/* 1357 */, /*4952*/"ETHIOPIC SYLLABLE RYA"/* 1358 */,/*4953*/"ETHIOPIC SYLLABLE MYA"/* 1359 */, /*4954*/"ETHIOPIC SYLLABLE FYA"/* 135A */,NULL,NULL, /*4957*/"ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK"/* 135D */, /*4958*/"ETHIOPIC COMBINING VOWEL LENGTH MARK"/* 135E */,/*4959*/"ETHIOPIC COMBINING GEMINATION MARK"/* 135F */, /*4960*/"ETHIOPIC SECTION MARK"/* 1360 */,/*4961*/"ETHIOPIC WORDSPACE"/* 1361 */,/*4962*/"ETHIOPIC FULL STOP"/* 1362 */, /*4963*/"ETHIOPIC COMMA"/* 1363 */,/*4964*/"ETHIOPIC SEMICOLON"/* 1364 */,/*4965*/"ETHIOPIC COLON"/* 1365 */, /*4966*/"ETHIOPIC PREFACE COLON"/* 1366 */,/*4967*/"ETHIOPIC QUESTION MARK"/* 1367 */, /*4968*/"ETHIOPIC PARAGRAPH SEPARATOR"/* 1368 */,/*4969*/"ETHIOPIC DIGIT ONE"/* 1369 */, /*4970*/"ETHIOPIC DIGIT TWO"/* 136A */,/*4971*/"ETHIOPIC DIGIT THREE"/* 136B */,/*4972*/"ETHIOPIC DIGIT FOUR"/* 136C */, /*4973*/"ETHIOPIC DIGIT FIVE"/* 136D */,/*4974*/"ETHIOPIC DIGIT SIX"/* 136E */,/*4975*/"ETHIOPIC DIGIT SEVEN"/* 136F */, /*4976*/"ETHIOPIC DIGIT EIGHT"/* 1370 */,/*4977*/"ETHIOPIC DIGIT NINE"/* 1371 */,/*4978*/"ETHIOPIC NUMBER TEN"/* 1372 */, /*4979*/"ETHIOPIC NUMBER TWENTY"/* 1373 */,/*4980*/"ETHIOPIC NUMBER THIRTY"/* 1374 */, /*4981*/"ETHIOPIC NUMBER FORTY"/* 1375 */,/*4982*/"ETHIOPIC NUMBER FIFTY"/* 1376 */, /*4983*/"ETHIOPIC NUMBER SIXTY"/* 1377 */,/*4984*/"ETHIOPIC NUMBER SEVENTY"/* 1378 */, /*4985*/"ETHIOPIC NUMBER EIGHTY"/* 1379 */,/*4986*/"ETHIOPIC NUMBER NINETY"/* 137A */, /*4987*/"ETHIOPIC NUMBER HUNDRED"/* 137B */,/*4988*/"ETHIOPIC NUMBER TEN THOUSAND"/* 137C */,NULL,NULL,NULL, /*4992*/"ETHIOPIC SYLLABLE SEBATBEIT MWA"/* 1380 */,/*4993*/"ETHIOPIC SYLLABLE MWI"/* 1381 */, /*4994*/"ETHIOPIC SYLLABLE MWEE"/* 1382 */,/*4995*/"ETHIOPIC SYLLABLE MWE"/* 1383 */, /*4996*/"ETHIOPIC SYLLABLE SEBATBEIT BWA"/* 1384 */,/*4997*/"ETHIOPIC SYLLABLE BWI"/* 1385 */, /*4998*/"ETHIOPIC SYLLABLE BWEE"/* 1386 */,/*4999*/"ETHIOPIC SYLLABLE BWE"/* 1387 */, /*5000*/"ETHIOPIC SYLLABLE SEBATBEIT FWA"/* 1388 */,/*5001*/"ETHIOPIC SYLLABLE FWI"/* 1389 */, /*5002*/"ETHIOPIC SYLLABLE FWEE"/* 138A */,/*5003*/"ETHIOPIC SYLLABLE FWE"/* 138B */, /*5004*/"ETHIOPIC SYLLABLE SEBATBEIT PWA"/* 138C */,/*5005*/"ETHIOPIC SYLLABLE PWI"/* 138D */, /*5006*/"ETHIOPIC SYLLABLE PWEE"/* 138E */,/*5007*/"ETHIOPIC SYLLABLE PWE"/* 138F */, /*5008*/"ETHIOPIC TONAL MARK YIZET"/* 1390 */,/*5009*/"ETHIOPIC TONAL MARK DERET"/* 1391 */, /*5010*/"ETHIOPIC TONAL MARK RIKRIK"/* 1392 */,/*5011*/"ETHIOPIC TONAL MARK SHORT RIKRIK"/* 1393 */, /*5012*/"ETHIOPIC TONAL MARK DIFAT"/* 1394 */,/*5013*/"ETHIOPIC TONAL MARK KENAT"/* 1395 */, /*5014*/"ETHIOPIC TONAL MARK CHIRET"/* 1396 */,/*5015*/"ETHIOPIC TONAL MARK HIDET"/* 1397 */, /*5016*/"ETHIOPIC TONAL MARK DERET-HIDET"/* 1398 */,/*5017*/"ETHIOPIC TONAL MARK KURT"/* 1399 */,NULL,NULL,NULL,NULL, NULL,NULL,/*5024*/"CHEROKEE LETTER A"/* 13A0 */,/*5025*/"CHEROKEE LETTER E"/* 13A1 */, /*5026*/"CHEROKEE LETTER I"/* 13A2 */,/*5027*/"CHEROKEE LETTER O"/* 13A3 */,/*5028*/"CHEROKEE LETTER U"/* 13A4 */, /*5029*/"CHEROKEE LETTER V"/* 13A5 */,/*5030*/"CHEROKEE LETTER GA"/* 13A6 */,/*5031*/"CHEROKEE LETTER KA"/* 13A7 */, /*5032*/"CHEROKEE LETTER GE"/* 13A8 */,/*5033*/"CHEROKEE LETTER GI"/* 13A9 */,/*5034*/"CHEROKEE LETTER GO"/* 13AA */, /*5035*/"CHEROKEE LETTER GU"/* 13AB */,/*5036*/"CHEROKEE LETTER GV"/* 13AC */,/*5037*/"CHEROKEE LETTER HA"/* 13AD */, /*5038*/"CHEROKEE LETTER HE"/* 13AE */,/*5039*/"CHEROKEE LETTER HI"/* 13AF */,/*5040*/"CHEROKEE LETTER HO"/* 13B0 */, /*5041*/"CHEROKEE LETTER HU"/* 13B1 */,/*5042*/"CHEROKEE LETTER HV"/* 13B2 */,/*5043*/"CHEROKEE LETTER LA"/* 13B3 */, /*5044*/"CHEROKEE LETTER LE"/* 13B4 */,/*5045*/"CHEROKEE LETTER LI"/* 13B5 */,/*5046*/"CHEROKEE LETTER LO"/* 13B6 */, /*5047*/"CHEROKEE LETTER LU"/* 13B7 */,/*5048*/"CHEROKEE LETTER LV"/* 13B8 */,/*5049*/"CHEROKEE LETTER MA"/* 13B9 */, /*5050*/"CHEROKEE LETTER ME"/* 13BA */,/*5051*/"CHEROKEE LETTER MI"/* 13BB */,/*5052*/"CHEROKEE LETTER MO"/* 13BC */, /*5053*/"CHEROKEE LETTER MU"/* 13BD */,/*5054*/"CHEROKEE LETTER NA"/* 13BE */,/*5055*/"CHEROKEE LETTER HNA"/* 13BF */, /*5056*/"CHEROKEE LETTER NAH"/* 13C0 */,/*5057*/"CHEROKEE LETTER NE"/* 13C1 */,/*5058*/"CHEROKEE LETTER NI"/* 13C2 */, /*5059*/"CHEROKEE LETTER NO"/* 13C3 */,/*5060*/"CHEROKEE LETTER NU"/* 13C4 */,/*5061*/"CHEROKEE LETTER NV"/* 13C5 */, /*5062*/"CHEROKEE LETTER QUA"/* 13C6 */,/*5063*/"CHEROKEE LETTER QUE"/* 13C7 */,/*5064*/"CHEROKEE LETTER QUI"/* 13C8 */, /*5065*/"CHEROKEE LETTER QUO"/* 13C9 */,/*5066*/"CHEROKEE LETTER QUU"/* 13CA */,/*5067*/"CHEROKEE LETTER QUV"/* 13CB */, /*5068*/"CHEROKEE LETTER SA"/* 13CC */,/*5069*/"CHEROKEE LETTER S"/* 13CD */,/*5070*/"CHEROKEE LETTER SE"/* 13CE */, /*5071*/"CHEROKEE LETTER SI"/* 13CF */,/*5072*/"CHEROKEE LETTER SO"/* 13D0 */,/*5073*/"CHEROKEE LETTER SU"/* 13D1 */, /*5074*/"CHEROKEE LETTER SV"/* 13D2 */,/*5075*/"CHEROKEE LETTER DA"/* 13D3 */,/*5076*/"CHEROKEE LETTER TA"/* 13D4 */, /*5077*/"CHEROKEE LETTER DE"/* 13D5 */,/*5078*/"CHEROKEE LETTER TE"/* 13D6 */,/*5079*/"CHEROKEE LETTER DI"/* 13D7 */, /*5080*/"CHEROKEE LETTER TI"/* 13D8 */,/*5081*/"CHEROKEE LETTER DO"/* 13D9 */,/*5082*/"CHEROKEE LETTER DU"/* 13DA */, /*5083*/"CHEROKEE LETTER DV"/* 13DB */,/*5084*/"CHEROKEE LETTER DLA"/* 13DC */,/*5085*/"CHEROKEE LETTER TLA"/* 13DD */, /*5086*/"CHEROKEE LETTER TLE"/* 13DE */,/*5087*/"CHEROKEE LETTER TLI"/* 13DF */,/*5088*/"CHEROKEE LETTER TLO"/* 13E0 */, /*5089*/"CHEROKEE LETTER TLU"/* 13E1 */,/*5090*/"CHEROKEE LETTER TLV"/* 13E2 */,/*5091*/"CHEROKEE LETTER TSA"/* 13E3 */, /*5092*/"CHEROKEE LETTER TSE"/* 13E4 */,/*5093*/"CHEROKEE LETTER TSI"/* 13E5 */,/*5094*/"CHEROKEE LETTER TSO"/* 13E6 */, /*5095*/"CHEROKEE LETTER TSU"/* 13E7 */,/*5096*/"CHEROKEE LETTER TSV"/* 13E8 */,/*5097*/"CHEROKEE LETTER WA"/* 13E9 */, /*5098*/"CHEROKEE LETTER WE"/* 13EA */,/*5099*/"CHEROKEE LETTER WI"/* 13EB */,/*5100*/"CHEROKEE LETTER WO"/* 13EC */, /*5101*/"CHEROKEE LETTER WU"/* 13ED */,/*5102*/"CHEROKEE LETTER WV"/* 13EE */,/*5103*/"CHEROKEE LETTER YA"/* 13EF */, /*5104*/"CHEROKEE LETTER YE"/* 13F0 */,/*5105*/"CHEROKEE LETTER YI"/* 13F1 */,/*5106*/"CHEROKEE LETTER YO"/* 13F2 */, /*5107*/"CHEROKEE LETTER YU"/* 13F3 */,/*5108*/"CHEROKEE LETTER YV"/* 13F4 */,/*5109*/"CHEROKEE LETTER MV"/* 13F5 */, NULL,NULL,/*5112*/"CHEROKEE SMALL LETTER YE"/* 13F8 */,/*5113*/"CHEROKEE SMALL LETTER YI"/* 13F9 */, /*5114*/"CHEROKEE SMALL LETTER YO"/* 13FA */,/*5115*/"CHEROKEE SMALL LETTER YU"/* 13FB */, /*5116*/"CHEROKEE SMALL LETTER YV"/* 13FC */,/*5117*/"CHEROKEE SMALL LETTER MV"/* 13FD */,NULL,NULL, /*5120*/"CANADIAN SYLLABICS HYPHEN"/* 1400 */,/*5121*/"CANADIAN SYLLABICS E"/* 1401 */, /*5122*/"CANADIAN SYLLABICS AAI"/* 1402 */,/*5123*/"CANADIAN SYLLABICS I"/* 1403 */, /*5124*/"CANADIAN SYLLABICS II"/* 1404 */,/*5125*/"CANADIAN SYLLABICS O"/* 1405 */, /*5126*/"CANADIAN SYLLABICS OO"/* 1406 */,/*5127*/"CANADIAN SYLLABICS Y-CREE OO"/* 1407 */, /*5128*/"CANADIAN SYLLABICS CARRIER EE"/* 1408 */,/*5129*/"CANADIAN SYLLABICS CARRIER I"/* 1409 */, /*5130*/"CANADIAN SYLLABICS A"/* 140A */,/*5131*/"CANADIAN SYLLABICS AA"/* 140B */, /*5132*/"CANADIAN SYLLABICS WE"/* 140C */,/*5133*/"CANADIAN SYLLABICS WEST-CREE WE"/* 140D */, /*5134*/"CANADIAN SYLLABICS WI"/* 140E */,/*5135*/"CANADIAN SYLLABICS WEST-CREE WI"/* 140F */, /*5136*/"CANADIAN SYLLABICS WII"/* 1410 */,/*5137*/"CANADIAN SYLLABICS WEST-CREE WII"/* 1411 */, /*5138*/"CANADIAN SYLLABICS WO"/* 1412 */,/*5139*/"CANADIAN SYLLABICS WEST-CREE WO"/* 1413 */, /*5140*/"CANADIAN SYLLABICS WOO"/* 1414 */,/*5141*/"CANADIAN SYLLABICS WEST-CREE WOO"/* 1415 */, /*5142*/"CANADIAN SYLLABICS NASKAPI WOO"/* 1416 */,/*5143*/"CANADIAN SYLLABICS WA"/* 1417 */, /*5144*/"CANADIAN SYLLABICS WEST-CREE WA"/* 1418 */,/*5145*/"CANADIAN SYLLABICS WAA"/* 1419 */, /*5146*/"CANADIAN SYLLABICS WEST-CREE WAA"/* 141A */,/*5147*/"CANADIAN SYLLABICS NASKAPI WAA"/* 141B */, /*5148*/"CANADIAN SYLLABICS AI"/* 141C */,/*5149*/"CANADIAN SYLLABICS Y-CREE W"/* 141D */, /*5150*/"CANADIAN SYLLABICS GLOTTAL STOP"/* 141E */,/*5151*/"CANADIAN SYLLABICS FINAL ACUTE"/* 141F */, /*5152*/"CANADIAN SYLLABICS FINAL GRAVE"/* 1420 */,/*5153*/"CANADIAN SYLLABICS FINAL BOTTOM HALF RING"/* 1421 */, /*5154*/"CANADIAN SYLLABICS FINAL TOP HALF RING"/* 1422 */,/*5155*/"CANADIAN SYLLABICS FINAL RIGHT HALF RING"/* 1423 */, /*5156*/"CANADIAN SYLLABICS FINAL RING"/* 1424 */,/*5157*/"CANADIAN SYLLABICS FINAL DOUBLE ACUTE"/* 1425 */, /*5158*/"CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES"/* 1426 */, /*5159*/"CANADIAN SYLLABICS FINAL MIDDLE DOT"/* 1427 */, /*5160*/"CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE"/* 1428 */,/*5161*/"CANADIAN SYLLABICS FINAL PLUS"/* 1429 */, /*5162*/"CANADIAN SYLLABICS FINAL DOWN TACK"/* 142A */,/*5163*/"CANADIAN SYLLABICS EN"/* 142B */, /*5164*/"CANADIAN SYLLABICS IN"/* 142C */,/*5165*/"CANADIAN SYLLABICS ON"/* 142D */, /*5166*/"CANADIAN SYLLABICS AN"/* 142E */,/*5167*/"CANADIAN SYLLABICS PE"/* 142F */, /*5168*/"CANADIAN SYLLABICS PAAI"/* 1430 */,/*5169*/"CANADIAN SYLLABICS PI"/* 1431 */, /*5170*/"CANADIAN SYLLABICS PII"/* 1432 */,/*5171*/"CANADIAN SYLLABICS PO"/* 1433 */, /*5172*/"CANADIAN SYLLABICS POO"/* 1434 */,/*5173*/"CANADIAN SYLLABICS Y-CREE POO"/* 1435 */, /*5174*/"CANADIAN SYLLABICS CARRIER HEE"/* 1436 */,/*5175*/"CANADIAN SYLLABICS CARRIER HI"/* 1437 */, /*5176*/"CANADIAN SYLLABICS PA"/* 1438 */,/*5177*/"CANADIAN SYLLABICS PAA"/* 1439 */, /*5178*/"CANADIAN SYLLABICS PWE"/* 143A */,/*5179*/"CANADIAN SYLLABICS WEST-CREE PWE"/* 143B */, /*5180*/"CANADIAN SYLLABICS PWI"/* 143C */,/*5181*/"CANADIAN SYLLABICS WEST-CREE PWI"/* 143D */, /*5182*/"CANADIAN SYLLABICS PWII"/* 143E */,/*5183*/"CANADIAN SYLLABICS WEST-CREE PWII"/* 143F */, /*5184*/"CANADIAN SYLLABICS PWO"/* 1440 */,/*5185*/"CANADIAN SYLLABICS WEST-CREE PWO"/* 1441 */, /*5186*/"CANADIAN SYLLABICS PWOO"/* 1442 */,/*5187*/"CANADIAN SYLLABICS WEST-CREE PWOO"/* 1443 */, /*5188*/"CANADIAN SYLLABICS PWA"/* 1444 */,/*5189*/"CANADIAN SYLLABICS WEST-CREE PWA"/* 1445 */, /*5190*/"CANADIAN SYLLABICS PWAA"/* 1446 */,/*5191*/"CANADIAN SYLLABICS WEST-CREE PWAA"/* 1447 */, /*5192*/"CANADIAN SYLLABICS Y-CREE PWAA"/* 1448 */,/*5193*/"CANADIAN SYLLABICS P"/* 1449 */, /*5194*/"CANADIAN SYLLABICS WEST-CREE P"/* 144A */,/*5195*/"CANADIAN SYLLABICS CARRIER H"/* 144B */, /*5196*/"CANADIAN SYLLABICS TE"/* 144C */,/*5197*/"CANADIAN SYLLABICS TAAI"/* 144D */, /*5198*/"CANADIAN SYLLABICS TI"/* 144E */,/*5199*/"CANADIAN SYLLABICS TII"/* 144F */, /*5200*/"CANADIAN SYLLABICS TO"/* 1450 */,/*5201*/"CANADIAN SYLLABICS TOO"/* 1451 */, /*5202*/"CANADIAN SYLLABICS Y-CREE TOO"/* 1452 */,/*5203*/"CANADIAN SYLLABICS CARRIER DEE"/* 1453 */, /*5204*/"CANADIAN SYLLABICS CARRIER DI"/* 1454 */,/*5205*/"CANADIAN SYLLABICS TA"/* 1455 */, /*5206*/"CANADIAN SYLLABICS TAA"/* 1456 */,/*5207*/"CANADIAN SYLLABICS TWE"/* 1457 */, /*5208*/"CANADIAN SYLLABICS WEST-CREE TWE"/* 1458 */,/*5209*/"CANADIAN SYLLABICS TWI"/* 1459 */, /*5210*/"CANADIAN SYLLABICS WEST-CREE TWI"/* 145A */,/*5211*/"CANADIAN SYLLABICS TWII"/* 145B */, /*5212*/"CANADIAN SYLLABICS WEST-CREE TWII"/* 145C */,/*5213*/"CANADIAN SYLLABICS TWO"/* 145D */, /*5214*/"CANADIAN SYLLABICS WEST-CREE TWO"/* 145E */,/*5215*/"CANADIAN SYLLABICS TWOO"/* 145F */, /*5216*/"CANADIAN SYLLABICS WEST-CREE TWOO"/* 1460 */,/*5217*/"CANADIAN SYLLABICS TWA"/* 1461 */, /*5218*/"CANADIAN SYLLABICS WEST-CREE TWA"/* 1462 */,/*5219*/"CANADIAN SYLLABICS TWAA"/* 1463 */, /*5220*/"CANADIAN SYLLABICS WEST-CREE TWAA"/* 1464 */,/*5221*/"CANADIAN SYLLABICS NASKAPI TWAA"/* 1465 */, /*5222*/"CANADIAN SYLLABICS T"/* 1466 */,/*5223*/"CANADIAN SYLLABICS TTE"/* 1467 */, /*5224*/"CANADIAN SYLLABICS TTI"/* 1468 */,/*5225*/"CANADIAN SYLLABICS TTO"/* 1469 */, /*5226*/"CANADIAN SYLLABICS TTA"/* 146A */,/*5227*/"CANADIAN SYLLABICS KE"/* 146B */, /*5228*/"CANADIAN SYLLABICS KAAI"/* 146C */,/*5229*/"CANADIAN SYLLABICS KI"/* 146D */, /*5230*/"CANADIAN SYLLABICS KII"/* 146E */,/*5231*/"CANADIAN SYLLABICS KO"/* 146F */, /*5232*/"CANADIAN SYLLABICS KOO"/* 1470 */,/*5233*/"CANADIAN SYLLABICS Y-CREE KOO"/* 1471 */, /*5234*/"CANADIAN SYLLABICS KA"/* 1472 */,/*5235*/"CANADIAN SYLLABICS KAA"/* 1473 */, /*5236*/"CANADIAN SYLLABICS KWE"/* 1474 */,/*5237*/"CANADIAN SYLLABICS WEST-CREE KWE"/* 1475 */, /*5238*/"CANADIAN SYLLABICS KWI"/* 1476 */,/*5239*/"CANADIAN SYLLABICS WEST-CREE KWI"/* 1477 */, /*5240*/"CANADIAN SYLLABICS KWII"/* 1478 */,/*5241*/"CANADIAN SYLLABICS WEST-CREE KWII"/* 1479 */, /*5242*/"CANADIAN SYLLABICS KWO"/* 147A */,/*5243*/"CANADIAN SYLLABICS WEST-CREE KWO"/* 147B */, /*5244*/"CANADIAN SYLLABICS KWOO"/* 147C */,/*5245*/"CANADIAN SYLLABICS WEST-CREE KWOO"/* 147D */, /*5246*/"CANADIAN SYLLABICS KWA"/* 147E */,/*5247*/"CANADIAN SYLLABICS WEST-CREE KWA"/* 147F */, /*5248*/"CANADIAN SYLLABICS KWAA"/* 1480 */,/*5249*/"CANADIAN SYLLABICS WEST-CREE KWAA"/* 1481 */, /*5250*/"CANADIAN SYLLABICS NASKAPI KWAA"/* 1482 */,/*5251*/"CANADIAN SYLLABICS K"/* 1483 */, /*5252*/"CANADIAN SYLLABICS KW"/* 1484 */,/*5253*/"CANADIAN SYLLABICS SOUTH-SLAVEY KEH"/* 1485 */, /*5254*/"CANADIAN SYLLABICS SOUTH-SLAVEY KIH"/* 1486 */,/*5255*/"CANADIAN SYLLABICS SOUTH-SLAVEY KOH"/* 1487 */, /*5256*/"CANADIAN SYLLABICS SOUTH-SLAVEY KAH"/* 1488 */,/*5257*/"CANADIAN SYLLABICS CE"/* 1489 */, /*5258*/"CANADIAN SYLLABICS CAAI"/* 148A */,/*5259*/"CANADIAN SYLLABICS CI"/* 148B */, /*5260*/"CANADIAN SYLLABICS CII"/* 148C */,/*5261*/"CANADIAN SYLLABICS CO"/* 148D */, /*5262*/"CANADIAN SYLLABICS COO"/* 148E */,/*5263*/"CANADIAN SYLLABICS Y-CREE COO"/* 148F */, /*5264*/"CANADIAN SYLLABICS CA"/* 1490 */,/*5265*/"CANADIAN SYLLABICS CAA"/* 1491 */, /*5266*/"CANADIAN SYLLABICS CWE"/* 1492 */,/*5267*/"CANADIAN SYLLABICS WEST-CREE CWE"/* 1493 */, /*5268*/"CANADIAN SYLLABICS CWI"/* 1494 */,/*5269*/"CANADIAN SYLLABICS WEST-CREE CWI"/* 1495 */, /*5270*/"CANADIAN SYLLABICS CWII"/* 1496 */,/*5271*/"CANADIAN SYLLABICS WEST-CREE CWII"/* 1497 */, /*5272*/"CANADIAN SYLLABICS CWO"/* 1498 */,/*5273*/"CANADIAN SYLLABICS WEST-CREE CWO"/* 1499 */, /*5274*/"CANADIAN SYLLABICS CWOO"/* 149A */,/*5275*/"CANADIAN SYLLABICS WEST-CREE CWOO"/* 149B */, /*5276*/"CANADIAN SYLLABICS CWA"/* 149C */,/*5277*/"CANADIAN SYLLABICS WEST-CREE CWA"/* 149D */, /*5278*/"CANADIAN SYLLABICS CWAA"/* 149E */,/*5279*/"CANADIAN SYLLABICS WEST-CREE CWAA"/* 149F */, /*5280*/"CANADIAN SYLLABICS NASKAPI CWAA"/* 14A0 */,/*5281*/"CANADIAN SYLLABICS C"/* 14A1 */, /*5282*/"CANADIAN SYLLABICS SAYISI TH"/* 14A2 */,/*5283*/"CANADIAN SYLLABICS ME"/* 14A3 */, /*5284*/"CANADIAN SYLLABICS MAAI"/* 14A4 */,/*5285*/"CANADIAN SYLLABICS MI"/* 14A5 */, /*5286*/"CANADIAN SYLLABICS MII"/* 14A6 */,/*5287*/"CANADIAN SYLLABICS MO"/* 14A7 */, /*5288*/"CANADIAN SYLLABICS MOO"/* 14A8 */,/*5289*/"CANADIAN SYLLABICS Y-CREE MOO"/* 14A9 */, /*5290*/"CANADIAN SYLLABICS MA"/* 14AA */,/*5291*/"CANADIAN SYLLABICS MAA"/* 14AB */, /*5292*/"CANADIAN SYLLABICS MWE"/* 14AC */,/*5293*/"CANADIAN SYLLABICS WEST-CREE MWE"/* 14AD */, /*5294*/"CANADIAN SYLLABICS MWI"/* 14AE */,/*5295*/"CANADIAN SYLLABICS WEST-CREE MWI"/* 14AF */, /*5296*/"CANADIAN SYLLABICS MWII"/* 14B0 */,/*5297*/"CANADIAN SYLLABICS WEST-CREE MWII"/* 14B1 */, /*5298*/"CANADIAN SYLLABICS MWO"/* 14B2 */,/*5299*/"CANADIAN SYLLABICS WEST-CREE MWO"/* 14B3 */, /*5300*/"CANADIAN SYLLABICS MWOO"/* 14B4 */,/*5301*/"CANADIAN SYLLABICS WEST-CREE MWOO"/* 14B5 */, /*5302*/"CANADIAN SYLLABICS MWA"/* 14B6 */,/*5303*/"CANADIAN SYLLABICS WEST-CREE MWA"/* 14B7 */, /*5304*/"CANADIAN SYLLABICS MWAA"/* 14B8 */,/*5305*/"CANADIAN SYLLABICS WEST-CREE MWAA"/* 14B9 */, /*5306*/"CANADIAN SYLLABICS NASKAPI MWAA"/* 14BA */,/*5307*/"CANADIAN SYLLABICS M"/* 14BB */, /*5308*/"CANADIAN SYLLABICS WEST-CREE M"/* 14BC */,/*5309*/"CANADIAN SYLLABICS MH"/* 14BD */, /*5310*/"CANADIAN SYLLABICS ATHAPASCAN M"/* 14BE */,/*5311*/"CANADIAN SYLLABICS SAYISI M"/* 14BF */, /*5312*/"CANADIAN SYLLABICS NE"/* 14C0 */,/*5313*/"CANADIAN SYLLABICS NAAI"/* 14C1 */, /*5314*/"CANADIAN SYLLABICS NI"/* 14C2 */,/*5315*/"CANADIAN SYLLABICS NII"/* 14C3 */, /*5316*/"CANADIAN SYLLABICS NO"/* 14C4 */,/*5317*/"CANADIAN SYLLABICS NOO"/* 14C5 */, /*5318*/"CANADIAN SYLLABICS Y-CREE NOO"/* 14C6 */,/*5319*/"CANADIAN SYLLABICS NA"/* 14C7 */, /*5320*/"CANADIAN SYLLABICS NAA"/* 14C8 */,/*5321*/"CANADIAN SYLLABICS NWE"/* 14C9 */, /*5322*/"CANADIAN SYLLABICS WEST-CREE NWE"/* 14CA */,/*5323*/"CANADIAN SYLLABICS NWA"/* 14CB */, /*5324*/"CANADIAN SYLLABICS WEST-CREE NWA"/* 14CC */,/*5325*/"CANADIAN SYLLABICS NWAA"/* 14CD */, /*5326*/"CANADIAN SYLLABICS WEST-CREE NWAA"/* 14CE */,/*5327*/"CANADIAN SYLLABICS NASKAPI NWAA"/* 14CF */, /*5328*/"CANADIAN SYLLABICS N"/* 14D0 */,/*5329*/"CANADIAN SYLLABICS CARRIER NG"/* 14D1 */, /*5330*/"CANADIAN SYLLABICS NH"/* 14D2 */,/*5331*/"CANADIAN SYLLABICS LE"/* 14D3 */, /*5332*/"CANADIAN SYLLABICS LAAI"/* 14D4 */,/*5333*/"CANADIAN SYLLABICS LI"/* 14D5 */, /*5334*/"CANADIAN SYLLABICS LII"/* 14D6 */,/*5335*/"CANADIAN SYLLABICS LO"/* 14D7 */, /*5336*/"CANADIAN SYLLABICS LOO"/* 14D8 */,/*5337*/"CANADIAN SYLLABICS Y-CREE LOO"/* 14D9 */, /*5338*/"CANADIAN SYLLABICS LA"/* 14DA */,/*5339*/"CANADIAN SYLLABICS LAA"/* 14DB */, /*5340*/"CANADIAN SYLLABICS LWE"/* 14DC */,/*5341*/"CANADIAN SYLLABICS WEST-CREE LWE"/* 14DD */, /*5342*/"CANADIAN SYLLABICS LWI"/* 14DE */,/*5343*/"CANADIAN SYLLABICS WEST-CREE LWI"/* 14DF */, /*5344*/"CANADIAN SYLLABICS LWII"/* 14E0 */,/*5345*/"CANADIAN SYLLABICS WEST-CREE LWII"/* 14E1 */, /*5346*/"CANADIAN SYLLABICS LWO"/* 14E2 */,/*5347*/"CANADIAN SYLLABICS WEST-CREE LWO"/* 14E3 */, /*5348*/"CANADIAN SYLLABICS LWOO"/* 14E4 */,/*5349*/"CANADIAN SYLLABICS WEST-CREE LWOO"/* 14E5 */, /*5350*/"CANADIAN SYLLABICS LWA"/* 14E6 */,/*5351*/"CANADIAN SYLLABICS WEST-CREE LWA"/* 14E7 */, /*5352*/"CANADIAN SYLLABICS LWAA"/* 14E8 */,/*5353*/"CANADIAN SYLLABICS WEST-CREE LWAA"/* 14E9 */, /*5354*/"CANADIAN SYLLABICS L"/* 14EA */,/*5355*/"CANADIAN SYLLABICS WEST-CREE L"/* 14EB */, /*5356*/"CANADIAN SYLLABICS MEDIAL L"/* 14EC */,/*5357*/"CANADIAN SYLLABICS SE"/* 14ED */, /*5358*/"CANADIAN SYLLABICS SAAI"/* 14EE */,/*5359*/"CANADIAN SYLLABICS SI"/* 14EF */, /*5360*/"CANADIAN SYLLABICS SII"/* 14F0 */,/*5361*/"CANADIAN SYLLABICS SO"/* 14F1 */, /*5362*/"CANADIAN SYLLABICS SOO"/* 14F2 */,/*5363*/"CANADIAN SYLLABICS Y-CREE SOO"/* 14F3 */, /*5364*/"CANADIAN SYLLABICS SA"/* 14F4 */,/*5365*/"CANADIAN SYLLABICS SAA"/* 14F5 */, /*5366*/"CANADIAN SYLLABICS SWE"/* 14F6 */,/*5367*/"CANADIAN SYLLABICS WEST-CREE SWE"/* 14F7 */, /*5368*/"CANADIAN SYLLABICS SWI"/* 14F8 */,/*5369*/"CANADIAN SYLLABICS WEST-CREE SWI"/* 14F9 */, /*5370*/"CANADIAN SYLLABICS SWII"/* 14FA */,/*5371*/"CANADIAN SYLLABICS WEST-CREE SWII"/* 14FB */, /*5372*/"CANADIAN SYLLABICS SWO"/* 14FC */,/*5373*/"CANADIAN SYLLABICS WEST-CREE SWO"/* 14FD */, /*5374*/"CANADIAN SYLLABICS SWOO"/* 14FE */,/*5375*/"CANADIAN SYLLABICS WEST-CREE SWOO"/* 14FF */, /*5376*/"CANADIAN SYLLABICS SWA"/* 1500 */,/*5377*/"CANADIAN SYLLABICS WEST-CREE SWA"/* 1501 */, /*5378*/"CANADIAN SYLLABICS SWAA"/* 1502 */,/*5379*/"CANADIAN SYLLABICS WEST-CREE SWAA"/* 1503 */, /*5380*/"CANADIAN SYLLABICS NASKAPI SWAA"/* 1504 */,/*5381*/"CANADIAN SYLLABICS S"/* 1505 */, /*5382*/"CANADIAN SYLLABICS ATHAPASCAN S"/* 1506 */,/*5383*/"CANADIAN SYLLABICS SW"/* 1507 */, /*5384*/"CANADIAN SYLLABICS BLACKFOOT S"/* 1508 */,/*5385*/"CANADIAN SYLLABICS MOOSE-CREE SK"/* 1509 */, /*5386*/"CANADIAN SYLLABICS NASKAPI SKW"/* 150A */,/*5387*/"CANADIAN SYLLABICS NASKAPI S-W"/* 150B */, /*5388*/"CANADIAN SYLLABICS NASKAPI SPWA"/* 150C */,/*5389*/"CANADIAN SYLLABICS NASKAPI STWA"/* 150D */, /*5390*/"CANADIAN SYLLABICS NASKAPI SKWA"/* 150E */,/*5391*/"CANADIAN SYLLABICS NASKAPI SCWA"/* 150F */, /*5392*/"CANADIAN SYLLABICS SHE"/* 1510 */,/*5393*/"CANADIAN SYLLABICS SHI"/* 1511 */, /*5394*/"CANADIAN SYLLABICS SHII"/* 1512 */,/*5395*/"CANADIAN SYLLABICS SHO"/* 1513 */, /*5396*/"CANADIAN SYLLABICS SHOO"/* 1514 */,/*5397*/"CANADIAN SYLLABICS SHA"/* 1515 */, /*5398*/"CANADIAN SYLLABICS SHAA"/* 1516 */,/*5399*/"CANADIAN SYLLABICS SHWE"/* 1517 */, /*5400*/"CANADIAN SYLLABICS WEST-CREE SHWE"/* 1518 */,/*5401*/"CANADIAN SYLLABICS SHWI"/* 1519 */, /*5402*/"CANADIAN SYLLABICS WEST-CREE SHWI"/* 151A */,/*5403*/"CANADIAN SYLLABICS SHWII"/* 151B */, /*5404*/"CANADIAN SYLLABICS WEST-CREE SHWII"/* 151C */,/*5405*/"CANADIAN SYLLABICS SHWO"/* 151D */, /*5406*/"CANADIAN SYLLABICS WEST-CREE SHWO"/* 151E */,/*5407*/"CANADIAN SYLLABICS SHWOO"/* 151F */, /*5408*/"CANADIAN SYLLABICS WEST-CREE SHWOO"/* 1520 */,/*5409*/"CANADIAN SYLLABICS SHWA"/* 1521 */, /*5410*/"CANADIAN SYLLABICS WEST-CREE SHWA"/* 1522 */,/*5411*/"CANADIAN SYLLABICS SHWAA"/* 1523 */, /*5412*/"CANADIAN SYLLABICS WEST-CREE SHWAA"/* 1524 */,/*5413*/"CANADIAN SYLLABICS SH"/* 1525 */, /*5414*/"CANADIAN SYLLABICS YE"/* 1526 */,/*5415*/"CANADIAN SYLLABICS YAAI"/* 1527 */, /*5416*/"CANADIAN SYLLABICS YI"/* 1528 */,/*5417*/"CANADIAN SYLLABICS YII"/* 1529 */, /*5418*/"CANADIAN SYLLABICS YO"/* 152A */,/*5419*/"CANADIAN SYLLABICS YOO"/* 152B */, /*5420*/"CANADIAN SYLLABICS Y-CREE YOO"/* 152C */,/*5421*/"CANADIAN SYLLABICS YA"/* 152D */, /*5422*/"CANADIAN SYLLABICS YAA"/* 152E */,/*5423*/"CANADIAN SYLLABICS YWE"/* 152F */, /*5424*/"CANADIAN SYLLABICS WEST-CREE YWE"/* 1530 */,/*5425*/"CANADIAN SYLLABICS YWI"/* 1531 */, /*5426*/"CANADIAN SYLLABICS WEST-CREE YWI"/* 1532 */,/*5427*/"CANADIAN SYLLABICS YWII"/* 1533 */, /*5428*/"CANADIAN SYLLABICS WEST-CREE YWII"/* 1534 */,/*5429*/"CANADIAN SYLLABICS YWO"/* 1535 */, /*5430*/"CANADIAN SYLLABICS WEST-CREE YWO"/* 1536 */,/*5431*/"CANADIAN SYLLABICS YWOO"/* 1537 */, /*5432*/"CANADIAN SYLLABICS WEST-CREE YWOO"/* 1538 */,/*5433*/"CANADIAN SYLLABICS YWA"/* 1539 */, /*5434*/"CANADIAN SYLLABICS WEST-CREE YWA"/* 153A */,/*5435*/"CANADIAN SYLLABICS YWAA"/* 153B */, /*5436*/"CANADIAN SYLLABICS WEST-CREE YWAA"/* 153C */,/*5437*/"CANADIAN SYLLABICS NASKAPI YWAA"/* 153D */, /*5438*/"CANADIAN SYLLABICS Y"/* 153E */,/*5439*/"CANADIAN SYLLABICS BIBLE-CREE Y"/* 153F */, /*5440*/"CANADIAN SYLLABICS WEST-CREE Y"/* 1540 */,/*5441*/"CANADIAN SYLLABICS SAYISI YI"/* 1541 */, /*5442*/"CANADIAN SYLLABICS RE"/* 1542 */,/*5443*/"CANADIAN SYLLABICS R-CREE RE"/* 1543 */, /*5444*/"CANADIAN SYLLABICS WEST-CREE LE"/* 1544 */,/*5445*/"CANADIAN SYLLABICS RAAI"/* 1545 */, /*5446*/"CANADIAN SYLLABICS RI"/* 1546 */,/*5447*/"CANADIAN SYLLABICS RII"/* 1547 */, /*5448*/"CANADIAN SYLLABICS RO"/* 1548 */,/*5449*/"CANADIAN SYLLABICS ROO"/* 1549 */, /*5450*/"CANADIAN SYLLABICS WEST-CREE LO"/* 154A */,/*5451*/"CANADIAN SYLLABICS RA"/* 154B */, /*5452*/"CANADIAN SYLLABICS RAA"/* 154C */,/*5453*/"CANADIAN SYLLABICS WEST-CREE LA"/* 154D */, /*5454*/"CANADIAN SYLLABICS RWAA"/* 154E */,/*5455*/"CANADIAN SYLLABICS WEST-CREE RWAA"/* 154F */, /*5456*/"CANADIAN SYLLABICS R"/* 1550 */,/*5457*/"CANADIAN SYLLABICS WEST-CREE R"/* 1551 */, /*5458*/"CANADIAN SYLLABICS MEDIAL R"/* 1552 */,/*5459*/"CANADIAN SYLLABICS FE"/* 1553 */, /*5460*/"CANADIAN SYLLABICS FAAI"/* 1554 */,/*5461*/"CANADIAN SYLLABICS FI"/* 1555 */, /*5462*/"CANADIAN SYLLABICS FII"/* 1556 */,/*5463*/"CANADIAN SYLLABICS FO"/* 1557 */, /*5464*/"CANADIAN SYLLABICS FOO"/* 1558 */,/*5465*/"CANADIAN SYLLABICS FA"/* 1559 */, /*5466*/"CANADIAN SYLLABICS FAA"/* 155A */,/*5467*/"CANADIAN SYLLABICS FWAA"/* 155B */, /*5468*/"CANADIAN SYLLABICS WEST-CREE FWAA"/* 155C */,/*5469*/"CANADIAN SYLLABICS F"/* 155D */, /*5470*/"CANADIAN SYLLABICS THE"/* 155E */,/*5471*/"CANADIAN SYLLABICS N-CREE THE"/* 155F */, /*5472*/"CANADIAN SYLLABICS THI"/* 1560 */,/*5473*/"CANADIAN SYLLABICS N-CREE THI"/* 1561 */, /*5474*/"CANADIAN SYLLABICS THII"/* 1562 */,/*5475*/"CANADIAN SYLLABICS N-CREE THII"/* 1563 */, /*5476*/"CANADIAN SYLLABICS THO"/* 1564 */,/*5477*/"CANADIAN SYLLABICS THOO"/* 1565 */, /*5478*/"CANADIAN SYLLABICS THA"/* 1566 */,/*5479*/"CANADIAN SYLLABICS THAA"/* 1567 */, /*5480*/"CANADIAN SYLLABICS THWAA"/* 1568 */,/*5481*/"CANADIAN SYLLABICS WEST-CREE THWAA"/* 1569 */, /*5482*/"CANADIAN SYLLABICS TH"/* 156A */,/*5483*/"CANADIAN SYLLABICS TTHE"/* 156B */, /*5484*/"CANADIAN SYLLABICS TTHI"/* 156C */,/*5485*/"CANADIAN SYLLABICS TTHO"/* 156D */, /*5486*/"CANADIAN SYLLABICS TTHA"/* 156E */,/*5487*/"CANADIAN SYLLABICS TTH"/* 156F */, /*5488*/"CANADIAN SYLLABICS TYE"/* 1570 */,/*5489*/"CANADIAN SYLLABICS TYI"/* 1571 */, /*5490*/"CANADIAN SYLLABICS TYO"/* 1572 */,/*5491*/"CANADIAN SYLLABICS TYA"/* 1573 */, /*5492*/"CANADIAN SYLLABICS NUNAVIK HE"/* 1574 */,/*5493*/"CANADIAN SYLLABICS NUNAVIK HI"/* 1575 */, /*5494*/"CANADIAN SYLLABICS NUNAVIK HII"/* 1576 */,/*5495*/"CANADIAN SYLLABICS NUNAVIK HO"/* 1577 */, /*5496*/"CANADIAN SYLLABICS NUNAVIK HOO"/* 1578 */,/*5497*/"CANADIAN SYLLABICS NUNAVIK HA"/* 1579 */, /*5498*/"CANADIAN SYLLABICS NUNAVIK HAA"/* 157A */,/*5499*/"CANADIAN SYLLABICS NUNAVIK H"/* 157B */, /*5500*/"CANADIAN SYLLABICS NUNAVUT H"/* 157C */,/*5501*/"CANADIAN SYLLABICS HK"/* 157D */, /*5502*/"CANADIAN SYLLABICS QAAI"/* 157E */,/*5503*/"CANADIAN SYLLABICS QI"/* 157F */, /*5504*/"CANADIAN SYLLABICS QII"/* 1580 */,/*5505*/"CANADIAN SYLLABICS QO"/* 1581 */, /*5506*/"CANADIAN SYLLABICS QOO"/* 1582 */,/*5507*/"CANADIAN SYLLABICS QA"/* 1583 */, /*5508*/"CANADIAN SYLLABICS QAA"/* 1584 */,/*5509*/"CANADIAN SYLLABICS Q"/* 1585 */, /*5510*/"CANADIAN SYLLABICS TLHE"/* 1586 */,/*5511*/"CANADIAN SYLLABICS TLHI"/* 1587 */, /*5512*/"CANADIAN SYLLABICS TLHO"/* 1588 */,/*5513*/"CANADIAN SYLLABICS TLHA"/* 1589 */, /*5514*/"CANADIAN SYLLABICS WEST-CREE RE"/* 158A */,/*5515*/"CANADIAN SYLLABICS WEST-CREE RI"/* 158B */, /*5516*/"CANADIAN SYLLABICS WEST-CREE RO"/* 158C */,/*5517*/"CANADIAN SYLLABICS WEST-CREE RA"/* 158D */, /*5518*/"CANADIAN SYLLABICS NGAAI"/* 158E */,/*5519*/"CANADIAN SYLLABICS NGI"/* 158F */, /*5520*/"CANADIAN SYLLABICS NGII"/* 1590 */,/*5521*/"CANADIAN SYLLABICS NGO"/* 1591 */, /*5522*/"CANADIAN SYLLABICS NGOO"/* 1592 */,/*5523*/"CANADIAN SYLLABICS NGA"/* 1593 */, /*5524*/"CANADIAN SYLLABICS NGAA"/* 1594 */,/*5525*/"CANADIAN SYLLABICS NG"/* 1595 */, /*5526*/"CANADIAN SYLLABICS NNG"/* 1596 */,/*5527*/"CANADIAN SYLLABICS SAYISI SHE"/* 1597 */, /*5528*/"CANADIAN SYLLABICS SAYISI SHI"/* 1598 */,/*5529*/"CANADIAN SYLLABICS SAYISI SHO"/* 1599 */, /*5530*/"CANADIAN SYLLABICS SAYISI SHA"/* 159A */,/*5531*/"CANADIAN SYLLABICS WOODS-CREE THE"/* 159B */, /*5532*/"CANADIAN SYLLABICS WOODS-CREE THI"/* 159C */,/*5533*/"CANADIAN SYLLABICS WOODS-CREE THO"/* 159D */, /*5534*/"CANADIAN SYLLABICS WOODS-CREE THA"/* 159E */,/*5535*/"CANADIAN SYLLABICS WOODS-CREE TH"/* 159F */, /*5536*/"CANADIAN SYLLABICS LHI"/* 15A0 */,/*5537*/"CANADIAN SYLLABICS LHII"/* 15A1 */, /*5538*/"CANADIAN SYLLABICS LHO"/* 15A2 */,/*5539*/"CANADIAN SYLLABICS LHOO"/* 15A3 */, /*5540*/"CANADIAN SYLLABICS LHA"/* 15A4 */,/*5541*/"CANADIAN SYLLABICS LHAA"/* 15A5 */, /*5542*/"CANADIAN SYLLABICS LH"/* 15A6 */,/*5543*/"CANADIAN SYLLABICS TH-CREE THE"/* 15A7 */, /*5544*/"CANADIAN SYLLABICS TH-CREE THI"/* 15A8 */,/*5545*/"CANADIAN SYLLABICS TH-CREE THII"/* 15A9 */, /*5546*/"CANADIAN SYLLABICS TH-CREE THO"/* 15AA */,/*5547*/"CANADIAN SYLLABICS TH-CREE THOO"/* 15AB */, /*5548*/"CANADIAN SYLLABICS TH-CREE THA"/* 15AC */,/*5549*/"CANADIAN SYLLABICS TH-CREE THAA"/* 15AD */, /*5550*/"CANADIAN SYLLABICS TH-CREE TH"/* 15AE */,/*5551*/"CANADIAN SYLLABICS AIVILIK B"/* 15AF */, /*5552*/"CANADIAN SYLLABICS BLACKFOOT E"/* 15B0 */,/*5553*/"CANADIAN SYLLABICS BLACKFOOT I"/* 15B1 */, /*5554*/"CANADIAN SYLLABICS BLACKFOOT O"/* 15B2 */,/*5555*/"CANADIAN SYLLABICS BLACKFOOT A"/* 15B3 */, /*5556*/"CANADIAN SYLLABICS BLACKFOOT WE"/* 15B4 */,/*5557*/"CANADIAN SYLLABICS BLACKFOOT WI"/* 15B5 */, /*5558*/"CANADIAN SYLLABICS BLACKFOOT WO"/* 15B6 */,/*5559*/"CANADIAN SYLLABICS BLACKFOOT WA"/* 15B7 */, /*5560*/"CANADIAN SYLLABICS BLACKFOOT NE"/* 15B8 */,/*5561*/"CANADIAN SYLLABICS BLACKFOOT NI"/* 15B9 */, /*5562*/"CANADIAN SYLLABICS BLACKFOOT NO"/* 15BA */,/*5563*/"CANADIAN SYLLABICS BLACKFOOT NA"/* 15BB */, /*5564*/"CANADIAN SYLLABICS BLACKFOOT KE"/* 15BC */,/*5565*/"CANADIAN SYLLABICS BLACKFOOT KI"/* 15BD */, /*5566*/"CANADIAN SYLLABICS BLACKFOOT KO"/* 15BE */,/*5567*/"CANADIAN SYLLABICS BLACKFOOT KA"/* 15BF */, /*5568*/"CANADIAN SYLLABICS SAYISI HE"/* 15C0 */,/*5569*/"CANADIAN SYLLABICS SAYISI HI"/* 15C1 */, /*5570*/"CANADIAN SYLLABICS SAYISI HO"/* 15C2 */,/*5571*/"CANADIAN SYLLABICS SAYISI HA"/* 15C3 */, /*5572*/"CANADIAN SYLLABICS CARRIER GHU"/* 15C4 */,/*5573*/"CANADIAN SYLLABICS CARRIER GHO"/* 15C5 */, /*5574*/"CANADIAN SYLLABICS CARRIER GHE"/* 15C6 */,/*5575*/"CANADIAN SYLLABICS CARRIER GHEE"/* 15C7 */, /*5576*/"CANADIAN SYLLABICS CARRIER GHI"/* 15C8 */,/*5577*/"CANADIAN SYLLABICS CARRIER GHA"/* 15C9 */, /*5578*/"CANADIAN SYLLABICS CARRIER RU"/* 15CA */,/*5579*/"CANADIAN SYLLABICS CARRIER RO"/* 15CB */, /*5580*/"CANADIAN SYLLABICS CARRIER RE"/* 15CC */,/*5581*/"CANADIAN SYLLABICS CARRIER REE"/* 15CD */, /*5582*/"CANADIAN SYLLABICS CARRIER RI"/* 15CE */,/*5583*/"CANADIAN SYLLABICS CARRIER RA"/* 15CF */, /*5584*/"CANADIAN SYLLABICS CARRIER WU"/* 15D0 */,/*5585*/"CANADIAN SYLLABICS CARRIER WO"/* 15D1 */, /*5586*/"CANADIAN SYLLABICS CARRIER WE"/* 15D2 */,/*5587*/"CANADIAN SYLLABICS CARRIER WEE"/* 15D3 */, /*5588*/"CANADIAN SYLLABICS CARRIER WI"/* 15D4 */,/*5589*/"CANADIAN SYLLABICS CARRIER WA"/* 15D5 */, /*5590*/"CANADIAN SYLLABICS CARRIER HWU"/* 15D6 */,/*5591*/"CANADIAN SYLLABICS CARRIER HWO"/* 15D7 */, /*5592*/"CANADIAN SYLLABICS CARRIER HWE"/* 15D8 */,/*5593*/"CANADIAN SYLLABICS CARRIER HWEE"/* 15D9 */, /*5594*/"CANADIAN SYLLABICS CARRIER HWI"/* 15DA */,/*5595*/"CANADIAN SYLLABICS CARRIER HWA"/* 15DB */, /*5596*/"CANADIAN SYLLABICS CARRIER THU"/* 15DC */,/*5597*/"CANADIAN SYLLABICS CARRIER THO"/* 15DD */, /*5598*/"CANADIAN SYLLABICS CARRIER THE"/* 15DE */,/*5599*/"CANADIAN SYLLABICS CARRIER THEE"/* 15DF */, /*5600*/"CANADIAN SYLLABICS CARRIER THI"/* 15E0 */,/*5601*/"CANADIAN SYLLABICS CARRIER THA"/* 15E1 */, /*5602*/"CANADIAN SYLLABICS CARRIER TTU"/* 15E2 */,/*5603*/"CANADIAN SYLLABICS CARRIER TTO"/* 15E3 */, /*5604*/"CANADIAN SYLLABICS CARRIER TTE"/* 15E4 */,/*5605*/"CANADIAN SYLLABICS CARRIER TTEE"/* 15E5 */, /*5606*/"CANADIAN SYLLABICS CARRIER TTI"/* 15E6 */,/*5607*/"CANADIAN SYLLABICS CARRIER TTA"/* 15E7 */, /*5608*/"CANADIAN SYLLABICS CARRIER PU"/* 15E8 */,/*5609*/"CANADIAN SYLLABICS CARRIER PO"/* 15E9 */, /*5610*/"CANADIAN SYLLABICS CARRIER PE"/* 15EA */,/*5611*/"CANADIAN SYLLABICS CARRIER PEE"/* 15EB */, /*5612*/"CANADIAN SYLLABICS CARRIER PI"/* 15EC */,/*5613*/"CANADIAN SYLLABICS CARRIER PA"/* 15ED */, /*5614*/"CANADIAN SYLLABICS CARRIER P"/* 15EE */,/*5615*/"CANADIAN SYLLABICS CARRIER GU"/* 15EF */, /*5616*/"CANADIAN SYLLABICS CARRIER GO"/* 15F0 */,/*5617*/"CANADIAN SYLLABICS CARRIER GE"/* 15F1 */, /*5618*/"CANADIAN SYLLABICS CARRIER GEE"/* 15F2 */,/*5619*/"CANADIAN SYLLABICS CARRIER GI"/* 15F3 */, /*5620*/"CANADIAN SYLLABICS CARRIER GA"/* 15F4 */,/*5621*/"CANADIAN SYLLABICS CARRIER KHU"/* 15F5 */, /*5622*/"CANADIAN SYLLABICS CARRIER KHO"/* 15F6 */,/*5623*/"CANADIAN SYLLABICS CARRIER KHE"/* 15F7 */, /*5624*/"CANADIAN SYLLABICS CARRIER KHEE"/* 15F8 */,/*5625*/"CANADIAN SYLLABICS CARRIER KHI"/* 15F9 */, /*5626*/"CANADIAN SYLLABICS CARRIER KHA"/* 15FA */,/*5627*/"CANADIAN SYLLABICS CARRIER KKU"/* 15FB */, /*5628*/"CANADIAN SYLLABICS CARRIER KKO"/* 15FC */,/*5629*/"CANADIAN SYLLABICS CARRIER KKE"/* 15FD */, /*5630*/"CANADIAN SYLLABICS CARRIER KKEE"/* 15FE */,/*5631*/"CANADIAN SYLLABICS CARRIER KKI"/* 15FF */, /*5632*/"CANADIAN SYLLABICS CARRIER KKA"/* 1600 */,/*5633*/"CANADIAN SYLLABICS CARRIER KK"/* 1601 */, /*5634*/"CANADIAN SYLLABICS CARRIER NU"/* 1602 */,/*5635*/"CANADIAN SYLLABICS CARRIER NO"/* 1603 */, /*5636*/"CANADIAN SYLLABICS CARRIER NE"/* 1604 */,/*5637*/"CANADIAN SYLLABICS CARRIER NEE"/* 1605 */, /*5638*/"CANADIAN SYLLABICS CARRIER NI"/* 1606 */,/*5639*/"CANADIAN SYLLABICS CARRIER NA"/* 1607 */, /*5640*/"CANADIAN SYLLABICS CARRIER MU"/* 1608 */,/*5641*/"CANADIAN SYLLABICS CARRIER MO"/* 1609 */, /*5642*/"CANADIAN SYLLABICS CARRIER ME"/* 160A */,/*5643*/"CANADIAN SYLLABICS CARRIER MEE"/* 160B */, /*5644*/"CANADIAN SYLLABICS CARRIER MI"/* 160C */,/*5645*/"CANADIAN SYLLABICS CARRIER MA"/* 160D */, /*5646*/"CANADIAN SYLLABICS CARRIER YU"/* 160E */,/*5647*/"CANADIAN SYLLABICS CARRIER YO"/* 160F */, /*5648*/"CANADIAN SYLLABICS CARRIER YE"/* 1610 */,/*5649*/"CANADIAN SYLLABICS CARRIER YEE"/* 1611 */, /*5650*/"CANADIAN SYLLABICS CARRIER YI"/* 1612 */,/*5651*/"CANADIAN SYLLABICS CARRIER YA"/* 1613 */, /*5652*/"CANADIAN SYLLABICS CARRIER JU"/* 1614 */,/*5653*/"CANADIAN SYLLABICS SAYISI JU"/* 1615 */, /*5654*/"CANADIAN SYLLABICS CARRIER JO"/* 1616 */,/*5655*/"CANADIAN SYLLABICS CARRIER JE"/* 1617 */, /*5656*/"CANADIAN SYLLABICS CARRIER JEE"/* 1618 */,/*5657*/"CANADIAN SYLLABICS CARRIER JI"/* 1619 */, /*5658*/"CANADIAN SYLLABICS SAYISI JI"/* 161A */,/*5659*/"CANADIAN SYLLABICS CARRIER JA"/* 161B */, /*5660*/"CANADIAN SYLLABICS CARRIER JJU"/* 161C */,/*5661*/"CANADIAN SYLLABICS CARRIER JJO"/* 161D */, /*5662*/"CANADIAN SYLLABICS CARRIER JJE"/* 161E */,/*5663*/"CANADIAN SYLLABICS CARRIER JJEE"/* 161F */, /*5664*/"CANADIAN SYLLABICS CARRIER JJI"/* 1620 */,/*5665*/"CANADIAN SYLLABICS CARRIER JJA"/* 1621 */, /*5666*/"CANADIAN SYLLABICS CARRIER LU"/* 1622 */,/*5667*/"CANADIAN SYLLABICS CARRIER LO"/* 1623 */, /*5668*/"CANADIAN SYLLABICS CARRIER LE"/* 1624 */,/*5669*/"CANADIAN SYLLABICS CARRIER LEE"/* 1625 */, /*5670*/"CANADIAN SYLLABICS CARRIER LI"/* 1626 */,/*5671*/"CANADIAN SYLLABICS CARRIER LA"/* 1627 */, /*5672*/"CANADIAN SYLLABICS CARRIER DLU"/* 1628 */,/*5673*/"CANADIAN SYLLABICS CARRIER DLO"/* 1629 */, /*5674*/"CANADIAN SYLLABICS CARRIER DLE"/* 162A */,/*5675*/"CANADIAN SYLLABICS CARRIER DLEE"/* 162B */, /*5676*/"CANADIAN SYLLABICS CARRIER DLI"/* 162C */,/*5677*/"CANADIAN SYLLABICS CARRIER DLA"/* 162D */, /*5678*/"CANADIAN SYLLABICS CARRIER LHU"/* 162E */,/*5679*/"CANADIAN SYLLABICS CARRIER LHO"/* 162F */, /*5680*/"CANADIAN SYLLABICS CARRIER LHE"/* 1630 */,/*5681*/"CANADIAN SYLLABICS CARRIER LHEE"/* 1631 */, /*5682*/"CANADIAN SYLLABICS CARRIER LHI"/* 1632 */,/*5683*/"CANADIAN SYLLABICS CARRIER LHA"/* 1633 */, /*5684*/"CANADIAN SYLLABICS CARRIER TLHU"/* 1634 */,/*5685*/"CANADIAN SYLLABICS CARRIER TLHO"/* 1635 */, /*5686*/"CANADIAN SYLLABICS CARRIER TLHE"/* 1636 */,/*5687*/"CANADIAN SYLLABICS CARRIER TLHEE"/* 1637 */, /*5688*/"CANADIAN SYLLABICS CARRIER TLHI"/* 1638 */,/*5689*/"CANADIAN SYLLABICS CARRIER TLHA"/* 1639 */, /*5690*/"CANADIAN SYLLABICS CARRIER TLU"/* 163A */,/*5691*/"CANADIAN SYLLABICS CARRIER TLO"/* 163B */, /*5692*/"CANADIAN SYLLABICS CARRIER TLE"/* 163C */,/*5693*/"CANADIAN SYLLABICS CARRIER TLEE"/* 163D */, /*5694*/"CANADIAN SYLLABICS CARRIER TLI"/* 163E */,/*5695*/"CANADIAN SYLLABICS CARRIER TLA"/* 163F */, /*5696*/"CANADIAN SYLLABICS CARRIER ZU"/* 1640 */,/*5697*/"CANADIAN SYLLABICS CARRIER ZO"/* 1641 */, /*5698*/"CANADIAN SYLLABICS CARRIER ZE"/* 1642 */,/*5699*/"CANADIAN SYLLABICS CARRIER ZEE"/* 1643 */, /*5700*/"CANADIAN SYLLABICS CARRIER ZI"/* 1644 */,/*5701*/"CANADIAN SYLLABICS CARRIER ZA"/* 1645 */, /*5702*/"CANADIAN SYLLABICS CARRIER Z"/* 1646 */,/*5703*/"CANADIAN SYLLABICS CARRIER INITIAL Z"/* 1647 */, /*5704*/"CANADIAN SYLLABICS CARRIER DZU"/* 1648 */,/*5705*/"CANADIAN SYLLABICS CARRIER DZO"/* 1649 */, /*5706*/"CANADIAN SYLLABICS CARRIER DZE"/* 164A */,/*5707*/"CANADIAN SYLLABICS CARRIER DZEE"/* 164B */, /*5708*/"CANADIAN SYLLABICS CARRIER DZI"/* 164C */,/*5709*/"CANADIAN SYLLABICS CARRIER DZA"/* 164D */, /*5710*/"CANADIAN SYLLABICS CARRIER SU"/* 164E */,/*5711*/"CANADIAN SYLLABICS CARRIER SO"/* 164F */, /*5712*/"CANADIAN SYLLABICS CARRIER SE"/* 1650 */,/*5713*/"CANADIAN SYLLABICS CARRIER SEE"/* 1651 */, /*5714*/"CANADIAN SYLLABICS CARRIER SI"/* 1652 */,/*5715*/"CANADIAN SYLLABICS CARRIER SA"/* 1653 */, /*5716*/"CANADIAN SYLLABICS CARRIER SHU"/* 1654 */,/*5717*/"CANADIAN SYLLABICS CARRIER SHO"/* 1655 */, /*5718*/"CANADIAN SYLLABICS CARRIER SHE"/* 1656 */,/*5719*/"CANADIAN SYLLABICS CARRIER SHEE"/* 1657 */, /*5720*/"CANADIAN SYLLABICS CARRIER SHI"/* 1658 */,/*5721*/"CANADIAN SYLLABICS CARRIER SHA"/* 1659 */, /*5722*/"CANADIAN SYLLABICS CARRIER SH"/* 165A */,/*5723*/"CANADIAN SYLLABICS CARRIER TSU"/* 165B */, /*5724*/"CANADIAN SYLLABICS CARRIER TSO"/* 165C */,/*5725*/"CANADIAN SYLLABICS CARRIER TSE"/* 165D */, /*5726*/"CANADIAN SYLLABICS CARRIER TSEE"/* 165E */,/*5727*/"CANADIAN SYLLABICS CARRIER TSI"/* 165F */, /*5728*/"CANADIAN SYLLABICS CARRIER TSA"/* 1660 */,/*5729*/"CANADIAN SYLLABICS CARRIER CHU"/* 1661 */, /*5730*/"CANADIAN SYLLABICS CARRIER CHO"/* 1662 */,/*5731*/"CANADIAN SYLLABICS CARRIER CHE"/* 1663 */, /*5732*/"CANADIAN SYLLABICS CARRIER CHEE"/* 1664 */,/*5733*/"CANADIAN SYLLABICS CARRIER CHI"/* 1665 */, /*5734*/"CANADIAN SYLLABICS CARRIER CHA"/* 1666 */,/*5735*/"CANADIAN SYLLABICS CARRIER TTSU"/* 1667 */, /*5736*/"CANADIAN SYLLABICS CARRIER TTSO"/* 1668 */,/*5737*/"CANADIAN SYLLABICS CARRIER TTSE"/* 1669 */, /*5738*/"CANADIAN SYLLABICS CARRIER TTSEE"/* 166A */,/*5739*/"CANADIAN SYLLABICS CARRIER TTSI"/* 166B */, /*5740*/"CANADIAN SYLLABICS CARRIER TTSA"/* 166C */,/*5741*/"CANADIAN SYLLABICS CHI SIGN"/* 166D */, /*5742*/"CANADIAN SYLLABICS FULL STOP"/* 166E */,/*5743*/"CANADIAN SYLLABICS QAI"/* 166F */, /*5744*/"CANADIAN SYLLABICS NGAI"/* 1670 */,/*5745*/"CANADIAN SYLLABICS NNGI"/* 1671 */, /*5746*/"CANADIAN SYLLABICS NNGII"/* 1672 */,/*5747*/"CANADIAN SYLLABICS NNGO"/* 1673 */, /*5748*/"CANADIAN SYLLABICS NNGOO"/* 1674 */,/*5749*/"CANADIAN SYLLABICS NNGA"/* 1675 */, /*5750*/"CANADIAN SYLLABICS NNGAA"/* 1676 */,/*5751*/"CANADIAN SYLLABICS WOODS-CREE THWEE"/* 1677 */, /*5752*/"CANADIAN SYLLABICS WOODS-CREE THWI"/* 1678 */,/*5753*/"CANADIAN SYLLABICS WOODS-CREE THWII"/* 1679 */, /*5754*/"CANADIAN SYLLABICS WOODS-CREE THWO"/* 167A */,/*5755*/"CANADIAN SYLLABICS WOODS-CREE THWOO"/* 167B */, /*5756*/"CANADIAN SYLLABICS WOODS-CREE THWA"/* 167C */,/*5757*/"CANADIAN SYLLABICS WOODS-CREE THWAA"/* 167D */, /*5758*/"CANADIAN SYLLABICS WOODS-CREE FINAL TH"/* 167E */,/*5759*/"CANADIAN SYLLABICS BLACKFOOT W"/* 167F */, /*5760*/"OGHAM SPACE MARK"/* 1680 */,/*5761*/"OGHAM LETTER BEITH"/* 1681 */,/*5762*/"OGHAM LETTER LUIS"/* 1682 */, /*5763*/"OGHAM LETTER FEARN"/* 1683 */,/*5764*/"OGHAM LETTER SAIL"/* 1684 */,/*5765*/"OGHAM LETTER NION"/* 1685 */, /*5766*/"OGHAM LETTER UATH"/* 1686 */,/*5767*/"OGHAM LETTER DAIR"/* 1687 */,/*5768*/"OGHAM LETTER TINNE"/* 1688 */, /*5769*/"OGHAM LETTER COLL"/* 1689 */,/*5770*/"OGHAM LETTER CEIRT"/* 168A */,/*5771*/"OGHAM LETTER MUIN"/* 168B */, /*5772*/"OGHAM LETTER GORT"/* 168C */,/*5773*/"OGHAM LETTER NGEADAL"/* 168D */,/*5774*/"OGHAM LETTER STRAIF"/* 168E */, /*5775*/"OGHAM LETTER RUIS"/* 168F */,/*5776*/"OGHAM LETTER AILM"/* 1690 */,/*5777*/"OGHAM LETTER ONN"/* 1691 */, /*5778*/"OGHAM LETTER UR"/* 1692 */,/*5779*/"OGHAM LETTER EADHADH"/* 1693 */,/*5780*/"OGHAM LETTER IODHADH"/* 1694 */, /*5781*/"OGHAM LETTER EABHADH"/* 1695 */,/*5782*/"OGHAM LETTER OR"/* 1696 */,/*5783*/"OGHAM LETTER UILLEANN"/* 1697 */, /*5784*/"OGHAM LETTER IFIN"/* 1698 */,/*5785*/"OGHAM LETTER EAMHANCHOLL"/* 1699 */, /*5786*/"OGHAM LETTER PEITH"/* 169A */,/*5787*/"OGHAM FEATHER MARK"/* 169B */, /*5788*/"OGHAM REVERSED FEATHER MARK"/* 169C */,NULL,NULL,NULL,/*5792*/"RUNIC LETTER FEHU FEOH FE F"/* 16A0 */, /*5793*/"RUNIC LETTER V"/* 16A1 */,/*5794*/"RUNIC LETTER URUZ UR U"/* 16A2 */,/*5795*/"RUNIC LETTER YR"/* 16A3 */, /*5796*/"RUNIC LETTER Y"/* 16A4 */,/*5797*/"RUNIC LETTER W"/* 16A5 */, /*5798*/"RUNIC LETTER THURISAZ THURS THORN"/* 16A6 */,/*5799*/"RUNIC LETTER ETH"/* 16A7 */, /*5800*/"RUNIC LETTER ANSUZ A"/* 16A8 */,/*5801*/"RUNIC LETTER OS O"/* 16A9 */,/*5802*/"RUNIC LETTER AC A"/* 16AA */, /*5803*/"RUNIC LETTER AESC"/* 16AB */,/*5804*/"RUNIC LETTER LONG-BRANCH-OSS O"/* 16AC */, /*5805*/"RUNIC LETTER SHORT-TWIG-OSS O"/* 16AD */,/*5806*/"RUNIC LETTER O"/* 16AE */,/*5807*/"RUNIC LETTER OE"/* 16AF */, /*5808*/"RUNIC LETTER ON"/* 16B0 */,/*5809*/"RUNIC LETTER RAIDO RAD REID R"/* 16B1 */, /*5810*/"RUNIC LETTER KAUNA"/* 16B2 */,/*5811*/"RUNIC LETTER CEN"/* 16B3 */,/*5812*/"RUNIC LETTER KAUN K"/* 16B4 */, /*5813*/"RUNIC LETTER G"/* 16B5 */,/*5814*/"RUNIC LETTER ENG"/* 16B6 */,/*5815*/"RUNIC LETTER GEBO GYFU G"/* 16B7 */, /*5816*/"RUNIC LETTER GAR"/* 16B8 */,/*5817*/"RUNIC LETTER WUNJO WYNN W"/* 16B9 */, /*5818*/"RUNIC LETTER HAGLAZ H"/* 16BA */,/*5819*/"RUNIC LETTER HAEGL H"/* 16BB */, /*5820*/"RUNIC LETTER LONG-BRANCH-HAGALL H"/* 16BC */,/*5821*/"RUNIC LETTER SHORT-TWIG-HAGALL H"/* 16BD */, /*5822*/"RUNIC LETTER NAUDIZ NYD NAUD N"/* 16BE */,/*5823*/"RUNIC LETTER SHORT-TWIG-NAUD N"/* 16BF */, /*5824*/"RUNIC LETTER DOTTED-N"/* 16C0 */,/*5825*/"RUNIC LETTER ISAZ IS ISS I"/* 16C1 */, /*5826*/"RUNIC LETTER E"/* 16C2 */,/*5827*/"RUNIC LETTER JERAN J"/* 16C3 */,/*5828*/"RUNIC LETTER GER"/* 16C4 */, /*5829*/"RUNIC LETTER LONG-BRANCH-AR AE"/* 16C5 */,/*5830*/"RUNIC LETTER SHORT-TWIG-AR A"/* 16C6 */, /*5831*/"RUNIC LETTER IWAZ EOH"/* 16C7 */,/*5832*/"RUNIC LETTER PERTHO PEORTH P"/* 16C8 */, /*5833*/"RUNIC LETTER ALGIZ EOLHX"/* 16C9 */,/*5834*/"RUNIC LETTER SOWILO S"/* 16CA */, /*5835*/"RUNIC LETTER SIGEL LONG-BRANCH-SOL S"/* 16CB */,/*5836*/"RUNIC LETTER SHORT-TWIG-SOL S"/* 16CC */, /*5837*/"RUNIC LETTER C"/* 16CD */,/*5838*/"RUNIC LETTER Z"/* 16CE */,/*5839*/"RUNIC LETTER TIWAZ TIR TYR T"/* 16CF */, /*5840*/"RUNIC LETTER SHORT-TWIG-TYR T"/* 16D0 */,/*5841*/"RUNIC LETTER D"/* 16D1 */, /*5842*/"RUNIC LETTER BERKANAN BEORC BJARKAN B"/* 16D2 */,/*5843*/"RUNIC LETTER SHORT-TWIG-BJARKAN B"/* 16D3 */, /*5844*/"RUNIC LETTER DOTTED-P"/* 16D4 */,/*5845*/"RUNIC LETTER OPEN-P"/* 16D5 */, /*5846*/"RUNIC LETTER EHWAZ EH E"/* 16D6 */,/*5847*/"RUNIC LETTER MANNAZ MAN M"/* 16D7 */, /*5848*/"RUNIC LETTER LONG-BRANCH-MADR M"/* 16D8 */,/*5849*/"RUNIC LETTER SHORT-TWIG-MADR M"/* 16D9 */, /*5850*/"RUNIC LETTER LAUKAZ LAGU LOGR L"/* 16DA */,/*5851*/"RUNIC LETTER DOTTED-L"/* 16DB */, /*5852*/"RUNIC LETTER INGWAZ"/* 16DC */,/*5853*/"RUNIC LETTER ING"/* 16DD */, /*5854*/"RUNIC LETTER DAGAZ DAEG D"/* 16DE */,/*5855*/"RUNIC LETTER OTHALAN ETHEL O"/* 16DF */, /*5856*/"RUNIC LETTER EAR"/* 16E0 */,/*5857*/"RUNIC LETTER IOR"/* 16E1 */,/*5858*/"RUNIC LETTER CWEORTH"/* 16E2 */, /*5859*/"RUNIC LETTER CALC"/* 16E3 */,/*5860*/"RUNIC LETTER CEALC"/* 16E4 */,/*5861*/"RUNIC LETTER STAN"/* 16E5 */, /*5862*/"RUNIC LETTER LONG-BRANCH-YR"/* 16E6 */,/*5863*/"RUNIC LETTER SHORT-TWIG-YR"/* 16E7 */, /*5864*/"RUNIC LETTER ICELANDIC-YR"/* 16E8 */,/*5865*/"RUNIC LETTER Q"/* 16E9 */,/*5866*/"RUNIC LETTER X"/* 16EA */, /*5867*/"RUNIC SINGLE PUNCTUATION"/* 16EB */,/*5868*/"RUNIC MULTIPLE PUNCTUATION"/* 16EC */, /*5869*/"RUNIC CROSS PUNCTUATION"/* 16ED */,/*5870*/"RUNIC ARLAUG SYMBOL"/* 16EE */, /*5871*/"RUNIC TVIMADUR SYMBOL"/* 16EF */,/*5872*/"RUNIC BELGTHOR SYMBOL"/* 16F0 */,/*5873*/"RUNIC LETTER K"/* 16F1 */, /*5874*/"RUNIC LETTER SH"/* 16F2 */,/*5875*/"RUNIC LETTER OO"/* 16F3 */, /*5876*/"RUNIC LETTER FRANKS CASKET OS"/* 16F4 */,/*5877*/"RUNIC LETTER FRANKS CASKET IS"/* 16F5 */, /*5878*/"RUNIC LETTER FRANKS CASKET EH"/* 16F6 */,/*5879*/"RUNIC LETTER FRANKS CASKET AC"/* 16F7 */, /*5880*/"RUNIC LETTER FRANKS CASKET AESC"/* 16F8 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*5888*/"TAGALOG LETTER A"/* 1700 */,/*5889*/"TAGALOG LETTER I"/* 1701 */,/*5890*/"TAGALOG LETTER U"/* 1702 */, /*5891*/"TAGALOG LETTER KA"/* 1703 */,/*5892*/"TAGALOG LETTER GA"/* 1704 */,/*5893*/"TAGALOG LETTER NGA"/* 1705 */, /*5894*/"TAGALOG LETTER TA"/* 1706 */,/*5895*/"TAGALOG LETTER DA"/* 1707 */,/*5896*/"TAGALOG LETTER NA"/* 1708 */, /*5897*/"TAGALOG LETTER PA"/* 1709 */,/*5898*/"TAGALOG LETTER BA"/* 170A */,/*5899*/"TAGALOG LETTER MA"/* 170B */, /*5900*/"TAGALOG LETTER YA"/* 170C */,NULL,/*5902*/"TAGALOG LETTER LA"/* 170E */,/*5903*/"TAGALOG LETTER WA"/* 170F */, /*5904*/"TAGALOG LETTER SA"/* 1710 */,/*5905*/"TAGALOG LETTER HA"/* 1711 */,/*5906*/"TAGALOG VOWEL SIGN I"/* 1712 */, /*5907*/"TAGALOG VOWEL SIGN U"/* 1713 */,/*5908*/"TAGALOG SIGN VIRAMA"/* 1714 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,/*5920*/"HANUNOO LETTER A"/* 1720 */,/*5921*/"HANUNOO LETTER I"/* 1721 */, /*5922*/"HANUNOO LETTER U"/* 1722 */,/*5923*/"HANUNOO LETTER KA"/* 1723 */,/*5924*/"HANUNOO LETTER GA"/* 1724 */, /*5925*/"HANUNOO LETTER NGA"/* 1725 */,/*5926*/"HANUNOO LETTER TA"/* 1726 */,/*5927*/"HANUNOO LETTER DA"/* 1727 */, /*5928*/"HANUNOO LETTER NA"/* 1728 */,/*5929*/"HANUNOO LETTER PA"/* 1729 */,/*5930*/"HANUNOO LETTER BA"/* 172A */, /*5931*/"HANUNOO LETTER MA"/* 172B */,/*5932*/"HANUNOO LETTER YA"/* 172C */,/*5933*/"HANUNOO LETTER RA"/* 172D */, /*5934*/"HANUNOO LETTER LA"/* 172E */,/*5935*/"HANUNOO LETTER WA"/* 172F */,/*5936*/"HANUNOO LETTER SA"/* 1730 */, /*5937*/"HANUNOO LETTER HA"/* 1731 */,/*5938*/"HANUNOO VOWEL SIGN I"/* 1732 */,/*5939*/"HANUNOO VOWEL SIGN U"/* 1733 */, /*5940*/"HANUNOO SIGN PAMUDPOD"/* 1734 */,/*5941*/"PHILIPPINE SINGLE PUNCTUATION"/* 1735 */, /*5942*/"PHILIPPINE DOUBLE PUNCTUATION"/* 1736 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*5952*/"BUHID LETTER A"/* 1740 */,/*5953*/"BUHID LETTER I"/* 1741 */,/*5954*/"BUHID LETTER U"/* 1742 */, /*5955*/"BUHID LETTER KA"/* 1743 */,/*5956*/"BUHID LETTER GA"/* 1744 */,/*5957*/"BUHID LETTER NGA"/* 1745 */, /*5958*/"BUHID LETTER TA"/* 1746 */,/*5959*/"BUHID LETTER DA"/* 1747 */,/*5960*/"BUHID LETTER NA"/* 1748 */, /*5961*/"BUHID LETTER PA"/* 1749 */,/*5962*/"BUHID LETTER BA"/* 174A */,/*5963*/"BUHID LETTER MA"/* 174B */, /*5964*/"BUHID LETTER YA"/* 174C */,/*5965*/"BUHID LETTER RA"/* 174D */,/*5966*/"BUHID LETTER LA"/* 174E */, /*5967*/"BUHID LETTER WA"/* 174F */,/*5968*/"BUHID LETTER SA"/* 1750 */,/*5969*/"BUHID LETTER HA"/* 1751 */, /*5970*/"BUHID VOWEL SIGN I"/* 1752 */,/*5971*/"BUHID VOWEL SIGN U"/* 1753 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,/*5984*/"TAGBANWA LETTER A"/* 1760 */,/*5985*/"TAGBANWA LETTER I"/* 1761 */, /*5986*/"TAGBANWA LETTER U"/* 1762 */,/*5987*/"TAGBANWA LETTER KA"/* 1763 */,/*5988*/"TAGBANWA LETTER GA"/* 1764 */, /*5989*/"TAGBANWA LETTER NGA"/* 1765 */,/*5990*/"TAGBANWA LETTER TA"/* 1766 */,/*5991*/"TAGBANWA LETTER DA"/* 1767 */, /*5992*/"TAGBANWA LETTER NA"/* 1768 */,/*5993*/"TAGBANWA LETTER PA"/* 1769 */,/*5994*/"TAGBANWA LETTER BA"/* 176A */, /*5995*/"TAGBANWA LETTER MA"/* 176B */,/*5996*/"TAGBANWA LETTER YA"/* 176C */,NULL, /*5998*/"TAGBANWA LETTER LA"/* 176E */,/*5999*/"TAGBANWA LETTER WA"/* 176F */,/*6000*/"TAGBANWA LETTER SA"/* 1770 */, NULL,/*6002*/"TAGBANWA VOWEL SIGN I"/* 1772 */,/*6003*/"TAGBANWA VOWEL SIGN U"/* 1773 */,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,/*6016*/"KHMER LETTER KA"/* 1780 */,/*6017*/"KHMER LETTER KHA"/* 1781 */, /*6018*/"KHMER LETTER KO"/* 1782 */,/*6019*/"KHMER LETTER KHO"/* 1783 */,/*6020*/"KHMER LETTER NGO"/* 1784 */, /*6021*/"KHMER LETTER CA"/* 1785 */,/*6022*/"KHMER LETTER CHA"/* 1786 */,/*6023*/"KHMER LETTER CO"/* 1787 */, /*6024*/"KHMER LETTER CHO"/* 1788 */,/*6025*/"KHMER LETTER NYO"/* 1789 */,/*6026*/"KHMER LETTER DA"/* 178A */, /*6027*/"KHMER LETTER TTHA"/* 178B */,/*6028*/"KHMER LETTER DO"/* 178C */,/*6029*/"KHMER LETTER TTHO"/* 178D */, /*6030*/"KHMER LETTER NNO"/* 178E */,/*6031*/"KHMER LETTER TA"/* 178F */,/*6032*/"KHMER LETTER THA"/* 1790 */, /*6033*/"KHMER LETTER TO"/* 1791 */,/*6034*/"KHMER LETTER THO"/* 1792 */,/*6035*/"KHMER LETTER NO"/* 1793 */, /*6036*/"KHMER LETTER BA"/* 1794 */,/*6037*/"KHMER LETTER PHA"/* 1795 */,/*6038*/"KHMER LETTER PO"/* 1796 */, /*6039*/"KHMER LETTER PHO"/* 1797 */,/*6040*/"KHMER LETTER MO"/* 1798 */,/*6041*/"KHMER LETTER YO"/* 1799 */, /*6042*/"KHMER LETTER RO"/* 179A */,/*6043*/"KHMER LETTER LO"/* 179B */,/*6044*/"KHMER LETTER VO"/* 179C */, /*6045*/"KHMER LETTER SHA"/* 179D */,/*6046*/"KHMER LETTER SSO"/* 179E */,/*6047*/"KHMER LETTER SA"/* 179F */, /*6048*/"KHMER LETTER HA"/* 17A0 */,/*6049*/"KHMER LETTER LA"/* 17A1 */,/*6050*/"KHMER LETTER QA"/* 17A2 */, /*6051*/"KHMER INDEPENDENT VOWEL QAQ"/* 17A3 */,/*6052*/"KHMER INDEPENDENT VOWEL QAA"/* 17A4 */, /*6053*/"KHMER INDEPENDENT VOWEL QI"/* 17A5 */,/*6054*/"KHMER INDEPENDENT VOWEL QII"/* 17A6 */, /*6055*/"KHMER INDEPENDENT VOWEL QU"/* 17A7 */,/*6056*/"KHMER INDEPENDENT VOWEL QUK"/* 17A8 */, /*6057*/"KHMER INDEPENDENT VOWEL QUU"/* 17A9 */,/*6058*/"KHMER INDEPENDENT VOWEL QUUV"/* 17AA */, /*6059*/"KHMER INDEPENDENT VOWEL RY"/* 17AB */,/*6060*/"KHMER INDEPENDENT VOWEL RYY"/* 17AC */, /*6061*/"KHMER INDEPENDENT VOWEL LY"/* 17AD */,/*6062*/"KHMER INDEPENDENT VOWEL LYY"/* 17AE */, /*6063*/"KHMER INDEPENDENT VOWEL QE"/* 17AF */,/*6064*/"KHMER INDEPENDENT VOWEL QAI"/* 17B0 */, /*6065*/"KHMER INDEPENDENT VOWEL QOO TYPE ONE"/* 17B1 */,/*6066*/"KHMER INDEPENDENT VOWEL QOO TYPE TWO"/* 17B2 */, /*6067*/"KHMER INDEPENDENT VOWEL QAU"/* 17B3 */,/*6068*/"KHMER VOWEL INHERENT AQ"/* 17B4 */, /*6069*/"KHMER VOWEL INHERENT AA"/* 17B5 */,/*6070*/"KHMER VOWEL SIGN AA"/* 17B6 */, /*6071*/"KHMER VOWEL SIGN I"/* 17B7 */,/*6072*/"KHMER VOWEL SIGN II"/* 17B8 */,/*6073*/"KHMER VOWEL SIGN Y"/* 17B9 */, /*6074*/"KHMER VOWEL SIGN YY"/* 17BA */,/*6075*/"KHMER VOWEL SIGN U"/* 17BB */,/*6076*/"KHMER VOWEL SIGN UU"/* 17BC */, /*6077*/"KHMER VOWEL SIGN UA"/* 17BD */,/*6078*/"KHMER VOWEL SIGN OE"/* 17BE */,/*6079*/"KHMER VOWEL SIGN YA"/* 17BF */, /*6080*/"KHMER VOWEL SIGN IE"/* 17C0 */,/*6081*/"KHMER VOWEL SIGN E"/* 17C1 */,/*6082*/"KHMER VOWEL SIGN AE"/* 17C2 */, /*6083*/"KHMER VOWEL SIGN AI"/* 17C3 */,/*6084*/"KHMER VOWEL SIGN OO"/* 17C4 */,/*6085*/"KHMER VOWEL SIGN AU"/* 17C5 */, /*6086*/"KHMER SIGN NIKAHIT"/* 17C6 */,/*6087*/"KHMER SIGN REAHMUK"/* 17C7 */, /*6088*/"KHMER SIGN YUUKALEAPINTU"/* 17C8 */,/*6089*/"KHMER SIGN MUUSIKATOAN"/* 17C9 */, /*6090*/"KHMER SIGN TRIISAP"/* 17CA */,/*6091*/"KHMER SIGN BANTOC"/* 17CB */,/*6092*/"KHMER SIGN ROBAT"/* 17CC */, /*6093*/"KHMER SIGN TOANDAKHIAT"/* 17CD */,/*6094*/"KHMER SIGN KAKABAT"/* 17CE */,/*6095*/"KHMER SIGN AHSDA"/* 17CF */, /*6096*/"KHMER SIGN SAMYOK SANNYA"/* 17D0 */,/*6097*/"KHMER SIGN VIRIAM"/* 17D1 */,/*6098*/"KHMER SIGN COENG"/* 17D2 */, /*6099*/"KHMER SIGN BATHAMASAT"/* 17D3 */,/*6100*/"KHMER SIGN KHAN"/* 17D4 */,/*6101*/"KHMER SIGN BARIYOOSAN"/* 17D5 */, /*6102*/"KHMER SIGN CAMNUC PII KUUH"/* 17D6 */,/*6103*/"KHMER SIGN LEK TOO"/* 17D7 */, /*6104*/"KHMER SIGN BEYYAL"/* 17D8 */,/*6105*/"KHMER SIGN PHNAEK MUAN"/* 17D9 */,/*6106*/"KHMER SIGN KOOMUUT"/* 17DA */, /*6107*/"KHMER CURRENCY SYMBOL RIEL"/* 17DB */,/*6108*/"KHMER SIGN AVAKRAHASANYA"/* 17DC */, /*6109*/"KHMER SIGN ATTHACAN"/* 17DD */,NULL,NULL,/*6112*/"KHMER DIGIT ZERO"/* 17E0 */, /*6113*/"KHMER DIGIT ONE"/* 17E1 */,/*6114*/"KHMER DIGIT TWO"/* 17E2 */,/*6115*/"KHMER DIGIT THREE"/* 17E3 */, /*6116*/"KHMER DIGIT FOUR"/* 17E4 */,/*6117*/"KHMER DIGIT FIVE"/* 17E5 */,/*6118*/"KHMER DIGIT SIX"/* 17E6 */, /*6119*/"KHMER DIGIT SEVEN"/* 17E7 */,/*6120*/"KHMER DIGIT EIGHT"/* 17E8 */,/*6121*/"KHMER DIGIT NINE"/* 17E9 */,NULL, NULL,NULL,NULL,NULL,NULL,/*6128*/"KHMER SYMBOL LEK ATTAK SON"/* 17F0 */,/*6129*/"KHMER SYMBOL LEK ATTAK MUOY"/* 17F1 */, /*6130*/"KHMER SYMBOL LEK ATTAK PII"/* 17F2 */,/*6131*/"KHMER SYMBOL LEK ATTAK BEI"/* 17F3 */, /*6132*/"KHMER SYMBOL LEK ATTAK BUON"/* 17F4 */,/*6133*/"KHMER SYMBOL LEK ATTAK PRAM"/* 17F5 */, /*6134*/"KHMER SYMBOL LEK ATTAK PRAM-MUOY"/* 17F6 */,/*6135*/"KHMER SYMBOL LEK ATTAK PRAM-PII"/* 17F7 */, /*6136*/"KHMER SYMBOL LEK ATTAK PRAM-BEI"/* 17F8 */,/*6137*/"KHMER SYMBOL LEK ATTAK PRAM-BUON"/* 17F9 */,NULL,NULL,NULL, NULL,NULL,NULL,/*6144*/"MONGOLIAN BIRGA"/* 1800 */,/*6145*/"MONGOLIAN ELLIPSIS"/* 1801 */, /*6146*/"MONGOLIAN COMMA"/* 1802 */,/*6147*/"MONGOLIAN FULL STOP"/* 1803 */,/*6148*/"MONGOLIAN COLON"/* 1804 */, /*6149*/"MONGOLIAN FOUR DOTS"/* 1805 */,/*6150*/"MONGOLIAN TODO SOFT HYPHEN"/* 1806 */, /*6151*/"MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER"/* 1807 */,/*6152*/"MONGOLIAN MANCHU COMMA"/* 1808 */, /*6153*/"MONGOLIAN MANCHU FULL STOP"/* 1809 */,/*6154*/"MONGOLIAN NIRUGU"/* 180A */, /*6155*/"MONGOLIAN FREE VARIATION SELECTOR ONE"/* 180B */,/*6156*/"MONGOLIAN FREE VARIATION SELECTOR TWO"/* 180C */, /*6157*/"MONGOLIAN FREE VARIATION SELECTOR THREE"/* 180D */,/*6158*/"MONGOLIAN VOWEL SEPARATOR"/* 180E */,NULL, /*6160*/"MONGOLIAN DIGIT ZERO"/* 1810 */,/*6161*/"MONGOLIAN DIGIT ONE"/* 1811 */,/*6162*/"MONGOLIAN DIGIT TWO"/* 1812 */, /*6163*/"MONGOLIAN DIGIT THREE"/* 1813 */,/*6164*/"MONGOLIAN DIGIT FOUR"/* 1814 */, /*6165*/"MONGOLIAN DIGIT FIVE"/* 1815 */,/*6166*/"MONGOLIAN DIGIT SIX"/* 1816 */, /*6167*/"MONGOLIAN DIGIT SEVEN"/* 1817 */,/*6168*/"MONGOLIAN DIGIT EIGHT"/* 1818 */, /*6169*/"MONGOLIAN DIGIT NINE"/* 1819 */,NULL,NULL,NULL,NULL,NULL,NULL,/*6176*/"MONGOLIAN LETTER A"/* 1820 */, /*6177*/"MONGOLIAN LETTER E"/* 1821 */,/*6178*/"MONGOLIAN LETTER I"/* 1822 */,/*6179*/"MONGOLIAN LETTER O"/* 1823 */, /*6180*/"MONGOLIAN LETTER U"/* 1824 */,/*6181*/"MONGOLIAN LETTER OE"/* 1825 */,/*6182*/"MONGOLIAN LETTER UE"/* 1826 */, /*6183*/"MONGOLIAN LETTER EE"/* 1827 */,/*6184*/"MONGOLIAN LETTER NA"/* 1828 */,/*6185*/"MONGOLIAN LETTER ANG"/* 1829 */, /*6186*/"MONGOLIAN LETTER BA"/* 182A */,/*6187*/"MONGOLIAN LETTER PA"/* 182B */,/*6188*/"MONGOLIAN LETTER QA"/* 182C */, /*6189*/"MONGOLIAN LETTER GA"/* 182D */,/*6190*/"MONGOLIAN LETTER MA"/* 182E */,/*6191*/"MONGOLIAN LETTER LA"/* 182F */, /*6192*/"MONGOLIAN LETTER SA"/* 1830 */,/*6193*/"MONGOLIAN LETTER SHA"/* 1831 */,/*6194*/"MONGOLIAN LETTER TA"/* 1832 */, /*6195*/"MONGOLIAN LETTER DA"/* 1833 */,/*6196*/"MONGOLIAN LETTER CHA"/* 1834 */,/*6197*/"MONGOLIAN LETTER JA"/* 1835 */, /*6198*/"MONGOLIAN LETTER YA"/* 1836 */,/*6199*/"MONGOLIAN LETTER RA"/* 1837 */,/*6200*/"MONGOLIAN LETTER WA"/* 1838 */, /*6201*/"MONGOLIAN LETTER FA"/* 1839 */,/*6202*/"MONGOLIAN LETTER KA"/* 183A */,/*6203*/"MONGOLIAN LETTER KHA"/* 183B */, /*6204*/"MONGOLIAN LETTER TSA"/* 183C */,/*6205*/"MONGOLIAN LETTER ZA"/* 183D */, /*6206*/"MONGOLIAN LETTER HAA"/* 183E */,/*6207*/"MONGOLIAN LETTER ZRA"/* 183F */, /*6208*/"MONGOLIAN LETTER LHA"/* 1840 */,/*6209*/"MONGOLIAN LETTER ZHI"/* 1841 */, /*6210*/"MONGOLIAN LETTER CHI"/* 1842 */,/*6211*/"MONGOLIAN LETTER TODO LONG VOWEL SIGN"/* 1843 */, /*6212*/"MONGOLIAN LETTER TODO E"/* 1844 */,/*6213*/"MONGOLIAN LETTER TODO I"/* 1845 */, /*6214*/"MONGOLIAN LETTER TODO O"/* 1846 */,/*6215*/"MONGOLIAN LETTER TODO U"/* 1847 */, /*6216*/"MONGOLIAN LETTER TODO OE"/* 1848 */,/*6217*/"MONGOLIAN LETTER TODO UE"/* 1849 */, /*6218*/"MONGOLIAN LETTER TODO ANG"/* 184A */,/*6219*/"MONGOLIAN LETTER TODO BA"/* 184B */, /*6220*/"MONGOLIAN LETTER TODO PA"/* 184C */,/*6221*/"MONGOLIAN LETTER TODO QA"/* 184D */, /*6222*/"MONGOLIAN LETTER TODO GA"/* 184E */,/*6223*/"MONGOLIAN LETTER TODO MA"/* 184F */, /*6224*/"MONGOLIAN LETTER TODO TA"/* 1850 */,/*6225*/"MONGOLIAN LETTER TODO DA"/* 1851 */, /*6226*/"MONGOLIAN LETTER TODO CHA"/* 1852 */,/*6227*/"MONGOLIAN LETTER TODO JA"/* 1853 */, /*6228*/"MONGOLIAN LETTER TODO TSA"/* 1854 */,/*6229*/"MONGOLIAN LETTER TODO YA"/* 1855 */, /*6230*/"MONGOLIAN LETTER TODO WA"/* 1856 */,/*6231*/"MONGOLIAN LETTER TODO KA"/* 1857 */, /*6232*/"MONGOLIAN LETTER TODO GAA"/* 1858 */,/*6233*/"MONGOLIAN LETTER TODO HAA"/* 1859 */, /*6234*/"MONGOLIAN LETTER TODO JIA"/* 185A */,/*6235*/"MONGOLIAN LETTER TODO NIA"/* 185B */, /*6236*/"MONGOLIAN LETTER TODO DZA"/* 185C */,/*6237*/"MONGOLIAN LETTER SIBE E"/* 185D */, /*6238*/"MONGOLIAN LETTER SIBE I"/* 185E */,/*6239*/"MONGOLIAN LETTER SIBE IY"/* 185F */, /*6240*/"MONGOLIAN LETTER SIBE UE"/* 1860 */,/*6241*/"MONGOLIAN LETTER SIBE U"/* 1861 */, /*6242*/"MONGOLIAN LETTER SIBE ANG"/* 1862 */,/*6243*/"MONGOLIAN LETTER SIBE KA"/* 1863 */, /*6244*/"MONGOLIAN LETTER SIBE GA"/* 1864 */,/*6245*/"MONGOLIAN LETTER SIBE HA"/* 1865 */, /*6246*/"MONGOLIAN LETTER SIBE PA"/* 1866 */,/*6247*/"MONGOLIAN LETTER SIBE SHA"/* 1867 */, /*6248*/"MONGOLIAN LETTER SIBE TA"/* 1868 */,/*6249*/"MONGOLIAN LETTER SIBE DA"/* 1869 */, /*6250*/"MONGOLIAN LETTER SIBE JA"/* 186A */,/*6251*/"MONGOLIAN LETTER SIBE FA"/* 186B */, /*6252*/"MONGOLIAN LETTER SIBE GAA"/* 186C */,/*6253*/"MONGOLIAN LETTER SIBE HAA"/* 186D */, /*6254*/"MONGOLIAN LETTER SIBE TSA"/* 186E */,/*6255*/"MONGOLIAN LETTER SIBE ZA"/* 186F */, /*6256*/"MONGOLIAN LETTER SIBE RAA"/* 1870 */,/*6257*/"MONGOLIAN LETTER SIBE CHA"/* 1871 */, /*6258*/"MONGOLIAN LETTER SIBE ZHA"/* 1872 */,/*6259*/"MONGOLIAN LETTER MANCHU I"/* 1873 */, /*6260*/"MONGOLIAN LETTER MANCHU KA"/* 1874 */,/*6261*/"MONGOLIAN LETTER MANCHU RA"/* 1875 */, /*6262*/"MONGOLIAN LETTER MANCHU FA"/* 1876 */,/*6263*/"MONGOLIAN LETTER MANCHU ZHA"/* 1877 */,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,/*6272*/"MONGOLIAN LETTER ALI GALI ANUSVARA ONE"/* 1880 */, /*6273*/"MONGOLIAN LETTER ALI GALI VISARGA ONE"/* 1881 */,/*6274*/"MONGOLIAN LETTER ALI GALI DAMARU"/* 1882 */, /*6275*/"MONGOLIAN LETTER ALI GALI UBADAMA"/* 1883 */,/*6276*/"MONGOLIAN LETTER ALI GALI INVERTED UBADAMA"/* 1884 */, /*6277*/"MONGOLIAN LETTER ALI GALI BALUDA"/* 1885 */,/*6278*/"MONGOLIAN LETTER ALI GALI THREE BALUDA"/* 1886 */, /*6279*/"MONGOLIAN LETTER ALI GALI A"/* 1887 */,/*6280*/"MONGOLIAN LETTER ALI GALI I"/* 1888 */, /*6281*/"MONGOLIAN LETTER ALI GALI KA"/* 1889 */,/*6282*/"MONGOLIAN LETTER ALI GALI NGA"/* 188A */, /*6283*/"MONGOLIAN LETTER ALI GALI CA"/* 188B */,/*6284*/"MONGOLIAN LETTER ALI GALI TTA"/* 188C */, /*6285*/"MONGOLIAN LETTER ALI GALI TTHA"/* 188D */,/*6286*/"MONGOLIAN LETTER ALI GALI DDA"/* 188E */, /*6287*/"MONGOLIAN LETTER ALI GALI NNA"/* 188F */,/*6288*/"MONGOLIAN LETTER ALI GALI TA"/* 1890 */, /*6289*/"MONGOLIAN LETTER ALI GALI DA"/* 1891 */,/*6290*/"MONGOLIAN LETTER ALI GALI PA"/* 1892 */, /*6291*/"MONGOLIAN LETTER ALI GALI PHA"/* 1893 */,/*6292*/"MONGOLIAN LETTER ALI GALI SSA"/* 1894 */, /*6293*/"MONGOLIAN LETTER ALI GALI ZHA"/* 1895 */,/*6294*/"MONGOLIAN LETTER ALI GALI ZA"/* 1896 */, /*6295*/"MONGOLIAN LETTER ALI GALI AH"/* 1897 */,/*6296*/"MONGOLIAN LETTER TODO ALI GALI TA"/* 1898 */, /*6297*/"MONGOLIAN LETTER TODO ALI GALI ZHA"/* 1899 */,/*6298*/"MONGOLIAN LETTER MANCHU ALI GALI GHA"/* 189A */, /*6299*/"MONGOLIAN LETTER MANCHU ALI GALI NGA"/* 189B */,/*6300*/"MONGOLIAN LETTER MANCHU ALI GALI CA"/* 189C */, /*6301*/"MONGOLIAN LETTER MANCHU ALI GALI JHA"/* 189D */,/*6302*/"MONGOLIAN LETTER MANCHU ALI GALI TTA"/* 189E */, /*6303*/"MONGOLIAN LETTER MANCHU ALI GALI DDHA"/* 189F */,/*6304*/"MONGOLIAN LETTER MANCHU ALI GALI TA"/* 18A0 */, /*6305*/"MONGOLIAN LETTER MANCHU ALI GALI DHA"/* 18A1 */,/*6306*/"MONGOLIAN LETTER MANCHU ALI GALI SSA"/* 18A2 */, /*6307*/"MONGOLIAN LETTER MANCHU ALI GALI CYA"/* 18A3 */,/*6308*/"MONGOLIAN LETTER MANCHU ALI GALI ZHA"/* 18A4 */, /*6309*/"MONGOLIAN LETTER MANCHU ALI GALI ZA"/* 18A5 */,/*6310*/"MONGOLIAN LETTER ALI GALI HALF U"/* 18A6 */, /*6311*/"MONGOLIAN LETTER ALI GALI HALF YA"/* 18A7 */,/*6312*/"MONGOLIAN LETTER MANCHU ALI GALI BHA"/* 18A8 */, /*6313*/"MONGOLIAN LETTER ALI GALI DAGALGA"/* 18A9 */,/*6314*/"MONGOLIAN LETTER MANCHU ALI GALI LHA"/* 18AA */,NULL,NULL, NULL,NULL,NULL,/*6320*/"CANADIAN SYLLABICS OY"/* 18B0 */,/*6321*/"CANADIAN SYLLABICS AY"/* 18B1 */, /*6322*/"CANADIAN SYLLABICS AAY"/* 18B2 */,/*6323*/"CANADIAN SYLLABICS WAY"/* 18B3 */, /*6324*/"CANADIAN SYLLABICS POY"/* 18B4 */,/*6325*/"CANADIAN SYLLABICS PAY"/* 18B5 */, /*6326*/"CANADIAN SYLLABICS PWOY"/* 18B6 */,/*6327*/"CANADIAN SYLLABICS TAY"/* 18B7 */, /*6328*/"CANADIAN SYLLABICS KAY"/* 18B8 */,/*6329*/"CANADIAN SYLLABICS KWAY"/* 18B9 */, /*6330*/"CANADIAN SYLLABICS MAY"/* 18BA */,/*6331*/"CANADIAN SYLLABICS NOY"/* 18BB */, /*6332*/"CANADIAN SYLLABICS NAY"/* 18BC */,/*6333*/"CANADIAN SYLLABICS LAY"/* 18BD */, /*6334*/"CANADIAN SYLLABICS SOY"/* 18BE */,/*6335*/"CANADIAN SYLLABICS SAY"/* 18BF */, /*6336*/"CANADIAN SYLLABICS SHOY"/* 18C0 */,/*6337*/"CANADIAN SYLLABICS SHAY"/* 18C1 */, /*6338*/"CANADIAN SYLLABICS SHWOY"/* 18C2 */,/*6339*/"CANADIAN SYLLABICS YOY"/* 18C3 */, /*6340*/"CANADIAN SYLLABICS YAY"/* 18C4 */,/*6341*/"CANADIAN SYLLABICS RAY"/* 18C5 */, /*6342*/"CANADIAN SYLLABICS NWI"/* 18C6 */,/*6343*/"CANADIAN SYLLABICS OJIBWAY NWI"/* 18C7 */, /*6344*/"CANADIAN SYLLABICS NWII"/* 18C8 */,/*6345*/"CANADIAN SYLLABICS OJIBWAY NWII"/* 18C9 */, /*6346*/"CANADIAN SYLLABICS NWO"/* 18CA */,/*6347*/"CANADIAN SYLLABICS OJIBWAY NWO"/* 18CB */, /*6348*/"CANADIAN SYLLABICS NWOO"/* 18CC */,/*6349*/"CANADIAN SYLLABICS OJIBWAY NWOO"/* 18CD */, /*6350*/"CANADIAN SYLLABICS RWEE"/* 18CE */,/*6351*/"CANADIAN SYLLABICS RWI"/* 18CF */, /*6352*/"CANADIAN SYLLABICS RWII"/* 18D0 */,/*6353*/"CANADIAN SYLLABICS RWO"/* 18D1 */, /*6354*/"CANADIAN SYLLABICS RWOO"/* 18D2 */,/*6355*/"CANADIAN SYLLABICS RWA"/* 18D3 */, /*6356*/"CANADIAN SYLLABICS OJIBWAY P"/* 18D4 */,/*6357*/"CANADIAN SYLLABICS OJIBWAY T"/* 18D5 */, /*6358*/"CANADIAN SYLLABICS OJIBWAY K"/* 18D6 */,/*6359*/"CANADIAN SYLLABICS OJIBWAY C"/* 18D7 */, /*6360*/"CANADIAN SYLLABICS OJIBWAY M"/* 18D8 */,/*6361*/"CANADIAN SYLLABICS OJIBWAY N"/* 18D9 */, /*6362*/"CANADIAN SYLLABICS OJIBWAY S"/* 18DA */,/*6363*/"CANADIAN SYLLABICS OJIBWAY SH"/* 18DB */, /*6364*/"CANADIAN SYLLABICS EASTERN W"/* 18DC */,/*6365*/"CANADIAN SYLLABICS WESTERN W"/* 18DD */, /*6366*/"CANADIAN SYLLABICS FINAL SMALL RING"/* 18DE */,/*6367*/"CANADIAN SYLLABICS FINAL RAISED DOT"/* 18DF */, /*6368*/"CANADIAN SYLLABICS R-CREE RWE"/* 18E0 */,/*6369*/"CANADIAN SYLLABICS WEST-CREE LOO"/* 18E1 */, /*6370*/"CANADIAN SYLLABICS WEST-CREE LAA"/* 18E2 */,/*6371*/"CANADIAN SYLLABICS THWE"/* 18E3 */, /*6372*/"CANADIAN SYLLABICS THWA"/* 18E4 */,/*6373*/"CANADIAN SYLLABICS TTHWE"/* 18E5 */, /*6374*/"CANADIAN SYLLABICS TTHOO"/* 18E6 */,/*6375*/"CANADIAN SYLLABICS TTHAA"/* 18E7 */, /*6376*/"CANADIAN SYLLABICS TLHWE"/* 18E8 */,/*6377*/"CANADIAN SYLLABICS TLHOO"/* 18E9 */, /*6378*/"CANADIAN SYLLABICS SAYISI SHWE"/* 18EA */,/*6379*/"CANADIAN SYLLABICS SAYISI SHOO"/* 18EB */, /*6380*/"CANADIAN SYLLABICS SAYISI HOO"/* 18EC */,/*6381*/"CANADIAN SYLLABICS CARRIER GWU"/* 18ED */, /*6382*/"CANADIAN SYLLABICS CARRIER DENE GEE"/* 18EE */,/*6383*/"CANADIAN SYLLABICS CARRIER GAA"/* 18EF */, /*6384*/"CANADIAN SYLLABICS CARRIER GWA"/* 18F0 */,/*6385*/"CANADIAN SYLLABICS SAYISI JUU"/* 18F1 */, /*6386*/"CANADIAN SYLLABICS CARRIER JWA"/* 18F2 */,/*6387*/"CANADIAN SYLLABICS BEAVER DENE L"/* 18F3 */, /*6388*/"CANADIAN SYLLABICS BEAVER DENE R"/* 18F4 */,/*6389*/"CANADIAN SYLLABICS CARRIER DENTAL S"/* 18F5 */,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*6400*/"LIMBU VOWEL-CARRIER LETTER"/* 1900 */, /*6401*/"LIMBU LETTER KA"/* 1901 */,/*6402*/"LIMBU LETTER KHA"/* 1902 */,/*6403*/"LIMBU LETTER GA"/* 1903 */, /*6404*/"LIMBU LETTER GHA"/* 1904 */,/*6405*/"LIMBU LETTER NGA"/* 1905 */,/*6406*/"LIMBU LETTER CA"/* 1906 */, /*6407*/"LIMBU LETTER CHA"/* 1907 */,/*6408*/"LIMBU LETTER JA"/* 1908 */,/*6409*/"LIMBU LETTER JHA"/* 1909 */, /*6410*/"LIMBU LETTER YAN"/* 190A */,/*6411*/"LIMBU LETTER TA"/* 190B */,/*6412*/"LIMBU LETTER THA"/* 190C */, /*6413*/"LIMBU LETTER DA"/* 190D */,/*6414*/"LIMBU LETTER DHA"/* 190E */,/*6415*/"LIMBU LETTER NA"/* 190F */, /*6416*/"LIMBU LETTER PA"/* 1910 */,/*6417*/"LIMBU LETTER PHA"/* 1911 */,/*6418*/"LIMBU LETTER BA"/* 1912 */, /*6419*/"LIMBU LETTER BHA"/* 1913 */,/*6420*/"LIMBU LETTER MA"/* 1914 */,/*6421*/"LIMBU LETTER YA"/* 1915 */, /*6422*/"LIMBU LETTER RA"/* 1916 */,/*6423*/"LIMBU LETTER LA"/* 1917 */,/*6424*/"LIMBU LETTER WA"/* 1918 */, /*6425*/"LIMBU LETTER SHA"/* 1919 */,/*6426*/"LIMBU LETTER SSA"/* 191A */,/*6427*/"LIMBU LETTER SA"/* 191B */, /*6428*/"LIMBU LETTER HA"/* 191C */,/*6429*/"LIMBU LETTER GYAN"/* 191D */,/*6430*/"LIMBU LETTER TRA"/* 191E */,NULL, /*6432*/"LIMBU VOWEL SIGN A"/* 1920 */,/*6433*/"LIMBU VOWEL SIGN I"/* 1921 */,/*6434*/"LIMBU VOWEL SIGN U"/* 1922 */, /*6435*/"LIMBU VOWEL SIGN EE"/* 1923 */,/*6436*/"LIMBU VOWEL SIGN AI"/* 1924 */,/*6437*/"LIMBU VOWEL SIGN OO"/* 1925 */, /*6438*/"LIMBU VOWEL SIGN AU"/* 1926 */,/*6439*/"LIMBU VOWEL SIGN E"/* 1927 */,/*6440*/"LIMBU VOWEL SIGN O"/* 1928 */, /*6441*/"LIMBU SUBJOINED LETTER YA"/* 1929 */,/*6442*/"LIMBU SUBJOINED LETTER RA"/* 192A */, /*6443*/"LIMBU SUBJOINED LETTER WA"/* 192B */,NULL,NULL,NULL,NULL,/*6448*/"LIMBU SMALL LETTER KA"/* 1930 */, /*6449*/"LIMBU SMALL LETTER NGA"/* 1931 */,/*6450*/"LIMBU SMALL LETTER ANUSVARA"/* 1932 */, /*6451*/"LIMBU SMALL LETTER TA"/* 1933 */,/*6452*/"LIMBU SMALL LETTER NA"/* 1934 */, /*6453*/"LIMBU SMALL LETTER PA"/* 1935 */,/*6454*/"LIMBU SMALL LETTER MA"/* 1936 */, /*6455*/"LIMBU SMALL LETTER RA"/* 1937 */,/*6456*/"LIMBU SMALL LETTER LA"/* 1938 */, /*6457*/"LIMBU SIGN MUKPHRENG"/* 1939 */,/*6458*/"LIMBU SIGN KEMPHRENG"/* 193A */,/*6459*/"LIMBU SIGN SA-I"/* 193B */, NULL,NULL,NULL,NULL,/*6464*/"LIMBU SIGN LOO"/* 1940 */,NULL,NULL,NULL,/*6468*/"LIMBU EXCLAMATION MARK"/* 1944 */, /*6469*/"LIMBU QUESTION MARK"/* 1945 */,/*6470*/"LIMBU DIGIT ZERO"/* 1946 */,/*6471*/"LIMBU DIGIT ONE"/* 1947 */, /*6472*/"LIMBU DIGIT TWO"/* 1948 */,/*6473*/"LIMBU DIGIT THREE"/* 1949 */,/*6474*/"LIMBU DIGIT FOUR"/* 194A */, /*6475*/"LIMBU DIGIT FIVE"/* 194B */,/*6476*/"LIMBU DIGIT SIX"/* 194C */,/*6477*/"LIMBU DIGIT SEVEN"/* 194D */, /*6478*/"LIMBU DIGIT EIGHT"/* 194E */,/*6479*/"LIMBU DIGIT NINE"/* 194F */,/*6480*/"TAI LE LETTER KA"/* 1950 */, /*6481*/"TAI LE LETTER XA"/* 1951 */,/*6482*/"TAI LE LETTER NGA"/* 1952 */,/*6483*/"TAI LE LETTER TSA"/* 1953 */, /*6484*/"TAI LE LETTER SA"/* 1954 */,/*6485*/"TAI LE LETTER YA"/* 1955 */,/*6486*/"TAI LE LETTER TA"/* 1956 */, /*6487*/"TAI LE LETTER THA"/* 1957 */,/*6488*/"TAI LE LETTER LA"/* 1958 */,/*6489*/"TAI LE LETTER PA"/* 1959 */, /*6490*/"TAI LE LETTER PHA"/* 195A */,/*6491*/"TAI LE LETTER MA"/* 195B */,/*6492*/"TAI LE LETTER FA"/* 195C */, /*6493*/"TAI LE LETTER VA"/* 195D */,/*6494*/"TAI LE LETTER HA"/* 195E */,/*6495*/"TAI LE LETTER QA"/* 195F */, /*6496*/"TAI LE LETTER KHA"/* 1960 */,/*6497*/"TAI LE LETTER TSHA"/* 1961 */,/*6498*/"TAI LE LETTER NA"/* 1962 */, /*6499*/"TAI LE LETTER A"/* 1963 */,/*6500*/"TAI LE LETTER I"/* 1964 */,/*6501*/"TAI LE LETTER EE"/* 1965 */, /*6502*/"TAI LE LETTER EH"/* 1966 */,/*6503*/"TAI LE LETTER U"/* 1967 */,/*6504*/"TAI LE LETTER OO"/* 1968 */, /*6505*/"TAI LE LETTER O"/* 1969 */,/*6506*/"TAI LE LETTER UE"/* 196A */,/*6507*/"TAI LE LETTER E"/* 196B */, /*6508*/"TAI LE LETTER AUE"/* 196C */,/*6509*/"TAI LE LETTER AI"/* 196D */,NULL,NULL, /*6512*/"TAI LE LETTER TONE-2"/* 1970 */,/*6513*/"TAI LE LETTER TONE-3"/* 1971 */, /*6514*/"TAI LE LETTER TONE-4"/* 1972 */,/*6515*/"TAI LE LETTER TONE-5"/* 1973 */, /*6516*/"TAI LE LETTER TONE-6"/* 1974 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*6528*/"NEW TAI LUE LETTER HIGH QA"/* 1980 */,/*6529*/"NEW TAI LUE LETTER LOW QA"/* 1981 */, /*6530*/"NEW TAI LUE LETTER HIGH KA"/* 1982 */,/*6531*/"NEW TAI LUE LETTER HIGH XA"/* 1983 */, /*6532*/"NEW TAI LUE LETTER HIGH NGA"/* 1984 */,/*6533*/"NEW TAI LUE LETTER LOW KA"/* 1985 */, /*6534*/"NEW TAI LUE LETTER LOW XA"/* 1986 */,/*6535*/"NEW TAI LUE LETTER LOW NGA"/* 1987 */, /*6536*/"NEW TAI LUE LETTER HIGH TSA"/* 1988 */,/*6537*/"NEW TAI LUE LETTER HIGH SA"/* 1989 */, /*6538*/"NEW TAI LUE LETTER HIGH YA"/* 198A */,/*6539*/"NEW TAI LUE LETTER LOW TSA"/* 198B */, /*6540*/"NEW TAI LUE LETTER LOW SA"/* 198C */,/*6541*/"NEW TAI LUE LETTER LOW YA"/* 198D */, /*6542*/"NEW TAI LUE LETTER HIGH TA"/* 198E */,/*6543*/"NEW TAI LUE LETTER HIGH THA"/* 198F */, /*6544*/"NEW TAI LUE LETTER HIGH NA"/* 1990 */,/*6545*/"NEW TAI LUE LETTER LOW TA"/* 1991 */, /*6546*/"NEW TAI LUE LETTER LOW THA"/* 1992 */,/*6547*/"NEW TAI LUE LETTER LOW NA"/* 1993 */, /*6548*/"NEW TAI LUE LETTER HIGH PA"/* 1994 */,/*6549*/"NEW TAI LUE LETTER HIGH PHA"/* 1995 */, /*6550*/"NEW TAI LUE LETTER HIGH MA"/* 1996 */,/*6551*/"NEW TAI LUE LETTER LOW PA"/* 1997 */, /*6552*/"NEW TAI LUE LETTER LOW PHA"/* 1998 */,/*6553*/"NEW TAI LUE LETTER LOW MA"/* 1999 */, /*6554*/"NEW TAI LUE LETTER HIGH FA"/* 199A */,/*6555*/"NEW TAI LUE LETTER HIGH VA"/* 199B */, /*6556*/"NEW TAI LUE LETTER HIGH LA"/* 199C */,/*6557*/"NEW TAI LUE LETTER LOW FA"/* 199D */, /*6558*/"NEW TAI LUE LETTER LOW VA"/* 199E */,/*6559*/"NEW TAI LUE LETTER LOW LA"/* 199F */, /*6560*/"NEW TAI LUE LETTER HIGH HA"/* 19A0 */,/*6561*/"NEW TAI LUE LETTER HIGH DA"/* 19A1 */, /*6562*/"NEW TAI LUE LETTER HIGH BA"/* 19A2 */,/*6563*/"NEW TAI LUE LETTER LOW HA"/* 19A3 */, /*6564*/"NEW TAI LUE LETTER LOW DA"/* 19A4 */,/*6565*/"NEW TAI LUE LETTER LOW BA"/* 19A5 */, /*6566*/"NEW TAI LUE LETTER HIGH KVA"/* 19A6 */,/*6567*/"NEW TAI LUE LETTER HIGH XVA"/* 19A7 */, /*6568*/"NEW TAI LUE LETTER LOW KVA"/* 19A8 */,/*6569*/"NEW TAI LUE LETTER LOW XVA"/* 19A9 */, /*6570*/"NEW TAI LUE LETTER HIGH SUA"/* 19AA */,/*6571*/"NEW TAI LUE LETTER LOW SUA"/* 19AB */,NULL,NULL,NULL,NULL, /*6576*/"NEW TAI LUE VOWEL SIGN VOWEL SHORTENER"/* 19B0 */,/*6577*/"NEW TAI LUE VOWEL SIGN AA"/* 19B1 */, /*6578*/"NEW TAI LUE VOWEL SIGN II"/* 19B2 */,/*6579*/"NEW TAI LUE VOWEL SIGN U"/* 19B3 */, /*6580*/"NEW TAI LUE VOWEL SIGN UU"/* 19B4 */,/*6581*/"NEW TAI LUE VOWEL SIGN E"/* 19B5 */, /*6582*/"NEW TAI LUE VOWEL SIGN AE"/* 19B6 */,/*6583*/"NEW TAI LUE VOWEL SIGN O"/* 19B7 */, /*6584*/"NEW TAI LUE VOWEL SIGN OA"/* 19B8 */,/*6585*/"NEW TAI LUE VOWEL SIGN UE"/* 19B9 */, /*6586*/"NEW TAI LUE VOWEL SIGN AY"/* 19BA */,/*6587*/"NEW TAI LUE VOWEL SIGN AAY"/* 19BB */, /*6588*/"NEW TAI LUE VOWEL SIGN UY"/* 19BC */,/*6589*/"NEW TAI LUE VOWEL SIGN OY"/* 19BD */, /*6590*/"NEW TAI LUE VOWEL SIGN OAY"/* 19BE */,/*6591*/"NEW TAI LUE VOWEL SIGN UEY"/* 19BF */, /*6592*/"NEW TAI LUE VOWEL SIGN IY"/* 19C0 */,/*6593*/"NEW TAI LUE LETTER FINAL V"/* 19C1 */, /*6594*/"NEW TAI LUE LETTER FINAL NG"/* 19C2 */,/*6595*/"NEW TAI LUE LETTER FINAL N"/* 19C3 */, /*6596*/"NEW TAI LUE LETTER FINAL M"/* 19C4 */,/*6597*/"NEW TAI LUE LETTER FINAL K"/* 19C5 */, /*6598*/"NEW TAI LUE LETTER FINAL D"/* 19C6 */,/*6599*/"NEW TAI LUE LETTER FINAL B"/* 19C7 */, /*6600*/"NEW TAI LUE TONE MARK-1"/* 19C8 */,/*6601*/"NEW TAI LUE TONE MARK-2"/* 19C9 */,NULL,NULL,NULL,NULL,NULL,NULL, /*6608*/"NEW TAI LUE DIGIT ZERO"/* 19D0 */,/*6609*/"NEW TAI LUE DIGIT ONE"/* 19D1 */, /*6610*/"NEW TAI LUE DIGIT TWO"/* 19D2 */,/*6611*/"NEW TAI LUE DIGIT THREE"/* 19D3 */, /*6612*/"NEW TAI LUE DIGIT FOUR"/* 19D4 */,/*6613*/"NEW TAI LUE DIGIT FIVE"/* 19D5 */, /*6614*/"NEW TAI LUE DIGIT SIX"/* 19D6 */,/*6615*/"NEW TAI LUE DIGIT SEVEN"/* 19D7 */, /*6616*/"NEW TAI LUE DIGIT EIGHT"/* 19D8 */,/*6617*/"NEW TAI LUE DIGIT NINE"/* 19D9 */, /*6618*/"NEW TAI LUE THAM DIGIT ONE"/* 19DA */,NULL,NULL,NULL,/*6622*/"NEW TAI LUE SIGN LAE"/* 19DE */, /*6623*/"NEW TAI LUE SIGN LAEV"/* 19DF */,/*6624*/"KHMER SYMBOL PATHAMASAT"/* 19E0 */, /*6625*/"KHMER SYMBOL MUOY KOET"/* 19E1 */,/*6626*/"KHMER SYMBOL PII KOET"/* 19E2 */, /*6627*/"KHMER SYMBOL BEI KOET"/* 19E3 */,/*6628*/"KHMER SYMBOL BUON KOET"/* 19E4 */, /*6629*/"KHMER SYMBOL PRAM KOET"/* 19E5 */,/*6630*/"KHMER SYMBOL PRAM-MUOY KOET"/* 19E6 */, /*6631*/"KHMER SYMBOL PRAM-PII KOET"/* 19E7 */,/*6632*/"KHMER SYMBOL PRAM-BEI KOET"/* 19E8 */, /*6633*/"KHMER SYMBOL PRAM-BUON KOET"/* 19E9 */,/*6634*/"KHMER SYMBOL DAP KOET"/* 19EA */, /*6635*/"KHMER SYMBOL DAP-MUOY KOET"/* 19EB */,/*6636*/"KHMER SYMBOL DAP-PII KOET"/* 19EC */, /*6637*/"KHMER SYMBOL DAP-BEI KOET"/* 19ED */,/*6638*/"KHMER SYMBOL DAP-BUON KOET"/* 19EE */, /*6639*/"KHMER SYMBOL DAP-PRAM KOET"/* 19EF */,/*6640*/"KHMER SYMBOL TUTEYASAT"/* 19F0 */, /*6641*/"KHMER SYMBOL MUOY ROC"/* 19F1 */,/*6642*/"KHMER SYMBOL PII ROC"/* 19F2 */, /*6643*/"KHMER SYMBOL BEI ROC"/* 19F3 */,/*6644*/"KHMER SYMBOL BUON ROC"/* 19F4 */, /*6645*/"KHMER SYMBOL PRAM ROC"/* 19F5 */,/*6646*/"KHMER SYMBOL PRAM-MUOY ROC"/* 19F6 */, /*6647*/"KHMER SYMBOL PRAM-PII ROC"/* 19F7 */,/*6648*/"KHMER SYMBOL PRAM-BEI ROC"/* 19F8 */, /*6649*/"KHMER SYMBOL PRAM-BUON ROC"/* 19F9 */,/*6650*/"KHMER SYMBOL DAP ROC"/* 19FA */, /*6651*/"KHMER SYMBOL DAP-MUOY ROC"/* 19FB */,/*6652*/"KHMER SYMBOL DAP-PII ROC"/* 19FC */, /*6653*/"KHMER SYMBOL DAP-BEI ROC"/* 19FD */,/*6654*/"KHMER SYMBOL DAP-BUON ROC"/* 19FE */, /*6655*/"KHMER SYMBOL DAP-PRAM ROC"/* 19FF */,/*6656*/"BUGINESE LETTER KA"/* 1A00 */, /*6657*/"BUGINESE LETTER GA"/* 1A01 */,/*6658*/"BUGINESE LETTER NGA"/* 1A02 */,/*6659*/"BUGINESE LETTER NGKA"/* 1A03 */, /*6660*/"BUGINESE LETTER PA"/* 1A04 */,/*6661*/"BUGINESE LETTER BA"/* 1A05 */,/*6662*/"BUGINESE LETTER MA"/* 1A06 */, /*6663*/"BUGINESE LETTER MPA"/* 1A07 */,/*6664*/"BUGINESE LETTER TA"/* 1A08 */,/*6665*/"BUGINESE LETTER DA"/* 1A09 */, /*6666*/"BUGINESE LETTER NA"/* 1A0A */,/*6667*/"BUGINESE LETTER NRA"/* 1A0B */,/*6668*/"BUGINESE LETTER CA"/* 1A0C */, /*6669*/"BUGINESE LETTER JA"/* 1A0D */,/*6670*/"BUGINESE LETTER NYA"/* 1A0E */,/*6671*/"BUGINESE LETTER NYCA"/* 1A0F */, /*6672*/"BUGINESE LETTER YA"/* 1A10 */,/*6673*/"BUGINESE LETTER RA"/* 1A11 */,/*6674*/"BUGINESE LETTER LA"/* 1A12 */, /*6675*/"BUGINESE LETTER VA"/* 1A13 */,/*6676*/"BUGINESE LETTER SA"/* 1A14 */,/*6677*/"BUGINESE LETTER A"/* 1A15 */, /*6678*/"BUGINESE LETTER HA"/* 1A16 */,/*6679*/"BUGINESE VOWEL SIGN I"/* 1A17 */, /*6680*/"BUGINESE VOWEL SIGN U"/* 1A18 */,/*6681*/"BUGINESE VOWEL SIGN E"/* 1A19 */, /*6682*/"BUGINESE VOWEL SIGN O"/* 1A1A */,/*6683*/"BUGINESE VOWEL SIGN AE"/* 1A1B */,NULL,NULL, /*6686*/"BUGINESE PALLAWA"/* 1A1E */,/*6687*/"BUGINESE END OF SECTION"/* 1A1F */, /*6688*/"TAI THAM LETTER HIGH KA"/* 1A20 */,/*6689*/"TAI THAM LETTER HIGH KHA"/* 1A21 */, /*6690*/"TAI THAM LETTER HIGH KXA"/* 1A22 */,/*6691*/"TAI THAM LETTER LOW KA"/* 1A23 */, /*6692*/"TAI THAM LETTER LOW KXA"/* 1A24 */,/*6693*/"TAI THAM LETTER LOW KHA"/* 1A25 */, /*6694*/"TAI THAM LETTER NGA"/* 1A26 */,/*6695*/"TAI THAM LETTER HIGH CA"/* 1A27 */, /*6696*/"TAI THAM LETTER HIGH CHA"/* 1A28 */,/*6697*/"TAI THAM LETTER LOW CA"/* 1A29 */, /*6698*/"TAI THAM LETTER LOW SA"/* 1A2A */,/*6699*/"TAI THAM LETTER LOW CHA"/* 1A2B */, /*6700*/"TAI THAM LETTER NYA"/* 1A2C */,/*6701*/"TAI THAM LETTER RATA"/* 1A2D */, /*6702*/"TAI THAM LETTER HIGH RATHA"/* 1A2E */,/*6703*/"TAI THAM LETTER DA"/* 1A2F */, /*6704*/"TAI THAM LETTER LOW RATHA"/* 1A30 */,/*6705*/"TAI THAM LETTER RANA"/* 1A31 */, /*6706*/"TAI THAM LETTER HIGH TA"/* 1A32 */,/*6707*/"TAI THAM LETTER HIGH THA"/* 1A33 */, /*6708*/"TAI THAM LETTER LOW TA"/* 1A34 */,/*6709*/"TAI THAM LETTER LOW THA"/* 1A35 */, /*6710*/"TAI THAM LETTER NA"/* 1A36 */,/*6711*/"TAI THAM LETTER BA"/* 1A37 */, /*6712*/"TAI THAM LETTER HIGH PA"/* 1A38 */,/*6713*/"TAI THAM LETTER HIGH PHA"/* 1A39 */, /*6714*/"TAI THAM LETTER HIGH FA"/* 1A3A */,/*6715*/"TAI THAM LETTER LOW PA"/* 1A3B */, /*6716*/"TAI THAM LETTER LOW FA"/* 1A3C */,/*6717*/"TAI THAM LETTER LOW PHA"/* 1A3D */, /*6718*/"TAI THAM LETTER MA"/* 1A3E */,/*6719*/"TAI THAM LETTER LOW YA"/* 1A3F */, /*6720*/"TAI THAM LETTER HIGH YA"/* 1A40 */,/*6721*/"TAI THAM LETTER RA"/* 1A41 */, /*6722*/"TAI THAM LETTER RUE"/* 1A42 */,/*6723*/"TAI THAM LETTER LA"/* 1A43 */,/*6724*/"TAI THAM LETTER LUE"/* 1A44 */, /*6725*/"TAI THAM LETTER WA"/* 1A45 */,/*6726*/"TAI THAM LETTER HIGH SHA"/* 1A46 */, /*6727*/"TAI THAM LETTER HIGH SSA"/* 1A47 */,/*6728*/"TAI THAM LETTER HIGH SA"/* 1A48 */, /*6729*/"TAI THAM LETTER HIGH HA"/* 1A49 */,/*6730*/"TAI THAM LETTER LLA"/* 1A4A */, /*6731*/"TAI THAM LETTER A"/* 1A4B */,/*6732*/"TAI THAM LETTER LOW HA"/* 1A4C */,/*6733*/"TAI THAM LETTER I"/* 1A4D */, /*6734*/"TAI THAM LETTER II"/* 1A4E */,/*6735*/"TAI THAM LETTER U"/* 1A4F */,/*6736*/"TAI THAM LETTER UU"/* 1A50 */, /*6737*/"TAI THAM LETTER EE"/* 1A51 */,/*6738*/"TAI THAM LETTER OO"/* 1A52 */,/*6739*/"TAI THAM LETTER LAE"/* 1A53 */, /*6740*/"TAI THAM LETTER GREAT SA"/* 1A54 */,/*6741*/"TAI THAM CONSONANT SIGN MEDIAL RA"/* 1A55 */, /*6742*/"TAI THAM CONSONANT SIGN MEDIAL LA"/* 1A56 */,/*6743*/"TAI THAM CONSONANT SIGN LA TANG LAI"/* 1A57 */, /*6744*/"TAI THAM SIGN MAI KANG LAI"/* 1A58 */,/*6745*/"TAI THAM CONSONANT SIGN FINAL NGA"/* 1A59 */, /*6746*/"TAI THAM CONSONANT SIGN LOW PA"/* 1A5A */,/*6747*/"TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA"/* 1A5B */, /*6748*/"TAI THAM CONSONANT SIGN MA"/* 1A5C */,/*6749*/"TAI THAM CONSONANT SIGN BA"/* 1A5D */, /*6750*/"TAI THAM CONSONANT SIGN SA"/* 1A5E */,NULL,/*6752*/"TAI THAM SIGN SAKOT"/* 1A60 */, /*6753*/"TAI THAM VOWEL SIGN A"/* 1A61 */,/*6754*/"TAI THAM VOWEL SIGN MAI SAT"/* 1A62 */, /*6755*/"TAI THAM VOWEL SIGN AA"/* 1A63 */,/*6756*/"TAI THAM VOWEL SIGN TALL AA"/* 1A64 */, /*6757*/"TAI THAM VOWEL SIGN I"/* 1A65 */,/*6758*/"TAI THAM VOWEL SIGN II"/* 1A66 */, /*6759*/"TAI THAM VOWEL SIGN UE"/* 1A67 */,/*6760*/"TAI THAM VOWEL SIGN UUE"/* 1A68 */, /*6761*/"TAI THAM VOWEL SIGN U"/* 1A69 */,/*6762*/"TAI THAM VOWEL SIGN UU"/* 1A6A */, /*6763*/"TAI THAM VOWEL SIGN O"/* 1A6B */,/*6764*/"TAI THAM VOWEL SIGN OA BELOW"/* 1A6C */, /*6765*/"TAI THAM VOWEL SIGN OY"/* 1A6D */,/*6766*/"TAI THAM VOWEL SIGN E"/* 1A6E */, /*6767*/"TAI THAM VOWEL SIGN AE"/* 1A6F */,/*6768*/"TAI THAM VOWEL SIGN OO"/* 1A70 */, /*6769*/"TAI THAM VOWEL SIGN AI"/* 1A71 */,/*6770*/"TAI THAM VOWEL SIGN THAM AI"/* 1A72 */, /*6771*/"TAI THAM VOWEL SIGN OA ABOVE"/* 1A73 */,/*6772*/"TAI THAM SIGN MAI KANG"/* 1A74 */, /*6773*/"TAI THAM SIGN TONE-1"/* 1A75 */,/*6774*/"TAI THAM SIGN TONE-2"/* 1A76 */, /*6775*/"TAI THAM SIGN KHUEN TONE-3"/* 1A77 */,/*6776*/"TAI THAM SIGN KHUEN TONE-4"/* 1A78 */, /*6777*/"TAI THAM SIGN KHUEN TONE-5"/* 1A79 */,/*6778*/"TAI THAM SIGN RA HAAM"/* 1A7A */, /*6779*/"TAI THAM SIGN MAI SAM"/* 1A7B */,/*6780*/"TAI THAM SIGN KHUEN-LUE KARAN"/* 1A7C */,NULL,NULL, /*6783*/"TAI THAM COMBINING CRYPTOGRAMMIC DOT"/* 1A7F */,/*6784*/"TAI THAM HORA DIGIT ZERO"/* 1A80 */, /*6785*/"TAI THAM HORA DIGIT ONE"/* 1A81 */,/*6786*/"TAI THAM HORA DIGIT TWO"/* 1A82 */, /*6787*/"TAI THAM HORA DIGIT THREE"/* 1A83 */,/*6788*/"TAI THAM HORA DIGIT FOUR"/* 1A84 */, /*6789*/"TAI THAM HORA DIGIT FIVE"/* 1A85 */,/*6790*/"TAI THAM HORA DIGIT SIX"/* 1A86 */, /*6791*/"TAI THAM HORA DIGIT SEVEN"/* 1A87 */,/*6792*/"TAI THAM HORA DIGIT EIGHT"/* 1A88 */, /*6793*/"TAI THAM HORA DIGIT NINE"/* 1A89 */,NULL,NULL,NULL,NULL,NULL,NULL,/*6800*/"TAI THAM THAM DIGIT ZERO"/* 1A90 */, /*6801*/"TAI THAM THAM DIGIT ONE"/* 1A91 */,/*6802*/"TAI THAM THAM DIGIT TWO"/* 1A92 */, /*6803*/"TAI THAM THAM DIGIT THREE"/* 1A93 */,/*6804*/"TAI THAM THAM DIGIT FOUR"/* 1A94 */, /*6805*/"TAI THAM THAM DIGIT FIVE"/* 1A95 */,/*6806*/"TAI THAM THAM DIGIT SIX"/* 1A96 */, /*6807*/"TAI THAM THAM DIGIT SEVEN"/* 1A97 */,/*6808*/"TAI THAM THAM DIGIT EIGHT"/* 1A98 */, /*6809*/"TAI THAM THAM DIGIT NINE"/* 1A99 */,NULL,NULL,NULL,NULL,NULL,NULL,/*6816*/"TAI THAM SIGN WIANG"/* 1AA0 */, /*6817*/"TAI THAM SIGN WIANGWAAK"/* 1AA1 */,/*6818*/"TAI THAM SIGN SAWAN"/* 1AA2 */, /*6819*/"TAI THAM SIGN KEOW"/* 1AA3 */,/*6820*/"TAI THAM SIGN HOY"/* 1AA4 */,/*6821*/"TAI THAM SIGN DOKMAI"/* 1AA5 */, /*6822*/"TAI THAM SIGN REVERSED ROTATED RANA"/* 1AA6 */,/*6823*/"TAI THAM SIGN MAI YAMOK"/* 1AA7 */, /*6824*/"TAI THAM SIGN KAAN"/* 1AA8 */,/*6825*/"TAI THAM SIGN KAANKUU"/* 1AA9 */, /*6826*/"TAI THAM SIGN SATKAAN"/* 1AAA */,/*6827*/"TAI THAM SIGN SATKAANKUU"/* 1AAB */, /*6828*/"TAI THAM SIGN HANG"/* 1AAC */,/*6829*/"TAI THAM SIGN CAANG"/* 1AAD */,NULL,NULL, /*6832*/"COMBINING DOUBLED CIRCUMFLEX ACCENT"/* 1AB0 */,/*6833*/"COMBINING DIAERESIS-RING"/* 1AB1 */, /*6834*/"COMBINING INFINITY"/* 1AB2 */,/*6835*/"COMBINING DOWNWARDS ARROW"/* 1AB3 */, /*6836*/"COMBINING TRIPLE DOT"/* 1AB4 */,/*6837*/"COMBINING X-X BELOW"/* 1AB5 */, /*6838*/"COMBINING WIGGLY LINE BELOW"/* 1AB6 */,/*6839*/"COMBINING OPEN MARK BELOW"/* 1AB7 */, /*6840*/"COMBINING DOUBLE OPEN MARK BELOW"/* 1AB8 */,/*6841*/"COMBINING LIGHT CENTRALIZATION STROKE BELOW"/* 1AB9 */, /*6842*/"COMBINING STRONG CENTRALIZATION STROKE BELOW"/* 1ABA */,/*6843*/"COMBINING PARENTHESES ABOVE"/* 1ABB */, /*6844*/"COMBINING DOUBLE PARENTHESES ABOVE"/* 1ABC */,/*6845*/"COMBINING PARENTHESES BELOW"/* 1ABD */, /*6846*/"COMBINING PARENTHESES OVERLAY"/* 1ABE */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,/*6912*/"BALINESE SIGN ULU RICEM"/* 1B00 */,/*6913*/"BALINESE SIGN ULU CANDRA"/* 1B01 */, /*6914*/"BALINESE SIGN CECEK"/* 1B02 */,/*6915*/"BALINESE SIGN SURANG"/* 1B03 */,/*6916*/"BALINESE SIGN BISAH"/* 1B04 */, /*6917*/"BALINESE LETTER AKARA"/* 1B05 */,/*6918*/"BALINESE LETTER AKARA TEDUNG"/* 1B06 */, /*6919*/"BALINESE LETTER IKARA"/* 1B07 */,/*6920*/"BALINESE LETTER IKARA TEDUNG"/* 1B08 */, /*6921*/"BALINESE LETTER UKARA"/* 1B09 */,/*6922*/"BALINESE LETTER UKARA TEDUNG"/* 1B0A */, /*6923*/"BALINESE LETTER RA REPA"/* 1B0B */,/*6924*/"BALINESE LETTER RA REPA TEDUNG"/* 1B0C */, /*6925*/"BALINESE LETTER LA LENGA"/* 1B0D */,/*6926*/"BALINESE LETTER LA LENGA TEDUNG"/* 1B0E */, /*6927*/"BALINESE LETTER EKARA"/* 1B0F */,/*6928*/"BALINESE LETTER AIKARA"/* 1B10 */, /*6929*/"BALINESE LETTER OKARA"/* 1B11 */,/*6930*/"BALINESE LETTER OKARA TEDUNG"/* 1B12 */, /*6931*/"BALINESE LETTER KA"/* 1B13 */,/*6932*/"BALINESE LETTER KA MAHAPRANA"/* 1B14 */, /*6933*/"BALINESE LETTER GA"/* 1B15 */,/*6934*/"BALINESE LETTER GA GORA"/* 1B16 */, /*6935*/"BALINESE LETTER NGA"/* 1B17 */,/*6936*/"BALINESE LETTER CA"/* 1B18 */, /*6937*/"BALINESE LETTER CA LACA"/* 1B19 */,/*6938*/"BALINESE LETTER JA"/* 1B1A */, /*6939*/"BALINESE LETTER JA JERA"/* 1B1B */,/*6940*/"BALINESE LETTER NYA"/* 1B1C */, /*6941*/"BALINESE LETTER TA LATIK"/* 1B1D */,/*6942*/"BALINESE LETTER TA MURDA MAHAPRANA"/* 1B1E */, /*6943*/"BALINESE LETTER DA MURDA ALPAPRANA"/* 1B1F */,/*6944*/"BALINESE LETTER DA MURDA MAHAPRANA"/* 1B20 */, /*6945*/"BALINESE LETTER NA RAMBAT"/* 1B21 */,/*6946*/"BALINESE LETTER TA"/* 1B22 */, /*6947*/"BALINESE LETTER TA TAWA"/* 1B23 */,/*6948*/"BALINESE LETTER DA"/* 1B24 */, /*6949*/"BALINESE LETTER DA MADU"/* 1B25 */,/*6950*/"BALINESE LETTER NA"/* 1B26 */, /*6951*/"BALINESE LETTER PA"/* 1B27 */,/*6952*/"BALINESE LETTER PA KAPAL"/* 1B28 */, /*6953*/"BALINESE LETTER BA"/* 1B29 */,/*6954*/"BALINESE LETTER BA KEMBANG"/* 1B2A */, /*6955*/"BALINESE LETTER MA"/* 1B2B */,/*6956*/"BALINESE LETTER YA"/* 1B2C */,/*6957*/"BALINESE LETTER RA"/* 1B2D */, /*6958*/"BALINESE LETTER LA"/* 1B2E */,/*6959*/"BALINESE LETTER WA"/* 1B2F */, /*6960*/"BALINESE LETTER SA SAGA"/* 1B30 */,/*6961*/"BALINESE LETTER SA SAPA"/* 1B31 */, /*6962*/"BALINESE LETTER SA"/* 1B32 */,/*6963*/"BALINESE LETTER HA"/* 1B33 */,/*6964*/"BALINESE SIGN REREKAN"/* 1B34 */, /*6965*/"BALINESE VOWEL SIGN TEDUNG"/* 1B35 */,/*6966*/"BALINESE VOWEL SIGN ULU"/* 1B36 */, /*6967*/"BALINESE VOWEL SIGN ULU SARI"/* 1B37 */,/*6968*/"BALINESE VOWEL SIGN SUKU"/* 1B38 */, /*6969*/"BALINESE VOWEL SIGN SUKU ILUT"/* 1B39 */,/*6970*/"BALINESE VOWEL SIGN RA REPA"/* 1B3A */, /*6971*/"BALINESE VOWEL SIGN RA REPA TEDUNG"/* 1B3B */,/*6972*/"BALINESE VOWEL SIGN LA LENGA"/* 1B3C */, /*6973*/"BALINESE VOWEL SIGN LA LENGA TEDUNG"/* 1B3D */,/*6974*/"BALINESE VOWEL SIGN TALING"/* 1B3E */, /*6975*/"BALINESE VOWEL SIGN TALING REPA"/* 1B3F */,/*6976*/"BALINESE VOWEL SIGN TALING TEDUNG"/* 1B40 */, /*6977*/"BALINESE VOWEL SIGN TALING REPA TEDUNG"/* 1B41 */,/*6978*/"BALINESE VOWEL SIGN PEPET"/* 1B42 */, /*6979*/"BALINESE VOWEL SIGN PEPET TEDUNG"/* 1B43 */,/*6980*/"BALINESE ADEG ADEG"/* 1B44 */, /*6981*/"BALINESE LETTER KAF SASAK"/* 1B45 */,/*6982*/"BALINESE LETTER KHOT SASAK"/* 1B46 */, /*6983*/"BALINESE LETTER TZIR SASAK"/* 1B47 */,/*6984*/"BALINESE LETTER EF SASAK"/* 1B48 */, /*6985*/"BALINESE LETTER VE SASAK"/* 1B49 */,/*6986*/"BALINESE LETTER ZAL SASAK"/* 1B4A */, /*6987*/"BALINESE LETTER ASYURA SASAK"/* 1B4B */,NULL,NULL,NULL,NULL,/*6992*/"BALINESE DIGIT ZERO"/* 1B50 */, /*6993*/"BALINESE DIGIT ONE"/* 1B51 */,/*6994*/"BALINESE DIGIT TWO"/* 1B52 */,/*6995*/"BALINESE DIGIT THREE"/* 1B53 */, /*6996*/"BALINESE DIGIT FOUR"/* 1B54 */,/*6997*/"BALINESE DIGIT FIVE"/* 1B55 */,/*6998*/"BALINESE DIGIT SIX"/* 1B56 */, /*6999*/"BALINESE DIGIT SEVEN"/* 1B57 */,/*7000*/"BALINESE DIGIT EIGHT"/* 1B58 */, /*7001*/"BALINESE DIGIT NINE"/* 1B59 */,/*7002*/"BALINESE PANTI"/* 1B5A */,/*7003*/"BALINESE PAMADA"/* 1B5B */, /*7004*/"BALINESE WINDU"/* 1B5C */,/*7005*/"BALINESE CARIK PAMUNGKAH"/* 1B5D */,/*7006*/"BALINESE CARIK SIKI"/* 1B5E */, /*7007*/"BALINESE CARIK PAREREN"/* 1B5F */,/*7008*/"BALINESE PAMENENG"/* 1B60 */, /*7009*/"BALINESE MUSICAL SYMBOL DONG"/* 1B61 */,/*7010*/"BALINESE MUSICAL SYMBOL DENG"/* 1B62 */, /*7011*/"BALINESE MUSICAL SYMBOL DUNG"/* 1B63 */,/*7012*/"BALINESE MUSICAL SYMBOL DANG"/* 1B64 */, /*7013*/"BALINESE MUSICAL SYMBOL DANG SURANG"/* 1B65 */,/*7014*/"BALINESE MUSICAL SYMBOL DING"/* 1B66 */, /*7015*/"BALINESE MUSICAL SYMBOL DAENG"/* 1B67 */,/*7016*/"BALINESE MUSICAL SYMBOL DEUNG"/* 1B68 */, /*7017*/"BALINESE MUSICAL SYMBOL DAING"/* 1B69 */,/*7018*/"BALINESE MUSICAL SYMBOL DANG GEDE"/* 1B6A */, /*7019*/"BALINESE MUSICAL SYMBOL COMBINING TEGEH"/* 1B6B */,/*7020*/"BALINESE MUSICAL SYMBOL COMBINING ENDEP"/* 1B6C */, /*7021*/"BALINESE MUSICAL SYMBOL COMBINING KEMPUL"/* 1B6D */, /*7022*/"BALINESE MUSICAL SYMBOL COMBINING KEMPLI"/* 1B6E */, /*7023*/"BALINESE MUSICAL SYMBOL COMBINING JEGOGAN"/* 1B6F */, /*7024*/"BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN"/* 1B70 */, /*7025*/"BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN"/* 1B71 */, /*7026*/"BALINESE MUSICAL SYMBOL COMBINING BENDE"/* 1B72 */,/*7027*/"BALINESE MUSICAL SYMBOL COMBINING GONG"/* 1B73 */, /*7028*/"BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG"/* 1B74 */, /*7029*/"BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG"/* 1B75 */, /*7030*/"BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK"/* 1B76 */, /*7031*/"BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK"/* 1B77 */, /*7032*/"BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG"/* 1B78 */, /*7033*/"BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG"/* 1B79 */, /*7034*/"BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK"/* 1B7A */, /*7035*/"BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK"/* 1B7B */, /*7036*/"BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING"/* 1B7C */,NULL,NULL,NULL, /*7040*/"SUNDANESE SIGN PANYECEK"/* 1B80 */,/*7041*/"SUNDANESE SIGN PANGLAYAR"/* 1B81 */, /*7042*/"SUNDANESE SIGN PANGWISAD"/* 1B82 */,/*7043*/"SUNDANESE LETTER A"/* 1B83 */, /*7044*/"SUNDANESE LETTER I"/* 1B84 */,/*7045*/"SUNDANESE LETTER U"/* 1B85 */,/*7046*/"SUNDANESE LETTER AE"/* 1B86 */, /*7047*/"SUNDANESE LETTER O"/* 1B87 */,/*7048*/"SUNDANESE LETTER E"/* 1B88 */,/*7049*/"SUNDANESE LETTER EU"/* 1B89 */, /*7050*/"SUNDANESE LETTER KA"/* 1B8A */,/*7051*/"SUNDANESE LETTER QA"/* 1B8B */,/*7052*/"SUNDANESE LETTER GA"/* 1B8C */, /*7053*/"SUNDANESE LETTER NGA"/* 1B8D */,/*7054*/"SUNDANESE LETTER CA"/* 1B8E */,/*7055*/"SUNDANESE LETTER JA"/* 1B8F */, /*7056*/"SUNDANESE LETTER ZA"/* 1B90 */,/*7057*/"SUNDANESE LETTER NYA"/* 1B91 */,/*7058*/"SUNDANESE LETTER TA"/* 1B92 */, /*7059*/"SUNDANESE LETTER DA"/* 1B93 */,/*7060*/"SUNDANESE LETTER NA"/* 1B94 */,/*7061*/"SUNDANESE LETTER PA"/* 1B95 */, /*7062*/"SUNDANESE LETTER FA"/* 1B96 */,/*7063*/"SUNDANESE LETTER VA"/* 1B97 */,/*7064*/"SUNDANESE LETTER BA"/* 1B98 */, /*7065*/"SUNDANESE LETTER MA"/* 1B99 */,/*7066*/"SUNDANESE LETTER YA"/* 1B9A */,/*7067*/"SUNDANESE LETTER RA"/* 1B9B */, /*7068*/"SUNDANESE LETTER LA"/* 1B9C */,/*7069*/"SUNDANESE LETTER WA"/* 1B9D */,/*7070*/"SUNDANESE LETTER SA"/* 1B9E */, /*7071*/"SUNDANESE LETTER XA"/* 1B9F */,/*7072*/"SUNDANESE LETTER HA"/* 1BA0 */, /*7073*/"SUNDANESE CONSONANT SIGN PAMINGKAL"/* 1BA1 */,/*7074*/"SUNDANESE CONSONANT SIGN PANYAKRA"/* 1BA2 */, /*7075*/"SUNDANESE CONSONANT SIGN PANYIKU"/* 1BA3 */,/*7076*/"SUNDANESE VOWEL SIGN PANGHULU"/* 1BA4 */, /*7077*/"SUNDANESE VOWEL SIGN PANYUKU"/* 1BA5 */,/*7078*/"SUNDANESE VOWEL SIGN PANAELAENG"/* 1BA6 */, /*7079*/"SUNDANESE VOWEL SIGN PANOLONG"/* 1BA7 */,/*7080*/"SUNDANESE VOWEL SIGN PAMEPET"/* 1BA8 */, /*7081*/"SUNDANESE VOWEL SIGN PANEULEUNG"/* 1BA9 */,/*7082*/"SUNDANESE SIGN PAMAAEH"/* 1BAA */, /*7083*/"SUNDANESE SIGN VIRAMA"/* 1BAB */,/*7084*/"SUNDANESE CONSONANT SIGN PASANGAN MA"/* 1BAC */, /*7085*/"SUNDANESE CONSONANT SIGN PASANGAN WA"/* 1BAD */,/*7086*/"SUNDANESE LETTER KHA"/* 1BAE */, /*7087*/"SUNDANESE LETTER SYA"/* 1BAF */,/*7088*/"SUNDANESE DIGIT ZERO"/* 1BB0 */, /*7089*/"SUNDANESE DIGIT ONE"/* 1BB1 */,/*7090*/"SUNDANESE DIGIT TWO"/* 1BB2 */, /*7091*/"SUNDANESE DIGIT THREE"/* 1BB3 */,/*7092*/"SUNDANESE DIGIT FOUR"/* 1BB4 */, /*7093*/"SUNDANESE DIGIT FIVE"/* 1BB5 */,/*7094*/"SUNDANESE DIGIT SIX"/* 1BB6 */, /*7095*/"SUNDANESE DIGIT SEVEN"/* 1BB7 */,/*7096*/"SUNDANESE DIGIT EIGHT"/* 1BB8 */, /*7097*/"SUNDANESE DIGIT NINE"/* 1BB9 */,/*7098*/"SUNDANESE AVAGRAHA"/* 1BBA */,/*7099*/"SUNDANESE LETTER REU"/* 1BBB */, /*7100*/"SUNDANESE LETTER LEU"/* 1BBC */,/*7101*/"SUNDANESE LETTER BHA"/* 1BBD */, /*7102*/"SUNDANESE LETTER FINAL K"/* 1BBE */,/*7103*/"SUNDANESE LETTER FINAL M"/* 1BBF */, /*7104*/"BATAK LETTER A"/* 1BC0 */,/*7105*/"BATAK LETTER SIMALUNGUN A"/* 1BC1 */,/*7106*/"BATAK LETTER HA"/* 1BC2 */, /*7107*/"BATAK LETTER SIMALUNGUN HA"/* 1BC3 */,/*7108*/"BATAK LETTER MANDAILING HA"/* 1BC4 */, /*7109*/"BATAK LETTER BA"/* 1BC5 */,/*7110*/"BATAK LETTER KARO BA"/* 1BC6 */,/*7111*/"BATAK LETTER PA"/* 1BC7 */, /*7112*/"BATAK LETTER SIMALUNGUN PA"/* 1BC8 */,/*7113*/"BATAK LETTER NA"/* 1BC9 */, /*7114*/"BATAK LETTER MANDAILING NA"/* 1BCA */,/*7115*/"BATAK LETTER WA"/* 1BCB */, /*7116*/"BATAK LETTER SIMALUNGUN WA"/* 1BCC */,/*7117*/"BATAK LETTER PAKPAK WA"/* 1BCD */, /*7118*/"BATAK LETTER GA"/* 1BCE */,/*7119*/"BATAK LETTER SIMALUNGUN GA"/* 1BCF */,/*7120*/"BATAK LETTER JA"/* 1BD0 */, /*7121*/"BATAK LETTER DA"/* 1BD1 */,/*7122*/"BATAK LETTER RA"/* 1BD2 */,/*7123*/"BATAK LETTER SIMALUNGUN RA"/* 1BD3 */, /*7124*/"BATAK LETTER MA"/* 1BD4 */,/*7125*/"BATAK LETTER SIMALUNGUN MA"/* 1BD5 */, /*7126*/"BATAK LETTER SOUTHERN TA"/* 1BD6 */,/*7127*/"BATAK LETTER NORTHERN TA"/* 1BD7 */, /*7128*/"BATAK LETTER SA"/* 1BD8 */,/*7129*/"BATAK LETTER SIMALUNGUN SA"/* 1BD9 */, /*7130*/"BATAK LETTER MANDAILING SA"/* 1BDA */,/*7131*/"BATAK LETTER YA"/* 1BDB */, /*7132*/"BATAK LETTER SIMALUNGUN YA"/* 1BDC */,/*7133*/"BATAK LETTER NGA"/* 1BDD */,/*7134*/"BATAK LETTER LA"/* 1BDE */, /*7135*/"BATAK LETTER SIMALUNGUN LA"/* 1BDF */,/*7136*/"BATAK LETTER NYA"/* 1BE0 */,/*7137*/"BATAK LETTER CA"/* 1BE1 */, /*7138*/"BATAK LETTER NDA"/* 1BE2 */,/*7139*/"BATAK LETTER MBA"/* 1BE3 */,/*7140*/"BATAK LETTER I"/* 1BE4 */, /*7141*/"BATAK LETTER U"/* 1BE5 */,/*7142*/"BATAK SIGN TOMPI"/* 1BE6 */,/*7143*/"BATAK VOWEL SIGN E"/* 1BE7 */, /*7144*/"BATAK VOWEL SIGN PAKPAK E"/* 1BE8 */,/*7145*/"BATAK VOWEL SIGN EE"/* 1BE9 */, /*7146*/"BATAK VOWEL SIGN I"/* 1BEA */,/*7147*/"BATAK VOWEL SIGN KARO I"/* 1BEB */, /*7148*/"BATAK VOWEL SIGN O"/* 1BEC */,/*7149*/"BATAK VOWEL SIGN KARO O"/* 1BED */, /*7150*/"BATAK VOWEL SIGN U"/* 1BEE */,/*7151*/"BATAK VOWEL SIGN U FOR SIMALUNGUN SA"/* 1BEF */, /*7152*/"BATAK CONSONANT SIGN NG"/* 1BF0 */,/*7153*/"BATAK CONSONANT SIGN H"/* 1BF1 */, /*7154*/"BATAK PANGOLAT"/* 1BF2 */,/*7155*/"BATAK PANONGONAN"/* 1BF3 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*7164*/"BATAK SYMBOL BINDU NA METEK"/* 1BFC */,/*7165*/"BATAK SYMBOL BINDU PINARBORAS"/* 1BFD */, /*7166*/"BATAK SYMBOL BINDU JUDUL"/* 1BFE */,/*7167*/"BATAK SYMBOL BINDU PANGOLAT"/* 1BFF */, /*7168*/"LEPCHA LETTER KA"/* 1C00 */,/*7169*/"LEPCHA LETTER KLA"/* 1C01 */,/*7170*/"LEPCHA LETTER KHA"/* 1C02 */, /*7171*/"LEPCHA LETTER GA"/* 1C03 */,/*7172*/"LEPCHA LETTER GLA"/* 1C04 */,/*7173*/"LEPCHA LETTER NGA"/* 1C05 */, /*7174*/"LEPCHA LETTER CA"/* 1C06 */,/*7175*/"LEPCHA LETTER CHA"/* 1C07 */,/*7176*/"LEPCHA LETTER JA"/* 1C08 */, /*7177*/"LEPCHA LETTER NYA"/* 1C09 */,/*7178*/"LEPCHA LETTER TA"/* 1C0A */,/*7179*/"LEPCHA LETTER THA"/* 1C0B */, /*7180*/"LEPCHA LETTER DA"/* 1C0C */,/*7181*/"LEPCHA LETTER NA"/* 1C0D */,/*7182*/"LEPCHA LETTER PA"/* 1C0E */, /*7183*/"LEPCHA LETTER PLA"/* 1C0F */,/*7184*/"LEPCHA LETTER PHA"/* 1C10 */,/*7185*/"LEPCHA LETTER FA"/* 1C11 */, /*7186*/"LEPCHA LETTER FLA"/* 1C12 */,/*7187*/"LEPCHA LETTER BA"/* 1C13 */,/*7188*/"LEPCHA LETTER BLA"/* 1C14 */, /*7189*/"LEPCHA LETTER MA"/* 1C15 */,/*7190*/"LEPCHA LETTER MLA"/* 1C16 */,/*7191*/"LEPCHA LETTER TSA"/* 1C17 */, /*7192*/"LEPCHA LETTER TSHA"/* 1C18 */,/*7193*/"LEPCHA LETTER DZA"/* 1C19 */,/*7194*/"LEPCHA LETTER YA"/* 1C1A */, /*7195*/"LEPCHA LETTER RA"/* 1C1B */,/*7196*/"LEPCHA LETTER LA"/* 1C1C */,/*7197*/"LEPCHA LETTER HA"/* 1C1D */, /*7198*/"LEPCHA LETTER HLA"/* 1C1E */,/*7199*/"LEPCHA LETTER VA"/* 1C1F */,/*7200*/"LEPCHA LETTER SA"/* 1C20 */, /*7201*/"LEPCHA LETTER SHA"/* 1C21 */,/*7202*/"LEPCHA LETTER WA"/* 1C22 */,/*7203*/"LEPCHA LETTER A"/* 1C23 */, /*7204*/"LEPCHA SUBJOINED LETTER YA"/* 1C24 */,/*7205*/"LEPCHA SUBJOINED LETTER RA"/* 1C25 */, /*7206*/"LEPCHA VOWEL SIGN AA"/* 1C26 */,/*7207*/"LEPCHA VOWEL SIGN I"/* 1C27 */,/*7208*/"LEPCHA VOWEL SIGN O"/* 1C28 */, /*7209*/"LEPCHA VOWEL SIGN OO"/* 1C29 */,/*7210*/"LEPCHA VOWEL SIGN U"/* 1C2A */, /*7211*/"LEPCHA VOWEL SIGN UU"/* 1C2B */,/*7212*/"LEPCHA VOWEL SIGN E"/* 1C2C */, /*7213*/"LEPCHA CONSONANT SIGN K"/* 1C2D */,/*7214*/"LEPCHA CONSONANT SIGN M"/* 1C2E */, /*7215*/"LEPCHA CONSONANT SIGN L"/* 1C2F */,/*7216*/"LEPCHA CONSONANT SIGN N"/* 1C30 */, /*7217*/"LEPCHA CONSONANT SIGN P"/* 1C31 */,/*7218*/"LEPCHA CONSONANT SIGN R"/* 1C32 */, /*7219*/"LEPCHA CONSONANT SIGN T"/* 1C33 */,/*7220*/"LEPCHA CONSONANT SIGN NYIN-DO"/* 1C34 */, /*7221*/"LEPCHA CONSONANT SIGN KANG"/* 1C35 */,/*7222*/"LEPCHA SIGN RAN"/* 1C36 */,/*7223*/"LEPCHA SIGN NUKTA"/* 1C37 */, NULL,NULL,NULL,/*7227*/"LEPCHA PUNCTUATION TA-ROL"/* 1C3B */,/*7228*/"LEPCHA PUNCTUATION NYET THYOOM TA-ROL"/* 1C3C */, /*7229*/"LEPCHA PUNCTUATION CER-WA"/* 1C3D */,/*7230*/"LEPCHA PUNCTUATION TSHOOK CER-WA"/* 1C3E */, /*7231*/"LEPCHA PUNCTUATION TSHOOK"/* 1C3F */,/*7232*/"LEPCHA DIGIT ZERO"/* 1C40 */,/*7233*/"LEPCHA DIGIT ONE"/* 1C41 */, /*7234*/"LEPCHA DIGIT TWO"/* 1C42 */,/*7235*/"LEPCHA DIGIT THREE"/* 1C43 */,/*7236*/"LEPCHA DIGIT FOUR"/* 1C44 */, /*7237*/"LEPCHA DIGIT FIVE"/* 1C45 */,/*7238*/"LEPCHA DIGIT SIX"/* 1C46 */,/*7239*/"LEPCHA DIGIT SEVEN"/* 1C47 */, /*7240*/"LEPCHA DIGIT EIGHT"/* 1C48 */,/*7241*/"LEPCHA DIGIT NINE"/* 1C49 */,NULL,NULL,NULL, /*7245*/"LEPCHA LETTER TTA"/* 1C4D */,/*7246*/"LEPCHA LETTER TTHA"/* 1C4E */,/*7247*/"LEPCHA LETTER DDA"/* 1C4F */, /*7248*/"OL CHIKI DIGIT ZERO"/* 1C50 */,/*7249*/"OL CHIKI DIGIT ONE"/* 1C51 */,/*7250*/"OL CHIKI DIGIT TWO"/* 1C52 */, /*7251*/"OL CHIKI DIGIT THREE"/* 1C53 */,/*7252*/"OL CHIKI DIGIT FOUR"/* 1C54 */,/*7253*/"OL CHIKI DIGIT FIVE"/* 1C55 */, /*7254*/"OL CHIKI DIGIT SIX"/* 1C56 */,/*7255*/"OL CHIKI DIGIT SEVEN"/* 1C57 */,/*7256*/"OL CHIKI DIGIT EIGHT"/* 1C58 */, /*7257*/"OL CHIKI DIGIT NINE"/* 1C59 */,/*7258*/"OL CHIKI LETTER LA"/* 1C5A */,/*7259*/"OL CHIKI LETTER AT"/* 1C5B */, /*7260*/"OL CHIKI LETTER AG"/* 1C5C */,/*7261*/"OL CHIKI LETTER ANG"/* 1C5D */,/*7262*/"OL CHIKI LETTER AL"/* 1C5E */, /*7263*/"OL CHIKI LETTER LAA"/* 1C5F */,/*7264*/"OL CHIKI LETTER AAK"/* 1C60 */,/*7265*/"OL CHIKI LETTER AAJ"/* 1C61 */, /*7266*/"OL CHIKI LETTER AAM"/* 1C62 */,/*7267*/"OL CHIKI LETTER AAW"/* 1C63 */,/*7268*/"OL CHIKI LETTER LI"/* 1C64 */, /*7269*/"OL CHIKI LETTER IS"/* 1C65 */,/*7270*/"OL CHIKI LETTER IH"/* 1C66 */,/*7271*/"OL CHIKI LETTER INY"/* 1C67 */, /*7272*/"OL CHIKI LETTER IR"/* 1C68 */,/*7273*/"OL CHIKI LETTER LU"/* 1C69 */,/*7274*/"OL CHIKI LETTER UC"/* 1C6A */, /*7275*/"OL CHIKI LETTER UD"/* 1C6B */,/*7276*/"OL CHIKI LETTER UNN"/* 1C6C */,/*7277*/"OL CHIKI LETTER UY"/* 1C6D */, /*7278*/"OL CHIKI LETTER LE"/* 1C6E */,/*7279*/"OL CHIKI LETTER EP"/* 1C6F */,/*7280*/"OL CHIKI LETTER EDD"/* 1C70 */, /*7281*/"OL CHIKI LETTER EN"/* 1C71 */,/*7282*/"OL CHIKI LETTER ERR"/* 1C72 */,/*7283*/"OL CHIKI LETTER LO"/* 1C73 */, /*7284*/"OL CHIKI LETTER OTT"/* 1C74 */,/*7285*/"OL CHIKI LETTER OB"/* 1C75 */,/*7286*/"OL CHIKI LETTER OV"/* 1C76 */, /*7287*/"OL CHIKI LETTER OH"/* 1C77 */,/*7288*/"OL CHIKI MU TTUDDAG"/* 1C78 */, /*7289*/"OL CHIKI GAAHLAA TTUDDAAG"/* 1C79 */,/*7290*/"OL CHIKI MU-GAAHLAA TTUDDAAG"/* 1C7A */, /*7291*/"OL CHIKI RELAA"/* 1C7B */,/*7292*/"OL CHIKI PHAARKAA"/* 1C7C */,/*7293*/"OL CHIKI AHAD"/* 1C7D */, /*7294*/"OL CHIKI PUNCTUATION MUCAAD"/* 1C7E */,/*7295*/"OL CHIKI PUNCTUATION DOUBLE MUCAAD"/* 1C7F */, /*7296*/"CYRILLIC SMALL LETTER ROUNDED VE"/* 1C80 */,/*7297*/"CYRILLIC SMALL LETTER LONG-LEGGED DE"/* 1C81 */, /*7298*/"CYRILLIC SMALL LETTER NARROW O"/* 1C82 */,/*7299*/"CYRILLIC SMALL LETTER WIDE ES"/* 1C83 */, /*7300*/"CYRILLIC SMALL LETTER TALL TE"/* 1C84 */,/*7301*/"CYRILLIC SMALL LETTER THREE-LEGGED TE"/* 1C85 */, /*7302*/"CYRILLIC SMALL LETTER TALL HARD SIGN"/* 1C86 */,/*7303*/"CYRILLIC SMALL LETTER TALL YAT"/* 1C87 */, /*7304*/"CYRILLIC SMALL LETTER UNBLENDED UK"/* 1C88 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*7360*/"SUNDANESE PUNCTUATION BINDU SURYA"/* 1CC0 */,/*7361*/"SUNDANESE PUNCTUATION BINDU PANGLONG"/* 1CC1 */, /*7362*/"SUNDANESE PUNCTUATION BINDU PURNAMA"/* 1CC2 */,/*7363*/"SUNDANESE PUNCTUATION BINDU CAKRA"/* 1CC3 */, /*7364*/"SUNDANESE PUNCTUATION BINDU LEU SATANGA"/* 1CC4 */,/*7365*/"SUNDANESE PUNCTUATION BINDU KA SATANGA"/* 1CC5 */, /*7366*/"SUNDANESE PUNCTUATION BINDU DA SATANGA"/* 1CC6 */,/*7367*/"SUNDANESE PUNCTUATION BINDU BA SATANGA"/* 1CC7 */, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*7376*/"VEDIC TONE KARSHANA"/* 1CD0 */,/*7377*/"VEDIC TONE SHARA"/* 1CD1 */, /*7378*/"VEDIC TONE PRENKHA"/* 1CD2 */,/*7379*/"VEDIC SIGN NIHSHVASA"/* 1CD3 */, /*7380*/"VEDIC SIGN YAJURVEDIC MIDLINE SVARITA"/* 1CD4 */, /*7381*/"VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA"/* 1CD5 */, /*7382*/"VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA"/* 1CD6 */, /*7383*/"VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA"/* 1CD7 */,/*7384*/"VEDIC TONE CANDRA BELOW"/* 1CD8 */, /*7385*/"VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER"/* 1CD9 */, /*7386*/"VEDIC TONE DOUBLE SVARITA"/* 1CDA */,/*7387*/"VEDIC TONE TRIPLE SVARITA"/* 1CDB */, /*7388*/"VEDIC TONE KATHAKA ANUDATTA"/* 1CDC */,/*7389*/"VEDIC TONE DOT BELOW"/* 1CDD */, /*7390*/"VEDIC TONE TWO DOTS BELOW"/* 1CDE */,/*7391*/"VEDIC TONE THREE DOTS BELOW"/* 1CDF */, /*7392*/"VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA"/* 1CE0 */, /*7393*/"VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA"/* 1CE1 */,/*7394*/"VEDIC SIGN VISARGA SVARITA"/* 1CE2 */, /*7395*/"VEDIC SIGN VISARGA UDATTA"/* 1CE3 */,/*7396*/"VEDIC SIGN REVERSED VISARGA UDATTA"/* 1CE4 */, /*7397*/"VEDIC SIGN VISARGA ANUDATTA"/* 1CE5 */,/*7398*/"VEDIC SIGN REVERSED VISARGA ANUDATTA"/* 1CE6 */, /*7399*/"VEDIC SIGN VISARGA UDATTA WITH TAIL"/* 1CE7 */,/*7400*/"VEDIC SIGN VISARGA ANUDATTA WITH TAIL"/* 1CE8 */, /*7401*/"VEDIC SIGN ANUSVARA ANTARGOMUKHA"/* 1CE9 */,/*7402*/"VEDIC SIGN ANUSVARA BAHIRGOMUKHA"/* 1CEA */, /*7403*/"VEDIC SIGN ANUSVARA VAMAGOMUKHA"/* 1CEB */,/*7404*/"VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL"/* 1CEC */, /*7405*/"VEDIC SIGN TIRYAK"/* 1CED */,/*7406*/"VEDIC SIGN HEXIFORM LONG ANUSVARA"/* 1CEE */, /*7407*/"VEDIC SIGN LONG ANUSVARA"/* 1CEF */,/*7408*/"VEDIC SIGN RTHANG LONG ANUSVARA"/* 1CF0 */, /*7409*/"VEDIC SIGN ANUSVARA UBHAYATO MUKHA"/* 1CF1 */,/*7410*/"VEDIC SIGN ARDHAVISARGA"/* 1CF2 */, /*7411*/"VEDIC SIGN ROTATED ARDHAVISARGA"/* 1CF3 */,/*7412*/"VEDIC TONE CANDRA ABOVE"/* 1CF4 */, /*7413*/"VEDIC SIGN JIHVAMULIYA"/* 1CF5 */,/*7414*/"VEDIC SIGN UPADHMANIYA"/* 1CF6 */, /*7415*/"VEDIC SIGN ATIKRAMA"/* 1CF7 */,/*7416*/"VEDIC TONE RING ABOVE"/* 1CF8 */, /*7417*/"VEDIC TONE DOUBLE RING ABOVE"/* 1CF9 */,NULL,NULL,NULL,NULL,NULL,NULL, /*7424*/"LATIN LETTER SMALL CAPITAL A"/* 1D00 */,/*7425*/"LATIN LETTER SMALL CAPITAL AE"/* 1D01 */, /*7426*/"LATIN SMALL LETTER TURNED AE"/* 1D02 */,/*7427*/"LATIN LETTER SMALL CAPITAL BARRED B"/* 1D03 */, /*7428*/"LATIN LETTER SMALL CAPITAL C"/* 1D04 */,/*7429*/"LATIN LETTER SMALL CAPITAL D"/* 1D05 */, /*7430*/"LATIN LETTER SMALL CAPITAL ETH"/* 1D06 */,/*7431*/"LATIN LETTER SMALL CAPITAL E"/* 1D07 */, /*7432*/"LATIN SMALL LETTER TURNED OPEN E"/* 1D08 */,/*7433*/"LATIN SMALL LETTER TURNED I"/* 1D09 */, /*7434*/"LATIN LETTER SMALL CAPITAL J"/* 1D0A */,/*7435*/"LATIN LETTER SMALL CAPITAL K"/* 1D0B */, /*7436*/"LATIN LETTER SMALL CAPITAL L WITH STROKE"/* 1D0C */,/*7437*/"LATIN LETTER SMALL CAPITAL M"/* 1D0D */, /*7438*/"LATIN LETTER SMALL CAPITAL REVERSED N"/* 1D0E */,/*7439*/"LATIN LETTER SMALL CAPITAL O"/* 1D0F */, /*7440*/"LATIN LETTER SMALL CAPITAL OPEN O"/* 1D10 */,/*7441*/"LATIN SMALL LETTER SIDEWAYS O"/* 1D11 */, /*7442*/"LATIN SMALL LETTER SIDEWAYS OPEN O"/* 1D12 */,/*7443*/"LATIN SMALL LETTER SIDEWAYS O WITH STROKE"/* 1D13 */, /*7444*/"LATIN SMALL LETTER TURNED OE"/* 1D14 */,/*7445*/"LATIN LETTER SMALL CAPITAL OU"/* 1D15 */, /*7446*/"LATIN SMALL LETTER TOP HALF O"/* 1D16 */,/*7447*/"LATIN SMALL LETTER BOTTOM HALF O"/* 1D17 */, /*7448*/"LATIN LETTER SMALL CAPITAL P"/* 1D18 */,/*7449*/"LATIN LETTER SMALL CAPITAL REVERSED R"/* 1D19 */, /*7450*/"LATIN LETTER SMALL CAPITAL TURNED R"/* 1D1A */,/*7451*/"LATIN LETTER SMALL CAPITAL T"/* 1D1B */, /*7452*/"LATIN LETTER SMALL CAPITAL U"/* 1D1C */,/*7453*/"LATIN SMALL LETTER SIDEWAYS U"/* 1D1D */, /*7454*/"LATIN SMALL LETTER SIDEWAYS DIAERESIZED U"/* 1D1E */,/*7455*/"LATIN SMALL LETTER SIDEWAYS TURNED M"/* 1D1F */, /*7456*/"LATIN LETTER SMALL CAPITAL V"/* 1D20 */,/*7457*/"LATIN LETTER SMALL CAPITAL W"/* 1D21 */, /*7458*/"LATIN LETTER SMALL CAPITAL Z"/* 1D22 */,/*7459*/"LATIN LETTER SMALL CAPITAL EZH"/* 1D23 */, /*7460*/"LATIN LETTER VOICED LARYNGEAL SPIRANT"/* 1D24 */,/*7461*/"LATIN LETTER AIN"/* 1D25 */, /*7462*/"GREEK LETTER SMALL CAPITAL GAMMA"/* 1D26 */,/*7463*/"GREEK LETTER SMALL CAPITAL LAMDA"/* 1D27 */, /*7464*/"GREEK LETTER SMALL CAPITAL PI"/* 1D28 */,/*7465*/"GREEK LETTER SMALL CAPITAL RHO"/* 1D29 */, /*7466*/"GREEK LETTER SMALL CAPITAL PSI"/* 1D2A */,/*7467*/"CYRILLIC LETTER SMALL CAPITAL EL"/* 1D2B */, /*7468*/"MODIFIER LETTER CAPITAL A"/* 1D2C */,/*7469*/"MODIFIER LETTER CAPITAL AE"/* 1D2D */, /*7470*/"MODIFIER LETTER CAPITAL B"/* 1D2E */,/*7471*/"MODIFIER LETTER CAPITAL BARRED B"/* 1D2F */, /*7472*/"MODIFIER LETTER CAPITAL D"/* 1D30 */,/*7473*/"MODIFIER LETTER CAPITAL E"/* 1D31 */, /*7474*/"MODIFIER LETTER CAPITAL REVERSED E"/* 1D32 */,/*7475*/"MODIFIER LETTER CAPITAL G"/* 1D33 */, /*7476*/"MODIFIER LETTER CAPITAL H"/* 1D34 */,/*7477*/"MODIFIER LETTER CAPITAL I"/* 1D35 */, /*7478*/"MODIFIER LETTER CAPITAL J"/* 1D36 */,/*7479*/"MODIFIER LETTER CAPITAL K"/* 1D37 */, /*7480*/"MODIFIER LETTER CAPITAL L"/* 1D38 */,/*7481*/"MODIFIER LETTER CAPITAL M"/* 1D39 */, /*7482*/"MODIFIER LETTER CAPITAL N"/* 1D3A */,/*7483*/"MODIFIER LETTER CAPITAL REVERSED N"/* 1D3B */, /*7484*/"MODIFIER LETTER CAPITAL O"/* 1D3C */,/*7485*/"MODIFIER LETTER CAPITAL OU"/* 1D3D */, /*7486*/"MODIFIER LETTER CAPITAL P"/* 1D3E */,/*7487*/"MODIFIER LETTER CAPITAL R"/* 1D3F */, /*7488*/"MODIFIER LETTER CAPITAL T"/* 1D40 */,/*7489*/"MODIFIER LETTER CAPITAL U"/* 1D41 */, /*7490*/"MODIFIER LETTER CAPITAL W"/* 1D42 */,/*7491*/"MODIFIER LETTER SMALL A"/* 1D43 */, /*7492*/"MODIFIER LETTER SMALL TURNED A"/* 1D44 */,/*7493*/"MODIFIER LETTER SMALL ALPHA"/* 1D45 */, /*7494*/"MODIFIER LETTER SMALL TURNED AE"/* 1D46 */,/*7495*/"MODIFIER LETTER SMALL B"/* 1D47 */, /*7496*/"MODIFIER LETTER SMALL D"/* 1D48 */,/*7497*/"MODIFIER LETTER SMALL E"/* 1D49 */, /*7498*/"MODIFIER LETTER SMALL SCHWA"/* 1D4A */,/*7499*/"MODIFIER LETTER SMALL OPEN E"/* 1D4B */, /*7500*/"MODIFIER LETTER SMALL TURNED OPEN E"/* 1D4C */,/*7501*/"MODIFIER LETTER SMALL G"/* 1D4D */, /*7502*/"MODIFIER LETTER SMALL TURNED I"/* 1D4E */,/*7503*/"MODIFIER LETTER SMALL K"/* 1D4F */, /*7504*/"MODIFIER LETTER SMALL M"/* 1D50 */,/*7505*/"MODIFIER LETTER SMALL ENG"/* 1D51 */, /*7506*/"MODIFIER LETTER SMALL O"/* 1D52 */,/*7507*/"MODIFIER LETTER SMALL OPEN O"/* 1D53 */, /*7508*/"MODIFIER LETTER SMALL TOP HALF O"/* 1D54 */,/*7509*/"MODIFIER LETTER SMALL BOTTOM HALF O"/* 1D55 */, /*7510*/"MODIFIER LETTER SMALL P"/* 1D56 */,/*7511*/"MODIFIER LETTER SMALL T"/* 1D57 */, /*7512*/"MODIFIER LETTER SMALL U"/* 1D58 */,/*7513*/"MODIFIER LETTER SMALL SIDEWAYS U"/* 1D59 */, /*7514*/"MODIFIER LETTER SMALL TURNED M"/* 1D5A */,/*7515*/"MODIFIER LETTER SMALL V"/* 1D5B */, /*7516*/"MODIFIER LETTER SMALL AIN"/* 1D5C */,/*7517*/"MODIFIER LETTER SMALL BETA"/* 1D5D */, /*7518*/"MODIFIER LETTER SMALL GREEK GAMMA"/* 1D5E */,/*7519*/"MODIFIER LETTER SMALL DELTA"/* 1D5F */, /*7520*/"MODIFIER LETTER SMALL GREEK PHI"/* 1D60 */,/*7521*/"MODIFIER LETTER SMALL CHI"/* 1D61 */, /*7522*/"LATIN SUBSCRIPT SMALL LETTER I"/* 1D62 */,/*7523*/"LATIN SUBSCRIPT SMALL LETTER R"/* 1D63 */, /*7524*/"LATIN SUBSCRIPT SMALL LETTER U"/* 1D64 */,/*7525*/"LATIN SUBSCRIPT SMALL LETTER V"/* 1D65 */, /*7526*/"GREEK SUBSCRIPT SMALL LETTER BETA"/* 1D66 */,/*7527*/"GREEK SUBSCRIPT SMALL LETTER GAMMA"/* 1D67 */, /*7528*/"GREEK SUBSCRIPT SMALL LETTER RHO"/* 1D68 */,/*7529*/"GREEK SUBSCRIPT SMALL LETTER PHI"/* 1D69 */, /*7530*/"GREEK SUBSCRIPT SMALL LETTER CHI"/* 1D6A */,/*7531*/"LATIN SMALL LETTER UE"/* 1D6B */, /*7532*/"LATIN SMALL LETTER B WITH MIDDLE TILDE"/* 1D6C */,/*7533*/"LATIN SMALL LETTER D WITH MIDDLE TILDE"/* 1D6D */, /*7534*/"LATIN SMALL LETTER F WITH MIDDLE TILDE"/* 1D6E */,/*7535*/"LATIN SMALL LETTER M WITH MIDDLE TILDE"/* 1D6F */, /*7536*/"LATIN SMALL LETTER N WITH MIDDLE TILDE"/* 1D70 */,/*7537*/"LATIN SMALL LETTER P WITH MIDDLE TILDE"/* 1D71 */, /*7538*/"LATIN SMALL LETTER R WITH MIDDLE TILDE"/* 1D72 */, /*7539*/"LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE"/* 1D73 */, /*7540*/"LATIN SMALL LETTER S WITH MIDDLE TILDE"/* 1D74 */,/*7541*/"LATIN SMALL LETTER T WITH MIDDLE TILDE"/* 1D75 */, /*7542*/"LATIN SMALL LETTER Z WITH MIDDLE TILDE"/* 1D76 */,/*7543*/"LATIN SMALL LETTER TURNED G"/* 1D77 */, /*7544*/"MODIFIER LETTER CYRILLIC EN"/* 1D78 */,/*7545*/"LATIN SMALL LETTER INSULAR G"/* 1D79 */, /*7546*/"LATIN SMALL LETTER TH WITH STRIKETHROUGH"/* 1D7A */, /*7547*/"LATIN SMALL CAPITAL LETTER I WITH STROKE"/* 1D7B */,/*7548*/"LATIN SMALL LETTER IOTA WITH STROKE"/* 1D7C */, /*7549*/"LATIN SMALL LETTER P WITH STROKE"/* 1D7D */,/*7550*/"LATIN SMALL CAPITAL LETTER U WITH STROKE"/* 1D7E */, /*7551*/"LATIN SMALL LETTER UPSILON WITH STROKE"/* 1D7F */,/*7552*/"LATIN SMALL LETTER B WITH PALATAL HOOK"/* 1D80 */, /*7553*/"LATIN SMALL LETTER D WITH PALATAL HOOK"/* 1D81 */,/*7554*/"LATIN SMALL LETTER F WITH PALATAL HOOK"/* 1D82 */, /*7555*/"LATIN SMALL LETTER G WITH PALATAL HOOK"/* 1D83 */,/*7556*/"LATIN SMALL LETTER K WITH PALATAL HOOK"/* 1D84 */, /*7557*/"LATIN SMALL LETTER L WITH PALATAL HOOK"/* 1D85 */,/*7558*/"LATIN SMALL LETTER M WITH PALATAL HOOK"/* 1D86 */, /*7559*/"LATIN SMALL LETTER N WITH PALATAL HOOK"/* 1D87 */,/*7560*/"LATIN SMALL LETTER P WITH PALATAL HOOK"/* 1D88 */, /*7561*/"LATIN SMALL LETTER R WITH PALATAL HOOK"/* 1D89 */,/*7562*/"LATIN SMALL LETTER S WITH PALATAL HOOK"/* 1D8A */, /*7563*/"LATIN SMALL LETTER ESH WITH PALATAL HOOK"/* 1D8B */,/*7564*/"LATIN SMALL LETTER V WITH PALATAL HOOK"/* 1D8C */, /*7565*/"LATIN SMALL LETTER X WITH PALATAL HOOK"/* 1D8D */,/*7566*/"LATIN SMALL LETTER Z WITH PALATAL HOOK"/* 1D8E */, /*7567*/"LATIN SMALL LETTER A WITH RETROFLEX HOOK"/* 1D8F */, /*7568*/"LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK"/* 1D90 */, /*7569*/"LATIN SMALL LETTER D WITH HOOK AND TAIL"/* 1D91 */,/*7570*/"LATIN SMALL LETTER E WITH RETROFLEX HOOK"/* 1D92 */, /*7571*/"LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK"/* 1D93 */, /*7572*/"LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK"/* 1D94 */, /*7573*/"LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK"/* 1D95 */, /*7574*/"LATIN SMALL LETTER I WITH RETROFLEX HOOK"/* 1D96 */, /*7575*/"LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK"/* 1D97 */, /*7576*/"LATIN SMALL LETTER ESH WITH RETROFLEX HOOK"/* 1D98 */, /*7577*/"LATIN SMALL LETTER U WITH RETROFLEX HOOK"/* 1D99 */, /*7578*/"LATIN SMALL LETTER EZH WITH RETROFLEX HOOK"/* 1D9A */,/*7579*/"MODIFIER LETTER SMALL TURNED ALPHA"/* 1D9B */, /*7580*/"MODIFIER LETTER SMALL C"/* 1D9C */,/*7581*/"MODIFIER LETTER SMALL C WITH CURL"/* 1D9D */, /*7582*/"MODIFIER LETTER SMALL ETH"/* 1D9E */,/*7583*/"MODIFIER LETTER SMALL REVERSED OPEN E"/* 1D9F */, /*7584*/"MODIFIER LETTER SMALL F"/* 1DA0 */,/*7585*/"MODIFIER LETTER SMALL DOTLESS J WITH STROKE"/* 1DA1 */, /*7586*/"MODIFIER LETTER SMALL SCRIPT G"/* 1DA2 */,/*7587*/"MODIFIER LETTER SMALL TURNED H"/* 1DA3 */, /*7588*/"MODIFIER LETTER SMALL I WITH STROKE"/* 1DA4 */,/*7589*/"MODIFIER LETTER SMALL IOTA"/* 1DA5 */, /*7590*/"MODIFIER LETTER SMALL CAPITAL I"/* 1DA6 */,/*7591*/"MODIFIER LETTER SMALL CAPITAL I WITH STROKE"/* 1DA7 */, /*7592*/"MODIFIER LETTER SMALL J WITH CROSSED-TAIL"/* 1DA8 */, /*7593*/"MODIFIER LETTER SMALL L WITH RETROFLEX HOOK"/* 1DA9 */, /*7594*/"MODIFIER LETTER SMALL L WITH PALATAL HOOK"/* 1DAA */,/*7595*/"MODIFIER LETTER SMALL CAPITAL L"/* 1DAB */, /*7596*/"MODIFIER LETTER SMALL M WITH HOOK"/* 1DAC */,/*7597*/"MODIFIER LETTER SMALL TURNED M WITH LONG LEG"/* 1DAD */, /*7598*/"MODIFIER LETTER SMALL N WITH LEFT HOOK"/* 1DAE */, /*7599*/"MODIFIER LETTER SMALL N WITH RETROFLEX HOOK"/* 1DAF */,/*7600*/"MODIFIER LETTER SMALL CAPITAL N"/* 1DB0 */, /*7601*/"MODIFIER LETTER SMALL BARRED O"/* 1DB1 */,/*7602*/"MODIFIER LETTER SMALL PHI"/* 1DB2 */, /*7603*/"MODIFIER LETTER SMALL S WITH HOOK"/* 1DB3 */,/*7604*/"MODIFIER LETTER SMALL ESH"/* 1DB4 */, /*7605*/"MODIFIER LETTER SMALL T WITH PALATAL HOOK"/* 1DB5 */,/*7606*/"MODIFIER LETTER SMALL U BAR"/* 1DB6 */, /*7607*/"MODIFIER LETTER SMALL UPSILON"/* 1DB7 */,/*7608*/"MODIFIER LETTER SMALL CAPITAL U"/* 1DB8 */, /*7609*/"MODIFIER LETTER SMALL V WITH HOOK"/* 1DB9 */,/*7610*/"MODIFIER LETTER SMALL TURNED V"/* 1DBA */, /*7611*/"MODIFIER LETTER SMALL Z"/* 1DBB */,/*7612*/"MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK"/* 1DBC */, /*7613*/"MODIFIER LETTER SMALL Z WITH CURL"/* 1DBD */,/*7614*/"MODIFIER LETTER SMALL EZH"/* 1DBE */, /*7615*/"MODIFIER LETTER SMALL THETA"/* 1DBF */,/*7616*/"COMBINING DOTTED GRAVE ACCENT"/* 1DC0 */, /*7617*/"COMBINING DOTTED ACUTE ACCENT"/* 1DC1 */,/*7618*/"COMBINING SNAKE BELOW"/* 1DC2 */, /*7619*/"COMBINING SUSPENSION MARK"/* 1DC3 */,/*7620*/"COMBINING MACRON-ACUTE"/* 1DC4 */, /*7621*/"COMBINING GRAVE-MACRON"/* 1DC5 */,/*7622*/"COMBINING MACRON-GRAVE"/* 1DC6 */, /*7623*/"COMBINING ACUTE-MACRON"/* 1DC7 */,/*7624*/"COMBINING GRAVE-ACUTE-GRAVE"/* 1DC8 */, /*7625*/"COMBINING ACUTE-GRAVE-ACUTE"/* 1DC9 */,/*7626*/"COMBINING LATIN SMALL LETTER R BELOW"/* 1DCA */, /*7627*/"COMBINING BREVE-MACRON"/* 1DCB */,/*7628*/"COMBINING MACRON-BREVE"/* 1DCC */, /*7629*/"COMBINING DOUBLE CIRCUMFLEX ABOVE"/* 1DCD */,/*7630*/"COMBINING OGONEK ABOVE"/* 1DCE */, /*7631*/"COMBINING ZIGZAG BELOW"/* 1DCF */,/*7632*/"COMBINING IS BELOW"/* 1DD0 */,/*7633*/"COMBINING UR ABOVE"/* 1DD1 */, /*7634*/"COMBINING US ABOVE"/* 1DD2 */,/*7635*/"COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE"/* 1DD3 */, /*7636*/"COMBINING LATIN SMALL LETTER AE"/* 1DD4 */,/*7637*/"COMBINING LATIN SMALL LETTER AO"/* 1DD5 */, /*7638*/"COMBINING LATIN SMALL LETTER AV"/* 1DD6 */,/*7639*/"COMBINING LATIN SMALL LETTER C CEDILLA"/* 1DD7 */, /*7640*/"COMBINING LATIN SMALL LETTER INSULAR D"/* 1DD8 */,/*7641*/"COMBINING LATIN SMALL LETTER ETH"/* 1DD9 */, /*7642*/"COMBINING LATIN SMALL LETTER G"/* 1DDA */,/*7643*/"COMBINING LATIN LETTER SMALL CAPITAL G"/* 1DDB */, /*7644*/"COMBINING LATIN SMALL LETTER K"/* 1DDC */,/*7645*/"COMBINING LATIN SMALL LETTER L"/* 1DDD */, /*7646*/"COMBINING LATIN LETTER SMALL CAPITAL L"/* 1DDE */,/*7647*/"COMBINING LATIN LETTER SMALL CAPITAL M"/* 1DDF */, /*7648*/"COMBINING LATIN SMALL LETTER N"/* 1DE0 */,/*7649*/"COMBINING LATIN LETTER SMALL CAPITAL N"/* 1DE1 */, /*7650*/"COMBINING LATIN LETTER SMALL CAPITAL R"/* 1DE2 */,/*7651*/"COMBINING LATIN SMALL LETTER R ROTUNDA"/* 1DE3 */, /*7652*/"COMBINING LATIN SMALL LETTER S"/* 1DE4 */,/*7653*/"COMBINING LATIN SMALL LETTER LONG S"/* 1DE5 */, /*7654*/"COMBINING LATIN SMALL LETTER Z"/* 1DE6 */,/*7655*/"COMBINING LATIN SMALL LETTER ALPHA"/* 1DE7 */, /*7656*/"COMBINING LATIN SMALL LETTER B"/* 1DE8 */,/*7657*/"COMBINING LATIN SMALL LETTER BETA"/* 1DE9 */, /*7658*/"COMBINING LATIN SMALL LETTER SCHWA"/* 1DEA */,/*7659*/"COMBINING LATIN SMALL LETTER F"/* 1DEB */, /*7660*/"COMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE"/* 1DEC */, /*7661*/"COMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKE"/* 1DED */, /*7662*/"COMBINING LATIN SMALL LETTER P"/* 1DEE */,/*7663*/"COMBINING LATIN SMALL LETTER ESH"/* 1DEF */, /*7664*/"COMBINING LATIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKE"/* 1DF0 */, /*7665*/"COMBINING LATIN SMALL LETTER W"/* 1DF1 */,/*7666*/"COMBINING LATIN SMALL LETTER A WITH DIAERESIS"/* 1DF2 */, /*7667*/"COMBINING LATIN SMALL LETTER O WITH DIAERESIS"/* 1DF3 */, /*7668*/"COMBINING LATIN SMALL LETTER U WITH DIAERESIS"/* 1DF4 */,/*7669*/"COMBINING UP TACK ABOVE"/* 1DF5 */, /*7670*/"COMBINING KAVYKA ABOVE RIGHT"/* 1DF6 */,/*7671*/"COMBINING KAVYKA ABOVE LEFT"/* 1DF7 */, /*7672*/"COMBINING DOT ABOVE LEFT"/* 1DF8 */,/*7673*/"COMBINING WIDE INVERTED BRIDGE BELOW"/* 1DF9 */,NULL, /*7675*/"COMBINING DELETION MARK"/* 1DFB */,/*7676*/"COMBINING DOUBLE INVERTED BREVE BELOW"/* 1DFC */, /*7677*/"COMBINING ALMOST EQUAL TO BELOW"/* 1DFD */,/*7678*/"COMBINING LEFT ARROWHEAD ABOVE"/* 1DFE */, /*7679*/"COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW"/* 1DFF */, /*7680*/"LATIN CAPITAL LETTER A WITH RING BELOW"/* 1E00 */,/*7681*/"LATIN SMALL LETTER A WITH RING BELOW"/* 1E01 */, /*7682*/"LATIN CAPITAL LETTER B WITH DOT ABOVE"/* 1E02 */,/*7683*/"LATIN SMALL LETTER B WITH DOT ABOVE"/* 1E03 */, /*7684*/"LATIN CAPITAL LETTER B WITH DOT BELOW"/* 1E04 */,/*7685*/"LATIN SMALL LETTER B WITH DOT BELOW"/* 1E05 */, /*7686*/"LATIN CAPITAL LETTER B WITH LINE BELOW"/* 1E06 */,/*7687*/"LATIN SMALL LETTER B WITH LINE BELOW"/* 1E07 */, /*7688*/"LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE"/* 1E08 */, /*7689*/"LATIN SMALL LETTER C WITH CEDILLA AND ACUTE"/* 1E09 */, /*7690*/"LATIN CAPITAL LETTER D WITH DOT ABOVE"/* 1E0A */,/*7691*/"LATIN SMALL LETTER D WITH DOT ABOVE"/* 1E0B */, /*7692*/"LATIN CAPITAL LETTER D WITH DOT BELOW"/* 1E0C */,/*7693*/"LATIN SMALL LETTER D WITH DOT BELOW"/* 1E0D */, /*7694*/"LATIN CAPITAL LETTER D WITH LINE BELOW"/* 1E0E */,/*7695*/"LATIN SMALL LETTER D WITH LINE BELOW"/* 1E0F */, /*7696*/"LATIN CAPITAL LETTER D WITH CEDILLA"/* 1E10 */,/*7697*/"LATIN SMALL LETTER D WITH CEDILLA"/* 1E11 */, /*7698*/"LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW"/* 1E12 */, /*7699*/"LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW"/* 1E13 */, /*7700*/"LATIN CAPITAL LETTER E WITH MACRON AND GRAVE"/* 1E14 */, /*7701*/"LATIN SMALL LETTER E WITH MACRON AND GRAVE"/* 1E15 */, /*7702*/"LATIN CAPITAL LETTER E WITH MACRON AND ACUTE"/* 1E16 */, /*7703*/"LATIN SMALL LETTER E WITH MACRON AND ACUTE"/* 1E17 */, /*7704*/"LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW"/* 1E18 */, /*7705*/"LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW"/* 1E19 */, /*7706*/"LATIN CAPITAL LETTER E WITH TILDE BELOW"/* 1E1A */,/*7707*/"LATIN SMALL LETTER E WITH TILDE BELOW"/* 1E1B */, /*7708*/"LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE"/* 1E1C */, /*7709*/"LATIN SMALL LETTER E WITH CEDILLA AND BREVE"/* 1E1D */, /*7710*/"LATIN CAPITAL LETTER F WITH DOT ABOVE"/* 1E1E */,/*7711*/"LATIN SMALL LETTER F WITH DOT ABOVE"/* 1E1F */, /*7712*/"LATIN CAPITAL LETTER G WITH MACRON"/* 1E20 */,/*7713*/"LATIN SMALL LETTER G WITH MACRON"/* 1E21 */, /*7714*/"LATIN CAPITAL LETTER H WITH DOT ABOVE"/* 1E22 */,/*7715*/"LATIN SMALL LETTER H WITH DOT ABOVE"/* 1E23 */, /*7716*/"LATIN CAPITAL LETTER H WITH DOT BELOW"/* 1E24 */,/*7717*/"LATIN SMALL LETTER H WITH DOT BELOW"/* 1E25 */, /*7718*/"LATIN CAPITAL LETTER H WITH DIAERESIS"/* 1E26 */,/*7719*/"LATIN SMALL LETTER H WITH DIAERESIS"/* 1E27 */, /*7720*/"LATIN CAPITAL LETTER H WITH CEDILLA"/* 1E28 */,/*7721*/"LATIN SMALL LETTER H WITH CEDILLA"/* 1E29 */, /*7722*/"LATIN CAPITAL LETTER H WITH BREVE BELOW"/* 1E2A */,/*7723*/"LATIN SMALL LETTER H WITH BREVE BELOW"/* 1E2B */, /*7724*/"LATIN CAPITAL LETTER I WITH TILDE BELOW"/* 1E2C */,/*7725*/"LATIN SMALL LETTER I WITH TILDE BELOW"/* 1E2D */, /*7726*/"LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE"/* 1E2E */, /*7727*/"LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE"/* 1E2F */,/*7728*/"LATIN CAPITAL LETTER K WITH ACUTE"/* 1E30 */, /*7729*/"LATIN SMALL LETTER K WITH ACUTE"/* 1E31 */,/*7730*/"LATIN CAPITAL LETTER K WITH DOT BELOW"/* 1E32 */, /*7731*/"LATIN SMALL LETTER K WITH DOT BELOW"/* 1E33 */,/*7732*/"LATIN CAPITAL LETTER K WITH LINE BELOW"/* 1E34 */, /*7733*/"LATIN SMALL LETTER K WITH LINE BELOW"/* 1E35 */,/*7734*/"LATIN CAPITAL LETTER L WITH DOT BELOW"/* 1E36 */, /*7735*/"LATIN SMALL LETTER L WITH DOT BELOW"/* 1E37 */, /*7736*/"LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON"/* 1E38 */, /*7737*/"LATIN SMALL LETTER L WITH DOT BELOW AND MACRON"/* 1E39 */, /*7738*/"LATIN CAPITAL LETTER L WITH LINE BELOW"/* 1E3A */,/*7739*/"LATIN SMALL LETTER L WITH LINE BELOW"/* 1E3B */, /*7740*/"LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW"/* 1E3C */, /*7741*/"LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW"/* 1E3D */,/*7742*/"LATIN CAPITAL LETTER M WITH ACUTE"/* 1E3E */, /*7743*/"LATIN SMALL LETTER M WITH ACUTE"/* 1E3F */,/*7744*/"LATIN CAPITAL LETTER M WITH DOT ABOVE"/* 1E40 */, /*7745*/"LATIN SMALL LETTER M WITH DOT ABOVE"/* 1E41 */,/*7746*/"LATIN CAPITAL LETTER M WITH DOT BELOW"/* 1E42 */, /*7747*/"LATIN SMALL LETTER M WITH DOT BELOW"/* 1E43 */,/*7748*/"LATIN CAPITAL LETTER N WITH DOT ABOVE"/* 1E44 */, /*7749*/"LATIN SMALL LETTER N WITH DOT ABOVE"/* 1E45 */,/*7750*/"LATIN CAPITAL LETTER N WITH DOT BELOW"/* 1E46 */, /*7751*/"LATIN SMALL LETTER N WITH DOT BELOW"/* 1E47 */,/*7752*/"LATIN CAPITAL LETTER N WITH LINE BELOW"/* 1E48 */, /*7753*/"LATIN SMALL LETTER N WITH LINE BELOW"/* 1E49 */, /*7754*/"LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW"/* 1E4A */, /*7755*/"LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW"/* 1E4B */, /*7756*/"LATIN CAPITAL LETTER O WITH TILDE AND ACUTE"/* 1E4C */, /*7757*/"LATIN SMALL LETTER O WITH TILDE AND ACUTE"/* 1E4D */, /*7758*/"LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS"/* 1E4E */, /*7759*/"LATIN SMALL LETTER O WITH TILDE AND DIAERESIS"/* 1E4F */, /*7760*/"LATIN CAPITAL LETTER O WITH MACRON AND GRAVE"/* 1E50 */, /*7761*/"LATIN SMALL LETTER O WITH MACRON AND GRAVE"/* 1E51 */, /*7762*/"LATIN CAPITAL LETTER O WITH MACRON AND ACUTE"/* 1E52 */, /*7763*/"LATIN SMALL LETTER O WITH MACRON AND ACUTE"/* 1E53 */,/*7764*/"LATIN CAPITAL LETTER P WITH ACUTE"/* 1E54 */, /*7765*/"LATIN SMALL LETTER P WITH ACUTE"/* 1E55 */,/*7766*/"LATIN CAPITAL LETTER P WITH DOT ABOVE"/* 1E56 */, /*7767*/"LATIN SMALL LETTER P WITH DOT ABOVE"/* 1E57 */,/*7768*/"LATIN CAPITAL LETTER R WITH DOT ABOVE"/* 1E58 */, /*7769*/"LATIN SMALL LETTER R WITH DOT ABOVE"/* 1E59 */,/*7770*/"LATIN CAPITAL LETTER R WITH DOT BELOW"/* 1E5A */, /*7771*/"LATIN SMALL LETTER R WITH DOT BELOW"/* 1E5B */, /*7772*/"LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON"/* 1E5C */, /*7773*/"LATIN SMALL LETTER R WITH DOT BELOW AND MACRON"/* 1E5D */, /*7774*/"LATIN CAPITAL LETTER R WITH LINE BELOW"/* 1E5E */,/*7775*/"LATIN SMALL LETTER R WITH LINE BELOW"/* 1E5F */, /*7776*/"LATIN CAPITAL LETTER S WITH DOT ABOVE"/* 1E60 */,/*7777*/"LATIN SMALL LETTER S WITH DOT ABOVE"/* 1E61 */, /*7778*/"LATIN CAPITAL LETTER S WITH DOT BELOW"/* 1E62 */,/*7779*/"LATIN SMALL LETTER S WITH DOT BELOW"/* 1E63 */, /*7780*/"LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE"/* 1E64 */, /*7781*/"LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE"/* 1E65 */, /*7782*/"LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE"/* 1E66 */, /*7783*/"LATIN SMALL LETTER S WITH CARON AND DOT ABOVE"/* 1E67 */, /*7784*/"LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE"/* 1E68 */, /*7785*/"LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE"/* 1E69 */, /*7786*/"LATIN CAPITAL LETTER T WITH DOT ABOVE"/* 1E6A */,/*7787*/"LATIN SMALL LETTER T WITH DOT ABOVE"/* 1E6B */, /*7788*/"LATIN CAPITAL LETTER T WITH DOT BELOW"/* 1E6C */,/*7789*/"LATIN SMALL LETTER T WITH DOT BELOW"/* 1E6D */, /*7790*/"LATIN CAPITAL LETTER T WITH LINE BELOW"/* 1E6E */,/*7791*/"LATIN SMALL LETTER T WITH LINE BELOW"/* 1E6F */, /*7792*/"LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW"/* 1E70 */, /*7793*/"LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW"/* 1E71 */, /*7794*/"LATIN CAPITAL LETTER U WITH DIAERESIS BELOW"/* 1E72 */, /*7795*/"LATIN SMALL LETTER U WITH DIAERESIS BELOW"/* 1E73 */, /*7796*/"LATIN CAPITAL LETTER U WITH TILDE BELOW"/* 1E74 */,/*7797*/"LATIN SMALL LETTER U WITH TILDE BELOW"/* 1E75 */, /*7798*/"LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW"/* 1E76 */, /*7799*/"LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW"/* 1E77 */, /*7800*/"LATIN CAPITAL LETTER U WITH TILDE AND ACUTE"/* 1E78 */, /*7801*/"LATIN SMALL LETTER U WITH TILDE AND ACUTE"/* 1E79 */, /*7802*/"LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS"/* 1E7A */, /*7803*/"LATIN SMALL LETTER U WITH MACRON AND DIAERESIS"/* 1E7B */,/*7804*/"LATIN CAPITAL LETTER V WITH TILDE"/* 1E7C */, /*7805*/"LATIN SMALL LETTER V WITH TILDE"/* 1E7D */,/*7806*/"LATIN CAPITAL LETTER V WITH DOT BELOW"/* 1E7E */, /*7807*/"LATIN SMALL LETTER V WITH DOT BELOW"/* 1E7F */,/*7808*/"LATIN CAPITAL LETTER W WITH GRAVE"/* 1E80 */, /*7809*/"LATIN SMALL LETTER W WITH GRAVE"/* 1E81 */,/*7810*/"LATIN CAPITAL LETTER W WITH ACUTE"/* 1E82 */, /*7811*/"LATIN SMALL LETTER W WITH ACUTE"/* 1E83 */,/*7812*/"LATIN CAPITAL LETTER W WITH DIAERESIS"/* 1E84 */, /*7813*/"LATIN SMALL LETTER W WITH DIAERESIS"/* 1E85 */,/*7814*/"LATIN CAPITAL LETTER W WITH DOT ABOVE"/* 1E86 */, /*7815*/"LATIN SMALL LETTER W WITH DOT ABOVE"/* 1E87 */,/*7816*/"LATIN CAPITAL LETTER W WITH DOT BELOW"/* 1E88 */, /*7817*/"LATIN SMALL LETTER W WITH DOT BELOW"/* 1E89 */,/*7818*/"LATIN CAPITAL LETTER X WITH DOT ABOVE"/* 1E8A */, /*7819*/"LATIN SMALL LETTER X WITH DOT ABOVE"/* 1E8B */,/*7820*/"LATIN CAPITAL LETTER X WITH DIAERESIS"/* 1E8C */, /*7821*/"LATIN SMALL LETTER X WITH DIAERESIS"/* 1E8D */,/*7822*/"LATIN CAPITAL LETTER Y WITH DOT ABOVE"/* 1E8E */, /*7823*/"LATIN SMALL LETTER Y WITH DOT ABOVE"/* 1E8F */,/*7824*/"LATIN CAPITAL LETTER Z WITH CIRCUMFLEX"/* 1E90 */, /*7825*/"LATIN SMALL LETTER Z WITH CIRCUMFLEX"/* 1E91 */,/*7826*/"LATIN CAPITAL LETTER Z WITH DOT BELOW"/* 1E92 */, /*7827*/"LATIN SMALL LETTER Z WITH DOT BELOW"/* 1E93 */,/*7828*/"LATIN CAPITAL LETTER Z WITH LINE BELOW"/* 1E94 */, /*7829*/"LATIN SMALL LETTER Z WITH LINE BELOW"/* 1E95 */,/*7830*/"LATIN SMALL LETTER H WITH LINE BELOW"/* 1E96 */, /*7831*/"LATIN SMALL LETTER T WITH DIAERESIS"/* 1E97 */,/*7832*/"LATIN SMALL LETTER W WITH RING ABOVE"/* 1E98 */, /*7833*/"LATIN SMALL LETTER Y WITH RING ABOVE"/* 1E99 */,/*7834*/"LATIN SMALL LETTER A WITH RIGHT HALF RING"/* 1E9A */, /*7835*/"LATIN SMALL LETTER LONG S WITH DOT ABOVE"/* 1E9B */, /*7836*/"LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE"/* 1E9C */, /*7837*/"LATIN SMALL LETTER LONG S WITH HIGH STROKE"/* 1E9D */,/*7838*/"LATIN CAPITAL LETTER SHARP S"/* 1E9E */, /*7839*/"LATIN SMALL LETTER DELTA"/* 1E9F */,/*7840*/"LATIN CAPITAL LETTER A WITH DOT BELOW"/* 1EA0 */, /*7841*/"LATIN SMALL LETTER A WITH DOT BELOW"/* 1EA1 */,/*7842*/"LATIN CAPITAL LETTER A WITH HOOK ABOVE"/* 1EA2 */, /*7843*/"LATIN SMALL LETTER A WITH HOOK ABOVE"/* 1EA3 */, /*7844*/"LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE"/* 1EA4 */, /*7845*/"LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE"/* 1EA5 */, /*7846*/"LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE"/* 1EA6 */, /*7847*/"LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE"/* 1EA7 */, /*7848*/"LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE"/* 1EA8 */, /*7849*/"LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE"/* 1EA9 */, /*7850*/"LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE"/* 1EAA */, /*7851*/"LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE"/* 1EAB */, /*7852*/"LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW"/* 1EAC */, /*7853*/"LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW"/* 1EAD */, /*7854*/"LATIN CAPITAL LETTER A WITH BREVE AND ACUTE"/* 1EAE */, /*7855*/"LATIN SMALL LETTER A WITH BREVE AND ACUTE"/* 1EAF */, /*7856*/"LATIN CAPITAL LETTER A WITH BREVE AND GRAVE"/* 1EB0 */, /*7857*/"LATIN SMALL LETTER A WITH BREVE AND GRAVE"/* 1EB1 */, /*7858*/"LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE"/* 1EB2 */, /*7859*/"LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE"/* 1EB3 */, /*7860*/"LATIN CAPITAL LETTER A WITH BREVE AND TILDE"/* 1EB4 */, /*7861*/"LATIN SMALL LETTER A WITH BREVE AND TILDE"/* 1EB5 */, /*7862*/"LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW"/* 1EB6 */, /*7863*/"LATIN SMALL LETTER A WITH BREVE AND DOT BELOW"/* 1EB7 */, /*7864*/"LATIN CAPITAL LETTER E WITH DOT BELOW"/* 1EB8 */,/*7865*/"LATIN SMALL LETTER E WITH DOT BELOW"/* 1EB9 */, /*7866*/"LATIN CAPITAL LETTER E WITH HOOK ABOVE"/* 1EBA */,/*7867*/"LATIN SMALL LETTER E WITH HOOK ABOVE"/* 1EBB */, /*7868*/"LATIN CAPITAL LETTER E WITH TILDE"/* 1EBC */,/*7869*/"LATIN SMALL LETTER E WITH TILDE"/* 1EBD */, /*7870*/"LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE"/* 1EBE */, /*7871*/"LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE"/* 1EBF */, /*7872*/"LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE"/* 1EC0 */, /*7873*/"LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE"/* 1EC1 */, /*7874*/"LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE"/* 1EC2 */, /*7875*/"LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE"/* 1EC3 */, /*7876*/"LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE"/* 1EC4 */, /*7877*/"LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE"/* 1EC5 */, /*7878*/"LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW"/* 1EC6 */, /*7879*/"LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW"/* 1EC7 */, /*7880*/"LATIN CAPITAL LETTER I WITH HOOK ABOVE"/* 1EC8 */,/*7881*/"LATIN SMALL LETTER I WITH HOOK ABOVE"/* 1EC9 */, /*7882*/"LATIN CAPITAL LETTER I WITH DOT BELOW"/* 1ECA */,/*7883*/"LATIN SMALL LETTER I WITH DOT BELOW"/* 1ECB */, /*7884*/"LATIN CAPITAL LETTER O WITH DOT BELOW"/* 1ECC */,/*7885*/"LATIN SMALL LETTER O WITH DOT BELOW"/* 1ECD */, /*7886*/"LATIN CAPITAL LETTER O WITH HOOK ABOVE"/* 1ECE */,/*7887*/"LATIN SMALL LETTER O WITH HOOK ABOVE"/* 1ECF */, /*7888*/"LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE"/* 1ED0 */, /*7889*/"LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE"/* 1ED1 */, /*7890*/"LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE"/* 1ED2 */, /*7891*/"LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE"/* 1ED3 */, /*7892*/"LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE"/* 1ED4 */, /*7893*/"LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE"/* 1ED5 */, /*7894*/"LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE"/* 1ED6 */, /*7895*/"LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE"/* 1ED7 */, /*7896*/"LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW"/* 1ED8 */, /*7897*/"LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW"/* 1ED9 */, /*7898*/"LATIN CAPITAL LETTER O WITH HORN AND ACUTE"/* 1EDA */, /*7899*/"LATIN SMALL LETTER O WITH HORN AND ACUTE"/* 1EDB */, /*7900*/"LATIN CAPITAL LETTER O WITH HORN AND GRAVE"/* 1EDC */, /*7901*/"LATIN SMALL LETTER O WITH HORN AND GRAVE"/* 1EDD */, /*7902*/"LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE"/* 1EDE */, /*7903*/"LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE"/* 1EDF */, /*7904*/"LATIN CAPITAL LETTER O WITH HORN AND TILDE"/* 1EE0 */, /*7905*/"LATIN SMALL LETTER O WITH HORN AND TILDE"/* 1EE1 */, /*7906*/"LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW"/* 1EE2 */, /*7907*/"LATIN SMALL LETTER O WITH HORN AND DOT BELOW"/* 1EE3 */, /*7908*/"LATIN CAPITAL LETTER U WITH DOT BELOW"/* 1EE4 */,/*7909*/"LATIN SMALL LETTER U WITH DOT BELOW"/* 1EE5 */, /*7910*/"LATIN CAPITAL LETTER U WITH HOOK ABOVE"/* 1EE6 */,/*7911*/"LATIN SMALL LETTER U WITH HOOK ABOVE"/* 1EE7 */, /*7912*/"LATIN CAPITAL LETTER U WITH HORN AND ACUTE"/* 1EE8 */, /*7913*/"LATIN SMALL LETTER U WITH HORN AND ACUTE"/* 1EE9 */, /*7914*/"LATIN CAPITAL LETTER U WITH HORN AND GRAVE"/* 1EEA */, /*7915*/"LATIN SMALL LETTER U WITH HORN AND GRAVE"/* 1EEB */, /*7916*/"LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE"/* 1EEC */, /*7917*/"LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE"/* 1EED */, /*7918*/"LATIN CAPITAL LETTER U WITH HORN AND TILDE"/* 1EEE */, /*7919*/"LATIN SMALL LETTER U WITH HORN AND TILDE"/* 1EEF */, /*7920*/"LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW"/* 1EF0 */, /*7921*/"LATIN SMALL LETTER U WITH HORN AND DOT BELOW"/* 1EF1 */,/*7922*/"LATIN CAPITAL LETTER Y WITH GRAVE"/* 1EF2 */, /*7923*/"LATIN SMALL LETTER Y WITH GRAVE"/* 1EF3 */,/*7924*/"LATIN CAPITAL LETTER Y WITH DOT BELOW"/* 1EF4 */, /*7925*/"LATIN SMALL LETTER Y WITH DOT BELOW"/* 1EF5 */,/*7926*/"LATIN CAPITAL LETTER Y WITH HOOK ABOVE"/* 1EF6 */, /*7927*/"LATIN SMALL LETTER Y WITH HOOK ABOVE"/* 1EF7 */,/*7928*/"LATIN CAPITAL LETTER Y WITH TILDE"/* 1EF8 */, /*7929*/"LATIN SMALL LETTER Y WITH TILDE"/* 1EF9 */,/*7930*/"LATIN CAPITAL LETTER MIDDLE-WELSH LL"/* 1EFA */, /*7931*/"LATIN SMALL LETTER MIDDLE-WELSH LL"/* 1EFB */,/*7932*/"LATIN CAPITAL LETTER MIDDLE-WELSH V"/* 1EFC */, /*7933*/"LATIN SMALL LETTER MIDDLE-WELSH V"/* 1EFD */,/*7934*/"LATIN CAPITAL LETTER Y WITH LOOP"/* 1EFE */, /*7935*/"LATIN SMALL LETTER Y WITH LOOP"/* 1EFF */,/*7936*/"GREEK SMALL LETTER ALPHA WITH PSILI"/* 1F00 */, /*7937*/"GREEK SMALL LETTER ALPHA WITH DASIA"/* 1F01 */, /*7938*/"GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA"/* 1F02 */, /*7939*/"GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA"/* 1F03 */, /*7940*/"GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA"/* 1F04 */, /*7941*/"GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA"/* 1F05 */, /*7942*/"GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI"/* 1F06 */, /*7943*/"GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI"/* 1F07 */, /*7944*/"GREEK CAPITAL LETTER ALPHA WITH PSILI"/* 1F08 */,/*7945*/"GREEK CAPITAL LETTER ALPHA WITH DASIA"/* 1F09 */, /*7946*/"GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA"/* 1F0A */, /*7947*/"GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA"/* 1F0B */, /*7948*/"GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA"/* 1F0C */, /*7949*/"GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA"/* 1F0D */, /*7950*/"GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI"/* 1F0E */, /*7951*/"GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI"/* 1F0F */, /*7952*/"GREEK SMALL LETTER EPSILON WITH PSILI"/* 1F10 */,/*7953*/"GREEK SMALL LETTER EPSILON WITH DASIA"/* 1F11 */, /*7954*/"GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA"/* 1F12 */, /*7955*/"GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA"/* 1F13 */, /*7956*/"GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA"/* 1F14 */, /*7957*/"GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA"/* 1F15 */,NULL,NULL, /*7960*/"GREEK CAPITAL LETTER EPSILON WITH PSILI"/* 1F18 */,/*7961*/"GREEK CAPITAL LETTER EPSILON WITH DASIA"/* 1F19 */, /*7962*/"GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA"/* 1F1A */, /*7963*/"GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA"/* 1F1B */, /*7964*/"GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA"/* 1F1C */, /*7965*/"GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA"/* 1F1D */,NULL,NULL, /*7968*/"GREEK SMALL LETTER ETA WITH PSILI"/* 1F20 */,/*7969*/"GREEK SMALL LETTER ETA WITH DASIA"/* 1F21 */, /*7970*/"GREEK SMALL LETTER ETA WITH PSILI AND VARIA"/* 1F22 */, /*7971*/"GREEK SMALL LETTER ETA WITH DASIA AND VARIA"/* 1F23 */, /*7972*/"GREEK SMALL LETTER ETA WITH PSILI AND OXIA"/* 1F24 */, /*7973*/"GREEK SMALL LETTER ETA WITH DASIA AND OXIA"/* 1F25 */, /*7974*/"GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI"/* 1F26 */, /*7975*/"GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI"/* 1F27 */, /*7976*/"GREEK CAPITAL LETTER ETA WITH PSILI"/* 1F28 */,/*7977*/"GREEK CAPITAL LETTER ETA WITH DASIA"/* 1F29 */, /*7978*/"GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA"/* 1F2A */, /*7979*/"GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA"/* 1F2B */, /*7980*/"GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA"/* 1F2C */, /*7981*/"GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA"/* 1F2D */, /*7982*/"GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI"/* 1F2E */, /*7983*/"GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI"/* 1F2F */, /*7984*/"GREEK SMALL LETTER IOTA WITH PSILI"/* 1F30 */,/*7985*/"GREEK SMALL LETTER IOTA WITH DASIA"/* 1F31 */, /*7986*/"GREEK SMALL LETTER IOTA WITH PSILI AND VARIA"/* 1F32 */, /*7987*/"GREEK SMALL LETTER IOTA WITH DASIA AND VARIA"/* 1F33 */, /*7988*/"GREEK SMALL LETTER IOTA WITH PSILI AND OXIA"/* 1F34 */, /*7989*/"GREEK SMALL LETTER IOTA WITH DASIA AND OXIA"/* 1F35 */, /*7990*/"GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI"/* 1F36 */, /*7991*/"GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI"/* 1F37 */, /*7992*/"GREEK CAPITAL LETTER IOTA WITH PSILI"/* 1F38 */,/*7993*/"GREEK CAPITAL LETTER IOTA WITH DASIA"/* 1F39 */, /*7994*/"GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA"/* 1F3A */, /*7995*/"GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA"/* 1F3B */, /*7996*/"GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA"/* 1F3C */, /*7997*/"GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA"/* 1F3D */, /*7998*/"GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI"/* 1F3E */, /*7999*/"GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI"/* 1F3F */, /*8000*/"GREEK SMALL LETTER OMICRON WITH PSILI"/* 1F40 */,/*8001*/"GREEK SMALL LETTER OMICRON WITH DASIA"/* 1F41 */, /*8002*/"GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA"/* 1F42 */, /*8003*/"GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA"/* 1F43 */, /*8004*/"GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA"/* 1F44 */, /*8005*/"GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA"/* 1F45 */,NULL,NULL, /*8008*/"GREEK CAPITAL LETTER OMICRON WITH PSILI"/* 1F48 */,/*8009*/"GREEK CAPITAL LETTER OMICRON WITH DASIA"/* 1F49 */, /*8010*/"GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA"/* 1F4A */, /*8011*/"GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA"/* 1F4B */, /*8012*/"GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA"/* 1F4C */, /*8013*/"GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA"/* 1F4D */,NULL,NULL, /*8016*/"GREEK SMALL LETTER UPSILON WITH PSILI"/* 1F50 */,/*8017*/"GREEK SMALL LETTER UPSILON WITH DASIA"/* 1F51 */, /*8018*/"GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA"/* 1F52 */, /*8019*/"GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA"/* 1F53 */, /*8020*/"GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA"/* 1F54 */, /*8021*/"GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA"/* 1F55 */, /*8022*/"GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI"/* 1F56 */, /*8023*/"GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI"/* 1F57 */,NULL, /*8025*/"GREEK CAPITAL LETTER UPSILON WITH DASIA"/* 1F59 */,NULL, /*8027*/"GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA"/* 1F5B */,NULL, /*8029*/"GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA"/* 1F5D */,NULL, /*8031*/"GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI"/* 1F5F */, /*8032*/"GREEK SMALL LETTER OMEGA WITH PSILI"/* 1F60 */,/*8033*/"GREEK SMALL LETTER OMEGA WITH DASIA"/* 1F61 */, /*8034*/"GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA"/* 1F62 */, /*8035*/"GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA"/* 1F63 */, /*8036*/"GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA"/* 1F64 */, /*8037*/"GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA"/* 1F65 */, /*8038*/"GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI"/* 1F66 */, /*8039*/"GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI"/* 1F67 */, /*8040*/"GREEK CAPITAL LETTER OMEGA WITH PSILI"/* 1F68 */,/*8041*/"GREEK CAPITAL LETTER OMEGA WITH DASIA"/* 1F69 */, /*8042*/"GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA"/* 1F6A */, /*8043*/"GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA"/* 1F6B */, /*8044*/"GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA"/* 1F6C */, /*8045*/"GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA"/* 1F6D */, /*8046*/"GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI"/* 1F6E */, /*8047*/"GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI"/* 1F6F */, /*8048*/"GREEK SMALL LETTER ALPHA WITH VARIA"/* 1F70 */,/*8049*/"GREEK SMALL LETTER ALPHA WITH OXIA"/* 1F71 */, /*8050*/"GREEK SMALL LETTER EPSILON WITH VARIA"/* 1F72 */,/*8051*/"GREEK SMALL LETTER EPSILON WITH OXIA"/* 1F73 */, /*8052*/"GREEK SMALL LETTER ETA WITH VARIA"/* 1F74 */,/*8053*/"GREEK SMALL LETTER ETA WITH OXIA"/* 1F75 */, /*8054*/"GREEK SMALL LETTER IOTA WITH VARIA"/* 1F76 */,/*8055*/"GREEK SMALL LETTER IOTA WITH OXIA"/* 1F77 */, /*8056*/"GREEK SMALL LETTER OMICRON WITH VARIA"/* 1F78 */,/*8057*/"GREEK SMALL LETTER OMICRON WITH OXIA"/* 1F79 */, /*8058*/"GREEK SMALL LETTER UPSILON WITH VARIA"/* 1F7A */,/*8059*/"GREEK SMALL LETTER UPSILON WITH OXIA"/* 1F7B */, /*8060*/"GREEK SMALL LETTER OMEGA WITH VARIA"/* 1F7C */,/*8061*/"GREEK SMALL LETTER OMEGA WITH OXIA"/* 1F7D */,NULL,NULL, /*8064*/"GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI"/* 1F80 */, /*8065*/"GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI"/* 1F81 */, /*8066*/"GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI"/* 1F82 */, /*8067*/"GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI"/* 1F83 */, /*8068*/"GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI"/* 1F84 */, /*8069*/"GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI"/* 1F85 */, /*8070*/"GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI"/* 1F86 */, /*8071*/"GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI"/* 1F87 */, /*8072*/"GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI"/* 1F88 */, /*8073*/"GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI"/* 1F89 */, /*8074*/"GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI"/* 1F8A */, /*8075*/"GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI"/* 1F8B */, /*8076*/"GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI"/* 1F8C */, /*8077*/"GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI"/* 1F8D */, /*8078*/"GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI"/* 1F8E */, /*8079*/"GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI"/* 1F8F */, /*8080*/"GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI"/* 1F90 */, /*8081*/"GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI"/* 1F91 */, /*8082*/"GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI"/* 1F92 */, /*8083*/"GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI"/* 1F93 */, /*8084*/"GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI"/* 1F94 */, /*8085*/"GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI"/* 1F95 */, /*8086*/"GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI"/* 1F96 */, /*8087*/"GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI"/* 1F97 */, /*8088*/"GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI"/* 1F98 */, /*8089*/"GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI"/* 1F99 */, /*8090*/"GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI"/* 1F9A */, /*8091*/"GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI"/* 1F9B */, /*8092*/"GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI"/* 1F9C */, /*8093*/"GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI"/* 1F9D */, /*8094*/"GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI"/* 1F9E */, /*8095*/"GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI"/* 1F9F */, /*8096*/"GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI"/* 1FA0 */, /*8097*/"GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI"/* 1FA1 */, /*8098*/"GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI"/* 1FA2 */, /*8099*/"GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI"/* 1FA3 */, /*8100*/"GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI"/* 1FA4 */, /*8101*/"GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI"/* 1FA5 */, /*8102*/"GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI"/* 1FA6 */, /*8103*/"GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI"/* 1FA7 */, /*8104*/"GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI"/* 1FA8 */, /*8105*/"GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI"/* 1FA9 */, /*8106*/"GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI"/* 1FAA */, /*8107*/"GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI"/* 1FAB */, /*8108*/"GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI"/* 1FAC */, /*8109*/"GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI"/* 1FAD */, /*8110*/"GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI"/* 1FAE */, /*8111*/"GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI"/* 1FAF */, /*8112*/"GREEK SMALL LETTER ALPHA WITH VRACHY"/* 1FB0 */,/*8113*/"GREEK SMALL LETTER ALPHA WITH MACRON"/* 1FB1 */, /*8114*/"GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI"/* 1FB2 */, /*8115*/"GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI"/* 1FB3 */, /*8116*/"GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI"/* 1FB4 */,NULL, /*8118*/"GREEK SMALL LETTER ALPHA WITH PERISPOMENI"/* 1FB6 */, /*8119*/"GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI"/* 1FB7 */, /*8120*/"GREEK CAPITAL LETTER ALPHA WITH VRACHY"/* 1FB8 */,/*8121*/"GREEK CAPITAL LETTER ALPHA WITH MACRON"/* 1FB9 */, /*8122*/"GREEK CAPITAL LETTER ALPHA WITH VARIA"/* 1FBA */,/*8123*/"GREEK CAPITAL LETTER ALPHA WITH OXIA"/* 1FBB */, /*8124*/"GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI"/* 1FBC */,/*8125*/"GREEK KORONIS"/* 1FBD */, /*8126*/"GREEK PROSGEGRAMMENI"/* 1FBE */,/*8127*/"GREEK PSILI"/* 1FBF */,/*8128*/"GREEK PERISPOMENI"/* 1FC0 */, /*8129*/"GREEK DIALYTIKA AND PERISPOMENI"/* 1FC1 */, /*8130*/"GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI"/* 1FC2 */, /*8131*/"GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI"/* 1FC3 */, /*8132*/"GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI"/* 1FC4 */,NULL, /*8134*/"GREEK SMALL LETTER ETA WITH PERISPOMENI"/* 1FC6 */, /*8135*/"GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI"/* 1FC7 */, /*8136*/"GREEK CAPITAL LETTER EPSILON WITH VARIA"/* 1FC8 */,/*8137*/"GREEK CAPITAL LETTER EPSILON WITH OXIA"/* 1FC9 */, /*8138*/"GREEK CAPITAL LETTER ETA WITH VARIA"/* 1FCA */,/*8139*/"GREEK CAPITAL LETTER ETA WITH OXIA"/* 1FCB */, /*8140*/"GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI"/* 1FCC */,/*8141*/"GREEK PSILI AND VARIA"/* 1FCD */, /*8142*/"GREEK PSILI AND OXIA"/* 1FCE */,/*8143*/"GREEK PSILI AND PERISPOMENI"/* 1FCF */, /*8144*/"GREEK SMALL LETTER IOTA WITH VRACHY"/* 1FD0 */,/*8145*/"GREEK SMALL LETTER IOTA WITH MACRON"/* 1FD1 */, /*8146*/"GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA"/* 1FD2 */, /*8147*/"GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA"/* 1FD3 */,NULL,NULL, /*8150*/"GREEK SMALL LETTER IOTA WITH PERISPOMENI"/* 1FD6 */, /*8151*/"GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI"/* 1FD7 */, /*8152*/"GREEK CAPITAL LETTER IOTA WITH VRACHY"/* 1FD8 */,/*8153*/"GREEK CAPITAL LETTER IOTA WITH MACRON"/* 1FD9 */, /*8154*/"GREEK CAPITAL LETTER IOTA WITH VARIA"/* 1FDA */,/*8155*/"GREEK CAPITAL LETTER IOTA WITH OXIA"/* 1FDB */,NULL, /*8157*/"GREEK DASIA AND VARIA"/* 1FDD */,/*8158*/"GREEK DASIA AND OXIA"/* 1FDE */, /*8159*/"GREEK DASIA AND PERISPOMENI"/* 1FDF */,/*8160*/"GREEK SMALL LETTER UPSILON WITH VRACHY"/* 1FE0 */, /*8161*/"GREEK SMALL LETTER UPSILON WITH MACRON"/* 1FE1 */, /*8162*/"GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA"/* 1FE2 */, /*8163*/"GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA"/* 1FE3 */, /*8164*/"GREEK SMALL LETTER RHO WITH PSILI"/* 1FE4 */,/*8165*/"GREEK SMALL LETTER RHO WITH DASIA"/* 1FE5 */, /*8166*/"GREEK SMALL LETTER UPSILON WITH PERISPOMENI"/* 1FE6 */, /*8167*/"GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI"/* 1FE7 */, /*8168*/"GREEK CAPITAL LETTER UPSILON WITH VRACHY"/* 1FE8 */, /*8169*/"GREEK CAPITAL LETTER UPSILON WITH MACRON"/* 1FE9 */,/*8170*/"GREEK CAPITAL LETTER UPSILON WITH VARIA"/* 1FEA */, /*8171*/"GREEK CAPITAL LETTER UPSILON WITH OXIA"/* 1FEB */,/*8172*/"GREEK CAPITAL LETTER RHO WITH DASIA"/* 1FEC */, /*8173*/"GREEK DIALYTIKA AND VARIA"/* 1FED */,/*8174*/"GREEK DIALYTIKA AND OXIA"/* 1FEE */, /*8175*/"GREEK VARIA"/* 1FEF */,NULL,NULL,/*8178*/"GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI"/* 1FF2 */, /*8179*/"GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI"/* 1FF3 */, /*8180*/"GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI"/* 1FF4 */,NULL, /*8182*/"GREEK SMALL LETTER OMEGA WITH PERISPOMENI"/* 1FF6 */, /*8183*/"GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI"/* 1FF7 */, /*8184*/"GREEK CAPITAL LETTER OMICRON WITH VARIA"/* 1FF8 */,/*8185*/"GREEK CAPITAL LETTER OMICRON WITH OXIA"/* 1FF9 */, /*8186*/"GREEK CAPITAL LETTER OMEGA WITH VARIA"/* 1FFA */,/*8187*/"GREEK CAPITAL LETTER OMEGA WITH OXIA"/* 1FFB */, /*8188*/"GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI"/* 1FFC */,/*8189*/"GREEK OXIA"/* 1FFD */, /*8190*/"GREEK DASIA"/* 1FFE */,NULL,/*8192*/"EN QUAD"/* 2000 */,/*8193*/"EM QUAD"/* 2001 */, /*8194*/"EN SPACE"/* 2002 */,/*8195*/"EM SPACE"/* 2003 */,/*8196*/"THREE-PER-EM SPACE"/* 2004 */, /*8197*/"FOUR-PER-EM SPACE"/* 2005 */,/*8198*/"SIX-PER-EM SPACE"/* 2006 */,/*8199*/"FIGURE SPACE"/* 2007 */, /*8200*/"PUNCTUATION SPACE"/* 2008 */,/*8201*/"THIN SPACE"/* 2009 */,/*8202*/"HAIR SPACE"/* 200A */, /*8203*/"ZERO WIDTH SPACE"/* 200B */,/*8204*/"ZERO WIDTH NON-JOINER"/* 200C */,/*8205*/"ZERO WIDTH JOINER"/* 200D */, /*8206*/"LEFT-TO-RIGHT MARK"/* 200E */,/*8207*/"RIGHT-TO-LEFT MARK"/* 200F */,/*8208*/"HYPHEN"/* 2010 */, /*8209*/"NON-BREAKING HYPHEN"/* 2011 */,/*8210*/"FIGURE DASH"/* 2012 */,/*8211*/"EN DASH"/* 2013 */, /*8212*/"EM DASH"/* 2014 */,/*8213*/"HORIZONTAL BAR"/* 2015 */,/*8214*/"DOUBLE VERTICAL LINE"/* 2016 */, /*8215*/"DOUBLE LOW LINE"/* 2017 */,/*8216*/"LEFT SINGLE QUOTATION MARK"/* 2018 */, /*8217*/"RIGHT SINGLE QUOTATION MARK"/* 2019 */,/*8218*/"SINGLE LOW-9 QUOTATION MARK"/* 201A */, /*8219*/"SINGLE HIGH-REVERSED-9 QUOTATION MARK"/* 201B */,/*8220*/"LEFT DOUBLE QUOTATION MARK"/* 201C */, /*8221*/"RIGHT DOUBLE QUOTATION MARK"/* 201D */,/*8222*/"DOUBLE LOW-9 QUOTATION MARK"/* 201E */, /*8223*/"DOUBLE HIGH-REVERSED-9 QUOTATION MARK"/* 201F */,/*8224*/"DAGGER"/* 2020 */,/*8225*/"DOUBLE DAGGER"/* 2021 */, /*8226*/"BULLET"/* 2022 */,/*8227*/"TRIANGULAR BULLET"/* 2023 */,/*8228*/"ONE DOT LEADER"/* 2024 */, /*8229*/"TWO DOT LEADER"/* 2025 */,/*8230*/"HORIZONTAL ELLIPSIS"/* 2026 */,/*8231*/"HYPHENATION POINT"/* 2027 */, /*8232*/"LINE SEPARATOR"/* 2028 */,/*8233*/"PARAGRAPH SEPARATOR"/* 2029 */,/*8234*/"LEFT-TO-RIGHT EMBEDDING"/* 202A */, /*8235*/"RIGHT-TO-LEFT EMBEDDING"/* 202B */,/*8236*/"POP DIRECTIONAL FORMATTING"/* 202C */, /*8237*/"LEFT-TO-RIGHT OVERRIDE"/* 202D */,/*8238*/"RIGHT-TO-LEFT OVERRIDE"/* 202E */, /*8239*/"NARROW NO-BREAK SPACE"/* 202F */,/*8240*/"PER MILLE SIGN"/* 2030 */,/*8241*/"PER TEN THOUSAND SIGN"/* 2031 */, /*8242*/"PRIME"/* 2032 */,/*8243*/"DOUBLE PRIME"/* 2033 */,/*8244*/"TRIPLE PRIME"/* 2034 */, /*8245*/"REVERSED PRIME"/* 2035 */,/*8246*/"REVERSED DOUBLE PRIME"/* 2036 */,/*8247*/"REVERSED TRIPLE PRIME"/* 2037 */, /*8248*/"CARET"/* 2038 */,/*8249*/"SINGLE LEFT-POINTING ANGLE QUOTATION MARK"/* 2039 */, /*8250*/"SINGLE RIGHT-POINTING ANGLE QUOTATION MARK"/* 203A */,/*8251*/"REFERENCE MARK"/* 203B */, /*8252*/"DOUBLE EXCLAMATION MARK"/* 203C */,/*8253*/"INTERROBANG"/* 203D */,/*8254*/"OVERLINE"/* 203E */, /*8255*/"UNDERTIE"/* 203F */,/*8256*/"CHARACTER TIE"/* 2040 */,/*8257*/"CARET INSERTION POINT"/* 2041 */, /*8258*/"ASTERISM"/* 2042 */,/*8259*/"HYPHEN BULLET"/* 2043 */,/*8260*/"FRACTION SLASH"/* 2044 */, /*8261*/"LEFT SQUARE BRACKET WITH QUILL"/* 2045 */,/*8262*/"RIGHT SQUARE BRACKET WITH QUILL"/* 2046 */, /*8263*/"DOUBLE QUESTION MARK"/* 2047 */,/*8264*/"QUESTION EXCLAMATION MARK"/* 2048 */, /*8265*/"EXCLAMATION QUESTION MARK"/* 2049 */,/*8266*/"TIRONIAN SIGN ET"/* 204A */, /*8267*/"REVERSED PILCROW SIGN"/* 204B */,/*8268*/"BLACK LEFTWARDS BULLET"/* 204C */, /*8269*/"BLACK RIGHTWARDS BULLET"/* 204D */,/*8270*/"LOW ASTERISK"/* 204E */,/*8271*/"REVERSED SEMICOLON"/* 204F */, /*8272*/"CLOSE UP"/* 2050 */,/*8273*/"TWO ASTERISKS ALIGNED VERTICALLY"/* 2051 */, /*8274*/"COMMERCIAL MINUS SIGN"/* 2052 */,/*8275*/"SWUNG DASH"/* 2053 */,/*8276*/"INVERTED UNDERTIE"/* 2054 */, /*8277*/"FLOWER PUNCTUATION MARK"/* 2055 */,/*8278*/"THREE DOT PUNCTUATION"/* 2056 */, /*8279*/"QUADRUPLE PRIME"/* 2057 */,/*8280*/"FOUR DOT PUNCTUATION"/* 2058 */,/*8281*/"FIVE DOT PUNCTUATION"/* 2059 */, /*8282*/"TWO DOT PUNCTUATION"/* 205A */,/*8283*/"FOUR DOT MARK"/* 205B */,/*8284*/"DOTTED CROSS"/* 205C */, /*8285*/"TRICOLON"/* 205D */,/*8286*/"VERTICAL FOUR DOTS"/* 205E */,/*8287*/"MEDIUM MATHEMATICAL SPACE"/* 205F */, /*8288*/"WORD JOINER"/* 2060 */,/*8289*/"FUNCTION APPLICATION"/* 2061 */,/*8290*/"INVISIBLE TIMES"/* 2062 */, /*8291*/"INVISIBLE SEPARATOR"/* 2063 */,/*8292*/"INVISIBLE PLUS"/* 2064 */,NULL, /*8294*/"LEFT-TO-RIGHT ISOLATE"/* 2066 */,/*8295*/"RIGHT-TO-LEFT ISOLATE"/* 2067 */, /*8296*/"FIRST STRONG ISOLATE"/* 2068 */,/*8297*/"POP DIRECTIONAL ISOLATE"/* 2069 */, /*8298*/"INHIBIT SYMMETRIC SWAPPING"/* 206A */,/*8299*/"ACTIVATE SYMMETRIC SWAPPING"/* 206B */, /*8300*/"INHIBIT ARABIC FORM SHAPING"/* 206C */,/*8301*/"ACTIVATE ARABIC FORM SHAPING"/* 206D */, /*8302*/"NATIONAL DIGIT SHAPES"/* 206E */,/*8303*/"NOMINAL DIGIT SHAPES"/* 206F */,/*8304*/"SUPERSCRIPT ZERO"/* 2070 */, /*8305*/"SUPERSCRIPT LATIN SMALL LETTER I"/* 2071 */,NULL,NULL,/*8308*/"SUPERSCRIPT FOUR"/* 2074 */, /*8309*/"SUPERSCRIPT FIVE"/* 2075 */,/*8310*/"SUPERSCRIPT SIX"/* 2076 */,/*8311*/"SUPERSCRIPT SEVEN"/* 2077 */, /*8312*/"SUPERSCRIPT EIGHT"/* 2078 */,/*8313*/"SUPERSCRIPT NINE"/* 2079 */,/*8314*/"SUPERSCRIPT PLUS SIGN"/* 207A */, /*8315*/"SUPERSCRIPT MINUS"/* 207B */,/*8316*/"SUPERSCRIPT EQUALS SIGN"/* 207C */, /*8317*/"SUPERSCRIPT LEFT PARENTHESIS"/* 207D */,/*8318*/"SUPERSCRIPT RIGHT PARENTHESIS"/* 207E */, /*8319*/"SUPERSCRIPT LATIN SMALL LETTER N"/* 207F */,/*8320*/"SUBSCRIPT ZERO"/* 2080 */, /*8321*/"SUBSCRIPT ONE"/* 2081 */,/*8322*/"SUBSCRIPT TWO"/* 2082 */,/*8323*/"SUBSCRIPT THREE"/* 2083 */, /*8324*/"SUBSCRIPT FOUR"/* 2084 */,/*8325*/"SUBSCRIPT FIVE"/* 2085 */,/*8326*/"SUBSCRIPT SIX"/* 2086 */, /*8327*/"SUBSCRIPT SEVEN"/* 2087 */,/*8328*/"SUBSCRIPT EIGHT"/* 2088 */,/*8329*/"SUBSCRIPT NINE"/* 2089 */, /*8330*/"SUBSCRIPT PLUS SIGN"/* 208A */,/*8331*/"SUBSCRIPT MINUS"/* 208B */,/*8332*/"SUBSCRIPT EQUALS SIGN"/* 208C */, /*8333*/"SUBSCRIPT LEFT PARENTHESIS"/* 208D */,/*8334*/"SUBSCRIPT RIGHT PARENTHESIS"/* 208E */,NULL, /*8336*/"LATIN SUBSCRIPT SMALL LETTER A"/* 2090 */,/*8337*/"LATIN SUBSCRIPT SMALL LETTER E"/* 2091 */, /*8338*/"LATIN SUBSCRIPT SMALL LETTER O"/* 2092 */,/*8339*/"LATIN SUBSCRIPT SMALL LETTER X"/* 2093 */, /*8340*/"LATIN SUBSCRIPT SMALL LETTER SCHWA"/* 2094 */,/*8341*/"LATIN SUBSCRIPT SMALL LETTER H"/* 2095 */, /*8342*/"LATIN SUBSCRIPT SMALL LETTER K"/* 2096 */,/*8343*/"LATIN SUBSCRIPT SMALL LETTER L"/* 2097 */, /*8344*/"LATIN SUBSCRIPT SMALL LETTER M"/* 2098 */,/*8345*/"LATIN SUBSCRIPT SMALL LETTER N"/* 2099 */, /*8346*/"LATIN SUBSCRIPT SMALL LETTER P"/* 209A */,/*8347*/"LATIN SUBSCRIPT SMALL LETTER S"/* 209B */, /*8348*/"LATIN SUBSCRIPT SMALL LETTER T"/* 209C */,NULL,NULL,NULL,/*8352*/"EURO-CURRENCY SIGN"/* 20A0 */, /*8353*/"COLON SIGN"/* 20A1 */,/*8354*/"CRUZEIRO SIGN"/* 20A2 */,/*8355*/"FRENCH FRANC SIGN"/* 20A3 */, /*8356*/"LIRA SIGN"/* 20A4 */,/*8357*/"MILL SIGN"/* 20A5 */,/*8358*/"NAIRA SIGN"/* 20A6 */, /*8359*/"PESETA SIGN"/* 20A7 */,/*8360*/"RUPEE SIGN"/* 20A8 */,/*8361*/"WON SIGN"/* 20A9 */, /*8362*/"NEW SHEQEL SIGN"/* 20AA */,/*8363*/"DONG SIGN"/* 20AB */,/*8364*/"EURO SIGN"/* 20AC */, /*8365*/"KIP SIGN"/* 20AD */,/*8366*/"TUGRIK SIGN"/* 20AE */,/*8367*/"DRACHMA SIGN"/* 20AF */, /*8368*/"GERMAN PENNY SIGN"/* 20B0 */,/*8369*/"PESO SIGN"/* 20B1 */,/*8370*/"GUARANI SIGN"/* 20B2 */, /*8371*/"AUSTRAL SIGN"/* 20B3 */,/*8372*/"HRYVNIA SIGN"/* 20B4 */,/*8373*/"CEDI SIGN"/* 20B5 */, /*8374*/"LIVRE TOURNOIS SIGN"/* 20B6 */,/*8375*/"SPESMILO SIGN"/* 20B7 */,/*8376*/"TENGE SIGN"/* 20B8 */, /*8377*/"INDIAN RUPEE SIGN"/* 20B9 */,/*8378*/"TURKISH LIRA SIGN"/* 20BA */,/*8379*/"NORDIC MARK SIGN"/* 20BB */, /*8380*/"MANAT SIGN"/* 20BC */,/*8381*/"RUBLE SIGN"/* 20BD */,/*8382*/"LARI SIGN"/* 20BE */, /*8383*/"BITCOIN SIGN"/* 20BF */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*8400*/"COMBINING LEFT HARPOON ABOVE"/* 20D0 */,/*8401*/"COMBINING RIGHT HARPOON ABOVE"/* 20D1 */, /*8402*/"COMBINING LONG VERTICAL LINE OVERLAY"/* 20D2 */,/*8403*/"COMBINING SHORT VERTICAL LINE OVERLAY"/* 20D3 */, /*8404*/"COMBINING ANTICLOCKWISE ARROW ABOVE"/* 20D4 */,/*8405*/"COMBINING CLOCKWISE ARROW ABOVE"/* 20D5 */, /*8406*/"COMBINING LEFT ARROW ABOVE"/* 20D6 */,/*8407*/"COMBINING RIGHT ARROW ABOVE"/* 20D7 */, /*8408*/"COMBINING RING OVERLAY"/* 20D8 */,/*8409*/"COMBINING CLOCKWISE RING OVERLAY"/* 20D9 */, /*8410*/"COMBINING ANTICLOCKWISE RING OVERLAY"/* 20DA */,/*8411*/"COMBINING THREE DOTS ABOVE"/* 20DB */, /*8412*/"COMBINING FOUR DOTS ABOVE"/* 20DC */,/*8413*/"COMBINING ENCLOSING CIRCLE"/* 20DD */, /*8414*/"COMBINING ENCLOSING SQUARE"/* 20DE */,/*8415*/"COMBINING ENCLOSING DIAMOND"/* 20DF */, /*8416*/"COMBINING ENCLOSING CIRCLE BACKSLASH"/* 20E0 */,/*8417*/"COMBINING LEFT RIGHT ARROW ABOVE"/* 20E1 */, /*8418*/"COMBINING ENCLOSING SCREEN"/* 20E2 */,/*8419*/"COMBINING ENCLOSING KEYCAP"/* 20E3 */, /*8420*/"COMBINING ENCLOSING UPWARD POINTING TRIANGLE"/* 20E4 */,/*8421*/"COMBINING REVERSE SOLIDUS OVERLAY"/* 20E5 */, /*8422*/"COMBINING DOUBLE VERTICAL STROKE OVERLAY"/* 20E6 */,/*8423*/"COMBINING ANNUITY SYMBOL"/* 20E7 */, /*8424*/"COMBINING TRIPLE UNDERDOT"/* 20E8 */,/*8425*/"COMBINING WIDE BRIDGE ABOVE"/* 20E9 */, /*8426*/"COMBINING LEFTWARDS ARROW OVERLAY"/* 20EA */,/*8427*/"COMBINING LONG DOUBLE SOLIDUS OVERLAY"/* 20EB */, /*8428*/"COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS"/* 20EC */, /*8429*/"COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS"/* 20ED */,/*8430*/"COMBINING LEFT ARROW BELOW"/* 20EE */, /*8431*/"COMBINING RIGHT ARROW BELOW"/* 20EF */,/*8432*/"COMBINING ASTERISK ABOVE"/* 20F0 */,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*8448*/"ACCOUNT OF"/* 2100 */, /*8449*/"ADDRESSED TO THE SUBJECT"/* 2101 */,/*8450*/"DOUBLE-STRUCK CAPITAL C"/* 2102 */, /*8451*/"DEGREE CELSIUS"/* 2103 */,/*8452*/"CENTRE LINE SYMBOL"/* 2104 */,/*8453*/"CARE OF"/* 2105 */, /*8454*/"CADA UNA"/* 2106 */,/*8455*/"EULER CONSTANT"/* 2107 */,/*8456*/"SCRUPLE"/* 2108 */, /*8457*/"DEGREE FAHRENHEIT"/* 2109 */,/*8458*/"SCRIPT SMALL G"/* 210A */,/*8459*/"SCRIPT CAPITAL H"/* 210B */, /*8460*/"BLACK-LETTER CAPITAL H"/* 210C */,/*8461*/"DOUBLE-STRUCK CAPITAL H"/* 210D */, /*8462*/"PLANCK CONSTANT"/* 210E */,/*8463*/"PLANCK CONSTANT OVER TWO PI"/* 210F */,/*8464*/"SCRIPT CAPITAL I"/* 2110 */, /*8465*/"BLACK-LETTER CAPITAL I"/* 2111 */,/*8466*/"SCRIPT CAPITAL L"/* 2112 */,/*8467*/"SCRIPT SMALL L"/* 2113 */, /*8468*/"L B BAR SYMBOL"/* 2114 */,/*8469*/"DOUBLE-STRUCK CAPITAL N"/* 2115 */,/*8470*/"NUMERO SIGN"/* 2116 */, /*8471*/"SOUND RECORDING COPYRIGHT"/* 2117 */,/*8472*/"SCRIPT CAPITAL P"/* 2118 */, /*8473*/"DOUBLE-STRUCK CAPITAL P"/* 2119 */,/*8474*/"DOUBLE-STRUCK CAPITAL Q"/* 211A */, /*8475*/"SCRIPT CAPITAL R"/* 211B */,/*8476*/"BLACK-LETTER CAPITAL R"/* 211C */, /*8477*/"DOUBLE-STRUCK CAPITAL R"/* 211D */,/*8478*/"PRESCRIPTION TAKE"/* 211E */,/*8479*/"RESPONSE"/* 211F */, /*8480*/"SERVICE MARK"/* 2120 */,/*8481*/"TELEPHONE SIGN"/* 2121 */,/*8482*/"TRADE MARK SIGN"/* 2122 */, /*8483*/"VERSICLE"/* 2123 */,/*8484*/"DOUBLE-STRUCK CAPITAL Z"/* 2124 */,/*8485*/"OUNCE SIGN"/* 2125 */, /*8486*/"OHM SIGN"/* 2126 */,/*8487*/"INVERTED OHM SIGN"/* 2127 */,/*8488*/"BLACK-LETTER CAPITAL Z"/* 2128 */, /*8489*/"TURNED GREEK SMALL LETTER IOTA"/* 2129 */,/*8490*/"KELVIN SIGN"/* 212A */,/*8491*/"ANGSTROM SIGN"/* 212B */, /*8492*/"SCRIPT CAPITAL B"/* 212C */,/*8493*/"BLACK-LETTER CAPITAL C"/* 212D */,/*8494*/"ESTIMATED SYMBOL"/* 212E */, /*8495*/"SCRIPT SMALL E"/* 212F */,/*8496*/"SCRIPT CAPITAL E"/* 2130 */,/*8497*/"SCRIPT CAPITAL F"/* 2131 */, /*8498*/"TURNED CAPITAL F"/* 2132 */,/*8499*/"SCRIPT CAPITAL M"/* 2133 */,/*8500*/"SCRIPT SMALL O"/* 2134 */, /*8501*/"ALEF SYMBOL"/* 2135 */,/*8502*/"BET SYMBOL"/* 2136 */,/*8503*/"GIMEL SYMBOL"/* 2137 */, /*8504*/"DALET SYMBOL"/* 2138 */,/*8505*/"INFORMATION SOURCE"/* 2139 */,/*8506*/"ROTATED CAPITAL Q"/* 213A */, /*8507*/"FACSIMILE SIGN"/* 213B */,/*8508*/"DOUBLE-STRUCK SMALL PI"/* 213C */, /*8509*/"DOUBLE-STRUCK SMALL GAMMA"/* 213D */,/*8510*/"DOUBLE-STRUCK CAPITAL GAMMA"/* 213E */, /*8511*/"DOUBLE-STRUCK CAPITAL PI"/* 213F */,/*8512*/"DOUBLE-STRUCK N-ARY SUMMATION"/* 2140 */, /*8513*/"TURNED SANS-SERIF CAPITAL G"/* 2141 */,/*8514*/"TURNED SANS-SERIF CAPITAL L"/* 2142 */, /*8515*/"REVERSED SANS-SERIF CAPITAL L"/* 2143 */,/*8516*/"TURNED SANS-SERIF CAPITAL Y"/* 2144 */, /*8517*/"DOUBLE-STRUCK ITALIC CAPITAL D"/* 2145 */,/*8518*/"DOUBLE-STRUCK ITALIC SMALL D"/* 2146 */, /*8519*/"DOUBLE-STRUCK ITALIC SMALL E"/* 2147 */,/*8520*/"DOUBLE-STRUCK ITALIC SMALL I"/* 2148 */, /*8521*/"DOUBLE-STRUCK ITALIC SMALL J"/* 2149 */,/*8522*/"PROPERTY LINE"/* 214A */,/*8523*/"TURNED AMPERSAND"/* 214B */, /*8524*/"PER SIGN"/* 214C */,/*8525*/"AKTIESELSKAB"/* 214D */,/*8526*/"TURNED SMALL F"/* 214E */, /*8527*/"SYMBOL FOR SAMARITAN SOURCE"/* 214F */,/*8528*/"VULGAR FRACTION ONE SEVENTH"/* 2150 */, /*8529*/"VULGAR FRACTION ONE NINTH"/* 2151 */,/*8530*/"VULGAR FRACTION ONE TENTH"/* 2152 */, /*8531*/"VULGAR FRACTION ONE THIRD"/* 2153 */,/*8532*/"VULGAR FRACTION TWO THIRDS"/* 2154 */, /*8533*/"VULGAR FRACTION ONE FIFTH"/* 2155 */,/*8534*/"VULGAR FRACTION TWO FIFTHS"/* 2156 */, /*8535*/"VULGAR FRACTION THREE FIFTHS"/* 2157 */,/*8536*/"VULGAR FRACTION FOUR FIFTHS"/* 2158 */, /*8537*/"VULGAR FRACTION ONE SIXTH"/* 2159 */,/*8538*/"VULGAR FRACTION FIVE SIXTHS"/* 215A */, /*8539*/"VULGAR FRACTION ONE EIGHTH"/* 215B */,/*8540*/"VULGAR FRACTION THREE EIGHTHS"/* 215C */, /*8541*/"VULGAR FRACTION FIVE EIGHTHS"/* 215D */,/*8542*/"VULGAR FRACTION SEVEN EIGHTHS"/* 215E */, /*8543*/"FRACTION NUMERATOR ONE"/* 215F */,/*8544*/"ROMAN NUMERAL ONE"/* 2160 */,/*8545*/"ROMAN NUMERAL TWO"/* 2161 */, /*8546*/"ROMAN NUMERAL THREE"/* 2162 */,/*8547*/"ROMAN NUMERAL FOUR"/* 2163 */,/*8548*/"ROMAN NUMERAL FIVE"/* 2164 */, /*8549*/"ROMAN NUMERAL SIX"/* 2165 */,/*8550*/"ROMAN NUMERAL SEVEN"/* 2166 */,/*8551*/"ROMAN NUMERAL EIGHT"/* 2167 */, /*8552*/"ROMAN NUMERAL NINE"/* 2168 */,/*8553*/"ROMAN NUMERAL TEN"/* 2169 */,/*8554*/"ROMAN NUMERAL ELEVEN"/* 216A */, /*8555*/"ROMAN NUMERAL TWELVE"/* 216B */,/*8556*/"ROMAN NUMERAL FIFTY"/* 216C */, /*8557*/"ROMAN NUMERAL ONE HUNDRED"/* 216D */,/*8558*/"ROMAN NUMERAL FIVE HUNDRED"/* 216E */, /*8559*/"ROMAN NUMERAL ONE THOUSAND"/* 216F */,/*8560*/"SMALL ROMAN NUMERAL ONE"/* 2170 */, /*8561*/"SMALL ROMAN NUMERAL TWO"/* 2171 */,/*8562*/"SMALL ROMAN NUMERAL THREE"/* 2172 */, /*8563*/"SMALL ROMAN NUMERAL FOUR"/* 2173 */,/*8564*/"SMALL ROMAN NUMERAL FIVE"/* 2174 */, /*8565*/"SMALL ROMAN NUMERAL SIX"/* 2175 */,/*8566*/"SMALL ROMAN NUMERAL SEVEN"/* 2176 */, /*8567*/"SMALL ROMAN NUMERAL EIGHT"/* 2177 */,/*8568*/"SMALL ROMAN NUMERAL NINE"/* 2178 */, /*8569*/"SMALL ROMAN NUMERAL TEN"/* 2179 */,/*8570*/"SMALL ROMAN NUMERAL ELEVEN"/* 217A */, /*8571*/"SMALL ROMAN NUMERAL TWELVE"/* 217B */,/*8572*/"SMALL ROMAN NUMERAL FIFTY"/* 217C */, /*8573*/"SMALL ROMAN NUMERAL ONE HUNDRED"/* 217D */,/*8574*/"SMALL ROMAN NUMERAL FIVE HUNDRED"/* 217E */, /*8575*/"SMALL ROMAN NUMERAL ONE THOUSAND"/* 217F */,/*8576*/"ROMAN NUMERAL ONE THOUSAND C D"/* 2180 */, /*8577*/"ROMAN NUMERAL FIVE THOUSAND"/* 2181 */,/*8578*/"ROMAN NUMERAL TEN THOUSAND"/* 2182 */, /*8579*/"ROMAN NUMERAL REVERSED ONE HUNDRED"/* 2183 */,/*8580*/"LATIN SMALL LETTER REVERSED C"/* 2184 */, /*8581*/"ROMAN NUMERAL SIX LATE FORM"/* 2185 */,/*8582*/"ROMAN NUMERAL FIFTY EARLY FORM"/* 2186 */, /*8583*/"ROMAN NUMERAL FIFTY THOUSAND"/* 2187 */,/*8584*/"ROMAN NUMERAL ONE HUNDRED THOUSAND"/* 2188 */, /*8585*/"VULGAR FRACTION ZERO THIRDS"/* 2189 */,/*8586*/"TURNED DIGIT TWO"/* 218A */, /*8587*/"TURNED DIGIT THREE"/* 218B */,NULL,NULL,NULL,NULL,/*8592*/"LEFTWARDS ARROW"/* 2190 */, /*8593*/"UPWARDS ARROW"/* 2191 */,/*8594*/"RIGHTWARDS ARROW"/* 2192 */,/*8595*/"DOWNWARDS ARROW"/* 2193 */, /*8596*/"LEFT RIGHT ARROW"/* 2194 */,/*8597*/"UP DOWN ARROW"/* 2195 */,/*8598*/"NORTH WEST ARROW"/* 2196 */, /*8599*/"NORTH EAST ARROW"/* 2197 */,/*8600*/"SOUTH EAST ARROW"/* 2198 */,/*8601*/"SOUTH WEST ARROW"/* 2199 */, /*8602*/"LEFTWARDS ARROW WITH STROKE"/* 219A */,/*8603*/"RIGHTWARDS ARROW WITH STROKE"/* 219B */, /*8604*/"LEFTWARDS WAVE ARROW"/* 219C */,/*8605*/"RIGHTWARDS WAVE ARROW"/* 219D */, /*8606*/"LEFTWARDS TWO HEADED ARROW"/* 219E */,/*8607*/"UPWARDS TWO HEADED ARROW"/* 219F */, /*8608*/"RIGHTWARDS TWO HEADED ARROW"/* 21A0 */,/*8609*/"DOWNWARDS TWO HEADED ARROW"/* 21A1 */, /*8610*/"LEFTWARDS ARROW WITH TAIL"/* 21A2 */,/*8611*/"RIGHTWARDS ARROW WITH TAIL"/* 21A3 */, /*8612*/"LEFTWARDS ARROW FROM BAR"/* 21A4 */,/*8613*/"UPWARDS ARROW FROM BAR"/* 21A5 */, /*8614*/"RIGHTWARDS ARROW FROM BAR"/* 21A6 */,/*8615*/"DOWNWARDS ARROW FROM BAR"/* 21A7 */, /*8616*/"UP DOWN ARROW WITH BASE"/* 21A8 */,/*8617*/"LEFTWARDS ARROW WITH HOOK"/* 21A9 */, /*8618*/"RIGHTWARDS ARROW WITH HOOK"/* 21AA */,/*8619*/"LEFTWARDS ARROW WITH LOOP"/* 21AB */, /*8620*/"RIGHTWARDS ARROW WITH LOOP"/* 21AC */,/*8621*/"LEFT RIGHT WAVE ARROW"/* 21AD */, /*8622*/"LEFT RIGHT ARROW WITH STROKE"/* 21AE */,/*8623*/"DOWNWARDS ZIGZAG ARROW"/* 21AF */, /*8624*/"UPWARDS ARROW WITH TIP LEFTWARDS"/* 21B0 */,/*8625*/"UPWARDS ARROW WITH TIP RIGHTWARDS"/* 21B1 */, /*8626*/"DOWNWARDS ARROW WITH TIP LEFTWARDS"/* 21B2 */,/*8627*/"DOWNWARDS ARROW WITH TIP RIGHTWARDS"/* 21B3 */, /*8628*/"RIGHTWARDS ARROW WITH CORNER DOWNWARDS"/* 21B4 */,/*8629*/"DOWNWARDS ARROW WITH CORNER LEFTWARDS"/* 21B5 */, /*8630*/"ANTICLOCKWISE TOP SEMICIRCLE ARROW"/* 21B6 */,/*8631*/"CLOCKWISE TOP SEMICIRCLE ARROW"/* 21B7 */, /*8632*/"NORTH WEST ARROW TO LONG BAR"/* 21B8 */,/*8633*/"LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR"/* 21B9 */, /*8634*/"ANTICLOCKWISE OPEN CIRCLE ARROW"/* 21BA */,/*8635*/"CLOCKWISE OPEN CIRCLE ARROW"/* 21BB */, /*8636*/"LEFTWARDS HARPOON WITH BARB UPWARDS"/* 21BC */,/*8637*/"LEFTWARDS HARPOON WITH BARB DOWNWARDS"/* 21BD */, /*8638*/"UPWARDS HARPOON WITH BARB RIGHTWARDS"/* 21BE */,/*8639*/"UPWARDS HARPOON WITH BARB LEFTWARDS"/* 21BF */, /*8640*/"RIGHTWARDS HARPOON WITH BARB UPWARDS"/* 21C0 */,/*8641*/"RIGHTWARDS HARPOON WITH BARB DOWNWARDS"/* 21C1 */, /*8642*/"DOWNWARDS HARPOON WITH BARB RIGHTWARDS"/* 21C2 */,/*8643*/"DOWNWARDS HARPOON WITH BARB LEFTWARDS"/* 21C3 */, /*8644*/"RIGHTWARDS ARROW OVER LEFTWARDS ARROW"/* 21C4 */,/*8645*/"UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW"/* 21C5 */, /*8646*/"LEFTWARDS ARROW OVER RIGHTWARDS ARROW"/* 21C6 */,/*8647*/"LEFTWARDS PAIRED ARROWS"/* 21C7 */, /*8648*/"UPWARDS PAIRED ARROWS"/* 21C8 */,/*8649*/"RIGHTWARDS PAIRED ARROWS"/* 21C9 */, /*8650*/"DOWNWARDS PAIRED ARROWS"/* 21CA */,/*8651*/"LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON"/* 21CB */, /*8652*/"RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON"/* 21CC */,/*8653*/"LEFTWARDS DOUBLE ARROW WITH STROKE"/* 21CD */, /*8654*/"LEFT RIGHT DOUBLE ARROW WITH STROKE"/* 21CE */,/*8655*/"RIGHTWARDS DOUBLE ARROW WITH STROKE"/* 21CF */, /*8656*/"LEFTWARDS DOUBLE ARROW"/* 21D0 */,/*8657*/"UPWARDS DOUBLE ARROW"/* 21D1 */, /*8658*/"RIGHTWARDS DOUBLE ARROW"/* 21D2 */,/*8659*/"DOWNWARDS DOUBLE ARROW"/* 21D3 */, /*8660*/"LEFT RIGHT DOUBLE ARROW"/* 21D4 */,/*8661*/"UP DOWN DOUBLE ARROW"/* 21D5 */, /*8662*/"NORTH WEST DOUBLE ARROW"/* 21D6 */,/*8663*/"NORTH EAST DOUBLE ARROW"/* 21D7 */, /*8664*/"SOUTH EAST DOUBLE ARROW"/* 21D8 */,/*8665*/"SOUTH WEST DOUBLE ARROW"/* 21D9 */, /*8666*/"LEFTWARDS TRIPLE ARROW"/* 21DA */,/*8667*/"RIGHTWARDS TRIPLE ARROW"/* 21DB */, /*8668*/"LEFTWARDS SQUIGGLE ARROW"/* 21DC */,/*8669*/"RIGHTWARDS SQUIGGLE ARROW"/* 21DD */, /*8670*/"UPWARDS ARROW WITH DOUBLE STROKE"/* 21DE */,/*8671*/"DOWNWARDS ARROW WITH DOUBLE STROKE"/* 21DF */, /*8672*/"LEFTWARDS DASHED ARROW"/* 21E0 */,/*8673*/"UPWARDS DASHED ARROW"/* 21E1 */, /*8674*/"RIGHTWARDS DASHED ARROW"/* 21E2 */,/*8675*/"DOWNWARDS DASHED ARROW"/* 21E3 */, /*8676*/"LEFTWARDS ARROW TO BAR"/* 21E4 */,/*8677*/"RIGHTWARDS ARROW TO BAR"/* 21E5 */, /*8678*/"LEFTWARDS WHITE ARROW"/* 21E6 */,/*8679*/"UPWARDS WHITE ARROW"/* 21E7 */, /*8680*/"RIGHTWARDS WHITE ARROW"/* 21E8 */,/*8681*/"DOWNWARDS WHITE ARROW"/* 21E9 */, /*8682*/"UPWARDS WHITE ARROW FROM BAR"/* 21EA */,/*8683*/"UPWARDS WHITE ARROW ON PEDESTAL"/* 21EB */, /*8684*/"UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR"/* 21EC */, /*8685*/"UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR"/* 21ED */,/*8686*/"UPWARDS WHITE DOUBLE ARROW"/* 21EE */, /*8687*/"UPWARDS WHITE DOUBLE ARROW ON PEDESTAL"/* 21EF */,/*8688*/"RIGHTWARDS WHITE ARROW FROM WALL"/* 21F0 */, /*8689*/"NORTH WEST ARROW TO CORNER"/* 21F1 */,/*8690*/"SOUTH EAST ARROW TO CORNER"/* 21F2 */, /*8691*/"UP DOWN WHITE ARROW"/* 21F3 */,/*8692*/"RIGHT ARROW WITH SMALL CIRCLE"/* 21F4 */, /*8693*/"DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW"/* 21F5 */,/*8694*/"THREE RIGHTWARDS ARROWS"/* 21F6 */, /*8695*/"LEFTWARDS ARROW WITH VERTICAL STROKE"/* 21F7 */,/*8696*/"RIGHTWARDS ARROW WITH VERTICAL STROKE"/* 21F8 */, /*8697*/"LEFT RIGHT ARROW WITH VERTICAL STROKE"/* 21F9 */, /*8698*/"LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE"/* 21FA */, /*8699*/"RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE"/* 21FB */, /*8700*/"LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE"/* 21FC */,/*8701*/"LEFTWARDS OPEN-HEADED ARROW"/* 21FD */, /*8702*/"RIGHTWARDS OPEN-HEADED ARROW"/* 21FE */,/*8703*/"LEFT RIGHT OPEN-HEADED ARROW"/* 21FF */, /*8704*/"FOR ALL"/* 2200 */,/*8705*/"COMPLEMENT"/* 2201 */,/*8706*/"PARTIAL DIFFERENTIAL"/* 2202 */, /*8707*/"THERE EXISTS"/* 2203 */,/*8708*/"THERE DOES NOT EXIST"/* 2204 */,/*8709*/"EMPTY SET"/* 2205 */, /*8710*/"INCREMENT"/* 2206 */,/*8711*/"NABLA"/* 2207 */,/*8712*/"ELEMENT OF"/* 2208 */, /*8713*/"NOT AN ELEMENT OF"/* 2209 */,/*8714*/"SMALL ELEMENT OF"/* 220A */,/*8715*/"CONTAINS AS MEMBER"/* 220B */, /*8716*/"DOES NOT CONTAIN AS MEMBER"/* 220C */,/*8717*/"SMALL CONTAINS AS MEMBER"/* 220D */, /*8718*/"END OF PROOF"/* 220E */,/*8719*/"N-ARY PRODUCT"/* 220F */,/*8720*/"N-ARY COPRODUCT"/* 2210 */, /*8721*/"N-ARY SUMMATION"/* 2211 */,/*8722*/"MINUS SIGN"/* 2212 */,/*8723*/"MINUS-OR-PLUS SIGN"/* 2213 */, /*8724*/"DOT PLUS"/* 2214 */,/*8725*/"DIVISION SLASH"/* 2215 */,/*8726*/"SET MINUS"/* 2216 */, /*8727*/"ASTERISK OPERATOR"/* 2217 */,/*8728*/"RING OPERATOR"/* 2218 */,/*8729*/"BULLET OPERATOR"/* 2219 */, /*8730*/"SQUARE ROOT"/* 221A */,/*8731*/"CUBE ROOT"/* 221B */,/*8732*/"FOURTH ROOT"/* 221C */, /*8733*/"PROPORTIONAL TO"/* 221D */,/*8734*/"INFINITY"/* 221E */,/*8735*/"RIGHT ANGLE"/* 221F */, /*8736*/"ANGLE"/* 2220 */,/*8737*/"MEASURED ANGLE"/* 2221 */,/*8738*/"SPHERICAL ANGLE"/* 2222 */, /*8739*/"DIVIDES"/* 2223 */,/*8740*/"DOES NOT DIVIDE"/* 2224 */,/*8741*/"PARALLEL TO"/* 2225 */, /*8742*/"NOT PARALLEL TO"/* 2226 */,/*8743*/"LOGICAL AND"/* 2227 */,/*8744*/"LOGICAL OR"/* 2228 */, /*8745*/"INTERSECTION"/* 2229 */,/*8746*/"UNION"/* 222A */,/*8747*/"INTEGRAL"/* 222B */, /*8748*/"DOUBLE INTEGRAL"/* 222C */,/*8749*/"TRIPLE INTEGRAL"/* 222D */,/*8750*/"CONTOUR INTEGRAL"/* 222E */, /*8751*/"SURFACE INTEGRAL"/* 222F */,/*8752*/"VOLUME INTEGRAL"/* 2230 */,/*8753*/"CLOCKWISE INTEGRAL"/* 2231 */, /*8754*/"CLOCKWISE CONTOUR INTEGRAL"/* 2232 */,/*8755*/"ANTICLOCKWISE CONTOUR INTEGRAL"/* 2233 */, /*8756*/"THEREFORE"/* 2234 */,/*8757*/"BECAUSE"/* 2235 */,/*8758*/"RATIO"/* 2236 */,/*8759*/"PROPORTION"/* 2237 */, /*8760*/"DOT MINUS"/* 2238 */,/*8761*/"EXCESS"/* 2239 */,/*8762*/"GEOMETRIC PROPORTION"/* 223A */, /*8763*/"HOMOTHETIC"/* 223B */,/*8764*/"TILDE OPERATOR"/* 223C */,/*8765*/"REVERSED TILDE"/* 223D */, /*8766*/"INVERTED LAZY S"/* 223E */,/*8767*/"SINE WAVE"/* 223F */,/*8768*/"WREATH PRODUCT"/* 2240 */, /*8769*/"NOT TILDE"/* 2241 */,/*8770*/"MINUS TILDE"/* 2242 */,/*8771*/"ASYMPTOTICALLY EQUAL TO"/* 2243 */, /*8772*/"NOT ASYMPTOTICALLY EQUAL TO"/* 2244 */,/*8773*/"APPROXIMATELY EQUAL TO"/* 2245 */, /*8774*/"APPROXIMATELY BUT NOT ACTUALLY EQUAL TO"/* 2246 */, /*8775*/"NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO"/* 2247 */,/*8776*/"ALMOST EQUAL TO"/* 2248 */, /*8777*/"NOT ALMOST EQUAL TO"/* 2249 */,/*8778*/"ALMOST EQUAL OR EQUAL TO"/* 224A */,/*8779*/"TRIPLE TILDE"/* 224B */, /*8780*/"ALL EQUAL TO"/* 224C */,/*8781*/"EQUIVALENT TO"/* 224D */,/*8782*/"GEOMETRICALLY EQUIVALENT TO"/* 224E */, /*8783*/"DIFFERENCE BETWEEN"/* 224F */,/*8784*/"APPROACHES THE LIMIT"/* 2250 */, /*8785*/"GEOMETRICALLY EQUAL TO"/* 2251 */,/*8786*/"APPROXIMATELY EQUAL TO OR THE IMAGE OF"/* 2252 */, /*8787*/"IMAGE OF OR APPROXIMATELY EQUAL TO"/* 2253 */,/*8788*/"COLON EQUALS"/* 2254 */,/*8789*/"EQUALS COLON"/* 2255 */, /*8790*/"RING IN EQUAL TO"/* 2256 */,/*8791*/"RING EQUAL TO"/* 2257 */,/*8792*/"CORRESPONDS TO"/* 2258 */, /*8793*/"ESTIMATES"/* 2259 */,/*8794*/"EQUIANGULAR TO"/* 225A */,/*8795*/"STAR EQUALS"/* 225B */, /*8796*/"DELTA EQUAL TO"/* 225C */,/*8797*/"EQUAL TO BY DEFINITION"/* 225D */,/*8798*/"MEASURED BY"/* 225E */, /*8799*/"QUESTIONED EQUAL TO"/* 225F */,/*8800*/"NOT EQUAL TO"/* 2260 */,/*8801*/"IDENTICAL TO"/* 2261 */, /*8802*/"NOT IDENTICAL TO"/* 2262 */,/*8803*/"STRICTLY EQUIVALENT TO"/* 2263 */, /*8804*/"LESS-THAN OR EQUAL TO"/* 2264 */,/*8805*/"GREATER-THAN OR EQUAL TO"/* 2265 */, /*8806*/"LESS-THAN OVER EQUAL TO"/* 2266 */,/*8807*/"GREATER-THAN OVER EQUAL TO"/* 2267 */, /*8808*/"LESS-THAN BUT NOT EQUAL TO"/* 2268 */,/*8809*/"GREATER-THAN BUT NOT EQUAL TO"/* 2269 */, /*8810*/"MUCH LESS-THAN"/* 226A */,/*8811*/"MUCH GREATER-THAN"/* 226B */,/*8812*/"BETWEEN"/* 226C */, /*8813*/"NOT EQUIVALENT TO"/* 226D */,/*8814*/"NOT LESS-THAN"/* 226E */,/*8815*/"NOT GREATER-THAN"/* 226F */, /*8816*/"NEITHER LESS-THAN NOR EQUAL TO"/* 2270 */,/*8817*/"NEITHER GREATER-THAN NOR EQUAL TO"/* 2271 */, /*8818*/"LESS-THAN OR EQUIVALENT TO"/* 2272 */,/*8819*/"GREATER-THAN OR EQUIVALENT TO"/* 2273 */, /*8820*/"NEITHER LESS-THAN NOR EQUIVALENT TO"/* 2274 */,/*8821*/"NEITHER GREATER-THAN NOR EQUIVALENT TO"/* 2275 */, /*8822*/"LESS-THAN OR GREATER-THAN"/* 2276 */,/*8823*/"GREATER-THAN OR LESS-THAN"/* 2277 */, /*8824*/"NEITHER LESS-THAN NOR GREATER-THAN"/* 2278 */,/*8825*/"NEITHER GREATER-THAN NOR LESS-THAN"/* 2279 */, /*8826*/"PRECEDES"/* 227A */,/*8827*/"SUCCEEDS"/* 227B */,/*8828*/"PRECEDES OR EQUAL TO"/* 227C */, /*8829*/"SUCCEEDS OR EQUAL TO"/* 227D */,/*8830*/"PRECEDES OR EQUIVALENT TO"/* 227E */, /*8831*/"SUCCEEDS OR EQUIVALENT TO"/* 227F */,/*8832*/"DOES NOT PRECEDE"/* 2280 */,/*8833*/"DOES NOT SUCCEED"/* 2281 */, /*8834*/"SUBSET OF"/* 2282 */,/*8835*/"SUPERSET OF"/* 2283 */,/*8836*/"NOT A SUBSET OF"/* 2284 */, /*8837*/"NOT A SUPERSET OF"/* 2285 */,/*8838*/"SUBSET OF OR EQUAL TO"/* 2286 */, /*8839*/"SUPERSET OF OR EQUAL TO"/* 2287 */,/*8840*/"NEITHER A SUBSET OF NOR EQUAL TO"/* 2288 */, /*8841*/"NEITHER A SUPERSET OF NOR EQUAL TO"/* 2289 */,/*8842*/"SUBSET OF WITH NOT EQUAL TO"/* 228A */, /*8843*/"SUPERSET OF WITH NOT EQUAL TO"/* 228B */,/*8844*/"MULTISET"/* 228C */, /*8845*/"MULTISET MULTIPLICATION"/* 228D */,/*8846*/"MULTISET UNION"/* 228E */,/*8847*/"SQUARE IMAGE OF"/* 228F */, /*8848*/"SQUARE ORIGINAL OF"/* 2290 */,/*8849*/"SQUARE IMAGE OF OR EQUAL TO"/* 2291 */, /*8850*/"SQUARE ORIGINAL OF OR EQUAL TO"/* 2292 */,/*8851*/"SQUARE CAP"/* 2293 */,/*8852*/"SQUARE CUP"/* 2294 */, /*8853*/"CIRCLED PLUS"/* 2295 */,/*8854*/"CIRCLED MINUS"/* 2296 */,/*8855*/"CIRCLED TIMES"/* 2297 */, /*8856*/"CIRCLED DIVISION SLASH"/* 2298 */,/*8857*/"CIRCLED DOT OPERATOR"/* 2299 */, /*8858*/"CIRCLED RING OPERATOR"/* 229A */,/*8859*/"CIRCLED ASTERISK OPERATOR"/* 229B */, /*8860*/"CIRCLED EQUALS"/* 229C */,/*8861*/"CIRCLED DASH"/* 229D */,/*8862*/"SQUARED PLUS"/* 229E */, /*8863*/"SQUARED MINUS"/* 229F */,/*8864*/"SQUARED TIMES"/* 22A0 */,/*8865*/"SQUARED DOT OPERATOR"/* 22A1 */, /*8866*/"RIGHT TACK"/* 22A2 */,/*8867*/"LEFT TACK"/* 22A3 */,/*8868*/"DOWN TACK"/* 22A4 */,/*8869*/"UP TACK"/* 22A5 */, /*8870*/"ASSERTION"/* 22A6 */,/*8871*/"MODELS"/* 22A7 */,/*8872*/"TRUE"/* 22A8 */,/*8873*/"FORCES"/* 22A9 */, /*8874*/"TRIPLE VERTICAL BAR RIGHT TURNSTILE"/* 22AA */,/*8875*/"DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE"/* 22AB */, /*8876*/"DOES NOT PROVE"/* 22AC */,/*8877*/"NOT TRUE"/* 22AD */,/*8878*/"DOES NOT FORCE"/* 22AE */, /*8879*/"NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE"/* 22AF */,/*8880*/"PRECEDES UNDER RELATION"/* 22B0 */, /*8881*/"SUCCEEDS UNDER RELATION"/* 22B1 */,/*8882*/"NORMAL SUBGROUP OF"/* 22B2 */, /*8883*/"CONTAINS AS NORMAL SUBGROUP"/* 22B3 */,/*8884*/"NORMAL SUBGROUP OF OR EQUAL TO"/* 22B4 */, /*8885*/"CONTAINS AS NORMAL SUBGROUP OR EQUAL TO"/* 22B5 */,/*8886*/"ORIGINAL OF"/* 22B6 */,/*8887*/"IMAGE OF"/* 22B7 */, /*8888*/"MULTIMAP"/* 22B8 */,/*8889*/"HERMITIAN CONJUGATE MATRIX"/* 22B9 */,/*8890*/"INTERCALATE"/* 22BA */, /*8891*/"XOR"/* 22BB */,/*8892*/"NAND"/* 22BC */,/*8893*/"NOR"/* 22BD */,/*8894*/"RIGHT ANGLE WITH ARC"/* 22BE */, /*8895*/"RIGHT TRIANGLE"/* 22BF */,/*8896*/"N-ARY LOGICAL AND"/* 22C0 */,/*8897*/"N-ARY LOGICAL OR"/* 22C1 */, /*8898*/"N-ARY INTERSECTION"/* 22C2 */,/*8899*/"N-ARY UNION"/* 22C3 */,/*8900*/"DIAMOND OPERATOR"/* 22C4 */, /*8901*/"DOT OPERATOR"/* 22C5 */,/*8902*/"STAR OPERATOR"/* 22C6 */,/*8903*/"DIVISION TIMES"/* 22C7 */, /*8904*/"BOWTIE"/* 22C8 */,/*8905*/"LEFT NORMAL FACTOR SEMIDIRECT PRODUCT"/* 22C9 */, /*8906*/"RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT"/* 22CA */,/*8907*/"LEFT SEMIDIRECT PRODUCT"/* 22CB */, /*8908*/"RIGHT SEMIDIRECT PRODUCT"/* 22CC */,/*8909*/"REVERSED TILDE EQUALS"/* 22CD */, /*8910*/"CURLY LOGICAL OR"/* 22CE */,/*8911*/"CURLY LOGICAL AND"/* 22CF */,/*8912*/"DOUBLE SUBSET"/* 22D0 */, /*8913*/"DOUBLE SUPERSET"/* 22D1 */,/*8914*/"DOUBLE INTERSECTION"/* 22D2 */,/*8915*/"DOUBLE UNION"/* 22D3 */, /*8916*/"PITCHFORK"/* 22D4 */,/*8917*/"EQUAL AND PARALLEL TO"/* 22D5 */,/*8918*/"LESS-THAN WITH DOT"/* 22D6 */, /*8919*/"GREATER-THAN WITH DOT"/* 22D7 */,/*8920*/"VERY MUCH LESS-THAN"/* 22D8 */, /*8921*/"VERY MUCH GREATER-THAN"/* 22D9 */,/*8922*/"LESS-THAN EQUAL TO OR GREATER-THAN"/* 22DA */, /*8923*/"GREATER-THAN EQUAL TO OR LESS-THAN"/* 22DB */,/*8924*/"EQUAL TO OR LESS-THAN"/* 22DC */, /*8925*/"EQUAL TO OR GREATER-THAN"/* 22DD */,/*8926*/"EQUAL TO OR PRECEDES"/* 22DE */, /*8927*/"EQUAL TO OR SUCCEEDS"/* 22DF */,/*8928*/"DOES NOT PRECEDE OR EQUAL"/* 22E0 */, /*8929*/"DOES NOT SUCCEED OR EQUAL"/* 22E1 */,/*8930*/"NOT SQUARE IMAGE OF OR EQUAL TO"/* 22E2 */, /*8931*/"NOT SQUARE ORIGINAL OF OR EQUAL TO"/* 22E3 */,/*8932*/"SQUARE IMAGE OF OR NOT EQUAL TO"/* 22E4 */, /*8933*/"SQUARE ORIGINAL OF OR NOT EQUAL TO"/* 22E5 */,/*8934*/"LESS-THAN BUT NOT EQUIVALENT TO"/* 22E6 */, /*8935*/"GREATER-THAN BUT NOT EQUIVALENT TO"/* 22E7 */,/*8936*/"PRECEDES BUT NOT EQUIVALENT TO"/* 22E8 */, /*8937*/"SUCCEEDS BUT NOT EQUIVALENT TO"/* 22E9 */,/*8938*/"NOT NORMAL SUBGROUP OF"/* 22EA */, /*8939*/"DOES NOT CONTAIN AS NORMAL SUBGROUP"/* 22EB */,/*8940*/"NOT NORMAL SUBGROUP OF OR EQUAL TO"/* 22EC */, /*8941*/"DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL"/* 22ED */,/*8942*/"VERTICAL ELLIPSIS"/* 22EE */, /*8943*/"MIDLINE HORIZONTAL ELLIPSIS"/* 22EF */,/*8944*/"UP RIGHT DIAGONAL ELLIPSIS"/* 22F0 */, /*8945*/"DOWN RIGHT DIAGONAL ELLIPSIS"/* 22F1 */,/*8946*/"ELEMENT OF WITH LONG HORIZONTAL STROKE"/* 22F2 */, /*8947*/"ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE"/* 22F3 */, /*8948*/"SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE"/* 22F4 */, /*8949*/"ELEMENT OF WITH DOT ABOVE"/* 22F5 */,/*8950*/"ELEMENT OF WITH OVERBAR"/* 22F6 */, /*8951*/"SMALL ELEMENT OF WITH OVERBAR"/* 22F7 */,/*8952*/"ELEMENT OF WITH UNDERBAR"/* 22F8 */, /*8953*/"ELEMENT OF WITH TWO HORIZONTAL STROKES"/* 22F9 */,/*8954*/"CONTAINS WITH LONG HORIZONTAL STROKE"/* 22FA */, /*8955*/"CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE"/* 22FB */, /*8956*/"SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE"/* 22FC */, /*8957*/"CONTAINS WITH OVERBAR"/* 22FD */,/*8958*/"SMALL CONTAINS WITH OVERBAR"/* 22FE */, /*8959*/"Z NOTATION BAG MEMBERSHIP"/* 22FF */,/*8960*/"DIAMETER SIGN"/* 2300 */,/*8961*/"ELECTRIC ARROW"/* 2301 */, /*8962*/"HOUSE"/* 2302 */,/*8963*/"UP ARROWHEAD"/* 2303 */,/*8964*/"DOWN ARROWHEAD"/* 2304 */, /*8965*/"PROJECTIVE"/* 2305 */,/*8966*/"PERSPECTIVE"/* 2306 */,/*8967*/"WAVY LINE"/* 2307 */, /*8968*/"LEFT CEILING"/* 2308 */,/*8969*/"RIGHT CEILING"/* 2309 */,/*8970*/"LEFT FLOOR"/* 230A */, /*8971*/"RIGHT FLOOR"/* 230B */,/*8972*/"BOTTOM RIGHT CROP"/* 230C */,/*8973*/"BOTTOM LEFT CROP"/* 230D */, /*8974*/"TOP RIGHT CROP"/* 230E */,/*8975*/"TOP LEFT CROP"/* 230F */,/*8976*/"REVERSED NOT SIGN"/* 2310 */, /*8977*/"SQUARE LOZENGE"/* 2311 */,/*8978*/"ARC"/* 2312 */,/*8979*/"SEGMENT"/* 2313 */,/*8980*/"SECTOR"/* 2314 */, /*8981*/"TELEPHONE RECORDER"/* 2315 */,/*8982*/"POSITION INDICATOR"/* 2316 */,/*8983*/"VIEWDATA SQUARE"/* 2317 */, /*8984*/"PLACE OF INTEREST SIGN"/* 2318 */,/*8985*/"TURNED NOT SIGN"/* 2319 */,/*8986*/"WATCH"/* 231A */, /*8987*/"HOURGLASS"/* 231B */,/*8988*/"TOP LEFT CORNER"/* 231C */,/*8989*/"TOP RIGHT CORNER"/* 231D */, /*8990*/"BOTTOM LEFT CORNER"/* 231E */,/*8991*/"BOTTOM RIGHT CORNER"/* 231F */,/*8992*/"TOP HALF INTEGRAL"/* 2320 */, /*8993*/"BOTTOM HALF INTEGRAL"/* 2321 */,/*8994*/"FROWN"/* 2322 */,/*8995*/"SMILE"/* 2323 */, /*8996*/"UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS"/* 2324 */,/*8997*/"OPTION KEY"/* 2325 */, /*8998*/"ERASE TO THE RIGHT"/* 2326 */,/*8999*/"X IN A RECTANGLE BOX"/* 2327 */,/*9000*/"KEYBOARD"/* 2328 */, /*9001*/"LEFT-POINTING ANGLE BRACKET"/* 2329 */,/*9002*/"RIGHT-POINTING ANGLE BRACKET"/* 232A */, /*9003*/"ERASE TO THE LEFT"/* 232B */,/*9004*/"BENZENE RING"/* 232C */,/*9005*/"CYLINDRICITY"/* 232D */, /*9006*/"ALL AROUND-PROFILE"/* 232E */,/*9007*/"SYMMETRY"/* 232F */,/*9008*/"TOTAL RUNOUT"/* 2330 */, /*9009*/"DIMENSION ORIGIN"/* 2331 */,/*9010*/"CONICAL TAPER"/* 2332 */,/*9011*/"SLOPE"/* 2333 */, /*9012*/"COUNTERBORE"/* 2334 */,/*9013*/"COUNTERSINK"/* 2335 */,/*9014*/"APL FUNCTIONAL SYMBOL I-BEAM"/* 2336 */, /*9015*/"APL FUNCTIONAL SYMBOL SQUISH QUAD"/* 2337 */,/*9016*/"APL FUNCTIONAL SYMBOL QUAD EQUAL"/* 2338 */, /*9017*/"APL FUNCTIONAL SYMBOL QUAD DIVIDE"/* 2339 */,/*9018*/"APL FUNCTIONAL SYMBOL QUAD DIAMOND"/* 233A */, /*9019*/"APL FUNCTIONAL SYMBOL QUAD JOT"/* 233B */,/*9020*/"APL FUNCTIONAL SYMBOL QUAD CIRCLE"/* 233C */, /*9021*/"APL FUNCTIONAL SYMBOL CIRCLE STILE"/* 233D */,/*9022*/"APL FUNCTIONAL SYMBOL CIRCLE JOT"/* 233E */, /*9023*/"APL FUNCTIONAL SYMBOL SLASH BAR"/* 233F */,/*9024*/"APL FUNCTIONAL SYMBOL BACKSLASH BAR"/* 2340 */, /*9025*/"APL FUNCTIONAL SYMBOL QUAD SLASH"/* 2341 */,/*9026*/"APL FUNCTIONAL SYMBOL QUAD BACKSLASH"/* 2342 */, /*9027*/"APL FUNCTIONAL SYMBOL QUAD LESS-THAN"/* 2343 */,/*9028*/"APL FUNCTIONAL SYMBOL QUAD GREATER-THAN"/* 2344 */, /*9029*/"APL FUNCTIONAL SYMBOL LEFTWARDS VANE"/* 2345 */,/*9030*/"APL FUNCTIONAL SYMBOL RIGHTWARDS VANE"/* 2346 */, /*9031*/"APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW"/* 2347 */, /*9032*/"APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW"/* 2348 */, /*9033*/"APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH"/* 2349 */,/*9034*/"APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR"/* 234A */, /*9035*/"APL FUNCTIONAL SYMBOL DELTA STILE"/* 234B */,/*9036*/"APL FUNCTIONAL SYMBOL QUAD DOWN CARET"/* 234C */, /*9037*/"APL FUNCTIONAL SYMBOL QUAD DELTA"/* 234D */,/*9038*/"APL FUNCTIONAL SYMBOL DOWN TACK JOT"/* 234E */, /*9039*/"APL FUNCTIONAL SYMBOL UPWARDS VANE"/* 234F */,/*9040*/"APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW"/* 2350 */, /*9041*/"APL FUNCTIONAL SYMBOL UP TACK OVERBAR"/* 2351 */,/*9042*/"APL FUNCTIONAL SYMBOL DEL STILE"/* 2352 */, /*9043*/"APL FUNCTIONAL SYMBOL QUAD UP CARET"/* 2353 */,/*9044*/"APL FUNCTIONAL SYMBOL QUAD DEL"/* 2354 */, /*9045*/"APL FUNCTIONAL SYMBOL UP TACK JOT"/* 2355 */,/*9046*/"APL FUNCTIONAL SYMBOL DOWNWARDS VANE"/* 2356 */, /*9047*/"APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW"/* 2357 */,/*9048*/"APL FUNCTIONAL SYMBOL QUOTE UNDERBAR"/* 2358 */, /*9049*/"APL FUNCTIONAL SYMBOL DELTA UNDERBAR"/* 2359 */,/*9050*/"APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR"/* 235A */, /*9051*/"APL FUNCTIONAL SYMBOL JOT UNDERBAR"/* 235B */,/*9052*/"APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR"/* 235C */, /*9053*/"APL FUNCTIONAL SYMBOL UP SHOE JOT"/* 235D */,/*9054*/"APL FUNCTIONAL SYMBOL QUOTE QUAD"/* 235E */, /*9055*/"APL FUNCTIONAL SYMBOL CIRCLE STAR"/* 235F */,/*9056*/"APL FUNCTIONAL SYMBOL QUAD COLON"/* 2360 */, /*9057*/"APL FUNCTIONAL SYMBOL UP TACK DIAERESIS"/* 2361 */,/*9058*/"APL FUNCTIONAL SYMBOL DEL DIAERESIS"/* 2362 */, /*9059*/"APL FUNCTIONAL SYMBOL STAR DIAERESIS"/* 2363 */,/*9060*/"APL FUNCTIONAL SYMBOL JOT DIAERESIS"/* 2364 */, /*9061*/"APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS"/* 2365 */,/*9062*/"APL FUNCTIONAL SYMBOL DOWN SHOE STILE"/* 2366 */, /*9063*/"APL FUNCTIONAL SYMBOL LEFT SHOE STILE"/* 2367 */,/*9064*/"APL FUNCTIONAL SYMBOL TILDE DIAERESIS"/* 2368 */, /*9065*/"APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS"/* 2369 */,/*9066*/"APL FUNCTIONAL SYMBOL COMMA BAR"/* 236A */, /*9067*/"APL FUNCTIONAL SYMBOL DEL TILDE"/* 236B */,/*9068*/"APL FUNCTIONAL SYMBOL ZILDE"/* 236C */, /*9069*/"APL FUNCTIONAL SYMBOL STILE TILDE"/* 236D */,/*9070*/"APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR"/* 236E */, /*9071*/"APL FUNCTIONAL SYMBOL QUAD NOT EQUAL"/* 236F */,/*9072*/"APL FUNCTIONAL SYMBOL QUAD QUESTION"/* 2370 */, /*9073*/"APL FUNCTIONAL SYMBOL DOWN CARET TILDE"/* 2371 */,/*9074*/"APL FUNCTIONAL SYMBOL UP CARET TILDE"/* 2372 */, /*9075*/"APL FUNCTIONAL SYMBOL IOTA"/* 2373 */,/*9076*/"APL FUNCTIONAL SYMBOL RHO"/* 2374 */, /*9077*/"APL FUNCTIONAL SYMBOL OMEGA"/* 2375 */,/*9078*/"APL FUNCTIONAL SYMBOL ALPHA UNDERBAR"/* 2376 */, /*9079*/"APL FUNCTIONAL SYMBOL EPSILON UNDERBAR"/* 2377 */,/*9080*/"APL FUNCTIONAL SYMBOL IOTA UNDERBAR"/* 2378 */, /*9081*/"APL FUNCTIONAL SYMBOL OMEGA UNDERBAR"/* 2379 */,/*9082*/"APL FUNCTIONAL SYMBOL ALPHA"/* 237A */, /*9083*/"NOT CHECK MARK"/* 237B */,/*9084*/"RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW"/* 237C */, /*9085*/"SHOULDERED OPEN BOX"/* 237D */,/*9086*/"BELL SYMBOL"/* 237E */, /*9087*/"VERTICAL LINE WITH MIDDLE DOT"/* 237F */,/*9088*/"INSERTION SYMBOL"/* 2380 */, /*9089*/"CONTINUOUS UNDERLINE SYMBOL"/* 2381 */,/*9090*/"DISCONTINUOUS UNDERLINE SYMBOL"/* 2382 */, /*9091*/"EMPHASIS SYMBOL"/* 2383 */,/*9092*/"COMPOSITION SYMBOL"/* 2384 */, /*9093*/"WHITE SQUARE WITH CENTRE VERTICAL LINE"/* 2385 */,/*9094*/"ENTER SYMBOL"/* 2386 */, /*9095*/"ALTERNATIVE KEY SYMBOL"/* 2387 */,/*9096*/"HELM SYMBOL"/* 2388 */, /*9097*/"CIRCLED HORIZONTAL BAR WITH NOTCH"/* 2389 */,/*9098*/"CIRCLED TRIANGLE DOWN"/* 238A */, /*9099*/"BROKEN CIRCLE WITH NORTHWEST ARROW"/* 238B */,/*9100*/"UNDO SYMBOL"/* 238C */, /*9101*/"MONOSTABLE SYMBOL"/* 238D */,/*9102*/"HYSTERESIS SYMBOL"/* 238E */, /*9103*/"OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL"/* 238F */,/*9104*/"OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL"/* 2390 */, /*9105*/"PASSIVE-PULL-DOWN-OUTPUT SYMBOL"/* 2391 */,/*9106*/"PASSIVE-PULL-UP-OUTPUT SYMBOL"/* 2392 */, /*9107*/"DIRECT CURRENT SYMBOL FORM TWO"/* 2393 */,/*9108*/"SOFTWARE-FUNCTION SYMBOL"/* 2394 */, /*9109*/"APL FUNCTIONAL SYMBOL QUAD"/* 2395 */,/*9110*/"DECIMAL SEPARATOR KEY SYMBOL"/* 2396 */, /*9111*/"PREVIOUS PAGE"/* 2397 */,/*9112*/"NEXT PAGE"/* 2398 */,/*9113*/"PRINT SCREEN SYMBOL"/* 2399 */, /*9114*/"CLEAR SCREEN SYMBOL"/* 239A */,/*9115*/"LEFT PARENTHESIS UPPER HOOK"/* 239B */, /*9116*/"LEFT PARENTHESIS EXTENSION"/* 239C */,/*9117*/"LEFT PARENTHESIS LOWER HOOK"/* 239D */, /*9118*/"RIGHT PARENTHESIS UPPER HOOK"/* 239E */,/*9119*/"RIGHT PARENTHESIS EXTENSION"/* 239F */, /*9120*/"RIGHT PARENTHESIS LOWER HOOK"/* 23A0 */,/*9121*/"LEFT SQUARE BRACKET UPPER CORNER"/* 23A1 */, /*9122*/"LEFT SQUARE BRACKET EXTENSION"/* 23A2 */,/*9123*/"LEFT SQUARE BRACKET LOWER CORNER"/* 23A3 */, /*9124*/"RIGHT SQUARE BRACKET UPPER CORNER"/* 23A4 */,/*9125*/"RIGHT SQUARE BRACKET EXTENSION"/* 23A5 */, /*9126*/"RIGHT SQUARE BRACKET LOWER CORNER"/* 23A6 */,/*9127*/"LEFT CURLY BRACKET UPPER HOOK"/* 23A7 */, /*9128*/"LEFT CURLY BRACKET MIDDLE PIECE"/* 23A8 */,/*9129*/"LEFT CURLY BRACKET LOWER HOOK"/* 23A9 */, /*9130*/"CURLY BRACKET EXTENSION"/* 23AA */,/*9131*/"RIGHT CURLY BRACKET UPPER HOOK"/* 23AB */, /*9132*/"RIGHT CURLY BRACKET MIDDLE PIECE"/* 23AC */,/*9133*/"RIGHT CURLY BRACKET LOWER HOOK"/* 23AD */, /*9134*/"INTEGRAL EXTENSION"/* 23AE */,/*9135*/"HORIZONTAL LINE EXTENSION"/* 23AF */, /*9136*/"UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION"/* 23B0 */, /*9137*/"UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION"/* 23B1 */,/*9138*/"SUMMATION TOP"/* 23B2 */, /*9139*/"SUMMATION BOTTOM"/* 23B3 */,/*9140*/"TOP SQUARE BRACKET"/* 23B4 */,/*9141*/"BOTTOM SQUARE BRACKET"/* 23B5 */, /*9142*/"BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET"/* 23B6 */,/*9143*/"RADICAL SYMBOL BOTTOM"/* 23B7 */, /*9144*/"LEFT VERTICAL BOX LINE"/* 23B8 */,/*9145*/"RIGHT VERTICAL BOX LINE"/* 23B9 */, /*9146*/"HORIZONTAL SCAN LINE-1"/* 23BA */,/*9147*/"HORIZONTAL SCAN LINE-3"/* 23BB */, /*9148*/"HORIZONTAL SCAN LINE-7"/* 23BC */,/*9149*/"HORIZONTAL SCAN LINE-9"/* 23BD */, /*9150*/"DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT"/* 23BE */, /*9151*/"DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT"/* 23BF */, /*9152*/"DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE"/* 23C0 */, /*9153*/"DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE"/* 23C1 */, /*9154*/"DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE"/* 23C2 */, /*9155*/"DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE"/* 23C3 */, /*9156*/"DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE"/* 23C4 */, /*9157*/"DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE"/* 23C5 */, /*9158*/"DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE"/* 23C6 */, /*9159*/"DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE"/* 23C7 */, /*9160*/"DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE"/* 23C8 */, /*9161*/"DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL"/* 23C9 */, /*9162*/"DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL"/* 23CA */, /*9163*/"DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT"/* 23CB */, /*9164*/"DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT"/* 23CC */,/*9165*/"SQUARE FOOT"/* 23CD */, /*9166*/"RETURN SYMBOL"/* 23CE */,/*9167*/"EJECT SYMBOL"/* 23CF */,/*9168*/"VERTICAL LINE EXTENSION"/* 23D0 */, /*9169*/"METRICAL BREVE"/* 23D1 */,/*9170*/"METRICAL LONG OVER SHORT"/* 23D2 */, /*9171*/"METRICAL SHORT OVER LONG"/* 23D3 */,/*9172*/"METRICAL LONG OVER TWO SHORTS"/* 23D4 */, /*9173*/"METRICAL TWO SHORTS OVER LONG"/* 23D5 */,/*9174*/"METRICAL TWO SHORTS JOINED"/* 23D6 */, /*9175*/"METRICAL TRISEME"/* 23D7 */,/*9176*/"METRICAL TETRASEME"/* 23D8 */,/*9177*/"METRICAL PENTASEME"/* 23D9 */, /*9178*/"EARTH GROUND"/* 23DA */,/*9179*/"FUSE"/* 23DB */,/*9180*/"TOP PARENTHESIS"/* 23DC */, /*9181*/"BOTTOM PARENTHESIS"/* 23DD */,/*9182*/"TOP CURLY BRACKET"/* 23DE */,/*9183*/"BOTTOM CURLY BRACKET"/* 23DF */, /*9184*/"TOP TORTOISE SHELL BRACKET"/* 23E0 */,/*9185*/"BOTTOM TORTOISE SHELL BRACKET"/* 23E1 */, /*9186*/"WHITE TRAPEZIUM"/* 23E2 */,/*9187*/"BENZENE RING WITH CIRCLE"/* 23E3 */,/*9188*/"STRAIGHTNESS"/* 23E4 */, /*9189*/"FLATNESS"/* 23E5 */,/*9190*/"AC CURRENT"/* 23E6 */,/*9191*/"ELECTRICAL INTERSECTION"/* 23E7 */, /*9192*/"DECIMAL EXPONENT SYMBOL"/* 23E8 */,/*9193*/"BLACK RIGHT-POINTING DOUBLE TRIANGLE"/* 23E9 */, /*9194*/"BLACK LEFT-POINTING DOUBLE TRIANGLE"/* 23EA */,/*9195*/"BLACK UP-POINTING DOUBLE TRIANGLE"/* 23EB */, /*9196*/"BLACK DOWN-POINTING DOUBLE TRIANGLE"/* 23EC */, /*9197*/"BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR"/* 23ED */, /*9198*/"BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR"/* 23EE */, /*9199*/"BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR"/* 23EF */,/*9200*/"ALARM CLOCK"/* 23F0 */, /*9201*/"STOPWATCH"/* 23F1 */,/*9202*/"TIMER CLOCK"/* 23F2 */,/*9203*/"HOURGLASS WITH FLOWING SAND"/* 23F3 */, /*9204*/"BLACK MEDIUM LEFT-POINTING TRIANGLE"/* 23F4 */,/*9205*/"BLACK MEDIUM RIGHT-POINTING TRIANGLE"/* 23F5 */, /*9206*/"BLACK MEDIUM UP-POINTING TRIANGLE"/* 23F6 */,/*9207*/"BLACK MEDIUM DOWN-POINTING TRIANGLE"/* 23F7 */, /*9208*/"DOUBLE VERTICAL BAR"/* 23F8 */,/*9209*/"BLACK SQUARE FOR STOP"/* 23F9 */, /*9210*/"BLACK CIRCLE FOR RECORD"/* 23FA */,/*9211*/"POWER SYMBOL"/* 23FB */,/*9212*/"POWER ON-OFF SYMBOL"/* 23FC */, /*9213*/"POWER ON SYMBOL"/* 23FD */,/*9214*/"POWER SLEEP SYMBOL"/* 23FE */,/*9215*/"OBSERVER EYE SYMBOL"/* 23FF */, /*9216*/"SYMBOL FOR NULL"/* 2400 */,/*9217*/"SYMBOL FOR START OF HEADING"/* 2401 */, /*9218*/"SYMBOL FOR START OF TEXT"/* 2402 */,/*9219*/"SYMBOL FOR END OF TEXT"/* 2403 */, /*9220*/"SYMBOL FOR END OF TRANSMISSION"/* 2404 */,/*9221*/"SYMBOL FOR ENQUIRY"/* 2405 */, /*9222*/"SYMBOL FOR ACKNOWLEDGE"/* 2406 */,/*9223*/"SYMBOL FOR BELL"/* 2407 */,/*9224*/"SYMBOL FOR BACKSPACE"/* 2408 */, /*9225*/"SYMBOL FOR HORIZONTAL TABULATION"/* 2409 */,/*9226*/"SYMBOL FOR LINE FEED"/* 240A */, /*9227*/"SYMBOL FOR VERTICAL TABULATION"/* 240B */,/*9228*/"SYMBOL FOR FORM FEED"/* 240C */, /*9229*/"SYMBOL FOR CARRIAGE RETURN"/* 240D */,/*9230*/"SYMBOL FOR SHIFT OUT"/* 240E */, /*9231*/"SYMBOL FOR SHIFT IN"/* 240F */,/*9232*/"SYMBOL FOR DATA LINK ESCAPE"/* 2410 */, /*9233*/"SYMBOL FOR DEVICE CONTROL ONE"/* 2411 */,/*9234*/"SYMBOL FOR DEVICE CONTROL TWO"/* 2412 */, /*9235*/"SYMBOL FOR DEVICE CONTROL THREE"/* 2413 */,/*9236*/"SYMBOL FOR DEVICE CONTROL FOUR"/* 2414 */, /*9237*/"SYMBOL FOR NEGATIVE ACKNOWLEDGE"/* 2415 */,/*9238*/"SYMBOL FOR SYNCHRONOUS IDLE"/* 2416 */, /*9239*/"SYMBOL FOR END OF TRANSMISSION BLOCK"/* 2417 */,/*9240*/"SYMBOL FOR CANCEL"/* 2418 */, /*9241*/"SYMBOL FOR END OF MEDIUM"/* 2419 */,/*9242*/"SYMBOL FOR SUBSTITUTE"/* 241A */, /*9243*/"SYMBOL FOR ESCAPE"/* 241B */,/*9244*/"SYMBOL FOR FILE SEPARATOR"/* 241C */, /*9245*/"SYMBOL FOR GROUP SEPARATOR"/* 241D */,/*9246*/"SYMBOL FOR RECORD SEPARATOR"/* 241E */, /*9247*/"SYMBOL FOR UNIT SEPARATOR"/* 241F */,/*9248*/"SYMBOL FOR SPACE"/* 2420 */,/*9249*/"SYMBOL FOR DELETE"/* 2421 */, /*9250*/"BLANK SYMBOL"/* 2422 */,/*9251*/"OPEN BOX"/* 2423 */,/*9252*/"SYMBOL FOR NEWLINE"/* 2424 */, /*9253*/"SYMBOL FOR DELETE FORM TWO"/* 2425 */,/*9254*/"SYMBOL FOR SUBSTITUTE FORM TWO"/* 2426 */,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*9280*/"OCR HOOK"/* 2440 */,/*9281*/"OCR CHAIR"/* 2441 */,/*9282*/"OCR FORK"/* 2442 */, /*9283*/"OCR INVERTED FORK"/* 2443 */,/*9284*/"OCR BELT BUCKLE"/* 2444 */,/*9285*/"OCR BOW TIE"/* 2445 */, /*9286*/"OCR BRANCH BANK IDENTIFICATION"/* 2446 */,/*9287*/"OCR AMOUNT OF CHECK"/* 2447 */,/*9288*/"OCR DASH"/* 2448 */, /*9289*/"OCR CUSTOMER ACCOUNT NUMBER"/* 2449 */,/*9290*/"OCR DOUBLE BACKSLASH"/* 244A */,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*9312*/"CIRCLED DIGIT ONE"/* 2460 */, /*9313*/"CIRCLED DIGIT TWO"/* 2461 */,/*9314*/"CIRCLED DIGIT THREE"/* 2462 */,/*9315*/"CIRCLED DIGIT FOUR"/* 2463 */, /*9316*/"CIRCLED DIGIT FIVE"/* 2464 */,/*9317*/"CIRCLED DIGIT SIX"/* 2465 */,/*9318*/"CIRCLED DIGIT SEVEN"/* 2466 */, /*9319*/"CIRCLED DIGIT EIGHT"/* 2467 */,/*9320*/"CIRCLED DIGIT NINE"/* 2468 */,/*9321*/"CIRCLED NUMBER TEN"/* 2469 */, /*9322*/"CIRCLED NUMBER ELEVEN"/* 246A */,/*9323*/"CIRCLED NUMBER TWELVE"/* 246B */, /*9324*/"CIRCLED NUMBER THIRTEEN"/* 246C */,/*9325*/"CIRCLED NUMBER FOURTEEN"/* 246D */, /*9326*/"CIRCLED NUMBER FIFTEEN"/* 246E */,/*9327*/"CIRCLED NUMBER SIXTEEN"/* 246F */, /*9328*/"CIRCLED NUMBER SEVENTEEN"/* 2470 */,/*9329*/"CIRCLED NUMBER EIGHTEEN"/* 2471 */, /*9330*/"CIRCLED NUMBER NINETEEN"/* 2472 */,/*9331*/"CIRCLED NUMBER TWENTY"/* 2473 */, /*9332*/"PARENTHESIZED DIGIT ONE"/* 2474 */,/*9333*/"PARENTHESIZED DIGIT TWO"/* 2475 */, /*9334*/"PARENTHESIZED DIGIT THREE"/* 2476 */,/*9335*/"PARENTHESIZED DIGIT FOUR"/* 2477 */, /*9336*/"PARENTHESIZED DIGIT FIVE"/* 2478 */,/*9337*/"PARENTHESIZED DIGIT SIX"/* 2479 */, /*9338*/"PARENTHESIZED DIGIT SEVEN"/* 247A */,/*9339*/"PARENTHESIZED DIGIT EIGHT"/* 247B */, /*9340*/"PARENTHESIZED DIGIT NINE"/* 247C */,/*9341*/"PARENTHESIZED NUMBER TEN"/* 247D */, /*9342*/"PARENTHESIZED NUMBER ELEVEN"/* 247E */,/*9343*/"PARENTHESIZED NUMBER TWELVE"/* 247F */, /*9344*/"PARENTHESIZED NUMBER THIRTEEN"/* 2480 */,/*9345*/"PARENTHESIZED NUMBER FOURTEEN"/* 2481 */, /*9346*/"PARENTHESIZED NUMBER FIFTEEN"/* 2482 */,/*9347*/"PARENTHESIZED NUMBER SIXTEEN"/* 2483 */, /*9348*/"PARENTHESIZED NUMBER SEVENTEEN"/* 2484 */,/*9349*/"PARENTHESIZED NUMBER EIGHTEEN"/* 2485 */, /*9350*/"PARENTHESIZED NUMBER NINETEEN"/* 2486 */,/*9351*/"PARENTHESIZED NUMBER TWENTY"/* 2487 */, /*9352*/"DIGIT ONE FULL STOP"/* 2488 */,/*9353*/"DIGIT TWO FULL STOP"/* 2489 */, /*9354*/"DIGIT THREE FULL STOP"/* 248A */,/*9355*/"DIGIT FOUR FULL STOP"/* 248B */, /*9356*/"DIGIT FIVE FULL STOP"/* 248C */,/*9357*/"DIGIT SIX FULL STOP"/* 248D */, /*9358*/"DIGIT SEVEN FULL STOP"/* 248E */,/*9359*/"DIGIT EIGHT FULL STOP"/* 248F */, /*9360*/"DIGIT NINE FULL STOP"/* 2490 */,/*9361*/"NUMBER TEN FULL STOP"/* 2491 */, /*9362*/"NUMBER ELEVEN FULL STOP"/* 2492 */,/*9363*/"NUMBER TWELVE FULL STOP"/* 2493 */, /*9364*/"NUMBER THIRTEEN FULL STOP"/* 2494 */,/*9365*/"NUMBER FOURTEEN FULL STOP"/* 2495 */, /*9366*/"NUMBER FIFTEEN FULL STOP"/* 2496 */,/*9367*/"NUMBER SIXTEEN FULL STOP"/* 2497 */, /*9368*/"NUMBER SEVENTEEN FULL STOP"/* 2498 */,/*9369*/"NUMBER EIGHTEEN FULL STOP"/* 2499 */, /*9370*/"NUMBER NINETEEN FULL STOP"/* 249A */,/*9371*/"NUMBER TWENTY FULL STOP"/* 249B */, /*9372*/"PARENTHESIZED LATIN SMALL LETTER A"/* 249C */,/*9373*/"PARENTHESIZED LATIN SMALL LETTER B"/* 249D */, /*9374*/"PARENTHESIZED LATIN SMALL LETTER C"/* 249E */,/*9375*/"PARENTHESIZED LATIN SMALL LETTER D"/* 249F */, /*9376*/"PARENTHESIZED LATIN SMALL LETTER E"/* 24A0 */,/*9377*/"PARENTHESIZED LATIN SMALL LETTER F"/* 24A1 */, /*9378*/"PARENTHESIZED LATIN SMALL LETTER G"/* 24A2 */,/*9379*/"PARENTHESIZED LATIN SMALL LETTER H"/* 24A3 */, /*9380*/"PARENTHESIZED LATIN SMALL LETTER I"/* 24A4 */,/*9381*/"PARENTHESIZED LATIN SMALL LETTER J"/* 24A5 */, /*9382*/"PARENTHESIZED LATIN SMALL LETTER K"/* 24A6 */,/*9383*/"PARENTHESIZED LATIN SMALL LETTER L"/* 24A7 */, /*9384*/"PARENTHESIZED LATIN SMALL LETTER M"/* 24A8 */,/*9385*/"PARENTHESIZED LATIN SMALL LETTER N"/* 24A9 */, /*9386*/"PARENTHESIZED LATIN SMALL LETTER O"/* 24AA */,/*9387*/"PARENTHESIZED LATIN SMALL LETTER P"/* 24AB */, /*9388*/"PARENTHESIZED LATIN SMALL LETTER Q"/* 24AC */,/*9389*/"PARENTHESIZED LATIN SMALL LETTER R"/* 24AD */, /*9390*/"PARENTHESIZED LATIN SMALL LETTER S"/* 24AE */,/*9391*/"PARENTHESIZED LATIN SMALL LETTER T"/* 24AF */, /*9392*/"PARENTHESIZED LATIN SMALL LETTER U"/* 24B0 */,/*9393*/"PARENTHESIZED LATIN SMALL LETTER V"/* 24B1 */, /*9394*/"PARENTHESIZED LATIN SMALL LETTER W"/* 24B2 */,/*9395*/"PARENTHESIZED LATIN SMALL LETTER X"/* 24B3 */, /*9396*/"PARENTHESIZED LATIN SMALL LETTER Y"/* 24B4 */,/*9397*/"PARENTHESIZED LATIN SMALL LETTER Z"/* 24B5 */, /*9398*/"CIRCLED LATIN CAPITAL LETTER A"/* 24B6 */,/*9399*/"CIRCLED LATIN CAPITAL LETTER B"/* 24B7 */, /*9400*/"CIRCLED LATIN CAPITAL LETTER C"/* 24B8 */,/*9401*/"CIRCLED LATIN CAPITAL LETTER D"/* 24B9 */, /*9402*/"CIRCLED LATIN CAPITAL LETTER E"/* 24BA */,/*9403*/"CIRCLED LATIN CAPITAL LETTER F"/* 24BB */, /*9404*/"CIRCLED LATIN CAPITAL LETTER G"/* 24BC */,/*9405*/"CIRCLED LATIN CAPITAL LETTER H"/* 24BD */, /*9406*/"CIRCLED LATIN CAPITAL LETTER I"/* 24BE */,/*9407*/"CIRCLED LATIN CAPITAL LETTER J"/* 24BF */, /*9408*/"CIRCLED LATIN CAPITAL LETTER K"/* 24C0 */,/*9409*/"CIRCLED LATIN CAPITAL LETTER L"/* 24C1 */, /*9410*/"CIRCLED LATIN CAPITAL LETTER M"/* 24C2 */,/*9411*/"CIRCLED LATIN CAPITAL LETTER N"/* 24C3 */, /*9412*/"CIRCLED LATIN CAPITAL LETTER O"/* 24C4 */,/*9413*/"CIRCLED LATIN CAPITAL LETTER P"/* 24C5 */, /*9414*/"CIRCLED LATIN CAPITAL LETTER Q"/* 24C6 */,/*9415*/"CIRCLED LATIN CAPITAL LETTER R"/* 24C7 */, /*9416*/"CIRCLED LATIN CAPITAL LETTER S"/* 24C8 */,/*9417*/"CIRCLED LATIN CAPITAL LETTER T"/* 24C9 */, /*9418*/"CIRCLED LATIN CAPITAL LETTER U"/* 24CA */,/*9419*/"CIRCLED LATIN CAPITAL LETTER V"/* 24CB */, /*9420*/"CIRCLED LATIN CAPITAL LETTER W"/* 24CC */,/*9421*/"CIRCLED LATIN CAPITAL LETTER X"/* 24CD */, /*9422*/"CIRCLED LATIN CAPITAL LETTER Y"/* 24CE */,/*9423*/"CIRCLED LATIN CAPITAL LETTER Z"/* 24CF */, /*9424*/"CIRCLED LATIN SMALL LETTER A"/* 24D0 */,/*9425*/"CIRCLED LATIN SMALL LETTER B"/* 24D1 */, /*9426*/"CIRCLED LATIN SMALL LETTER C"/* 24D2 */,/*9427*/"CIRCLED LATIN SMALL LETTER D"/* 24D3 */, /*9428*/"CIRCLED LATIN SMALL LETTER E"/* 24D4 */,/*9429*/"CIRCLED LATIN SMALL LETTER F"/* 24D5 */, /*9430*/"CIRCLED LATIN SMALL LETTER G"/* 24D6 */,/*9431*/"CIRCLED LATIN SMALL LETTER H"/* 24D7 */, /*9432*/"CIRCLED LATIN SMALL LETTER I"/* 24D8 */,/*9433*/"CIRCLED LATIN SMALL LETTER J"/* 24D9 */, /*9434*/"CIRCLED LATIN SMALL LETTER K"/* 24DA */,/*9435*/"CIRCLED LATIN SMALL LETTER L"/* 24DB */, /*9436*/"CIRCLED LATIN SMALL LETTER M"/* 24DC */,/*9437*/"CIRCLED LATIN SMALL LETTER N"/* 24DD */, /*9438*/"CIRCLED LATIN SMALL LETTER O"/* 24DE */,/*9439*/"CIRCLED LATIN SMALL LETTER P"/* 24DF */, /*9440*/"CIRCLED LATIN SMALL LETTER Q"/* 24E0 */,/*9441*/"CIRCLED LATIN SMALL LETTER R"/* 24E1 */, /*9442*/"CIRCLED LATIN SMALL LETTER S"/* 24E2 */,/*9443*/"CIRCLED LATIN SMALL LETTER T"/* 24E3 */, /*9444*/"CIRCLED LATIN SMALL LETTER U"/* 24E4 */,/*9445*/"CIRCLED LATIN SMALL LETTER V"/* 24E5 */, /*9446*/"CIRCLED LATIN SMALL LETTER W"/* 24E6 */,/*9447*/"CIRCLED LATIN SMALL LETTER X"/* 24E7 */, /*9448*/"CIRCLED LATIN SMALL LETTER Y"/* 24E8 */,/*9449*/"CIRCLED LATIN SMALL LETTER Z"/* 24E9 */, /*9450*/"CIRCLED DIGIT ZERO"/* 24EA */,/*9451*/"NEGATIVE CIRCLED NUMBER ELEVEN"/* 24EB */, /*9452*/"NEGATIVE CIRCLED NUMBER TWELVE"/* 24EC */,/*9453*/"NEGATIVE CIRCLED NUMBER THIRTEEN"/* 24ED */, /*9454*/"NEGATIVE CIRCLED NUMBER FOURTEEN"/* 24EE */,/*9455*/"NEGATIVE CIRCLED NUMBER FIFTEEN"/* 24EF */, /*9456*/"NEGATIVE CIRCLED NUMBER SIXTEEN"/* 24F0 */,/*9457*/"NEGATIVE CIRCLED NUMBER SEVENTEEN"/* 24F1 */, /*9458*/"NEGATIVE CIRCLED NUMBER EIGHTEEN"/* 24F2 */,/*9459*/"NEGATIVE CIRCLED NUMBER NINETEEN"/* 24F3 */, /*9460*/"NEGATIVE CIRCLED NUMBER TWENTY"/* 24F4 */,/*9461*/"DOUBLE CIRCLED DIGIT ONE"/* 24F5 */, /*9462*/"DOUBLE CIRCLED DIGIT TWO"/* 24F6 */,/*9463*/"DOUBLE CIRCLED DIGIT THREE"/* 24F7 */, /*9464*/"DOUBLE CIRCLED DIGIT FOUR"/* 24F8 */,/*9465*/"DOUBLE CIRCLED DIGIT FIVE"/* 24F9 */, /*9466*/"DOUBLE CIRCLED DIGIT SIX"/* 24FA */,/*9467*/"DOUBLE CIRCLED DIGIT SEVEN"/* 24FB */, /*9468*/"DOUBLE CIRCLED DIGIT EIGHT"/* 24FC */,/*9469*/"DOUBLE CIRCLED DIGIT NINE"/* 24FD */, /*9470*/"DOUBLE CIRCLED NUMBER TEN"/* 24FE */,/*9471*/"NEGATIVE CIRCLED DIGIT ZERO"/* 24FF */, /*9472*/"BOX DRAWINGS LIGHT HORIZONTAL"/* 2500 */,/*9473*/"BOX DRAWINGS HEAVY HORIZONTAL"/* 2501 */, /*9474*/"BOX DRAWINGS LIGHT VERTICAL"/* 2502 */,/*9475*/"BOX DRAWINGS HEAVY VERTICAL"/* 2503 */, /*9476*/"BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL"/* 2504 */, /*9477*/"BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL"/* 2505 */, /*9478*/"BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL"/* 2506 */,/*9479*/"BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL"/* 2507 */, /*9480*/"BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL"/* 2508 */, /*9481*/"BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL"/* 2509 */, /*9482*/"BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL"/* 250A */, /*9483*/"BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL"/* 250B */,/*9484*/"BOX DRAWINGS LIGHT DOWN AND RIGHT"/* 250C */, /*9485*/"BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY"/* 250D */,/*9486*/"BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT"/* 250E */, /*9487*/"BOX DRAWINGS HEAVY DOWN AND RIGHT"/* 250F */,/*9488*/"BOX DRAWINGS LIGHT DOWN AND LEFT"/* 2510 */, /*9489*/"BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY"/* 2511 */,/*9490*/"BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT"/* 2512 */, /*9491*/"BOX DRAWINGS HEAVY DOWN AND LEFT"/* 2513 */,/*9492*/"BOX DRAWINGS LIGHT UP AND RIGHT"/* 2514 */, /*9493*/"BOX DRAWINGS UP LIGHT AND RIGHT HEAVY"/* 2515 */,/*9494*/"BOX DRAWINGS UP HEAVY AND RIGHT LIGHT"/* 2516 */, /*9495*/"BOX DRAWINGS HEAVY UP AND RIGHT"/* 2517 */,/*9496*/"BOX DRAWINGS LIGHT UP AND LEFT"/* 2518 */, /*9497*/"BOX DRAWINGS UP LIGHT AND LEFT HEAVY"/* 2519 */,/*9498*/"BOX DRAWINGS UP HEAVY AND LEFT LIGHT"/* 251A */, /*9499*/"BOX DRAWINGS HEAVY UP AND LEFT"/* 251B */,/*9500*/"BOX DRAWINGS LIGHT VERTICAL AND RIGHT"/* 251C */, /*9501*/"BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY"/* 251D */, /*9502*/"BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT"/* 251E */, /*9503*/"BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT"/* 251F */, /*9504*/"BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT"/* 2520 */, /*9505*/"BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY"/* 2521 */, /*9506*/"BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY"/* 2522 */,/*9507*/"BOX DRAWINGS HEAVY VERTICAL AND RIGHT"/* 2523 */, /*9508*/"BOX DRAWINGS LIGHT VERTICAL AND LEFT"/* 2524 */,/*9509*/"BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY"/* 2525 */, /*9510*/"BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT"/* 2526 */, /*9511*/"BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT"/* 2527 */, /*9512*/"BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT"/* 2528 */, /*9513*/"BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY"/* 2529 */, /*9514*/"BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY"/* 252A */,/*9515*/"BOX DRAWINGS HEAVY VERTICAL AND LEFT"/* 252B */, /*9516*/"BOX DRAWINGS LIGHT DOWN AND HORIZONTAL"/* 252C */, /*9517*/"BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT"/* 252D */, /*9518*/"BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT"/* 252E */, /*9519*/"BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY"/* 252F */, /*9520*/"BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT"/* 2530 */, /*9521*/"BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY"/* 2531 */, /*9522*/"BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY"/* 2532 */, /*9523*/"BOX DRAWINGS HEAVY DOWN AND HORIZONTAL"/* 2533 */,/*9524*/"BOX DRAWINGS LIGHT UP AND HORIZONTAL"/* 2534 */, /*9525*/"BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT"/* 2535 */, /*9526*/"BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT"/* 2536 */, /*9527*/"BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY"/* 2537 */, /*9528*/"BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT"/* 2538 */, /*9529*/"BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY"/* 2539 */, /*9530*/"BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY"/* 253A */,/*9531*/"BOX DRAWINGS HEAVY UP AND HORIZONTAL"/* 253B */, /*9532*/"BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL"/* 253C */, /*9533*/"BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT"/* 253D */, /*9534*/"BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT"/* 253E */, /*9535*/"BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY"/* 253F */, /*9536*/"BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT"/* 2540 */, /*9537*/"BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT"/* 2541 */, /*9538*/"BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT"/* 2542 */, /*9539*/"BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT"/* 2543 */, /*9540*/"BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT"/* 2544 */, /*9541*/"BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT"/* 2545 */, /*9542*/"BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT"/* 2546 */, /*9543*/"BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY"/* 2547 */, /*9544*/"BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY"/* 2548 */, /*9545*/"BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY"/* 2549 */, /*9546*/"BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY"/* 254A */, /*9547*/"BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL"/* 254B */, /*9548*/"BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL"/* 254C */, /*9549*/"BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL"/* 254D */, /*9550*/"BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL"/* 254E */,/*9551*/"BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL"/* 254F */, /*9552*/"BOX DRAWINGS DOUBLE HORIZONTAL"/* 2550 */,/*9553*/"BOX DRAWINGS DOUBLE VERTICAL"/* 2551 */, /*9554*/"BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE"/* 2552 */, /*9555*/"BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE"/* 2553 */,/*9556*/"BOX DRAWINGS DOUBLE DOWN AND RIGHT"/* 2554 */, /*9557*/"BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE"/* 2555 */, /*9558*/"BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE"/* 2556 */,/*9559*/"BOX DRAWINGS DOUBLE DOWN AND LEFT"/* 2557 */, /*9560*/"BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE"/* 2558 */,/*9561*/"BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE"/* 2559 */, /*9562*/"BOX DRAWINGS DOUBLE UP AND RIGHT"/* 255A */,/*9563*/"BOX DRAWINGS UP SINGLE AND LEFT DOUBLE"/* 255B */, /*9564*/"BOX DRAWINGS UP DOUBLE AND LEFT SINGLE"/* 255C */,/*9565*/"BOX DRAWINGS DOUBLE UP AND LEFT"/* 255D */, /*9566*/"BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE"/* 255E */, /*9567*/"BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE"/* 255F */, /*9568*/"BOX DRAWINGS DOUBLE VERTICAL AND RIGHT"/* 2560 */, /*9569*/"BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE"/* 2561 */, /*9570*/"BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE"/* 2562 */, /*9571*/"BOX DRAWINGS DOUBLE VERTICAL AND LEFT"/* 2563 */, /*9572*/"BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE"/* 2564 */, /*9573*/"BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE"/* 2565 */, /*9574*/"BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL"/* 2566 */, /*9575*/"BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE"/* 2567 */, /*9576*/"BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE"/* 2568 */, /*9577*/"BOX DRAWINGS DOUBLE UP AND HORIZONTAL"/* 2569 */, /*9578*/"BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE"/* 256A */, /*9579*/"BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE"/* 256B */, /*9580*/"BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL"/* 256C */, /*9581*/"BOX DRAWINGS LIGHT ARC DOWN AND RIGHT"/* 256D */,/*9582*/"BOX DRAWINGS LIGHT ARC DOWN AND LEFT"/* 256E */, /*9583*/"BOX DRAWINGS LIGHT ARC UP AND LEFT"/* 256F */,/*9584*/"BOX DRAWINGS LIGHT ARC UP AND RIGHT"/* 2570 */, /*9585*/"BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT"/* 2571 */, /*9586*/"BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT"/* 2572 */, /*9587*/"BOX DRAWINGS LIGHT DIAGONAL CROSS"/* 2573 */,/*9588*/"BOX DRAWINGS LIGHT LEFT"/* 2574 */, /*9589*/"BOX DRAWINGS LIGHT UP"/* 2575 */,/*9590*/"BOX DRAWINGS LIGHT RIGHT"/* 2576 */, /*9591*/"BOX DRAWINGS LIGHT DOWN"/* 2577 */,/*9592*/"BOX DRAWINGS HEAVY LEFT"/* 2578 */, /*9593*/"BOX DRAWINGS HEAVY UP"/* 2579 */,/*9594*/"BOX DRAWINGS HEAVY RIGHT"/* 257A */, /*9595*/"BOX DRAWINGS HEAVY DOWN"/* 257B */,/*9596*/"BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT"/* 257C */, /*9597*/"BOX DRAWINGS LIGHT UP AND HEAVY DOWN"/* 257D */,/*9598*/"BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT"/* 257E */, /*9599*/"BOX DRAWINGS HEAVY UP AND LIGHT DOWN"/* 257F */,/*9600*/"UPPER HALF BLOCK"/* 2580 */, /*9601*/"LOWER ONE EIGHTH BLOCK"/* 2581 */,/*9602*/"LOWER ONE QUARTER BLOCK"/* 2582 */, /*9603*/"LOWER THREE EIGHTHS BLOCK"/* 2583 */,/*9604*/"LOWER HALF BLOCK"/* 2584 */, /*9605*/"LOWER FIVE EIGHTHS BLOCK"/* 2585 */,/*9606*/"LOWER THREE QUARTERS BLOCK"/* 2586 */, /*9607*/"LOWER SEVEN EIGHTHS BLOCK"/* 2587 */,/*9608*/"FULL BLOCK"/* 2588 */, /*9609*/"LEFT SEVEN EIGHTHS BLOCK"/* 2589 */,/*9610*/"LEFT THREE QUARTERS BLOCK"/* 258A */, /*9611*/"LEFT FIVE EIGHTHS BLOCK"/* 258B */,/*9612*/"LEFT HALF BLOCK"/* 258C */, /*9613*/"LEFT THREE EIGHTHS BLOCK"/* 258D */,/*9614*/"LEFT ONE QUARTER BLOCK"/* 258E */, /*9615*/"LEFT ONE EIGHTH BLOCK"/* 258F */,/*9616*/"RIGHT HALF BLOCK"/* 2590 */,/*9617*/"LIGHT SHADE"/* 2591 */, /*9618*/"MEDIUM SHADE"/* 2592 */,/*9619*/"DARK SHADE"/* 2593 */,/*9620*/"UPPER ONE EIGHTH BLOCK"/* 2594 */, /*9621*/"RIGHT ONE EIGHTH BLOCK"/* 2595 */,/*9622*/"QUADRANT LOWER LEFT"/* 2596 */, /*9623*/"QUADRANT LOWER RIGHT"/* 2597 */,/*9624*/"QUADRANT UPPER LEFT"/* 2598 */, /*9625*/"QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT"/* 2599 */, /*9626*/"QUADRANT UPPER LEFT AND LOWER RIGHT"/* 259A */, /*9627*/"QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT"/* 259B */, /*9628*/"QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT"/* 259C */,/*9629*/"QUADRANT UPPER RIGHT"/* 259D */, /*9630*/"QUADRANT UPPER RIGHT AND LOWER LEFT"/* 259E */, /*9631*/"QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT"/* 259F */,/*9632*/"BLACK SQUARE"/* 25A0 */, /*9633*/"WHITE SQUARE"/* 25A1 */,/*9634*/"WHITE SQUARE WITH ROUNDED CORNERS"/* 25A2 */, /*9635*/"WHITE SQUARE CONTAINING BLACK SMALL SQUARE"/* 25A3 */,/*9636*/"SQUARE WITH HORIZONTAL FILL"/* 25A4 */, /*9637*/"SQUARE WITH VERTICAL FILL"/* 25A5 */,/*9638*/"SQUARE WITH ORTHOGONAL CROSSHATCH FILL"/* 25A6 */, /*9639*/"SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL"/* 25A7 */, /*9640*/"SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL"/* 25A8 */,/*9641*/"SQUARE WITH DIAGONAL CROSSHATCH FILL"/* 25A9 */, /*9642*/"BLACK SMALL SQUARE"/* 25AA */,/*9643*/"WHITE SMALL SQUARE"/* 25AB */,/*9644*/"BLACK RECTANGLE"/* 25AC */, /*9645*/"WHITE RECTANGLE"/* 25AD */,/*9646*/"BLACK VERTICAL RECTANGLE"/* 25AE */, /*9647*/"WHITE VERTICAL RECTANGLE"/* 25AF */,/*9648*/"BLACK PARALLELOGRAM"/* 25B0 */, /*9649*/"WHITE PARALLELOGRAM"/* 25B1 */,/*9650*/"BLACK UP-POINTING TRIANGLE"/* 25B2 */, /*9651*/"WHITE UP-POINTING TRIANGLE"/* 25B3 */,/*9652*/"BLACK UP-POINTING SMALL TRIANGLE"/* 25B4 */, /*9653*/"WHITE UP-POINTING SMALL TRIANGLE"/* 25B5 */,/*9654*/"BLACK RIGHT-POINTING TRIANGLE"/* 25B6 */, /*9655*/"WHITE RIGHT-POINTING TRIANGLE"/* 25B7 */,/*9656*/"BLACK RIGHT-POINTING SMALL TRIANGLE"/* 25B8 */, /*9657*/"WHITE RIGHT-POINTING SMALL TRIANGLE"/* 25B9 */,/*9658*/"BLACK RIGHT-POINTING POINTER"/* 25BA */, /*9659*/"WHITE RIGHT-POINTING POINTER"/* 25BB */,/*9660*/"BLACK DOWN-POINTING TRIANGLE"/* 25BC */, /*9661*/"WHITE DOWN-POINTING TRIANGLE"/* 25BD */,/*9662*/"BLACK DOWN-POINTING SMALL TRIANGLE"/* 25BE */, /*9663*/"WHITE DOWN-POINTING SMALL TRIANGLE"/* 25BF */,/*9664*/"BLACK LEFT-POINTING TRIANGLE"/* 25C0 */, /*9665*/"WHITE LEFT-POINTING TRIANGLE"/* 25C1 */,/*9666*/"BLACK LEFT-POINTING SMALL TRIANGLE"/* 25C2 */, /*9667*/"WHITE LEFT-POINTING SMALL TRIANGLE"/* 25C3 */,/*9668*/"BLACK LEFT-POINTING POINTER"/* 25C4 */, /*9669*/"WHITE LEFT-POINTING POINTER"/* 25C5 */,/*9670*/"BLACK DIAMOND"/* 25C6 */,/*9671*/"WHITE DIAMOND"/* 25C7 */, /*9672*/"WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND"/* 25C8 */,/*9673*/"FISHEYE"/* 25C9 */,/*9674*/"LOZENGE"/* 25CA */, /*9675*/"WHITE CIRCLE"/* 25CB */,/*9676*/"DOTTED CIRCLE"/* 25CC */,/*9677*/"CIRCLE WITH VERTICAL FILL"/* 25CD */, /*9678*/"BULLSEYE"/* 25CE */,/*9679*/"BLACK CIRCLE"/* 25CF */,/*9680*/"CIRCLE WITH LEFT HALF BLACK"/* 25D0 */, /*9681*/"CIRCLE WITH RIGHT HALF BLACK"/* 25D1 */,/*9682*/"CIRCLE WITH LOWER HALF BLACK"/* 25D2 */, /*9683*/"CIRCLE WITH UPPER HALF BLACK"/* 25D3 */,/*9684*/"CIRCLE WITH UPPER RIGHT QUADRANT BLACK"/* 25D4 */, /*9685*/"CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK"/* 25D5 */,/*9686*/"LEFT HALF BLACK CIRCLE"/* 25D6 */, /*9687*/"RIGHT HALF BLACK CIRCLE"/* 25D7 */,/*9688*/"INVERSE BULLET"/* 25D8 */,/*9689*/"INVERSE WHITE CIRCLE"/* 25D9 */, /*9690*/"UPPER HALF INVERSE WHITE CIRCLE"/* 25DA */,/*9691*/"LOWER HALF INVERSE WHITE CIRCLE"/* 25DB */, /*9692*/"UPPER LEFT QUADRANT CIRCULAR ARC"/* 25DC */,/*9693*/"UPPER RIGHT QUADRANT CIRCULAR ARC"/* 25DD */, /*9694*/"LOWER RIGHT QUADRANT CIRCULAR ARC"/* 25DE */,/*9695*/"LOWER LEFT QUADRANT CIRCULAR ARC"/* 25DF */, /*9696*/"UPPER HALF CIRCLE"/* 25E0 */,/*9697*/"LOWER HALF CIRCLE"/* 25E1 */, /*9698*/"BLACK LOWER RIGHT TRIANGLE"/* 25E2 */,/*9699*/"BLACK LOWER LEFT TRIANGLE"/* 25E3 */, /*9700*/"BLACK UPPER LEFT TRIANGLE"/* 25E4 */,/*9701*/"BLACK UPPER RIGHT TRIANGLE"/* 25E5 */, /*9702*/"WHITE BULLET"/* 25E6 */,/*9703*/"SQUARE WITH LEFT HALF BLACK"/* 25E7 */, /*9704*/"SQUARE WITH RIGHT HALF BLACK"/* 25E8 */,/*9705*/"SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK"/* 25E9 */, /*9706*/"SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK"/* 25EA */, /*9707*/"WHITE SQUARE WITH VERTICAL BISECTING LINE"/* 25EB */,/*9708*/"WHITE UP-POINTING TRIANGLE WITH DOT"/* 25EC */, /*9709*/"UP-POINTING TRIANGLE WITH LEFT HALF BLACK"/* 25ED */, /*9710*/"UP-POINTING TRIANGLE WITH RIGHT HALF BLACK"/* 25EE */,/*9711*/"LARGE CIRCLE"/* 25EF */, /*9712*/"WHITE SQUARE WITH UPPER LEFT QUADRANT"/* 25F0 */,/*9713*/"WHITE SQUARE WITH LOWER LEFT QUADRANT"/* 25F1 */, /*9714*/"WHITE SQUARE WITH LOWER RIGHT QUADRANT"/* 25F2 */,/*9715*/"WHITE SQUARE WITH UPPER RIGHT QUADRANT"/* 25F3 */, /*9716*/"WHITE CIRCLE WITH UPPER LEFT QUADRANT"/* 25F4 */,/*9717*/"WHITE CIRCLE WITH LOWER LEFT QUADRANT"/* 25F5 */, /*9718*/"WHITE CIRCLE WITH LOWER RIGHT QUADRANT"/* 25F6 */,/*9719*/"WHITE CIRCLE WITH UPPER RIGHT QUADRANT"/* 25F7 */, /*9720*/"UPPER LEFT TRIANGLE"/* 25F8 */,/*9721*/"UPPER RIGHT TRIANGLE"/* 25F9 */,/*9722*/"LOWER LEFT TRIANGLE"/* 25FA */, /*9723*/"WHITE MEDIUM SQUARE"/* 25FB */,/*9724*/"BLACK MEDIUM SQUARE"/* 25FC */, /*9725*/"WHITE MEDIUM SMALL SQUARE"/* 25FD */,/*9726*/"BLACK MEDIUM SMALL SQUARE"/* 25FE */, /*9727*/"LOWER RIGHT TRIANGLE"/* 25FF */,/*9728*/"BLACK SUN WITH RAYS"/* 2600 */,/*9729*/"CLOUD"/* 2601 */, /*9730*/"UMBRELLA"/* 2602 */,/*9731*/"SNOWMAN"/* 2603 */,/*9732*/"COMET"/* 2604 */,/*9733*/"BLACK STAR"/* 2605 */, /*9734*/"WHITE STAR"/* 2606 */,/*9735*/"LIGHTNING"/* 2607 */,/*9736*/"THUNDERSTORM"/* 2608 */,/*9737*/"SUN"/* 2609 */, /*9738*/"ASCENDING NODE"/* 260A */,/*9739*/"DESCENDING NODE"/* 260B */,/*9740*/"CONJUNCTION"/* 260C */, /*9741*/"OPPOSITION"/* 260D */,/*9742*/"BLACK TELEPHONE"/* 260E */,/*9743*/"WHITE TELEPHONE"/* 260F */, /*9744*/"BALLOT BOX"/* 2610 */,/*9745*/"BALLOT BOX WITH CHECK"/* 2611 */,/*9746*/"BALLOT BOX WITH X"/* 2612 */, /*9747*/"SALTIRE"/* 2613 */,/*9748*/"UMBRELLA WITH RAIN DROPS"/* 2614 */,/*9749*/"HOT BEVERAGE"/* 2615 */, /*9750*/"WHITE SHOGI PIECE"/* 2616 */,/*9751*/"BLACK SHOGI PIECE"/* 2617 */,/*9752*/"SHAMROCK"/* 2618 */, /*9753*/"REVERSED ROTATED FLORAL HEART BULLET"/* 2619 */,/*9754*/"BLACK LEFT POINTING INDEX"/* 261A */, /*9755*/"BLACK RIGHT POINTING INDEX"/* 261B */,/*9756*/"WHITE LEFT POINTING INDEX"/* 261C */, /*9757*/"WHITE UP POINTING INDEX"/* 261D */,/*9758*/"WHITE RIGHT POINTING INDEX"/* 261E */, /*9759*/"WHITE DOWN POINTING INDEX"/* 261F */,/*9760*/"SKULL AND CROSSBONES"/* 2620 */,/*9761*/"CAUTION SIGN"/* 2621 */, /*9762*/"RADIOACTIVE SIGN"/* 2622 */,/*9763*/"BIOHAZARD SIGN"/* 2623 */,/*9764*/"CADUCEUS"/* 2624 */, /*9765*/"ANKH"/* 2625 */,/*9766*/"ORTHODOX CROSS"/* 2626 */,/*9767*/"CHI RHO"/* 2627 */, /*9768*/"CROSS OF LORRAINE"/* 2628 */,/*9769*/"CROSS OF JERUSALEM"/* 2629 */,/*9770*/"STAR AND CRESCENT"/* 262A */, /*9771*/"FARSI SYMBOL"/* 262B */,/*9772*/"ADI SHAKTI"/* 262C */,/*9773*/"HAMMER AND SICKLE"/* 262D */, /*9774*/"PEACE SYMBOL"/* 262E */,/*9775*/"YIN YANG"/* 262F */,/*9776*/"TRIGRAM FOR HEAVEN"/* 2630 */, /*9777*/"TRIGRAM FOR LAKE"/* 2631 */,/*9778*/"TRIGRAM FOR FIRE"/* 2632 */,/*9779*/"TRIGRAM FOR THUNDER"/* 2633 */, /*9780*/"TRIGRAM FOR WIND"/* 2634 */,/*9781*/"TRIGRAM FOR WATER"/* 2635 */,/*9782*/"TRIGRAM FOR MOUNTAIN"/* 2636 */, /*9783*/"TRIGRAM FOR EARTH"/* 2637 */,/*9784*/"WHEEL OF DHARMA"/* 2638 */,/*9785*/"WHITE FROWNING FACE"/* 2639 */, /*9786*/"WHITE SMILING FACE"/* 263A */,/*9787*/"BLACK SMILING FACE"/* 263B */,/*9788*/"WHITE SUN WITH RAYS"/* 263C */, /*9789*/"FIRST QUARTER MOON"/* 263D */,/*9790*/"LAST QUARTER MOON"/* 263E */,/*9791*/"MERCURY"/* 263F */, /*9792*/"FEMALE SIGN"/* 2640 */,/*9793*/"EARTH"/* 2641 */,/*9794*/"MALE SIGN"/* 2642 */,/*9795*/"JUPITER"/* 2643 */, /*9796*/"SATURN"/* 2644 */,/*9797*/"URANUS"/* 2645 */,/*9798*/"NEPTUNE"/* 2646 */,/*9799*/"PLUTO"/* 2647 */, /*9800*/"ARIES"/* 2648 */,/*9801*/"TAURUS"/* 2649 */,/*9802*/"GEMINI"/* 264A */,/*9803*/"CANCER"/* 264B */, /*9804*/"LEO"/* 264C */,/*9805*/"VIRGO"/* 264D */,/*9806*/"LIBRA"/* 264E */,/*9807*/"SCORPIUS"/* 264F */, /*9808*/"SAGITTARIUS"/* 2650 */,/*9809*/"CAPRICORN"/* 2651 */,/*9810*/"AQUARIUS"/* 2652 */,/*9811*/"PISCES"/* 2653 */, /*9812*/"WHITE CHESS KING"/* 2654 */,/*9813*/"WHITE CHESS QUEEN"/* 2655 */,/*9814*/"WHITE CHESS ROOK"/* 2656 */, /*9815*/"WHITE CHESS BISHOP"/* 2657 */,/*9816*/"WHITE CHESS KNIGHT"/* 2658 */,/*9817*/"WHITE CHESS PAWN"/* 2659 */, /*9818*/"BLACK CHESS KING"/* 265A */,/*9819*/"BLACK CHESS QUEEN"/* 265B */,/*9820*/"BLACK CHESS ROOK"/* 265C */, /*9821*/"BLACK CHESS BISHOP"/* 265D */,/*9822*/"BLACK CHESS KNIGHT"/* 265E */,/*9823*/"BLACK CHESS PAWN"/* 265F */, /*9824*/"BLACK SPADE SUIT"/* 2660 */,/*9825*/"WHITE HEART SUIT"/* 2661 */,/*9826*/"WHITE DIAMOND SUIT"/* 2662 */, /*9827*/"BLACK CLUB SUIT"/* 2663 */,/*9828*/"WHITE SPADE SUIT"/* 2664 */,/*9829*/"BLACK HEART SUIT"/* 2665 */, /*9830*/"BLACK DIAMOND SUIT"/* 2666 */,/*9831*/"WHITE CLUB SUIT"/* 2667 */,/*9832*/"HOT SPRINGS"/* 2668 */, /*9833*/"QUARTER NOTE"/* 2669 */,/*9834*/"EIGHTH NOTE"/* 266A */,/*9835*/"BEAMED EIGHTH NOTES"/* 266B */, /*9836*/"BEAMED SIXTEENTH NOTES"/* 266C */,/*9837*/"MUSIC FLAT SIGN"/* 266D */,/*9838*/"MUSIC NATURAL SIGN"/* 266E */, /*9839*/"MUSIC SHARP SIGN"/* 266F */,/*9840*/"WEST SYRIAC CROSS"/* 2670 */,/*9841*/"EAST SYRIAC CROSS"/* 2671 */, /*9842*/"UNIVERSAL RECYCLING SYMBOL"/* 2672 */,/*9843*/"RECYCLING SYMBOL FOR TYPE-1 PLASTICS"/* 2673 */, /*9844*/"RECYCLING SYMBOL FOR TYPE-2 PLASTICS"/* 2674 */,/*9845*/"RECYCLING SYMBOL FOR TYPE-3 PLASTICS"/* 2675 */, /*9846*/"RECYCLING SYMBOL FOR TYPE-4 PLASTICS"/* 2676 */,/*9847*/"RECYCLING SYMBOL FOR TYPE-5 PLASTICS"/* 2677 */, /*9848*/"RECYCLING SYMBOL FOR TYPE-6 PLASTICS"/* 2678 */,/*9849*/"RECYCLING SYMBOL FOR TYPE-7 PLASTICS"/* 2679 */, /*9850*/"RECYCLING SYMBOL FOR GENERIC MATERIALS"/* 267A */,/*9851*/"BLACK UNIVERSAL RECYCLING SYMBOL"/* 267B */, /*9852*/"RECYCLED PAPER SYMBOL"/* 267C */,/*9853*/"PARTIALLY-RECYCLED PAPER SYMBOL"/* 267D */, /*9854*/"PERMANENT PAPER SIGN"/* 267E */,/*9855*/"WHEELCHAIR SYMBOL"/* 267F */,/*9856*/"DIE FACE-1"/* 2680 */, /*9857*/"DIE FACE-2"/* 2681 */,/*9858*/"DIE FACE-3"/* 2682 */,/*9859*/"DIE FACE-4"/* 2683 */, /*9860*/"DIE FACE-5"/* 2684 */,/*9861*/"DIE FACE-6"/* 2685 */,/*9862*/"WHITE CIRCLE WITH DOT RIGHT"/* 2686 */, /*9863*/"WHITE CIRCLE WITH TWO DOTS"/* 2687 */,/*9864*/"BLACK CIRCLE WITH WHITE DOT RIGHT"/* 2688 */, /*9865*/"BLACK CIRCLE WITH TWO WHITE DOTS"/* 2689 */,/*9866*/"MONOGRAM FOR YANG"/* 268A */, /*9867*/"MONOGRAM FOR YIN"/* 268B */,/*9868*/"DIGRAM FOR GREATER YANG"/* 268C */, /*9869*/"DIGRAM FOR LESSER YIN"/* 268D */,/*9870*/"DIGRAM FOR LESSER YANG"/* 268E */, /*9871*/"DIGRAM FOR GREATER YIN"/* 268F */,/*9872*/"WHITE FLAG"/* 2690 */,/*9873*/"BLACK FLAG"/* 2691 */, /*9874*/"HAMMER AND PICK"/* 2692 */,/*9875*/"ANCHOR"/* 2693 */,/*9876*/"CROSSED SWORDS"/* 2694 */, /*9877*/"STAFF OF AESCULAPIUS"/* 2695 */,/*9878*/"SCALES"/* 2696 */,/*9879*/"ALEMBIC"/* 2697 */, /*9880*/"FLOWER"/* 2698 */,/*9881*/"GEAR"/* 2699 */,/*9882*/"STAFF OF HERMES"/* 269A */,/*9883*/"ATOM SYMBOL"/* 269B */, /*9884*/"FLEUR-DE-LIS"/* 269C */,/*9885*/"OUTLINED WHITE STAR"/* 269D */, /*9886*/"THREE LINES CONVERGING RIGHT"/* 269E */,/*9887*/"THREE LINES CONVERGING LEFT"/* 269F */, /*9888*/"WARNING SIGN"/* 26A0 */,/*9889*/"HIGH VOLTAGE SIGN"/* 26A1 */,/*9890*/"DOUBLED FEMALE SIGN"/* 26A2 */, /*9891*/"DOUBLED MALE SIGN"/* 26A3 */,/*9892*/"INTERLOCKED FEMALE AND MALE SIGN"/* 26A4 */, /*9893*/"MALE AND FEMALE SIGN"/* 26A5 */,/*9894*/"MALE WITH STROKE SIGN"/* 26A6 */, /*9895*/"MALE WITH STROKE AND MALE AND FEMALE SIGN"/* 26A7 */,/*9896*/"VERTICAL MALE WITH STROKE SIGN"/* 26A8 */, /*9897*/"HORIZONTAL MALE WITH STROKE SIGN"/* 26A9 */,/*9898*/"MEDIUM WHITE CIRCLE"/* 26AA */, /*9899*/"MEDIUM BLACK CIRCLE"/* 26AB */,/*9900*/"MEDIUM SMALL WHITE CIRCLE"/* 26AC */, /*9901*/"MARRIAGE SYMBOL"/* 26AD */,/*9902*/"DIVORCE SYMBOL"/* 26AE */,/*9903*/"UNMARRIED PARTNERSHIP SYMBOL"/* 26AF */, /*9904*/"COFFIN"/* 26B0 */,/*9905*/"FUNERAL URN"/* 26B1 */,/*9906*/"NEUTER"/* 26B2 */,/*9907*/"CERES"/* 26B3 */, /*9908*/"PALLAS"/* 26B4 */,/*9909*/"JUNO"/* 26B5 */,/*9910*/"VESTA"/* 26B6 */,/*9911*/"CHIRON"/* 26B7 */, /*9912*/"BLACK MOON LILITH"/* 26B8 */,/*9913*/"SEXTILE"/* 26B9 */,/*9914*/"SEMISEXTILE"/* 26BA */, /*9915*/"QUINCUNX"/* 26BB */,/*9916*/"SESQUIQUADRATE"/* 26BC */,/*9917*/"SOCCER BALL"/* 26BD */, /*9918*/"BASEBALL"/* 26BE */,/*9919*/"SQUARED KEY"/* 26BF */,/*9920*/"WHITE DRAUGHTS MAN"/* 26C0 */, /*9921*/"WHITE DRAUGHTS KING"/* 26C1 */,/*9922*/"BLACK DRAUGHTS MAN"/* 26C2 */,/*9923*/"BLACK DRAUGHTS KING"/* 26C3 */, /*9924*/"SNOWMAN WITHOUT SNOW"/* 26C4 */,/*9925*/"SUN BEHIND CLOUD"/* 26C5 */,/*9926*/"RAIN"/* 26C6 */, /*9927*/"BLACK SNOWMAN"/* 26C7 */,/*9928*/"THUNDER CLOUD AND RAIN"/* 26C8 */, /*9929*/"TURNED WHITE SHOGI PIECE"/* 26C9 */,/*9930*/"TURNED BLACK SHOGI PIECE"/* 26CA */, /*9931*/"WHITE DIAMOND IN SQUARE"/* 26CB */,/*9932*/"CROSSING LANES"/* 26CC */,/*9933*/"DISABLED CAR"/* 26CD */, /*9934*/"OPHIUCHUS"/* 26CE */,/*9935*/"PICK"/* 26CF */,/*9936*/"CAR SLIDING"/* 26D0 */, /*9937*/"HELMET WITH WHITE CROSS"/* 26D1 */,/*9938*/"CIRCLED CROSSING LANES"/* 26D2 */,/*9939*/"CHAINS"/* 26D3 */, /*9940*/"NO ENTRY"/* 26D4 */,/*9941*/"ALTERNATE ONE-WAY LEFT WAY TRAFFIC"/* 26D5 */, /*9942*/"BLACK TWO-WAY LEFT WAY TRAFFIC"/* 26D6 */,/*9943*/"WHITE TWO-WAY LEFT WAY TRAFFIC"/* 26D7 */, /*9944*/"BLACK LEFT LANE MERGE"/* 26D8 */,/*9945*/"WHITE LEFT LANE MERGE"/* 26D9 */,/*9946*/"DRIVE SLOW SIGN"/* 26DA */, /*9947*/"HEAVY WHITE DOWN-POINTING TRIANGLE"/* 26DB */,/*9948*/"LEFT CLOSED ENTRY"/* 26DC */, /*9949*/"SQUARED SALTIRE"/* 26DD */,/*9950*/"FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE"/* 26DE */, /*9951*/"BLACK TRUCK"/* 26DF */,/*9952*/"RESTRICTED LEFT ENTRY-1"/* 26E0 */,/*9953*/"RESTRICTED LEFT ENTRY-2"/* 26E1 */, /*9954*/"ASTRONOMICAL SYMBOL FOR URANUS"/* 26E2 */,/*9955*/"HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE"/* 26E3 */, /*9956*/"PENTAGRAM"/* 26E4 */,/*9957*/"RIGHT-HANDED INTERLACED PENTAGRAM"/* 26E5 */, /*9958*/"LEFT-HANDED INTERLACED PENTAGRAM"/* 26E6 */,/*9959*/"INVERTED PENTAGRAM"/* 26E7 */, /*9960*/"BLACK CROSS ON SHIELD"/* 26E8 */,/*9961*/"SHINTO SHRINE"/* 26E9 */,/*9962*/"CHURCH"/* 26EA */, /*9963*/"CASTLE"/* 26EB */,/*9964*/"HISTORIC SITE"/* 26EC */,/*9965*/"GEAR WITHOUT HUB"/* 26ED */, /*9966*/"GEAR WITH HANDLES"/* 26EE */,/*9967*/"MAP SYMBOL FOR LIGHTHOUSE"/* 26EF */,/*9968*/"MOUNTAIN"/* 26F0 */, /*9969*/"UMBRELLA ON GROUND"/* 26F1 */,/*9970*/"FOUNTAIN"/* 26F2 */,/*9971*/"FLAG IN HOLE"/* 26F3 */, /*9972*/"FERRY"/* 26F4 */,/*9973*/"SAILBOAT"/* 26F5 */,/*9974*/"SQUARE FOUR CORNERS"/* 26F6 */,/*9975*/"SKIER"/* 26F7 */, /*9976*/"ICE SKATE"/* 26F8 */,/*9977*/"PERSON WITH BALL"/* 26F9 */,/*9978*/"TENT"/* 26FA */, /*9979*/"JAPANESE BANK SYMBOL"/* 26FB */,/*9980*/"HEADSTONE GRAVEYARD SYMBOL"/* 26FC */,/*9981*/"FUEL PUMP"/* 26FD */, /*9982*/"CUP ON BLACK SQUARE"/* 26FE */,/*9983*/"WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE"/* 26FF */, /*9984*/"BLACK SAFETY SCISSORS"/* 2700 */,/*9985*/"UPPER BLADE SCISSORS"/* 2701 */,/*9986*/"BLACK SCISSORS"/* 2702 */, /*9987*/"LOWER BLADE SCISSORS"/* 2703 */,/*9988*/"WHITE SCISSORS"/* 2704 */,/*9989*/"WHITE HEAVY CHECK MARK"/* 2705 */, /*9990*/"TELEPHONE LOCATION SIGN"/* 2706 */,/*9991*/"TAPE DRIVE"/* 2707 */,/*9992*/"AIRPLANE"/* 2708 */, /*9993*/"ENVELOPE"/* 2709 */,/*9994*/"RAISED FIST"/* 270A */,/*9995*/"RAISED HAND"/* 270B */, /*9996*/"VICTORY HAND"/* 270C */,/*9997*/"WRITING HAND"/* 270D */,/*9998*/"LOWER RIGHT PENCIL"/* 270E */, /*9999*/"PENCIL"/* 270F */,/*10000*/"UPPER RIGHT PENCIL"/* 2710 */,/*10001*/"WHITE NIB"/* 2711 */, /*10002*/"BLACK NIB"/* 2712 */,/*10003*/"CHECK MARK"/* 2713 */,/*10004*/"HEAVY CHECK MARK"/* 2714 */, /*10005*/"MULTIPLICATION X"/* 2715 */,/*10006*/"HEAVY MULTIPLICATION X"/* 2716 */,/*10007*/"BALLOT X"/* 2717 */, /*10008*/"HEAVY BALLOT X"/* 2718 */,/*10009*/"OUTLINED GREEK CROSS"/* 2719 */,/*10010*/"HEAVY GREEK CROSS"/* 271A */, /*10011*/"OPEN CENTRE CROSS"/* 271B */,/*10012*/"HEAVY OPEN CENTRE CROSS"/* 271C */,/*10013*/"LATIN CROSS"/* 271D */, /*10014*/"SHADOWED WHITE LATIN CROSS"/* 271E */,/*10015*/"OUTLINED LATIN CROSS"/* 271F */, /*10016*/"MALTESE CROSS"/* 2720 */,/*10017*/"STAR OF DAVID"/* 2721 */,/*10018*/"FOUR TEARDROP-SPOKED ASTERISK"/* 2722 */, /*10019*/"FOUR BALLOON-SPOKED ASTERISK"/* 2723 */,/*10020*/"HEAVY FOUR BALLOON-SPOKED ASTERISK"/* 2724 */, /*10021*/"FOUR CLUB-SPOKED ASTERISK"/* 2725 */,/*10022*/"BLACK FOUR POINTED STAR"/* 2726 */, /*10023*/"WHITE FOUR POINTED STAR"/* 2727 */,/*10024*/"SPARKLES"/* 2728 */, /*10025*/"STRESS OUTLINED WHITE STAR"/* 2729 */,/*10026*/"CIRCLED WHITE STAR"/* 272A */, /*10027*/"OPEN CENTRE BLACK STAR"/* 272B */,/*10028*/"BLACK CENTRE WHITE STAR"/* 272C */, /*10029*/"OUTLINED BLACK STAR"/* 272D */,/*10030*/"HEAVY OUTLINED BLACK STAR"/* 272E */, /*10031*/"PINWHEEL STAR"/* 272F */,/*10032*/"SHADOWED WHITE STAR"/* 2730 */,/*10033*/"HEAVY ASTERISK"/* 2731 */, /*10034*/"OPEN CENTRE ASTERISK"/* 2732 */,/*10035*/"EIGHT SPOKED ASTERISK"/* 2733 */, /*10036*/"EIGHT POINTED BLACK STAR"/* 2734 */,/*10037*/"EIGHT POINTED PINWHEEL STAR"/* 2735 */, /*10038*/"SIX POINTED BLACK STAR"/* 2736 */,/*10039*/"EIGHT POINTED RECTILINEAR BLACK STAR"/* 2737 */, /*10040*/"HEAVY EIGHT POINTED RECTILINEAR BLACK STAR"/* 2738 */,/*10041*/"TWELVE POINTED BLACK STAR"/* 2739 */, /*10042*/"SIXTEEN POINTED ASTERISK"/* 273A */,/*10043*/"TEARDROP-SPOKED ASTERISK"/* 273B */, /*10044*/"OPEN CENTRE TEARDROP-SPOKED ASTERISK"/* 273C */,/*10045*/"HEAVY TEARDROP-SPOKED ASTERISK"/* 273D */, /*10046*/"SIX PETALLED BLACK AND WHITE FLORETTE"/* 273E */,/*10047*/"BLACK FLORETTE"/* 273F */, /*10048*/"WHITE FLORETTE"/* 2740 */,/*10049*/"EIGHT PETALLED OUTLINED BLACK FLORETTE"/* 2741 */, /*10050*/"CIRCLED OPEN CENTRE EIGHT POINTED STAR"/* 2742 */,/*10051*/"HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK"/* 2743 */, /*10052*/"SNOWFLAKE"/* 2744 */,/*10053*/"TIGHT TRIFOLIATE SNOWFLAKE"/* 2745 */, /*10054*/"HEAVY CHEVRON SNOWFLAKE"/* 2746 */,/*10055*/"SPARKLE"/* 2747 */,/*10056*/"HEAVY SPARKLE"/* 2748 */, /*10057*/"BALLOON-SPOKED ASTERISK"/* 2749 */,/*10058*/"EIGHT TEARDROP-SPOKED PROPELLER ASTERISK"/* 274A */, /*10059*/"HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK"/* 274B */,/*10060*/"CROSS MARK"/* 274C */, /*10061*/"SHADOWED WHITE CIRCLE"/* 274D */,/*10062*/"NEGATIVE SQUARED CROSS MARK"/* 274E */, /*10063*/"LOWER RIGHT DROP-SHADOWED WHITE SQUARE"/* 274F */,/*10064*/"UPPER RIGHT DROP-SHADOWED WHITE SQUARE"/* 2750 */, /*10065*/"LOWER RIGHT SHADOWED WHITE SQUARE"/* 2751 */,/*10066*/"UPPER RIGHT SHADOWED WHITE SQUARE"/* 2752 */, /*10067*/"BLACK QUESTION MARK ORNAMENT"/* 2753 */,/*10068*/"WHITE QUESTION MARK ORNAMENT"/* 2754 */, /*10069*/"WHITE EXCLAMATION MARK ORNAMENT"/* 2755 */,/*10070*/"BLACK DIAMOND MINUS WHITE X"/* 2756 */, /*10071*/"HEAVY EXCLAMATION MARK SYMBOL"/* 2757 */,/*10072*/"LIGHT VERTICAL BAR"/* 2758 */, /*10073*/"MEDIUM VERTICAL BAR"/* 2759 */,/*10074*/"HEAVY VERTICAL BAR"/* 275A */, /*10075*/"HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT"/* 275B */, /*10076*/"HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT"/* 275C */, /*10077*/"HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT"/* 275D */, /*10078*/"HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT"/* 275E */, /*10079*/"HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT"/* 275F */, /*10080*/"HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT"/* 2760 */, /*10081*/"CURVED STEM PARAGRAPH SIGN ORNAMENT"/* 2761 */,/*10082*/"HEAVY EXCLAMATION MARK ORNAMENT"/* 2762 */, /*10083*/"HEAVY HEART EXCLAMATION MARK ORNAMENT"/* 2763 */,/*10084*/"HEAVY BLACK HEART"/* 2764 */, /*10085*/"ROTATED HEAVY BLACK HEART BULLET"/* 2765 */,/*10086*/"FLORAL HEART"/* 2766 */, /*10087*/"ROTATED FLORAL HEART BULLET"/* 2767 */,/*10088*/"MEDIUM LEFT PARENTHESIS ORNAMENT"/* 2768 */, /*10089*/"MEDIUM RIGHT PARENTHESIS ORNAMENT"/* 2769 */,/*10090*/"MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT"/* 276A */, /*10091*/"MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT"/* 276B */, /*10092*/"MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT"/* 276C */, /*10093*/"MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT"/* 276D */, /*10094*/"HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT"/* 276E */, /*10095*/"HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT"/* 276F */, /*10096*/"HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT"/* 2770 */, /*10097*/"HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT"/* 2771 */, /*10098*/"LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT"/* 2772 */, /*10099*/"LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT"/* 2773 */,/*10100*/"MEDIUM LEFT CURLY BRACKET ORNAMENT"/* 2774 */, /*10101*/"MEDIUM RIGHT CURLY BRACKET ORNAMENT"/* 2775 */,/*10102*/"DINGBAT NEGATIVE CIRCLED DIGIT ONE"/* 2776 */, /*10103*/"DINGBAT NEGATIVE CIRCLED DIGIT TWO"/* 2777 */,/*10104*/"DINGBAT NEGATIVE CIRCLED DIGIT THREE"/* 2778 */, /*10105*/"DINGBAT NEGATIVE CIRCLED DIGIT FOUR"/* 2779 */,/*10106*/"DINGBAT NEGATIVE CIRCLED DIGIT FIVE"/* 277A */, /*10107*/"DINGBAT NEGATIVE CIRCLED DIGIT SIX"/* 277B */,/*10108*/"DINGBAT NEGATIVE CIRCLED DIGIT SEVEN"/* 277C */, /*10109*/"DINGBAT NEGATIVE CIRCLED DIGIT EIGHT"/* 277D */,/*10110*/"DINGBAT NEGATIVE CIRCLED DIGIT NINE"/* 277E */, /*10111*/"DINGBAT NEGATIVE CIRCLED NUMBER TEN"/* 277F */,/*10112*/"DINGBAT CIRCLED SANS-SERIF DIGIT ONE"/* 2780 */, /*10113*/"DINGBAT CIRCLED SANS-SERIF DIGIT TWO"/* 2781 */,/*10114*/"DINGBAT CIRCLED SANS-SERIF DIGIT THREE"/* 2782 */, /*10115*/"DINGBAT CIRCLED SANS-SERIF DIGIT FOUR"/* 2783 */,/*10116*/"DINGBAT CIRCLED SANS-SERIF DIGIT FIVE"/* 2784 */, /*10117*/"DINGBAT CIRCLED SANS-SERIF DIGIT SIX"/* 2785 */,/*10118*/"DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN"/* 2786 */, /*10119*/"DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT"/* 2787 */,/*10120*/"DINGBAT CIRCLED SANS-SERIF DIGIT NINE"/* 2788 */, /*10121*/"DINGBAT CIRCLED SANS-SERIF NUMBER TEN"/* 2789 */, /*10122*/"DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE"/* 278A */, /*10123*/"DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO"/* 278B */, /*10124*/"DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE"/* 278C */, /*10125*/"DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR"/* 278D */, /*10126*/"DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE"/* 278E */, /*10127*/"DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX"/* 278F */, /*10128*/"DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN"/* 2790 */, /*10129*/"DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT"/* 2791 */, /*10130*/"DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE"/* 2792 */, /*10131*/"DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN"/* 2793 */, /*10132*/"HEAVY WIDE-HEADED RIGHTWARDS ARROW"/* 2794 */,/*10133*/"HEAVY PLUS SIGN"/* 2795 */, /*10134*/"HEAVY MINUS SIGN"/* 2796 */,/*10135*/"HEAVY DIVISION SIGN"/* 2797 */, /*10136*/"HEAVY SOUTH EAST ARROW"/* 2798 */,/*10137*/"HEAVY RIGHTWARDS ARROW"/* 2799 */, /*10138*/"HEAVY NORTH EAST ARROW"/* 279A */,/*10139*/"DRAFTING POINT RIGHTWARDS ARROW"/* 279B */, /*10140*/"HEAVY ROUND-TIPPED RIGHTWARDS ARROW"/* 279C */,/*10141*/"TRIANGLE-HEADED RIGHTWARDS ARROW"/* 279D */, /*10142*/"HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW"/* 279E */,/*10143*/"DASHED TRIANGLE-HEADED RIGHTWARDS ARROW"/* 279F */, /*10144*/"HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW"/* 27A0 */,/*10145*/"BLACK RIGHTWARDS ARROW"/* 27A1 */, /*10146*/"THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD"/* 27A2 */, /*10147*/"THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD"/* 27A3 */,/*10148*/"BLACK RIGHTWARDS ARROWHEAD"/* 27A4 */, /*10149*/"HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW"/* 27A5 */, /*10150*/"HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW"/* 27A6 */,/*10151*/"SQUAT BLACK RIGHTWARDS ARROW"/* 27A7 */, /*10152*/"HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW"/* 27A8 */, /*10153*/"RIGHT-SHADED WHITE RIGHTWARDS ARROW"/* 27A9 */,/*10154*/"LEFT-SHADED WHITE RIGHTWARDS ARROW"/* 27AA */, /*10155*/"BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW"/* 27AB */, /*10156*/"FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW"/* 27AC */, /*10157*/"HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW"/* 27AD */, /*10158*/"HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW"/* 27AE */, /*10159*/"NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW"/* 27AF */,/*10160*/"CURLY LOOP"/* 27B0 */, /*10161*/"NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW"/* 27B1 */, /*10162*/"CIRCLED HEAVY WHITE RIGHTWARDS ARROW"/* 27B2 */,/*10163*/"WHITE-FEATHERED RIGHTWARDS ARROW"/* 27B3 */, /*10164*/"BLACK-FEATHERED SOUTH EAST ARROW"/* 27B4 */,/*10165*/"BLACK-FEATHERED RIGHTWARDS ARROW"/* 27B5 */, /*10166*/"BLACK-FEATHERED NORTH EAST ARROW"/* 27B6 */,/*10167*/"HEAVY BLACK-FEATHERED SOUTH EAST ARROW"/* 27B7 */, /*10168*/"HEAVY BLACK-FEATHERED RIGHTWARDS ARROW"/* 27B8 */,/*10169*/"HEAVY BLACK-FEATHERED NORTH EAST ARROW"/* 27B9 */, /*10170*/"TEARDROP-BARBED RIGHTWARDS ARROW"/* 27BA */,/*10171*/"HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW"/* 27BB */, /*10172*/"WEDGE-TAILED RIGHTWARDS ARROW"/* 27BC */,/*10173*/"HEAVY WEDGE-TAILED RIGHTWARDS ARROW"/* 27BD */, /*10174*/"OPEN-OUTLINED RIGHTWARDS ARROW"/* 27BE */,/*10175*/"DOUBLE CURLY LOOP"/* 27BF */, /*10176*/"THREE DIMENSIONAL ANGLE"/* 27C0 */,/*10177*/"WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE"/* 27C1 */, /*10178*/"PERPENDICULAR"/* 27C2 */,/*10179*/"OPEN SUBSET"/* 27C3 */,/*10180*/"OPEN SUPERSET"/* 27C4 */, /*10181*/"LEFT S-SHAPED BAG DELIMITER"/* 27C5 */,/*10182*/"RIGHT S-SHAPED BAG DELIMITER"/* 27C6 */, /*10183*/"OR WITH DOT INSIDE"/* 27C7 */,/*10184*/"REVERSE SOLIDUS PRECEDING SUBSET"/* 27C8 */, /*10185*/"SUPERSET PRECEDING SOLIDUS"/* 27C9 */,/*10186*/"VERTICAL BAR WITH HORIZONTAL STROKE"/* 27CA */, /*10187*/"MATHEMATICAL RISING DIAGONAL"/* 27CB */,/*10188*/"LONG DIVISION"/* 27CC */, /*10189*/"MATHEMATICAL FALLING DIAGONAL"/* 27CD */,/*10190*/"SQUARED LOGICAL AND"/* 27CE */, /*10191*/"SQUARED LOGICAL OR"/* 27CF */,/*10192*/"WHITE DIAMOND WITH CENTRED DOT"/* 27D0 */, /*10193*/"AND WITH DOT"/* 27D1 */,/*10194*/"ELEMENT OF OPENING UPWARDS"/* 27D2 */, /*10195*/"LOWER RIGHT CORNER WITH DOT"/* 27D3 */,/*10196*/"UPPER LEFT CORNER WITH DOT"/* 27D4 */, /*10197*/"LEFT OUTER JOIN"/* 27D5 */,/*10198*/"RIGHT OUTER JOIN"/* 27D6 */,/*10199*/"FULL OUTER JOIN"/* 27D7 */, /*10200*/"LARGE UP TACK"/* 27D8 */,/*10201*/"LARGE DOWN TACK"/* 27D9 */, /*10202*/"LEFT AND RIGHT DOUBLE TURNSTILE"/* 27DA */,/*10203*/"LEFT AND RIGHT TACK"/* 27DB */, /*10204*/"LEFT MULTIMAP"/* 27DC */,/*10205*/"LONG RIGHT TACK"/* 27DD */,/*10206*/"LONG LEFT TACK"/* 27DE */, /*10207*/"UP TACK WITH CIRCLE ABOVE"/* 27DF */,/*10208*/"LOZENGE DIVIDED BY HORIZONTAL RULE"/* 27E0 */, /*10209*/"WHITE CONCAVE-SIDED DIAMOND"/* 27E1 */,/*10210*/"WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK"/* 27E2 */, /*10211*/"WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK"/* 27E3 */, /*10212*/"WHITE SQUARE WITH LEFTWARDS TICK"/* 27E4 */,/*10213*/"WHITE SQUARE WITH RIGHTWARDS TICK"/* 27E5 */, /*10214*/"MATHEMATICAL LEFT WHITE SQUARE BRACKET"/* 27E6 */,/*10215*/"MATHEMATICAL RIGHT WHITE SQUARE BRACKET"/* 27E7 */, /*10216*/"MATHEMATICAL LEFT ANGLE BRACKET"/* 27E8 */,/*10217*/"MATHEMATICAL RIGHT ANGLE BRACKET"/* 27E9 */, /*10218*/"MATHEMATICAL LEFT DOUBLE ANGLE BRACKET"/* 27EA */,/*10219*/"MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET"/* 27EB */, /*10220*/"MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET"/* 27EC */, /*10221*/"MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET"/* 27ED */, /*10222*/"MATHEMATICAL LEFT FLATTENED PARENTHESIS"/* 27EE */, /*10223*/"MATHEMATICAL RIGHT FLATTENED PARENTHESIS"/* 27EF */,/*10224*/"UPWARDS QUADRUPLE ARROW"/* 27F0 */, /*10225*/"DOWNWARDS QUADRUPLE ARROW"/* 27F1 */,/*10226*/"ANTICLOCKWISE GAPPED CIRCLE ARROW"/* 27F2 */, /*10227*/"CLOCKWISE GAPPED CIRCLE ARROW"/* 27F3 */,/*10228*/"RIGHT ARROW WITH CIRCLED PLUS"/* 27F4 */, /*10229*/"LONG LEFTWARDS ARROW"/* 27F5 */,/*10230*/"LONG RIGHTWARDS ARROW"/* 27F6 */, /*10231*/"LONG LEFT RIGHT ARROW"/* 27F7 */,/*10232*/"LONG LEFTWARDS DOUBLE ARROW"/* 27F8 */, /*10233*/"LONG RIGHTWARDS DOUBLE ARROW"/* 27F9 */,/*10234*/"LONG LEFT RIGHT DOUBLE ARROW"/* 27FA */, /*10235*/"LONG LEFTWARDS ARROW FROM BAR"/* 27FB */,/*10236*/"LONG RIGHTWARDS ARROW FROM BAR"/* 27FC */, /*10237*/"LONG LEFTWARDS DOUBLE ARROW FROM BAR"/* 27FD */,/*10238*/"LONG RIGHTWARDS DOUBLE ARROW FROM BAR"/* 27FE */, /*10239*/"LONG RIGHTWARDS SQUIGGLE ARROW"/* 27FF */,/*10240*/"BRAILLE PATTERN BLANK"/* 2800 */, /*10241*/"BRAILLE PATTERN DOTS-1"/* 2801 */,/*10242*/"BRAILLE PATTERN DOTS-2"/* 2802 */, /*10243*/"BRAILLE PATTERN DOTS-12"/* 2803 */,/*10244*/"BRAILLE PATTERN DOTS-3"/* 2804 */, /*10245*/"BRAILLE PATTERN DOTS-13"/* 2805 */,/*10246*/"BRAILLE PATTERN DOTS-23"/* 2806 */, /*10247*/"BRAILLE PATTERN DOTS-123"/* 2807 */,/*10248*/"BRAILLE PATTERN DOTS-4"/* 2808 */, /*10249*/"BRAILLE PATTERN DOTS-14"/* 2809 */,/*10250*/"BRAILLE PATTERN DOTS-24"/* 280A */, /*10251*/"BRAILLE PATTERN DOTS-124"/* 280B */,/*10252*/"BRAILLE PATTERN DOTS-34"/* 280C */, /*10253*/"BRAILLE PATTERN DOTS-134"/* 280D */,/*10254*/"BRAILLE PATTERN DOTS-234"/* 280E */, /*10255*/"BRAILLE PATTERN DOTS-1234"/* 280F */,/*10256*/"BRAILLE PATTERN DOTS-5"/* 2810 */, /*10257*/"BRAILLE PATTERN DOTS-15"/* 2811 */,/*10258*/"BRAILLE PATTERN DOTS-25"/* 2812 */, /*10259*/"BRAILLE PATTERN DOTS-125"/* 2813 */,/*10260*/"BRAILLE PATTERN DOTS-35"/* 2814 */, /*10261*/"BRAILLE PATTERN DOTS-135"/* 2815 */,/*10262*/"BRAILLE PATTERN DOTS-235"/* 2816 */, /*10263*/"BRAILLE PATTERN DOTS-1235"/* 2817 */,/*10264*/"BRAILLE PATTERN DOTS-45"/* 2818 */, /*10265*/"BRAILLE PATTERN DOTS-145"/* 2819 */,/*10266*/"BRAILLE PATTERN DOTS-245"/* 281A */, /*10267*/"BRAILLE PATTERN DOTS-1245"/* 281B */,/*10268*/"BRAILLE PATTERN DOTS-345"/* 281C */, /*10269*/"BRAILLE PATTERN DOTS-1345"/* 281D */,/*10270*/"BRAILLE PATTERN DOTS-2345"/* 281E */, /*10271*/"BRAILLE PATTERN DOTS-12345"/* 281F */,/*10272*/"BRAILLE PATTERN DOTS-6"/* 2820 */, /*10273*/"BRAILLE PATTERN DOTS-16"/* 2821 */,/*10274*/"BRAILLE PATTERN DOTS-26"/* 2822 */, /*10275*/"BRAILLE PATTERN DOTS-126"/* 2823 */,/*10276*/"BRAILLE PATTERN DOTS-36"/* 2824 */, /*10277*/"BRAILLE PATTERN DOTS-136"/* 2825 */,/*10278*/"BRAILLE PATTERN DOTS-236"/* 2826 */, /*10279*/"BRAILLE PATTERN DOTS-1236"/* 2827 */,/*10280*/"BRAILLE PATTERN DOTS-46"/* 2828 */, /*10281*/"BRAILLE PATTERN DOTS-146"/* 2829 */,/*10282*/"BRAILLE PATTERN DOTS-246"/* 282A */, /*10283*/"BRAILLE PATTERN DOTS-1246"/* 282B */,/*10284*/"BRAILLE PATTERN DOTS-346"/* 282C */, /*10285*/"BRAILLE PATTERN DOTS-1346"/* 282D */,/*10286*/"BRAILLE PATTERN DOTS-2346"/* 282E */, /*10287*/"BRAILLE PATTERN DOTS-12346"/* 282F */,/*10288*/"BRAILLE PATTERN DOTS-56"/* 2830 */, /*10289*/"BRAILLE PATTERN DOTS-156"/* 2831 */,/*10290*/"BRAILLE PATTERN DOTS-256"/* 2832 */, /*10291*/"BRAILLE PATTERN DOTS-1256"/* 2833 */,/*10292*/"BRAILLE PATTERN DOTS-356"/* 2834 */, /*10293*/"BRAILLE PATTERN DOTS-1356"/* 2835 */,/*10294*/"BRAILLE PATTERN DOTS-2356"/* 2836 */, /*10295*/"BRAILLE PATTERN DOTS-12356"/* 2837 */,/*10296*/"BRAILLE PATTERN DOTS-456"/* 2838 */, /*10297*/"BRAILLE PATTERN DOTS-1456"/* 2839 */,/*10298*/"BRAILLE PATTERN DOTS-2456"/* 283A */, /*10299*/"BRAILLE PATTERN DOTS-12456"/* 283B */,/*10300*/"BRAILLE PATTERN DOTS-3456"/* 283C */, /*10301*/"BRAILLE PATTERN DOTS-13456"/* 283D */,/*10302*/"BRAILLE PATTERN DOTS-23456"/* 283E */, /*10303*/"BRAILLE PATTERN DOTS-123456"/* 283F */,/*10304*/"BRAILLE PATTERN DOTS-7"/* 2840 */, /*10305*/"BRAILLE PATTERN DOTS-17"/* 2841 */,/*10306*/"BRAILLE PATTERN DOTS-27"/* 2842 */, /*10307*/"BRAILLE PATTERN DOTS-127"/* 2843 */,/*10308*/"BRAILLE PATTERN DOTS-37"/* 2844 */, /*10309*/"BRAILLE PATTERN DOTS-137"/* 2845 */,/*10310*/"BRAILLE PATTERN DOTS-237"/* 2846 */, /*10311*/"BRAILLE PATTERN DOTS-1237"/* 2847 */,/*10312*/"BRAILLE PATTERN DOTS-47"/* 2848 */, /*10313*/"BRAILLE PATTERN DOTS-147"/* 2849 */,/*10314*/"BRAILLE PATTERN DOTS-247"/* 284A */, /*10315*/"BRAILLE PATTERN DOTS-1247"/* 284B */,/*10316*/"BRAILLE PATTERN DOTS-347"/* 284C */, /*10317*/"BRAILLE PATTERN DOTS-1347"/* 284D */,/*10318*/"BRAILLE PATTERN DOTS-2347"/* 284E */, /*10319*/"BRAILLE PATTERN DOTS-12347"/* 284F */,/*10320*/"BRAILLE PATTERN DOTS-57"/* 2850 */, /*10321*/"BRAILLE PATTERN DOTS-157"/* 2851 */,/*10322*/"BRAILLE PATTERN DOTS-257"/* 2852 */, /*10323*/"BRAILLE PATTERN DOTS-1257"/* 2853 */,/*10324*/"BRAILLE PATTERN DOTS-357"/* 2854 */, /*10325*/"BRAILLE PATTERN DOTS-1357"/* 2855 */,/*10326*/"BRAILLE PATTERN DOTS-2357"/* 2856 */, /*10327*/"BRAILLE PATTERN DOTS-12357"/* 2857 */,/*10328*/"BRAILLE PATTERN DOTS-457"/* 2858 */, /*10329*/"BRAILLE PATTERN DOTS-1457"/* 2859 */,/*10330*/"BRAILLE PATTERN DOTS-2457"/* 285A */, /*10331*/"BRAILLE PATTERN DOTS-12457"/* 285B */,/*10332*/"BRAILLE PATTERN DOTS-3457"/* 285C */, /*10333*/"BRAILLE PATTERN DOTS-13457"/* 285D */,/*10334*/"BRAILLE PATTERN DOTS-23457"/* 285E */, /*10335*/"BRAILLE PATTERN DOTS-123457"/* 285F */,/*10336*/"BRAILLE PATTERN DOTS-67"/* 2860 */, /*10337*/"BRAILLE PATTERN DOTS-167"/* 2861 */,/*10338*/"BRAILLE PATTERN DOTS-267"/* 2862 */, /*10339*/"BRAILLE PATTERN DOTS-1267"/* 2863 */,/*10340*/"BRAILLE PATTERN DOTS-367"/* 2864 */, /*10341*/"BRAILLE PATTERN DOTS-1367"/* 2865 */,/*10342*/"BRAILLE PATTERN DOTS-2367"/* 2866 */, /*10343*/"BRAILLE PATTERN DOTS-12367"/* 2867 */,/*10344*/"BRAILLE PATTERN DOTS-467"/* 2868 */, /*10345*/"BRAILLE PATTERN DOTS-1467"/* 2869 */,/*10346*/"BRAILLE PATTERN DOTS-2467"/* 286A */, /*10347*/"BRAILLE PATTERN DOTS-12467"/* 286B */,/*10348*/"BRAILLE PATTERN DOTS-3467"/* 286C */, /*10349*/"BRAILLE PATTERN DOTS-13467"/* 286D */,/*10350*/"BRAILLE PATTERN DOTS-23467"/* 286E */, /*10351*/"BRAILLE PATTERN DOTS-123467"/* 286F */,/*10352*/"BRAILLE PATTERN DOTS-567"/* 2870 */, /*10353*/"BRAILLE PATTERN DOTS-1567"/* 2871 */,/*10354*/"BRAILLE PATTERN DOTS-2567"/* 2872 */, /*10355*/"BRAILLE PATTERN DOTS-12567"/* 2873 */,/*10356*/"BRAILLE PATTERN DOTS-3567"/* 2874 */, /*10357*/"BRAILLE PATTERN DOTS-13567"/* 2875 */,/*10358*/"BRAILLE PATTERN DOTS-23567"/* 2876 */, /*10359*/"BRAILLE PATTERN DOTS-123567"/* 2877 */,/*10360*/"BRAILLE PATTERN DOTS-4567"/* 2878 */, /*10361*/"BRAILLE PATTERN DOTS-14567"/* 2879 */,/*10362*/"BRAILLE PATTERN DOTS-24567"/* 287A */, /*10363*/"BRAILLE PATTERN DOTS-124567"/* 287B */,/*10364*/"BRAILLE PATTERN DOTS-34567"/* 287C */, /*10365*/"BRAILLE PATTERN DOTS-134567"/* 287D */,/*10366*/"BRAILLE PATTERN DOTS-234567"/* 287E */, /*10367*/"BRAILLE PATTERN DOTS-1234567"/* 287F */,/*10368*/"BRAILLE PATTERN DOTS-8"/* 2880 */, /*10369*/"BRAILLE PATTERN DOTS-18"/* 2881 */,/*10370*/"BRAILLE PATTERN DOTS-28"/* 2882 */, /*10371*/"BRAILLE PATTERN DOTS-128"/* 2883 */,/*10372*/"BRAILLE PATTERN DOTS-38"/* 2884 */, /*10373*/"BRAILLE PATTERN DOTS-138"/* 2885 */,/*10374*/"BRAILLE PATTERN DOTS-238"/* 2886 */, /*10375*/"BRAILLE PATTERN DOTS-1238"/* 2887 */,/*10376*/"BRAILLE PATTERN DOTS-48"/* 2888 */, /*10377*/"BRAILLE PATTERN DOTS-148"/* 2889 */,/*10378*/"BRAILLE PATTERN DOTS-248"/* 288A */, /*10379*/"BRAILLE PATTERN DOTS-1248"/* 288B */,/*10380*/"BRAILLE PATTERN DOTS-348"/* 288C */, /*10381*/"BRAILLE PATTERN DOTS-1348"/* 288D */,/*10382*/"BRAILLE PATTERN DOTS-2348"/* 288E */, /*10383*/"BRAILLE PATTERN DOTS-12348"/* 288F */,/*10384*/"BRAILLE PATTERN DOTS-58"/* 2890 */, /*10385*/"BRAILLE PATTERN DOTS-158"/* 2891 */,/*10386*/"BRAILLE PATTERN DOTS-258"/* 2892 */, /*10387*/"BRAILLE PATTERN DOTS-1258"/* 2893 */,/*10388*/"BRAILLE PATTERN DOTS-358"/* 2894 */, /*10389*/"BRAILLE PATTERN DOTS-1358"/* 2895 */,/*10390*/"BRAILLE PATTERN DOTS-2358"/* 2896 */, /*10391*/"BRAILLE PATTERN DOTS-12358"/* 2897 */,/*10392*/"BRAILLE PATTERN DOTS-458"/* 2898 */, /*10393*/"BRAILLE PATTERN DOTS-1458"/* 2899 */,/*10394*/"BRAILLE PATTERN DOTS-2458"/* 289A */, /*10395*/"BRAILLE PATTERN DOTS-12458"/* 289B */,/*10396*/"BRAILLE PATTERN DOTS-3458"/* 289C */, /*10397*/"BRAILLE PATTERN DOTS-13458"/* 289D */,/*10398*/"BRAILLE PATTERN DOTS-23458"/* 289E */, /*10399*/"BRAILLE PATTERN DOTS-123458"/* 289F */,/*10400*/"BRAILLE PATTERN DOTS-68"/* 28A0 */, /*10401*/"BRAILLE PATTERN DOTS-168"/* 28A1 */,/*10402*/"BRAILLE PATTERN DOTS-268"/* 28A2 */, /*10403*/"BRAILLE PATTERN DOTS-1268"/* 28A3 */,/*10404*/"BRAILLE PATTERN DOTS-368"/* 28A4 */, /*10405*/"BRAILLE PATTERN DOTS-1368"/* 28A5 */,/*10406*/"BRAILLE PATTERN DOTS-2368"/* 28A6 */, /*10407*/"BRAILLE PATTERN DOTS-12368"/* 28A7 */,/*10408*/"BRAILLE PATTERN DOTS-468"/* 28A8 */, /*10409*/"BRAILLE PATTERN DOTS-1468"/* 28A9 */,/*10410*/"BRAILLE PATTERN DOTS-2468"/* 28AA */, /*10411*/"BRAILLE PATTERN DOTS-12468"/* 28AB */,/*10412*/"BRAILLE PATTERN DOTS-3468"/* 28AC */, /*10413*/"BRAILLE PATTERN DOTS-13468"/* 28AD */,/*10414*/"BRAILLE PATTERN DOTS-23468"/* 28AE */, /*10415*/"BRAILLE PATTERN DOTS-123468"/* 28AF */,/*10416*/"BRAILLE PATTERN DOTS-568"/* 28B0 */, /*10417*/"BRAILLE PATTERN DOTS-1568"/* 28B1 */,/*10418*/"BRAILLE PATTERN DOTS-2568"/* 28B2 */, /*10419*/"BRAILLE PATTERN DOTS-12568"/* 28B3 */,/*10420*/"BRAILLE PATTERN DOTS-3568"/* 28B4 */, /*10421*/"BRAILLE PATTERN DOTS-13568"/* 28B5 */,/*10422*/"BRAILLE PATTERN DOTS-23568"/* 28B6 */, /*10423*/"BRAILLE PATTERN DOTS-123568"/* 28B7 */,/*10424*/"BRAILLE PATTERN DOTS-4568"/* 28B8 */, /*10425*/"BRAILLE PATTERN DOTS-14568"/* 28B9 */,/*10426*/"BRAILLE PATTERN DOTS-24568"/* 28BA */, /*10427*/"BRAILLE PATTERN DOTS-124568"/* 28BB */,/*10428*/"BRAILLE PATTERN DOTS-34568"/* 28BC */, /*10429*/"BRAILLE PATTERN DOTS-134568"/* 28BD */,/*10430*/"BRAILLE PATTERN DOTS-234568"/* 28BE */, /*10431*/"BRAILLE PATTERN DOTS-1234568"/* 28BF */,/*10432*/"BRAILLE PATTERN DOTS-78"/* 28C0 */, /*10433*/"BRAILLE PATTERN DOTS-178"/* 28C1 */,/*10434*/"BRAILLE PATTERN DOTS-278"/* 28C2 */, /*10435*/"BRAILLE PATTERN DOTS-1278"/* 28C3 */,/*10436*/"BRAILLE PATTERN DOTS-378"/* 28C4 */, /*10437*/"BRAILLE PATTERN DOTS-1378"/* 28C5 */,/*10438*/"BRAILLE PATTERN DOTS-2378"/* 28C6 */, /*10439*/"BRAILLE PATTERN DOTS-12378"/* 28C7 */,/*10440*/"BRAILLE PATTERN DOTS-478"/* 28C8 */, /*10441*/"BRAILLE PATTERN DOTS-1478"/* 28C9 */,/*10442*/"BRAILLE PATTERN DOTS-2478"/* 28CA */, /*10443*/"BRAILLE PATTERN DOTS-12478"/* 28CB */,/*10444*/"BRAILLE PATTERN DOTS-3478"/* 28CC */, /*10445*/"BRAILLE PATTERN DOTS-13478"/* 28CD */,/*10446*/"BRAILLE PATTERN DOTS-23478"/* 28CE */, /*10447*/"BRAILLE PATTERN DOTS-123478"/* 28CF */,/*10448*/"BRAILLE PATTERN DOTS-578"/* 28D0 */, /*10449*/"BRAILLE PATTERN DOTS-1578"/* 28D1 */,/*10450*/"BRAILLE PATTERN DOTS-2578"/* 28D2 */, /*10451*/"BRAILLE PATTERN DOTS-12578"/* 28D3 */,/*10452*/"BRAILLE PATTERN DOTS-3578"/* 28D4 */, /*10453*/"BRAILLE PATTERN DOTS-13578"/* 28D5 */,/*10454*/"BRAILLE PATTERN DOTS-23578"/* 28D6 */, /*10455*/"BRAILLE PATTERN DOTS-123578"/* 28D7 */,/*10456*/"BRAILLE PATTERN DOTS-4578"/* 28D8 */, /*10457*/"BRAILLE PATTERN DOTS-14578"/* 28D9 */,/*10458*/"BRAILLE PATTERN DOTS-24578"/* 28DA */, /*10459*/"BRAILLE PATTERN DOTS-124578"/* 28DB */,/*10460*/"BRAILLE PATTERN DOTS-34578"/* 28DC */, /*10461*/"BRAILLE PATTERN DOTS-134578"/* 28DD */,/*10462*/"BRAILLE PATTERN DOTS-234578"/* 28DE */, /*10463*/"BRAILLE PATTERN DOTS-1234578"/* 28DF */,/*10464*/"BRAILLE PATTERN DOTS-678"/* 28E0 */, /*10465*/"BRAILLE PATTERN DOTS-1678"/* 28E1 */,/*10466*/"BRAILLE PATTERN DOTS-2678"/* 28E2 */, /*10467*/"BRAILLE PATTERN DOTS-12678"/* 28E3 */,/*10468*/"BRAILLE PATTERN DOTS-3678"/* 28E4 */, /*10469*/"BRAILLE PATTERN DOTS-13678"/* 28E5 */,/*10470*/"BRAILLE PATTERN DOTS-23678"/* 28E6 */, /*10471*/"BRAILLE PATTERN DOTS-123678"/* 28E7 */,/*10472*/"BRAILLE PATTERN DOTS-4678"/* 28E8 */, /*10473*/"BRAILLE PATTERN DOTS-14678"/* 28E9 */,/*10474*/"BRAILLE PATTERN DOTS-24678"/* 28EA */, /*10475*/"BRAILLE PATTERN DOTS-124678"/* 28EB */,/*10476*/"BRAILLE PATTERN DOTS-34678"/* 28EC */, /*10477*/"BRAILLE PATTERN DOTS-134678"/* 28ED */,/*10478*/"BRAILLE PATTERN DOTS-234678"/* 28EE */, /*10479*/"BRAILLE PATTERN DOTS-1234678"/* 28EF */,/*10480*/"BRAILLE PATTERN DOTS-5678"/* 28F0 */, /*10481*/"BRAILLE PATTERN DOTS-15678"/* 28F1 */,/*10482*/"BRAILLE PATTERN DOTS-25678"/* 28F2 */, /*10483*/"BRAILLE PATTERN DOTS-125678"/* 28F3 */,/*10484*/"BRAILLE PATTERN DOTS-35678"/* 28F4 */, /*10485*/"BRAILLE PATTERN DOTS-135678"/* 28F5 */,/*10486*/"BRAILLE PATTERN DOTS-235678"/* 28F6 */, /*10487*/"BRAILLE PATTERN DOTS-1235678"/* 28F7 */,/*10488*/"BRAILLE PATTERN DOTS-45678"/* 28F8 */, /*10489*/"BRAILLE PATTERN DOTS-145678"/* 28F9 */,/*10490*/"BRAILLE PATTERN DOTS-245678"/* 28FA */, /*10491*/"BRAILLE PATTERN DOTS-1245678"/* 28FB */,/*10492*/"BRAILLE PATTERN DOTS-345678"/* 28FC */, /*10493*/"BRAILLE PATTERN DOTS-1345678"/* 28FD */,/*10494*/"BRAILLE PATTERN DOTS-2345678"/* 28FE */, /*10495*/"BRAILLE PATTERN DOTS-12345678"/* 28FF */,/*10496*/"RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE"/* 2900 */, /*10497*/"RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE"/* 2901 */, /*10498*/"LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE"/* 2902 */, /*10499*/"RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE"/* 2903 */, /*10500*/"LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE"/* 2904 */, /*10501*/"RIGHTWARDS TWO-HEADED ARROW FROM BAR"/* 2905 */,/*10502*/"LEFTWARDS DOUBLE ARROW FROM BAR"/* 2906 */, /*10503*/"RIGHTWARDS DOUBLE ARROW FROM BAR"/* 2907 */,/*10504*/"DOWNWARDS ARROW WITH HORIZONTAL STROKE"/* 2908 */, /*10505*/"UPWARDS ARROW WITH HORIZONTAL STROKE"/* 2909 */,/*10506*/"UPWARDS TRIPLE ARROW"/* 290A */, /*10507*/"DOWNWARDS TRIPLE ARROW"/* 290B */,/*10508*/"LEFTWARDS DOUBLE DASH ARROW"/* 290C */, /*10509*/"RIGHTWARDS DOUBLE DASH ARROW"/* 290D */,/*10510*/"LEFTWARDS TRIPLE DASH ARROW"/* 290E */, /*10511*/"RIGHTWARDS TRIPLE DASH ARROW"/* 290F */,/*10512*/"RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW"/* 2910 */, /*10513*/"RIGHTWARDS ARROW WITH DOTTED STEM"/* 2911 */,/*10514*/"UPWARDS ARROW TO BAR"/* 2912 */, /*10515*/"DOWNWARDS ARROW TO BAR"/* 2913 */,/*10516*/"RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE"/* 2914 */, /*10517*/"RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE"/* 2915 */, /*10518*/"RIGHTWARDS TWO-HEADED ARROW WITH TAIL"/* 2916 */, /*10519*/"RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE"/* 2917 */, /*10520*/"RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE"/* 2918 */, /*10521*/"LEFTWARDS ARROW-TAIL"/* 2919 */,/*10522*/"RIGHTWARDS ARROW-TAIL"/* 291A */, /*10523*/"LEFTWARDS DOUBLE ARROW-TAIL"/* 291B */,/*10524*/"RIGHTWARDS DOUBLE ARROW-TAIL"/* 291C */, /*10525*/"LEFTWARDS ARROW TO BLACK DIAMOND"/* 291D */,/*10526*/"RIGHTWARDS ARROW TO BLACK DIAMOND"/* 291E */, /*10527*/"LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND"/* 291F */, /*10528*/"RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND"/* 2920 */,/*10529*/"NORTH WEST AND SOUTH EAST ARROW"/* 2921 */, /*10530*/"NORTH EAST AND SOUTH WEST ARROW"/* 2922 */,/*10531*/"NORTH WEST ARROW WITH HOOK"/* 2923 */, /*10532*/"NORTH EAST ARROW WITH HOOK"/* 2924 */,/*10533*/"SOUTH EAST ARROW WITH HOOK"/* 2925 */, /*10534*/"SOUTH WEST ARROW WITH HOOK"/* 2926 */,/*10535*/"NORTH WEST ARROW AND NORTH EAST ARROW"/* 2927 */, /*10536*/"NORTH EAST ARROW AND SOUTH EAST ARROW"/* 2928 */,/*10537*/"SOUTH EAST ARROW AND SOUTH WEST ARROW"/* 2929 */, /*10538*/"SOUTH WEST ARROW AND NORTH WEST ARROW"/* 292A */, /*10539*/"RISING DIAGONAL CROSSING FALLING DIAGONAL"/* 292B */, /*10540*/"FALLING DIAGONAL CROSSING RISING DIAGONAL"/* 292C */, /*10541*/"SOUTH EAST ARROW CROSSING NORTH EAST ARROW"/* 292D */, /*10542*/"NORTH EAST ARROW CROSSING SOUTH EAST ARROW"/* 292E */, /*10543*/"FALLING DIAGONAL CROSSING NORTH EAST ARROW"/* 292F */, /*10544*/"RISING DIAGONAL CROSSING SOUTH EAST ARROW"/* 2930 */, /*10545*/"NORTH EAST ARROW CROSSING NORTH WEST ARROW"/* 2931 */, /*10546*/"NORTH WEST ARROW CROSSING NORTH EAST ARROW"/* 2932 */,/*10547*/"WAVE ARROW POINTING DIRECTLY RIGHT"/* 2933 */, /*10548*/"ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS"/* 2934 */, /*10549*/"ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS"/* 2935 */, /*10550*/"ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS"/* 2936 */, /*10551*/"ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS"/* 2937 */, /*10552*/"RIGHT-SIDE ARC CLOCKWISE ARROW"/* 2938 */,/*10553*/"LEFT-SIDE ARC ANTICLOCKWISE ARROW"/* 2939 */, /*10554*/"TOP ARC ANTICLOCKWISE ARROW"/* 293A */,/*10555*/"BOTTOM ARC ANTICLOCKWISE ARROW"/* 293B */, /*10556*/"TOP ARC CLOCKWISE ARROW WITH MINUS"/* 293C */,/*10557*/"TOP ARC ANTICLOCKWISE ARROW WITH PLUS"/* 293D */, /*10558*/"LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW"/* 293E */, /*10559*/"LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW"/* 293F */,/*10560*/"ANTICLOCKWISE CLOSED CIRCLE ARROW"/* 2940 */, /*10561*/"CLOCKWISE CLOSED CIRCLE ARROW"/* 2941 */,/*10562*/"RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW"/* 2942 */, /*10563*/"LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW"/* 2943 */, /*10564*/"SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW"/* 2944 */,/*10565*/"RIGHTWARDS ARROW WITH PLUS BELOW"/* 2945 */, /*10566*/"LEFTWARDS ARROW WITH PLUS BELOW"/* 2946 */,/*10567*/"RIGHTWARDS ARROW THROUGH X"/* 2947 */, /*10568*/"LEFT RIGHT ARROW THROUGH SMALL CIRCLE"/* 2948 */, /*10569*/"UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE"/* 2949 */, /*10570*/"LEFT BARB UP RIGHT BARB DOWN HARPOON"/* 294A */,/*10571*/"LEFT BARB DOWN RIGHT BARB UP HARPOON"/* 294B */, /*10572*/"UP BARB RIGHT DOWN BARB LEFT HARPOON"/* 294C */,/*10573*/"UP BARB LEFT DOWN BARB RIGHT HARPOON"/* 294D */, /*10574*/"LEFT BARB UP RIGHT BARB UP HARPOON"/* 294E */,/*10575*/"UP BARB RIGHT DOWN BARB RIGHT HARPOON"/* 294F */, /*10576*/"LEFT BARB DOWN RIGHT BARB DOWN HARPOON"/* 2950 */,/*10577*/"UP BARB LEFT DOWN BARB LEFT HARPOON"/* 2951 */, /*10578*/"LEFTWARDS HARPOON WITH BARB UP TO BAR"/* 2952 */,/*10579*/"RIGHTWARDS HARPOON WITH BARB UP TO BAR"/* 2953 */, /*10580*/"UPWARDS HARPOON WITH BARB RIGHT TO BAR"/* 2954 */, /*10581*/"DOWNWARDS HARPOON WITH BARB RIGHT TO BAR"/* 2955 */, /*10582*/"LEFTWARDS HARPOON WITH BARB DOWN TO BAR"/* 2956 */, /*10583*/"RIGHTWARDS HARPOON WITH BARB DOWN TO BAR"/* 2957 */,/*10584*/"UPWARDS HARPOON WITH BARB LEFT TO BAR"/* 2958 */, /*10585*/"DOWNWARDS HARPOON WITH BARB LEFT TO BAR"/* 2959 */, /*10586*/"LEFTWARDS HARPOON WITH BARB UP FROM BAR"/* 295A */, /*10587*/"RIGHTWARDS HARPOON WITH BARB UP FROM BAR"/* 295B */, /*10588*/"UPWARDS HARPOON WITH BARB RIGHT FROM BAR"/* 295C */, /*10589*/"DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR"/* 295D */, /*10590*/"LEFTWARDS HARPOON WITH BARB DOWN FROM BAR"/* 295E */, /*10591*/"RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR"/* 295F */, /*10592*/"UPWARDS HARPOON WITH BARB LEFT FROM BAR"/* 2960 */, /*10593*/"DOWNWARDS HARPOON WITH BARB LEFT FROM BAR"/* 2961 */, /*10594*/"LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN"/* 2962 */, /*10595*/"UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT"/* 2963 */, /*10596*/"RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN"/* 2964 */, /*10597*/"DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT"/* 2965 */, /*10598*/"LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP"/* 2966 */, /*10599*/"LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN"/* 2967 */, /*10600*/"RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP"/* 2968 */, /*10601*/"RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN"/* 2969 */, /*10602*/"LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH"/* 296A */, /*10603*/"LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH"/* 296B */, /*10604*/"RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH"/* 296C */, /*10605*/"RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH"/* 296D */, /*10606*/"UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT"/* 296E */, /*10607*/"DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT"/* 296F */, /*10608*/"RIGHT DOUBLE ARROW WITH ROUNDED HEAD"/* 2970 */,/*10609*/"EQUALS SIGN ABOVE RIGHTWARDS ARROW"/* 2971 */, /*10610*/"TILDE OPERATOR ABOVE RIGHTWARDS ARROW"/* 2972 */,/*10611*/"LEFTWARDS ARROW ABOVE TILDE OPERATOR"/* 2973 */, /*10612*/"RIGHTWARDS ARROW ABOVE TILDE OPERATOR"/* 2974 */,/*10613*/"RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO"/* 2975 */, /*10614*/"LESS-THAN ABOVE LEFTWARDS ARROW"/* 2976 */,/*10615*/"LEFTWARDS ARROW THROUGH LESS-THAN"/* 2977 */, /*10616*/"GREATER-THAN ABOVE RIGHTWARDS ARROW"/* 2978 */,/*10617*/"SUBSET ABOVE RIGHTWARDS ARROW"/* 2979 */, /*10618*/"LEFTWARDS ARROW THROUGH SUBSET"/* 297A */,/*10619*/"SUPERSET ABOVE LEFTWARDS ARROW"/* 297B */, /*10620*/"LEFT FISH TAIL"/* 297C */,/*10621*/"RIGHT FISH TAIL"/* 297D */,/*10622*/"UP FISH TAIL"/* 297E */, /*10623*/"DOWN FISH TAIL"/* 297F */,/*10624*/"TRIPLE VERTICAL BAR DELIMITER"/* 2980 */, /*10625*/"Z NOTATION SPOT"/* 2981 */,/*10626*/"Z NOTATION TYPE COLON"/* 2982 */, /*10627*/"LEFT WHITE CURLY BRACKET"/* 2983 */,/*10628*/"RIGHT WHITE CURLY BRACKET"/* 2984 */, /*10629*/"LEFT WHITE PARENTHESIS"/* 2985 */,/*10630*/"RIGHT WHITE PARENTHESIS"/* 2986 */, /*10631*/"Z NOTATION LEFT IMAGE BRACKET"/* 2987 */,/*10632*/"Z NOTATION RIGHT IMAGE BRACKET"/* 2988 */, /*10633*/"Z NOTATION LEFT BINDING BRACKET"/* 2989 */,/*10634*/"Z NOTATION RIGHT BINDING BRACKET"/* 298A */, /*10635*/"LEFT SQUARE BRACKET WITH UNDERBAR"/* 298B */,/*10636*/"RIGHT SQUARE BRACKET WITH UNDERBAR"/* 298C */, /*10637*/"LEFT SQUARE BRACKET WITH TICK IN TOP CORNER"/* 298D */, /*10638*/"RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER"/* 298E */, /*10639*/"LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER"/* 298F */, /*10640*/"RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER"/* 2990 */,/*10641*/"LEFT ANGLE BRACKET WITH DOT"/* 2991 */, /*10642*/"RIGHT ANGLE BRACKET WITH DOT"/* 2992 */,/*10643*/"LEFT ARC LESS-THAN BRACKET"/* 2993 */, /*10644*/"RIGHT ARC GREATER-THAN BRACKET"/* 2994 */,/*10645*/"DOUBLE LEFT ARC GREATER-THAN BRACKET"/* 2995 */, /*10646*/"DOUBLE RIGHT ARC LESS-THAN BRACKET"/* 2996 */,/*10647*/"LEFT BLACK TORTOISE SHELL BRACKET"/* 2997 */, /*10648*/"RIGHT BLACK TORTOISE SHELL BRACKET"/* 2998 */,/*10649*/"DOTTED FENCE"/* 2999 */, /*10650*/"VERTICAL ZIGZAG LINE"/* 299A */,/*10651*/"MEASURED ANGLE OPENING LEFT"/* 299B */, /*10652*/"RIGHT ANGLE VARIANT WITH SQUARE"/* 299C */,/*10653*/"MEASURED RIGHT ANGLE WITH DOT"/* 299D */, /*10654*/"ANGLE WITH S INSIDE"/* 299E */,/*10655*/"ACUTE ANGLE"/* 299F */, /*10656*/"SPHERICAL ANGLE OPENING LEFT"/* 29A0 */,/*10657*/"SPHERICAL ANGLE OPENING UP"/* 29A1 */, /*10658*/"TURNED ANGLE"/* 29A2 */,/*10659*/"REVERSED ANGLE"/* 29A3 */,/*10660*/"ANGLE WITH UNDERBAR"/* 29A4 */, /*10661*/"REVERSED ANGLE WITH UNDERBAR"/* 29A5 */,/*10662*/"OBLIQUE ANGLE OPENING UP"/* 29A6 */, /*10663*/"OBLIQUE ANGLE OPENING DOWN"/* 29A7 */, /*10664*/"MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT"/* 29A8 */, /*10665*/"MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT"/* 29A9 */, /*10666*/"MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT"/* 29AA */, /*10667*/"MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT"/* 29AB */, /*10668*/"MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP"/* 29AC */, /*10669*/"MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP"/* 29AD */, /*10670*/"MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN"/* 29AE */, /*10671*/"MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN"/* 29AF */, /*10672*/"REVERSED EMPTY SET"/* 29B0 */,/*10673*/"EMPTY SET WITH OVERBAR"/* 29B1 */, /*10674*/"EMPTY SET WITH SMALL CIRCLE ABOVE"/* 29B2 */,/*10675*/"EMPTY SET WITH RIGHT ARROW ABOVE"/* 29B3 */, /*10676*/"EMPTY SET WITH LEFT ARROW ABOVE"/* 29B4 */,/*10677*/"CIRCLE WITH HORIZONTAL BAR"/* 29B5 */, /*10678*/"CIRCLED VERTICAL BAR"/* 29B6 */,/*10679*/"CIRCLED PARALLEL"/* 29B7 */, /*10680*/"CIRCLED REVERSE SOLIDUS"/* 29B8 */,/*10681*/"CIRCLED PERPENDICULAR"/* 29B9 */, /*10682*/"CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR"/* 29BA */, /*10683*/"CIRCLE WITH SUPERIMPOSED X"/* 29BB */,/*10684*/"CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN"/* 29BC */, /*10685*/"UP ARROW THROUGH CIRCLE"/* 29BD */,/*10686*/"CIRCLED WHITE BULLET"/* 29BE */, /*10687*/"CIRCLED BULLET"/* 29BF */,/*10688*/"CIRCLED LESS-THAN"/* 29C0 */,/*10689*/"CIRCLED GREATER-THAN"/* 29C1 */, /*10690*/"CIRCLE WITH SMALL CIRCLE TO THE RIGHT"/* 29C2 */, /*10691*/"CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT"/* 29C3 */,/*10692*/"SQUARED RISING DIAGONAL SLASH"/* 29C4 */, /*10693*/"SQUARED FALLING DIAGONAL SLASH"/* 29C5 */,/*10694*/"SQUARED ASTERISK"/* 29C6 */, /*10695*/"SQUARED SMALL CIRCLE"/* 29C7 */,/*10696*/"SQUARED SQUARE"/* 29C8 */,/*10697*/"TWO JOINED SQUARES"/* 29C9 */, /*10698*/"TRIANGLE WITH DOT ABOVE"/* 29CA */,/*10699*/"TRIANGLE WITH UNDERBAR"/* 29CB */, /*10700*/"S IN TRIANGLE"/* 29CC */,/*10701*/"TRIANGLE WITH SERIFS AT BOTTOM"/* 29CD */, /*10702*/"RIGHT TRIANGLE ABOVE LEFT TRIANGLE"/* 29CE */,/*10703*/"LEFT TRIANGLE BESIDE VERTICAL BAR"/* 29CF */, /*10704*/"VERTICAL BAR BESIDE RIGHT TRIANGLE"/* 29D0 */,/*10705*/"BOWTIE WITH LEFT HALF BLACK"/* 29D1 */, /*10706*/"BOWTIE WITH RIGHT HALF BLACK"/* 29D2 */,/*10707*/"BLACK BOWTIE"/* 29D3 */, /*10708*/"TIMES WITH LEFT HALF BLACK"/* 29D4 */,/*10709*/"TIMES WITH RIGHT HALF BLACK"/* 29D5 */, /*10710*/"WHITE HOURGLASS"/* 29D6 */,/*10711*/"BLACK HOURGLASS"/* 29D7 */,/*10712*/"LEFT WIGGLY FENCE"/* 29D8 */, /*10713*/"RIGHT WIGGLY FENCE"/* 29D9 */,/*10714*/"LEFT DOUBLE WIGGLY FENCE"/* 29DA */, /*10715*/"RIGHT DOUBLE WIGGLY FENCE"/* 29DB */,/*10716*/"INCOMPLETE INFINITY"/* 29DC */, /*10717*/"TIE OVER INFINITY"/* 29DD */,/*10718*/"INFINITY NEGATED WITH VERTICAL BAR"/* 29DE */, /*10719*/"DOUBLE-ENDED MULTIMAP"/* 29DF */,/*10720*/"SQUARE WITH CONTOURED OUTLINE"/* 29E0 */, /*10721*/"INCREASES AS"/* 29E1 */,/*10722*/"SHUFFLE PRODUCT"/* 29E2 */, /*10723*/"EQUALS SIGN AND SLANTED PARALLEL"/* 29E3 */, /*10724*/"EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE"/* 29E4 */, /*10725*/"IDENTICAL TO AND SLANTED PARALLEL"/* 29E5 */,/*10726*/"GLEICH STARK"/* 29E6 */, /*10727*/"THERMODYNAMIC"/* 29E7 */,/*10728*/"DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK"/* 29E8 */, /*10729*/"DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK"/* 29E9 */,/*10730*/"BLACK DIAMOND WITH DOWN ARROW"/* 29EA */, /*10731*/"BLACK LOZENGE"/* 29EB */,/*10732*/"WHITE CIRCLE WITH DOWN ARROW"/* 29EC */, /*10733*/"BLACK CIRCLE WITH DOWN ARROW"/* 29ED */,/*10734*/"ERROR-BARRED WHITE SQUARE"/* 29EE */, /*10735*/"ERROR-BARRED BLACK SQUARE"/* 29EF */,/*10736*/"ERROR-BARRED WHITE DIAMOND"/* 29F0 */, /*10737*/"ERROR-BARRED BLACK DIAMOND"/* 29F1 */,/*10738*/"ERROR-BARRED WHITE CIRCLE"/* 29F2 */, /*10739*/"ERROR-BARRED BLACK CIRCLE"/* 29F3 */,/*10740*/"RULE-DELAYED"/* 29F4 */, /*10741*/"REVERSE SOLIDUS OPERATOR"/* 29F5 */,/*10742*/"SOLIDUS WITH OVERBAR"/* 29F6 */, /*10743*/"REVERSE SOLIDUS WITH HORIZONTAL STROKE"/* 29F7 */,/*10744*/"BIG SOLIDUS"/* 29F8 */, /*10745*/"BIG REVERSE SOLIDUS"/* 29F9 */,/*10746*/"DOUBLE PLUS"/* 29FA */,/*10747*/"TRIPLE PLUS"/* 29FB */, /*10748*/"LEFT-POINTING CURVED ANGLE BRACKET"/* 29FC */,/*10749*/"RIGHT-POINTING CURVED ANGLE BRACKET"/* 29FD */, /*10750*/"TINY"/* 29FE */,/*10751*/"MINY"/* 29FF */,/*10752*/"N-ARY CIRCLED DOT OPERATOR"/* 2A00 */, /*10753*/"N-ARY CIRCLED PLUS OPERATOR"/* 2A01 */,/*10754*/"N-ARY CIRCLED TIMES OPERATOR"/* 2A02 */, /*10755*/"N-ARY UNION OPERATOR WITH DOT"/* 2A03 */,/*10756*/"N-ARY UNION OPERATOR WITH PLUS"/* 2A04 */, /*10757*/"N-ARY SQUARE INTERSECTION OPERATOR"/* 2A05 */,/*10758*/"N-ARY SQUARE UNION OPERATOR"/* 2A06 */, /*10759*/"TWO LOGICAL AND OPERATOR"/* 2A07 */,/*10760*/"TWO LOGICAL OR OPERATOR"/* 2A08 */, /*10761*/"N-ARY TIMES OPERATOR"/* 2A09 */,/*10762*/"MODULO TWO SUM"/* 2A0A */, /*10763*/"SUMMATION WITH INTEGRAL"/* 2A0B */,/*10764*/"QUADRUPLE INTEGRAL OPERATOR"/* 2A0C */, /*10765*/"FINITE PART INTEGRAL"/* 2A0D */,/*10766*/"INTEGRAL WITH DOUBLE STROKE"/* 2A0E */, /*10767*/"INTEGRAL AVERAGE WITH SLASH"/* 2A0F */,/*10768*/"CIRCULATION FUNCTION"/* 2A10 */, /*10769*/"ANTICLOCKWISE INTEGRATION"/* 2A11 */,/*10770*/"LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE"/* 2A12 */, /*10771*/"LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE"/* 2A13 */, /*10772*/"LINE INTEGRATION NOT INCLUDING THE POLE"/* 2A14 */,/*10773*/"INTEGRAL AROUND A POINT OPERATOR"/* 2A15 */, /*10774*/"QUATERNION INTEGRAL OPERATOR"/* 2A16 */,/*10775*/"INTEGRAL WITH LEFTWARDS ARROW WITH HOOK"/* 2A17 */, /*10776*/"INTEGRAL WITH TIMES SIGN"/* 2A18 */,/*10777*/"INTEGRAL WITH INTERSECTION"/* 2A19 */, /*10778*/"INTEGRAL WITH UNION"/* 2A1A */,/*10779*/"INTEGRAL WITH OVERBAR"/* 2A1B */, /*10780*/"INTEGRAL WITH UNDERBAR"/* 2A1C */,/*10781*/"JOIN"/* 2A1D */,/*10782*/"LARGE LEFT TRIANGLE OPERATOR"/* 2A1E */, /*10783*/"Z NOTATION SCHEMA COMPOSITION"/* 2A1F */,/*10784*/"Z NOTATION SCHEMA PIPING"/* 2A20 */, /*10785*/"Z NOTATION SCHEMA PROJECTION"/* 2A21 */,/*10786*/"PLUS SIGN WITH SMALL CIRCLE ABOVE"/* 2A22 */, /*10787*/"PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE"/* 2A23 */,/*10788*/"PLUS SIGN WITH TILDE ABOVE"/* 2A24 */, /*10789*/"PLUS SIGN WITH DOT BELOW"/* 2A25 */,/*10790*/"PLUS SIGN WITH TILDE BELOW"/* 2A26 */, /*10791*/"PLUS SIGN WITH SUBSCRIPT TWO"/* 2A27 */,/*10792*/"PLUS SIGN WITH BLACK TRIANGLE"/* 2A28 */, /*10793*/"MINUS SIGN WITH COMMA ABOVE"/* 2A29 */,/*10794*/"MINUS SIGN WITH DOT BELOW"/* 2A2A */, /*10795*/"MINUS SIGN WITH FALLING DOTS"/* 2A2B */,/*10796*/"MINUS SIGN WITH RISING DOTS"/* 2A2C */, /*10797*/"PLUS SIGN IN LEFT HALF CIRCLE"/* 2A2D */,/*10798*/"PLUS SIGN IN RIGHT HALF CIRCLE"/* 2A2E */, /*10799*/"VECTOR OR CROSS PRODUCT"/* 2A2F */,/*10800*/"MULTIPLICATION SIGN WITH DOT ABOVE"/* 2A30 */, /*10801*/"MULTIPLICATION SIGN WITH UNDERBAR"/* 2A31 */,/*10802*/"SEMIDIRECT PRODUCT WITH BOTTOM CLOSED"/* 2A32 */, /*10803*/"SMASH PRODUCT"/* 2A33 */,/*10804*/"MULTIPLICATION SIGN IN LEFT HALF CIRCLE"/* 2A34 */, /*10805*/"MULTIPLICATION SIGN IN RIGHT HALF CIRCLE"/* 2A35 */, /*10806*/"CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT"/* 2A36 */, /*10807*/"MULTIPLICATION SIGN IN DOUBLE CIRCLE"/* 2A37 */,/*10808*/"CIRCLED DIVISION SIGN"/* 2A38 */, /*10809*/"PLUS SIGN IN TRIANGLE"/* 2A39 */,/*10810*/"MINUS SIGN IN TRIANGLE"/* 2A3A */, /*10811*/"MULTIPLICATION SIGN IN TRIANGLE"/* 2A3B */,/*10812*/"INTERIOR PRODUCT"/* 2A3C */, /*10813*/"RIGHTHAND INTERIOR PRODUCT"/* 2A3D */,/*10814*/"Z NOTATION RELATIONAL COMPOSITION"/* 2A3E */, /*10815*/"AMALGAMATION OR COPRODUCT"/* 2A3F */,/*10816*/"INTERSECTION WITH DOT"/* 2A40 */, /*10817*/"UNION WITH MINUS SIGN"/* 2A41 */,/*10818*/"UNION WITH OVERBAR"/* 2A42 */, /*10819*/"INTERSECTION WITH OVERBAR"/* 2A43 */,/*10820*/"INTERSECTION WITH LOGICAL AND"/* 2A44 */, /*10821*/"UNION WITH LOGICAL OR"/* 2A45 */,/*10822*/"UNION ABOVE INTERSECTION"/* 2A46 */, /*10823*/"INTERSECTION ABOVE UNION"/* 2A47 */,/*10824*/"UNION ABOVE BAR ABOVE INTERSECTION"/* 2A48 */, /*10825*/"INTERSECTION ABOVE BAR ABOVE UNION"/* 2A49 */,/*10826*/"UNION BESIDE AND JOINED WITH UNION"/* 2A4A */, /*10827*/"INTERSECTION BESIDE AND JOINED WITH INTERSECTION"/* 2A4B */,/*10828*/"CLOSED UNION WITH SERIFS"/* 2A4C */, /*10829*/"CLOSED INTERSECTION WITH SERIFS"/* 2A4D */,/*10830*/"DOUBLE SQUARE INTERSECTION"/* 2A4E */, /*10831*/"DOUBLE SQUARE UNION"/* 2A4F */,/*10832*/"CLOSED UNION WITH SERIFS AND SMASH PRODUCT"/* 2A50 */, /*10833*/"LOGICAL AND WITH DOT ABOVE"/* 2A51 */,/*10834*/"LOGICAL OR WITH DOT ABOVE"/* 2A52 */, /*10835*/"DOUBLE LOGICAL AND"/* 2A53 */,/*10836*/"DOUBLE LOGICAL OR"/* 2A54 */, /*10837*/"TWO INTERSECTING LOGICAL AND"/* 2A55 */,/*10838*/"TWO INTERSECTING LOGICAL OR"/* 2A56 */, /*10839*/"SLOPING LARGE OR"/* 2A57 */,/*10840*/"SLOPING LARGE AND"/* 2A58 */, /*10841*/"LOGICAL OR OVERLAPPING LOGICAL AND"/* 2A59 */,/*10842*/"LOGICAL AND WITH MIDDLE STEM"/* 2A5A */, /*10843*/"LOGICAL OR WITH MIDDLE STEM"/* 2A5B */,/*10844*/"LOGICAL AND WITH HORIZONTAL DASH"/* 2A5C */, /*10845*/"LOGICAL OR WITH HORIZONTAL DASH"/* 2A5D */,/*10846*/"LOGICAL AND WITH DOUBLE OVERBAR"/* 2A5E */, /*10847*/"LOGICAL AND WITH UNDERBAR"/* 2A5F */,/*10848*/"LOGICAL AND WITH DOUBLE UNDERBAR"/* 2A60 */, /*10849*/"SMALL VEE WITH UNDERBAR"/* 2A61 */,/*10850*/"LOGICAL OR WITH DOUBLE OVERBAR"/* 2A62 */, /*10851*/"LOGICAL OR WITH DOUBLE UNDERBAR"/* 2A63 */,/*10852*/"Z NOTATION DOMAIN ANTIRESTRICTION"/* 2A64 */, /*10853*/"Z NOTATION RANGE ANTIRESTRICTION"/* 2A65 */,/*10854*/"EQUALS SIGN WITH DOT BELOW"/* 2A66 */, /*10855*/"IDENTICAL WITH DOT ABOVE"/* 2A67 */,/*10856*/"TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE"/* 2A68 */, /*10857*/"TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE"/* 2A69 */, /*10858*/"TILDE OPERATOR WITH DOT ABOVE"/* 2A6A */,/*10859*/"TILDE OPERATOR WITH RISING DOTS"/* 2A6B */, /*10860*/"SIMILAR MINUS SIMILAR"/* 2A6C */,/*10861*/"CONGRUENT WITH DOT ABOVE"/* 2A6D */, /*10862*/"EQUALS WITH ASTERISK"/* 2A6E */,/*10863*/"ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT"/* 2A6F */, /*10864*/"APPROXIMATELY EQUAL OR EQUAL TO"/* 2A70 */,/*10865*/"EQUALS SIGN ABOVE PLUS SIGN"/* 2A71 */, /*10866*/"PLUS SIGN ABOVE EQUALS SIGN"/* 2A72 */,/*10867*/"EQUALS SIGN ABOVE TILDE OPERATOR"/* 2A73 */, /*10868*/"DOUBLE COLON EQUAL"/* 2A74 */,/*10869*/"TWO CONSECUTIVE EQUALS SIGNS"/* 2A75 */, /*10870*/"THREE CONSECUTIVE EQUALS SIGNS"/* 2A76 */, /*10871*/"EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW"/* 2A77 */, /*10872*/"EQUIVALENT WITH FOUR DOTS ABOVE"/* 2A78 */,/*10873*/"LESS-THAN WITH CIRCLE INSIDE"/* 2A79 */, /*10874*/"GREATER-THAN WITH CIRCLE INSIDE"/* 2A7A */,/*10875*/"LESS-THAN WITH QUESTION MARK ABOVE"/* 2A7B */, /*10876*/"GREATER-THAN WITH QUESTION MARK ABOVE"/* 2A7C */,/*10877*/"LESS-THAN OR SLANTED EQUAL TO"/* 2A7D */, /*10878*/"GREATER-THAN OR SLANTED EQUAL TO"/* 2A7E */,/*10879*/"LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE"/* 2A7F */, /*10880*/"GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE"/* 2A80 */, /*10881*/"LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE"/* 2A81 */, /*10882*/"GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE"/* 2A82 */, /*10883*/"LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT"/* 2A83 */, /*10884*/"GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT"/* 2A84 */,/*10885*/"LESS-THAN OR APPROXIMATE"/* 2A85 */, /*10886*/"GREATER-THAN OR APPROXIMATE"/* 2A86 */,/*10887*/"LESS-THAN AND SINGLE-LINE NOT EQUAL TO"/* 2A87 */, /*10888*/"GREATER-THAN AND SINGLE-LINE NOT EQUAL TO"/* 2A88 */,/*10889*/"LESS-THAN AND NOT APPROXIMATE"/* 2A89 */, /*10890*/"GREATER-THAN AND NOT APPROXIMATE"/* 2A8A */, /*10891*/"LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN"/* 2A8B */, /*10892*/"GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN"/* 2A8C */, /*10893*/"LESS-THAN ABOVE SIMILAR OR EQUAL"/* 2A8D */,/*10894*/"GREATER-THAN ABOVE SIMILAR OR EQUAL"/* 2A8E */, /*10895*/"LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN"/* 2A8F */, /*10896*/"GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN"/* 2A90 */, /*10897*/"LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL"/* 2A91 */, /*10898*/"GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL"/* 2A92 */, /*10899*/"LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL"/* 2A93 */, /*10900*/"GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL"/* 2A94 */, /*10901*/"SLANTED EQUAL TO OR LESS-THAN"/* 2A95 */,/*10902*/"SLANTED EQUAL TO OR GREATER-THAN"/* 2A96 */, /*10903*/"SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE"/* 2A97 */, /*10904*/"SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE"/* 2A98 */, /*10905*/"DOUBLE-LINE EQUAL TO OR LESS-THAN"/* 2A99 */,/*10906*/"DOUBLE-LINE EQUAL TO OR GREATER-THAN"/* 2A9A */, /*10907*/"DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN"/* 2A9B */, /*10908*/"DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN"/* 2A9C */,/*10909*/"SIMILAR OR LESS-THAN"/* 2A9D */, /*10910*/"SIMILAR OR GREATER-THAN"/* 2A9E */,/*10911*/"SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN"/* 2A9F */, /*10912*/"SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN"/* 2AA0 */,/*10913*/"DOUBLE NESTED LESS-THAN"/* 2AA1 */, /*10914*/"DOUBLE NESTED GREATER-THAN"/* 2AA2 */,/*10915*/"DOUBLE NESTED LESS-THAN WITH UNDERBAR"/* 2AA3 */, /*10916*/"GREATER-THAN OVERLAPPING LESS-THAN"/* 2AA4 */,/*10917*/"GREATER-THAN BESIDE LESS-THAN"/* 2AA5 */, /*10918*/"LESS-THAN CLOSED BY CURVE"/* 2AA6 */,/*10919*/"GREATER-THAN CLOSED BY CURVE"/* 2AA7 */, /*10920*/"LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL"/* 2AA8 */, /*10921*/"GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL"/* 2AA9 */,/*10922*/"SMALLER THAN"/* 2AAA */, /*10923*/"LARGER THAN"/* 2AAB */,/*10924*/"SMALLER THAN OR EQUAL TO"/* 2AAC */, /*10925*/"LARGER THAN OR EQUAL TO"/* 2AAD */,/*10926*/"EQUALS SIGN WITH BUMPY ABOVE"/* 2AAE */, /*10927*/"PRECEDES ABOVE SINGLE-LINE EQUALS SIGN"/* 2AAF */,/*10928*/"SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN"/* 2AB0 */, /*10929*/"PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO"/* 2AB1 */, /*10930*/"SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO"/* 2AB2 */,/*10931*/"PRECEDES ABOVE EQUALS SIGN"/* 2AB3 */, /*10932*/"SUCCEEDS ABOVE EQUALS SIGN"/* 2AB4 */,/*10933*/"PRECEDES ABOVE NOT EQUAL TO"/* 2AB5 */, /*10934*/"SUCCEEDS ABOVE NOT EQUAL TO"/* 2AB6 */,/*10935*/"PRECEDES ABOVE ALMOST EQUAL TO"/* 2AB7 */, /*10936*/"SUCCEEDS ABOVE ALMOST EQUAL TO"/* 2AB8 */,/*10937*/"PRECEDES ABOVE NOT ALMOST EQUAL TO"/* 2AB9 */, /*10938*/"SUCCEEDS ABOVE NOT ALMOST EQUAL TO"/* 2ABA */,/*10939*/"DOUBLE PRECEDES"/* 2ABB */, /*10940*/"DOUBLE SUCCEEDS"/* 2ABC */,/*10941*/"SUBSET WITH DOT"/* 2ABD */,/*10942*/"SUPERSET WITH DOT"/* 2ABE */, /*10943*/"SUBSET WITH PLUS SIGN BELOW"/* 2ABF */,/*10944*/"SUPERSET WITH PLUS SIGN BELOW"/* 2AC0 */, /*10945*/"SUBSET WITH MULTIPLICATION SIGN BELOW"/* 2AC1 */,/*10946*/"SUPERSET WITH MULTIPLICATION SIGN BELOW"/* 2AC2 */, /*10947*/"SUBSET OF OR EQUAL TO WITH DOT ABOVE"/* 2AC3 */,/*10948*/"SUPERSET OF OR EQUAL TO WITH DOT ABOVE"/* 2AC4 */, /*10949*/"SUBSET OF ABOVE EQUALS SIGN"/* 2AC5 */,/*10950*/"SUPERSET OF ABOVE EQUALS SIGN"/* 2AC6 */, /*10951*/"SUBSET OF ABOVE TILDE OPERATOR"/* 2AC7 */,/*10952*/"SUPERSET OF ABOVE TILDE OPERATOR"/* 2AC8 */, /*10953*/"SUBSET OF ABOVE ALMOST EQUAL TO"/* 2AC9 */,/*10954*/"SUPERSET OF ABOVE ALMOST EQUAL TO"/* 2ACA */, /*10955*/"SUBSET OF ABOVE NOT EQUAL TO"/* 2ACB */,/*10956*/"SUPERSET OF ABOVE NOT EQUAL TO"/* 2ACC */, /*10957*/"SQUARE LEFT OPEN BOX OPERATOR"/* 2ACD */,/*10958*/"SQUARE RIGHT OPEN BOX OPERATOR"/* 2ACE */, /*10959*/"CLOSED SUBSET"/* 2ACF */,/*10960*/"CLOSED SUPERSET"/* 2AD0 */,/*10961*/"CLOSED SUBSET OR EQUAL TO"/* 2AD1 */, /*10962*/"CLOSED SUPERSET OR EQUAL TO"/* 2AD2 */,/*10963*/"SUBSET ABOVE SUPERSET"/* 2AD3 */, /*10964*/"SUPERSET ABOVE SUBSET"/* 2AD4 */,/*10965*/"SUBSET ABOVE SUBSET"/* 2AD5 */, /*10966*/"SUPERSET ABOVE SUPERSET"/* 2AD6 */,/*10967*/"SUPERSET BESIDE SUBSET"/* 2AD7 */, /*10968*/"SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET"/* 2AD8 */,/*10969*/"ELEMENT OF OPENING DOWNWARDS"/* 2AD9 */, /*10970*/"PITCHFORK WITH TEE TOP"/* 2ADA */,/*10971*/"TRANSVERSAL INTERSECTION"/* 2ADB */,/*10972*/"FORKING"/* 2ADC */, /*10973*/"NONFORKING"/* 2ADD */,/*10974*/"SHORT LEFT TACK"/* 2ADE */,/*10975*/"SHORT DOWN TACK"/* 2ADF */, /*10976*/"SHORT UP TACK"/* 2AE0 */,/*10977*/"PERPENDICULAR WITH S"/* 2AE1 */, /*10978*/"VERTICAL BAR TRIPLE RIGHT TURNSTILE"/* 2AE2 */,/*10979*/"DOUBLE VERTICAL BAR LEFT TURNSTILE"/* 2AE3 */, /*10980*/"VERTICAL BAR DOUBLE LEFT TURNSTILE"/* 2AE4 */,/*10981*/"DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE"/* 2AE5 */, /*10982*/"LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL"/* 2AE6 */,/*10983*/"SHORT DOWN TACK WITH OVERBAR"/* 2AE7 */, /*10984*/"SHORT UP TACK WITH UNDERBAR"/* 2AE8 */,/*10985*/"SHORT UP TACK ABOVE SHORT DOWN TACK"/* 2AE9 */, /*10986*/"DOUBLE DOWN TACK"/* 2AEA */,/*10987*/"DOUBLE UP TACK"/* 2AEB */,/*10988*/"DOUBLE STROKE NOT SIGN"/* 2AEC */, /*10989*/"REVERSED DOUBLE STROKE NOT SIGN"/* 2AED */,/*10990*/"DOES NOT DIVIDE WITH REVERSED NEGATION SLASH"/* 2AEE */, /*10991*/"VERTICAL LINE WITH CIRCLE ABOVE"/* 2AEF */,/*10992*/"VERTICAL LINE WITH CIRCLE BELOW"/* 2AF0 */, /*10993*/"DOWN TACK WITH CIRCLE BELOW"/* 2AF1 */,/*10994*/"PARALLEL WITH HORIZONTAL STROKE"/* 2AF2 */, /*10995*/"PARALLEL WITH TILDE OPERATOR"/* 2AF3 */,/*10996*/"TRIPLE VERTICAL BAR BINARY RELATION"/* 2AF4 */, /*10997*/"TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE"/* 2AF5 */,/*10998*/"TRIPLE COLON OPERATOR"/* 2AF6 */, /*10999*/"TRIPLE NESTED LESS-THAN"/* 2AF7 */,/*11000*/"TRIPLE NESTED GREATER-THAN"/* 2AF8 */, /*11001*/"DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO"/* 2AF9 */, /*11002*/"DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO"/* 2AFA */,/*11003*/"TRIPLE SOLIDUS BINARY RELATION"/* 2AFB */, /*11004*/"LARGE TRIPLE VERTICAL BAR OPERATOR"/* 2AFC */,/*11005*/"DOUBLE SOLIDUS OPERATOR"/* 2AFD */, /*11006*/"WHITE VERTICAL BAR"/* 2AFE */,/*11007*/"N-ARY WHITE VERTICAL BAR"/* 2AFF */, /*11008*/"NORTH EAST WHITE ARROW"/* 2B00 */,/*11009*/"NORTH WEST WHITE ARROW"/* 2B01 */, /*11010*/"SOUTH EAST WHITE ARROW"/* 2B02 */,/*11011*/"SOUTH WEST WHITE ARROW"/* 2B03 */, /*11012*/"LEFT RIGHT WHITE ARROW"/* 2B04 */,/*11013*/"LEFTWARDS BLACK ARROW"/* 2B05 */, /*11014*/"UPWARDS BLACK ARROW"/* 2B06 */,/*11015*/"DOWNWARDS BLACK ARROW"/* 2B07 */, /*11016*/"NORTH EAST BLACK ARROW"/* 2B08 */,/*11017*/"NORTH WEST BLACK ARROW"/* 2B09 */, /*11018*/"SOUTH EAST BLACK ARROW"/* 2B0A */,/*11019*/"SOUTH WEST BLACK ARROW"/* 2B0B */, /*11020*/"LEFT RIGHT BLACK ARROW"/* 2B0C */,/*11021*/"UP DOWN BLACK ARROW"/* 2B0D */, /*11022*/"RIGHTWARDS ARROW WITH TIP DOWNWARDS"/* 2B0E */,/*11023*/"RIGHTWARDS ARROW WITH TIP UPWARDS"/* 2B0F */, /*11024*/"LEFTWARDS ARROW WITH TIP DOWNWARDS"/* 2B10 */,/*11025*/"LEFTWARDS ARROW WITH TIP UPWARDS"/* 2B11 */, /*11026*/"SQUARE WITH TOP HALF BLACK"/* 2B12 */,/*11027*/"SQUARE WITH BOTTOM HALF BLACK"/* 2B13 */, /*11028*/"SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK"/* 2B14 */, /*11029*/"SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK"/* 2B15 */,/*11030*/"DIAMOND WITH LEFT HALF BLACK"/* 2B16 */, /*11031*/"DIAMOND WITH RIGHT HALF BLACK"/* 2B17 */,/*11032*/"DIAMOND WITH TOP HALF BLACK"/* 2B18 */, /*11033*/"DIAMOND WITH BOTTOM HALF BLACK"/* 2B19 */,/*11034*/"DOTTED SQUARE"/* 2B1A */, /*11035*/"BLACK LARGE SQUARE"/* 2B1B */,/*11036*/"WHITE LARGE SQUARE"/* 2B1C */, /*11037*/"BLACK VERY SMALL SQUARE"/* 2B1D */,/*11038*/"WHITE VERY SMALL SQUARE"/* 2B1E */, /*11039*/"BLACK PENTAGON"/* 2B1F */,/*11040*/"WHITE PENTAGON"/* 2B20 */,/*11041*/"WHITE HEXAGON"/* 2B21 */, /*11042*/"BLACK HEXAGON"/* 2B22 */,/*11043*/"HORIZONTAL BLACK HEXAGON"/* 2B23 */,/*11044*/"BLACK LARGE CIRCLE"/* 2B24 */, /*11045*/"BLACK MEDIUM DIAMOND"/* 2B25 */,/*11046*/"WHITE MEDIUM DIAMOND"/* 2B26 */, /*11047*/"BLACK MEDIUM LOZENGE"/* 2B27 */,/*11048*/"WHITE MEDIUM LOZENGE"/* 2B28 */, /*11049*/"BLACK SMALL DIAMOND"/* 2B29 */,/*11050*/"BLACK SMALL LOZENGE"/* 2B2A */, /*11051*/"WHITE SMALL LOZENGE"/* 2B2B */,/*11052*/"BLACK HORIZONTAL ELLIPSE"/* 2B2C */, /*11053*/"WHITE HORIZONTAL ELLIPSE"/* 2B2D */,/*11054*/"BLACK VERTICAL ELLIPSE"/* 2B2E */, /*11055*/"WHITE VERTICAL ELLIPSE"/* 2B2F */,/*11056*/"LEFT ARROW WITH SMALL CIRCLE"/* 2B30 */, /*11057*/"THREE LEFTWARDS ARROWS"/* 2B31 */,/*11058*/"LEFT ARROW WITH CIRCLED PLUS"/* 2B32 */, /*11059*/"LONG LEFTWARDS SQUIGGLE ARROW"/* 2B33 */,/*11060*/"LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE"/* 2B34 */, /*11061*/"LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE"/* 2B35 */, /*11062*/"LEFTWARDS TWO-HEADED ARROW FROM BAR"/* 2B36 */,/*11063*/"LEFTWARDS TWO-HEADED TRIPLE DASH ARROW"/* 2B37 */, /*11064*/"LEFTWARDS ARROW WITH DOTTED STEM"/* 2B38 */, /*11065*/"LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE"/* 2B39 */, /*11066*/"LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE"/* 2B3A */, /*11067*/"LEFTWARDS TWO-HEADED ARROW WITH TAIL"/* 2B3B */, /*11068*/"LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE"/* 2B3C */, /*11069*/"LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE"/* 2B3D */, /*11070*/"LEFTWARDS ARROW THROUGH X"/* 2B3E */,/*11071*/"WAVE ARROW POINTING DIRECTLY LEFT"/* 2B3F */, /*11072*/"EQUALS SIGN ABOVE LEFTWARDS ARROW"/* 2B40 */,/*11073*/"REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW"/* 2B41 */, /*11074*/"LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO"/* 2B42 */, /*11075*/"RIGHTWARDS ARROW THROUGH GREATER-THAN"/* 2B43 */,/*11076*/"RIGHTWARDS ARROW THROUGH SUPERSET"/* 2B44 */, /*11077*/"LEFTWARDS QUADRUPLE ARROW"/* 2B45 */,/*11078*/"RIGHTWARDS QUADRUPLE ARROW"/* 2B46 */, /*11079*/"REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW"/* 2B47 */, /*11080*/"RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO"/* 2B48 */, /*11081*/"TILDE OPERATOR ABOVE LEFTWARDS ARROW"/* 2B49 */,/*11082*/"LEFTWARDS ARROW ABOVE ALMOST EQUAL TO"/* 2B4A */, /*11083*/"LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR"/* 2B4B */, /*11084*/"RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR"/* 2B4C */, /*11085*/"DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW"/* 2B4D */,/*11086*/"SHORT SLANTED NORTH ARROW"/* 2B4E */, /*11087*/"SHORT BACKSLANTED SOUTH ARROW"/* 2B4F */,/*11088*/"WHITE MEDIUM STAR"/* 2B50 */, /*11089*/"BLACK SMALL STAR"/* 2B51 */,/*11090*/"WHITE SMALL STAR"/* 2B52 */, /*11091*/"BLACK RIGHT-POINTING PENTAGON"/* 2B53 */,/*11092*/"WHITE RIGHT-POINTING PENTAGON"/* 2B54 */, /*11093*/"HEAVY LARGE CIRCLE"/* 2B55 */,/*11094*/"HEAVY OVAL WITH OVAL INSIDE"/* 2B56 */, /*11095*/"HEAVY CIRCLE WITH CIRCLE INSIDE"/* 2B57 */,/*11096*/"HEAVY CIRCLE"/* 2B58 */, /*11097*/"HEAVY CIRCLED SALTIRE"/* 2B59 */,/*11098*/"SLANTED NORTH ARROW WITH HOOKED HEAD"/* 2B5A */, /*11099*/"BACKSLANTED SOUTH ARROW WITH HOOKED TAIL"/* 2B5B */, /*11100*/"SLANTED NORTH ARROW WITH HORIZONTAL TAIL"/* 2B5C */, /*11101*/"BACKSLANTED SOUTH ARROW WITH HORIZONTAL TAIL"/* 2B5D */, /*11102*/"BENT ARROW POINTING DOWNWARDS THEN NORTH EAST"/* 2B5E */, /*11103*/"SHORT BENT ARROW POINTING DOWNWARDS THEN NORTH EAST"/* 2B5F */, /*11104*/"LEFTWARDS TRIANGLE-HEADED ARROW"/* 2B60 */,/*11105*/"UPWARDS TRIANGLE-HEADED ARROW"/* 2B61 */, /*11106*/"RIGHTWARDS TRIANGLE-HEADED ARROW"/* 2B62 */,/*11107*/"DOWNWARDS TRIANGLE-HEADED ARROW"/* 2B63 */, /*11108*/"LEFT RIGHT TRIANGLE-HEADED ARROW"/* 2B64 */,/*11109*/"UP DOWN TRIANGLE-HEADED ARROW"/* 2B65 */, /*11110*/"NORTH WEST TRIANGLE-HEADED ARROW"/* 2B66 */,/*11111*/"NORTH EAST TRIANGLE-HEADED ARROW"/* 2B67 */, /*11112*/"SOUTH EAST TRIANGLE-HEADED ARROW"/* 2B68 */,/*11113*/"SOUTH WEST TRIANGLE-HEADED ARROW"/* 2B69 */, /*11114*/"LEFTWARDS TRIANGLE-HEADED DASHED ARROW"/* 2B6A */,/*11115*/"UPWARDS TRIANGLE-HEADED DASHED ARROW"/* 2B6B */, /*11116*/"RIGHTWARDS TRIANGLE-HEADED DASHED ARROW"/* 2B6C */,/*11117*/"DOWNWARDS TRIANGLE-HEADED DASHED ARROW"/* 2B6D */, /*11118*/"CLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW"/* 2B6E */, /*11119*/"ANTICLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW"/* 2B6F */, /*11120*/"LEFTWARDS TRIANGLE-HEADED ARROW TO BAR"/* 2B70 */,/*11121*/"UPWARDS TRIANGLE-HEADED ARROW TO BAR"/* 2B71 */, /*11122*/"RIGHTWARDS TRIANGLE-HEADED ARROW TO BAR"/* 2B72 */,/*11123*/"DOWNWARDS TRIANGLE-HEADED ARROW TO BAR"/* 2B73 */, NULL,NULL,/*11126*/"NORTH WEST TRIANGLE-HEADED ARROW TO BAR"/* 2B76 */, /*11127*/"NORTH EAST TRIANGLE-HEADED ARROW TO BAR"/* 2B77 */, /*11128*/"SOUTH EAST TRIANGLE-HEADED ARROW TO BAR"/* 2B78 */, /*11129*/"SOUTH WEST TRIANGLE-HEADED ARROW TO BAR"/* 2B79 */, /*11130*/"LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE"/* 2B7A */, /*11131*/"UPWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE"/* 2B7B */, /*11132*/"RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE"/* 2B7C */, /*11133*/"DOWNWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE"/* 2B7D */, /*11134*/"HORIZONTAL TAB KEY"/* 2B7E */,/*11135*/"VERTICAL TAB KEY"/* 2B7F */, /*11136*/"LEFTWARDS TRIANGLE-HEADED ARROW OVER RIGHTWARDS TRIANGLE-HEADED ARROW"/* 2B80 */, /*11137*/"UPWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF DOWNWARDS TRIANGLE-HEADED ARROW"/* 2B81 */, /*11138*/"RIGHTWARDS TRIANGLE-HEADED ARROW OVER LEFTWARDS TRIANGLE-HEADED ARROW"/* 2B82 */, /*11139*/"DOWNWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF UPWARDS TRIANGLE-HEADED ARROW"/* 2B83 */, /*11140*/"LEFTWARDS TRIANGLE-HEADED PAIRED ARROWS"/* 2B84 */,/*11141*/"UPWARDS TRIANGLE-HEADED PAIRED ARROWS"/* 2B85 */, /*11142*/"RIGHTWARDS TRIANGLE-HEADED PAIRED ARROWS"/* 2B86 */, /*11143*/"DOWNWARDS TRIANGLE-HEADED PAIRED ARROWS"/* 2B87 */,/*11144*/"LEFTWARDS BLACK CIRCLED WHITE ARROW"/* 2B88 */, /*11145*/"UPWARDS BLACK CIRCLED WHITE ARROW"/* 2B89 */,/*11146*/"RIGHTWARDS BLACK CIRCLED WHITE ARROW"/* 2B8A */, /*11147*/"DOWNWARDS BLACK CIRCLED WHITE ARROW"/* 2B8B */, /*11148*/"ANTICLOCKWISE TRIANGLE-HEADED RIGHT U-SHAPED ARROW"/* 2B8C */, /*11149*/"ANTICLOCKWISE TRIANGLE-HEADED BOTTOM U-SHAPED ARROW"/* 2B8D */, /*11150*/"ANTICLOCKWISE TRIANGLE-HEADED LEFT U-SHAPED ARROW"/* 2B8E */, /*11151*/"ANTICLOCKWISE TRIANGLE-HEADED TOP U-SHAPED ARROW"/* 2B8F */,/*11152*/"RETURN LEFT"/* 2B90 */, /*11153*/"RETURN RIGHT"/* 2B91 */,/*11154*/"NEWLINE LEFT"/* 2B92 */,/*11155*/"NEWLINE RIGHT"/* 2B93 */, /*11156*/"FOUR CORNER ARROWS CIRCLING ANTICLOCKWISE"/* 2B94 */,/*11157*/"RIGHTWARDS BLACK ARROW"/* 2B95 */,NULL,NULL, /*11160*/"THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD"/* 2B98 */, /*11161*/"THREE-D RIGHT-LIGHTED UPWARDS EQUILATERAL ARROWHEAD"/* 2B99 */, /*11162*/"THREE-D TOP-LIGHTED RIGHTWARDS EQUILATERAL ARROWHEAD"/* 2B9A */, /*11163*/"THREE-D LEFT-LIGHTED DOWNWARDS EQUILATERAL ARROWHEAD"/* 2B9B */, /*11164*/"BLACK LEFTWARDS EQUILATERAL ARROWHEAD"/* 2B9C */,/*11165*/"BLACK UPWARDS EQUILATERAL ARROWHEAD"/* 2B9D */, /*11166*/"BLACK RIGHTWARDS EQUILATERAL ARROWHEAD"/* 2B9E */,/*11167*/"BLACK DOWNWARDS EQUILATERAL ARROWHEAD"/* 2B9F */, /*11168*/"DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS"/* 2BA0 */, /*11169*/"DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS"/* 2BA1 */, /*11170*/"UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS"/* 2BA2 */, /*11171*/"UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS"/* 2BA3 */, /*11172*/"LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS"/* 2BA4 */, /*11173*/"RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS"/* 2BA5 */, /*11174*/"LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS"/* 2BA6 */, /*11175*/"RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS"/* 2BA7 */, /*11176*/"BLACK CURVED DOWNWARDS AND LEFTWARDS ARROW"/* 2BA8 */, /*11177*/"BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW"/* 2BA9 */, /*11178*/"BLACK CURVED UPWARDS AND LEFTWARDS ARROW"/* 2BAA */, /*11179*/"BLACK CURVED UPWARDS AND RIGHTWARDS ARROW"/* 2BAB */, /*11180*/"BLACK CURVED LEFTWARDS AND UPWARDS ARROW"/* 2BAC */, /*11181*/"BLACK CURVED RIGHTWARDS AND UPWARDS ARROW"/* 2BAD */, /*11182*/"BLACK CURVED LEFTWARDS AND DOWNWARDS ARROW"/* 2BAE */, /*11183*/"BLACK CURVED RIGHTWARDS AND DOWNWARDS ARROW"/* 2BAF */,/*11184*/"RIBBON ARROW DOWN LEFT"/* 2BB0 */, /*11185*/"RIBBON ARROW DOWN RIGHT"/* 2BB1 */,/*11186*/"RIBBON ARROW UP LEFT"/* 2BB2 */, /*11187*/"RIBBON ARROW UP RIGHT"/* 2BB3 */,/*11188*/"RIBBON ARROW LEFT UP"/* 2BB4 */, /*11189*/"RIBBON ARROW RIGHT UP"/* 2BB5 */,/*11190*/"RIBBON ARROW LEFT DOWN"/* 2BB6 */, /*11191*/"RIBBON ARROW RIGHT DOWN"/* 2BB7 */,/*11192*/"UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR"/* 2BB8 */, /*11193*/"UP ARROWHEAD IN A RECTANGLE BOX"/* 2BB9 */,NULL,NULL,NULL,/*11197*/"BALLOT BOX WITH LIGHT X"/* 2BBD */, /*11198*/"CIRCLED X"/* 2BBE */,/*11199*/"CIRCLED BOLD X"/* 2BBF */,/*11200*/"BLACK SQUARE CENTRED"/* 2BC0 */, /*11201*/"BLACK DIAMOND CENTRED"/* 2BC1 */,/*11202*/"TURNED BLACK PENTAGON"/* 2BC2 */, /*11203*/"HORIZONTAL BLACK OCTAGON"/* 2BC3 */,/*11204*/"BLACK OCTAGON"/* 2BC4 */, /*11205*/"BLACK MEDIUM UP-POINTING TRIANGLE CENTRED"/* 2BC5 */, /*11206*/"BLACK MEDIUM DOWN-POINTING TRIANGLE CENTRED"/* 2BC6 */, /*11207*/"BLACK MEDIUM LEFT-POINTING TRIANGLE CENTRED"/* 2BC7 */, /*11208*/"BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED"/* 2BC8 */,NULL,/*11210*/"TOP HALF BLACK CIRCLE"/* 2BCA */, /*11211*/"BOTTOM HALF BLACK CIRCLE"/* 2BCB */,/*11212*/"LIGHT FOUR POINTED BLACK CUSP"/* 2BCC */, /*11213*/"ROTATED LIGHT FOUR POINTED BLACK CUSP"/* 2BCD */,/*11214*/"WHITE FOUR POINTED CUSP"/* 2BCE */, /*11215*/"ROTATED WHITE FOUR POINTED CUSP"/* 2BCF */,/*11216*/"SQUARE POSITION INDICATOR"/* 2BD0 */, /*11217*/"UNCERTAINTY SIGN"/* 2BD1 */,/*11218*/"GROUP MARK"/* 2BD2 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*11244*/"LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS"/* 2BEC */, /*11245*/"UPWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS"/* 2BED */, /*11246*/"RIGHTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS"/* 2BEE */, /*11247*/"DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS"/* 2BEF */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*11264*/"GLAGOLITIC CAPITAL LETTER AZU"/* 2C00 */, /*11265*/"GLAGOLITIC CAPITAL LETTER BUKY"/* 2C01 */,/*11266*/"GLAGOLITIC CAPITAL LETTER VEDE"/* 2C02 */, /*11267*/"GLAGOLITIC CAPITAL LETTER GLAGOLI"/* 2C03 */,/*11268*/"GLAGOLITIC CAPITAL LETTER DOBRO"/* 2C04 */, /*11269*/"GLAGOLITIC CAPITAL LETTER YESTU"/* 2C05 */,/*11270*/"GLAGOLITIC CAPITAL LETTER ZHIVETE"/* 2C06 */, /*11271*/"GLAGOLITIC CAPITAL LETTER DZELO"/* 2C07 */,/*11272*/"GLAGOLITIC CAPITAL LETTER ZEMLJA"/* 2C08 */, /*11273*/"GLAGOLITIC CAPITAL LETTER IZHE"/* 2C09 */,/*11274*/"GLAGOLITIC CAPITAL LETTER INITIAL IZHE"/* 2C0A */, /*11275*/"GLAGOLITIC CAPITAL LETTER I"/* 2C0B */,/*11276*/"GLAGOLITIC CAPITAL LETTER DJERVI"/* 2C0C */, /*11277*/"GLAGOLITIC CAPITAL LETTER KAKO"/* 2C0D */,/*11278*/"GLAGOLITIC CAPITAL LETTER LJUDIJE"/* 2C0E */, /*11279*/"GLAGOLITIC CAPITAL LETTER MYSLITE"/* 2C0F */,/*11280*/"GLAGOLITIC CAPITAL LETTER NASHI"/* 2C10 */, /*11281*/"GLAGOLITIC CAPITAL LETTER ONU"/* 2C11 */,/*11282*/"GLAGOLITIC CAPITAL LETTER POKOJI"/* 2C12 */, /*11283*/"GLAGOLITIC CAPITAL LETTER RITSI"/* 2C13 */,/*11284*/"GLAGOLITIC CAPITAL LETTER SLOVO"/* 2C14 */, /*11285*/"GLAGOLITIC CAPITAL LETTER TVRIDO"/* 2C15 */,/*11286*/"GLAGOLITIC CAPITAL LETTER UKU"/* 2C16 */, /*11287*/"GLAGOLITIC CAPITAL LETTER FRITU"/* 2C17 */,/*11288*/"GLAGOLITIC CAPITAL LETTER HERU"/* 2C18 */, /*11289*/"GLAGOLITIC CAPITAL LETTER OTU"/* 2C19 */,/*11290*/"GLAGOLITIC CAPITAL LETTER PE"/* 2C1A */, /*11291*/"GLAGOLITIC CAPITAL LETTER SHTA"/* 2C1B */,/*11292*/"GLAGOLITIC CAPITAL LETTER TSI"/* 2C1C */, /*11293*/"GLAGOLITIC CAPITAL LETTER CHRIVI"/* 2C1D */,/*11294*/"GLAGOLITIC CAPITAL LETTER SHA"/* 2C1E */, /*11295*/"GLAGOLITIC CAPITAL LETTER YERU"/* 2C1F */,/*11296*/"GLAGOLITIC CAPITAL LETTER YERI"/* 2C20 */, /*11297*/"GLAGOLITIC CAPITAL LETTER YATI"/* 2C21 */,/*11298*/"GLAGOLITIC CAPITAL LETTER SPIDERY HA"/* 2C22 */, /*11299*/"GLAGOLITIC CAPITAL LETTER YU"/* 2C23 */,/*11300*/"GLAGOLITIC CAPITAL LETTER SMALL YUS"/* 2C24 */, /*11301*/"GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL"/* 2C25 */,/*11302*/"GLAGOLITIC CAPITAL LETTER YO"/* 2C26 */, /*11303*/"GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS"/* 2C27 */,/*11304*/"GLAGOLITIC CAPITAL LETTER BIG YUS"/* 2C28 */, /*11305*/"GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS"/* 2C29 */,/*11306*/"GLAGOLITIC CAPITAL LETTER FITA"/* 2C2A */, /*11307*/"GLAGOLITIC CAPITAL LETTER IZHITSA"/* 2C2B */,/*11308*/"GLAGOLITIC CAPITAL LETTER SHTAPIC"/* 2C2C */, /*11309*/"GLAGOLITIC CAPITAL LETTER TROKUTASTI A"/* 2C2D */, /*11310*/"GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE"/* 2C2E */,NULL,/*11312*/"GLAGOLITIC SMALL LETTER AZU"/* 2C30 */, /*11313*/"GLAGOLITIC SMALL LETTER BUKY"/* 2C31 */,/*11314*/"GLAGOLITIC SMALL LETTER VEDE"/* 2C32 */, /*11315*/"GLAGOLITIC SMALL LETTER GLAGOLI"/* 2C33 */,/*11316*/"GLAGOLITIC SMALL LETTER DOBRO"/* 2C34 */, /*11317*/"GLAGOLITIC SMALL LETTER YESTU"/* 2C35 */,/*11318*/"GLAGOLITIC SMALL LETTER ZHIVETE"/* 2C36 */, /*11319*/"GLAGOLITIC SMALL LETTER DZELO"/* 2C37 */,/*11320*/"GLAGOLITIC SMALL LETTER ZEMLJA"/* 2C38 */, /*11321*/"GLAGOLITIC SMALL LETTER IZHE"/* 2C39 */,/*11322*/"GLAGOLITIC SMALL LETTER INITIAL IZHE"/* 2C3A */, /*11323*/"GLAGOLITIC SMALL LETTER I"/* 2C3B */,/*11324*/"GLAGOLITIC SMALL LETTER DJERVI"/* 2C3C */, /*11325*/"GLAGOLITIC SMALL LETTER KAKO"/* 2C3D */,/*11326*/"GLAGOLITIC SMALL LETTER LJUDIJE"/* 2C3E */, /*11327*/"GLAGOLITIC SMALL LETTER MYSLITE"/* 2C3F */,/*11328*/"GLAGOLITIC SMALL LETTER NASHI"/* 2C40 */, /*11329*/"GLAGOLITIC SMALL LETTER ONU"/* 2C41 */,/*11330*/"GLAGOLITIC SMALL LETTER POKOJI"/* 2C42 */, /*11331*/"GLAGOLITIC SMALL LETTER RITSI"/* 2C43 */,/*11332*/"GLAGOLITIC SMALL LETTER SLOVO"/* 2C44 */, /*11333*/"GLAGOLITIC SMALL LETTER TVRIDO"/* 2C45 */,/*11334*/"GLAGOLITIC SMALL LETTER UKU"/* 2C46 */, /*11335*/"GLAGOLITIC SMALL LETTER FRITU"/* 2C47 */,/*11336*/"GLAGOLITIC SMALL LETTER HERU"/* 2C48 */, /*11337*/"GLAGOLITIC SMALL LETTER OTU"/* 2C49 */,/*11338*/"GLAGOLITIC SMALL LETTER PE"/* 2C4A */, /*11339*/"GLAGOLITIC SMALL LETTER SHTA"/* 2C4B */,/*11340*/"GLAGOLITIC SMALL LETTER TSI"/* 2C4C */, /*11341*/"GLAGOLITIC SMALL LETTER CHRIVI"/* 2C4D */,/*11342*/"GLAGOLITIC SMALL LETTER SHA"/* 2C4E */, /*11343*/"GLAGOLITIC SMALL LETTER YERU"/* 2C4F */,/*11344*/"GLAGOLITIC SMALL LETTER YERI"/* 2C50 */, /*11345*/"GLAGOLITIC SMALL LETTER YATI"/* 2C51 */,/*11346*/"GLAGOLITIC SMALL LETTER SPIDERY HA"/* 2C52 */, /*11347*/"GLAGOLITIC SMALL LETTER YU"/* 2C53 */,/*11348*/"GLAGOLITIC SMALL LETTER SMALL YUS"/* 2C54 */, /*11349*/"GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL"/* 2C55 */,/*11350*/"GLAGOLITIC SMALL LETTER YO"/* 2C56 */, /*11351*/"GLAGOLITIC SMALL LETTER IOTATED SMALL YUS"/* 2C57 */,/*11352*/"GLAGOLITIC SMALL LETTER BIG YUS"/* 2C58 */, /*11353*/"GLAGOLITIC SMALL LETTER IOTATED BIG YUS"/* 2C59 */,/*11354*/"GLAGOLITIC SMALL LETTER FITA"/* 2C5A */, /*11355*/"GLAGOLITIC SMALL LETTER IZHITSA"/* 2C5B */,/*11356*/"GLAGOLITIC SMALL LETTER SHTAPIC"/* 2C5C */, /*11357*/"GLAGOLITIC SMALL LETTER TROKUTASTI A"/* 2C5D */,/*11358*/"GLAGOLITIC SMALL LETTER LATINATE MYSLITE"/* 2C5E */, NULL,/*11360*/"LATIN CAPITAL LETTER L WITH DOUBLE BAR"/* 2C60 */, /*11361*/"LATIN SMALL LETTER L WITH DOUBLE BAR"/* 2C61 */,/*11362*/"LATIN CAPITAL LETTER L WITH MIDDLE TILDE"/* 2C62 */, /*11363*/"LATIN CAPITAL LETTER P WITH STROKE"/* 2C63 */,/*11364*/"LATIN CAPITAL LETTER R WITH TAIL"/* 2C64 */, /*11365*/"LATIN SMALL LETTER A WITH STROKE"/* 2C65 */,/*11366*/"LATIN SMALL LETTER T WITH DIAGONAL STROKE"/* 2C66 */, /*11367*/"LATIN CAPITAL LETTER H WITH DESCENDER"/* 2C67 */,/*11368*/"LATIN SMALL LETTER H WITH DESCENDER"/* 2C68 */, /*11369*/"LATIN CAPITAL LETTER K WITH DESCENDER"/* 2C69 */,/*11370*/"LATIN SMALL LETTER K WITH DESCENDER"/* 2C6A */, /*11371*/"LATIN CAPITAL LETTER Z WITH DESCENDER"/* 2C6B */,/*11372*/"LATIN SMALL LETTER Z WITH DESCENDER"/* 2C6C */, /*11373*/"LATIN CAPITAL LETTER ALPHA"/* 2C6D */,/*11374*/"LATIN CAPITAL LETTER M WITH HOOK"/* 2C6E */, /*11375*/"LATIN CAPITAL LETTER TURNED A"/* 2C6F */,/*11376*/"LATIN CAPITAL LETTER TURNED ALPHA"/* 2C70 */, /*11377*/"LATIN SMALL LETTER V WITH RIGHT HOOK"/* 2C71 */,/*11378*/"LATIN CAPITAL LETTER W WITH HOOK"/* 2C72 */, /*11379*/"LATIN SMALL LETTER W WITH HOOK"/* 2C73 */,/*11380*/"LATIN SMALL LETTER V WITH CURL"/* 2C74 */, /*11381*/"LATIN CAPITAL LETTER HALF H"/* 2C75 */,/*11382*/"LATIN SMALL LETTER HALF H"/* 2C76 */, /*11383*/"LATIN SMALL LETTER TAILLESS PHI"/* 2C77 */,/*11384*/"LATIN SMALL LETTER E WITH NOTCH"/* 2C78 */, /*11385*/"LATIN SMALL LETTER TURNED R WITH TAIL"/* 2C79 */, /*11386*/"LATIN SMALL LETTER O WITH LOW RING INSIDE"/* 2C7A */,/*11387*/"LATIN LETTER SMALL CAPITAL TURNED E"/* 2C7B */, /*11388*/"LATIN SUBSCRIPT SMALL LETTER J"/* 2C7C */,/*11389*/"MODIFIER LETTER CAPITAL V"/* 2C7D */, /*11390*/"LATIN CAPITAL LETTER S WITH SWASH TAIL"/* 2C7E */,/*11391*/"LATIN CAPITAL LETTER Z WITH SWASH TAIL"/* 2C7F */, /*11392*/"COPTIC CAPITAL LETTER ALFA"/* 2C80 */,/*11393*/"COPTIC SMALL LETTER ALFA"/* 2C81 */, /*11394*/"COPTIC CAPITAL LETTER VIDA"/* 2C82 */,/*11395*/"COPTIC SMALL LETTER VIDA"/* 2C83 */, /*11396*/"COPTIC CAPITAL LETTER GAMMA"/* 2C84 */,/*11397*/"COPTIC SMALL LETTER GAMMA"/* 2C85 */, /*11398*/"COPTIC CAPITAL LETTER DALDA"/* 2C86 */,/*11399*/"COPTIC SMALL LETTER DALDA"/* 2C87 */, /*11400*/"COPTIC CAPITAL LETTER EIE"/* 2C88 */,/*11401*/"COPTIC SMALL LETTER EIE"/* 2C89 */, /*11402*/"COPTIC CAPITAL LETTER SOU"/* 2C8A */,/*11403*/"COPTIC SMALL LETTER SOU"/* 2C8B */, /*11404*/"COPTIC CAPITAL LETTER ZATA"/* 2C8C */,/*11405*/"COPTIC SMALL LETTER ZATA"/* 2C8D */, /*11406*/"COPTIC CAPITAL LETTER HATE"/* 2C8E */,/*11407*/"COPTIC SMALL LETTER HATE"/* 2C8F */, /*11408*/"COPTIC CAPITAL LETTER THETHE"/* 2C90 */,/*11409*/"COPTIC SMALL LETTER THETHE"/* 2C91 */, /*11410*/"COPTIC CAPITAL LETTER IAUDA"/* 2C92 */,/*11411*/"COPTIC SMALL LETTER IAUDA"/* 2C93 */, /*11412*/"COPTIC CAPITAL LETTER KAPA"/* 2C94 */,/*11413*/"COPTIC SMALL LETTER KAPA"/* 2C95 */, /*11414*/"COPTIC CAPITAL LETTER LAULA"/* 2C96 */,/*11415*/"COPTIC SMALL LETTER LAULA"/* 2C97 */, /*11416*/"COPTIC CAPITAL LETTER MI"/* 2C98 */,/*11417*/"COPTIC SMALL LETTER MI"/* 2C99 */, /*11418*/"COPTIC CAPITAL LETTER NI"/* 2C9A */,/*11419*/"COPTIC SMALL LETTER NI"/* 2C9B */, /*11420*/"COPTIC CAPITAL LETTER KSI"/* 2C9C */,/*11421*/"COPTIC SMALL LETTER KSI"/* 2C9D */, /*11422*/"COPTIC CAPITAL LETTER O"/* 2C9E */,/*11423*/"COPTIC SMALL LETTER O"/* 2C9F */, /*11424*/"COPTIC CAPITAL LETTER PI"/* 2CA0 */,/*11425*/"COPTIC SMALL LETTER PI"/* 2CA1 */, /*11426*/"COPTIC CAPITAL LETTER RO"/* 2CA2 */,/*11427*/"COPTIC SMALL LETTER RO"/* 2CA3 */, /*11428*/"COPTIC CAPITAL LETTER SIMA"/* 2CA4 */,/*11429*/"COPTIC SMALL LETTER SIMA"/* 2CA5 */, /*11430*/"COPTIC CAPITAL LETTER TAU"/* 2CA6 */,/*11431*/"COPTIC SMALL LETTER TAU"/* 2CA7 */, /*11432*/"COPTIC CAPITAL LETTER UA"/* 2CA8 */,/*11433*/"COPTIC SMALL LETTER UA"/* 2CA9 */, /*11434*/"COPTIC CAPITAL LETTER FI"/* 2CAA */,/*11435*/"COPTIC SMALL LETTER FI"/* 2CAB */, /*11436*/"COPTIC CAPITAL LETTER KHI"/* 2CAC */,/*11437*/"COPTIC SMALL LETTER KHI"/* 2CAD */, /*11438*/"COPTIC CAPITAL LETTER PSI"/* 2CAE */,/*11439*/"COPTIC SMALL LETTER PSI"/* 2CAF */, /*11440*/"COPTIC CAPITAL LETTER OOU"/* 2CB0 */,/*11441*/"COPTIC SMALL LETTER OOU"/* 2CB1 */, /*11442*/"COPTIC CAPITAL LETTER DIALECT-P ALEF"/* 2CB2 */,/*11443*/"COPTIC SMALL LETTER DIALECT-P ALEF"/* 2CB3 */, /*11444*/"COPTIC CAPITAL LETTER OLD COPTIC AIN"/* 2CB4 */,/*11445*/"COPTIC SMALL LETTER OLD COPTIC AIN"/* 2CB5 */, /*11446*/"COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE"/* 2CB6 */,/*11447*/"COPTIC SMALL LETTER CRYPTOGRAMMIC EIE"/* 2CB7 */, /*11448*/"COPTIC CAPITAL LETTER DIALECT-P KAPA"/* 2CB8 */,/*11449*/"COPTIC SMALL LETTER DIALECT-P KAPA"/* 2CB9 */, /*11450*/"COPTIC CAPITAL LETTER DIALECT-P NI"/* 2CBA */,/*11451*/"COPTIC SMALL LETTER DIALECT-P NI"/* 2CBB */, /*11452*/"COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI"/* 2CBC */,/*11453*/"COPTIC SMALL LETTER CRYPTOGRAMMIC NI"/* 2CBD */, /*11454*/"COPTIC CAPITAL LETTER OLD COPTIC OOU"/* 2CBE */,/*11455*/"COPTIC SMALL LETTER OLD COPTIC OOU"/* 2CBF */, /*11456*/"COPTIC CAPITAL LETTER SAMPI"/* 2CC0 */,/*11457*/"COPTIC SMALL LETTER SAMPI"/* 2CC1 */, /*11458*/"COPTIC CAPITAL LETTER CROSSED SHEI"/* 2CC2 */,/*11459*/"COPTIC SMALL LETTER CROSSED SHEI"/* 2CC3 */, /*11460*/"COPTIC CAPITAL LETTER OLD COPTIC SHEI"/* 2CC4 */,/*11461*/"COPTIC SMALL LETTER OLD COPTIC SHEI"/* 2CC5 */, /*11462*/"COPTIC CAPITAL LETTER OLD COPTIC ESH"/* 2CC6 */,/*11463*/"COPTIC SMALL LETTER OLD COPTIC ESH"/* 2CC7 */, /*11464*/"COPTIC CAPITAL LETTER AKHMIMIC KHEI"/* 2CC8 */,/*11465*/"COPTIC SMALL LETTER AKHMIMIC KHEI"/* 2CC9 */, /*11466*/"COPTIC CAPITAL LETTER DIALECT-P HORI"/* 2CCA */,/*11467*/"COPTIC SMALL LETTER DIALECT-P HORI"/* 2CCB */, /*11468*/"COPTIC CAPITAL LETTER OLD COPTIC HORI"/* 2CCC */,/*11469*/"COPTIC SMALL LETTER OLD COPTIC HORI"/* 2CCD */, /*11470*/"COPTIC CAPITAL LETTER OLD COPTIC HA"/* 2CCE */,/*11471*/"COPTIC SMALL LETTER OLD COPTIC HA"/* 2CCF */, /*11472*/"COPTIC CAPITAL LETTER L-SHAPED HA"/* 2CD0 */,/*11473*/"COPTIC SMALL LETTER L-SHAPED HA"/* 2CD1 */, /*11474*/"COPTIC CAPITAL LETTER OLD COPTIC HEI"/* 2CD2 */,/*11475*/"COPTIC SMALL LETTER OLD COPTIC HEI"/* 2CD3 */, /*11476*/"COPTIC CAPITAL LETTER OLD COPTIC HAT"/* 2CD4 */,/*11477*/"COPTIC SMALL LETTER OLD COPTIC HAT"/* 2CD5 */, /*11478*/"COPTIC CAPITAL LETTER OLD COPTIC GANGIA"/* 2CD6 */,/*11479*/"COPTIC SMALL LETTER OLD COPTIC GANGIA"/* 2CD7 */, /*11480*/"COPTIC CAPITAL LETTER OLD COPTIC DJA"/* 2CD8 */,/*11481*/"COPTIC SMALL LETTER OLD COPTIC DJA"/* 2CD9 */, /*11482*/"COPTIC CAPITAL LETTER OLD COPTIC SHIMA"/* 2CDA */,/*11483*/"COPTIC SMALL LETTER OLD COPTIC SHIMA"/* 2CDB */, /*11484*/"COPTIC CAPITAL LETTER OLD NUBIAN SHIMA"/* 2CDC */,/*11485*/"COPTIC SMALL LETTER OLD NUBIAN SHIMA"/* 2CDD */, /*11486*/"COPTIC CAPITAL LETTER OLD NUBIAN NGI"/* 2CDE */,/*11487*/"COPTIC SMALL LETTER OLD NUBIAN NGI"/* 2CDF */, /*11488*/"COPTIC CAPITAL LETTER OLD NUBIAN NYI"/* 2CE0 */,/*11489*/"COPTIC SMALL LETTER OLD NUBIAN NYI"/* 2CE1 */, /*11490*/"COPTIC CAPITAL LETTER OLD NUBIAN WAU"/* 2CE2 */,/*11491*/"COPTIC SMALL LETTER OLD NUBIAN WAU"/* 2CE3 */, /*11492*/"COPTIC SYMBOL KAI"/* 2CE4 */,/*11493*/"COPTIC SYMBOL MI RO"/* 2CE5 */,/*11494*/"COPTIC SYMBOL PI RO"/* 2CE6 */, /*11495*/"COPTIC SYMBOL STAUROS"/* 2CE7 */,/*11496*/"COPTIC SYMBOL TAU RO"/* 2CE8 */, /*11497*/"COPTIC SYMBOL KHI RO"/* 2CE9 */,/*11498*/"COPTIC SYMBOL SHIMA SIMA"/* 2CEA */, /*11499*/"COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI"/* 2CEB */, /*11500*/"COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI"/* 2CEC */, /*11501*/"COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA"/* 2CED */, /*11502*/"COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA"/* 2CEE */,/*11503*/"COPTIC COMBINING NI ABOVE"/* 2CEF */, /*11504*/"COPTIC COMBINING SPIRITUS ASPER"/* 2CF0 */,/*11505*/"COPTIC COMBINING SPIRITUS LENIS"/* 2CF1 */, /*11506*/"COPTIC CAPITAL LETTER BOHAIRIC KHEI"/* 2CF2 */,/*11507*/"COPTIC SMALL LETTER BOHAIRIC KHEI"/* 2CF3 */,NULL, NULL,NULL,NULL,NULL,/*11513*/"COPTIC OLD NUBIAN FULL STOP"/* 2CF9 */, /*11514*/"COPTIC OLD NUBIAN DIRECT QUESTION MARK"/* 2CFA */, /*11515*/"COPTIC OLD NUBIAN INDIRECT QUESTION MARK"/* 2CFB */,/*11516*/"COPTIC OLD NUBIAN VERSE DIVIDER"/* 2CFC */, /*11517*/"COPTIC FRACTION ONE HALF"/* 2CFD */,/*11518*/"COPTIC FULL STOP"/* 2CFE */, /*11519*/"COPTIC MORPHOLOGICAL DIVIDER"/* 2CFF */,/*11520*/"GEORGIAN SMALL LETTER AN"/* 2D00 */, /*11521*/"GEORGIAN SMALL LETTER BAN"/* 2D01 */,/*11522*/"GEORGIAN SMALL LETTER GAN"/* 2D02 */, /*11523*/"GEORGIAN SMALL LETTER DON"/* 2D03 */,/*11524*/"GEORGIAN SMALL LETTER EN"/* 2D04 */, /*11525*/"GEORGIAN SMALL LETTER VIN"/* 2D05 */,/*11526*/"GEORGIAN SMALL LETTER ZEN"/* 2D06 */, /*11527*/"GEORGIAN SMALL LETTER TAN"/* 2D07 */,/*11528*/"GEORGIAN SMALL LETTER IN"/* 2D08 */, /*11529*/"GEORGIAN SMALL LETTER KAN"/* 2D09 */,/*11530*/"GEORGIAN SMALL LETTER LAS"/* 2D0A */, /*11531*/"GEORGIAN SMALL LETTER MAN"/* 2D0B */,/*11532*/"GEORGIAN SMALL LETTER NAR"/* 2D0C */, /*11533*/"GEORGIAN SMALL LETTER ON"/* 2D0D */,/*11534*/"GEORGIAN SMALL LETTER PAR"/* 2D0E */, /*11535*/"GEORGIAN SMALL LETTER ZHAR"/* 2D0F */,/*11536*/"GEORGIAN SMALL LETTER RAE"/* 2D10 */, /*11537*/"GEORGIAN SMALL LETTER SAN"/* 2D11 */,/*11538*/"GEORGIAN SMALL LETTER TAR"/* 2D12 */, /*11539*/"GEORGIAN SMALL LETTER UN"/* 2D13 */,/*11540*/"GEORGIAN SMALL LETTER PHAR"/* 2D14 */, /*11541*/"GEORGIAN SMALL LETTER KHAR"/* 2D15 */,/*11542*/"GEORGIAN SMALL LETTER GHAN"/* 2D16 */, /*11543*/"GEORGIAN SMALL LETTER QAR"/* 2D17 */,/*11544*/"GEORGIAN SMALL LETTER SHIN"/* 2D18 */, /*11545*/"GEORGIAN SMALL LETTER CHIN"/* 2D19 */,/*11546*/"GEORGIAN SMALL LETTER CAN"/* 2D1A */, /*11547*/"GEORGIAN SMALL LETTER JIL"/* 2D1B */,/*11548*/"GEORGIAN SMALL LETTER CIL"/* 2D1C */, /*11549*/"GEORGIAN SMALL LETTER CHAR"/* 2D1D */,/*11550*/"GEORGIAN SMALL LETTER XAN"/* 2D1E */, /*11551*/"GEORGIAN SMALL LETTER JHAN"/* 2D1F */,/*11552*/"GEORGIAN SMALL LETTER HAE"/* 2D20 */, /*11553*/"GEORGIAN SMALL LETTER HE"/* 2D21 */,/*11554*/"GEORGIAN SMALL LETTER HIE"/* 2D22 */, /*11555*/"GEORGIAN SMALL LETTER WE"/* 2D23 */,/*11556*/"GEORGIAN SMALL LETTER HAR"/* 2D24 */, /*11557*/"GEORGIAN SMALL LETTER HOE"/* 2D25 */,NULL,/*11559*/"GEORGIAN SMALL LETTER YN"/* 2D27 */,NULL,NULL,NULL,NULL, NULL,/*11565*/"GEORGIAN SMALL LETTER AEN"/* 2D2D */,NULL,NULL,/*11568*/"TIFINAGH LETTER YA"/* 2D30 */, /*11569*/"TIFINAGH LETTER YAB"/* 2D31 */,/*11570*/"TIFINAGH LETTER YABH"/* 2D32 */, /*11571*/"TIFINAGH LETTER YAG"/* 2D33 */,/*11572*/"TIFINAGH LETTER YAGHH"/* 2D34 */, /*11573*/"TIFINAGH LETTER BERBER ACADEMY YAJ"/* 2D35 */,/*11574*/"TIFINAGH LETTER YAJ"/* 2D36 */, /*11575*/"TIFINAGH LETTER YAD"/* 2D37 */,/*11576*/"TIFINAGH LETTER YADH"/* 2D38 */, /*11577*/"TIFINAGH LETTER YADD"/* 2D39 */,/*11578*/"TIFINAGH LETTER YADDH"/* 2D3A */, /*11579*/"TIFINAGH LETTER YEY"/* 2D3B */,/*11580*/"TIFINAGH LETTER YAF"/* 2D3C */, /*11581*/"TIFINAGH LETTER YAK"/* 2D3D */,/*11582*/"TIFINAGH LETTER TUAREG YAK"/* 2D3E */, /*11583*/"TIFINAGH LETTER YAKHH"/* 2D3F */,/*11584*/"TIFINAGH LETTER YAH"/* 2D40 */, /*11585*/"TIFINAGH LETTER BERBER ACADEMY YAH"/* 2D41 */,/*11586*/"TIFINAGH LETTER TUAREG YAH"/* 2D42 */, /*11587*/"TIFINAGH LETTER YAHH"/* 2D43 */,/*11588*/"TIFINAGH LETTER YAA"/* 2D44 */, /*11589*/"TIFINAGH LETTER YAKH"/* 2D45 */,/*11590*/"TIFINAGH LETTER TUAREG YAKH"/* 2D46 */, /*11591*/"TIFINAGH LETTER YAQ"/* 2D47 */,/*11592*/"TIFINAGH LETTER TUAREG YAQ"/* 2D48 */, /*11593*/"TIFINAGH LETTER YI"/* 2D49 */,/*11594*/"TIFINAGH LETTER YAZH"/* 2D4A */, /*11595*/"TIFINAGH LETTER AHAGGAR YAZH"/* 2D4B */,/*11596*/"TIFINAGH LETTER TUAREG YAZH"/* 2D4C */, /*11597*/"TIFINAGH LETTER YAL"/* 2D4D */,/*11598*/"TIFINAGH LETTER YAM"/* 2D4E */, /*11599*/"TIFINAGH LETTER YAN"/* 2D4F */,/*11600*/"TIFINAGH LETTER TUAREG YAGN"/* 2D50 */, /*11601*/"TIFINAGH LETTER TUAREG YANG"/* 2D51 */,/*11602*/"TIFINAGH LETTER YAP"/* 2D52 */, /*11603*/"TIFINAGH LETTER YU"/* 2D53 */,/*11604*/"TIFINAGH LETTER YAR"/* 2D54 */, /*11605*/"TIFINAGH LETTER YARR"/* 2D55 */,/*11606*/"TIFINAGH LETTER YAGH"/* 2D56 */, /*11607*/"TIFINAGH LETTER TUAREG YAGH"/* 2D57 */,/*11608*/"TIFINAGH LETTER AYER YAGH"/* 2D58 */, /*11609*/"TIFINAGH LETTER YAS"/* 2D59 */,/*11610*/"TIFINAGH LETTER YASS"/* 2D5A */, /*11611*/"TIFINAGH LETTER YASH"/* 2D5B */,/*11612*/"TIFINAGH LETTER YAT"/* 2D5C */, /*11613*/"TIFINAGH LETTER YATH"/* 2D5D */,/*11614*/"TIFINAGH LETTER YACH"/* 2D5E */, /*11615*/"TIFINAGH LETTER YATT"/* 2D5F */,/*11616*/"TIFINAGH LETTER YAV"/* 2D60 */, /*11617*/"TIFINAGH LETTER YAW"/* 2D61 */,/*11618*/"TIFINAGH LETTER YAY"/* 2D62 */, /*11619*/"TIFINAGH LETTER YAZ"/* 2D63 */,/*11620*/"TIFINAGH LETTER TAWELLEMET YAZ"/* 2D64 */, /*11621*/"TIFINAGH LETTER YAZZ"/* 2D65 */,/*11622*/"TIFINAGH LETTER YE"/* 2D66 */, /*11623*/"TIFINAGH LETTER YO"/* 2D67 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*11631*/"TIFINAGH MODIFIER LETTER LABIALIZATION MARK"/* 2D6F */,/*11632*/"TIFINAGH SEPARATOR MARK"/* 2D70 */,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*11647*/"TIFINAGH CONSONANT JOINER"/* 2D7F */, /*11648*/"ETHIOPIC SYLLABLE LOA"/* 2D80 */,/*11649*/"ETHIOPIC SYLLABLE MOA"/* 2D81 */, /*11650*/"ETHIOPIC SYLLABLE ROA"/* 2D82 */,/*11651*/"ETHIOPIC SYLLABLE SOA"/* 2D83 */, /*11652*/"ETHIOPIC SYLLABLE SHOA"/* 2D84 */,/*11653*/"ETHIOPIC SYLLABLE BOA"/* 2D85 */, /*11654*/"ETHIOPIC SYLLABLE TOA"/* 2D86 */,/*11655*/"ETHIOPIC SYLLABLE COA"/* 2D87 */, /*11656*/"ETHIOPIC SYLLABLE NOA"/* 2D88 */,/*11657*/"ETHIOPIC SYLLABLE NYOA"/* 2D89 */, /*11658*/"ETHIOPIC SYLLABLE GLOTTAL OA"/* 2D8A */,/*11659*/"ETHIOPIC SYLLABLE ZOA"/* 2D8B */, /*11660*/"ETHIOPIC SYLLABLE DOA"/* 2D8C */,/*11661*/"ETHIOPIC SYLLABLE DDOA"/* 2D8D */, /*11662*/"ETHIOPIC SYLLABLE JOA"/* 2D8E */,/*11663*/"ETHIOPIC SYLLABLE THOA"/* 2D8F */, /*11664*/"ETHIOPIC SYLLABLE CHOA"/* 2D90 */,/*11665*/"ETHIOPIC SYLLABLE PHOA"/* 2D91 */, /*11666*/"ETHIOPIC SYLLABLE POA"/* 2D92 */,/*11667*/"ETHIOPIC SYLLABLE GGWA"/* 2D93 */, /*11668*/"ETHIOPIC SYLLABLE GGWI"/* 2D94 */,/*11669*/"ETHIOPIC SYLLABLE GGWEE"/* 2D95 */, /*11670*/"ETHIOPIC SYLLABLE GGWE"/* 2D96 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*11680*/"ETHIOPIC SYLLABLE SSA"/* 2DA0 */,/*11681*/"ETHIOPIC SYLLABLE SSU"/* 2DA1 */, /*11682*/"ETHIOPIC SYLLABLE SSI"/* 2DA2 */,/*11683*/"ETHIOPIC SYLLABLE SSAA"/* 2DA3 */, /*11684*/"ETHIOPIC SYLLABLE SSEE"/* 2DA4 */,/*11685*/"ETHIOPIC SYLLABLE SSE"/* 2DA5 */, /*11686*/"ETHIOPIC SYLLABLE SSO"/* 2DA6 */,NULL,/*11688*/"ETHIOPIC SYLLABLE CCA"/* 2DA8 */, /*11689*/"ETHIOPIC SYLLABLE CCU"/* 2DA9 */,/*11690*/"ETHIOPIC SYLLABLE CCI"/* 2DAA */, /*11691*/"ETHIOPIC SYLLABLE CCAA"/* 2DAB */,/*11692*/"ETHIOPIC SYLLABLE CCEE"/* 2DAC */, /*11693*/"ETHIOPIC SYLLABLE CCE"/* 2DAD */,/*11694*/"ETHIOPIC SYLLABLE CCO"/* 2DAE */,NULL, /*11696*/"ETHIOPIC SYLLABLE ZZA"/* 2DB0 */,/*11697*/"ETHIOPIC SYLLABLE ZZU"/* 2DB1 */, /*11698*/"ETHIOPIC SYLLABLE ZZI"/* 2DB2 */,/*11699*/"ETHIOPIC SYLLABLE ZZAA"/* 2DB3 */, /*11700*/"ETHIOPIC SYLLABLE ZZEE"/* 2DB4 */,/*11701*/"ETHIOPIC SYLLABLE ZZE"/* 2DB5 */, /*11702*/"ETHIOPIC SYLLABLE ZZO"/* 2DB6 */,NULL,/*11704*/"ETHIOPIC SYLLABLE CCHA"/* 2DB8 */, /*11705*/"ETHIOPIC SYLLABLE CCHU"/* 2DB9 */,/*11706*/"ETHIOPIC SYLLABLE CCHI"/* 2DBA */, /*11707*/"ETHIOPIC SYLLABLE CCHAA"/* 2DBB */,/*11708*/"ETHIOPIC SYLLABLE CCHEE"/* 2DBC */, /*11709*/"ETHIOPIC SYLLABLE CCHE"/* 2DBD */,/*11710*/"ETHIOPIC SYLLABLE CCHO"/* 2DBE */,NULL, /*11712*/"ETHIOPIC SYLLABLE QYA"/* 2DC0 */,/*11713*/"ETHIOPIC SYLLABLE QYU"/* 2DC1 */, /*11714*/"ETHIOPIC SYLLABLE QYI"/* 2DC2 */,/*11715*/"ETHIOPIC SYLLABLE QYAA"/* 2DC3 */, /*11716*/"ETHIOPIC SYLLABLE QYEE"/* 2DC4 */,/*11717*/"ETHIOPIC SYLLABLE QYE"/* 2DC5 */, /*11718*/"ETHIOPIC SYLLABLE QYO"/* 2DC6 */,NULL,/*11720*/"ETHIOPIC SYLLABLE KYA"/* 2DC8 */, /*11721*/"ETHIOPIC SYLLABLE KYU"/* 2DC9 */,/*11722*/"ETHIOPIC SYLLABLE KYI"/* 2DCA */, /*11723*/"ETHIOPIC SYLLABLE KYAA"/* 2DCB */,/*11724*/"ETHIOPIC SYLLABLE KYEE"/* 2DCC */, /*11725*/"ETHIOPIC SYLLABLE KYE"/* 2DCD */,/*11726*/"ETHIOPIC SYLLABLE KYO"/* 2DCE */,NULL, /*11728*/"ETHIOPIC SYLLABLE XYA"/* 2DD0 */,/*11729*/"ETHIOPIC SYLLABLE XYU"/* 2DD1 */, /*11730*/"ETHIOPIC SYLLABLE XYI"/* 2DD2 */,/*11731*/"ETHIOPIC SYLLABLE XYAA"/* 2DD3 */, /*11732*/"ETHIOPIC SYLLABLE XYEE"/* 2DD4 */,/*11733*/"ETHIOPIC SYLLABLE XYE"/* 2DD5 */, /*11734*/"ETHIOPIC SYLLABLE XYO"/* 2DD6 */,NULL,/*11736*/"ETHIOPIC SYLLABLE GYA"/* 2DD8 */, /*11737*/"ETHIOPIC SYLLABLE GYU"/* 2DD9 */,/*11738*/"ETHIOPIC SYLLABLE GYI"/* 2DDA */, /*11739*/"ETHIOPIC SYLLABLE GYAA"/* 2DDB */,/*11740*/"ETHIOPIC SYLLABLE GYEE"/* 2DDC */, /*11741*/"ETHIOPIC SYLLABLE GYE"/* 2DDD */,/*11742*/"ETHIOPIC SYLLABLE GYO"/* 2DDE */,NULL, /*11744*/"COMBINING CYRILLIC LETTER BE"/* 2DE0 */,/*11745*/"COMBINING CYRILLIC LETTER VE"/* 2DE1 */, /*11746*/"COMBINING CYRILLIC LETTER GHE"/* 2DE2 */,/*11747*/"COMBINING CYRILLIC LETTER DE"/* 2DE3 */, /*11748*/"COMBINING CYRILLIC LETTER ZHE"/* 2DE4 */,/*11749*/"COMBINING CYRILLIC LETTER ZE"/* 2DE5 */, /*11750*/"COMBINING CYRILLIC LETTER KA"/* 2DE6 */,/*11751*/"COMBINING CYRILLIC LETTER EL"/* 2DE7 */, /*11752*/"COMBINING CYRILLIC LETTER EM"/* 2DE8 */,/*11753*/"COMBINING CYRILLIC LETTER EN"/* 2DE9 */, /*11754*/"COMBINING CYRILLIC LETTER O"/* 2DEA */,/*11755*/"COMBINING CYRILLIC LETTER PE"/* 2DEB */, /*11756*/"COMBINING CYRILLIC LETTER ER"/* 2DEC */,/*11757*/"COMBINING CYRILLIC LETTER ES"/* 2DED */, /*11758*/"COMBINING CYRILLIC LETTER TE"/* 2DEE */,/*11759*/"COMBINING CYRILLIC LETTER HA"/* 2DEF */, /*11760*/"COMBINING CYRILLIC LETTER TSE"/* 2DF0 */,/*11761*/"COMBINING CYRILLIC LETTER CHE"/* 2DF1 */, /*11762*/"COMBINING CYRILLIC LETTER SHA"/* 2DF2 */,/*11763*/"COMBINING CYRILLIC LETTER SHCHA"/* 2DF3 */, /*11764*/"COMBINING CYRILLIC LETTER FITA"/* 2DF4 */,/*11765*/"COMBINING CYRILLIC LETTER ES-TE"/* 2DF5 */, /*11766*/"COMBINING CYRILLIC LETTER A"/* 2DF6 */,/*11767*/"COMBINING CYRILLIC LETTER IE"/* 2DF7 */, /*11768*/"COMBINING CYRILLIC LETTER DJERV"/* 2DF8 */,/*11769*/"COMBINING CYRILLIC LETTER MONOGRAPH UK"/* 2DF9 */, /*11770*/"COMBINING CYRILLIC LETTER YAT"/* 2DFA */,/*11771*/"COMBINING CYRILLIC LETTER YU"/* 2DFB */, /*11772*/"COMBINING CYRILLIC LETTER IOTIFIED A"/* 2DFC */,/*11773*/"COMBINING CYRILLIC LETTER LITTLE YUS"/* 2DFD */, /*11774*/"COMBINING CYRILLIC LETTER BIG YUS"/* 2DFE */,/*11775*/"COMBINING CYRILLIC LETTER IOTIFIED BIG YUS"/* 2DFF */, /*11776*/"RIGHT ANGLE SUBSTITUTION MARKER"/* 2E00 */,/*11777*/"RIGHT ANGLE DOTTED SUBSTITUTION MARKER"/* 2E01 */, /*11778*/"LEFT SUBSTITUTION BRACKET"/* 2E02 */,/*11779*/"RIGHT SUBSTITUTION BRACKET"/* 2E03 */, /*11780*/"LEFT DOTTED SUBSTITUTION BRACKET"/* 2E04 */,/*11781*/"RIGHT DOTTED SUBSTITUTION BRACKET"/* 2E05 */, /*11782*/"RAISED INTERPOLATION MARKER"/* 2E06 */,/*11783*/"RAISED DOTTED INTERPOLATION MARKER"/* 2E07 */, /*11784*/"DOTTED TRANSPOSITION MARKER"/* 2E08 */,/*11785*/"LEFT TRANSPOSITION BRACKET"/* 2E09 */, /*11786*/"RIGHT TRANSPOSITION BRACKET"/* 2E0A */,/*11787*/"RAISED SQUARE"/* 2E0B */, /*11788*/"LEFT RAISED OMISSION BRACKET"/* 2E0C */,/*11789*/"RIGHT RAISED OMISSION BRACKET"/* 2E0D */, /*11790*/"EDITORIAL CORONIS"/* 2E0E */,/*11791*/"PARAGRAPHOS"/* 2E0F */,/*11792*/"FORKED PARAGRAPHOS"/* 2E10 */, /*11793*/"REVERSED FORKED PARAGRAPHOS"/* 2E11 */,/*11794*/"HYPODIASTOLE"/* 2E12 */,/*11795*/"DOTTED OBELOS"/* 2E13 */, /*11796*/"DOWNWARDS ANCORA"/* 2E14 */,/*11797*/"UPWARDS ANCORA"/* 2E15 */, /*11798*/"DOTTED RIGHT-POINTING ANGLE"/* 2E16 */,/*11799*/"DOUBLE OBLIQUE HYPHEN"/* 2E17 */, /*11800*/"INVERTED INTERROBANG"/* 2E18 */,/*11801*/"PALM BRANCH"/* 2E19 */,/*11802*/"HYPHEN WITH DIAERESIS"/* 2E1A */, /*11803*/"TILDE WITH RING ABOVE"/* 2E1B */,/*11804*/"LEFT LOW PARAPHRASE BRACKET"/* 2E1C */, /*11805*/"RIGHT LOW PARAPHRASE BRACKET"/* 2E1D */,/*11806*/"TILDE WITH DOT ABOVE"/* 2E1E */, /*11807*/"TILDE WITH DOT BELOW"/* 2E1F */,/*11808*/"LEFT VERTICAL BAR WITH QUILL"/* 2E20 */, /*11809*/"RIGHT VERTICAL BAR WITH QUILL"/* 2E21 */,/*11810*/"TOP LEFT HALF BRACKET"/* 2E22 */, /*11811*/"TOP RIGHT HALF BRACKET"/* 2E23 */,/*11812*/"BOTTOM LEFT HALF BRACKET"/* 2E24 */, /*11813*/"BOTTOM RIGHT HALF BRACKET"/* 2E25 */,/*11814*/"LEFT SIDEWAYS U BRACKET"/* 2E26 */, /*11815*/"RIGHT SIDEWAYS U BRACKET"/* 2E27 */,/*11816*/"LEFT DOUBLE PARENTHESIS"/* 2E28 */, /*11817*/"RIGHT DOUBLE PARENTHESIS"/* 2E29 */,/*11818*/"TWO DOTS OVER ONE DOT PUNCTUATION"/* 2E2A */, /*11819*/"ONE DOT OVER TWO DOTS PUNCTUATION"/* 2E2B */,/*11820*/"SQUARED FOUR DOT PUNCTUATION"/* 2E2C */, /*11821*/"FIVE DOT MARK"/* 2E2D */,/*11822*/"REVERSED QUESTION MARK"/* 2E2E */,/*11823*/"VERTICAL TILDE"/* 2E2F */, /*11824*/"RING POINT"/* 2E30 */,/*11825*/"WORD SEPARATOR MIDDLE DOT"/* 2E31 */,/*11826*/"TURNED COMMA"/* 2E32 */, /*11827*/"RAISED DOT"/* 2E33 */,/*11828*/"RAISED COMMA"/* 2E34 */,/*11829*/"TURNED SEMICOLON"/* 2E35 */, /*11830*/"DAGGER WITH LEFT GUARD"/* 2E36 */,/*11831*/"DAGGER WITH RIGHT GUARD"/* 2E37 */, /*11832*/"TURNED DAGGER"/* 2E38 */,/*11833*/"TOP HALF SECTION SIGN"/* 2E39 */,/*11834*/"TWO-EM DASH"/* 2E3A */, /*11835*/"THREE-EM DASH"/* 2E3B */,/*11836*/"STENOGRAPHIC FULL STOP"/* 2E3C */,/*11837*/"VERTICAL SIX DOTS"/* 2E3D */, /*11838*/"WIGGLY VERTICAL LINE"/* 2E3E */,/*11839*/"CAPITULUM"/* 2E3F */,/*11840*/"DOUBLE HYPHEN"/* 2E40 */, /*11841*/"REVERSED COMMA"/* 2E41 */,/*11842*/"DOUBLE LOW-REVERSED-9 QUOTATION MARK"/* 2E42 */, /*11843*/"DASH WITH LEFT UPTURN"/* 2E43 */,/*11844*/"DOUBLE SUSPENSION MARK"/* 2E44 */, /*11845*/"INVERTED LOW KAVYKA"/* 2E45 */,/*11846*/"INVERTED LOW KAVYKA WITH KAVYKA ABOVE"/* 2E46 */, /*11847*/"LOW KAVYKA"/* 2E47 */,/*11848*/"LOW KAVYKA WITH DOT"/* 2E48 */,/*11849*/"DOUBLE STACKED COMMA"/* 2E49 */,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,/*11904*/"CJK RADICAL REPEAT"/* 2E80 */,/*11905*/"CJK RADICAL CLIFF"/* 2E81 */, /*11906*/"CJK RADICAL SECOND ONE"/* 2E82 */,/*11907*/"CJK RADICAL SECOND TWO"/* 2E83 */, /*11908*/"CJK RADICAL SECOND THREE"/* 2E84 */,/*11909*/"CJK RADICAL PERSON"/* 2E85 */, /*11910*/"CJK RADICAL BOX"/* 2E86 */,/*11911*/"CJK RADICAL TABLE"/* 2E87 */,/*11912*/"CJK RADICAL KNIFE ONE"/* 2E88 */, /*11913*/"CJK RADICAL KNIFE TWO"/* 2E89 */,/*11914*/"CJK RADICAL DIVINATION"/* 2E8A */, /*11915*/"CJK RADICAL SEAL"/* 2E8B */,/*11916*/"CJK RADICAL SMALL ONE"/* 2E8C */, /*11917*/"CJK RADICAL SMALL TWO"/* 2E8D */,/*11918*/"CJK RADICAL LAME ONE"/* 2E8E */, /*11919*/"CJK RADICAL LAME TWO"/* 2E8F */,/*11920*/"CJK RADICAL LAME THREE"/* 2E90 */, /*11921*/"CJK RADICAL LAME FOUR"/* 2E91 */,/*11922*/"CJK RADICAL SNAKE"/* 2E92 */, /*11923*/"CJK RADICAL THREAD"/* 2E93 */,/*11924*/"CJK RADICAL SNOUT ONE"/* 2E94 */, /*11925*/"CJK RADICAL SNOUT TWO"/* 2E95 */,/*11926*/"CJK RADICAL HEART ONE"/* 2E96 */, /*11927*/"CJK RADICAL HEART TWO"/* 2E97 */,/*11928*/"CJK RADICAL HAND"/* 2E98 */,/*11929*/"CJK RADICAL RAP"/* 2E99 */, NULL,/*11931*/"CJK RADICAL CHOKE"/* 2E9B */,/*11932*/"CJK RADICAL SUN"/* 2E9C */,/*11933*/"CJK RADICAL MOON"/* 2E9D */, /*11934*/"CJK RADICAL DEATH"/* 2E9E */,/*11935*/"CJK RADICAL MOTHER"/* 2E9F */,/*11936*/"CJK RADICAL CIVILIAN"/* 2EA0 */, /*11937*/"CJK RADICAL WATER ONE"/* 2EA1 */,/*11938*/"CJK RADICAL WATER TWO"/* 2EA2 */, /*11939*/"CJK RADICAL FIRE"/* 2EA3 */,/*11940*/"CJK RADICAL PAW ONE"/* 2EA4 */,/*11941*/"CJK RADICAL PAW TWO"/* 2EA5 */, /*11942*/"CJK RADICAL SIMPLIFIED HALF TREE TRUNK"/* 2EA6 */,/*11943*/"CJK RADICAL COW"/* 2EA7 */, /*11944*/"CJK RADICAL DOG"/* 2EA8 */,/*11945*/"CJK RADICAL JADE"/* 2EA9 */, /*11946*/"CJK RADICAL BOLT OF CLOTH"/* 2EAA */,/*11947*/"CJK RADICAL EYE"/* 2EAB */, /*11948*/"CJK RADICAL SPIRIT ONE"/* 2EAC */,/*11949*/"CJK RADICAL SPIRIT TWO"/* 2EAD */, /*11950*/"CJK RADICAL BAMBOO"/* 2EAE */,/*11951*/"CJK RADICAL SILK"/* 2EAF */, /*11952*/"CJK RADICAL C-SIMPLIFIED SILK"/* 2EB0 */,/*11953*/"CJK RADICAL NET ONE"/* 2EB1 */, /*11954*/"CJK RADICAL NET TWO"/* 2EB2 */,/*11955*/"CJK RADICAL NET THREE"/* 2EB3 */, /*11956*/"CJK RADICAL NET FOUR"/* 2EB4 */,/*11957*/"CJK RADICAL MESH"/* 2EB5 */,/*11958*/"CJK RADICAL SHEEP"/* 2EB6 */, /*11959*/"CJK RADICAL RAM"/* 2EB7 */,/*11960*/"CJK RADICAL EWE"/* 2EB8 */,/*11961*/"CJK RADICAL OLD"/* 2EB9 */, /*11962*/"CJK RADICAL BRUSH ONE"/* 2EBA */,/*11963*/"CJK RADICAL BRUSH TWO"/* 2EBB */, /*11964*/"CJK RADICAL MEAT"/* 2EBC */,/*11965*/"CJK RADICAL MORTAR"/* 2EBD */,/*11966*/"CJK RADICAL GRASS ONE"/* 2EBE */, /*11967*/"CJK RADICAL GRASS TWO"/* 2EBF */,/*11968*/"CJK RADICAL GRASS THREE"/* 2EC0 */, /*11969*/"CJK RADICAL TIGER"/* 2EC1 */,/*11970*/"CJK RADICAL CLOTHES"/* 2EC2 */, /*11971*/"CJK RADICAL WEST ONE"/* 2EC3 */,/*11972*/"CJK RADICAL WEST TWO"/* 2EC4 */, /*11973*/"CJK RADICAL C-SIMPLIFIED SEE"/* 2EC5 */,/*11974*/"CJK RADICAL SIMPLIFIED HORN"/* 2EC6 */, /*11975*/"CJK RADICAL HORN"/* 2EC7 */,/*11976*/"CJK RADICAL C-SIMPLIFIED SPEECH"/* 2EC8 */, /*11977*/"CJK RADICAL C-SIMPLIFIED SHELL"/* 2EC9 */,/*11978*/"CJK RADICAL FOOT"/* 2ECA */, /*11979*/"CJK RADICAL C-SIMPLIFIED CART"/* 2ECB */,/*11980*/"CJK RADICAL SIMPLIFIED WALK"/* 2ECC */, /*11981*/"CJK RADICAL WALK ONE"/* 2ECD */,/*11982*/"CJK RADICAL WALK TWO"/* 2ECE */, /*11983*/"CJK RADICAL CITY"/* 2ECF */,/*11984*/"CJK RADICAL C-SIMPLIFIED GOLD"/* 2ED0 */, /*11985*/"CJK RADICAL LONG ONE"/* 2ED1 */,/*11986*/"CJK RADICAL LONG TWO"/* 2ED2 */, /*11987*/"CJK RADICAL C-SIMPLIFIED LONG"/* 2ED3 */,/*11988*/"CJK RADICAL C-SIMPLIFIED GATE"/* 2ED4 */, /*11989*/"CJK RADICAL MOUND ONE"/* 2ED5 */,/*11990*/"CJK RADICAL MOUND TWO"/* 2ED6 */, /*11991*/"CJK RADICAL RAIN"/* 2ED7 */,/*11992*/"CJK RADICAL BLUE"/* 2ED8 */, /*11993*/"CJK RADICAL C-SIMPLIFIED TANNED LEATHER"/* 2ED9 */,/*11994*/"CJK RADICAL C-SIMPLIFIED LEAF"/* 2EDA */, /*11995*/"CJK RADICAL C-SIMPLIFIED WIND"/* 2EDB */,/*11996*/"CJK RADICAL C-SIMPLIFIED FLY"/* 2EDC */, /*11997*/"CJK RADICAL EAT ONE"/* 2EDD */,/*11998*/"CJK RADICAL EAT TWO"/* 2EDE */, /*11999*/"CJK RADICAL EAT THREE"/* 2EDF */,/*12000*/"CJK RADICAL C-SIMPLIFIED EAT"/* 2EE0 */, /*12001*/"CJK RADICAL HEAD"/* 2EE1 */,/*12002*/"CJK RADICAL C-SIMPLIFIED HORSE"/* 2EE2 */, /*12003*/"CJK RADICAL BONE"/* 2EE3 */,/*12004*/"CJK RADICAL GHOST"/* 2EE4 */, /*12005*/"CJK RADICAL C-SIMPLIFIED FISH"/* 2EE5 */,/*12006*/"CJK RADICAL C-SIMPLIFIED BIRD"/* 2EE6 */, /*12007*/"CJK RADICAL C-SIMPLIFIED SALT"/* 2EE7 */,/*12008*/"CJK RADICAL SIMPLIFIED WHEAT"/* 2EE8 */, /*12009*/"CJK RADICAL SIMPLIFIED YELLOW"/* 2EE9 */,/*12010*/"CJK RADICAL C-SIMPLIFIED FROG"/* 2EEA */, /*12011*/"CJK RADICAL J-SIMPLIFIED EVEN"/* 2EEB */,/*12012*/"CJK RADICAL C-SIMPLIFIED EVEN"/* 2EEC */, /*12013*/"CJK RADICAL J-SIMPLIFIED TOOTH"/* 2EED */,/*12014*/"CJK RADICAL C-SIMPLIFIED TOOTH"/* 2EEE */, /*12015*/"CJK RADICAL J-SIMPLIFIED DRAGON"/* 2EEF */,/*12016*/"CJK RADICAL C-SIMPLIFIED DRAGON"/* 2EF0 */, /*12017*/"CJK RADICAL TURTLE"/* 2EF1 */,/*12018*/"CJK RADICAL J-SIMPLIFIED TURTLE"/* 2EF2 */, /*12019*/"CJK RADICAL C-SIMPLIFIED TURTLE"/* 2EF3 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*12032*/"KANGXI RADICAL ONE"/* 2F00 */,/*12033*/"KANGXI RADICAL LINE"/* 2F01 */,/*12034*/"KANGXI RADICAL DOT"/* 2F02 */, /*12035*/"KANGXI RADICAL SLASH"/* 2F03 */,/*12036*/"KANGXI RADICAL SECOND"/* 2F04 */, /*12037*/"KANGXI RADICAL HOOK"/* 2F05 */,/*12038*/"KANGXI RADICAL TWO"/* 2F06 */,/*12039*/"KANGXI RADICAL LID"/* 2F07 */, /*12040*/"KANGXI RADICAL MAN"/* 2F08 */,/*12041*/"KANGXI RADICAL LEGS"/* 2F09 */, /*12042*/"KANGXI RADICAL ENTER"/* 2F0A */,/*12043*/"KANGXI RADICAL EIGHT"/* 2F0B */, /*12044*/"KANGXI RADICAL DOWN BOX"/* 2F0C */,/*12045*/"KANGXI RADICAL COVER"/* 2F0D */, /*12046*/"KANGXI RADICAL ICE"/* 2F0E */,/*12047*/"KANGXI RADICAL TABLE"/* 2F0F */, /*12048*/"KANGXI RADICAL OPEN BOX"/* 2F10 */,/*12049*/"KANGXI RADICAL KNIFE"/* 2F11 */, /*12050*/"KANGXI RADICAL POWER"/* 2F12 */,/*12051*/"KANGXI RADICAL WRAP"/* 2F13 */, /*12052*/"KANGXI RADICAL SPOON"/* 2F14 */,/*12053*/"KANGXI RADICAL RIGHT OPEN BOX"/* 2F15 */, /*12054*/"KANGXI RADICAL HIDING ENCLOSURE"/* 2F16 */,/*12055*/"KANGXI RADICAL TEN"/* 2F17 */, /*12056*/"KANGXI RADICAL DIVINATION"/* 2F18 */,/*12057*/"KANGXI RADICAL SEAL"/* 2F19 */, /*12058*/"KANGXI RADICAL CLIFF"/* 2F1A */,/*12059*/"KANGXI RADICAL PRIVATE"/* 2F1B */, /*12060*/"KANGXI RADICAL AGAIN"/* 2F1C */,/*12061*/"KANGXI RADICAL MOUTH"/* 2F1D */, /*12062*/"KANGXI RADICAL ENCLOSURE"/* 2F1E */,/*12063*/"KANGXI RADICAL EARTH"/* 2F1F */, /*12064*/"KANGXI RADICAL SCHOLAR"/* 2F20 */,/*12065*/"KANGXI RADICAL GO"/* 2F21 */, /*12066*/"KANGXI RADICAL GO SLOWLY"/* 2F22 */,/*12067*/"KANGXI RADICAL EVENING"/* 2F23 */, /*12068*/"KANGXI RADICAL BIG"/* 2F24 */,/*12069*/"KANGXI RADICAL WOMAN"/* 2F25 */, /*12070*/"KANGXI RADICAL CHILD"/* 2F26 */,/*12071*/"KANGXI RADICAL ROOF"/* 2F27 */, /*12072*/"KANGXI RADICAL INCH"/* 2F28 */,/*12073*/"KANGXI RADICAL SMALL"/* 2F29 */, /*12074*/"KANGXI RADICAL LAME"/* 2F2A */,/*12075*/"KANGXI RADICAL CORPSE"/* 2F2B */, /*12076*/"KANGXI RADICAL SPROUT"/* 2F2C */,/*12077*/"KANGXI RADICAL MOUNTAIN"/* 2F2D */, /*12078*/"KANGXI RADICAL RIVER"/* 2F2E */,/*12079*/"KANGXI RADICAL WORK"/* 2F2F */, /*12080*/"KANGXI RADICAL ONESELF"/* 2F30 */,/*12081*/"KANGXI RADICAL TURBAN"/* 2F31 */, /*12082*/"KANGXI RADICAL DRY"/* 2F32 */,/*12083*/"KANGXI RADICAL SHORT THREAD"/* 2F33 */, /*12084*/"KANGXI RADICAL DOTTED CLIFF"/* 2F34 */,/*12085*/"KANGXI RADICAL LONG STRIDE"/* 2F35 */, /*12086*/"KANGXI RADICAL TWO HANDS"/* 2F36 */,/*12087*/"KANGXI RADICAL SHOOT"/* 2F37 */, /*12088*/"KANGXI RADICAL BOW"/* 2F38 */,/*12089*/"KANGXI RADICAL SNOUT"/* 2F39 */, /*12090*/"KANGXI RADICAL BRISTLE"/* 2F3A */,/*12091*/"KANGXI RADICAL STEP"/* 2F3B */, /*12092*/"KANGXI RADICAL HEART"/* 2F3C */,/*12093*/"KANGXI RADICAL HALBERD"/* 2F3D */, /*12094*/"KANGXI RADICAL DOOR"/* 2F3E */,/*12095*/"KANGXI RADICAL HAND"/* 2F3F */, /*12096*/"KANGXI RADICAL BRANCH"/* 2F40 */,/*12097*/"KANGXI RADICAL RAP"/* 2F41 */, /*12098*/"KANGXI RADICAL SCRIPT"/* 2F42 */,/*12099*/"KANGXI RADICAL DIPPER"/* 2F43 */, /*12100*/"KANGXI RADICAL AXE"/* 2F44 */,/*12101*/"KANGXI RADICAL SQUARE"/* 2F45 */, /*12102*/"KANGXI RADICAL NOT"/* 2F46 */,/*12103*/"KANGXI RADICAL SUN"/* 2F47 */,/*12104*/"KANGXI RADICAL SAY"/* 2F48 */, /*12105*/"KANGXI RADICAL MOON"/* 2F49 */,/*12106*/"KANGXI RADICAL TREE"/* 2F4A */, /*12107*/"KANGXI RADICAL LACK"/* 2F4B */,/*12108*/"KANGXI RADICAL STOP"/* 2F4C */, /*12109*/"KANGXI RADICAL DEATH"/* 2F4D */,/*12110*/"KANGXI RADICAL WEAPON"/* 2F4E */, /*12111*/"KANGXI RADICAL DO NOT"/* 2F4F */,/*12112*/"KANGXI RADICAL COMPARE"/* 2F50 */, /*12113*/"KANGXI RADICAL FUR"/* 2F51 */,/*12114*/"KANGXI RADICAL CLAN"/* 2F52 */, /*12115*/"KANGXI RADICAL STEAM"/* 2F53 */,/*12116*/"KANGXI RADICAL WATER"/* 2F54 */, /*12117*/"KANGXI RADICAL FIRE"/* 2F55 */,/*12118*/"KANGXI RADICAL CLAW"/* 2F56 */, /*12119*/"KANGXI RADICAL FATHER"/* 2F57 */,/*12120*/"KANGXI RADICAL DOUBLE X"/* 2F58 */, /*12121*/"KANGXI RADICAL HALF TREE TRUNK"/* 2F59 */,/*12122*/"KANGXI RADICAL SLICE"/* 2F5A */, /*12123*/"KANGXI RADICAL FANG"/* 2F5B */,/*12124*/"KANGXI RADICAL COW"/* 2F5C */,/*12125*/"KANGXI RADICAL DOG"/* 2F5D */, /*12126*/"KANGXI RADICAL PROFOUND"/* 2F5E */,/*12127*/"KANGXI RADICAL JADE"/* 2F5F */, /*12128*/"KANGXI RADICAL MELON"/* 2F60 */,/*12129*/"KANGXI RADICAL TILE"/* 2F61 */, /*12130*/"KANGXI RADICAL SWEET"/* 2F62 */,/*12131*/"KANGXI RADICAL LIFE"/* 2F63 */, /*12132*/"KANGXI RADICAL USE"/* 2F64 */,/*12133*/"KANGXI RADICAL FIELD"/* 2F65 */, /*12134*/"KANGXI RADICAL BOLT OF CLOTH"/* 2F66 */,/*12135*/"KANGXI RADICAL SICKNESS"/* 2F67 */, /*12136*/"KANGXI RADICAL DOTTED TENT"/* 2F68 */,/*12137*/"KANGXI RADICAL WHITE"/* 2F69 */, /*12138*/"KANGXI RADICAL SKIN"/* 2F6A */,/*12139*/"KANGXI RADICAL DISH"/* 2F6B */, /*12140*/"KANGXI RADICAL EYE"/* 2F6C */,/*12141*/"KANGXI RADICAL SPEAR"/* 2F6D */, /*12142*/"KANGXI RADICAL ARROW"/* 2F6E */,/*12143*/"KANGXI RADICAL STONE"/* 2F6F */, /*12144*/"KANGXI RADICAL SPIRIT"/* 2F70 */,/*12145*/"KANGXI RADICAL TRACK"/* 2F71 */, /*12146*/"KANGXI RADICAL GRAIN"/* 2F72 */,/*12147*/"KANGXI RADICAL CAVE"/* 2F73 */, /*12148*/"KANGXI RADICAL STAND"/* 2F74 */,/*12149*/"KANGXI RADICAL BAMBOO"/* 2F75 */, /*12150*/"KANGXI RADICAL RICE"/* 2F76 */,/*12151*/"KANGXI RADICAL SILK"/* 2F77 */, /*12152*/"KANGXI RADICAL JAR"/* 2F78 */,/*12153*/"KANGXI RADICAL NET"/* 2F79 */, /*12154*/"KANGXI RADICAL SHEEP"/* 2F7A */,/*12155*/"KANGXI RADICAL FEATHER"/* 2F7B */, /*12156*/"KANGXI RADICAL OLD"/* 2F7C */,/*12157*/"KANGXI RADICAL AND"/* 2F7D */,/*12158*/"KANGXI RADICAL PLOW"/* 2F7E */, /*12159*/"KANGXI RADICAL EAR"/* 2F7F */,/*12160*/"KANGXI RADICAL BRUSH"/* 2F80 */, /*12161*/"KANGXI RADICAL MEAT"/* 2F81 */,/*12162*/"KANGXI RADICAL MINISTER"/* 2F82 */, /*12163*/"KANGXI RADICAL SELF"/* 2F83 */,/*12164*/"KANGXI RADICAL ARRIVE"/* 2F84 */, /*12165*/"KANGXI RADICAL MORTAR"/* 2F85 */,/*12166*/"KANGXI RADICAL TONGUE"/* 2F86 */, /*12167*/"KANGXI RADICAL OPPOSE"/* 2F87 */,/*12168*/"KANGXI RADICAL BOAT"/* 2F88 */, /*12169*/"KANGXI RADICAL STOPPING"/* 2F89 */,/*12170*/"KANGXI RADICAL COLOR"/* 2F8A */, /*12171*/"KANGXI RADICAL GRASS"/* 2F8B */,/*12172*/"KANGXI RADICAL TIGER"/* 2F8C */, /*12173*/"KANGXI RADICAL INSECT"/* 2F8D */,/*12174*/"KANGXI RADICAL BLOOD"/* 2F8E */, /*12175*/"KANGXI RADICAL WALK ENCLOSURE"/* 2F8F */,/*12176*/"KANGXI RADICAL CLOTHES"/* 2F90 */, /*12177*/"KANGXI RADICAL WEST"/* 2F91 */,/*12178*/"KANGXI RADICAL SEE"/* 2F92 */, /*12179*/"KANGXI RADICAL HORN"/* 2F93 */,/*12180*/"KANGXI RADICAL SPEECH"/* 2F94 */, /*12181*/"KANGXI RADICAL VALLEY"/* 2F95 */,/*12182*/"KANGXI RADICAL BEAN"/* 2F96 */, /*12183*/"KANGXI RADICAL PIG"/* 2F97 */,/*12184*/"KANGXI RADICAL BADGER"/* 2F98 */, /*12185*/"KANGXI RADICAL SHELL"/* 2F99 */,/*12186*/"KANGXI RADICAL RED"/* 2F9A */, /*12187*/"KANGXI RADICAL RUN"/* 2F9B */,/*12188*/"KANGXI RADICAL FOOT"/* 2F9C */, /*12189*/"KANGXI RADICAL BODY"/* 2F9D */,/*12190*/"KANGXI RADICAL CART"/* 2F9E */, /*12191*/"KANGXI RADICAL BITTER"/* 2F9F */,/*12192*/"KANGXI RADICAL MORNING"/* 2FA0 */, /*12193*/"KANGXI RADICAL WALK"/* 2FA1 */,/*12194*/"KANGXI RADICAL CITY"/* 2FA2 */, /*12195*/"KANGXI RADICAL WINE"/* 2FA3 */,/*12196*/"KANGXI RADICAL DISTINGUISH"/* 2FA4 */, /*12197*/"KANGXI RADICAL VILLAGE"/* 2FA5 */,/*12198*/"KANGXI RADICAL GOLD"/* 2FA6 */, /*12199*/"KANGXI RADICAL LONG"/* 2FA7 */,/*12200*/"KANGXI RADICAL GATE"/* 2FA8 */, /*12201*/"KANGXI RADICAL MOUND"/* 2FA9 */,/*12202*/"KANGXI RADICAL SLAVE"/* 2FAA */, /*12203*/"KANGXI RADICAL SHORT TAILED BIRD"/* 2FAB */,/*12204*/"KANGXI RADICAL RAIN"/* 2FAC */, /*12205*/"KANGXI RADICAL BLUE"/* 2FAD */,/*12206*/"KANGXI RADICAL WRONG"/* 2FAE */, /*12207*/"KANGXI RADICAL FACE"/* 2FAF */,/*12208*/"KANGXI RADICAL LEATHER"/* 2FB0 */, /*12209*/"KANGXI RADICAL TANNED LEATHER"/* 2FB1 */,/*12210*/"KANGXI RADICAL LEEK"/* 2FB2 */, /*12211*/"KANGXI RADICAL SOUND"/* 2FB3 */,/*12212*/"KANGXI RADICAL LEAF"/* 2FB4 */, /*12213*/"KANGXI RADICAL WIND"/* 2FB5 */,/*12214*/"KANGXI RADICAL FLY"/* 2FB6 */,/*12215*/"KANGXI RADICAL EAT"/* 2FB7 */, /*12216*/"KANGXI RADICAL HEAD"/* 2FB8 */,/*12217*/"KANGXI RADICAL FRAGRANT"/* 2FB9 */, /*12218*/"KANGXI RADICAL HORSE"/* 2FBA */,/*12219*/"KANGXI RADICAL BONE"/* 2FBB */, /*12220*/"KANGXI RADICAL TALL"/* 2FBC */,/*12221*/"KANGXI RADICAL HAIR"/* 2FBD */, /*12222*/"KANGXI RADICAL FIGHT"/* 2FBE */,/*12223*/"KANGXI RADICAL SACRIFICIAL WINE"/* 2FBF */, /*12224*/"KANGXI RADICAL CAULDRON"/* 2FC0 */,/*12225*/"KANGXI RADICAL GHOST"/* 2FC1 */, /*12226*/"KANGXI RADICAL FISH"/* 2FC2 */,/*12227*/"KANGXI RADICAL BIRD"/* 2FC3 */, /*12228*/"KANGXI RADICAL SALT"/* 2FC4 */,/*12229*/"KANGXI RADICAL DEER"/* 2FC5 */, /*12230*/"KANGXI RADICAL WHEAT"/* 2FC6 */,/*12231*/"KANGXI RADICAL HEMP"/* 2FC7 */, /*12232*/"KANGXI RADICAL YELLOW"/* 2FC8 */,/*12233*/"KANGXI RADICAL MILLET"/* 2FC9 */, /*12234*/"KANGXI RADICAL BLACK"/* 2FCA */,/*12235*/"KANGXI RADICAL EMBROIDERY"/* 2FCB */, /*12236*/"KANGXI RADICAL FROG"/* 2FCC */,/*12237*/"KANGXI RADICAL TRIPOD"/* 2FCD */, /*12238*/"KANGXI RADICAL DRUM"/* 2FCE */,/*12239*/"KANGXI RADICAL RAT"/* 2FCF */, /*12240*/"KANGXI RADICAL NOSE"/* 2FD0 */,/*12241*/"KANGXI RADICAL EVEN"/* 2FD1 */, /*12242*/"KANGXI RADICAL TOOTH"/* 2FD2 */,/*12243*/"KANGXI RADICAL DRAGON"/* 2FD3 */, /*12244*/"KANGXI RADICAL TURTLE"/* 2FD4 */,/*12245*/"KANGXI RADICAL FLUTE"/* 2FD5 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*12272*/"IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT"/* 2FF0 */, /*12273*/"IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW"/* 2FF1 */, /*12274*/"IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT"/* 2FF2 */, /*12275*/"IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW"/* 2FF3 */, /*12276*/"IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND"/* 2FF4 */, /*12277*/"IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE"/* 2FF5 */, /*12278*/"IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW"/* 2FF6 */, /*12279*/"IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT"/* 2FF7 */, /*12280*/"IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT"/* 2FF8 */, /*12281*/"IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT"/* 2FF9 */, /*12282*/"IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT"/* 2FFA */, /*12283*/"IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID"/* 2FFB */,NULL,NULL,NULL,NULL, /*12288*/"IDEOGRAPHIC SPACE"/* 3000 */,/*12289*/"IDEOGRAPHIC COMMA"/* 3001 */,/*12290*/"IDEOGRAPHIC FULL STOP"/* 3002 */, /*12291*/"DITTO MARK"/* 3003 */,/*12292*/"JAPANESE INDUSTRIAL STANDARD SYMBOL"/* 3004 */, /*12293*/"IDEOGRAPHIC ITERATION MARK"/* 3005 */,/*12294*/"IDEOGRAPHIC CLOSING MARK"/* 3006 */, /*12295*/"IDEOGRAPHIC NUMBER ZERO"/* 3007 */,/*12296*/"LEFT ANGLE BRACKET"/* 3008 */, /*12297*/"RIGHT ANGLE BRACKET"/* 3009 */,/*12298*/"LEFT DOUBLE ANGLE BRACKET"/* 300A */, /*12299*/"RIGHT DOUBLE ANGLE BRACKET"/* 300B */,/*12300*/"LEFT CORNER BRACKET"/* 300C */, /*12301*/"RIGHT CORNER BRACKET"/* 300D */,/*12302*/"LEFT WHITE CORNER BRACKET"/* 300E */, /*12303*/"RIGHT WHITE CORNER BRACKET"/* 300F */,/*12304*/"LEFT BLACK LENTICULAR BRACKET"/* 3010 */, /*12305*/"RIGHT BLACK LENTICULAR BRACKET"/* 3011 */,/*12306*/"POSTAL MARK"/* 3012 */,/*12307*/"GETA MARK"/* 3013 */, /*12308*/"LEFT TORTOISE SHELL BRACKET"/* 3014 */,/*12309*/"RIGHT TORTOISE SHELL BRACKET"/* 3015 */, /*12310*/"LEFT WHITE LENTICULAR BRACKET"/* 3016 */,/*12311*/"RIGHT WHITE LENTICULAR BRACKET"/* 3017 */, /*12312*/"LEFT WHITE TORTOISE SHELL BRACKET"/* 3018 */,/*12313*/"RIGHT WHITE TORTOISE SHELL BRACKET"/* 3019 */, /*12314*/"LEFT WHITE SQUARE BRACKET"/* 301A */,/*12315*/"RIGHT WHITE SQUARE BRACKET"/* 301B */, /*12316*/"WAVE DASH"/* 301C */,/*12317*/"REVERSED DOUBLE PRIME QUOTATION MARK"/* 301D */, /*12318*/"DOUBLE PRIME QUOTATION MARK"/* 301E */,/*12319*/"LOW DOUBLE PRIME QUOTATION MARK"/* 301F */, /*12320*/"POSTAL MARK FACE"/* 3020 */,/*12321*/"HANGZHOU NUMERAL ONE"/* 3021 */, /*12322*/"HANGZHOU NUMERAL TWO"/* 3022 */,/*12323*/"HANGZHOU NUMERAL THREE"/* 3023 */, /*12324*/"HANGZHOU NUMERAL FOUR"/* 3024 */,/*12325*/"HANGZHOU NUMERAL FIVE"/* 3025 */, /*12326*/"HANGZHOU NUMERAL SIX"/* 3026 */,/*12327*/"HANGZHOU NUMERAL SEVEN"/* 3027 */, /*12328*/"HANGZHOU NUMERAL EIGHT"/* 3028 */,/*12329*/"HANGZHOU NUMERAL NINE"/* 3029 */, /*12330*/"IDEOGRAPHIC LEVEL TONE MARK"/* 302A */,/*12331*/"IDEOGRAPHIC RISING TONE MARK"/* 302B */, /*12332*/"IDEOGRAPHIC DEPARTING TONE MARK"/* 302C */,/*12333*/"IDEOGRAPHIC ENTERING TONE MARK"/* 302D */, /*12334*/"HANGUL SINGLE DOT TONE MARK"/* 302E */,/*12335*/"HANGUL DOUBLE DOT TONE MARK"/* 302F */, /*12336*/"WAVY DASH"/* 3030 */,/*12337*/"VERTICAL KANA REPEAT MARK"/* 3031 */, /*12338*/"VERTICAL KANA REPEAT WITH VOICED SOUND MARK"/* 3032 */, /*12339*/"VERTICAL KANA REPEAT MARK UPPER HALF"/* 3033 */, /*12340*/"VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF"/* 3034 */, /*12341*/"VERTICAL KANA REPEAT MARK LOWER HALF"/* 3035 */,/*12342*/"CIRCLED POSTAL MARK"/* 3036 */, /*12343*/"IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL"/* 3037 */,/*12344*/"HANGZHOU NUMERAL TEN"/* 3038 */, /*12345*/"HANGZHOU NUMERAL TWENTY"/* 3039 */,/*12346*/"HANGZHOU NUMERAL THIRTY"/* 303A */, /*12347*/"VERTICAL IDEOGRAPHIC ITERATION MARK"/* 303B */,/*12348*/"MASU MARK"/* 303C */, /*12349*/"PART ALTERNATION MARK"/* 303D */,/*12350*/"IDEOGRAPHIC VARIATION INDICATOR"/* 303E */, /*12351*/"IDEOGRAPHIC HALF FILL SPACE"/* 303F */,NULL,/*12353*/"HIRAGANA LETTER SMALL A"/* 3041 */, /*12354*/"HIRAGANA LETTER A"/* 3042 */,/*12355*/"HIRAGANA LETTER SMALL I"/* 3043 */, /*12356*/"HIRAGANA LETTER I"/* 3044 */,/*12357*/"HIRAGANA LETTER SMALL U"/* 3045 */, /*12358*/"HIRAGANA LETTER U"/* 3046 */,/*12359*/"HIRAGANA LETTER SMALL E"/* 3047 */, /*12360*/"HIRAGANA LETTER E"/* 3048 */,/*12361*/"HIRAGANA LETTER SMALL O"/* 3049 */, /*12362*/"HIRAGANA LETTER O"/* 304A */,/*12363*/"HIRAGANA LETTER KA"/* 304B */,/*12364*/"HIRAGANA LETTER GA"/* 304C */, /*12365*/"HIRAGANA LETTER KI"/* 304D */,/*12366*/"HIRAGANA LETTER GI"/* 304E */,/*12367*/"HIRAGANA LETTER KU"/* 304F */, /*12368*/"HIRAGANA LETTER GU"/* 3050 */,/*12369*/"HIRAGANA LETTER KE"/* 3051 */,/*12370*/"HIRAGANA LETTER GE"/* 3052 */, /*12371*/"HIRAGANA LETTER KO"/* 3053 */,/*12372*/"HIRAGANA LETTER GO"/* 3054 */,/*12373*/"HIRAGANA LETTER SA"/* 3055 */, /*12374*/"HIRAGANA LETTER ZA"/* 3056 */,/*12375*/"HIRAGANA LETTER SI"/* 3057 */,/*12376*/"HIRAGANA LETTER ZI"/* 3058 */, /*12377*/"HIRAGANA LETTER SU"/* 3059 */,/*12378*/"HIRAGANA LETTER ZU"/* 305A */,/*12379*/"HIRAGANA LETTER SE"/* 305B */, /*12380*/"HIRAGANA LETTER ZE"/* 305C */,/*12381*/"HIRAGANA LETTER SO"/* 305D */,/*12382*/"HIRAGANA LETTER ZO"/* 305E */, /*12383*/"HIRAGANA LETTER TA"/* 305F */,/*12384*/"HIRAGANA LETTER DA"/* 3060 */,/*12385*/"HIRAGANA LETTER TI"/* 3061 */, /*12386*/"HIRAGANA LETTER DI"/* 3062 */,/*12387*/"HIRAGANA LETTER SMALL TU"/* 3063 */, /*12388*/"HIRAGANA LETTER TU"/* 3064 */,/*12389*/"HIRAGANA LETTER DU"/* 3065 */,/*12390*/"HIRAGANA LETTER TE"/* 3066 */, /*12391*/"HIRAGANA LETTER DE"/* 3067 */,/*12392*/"HIRAGANA LETTER TO"/* 3068 */,/*12393*/"HIRAGANA LETTER DO"/* 3069 */, /*12394*/"HIRAGANA LETTER NA"/* 306A */,/*12395*/"HIRAGANA LETTER NI"/* 306B */,/*12396*/"HIRAGANA LETTER NU"/* 306C */, /*12397*/"HIRAGANA LETTER NE"/* 306D */,/*12398*/"HIRAGANA LETTER NO"/* 306E */,/*12399*/"HIRAGANA LETTER HA"/* 306F */, /*12400*/"HIRAGANA LETTER BA"/* 3070 */,/*12401*/"HIRAGANA LETTER PA"/* 3071 */,/*12402*/"HIRAGANA LETTER HI"/* 3072 */, /*12403*/"HIRAGANA LETTER BI"/* 3073 */,/*12404*/"HIRAGANA LETTER PI"/* 3074 */,/*12405*/"HIRAGANA LETTER HU"/* 3075 */, /*12406*/"HIRAGANA LETTER BU"/* 3076 */,/*12407*/"HIRAGANA LETTER PU"/* 3077 */,/*12408*/"HIRAGANA LETTER HE"/* 3078 */, /*12409*/"HIRAGANA LETTER BE"/* 3079 */,/*12410*/"HIRAGANA LETTER PE"/* 307A */,/*12411*/"HIRAGANA LETTER HO"/* 307B */, /*12412*/"HIRAGANA LETTER BO"/* 307C */,/*12413*/"HIRAGANA LETTER PO"/* 307D */,/*12414*/"HIRAGANA LETTER MA"/* 307E */, /*12415*/"HIRAGANA LETTER MI"/* 307F */,/*12416*/"HIRAGANA LETTER MU"/* 3080 */,/*12417*/"HIRAGANA LETTER ME"/* 3081 */, /*12418*/"HIRAGANA LETTER MO"/* 3082 */,/*12419*/"HIRAGANA LETTER SMALL YA"/* 3083 */, /*12420*/"HIRAGANA LETTER YA"/* 3084 */,/*12421*/"HIRAGANA LETTER SMALL YU"/* 3085 */, /*12422*/"HIRAGANA LETTER YU"/* 3086 */,/*12423*/"HIRAGANA LETTER SMALL YO"/* 3087 */, /*12424*/"HIRAGANA LETTER YO"/* 3088 */,/*12425*/"HIRAGANA LETTER RA"/* 3089 */,/*12426*/"HIRAGANA LETTER RI"/* 308A */, /*12427*/"HIRAGANA LETTER RU"/* 308B */,/*12428*/"HIRAGANA LETTER RE"/* 308C */,/*12429*/"HIRAGANA LETTER RO"/* 308D */, /*12430*/"HIRAGANA LETTER SMALL WA"/* 308E */,/*12431*/"HIRAGANA LETTER WA"/* 308F */, /*12432*/"HIRAGANA LETTER WI"/* 3090 */,/*12433*/"HIRAGANA LETTER WE"/* 3091 */,/*12434*/"HIRAGANA LETTER WO"/* 3092 */, /*12435*/"HIRAGANA LETTER N"/* 3093 */,/*12436*/"HIRAGANA LETTER VU"/* 3094 */, /*12437*/"HIRAGANA LETTER SMALL KA"/* 3095 */,/*12438*/"HIRAGANA LETTER SMALL KE"/* 3096 */,NULL,NULL, /*12441*/"COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK"/* 3099 */, /*12442*/"COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK"/* 309A */, /*12443*/"KATAKANA-HIRAGANA VOICED SOUND MARK"/* 309B */,/*12444*/"KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK"/* 309C */, /*12445*/"HIRAGANA ITERATION MARK"/* 309D */,/*12446*/"HIRAGANA VOICED ITERATION MARK"/* 309E */, /*12447*/"HIRAGANA DIGRAPH YORI"/* 309F */,/*12448*/"KATAKANA-HIRAGANA DOUBLE HYPHEN"/* 30A0 */, /*12449*/"KATAKANA LETTER SMALL A"/* 30A1 */,/*12450*/"KATAKANA LETTER A"/* 30A2 */, /*12451*/"KATAKANA LETTER SMALL I"/* 30A3 */,/*12452*/"KATAKANA LETTER I"/* 30A4 */, /*12453*/"KATAKANA LETTER SMALL U"/* 30A5 */,/*12454*/"KATAKANA LETTER U"/* 30A6 */, /*12455*/"KATAKANA LETTER SMALL E"/* 30A7 */,/*12456*/"KATAKANA LETTER E"/* 30A8 */, /*12457*/"KATAKANA LETTER SMALL O"/* 30A9 */,/*12458*/"KATAKANA LETTER O"/* 30AA */, /*12459*/"KATAKANA LETTER KA"/* 30AB */,/*12460*/"KATAKANA LETTER GA"/* 30AC */,/*12461*/"KATAKANA LETTER KI"/* 30AD */, /*12462*/"KATAKANA LETTER GI"/* 30AE */,/*12463*/"KATAKANA LETTER KU"/* 30AF */,/*12464*/"KATAKANA LETTER GU"/* 30B0 */, /*12465*/"KATAKANA LETTER KE"/* 30B1 */,/*12466*/"KATAKANA LETTER GE"/* 30B2 */,/*12467*/"KATAKANA LETTER KO"/* 30B3 */, /*12468*/"KATAKANA LETTER GO"/* 30B4 */,/*12469*/"KATAKANA LETTER SA"/* 30B5 */,/*12470*/"KATAKANA LETTER ZA"/* 30B6 */, /*12471*/"KATAKANA LETTER SI"/* 30B7 */,/*12472*/"KATAKANA LETTER ZI"/* 30B8 */,/*12473*/"KATAKANA LETTER SU"/* 30B9 */, /*12474*/"KATAKANA LETTER ZU"/* 30BA */,/*12475*/"KATAKANA LETTER SE"/* 30BB */,/*12476*/"KATAKANA LETTER ZE"/* 30BC */, /*12477*/"KATAKANA LETTER SO"/* 30BD */,/*12478*/"KATAKANA LETTER ZO"/* 30BE */,/*12479*/"KATAKANA LETTER TA"/* 30BF */, /*12480*/"KATAKANA LETTER DA"/* 30C0 */,/*12481*/"KATAKANA LETTER TI"/* 30C1 */,/*12482*/"KATAKANA LETTER DI"/* 30C2 */, /*12483*/"KATAKANA LETTER SMALL TU"/* 30C3 */,/*12484*/"KATAKANA LETTER TU"/* 30C4 */, /*12485*/"KATAKANA LETTER DU"/* 30C5 */,/*12486*/"KATAKANA LETTER TE"/* 30C6 */,/*12487*/"KATAKANA LETTER DE"/* 30C7 */, /*12488*/"KATAKANA LETTER TO"/* 30C8 */,/*12489*/"KATAKANA LETTER DO"/* 30C9 */,/*12490*/"KATAKANA LETTER NA"/* 30CA */, /*12491*/"KATAKANA LETTER NI"/* 30CB */,/*12492*/"KATAKANA LETTER NU"/* 30CC */,/*12493*/"KATAKANA LETTER NE"/* 30CD */, /*12494*/"KATAKANA LETTER NO"/* 30CE */,/*12495*/"KATAKANA LETTER HA"/* 30CF */,/*12496*/"KATAKANA LETTER BA"/* 30D0 */, /*12497*/"KATAKANA LETTER PA"/* 30D1 */,/*12498*/"KATAKANA LETTER HI"/* 30D2 */,/*12499*/"KATAKANA LETTER BI"/* 30D3 */, /*12500*/"KATAKANA LETTER PI"/* 30D4 */,/*12501*/"KATAKANA LETTER HU"/* 30D5 */,/*12502*/"KATAKANA LETTER BU"/* 30D6 */, /*12503*/"KATAKANA LETTER PU"/* 30D7 */,/*12504*/"KATAKANA LETTER HE"/* 30D8 */,/*12505*/"KATAKANA LETTER BE"/* 30D9 */, /*12506*/"KATAKANA LETTER PE"/* 30DA */,/*12507*/"KATAKANA LETTER HO"/* 30DB */,/*12508*/"KATAKANA LETTER BO"/* 30DC */, /*12509*/"KATAKANA LETTER PO"/* 30DD */,/*12510*/"KATAKANA LETTER MA"/* 30DE */,/*12511*/"KATAKANA LETTER MI"/* 30DF */, /*12512*/"KATAKANA LETTER MU"/* 30E0 */,/*12513*/"KATAKANA LETTER ME"/* 30E1 */,/*12514*/"KATAKANA LETTER MO"/* 30E2 */, /*12515*/"KATAKANA LETTER SMALL YA"/* 30E3 */,/*12516*/"KATAKANA LETTER YA"/* 30E4 */, /*12517*/"KATAKANA LETTER SMALL YU"/* 30E5 */,/*12518*/"KATAKANA LETTER YU"/* 30E6 */, /*12519*/"KATAKANA LETTER SMALL YO"/* 30E7 */,/*12520*/"KATAKANA LETTER YO"/* 30E8 */, /*12521*/"KATAKANA LETTER RA"/* 30E9 */,/*12522*/"KATAKANA LETTER RI"/* 30EA */,/*12523*/"KATAKANA LETTER RU"/* 30EB */, /*12524*/"KATAKANA LETTER RE"/* 30EC */,/*12525*/"KATAKANA LETTER RO"/* 30ED */, /*12526*/"KATAKANA LETTER SMALL WA"/* 30EE */,/*12527*/"KATAKANA LETTER WA"/* 30EF */, /*12528*/"KATAKANA LETTER WI"/* 30F0 */,/*12529*/"KATAKANA LETTER WE"/* 30F1 */,/*12530*/"KATAKANA LETTER WO"/* 30F2 */, /*12531*/"KATAKANA LETTER N"/* 30F3 */,/*12532*/"KATAKANA LETTER VU"/* 30F4 */, /*12533*/"KATAKANA LETTER SMALL KA"/* 30F5 */,/*12534*/"KATAKANA LETTER SMALL KE"/* 30F6 */, /*12535*/"KATAKANA LETTER VA"/* 30F7 */,/*12536*/"KATAKANA LETTER VI"/* 30F8 */,/*12537*/"KATAKANA LETTER VE"/* 30F9 */, /*12538*/"KATAKANA LETTER VO"/* 30FA */,/*12539*/"KATAKANA MIDDLE DOT"/* 30FB */, /*12540*/"KATAKANA-HIRAGANA PROLONGED SOUND MARK"/* 30FC */,/*12541*/"KATAKANA ITERATION MARK"/* 30FD */, /*12542*/"KATAKANA VOICED ITERATION MARK"/* 30FE */,/*12543*/"KATAKANA DIGRAPH KOTO"/* 30FF */,NULL,NULL,NULL,NULL,NULL, /*12549*/"BOPOMOFO LETTER B"/* 3105 */,/*12550*/"BOPOMOFO LETTER P"/* 3106 */,/*12551*/"BOPOMOFO LETTER M"/* 3107 */, /*12552*/"BOPOMOFO LETTER F"/* 3108 */,/*12553*/"BOPOMOFO LETTER D"/* 3109 */,/*12554*/"BOPOMOFO LETTER T"/* 310A */, /*12555*/"BOPOMOFO LETTER N"/* 310B */,/*12556*/"BOPOMOFO LETTER L"/* 310C */,/*12557*/"BOPOMOFO LETTER G"/* 310D */, /*12558*/"BOPOMOFO LETTER K"/* 310E */,/*12559*/"BOPOMOFO LETTER H"/* 310F */,/*12560*/"BOPOMOFO LETTER J"/* 3110 */, /*12561*/"BOPOMOFO LETTER Q"/* 3111 */,/*12562*/"BOPOMOFO LETTER X"/* 3112 */,/*12563*/"BOPOMOFO LETTER ZH"/* 3113 */, /*12564*/"BOPOMOFO LETTER CH"/* 3114 */,/*12565*/"BOPOMOFO LETTER SH"/* 3115 */,/*12566*/"BOPOMOFO LETTER R"/* 3116 */, /*12567*/"BOPOMOFO LETTER Z"/* 3117 */,/*12568*/"BOPOMOFO LETTER C"/* 3118 */,/*12569*/"BOPOMOFO LETTER S"/* 3119 */, /*12570*/"BOPOMOFO LETTER A"/* 311A */,/*12571*/"BOPOMOFO LETTER O"/* 311B */,/*12572*/"BOPOMOFO LETTER E"/* 311C */, /*12573*/"BOPOMOFO LETTER EH"/* 311D */,/*12574*/"BOPOMOFO LETTER AI"/* 311E */,/*12575*/"BOPOMOFO LETTER EI"/* 311F */, /*12576*/"BOPOMOFO LETTER AU"/* 3120 */,/*12577*/"BOPOMOFO LETTER OU"/* 3121 */,/*12578*/"BOPOMOFO LETTER AN"/* 3122 */, /*12579*/"BOPOMOFO LETTER EN"/* 3123 */,/*12580*/"BOPOMOFO LETTER ANG"/* 3124 */, /*12581*/"BOPOMOFO LETTER ENG"/* 3125 */,/*12582*/"BOPOMOFO LETTER ER"/* 3126 */,/*12583*/"BOPOMOFO LETTER I"/* 3127 */, /*12584*/"BOPOMOFO LETTER U"/* 3128 */,/*12585*/"BOPOMOFO LETTER IU"/* 3129 */,/*12586*/"BOPOMOFO LETTER V"/* 312A */, /*12587*/"BOPOMOFO LETTER NG"/* 312B */,/*12588*/"BOPOMOFO LETTER GN"/* 312C */,/*12589*/"BOPOMOFO LETTER IH"/* 312D */, /*12590*/"BOPOMOFO LETTER O WITH DOT ABOVE"/* 312E */,NULL,NULL,/*12593*/"HANGUL LETTER KIYEOK"/* 3131 */, /*12594*/"HANGUL LETTER SSANGKIYEOK"/* 3132 */,/*12595*/"HANGUL LETTER KIYEOK-SIOS"/* 3133 */, /*12596*/"HANGUL LETTER NIEUN"/* 3134 */,/*12597*/"HANGUL LETTER NIEUN-CIEUC"/* 3135 */, /*12598*/"HANGUL LETTER NIEUN-HIEUH"/* 3136 */,/*12599*/"HANGUL LETTER TIKEUT"/* 3137 */, /*12600*/"HANGUL LETTER SSANGTIKEUT"/* 3138 */,/*12601*/"HANGUL LETTER RIEUL"/* 3139 */, /*12602*/"HANGUL LETTER RIEUL-KIYEOK"/* 313A */,/*12603*/"HANGUL LETTER RIEUL-MIEUM"/* 313B */, /*12604*/"HANGUL LETTER RIEUL-PIEUP"/* 313C */,/*12605*/"HANGUL LETTER RIEUL-SIOS"/* 313D */, /*12606*/"HANGUL LETTER RIEUL-THIEUTH"/* 313E */,/*12607*/"HANGUL LETTER RIEUL-PHIEUPH"/* 313F */, /*12608*/"HANGUL LETTER RIEUL-HIEUH"/* 3140 */,/*12609*/"HANGUL LETTER MIEUM"/* 3141 */, /*12610*/"HANGUL LETTER PIEUP"/* 3142 */,/*12611*/"HANGUL LETTER SSANGPIEUP"/* 3143 */, /*12612*/"HANGUL LETTER PIEUP-SIOS"/* 3144 */,/*12613*/"HANGUL LETTER SIOS"/* 3145 */, /*12614*/"HANGUL LETTER SSANGSIOS"/* 3146 */,/*12615*/"HANGUL LETTER IEUNG"/* 3147 */, /*12616*/"HANGUL LETTER CIEUC"/* 3148 */,/*12617*/"HANGUL LETTER SSANGCIEUC"/* 3149 */, /*12618*/"HANGUL LETTER CHIEUCH"/* 314A */,/*12619*/"HANGUL LETTER KHIEUKH"/* 314B */, /*12620*/"HANGUL LETTER THIEUTH"/* 314C */,/*12621*/"HANGUL LETTER PHIEUPH"/* 314D */, /*12622*/"HANGUL LETTER HIEUH"/* 314E */,/*12623*/"HANGUL LETTER A"/* 314F */,/*12624*/"HANGUL LETTER AE"/* 3150 */, /*12625*/"HANGUL LETTER YA"/* 3151 */,/*12626*/"HANGUL LETTER YAE"/* 3152 */,/*12627*/"HANGUL LETTER EO"/* 3153 */, /*12628*/"HANGUL LETTER E"/* 3154 */,/*12629*/"HANGUL LETTER YEO"/* 3155 */,/*12630*/"HANGUL LETTER YE"/* 3156 */, /*12631*/"HANGUL LETTER O"/* 3157 */,/*12632*/"HANGUL LETTER WA"/* 3158 */,/*12633*/"HANGUL LETTER WAE"/* 3159 */, /*12634*/"HANGUL LETTER OE"/* 315A */,/*12635*/"HANGUL LETTER YO"/* 315B */,/*12636*/"HANGUL LETTER U"/* 315C */, /*12637*/"HANGUL LETTER WEO"/* 315D */,/*12638*/"HANGUL LETTER WE"/* 315E */,/*12639*/"HANGUL LETTER WI"/* 315F */, /*12640*/"HANGUL LETTER YU"/* 3160 */,/*12641*/"HANGUL LETTER EU"/* 3161 */,/*12642*/"HANGUL LETTER YI"/* 3162 */, /*12643*/"HANGUL LETTER I"/* 3163 */,/*12644*/"HANGUL FILLER"/* 3164 */,/*12645*/"HANGUL LETTER SSANGNIEUN"/* 3165 */, /*12646*/"HANGUL LETTER NIEUN-TIKEUT"/* 3166 */,/*12647*/"HANGUL LETTER NIEUN-SIOS"/* 3167 */, /*12648*/"HANGUL LETTER NIEUN-PANSIOS"/* 3168 */,/*12649*/"HANGUL LETTER RIEUL-KIYEOK-SIOS"/* 3169 */, /*12650*/"HANGUL LETTER RIEUL-TIKEUT"/* 316A */,/*12651*/"HANGUL LETTER RIEUL-PIEUP-SIOS"/* 316B */, /*12652*/"HANGUL LETTER RIEUL-PANSIOS"/* 316C */,/*12653*/"HANGUL LETTER RIEUL-YEORINHIEUH"/* 316D */, /*12654*/"HANGUL LETTER MIEUM-PIEUP"/* 316E */,/*12655*/"HANGUL LETTER MIEUM-SIOS"/* 316F */, /*12656*/"HANGUL LETTER MIEUM-PANSIOS"/* 3170 */,/*12657*/"HANGUL LETTER KAPYEOUNMIEUM"/* 3171 */, /*12658*/"HANGUL LETTER PIEUP-KIYEOK"/* 3172 */,/*12659*/"HANGUL LETTER PIEUP-TIKEUT"/* 3173 */, /*12660*/"HANGUL LETTER PIEUP-SIOS-KIYEOK"/* 3174 */,/*12661*/"HANGUL LETTER PIEUP-SIOS-TIKEUT"/* 3175 */, /*12662*/"HANGUL LETTER PIEUP-CIEUC"/* 3176 */,/*12663*/"HANGUL LETTER PIEUP-THIEUTH"/* 3177 */, /*12664*/"HANGUL LETTER KAPYEOUNPIEUP"/* 3178 */,/*12665*/"HANGUL LETTER KAPYEOUNSSANGPIEUP"/* 3179 */, /*12666*/"HANGUL LETTER SIOS-KIYEOK"/* 317A */,/*12667*/"HANGUL LETTER SIOS-NIEUN"/* 317B */, /*12668*/"HANGUL LETTER SIOS-TIKEUT"/* 317C */,/*12669*/"HANGUL LETTER SIOS-PIEUP"/* 317D */, /*12670*/"HANGUL LETTER SIOS-CIEUC"/* 317E */,/*12671*/"HANGUL LETTER PANSIOS"/* 317F */, /*12672*/"HANGUL LETTER SSANGIEUNG"/* 3180 */,/*12673*/"HANGUL LETTER YESIEUNG"/* 3181 */, /*12674*/"HANGUL LETTER YESIEUNG-SIOS"/* 3182 */,/*12675*/"HANGUL LETTER YESIEUNG-PANSIOS"/* 3183 */, /*12676*/"HANGUL LETTER KAPYEOUNPHIEUPH"/* 3184 */,/*12677*/"HANGUL LETTER SSANGHIEUH"/* 3185 */, /*12678*/"HANGUL LETTER YEORINHIEUH"/* 3186 */,/*12679*/"HANGUL LETTER YO-YA"/* 3187 */, /*12680*/"HANGUL LETTER YO-YAE"/* 3188 */,/*12681*/"HANGUL LETTER YO-I"/* 3189 */, /*12682*/"HANGUL LETTER YU-YEO"/* 318A */,/*12683*/"HANGUL LETTER YU-YE"/* 318B */, /*12684*/"HANGUL LETTER YU-I"/* 318C */,/*12685*/"HANGUL LETTER ARAEA"/* 318D */, /*12686*/"HANGUL LETTER ARAEAE"/* 318E */,NULL,/*12688*/"IDEOGRAPHIC ANNOTATION LINKING MARK"/* 3190 */, /*12689*/"IDEOGRAPHIC ANNOTATION REVERSE MARK"/* 3191 */,/*12690*/"IDEOGRAPHIC ANNOTATION ONE MARK"/* 3192 */, /*12691*/"IDEOGRAPHIC ANNOTATION TWO MARK"/* 3193 */,/*12692*/"IDEOGRAPHIC ANNOTATION THREE MARK"/* 3194 */, /*12693*/"IDEOGRAPHIC ANNOTATION FOUR MARK"/* 3195 */,/*12694*/"IDEOGRAPHIC ANNOTATION TOP MARK"/* 3196 */, /*12695*/"IDEOGRAPHIC ANNOTATION MIDDLE MARK"/* 3197 */,/*12696*/"IDEOGRAPHIC ANNOTATION BOTTOM MARK"/* 3198 */, /*12697*/"IDEOGRAPHIC ANNOTATION FIRST MARK"/* 3199 */,/*12698*/"IDEOGRAPHIC ANNOTATION SECOND MARK"/* 319A */, /*12699*/"IDEOGRAPHIC ANNOTATION THIRD MARK"/* 319B */,/*12700*/"IDEOGRAPHIC ANNOTATION FOURTH MARK"/* 319C */, /*12701*/"IDEOGRAPHIC ANNOTATION HEAVEN MARK"/* 319D */,/*12702*/"IDEOGRAPHIC ANNOTATION EARTH MARK"/* 319E */, /*12703*/"IDEOGRAPHIC ANNOTATION MAN MARK"/* 319F */,/*12704*/"BOPOMOFO LETTER BU"/* 31A0 */, /*12705*/"BOPOMOFO LETTER ZI"/* 31A1 */,/*12706*/"BOPOMOFO LETTER JI"/* 31A2 */,/*12707*/"BOPOMOFO LETTER GU"/* 31A3 */, /*12708*/"BOPOMOFO LETTER EE"/* 31A4 */,/*12709*/"BOPOMOFO LETTER ENN"/* 31A5 */,/*12710*/"BOPOMOFO LETTER OO"/* 31A6 */, /*12711*/"BOPOMOFO LETTER ONN"/* 31A7 */,/*12712*/"BOPOMOFO LETTER IR"/* 31A8 */, /*12713*/"BOPOMOFO LETTER ANN"/* 31A9 */,/*12714*/"BOPOMOFO LETTER INN"/* 31AA */, /*12715*/"BOPOMOFO LETTER UNN"/* 31AB */,/*12716*/"BOPOMOFO LETTER IM"/* 31AC */, /*12717*/"BOPOMOFO LETTER NGG"/* 31AD */,/*12718*/"BOPOMOFO LETTER AINN"/* 31AE */, /*12719*/"BOPOMOFO LETTER AUNN"/* 31AF */,/*12720*/"BOPOMOFO LETTER AM"/* 31B0 */, /*12721*/"BOPOMOFO LETTER OM"/* 31B1 */,/*12722*/"BOPOMOFO LETTER ONG"/* 31B2 */, /*12723*/"BOPOMOFO LETTER INNN"/* 31B3 */,/*12724*/"BOPOMOFO FINAL LETTER P"/* 31B4 */, /*12725*/"BOPOMOFO FINAL LETTER T"/* 31B5 */,/*12726*/"BOPOMOFO FINAL LETTER K"/* 31B6 */, /*12727*/"BOPOMOFO FINAL LETTER H"/* 31B7 */,/*12728*/"BOPOMOFO LETTER GH"/* 31B8 */, /*12729*/"BOPOMOFO LETTER LH"/* 31B9 */,/*12730*/"BOPOMOFO LETTER ZY"/* 31BA */,NULL,NULL,NULL,NULL,NULL, /*12736*/"CJK STROKE T"/* 31C0 */,/*12737*/"CJK STROKE WG"/* 31C1 */,/*12738*/"CJK STROKE XG"/* 31C2 */, /*12739*/"CJK STROKE BXG"/* 31C3 */,/*12740*/"CJK STROKE SW"/* 31C4 */,/*12741*/"CJK STROKE HZZ"/* 31C5 */, /*12742*/"CJK STROKE HZG"/* 31C6 */,/*12743*/"CJK STROKE HP"/* 31C7 */,/*12744*/"CJK STROKE HZWG"/* 31C8 */, /*12745*/"CJK STROKE SZWG"/* 31C9 */,/*12746*/"CJK STROKE HZT"/* 31CA */,/*12747*/"CJK STROKE HZZP"/* 31CB */, /*12748*/"CJK STROKE HPWG"/* 31CC */,/*12749*/"CJK STROKE HZW"/* 31CD */,/*12750*/"CJK STROKE HZZZ"/* 31CE */, /*12751*/"CJK STROKE N"/* 31CF */,/*12752*/"CJK STROKE H"/* 31D0 */,/*12753*/"CJK STROKE S"/* 31D1 */, /*12754*/"CJK STROKE P"/* 31D2 */,/*12755*/"CJK STROKE SP"/* 31D3 */,/*12756*/"CJK STROKE D"/* 31D4 */, /*12757*/"CJK STROKE HZ"/* 31D5 */,/*12758*/"CJK STROKE HG"/* 31D6 */,/*12759*/"CJK STROKE SZ"/* 31D7 */, /*12760*/"CJK STROKE SWZ"/* 31D8 */,/*12761*/"CJK STROKE ST"/* 31D9 */,/*12762*/"CJK STROKE SG"/* 31DA */, /*12763*/"CJK STROKE PD"/* 31DB */,/*12764*/"CJK STROKE PZ"/* 31DC */,/*12765*/"CJK STROKE TN"/* 31DD */, /*12766*/"CJK STROKE SZZ"/* 31DE */,/*12767*/"CJK STROKE SWG"/* 31DF */,/*12768*/"CJK STROKE HXWG"/* 31E0 */, /*12769*/"CJK STROKE HZZZG"/* 31E1 */,/*12770*/"CJK STROKE PG"/* 31E2 */,/*12771*/"CJK STROKE Q"/* 31E3 */,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*12784*/"KATAKANA LETTER SMALL KU"/* 31F0 */, /*12785*/"KATAKANA LETTER SMALL SI"/* 31F1 */,/*12786*/"KATAKANA LETTER SMALL SU"/* 31F2 */, /*12787*/"KATAKANA LETTER SMALL TO"/* 31F3 */,/*12788*/"KATAKANA LETTER SMALL NU"/* 31F4 */, /*12789*/"KATAKANA LETTER SMALL HA"/* 31F5 */,/*12790*/"KATAKANA LETTER SMALL HI"/* 31F6 */, /*12791*/"KATAKANA LETTER SMALL HU"/* 31F7 */,/*12792*/"KATAKANA LETTER SMALL HE"/* 31F8 */, /*12793*/"KATAKANA LETTER SMALL HO"/* 31F9 */,/*12794*/"KATAKANA LETTER SMALL MU"/* 31FA */, /*12795*/"KATAKANA LETTER SMALL RA"/* 31FB */,/*12796*/"KATAKANA LETTER SMALL RI"/* 31FC */, /*12797*/"KATAKANA LETTER SMALL RU"/* 31FD */,/*12798*/"KATAKANA LETTER SMALL RE"/* 31FE */, /*12799*/"KATAKANA LETTER SMALL RO"/* 31FF */,/*12800*/"PARENTHESIZED HANGUL KIYEOK"/* 3200 */, /*12801*/"PARENTHESIZED HANGUL NIEUN"/* 3201 */,/*12802*/"PARENTHESIZED HANGUL TIKEUT"/* 3202 */, /*12803*/"PARENTHESIZED HANGUL RIEUL"/* 3203 */,/*12804*/"PARENTHESIZED HANGUL MIEUM"/* 3204 */, /*12805*/"PARENTHESIZED HANGUL PIEUP"/* 3205 */,/*12806*/"PARENTHESIZED HANGUL SIOS"/* 3206 */, /*12807*/"PARENTHESIZED HANGUL IEUNG"/* 3207 */,/*12808*/"PARENTHESIZED HANGUL CIEUC"/* 3208 */, /*12809*/"PARENTHESIZED HANGUL CHIEUCH"/* 3209 */,/*12810*/"PARENTHESIZED HANGUL KHIEUKH"/* 320A */, /*12811*/"PARENTHESIZED HANGUL THIEUTH"/* 320B */,/*12812*/"PARENTHESIZED HANGUL PHIEUPH"/* 320C */, /*12813*/"PARENTHESIZED HANGUL HIEUH"/* 320D */,/*12814*/"PARENTHESIZED HANGUL KIYEOK A"/* 320E */, /*12815*/"PARENTHESIZED HANGUL NIEUN A"/* 320F */,/*12816*/"PARENTHESIZED HANGUL TIKEUT A"/* 3210 */, /*12817*/"PARENTHESIZED HANGUL RIEUL A"/* 3211 */,/*12818*/"PARENTHESIZED HANGUL MIEUM A"/* 3212 */, /*12819*/"PARENTHESIZED HANGUL PIEUP A"/* 3213 */,/*12820*/"PARENTHESIZED HANGUL SIOS A"/* 3214 */, /*12821*/"PARENTHESIZED HANGUL IEUNG A"/* 3215 */,/*12822*/"PARENTHESIZED HANGUL CIEUC A"/* 3216 */, /*12823*/"PARENTHESIZED HANGUL CHIEUCH A"/* 3217 */,/*12824*/"PARENTHESIZED HANGUL KHIEUKH A"/* 3218 */, /*12825*/"PARENTHESIZED HANGUL THIEUTH A"/* 3219 */,/*12826*/"PARENTHESIZED HANGUL PHIEUPH A"/* 321A */, /*12827*/"PARENTHESIZED HANGUL HIEUH A"/* 321B */,/*12828*/"PARENTHESIZED HANGUL CIEUC U"/* 321C */, /*12829*/"PARENTHESIZED KOREAN CHARACTER OJEON"/* 321D */,/*12830*/"PARENTHESIZED KOREAN CHARACTER O HU"/* 321E */,NULL, /*12832*/"PARENTHESIZED IDEOGRAPH ONE"/* 3220 */,/*12833*/"PARENTHESIZED IDEOGRAPH TWO"/* 3221 */, /*12834*/"PARENTHESIZED IDEOGRAPH THREE"/* 3222 */,/*12835*/"PARENTHESIZED IDEOGRAPH FOUR"/* 3223 */, /*12836*/"PARENTHESIZED IDEOGRAPH FIVE"/* 3224 */,/*12837*/"PARENTHESIZED IDEOGRAPH SIX"/* 3225 */, /*12838*/"PARENTHESIZED IDEOGRAPH SEVEN"/* 3226 */,/*12839*/"PARENTHESIZED IDEOGRAPH EIGHT"/* 3227 */, /*12840*/"PARENTHESIZED IDEOGRAPH NINE"/* 3228 */,/*12841*/"PARENTHESIZED IDEOGRAPH TEN"/* 3229 */, /*12842*/"PARENTHESIZED IDEOGRAPH MOON"/* 322A */,/*12843*/"PARENTHESIZED IDEOGRAPH FIRE"/* 322B */, /*12844*/"PARENTHESIZED IDEOGRAPH WATER"/* 322C */,/*12845*/"PARENTHESIZED IDEOGRAPH WOOD"/* 322D */, /*12846*/"PARENTHESIZED IDEOGRAPH METAL"/* 322E */,/*12847*/"PARENTHESIZED IDEOGRAPH EARTH"/* 322F */, /*12848*/"PARENTHESIZED IDEOGRAPH SUN"/* 3230 */,/*12849*/"PARENTHESIZED IDEOGRAPH STOCK"/* 3231 */, /*12850*/"PARENTHESIZED IDEOGRAPH HAVE"/* 3232 */,/*12851*/"PARENTHESIZED IDEOGRAPH SOCIETY"/* 3233 */, /*12852*/"PARENTHESIZED IDEOGRAPH NAME"/* 3234 */,/*12853*/"PARENTHESIZED IDEOGRAPH SPECIAL"/* 3235 */, /*12854*/"PARENTHESIZED IDEOGRAPH FINANCIAL"/* 3236 */,/*12855*/"PARENTHESIZED IDEOGRAPH CONGRATULATION"/* 3237 */, /*12856*/"PARENTHESIZED IDEOGRAPH LABOR"/* 3238 */,/*12857*/"PARENTHESIZED IDEOGRAPH REPRESENT"/* 3239 */, /*12858*/"PARENTHESIZED IDEOGRAPH CALL"/* 323A */,/*12859*/"PARENTHESIZED IDEOGRAPH STUDY"/* 323B */, /*12860*/"PARENTHESIZED IDEOGRAPH SUPERVISE"/* 323C */,/*12861*/"PARENTHESIZED IDEOGRAPH ENTERPRISE"/* 323D */, /*12862*/"PARENTHESIZED IDEOGRAPH RESOURCE"/* 323E */,/*12863*/"PARENTHESIZED IDEOGRAPH ALLIANCE"/* 323F */, /*12864*/"PARENTHESIZED IDEOGRAPH FESTIVAL"/* 3240 */,/*12865*/"PARENTHESIZED IDEOGRAPH REST"/* 3241 */, /*12866*/"PARENTHESIZED IDEOGRAPH SELF"/* 3242 */,/*12867*/"PARENTHESIZED IDEOGRAPH REACH"/* 3243 */, /*12868*/"CIRCLED IDEOGRAPH QUESTION"/* 3244 */,/*12869*/"CIRCLED IDEOGRAPH KINDERGARTEN"/* 3245 */, /*12870*/"CIRCLED IDEOGRAPH SCHOOL"/* 3246 */,/*12871*/"CIRCLED IDEOGRAPH KOTO"/* 3247 */, /*12872*/"CIRCLED NUMBER TEN ON BLACK SQUARE"/* 3248 */,/*12873*/"CIRCLED NUMBER TWENTY ON BLACK SQUARE"/* 3249 */, /*12874*/"CIRCLED NUMBER THIRTY ON BLACK SQUARE"/* 324A */,/*12875*/"CIRCLED NUMBER FORTY ON BLACK SQUARE"/* 324B */, /*12876*/"CIRCLED NUMBER FIFTY ON BLACK SQUARE"/* 324C */,/*12877*/"CIRCLED NUMBER SIXTY ON BLACK SQUARE"/* 324D */, /*12878*/"CIRCLED NUMBER SEVENTY ON BLACK SQUARE"/* 324E */,/*12879*/"CIRCLED NUMBER EIGHTY ON BLACK SQUARE"/* 324F */, /*12880*/"PARTNERSHIP SIGN"/* 3250 */,/*12881*/"CIRCLED NUMBER TWENTY ONE"/* 3251 */, /*12882*/"CIRCLED NUMBER TWENTY TWO"/* 3252 */,/*12883*/"CIRCLED NUMBER TWENTY THREE"/* 3253 */, /*12884*/"CIRCLED NUMBER TWENTY FOUR"/* 3254 */,/*12885*/"CIRCLED NUMBER TWENTY FIVE"/* 3255 */, /*12886*/"CIRCLED NUMBER TWENTY SIX"/* 3256 */,/*12887*/"CIRCLED NUMBER TWENTY SEVEN"/* 3257 */, /*12888*/"CIRCLED NUMBER TWENTY EIGHT"/* 3258 */,/*12889*/"CIRCLED NUMBER TWENTY NINE"/* 3259 */, /*12890*/"CIRCLED NUMBER THIRTY"/* 325A */,/*12891*/"CIRCLED NUMBER THIRTY ONE"/* 325B */, /*12892*/"CIRCLED NUMBER THIRTY TWO"/* 325C */,/*12893*/"CIRCLED NUMBER THIRTY THREE"/* 325D */, /*12894*/"CIRCLED NUMBER THIRTY FOUR"/* 325E */,/*12895*/"CIRCLED NUMBER THIRTY FIVE"/* 325F */, /*12896*/"CIRCLED HANGUL KIYEOK"/* 3260 */,/*12897*/"CIRCLED HANGUL NIEUN"/* 3261 */, /*12898*/"CIRCLED HANGUL TIKEUT"/* 3262 */,/*12899*/"CIRCLED HANGUL RIEUL"/* 3263 */, /*12900*/"CIRCLED HANGUL MIEUM"/* 3264 */,/*12901*/"CIRCLED HANGUL PIEUP"/* 3265 */, /*12902*/"CIRCLED HANGUL SIOS"/* 3266 */,/*12903*/"CIRCLED HANGUL IEUNG"/* 3267 */, /*12904*/"CIRCLED HANGUL CIEUC"/* 3268 */,/*12905*/"CIRCLED HANGUL CHIEUCH"/* 3269 */, /*12906*/"CIRCLED HANGUL KHIEUKH"/* 326A */,/*12907*/"CIRCLED HANGUL THIEUTH"/* 326B */, /*12908*/"CIRCLED HANGUL PHIEUPH"/* 326C */,/*12909*/"CIRCLED HANGUL HIEUH"/* 326D */, /*12910*/"CIRCLED HANGUL KIYEOK A"/* 326E */,/*12911*/"CIRCLED HANGUL NIEUN A"/* 326F */, /*12912*/"CIRCLED HANGUL TIKEUT A"/* 3270 */,/*12913*/"CIRCLED HANGUL RIEUL A"/* 3271 */, /*12914*/"CIRCLED HANGUL MIEUM A"/* 3272 */,/*12915*/"CIRCLED HANGUL PIEUP A"/* 3273 */, /*12916*/"CIRCLED HANGUL SIOS A"/* 3274 */,/*12917*/"CIRCLED HANGUL IEUNG A"/* 3275 */, /*12918*/"CIRCLED HANGUL CIEUC A"/* 3276 */,/*12919*/"CIRCLED HANGUL CHIEUCH A"/* 3277 */, /*12920*/"CIRCLED HANGUL KHIEUKH A"/* 3278 */,/*12921*/"CIRCLED HANGUL THIEUTH A"/* 3279 */, /*12922*/"CIRCLED HANGUL PHIEUPH A"/* 327A */,/*12923*/"CIRCLED HANGUL HIEUH A"/* 327B */, /*12924*/"CIRCLED KOREAN CHARACTER CHAMKO"/* 327C */,/*12925*/"CIRCLED KOREAN CHARACTER JUEUI"/* 327D */, /*12926*/"CIRCLED HANGUL IEUNG U"/* 327E */,/*12927*/"KOREAN STANDARD SYMBOL"/* 327F */, /*12928*/"CIRCLED IDEOGRAPH ONE"/* 3280 */,/*12929*/"CIRCLED IDEOGRAPH TWO"/* 3281 */, /*12930*/"CIRCLED IDEOGRAPH THREE"/* 3282 */,/*12931*/"CIRCLED IDEOGRAPH FOUR"/* 3283 */, /*12932*/"CIRCLED IDEOGRAPH FIVE"/* 3284 */,/*12933*/"CIRCLED IDEOGRAPH SIX"/* 3285 */, /*12934*/"CIRCLED IDEOGRAPH SEVEN"/* 3286 */,/*12935*/"CIRCLED IDEOGRAPH EIGHT"/* 3287 */, /*12936*/"CIRCLED IDEOGRAPH NINE"/* 3288 */,/*12937*/"CIRCLED IDEOGRAPH TEN"/* 3289 */, /*12938*/"CIRCLED IDEOGRAPH MOON"/* 328A */,/*12939*/"CIRCLED IDEOGRAPH FIRE"/* 328B */, /*12940*/"CIRCLED IDEOGRAPH WATER"/* 328C */,/*12941*/"CIRCLED IDEOGRAPH WOOD"/* 328D */, /*12942*/"CIRCLED IDEOGRAPH METAL"/* 328E */,/*12943*/"CIRCLED IDEOGRAPH EARTH"/* 328F */, /*12944*/"CIRCLED IDEOGRAPH SUN"/* 3290 */,/*12945*/"CIRCLED IDEOGRAPH STOCK"/* 3291 */, /*12946*/"CIRCLED IDEOGRAPH HAVE"/* 3292 */,/*12947*/"CIRCLED IDEOGRAPH SOCIETY"/* 3293 */, /*12948*/"CIRCLED IDEOGRAPH NAME"/* 3294 */,/*12949*/"CIRCLED IDEOGRAPH SPECIAL"/* 3295 */, /*12950*/"CIRCLED IDEOGRAPH FINANCIAL"/* 3296 */,/*12951*/"CIRCLED IDEOGRAPH CONGRATULATION"/* 3297 */, /*12952*/"CIRCLED IDEOGRAPH LABOR"/* 3298 */,/*12953*/"CIRCLED IDEOGRAPH SECRET"/* 3299 */, /*12954*/"CIRCLED IDEOGRAPH MALE"/* 329A */,/*12955*/"CIRCLED IDEOGRAPH FEMALE"/* 329B */, /*12956*/"CIRCLED IDEOGRAPH SUITABLE"/* 329C */,/*12957*/"CIRCLED IDEOGRAPH EXCELLENT"/* 329D */, /*12958*/"CIRCLED IDEOGRAPH PRINT"/* 329E */,/*12959*/"CIRCLED IDEOGRAPH ATTENTION"/* 329F */, /*12960*/"CIRCLED IDEOGRAPH ITEM"/* 32A0 */,/*12961*/"CIRCLED IDEOGRAPH REST"/* 32A1 */, /*12962*/"CIRCLED IDEOGRAPH COPY"/* 32A2 */,/*12963*/"CIRCLED IDEOGRAPH CORRECT"/* 32A3 */, /*12964*/"CIRCLED IDEOGRAPH HIGH"/* 32A4 */,/*12965*/"CIRCLED IDEOGRAPH CENTRE"/* 32A5 */, /*12966*/"CIRCLED IDEOGRAPH LOW"/* 32A6 */,/*12967*/"CIRCLED IDEOGRAPH LEFT"/* 32A7 */, /*12968*/"CIRCLED IDEOGRAPH RIGHT"/* 32A8 */,/*12969*/"CIRCLED IDEOGRAPH MEDICINE"/* 32A9 */, /*12970*/"CIRCLED IDEOGRAPH RELIGION"/* 32AA */,/*12971*/"CIRCLED IDEOGRAPH STUDY"/* 32AB */, /*12972*/"CIRCLED IDEOGRAPH SUPERVISE"/* 32AC */,/*12973*/"CIRCLED IDEOGRAPH ENTERPRISE"/* 32AD */, /*12974*/"CIRCLED IDEOGRAPH RESOURCE"/* 32AE */,/*12975*/"CIRCLED IDEOGRAPH ALLIANCE"/* 32AF */, /*12976*/"CIRCLED IDEOGRAPH NIGHT"/* 32B0 */,/*12977*/"CIRCLED NUMBER THIRTY SIX"/* 32B1 */, /*12978*/"CIRCLED NUMBER THIRTY SEVEN"/* 32B2 */,/*12979*/"CIRCLED NUMBER THIRTY EIGHT"/* 32B3 */, /*12980*/"CIRCLED NUMBER THIRTY NINE"/* 32B4 */,/*12981*/"CIRCLED NUMBER FORTY"/* 32B5 */, /*12982*/"CIRCLED NUMBER FORTY ONE"/* 32B6 */,/*12983*/"CIRCLED NUMBER FORTY TWO"/* 32B7 */, /*12984*/"CIRCLED NUMBER FORTY THREE"/* 32B8 */,/*12985*/"CIRCLED NUMBER FORTY FOUR"/* 32B9 */, /*12986*/"CIRCLED NUMBER FORTY FIVE"/* 32BA */,/*12987*/"CIRCLED NUMBER FORTY SIX"/* 32BB */, /*12988*/"CIRCLED NUMBER FORTY SEVEN"/* 32BC */,/*12989*/"CIRCLED NUMBER FORTY EIGHT"/* 32BD */, /*12990*/"CIRCLED NUMBER FORTY NINE"/* 32BE */,/*12991*/"CIRCLED NUMBER FIFTY"/* 32BF */, /*12992*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY"/* 32C0 */, /*12993*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY"/* 32C1 */, /*12994*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH"/* 32C2 */,/*12995*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL"/* 32C3 */, /*12996*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY"/* 32C4 */,/*12997*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE"/* 32C5 */, /*12998*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY"/* 32C6 */,/*12999*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST"/* 32C7 */, /*13000*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER"/* 32C8 */, /*13001*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER"/* 32C9 */, /*13002*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER"/* 32CA */, /*13003*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER"/* 32CB */,/*13004*/"SQUARE HG"/* 32CC */, /*13005*/"SQUARE ERG"/* 32CD */,/*13006*/"SQUARE EV"/* 32CE */,/*13007*/"LIMITED LIABILITY SIGN"/* 32CF */, /*13008*/"CIRCLED KATAKANA A"/* 32D0 */,/*13009*/"CIRCLED KATAKANA I"/* 32D1 */,/*13010*/"CIRCLED KATAKANA U"/* 32D2 */, /*13011*/"CIRCLED KATAKANA E"/* 32D3 */,/*13012*/"CIRCLED KATAKANA O"/* 32D4 */,/*13013*/"CIRCLED KATAKANA KA"/* 32D5 */, /*13014*/"CIRCLED KATAKANA KI"/* 32D6 */,/*13015*/"CIRCLED KATAKANA KU"/* 32D7 */, /*13016*/"CIRCLED KATAKANA KE"/* 32D8 */,/*13017*/"CIRCLED KATAKANA KO"/* 32D9 */, /*13018*/"CIRCLED KATAKANA SA"/* 32DA */,/*13019*/"CIRCLED KATAKANA SI"/* 32DB */, /*13020*/"CIRCLED KATAKANA SU"/* 32DC */,/*13021*/"CIRCLED KATAKANA SE"/* 32DD */, /*13022*/"CIRCLED KATAKANA SO"/* 32DE */,/*13023*/"CIRCLED KATAKANA TA"/* 32DF */, /*13024*/"CIRCLED KATAKANA TI"/* 32E0 */,/*13025*/"CIRCLED KATAKANA TU"/* 32E1 */, /*13026*/"CIRCLED KATAKANA TE"/* 32E2 */,/*13027*/"CIRCLED KATAKANA TO"/* 32E3 */, /*13028*/"CIRCLED KATAKANA NA"/* 32E4 */,/*13029*/"CIRCLED KATAKANA NI"/* 32E5 */, /*13030*/"CIRCLED KATAKANA NU"/* 32E6 */,/*13031*/"CIRCLED KATAKANA NE"/* 32E7 */, /*13032*/"CIRCLED KATAKANA NO"/* 32E8 */,/*13033*/"CIRCLED KATAKANA HA"/* 32E9 */, /*13034*/"CIRCLED KATAKANA HI"/* 32EA */,/*13035*/"CIRCLED KATAKANA HU"/* 32EB */, /*13036*/"CIRCLED KATAKANA HE"/* 32EC */,/*13037*/"CIRCLED KATAKANA HO"/* 32ED */, /*13038*/"CIRCLED KATAKANA MA"/* 32EE */,/*13039*/"CIRCLED KATAKANA MI"/* 32EF */, /*13040*/"CIRCLED KATAKANA MU"/* 32F0 */,/*13041*/"CIRCLED KATAKANA ME"/* 32F1 */, /*13042*/"CIRCLED KATAKANA MO"/* 32F2 */,/*13043*/"CIRCLED KATAKANA YA"/* 32F3 */, /*13044*/"CIRCLED KATAKANA YU"/* 32F4 */,/*13045*/"CIRCLED KATAKANA YO"/* 32F5 */, /*13046*/"CIRCLED KATAKANA RA"/* 32F6 */,/*13047*/"CIRCLED KATAKANA RI"/* 32F7 */, /*13048*/"CIRCLED KATAKANA RU"/* 32F8 */,/*13049*/"CIRCLED KATAKANA RE"/* 32F9 */, /*13050*/"CIRCLED KATAKANA RO"/* 32FA */,/*13051*/"CIRCLED KATAKANA WA"/* 32FB */, /*13052*/"CIRCLED KATAKANA WI"/* 32FC */,/*13053*/"CIRCLED KATAKANA WE"/* 32FD */, /*13054*/"CIRCLED KATAKANA WO"/* 32FE */,NULL,/*13056*/"SQUARE APAATO"/* 3300 */,/*13057*/"SQUARE ARUHUA"/* 3301 */, /*13058*/"SQUARE ANPEA"/* 3302 */,/*13059*/"SQUARE AARU"/* 3303 */,/*13060*/"SQUARE ININGU"/* 3304 */, /*13061*/"SQUARE INTI"/* 3305 */,/*13062*/"SQUARE UON"/* 3306 */,/*13063*/"SQUARE ESUKUUDO"/* 3307 */, /*13064*/"SQUARE EEKAA"/* 3308 */,/*13065*/"SQUARE ONSU"/* 3309 */,/*13066*/"SQUARE OOMU"/* 330A */, /*13067*/"SQUARE KAIRI"/* 330B */,/*13068*/"SQUARE KARATTO"/* 330C */,/*13069*/"SQUARE KARORII"/* 330D */, /*13070*/"SQUARE GARON"/* 330E */,/*13071*/"SQUARE GANMA"/* 330F */,/*13072*/"SQUARE GIGA"/* 3310 */, /*13073*/"SQUARE GINII"/* 3311 */,/*13074*/"SQUARE KYURII"/* 3312 */,/*13075*/"SQUARE GIRUDAA"/* 3313 */, /*13076*/"SQUARE KIRO"/* 3314 */,/*13077*/"SQUARE KIROGURAMU"/* 3315 */,/*13078*/"SQUARE KIROMEETORU"/* 3316 */, /*13079*/"SQUARE KIROWATTO"/* 3317 */,/*13080*/"SQUARE GURAMU"/* 3318 */,/*13081*/"SQUARE GURAMUTON"/* 3319 */, /*13082*/"SQUARE KURUZEIRO"/* 331A */,/*13083*/"SQUARE KUROONE"/* 331B */,/*13084*/"SQUARE KEESU"/* 331C */, /*13085*/"SQUARE KORUNA"/* 331D */,/*13086*/"SQUARE KOOPO"/* 331E */,/*13087*/"SQUARE SAIKURU"/* 331F */, /*13088*/"SQUARE SANTIIMU"/* 3320 */,/*13089*/"SQUARE SIRINGU"/* 3321 */,/*13090*/"SQUARE SENTI"/* 3322 */, /*13091*/"SQUARE SENTO"/* 3323 */,/*13092*/"SQUARE DAASU"/* 3324 */,/*13093*/"SQUARE DESI"/* 3325 */, /*13094*/"SQUARE DORU"/* 3326 */,/*13095*/"SQUARE TON"/* 3327 */,/*13096*/"SQUARE NANO"/* 3328 */, /*13097*/"SQUARE NOTTO"/* 3329 */,/*13098*/"SQUARE HAITU"/* 332A */,/*13099*/"SQUARE PAASENTO"/* 332B */, /*13100*/"SQUARE PAATU"/* 332C */,/*13101*/"SQUARE BAARERU"/* 332D */,/*13102*/"SQUARE PIASUTORU"/* 332E */, /*13103*/"SQUARE PIKURU"/* 332F */,/*13104*/"SQUARE PIKO"/* 3330 */,/*13105*/"SQUARE BIRU"/* 3331 */, /*13106*/"SQUARE HUARADDO"/* 3332 */,/*13107*/"SQUARE HUIITO"/* 3333 */,/*13108*/"SQUARE BUSSYERU"/* 3334 */, /*13109*/"SQUARE HURAN"/* 3335 */,/*13110*/"SQUARE HEKUTAARU"/* 3336 */,/*13111*/"SQUARE PESO"/* 3337 */, /*13112*/"SQUARE PENIHI"/* 3338 */,/*13113*/"SQUARE HERUTU"/* 3339 */,/*13114*/"SQUARE PENSU"/* 333A */, /*13115*/"SQUARE PEEZI"/* 333B */,/*13116*/"SQUARE BEETA"/* 333C */,/*13117*/"SQUARE POINTO"/* 333D */, /*13118*/"SQUARE BORUTO"/* 333E */,/*13119*/"SQUARE HON"/* 333F */,/*13120*/"SQUARE PONDO"/* 3340 */, /*13121*/"SQUARE HOORU"/* 3341 */,/*13122*/"SQUARE HOON"/* 3342 */,/*13123*/"SQUARE MAIKURO"/* 3343 */, /*13124*/"SQUARE MAIRU"/* 3344 */,/*13125*/"SQUARE MAHHA"/* 3345 */,/*13126*/"SQUARE MARUKU"/* 3346 */, /*13127*/"SQUARE MANSYON"/* 3347 */,/*13128*/"SQUARE MIKURON"/* 3348 */,/*13129*/"SQUARE MIRI"/* 3349 */, /*13130*/"SQUARE MIRIBAARU"/* 334A */,/*13131*/"SQUARE MEGA"/* 334B */,/*13132*/"SQUARE MEGATON"/* 334C */, /*13133*/"SQUARE MEETORU"/* 334D */,/*13134*/"SQUARE YAADO"/* 334E */,/*13135*/"SQUARE YAARU"/* 334F */, /*13136*/"SQUARE YUAN"/* 3350 */,/*13137*/"SQUARE RITTORU"/* 3351 */,/*13138*/"SQUARE RIRA"/* 3352 */, /*13139*/"SQUARE RUPII"/* 3353 */,/*13140*/"SQUARE RUUBURU"/* 3354 */,/*13141*/"SQUARE REMU"/* 3355 */, /*13142*/"SQUARE RENTOGEN"/* 3356 */,/*13143*/"SQUARE WATTO"/* 3357 */, /*13144*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO"/* 3358 */, /*13145*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE"/* 3359 */, /*13146*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO"/* 335A */, /*13147*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE"/* 335B */, /*13148*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR"/* 335C */, /*13149*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE"/* 335D */, /*13150*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX"/* 335E */, /*13151*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN"/* 335F */, /*13152*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT"/* 3360 */, /*13153*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE"/* 3361 */, /*13154*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN"/* 3362 */, /*13155*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN"/* 3363 */, /*13156*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE"/* 3364 */, /*13157*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN"/* 3365 */, /*13158*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN"/* 3366 */, /*13159*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN"/* 3367 */, /*13160*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN"/* 3368 */, /*13161*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN"/* 3369 */, /*13162*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN"/* 336A */, /*13163*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN"/* 336B */, /*13164*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY"/* 336C */, /*13165*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE"/* 336D */, /*13166*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO"/* 336E */, /*13167*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE"/* 336F */, /*13168*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR"/* 3370 */,/*13169*/"SQUARE HPA"/* 3371 */, /*13170*/"SQUARE DA"/* 3372 */,/*13171*/"SQUARE AU"/* 3373 */,/*13172*/"SQUARE BAR"/* 3374 */, /*13173*/"SQUARE OV"/* 3375 */,/*13174*/"SQUARE PC"/* 3376 */,/*13175*/"SQUARE DM"/* 3377 */, /*13176*/"SQUARE DM SQUARED"/* 3378 */,/*13177*/"SQUARE DM CUBED"/* 3379 */,/*13178*/"SQUARE IU"/* 337A */, /*13179*/"SQUARE ERA NAME HEISEI"/* 337B */,/*13180*/"SQUARE ERA NAME SYOUWA"/* 337C */, /*13181*/"SQUARE ERA NAME TAISYOU"/* 337D */,/*13182*/"SQUARE ERA NAME MEIZI"/* 337E */, /*13183*/"SQUARE CORPORATION"/* 337F */,/*13184*/"SQUARE PA AMPS"/* 3380 */,/*13185*/"SQUARE NA"/* 3381 */, /*13186*/"SQUARE MU A"/* 3382 */,/*13187*/"SQUARE MA"/* 3383 */,/*13188*/"SQUARE KA"/* 3384 */, /*13189*/"SQUARE KB"/* 3385 */,/*13190*/"SQUARE MB"/* 3386 */,/*13191*/"SQUARE GB"/* 3387 */, /*13192*/"SQUARE CAL"/* 3388 */,/*13193*/"SQUARE KCAL"/* 3389 */,/*13194*/"SQUARE PF"/* 338A */, /*13195*/"SQUARE NF"/* 338B */,/*13196*/"SQUARE MU F"/* 338C */,/*13197*/"SQUARE MU G"/* 338D */, /*13198*/"SQUARE MG"/* 338E */,/*13199*/"SQUARE KG"/* 338F */,/*13200*/"SQUARE HZ"/* 3390 */, /*13201*/"SQUARE KHZ"/* 3391 */,/*13202*/"SQUARE MHZ"/* 3392 */,/*13203*/"SQUARE GHZ"/* 3393 */, /*13204*/"SQUARE THZ"/* 3394 */,/*13205*/"SQUARE MU L"/* 3395 */,/*13206*/"SQUARE ML"/* 3396 */, /*13207*/"SQUARE DL"/* 3397 */,/*13208*/"SQUARE KL"/* 3398 */,/*13209*/"SQUARE FM"/* 3399 */, /*13210*/"SQUARE NM"/* 339A */,/*13211*/"SQUARE MU M"/* 339B */,/*13212*/"SQUARE MM"/* 339C */, /*13213*/"SQUARE CM"/* 339D */,/*13214*/"SQUARE KM"/* 339E */,/*13215*/"SQUARE MM SQUARED"/* 339F */, /*13216*/"SQUARE CM SQUARED"/* 33A0 */,/*13217*/"SQUARE M SQUARED"/* 33A1 */,/*13218*/"SQUARE KM SQUARED"/* 33A2 */, /*13219*/"SQUARE MM CUBED"/* 33A3 */,/*13220*/"SQUARE CM CUBED"/* 33A4 */,/*13221*/"SQUARE M CUBED"/* 33A5 */, /*13222*/"SQUARE KM CUBED"/* 33A6 */,/*13223*/"SQUARE M OVER S"/* 33A7 */,/*13224*/"SQUARE M OVER S SQUARED"/* 33A8 */, /*13225*/"SQUARE PA"/* 33A9 */,/*13226*/"SQUARE KPA"/* 33AA */,/*13227*/"SQUARE MPA"/* 33AB */, /*13228*/"SQUARE GPA"/* 33AC */,/*13229*/"SQUARE RAD"/* 33AD */,/*13230*/"SQUARE RAD OVER S"/* 33AE */, /*13231*/"SQUARE RAD OVER S SQUARED"/* 33AF */,/*13232*/"SQUARE PS"/* 33B0 */,/*13233*/"SQUARE NS"/* 33B1 */, /*13234*/"SQUARE MU S"/* 33B2 */,/*13235*/"SQUARE MS"/* 33B3 */,/*13236*/"SQUARE PV"/* 33B4 */, /*13237*/"SQUARE NV"/* 33B5 */,/*13238*/"SQUARE MU V"/* 33B6 */,/*13239*/"SQUARE MV"/* 33B7 */, /*13240*/"SQUARE KV"/* 33B8 */,/*13241*/"SQUARE MV MEGA"/* 33B9 */,/*13242*/"SQUARE PW"/* 33BA */, /*13243*/"SQUARE NW"/* 33BB */,/*13244*/"SQUARE MU W"/* 33BC */,/*13245*/"SQUARE MW"/* 33BD */, /*13246*/"SQUARE KW"/* 33BE */,/*13247*/"SQUARE MW MEGA"/* 33BF */,/*13248*/"SQUARE K OHM"/* 33C0 */, /*13249*/"SQUARE M OHM"/* 33C1 */,/*13250*/"SQUARE AM"/* 33C2 */,/*13251*/"SQUARE BQ"/* 33C3 */, /*13252*/"SQUARE CC"/* 33C4 */,/*13253*/"SQUARE CD"/* 33C5 */,/*13254*/"SQUARE C OVER KG"/* 33C6 */, /*13255*/"SQUARE CO"/* 33C7 */,/*13256*/"SQUARE DB"/* 33C8 */,/*13257*/"SQUARE GY"/* 33C9 */, /*13258*/"SQUARE HA"/* 33CA */,/*13259*/"SQUARE HP"/* 33CB */,/*13260*/"SQUARE IN"/* 33CC */, /*13261*/"SQUARE KK"/* 33CD */,/*13262*/"SQUARE KM CAPITAL"/* 33CE */,/*13263*/"SQUARE KT"/* 33CF */, /*13264*/"SQUARE LM"/* 33D0 */,/*13265*/"SQUARE LN"/* 33D1 */,/*13266*/"SQUARE LOG"/* 33D2 */, /*13267*/"SQUARE LX"/* 33D3 */,/*13268*/"SQUARE MB SMALL"/* 33D4 */,/*13269*/"SQUARE MIL"/* 33D5 */, /*13270*/"SQUARE MOL"/* 33D6 */,/*13271*/"SQUARE PH"/* 33D7 */,/*13272*/"SQUARE PM"/* 33D8 */, /*13273*/"SQUARE PPM"/* 33D9 */,/*13274*/"SQUARE PR"/* 33DA */,/*13275*/"SQUARE SR"/* 33DB */, /*13276*/"SQUARE SV"/* 33DC */,/*13277*/"SQUARE WB"/* 33DD */,/*13278*/"SQUARE V OVER M"/* 33DE */, /*13279*/"SQUARE A OVER M"/* 33DF */,/*13280*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE"/* 33E0 */, /*13281*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO"/* 33E1 */, /*13282*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE"/* 33E2 */, /*13283*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR"/* 33E3 */, /*13284*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE"/* 33E4 */, /*13285*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX"/* 33E5 */, /*13286*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN"/* 33E6 */, /*13287*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT"/* 33E7 */, /*13288*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE"/* 33E8 */, /*13289*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN"/* 33E9 */, /*13290*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN"/* 33EA */, /*13291*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE"/* 33EB */, /*13292*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN"/* 33EC */, /*13293*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN"/* 33ED */, /*13294*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN"/* 33EE */, /*13295*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN"/* 33EF */, /*13296*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN"/* 33F0 */, /*13297*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN"/* 33F1 */, /*13298*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN"/* 33F2 */, /*13299*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY"/* 33F3 */, /*13300*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE"/* 33F4 */, /*13301*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO"/* 33F5 */, /*13302*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE"/* 33F6 */, /*13303*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR"/* 33F7 */, /*13304*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE"/* 33F8 */, /*13305*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX"/* 33F9 */, /*13306*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN"/* 33FA */, /*13307*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT"/* 33FB */, /*13308*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE"/* 33FC */, /*13309*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY"/* 33FD */, /*13310*/"IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE"/* 33FE */,/*13311*/"SQUARE GAL"/* 33FF */, /*13312*/""/* 3400 */,NULL,NULL,NULL,NULL,/*13317*/""/* 3405 */, /*13318*/""/* 3406 */,/*13319*/""/* 3483 */, /*13320*/""/* 3484 */,/*13321*/""/* 382A */, /*13322*/""/* 382B */,/*13323*/""/* 3B4D */, /*13324*/""/* 3B4E */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*13335*/"HEXAGRAM FOR THE CREATIVE HEAVEN"/* 4DC0 */,/*13336*/"HEXAGRAM FOR THE RECEPTIVE EARTH"/* 4DC1 */, /*13337*/"HEXAGRAM FOR DIFFICULTY AT THE BEGINNING"/* 4DC2 */,/*13338*/"HEXAGRAM FOR YOUTHFUL FOLLY"/* 4DC3 */, /*13339*/"HEXAGRAM FOR WAITING"/* 4DC4 */,/*13340*/"HEXAGRAM FOR CONFLICT"/* 4DC5 */, /*13341*/"HEXAGRAM FOR THE ARMY"/* 4DC6 */,/*13342*/"HEXAGRAM FOR HOLDING TOGETHER"/* 4DC7 */, /*13343*/"HEXAGRAM FOR SMALL TAMING"/* 4DC8 */,/*13344*/"HEXAGRAM FOR TREADING"/* 4DC9 */, /*13345*/"HEXAGRAM FOR PEACE"/* 4DCA */,/*13346*/"HEXAGRAM FOR STANDSTILL"/* 4DCB */, /*13347*/"HEXAGRAM FOR FELLOWSHIP"/* 4DCC */,/*13348*/"HEXAGRAM FOR GREAT POSSESSION"/* 4DCD */, /*13349*/"HEXAGRAM FOR MODESTY"/* 4DCE */,/*13350*/"HEXAGRAM FOR ENTHUSIASM"/* 4DCF */, /*13351*/"HEXAGRAM FOR FOLLOWING"/* 4DD0 */,/*13352*/"HEXAGRAM FOR WORK ON THE DECAYED"/* 4DD1 */, /*13353*/"HEXAGRAM FOR APPROACH"/* 4DD2 */,/*13354*/"HEXAGRAM FOR CONTEMPLATION"/* 4DD3 */, /*13355*/"HEXAGRAM FOR BITING THROUGH"/* 4DD4 */,/*13356*/"HEXAGRAM FOR GRACE"/* 4DD5 */, /*13357*/"HEXAGRAM FOR SPLITTING APART"/* 4DD6 */,/*13358*/"HEXAGRAM FOR RETURN"/* 4DD7 */, /*13359*/"HEXAGRAM FOR INNOCENCE"/* 4DD8 */,/*13360*/"HEXAGRAM FOR GREAT TAMING"/* 4DD9 */, /*13361*/"HEXAGRAM FOR MOUTH CORNERS"/* 4DDA */,/*13362*/"HEXAGRAM FOR GREAT PREPONDERANCE"/* 4DDB */, /*13363*/"HEXAGRAM FOR THE ABYSMAL WATER"/* 4DDC */,/*13364*/"HEXAGRAM FOR THE CLINGING FIRE"/* 4DDD */, /*13365*/"HEXAGRAM FOR INFLUENCE"/* 4DDE */,/*13366*/"HEXAGRAM FOR DURATION"/* 4DDF */, /*13367*/"HEXAGRAM FOR RETREAT"/* 4DE0 */,/*13368*/"HEXAGRAM FOR GREAT POWER"/* 4DE1 */, /*13369*/"HEXAGRAM FOR PROGRESS"/* 4DE2 */,/*13370*/"HEXAGRAM FOR DARKENING OF THE LIGHT"/* 4DE3 */, /*13371*/"HEXAGRAM FOR THE FAMILY"/* 4DE4 */,/*13372*/"HEXAGRAM FOR OPPOSITION"/* 4DE5 */, /*13373*/"HEXAGRAM FOR OBSTRUCTION"/* 4DE6 */,/*13374*/"HEXAGRAM FOR DELIVERANCE"/* 4DE7 */, /*13375*/"HEXAGRAM FOR DECREASE"/* 4DE8 */,/*13376*/"HEXAGRAM FOR INCREASE"/* 4DE9 */, /*13377*/"HEXAGRAM FOR BREAKTHROUGH"/* 4DEA */,/*13378*/"HEXAGRAM FOR COMING TO MEET"/* 4DEB */, /*13379*/"HEXAGRAM FOR GATHERING TOGETHER"/* 4DEC */,/*13380*/"HEXAGRAM FOR PUSHING UPWARD"/* 4DED */, /*13381*/"HEXAGRAM FOR OPPRESSION"/* 4DEE */,/*13382*/"HEXAGRAM FOR THE WELL"/* 4DEF */, /*13383*/"HEXAGRAM FOR REVOLUTION"/* 4DF0 */,/*13384*/"HEXAGRAM FOR THE CAULDRON"/* 4DF1 */, /*13385*/"HEXAGRAM FOR THE AROUSING THUNDER"/* 4DF2 */,/*13386*/"HEXAGRAM FOR THE KEEPING STILL MOUNTAIN"/* 4DF3 */, /*13387*/"HEXAGRAM FOR DEVELOPMENT"/* 4DF4 */,/*13388*/"HEXAGRAM FOR THE MARRYING MAIDEN"/* 4DF5 */, /*13389*/"HEXAGRAM FOR ABUNDANCE"/* 4DF6 */,/*13390*/"HEXAGRAM FOR THE WANDERER"/* 4DF7 */, /*13391*/"HEXAGRAM FOR THE GENTLE WIND"/* 4DF8 */,/*13392*/"HEXAGRAM FOR THE JOYOUS LAKE"/* 4DF9 */, /*13393*/"HEXAGRAM FOR DISPERSION"/* 4DFA */,/*13394*/"HEXAGRAM FOR LIMITATION"/* 4DFB */, /*13395*/"HEXAGRAM FOR INNER TRUTH"/* 4DFC */,/*13396*/"HEXAGRAM FOR SMALL PREPONDERANCE"/* 4DFD */, /*13397*/"HEXAGRAM FOR AFTER COMPLETION"/* 4DFE */,/*13398*/"HEXAGRAM FOR BEFORE COMPLETION"/* 4DFF */, /*13399*/""/* 4E00 */,/*13400*/""/* 4E01 */,NULL,/*13402*/""/* 4E03 */, /*13403*/""/* 4E04 */,NULL,NULL,/*13406*/""/* 4E07 */,/*13407*/""/* 4E08 */, /*13408*/""/* 4E09 */,/*13409*/""/* 4E0A */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*13434*/""/* 4E23 */,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*13459*/""/* 4E3C */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*13484*/""/* 4E55 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*13492*/""/* 4E5D */,/*13493*/""/* 4E5E */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*13518*/""/* 4E77 */,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*13539*/""/* 4E8C */,/*13540*/""/* 4E8D */,NULL,NULL,NULL,NULL,NULL,NULL, /*13547*/""/* 4E94 */,/*13548*/""/* 4E95 */,/*13549*/""/* 4E96 */, /*13550*/""/* 4E97 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*13575*/""/* 4EB0 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,/*13590*/""/* 4EBF */,/*13591*/""/* 4EC0 */, /*13592*/""/* 4EC1 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*13617*/""/* 4EDA */,NULL,NULL,NULL,NULL, /*13622*/""/* 4EDF */,/*13623*/""/* 4EE0 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*13631*/""/* 4EE8 */,/*13632*/""/* 4EE9 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*13657*/""/* 4F02 */,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*13668*/""/* 4F0D */,/*13669*/""/* 4F0E */, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*13694*/""/* 4F27 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*13719*/""/* 4F40 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*13744*/""/* 4F59 */, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*13767*/""/* 4F70 */,/*13768*/""/* 4F71 */,/*13769*/""/* 5104 */, /*13770*/""/* 5105 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*13795*/""/* 511E */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*13820*/""/* 5137 */, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*13835*/""/* 5146 */, /*13836*/""/* 5147 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*13861*/""/* 5160 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*13870*/""/* 5169 */,/*13871*/""/* 516A */,/*13872*/""/* 516B */, /*13873*/""/* 516C */,/*13874*/""/* 516D */,/*13875*/""/* 516E */, /*13876*/""/* 5341 */,/*13877*/""/* 5342 */,/*13878*/""/* 5343 */, /*13879*/""/* 5344 */,/*13880*/""/* 5345 */,/*13881*/""/* 5346 */,NULL,NULL, NULL,NULL,NULL,/*13887*/""/* 534C */,/*13888*/""/* 534D */, /*13889*/""/* 53C1 */,NULL,NULL,NULL,/*13893*/""/* 53C5 */, /*13894*/""/* 56DB */,/*13895*/""/* 56DC */,/*13896*/""/* 58F1 */, /*13897*/""/* 58F2 */,NULL,NULL,NULL,NULL,NULL,NULL,/*13904*/""/* 58F9 */, /*13905*/""/* 58FA */,/*13906*/""/* 5E7A */,/*13907*/""/* 5E7B */, /*13908*/""/* 5EFE */,/*13909*/""/* 5EFF */,/*13910*/""/* 5F00 */,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*13922*/""/* 5F0C */,/*13923*/""/* 5F0D */, /*13924*/""/* 5F0E */,/*13925*/""/* 5F0F */,/*13926*/""/* 5F10 */, /*13927*/""/* 5F11 */,/*13928*/""/* 62FE */,/*13929*/""/* 62FF */,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*13954*/""/* 6318 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*13979*/""/* 6331 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*14004*/""/* 634A */, NULL,/*14006*/""/* 634C */,/*14007*/""/* 634D */,/*14008*/""/* 67D2 */, /*14009*/""/* 67D3 */,/*14010*/""/* 6F06 */,/*14011*/""/* 6F07 */, /*14012*/""/* 7396 */,/*14013*/""/* 7397 */,/*14014*/""/* 767E */, /*14015*/""/* 767F */,/*14016*/""/* 8086 */,/*14017*/""/* 8087 */, /*14018*/""/* 842C */,/*14019*/""/* 842D */,/*14020*/""/* 8CAE */, /*14021*/""/* 8CAF */,NULL,NULL,NULL,/*14025*/""/* 8CB3 */, /*14026*/""/* 8CB4 */,/*14027*/""/* 8D30 */,/*14028*/""/* 8D31 */, /*14029*/""/* 9621 */,/*14030*/""/* 9622 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*14055*/""/* 963B */,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*14066*/""/* 9646 */,/*14067*/""/* 9647 */, NULL,NULL,NULL,NULL,/*14072*/""/* 964C */,/*14073*/""/* 964D */,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*14098*/""/* 9666 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,/*14116*/""/* 9678 */,/*14117*/""/* 9679 */,/*14118*/""/* 96F6 */, /*14119*/""/* 96F7 */,/*14120*/""/* 9FA6 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*14142*/""/* 9FBC */,NULL,NULL,NULL,NULL, NULL,NULL,NULL,/*14150*/""/* 9FC4 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*14158*/""/* 9FCC */,/*14159*/""/* 9FCD */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*14168*/""/* 9FD6 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,/*14210*/"YI SYLLABLE IT"/* A000 */,/*14211*/"YI SYLLABLE IX"/* A001 */,/*14212*/"YI SYLLABLE I"/* A002 */, /*14213*/"YI SYLLABLE IP"/* A003 */,/*14214*/"YI SYLLABLE IET"/* A004 */,/*14215*/"YI SYLLABLE IEX"/* A005 */, /*14216*/"YI SYLLABLE IE"/* A006 */,/*14217*/"YI SYLLABLE IEP"/* A007 */,/*14218*/"YI SYLLABLE AT"/* A008 */, /*14219*/"YI SYLLABLE AX"/* A009 */,/*14220*/"YI SYLLABLE A"/* A00A */,/*14221*/"YI SYLLABLE AP"/* A00B */, /*14222*/"YI SYLLABLE UOX"/* A00C */,/*14223*/"YI SYLLABLE UO"/* A00D */,/*14224*/"YI SYLLABLE UOP"/* A00E */, /*14225*/"YI SYLLABLE OT"/* A00F */,/*14226*/"YI SYLLABLE OX"/* A010 */,/*14227*/"YI SYLLABLE O"/* A011 */, /*14228*/"YI SYLLABLE OP"/* A012 */,/*14229*/"YI SYLLABLE EX"/* A013 */,/*14230*/"YI SYLLABLE E"/* A014 */, /*14231*/"YI SYLLABLE WU"/* A015 */,/*14232*/"YI SYLLABLE BIT"/* A016 */,/*14233*/"YI SYLLABLE BIX"/* A017 */, /*14234*/"YI SYLLABLE BI"/* A018 */,/*14235*/"YI SYLLABLE BIP"/* A019 */,/*14236*/"YI SYLLABLE BIET"/* A01A */, /*14237*/"YI SYLLABLE BIEX"/* A01B */,/*14238*/"YI SYLLABLE BIE"/* A01C */,/*14239*/"YI SYLLABLE BIEP"/* A01D */, /*14240*/"YI SYLLABLE BAT"/* A01E */,/*14241*/"YI SYLLABLE BAX"/* A01F */,/*14242*/"YI SYLLABLE BA"/* A020 */, /*14243*/"YI SYLLABLE BAP"/* A021 */,/*14244*/"YI SYLLABLE BUOX"/* A022 */,/*14245*/"YI SYLLABLE BUO"/* A023 */, /*14246*/"YI SYLLABLE BUOP"/* A024 */,/*14247*/"YI SYLLABLE BOT"/* A025 */,/*14248*/"YI SYLLABLE BOX"/* A026 */, /*14249*/"YI SYLLABLE BO"/* A027 */,/*14250*/"YI SYLLABLE BOP"/* A028 */,/*14251*/"YI SYLLABLE BEX"/* A029 */, /*14252*/"YI SYLLABLE BE"/* A02A */,/*14253*/"YI SYLLABLE BEP"/* A02B */,/*14254*/"YI SYLLABLE BUT"/* A02C */, /*14255*/"YI SYLLABLE BUX"/* A02D */,/*14256*/"YI SYLLABLE BU"/* A02E */,/*14257*/"YI SYLLABLE BUP"/* A02F */, /*14258*/"YI SYLLABLE BURX"/* A030 */,/*14259*/"YI SYLLABLE BUR"/* A031 */,/*14260*/"YI SYLLABLE BYT"/* A032 */, /*14261*/"YI SYLLABLE BYX"/* A033 */,/*14262*/"YI SYLLABLE BY"/* A034 */,/*14263*/"YI SYLLABLE BYP"/* A035 */, /*14264*/"YI SYLLABLE BYRX"/* A036 */,/*14265*/"YI SYLLABLE BYR"/* A037 */,/*14266*/"YI SYLLABLE PIT"/* A038 */, /*14267*/"YI SYLLABLE PIX"/* A039 */,/*14268*/"YI SYLLABLE PI"/* A03A */,/*14269*/"YI SYLLABLE PIP"/* A03B */, /*14270*/"YI SYLLABLE PIEX"/* A03C */,/*14271*/"YI SYLLABLE PIE"/* A03D */,/*14272*/"YI SYLLABLE PIEP"/* A03E */, /*14273*/"YI SYLLABLE PAT"/* A03F */,/*14274*/"YI SYLLABLE PAX"/* A040 */,/*14275*/"YI SYLLABLE PA"/* A041 */, /*14276*/"YI SYLLABLE PAP"/* A042 */,/*14277*/"YI SYLLABLE PUOX"/* A043 */,/*14278*/"YI SYLLABLE PUO"/* A044 */, /*14279*/"YI SYLLABLE PUOP"/* A045 */,/*14280*/"YI SYLLABLE POT"/* A046 */,/*14281*/"YI SYLLABLE POX"/* A047 */, /*14282*/"YI SYLLABLE PO"/* A048 */,/*14283*/"YI SYLLABLE POP"/* A049 */,/*14284*/"YI SYLLABLE PUT"/* A04A */, /*14285*/"YI SYLLABLE PUX"/* A04B */,/*14286*/"YI SYLLABLE PU"/* A04C */,/*14287*/"YI SYLLABLE PUP"/* A04D */, /*14288*/"YI SYLLABLE PURX"/* A04E */,/*14289*/"YI SYLLABLE PUR"/* A04F */,/*14290*/"YI SYLLABLE PYT"/* A050 */, /*14291*/"YI SYLLABLE PYX"/* A051 */,/*14292*/"YI SYLLABLE PY"/* A052 */,/*14293*/"YI SYLLABLE PYP"/* A053 */, /*14294*/"YI SYLLABLE PYRX"/* A054 */,/*14295*/"YI SYLLABLE PYR"/* A055 */,/*14296*/"YI SYLLABLE BBIT"/* A056 */, /*14297*/"YI SYLLABLE BBIX"/* A057 */,/*14298*/"YI SYLLABLE BBI"/* A058 */,/*14299*/"YI SYLLABLE BBIP"/* A059 */, /*14300*/"YI SYLLABLE BBIET"/* A05A */,/*14301*/"YI SYLLABLE BBIEX"/* A05B */,/*14302*/"YI SYLLABLE BBIE"/* A05C */, /*14303*/"YI SYLLABLE BBIEP"/* A05D */,/*14304*/"YI SYLLABLE BBAT"/* A05E */,/*14305*/"YI SYLLABLE BBAX"/* A05F */, /*14306*/"YI SYLLABLE BBA"/* A060 */,/*14307*/"YI SYLLABLE BBAP"/* A061 */,/*14308*/"YI SYLLABLE BBUOX"/* A062 */, /*14309*/"YI SYLLABLE BBUO"/* A063 */,/*14310*/"YI SYLLABLE BBUOP"/* A064 */,/*14311*/"YI SYLLABLE BBOT"/* A065 */, /*14312*/"YI SYLLABLE BBOX"/* A066 */,/*14313*/"YI SYLLABLE BBO"/* A067 */,/*14314*/"YI SYLLABLE BBOP"/* A068 */, /*14315*/"YI SYLLABLE BBEX"/* A069 */,/*14316*/"YI SYLLABLE BBE"/* A06A */,/*14317*/"YI SYLLABLE BBEP"/* A06B */, /*14318*/"YI SYLLABLE BBUT"/* A06C */,/*14319*/"YI SYLLABLE BBUX"/* A06D */,/*14320*/"YI SYLLABLE BBU"/* A06E */, /*14321*/"YI SYLLABLE BBUP"/* A06F */,/*14322*/"YI SYLLABLE BBURX"/* A070 */,/*14323*/"YI SYLLABLE BBUR"/* A071 */, /*14324*/"YI SYLLABLE BBYT"/* A072 */,/*14325*/"YI SYLLABLE BBYX"/* A073 */,/*14326*/"YI SYLLABLE BBY"/* A074 */, /*14327*/"YI SYLLABLE BBYP"/* A075 */,/*14328*/"YI SYLLABLE NBIT"/* A076 */,/*14329*/"YI SYLLABLE NBIX"/* A077 */, /*14330*/"YI SYLLABLE NBI"/* A078 */,/*14331*/"YI SYLLABLE NBIP"/* A079 */,/*14332*/"YI SYLLABLE NBIEX"/* A07A */, /*14333*/"YI SYLLABLE NBIE"/* A07B */,/*14334*/"YI SYLLABLE NBIEP"/* A07C */,/*14335*/"YI SYLLABLE NBAT"/* A07D */, /*14336*/"YI SYLLABLE NBAX"/* A07E */,/*14337*/"YI SYLLABLE NBA"/* A07F */,/*14338*/"YI SYLLABLE NBAP"/* A080 */, /*14339*/"YI SYLLABLE NBOT"/* A081 */,/*14340*/"YI SYLLABLE NBOX"/* A082 */,/*14341*/"YI SYLLABLE NBO"/* A083 */, /*14342*/"YI SYLLABLE NBOP"/* A084 */,/*14343*/"YI SYLLABLE NBUT"/* A085 */,/*14344*/"YI SYLLABLE NBUX"/* A086 */, /*14345*/"YI SYLLABLE NBU"/* A087 */,/*14346*/"YI SYLLABLE NBUP"/* A088 */,/*14347*/"YI SYLLABLE NBURX"/* A089 */, /*14348*/"YI SYLLABLE NBUR"/* A08A */,/*14349*/"YI SYLLABLE NBYT"/* A08B */,/*14350*/"YI SYLLABLE NBYX"/* A08C */, /*14351*/"YI SYLLABLE NBY"/* A08D */,/*14352*/"YI SYLLABLE NBYP"/* A08E */,/*14353*/"YI SYLLABLE NBYRX"/* A08F */, /*14354*/"YI SYLLABLE NBYR"/* A090 */,/*14355*/"YI SYLLABLE HMIT"/* A091 */,/*14356*/"YI SYLLABLE HMIX"/* A092 */, /*14357*/"YI SYLLABLE HMI"/* A093 */,/*14358*/"YI SYLLABLE HMIP"/* A094 */,/*14359*/"YI SYLLABLE HMIEX"/* A095 */, /*14360*/"YI SYLLABLE HMIE"/* A096 */,/*14361*/"YI SYLLABLE HMIEP"/* A097 */,/*14362*/"YI SYLLABLE HMAT"/* A098 */, /*14363*/"YI SYLLABLE HMAX"/* A099 */,/*14364*/"YI SYLLABLE HMA"/* A09A */,/*14365*/"YI SYLLABLE HMAP"/* A09B */, /*14366*/"YI SYLLABLE HMUOX"/* A09C */,/*14367*/"YI SYLLABLE HMUO"/* A09D */,/*14368*/"YI SYLLABLE HMUOP"/* A09E */, /*14369*/"YI SYLLABLE HMOT"/* A09F */,/*14370*/"YI SYLLABLE HMOX"/* A0A0 */,/*14371*/"YI SYLLABLE HMO"/* A0A1 */, /*14372*/"YI SYLLABLE HMOP"/* A0A2 */,/*14373*/"YI SYLLABLE HMUT"/* A0A3 */,/*14374*/"YI SYLLABLE HMUX"/* A0A4 */, /*14375*/"YI SYLLABLE HMU"/* A0A5 */,/*14376*/"YI SYLLABLE HMUP"/* A0A6 */,/*14377*/"YI SYLLABLE HMURX"/* A0A7 */, /*14378*/"YI SYLLABLE HMUR"/* A0A8 */,/*14379*/"YI SYLLABLE HMYX"/* A0A9 */,/*14380*/"YI SYLLABLE HMY"/* A0AA */, /*14381*/"YI SYLLABLE HMYP"/* A0AB */,/*14382*/"YI SYLLABLE HMYRX"/* A0AC */,/*14383*/"YI SYLLABLE HMYR"/* A0AD */, /*14384*/"YI SYLLABLE MIT"/* A0AE */,/*14385*/"YI SYLLABLE MIX"/* A0AF */,/*14386*/"YI SYLLABLE MI"/* A0B0 */, /*14387*/"YI SYLLABLE MIP"/* A0B1 */,/*14388*/"YI SYLLABLE MIEX"/* A0B2 */,/*14389*/"YI SYLLABLE MIE"/* A0B3 */, /*14390*/"YI SYLLABLE MIEP"/* A0B4 */,/*14391*/"YI SYLLABLE MAT"/* A0B5 */,/*14392*/"YI SYLLABLE MAX"/* A0B6 */, /*14393*/"YI SYLLABLE MA"/* A0B7 */,/*14394*/"YI SYLLABLE MAP"/* A0B8 */,/*14395*/"YI SYLLABLE MUOT"/* A0B9 */, /*14396*/"YI SYLLABLE MUOX"/* A0BA */,/*14397*/"YI SYLLABLE MUO"/* A0BB */,/*14398*/"YI SYLLABLE MUOP"/* A0BC */, /*14399*/"YI SYLLABLE MOT"/* A0BD */,/*14400*/"YI SYLLABLE MOX"/* A0BE */,/*14401*/"YI SYLLABLE MO"/* A0BF */, /*14402*/"YI SYLLABLE MOP"/* A0C0 */,/*14403*/"YI SYLLABLE MEX"/* A0C1 */,/*14404*/"YI SYLLABLE ME"/* A0C2 */, /*14405*/"YI SYLLABLE MUT"/* A0C3 */,/*14406*/"YI SYLLABLE MUX"/* A0C4 */,/*14407*/"YI SYLLABLE MU"/* A0C5 */, /*14408*/"YI SYLLABLE MUP"/* A0C6 */,/*14409*/"YI SYLLABLE MURX"/* A0C7 */,/*14410*/"YI SYLLABLE MUR"/* A0C8 */, /*14411*/"YI SYLLABLE MYT"/* A0C9 */,/*14412*/"YI SYLLABLE MYX"/* A0CA */,/*14413*/"YI SYLLABLE MY"/* A0CB */, /*14414*/"YI SYLLABLE MYP"/* A0CC */,/*14415*/"YI SYLLABLE FIT"/* A0CD */,/*14416*/"YI SYLLABLE FIX"/* A0CE */, /*14417*/"YI SYLLABLE FI"/* A0CF */,/*14418*/"YI SYLLABLE FIP"/* A0D0 */,/*14419*/"YI SYLLABLE FAT"/* A0D1 */, /*14420*/"YI SYLLABLE FAX"/* A0D2 */,/*14421*/"YI SYLLABLE FA"/* A0D3 */,/*14422*/"YI SYLLABLE FAP"/* A0D4 */, /*14423*/"YI SYLLABLE FOX"/* A0D5 */,/*14424*/"YI SYLLABLE FO"/* A0D6 */,/*14425*/"YI SYLLABLE FOP"/* A0D7 */, /*14426*/"YI SYLLABLE FUT"/* A0D8 */,/*14427*/"YI SYLLABLE FUX"/* A0D9 */,/*14428*/"YI SYLLABLE FU"/* A0DA */, /*14429*/"YI SYLLABLE FUP"/* A0DB */,/*14430*/"YI SYLLABLE FURX"/* A0DC */,/*14431*/"YI SYLLABLE FUR"/* A0DD */, /*14432*/"YI SYLLABLE FYT"/* A0DE */,/*14433*/"YI SYLLABLE FYX"/* A0DF */,/*14434*/"YI SYLLABLE FY"/* A0E0 */, /*14435*/"YI SYLLABLE FYP"/* A0E1 */,/*14436*/"YI SYLLABLE VIT"/* A0E2 */,/*14437*/"YI SYLLABLE VIX"/* A0E3 */, /*14438*/"YI SYLLABLE VI"/* A0E4 */,/*14439*/"YI SYLLABLE VIP"/* A0E5 */,/*14440*/"YI SYLLABLE VIET"/* A0E6 */, /*14441*/"YI SYLLABLE VIEX"/* A0E7 */,/*14442*/"YI SYLLABLE VIE"/* A0E8 */,/*14443*/"YI SYLLABLE VIEP"/* A0E9 */, /*14444*/"YI SYLLABLE VAT"/* A0EA */,/*14445*/"YI SYLLABLE VAX"/* A0EB */,/*14446*/"YI SYLLABLE VA"/* A0EC */, /*14447*/"YI SYLLABLE VAP"/* A0ED */,/*14448*/"YI SYLLABLE VOT"/* A0EE */,/*14449*/"YI SYLLABLE VOX"/* A0EF */, /*14450*/"YI SYLLABLE VO"/* A0F0 */,/*14451*/"YI SYLLABLE VOP"/* A0F1 */,/*14452*/"YI SYLLABLE VEX"/* A0F2 */, /*14453*/"YI SYLLABLE VEP"/* A0F3 */,/*14454*/"YI SYLLABLE VUT"/* A0F4 */,/*14455*/"YI SYLLABLE VUX"/* A0F5 */, /*14456*/"YI SYLLABLE VU"/* A0F6 */,/*14457*/"YI SYLLABLE VUP"/* A0F7 */,/*14458*/"YI SYLLABLE VURX"/* A0F8 */, /*14459*/"YI SYLLABLE VUR"/* A0F9 */,/*14460*/"YI SYLLABLE VYT"/* A0FA */,/*14461*/"YI SYLLABLE VYX"/* A0FB */, /*14462*/"YI SYLLABLE VY"/* A0FC */,/*14463*/"YI SYLLABLE VYP"/* A0FD */,/*14464*/"YI SYLLABLE VYRX"/* A0FE */, /*14465*/"YI SYLLABLE VYR"/* A0FF */,/*14466*/"YI SYLLABLE DIT"/* A100 */,/*14467*/"YI SYLLABLE DIX"/* A101 */, /*14468*/"YI SYLLABLE DI"/* A102 */,/*14469*/"YI SYLLABLE DIP"/* A103 */,/*14470*/"YI SYLLABLE DIEX"/* A104 */, /*14471*/"YI SYLLABLE DIE"/* A105 */,/*14472*/"YI SYLLABLE DIEP"/* A106 */,/*14473*/"YI SYLLABLE DAT"/* A107 */, /*14474*/"YI SYLLABLE DAX"/* A108 */,/*14475*/"YI SYLLABLE DA"/* A109 */,/*14476*/"YI SYLLABLE DAP"/* A10A */, /*14477*/"YI SYLLABLE DUOX"/* A10B */,/*14478*/"YI SYLLABLE DUO"/* A10C */,/*14479*/"YI SYLLABLE DOT"/* A10D */, /*14480*/"YI SYLLABLE DOX"/* A10E */,/*14481*/"YI SYLLABLE DO"/* A10F */,/*14482*/"YI SYLLABLE DOP"/* A110 */, /*14483*/"YI SYLLABLE DEX"/* A111 */,/*14484*/"YI SYLLABLE DE"/* A112 */,/*14485*/"YI SYLLABLE DEP"/* A113 */, /*14486*/"YI SYLLABLE DUT"/* A114 */,/*14487*/"YI SYLLABLE DUX"/* A115 */,/*14488*/"YI SYLLABLE DU"/* A116 */, /*14489*/"YI SYLLABLE DUP"/* A117 */,/*14490*/"YI SYLLABLE DURX"/* A118 */,/*14491*/"YI SYLLABLE DUR"/* A119 */, /*14492*/"YI SYLLABLE TIT"/* A11A */,/*14493*/"YI SYLLABLE TIX"/* A11B */,/*14494*/"YI SYLLABLE TI"/* A11C */, /*14495*/"YI SYLLABLE TIP"/* A11D */,/*14496*/"YI SYLLABLE TIEX"/* A11E */,/*14497*/"YI SYLLABLE TIE"/* A11F */, /*14498*/"YI SYLLABLE TIEP"/* A120 */,/*14499*/"YI SYLLABLE TAT"/* A121 */,/*14500*/"YI SYLLABLE TAX"/* A122 */, /*14501*/"YI SYLLABLE TA"/* A123 */,/*14502*/"YI SYLLABLE TAP"/* A124 */,/*14503*/"YI SYLLABLE TUOT"/* A125 */, /*14504*/"YI SYLLABLE TUOX"/* A126 */,/*14505*/"YI SYLLABLE TUO"/* A127 */,/*14506*/"YI SYLLABLE TUOP"/* A128 */, /*14507*/"YI SYLLABLE TOT"/* A129 */,/*14508*/"YI SYLLABLE TOX"/* A12A */,/*14509*/"YI SYLLABLE TO"/* A12B */, /*14510*/"YI SYLLABLE TOP"/* A12C */,/*14511*/"YI SYLLABLE TEX"/* A12D */,/*14512*/"YI SYLLABLE TE"/* A12E */, /*14513*/"YI SYLLABLE TEP"/* A12F */,/*14514*/"YI SYLLABLE TUT"/* A130 */,/*14515*/"YI SYLLABLE TUX"/* A131 */, /*14516*/"YI SYLLABLE TU"/* A132 */,/*14517*/"YI SYLLABLE TUP"/* A133 */,/*14518*/"YI SYLLABLE TURX"/* A134 */, /*14519*/"YI SYLLABLE TUR"/* A135 */,/*14520*/"YI SYLLABLE DDIT"/* A136 */,/*14521*/"YI SYLLABLE DDIX"/* A137 */, /*14522*/"YI SYLLABLE DDI"/* A138 */,/*14523*/"YI SYLLABLE DDIP"/* A139 */,/*14524*/"YI SYLLABLE DDIEX"/* A13A */, /*14525*/"YI SYLLABLE DDIE"/* A13B */,/*14526*/"YI SYLLABLE DDIEP"/* A13C */,/*14527*/"YI SYLLABLE DDAT"/* A13D */, /*14528*/"YI SYLLABLE DDAX"/* A13E */,/*14529*/"YI SYLLABLE DDA"/* A13F */,/*14530*/"YI SYLLABLE DDAP"/* A140 */, /*14531*/"YI SYLLABLE DDUOX"/* A141 */,/*14532*/"YI SYLLABLE DDUO"/* A142 */,/*14533*/"YI SYLLABLE DDUOP"/* A143 */, /*14534*/"YI SYLLABLE DDOT"/* A144 */,/*14535*/"YI SYLLABLE DDOX"/* A145 */,/*14536*/"YI SYLLABLE DDO"/* A146 */, /*14537*/"YI SYLLABLE DDOP"/* A147 */,/*14538*/"YI SYLLABLE DDEX"/* A148 */,/*14539*/"YI SYLLABLE DDE"/* A149 */, /*14540*/"YI SYLLABLE DDEP"/* A14A */,/*14541*/"YI SYLLABLE DDUT"/* A14B */,/*14542*/"YI SYLLABLE DDUX"/* A14C */, /*14543*/"YI SYLLABLE DDU"/* A14D */,/*14544*/"YI SYLLABLE DDUP"/* A14E */,/*14545*/"YI SYLLABLE DDURX"/* A14F */, /*14546*/"YI SYLLABLE DDUR"/* A150 */,/*14547*/"YI SYLLABLE NDIT"/* A151 */,/*14548*/"YI SYLLABLE NDIX"/* A152 */, /*14549*/"YI SYLLABLE NDI"/* A153 */,/*14550*/"YI SYLLABLE NDIP"/* A154 */,/*14551*/"YI SYLLABLE NDIEX"/* A155 */, /*14552*/"YI SYLLABLE NDIE"/* A156 */,/*14553*/"YI SYLLABLE NDAT"/* A157 */,/*14554*/"YI SYLLABLE NDAX"/* A158 */, /*14555*/"YI SYLLABLE NDA"/* A159 */,/*14556*/"YI SYLLABLE NDAP"/* A15A */,/*14557*/"YI SYLLABLE NDOT"/* A15B */, /*14558*/"YI SYLLABLE NDOX"/* A15C */,/*14559*/"YI SYLLABLE NDO"/* A15D */,/*14560*/"YI SYLLABLE NDOP"/* A15E */, /*14561*/"YI SYLLABLE NDEX"/* A15F */,/*14562*/"YI SYLLABLE NDE"/* A160 */,/*14563*/"YI SYLLABLE NDEP"/* A161 */, /*14564*/"YI SYLLABLE NDUT"/* A162 */,/*14565*/"YI SYLLABLE NDUX"/* A163 */,/*14566*/"YI SYLLABLE NDU"/* A164 */, /*14567*/"YI SYLLABLE NDUP"/* A165 */,/*14568*/"YI SYLLABLE NDURX"/* A166 */,/*14569*/"YI SYLLABLE NDUR"/* A167 */, /*14570*/"YI SYLLABLE HNIT"/* A168 */,/*14571*/"YI SYLLABLE HNIX"/* A169 */,/*14572*/"YI SYLLABLE HNI"/* A16A */, /*14573*/"YI SYLLABLE HNIP"/* A16B */,/*14574*/"YI SYLLABLE HNIET"/* A16C */,/*14575*/"YI SYLLABLE HNIEX"/* A16D */, /*14576*/"YI SYLLABLE HNIE"/* A16E */,/*14577*/"YI SYLLABLE HNIEP"/* A16F */,/*14578*/"YI SYLLABLE HNAT"/* A170 */, /*14579*/"YI SYLLABLE HNAX"/* A171 */,/*14580*/"YI SYLLABLE HNA"/* A172 */,/*14581*/"YI SYLLABLE HNAP"/* A173 */, /*14582*/"YI SYLLABLE HNUOX"/* A174 */,/*14583*/"YI SYLLABLE HNUO"/* A175 */,/*14584*/"YI SYLLABLE HNOT"/* A176 */, /*14585*/"YI SYLLABLE HNOX"/* A177 */,/*14586*/"YI SYLLABLE HNOP"/* A178 */,/*14587*/"YI SYLLABLE HNEX"/* A179 */, /*14588*/"YI SYLLABLE HNE"/* A17A */,/*14589*/"YI SYLLABLE HNEP"/* A17B */,/*14590*/"YI SYLLABLE HNUT"/* A17C */, /*14591*/"YI SYLLABLE NIT"/* A17D */,/*14592*/"YI SYLLABLE NIX"/* A17E */,/*14593*/"YI SYLLABLE NI"/* A17F */, /*14594*/"YI SYLLABLE NIP"/* A180 */,/*14595*/"YI SYLLABLE NIEX"/* A181 */,/*14596*/"YI SYLLABLE NIE"/* A182 */, /*14597*/"YI SYLLABLE NIEP"/* A183 */,/*14598*/"YI SYLLABLE NAX"/* A184 */,/*14599*/"YI SYLLABLE NA"/* A185 */, /*14600*/"YI SYLLABLE NAP"/* A186 */,/*14601*/"YI SYLLABLE NUOX"/* A187 */,/*14602*/"YI SYLLABLE NUO"/* A188 */, /*14603*/"YI SYLLABLE NUOP"/* A189 */,/*14604*/"YI SYLLABLE NOT"/* A18A */,/*14605*/"YI SYLLABLE NOX"/* A18B */, /*14606*/"YI SYLLABLE NO"/* A18C */,/*14607*/"YI SYLLABLE NOP"/* A18D */,/*14608*/"YI SYLLABLE NEX"/* A18E */, /*14609*/"YI SYLLABLE NE"/* A18F */,/*14610*/"YI SYLLABLE NEP"/* A190 */,/*14611*/"YI SYLLABLE NUT"/* A191 */, /*14612*/"YI SYLLABLE NUX"/* A192 */,/*14613*/"YI SYLLABLE NU"/* A193 */,/*14614*/"YI SYLLABLE NUP"/* A194 */, /*14615*/"YI SYLLABLE NURX"/* A195 */,/*14616*/"YI SYLLABLE NUR"/* A196 */,/*14617*/"YI SYLLABLE HLIT"/* A197 */, /*14618*/"YI SYLLABLE HLIX"/* A198 */,/*14619*/"YI SYLLABLE HLI"/* A199 */,/*14620*/"YI SYLLABLE HLIP"/* A19A */, /*14621*/"YI SYLLABLE HLIEX"/* A19B */,/*14622*/"YI SYLLABLE HLIE"/* A19C */,/*14623*/"YI SYLLABLE HLIEP"/* A19D */, /*14624*/"YI SYLLABLE HLAT"/* A19E */,/*14625*/"YI SYLLABLE HLAX"/* A19F */,/*14626*/"YI SYLLABLE HLA"/* A1A0 */, /*14627*/"YI SYLLABLE HLAP"/* A1A1 */,/*14628*/"YI SYLLABLE HLUOX"/* A1A2 */,/*14629*/"YI SYLLABLE HLUO"/* A1A3 */, /*14630*/"YI SYLLABLE HLUOP"/* A1A4 */,/*14631*/"YI SYLLABLE HLOX"/* A1A5 */,/*14632*/"YI SYLLABLE HLO"/* A1A6 */, /*14633*/"YI SYLLABLE HLOP"/* A1A7 */,/*14634*/"YI SYLLABLE HLEX"/* A1A8 */,/*14635*/"YI SYLLABLE HLE"/* A1A9 */, /*14636*/"YI SYLLABLE HLEP"/* A1AA */,/*14637*/"YI SYLLABLE HLUT"/* A1AB */,/*14638*/"YI SYLLABLE HLUX"/* A1AC */, /*14639*/"YI SYLLABLE HLU"/* A1AD */,/*14640*/"YI SYLLABLE HLUP"/* A1AE */,/*14641*/"YI SYLLABLE HLURX"/* A1AF */, /*14642*/"YI SYLLABLE HLUR"/* A1B0 */,/*14643*/"YI SYLLABLE HLYT"/* A1B1 */,/*14644*/"YI SYLLABLE HLYX"/* A1B2 */, /*14645*/"YI SYLLABLE HLY"/* A1B3 */,/*14646*/"YI SYLLABLE HLYP"/* A1B4 */,/*14647*/"YI SYLLABLE HLYRX"/* A1B5 */, /*14648*/"YI SYLLABLE HLYR"/* A1B6 */,/*14649*/"YI SYLLABLE LIT"/* A1B7 */,/*14650*/"YI SYLLABLE LIX"/* A1B8 */, /*14651*/"YI SYLLABLE LI"/* A1B9 */,/*14652*/"YI SYLLABLE LIP"/* A1BA */,/*14653*/"YI SYLLABLE LIET"/* A1BB */, /*14654*/"YI SYLLABLE LIEX"/* A1BC */,/*14655*/"YI SYLLABLE LIE"/* A1BD */,/*14656*/"YI SYLLABLE LIEP"/* A1BE */, /*14657*/"YI SYLLABLE LAT"/* A1BF */,/*14658*/"YI SYLLABLE LAX"/* A1C0 */,/*14659*/"YI SYLLABLE LA"/* A1C1 */, /*14660*/"YI SYLLABLE LAP"/* A1C2 */,/*14661*/"YI SYLLABLE LUOT"/* A1C3 */,/*14662*/"YI SYLLABLE LUOX"/* A1C4 */, /*14663*/"YI SYLLABLE LUO"/* A1C5 */,/*14664*/"YI SYLLABLE LUOP"/* A1C6 */,/*14665*/"YI SYLLABLE LOT"/* A1C7 */, /*14666*/"YI SYLLABLE LOX"/* A1C8 */,/*14667*/"YI SYLLABLE LO"/* A1C9 */,/*14668*/"YI SYLLABLE LOP"/* A1CA */, /*14669*/"YI SYLLABLE LEX"/* A1CB */,/*14670*/"YI SYLLABLE LE"/* A1CC */,/*14671*/"YI SYLLABLE LEP"/* A1CD */, /*14672*/"YI SYLLABLE LUT"/* A1CE */,/*14673*/"YI SYLLABLE LUX"/* A1CF */,/*14674*/"YI SYLLABLE LU"/* A1D0 */, /*14675*/"YI SYLLABLE LUP"/* A1D1 */,/*14676*/"YI SYLLABLE LURX"/* A1D2 */,/*14677*/"YI SYLLABLE LUR"/* A1D3 */, /*14678*/"YI SYLLABLE LYT"/* A1D4 */,/*14679*/"YI SYLLABLE LYX"/* A1D5 */,/*14680*/"YI SYLLABLE LY"/* A1D6 */, /*14681*/"YI SYLLABLE LYP"/* A1D7 */,/*14682*/"YI SYLLABLE LYRX"/* A1D8 */,/*14683*/"YI SYLLABLE LYR"/* A1D9 */, /*14684*/"YI SYLLABLE GIT"/* A1DA */,/*14685*/"YI SYLLABLE GIX"/* A1DB */,/*14686*/"YI SYLLABLE GI"/* A1DC */, /*14687*/"YI SYLLABLE GIP"/* A1DD */,/*14688*/"YI SYLLABLE GIET"/* A1DE */,/*14689*/"YI SYLLABLE GIEX"/* A1DF */, /*14690*/"YI SYLLABLE GIE"/* A1E0 */,/*14691*/"YI SYLLABLE GIEP"/* A1E1 */,/*14692*/"YI SYLLABLE GAT"/* A1E2 */, /*14693*/"YI SYLLABLE GAX"/* A1E3 */,/*14694*/"YI SYLLABLE GA"/* A1E4 */,/*14695*/"YI SYLLABLE GAP"/* A1E5 */, /*14696*/"YI SYLLABLE GUOT"/* A1E6 */,/*14697*/"YI SYLLABLE GUOX"/* A1E7 */,/*14698*/"YI SYLLABLE GUO"/* A1E8 */, /*14699*/"YI SYLLABLE GUOP"/* A1E9 */,/*14700*/"YI SYLLABLE GOT"/* A1EA */,/*14701*/"YI SYLLABLE GOX"/* A1EB */, /*14702*/"YI SYLLABLE GO"/* A1EC */,/*14703*/"YI SYLLABLE GOP"/* A1ED */,/*14704*/"YI SYLLABLE GET"/* A1EE */, /*14705*/"YI SYLLABLE GEX"/* A1EF */,/*14706*/"YI SYLLABLE GE"/* A1F0 */,/*14707*/"YI SYLLABLE GEP"/* A1F1 */, /*14708*/"YI SYLLABLE GUT"/* A1F2 */,/*14709*/"YI SYLLABLE GUX"/* A1F3 */,/*14710*/"YI SYLLABLE GU"/* A1F4 */, /*14711*/"YI SYLLABLE GUP"/* A1F5 */,/*14712*/"YI SYLLABLE GURX"/* A1F6 */,/*14713*/"YI SYLLABLE GUR"/* A1F7 */, /*14714*/"YI SYLLABLE KIT"/* A1F8 */,/*14715*/"YI SYLLABLE KIX"/* A1F9 */,/*14716*/"YI SYLLABLE KI"/* A1FA */, /*14717*/"YI SYLLABLE KIP"/* A1FB */,/*14718*/"YI SYLLABLE KIEX"/* A1FC */,/*14719*/"YI SYLLABLE KIE"/* A1FD */, /*14720*/"YI SYLLABLE KIEP"/* A1FE */,/*14721*/"YI SYLLABLE KAT"/* A1FF */,/*14722*/"YI SYLLABLE KAX"/* A200 */, /*14723*/"YI SYLLABLE KA"/* A201 */,/*14724*/"YI SYLLABLE KAP"/* A202 */,/*14725*/"YI SYLLABLE KUOX"/* A203 */, /*14726*/"YI SYLLABLE KUO"/* A204 */,/*14727*/"YI SYLLABLE KUOP"/* A205 */,/*14728*/"YI SYLLABLE KOT"/* A206 */, /*14729*/"YI SYLLABLE KOX"/* A207 */,/*14730*/"YI SYLLABLE KO"/* A208 */,/*14731*/"YI SYLLABLE KOP"/* A209 */, /*14732*/"YI SYLLABLE KET"/* A20A */,/*14733*/"YI SYLLABLE KEX"/* A20B */,/*14734*/"YI SYLLABLE KE"/* A20C */, /*14735*/"YI SYLLABLE KEP"/* A20D */,/*14736*/"YI SYLLABLE KUT"/* A20E */,/*14737*/"YI SYLLABLE KUX"/* A20F */, /*14738*/"YI SYLLABLE KU"/* A210 */,/*14739*/"YI SYLLABLE KUP"/* A211 */,/*14740*/"YI SYLLABLE KURX"/* A212 */, /*14741*/"YI SYLLABLE KUR"/* A213 */,/*14742*/"YI SYLLABLE GGIT"/* A214 */,/*14743*/"YI SYLLABLE GGIX"/* A215 */, /*14744*/"YI SYLLABLE GGI"/* A216 */,/*14745*/"YI SYLLABLE GGIEX"/* A217 */,/*14746*/"YI SYLLABLE GGIE"/* A218 */, /*14747*/"YI SYLLABLE GGIEP"/* A219 */,/*14748*/"YI SYLLABLE GGAT"/* A21A */,/*14749*/"YI SYLLABLE GGAX"/* A21B */, /*14750*/"YI SYLLABLE GGA"/* A21C */,/*14751*/"YI SYLLABLE GGAP"/* A21D */,/*14752*/"YI SYLLABLE GGUOT"/* A21E */, /*14753*/"YI SYLLABLE GGUOX"/* A21F */,/*14754*/"YI SYLLABLE GGUO"/* A220 */,/*14755*/"YI SYLLABLE GGUOP"/* A221 */, /*14756*/"YI SYLLABLE GGOT"/* A222 */,/*14757*/"YI SYLLABLE GGOX"/* A223 */,/*14758*/"YI SYLLABLE GGO"/* A224 */, /*14759*/"YI SYLLABLE GGOP"/* A225 */,/*14760*/"YI SYLLABLE GGET"/* A226 */,/*14761*/"YI SYLLABLE GGEX"/* A227 */, /*14762*/"YI SYLLABLE GGE"/* A228 */,/*14763*/"YI SYLLABLE GGEP"/* A229 */,/*14764*/"YI SYLLABLE GGUT"/* A22A */, /*14765*/"YI SYLLABLE GGUX"/* A22B */,/*14766*/"YI SYLLABLE GGU"/* A22C */,/*14767*/"YI SYLLABLE GGUP"/* A22D */, /*14768*/"YI SYLLABLE GGURX"/* A22E */,/*14769*/"YI SYLLABLE GGUR"/* A22F */,/*14770*/"YI SYLLABLE MGIEX"/* A230 */, /*14771*/"YI SYLLABLE MGIE"/* A231 */,/*14772*/"YI SYLLABLE MGAT"/* A232 */,/*14773*/"YI SYLLABLE MGAX"/* A233 */, /*14774*/"YI SYLLABLE MGA"/* A234 */,/*14775*/"YI SYLLABLE MGAP"/* A235 */,/*14776*/"YI SYLLABLE MGUOX"/* A236 */, /*14777*/"YI SYLLABLE MGUO"/* A237 */,/*14778*/"YI SYLLABLE MGUOP"/* A238 */,/*14779*/"YI SYLLABLE MGOT"/* A239 */, /*14780*/"YI SYLLABLE MGOX"/* A23A */,/*14781*/"YI SYLLABLE MGO"/* A23B */,/*14782*/"YI SYLLABLE MGOP"/* A23C */, /*14783*/"YI SYLLABLE MGEX"/* A23D */,/*14784*/"YI SYLLABLE MGE"/* A23E */,/*14785*/"YI SYLLABLE MGEP"/* A23F */, /*14786*/"YI SYLLABLE MGUT"/* A240 */,/*14787*/"YI SYLLABLE MGUX"/* A241 */,/*14788*/"YI SYLLABLE MGU"/* A242 */, /*14789*/"YI SYLLABLE MGUP"/* A243 */,/*14790*/"YI SYLLABLE MGURX"/* A244 */,/*14791*/"YI SYLLABLE MGUR"/* A245 */, /*14792*/"YI SYLLABLE HXIT"/* A246 */,/*14793*/"YI SYLLABLE HXIX"/* A247 */,/*14794*/"YI SYLLABLE HXI"/* A248 */, /*14795*/"YI SYLLABLE HXIP"/* A249 */,/*14796*/"YI SYLLABLE HXIET"/* A24A */,/*14797*/"YI SYLLABLE HXIEX"/* A24B */, /*14798*/"YI SYLLABLE HXIE"/* A24C */,/*14799*/"YI SYLLABLE HXIEP"/* A24D */,/*14800*/"YI SYLLABLE HXAT"/* A24E */, /*14801*/"YI SYLLABLE HXAX"/* A24F */,/*14802*/"YI SYLLABLE HXA"/* A250 */,/*14803*/"YI SYLLABLE HXAP"/* A251 */, /*14804*/"YI SYLLABLE HXUOT"/* A252 */,/*14805*/"YI SYLLABLE HXUOX"/* A253 */,/*14806*/"YI SYLLABLE HXUO"/* A254 */, /*14807*/"YI SYLLABLE HXUOP"/* A255 */,/*14808*/"YI SYLLABLE HXOT"/* A256 */,/*14809*/"YI SYLLABLE HXOX"/* A257 */, /*14810*/"YI SYLLABLE HXO"/* A258 */,/*14811*/"YI SYLLABLE HXOP"/* A259 */,/*14812*/"YI SYLLABLE HXEX"/* A25A */, /*14813*/"YI SYLLABLE HXE"/* A25B */,/*14814*/"YI SYLLABLE HXEP"/* A25C */,/*14815*/"YI SYLLABLE NGIEX"/* A25D */, /*14816*/"YI SYLLABLE NGIE"/* A25E */,/*14817*/"YI SYLLABLE NGIEP"/* A25F */,/*14818*/"YI SYLLABLE NGAT"/* A260 */, /*14819*/"YI SYLLABLE NGAX"/* A261 */,/*14820*/"YI SYLLABLE NGA"/* A262 */,/*14821*/"YI SYLLABLE NGAP"/* A263 */, /*14822*/"YI SYLLABLE NGUOT"/* A264 */,/*14823*/"YI SYLLABLE NGUOX"/* A265 */,/*14824*/"YI SYLLABLE NGUO"/* A266 */, /*14825*/"YI SYLLABLE NGOT"/* A267 */,/*14826*/"YI SYLLABLE NGOX"/* A268 */,/*14827*/"YI SYLLABLE NGO"/* A269 */, /*14828*/"YI SYLLABLE NGOP"/* A26A */,/*14829*/"YI SYLLABLE NGEX"/* A26B */,/*14830*/"YI SYLLABLE NGE"/* A26C */, /*14831*/"YI SYLLABLE NGEP"/* A26D */,/*14832*/"YI SYLLABLE HIT"/* A26E */,/*14833*/"YI SYLLABLE HIEX"/* A26F */, /*14834*/"YI SYLLABLE HIE"/* A270 */,/*14835*/"YI SYLLABLE HAT"/* A271 */,/*14836*/"YI SYLLABLE HAX"/* A272 */, /*14837*/"YI SYLLABLE HA"/* A273 */,/*14838*/"YI SYLLABLE HAP"/* A274 */,/*14839*/"YI SYLLABLE HUOT"/* A275 */, /*14840*/"YI SYLLABLE HUOX"/* A276 */,/*14841*/"YI SYLLABLE HUO"/* A277 */,/*14842*/"YI SYLLABLE HUOP"/* A278 */, /*14843*/"YI SYLLABLE HOT"/* A279 */,/*14844*/"YI SYLLABLE HOX"/* A27A */,/*14845*/"YI SYLLABLE HO"/* A27B */, /*14846*/"YI SYLLABLE HOP"/* A27C */,/*14847*/"YI SYLLABLE HEX"/* A27D */,/*14848*/"YI SYLLABLE HE"/* A27E */, /*14849*/"YI SYLLABLE HEP"/* A27F */,/*14850*/"YI SYLLABLE WAT"/* A280 */,/*14851*/"YI SYLLABLE WAX"/* A281 */, /*14852*/"YI SYLLABLE WA"/* A282 */,/*14853*/"YI SYLLABLE WAP"/* A283 */,/*14854*/"YI SYLLABLE WUOX"/* A284 */, /*14855*/"YI SYLLABLE WUO"/* A285 */,/*14856*/"YI SYLLABLE WUOP"/* A286 */,/*14857*/"YI SYLLABLE WOX"/* A287 */, /*14858*/"YI SYLLABLE WO"/* A288 */,/*14859*/"YI SYLLABLE WOP"/* A289 */,/*14860*/"YI SYLLABLE WEX"/* A28A */, /*14861*/"YI SYLLABLE WE"/* A28B */,/*14862*/"YI SYLLABLE WEP"/* A28C */,/*14863*/"YI SYLLABLE ZIT"/* A28D */, /*14864*/"YI SYLLABLE ZIX"/* A28E */,/*14865*/"YI SYLLABLE ZI"/* A28F */,/*14866*/"YI SYLLABLE ZIP"/* A290 */, /*14867*/"YI SYLLABLE ZIEX"/* A291 */,/*14868*/"YI SYLLABLE ZIE"/* A292 */,/*14869*/"YI SYLLABLE ZIEP"/* A293 */, /*14870*/"YI SYLLABLE ZAT"/* A294 */,/*14871*/"YI SYLLABLE ZAX"/* A295 */,/*14872*/"YI SYLLABLE ZA"/* A296 */, /*14873*/"YI SYLLABLE ZAP"/* A297 */,/*14874*/"YI SYLLABLE ZUOX"/* A298 */,/*14875*/"YI SYLLABLE ZUO"/* A299 */, /*14876*/"YI SYLLABLE ZUOP"/* A29A */,/*14877*/"YI SYLLABLE ZOT"/* A29B */,/*14878*/"YI SYLLABLE ZOX"/* A29C */, /*14879*/"YI SYLLABLE ZO"/* A29D */,/*14880*/"YI SYLLABLE ZOP"/* A29E */,/*14881*/"YI SYLLABLE ZEX"/* A29F */, /*14882*/"YI SYLLABLE ZE"/* A2A0 */,/*14883*/"YI SYLLABLE ZEP"/* A2A1 */,/*14884*/"YI SYLLABLE ZUT"/* A2A2 */, /*14885*/"YI SYLLABLE ZUX"/* A2A3 */,/*14886*/"YI SYLLABLE ZU"/* A2A4 */,/*14887*/"YI SYLLABLE ZUP"/* A2A5 */, /*14888*/"YI SYLLABLE ZURX"/* A2A6 */,/*14889*/"YI SYLLABLE ZUR"/* A2A7 */,/*14890*/"YI SYLLABLE ZYT"/* A2A8 */, /*14891*/"YI SYLLABLE ZYX"/* A2A9 */,/*14892*/"YI SYLLABLE ZY"/* A2AA */,/*14893*/"YI SYLLABLE ZYP"/* A2AB */, /*14894*/"YI SYLLABLE ZYRX"/* A2AC */,/*14895*/"YI SYLLABLE ZYR"/* A2AD */,/*14896*/"YI SYLLABLE CIT"/* A2AE */, /*14897*/"YI SYLLABLE CIX"/* A2AF */,/*14898*/"YI SYLLABLE CI"/* A2B0 */,/*14899*/"YI SYLLABLE CIP"/* A2B1 */, /*14900*/"YI SYLLABLE CIET"/* A2B2 */,/*14901*/"YI SYLLABLE CIEX"/* A2B3 */,/*14902*/"YI SYLLABLE CIE"/* A2B4 */, /*14903*/"YI SYLLABLE CIEP"/* A2B5 */,/*14904*/"YI SYLLABLE CAT"/* A2B6 */,/*14905*/"YI SYLLABLE CAX"/* A2B7 */, /*14906*/"YI SYLLABLE CA"/* A2B8 */,/*14907*/"YI SYLLABLE CAP"/* A2B9 */,/*14908*/"YI SYLLABLE CUOX"/* A2BA */, /*14909*/"YI SYLLABLE CUO"/* A2BB */,/*14910*/"YI SYLLABLE CUOP"/* A2BC */,/*14911*/"YI SYLLABLE COT"/* A2BD */, /*14912*/"YI SYLLABLE COX"/* A2BE */,/*14913*/"YI SYLLABLE CO"/* A2BF */,/*14914*/"YI SYLLABLE COP"/* A2C0 */, /*14915*/"YI SYLLABLE CEX"/* A2C1 */,/*14916*/"YI SYLLABLE CE"/* A2C2 */,/*14917*/"YI SYLLABLE CEP"/* A2C3 */, /*14918*/"YI SYLLABLE CUT"/* A2C4 */,/*14919*/"YI SYLLABLE CUX"/* A2C5 */,/*14920*/"YI SYLLABLE CU"/* A2C6 */, /*14921*/"YI SYLLABLE CUP"/* A2C7 */,/*14922*/"YI SYLLABLE CURX"/* A2C8 */,/*14923*/"YI SYLLABLE CUR"/* A2C9 */, /*14924*/"YI SYLLABLE CYT"/* A2CA */,/*14925*/"YI SYLLABLE CYX"/* A2CB */,/*14926*/"YI SYLLABLE CY"/* A2CC */, /*14927*/"YI SYLLABLE CYP"/* A2CD */,/*14928*/"YI SYLLABLE CYRX"/* A2CE */,/*14929*/"YI SYLLABLE CYR"/* A2CF */, /*14930*/"YI SYLLABLE ZZIT"/* A2D0 */,/*14931*/"YI SYLLABLE ZZIX"/* A2D1 */,/*14932*/"YI SYLLABLE ZZI"/* A2D2 */, /*14933*/"YI SYLLABLE ZZIP"/* A2D3 */,/*14934*/"YI SYLLABLE ZZIET"/* A2D4 */,/*14935*/"YI SYLLABLE ZZIEX"/* A2D5 */, /*14936*/"YI SYLLABLE ZZIE"/* A2D6 */,/*14937*/"YI SYLLABLE ZZIEP"/* A2D7 */,/*14938*/"YI SYLLABLE ZZAT"/* A2D8 */, /*14939*/"YI SYLLABLE ZZAX"/* A2D9 */,/*14940*/"YI SYLLABLE ZZA"/* A2DA */,/*14941*/"YI SYLLABLE ZZAP"/* A2DB */, /*14942*/"YI SYLLABLE ZZOX"/* A2DC */,/*14943*/"YI SYLLABLE ZZO"/* A2DD */,/*14944*/"YI SYLLABLE ZZOP"/* A2DE */, /*14945*/"YI SYLLABLE ZZEX"/* A2DF */,/*14946*/"YI SYLLABLE ZZE"/* A2E0 */,/*14947*/"YI SYLLABLE ZZEP"/* A2E1 */, /*14948*/"YI SYLLABLE ZZUX"/* A2E2 */,/*14949*/"YI SYLLABLE ZZU"/* A2E3 */,/*14950*/"YI SYLLABLE ZZUP"/* A2E4 */, /*14951*/"YI SYLLABLE ZZURX"/* A2E5 */,/*14952*/"YI SYLLABLE ZZUR"/* A2E6 */,/*14953*/"YI SYLLABLE ZZYT"/* A2E7 */, /*14954*/"YI SYLLABLE ZZYX"/* A2E8 */,/*14955*/"YI SYLLABLE ZZY"/* A2E9 */,/*14956*/"YI SYLLABLE ZZYP"/* A2EA */, /*14957*/"YI SYLLABLE ZZYRX"/* A2EB */,/*14958*/"YI SYLLABLE ZZYR"/* A2EC */,/*14959*/"YI SYLLABLE NZIT"/* A2ED */, /*14960*/"YI SYLLABLE NZIX"/* A2EE */,/*14961*/"YI SYLLABLE NZI"/* A2EF */,/*14962*/"YI SYLLABLE NZIP"/* A2F0 */, /*14963*/"YI SYLLABLE NZIEX"/* A2F1 */,/*14964*/"YI SYLLABLE NZIE"/* A2F2 */,/*14965*/"YI SYLLABLE NZIEP"/* A2F3 */, /*14966*/"YI SYLLABLE NZAT"/* A2F4 */,/*14967*/"YI SYLLABLE NZAX"/* A2F5 */,/*14968*/"YI SYLLABLE NZA"/* A2F6 */, /*14969*/"YI SYLLABLE NZAP"/* A2F7 */,/*14970*/"YI SYLLABLE NZUOX"/* A2F8 */,/*14971*/"YI SYLLABLE NZUO"/* A2F9 */, /*14972*/"YI SYLLABLE NZOX"/* A2FA */,/*14973*/"YI SYLLABLE NZOP"/* A2FB */,/*14974*/"YI SYLLABLE NZEX"/* A2FC */, /*14975*/"YI SYLLABLE NZE"/* A2FD */,/*14976*/"YI SYLLABLE NZUX"/* A2FE */,/*14977*/"YI SYLLABLE NZU"/* A2FF */, /*14978*/"YI SYLLABLE NZUP"/* A300 */,/*14979*/"YI SYLLABLE NZURX"/* A301 */,/*14980*/"YI SYLLABLE NZUR"/* A302 */, /*14981*/"YI SYLLABLE NZYT"/* A303 */,/*14982*/"YI SYLLABLE NZYX"/* A304 */,/*14983*/"YI SYLLABLE NZY"/* A305 */, /*14984*/"YI SYLLABLE NZYP"/* A306 */,/*14985*/"YI SYLLABLE NZYRX"/* A307 */,/*14986*/"YI SYLLABLE NZYR"/* A308 */, /*14987*/"YI SYLLABLE SIT"/* A309 */,/*14988*/"YI SYLLABLE SIX"/* A30A */,/*14989*/"YI SYLLABLE SI"/* A30B */, /*14990*/"YI SYLLABLE SIP"/* A30C */,/*14991*/"YI SYLLABLE SIEX"/* A30D */,/*14992*/"YI SYLLABLE SIE"/* A30E */, /*14993*/"YI SYLLABLE SIEP"/* A30F */,/*14994*/"YI SYLLABLE SAT"/* A310 */,/*14995*/"YI SYLLABLE SAX"/* A311 */, /*14996*/"YI SYLLABLE SA"/* A312 */,/*14997*/"YI SYLLABLE SAP"/* A313 */,/*14998*/"YI SYLLABLE SUOX"/* A314 */, /*14999*/"YI SYLLABLE SUO"/* A315 */,/*15000*/"YI SYLLABLE SUOP"/* A316 */,/*15001*/"YI SYLLABLE SOT"/* A317 */, /*15002*/"YI SYLLABLE SOX"/* A318 */,/*15003*/"YI SYLLABLE SO"/* A319 */,/*15004*/"YI SYLLABLE SOP"/* A31A */, /*15005*/"YI SYLLABLE SEX"/* A31B */,/*15006*/"YI SYLLABLE SE"/* A31C */,/*15007*/"YI SYLLABLE SEP"/* A31D */, /*15008*/"YI SYLLABLE SUT"/* A31E */,/*15009*/"YI SYLLABLE SUX"/* A31F */,/*15010*/"YI SYLLABLE SU"/* A320 */, /*15011*/"YI SYLLABLE SUP"/* A321 */,/*15012*/"YI SYLLABLE SURX"/* A322 */,/*15013*/"YI SYLLABLE SUR"/* A323 */, /*15014*/"YI SYLLABLE SYT"/* A324 */,/*15015*/"YI SYLLABLE SYX"/* A325 */,/*15016*/"YI SYLLABLE SY"/* A326 */, /*15017*/"YI SYLLABLE SYP"/* A327 */,/*15018*/"YI SYLLABLE SYRX"/* A328 */,/*15019*/"YI SYLLABLE SYR"/* A329 */, /*15020*/"YI SYLLABLE SSIT"/* A32A */,/*15021*/"YI SYLLABLE SSIX"/* A32B */,/*15022*/"YI SYLLABLE SSI"/* A32C */, /*15023*/"YI SYLLABLE SSIP"/* A32D */,/*15024*/"YI SYLLABLE SSIEX"/* A32E */,/*15025*/"YI SYLLABLE SSIE"/* A32F */, /*15026*/"YI SYLLABLE SSIEP"/* A330 */,/*15027*/"YI SYLLABLE SSAT"/* A331 */,/*15028*/"YI SYLLABLE SSAX"/* A332 */, /*15029*/"YI SYLLABLE SSA"/* A333 */,/*15030*/"YI SYLLABLE SSAP"/* A334 */,/*15031*/"YI SYLLABLE SSOT"/* A335 */, /*15032*/"YI SYLLABLE SSOX"/* A336 */,/*15033*/"YI SYLLABLE SSO"/* A337 */,/*15034*/"YI SYLLABLE SSOP"/* A338 */, /*15035*/"YI SYLLABLE SSEX"/* A339 */,/*15036*/"YI SYLLABLE SSE"/* A33A */,/*15037*/"YI SYLLABLE SSEP"/* A33B */, /*15038*/"YI SYLLABLE SSUT"/* A33C */,/*15039*/"YI SYLLABLE SSUX"/* A33D */,/*15040*/"YI SYLLABLE SSU"/* A33E */, /*15041*/"YI SYLLABLE SSUP"/* A33F */,/*15042*/"YI SYLLABLE SSYT"/* A340 */,/*15043*/"YI SYLLABLE SSYX"/* A341 */, /*15044*/"YI SYLLABLE SSY"/* A342 */,/*15045*/"YI SYLLABLE SSYP"/* A343 */,/*15046*/"YI SYLLABLE SSYRX"/* A344 */, /*15047*/"YI SYLLABLE SSYR"/* A345 */,/*15048*/"YI SYLLABLE ZHAT"/* A346 */,/*15049*/"YI SYLLABLE ZHAX"/* A347 */, /*15050*/"YI SYLLABLE ZHA"/* A348 */,/*15051*/"YI SYLLABLE ZHAP"/* A349 */,/*15052*/"YI SYLLABLE ZHUOX"/* A34A */, /*15053*/"YI SYLLABLE ZHUO"/* A34B */,/*15054*/"YI SYLLABLE ZHUOP"/* A34C */,/*15055*/"YI SYLLABLE ZHOT"/* A34D */, /*15056*/"YI SYLLABLE ZHOX"/* A34E */,/*15057*/"YI SYLLABLE ZHO"/* A34F */,/*15058*/"YI SYLLABLE ZHOP"/* A350 */, /*15059*/"YI SYLLABLE ZHET"/* A351 */,/*15060*/"YI SYLLABLE ZHEX"/* A352 */,/*15061*/"YI SYLLABLE ZHE"/* A353 */, /*15062*/"YI SYLLABLE ZHEP"/* A354 */,/*15063*/"YI SYLLABLE ZHUT"/* A355 */,/*15064*/"YI SYLLABLE ZHUX"/* A356 */, /*15065*/"YI SYLLABLE ZHU"/* A357 */,/*15066*/"YI SYLLABLE ZHUP"/* A358 */,/*15067*/"YI SYLLABLE ZHURX"/* A359 */, /*15068*/"YI SYLLABLE ZHUR"/* A35A */,/*15069*/"YI SYLLABLE ZHYT"/* A35B */,/*15070*/"YI SYLLABLE ZHYX"/* A35C */, /*15071*/"YI SYLLABLE ZHY"/* A35D */,/*15072*/"YI SYLLABLE ZHYP"/* A35E */,/*15073*/"YI SYLLABLE ZHYRX"/* A35F */, /*15074*/"YI SYLLABLE ZHYR"/* A360 */,/*15075*/"YI SYLLABLE CHAT"/* A361 */,/*15076*/"YI SYLLABLE CHAX"/* A362 */, /*15077*/"YI SYLLABLE CHA"/* A363 */,/*15078*/"YI SYLLABLE CHAP"/* A364 */,/*15079*/"YI SYLLABLE CHUOT"/* A365 */, /*15080*/"YI SYLLABLE CHUOX"/* A366 */,/*15081*/"YI SYLLABLE CHUO"/* A367 */,/*15082*/"YI SYLLABLE CHUOP"/* A368 */, /*15083*/"YI SYLLABLE CHOT"/* A369 */,/*15084*/"YI SYLLABLE CHOX"/* A36A */,/*15085*/"YI SYLLABLE CHO"/* A36B */, /*15086*/"YI SYLLABLE CHOP"/* A36C */,/*15087*/"YI SYLLABLE CHET"/* A36D */,/*15088*/"YI SYLLABLE CHEX"/* A36E */, /*15089*/"YI SYLLABLE CHE"/* A36F */,/*15090*/"YI SYLLABLE CHEP"/* A370 */,/*15091*/"YI SYLLABLE CHUX"/* A371 */, /*15092*/"YI SYLLABLE CHU"/* A372 */,/*15093*/"YI SYLLABLE CHUP"/* A373 */,/*15094*/"YI SYLLABLE CHURX"/* A374 */, /*15095*/"YI SYLLABLE CHUR"/* A375 */,/*15096*/"YI SYLLABLE CHYT"/* A376 */,/*15097*/"YI SYLLABLE CHYX"/* A377 */, /*15098*/"YI SYLLABLE CHY"/* A378 */,/*15099*/"YI SYLLABLE CHYP"/* A379 */,/*15100*/"YI SYLLABLE CHYRX"/* A37A */, /*15101*/"YI SYLLABLE CHYR"/* A37B */,/*15102*/"YI SYLLABLE RRAX"/* A37C */,/*15103*/"YI SYLLABLE RRA"/* A37D */, /*15104*/"YI SYLLABLE RRUOX"/* A37E */,/*15105*/"YI SYLLABLE RRUO"/* A37F */,/*15106*/"YI SYLLABLE RROT"/* A380 */, /*15107*/"YI SYLLABLE RROX"/* A381 */,/*15108*/"YI SYLLABLE RRO"/* A382 */,/*15109*/"YI SYLLABLE RROP"/* A383 */, /*15110*/"YI SYLLABLE RRET"/* A384 */,/*15111*/"YI SYLLABLE RREX"/* A385 */,/*15112*/"YI SYLLABLE RRE"/* A386 */, /*15113*/"YI SYLLABLE RREP"/* A387 */,/*15114*/"YI SYLLABLE RRUT"/* A388 */,/*15115*/"YI SYLLABLE RRUX"/* A389 */, /*15116*/"YI SYLLABLE RRU"/* A38A */,/*15117*/"YI SYLLABLE RRUP"/* A38B */,/*15118*/"YI SYLLABLE RRURX"/* A38C */, /*15119*/"YI SYLLABLE RRUR"/* A38D */,/*15120*/"YI SYLLABLE RRYT"/* A38E */,/*15121*/"YI SYLLABLE RRYX"/* A38F */, /*15122*/"YI SYLLABLE RRY"/* A390 */,/*15123*/"YI SYLLABLE RRYP"/* A391 */,/*15124*/"YI SYLLABLE RRYRX"/* A392 */, /*15125*/"YI SYLLABLE RRYR"/* A393 */,/*15126*/"YI SYLLABLE NRAT"/* A394 */,/*15127*/"YI SYLLABLE NRAX"/* A395 */, /*15128*/"YI SYLLABLE NRA"/* A396 */,/*15129*/"YI SYLLABLE NRAP"/* A397 */,/*15130*/"YI SYLLABLE NROX"/* A398 */, /*15131*/"YI SYLLABLE NRO"/* A399 */,/*15132*/"YI SYLLABLE NROP"/* A39A */,/*15133*/"YI SYLLABLE NRET"/* A39B */, /*15134*/"YI SYLLABLE NREX"/* A39C */,/*15135*/"YI SYLLABLE NRE"/* A39D */,/*15136*/"YI SYLLABLE NREP"/* A39E */, /*15137*/"YI SYLLABLE NRUT"/* A39F */,/*15138*/"YI SYLLABLE NRUX"/* A3A0 */,/*15139*/"YI SYLLABLE NRU"/* A3A1 */, /*15140*/"YI SYLLABLE NRUP"/* A3A2 */,/*15141*/"YI SYLLABLE NRURX"/* A3A3 */,/*15142*/"YI SYLLABLE NRUR"/* A3A4 */, /*15143*/"YI SYLLABLE NRYT"/* A3A5 */,/*15144*/"YI SYLLABLE NRYX"/* A3A6 */,/*15145*/"YI SYLLABLE NRY"/* A3A7 */, /*15146*/"YI SYLLABLE NRYP"/* A3A8 */,/*15147*/"YI SYLLABLE NRYRX"/* A3A9 */,/*15148*/"YI SYLLABLE NRYR"/* A3AA */, /*15149*/"YI SYLLABLE SHAT"/* A3AB */,/*15150*/"YI SYLLABLE SHAX"/* A3AC */,/*15151*/"YI SYLLABLE SHA"/* A3AD */, /*15152*/"YI SYLLABLE SHAP"/* A3AE */,/*15153*/"YI SYLLABLE SHUOX"/* A3AF */,/*15154*/"YI SYLLABLE SHUO"/* A3B0 */, /*15155*/"YI SYLLABLE SHUOP"/* A3B1 */,/*15156*/"YI SYLLABLE SHOT"/* A3B2 */,/*15157*/"YI SYLLABLE SHOX"/* A3B3 */, /*15158*/"YI SYLLABLE SHO"/* A3B4 */,/*15159*/"YI SYLLABLE SHOP"/* A3B5 */,/*15160*/"YI SYLLABLE SHET"/* A3B6 */, /*15161*/"YI SYLLABLE SHEX"/* A3B7 */,/*15162*/"YI SYLLABLE SHE"/* A3B8 */,/*15163*/"YI SYLLABLE SHEP"/* A3B9 */, /*15164*/"YI SYLLABLE SHUT"/* A3BA */,/*15165*/"YI SYLLABLE SHUX"/* A3BB */,/*15166*/"YI SYLLABLE SHU"/* A3BC */, /*15167*/"YI SYLLABLE SHUP"/* A3BD */,/*15168*/"YI SYLLABLE SHURX"/* A3BE */,/*15169*/"YI SYLLABLE SHUR"/* A3BF */, /*15170*/"YI SYLLABLE SHYT"/* A3C0 */,/*15171*/"YI SYLLABLE SHYX"/* A3C1 */,/*15172*/"YI SYLLABLE SHY"/* A3C2 */, /*15173*/"YI SYLLABLE SHYP"/* A3C3 */,/*15174*/"YI SYLLABLE SHYRX"/* A3C4 */,/*15175*/"YI SYLLABLE SHYR"/* A3C5 */, /*15176*/"YI SYLLABLE RAT"/* A3C6 */,/*15177*/"YI SYLLABLE RAX"/* A3C7 */,/*15178*/"YI SYLLABLE RA"/* A3C8 */, /*15179*/"YI SYLLABLE RAP"/* A3C9 */,/*15180*/"YI SYLLABLE RUOX"/* A3CA */,/*15181*/"YI SYLLABLE RUO"/* A3CB */, /*15182*/"YI SYLLABLE RUOP"/* A3CC */,/*15183*/"YI SYLLABLE ROT"/* A3CD */,/*15184*/"YI SYLLABLE ROX"/* A3CE */, /*15185*/"YI SYLLABLE RO"/* A3CF */,/*15186*/"YI SYLLABLE ROP"/* A3D0 */,/*15187*/"YI SYLLABLE REX"/* A3D1 */, /*15188*/"YI SYLLABLE RE"/* A3D2 */,/*15189*/"YI SYLLABLE REP"/* A3D3 */,/*15190*/"YI SYLLABLE RUT"/* A3D4 */, /*15191*/"YI SYLLABLE RUX"/* A3D5 */,/*15192*/"YI SYLLABLE RU"/* A3D6 */,/*15193*/"YI SYLLABLE RUP"/* A3D7 */, /*15194*/"YI SYLLABLE RURX"/* A3D8 */,/*15195*/"YI SYLLABLE RUR"/* A3D9 */,/*15196*/"YI SYLLABLE RYT"/* A3DA */, /*15197*/"YI SYLLABLE RYX"/* A3DB */,/*15198*/"YI SYLLABLE RY"/* A3DC */,/*15199*/"YI SYLLABLE RYP"/* A3DD */, /*15200*/"YI SYLLABLE RYRX"/* A3DE */,/*15201*/"YI SYLLABLE RYR"/* A3DF */,/*15202*/"YI SYLLABLE JIT"/* A3E0 */, /*15203*/"YI SYLLABLE JIX"/* A3E1 */,/*15204*/"YI SYLLABLE JI"/* A3E2 */,/*15205*/"YI SYLLABLE JIP"/* A3E3 */, /*15206*/"YI SYLLABLE JIET"/* A3E4 */,/*15207*/"YI SYLLABLE JIEX"/* A3E5 */,/*15208*/"YI SYLLABLE JIE"/* A3E6 */, /*15209*/"YI SYLLABLE JIEP"/* A3E7 */,/*15210*/"YI SYLLABLE JUOT"/* A3E8 */,/*15211*/"YI SYLLABLE JUOX"/* A3E9 */, /*15212*/"YI SYLLABLE JUO"/* A3EA */,/*15213*/"YI SYLLABLE JUOP"/* A3EB */,/*15214*/"YI SYLLABLE JOT"/* A3EC */, /*15215*/"YI SYLLABLE JOX"/* A3ED */,/*15216*/"YI SYLLABLE JO"/* A3EE */,/*15217*/"YI SYLLABLE JOP"/* A3EF */, /*15218*/"YI SYLLABLE JUT"/* A3F0 */,/*15219*/"YI SYLLABLE JUX"/* A3F1 */,/*15220*/"YI SYLLABLE JU"/* A3F2 */, /*15221*/"YI SYLLABLE JUP"/* A3F3 */,/*15222*/"YI SYLLABLE JURX"/* A3F4 */,/*15223*/"YI SYLLABLE JUR"/* A3F5 */, /*15224*/"YI SYLLABLE JYT"/* A3F6 */,/*15225*/"YI SYLLABLE JYX"/* A3F7 */,/*15226*/"YI SYLLABLE JY"/* A3F8 */, /*15227*/"YI SYLLABLE JYP"/* A3F9 */,/*15228*/"YI SYLLABLE JYRX"/* A3FA */,/*15229*/"YI SYLLABLE JYR"/* A3FB */, /*15230*/"YI SYLLABLE QIT"/* A3FC */,/*15231*/"YI SYLLABLE QIX"/* A3FD */,/*15232*/"YI SYLLABLE QI"/* A3FE */, /*15233*/"YI SYLLABLE QIP"/* A3FF */,/*15234*/"YI SYLLABLE QIET"/* A400 */,/*15235*/"YI SYLLABLE QIEX"/* A401 */, /*15236*/"YI SYLLABLE QIE"/* A402 */,/*15237*/"YI SYLLABLE QIEP"/* A403 */,/*15238*/"YI SYLLABLE QUOT"/* A404 */, /*15239*/"YI SYLLABLE QUOX"/* A405 */,/*15240*/"YI SYLLABLE QUO"/* A406 */,/*15241*/"YI SYLLABLE QUOP"/* A407 */, /*15242*/"YI SYLLABLE QOT"/* A408 */,/*15243*/"YI SYLLABLE QOX"/* A409 */,/*15244*/"YI SYLLABLE QO"/* A40A */, /*15245*/"YI SYLLABLE QOP"/* A40B */,/*15246*/"YI SYLLABLE QUT"/* A40C */,/*15247*/"YI SYLLABLE QUX"/* A40D */, /*15248*/"YI SYLLABLE QU"/* A40E */,/*15249*/"YI SYLLABLE QUP"/* A40F */,/*15250*/"YI SYLLABLE QURX"/* A410 */, /*15251*/"YI SYLLABLE QUR"/* A411 */,/*15252*/"YI SYLLABLE QYT"/* A412 */,/*15253*/"YI SYLLABLE QYX"/* A413 */, /*15254*/"YI SYLLABLE QY"/* A414 */,/*15255*/"YI SYLLABLE QYP"/* A415 */,/*15256*/"YI SYLLABLE QYRX"/* A416 */, /*15257*/"YI SYLLABLE QYR"/* A417 */,/*15258*/"YI SYLLABLE JJIT"/* A418 */,/*15259*/"YI SYLLABLE JJIX"/* A419 */, /*15260*/"YI SYLLABLE JJI"/* A41A */,/*15261*/"YI SYLLABLE JJIP"/* A41B */,/*15262*/"YI SYLLABLE JJIET"/* A41C */, /*15263*/"YI SYLLABLE JJIEX"/* A41D */,/*15264*/"YI SYLLABLE JJIE"/* A41E */,/*15265*/"YI SYLLABLE JJIEP"/* A41F */, /*15266*/"YI SYLLABLE JJUOX"/* A420 */,/*15267*/"YI SYLLABLE JJUO"/* A421 */,/*15268*/"YI SYLLABLE JJUOP"/* A422 */, /*15269*/"YI SYLLABLE JJOT"/* A423 */,/*15270*/"YI SYLLABLE JJOX"/* A424 */,/*15271*/"YI SYLLABLE JJO"/* A425 */, /*15272*/"YI SYLLABLE JJOP"/* A426 */,/*15273*/"YI SYLLABLE JJUT"/* A427 */,/*15274*/"YI SYLLABLE JJUX"/* A428 */, /*15275*/"YI SYLLABLE JJU"/* A429 */,/*15276*/"YI SYLLABLE JJUP"/* A42A */,/*15277*/"YI SYLLABLE JJURX"/* A42B */, /*15278*/"YI SYLLABLE JJUR"/* A42C */,/*15279*/"YI SYLLABLE JJYT"/* A42D */,/*15280*/"YI SYLLABLE JJYX"/* A42E */, /*15281*/"YI SYLLABLE JJY"/* A42F */,/*15282*/"YI SYLLABLE JJYP"/* A430 */,/*15283*/"YI SYLLABLE NJIT"/* A431 */, /*15284*/"YI SYLLABLE NJIX"/* A432 */,/*15285*/"YI SYLLABLE NJI"/* A433 */,/*15286*/"YI SYLLABLE NJIP"/* A434 */, /*15287*/"YI SYLLABLE NJIET"/* A435 */,/*15288*/"YI SYLLABLE NJIEX"/* A436 */,/*15289*/"YI SYLLABLE NJIE"/* A437 */, /*15290*/"YI SYLLABLE NJIEP"/* A438 */,/*15291*/"YI SYLLABLE NJUOX"/* A439 */,/*15292*/"YI SYLLABLE NJUO"/* A43A */, /*15293*/"YI SYLLABLE NJOT"/* A43B */,/*15294*/"YI SYLLABLE NJOX"/* A43C */,/*15295*/"YI SYLLABLE NJO"/* A43D */, /*15296*/"YI SYLLABLE NJOP"/* A43E */,/*15297*/"YI SYLLABLE NJUX"/* A43F */,/*15298*/"YI SYLLABLE NJU"/* A440 */, /*15299*/"YI SYLLABLE NJUP"/* A441 */,/*15300*/"YI SYLLABLE NJURX"/* A442 */,/*15301*/"YI SYLLABLE NJUR"/* A443 */, /*15302*/"YI SYLLABLE NJYT"/* A444 */,/*15303*/"YI SYLLABLE NJYX"/* A445 */,/*15304*/"YI SYLLABLE NJY"/* A446 */, /*15305*/"YI SYLLABLE NJYP"/* A447 */,/*15306*/"YI SYLLABLE NJYRX"/* A448 */,/*15307*/"YI SYLLABLE NJYR"/* A449 */, /*15308*/"YI SYLLABLE NYIT"/* A44A */,/*15309*/"YI SYLLABLE NYIX"/* A44B */,/*15310*/"YI SYLLABLE NYI"/* A44C */, /*15311*/"YI SYLLABLE NYIP"/* A44D */,/*15312*/"YI SYLLABLE NYIET"/* A44E */,/*15313*/"YI SYLLABLE NYIEX"/* A44F */, /*15314*/"YI SYLLABLE NYIE"/* A450 */,/*15315*/"YI SYLLABLE NYIEP"/* A451 */,/*15316*/"YI SYLLABLE NYUOX"/* A452 */, /*15317*/"YI SYLLABLE NYUO"/* A453 */,/*15318*/"YI SYLLABLE NYUOP"/* A454 */,/*15319*/"YI SYLLABLE NYOT"/* A455 */, /*15320*/"YI SYLLABLE NYOX"/* A456 */,/*15321*/"YI SYLLABLE NYO"/* A457 */,/*15322*/"YI SYLLABLE NYOP"/* A458 */, /*15323*/"YI SYLLABLE NYUT"/* A459 */,/*15324*/"YI SYLLABLE NYUX"/* A45A */,/*15325*/"YI SYLLABLE NYU"/* A45B */, /*15326*/"YI SYLLABLE NYUP"/* A45C */,/*15327*/"YI SYLLABLE XIT"/* A45D */,/*15328*/"YI SYLLABLE XIX"/* A45E */, /*15329*/"YI SYLLABLE XI"/* A45F */,/*15330*/"YI SYLLABLE XIP"/* A460 */,/*15331*/"YI SYLLABLE XIET"/* A461 */, /*15332*/"YI SYLLABLE XIEX"/* A462 */,/*15333*/"YI SYLLABLE XIE"/* A463 */,/*15334*/"YI SYLLABLE XIEP"/* A464 */, /*15335*/"YI SYLLABLE XUOX"/* A465 */,/*15336*/"YI SYLLABLE XUO"/* A466 */,/*15337*/"YI SYLLABLE XOT"/* A467 */, /*15338*/"YI SYLLABLE XOX"/* A468 */,/*15339*/"YI SYLLABLE XO"/* A469 */,/*15340*/"YI SYLLABLE XOP"/* A46A */, /*15341*/"YI SYLLABLE XYT"/* A46B */,/*15342*/"YI SYLLABLE XYX"/* A46C */,/*15343*/"YI SYLLABLE XY"/* A46D */, /*15344*/"YI SYLLABLE XYP"/* A46E */,/*15345*/"YI SYLLABLE XYRX"/* A46F */,/*15346*/"YI SYLLABLE XYR"/* A470 */, /*15347*/"YI SYLLABLE YIT"/* A471 */,/*15348*/"YI SYLLABLE YIX"/* A472 */,/*15349*/"YI SYLLABLE YI"/* A473 */, /*15350*/"YI SYLLABLE YIP"/* A474 */,/*15351*/"YI SYLLABLE YIET"/* A475 */,/*15352*/"YI SYLLABLE YIEX"/* A476 */, /*15353*/"YI SYLLABLE YIE"/* A477 */,/*15354*/"YI SYLLABLE YIEP"/* A478 */,/*15355*/"YI SYLLABLE YUOT"/* A479 */, /*15356*/"YI SYLLABLE YUOX"/* A47A */,/*15357*/"YI SYLLABLE YUO"/* A47B */,/*15358*/"YI SYLLABLE YUOP"/* A47C */, /*15359*/"YI SYLLABLE YOT"/* A47D */,/*15360*/"YI SYLLABLE YOX"/* A47E */,/*15361*/"YI SYLLABLE YO"/* A47F */, /*15362*/"YI SYLLABLE YOP"/* A480 */,/*15363*/"YI SYLLABLE YUT"/* A481 */,/*15364*/"YI SYLLABLE YUX"/* A482 */, /*15365*/"YI SYLLABLE YU"/* A483 */,/*15366*/"YI SYLLABLE YUP"/* A484 */,/*15367*/"YI SYLLABLE YURX"/* A485 */, /*15368*/"YI SYLLABLE YUR"/* A486 */,/*15369*/"YI SYLLABLE YYT"/* A487 */,/*15370*/"YI SYLLABLE YYX"/* A488 */, /*15371*/"YI SYLLABLE YY"/* A489 */,/*15372*/"YI SYLLABLE YYP"/* A48A */,/*15373*/"YI SYLLABLE YYRX"/* A48B */, /*15374*/"YI SYLLABLE YYR"/* A48C */,NULL,NULL,NULL,/*15378*/"YI RADICAL QOT"/* A490 */, /*15379*/"YI RADICAL LI"/* A491 */,/*15380*/"YI RADICAL KIT"/* A492 */,/*15381*/"YI RADICAL NYIP"/* A493 */, /*15382*/"YI RADICAL CYP"/* A494 */,/*15383*/"YI RADICAL SSI"/* A495 */,/*15384*/"YI RADICAL GGOP"/* A496 */, /*15385*/"YI RADICAL GEP"/* A497 */,/*15386*/"YI RADICAL MI"/* A498 */,/*15387*/"YI RADICAL HXIT"/* A499 */, /*15388*/"YI RADICAL LYR"/* A49A */,/*15389*/"YI RADICAL BBUT"/* A49B */,/*15390*/"YI RADICAL MOP"/* A49C */, /*15391*/"YI RADICAL YO"/* A49D */,/*15392*/"YI RADICAL PUT"/* A49E */,/*15393*/"YI RADICAL HXUO"/* A49F */, /*15394*/"YI RADICAL TAT"/* A4A0 */,/*15395*/"YI RADICAL GA"/* A4A1 */,/*15396*/"YI RADICAL ZUP"/* A4A2 */, /*15397*/"YI RADICAL CYT"/* A4A3 */,/*15398*/"YI RADICAL DDUR"/* A4A4 */,/*15399*/"YI RADICAL BUR"/* A4A5 */, /*15400*/"YI RADICAL GGUO"/* A4A6 */,/*15401*/"YI RADICAL NYOP"/* A4A7 */,/*15402*/"YI RADICAL TU"/* A4A8 */, /*15403*/"YI RADICAL OP"/* A4A9 */,/*15404*/"YI RADICAL JJUT"/* A4AA */,/*15405*/"YI RADICAL ZOT"/* A4AB */, /*15406*/"YI RADICAL PYT"/* A4AC */,/*15407*/"YI RADICAL HMO"/* A4AD */,/*15408*/"YI RADICAL YIT"/* A4AE */, /*15409*/"YI RADICAL VUR"/* A4AF */,/*15410*/"YI RADICAL SHY"/* A4B0 */,/*15411*/"YI RADICAL VEP"/* A4B1 */, /*15412*/"YI RADICAL ZA"/* A4B2 */,/*15413*/"YI RADICAL JO"/* A4B3 */,/*15414*/"YI RADICAL NZUP"/* A4B4 */, /*15415*/"YI RADICAL JJY"/* A4B5 */,/*15416*/"YI RADICAL GOT"/* A4B6 */,/*15417*/"YI RADICAL JJIE"/* A4B7 */, /*15418*/"YI RADICAL WO"/* A4B8 */,/*15419*/"YI RADICAL DU"/* A4B9 */,/*15420*/"YI RADICAL SHUR"/* A4BA */, /*15421*/"YI RADICAL LIE"/* A4BB */,/*15422*/"YI RADICAL CY"/* A4BC */,/*15423*/"YI RADICAL CUOP"/* A4BD */, /*15424*/"YI RADICAL CIP"/* A4BE */,/*15425*/"YI RADICAL HXOP"/* A4BF */,/*15426*/"YI RADICAL SHAT"/* A4C0 */, /*15427*/"YI RADICAL ZUR"/* A4C1 */,/*15428*/"YI RADICAL SHOP"/* A4C2 */,/*15429*/"YI RADICAL CHE"/* A4C3 */, /*15430*/"YI RADICAL ZZIET"/* A4C4 */,/*15431*/"YI RADICAL NBIE"/* A4C5 */,/*15432*/"YI RADICAL KE"/* A4C6 */,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*15442*/"LISU LETTER BA"/* A4D0 */,/*15443*/"LISU LETTER PA"/* A4D1 */, /*15444*/"LISU LETTER PHA"/* A4D2 */,/*15445*/"LISU LETTER DA"/* A4D3 */,/*15446*/"LISU LETTER TA"/* A4D4 */, /*15447*/"LISU LETTER THA"/* A4D5 */,/*15448*/"LISU LETTER GA"/* A4D6 */,/*15449*/"LISU LETTER KA"/* A4D7 */, /*15450*/"LISU LETTER KHA"/* A4D8 */,/*15451*/"LISU LETTER JA"/* A4D9 */,/*15452*/"LISU LETTER CA"/* A4DA */, /*15453*/"LISU LETTER CHA"/* A4DB */,/*15454*/"LISU LETTER DZA"/* A4DC */,/*15455*/"LISU LETTER TSA"/* A4DD */, /*15456*/"LISU LETTER TSHA"/* A4DE */,/*15457*/"LISU LETTER MA"/* A4DF */,/*15458*/"LISU LETTER NA"/* A4E0 */, /*15459*/"LISU LETTER LA"/* A4E1 */,/*15460*/"LISU LETTER SA"/* A4E2 */,/*15461*/"LISU LETTER ZHA"/* A4E3 */, /*15462*/"LISU LETTER ZA"/* A4E4 */,/*15463*/"LISU LETTER NGA"/* A4E5 */,/*15464*/"LISU LETTER HA"/* A4E6 */, /*15465*/"LISU LETTER XA"/* A4E7 */,/*15466*/"LISU LETTER HHA"/* A4E8 */,/*15467*/"LISU LETTER FA"/* A4E9 */, /*15468*/"LISU LETTER WA"/* A4EA */,/*15469*/"LISU LETTER SHA"/* A4EB */,/*15470*/"LISU LETTER YA"/* A4EC */, /*15471*/"LISU LETTER GHA"/* A4ED */,/*15472*/"LISU LETTER A"/* A4EE */,/*15473*/"LISU LETTER AE"/* A4EF */, /*15474*/"LISU LETTER E"/* A4F0 */,/*15475*/"LISU LETTER EU"/* A4F1 */,/*15476*/"LISU LETTER I"/* A4F2 */, /*15477*/"LISU LETTER O"/* A4F3 */,/*15478*/"LISU LETTER U"/* A4F4 */,/*15479*/"LISU LETTER UE"/* A4F5 */, /*15480*/"LISU LETTER UH"/* A4F6 */,/*15481*/"LISU LETTER OE"/* A4F7 */,/*15482*/"LISU LETTER TONE MYA TI"/* A4F8 */, /*15483*/"LISU LETTER TONE NA PO"/* A4F9 */,/*15484*/"LISU LETTER TONE MYA CYA"/* A4FA */, /*15485*/"LISU LETTER TONE MYA BO"/* A4FB */,/*15486*/"LISU LETTER TONE MYA NA"/* A4FC */, /*15487*/"LISU LETTER TONE MYA JEU"/* A4FD */,/*15488*/"LISU PUNCTUATION COMMA"/* A4FE */, /*15489*/"LISU PUNCTUATION FULL STOP"/* A4FF */,/*15490*/"VAI SYLLABLE EE"/* A500 */, /*15491*/"VAI SYLLABLE EEN"/* A501 */,/*15492*/"VAI SYLLABLE HEE"/* A502 */,/*15493*/"VAI SYLLABLE WEE"/* A503 */, /*15494*/"VAI SYLLABLE WEEN"/* A504 */,/*15495*/"VAI SYLLABLE PEE"/* A505 */,/*15496*/"VAI SYLLABLE BHEE"/* A506 */, /*15497*/"VAI SYLLABLE BEE"/* A507 */,/*15498*/"VAI SYLLABLE MBEE"/* A508 */,/*15499*/"VAI SYLLABLE KPEE"/* A509 */, /*15500*/"VAI SYLLABLE MGBEE"/* A50A */,/*15501*/"VAI SYLLABLE GBEE"/* A50B */,/*15502*/"VAI SYLLABLE FEE"/* A50C */, /*15503*/"VAI SYLLABLE VEE"/* A50D */,/*15504*/"VAI SYLLABLE TEE"/* A50E */,/*15505*/"VAI SYLLABLE THEE"/* A50F */, /*15506*/"VAI SYLLABLE DHEE"/* A510 */,/*15507*/"VAI SYLLABLE DHHEE"/* A511 */,/*15508*/"VAI SYLLABLE LEE"/* A512 */, /*15509*/"VAI SYLLABLE REE"/* A513 */,/*15510*/"VAI SYLLABLE DEE"/* A514 */,/*15511*/"VAI SYLLABLE NDEE"/* A515 */, /*15512*/"VAI SYLLABLE SEE"/* A516 */,/*15513*/"VAI SYLLABLE SHEE"/* A517 */,/*15514*/"VAI SYLLABLE ZEE"/* A518 */, /*15515*/"VAI SYLLABLE ZHEE"/* A519 */,/*15516*/"VAI SYLLABLE CEE"/* A51A */,/*15517*/"VAI SYLLABLE JEE"/* A51B */, /*15518*/"VAI SYLLABLE NJEE"/* A51C */,/*15519*/"VAI SYLLABLE YEE"/* A51D */,/*15520*/"VAI SYLLABLE KEE"/* A51E */, /*15521*/"VAI SYLLABLE NGGEE"/* A51F */,/*15522*/"VAI SYLLABLE GEE"/* A520 */,/*15523*/"VAI SYLLABLE MEE"/* A521 */, /*15524*/"VAI SYLLABLE NEE"/* A522 */,/*15525*/"VAI SYLLABLE NYEE"/* A523 */,/*15526*/"VAI SYLLABLE I"/* A524 */, /*15527*/"VAI SYLLABLE IN"/* A525 */,/*15528*/"VAI SYLLABLE HI"/* A526 */,/*15529*/"VAI SYLLABLE HIN"/* A527 */, /*15530*/"VAI SYLLABLE WI"/* A528 */,/*15531*/"VAI SYLLABLE WIN"/* A529 */,/*15532*/"VAI SYLLABLE PI"/* A52A */, /*15533*/"VAI SYLLABLE BHI"/* A52B */,/*15534*/"VAI SYLLABLE BI"/* A52C */,/*15535*/"VAI SYLLABLE MBI"/* A52D */, /*15536*/"VAI SYLLABLE KPI"/* A52E */,/*15537*/"VAI SYLLABLE MGBI"/* A52F */,/*15538*/"VAI SYLLABLE GBI"/* A530 */, /*15539*/"VAI SYLLABLE FI"/* A531 */,/*15540*/"VAI SYLLABLE VI"/* A532 */,/*15541*/"VAI SYLLABLE TI"/* A533 */, /*15542*/"VAI SYLLABLE THI"/* A534 */,/*15543*/"VAI SYLLABLE DHI"/* A535 */,/*15544*/"VAI SYLLABLE DHHI"/* A536 */, /*15545*/"VAI SYLLABLE LI"/* A537 */,/*15546*/"VAI SYLLABLE RI"/* A538 */,/*15547*/"VAI SYLLABLE DI"/* A539 */, /*15548*/"VAI SYLLABLE NDI"/* A53A */,/*15549*/"VAI SYLLABLE SI"/* A53B */,/*15550*/"VAI SYLLABLE SHI"/* A53C */, /*15551*/"VAI SYLLABLE ZI"/* A53D */,/*15552*/"VAI SYLLABLE ZHI"/* A53E */,/*15553*/"VAI SYLLABLE CI"/* A53F */, /*15554*/"VAI SYLLABLE JI"/* A540 */,/*15555*/"VAI SYLLABLE NJI"/* A541 */,/*15556*/"VAI SYLLABLE YI"/* A542 */, /*15557*/"VAI SYLLABLE KI"/* A543 */,/*15558*/"VAI SYLLABLE NGGI"/* A544 */,/*15559*/"VAI SYLLABLE GI"/* A545 */, /*15560*/"VAI SYLLABLE MI"/* A546 */,/*15561*/"VAI SYLLABLE NI"/* A547 */,/*15562*/"VAI SYLLABLE NYI"/* A548 */, /*15563*/"VAI SYLLABLE A"/* A549 */,/*15564*/"VAI SYLLABLE AN"/* A54A */,/*15565*/"VAI SYLLABLE NGAN"/* A54B */, /*15566*/"VAI SYLLABLE HA"/* A54C */,/*15567*/"VAI SYLLABLE HAN"/* A54D */,/*15568*/"VAI SYLLABLE WA"/* A54E */, /*15569*/"VAI SYLLABLE WAN"/* A54F */,/*15570*/"VAI SYLLABLE PA"/* A550 */,/*15571*/"VAI SYLLABLE BHA"/* A551 */, /*15572*/"VAI SYLLABLE BA"/* A552 */,/*15573*/"VAI SYLLABLE MBA"/* A553 */,/*15574*/"VAI SYLLABLE KPA"/* A554 */, /*15575*/"VAI SYLLABLE KPAN"/* A555 */,/*15576*/"VAI SYLLABLE MGBA"/* A556 */,/*15577*/"VAI SYLLABLE GBA"/* A557 */, /*15578*/"VAI SYLLABLE FA"/* A558 */,/*15579*/"VAI SYLLABLE VA"/* A559 */,/*15580*/"VAI SYLLABLE TA"/* A55A */, /*15581*/"VAI SYLLABLE THA"/* A55B */,/*15582*/"VAI SYLLABLE DHA"/* A55C */,/*15583*/"VAI SYLLABLE DHHA"/* A55D */, /*15584*/"VAI SYLLABLE LA"/* A55E */,/*15585*/"VAI SYLLABLE RA"/* A55F */,/*15586*/"VAI SYLLABLE DA"/* A560 */, /*15587*/"VAI SYLLABLE NDA"/* A561 */,/*15588*/"VAI SYLLABLE SA"/* A562 */,/*15589*/"VAI SYLLABLE SHA"/* A563 */, /*15590*/"VAI SYLLABLE ZA"/* A564 */,/*15591*/"VAI SYLLABLE ZHA"/* A565 */,/*15592*/"VAI SYLLABLE CA"/* A566 */, /*15593*/"VAI SYLLABLE JA"/* A567 */,/*15594*/"VAI SYLLABLE NJA"/* A568 */,/*15595*/"VAI SYLLABLE YA"/* A569 */, /*15596*/"VAI SYLLABLE KA"/* A56A */,/*15597*/"VAI SYLLABLE KAN"/* A56B */,/*15598*/"VAI SYLLABLE NGGA"/* A56C */, /*15599*/"VAI SYLLABLE GA"/* A56D */,/*15600*/"VAI SYLLABLE MA"/* A56E */,/*15601*/"VAI SYLLABLE NA"/* A56F */, /*15602*/"VAI SYLLABLE NYA"/* A570 */,/*15603*/"VAI SYLLABLE OO"/* A571 */,/*15604*/"VAI SYLLABLE OON"/* A572 */, /*15605*/"VAI SYLLABLE HOO"/* A573 */,/*15606*/"VAI SYLLABLE WOO"/* A574 */,/*15607*/"VAI SYLLABLE WOON"/* A575 */, /*15608*/"VAI SYLLABLE POO"/* A576 */,/*15609*/"VAI SYLLABLE BHOO"/* A577 */,/*15610*/"VAI SYLLABLE BOO"/* A578 */, /*15611*/"VAI SYLLABLE MBOO"/* A579 */,/*15612*/"VAI SYLLABLE KPOO"/* A57A */,/*15613*/"VAI SYLLABLE MGBOO"/* A57B */, /*15614*/"VAI SYLLABLE GBOO"/* A57C */,/*15615*/"VAI SYLLABLE FOO"/* A57D */,/*15616*/"VAI SYLLABLE VOO"/* A57E */, /*15617*/"VAI SYLLABLE TOO"/* A57F */,/*15618*/"VAI SYLLABLE THOO"/* A580 */,/*15619*/"VAI SYLLABLE DHOO"/* A581 */, /*15620*/"VAI SYLLABLE DHHOO"/* A582 */,/*15621*/"VAI SYLLABLE LOO"/* A583 */,/*15622*/"VAI SYLLABLE ROO"/* A584 */, /*15623*/"VAI SYLLABLE DOO"/* A585 */,/*15624*/"VAI SYLLABLE NDOO"/* A586 */,/*15625*/"VAI SYLLABLE SOO"/* A587 */, /*15626*/"VAI SYLLABLE SHOO"/* A588 */,/*15627*/"VAI SYLLABLE ZOO"/* A589 */,/*15628*/"VAI SYLLABLE ZHOO"/* A58A */, /*15629*/"VAI SYLLABLE COO"/* A58B */,/*15630*/"VAI SYLLABLE JOO"/* A58C */,/*15631*/"VAI SYLLABLE NJOO"/* A58D */, /*15632*/"VAI SYLLABLE YOO"/* A58E */,/*15633*/"VAI SYLLABLE KOO"/* A58F */,/*15634*/"VAI SYLLABLE NGGOO"/* A590 */, /*15635*/"VAI SYLLABLE GOO"/* A591 */,/*15636*/"VAI SYLLABLE MOO"/* A592 */,/*15637*/"VAI SYLLABLE NOO"/* A593 */, /*15638*/"VAI SYLLABLE NYOO"/* A594 */,/*15639*/"VAI SYLLABLE U"/* A595 */,/*15640*/"VAI SYLLABLE UN"/* A596 */, /*15641*/"VAI SYLLABLE HU"/* A597 */,/*15642*/"VAI SYLLABLE HUN"/* A598 */,/*15643*/"VAI SYLLABLE WU"/* A599 */, /*15644*/"VAI SYLLABLE WUN"/* A59A */,/*15645*/"VAI SYLLABLE PU"/* A59B */,/*15646*/"VAI SYLLABLE BHU"/* A59C */, /*15647*/"VAI SYLLABLE BU"/* A59D */,/*15648*/"VAI SYLLABLE MBU"/* A59E */,/*15649*/"VAI SYLLABLE KPU"/* A59F */, /*15650*/"VAI SYLLABLE MGBU"/* A5A0 */,/*15651*/"VAI SYLLABLE GBU"/* A5A1 */,/*15652*/"VAI SYLLABLE FU"/* A5A2 */, /*15653*/"VAI SYLLABLE VU"/* A5A3 */,/*15654*/"VAI SYLLABLE TU"/* A5A4 */,/*15655*/"VAI SYLLABLE THU"/* A5A5 */, /*15656*/"VAI SYLLABLE DHU"/* A5A6 */,/*15657*/"VAI SYLLABLE DHHU"/* A5A7 */,/*15658*/"VAI SYLLABLE LU"/* A5A8 */, /*15659*/"VAI SYLLABLE RU"/* A5A9 */,/*15660*/"VAI SYLLABLE DU"/* A5AA */,/*15661*/"VAI SYLLABLE NDU"/* A5AB */, /*15662*/"VAI SYLLABLE SU"/* A5AC */,/*15663*/"VAI SYLLABLE SHU"/* A5AD */,/*15664*/"VAI SYLLABLE ZU"/* A5AE */, /*15665*/"VAI SYLLABLE ZHU"/* A5AF */,/*15666*/"VAI SYLLABLE CU"/* A5B0 */,/*15667*/"VAI SYLLABLE JU"/* A5B1 */, /*15668*/"VAI SYLLABLE NJU"/* A5B2 */,/*15669*/"VAI SYLLABLE YU"/* A5B3 */,/*15670*/"VAI SYLLABLE KU"/* A5B4 */, /*15671*/"VAI SYLLABLE NGGU"/* A5B5 */,/*15672*/"VAI SYLLABLE GU"/* A5B6 */,/*15673*/"VAI SYLLABLE MU"/* A5B7 */, /*15674*/"VAI SYLLABLE NU"/* A5B8 */,/*15675*/"VAI SYLLABLE NYU"/* A5B9 */,/*15676*/"VAI SYLLABLE O"/* A5BA */, /*15677*/"VAI SYLLABLE ON"/* A5BB */,/*15678*/"VAI SYLLABLE NGON"/* A5BC */,/*15679*/"VAI SYLLABLE HO"/* A5BD */, /*15680*/"VAI SYLLABLE HON"/* A5BE */,/*15681*/"VAI SYLLABLE WO"/* A5BF */,/*15682*/"VAI SYLLABLE WON"/* A5C0 */, /*15683*/"VAI SYLLABLE PO"/* A5C1 */,/*15684*/"VAI SYLLABLE BHO"/* A5C2 */,/*15685*/"VAI SYLLABLE BO"/* A5C3 */, /*15686*/"VAI SYLLABLE MBO"/* A5C4 */,/*15687*/"VAI SYLLABLE KPO"/* A5C5 */,/*15688*/"VAI SYLLABLE MGBO"/* A5C6 */, /*15689*/"VAI SYLLABLE GBO"/* A5C7 */,/*15690*/"VAI SYLLABLE GBON"/* A5C8 */,/*15691*/"VAI SYLLABLE FO"/* A5C9 */, /*15692*/"VAI SYLLABLE VO"/* A5CA */,/*15693*/"VAI SYLLABLE TO"/* A5CB */,/*15694*/"VAI SYLLABLE THO"/* A5CC */, /*15695*/"VAI SYLLABLE DHO"/* A5CD */,/*15696*/"VAI SYLLABLE DHHO"/* A5CE */,/*15697*/"VAI SYLLABLE LO"/* A5CF */, /*15698*/"VAI SYLLABLE RO"/* A5D0 */,/*15699*/"VAI SYLLABLE DO"/* A5D1 */,/*15700*/"VAI SYLLABLE NDO"/* A5D2 */, /*15701*/"VAI SYLLABLE SO"/* A5D3 */,/*15702*/"VAI SYLLABLE SHO"/* A5D4 */,/*15703*/"VAI SYLLABLE ZO"/* A5D5 */, /*15704*/"VAI SYLLABLE ZHO"/* A5D6 */,/*15705*/"VAI SYLLABLE CO"/* A5D7 */,/*15706*/"VAI SYLLABLE JO"/* A5D8 */, /*15707*/"VAI SYLLABLE NJO"/* A5D9 */,/*15708*/"VAI SYLLABLE YO"/* A5DA */,/*15709*/"VAI SYLLABLE KO"/* A5DB */, /*15710*/"VAI SYLLABLE NGGO"/* A5DC */,/*15711*/"VAI SYLLABLE GO"/* A5DD */,/*15712*/"VAI SYLLABLE MO"/* A5DE */, /*15713*/"VAI SYLLABLE NO"/* A5DF */,/*15714*/"VAI SYLLABLE NYO"/* A5E0 */,/*15715*/"VAI SYLLABLE E"/* A5E1 */, /*15716*/"VAI SYLLABLE EN"/* A5E2 */,/*15717*/"VAI SYLLABLE NGEN"/* A5E3 */,/*15718*/"VAI SYLLABLE HE"/* A5E4 */, /*15719*/"VAI SYLLABLE HEN"/* A5E5 */,/*15720*/"VAI SYLLABLE WE"/* A5E6 */,/*15721*/"VAI SYLLABLE WEN"/* A5E7 */, /*15722*/"VAI SYLLABLE PE"/* A5E8 */,/*15723*/"VAI SYLLABLE BHE"/* A5E9 */,/*15724*/"VAI SYLLABLE BE"/* A5EA */, /*15725*/"VAI SYLLABLE MBE"/* A5EB */,/*15726*/"VAI SYLLABLE KPE"/* A5EC */,/*15727*/"VAI SYLLABLE KPEN"/* A5ED */, /*15728*/"VAI SYLLABLE MGBE"/* A5EE */,/*15729*/"VAI SYLLABLE GBE"/* A5EF */,/*15730*/"VAI SYLLABLE GBEN"/* A5F0 */, /*15731*/"VAI SYLLABLE FE"/* A5F1 */,/*15732*/"VAI SYLLABLE VE"/* A5F2 */,/*15733*/"VAI SYLLABLE TE"/* A5F3 */, /*15734*/"VAI SYLLABLE THE"/* A5F4 */,/*15735*/"VAI SYLLABLE DHE"/* A5F5 */,/*15736*/"VAI SYLLABLE DHHE"/* A5F6 */, /*15737*/"VAI SYLLABLE LE"/* A5F7 */,/*15738*/"VAI SYLLABLE RE"/* A5F8 */,/*15739*/"VAI SYLLABLE DE"/* A5F9 */, /*15740*/"VAI SYLLABLE NDE"/* A5FA */,/*15741*/"VAI SYLLABLE SE"/* A5FB */,/*15742*/"VAI SYLLABLE SHE"/* A5FC */, /*15743*/"VAI SYLLABLE ZE"/* A5FD */,/*15744*/"VAI SYLLABLE ZHE"/* A5FE */,/*15745*/"VAI SYLLABLE CE"/* A5FF */, /*15746*/"VAI SYLLABLE JE"/* A600 */,/*15747*/"VAI SYLLABLE NJE"/* A601 */,/*15748*/"VAI SYLLABLE YE"/* A602 */, /*15749*/"VAI SYLLABLE KE"/* A603 */,/*15750*/"VAI SYLLABLE NGGE"/* A604 */,/*15751*/"VAI SYLLABLE NGGEN"/* A605 */, /*15752*/"VAI SYLLABLE GE"/* A606 */,/*15753*/"VAI SYLLABLE GEN"/* A607 */,/*15754*/"VAI SYLLABLE ME"/* A608 */, /*15755*/"VAI SYLLABLE NE"/* A609 */,/*15756*/"VAI SYLLABLE NYE"/* A60A */,/*15757*/"VAI SYLLABLE NG"/* A60B */, /*15758*/"VAI SYLLABLE LENGTHENER"/* A60C */,/*15759*/"VAI COMMA"/* A60D */,/*15760*/"VAI FULL STOP"/* A60E */, /*15761*/"VAI QUESTION MARK"/* A60F */,/*15762*/"VAI SYLLABLE NDOLE FA"/* A610 */, /*15763*/"VAI SYLLABLE NDOLE KA"/* A611 */,/*15764*/"VAI SYLLABLE NDOLE SOO"/* A612 */, /*15765*/"VAI SYMBOL FEENG"/* A613 */,/*15766*/"VAI SYMBOL KEENG"/* A614 */,/*15767*/"VAI SYMBOL TING"/* A615 */, /*15768*/"VAI SYMBOL NII"/* A616 */,/*15769*/"VAI SYMBOL BANG"/* A617 */,/*15770*/"VAI SYMBOL FAA"/* A618 */, /*15771*/"VAI SYMBOL TAA"/* A619 */,/*15772*/"VAI SYMBOL DANG"/* A61A */,/*15773*/"VAI SYMBOL DOONG"/* A61B */, /*15774*/"VAI SYMBOL KUNG"/* A61C */,/*15775*/"VAI SYMBOL TONG"/* A61D */,/*15776*/"VAI SYMBOL DO-O"/* A61E */, /*15777*/"VAI SYMBOL JONG"/* A61F */,/*15778*/"VAI DIGIT ZERO"/* A620 */,/*15779*/"VAI DIGIT ONE"/* A621 */, /*15780*/"VAI DIGIT TWO"/* A622 */,/*15781*/"VAI DIGIT THREE"/* A623 */,/*15782*/"VAI DIGIT FOUR"/* A624 */, /*15783*/"VAI DIGIT FIVE"/* A625 */,/*15784*/"VAI DIGIT SIX"/* A626 */,/*15785*/"VAI DIGIT SEVEN"/* A627 */, /*15786*/"VAI DIGIT EIGHT"/* A628 */,/*15787*/"VAI DIGIT NINE"/* A629 */,/*15788*/"VAI SYLLABLE NDOLE MA"/* A62A */, /*15789*/"VAI SYLLABLE NDOLE DO"/* A62B */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,/*15810*/"CYRILLIC CAPITAL LETTER ZEMLYA"/* A640 */, /*15811*/"CYRILLIC SMALL LETTER ZEMLYA"/* A641 */,/*15812*/"CYRILLIC CAPITAL LETTER DZELO"/* A642 */, /*15813*/"CYRILLIC SMALL LETTER DZELO"/* A643 */,/*15814*/"CYRILLIC CAPITAL LETTER REVERSED DZE"/* A644 */, /*15815*/"CYRILLIC SMALL LETTER REVERSED DZE"/* A645 */,/*15816*/"CYRILLIC CAPITAL LETTER IOTA"/* A646 */, /*15817*/"CYRILLIC SMALL LETTER IOTA"/* A647 */,/*15818*/"CYRILLIC CAPITAL LETTER DJERV"/* A648 */, /*15819*/"CYRILLIC SMALL LETTER DJERV"/* A649 */,/*15820*/"CYRILLIC CAPITAL LETTER MONOGRAPH UK"/* A64A */, /*15821*/"CYRILLIC SMALL LETTER MONOGRAPH UK"/* A64B */,/*15822*/"CYRILLIC CAPITAL LETTER BROAD OMEGA"/* A64C */, /*15823*/"CYRILLIC SMALL LETTER BROAD OMEGA"/* A64D */,/*15824*/"CYRILLIC CAPITAL LETTER NEUTRAL YER"/* A64E */, /*15825*/"CYRILLIC SMALL LETTER NEUTRAL YER"/* A64F */,/*15826*/"CYRILLIC CAPITAL LETTER YERU WITH BACK YER"/* A650 */, /*15827*/"CYRILLIC SMALL LETTER YERU WITH BACK YER"/* A651 */,/*15828*/"CYRILLIC CAPITAL LETTER IOTIFIED YAT"/* A652 */, /*15829*/"CYRILLIC SMALL LETTER IOTIFIED YAT"/* A653 */,/*15830*/"CYRILLIC CAPITAL LETTER REVERSED YU"/* A654 */, /*15831*/"CYRILLIC SMALL LETTER REVERSED YU"/* A655 */,/*15832*/"CYRILLIC CAPITAL LETTER IOTIFIED A"/* A656 */, /*15833*/"CYRILLIC SMALL LETTER IOTIFIED A"/* A657 */,/*15834*/"CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS"/* A658 */, /*15835*/"CYRILLIC SMALL LETTER CLOSED LITTLE YUS"/* A659 */,/*15836*/"CYRILLIC CAPITAL LETTER BLENDED YUS"/* A65A */, /*15837*/"CYRILLIC SMALL LETTER BLENDED YUS"/* A65B */, /*15838*/"CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS"/* A65C */, /*15839*/"CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS"/* A65D */,/*15840*/"CYRILLIC CAPITAL LETTER YN"/* A65E */, /*15841*/"CYRILLIC SMALL LETTER YN"/* A65F */,/*15842*/"CYRILLIC CAPITAL LETTER REVERSED TSE"/* A660 */, /*15843*/"CYRILLIC SMALL LETTER REVERSED TSE"/* A661 */,/*15844*/"CYRILLIC CAPITAL LETTER SOFT DE"/* A662 */, /*15845*/"CYRILLIC SMALL LETTER SOFT DE"/* A663 */,/*15846*/"CYRILLIC CAPITAL LETTER SOFT EL"/* A664 */, /*15847*/"CYRILLIC SMALL LETTER SOFT EL"/* A665 */,/*15848*/"CYRILLIC CAPITAL LETTER SOFT EM"/* A666 */, /*15849*/"CYRILLIC SMALL LETTER SOFT EM"/* A667 */,/*15850*/"CYRILLIC CAPITAL LETTER MONOCULAR O"/* A668 */, /*15851*/"CYRILLIC SMALL LETTER MONOCULAR O"/* A669 */,/*15852*/"CYRILLIC CAPITAL LETTER BINOCULAR O"/* A66A */, /*15853*/"CYRILLIC SMALL LETTER BINOCULAR O"/* A66B */,/*15854*/"CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O"/* A66C */, /*15855*/"CYRILLIC SMALL LETTER DOUBLE MONOCULAR O"/* A66D */,/*15856*/"CYRILLIC LETTER MULTIOCULAR O"/* A66E */, /*15857*/"COMBINING CYRILLIC VZMET"/* A66F */,/*15858*/"COMBINING CYRILLIC TEN MILLIONS SIGN"/* A670 */, /*15859*/"COMBINING CYRILLIC HUNDRED MILLIONS SIGN"/* A671 */, /*15860*/"COMBINING CYRILLIC THOUSAND MILLIONS SIGN"/* A672 */,/*15861*/"SLAVONIC ASTERISK"/* A673 */, /*15862*/"COMBINING CYRILLIC LETTER UKRAINIAN IE"/* A674 */,/*15863*/"COMBINING CYRILLIC LETTER I"/* A675 */, /*15864*/"COMBINING CYRILLIC LETTER YI"/* A676 */,/*15865*/"COMBINING CYRILLIC LETTER U"/* A677 */, /*15866*/"COMBINING CYRILLIC LETTER HARD SIGN"/* A678 */,/*15867*/"COMBINING CYRILLIC LETTER YERU"/* A679 */, /*15868*/"COMBINING CYRILLIC LETTER SOFT SIGN"/* A67A */,/*15869*/"COMBINING CYRILLIC LETTER OMEGA"/* A67B */, /*15870*/"COMBINING CYRILLIC KAVYKA"/* A67C */,/*15871*/"COMBINING CYRILLIC PAYEROK"/* A67D */, /*15872*/"CYRILLIC KAVYKA"/* A67E */,/*15873*/"CYRILLIC PAYEROK"/* A67F */, /*15874*/"CYRILLIC CAPITAL LETTER DWE"/* A680 */,/*15875*/"CYRILLIC SMALL LETTER DWE"/* A681 */, /*15876*/"CYRILLIC CAPITAL LETTER DZWE"/* A682 */,/*15877*/"CYRILLIC SMALL LETTER DZWE"/* A683 */, /*15878*/"CYRILLIC CAPITAL LETTER ZHWE"/* A684 */,/*15879*/"CYRILLIC SMALL LETTER ZHWE"/* A685 */, /*15880*/"CYRILLIC CAPITAL LETTER CCHE"/* A686 */,/*15881*/"CYRILLIC SMALL LETTER CCHE"/* A687 */, /*15882*/"CYRILLIC CAPITAL LETTER DZZE"/* A688 */,/*15883*/"CYRILLIC SMALL LETTER DZZE"/* A689 */, /*15884*/"CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK"/* A68A */, /*15885*/"CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK"/* A68B */,/*15886*/"CYRILLIC CAPITAL LETTER TWE"/* A68C */, /*15887*/"CYRILLIC SMALL LETTER TWE"/* A68D */,/*15888*/"CYRILLIC CAPITAL LETTER TSWE"/* A68E */, /*15889*/"CYRILLIC SMALL LETTER TSWE"/* A68F */,/*15890*/"CYRILLIC CAPITAL LETTER TSSE"/* A690 */, /*15891*/"CYRILLIC SMALL LETTER TSSE"/* A691 */,/*15892*/"CYRILLIC CAPITAL LETTER TCHE"/* A692 */, /*15893*/"CYRILLIC SMALL LETTER TCHE"/* A693 */,/*15894*/"CYRILLIC CAPITAL LETTER HWE"/* A694 */, /*15895*/"CYRILLIC SMALL LETTER HWE"/* A695 */,/*15896*/"CYRILLIC CAPITAL LETTER SHWE"/* A696 */, /*15897*/"CYRILLIC SMALL LETTER SHWE"/* A697 */,/*15898*/"CYRILLIC CAPITAL LETTER DOUBLE O"/* A698 */, /*15899*/"CYRILLIC SMALL LETTER DOUBLE O"/* A699 */,/*15900*/"CYRILLIC CAPITAL LETTER CROSSED O"/* A69A */, /*15901*/"CYRILLIC SMALL LETTER CROSSED O"/* A69B */,/*15902*/"MODIFIER LETTER CYRILLIC HARD SIGN"/* A69C */, /*15903*/"MODIFIER LETTER CYRILLIC SOFT SIGN"/* A69D */,/*15904*/"COMBINING CYRILLIC LETTER EF"/* A69E */, /*15905*/"COMBINING CYRILLIC LETTER IOTIFIED E"/* A69F */,/*15906*/"BAMUM LETTER A"/* A6A0 */, /*15907*/"BAMUM LETTER KA"/* A6A1 */,/*15908*/"BAMUM LETTER U"/* A6A2 */,/*15909*/"BAMUM LETTER KU"/* A6A3 */, /*15910*/"BAMUM LETTER EE"/* A6A4 */,/*15911*/"BAMUM LETTER REE"/* A6A5 */,/*15912*/"BAMUM LETTER TAE"/* A6A6 */, /*15913*/"BAMUM LETTER O"/* A6A7 */,/*15914*/"BAMUM LETTER NYI"/* A6A8 */,/*15915*/"BAMUM LETTER I"/* A6A9 */, /*15916*/"BAMUM LETTER LA"/* A6AA */,/*15917*/"BAMUM LETTER PA"/* A6AB */,/*15918*/"BAMUM LETTER RII"/* A6AC */, /*15919*/"BAMUM LETTER RIEE"/* A6AD */,/*15920*/"BAMUM LETTER LEEEE"/* A6AE */,/*15921*/"BAMUM LETTER MEEEE"/* A6AF */, /*15922*/"BAMUM LETTER TAA"/* A6B0 */,/*15923*/"BAMUM LETTER NDAA"/* A6B1 */,/*15924*/"BAMUM LETTER NJAEM"/* A6B2 */, /*15925*/"BAMUM LETTER M"/* A6B3 */,/*15926*/"BAMUM LETTER SUU"/* A6B4 */,/*15927*/"BAMUM LETTER MU"/* A6B5 */, /*15928*/"BAMUM LETTER SHII"/* A6B6 */,/*15929*/"BAMUM LETTER SI"/* A6B7 */,/*15930*/"BAMUM LETTER SHEUX"/* A6B8 */, /*15931*/"BAMUM LETTER SEUX"/* A6B9 */,/*15932*/"BAMUM LETTER KYEE"/* A6BA */,/*15933*/"BAMUM LETTER KET"/* A6BB */, /*15934*/"BAMUM LETTER NUAE"/* A6BC */,/*15935*/"BAMUM LETTER NU"/* A6BD */,/*15936*/"BAMUM LETTER NJUAE"/* A6BE */, /*15937*/"BAMUM LETTER YOQ"/* A6BF */,/*15938*/"BAMUM LETTER SHU"/* A6C0 */,/*15939*/"BAMUM LETTER YUQ"/* A6C1 */, /*15940*/"BAMUM LETTER YA"/* A6C2 */,/*15941*/"BAMUM LETTER NSHA"/* A6C3 */,/*15942*/"BAMUM LETTER KEUX"/* A6C4 */, /*15943*/"BAMUM LETTER PEUX"/* A6C5 */,/*15944*/"BAMUM LETTER NJEE"/* A6C6 */,/*15945*/"BAMUM LETTER NTEE"/* A6C7 */, /*15946*/"BAMUM LETTER PUE"/* A6C8 */,/*15947*/"BAMUM LETTER WUE"/* A6C9 */,/*15948*/"BAMUM LETTER PEE"/* A6CA */, /*15949*/"BAMUM LETTER FEE"/* A6CB */,/*15950*/"BAMUM LETTER RU"/* A6CC */,/*15951*/"BAMUM LETTER LU"/* A6CD */, /*15952*/"BAMUM LETTER MI"/* A6CE */,/*15953*/"BAMUM LETTER NI"/* A6CF */,/*15954*/"BAMUM LETTER REUX"/* A6D0 */, /*15955*/"BAMUM LETTER RAE"/* A6D1 */,/*15956*/"BAMUM LETTER KEN"/* A6D2 */,/*15957*/"BAMUM LETTER NGKWAEN"/* A6D3 */, /*15958*/"BAMUM LETTER NGGA"/* A6D4 */,/*15959*/"BAMUM LETTER NGA"/* A6D5 */,/*15960*/"BAMUM LETTER SHO"/* A6D6 */, /*15961*/"BAMUM LETTER PUAE"/* A6D7 */,/*15962*/"BAMUM LETTER FU"/* A6D8 */,/*15963*/"BAMUM LETTER FOM"/* A6D9 */, /*15964*/"BAMUM LETTER WA"/* A6DA */,/*15965*/"BAMUM LETTER NA"/* A6DB */,/*15966*/"BAMUM LETTER LI"/* A6DC */, /*15967*/"BAMUM LETTER PI"/* A6DD */,/*15968*/"BAMUM LETTER LOQ"/* A6DE */,/*15969*/"BAMUM LETTER KO"/* A6DF */, /*15970*/"BAMUM LETTER MBEN"/* A6E0 */,/*15971*/"BAMUM LETTER REN"/* A6E1 */,/*15972*/"BAMUM LETTER MEN"/* A6E2 */, /*15973*/"BAMUM LETTER MA"/* A6E3 */,/*15974*/"BAMUM LETTER TI"/* A6E4 */,/*15975*/"BAMUM LETTER KI"/* A6E5 */, /*15976*/"BAMUM LETTER MO"/* A6E6 */,/*15977*/"BAMUM LETTER MBAA"/* A6E7 */,/*15978*/"BAMUM LETTER TET"/* A6E8 */, /*15979*/"BAMUM LETTER KPA"/* A6E9 */,/*15980*/"BAMUM LETTER TEN"/* A6EA */,/*15981*/"BAMUM LETTER NTUU"/* A6EB */, /*15982*/"BAMUM LETTER SAMBA"/* A6EC */,/*15983*/"BAMUM LETTER FAAMAE"/* A6ED */,/*15984*/"BAMUM LETTER KOVUU"/* A6EE */, /*15985*/"BAMUM LETTER KOGHOM"/* A6EF */,/*15986*/"BAMUM COMBINING MARK KOQNDON"/* A6F0 */, /*15987*/"BAMUM COMBINING MARK TUKWENTIS"/* A6F1 */,/*15988*/"BAMUM NJAEMLI"/* A6F2 */, /*15989*/"BAMUM FULL STOP"/* A6F3 */,/*15990*/"BAMUM COLON"/* A6F4 */,/*15991*/"BAMUM COMMA"/* A6F5 */, /*15992*/"BAMUM SEMICOLON"/* A6F6 */,/*15993*/"BAMUM QUESTION MARK"/* A6F7 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*16002*/"MODIFIER LETTER CHINESE TONE YIN PING"/* A700 */,/*16003*/"MODIFIER LETTER CHINESE TONE YANG PING"/* A701 */, /*16004*/"MODIFIER LETTER CHINESE TONE YIN SHANG"/* A702 */,/*16005*/"MODIFIER LETTER CHINESE TONE YANG SHANG"/* A703 */, /*16006*/"MODIFIER LETTER CHINESE TONE YIN QU"/* A704 */,/*16007*/"MODIFIER LETTER CHINESE TONE YANG QU"/* A705 */, /*16008*/"MODIFIER LETTER CHINESE TONE YIN RU"/* A706 */,/*16009*/"MODIFIER LETTER CHINESE TONE YANG RU"/* A707 */, /*16010*/"MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR"/* A708 */, /*16011*/"MODIFIER LETTER HIGH DOTTED TONE BAR"/* A709 */,/*16012*/"MODIFIER LETTER MID DOTTED TONE BAR"/* A70A */, /*16013*/"MODIFIER LETTER LOW DOTTED TONE BAR"/* A70B */,/*16014*/"MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR"/* A70C */, /*16015*/"MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR"/* A70D */, /*16016*/"MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR"/* A70E */, /*16017*/"MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR"/* A70F */, /*16018*/"MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR"/* A710 */, /*16019*/"MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR"/* A711 */, /*16020*/"MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR"/* A712 */, /*16021*/"MODIFIER LETTER HIGH LEFT-STEM TONE BAR"/* A713 */,/*16022*/"MODIFIER LETTER MID LEFT-STEM TONE BAR"/* A714 */, /*16023*/"MODIFIER LETTER LOW LEFT-STEM TONE BAR"/* A715 */, /*16024*/"MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR"/* A716 */,/*16025*/"MODIFIER LETTER DOT VERTICAL BAR"/* A717 */, /*16026*/"MODIFIER LETTER DOT SLASH"/* A718 */,/*16027*/"MODIFIER LETTER DOT HORIZONTAL BAR"/* A719 */, /*16028*/"MODIFIER LETTER LOWER RIGHT CORNER ANGLE"/* A71A */,/*16029*/"MODIFIER LETTER RAISED UP ARROW"/* A71B */, /*16030*/"MODIFIER LETTER RAISED DOWN ARROW"/* A71C */,/*16031*/"MODIFIER LETTER RAISED EXCLAMATION MARK"/* A71D */, /*16032*/"MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK"/* A71E */, /*16033*/"MODIFIER LETTER LOW INVERTED EXCLAMATION MARK"/* A71F */, /*16034*/"MODIFIER LETTER STRESS AND HIGH TONE"/* A720 */,/*16035*/"MODIFIER LETTER STRESS AND LOW TONE"/* A721 */, /*16036*/"LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF"/* A722 */,/*16037*/"LATIN SMALL LETTER EGYPTOLOGICAL ALEF"/* A723 */, /*16038*/"LATIN CAPITAL LETTER EGYPTOLOGICAL AIN"/* A724 */,/*16039*/"LATIN SMALL LETTER EGYPTOLOGICAL AIN"/* A725 */, /*16040*/"LATIN CAPITAL LETTER HENG"/* A726 */,/*16041*/"LATIN SMALL LETTER HENG"/* A727 */, /*16042*/"LATIN CAPITAL LETTER TZ"/* A728 */,/*16043*/"LATIN SMALL LETTER TZ"/* A729 */, /*16044*/"LATIN CAPITAL LETTER TRESILLO"/* A72A */,/*16045*/"LATIN SMALL LETTER TRESILLO"/* A72B */, /*16046*/"LATIN CAPITAL LETTER CUATRILLO"/* A72C */,/*16047*/"LATIN SMALL LETTER CUATRILLO"/* A72D */, /*16048*/"LATIN CAPITAL LETTER CUATRILLO WITH COMMA"/* A72E */, /*16049*/"LATIN SMALL LETTER CUATRILLO WITH COMMA"/* A72F */,/*16050*/"LATIN LETTER SMALL CAPITAL F"/* A730 */, /*16051*/"LATIN LETTER SMALL CAPITAL S"/* A731 */,/*16052*/"LATIN CAPITAL LETTER AA"/* A732 */, /*16053*/"LATIN SMALL LETTER AA"/* A733 */,/*16054*/"LATIN CAPITAL LETTER AO"/* A734 */, /*16055*/"LATIN SMALL LETTER AO"/* A735 */,/*16056*/"LATIN CAPITAL LETTER AU"/* A736 */, /*16057*/"LATIN SMALL LETTER AU"/* A737 */,/*16058*/"LATIN CAPITAL LETTER AV"/* A738 */, /*16059*/"LATIN SMALL LETTER AV"/* A739 */,/*16060*/"LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR"/* A73A */, /*16061*/"LATIN SMALL LETTER AV WITH HORIZONTAL BAR"/* A73B */,/*16062*/"LATIN CAPITAL LETTER AY"/* A73C */, /*16063*/"LATIN SMALL LETTER AY"/* A73D */,/*16064*/"LATIN CAPITAL LETTER REVERSED C WITH DOT"/* A73E */, /*16065*/"LATIN SMALL LETTER REVERSED C WITH DOT"/* A73F */,/*16066*/"LATIN CAPITAL LETTER K WITH STROKE"/* A740 */, /*16067*/"LATIN SMALL LETTER K WITH STROKE"/* A741 */,/*16068*/"LATIN CAPITAL LETTER K WITH DIAGONAL STROKE"/* A742 */, /*16069*/"LATIN SMALL LETTER K WITH DIAGONAL STROKE"/* A743 */, /*16070*/"LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE"/* A744 */, /*16071*/"LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE"/* A745 */, /*16072*/"LATIN CAPITAL LETTER BROKEN L"/* A746 */,/*16073*/"LATIN SMALL LETTER BROKEN L"/* A747 */, /*16074*/"LATIN CAPITAL LETTER L WITH HIGH STROKE"/* A748 */,/*16075*/"LATIN SMALL LETTER L WITH HIGH STROKE"/* A749 */, /*16076*/"LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY"/* A74A */, /*16077*/"LATIN SMALL LETTER O WITH LONG STROKE OVERLAY"/* A74B */,/*16078*/"LATIN CAPITAL LETTER O WITH LOOP"/* A74C */, /*16079*/"LATIN SMALL LETTER O WITH LOOP"/* A74D */,/*16080*/"LATIN CAPITAL LETTER OO"/* A74E */, /*16081*/"LATIN SMALL LETTER OO"/* A74F */,/*16082*/"LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER"/* A750 */, /*16083*/"LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER"/* A751 */, /*16084*/"LATIN CAPITAL LETTER P WITH FLOURISH"/* A752 */,/*16085*/"LATIN SMALL LETTER P WITH FLOURISH"/* A753 */, /*16086*/"LATIN CAPITAL LETTER P WITH SQUIRREL TAIL"/* A754 */, /*16087*/"LATIN SMALL LETTER P WITH SQUIRREL TAIL"/* A755 */, /*16088*/"LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER"/* A756 */, /*16089*/"LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER"/* A757 */, /*16090*/"LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE"/* A758 */, /*16091*/"LATIN SMALL LETTER Q WITH DIAGONAL STROKE"/* A759 */,/*16092*/"LATIN CAPITAL LETTER R ROTUNDA"/* A75A */, /*16093*/"LATIN SMALL LETTER R ROTUNDA"/* A75B */,/*16094*/"LATIN CAPITAL LETTER RUM ROTUNDA"/* A75C */, /*16095*/"LATIN SMALL LETTER RUM ROTUNDA"/* A75D */,/*16096*/"LATIN CAPITAL LETTER V WITH DIAGONAL STROKE"/* A75E */, /*16097*/"LATIN SMALL LETTER V WITH DIAGONAL STROKE"/* A75F */,/*16098*/"LATIN CAPITAL LETTER VY"/* A760 */, /*16099*/"LATIN SMALL LETTER VY"/* A761 */,/*16100*/"LATIN CAPITAL LETTER VISIGOTHIC Z"/* A762 */, /*16101*/"LATIN SMALL LETTER VISIGOTHIC Z"/* A763 */,/*16102*/"LATIN CAPITAL LETTER THORN WITH STROKE"/* A764 */, /*16103*/"LATIN SMALL LETTER THORN WITH STROKE"/* A765 */, /*16104*/"LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER"/* A766 */, /*16105*/"LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER"/* A767 */, /*16106*/"LATIN CAPITAL LETTER VEND"/* A768 */,/*16107*/"LATIN SMALL LETTER VEND"/* A769 */, /*16108*/"LATIN CAPITAL LETTER ET"/* A76A */,/*16109*/"LATIN SMALL LETTER ET"/* A76B */, /*16110*/"LATIN CAPITAL LETTER IS"/* A76C */,/*16111*/"LATIN SMALL LETTER IS"/* A76D */, /*16112*/"LATIN CAPITAL LETTER CON"/* A76E */,/*16113*/"LATIN SMALL LETTER CON"/* A76F */, /*16114*/"MODIFIER LETTER US"/* A770 */,/*16115*/"LATIN SMALL LETTER DUM"/* A771 */, /*16116*/"LATIN SMALL LETTER LUM"/* A772 */,/*16117*/"LATIN SMALL LETTER MUM"/* A773 */, /*16118*/"LATIN SMALL LETTER NUM"/* A774 */,/*16119*/"LATIN SMALL LETTER RUM"/* A775 */, /*16120*/"LATIN LETTER SMALL CAPITAL RUM"/* A776 */,/*16121*/"LATIN SMALL LETTER TUM"/* A777 */, /*16122*/"LATIN SMALL LETTER UM"/* A778 */,/*16123*/"LATIN CAPITAL LETTER INSULAR D"/* A779 */, /*16124*/"LATIN SMALL LETTER INSULAR D"/* A77A */,/*16125*/"LATIN CAPITAL LETTER INSULAR F"/* A77B */, /*16126*/"LATIN SMALL LETTER INSULAR F"/* A77C */,/*16127*/"LATIN CAPITAL LETTER INSULAR G"/* A77D */, /*16128*/"LATIN CAPITAL LETTER TURNED INSULAR G"/* A77E */,/*16129*/"LATIN SMALL LETTER TURNED INSULAR G"/* A77F */, /*16130*/"LATIN CAPITAL LETTER TURNED L"/* A780 */,/*16131*/"LATIN SMALL LETTER TURNED L"/* A781 */, /*16132*/"LATIN CAPITAL LETTER INSULAR R"/* A782 */,/*16133*/"LATIN SMALL LETTER INSULAR R"/* A783 */, /*16134*/"LATIN CAPITAL LETTER INSULAR S"/* A784 */,/*16135*/"LATIN SMALL LETTER INSULAR S"/* A785 */, /*16136*/"LATIN CAPITAL LETTER INSULAR T"/* A786 */,/*16137*/"LATIN SMALL LETTER INSULAR T"/* A787 */, /*16138*/"MODIFIER LETTER LOW CIRCUMFLEX ACCENT"/* A788 */,/*16139*/"MODIFIER LETTER COLON"/* A789 */, /*16140*/"MODIFIER LETTER SHORT EQUALS SIGN"/* A78A */,/*16141*/"LATIN CAPITAL LETTER SALTILLO"/* A78B */, /*16142*/"LATIN SMALL LETTER SALTILLO"/* A78C */,/*16143*/"LATIN CAPITAL LETTER TURNED H"/* A78D */, /*16144*/"LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT"/* A78E */,/*16145*/"LATIN LETTER SINOLOGICAL DOT"/* A78F */, /*16146*/"LATIN CAPITAL LETTER N WITH DESCENDER"/* A790 */,/*16147*/"LATIN SMALL LETTER N WITH DESCENDER"/* A791 */, /*16148*/"LATIN CAPITAL LETTER C WITH BAR"/* A792 */,/*16149*/"LATIN SMALL LETTER C WITH BAR"/* A793 */, /*16150*/"LATIN SMALL LETTER C WITH PALATAL HOOK"/* A794 */,/*16151*/"LATIN SMALL LETTER H WITH PALATAL HOOK"/* A795 */, /*16152*/"LATIN CAPITAL LETTER B WITH FLOURISH"/* A796 */,/*16153*/"LATIN SMALL LETTER B WITH FLOURISH"/* A797 */, /*16154*/"LATIN CAPITAL LETTER F WITH STROKE"/* A798 */,/*16155*/"LATIN SMALL LETTER F WITH STROKE"/* A799 */, /*16156*/"LATIN CAPITAL LETTER VOLAPUK AE"/* A79A */,/*16157*/"LATIN SMALL LETTER VOLAPUK AE"/* A79B */, /*16158*/"LATIN CAPITAL LETTER VOLAPUK OE"/* A79C */,/*16159*/"LATIN SMALL LETTER VOLAPUK OE"/* A79D */, /*16160*/"LATIN CAPITAL LETTER VOLAPUK UE"/* A79E */,/*16161*/"LATIN SMALL LETTER VOLAPUK UE"/* A79F */, /*16162*/"LATIN CAPITAL LETTER G WITH OBLIQUE STROKE"/* A7A0 */, /*16163*/"LATIN SMALL LETTER G WITH OBLIQUE STROKE"/* A7A1 */, /*16164*/"LATIN CAPITAL LETTER K WITH OBLIQUE STROKE"/* A7A2 */, /*16165*/"LATIN SMALL LETTER K WITH OBLIQUE STROKE"/* A7A3 */, /*16166*/"LATIN CAPITAL LETTER N WITH OBLIQUE STROKE"/* A7A4 */, /*16167*/"LATIN SMALL LETTER N WITH OBLIQUE STROKE"/* A7A5 */, /*16168*/"LATIN CAPITAL LETTER R WITH OBLIQUE STROKE"/* A7A6 */, /*16169*/"LATIN SMALL LETTER R WITH OBLIQUE STROKE"/* A7A7 */, /*16170*/"LATIN CAPITAL LETTER S WITH OBLIQUE STROKE"/* A7A8 */, /*16171*/"LATIN SMALL LETTER S WITH OBLIQUE STROKE"/* A7A9 */,/*16172*/"LATIN CAPITAL LETTER H WITH HOOK"/* A7AA */, /*16173*/"LATIN CAPITAL LETTER REVERSED OPEN E"/* A7AB */,/*16174*/"LATIN CAPITAL LETTER SCRIPT G"/* A7AC */, /*16175*/"LATIN CAPITAL LETTER L WITH BELT"/* A7AD */,/*16176*/"LATIN CAPITAL LETTER SMALL CAPITAL I"/* A7AE */,NULL, /*16178*/"LATIN CAPITAL LETTER TURNED K"/* A7B0 */,/*16179*/"LATIN CAPITAL LETTER TURNED T"/* A7B1 */, /*16180*/"LATIN CAPITAL LETTER J WITH CROSSED-TAIL"/* A7B2 */,/*16181*/"LATIN CAPITAL LETTER CHI"/* A7B3 */, /*16182*/"LATIN CAPITAL LETTER BETA"/* A7B4 */,/*16183*/"LATIN SMALL LETTER BETA"/* A7B5 */, /*16184*/"LATIN CAPITAL LETTER OMEGA"/* A7B6 */,/*16185*/"LATIN SMALL LETTER OMEGA"/* A7B7 */,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*16249*/"LATIN EPIGRAPHIC LETTER SIDEWAYS I"/* A7F7 */, /*16250*/"MODIFIER LETTER CAPITAL H WITH STROKE"/* A7F8 */,/*16251*/"MODIFIER LETTER SMALL LIGATURE OE"/* A7F9 */, /*16252*/"LATIN LETTER SMALL CAPITAL TURNED M"/* A7FA */,/*16253*/"LATIN EPIGRAPHIC LETTER REVERSED F"/* A7FB */, /*16254*/"LATIN EPIGRAPHIC LETTER REVERSED P"/* A7FC */,/*16255*/"LATIN EPIGRAPHIC LETTER INVERTED M"/* A7FD */, /*16256*/"LATIN EPIGRAPHIC LETTER I LONGA"/* A7FE */,/*16257*/"LATIN EPIGRAPHIC LETTER ARCHAIC M"/* A7FF */, /*16258*/"SYLOTI NAGRI LETTER A"/* A800 */,/*16259*/"SYLOTI NAGRI LETTER I"/* A801 */, /*16260*/"SYLOTI NAGRI SIGN DVISVARA"/* A802 */,/*16261*/"SYLOTI NAGRI LETTER U"/* A803 */, /*16262*/"SYLOTI NAGRI LETTER E"/* A804 */,/*16263*/"SYLOTI NAGRI LETTER O"/* A805 */, /*16264*/"SYLOTI NAGRI SIGN HASANTA"/* A806 */,/*16265*/"SYLOTI NAGRI LETTER KO"/* A807 */, /*16266*/"SYLOTI NAGRI LETTER KHO"/* A808 */,/*16267*/"SYLOTI NAGRI LETTER GO"/* A809 */, /*16268*/"SYLOTI NAGRI LETTER GHO"/* A80A */,/*16269*/"SYLOTI NAGRI SIGN ANUSVARA"/* A80B */, /*16270*/"SYLOTI NAGRI LETTER CO"/* A80C */,/*16271*/"SYLOTI NAGRI LETTER CHO"/* A80D */, /*16272*/"SYLOTI NAGRI LETTER JO"/* A80E */,/*16273*/"SYLOTI NAGRI LETTER JHO"/* A80F */, /*16274*/"SYLOTI NAGRI LETTER TTO"/* A810 */,/*16275*/"SYLOTI NAGRI LETTER TTHO"/* A811 */, /*16276*/"SYLOTI NAGRI LETTER DDO"/* A812 */,/*16277*/"SYLOTI NAGRI LETTER DDHO"/* A813 */, /*16278*/"SYLOTI NAGRI LETTER TO"/* A814 */,/*16279*/"SYLOTI NAGRI LETTER THO"/* A815 */, /*16280*/"SYLOTI NAGRI LETTER DO"/* A816 */,/*16281*/"SYLOTI NAGRI LETTER DHO"/* A817 */, /*16282*/"SYLOTI NAGRI LETTER NO"/* A818 */,/*16283*/"SYLOTI NAGRI LETTER PO"/* A819 */, /*16284*/"SYLOTI NAGRI LETTER PHO"/* A81A */,/*16285*/"SYLOTI NAGRI LETTER BO"/* A81B */, /*16286*/"SYLOTI NAGRI LETTER BHO"/* A81C */,/*16287*/"SYLOTI NAGRI LETTER MO"/* A81D */, /*16288*/"SYLOTI NAGRI LETTER RO"/* A81E */,/*16289*/"SYLOTI NAGRI LETTER LO"/* A81F */, /*16290*/"SYLOTI NAGRI LETTER RRO"/* A820 */,/*16291*/"SYLOTI NAGRI LETTER SO"/* A821 */, /*16292*/"SYLOTI NAGRI LETTER HO"/* A822 */,/*16293*/"SYLOTI NAGRI VOWEL SIGN A"/* A823 */, /*16294*/"SYLOTI NAGRI VOWEL SIGN I"/* A824 */,/*16295*/"SYLOTI NAGRI VOWEL SIGN U"/* A825 */, /*16296*/"SYLOTI NAGRI VOWEL SIGN E"/* A826 */,/*16297*/"SYLOTI NAGRI VOWEL SIGN OO"/* A827 */, /*16298*/"SYLOTI NAGRI POETRY MARK-1"/* A828 */,/*16299*/"SYLOTI NAGRI POETRY MARK-2"/* A829 */, /*16300*/"SYLOTI NAGRI POETRY MARK-3"/* A82A */,/*16301*/"SYLOTI NAGRI POETRY MARK-4"/* A82B */,NULL,NULL,NULL,NULL, /*16306*/"NORTH INDIC FRACTION ONE QUARTER"/* A830 */,/*16307*/"NORTH INDIC FRACTION ONE HALF"/* A831 */, /*16308*/"NORTH INDIC FRACTION THREE QUARTERS"/* A832 */,/*16309*/"NORTH INDIC FRACTION ONE SIXTEENTH"/* A833 */, /*16310*/"NORTH INDIC FRACTION ONE EIGHTH"/* A834 */,/*16311*/"NORTH INDIC FRACTION THREE SIXTEENTHS"/* A835 */, /*16312*/"NORTH INDIC QUARTER MARK"/* A836 */,/*16313*/"NORTH INDIC PLACEHOLDER MARK"/* A837 */, /*16314*/"NORTH INDIC RUPEE MARK"/* A838 */,/*16315*/"NORTH INDIC QUANTITY MARK"/* A839 */,NULL,NULL,NULL,NULL,NULL,NULL, /*16322*/"PHAGS-PA LETTER KA"/* A840 */,/*16323*/"PHAGS-PA LETTER KHA"/* A841 */,/*16324*/"PHAGS-PA LETTER GA"/* A842 */, /*16325*/"PHAGS-PA LETTER NGA"/* A843 */,/*16326*/"PHAGS-PA LETTER CA"/* A844 */, /*16327*/"PHAGS-PA LETTER CHA"/* A845 */,/*16328*/"PHAGS-PA LETTER JA"/* A846 */, /*16329*/"PHAGS-PA LETTER NYA"/* A847 */,/*16330*/"PHAGS-PA LETTER TA"/* A848 */, /*16331*/"PHAGS-PA LETTER THA"/* A849 */,/*16332*/"PHAGS-PA LETTER DA"/* A84A */,/*16333*/"PHAGS-PA LETTER NA"/* A84B */, /*16334*/"PHAGS-PA LETTER PA"/* A84C */,/*16335*/"PHAGS-PA LETTER PHA"/* A84D */,/*16336*/"PHAGS-PA LETTER BA"/* A84E */, /*16337*/"PHAGS-PA LETTER MA"/* A84F */,/*16338*/"PHAGS-PA LETTER TSA"/* A850 */, /*16339*/"PHAGS-PA LETTER TSHA"/* A851 */,/*16340*/"PHAGS-PA LETTER DZA"/* A852 */, /*16341*/"PHAGS-PA LETTER WA"/* A853 */,/*16342*/"PHAGS-PA LETTER ZHA"/* A854 */,/*16343*/"PHAGS-PA LETTER ZA"/* A855 */, /*16344*/"PHAGS-PA LETTER SMALL A"/* A856 */,/*16345*/"PHAGS-PA LETTER YA"/* A857 */, /*16346*/"PHAGS-PA LETTER RA"/* A858 */,/*16347*/"PHAGS-PA LETTER LA"/* A859 */,/*16348*/"PHAGS-PA LETTER SHA"/* A85A */, /*16349*/"PHAGS-PA LETTER SA"/* A85B */,/*16350*/"PHAGS-PA LETTER HA"/* A85C */,/*16351*/"PHAGS-PA LETTER A"/* A85D */, /*16352*/"PHAGS-PA LETTER I"/* A85E */,/*16353*/"PHAGS-PA LETTER U"/* A85F */,/*16354*/"PHAGS-PA LETTER E"/* A860 */, /*16355*/"PHAGS-PA LETTER O"/* A861 */,/*16356*/"PHAGS-PA LETTER QA"/* A862 */,/*16357*/"PHAGS-PA LETTER XA"/* A863 */, /*16358*/"PHAGS-PA LETTER FA"/* A864 */,/*16359*/"PHAGS-PA LETTER GGA"/* A865 */,/*16360*/"PHAGS-PA LETTER EE"/* A866 */, /*16361*/"PHAGS-PA SUBJOINED LETTER WA"/* A867 */,/*16362*/"PHAGS-PA SUBJOINED LETTER YA"/* A868 */, /*16363*/"PHAGS-PA LETTER TTA"/* A869 */,/*16364*/"PHAGS-PA LETTER TTHA"/* A86A */, /*16365*/"PHAGS-PA LETTER DDA"/* A86B */,/*16366*/"PHAGS-PA LETTER NNA"/* A86C */, /*16367*/"PHAGS-PA LETTER ALTERNATE YA"/* A86D */,/*16368*/"PHAGS-PA LETTER VOICELESS SHA"/* A86E */, /*16369*/"PHAGS-PA LETTER VOICED HA"/* A86F */,/*16370*/"PHAGS-PA LETTER ASPIRATED FA"/* A870 */, /*16371*/"PHAGS-PA SUBJOINED LETTER RA"/* A871 */,/*16372*/"PHAGS-PA SUPERFIXED LETTER RA"/* A872 */, /*16373*/"PHAGS-PA LETTER CANDRABINDU"/* A873 */,/*16374*/"PHAGS-PA SINGLE HEAD MARK"/* A874 */, /*16375*/"PHAGS-PA DOUBLE HEAD MARK"/* A875 */,/*16376*/"PHAGS-PA MARK SHAD"/* A876 */, /*16377*/"PHAGS-PA MARK DOUBLE SHAD"/* A877 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*16386*/"SAURASHTRA SIGN ANUSVARA"/* A880 */,/*16387*/"SAURASHTRA SIGN VISARGA"/* A881 */, /*16388*/"SAURASHTRA LETTER A"/* A882 */,/*16389*/"SAURASHTRA LETTER AA"/* A883 */, /*16390*/"SAURASHTRA LETTER I"/* A884 */,/*16391*/"SAURASHTRA LETTER II"/* A885 */, /*16392*/"SAURASHTRA LETTER U"/* A886 */,/*16393*/"SAURASHTRA LETTER UU"/* A887 */, /*16394*/"SAURASHTRA LETTER VOCALIC R"/* A888 */,/*16395*/"SAURASHTRA LETTER VOCALIC RR"/* A889 */, /*16396*/"SAURASHTRA LETTER VOCALIC L"/* A88A */,/*16397*/"SAURASHTRA LETTER VOCALIC LL"/* A88B */, /*16398*/"SAURASHTRA LETTER E"/* A88C */,/*16399*/"SAURASHTRA LETTER EE"/* A88D */, /*16400*/"SAURASHTRA LETTER AI"/* A88E */,/*16401*/"SAURASHTRA LETTER O"/* A88F */, /*16402*/"SAURASHTRA LETTER OO"/* A890 */,/*16403*/"SAURASHTRA LETTER AU"/* A891 */, /*16404*/"SAURASHTRA LETTER KA"/* A892 */,/*16405*/"SAURASHTRA LETTER KHA"/* A893 */, /*16406*/"SAURASHTRA LETTER GA"/* A894 */,/*16407*/"SAURASHTRA LETTER GHA"/* A895 */, /*16408*/"SAURASHTRA LETTER NGA"/* A896 */,/*16409*/"SAURASHTRA LETTER CA"/* A897 */, /*16410*/"SAURASHTRA LETTER CHA"/* A898 */,/*16411*/"SAURASHTRA LETTER JA"/* A899 */, /*16412*/"SAURASHTRA LETTER JHA"/* A89A */,/*16413*/"SAURASHTRA LETTER NYA"/* A89B */, /*16414*/"SAURASHTRA LETTER TTA"/* A89C */,/*16415*/"SAURASHTRA LETTER TTHA"/* A89D */, /*16416*/"SAURASHTRA LETTER DDA"/* A89E */,/*16417*/"SAURASHTRA LETTER DDHA"/* A89F */, /*16418*/"SAURASHTRA LETTER NNA"/* A8A0 */,/*16419*/"SAURASHTRA LETTER TA"/* A8A1 */, /*16420*/"SAURASHTRA LETTER THA"/* A8A2 */,/*16421*/"SAURASHTRA LETTER DA"/* A8A3 */, /*16422*/"SAURASHTRA LETTER DHA"/* A8A4 */,/*16423*/"SAURASHTRA LETTER NA"/* A8A5 */, /*16424*/"SAURASHTRA LETTER PA"/* A8A6 */,/*16425*/"SAURASHTRA LETTER PHA"/* A8A7 */, /*16426*/"SAURASHTRA LETTER BA"/* A8A8 */,/*16427*/"SAURASHTRA LETTER BHA"/* A8A9 */, /*16428*/"SAURASHTRA LETTER MA"/* A8AA */,/*16429*/"SAURASHTRA LETTER YA"/* A8AB */, /*16430*/"SAURASHTRA LETTER RA"/* A8AC */,/*16431*/"SAURASHTRA LETTER LA"/* A8AD */, /*16432*/"SAURASHTRA LETTER VA"/* A8AE */,/*16433*/"SAURASHTRA LETTER SHA"/* A8AF */, /*16434*/"SAURASHTRA LETTER SSA"/* A8B0 */,/*16435*/"SAURASHTRA LETTER SA"/* A8B1 */, /*16436*/"SAURASHTRA LETTER HA"/* A8B2 */,/*16437*/"SAURASHTRA LETTER LLA"/* A8B3 */, /*16438*/"SAURASHTRA CONSONANT SIGN HAARU"/* A8B4 */,/*16439*/"SAURASHTRA VOWEL SIGN AA"/* A8B5 */, /*16440*/"SAURASHTRA VOWEL SIGN I"/* A8B6 */,/*16441*/"SAURASHTRA VOWEL SIGN II"/* A8B7 */, /*16442*/"SAURASHTRA VOWEL SIGN U"/* A8B8 */,/*16443*/"SAURASHTRA VOWEL SIGN UU"/* A8B9 */, /*16444*/"SAURASHTRA VOWEL SIGN VOCALIC R"/* A8BA */,/*16445*/"SAURASHTRA VOWEL SIGN VOCALIC RR"/* A8BB */, /*16446*/"SAURASHTRA VOWEL SIGN VOCALIC L"/* A8BC */,/*16447*/"SAURASHTRA VOWEL SIGN VOCALIC LL"/* A8BD */, /*16448*/"SAURASHTRA VOWEL SIGN E"/* A8BE */,/*16449*/"SAURASHTRA VOWEL SIGN EE"/* A8BF */, /*16450*/"SAURASHTRA VOWEL SIGN AI"/* A8C0 */,/*16451*/"SAURASHTRA VOWEL SIGN O"/* A8C1 */, /*16452*/"SAURASHTRA VOWEL SIGN OO"/* A8C2 */,/*16453*/"SAURASHTRA VOWEL SIGN AU"/* A8C3 */, /*16454*/"SAURASHTRA SIGN VIRAMA"/* A8C4 */,/*16455*/"SAURASHTRA SIGN CANDRABINDU"/* A8C5 */,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,/*16464*/"SAURASHTRA DANDA"/* A8CE */,/*16465*/"SAURASHTRA DOUBLE DANDA"/* A8CF */, /*16466*/"SAURASHTRA DIGIT ZERO"/* A8D0 */,/*16467*/"SAURASHTRA DIGIT ONE"/* A8D1 */, /*16468*/"SAURASHTRA DIGIT TWO"/* A8D2 */,/*16469*/"SAURASHTRA DIGIT THREE"/* A8D3 */, /*16470*/"SAURASHTRA DIGIT FOUR"/* A8D4 */,/*16471*/"SAURASHTRA DIGIT FIVE"/* A8D5 */, /*16472*/"SAURASHTRA DIGIT SIX"/* A8D6 */,/*16473*/"SAURASHTRA DIGIT SEVEN"/* A8D7 */, /*16474*/"SAURASHTRA DIGIT EIGHT"/* A8D8 */,/*16475*/"SAURASHTRA DIGIT NINE"/* A8D9 */,NULL,NULL,NULL,NULL,NULL,NULL, /*16482*/"COMBINING DEVANAGARI DIGIT ZERO"/* A8E0 */,/*16483*/"COMBINING DEVANAGARI DIGIT ONE"/* A8E1 */, /*16484*/"COMBINING DEVANAGARI DIGIT TWO"/* A8E2 */,/*16485*/"COMBINING DEVANAGARI DIGIT THREE"/* A8E3 */, /*16486*/"COMBINING DEVANAGARI DIGIT FOUR"/* A8E4 */,/*16487*/"COMBINING DEVANAGARI DIGIT FIVE"/* A8E5 */, /*16488*/"COMBINING DEVANAGARI DIGIT SIX"/* A8E6 */,/*16489*/"COMBINING DEVANAGARI DIGIT SEVEN"/* A8E7 */, /*16490*/"COMBINING DEVANAGARI DIGIT EIGHT"/* A8E8 */,/*16491*/"COMBINING DEVANAGARI DIGIT NINE"/* A8E9 */, /*16492*/"COMBINING DEVANAGARI LETTER A"/* A8EA */,/*16493*/"COMBINING DEVANAGARI LETTER U"/* A8EB */, /*16494*/"COMBINING DEVANAGARI LETTER KA"/* A8EC */,/*16495*/"COMBINING DEVANAGARI LETTER NA"/* A8ED */, /*16496*/"COMBINING DEVANAGARI LETTER PA"/* A8EE */,/*16497*/"COMBINING DEVANAGARI LETTER RA"/* A8EF */, /*16498*/"COMBINING DEVANAGARI LETTER VI"/* A8F0 */,/*16499*/"COMBINING DEVANAGARI SIGN AVAGRAHA"/* A8F1 */, /*16500*/"DEVANAGARI SIGN SPACING CANDRABINDU"/* A8F2 */,/*16501*/"DEVANAGARI SIGN CANDRABINDU VIRAMA"/* A8F3 */, /*16502*/"DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA"/* A8F4 */,/*16503*/"DEVANAGARI SIGN CANDRABINDU TWO"/* A8F5 */, /*16504*/"DEVANAGARI SIGN CANDRABINDU THREE"/* A8F6 */,/*16505*/"DEVANAGARI SIGN CANDRABINDU AVAGRAHA"/* A8F7 */, /*16506*/"DEVANAGARI SIGN PUSHPIKA"/* A8F8 */,/*16507*/"DEVANAGARI GAP FILLER"/* A8F9 */, /*16508*/"DEVANAGARI CARET"/* A8FA */,/*16509*/"DEVANAGARI HEADSTROKE"/* A8FB */, /*16510*/"DEVANAGARI SIGN SIDDHAM"/* A8FC */,/*16511*/"DEVANAGARI JAIN OM"/* A8FD */,NULL,NULL, /*16514*/"KAYAH LI DIGIT ZERO"/* A900 */,/*16515*/"KAYAH LI DIGIT ONE"/* A901 */,/*16516*/"KAYAH LI DIGIT TWO"/* A902 */, /*16517*/"KAYAH LI DIGIT THREE"/* A903 */,/*16518*/"KAYAH LI DIGIT FOUR"/* A904 */, /*16519*/"KAYAH LI DIGIT FIVE"/* A905 */,/*16520*/"KAYAH LI DIGIT SIX"/* A906 */, /*16521*/"KAYAH LI DIGIT SEVEN"/* A907 */,/*16522*/"KAYAH LI DIGIT EIGHT"/* A908 */, /*16523*/"KAYAH LI DIGIT NINE"/* A909 */,/*16524*/"KAYAH LI LETTER KA"/* A90A */, /*16525*/"KAYAH LI LETTER KHA"/* A90B */,/*16526*/"KAYAH LI LETTER GA"/* A90C */, /*16527*/"KAYAH LI LETTER NGA"/* A90D */,/*16528*/"KAYAH LI LETTER SA"/* A90E */, /*16529*/"KAYAH LI LETTER SHA"/* A90F */,/*16530*/"KAYAH LI LETTER ZA"/* A910 */, /*16531*/"KAYAH LI LETTER NYA"/* A911 */,/*16532*/"KAYAH LI LETTER TA"/* A912 */, /*16533*/"KAYAH LI LETTER HTA"/* A913 */,/*16534*/"KAYAH LI LETTER NA"/* A914 */,/*16535*/"KAYAH LI LETTER PA"/* A915 */, /*16536*/"KAYAH LI LETTER PHA"/* A916 */,/*16537*/"KAYAH LI LETTER MA"/* A917 */,/*16538*/"KAYAH LI LETTER DA"/* A918 */, /*16539*/"KAYAH LI LETTER BA"/* A919 */,/*16540*/"KAYAH LI LETTER RA"/* A91A */,/*16541*/"KAYAH LI LETTER YA"/* A91B */, /*16542*/"KAYAH LI LETTER LA"/* A91C */,/*16543*/"KAYAH LI LETTER WA"/* A91D */,/*16544*/"KAYAH LI LETTER THA"/* A91E */, /*16545*/"KAYAH LI LETTER HA"/* A91F */,/*16546*/"KAYAH LI LETTER VA"/* A920 */,/*16547*/"KAYAH LI LETTER CA"/* A921 */, /*16548*/"KAYAH LI LETTER A"/* A922 */,/*16549*/"KAYAH LI LETTER OE"/* A923 */,/*16550*/"KAYAH LI LETTER I"/* A924 */, /*16551*/"KAYAH LI LETTER OO"/* A925 */,/*16552*/"KAYAH LI VOWEL UE"/* A926 */,/*16553*/"KAYAH LI VOWEL E"/* A927 */, /*16554*/"KAYAH LI VOWEL U"/* A928 */,/*16555*/"KAYAH LI VOWEL EE"/* A929 */,/*16556*/"KAYAH LI VOWEL O"/* A92A */, /*16557*/"KAYAH LI TONE PLOPHU"/* A92B */,/*16558*/"KAYAH LI TONE CALYA"/* A92C */, /*16559*/"KAYAH LI TONE CALYA PLOPHU"/* A92D */,/*16560*/"KAYAH LI SIGN CWI"/* A92E */, /*16561*/"KAYAH LI SIGN SHYA"/* A92F */,/*16562*/"REJANG LETTER KA"/* A930 */,/*16563*/"REJANG LETTER GA"/* A931 */, /*16564*/"REJANG LETTER NGA"/* A932 */,/*16565*/"REJANG LETTER TA"/* A933 */,/*16566*/"REJANG LETTER DA"/* A934 */, /*16567*/"REJANG LETTER NA"/* A935 */,/*16568*/"REJANG LETTER PA"/* A936 */,/*16569*/"REJANG LETTER BA"/* A937 */, /*16570*/"REJANG LETTER MA"/* A938 */,/*16571*/"REJANG LETTER CA"/* A939 */,/*16572*/"REJANG LETTER JA"/* A93A */, /*16573*/"REJANG LETTER NYA"/* A93B */,/*16574*/"REJANG LETTER SA"/* A93C */,/*16575*/"REJANG LETTER RA"/* A93D */, /*16576*/"REJANG LETTER LA"/* A93E */,/*16577*/"REJANG LETTER YA"/* A93F */,/*16578*/"REJANG LETTER WA"/* A940 */, /*16579*/"REJANG LETTER HA"/* A941 */,/*16580*/"REJANG LETTER MBA"/* A942 */,/*16581*/"REJANG LETTER NGGA"/* A943 */, /*16582*/"REJANG LETTER NDA"/* A944 */,/*16583*/"REJANG LETTER NYJA"/* A945 */,/*16584*/"REJANG LETTER A"/* A946 */, /*16585*/"REJANG VOWEL SIGN I"/* A947 */,/*16586*/"REJANG VOWEL SIGN U"/* A948 */, /*16587*/"REJANG VOWEL SIGN E"/* A949 */,/*16588*/"REJANG VOWEL SIGN AI"/* A94A */, /*16589*/"REJANG VOWEL SIGN O"/* A94B */,/*16590*/"REJANG VOWEL SIGN AU"/* A94C */, /*16591*/"REJANG VOWEL SIGN EU"/* A94D */,/*16592*/"REJANG VOWEL SIGN EA"/* A94E */, /*16593*/"REJANG CONSONANT SIGN NG"/* A94F */,/*16594*/"REJANG CONSONANT SIGN N"/* A950 */, /*16595*/"REJANG CONSONANT SIGN R"/* A951 */,/*16596*/"REJANG CONSONANT SIGN H"/* A952 */, /*16597*/"REJANG VIRAMA"/* A953 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*16609*/"REJANG SECTION MARK"/* A95F */,/*16610*/"HANGUL CHOSEONG TIKEUT-MIEUM"/* A960 */, /*16611*/"HANGUL CHOSEONG TIKEUT-PIEUP"/* A961 */,/*16612*/"HANGUL CHOSEONG TIKEUT-SIOS"/* A962 */, /*16613*/"HANGUL CHOSEONG TIKEUT-CIEUC"/* A963 */,/*16614*/"HANGUL CHOSEONG RIEUL-KIYEOK"/* A964 */, /*16615*/"HANGUL CHOSEONG RIEUL-SSANGKIYEOK"/* A965 */,/*16616*/"HANGUL CHOSEONG RIEUL-TIKEUT"/* A966 */, /*16617*/"HANGUL CHOSEONG RIEUL-SSANGTIKEUT"/* A967 */,/*16618*/"HANGUL CHOSEONG RIEUL-MIEUM"/* A968 */, /*16619*/"HANGUL CHOSEONG RIEUL-PIEUP"/* A969 */,/*16620*/"HANGUL CHOSEONG RIEUL-SSANGPIEUP"/* A96A */, /*16621*/"HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP"/* A96B */,/*16622*/"HANGUL CHOSEONG RIEUL-SIOS"/* A96C */, /*16623*/"HANGUL CHOSEONG RIEUL-CIEUC"/* A96D */,/*16624*/"HANGUL CHOSEONG RIEUL-KHIEUKH"/* A96E */, /*16625*/"HANGUL CHOSEONG MIEUM-KIYEOK"/* A96F */,/*16626*/"HANGUL CHOSEONG MIEUM-TIKEUT"/* A970 */, /*16627*/"HANGUL CHOSEONG MIEUM-SIOS"/* A971 */,/*16628*/"HANGUL CHOSEONG PIEUP-SIOS-THIEUTH"/* A972 */, /*16629*/"HANGUL CHOSEONG PIEUP-KHIEUKH"/* A973 */,/*16630*/"HANGUL CHOSEONG PIEUP-HIEUH"/* A974 */, /*16631*/"HANGUL CHOSEONG SSANGSIOS-PIEUP"/* A975 */,/*16632*/"HANGUL CHOSEONG IEUNG-RIEUL"/* A976 */, /*16633*/"HANGUL CHOSEONG IEUNG-HIEUH"/* A977 */,/*16634*/"HANGUL CHOSEONG SSANGCIEUC-HIEUH"/* A978 */, /*16635*/"HANGUL CHOSEONG SSANGTHIEUTH"/* A979 */,/*16636*/"HANGUL CHOSEONG PHIEUPH-HIEUH"/* A97A */, /*16637*/"HANGUL CHOSEONG HIEUH-SIOS"/* A97B */,/*16638*/"HANGUL CHOSEONG SSANGYEORINHIEUH"/* A97C */,NULL,NULL,NULL, /*16642*/"JAVANESE SIGN PANYANGGA"/* A980 */,/*16643*/"JAVANESE SIGN CECAK"/* A981 */, /*16644*/"JAVANESE SIGN LAYAR"/* A982 */,/*16645*/"JAVANESE SIGN WIGNYAN"/* A983 */, /*16646*/"JAVANESE LETTER A"/* A984 */,/*16647*/"JAVANESE LETTER I KAWI"/* A985 */, /*16648*/"JAVANESE LETTER I"/* A986 */,/*16649*/"JAVANESE LETTER II"/* A987 */,/*16650*/"JAVANESE LETTER U"/* A988 */, /*16651*/"JAVANESE LETTER PA CEREK"/* A989 */,/*16652*/"JAVANESE LETTER NGA LELET"/* A98A */, /*16653*/"JAVANESE LETTER NGA LELET RASWADI"/* A98B */,/*16654*/"JAVANESE LETTER E"/* A98C */, /*16655*/"JAVANESE LETTER AI"/* A98D */,/*16656*/"JAVANESE LETTER O"/* A98E */,/*16657*/"JAVANESE LETTER KA"/* A98F */, /*16658*/"JAVANESE LETTER KA SASAK"/* A990 */,/*16659*/"JAVANESE LETTER KA MURDA"/* A991 */, /*16660*/"JAVANESE LETTER GA"/* A992 */,/*16661*/"JAVANESE LETTER GA MURDA"/* A993 */, /*16662*/"JAVANESE LETTER NGA"/* A994 */,/*16663*/"JAVANESE LETTER CA"/* A995 */, /*16664*/"JAVANESE LETTER CA MURDA"/* A996 */,/*16665*/"JAVANESE LETTER JA"/* A997 */, /*16666*/"JAVANESE LETTER NYA MURDA"/* A998 */,/*16667*/"JAVANESE LETTER JA MAHAPRANA"/* A999 */, /*16668*/"JAVANESE LETTER NYA"/* A99A */,/*16669*/"JAVANESE LETTER TTA"/* A99B */, /*16670*/"JAVANESE LETTER TTA MAHAPRANA"/* A99C */,/*16671*/"JAVANESE LETTER DDA"/* A99D */, /*16672*/"JAVANESE LETTER DDA MAHAPRANA"/* A99E */,/*16673*/"JAVANESE LETTER NA MURDA"/* A99F */, /*16674*/"JAVANESE LETTER TA"/* A9A0 */,/*16675*/"JAVANESE LETTER TA MURDA"/* A9A1 */, /*16676*/"JAVANESE LETTER DA"/* A9A2 */,/*16677*/"JAVANESE LETTER DA MAHAPRANA"/* A9A3 */, /*16678*/"JAVANESE LETTER NA"/* A9A4 */,/*16679*/"JAVANESE LETTER PA"/* A9A5 */, /*16680*/"JAVANESE LETTER PA MURDA"/* A9A6 */,/*16681*/"JAVANESE LETTER BA"/* A9A7 */, /*16682*/"JAVANESE LETTER BA MURDA"/* A9A8 */,/*16683*/"JAVANESE LETTER MA"/* A9A9 */, /*16684*/"JAVANESE LETTER YA"/* A9AA */,/*16685*/"JAVANESE LETTER RA"/* A9AB */, /*16686*/"JAVANESE LETTER RA AGUNG"/* A9AC */,/*16687*/"JAVANESE LETTER LA"/* A9AD */, /*16688*/"JAVANESE LETTER WA"/* A9AE */,/*16689*/"JAVANESE LETTER SA MURDA"/* A9AF */, /*16690*/"JAVANESE LETTER SA MAHAPRANA"/* A9B0 */,/*16691*/"JAVANESE LETTER SA"/* A9B1 */, /*16692*/"JAVANESE LETTER HA"/* A9B2 */,/*16693*/"JAVANESE SIGN CECAK TELU"/* A9B3 */, /*16694*/"JAVANESE VOWEL SIGN TARUNG"/* A9B4 */,/*16695*/"JAVANESE VOWEL SIGN TOLONG"/* A9B5 */, /*16696*/"JAVANESE VOWEL SIGN WULU"/* A9B6 */,/*16697*/"JAVANESE VOWEL SIGN WULU MELIK"/* A9B7 */, /*16698*/"JAVANESE VOWEL SIGN SUKU"/* A9B8 */,/*16699*/"JAVANESE VOWEL SIGN SUKU MENDUT"/* A9B9 */, /*16700*/"JAVANESE VOWEL SIGN TALING"/* A9BA */,/*16701*/"JAVANESE VOWEL SIGN DIRGA MURE"/* A9BB */, /*16702*/"JAVANESE VOWEL SIGN PEPET"/* A9BC */,/*16703*/"JAVANESE CONSONANT SIGN KERET"/* A9BD */, /*16704*/"JAVANESE CONSONANT SIGN PENGKAL"/* A9BE */,/*16705*/"JAVANESE CONSONANT SIGN CAKRA"/* A9BF */, /*16706*/"JAVANESE PANGKON"/* A9C0 */,/*16707*/"JAVANESE LEFT RERENGGAN"/* A9C1 */, /*16708*/"JAVANESE RIGHT RERENGGAN"/* A9C2 */,/*16709*/"JAVANESE PADA ANDAP"/* A9C3 */, /*16710*/"JAVANESE PADA MADYA"/* A9C4 */,/*16711*/"JAVANESE PADA LUHUR"/* A9C5 */, /*16712*/"JAVANESE PADA WINDU"/* A9C6 */,/*16713*/"JAVANESE PADA PANGKAT"/* A9C7 */, /*16714*/"JAVANESE PADA LINGSA"/* A9C8 */,/*16715*/"JAVANESE PADA LUNGSI"/* A9C9 */, /*16716*/"JAVANESE PADA ADEG"/* A9CA */,/*16717*/"JAVANESE PADA ADEG ADEG"/* A9CB */, /*16718*/"JAVANESE PADA PISELEH"/* A9CC */,/*16719*/"JAVANESE TURNED PADA PISELEH"/* A9CD */,NULL, /*16721*/"JAVANESE PANGRANGKEP"/* A9CF */,/*16722*/"JAVANESE DIGIT ZERO"/* A9D0 */, /*16723*/"JAVANESE DIGIT ONE"/* A9D1 */,/*16724*/"JAVANESE DIGIT TWO"/* A9D2 */, /*16725*/"JAVANESE DIGIT THREE"/* A9D3 */,/*16726*/"JAVANESE DIGIT FOUR"/* A9D4 */, /*16727*/"JAVANESE DIGIT FIVE"/* A9D5 */,/*16728*/"JAVANESE DIGIT SIX"/* A9D6 */, /*16729*/"JAVANESE DIGIT SEVEN"/* A9D7 */,/*16730*/"JAVANESE DIGIT EIGHT"/* A9D8 */, /*16731*/"JAVANESE DIGIT NINE"/* A9D9 */,NULL,NULL,NULL,NULL,/*16736*/"JAVANESE PADA TIRTA TUMETES"/* A9DE */, /*16737*/"JAVANESE PADA ISEN-ISEN"/* A9DF */,/*16738*/"MYANMAR LETTER SHAN GHA"/* A9E0 */, /*16739*/"MYANMAR LETTER SHAN CHA"/* A9E1 */,/*16740*/"MYANMAR LETTER SHAN JHA"/* A9E2 */, /*16741*/"MYANMAR LETTER SHAN NNA"/* A9E3 */,/*16742*/"MYANMAR LETTER SHAN BHA"/* A9E4 */, /*16743*/"MYANMAR SIGN SHAN SAW"/* A9E5 */,/*16744*/"MYANMAR MODIFIER LETTER SHAN REDUPLICATION"/* A9E6 */, /*16745*/"MYANMAR LETTER TAI LAING NYA"/* A9E7 */,/*16746*/"MYANMAR LETTER TAI LAING FA"/* A9E8 */, /*16747*/"MYANMAR LETTER TAI LAING GA"/* A9E9 */,/*16748*/"MYANMAR LETTER TAI LAING GHA"/* A9EA */, /*16749*/"MYANMAR LETTER TAI LAING JA"/* A9EB */,/*16750*/"MYANMAR LETTER TAI LAING JHA"/* A9EC */, /*16751*/"MYANMAR LETTER TAI LAING DDA"/* A9ED */,/*16752*/"MYANMAR LETTER TAI LAING DDHA"/* A9EE */, /*16753*/"MYANMAR LETTER TAI LAING NNA"/* A9EF */,/*16754*/"MYANMAR TAI LAING DIGIT ZERO"/* A9F0 */, /*16755*/"MYANMAR TAI LAING DIGIT ONE"/* A9F1 */,/*16756*/"MYANMAR TAI LAING DIGIT TWO"/* A9F2 */, /*16757*/"MYANMAR TAI LAING DIGIT THREE"/* A9F3 */,/*16758*/"MYANMAR TAI LAING DIGIT FOUR"/* A9F4 */, /*16759*/"MYANMAR TAI LAING DIGIT FIVE"/* A9F5 */,/*16760*/"MYANMAR TAI LAING DIGIT SIX"/* A9F6 */, /*16761*/"MYANMAR TAI LAING DIGIT SEVEN"/* A9F7 */,/*16762*/"MYANMAR TAI LAING DIGIT EIGHT"/* A9F8 */, /*16763*/"MYANMAR TAI LAING DIGIT NINE"/* A9F9 */,/*16764*/"MYANMAR LETTER TAI LAING LLA"/* A9FA */, /*16765*/"MYANMAR LETTER TAI LAING DA"/* A9FB */,/*16766*/"MYANMAR LETTER TAI LAING DHA"/* A9FC */, /*16767*/"MYANMAR LETTER TAI LAING BA"/* A9FD */,/*16768*/"MYANMAR LETTER TAI LAING BHA"/* A9FE */,NULL, /*16770*/"CHAM LETTER A"/* AA00 */,/*16771*/"CHAM LETTER I"/* AA01 */,/*16772*/"CHAM LETTER U"/* AA02 */, /*16773*/"CHAM LETTER E"/* AA03 */,/*16774*/"CHAM LETTER AI"/* AA04 */,/*16775*/"CHAM LETTER O"/* AA05 */, /*16776*/"CHAM LETTER KA"/* AA06 */,/*16777*/"CHAM LETTER KHA"/* AA07 */,/*16778*/"CHAM LETTER GA"/* AA08 */, /*16779*/"CHAM LETTER GHA"/* AA09 */,/*16780*/"CHAM LETTER NGUE"/* AA0A */,/*16781*/"CHAM LETTER NGA"/* AA0B */, /*16782*/"CHAM LETTER CHA"/* AA0C */,/*16783*/"CHAM LETTER CHHA"/* AA0D */,/*16784*/"CHAM LETTER JA"/* AA0E */, /*16785*/"CHAM LETTER JHA"/* AA0F */,/*16786*/"CHAM LETTER NHUE"/* AA10 */,/*16787*/"CHAM LETTER NHA"/* AA11 */, /*16788*/"CHAM LETTER NHJA"/* AA12 */,/*16789*/"CHAM LETTER TA"/* AA13 */,/*16790*/"CHAM LETTER THA"/* AA14 */, /*16791*/"CHAM LETTER DA"/* AA15 */,/*16792*/"CHAM LETTER DHA"/* AA16 */,/*16793*/"CHAM LETTER NUE"/* AA17 */, /*16794*/"CHAM LETTER NA"/* AA18 */,/*16795*/"CHAM LETTER DDA"/* AA19 */,/*16796*/"CHAM LETTER PA"/* AA1A */, /*16797*/"CHAM LETTER PPA"/* AA1B */,/*16798*/"CHAM LETTER PHA"/* AA1C */,/*16799*/"CHAM LETTER BA"/* AA1D */, /*16800*/"CHAM LETTER BHA"/* AA1E */,/*16801*/"CHAM LETTER MUE"/* AA1F */,/*16802*/"CHAM LETTER MA"/* AA20 */, /*16803*/"CHAM LETTER BBA"/* AA21 */,/*16804*/"CHAM LETTER YA"/* AA22 */,/*16805*/"CHAM LETTER RA"/* AA23 */, /*16806*/"CHAM LETTER LA"/* AA24 */,/*16807*/"CHAM LETTER VA"/* AA25 */,/*16808*/"CHAM LETTER SSA"/* AA26 */, /*16809*/"CHAM LETTER SA"/* AA27 */,/*16810*/"CHAM LETTER HA"/* AA28 */,/*16811*/"CHAM VOWEL SIGN AA"/* AA29 */, /*16812*/"CHAM VOWEL SIGN I"/* AA2A */,/*16813*/"CHAM VOWEL SIGN II"/* AA2B */,/*16814*/"CHAM VOWEL SIGN EI"/* AA2C */, /*16815*/"CHAM VOWEL SIGN U"/* AA2D */,/*16816*/"CHAM VOWEL SIGN OE"/* AA2E */,/*16817*/"CHAM VOWEL SIGN O"/* AA2F */, /*16818*/"CHAM VOWEL SIGN AI"/* AA30 */,/*16819*/"CHAM VOWEL SIGN AU"/* AA31 */,/*16820*/"CHAM VOWEL SIGN UE"/* AA32 */, /*16821*/"CHAM CONSONANT SIGN YA"/* AA33 */,/*16822*/"CHAM CONSONANT SIGN RA"/* AA34 */, /*16823*/"CHAM CONSONANT SIGN LA"/* AA35 */,/*16824*/"CHAM CONSONANT SIGN WA"/* AA36 */,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,/*16834*/"CHAM LETTER FINAL K"/* AA40 */,/*16835*/"CHAM LETTER FINAL G"/* AA41 */, /*16836*/"CHAM LETTER FINAL NG"/* AA42 */,/*16837*/"CHAM CONSONANT SIGN FINAL NG"/* AA43 */, /*16838*/"CHAM LETTER FINAL CH"/* AA44 */,/*16839*/"CHAM LETTER FINAL T"/* AA45 */, /*16840*/"CHAM LETTER FINAL N"/* AA46 */,/*16841*/"CHAM LETTER FINAL P"/* AA47 */, /*16842*/"CHAM LETTER FINAL Y"/* AA48 */,/*16843*/"CHAM LETTER FINAL R"/* AA49 */, /*16844*/"CHAM LETTER FINAL L"/* AA4A */,/*16845*/"CHAM LETTER FINAL SS"/* AA4B */, /*16846*/"CHAM CONSONANT SIGN FINAL M"/* AA4C */,/*16847*/"CHAM CONSONANT SIGN FINAL H"/* AA4D */,NULL,NULL, /*16850*/"CHAM DIGIT ZERO"/* AA50 */,/*16851*/"CHAM DIGIT ONE"/* AA51 */,/*16852*/"CHAM DIGIT TWO"/* AA52 */, /*16853*/"CHAM DIGIT THREE"/* AA53 */,/*16854*/"CHAM DIGIT FOUR"/* AA54 */,/*16855*/"CHAM DIGIT FIVE"/* AA55 */, /*16856*/"CHAM DIGIT SIX"/* AA56 */,/*16857*/"CHAM DIGIT SEVEN"/* AA57 */,/*16858*/"CHAM DIGIT EIGHT"/* AA58 */, /*16859*/"CHAM DIGIT NINE"/* AA59 */,NULL,NULL,/*16862*/"CHAM PUNCTUATION SPIRAL"/* AA5C */, /*16863*/"CHAM PUNCTUATION DANDA"/* AA5D */,/*16864*/"CHAM PUNCTUATION DOUBLE DANDA"/* AA5E */, /*16865*/"CHAM PUNCTUATION TRIPLE DANDA"/* AA5F */,/*16866*/"MYANMAR LETTER KHAMTI GA"/* AA60 */, /*16867*/"MYANMAR LETTER KHAMTI CA"/* AA61 */,/*16868*/"MYANMAR LETTER KHAMTI CHA"/* AA62 */, /*16869*/"MYANMAR LETTER KHAMTI JA"/* AA63 */,/*16870*/"MYANMAR LETTER KHAMTI JHA"/* AA64 */, /*16871*/"MYANMAR LETTER KHAMTI NYA"/* AA65 */,/*16872*/"MYANMAR LETTER KHAMTI TTA"/* AA66 */, /*16873*/"MYANMAR LETTER KHAMTI TTHA"/* AA67 */,/*16874*/"MYANMAR LETTER KHAMTI DDA"/* AA68 */, /*16875*/"MYANMAR LETTER KHAMTI DDHA"/* AA69 */,/*16876*/"MYANMAR LETTER KHAMTI DHA"/* AA6A */, /*16877*/"MYANMAR LETTER KHAMTI NA"/* AA6B */,/*16878*/"MYANMAR LETTER KHAMTI SA"/* AA6C */, /*16879*/"MYANMAR LETTER KHAMTI HA"/* AA6D */,/*16880*/"MYANMAR LETTER KHAMTI HHA"/* AA6E */, /*16881*/"MYANMAR LETTER KHAMTI FA"/* AA6F */,/*16882*/"MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION"/* AA70 */, /*16883*/"MYANMAR LETTER KHAMTI XA"/* AA71 */,/*16884*/"MYANMAR LETTER KHAMTI ZA"/* AA72 */, /*16885*/"MYANMAR LETTER KHAMTI RA"/* AA73 */,/*16886*/"MYANMAR LOGOGRAM KHAMTI OAY"/* AA74 */, /*16887*/"MYANMAR LOGOGRAM KHAMTI QN"/* AA75 */,/*16888*/"MYANMAR LOGOGRAM KHAMTI HM"/* AA76 */, /*16889*/"MYANMAR SYMBOL AITON EXCLAMATION"/* AA77 */,/*16890*/"MYANMAR SYMBOL AITON ONE"/* AA78 */, /*16891*/"MYANMAR SYMBOL AITON TWO"/* AA79 */,/*16892*/"MYANMAR LETTER AITON RA"/* AA7A */, /*16893*/"MYANMAR SIGN PAO KAREN TONE"/* AA7B */,/*16894*/"MYANMAR SIGN TAI LAING TONE-2"/* AA7C */, /*16895*/"MYANMAR SIGN TAI LAING TONE-5"/* AA7D */,/*16896*/"MYANMAR LETTER SHWE PALAUNG CHA"/* AA7E */, /*16897*/"MYANMAR LETTER SHWE PALAUNG SHA"/* AA7F */,/*16898*/"TAI VIET LETTER LOW KO"/* AA80 */, /*16899*/"TAI VIET LETTER HIGH KO"/* AA81 */,/*16900*/"TAI VIET LETTER LOW KHO"/* AA82 */, /*16901*/"TAI VIET LETTER HIGH KHO"/* AA83 */,/*16902*/"TAI VIET LETTER LOW KHHO"/* AA84 */, /*16903*/"TAI VIET LETTER HIGH KHHO"/* AA85 */,/*16904*/"TAI VIET LETTER LOW GO"/* AA86 */, /*16905*/"TAI VIET LETTER HIGH GO"/* AA87 */,/*16906*/"TAI VIET LETTER LOW NGO"/* AA88 */, /*16907*/"TAI VIET LETTER HIGH NGO"/* AA89 */,/*16908*/"TAI VIET LETTER LOW CO"/* AA8A */, /*16909*/"TAI VIET LETTER HIGH CO"/* AA8B */,/*16910*/"TAI VIET LETTER LOW CHO"/* AA8C */, /*16911*/"TAI VIET LETTER HIGH CHO"/* AA8D */,/*16912*/"TAI VIET LETTER LOW SO"/* AA8E */, /*16913*/"TAI VIET LETTER HIGH SO"/* AA8F */,/*16914*/"TAI VIET LETTER LOW NYO"/* AA90 */, /*16915*/"TAI VIET LETTER HIGH NYO"/* AA91 */,/*16916*/"TAI VIET LETTER LOW DO"/* AA92 */, /*16917*/"TAI VIET LETTER HIGH DO"/* AA93 */,/*16918*/"TAI VIET LETTER LOW TO"/* AA94 */, /*16919*/"TAI VIET LETTER HIGH TO"/* AA95 */,/*16920*/"TAI VIET LETTER LOW THO"/* AA96 */, /*16921*/"TAI VIET LETTER HIGH THO"/* AA97 */,/*16922*/"TAI VIET LETTER LOW NO"/* AA98 */, /*16923*/"TAI VIET LETTER HIGH NO"/* AA99 */,/*16924*/"TAI VIET LETTER LOW BO"/* AA9A */, /*16925*/"TAI VIET LETTER HIGH BO"/* AA9B */,/*16926*/"TAI VIET LETTER LOW PO"/* AA9C */, /*16927*/"TAI VIET LETTER HIGH PO"/* AA9D */,/*16928*/"TAI VIET LETTER LOW PHO"/* AA9E */, /*16929*/"TAI VIET LETTER HIGH PHO"/* AA9F */,/*16930*/"TAI VIET LETTER LOW FO"/* AAA0 */, /*16931*/"TAI VIET LETTER HIGH FO"/* AAA1 */,/*16932*/"TAI VIET LETTER LOW MO"/* AAA2 */, /*16933*/"TAI VIET LETTER HIGH MO"/* AAA3 */,/*16934*/"TAI VIET LETTER LOW YO"/* AAA4 */, /*16935*/"TAI VIET LETTER HIGH YO"/* AAA5 */,/*16936*/"TAI VIET LETTER LOW RO"/* AAA6 */, /*16937*/"TAI VIET LETTER HIGH RO"/* AAA7 */,/*16938*/"TAI VIET LETTER LOW LO"/* AAA8 */, /*16939*/"TAI VIET LETTER HIGH LO"/* AAA9 */,/*16940*/"TAI VIET LETTER LOW VO"/* AAAA */, /*16941*/"TAI VIET LETTER HIGH VO"/* AAAB */,/*16942*/"TAI VIET LETTER LOW HO"/* AAAC */, /*16943*/"TAI VIET LETTER HIGH HO"/* AAAD */,/*16944*/"TAI VIET LETTER LOW O"/* AAAE */, /*16945*/"TAI VIET LETTER HIGH O"/* AAAF */,/*16946*/"TAI VIET MAI KANG"/* AAB0 */, /*16947*/"TAI VIET VOWEL AA"/* AAB1 */,/*16948*/"TAI VIET VOWEL I"/* AAB2 */,/*16949*/"TAI VIET VOWEL UE"/* AAB3 */, /*16950*/"TAI VIET VOWEL U"/* AAB4 */,/*16951*/"TAI VIET VOWEL E"/* AAB5 */,/*16952*/"TAI VIET VOWEL O"/* AAB6 */, /*16953*/"TAI VIET MAI KHIT"/* AAB7 */,/*16954*/"TAI VIET VOWEL IA"/* AAB8 */,/*16955*/"TAI VIET VOWEL UEA"/* AAB9 */, /*16956*/"TAI VIET VOWEL UA"/* AABA */,/*16957*/"TAI VIET VOWEL AUE"/* AABB */,/*16958*/"TAI VIET VOWEL AY"/* AABC */, /*16959*/"TAI VIET VOWEL AN"/* AABD */,/*16960*/"TAI VIET VOWEL AM"/* AABE */,/*16961*/"TAI VIET TONE MAI EK"/* AABF */, /*16962*/"TAI VIET TONE MAI NUENG"/* AAC0 */,/*16963*/"TAI VIET TONE MAI THO"/* AAC1 */, /*16964*/"TAI VIET TONE MAI SONG"/* AAC2 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*16989*/"TAI VIET SYMBOL KON"/* AADB */, /*16990*/"TAI VIET SYMBOL NUENG"/* AADC */,/*16991*/"TAI VIET SYMBOL SAM"/* AADD */, /*16992*/"TAI VIET SYMBOL HO HOI"/* AADE */,/*16993*/"TAI VIET SYMBOL KOI KOI"/* AADF */, /*16994*/"MEETEI MAYEK LETTER E"/* AAE0 */,/*16995*/"MEETEI MAYEK LETTER O"/* AAE1 */, /*16996*/"MEETEI MAYEK LETTER CHA"/* AAE2 */,/*16997*/"MEETEI MAYEK LETTER NYA"/* AAE3 */, /*16998*/"MEETEI MAYEK LETTER TTA"/* AAE4 */,/*16999*/"MEETEI MAYEK LETTER TTHA"/* AAE5 */, /*17000*/"MEETEI MAYEK LETTER DDA"/* AAE6 */,/*17001*/"MEETEI MAYEK LETTER DDHA"/* AAE7 */, /*17002*/"MEETEI MAYEK LETTER NNA"/* AAE8 */,/*17003*/"MEETEI MAYEK LETTER SHA"/* AAE9 */, /*17004*/"MEETEI MAYEK LETTER SSA"/* AAEA */,/*17005*/"MEETEI MAYEK VOWEL SIGN II"/* AAEB */, /*17006*/"MEETEI MAYEK VOWEL SIGN UU"/* AAEC */,/*17007*/"MEETEI MAYEK VOWEL SIGN AAI"/* AAED */, /*17008*/"MEETEI MAYEK VOWEL SIGN AU"/* AAEE */,/*17009*/"MEETEI MAYEK VOWEL SIGN AAU"/* AAEF */, /*17010*/"MEETEI MAYEK CHEIKHAN"/* AAF0 */,/*17011*/"MEETEI MAYEK AHANG KHUDAM"/* AAF1 */, /*17012*/"MEETEI MAYEK ANJI"/* AAF2 */,/*17013*/"MEETEI MAYEK SYLLABLE REPETITION MARK"/* AAF3 */, /*17014*/"MEETEI MAYEK WORD REPETITION MARK"/* AAF4 */,/*17015*/"MEETEI MAYEK VOWEL SIGN VISARGA"/* AAF5 */, /*17016*/"MEETEI MAYEK VIRAMA"/* AAF6 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*17027*/"ETHIOPIC SYLLABLE TTHU"/* AB01 */,/*17028*/"ETHIOPIC SYLLABLE TTHI"/* AB02 */, /*17029*/"ETHIOPIC SYLLABLE TTHAA"/* AB03 */,/*17030*/"ETHIOPIC SYLLABLE TTHEE"/* AB04 */, /*17031*/"ETHIOPIC SYLLABLE TTHE"/* AB05 */,/*17032*/"ETHIOPIC SYLLABLE TTHO"/* AB06 */,NULL,NULL, /*17035*/"ETHIOPIC SYLLABLE DDHU"/* AB09 */,/*17036*/"ETHIOPIC SYLLABLE DDHI"/* AB0A */, /*17037*/"ETHIOPIC SYLLABLE DDHAA"/* AB0B */,/*17038*/"ETHIOPIC SYLLABLE DDHEE"/* AB0C */, /*17039*/"ETHIOPIC SYLLABLE DDHE"/* AB0D */,/*17040*/"ETHIOPIC SYLLABLE DDHO"/* AB0E */,NULL,NULL, /*17043*/"ETHIOPIC SYLLABLE DZU"/* AB11 */,/*17044*/"ETHIOPIC SYLLABLE DZI"/* AB12 */, /*17045*/"ETHIOPIC SYLLABLE DZAA"/* AB13 */,/*17046*/"ETHIOPIC SYLLABLE DZEE"/* AB14 */, /*17047*/"ETHIOPIC SYLLABLE DZE"/* AB15 */,/*17048*/"ETHIOPIC SYLLABLE DZO"/* AB16 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,/*17058*/"ETHIOPIC SYLLABLE CCHHA"/* AB20 */,/*17059*/"ETHIOPIC SYLLABLE CCHHU"/* AB21 */, /*17060*/"ETHIOPIC SYLLABLE CCHHI"/* AB22 */,/*17061*/"ETHIOPIC SYLLABLE CCHHAA"/* AB23 */, /*17062*/"ETHIOPIC SYLLABLE CCHHEE"/* AB24 */,/*17063*/"ETHIOPIC SYLLABLE CCHHE"/* AB25 */, /*17064*/"ETHIOPIC SYLLABLE CCHHO"/* AB26 */,NULL,/*17066*/"ETHIOPIC SYLLABLE BBA"/* AB28 */, /*17067*/"ETHIOPIC SYLLABLE BBU"/* AB29 */,/*17068*/"ETHIOPIC SYLLABLE BBI"/* AB2A */, /*17069*/"ETHIOPIC SYLLABLE BBAA"/* AB2B */,/*17070*/"ETHIOPIC SYLLABLE BBEE"/* AB2C */, /*17071*/"ETHIOPIC SYLLABLE BBE"/* AB2D */,/*17072*/"ETHIOPIC SYLLABLE BBO"/* AB2E */,NULL, /*17074*/"LATIN SMALL LETTER BARRED ALPHA"/* AB30 */,/*17075*/"LATIN SMALL LETTER A REVERSED-SCHWA"/* AB31 */, /*17076*/"LATIN SMALL LETTER BLACKLETTER E"/* AB32 */,/*17077*/"LATIN SMALL LETTER BARRED E"/* AB33 */, /*17078*/"LATIN SMALL LETTER E WITH FLOURISH"/* AB34 */,/*17079*/"LATIN SMALL LETTER LENIS F"/* AB35 */, /*17080*/"LATIN SMALL LETTER SCRIPT G WITH CROSSED-TAIL"/* AB36 */, /*17081*/"LATIN SMALL LETTER L WITH INVERTED LAZY S"/* AB37 */, /*17082*/"LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE"/* AB38 */, /*17083*/"LATIN SMALL LETTER L WITH MIDDLE RING"/* AB39 */,/*17084*/"LATIN SMALL LETTER M WITH CROSSED-TAIL"/* AB3A */, /*17085*/"LATIN SMALL LETTER N WITH CROSSED-TAIL"/* AB3B */, /*17086*/"LATIN SMALL LETTER ENG WITH CROSSED-TAIL"/* AB3C */,/*17087*/"LATIN SMALL LETTER BLACKLETTER O"/* AB3D */, /*17088*/"LATIN SMALL LETTER BLACKLETTER O WITH STROKE"/* AB3E */, /*17089*/"LATIN SMALL LETTER OPEN O WITH STROKE"/* AB3F */,/*17090*/"LATIN SMALL LETTER INVERTED OE"/* AB40 */, /*17091*/"LATIN SMALL LETTER TURNED OE WITH STROKE"/* AB41 */, /*17092*/"LATIN SMALL LETTER TURNED OE WITH HORIZONTAL STROKE"/* AB42 */, /*17093*/"LATIN SMALL LETTER TURNED O OPEN-O"/* AB43 */, /*17094*/"LATIN SMALL LETTER TURNED O OPEN-O WITH STROKE"/* AB44 */,/*17095*/"LATIN SMALL LETTER STIRRUP R"/* AB45 */, /*17096*/"LATIN LETTER SMALL CAPITAL R WITH RIGHT LEG"/* AB46 */, /*17097*/"LATIN SMALL LETTER R WITHOUT HANDLE"/* AB47 */,/*17098*/"LATIN SMALL LETTER DOUBLE R"/* AB48 */, /*17099*/"LATIN SMALL LETTER R WITH CROSSED-TAIL"/* AB49 */, /*17100*/"LATIN SMALL LETTER DOUBLE R WITH CROSSED-TAIL"/* AB4A */,/*17101*/"LATIN SMALL LETTER SCRIPT R"/* AB4B */, /*17102*/"LATIN SMALL LETTER SCRIPT R WITH RING"/* AB4C */,/*17103*/"LATIN SMALL LETTER BASELINE ESH"/* AB4D */, /*17104*/"LATIN SMALL LETTER U WITH SHORT RIGHT LEG"/* AB4E */, /*17105*/"LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG"/* AB4F */,/*17106*/"LATIN SMALL LETTER UI"/* AB50 */, /*17107*/"LATIN SMALL LETTER TURNED UI"/* AB51 */,/*17108*/"LATIN SMALL LETTER U WITH LEFT HOOK"/* AB52 */, /*17109*/"LATIN SMALL LETTER CHI"/* AB53 */,/*17110*/"LATIN SMALL LETTER CHI WITH LOW RIGHT RING"/* AB54 */, /*17111*/"LATIN SMALL LETTER CHI WITH LOW LEFT SERIF"/* AB55 */, /*17112*/"LATIN SMALL LETTER X WITH LOW RIGHT RING"/* AB56 */, /*17113*/"LATIN SMALL LETTER X WITH LONG LEFT LEG"/* AB57 */, /*17114*/"LATIN SMALL LETTER X WITH LONG LEFT LEG AND LOW RIGHT RING"/* AB58 */, /*17115*/"LATIN SMALL LETTER X WITH LONG LEFT LEG WITH SERIF"/* AB59 */, /*17116*/"LATIN SMALL LETTER Y WITH SHORT RIGHT LEG"/* AB5A */,/*17117*/"MODIFIER BREVE WITH INVERTED BREVE"/* AB5B */, /*17118*/"MODIFIER LETTER SMALL HENG"/* AB5C */,/*17119*/"MODIFIER LETTER SMALL L WITH INVERTED LAZY S"/* AB5D */, /*17120*/"MODIFIER LETTER SMALL L WITH MIDDLE TILDE"/* AB5E */, /*17121*/"MODIFIER LETTER SMALL U WITH LEFT HOOK"/* AB5F */,/*17122*/"LATIN SMALL LETTER SAKHA YAT"/* AB60 */, /*17123*/"LATIN SMALL LETTER IOTIFIED E"/* AB61 */,/*17124*/"LATIN SMALL LETTER OPEN OE"/* AB62 */, /*17125*/"LATIN SMALL LETTER UO"/* AB63 */,/*17126*/"LATIN SMALL LETTER INVERTED ALPHA"/* AB64 */, /*17127*/"GREEK LETTER SMALL CAPITAL OMEGA"/* AB65 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*17138*/"CHEROKEE SMALL LETTER A"/* AB70 */,/*17139*/"CHEROKEE SMALL LETTER E"/* AB71 */, /*17140*/"CHEROKEE SMALL LETTER I"/* AB72 */,/*17141*/"CHEROKEE SMALL LETTER O"/* AB73 */, /*17142*/"CHEROKEE SMALL LETTER U"/* AB74 */,/*17143*/"CHEROKEE SMALL LETTER V"/* AB75 */, /*17144*/"CHEROKEE SMALL LETTER GA"/* AB76 */,/*17145*/"CHEROKEE SMALL LETTER KA"/* AB77 */, /*17146*/"CHEROKEE SMALL LETTER GE"/* AB78 */,/*17147*/"CHEROKEE SMALL LETTER GI"/* AB79 */, /*17148*/"CHEROKEE SMALL LETTER GO"/* AB7A */,/*17149*/"CHEROKEE SMALL LETTER GU"/* AB7B */, /*17150*/"CHEROKEE SMALL LETTER GV"/* AB7C */,/*17151*/"CHEROKEE SMALL LETTER HA"/* AB7D */, /*17152*/"CHEROKEE SMALL LETTER HE"/* AB7E */,/*17153*/"CHEROKEE SMALL LETTER HI"/* AB7F */, /*17154*/"CHEROKEE SMALL LETTER HO"/* AB80 */,/*17155*/"CHEROKEE SMALL LETTER HU"/* AB81 */, /*17156*/"CHEROKEE SMALL LETTER HV"/* AB82 */,/*17157*/"CHEROKEE SMALL LETTER LA"/* AB83 */, /*17158*/"CHEROKEE SMALL LETTER LE"/* AB84 */,/*17159*/"CHEROKEE SMALL LETTER LI"/* AB85 */, /*17160*/"CHEROKEE SMALL LETTER LO"/* AB86 */,/*17161*/"CHEROKEE SMALL LETTER LU"/* AB87 */, /*17162*/"CHEROKEE SMALL LETTER LV"/* AB88 */,/*17163*/"CHEROKEE SMALL LETTER MA"/* AB89 */, /*17164*/"CHEROKEE SMALL LETTER ME"/* AB8A */,/*17165*/"CHEROKEE SMALL LETTER MI"/* AB8B */, /*17166*/"CHEROKEE SMALL LETTER MO"/* AB8C */,/*17167*/"CHEROKEE SMALL LETTER MU"/* AB8D */, /*17168*/"CHEROKEE SMALL LETTER NA"/* AB8E */,/*17169*/"CHEROKEE SMALL LETTER HNA"/* AB8F */, /*17170*/"CHEROKEE SMALL LETTER NAH"/* AB90 */,/*17171*/"CHEROKEE SMALL LETTER NE"/* AB91 */, /*17172*/"CHEROKEE SMALL LETTER NI"/* AB92 */,/*17173*/"CHEROKEE SMALL LETTER NO"/* AB93 */, /*17174*/"CHEROKEE SMALL LETTER NU"/* AB94 */,/*17175*/"CHEROKEE SMALL LETTER NV"/* AB95 */, /*17176*/"CHEROKEE SMALL LETTER QUA"/* AB96 */,/*17177*/"CHEROKEE SMALL LETTER QUE"/* AB97 */, /*17178*/"CHEROKEE SMALL LETTER QUI"/* AB98 */,/*17179*/"CHEROKEE SMALL LETTER QUO"/* AB99 */, /*17180*/"CHEROKEE SMALL LETTER QUU"/* AB9A */,/*17181*/"CHEROKEE SMALL LETTER QUV"/* AB9B */, /*17182*/"CHEROKEE SMALL LETTER SA"/* AB9C */,/*17183*/"CHEROKEE SMALL LETTER S"/* AB9D */, /*17184*/"CHEROKEE SMALL LETTER SE"/* AB9E */,/*17185*/"CHEROKEE SMALL LETTER SI"/* AB9F */, /*17186*/"CHEROKEE SMALL LETTER SO"/* ABA0 */,/*17187*/"CHEROKEE SMALL LETTER SU"/* ABA1 */, /*17188*/"CHEROKEE SMALL LETTER SV"/* ABA2 */,/*17189*/"CHEROKEE SMALL LETTER DA"/* ABA3 */, /*17190*/"CHEROKEE SMALL LETTER TA"/* ABA4 */,/*17191*/"CHEROKEE SMALL LETTER DE"/* ABA5 */, /*17192*/"CHEROKEE SMALL LETTER TE"/* ABA6 */,/*17193*/"CHEROKEE SMALL LETTER DI"/* ABA7 */, /*17194*/"CHEROKEE SMALL LETTER TI"/* ABA8 */,/*17195*/"CHEROKEE SMALL LETTER DO"/* ABA9 */, /*17196*/"CHEROKEE SMALL LETTER DU"/* ABAA */,/*17197*/"CHEROKEE SMALL LETTER DV"/* ABAB */, /*17198*/"CHEROKEE SMALL LETTER DLA"/* ABAC */,/*17199*/"CHEROKEE SMALL LETTER TLA"/* ABAD */, /*17200*/"CHEROKEE SMALL LETTER TLE"/* ABAE */,/*17201*/"CHEROKEE SMALL LETTER TLI"/* ABAF */, /*17202*/"CHEROKEE SMALL LETTER TLO"/* ABB0 */,/*17203*/"CHEROKEE SMALL LETTER TLU"/* ABB1 */, /*17204*/"CHEROKEE SMALL LETTER TLV"/* ABB2 */,/*17205*/"CHEROKEE SMALL LETTER TSA"/* ABB3 */, /*17206*/"CHEROKEE SMALL LETTER TSE"/* ABB4 */,/*17207*/"CHEROKEE SMALL LETTER TSI"/* ABB5 */, /*17208*/"CHEROKEE SMALL LETTER TSO"/* ABB6 */,/*17209*/"CHEROKEE SMALL LETTER TSU"/* ABB7 */, /*17210*/"CHEROKEE SMALL LETTER TSV"/* ABB8 */,/*17211*/"CHEROKEE SMALL LETTER WA"/* ABB9 */, /*17212*/"CHEROKEE SMALL LETTER WE"/* ABBA */,/*17213*/"CHEROKEE SMALL LETTER WI"/* ABBB */, /*17214*/"CHEROKEE SMALL LETTER WO"/* ABBC */,/*17215*/"CHEROKEE SMALL LETTER WU"/* ABBD */, /*17216*/"CHEROKEE SMALL LETTER WV"/* ABBE */,/*17217*/"CHEROKEE SMALL LETTER YA"/* ABBF */, /*17218*/"MEETEI MAYEK LETTER KOK"/* ABC0 */,/*17219*/"MEETEI MAYEK LETTER SAM"/* ABC1 */, /*17220*/"MEETEI MAYEK LETTER LAI"/* ABC2 */,/*17221*/"MEETEI MAYEK LETTER MIT"/* ABC3 */, /*17222*/"MEETEI MAYEK LETTER PA"/* ABC4 */,/*17223*/"MEETEI MAYEK LETTER NA"/* ABC5 */, /*17224*/"MEETEI MAYEK LETTER CHIL"/* ABC6 */,/*17225*/"MEETEI MAYEK LETTER TIL"/* ABC7 */, /*17226*/"MEETEI MAYEK LETTER KHOU"/* ABC8 */,/*17227*/"MEETEI MAYEK LETTER NGOU"/* ABC9 */, /*17228*/"MEETEI MAYEK LETTER THOU"/* ABCA */,/*17229*/"MEETEI MAYEK LETTER WAI"/* ABCB */, /*17230*/"MEETEI MAYEK LETTER YANG"/* ABCC */,/*17231*/"MEETEI MAYEK LETTER HUK"/* ABCD */, /*17232*/"MEETEI MAYEK LETTER UN"/* ABCE */,/*17233*/"MEETEI MAYEK LETTER I"/* ABCF */, /*17234*/"MEETEI MAYEK LETTER PHAM"/* ABD0 */,/*17235*/"MEETEI MAYEK LETTER ATIYA"/* ABD1 */, /*17236*/"MEETEI MAYEK LETTER GOK"/* ABD2 */,/*17237*/"MEETEI MAYEK LETTER JHAM"/* ABD3 */, /*17238*/"MEETEI MAYEK LETTER RAI"/* ABD4 */,/*17239*/"MEETEI MAYEK LETTER BA"/* ABD5 */, /*17240*/"MEETEI MAYEK LETTER JIL"/* ABD6 */,/*17241*/"MEETEI MAYEK LETTER DIL"/* ABD7 */, /*17242*/"MEETEI MAYEK LETTER GHOU"/* ABD8 */,/*17243*/"MEETEI MAYEK LETTER DHOU"/* ABD9 */, /*17244*/"MEETEI MAYEK LETTER BHAM"/* ABDA */,/*17245*/"MEETEI MAYEK LETTER KOK LONSUM"/* ABDB */, /*17246*/"MEETEI MAYEK LETTER LAI LONSUM"/* ABDC */,/*17247*/"MEETEI MAYEK LETTER MIT LONSUM"/* ABDD */, /*17248*/"MEETEI MAYEK LETTER PA LONSUM"/* ABDE */,/*17249*/"MEETEI MAYEK LETTER NA LONSUM"/* ABDF */, /*17250*/"MEETEI MAYEK LETTER TIL LONSUM"/* ABE0 */,/*17251*/"MEETEI MAYEK LETTER NGOU LONSUM"/* ABE1 */, /*17252*/"MEETEI MAYEK LETTER I LONSUM"/* ABE2 */,/*17253*/"MEETEI MAYEK VOWEL SIGN ONAP"/* ABE3 */, /*17254*/"MEETEI MAYEK VOWEL SIGN INAP"/* ABE4 */,/*17255*/"MEETEI MAYEK VOWEL SIGN ANAP"/* ABE5 */, /*17256*/"MEETEI MAYEK VOWEL SIGN YENAP"/* ABE6 */,/*17257*/"MEETEI MAYEK VOWEL SIGN SOUNAP"/* ABE7 */, /*17258*/"MEETEI MAYEK VOWEL SIGN UNAP"/* ABE8 */,/*17259*/"MEETEI MAYEK VOWEL SIGN CHEINAP"/* ABE9 */, /*17260*/"MEETEI MAYEK VOWEL SIGN NUNG"/* ABEA */,/*17261*/"MEETEI MAYEK CHEIKHEI"/* ABEB */, /*17262*/"MEETEI MAYEK LUM IYEK"/* ABEC */,/*17263*/"MEETEI MAYEK APUN IYEK"/* ABED */,NULL,NULL, /*17266*/"MEETEI MAYEK DIGIT ZERO"/* ABF0 */,/*17267*/"MEETEI MAYEK DIGIT ONE"/* ABF1 */, /*17268*/"MEETEI MAYEK DIGIT TWO"/* ABF2 */,/*17269*/"MEETEI MAYEK DIGIT THREE"/* ABF3 */, /*17270*/"MEETEI MAYEK DIGIT FOUR"/* ABF4 */,/*17271*/"MEETEI MAYEK DIGIT FIVE"/* ABF5 */, /*17272*/"MEETEI MAYEK DIGIT SIX"/* ABF6 */,/*17273*/"MEETEI MAYEK DIGIT SEVEN"/* ABF7 */, /*17274*/"MEETEI MAYEK DIGIT EIGHT"/* ABF8 */,/*17275*/"MEETEI MAYEK DIGIT NINE"/* ABF9 */,NULL,NULL,NULL,NULL,NULL,NULL, /*17282*/"Hangul Syllable GA"/* AC00 */,/*17283*/"Hangul Syllable GAG"/* AC01 */, /*17284*/"Hangul Syllable GAGG"/* AC02 */,/*17285*/"Hangul Syllable GAGS"/* AC03 */, /*17286*/"Hangul Syllable GAN"/* AC04 */,/*17287*/"Hangul Syllable GANJ"/* AC05 */, /*17288*/"Hangul Syllable GANH"/* AC06 */,/*17289*/"Hangul Syllable GAD"/* AC07 */, /*17290*/"Hangul Syllable GAL"/* AC08 */,/*17291*/"Hangul Syllable GALG"/* AC09 */, /*17292*/"Hangul Syllable GALM"/* AC0A */,/*17293*/"Hangul Syllable GALB"/* AC0B */, /*17294*/"Hangul Syllable GALS"/* AC0C */,/*17295*/"Hangul Syllable GALT"/* AC0D */, /*17296*/"Hangul Syllable GALP"/* AC0E */,/*17297*/"Hangul Syllable GALH"/* AC0F */, /*17298*/"Hangul Syllable GAM"/* AC10 */,/*17299*/"Hangul Syllable GAB"/* AC11 */, /*17300*/"Hangul Syllable GABS"/* AC12 */,/*17301*/"Hangul Syllable GAS"/* AC13 */, /*17302*/"Hangul Syllable GASS"/* AC14 */,/*17303*/"Hangul Syllable GANG"/* AC15 */, /*17304*/"Hangul Syllable GAJ"/* AC16 */,/*17305*/"Hangul Syllable GAC"/* AC17 */, /*17306*/"Hangul Syllable GAK"/* AC18 */,/*17307*/"Hangul Syllable GAT"/* AC19 */, /*17308*/"Hangul Syllable GAP"/* AC1A */,/*17309*/"Hangul Syllable GAH"/* AC1B */, /*17310*/"Hangul Syllable GAE"/* AC1C */,/*17311*/"Hangul Syllable GAEG"/* AC1D */, /*17312*/"Hangul Syllable GAEGG"/* AC1E */,/*17313*/"Hangul Syllable GAEGS"/* AC1F */, /*17314*/"Hangul Syllable GAEN"/* AC20 */,/*17315*/"Hangul Syllable GAENJ"/* AC21 */, /*17316*/"Hangul Syllable GAENH"/* AC22 */,/*17317*/"Hangul Syllable GAED"/* AC23 */, /*17318*/"Hangul Syllable GAEL"/* AC24 */,/*17319*/"Hangul Syllable GAELG"/* AC25 */, /*17320*/"Hangul Syllable GAELM"/* AC26 */,/*17321*/"Hangul Syllable GAELB"/* AC27 */, /*17322*/"Hangul Syllable GAELS"/* AC28 */,/*17323*/"Hangul Syllable GAELT"/* AC29 */, /*17324*/"Hangul Syllable GAELP"/* AC2A */,/*17325*/"Hangul Syllable GAELH"/* AC2B */, /*17326*/"Hangul Syllable GAEM"/* AC2C */,/*17327*/"Hangul Syllable GAEB"/* AC2D */, /*17328*/"Hangul Syllable GAEBS"/* AC2E */,/*17329*/"Hangul Syllable GAES"/* AC2F */, /*17330*/"Hangul Syllable GAESS"/* AC30 */,/*17331*/"Hangul Syllable GAENG"/* AC31 */, /*17332*/"Hangul Syllable GAEJ"/* AC32 */,/*17333*/"Hangul Syllable GAEC"/* AC33 */, /*17334*/"Hangul Syllable GAEK"/* AC34 */,/*17335*/"Hangul Syllable GAET"/* AC35 */, /*17336*/"Hangul Syllable GAEP"/* AC36 */,/*17337*/"Hangul Syllable GAEH"/* AC37 */, /*17338*/"Hangul Syllable GYA"/* AC38 */,/*17339*/"Hangul Syllable GYAG"/* AC39 */, /*17340*/"Hangul Syllable GYAGG"/* AC3A */,/*17341*/"Hangul Syllable GYAGS"/* AC3B */, /*17342*/"Hangul Syllable GYAN"/* AC3C */,/*17343*/"Hangul Syllable GYANJ"/* AC3D */, /*17344*/"Hangul Syllable GYANH"/* AC3E */,/*17345*/"Hangul Syllable GYAD"/* AC3F */, /*17346*/"Hangul Syllable GYAL"/* AC40 */,/*17347*/"Hangul Syllable GYALG"/* AC41 */, /*17348*/"Hangul Syllable GYALM"/* AC42 */,/*17349*/"Hangul Syllable GYALB"/* AC43 */, /*17350*/"Hangul Syllable GYALS"/* AC44 */,/*17351*/"Hangul Syllable GYALT"/* AC45 */, /*17352*/"Hangul Syllable GYALP"/* AC46 */,/*17353*/"Hangul Syllable GYALH"/* AC47 */, /*17354*/"Hangul Syllable GYAM"/* AC48 */,/*17355*/"Hangul Syllable GYAB"/* AC49 */, /*17356*/"Hangul Syllable GYABS"/* AC4A */,/*17357*/"Hangul Syllable GYAS"/* AC4B */, /*17358*/"Hangul Syllable GYASS"/* AC4C */,/*17359*/"Hangul Syllable GYANG"/* AC4D */, /*17360*/"Hangul Syllable GYAJ"/* AC4E */,/*17361*/"Hangul Syllable GYAC"/* AC4F */, /*17362*/"Hangul Syllable GYAK"/* AC50 */,/*17363*/"Hangul Syllable GYAT"/* AC51 */, /*17364*/"Hangul Syllable GYAP"/* AC52 */,/*17365*/"Hangul Syllable GYAH"/* AC53 */, /*17366*/"Hangul Syllable GYAE"/* AC54 */,/*17367*/"Hangul Syllable GYAEG"/* AC55 */, /*17368*/"Hangul Syllable GYAEGG"/* AC56 */,/*17369*/"Hangul Syllable GYAEGS"/* AC57 */, /*17370*/"Hangul Syllable GYAEN"/* AC58 */,/*17371*/"Hangul Syllable GYAENJ"/* AC59 */, /*17372*/"Hangul Syllable GYAENH"/* AC5A */,/*17373*/"Hangul Syllable GYAED"/* AC5B */, /*17374*/"Hangul Syllable GYAEL"/* AC5C */,/*17375*/"Hangul Syllable GYAELG"/* AC5D */, /*17376*/"Hangul Syllable GYAELM"/* AC5E */,/*17377*/"Hangul Syllable GYAELB"/* AC5F */, /*17378*/"Hangul Syllable GYAELS"/* AC60 */,/*17379*/"Hangul Syllable GYAELT"/* AC61 */, /*17380*/"Hangul Syllable GYAELP"/* AC62 */,/*17381*/"Hangul Syllable GYAELH"/* AC63 */, /*17382*/"Hangul Syllable GYAEM"/* AC64 */,/*17383*/"Hangul Syllable GYAEB"/* AC65 */, /*17384*/"Hangul Syllable GYAEBS"/* AC66 */,/*17385*/"Hangul Syllable GYAES"/* AC67 */, /*17386*/"Hangul Syllable GYAESS"/* AC68 */,/*17387*/"Hangul Syllable GYAENG"/* AC69 */, /*17388*/"Hangul Syllable GYAEJ"/* AC6A */,/*17389*/"Hangul Syllable GYAEC"/* AC6B */, /*17390*/"Hangul Syllable GYAEK"/* AC6C */,/*17391*/"Hangul Syllable GYAET"/* AC6D */, /*17392*/"Hangul Syllable GYAEP"/* AC6E */,/*17393*/"Hangul Syllable GYAEH"/* AC6F */, /*17394*/"Hangul Syllable GEO"/* AC70 */,/*17395*/"Hangul Syllable GEOG"/* AC71 */, /*17396*/"Hangul Syllable GEOGG"/* AC72 */,/*17397*/"Hangul Syllable GEOGS"/* AC73 */, /*17398*/"Hangul Syllable GEON"/* AC74 */,/*17399*/"Hangul Syllable GEONJ"/* AC75 */, /*17400*/"Hangul Syllable GEONH"/* AC76 */,/*17401*/"Hangul Syllable GEOD"/* AC77 */, /*17402*/"Hangul Syllable GEOL"/* AC78 */,/*17403*/"Hangul Syllable GEOLG"/* AC79 */, /*17404*/"Hangul Syllable GEOLM"/* AC7A */,/*17405*/"Hangul Syllable GEOLB"/* AC7B */, /*17406*/"Hangul Syllable GEOLS"/* AC7C */,/*17407*/"Hangul Syllable GEOLT"/* AC7D */, /*17408*/"Hangul Syllable GEOLP"/* AC7E */,/*17409*/"Hangul Syllable GEOLH"/* AC7F */, /*17410*/"Hangul Syllable GEOM"/* AC80 */,/*17411*/"Hangul Syllable GEOB"/* AC81 */, /*17412*/"Hangul Syllable GEOBS"/* AC82 */,/*17413*/"Hangul Syllable GEOS"/* AC83 */, /*17414*/"Hangul Syllable GEOSS"/* AC84 */,/*17415*/"Hangul Syllable GEONG"/* AC85 */, /*17416*/"Hangul Syllable GEOJ"/* AC86 */,/*17417*/"Hangul Syllable GEOC"/* AC87 */, /*17418*/"Hangul Syllable GEOK"/* AC88 */,/*17419*/"Hangul Syllable GEOT"/* AC89 */, /*17420*/"Hangul Syllable GEOP"/* AC8A */,/*17421*/"Hangul Syllable GEOH"/* AC8B */, /*17422*/"Hangul Syllable GE"/* AC8C */,/*17423*/"Hangul Syllable GEG"/* AC8D */, /*17424*/"Hangul Syllable GEGG"/* AC8E */,/*17425*/"Hangul Syllable GEGS"/* AC8F */, /*17426*/"Hangul Syllable GEN"/* AC90 */,/*17427*/"Hangul Syllable GENJ"/* AC91 */, /*17428*/"Hangul Syllable GENH"/* AC92 */,/*17429*/"Hangul Syllable GED"/* AC93 */, /*17430*/"Hangul Syllable GEL"/* AC94 */,/*17431*/"Hangul Syllable GELG"/* AC95 */, /*17432*/"Hangul Syllable GELM"/* AC96 */,/*17433*/"Hangul Syllable GELB"/* AC97 */, /*17434*/"Hangul Syllable GELS"/* AC98 */,/*17435*/"Hangul Syllable GELT"/* AC99 */, /*17436*/"Hangul Syllable GELP"/* AC9A */,/*17437*/"Hangul Syllable GELH"/* AC9B */, /*17438*/"Hangul Syllable GEM"/* AC9C */,/*17439*/"Hangul Syllable GEB"/* AC9D */, /*17440*/"Hangul Syllable GEBS"/* AC9E */,/*17441*/"Hangul Syllable GES"/* AC9F */, /*17442*/"Hangul Syllable GESS"/* ACA0 */,/*17443*/"Hangul Syllable GENG"/* ACA1 */, /*17444*/"Hangul Syllable GEJ"/* ACA2 */,/*17445*/"Hangul Syllable GEC"/* ACA3 */, /*17446*/"Hangul Syllable GEK"/* ACA4 */,/*17447*/"Hangul Syllable GET"/* ACA5 */, /*17448*/"Hangul Syllable GEP"/* ACA6 */,/*17449*/"Hangul Syllable GEH"/* ACA7 */, /*17450*/"Hangul Syllable GYEO"/* ACA8 */,/*17451*/"Hangul Syllable GYEOG"/* ACA9 */, /*17452*/"Hangul Syllable GYEOGG"/* ACAA */,/*17453*/"Hangul Syllable GYEOGS"/* ACAB */, /*17454*/"Hangul Syllable GYEON"/* ACAC */,/*17455*/"Hangul Syllable GYEONJ"/* ACAD */, /*17456*/"Hangul Syllable GYEONH"/* ACAE */,/*17457*/"Hangul Syllable GYEOD"/* ACAF */, /*17458*/"Hangul Syllable GYEOL"/* ACB0 */,/*17459*/"Hangul Syllable GYEOLG"/* ACB1 */, /*17460*/"Hangul Syllable GYEOLM"/* ACB2 */,/*17461*/"Hangul Syllable GYEOLB"/* ACB3 */, /*17462*/"Hangul Syllable GYEOLS"/* ACB4 */,/*17463*/"Hangul Syllable GYEOLT"/* ACB5 */, /*17464*/"Hangul Syllable GYEOLP"/* ACB6 */,/*17465*/"Hangul Syllable GYEOLH"/* ACB7 */, /*17466*/"Hangul Syllable GYEOM"/* ACB8 */,/*17467*/"Hangul Syllable GYEOB"/* ACB9 */, /*17468*/"Hangul Syllable GYEOBS"/* ACBA */,/*17469*/"Hangul Syllable GYEOS"/* ACBB */, /*17470*/"Hangul Syllable GYEOSS"/* ACBC */,/*17471*/"Hangul Syllable GYEONG"/* ACBD */, /*17472*/"Hangul Syllable GYEOJ"/* ACBE */,/*17473*/"Hangul Syllable GYEOC"/* ACBF */, /*17474*/"Hangul Syllable GYEOK"/* ACC0 */,/*17475*/"Hangul Syllable GYEOT"/* ACC1 */, /*17476*/"Hangul Syllable GYEOP"/* ACC2 */,/*17477*/"Hangul Syllable GYEOH"/* ACC3 */, /*17478*/"Hangul Syllable GYE"/* ACC4 */,/*17479*/"Hangul Syllable GYEG"/* ACC5 */, /*17480*/"Hangul Syllable GYEGG"/* ACC6 */,/*17481*/"Hangul Syllable GYEGS"/* ACC7 */, /*17482*/"Hangul Syllable GYEN"/* ACC8 */,/*17483*/"Hangul Syllable GYENJ"/* ACC9 */, /*17484*/"Hangul Syllable GYENH"/* ACCA */,/*17485*/"Hangul Syllable GYED"/* ACCB */, /*17486*/"Hangul Syllable GYEL"/* ACCC */,/*17487*/"Hangul Syllable GYELG"/* ACCD */, /*17488*/"Hangul Syllable GYELM"/* ACCE */,/*17489*/"Hangul Syllable GYELB"/* ACCF */, /*17490*/"Hangul Syllable GYELS"/* ACD0 */,/*17491*/"Hangul Syllable GYELT"/* ACD1 */, /*17492*/"Hangul Syllable GYELP"/* ACD2 */,/*17493*/"Hangul Syllable GYELH"/* ACD3 */, /*17494*/"Hangul Syllable GYEM"/* ACD4 */,/*17495*/"Hangul Syllable GYEB"/* ACD5 */, /*17496*/"Hangul Syllable GYEBS"/* ACD6 */,/*17497*/"Hangul Syllable GYES"/* ACD7 */, /*17498*/"Hangul Syllable GYESS"/* ACD8 */,/*17499*/"Hangul Syllable GYENG"/* ACD9 */, /*17500*/"Hangul Syllable GYEJ"/* ACDA */,/*17501*/"Hangul Syllable GYEC"/* ACDB */, /*17502*/"Hangul Syllable GYEK"/* ACDC */,/*17503*/"Hangul Syllable GYET"/* ACDD */, /*17504*/"Hangul Syllable GYEP"/* ACDE */,/*17505*/"Hangul Syllable GYEH"/* ACDF */, /*17506*/"Hangul Syllable GO"/* ACE0 */,/*17507*/"Hangul Syllable GOG"/* ACE1 */, /*17508*/"Hangul Syllable GOGG"/* ACE2 */,/*17509*/"Hangul Syllable GOGS"/* ACE3 */, /*17510*/"Hangul Syllable GON"/* ACE4 */,/*17511*/"Hangul Syllable GONJ"/* ACE5 */, /*17512*/"Hangul Syllable GONH"/* ACE6 */,/*17513*/"Hangul Syllable GOD"/* ACE7 */, /*17514*/"Hangul Syllable GOL"/* ACE8 */,/*17515*/"Hangul Syllable GOLG"/* ACE9 */, /*17516*/"Hangul Syllable GOLM"/* ACEA */,/*17517*/"Hangul Syllable GOLB"/* ACEB */, /*17518*/"Hangul Syllable GOLS"/* ACEC */,/*17519*/"Hangul Syllable GOLT"/* ACED */, /*17520*/"Hangul Syllable GOLP"/* ACEE */,/*17521*/"Hangul Syllable GOLH"/* ACEF */, /*17522*/"Hangul Syllable GOM"/* ACF0 */,/*17523*/"Hangul Syllable GOB"/* ACF1 */, /*17524*/"Hangul Syllable GOBS"/* ACF2 */,/*17525*/"Hangul Syllable GOS"/* ACF3 */, /*17526*/"Hangul Syllable GOSS"/* ACF4 */,/*17527*/"Hangul Syllable GONG"/* ACF5 */, /*17528*/"Hangul Syllable GOJ"/* ACF6 */,/*17529*/"Hangul Syllable GOC"/* ACF7 */, /*17530*/"Hangul Syllable GOK"/* ACF8 */,/*17531*/"Hangul Syllable GOT"/* ACF9 */, /*17532*/"Hangul Syllable GOP"/* ACFA */,/*17533*/"Hangul Syllable GOH"/* ACFB */, /*17534*/"Hangul Syllable GWA"/* ACFC */,/*17535*/"Hangul Syllable GWAG"/* ACFD */, /*17536*/"Hangul Syllable GWAGG"/* ACFE */,/*17537*/"Hangul Syllable GWAGS"/* ACFF */, /*17538*/"Hangul Syllable GWAN"/* AD00 */,/*17539*/"Hangul Syllable GWANJ"/* AD01 */, /*17540*/"Hangul Syllable GWANH"/* AD02 */,/*17541*/"Hangul Syllable GWAD"/* AD03 */, /*17542*/"Hangul Syllable GWAL"/* AD04 */,/*17543*/"Hangul Syllable GWALG"/* AD05 */, /*17544*/"Hangul Syllable GWALM"/* AD06 */,/*17545*/"Hangul Syllable GWALB"/* AD07 */, /*17546*/"Hangul Syllable GWALS"/* AD08 */,/*17547*/"Hangul Syllable GWALT"/* AD09 */, /*17548*/"Hangul Syllable GWALP"/* AD0A */,/*17549*/"Hangul Syllable GWALH"/* AD0B */, /*17550*/"Hangul Syllable GWAM"/* AD0C */,/*17551*/"Hangul Syllable GWAB"/* AD0D */, /*17552*/"Hangul Syllable GWABS"/* AD0E */,/*17553*/"Hangul Syllable GWAS"/* AD0F */, /*17554*/"Hangul Syllable GWASS"/* AD10 */,/*17555*/"Hangul Syllable GWANG"/* AD11 */, /*17556*/"Hangul Syllable GWAJ"/* AD12 */,/*17557*/"Hangul Syllable GWAC"/* AD13 */, /*17558*/"Hangul Syllable GWAK"/* AD14 */,/*17559*/"Hangul Syllable GWAT"/* AD15 */, /*17560*/"Hangul Syllable GWAP"/* AD16 */,/*17561*/"Hangul Syllable GWAH"/* AD17 */, /*17562*/"Hangul Syllable GWAE"/* AD18 */,/*17563*/"Hangul Syllable GWAEG"/* AD19 */, /*17564*/"Hangul Syllable GWAEGG"/* AD1A */,/*17565*/"Hangul Syllable GWAEGS"/* AD1B */, /*17566*/"Hangul Syllable GWAEN"/* AD1C */,/*17567*/"Hangul Syllable GWAENJ"/* AD1D */, /*17568*/"Hangul Syllable GWAENH"/* AD1E */,/*17569*/"Hangul Syllable GWAED"/* AD1F */, /*17570*/"Hangul Syllable GWAEL"/* AD20 */,/*17571*/"Hangul Syllable GWAELG"/* AD21 */, /*17572*/"Hangul Syllable GWAELM"/* AD22 */,/*17573*/"Hangul Syllable GWAELB"/* AD23 */, /*17574*/"Hangul Syllable GWAELS"/* AD24 */,/*17575*/"Hangul Syllable GWAELT"/* AD25 */, /*17576*/"Hangul Syllable GWAELP"/* AD26 */,/*17577*/"Hangul Syllable GWAELH"/* AD27 */, /*17578*/"Hangul Syllable GWAEM"/* AD28 */,/*17579*/"Hangul Syllable GWAEB"/* AD29 */, /*17580*/"Hangul Syllable GWAEBS"/* AD2A */,/*17581*/"Hangul Syllable GWAES"/* AD2B */, /*17582*/"Hangul Syllable GWAESS"/* AD2C */,/*17583*/"Hangul Syllable GWAENG"/* AD2D */, /*17584*/"Hangul Syllable GWAEJ"/* AD2E */,/*17585*/"Hangul Syllable GWAEC"/* AD2F */, /*17586*/"Hangul Syllable GWAEK"/* AD30 */,/*17587*/"Hangul Syllable GWAET"/* AD31 */, /*17588*/"Hangul Syllable GWAEP"/* AD32 */,/*17589*/"Hangul Syllable GWAEH"/* AD33 */, /*17590*/"Hangul Syllable GOE"/* AD34 */,/*17591*/"Hangul Syllable GOEG"/* AD35 */, /*17592*/"Hangul Syllable GOEGG"/* AD36 */,/*17593*/"Hangul Syllable GOEGS"/* AD37 */, /*17594*/"Hangul Syllable GOEN"/* AD38 */,/*17595*/"Hangul Syllable GOENJ"/* AD39 */, /*17596*/"Hangul Syllable GOENH"/* AD3A */,/*17597*/"Hangul Syllable GOED"/* AD3B */, /*17598*/"Hangul Syllable GOEL"/* AD3C */,/*17599*/"Hangul Syllable GOELG"/* AD3D */, /*17600*/"Hangul Syllable GOELM"/* AD3E */,/*17601*/"Hangul Syllable GOELB"/* AD3F */, /*17602*/"Hangul Syllable GOELS"/* AD40 */,/*17603*/"Hangul Syllable GOELT"/* AD41 */, /*17604*/"Hangul Syllable GOELP"/* AD42 */,/*17605*/"Hangul Syllable GOELH"/* AD43 */, /*17606*/"Hangul Syllable GOEM"/* AD44 */,/*17607*/"Hangul Syllable GOEB"/* AD45 */, /*17608*/"Hangul Syllable GOEBS"/* AD46 */,/*17609*/"Hangul Syllable GOES"/* AD47 */, /*17610*/"Hangul Syllable GOESS"/* AD48 */,/*17611*/"Hangul Syllable GOENG"/* AD49 */, /*17612*/"Hangul Syllable GOEJ"/* AD4A */,/*17613*/"Hangul Syllable GOEC"/* AD4B */, /*17614*/"Hangul Syllable GOEK"/* AD4C */,/*17615*/"Hangul Syllable GOET"/* AD4D */, /*17616*/"Hangul Syllable GOEP"/* AD4E */,/*17617*/"Hangul Syllable GOEH"/* AD4F */, /*17618*/"Hangul Syllable GYO"/* AD50 */,/*17619*/"Hangul Syllable GYOG"/* AD51 */, /*17620*/"Hangul Syllable GYOGG"/* AD52 */,/*17621*/"Hangul Syllable GYOGS"/* AD53 */, /*17622*/"Hangul Syllable GYON"/* AD54 */,/*17623*/"Hangul Syllable GYONJ"/* AD55 */, /*17624*/"Hangul Syllable GYONH"/* AD56 */,/*17625*/"Hangul Syllable GYOD"/* AD57 */, /*17626*/"Hangul Syllable GYOL"/* AD58 */,/*17627*/"Hangul Syllable GYOLG"/* AD59 */, /*17628*/"Hangul Syllable GYOLM"/* AD5A */,/*17629*/"Hangul Syllable GYOLB"/* AD5B */, /*17630*/"Hangul Syllable GYOLS"/* AD5C */,/*17631*/"Hangul Syllable GYOLT"/* AD5D */, /*17632*/"Hangul Syllable GYOLP"/* AD5E */,/*17633*/"Hangul Syllable GYOLH"/* AD5F */, /*17634*/"Hangul Syllable GYOM"/* AD60 */,/*17635*/"Hangul Syllable GYOB"/* AD61 */, /*17636*/"Hangul Syllable GYOBS"/* AD62 */,/*17637*/"Hangul Syllable GYOS"/* AD63 */, /*17638*/"Hangul Syllable GYOSS"/* AD64 */,/*17639*/"Hangul Syllable GYONG"/* AD65 */, /*17640*/"Hangul Syllable GYOJ"/* AD66 */,/*17641*/"Hangul Syllable GYOC"/* AD67 */, /*17642*/"Hangul Syllable GYOK"/* AD68 */,/*17643*/"Hangul Syllable GYOT"/* AD69 */, /*17644*/"Hangul Syllable GYOP"/* AD6A */,/*17645*/"Hangul Syllable GYOH"/* AD6B */, /*17646*/"Hangul Syllable GU"/* AD6C */,/*17647*/"Hangul Syllable GUG"/* AD6D */, /*17648*/"Hangul Syllable GUGG"/* AD6E */,/*17649*/"Hangul Syllable GUGS"/* AD6F */, /*17650*/"Hangul Syllable GUN"/* AD70 */,/*17651*/"Hangul Syllable GUNJ"/* AD71 */, /*17652*/"Hangul Syllable GUNH"/* AD72 */,/*17653*/"Hangul Syllable GUD"/* AD73 */, /*17654*/"Hangul Syllable GUL"/* AD74 */,/*17655*/"Hangul Syllable GULG"/* AD75 */, /*17656*/"Hangul Syllable GULM"/* AD76 */,/*17657*/"Hangul Syllable GULB"/* AD77 */, /*17658*/"Hangul Syllable GULS"/* AD78 */,/*17659*/"Hangul Syllable GULT"/* AD79 */, /*17660*/"Hangul Syllable GULP"/* AD7A */,/*17661*/"Hangul Syllable GULH"/* AD7B */, /*17662*/"Hangul Syllable GUM"/* AD7C */,/*17663*/"Hangul Syllable GUB"/* AD7D */, /*17664*/"Hangul Syllable GUBS"/* AD7E */,/*17665*/"Hangul Syllable GUS"/* AD7F */, /*17666*/"Hangul Syllable GUSS"/* AD80 */,/*17667*/"Hangul Syllable GUNG"/* AD81 */, /*17668*/"Hangul Syllable GUJ"/* AD82 */,/*17669*/"Hangul Syllable GUC"/* AD83 */, /*17670*/"Hangul Syllable GUK"/* AD84 */,/*17671*/"Hangul Syllable GUT"/* AD85 */, /*17672*/"Hangul Syllable GUP"/* AD86 */,/*17673*/"Hangul Syllable GUH"/* AD87 */, /*17674*/"Hangul Syllable GWEO"/* AD88 */,/*17675*/"Hangul Syllable GWEOG"/* AD89 */, /*17676*/"Hangul Syllable GWEOGG"/* AD8A */,/*17677*/"Hangul Syllable GWEOGS"/* AD8B */, /*17678*/"Hangul Syllable GWEON"/* AD8C */,/*17679*/"Hangul Syllable GWEONJ"/* AD8D */, /*17680*/"Hangul Syllable GWEONH"/* AD8E */,/*17681*/"Hangul Syllable GWEOD"/* AD8F */, /*17682*/"Hangul Syllable GWEOL"/* AD90 */,/*17683*/"Hangul Syllable GWEOLG"/* AD91 */, /*17684*/"Hangul Syllable GWEOLM"/* AD92 */,/*17685*/"Hangul Syllable GWEOLB"/* AD93 */, /*17686*/"Hangul Syllable GWEOLS"/* AD94 */,/*17687*/"Hangul Syllable GWEOLT"/* AD95 */, /*17688*/"Hangul Syllable GWEOLP"/* AD96 */,/*17689*/"Hangul Syllable GWEOLH"/* AD97 */, /*17690*/"Hangul Syllable GWEOM"/* AD98 */,/*17691*/"Hangul Syllable GWEOB"/* AD99 */, /*17692*/"Hangul Syllable GWEOBS"/* AD9A */,/*17693*/"Hangul Syllable GWEOS"/* AD9B */, /*17694*/"Hangul Syllable GWEOSS"/* AD9C */,/*17695*/"Hangul Syllable GWEONG"/* AD9D */, /*17696*/"Hangul Syllable GWEOJ"/* AD9E */,/*17697*/"Hangul Syllable GWEOC"/* AD9F */, /*17698*/"Hangul Syllable GWEOK"/* ADA0 */,/*17699*/"Hangul Syllable GWEOT"/* ADA1 */, /*17700*/"Hangul Syllable GWEOP"/* ADA2 */,/*17701*/"Hangul Syllable GWEOH"/* ADA3 */, /*17702*/"Hangul Syllable GWE"/* ADA4 */,/*17703*/"Hangul Syllable GWEG"/* ADA5 */, /*17704*/"Hangul Syllable GWEGG"/* ADA6 */,/*17705*/"Hangul Syllable GWEGS"/* ADA7 */, /*17706*/"Hangul Syllable GWEN"/* ADA8 */,/*17707*/"Hangul Syllable GWENJ"/* ADA9 */, /*17708*/"Hangul Syllable GWENH"/* ADAA */,/*17709*/"Hangul Syllable GWED"/* ADAB */, /*17710*/"Hangul Syllable GWEL"/* ADAC */,/*17711*/"Hangul Syllable GWELG"/* ADAD */, /*17712*/"Hangul Syllable GWELM"/* ADAE */,/*17713*/"Hangul Syllable GWELB"/* ADAF */, /*17714*/"Hangul Syllable GWELS"/* ADB0 */,/*17715*/"Hangul Syllable GWELT"/* ADB1 */, /*17716*/"Hangul Syllable GWELP"/* ADB2 */,/*17717*/"Hangul Syllable GWELH"/* ADB3 */, /*17718*/"Hangul Syllable GWEM"/* ADB4 */,/*17719*/"Hangul Syllable GWEB"/* ADB5 */, /*17720*/"Hangul Syllable GWEBS"/* ADB6 */,/*17721*/"Hangul Syllable GWES"/* ADB7 */, /*17722*/"Hangul Syllable GWESS"/* ADB8 */,/*17723*/"Hangul Syllable GWENG"/* ADB9 */, /*17724*/"Hangul Syllable GWEJ"/* ADBA */,/*17725*/"Hangul Syllable GWEC"/* ADBB */, /*17726*/"Hangul Syllable GWEK"/* ADBC */,/*17727*/"Hangul Syllable GWET"/* ADBD */, /*17728*/"Hangul Syllable GWEP"/* ADBE */,/*17729*/"Hangul Syllable GWEH"/* ADBF */, /*17730*/"Hangul Syllable GWI"/* ADC0 */,/*17731*/"Hangul Syllable GWIG"/* ADC1 */, /*17732*/"Hangul Syllable GWIGG"/* ADC2 */,/*17733*/"Hangul Syllable GWIGS"/* ADC3 */, /*17734*/"Hangul Syllable GWIN"/* ADC4 */,/*17735*/"Hangul Syllable GWINJ"/* ADC5 */, /*17736*/"Hangul Syllable GWINH"/* ADC6 */,/*17737*/"Hangul Syllable GWID"/* ADC7 */, /*17738*/"Hangul Syllable GWIL"/* ADC8 */,/*17739*/"Hangul Syllable GWILG"/* ADC9 */, /*17740*/"Hangul Syllable GWILM"/* ADCA */,/*17741*/"Hangul Syllable GWILB"/* ADCB */, /*17742*/"Hangul Syllable GWILS"/* ADCC */,/*17743*/"Hangul Syllable GWILT"/* ADCD */, /*17744*/"Hangul Syllable GWILP"/* ADCE */,/*17745*/"Hangul Syllable GWILH"/* ADCF */, /*17746*/"Hangul Syllable GWIM"/* ADD0 */,/*17747*/"Hangul Syllable GWIB"/* ADD1 */, /*17748*/"Hangul Syllable GWIBS"/* ADD2 */,/*17749*/"Hangul Syllable GWIS"/* ADD3 */, /*17750*/"Hangul Syllable GWISS"/* ADD4 */,/*17751*/"Hangul Syllable GWING"/* ADD5 */, /*17752*/"Hangul Syllable GWIJ"/* ADD6 */,/*17753*/"Hangul Syllable GWIC"/* ADD7 */, /*17754*/"Hangul Syllable GWIK"/* ADD8 */,/*17755*/"Hangul Syllable GWIT"/* ADD9 */, /*17756*/"Hangul Syllable GWIP"/* ADDA */,/*17757*/"Hangul Syllable GWIH"/* ADDB */, /*17758*/"Hangul Syllable GYU"/* ADDC */,/*17759*/"Hangul Syllable GYUG"/* ADDD */, /*17760*/"Hangul Syllable GYUGG"/* ADDE */,/*17761*/"Hangul Syllable GYUGS"/* ADDF */, /*17762*/"Hangul Syllable GYUN"/* ADE0 */,/*17763*/"Hangul Syllable GYUNJ"/* ADE1 */, /*17764*/"Hangul Syllable GYUNH"/* ADE2 */,/*17765*/"Hangul Syllable GYUD"/* ADE3 */, /*17766*/"Hangul Syllable GYUL"/* ADE4 */,/*17767*/"Hangul Syllable GYULG"/* ADE5 */, /*17768*/"Hangul Syllable GYULM"/* ADE6 */,/*17769*/"Hangul Syllable GYULB"/* ADE7 */, /*17770*/"Hangul Syllable GYULS"/* ADE8 */,/*17771*/"Hangul Syllable GYULT"/* ADE9 */, /*17772*/"Hangul Syllable GYULP"/* ADEA */,/*17773*/"Hangul Syllable GYULH"/* ADEB */, /*17774*/"Hangul Syllable GYUM"/* ADEC */,/*17775*/"Hangul Syllable GYUB"/* ADED */, /*17776*/"Hangul Syllable GYUBS"/* ADEE */,/*17777*/"Hangul Syllable GYUS"/* ADEF */, /*17778*/"Hangul Syllable GYUSS"/* ADF0 */,/*17779*/"Hangul Syllable GYUNG"/* ADF1 */, /*17780*/"Hangul Syllable GYUJ"/* ADF2 */,/*17781*/"Hangul Syllable GYUC"/* ADF3 */, /*17782*/"Hangul Syllable GYUK"/* ADF4 */,/*17783*/"Hangul Syllable GYUT"/* ADF5 */, /*17784*/"Hangul Syllable GYUP"/* ADF6 */,/*17785*/"Hangul Syllable GYUH"/* ADF7 */, /*17786*/"Hangul Syllable GEU"/* ADF8 */,/*17787*/"Hangul Syllable GEUG"/* ADF9 */, /*17788*/"Hangul Syllable GEUGG"/* ADFA */,/*17789*/"Hangul Syllable GEUGS"/* ADFB */, /*17790*/"Hangul Syllable GEUN"/* ADFC */,/*17791*/"Hangul Syllable GEUNJ"/* ADFD */, /*17792*/"Hangul Syllable GEUNH"/* ADFE */,/*17793*/"Hangul Syllable GEUD"/* ADFF */, /*17794*/"Hangul Syllable GEUL"/* AE00 */,/*17795*/"Hangul Syllable GEULG"/* AE01 */, /*17796*/"Hangul Syllable GEULM"/* AE02 */,/*17797*/"Hangul Syllable GEULB"/* AE03 */, /*17798*/"Hangul Syllable GEULS"/* AE04 */,/*17799*/"Hangul Syllable GEULT"/* AE05 */, /*17800*/"Hangul Syllable GEULP"/* AE06 */,/*17801*/"Hangul Syllable GEULH"/* AE07 */, /*17802*/"Hangul Syllable GEUM"/* AE08 */,/*17803*/"Hangul Syllable GEUB"/* AE09 */, /*17804*/"Hangul Syllable GEUBS"/* AE0A */,/*17805*/"Hangul Syllable GEUS"/* AE0B */, /*17806*/"Hangul Syllable GEUSS"/* AE0C */,/*17807*/"Hangul Syllable GEUNG"/* AE0D */, /*17808*/"Hangul Syllable GEUJ"/* AE0E */,/*17809*/"Hangul Syllable GEUC"/* AE0F */, /*17810*/"Hangul Syllable GEUK"/* AE10 */,/*17811*/"Hangul Syllable GEUT"/* AE11 */, /*17812*/"Hangul Syllable GEUP"/* AE12 */,/*17813*/"Hangul Syllable GEUH"/* AE13 */, /*17814*/"Hangul Syllable GYI"/* AE14 */,/*17815*/"Hangul Syllable GYIG"/* AE15 */, /*17816*/"Hangul Syllable GYIGG"/* AE16 */,/*17817*/"Hangul Syllable GYIGS"/* AE17 */, /*17818*/"Hangul Syllable GYIN"/* AE18 */,/*17819*/"Hangul Syllable GYINJ"/* AE19 */, /*17820*/"Hangul Syllable GYINH"/* AE1A */,/*17821*/"Hangul Syllable GYID"/* AE1B */, /*17822*/"Hangul Syllable GYIL"/* AE1C */,/*17823*/"Hangul Syllable GYILG"/* AE1D */, /*17824*/"Hangul Syllable GYILM"/* AE1E */,/*17825*/"Hangul Syllable GYILB"/* AE1F */, /*17826*/"Hangul Syllable GYILS"/* AE20 */,/*17827*/"Hangul Syllable GYILT"/* AE21 */, /*17828*/"Hangul Syllable GYILP"/* AE22 */,/*17829*/"Hangul Syllable GYILH"/* AE23 */, /*17830*/"Hangul Syllable GYIM"/* AE24 */,/*17831*/"Hangul Syllable GYIB"/* AE25 */, /*17832*/"Hangul Syllable GYIBS"/* AE26 */,/*17833*/"Hangul Syllable GYIS"/* AE27 */, /*17834*/"Hangul Syllable GYISS"/* AE28 */,/*17835*/"Hangul Syllable GYING"/* AE29 */, /*17836*/"Hangul Syllable GYIJ"/* AE2A */,/*17837*/"Hangul Syllable GYIC"/* AE2B */, /*17838*/"Hangul Syllable GYIK"/* AE2C */,/*17839*/"Hangul Syllable GYIT"/* AE2D */, /*17840*/"Hangul Syllable GYIP"/* AE2E */,/*17841*/"Hangul Syllable GYIH"/* AE2F */, /*17842*/"Hangul Syllable GI"/* AE30 */,/*17843*/"Hangul Syllable GIG"/* AE31 */, /*17844*/"Hangul Syllable GIGG"/* AE32 */,/*17845*/"Hangul Syllable GIGS"/* AE33 */, /*17846*/"Hangul Syllable GIN"/* AE34 */,/*17847*/"Hangul Syllable GINJ"/* AE35 */, /*17848*/"Hangul Syllable GINH"/* AE36 */,/*17849*/"Hangul Syllable GID"/* AE37 */, /*17850*/"Hangul Syllable GIL"/* AE38 */,/*17851*/"Hangul Syllable GILG"/* AE39 */, /*17852*/"Hangul Syllable GILM"/* AE3A */,/*17853*/"Hangul Syllable GILB"/* AE3B */, /*17854*/"Hangul Syllable GILS"/* AE3C */,/*17855*/"Hangul Syllable GILT"/* AE3D */, /*17856*/"Hangul Syllable GILP"/* AE3E */,/*17857*/"Hangul Syllable GILH"/* AE3F */, /*17858*/"Hangul Syllable GIM"/* AE40 */,/*17859*/"Hangul Syllable GIB"/* AE41 */, /*17860*/"Hangul Syllable GIBS"/* AE42 */,/*17861*/"Hangul Syllable GIS"/* AE43 */, /*17862*/"Hangul Syllable GISS"/* AE44 */,/*17863*/"Hangul Syllable GING"/* AE45 */, /*17864*/"Hangul Syllable GIJ"/* AE46 */,/*17865*/"Hangul Syllable GIC"/* AE47 */, /*17866*/"Hangul Syllable GIK"/* AE48 */,/*17867*/"Hangul Syllable GIT"/* AE49 */, /*17868*/"Hangul Syllable GIP"/* AE4A */,/*17869*/"Hangul Syllable GIH"/* AE4B */, /*17870*/"Hangul Syllable GGA"/* AE4C */,/*17871*/"Hangul Syllable GGAG"/* AE4D */, /*17872*/"Hangul Syllable GGAGG"/* AE4E */,/*17873*/"Hangul Syllable GGAGS"/* AE4F */, /*17874*/"Hangul Syllable GGAN"/* AE50 */,/*17875*/"Hangul Syllable GGANJ"/* AE51 */, /*17876*/"Hangul Syllable GGANH"/* AE52 */,/*17877*/"Hangul Syllable GGAD"/* AE53 */, /*17878*/"Hangul Syllable GGAL"/* AE54 */,/*17879*/"Hangul Syllable GGALG"/* AE55 */, /*17880*/"Hangul Syllable GGALM"/* AE56 */,/*17881*/"Hangul Syllable GGALB"/* AE57 */, /*17882*/"Hangul Syllable GGALS"/* AE58 */,/*17883*/"Hangul Syllable GGALT"/* AE59 */, /*17884*/"Hangul Syllable GGALP"/* AE5A */,/*17885*/"Hangul Syllable GGALH"/* AE5B */, /*17886*/"Hangul Syllable GGAM"/* AE5C */,/*17887*/"Hangul Syllable GGAB"/* AE5D */, /*17888*/"Hangul Syllable GGABS"/* AE5E */,/*17889*/"Hangul Syllable GGAS"/* AE5F */, /*17890*/"Hangul Syllable GGASS"/* AE60 */,/*17891*/"Hangul Syllable GGANG"/* AE61 */, /*17892*/"Hangul Syllable GGAJ"/* AE62 */,/*17893*/"Hangul Syllable GGAC"/* AE63 */, /*17894*/"Hangul Syllable GGAK"/* AE64 */,/*17895*/"Hangul Syllable GGAT"/* AE65 */, /*17896*/"Hangul Syllable GGAP"/* AE66 */,/*17897*/"Hangul Syllable GGAH"/* AE67 */, /*17898*/"Hangul Syllable GGAE"/* AE68 */,/*17899*/"Hangul Syllable GGAEG"/* AE69 */, /*17900*/"Hangul Syllable GGAEGG"/* AE6A */,/*17901*/"Hangul Syllable GGAEGS"/* AE6B */, /*17902*/"Hangul Syllable GGAEN"/* AE6C */,/*17903*/"Hangul Syllable GGAENJ"/* AE6D */, /*17904*/"Hangul Syllable GGAENH"/* AE6E */,/*17905*/"Hangul Syllable GGAED"/* AE6F */, /*17906*/"Hangul Syllable GGAEL"/* AE70 */,/*17907*/"Hangul Syllable GGAELG"/* AE71 */, /*17908*/"Hangul Syllable GGAELM"/* AE72 */,/*17909*/"Hangul Syllable GGAELB"/* AE73 */, /*17910*/"Hangul Syllable GGAELS"/* AE74 */,/*17911*/"Hangul Syllable GGAELT"/* AE75 */, /*17912*/"Hangul Syllable GGAELP"/* AE76 */,/*17913*/"Hangul Syllable GGAELH"/* AE77 */, /*17914*/"Hangul Syllable GGAEM"/* AE78 */,/*17915*/"Hangul Syllable GGAEB"/* AE79 */, /*17916*/"Hangul Syllable GGAEBS"/* AE7A */,/*17917*/"Hangul Syllable GGAES"/* AE7B */, /*17918*/"Hangul Syllable GGAESS"/* AE7C */,/*17919*/"Hangul Syllable GGAENG"/* AE7D */, /*17920*/"Hangul Syllable GGAEJ"/* AE7E */,/*17921*/"Hangul Syllable GGAEC"/* AE7F */, /*17922*/"Hangul Syllable GGAEK"/* AE80 */,/*17923*/"Hangul Syllable GGAET"/* AE81 */, /*17924*/"Hangul Syllable GGAEP"/* AE82 */,/*17925*/"Hangul Syllable GGAEH"/* AE83 */, /*17926*/"Hangul Syllable GGYA"/* AE84 */,/*17927*/"Hangul Syllable GGYAG"/* AE85 */, /*17928*/"Hangul Syllable GGYAGG"/* AE86 */,/*17929*/"Hangul Syllable GGYAGS"/* AE87 */, /*17930*/"Hangul Syllable GGYAN"/* AE88 */,/*17931*/"Hangul Syllable GGYANJ"/* AE89 */, /*17932*/"Hangul Syllable GGYANH"/* AE8A */,/*17933*/"Hangul Syllable GGYAD"/* AE8B */, /*17934*/"Hangul Syllable GGYAL"/* AE8C */,/*17935*/"Hangul Syllable GGYALG"/* AE8D */, /*17936*/"Hangul Syllable GGYALM"/* AE8E */,/*17937*/"Hangul Syllable GGYALB"/* AE8F */, /*17938*/"Hangul Syllable GGYALS"/* AE90 */,/*17939*/"Hangul Syllable GGYALT"/* AE91 */, /*17940*/"Hangul Syllable GGYALP"/* AE92 */,/*17941*/"Hangul Syllable GGYALH"/* AE93 */, /*17942*/"Hangul Syllable GGYAM"/* AE94 */,/*17943*/"Hangul Syllable GGYAB"/* AE95 */, /*17944*/"Hangul Syllable GGYABS"/* AE96 */,/*17945*/"Hangul Syllable GGYAS"/* AE97 */, /*17946*/"Hangul Syllable GGYASS"/* AE98 */,/*17947*/"Hangul Syllable GGYANG"/* AE99 */, /*17948*/"Hangul Syllable GGYAJ"/* AE9A */,/*17949*/"Hangul Syllable GGYAC"/* AE9B */, /*17950*/"Hangul Syllable GGYAK"/* AE9C */,/*17951*/"Hangul Syllable GGYAT"/* AE9D */, /*17952*/"Hangul Syllable GGYAP"/* AE9E */,/*17953*/"Hangul Syllable GGYAH"/* AE9F */, /*17954*/"Hangul Syllable GGYAE"/* AEA0 */,/*17955*/"Hangul Syllable GGYAEG"/* AEA1 */, /*17956*/"Hangul Syllable GGYAEGG"/* AEA2 */,/*17957*/"Hangul Syllable GGYAEGS"/* AEA3 */, /*17958*/"Hangul Syllable GGYAEN"/* AEA4 */,/*17959*/"Hangul Syllable GGYAENJ"/* AEA5 */, /*17960*/"Hangul Syllable GGYAENH"/* AEA6 */,/*17961*/"Hangul Syllable GGYAED"/* AEA7 */, /*17962*/"Hangul Syllable GGYAEL"/* AEA8 */,/*17963*/"Hangul Syllable GGYAELG"/* AEA9 */, /*17964*/"Hangul Syllable GGYAELM"/* AEAA */,/*17965*/"Hangul Syllable GGYAELB"/* AEAB */, /*17966*/"Hangul Syllable GGYAELS"/* AEAC */,/*17967*/"Hangul Syllable GGYAELT"/* AEAD */, /*17968*/"Hangul Syllable GGYAELP"/* AEAE */,/*17969*/"Hangul Syllable GGYAELH"/* AEAF */, /*17970*/"Hangul Syllable GGYAEM"/* AEB0 */,/*17971*/"Hangul Syllable GGYAEB"/* AEB1 */, /*17972*/"Hangul Syllable GGYAEBS"/* AEB2 */,/*17973*/"Hangul Syllable GGYAES"/* AEB3 */, /*17974*/"Hangul Syllable GGYAESS"/* AEB4 */,/*17975*/"Hangul Syllable GGYAENG"/* AEB5 */, /*17976*/"Hangul Syllable GGYAEJ"/* AEB6 */,/*17977*/"Hangul Syllable GGYAEC"/* AEB7 */, /*17978*/"Hangul Syllable GGYAEK"/* AEB8 */,/*17979*/"Hangul Syllable GGYAET"/* AEB9 */, /*17980*/"Hangul Syllable GGYAEP"/* AEBA */,/*17981*/"Hangul Syllable GGYAEH"/* AEBB */, /*17982*/"Hangul Syllable GGEO"/* AEBC */,/*17983*/"Hangul Syllable GGEOG"/* AEBD */, /*17984*/"Hangul Syllable GGEOGG"/* AEBE */,/*17985*/"Hangul Syllable GGEOGS"/* AEBF */, /*17986*/"Hangul Syllable GGEON"/* AEC0 */,/*17987*/"Hangul Syllable GGEONJ"/* AEC1 */, /*17988*/"Hangul Syllable GGEONH"/* AEC2 */,/*17989*/"Hangul Syllable GGEOD"/* AEC3 */, /*17990*/"Hangul Syllable GGEOL"/* AEC4 */,/*17991*/"Hangul Syllable GGEOLG"/* AEC5 */, /*17992*/"Hangul Syllable GGEOLM"/* AEC6 */,/*17993*/"Hangul Syllable GGEOLB"/* AEC7 */, /*17994*/"Hangul Syllable GGEOLS"/* AEC8 */,/*17995*/"Hangul Syllable GGEOLT"/* AEC9 */, /*17996*/"Hangul Syllable GGEOLP"/* AECA */,/*17997*/"Hangul Syllable GGEOLH"/* AECB */, /*17998*/"Hangul Syllable GGEOM"/* AECC */,/*17999*/"Hangul Syllable GGEOB"/* AECD */, /*18000*/"Hangul Syllable GGEOBS"/* AECE */,/*18001*/"Hangul Syllable GGEOS"/* AECF */, /*18002*/"Hangul Syllable GGEOSS"/* AED0 */,/*18003*/"Hangul Syllable GGEONG"/* AED1 */, /*18004*/"Hangul Syllable GGEOJ"/* AED2 */,/*18005*/"Hangul Syllable GGEOC"/* AED3 */, /*18006*/"Hangul Syllable GGEOK"/* AED4 */,/*18007*/"Hangul Syllable GGEOT"/* AED5 */, /*18008*/"Hangul Syllable GGEOP"/* AED6 */,/*18009*/"Hangul Syllable GGEOH"/* AED7 */, /*18010*/"Hangul Syllable GGE"/* AED8 */,/*18011*/"Hangul Syllable GGEG"/* AED9 */, /*18012*/"Hangul Syllable GGEGG"/* AEDA */,/*18013*/"Hangul Syllable GGEGS"/* AEDB */, /*18014*/"Hangul Syllable GGEN"/* AEDC */,/*18015*/"Hangul Syllable GGENJ"/* AEDD */, /*18016*/"Hangul Syllable GGENH"/* AEDE */,/*18017*/"Hangul Syllable GGED"/* AEDF */, /*18018*/"Hangul Syllable GGEL"/* AEE0 */,/*18019*/"Hangul Syllable GGELG"/* AEE1 */, /*18020*/"Hangul Syllable GGELM"/* AEE2 */,/*18021*/"Hangul Syllable GGELB"/* AEE3 */, /*18022*/"Hangul Syllable GGELS"/* AEE4 */,/*18023*/"Hangul Syllable GGELT"/* AEE5 */, /*18024*/"Hangul Syllable GGELP"/* AEE6 */,/*18025*/"Hangul Syllable GGELH"/* AEE7 */, /*18026*/"Hangul Syllable GGEM"/* AEE8 */,/*18027*/"Hangul Syllable GGEB"/* AEE9 */, /*18028*/"Hangul Syllable GGEBS"/* AEEA */,/*18029*/"Hangul Syllable GGES"/* AEEB */, /*18030*/"Hangul Syllable GGESS"/* AEEC */,/*18031*/"Hangul Syllable GGENG"/* AEED */, /*18032*/"Hangul Syllable GGEJ"/* AEEE */,/*18033*/"Hangul Syllable GGEC"/* AEEF */, /*18034*/"Hangul Syllable GGEK"/* AEF0 */,/*18035*/"Hangul Syllable GGET"/* AEF1 */, /*18036*/"Hangul Syllable GGEP"/* AEF2 */,/*18037*/"Hangul Syllable GGEH"/* AEF3 */, /*18038*/"Hangul Syllable GGYEO"/* AEF4 */,/*18039*/"Hangul Syllable GGYEOG"/* AEF5 */, /*18040*/"Hangul Syllable GGYEOGG"/* AEF6 */,/*18041*/"Hangul Syllable GGYEOGS"/* AEF7 */, /*18042*/"Hangul Syllable GGYEON"/* AEF8 */,/*18043*/"Hangul Syllable GGYEONJ"/* AEF9 */, /*18044*/"Hangul Syllable GGYEONH"/* AEFA */,/*18045*/"Hangul Syllable GGYEOD"/* AEFB */, /*18046*/"Hangul Syllable GGYEOL"/* AEFC */,/*18047*/"Hangul Syllable GGYEOLG"/* AEFD */, /*18048*/"Hangul Syllable GGYEOLM"/* AEFE */,/*18049*/"Hangul Syllable GGYEOLB"/* AEFF */, /*18050*/"Hangul Syllable GGYEOLS"/* AF00 */,/*18051*/"Hangul Syllable GGYEOLT"/* AF01 */, /*18052*/"Hangul Syllable GGYEOLP"/* AF02 */,/*18053*/"Hangul Syllable GGYEOLH"/* AF03 */, /*18054*/"Hangul Syllable GGYEOM"/* AF04 */,/*18055*/"Hangul Syllable GGYEOB"/* AF05 */, /*18056*/"Hangul Syllable GGYEOBS"/* AF06 */,/*18057*/"Hangul Syllable GGYEOS"/* AF07 */, /*18058*/"Hangul Syllable GGYEOSS"/* AF08 */,/*18059*/"Hangul Syllable GGYEONG"/* AF09 */, /*18060*/"Hangul Syllable GGYEOJ"/* AF0A */,/*18061*/"Hangul Syllable GGYEOC"/* AF0B */, /*18062*/"Hangul Syllable GGYEOK"/* AF0C */,/*18063*/"Hangul Syllable GGYEOT"/* AF0D */, /*18064*/"Hangul Syllable GGYEOP"/* AF0E */,/*18065*/"Hangul Syllable GGYEOH"/* AF0F */, /*18066*/"Hangul Syllable GGYE"/* AF10 */,/*18067*/"Hangul Syllable GGYEG"/* AF11 */, /*18068*/"Hangul Syllable GGYEGG"/* AF12 */,/*18069*/"Hangul Syllable GGYEGS"/* AF13 */, /*18070*/"Hangul Syllable GGYEN"/* AF14 */,/*18071*/"Hangul Syllable GGYENJ"/* AF15 */, /*18072*/"Hangul Syllable GGYENH"/* AF16 */,/*18073*/"Hangul Syllable GGYED"/* AF17 */, /*18074*/"Hangul Syllable GGYEL"/* AF18 */,/*18075*/"Hangul Syllable GGYELG"/* AF19 */, /*18076*/"Hangul Syllable GGYELM"/* AF1A */,/*18077*/"Hangul Syllable GGYELB"/* AF1B */, /*18078*/"Hangul Syllable GGYELS"/* AF1C */,/*18079*/"Hangul Syllable GGYELT"/* AF1D */, /*18080*/"Hangul Syllable GGYELP"/* AF1E */,/*18081*/"Hangul Syllable GGYELH"/* AF1F */, /*18082*/"Hangul Syllable GGYEM"/* AF20 */,/*18083*/"Hangul Syllable GGYEB"/* AF21 */, /*18084*/"Hangul Syllable GGYEBS"/* AF22 */,/*18085*/"Hangul Syllable GGYES"/* AF23 */, /*18086*/"Hangul Syllable GGYESS"/* AF24 */,/*18087*/"Hangul Syllable GGYENG"/* AF25 */, /*18088*/"Hangul Syllable GGYEJ"/* AF26 */,/*18089*/"Hangul Syllable GGYEC"/* AF27 */, /*18090*/"Hangul Syllable GGYEK"/* AF28 */,/*18091*/"Hangul Syllable GGYET"/* AF29 */, /*18092*/"Hangul Syllable GGYEP"/* AF2A */,/*18093*/"Hangul Syllable GGYEH"/* AF2B */, /*18094*/"Hangul Syllable GGO"/* AF2C */,/*18095*/"Hangul Syllable GGOG"/* AF2D */, /*18096*/"Hangul Syllable GGOGG"/* AF2E */,/*18097*/"Hangul Syllable GGOGS"/* AF2F */, /*18098*/"Hangul Syllable GGON"/* AF30 */,/*18099*/"Hangul Syllable GGONJ"/* AF31 */, /*18100*/"Hangul Syllable GGONH"/* AF32 */,/*18101*/"Hangul Syllable GGOD"/* AF33 */, /*18102*/"Hangul Syllable GGOL"/* AF34 */,/*18103*/"Hangul Syllable GGOLG"/* AF35 */, /*18104*/"Hangul Syllable GGOLM"/* AF36 */,/*18105*/"Hangul Syllable GGOLB"/* AF37 */, /*18106*/"Hangul Syllable GGOLS"/* AF38 */,/*18107*/"Hangul Syllable GGOLT"/* AF39 */, /*18108*/"Hangul Syllable GGOLP"/* AF3A */,/*18109*/"Hangul Syllable GGOLH"/* AF3B */, /*18110*/"Hangul Syllable GGOM"/* AF3C */,/*18111*/"Hangul Syllable GGOB"/* AF3D */, /*18112*/"Hangul Syllable GGOBS"/* AF3E */,/*18113*/"Hangul Syllable GGOS"/* AF3F */, /*18114*/"Hangul Syllable GGOSS"/* AF40 */,/*18115*/"Hangul Syllable GGONG"/* AF41 */, /*18116*/"Hangul Syllable GGOJ"/* AF42 */,/*18117*/"Hangul Syllable GGOC"/* AF43 */, /*18118*/"Hangul Syllable GGOK"/* AF44 */,/*18119*/"Hangul Syllable GGOT"/* AF45 */, /*18120*/"Hangul Syllable GGOP"/* AF46 */,/*18121*/"Hangul Syllable GGOH"/* AF47 */, /*18122*/"Hangul Syllable GGWA"/* AF48 */,/*18123*/"Hangul Syllable GGWAG"/* AF49 */, /*18124*/"Hangul Syllable GGWAGG"/* AF4A */,/*18125*/"Hangul Syllable GGWAGS"/* AF4B */, /*18126*/"Hangul Syllable GGWAN"/* AF4C */,/*18127*/"Hangul Syllable GGWANJ"/* AF4D */, /*18128*/"Hangul Syllable GGWANH"/* AF4E */,/*18129*/"Hangul Syllable GGWAD"/* AF4F */, /*18130*/"Hangul Syllable GGWAL"/* AF50 */,/*18131*/"Hangul Syllable GGWALG"/* AF51 */, /*18132*/"Hangul Syllable GGWALM"/* AF52 */,/*18133*/"Hangul Syllable GGWALB"/* AF53 */, /*18134*/"Hangul Syllable GGWALS"/* AF54 */,/*18135*/"Hangul Syllable GGWALT"/* AF55 */, /*18136*/"Hangul Syllable GGWALP"/* AF56 */,/*18137*/"Hangul Syllable GGWALH"/* AF57 */, /*18138*/"Hangul Syllable GGWAM"/* AF58 */,/*18139*/"Hangul Syllable GGWAB"/* AF59 */, /*18140*/"Hangul Syllable GGWABS"/* AF5A */,/*18141*/"Hangul Syllable GGWAS"/* AF5B */, /*18142*/"Hangul Syllable GGWASS"/* AF5C */,/*18143*/"Hangul Syllable GGWANG"/* AF5D */, /*18144*/"Hangul Syllable GGWAJ"/* AF5E */,/*18145*/"Hangul Syllable GGWAC"/* AF5F */, /*18146*/"Hangul Syllable GGWAK"/* AF60 */,/*18147*/"Hangul Syllable GGWAT"/* AF61 */, /*18148*/"Hangul Syllable GGWAP"/* AF62 */,/*18149*/"Hangul Syllable GGWAH"/* AF63 */, /*18150*/"Hangul Syllable GGWAE"/* AF64 */,/*18151*/"Hangul Syllable GGWAEG"/* AF65 */, /*18152*/"Hangul Syllable GGWAEGG"/* AF66 */,/*18153*/"Hangul Syllable GGWAEGS"/* AF67 */, /*18154*/"Hangul Syllable GGWAEN"/* AF68 */,/*18155*/"Hangul Syllable GGWAENJ"/* AF69 */, /*18156*/"Hangul Syllable GGWAENH"/* AF6A */,/*18157*/"Hangul Syllable GGWAED"/* AF6B */, /*18158*/"Hangul Syllable GGWAEL"/* AF6C */,/*18159*/"Hangul Syllable GGWAELG"/* AF6D */, /*18160*/"Hangul Syllable GGWAELM"/* AF6E */,/*18161*/"Hangul Syllable GGWAELB"/* AF6F */, /*18162*/"Hangul Syllable GGWAELS"/* AF70 */,/*18163*/"Hangul Syllable GGWAELT"/* AF71 */, /*18164*/"Hangul Syllable GGWAELP"/* AF72 */,/*18165*/"Hangul Syllable GGWAELH"/* AF73 */, /*18166*/"Hangul Syllable GGWAEM"/* AF74 */,/*18167*/"Hangul Syllable GGWAEB"/* AF75 */, /*18168*/"Hangul Syllable GGWAEBS"/* AF76 */,/*18169*/"Hangul Syllable GGWAES"/* AF77 */, /*18170*/"Hangul Syllable GGWAESS"/* AF78 */,/*18171*/"Hangul Syllable GGWAENG"/* AF79 */, /*18172*/"Hangul Syllable GGWAEJ"/* AF7A */,/*18173*/"Hangul Syllable GGWAEC"/* AF7B */, /*18174*/"Hangul Syllable GGWAEK"/* AF7C */,/*18175*/"Hangul Syllable GGWAET"/* AF7D */, /*18176*/"Hangul Syllable GGWAEP"/* AF7E */,/*18177*/"Hangul Syllable GGWAEH"/* AF7F */, /*18178*/"Hangul Syllable GGOE"/* AF80 */,/*18179*/"Hangul Syllable GGOEG"/* AF81 */, /*18180*/"Hangul Syllable GGOEGG"/* AF82 */,/*18181*/"Hangul Syllable GGOEGS"/* AF83 */, /*18182*/"Hangul Syllable GGOEN"/* AF84 */,/*18183*/"Hangul Syllable GGOENJ"/* AF85 */, /*18184*/"Hangul Syllable GGOENH"/* AF86 */,/*18185*/"Hangul Syllable GGOED"/* AF87 */, /*18186*/"Hangul Syllable GGOEL"/* AF88 */,/*18187*/"Hangul Syllable GGOELG"/* AF89 */, /*18188*/"Hangul Syllable GGOELM"/* AF8A */,/*18189*/"Hangul Syllable GGOELB"/* AF8B */, /*18190*/"Hangul Syllable GGOELS"/* AF8C */,/*18191*/"Hangul Syllable GGOELT"/* AF8D */, /*18192*/"Hangul Syllable GGOELP"/* AF8E */,/*18193*/"Hangul Syllable GGOELH"/* AF8F */, /*18194*/"Hangul Syllable GGOEM"/* AF90 */,/*18195*/"Hangul Syllable GGOEB"/* AF91 */, /*18196*/"Hangul Syllable GGOEBS"/* AF92 */,/*18197*/"Hangul Syllable GGOES"/* AF93 */, /*18198*/"Hangul Syllable GGOESS"/* AF94 */,/*18199*/"Hangul Syllable GGOENG"/* AF95 */, /*18200*/"Hangul Syllable GGOEJ"/* AF96 */,/*18201*/"Hangul Syllable GGOEC"/* AF97 */, /*18202*/"Hangul Syllable GGOEK"/* AF98 */,/*18203*/"Hangul Syllable GGOET"/* AF99 */, /*18204*/"Hangul Syllable GGOEP"/* AF9A */,/*18205*/"Hangul Syllable GGOEH"/* AF9B */, /*18206*/"Hangul Syllable GGYO"/* AF9C */,/*18207*/"Hangul Syllable GGYOG"/* AF9D */, /*18208*/"Hangul Syllable GGYOGG"/* AF9E */,/*18209*/"Hangul Syllable GGYOGS"/* AF9F */, /*18210*/"Hangul Syllable GGYON"/* AFA0 */,/*18211*/"Hangul Syllable GGYONJ"/* AFA1 */, /*18212*/"Hangul Syllable GGYONH"/* AFA2 */,/*18213*/"Hangul Syllable GGYOD"/* AFA3 */, /*18214*/"Hangul Syllable GGYOL"/* AFA4 */,/*18215*/"Hangul Syllable GGYOLG"/* AFA5 */, /*18216*/"Hangul Syllable GGYOLM"/* AFA6 */,/*18217*/"Hangul Syllable GGYOLB"/* AFA7 */, /*18218*/"Hangul Syllable GGYOLS"/* AFA8 */,/*18219*/"Hangul Syllable GGYOLT"/* AFA9 */, /*18220*/"Hangul Syllable GGYOLP"/* AFAA */,/*18221*/"Hangul Syllable GGYOLH"/* AFAB */, /*18222*/"Hangul Syllable GGYOM"/* AFAC */,/*18223*/"Hangul Syllable GGYOB"/* AFAD */, /*18224*/"Hangul Syllable GGYOBS"/* AFAE */,/*18225*/"Hangul Syllable GGYOS"/* AFAF */, /*18226*/"Hangul Syllable GGYOSS"/* AFB0 */,/*18227*/"Hangul Syllable GGYONG"/* AFB1 */, /*18228*/"Hangul Syllable GGYOJ"/* AFB2 */,/*18229*/"Hangul Syllable GGYOC"/* AFB3 */, /*18230*/"Hangul Syllable GGYOK"/* AFB4 */,/*18231*/"Hangul Syllable GGYOT"/* AFB5 */, /*18232*/"Hangul Syllable GGYOP"/* AFB6 */,/*18233*/"Hangul Syllable GGYOH"/* AFB7 */, /*18234*/"Hangul Syllable GGU"/* AFB8 */,/*18235*/"Hangul Syllable GGUG"/* AFB9 */, /*18236*/"Hangul Syllable GGUGG"/* AFBA */,/*18237*/"Hangul Syllable GGUGS"/* AFBB */, /*18238*/"Hangul Syllable GGUN"/* AFBC */,/*18239*/"Hangul Syllable GGUNJ"/* AFBD */, /*18240*/"Hangul Syllable GGUNH"/* AFBE */,/*18241*/"Hangul Syllable GGUD"/* AFBF */, /*18242*/"Hangul Syllable GGUL"/* AFC0 */,/*18243*/"Hangul Syllable GGULG"/* AFC1 */, /*18244*/"Hangul Syllable GGULM"/* AFC2 */,/*18245*/"Hangul Syllable GGULB"/* AFC3 */, /*18246*/"Hangul Syllable GGULS"/* AFC4 */,/*18247*/"Hangul Syllable GGULT"/* AFC5 */, /*18248*/"Hangul Syllable GGULP"/* AFC6 */,/*18249*/"Hangul Syllable GGULH"/* AFC7 */, /*18250*/"Hangul Syllable GGUM"/* AFC8 */,/*18251*/"Hangul Syllable GGUB"/* AFC9 */, /*18252*/"Hangul Syllable GGUBS"/* AFCA */,/*18253*/"Hangul Syllable GGUS"/* AFCB */, /*18254*/"Hangul Syllable GGUSS"/* AFCC */,/*18255*/"Hangul Syllable GGUNG"/* AFCD */, /*18256*/"Hangul Syllable GGUJ"/* AFCE */,/*18257*/"Hangul Syllable GGUC"/* AFCF */, /*18258*/"Hangul Syllable GGUK"/* AFD0 */,/*18259*/"Hangul Syllable GGUT"/* AFD1 */, /*18260*/"Hangul Syllable GGUP"/* AFD2 */,/*18261*/"Hangul Syllable GGUH"/* AFD3 */, /*18262*/"Hangul Syllable GGWEO"/* AFD4 */,/*18263*/"Hangul Syllable GGWEOG"/* AFD5 */, /*18264*/"Hangul Syllable GGWEOGG"/* AFD6 */,/*18265*/"Hangul Syllable GGWEOGS"/* AFD7 */, /*18266*/"Hangul Syllable GGWEON"/* AFD8 */,/*18267*/"Hangul Syllable GGWEONJ"/* AFD9 */, /*18268*/"Hangul Syllable GGWEONH"/* AFDA */,/*18269*/"Hangul Syllable GGWEOD"/* AFDB */, /*18270*/"Hangul Syllable GGWEOL"/* AFDC */,/*18271*/"Hangul Syllable GGWEOLG"/* AFDD */, /*18272*/"Hangul Syllable GGWEOLM"/* AFDE */,/*18273*/"Hangul Syllable GGWEOLB"/* AFDF */, /*18274*/"Hangul Syllable GGWEOLS"/* AFE0 */,/*18275*/"Hangul Syllable GGWEOLT"/* AFE1 */, /*18276*/"Hangul Syllable GGWEOLP"/* AFE2 */,/*18277*/"Hangul Syllable GGWEOLH"/* AFE3 */, /*18278*/"Hangul Syllable GGWEOM"/* AFE4 */,/*18279*/"Hangul Syllable GGWEOB"/* AFE5 */, /*18280*/"Hangul Syllable GGWEOBS"/* AFE6 */,/*18281*/"Hangul Syllable GGWEOS"/* AFE7 */, /*18282*/"Hangul Syllable GGWEOSS"/* AFE8 */,/*18283*/"Hangul Syllable GGWEONG"/* AFE9 */, /*18284*/"Hangul Syllable GGWEOJ"/* AFEA */,/*18285*/"Hangul Syllable GGWEOC"/* AFEB */, /*18286*/"Hangul Syllable GGWEOK"/* AFEC */,/*18287*/"Hangul Syllable GGWEOT"/* AFED */, /*18288*/"Hangul Syllable GGWEOP"/* AFEE */,/*18289*/"Hangul Syllable GGWEOH"/* AFEF */, /*18290*/"Hangul Syllable GGWE"/* AFF0 */,/*18291*/"Hangul Syllable GGWEG"/* AFF1 */, /*18292*/"Hangul Syllable GGWEGG"/* AFF2 */,/*18293*/"Hangul Syllable GGWEGS"/* AFF3 */, /*18294*/"Hangul Syllable GGWEN"/* AFF4 */,/*18295*/"Hangul Syllable GGWENJ"/* AFF5 */, /*18296*/"Hangul Syllable GGWENH"/* AFF6 */,/*18297*/"Hangul Syllable GGWED"/* AFF7 */, /*18298*/"Hangul Syllable GGWEL"/* AFF8 */,/*18299*/"Hangul Syllable GGWELG"/* AFF9 */, /*18300*/"Hangul Syllable GGWELM"/* AFFA */,/*18301*/"Hangul Syllable GGWELB"/* AFFB */, /*18302*/"Hangul Syllable GGWELS"/* AFFC */,/*18303*/"Hangul Syllable GGWELT"/* AFFD */, /*18304*/"Hangul Syllable GGWELP"/* AFFE */,/*18305*/"Hangul Syllable GGWELH"/* AFFF */, /*18306*/"Hangul Syllable GGWEM"/* B000 */,/*18307*/"Hangul Syllable GGWEB"/* B001 */, /*18308*/"Hangul Syllable GGWEBS"/* B002 */,/*18309*/"Hangul Syllable GGWES"/* B003 */, /*18310*/"Hangul Syllable GGWESS"/* B004 */,/*18311*/"Hangul Syllable GGWENG"/* B005 */, /*18312*/"Hangul Syllable GGWEJ"/* B006 */,/*18313*/"Hangul Syllable GGWEC"/* B007 */, /*18314*/"Hangul Syllable GGWEK"/* B008 */,/*18315*/"Hangul Syllable GGWET"/* B009 */, /*18316*/"Hangul Syllable GGWEP"/* B00A */,/*18317*/"Hangul Syllable GGWEH"/* B00B */, /*18318*/"Hangul Syllable GGWI"/* B00C */,/*18319*/"Hangul Syllable GGWIG"/* B00D */, /*18320*/"Hangul Syllable GGWIGG"/* B00E */,/*18321*/"Hangul Syllable GGWIGS"/* B00F */, /*18322*/"Hangul Syllable GGWIN"/* B010 */,/*18323*/"Hangul Syllable GGWINJ"/* B011 */, /*18324*/"Hangul Syllable GGWINH"/* B012 */,/*18325*/"Hangul Syllable GGWID"/* B013 */, /*18326*/"Hangul Syllable GGWIL"/* B014 */,/*18327*/"Hangul Syllable GGWILG"/* B015 */, /*18328*/"Hangul Syllable GGWILM"/* B016 */,/*18329*/"Hangul Syllable GGWILB"/* B017 */, /*18330*/"Hangul Syllable GGWILS"/* B018 */,/*18331*/"Hangul Syllable GGWILT"/* B019 */, /*18332*/"Hangul Syllable GGWILP"/* B01A */,/*18333*/"Hangul Syllable GGWILH"/* B01B */, /*18334*/"Hangul Syllable GGWIM"/* B01C */,/*18335*/"Hangul Syllable GGWIB"/* B01D */, /*18336*/"Hangul Syllable GGWIBS"/* B01E */,/*18337*/"Hangul Syllable GGWIS"/* B01F */, /*18338*/"Hangul Syllable GGWISS"/* B020 */,/*18339*/"Hangul Syllable GGWING"/* B021 */, /*18340*/"Hangul Syllable GGWIJ"/* B022 */,/*18341*/"Hangul Syllable GGWIC"/* B023 */, /*18342*/"Hangul Syllable GGWIK"/* B024 */,/*18343*/"Hangul Syllable GGWIT"/* B025 */, /*18344*/"Hangul Syllable GGWIP"/* B026 */,/*18345*/"Hangul Syllable GGWIH"/* B027 */, /*18346*/"Hangul Syllable GGYU"/* B028 */,/*18347*/"Hangul Syllable GGYUG"/* B029 */, /*18348*/"Hangul Syllable GGYUGG"/* B02A */,/*18349*/"Hangul Syllable GGYUGS"/* B02B */, /*18350*/"Hangul Syllable GGYUN"/* B02C */,/*18351*/"Hangul Syllable GGYUNJ"/* B02D */, /*18352*/"Hangul Syllable GGYUNH"/* B02E */,/*18353*/"Hangul Syllable GGYUD"/* B02F */, /*18354*/"Hangul Syllable GGYUL"/* B030 */,/*18355*/"Hangul Syllable GGYULG"/* B031 */, /*18356*/"Hangul Syllable GGYULM"/* B032 */,/*18357*/"Hangul Syllable GGYULB"/* B033 */, /*18358*/"Hangul Syllable GGYULS"/* B034 */,/*18359*/"Hangul Syllable GGYULT"/* B035 */, /*18360*/"Hangul Syllable GGYULP"/* B036 */,/*18361*/"Hangul Syllable GGYULH"/* B037 */, /*18362*/"Hangul Syllable GGYUM"/* B038 */,/*18363*/"Hangul Syllable GGYUB"/* B039 */, /*18364*/"Hangul Syllable GGYUBS"/* B03A */,/*18365*/"Hangul Syllable GGYUS"/* B03B */, /*18366*/"Hangul Syllable GGYUSS"/* B03C */,/*18367*/"Hangul Syllable GGYUNG"/* B03D */, /*18368*/"Hangul Syllable GGYUJ"/* B03E */,/*18369*/"Hangul Syllable GGYUC"/* B03F */, /*18370*/"Hangul Syllable GGYUK"/* B040 */,/*18371*/"Hangul Syllable GGYUT"/* B041 */, /*18372*/"Hangul Syllable GGYUP"/* B042 */,/*18373*/"Hangul Syllable GGYUH"/* B043 */, /*18374*/"Hangul Syllable GGEU"/* B044 */,/*18375*/"Hangul Syllable GGEUG"/* B045 */, /*18376*/"Hangul Syllable GGEUGG"/* B046 */,/*18377*/"Hangul Syllable GGEUGS"/* B047 */, /*18378*/"Hangul Syllable GGEUN"/* B048 */,/*18379*/"Hangul Syllable GGEUNJ"/* B049 */, /*18380*/"Hangul Syllable GGEUNH"/* B04A */,/*18381*/"Hangul Syllable GGEUD"/* B04B */, /*18382*/"Hangul Syllable GGEUL"/* B04C */,/*18383*/"Hangul Syllable GGEULG"/* B04D */, /*18384*/"Hangul Syllable GGEULM"/* B04E */,/*18385*/"Hangul Syllable GGEULB"/* B04F */, /*18386*/"Hangul Syllable GGEULS"/* B050 */,/*18387*/"Hangul Syllable GGEULT"/* B051 */, /*18388*/"Hangul Syllable GGEULP"/* B052 */,/*18389*/"Hangul Syllable GGEULH"/* B053 */, /*18390*/"Hangul Syllable GGEUM"/* B054 */,/*18391*/"Hangul Syllable GGEUB"/* B055 */, /*18392*/"Hangul Syllable GGEUBS"/* B056 */,/*18393*/"Hangul Syllable GGEUS"/* B057 */, /*18394*/"Hangul Syllable GGEUSS"/* B058 */,/*18395*/"Hangul Syllable GGEUNG"/* B059 */, /*18396*/"Hangul Syllable GGEUJ"/* B05A */,/*18397*/"Hangul Syllable GGEUC"/* B05B */, /*18398*/"Hangul Syllable GGEUK"/* B05C */,/*18399*/"Hangul Syllable GGEUT"/* B05D */, /*18400*/"Hangul Syllable GGEUP"/* B05E */,/*18401*/"Hangul Syllable GGEUH"/* B05F */, /*18402*/"Hangul Syllable GGYI"/* B060 */,/*18403*/"Hangul Syllable GGYIG"/* B061 */, /*18404*/"Hangul Syllable GGYIGG"/* B062 */,/*18405*/"Hangul Syllable GGYIGS"/* B063 */, /*18406*/"Hangul Syllable GGYIN"/* B064 */,/*18407*/"Hangul Syllable GGYINJ"/* B065 */, /*18408*/"Hangul Syllable GGYINH"/* B066 */,/*18409*/"Hangul Syllable GGYID"/* B067 */, /*18410*/"Hangul Syllable GGYIL"/* B068 */,/*18411*/"Hangul Syllable GGYILG"/* B069 */, /*18412*/"Hangul Syllable GGYILM"/* B06A */,/*18413*/"Hangul Syllable GGYILB"/* B06B */, /*18414*/"Hangul Syllable GGYILS"/* B06C */,/*18415*/"Hangul Syllable GGYILT"/* B06D */, /*18416*/"Hangul Syllable GGYILP"/* B06E */,/*18417*/"Hangul Syllable GGYILH"/* B06F */, /*18418*/"Hangul Syllable GGYIM"/* B070 */,/*18419*/"Hangul Syllable GGYIB"/* B071 */, /*18420*/"Hangul Syllable GGYIBS"/* B072 */,/*18421*/"Hangul Syllable GGYIS"/* B073 */, /*18422*/"Hangul Syllable GGYISS"/* B074 */,/*18423*/"Hangul Syllable GGYING"/* B075 */, /*18424*/"Hangul Syllable GGYIJ"/* B076 */,/*18425*/"Hangul Syllable GGYIC"/* B077 */, /*18426*/"Hangul Syllable GGYIK"/* B078 */,/*18427*/"Hangul Syllable GGYIT"/* B079 */, /*18428*/"Hangul Syllable GGYIP"/* B07A */,/*18429*/"Hangul Syllable GGYIH"/* B07B */, /*18430*/"Hangul Syllable GGI"/* B07C */,/*18431*/"Hangul Syllable GGIG"/* B07D */, /*18432*/"Hangul Syllable GGIGG"/* B07E */,/*18433*/"Hangul Syllable GGIGS"/* B07F */, /*18434*/"Hangul Syllable GGIN"/* B080 */,/*18435*/"Hangul Syllable GGINJ"/* B081 */, /*18436*/"Hangul Syllable GGINH"/* B082 */,/*18437*/"Hangul Syllable GGID"/* B083 */, /*18438*/"Hangul Syllable GGIL"/* B084 */,/*18439*/"Hangul Syllable GGILG"/* B085 */, /*18440*/"Hangul Syllable GGILM"/* B086 */,/*18441*/"Hangul Syllable GGILB"/* B087 */, /*18442*/"Hangul Syllable GGILS"/* B088 */,/*18443*/"Hangul Syllable GGILT"/* B089 */, /*18444*/"Hangul Syllable GGILP"/* B08A */,/*18445*/"Hangul Syllable GGILH"/* B08B */, /*18446*/"Hangul Syllable GGIM"/* B08C */,/*18447*/"Hangul Syllable GGIB"/* B08D */, /*18448*/"Hangul Syllable GGIBS"/* B08E */,/*18449*/"Hangul Syllable GGIS"/* B08F */, /*18450*/"Hangul Syllable GGISS"/* B090 */,/*18451*/"Hangul Syllable GGING"/* B091 */, /*18452*/"Hangul Syllable GGIJ"/* B092 */,/*18453*/"Hangul Syllable GGIC"/* B093 */, /*18454*/"Hangul Syllable GGIK"/* B094 */,/*18455*/"Hangul Syllable GGIT"/* B095 */, /*18456*/"Hangul Syllable GGIP"/* B096 */,/*18457*/"Hangul Syllable GGIH"/* B097 */, /*18458*/"Hangul Syllable NA"/* B098 */,/*18459*/"Hangul Syllable NAG"/* B099 */, /*18460*/"Hangul Syllable NAGG"/* B09A */,/*18461*/"Hangul Syllable NAGS"/* B09B */, /*18462*/"Hangul Syllable NAN"/* B09C */,/*18463*/"Hangul Syllable NANJ"/* B09D */, /*18464*/"Hangul Syllable NANH"/* B09E */,/*18465*/"Hangul Syllable NAD"/* B09F */, /*18466*/"Hangul Syllable NAL"/* B0A0 */,/*18467*/"Hangul Syllable NALG"/* B0A1 */, /*18468*/"Hangul Syllable NALM"/* B0A2 */,/*18469*/"Hangul Syllable NALB"/* B0A3 */, /*18470*/"Hangul Syllable NALS"/* B0A4 */,/*18471*/"Hangul Syllable NALT"/* B0A5 */, /*18472*/"Hangul Syllable NALP"/* B0A6 */,/*18473*/"Hangul Syllable NALH"/* B0A7 */, /*18474*/"Hangul Syllable NAM"/* B0A8 */,/*18475*/"Hangul Syllable NAB"/* B0A9 */, /*18476*/"Hangul Syllable NABS"/* B0AA */,/*18477*/"Hangul Syllable NAS"/* B0AB */, /*18478*/"Hangul Syllable NASS"/* B0AC */,/*18479*/"Hangul Syllable NANG"/* B0AD */, /*18480*/"Hangul Syllable NAJ"/* B0AE */,/*18481*/"Hangul Syllable NAC"/* B0AF */, /*18482*/"Hangul Syllable NAK"/* B0B0 */,/*18483*/"Hangul Syllable NAT"/* B0B1 */, /*18484*/"Hangul Syllable NAP"/* B0B2 */,/*18485*/"Hangul Syllable NAH"/* B0B3 */, /*18486*/"Hangul Syllable NAE"/* B0B4 */,/*18487*/"Hangul Syllable NAEG"/* B0B5 */, /*18488*/"Hangul Syllable NAEGG"/* B0B6 */,/*18489*/"Hangul Syllable NAEGS"/* B0B7 */, /*18490*/"Hangul Syllable NAEN"/* B0B8 */,/*18491*/"Hangul Syllable NAENJ"/* B0B9 */, /*18492*/"Hangul Syllable NAENH"/* B0BA */,/*18493*/"Hangul Syllable NAED"/* B0BB */, /*18494*/"Hangul Syllable NAEL"/* B0BC */,/*18495*/"Hangul Syllable NAELG"/* B0BD */, /*18496*/"Hangul Syllable NAELM"/* B0BE */,/*18497*/"Hangul Syllable NAELB"/* B0BF */, /*18498*/"Hangul Syllable NAELS"/* B0C0 */,/*18499*/"Hangul Syllable NAELT"/* B0C1 */, /*18500*/"Hangul Syllable NAELP"/* B0C2 */,/*18501*/"Hangul Syllable NAELH"/* B0C3 */, /*18502*/"Hangul Syllable NAEM"/* B0C4 */,/*18503*/"Hangul Syllable NAEB"/* B0C5 */, /*18504*/"Hangul Syllable NAEBS"/* B0C6 */,/*18505*/"Hangul Syllable NAES"/* B0C7 */, /*18506*/"Hangul Syllable NAESS"/* B0C8 */,/*18507*/"Hangul Syllable NAENG"/* B0C9 */, /*18508*/"Hangul Syllable NAEJ"/* B0CA */,/*18509*/"Hangul Syllable NAEC"/* B0CB */, /*18510*/"Hangul Syllable NAEK"/* B0CC */,/*18511*/"Hangul Syllable NAET"/* B0CD */, /*18512*/"Hangul Syllable NAEP"/* B0CE */,/*18513*/"Hangul Syllable NAEH"/* B0CF */, /*18514*/"Hangul Syllable NYA"/* B0D0 */,/*18515*/"Hangul Syllable NYAG"/* B0D1 */, /*18516*/"Hangul Syllable NYAGG"/* B0D2 */,/*18517*/"Hangul Syllable NYAGS"/* B0D3 */, /*18518*/"Hangul Syllable NYAN"/* B0D4 */,/*18519*/"Hangul Syllable NYANJ"/* B0D5 */, /*18520*/"Hangul Syllable NYANH"/* B0D6 */,/*18521*/"Hangul Syllable NYAD"/* B0D7 */, /*18522*/"Hangul Syllable NYAL"/* B0D8 */,/*18523*/"Hangul Syllable NYALG"/* B0D9 */, /*18524*/"Hangul Syllable NYALM"/* B0DA */,/*18525*/"Hangul Syllable NYALB"/* B0DB */, /*18526*/"Hangul Syllable NYALS"/* B0DC */,/*18527*/"Hangul Syllable NYALT"/* B0DD */, /*18528*/"Hangul Syllable NYALP"/* B0DE */,/*18529*/"Hangul Syllable NYALH"/* B0DF */, /*18530*/"Hangul Syllable NYAM"/* B0E0 */,/*18531*/"Hangul Syllable NYAB"/* B0E1 */, /*18532*/"Hangul Syllable NYABS"/* B0E2 */,/*18533*/"Hangul Syllable NYAS"/* B0E3 */, /*18534*/"Hangul Syllable NYASS"/* B0E4 */,/*18535*/"Hangul Syllable NYANG"/* B0E5 */, /*18536*/"Hangul Syllable NYAJ"/* B0E6 */,/*18537*/"Hangul Syllable NYAC"/* B0E7 */, /*18538*/"Hangul Syllable NYAK"/* B0E8 */,/*18539*/"Hangul Syllable NYAT"/* B0E9 */, /*18540*/"Hangul Syllable NYAP"/* B0EA */,/*18541*/"Hangul Syllable NYAH"/* B0EB */, /*18542*/"Hangul Syllable NYAE"/* B0EC */,/*18543*/"Hangul Syllable NYAEG"/* B0ED */, /*18544*/"Hangul Syllable NYAEGG"/* B0EE */,/*18545*/"Hangul Syllable NYAEGS"/* B0EF */, /*18546*/"Hangul Syllable NYAEN"/* B0F0 */,/*18547*/"Hangul Syllable NYAENJ"/* B0F1 */, /*18548*/"Hangul Syllable NYAENH"/* B0F2 */,/*18549*/"Hangul Syllable NYAED"/* B0F3 */, /*18550*/"Hangul Syllable NYAEL"/* B0F4 */,/*18551*/"Hangul Syllable NYAELG"/* B0F5 */, /*18552*/"Hangul Syllable NYAELM"/* B0F6 */,/*18553*/"Hangul Syllable NYAELB"/* B0F7 */, /*18554*/"Hangul Syllable NYAELS"/* B0F8 */,/*18555*/"Hangul Syllable NYAELT"/* B0F9 */, /*18556*/"Hangul Syllable NYAELP"/* B0FA */,/*18557*/"Hangul Syllable NYAELH"/* B0FB */, /*18558*/"Hangul Syllable NYAEM"/* B0FC */,/*18559*/"Hangul Syllable NYAEB"/* B0FD */, /*18560*/"Hangul Syllable NYAEBS"/* B0FE */,/*18561*/"Hangul Syllable NYAES"/* B0FF */, /*18562*/"Hangul Syllable NYAESS"/* B100 */,/*18563*/"Hangul Syllable NYAENG"/* B101 */, /*18564*/"Hangul Syllable NYAEJ"/* B102 */,/*18565*/"Hangul Syllable NYAEC"/* B103 */, /*18566*/"Hangul Syllable NYAEK"/* B104 */,/*18567*/"Hangul Syllable NYAET"/* B105 */, /*18568*/"Hangul Syllable NYAEP"/* B106 */,/*18569*/"Hangul Syllable NYAEH"/* B107 */, /*18570*/"Hangul Syllable NEO"/* B108 */,/*18571*/"Hangul Syllable NEOG"/* B109 */, /*18572*/"Hangul Syllable NEOGG"/* B10A */,/*18573*/"Hangul Syllable NEOGS"/* B10B */, /*18574*/"Hangul Syllable NEON"/* B10C */,/*18575*/"Hangul Syllable NEONJ"/* B10D */, /*18576*/"Hangul Syllable NEONH"/* B10E */,/*18577*/"Hangul Syllable NEOD"/* B10F */, /*18578*/"Hangul Syllable NEOL"/* B110 */,/*18579*/"Hangul Syllable NEOLG"/* B111 */, /*18580*/"Hangul Syllable NEOLM"/* B112 */,/*18581*/"Hangul Syllable NEOLB"/* B113 */, /*18582*/"Hangul Syllable NEOLS"/* B114 */,/*18583*/"Hangul Syllable NEOLT"/* B115 */, /*18584*/"Hangul Syllable NEOLP"/* B116 */,/*18585*/"Hangul Syllable NEOLH"/* B117 */, /*18586*/"Hangul Syllable NEOM"/* B118 */,/*18587*/"Hangul Syllable NEOB"/* B119 */, /*18588*/"Hangul Syllable NEOBS"/* B11A */,/*18589*/"Hangul Syllable NEOS"/* B11B */, /*18590*/"Hangul Syllable NEOSS"/* B11C */,/*18591*/"Hangul Syllable NEONG"/* B11D */, /*18592*/"Hangul Syllable NEOJ"/* B11E */,/*18593*/"Hangul Syllable NEOC"/* B11F */, /*18594*/"Hangul Syllable NEOK"/* B120 */,/*18595*/"Hangul Syllable NEOT"/* B121 */, /*18596*/"Hangul Syllable NEOP"/* B122 */,/*18597*/"Hangul Syllable NEOH"/* B123 */, /*18598*/"Hangul Syllable NE"/* B124 */,/*18599*/"Hangul Syllable NEG"/* B125 */, /*18600*/"Hangul Syllable NEGG"/* B126 */,/*18601*/"Hangul Syllable NEGS"/* B127 */, /*18602*/"Hangul Syllable NEN"/* B128 */,/*18603*/"Hangul Syllable NENJ"/* B129 */, /*18604*/"Hangul Syllable NENH"/* B12A */,/*18605*/"Hangul Syllable NED"/* B12B */, /*18606*/"Hangul Syllable NEL"/* B12C */,/*18607*/"Hangul Syllable NELG"/* B12D */, /*18608*/"Hangul Syllable NELM"/* B12E */,/*18609*/"Hangul Syllable NELB"/* B12F */, /*18610*/"Hangul Syllable NELS"/* B130 */,/*18611*/"Hangul Syllable NELT"/* B131 */, /*18612*/"Hangul Syllable NELP"/* B132 */,/*18613*/"Hangul Syllable NELH"/* B133 */, /*18614*/"Hangul Syllable NEM"/* B134 */,/*18615*/"Hangul Syllable NEB"/* B135 */, /*18616*/"Hangul Syllable NEBS"/* B136 */,/*18617*/"Hangul Syllable NES"/* B137 */, /*18618*/"Hangul Syllable NESS"/* B138 */,/*18619*/"Hangul Syllable NENG"/* B139 */, /*18620*/"Hangul Syllable NEJ"/* B13A */,/*18621*/"Hangul Syllable NEC"/* B13B */, /*18622*/"Hangul Syllable NEK"/* B13C */,/*18623*/"Hangul Syllable NET"/* B13D */, /*18624*/"Hangul Syllable NEP"/* B13E */,/*18625*/"Hangul Syllable NEH"/* B13F */, /*18626*/"Hangul Syllable NYEO"/* B140 */,/*18627*/"Hangul Syllable NYEOG"/* B141 */, /*18628*/"Hangul Syllable NYEOGG"/* B142 */,/*18629*/"Hangul Syllable NYEOGS"/* B143 */, /*18630*/"Hangul Syllable NYEON"/* B144 */,/*18631*/"Hangul Syllable NYEONJ"/* B145 */, /*18632*/"Hangul Syllable NYEONH"/* B146 */,/*18633*/"Hangul Syllable NYEOD"/* B147 */, /*18634*/"Hangul Syllable NYEOL"/* B148 */,/*18635*/"Hangul Syllable NYEOLG"/* B149 */, /*18636*/"Hangul Syllable NYEOLM"/* B14A */,/*18637*/"Hangul Syllable NYEOLB"/* B14B */, /*18638*/"Hangul Syllable NYEOLS"/* B14C */,/*18639*/"Hangul Syllable NYEOLT"/* B14D */, /*18640*/"Hangul Syllable NYEOLP"/* B14E */,/*18641*/"Hangul Syllable NYEOLH"/* B14F */, /*18642*/"Hangul Syllable NYEOM"/* B150 */,/*18643*/"Hangul Syllable NYEOB"/* B151 */, /*18644*/"Hangul Syllable NYEOBS"/* B152 */,/*18645*/"Hangul Syllable NYEOS"/* B153 */, /*18646*/"Hangul Syllable NYEOSS"/* B154 */,/*18647*/"Hangul Syllable NYEONG"/* B155 */, /*18648*/"Hangul Syllable NYEOJ"/* B156 */,/*18649*/"Hangul Syllable NYEOC"/* B157 */, /*18650*/"Hangul Syllable NYEOK"/* B158 */,/*18651*/"Hangul Syllable NYEOT"/* B159 */, /*18652*/"Hangul Syllable NYEOP"/* B15A */,/*18653*/"Hangul Syllable NYEOH"/* B15B */, /*18654*/"Hangul Syllable NYE"/* B15C */,/*18655*/"Hangul Syllable NYEG"/* B15D */, /*18656*/"Hangul Syllable NYEGG"/* B15E */,/*18657*/"Hangul Syllable NYEGS"/* B15F */, /*18658*/"Hangul Syllable NYEN"/* B160 */,/*18659*/"Hangul Syllable NYENJ"/* B161 */, /*18660*/"Hangul Syllable NYENH"/* B162 */,/*18661*/"Hangul Syllable NYED"/* B163 */, /*18662*/"Hangul Syllable NYEL"/* B164 */,/*18663*/"Hangul Syllable NYELG"/* B165 */, /*18664*/"Hangul Syllable NYELM"/* B166 */,/*18665*/"Hangul Syllable NYELB"/* B167 */, /*18666*/"Hangul Syllable NYELS"/* B168 */,/*18667*/"Hangul Syllable NYELT"/* B169 */, /*18668*/"Hangul Syllable NYELP"/* B16A */,/*18669*/"Hangul Syllable NYELH"/* B16B */, /*18670*/"Hangul Syllable NYEM"/* B16C */,/*18671*/"Hangul Syllable NYEB"/* B16D */, /*18672*/"Hangul Syllable NYEBS"/* B16E */,/*18673*/"Hangul Syllable NYES"/* B16F */, /*18674*/"Hangul Syllable NYESS"/* B170 */,/*18675*/"Hangul Syllable NYENG"/* B171 */, /*18676*/"Hangul Syllable NYEJ"/* B172 */,/*18677*/"Hangul Syllable NYEC"/* B173 */, /*18678*/"Hangul Syllable NYEK"/* B174 */,/*18679*/"Hangul Syllable NYET"/* B175 */, /*18680*/"Hangul Syllable NYEP"/* B176 */,/*18681*/"Hangul Syllable NYEH"/* B177 */, /*18682*/"Hangul Syllable NO"/* B178 */,/*18683*/"Hangul Syllable NOG"/* B179 */, /*18684*/"Hangul Syllable NOGG"/* B17A */,/*18685*/"Hangul Syllable NOGS"/* B17B */, /*18686*/"Hangul Syllable NON"/* B17C */,/*18687*/"Hangul Syllable NONJ"/* B17D */, /*18688*/"Hangul Syllable NONH"/* B17E */,/*18689*/"Hangul Syllable NOD"/* B17F */, /*18690*/"Hangul Syllable NOL"/* B180 */,/*18691*/"Hangul Syllable NOLG"/* B181 */, /*18692*/"Hangul Syllable NOLM"/* B182 */,/*18693*/"Hangul Syllable NOLB"/* B183 */, /*18694*/"Hangul Syllable NOLS"/* B184 */,/*18695*/"Hangul Syllable NOLT"/* B185 */, /*18696*/"Hangul Syllable NOLP"/* B186 */,/*18697*/"Hangul Syllable NOLH"/* B187 */, /*18698*/"Hangul Syllable NOM"/* B188 */,/*18699*/"Hangul Syllable NOB"/* B189 */, /*18700*/"Hangul Syllable NOBS"/* B18A */,/*18701*/"Hangul Syllable NOS"/* B18B */, /*18702*/"Hangul Syllable NOSS"/* B18C */,/*18703*/"Hangul Syllable NONG"/* B18D */, /*18704*/"Hangul Syllable NOJ"/* B18E */,/*18705*/"Hangul Syllable NOC"/* B18F */, /*18706*/"Hangul Syllable NOK"/* B190 */,/*18707*/"Hangul Syllable NOT"/* B191 */, /*18708*/"Hangul Syllable NOP"/* B192 */,/*18709*/"Hangul Syllable NOH"/* B193 */, /*18710*/"Hangul Syllable NWA"/* B194 */,/*18711*/"Hangul Syllable NWAG"/* B195 */, /*18712*/"Hangul Syllable NWAGG"/* B196 */,/*18713*/"Hangul Syllable NWAGS"/* B197 */, /*18714*/"Hangul Syllable NWAN"/* B198 */,/*18715*/"Hangul Syllable NWANJ"/* B199 */, /*18716*/"Hangul Syllable NWANH"/* B19A */,/*18717*/"Hangul Syllable NWAD"/* B19B */, /*18718*/"Hangul Syllable NWAL"/* B19C */,/*18719*/"Hangul Syllable NWALG"/* B19D */, /*18720*/"Hangul Syllable NWALM"/* B19E */,/*18721*/"Hangul Syllable NWALB"/* B19F */, /*18722*/"Hangul Syllable NWALS"/* B1A0 */,/*18723*/"Hangul Syllable NWALT"/* B1A1 */, /*18724*/"Hangul Syllable NWALP"/* B1A2 */,/*18725*/"Hangul Syllable NWALH"/* B1A3 */, /*18726*/"Hangul Syllable NWAM"/* B1A4 */,/*18727*/"Hangul Syllable NWAB"/* B1A5 */, /*18728*/"Hangul Syllable NWABS"/* B1A6 */,/*18729*/"Hangul Syllable NWAS"/* B1A7 */, /*18730*/"Hangul Syllable NWASS"/* B1A8 */,/*18731*/"Hangul Syllable NWANG"/* B1A9 */, /*18732*/"Hangul Syllable NWAJ"/* B1AA */,/*18733*/"Hangul Syllable NWAC"/* B1AB */, /*18734*/"Hangul Syllable NWAK"/* B1AC */,/*18735*/"Hangul Syllable NWAT"/* B1AD */, /*18736*/"Hangul Syllable NWAP"/* B1AE */,/*18737*/"Hangul Syllable NWAH"/* B1AF */, /*18738*/"Hangul Syllable NWAE"/* B1B0 */,/*18739*/"Hangul Syllable NWAEG"/* B1B1 */, /*18740*/"Hangul Syllable NWAEGG"/* B1B2 */,/*18741*/"Hangul Syllable NWAEGS"/* B1B3 */, /*18742*/"Hangul Syllable NWAEN"/* B1B4 */,/*18743*/"Hangul Syllable NWAENJ"/* B1B5 */, /*18744*/"Hangul Syllable NWAENH"/* B1B6 */,/*18745*/"Hangul Syllable NWAED"/* B1B7 */, /*18746*/"Hangul Syllable NWAEL"/* B1B8 */,/*18747*/"Hangul Syllable NWAELG"/* B1B9 */, /*18748*/"Hangul Syllable NWAELM"/* B1BA */,/*18749*/"Hangul Syllable NWAELB"/* B1BB */, /*18750*/"Hangul Syllable NWAELS"/* B1BC */,/*18751*/"Hangul Syllable NWAELT"/* B1BD */, /*18752*/"Hangul Syllable NWAELP"/* B1BE */,/*18753*/"Hangul Syllable NWAELH"/* B1BF */, /*18754*/"Hangul Syllable NWAEM"/* B1C0 */,/*18755*/"Hangul Syllable NWAEB"/* B1C1 */, /*18756*/"Hangul Syllable NWAEBS"/* B1C2 */,/*18757*/"Hangul Syllable NWAES"/* B1C3 */, /*18758*/"Hangul Syllable NWAESS"/* B1C4 */,/*18759*/"Hangul Syllable NWAENG"/* B1C5 */, /*18760*/"Hangul Syllable NWAEJ"/* B1C6 */,/*18761*/"Hangul Syllable NWAEC"/* B1C7 */, /*18762*/"Hangul Syllable NWAEK"/* B1C8 */,/*18763*/"Hangul Syllable NWAET"/* B1C9 */, /*18764*/"Hangul Syllable NWAEP"/* B1CA */,/*18765*/"Hangul Syllable NWAEH"/* B1CB */, /*18766*/"Hangul Syllable NOE"/* B1CC */,/*18767*/"Hangul Syllable NOEG"/* B1CD */, /*18768*/"Hangul Syllable NOEGG"/* B1CE */,/*18769*/"Hangul Syllable NOEGS"/* B1CF */, /*18770*/"Hangul Syllable NOEN"/* B1D0 */,/*18771*/"Hangul Syllable NOENJ"/* B1D1 */, /*18772*/"Hangul Syllable NOENH"/* B1D2 */,/*18773*/"Hangul Syllable NOED"/* B1D3 */, /*18774*/"Hangul Syllable NOEL"/* B1D4 */,/*18775*/"Hangul Syllable NOELG"/* B1D5 */, /*18776*/"Hangul Syllable NOELM"/* B1D6 */,/*18777*/"Hangul Syllable NOELB"/* B1D7 */, /*18778*/"Hangul Syllable NOELS"/* B1D8 */,/*18779*/"Hangul Syllable NOELT"/* B1D9 */, /*18780*/"Hangul Syllable NOELP"/* B1DA */,/*18781*/"Hangul Syllable NOELH"/* B1DB */, /*18782*/"Hangul Syllable NOEM"/* B1DC */,/*18783*/"Hangul Syllable NOEB"/* B1DD */, /*18784*/"Hangul Syllable NOEBS"/* B1DE */,/*18785*/"Hangul Syllable NOES"/* B1DF */, /*18786*/"Hangul Syllable NOESS"/* B1E0 */,/*18787*/"Hangul Syllable NOENG"/* B1E1 */, /*18788*/"Hangul Syllable NOEJ"/* B1E2 */,/*18789*/"Hangul Syllable NOEC"/* B1E3 */, /*18790*/"Hangul Syllable NOEK"/* B1E4 */,/*18791*/"Hangul Syllable NOET"/* B1E5 */, /*18792*/"Hangul Syllable NOEP"/* B1E6 */,/*18793*/"Hangul Syllable NOEH"/* B1E7 */, /*18794*/"Hangul Syllable NYO"/* B1E8 */,/*18795*/"Hangul Syllable NYOG"/* B1E9 */, /*18796*/"Hangul Syllable NYOGG"/* B1EA */,/*18797*/"Hangul Syllable NYOGS"/* B1EB */, /*18798*/"Hangul Syllable NYON"/* B1EC */,/*18799*/"Hangul Syllable NYONJ"/* B1ED */, /*18800*/"Hangul Syllable NYONH"/* B1EE */,/*18801*/"Hangul Syllable NYOD"/* B1EF */, /*18802*/"Hangul Syllable NYOL"/* B1F0 */,/*18803*/"Hangul Syllable NYOLG"/* B1F1 */, /*18804*/"Hangul Syllable NYOLM"/* B1F2 */,/*18805*/"Hangul Syllable NYOLB"/* B1F3 */, /*18806*/"Hangul Syllable NYOLS"/* B1F4 */,/*18807*/"Hangul Syllable NYOLT"/* B1F5 */, /*18808*/"Hangul Syllable NYOLP"/* B1F6 */,/*18809*/"Hangul Syllable NYOLH"/* B1F7 */, /*18810*/"Hangul Syllable NYOM"/* B1F8 */,/*18811*/"Hangul Syllable NYOB"/* B1F9 */, /*18812*/"Hangul Syllable NYOBS"/* B1FA */,/*18813*/"Hangul Syllable NYOS"/* B1FB */, /*18814*/"Hangul Syllable NYOSS"/* B1FC */,/*18815*/"Hangul Syllable NYONG"/* B1FD */, /*18816*/"Hangul Syllable NYOJ"/* B1FE */,/*18817*/"Hangul Syllable NYOC"/* B1FF */, /*18818*/"Hangul Syllable NYOK"/* B200 */,/*18819*/"Hangul Syllable NYOT"/* B201 */, /*18820*/"Hangul Syllable NYOP"/* B202 */,/*18821*/"Hangul Syllable NYOH"/* B203 */, /*18822*/"Hangul Syllable NU"/* B204 */,/*18823*/"Hangul Syllable NUG"/* B205 */, /*18824*/"Hangul Syllable NUGG"/* B206 */,/*18825*/"Hangul Syllable NUGS"/* B207 */, /*18826*/"Hangul Syllable NUN"/* B208 */,/*18827*/"Hangul Syllable NUNJ"/* B209 */, /*18828*/"Hangul Syllable NUNH"/* B20A */,/*18829*/"Hangul Syllable NUD"/* B20B */, /*18830*/"Hangul Syllable NUL"/* B20C */,/*18831*/"Hangul Syllable NULG"/* B20D */, /*18832*/"Hangul Syllable NULM"/* B20E */,/*18833*/"Hangul Syllable NULB"/* B20F */, /*18834*/"Hangul Syllable NULS"/* B210 */,/*18835*/"Hangul Syllable NULT"/* B211 */, /*18836*/"Hangul Syllable NULP"/* B212 */,/*18837*/"Hangul Syllable NULH"/* B213 */, /*18838*/"Hangul Syllable NUM"/* B214 */,/*18839*/"Hangul Syllable NUB"/* B215 */, /*18840*/"Hangul Syllable NUBS"/* B216 */,/*18841*/"Hangul Syllable NUS"/* B217 */, /*18842*/"Hangul Syllable NUSS"/* B218 */,/*18843*/"Hangul Syllable NUNG"/* B219 */, /*18844*/"Hangul Syllable NUJ"/* B21A */,/*18845*/"Hangul Syllable NUC"/* B21B */, /*18846*/"Hangul Syllable NUK"/* B21C */,/*18847*/"Hangul Syllable NUT"/* B21D */, /*18848*/"Hangul Syllable NUP"/* B21E */,/*18849*/"Hangul Syllable NUH"/* B21F */, /*18850*/"Hangul Syllable NWEO"/* B220 */,/*18851*/"Hangul Syllable NWEOG"/* B221 */, /*18852*/"Hangul Syllable NWEOGG"/* B222 */,/*18853*/"Hangul Syllable NWEOGS"/* B223 */, /*18854*/"Hangul Syllable NWEON"/* B224 */,/*18855*/"Hangul Syllable NWEONJ"/* B225 */, /*18856*/"Hangul Syllable NWEONH"/* B226 */,/*18857*/"Hangul Syllable NWEOD"/* B227 */, /*18858*/"Hangul Syllable NWEOL"/* B228 */,/*18859*/"Hangul Syllable NWEOLG"/* B229 */, /*18860*/"Hangul Syllable NWEOLM"/* B22A */,/*18861*/"Hangul Syllable NWEOLB"/* B22B */, /*18862*/"Hangul Syllable NWEOLS"/* B22C */,/*18863*/"Hangul Syllable NWEOLT"/* B22D */, /*18864*/"Hangul Syllable NWEOLP"/* B22E */,/*18865*/"Hangul Syllable NWEOLH"/* B22F */, /*18866*/"Hangul Syllable NWEOM"/* B230 */,/*18867*/"Hangul Syllable NWEOB"/* B231 */, /*18868*/"Hangul Syllable NWEOBS"/* B232 */,/*18869*/"Hangul Syllable NWEOS"/* B233 */, /*18870*/"Hangul Syllable NWEOSS"/* B234 */,/*18871*/"Hangul Syllable NWEONG"/* B235 */, /*18872*/"Hangul Syllable NWEOJ"/* B236 */,/*18873*/"Hangul Syllable NWEOC"/* B237 */, /*18874*/"Hangul Syllable NWEOK"/* B238 */,/*18875*/"Hangul Syllable NWEOT"/* B239 */, /*18876*/"Hangul Syllable NWEOP"/* B23A */,/*18877*/"Hangul Syllable NWEOH"/* B23B */, /*18878*/"Hangul Syllable NWE"/* B23C */,/*18879*/"Hangul Syllable NWEG"/* B23D */, /*18880*/"Hangul Syllable NWEGG"/* B23E */,/*18881*/"Hangul Syllable NWEGS"/* B23F */, /*18882*/"Hangul Syllable NWEN"/* B240 */,/*18883*/"Hangul Syllable NWENJ"/* B241 */, /*18884*/"Hangul Syllable NWENH"/* B242 */,/*18885*/"Hangul Syllable NWED"/* B243 */, /*18886*/"Hangul Syllable NWEL"/* B244 */,/*18887*/"Hangul Syllable NWELG"/* B245 */, /*18888*/"Hangul Syllable NWELM"/* B246 */,/*18889*/"Hangul Syllable NWELB"/* B247 */, /*18890*/"Hangul Syllable NWELS"/* B248 */,/*18891*/"Hangul Syllable NWELT"/* B249 */, /*18892*/"Hangul Syllable NWELP"/* B24A */,/*18893*/"Hangul Syllable NWELH"/* B24B */, /*18894*/"Hangul Syllable NWEM"/* B24C */,/*18895*/"Hangul Syllable NWEB"/* B24D */, /*18896*/"Hangul Syllable NWEBS"/* B24E */,/*18897*/"Hangul Syllable NWES"/* B24F */, /*18898*/"Hangul Syllable NWESS"/* B250 */,/*18899*/"Hangul Syllable NWENG"/* B251 */, /*18900*/"Hangul Syllable NWEJ"/* B252 */,/*18901*/"Hangul Syllable NWEC"/* B253 */, /*18902*/"Hangul Syllable NWEK"/* B254 */,/*18903*/"Hangul Syllable NWET"/* B255 */, /*18904*/"Hangul Syllable NWEP"/* B256 */,/*18905*/"Hangul Syllable NWEH"/* B257 */, /*18906*/"Hangul Syllable NWI"/* B258 */,/*18907*/"Hangul Syllable NWIG"/* B259 */, /*18908*/"Hangul Syllable NWIGG"/* B25A */,/*18909*/"Hangul Syllable NWIGS"/* B25B */, /*18910*/"Hangul Syllable NWIN"/* B25C */,/*18911*/"Hangul Syllable NWINJ"/* B25D */, /*18912*/"Hangul Syllable NWINH"/* B25E */,/*18913*/"Hangul Syllable NWID"/* B25F */, /*18914*/"Hangul Syllable NWIL"/* B260 */,/*18915*/"Hangul Syllable NWILG"/* B261 */, /*18916*/"Hangul Syllable NWILM"/* B262 */,/*18917*/"Hangul Syllable NWILB"/* B263 */, /*18918*/"Hangul Syllable NWILS"/* B264 */,/*18919*/"Hangul Syllable NWILT"/* B265 */, /*18920*/"Hangul Syllable NWILP"/* B266 */,/*18921*/"Hangul Syllable NWILH"/* B267 */, /*18922*/"Hangul Syllable NWIM"/* B268 */,/*18923*/"Hangul Syllable NWIB"/* B269 */, /*18924*/"Hangul Syllable NWIBS"/* B26A */,/*18925*/"Hangul Syllable NWIS"/* B26B */, /*18926*/"Hangul Syllable NWISS"/* B26C */,/*18927*/"Hangul Syllable NWING"/* B26D */, /*18928*/"Hangul Syllable NWIJ"/* B26E */,/*18929*/"Hangul Syllable NWIC"/* B26F */, /*18930*/"Hangul Syllable NWIK"/* B270 */,/*18931*/"Hangul Syllable NWIT"/* B271 */, /*18932*/"Hangul Syllable NWIP"/* B272 */,/*18933*/"Hangul Syllable NWIH"/* B273 */, /*18934*/"Hangul Syllable NYU"/* B274 */,/*18935*/"Hangul Syllable NYUG"/* B275 */, /*18936*/"Hangul Syllable NYUGG"/* B276 */,/*18937*/"Hangul Syllable NYUGS"/* B277 */, /*18938*/"Hangul Syllable NYUN"/* B278 */,/*18939*/"Hangul Syllable NYUNJ"/* B279 */, /*18940*/"Hangul Syllable NYUNH"/* B27A */,/*18941*/"Hangul Syllable NYUD"/* B27B */, /*18942*/"Hangul Syllable NYUL"/* B27C */,/*18943*/"Hangul Syllable NYULG"/* B27D */, /*18944*/"Hangul Syllable NYULM"/* B27E */,/*18945*/"Hangul Syllable NYULB"/* B27F */, /*18946*/"Hangul Syllable NYULS"/* B280 */,/*18947*/"Hangul Syllable NYULT"/* B281 */, /*18948*/"Hangul Syllable NYULP"/* B282 */,/*18949*/"Hangul Syllable NYULH"/* B283 */, /*18950*/"Hangul Syllable NYUM"/* B284 */,/*18951*/"Hangul Syllable NYUB"/* B285 */, /*18952*/"Hangul Syllable NYUBS"/* B286 */,/*18953*/"Hangul Syllable NYUS"/* B287 */, /*18954*/"Hangul Syllable NYUSS"/* B288 */,/*18955*/"Hangul Syllable NYUNG"/* B289 */, /*18956*/"Hangul Syllable NYUJ"/* B28A */,/*18957*/"Hangul Syllable NYUC"/* B28B */, /*18958*/"Hangul Syllable NYUK"/* B28C */,/*18959*/"Hangul Syllable NYUT"/* B28D */, /*18960*/"Hangul Syllable NYUP"/* B28E */,/*18961*/"Hangul Syllable NYUH"/* B28F */, /*18962*/"Hangul Syllable NEU"/* B290 */,/*18963*/"Hangul Syllable NEUG"/* B291 */, /*18964*/"Hangul Syllable NEUGG"/* B292 */,/*18965*/"Hangul Syllable NEUGS"/* B293 */, /*18966*/"Hangul Syllable NEUN"/* B294 */,/*18967*/"Hangul Syllable NEUNJ"/* B295 */, /*18968*/"Hangul Syllable NEUNH"/* B296 */,/*18969*/"Hangul Syllable NEUD"/* B297 */, /*18970*/"Hangul Syllable NEUL"/* B298 */,/*18971*/"Hangul Syllable NEULG"/* B299 */, /*18972*/"Hangul Syllable NEULM"/* B29A */,/*18973*/"Hangul Syllable NEULB"/* B29B */, /*18974*/"Hangul Syllable NEULS"/* B29C */,/*18975*/"Hangul Syllable NEULT"/* B29D */, /*18976*/"Hangul Syllable NEULP"/* B29E */,/*18977*/"Hangul Syllable NEULH"/* B29F */, /*18978*/"Hangul Syllable NEUM"/* B2A0 */,/*18979*/"Hangul Syllable NEUB"/* B2A1 */, /*18980*/"Hangul Syllable NEUBS"/* B2A2 */,/*18981*/"Hangul Syllable NEUS"/* B2A3 */, /*18982*/"Hangul Syllable NEUSS"/* B2A4 */,/*18983*/"Hangul Syllable NEUNG"/* B2A5 */, /*18984*/"Hangul Syllable NEUJ"/* B2A6 */,/*18985*/"Hangul Syllable NEUC"/* B2A7 */, /*18986*/"Hangul Syllable NEUK"/* B2A8 */,/*18987*/"Hangul Syllable NEUT"/* B2A9 */, /*18988*/"Hangul Syllable NEUP"/* B2AA */,/*18989*/"Hangul Syllable NEUH"/* B2AB */, /*18990*/"Hangul Syllable NYI"/* B2AC */,/*18991*/"Hangul Syllable NYIG"/* B2AD */, /*18992*/"Hangul Syllable NYIGG"/* B2AE */,/*18993*/"Hangul Syllable NYIGS"/* B2AF */, /*18994*/"Hangul Syllable NYIN"/* B2B0 */,/*18995*/"Hangul Syllable NYINJ"/* B2B1 */, /*18996*/"Hangul Syllable NYINH"/* B2B2 */,/*18997*/"Hangul Syllable NYID"/* B2B3 */, /*18998*/"Hangul Syllable NYIL"/* B2B4 */,/*18999*/"Hangul Syllable NYILG"/* B2B5 */, /*19000*/"Hangul Syllable NYILM"/* B2B6 */,/*19001*/"Hangul Syllable NYILB"/* B2B7 */, /*19002*/"Hangul Syllable NYILS"/* B2B8 */,/*19003*/"Hangul Syllable NYILT"/* B2B9 */, /*19004*/"Hangul Syllable NYILP"/* B2BA */,/*19005*/"Hangul Syllable NYILH"/* B2BB */, /*19006*/"Hangul Syllable NYIM"/* B2BC */,/*19007*/"Hangul Syllable NYIB"/* B2BD */, /*19008*/"Hangul Syllable NYIBS"/* B2BE */,/*19009*/"Hangul Syllable NYIS"/* B2BF */, /*19010*/"Hangul Syllable NYISS"/* B2C0 */,/*19011*/"Hangul Syllable NYING"/* B2C1 */, /*19012*/"Hangul Syllable NYIJ"/* B2C2 */,/*19013*/"Hangul Syllable NYIC"/* B2C3 */, /*19014*/"Hangul Syllable NYIK"/* B2C4 */,/*19015*/"Hangul Syllable NYIT"/* B2C5 */, /*19016*/"Hangul Syllable NYIP"/* B2C6 */,/*19017*/"Hangul Syllable NYIH"/* B2C7 */, /*19018*/"Hangul Syllable NI"/* B2C8 */,/*19019*/"Hangul Syllable NIG"/* B2C9 */, /*19020*/"Hangul Syllable NIGG"/* B2CA */,/*19021*/"Hangul Syllable NIGS"/* B2CB */, /*19022*/"Hangul Syllable NIN"/* B2CC */,/*19023*/"Hangul Syllable NINJ"/* B2CD */, /*19024*/"Hangul Syllable NINH"/* B2CE */,/*19025*/"Hangul Syllable NID"/* B2CF */, /*19026*/"Hangul Syllable NIL"/* B2D0 */,/*19027*/"Hangul Syllable NILG"/* B2D1 */, /*19028*/"Hangul Syllable NILM"/* B2D2 */,/*19029*/"Hangul Syllable NILB"/* B2D3 */, /*19030*/"Hangul Syllable NILS"/* B2D4 */,/*19031*/"Hangul Syllable NILT"/* B2D5 */, /*19032*/"Hangul Syllable NILP"/* B2D6 */,/*19033*/"Hangul Syllable NILH"/* B2D7 */, /*19034*/"Hangul Syllable NIM"/* B2D8 */,/*19035*/"Hangul Syllable NIB"/* B2D9 */, /*19036*/"Hangul Syllable NIBS"/* B2DA */,/*19037*/"Hangul Syllable NIS"/* B2DB */, /*19038*/"Hangul Syllable NISS"/* B2DC */,/*19039*/"Hangul Syllable NING"/* B2DD */, /*19040*/"Hangul Syllable NIJ"/* B2DE */,/*19041*/"Hangul Syllable NIC"/* B2DF */, /*19042*/"Hangul Syllable NIK"/* B2E0 */,/*19043*/"Hangul Syllable NIT"/* B2E1 */, /*19044*/"Hangul Syllable NIP"/* B2E2 */,/*19045*/"Hangul Syllable NIH"/* B2E3 */, /*19046*/"Hangul Syllable DA"/* B2E4 */,/*19047*/"Hangul Syllable DAG"/* B2E5 */, /*19048*/"Hangul Syllable DAGG"/* B2E6 */,/*19049*/"Hangul Syllable DAGS"/* B2E7 */, /*19050*/"Hangul Syllable DAN"/* B2E8 */,/*19051*/"Hangul Syllable DANJ"/* B2E9 */, /*19052*/"Hangul Syllable DANH"/* B2EA */,/*19053*/"Hangul Syllable DAD"/* B2EB */, /*19054*/"Hangul Syllable DAL"/* B2EC */,/*19055*/"Hangul Syllable DALG"/* B2ED */, /*19056*/"Hangul Syllable DALM"/* B2EE */,/*19057*/"Hangul Syllable DALB"/* B2EF */, /*19058*/"Hangul Syllable DALS"/* B2F0 */,/*19059*/"Hangul Syllable DALT"/* B2F1 */, /*19060*/"Hangul Syllable DALP"/* B2F2 */,/*19061*/"Hangul Syllable DALH"/* B2F3 */, /*19062*/"Hangul Syllable DAM"/* B2F4 */,/*19063*/"Hangul Syllable DAB"/* B2F5 */, /*19064*/"Hangul Syllable DABS"/* B2F6 */,/*19065*/"Hangul Syllable DAS"/* B2F7 */, /*19066*/"Hangul Syllable DASS"/* B2F8 */,/*19067*/"Hangul Syllable DANG"/* B2F9 */, /*19068*/"Hangul Syllable DAJ"/* B2FA */,/*19069*/"Hangul Syllable DAC"/* B2FB */, /*19070*/"Hangul Syllable DAK"/* B2FC */,/*19071*/"Hangul Syllable DAT"/* B2FD */, /*19072*/"Hangul Syllable DAP"/* B2FE */,/*19073*/"Hangul Syllable DAH"/* B2FF */, /*19074*/"Hangul Syllable DAE"/* B300 */,/*19075*/"Hangul Syllable DAEG"/* B301 */, /*19076*/"Hangul Syllable DAEGG"/* B302 */,/*19077*/"Hangul Syllable DAEGS"/* B303 */, /*19078*/"Hangul Syllable DAEN"/* B304 */,/*19079*/"Hangul Syllable DAENJ"/* B305 */, /*19080*/"Hangul Syllable DAENH"/* B306 */,/*19081*/"Hangul Syllable DAED"/* B307 */, /*19082*/"Hangul Syllable DAEL"/* B308 */,/*19083*/"Hangul Syllable DAELG"/* B309 */, /*19084*/"Hangul Syllable DAELM"/* B30A */,/*19085*/"Hangul Syllable DAELB"/* B30B */, /*19086*/"Hangul Syllable DAELS"/* B30C */,/*19087*/"Hangul Syllable DAELT"/* B30D */, /*19088*/"Hangul Syllable DAELP"/* B30E */,/*19089*/"Hangul Syllable DAELH"/* B30F */, /*19090*/"Hangul Syllable DAEM"/* B310 */,/*19091*/"Hangul Syllable DAEB"/* B311 */, /*19092*/"Hangul Syllable DAEBS"/* B312 */,/*19093*/"Hangul Syllable DAES"/* B313 */, /*19094*/"Hangul Syllable DAESS"/* B314 */,/*19095*/"Hangul Syllable DAENG"/* B315 */, /*19096*/"Hangul Syllable DAEJ"/* B316 */,/*19097*/"Hangul Syllable DAEC"/* B317 */, /*19098*/"Hangul Syllable DAEK"/* B318 */,/*19099*/"Hangul Syllable DAET"/* B319 */, /*19100*/"Hangul Syllable DAEP"/* B31A */,/*19101*/"Hangul Syllable DAEH"/* B31B */, /*19102*/"Hangul Syllable DYA"/* B31C */,/*19103*/"Hangul Syllable DYAG"/* B31D */, /*19104*/"Hangul Syllable DYAGG"/* B31E */,/*19105*/"Hangul Syllable DYAGS"/* B31F */, /*19106*/"Hangul Syllable DYAN"/* B320 */,/*19107*/"Hangul Syllable DYANJ"/* B321 */, /*19108*/"Hangul Syllable DYANH"/* B322 */,/*19109*/"Hangul Syllable DYAD"/* B323 */, /*19110*/"Hangul Syllable DYAL"/* B324 */,/*19111*/"Hangul Syllable DYALG"/* B325 */, /*19112*/"Hangul Syllable DYALM"/* B326 */,/*19113*/"Hangul Syllable DYALB"/* B327 */, /*19114*/"Hangul Syllable DYALS"/* B328 */,/*19115*/"Hangul Syllable DYALT"/* B329 */, /*19116*/"Hangul Syllable DYALP"/* B32A */,/*19117*/"Hangul Syllable DYALH"/* B32B */, /*19118*/"Hangul Syllable DYAM"/* B32C */,/*19119*/"Hangul Syllable DYAB"/* B32D */, /*19120*/"Hangul Syllable DYABS"/* B32E */,/*19121*/"Hangul Syllable DYAS"/* B32F */, /*19122*/"Hangul Syllable DYASS"/* B330 */,/*19123*/"Hangul Syllable DYANG"/* B331 */, /*19124*/"Hangul Syllable DYAJ"/* B332 */,/*19125*/"Hangul Syllable DYAC"/* B333 */, /*19126*/"Hangul Syllable DYAK"/* B334 */,/*19127*/"Hangul Syllable DYAT"/* B335 */, /*19128*/"Hangul Syllable DYAP"/* B336 */,/*19129*/"Hangul Syllable DYAH"/* B337 */, /*19130*/"Hangul Syllable DYAE"/* B338 */,/*19131*/"Hangul Syllable DYAEG"/* B339 */, /*19132*/"Hangul Syllable DYAEGG"/* B33A */,/*19133*/"Hangul Syllable DYAEGS"/* B33B */, /*19134*/"Hangul Syllable DYAEN"/* B33C */,/*19135*/"Hangul Syllable DYAENJ"/* B33D */, /*19136*/"Hangul Syllable DYAENH"/* B33E */,/*19137*/"Hangul Syllable DYAED"/* B33F */, /*19138*/"Hangul Syllable DYAEL"/* B340 */,/*19139*/"Hangul Syllable DYAELG"/* B341 */, /*19140*/"Hangul Syllable DYAELM"/* B342 */,/*19141*/"Hangul Syllable DYAELB"/* B343 */, /*19142*/"Hangul Syllable DYAELS"/* B344 */,/*19143*/"Hangul Syllable DYAELT"/* B345 */, /*19144*/"Hangul Syllable DYAELP"/* B346 */,/*19145*/"Hangul Syllable DYAELH"/* B347 */, /*19146*/"Hangul Syllable DYAEM"/* B348 */,/*19147*/"Hangul Syllable DYAEB"/* B349 */, /*19148*/"Hangul Syllable DYAEBS"/* B34A */,/*19149*/"Hangul Syllable DYAES"/* B34B */, /*19150*/"Hangul Syllable DYAESS"/* B34C */,/*19151*/"Hangul Syllable DYAENG"/* B34D */, /*19152*/"Hangul Syllable DYAEJ"/* B34E */,/*19153*/"Hangul Syllable DYAEC"/* B34F */, /*19154*/"Hangul Syllable DYAEK"/* B350 */,/*19155*/"Hangul Syllable DYAET"/* B351 */, /*19156*/"Hangul Syllable DYAEP"/* B352 */,/*19157*/"Hangul Syllable DYAEH"/* B353 */, /*19158*/"Hangul Syllable DEO"/* B354 */,/*19159*/"Hangul Syllable DEOG"/* B355 */, /*19160*/"Hangul Syllable DEOGG"/* B356 */,/*19161*/"Hangul Syllable DEOGS"/* B357 */, /*19162*/"Hangul Syllable DEON"/* B358 */,/*19163*/"Hangul Syllable DEONJ"/* B359 */, /*19164*/"Hangul Syllable DEONH"/* B35A */,/*19165*/"Hangul Syllable DEOD"/* B35B */, /*19166*/"Hangul Syllable DEOL"/* B35C */,/*19167*/"Hangul Syllable DEOLG"/* B35D */, /*19168*/"Hangul Syllable DEOLM"/* B35E */,/*19169*/"Hangul Syllable DEOLB"/* B35F */, /*19170*/"Hangul Syllable DEOLS"/* B360 */,/*19171*/"Hangul Syllable DEOLT"/* B361 */, /*19172*/"Hangul Syllable DEOLP"/* B362 */,/*19173*/"Hangul Syllable DEOLH"/* B363 */, /*19174*/"Hangul Syllable DEOM"/* B364 */,/*19175*/"Hangul Syllable DEOB"/* B365 */, /*19176*/"Hangul Syllable DEOBS"/* B366 */,/*19177*/"Hangul Syllable DEOS"/* B367 */, /*19178*/"Hangul Syllable DEOSS"/* B368 */,/*19179*/"Hangul Syllable DEONG"/* B369 */, /*19180*/"Hangul Syllable DEOJ"/* B36A */,/*19181*/"Hangul Syllable DEOC"/* B36B */, /*19182*/"Hangul Syllable DEOK"/* B36C */,/*19183*/"Hangul Syllable DEOT"/* B36D */, /*19184*/"Hangul Syllable DEOP"/* B36E */,/*19185*/"Hangul Syllable DEOH"/* B36F */, /*19186*/"Hangul Syllable DE"/* B370 */,/*19187*/"Hangul Syllable DEG"/* B371 */, /*19188*/"Hangul Syllable DEGG"/* B372 */,/*19189*/"Hangul Syllable DEGS"/* B373 */, /*19190*/"Hangul Syllable DEN"/* B374 */,/*19191*/"Hangul Syllable DENJ"/* B375 */, /*19192*/"Hangul Syllable DENH"/* B376 */,/*19193*/"Hangul Syllable DED"/* B377 */, /*19194*/"Hangul Syllable DEL"/* B378 */,/*19195*/"Hangul Syllable DELG"/* B379 */, /*19196*/"Hangul Syllable DELM"/* B37A */,/*19197*/"Hangul Syllable DELB"/* B37B */, /*19198*/"Hangul Syllable DELS"/* B37C */,/*19199*/"Hangul Syllable DELT"/* B37D */, /*19200*/"Hangul Syllable DELP"/* B37E */,/*19201*/"Hangul Syllable DELH"/* B37F */, /*19202*/"Hangul Syllable DEM"/* B380 */,/*19203*/"Hangul Syllable DEB"/* B381 */, /*19204*/"Hangul Syllable DEBS"/* B382 */,/*19205*/"Hangul Syllable DES"/* B383 */, /*19206*/"Hangul Syllable DESS"/* B384 */,/*19207*/"Hangul Syllable DENG"/* B385 */, /*19208*/"Hangul Syllable DEJ"/* B386 */,/*19209*/"Hangul Syllable DEC"/* B387 */, /*19210*/"Hangul Syllable DEK"/* B388 */,/*19211*/"Hangul Syllable DET"/* B389 */, /*19212*/"Hangul Syllable DEP"/* B38A */,/*19213*/"Hangul Syllable DEH"/* B38B */, /*19214*/"Hangul Syllable DYEO"/* B38C */,/*19215*/"Hangul Syllable DYEOG"/* B38D */, /*19216*/"Hangul Syllable DYEOGG"/* B38E */,/*19217*/"Hangul Syllable DYEOGS"/* B38F */, /*19218*/"Hangul Syllable DYEON"/* B390 */,/*19219*/"Hangul Syllable DYEONJ"/* B391 */, /*19220*/"Hangul Syllable DYEONH"/* B392 */,/*19221*/"Hangul Syllable DYEOD"/* B393 */, /*19222*/"Hangul Syllable DYEOL"/* B394 */,/*19223*/"Hangul Syllable DYEOLG"/* B395 */, /*19224*/"Hangul Syllable DYEOLM"/* B396 */,/*19225*/"Hangul Syllable DYEOLB"/* B397 */, /*19226*/"Hangul Syllable DYEOLS"/* B398 */,/*19227*/"Hangul Syllable DYEOLT"/* B399 */, /*19228*/"Hangul Syllable DYEOLP"/* B39A */,/*19229*/"Hangul Syllable DYEOLH"/* B39B */, /*19230*/"Hangul Syllable DYEOM"/* B39C */,/*19231*/"Hangul Syllable DYEOB"/* B39D */, /*19232*/"Hangul Syllable DYEOBS"/* B39E */,/*19233*/"Hangul Syllable DYEOS"/* B39F */, /*19234*/"Hangul Syllable DYEOSS"/* B3A0 */,/*19235*/"Hangul Syllable DYEONG"/* B3A1 */, /*19236*/"Hangul Syllable DYEOJ"/* B3A2 */,/*19237*/"Hangul Syllable DYEOC"/* B3A3 */, /*19238*/"Hangul Syllable DYEOK"/* B3A4 */,/*19239*/"Hangul Syllable DYEOT"/* B3A5 */, /*19240*/"Hangul Syllable DYEOP"/* B3A6 */,/*19241*/"Hangul Syllable DYEOH"/* B3A7 */, /*19242*/"Hangul Syllable DYE"/* B3A8 */,/*19243*/"Hangul Syllable DYEG"/* B3A9 */, /*19244*/"Hangul Syllable DYEGG"/* B3AA */,/*19245*/"Hangul Syllable DYEGS"/* B3AB */, /*19246*/"Hangul Syllable DYEN"/* B3AC */,/*19247*/"Hangul Syllable DYENJ"/* B3AD */, /*19248*/"Hangul Syllable DYENH"/* B3AE */,/*19249*/"Hangul Syllable DYED"/* B3AF */, /*19250*/"Hangul Syllable DYEL"/* B3B0 */,/*19251*/"Hangul Syllable DYELG"/* B3B1 */, /*19252*/"Hangul Syllable DYELM"/* B3B2 */,/*19253*/"Hangul Syllable DYELB"/* B3B3 */, /*19254*/"Hangul Syllable DYELS"/* B3B4 */,/*19255*/"Hangul Syllable DYELT"/* B3B5 */, /*19256*/"Hangul Syllable DYELP"/* B3B6 */,/*19257*/"Hangul Syllable DYELH"/* B3B7 */, /*19258*/"Hangul Syllable DYEM"/* B3B8 */,/*19259*/"Hangul Syllable DYEB"/* B3B9 */, /*19260*/"Hangul Syllable DYEBS"/* B3BA */,/*19261*/"Hangul Syllable DYES"/* B3BB */, /*19262*/"Hangul Syllable DYESS"/* B3BC */,/*19263*/"Hangul Syllable DYENG"/* B3BD */, /*19264*/"Hangul Syllable DYEJ"/* B3BE */,/*19265*/"Hangul Syllable DYEC"/* B3BF */, /*19266*/"Hangul Syllable DYEK"/* B3C0 */,/*19267*/"Hangul Syllable DYET"/* B3C1 */, /*19268*/"Hangul Syllable DYEP"/* B3C2 */,/*19269*/"Hangul Syllable DYEH"/* B3C3 */, /*19270*/"Hangul Syllable DO"/* B3C4 */,/*19271*/"Hangul Syllable DOG"/* B3C5 */, /*19272*/"Hangul Syllable DOGG"/* B3C6 */,/*19273*/"Hangul Syllable DOGS"/* B3C7 */, /*19274*/"Hangul Syllable DON"/* B3C8 */,/*19275*/"Hangul Syllable DONJ"/* B3C9 */, /*19276*/"Hangul Syllable DONH"/* B3CA */,/*19277*/"Hangul Syllable DOD"/* B3CB */, /*19278*/"Hangul Syllable DOL"/* B3CC */,/*19279*/"Hangul Syllable DOLG"/* B3CD */, /*19280*/"Hangul Syllable DOLM"/* B3CE */,/*19281*/"Hangul Syllable DOLB"/* B3CF */, /*19282*/"Hangul Syllable DOLS"/* B3D0 */,/*19283*/"Hangul Syllable DOLT"/* B3D1 */, /*19284*/"Hangul Syllable DOLP"/* B3D2 */,/*19285*/"Hangul Syllable DOLH"/* B3D3 */, /*19286*/"Hangul Syllable DOM"/* B3D4 */,/*19287*/"Hangul Syllable DOB"/* B3D5 */, /*19288*/"Hangul Syllable DOBS"/* B3D6 */,/*19289*/"Hangul Syllable DOS"/* B3D7 */, /*19290*/"Hangul Syllable DOSS"/* B3D8 */,/*19291*/"Hangul Syllable DONG"/* B3D9 */, /*19292*/"Hangul Syllable DOJ"/* B3DA */,/*19293*/"Hangul Syllable DOC"/* B3DB */, /*19294*/"Hangul Syllable DOK"/* B3DC */,/*19295*/"Hangul Syllable DOT"/* B3DD */, /*19296*/"Hangul Syllable DOP"/* B3DE */,/*19297*/"Hangul Syllable DOH"/* B3DF */, /*19298*/"Hangul Syllable DWA"/* B3E0 */,/*19299*/"Hangul Syllable DWAG"/* B3E1 */, /*19300*/"Hangul Syllable DWAGG"/* B3E2 */,/*19301*/"Hangul Syllable DWAGS"/* B3E3 */, /*19302*/"Hangul Syllable DWAN"/* B3E4 */,/*19303*/"Hangul Syllable DWANJ"/* B3E5 */, /*19304*/"Hangul Syllable DWANH"/* B3E6 */,/*19305*/"Hangul Syllable DWAD"/* B3E7 */, /*19306*/"Hangul Syllable DWAL"/* B3E8 */,/*19307*/"Hangul Syllable DWALG"/* B3E9 */, /*19308*/"Hangul Syllable DWALM"/* B3EA */,/*19309*/"Hangul Syllable DWALB"/* B3EB */, /*19310*/"Hangul Syllable DWALS"/* B3EC */,/*19311*/"Hangul Syllable DWALT"/* B3ED */, /*19312*/"Hangul Syllable DWALP"/* B3EE */,/*19313*/"Hangul Syllable DWALH"/* B3EF */, /*19314*/"Hangul Syllable DWAM"/* B3F0 */,/*19315*/"Hangul Syllable DWAB"/* B3F1 */, /*19316*/"Hangul Syllable DWABS"/* B3F2 */,/*19317*/"Hangul Syllable DWAS"/* B3F3 */, /*19318*/"Hangul Syllable DWASS"/* B3F4 */,/*19319*/"Hangul Syllable DWANG"/* B3F5 */, /*19320*/"Hangul Syllable DWAJ"/* B3F6 */,/*19321*/"Hangul Syllable DWAC"/* B3F7 */, /*19322*/"Hangul Syllable DWAK"/* B3F8 */,/*19323*/"Hangul Syllable DWAT"/* B3F9 */, /*19324*/"Hangul Syllable DWAP"/* B3FA */,/*19325*/"Hangul Syllable DWAH"/* B3FB */, /*19326*/"Hangul Syllable DWAE"/* B3FC */,/*19327*/"Hangul Syllable DWAEG"/* B3FD */, /*19328*/"Hangul Syllable DWAEGG"/* B3FE */,/*19329*/"Hangul Syllable DWAEGS"/* B3FF */, /*19330*/"Hangul Syllable DWAEN"/* B400 */,/*19331*/"Hangul Syllable DWAENJ"/* B401 */, /*19332*/"Hangul Syllable DWAENH"/* B402 */,/*19333*/"Hangul Syllable DWAED"/* B403 */, /*19334*/"Hangul Syllable DWAEL"/* B404 */,/*19335*/"Hangul Syllable DWAELG"/* B405 */, /*19336*/"Hangul Syllable DWAELM"/* B406 */,/*19337*/"Hangul Syllable DWAELB"/* B407 */, /*19338*/"Hangul Syllable DWAELS"/* B408 */,/*19339*/"Hangul Syllable DWAELT"/* B409 */, /*19340*/"Hangul Syllable DWAELP"/* B40A */,/*19341*/"Hangul Syllable DWAELH"/* B40B */, /*19342*/"Hangul Syllable DWAEM"/* B40C */,/*19343*/"Hangul Syllable DWAEB"/* B40D */, /*19344*/"Hangul Syllable DWAEBS"/* B40E */,/*19345*/"Hangul Syllable DWAES"/* B40F */, /*19346*/"Hangul Syllable DWAESS"/* B410 */,/*19347*/"Hangul Syllable DWAENG"/* B411 */, /*19348*/"Hangul Syllable DWAEJ"/* B412 */,/*19349*/"Hangul Syllable DWAEC"/* B413 */, /*19350*/"Hangul Syllable DWAEK"/* B414 */,/*19351*/"Hangul Syllable DWAET"/* B415 */, /*19352*/"Hangul Syllable DWAEP"/* B416 */,/*19353*/"Hangul Syllable DWAEH"/* B417 */, /*19354*/"Hangul Syllable DOE"/* B418 */,/*19355*/"Hangul Syllable DOEG"/* B419 */, /*19356*/"Hangul Syllable DOEGG"/* B41A */,/*19357*/"Hangul Syllable DOEGS"/* B41B */, /*19358*/"Hangul Syllable DOEN"/* B41C */,/*19359*/"Hangul Syllable DOENJ"/* B41D */, /*19360*/"Hangul Syllable DOENH"/* B41E */,/*19361*/"Hangul Syllable DOED"/* B41F */, /*19362*/"Hangul Syllable DOEL"/* B420 */,/*19363*/"Hangul Syllable DOELG"/* B421 */, /*19364*/"Hangul Syllable DOELM"/* B422 */,/*19365*/"Hangul Syllable DOELB"/* B423 */, /*19366*/"Hangul Syllable DOELS"/* B424 */,/*19367*/"Hangul Syllable DOELT"/* B425 */, /*19368*/"Hangul Syllable DOELP"/* B426 */,/*19369*/"Hangul Syllable DOELH"/* B427 */, /*19370*/"Hangul Syllable DOEM"/* B428 */,/*19371*/"Hangul Syllable DOEB"/* B429 */, /*19372*/"Hangul Syllable DOEBS"/* B42A */,/*19373*/"Hangul Syllable DOES"/* B42B */, /*19374*/"Hangul Syllable DOESS"/* B42C */,/*19375*/"Hangul Syllable DOENG"/* B42D */, /*19376*/"Hangul Syllable DOEJ"/* B42E */,/*19377*/"Hangul Syllable DOEC"/* B42F */, /*19378*/"Hangul Syllable DOEK"/* B430 */,/*19379*/"Hangul Syllable DOET"/* B431 */, /*19380*/"Hangul Syllable DOEP"/* B432 */,/*19381*/"Hangul Syllable DOEH"/* B433 */, /*19382*/"Hangul Syllable DYO"/* B434 */,/*19383*/"Hangul Syllable DYOG"/* B435 */, /*19384*/"Hangul Syllable DYOGG"/* B436 */,/*19385*/"Hangul Syllable DYOGS"/* B437 */, /*19386*/"Hangul Syllable DYON"/* B438 */,/*19387*/"Hangul Syllable DYONJ"/* B439 */, /*19388*/"Hangul Syllable DYONH"/* B43A */,/*19389*/"Hangul Syllable DYOD"/* B43B */, /*19390*/"Hangul Syllable DYOL"/* B43C */,/*19391*/"Hangul Syllable DYOLG"/* B43D */, /*19392*/"Hangul Syllable DYOLM"/* B43E */,/*19393*/"Hangul Syllable DYOLB"/* B43F */, /*19394*/"Hangul Syllable DYOLS"/* B440 */,/*19395*/"Hangul Syllable DYOLT"/* B441 */, /*19396*/"Hangul Syllable DYOLP"/* B442 */,/*19397*/"Hangul Syllable DYOLH"/* B443 */, /*19398*/"Hangul Syllable DYOM"/* B444 */,/*19399*/"Hangul Syllable DYOB"/* B445 */, /*19400*/"Hangul Syllable DYOBS"/* B446 */,/*19401*/"Hangul Syllable DYOS"/* B447 */, /*19402*/"Hangul Syllable DYOSS"/* B448 */,/*19403*/"Hangul Syllable DYONG"/* B449 */, /*19404*/"Hangul Syllable DYOJ"/* B44A */,/*19405*/"Hangul Syllable DYOC"/* B44B */, /*19406*/"Hangul Syllable DYOK"/* B44C */,/*19407*/"Hangul Syllable DYOT"/* B44D */, /*19408*/"Hangul Syllable DYOP"/* B44E */,/*19409*/"Hangul Syllable DYOH"/* B44F */, /*19410*/"Hangul Syllable DU"/* B450 */,/*19411*/"Hangul Syllable DUG"/* B451 */, /*19412*/"Hangul Syllable DUGG"/* B452 */,/*19413*/"Hangul Syllable DUGS"/* B453 */, /*19414*/"Hangul Syllable DUN"/* B454 */,/*19415*/"Hangul Syllable DUNJ"/* B455 */, /*19416*/"Hangul Syllable DUNH"/* B456 */,/*19417*/"Hangul Syllable DUD"/* B457 */, /*19418*/"Hangul Syllable DUL"/* B458 */,/*19419*/"Hangul Syllable DULG"/* B459 */, /*19420*/"Hangul Syllable DULM"/* B45A */,/*19421*/"Hangul Syllable DULB"/* B45B */, /*19422*/"Hangul Syllable DULS"/* B45C */,/*19423*/"Hangul Syllable DULT"/* B45D */, /*19424*/"Hangul Syllable DULP"/* B45E */,/*19425*/"Hangul Syllable DULH"/* B45F */, /*19426*/"Hangul Syllable DUM"/* B460 */,/*19427*/"Hangul Syllable DUB"/* B461 */, /*19428*/"Hangul Syllable DUBS"/* B462 */,/*19429*/"Hangul Syllable DUS"/* B463 */, /*19430*/"Hangul Syllable DUSS"/* B464 */,/*19431*/"Hangul Syllable DUNG"/* B465 */, /*19432*/"Hangul Syllable DUJ"/* B466 */,/*19433*/"Hangul Syllable DUC"/* B467 */, /*19434*/"Hangul Syllable DUK"/* B468 */,/*19435*/"Hangul Syllable DUT"/* B469 */, /*19436*/"Hangul Syllable DUP"/* B46A */,/*19437*/"Hangul Syllable DUH"/* B46B */, /*19438*/"Hangul Syllable DWEO"/* B46C */,/*19439*/"Hangul Syllable DWEOG"/* B46D */, /*19440*/"Hangul Syllable DWEOGG"/* B46E */,/*19441*/"Hangul Syllable DWEOGS"/* B46F */, /*19442*/"Hangul Syllable DWEON"/* B470 */,/*19443*/"Hangul Syllable DWEONJ"/* B471 */, /*19444*/"Hangul Syllable DWEONH"/* B472 */,/*19445*/"Hangul Syllable DWEOD"/* B473 */, /*19446*/"Hangul Syllable DWEOL"/* B474 */,/*19447*/"Hangul Syllable DWEOLG"/* B475 */, /*19448*/"Hangul Syllable DWEOLM"/* B476 */,/*19449*/"Hangul Syllable DWEOLB"/* B477 */, /*19450*/"Hangul Syllable DWEOLS"/* B478 */,/*19451*/"Hangul Syllable DWEOLT"/* B479 */, /*19452*/"Hangul Syllable DWEOLP"/* B47A */,/*19453*/"Hangul Syllable DWEOLH"/* B47B */, /*19454*/"Hangul Syllable DWEOM"/* B47C */,/*19455*/"Hangul Syllable DWEOB"/* B47D */, /*19456*/"Hangul Syllable DWEOBS"/* B47E */,/*19457*/"Hangul Syllable DWEOS"/* B47F */, /*19458*/"Hangul Syllable DWEOSS"/* B480 */,/*19459*/"Hangul Syllable DWEONG"/* B481 */, /*19460*/"Hangul Syllable DWEOJ"/* B482 */,/*19461*/"Hangul Syllable DWEOC"/* B483 */, /*19462*/"Hangul Syllable DWEOK"/* B484 */,/*19463*/"Hangul Syllable DWEOT"/* B485 */, /*19464*/"Hangul Syllable DWEOP"/* B486 */,/*19465*/"Hangul Syllable DWEOH"/* B487 */, /*19466*/"Hangul Syllable DWE"/* B488 */,/*19467*/"Hangul Syllable DWEG"/* B489 */, /*19468*/"Hangul Syllable DWEGG"/* B48A */,/*19469*/"Hangul Syllable DWEGS"/* B48B */, /*19470*/"Hangul Syllable DWEN"/* B48C */,/*19471*/"Hangul Syllable DWENJ"/* B48D */, /*19472*/"Hangul Syllable DWENH"/* B48E */,/*19473*/"Hangul Syllable DWED"/* B48F */, /*19474*/"Hangul Syllable DWEL"/* B490 */,/*19475*/"Hangul Syllable DWELG"/* B491 */, /*19476*/"Hangul Syllable DWELM"/* B492 */,/*19477*/"Hangul Syllable DWELB"/* B493 */, /*19478*/"Hangul Syllable DWELS"/* B494 */,/*19479*/"Hangul Syllable DWELT"/* B495 */, /*19480*/"Hangul Syllable DWELP"/* B496 */,/*19481*/"Hangul Syllable DWELH"/* B497 */, /*19482*/"Hangul Syllable DWEM"/* B498 */,/*19483*/"Hangul Syllable DWEB"/* B499 */, /*19484*/"Hangul Syllable DWEBS"/* B49A */,/*19485*/"Hangul Syllable DWES"/* B49B */, /*19486*/"Hangul Syllable DWESS"/* B49C */,/*19487*/"Hangul Syllable DWENG"/* B49D */, /*19488*/"Hangul Syllable DWEJ"/* B49E */,/*19489*/"Hangul Syllable DWEC"/* B49F */, /*19490*/"Hangul Syllable DWEK"/* B4A0 */,/*19491*/"Hangul Syllable DWET"/* B4A1 */, /*19492*/"Hangul Syllable DWEP"/* B4A2 */,/*19493*/"Hangul Syllable DWEH"/* B4A3 */, /*19494*/"Hangul Syllable DWI"/* B4A4 */,/*19495*/"Hangul Syllable DWIG"/* B4A5 */, /*19496*/"Hangul Syllable DWIGG"/* B4A6 */,/*19497*/"Hangul Syllable DWIGS"/* B4A7 */, /*19498*/"Hangul Syllable DWIN"/* B4A8 */,/*19499*/"Hangul Syllable DWINJ"/* B4A9 */, /*19500*/"Hangul Syllable DWINH"/* B4AA */,/*19501*/"Hangul Syllable DWID"/* B4AB */, /*19502*/"Hangul Syllable DWIL"/* B4AC */,/*19503*/"Hangul Syllable DWILG"/* B4AD */, /*19504*/"Hangul Syllable DWILM"/* B4AE */,/*19505*/"Hangul Syllable DWILB"/* B4AF */, /*19506*/"Hangul Syllable DWILS"/* B4B0 */,/*19507*/"Hangul Syllable DWILT"/* B4B1 */, /*19508*/"Hangul Syllable DWILP"/* B4B2 */,/*19509*/"Hangul Syllable DWILH"/* B4B3 */, /*19510*/"Hangul Syllable DWIM"/* B4B4 */,/*19511*/"Hangul Syllable DWIB"/* B4B5 */, /*19512*/"Hangul Syllable DWIBS"/* B4B6 */,/*19513*/"Hangul Syllable DWIS"/* B4B7 */, /*19514*/"Hangul Syllable DWISS"/* B4B8 */,/*19515*/"Hangul Syllable DWING"/* B4B9 */, /*19516*/"Hangul Syllable DWIJ"/* B4BA */,/*19517*/"Hangul Syllable DWIC"/* B4BB */, /*19518*/"Hangul Syllable DWIK"/* B4BC */,/*19519*/"Hangul Syllable DWIT"/* B4BD */, /*19520*/"Hangul Syllable DWIP"/* B4BE */,/*19521*/"Hangul Syllable DWIH"/* B4BF */, /*19522*/"Hangul Syllable DYU"/* B4C0 */,/*19523*/"Hangul Syllable DYUG"/* B4C1 */, /*19524*/"Hangul Syllable DYUGG"/* B4C2 */,/*19525*/"Hangul Syllable DYUGS"/* B4C3 */, /*19526*/"Hangul Syllable DYUN"/* B4C4 */,/*19527*/"Hangul Syllable DYUNJ"/* B4C5 */, /*19528*/"Hangul Syllable DYUNH"/* B4C6 */,/*19529*/"Hangul Syllable DYUD"/* B4C7 */, /*19530*/"Hangul Syllable DYUL"/* B4C8 */,/*19531*/"Hangul Syllable DYULG"/* B4C9 */, /*19532*/"Hangul Syllable DYULM"/* B4CA */,/*19533*/"Hangul Syllable DYULB"/* B4CB */, /*19534*/"Hangul Syllable DYULS"/* B4CC */,/*19535*/"Hangul Syllable DYULT"/* B4CD */, /*19536*/"Hangul Syllable DYULP"/* B4CE */,/*19537*/"Hangul Syllable DYULH"/* B4CF */, /*19538*/"Hangul Syllable DYUM"/* B4D0 */,/*19539*/"Hangul Syllable DYUB"/* B4D1 */, /*19540*/"Hangul Syllable DYUBS"/* B4D2 */,/*19541*/"Hangul Syllable DYUS"/* B4D3 */, /*19542*/"Hangul Syllable DYUSS"/* B4D4 */,/*19543*/"Hangul Syllable DYUNG"/* B4D5 */, /*19544*/"Hangul Syllable DYUJ"/* B4D6 */,/*19545*/"Hangul Syllable DYUC"/* B4D7 */, /*19546*/"Hangul Syllable DYUK"/* B4D8 */,/*19547*/"Hangul Syllable DYUT"/* B4D9 */, /*19548*/"Hangul Syllable DYUP"/* B4DA */,/*19549*/"Hangul Syllable DYUH"/* B4DB */, /*19550*/"Hangul Syllable DEU"/* B4DC */,/*19551*/"Hangul Syllable DEUG"/* B4DD */, /*19552*/"Hangul Syllable DEUGG"/* B4DE */,/*19553*/"Hangul Syllable DEUGS"/* B4DF */, /*19554*/"Hangul Syllable DEUN"/* B4E0 */,/*19555*/"Hangul Syllable DEUNJ"/* B4E1 */, /*19556*/"Hangul Syllable DEUNH"/* B4E2 */,/*19557*/"Hangul Syllable DEUD"/* B4E3 */, /*19558*/"Hangul Syllable DEUL"/* B4E4 */,/*19559*/"Hangul Syllable DEULG"/* B4E5 */, /*19560*/"Hangul Syllable DEULM"/* B4E6 */,/*19561*/"Hangul Syllable DEULB"/* B4E7 */, /*19562*/"Hangul Syllable DEULS"/* B4E8 */,/*19563*/"Hangul Syllable DEULT"/* B4E9 */, /*19564*/"Hangul Syllable DEULP"/* B4EA */,/*19565*/"Hangul Syllable DEULH"/* B4EB */, /*19566*/"Hangul Syllable DEUM"/* B4EC */,/*19567*/"Hangul Syllable DEUB"/* B4ED */, /*19568*/"Hangul Syllable DEUBS"/* B4EE */,/*19569*/"Hangul Syllable DEUS"/* B4EF */, /*19570*/"Hangul Syllable DEUSS"/* B4F0 */,/*19571*/"Hangul Syllable DEUNG"/* B4F1 */, /*19572*/"Hangul Syllable DEUJ"/* B4F2 */,/*19573*/"Hangul Syllable DEUC"/* B4F3 */, /*19574*/"Hangul Syllable DEUK"/* B4F4 */,/*19575*/"Hangul Syllable DEUT"/* B4F5 */, /*19576*/"Hangul Syllable DEUP"/* B4F6 */,/*19577*/"Hangul Syllable DEUH"/* B4F7 */, /*19578*/"Hangul Syllable DYI"/* B4F8 */,/*19579*/"Hangul Syllable DYIG"/* B4F9 */, /*19580*/"Hangul Syllable DYIGG"/* B4FA */,/*19581*/"Hangul Syllable DYIGS"/* B4FB */, /*19582*/"Hangul Syllable DYIN"/* B4FC */,/*19583*/"Hangul Syllable DYINJ"/* B4FD */, /*19584*/"Hangul Syllable DYINH"/* B4FE */,/*19585*/"Hangul Syllable DYID"/* B4FF */, /*19586*/"Hangul Syllable DYIL"/* B500 */,/*19587*/"Hangul Syllable DYILG"/* B501 */, /*19588*/"Hangul Syllable DYILM"/* B502 */,/*19589*/"Hangul Syllable DYILB"/* B503 */, /*19590*/"Hangul Syllable DYILS"/* B504 */,/*19591*/"Hangul Syllable DYILT"/* B505 */, /*19592*/"Hangul Syllable DYILP"/* B506 */,/*19593*/"Hangul Syllable DYILH"/* B507 */, /*19594*/"Hangul Syllable DYIM"/* B508 */,/*19595*/"Hangul Syllable DYIB"/* B509 */, /*19596*/"Hangul Syllable DYIBS"/* B50A */,/*19597*/"Hangul Syllable DYIS"/* B50B */, /*19598*/"Hangul Syllable DYISS"/* B50C */,/*19599*/"Hangul Syllable DYING"/* B50D */, /*19600*/"Hangul Syllable DYIJ"/* B50E */,/*19601*/"Hangul Syllable DYIC"/* B50F */, /*19602*/"Hangul Syllable DYIK"/* B510 */,/*19603*/"Hangul Syllable DYIT"/* B511 */, /*19604*/"Hangul Syllable DYIP"/* B512 */,/*19605*/"Hangul Syllable DYIH"/* B513 */, /*19606*/"Hangul Syllable DI"/* B514 */,/*19607*/"Hangul Syllable DIG"/* B515 */, /*19608*/"Hangul Syllable DIGG"/* B516 */,/*19609*/"Hangul Syllable DIGS"/* B517 */, /*19610*/"Hangul Syllable DIN"/* B518 */,/*19611*/"Hangul Syllable DINJ"/* B519 */, /*19612*/"Hangul Syllable DINH"/* B51A */,/*19613*/"Hangul Syllable DID"/* B51B */, /*19614*/"Hangul Syllable DIL"/* B51C */,/*19615*/"Hangul Syllable DILG"/* B51D */, /*19616*/"Hangul Syllable DILM"/* B51E */,/*19617*/"Hangul Syllable DILB"/* B51F */, /*19618*/"Hangul Syllable DILS"/* B520 */,/*19619*/"Hangul Syllable DILT"/* B521 */, /*19620*/"Hangul Syllable DILP"/* B522 */,/*19621*/"Hangul Syllable DILH"/* B523 */, /*19622*/"Hangul Syllable DIM"/* B524 */,/*19623*/"Hangul Syllable DIB"/* B525 */, /*19624*/"Hangul Syllable DIBS"/* B526 */,/*19625*/"Hangul Syllable DIS"/* B527 */, /*19626*/"Hangul Syllable DISS"/* B528 */,/*19627*/"Hangul Syllable DING"/* B529 */, /*19628*/"Hangul Syllable DIJ"/* B52A */,/*19629*/"Hangul Syllable DIC"/* B52B */, /*19630*/"Hangul Syllable DIK"/* B52C */,/*19631*/"Hangul Syllable DIT"/* B52D */, /*19632*/"Hangul Syllable DIP"/* B52E */,/*19633*/"Hangul Syllable DIH"/* B52F */, /*19634*/"Hangul Syllable DDA"/* B530 */,/*19635*/"Hangul Syllable DDAG"/* B531 */, /*19636*/"Hangul Syllable DDAGG"/* B532 */,/*19637*/"Hangul Syllable DDAGS"/* B533 */, /*19638*/"Hangul Syllable DDAN"/* B534 */,/*19639*/"Hangul Syllable DDANJ"/* B535 */, /*19640*/"Hangul Syllable DDANH"/* B536 */,/*19641*/"Hangul Syllable DDAD"/* B537 */, /*19642*/"Hangul Syllable DDAL"/* B538 */,/*19643*/"Hangul Syllable DDALG"/* B539 */, /*19644*/"Hangul Syllable DDALM"/* B53A */,/*19645*/"Hangul Syllable DDALB"/* B53B */, /*19646*/"Hangul Syllable DDALS"/* B53C */,/*19647*/"Hangul Syllable DDALT"/* B53D */, /*19648*/"Hangul Syllable DDALP"/* B53E */,/*19649*/"Hangul Syllable DDALH"/* B53F */, /*19650*/"Hangul Syllable DDAM"/* B540 */,/*19651*/"Hangul Syllable DDAB"/* B541 */, /*19652*/"Hangul Syllable DDABS"/* B542 */,/*19653*/"Hangul Syllable DDAS"/* B543 */, /*19654*/"Hangul Syllable DDASS"/* B544 */,/*19655*/"Hangul Syllable DDANG"/* B545 */, /*19656*/"Hangul Syllable DDAJ"/* B546 */,/*19657*/"Hangul Syllable DDAC"/* B547 */, /*19658*/"Hangul Syllable DDAK"/* B548 */,/*19659*/"Hangul Syllable DDAT"/* B549 */, /*19660*/"Hangul Syllable DDAP"/* B54A */,/*19661*/"Hangul Syllable DDAH"/* B54B */, /*19662*/"Hangul Syllable DDAE"/* B54C */,/*19663*/"Hangul Syllable DDAEG"/* B54D */, /*19664*/"Hangul Syllable DDAEGG"/* B54E */,/*19665*/"Hangul Syllable DDAEGS"/* B54F */, /*19666*/"Hangul Syllable DDAEN"/* B550 */,/*19667*/"Hangul Syllable DDAENJ"/* B551 */, /*19668*/"Hangul Syllable DDAENH"/* B552 */,/*19669*/"Hangul Syllable DDAED"/* B553 */, /*19670*/"Hangul Syllable DDAEL"/* B554 */,/*19671*/"Hangul Syllable DDAELG"/* B555 */, /*19672*/"Hangul Syllable DDAELM"/* B556 */,/*19673*/"Hangul Syllable DDAELB"/* B557 */, /*19674*/"Hangul Syllable DDAELS"/* B558 */,/*19675*/"Hangul Syllable DDAELT"/* B559 */, /*19676*/"Hangul Syllable DDAELP"/* B55A */,/*19677*/"Hangul Syllable DDAELH"/* B55B */, /*19678*/"Hangul Syllable DDAEM"/* B55C */,/*19679*/"Hangul Syllable DDAEB"/* B55D */, /*19680*/"Hangul Syllable DDAEBS"/* B55E */,/*19681*/"Hangul Syllable DDAES"/* B55F */, /*19682*/"Hangul Syllable DDAESS"/* B560 */,/*19683*/"Hangul Syllable DDAENG"/* B561 */, /*19684*/"Hangul Syllable DDAEJ"/* B562 */,/*19685*/"Hangul Syllable DDAEC"/* B563 */, /*19686*/"Hangul Syllable DDAEK"/* B564 */,/*19687*/"Hangul Syllable DDAET"/* B565 */, /*19688*/"Hangul Syllable DDAEP"/* B566 */,/*19689*/"Hangul Syllable DDAEH"/* B567 */, /*19690*/"Hangul Syllable DDYA"/* B568 */,/*19691*/"Hangul Syllable DDYAG"/* B569 */, /*19692*/"Hangul Syllable DDYAGG"/* B56A */,/*19693*/"Hangul Syllable DDYAGS"/* B56B */, /*19694*/"Hangul Syllable DDYAN"/* B56C */,/*19695*/"Hangul Syllable DDYANJ"/* B56D */, /*19696*/"Hangul Syllable DDYANH"/* B56E */,/*19697*/"Hangul Syllable DDYAD"/* B56F */, /*19698*/"Hangul Syllable DDYAL"/* B570 */,/*19699*/"Hangul Syllable DDYALG"/* B571 */, /*19700*/"Hangul Syllable DDYALM"/* B572 */,/*19701*/"Hangul Syllable DDYALB"/* B573 */, /*19702*/"Hangul Syllable DDYALS"/* B574 */,/*19703*/"Hangul Syllable DDYALT"/* B575 */, /*19704*/"Hangul Syllable DDYALP"/* B576 */,/*19705*/"Hangul Syllable DDYALH"/* B577 */, /*19706*/"Hangul Syllable DDYAM"/* B578 */,/*19707*/"Hangul Syllable DDYAB"/* B579 */, /*19708*/"Hangul Syllable DDYABS"/* B57A */,/*19709*/"Hangul Syllable DDYAS"/* B57B */, /*19710*/"Hangul Syllable DDYASS"/* B57C */,/*19711*/"Hangul Syllable DDYANG"/* B57D */, /*19712*/"Hangul Syllable DDYAJ"/* B57E */,/*19713*/"Hangul Syllable DDYAC"/* B57F */, /*19714*/"Hangul Syllable DDYAK"/* B580 */,/*19715*/"Hangul Syllable DDYAT"/* B581 */, /*19716*/"Hangul Syllable DDYAP"/* B582 */,/*19717*/"Hangul Syllable DDYAH"/* B583 */, /*19718*/"Hangul Syllable DDYAE"/* B584 */,/*19719*/"Hangul Syllable DDYAEG"/* B585 */, /*19720*/"Hangul Syllable DDYAEGG"/* B586 */,/*19721*/"Hangul Syllable DDYAEGS"/* B587 */, /*19722*/"Hangul Syllable DDYAEN"/* B588 */,/*19723*/"Hangul Syllable DDYAENJ"/* B589 */, /*19724*/"Hangul Syllable DDYAENH"/* B58A */,/*19725*/"Hangul Syllable DDYAED"/* B58B */, /*19726*/"Hangul Syllable DDYAEL"/* B58C */,/*19727*/"Hangul Syllable DDYAELG"/* B58D */, /*19728*/"Hangul Syllable DDYAELM"/* B58E */,/*19729*/"Hangul Syllable DDYAELB"/* B58F */, /*19730*/"Hangul Syllable DDYAELS"/* B590 */,/*19731*/"Hangul Syllable DDYAELT"/* B591 */, /*19732*/"Hangul Syllable DDYAELP"/* B592 */,/*19733*/"Hangul Syllable DDYAELH"/* B593 */, /*19734*/"Hangul Syllable DDYAEM"/* B594 */,/*19735*/"Hangul Syllable DDYAEB"/* B595 */, /*19736*/"Hangul Syllable DDYAEBS"/* B596 */,/*19737*/"Hangul Syllable DDYAES"/* B597 */, /*19738*/"Hangul Syllable DDYAESS"/* B598 */,/*19739*/"Hangul Syllable DDYAENG"/* B599 */, /*19740*/"Hangul Syllable DDYAEJ"/* B59A */,/*19741*/"Hangul Syllable DDYAEC"/* B59B */, /*19742*/"Hangul Syllable DDYAEK"/* B59C */,/*19743*/"Hangul Syllable DDYAET"/* B59D */, /*19744*/"Hangul Syllable DDYAEP"/* B59E */,/*19745*/"Hangul Syllable DDYAEH"/* B59F */, /*19746*/"Hangul Syllable DDEO"/* B5A0 */,/*19747*/"Hangul Syllable DDEOG"/* B5A1 */, /*19748*/"Hangul Syllable DDEOGG"/* B5A2 */,/*19749*/"Hangul Syllable DDEOGS"/* B5A3 */, /*19750*/"Hangul Syllable DDEON"/* B5A4 */,/*19751*/"Hangul Syllable DDEONJ"/* B5A5 */, /*19752*/"Hangul Syllable DDEONH"/* B5A6 */,/*19753*/"Hangul Syllable DDEOD"/* B5A7 */, /*19754*/"Hangul Syllable DDEOL"/* B5A8 */,/*19755*/"Hangul Syllable DDEOLG"/* B5A9 */, /*19756*/"Hangul Syllable DDEOLM"/* B5AA */,/*19757*/"Hangul Syllable DDEOLB"/* B5AB */, /*19758*/"Hangul Syllable DDEOLS"/* B5AC */,/*19759*/"Hangul Syllable DDEOLT"/* B5AD */, /*19760*/"Hangul Syllable DDEOLP"/* B5AE */,/*19761*/"Hangul Syllable DDEOLH"/* B5AF */, /*19762*/"Hangul Syllable DDEOM"/* B5B0 */,/*19763*/"Hangul Syllable DDEOB"/* B5B1 */, /*19764*/"Hangul Syllable DDEOBS"/* B5B2 */,/*19765*/"Hangul Syllable DDEOS"/* B5B3 */, /*19766*/"Hangul Syllable DDEOSS"/* B5B4 */,/*19767*/"Hangul Syllable DDEONG"/* B5B5 */, /*19768*/"Hangul Syllable DDEOJ"/* B5B6 */,/*19769*/"Hangul Syllable DDEOC"/* B5B7 */, /*19770*/"Hangul Syllable DDEOK"/* B5B8 */,/*19771*/"Hangul Syllable DDEOT"/* B5B9 */, /*19772*/"Hangul Syllable DDEOP"/* B5BA */,/*19773*/"Hangul Syllable DDEOH"/* B5BB */, /*19774*/"Hangul Syllable DDE"/* B5BC */,/*19775*/"Hangul Syllable DDEG"/* B5BD */, /*19776*/"Hangul Syllable DDEGG"/* B5BE */,/*19777*/"Hangul Syllable DDEGS"/* B5BF */, /*19778*/"Hangul Syllable DDEN"/* B5C0 */,/*19779*/"Hangul Syllable DDENJ"/* B5C1 */, /*19780*/"Hangul Syllable DDENH"/* B5C2 */,/*19781*/"Hangul Syllable DDED"/* B5C3 */, /*19782*/"Hangul Syllable DDEL"/* B5C4 */,/*19783*/"Hangul Syllable DDELG"/* B5C5 */, /*19784*/"Hangul Syllable DDELM"/* B5C6 */,/*19785*/"Hangul Syllable DDELB"/* B5C7 */, /*19786*/"Hangul Syllable DDELS"/* B5C8 */,/*19787*/"Hangul Syllable DDELT"/* B5C9 */, /*19788*/"Hangul Syllable DDELP"/* B5CA */,/*19789*/"Hangul Syllable DDELH"/* B5CB */, /*19790*/"Hangul Syllable DDEM"/* B5CC */,/*19791*/"Hangul Syllable DDEB"/* B5CD */, /*19792*/"Hangul Syllable DDEBS"/* B5CE */,/*19793*/"Hangul Syllable DDES"/* B5CF */, /*19794*/"Hangul Syllable DDESS"/* B5D0 */,/*19795*/"Hangul Syllable DDENG"/* B5D1 */, /*19796*/"Hangul Syllable DDEJ"/* B5D2 */,/*19797*/"Hangul Syllable DDEC"/* B5D3 */, /*19798*/"Hangul Syllable DDEK"/* B5D4 */,/*19799*/"Hangul Syllable DDET"/* B5D5 */, /*19800*/"Hangul Syllable DDEP"/* B5D6 */,/*19801*/"Hangul Syllable DDEH"/* B5D7 */, /*19802*/"Hangul Syllable DDYEO"/* B5D8 */,/*19803*/"Hangul Syllable DDYEOG"/* B5D9 */, /*19804*/"Hangul Syllable DDYEOGG"/* B5DA */,/*19805*/"Hangul Syllable DDYEOGS"/* B5DB */, /*19806*/"Hangul Syllable DDYEON"/* B5DC */,/*19807*/"Hangul Syllable DDYEONJ"/* B5DD */, /*19808*/"Hangul Syllable DDYEONH"/* B5DE */,/*19809*/"Hangul Syllable DDYEOD"/* B5DF */, /*19810*/"Hangul Syllable DDYEOL"/* B5E0 */,/*19811*/"Hangul Syllable DDYEOLG"/* B5E1 */, /*19812*/"Hangul Syllable DDYEOLM"/* B5E2 */,/*19813*/"Hangul Syllable DDYEOLB"/* B5E3 */, /*19814*/"Hangul Syllable DDYEOLS"/* B5E4 */,/*19815*/"Hangul Syllable DDYEOLT"/* B5E5 */, /*19816*/"Hangul Syllable DDYEOLP"/* B5E6 */,/*19817*/"Hangul Syllable DDYEOLH"/* B5E7 */, /*19818*/"Hangul Syllable DDYEOM"/* B5E8 */,/*19819*/"Hangul Syllable DDYEOB"/* B5E9 */, /*19820*/"Hangul Syllable DDYEOBS"/* B5EA */,/*19821*/"Hangul Syllable DDYEOS"/* B5EB */, /*19822*/"Hangul Syllable DDYEOSS"/* B5EC */,/*19823*/"Hangul Syllable DDYEONG"/* B5ED */, /*19824*/"Hangul Syllable DDYEOJ"/* B5EE */,/*19825*/"Hangul Syllable DDYEOC"/* B5EF */, /*19826*/"Hangul Syllable DDYEOK"/* B5F0 */,/*19827*/"Hangul Syllable DDYEOT"/* B5F1 */, /*19828*/"Hangul Syllable DDYEOP"/* B5F2 */,/*19829*/"Hangul Syllable DDYEOH"/* B5F3 */, /*19830*/"Hangul Syllable DDYE"/* B5F4 */,/*19831*/"Hangul Syllable DDYEG"/* B5F5 */, /*19832*/"Hangul Syllable DDYEGG"/* B5F6 */,/*19833*/"Hangul Syllable DDYEGS"/* B5F7 */, /*19834*/"Hangul Syllable DDYEN"/* B5F8 */,/*19835*/"Hangul Syllable DDYENJ"/* B5F9 */, /*19836*/"Hangul Syllable DDYENH"/* B5FA */,/*19837*/"Hangul Syllable DDYED"/* B5FB */, /*19838*/"Hangul Syllable DDYEL"/* B5FC */,/*19839*/"Hangul Syllable DDYELG"/* B5FD */, /*19840*/"Hangul Syllable DDYELM"/* B5FE */,/*19841*/"Hangul Syllable DDYELB"/* B5FF */, /*19842*/"Hangul Syllable DDYELS"/* B600 */,/*19843*/"Hangul Syllable DDYELT"/* B601 */, /*19844*/"Hangul Syllable DDYELP"/* B602 */,/*19845*/"Hangul Syllable DDYELH"/* B603 */, /*19846*/"Hangul Syllable DDYEM"/* B604 */,/*19847*/"Hangul Syllable DDYEB"/* B605 */, /*19848*/"Hangul Syllable DDYEBS"/* B606 */,/*19849*/"Hangul Syllable DDYES"/* B607 */, /*19850*/"Hangul Syllable DDYESS"/* B608 */,/*19851*/"Hangul Syllable DDYENG"/* B609 */, /*19852*/"Hangul Syllable DDYEJ"/* B60A */,/*19853*/"Hangul Syllable DDYEC"/* B60B */, /*19854*/"Hangul Syllable DDYEK"/* B60C */,/*19855*/"Hangul Syllable DDYET"/* B60D */, /*19856*/"Hangul Syllable DDYEP"/* B60E */,/*19857*/"Hangul Syllable DDYEH"/* B60F */, /*19858*/"Hangul Syllable DDO"/* B610 */,/*19859*/"Hangul Syllable DDOG"/* B611 */, /*19860*/"Hangul Syllable DDOGG"/* B612 */,/*19861*/"Hangul Syllable DDOGS"/* B613 */, /*19862*/"Hangul Syllable DDON"/* B614 */,/*19863*/"Hangul Syllable DDONJ"/* B615 */, /*19864*/"Hangul Syllable DDONH"/* B616 */,/*19865*/"Hangul Syllable DDOD"/* B617 */, /*19866*/"Hangul Syllable DDOL"/* B618 */,/*19867*/"Hangul Syllable DDOLG"/* B619 */, /*19868*/"Hangul Syllable DDOLM"/* B61A */,/*19869*/"Hangul Syllable DDOLB"/* B61B */, /*19870*/"Hangul Syllable DDOLS"/* B61C */,/*19871*/"Hangul Syllable DDOLT"/* B61D */, /*19872*/"Hangul Syllable DDOLP"/* B61E */,/*19873*/"Hangul Syllable DDOLH"/* B61F */, /*19874*/"Hangul Syllable DDOM"/* B620 */,/*19875*/"Hangul Syllable DDOB"/* B621 */, /*19876*/"Hangul Syllable DDOBS"/* B622 */,/*19877*/"Hangul Syllable DDOS"/* B623 */, /*19878*/"Hangul Syllable DDOSS"/* B624 */,/*19879*/"Hangul Syllable DDONG"/* B625 */, /*19880*/"Hangul Syllable DDOJ"/* B626 */,/*19881*/"Hangul Syllable DDOC"/* B627 */, /*19882*/"Hangul Syllable DDOK"/* B628 */,/*19883*/"Hangul Syllable DDOT"/* B629 */, /*19884*/"Hangul Syllable DDOP"/* B62A */,/*19885*/"Hangul Syllable DDOH"/* B62B */, /*19886*/"Hangul Syllable DDWA"/* B62C */,/*19887*/"Hangul Syllable DDWAG"/* B62D */, /*19888*/"Hangul Syllable DDWAGG"/* B62E */,/*19889*/"Hangul Syllable DDWAGS"/* B62F */, /*19890*/"Hangul Syllable DDWAN"/* B630 */,/*19891*/"Hangul Syllable DDWANJ"/* B631 */, /*19892*/"Hangul Syllable DDWANH"/* B632 */,/*19893*/"Hangul Syllable DDWAD"/* B633 */, /*19894*/"Hangul Syllable DDWAL"/* B634 */,/*19895*/"Hangul Syllable DDWALG"/* B635 */, /*19896*/"Hangul Syllable DDWALM"/* B636 */,/*19897*/"Hangul Syllable DDWALB"/* B637 */, /*19898*/"Hangul Syllable DDWALS"/* B638 */,/*19899*/"Hangul Syllable DDWALT"/* B639 */, /*19900*/"Hangul Syllable DDWALP"/* B63A */,/*19901*/"Hangul Syllable DDWALH"/* B63B */, /*19902*/"Hangul Syllable DDWAM"/* B63C */,/*19903*/"Hangul Syllable DDWAB"/* B63D */, /*19904*/"Hangul Syllable DDWABS"/* B63E */,/*19905*/"Hangul Syllable DDWAS"/* B63F */, /*19906*/"Hangul Syllable DDWASS"/* B640 */,/*19907*/"Hangul Syllable DDWANG"/* B641 */, /*19908*/"Hangul Syllable DDWAJ"/* B642 */,/*19909*/"Hangul Syllable DDWAC"/* B643 */, /*19910*/"Hangul Syllable DDWAK"/* B644 */,/*19911*/"Hangul Syllable DDWAT"/* B645 */, /*19912*/"Hangul Syllable DDWAP"/* B646 */,/*19913*/"Hangul Syllable DDWAH"/* B647 */, /*19914*/"Hangul Syllable DDWAE"/* B648 */,/*19915*/"Hangul Syllable DDWAEG"/* B649 */, /*19916*/"Hangul Syllable DDWAEGG"/* B64A */,/*19917*/"Hangul Syllable DDWAEGS"/* B64B */, /*19918*/"Hangul Syllable DDWAEN"/* B64C */,/*19919*/"Hangul Syllable DDWAENJ"/* B64D */, /*19920*/"Hangul Syllable DDWAENH"/* B64E */,/*19921*/"Hangul Syllable DDWAED"/* B64F */, /*19922*/"Hangul Syllable DDWAEL"/* B650 */,/*19923*/"Hangul Syllable DDWAELG"/* B651 */, /*19924*/"Hangul Syllable DDWAELM"/* B652 */,/*19925*/"Hangul Syllable DDWAELB"/* B653 */, /*19926*/"Hangul Syllable DDWAELS"/* B654 */,/*19927*/"Hangul Syllable DDWAELT"/* B655 */, /*19928*/"Hangul Syllable DDWAELP"/* B656 */,/*19929*/"Hangul Syllable DDWAELH"/* B657 */, /*19930*/"Hangul Syllable DDWAEM"/* B658 */,/*19931*/"Hangul Syllable DDWAEB"/* B659 */, /*19932*/"Hangul Syllable DDWAEBS"/* B65A */,/*19933*/"Hangul Syllable DDWAES"/* B65B */, /*19934*/"Hangul Syllable DDWAESS"/* B65C */,/*19935*/"Hangul Syllable DDWAENG"/* B65D */, /*19936*/"Hangul Syllable DDWAEJ"/* B65E */,/*19937*/"Hangul Syllable DDWAEC"/* B65F */, /*19938*/"Hangul Syllable DDWAEK"/* B660 */,/*19939*/"Hangul Syllable DDWAET"/* B661 */, /*19940*/"Hangul Syllable DDWAEP"/* B662 */,/*19941*/"Hangul Syllable DDWAEH"/* B663 */, /*19942*/"Hangul Syllable DDOE"/* B664 */,/*19943*/"Hangul Syllable DDOEG"/* B665 */, /*19944*/"Hangul Syllable DDOEGG"/* B666 */,/*19945*/"Hangul Syllable DDOEGS"/* B667 */, /*19946*/"Hangul Syllable DDOEN"/* B668 */,/*19947*/"Hangul Syllable DDOENJ"/* B669 */, /*19948*/"Hangul Syllable DDOENH"/* B66A */,/*19949*/"Hangul Syllable DDOED"/* B66B */, /*19950*/"Hangul Syllable DDOEL"/* B66C */,/*19951*/"Hangul Syllable DDOELG"/* B66D */, /*19952*/"Hangul Syllable DDOELM"/* B66E */,/*19953*/"Hangul Syllable DDOELB"/* B66F */, /*19954*/"Hangul Syllable DDOELS"/* B670 */,/*19955*/"Hangul Syllable DDOELT"/* B671 */, /*19956*/"Hangul Syllable DDOELP"/* B672 */,/*19957*/"Hangul Syllable DDOELH"/* B673 */, /*19958*/"Hangul Syllable DDOEM"/* B674 */,/*19959*/"Hangul Syllable DDOEB"/* B675 */, /*19960*/"Hangul Syllable DDOEBS"/* B676 */,/*19961*/"Hangul Syllable DDOES"/* B677 */, /*19962*/"Hangul Syllable DDOESS"/* B678 */,/*19963*/"Hangul Syllable DDOENG"/* B679 */, /*19964*/"Hangul Syllable DDOEJ"/* B67A */,/*19965*/"Hangul Syllable DDOEC"/* B67B */, /*19966*/"Hangul Syllable DDOEK"/* B67C */,/*19967*/"Hangul Syllable DDOET"/* B67D */, /*19968*/"Hangul Syllable DDOEP"/* B67E */,/*19969*/"Hangul Syllable DDOEH"/* B67F */, /*19970*/"Hangul Syllable DDYO"/* B680 */,/*19971*/"Hangul Syllable DDYOG"/* B681 */, /*19972*/"Hangul Syllable DDYOGG"/* B682 */,/*19973*/"Hangul Syllable DDYOGS"/* B683 */, /*19974*/"Hangul Syllable DDYON"/* B684 */,/*19975*/"Hangul Syllable DDYONJ"/* B685 */, /*19976*/"Hangul Syllable DDYONH"/* B686 */,/*19977*/"Hangul Syllable DDYOD"/* B687 */, /*19978*/"Hangul Syllable DDYOL"/* B688 */,/*19979*/"Hangul Syllable DDYOLG"/* B689 */, /*19980*/"Hangul Syllable DDYOLM"/* B68A */,/*19981*/"Hangul Syllable DDYOLB"/* B68B */, /*19982*/"Hangul Syllable DDYOLS"/* B68C */,/*19983*/"Hangul Syllable DDYOLT"/* B68D */, /*19984*/"Hangul Syllable DDYOLP"/* B68E */,/*19985*/"Hangul Syllable DDYOLH"/* B68F */, /*19986*/"Hangul Syllable DDYOM"/* B690 */,/*19987*/"Hangul Syllable DDYOB"/* B691 */, /*19988*/"Hangul Syllable DDYOBS"/* B692 */,/*19989*/"Hangul Syllable DDYOS"/* B693 */, /*19990*/"Hangul Syllable DDYOSS"/* B694 */,/*19991*/"Hangul Syllable DDYONG"/* B695 */, /*19992*/"Hangul Syllable DDYOJ"/* B696 */,/*19993*/"Hangul Syllable DDYOC"/* B697 */, /*19994*/"Hangul Syllable DDYOK"/* B698 */,/*19995*/"Hangul Syllable DDYOT"/* B699 */, /*19996*/"Hangul Syllable DDYOP"/* B69A */,/*19997*/"Hangul Syllable DDYOH"/* B69B */, /*19998*/"Hangul Syllable DDU"/* B69C */,/*19999*/"Hangul Syllable DDUG"/* B69D */, /*20000*/"Hangul Syllable DDUGG"/* B69E */,/*20001*/"Hangul Syllable DDUGS"/* B69F */, /*20002*/"Hangul Syllable DDUN"/* B6A0 */,/*20003*/"Hangul Syllable DDUNJ"/* B6A1 */, /*20004*/"Hangul Syllable DDUNH"/* B6A2 */,/*20005*/"Hangul Syllable DDUD"/* B6A3 */, /*20006*/"Hangul Syllable DDUL"/* B6A4 */,/*20007*/"Hangul Syllable DDULG"/* B6A5 */, /*20008*/"Hangul Syllable DDULM"/* B6A6 */,/*20009*/"Hangul Syllable DDULB"/* B6A7 */, /*20010*/"Hangul Syllable DDULS"/* B6A8 */,/*20011*/"Hangul Syllable DDULT"/* B6A9 */, /*20012*/"Hangul Syllable DDULP"/* B6AA */,/*20013*/"Hangul Syllable DDULH"/* B6AB */, /*20014*/"Hangul Syllable DDUM"/* B6AC */,/*20015*/"Hangul Syllable DDUB"/* B6AD */, /*20016*/"Hangul Syllable DDUBS"/* B6AE */,/*20017*/"Hangul Syllable DDUS"/* B6AF */, /*20018*/"Hangul Syllable DDUSS"/* B6B0 */,/*20019*/"Hangul Syllable DDUNG"/* B6B1 */, /*20020*/"Hangul Syllable DDUJ"/* B6B2 */,/*20021*/"Hangul Syllable DDUC"/* B6B3 */, /*20022*/"Hangul Syllable DDUK"/* B6B4 */,/*20023*/"Hangul Syllable DDUT"/* B6B5 */, /*20024*/"Hangul Syllable DDUP"/* B6B6 */,/*20025*/"Hangul Syllable DDUH"/* B6B7 */, /*20026*/"Hangul Syllable DDWEO"/* B6B8 */,/*20027*/"Hangul Syllable DDWEOG"/* B6B9 */, /*20028*/"Hangul Syllable DDWEOGG"/* B6BA */,/*20029*/"Hangul Syllable DDWEOGS"/* B6BB */, /*20030*/"Hangul Syllable DDWEON"/* B6BC */,/*20031*/"Hangul Syllable DDWEONJ"/* B6BD */, /*20032*/"Hangul Syllable DDWEONH"/* B6BE */,/*20033*/"Hangul Syllable DDWEOD"/* B6BF */, /*20034*/"Hangul Syllable DDWEOL"/* B6C0 */,/*20035*/"Hangul Syllable DDWEOLG"/* B6C1 */, /*20036*/"Hangul Syllable DDWEOLM"/* B6C2 */,/*20037*/"Hangul Syllable DDWEOLB"/* B6C3 */, /*20038*/"Hangul Syllable DDWEOLS"/* B6C4 */,/*20039*/"Hangul Syllable DDWEOLT"/* B6C5 */, /*20040*/"Hangul Syllable DDWEOLP"/* B6C6 */,/*20041*/"Hangul Syllable DDWEOLH"/* B6C7 */, /*20042*/"Hangul Syllable DDWEOM"/* B6C8 */,/*20043*/"Hangul Syllable DDWEOB"/* B6C9 */, /*20044*/"Hangul Syllable DDWEOBS"/* B6CA */,/*20045*/"Hangul Syllable DDWEOS"/* B6CB */, /*20046*/"Hangul Syllable DDWEOSS"/* B6CC */,/*20047*/"Hangul Syllable DDWEONG"/* B6CD */, /*20048*/"Hangul Syllable DDWEOJ"/* B6CE */,/*20049*/"Hangul Syllable DDWEOC"/* B6CF */, /*20050*/"Hangul Syllable DDWEOK"/* B6D0 */,/*20051*/"Hangul Syllable DDWEOT"/* B6D1 */, /*20052*/"Hangul Syllable DDWEOP"/* B6D2 */,/*20053*/"Hangul Syllable DDWEOH"/* B6D3 */, /*20054*/"Hangul Syllable DDWE"/* B6D4 */,/*20055*/"Hangul Syllable DDWEG"/* B6D5 */, /*20056*/"Hangul Syllable DDWEGG"/* B6D6 */,/*20057*/"Hangul Syllable DDWEGS"/* B6D7 */, /*20058*/"Hangul Syllable DDWEN"/* B6D8 */,/*20059*/"Hangul Syllable DDWENJ"/* B6D9 */, /*20060*/"Hangul Syllable DDWENH"/* B6DA */,/*20061*/"Hangul Syllable DDWED"/* B6DB */, /*20062*/"Hangul Syllable DDWEL"/* B6DC */,/*20063*/"Hangul Syllable DDWELG"/* B6DD */, /*20064*/"Hangul Syllable DDWELM"/* B6DE */,/*20065*/"Hangul Syllable DDWELB"/* B6DF */, /*20066*/"Hangul Syllable DDWELS"/* B6E0 */,/*20067*/"Hangul Syllable DDWELT"/* B6E1 */, /*20068*/"Hangul Syllable DDWELP"/* B6E2 */,/*20069*/"Hangul Syllable DDWELH"/* B6E3 */, /*20070*/"Hangul Syllable DDWEM"/* B6E4 */,/*20071*/"Hangul Syllable DDWEB"/* B6E5 */, /*20072*/"Hangul Syllable DDWEBS"/* B6E6 */,/*20073*/"Hangul Syllable DDWES"/* B6E7 */, /*20074*/"Hangul Syllable DDWESS"/* B6E8 */,/*20075*/"Hangul Syllable DDWENG"/* B6E9 */, /*20076*/"Hangul Syllable DDWEJ"/* B6EA */,/*20077*/"Hangul Syllable DDWEC"/* B6EB */, /*20078*/"Hangul Syllable DDWEK"/* B6EC */,/*20079*/"Hangul Syllable DDWET"/* B6ED */, /*20080*/"Hangul Syllable DDWEP"/* B6EE */,/*20081*/"Hangul Syllable DDWEH"/* B6EF */, /*20082*/"Hangul Syllable DDWI"/* B6F0 */,/*20083*/"Hangul Syllable DDWIG"/* B6F1 */, /*20084*/"Hangul Syllable DDWIGG"/* B6F2 */,/*20085*/"Hangul Syllable DDWIGS"/* B6F3 */, /*20086*/"Hangul Syllable DDWIN"/* B6F4 */,/*20087*/"Hangul Syllable DDWINJ"/* B6F5 */, /*20088*/"Hangul Syllable DDWINH"/* B6F6 */,/*20089*/"Hangul Syllable DDWID"/* B6F7 */, /*20090*/"Hangul Syllable DDWIL"/* B6F8 */,/*20091*/"Hangul Syllable DDWILG"/* B6F9 */, /*20092*/"Hangul Syllable DDWILM"/* B6FA */,/*20093*/"Hangul Syllable DDWILB"/* B6FB */, /*20094*/"Hangul Syllable DDWILS"/* B6FC */,/*20095*/"Hangul Syllable DDWILT"/* B6FD */, /*20096*/"Hangul Syllable DDWILP"/* B6FE */,/*20097*/"Hangul Syllable DDWILH"/* B6FF */, /*20098*/"Hangul Syllable DDWIM"/* B700 */,/*20099*/"Hangul Syllable DDWIB"/* B701 */, /*20100*/"Hangul Syllable DDWIBS"/* B702 */,/*20101*/"Hangul Syllable DDWIS"/* B703 */, /*20102*/"Hangul Syllable DDWISS"/* B704 */,/*20103*/"Hangul Syllable DDWING"/* B705 */, /*20104*/"Hangul Syllable DDWIJ"/* B706 */,/*20105*/"Hangul Syllable DDWIC"/* B707 */, /*20106*/"Hangul Syllable DDWIK"/* B708 */,/*20107*/"Hangul Syllable DDWIT"/* B709 */, /*20108*/"Hangul Syllable DDWIP"/* B70A */,/*20109*/"Hangul Syllable DDWIH"/* B70B */, /*20110*/"Hangul Syllable DDYU"/* B70C */,/*20111*/"Hangul Syllable DDYUG"/* B70D */, /*20112*/"Hangul Syllable DDYUGG"/* B70E */,/*20113*/"Hangul Syllable DDYUGS"/* B70F */, /*20114*/"Hangul Syllable DDYUN"/* B710 */,/*20115*/"Hangul Syllable DDYUNJ"/* B711 */, /*20116*/"Hangul Syllable DDYUNH"/* B712 */,/*20117*/"Hangul Syllable DDYUD"/* B713 */, /*20118*/"Hangul Syllable DDYUL"/* B714 */,/*20119*/"Hangul Syllable DDYULG"/* B715 */, /*20120*/"Hangul Syllable DDYULM"/* B716 */,/*20121*/"Hangul Syllable DDYULB"/* B717 */, /*20122*/"Hangul Syllable DDYULS"/* B718 */,/*20123*/"Hangul Syllable DDYULT"/* B719 */, /*20124*/"Hangul Syllable DDYULP"/* B71A */,/*20125*/"Hangul Syllable DDYULH"/* B71B */, /*20126*/"Hangul Syllable DDYUM"/* B71C */,/*20127*/"Hangul Syllable DDYUB"/* B71D */, /*20128*/"Hangul Syllable DDYUBS"/* B71E */,/*20129*/"Hangul Syllable DDYUS"/* B71F */, /*20130*/"Hangul Syllable DDYUSS"/* B720 */,/*20131*/"Hangul Syllable DDYUNG"/* B721 */, /*20132*/"Hangul Syllable DDYUJ"/* B722 */,/*20133*/"Hangul Syllable DDYUC"/* B723 */, /*20134*/"Hangul Syllable DDYUK"/* B724 */,/*20135*/"Hangul Syllable DDYUT"/* B725 */, /*20136*/"Hangul Syllable DDYUP"/* B726 */,/*20137*/"Hangul Syllable DDYUH"/* B727 */, /*20138*/"Hangul Syllable DDEU"/* B728 */,/*20139*/"Hangul Syllable DDEUG"/* B729 */, /*20140*/"Hangul Syllable DDEUGG"/* B72A */,/*20141*/"Hangul Syllable DDEUGS"/* B72B */, /*20142*/"Hangul Syllable DDEUN"/* B72C */,/*20143*/"Hangul Syllable DDEUNJ"/* B72D */, /*20144*/"Hangul Syllable DDEUNH"/* B72E */,/*20145*/"Hangul Syllable DDEUD"/* B72F */, /*20146*/"Hangul Syllable DDEUL"/* B730 */,/*20147*/"Hangul Syllable DDEULG"/* B731 */, /*20148*/"Hangul Syllable DDEULM"/* B732 */,/*20149*/"Hangul Syllable DDEULB"/* B733 */, /*20150*/"Hangul Syllable DDEULS"/* B734 */,/*20151*/"Hangul Syllable DDEULT"/* B735 */, /*20152*/"Hangul Syllable DDEULP"/* B736 */,/*20153*/"Hangul Syllable DDEULH"/* B737 */, /*20154*/"Hangul Syllable DDEUM"/* B738 */,/*20155*/"Hangul Syllable DDEUB"/* B739 */, /*20156*/"Hangul Syllable DDEUBS"/* B73A */,/*20157*/"Hangul Syllable DDEUS"/* B73B */, /*20158*/"Hangul Syllable DDEUSS"/* B73C */,/*20159*/"Hangul Syllable DDEUNG"/* B73D */, /*20160*/"Hangul Syllable DDEUJ"/* B73E */,/*20161*/"Hangul Syllable DDEUC"/* B73F */, /*20162*/"Hangul Syllable DDEUK"/* B740 */,/*20163*/"Hangul Syllable DDEUT"/* B741 */, /*20164*/"Hangul Syllable DDEUP"/* B742 */,/*20165*/"Hangul Syllable DDEUH"/* B743 */, /*20166*/"Hangul Syllable DDYI"/* B744 */,/*20167*/"Hangul Syllable DDYIG"/* B745 */, /*20168*/"Hangul Syllable DDYIGG"/* B746 */,/*20169*/"Hangul Syllable DDYIGS"/* B747 */, /*20170*/"Hangul Syllable DDYIN"/* B748 */,/*20171*/"Hangul Syllable DDYINJ"/* B749 */, /*20172*/"Hangul Syllable DDYINH"/* B74A */,/*20173*/"Hangul Syllable DDYID"/* B74B */, /*20174*/"Hangul Syllable DDYIL"/* B74C */,/*20175*/"Hangul Syllable DDYILG"/* B74D */, /*20176*/"Hangul Syllable DDYILM"/* B74E */,/*20177*/"Hangul Syllable DDYILB"/* B74F */, /*20178*/"Hangul Syllable DDYILS"/* B750 */,/*20179*/"Hangul Syllable DDYILT"/* B751 */, /*20180*/"Hangul Syllable DDYILP"/* B752 */,/*20181*/"Hangul Syllable DDYILH"/* B753 */, /*20182*/"Hangul Syllable DDYIM"/* B754 */,/*20183*/"Hangul Syllable DDYIB"/* B755 */, /*20184*/"Hangul Syllable DDYIBS"/* B756 */,/*20185*/"Hangul Syllable DDYIS"/* B757 */, /*20186*/"Hangul Syllable DDYISS"/* B758 */,/*20187*/"Hangul Syllable DDYING"/* B759 */, /*20188*/"Hangul Syllable DDYIJ"/* B75A */,/*20189*/"Hangul Syllable DDYIC"/* B75B */, /*20190*/"Hangul Syllable DDYIK"/* B75C */,/*20191*/"Hangul Syllable DDYIT"/* B75D */, /*20192*/"Hangul Syllable DDYIP"/* B75E */,/*20193*/"Hangul Syllable DDYIH"/* B75F */, /*20194*/"Hangul Syllable DDI"/* B760 */,/*20195*/"Hangul Syllable DDIG"/* B761 */, /*20196*/"Hangul Syllable DDIGG"/* B762 */,/*20197*/"Hangul Syllable DDIGS"/* B763 */, /*20198*/"Hangul Syllable DDIN"/* B764 */,/*20199*/"Hangul Syllable DDINJ"/* B765 */, /*20200*/"Hangul Syllable DDINH"/* B766 */,/*20201*/"Hangul Syllable DDID"/* B767 */, /*20202*/"Hangul Syllable DDIL"/* B768 */,/*20203*/"Hangul Syllable DDILG"/* B769 */, /*20204*/"Hangul Syllable DDILM"/* B76A */,/*20205*/"Hangul Syllable DDILB"/* B76B */, /*20206*/"Hangul Syllable DDILS"/* B76C */,/*20207*/"Hangul Syllable DDILT"/* B76D */, /*20208*/"Hangul Syllable DDILP"/* B76E */,/*20209*/"Hangul Syllable DDILH"/* B76F */, /*20210*/"Hangul Syllable DDIM"/* B770 */,/*20211*/"Hangul Syllable DDIB"/* B771 */, /*20212*/"Hangul Syllable DDIBS"/* B772 */,/*20213*/"Hangul Syllable DDIS"/* B773 */, /*20214*/"Hangul Syllable DDISS"/* B774 */,/*20215*/"Hangul Syllable DDING"/* B775 */, /*20216*/"Hangul Syllable DDIJ"/* B776 */,/*20217*/"Hangul Syllable DDIC"/* B777 */, /*20218*/"Hangul Syllable DDIK"/* B778 */,/*20219*/"Hangul Syllable DDIT"/* B779 */, /*20220*/"Hangul Syllable DDIP"/* B77A */,/*20221*/"Hangul Syllable DDIH"/* B77B */, /*20222*/"Hangul Syllable RA"/* B77C */,/*20223*/"Hangul Syllable RAG"/* B77D */, /*20224*/"Hangul Syllable RAGG"/* B77E */,/*20225*/"Hangul Syllable RAGS"/* B77F */, /*20226*/"Hangul Syllable RAN"/* B780 */,/*20227*/"Hangul Syllable RANJ"/* B781 */, /*20228*/"Hangul Syllable RANH"/* B782 */,/*20229*/"Hangul Syllable RAD"/* B783 */, /*20230*/"Hangul Syllable RAL"/* B784 */,/*20231*/"Hangul Syllable RALG"/* B785 */, /*20232*/"Hangul Syllable RALM"/* B786 */,/*20233*/"Hangul Syllable RALB"/* B787 */, /*20234*/"Hangul Syllable RALS"/* B788 */,/*20235*/"Hangul Syllable RALT"/* B789 */, /*20236*/"Hangul Syllable RALP"/* B78A */,/*20237*/"Hangul Syllable RALH"/* B78B */, /*20238*/"Hangul Syllable RAM"/* B78C */,/*20239*/"Hangul Syllable RAB"/* B78D */, /*20240*/"Hangul Syllable RABS"/* B78E */,/*20241*/"Hangul Syllable RAS"/* B78F */, /*20242*/"Hangul Syllable RASS"/* B790 */,/*20243*/"Hangul Syllable RANG"/* B791 */, /*20244*/"Hangul Syllable RAJ"/* B792 */,/*20245*/"Hangul Syllable RAC"/* B793 */, /*20246*/"Hangul Syllable RAK"/* B794 */,/*20247*/"Hangul Syllable RAT"/* B795 */, /*20248*/"Hangul Syllable RAP"/* B796 */,/*20249*/"Hangul Syllable RAH"/* B797 */, /*20250*/"Hangul Syllable RAE"/* B798 */,/*20251*/"Hangul Syllable RAEG"/* B799 */, /*20252*/"Hangul Syllable RAEGG"/* B79A */,/*20253*/"Hangul Syllable RAEGS"/* B79B */, /*20254*/"Hangul Syllable RAEN"/* B79C */,/*20255*/"Hangul Syllable RAENJ"/* B79D */, /*20256*/"Hangul Syllable RAENH"/* B79E */,/*20257*/"Hangul Syllable RAED"/* B79F */, /*20258*/"Hangul Syllable RAEL"/* B7A0 */,/*20259*/"Hangul Syllable RAELG"/* B7A1 */, /*20260*/"Hangul Syllable RAELM"/* B7A2 */,/*20261*/"Hangul Syllable RAELB"/* B7A3 */, /*20262*/"Hangul Syllable RAELS"/* B7A4 */,/*20263*/"Hangul Syllable RAELT"/* B7A5 */, /*20264*/"Hangul Syllable RAELP"/* B7A6 */,/*20265*/"Hangul Syllable RAELH"/* B7A7 */, /*20266*/"Hangul Syllable RAEM"/* B7A8 */,/*20267*/"Hangul Syllable RAEB"/* B7A9 */, /*20268*/"Hangul Syllable RAEBS"/* B7AA */,/*20269*/"Hangul Syllable RAES"/* B7AB */, /*20270*/"Hangul Syllable RAESS"/* B7AC */,/*20271*/"Hangul Syllable RAENG"/* B7AD */, /*20272*/"Hangul Syllable RAEJ"/* B7AE */,/*20273*/"Hangul Syllable RAEC"/* B7AF */, /*20274*/"Hangul Syllable RAEK"/* B7B0 */,/*20275*/"Hangul Syllable RAET"/* B7B1 */, /*20276*/"Hangul Syllable RAEP"/* B7B2 */,/*20277*/"Hangul Syllable RAEH"/* B7B3 */, /*20278*/"Hangul Syllable RYA"/* B7B4 */,/*20279*/"Hangul Syllable RYAG"/* B7B5 */, /*20280*/"Hangul Syllable RYAGG"/* B7B6 */,/*20281*/"Hangul Syllable RYAGS"/* B7B7 */, /*20282*/"Hangul Syllable RYAN"/* B7B8 */,/*20283*/"Hangul Syllable RYANJ"/* B7B9 */, /*20284*/"Hangul Syllable RYANH"/* B7BA */,/*20285*/"Hangul Syllable RYAD"/* B7BB */, /*20286*/"Hangul Syllable RYAL"/* B7BC */,/*20287*/"Hangul Syllable RYALG"/* B7BD */, /*20288*/"Hangul Syllable RYALM"/* B7BE */,/*20289*/"Hangul Syllable RYALB"/* B7BF */, /*20290*/"Hangul Syllable RYALS"/* B7C0 */,/*20291*/"Hangul Syllable RYALT"/* B7C1 */, /*20292*/"Hangul Syllable RYALP"/* B7C2 */,/*20293*/"Hangul Syllable RYALH"/* B7C3 */, /*20294*/"Hangul Syllable RYAM"/* B7C4 */,/*20295*/"Hangul Syllable RYAB"/* B7C5 */, /*20296*/"Hangul Syllable RYABS"/* B7C6 */,/*20297*/"Hangul Syllable RYAS"/* B7C7 */, /*20298*/"Hangul Syllable RYASS"/* B7C8 */,/*20299*/"Hangul Syllable RYANG"/* B7C9 */, /*20300*/"Hangul Syllable RYAJ"/* B7CA */,/*20301*/"Hangul Syllable RYAC"/* B7CB */, /*20302*/"Hangul Syllable RYAK"/* B7CC */,/*20303*/"Hangul Syllable RYAT"/* B7CD */, /*20304*/"Hangul Syllable RYAP"/* B7CE */,/*20305*/"Hangul Syllable RYAH"/* B7CF */, /*20306*/"Hangul Syllable RYAE"/* B7D0 */,/*20307*/"Hangul Syllable RYAEG"/* B7D1 */, /*20308*/"Hangul Syllable RYAEGG"/* B7D2 */,/*20309*/"Hangul Syllable RYAEGS"/* B7D3 */, /*20310*/"Hangul Syllable RYAEN"/* B7D4 */,/*20311*/"Hangul Syllable RYAENJ"/* B7D5 */, /*20312*/"Hangul Syllable RYAENH"/* B7D6 */,/*20313*/"Hangul Syllable RYAED"/* B7D7 */, /*20314*/"Hangul Syllable RYAEL"/* B7D8 */,/*20315*/"Hangul Syllable RYAELG"/* B7D9 */, /*20316*/"Hangul Syllable RYAELM"/* B7DA */,/*20317*/"Hangul Syllable RYAELB"/* B7DB */, /*20318*/"Hangul Syllable RYAELS"/* B7DC */,/*20319*/"Hangul Syllable RYAELT"/* B7DD */, /*20320*/"Hangul Syllable RYAELP"/* B7DE */,/*20321*/"Hangul Syllable RYAELH"/* B7DF */, /*20322*/"Hangul Syllable RYAEM"/* B7E0 */,/*20323*/"Hangul Syllable RYAEB"/* B7E1 */, /*20324*/"Hangul Syllable RYAEBS"/* B7E2 */,/*20325*/"Hangul Syllable RYAES"/* B7E3 */, /*20326*/"Hangul Syllable RYAESS"/* B7E4 */,/*20327*/"Hangul Syllable RYAENG"/* B7E5 */, /*20328*/"Hangul Syllable RYAEJ"/* B7E6 */,/*20329*/"Hangul Syllable RYAEC"/* B7E7 */, /*20330*/"Hangul Syllable RYAEK"/* B7E8 */,/*20331*/"Hangul Syllable RYAET"/* B7E9 */, /*20332*/"Hangul Syllable RYAEP"/* B7EA */,/*20333*/"Hangul Syllable RYAEH"/* B7EB */, /*20334*/"Hangul Syllable REO"/* B7EC */,/*20335*/"Hangul Syllable REOG"/* B7ED */, /*20336*/"Hangul Syllable REOGG"/* B7EE */,/*20337*/"Hangul Syllable REOGS"/* B7EF */, /*20338*/"Hangul Syllable REON"/* B7F0 */,/*20339*/"Hangul Syllable REONJ"/* B7F1 */, /*20340*/"Hangul Syllable REONH"/* B7F2 */,/*20341*/"Hangul Syllable REOD"/* B7F3 */, /*20342*/"Hangul Syllable REOL"/* B7F4 */,/*20343*/"Hangul Syllable REOLG"/* B7F5 */, /*20344*/"Hangul Syllable REOLM"/* B7F6 */,/*20345*/"Hangul Syllable REOLB"/* B7F7 */, /*20346*/"Hangul Syllable REOLS"/* B7F8 */,/*20347*/"Hangul Syllable REOLT"/* B7F9 */, /*20348*/"Hangul Syllable REOLP"/* B7FA */,/*20349*/"Hangul Syllable REOLH"/* B7FB */, /*20350*/"Hangul Syllable REOM"/* B7FC */,/*20351*/"Hangul Syllable REOB"/* B7FD */, /*20352*/"Hangul Syllable REOBS"/* B7FE */,/*20353*/"Hangul Syllable REOS"/* B7FF */, /*20354*/"Hangul Syllable REOSS"/* B800 */,/*20355*/"Hangul Syllable REONG"/* B801 */, /*20356*/"Hangul Syllable REOJ"/* B802 */,/*20357*/"Hangul Syllable REOC"/* B803 */, /*20358*/"Hangul Syllable REOK"/* B804 */,/*20359*/"Hangul Syllable REOT"/* B805 */, /*20360*/"Hangul Syllable REOP"/* B806 */,/*20361*/"Hangul Syllable REOH"/* B807 */, /*20362*/"Hangul Syllable RE"/* B808 */,/*20363*/"Hangul Syllable REG"/* B809 */, /*20364*/"Hangul Syllable REGG"/* B80A */,/*20365*/"Hangul Syllable REGS"/* B80B */, /*20366*/"Hangul Syllable REN"/* B80C */,/*20367*/"Hangul Syllable RENJ"/* B80D */, /*20368*/"Hangul Syllable RENH"/* B80E */,/*20369*/"Hangul Syllable RED"/* B80F */, /*20370*/"Hangul Syllable REL"/* B810 */,/*20371*/"Hangul Syllable RELG"/* B811 */, /*20372*/"Hangul Syllable RELM"/* B812 */,/*20373*/"Hangul Syllable RELB"/* B813 */, /*20374*/"Hangul Syllable RELS"/* B814 */,/*20375*/"Hangul Syllable RELT"/* B815 */, /*20376*/"Hangul Syllable RELP"/* B816 */,/*20377*/"Hangul Syllable RELH"/* B817 */, /*20378*/"Hangul Syllable REM"/* B818 */,/*20379*/"Hangul Syllable REB"/* B819 */, /*20380*/"Hangul Syllable REBS"/* B81A */,/*20381*/"Hangul Syllable RES"/* B81B */, /*20382*/"Hangul Syllable RESS"/* B81C */,/*20383*/"Hangul Syllable RENG"/* B81D */, /*20384*/"Hangul Syllable REJ"/* B81E */,/*20385*/"Hangul Syllable REC"/* B81F */, /*20386*/"Hangul Syllable REK"/* B820 */,/*20387*/"Hangul Syllable RET"/* B821 */, /*20388*/"Hangul Syllable REP"/* B822 */,/*20389*/"Hangul Syllable REH"/* B823 */, /*20390*/"Hangul Syllable RYEO"/* B824 */,/*20391*/"Hangul Syllable RYEOG"/* B825 */, /*20392*/"Hangul Syllable RYEOGG"/* B826 */,/*20393*/"Hangul Syllable RYEOGS"/* B827 */, /*20394*/"Hangul Syllable RYEON"/* B828 */,/*20395*/"Hangul Syllable RYEONJ"/* B829 */, /*20396*/"Hangul Syllable RYEONH"/* B82A */,/*20397*/"Hangul Syllable RYEOD"/* B82B */, /*20398*/"Hangul Syllable RYEOL"/* B82C */,/*20399*/"Hangul Syllable RYEOLG"/* B82D */, /*20400*/"Hangul Syllable RYEOLM"/* B82E */,/*20401*/"Hangul Syllable RYEOLB"/* B82F */, /*20402*/"Hangul Syllable RYEOLS"/* B830 */,/*20403*/"Hangul Syllable RYEOLT"/* B831 */, /*20404*/"Hangul Syllable RYEOLP"/* B832 */,/*20405*/"Hangul Syllable RYEOLH"/* B833 */, /*20406*/"Hangul Syllable RYEOM"/* B834 */,/*20407*/"Hangul Syllable RYEOB"/* B835 */, /*20408*/"Hangul Syllable RYEOBS"/* B836 */,/*20409*/"Hangul Syllable RYEOS"/* B837 */, /*20410*/"Hangul Syllable RYEOSS"/* B838 */,/*20411*/"Hangul Syllable RYEONG"/* B839 */, /*20412*/"Hangul Syllable RYEOJ"/* B83A */,/*20413*/"Hangul Syllable RYEOC"/* B83B */, /*20414*/"Hangul Syllable RYEOK"/* B83C */,/*20415*/"Hangul Syllable RYEOT"/* B83D */, /*20416*/"Hangul Syllable RYEOP"/* B83E */,/*20417*/"Hangul Syllable RYEOH"/* B83F */, /*20418*/"Hangul Syllable RYE"/* B840 */,/*20419*/"Hangul Syllable RYEG"/* B841 */, /*20420*/"Hangul Syllable RYEGG"/* B842 */,/*20421*/"Hangul Syllable RYEGS"/* B843 */, /*20422*/"Hangul Syllable RYEN"/* B844 */,/*20423*/"Hangul Syllable RYENJ"/* B845 */, /*20424*/"Hangul Syllable RYENH"/* B846 */,/*20425*/"Hangul Syllable RYED"/* B847 */, /*20426*/"Hangul Syllable RYEL"/* B848 */,/*20427*/"Hangul Syllable RYELG"/* B849 */, /*20428*/"Hangul Syllable RYELM"/* B84A */,/*20429*/"Hangul Syllable RYELB"/* B84B */, /*20430*/"Hangul Syllable RYELS"/* B84C */,/*20431*/"Hangul Syllable RYELT"/* B84D */, /*20432*/"Hangul Syllable RYELP"/* B84E */,/*20433*/"Hangul Syllable RYELH"/* B84F */, /*20434*/"Hangul Syllable RYEM"/* B850 */,/*20435*/"Hangul Syllable RYEB"/* B851 */, /*20436*/"Hangul Syllable RYEBS"/* B852 */,/*20437*/"Hangul Syllable RYES"/* B853 */, /*20438*/"Hangul Syllable RYESS"/* B854 */,/*20439*/"Hangul Syllable RYENG"/* B855 */, /*20440*/"Hangul Syllable RYEJ"/* B856 */,/*20441*/"Hangul Syllable RYEC"/* B857 */, /*20442*/"Hangul Syllable RYEK"/* B858 */,/*20443*/"Hangul Syllable RYET"/* B859 */, /*20444*/"Hangul Syllable RYEP"/* B85A */,/*20445*/"Hangul Syllable RYEH"/* B85B */, /*20446*/"Hangul Syllable RO"/* B85C */,/*20447*/"Hangul Syllable ROG"/* B85D */, /*20448*/"Hangul Syllable ROGG"/* B85E */,/*20449*/"Hangul Syllable ROGS"/* B85F */, /*20450*/"Hangul Syllable RON"/* B860 */,/*20451*/"Hangul Syllable RONJ"/* B861 */, /*20452*/"Hangul Syllable RONH"/* B862 */,/*20453*/"Hangul Syllable ROD"/* B863 */, /*20454*/"Hangul Syllable ROL"/* B864 */,/*20455*/"Hangul Syllable ROLG"/* B865 */, /*20456*/"Hangul Syllable ROLM"/* B866 */,/*20457*/"Hangul Syllable ROLB"/* B867 */, /*20458*/"Hangul Syllable ROLS"/* B868 */,/*20459*/"Hangul Syllable ROLT"/* B869 */, /*20460*/"Hangul Syllable ROLP"/* B86A */,/*20461*/"Hangul Syllable ROLH"/* B86B */, /*20462*/"Hangul Syllable ROM"/* B86C */,/*20463*/"Hangul Syllable ROB"/* B86D */, /*20464*/"Hangul Syllable ROBS"/* B86E */,/*20465*/"Hangul Syllable ROS"/* B86F */, /*20466*/"Hangul Syllable ROSS"/* B870 */,/*20467*/"Hangul Syllable RONG"/* B871 */, /*20468*/"Hangul Syllable ROJ"/* B872 */,/*20469*/"Hangul Syllable ROC"/* B873 */, /*20470*/"Hangul Syllable ROK"/* B874 */,/*20471*/"Hangul Syllable ROT"/* B875 */, /*20472*/"Hangul Syllable ROP"/* B876 */,/*20473*/"Hangul Syllable ROH"/* B877 */, /*20474*/"Hangul Syllable RWA"/* B878 */,/*20475*/"Hangul Syllable RWAG"/* B879 */, /*20476*/"Hangul Syllable RWAGG"/* B87A */,/*20477*/"Hangul Syllable RWAGS"/* B87B */, /*20478*/"Hangul Syllable RWAN"/* B87C */,/*20479*/"Hangul Syllable RWANJ"/* B87D */, /*20480*/"Hangul Syllable RWANH"/* B87E */,/*20481*/"Hangul Syllable RWAD"/* B87F */, /*20482*/"Hangul Syllable RWAL"/* B880 */,/*20483*/"Hangul Syllable RWALG"/* B881 */, /*20484*/"Hangul Syllable RWALM"/* B882 */,/*20485*/"Hangul Syllable RWALB"/* B883 */, /*20486*/"Hangul Syllable RWALS"/* B884 */,/*20487*/"Hangul Syllable RWALT"/* B885 */, /*20488*/"Hangul Syllable RWALP"/* B886 */,/*20489*/"Hangul Syllable RWALH"/* B887 */, /*20490*/"Hangul Syllable RWAM"/* B888 */,/*20491*/"Hangul Syllable RWAB"/* B889 */, /*20492*/"Hangul Syllable RWABS"/* B88A */,/*20493*/"Hangul Syllable RWAS"/* B88B */, /*20494*/"Hangul Syllable RWASS"/* B88C */,/*20495*/"Hangul Syllable RWANG"/* B88D */, /*20496*/"Hangul Syllable RWAJ"/* B88E */,/*20497*/"Hangul Syllable RWAC"/* B88F */, /*20498*/"Hangul Syllable RWAK"/* B890 */,/*20499*/"Hangul Syllable RWAT"/* B891 */, /*20500*/"Hangul Syllable RWAP"/* B892 */,/*20501*/"Hangul Syllable RWAH"/* B893 */, /*20502*/"Hangul Syllable RWAE"/* B894 */,/*20503*/"Hangul Syllable RWAEG"/* B895 */, /*20504*/"Hangul Syllable RWAEGG"/* B896 */,/*20505*/"Hangul Syllable RWAEGS"/* B897 */, /*20506*/"Hangul Syllable RWAEN"/* B898 */,/*20507*/"Hangul Syllable RWAENJ"/* B899 */, /*20508*/"Hangul Syllable RWAENH"/* B89A */,/*20509*/"Hangul Syllable RWAED"/* B89B */, /*20510*/"Hangul Syllable RWAEL"/* B89C */,/*20511*/"Hangul Syllable RWAELG"/* B89D */, /*20512*/"Hangul Syllable RWAELM"/* B89E */,/*20513*/"Hangul Syllable RWAELB"/* B89F */, /*20514*/"Hangul Syllable RWAELS"/* B8A0 */,/*20515*/"Hangul Syllable RWAELT"/* B8A1 */, /*20516*/"Hangul Syllable RWAELP"/* B8A2 */,/*20517*/"Hangul Syllable RWAELH"/* B8A3 */, /*20518*/"Hangul Syllable RWAEM"/* B8A4 */,/*20519*/"Hangul Syllable RWAEB"/* B8A5 */, /*20520*/"Hangul Syllable RWAEBS"/* B8A6 */,/*20521*/"Hangul Syllable RWAES"/* B8A7 */, /*20522*/"Hangul Syllable RWAESS"/* B8A8 */,/*20523*/"Hangul Syllable RWAENG"/* B8A9 */, /*20524*/"Hangul Syllable RWAEJ"/* B8AA */,/*20525*/"Hangul Syllable RWAEC"/* B8AB */, /*20526*/"Hangul Syllable RWAEK"/* B8AC */,/*20527*/"Hangul Syllable RWAET"/* B8AD */, /*20528*/"Hangul Syllable RWAEP"/* B8AE */,/*20529*/"Hangul Syllable RWAEH"/* B8AF */, /*20530*/"Hangul Syllable ROE"/* B8B0 */,/*20531*/"Hangul Syllable ROEG"/* B8B1 */, /*20532*/"Hangul Syllable ROEGG"/* B8B2 */,/*20533*/"Hangul Syllable ROEGS"/* B8B3 */, /*20534*/"Hangul Syllable ROEN"/* B8B4 */,/*20535*/"Hangul Syllable ROENJ"/* B8B5 */, /*20536*/"Hangul Syllable ROENH"/* B8B6 */,/*20537*/"Hangul Syllable ROED"/* B8B7 */, /*20538*/"Hangul Syllable ROEL"/* B8B8 */,/*20539*/"Hangul Syllable ROELG"/* B8B9 */, /*20540*/"Hangul Syllable ROELM"/* B8BA */,/*20541*/"Hangul Syllable ROELB"/* B8BB */, /*20542*/"Hangul Syllable ROELS"/* B8BC */,/*20543*/"Hangul Syllable ROELT"/* B8BD */, /*20544*/"Hangul Syllable ROELP"/* B8BE */,/*20545*/"Hangul Syllable ROELH"/* B8BF */, /*20546*/"Hangul Syllable ROEM"/* B8C0 */,/*20547*/"Hangul Syllable ROEB"/* B8C1 */, /*20548*/"Hangul Syllable ROEBS"/* B8C2 */,/*20549*/"Hangul Syllable ROES"/* B8C3 */, /*20550*/"Hangul Syllable ROESS"/* B8C4 */,/*20551*/"Hangul Syllable ROENG"/* B8C5 */, /*20552*/"Hangul Syllable ROEJ"/* B8C6 */,/*20553*/"Hangul Syllable ROEC"/* B8C7 */, /*20554*/"Hangul Syllable ROEK"/* B8C8 */,/*20555*/"Hangul Syllable ROET"/* B8C9 */, /*20556*/"Hangul Syllable ROEP"/* B8CA */,/*20557*/"Hangul Syllable ROEH"/* B8CB */, /*20558*/"Hangul Syllable RYO"/* B8CC */,/*20559*/"Hangul Syllable RYOG"/* B8CD */, /*20560*/"Hangul Syllable RYOGG"/* B8CE */,/*20561*/"Hangul Syllable RYOGS"/* B8CF */, /*20562*/"Hangul Syllable RYON"/* B8D0 */,/*20563*/"Hangul Syllable RYONJ"/* B8D1 */, /*20564*/"Hangul Syllable RYONH"/* B8D2 */,/*20565*/"Hangul Syllable RYOD"/* B8D3 */, /*20566*/"Hangul Syllable RYOL"/* B8D4 */,/*20567*/"Hangul Syllable RYOLG"/* B8D5 */, /*20568*/"Hangul Syllable RYOLM"/* B8D6 */,/*20569*/"Hangul Syllable RYOLB"/* B8D7 */, /*20570*/"Hangul Syllable RYOLS"/* B8D8 */,/*20571*/"Hangul Syllable RYOLT"/* B8D9 */, /*20572*/"Hangul Syllable RYOLP"/* B8DA */,/*20573*/"Hangul Syllable RYOLH"/* B8DB */, /*20574*/"Hangul Syllable RYOM"/* B8DC */,/*20575*/"Hangul Syllable RYOB"/* B8DD */, /*20576*/"Hangul Syllable RYOBS"/* B8DE */,/*20577*/"Hangul Syllable RYOS"/* B8DF */, /*20578*/"Hangul Syllable RYOSS"/* B8E0 */,/*20579*/"Hangul Syllable RYONG"/* B8E1 */, /*20580*/"Hangul Syllable RYOJ"/* B8E2 */,/*20581*/"Hangul Syllable RYOC"/* B8E3 */, /*20582*/"Hangul Syllable RYOK"/* B8E4 */,/*20583*/"Hangul Syllable RYOT"/* B8E5 */, /*20584*/"Hangul Syllable RYOP"/* B8E6 */,/*20585*/"Hangul Syllable RYOH"/* B8E7 */, /*20586*/"Hangul Syllable RU"/* B8E8 */,/*20587*/"Hangul Syllable RUG"/* B8E9 */, /*20588*/"Hangul Syllable RUGG"/* B8EA */,/*20589*/"Hangul Syllable RUGS"/* B8EB */, /*20590*/"Hangul Syllable RUN"/* B8EC */,/*20591*/"Hangul Syllable RUNJ"/* B8ED */, /*20592*/"Hangul Syllable RUNH"/* B8EE */,/*20593*/"Hangul Syllable RUD"/* B8EF */, /*20594*/"Hangul Syllable RUL"/* B8F0 */,/*20595*/"Hangul Syllable RULG"/* B8F1 */, /*20596*/"Hangul Syllable RULM"/* B8F2 */,/*20597*/"Hangul Syllable RULB"/* B8F3 */, /*20598*/"Hangul Syllable RULS"/* B8F4 */,/*20599*/"Hangul Syllable RULT"/* B8F5 */, /*20600*/"Hangul Syllable RULP"/* B8F6 */,/*20601*/"Hangul Syllable RULH"/* B8F7 */, /*20602*/"Hangul Syllable RUM"/* B8F8 */,/*20603*/"Hangul Syllable RUB"/* B8F9 */, /*20604*/"Hangul Syllable RUBS"/* B8FA */,/*20605*/"Hangul Syllable RUS"/* B8FB */, /*20606*/"Hangul Syllable RUSS"/* B8FC */,/*20607*/"Hangul Syllable RUNG"/* B8FD */, /*20608*/"Hangul Syllable RUJ"/* B8FE */,/*20609*/"Hangul Syllable RUC"/* B8FF */, /*20610*/"Hangul Syllable RUK"/* B900 */,/*20611*/"Hangul Syllable RUT"/* B901 */, /*20612*/"Hangul Syllable RUP"/* B902 */,/*20613*/"Hangul Syllable RUH"/* B903 */, /*20614*/"Hangul Syllable RWEO"/* B904 */,/*20615*/"Hangul Syllable RWEOG"/* B905 */, /*20616*/"Hangul Syllable RWEOGG"/* B906 */,/*20617*/"Hangul Syllable RWEOGS"/* B907 */, /*20618*/"Hangul Syllable RWEON"/* B908 */,/*20619*/"Hangul Syllable RWEONJ"/* B909 */, /*20620*/"Hangul Syllable RWEONH"/* B90A */,/*20621*/"Hangul Syllable RWEOD"/* B90B */, /*20622*/"Hangul Syllable RWEOL"/* B90C */,/*20623*/"Hangul Syllable RWEOLG"/* B90D */, /*20624*/"Hangul Syllable RWEOLM"/* B90E */,/*20625*/"Hangul Syllable RWEOLB"/* B90F */, /*20626*/"Hangul Syllable RWEOLS"/* B910 */,/*20627*/"Hangul Syllable RWEOLT"/* B911 */, /*20628*/"Hangul Syllable RWEOLP"/* B912 */,/*20629*/"Hangul Syllable RWEOLH"/* B913 */, /*20630*/"Hangul Syllable RWEOM"/* B914 */,/*20631*/"Hangul Syllable RWEOB"/* B915 */, /*20632*/"Hangul Syllable RWEOBS"/* B916 */,/*20633*/"Hangul Syllable RWEOS"/* B917 */, /*20634*/"Hangul Syllable RWEOSS"/* B918 */,/*20635*/"Hangul Syllable RWEONG"/* B919 */, /*20636*/"Hangul Syllable RWEOJ"/* B91A */,/*20637*/"Hangul Syllable RWEOC"/* B91B */, /*20638*/"Hangul Syllable RWEOK"/* B91C */,/*20639*/"Hangul Syllable RWEOT"/* B91D */, /*20640*/"Hangul Syllable RWEOP"/* B91E */,/*20641*/"Hangul Syllable RWEOH"/* B91F */, /*20642*/"Hangul Syllable RWE"/* B920 */,/*20643*/"Hangul Syllable RWEG"/* B921 */, /*20644*/"Hangul Syllable RWEGG"/* B922 */,/*20645*/"Hangul Syllable RWEGS"/* B923 */, /*20646*/"Hangul Syllable RWEN"/* B924 */,/*20647*/"Hangul Syllable RWENJ"/* B925 */, /*20648*/"Hangul Syllable RWENH"/* B926 */,/*20649*/"Hangul Syllable RWED"/* B927 */, /*20650*/"Hangul Syllable RWEL"/* B928 */,/*20651*/"Hangul Syllable RWELG"/* B929 */, /*20652*/"Hangul Syllable RWELM"/* B92A */,/*20653*/"Hangul Syllable RWELB"/* B92B */, /*20654*/"Hangul Syllable RWELS"/* B92C */,/*20655*/"Hangul Syllable RWELT"/* B92D */, /*20656*/"Hangul Syllable RWELP"/* B92E */,/*20657*/"Hangul Syllable RWELH"/* B92F */, /*20658*/"Hangul Syllable RWEM"/* B930 */,/*20659*/"Hangul Syllable RWEB"/* B931 */, /*20660*/"Hangul Syllable RWEBS"/* B932 */,/*20661*/"Hangul Syllable RWES"/* B933 */, /*20662*/"Hangul Syllable RWESS"/* B934 */,/*20663*/"Hangul Syllable RWENG"/* B935 */, /*20664*/"Hangul Syllable RWEJ"/* B936 */,/*20665*/"Hangul Syllable RWEC"/* B937 */, /*20666*/"Hangul Syllable RWEK"/* B938 */,/*20667*/"Hangul Syllable RWET"/* B939 */, /*20668*/"Hangul Syllable RWEP"/* B93A */,/*20669*/"Hangul Syllable RWEH"/* B93B */, /*20670*/"Hangul Syllable RWI"/* B93C */,/*20671*/"Hangul Syllable RWIG"/* B93D */, /*20672*/"Hangul Syllable RWIGG"/* B93E */,/*20673*/"Hangul Syllable RWIGS"/* B93F */, /*20674*/"Hangul Syllable RWIN"/* B940 */,/*20675*/"Hangul Syllable RWINJ"/* B941 */, /*20676*/"Hangul Syllable RWINH"/* B942 */,/*20677*/"Hangul Syllable RWID"/* B943 */, /*20678*/"Hangul Syllable RWIL"/* B944 */,/*20679*/"Hangul Syllable RWILG"/* B945 */, /*20680*/"Hangul Syllable RWILM"/* B946 */,/*20681*/"Hangul Syllable RWILB"/* B947 */, /*20682*/"Hangul Syllable RWILS"/* B948 */,/*20683*/"Hangul Syllable RWILT"/* B949 */, /*20684*/"Hangul Syllable RWILP"/* B94A */,/*20685*/"Hangul Syllable RWILH"/* B94B */, /*20686*/"Hangul Syllable RWIM"/* B94C */,/*20687*/"Hangul Syllable RWIB"/* B94D */, /*20688*/"Hangul Syllable RWIBS"/* B94E */,/*20689*/"Hangul Syllable RWIS"/* B94F */, /*20690*/"Hangul Syllable RWISS"/* B950 */,/*20691*/"Hangul Syllable RWING"/* B951 */, /*20692*/"Hangul Syllable RWIJ"/* B952 */,/*20693*/"Hangul Syllable RWIC"/* B953 */, /*20694*/"Hangul Syllable RWIK"/* B954 */,/*20695*/"Hangul Syllable RWIT"/* B955 */, /*20696*/"Hangul Syllable RWIP"/* B956 */,/*20697*/"Hangul Syllable RWIH"/* B957 */, /*20698*/"Hangul Syllable RYU"/* B958 */,/*20699*/"Hangul Syllable RYUG"/* B959 */, /*20700*/"Hangul Syllable RYUGG"/* B95A */,/*20701*/"Hangul Syllable RYUGS"/* B95B */, /*20702*/"Hangul Syllable RYUN"/* B95C */,/*20703*/"Hangul Syllable RYUNJ"/* B95D */, /*20704*/"Hangul Syllable RYUNH"/* B95E */,/*20705*/"Hangul Syllable RYUD"/* B95F */, /*20706*/"Hangul Syllable RYUL"/* B960 */,/*20707*/"Hangul Syllable RYULG"/* B961 */, /*20708*/"Hangul Syllable RYULM"/* B962 */,/*20709*/"Hangul Syllable RYULB"/* B963 */, /*20710*/"Hangul Syllable RYULS"/* B964 */,/*20711*/"Hangul Syllable RYULT"/* B965 */, /*20712*/"Hangul Syllable RYULP"/* B966 */,/*20713*/"Hangul Syllable RYULH"/* B967 */, /*20714*/"Hangul Syllable RYUM"/* B968 */,/*20715*/"Hangul Syllable RYUB"/* B969 */, /*20716*/"Hangul Syllable RYUBS"/* B96A */,/*20717*/"Hangul Syllable RYUS"/* B96B */, /*20718*/"Hangul Syllable RYUSS"/* B96C */,/*20719*/"Hangul Syllable RYUNG"/* B96D */, /*20720*/"Hangul Syllable RYUJ"/* B96E */,/*20721*/"Hangul Syllable RYUC"/* B96F */, /*20722*/"Hangul Syllable RYUK"/* B970 */,/*20723*/"Hangul Syllable RYUT"/* B971 */, /*20724*/"Hangul Syllable RYUP"/* B972 */,/*20725*/"Hangul Syllable RYUH"/* B973 */, /*20726*/"Hangul Syllable REU"/* B974 */,/*20727*/"Hangul Syllable REUG"/* B975 */, /*20728*/"Hangul Syllable REUGG"/* B976 */,/*20729*/"Hangul Syllable REUGS"/* B977 */, /*20730*/"Hangul Syllable REUN"/* B978 */,/*20731*/"Hangul Syllable REUNJ"/* B979 */, /*20732*/"Hangul Syllable REUNH"/* B97A */,/*20733*/"Hangul Syllable REUD"/* B97B */, /*20734*/"Hangul Syllable REUL"/* B97C */,/*20735*/"Hangul Syllable REULG"/* B97D */, /*20736*/"Hangul Syllable REULM"/* B97E */,/*20737*/"Hangul Syllable REULB"/* B97F */, /*20738*/"Hangul Syllable REULS"/* B980 */,/*20739*/"Hangul Syllable REULT"/* B981 */, /*20740*/"Hangul Syllable REULP"/* B982 */,/*20741*/"Hangul Syllable REULH"/* B983 */, /*20742*/"Hangul Syllable REUM"/* B984 */,/*20743*/"Hangul Syllable REUB"/* B985 */, /*20744*/"Hangul Syllable REUBS"/* B986 */,/*20745*/"Hangul Syllable REUS"/* B987 */, /*20746*/"Hangul Syllable REUSS"/* B988 */,/*20747*/"Hangul Syllable REUNG"/* B989 */, /*20748*/"Hangul Syllable REUJ"/* B98A */,/*20749*/"Hangul Syllable REUC"/* B98B */, /*20750*/"Hangul Syllable REUK"/* B98C */,/*20751*/"Hangul Syllable REUT"/* B98D */, /*20752*/"Hangul Syllable REUP"/* B98E */,/*20753*/"Hangul Syllable REUH"/* B98F */, /*20754*/"Hangul Syllable RYI"/* B990 */,/*20755*/"Hangul Syllable RYIG"/* B991 */, /*20756*/"Hangul Syllable RYIGG"/* B992 */,/*20757*/"Hangul Syllable RYIGS"/* B993 */, /*20758*/"Hangul Syllable RYIN"/* B994 */,/*20759*/"Hangul Syllable RYINJ"/* B995 */, /*20760*/"Hangul Syllable RYINH"/* B996 */,/*20761*/"Hangul Syllable RYID"/* B997 */, /*20762*/"Hangul Syllable RYIL"/* B998 */,/*20763*/"Hangul Syllable RYILG"/* B999 */, /*20764*/"Hangul Syllable RYILM"/* B99A */,/*20765*/"Hangul Syllable RYILB"/* B99B */, /*20766*/"Hangul Syllable RYILS"/* B99C */,/*20767*/"Hangul Syllable RYILT"/* B99D */, /*20768*/"Hangul Syllable RYILP"/* B99E */,/*20769*/"Hangul Syllable RYILH"/* B99F */, /*20770*/"Hangul Syllable RYIM"/* B9A0 */,/*20771*/"Hangul Syllable RYIB"/* B9A1 */, /*20772*/"Hangul Syllable RYIBS"/* B9A2 */,/*20773*/"Hangul Syllable RYIS"/* B9A3 */, /*20774*/"Hangul Syllable RYISS"/* B9A4 */,/*20775*/"Hangul Syllable RYING"/* B9A5 */, /*20776*/"Hangul Syllable RYIJ"/* B9A6 */,/*20777*/"Hangul Syllable RYIC"/* B9A7 */, /*20778*/"Hangul Syllable RYIK"/* B9A8 */,/*20779*/"Hangul Syllable RYIT"/* B9A9 */, /*20780*/"Hangul Syllable RYIP"/* B9AA */,/*20781*/"Hangul Syllable RYIH"/* B9AB */, /*20782*/"Hangul Syllable RI"/* B9AC */,/*20783*/"Hangul Syllable RIG"/* B9AD */, /*20784*/"Hangul Syllable RIGG"/* B9AE */,/*20785*/"Hangul Syllable RIGS"/* B9AF */, /*20786*/"Hangul Syllable RIN"/* B9B0 */,/*20787*/"Hangul Syllable RINJ"/* B9B1 */, /*20788*/"Hangul Syllable RINH"/* B9B2 */,/*20789*/"Hangul Syllable RID"/* B9B3 */, /*20790*/"Hangul Syllable RIL"/* B9B4 */,/*20791*/"Hangul Syllable RILG"/* B9B5 */, /*20792*/"Hangul Syllable RILM"/* B9B6 */,/*20793*/"Hangul Syllable RILB"/* B9B7 */, /*20794*/"Hangul Syllable RILS"/* B9B8 */,/*20795*/"Hangul Syllable RILT"/* B9B9 */, /*20796*/"Hangul Syllable RILP"/* B9BA */,/*20797*/"Hangul Syllable RILH"/* B9BB */, /*20798*/"Hangul Syllable RIM"/* B9BC */,/*20799*/"Hangul Syllable RIB"/* B9BD */, /*20800*/"Hangul Syllable RIBS"/* B9BE */,/*20801*/"Hangul Syllable RIS"/* B9BF */, /*20802*/"Hangul Syllable RISS"/* B9C0 */,/*20803*/"Hangul Syllable RING"/* B9C1 */, /*20804*/"Hangul Syllable RIJ"/* B9C2 */,/*20805*/"Hangul Syllable RIC"/* B9C3 */, /*20806*/"Hangul Syllable RIK"/* B9C4 */,/*20807*/"Hangul Syllable RIT"/* B9C5 */, /*20808*/"Hangul Syllable RIP"/* B9C6 */,/*20809*/"Hangul Syllable RIH"/* B9C7 */, /*20810*/"Hangul Syllable MA"/* B9C8 */,/*20811*/"Hangul Syllable MAG"/* B9C9 */, /*20812*/"Hangul Syllable MAGG"/* B9CA */,/*20813*/"Hangul Syllable MAGS"/* B9CB */, /*20814*/"Hangul Syllable MAN"/* B9CC */,/*20815*/"Hangul Syllable MANJ"/* B9CD */, /*20816*/"Hangul Syllable MANH"/* B9CE */,/*20817*/"Hangul Syllable MAD"/* B9CF */, /*20818*/"Hangul Syllable MAL"/* B9D0 */,/*20819*/"Hangul Syllable MALG"/* B9D1 */, /*20820*/"Hangul Syllable MALM"/* B9D2 */,/*20821*/"Hangul Syllable MALB"/* B9D3 */, /*20822*/"Hangul Syllable MALS"/* B9D4 */,/*20823*/"Hangul Syllable MALT"/* B9D5 */, /*20824*/"Hangul Syllable MALP"/* B9D6 */,/*20825*/"Hangul Syllable MALH"/* B9D7 */, /*20826*/"Hangul Syllable MAM"/* B9D8 */,/*20827*/"Hangul Syllable MAB"/* B9D9 */, /*20828*/"Hangul Syllable MABS"/* B9DA */,/*20829*/"Hangul Syllable MAS"/* B9DB */, /*20830*/"Hangul Syllable MASS"/* B9DC */,/*20831*/"Hangul Syllable MANG"/* B9DD */, /*20832*/"Hangul Syllable MAJ"/* B9DE */,/*20833*/"Hangul Syllable MAC"/* B9DF */, /*20834*/"Hangul Syllable MAK"/* B9E0 */,/*20835*/"Hangul Syllable MAT"/* B9E1 */, /*20836*/"Hangul Syllable MAP"/* B9E2 */,/*20837*/"Hangul Syllable MAH"/* B9E3 */, /*20838*/"Hangul Syllable MAE"/* B9E4 */,/*20839*/"Hangul Syllable MAEG"/* B9E5 */, /*20840*/"Hangul Syllable MAEGG"/* B9E6 */,/*20841*/"Hangul Syllable MAEGS"/* B9E7 */, /*20842*/"Hangul Syllable MAEN"/* B9E8 */,/*20843*/"Hangul Syllable MAENJ"/* B9E9 */, /*20844*/"Hangul Syllable MAENH"/* B9EA */,/*20845*/"Hangul Syllable MAED"/* B9EB */, /*20846*/"Hangul Syllable MAEL"/* B9EC */,/*20847*/"Hangul Syllable MAELG"/* B9ED */, /*20848*/"Hangul Syllable MAELM"/* B9EE */,/*20849*/"Hangul Syllable MAELB"/* B9EF */, /*20850*/"Hangul Syllable MAELS"/* B9F0 */,/*20851*/"Hangul Syllable MAELT"/* B9F1 */, /*20852*/"Hangul Syllable MAELP"/* B9F2 */,/*20853*/"Hangul Syllable MAELH"/* B9F3 */, /*20854*/"Hangul Syllable MAEM"/* B9F4 */,/*20855*/"Hangul Syllable MAEB"/* B9F5 */, /*20856*/"Hangul Syllable MAEBS"/* B9F6 */,/*20857*/"Hangul Syllable MAES"/* B9F7 */, /*20858*/"Hangul Syllable MAESS"/* B9F8 */,/*20859*/"Hangul Syllable MAENG"/* B9F9 */, /*20860*/"Hangul Syllable MAEJ"/* B9FA */,/*20861*/"Hangul Syllable MAEC"/* B9FB */, /*20862*/"Hangul Syllable MAEK"/* B9FC */,/*20863*/"Hangul Syllable MAET"/* B9FD */, /*20864*/"Hangul Syllable MAEP"/* B9FE */,/*20865*/"Hangul Syllable MAEH"/* B9FF */, /*20866*/"Hangul Syllable MYA"/* BA00 */,/*20867*/"Hangul Syllable MYAG"/* BA01 */, /*20868*/"Hangul Syllable MYAGG"/* BA02 */,/*20869*/"Hangul Syllable MYAGS"/* BA03 */, /*20870*/"Hangul Syllable MYAN"/* BA04 */,/*20871*/"Hangul Syllable MYANJ"/* BA05 */, /*20872*/"Hangul Syllable MYANH"/* BA06 */,/*20873*/"Hangul Syllable MYAD"/* BA07 */, /*20874*/"Hangul Syllable MYAL"/* BA08 */,/*20875*/"Hangul Syllable MYALG"/* BA09 */, /*20876*/"Hangul Syllable MYALM"/* BA0A */,/*20877*/"Hangul Syllable MYALB"/* BA0B */, /*20878*/"Hangul Syllable MYALS"/* BA0C */,/*20879*/"Hangul Syllable MYALT"/* BA0D */, /*20880*/"Hangul Syllable MYALP"/* BA0E */,/*20881*/"Hangul Syllable MYALH"/* BA0F */, /*20882*/"Hangul Syllable MYAM"/* BA10 */,/*20883*/"Hangul Syllable MYAB"/* BA11 */, /*20884*/"Hangul Syllable MYABS"/* BA12 */,/*20885*/"Hangul Syllable MYAS"/* BA13 */, /*20886*/"Hangul Syllable MYASS"/* BA14 */,/*20887*/"Hangul Syllable MYANG"/* BA15 */, /*20888*/"Hangul Syllable MYAJ"/* BA16 */,/*20889*/"Hangul Syllable MYAC"/* BA17 */, /*20890*/"Hangul Syllable MYAK"/* BA18 */,/*20891*/"Hangul Syllable MYAT"/* BA19 */, /*20892*/"Hangul Syllable MYAP"/* BA1A */,/*20893*/"Hangul Syllable MYAH"/* BA1B */, /*20894*/"Hangul Syllable MYAE"/* BA1C */,/*20895*/"Hangul Syllable MYAEG"/* BA1D */, /*20896*/"Hangul Syllable MYAEGG"/* BA1E */,/*20897*/"Hangul Syllable MYAEGS"/* BA1F */, /*20898*/"Hangul Syllable MYAEN"/* BA20 */,/*20899*/"Hangul Syllable MYAENJ"/* BA21 */, /*20900*/"Hangul Syllable MYAENH"/* BA22 */,/*20901*/"Hangul Syllable MYAED"/* BA23 */, /*20902*/"Hangul Syllable MYAEL"/* BA24 */,/*20903*/"Hangul Syllable MYAELG"/* BA25 */, /*20904*/"Hangul Syllable MYAELM"/* BA26 */,/*20905*/"Hangul Syllable MYAELB"/* BA27 */, /*20906*/"Hangul Syllable MYAELS"/* BA28 */,/*20907*/"Hangul Syllable MYAELT"/* BA29 */, /*20908*/"Hangul Syllable MYAELP"/* BA2A */,/*20909*/"Hangul Syllable MYAELH"/* BA2B */, /*20910*/"Hangul Syllable MYAEM"/* BA2C */,/*20911*/"Hangul Syllable MYAEB"/* BA2D */, /*20912*/"Hangul Syllable MYAEBS"/* BA2E */,/*20913*/"Hangul Syllable MYAES"/* BA2F */, /*20914*/"Hangul Syllable MYAESS"/* BA30 */,/*20915*/"Hangul Syllable MYAENG"/* BA31 */, /*20916*/"Hangul Syllable MYAEJ"/* BA32 */,/*20917*/"Hangul Syllable MYAEC"/* BA33 */, /*20918*/"Hangul Syllable MYAEK"/* BA34 */,/*20919*/"Hangul Syllable MYAET"/* BA35 */, /*20920*/"Hangul Syllable MYAEP"/* BA36 */,/*20921*/"Hangul Syllable MYAEH"/* BA37 */, /*20922*/"Hangul Syllable MEO"/* BA38 */,/*20923*/"Hangul Syllable MEOG"/* BA39 */, /*20924*/"Hangul Syllable MEOGG"/* BA3A */,/*20925*/"Hangul Syllable MEOGS"/* BA3B */, /*20926*/"Hangul Syllable MEON"/* BA3C */,/*20927*/"Hangul Syllable MEONJ"/* BA3D */, /*20928*/"Hangul Syllable MEONH"/* BA3E */,/*20929*/"Hangul Syllable MEOD"/* BA3F */, /*20930*/"Hangul Syllable MEOL"/* BA40 */,/*20931*/"Hangul Syllable MEOLG"/* BA41 */, /*20932*/"Hangul Syllable MEOLM"/* BA42 */,/*20933*/"Hangul Syllable MEOLB"/* BA43 */, /*20934*/"Hangul Syllable MEOLS"/* BA44 */,/*20935*/"Hangul Syllable MEOLT"/* BA45 */, /*20936*/"Hangul Syllable MEOLP"/* BA46 */,/*20937*/"Hangul Syllable MEOLH"/* BA47 */, /*20938*/"Hangul Syllable MEOM"/* BA48 */,/*20939*/"Hangul Syllable MEOB"/* BA49 */, /*20940*/"Hangul Syllable MEOBS"/* BA4A */,/*20941*/"Hangul Syllable MEOS"/* BA4B */, /*20942*/"Hangul Syllable MEOSS"/* BA4C */,/*20943*/"Hangul Syllable MEONG"/* BA4D */, /*20944*/"Hangul Syllable MEOJ"/* BA4E */,/*20945*/"Hangul Syllable MEOC"/* BA4F */, /*20946*/"Hangul Syllable MEOK"/* BA50 */,/*20947*/"Hangul Syllable MEOT"/* BA51 */, /*20948*/"Hangul Syllable MEOP"/* BA52 */,/*20949*/"Hangul Syllable MEOH"/* BA53 */, /*20950*/"Hangul Syllable ME"/* BA54 */,/*20951*/"Hangul Syllable MEG"/* BA55 */, /*20952*/"Hangul Syllable MEGG"/* BA56 */,/*20953*/"Hangul Syllable MEGS"/* BA57 */, /*20954*/"Hangul Syllable MEN"/* BA58 */,/*20955*/"Hangul Syllable MENJ"/* BA59 */, /*20956*/"Hangul Syllable MENH"/* BA5A */,/*20957*/"Hangul Syllable MED"/* BA5B */, /*20958*/"Hangul Syllable MEL"/* BA5C */,/*20959*/"Hangul Syllable MELG"/* BA5D */, /*20960*/"Hangul Syllable MELM"/* BA5E */,/*20961*/"Hangul Syllable MELB"/* BA5F */, /*20962*/"Hangul Syllable MELS"/* BA60 */,/*20963*/"Hangul Syllable MELT"/* BA61 */, /*20964*/"Hangul Syllable MELP"/* BA62 */,/*20965*/"Hangul Syllable MELH"/* BA63 */, /*20966*/"Hangul Syllable MEM"/* BA64 */,/*20967*/"Hangul Syllable MEB"/* BA65 */, /*20968*/"Hangul Syllable MEBS"/* BA66 */,/*20969*/"Hangul Syllable MES"/* BA67 */, /*20970*/"Hangul Syllable MESS"/* BA68 */,/*20971*/"Hangul Syllable MENG"/* BA69 */, /*20972*/"Hangul Syllable MEJ"/* BA6A */,/*20973*/"Hangul Syllable MEC"/* BA6B */, /*20974*/"Hangul Syllable MEK"/* BA6C */,/*20975*/"Hangul Syllable MET"/* BA6D */, /*20976*/"Hangul Syllable MEP"/* BA6E */,/*20977*/"Hangul Syllable MEH"/* BA6F */, /*20978*/"Hangul Syllable MYEO"/* BA70 */,/*20979*/"Hangul Syllable MYEOG"/* BA71 */, /*20980*/"Hangul Syllable MYEOGG"/* BA72 */,/*20981*/"Hangul Syllable MYEOGS"/* BA73 */, /*20982*/"Hangul Syllable MYEON"/* BA74 */,/*20983*/"Hangul Syllable MYEONJ"/* BA75 */, /*20984*/"Hangul Syllable MYEONH"/* BA76 */,/*20985*/"Hangul Syllable MYEOD"/* BA77 */, /*20986*/"Hangul Syllable MYEOL"/* BA78 */,/*20987*/"Hangul Syllable MYEOLG"/* BA79 */, /*20988*/"Hangul Syllable MYEOLM"/* BA7A */,/*20989*/"Hangul Syllable MYEOLB"/* BA7B */, /*20990*/"Hangul Syllable MYEOLS"/* BA7C */,/*20991*/"Hangul Syllable MYEOLT"/* BA7D */, /*20992*/"Hangul Syllable MYEOLP"/* BA7E */,/*20993*/"Hangul Syllable MYEOLH"/* BA7F */, /*20994*/"Hangul Syllable MYEOM"/* BA80 */,/*20995*/"Hangul Syllable MYEOB"/* BA81 */, /*20996*/"Hangul Syllable MYEOBS"/* BA82 */,/*20997*/"Hangul Syllable MYEOS"/* BA83 */, /*20998*/"Hangul Syllable MYEOSS"/* BA84 */,/*20999*/"Hangul Syllable MYEONG"/* BA85 */, /*21000*/"Hangul Syllable MYEOJ"/* BA86 */,/*21001*/"Hangul Syllable MYEOC"/* BA87 */, /*21002*/"Hangul Syllable MYEOK"/* BA88 */,/*21003*/"Hangul Syllable MYEOT"/* BA89 */, /*21004*/"Hangul Syllable MYEOP"/* BA8A */,/*21005*/"Hangul Syllable MYEOH"/* BA8B */, /*21006*/"Hangul Syllable MYE"/* BA8C */,/*21007*/"Hangul Syllable MYEG"/* BA8D */, /*21008*/"Hangul Syllable MYEGG"/* BA8E */,/*21009*/"Hangul Syllable MYEGS"/* BA8F */, /*21010*/"Hangul Syllable MYEN"/* BA90 */,/*21011*/"Hangul Syllable MYENJ"/* BA91 */, /*21012*/"Hangul Syllable MYENH"/* BA92 */,/*21013*/"Hangul Syllable MYED"/* BA93 */, /*21014*/"Hangul Syllable MYEL"/* BA94 */,/*21015*/"Hangul Syllable MYELG"/* BA95 */, /*21016*/"Hangul Syllable MYELM"/* BA96 */,/*21017*/"Hangul Syllable MYELB"/* BA97 */, /*21018*/"Hangul Syllable MYELS"/* BA98 */,/*21019*/"Hangul Syllable MYELT"/* BA99 */, /*21020*/"Hangul Syllable MYELP"/* BA9A */,/*21021*/"Hangul Syllable MYELH"/* BA9B */, /*21022*/"Hangul Syllable MYEM"/* BA9C */,/*21023*/"Hangul Syllable MYEB"/* BA9D */, /*21024*/"Hangul Syllable MYEBS"/* BA9E */,/*21025*/"Hangul Syllable MYES"/* BA9F */, /*21026*/"Hangul Syllable MYESS"/* BAA0 */,/*21027*/"Hangul Syllable MYENG"/* BAA1 */, /*21028*/"Hangul Syllable MYEJ"/* BAA2 */,/*21029*/"Hangul Syllable MYEC"/* BAA3 */, /*21030*/"Hangul Syllable MYEK"/* BAA4 */,/*21031*/"Hangul Syllable MYET"/* BAA5 */, /*21032*/"Hangul Syllable MYEP"/* BAA6 */,/*21033*/"Hangul Syllable MYEH"/* BAA7 */, /*21034*/"Hangul Syllable MO"/* BAA8 */,/*21035*/"Hangul Syllable MOG"/* BAA9 */, /*21036*/"Hangul Syllable MOGG"/* BAAA */,/*21037*/"Hangul Syllable MOGS"/* BAAB */, /*21038*/"Hangul Syllable MON"/* BAAC */,/*21039*/"Hangul Syllable MONJ"/* BAAD */, /*21040*/"Hangul Syllable MONH"/* BAAE */,/*21041*/"Hangul Syllable MOD"/* BAAF */, /*21042*/"Hangul Syllable MOL"/* BAB0 */,/*21043*/"Hangul Syllable MOLG"/* BAB1 */, /*21044*/"Hangul Syllable MOLM"/* BAB2 */,/*21045*/"Hangul Syllable MOLB"/* BAB3 */, /*21046*/"Hangul Syllable MOLS"/* BAB4 */,/*21047*/"Hangul Syllable MOLT"/* BAB5 */, /*21048*/"Hangul Syllable MOLP"/* BAB6 */,/*21049*/"Hangul Syllable MOLH"/* BAB7 */, /*21050*/"Hangul Syllable MOM"/* BAB8 */,/*21051*/"Hangul Syllable MOB"/* BAB9 */, /*21052*/"Hangul Syllable MOBS"/* BABA */,/*21053*/"Hangul Syllable MOS"/* BABB */, /*21054*/"Hangul Syllable MOSS"/* BABC */,/*21055*/"Hangul Syllable MONG"/* BABD */, /*21056*/"Hangul Syllable MOJ"/* BABE */,/*21057*/"Hangul Syllable MOC"/* BABF */, /*21058*/"Hangul Syllable MOK"/* BAC0 */,/*21059*/"Hangul Syllable MOT"/* BAC1 */, /*21060*/"Hangul Syllable MOP"/* BAC2 */,/*21061*/"Hangul Syllable MOH"/* BAC3 */, /*21062*/"Hangul Syllable MWA"/* BAC4 */,/*21063*/"Hangul Syllable MWAG"/* BAC5 */, /*21064*/"Hangul Syllable MWAGG"/* BAC6 */,/*21065*/"Hangul Syllable MWAGS"/* BAC7 */, /*21066*/"Hangul Syllable MWAN"/* BAC8 */,/*21067*/"Hangul Syllable MWANJ"/* BAC9 */, /*21068*/"Hangul Syllable MWANH"/* BACA */,/*21069*/"Hangul Syllable MWAD"/* BACB */, /*21070*/"Hangul Syllable MWAL"/* BACC */,/*21071*/"Hangul Syllable MWALG"/* BACD */, /*21072*/"Hangul Syllable MWALM"/* BACE */,/*21073*/"Hangul Syllable MWALB"/* BACF */, /*21074*/"Hangul Syllable MWALS"/* BAD0 */,/*21075*/"Hangul Syllable MWALT"/* BAD1 */, /*21076*/"Hangul Syllable MWALP"/* BAD2 */,/*21077*/"Hangul Syllable MWALH"/* BAD3 */, /*21078*/"Hangul Syllable MWAM"/* BAD4 */,/*21079*/"Hangul Syllable MWAB"/* BAD5 */, /*21080*/"Hangul Syllable MWABS"/* BAD6 */,/*21081*/"Hangul Syllable MWAS"/* BAD7 */, /*21082*/"Hangul Syllable MWASS"/* BAD8 */,/*21083*/"Hangul Syllable MWANG"/* BAD9 */, /*21084*/"Hangul Syllable MWAJ"/* BADA */,/*21085*/"Hangul Syllable MWAC"/* BADB */, /*21086*/"Hangul Syllable MWAK"/* BADC */,/*21087*/"Hangul Syllable MWAT"/* BADD */, /*21088*/"Hangul Syllable MWAP"/* BADE */,/*21089*/"Hangul Syllable MWAH"/* BADF */, /*21090*/"Hangul Syllable MWAE"/* BAE0 */,/*21091*/"Hangul Syllable MWAEG"/* BAE1 */, /*21092*/"Hangul Syllable MWAEGG"/* BAE2 */,/*21093*/"Hangul Syllable MWAEGS"/* BAE3 */, /*21094*/"Hangul Syllable MWAEN"/* BAE4 */,/*21095*/"Hangul Syllable MWAENJ"/* BAE5 */, /*21096*/"Hangul Syllable MWAENH"/* BAE6 */,/*21097*/"Hangul Syllable MWAED"/* BAE7 */, /*21098*/"Hangul Syllable MWAEL"/* BAE8 */,/*21099*/"Hangul Syllable MWAELG"/* BAE9 */, /*21100*/"Hangul Syllable MWAELM"/* BAEA */,/*21101*/"Hangul Syllable MWAELB"/* BAEB */, /*21102*/"Hangul Syllable MWAELS"/* BAEC */,/*21103*/"Hangul Syllable MWAELT"/* BAED */, /*21104*/"Hangul Syllable MWAELP"/* BAEE */,/*21105*/"Hangul Syllable MWAELH"/* BAEF */, /*21106*/"Hangul Syllable MWAEM"/* BAF0 */,/*21107*/"Hangul Syllable MWAEB"/* BAF1 */, /*21108*/"Hangul Syllable MWAEBS"/* BAF2 */,/*21109*/"Hangul Syllable MWAES"/* BAF3 */, /*21110*/"Hangul Syllable MWAESS"/* BAF4 */,/*21111*/"Hangul Syllable MWAENG"/* BAF5 */, /*21112*/"Hangul Syllable MWAEJ"/* BAF6 */,/*21113*/"Hangul Syllable MWAEC"/* BAF7 */, /*21114*/"Hangul Syllable MWAEK"/* BAF8 */,/*21115*/"Hangul Syllable MWAET"/* BAF9 */, /*21116*/"Hangul Syllable MWAEP"/* BAFA */,/*21117*/"Hangul Syllable MWAEH"/* BAFB */, /*21118*/"Hangul Syllable MOE"/* BAFC */,/*21119*/"Hangul Syllable MOEG"/* BAFD */, /*21120*/"Hangul Syllable MOEGG"/* BAFE */,/*21121*/"Hangul Syllable MOEGS"/* BAFF */, /*21122*/"Hangul Syllable MOEN"/* BB00 */,/*21123*/"Hangul Syllable MOENJ"/* BB01 */, /*21124*/"Hangul Syllable MOENH"/* BB02 */,/*21125*/"Hangul Syllable MOED"/* BB03 */, /*21126*/"Hangul Syllable MOEL"/* BB04 */,/*21127*/"Hangul Syllable MOELG"/* BB05 */, /*21128*/"Hangul Syllable MOELM"/* BB06 */,/*21129*/"Hangul Syllable MOELB"/* BB07 */, /*21130*/"Hangul Syllable MOELS"/* BB08 */,/*21131*/"Hangul Syllable MOELT"/* BB09 */, /*21132*/"Hangul Syllable MOELP"/* BB0A */,/*21133*/"Hangul Syllable MOELH"/* BB0B */, /*21134*/"Hangul Syllable MOEM"/* BB0C */,/*21135*/"Hangul Syllable MOEB"/* BB0D */, /*21136*/"Hangul Syllable MOEBS"/* BB0E */,/*21137*/"Hangul Syllable MOES"/* BB0F */, /*21138*/"Hangul Syllable MOESS"/* BB10 */,/*21139*/"Hangul Syllable MOENG"/* BB11 */, /*21140*/"Hangul Syllable MOEJ"/* BB12 */,/*21141*/"Hangul Syllable MOEC"/* BB13 */, /*21142*/"Hangul Syllable MOEK"/* BB14 */,/*21143*/"Hangul Syllable MOET"/* BB15 */, /*21144*/"Hangul Syllable MOEP"/* BB16 */,/*21145*/"Hangul Syllable MOEH"/* BB17 */, /*21146*/"Hangul Syllable MYO"/* BB18 */,/*21147*/"Hangul Syllable MYOG"/* BB19 */, /*21148*/"Hangul Syllable MYOGG"/* BB1A */,/*21149*/"Hangul Syllable MYOGS"/* BB1B */, /*21150*/"Hangul Syllable MYON"/* BB1C */,/*21151*/"Hangul Syllable MYONJ"/* BB1D */, /*21152*/"Hangul Syllable MYONH"/* BB1E */,/*21153*/"Hangul Syllable MYOD"/* BB1F */, /*21154*/"Hangul Syllable MYOL"/* BB20 */,/*21155*/"Hangul Syllable MYOLG"/* BB21 */, /*21156*/"Hangul Syllable MYOLM"/* BB22 */,/*21157*/"Hangul Syllable MYOLB"/* BB23 */, /*21158*/"Hangul Syllable MYOLS"/* BB24 */,/*21159*/"Hangul Syllable MYOLT"/* BB25 */, /*21160*/"Hangul Syllable MYOLP"/* BB26 */,/*21161*/"Hangul Syllable MYOLH"/* BB27 */, /*21162*/"Hangul Syllable MYOM"/* BB28 */,/*21163*/"Hangul Syllable MYOB"/* BB29 */, /*21164*/"Hangul Syllable MYOBS"/* BB2A */,/*21165*/"Hangul Syllable MYOS"/* BB2B */, /*21166*/"Hangul Syllable MYOSS"/* BB2C */,/*21167*/"Hangul Syllable MYONG"/* BB2D */, /*21168*/"Hangul Syllable MYOJ"/* BB2E */,/*21169*/"Hangul Syllable MYOC"/* BB2F */, /*21170*/"Hangul Syllable MYOK"/* BB30 */,/*21171*/"Hangul Syllable MYOT"/* BB31 */, /*21172*/"Hangul Syllable MYOP"/* BB32 */,/*21173*/"Hangul Syllable MYOH"/* BB33 */, /*21174*/"Hangul Syllable MU"/* BB34 */,/*21175*/"Hangul Syllable MUG"/* BB35 */, /*21176*/"Hangul Syllable MUGG"/* BB36 */,/*21177*/"Hangul Syllable MUGS"/* BB37 */, /*21178*/"Hangul Syllable MUN"/* BB38 */,/*21179*/"Hangul Syllable MUNJ"/* BB39 */, /*21180*/"Hangul Syllable MUNH"/* BB3A */,/*21181*/"Hangul Syllable MUD"/* BB3B */, /*21182*/"Hangul Syllable MUL"/* BB3C */,/*21183*/"Hangul Syllable MULG"/* BB3D */, /*21184*/"Hangul Syllable MULM"/* BB3E */,/*21185*/"Hangul Syllable MULB"/* BB3F */, /*21186*/"Hangul Syllable MULS"/* BB40 */,/*21187*/"Hangul Syllable MULT"/* BB41 */, /*21188*/"Hangul Syllable MULP"/* BB42 */,/*21189*/"Hangul Syllable MULH"/* BB43 */, /*21190*/"Hangul Syllable MUM"/* BB44 */,/*21191*/"Hangul Syllable MUB"/* BB45 */, /*21192*/"Hangul Syllable MUBS"/* BB46 */,/*21193*/"Hangul Syllable MUS"/* BB47 */, /*21194*/"Hangul Syllable MUSS"/* BB48 */,/*21195*/"Hangul Syllable MUNG"/* BB49 */, /*21196*/"Hangul Syllable MUJ"/* BB4A */,/*21197*/"Hangul Syllable MUC"/* BB4B */, /*21198*/"Hangul Syllable MUK"/* BB4C */,/*21199*/"Hangul Syllable MUT"/* BB4D */, /*21200*/"Hangul Syllable MUP"/* BB4E */,/*21201*/"Hangul Syllable MUH"/* BB4F */, /*21202*/"Hangul Syllable MWEO"/* BB50 */,/*21203*/"Hangul Syllable MWEOG"/* BB51 */, /*21204*/"Hangul Syllable MWEOGG"/* BB52 */,/*21205*/"Hangul Syllable MWEOGS"/* BB53 */, /*21206*/"Hangul Syllable MWEON"/* BB54 */,/*21207*/"Hangul Syllable MWEONJ"/* BB55 */, /*21208*/"Hangul Syllable MWEONH"/* BB56 */,/*21209*/"Hangul Syllable MWEOD"/* BB57 */, /*21210*/"Hangul Syllable MWEOL"/* BB58 */,/*21211*/"Hangul Syllable MWEOLG"/* BB59 */, /*21212*/"Hangul Syllable MWEOLM"/* BB5A */,/*21213*/"Hangul Syllable MWEOLB"/* BB5B */, /*21214*/"Hangul Syllable MWEOLS"/* BB5C */,/*21215*/"Hangul Syllable MWEOLT"/* BB5D */, /*21216*/"Hangul Syllable MWEOLP"/* BB5E */,/*21217*/"Hangul Syllable MWEOLH"/* BB5F */, /*21218*/"Hangul Syllable MWEOM"/* BB60 */,/*21219*/"Hangul Syllable MWEOB"/* BB61 */, /*21220*/"Hangul Syllable MWEOBS"/* BB62 */,/*21221*/"Hangul Syllable MWEOS"/* BB63 */, /*21222*/"Hangul Syllable MWEOSS"/* BB64 */,/*21223*/"Hangul Syllable MWEONG"/* BB65 */, /*21224*/"Hangul Syllable MWEOJ"/* BB66 */,/*21225*/"Hangul Syllable MWEOC"/* BB67 */, /*21226*/"Hangul Syllable MWEOK"/* BB68 */,/*21227*/"Hangul Syllable MWEOT"/* BB69 */, /*21228*/"Hangul Syllable MWEOP"/* BB6A */,/*21229*/"Hangul Syllable MWEOH"/* BB6B */, /*21230*/"Hangul Syllable MWE"/* BB6C */,/*21231*/"Hangul Syllable MWEG"/* BB6D */, /*21232*/"Hangul Syllable MWEGG"/* BB6E */,/*21233*/"Hangul Syllable MWEGS"/* BB6F */, /*21234*/"Hangul Syllable MWEN"/* BB70 */,/*21235*/"Hangul Syllable MWENJ"/* BB71 */, /*21236*/"Hangul Syllable MWENH"/* BB72 */,/*21237*/"Hangul Syllable MWED"/* BB73 */, /*21238*/"Hangul Syllable MWEL"/* BB74 */,/*21239*/"Hangul Syllable MWELG"/* BB75 */, /*21240*/"Hangul Syllable MWELM"/* BB76 */,/*21241*/"Hangul Syllable MWELB"/* BB77 */, /*21242*/"Hangul Syllable MWELS"/* BB78 */,/*21243*/"Hangul Syllable MWELT"/* BB79 */, /*21244*/"Hangul Syllable MWELP"/* BB7A */,/*21245*/"Hangul Syllable MWELH"/* BB7B */, /*21246*/"Hangul Syllable MWEM"/* BB7C */,/*21247*/"Hangul Syllable MWEB"/* BB7D */, /*21248*/"Hangul Syllable MWEBS"/* BB7E */,/*21249*/"Hangul Syllable MWES"/* BB7F */, /*21250*/"Hangul Syllable MWESS"/* BB80 */,/*21251*/"Hangul Syllable MWENG"/* BB81 */, /*21252*/"Hangul Syllable MWEJ"/* BB82 */,/*21253*/"Hangul Syllable MWEC"/* BB83 */, /*21254*/"Hangul Syllable MWEK"/* BB84 */,/*21255*/"Hangul Syllable MWET"/* BB85 */, /*21256*/"Hangul Syllable MWEP"/* BB86 */,/*21257*/"Hangul Syllable MWEH"/* BB87 */, /*21258*/"Hangul Syllable MWI"/* BB88 */,/*21259*/"Hangul Syllable MWIG"/* BB89 */, /*21260*/"Hangul Syllable MWIGG"/* BB8A */,/*21261*/"Hangul Syllable MWIGS"/* BB8B */, /*21262*/"Hangul Syllable MWIN"/* BB8C */,/*21263*/"Hangul Syllable MWINJ"/* BB8D */, /*21264*/"Hangul Syllable MWINH"/* BB8E */,/*21265*/"Hangul Syllable MWID"/* BB8F */, /*21266*/"Hangul Syllable MWIL"/* BB90 */,/*21267*/"Hangul Syllable MWILG"/* BB91 */, /*21268*/"Hangul Syllable MWILM"/* BB92 */,/*21269*/"Hangul Syllable MWILB"/* BB93 */, /*21270*/"Hangul Syllable MWILS"/* BB94 */,/*21271*/"Hangul Syllable MWILT"/* BB95 */, /*21272*/"Hangul Syllable MWILP"/* BB96 */,/*21273*/"Hangul Syllable MWILH"/* BB97 */, /*21274*/"Hangul Syllable MWIM"/* BB98 */,/*21275*/"Hangul Syllable MWIB"/* BB99 */, /*21276*/"Hangul Syllable MWIBS"/* BB9A */,/*21277*/"Hangul Syllable MWIS"/* BB9B */, /*21278*/"Hangul Syllable MWISS"/* BB9C */,/*21279*/"Hangul Syllable MWING"/* BB9D */, /*21280*/"Hangul Syllable MWIJ"/* BB9E */,/*21281*/"Hangul Syllable MWIC"/* BB9F */, /*21282*/"Hangul Syllable MWIK"/* BBA0 */,/*21283*/"Hangul Syllable MWIT"/* BBA1 */, /*21284*/"Hangul Syllable MWIP"/* BBA2 */,/*21285*/"Hangul Syllable MWIH"/* BBA3 */, /*21286*/"Hangul Syllable MYU"/* BBA4 */,/*21287*/"Hangul Syllable MYUG"/* BBA5 */, /*21288*/"Hangul Syllable MYUGG"/* BBA6 */,/*21289*/"Hangul Syllable MYUGS"/* BBA7 */, /*21290*/"Hangul Syllable MYUN"/* BBA8 */,/*21291*/"Hangul Syllable MYUNJ"/* BBA9 */, /*21292*/"Hangul Syllable MYUNH"/* BBAA */,/*21293*/"Hangul Syllable MYUD"/* BBAB */, /*21294*/"Hangul Syllable MYUL"/* BBAC */,/*21295*/"Hangul Syllable MYULG"/* BBAD */, /*21296*/"Hangul Syllable MYULM"/* BBAE */,/*21297*/"Hangul Syllable MYULB"/* BBAF */, /*21298*/"Hangul Syllable MYULS"/* BBB0 */,/*21299*/"Hangul Syllable MYULT"/* BBB1 */, /*21300*/"Hangul Syllable MYULP"/* BBB2 */,/*21301*/"Hangul Syllable MYULH"/* BBB3 */, /*21302*/"Hangul Syllable MYUM"/* BBB4 */,/*21303*/"Hangul Syllable MYUB"/* BBB5 */, /*21304*/"Hangul Syllable MYUBS"/* BBB6 */,/*21305*/"Hangul Syllable MYUS"/* BBB7 */, /*21306*/"Hangul Syllable MYUSS"/* BBB8 */,/*21307*/"Hangul Syllable MYUNG"/* BBB9 */, /*21308*/"Hangul Syllable MYUJ"/* BBBA */,/*21309*/"Hangul Syllable MYUC"/* BBBB */, /*21310*/"Hangul Syllable MYUK"/* BBBC */,/*21311*/"Hangul Syllable MYUT"/* BBBD */, /*21312*/"Hangul Syllable MYUP"/* BBBE */,/*21313*/"Hangul Syllable MYUH"/* BBBF */, /*21314*/"Hangul Syllable MEU"/* BBC0 */,/*21315*/"Hangul Syllable MEUG"/* BBC1 */, /*21316*/"Hangul Syllable MEUGG"/* BBC2 */,/*21317*/"Hangul Syllable MEUGS"/* BBC3 */, /*21318*/"Hangul Syllable MEUN"/* BBC4 */,/*21319*/"Hangul Syllable MEUNJ"/* BBC5 */, /*21320*/"Hangul Syllable MEUNH"/* BBC6 */,/*21321*/"Hangul Syllable MEUD"/* BBC7 */, /*21322*/"Hangul Syllable MEUL"/* BBC8 */,/*21323*/"Hangul Syllable MEULG"/* BBC9 */, /*21324*/"Hangul Syllable MEULM"/* BBCA */,/*21325*/"Hangul Syllable MEULB"/* BBCB */, /*21326*/"Hangul Syllable MEULS"/* BBCC */,/*21327*/"Hangul Syllable MEULT"/* BBCD */, /*21328*/"Hangul Syllable MEULP"/* BBCE */,/*21329*/"Hangul Syllable MEULH"/* BBCF */, /*21330*/"Hangul Syllable MEUM"/* BBD0 */,/*21331*/"Hangul Syllable MEUB"/* BBD1 */, /*21332*/"Hangul Syllable MEUBS"/* BBD2 */,/*21333*/"Hangul Syllable MEUS"/* BBD3 */, /*21334*/"Hangul Syllable MEUSS"/* BBD4 */,/*21335*/"Hangul Syllable MEUNG"/* BBD5 */, /*21336*/"Hangul Syllable MEUJ"/* BBD6 */,/*21337*/"Hangul Syllable MEUC"/* BBD7 */, /*21338*/"Hangul Syllable MEUK"/* BBD8 */,/*21339*/"Hangul Syllable MEUT"/* BBD9 */, /*21340*/"Hangul Syllable MEUP"/* BBDA */,/*21341*/"Hangul Syllable MEUH"/* BBDB */, /*21342*/"Hangul Syllable MYI"/* BBDC */,/*21343*/"Hangul Syllable MYIG"/* BBDD */, /*21344*/"Hangul Syllable MYIGG"/* BBDE */,/*21345*/"Hangul Syllable MYIGS"/* BBDF */, /*21346*/"Hangul Syllable MYIN"/* BBE0 */,/*21347*/"Hangul Syllable MYINJ"/* BBE1 */, /*21348*/"Hangul Syllable MYINH"/* BBE2 */,/*21349*/"Hangul Syllable MYID"/* BBE3 */, /*21350*/"Hangul Syllable MYIL"/* BBE4 */,/*21351*/"Hangul Syllable MYILG"/* BBE5 */, /*21352*/"Hangul Syllable MYILM"/* BBE6 */,/*21353*/"Hangul Syllable MYILB"/* BBE7 */, /*21354*/"Hangul Syllable MYILS"/* BBE8 */,/*21355*/"Hangul Syllable MYILT"/* BBE9 */, /*21356*/"Hangul Syllable MYILP"/* BBEA */,/*21357*/"Hangul Syllable MYILH"/* BBEB */, /*21358*/"Hangul Syllable MYIM"/* BBEC */,/*21359*/"Hangul Syllable MYIB"/* BBED */, /*21360*/"Hangul Syllable MYIBS"/* BBEE */,/*21361*/"Hangul Syllable MYIS"/* BBEF */, /*21362*/"Hangul Syllable MYISS"/* BBF0 */,/*21363*/"Hangul Syllable MYING"/* BBF1 */, /*21364*/"Hangul Syllable MYIJ"/* BBF2 */,/*21365*/"Hangul Syllable MYIC"/* BBF3 */, /*21366*/"Hangul Syllable MYIK"/* BBF4 */,/*21367*/"Hangul Syllable MYIT"/* BBF5 */, /*21368*/"Hangul Syllable MYIP"/* BBF6 */,/*21369*/"Hangul Syllable MYIH"/* BBF7 */, /*21370*/"Hangul Syllable MI"/* BBF8 */,/*21371*/"Hangul Syllable MIG"/* BBF9 */, /*21372*/"Hangul Syllable MIGG"/* BBFA */,/*21373*/"Hangul Syllable MIGS"/* BBFB */, /*21374*/"Hangul Syllable MIN"/* BBFC */,/*21375*/"Hangul Syllable MINJ"/* BBFD */, /*21376*/"Hangul Syllable MINH"/* BBFE */,/*21377*/"Hangul Syllable MID"/* BBFF */, /*21378*/"Hangul Syllable MIL"/* BC00 */,/*21379*/"Hangul Syllable MILG"/* BC01 */, /*21380*/"Hangul Syllable MILM"/* BC02 */,/*21381*/"Hangul Syllable MILB"/* BC03 */, /*21382*/"Hangul Syllable MILS"/* BC04 */,/*21383*/"Hangul Syllable MILT"/* BC05 */, /*21384*/"Hangul Syllable MILP"/* BC06 */,/*21385*/"Hangul Syllable MILH"/* BC07 */, /*21386*/"Hangul Syllable MIM"/* BC08 */,/*21387*/"Hangul Syllable MIB"/* BC09 */, /*21388*/"Hangul Syllable MIBS"/* BC0A */,/*21389*/"Hangul Syllable MIS"/* BC0B */, /*21390*/"Hangul Syllable MISS"/* BC0C */,/*21391*/"Hangul Syllable MING"/* BC0D */, /*21392*/"Hangul Syllable MIJ"/* BC0E */,/*21393*/"Hangul Syllable MIC"/* BC0F */, /*21394*/"Hangul Syllable MIK"/* BC10 */,/*21395*/"Hangul Syllable MIT"/* BC11 */, /*21396*/"Hangul Syllable MIP"/* BC12 */,/*21397*/"Hangul Syllable MIH"/* BC13 */, /*21398*/"Hangul Syllable BA"/* BC14 */,/*21399*/"Hangul Syllable BAG"/* BC15 */, /*21400*/"Hangul Syllable BAGG"/* BC16 */,/*21401*/"Hangul Syllable BAGS"/* BC17 */, /*21402*/"Hangul Syllable BAN"/* BC18 */,/*21403*/"Hangul Syllable BANJ"/* BC19 */, /*21404*/"Hangul Syllable BANH"/* BC1A */,/*21405*/"Hangul Syllable BAD"/* BC1B */, /*21406*/"Hangul Syllable BAL"/* BC1C */,/*21407*/"Hangul Syllable BALG"/* BC1D */, /*21408*/"Hangul Syllable BALM"/* BC1E */,/*21409*/"Hangul Syllable BALB"/* BC1F */, /*21410*/"Hangul Syllable BALS"/* BC20 */,/*21411*/"Hangul Syllable BALT"/* BC21 */, /*21412*/"Hangul Syllable BALP"/* BC22 */,/*21413*/"Hangul Syllable BALH"/* BC23 */, /*21414*/"Hangul Syllable BAM"/* BC24 */,/*21415*/"Hangul Syllable BAB"/* BC25 */, /*21416*/"Hangul Syllable BABS"/* BC26 */,/*21417*/"Hangul Syllable BAS"/* BC27 */, /*21418*/"Hangul Syllable BASS"/* BC28 */,/*21419*/"Hangul Syllable BANG"/* BC29 */, /*21420*/"Hangul Syllable BAJ"/* BC2A */,/*21421*/"Hangul Syllable BAC"/* BC2B */, /*21422*/"Hangul Syllable BAK"/* BC2C */,/*21423*/"Hangul Syllable BAT"/* BC2D */, /*21424*/"Hangul Syllable BAP"/* BC2E */,/*21425*/"Hangul Syllable BAH"/* BC2F */, /*21426*/"Hangul Syllable BAE"/* BC30 */,/*21427*/"Hangul Syllable BAEG"/* BC31 */, /*21428*/"Hangul Syllable BAEGG"/* BC32 */,/*21429*/"Hangul Syllable BAEGS"/* BC33 */, /*21430*/"Hangul Syllable BAEN"/* BC34 */,/*21431*/"Hangul Syllable BAENJ"/* BC35 */, /*21432*/"Hangul Syllable BAENH"/* BC36 */,/*21433*/"Hangul Syllable BAED"/* BC37 */, /*21434*/"Hangul Syllable BAEL"/* BC38 */,/*21435*/"Hangul Syllable BAELG"/* BC39 */, /*21436*/"Hangul Syllable BAELM"/* BC3A */,/*21437*/"Hangul Syllable BAELB"/* BC3B */, /*21438*/"Hangul Syllable BAELS"/* BC3C */,/*21439*/"Hangul Syllable BAELT"/* BC3D */, /*21440*/"Hangul Syllable BAELP"/* BC3E */,/*21441*/"Hangul Syllable BAELH"/* BC3F */, /*21442*/"Hangul Syllable BAEM"/* BC40 */,/*21443*/"Hangul Syllable BAEB"/* BC41 */, /*21444*/"Hangul Syllable BAEBS"/* BC42 */,/*21445*/"Hangul Syllable BAES"/* BC43 */, /*21446*/"Hangul Syllable BAESS"/* BC44 */,/*21447*/"Hangul Syllable BAENG"/* BC45 */, /*21448*/"Hangul Syllable BAEJ"/* BC46 */,/*21449*/"Hangul Syllable BAEC"/* BC47 */, /*21450*/"Hangul Syllable BAEK"/* BC48 */,/*21451*/"Hangul Syllable BAET"/* BC49 */, /*21452*/"Hangul Syllable BAEP"/* BC4A */,/*21453*/"Hangul Syllable BAEH"/* BC4B */, /*21454*/"Hangul Syllable BYA"/* BC4C */,/*21455*/"Hangul Syllable BYAG"/* BC4D */, /*21456*/"Hangul Syllable BYAGG"/* BC4E */,/*21457*/"Hangul Syllable BYAGS"/* BC4F */, /*21458*/"Hangul Syllable BYAN"/* BC50 */,/*21459*/"Hangul Syllable BYANJ"/* BC51 */, /*21460*/"Hangul Syllable BYANH"/* BC52 */,/*21461*/"Hangul Syllable BYAD"/* BC53 */, /*21462*/"Hangul Syllable BYAL"/* BC54 */,/*21463*/"Hangul Syllable BYALG"/* BC55 */, /*21464*/"Hangul Syllable BYALM"/* BC56 */,/*21465*/"Hangul Syllable BYALB"/* BC57 */, /*21466*/"Hangul Syllable BYALS"/* BC58 */,/*21467*/"Hangul Syllable BYALT"/* BC59 */, /*21468*/"Hangul Syllable BYALP"/* BC5A */,/*21469*/"Hangul Syllable BYALH"/* BC5B */, /*21470*/"Hangul Syllable BYAM"/* BC5C */,/*21471*/"Hangul Syllable BYAB"/* BC5D */, /*21472*/"Hangul Syllable BYABS"/* BC5E */,/*21473*/"Hangul Syllable BYAS"/* BC5F */, /*21474*/"Hangul Syllable BYASS"/* BC60 */,/*21475*/"Hangul Syllable BYANG"/* BC61 */, /*21476*/"Hangul Syllable BYAJ"/* BC62 */,/*21477*/"Hangul Syllable BYAC"/* BC63 */, /*21478*/"Hangul Syllable BYAK"/* BC64 */,/*21479*/"Hangul Syllable BYAT"/* BC65 */, /*21480*/"Hangul Syllable BYAP"/* BC66 */,/*21481*/"Hangul Syllable BYAH"/* BC67 */, /*21482*/"Hangul Syllable BYAE"/* BC68 */,/*21483*/"Hangul Syllable BYAEG"/* BC69 */, /*21484*/"Hangul Syllable BYAEGG"/* BC6A */,/*21485*/"Hangul Syllable BYAEGS"/* BC6B */, /*21486*/"Hangul Syllable BYAEN"/* BC6C */,/*21487*/"Hangul Syllable BYAENJ"/* BC6D */, /*21488*/"Hangul Syllable BYAENH"/* BC6E */,/*21489*/"Hangul Syllable BYAED"/* BC6F */, /*21490*/"Hangul Syllable BYAEL"/* BC70 */,/*21491*/"Hangul Syllable BYAELG"/* BC71 */, /*21492*/"Hangul Syllable BYAELM"/* BC72 */,/*21493*/"Hangul Syllable BYAELB"/* BC73 */, /*21494*/"Hangul Syllable BYAELS"/* BC74 */,/*21495*/"Hangul Syllable BYAELT"/* BC75 */, /*21496*/"Hangul Syllable BYAELP"/* BC76 */,/*21497*/"Hangul Syllable BYAELH"/* BC77 */, /*21498*/"Hangul Syllable BYAEM"/* BC78 */,/*21499*/"Hangul Syllable BYAEB"/* BC79 */, /*21500*/"Hangul Syllable BYAEBS"/* BC7A */,/*21501*/"Hangul Syllable BYAES"/* BC7B */, /*21502*/"Hangul Syllable BYAESS"/* BC7C */,/*21503*/"Hangul Syllable BYAENG"/* BC7D */, /*21504*/"Hangul Syllable BYAEJ"/* BC7E */,/*21505*/"Hangul Syllable BYAEC"/* BC7F */, /*21506*/"Hangul Syllable BYAEK"/* BC80 */,/*21507*/"Hangul Syllable BYAET"/* BC81 */, /*21508*/"Hangul Syllable BYAEP"/* BC82 */,/*21509*/"Hangul Syllable BYAEH"/* BC83 */, /*21510*/"Hangul Syllable BEO"/* BC84 */,/*21511*/"Hangul Syllable BEOG"/* BC85 */, /*21512*/"Hangul Syllable BEOGG"/* BC86 */,/*21513*/"Hangul Syllable BEOGS"/* BC87 */, /*21514*/"Hangul Syllable BEON"/* BC88 */,/*21515*/"Hangul Syllable BEONJ"/* BC89 */, /*21516*/"Hangul Syllable BEONH"/* BC8A */,/*21517*/"Hangul Syllable BEOD"/* BC8B */, /*21518*/"Hangul Syllable BEOL"/* BC8C */,/*21519*/"Hangul Syllable BEOLG"/* BC8D */, /*21520*/"Hangul Syllable BEOLM"/* BC8E */,/*21521*/"Hangul Syllable BEOLB"/* BC8F */, /*21522*/"Hangul Syllable BEOLS"/* BC90 */,/*21523*/"Hangul Syllable BEOLT"/* BC91 */, /*21524*/"Hangul Syllable BEOLP"/* BC92 */,/*21525*/"Hangul Syllable BEOLH"/* BC93 */, /*21526*/"Hangul Syllable BEOM"/* BC94 */,/*21527*/"Hangul Syllable BEOB"/* BC95 */, /*21528*/"Hangul Syllable BEOBS"/* BC96 */,/*21529*/"Hangul Syllable BEOS"/* BC97 */, /*21530*/"Hangul Syllable BEOSS"/* BC98 */,/*21531*/"Hangul Syllable BEONG"/* BC99 */, /*21532*/"Hangul Syllable BEOJ"/* BC9A */,/*21533*/"Hangul Syllable BEOC"/* BC9B */, /*21534*/"Hangul Syllable BEOK"/* BC9C */,/*21535*/"Hangul Syllable BEOT"/* BC9D */, /*21536*/"Hangul Syllable BEOP"/* BC9E */,/*21537*/"Hangul Syllable BEOH"/* BC9F */, /*21538*/"Hangul Syllable BE"/* BCA0 */,/*21539*/"Hangul Syllable BEG"/* BCA1 */, /*21540*/"Hangul Syllable BEGG"/* BCA2 */,/*21541*/"Hangul Syllable BEGS"/* BCA3 */, /*21542*/"Hangul Syllable BEN"/* BCA4 */,/*21543*/"Hangul Syllable BENJ"/* BCA5 */, /*21544*/"Hangul Syllable BENH"/* BCA6 */,/*21545*/"Hangul Syllable BED"/* BCA7 */, /*21546*/"Hangul Syllable BEL"/* BCA8 */,/*21547*/"Hangul Syllable BELG"/* BCA9 */, /*21548*/"Hangul Syllable BELM"/* BCAA */,/*21549*/"Hangul Syllable BELB"/* BCAB */, /*21550*/"Hangul Syllable BELS"/* BCAC */,/*21551*/"Hangul Syllable BELT"/* BCAD */, /*21552*/"Hangul Syllable BELP"/* BCAE */,/*21553*/"Hangul Syllable BELH"/* BCAF */, /*21554*/"Hangul Syllable BEM"/* BCB0 */,/*21555*/"Hangul Syllable BEB"/* BCB1 */, /*21556*/"Hangul Syllable BEBS"/* BCB2 */,/*21557*/"Hangul Syllable BES"/* BCB3 */, /*21558*/"Hangul Syllable BESS"/* BCB4 */,/*21559*/"Hangul Syllable BENG"/* BCB5 */, /*21560*/"Hangul Syllable BEJ"/* BCB6 */,/*21561*/"Hangul Syllable BEC"/* BCB7 */, /*21562*/"Hangul Syllable BEK"/* BCB8 */,/*21563*/"Hangul Syllable BET"/* BCB9 */, /*21564*/"Hangul Syllable BEP"/* BCBA */,/*21565*/"Hangul Syllable BEH"/* BCBB */, /*21566*/"Hangul Syllable BYEO"/* BCBC */,/*21567*/"Hangul Syllable BYEOG"/* BCBD */, /*21568*/"Hangul Syllable BYEOGG"/* BCBE */,/*21569*/"Hangul Syllable BYEOGS"/* BCBF */, /*21570*/"Hangul Syllable BYEON"/* BCC0 */,/*21571*/"Hangul Syllable BYEONJ"/* BCC1 */, /*21572*/"Hangul Syllable BYEONH"/* BCC2 */,/*21573*/"Hangul Syllable BYEOD"/* BCC3 */, /*21574*/"Hangul Syllable BYEOL"/* BCC4 */,/*21575*/"Hangul Syllable BYEOLG"/* BCC5 */, /*21576*/"Hangul Syllable BYEOLM"/* BCC6 */,/*21577*/"Hangul Syllable BYEOLB"/* BCC7 */, /*21578*/"Hangul Syllable BYEOLS"/* BCC8 */,/*21579*/"Hangul Syllable BYEOLT"/* BCC9 */, /*21580*/"Hangul Syllable BYEOLP"/* BCCA */,/*21581*/"Hangul Syllable BYEOLH"/* BCCB */, /*21582*/"Hangul Syllable BYEOM"/* BCCC */,/*21583*/"Hangul Syllable BYEOB"/* BCCD */, /*21584*/"Hangul Syllable BYEOBS"/* BCCE */,/*21585*/"Hangul Syllable BYEOS"/* BCCF */, /*21586*/"Hangul Syllable BYEOSS"/* BCD0 */,/*21587*/"Hangul Syllable BYEONG"/* BCD1 */, /*21588*/"Hangul Syllable BYEOJ"/* BCD2 */,/*21589*/"Hangul Syllable BYEOC"/* BCD3 */, /*21590*/"Hangul Syllable BYEOK"/* BCD4 */,/*21591*/"Hangul Syllable BYEOT"/* BCD5 */, /*21592*/"Hangul Syllable BYEOP"/* BCD6 */,/*21593*/"Hangul Syllable BYEOH"/* BCD7 */, /*21594*/"Hangul Syllable BYE"/* BCD8 */,/*21595*/"Hangul Syllable BYEG"/* BCD9 */, /*21596*/"Hangul Syllable BYEGG"/* BCDA */,/*21597*/"Hangul Syllable BYEGS"/* BCDB */, /*21598*/"Hangul Syllable BYEN"/* BCDC */,/*21599*/"Hangul Syllable BYENJ"/* BCDD */, /*21600*/"Hangul Syllable BYENH"/* BCDE */,/*21601*/"Hangul Syllable BYED"/* BCDF */, /*21602*/"Hangul Syllable BYEL"/* BCE0 */,/*21603*/"Hangul Syllable BYELG"/* BCE1 */, /*21604*/"Hangul Syllable BYELM"/* BCE2 */,/*21605*/"Hangul Syllable BYELB"/* BCE3 */, /*21606*/"Hangul Syllable BYELS"/* BCE4 */,/*21607*/"Hangul Syllable BYELT"/* BCE5 */, /*21608*/"Hangul Syllable BYELP"/* BCE6 */,/*21609*/"Hangul Syllable BYELH"/* BCE7 */, /*21610*/"Hangul Syllable BYEM"/* BCE8 */,/*21611*/"Hangul Syllable BYEB"/* BCE9 */, /*21612*/"Hangul Syllable BYEBS"/* BCEA */,/*21613*/"Hangul Syllable BYES"/* BCEB */, /*21614*/"Hangul Syllable BYESS"/* BCEC */,/*21615*/"Hangul Syllable BYENG"/* BCED */, /*21616*/"Hangul Syllable BYEJ"/* BCEE */,/*21617*/"Hangul Syllable BYEC"/* BCEF */, /*21618*/"Hangul Syllable BYEK"/* BCF0 */,/*21619*/"Hangul Syllable BYET"/* BCF1 */, /*21620*/"Hangul Syllable BYEP"/* BCF2 */,/*21621*/"Hangul Syllable BYEH"/* BCF3 */, /*21622*/"Hangul Syllable BO"/* BCF4 */,/*21623*/"Hangul Syllable BOG"/* BCF5 */, /*21624*/"Hangul Syllable BOGG"/* BCF6 */,/*21625*/"Hangul Syllable BOGS"/* BCF7 */, /*21626*/"Hangul Syllable BON"/* BCF8 */,/*21627*/"Hangul Syllable BONJ"/* BCF9 */, /*21628*/"Hangul Syllable BONH"/* BCFA */,/*21629*/"Hangul Syllable BOD"/* BCFB */, /*21630*/"Hangul Syllable BOL"/* BCFC */,/*21631*/"Hangul Syllable BOLG"/* BCFD */, /*21632*/"Hangul Syllable BOLM"/* BCFE */,/*21633*/"Hangul Syllable BOLB"/* BCFF */, /*21634*/"Hangul Syllable BOLS"/* BD00 */,/*21635*/"Hangul Syllable BOLT"/* BD01 */, /*21636*/"Hangul Syllable BOLP"/* BD02 */,/*21637*/"Hangul Syllable BOLH"/* BD03 */, /*21638*/"Hangul Syllable BOM"/* BD04 */,/*21639*/"Hangul Syllable BOB"/* BD05 */, /*21640*/"Hangul Syllable BOBS"/* BD06 */,/*21641*/"Hangul Syllable BOS"/* BD07 */, /*21642*/"Hangul Syllable BOSS"/* BD08 */,/*21643*/"Hangul Syllable BONG"/* BD09 */, /*21644*/"Hangul Syllable BOJ"/* BD0A */,/*21645*/"Hangul Syllable BOC"/* BD0B */, /*21646*/"Hangul Syllable BOK"/* BD0C */,/*21647*/"Hangul Syllable BOT"/* BD0D */, /*21648*/"Hangul Syllable BOP"/* BD0E */,/*21649*/"Hangul Syllable BOH"/* BD0F */, /*21650*/"Hangul Syllable BWA"/* BD10 */,/*21651*/"Hangul Syllable BWAG"/* BD11 */, /*21652*/"Hangul Syllable BWAGG"/* BD12 */,/*21653*/"Hangul Syllable BWAGS"/* BD13 */, /*21654*/"Hangul Syllable BWAN"/* BD14 */,/*21655*/"Hangul Syllable BWANJ"/* BD15 */, /*21656*/"Hangul Syllable BWANH"/* BD16 */,/*21657*/"Hangul Syllable BWAD"/* BD17 */, /*21658*/"Hangul Syllable BWAL"/* BD18 */,/*21659*/"Hangul Syllable BWALG"/* BD19 */, /*21660*/"Hangul Syllable BWALM"/* BD1A */,/*21661*/"Hangul Syllable BWALB"/* BD1B */, /*21662*/"Hangul Syllable BWALS"/* BD1C */,/*21663*/"Hangul Syllable BWALT"/* BD1D */, /*21664*/"Hangul Syllable BWALP"/* BD1E */,/*21665*/"Hangul Syllable BWALH"/* BD1F */, /*21666*/"Hangul Syllable BWAM"/* BD20 */,/*21667*/"Hangul Syllable BWAB"/* BD21 */, /*21668*/"Hangul Syllable BWABS"/* BD22 */,/*21669*/"Hangul Syllable BWAS"/* BD23 */, /*21670*/"Hangul Syllable BWASS"/* BD24 */,/*21671*/"Hangul Syllable BWANG"/* BD25 */, /*21672*/"Hangul Syllable BWAJ"/* BD26 */,/*21673*/"Hangul Syllable BWAC"/* BD27 */, /*21674*/"Hangul Syllable BWAK"/* BD28 */,/*21675*/"Hangul Syllable BWAT"/* BD29 */, /*21676*/"Hangul Syllable BWAP"/* BD2A */,/*21677*/"Hangul Syllable BWAH"/* BD2B */, /*21678*/"Hangul Syllable BWAE"/* BD2C */,/*21679*/"Hangul Syllable BWAEG"/* BD2D */, /*21680*/"Hangul Syllable BWAEGG"/* BD2E */,/*21681*/"Hangul Syllable BWAEGS"/* BD2F */, /*21682*/"Hangul Syllable BWAEN"/* BD30 */,/*21683*/"Hangul Syllable BWAENJ"/* BD31 */, /*21684*/"Hangul Syllable BWAENH"/* BD32 */,/*21685*/"Hangul Syllable BWAED"/* BD33 */, /*21686*/"Hangul Syllable BWAEL"/* BD34 */,/*21687*/"Hangul Syllable BWAELG"/* BD35 */, /*21688*/"Hangul Syllable BWAELM"/* BD36 */,/*21689*/"Hangul Syllable BWAELB"/* BD37 */, /*21690*/"Hangul Syllable BWAELS"/* BD38 */,/*21691*/"Hangul Syllable BWAELT"/* BD39 */, /*21692*/"Hangul Syllable BWAELP"/* BD3A */,/*21693*/"Hangul Syllable BWAELH"/* BD3B */, /*21694*/"Hangul Syllable BWAEM"/* BD3C */,/*21695*/"Hangul Syllable BWAEB"/* BD3D */, /*21696*/"Hangul Syllable BWAEBS"/* BD3E */,/*21697*/"Hangul Syllable BWAES"/* BD3F */, /*21698*/"Hangul Syllable BWAESS"/* BD40 */,/*21699*/"Hangul Syllable BWAENG"/* BD41 */, /*21700*/"Hangul Syllable BWAEJ"/* BD42 */,/*21701*/"Hangul Syllable BWAEC"/* BD43 */, /*21702*/"Hangul Syllable BWAEK"/* BD44 */,/*21703*/"Hangul Syllable BWAET"/* BD45 */, /*21704*/"Hangul Syllable BWAEP"/* BD46 */,/*21705*/"Hangul Syllable BWAEH"/* BD47 */, /*21706*/"Hangul Syllable BOE"/* BD48 */,/*21707*/"Hangul Syllable BOEG"/* BD49 */, /*21708*/"Hangul Syllable BOEGG"/* BD4A */,/*21709*/"Hangul Syllable BOEGS"/* BD4B */, /*21710*/"Hangul Syllable BOEN"/* BD4C */,/*21711*/"Hangul Syllable BOENJ"/* BD4D */, /*21712*/"Hangul Syllable BOENH"/* BD4E */,/*21713*/"Hangul Syllable BOED"/* BD4F */, /*21714*/"Hangul Syllable BOEL"/* BD50 */,/*21715*/"Hangul Syllable BOELG"/* BD51 */, /*21716*/"Hangul Syllable BOELM"/* BD52 */,/*21717*/"Hangul Syllable BOELB"/* BD53 */, /*21718*/"Hangul Syllable BOELS"/* BD54 */,/*21719*/"Hangul Syllable BOELT"/* BD55 */, /*21720*/"Hangul Syllable BOELP"/* BD56 */,/*21721*/"Hangul Syllable BOELH"/* BD57 */, /*21722*/"Hangul Syllable BOEM"/* BD58 */,/*21723*/"Hangul Syllable BOEB"/* BD59 */, /*21724*/"Hangul Syllable BOEBS"/* BD5A */,/*21725*/"Hangul Syllable BOES"/* BD5B */, /*21726*/"Hangul Syllable BOESS"/* BD5C */,/*21727*/"Hangul Syllable BOENG"/* BD5D */, /*21728*/"Hangul Syllable BOEJ"/* BD5E */,/*21729*/"Hangul Syllable BOEC"/* BD5F */, /*21730*/"Hangul Syllable BOEK"/* BD60 */,/*21731*/"Hangul Syllable BOET"/* BD61 */, /*21732*/"Hangul Syllable BOEP"/* BD62 */,/*21733*/"Hangul Syllable BOEH"/* BD63 */, /*21734*/"Hangul Syllable BYO"/* BD64 */,/*21735*/"Hangul Syllable BYOG"/* BD65 */, /*21736*/"Hangul Syllable BYOGG"/* BD66 */,/*21737*/"Hangul Syllable BYOGS"/* BD67 */, /*21738*/"Hangul Syllable BYON"/* BD68 */,/*21739*/"Hangul Syllable BYONJ"/* BD69 */, /*21740*/"Hangul Syllable BYONH"/* BD6A */,/*21741*/"Hangul Syllable BYOD"/* BD6B */, /*21742*/"Hangul Syllable BYOL"/* BD6C */,/*21743*/"Hangul Syllable BYOLG"/* BD6D */, /*21744*/"Hangul Syllable BYOLM"/* BD6E */,/*21745*/"Hangul Syllable BYOLB"/* BD6F */, /*21746*/"Hangul Syllable BYOLS"/* BD70 */,/*21747*/"Hangul Syllable BYOLT"/* BD71 */, /*21748*/"Hangul Syllable BYOLP"/* BD72 */,/*21749*/"Hangul Syllable BYOLH"/* BD73 */, /*21750*/"Hangul Syllable BYOM"/* BD74 */,/*21751*/"Hangul Syllable BYOB"/* BD75 */, /*21752*/"Hangul Syllable BYOBS"/* BD76 */,/*21753*/"Hangul Syllable BYOS"/* BD77 */, /*21754*/"Hangul Syllable BYOSS"/* BD78 */,/*21755*/"Hangul Syllable BYONG"/* BD79 */, /*21756*/"Hangul Syllable BYOJ"/* BD7A */,/*21757*/"Hangul Syllable BYOC"/* BD7B */, /*21758*/"Hangul Syllable BYOK"/* BD7C */,/*21759*/"Hangul Syllable BYOT"/* BD7D */, /*21760*/"Hangul Syllable BYOP"/* BD7E */,/*21761*/"Hangul Syllable BYOH"/* BD7F */, /*21762*/"Hangul Syllable BU"/* BD80 */,/*21763*/"Hangul Syllable BUG"/* BD81 */, /*21764*/"Hangul Syllable BUGG"/* BD82 */,/*21765*/"Hangul Syllable BUGS"/* BD83 */, /*21766*/"Hangul Syllable BUN"/* BD84 */,/*21767*/"Hangul Syllable BUNJ"/* BD85 */, /*21768*/"Hangul Syllable BUNH"/* BD86 */,/*21769*/"Hangul Syllable BUD"/* BD87 */, /*21770*/"Hangul Syllable BUL"/* BD88 */,/*21771*/"Hangul Syllable BULG"/* BD89 */, /*21772*/"Hangul Syllable BULM"/* BD8A */,/*21773*/"Hangul Syllable BULB"/* BD8B */, /*21774*/"Hangul Syllable BULS"/* BD8C */,/*21775*/"Hangul Syllable BULT"/* BD8D */, /*21776*/"Hangul Syllable BULP"/* BD8E */,/*21777*/"Hangul Syllable BULH"/* BD8F */, /*21778*/"Hangul Syllable BUM"/* BD90 */,/*21779*/"Hangul Syllable BUB"/* BD91 */, /*21780*/"Hangul Syllable BUBS"/* BD92 */,/*21781*/"Hangul Syllable BUS"/* BD93 */, /*21782*/"Hangul Syllable BUSS"/* BD94 */,/*21783*/"Hangul Syllable BUNG"/* BD95 */, /*21784*/"Hangul Syllable BUJ"/* BD96 */,/*21785*/"Hangul Syllable BUC"/* BD97 */, /*21786*/"Hangul Syllable BUK"/* BD98 */,/*21787*/"Hangul Syllable BUT"/* BD99 */, /*21788*/"Hangul Syllable BUP"/* BD9A */,/*21789*/"Hangul Syllable BUH"/* BD9B */, /*21790*/"Hangul Syllable BWEO"/* BD9C */,/*21791*/"Hangul Syllable BWEOG"/* BD9D */, /*21792*/"Hangul Syllable BWEOGG"/* BD9E */,/*21793*/"Hangul Syllable BWEOGS"/* BD9F */, /*21794*/"Hangul Syllable BWEON"/* BDA0 */,/*21795*/"Hangul Syllable BWEONJ"/* BDA1 */, /*21796*/"Hangul Syllable BWEONH"/* BDA2 */,/*21797*/"Hangul Syllable BWEOD"/* BDA3 */, /*21798*/"Hangul Syllable BWEOL"/* BDA4 */,/*21799*/"Hangul Syllable BWEOLG"/* BDA5 */, /*21800*/"Hangul Syllable BWEOLM"/* BDA6 */,/*21801*/"Hangul Syllable BWEOLB"/* BDA7 */, /*21802*/"Hangul Syllable BWEOLS"/* BDA8 */,/*21803*/"Hangul Syllable BWEOLT"/* BDA9 */, /*21804*/"Hangul Syllable BWEOLP"/* BDAA */,/*21805*/"Hangul Syllable BWEOLH"/* BDAB */, /*21806*/"Hangul Syllable BWEOM"/* BDAC */,/*21807*/"Hangul Syllable BWEOB"/* BDAD */, /*21808*/"Hangul Syllable BWEOBS"/* BDAE */,/*21809*/"Hangul Syllable BWEOS"/* BDAF */, /*21810*/"Hangul Syllable BWEOSS"/* BDB0 */,/*21811*/"Hangul Syllable BWEONG"/* BDB1 */, /*21812*/"Hangul Syllable BWEOJ"/* BDB2 */,/*21813*/"Hangul Syllable BWEOC"/* BDB3 */, /*21814*/"Hangul Syllable BWEOK"/* BDB4 */,/*21815*/"Hangul Syllable BWEOT"/* BDB5 */, /*21816*/"Hangul Syllable BWEOP"/* BDB6 */,/*21817*/"Hangul Syllable BWEOH"/* BDB7 */, /*21818*/"Hangul Syllable BWE"/* BDB8 */,/*21819*/"Hangul Syllable BWEG"/* BDB9 */, /*21820*/"Hangul Syllable BWEGG"/* BDBA */,/*21821*/"Hangul Syllable BWEGS"/* BDBB */, /*21822*/"Hangul Syllable BWEN"/* BDBC */,/*21823*/"Hangul Syllable BWENJ"/* BDBD */, /*21824*/"Hangul Syllable BWENH"/* BDBE */,/*21825*/"Hangul Syllable BWED"/* BDBF */, /*21826*/"Hangul Syllable BWEL"/* BDC0 */,/*21827*/"Hangul Syllable BWELG"/* BDC1 */, /*21828*/"Hangul Syllable BWELM"/* BDC2 */,/*21829*/"Hangul Syllable BWELB"/* BDC3 */, /*21830*/"Hangul Syllable BWELS"/* BDC4 */,/*21831*/"Hangul Syllable BWELT"/* BDC5 */, /*21832*/"Hangul Syllable BWELP"/* BDC6 */,/*21833*/"Hangul Syllable BWELH"/* BDC7 */, /*21834*/"Hangul Syllable BWEM"/* BDC8 */,/*21835*/"Hangul Syllable BWEB"/* BDC9 */, /*21836*/"Hangul Syllable BWEBS"/* BDCA */,/*21837*/"Hangul Syllable BWES"/* BDCB */, /*21838*/"Hangul Syllable BWESS"/* BDCC */,/*21839*/"Hangul Syllable BWENG"/* BDCD */, /*21840*/"Hangul Syllable BWEJ"/* BDCE */,/*21841*/"Hangul Syllable BWEC"/* BDCF */, /*21842*/"Hangul Syllable BWEK"/* BDD0 */,/*21843*/"Hangul Syllable BWET"/* BDD1 */, /*21844*/"Hangul Syllable BWEP"/* BDD2 */,/*21845*/"Hangul Syllable BWEH"/* BDD3 */, /*21846*/"Hangul Syllable BWI"/* BDD4 */,/*21847*/"Hangul Syllable BWIG"/* BDD5 */, /*21848*/"Hangul Syllable BWIGG"/* BDD6 */,/*21849*/"Hangul Syllable BWIGS"/* BDD7 */, /*21850*/"Hangul Syllable BWIN"/* BDD8 */,/*21851*/"Hangul Syllable BWINJ"/* BDD9 */, /*21852*/"Hangul Syllable BWINH"/* BDDA */,/*21853*/"Hangul Syllable BWID"/* BDDB */, /*21854*/"Hangul Syllable BWIL"/* BDDC */,/*21855*/"Hangul Syllable BWILG"/* BDDD */, /*21856*/"Hangul Syllable BWILM"/* BDDE */,/*21857*/"Hangul Syllable BWILB"/* BDDF */, /*21858*/"Hangul Syllable BWILS"/* BDE0 */,/*21859*/"Hangul Syllable BWILT"/* BDE1 */, /*21860*/"Hangul Syllable BWILP"/* BDE2 */,/*21861*/"Hangul Syllable BWILH"/* BDE3 */, /*21862*/"Hangul Syllable BWIM"/* BDE4 */,/*21863*/"Hangul Syllable BWIB"/* BDE5 */, /*21864*/"Hangul Syllable BWIBS"/* BDE6 */,/*21865*/"Hangul Syllable BWIS"/* BDE7 */, /*21866*/"Hangul Syllable BWISS"/* BDE8 */,/*21867*/"Hangul Syllable BWING"/* BDE9 */, /*21868*/"Hangul Syllable BWIJ"/* BDEA */,/*21869*/"Hangul Syllable BWIC"/* BDEB */, /*21870*/"Hangul Syllable BWIK"/* BDEC */,/*21871*/"Hangul Syllable BWIT"/* BDED */, /*21872*/"Hangul Syllable BWIP"/* BDEE */,/*21873*/"Hangul Syllable BWIH"/* BDEF */, /*21874*/"Hangul Syllable BYU"/* BDF0 */,/*21875*/"Hangul Syllable BYUG"/* BDF1 */, /*21876*/"Hangul Syllable BYUGG"/* BDF2 */,/*21877*/"Hangul Syllable BYUGS"/* BDF3 */, /*21878*/"Hangul Syllable BYUN"/* BDF4 */,/*21879*/"Hangul Syllable BYUNJ"/* BDF5 */, /*21880*/"Hangul Syllable BYUNH"/* BDF6 */,/*21881*/"Hangul Syllable BYUD"/* BDF7 */, /*21882*/"Hangul Syllable BYUL"/* BDF8 */,/*21883*/"Hangul Syllable BYULG"/* BDF9 */, /*21884*/"Hangul Syllable BYULM"/* BDFA */,/*21885*/"Hangul Syllable BYULB"/* BDFB */, /*21886*/"Hangul Syllable BYULS"/* BDFC */,/*21887*/"Hangul Syllable BYULT"/* BDFD */, /*21888*/"Hangul Syllable BYULP"/* BDFE */,/*21889*/"Hangul Syllable BYULH"/* BDFF */, /*21890*/"Hangul Syllable BYUM"/* BE00 */,/*21891*/"Hangul Syllable BYUB"/* BE01 */, /*21892*/"Hangul Syllable BYUBS"/* BE02 */,/*21893*/"Hangul Syllable BYUS"/* BE03 */, /*21894*/"Hangul Syllable BYUSS"/* BE04 */,/*21895*/"Hangul Syllable BYUNG"/* BE05 */, /*21896*/"Hangul Syllable BYUJ"/* BE06 */,/*21897*/"Hangul Syllable BYUC"/* BE07 */, /*21898*/"Hangul Syllable BYUK"/* BE08 */,/*21899*/"Hangul Syllable BYUT"/* BE09 */, /*21900*/"Hangul Syllable BYUP"/* BE0A */,/*21901*/"Hangul Syllable BYUH"/* BE0B */, /*21902*/"Hangul Syllable BEU"/* BE0C */,/*21903*/"Hangul Syllable BEUG"/* BE0D */, /*21904*/"Hangul Syllable BEUGG"/* BE0E */,/*21905*/"Hangul Syllable BEUGS"/* BE0F */, /*21906*/"Hangul Syllable BEUN"/* BE10 */,/*21907*/"Hangul Syllable BEUNJ"/* BE11 */, /*21908*/"Hangul Syllable BEUNH"/* BE12 */,/*21909*/"Hangul Syllable BEUD"/* BE13 */, /*21910*/"Hangul Syllable BEUL"/* BE14 */,/*21911*/"Hangul Syllable BEULG"/* BE15 */, /*21912*/"Hangul Syllable BEULM"/* BE16 */,/*21913*/"Hangul Syllable BEULB"/* BE17 */, /*21914*/"Hangul Syllable BEULS"/* BE18 */,/*21915*/"Hangul Syllable BEULT"/* BE19 */, /*21916*/"Hangul Syllable BEULP"/* BE1A */,/*21917*/"Hangul Syllable BEULH"/* BE1B */, /*21918*/"Hangul Syllable BEUM"/* BE1C */,/*21919*/"Hangul Syllable BEUB"/* BE1D */, /*21920*/"Hangul Syllable BEUBS"/* BE1E */,/*21921*/"Hangul Syllable BEUS"/* BE1F */, /*21922*/"Hangul Syllable BEUSS"/* BE20 */,/*21923*/"Hangul Syllable BEUNG"/* BE21 */, /*21924*/"Hangul Syllable BEUJ"/* BE22 */,/*21925*/"Hangul Syllable BEUC"/* BE23 */, /*21926*/"Hangul Syllable BEUK"/* BE24 */,/*21927*/"Hangul Syllable BEUT"/* BE25 */, /*21928*/"Hangul Syllable BEUP"/* BE26 */,/*21929*/"Hangul Syllable BEUH"/* BE27 */, /*21930*/"Hangul Syllable BYI"/* BE28 */,/*21931*/"Hangul Syllable BYIG"/* BE29 */, /*21932*/"Hangul Syllable BYIGG"/* BE2A */,/*21933*/"Hangul Syllable BYIGS"/* BE2B */, /*21934*/"Hangul Syllable BYIN"/* BE2C */,/*21935*/"Hangul Syllable BYINJ"/* BE2D */, /*21936*/"Hangul Syllable BYINH"/* BE2E */,/*21937*/"Hangul Syllable BYID"/* BE2F */, /*21938*/"Hangul Syllable BYIL"/* BE30 */,/*21939*/"Hangul Syllable BYILG"/* BE31 */, /*21940*/"Hangul Syllable BYILM"/* BE32 */,/*21941*/"Hangul Syllable BYILB"/* BE33 */, /*21942*/"Hangul Syllable BYILS"/* BE34 */,/*21943*/"Hangul Syllable BYILT"/* BE35 */, /*21944*/"Hangul Syllable BYILP"/* BE36 */,/*21945*/"Hangul Syllable BYILH"/* BE37 */, /*21946*/"Hangul Syllable BYIM"/* BE38 */,/*21947*/"Hangul Syllable BYIB"/* BE39 */, /*21948*/"Hangul Syllable BYIBS"/* BE3A */,/*21949*/"Hangul Syllable BYIS"/* BE3B */, /*21950*/"Hangul Syllable BYISS"/* BE3C */,/*21951*/"Hangul Syllable BYING"/* BE3D */, /*21952*/"Hangul Syllable BYIJ"/* BE3E */,/*21953*/"Hangul Syllable BYIC"/* BE3F */, /*21954*/"Hangul Syllable BYIK"/* BE40 */,/*21955*/"Hangul Syllable BYIT"/* BE41 */, /*21956*/"Hangul Syllable BYIP"/* BE42 */,/*21957*/"Hangul Syllable BYIH"/* BE43 */, /*21958*/"Hangul Syllable BI"/* BE44 */,/*21959*/"Hangul Syllable BIG"/* BE45 */, /*21960*/"Hangul Syllable BIGG"/* BE46 */,/*21961*/"Hangul Syllable BIGS"/* BE47 */, /*21962*/"Hangul Syllable BIN"/* BE48 */,/*21963*/"Hangul Syllable BINJ"/* BE49 */, /*21964*/"Hangul Syllable BINH"/* BE4A */,/*21965*/"Hangul Syllable BID"/* BE4B */, /*21966*/"Hangul Syllable BIL"/* BE4C */,/*21967*/"Hangul Syllable BILG"/* BE4D */, /*21968*/"Hangul Syllable BILM"/* BE4E */,/*21969*/"Hangul Syllable BILB"/* BE4F */, /*21970*/"Hangul Syllable BILS"/* BE50 */,/*21971*/"Hangul Syllable BILT"/* BE51 */, /*21972*/"Hangul Syllable BILP"/* BE52 */,/*21973*/"Hangul Syllable BILH"/* BE53 */, /*21974*/"Hangul Syllable BIM"/* BE54 */,/*21975*/"Hangul Syllable BIB"/* BE55 */, /*21976*/"Hangul Syllable BIBS"/* BE56 */,/*21977*/"Hangul Syllable BIS"/* BE57 */, /*21978*/"Hangul Syllable BISS"/* BE58 */,/*21979*/"Hangul Syllable BING"/* BE59 */, /*21980*/"Hangul Syllable BIJ"/* BE5A */,/*21981*/"Hangul Syllable BIC"/* BE5B */, /*21982*/"Hangul Syllable BIK"/* BE5C */,/*21983*/"Hangul Syllable BIT"/* BE5D */, /*21984*/"Hangul Syllable BIP"/* BE5E */,/*21985*/"Hangul Syllable BIH"/* BE5F */, /*21986*/"Hangul Syllable BBA"/* BE60 */,/*21987*/"Hangul Syllable BBAG"/* BE61 */, /*21988*/"Hangul Syllable BBAGG"/* BE62 */,/*21989*/"Hangul Syllable BBAGS"/* BE63 */, /*21990*/"Hangul Syllable BBAN"/* BE64 */,/*21991*/"Hangul Syllable BBANJ"/* BE65 */, /*21992*/"Hangul Syllable BBANH"/* BE66 */,/*21993*/"Hangul Syllable BBAD"/* BE67 */, /*21994*/"Hangul Syllable BBAL"/* BE68 */,/*21995*/"Hangul Syllable BBALG"/* BE69 */, /*21996*/"Hangul Syllable BBALM"/* BE6A */,/*21997*/"Hangul Syllable BBALB"/* BE6B */, /*21998*/"Hangul Syllable BBALS"/* BE6C */,/*21999*/"Hangul Syllable BBALT"/* BE6D */, /*22000*/"Hangul Syllable BBALP"/* BE6E */,/*22001*/"Hangul Syllable BBALH"/* BE6F */, /*22002*/"Hangul Syllable BBAM"/* BE70 */,/*22003*/"Hangul Syllable BBAB"/* BE71 */, /*22004*/"Hangul Syllable BBABS"/* BE72 */,/*22005*/"Hangul Syllable BBAS"/* BE73 */, /*22006*/"Hangul Syllable BBASS"/* BE74 */,/*22007*/"Hangul Syllable BBANG"/* BE75 */, /*22008*/"Hangul Syllable BBAJ"/* BE76 */,/*22009*/"Hangul Syllable BBAC"/* BE77 */, /*22010*/"Hangul Syllable BBAK"/* BE78 */,/*22011*/"Hangul Syllable BBAT"/* BE79 */, /*22012*/"Hangul Syllable BBAP"/* BE7A */,/*22013*/"Hangul Syllable BBAH"/* BE7B */, /*22014*/"Hangul Syllable BBAE"/* BE7C */,/*22015*/"Hangul Syllable BBAEG"/* BE7D */, /*22016*/"Hangul Syllable BBAEGG"/* BE7E */,/*22017*/"Hangul Syllable BBAEGS"/* BE7F */, /*22018*/"Hangul Syllable BBAEN"/* BE80 */,/*22019*/"Hangul Syllable BBAENJ"/* BE81 */, /*22020*/"Hangul Syllable BBAENH"/* BE82 */,/*22021*/"Hangul Syllable BBAED"/* BE83 */, /*22022*/"Hangul Syllable BBAEL"/* BE84 */,/*22023*/"Hangul Syllable BBAELG"/* BE85 */, /*22024*/"Hangul Syllable BBAELM"/* BE86 */,/*22025*/"Hangul Syllable BBAELB"/* BE87 */, /*22026*/"Hangul Syllable BBAELS"/* BE88 */,/*22027*/"Hangul Syllable BBAELT"/* BE89 */, /*22028*/"Hangul Syllable BBAELP"/* BE8A */,/*22029*/"Hangul Syllable BBAELH"/* BE8B */, /*22030*/"Hangul Syllable BBAEM"/* BE8C */,/*22031*/"Hangul Syllable BBAEB"/* BE8D */, /*22032*/"Hangul Syllable BBAEBS"/* BE8E */,/*22033*/"Hangul Syllable BBAES"/* BE8F */, /*22034*/"Hangul Syllable BBAESS"/* BE90 */,/*22035*/"Hangul Syllable BBAENG"/* BE91 */, /*22036*/"Hangul Syllable BBAEJ"/* BE92 */,/*22037*/"Hangul Syllable BBAEC"/* BE93 */, /*22038*/"Hangul Syllable BBAEK"/* BE94 */,/*22039*/"Hangul Syllable BBAET"/* BE95 */, /*22040*/"Hangul Syllable BBAEP"/* BE96 */,/*22041*/"Hangul Syllable BBAEH"/* BE97 */, /*22042*/"Hangul Syllable BBYA"/* BE98 */,/*22043*/"Hangul Syllable BBYAG"/* BE99 */, /*22044*/"Hangul Syllable BBYAGG"/* BE9A */,/*22045*/"Hangul Syllable BBYAGS"/* BE9B */, /*22046*/"Hangul Syllable BBYAN"/* BE9C */,/*22047*/"Hangul Syllable BBYANJ"/* BE9D */, /*22048*/"Hangul Syllable BBYANH"/* BE9E */,/*22049*/"Hangul Syllable BBYAD"/* BE9F */, /*22050*/"Hangul Syllable BBYAL"/* BEA0 */,/*22051*/"Hangul Syllable BBYALG"/* BEA1 */, /*22052*/"Hangul Syllable BBYALM"/* BEA2 */,/*22053*/"Hangul Syllable BBYALB"/* BEA3 */, /*22054*/"Hangul Syllable BBYALS"/* BEA4 */,/*22055*/"Hangul Syllable BBYALT"/* BEA5 */, /*22056*/"Hangul Syllable BBYALP"/* BEA6 */,/*22057*/"Hangul Syllable BBYALH"/* BEA7 */, /*22058*/"Hangul Syllable BBYAM"/* BEA8 */,/*22059*/"Hangul Syllable BBYAB"/* BEA9 */, /*22060*/"Hangul Syllable BBYABS"/* BEAA */,/*22061*/"Hangul Syllable BBYAS"/* BEAB */, /*22062*/"Hangul Syllable BBYASS"/* BEAC */,/*22063*/"Hangul Syllable BBYANG"/* BEAD */, /*22064*/"Hangul Syllable BBYAJ"/* BEAE */,/*22065*/"Hangul Syllable BBYAC"/* BEAF */, /*22066*/"Hangul Syllable BBYAK"/* BEB0 */,/*22067*/"Hangul Syllable BBYAT"/* BEB1 */, /*22068*/"Hangul Syllable BBYAP"/* BEB2 */,/*22069*/"Hangul Syllable BBYAH"/* BEB3 */, /*22070*/"Hangul Syllable BBYAE"/* BEB4 */,/*22071*/"Hangul Syllable BBYAEG"/* BEB5 */, /*22072*/"Hangul Syllable BBYAEGG"/* BEB6 */,/*22073*/"Hangul Syllable BBYAEGS"/* BEB7 */, /*22074*/"Hangul Syllable BBYAEN"/* BEB8 */,/*22075*/"Hangul Syllable BBYAENJ"/* BEB9 */, /*22076*/"Hangul Syllable BBYAENH"/* BEBA */,/*22077*/"Hangul Syllable BBYAED"/* BEBB */, /*22078*/"Hangul Syllable BBYAEL"/* BEBC */,/*22079*/"Hangul Syllable BBYAELG"/* BEBD */, /*22080*/"Hangul Syllable BBYAELM"/* BEBE */,/*22081*/"Hangul Syllable BBYAELB"/* BEBF */, /*22082*/"Hangul Syllable BBYAELS"/* BEC0 */,/*22083*/"Hangul Syllable BBYAELT"/* BEC1 */, /*22084*/"Hangul Syllable BBYAELP"/* BEC2 */,/*22085*/"Hangul Syllable BBYAELH"/* BEC3 */, /*22086*/"Hangul Syllable BBYAEM"/* BEC4 */,/*22087*/"Hangul Syllable BBYAEB"/* BEC5 */, /*22088*/"Hangul Syllable BBYAEBS"/* BEC6 */,/*22089*/"Hangul Syllable BBYAES"/* BEC7 */, /*22090*/"Hangul Syllable BBYAESS"/* BEC8 */,/*22091*/"Hangul Syllable BBYAENG"/* BEC9 */, /*22092*/"Hangul Syllable BBYAEJ"/* BECA */,/*22093*/"Hangul Syllable BBYAEC"/* BECB */, /*22094*/"Hangul Syllable BBYAEK"/* BECC */,/*22095*/"Hangul Syllable BBYAET"/* BECD */, /*22096*/"Hangul Syllable BBYAEP"/* BECE */,/*22097*/"Hangul Syllable BBYAEH"/* BECF */, /*22098*/"Hangul Syllable BBEO"/* BED0 */,/*22099*/"Hangul Syllable BBEOG"/* BED1 */, /*22100*/"Hangul Syllable BBEOGG"/* BED2 */,/*22101*/"Hangul Syllable BBEOGS"/* BED3 */, /*22102*/"Hangul Syllable BBEON"/* BED4 */,/*22103*/"Hangul Syllable BBEONJ"/* BED5 */, /*22104*/"Hangul Syllable BBEONH"/* BED6 */,/*22105*/"Hangul Syllable BBEOD"/* BED7 */, /*22106*/"Hangul Syllable BBEOL"/* BED8 */,/*22107*/"Hangul Syllable BBEOLG"/* BED9 */, /*22108*/"Hangul Syllable BBEOLM"/* BEDA */,/*22109*/"Hangul Syllable BBEOLB"/* BEDB */, /*22110*/"Hangul Syllable BBEOLS"/* BEDC */,/*22111*/"Hangul Syllable BBEOLT"/* BEDD */, /*22112*/"Hangul Syllable BBEOLP"/* BEDE */,/*22113*/"Hangul Syllable BBEOLH"/* BEDF */, /*22114*/"Hangul Syllable BBEOM"/* BEE0 */,/*22115*/"Hangul Syllable BBEOB"/* BEE1 */, /*22116*/"Hangul Syllable BBEOBS"/* BEE2 */,/*22117*/"Hangul Syllable BBEOS"/* BEE3 */, /*22118*/"Hangul Syllable BBEOSS"/* BEE4 */,/*22119*/"Hangul Syllable BBEONG"/* BEE5 */, /*22120*/"Hangul Syllable BBEOJ"/* BEE6 */,/*22121*/"Hangul Syllable BBEOC"/* BEE7 */, /*22122*/"Hangul Syllable BBEOK"/* BEE8 */,/*22123*/"Hangul Syllable BBEOT"/* BEE9 */, /*22124*/"Hangul Syllable BBEOP"/* BEEA */,/*22125*/"Hangul Syllable BBEOH"/* BEEB */, /*22126*/"Hangul Syllable BBE"/* BEEC */,/*22127*/"Hangul Syllable BBEG"/* BEED */, /*22128*/"Hangul Syllable BBEGG"/* BEEE */,/*22129*/"Hangul Syllable BBEGS"/* BEEF */, /*22130*/"Hangul Syllable BBEN"/* BEF0 */,/*22131*/"Hangul Syllable BBENJ"/* BEF1 */, /*22132*/"Hangul Syllable BBENH"/* BEF2 */,/*22133*/"Hangul Syllable BBED"/* BEF3 */, /*22134*/"Hangul Syllable BBEL"/* BEF4 */,/*22135*/"Hangul Syllable BBELG"/* BEF5 */, /*22136*/"Hangul Syllable BBELM"/* BEF6 */,/*22137*/"Hangul Syllable BBELB"/* BEF7 */, /*22138*/"Hangul Syllable BBELS"/* BEF8 */,/*22139*/"Hangul Syllable BBELT"/* BEF9 */, /*22140*/"Hangul Syllable BBELP"/* BEFA */,/*22141*/"Hangul Syllable BBELH"/* BEFB */, /*22142*/"Hangul Syllable BBEM"/* BEFC */,/*22143*/"Hangul Syllable BBEB"/* BEFD */, /*22144*/"Hangul Syllable BBEBS"/* BEFE */,/*22145*/"Hangul Syllable BBES"/* BEFF */, /*22146*/"Hangul Syllable BBESS"/* BF00 */,/*22147*/"Hangul Syllable BBENG"/* BF01 */, /*22148*/"Hangul Syllable BBEJ"/* BF02 */,/*22149*/"Hangul Syllable BBEC"/* BF03 */, /*22150*/"Hangul Syllable BBEK"/* BF04 */,/*22151*/"Hangul Syllable BBET"/* BF05 */, /*22152*/"Hangul Syllable BBEP"/* BF06 */,/*22153*/"Hangul Syllable BBEH"/* BF07 */, /*22154*/"Hangul Syllable BBYEO"/* BF08 */,/*22155*/"Hangul Syllable BBYEOG"/* BF09 */, /*22156*/"Hangul Syllable BBYEOGG"/* BF0A */,/*22157*/"Hangul Syllable BBYEOGS"/* BF0B */, /*22158*/"Hangul Syllable BBYEON"/* BF0C */,/*22159*/"Hangul Syllable BBYEONJ"/* BF0D */, /*22160*/"Hangul Syllable BBYEONH"/* BF0E */,/*22161*/"Hangul Syllable BBYEOD"/* BF0F */, /*22162*/"Hangul Syllable BBYEOL"/* BF10 */,/*22163*/"Hangul Syllable BBYEOLG"/* BF11 */, /*22164*/"Hangul Syllable BBYEOLM"/* BF12 */,/*22165*/"Hangul Syllable BBYEOLB"/* BF13 */, /*22166*/"Hangul Syllable BBYEOLS"/* BF14 */,/*22167*/"Hangul Syllable BBYEOLT"/* BF15 */, /*22168*/"Hangul Syllable BBYEOLP"/* BF16 */,/*22169*/"Hangul Syllable BBYEOLH"/* BF17 */, /*22170*/"Hangul Syllable BBYEOM"/* BF18 */,/*22171*/"Hangul Syllable BBYEOB"/* BF19 */, /*22172*/"Hangul Syllable BBYEOBS"/* BF1A */,/*22173*/"Hangul Syllable BBYEOS"/* BF1B */, /*22174*/"Hangul Syllable BBYEOSS"/* BF1C */,/*22175*/"Hangul Syllable BBYEONG"/* BF1D */, /*22176*/"Hangul Syllable BBYEOJ"/* BF1E */,/*22177*/"Hangul Syllable BBYEOC"/* BF1F */, /*22178*/"Hangul Syllable BBYEOK"/* BF20 */,/*22179*/"Hangul Syllable BBYEOT"/* BF21 */, /*22180*/"Hangul Syllable BBYEOP"/* BF22 */,/*22181*/"Hangul Syllable BBYEOH"/* BF23 */, /*22182*/"Hangul Syllable BBYE"/* BF24 */,/*22183*/"Hangul Syllable BBYEG"/* BF25 */, /*22184*/"Hangul Syllable BBYEGG"/* BF26 */,/*22185*/"Hangul Syllable BBYEGS"/* BF27 */, /*22186*/"Hangul Syllable BBYEN"/* BF28 */,/*22187*/"Hangul Syllable BBYENJ"/* BF29 */, /*22188*/"Hangul Syllable BBYENH"/* BF2A */,/*22189*/"Hangul Syllable BBYED"/* BF2B */, /*22190*/"Hangul Syllable BBYEL"/* BF2C */,/*22191*/"Hangul Syllable BBYELG"/* BF2D */, /*22192*/"Hangul Syllable BBYELM"/* BF2E */,/*22193*/"Hangul Syllable BBYELB"/* BF2F */, /*22194*/"Hangul Syllable BBYELS"/* BF30 */,/*22195*/"Hangul Syllable BBYELT"/* BF31 */, /*22196*/"Hangul Syllable BBYELP"/* BF32 */,/*22197*/"Hangul Syllable BBYELH"/* BF33 */, /*22198*/"Hangul Syllable BBYEM"/* BF34 */,/*22199*/"Hangul Syllable BBYEB"/* BF35 */, /*22200*/"Hangul Syllable BBYEBS"/* BF36 */,/*22201*/"Hangul Syllable BBYES"/* BF37 */, /*22202*/"Hangul Syllable BBYESS"/* BF38 */,/*22203*/"Hangul Syllable BBYENG"/* BF39 */, /*22204*/"Hangul Syllable BBYEJ"/* BF3A */,/*22205*/"Hangul Syllable BBYEC"/* BF3B */, /*22206*/"Hangul Syllable BBYEK"/* BF3C */,/*22207*/"Hangul Syllable BBYET"/* BF3D */, /*22208*/"Hangul Syllable BBYEP"/* BF3E */,/*22209*/"Hangul Syllable BBYEH"/* BF3F */, /*22210*/"Hangul Syllable BBO"/* BF40 */,/*22211*/"Hangul Syllable BBOG"/* BF41 */, /*22212*/"Hangul Syllable BBOGG"/* BF42 */,/*22213*/"Hangul Syllable BBOGS"/* BF43 */, /*22214*/"Hangul Syllable BBON"/* BF44 */,/*22215*/"Hangul Syllable BBONJ"/* BF45 */, /*22216*/"Hangul Syllable BBONH"/* BF46 */,/*22217*/"Hangul Syllable BBOD"/* BF47 */, /*22218*/"Hangul Syllable BBOL"/* BF48 */,/*22219*/"Hangul Syllable BBOLG"/* BF49 */, /*22220*/"Hangul Syllable BBOLM"/* BF4A */,/*22221*/"Hangul Syllable BBOLB"/* BF4B */, /*22222*/"Hangul Syllable BBOLS"/* BF4C */,/*22223*/"Hangul Syllable BBOLT"/* BF4D */, /*22224*/"Hangul Syllable BBOLP"/* BF4E */,/*22225*/"Hangul Syllable BBOLH"/* BF4F */, /*22226*/"Hangul Syllable BBOM"/* BF50 */,/*22227*/"Hangul Syllable BBOB"/* BF51 */, /*22228*/"Hangul Syllable BBOBS"/* BF52 */,/*22229*/"Hangul Syllable BBOS"/* BF53 */, /*22230*/"Hangul Syllable BBOSS"/* BF54 */,/*22231*/"Hangul Syllable BBONG"/* BF55 */, /*22232*/"Hangul Syllable BBOJ"/* BF56 */,/*22233*/"Hangul Syllable BBOC"/* BF57 */, /*22234*/"Hangul Syllable BBOK"/* BF58 */,/*22235*/"Hangul Syllable BBOT"/* BF59 */, /*22236*/"Hangul Syllable BBOP"/* BF5A */,/*22237*/"Hangul Syllable BBOH"/* BF5B */, /*22238*/"Hangul Syllable BBWA"/* BF5C */,/*22239*/"Hangul Syllable BBWAG"/* BF5D */, /*22240*/"Hangul Syllable BBWAGG"/* BF5E */,/*22241*/"Hangul Syllable BBWAGS"/* BF5F */, /*22242*/"Hangul Syllable BBWAN"/* BF60 */,/*22243*/"Hangul Syllable BBWANJ"/* BF61 */, /*22244*/"Hangul Syllable BBWANH"/* BF62 */,/*22245*/"Hangul Syllable BBWAD"/* BF63 */, /*22246*/"Hangul Syllable BBWAL"/* BF64 */,/*22247*/"Hangul Syllable BBWALG"/* BF65 */, /*22248*/"Hangul Syllable BBWALM"/* BF66 */,/*22249*/"Hangul Syllable BBWALB"/* BF67 */, /*22250*/"Hangul Syllable BBWALS"/* BF68 */,/*22251*/"Hangul Syllable BBWALT"/* BF69 */, /*22252*/"Hangul Syllable BBWALP"/* BF6A */,/*22253*/"Hangul Syllable BBWALH"/* BF6B */, /*22254*/"Hangul Syllable BBWAM"/* BF6C */,/*22255*/"Hangul Syllable BBWAB"/* BF6D */, /*22256*/"Hangul Syllable BBWABS"/* BF6E */,/*22257*/"Hangul Syllable BBWAS"/* BF6F */, /*22258*/"Hangul Syllable BBWASS"/* BF70 */,/*22259*/"Hangul Syllable BBWANG"/* BF71 */, /*22260*/"Hangul Syllable BBWAJ"/* BF72 */,/*22261*/"Hangul Syllable BBWAC"/* BF73 */, /*22262*/"Hangul Syllable BBWAK"/* BF74 */,/*22263*/"Hangul Syllable BBWAT"/* BF75 */, /*22264*/"Hangul Syllable BBWAP"/* BF76 */,/*22265*/"Hangul Syllable BBWAH"/* BF77 */, /*22266*/"Hangul Syllable BBWAE"/* BF78 */,/*22267*/"Hangul Syllable BBWAEG"/* BF79 */, /*22268*/"Hangul Syllable BBWAEGG"/* BF7A */,/*22269*/"Hangul Syllable BBWAEGS"/* BF7B */, /*22270*/"Hangul Syllable BBWAEN"/* BF7C */,/*22271*/"Hangul Syllable BBWAENJ"/* BF7D */, /*22272*/"Hangul Syllable BBWAENH"/* BF7E */,/*22273*/"Hangul Syllable BBWAED"/* BF7F */, /*22274*/"Hangul Syllable BBWAEL"/* BF80 */,/*22275*/"Hangul Syllable BBWAELG"/* BF81 */, /*22276*/"Hangul Syllable BBWAELM"/* BF82 */,/*22277*/"Hangul Syllable BBWAELB"/* BF83 */, /*22278*/"Hangul Syllable BBWAELS"/* BF84 */,/*22279*/"Hangul Syllable BBWAELT"/* BF85 */, /*22280*/"Hangul Syllable BBWAELP"/* BF86 */,/*22281*/"Hangul Syllable BBWAELH"/* BF87 */, /*22282*/"Hangul Syllable BBWAEM"/* BF88 */,/*22283*/"Hangul Syllable BBWAEB"/* BF89 */, /*22284*/"Hangul Syllable BBWAEBS"/* BF8A */,/*22285*/"Hangul Syllable BBWAES"/* BF8B */, /*22286*/"Hangul Syllable BBWAESS"/* BF8C */,/*22287*/"Hangul Syllable BBWAENG"/* BF8D */, /*22288*/"Hangul Syllable BBWAEJ"/* BF8E */,/*22289*/"Hangul Syllable BBWAEC"/* BF8F */, /*22290*/"Hangul Syllable BBWAEK"/* BF90 */,/*22291*/"Hangul Syllable BBWAET"/* BF91 */, /*22292*/"Hangul Syllable BBWAEP"/* BF92 */,/*22293*/"Hangul Syllable BBWAEH"/* BF93 */, /*22294*/"Hangul Syllable BBOE"/* BF94 */,/*22295*/"Hangul Syllable BBOEG"/* BF95 */, /*22296*/"Hangul Syllable BBOEGG"/* BF96 */,/*22297*/"Hangul Syllable BBOEGS"/* BF97 */, /*22298*/"Hangul Syllable BBOEN"/* BF98 */,/*22299*/"Hangul Syllable BBOENJ"/* BF99 */, /*22300*/"Hangul Syllable BBOENH"/* BF9A */,/*22301*/"Hangul Syllable BBOED"/* BF9B */, /*22302*/"Hangul Syllable BBOEL"/* BF9C */,/*22303*/"Hangul Syllable BBOELG"/* BF9D */, /*22304*/"Hangul Syllable BBOELM"/* BF9E */,/*22305*/"Hangul Syllable BBOELB"/* BF9F */, /*22306*/"Hangul Syllable BBOELS"/* BFA0 */,/*22307*/"Hangul Syllable BBOELT"/* BFA1 */, /*22308*/"Hangul Syllable BBOELP"/* BFA2 */,/*22309*/"Hangul Syllable BBOELH"/* BFA3 */, /*22310*/"Hangul Syllable BBOEM"/* BFA4 */,/*22311*/"Hangul Syllable BBOEB"/* BFA5 */, /*22312*/"Hangul Syllable BBOEBS"/* BFA6 */,/*22313*/"Hangul Syllable BBOES"/* BFA7 */, /*22314*/"Hangul Syllable BBOESS"/* BFA8 */,/*22315*/"Hangul Syllable BBOENG"/* BFA9 */, /*22316*/"Hangul Syllable BBOEJ"/* BFAA */,/*22317*/"Hangul Syllable BBOEC"/* BFAB */, /*22318*/"Hangul Syllable BBOEK"/* BFAC */,/*22319*/"Hangul Syllable BBOET"/* BFAD */, /*22320*/"Hangul Syllable BBOEP"/* BFAE */,/*22321*/"Hangul Syllable BBOEH"/* BFAF */, /*22322*/"Hangul Syllable BBYO"/* BFB0 */,/*22323*/"Hangul Syllable BBYOG"/* BFB1 */, /*22324*/"Hangul Syllable BBYOGG"/* BFB2 */,/*22325*/"Hangul Syllable BBYOGS"/* BFB3 */, /*22326*/"Hangul Syllable BBYON"/* BFB4 */,/*22327*/"Hangul Syllable BBYONJ"/* BFB5 */, /*22328*/"Hangul Syllable BBYONH"/* BFB6 */,/*22329*/"Hangul Syllable BBYOD"/* BFB7 */, /*22330*/"Hangul Syllable BBYOL"/* BFB8 */,/*22331*/"Hangul Syllable BBYOLG"/* BFB9 */, /*22332*/"Hangul Syllable BBYOLM"/* BFBA */,/*22333*/"Hangul Syllable BBYOLB"/* BFBB */, /*22334*/"Hangul Syllable BBYOLS"/* BFBC */,/*22335*/"Hangul Syllable BBYOLT"/* BFBD */, /*22336*/"Hangul Syllable BBYOLP"/* BFBE */,/*22337*/"Hangul Syllable BBYOLH"/* BFBF */, /*22338*/"Hangul Syllable BBYOM"/* BFC0 */,/*22339*/"Hangul Syllable BBYOB"/* BFC1 */, /*22340*/"Hangul Syllable BBYOBS"/* BFC2 */,/*22341*/"Hangul Syllable BBYOS"/* BFC3 */, /*22342*/"Hangul Syllable BBYOSS"/* BFC4 */,/*22343*/"Hangul Syllable BBYONG"/* BFC5 */, /*22344*/"Hangul Syllable BBYOJ"/* BFC6 */,/*22345*/"Hangul Syllable BBYOC"/* BFC7 */, /*22346*/"Hangul Syllable BBYOK"/* BFC8 */,/*22347*/"Hangul Syllable BBYOT"/* BFC9 */, /*22348*/"Hangul Syllable BBYOP"/* BFCA */,/*22349*/"Hangul Syllable BBYOH"/* BFCB */, /*22350*/"Hangul Syllable BBU"/* BFCC */,/*22351*/"Hangul Syllable BBUG"/* BFCD */, /*22352*/"Hangul Syllable BBUGG"/* BFCE */,/*22353*/"Hangul Syllable BBUGS"/* BFCF */, /*22354*/"Hangul Syllable BBUN"/* BFD0 */,/*22355*/"Hangul Syllable BBUNJ"/* BFD1 */, /*22356*/"Hangul Syllable BBUNH"/* BFD2 */,/*22357*/"Hangul Syllable BBUD"/* BFD3 */, /*22358*/"Hangul Syllable BBUL"/* BFD4 */,/*22359*/"Hangul Syllable BBULG"/* BFD5 */, /*22360*/"Hangul Syllable BBULM"/* BFD6 */,/*22361*/"Hangul Syllable BBULB"/* BFD7 */, /*22362*/"Hangul Syllable BBULS"/* BFD8 */,/*22363*/"Hangul Syllable BBULT"/* BFD9 */, /*22364*/"Hangul Syllable BBULP"/* BFDA */,/*22365*/"Hangul Syllable BBULH"/* BFDB */, /*22366*/"Hangul Syllable BBUM"/* BFDC */,/*22367*/"Hangul Syllable BBUB"/* BFDD */, /*22368*/"Hangul Syllable BBUBS"/* BFDE */,/*22369*/"Hangul Syllable BBUS"/* BFDF */, /*22370*/"Hangul Syllable BBUSS"/* BFE0 */,/*22371*/"Hangul Syllable BBUNG"/* BFE1 */, /*22372*/"Hangul Syllable BBUJ"/* BFE2 */,/*22373*/"Hangul Syllable BBUC"/* BFE3 */, /*22374*/"Hangul Syllable BBUK"/* BFE4 */,/*22375*/"Hangul Syllable BBUT"/* BFE5 */, /*22376*/"Hangul Syllable BBUP"/* BFE6 */,/*22377*/"Hangul Syllable BBUH"/* BFE7 */, /*22378*/"Hangul Syllable BBWEO"/* BFE8 */,/*22379*/"Hangul Syllable BBWEOG"/* BFE9 */, /*22380*/"Hangul Syllable BBWEOGG"/* BFEA */,/*22381*/"Hangul Syllable BBWEOGS"/* BFEB */, /*22382*/"Hangul Syllable BBWEON"/* BFEC */,/*22383*/"Hangul Syllable BBWEONJ"/* BFED */, /*22384*/"Hangul Syllable BBWEONH"/* BFEE */,/*22385*/"Hangul Syllable BBWEOD"/* BFEF */, /*22386*/"Hangul Syllable BBWEOL"/* BFF0 */,/*22387*/"Hangul Syllable BBWEOLG"/* BFF1 */, /*22388*/"Hangul Syllable BBWEOLM"/* BFF2 */,/*22389*/"Hangul Syllable BBWEOLB"/* BFF3 */, /*22390*/"Hangul Syllable BBWEOLS"/* BFF4 */,/*22391*/"Hangul Syllable BBWEOLT"/* BFF5 */, /*22392*/"Hangul Syllable BBWEOLP"/* BFF6 */,/*22393*/"Hangul Syllable BBWEOLH"/* BFF7 */, /*22394*/"Hangul Syllable BBWEOM"/* BFF8 */,/*22395*/"Hangul Syllable BBWEOB"/* BFF9 */, /*22396*/"Hangul Syllable BBWEOBS"/* BFFA */,/*22397*/"Hangul Syllable BBWEOS"/* BFFB */, /*22398*/"Hangul Syllable BBWEOSS"/* BFFC */,/*22399*/"Hangul Syllable BBWEONG"/* BFFD */, /*22400*/"Hangul Syllable BBWEOJ"/* BFFE */,/*22401*/"Hangul Syllable BBWEOC"/* BFFF */, /*22402*/"Hangul Syllable BBWEOK"/* C000 */,/*22403*/"Hangul Syllable BBWEOT"/* C001 */, /*22404*/"Hangul Syllable BBWEOP"/* C002 */,/*22405*/"Hangul Syllable BBWEOH"/* C003 */, /*22406*/"Hangul Syllable BBWE"/* C004 */,/*22407*/"Hangul Syllable BBWEG"/* C005 */, /*22408*/"Hangul Syllable BBWEGG"/* C006 */,/*22409*/"Hangul Syllable BBWEGS"/* C007 */, /*22410*/"Hangul Syllable BBWEN"/* C008 */,/*22411*/"Hangul Syllable BBWENJ"/* C009 */, /*22412*/"Hangul Syllable BBWENH"/* C00A */,/*22413*/"Hangul Syllable BBWED"/* C00B */, /*22414*/"Hangul Syllable BBWEL"/* C00C */,/*22415*/"Hangul Syllable BBWELG"/* C00D */, /*22416*/"Hangul Syllable BBWELM"/* C00E */,/*22417*/"Hangul Syllable BBWELB"/* C00F */, /*22418*/"Hangul Syllable BBWELS"/* C010 */,/*22419*/"Hangul Syllable BBWELT"/* C011 */, /*22420*/"Hangul Syllable BBWELP"/* C012 */,/*22421*/"Hangul Syllable BBWELH"/* C013 */, /*22422*/"Hangul Syllable BBWEM"/* C014 */,/*22423*/"Hangul Syllable BBWEB"/* C015 */, /*22424*/"Hangul Syllable BBWEBS"/* C016 */,/*22425*/"Hangul Syllable BBWES"/* C017 */, /*22426*/"Hangul Syllable BBWESS"/* C018 */,/*22427*/"Hangul Syllable BBWENG"/* C019 */, /*22428*/"Hangul Syllable BBWEJ"/* C01A */,/*22429*/"Hangul Syllable BBWEC"/* C01B */, /*22430*/"Hangul Syllable BBWEK"/* C01C */,/*22431*/"Hangul Syllable BBWET"/* C01D */, /*22432*/"Hangul Syllable BBWEP"/* C01E */,/*22433*/"Hangul Syllable BBWEH"/* C01F */, /*22434*/"Hangul Syllable BBWI"/* C020 */,/*22435*/"Hangul Syllable BBWIG"/* C021 */, /*22436*/"Hangul Syllable BBWIGG"/* C022 */,/*22437*/"Hangul Syllable BBWIGS"/* C023 */, /*22438*/"Hangul Syllable BBWIN"/* C024 */,/*22439*/"Hangul Syllable BBWINJ"/* C025 */, /*22440*/"Hangul Syllable BBWINH"/* C026 */,/*22441*/"Hangul Syllable BBWID"/* C027 */, /*22442*/"Hangul Syllable BBWIL"/* C028 */,/*22443*/"Hangul Syllable BBWILG"/* C029 */, /*22444*/"Hangul Syllable BBWILM"/* C02A */,/*22445*/"Hangul Syllable BBWILB"/* C02B */, /*22446*/"Hangul Syllable BBWILS"/* C02C */,/*22447*/"Hangul Syllable BBWILT"/* C02D */, /*22448*/"Hangul Syllable BBWILP"/* C02E */,/*22449*/"Hangul Syllable BBWILH"/* C02F */, /*22450*/"Hangul Syllable BBWIM"/* C030 */,/*22451*/"Hangul Syllable BBWIB"/* C031 */, /*22452*/"Hangul Syllable BBWIBS"/* C032 */,/*22453*/"Hangul Syllable BBWIS"/* C033 */, /*22454*/"Hangul Syllable BBWISS"/* C034 */,/*22455*/"Hangul Syllable BBWING"/* C035 */, /*22456*/"Hangul Syllable BBWIJ"/* C036 */,/*22457*/"Hangul Syllable BBWIC"/* C037 */, /*22458*/"Hangul Syllable BBWIK"/* C038 */,/*22459*/"Hangul Syllable BBWIT"/* C039 */, /*22460*/"Hangul Syllable BBWIP"/* C03A */,/*22461*/"Hangul Syllable BBWIH"/* C03B */, /*22462*/"Hangul Syllable BBYU"/* C03C */,/*22463*/"Hangul Syllable BBYUG"/* C03D */, /*22464*/"Hangul Syllable BBYUGG"/* C03E */,/*22465*/"Hangul Syllable BBYUGS"/* C03F */, /*22466*/"Hangul Syllable BBYUN"/* C040 */,/*22467*/"Hangul Syllable BBYUNJ"/* C041 */, /*22468*/"Hangul Syllable BBYUNH"/* C042 */,/*22469*/"Hangul Syllable BBYUD"/* C043 */, /*22470*/"Hangul Syllable BBYUL"/* C044 */,/*22471*/"Hangul Syllable BBYULG"/* C045 */, /*22472*/"Hangul Syllable BBYULM"/* C046 */,/*22473*/"Hangul Syllable BBYULB"/* C047 */, /*22474*/"Hangul Syllable BBYULS"/* C048 */,/*22475*/"Hangul Syllable BBYULT"/* C049 */, /*22476*/"Hangul Syllable BBYULP"/* C04A */,/*22477*/"Hangul Syllable BBYULH"/* C04B */, /*22478*/"Hangul Syllable BBYUM"/* C04C */,/*22479*/"Hangul Syllable BBYUB"/* C04D */, /*22480*/"Hangul Syllable BBYUBS"/* C04E */,/*22481*/"Hangul Syllable BBYUS"/* C04F */, /*22482*/"Hangul Syllable BBYUSS"/* C050 */,/*22483*/"Hangul Syllable BBYUNG"/* C051 */, /*22484*/"Hangul Syllable BBYUJ"/* C052 */,/*22485*/"Hangul Syllable BBYUC"/* C053 */, /*22486*/"Hangul Syllable BBYUK"/* C054 */,/*22487*/"Hangul Syllable BBYUT"/* C055 */, /*22488*/"Hangul Syllable BBYUP"/* C056 */,/*22489*/"Hangul Syllable BBYUH"/* C057 */, /*22490*/"Hangul Syllable BBEU"/* C058 */,/*22491*/"Hangul Syllable BBEUG"/* C059 */, /*22492*/"Hangul Syllable BBEUGG"/* C05A */,/*22493*/"Hangul Syllable BBEUGS"/* C05B */, /*22494*/"Hangul Syllable BBEUN"/* C05C */,/*22495*/"Hangul Syllable BBEUNJ"/* C05D */, /*22496*/"Hangul Syllable BBEUNH"/* C05E */,/*22497*/"Hangul Syllable BBEUD"/* C05F */, /*22498*/"Hangul Syllable BBEUL"/* C060 */,/*22499*/"Hangul Syllable BBEULG"/* C061 */, /*22500*/"Hangul Syllable BBEULM"/* C062 */,/*22501*/"Hangul Syllable BBEULB"/* C063 */, /*22502*/"Hangul Syllable BBEULS"/* C064 */,/*22503*/"Hangul Syllable BBEULT"/* C065 */, /*22504*/"Hangul Syllable BBEULP"/* C066 */,/*22505*/"Hangul Syllable BBEULH"/* C067 */, /*22506*/"Hangul Syllable BBEUM"/* C068 */,/*22507*/"Hangul Syllable BBEUB"/* C069 */, /*22508*/"Hangul Syllable BBEUBS"/* C06A */,/*22509*/"Hangul Syllable BBEUS"/* C06B */, /*22510*/"Hangul Syllable BBEUSS"/* C06C */,/*22511*/"Hangul Syllable BBEUNG"/* C06D */, /*22512*/"Hangul Syllable BBEUJ"/* C06E */,/*22513*/"Hangul Syllable BBEUC"/* C06F */, /*22514*/"Hangul Syllable BBEUK"/* C070 */,/*22515*/"Hangul Syllable BBEUT"/* C071 */, /*22516*/"Hangul Syllable BBEUP"/* C072 */,/*22517*/"Hangul Syllable BBEUH"/* C073 */, /*22518*/"Hangul Syllable BBYI"/* C074 */,/*22519*/"Hangul Syllable BBYIG"/* C075 */, /*22520*/"Hangul Syllable BBYIGG"/* C076 */,/*22521*/"Hangul Syllable BBYIGS"/* C077 */, /*22522*/"Hangul Syllable BBYIN"/* C078 */,/*22523*/"Hangul Syllable BBYINJ"/* C079 */, /*22524*/"Hangul Syllable BBYINH"/* C07A */,/*22525*/"Hangul Syllable BBYID"/* C07B */, /*22526*/"Hangul Syllable BBYIL"/* C07C */,/*22527*/"Hangul Syllable BBYILG"/* C07D */, /*22528*/"Hangul Syllable BBYILM"/* C07E */,/*22529*/"Hangul Syllable BBYILB"/* C07F */, /*22530*/"Hangul Syllable BBYILS"/* C080 */,/*22531*/"Hangul Syllable BBYILT"/* C081 */, /*22532*/"Hangul Syllable BBYILP"/* C082 */,/*22533*/"Hangul Syllable BBYILH"/* C083 */, /*22534*/"Hangul Syllable BBYIM"/* C084 */,/*22535*/"Hangul Syllable BBYIB"/* C085 */, /*22536*/"Hangul Syllable BBYIBS"/* C086 */,/*22537*/"Hangul Syllable BBYIS"/* C087 */, /*22538*/"Hangul Syllable BBYISS"/* C088 */,/*22539*/"Hangul Syllable BBYING"/* C089 */, /*22540*/"Hangul Syllable BBYIJ"/* C08A */,/*22541*/"Hangul Syllable BBYIC"/* C08B */, /*22542*/"Hangul Syllable BBYIK"/* C08C */,/*22543*/"Hangul Syllable BBYIT"/* C08D */, /*22544*/"Hangul Syllable BBYIP"/* C08E */,/*22545*/"Hangul Syllable BBYIH"/* C08F */, /*22546*/"Hangul Syllable BBI"/* C090 */,/*22547*/"Hangul Syllable BBIG"/* C091 */, /*22548*/"Hangul Syllable BBIGG"/* C092 */,/*22549*/"Hangul Syllable BBIGS"/* C093 */, /*22550*/"Hangul Syllable BBIN"/* C094 */,/*22551*/"Hangul Syllable BBINJ"/* C095 */, /*22552*/"Hangul Syllable BBINH"/* C096 */,/*22553*/"Hangul Syllable BBID"/* C097 */, /*22554*/"Hangul Syllable BBIL"/* C098 */,/*22555*/"Hangul Syllable BBILG"/* C099 */, /*22556*/"Hangul Syllable BBILM"/* C09A */,/*22557*/"Hangul Syllable BBILB"/* C09B */, /*22558*/"Hangul Syllable BBILS"/* C09C */,/*22559*/"Hangul Syllable BBILT"/* C09D */, /*22560*/"Hangul Syllable BBILP"/* C09E */,/*22561*/"Hangul Syllable BBILH"/* C09F */, /*22562*/"Hangul Syllable BBIM"/* C0A0 */,/*22563*/"Hangul Syllable BBIB"/* C0A1 */, /*22564*/"Hangul Syllable BBIBS"/* C0A2 */,/*22565*/"Hangul Syllable BBIS"/* C0A3 */, /*22566*/"Hangul Syllable BBISS"/* C0A4 */,/*22567*/"Hangul Syllable BBING"/* C0A5 */, /*22568*/"Hangul Syllable BBIJ"/* C0A6 */,/*22569*/"Hangul Syllable BBIC"/* C0A7 */, /*22570*/"Hangul Syllable BBIK"/* C0A8 */,/*22571*/"Hangul Syllable BBIT"/* C0A9 */, /*22572*/"Hangul Syllable BBIP"/* C0AA */,/*22573*/"Hangul Syllable BBIH"/* C0AB */, /*22574*/"Hangul Syllable SA"/* C0AC */,/*22575*/"Hangul Syllable SAG"/* C0AD */, /*22576*/"Hangul Syllable SAGG"/* C0AE */,/*22577*/"Hangul Syllable SAGS"/* C0AF */, /*22578*/"Hangul Syllable SAN"/* C0B0 */,/*22579*/"Hangul Syllable SANJ"/* C0B1 */, /*22580*/"Hangul Syllable SANH"/* C0B2 */,/*22581*/"Hangul Syllable SAD"/* C0B3 */, /*22582*/"Hangul Syllable SAL"/* C0B4 */,/*22583*/"Hangul Syllable SALG"/* C0B5 */, /*22584*/"Hangul Syllable SALM"/* C0B6 */,/*22585*/"Hangul Syllable SALB"/* C0B7 */, /*22586*/"Hangul Syllable SALS"/* C0B8 */,/*22587*/"Hangul Syllable SALT"/* C0B9 */, /*22588*/"Hangul Syllable SALP"/* C0BA */,/*22589*/"Hangul Syllable SALH"/* C0BB */, /*22590*/"Hangul Syllable SAM"/* C0BC */,/*22591*/"Hangul Syllable SAB"/* C0BD */, /*22592*/"Hangul Syllable SABS"/* C0BE */,/*22593*/"Hangul Syllable SAS"/* C0BF */, /*22594*/"Hangul Syllable SASS"/* C0C0 */,/*22595*/"Hangul Syllable SANG"/* C0C1 */, /*22596*/"Hangul Syllable SAJ"/* C0C2 */,/*22597*/"Hangul Syllable SAC"/* C0C3 */, /*22598*/"Hangul Syllable SAK"/* C0C4 */,/*22599*/"Hangul Syllable SAT"/* C0C5 */, /*22600*/"Hangul Syllable SAP"/* C0C6 */,/*22601*/"Hangul Syllable SAH"/* C0C7 */, /*22602*/"Hangul Syllable SAE"/* C0C8 */,/*22603*/"Hangul Syllable SAEG"/* C0C9 */, /*22604*/"Hangul Syllable SAEGG"/* C0CA */,/*22605*/"Hangul Syllable SAEGS"/* C0CB */, /*22606*/"Hangul Syllable SAEN"/* C0CC */,/*22607*/"Hangul Syllable SAENJ"/* C0CD */, /*22608*/"Hangul Syllable SAENH"/* C0CE */,/*22609*/"Hangul Syllable SAED"/* C0CF */, /*22610*/"Hangul Syllable SAEL"/* C0D0 */,/*22611*/"Hangul Syllable SAELG"/* C0D1 */, /*22612*/"Hangul Syllable SAELM"/* C0D2 */,/*22613*/"Hangul Syllable SAELB"/* C0D3 */, /*22614*/"Hangul Syllable SAELS"/* C0D4 */,/*22615*/"Hangul Syllable SAELT"/* C0D5 */, /*22616*/"Hangul Syllable SAELP"/* C0D6 */,/*22617*/"Hangul Syllable SAELH"/* C0D7 */, /*22618*/"Hangul Syllable SAEM"/* C0D8 */,/*22619*/"Hangul Syllable SAEB"/* C0D9 */, /*22620*/"Hangul Syllable SAEBS"/* C0DA */,/*22621*/"Hangul Syllable SAES"/* C0DB */, /*22622*/"Hangul Syllable SAESS"/* C0DC */,/*22623*/"Hangul Syllable SAENG"/* C0DD */, /*22624*/"Hangul Syllable SAEJ"/* C0DE */,/*22625*/"Hangul Syllable SAEC"/* C0DF */, /*22626*/"Hangul Syllable SAEK"/* C0E0 */,/*22627*/"Hangul Syllable SAET"/* C0E1 */, /*22628*/"Hangul Syllable SAEP"/* C0E2 */,/*22629*/"Hangul Syllable SAEH"/* C0E3 */, /*22630*/"Hangul Syllable SYA"/* C0E4 */,/*22631*/"Hangul Syllable SYAG"/* C0E5 */, /*22632*/"Hangul Syllable SYAGG"/* C0E6 */,/*22633*/"Hangul Syllable SYAGS"/* C0E7 */, /*22634*/"Hangul Syllable SYAN"/* C0E8 */,/*22635*/"Hangul Syllable SYANJ"/* C0E9 */, /*22636*/"Hangul Syllable SYANH"/* C0EA */,/*22637*/"Hangul Syllable SYAD"/* C0EB */, /*22638*/"Hangul Syllable SYAL"/* C0EC */,/*22639*/"Hangul Syllable SYALG"/* C0ED */, /*22640*/"Hangul Syllable SYALM"/* C0EE */,/*22641*/"Hangul Syllable SYALB"/* C0EF */, /*22642*/"Hangul Syllable SYALS"/* C0F0 */,/*22643*/"Hangul Syllable SYALT"/* C0F1 */, /*22644*/"Hangul Syllable SYALP"/* C0F2 */,/*22645*/"Hangul Syllable SYALH"/* C0F3 */, /*22646*/"Hangul Syllable SYAM"/* C0F4 */,/*22647*/"Hangul Syllable SYAB"/* C0F5 */, /*22648*/"Hangul Syllable SYABS"/* C0F6 */,/*22649*/"Hangul Syllable SYAS"/* C0F7 */, /*22650*/"Hangul Syllable SYASS"/* C0F8 */,/*22651*/"Hangul Syllable SYANG"/* C0F9 */, /*22652*/"Hangul Syllable SYAJ"/* C0FA */,/*22653*/"Hangul Syllable SYAC"/* C0FB */, /*22654*/"Hangul Syllable SYAK"/* C0FC */,/*22655*/"Hangul Syllable SYAT"/* C0FD */, /*22656*/"Hangul Syllable SYAP"/* C0FE */,/*22657*/"Hangul Syllable SYAH"/* C0FF */, /*22658*/"Hangul Syllable SYAE"/* C100 */,/*22659*/"Hangul Syllable SYAEG"/* C101 */, /*22660*/"Hangul Syllable SYAEGG"/* C102 */,/*22661*/"Hangul Syllable SYAEGS"/* C103 */, /*22662*/"Hangul Syllable SYAEN"/* C104 */,/*22663*/"Hangul Syllable SYAENJ"/* C105 */, /*22664*/"Hangul Syllable SYAENH"/* C106 */,/*22665*/"Hangul Syllable SYAED"/* C107 */, /*22666*/"Hangul Syllable SYAEL"/* C108 */,/*22667*/"Hangul Syllable SYAELG"/* C109 */, /*22668*/"Hangul Syllable SYAELM"/* C10A */,/*22669*/"Hangul Syllable SYAELB"/* C10B */, /*22670*/"Hangul Syllable SYAELS"/* C10C */,/*22671*/"Hangul Syllable SYAELT"/* C10D */, /*22672*/"Hangul Syllable SYAELP"/* C10E */,/*22673*/"Hangul Syllable SYAELH"/* C10F */, /*22674*/"Hangul Syllable SYAEM"/* C110 */,/*22675*/"Hangul Syllable SYAEB"/* C111 */, /*22676*/"Hangul Syllable SYAEBS"/* C112 */,/*22677*/"Hangul Syllable SYAES"/* C113 */, /*22678*/"Hangul Syllable SYAESS"/* C114 */,/*22679*/"Hangul Syllable SYAENG"/* C115 */, /*22680*/"Hangul Syllable SYAEJ"/* C116 */,/*22681*/"Hangul Syllable SYAEC"/* C117 */, /*22682*/"Hangul Syllable SYAEK"/* C118 */,/*22683*/"Hangul Syllable SYAET"/* C119 */, /*22684*/"Hangul Syllable SYAEP"/* C11A */,/*22685*/"Hangul Syllable SYAEH"/* C11B */, /*22686*/"Hangul Syllable SEO"/* C11C */,/*22687*/"Hangul Syllable SEOG"/* C11D */, /*22688*/"Hangul Syllable SEOGG"/* C11E */,/*22689*/"Hangul Syllable SEOGS"/* C11F */, /*22690*/"Hangul Syllable SEON"/* C120 */,/*22691*/"Hangul Syllable SEONJ"/* C121 */, /*22692*/"Hangul Syllable SEONH"/* C122 */,/*22693*/"Hangul Syllable SEOD"/* C123 */, /*22694*/"Hangul Syllable SEOL"/* C124 */,/*22695*/"Hangul Syllable SEOLG"/* C125 */, /*22696*/"Hangul Syllable SEOLM"/* C126 */,/*22697*/"Hangul Syllable SEOLB"/* C127 */, /*22698*/"Hangul Syllable SEOLS"/* C128 */,/*22699*/"Hangul Syllable SEOLT"/* C129 */, /*22700*/"Hangul Syllable SEOLP"/* C12A */,/*22701*/"Hangul Syllable SEOLH"/* C12B */, /*22702*/"Hangul Syllable SEOM"/* C12C */,/*22703*/"Hangul Syllable SEOB"/* C12D */, /*22704*/"Hangul Syllable SEOBS"/* C12E */,/*22705*/"Hangul Syllable SEOS"/* C12F */, /*22706*/"Hangul Syllable SEOSS"/* C130 */,/*22707*/"Hangul Syllable SEONG"/* C131 */, /*22708*/"Hangul Syllable SEOJ"/* C132 */,/*22709*/"Hangul Syllable SEOC"/* C133 */, /*22710*/"Hangul Syllable SEOK"/* C134 */,/*22711*/"Hangul Syllable SEOT"/* C135 */, /*22712*/"Hangul Syllable SEOP"/* C136 */,/*22713*/"Hangul Syllable SEOH"/* C137 */, /*22714*/"Hangul Syllable SE"/* C138 */,/*22715*/"Hangul Syllable SEG"/* C139 */, /*22716*/"Hangul Syllable SEGG"/* C13A */,/*22717*/"Hangul Syllable SEGS"/* C13B */, /*22718*/"Hangul Syllable SEN"/* C13C */,/*22719*/"Hangul Syllable SENJ"/* C13D */, /*22720*/"Hangul Syllable SENH"/* C13E */,/*22721*/"Hangul Syllable SED"/* C13F */, /*22722*/"Hangul Syllable SEL"/* C140 */,/*22723*/"Hangul Syllable SELG"/* C141 */, /*22724*/"Hangul Syllable SELM"/* C142 */,/*22725*/"Hangul Syllable SELB"/* C143 */, /*22726*/"Hangul Syllable SELS"/* C144 */,/*22727*/"Hangul Syllable SELT"/* C145 */, /*22728*/"Hangul Syllable SELP"/* C146 */,/*22729*/"Hangul Syllable SELH"/* C147 */, /*22730*/"Hangul Syllable SEM"/* C148 */,/*22731*/"Hangul Syllable SEB"/* C149 */, /*22732*/"Hangul Syllable SEBS"/* C14A */,/*22733*/"Hangul Syllable SES"/* C14B */, /*22734*/"Hangul Syllable SESS"/* C14C */,/*22735*/"Hangul Syllable SENG"/* C14D */, /*22736*/"Hangul Syllable SEJ"/* C14E */,/*22737*/"Hangul Syllable SEC"/* C14F */, /*22738*/"Hangul Syllable SEK"/* C150 */,/*22739*/"Hangul Syllable SET"/* C151 */, /*22740*/"Hangul Syllable SEP"/* C152 */,/*22741*/"Hangul Syllable SEH"/* C153 */, /*22742*/"Hangul Syllable SYEO"/* C154 */,/*22743*/"Hangul Syllable SYEOG"/* C155 */, /*22744*/"Hangul Syllable SYEOGG"/* C156 */,/*22745*/"Hangul Syllable SYEOGS"/* C157 */, /*22746*/"Hangul Syllable SYEON"/* C158 */,/*22747*/"Hangul Syllable SYEONJ"/* C159 */, /*22748*/"Hangul Syllable SYEONH"/* C15A */,/*22749*/"Hangul Syllable SYEOD"/* C15B */, /*22750*/"Hangul Syllable SYEOL"/* C15C */,/*22751*/"Hangul Syllable SYEOLG"/* C15D */, /*22752*/"Hangul Syllable SYEOLM"/* C15E */,/*22753*/"Hangul Syllable SYEOLB"/* C15F */, /*22754*/"Hangul Syllable SYEOLS"/* C160 */,/*22755*/"Hangul Syllable SYEOLT"/* C161 */, /*22756*/"Hangul Syllable SYEOLP"/* C162 */,/*22757*/"Hangul Syllable SYEOLH"/* C163 */, /*22758*/"Hangul Syllable SYEOM"/* C164 */,/*22759*/"Hangul Syllable SYEOB"/* C165 */, /*22760*/"Hangul Syllable SYEOBS"/* C166 */,/*22761*/"Hangul Syllable SYEOS"/* C167 */, /*22762*/"Hangul Syllable SYEOSS"/* C168 */,/*22763*/"Hangul Syllable SYEONG"/* C169 */, /*22764*/"Hangul Syllable SYEOJ"/* C16A */,/*22765*/"Hangul Syllable SYEOC"/* C16B */, /*22766*/"Hangul Syllable SYEOK"/* C16C */,/*22767*/"Hangul Syllable SYEOT"/* C16D */, /*22768*/"Hangul Syllable SYEOP"/* C16E */,/*22769*/"Hangul Syllable SYEOH"/* C16F */, /*22770*/"Hangul Syllable SYE"/* C170 */,/*22771*/"Hangul Syllable SYEG"/* C171 */, /*22772*/"Hangul Syllable SYEGG"/* C172 */,/*22773*/"Hangul Syllable SYEGS"/* C173 */, /*22774*/"Hangul Syllable SYEN"/* C174 */,/*22775*/"Hangul Syllable SYENJ"/* C175 */, /*22776*/"Hangul Syllable SYENH"/* C176 */,/*22777*/"Hangul Syllable SYED"/* C177 */, /*22778*/"Hangul Syllable SYEL"/* C178 */,/*22779*/"Hangul Syllable SYELG"/* C179 */, /*22780*/"Hangul Syllable SYELM"/* C17A */,/*22781*/"Hangul Syllable SYELB"/* C17B */, /*22782*/"Hangul Syllable SYELS"/* C17C */,/*22783*/"Hangul Syllable SYELT"/* C17D */, /*22784*/"Hangul Syllable SYELP"/* C17E */,/*22785*/"Hangul Syllable SYELH"/* C17F */, /*22786*/"Hangul Syllable SYEM"/* C180 */,/*22787*/"Hangul Syllable SYEB"/* C181 */, /*22788*/"Hangul Syllable SYEBS"/* C182 */,/*22789*/"Hangul Syllable SYES"/* C183 */, /*22790*/"Hangul Syllable SYESS"/* C184 */,/*22791*/"Hangul Syllable SYENG"/* C185 */, /*22792*/"Hangul Syllable SYEJ"/* C186 */,/*22793*/"Hangul Syllable SYEC"/* C187 */, /*22794*/"Hangul Syllable SYEK"/* C188 */,/*22795*/"Hangul Syllable SYET"/* C189 */, /*22796*/"Hangul Syllable SYEP"/* C18A */,/*22797*/"Hangul Syllable SYEH"/* C18B */, /*22798*/"Hangul Syllable SO"/* C18C */,/*22799*/"Hangul Syllable SOG"/* C18D */, /*22800*/"Hangul Syllable SOGG"/* C18E */,/*22801*/"Hangul Syllable SOGS"/* C18F */, /*22802*/"Hangul Syllable SON"/* C190 */,/*22803*/"Hangul Syllable SONJ"/* C191 */, /*22804*/"Hangul Syllable SONH"/* C192 */,/*22805*/"Hangul Syllable SOD"/* C193 */, /*22806*/"Hangul Syllable SOL"/* C194 */,/*22807*/"Hangul Syllable SOLG"/* C195 */, /*22808*/"Hangul Syllable SOLM"/* C196 */,/*22809*/"Hangul Syllable SOLB"/* C197 */, /*22810*/"Hangul Syllable SOLS"/* C198 */,/*22811*/"Hangul Syllable SOLT"/* C199 */, /*22812*/"Hangul Syllable SOLP"/* C19A */,/*22813*/"Hangul Syllable SOLH"/* C19B */, /*22814*/"Hangul Syllable SOM"/* C19C */,/*22815*/"Hangul Syllable SOB"/* C19D */, /*22816*/"Hangul Syllable SOBS"/* C19E */,/*22817*/"Hangul Syllable SOS"/* C19F */, /*22818*/"Hangul Syllable SOSS"/* C1A0 */,/*22819*/"Hangul Syllable SONG"/* C1A1 */, /*22820*/"Hangul Syllable SOJ"/* C1A2 */,/*22821*/"Hangul Syllable SOC"/* C1A3 */, /*22822*/"Hangul Syllable SOK"/* C1A4 */,/*22823*/"Hangul Syllable SOT"/* C1A5 */, /*22824*/"Hangul Syllable SOP"/* C1A6 */,/*22825*/"Hangul Syllable SOH"/* C1A7 */, /*22826*/"Hangul Syllable SWA"/* C1A8 */,/*22827*/"Hangul Syllable SWAG"/* C1A9 */, /*22828*/"Hangul Syllable SWAGG"/* C1AA */,/*22829*/"Hangul Syllable SWAGS"/* C1AB */, /*22830*/"Hangul Syllable SWAN"/* C1AC */,/*22831*/"Hangul Syllable SWANJ"/* C1AD */, /*22832*/"Hangul Syllable SWANH"/* C1AE */,/*22833*/"Hangul Syllable SWAD"/* C1AF */, /*22834*/"Hangul Syllable SWAL"/* C1B0 */,/*22835*/"Hangul Syllable SWALG"/* C1B1 */, /*22836*/"Hangul Syllable SWALM"/* C1B2 */,/*22837*/"Hangul Syllable SWALB"/* C1B3 */, /*22838*/"Hangul Syllable SWALS"/* C1B4 */,/*22839*/"Hangul Syllable SWALT"/* C1B5 */, /*22840*/"Hangul Syllable SWALP"/* C1B6 */,/*22841*/"Hangul Syllable SWALH"/* C1B7 */, /*22842*/"Hangul Syllable SWAM"/* C1B8 */,/*22843*/"Hangul Syllable SWAB"/* C1B9 */, /*22844*/"Hangul Syllable SWABS"/* C1BA */,/*22845*/"Hangul Syllable SWAS"/* C1BB */, /*22846*/"Hangul Syllable SWASS"/* C1BC */,/*22847*/"Hangul Syllable SWANG"/* C1BD */, /*22848*/"Hangul Syllable SWAJ"/* C1BE */,/*22849*/"Hangul Syllable SWAC"/* C1BF */, /*22850*/"Hangul Syllable SWAK"/* C1C0 */,/*22851*/"Hangul Syllable SWAT"/* C1C1 */, /*22852*/"Hangul Syllable SWAP"/* C1C2 */,/*22853*/"Hangul Syllable SWAH"/* C1C3 */, /*22854*/"Hangul Syllable SWAE"/* C1C4 */,/*22855*/"Hangul Syllable SWAEG"/* C1C5 */, /*22856*/"Hangul Syllable SWAEGG"/* C1C6 */,/*22857*/"Hangul Syllable SWAEGS"/* C1C7 */, /*22858*/"Hangul Syllable SWAEN"/* C1C8 */,/*22859*/"Hangul Syllable SWAENJ"/* C1C9 */, /*22860*/"Hangul Syllable SWAENH"/* C1CA */,/*22861*/"Hangul Syllable SWAED"/* C1CB */, /*22862*/"Hangul Syllable SWAEL"/* C1CC */,/*22863*/"Hangul Syllable SWAELG"/* C1CD */, /*22864*/"Hangul Syllable SWAELM"/* C1CE */,/*22865*/"Hangul Syllable SWAELB"/* C1CF */, /*22866*/"Hangul Syllable SWAELS"/* C1D0 */,/*22867*/"Hangul Syllable SWAELT"/* C1D1 */, /*22868*/"Hangul Syllable SWAELP"/* C1D2 */,/*22869*/"Hangul Syllable SWAELH"/* C1D3 */, /*22870*/"Hangul Syllable SWAEM"/* C1D4 */,/*22871*/"Hangul Syllable SWAEB"/* C1D5 */, /*22872*/"Hangul Syllable SWAEBS"/* C1D6 */,/*22873*/"Hangul Syllable SWAES"/* C1D7 */, /*22874*/"Hangul Syllable SWAESS"/* C1D8 */,/*22875*/"Hangul Syllable SWAENG"/* C1D9 */, /*22876*/"Hangul Syllable SWAEJ"/* C1DA */,/*22877*/"Hangul Syllable SWAEC"/* C1DB */, /*22878*/"Hangul Syllable SWAEK"/* C1DC */,/*22879*/"Hangul Syllable SWAET"/* C1DD */, /*22880*/"Hangul Syllable SWAEP"/* C1DE */,/*22881*/"Hangul Syllable SWAEH"/* C1DF */, /*22882*/"Hangul Syllable SOE"/* C1E0 */,/*22883*/"Hangul Syllable SOEG"/* C1E1 */, /*22884*/"Hangul Syllable SOEGG"/* C1E2 */,/*22885*/"Hangul Syllable SOEGS"/* C1E3 */, /*22886*/"Hangul Syllable SOEN"/* C1E4 */,/*22887*/"Hangul Syllable SOENJ"/* C1E5 */, /*22888*/"Hangul Syllable SOENH"/* C1E6 */,/*22889*/"Hangul Syllable SOED"/* C1E7 */, /*22890*/"Hangul Syllable SOEL"/* C1E8 */,/*22891*/"Hangul Syllable SOELG"/* C1E9 */, /*22892*/"Hangul Syllable SOELM"/* C1EA */,/*22893*/"Hangul Syllable SOELB"/* C1EB */, /*22894*/"Hangul Syllable SOELS"/* C1EC */,/*22895*/"Hangul Syllable SOELT"/* C1ED */, /*22896*/"Hangul Syllable SOELP"/* C1EE */,/*22897*/"Hangul Syllable SOELH"/* C1EF */, /*22898*/"Hangul Syllable SOEM"/* C1F0 */,/*22899*/"Hangul Syllable SOEB"/* C1F1 */, /*22900*/"Hangul Syllable SOEBS"/* C1F2 */,/*22901*/"Hangul Syllable SOES"/* C1F3 */, /*22902*/"Hangul Syllable SOESS"/* C1F4 */,/*22903*/"Hangul Syllable SOENG"/* C1F5 */, /*22904*/"Hangul Syllable SOEJ"/* C1F6 */,/*22905*/"Hangul Syllable SOEC"/* C1F7 */, /*22906*/"Hangul Syllable SOEK"/* C1F8 */,/*22907*/"Hangul Syllable SOET"/* C1F9 */, /*22908*/"Hangul Syllable SOEP"/* C1FA */,/*22909*/"Hangul Syllable SOEH"/* C1FB */, /*22910*/"Hangul Syllable SYO"/* C1FC */,/*22911*/"Hangul Syllable SYOG"/* C1FD */, /*22912*/"Hangul Syllable SYOGG"/* C1FE */,/*22913*/"Hangul Syllable SYOGS"/* C1FF */, /*22914*/"Hangul Syllable SYON"/* C200 */,/*22915*/"Hangul Syllable SYONJ"/* C201 */, /*22916*/"Hangul Syllable SYONH"/* C202 */,/*22917*/"Hangul Syllable SYOD"/* C203 */, /*22918*/"Hangul Syllable SYOL"/* C204 */,/*22919*/"Hangul Syllable SYOLG"/* C205 */, /*22920*/"Hangul Syllable SYOLM"/* C206 */,/*22921*/"Hangul Syllable SYOLB"/* C207 */, /*22922*/"Hangul Syllable SYOLS"/* C208 */,/*22923*/"Hangul Syllable SYOLT"/* C209 */, /*22924*/"Hangul Syllable SYOLP"/* C20A */,/*22925*/"Hangul Syllable SYOLH"/* C20B */, /*22926*/"Hangul Syllable SYOM"/* C20C */,/*22927*/"Hangul Syllable SYOB"/* C20D */, /*22928*/"Hangul Syllable SYOBS"/* C20E */,/*22929*/"Hangul Syllable SYOS"/* C20F */, /*22930*/"Hangul Syllable SYOSS"/* C210 */,/*22931*/"Hangul Syllable SYONG"/* C211 */, /*22932*/"Hangul Syllable SYOJ"/* C212 */,/*22933*/"Hangul Syllable SYOC"/* C213 */, /*22934*/"Hangul Syllable SYOK"/* C214 */,/*22935*/"Hangul Syllable SYOT"/* C215 */, /*22936*/"Hangul Syllable SYOP"/* C216 */,/*22937*/"Hangul Syllable SYOH"/* C217 */, /*22938*/"Hangul Syllable SU"/* C218 */,/*22939*/"Hangul Syllable SUG"/* C219 */, /*22940*/"Hangul Syllable SUGG"/* C21A */,/*22941*/"Hangul Syllable SUGS"/* C21B */, /*22942*/"Hangul Syllable SUN"/* C21C */,/*22943*/"Hangul Syllable SUNJ"/* C21D */, /*22944*/"Hangul Syllable SUNH"/* C21E */,/*22945*/"Hangul Syllable SUD"/* C21F */, /*22946*/"Hangul Syllable SUL"/* C220 */,/*22947*/"Hangul Syllable SULG"/* C221 */, /*22948*/"Hangul Syllable SULM"/* C222 */,/*22949*/"Hangul Syllable SULB"/* C223 */, /*22950*/"Hangul Syllable SULS"/* C224 */,/*22951*/"Hangul Syllable SULT"/* C225 */, /*22952*/"Hangul Syllable SULP"/* C226 */,/*22953*/"Hangul Syllable SULH"/* C227 */, /*22954*/"Hangul Syllable SUM"/* C228 */,/*22955*/"Hangul Syllable SUB"/* C229 */, /*22956*/"Hangul Syllable SUBS"/* C22A */,/*22957*/"Hangul Syllable SUS"/* C22B */, /*22958*/"Hangul Syllable SUSS"/* C22C */,/*22959*/"Hangul Syllable SUNG"/* C22D */, /*22960*/"Hangul Syllable SUJ"/* C22E */,/*22961*/"Hangul Syllable SUC"/* C22F */, /*22962*/"Hangul Syllable SUK"/* C230 */,/*22963*/"Hangul Syllable SUT"/* C231 */, /*22964*/"Hangul Syllable SUP"/* C232 */,/*22965*/"Hangul Syllable SUH"/* C233 */, /*22966*/"Hangul Syllable SWEO"/* C234 */,/*22967*/"Hangul Syllable SWEOG"/* C235 */, /*22968*/"Hangul Syllable SWEOGG"/* C236 */,/*22969*/"Hangul Syllable SWEOGS"/* C237 */, /*22970*/"Hangul Syllable SWEON"/* C238 */,/*22971*/"Hangul Syllable SWEONJ"/* C239 */, /*22972*/"Hangul Syllable SWEONH"/* C23A */,/*22973*/"Hangul Syllable SWEOD"/* C23B */, /*22974*/"Hangul Syllable SWEOL"/* C23C */,/*22975*/"Hangul Syllable SWEOLG"/* C23D */, /*22976*/"Hangul Syllable SWEOLM"/* C23E */,/*22977*/"Hangul Syllable SWEOLB"/* C23F */, /*22978*/"Hangul Syllable SWEOLS"/* C240 */,/*22979*/"Hangul Syllable SWEOLT"/* C241 */, /*22980*/"Hangul Syllable SWEOLP"/* C242 */,/*22981*/"Hangul Syllable SWEOLH"/* C243 */, /*22982*/"Hangul Syllable SWEOM"/* C244 */,/*22983*/"Hangul Syllable SWEOB"/* C245 */, /*22984*/"Hangul Syllable SWEOBS"/* C246 */,/*22985*/"Hangul Syllable SWEOS"/* C247 */, /*22986*/"Hangul Syllable SWEOSS"/* C248 */,/*22987*/"Hangul Syllable SWEONG"/* C249 */, /*22988*/"Hangul Syllable SWEOJ"/* C24A */,/*22989*/"Hangul Syllable SWEOC"/* C24B */, /*22990*/"Hangul Syllable SWEOK"/* C24C */,/*22991*/"Hangul Syllable SWEOT"/* C24D */, /*22992*/"Hangul Syllable SWEOP"/* C24E */,/*22993*/"Hangul Syllable SWEOH"/* C24F */, /*22994*/"Hangul Syllable SWE"/* C250 */,/*22995*/"Hangul Syllable SWEG"/* C251 */, /*22996*/"Hangul Syllable SWEGG"/* C252 */,/*22997*/"Hangul Syllable SWEGS"/* C253 */, /*22998*/"Hangul Syllable SWEN"/* C254 */,/*22999*/"Hangul Syllable SWENJ"/* C255 */, /*23000*/"Hangul Syllable SWENH"/* C256 */,/*23001*/"Hangul Syllable SWED"/* C257 */, /*23002*/"Hangul Syllable SWEL"/* C258 */,/*23003*/"Hangul Syllable SWELG"/* C259 */, /*23004*/"Hangul Syllable SWELM"/* C25A */,/*23005*/"Hangul Syllable SWELB"/* C25B */, /*23006*/"Hangul Syllable SWELS"/* C25C */,/*23007*/"Hangul Syllable SWELT"/* C25D */, /*23008*/"Hangul Syllable SWELP"/* C25E */,/*23009*/"Hangul Syllable SWELH"/* C25F */, /*23010*/"Hangul Syllable SWEM"/* C260 */,/*23011*/"Hangul Syllable SWEB"/* C261 */, /*23012*/"Hangul Syllable SWEBS"/* C262 */,/*23013*/"Hangul Syllable SWES"/* C263 */, /*23014*/"Hangul Syllable SWESS"/* C264 */,/*23015*/"Hangul Syllable SWENG"/* C265 */, /*23016*/"Hangul Syllable SWEJ"/* C266 */,/*23017*/"Hangul Syllable SWEC"/* C267 */, /*23018*/"Hangul Syllable SWEK"/* C268 */,/*23019*/"Hangul Syllable SWET"/* C269 */, /*23020*/"Hangul Syllable SWEP"/* C26A */,/*23021*/"Hangul Syllable SWEH"/* C26B */, /*23022*/"Hangul Syllable SWI"/* C26C */,/*23023*/"Hangul Syllable SWIG"/* C26D */, /*23024*/"Hangul Syllable SWIGG"/* C26E */,/*23025*/"Hangul Syllable SWIGS"/* C26F */, /*23026*/"Hangul Syllable SWIN"/* C270 */,/*23027*/"Hangul Syllable SWINJ"/* C271 */, /*23028*/"Hangul Syllable SWINH"/* C272 */,/*23029*/"Hangul Syllable SWID"/* C273 */, /*23030*/"Hangul Syllable SWIL"/* C274 */,/*23031*/"Hangul Syllable SWILG"/* C275 */, /*23032*/"Hangul Syllable SWILM"/* C276 */,/*23033*/"Hangul Syllable SWILB"/* C277 */, /*23034*/"Hangul Syllable SWILS"/* C278 */,/*23035*/"Hangul Syllable SWILT"/* C279 */, /*23036*/"Hangul Syllable SWILP"/* C27A */,/*23037*/"Hangul Syllable SWILH"/* C27B */, /*23038*/"Hangul Syllable SWIM"/* C27C */,/*23039*/"Hangul Syllable SWIB"/* C27D */, /*23040*/"Hangul Syllable SWIBS"/* C27E */,/*23041*/"Hangul Syllable SWIS"/* C27F */, /*23042*/"Hangul Syllable SWISS"/* C280 */,/*23043*/"Hangul Syllable SWING"/* C281 */, /*23044*/"Hangul Syllable SWIJ"/* C282 */,/*23045*/"Hangul Syllable SWIC"/* C283 */, /*23046*/"Hangul Syllable SWIK"/* C284 */,/*23047*/"Hangul Syllable SWIT"/* C285 */, /*23048*/"Hangul Syllable SWIP"/* C286 */,/*23049*/"Hangul Syllable SWIH"/* C287 */, /*23050*/"Hangul Syllable SYU"/* C288 */,/*23051*/"Hangul Syllable SYUG"/* C289 */, /*23052*/"Hangul Syllable SYUGG"/* C28A */,/*23053*/"Hangul Syllable SYUGS"/* C28B */, /*23054*/"Hangul Syllable SYUN"/* C28C */,/*23055*/"Hangul Syllable SYUNJ"/* C28D */, /*23056*/"Hangul Syllable SYUNH"/* C28E */,/*23057*/"Hangul Syllable SYUD"/* C28F */, /*23058*/"Hangul Syllable SYUL"/* C290 */,/*23059*/"Hangul Syllable SYULG"/* C291 */, /*23060*/"Hangul Syllable SYULM"/* C292 */,/*23061*/"Hangul Syllable SYULB"/* C293 */, /*23062*/"Hangul Syllable SYULS"/* C294 */,/*23063*/"Hangul Syllable SYULT"/* C295 */, /*23064*/"Hangul Syllable SYULP"/* C296 */,/*23065*/"Hangul Syllable SYULH"/* C297 */, /*23066*/"Hangul Syllable SYUM"/* C298 */,/*23067*/"Hangul Syllable SYUB"/* C299 */, /*23068*/"Hangul Syllable SYUBS"/* C29A */,/*23069*/"Hangul Syllable SYUS"/* C29B */, /*23070*/"Hangul Syllable SYUSS"/* C29C */,/*23071*/"Hangul Syllable SYUNG"/* C29D */, /*23072*/"Hangul Syllable SYUJ"/* C29E */,/*23073*/"Hangul Syllable SYUC"/* C29F */, /*23074*/"Hangul Syllable SYUK"/* C2A0 */,/*23075*/"Hangul Syllable SYUT"/* C2A1 */, /*23076*/"Hangul Syllable SYUP"/* C2A2 */,/*23077*/"Hangul Syllable SYUH"/* C2A3 */, /*23078*/"Hangul Syllable SEU"/* C2A4 */,/*23079*/"Hangul Syllable SEUG"/* C2A5 */, /*23080*/"Hangul Syllable SEUGG"/* C2A6 */,/*23081*/"Hangul Syllable SEUGS"/* C2A7 */, /*23082*/"Hangul Syllable SEUN"/* C2A8 */,/*23083*/"Hangul Syllable SEUNJ"/* C2A9 */, /*23084*/"Hangul Syllable SEUNH"/* C2AA */,/*23085*/"Hangul Syllable SEUD"/* C2AB */, /*23086*/"Hangul Syllable SEUL"/* C2AC */,/*23087*/"Hangul Syllable SEULG"/* C2AD */, /*23088*/"Hangul Syllable SEULM"/* C2AE */,/*23089*/"Hangul Syllable SEULB"/* C2AF */, /*23090*/"Hangul Syllable SEULS"/* C2B0 */,/*23091*/"Hangul Syllable SEULT"/* C2B1 */, /*23092*/"Hangul Syllable SEULP"/* C2B2 */,/*23093*/"Hangul Syllable SEULH"/* C2B3 */, /*23094*/"Hangul Syllable SEUM"/* C2B4 */,/*23095*/"Hangul Syllable SEUB"/* C2B5 */, /*23096*/"Hangul Syllable SEUBS"/* C2B6 */,/*23097*/"Hangul Syllable SEUS"/* C2B7 */, /*23098*/"Hangul Syllable SEUSS"/* C2B8 */,/*23099*/"Hangul Syllable SEUNG"/* C2B9 */, /*23100*/"Hangul Syllable SEUJ"/* C2BA */,/*23101*/"Hangul Syllable SEUC"/* C2BB */, /*23102*/"Hangul Syllable SEUK"/* C2BC */,/*23103*/"Hangul Syllable SEUT"/* C2BD */, /*23104*/"Hangul Syllable SEUP"/* C2BE */,/*23105*/"Hangul Syllable SEUH"/* C2BF */, /*23106*/"Hangul Syllable SYI"/* C2C0 */,/*23107*/"Hangul Syllable SYIG"/* C2C1 */, /*23108*/"Hangul Syllable SYIGG"/* C2C2 */,/*23109*/"Hangul Syllable SYIGS"/* C2C3 */, /*23110*/"Hangul Syllable SYIN"/* C2C4 */,/*23111*/"Hangul Syllable SYINJ"/* C2C5 */, /*23112*/"Hangul Syllable SYINH"/* C2C6 */,/*23113*/"Hangul Syllable SYID"/* C2C7 */, /*23114*/"Hangul Syllable SYIL"/* C2C8 */,/*23115*/"Hangul Syllable SYILG"/* C2C9 */, /*23116*/"Hangul Syllable SYILM"/* C2CA */,/*23117*/"Hangul Syllable SYILB"/* C2CB */, /*23118*/"Hangul Syllable SYILS"/* C2CC */,/*23119*/"Hangul Syllable SYILT"/* C2CD */, /*23120*/"Hangul Syllable SYILP"/* C2CE */,/*23121*/"Hangul Syllable SYILH"/* C2CF */, /*23122*/"Hangul Syllable SYIM"/* C2D0 */,/*23123*/"Hangul Syllable SYIB"/* C2D1 */, /*23124*/"Hangul Syllable SYIBS"/* C2D2 */,/*23125*/"Hangul Syllable SYIS"/* C2D3 */, /*23126*/"Hangul Syllable SYISS"/* C2D4 */,/*23127*/"Hangul Syllable SYING"/* C2D5 */, /*23128*/"Hangul Syllable SYIJ"/* C2D6 */,/*23129*/"Hangul Syllable SYIC"/* C2D7 */, /*23130*/"Hangul Syllable SYIK"/* C2D8 */,/*23131*/"Hangul Syllable SYIT"/* C2D9 */, /*23132*/"Hangul Syllable SYIP"/* C2DA */,/*23133*/"Hangul Syllable SYIH"/* C2DB */, /*23134*/"Hangul Syllable SI"/* C2DC */,/*23135*/"Hangul Syllable SIG"/* C2DD */, /*23136*/"Hangul Syllable SIGG"/* C2DE */,/*23137*/"Hangul Syllable SIGS"/* C2DF */, /*23138*/"Hangul Syllable SIN"/* C2E0 */,/*23139*/"Hangul Syllable SINJ"/* C2E1 */, /*23140*/"Hangul Syllable SINH"/* C2E2 */,/*23141*/"Hangul Syllable SID"/* C2E3 */, /*23142*/"Hangul Syllable SIL"/* C2E4 */,/*23143*/"Hangul Syllable SILG"/* C2E5 */, /*23144*/"Hangul Syllable SILM"/* C2E6 */,/*23145*/"Hangul Syllable SILB"/* C2E7 */, /*23146*/"Hangul Syllable SILS"/* C2E8 */,/*23147*/"Hangul Syllable SILT"/* C2E9 */, /*23148*/"Hangul Syllable SILP"/* C2EA */,/*23149*/"Hangul Syllable SILH"/* C2EB */, /*23150*/"Hangul Syllable SIM"/* C2EC */,/*23151*/"Hangul Syllable SIB"/* C2ED */, /*23152*/"Hangul Syllable SIBS"/* C2EE */,/*23153*/"Hangul Syllable SIS"/* C2EF */, /*23154*/"Hangul Syllable SISS"/* C2F0 */,/*23155*/"Hangul Syllable SING"/* C2F1 */, /*23156*/"Hangul Syllable SIJ"/* C2F2 */,/*23157*/"Hangul Syllable SIC"/* C2F3 */, /*23158*/"Hangul Syllable SIK"/* C2F4 */,/*23159*/"Hangul Syllable SIT"/* C2F5 */, /*23160*/"Hangul Syllable SIP"/* C2F6 */,/*23161*/"Hangul Syllable SIH"/* C2F7 */, /*23162*/"Hangul Syllable SSA"/* C2F8 */,/*23163*/"Hangul Syllable SSAG"/* C2F9 */, /*23164*/"Hangul Syllable SSAGG"/* C2FA */,/*23165*/"Hangul Syllable SSAGS"/* C2FB */, /*23166*/"Hangul Syllable SSAN"/* C2FC */,/*23167*/"Hangul Syllable SSANJ"/* C2FD */, /*23168*/"Hangul Syllable SSANH"/* C2FE */,/*23169*/"Hangul Syllable SSAD"/* C2FF */, /*23170*/"Hangul Syllable SSAL"/* C300 */,/*23171*/"Hangul Syllable SSALG"/* C301 */, /*23172*/"Hangul Syllable SSALM"/* C302 */,/*23173*/"Hangul Syllable SSALB"/* C303 */, /*23174*/"Hangul Syllable SSALS"/* C304 */,/*23175*/"Hangul Syllable SSALT"/* C305 */, /*23176*/"Hangul Syllable SSALP"/* C306 */,/*23177*/"Hangul Syllable SSALH"/* C307 */, /*23178*/"Hangul Syllable SSAM"/* C308 */,/*23179*/"Hangul Syllable SSAB"/* C309 */, /*23180*/"Hangul Syllable SSABS"/* C30A */,/*23181*/"Hangul Syllable SSAS"/* C30B */, /*23182*/"Hangul Syllable SSASS"/* C30C */,/*23183*/"Hangul Syllable SSANG"/* C30D */, /*23184*/"Hangul Syllable SSAJ"/* C30E */,/*23185*/"Hangul Syllable SSAC"/* C30F */, /*23186*/"Hangul Syllable SSAK"/* C310 */,/*23187*/"Hangul Syllable SSAT"/* C311 */, /*23188*/"Hangul Syllable SSAP"/* C312 */,/*23189*/"Hangul Syllable SSAH"/* C313 */, /*23190*/"Hangul Syllable SSAE"/* C314 */,/*23191*/"Hangul Syllable SSAEG"/* C315 */, /*23192*/"Hangul Syllable SSAEGG"/* C316 */,/*23193*/"Hangul Syllable SSAEGS"/* C317 */, /*23194*/"Hangul Syllable SSAEN"/* C318 */,/*23195*/"Hangul Syllable SSAENJ"/* C319 */, /*23196*/"Hangul Syllable SSAENH"/* C31A */,/*23197*/"Hangul Syllable SSAED"/* C31B */, /*23198*/"Hangul Syllable SSAEL"/* C31C */,/*23199*/"Hangul Syllable SSAELG"/* C31D */, /*23200*/"Hangul Syllable SSAELM"/* C31E */,/*23201*/"Hangul Syllable SSAELB"/* C31F */, /*23202*/"Hangul Syllable SSAELS"/* C320 */,/*23203*/"Hangul Syllable SSAELT"/* C321 */, /*23204*/"Hangul Syllable SSAELP"/* C322 */,/*23205*/"Hangul Syllable SSAELH"/* C323 */, /*23206*/"Hangul Syllable SSAEM"/* C324 */,/*23207*/"Hangul Syllable SSAEB"/* C325 */, /*23208*/"Hangul Syllable SSAEBS"/* C326 */,/*23209*/"Hangul Syllable SSAES"/* C327 */, /*23210*/"Hangul Syllable SSAESS"/* C328 */,/*23211*/"Hangul Syllable SSAENG"/* C329 */, /*23212*/"Hangul Syllable SSAEJ"/* C32A */,/*23213*/"Hangul Syllable SSAEC"/* C32B */, /*23214*/"Hangul Syllable SSAEK"/* C32C */,/*23215*/"Hangul Syllable SSAET"/* C32D */, /*23216*/"Hangul Syllable SSAEP"/* C32E */,/*23217*/"Hangul Syllable SSAEH"/* C32F */, /*23218*/"Hangul Syllable SSYA"/* C330 */,/*23219*/"Hangul Syllable SSYAG"/* C331 */, /*23220*/"Hangul Syllable SSYAGG"/* C332 */,/*23221*/"Hangul Syllable SSYAGS"/* C333 */, /*23222*/"Hangul Syllable SSYAN"/* C334 */,/*23223*/"Hangul Syllable SSYANJ"/* C335 */, /*23224*/"Hangul Syllable SSYANH"/* C336 */,/*23225*/"Hangul Syllable SSYAD"/* C337 */, /*23226*/"Hangul Syllable SSYAL"/* C338 */,/*23227*/"Hangul Syllable SSYALG"/* C339 */, /*23228*/"Hangul Syllable SSYALM"/* C33A */,/*23229*/"Hangul Syllable SSYALB"/* C33B */, /*23230*/"Hangul Syllable SSYALS"/* C33C */,/*23231*/"Hangul Syllable SSYALT"/* C33D */, /*23232*/"Hangul Syllable SSYALP"/* C33E */,/*23233*/"Hangul Syllable SSYALH"/* C33F */, /*23234*/"Hangul Syllable SSYAM"/* C340 */,/*23235*/"Hangul Syllable SSYAB"/* C341 */, /*23236*/"Hangul Syllable SSYABS"/* C342 */,/*23237*/"Hangul Syllable SSYAS"/* C343 */, /*23238*/"Hangul Syllable SSYASS"/* C344 */,/*23239*/"Hangul Syllable SSYANG"/* C345 */, /*23240*/"Hangul Syllable SSYAJ"/* C346 */,/*23241*/"Hangul Syllable SSYAC"/* C347 */, /*23242*/"Hangul Syllable SSYAK"/* C348 */,/*23243*/"Hangul Syllable SSYAT"/* C349 */, /*23244*/"Hangul Syllable SSYAP"/* C34A */,/*23245*/"Hangul Syllable SSYAH"/* C34B */, /*23246*/"Hangul Syllable SSYAE"/* C34C */,/*23247*/"Hangul Syllable SSYAEG"/* C34D */, /*23248*/"Hangul Syllable SSYAEGG"/* C34E */,/*23249*/"Hangul Syllable SSYAEGS"/* C34F */, /*23250*/"Hangul Syllable SSYAEN"/* C350 */,/*23251*/"Hangul Syllable SSYAENJ"/* C351 */, /*23252*/"Hangul Syllable SSYAENH"/* C352 */,/*23253*/"Hangul Syllable SSYAED"/* C353 */, /*23254*/"Hangul Syllable SSYAEL"/* C354 */,/*23255*/"Hangul Syllable SSYAELG"/* C355 */, /*23256*/"Hangul Syllable SSYAELM"/* C356 */,/*23257*/"Hangul Syllable SSYAELB"/* C357 */, /*23258*/"Hangul Syllable SSYAELS"/* C358 */,/*23259*/"Hangul Syllable SSYAELT"/* C359 */, /*23260*/"Hangul Syllable SSYAELP"/* C35A */,/*23261*/"Hangul Syllable SSYAELH"/* C35B */, /*23262*/"Hangul Syllable SSYAEM"/* C35C */,/*23263*/"Hangul Syllable SSYAEB"/* C35D */, /*23264*/"Hangul Syllable SSYAEBS"/* C35E */,/*23265*/"Hangul Syllable SSYAES"/* C35F */, /*23266*/"Hangul Syllable SSYAESS"/* C360 */,/*23267*/"Hangul Syllable SSYAENG"/* C361 */, /*23268*/"Hangul Syllable SSYAEJ"/* C362 */,/*23269*/"Hangul Syllable SSYAEC"/* C363 */, /*23270*/"Hangul Syllable SSYAEK"/* C364 */,/*23271*/"Hangul Syllable SSYAET"/* C365 */, /*23272*/"Hangul Syllable SSYAEP"/* C366 */,/*23273*/"Hangul Syllable SSYAEH"/* C367 */, /*23274*/"Hangul Syllable SSEO"/* C368 */,/*23275*/"Hangul Syllable SSEOG"/* C369 */, /*23276*/"Hangul Syllable SSEOGG"/* C36A */,/*23277*/"Hangul Syllable SSEOGS"/* C36B */, /*23278*/"Hangul Syllable SSEON"/* C36C */,/*23279*/"Hangul Syllable SSEONJ"/* C36D */, /*23280*/"Hangul Syllable SSEONH"/* C36E */,/*23281*/"Hangul Syllable SSEOD"/* C36F */, /*23282*/"Hangul Syllable SSEOL"/* C370 */,/*23283*/"Hangul Syllable SSEOLG"/* C371 */, /*23284*/"Hangul Syllable SSEOLM"/* C372 */,/*23285*/"Hangul Syllable SSEOLB"/* C373 */, /*23286*/"Hangul Syllable SSEOLS"/* C374 */,/*23287*/"Hangul Syllable SSEOLT"/* C375 */, /*23288*/"Hangul Syllable SSEOLP"/* C376 */,/*23289*/"Hangul Syllable SSEOLH"/* C377 */, /*23290*/"Hangul Syllable SSEOM"/* C378 */,/*23291*/"Hangul Syllable SSEOB"/* C379 */, /*23292*/"Hangul Syllable SSEOBS"/* C37A */,/*23293*/"Hangul Syllable SSEOS"/* C37B */, /*23294*/"Hangul Syllable SSEOSS"/* C37C */,/*23295*/"Hangul Syllable SSEONG"/* C37D */, /*23296*/"Hangul Syllable SSEOJ"/* C37E */,/*23297*/"Hangul Syllable SSEOC"/* C37F */, /*23298*/"Hangul Syllable SSEOK"/* C380 */,/*23299*/"Hangul Syllable SSEOT"/* C381 */, /*23300*/"Hangul Syllable SSEOP"/* C382 */,/*23301*/"Hangul Syllable SSEOH"/* C383 */, /*23302*/"Hangul Syllable SSE"/* C384 */,/*23303*/"Hangul Syllable SSEG"/* C385 */, /*23304*/"Hangul Syllable SSEGG"/* C386 */,/*23305*/"Hangul Syllable SSEGS"/* C387 */, /*23306*/"Hangul Syllable SSEN"/* C388 */,/*23307*/"Hangul Syllable SSENJ"/* C389 */, /*23308*/"Hangul Syllable SSENH"/* C38A */,/*23309*/"Hangul Syllable SSED"/* C38B */, /*23310*/"Hangul Syllable SSEL"/* C38C */,/*23311*/"Hangul Syllable SSELG"/* C38D */, /*23312*/"Hangul Syllable SSELM"/* C38E */,/*23313*/"Hangul Syllable SSELB"/* C38F */, /*23314*/"Hangul Syllable SSELS"/* C390 */,/*23315*/"Hangul Syllable SSELT"/* C391 */, /*23316*/"Hangul Syllable SSELP"/* C392 */,/*23317*/"Hangul Syllable SSELH"/* C393 */, /*23318*/"Hangul Syllable SSEM"/* C394 */,/*23319*/"Hangul Syllable SSEB"/* C395 */, /*23320*/"Hangul Syllable SSEBS"/* C396 */,/*23321*/"Hangul Syllable SSES"/* C397 */, /*23322*/"Hangul Syllable SSESS"/* C398 */,/*23323*/"Hangul Syllable SSENG"/* C399 */, /*23324*/"Hangul Syllable SSEJ"/* C39A */,/*23325*/"Hangul Syllable SSEC"/* C39B */, /*23326*/"Hangul Syllable SSEK"/* C39C */,/*23327*/"Hangul Syllable SSET"/* C39D */, /*23328*/"Hangul Syllable SSEP"/* C39E */,/*23329*/"Hangul Syllable SSEH"/* C39F */, /*23330*/"Hangul Syllable SSYEO"/* C3A0 */,/*23331*/"Hangul Syllable SSYEOG"/* C3A1 */, /*23332*/"Hangul Syllable SSYEOGG"/* C3A2 */,/*23333*/"Hangul Syllable SSYEOGS"/* C3A3 */, /*23334*/"Hangul Syllable SSYEON"/* C3A4 */,/*23335*/"Hangul Syllable SSYEONJ"/* C3A5 */, /*23336*/"Hangul Syllable SSYEONH"/* C3A6 */,/*23337*/"Hangul Syllable SSYEOD"/* C3A7 */, /*23338*/"Hangul Syllable SSYEOL"/* C3A8 */,/*23339*/"Hangul Syllable SSYEOLG"/* C3A9 */, /*23340*/"Hangul Syllable SSYEOLM"/* C3AA */,/*23341*/"Hangul Syllable SSYEOLB"/* C3AB */, /*23342*/"Hangul Syllable SSYEOLS"/* C3AC */,/*23343*/"Hangul Syllable SSYEOLT"/* C3AD */, /*23344*/"Hangul Syllable SSYEOLP"/* C3AE */,/*23345*/"Hangul Syllable SSYEOLH"/* C3AF */, /*23346*/"Hangul Syllable SSYEOM"/* C3B0 */,/*23347*/"Hangul Syllable SSYEOB"/* C3B1 */, /*23348*/"Hangul Syllable SSYEOBS"/* C3B2 */,/*23349*/"Hangul Syllable SSYEOS"/* C3B3 */, /*23350*/"Hangul Syllable SSYEOSS"/* C3B4 */,/*23351*/"Hangul Syllable SSYEONG"/* C3B5 */, /*23352*/"Hangul Syllable SSYEOJ"/* C3B6 */,/*23353*/"Hangul Syllable SSYEOC"/* C3B7 */, /*23354*/"Hangul Syllable SSYEOK"/* C3B8 */,/*23355*/"Hangul Syllable SSYEOT"/* C3B9 */, /*23356*/"Hangul Syllable SSYEOP"/* C3BA */,/*23357*/"Hangul Syllable SSYEOH"/* C3BB */, /*23358*/"Hangul Syllable SSYE"/* C3BC */,/*23359*/"Hangul Syllable SSYEG"/* C3BD */, /*23360*/"Hangul Syllable SSYEGG"/* C3BE */,/*23361*/"Hangul Syllable SSYEGS"/* C3BF */, /*23362*/"Hangul Syllable SSYEN"/* C3C0 */,/*23363*/"Hangul Syllable SSYENJ"/* C3C1 */, /*23364*/"Hangul Syllable SSYENH"/* C3C2 */,/*23365*/"Hangul Syllable SSYED"/* C3C3 */, /*23366*/"Hangul Syllable SSYEL"/* C3C4 */,/*23367*/"Hangul Syllable SSYELG"/* C3C5 */, /*23368*/"Hangul Syllable SSYELM"/* C3C6 */,/*23369*/"Hangul Syllable SSYELB"/* C3C7 */, /*23370*/"Hangul Syllable SSYELS"/* C3C8 */,/*23371*/"Hangul Syllable SSYELT"/* C3C9 */, /*23372*/"Hangul Syllable SSYELP"/* C3CA */,/*23373*/"Hangul Syllable SSYELH"/* C3CB */, /*23374*/"Hangul Syllable SSYEM"/* C3CC */,/*23375*/"Hangul Syllable SSYEB"/* C3CD */, /*23376*/"Hangul Syllable SSYEBS"/* C3CE */,/*23377*/"Hangul Syllable SSYES"/* C3CF */, /*23378*/"Hangul Syllable SSYESS"/* C3D0 */,/*23379*/"Hangul Syllable SSYENG"/* C3D1 */, /*23380*/"Hangul Syllable SSYEJ"/* C3D2 */,/*23381*/"Hangul Syllable SSYEC"/* C3D3 */, /*23382*/"Hangul Syllable SSYEK"/* C3D4 */,/*23383*/"Hangul Syllable SSYET"/* C3D5 */, /*23384*/"Hangul Syllable SSYEP"/* C3D6 */,/*23385*/"Hangul Syllable SSYEH"/* C3D7 */, /*23386*/"Hangul Syllable SSO"/* C3D8 */,/*23387*/"Hangul Syllable SSOG"/* C3D9 */, /*23388*/"Hangul Syllable SSOGG"/* C3DA */,/*23389*/"Hangul Syllable SSOGS"/* C3DB */, /*23390*/"Hangul Syllable SSON"/* C3DC */,/*23391*/"Hangul Syllable SSONJ"/* C3DD */, /*23392*/"Hangul Syllable SSONH"/* C3DE */,/*23393*/"Hangul Syllable SSOD"/* C3DF */, /*23394*/"Hangul Syllable SSOL"/* C3E0 */,/*23395*/"Hangul Syllable SSOLG"/* C3E1 */, /*23396*/"Hangul Syllable SSOLM"/* C3E2 */,/*23397*/"Hangul Syllable SSOLB"/* C3E3 */, /*23398*/"Hangul Syllable SSOLS"/* C3E4 */,/*23399*/"Hangul Syllable SSOLT"/* C3E5 */, /*23400*/"Hangul Syllable SSOLP"/* C3E6 */,/*23401*/"Hangul Syllable SSOLH"/* C3E7 */, /*23402*/"Hangul Syllable SSOM"/* C3E8 */,/*23403*/"Hangul Syllable SSOB"/* C3E9 */, /*23404*/"Hangul Syllable SSOBS"/* C3EA */,/*23405*/"Hangul Syllable SSOS"/* C3EB */, /*23406*/"Hangul Syllable SSOSS"/* C3EC */,/*23407*/"Hangul Syllable SSONG"/* C3ED */, /*23408*/"Hangul Syllable SSOJ"/* C3EE */,/*23409*/"Hangul Syllable SSOC"/* C3EF */, /*23410*/"Hangul Syllable SSOK"/* C3F0 */,/*23411*/"Hangul Syllable SSOT"/* C3F1 */, /*23412*/"Hangul Syllable SSOP"/* C3F2 */,/*23413*/"Hangul Syllable SSOH"/* C3F3 */, /*23414*/"Hangul Syllable SSWA"/* C3F4 */,/*23415*/"Hangul Syllable SSWAG"/* C3F5 */, /*23416*/"Hangul Syllable SSWAGG"/* C3F6 */,/*23417*/"Hangul Syllable SSWAGS"/* C3F7 */, /*23418*/"Hangul Syllable SSWAN"/* C3F8 */,/*23419*/"Hangul Syllable SSWANJ"/* C3F9 */, /*23420*/"Hangul Syllable SSWANH"/* C3FA */,/*23421*/"Hangul Syllable SSWAD"/* C3FB */, /*23422*/"Hangul Syllable SSWAL"/* C3FC */,/*23423*/"Hangul Syllable SSWALG"/* C3FD */, /*23424*/"Hangul Syllable SSWALM"/* C3FE */,/*23425*/"Hangul Syllable SSWALB"/* C3FF */, /*23426*/"Hangul Syllable SSWALS"/* C400 */,/*23427*/"Hangul Syllable SSWALT"/* C401 */, /*23428*/"Hangul Syllable SSWALP"/* C402 */,/*23429*/"Hangul Syllable SSWALH"/* C403 */, /*23430*/"Hangul Syllable SSWAM"/* C404 */,/*23431*/"Hangul Syllable SSWAB"/* C405 */, /*23432*/"Hangul Syllable SSWABS"/* C406 */,/*23433*/"Hangul Syllable SSWAS"/* C407 */, /*23434*/"Hangul Syllable SSWASS"/* C408 */,/*23435*/"Hangul Syllable SSWANG"/* C409 */, /*23436*/"Hangul Syllable SSWAJ"/* C40A */,/*23437*/"Hangul Syllable SSWAC"/* C40B */, /*23438*/"Hangul Syllable SSWAK"/* C40C */,/*23439*/"Hangul Syllable SSWAT"/* C40D */, /*23440*/"Hangul Syllable SSWAP"/* C40E */,/*23441*/"Hangul Syllable SSWAH"/* C40F */, /*23442*/"Hangul Syllable SSWAE"/* C410 */,/*23443*/"Hangul Syllable SSWAEG"/* C411 */, /*23444*/"Hangul Syllable SSWAEGG"/* C412 */,/*23445*/"Hangul Syllable SSWAEGS"/* C413 */, /*23446*/"Hangul Syllable SSWAEN"/* C414 */,/*23447*/"Hangul Syllable SSWAENJ"/* C415 */, /*23448*/"Hangul Syllable SSWAENH"/* C416 */,/*23449*/"Hangul Syllable SSWAED"/* C417 */, /*23450*/"Hangul Syllable SSWAEL"/* C418 */,/*23451*/"Hangul Syllable SSWAELG"/* C419 */, /*23452*/"Hangul Syllable SSWAELM"/* C41A */,/*23453*/"Hangul Syllable SSWAELB"/* C41B */, /*23454*/"Hangul Syllable SSWAELS"/* C41C */,/*23455*/"Hangul Syllable SSWAELT"/* C41D */, /*23456*/"Hangul Syllable SSWAELP"/* C41E */,/*23457*/"Hangul Syllable SSWAELH"/* C41F */, /*23458*/"Hangul Syllable SSWAEM"/* C420 */,/*23459*/"Hangul Syllable SSWAEB"/* C421 */, /*23460*/"Hangul Syllable SSWAEBS"/* C422 */,/*23461*/"Hangul Syllable SSWAES"/* C423 */, /*23462*/"Hangul Syllable SSWAESS"/* C424 */,/*23463*/"Hangul Syllable SSWAENG"/* C425 */, /*23464*/"Hangul Syllable SSWAEJ"/* C426 */,/*23465*/"Hangul Syllable SSWAEC"/* C427 */, /*23466*/"Hangul Syllable SSWAEK"/* C428 */,/*23467*/"Hangul Syllable SSWAET"/* C429 */, /*23468*/"Hangul Syllable SSWAEP"/* C42A */,/*23469*/"Hangul Syllable SSWAEH"/* C42B */, /*23470*/"Hangul Syllable SSOE"/* C42C */,/*23471*/"Hangul Syllable SSOEG"/* C42D */, /*23472*/"Hangul Syllable SSOEGG"/* C42E */,/*23473*/"Hangul Syllable SSOEGS"/* C42F */, /*23474*/"Hangul Syllable SSOEN"/* C430 */,/*23475*/"Hangul Syllable SSOENJ"/* C431 */, /*23476*/"Hangul Syllable SSOENH"/* C432 */,/*23477*/"Hangul Syllable SSOED"/* C433 */, /*23478*/"Hangul Syllable SSOEL"/* C434 */,/*23479*/"Hangul Syllable SSOELG"/* C435 */, /*23480*/"Hangul Syllable SSOELM"/* C436 */,/*23481*/"Hangul Syllable SSOELB"/* C437 */, /*23482*/"Hangul Syllable SSOELS"/* C438 */,/*23483*/"Hangul Syllable SSOELT"/* C439 */, /*23484*/"Hangul Syllable SSOELP"/* C43A */,/*23485*/"Hangul Syllable SSOELH"/* C43B */, /*23486*/"Hangul Syllable SSOEM"/* C43C */,/*23487*/"Hangul Syllable SSOEB"/* C43D */, /*23488*/"Hangul Syllable SSOEBS"/* C43E */,/*23489*/"Hangul Syllable SSOES"/* C43F */, /*23490*/"Hangul Syllable SSOESS"/* C440 */,/*23491*/"Hangul Syllable SSOENG"/* C441 */, /*23492*/"Hangul Syllable SSOEJ"/* C442 */,/*23493*/"Hangul Syllable SSOEC"/* C443 */, /*23494*/"Hangul Syllable SSOEK"/* C444 */,/*23495*/"Hangul Syllable SSOET"/* C445 */, /*23496*/"Hangul Syllable SSOEP"/* C446 */,/*23497*/"Hangul Syllable SSOEH"/* C447 */, /*23498*/"Hangul Syllable SSYO"/* C448 */,/*23499*/"Hangul Syllable SSYOG"/* C449 */, /*23500*/"Hangul Syllable SSYOGG"/* C44A */,/*23501*/"Hangul Syllable SSYOGS"/* C44B */, /*23502*/"Hangul Syllable SSYON"/* C44C */,/*23503*/"Hangul Syllable SSYONJ"/* C44D */, /*23504*/"Hangul Syllable SSYONH"/* C44E */,/*23505*/"Hangul Syllable SSYOD"/* C44F */, /*23506*/"Hangul Syllable SSYOL"/* C450 */,/*23507*/"Hangul Syllable SSYOLG"/* C451 */, /*23508*/"Hangul Syllable SSYOLM"/* C452 */,/*23509*/"Hangul Syllable SSYOLB"/* C453 */, /*23510*/"Hangul Syllable SSYOLS"/* C454 */,/*23511*/"Hangul Syllable SSYOLT"/* C455 */, /*23512*/"Hangul Syllable SSYOLP"/* C456 */,/*23513*/"Hangul Syllable SSYOLH"/* C457 */, /*23514*/"Hangul Syllable SSYOM"/* C458 */,/*23515*/"Hangul Syllable SSYOB"/* C459 */, /*23516*/"Hangul Syllable SSYOBS"/* C45A */,/*23517*/"Hangul Syllable SSYOS"/* C45B */, /*23518*/"Hangul Syllable SSYOSS"/* C45C */,/*23519*/"Hangul Syllable SSYONG"/* C45D */, /*23520*/"Hangul Syllable SSYOJ"/* C45E */,/*23521*/"Hangul Syllable SSYOC"/* C45F */, /*23522*/"Hangul Syllable SSYOK"/* C460 */,/*23523*/"Hangul Syllable SSYOT"/* C461 */, /*23524*/"Hangul Syllable SSYOP"/* C462 */,/*23525*/"Hangul Syllable SSYOH"/* C463 */, /*23526*/"Hangul Syllable SSU"/* C464 */,/*23527*/"Hangul Syllable SSUG"/* C465 */, /*23528*/"Hangul Syllable SSUGG"/* C466 */,/*23529*/"Hangul Syllable SSUGS"/* C467 */, /*23530*/"Hangul Syllable SSUN"/* C468 */,/*23531*/"Hangul Syllable SSUNJ"/* C469 */, /*23532*/"Hangul Syllable SSUNH"/* C46A */,/*23533*/"Hangul Syllable SSUD"/* C46B */, /*23534*/"Hangul Syllable SSUL"/* C46C */,/*23535*/"Hangul Syllable SSULG"/* C46D */, /*23536*/"Hangul Syllable SSULM"/* C46E */,/*23537*/"Hangul Syllable SSULB"/* C46F */, /*23538*/"Hangul Syllable SSULS"/* C470 */,/*23539*/"Hangul Syllable SSULT"/* C471 */, /*23540*/"Hangul Syllable SSULP"/* C472 */,/*23541*/"Hangul Syllable SSULH"/* C473 */, /*23542*/"Hangul Syllable SSUM"/* C474 */,/*23543*/"Hangul Syllable SSUB"/* C475 */, /*23544*/"Hangul Syllable SSUBS"/* C476 */,/*23545*/"Hangul Syllable SSUS"/* C477 */, /*23546*/"Hangul Syllable SSUSS"/* C478 */,/*23547*/"Hangul Syllable SSUNG"/* C479 */, /*23548*/"Hangul Syllable SSUJ"/* C47A */,/*23549*/"Hangul Syllable SSUC"/* C47B */, /*23550*/"Hangul Syllable SSUK"/* C47C */,/*23551*/"Hangul Syllable SSUT"/* C47D */, /*23552*/"Hangul Syllable SSUP"/* C47E */,/*23553*/"Hangul Syllable SSUH"/* C47F */, /*23554*/"Hangul Syllable SSWEO"/* C480 */,/*23555*/"Hangul Syllable SSWEOG"/* C481 */, /*23556*/"Hangul Syllable SSWEOGG"/* C482 */,/*23557*/"Hangul Syllable SSWEOGS"/* C483 */, /*23558*/"Hangul Syllable SSWEON"/* C484 */,/*23559*/"Hangul Syllable SSWEONJ"/* C485 */, /*23560*/"Hangul Syllable SSWEONH"/* C486 */,/*23561*/"Hangul Syllable SSWEOD"/* C487 */, /*23562*/"Hangul Syllable SSWEOL"/* C488 */,/*23563*/"Hangul Syllable SSWEOLG"/* C489 */, /*23564*/"Hangul Syllable SSWEOLM"/* C48A */,/*23565*/"Hangul Syllable SSWEOLB"/* C48B */, /*23566*/"Hangul Syllable SSWEOLS"/* C48C */,/*23567*/"Hangul Syllable SSWEOLT"/* C48D */, /*23568*/"Hangul Syllable SSWEOLP"/* C48E */,/*23569*/"Hangul Syllable SSWEOLH"/* C48F */, /*23570*/"Hangul Syllable SSWEOM"/* C490 */,/*23571*/"Hangul Syllable SSWEOB"/* C491 */, /*23572*/"Hangul Syllable SSWEOBS"/* C492 */,/*23573*/"Hangul Syllable SSWEOS"/* C493 */, /*23574*/"Hangul Syllable SSWEOSS"/* C494 */,/*23575*/"Hangul Syllable SSWEONG"/* C495 */, /*23576*/"Hangul Syllable SSWEOJ"/* C496 */,/*23577*/"Hangul Syllable SSWEOC"/* C497 */, /*23578*/"Hangul Syllable SSWEOK"/* C498 */,/*23579*/"Hangul Syllable SSWEOT"/* C499 */, /*23580*/"Hangul Syllable SSWEOP"/* C49A */,/*23581*/"Hangul Syllable SSWEOH"/* C49B */, /*23582*/"Hangul Syllable SSWE"/* C49C */,/*23583*/"Hangul Syllable SSWEG"/* C49D */, /*23584*/"Hangul Syllable SSWEGG"/* C49E */,/*23585*/"Hangul Syllable SSWEGS"/* C49F */, /*23586*/"Hangul Syllable SSWEN"/* C4A0 */,/*23587*/"Hangul Syllable SSWENJ"/* C4A1 */, /*23588*/"Hangul Syllable SSWENH"/* C4A2 */,/*23589*/"Hangul Syllable SSWED"/* C4A3 */, /*23590*/"Hangul Syllable SSWEL"/* C4A4 */,/*23591*/"Hangul Syllable SSWELG"/* C4A5 */, /*23592*/"Hangul Syllable SSWELM"/* C4A6 */,/*23593*/"Hangul Syllable SSWELB"/* C4A7 */, /*23594*/"Hangul Syllable SSWELS"/* C4A8 */,/*23595*/"Hangul Syllable SSWELT"/* C4A9 */, /*23596*/"Hangul Syllable SSWELP"/* C4AA */,/*23597*/"Hangul Syllable SSWELH"/* C4AB */, /*23598*/"Hangul Syllable SSWEM"/* C4AC */,/*23599*/"Hangul Syllable SSWEB"/* C4AD */, /*23600*/"Hangul Syllable SSWEBS"/* C4AE */,/*23601*/"Hangul Syllable SSWES"/* C4AF */, /*23602*/"Hangul Syllable SSWESS"/* C4B0 */,/*23603*/"Hangul Syllable SSWENG"/* C4B1 */, /*23604*/"Hangul Syllable SSWEJ"/* C4B2 */,/*23605*/"Hangul Syllable SSWEC"/* C4B3 */, /*23606*/"Hangul Syllable SSWEK"/* C4B4 */,/*23607*/"Hangul Syllable SSWET"/* C4B5 */, /*23608*/"Hangul Syllable SSWEP"/* C4B6 */,/*23609*/"Hangul Syllable SSWEH"/* C4B7 */, /*23610*/"Hangul Syllable SSWI"/* C4B8 */,/*23611*/"Hangul Syllable SSWIG"/* C4B9 */, /*23612*/"Hangul Syllable SSWIGG"/* C4BA */,/*23613*/"Hangul Syllable SSWIGS"/* C4BB */, /*23614*/"Hangul Syllable SSWIN"/* C4BC */,/*23615*/"Hangul Syllable SSWINJ"/* C4BD */, /*23616*/"Hangul Syllable SSWINH"/* C4BE */,/*23617*/"Hangul Syllable SSWID"/* C4BF */, /*23618*/"Hangul Syllable SSWIL"/* C4C0 */,/*23619*/"Hangul Syllable SSWILG"/* C4C1 */, /*23620*/"Hangul Syllable SSWILM"/* C4C2 */,/*23621*/"Hangul Syllable SSWILB"/* C4C3 */, /*23622*/"Hangul Syllable SSWILS"/* C4C4 */,/*23623*/"Hangul Syllable SSWILT"/* C4C5 */, /*23624*/"Hangul Syllable SSWILP"/* C4C6 */,/*23625*/"Hangul Syllable SSWILH"/* C4C7 */, /*23626*/"Hangul Syllable SSWIM"/* C4C8 */,/*23627*/"Hangul Syllable SSWIB"/* C4C9 */, /*23628*/"Hangul Syllable SSWIBS"/* C4CA */,/*23629*/"Hangul Syllable SSWIS"/* C4CB */, /*23630*/"Hangul Syllable SSWISS"/* C4CC */,/*23631*/"Hangul Syllable SSWING"/* C4CD */, /*23632*/"Hangul Syllable SSWIJ"/* C4CE */,/*23633*/"Hangul Syllable SSWIC"/* C4CF */, /*23634*/"Hangul Syllable SSWIK"/* C4D0 */,/*23635*/"Hangul Syllable SSWIT"/* C4D1 */, /*23636*/"Hangul Syllable SSWIP"/* C4D2 */,/*23637*/"Hangul Syllable SSWIH"/* C4D3 */, /*23638*/"Hangul Syllable SSYU"/* C4D4 */,/*23639*/"Hangul Syllable SSYUG"/* C4D5 */, /*23640*/"Hangul Syllable SSYUGG"/* C4D6 */,/*23641*/"Hangul Syllable SSYUGS"/* C4D7 */, /*23642*/"Hangul Syllable SSYUN"/* C4D8 */,/*23643*/"Hangul Syllable SSYUNJ"/* C4D9 */, /*23644*/"Hangul Syllable SSYUNH"/* C4DA */,/*23645*/"Hangul Syllable SSYUD"/* C4DB */, /*23646*/"Hangul Syllable SSYUL"/* C4DC */,/*23647*/"Hangul Syllable SSYULG"/* C4DD */, /*23648*/"Hangul Syllable SSYULM"/* C4DE */,/*23649*/"Hangul Syllable SSYULB"/* C4DF */, /*23650*/"Hangul Syllable SSYULS"/* C4E0 */,/*23651*/"Hangul Syllable SSYULT"/* C4E1 */, /*23652*/"Hangul Syllable SSYULP"/* C4E2 */,/*23653*/"Hangul Syllable SSYULH"/* C4E3 */, /*23654*/"Hangul Syllable SSYUM"/* C4E4 */,/*23655*/"Hangul Syllable SSYUB"/* C4E5 */, /*23656*/"Hangul Syllable SSYUBS"/* C4E6 */,/*23657*/"Hangul Syllable SSYUS"/* C4E7 */, /*23658*/"Hangul Syllable SSYUSS"/* C4E8 */,/*23659*/"Hangul Syllable SSYUNG"/* C4E9 */, /*23660*/"Hangul Syllable SSYUJ"/* C4EA */,/*23661*/"Hangul Syllable SSYUC"/* C4EB */, /*23662*/"Hangul Syllable SSYUK"/* C4EC */,/*23663*/"Hangul Syllable SSYUT"/* C4ED */, /*23664*/"Hangul Syllable SSYUP"/* C4EE */,/*23665*/"Hangul Syllable SSYUH"/* C4EF */, /*23666*/"Hangul Syllable SSEU"/* C4F0 */,/*23667*/"Hangul Syllable SSEUG"/* C4F1 */, /*23668*/"Hangul Syllable SSEUGG"/* C4F2 */,/*23669*/"Hangul Syllable SSEUGS"/* C4F3 */, /*23670*/"Hangul Syllable SSEUN"/* C4F4 */,/*23671*/"Hangul Syllable SSEUNJ"/* C4F5 */, /*23672*/"Hangul Syllable SSEUNH"/* C4F6 */,/*23673*/"Hangul Syllable SSEUD"/* C4F7 */, /*23674*/"Hangul Syllable SSEUL"/* C4F8 */,/*23675*/"Hangul Syllable SSEULG"/* C4F9 */, /*23676*/"Hangul Syllable SSEULM"/* C4FA */,/*23677*/"Hangul Syllable SSEULB"/* C4FB */, /*23678*/"Hangul Syllable SSEULS"/* C4FC */,/*23679*/"Hangul Syllable SSEULT"/* C4FD */, /*23680*/"Hangul Syllable SSEULP"/* C4FE */,/*23681*/"Hangul Syllable SSEULH"/* C4FF */, /*23682*/"Hangul Syllable SSEUM"/* C500 */,/*23683*/"Hangul Syllable SSEUB"/* C501 */, /*23684*/"Hangul Syllable SSEUBS"/* C502 */,/*23685*/"Hangul Syllable SSEUS"/* C503 */, /*23686*/"Hangul Syllable SSEUSS"/* C504 */,/*23687*/"Hangul Syllable SSEUNG"/* C505 */, /*23688*/"Hangul Syllable SSEUJ"/* C506 */,/*23689*/"Hangul Syllable SSEUC"/* C507 */, /*23690*/"Hangul Syllable SSEUK"/* C508 */,/*23691*/"Hangul Syllable SSEUT"/* C509 */, /*23692*/"Hangul Syllable SSEUP"/* C50A */,/*23693*/"Hangul Syllable SSEUH"/* C50B */, /*23694*/"Hangul Syllable SSYI"/* C50C */,/*23695*/"Hangul Syllable SSYIG"/* C50D */, /*23696*/"Hangul Syllable SSYIGG"/* C50E */,/*23697*/"Hangul Syllable SSYIGS"/* C50F */, /*23698*/"Hangul Syllable SSYIN"/* C510 */,/*23699*/"Hangul Syllable SSYINJ"/* C511 */, /*23700*/"Hangul Syllable SSYINH"/* C512 */,/*23701*/"Hangul Syllable SSYID"/* C513 */, /*23702*/"Hangul Syllable SSYIL"/* C514 */,/*23703*/"Hangul Syllable SSYILG"/* C515 */, /*23704*/"Hangul Syllable SSYILM"/* C516 */,/*23705*/"Hangul Syllable SSYILB"/* C517 */, /*23706*/"Hangul Syllable SSYILS"/* C518 */,/*23707*/"Hangul Syllable SSYILT"/* C519 */, /*23708*/"Hangul Syllable SSYILP"/* C51A */,/*23709*/"Hangul Syllable SSYILH"/* C51B */, /*23710*/"Hangul Syllable SSYIM"/* C51C */,/*23711*/"Hangul Syllable SSYIB"/* C51D */, /*23712*/"Hangul Syllable SSYIBS"/* C51E */,/*23713*/"Hangul Syllable SSYIS"/* C51F */, /*23714*/"Hangul Syllable SSYISS"/* C520 */,/*23715*/"Hangul Syllable SSYING"/* C521 */, /*23716*/"Hangul Syllable SSYIJ"/* C522 */,/*23717*/"Hangul Syllable SSYIC"/* C523 */, /*23718*/"Hangul Syllable SSYIK"/* C524 */,/*23719*/"Hangul Syllable SSYIT"/* C525 */, /*23720*/"Hangul Syllable SSYIP"/* C526 */,/*23721*/"Hangul Syllable SSYIH"/* C527 */, /*23722*/"Hangul Syllable SSI"/* C528 */,/*23723*/"Hangul Syllable SSIG"/* C529 */, /*23724*/"Hangul Syllable SSIGG"/* C52A */,/*23725*/"Hangul Syllable SSIGS"/* C52B */, /*23726*/"Hangul Syllable SSIN"/* C52C */,/*23727*/"Hangul Syllable SSINJ"/* C52D */, /*23728*/"Hangul Syllable SSINH"/* C52E */,/*23729*/"Hangul Syllable SSID"/* C52F */, /*23730*/"Hangul Syllable SSIL"/* C530 */,/*23731*/"Hangul Syllable SSILG"/* C531 */, /*23732*/"Hangul Syllable SSILM"/* C532 */,/*23733*/"Hangul Syllable SSILB"/* C533 */, /*23734*/"Hangul Syllable SSILS"/* C534 */,/*23735*/"Hangul Syllable SSILT"/* C535 */, /*23736*/"Hangul Syllable SSILP"/* C536 */,/*23737*/"Hangul Syllable SSILH"/* C537 */, /*23738*/"Hangul Syllable SSIM"/* C538 */,/*23739*/"Hangul Syllable SSIB"/* C539 */, /*23740*/"Hangul Syllable SSIBS"/* C53A */,/*23741*/"Hangul Syllable SSIS"/* C53B */, /*23742*/"Hangul Syllable SSISS"/* C53C */,/*23743*/"Hangul Syllable SSING"/* C53D */, /*23744*/"Hangul Syllable SSIJ"/* C53E */,/*23745*/"Hangul Syllable SSIC"/* C53F */, /*23746*/"Hangul Syllable SSIK"/* C540 */,/*23747*/"Hangul Syllable SSIT"/* C541 */, /*23748*/"Hangul Syllable SSIP"/* C542 */,/*23749*/"Hangul Syllable SSIH"/* C543 */, /*23750*/"Hangul Syllable A"/* C544 */,/*23751*/"Hangul Syllable AG"/* C545 */,/*23752*/"Hangul Syllable AGG"/* C546 */, /*23753*/"Hangul Syllable AGS"/* C547 */,/*23754*/"Hangul Syllable AN"/* C548 */, /*23755*/"Hangul Syllable ANJ"/* C549 */,/*23756*/"Hangul Syllable ANH"/* C54A */, /*23757*/"Hangul Syllable AD"/* C54B */,/*23758*/"Hangul Syllable AL"/* C54C */,/*23759*/"Hangul Syllable ALG"/* C54D */, /*23760*/"Hangul Syllable ALM"/* C54E */,/*23761*/"Hangul Syllable ALB"/* C54F */, /*23762*/"Hangul Syllable ALS"/* C550 */,/*23763*/"Hangul Syllable ALT"/* C551 */, /*23764*/"Hangul Syllable ALP"/* C552 */,/*23765*/"Hangul Syllable ALH"/* C553 */, /*23766*/"Hangul Syllable AM"/* C554 */,/*23767*/"Hangul Syllable AB"/* C555 */,/*23768*/"Hangul Syllable ABS"/* C556 */, /*23769*/"Hangul Syllable AS"/* C557 */,/*23770*/"Hangul Syllable ASS"/* C558 */, /*23771*/"Hangul Syllable ANG"/* C559 */,/*23772*/"Hangul Syllable AJ"/* C55A */,/*23773*/"Hangul Syllable AC"/* C55B */, /*23774*/"Hangul Syllable AK"/* C55C */,/*23775*/"Hangul Syllable AT"/* C55D */,/*23776*/"Hangul Syllable AP"/* C55E */, /*23777*/"Hangul Syllable AH"/* C55F */,/*23778*/"Hangul Syllable AE"/* C560 */,/*23779*/"Hangul Syllable AEG"/* C561 */, /*23780*/"Hangul Syllable AEGG"/* C562 */,/*23781*/"Hangul Syllable AEGS"/* C563 */, /*23782*/"Hangul Syllable AEN"/* C564 */,/*23783*/"Hangul Syllable AENJ"/* C565 */, /*23784*/"Hangul Syllable AENH"/* C566 */,/*23785*/"Hangul Syllable AED"/* C567 */, /*23786*/"Hangul Syllable AEL"/* C568 */,/*23787*/"Hangul Syllable AELG"/* C569 */, /*23788*/"Hangul Syllable AELM"/* C56A */,/*23789*/"Hangul Syllable AELB"/* C56B */, /*23790*/"Hangul Syllable AELS"/* C56C */,/*23791*/"Hangul Syllable AELT"/* C56D */, /*23792*/"Hangul Syllable AELP"/* C56E */,/*23793*/"Hangul Syllable AELH"/* C56F */, /*23794*/"Hangul Syllable AEM"/* C570 */,/*23795*/"Hangul Syllable AEB"/* C571 */, /*23796*/"Hangul Syllable AEBS"/* C572 */,/*23797*/"Hangul Syllable AES"/* C573 */, /*23798*/"Hangul Syllable AESS"/* C574 */,/*23799*/"Hangul Syllable AENG"/* C575 */, /*23800*/"Hangul Syllable AEJ"/* C576 */,/*23801*/"Hangul Syllable AEC"/* C577 */, /*23802*/"Hangul Syllable AEK"/* C578 */,/*23803*/"Hangul Syllable AET"/* C579 */, /*23804*/"Hangul Syllable AEP"/* C57A */,/*23805*/"Hangul Syllable AEH"/* C57B */, /*23806*/"Hangul Syllable YA"/* C57C */,/*23807*/"Hangul Syllable YAG"/* C57D */, /*23808*/"Hangul Syllable YAGG"/* C57E */,/*23809*/"Hangul Syllable YAGS"/* C57F */, /*23810*/"Hangul Syllable YAN"/* C580 */,/*23811*/"Hangul Syllable YANJ"/* C581 */, /*23812*/"Hangul Syllable YANH"/* C582 */,/*23813*/"Hangul Syllable YAD"/* C583 */, /*23814*/"Hangul Syllable YAL"/* C584 */,/*23815*/"Hangul Syllable YALG"/* C585 */, /*23816*/"Hangul Syllable YALM"/* C586 */,/*23817*/"Hangul Syllable YALB"/* C587 */, /*23818*/"Hangul Syllable YALS"/* C588 */,/*23819*/"Hangul Syllable YALT"/* C589 */, /*23820*/"Hangul Syllable YALP"/* C58A */,/*23821*/"Hangul Syllable YALH"/* C58B */, /*23822*/"Hangul Syllable YAM"/* C58C */,/*23823*/"Hangul Syllable YAB"/* C58D */, /*23824*/"Hangul Syllable YABS"/* C58E */,/*23825*/"Hangul Syllable YAS"/* C58F */, /*23826*/"Hangul Syllable YASS"/* C590 */,/*23827*/"Hangul Syllable YANG"/* C591 */, /*23828*/"Hangul Syllable YAJ"/* C592 */,/*23829*/"Hangul Syllable YAC"/* C593 */, /*23830*/"Hangul Syllable YAK"/* C594 */,/*23831*/"Hangul Syllable YAT"/* C595 */, /*23832*/"Hangul Syllable YAP"/* C596 */,/*23833*/"Hangul Syllable YAH"/* C597 */, /*23834*/"Hangul Syllable YAE"/* C598 */,/*23835*/"Hangul Syllable YAEG"/* C599 */, /*23836*/"Hangul Syllable YAEGG"/* C59A */,/*23837*/"Hangul Syllable YAEGS"/* C59B */, /*23838*/"Hangul Syllable YAEN"/* C59C */,/*23839*/"Hangul Syllable YAENJ"/* C59D */, /*23840*/"Hangul Syllable YAENH"/* C59E */,/*23841*/"Hangul Syllable YAED"/* C59F */, /*23842*/"Hangul Syllable YAEL"/* C5A0 */,/*23843*/"Hangul Syllable YAELG"/* C5A1 */, /*23844*/"Hangul Syllable YAELM"/* C5A2 */,/*23845*/"Hangul Syllable YAELB"/* C5A3 */, /*23846*/"Hangul Syllable YAELS"/* C5A4 */,/*23847*/"Hangul Syllable YAELT"/* C5A5 */, /*23848*/"Hangul Syllable YAELP"/* C5A6 */,/*23849*/"Hangul Syllable YAELH"/* C5A7 */, /*23850*/"Hangul Syllable YAEM"/* C5A8 */,/*23851*/"Hangul Syllable YAEB"/* C5A9 */, /*23852*/"Hangul Syllable YAEBS"/* C5AA */,/*23853*/"Hangul Syllable YAES"/* C5AB */, /*23854*/"Hangul Syllable YAESS"/* C5AC */,/*23855*/"Hangul Syllable YAENG"/* C5AD */, /*23856*/"Hangul Syllable YAEJ"/* C5AE */,/*23857*/"Hangul Syllable YAEC"/* C5AF */, /*23858*/"Hangul Syllable YAEK"/* C5B0 */,/*23859*/"Hangul Syllable YAET"/* C5B1 */, /*23860*/"Hangul Syllable YAEP"/* C5B2 */,/*23861*/"Hangul Syllable YAEH"/* C5B3 */, /*23862*/"Hangul Syllable EO"/* C5B4 */,/*23863*/"Hangul Syllable EOG"/* C5B5 */, /*23864*/"Hangul Syllable EOGG"/* C5B6 */,/*23865*/"Hangul Syllable EOGS"/* C5B7 */, /*23866*/"Hangul Syllable EON"/* C5B8 */,/*23867*/"Hangul Syllable EONJ"/* C5B9 */, /*23868*/"Hangul Syllable EONH"/* C5BA */,/*23869*/"Hangul Syllable EOD"/* C5BB */, /*23870*/"Hangul Syllable EOL"/* C5BC */,/*23871*/"Hangul Syllable EOLG"/* C5BD */, /*23872*/"Hangul Syllable EOLM"/* C5BE */,/*23873*/"Hangul Syllable EOLB"/* C5BF */, /*23874*/"Hangul Syllable EOLS"/* C5C0 */,/*23875*/"Hangul Syllable EOLT"/* C5C1 */, /*23876*/"Hangul Syllable EOLP"/* C5C2 */,/*23877*/"Hangul Syllable EOLH"/* C5C3 */, /*23878*/"Hangul Syllable EOM"/* C5C4 */,/*23879*/"Hangul Syllable EOB"/* C5C5 */, /*23880*/"Hangul Syllable EOBS"/* C5C6 */,/*23881*/"Hangul Syllable EOS"/* C5C7 */, /*23882*/"Hangul Syllable EOSS"/* C5C8 */,/*23883*/"Hangul Syllable EONG"/* C5C9 */, /*23884*/"Hangul Syllable EOJ"/* C5CA */,/*23885*/"Hangul Syllable EOC"/* C5CB */, /*23886*/"Hangul Syllable EOK"/* C5CC */,/*23887*/"Hangul Syllable EOT"/* C5CD */, /*23888*/"Hangul Syllable EOP"/* C5CE */,/*23889*/"Hangul Syllable EOH"/* C5CF */,/*23890*/"Hangul Syllable E"/* C5D0 */, /*23891*/"Hangul Syllable EG"/* C5D1 */,/*23892*/"Hangul Syllable EGG"/* C5D2 */, /*23893*/"Hangul Syllable EGS"/* C5D3 */,/*23894*/"Hangul Syllable EN"/* C5D4 */, /*23895*/"Hangul Syllable ENJ"/* C5D5 */,/*23896*/"Hangul Syllable ENH"/* C5D6 */, /*23897*/"Hangul Syllable ED"/* C5D7 */,/*23898*/"Hangul Syllable EL"/* C5D8 */,/*23899*/"Hangul Syllable ELG"/* C5D9 */, /*23900*/"Hangul Syllable ELM"/* C5DA */,/*23901*/"Hangul Syllable ELB"/* C5DB */, /*23902*/"Hangul Syllable ELS"/* C5DC */,/*23903*/"Hangul Syllable ELT"/* C5DD */, /*23904*/"Hangul Syllable ELP"/* C5DE */,/*23905*/"Hangul Syllable ELH"/* C5DF */, /*23906*/"Hangul Syllable EM"/* C5E0 */,/*23907*/"Hangul Syllable EB"/* C5E1 */,/*23908*/"Hangul Syllable EBS"/* C5E2 */, /*23909*/"Hangul Syllable ES"/* C5E3 */,/*23910*/"Hangul Syllable ESS"/* C5E4 */, /*23911*/"Hangul Syllable ENG"/* C5E5 */,/*23912*/"Hangul Syllable EJ"/* C5E6 */,/*23913*/"Hangul Syllable EC"/* C5E7 */, /*23914*/"Hangul Syllable EK"/* C5E8 */,/*23915*/"Hangul Syllable ET"/* C5E9 */,/*23916*/"Hangul Syllable EP"/* C5EA */, /*23917*/"Hangul Syllable EH"/* C5EB */,/*23918*/"Hangul Syllable YEO"/* C5EC */, /*23919*/"Hangul Syllable YEOG"/* C5ED */,/*23920*/"Hangul Syllable YEOGG"/* C5EE */, /*23921*/"Hangul Syllable YEOGS"/* C5EF */,/*23922*/"Hangul Syllable YEON"/* C5F0 */, /*23923*/"Hangul Syllable YEONJ"/* C5F1 */,/*23924*/"Hangul Syllable YEONH"/* C5F2 */, /*23925*/"Hangul Syllable YEOD"/* C5F3 */,/*23926*/"Hangul Syllable YEOL"/* C5F4 */, /*23927*/"Hangul Syllable YEOLG"/* C5F5 */,/*23928*/"Hangul Syllable YEOLM"/* C5F6 */, /*23929*/"Hangul Syllable YEOLB"/* C5F7 */,/*23930*/"Hangul Syllable YEOLS"/* C5F8 */, /*23931*/"Hangul Syllable YEOLT"/* C5F9 */,/*23932*/"Hangul Syllable YEOLP"/* C5FA */, /*23933*/"Hangul Syllable YEOLH"/* C5FB */,/*23934*/"Hangul Syllable YEOM"/* C5FC */, /*23935*/"Hangul Syllable YEOB"/* C5FD */,/*23936*/"Hangul Syllable YEOBS"/* C5FE */, /*23937*/"Hangul Syllable YEOS"/* C5FF */,/*23938*/"Hangul Syllable YEOSS"/* C600 */, /*23939*/"Hangul Syllable YEONG"/* C601 */,/*23940*/"Hangul Syllable YEOJ"/* C602 */, /*23941*/"Hangul Syllable YEOC"/* C603 */,/*23942*/"Hangul Syllable YEOK"/* C604 */, /*23943*/"Hangul Syllable YEOT"/* C605 */,/*23944*/"Hangul Syllable YEOP"/* C606 */, /*23945*/"Hangul Syllable YEOH"/* C607 */,/*23946*/"Hangul Syllable YE"/* C608 */, /*23947*/"Hangul Syllable YEG"/* C609 */,/*23948*/"Hangul Syllable YEGG"/* C60A */, /*23949*/"Hangul Syllable YEGS"/* C60B */,/*23950*/"Hangul Syllable YEN"/* C60C */, /*23951*/"Hangul Syllable YENJ"/* C60D */,/*23952*/"Hangul Syllable YENH"/* C60E */, /*23953*/"Hangul Syllable YED"/* C60F */,/*23954*/"Hangul Syllable YEL"/* C610 */, /*23955*/"Hangul Syllable YELG"/* C611 */,/*23956*/"Hangul Syllable YELM"/* C612 */, /*23957*/"Hangul Syllable YELB"/* C613 */,/*23958*/"Hangul Syllable YELS"/* C614 */, /*23959*/"Hangul Syllable YELT"/* C615 */,/*23960*/"Hangul Syllable YELP"/* C616 */, /*23961*/"Hangul Syllable YELH"/* C617 */,/*23962*/"Hangul Syllable YEM"/* C618 */, /*23963*/"Hangul Syllable YEB"/* C619 */,/*23964*/"Hangul Syllable YEBS"/* C61A */, /*23965*/"Hangul Syllable YES"/* C61B */,/*23966*/"Hangul Syllable YESS"/* C61C */, /*23967*/"Hangul Syllable YENG"/* C61D */,/*23968*/"Hangul Syllable YEJ"/* C61E */, /*23969*/"Hangul Syllable YEC"/* C61F */,/*23970*/"Hangul Syllable YEK"/* C620 */, /*23971*/"Hangul Syllable YET"/* C621 */,/*23972*/"Hangul Syllable YEP"/* C622 */, /*23973*/"Hangul Syllable YEH"/* C623 */,/*23974*/"Hangul Syllable O"/* C624 */,/*23975*/"Hangul Syllable OG"/* C625 */, /*23976*/"Hangul Syllable OGG"/* C626 */,/*23977*/"Hangul Syllable OGS"/* C627 */, /*23978*/"Hangul Syllable ON"/* C628 */,/*23979*/"Hangul Syllable ONJ"/* C629 */, /*23980*/"Hangul Syllable ONH"/* C62A */,/*23981*/"Hangul Syllable OD"/* C62B */,/*23982*/"Hangul Syllable OL"/* C62C */, /*23983*/"Hangul Syllable OLG"/* C62D */,/*23984*/"Hangul Syllable OLM"/* C62E */, /*23985*/"Hangul Syllable OLB"/* C62F */,/*23986*/"Hangul Syllable OLS"/* C630 */, /*23987*/"Hangul Syllable OLT"/* C631 */,/*23988*/"Hangul Syllable OLP"/* C632 */, /*23989*/"Hangul Syllable OLH"/* C633 */,/*23990*/"Hangul Syllable OM"/* C634 */,/*23991*/"Hangul Syllable OB"/* C635 */, /*23992*/"Hangul Syllable OBS"/* C636 */,/*23993*/"Hangul Syllable OS"/* C637 */, /*23994*/"Hangul Syllable OSS"/* C638 */,/*23995*/"Hangul Syllable ONG"/* C639 */, /*23996*/"Hangul Syllable OJ"/* C63A */,/*23997*/"Hangul Syllable OC"/* C63B */,/*23998*/"Hangul Syllable OK"/* C63C */, /*23999*/"Hangul Syllable OT"/* C63D */,/*24000*/"Hangul Syllable OP"/* C63E */,/*24001*/"Hangul Syllable OH"/* C63F */, /*24002*/"Hangul Syllable WA"/* C640 */,/*24003*/"Hangul Syllable WAG"/* C641 */, /*24004*/"Hangul Syllable WAGG"/* C642 */,/*24005*/"Hangul Syllable WAGS"/* C643 */, /*24006*/"Hangul Syllable WAN"/* C644 */,/*24007*/"Hangul Syllable WANJ"/* C645 */, /*24008*/"Hangul Syllable WANH"/* C646 */,/*24009*/"Hangul Syllable WAD"/* C647 */, /*24010*/"Hangul Syllable WAL"/* C648 */,/*24011*/"Hangul Syllable WALG"/* C649 */, /*24012*/"Hangul Syllable WALM"/* C64A */,/*24013*/"Hangul Syllable WALB"/* C64B */, /*24014*/"Hangul Syllable WALS"/* C64C */,/*24015*/"Hangul Syllable WALT"/* C64D */, /*24016*/"Hangul Syllable WALP"/* C64E */,/*24017*/"Hangul Syllable WALH"/* C64F */, /*24018*/"Hangul Syllable WAM"/* C650 */,/*24019*/"Hangul Syllable WAB"/* C651 */, /*24020*/"Hangul Syllable WABS"/* C652 */,/*24021*/"Hangul Syllable WAS"/* C653 */, /*24022*/"Hangul Syllable WASS"/* C654 */,/*24023*/"Hangul Syllable WANG"/* C655 */, /*24024*/"Hangul Syllable WAJ"/* C656 */,/*24025*/"Hangul Syllable WAC"/* C657 */, /*24026*/"Hangul Syllable WAK"/* C658 */,/*24027*/"Hangul Syllable WAT"/* C659 */, /*24028*/"Hangul Syllable WAP"/* C65A */,/*24029*/"Hangul Syllable WAH"/* C65B */, /*24030*/"Hangul Syllable WAE"/* C65C */,/*24031*/"Hangul Syllable WAEG"/* C65D */, /*24032*/"Hangul Syllable WAEGG"/* C65E */,/*24033*/"Hangul Syllable WAEGS"/* C65F */, /*24034*/"Hangul Syllable WAEN"/* C660 */,/*24035*/"Hangul Syllable WAENJ"/* C661 */, /*24036*/"Hangul Syllable WAENH"/* C662 */,/*24037*/"Hangul Syllable WAED"/* C663 */, /*24038*/"Hangul Syllable WAEL"/* C664 */,/*24039*/"Hangul Syllable WAELG"/* C665 */, /*24040*/"Hangul Syllable WAELM"/* C666 */,/*24041*/"Hangul Syllable WAELB"/* C667 */, /*24042*/"Hangul Syllable WAELS"/* C668 */,/*24043*/"Hangul Syllable WAELT"/* C669 */, /*24044*/"Hangul Syllable WAELP"/* C66A */,/*24045*/"Hangul Syllable WAELH"/* C66B */, /*24046*/"Hangul Syllable WAEM"/* C66C */,/*24047*/"Hangul Syllable WAEB"/* C66D */, /*24048*/"Hangul Syllable WAEBS"/* C66E */,/*24049*/"Hangul Syllable WAES"/* C66F */, /*24050*/"Hangul Syllable WAESS"/* C670 */,/*24051*/"Hangul Syllable WAENG"/* C671 */, /*24052*/"Hangul Syllable WAEJ"/* C672 */,/*24053*/"Hangul Syllable WAEC"/* C673 */, /*24054*/"Hangul Syllable WAEK"/* C674 */,/*24055*/"Hangul Syllable WAET"/* C675 */, /*24056*/"Hangul Syllable WAEP"/* C676 */,/*24057*/"Hangul Syllable WAEH"/* C677 */, /*24058*/"Hangul Syllable OE"/* C678 */,/*24059*/"Hangul Syllable OEG"/* C679 */, /*24060*/"Hangul Syllable OEGG"/* C67A */,/*24061*/"Hangul Syllable OEGS"/* C67B */, /*24062*/"Hangul Syllable OEN"/* C67C */,/*24063*/"Hangul Syllable OENJ"/* C67D */, /*24064*/"Hangul Syllable OENH"/* C67E */,/*24065*/"Hangul Syllable OED"/* C67F */, /*24066*/"Hangul Syllable OEL"/* C680 */,/*24067*/"Hangul Syllable OELG"/* C681 */, /*24068*/"Hangul Syllable OELM"/* C682 */,/*24069*/"Hangul Syllable OELB"/* C683 */, /*24070*/"Hangul Syllable OELS"/* C684 */,/*24071*/"Hangul Syllable OELT"/* C685 */, /*24072*/"Hangul Syllable OELP"/* C686 */,/*24073*/"Hangul Syllable OELH"/* C687 */, /*24074*/"Hangul Syllable OEM"/* C688 */,/*24075*/"Hangul Syllable OEB"/* C689 */, /*24076*/"Hangul Syllable OEBS"/* C68A */,/*24077*/"Hangul Syllable OES"/* C68B */, /*24078*/"Hangul Syllable OESS"/* C68C */,/*24079*/"Hangul Syllable OENG"/* C68D */, /*24080*/"Hangul Syllable OEJ"/* C68E */,/*24081*/"Hangul Syllable OEC"/* C68F */, /*24082*/"Hangul Syllable OEK"/* C690 */,/*24083*/"Hangul Syllable OET"/* C691 */, /*24084*/"Hangul Syllable OEP"/* C692 */,/*24085*/"Hangul Syllable OEH"/* C693 */, /*24086*/"Hangul Syllable YO"/* C694 */,/*24087*/"Hangul Syllable YOG"/* C695 */, /*24088*/"Hangul Syllable YOGG"/* C696 */,/*24089*/"Hangul Syllable YOGS"/* C697 */, /*24090*/"Hangul Syllable YON"/* C698 */,/*24091*/"Hangul Syllable YONJ"/* C699 */, /*24092*/"Hangul Syllable YONH"/* C69A */,/*24093*/"Hangul Syllable YOD"/* C69B */, /*24094*/"Hangul Syllable YOL"/* C69C */,/*24095*/"Hangul Syllable YOLG"/* C69D */, /*24096*/"Hangul Syllable YOLM"/* C69E */,/*24097*/"Hangul Syllable YOLB"/* C69F */, /*24098*/"Hangul Syllable YOLS"/* C6A0 */,/*24099*/"Hangul Syllable YOLT"/* C6A1 */, /*24100*/"Hangul Syllable YOLP"/* C6A2 */,/*24101*/"Hangul Syllable YOLH"/* C6A3 */, /*24102*/"Hangul Syllable YOM"/* C6A4 */,/*24103*/"Hangul Syllable YOB"/* C6A5 */, /*24104*/"Hangul Syllable YOBS"/* C6A6 */,/*24105*/"Hangul Syllable YOS"/* C6A7 */, /*24106*/"Hangul Syllable YOSS"/* C6A8 */,/*24107*/"Hangul Syllable YONG"/* C6A9 */, /*24108*/"Hangul Syllable YOJ"/* C6AA */,/*24109*/"Hangul Syllable YOC"/* C6AB */, /*24110*/"Hangul Syllable YOK"/* C6AC */,/*24111*/"Hangul Syllable YOT"/* C6AD */, /*24112*/"Hangul Syllable YOP"/* C6AE */,/*24113*/"Hangul Syllable YOH"/* C6AF */,/*24114*/"Hangul Syllable U"/* C6B0 */, /*24115*/"Hangul Syllable UG"/* C6B1 */,/*24116*/"Hangul Syllable UGG"/* C6B2 */, /*24117*/"Hangul Syllable UGS"/* C6B3 */,/*24118*/"Hangul Syllable UN"/* C6B4 */, /*24119*/"Hangul Syllable UNJ"/* C6B5 */,/*24120*/"Hangul Syllable UNH"/* C6B6 */, /*24121*/"Hangul Syllable UD"/* C6B7 */,/*24122*/"Hangul Syllable UL"/* C6B8 */,/*24123*/"Hangul Syllable ULG"/* C6B9 */, /*24124*/"Hangul Syllable ULM"/* C6BA */,/*24125*/"Hangul Syllable ULB"/* C6BB */, /*24126*/"Hangul Syllable ULS"/* C6BC */,/*24127*/"Hangul Syllable ULT"/* C6BD */, /*24128*/"Hangul Syllable ULP"/* C6BE */,/*24129*/"Hangul Syllable ULH"/* C6BF */, /*24130*/"Hangul Syllable UM"/* C6C0 */,/*24131*/"Hangul Syllable UB"/* C6C1 */,/*24132*/"Hangul Syllable UBS"/* C6C2 */, /*24133*/"Hangul Syllable US"/* C6C3 */,/*24134*/"Hangul Syllable USS"/* C6C4 */, /*24135*/"Hangul Syllable UNG"/* C6C5 */,/*24136*/"Hangul Syllable UJ"/* C6C6 */,/*24137*/"Hangul Syllable UC"/* C6C7 */, /*24138*/"Hangul Syllable UK"/* C6C8 */,/*24139*/"Hangul Syllable UT"/* C6C9 */,/*24140*/"Hangul Syllable UP"/* C6CA */, /*24141*/"Hangul Syllable UH"/* C6CB */,/*24142*/"Hangul Syllable WEO"/* C6CC */, /*24143*/"Hangul Syllable WEOG"/* C6CD */,/*24144*/"Hangul Syllable WEOGG"/* C6CE */, /*24145*/"Hangul Syllable WEOGS"/* C6CF */,/*24146*/"Hangul Syllable WEON"/* C6D0 */, /*24147*/"Hangul Syllable WEONJ"/* C6D1 */,/*24148*/"Hangul Syllable WEONH"/* C6D2 */, /*24149*/"Hangul Syllable WEOD"/* C6D3 */,/*24150*/"Hangul Syllable WEOL"/* C6D4 */, /*24151*/"Hangul Syllable WEOLG"/* C6D5 */,/*24152*/"Hangul Syllable WEOLM"/* C6D6 */, /*24153*/"Hangul Syllable WEOLB"/* C6D7 */,/*24154*/"Hangul Syllable WEOLS"/* C6D8 */, /*24155*/"Hangul Syllable WEOLT"/* C6D9 */,/*24156*/"Hangul Syllable WEOLP"/* C6DA */, /*24157*/"Hangul Syllable WEOLH"/* C6DB */,/*24158*/"Hangul Syllable WEOM"/* C6DC */, /*24159*/"Hangul Syllable WEOB"/* C6DD */,/*24160*/"Hangul Syllable WEOBS"/* C6DE */, /*24161*/"Hangul Syllable WEOS"/* C6DF */,/*24162*/"Hangul Syllable WEOSS"/* C6E0 */, /*24163*/"Hangul Syllable WEONG"/* C6E1 */,/*24164*/"Hangul Syllable WEOJ"/* C6E2 */, /*24165*/"Hangul Syllable WEOC"/* C6E3 */,/*24166*/"Hangul Syllable WEOK"/* C6E4 */, /*24167*/"Hangul Syllable WEOT"/* C6E5 */,/*24168*/"Hangul Syllable WEOP"/* C6E6 */, /*24169*/"Hangul Syllable WEOH"/* C6E7 */,/*24170*/"Hangul Syllable WE"/* C6E8 */, /*24171*/"Hangul Syllable WEG"/* C6E9 */,/*24172*/"Hangul Syllable WEGG"/* C6EA */, /*24173*/"Hangul Syllable WEGS"/* C6EB */,/*24174*/"Hangul Syllable WEN"/* C6EC */, /*24175*/"Hangul Syllable WENJ"/* C6ED */,/*24176*/"Hangul Syllable WENH"/* C6EE */, /*24177*/"Hangul Syllable WED"/* C6EF */,/*24178*/"Hangul Syllable WEL"/* C6F0 */, /*24179*/"Hangul Syllable WELG"/* C6F1 */,/*24180*/"Hangul Syllable WELM"/* C6F2 */, /*24181*/"Hangul Syllable WELB"/* C6F3 */,/*24182*/"Hangul Syllable WELS"/* C6F4 */, /*24183*/"Hangul Syllable WELT"/* C6F5 */,/*24184*/"Hangul Syllable WELP"/* C6F6 */, /*24185*/"Hangul Syllable WELH"/* C6F7 */,/*24186*/"Hangul Syllable WEM"/* C6F8 */, /*24187*/"Hangul Syllable WEB"/* C6F9 */,/*24188*/"Hangul Syllable WEBS"/* C6FA */, /*24189*/"Hangul Syllable WES"/* C6FB */,/*24190*/"Hangul Syllable WESS"/* C6FC */, /*24191*/"Hangul Syllable WENG"/* C6FD */,/*24192*/"Hangul Syllable WEJ"/* C6FE */, /*24193*/"Hangul Syllable WEC"/* C6FF */,/*24194*/"Hangul Syllable WEK"/* C700 */, /*24195*/"Hangul Syllable WET"/* C701 */,/*24196*/"Hangul Syllable WEP"/* C702 */, /*24197*/"Hangul Syllable WEH"/* C703 */,/*24198*/"Hangul Syllable WI"/* C704 */, /*24199*/"Hangul Syllable WIG"/* C705 */,/*24200*/"Hangul Syllable WIGG"/* C706 */, /*24201*/"Hangul Syllable WIGS"/* C707 */,/*24202*/"Hangul Syllable WIN"/* C708 */, /*24203*/"Hangul Syllable WINJ"/* C709 */,/*24204*/"Hangul Syllable WINH"/* C70A */, /*24205*/"Hangul Syllable WID"/* C70B */,/*24206*/"Hangul Syllable WIL"/* C70C */, /*24207*/"Hangul Syllable WILG"/* C70D */,/*24208*/"Hangul Syllable WILM"/* C70E */, /*24209*/"Hangul Syllable WILB"/* C70F */,/*24210*/"Hangul Syllable WILS"/* C710 */, /*24211*/"Hangul Syllable WILT"/* C711 */,/*24212*/"Hangul Syllable WILP"/* C712 */, /*24213*/"Hangul Syllable WILH"/* C713 */,/*24214*/"Hangul Syllable WIM"/* C714 */, /*24215*/"Hangul Syllable WIB"/* C715 */,/*24216*/"Hangul Syllable WIBS"/* C716 */, /*24217*/"Hangul Syllable WIS"/* C717 */,/*24218*/"Hangul Syllable WISS"/* C718 */, /*24219*/"Hangul Syllable WING"/* C719 */,/*24220*/"Hangul Syllable WIJ"/* C71A */, /*24221*/"Hangul Syllable WIC"/* C71B */,/*24222*/"Hangul Syllable WIK"/* C71C */, /*24223*/"Hangul Syllable WIT"/* C71D */,/*24224*/"Hangul Syllable WIP"/* C71E */, /*24225*/"Hangul Syllable WIH"/* C71F */,/*24226*/"Hangul Syllable YU"/* C720 */, /*24227*/"Hangul Syllable YUG"/* C721 */,/*24228*/"Hangul Syllable YUGG"/* C722 */, /*24229*/"Hangul Syllable YUGS"/* C723 */,/*24230*/"Hangul Syllable YUN"/* C724 */, /*24231*/"Hangul Syllable YUNJ"/* C725 */,/*24232*/"Hangul Syllable YUNH"/* C726 */, /*24233*/"Hangul Syllable YUD"/* C727 */,/*24234*/"Hangul Syllable YUL"/* C728 */, /*24235*/"Hangul Syllable YULG"/* C729 */,/*24236*/"Hangul Syllable YULM"/* C72A */, /*24237*/"Hangul Syllable YULB"/* C72B */,/*24238*/"Hangul Syllable YULS"/* C72C */, /*24239*/"Hangul Syllable YULT"/* C72D */,/*24240*/"Hangul Syllable YULP"/* C72E */, /*24241*/"Hangul Syllable YULH"/* C72F */,/*24242*/"Hangul Syllable YUM"/* C730 */, /*24243*/"Hangul Syllable YUB"/* C731 */,/*24244*/"Hangul Syllable YUBS"/* C732 */, /*24245*/"Hangul Syllable YUS"/* C733 */,/*24246*/"Hangul Syllable YUSS"/* C734 */, /*24247*/"Hangul Syllable YUNG"/* C735 */,/*24248*/"Hangul Syllable YUJ"/* C736 */, /*24249*/"Hangul Syllable YUC"/* C737 */,/*24250*/"Hangul Syllable YUK"/* C738 */, /*24251*/"Hangul Syllable YUT"/* C739 */,/*24252*/"Hangul Syllable YUP"/* C73A */, /*24253*/"Hangul Syllable YUH"/* C73B */,/*24254*/"Hangul Syllable EU"/* C73C */, /*24255*/"Hangul Syllable EUG"/* C73D */,/*24256*/"Hangul Syllable EUGG"/* C73E */, /*24257*/"Hangul Syllable EUGS"/* C73F */,/*24258*/"Hangul Syllable EUN"/* C740 */, /*24259*/"Hangul Syllable EUNJ"/* C741 */,/*24260*/"Hangul Syllable EUNH"/* C742 */, /*24261*/"Hangul Syllable EUD"/* C743 */,/*24262*/"Hangul Syllable EUL"/* C744 */, /*24263*/"Hangul Syllable EULG"/* C745 */,/*24264*/"Hangul Syllable EULM"/* C746 */, /*24265*/"Hangul Syllable EULB"/* C747 */,/*24266*/"Hangul Syllable EULS"/* C748 */, /*24267*/"Hangul Syllable EULT"/* C749 */,/*24268*/"Hangul Syllable EULP"/* C74A */, /*24269*/"Hangul Syllable EULH"/* C74B */,/*24270*/"Hangul Syllable EUM"/* C74C */, /*24271*/"Hangul Syllable EUB"/* C74D */,/*24272*/"Hangul Syllable EUBS"/* C74E */, /*24273*/"Hangul Syllable EUS"/* C74F */,/*24274*/"Hangul Syllable EUSS"/* C750 */, /*24275*/"Hangul Syllable EUNG"/* C751 */,/*24276*/"Hangul Syllable EUJ"/* C752 */, /*24277*/"Hangul Syllable EUC"/* C753 */,/*24278*/"Hangul Syllable EUK"/* C754 */, /*24279*/"Hangul Syllable EUT"/* C755 */,/*24280*/"Hangul Syllable EUP"/* C756 */, /*24281*/"Hangul Syllable EUH"/* C757 */,/*24282*/"Hangul Syllable YI"/* C758 */, /*24283*/"Hangul Syllable YIG"/* C759 */,/*24284*/"Hangul Syllable YIGG"/* C75A */, /*24285*/"Hangul Syllable YIGS"/* C75B */,/*24286*/"Hangul Syllable YIN"/* C75C */, /*24287*/"Hangul Syllable YINJ"/* C75D */,/*24288*/"Hangul Syllable YINH"/* C75E */, /*24289*/"Hangul Syllable YID"/* C75F */,/*24290*/"Hangul Syllable YIL"/* C760 */, /*24291*/"Hangul Syllable YILG"/* C761 */,/*24292*/"Hangul Syllable YILM"/* C762 */, /*24293*/"Hangul Syllable YILB"/* C763 */,/*24294*/"Hangul Syllable YILS"/* C764 */, /*24295*/"Hangul Syllable YILT"/* C765 */,/*24296*/"Hangul Syllable YILP"/* C766 */, /*24297*/"Hangul Syllable YILH"/* C767 */,/*24298*/"Hangul Syllable YIM"/* C768 */, /*24299*/"Hangul Syllable YIB"/* C769 */,/*24300*/"Hangul Syllable YIBS"/* C76A */, /*24301*/"Hangul Syllable YIS"/* C76B */,/*24302*/"Hangul Syllable YISS"/* C76C */, /*24303*/"Hangul Syllable YING"/* C76D */,/*24304*/"Hangul Syllable YIJ"/* C76E */, /*24305*/"Hangul Syllable YIC"/* C76F */,/*24306*/"Hangul Syllable YIK"/* C770 */, /*24307*/"Hangul Syllable YIT"/* C771 */,/*24308*/"Hangul Syllable YIP"/* C772 */, /*24309*/"Hangul Syllable YIH"/* C773 */,/*24310*/"Hangul Syllable I"/* C774 */,/*24311*/"Hangul Syllable IG"/* C775 */, /*24312*/"Hangul Syllable IGG"/* C776 */,/*24313*/"Hangul Syllable IGS"/* C777 */, /*24314*/"Hangul Syllable IN"/* C778 */,/*24315*/"Hangul Syllable INJ"/* C779 */, /*24316*/"Hangul Syllable INH"/* C77A */,/*24317*/"Hangul Syllable ID"/* C77B */,/*24318*/"Hangul Syllable IL"/* C77C */, /*24319*/"Hangul Syllable ILG"/* C77D */,/*24320*/"Hangul Syllable ILM"/* C77E */, /*24321*/"Hangul Syllable ILB"/* C77F */,/*24322*/"Hangul Syllable ILS"/* C780 */, /*24323*/"Hangul Syllable ILT"/* C781 */,/*24324*/"Hangul Syllable ILP"/* C782 */, /*24325*/"Hangul Syllable ILH"/* C783 */,/*24326*/"Hangul Syllable IM"/* C784 */,/*24327*/"Hangul Syllable IB"/* C785 */, /*24328*/"Hangul Syllable IBS"/* C786 */,/*24329*/"Hangul Syllable IS"/* C787 */, /*24330*/"Hangul Syllable ISS"/* C788 */,/*24331*/"Hangul Syllable ING"/* C789 */, /*24332*/"Hangul Syllable IJ"/* C78A */,/*24333*/"Hangul Syllable IC"/* C78B */,/*24334*/"Hangul Syllable IK"/* C78C */, /*24335*/"Hangul Syllable IT"/* C78D */,/*24336*/"Hangul Syllable IP"/* C78E */,/*24337*/"Hangul Syllable IH"/* C78F */, /*24338*/"Hangul Syllable JA"/* C790 */,/*24339*/"Hangul Syllable JAG"/* C791 */, /*24340*/"Hangul Syllable JAGG"/* C792 */,/*24341*/"Hangul Syllable JAGS"/* C793 */, /*24342*/"Hangul Syllable JAN"/* C794 */,/*24343*/"Hangul Syllable JANJ"/* C795 */, /*24344*/"Hangul Syllable JANH"/* C796 */,/*24345*/"Hangul Syllable JAD"/* C797 */, /*24346*/"Hangul Syllable JAL"/* C798 */,/*24347*/"Hangul Syllable JALG"/* C799 */, /*24348*/"Hangul Syllable JALM"/* C79A */,/*24349*/"Hangul Syllable JALB"/* C79B */, /*24350*/"Hangul Syllable JALS"/* C79C */,/*24351*/"Hangul Syllable JALT"/* C79D */, /*24352*/"Hangul Syllable JALP"/* C79E */,/*24353*/"Hangul Syllable JALH"/* C79F */, /*24354*/"Hangul Syllable JAM"/* C7A0 */,/*24355*/"Hangul Syllable JAB"/* C7A1 */, /*24356*/"Hangul Syllable JABS"/* C7A2 */,/*24357*/"Hangul Syllable JAS"/* C7A3 */, /*24358*/"Hangul Syllable JASS"/* C7A4 */,/*24359*/"Hangul Syllable JANG"/* C7A5 */, /*24360*/"Hangul Syllable JAJ"/* C7A6 */,/*24361*/"Hangul Syllable JAC"/* C7A7 */, /*24362*/"Hangul Syllable JAK"/* C7A8 */,/*24363*/"Hangul Syllable JAT"/* C7A9 */, /*24364*/"Hangul Syllable JAP"/* C7AA */,/*24365*/"Hangul Syllable JAH"/* C7AB */, /*24366*/"Hangul Syllable JAE"/* C7AC */,/*24367*/"Hangul Syllable JAEG"/* C7AD */, /*24368*/"Hangul Syllable JAEGG"/* C7AE */,/*24369*/"Hangul Syllable JAEGS"/* C7AF */, /*24370*/"Hangul Syllable JAEN"/* C7B0 */,/*24371*/"Hangul Syllable JAENJ"/* C7B1 */, /*24372*/"Hangul Syllable JAENH"/* C7B2 */,/*24373*/"Hangul Syllable JAED"/* C7B3 */, /*24374*/"Hangul Syllable JAEL"/* C7B4 */,/*24375*/"Hangul Syllable JAELG"/* C7B5 */, /*24376*/"Hangul Syllable JAELM"/* C7B6 */,/*24377*/"Hangul Syllable JAELB"/* C7B7 */, /*24378*/"Hangul Syllable JAELS"/* C7B8 */,/*24379*/"Hangul Syllable JAELT"/* C7B9 */, /*24380*/"Hangul Syllable JAELP"/* C7BA */,/*24381*/"Hangul Syllable JAELH"/* C7BB */, /*24382*/"Hangul Syllable JAEM"/* C7BC */,/*24383*/"Hangul Syllable JAEB"/* C7BD */, /*24384*/"Hangul Syllable JAEBS"/* C7BE */,/*24385*/"Hangul Syllable JAES"/* C7BF */, /*24386*/"Hangul Syllable JAESS"/* C7C0 */,/*24387*/"Hangul Syllable JAENG"/* C7C1 */, /*24388*/"Hangul Syllable JAEJ"/* C7C2 */,/*24389*/"Hangul Syllable JAEC"/* C7C3 */, /*24390*/"Hangul Syllable JAEK"/* C7C4 */,/*24391*/"Hangul Syllable JAET"/* C7C5 */, /*24392*/"Hangul Syllable JAEP"/* C7C6 */,/*24393*/"Hangul Syllable JAEH"/* C7C7 */, /*24394*/"Hangul Syllable JYA"/* C7C8 */,/*24395*/"Hangul Syllable JYAG"/* C7C9 */, /*24396*/"Hangul Syllable JYAGG"/* C7CA */,/*24397*/"Hangul Syllable JYAGS"/* C7CB */, /*24398*/"Hangul Syllable JYAN"/* C7CC */,/*24399*/"Hangul Syllable JYANJ"/* C7CD */, /*24400*/"Hangul Syllable JYANH"/* C7CE */,/*24401*/"Hangul Syllable JYAD"/* C7CF */, /*24402*/"Hangul Syllable JYAL"/* C7D0 */,/*24403*/"Hangul Syllable JYALG"/* C7D1 */, /*24404*/"Hangul Syllable JYALM"/* C7D2 */,/*24405*/"Hangul Syllable JYALB"/* C7D3 */, /*24406*/"Hangul Syllable JYALS"/* C7D4 */,/*24407*/"Hangul Syllable JYALT"/* C7D5 */, /*24408*/"Hangul Syllable JYALP"/* C7D6 */,/*24409*/"Hangul Syllable JYALH"/* C7D7 */, /*24410*/"Hangul Syllable JYAM"/* C7D8 */,/*24411*/"Hangul Syllable JYAB"/* C7D9 */, /*24412*/"Hangul Syllable JYABS"/* C7DA */,/*24413*/"Hangul Syllable JYAS"/* C7DB */, /*24414*/"Hangul Syllable JYASS"/* C7DC */,/*24415*/"Hangul Syllable JYANG"/* C7DD */, /*24416*/"Hangul Syllable JYAJ"/* C7DE */,/*24417*/"Hangul Syllable JYAC"/* C7DF */, /*24418*/"Hangul Syllable JYAK"/* C7E0 */,/*24419*/"Hangul Syllable JYAT"/* C7E1 */, /*24420*/"Hangul Syllable JYAP"/* C7E2 */,/*24421*/"Hangul Syllable JYAH"/* C7E3 */, /*24422*/"Hangul Syllable JYAE"/* C7E4 */,/*24423*/"Hangul Syllable JYAEG"/* C7E5 */, /*24424*/"Hangul Syllable JYAEGG"/* C7E6 */,/*24425*/"Hangul Syllable JYAEGS"/* C7E7 */, /*24426*/"Hangul Syllable JYAEN"/* C7E8 */,/*24427*/"Hangul Syllable JYAENJ"/* C7E9 */, /*24428*/"Hangul Syllable JYAENH"/* C7EA */,/*24429*/"Hangul Syllable JYAED"/* C7EB */, /*24430*/"Hangul Syllable JYAEL"/* C7EC */,/*24431*/"Hangul Syllable JYAELG"/* C7ED */, /*24432*/"Hangul Syllable JYAELM"/* C7EE */,/*24433*/"Hangul Syllable JYAELB"/* C7EF */, /*24434*/"Hangul Syllable JYAELS"/* C7F0 */,/*24435*/"Hangul Syllable JYAELT"/* C7F1 */, /*24436*/"Hangul Syllable JYAELP"/* C7F2 */,/*24437*/"Hangul Syllable JYAELH"/* C7F3 */, /*24438*/"Hangul Syllable JYAEM"/* C7F4 */,/*24439*/"Hangul Syllable JYAEB"/* C7F5 */, /*24440*/"Hangul Syllable JYAEBS"/* C7F6 */,/*24441*/"Hangul Syllable JYAES"/* C7F7 */, /*24442*/"Hangul Syllable JYAESS"/* C7F8 */,/*24443*/"Hangul Syllable JYAENG"/* C7F9 */, /*24444*/"Hangul Syllable JYAEJ"/* C7FA */,/*24445*/"Hangul Syllable JYAEC"/* C7FB */, /*24446*/"Hangul Syllable JYAEK"/* C7FC */,/*24447*/"Hangul Syllable JYAET"/* C7FD */, /*24448*/"Hangul Syllable JYAEP"/* C7FE */,/*24449*/"Hangul Syllable JYAEH"/* C7FF */, /*24450*/"Hangul Syllable JEO"/* C800 */,/*24451*/"Hangul Syllable JEOG"/* C801 */, /*24452*/"Hangul Syllable JEOGG"/* C802 */,/*24453*/"Hangul Syllable JEOGS"/* C803 */, /*24454*/"Hangul Syllable JEON"/* C804 */,/*24455*/"Hangul Syllable JEONJ"/* C805 */, /*24456*/"Hangul Syllable JEONH"/* C806 */,/*24457*/"Hangul Syllable JEOD"/* C807 */, /*24458*/"Hangul Syllable JEOL"/* C808 */,/*24459*/"Hangul Syllable JEOLG"/* C809 */, /*24460*/"Hangul Syllable JEOLM"/* C80A */,/*24461*/"Hangul Syllable JEOLB"/* C80B */, /*24462*/"Hangul Syllable JEOLS"/* C80C */,/*24463*/"Hangul Syllable JEOLT"/* C80D */, /*24464*/"Hangul Syllable JEOLP"/* C80E */,/*24465*/"Hangul Syllable JEOLH"/* C80F */, /*24466*/"Hangul Syllable JEOM"/* C810 */,/*24467*/"Hangul Syllable JEOB"/* C811 */, /*24468*/"Hangul Syllable JEOBS"/* C812 */,/*24469*/"Hangul Syllable JEOS"/* C813 */, /*24470*/"Hangul Syllable JEOSS"/* C814 */,/*24471*/"Hangul Syllable JEONG"/* C815 */, /*24472*/"Hangul Syllable JEOJ"/* C816 */,/*24473*/"Hangul Syllable JEOC"/* C817 */, /*24474*/"Hangul Syllable JEOK"/* C818 */,/*24475*/"Hangul Syllable JEOT"/* C819 */, /*24476*/"Hangul Syllable JEOP"/* C81A */,/*24477*/"Hangul Syllable JEOH"/* C81B */, /*24478*/"Hangul Syllable JE"/* C81C */,/*24479*/"Hangul Syllable JEG"/* C81D */, /*24480*/"Hangul Syllable JEGG"/* C81E */,/*24481*/"Hangul Syllable JEGS"/* C81F */, /*24482*/"Hangul Syllable JEN"/* C820 */,/*24483*/"Hangul Syllable JENJ"/* C821 */, /*24484*/"Hangul Syllable JENH"/* C822 */,/*24485*/"Hangul Syllable JED"/* C823 */, /*24486*/"Hangul Syllable JEL"/* C824 */,/*24487*/"Hangul Syllable JELG"/* C825 */, /*24488*/"Hangul Syllable JELM"/* C826 */,/*24489*/"Hangul Syllable JELB"/* C827 */, /*24490*/"Hangul Syllable JELS"/* C828 */,/*24491*/"Hangul Syllable JELT"/* C829 */, /*24492*/"Hangul Syllable JELP"/* C82A */,/*24493*/"Hangul Syllable JELH"/* C82B */, /*24494*/"Hangul Syllable JEM"/* C82C */,/*24495*/"Hangul Syllable JEB"/* C82D */, /*24496*/"Hangul Syllable JEBS"/* C82E */,/*24497*/"Hangul Syllable JES"/* C82F */, /*24498*/"Hangul Syllable JESS"/* C830 */,/*24499*/"Hangul Syllable JENG"/* C831 */, /*24500*/"Hangul Syllable JEJ"/* C832 */,/*24501*/"Hangul Syllable JEC"/* C833 */, /*24502*/"Hangul Syllable JEK"/* C834 */,/*24503*/"Hangul Syllable JET"/* C835 */, /*24504*/"Hangul Syllable JEP"/* C836 */,/*24505*/"Hangul Syllable JEH"/* C837 */, /*24506*/"Hangul Syllable JYEO"/* C838 */,/*24507*/"Hangul Syllable JYEOG"/* C839 */, /*24508*/"Hangul Syllable JYEOGG"/* C83A */,/*24509*/"Hangul Syllable JYEOGS"/* C83B */, /*24510*/"Hangul Syllable JYEON"/* C83C */,/*24511*/"Hangul Syllable JYEONJ"/* C83D */, /*24512*/"Hangul Syllable JYEONH"/* C83E */,/*24513*/"Hangul Syllable JYEOD"/* C83F */, /*24514*/"Hangul Syllable JYEOL"/* C840 */,/*24515*/"Hangul Syllable JYEOLG"/* C841 */, /*24516*/"Hangul Syllable JYEOLM"/* C842 */,/*24517*/"Hangul Syllable JYEOLB"/* C843 */, /*24518*/"Hangul Syllable JYEOLS"/* C844 */,/*24519*/"Hangul Syllable JYEOLT"/* C845 */, /*24520*/"Hangul Syllable JYEOLP"/* C846 */,/*24521*/"Hangul Syllable JYEOLH"/* C847 */, /*24522*/"Hangul Syllable JYEOM"/* C848 */,/*24523*/"Hangul Syllable JYEOB"/* C849 */, /*24524*/"Hangul Syllable JYEOBS"/* C84A */,/*24525*/"Hangul Syllable JYEOS"/* C84B */, /*24526*/"Hangul Syllable JYEOSS"/* C84C */,/*24527*/"Hangul Syllable JYEONG"/* C84D */, /*24528*/"Hangul Syllable JYEOJ"/* C84E */,/*24529*/"Hangul Syllable JYEOC"/* C84F */, /*24530*/"Hangul Syllable JYEOK"/* C850 */,/*24531*/"Hangul Syllable JYEOT"/* C851 */, /*24532*/"Hangul Syllable JYEOP"/* C852 */,/*24533*/"Hangul Syllable JYEOH"/* C853 */, /*24534*/"Hangul Syllable JYE"/* C854 */,/*24535*/"Hangul Syllable JYEG"/* C855 */, /*24536*/"Hangul Syllable JYEGG"/* C856 */,/*24537*/"Hangul Syllable JYEGS"/* C857 */, /*24538*/"Hangul Syllable JYEN"/* C858 */,/*24539*/"Hangul Syllable JYENJ"/* C859 */, /*24540*/"Hangul Syllable JYENH"/* C85A */,/*24541*/"Hangul Syllable JYED"/* C85B */, /*24542*/"Hangul Syllable JYEL"/* C85C */,/*24543*/"Hangul Syllable JYELG"/* C85D */, /*24544*/"Hangul Syllable JYELM"/* C85E */,/*24545*/"Hangul Syllable JYELB"/* C85F */, /*24546*/"Hangul Syllable JYELS"/* C860 */,/*24547*/"Hangul Syllable JYELT"/* C861 */, /*24548*/"Hangul Syllable JYELP"/* C862 */,/*24549*/"Hangul Syllable JYELH"/* C863 */, /*24550*/"Hangul Syllable JYEM"/* C864 */,/*24551*/"Hangul Syllable JYEB"/* C865 */, /*24552*/"Hangul Syllable JYEBS"/* C866 */,/*24553*/"Hangul Syllable JYES"/* C867 */, /*24554*/"Hangul Syllable JYESS"/* C868 */,/*24555*/"Hangul Syllable JYENG"/* C869 */, /*24556*/"Hangul Syllable JYEJ"/* C86A */,/*24557*/"Hangul Syllable JYEC"/* C86B */, /*24558*/"Hangul Syllable JYEK"/* C86C */,/*24559*/"Hangul Syllable JYET"/* C86D */, /*24560*/"Hangul Syllable JYEP"/* C86E */,/*24561*/"Hangul Syllable JYEH"/* C86F */, /*24562*/"Hangul Syllable JO"/* C870 */,/*24563*/"Hangul Syllable JOG"/* C871 */, /*24564*/"Hangul Syllable JOGG"/* C872 */,/*24565*/"Hangul Syllable JOGS"/* C873 */, /*24566*/"Hangul Syllable JON"/* C874 */,/*24567*/"Hangul Syllable JONJ"/* C875 */, /*24568*/"Hangul Syllable JONH"/* C876 */,/*24569*/"Hangul Syllable JOD"/* C877 */, /*24570*/"Hangul Syllable JOL"/* C878 */,/*24571*/"Hangul Syllable JOLG"/* C879 */, /*24572*/"Hangul Syllable JOLM"/* C87A */,/*24573*/"Hangul Syllable JOLB"/* C87B */, /*24574*/"Hangul Syllable JOLS"/* C87C */,/*24575*/"Hangul Syllable JOLT"/* C87D */, /*24576*/"Hangul Syllable JOLP"/* C87E */,/*24577*/"Hangul Syllable JOLH"/* C87F */, /*24578*/"Hangul Syllable JOM"/* C880 */,/*24579*/"Hangul Syllable JOB"/* C881 */, /*24580*/"Hangul Syllable JOBS"/* C882 */,/*24581*/"Hangul Syllable JOS"/* C883 */, /*24582*/"Hangul Syllable JOSS"/* C884 */,/*24583*/"Hangul Syllable JONG"/* C885 */, /*24584*/"Hangul Syllable JOJ"/* C886 */,/*24585*/"Hangul Syllable JOC"/* C887 */, /*24586*/"Hangul Syllable JOK"/* C888 */,/*24587*/"Hangul Syllable JOT"/* C889 */, /*24588*/"Hangul Syllable JOP"/* C88A */,/*24589*/"Hangul Syllable JOH"/* C88B */, /*24590*/"Hangul Syllable JWA"/* C88C */,/*24591*/"Hangul Syllable JWAG"/* C88D */, /*24592*/"Hangul Syllable JWAGG"/* C88E */,/*24593*/"Hangul Syllable JWAGS"/* C88F */, /*24594*/"Hangul Syllable JWAN"/* C890 */,/*24595*/"Hangul Syllable JWANJ"/* C891 */, /*24596*/"Hangul Syllable JWANH"/* C892 */,/*24597*/"Hangul Syllable JWAD"/* C893 */, /*24598*/"Hangul Syllable JWAL"/* C894 */,/*24599*/"Hangul Syllable JWALG"/* C895 */, /*24600*/"Hangul Syllable JWALM"/* C896 */,/*24601*/"Hangul Syllable JWALB"/* C897 */, /*24602*/"Hangul Syllable JWALS"/* C898 */,/*24603*/"Hangul Syllable JWALT"/* C899 */, /*24604*/"Hangul Syllable JWALP"/* C89A */,/*24605*/"Hangul Syllable JWALH"/* C89B */, /*24606*/"Hangul Syllable JWAM"/* C89C */,/*24607*/"Hangul Syllable JWAB"/* C89D */, /*24608*/"Hangul Syllable JWABS"/* C89E */,/*24609*/"Hangul Syllable JWAS"/* C89F */, /*24610*/"Hangul Syllable JWASS"/* C8A0 */,/*24611*/"Hangul Syllable JWANG"/* C8A1 */, /*24612*/"Hangul Syllable JWAJ"/* C8A2 */,/*24613*/"Hangul Syllable JWAC"/* C8A3 */, /*24614*/"Hangul Syllable JWAK"/* C8A4 */,/*24615*/"Hangul Syllable JWAT"/* C8A5 */, /*24616*/"Hangul Syllable JWAP"/* C8A6 */,/*24617*/"Hangul Syllable JWAH"/* C8A7 */, /*24618*/"Hangul Syllable JWAE"/* C8A8 */,/*24619*/"Hangul Syllable JWAEG"/* C8A9 */, /*24620*/"Hangul Syllable JWAEGG"/* C8AA */,/*24621*/"Hangul Syllable JWAEGS"/* C8AB */, /*24622*/"Hangul Syllable JWAEN"/* C8AC */,/*24623*/"Hangul Syllable JWAENJ"/* C8AD */, /*24624*/"Hangul Syllable JWAENH"/* C8AE */,/*24625*/"Hangul Syllable JWAED"/* C8AF */, /*24626*/"Hangul Syllable JWAEL"/* C8B0 */,/*24627*/"Hangul Syllable JWAELG"/* C8B1 */, /*24628*/"Hangul Syllable JWAELM"/* C8B2 */,/*24629*/"Hangul Syllable JWAELB"/* C8B3 */, /*24630*/"Hangul Syllable JWAELS"/* C8B4 */,/*24631*/"Hangul Syllable JWAELT"/* C8B5 */, /*24632*/"Hangul Syllable JWAELP"/* C8B6 */,/*24633*/"Hangul Syllable JWAELH"/* C8B7 */, /*24634*/"Hangul Syllable JWAEM"/* C8B8 */,/*24635*/"Hangul Syllable JWAEB"/* C8B9 */, /*24636*/"Hangul Syllable JWAEBS"/* C8BA */,/*24637*/"Hangul Syllable JWAES"/* C8BB */, /*24638*/"Hangul Syllable JWAESS"/* C8BC */,/*24639*/"Hangul Syllable JWAENG"/* C8BD */, /*24640*/"Hangul Syllable JWAEJ"/* C8BE */,/*24641*/"Hangul Syllable JWAEC"/* C8BF */, /*24642*/"Hangul Syllable JWAEK"/* C8C0 */,/*24643*/"Hangul Syllable JWAET"/* C8C1 */, /*24644*/"Hangul Syllable JWAEP"/* C8C2 */,/*24645*/"Hangul Syllable JWAEH"/* C8C3 */, /*24646*/"Hangul Syllable JOE"/* C8C4 */,/*24647*/"Hangul Syllable JOEG"/* C8C5 */, /*24648*/"Hangul Syllable JOEGG"/* C8C6 */,/*24649*/"Hangul Syllable JOEGS"/* C8C7 */, /*24650*/"Hangul Syllable JOEN"/* C8C8 */,/*24651*/"Hangul Syllable JOENJ"/* C8C9 */, /*24652*/"Hangul Syllable JOENH"/* C8CA */,/*24653*/"Hangul Syllable JOED"/* C8CB */, /*24654*/"Hangul Syllable JOEL"/* C8CC */,/*24655*/"Hangul Syllable JOELG"/* C8CD */, /*24656*/"Hangul Syllable JOELM"/* C8CE */,/*24657*/"Hangul Syllable JOELB"/* C8CF */, /*24658*/"Hangul Syllable JOELS"/* C8D0 */,/*24659*/"Hangul Syllable JOELT"/* C8D1 */, /*24660*/"Hangul Syllable JOELP"/* C8D2 */,/*24661*/"Hangul Syllable JOELH"/* C8D3 */, /*24662*/"Hangul Syllable JOEM"/* C8D4 */,/*24663*/"Hangul Syllable JOEB"/* C8D5 */, /*24664*/"Hangul Syllable JOEBS"/* C8D6 */,/*24665*/"Hangul Syllable JOES"/* C8D7 */, /*24666*/"Hangul Syllable JOESS"/* C8D8 */,/*24667*/"Hangul Syllable JOENG"/* C8D9 */, /*24668*/"Hangul Syllable JOEJ"/* C8DA */,/*24669*/"Hangul Syllable JOEC"/* C8DB */, /*24670*/"Hangul Syllable JOEK"/* C8DC */,/*24671*/"Hangul Syllable JOET"/* C8DD */, /*24672*/"Hangul Syllable JOEP"/* C8DE */,/*24673*/"Hangul Syllable JOEH"/* C8DF */, /*24674*/"Hangul Syllable JYO"/* C8E0 */,/*24675*/"Hangul Syllable JYOG"/* C8E1 */, /*24676*/"Hangul Syllable JYOGG"/* C8E2 */,/*24677*/"Hangul Syllable JYOGS"/* C8E3 */, /*24678*/"Hangul Syllable JYON"/* C8E4 */,/*24679*/"Hangul Syllable JYONJ"/* C8E5 */, /*24680*/"Hangul Syllable JYONH"/* C8E6 */,/*24681*/"Hangul Syllable JYOD"/* C8E7 */, /*24682*/"Hangul Syllable JYOL"/* C8E8 */,/*24683*/"Hangul Syllable JYOLG"/* C8E9 */, /*24684*/"Hangul Syllable JYOLM"/* C8EA */,/*24685*/"Hangul Syllable JYOLB"/* C8EB */, /*24686*/"Hangul Syllable JYOLS"/* C8EC */,/*24687*/"Hangul Syllable JYOLT"/* C8ED */, /*24688*/"Hangul Syllable JYOLP"/* C8EE */,/*24689*/"Hangul Syllable JYOLH"/* C8EF */, /*24690*/"Hangul Syllable JYOM"/* C8F0 */,/*24691*/"Hangul Syllable JYOB"/* C8F1 */, /*24692*/"Hangul Syllable JYOBS"/* C8F2 */,/*24693*/"Hangul Syllable JYOS"/* C8F3 */, /*24694*/"Hangul Syllable JYOSS"/* C8F4 */,/*24695*/"Hangul Syllable JYONG"/* C8F5 */, /*24696*/"Hangul Syllable JYOJ"/* C8F6 */,/*24697*/"Hangul Syllable JYOC"/* C8F7 */, /*24698*/"Hangul Syllable JYOK"/* C8F8 */,/*24699*/"Hangul Syllable JYOT"/* C8F9 */, /*24700*/"Hangul Syllable JYOP"/* C8FA */,/*24701*/"Hangul Syllable JYOH"/* C8FB */, /*24702*/"Hangul Syllable JU"/* C8FC */,/*24703*/"Hangul Syllable JUG"/* C8FD */, /*24704*/"Hangul Syllable JUGG"/* C8FE */,/*24705*/"Hangul Syllable JUGS"/* C8FF */, /*24706*/"Hangul Syllable JUN"/* C900 */,/*24707*/"Hangul Syllable JUNJ"/* C901 */, /*24708*/"Hangul Syllable JUNH"/* C902 */,/*24709*/"Hangul Syllable JUD"/* C903 */, /*24710*/"Hangul Syllable JUL"/* C904 */,/*24711*/"Hangul Syllable JULG"/* C905 */, /*24712*/"Hangul Syllable JULM"/* C906 */,/*24713*/"Hangul Syllable JULB"/* C907 */, /*24714*/"Hangul Syllable JULS"/* C908 */,/*24715*/"Hangul Syllable JULT"/* C909 */, /*24716*/"Hangul Syllable JULP"/* C90A */,/*24717*/"Hangul Syllable JULH"/* C90B */, /*24718*/"Hangul Syllable JUM"/* C90C */,/*24719*/"Hangul Syllable JUB"/* C90D */, /*24720*/"Hangul Syllable JUBS"/* C90E */,/*24721*/"Hangul Syllable JUS"/* C90F */, /*24722*/"Hangul Syllable JUSS"/* C910 */,/*24723*/"Hangul Syllable JUNG"/* C911 */, /*24724*/"Hangul Syllable JUJ"/* C912 */,/*24725*/"Hangul Syllable JUC"/* C913 */, /*24726*/"Hangul Syllable JUK"/* C914 */,/*24727*/"Hangul Syllable JUT"/* C915 */, /*24728*/"Hangul Syllable JUP"/* C916 */,/*24729*/"Hangul Syllable JUH"/* C917 */, /*24730*/"Hangul Syllable JWEO"/* C918 */,/*24731*/"Hangul Syllable JWEOG"/* C919 */, /*24732*/"Hangul Syllable JWEOGG"/* C91A */,/*24733*/"Hangul Syllable JWEOGS"/* C91B */, /*24734*/"Hangul Syllable JWEON"/* C91C */,/*24735*/"Hangul Syllable JWEONJ"/* C91D */, /*24736*/"Hangul Syllable JWEONH"/* C91E */,/*24737*/"Hangul Syllable JWEOD"/* C91F */, /*24738*/"Hangul Syllable JWEOL"/* C920 */,/*24739*/"Hangul Syllable JWEOLG"/* C921 */, /*24740*/"Hangul Syllable JWEOLM"/* C922 */,/*24741*/"Hangul Syllable JWEOLB"/* C923 */, /*24742*/"Hangul Syllable JWEOLS"/* C924 */,/*24743*/"Hangul Syllable JWEOLT"/* C925 */, /*24744*/"Hangul Syllable JWEOLP"/* C926 */,/*24745*/"Hangul Syllable JWEOLH"/* C927 */, /*24746*/"Hangul Syllable JWEOM"/* C928 */,/*24747*/"Hangul Syllable JWEOB"/* C929 */, /*24748*/"Hangul Syllable JWEOBS"/* C92A */,/*24749*/"Hangul Syllable JWEOS"/* C92B */, /*24750*/"Hangul Syllable JWEOSS"/* C92C */,/*24751*/"Hangul Syllable JWEONG"/* C92D */, /*24752*/"Hangul Syllable JWEOJ"/* C92E */,/*24753*/"Hangul Syllable JWEOC"/* C92F */, /*24754*/"Hangul Syllable JWEOK"/* C930 */,/*24755*/"Hangul Syllable JWEOT"/* C931 */, /*24756*/"Hangul Syllable JWEOP"/* C932 */,/*24757*/"Hangul Syllable JWEOH"/* C933 */, /*24758*/"Hangul Syllable JWE"/* C934 */,/*24759*/"Hangul Syllable JWEG"/* C935 */, /*24760*/"Hangul Syllable JWEGG"/* C936 */,/*24761*/"Hangul Syllable JWEGS"/* C937 */, /*24762*/"Hangul Syllable JWEN"/* C938 */,/*24763*/"Hangul Syllable JWENJ"/* C939 */, /*24764*/"Hangul Syllable JWENH"/* C93A */,/*24765*/"Hangul Syllable JWED"/* C93B */, /*24766*/"Hangul Syllable JWEL"/* C93C */,/*24767*/"Hangul Syllable JWELG"/* C93D */, /*24768*/"Hangul Syllable JWELM"/* C93E */,/*24769*/"Hangul Syllable JWELB"/* C93F */, /*24770*/"Hangul Syllable JWELS"/* C940 */,/*24771*/"Hangul Syllable JWELT"/* C941 */, /*24772*/"Hangul Syllable JWELP"/* C942 */,/*24773*/"Hangul Syllable JWELH"/* C943 */, /*24774*/"Hangul Syllable JWEM"/* C944 */,/*24775*/"Hangul Syllable JWEB"/* C945 */, /*24776*/"Hangul Syllable JWEBS"/* C946 */,/*24777*/"Hangul Syllable JWES"/* C947 */, /*24778*/"Hangul Syllable JWESS"/* C948 */,/*24779*/"Hangul Syllable JWENG"/* C949 */, /*24780*/"Hangul Syllable JWEJ"/* C94A */,/*24781*/"Hangul Syllable JWEC"/* C94B */, /*24782*/"Hangul Syllable JWEK"/* C94C */,/*24783*/"Hangul Syllable JWET"/* C94D */, /*24784*/"Hangul Syllable JWEP"/* C94E */,/*24785*/"Hangul Syllable JWEH"/* C94F */, /*24786*/"Hangul Syllable JWI"/* C950 */,/*24787*/"Hangul Syllable JWIG"/* C951 */, /*24788*/"Hangul Syllable JWIGG"/* C952 */,/*24789*/"Hangul Syllable JWIGS"/* C953 */, /*24790*/"Hangul Syllable JWIN"/* C954 */,/*24791*/"Hangul Syllable JWINJ"/* C955 */, /*24792*/"Hangul Syllable JWINH"/* C956 */,/*24793*/"Hangul Syllable JWID"/* C957 */, /*24794*/"Hangul Syllable JWIL"/* C958 */,/*24795*/"Hangul Syllable JWILG"/* C959 */, /*24796*/"Hangul Syllable JWILM"/* C95A */,/*24797*/"Hangul Syllable JWILB"/* C95B */, /*24798*/"Hangul Syllable JWILS"/* C95C */,/*24799*/"Hangul Syllable JWILT"/* C95D */, /*24800*/"Hangul Syllable JWILP"/* C95E */,/*24801*/"Hangul Syllable JWILH"/* C95F */, /*24802*/"Hangul Syllable JWIM"/* C960 */,/*24803*/"Hangul Syllable JWIB"/* C961 */, /*24804*/"Hangul Syllable JWIBS"/* C962 */,/*24805*/"Hangul Syllable JWIS"/* C963 */, /*24806*/"Hangul Syllable JWISS"/* C964 */,/*24807*/"Hangul Syllable JWING"/* C965 */, /*24808*/"Hangul Syllable JWIJ"/* C966 */,/*24809*/"Hangul Syllable JWIC"/* C967 */, /*24810*/"Hangul Syllable JWIK"/* C968 */,/*24811*/"Hangul Syllable JWIT"/* C969 */, /*24812*/"Hangul Syllable JWIP"/* C96A */,/*24813*/"Hangul Syllable JWIH"/* C96B */, /*24814*/"Hangul Syllable JYU"/* C96C */,/*24815*/"Hangul Syllable JYUG"/* C96D */, /*24816*/"Hangul Syllable JYUGG"/* C96E */,/*24817*/"Hangul Syllable JYUGS"/* C96F */, /*24818*/"Hangul Syllable JYUN"/* C970 */,/*24819*/"Hangul Syllable JYUNJ"/* C971 */, /*24820*/"Hangul Syllable JYUNH"/* C972 */,/*24821*/"Hangul Syllable JYUD"/* C973 */, /*24822*/"Hangul Syllable JYUL"/* C974 */,/*24823*/"Hangul Syllable JYULG"/* C975 */, /*24824*/"Hangul Syllable JYULM"/* C976 */,/*24825*/"Hangul Syllable JYULB"/* C977 */, /*24826*/"Hangul Syllable JYULS"/* C978 */,/*24827*/"Hangul Syllable JYULT"/* C979 */, /*24828*/"Hangul Syllable JYULP"/* C97A */,/*24829*/"Hangul Syllable JYULH"/* C97B */, /*24830*/"Hangul Syllable JYUM"/* C97C */,/*24831*/"Hangul Syllable JYUB"/* C97D */, /*24832*/"Hangul Syllable JYUBS"/* C97E */,/*24833*/"Hangul Syllable JYUS"/* C97F */, /*24834*/"Hangul Syllable JYUSS"/* C980 */,/*24835*/"Hangul Syllable JYUNG"/* C981 */, /*24836*/"Hangul Syllable JYUJ"/* C982 */,/*24837*/"Hangul Syllable JYUC"/* C983 */, /*24838*/"Hangul Syllable JYUK"/* C984 */,/*24839*/"Hangul Syllable JYUT"/* C985 */, /*24840*/"Hangul Syllable JYUP"/* C986 */,/*24841*/"Hangul Syllable JYUH"/* C987 */, /*24842*/"Hangul Syllable JEU"/* C988 */,/*24843*/"Hangul Syllable JEUG"/* C989 */, /*24844*/"Hangul Syllable JEUGG"/* C98A */,/*24845*/"Hangul Syllable JEUGS"/* C98B */, /*24846*/"Hangul Syllable JEUN"/* C98C */,/*24847*/"Hangul Syllable JEUNJ"/* C98D */, /*24848*/"Hangul Syllable JEUNH"/* C98E */,/*24849*/"Hangul Syllable JEUD"/* C98F */, /*24850*/"Hangul Syllable JEUL"/* C990 */,/*24851*/"Hangul Syllable JEULG"/* C991 */, /*24852*/"Hangul Syllable JEULM"/* C992 */,/*24853*/"Hangul Syllable JEULB"/* C993 */, /*24854*/"Hangul Syllable JEULS"/* C994 */,/*24855*/"Hangul Syllable JEULT"/* C995 */, /*24856*/"Hangul Syllable JEULP"/* C996 */,/*24857*/"Hangul Syllable JEULH"/* C997 */, /*24858*/"Hangul Syllable JEUM"/* C998 */,/*24859*/"Hangul Syllable JEUB"/* C999 */, /*24860*/"Hangul Syllable JEUBS"/* C99A */,/*24861*/"Hangul Syllable JEUS"/* C99B */, /*24862*/"Hangul Syllable JEUSS"/* C99C */,/*24863*/"Hangul Syllable JEUNG"/* C99D */, /*24864*/"Hangul Syllable JEUJ"/* C99E */,/*24865*/"Hangul Syllable JEUC"/* C99F */, /*24866*/"Hangul Syllable JEUK"/* C9A0 */,/*24867*/"Hangul Syllable JEUT"/* C9A1 */, /*24868*/"Hangul Syllable JEUP"/* C9A2 */,/*24869*/"Hangul Syllable JEUH"/* C9A3 */, /*24870*/"Hangul Syllable JYI"/* C9A4 */,/*24871*/"Hangul Syllable JYIG"/* C9A5 */, /*24872*/"Hangul Syllable JYIGG"/* C9A6 */,/*24873*/"Hangul Syllable JYIGS"/* C9A7 */, /*24874*/"Hangul Syllable JYIN"/* C9A8 */,/*24875*/"Hangul Syllable JYINJ"/* C9A9 */, /*24876*/"Hangul Syllable JYINH"/* C9AA */,/*24877*/"Hangul Syllable JYID"/* C9AB */, /*24878*/"Hangul Syllable JYIL"/* C9AC */,/*24879*/"Hangul Syllable JYILG"/* C9AD */, /*24880*/"Hangul Syllable JYILM"/* C9AE */,/*24881*/"Hangul Syllable JYILB"/* C9AF */, /*24882*/"Hangul Syllable JYILS"/* C9B0 */,/*24883*/"Hangul Syllable JYILT"/* C9B1 */, /*24884*/"Hangul Syllable JYILP"/* C9B2 */,/*24885*/"Hangul Syllable JYILH"/* C9B3 */, /*24886*/"Hangul Syllable JYIM"/* C9B4 */,/*24887*/"Hangul Syllable JYIB"/* C9B5 */, /*24888*/"Hangul Syllable JYIBS"/* C9B6 */,/*24889*/"Hangul Syllable JYIS"/* C9B7 */, /*24890*/"Hangul Syllable JYISS"/* C9B8 */,/*24891*/"Hangul Syllable JYING"/* C9B9 */, /*24892*/"Hangul Syllable JYIJ"/* C9BA */,/*24893*/"Hangul Syllable JYIC"/* C9BB */, /*24894*/"Hangul Syllable JYIK"/* C9BC */,/*24895*/"Hangul Syllable JYIT"/* C9BD */, /*24896*/"Hangul Syllable JYIP"/* C9BE */,/*24897*/"Hangul Syllable JYIH"/* C9BF */, /*24898*/"Hangul Syllable JI"/* C9C0 */,/*24899*/"Hangul Syllable JIG"/* C9C1 */, /*24900*/"Hangul Syllable JIGG"/* C9C2 */,/*24901*/"Hangul Syllable JIGS"/* C9C3 */, /*24902*/"Hangul Syllable JIN"/* C9C4 */,/*24903*/"Hangul Syllable JINJ"/* C9C5 */, /*24904*/"Hangul Syllable JINH"/* C9C6 */,/*24905*/"Hangul Syllable JID"/* C9C7 */, /*24906*/"Hangul Syllable JIL"/* C9C8 */,/*24907*/"Hangul Syllable JILG"/* C9C9 */, /*24908*/"Hangul Syllable JILM"/* C9CA */,/*24909*/"Hangul Syllable JILB"/* C9CB */, /*24910*/"Hangul Syllable JILS"/* C9CC */,/*24911*/"Hangul Syllable JILT"/* C9CD */, /*24912*/"Hangul Syllable JILP"/* C9CE */,/*24913*/"Hangul Syllable JILH"/* C9CF */, /*24914*/"Hangul Syllable JIM"/* C9D0 */,/*24915*/"Hangul Syllable JIB"/* C9D1 */, /*24916*/"Hangul Syllable JIBS"/* C9D2 */,/*24917*/"Hangul Syllable JIS"/* C9D3 */, /*24918*/"Hangul Syllable JISS"/* C9D4 */,/*24919*/"Hangul Syllable JING"/* C9D5 */, /*24920*/"Hangul Syllable JIJ"/* C9D6 */,/*24921*/"Hangul Syllable JIC"/* C9D7 */, /*24922*/"Hangul Syllable JIK"/* C9D8 */,/*24923*/"Hangul Syllable JIT"/* C9D9 */, /*24924*/"Hangul Syllable JIP"/* C9DA */,/*24925*/"Hangul Syllable JIH"/* C9DB */, /*24926*/"Hangul Syllable JJA"/* C9DC */,/*24927*/"Hangul Syllable JJAG"/* C9DD */, /*24928*/"Hangul Syllable JJAGG"/* C9DE */,/*24929*/"Hangul Syllable JJAGS"/* C9DF */, /*24930*/"Hangul Syllable JJAN"/* C9E0 */,/*24931*/"Hangul Syllable JJANJ"/* C9E1 */, /*24932*/"Hangul Syllable JJANH"/* C9E2 */,/*24933*/"Hangul Syllable JJAD"/* C9E3 */, /*24934*/"Hangul Syllable JJAL"/* C9E4 */,/*24935*/"Hangul Syllable JJALG"/* C9E5 */, /*24936*/"Hangul Syllable JJALM"/* C9E6 */,/*24937*/"Hangul Syllable JJALB"/* C9E7 */, /*24938*/"Hangul Syllable JJALS"/* C9E8 */,/*24939*/"Hangul Syllable JJALT"/* C9E9 */, /*24940*/"Hangul Syllable JJALP"/* C9EA */,/*24941*/"Hangul Syllable JJALH"/* C9EB */, /*24942*/"Hangul Syllable JJAM"/* C9EC */,/*24943*/"Hangul Syllable JJAB"/* C9ED */, /*24944*/"Hangul Syllable JJABS"/* C9EE */,/*24945*/"Hangul Syllable JJAS"/* C9EF */, /*24946*/"Hangul Syllable JJASS"/* C9F0 */,/*24947*/"Hangul Syllable JJANG"/* C9F1 */, /*24948*/"Hangul Syllable JJAJ"/* C9F2 */,/*24949*/"Hangul Syllable JJAC"/* C9F3 */, /*24950*/"Hangul Syllable JJAK"/* C9F4 */,/*24951*/"Hangul Syllable JJAT"/* C9F5 */, /*24952*/"Hangul Syllable JJAP"/* C9F6 */,/*24953*/"Hangul Syllable JJAH"/* C9F7 */, /*24954*/"Hangul Syllable JJAE"/* C9F8 */,/*24955*/"Hangul Syllable JJAEG"/* C9F9 */, /*24956*/"Hangul Syllable JJAEGG"/* C9FA */,/*24957*/"Hangul Syllable JJAEGS"/* C9FB */, /*24958*/"Hangul Syllable JJAEN"/* C9FC */,/*24959*/"Hangul Syllable JJAENJ"/* C9FD */, /*24960*/"Hangul Syllable JJAENH"/* C9FE */,/*24961*/"Hangul Syllable JJAED"/* C9FF */, /*24962*/"Hangul Syllable JJAEL"/* CA00 */,/*24963*/"Hangul Syllable JJAELG"/* CA01 */, /*24964*/"Hangul Syllable JJAELM"/* CA02 */,/*24965*/"Hangul Syllable JJAELB"/* CA03 */, /*24966*/"Hangul Syllable JJAELS"/* CA04 */,/*24967*/"Hangul Syllable JJAELT"/* CA05 */, /*24968*/"Hangul Syllable JJAELP"/* CA06 */,/*24969*/"Hangul Syllable JJAELH"/* CA07 */, /*24970*/"Hangul Syllable JJAEM"/* CA08 */,/*24971*/"Hangul Syllable JJAEB"/* CA09 */, /*24972*/"Hangul Syllable JJAEBS"/* CA0A */,/*24973*/"Hangul Syllable JJAES"/* CA0B */, /*24974*/"Hangul Syllable JJAESS"/* CA0C */,/*24975*/"Hangul Syllable JJAENG"/* CA0D */, /*24976*/"Hangul Syllable JJAEJ"/* CA0E */,/*24977*/"Hangul Syllable JJAEC"/* CA0F */, /*24978*/"Hangul Syllable JJAEK"/* CA10 */,/*24979*/"Hangul Syllable JJAET"/* CA11 */, /*24980*/"Hangul Syllable JJAEP"/* CA12 */,/*24981*/"Hangul Syllable JJAEH"/* CA13 */, /*24982*/"Hangul Syllable JJYA"/* CA14 */,/*24983*/"Hangul Syllable JJYAG"/* CA15 */, /*24984*/"Hangul Syllable JJYAGG"/* CA16 */,/*24985*/"Hangul Syllable JJYAGS"/* CA17 */, /*24986*/"Hangul Syllable JJYAN"/* CA18 */,/*24987*/"Hangul Syllable JJYANJ"/* CA19 */, /*24988*/"Hangul Syllable JJYANH"/* CA1A */,/*24989*/"Hangul Syllable JJYAD"/* CA1B */, /*24990*/"Hangul Syllable JJYAL"/* CA1C */,/*24991*/"Hangul Syllable JJYALG"/* CA1D */, /*24992*/"Hangul Syllable JJYALM"/* CA1E */,/*24993*/"Hangul Syllable JJYALB"/* CA1F */, /*24994*/"Hangul Syllable JJYALS"/* CA20 */,/*24995*/"Hangul Syllable JJYALT"/* CA21 */, /*24996*/"Hangul Syllable JJYALP"/* CA22 */,/*24997*/"Hangul Syllable JJYALH"/* CA23 */, /*24998*/"Hangul Syllable JJYAM"/* CA24 */,/*24999*/"Hangul Syllable JJYAB"/* CA25 */, /*25000*/"Hangul Syllable JJYABS"/* CA26 */,/*25001*/"Hangul Syllable JJYAS"/* CA27 */, /*25002*/"Hangul Syllable JJYASS"/* CA28 */,/*25003*/"Hangul Syllable JJYANG"/* CA29 */, /*25004*/"Hangul Syllable JJYAJ"/* CA2A */,/*25005*/"Hangul Syllable JJYAC"/* CA2B */, /*25006*/"Hangul Syllable JJYAK"/* CA2C */,/*25007*/"Hangul Syllable JJYAT"/* CA2D */, /*25008*/"Hangul Syllable JJYAP"/* CA2E */,/*25009*/"Hangul Syllable JJYAH"/* CA2F */, /*25010*/"Hangul Syllable JJYAE"/* CA30 */,/*25011*/"Hangul Syllable JJYAEG"/* CA31 */, /*25012*/"Hangul Syllable JJYAEGG"/* CA32 */,/*25013*/"Hangul Syllable JJYAEGS"/* CA33 */, /*25014*/"Hangul Syllable JJYAEN"/* CA34 */,/*25015*/"Hangul Syllable JJYAENJ"/* CA35 */, /*25016*/"Hangul Syllable JJYAENH"/* CA36 */,/*25017*/"Hangul Syllable JJYAED"/* CA37 */, /*25018*/"Hangul Syllable JJYAEL"/* CA38 */,/*25019*/"Hangul Syllable JJYAELG"/* CA39 */, /*25020*/"Hangul Syllable JJYAELM"/* CA3A */,/*25021*/"Hangul Syllable JJYAELB"/* CA3B */, /*25022*/"Hangul Syllable JJYAELS"/* CA3C */,/*25023*/"Hangul Syllable JJYAELT"/* CA3D */, /*25024*/"Hangul Syllable JJYAELP"/* CA3E */,/*25025*/"Hangul Syllable JJYAELH"/* CA3F */, /*25026*/"Hangul Syllable JJYAEM"/* CA40 */,/*25027*/"Hangul Syllable JJYAEB"/* CA41 */, /*25028*/"Hangul Syllable JJYAEBS"/* CA42 */,/*25029*/"Hangul Syllable JJYAES"/* CA43 */, /*25030*/"Hangul Syllable JJYAESS"/* CA44 */,/*25031*/"Hangul Syllable JJYAENG"/* CA45 */, /*25032*/"Hangul Syllable JJYAEJ"/* CA46 */,/*25033*/"Hangul Syllable JJYAEC"/* CA47 */, /*25034*/"Hangul Syllable JJYAEK"/* CA48 */,/*25035*/"Hangul Syllable JJYAET"/* CA49 */, /*25036*/"Hangul Syllable JJYAEP"/* CA4A */,/*25037*/"Hangul Syllable JJYAEH"/* CA4B */, /*25038*/"Hangul Syllable JJEO"/* CA4C */,/*25039*/"Hangul Syllable JJEOG"/* CA4D */, /*25040*/"Hangul Syllable JJEOGG"/* CA4E */,/*25041*/"Hangul Syllable JJEOGS"/* CA4F */, /*25042*/"Hangul Syllable JJEON"/* CA50 */,/*25043*/"Hangul Syllable JJEONJ"/* CA51 */, /*25044*/"Hangul Syllable JJEONH"/* CA52 */,/*25045*/"Hangul Syllable JJEOD"/* CA53 */, /*25046*/"Hangul Syllable JJEOL"/* CA54 */,/*25047*/"Hangul Syllable JJEOLG"/* CA55 */, /*25048*/"Hangul Syllable JJEOLM"/* CA56 */,/*25049*/"Hangul Syllable JJEOLB"/* CA57 */, /*25050*/"Hangul Syllable JJEOLS"/* CA58 */,/*25051*/"Hangul Syllable JJEOLT"/* CA59 */, /*25052*/"Hangul Syllable JJEOLP"/* CA5A */,/*25053*/"Hangul Syllable JJEOLH"/* CA5B */, /*25054*/"Hangul Syllable JJEOM"/* CA5C */,/*25055*/"Hangul Syllable JJEOB"/* CA5D */, /*25056*/"Hangul Syllable JJEOBS"/* CA5E */,/*25057*/"Hangul Syllable JJEOS"/* CA5F */, /*25058*/"Hangul Syllable JJEOSS"/* CA60 */,/*25059*/"Hangul Syllable JJEONG"/* CA61 */, /*25060*/"Hangul Syllable JJEOJ"/* CA62 */,/*25061*/"Hangul Syllable JJEOC"/* CA63 */, /*25062*/"Hangul Syllable JJEOK"/* CA64 */,/*25063*/"Hangul Syllable JJEOT"/* CA65 */, /*25064*/"Hangul Syllable JJEOP"/* CA66 */,/*25065*/"Hangul Syllable JJEOH"/* CA67 */, /*25066*/"Hangul Syllable JJE"/* CA68 */,/*25067*/"Hangul Syllable JJEG"/* CA69 */, /*25068*/"Hangul Syllable JJEGG"/* CA6A */,/*25069*/"Hangul Syllable JJEGS"/* CA6B */, /*25070*/"Hangul Syllable JJEN"/* CA6C */,/*25071*/"Hangul Syllable JJENJ"/* CA6D */, /*25072*/"Hangul Syllable JJENH"/* CA6E */,/*25073*/"Hangul Syllable JJED"/* CA6F */, /*25074*/"Hangul Syllable JJEL"/* CA70 */,/*25075*/"Hangul Syllable JJELG"/* CA71 */, /*25076*/"Hangul Syllable JJELM"/* CA72 */,/*25077*/"Hangul Syllable JJELB"/* CA73 */, /*25078*/"Hangul Syllable JJELS"/* CA74 */,/*25079*/"Hangul Syllable JJELT"/* CA75 */, /*25080*/"Hangul Syllable JJELP"/* CA76 */,/*25081*/"Hangul Syllable JJELH"/* CA77 */, /*25082*/"Hangul Syllable JJEM"/* CA78 */,/*25083*/"Hangul Syllable JJEB"/* CA79 */, /*25084*/"Hangul Syllable JJEBS"/* CA7A */,/*25085*/"Hangul Syllable JJES"/* CA7B */, /*25086*/"Hangul Syllable JJESS"/* CA7C */,/*25087*/"Hangul Syllable JJENG"/* CA7D */, /*25088*/"Hangul Syllable JJEJ"/* CA7E */,/*25089*/"Hangul Syllable JJEC"/* CA7F */, /*25090*/"Hangul Syllable JJEK"/* CA80 */,/*25091*/"Hangul Syllable JJET"/* CA81 */, /*25092*/"Hangul Syllable JJEP"/* CA82 */,/*25093*/"Hangul Syllable JJEH"/* CA83 */, /*25094*/"Hangul Syllable JJYEO"/* CA84 */,/*25095*/"Hangul Syllable JJYEOG"/* CA85 */, /*25096*/"Hangul Syllable JJYEOGG"/* CA86 */,/*25097*/"Hangul Syllable JJYEOGS"/* CA87 */, /*25098*/"Hangul Syllable JJYEON"/* CA88 */,/*25099*/"Hangul Syllable JJYEONJ"/* CA89 */, /*25100*/"Hangul Syllable JJYEONH"/* CA8A */,/*25101*/"Hangul Syllable JJYEOD"/* CA8B */, /*25102*/"Hangul Syllable JJYEOL"/* CA8C */,/*25103*/"Hangul Syllable JJYEOLG"/* CA8D */, /*25104*/"Hangul Syllable JJYEOLM"/* CA8E */,/*25105*/"Hangul Syllable JJYEOLB"/* CA8F */, /*25106*/"Hangul Syllable JJYEOLS"/* CA90 */,/*25107*/"Hangul Syllable JJYEOLT"/* CA91 */, /*25108*/"Hangul Syllable JJYEOLP"/* CA92 */,/*25109*/"Hangul Syllable JJYEOLH"/* CA93 */, /*25110*/"Hangul Syllable JJYEOM"/* CA94 */,/*25111*/"Hangul Syllable JJYEOB"/* CA95 */, /*25112*/"Hangul Syllable JJYEOBS"/* CA96 */,/*25113*/"Hangul Syllable JJYEOS"/* CA97 */, /*25114*/"Hangul Syllable JJYEOSS"/* CA98 */,/*25115*/"Hangul Syllable JJYEONG"/* CA99 */, /*25116*/"Hangul Syllable JJYEOJ"/* CA9A */,/*25117*/"Hangul Syllable JJYEOC"/* CA9B */, /*25118*/"Hangul Syllable JJYEOK"/* CA9C */,/*25119*/"Hangul Syllable JJYEOT"/* CA9D */, /*25120*/"Hangul Syllable JJYEOP"/* CA9E */,/*25121*/"Hangul Syllable JJYEOH"/* CA9F */, /*25122*/"Hangul Syllable JJYE"/* CAA0 */,/*25123*/"Hangul Syllable JJYEG"/* CAA1 */, /*25124*/"Hangul Syllable JJYEGG"/* CAA2 */,/*25125*/"Hangul Syllable JJYEGS"/* CAA3 */, /*25126*/"Hangul Syllable JJYEN"/* CAA4 */,/*25127*/"Hangul Syllable JJYENJ"/* CAA5 */, /*25128*/"Hangul Syllable JJYENH"/* CAA6 */,/*25129*/"Hangul Syllable JJYED"/* CAA7 */, /*25130*/"Hangul Syllable JJYEL"/* CAA8 */,/*25131*/"Hangul Syllable JJYELG"/* CAA9 */, /*25132*/"Hangul Syllable JJYELM"/* CAAA */,/*25133*/"Hangul Syllable JJYELB"/* CAAB */, /*25134*/"Hangul Syllable JJYELS"/* CAAC */,/*25135*/"Hangul Syllable JJYELT"/* CAAD */, /*25136*/"Hangul Syllable JJYELP"/* CAAE */,/*25137*/"Hangul Syllable JJYELH"/* CAAF */, /*25138*/"Hangul Syllable JJYEM"/* CAB0 */,/*25139*/"Hangul Syllable JJYEB"/* CAB1 */, /*25140*/"Hangul Syllable JJYEBS"/* CAB2 */,/*25141*/"Hangul Syllable JJYES"/* CAB3 */, /*25142*/"Hangul Syllable JJYESS"/* CAB4 */,/*25143*/"Hangul Syllable JJYENG"/* CAB5 */, /*25144*/"Hangul Syllable JJYEJ"/* CAB6 */,/*25145*/"Hangul Syllable JJYEC"/* CAB7 */, /*25146*/"Hangul Syllable JJYEK"/* CAB8 */,/*25147*/"Hangul Syllable JJYET"/* CAB9 */, /*25148*/"Hangul Syllable JJYEP"/* CABA */,/*25149*/"Hangul Syllable JJYEH"/* CABB */, /*25150*/"Hangul Syllable JJO"/* CABC */,/*25151*/"Hangul Syllable JJOG"/* CABD */, /*25152*/"Hangul Syllable JJOGG"/* CABE */,/*25153*/"Hangul Syllable JJOGS"/* CABF */, /*25154*/"Hangul Syllable JJON"/* CAC0 */,/*25155*/"Hangul Syllable JJONJ"/* CAC1 */, /*25156*/"Hangul Syllable JJONH"/* CAC2 */,/*25157*/"Hangul Syllable JJOD"/* CAC3 */, /*25158*/"Hangul Syllable JJOL"/* CAC4 */,/*25159*/"Hangul Syllable JJOLG"/* CAC5 */, /*25160*/"Hangul Syllable JJOLM"/* CAC6 */,/*25161*/"Hangul Syllable JJOLB"/* CAC7 */, /*25162*/"Hangul Syllable JJOLS"/* CAC8 */,/*25163*/"Hangul Syllable JJOLT"/* CAC9 */, /*25164*/"Hangul Syllable JJOLP"/* CACA */,/*25165*/"Hangul Syllable JJOLH"/* CACB */, /*25166*/"Hangul Syllable JJOM"/* CACC */,/*25167*/"Hangul Syllable JJOB"/* CACD */, /*25168*/"Hangul Syllable JJOBS"/* CACE */,/*25169*/"Hangul Syllable JJOS"/* CACF */, /*25170*/"Hangul Syllable JJOSS"/* CAD0 */,/*25171*/"Hangul Syllable JJONG"/* CAD1 */, /*25172*/"Hangul Syllable JJOJ"/* CAD2 */,/*25173*/"Hangul Syllable JJOC"/* CAD3 */, /*25174*/"Hangul Syllable JJOK"/* CAD4 */,/*25175*/"Hangul Syllable JJOT"/* CAD5 */, /*25176*/"Hangul Syllable JJOP"/* CAD6 */,/*25177*/"Hangul Syllable JJOH"/* CAD7 */, /*25178*/"Hangul Syllable JJWA"/* CAD8 */,/*25179*/"Hangul Syllable JJWAG"/* CAD9 */, /*25180*/"Hangul Syllable JJWAGG"/* CADA */,/*25181*/"Hangul Syllable JJWAGS"/* CADB */, /*25182*/"Hangul Syllable JJWAN"/* CADC */,/*25183*/"Hangul Syllable JJWANJ"/* CADD */, /*25184*/"Hangul Syllable JJWANH"/* CADE */,/*25185*/"Hangul Syllable JJWAD"/* CADF */, /*25186*/"Hangul Syllable JJWAL"/* CAE0 */,/*25187*/"Hangul Syllable JJWALG"/* CAE1 */, /*25188*/"Hangul Syllable JJWALM"/* CAE2 */,/*25189*/"Hangul Syllable JJWALB"/* CAE3 */, /*25190*/"Hangul Syllable JJWALS"/* CAE4 */,/*25191*/"Hangul Syllable JJWALT"/* CAE5 */, /*25192*/"Hangul Syllable JJWALP"/* CAE6 */,/*25193*/"Hangul Syllable JJWALH"/* CAE7 */, /*25194*/"Hangul Syllable JJWAM"/* CAE8 */,/*25195*/"Hangul Syllable JJWAB"/* CAE9 */, /*25196*/"Hangul Syllable JJWABS"/* CAEA */,/*25197*/"Hangul Syllable JJWAS"/* CAEB */, /*25198*/"Hangul Syllable JJWASS"/* CAEC */,/*25199*/"Hangul Syllable JJWANG"/* CAED */, /*25200*/"Hangul Syllable JJWAJ"/* CAEE */,/*25201*/"Hangul Syllable JJWAC"/* CAEF */, /*25202*/"Hangul Syllable JJWAK"/* CAF0 */,/*25203*/"Hangul Syllable JJWAT"/* CAF1 */, /*25204*/"Hangul Syllable JJWAP"/* CAF2 */,/*25205*/"Hangul Syllable JJWAH"/* CAF3 */, /*25206*/"Hangul Syllable JJWAE"/* CAF4 */,/*25207*/"Hangul Syllable JJWAEG"/* CAF5 */, /*25208*/"Hangul Syllable JJWAEGG"/* CAF6 */,/*25209*/"Hangul Syllable JJWAEGS"/* CAF7 */, /*25210*/"Hangul Syllable JJWAEN"/* CAF8 */,/*25211*/"Hangul Syllable JJWAENJ"/* CAF9 */, /*25212*/"Hangul Syllable JJWAENH"/* CAFA */,/*25213*/"Hangul Syllable JJWAED"/* CAFB */, /*25214*/"Hangul Syllable JJWAEL"/* CAFC */,/*25215*/"Hangul Syllable JJWAELG"/* CAFD */, /*25216*/"Hangul Syllable JJWAELM"/* CAFE */,/*25217*/"Hangul Syllable JJWAELB"/* CAFF */, /*25218*/"Hangul Syllable JJWAELS"/* CB00 */,/*25219*/"Hangul Syllable JJWAELT"/* CB01 */, /*25220*/"Hangul Syllable JJWAELP"/* CB02 */,/*25221*/"Hangul Syllable JJWAELH"/* CB03 */, /*25222*/"Hangul Syllable JJWAEM"/* CB04 */,/*25223*/"Hangul Syllable JJWAEB"/* CB05 */, /*25224*/"Hangul Syllable JJWAEBS"/* CB06 */,/*25225*/"Hangul Syllable JJWAES"/* CB07 */, /*25226*/"Hangul Syllable JJWAESS"/* CB08 */,/*25227*/"Hangul Syllable JJWAENG"/* CB09 */, /*25228*/"Hangul Syllable JJWAEJ"/* CB0A */,/*25229*/"Hangul Syllable JJWAEC"/* CB0B */, /*25230*/"Hangul Syllable JJWAEK"/* CB0C */,/*25231*/"Hangul Syllable JJWAET"/* CB0D */, /*25232*/"Hangul Syllable JJWAEP"/* CB0E */,/*25233*/"Hangul Syllable JJWAEH"/* CB0F */, /*25234*/"Hangul Syllable JJOE"/* CB10 */,/*25235*/"Hangul Syllable JJOEG"/* CB11 */, /*25236*/"Hangul Syllable JJOEGG"/* CB12 */,/*25237*/"Hangul Syllable JJOEGS"/* CB13 */, /*25238*/"Hangul Syllable JJOEN"/* CB14 */,/*25239*/"Hangul Syllable JJOENJ"/* CB15 */, /*25240*/"Hangul Syllable JJOENH"/* CB16 */,/*25241*/"Hangul Syllable JJOED"/* CB17 */, /*25242*/"Hangul Syllable JJOEL"/* CB18 */,/*25243*/"Hangul Syllable JJOELG"/* CB19 */, /*25244*/"Hangul Syllable JJOELM"/* CB1A */,/*25245*/"Hangul Syllable JJOELB"/* CB1B */, /*25246*/"Hangul Syllable JJOELS"/* CB1C */,/*25247*/"Hangul Syllable JJOELT"/* CB1D */, /*25248*/"Hangul Syllable JJOELP"/* CB1E */,/*25249*/"Hangul Syllable JJOELH"/* CB1F */, /*25250*/"Hangul Syllable JJOEM"/* CB20 */,/*25251*/"Hangul Syllable JJOEB"/* CB21 */, /*25252*/"Hangul Syllable JJOEBS"/* CB22 */,/*25253*/"Hangul Syllable JJOES"/* CB23 */, /*25254*/"Hangul Syllable JJOESS"/* CB24 */,/*25255*/"Hangul Syllable JJOENG"/* CB25 */, /*25256*/"Hangul Syllable JJOEJ"/* CB26 */,/*25257*/"Hangul Syllable JJOEC"/* CB27 */, /*25258*/"Hangul Syllable JJOEK"/* CB28 */,/*25259*/"Hangul Syllable JJOET"/* CB29 */, /*25260*/"Hangul Syllable JJOEP"/* CB2A */,/*25261*/"Hangul Syllable JJOEH"/* CB2B */, /*25262*/"Hangul Syllable JJYO"/* CB2C */,/*25263*/"Hangul Syllable JJYOG"/* CB2D */, /*25264*/"Hangul Syllable JJYOGG"/* CB2E */,/*25265*/"Hangul Syllable JJYOGS"/* CB2F */, /*25266*/"Hangul Syllable JJYON"/* CB30 */,/*25267*/"Hangul Syllable JJYONJ"/* CB31 */, /*25268*/"Hangul Syllable JJYONH"/* CB32 */,/*25269*/"Hangul Syllable JJYOD"/* CB33 */, /*25270*/"Hangul Syllable JJYOL"/* CB34 */,/*25271*/"Hangul Syllable JJYOLG"/* CB35 */, /*25272*/"Hangul Syllable JJYOLM"/* CB36 */,/*25273*/"Hangul Syllable JJYOLB"/* CB37 */, /*25274*/"Hangul Syllable JJYOLS"/* CB38 */,/*25275*/"Hangul Syllable JJYOLT"/* CB39 */, /*25276*/"Hangul Syllable JJYOLP"/* CB3A */,/*25277*/"Hangul Syllable JJYOLH"/* CB3B */, /*25278*/"Hangul Syllable JJYOM"/* CB3C */,/*25279*/"Hangul Syllable JJYOB"/* CB3D */, /*25280*/"Hangul Syllable JJYOBS"/* CB3E */,/*25281*/"Hangul Syllable JJYOS"/* CB3F */, /*25282*/"Hangul Syllable JJYOSS"/* CB40 */,/*25283*/"Hangul Syllable JJYONG"/* CB41 */, /*25284*/"Hangul Syllable JJYOJ"/* CB42 */,/*25285*/"Hangul Syllable JJYOC"/* CB43 */, /*25286*/"Hangul Syllable JJYOK"/* CB44 */,/*25287*/"Hangul Syllable JJYOT"/* CB45 */, /*25288*/"Hangul Syllable JJYOP"/* CB46 */,/*25289*/"Hangul Syllable JJYOH"/* CB47 */, /*25290*/"Hangul Syllable JJU"/* CB48 */,/*25291*/"Hangul Syllable JJUG"/* CB49 */, /*25292*/"Hangul Syllable JJUGG"/* CB4A */,/*25293*/"Hangul Syllable JJUGS"/* CB4B */, /*25294*/"Hangul Syllable JJUN"/* CB4C */,/*25295*/"Hangul Syllable JJUNJ"/* CB4D */, /*25296*/"Hangul Syllable JJUNH"/* CB4E */,/*25297*/"Hangul Syllable JJUD"/* CB4F */, /*25298*/"Hangul Syllable JJUL"/* CB50 */,/*25299*/"Hangul Syllable JJULG"/* CB51 */, /*25300*/"Hangul Syllable JJULM"/* CB52 */,/*25301*/"Hangul Syllable JJULB"/* CB53 */, /*25302*/"Hangul Syllable JJULS"/* CB54 */,/*25303*/"Hangul Syllable JJULT"/* CB55 */, /*25304*/"Hangul Syllable JJULP"/* CB56 */,/*25305*/"Hangul Syllable JJULH"/* CB57 */, /*25306*/"Hangul Syllable JJUM"/* CB58 */,/*25307*/"Hangul Syllable JJUB"/* CB59 */, /*25308*/"Hangul Syllable JJUBS"/* CB5A */,/*25309*/"Hangul Syllable JJUS"/* CB5B */, /*25310*/"Hangul Syllable JJUSS"/* CB5C */,/*25311*/"Hangul Syllable JJUNG"/* CB5D */, /*25312*/"Hangul Syllable JJUJ"/* CB5E */,/*25313*/"Hangul Syllable JJUC"/* CB5F */, /*25314*/"Hangul Syllable JJUK"/* CB60 */,/*25315*/"Hangul Syllable JJUT"/* CB61 */, /*25316*/"Hangul Syllable JJUP"/* CB62 */,/*25317*/"Hangul Syllable JJUH"/* CB63 */, /*25318*/"Hangul Syllable JJWEO"/* CB64 */,/*25319*/"Hangul Syllable JJWEOG"/* CB65 */, /*25320*/"Hangul Syllable JJWEOGG"/* CB66 */,/*25321*/"Hangul Syllable JJWEOGS"/* CB67 */, /*25322*/"Hangul Syllable JJWEON"/* CB68 */,/*25323*/"Hangul Syllable JJWEONJ"/* CB69 */, /*25324*/"Hangul Syllable JJWEONH"/* CB6A */,/*25325*/"Hangul Syllable JJWEOD"/* CB6B */, /*25326*/"Hangul Syllable JJWEOL"/* CB6C */,/*25327*/"Hangul Syllable JJWEOLG"/* CB6D */, /*25328*/"Hangul Syllable JJWEOLM"/* CB6E */,/*25329*/"Hangul Syllable JJWEOLB"/* CB6F */, /*25330*/"Hangul Syllable JJWEOLS"/* CB70 */,/*25331*/"Hangul Syllable JJWEOLT"/* CB71 */, /*25332*/"Hangul Syllable JJWEOLP"/* CB72 */,/*25333*/"Hangul Syllable JJWEOLH"/* CB73 */, /*25334*/"Hangul Syllable JJWEOM"/* CB74 */,/*25335*/"Hangul Syllable JJWEOB"/* CB75 */, /*25336*/"Hangul Syllable JJWEOBS"/* CB76 */,/*25337*/"Hangul Syllable JJWEOS"/* CB77 */, /*25338*/"Hangul Syllable JJWEOSS"/* CB78 */,/*25339*/"Hangul Syllable JJWEONG"/* CB79 */, /*25340*/"Hangul Syllable JJWEOJ"/* CB7A */,/*25341*/"Hangul Syllable JJWEOC"/* CB7B */, /*25342*/"Hangul Syllable JJWEOK"/* CB7C */,/*25343*/"Hangul Syllable JJWEOT"/* CB7D */, /*25344*/"Hangul Syllable JJWEOP"/* CB7E */,/*25345*/"Hangul Syllable JJWEOH"/* CB7F */, /*25346*/"Hangul Syllable JJWE"/* CB80 */,/*25347*/"Hangul Syllable JJWEG"/* CB81 */, /*25348*/"Hangul Syllable JJWEGG"/* CB82 */,/*25349*/"Hangul Syllable JJWEGS"/* CB83 */, /*25350*/"Hangul Syllable JJWEN"/* CB84 */,/*25351*/"Hangul Syllable JJWENJ"/* CB85 */, /*25352*/"Hangul Syllable JJWENH"/* CB86 */,/*25353*/"Hangul Syllable JJWED"/* CB87 */, /*25354*/"Hangul Syllable JJWEL"/* CB88 */,/*25355*/"Hangul Syllable JJWELG"/* CB89 */, /*25356*/"Hangul Syllable JJWELM"/* CB8A */,/*25357*/"Hangul Syllable JJWELB"/* CB8B */, /*25358*/"Hangul Syllable JJWELS"/* CB8C */,/*25359*/"Hangul Syllable JJWELT"/* CB8D */, /*25360*/"Hangul Syllable JJWELP"/* CB8E */,/*25361*/"Hangul Syllable JJWELH"/* CB8F */, /*25362*/"Hangul Syllable JJWEM"/* CB90 */,/*25363*/"Hangul Syllable JJWEB"/* CB91 */, /*25364*/"Hangul Syllable JJWEBS"/* CB92 */,/*25365*/"Hangul Syllable JJWES"/* CB93 */, /*25366*/"Hangul Syllable JJWESS"/* CB94 */,/*25367*/"Hangul Syllable JJWENG"/* CB95 */, /*25368*/"Hangul Syllable JJWEJ"/* CB96 */,/*25369*/"Hangul Syllable JJWEC"/* CB97 */, /*25370*/"Hangul Syllable JJWEK"/* CB98 */,/*25371*/"Hangul Syllable JJWET"/* CB99 */, /*25372*/"Hangul Syllable JJWEP"/* CB9A */,/*25373*/"Hangul Syllable JJWEH"/* CB9B */, /*25374*/"Hangul Syllable JJWI"/* CB9C */,/*25375*/"Hangul Syllable JJWIG"/* CB9D */, /*25376*/"Hangul Syllable JJWIGG"/* CB9E */,/*25377*/"Hangul Syllable JJWIGS"/* CB9F */, /*25378*/"Hangul Syllable JJWIN"/* CBA0 */,/*25379*/"Hangul Syllable JJWINJ"/* CBA1 */, /*25380*/"Hangul Syllable JJWINH"/* CBA2 */,/*25381*/"Hangul Syllable JJWID"/* CBA3 */, /*25382*/"Hangul Syllable JJWIL"/* CBA4 */,/*25383*/"Hangul Syllable JJWILG"/* CBA5 */, /*25384*/"Hangul Syllable JJWILM"/* CBA6 */,/*25385*/"Hangul Syllable JJWILB"/* CBA7 */, /*25386*/"Hangul Syllable JJWILS"/* CBA8 */,/*25387*/"Hangul Syllable JJWILT"/* CBA9 */, /*25388*/"Hangul Syllable JJWILP"/* CBAA */,/*25389*/"Hangul Syllable JJWILH"/* CBAB */, /*25390*/"Hangul Syllable JJWIM"/* CBAC */,/*25391*/"Hangul Syllable JJWIB"/* CBAD */, /*25392*/"Hangul Syllable JJWIBS"/* CBAE */,/*25393*/"Hangul Syllable JJWIS"/* CBAF */, /*25394*/"Hangul Syllable JJWISS"/* CBB0 */,/*25395*/"Hangul Syllable JJWING"/* CBB1 */, /*25396*/"Hangul Syllable JJWIJ"/* CBB2 */,/*25397*/"Hangul Syllable JJWIC"/* CBB3 */, /*25398*/"Hangul Syllable JJWIK"/* CBB4 */,/*25399*/"Hangul Syllable JJWIT"/* CBB5 */, /*25400*/"Hangul Syllable JJWIP"/* CBB6 */,/*25401*/"Hangul Syllable JJWIH"/* CBB7 */, /*25402*/"Hangul Syllable JJYU"/* CBB8 */,/*25403*/"Hangul Syllable JJYUG"/* CBB9 */, /*25404*/"Hangul Syllable JJYUGG"/* CBBA */,/*25405*/"Hangul Syllable JJYUGS"/* CBBB */, /*25406*/"Hangul Syllable JJYUN"/* CBBC */,/*25407*/"Hangul Syllable JJYUNJ"/* CBBD */, /*25408*/"Hangul Syllable JJYUNH"/* CBBE */,/*25409*/"Hangul Syllable JJYUD"/* CBBF */, /*25410*/"Hangul Syllable JJYUL"/* CBC0 */,/*25411*/"Hangul Syllable JJYULG"/* CBC1 */, /*25412*/"Hangul Syllable JJYULM"/* CBC2 */,/*25413*/"Hangul Syllable JJYULB"/* CBC3 */, /*25414*/"Hangul Syllable JJYULS"/* CBC4 */,/*25415*/"Hangul Syllable JJYULT"/* CBC5 */, /*25416*/"Hangul Syllable JJYULP"/* CBC6 */,/*25417*/"Hangul Syllable JJYULH"/* CBC7 */, /*25418*/"Hangul Syllable JJYUM"/* CBC8 */,/*25419*/"Hangul Syllable JJYUB"/* CBC9 */, /*25420*/"Hangul Syllable JJYUBS"/* CBCA */,/*25421*/"Hangul Syllable JJYUS"/* CBCB */, /*25422*/"Hangul Syllable JJYUSS"/* CBCC */,/*25423*/"Hangul Syllable JJYUNG"/* CBCD */, /*25424*/"Hangul Syllable JJYUJ"/* CBCE */,/*25425*/"Hangul Syllable JJYUC"/* CBCF */, /*25426*/"Hangul Syllable JJYUK"/* CBD0 */,/*25427*/"Hangul Syllable JJYUT"/* CBD1 */, /*25428*/"Hangul Syllable JJYUP"/* CBD2 */,/*25429*/"Hangul Syllable JJYUH"/* CBD3 */, /*25430*/"Hangul Syllable JJEU"/* CBD4 */,/*25431*/"Hangul Syllable JJEUG"/* CBD5 */, /*25432*/"Hangul Syllable JJEUGG"/* CBD6 */,/*25433*/"Hangul Syllable JJEUGS"/* CBD7 */, /*25434*/"Hangul Syllable JJEUN"/* CBD8 */,/*25435*/"Hangul Syllable JJEUNJ"/* CBD9 */, /*25436*/"Hangul Syllable JJEUNH"/* CBDA */,/*25437*/"Hangul Syllable JJEUD"/* CBDB */, /*25438*/"Hangul Syllable JJEUL"/* CBDC */,/*25439*/"Hangul Syllable JJEULG"/* CBDD */, /*25440*/"Hangul Syllable JJEULM"/* CBDE */,/*25441*/"Hangul Syllable JJEULB"/* CBDF */, /*25442*/"Hangul Syllable JJEULS"/* CBE0 */,/*25443*/"Hangul Syllable JJEULT"/* CBE1 */, /*25444*/"Hangul Syllable JJEULP"/* CBE2 */,/*25445*/"Hangul Syllable JJEULH"/* CBE3 */, /*25446*/"Hangul Syllable JJEUM"/* CBE4 */,/*25447*/"Hangul Syllable JJEUB"/* CBE5 */, /*25448*/"Hangul Syllable JJEUBS"/* CBE6 */,/*25449*/"Hangul Syllable JJEUS"/* CBE7 */, /*25450*/"Hangul Syllable JJEUSS"/* CBE8 */,/*25451*/"Hangul Syllable JJEUNG"/* CBE9 */, /*25452*/"Hangul Syllable JJEUJ"/* CBEA */,/*25453*/"Hangul Syllable JJEUC"/* CBEB */, /*25454*/"Hangul Syllable JJEUK"/* CBEC */,/*25455*/"Hangul Syllable JJEUT"/* CBED */, /*25456*/"Hangul Syllable JJEUP"/* CBEE */,/*25457*/"Hangul Syllable JJEUH"/* CBEF */, /*25458*/"Hangul Syllable JJYI"/* CBF0 */,/*25459*/"Hangul Syllable JJYIG"/* CBF1 */, /*25460*/"Hangul Syllable JJYIGG"/* CBF2 */,/*25461*/"Hangul Syllable JJYIGS"/* CBF3 */, /*25462*/"Hangul Syllable JJYIN"/* CBF4 */,/*25463*/"Hangul Syllable JJYINJ"/* CBF5 */, /*25464*/"Hangul Syllable JJYINH"/* CBF6 */,/*25465*/"Hangul Syllable JJYID"/* CBF7 */, /*25466*/"Hangul Syllable JJYIL"/* CBF8 */,/*25467*/"Hangul Syllable JJYILG"/* CBF9 */, /*25468*/"Hangul Syllable JJYILM"/* CBFA */,/*25469*/"Hangul Syllable JJYILB"/* CBFB */, /*25470*/"Hangul Syllable JJYILS"/* CBFC */,/*25471*/"Hangul Syllable JJYILT"/* CBFD */, /*25472*/"Hangul Syllable JJYILP"/* CBFE */,/*25473*/"Hangul Syllable JJYILH"/* CBFF */, /*25474*/"Hangul Syllable JJYIM"/* CC00 */,/*25475*/"Hangul Syllable JJYIB"/* CC01 */, /*25476*/"Hangul Syllable JJYIBS"/* CC02 */,/*25477*/"Hangul Syllable JJYIS"/* CC03 */, /*25478*/"Hangul Syllable JJYISS"/* CC04 */,/*25479*/"Hangul Syllable JJYING"/* CC05 */, /*25480*/"Hangul Syllable JJYIJ"/* CC06 */,/*25481*/"Hangul Syllable JJYIC"/* CC07 */, /*25482*/"Hangul Syllable JJYIK"/* CC08 */,/*25483*/"Hangul Syllable JJYIT"/* CC09 */, /*25484*/"Hangul Syllable JJYIP"/* CC0A */,/*25485*/"Hangul Syllable JJYIH"/* CC0B */, /*25486*/"Hangul Syllable JJI"/* CC0C */,/*25487*/"Hangul Syllable JJIG"/* CC0D */, /*25488*/"Hangul Syllable JJIGG"/* CC0E */,/*25489*/"Hangul Syllable JJIGS"/* CC0F */, /*25490*/"Hangul Syllable JJIN"/* CC10 */,/*25491*/"Hangul Syllable JJINJ"/* CC11 */, /*25492*/"Hangul Syllable JJINH"/* CC12 */,/*25493*/"Hangul Syllable JJID"/* CC13 */, /*25494*/"Hangul Syllable JJIL"/* CC14 */,/*25495*/"Hangul Syllable JJILG"/* CC15 */, /*25496*/"Hangul Syllable JJILM"/* CC16 */,/*25497*/"Hangul Syllable JJILB"/* CC17 */, /*25498*/"Hangul Syllable JJILS"/* CC18 */,/*25499*/"Hangul Syllable JJILT"/* CC19 */, /*25500*/"Hangul Syllable JJILP"/* CC1A */,/*25501*/"Hangul Syllable JJILH"/* CC1B */, /*25502*/"Hangul Syllable JJIM"/* CC1C */,/*25503*/"Hangul Syllable JJIB"/* CC1D */, /*25504*/"Hangul Syllable JJIBS"/* CC1E */,/*25505*/"Hangul Syllable JJIS"/* CC1F */, /*25506*/"Hangul Syllable JJISS"/* CC20 */,/*25507*/"Hangul Syllable JJING"/* CC21 */, /*25508*/"Hangul Syllable JJIJ"/* CC22 */,/*25509*/"Hangul Syllable JJIC"/* CC23 */, /*25510*/"Hangul Syllable JJIK"/* CC24 */,/*25511*/"Hangul Syllable JJIT"/* CC25 */, /*25512*/"Hangul Syllable JJIP"/* CC26 */,/*25513*/"Hangul Syllable JJIH"/* CC27 */, /*25514*/"Hangul Syllable CA"/* CC28 */,/*25515*/"Hangul Syllable CAG"/* CC29 */, /*25516*/"Hangul Syllable CAGG"/* CC2A */,/*25517*/"Hangul Syllable CAGS"/* CC2B */, /*25518*/"Hangul Syllable CAN"/* CC2C */,/*25519*/"Hangul Syllable CANJ"/* CC2D */, /*25520*/"Hangul Syllable CANH"/* CC2E */,/*25521*/"Hangul Syllable CAD"/* CC2F */, /*25522*/"Hangul Syllable CAL"/* CC30 */,/*25523*/"Hangul Syllable CALG"/* CC31 */, /*25524*/"Hangul Syllable CALM"/* CC32 */,/*25525*/"Hangul Syllable CALB"/* CC33 */, /*25526*/"Hangul Syllable CALS"/* CC34 */,/*25527*/"Hangul Syllable CALT"/* CC35 */, /*25528*/"Hangul Syllable CALP"/* CC36 */,/*25529*/"Hangul Syllable CALH"/* CC37 */, /*25530*/"Hangul Syllable CAM"/* CC38 */,/*25531*/"Hangul Syllable CAB"/* CC39 */, /*25532*/"Hangul Syllable CABS"/* CC3A */,/*25533*/"Hangul Syllable CAS"/* CC3B */, /*25534*/"Hangul Syllable CASS"/* CC3C */,/*25535*/"Hangul Syllable CANG"/* CC3D */, /*25536*/"Hangul Syllable CAJ"/* CC3E */,/*25537*/"Hangul Syllable CAC"/* CC3F */, /*25538*/"Hangul Syllable CAK"/* CC40 */,/*25539*/"Hangul Syllable CAT"/* CC41 */, /*25540*/"Hangul Syllable CAP"/* CC42 */,/*25541*/"Hangul Syllable CAH"/* CC43 */, /*25542*/"Hangul Syllable CAE"/* CC44 */,/*25543*/"Hangul Syllable CAEG"/* CC45 */, /*25544*/"Hangul Syllable CAEGG"/* CC46 */,/*25545*/"Hangul Syllable CAEGS"/* CC47 */, /*25546*/"Hangul Syllable CAEN"/* CC48 */,/*25547*/"Hangul Syllable CAENJ"/* CC49 */, /*25548*/"Hangul Syllable CAENH"/* CC4A */,/*25549*/"Hangul Syllable CAED"/* CC4B */, /*25550*/"Hangul Syllable CAEL"/* CC4C */,/*25551*/"Hangul Syllable CAELG"/* CC4D */, /*25552*/"Hangul Syllable CAELM"/* CC4E */,/*25553*/"Hangul Syllable CAELB"/* CC4F */, /*25554*/"Hangul Syllable CAELS"/* CC50 */,/*25555*/"Hangul Syllable CAELT"/* CC51 */, /*25556*/"Hangul Syllable CAELP"/* CC52 */,/*25557*/"Hangul Syllable CAELH"/* CC53 */, /*25558*/"Hangul Syllable CAEM"/* CC54 */,/*25559*/"Hangul Syllable CAEB"/* CC55 */, /*25560*/"Hangul Syllable CAEBS"/* CC56 */,/*25561*/"Hangul Syllable CAES"/* CC57 */, /*25562*/"Hangul Syllable CAESS"/* CC58 */,/*25563*/"Hangul Syllable CAENG"/* CC59 */, /*25564*/"Hangul Syllable CAEJ"/* CC5A */,/*25565*/"Hangul Syllable CAEC"/* CC5B */, /*25566*/"Hangul Syllable CAEK"/* CC5C */,/*25567*/"Hangul Syllable CAET"/* CC5D */, /*25568*/"Hangul Syllable CAEP"/* CC5E */,/*25569*/"Hangul Syllable CAEH"/* CC5F */, /*25570*/"Hangul Syllable CYA"/* CC60 */,/*25571*/"Hangul Syllable CYAG"/* CC61 */, /*25572*/"Hangul Syllable CYAGG"/* CC62 */,/*25573*/"Hangul Syllable CYAGS"/* CC63 */, /*25574*/"Hangul Syllable CYAN"/* CC64 */,/*25575*/"Hangul Syllable CYANJ"/* CC65 */, /*25576*/"Hangul Syllable CYANH"/* CC66 */,/*25577*/"Hangul Syllable CYAD"/* CC67 */, /*25578*/"Hangul Syllable CYAL"/* CC68 */,/*25579*/"Hangul Syllable CYALG"/* CC69 */, /*25580*/"Hangul Syllable CYALM"/* CC6A */,/*25581*/"Hangul Syllable CYALB"/* CC6B */, /*25582*/"Hangul Syllable CYALS"/* CC6C */,/*25583*/"Hangul Syllable CYALT"/* CC6D */, /*25584*/"Hangul Syllable CYALP"/* CC6E */,/*25585*/"Hangul Syllable CYALH"/* CC6F */, /*25586*/"Hangul Syllable CYAM"/* CC70 */,/*25587*/"Hangul Syllable CYAB"/* CC71 */, /*25588*/"Hangul Syllable CYABS"/* CC72 */,/*25589*/"Hangul Syllable CYAS"/* CC73 */, /*25590*/"Hangul Syllable CYASS"/* CC74 */,/*25591*/"Hangul Syllable CYANG"/* CC75 */, /*25592*/"Hangul Syllable CYAJ"/* CC76 */,/*25593*/"Hangul Syllable CYAC"/* CC77 */, /*25594*/"Hangul Syllable CYAK"/* CC78 */,/*25595*/"Hangul Syllable CYAT"/* CC79 */, /*25596*/"Hangul Syllable CYAP"/* CC7A */,/*25597*/"Hangul Syllable CYAH"/* CC7B */, /*25598*/"Hangul Syllable CYAE"/* CC7C */,/*25599*/"Hangul Syllable CYAEG"/* CC7D */, /*25600*/"Hangul Syllable CYAEGG"/* CC7E */,/*25601*/"Hangul Syllable CYAEGS"/* CC7F */, /*25602*/"Hangul Syllable CYAEN"/* CC80 */,/*25603*/"Hangul Syllable CYAENJ"/* CC81 */, /*25604*/"Hangul Syllable CYAENH"/* CC82 */,/*25605*/"Hangul Syllable CYAED"/* CC83 */, /*25606*/"Hangul Syllable CYAEL"/* CC84 */,/*25607*/"Hangul Syllable CYAELG"/* CC85 */, /*25608*/"Hangul Syllable CYAELM"/* CC86 */,/*25609*/"Hangul Syllable CYAELB"/* CC87 */, /*25610*/"Hangul Syllable CYAELS"/* CC88 */,/*25611*/"Hangul Syllable CYAELT"/* CC89 */, /*25612*/"Hangul Syllable CYAELP"/* CC8A */,/*25613*/"Hangul Syllable CYAELH"/* CC8B */, /*25614*/"Hangul Syllable CYAEM"/* CC8C */,/*25615*/"Hangul Syllable CYAEB"/* CC8D */, /*25616*/"Hangul Syllable CYAEBS"/* CC8E */,/*25617*/"Hangul Syllable CYAES"/* CC8F */, /*25618*/"Hangul Syllable CYAESS"/* CC90 */,/*25619*/"Hangul Syllable CYAENG"/* CC91 */, /*25620*/"Hangul Syllable CYAEJ"/* CC92 */,/*25621*/"Hangul Syllable CYAEC"/* CC93 */, /*25622*/"Hangul Syllable CYAEK"/* CC94 */,/*25623*/"Hangul Syllable CYAET"/* CC95 */, /*25624*/"Hangul Syllable CYAEP"/* CC96 */,/*25625*/"Hangul Syllable CYAEH"/* CC97 */, /*25626*/"Hangul Syllable CEO"/* CC98 */,/*25627*/"Hangul Syllable CEOG"/* CC99 */, /*25628*/"Hangul Syllable CEOGG"/* CC9A */,/*25629*/"Hangul Syllable CEOGS"/* CC9B */, /*25630*/"Hangul Syllable CEON"/* CC9C */,/*25631*/"Hangul Syllable CEONJ"/* CC9D */, /*25632*/"Hangul Syllable CEONH"/* CC9E */,/*25633*/"Hangul Syllable CEOD"/* CC9F */, /*25634*/"Hangul Syllable CEOL"/* CCA0 */,/*25635*/"Hangul Syllable CEOLG"/* CCA1 */, /*25636*/"Hangul Syllable CEOLM"/* CCA2 */,/*25637*/"Hangul Syllable CEOLB"/* CCA3 */, /*25638*/"Hangul Syllable CEOLS"/* CCA4 */,/*25639*/"Hangul Syllable CEOLT"/* CCA5 */, /*25640*/"Hangul Syllable CEOLP"/* CCA6 */,/*25641*/"Hangul Syllable CEOLH"/* CCA7 */, /*25642*/"Hangul Syllable CEOM"/* CCA8 */,/*25643*/"Hangul Syllable CEOB"/* CCA9 */, /*25644*/"Hangul Syllable CEOBS"/* CCAA */,/*25645*/"Hangul Syllable CEOS"/* CCAB */, /*25646*/"Hangul Syllable CEOSS"/* CCAC */,/*25647*/"Hangul Syllable CEONG"/* CCAD */, /*25648*/"Hangul Syllable CEOJ"/* CCAE */,/*25649*/"Hangul Syllable CEOC"/* CCAF */, /*25650*/"Hangul Syllable CEOK"/* CCB0 */,/*25651*/"Hangul Syllable CEOT"/* CCB1 */, /*25652*/"Hangul Syllable CEOP"/* CCB2 */,/*25653*/"Hangul Syllable CEOH"/* CCB3 */, /*25654*/"Hangul Syllable CE"/* CCB4 */,/*25655*/"Hangul Syllable CEG"/* CCB5 */, /*25656*/"Hangul Syllable CEGG"/* CCB6 */,/*25657*/"Hangul Syllable CEGS"/* CCB7 */, /*25658*/"Hangul Syllable CEN"/* CCB8 */,/*25659*/"Hangul Syllable CENJ"/* CCB9 */, /*25660*/"Hangul Syllable CENH"/* CCBA */,/*25661*/"Hangul Syllable CED"/* CCBB */, /*25662*/"Hangul Syllable CEL"/* CCBC */,/*25663*/"Hangul Syllable CELG"/* CCBD */, /*25664*/"Hangul Syllable CELM"/* CCBE */,/*25665*/"Hangul Syllable CELB"/* CCBF */, /*25666*/"Hangul Syllable CELS"/* CCC0 */,/*25667*/"Hangul Syllable CELT"/* CCC1 */, /*25668*/"Hangul Syllable CELP"/* CCC2 */,/*25669*/"Hangul Syllable CELH"/* CCC3 */, /*25670*/"Hangul Syllable CEM"/* CCC4 */,/*25671*/"Hangul Syllable CEB"/* CCC5 */, /*25672*/"Hangul Syllable CEBS"/* CCC6 */,/*25673*/"Hangul Syllable CES"/* CCC7 */, /*25674*/"Hangul Syllable CESS"/* CCC8 */,/*25675*/"Hangul Syllable CENG"/* CCC9 */, /*25676*/"Hangul Syllable CEJ"/* CCCA */,/*25677*/"Hangul Syllable CEC"/* CCCB */, /*25678*/"Hangul Syllable CEK"/* CCCC */,/*25679*/"Hangul Syllable CET"/* CCCD */, /*25680*/"Hangul Syllable CEP"/* CCCE */,/*25681*/"Hangul Syllable CEH"/* CCCF */, /*25682*/"Hangul Syllable CYEO"/* CCD0 */,/*25683*/"Hangul Syllable CYEOG"/* CCD1 */, /*25684*/"Hangul Syllable CYEOGG"/* CCD2 */,/*25685*/"Hangul Syllable CYEOGS"/* CCD3 */, /*25686*/"Hangul Syllable CYEON"/* CCD4 */,/*25687*/"Hangul Syllable CYEONJ"/* CCD5 */, /*25688*/"Hangul Syllable CYEONH"/* CCD6 */,/*25689*/"Hangul Syllable CYEOD"/* CCD7 */, /*25690*/"Hangul Syllable CYEOL"/* CCD8 */,/*25691*/"Hangul Syllable CYEOLG"/* CCD9 */, /*25692*/"Hangul Syllable CYEOLM"/* CCDA */,/*25693*/"Hangul Syllable CYEOLB"/* CCDB */, /*25694*/"Hangul Syllable CYEOLS"/* CCDC */,/*25695*/"Hangul Syllable CYEOLT"/* CCDD */, /*25696*/"Hangul Syllable CYEOLP"/* CCDE */,/*25697*/"Hangul Syllable CYEOLH"/* CCDF */, /*25698*/"Hangul Syllable CYEOM"/* CCE0 */,/*25699*/"Hangul Syllable CYEOB"/* CCE1 */, /*25700*/"Hangul Syllable CYEOBS"/* CCE2 */,/*25701*/"Hangul Syllable CYEOS"/* CCE3 */, /*25702*/"Hangul Syllable CYEOSS"/* CCE4 */,/*25703*/"Hangul Syllable CYEONG"/* CCE5 */, /*25704*/"Hangul Syllable CYEOJ"/* CCE6 */,/*25705*/"Hangul Syllable CYEOC"/* CCE7 */, /*25706*/"Hangul Syllable CYEOK"/* CCE8 */,/*25707*/"Hangul Syllable CYEOT"/* CCE9 */, /*25708*/"Hangul Syllable CYEOP"/* CCEA */,/*25709*/"Hangul Syllable CYEOH"/* CCEB */, /*25710*/"Hangul Syllable CYE"/* CCEC */,/*25711*/"Hangul Syllable CYEG"/* CCED */, /*25712*/"Hangul Syllable CYEGG"/* CCEE */,/*25713*/"Hangul Syllable CYEGS"/* CCEF */, /*25714*/"Hangul Syllable CYEN"/* CCF0 */,/*25715*/"Hangul Syllable CYENJ"/* CCF1 */, /*25716*/"Hangul Syllable CYENH"/* CCF2 */,/*25717*/"Hangul Syllable CYED"/* CCF3 */, /*25718*/"Hangul Syllable CYEL"/* CCF4 */,/*25719*/"Hangul Syllable CYELG"/* CCF5 */, /*25720*/"Hangul Syllable CYELM"/* CCF6 */,/*25721*/"Hangul Syllable CYELB"/* CCF7 */, /*25722*/"Hangul Syllable CYELS"/* CCF8 */,/*25723*/"Hangul Syllable CYELT"/* CCF9 */, /*25724*/"Hangul Syllable CYELP"/* CCFA */,/*25725*/"Hangul Syllable CYELH"/* CCFB */, /*25726*/"Hangul Syllable CYEM"/* CCFC */,/*25727*/"Hangul Syllable CYEB"/* CCFD */, /*25728*/"Hangul Syllable CYEBS"/* CCFE */,/*25729*/"Hangul Syllable CYES"/* CCFF */, /*25730*/"Hangul Syllable CYESS"/* CD00 */,/*25731*/"Hangul Syllable CYENG"/* CD01 */, /*25732*/"Hangul Syllable CYEJ"/* CD02 */,/*25733*/"Hangul Syllable CYEC"/* CD03 */, /*25734*/"Hangul Syllable CYEK"/* CD04 */,/*25735*/"Hangul Syllable CYET"/* CD05 */, /*25736*/"Hangul Syllable CYEP"/* CD06 */,/*25737*/"Hangul Syllable CYEH"/* CD07 */, /*25738*/"Hangul Syllable CO"/* CD08 */,/*25739*/"Hangul Syllable COG"/* CD09 */, /*25740*/"Hangul Syllable COGG"/* CD0A */,/*25741*/"Hangul Syllable COGS"/* CD0B */, /*25742*/"Hangul Syllable CON"/* CD0C */,/*25743*/"Hangul Syllable CONJ"/* CD0D */, /*25744*/"Hangul Syllable CONH"/* CD0E */,/*25745*/"Hangul Syllable COD"/* CD0F */, /*25746*/"Hangul Syllable COL"/* CD10 */,/*25747*/"Hangul Syllable COLG"/* CD11 */, /*25748*/"Hangul Syllable COLM"/* CD12 */,/*25749*/"Hangul Syllable COLB"/* CD13 */, /*25750*/"Hangul Syllable COLS"/* CD14 */,/*25751*/"Hangul Syllable COLT"/* CD15 */, /*25752*/"Hangul Syllable COLP"/* CD16 */,/*25753*/"Hangul Syllable COLH"/* CD17 */, /*25754*/"Hangul Syllable COM"/* CD18 */,/*25755*/"Hangul Syllable COB"/* CD19 */, /*25756*/"Hangul Syllable COBS"/* CD1A */,/*25757*/"Hangul Syllable COS"/* CD1B */, /*25758*/"Hangul Syllable COSS"/* CD1C */,/*25759*/"Hangul Syllable CONG"/* CD1D */, /*25760*/"Hangul Syllable COJ"/* CD1E */,/*25761*/"Hangul Syllable COC"/* CD1F */, /*25762*/"Hangul Syllable COK"/* CD20 */,/*25763*/"Hangul Syllable COT"/* CD21 */, /*25764*/"Hangul Syllable COP"/* CD22 */,/*25765*/"Hangul Syllable COH"/* CD23 */, /*25766*/"Hangul Syllable CWA"/* CD24 */,/*25767*/"Hangul Syllable CWAG"/* CD25 */, /*25768*/"Hangul Syllable CWAGG"/* CD26 */,/*25769*/"Hangul Syllable CWAGS"/* CD27 */, /*25770*/"Hangul Syllable CWAN"/* CD28 */,/*25771*/"Hangul Syllable CWANJ"/* CD29 */, /*25772*/"Hangul Syllable CWANH"/* CD2A */,/*25773*/"Hangul Syllable CWAD"/* CD2B */, /*25774*/"Hangul Syllable CWAL"/* CD2C */,/*25775*/"Hangul Syllable CWALG"/* CD2D */, /*25776*/"Hangul Syllable CWALM"/* CD2E */,/*25777*/"Hangul Syllable CWALB"/* CD2F */, /*25778*/"Hangul Syllable CWALS"/* CD30 */,/*25779*/"Hangul Syllable CWALT"/* CD31 */, /*25780*/"Hangul Syllable CWALP"/* CD32 */,/*25781*/"Hangul Syllable CWALH"/* CD33 */, /*25782*/"Hangul Syllable CWAM"/* CD34 */,/*25783*/"Hangul Syllable CWAB"/* CD35 */, /*25784*/"Hangul Syllable CWABS"/* CD36 */,/*25785*/"Hangul Syllable CWAS"/* CD37 */, /*25786*/"Hangul Syllable CWASS"/* CD38 */,/*25787*/"Hangul Syllable CWANG"/* CD39 */, /*25788*/"Hangul Syllable CWAJ"/* CD3A */,/*25789*/"Hangul Syllable CWAC"/* CD3B */, /*25790*/"Hangul Syllable CWAK"/* CD3C */,/*25791*/"Hangul Syllable CWAT"/* CD3D */, /*25792*/"Hangul Syllable CWAP"/* CD3E */,/*25793*/"Hangul Syllable CWAH"/* CD3F */, /*25794*/"Hangul Syllable CWAE"/* CD40 */,/*25795*/"Hangul Syllable CWAEG"/* CD41 */, /*25796*/"Hangul Syllable CWAEGG"/* CD42 */,/*25797*/"Hangul Syllable CWAEGS"/* CD43 */, /*25798*/"Hangul Syllable CWAEN"/* CD44 */,/*25799*/"Hangul Syllable CWAENJ"/* CD45 */, /*25800*/"Hangul Syllable CWAENH"/* CD46 */,/*25801*/"Hangul Syllable CWAED"/* CD47 */, /*25802*/"Hangul Syllable CWAEL"/* CD48 */,/*25803*/"Hangul Syllable CWAELG"/* CD49 */, /*25804*/"Hangul Syllable CWAELM"/* CD4A */,/*25805*/"Hangul Syllable CWAELB"/* CD4B */, /*25806*/"Hangul Syllable CWAELS"/* CD4C */,/*25807*/"Hangul Syllable CWAELT"/* CD4D */, /*25808*/"Hangul Syllable CWAELP"/* CD4E */,/*25809*/"Hangul Syllable CWAELH"/* CD4F */, /*25810*/"Hangul Syllable CWAEM"/* CD50 */,/*25811*/"Hangul Syllable CWAEB"/* CD51 */, /*25812*/"Hangul Syllable CWAEBS"/* CD52 */,/*25813*/"Hangul Syllable CWAES"/* CD53 */, /*25814*/"Hangul Syllable CWAESS"/* CD54 */,/*25815*/"Hangul Syllable CWAENG"/* CD55 */, /*25816*/"Hangul Syllable CWAEJ"/* CD56 */,/*25817*/"Hangul Syllable CWAEC"/* CD57 */, /*25818*/"Hangul Syllable CWAEK"/* CD58 */,/*25819*/"Hangul Syllable CWAET"/* CD59 */, /*25820*/"Hangul Syllable CWAEP"/* CD5A */,/*25821*/"Hangul Syllable CWAEH"/* CD5B */, /*25822*/"Hangul Syllable COE"/* CD5C */,/*25823*/"Hangul Syllable COEG"/* CD5D */, /*25824*/"Hangul Syllable COEGG"/* CD5E */,/*25825*/"Hangul Syllable COEGS"/* CD5F */, /*25826*/"Hangul Syllable COEN"/* CD60 */,/*25827*/"Hangul Syllable COENJ"/* CD61 */, /*25828*/"Hangul Syllable COENH"/* CD62 */,/*25829*/"Hangul Syllable COED"/* CD63 */, /*25830*/"Hangul Syllable COEL"/* CD64 */,/*25831*/"Hangul Syllable COELG"/* CD65 */, /*25832*/"Hangul Syllable COELM"/* CD66 */,/*25833*/"Hangul Syllable COELB"/* CD67 */, /*25834*/"Hangul Syllable COELS"/* CD68 */,/*25835*/"Hangul Syllable COELT"/* CD69 */, /*25836*/"Hangul Syllable COELP"/* CD6A */,/*25837*/"Hangul Syllable COELH"/* CD6B */, /*25838*/"Hangul Syllable COEM"/* CD6C */,/*25839*/"Hangul Syllable COEB"/* CD6D */, /*25840*/"Hangul Syllable COEBS"/* CD6E */,/*25841*/"Hangul Syllable COES"/* CD6F */, /*25842*/"Hangul Syllable COESS"/* CD70 */,/*25843*/"Hangul Syllable COENG"/* CD71 */, /*25844*/"Hangul Syllable COEJ"/* CD72 */,/*25845*/"Hangul Syllable COEC"/* CD73 */, /*25846*/"Hangul Syllable COEK"/* CD74 */,/*25847*/"Hangul Syllable COET"/* CD75 */, /*25848*/"Hangul Syllable COEP"/* CD76 */,/*25849*/"Hangul Syllable COEH"/* CD77 */, /*25850*/"Hangul Syllable CYO"/* CD78 */,/*25851*/"Hangul Syllable CYOG"/* CD79 */, /*25852*/"Hangul Syllable CYOGG"/* CD7A */,/*25853*/"Hangul Syllable CYOGS"/* CD7B */, /*25854*/"Hangul Syllable CYON"/* CD7C */,/*25855*/"Hangul Syllable CYONJ"/* CD7D */, /*25856*/"Hangul Syllable CYONH"/* CD7E */,/*25857*/"Hangul Syllable CYOD"/* CD7F */, /*25858*/"Hangul Syllable CYOL"/* CD80 */,/*25859*/"Hangul Syllable CYOLG"/* CD81 */, /*25860*/"Hangul Syllable CYOLM"/* CD82 */,/*25861*/"Hangul Syllable CYOLB"/* CD83 */, /*25862*/"Hangul Syllable CYOLS"/* CD84 */,/*25863*/"Hangul Syllable CYOLT"/* CD85 */, /*25864*/"Hangul Syllable CYOLP"/* CD86 */,/*25865*/"Hangul Syllable CYOLH"/* CD87 */, /*25866*/"Hangul Syllable CYOM"/* CD88 */,/*25867*/"Hangul Syllable CYOB"/* CD89 */, /*25868*/"Hangul Syllable CYOBS"/* CD8A */,/*25869*/"Hangul Syllable CYOS"/* CD8B */, /*25870*/"Hangul Syllable CYOSS"/* CD8C */,/*25871*/"Hangul Syllable CYONG"/* CD8D */, /*25872*/"Hangul Syllable CYOJ"/* CD8E */,/*25873*/"Hangul Syllable CYOC"/* CD8F */, /*25874*/"Hangul Syllable CYOK"/* CD90 */,/*25875*/"Hangul Syllable CYOT"/* CD91 */, /*25876*/"Hangul Syllable CYOP"/* CD92 */,/*25877*/"Hangul Syllable CYOH"/* CD93 */, /*25878*/"Hangul Syllable CU"/* CD94 */,/*25879*/"Hangul Syllable CUG"/* CD95 */, /*25880*/"Hangul Syllable CUGG"/* CD96 */,/*25881*/"Hangul Syllable CUGS"/* CD97 */, /*25882*/"Hangul Syllable CUN"/* CD98 */,/*25883*/"Hangul Syllable CUNJ"/* CD99 */, /*25884*/"Hangul Syllable CUNH"/* CD9A */,/*25885*/"Hangul Syllable CUD"/* CD9B */, /*25886*/"Hangul Syllable CUL"/* CD9C */,/*25887*/"Hangul Syllable CULG"/* CD9D */, /*25888*/"Hangul Syllable CULM"/* CD9E */,/*25889*/"Hangul Syllable CULB"/* CD9F */, /*25890*/"Hangul Syllable CULS"/* CDA0 */,/*25891*/"Hangul Syllable CULT"/* CDA1 */, /*25892*/"Hangul Syllable CULP"/* CDA2 */,/*25893*/"Hangul Syllable CULH"/* CDA3 */, /*25894*/"Hangul Syllable CUM"/* CDA4 */,/*25895*/"Hangul Syllable CUB"/* CDA5 */, /*25896*/"Hangul Syllable CUBS"/* CDA6 */,/*25897*/"Hangul Syllable CUS"/* CDA7 */, /*25898*/"Hangul Syllable CUSS"/* CDA8 */,/*25899*/"Hangul Syllable CUNG"/* CDA9 */, /*25900*/"Hangul Syllable CUJ"/* CDAA */,/*25901*/"Hangul Syllable CUC"/* CDAB */, /*25902*/"Hangul Syllable CUK"/* CDAC */,/*25903*/"Hangul Syllable CUT"/* CDAD */, /*25904*/"Hangul Syllable CUP"/* CDAE */,/*25905*/"Hangul Syllable CUH"/* CDAF */, /*25906*/"Hangul Syllable CWEO"/* CDB0 */,/*25907*/"Hangul Syllable CWEOG"/* CDB1 */, /*25908*/"Hangul Syllable CWEOGG"/* CDB2 */,/*25909*/"Hangul Syllable CWEOGS"/* CDB3 */, /*25910*/"Hangul Syllable CWEON"/* CDB4 */,/*25911*/"Hangul Syllable CWEONJ"/* CDB5 */, /*25912*/"Hangul Syllable CWEONH"/* CDB6 */,/*25913*/"Hangul Syllable CWEOD"/* CDB7 */, /*25914*/"Hangul Syllable CWEOL"/* CDB8 */,/*25915*/"Hangul Syllable CWEOLG"/* CDB9 */, /*25916*/"Hangul Syllable CWEOLM"/* CDBA */,/*25917*/"Hangul Syllable CWEOLB"/* CDBB */, /*25918*/"Hangul Syllable CWEOLS"/* CDBC */,/*25919*/"Hangul Syllable CWEOLT"/* CDBD */, /*25920*/"Hangul Syllable CWEOLP"/* CDBE */,/*25921*/"Hangul Syllable CWEOLH"/* CDBF */, /*25922*/"Hangul Syllable CWEOM"/* CDC0 */,/*25923*/"Hangul Syllable CWEOB"/* CDC1 */, /*25924*/"Hangul Syllable CWEOBS"/* CDC2 */,/*25925*/"Hangul Syllable CWEOS"/* CDC3 */, /*25926*/"Hangul Syllable CWEOSS"/* CDC4 */,/*25927*/"Hangul Syllable CWEONG"/* CDC5 */, /*25928*/"Hangul Syllable CWEOJ"/* CDC6 */,/*25929*/"Hangul Syllable CWEOC"/* CDC7 */, /*25930*/"Hangul Syllable CWEOK"/* CDC8 */,/*25931*/"Hangul Syllable CWEOT"/* CDC9 */, /*25932*/"Hangul Syllable CWEOP"/* CDCA */,/*25933*/"Hangul Syllable CWEOH"/* CDCB */, /*25934*/"Hangul Syllable CWE"/* CDCC */,/*25935*/"Hangul Syllable CWEG"/* CDCD */, /*25936*/"Hangul Syllable CWEGG"/* CDCE */,/*25937*/"Hangul Syllable CWEGS"/* CDCF */, /*25938*/"Hangul Syllable CWEN"/* CDD0 */,/*25939*/"Hangul Syllable CWENJ"/* CDD1 */, /*25940*/"Hangul Syllable CWENH"/* CDD2 */,/*25941*/"Hangul Syllable CWED"/* CDD3 */, /*25942*/"Hangul Syllable CWEL"/* CDD4 */,/*25943*/"Hangul Syllable CWELG"/* CDD5 */, /*25944*/"Hangul Syllable CWELM"/* CDD6 */,/*25945*/"Hangul Syllable CWELB"/* CDD7 */, /*25946*/"Hangul Syllable CWELS"/* CDD8 */,/*25947*/"Hangul Syllable CWELT"/* CDD9 */, /*25948*/"Hangul Syllable CWELP"/* CDDA */,/*25949*/"Hangul Syllable CWELH"/* CDDB */, /*25950*/"Hangul Syllable CWEM"/* CDDC */,/*25951*/"Hangul Syllable CWEB"/* CDDD */, /*25952*/"Hangul Syllable CWEBS"/* CDDE */,/*25953*/"Hangul Syllable CWES"/* CDDF */, /*25954*/"Hangul Syllable CWESS"/* CDE0 */,/*25955*/"Hangul Syllable CWENG"/* CDE1 */, /*25956*/"Hangul Syllable CWEJ"/* CDE2 */,/*25957*/"Hangul Syllable CWEC"/* CDE3 */, /*25958*/"Hangul Syllable CWEK"/* CDE4 */,/*25959*/"Hangul Syllable CWET"/* CDE5 */, /*25960*/"Hangul Syllable CWEP"/* CDE6 */,/*25961*/"Hangul Syllable CWEH"/* CDE7 */, /*25962*/"Hangul Syllable CWI"/* CDE8 */,/*25963*/"Hangul Syllable CWIG"/* CDE9 */, /*25964*/"Hangul Syllable CWIGG"/* CDEA */,/*25965*/"Hangul Syllable CWIGS"/* CDEB */, /*25966*/"Hangul Syllable CWIN"/* CDEC */,/*25967*/"Hangul Syllable CWINJ"/* CDED */, /*25968*/"Hangul Syllable CWINH"/* CDEE */,/*25969*/"Hangul Syllable CWID"/* CDEF */, /*25970*/"Hangul Syllable CWIL"/* CDF0 */,/*25971*/"Hangul Syllable CWILG"/* CDF1 */, /*25972*/"Hangul Syllable CWILM"/* CDF2 */,/*25973*/"Hangul Syllable CWILB"/* CDF3 */, /*25974*/"Hangul Syllable CWILS"/* CDF4 */,/*25975*/"Hangul Syllable CWILT"/* CDF5 */, /*25976*/"Hangul Syllable CWILP"/* CDF6 */,/*25977*/"Hangul Syllable CWILH"/* CDF7 */, /*25978*/"Hangul Syllable CWIM"/* CDF8 */,/*25979*/"Hangul Syllable CWIB"/* CDF9 */, /*25980*/"Hangul Syllable CWIBS"/* CDFA */,/*25981*/"Hangul Syllable CWIS"/* CDFB */, /*25982*/"Hangul Syllable CWISS"/* CDFC */,/*25983*/"Hangul Syllable CWING"/* CDFD */, /*25984*/"Hangul Syllable CWIJ"/* CDFE */,/*25985*/"Hangul Syllable CWIC"/* CDFF */, /*25986*/"Hangul Syllable CWIK"/* CE00 */,/*25987*/"Hangul Syllable CWIT"/* CE01 */, /*25988*/"Hangul Syllable CWIP"/* CE02 */,/*25989*/"Hangul Syllable CWIH"/* CE03 */, /*25990*/"Hangul Syllable CYU"/* CE04 */,/*25991*/"Hangul Syllable CYUG"/* CE05 */, /*25992*/"Hangul Syllable CYUGG"/* CE06 */,/*25993*/"Hangul Syllable CYUGS"/* CE07 */, /*25994*/"Hangul Syllable CYUN"/* CE08 */,/*25995*/"Hangul Syllable CYUNJ"/* CE09 */, /*25996*/"Hangul Syllable CYUNH"/* CE0A */,/*25997*/"Hangul Syllable CYUD"/* CE0B */, /*25998*/"Hangul Syllable CYUL"/* CE0C */,/*25999*/"Hangul Syllable CYULG"/* CE0D */, /*26000*/"Hangul Syllable CYULM"/* CE0E */,/*26001*/"Hangul Syllable CYULB"/* CE0F */, /*26002*/"Hangul Syllable CYULS"/* CE10 */,/*26003*/"Hangul Syllable CYULT"/* CE11 */, /*26004*/"Hangul Syllable CYULP"/* CE12 */,/*26005*/"Hangul Syllable CYULH"/* CE13 */, /*26006*/"Hangul Syllable CYUM"/* CE14 */,/*26007*/"Hangul Syllable CYUB"/* CE15 */, /*26008*/"Hangul Syllable CYUBS"/* CE16 */,/*26009*/"Hangul Syllable CYUS"/* CE17 */, /*26010*/"Hangul Syllable CYUSS"/* CE18 */,/*26011*/"Hangul Syllable CYUNG"/* CE19 */, /*26012*/"Hangul Syllable CYUJ"/* CE1A */,/*26013*/"Hangul Syllable CYUC"/* CE1B */, /*26014*/"Hangul Syllable CYUK"/* CE1C */,/*26015*/"Hangul Syllable CYUT"/* CE1D */, /*26016*/"Hangul Syllable CYUP"/* CE1E */,/*26017*/"Hangul Syllable CYUH"/* CE1F */, /*26018*/"Hangul Syllable CEU"/* CE20 */,/*26019*/"Hangul Syllable CEUG"/* CE21 */, /*26020*/"Hangul Syllable CEUGG"/* CE22 */,/*26021*/"Hangul Syllable CEUGS"/* CE23 */, /*26022*/"Hangul Syllable CEUN"/* CE24 */,/*26023*/"Hangul Syllable CEUNJ"/* CE25 */, /*26024*/"Hangul Syllable CEUNH"/* CE26 */,/*26025*/"Hangul Syllable CEUD"/* CE27 */, /*26026*/"Hangul Syllable CEUL"/* CE28 */,/*26027*/"Hangul Syllable CEULG"/* CE29 */, /*26028*/"Hangul Syllable CEULM"/* CE2A */,/*26029*/"Hangul Syllable CEULB"/* CE2B */, /*26030*/"Hangul Syllable CEULS"/* CE2C */,/*26031*/"Hangul Syllable CEULT"/* CE2D */, /*26032*/"Hangul Syllable CEULP"/* CE2E */,/*26033*/"Hangul Syllable CEULH"/* CE2F */, /*26034*/"Hangul Syllable CEUM"/* CE30 */,/*26035*/"Hangul Syllable CEUB"/* CE31 */, /*26036*/"Hangul Syllable CEUBS"/* CE32 */,/*26037*/"Hangul Syllable CEUS"/* CE33 */, /*26038*/"Hangul Syllable CEUSS"/* CE34 */,/*26039*/"Hangul Syllable CEUNG"/* CE35 */, /*26040*/"Hangul Syllable CEUJ"/* CE36 */,/*26041*/"Hangul Syllable CEUC"/* CE37 */, /*26042*/"Hangul Syllable CEUK"/* CE38 */,/*26043*/"Hangul Syllable CEUT"/* CE39 */, /*26044*/"Hangul Syllable CEUP"/* CE3A */,/*26045*/"Hangul Syllable CEUH"/* CE3B */, /*26046*/"Hangul Syllable CYI"/* CE3C */,/*26047*/"Hangul Syllable CYIG"/* CE3D */, /*26048*/"Hangul Syllable CYIGG"/* CE3E */,/*26049*/"Hangul Syllable CYIGS"/* CE3F */, /*26050*/"Hangul Syllable CYIN"/* CE40 */,/*26051*/"Hangul Syllable CYINJ"/* CE41 */, /*26052*/"Hangul Syllable CYINH"/* CE42 */,/*26053*/"Hangul Syllable CYID"/* CE43 */, /*26054*/"Hangul Syllable CYIL"/* CE44 */,/*26055*/"Hangul Syllable CYILG"/* CE45 */, /*26056*/"Hangul Syllable CYILM"/* CE46 */,/*26057*/"Hangul Syllable CYILB"/* CE47 */, /*26058*/"Hangul Syllable CYILS"/* CE48 */,/*26059*/"Hangul Syllable CYILT"/* CE49 */, /*26060*/"Hangul Syllable CYILP"/* CE4A */,/*26061*/"Hangul Syllable CYILH"/* CE4B */, /*26062*/"Hangul Syllable CYIM"/* CE4C */,/*26063*/"Hangul Syllable CYIB"/* CE4D */, /*26064*/"Hangul Syllable CYIBS"/* CE4E */,/*26065*/"Hangul Syllable CYIS"/* CE4F */, /*26066*/"Hangul Syllable CYISS"/* CE50 */,/*26067*/"Hangul Syllable CYING"/* CE51 */, /*26068*/"Hangul Syllable CYIJ"/* CE52 */,/*26069*/"Hangul Syllable CYIC"/* CE53 */, /*26070*/"Hangul Syllable CYIK"/* CE54 */,/*26071*/"Hangul Syllable CYIT"/* CE55 */, /*26072*/"Hangul Syllable CYIP"/* CE56 */,/*26073*/"Hangul Syllable CYIH"/* CE57 */, /*26074*/"Hangul Syllable CI"/* CE58 */,/*26075*/"Hangul Syllable CIG"/* CE59 */, /*26076*/"Hangul Syllable CIGG"/* CE5A */,/*26077*/"Hangul Syllable CIGS"/* CE5B */, /*26078*/"Hangul Syllable CIN"/* CE5C */,/*26079*/"Hangul Syllable CINJ"/* CE5D */, /*26080*/"Hangul Syllable CINH"/* CE5E */,/*26081*/"Hangul Syllable CID"/* CE5F */, /*26082*/"Hangul Syllable CIL"/* CE60 */,/*26083*/"Hangul Syllable CILG"/* CE61 */, /*26084*/"Hangul Syllable CILM"/* CE62 */,/*26085*/"Hangul Syllable CILB"/* CE63 */, /*26086*/"Hangul Syllable CILS"/* CE64 */,/*26087*/"Hangul Syllable CILT"/* CE65 */, /*26088*/"Hangul Syllable CILP"/* CE66 */,/*26089*/"Hangul Syllable CILH"/* CE67 */, /*26090*/"Hangul Syllable CIM"/* CE68 */,/*26091*/"Hangul Syllable CIB"/* CE69 */, /*26092*/"Hangul Syllable CIBS"/* CE6A */,/*26093*/"Hangul Syllable CIS"/* CE6B */, /*26094*/"Hangul Syllable CISS"/* CE6C */,/*26095*/"Hangul Syllable CING"/* CE6D */, /*26096*/"Hangul Syllable CIJ"/* CE6E */,/*26097*/"Hangul Syllable CIC"/* CE6F */, /*26098*/"Hangul Syllable CIK"/* CE70 */,/*26099*/"Hangul Syllable CIT"/* CE71 */, /*26100*/"Hangul Syllable CIP"/* CE72 */,/*26101*/"Hangul Syllable CIH"/* CE73 */, /*26102*/"Hangul Syllable KA"/* CE74 */,/*26103*/"Hangul Syllable KAG"/* CE75 */, /*26104*/"Hangul Syllable KAGG"/* CE76 */,/*26105*/"Hangul Syllable KAGS"/* CE77 */, /*26106*/"Hangul Syllable KAN"/* CE78 */,/*26107*/"Hangul Syllable KANJ"/* CE79 */, /*26108*/"Hangul Syllable KANH"/* CE7A */,/*26109*/"Hangul Syllable KAD"/* CE7B */, /*26110*/"Hangul Syllable KAL"/* CE7C */,/*26111*/"Hangul Syllable KALG"/* CE7D */, /*26112*/"Hangul Syllable KALM"/* CE7E */,/*26113*/"Hangul Syllable KALB"/* CE7F */, /*26114*/"Hangul Syllable KALS"/* CE80 */,/*26115*/"Hangul Syllable KALT"/* CE81 */, /*26116*/"Hangul Syllable KALP"/* CE82 */,/*26117*/"Hangul Syllable KALH"/* CE83 */, /*26118*/"Hangul Syllable KAM"/* CE84 */,/*26119*/"Hangul Syllable KAB"/* CE85 */, /*26120*/"Hangul Syllable KABS"/* CE86 */,/*26121*/"Hangul Syllable KAS"/* CE87 */, /*26122*/"Hangul Syllable KASS"/* CE88 */,/*26123*/"Hangul Syllable KANG"/* CE89 */, /*26124*/"Hangul Syllable KAJ"/* CE8A */,/*26125*/"Hangul Syllable KAC"/* CE8B */, /*26126*/"Hangul Syllable KAK"/* CE8C */,/*26127*/"Hangul Syllable KAT"/* CE8D */, /*26128*/"Hangul Syllable KAP"/* CE8E */,/*26129*/"Hangul Syllable KAH"/* CE8F */, /*26130*/"Hangul Syllable KAE"/* CE90 */,/*26131*/"Hangul Syllable KAEG"/* CE91 */, /*26132*/"Hangul Syllable KAEGG"/* CE92 */,/*26133*/"Hangul Syllable KAEGS"/* CE93 */, /*26134*/"Hangul Syllable KAEN"/* CE94 */,/*26135*/"Hangul Syllable KAENJ"/* CE95 */, /*26136*/"Hangul Syllable KAENH"/* CE96 */,/*26137*/"Hangul Syllable KAED"/* CE97 */, /*26138*/"Hangul Syllable KAEL"/* CE98 */,/*26139*/"Hangul Syllable KAELG"/* CE99 */, /*26140*/"Hangul Syllable KAELM"/* CE9A */,/*26141*/"Hangul Syllable KAELB"/* CE9B */, /*26142*/"Hangul Syllable KAELS"/* CE9C */,/*26143*/"Hangul Syllable KAELT"/* CE9D */, /*26144*/"Hangul Syllable KAELP"/* CE9E */,/*26145*/"Hangul Syllable KAELH"/* CE9F */, /*26146*/"Hangul Syllable KAEM"/* CEA0 */,/*26147*/"Hangul Syllable KAEB"/* CEA1 */, /*26148*/"Hangul Syllable KAEBS"/* CEA2 */,/*26149*/"Hangul Syllable KAES"/* CEA3 */, /*26150*/"Hangul Syllable KAESS"/* CEA4 */,/*26151*/"Hangul Syllable KAENG"/* CEA5 */, /*26152*/"Hangul Syllable KAEJ"/* CEA6 */,/*26153*/"Hangul Syllable KAEC"/* CEA7 */, /*26154*/"Hangul Syllable KAEK"/* CEA8 */,/*26155*/"Hangul Syllable KAET"/* CEA9 */, /*26156*/"Hangul Syllable KAEP"/* CEAA */,/*26157*/"Hangul Syllable KAEH"/* CEAB */, /*26158*/"Hangul Syllable KYA"/* CEAC */,/*26159*/"Hangul Syllable KYAG"/* CEAD */, /*26160*/"Hangul Syllable KYAGG"/* CEAE */,/*26161*/"Hangul Syllable KYAGS"/* CEAF */, /*26162*/"Hangul Syllable KYAN"/* CEB0 */,/*26163*/"Hangul Syllable KYANJ"/* CEB1 */, /*26164*/"Hangul Syllable KYANH"/* CEB2 */,/*26165*/"Hangul Syllable KYAD"/* CEB3 */, /*26166*/"Hangul Syllable KYAL"/* CEB4 */,/*26167*/"Hangul Syllable KYALG"/* CEB5 */, /*26168*/"Hangul Syllable KYALM"/* CEB6 */,/*26169*/"Hangul Syllable KYALB"/* CEB7 */, /*26170*/"Hangul Syllable KYALS"/* CEB8 */,/*26171*/"Hangul Syllable KYALT"/* CEB9 */, /*26172*/"Hangul Syllable KYALP"/* CEBA */,/*26173*/"Hangul Syllable KYALH"/* CEBB */, /*26174*/"Hangul Syllable KYAM"/* CEBC */,/*26175*/"Hangul Syllable KYAB"/* CEBD */, /*26176*/"Hangul Syllable KYABS"/* CEBE */,/*26177*/"Hangul Syllable KYAS"/* CEBF */, /*26178*/"Hangul Syllable KYASS"/* CEC0 */,/*26179*/"Hangul Syllable KYANG"/* CEC1 */, /*26180*/"Hangul Syllable KYAJ"/* CEC2 */,/*26181*/"Hangul Syllable KYAC"/* CEC3 */, /*26182*/"Hangul Syllable KYAK"/* CEC4 */,/*26183*/"Hangul Syllable KYAT"/* CEC5 */, /*26184*/"Hangul Syllable KYAP"/* CEC6 */,/*26185*/"Hangul Syllable KYAH"/* CEC7 */, /*26186*/"Hangul Syllable KYAE"/* CEC8 */,/*26187*/"Hangul Syllable KYAEG"/* CEC9 */, /*26188*/"Hangul Syllable KYAEGG"/* CECA */,/*26189*/"Hangul Syllable KYAEGS"/* CECB */, /*26190*/"Hangul Syllable KYAEN"/* CECC */,/*26191*/"Hangul Syllable KYAENJ"/* CECD */, /*26192*/"Hangul Syllable KYAENH"/* CECE */,/*26193*/"Hangul Syllable KYAED"/* CECF */, /*26194*/"Hangul Syllable KYAEL"/* CED0 */,/*26195*/"Hangul Syllable KYAELG"/* CED1 */, /*26196*/"Hangul Syllable KYAELM"/* CED2 */,/*26197*/"Hangul Syllable KYAELB"/* CED3 */, /*26198*/"Hangul Syllable KYAELS"/* CED4 */,/*26199*/"Hangul Syllable KYAELT"/* CED5 */, /*26200*/"Hangul Syllable KYAELP"/* CED6 */,/*26201*/"Hangul Syllable KYAELH"/* CED7 */, /*26202*/"Hangul Syllable KYAEM"/* CED8 */,/*26203*/"Hangul Syllable KYAEB"/* CED9 */, /*26204*/"Hangul Syllable KYAEBS"/* CEDA */,/*26205*/"Hangul Syllable KYAES"/* CEDB */, /*26206*/"Hangul Syllable KYAESS"/* CEDC */,/*26207*/"Hangul Syllable KYAENG"/* CEDD */, /*26208*/"Hangul Syllable KYAEJ"/* CEDE */,/*26209*/"Hangul Syllable KYAEC"/* CEDF */, /*26210*/"Hangul Syllable KYAEK"/* CEE0 */,/*26211*/"Hangul Syllable KYAET"/* CEE1 */, /*26212*/"Hangul Syllable KYAEP"/* CEE2 */,/*26213*/"Hangul Syllable KYAEH"/* CEE3 */, /*26214*/"Hangul Syllable KEO"/* CEE4 */,/*26215*/"Hangul Syllable KEOG"/* CEE5 */, /*26216*/"Hangul Syllable KEOGG"/* CEE6 */,/*26217*/"Hangul Syllable KEOGS"/* CEE7 */, /*26218*/"Hangul Syllable KEON"/* CEE8 */,/*26219*/"Hangul Syllable KEONJ"/* CEE9 */, /*26220*/"Hangul Syllable KEONH"/* CEEA */,/*26221*/"Hangul Syllable KEOD"/* CEEB */, /*26222*/"Hangul Syllable KEOL"/* CEEC */,/*26223*/"Hangul Syllable KEOLG"/* CEED */, /*26224*/"Hangul Syllable KEOLM"/* CEEE */,/*26225*/"Hangul Syllable KEOLB"/* CEEF */, /*26226*/"Hangul Syllable KEOLS"/* CEF0 */,/*26227*/"Hangul Syllable KEOLT"/* CEF1 */, /*26228*/"Hangul Syllable KEOLP"/* CEF2 */,/*26229*/"Hangul Syllable KEOLH"/* CEF3 */, /*26230*/"Hangul Syllable KEOM"/* CEF4 */,/*26231*/"Hangul Syllable KEOB"/* CEF5 */, /*26232*/"Hangul Syllable KEOBS"/* CEF6 */,/*26233*/"Hangul Syllable KEOS"/* CEF7 */, /*26234*/"Hangul Syllable KEOSS"/* CEF8 */,/*26235*/"Hangul Syllable KEONG"/* CEF9 */, /*26236*/"Hangul Syllable KEOJ"/* CEFA */,/*26237*/"Hangul Syllable KEOC"/* CEFB */, /*26238*/"Hangul Syllable KEOK"/* CEFC */,/*26239*/"Hangul Syllable KEOT"/* CEFD */, /*26240*/"Hangul Syllable KEOP"/* CEFE */,/*26241*/"Hangul Syllable KEOH"/* CEFF */, /*26242*/"Hangul Syllable KE"/* CF00 */,/*26243*/"Hangul Syllable KEG"/* CF01 */, /*26244*/"Hangul Syllable KEGG"/* CF02 */,/*26245*/"Hangul Syllable KEGS"/* CF03 */, /*26246*/"Hangul Syllable KEN"/* CF04 */,/*26247*/"Hangul Syllable KENJ"/* CF05 */, /*26248*/"Hangul Syllable KENH"/* CF06 */,/*26249*/"Hangul Syllable KED"/* CF07 */, /*26250*/"Hangul Syllable KEL"/* CF08 */,/*26251*/"Hangul Syllable KELG"/* CF09 */, /*26252*/"Hangul Syllable KELM"/* CF0A */,/*26253*/"Hangul Syllable KELB"/* CF0B */, /*26254*/"Hangul Syllable KELS"/* CF0C */,/*26255*/"Hangul Syllable KELT"/* CF0D */, /*26256*/"Hangul Syllable KELP"/* CF0E */,/*26257*/"Hangul Syllable KELH"/* CF0F */, /*26258*/"Hangul Syllable KEM"/* CF10 */,/*26259*/"Hangul Syllable KEB"/* CF11 */, /*26260*/"Hangul Syllable KEBS"/* CF12 */,/*26261*/"Hangul Syllable KES"/* CF13 */, /*26262*/"Hangul Syllable KESS"/* CF14 */,/*26263*/"Hangul Syllable KENG"/* CF15 */, /*26264*/"Hangul Syllable KEJ"/* CF16 */,/*26265*/"Hangul Syllable KEC"/* CF17 */, /*26266*/"Hangul Syllable KEK"/* CF18 */,/*26267*/"Hangul Syllable KET"/* CF19 */, /*26268*/"Hangul Syllable KEP"/* CF1A */,/*26269*/"Hangul Syllable KEH"/* CF1B */, /*26270*/"Hangul Syllable KYEO"/* CF1C */,/*26271*/"Hangul Syllable KYEOG"/* CF1D */, /*26272*/"Hangul Syllable KYEOGG"/* CF1E */,/*26273*/"Hangul Syllable KYEOGS"/* CF1F */, /*26274*/"Hangul Syllable KYEON"/* CF20 */,/*26275*/"Hangul Syllable KYEONJ"/* CF21 */, /*26276*/"Hangul Syllable KYEONH"/* CF22 */,/*26277*/"Hangul Syllable KYEOD"/* CF23 */, /*26278*/"Hangul Syllable KYEOL"/* CF24 */,/*26279*/"Hangul Syllable KYEOLG"/* CF25 */, /*26280*/"Hangul Syllable KYEOLM"/* CF26 */,/*26281*/"Hangul Syllable KYEOLB"/* CF27 */, /*26282*/"Hangul Syllable KYEOLS"/* CF28 */,/*26283*/"Hangul Syllable KYEOLT"/* CF29 */, /*26284*/"Hangul Syllable KYEOLP"/* CF2A */,/*26285*/"Hangul Syllable KYEOLH"/* CF2B */, /*26286*/"Hangul Syllable KYEOM"/* CF2C */,/*26287*/"Hangul Syllable KYEOB"/* CF2D */, /*26288*/"Hangul Syllable KYEOBS"/* CF2E */,/*26289*/"Hangul Syllable KYEOS"/* CF2F */, /*26290*/"Hangul Syllable KYEOSS"/* CF30 */,/*26291*/"Hangul Syllable KYEONG"/* CF31 */, /*26292*/"Hangul Syllable KYEOJ"/* CF32 */,/*26293*/"Hangul Syllable KYEOC"/* CF33 */, /*26294*/"Hangul Syllable KYEOK"/* CF34 */,/*26295*/"Hangul Syllable KYEOT"/* CF35 */, /*26296*/"Hangul Syllable KYEOP"/* CF36 */,/*26297*/"Hangul Syllable KYEOH"/* CF37 */, /*26298*/"Hangul Syllable KYE"/* CF38 */,/*26299*/"Hangul Syllable KYEG"/* CF39 */, /*26300*/"Hangul Syllable KYEGG"/* CF3A */,/*26301*/"Hangul Syllable KYEGS"/* CF3B */, /*26302*/"Hangul Syllable KYEN"/* CF3C */,/*26303*/"Hangul Syllable KYENJ"/* CF3D */, /*26304*/"Hangul Syllable KYENH"/* CF3E */,/*26305*/"Hangul Syllable KYED"/* CF3F */, /*26306*/"Hangul Syllable KYEL"/* CF40 */,/*26307*/"Hangul Syllable KYELG"/* CF41 */, /*26308*/"Hangul Syllable KYELM"/* CF42 */,/*26309*/"Hangul Syllable KYELB"/* CF43 */, /*26310*/"Hangul Syllable KYELS"/* CF44 */,/*26311*/"Hangul Syllable KYELT"/* CF45 */, /*26312*/"Hangul Syllable KYELP"/* CF46 */,/*26313*/"Hangul Syllable KYELH"/* CF47 */, /*26314*/"Hangul Syllable KYEM"/* CF48 */,/*26315*/"Hangul Syllable KYEB"/* CF49 */, /*26316*/"Hangul Syllable KYEBS"/* CF4A */,/*26317*/"Hangul Syllable KYES"/* CF4B */, /*26318*/"Hangul Syllable KYESS"/* CF4C */,/*26319*/"Hangul Syllable KYENG"/* CF4D */, /*26320*/"Hangul Syllable KYEJ"/* CF4E */,/*26321*/"Hangul Syllable KYEC"/* CF4F */, /*26322*/"Hangul Syllable KYEK"/* CF50 */,/*26323*/"Hangul Syllable KYET"/* CF51 */, /*26324*/"Hangul Syllable KYEP"/* CF52 */,/*26325*/"Hangul Syllable KYEH"/* CF53 */, /*26326*/"Hangul Syllable KO"/* CF54 */,/*26327*/"Hangul Syllable KOG"/* CF55 */, /*26328*/"Hangul Syllable KOGG"/* CF56 */,/*26329*/"Hangul Syllable KOGS"/* CF57 */, /*26330*/"Hangul Syllable KON"/* CF58 */,/*26331*/"Hangul Syllable KONJ"/* CF59 */, /*26332*/"Hangul Syllable KONH"/* CF5A */,/*26333*/"Hangul Syllable KOD"/* CF5B */, /*26334*/"Hangul Syllable KOL"/* CF5C */,/*26335*/"Hangul Syllable KOLG"/* CF5D */, /*26336*/"Hangul Syllable KOLM"/* CF5E */,/*26337*/"Hangul Syllable KOLB"/* CF5F */, /*26338*/"Hangul Syllable KOLS"/* CF60 */,/*26339*/"Hangul Syllable KOLT"/* CF61 */, /*26340*/"Hangul Syllable KOLP"/* CF62 */,/*26341*/"Hangul Syllable KOLH"/* CF63 */, /*26342*/"Hangul Syllable KOM"/* CF64 */,/*26343*/"Hangul Syllable KOB"/* CF65 */, /*26344*/"Hangul Syllable KOBS"/* CF66 */,/*26345*/"Hangul Syllable KOS"/* CF67 */, /*26346*/"Hangul Syllable KOSS"/* CF68 */,/*26347*/"Hangul Syllable KONG"/* CF69 */, /*26348*/"Hangul Syllable KOJ"/* CF6A */,/*26349*/"Hangul Syllable KOC"/* CF6B */, /*26350*/"Hangul Syllable KOK"/* CF6C */,/*26351*/"Hangul Syllable KOT"/* CF6D */, /*26352*/"Hangul Syllable KOP"/* CF6E */,/*26353*/"Hangul Syllable KOH"/* CF6F */, /*26354*/"Hangul Syllable KWA"/* CF70 */,/*26355*/"Hangul Syllable KWAG"/* CF71 */, /*26356*/"Hangul Syllable KWAGG"/* CF72 */,/*26357*/"Hangul Syllable KWAGS"/* CF73 */, /*26358*/"Hangul Syllable KWAN"/* CF74 */,/*26359*/"Hangul Syllable KWANJ"/* CF75 */, /*26360*/"Hangul Syllable KWANH"/* CF76 */,/*26361*/"Hangul Syllable KWAD"/* CF77 */, /*26362*/"Hangul Syllable KWAL"/* CF78 */,/*26363*/"Hangul Syllable KWALG"/* CF79 */, /*26364*/"Hangul Syllable KWALM"/* CF7A */,/*26365*/"Hangul Syllable KWALB"/* CF7B */, /*26366*/"Hangul Syllable KWALS"/* CF7C */,/*26367*/"Hangul Syllable KWALT"/* CF7D */, /*26368*/"Hangul Syllable KWALP"/* CF7E */,/*26369*/"Hangul Syllable KWALH"/* CF7F */, /*26370*/"Hangul Syllable KWAM"/* CF80 */,/*26371*/"Hangul Syllable KWAB"/* CF81 */, /*26372*/"Hangul Syllable KWABS"/* CF82 */,/*26373*/"Hangul Syllable KWAS"/* CF83 */, /*26374*/"Hangul Syllable KWASS"/* CF84 */,/*26375*/"Hangul Syllable KWANG"/* CF85 */, /*26376*/"Hangul Syllable KWAJ"/* CF86 */,/*26377*/"Hangul Syllable KWAC"/* CF87 */, /*26378*/"Hangul Syllable KWAK"/* CF88 */,/*26379*/"Hangul Syllable KWAT"/* CF89 */, /*26380*/"Hangul Syllable KWAP"/* CF8A */,/*26381*/"Hangul Syllable KWAH"/* CF8B */, /*26382*/"Hangul Syllable KWAE"/* CF8C */,/*26383*/"Hangul Syllable KWAEG"/* CF8D */, /*26384*/"Hangul Syllable KWAEGG"/* CF8E */,/*26385*/"Hangul Syllable KWAEGS"/* CF8F */, /*26386*/"Hangul Syllable KWAEN"/* CF90 */,/*26387*/"Hangul Syllable KWAENJ"/* CF91 */, /*26388*/"Hangul Syllable KWAENH"/* CF92 */,/*26389*/"Hangul Syllable KWAED"/* CF93 */, /*26390*/"Hangul Syllable KWAEL"/* CF94 */,/*26391*/"Hangul Syllable KWAELG"/* CF95 */, /*26392*/"Hangul Syllable KWAELM"/* CF96 */,/*26393*/"Hangul Syllable KWAELB"/* CF97 */, /*26394*/"Hangul Syllable KWAELS"/* CF98 */,/*26395*/"Hangul Syllable KWAELT"/* CF99 */, /*26396*/"Hangul Syllable KWAELP"/* CF9A */,/*26397*/"Hangul Syllable KWAELH"/* CF9B */, /*26398*/"Hangul Syllable KWAEM"/* CF9C */,/*26399*/"Hangul Syllable KWAEB"/* CF9D */, /*26400*/"Hangul Syllable KWAEBS"/* CF9E */,/*26401*/"Hangul Syllable KWAES"/* CF9F */, /*26402*/"Hangul Syllable KWAESS"/* CFA0 */,/*26403*/"Hangul Syllable KWAENG"/* CFA1 */, /*26404*/"Hangul Syllable KWAEJ"/* CFA2 */,/*26405*/"Hangul Syllable KWAEC"/* CFA3 */, /*26406*/"Hangul Syllable KWAEK"/* CFA4 */,/*26407*/"Hangul Syllable KWAET"/* CFA5 */, /*26408*/"Hangul Syllable KWAEP"/* CFA6 */,/*26409*/"Hangul Syllable KWAEH"/* CFA7 */, /*26410*/"Hangul Syllable KOE"/* CFA8 */,/*26411*/"Hangul Syllable KOEG"/* CFA9 */, /*26412*/"Hangul Syllable KOEGG"/* CFAA */,/*26413*/"Hangul Syllable KOEGS"/* CFAB */, /*26414*/"Hangul Syllable KOEN"/* CFAC */,/*26415*/"Hangul Syllable KOENJ"/* CFAD */, /*26416*/"Hangul Syllable KOENH"/* CFAE */,/*26417*/"Hangul Syllable KOED"/* CFAF */, /*26418*/"Hangul Syllable KOEL"/* CFB0 */,/*26419*/"Hangul Syllable KOELG"/* CFB1 */, /*26420*/"Hangul Syllable KOELM"/* CFB2 */,/*26421*/"Hangul Syllable KOELB"/* CFB3 */, /*26422*/"Hangul Syllable KOELS"/* CFB4 */,/*26423*/"Hangul Syllable KOELT"/* CFB5 */, /*26424*/"Hangul Syllable KOELP"/* CFB6 */,/*26425*/"Hangul Syllable KOELH"/* CFB7 */, /*26426*/"Hangul Syllable KOEM"/* CFB8 */,/*26427*/"Hangul Syllable KOEB"/* CFB9 */, /*26428*/"Hangul Syllable KOEBS"/* CFBA */,/*26429*/"Hangul Syllable KOES"/* CFBB */, /*26430*/"Hangul Syllable KOESS"/* CFBC */,/*26431*/"Hangul Syllable KOENG"/* CFBD */, /*26432*/"Hangul Syllable KOEJ"/* CFBE */,/*26433*/"Hangul Syllable KOEC"/* CFBF */, /*26434*/"Hangul Syllable KOEK"/* CFC0 */,/*26435*/"Hangul Syllable KOET"/* CFC1 */, /*26436*/"Hangul Syllable KOEP"/* CFC2 */,/*26437*/"Hangul Syllable KOEH"/* CFC3 */, /*26438*/"Hangul Syllable KYO"/* CFC4 */,/*26439*/"Hangul Syllable KYOG"/* CFC5 */, /*26440*/"Hangul Syllable KYOGG"/* CFC6 */,/*26441*/"Hangul Syllable KYOGS"/* CFC7 */, /*26442*/"Hangul Syllable KYON"/* CFC8 */,/*26443*/"Hangul Syllable KYONJ"/* CFC9 */, /*26444*/"Hangul Syllable KYONH"/* CFCA */,/*26445*/"Hangul Syllable KYOD"/* CFCB */, /*26446*/"Hangul Syllable KYOL"/* CFCC */,/*26447*/"Hangul Syllable KYOLG"/* CFCD */, /*26448*/"Hangul Syllable KYOLM"/* CFCE */,/*26449*/"Hangul Syllable KYOLB"/* CFCF */, /*26450*/"Hangul Syllable KYOLS"/* CFD0 */,/*26451*/"Hangul Syllable KYOLT"/* CFD1 */, /*26452*/"Hangul Syllable KYOLP"/* CFD2 */,/*26453*/"Hangul Syllable KYOLH"/* CFD3 */, /*26454*/"Hangul Syllable KYOM"/* CFD4 */,/*26455*/"Hangul Syllable KYOB"/* CFD5 */, /*26456*/"Hangul Syllable KYOBS"/* CFD6 */,/*26457*/"Hangul Syllable KYOS"/* CFD7 */, /*26458*/"Hangul Syllable KYOSS"/* CFD8 */,/*26459*/"Hangul Syllable KYONG"/* CFD9 */, /*26460*/"Hangul Syllable KYOJ"/* CFDA */,/*26461*/"Hangul Syllable KYOC"/* CFDB */, /*26462*/"Hangul Syllable KYOK"/* CFDC */,/*26463*/"Hangul Syllable KYOT"/* CFDD */, /*26464*/"Hangul Syllable KYOP"/* CFDE */,/*26465*/"Hangul Syllable KYOH"/* CFDF */, /*26466*/"Hangul Syllable KU"/* CFE0 */,/*26467*/"Hangul Syllable KUG"/* CFE1 */, /*26468*/"Hangul Syllable KUGG"/* CFE2 */,/*26469*/"Hangul Syllable KUGS"/* CFE3 */, /*26470*/"Hangul Syllable KUN"/* CFE4 */,/*26471*/"Hangul Syllable KUNJ"/* CFE5 */, /*26472*/"Hangul Syllable KUNH"/* CFE6 */,/*26473*/"Hangul Syllable KUD"/* CFE7 */, /*26474*/"Hangul Syllable KUL"/* CFE8 */,/*26475*/"Hangul Syllable KULG"/* CFE9 */, /*26476*/"Hangul Syllable KULM"/* CFEA */,/*26477*/"Hangul Syllable KULB"/* CFEB */, /*26478*/"Hangul Syllable KULS"/* CFEC */,/*26479*/"Hangul Syllable KULT"/* CFED */, /*26480*/"Hangul Syllable KULP"/* CFEE */,/*26481*/"Hangul Syllable KULH"/* CFEF */, /*26482*/"Hangul Syllable KUM"/* CFF0 */,/*26483*/"Hangul Syllable KUB"/* CFF1 */, /*26484*/"Hangul Syllable KUBS"/* CFF2 */,/*26485*/"Hangul Syllable KUS"/* CFF3 */, /*26486*/"Hangul Syllable KUSS"/* CFF4 */,/*26487*/"Hangul Syllable KUNG"/* CFF5 */, /*26488*/"Hangul Syllable KUJ"/* CFF6 */,/*26489*/"Hangul Syllable KUC"/* CFF7 */, /*26490*/"Hangul Syllable KUK"/* CFF8 */,/*26491*/"Hangul Syllable KUT"/* CFF9 */, /*26492*/"Hangul Syllable KUP"/* CFFA */,/*26493*/"Hangul Syllable KUH"/* CFFB */, /*26494*/"Hangul Syllable KWEO"/* CFFC */,/*26495*/"Hangul Syllable KWEOG"/* CFFD */, /*26496*/"Hangul Syllable KWEOGG"/* CFFE */,/*26497*/"Hangul Syllable KWEOGS"/* CFFF */, /*26498*/"Hangul Syllable KWEON"/* D000 */,/*26499*/"Hangul Syllable KWEONJ"/* D001 */, /*26500*/"Hangul Syllable KWEONH"/* D002 */,/*26501*/"Hangul Syllable KWEOD"/* D003 */, /*26502*/"Hangul Syllable KWEOL"/* D004 */,/*26503*/"Hangul Syllable KWEOLG"/* D005 */, /*26504*/"Hangul Syllable KWEOLM"/* D006 */,/*26505*/"Hangul Syllable KWEOLB"/* D007 */, /*26506*/"Hangul Syllable KWEOLS"/* D008 */,/*26507*/"Hangul Syllable KWEOLT"/* D009 */, /*26508*/"Hangul Syllable KWEOLP"/* D00A */,/*26509*/"Hangul Syllable KWEOLH"/* D00B */, /*26510*/"Hangul Syllable KWEOM"/* D00C */,/*26511*/"Hangul Syllable KWEOB"/* D00D */, /*26512*/"Hangul Syllable KWEOBS"/* D00E */,/*26513*/"Hangul Syllable KWEOS"/* D00F */, /*26514*/"Hangul Syllable KWEOSS"/* D010 */,/*26515*/"Hangul Syllable KWEONG"/* D011 */, /*26516*/"Hangul Syllable KWEOJ"/* D012 */,/*26517*/"Hangul Syllable KWEOC"/* D013 */, /*26518*/"Hangul Syllable KWEOK"/* D014 */,/*26519*/"Hangul Syllable KWEOT"/* D015 */, /*26520*/"Hangul Syllable KWEOP"/* D016 */,/*26521*/"Hangul Syllable KWEOH"/* D017 */, /*26522*/"Hangul Syllable KWE"/* D018 */,/*26523*/"Hangul Syllable KWEG"/* D019 */, /*26524*/"Hangul Syllable KWEGG"/* D01A */,/*26525*/"Hangul Syllable KWEGS"/* D01B */, /*26526*/"Hangul Syllable KWEN"/* D01C */,/*26527*/"Hangul Syllable KWENJ"/* D01D */, /*26528*/"Hangul Syllable KWENH"/* D01E */,/*26529*/"Hangul Syllable KWED"/* D01F */, /*26530*/"Hangul Syllable KWEL"/* D020 */,/*26531*/"Hangul Syllable KWELG"/* D021 */, /*26532*/"Hangul Syllable KWELM"/* D022 */,/*26533*/"Hangul Syllable KWELB"/* D023 */, /*26534*/"Hangul Syllable KWELS"/* D024 */,/*26535*/"Hangul Syllable KWELT"/* D025 */, /*26536*/"Hangul Syllable KWELP"/* D026 */,/*26537*/"Hangul Syllable KWELH"/* D027 */, /*26538*/"Hangul Syllable KWEM"/* D028 */,/*26539*/"Hangul Syllable KWEB"/* D029 */, /*26540*/"Hangul Syllable KWEBS"/* D02A */,/*26541*/"Hangul Syllable KWES"/* D02B */, /*26542*/"Hangul Syllable KWESS"/* D02C */,/*26543*/"Hangul Syllable KWENG"/* D02D */, /*26544*/"Hangul Syllable KWEJ"/* D02E */,/*26545*/"Hangul Syllable KWEC"/* D02F */, /*26546*/"Hangul Syllable KWEK"/* D030 */,/*26547*/"Hangul Syllable KWET"/* D031 */, /*26548*/"Hangul Syllable KWEP"/* D032 */,/*26549*/"Hangul Syllable KWEH"/* D033 */, /*26550*/"Hangul Syllable KWI"/* D034 */,/*26551*/"Hangul Syllable KWIG"/* D035 */, /*26552*/"Hangul Syllable KWIGG"/* D036 */,/*26553*/"Hangul Syllable KWIGS"/* D037 */, /*26554*/"Hangul Syllable KWIN"/* D038 */,/*26555*/"Hangul Syllable KWINJ"/* D039 */, /*26556*/"Hangul Syllable KWINH"/* D03A */,/*26557*/"Hangul Syllable KWID"/* D03B */, /*26558*/"Hangul Syllable KWIL"/* D03C */,/*26559*/"Hangul Syllable KWILG"/* D03D */, /*26560*/"Hangul Syllable KWILM"/* D03E */,/*26561*/"Hangul Syllable KWILB"/* D03F */, /*26562*/"Hangul Syllable KWILS"/* D040 */,/*26563*/"Hangul Syllable KWILT"/* D041 */, /*26564*/"Hangul Syllable KWILP"/* D042 */,/*26565*/"Hangul Syllable KWILH"/* D043 */, /*26566*/"Hangul Syllable KWIM"/* D044 */,/*26567*/"Hangul Syllable KWIB"/* D045 */, /*26568*/"Hangul Syllable KWIBS"/* D046 */,/*26569*/"Hangul Syllable KWIS"/* D047 */, /*26570*/"Hangul Syllable KWISS"/* D048 */,/*26571*/"Hangul Syllable KWING"/* D049 */, /*26572*/"Hangul Syllable KWIJ"/* D04A */,/*26573*/"Hangul Syllable KWIC"/* D04B */, /*26574*/"Hangul Syllable KWIK"/* D04C */,/*26575*/"Hangul Syllable KWIT"/* D04D */, /*26576*/"Hangul Syllable KWIP"/* D04E */,/*26577*/"Hangul Syllable KWIH"/* D04F */, /*26578*/"Hangul Syllable KYU"/* D050 */,/*26579*/"Hangul Syllable KYUG"/* D051 */, /*26580*/"Hangul Syllable KYUGG"/* D052 */,/*26581*/"Hangul Syllable KYUGS"/* D053 */, /*26582*/"Hangul Syllable KYUN"/* D054 */,/*26583*/"Hangul Syllable KYUNJ"/* D055 */, /*26584*/"Hangul Syllable KYUNH"/* D056 */,/*26585*/"Hangul Syllable KYUD"/* D057 */, /*26586*/"Hangul Syllable KYUL"/* D058 */,/*26587*/"Hangul Syllable KYULG"/* D059 */, /*26588*/"Hangul Syllable KYULM"/* D05A */,/*26589*/"Hangul Syllable KYULB"/* D05B */, /*26590*/"Hangul Syllable KYULS"/* D05C */,/*26591*/"Hangul Syllable KYULT"/* D05D */, /*26592*/"Hangul Syllable KYULP"/* D05E */,/*26593*/"Hangul Syllable KYULH"/* D05F */, /*26594*/"Hangul Syllable KYUM"/* D060 */,/*26595*/"Hangul Syllable KYUB"/* D061 */, /*26596*/"Hangul Syllable KYUBS"/* D062 */,/*26597*/"Hangul Syllable KYUS"/* D063 */, /*26598*/"Hangul Syllable KYUSS"/* D064 */,/*26599*/"Hangul Syllable KYUNG"/* D065 */, /*26600*/"Hangul Syllable KYUJ"/* D066 */,/*26601*/"Hangul Syllable KYUC"/* D067 */, /*26602*/"Hangul Syllable KYUK"/* D068 */,/*26603*/"Hangul Syllable KYUT"/* D069 */, /*26604*/"Hangul Syllable KYUP"/* D06A */,/*26605*/"Hangul Syllable KYUH"/* D06B */, /*26606*/"Hangul Syllable KEU"/* D06C */,/*26607*/"Hangul Syllable KEUG"/* D06D */, /*26608*/"Hangul Syllable KEUGG"/* D06E */,/*26609*/"Hangul Syllable KEUGS"/* D06F */, /*26610*/"Hangul Syllable KEUN"/* D070 */,/*26611*/"Hangul Syllable KEUNJ"/* D071 */, /*26612*/"Hangul Syllable KEUNH"/* D072 */,/*26613*/"Hangul Syllable KEUD"/* D073 */, /*26614*/"Hangul Syllable KEUL"/* D074 */,/*26615*/"Hangul Syllable KEULG"/* D075 */, /*26616*/"Hangul Syllable KEULM"/* D076 */,/*26617*/"Hangul Syllable KEULB"/* D077 */, /*26618*/"Hangul Syllable KEULS"/* D078 */,/*26619*/"Hangul Syllable KEULT"/* D079 */, /*26620*/"Hangul Syllable KEULP"/* D07A */,/*26621*/"Hangul Syllable KEULH"/* D07B */, /*26622*/"Hangul Syllable KEUM"/* D07C */,/*26623*/"Hangul Syllable KEUB"/* D07D */, /*26624*/"Hangul Syllable KEUBS"/* D07E */,/*26625*/"Hangul Syllable KEUS"/* D07F */, /*26626*/"Hangul Syllable KEUSS"/* D080 */,/*26627*/"Hangul Syllable KEUNG"/* D081 */, /*26628*/"Hangul Syllable KEUJ"/* D082 */,/*26629*/"Hangul Syllable KEUC"/* D083 */, /*26630*/"Hangul Syllable KEUK"/* D084 */,/*26631*/"Hangul Syllable KEUT"/* D085 */, /*26632*/"Hangul Syllable KEUP"/* D086 */,/*26633*/"Hangul Syllable KEUH"/* D087 */, /*26634*/"Hangul Syllable KYI"/* D088 */,/*26635*/"Hangul Syllable KYIG"/* D089 */, /*26636*/"Hangul Syllable KYIGG"/* D08A */,/*26637*/"Hangul Syllable KYIGS"/* D08B */, /*26638*/"Hangul Syllable KYIN"/* D08C */,/*26639*/"Hangul Syllable KYINJ"/* D08D */, /*26640*/"Hangul Syllable KYINH"/* D08E */,/*26641*/"Hangul Syllable KYID"/* D08F */, /*26642*/"Hangul Syllable KYIL"/* D090 */,/*26643*/"Hangul Syllable KYILG"/* D091 */, /*26644*/"Hangul Syllable KYILM"/* D092 */,/*26645*/"Hangul Syllable KYILB"/* D093 */, /*26646*/"Hangul Syllable KYILS"/* D094 */,/*26647*/"Hangul Syllable KYILT"/* D095 */, /*26648*/"Hangul Syllable KYILP"/* D096 */,/*26649*/"Hangul Syllable KYILH"/* D097 */, /*26650*/"Hangul Syllable KYIM"/* D098 */,/*26651*/"Hangul Syllable KYIB"/* D099 */, /*26652*/"Hangul Syllable KYIBS"/* D09A */,/*26653*/"Hangul Syllable KYIS"/* D09B */, /*26654*/"Hangul Syllable KYISS"/* D09C */,/*26655*/"Hangul Syllable KYING"/* D09D */, /*26656*/"Hangul Syllable KYIJ"/* D09E */,/*26657*/"Hangul Syllable KYIC"/* D09F */, /*26658*/"Hangul Syllable KYIK"/* D0A0 */,/*26659*/"Hangul Syllable KYIT"/* D0A1 */, /*26660*/"Hangul Syllable KYIP"/* D0A2 */,/*26661*/"Hangul Syllable KYIH"/* D0A3 */, /*26662*/"Hangul Syllable KI"/* D0A4 */,/*26663*/"Hangul Syllable KIG"/* D0A5 */, /*26664*/"Hangul Syllable KIGG"/* D0A6 */,/*26665*/"Hangul Syllable KIGS"/* D0A7 */, /*26666*/"Hangul Syllable KIN"/* D0A8 */,/*26667*/"Hangul Syllable KINJ"/* D0A9 */, /*26668*/"Hangul Syllable KINH"/* D0AA */,/*26669*/"Hangul Syllable KID"/* D0AB */, /*26670*/"Hangul Syllable KIL"/* D0AC */,/*26671*/"Hangul Syllable KILG"/* D0AD */, /*26672*/"Hangul Syllable KILM"/* D0AE */,/*26673*/"Hangul Syllable KILB"/* D0AF */, /*26674*/"Hangul Syllable KILS"/* D0B0 */,/*26675*/"Hangul Syllable KILT"/* D0B1 */, /*26676*/"Hangul Syllable KILP"/* D0B2 */,/*26677*/"Hangul Syllable KILH"/* D0B3 */, /*26678*/"Hangul Syllable KIM"/* D0B4 */,/*26679*/"Hangul Syllable KIB"/* D0B5 */, /*26680*/"Hangul Syllable KIBS"/* D0B6 */,/*26681*/"Hangul Syllable KIS"/* D0B7 */, /*26682*/"Hangul Syllable KISS"/* D0B8 */,/*26683*/"Hangul Syllable KING"/* D0B9 */, /*26684*/"Hangul Syllable KIJ"/* D0BA */,/*26685*/"Hangul Syllable KIC"/* D0BB */, /*26686*/"Hangul Syllable KIK"/* D0BC */,/*26687*/"Hangul Syllable KIT"/* D0BD */, /*26688*/"Hangul Syllable KIP"/* D0BE */,/*26689*/"Hangul Syllable KIH"/* D0BF */, /*26690*/"Hangul Syllable TA"/* D0C0 */,/*26691*/"Hangul Syllable TAG"/* D0C1 */, /*26692*/"Hangul Syllable TAGG"/* D0C2 */,/*26693*/"Hangul Syllable TAGS"/* D0C3 */, /*26694*/"Hangul Syllable TAN"/* D0C4 */,/*26695*/"Hangul Syllable TANJ"/* D0C5 */, /*26696*/"Hangul Syllable TANH"/* D0C6 */,/*26697*/"Hangul Syllable TAD"/* D0C7 */, /*26698*/"Hangul Syllable TAL"/* D0C8 */,/*26699*/"Hangul Syllable TALG"/* D0C9 */, /*26700*/"Hangul Syllable TALM"/* D0CA */,/*26701*/"Hangul Syllable TALB"/* D0CB */, /*26702*/"Hangul Syllable TALS"/* D0CC */,/*26703*/"Hangul Syllable TALT"/* D0CD */, /*26704*/"Hangul Syllable TALP"/* D0CE */,/*26705*/"Hangul Syllable TALH"/* D0CF */, /*26706*/"Hangul Syllable TAM"/* D0D0 */,/*26707*/"Hangul Syllable TAB"/* D0D1 */, /*26708*/"Hangul Syllable TABS"/* D0D2 */,/*26709*/"Hangul Syllable TAS"/* D0D3 */, /*26710*/"Hangul Syllable TASS"/* D0D4 */,/*26711*/"Hangul Syllable TANG"/* D0D5 */, /*26712*/"Hangul Syllable TAJ"/* D0D6 */,/*26713*/"Hangul Syllable TAC"/* D0D7 */, /*26714*/"Hangul Syllable TAK"/* D0D8 */,/*26715*/"Hangul Syllable TAT"/* D0D9 */, /*26716*/"Hangul Syllable TAP"/* D0DA */,/*26717*/"Hangul Syllable TAH"/* D0DB */, /*26718*/"Hangul Syllable TAE"/* D0DC */,/*26719*/"Hangul Syllable TAEG"/* D0DD */, /*26720*/"Hangul Syllable TAEGG"/* D0DE */,/*26721*/"Hangul Syllable TAEGS"/* D0DF */, /*26722*/"Hangul Syllable TAEN"/* D0E0 */,/*26723*/"Hangul Syllable TAENJ"/* D0E1 */, /*26724*/"Hangul Syllable TAENH"/* D0E2 */,/*26725*/"Hangul Syllable TAED"/* D0E3 */, /*26726*/"Hangul Syllable TAEL"/* D0E4 */,/*26727*/"Hangul Syllable TAELG"/* D0E5 */, /*26728*/"Hangul Syllable TAELM"/* D0E6 */,/*26729*/"Hangul Syllable TAELB"/* D0E7 */, /*26730*/"Hangul Syllable TAELS"/* D0E8 */,/*26731*/"Hangul Syllable TAELT"/* D0E9 */, /*26732*/"Hangul Syllable TAELP"/* D0EA */,/*26733*/"Hangul Syllable TAELH"/* D0EB */, /*26734*/"Hangul Syllable TAEM"/* D0EC */,/*26735*/"Hangul Syllable TAEB"/* D0ED */, /*26736*/"Hangul Syllable TAEBS"/* D0EE */,/*26737*/"Hangul Syllable TAES"/* D0EF */, /*26738*/"Hangul Syllable TAESS"/* D0F0 */,/*26739*/"Hangul Syllable TAENG"/* D0F1 */, /*26740*/"Hangul Syllable TAEJ"/* D0F2 */,/*26741*/"Hangul Syllable TAEC"/* D0F3 */, /*26742*/"Hangul Syllable TAEK"/* D0F4 */,/*26743*/"Hangul Syllable TAET"/* D0F5 */, /*26744*/"Hangul Syllable TAEP"/* D0F6 */,/*26745*/"Hangul Syllable TAEH"/* D0F7 */, /*26746*/"Hangul Syllable TYA"/* D0F8 */,/*26747*/"Hangul Syllable TYAG"/* D0F9 */, /*26748*/"Hangul Syllable TYAGG"/* D0FA */,/*26749*/"Hangul Syllable TYAGS"/* D0FB */, /*26750*/"Hangul Syllable TYAN"/* D0FC */,/*26751*/"Hangul Syllable TYANJ"/* D0FD */, /*26752*/"Hangul Syllable TYANH"/* D0FE */,/*26753*/"Hangul Syllable TYAD"/* D0FF */, /*26754*/"Hangul Syllable TYAL"/* D100 */,/*26755*/"Hangul Syllable TYALG"/* D101 */, /*26756*/"Hangul Syllable TYALM"/* D102 */,/*26757*/"Hangul Syllable TYALB"/* D103 */, /*26758*/"Hangul Syllable TYALS"/* D104 */,/*26759*/"Hangul Syllable TYALT"/* D105 */, /*26760*/"Hangul Syllable TYALP"/* D106 */,/*26761*/"Hangul Syllable TYALH"/* D107 */, /*26762*/"Hangul Syllable TYAM"/* D108 */,/*26763*/"Hangul Syllable TYAB"/* D109 */, /*26764*/"Hangul Syllable TYABS"/* D10A */,/*26765*/"Hangul Syllable TYAS"/* D10B */, /*26766*/"Hangul Syllable TYASS"/* D10C */,/*26767*/"Hangul Syllable TYANG"/* D10D */, /*26768*/"Hangul Syllable TYAJ"/* D10E */,/*26769*/"Hangul Syllable TYAC"/* D10F */, /*26770*/"Hangul Syllable TYAK"/* D110 */,/*26771*/"Hangul Syllable TYAT"/* D111 */, /*26772*/"Hangul Syllable TYAP"/* D112 */,/*26773*/"Hangul Syllable TYAH"/* D113 */, /*26774*/"Hangul Syllable TYAE"/* D114 */,/*26775*/"Hangul Syllable TYAEG"/* D115 */, /*26776*/"Hangul Syllable TYAEGG"/* D116 */,/*26777*/"Hangul Syllable TYAEGS"/* D117 */, /*26778*/"Hangul Syllable TYAEN"/* D118 */,/*26779*/"Hangul Syllable TYAENJ"/* D119 */, /*26780*/"Hangul Syllable TYAENH"/* D11A */,/*26781*/"Hangul Syllable TYAED"/* D11B */, /*26782*/"Hangul Syllable TYAEL"/* D11C */,/*26783*/"Hangul Syllable TYAELG"/* D11D */, /*26784*/"Hangul Syllable TYAELM"/* D11E */,/*26785*/"Hangul Syllable TYAELB"/* D11F */, /*26786*/"Hangul Syllable TYAELS"/* D120 */,/*26787*/"Hangul Syllable TYAELT"/* D121 */, /*26788*/"Hangul Syllable TYAELP"/* D122 */,/*26789*/"Hangul Syllable TYAELH"/* D123 */, /*26790*/"Hangul Syllable TYAEM"/* D124 */,/*26791*/"Hangul Syllable TYAEB"/* D125 */, /*26792*/"Hangul Syllable TYAEBS"/* D126 */,/*26793*/"Hangul Syllable TYAES"/* D127 */, /*26794*/"Hangul Syllable TYAESS"/* D128 */,/*26795*/"Hangul Syllable TYAENG"/* D129 */, /*26796*/"Hangul Syllable TYAEJ"/* D12A */,/*26797*/"Hangul Syllable TYAEC"/* D12B */, /*26798*/"Hangul Syllable TYAEK"/* D12C */,/*26799*/"Hangul Syllable TYAET"/* D12D */, /*26800*/"Hangul Syllable TYAEP"/* D12E */,/*26801*/"Hangul Syllable TYAEH"/* D12F */, /*26802*/"Hangul Syllable TEO"/* D130 */,/*26803*/"Hangul Syllable TEOG"/* D131 */, /*26804*/"Hangul Syllable TEOGG"/* D132 */,/*26805*/"Hangul Syllable TEOGS"/* D133 */, /*26806*/"Hangul Syllable TEON"/* D134 */,/*26807*/"Hangul Syllable TEONJ"/* D135 */, /*26808*/"Hangul Syllable TEONH"/* D136 */,/*26809*/"Hangul Syllable TEOD"/* D137 */, /*26810*/"Hangul Syllable TEOL"/* D138 */,/*26811*/"Hangul Syllable TEOLG"/* D139 */, /*26812*/"Hangul Syllable TEOLM"/* D13A */,/*26813*/"Hangul Syllable TEOLB"/* D13B */, /*26814*/"Hangul Syllable TEOLS"/* D13C */,/*26815*/"Hangul Syllable TEOLT"/* D13D */, /*26816*/"Hangul Syllable TEOLP"/* D13E */,/*26817*/"Hangul Syllable TEOLH"/* D13F */, /*26818*/"Hangul Syllable TEOM"/* D140 */,/*26819*/"Hangul Syllable TEOB"/* D141 */, /*26820*/"Hangul Syllable TEOBS"/* D142 */,/*26821*/"Hangul Syllable TEOS"/* D143 */, /*26822*/"Hangul Syllable TEOSS"/* D144 */,/*26823*/"Hangul Syllable TEONG"/* D145 */, /*26824*/"Hangul Syllable TEOJ"/* D146 */,/*26825*/"Hangul Syllable TEOC"/* D147 */, /*26826*/"Hangul Syllable TEOK"/* D148 */,/*26827*/"Hangul Syllable TEOT"/* D149 */, /*26828*/"Hangul Syllable TEOP"/* D14A */,/*26829*/"Hangul Syllable TEOH"/* D14B */, /*26830*/"Hangul Syllable TE"/* D14C */,/*26831*/"Hangul Syllable TEG"/* D14D */, /*26832*/"Hangul Syllable TEGG"/* D14E */,/*26833*/"Hangul Syllable TEGS"/* D14F */, /*26834*/"Hangul Syllable TEN"/* D150 */,/*26835*/"Hangul Syllable TENJ"/* D151 */, /*26836*/"Hangul Syllable TENH"/* D152 */,/*26837*/"Hangul Syllable TED"/* D153 */, /*26838*/"Hangul Syllable TEL"/* D154 */,/*26839*/"Hangul Syllable TELG"/* D155 */, /*26840*/"Hangul Syllable TELM"/* D156 */,/*26841*/"Hangul Syllable TELB"/* D157 */, /*26842*/"Hangul Syllable TELS"/* D158 */,/*26843*/"Hangul Syllable TELT"/* D159 */, /*26844*/"Hangul Syllable TELP"/* D15A */,/*26845*/"Hangul Syllable TELH"/* D15B */, /*26846*/"Hangul Syllable TEM"/* D15C */,/*26847*/"Hangul Syllable TEB"/* D15D */, /*26848*/"Hangul Syllable TEBS"/* D15E */,/*26849*/"Hangul Syllable TES"/* D15F */, /*26850*/"Hangul Syllable TESS"/* D160 */,/*26851*/"Hangul Syllable TENG"/* D161 */, /*26852*/"Hangul Syllable TEJ"/* D162 */,/*26853*/"Hangul Syllable TEC"/* D163 */, /*26854*/"Hangul Syllable TEK"/* D164 */,/*26855*/"Hangul Syllable TET"/* D165 */, /*26856*/"Hangul Syllable TEP"/* D166 */,/*26857*/"Hangul Syllable TEH"/* D167 */, /*26858*/"Hangul Syllable TYEO"/* D168 */,/*26859*/"Hangul Syllable TYEOG"/* D169 */, /*26860*/"Hangul Syllable TYEOGG"/* D16A */,/*26861*/"Hangul Syllable TYEOGS"/* D16B */, /*26862*/"Hangul Syllable TYEON"/* D16C */,/*26863*/"Hangul Syllable TYEONJ"/* D16D */, /*26864*/"Hangul Syllable TYEONH"/* D16E */,/*26865*/"Hangul Syllable TYEOD"/* D16F */, /*26866*/"Hangul Syllable TYEOL"/* D170 */,/*26867*/"Hangul Syllable TYEOLG"/* D171 */, /*26868*/"Hangul Syllable TYEOLM"/* D172 */,/*26869*/"Hangul Syllable TYEOLB"/* D173 */, /*26870*/"Hangul Syllable TYEOLS"/* D174 */,/*26871*/"Hangul Syllable TYEOLT"/* D175 */, /*26872*/"Hangul Syllable TYEOLP"/* D176 */,/*26873*/"Hangul Syllable TYEOLH"/* D177 */, /*26874*/"Hangul Syllable TYEOM"/* D178 */,/*26875*/"Hangul Syllable TYEOB"/* D179 */, /*26876*/"Hangul Syllable TYEOBS"/* D17A */,/*26877*/"Hangul Syllable TYEOS"/* D17B */, /*26878*/"Hangul Syllable TYEOSS"/* D17C */,/*26879*/"Hangul Syllable TYEONG"/* D17D */, /*26880*/"Hangul Syllable TYEOJ"/* D17E */,/*26881*/"Hangul Syllable TYEOC"/* D17F */, /*26882*/"Hangul Syllable TYEOK"/* D180 */,/*26883*/"Hangul Syllable TYEOT"/* D181 */, /*26884*/"Hangul Syllable TYEOP"/* D182 */,/*26885*/"Hangul Syllable TYEOH"/* D183 */, /*26886*/"Hangul Syllable TYE"/* D184 */,/*26887*/"Hangul Syllable TYEG"/* D185 */, /*26888*/"Hangul Syllable TYEGG"/* D186 */,/*26889*/"Hangul Syllable TYEGS"/* D187 */, /*26890*/"Hangul Syllable TYEN"/* D188 */,/*26891*/"Hangul Syllable TYENJ"/* D189 */, /*26892*/"Hangul Syllable TYENH"/* D18A */,/*26893*/"Hangul Syllable TYED"/* D18B */, /*26894*/"Hangul Syllable TYEL"/* D18C */,/*26895*/"Hangul Syllable TYELG"/* D18D */, /*26896*/"Hangul Syllable TYELM"/* D18E */,/*26897*/"Hangul Syllable TYELB"/* D18F */, /*26898*/"Hangul Syllable TYELS"/* D190 */,/*26899*/"Hangul Syllable TYELT"/* D191 */, /*26900*/"Hangul Syllable TYELP"/* D192 */,/*26901*/"Hangul Syllable TYELH"/* D193 */, /*26902*/"Hangul Syllable TYEM"/* D194 */,/*26903*/"Hangul Syllable TYEB"/* D195 */, /*26904*/"Hangul Syllable TYEBS"/* D196 */,/*26905*/"Hangul Syllable TYES"/* D197 */, /*26906*/"Hangul Syllable TYESS"/* D198 */,/*26907*/"Hangul Syllable TYENG"/* D199 */, /*26908*/"Hangul Syllable TYEJ"/* D19A */,/*26909*/"Hangul Syllable TYEC"/* D19B */, /*26910*/"Hangul Syllable TYEK"/* D19C */,/*26911*/"Hangul Syllable TYET"/* D19D */, /*26912*/"Hangul Syllable TYEP"/* D19E */,/*26913*/"Hangul Syllable TYEH"/* D19F */, /*26914*/"Hangul Syllable TO"/* D1A0 */,/*26915*/"Hangul Syllable TOG"/* D1A1 */, /*26916*/"Hangul Syllable TOGG"/* D1A2 */,/*26917*/"Hangul Syllable TOGS"/* D1A3 */, /*26918*/"Hangul Syllable TON"/* D1A4 */,/*26919*/"Hangul Syllable TONJ"/* D1A5 */, /*26920*/"Hangul Syllable TONH"/* D1A6 */,/*26921*/"Hangul Syllable TOD"/* D1A7 */, /*26922*/"Hangul Syllable TOL"/* D1A8 */,/*26923*/"Hangul Syllable TOLG"/* D1A9 */, /*26924*/"Hangul Syllable TOLM"/* D1AA */,/*26925*/"Hangul Syllable TOLB"/* D1AB */, /*26926*/"Hangul Syllable TOLS"/* D1AC */,/*26927*/"Hangul Syllable TOLT"/* D1AD */, /*26928*/"Hangul Syllable TOLP"/* D1AE */,/*26929*/"Hangul Syllable TOLH"/* D1AF */, /*26930*/"Hangul Syllable TOM"/* D1B0 */,/*26931*/"Hangul Syllable TOB"/* D1B1 */, /*26932*/"Hangul Syllable TOBS"/* D1B2 */,/*26933*/"Hangul Syllable TOS"/* D1B3 */, /*26934*/"Hangul Syllable TOSS"/* D1B4 */,/*26935*/"Hangul Syllable TONG"/* D1B5 */, /*26936*/"Hangul Syllable TOJ"/* D1B6 */,/*26937*/"Hangul Syllable TOC"/* D1B7 */, /*26938*/"Hangul Syllable TOK"/* D1B8 */,/*26939*/"Hangul Syllable TOT"/* D1B9 */, /*26940*/"Hangul Syllable TOP"/* D1BA */,/*26941*/"Hangul Syllable TOH"/* D1BB */, /*26942*/"Hangul Syllable TWA"/* D1BC */,/*26943*/"Hangul Syllable TWAG"/* D1BD */, /*26944*/"Hangul Syllable TWAGG"/* D1BE */,/*26945*/"Hangul Syllable TWAGS"/* D1BF */, /*26946*/"Hangul Syllable TWAN"/* D1C0 */,/*26947*/"Hangul Syllable TWANJ"/* D1C1 */, /*26948*/"Hangul Syllable TWANH"/* D1C2 */,/*26949*/"Hangul Syllable TWAD"/* D1C3 */, /*26950*/"Hangul Syllable TWAL"/* D1C4 */,/*26951*/"Hangul Syllable TWALG"/* D1C5 */, /*26952*/"Hangul Syllable TWALM"/* D1C6 */,/*26953*/"Hangul Syllable TWALB"/* D1C7 */, /*26954*/"Hangul Syllable TWALS"/* D1C8 */,/*26955*/"Hangul Syllable TWALT"/* D1C9 */, /*26956*/"Hangul Syllable TWALP"/* D1CA */,/*26957*/"Hangul Syllable TWALH"/* D1CB */, /*26958*/"Hangul Syllable TWAM"/* D1CC */,/*26959*/"Hangul Syllable TWAB"/* D1CD */, /*26960*/"Hangul Syllable TWABS"/* D1CE */,/*26961*/"Hangul Syllable TWAS"/* D1CF */, /*26962*/"Hangul Syllable TWASS"/* D1D0 */,/*26963*/"Hangul Syllable TWANG"/* D1D1 */, /*26964*/"Hangul Syllable TWAJ"/* D1D2 */,/*26965*/"Hangul Syllable TWAC"/* D1D3 */, /*26966*/"Hangul Syllable TWAK"/* D1D4 */,/*26967*/"Hangul Syllable TWAT"/* D1D5 */, /*26968*/"Hangul Syllable TWAP"/* D1D6 */,/*26969*/"Hangul Syllable TWAH"/* D1D7 */, /*26970*/"Hangul Syllable TWAE"/* D1D8 */,/*26971*/"Hangul Syllable TWAEG"/* D1D9 */, /*26972*/"Hangul Syllable TWAEGG"/* D1DA */,/*26973*/"Hangul Syllable TWAEGS"/* D1DB */, /*26974*/"Hangul Syllable TWAEN"/* D1DC */,/*26975*/"Hangul Syllable TWAENJ"/* D1DD */, /*26976*/"Hangul Syllable TWAENH"/* D1DE */,/*26977*/"Hangul Syllable TWAED"/* D1DF */, /*26978*/"Hangul Syllable TWAEL"/* D1E0 */,/*26979*/"Hangul Syllable TWAELG"/* D1E1 */, /*26980*/"Hangul Syllable TWAELM"/* D1E2 */,/*26981*/"Hangul Syllable TWAELB"/* D1E3 */, /*26982*/"Hangul Syllable TWAELS"/* D1E4 */,/*26983*/"Hangul Syllable TWAELT"/* D1E5 */, /*26984*/"Hangul Syllable TWAELP"/* D1E6 */,/*26985*/"Hangul Syllable TWAELH"/* D1E7 */, /*26986*/"Hangul Syllable TWAEM"/* D1E8 */,/*26987*/"Hangul Syllable TWAEB"/* D1E9 */, /*26988*/"Hangul Syllable TWAEBS"/* D1EA */,/*26989*/"Hangul Syllable TWAES"/* D1EB */, /*26990*/"Hangul Syllable TWAESS"/* D1EC */,/*26991*/"Hangul Syllable TWAENG"/* D1ED */, /*26992*/"Hangul Syllable TWAEJ"/* D1EE */,/*26993*/"Hangul Syllable TWAEC"/* D1EF */, /*26994*/"Hangul Syllable TWAEK"/* D1F0 */,/*26995*/"Hangul Syllable TWAET"/* D1F1 */, /*26996*/"Hangul Syllable TWAEP"/* D1F2 */,/*26997*/"Hangul Syllable TWAEH"/* D1F3 */, /*26998*/"Hangul Syllable TOE"/* D1F4 */,/*26999*/"Hangul Syllable TOEG"/* D1F5 */, /*27000*/"Hangul Syllable TOEGG"/* D1F6 */,/*27001*/"Hangul Syllable TOEGS"/* D1F7 */, /*27002*/"Hangul Syllable TOEN"/* D1F8 */,/*27003*/"Hangul Syllable TOENJ"/* D1F9 */, /*27004*/"Hangul Syllable TOENH"/* D1FA */,/*27005*/"Hangul Syllable TOED"/* D1FB */, /*27006*/"Hangul Syllable TOEL"/* D1FC */,/*27007*/"Hangul Syllable TOELG"/* D1FD */, /*27008*/"Hangul Syllable TOELM"/* D1FE */,/*27009*/"Hangul Syllable TOELB"/* D1FF */, /*27010*/"Hangul Syllable TOELS"/* D200 */,/*27011*/"Hangul Syllable TOELT"/* D201 */, /*27012*/"Hangul Syllable TOELP"/* D202 */,/*27013*/"Hangul Syllable TOELH"/* D203 */, /*27014*/"Hangul Syllable TOEM"/* D204 */,/*27015*/"Hangul Syllable TOEB"/* D205 */, /*27016*/"Hangul Syllable TOEBS"/* D206 */,/*27017*/"Hangul Syllable TOES"/* D207 */, /*27018*/"Hangul Syllable TOESS"/* D208 */,/*27019*/"Hangul Syllable TOENG"/* D209 */, /*27020*/"Hangul Syllable TOEJ"/* D20A */,/*27021*/"Hangul Syllable TOEC"/* D20B */, /*27022*/"Hangul Syllable TOEK"/* D20C */,/*27023*/"Hangul Syllable TOET"/* D20D */, /*27024*/"Hangul Syllable TOEP"/* D20E */,/*27025*/"Hangul Syllable TOEH"/* D20F */, /*27026*/"Hangul Syllable TYO"/* D210 */,/*27027*/"Hangul Syllable TYOG"/* D211 */, /*27028*/"Hangul Syllable TYOGG"/* D212 */,/*27029*/"Hangul Syllable TYOGS"/* D213 */, /*27030*/"Hangul Syllable TYON"/* D214 */,/*27031*/"Hangul Syllable TYONJ"/* D215 */, /*27032*/"Hangul Syllable TYONH"/* D216 */,/*27033*/"Hangul Syllable TYOD"/* D217 */, /*27034*/"Hangul Syllable TYOL"/* D218 */,/*27035*/"Hangul Syllable TYOLG"/* D219 */, /*27036*/"Hangul Syllable TYOLM"/* D21A */,/*27037*/"Hangul Syllable TYOLB"/* D21B */, /*27038*/"Hangul Syllable TYOLS"/* D21C */,/*27039*/"Hangul Syllable TYOLT"/* D21D */, /*27040*/"Hangul Syllable TYOLP"/* D21E */,/*27041*/"Hangul Syllable TYOLH"/* D21F */, /*27042*/"Hangul Syllable TYOM"/* D220 */,/*27043*/"Hangul Syllable TYOB"/* D221 */, /*27044*/"Hangul Syllable TYOBS"/* D222 */,/*27045*/"Hangul Syllable TYOS"/* D223 */, /*27046*/"Hangul Syllable TYOSS"/* D224 */,/*27047*/"Hangul Syllable TYONG"/* D225 */, /*27048*/"Hangul Syllable TYOJ"/* D226 */,/*27049*/"Hangul Syllable TYOC"/* D227 */, /*27050*/"Hangul Syllable TYOK"/* D228 */,/*27051*/"Hangul Syllable TYOT"/* D229 */, /*27052*/"Hangul Syllable TYOP"/* D22A */,/*27053*/"Hangul Syllable TYOH"/* D22B */, /*27054*/"Hangul Syllable TU"/* D22C */,/*27055*/"Hangul Syllable TUG"/* D22D */, /*27056*/"Hangul Syllable TUGG"/* D22E */,/*27057*/"Hangul Syllable TUGS"/* D22F */, /*27058*/"Hangul Syllable TUN"/* D230 */,/*27059*/"Hangul Syllable TUNJ"/* D231 */, /*27060*/"Hangul Syllable TUNH"/* D232 */,/*27061*/"Hangul Syllable TUD"/* D233 */, /*27062*/"Hangul Syllable TUL"/* D234 */,/*27063*/"Hangul Syllable TULG"/* D235 */, /*27064*/"Hangul Syllable TULM"/* D236 */,/*27065*/"Hangul Syllable TULB"/* D237 */, /*27066*/"Hangul Syllable TULS"/* D238 */,/*27067*/"Hangul Syllable TULT"/* D239 */, /*27068*/"Hangul Syllable TULP"/* D23A */,/*27069*/"Hangul Syllable TULH"/* D23B */, /*27070*/"Hangul Syllable TUM"/* D23C */,/*27071*/"Hangul Syllable TUB"/* D23D */, /*27072*/"Hangul Syllable TUBS"/* D23E */,/*27073*/"Hangul Syllable TUS"/* D23F */, /*27074*/"Hangul Syllable TUSS"/* D240 */,/*27075*/"Hangul Syllable TUNG"/* D241 */, /*27076*/"Hangul Syllable TUJ"/* D242 */,/*27077*/"Hangul Syllable TUC"/* D243 */, /*27078*/"Hangul Syllable TUK"/* D244 */,/*27079*/"Hangul Syllable TUT"/* D245 */, /*27080*/"Hangul Syllable TUP"/* D246 */,/*27081*/"Hangul Syllable TUH"/* D247 */, /*27082*/"Hangul Syllable TWEO"/* D248 */,/*27083*/"Hangul Syllable TWEOG"/* D249 */, /*27084*/"Hangul Syllable TWEOGG"/* D24A */,/*27085*/"Hangul Syllable TWEOGS"/* D24B */, /*27086*/"Hangul Syllable TWEON"/* D24C */,/*27087*/"Hangul Syllable TWEONJ"/* D24D */, /*27088*/"Hangul Syllable TWEONH"/* D24E */,/*27089*/"Hangul Syllable TWEOD"/* D24F */, /*27090*/"Hangul Syllable TWEOL"/* D250 */,/*27091*/"Hangul Syllable TWEOLG"/* D251 */, /*27092*/"Hangul Syllable TWEOLM"/* D252 */,/*27093*/"Hangul Syllable TWEOLB"/* D253 */, /*27094*/"Hangul Syllable TWEOLS"/* D254 */,/*27095*/"Hangul Syllable TWEOLT"/* D255 */, /*27096*/"Hangul Syllable TWEOLP"/* D256 */,/*27097*/"Hangul Syllable TWEOLH"/* D257 */, /*27098*/"Hangul Syllable TWEOM"/* D258 */,/*27099*/"Hangul Syllable TWEOB"/* D259 */, /*27100*/"Hangul Syllable TWEOBS"/* D25A */,/*27101*/"Hangul Syllable TWEOS"/* D25B */, /*27102*/"Hangul Syllable TWEOSS"/* D25C */,/*27103*/"Hangul Syllable TWEONG"/* D25D */, /*27104*/"Hangul Syllable TWEOJ"/* D25E */,/*27105*/"Hangul Syllable TWEOC"/* D25F */, /*27106*/"Hangul Syllable TWEOK"/* D260 */,/*27107*/"Hangul Syllable TWEOT"/* D261 */, /*27108*/"Hangul Syllable TWEOP"/* D262 */,/*27109*/"Hangul Syllable TWEOH"/* D263 */, /*27110*/"Hangul Syllable TWE"/* D264 */,/*27111*/"Hangul Syllable TWEG"/* D265 */, /*27112*/"Hangul Syllable TWEGG"/* D266 */,/*27113*/"Hangul Syllable TWEGS"/* D267 */, /*27114*/"Hangul Syllable TWEN"/* D268 */,/*27115*/"Hangul Syllable TWENJ"/* D269 */, /*27116*/"Hangul Syllable TWENH"/* D26A */,/*27117*/"Hangul Syllable TWED"/* D26B */, /*27118*/"Hangul Syllable TWEL"/* D26C */,/*27119*/"Hangul Syllable TWELG"/* D26D */, /*27120*/"Hangul Syllable TWELM"/* D26E */,/*27121*/"Hangul Syllable TWELB"/* D26F */, /*27122*/"Hangul Syllable TWELS"/* D270 */,/*27123*/"Hangul Syllable TWELT"/* D271 */, /*27124*/"Hangul Syllable TWELP"/* D272 */,/*27125*/"Hangul Syllable TWELH"/* D273 */, /*27126*/"Hangul Syllable TWEM"/* D274 */,/*27127*/"Hangul Syllable TWEB"/* D275 */, /*27128*/"Hangul Syllable TWEBS"/* D276 */,/*27129*/"Hangul Syllable TWES"/* D277 */, /*27130*/"Hangul Syllable TWESS"/* D278 */,/*27131*/"Hangul Syllable TWENG"/* D279 */, /*27132*/"Hangul Syllable TWEJ"/* D27A */,/*27133*/"Hangul Syllable TWEC"/* D27B */, /*27134*/"Hangul Syllable TWEK"/* D27C */,/*27135*/"Hangul Syllable TWET"/* D27D */, /*27136*/"Hangul Syllable TWEP"/* D27E */,/*27137*/"Hangul Syllable TWEH"/* D27F */, /*27138*/"Hangul Syllable TWI"/* D280 */,/*27139*/"Hangul Syllable TWIG"/* D281 */, /*27140*/"Hangul Syllable TWIGG"/* D282 */,/*27141*/"Hangul Syllable TWIGS"/* D283 */, /*27142*/"Hangul Syllable TWIN"/* D284 */,/*27143*/"Hangul Syllable TWINJ"/* D285 */, /*27144*/"Hangul Syllable TWINH"/* D286 */,/*27145*/"Hangul Syllable TWID"/* D287 */, /*27146*/"Hangul Syllable TWIL"/* D288 */,/*27147*/"Hangul Syllable TWILG"/* D289 */, /*27148*/"Hangul Syllable TWILM"/* D28A */,/*27149*/"Hangul Syllable TWILB"/* D28B */, /*27150*/"Hangul Syllable TWILS"/* D28C */,/*27151*/"Hangul Syllable TWILT"/* D28D */, /*27152*/"Hangul Syllable TWILP"/* D28E */,/*27153*/"Hangul Syllable TWILH"/* D28F */, /*27154*/"Hangul Syllable TWIM"/* D290 */,/*27155*/"Hangul Syllable TWIB"/* D291 */, /*27156*/"Hangul Syllable TWIBS"/* D292 */,/*27157*/"Hangul Syllable TWIS"/* D293 */, /*27158*/"Hangul Syllable TWISS"/* D294 */,/*27159*/"Hangul Syllable TWING"/* D295 */, /*27160*/"Hangul Syllable TWIJ"/* D296 */,/*27161*/"Hangul Syllable TWIC"/* D297 */, /*27162*/"Hangul Syllable TWIK"/* D298 */,/*27163*/"Hangul Syllable TWIT"/* D299 */, /*27164*/"Hangul Syllable TWIP"/* D29A */,/*27165*/"Hangul Syllable TWIH"/* D29B */, /*27166*/"Hangul Syllable TYU"/* D29C */,/*27167*/"Hangul Syllable TYUG"/* D29D */, /*27168*/"Hangul Syllable TYUGG"/* D29E */,/*27169*/"Hangul Syllable TYUGS"/* D29F */, /*27170*/"Hangul Syllable TYUN"/* D2A0 */,/*27171*/"Hangul Syllable TYUNJ"/* D2A1 */, /*27172*/"Hangul Syllable TYUNH"/* D2A2 */,/*27173*/"Hangul Syllable TYUD"/* D2A3 */, /*27174*/"Hangul Syllable TYUL"/* D2A4 */,/*27175*/"Hangul Syllable TYULG"/* D2A5 */, /*27176*/"Hangul Syllable TYULM"/* D2A6 */,/*27177*/"Hangul Syllable TYULB"/* D2A7 */, /*27178*/"Hangul Syllable TYULS"/* D2A8 */,/*27179*/"Hangul Syllable TYULT"/* D2A9 */, /*27180*/"Hangul Syllable TYULP"/* D2AA */,/*27181*/"Hangul Syllable TYULH"/* D2AB */, /*27182*/"Hangul Syllable TYUM"/* D2AC */,/*27183*/"Hangul Syllable TYUB"/* D2AD */, /*27184*/"Hangul Syllable TYUBS"/* D2AE */,/*27185*/"Hangul Syllable TYUS"/* D2AF */, /*27186*/"Hangul Syllable TYUSS"/* D2B0 */,/*27187*/"Hangul Syllable TYUNG"/* D2B1 */, /*27188*/"Hangul Syllable TYUJ"/* D2B2 */,/*27189*/"Hangul Syllable TYUC"/* D2B3 */, /*27190*/"Hangul Syllable TYUK"/* D2B4 */,/*27191*/"Hangul Syllable TYUT"/* D2B5 */, /*27192*/"Hangul Syllable TYUP"/* D2B6 */,/*27193*/"Hangul Syllable TYUH"/* D2B7 */, /*27194*/"Hangul Syllable TEU"/* D2B8 */,/*27195*/"Hangul Syllable TEUG"/* D2B9 */, /*27196*/"Hangul Syllable TEUGG"/* D2BA */,/*27197*/"Hangul Syllable TEUGS"/* D2BB */, /*27198*/"Hangul Syllable TEUN"/* D2BC */,/*27199*/"Hangul Syllable TEUNJ"/* D2BD */, /*27200*/"Hangul Syllable TEUNH"/* D2BE */,/*27201*/"Hangul Syllable TEUD"/* D2BF */, /*27202*/"Hangul Syllable TEUL"/* D2C0 */,/*27203*/"Hangul Syllable TEULG"/* D2C1 */, /*27204*/"Hangul Syllable TEULM"/* D2C2 */,/*27205*/"Hangul Syllable TEULB"/* D2C3 */, /*27206*/"Hangul Syllable TEULS"/* D2C4 */,/*27207*/"Hangul Syllable TEULT"/* D2C5 */, /*27208*/"Hangul Syllable TEULP"/* D2C6 */,/*27209*/"Hangul Syllable TEULH"/* D2C7 */, /*27210*/"Hangul Syllable TEUM"/* D2C8 */,/*27211*/"Hangul Syllable TEUB"/* D2C9 */, /*27212*/"Hangul Syllable TEUBS"/* D2CA */,/*27213*/"Hangul Syllable TEUS"/* D2CB */, /*27214*/"Hangul Syllable TEUSS"/* D2CC */,/*27215*/"Hangul Syllable TEUNG"/* D2CD */, /*27216*/"Hangul Syllable TEUJ"/* D2CE */,/*27217*/"Hangul Syllable TEUC"/* D2CF */, /*27218*/"Hangul Syllable TEUK"/* D2D0 */,/*27219*/"Hangul Syllable TEUT"/* D2D1 */, /*27220*/"Hangul Syllable TEUP"/* D2D2 */,/*27221*/"Hangul Syllable TEUH"/* D2D3 */, /*27222*/"Hangul Syllable TYI"/* D2D4 */,/*27223*/"Hangul Syllable TYIG"/* D2D5 */, /*27224*/"Hangul Syllable TYIGG"/* D2D6 */,/*27225*/"Hangul Syllable TYIGS"/* D2D7 */, /*27226*/"Hangul Syllable TYIN"/* D2D8 */,/*27227*/"Hangul Syllable TYINJ"/* D2D9 */, /*27228*/"Hangul Syllable TYINH"/* D2DA */,/*27229*/"Hangul Syllable TYID"/* D2DB */, /*27230*/"Hangul Syllable TYIL"/* D2DC */,/*27231*/"Hangul Syllable TYILG"/* D2DD */, /*27232*/"Hangul Syllable TYILM"/* D2DE */,/*27233*/"Hangul Syllable TYILB"/* D2DF */, /*27234*/"Hangul Syllable TYILS"/* D2E0 */,/*27235*/"Hangul Syllable TYILT"/* D2E1 */, /*27236*/"Hangul Syllable TYILP"/* D2E2 */,/*27237*/"Hangul Syllable TYILH"/* D2E3 */, /*27238*/"Hangul Syllable TYIM"/* D2E4 */,/*27239*/"Hangul Syllable TYIB"/* D2E5 */, /*27240*/"Hangul Syllable TYIBS"/* D2E6 */,/*27241*/"Hangul Syllable TYIS"/* D2E7 */, /*27242*/"Hangul Syllable TYISS"/* D2E8 */,/*27243*/"Hangul Syllable TYING"/* D2E9 */, /*27244*/"Hangul Syllable TYIJ"/* D2EA */,/*27245*/"Hangul Syllable TYIC"/* D2EB */, /*27246*/"Hangul Syllable TYIK"/* D2EC */,/*27247*/"Hangul Syllable TYIT"/* D2ED */, /*27248*/"Hangul Syllable TYIP"/* D2EE */,/*27249*/"Hangul Syllable TYIH"/* D2EF */, /*27250*/"Hangul Syllable TI"/* D2F0 */,/*27251*/"Hangul Syllable TIG"/* D2F1 */, /*27252*/"Hangul Syllable TIGG"/* D2F2 */,/*27253*/"Hangul Syllable TIGS"/* D2F3 */, /*27254*/"Hangul Syllable TIN"/* D2F4 */,/*27255*/"Hangul Syllable TINJ"/* D2F5 */, /*27256*/"Hangul Syllable TINH"/* D2F6 */,/*27257*/"Hangul Syllable TID"/* D2F7 */, /*27258*/"Hangul Syllable TIL"/* D2F8 */,/*27259*/"Hangul Syllable TILG"/* D2F9 */, /*27260*/"Hangul Syllable TILM"/* D2FA */,/*27261*/"Hangul Syllable TILB"/* D2FB */, /*27262*/"Hangul Syllable TILS"/* D2FC */,/*27263*/"Hangul Syllable TILT"/* D2FD */, /*27264*/"Hangul Syllable TILP"/* D2FE */,/*27265*/"Hangul Syllable TILH"/* D2FF */, /*27266*/"Hangul Syllable TIM"/* D300 */,/*27267*/"Hangul Syllable TIB"/* D301 */, /*27268*/"Hangul Syllable TIBS"/* D302 */,/*27269*/"Hangul Syllable TIS"/* D303 */, /*27270*/"Hangul Syllable TISS"/* D304 */,/*27271*/"Hangul Syllable TING"/* D305 */, /*27272*/"Hangul Syllable TIJ"/* D306 */,/*27273*/"Hangul Syllable TIC"/* D307 */, /*27274*/"Hangul Syllable TIK"/* D308 */,/*27275*/"Hangul Syllable TIT"/* D309 */, /*27276*/"Hangul Syllable TIP"/* D30A */,/*27277*/"Hangul Syllable TIH"/* D30B */, /*27278*/"Hangul Syllable PA"/* D30C */,/*27279*/"Hangul Syllable PAG"/* D30D */, /*27280*/"Hangul Syllable PAGG"/* D30E */,/*27281*/"Hangul Syllable PAGS"/* D30F */, /*27282*/"Hangul Syllable PAN"/* D310 */,/*27283*/"Hangul Syllable PANJ"/* D311 */, /*27284*/"Hangul Syllable PANH"/* D312 */,/*27285*/"Hangul Syllable PAD"/* D313 */, /*27286*/"Hangul Syllable PAL"/* D314 */,/*27287*/"Hangul Syllable PALG"/* D315 */, /*27288*/"Hangul Syllable PALM"/* D316 */,/*27289*/"Hangul Syllable PALB"/* D317 */, /*27290*/"Hangul Syllable PALS"/* D318 */,/*27291*/"Hangul Syllable PALT"/* D319 */, /*27292*/"Hangul Syllable PALP"/* D31A */,/*27293*/"Hangul Syllable PALH"/* D31B */, /*27294*/"Hangul Syllable PAM"/* D31C */,/*27295*/"Hangul Syllable PAB"/* D31D */, /*27296*/"Hangul Syllable PABS"/* D31E */,/*27297*/"Hangul Syllable PAS"/* D31F */, /*27298*/"Hangul Syllable PASS"/* D320 */,/*27299*/"Hangul Syllable PANG"/* D321 */, /*27300*/"Hangul Syllable PAJ"/* D322 */,/*27301*/"Hangul Syllable PAC"/* D323 */, /*27302*/"Hangul Syllable PAK"/* D324 */,/*27303*/"Hangul Syllable PAT"/* D325 */, /*27304*/"Hangul Syllable PAP"/* D326 */,/*27305*/"Hangul Syllable PAH"/* D327 */, /*27306*/"Hangul Syllable PAE"/* D328 */,/*27307*/"Hangul Syllable PAEG"/* D329 */, /*27308*/"Hangul Syllable PAEGG"/* D32A */,/*27309*/"Hangul Syllable PAEGS"/* D32B */, /*27310*/"Hangul Syllable PAEN"/* D32C */,/*27311*/"Hangul Syllable PAENJ"/* D32D */, /*27312*/"Hangul Syllable PAENH"/* D32E */,/*27313*/"Hangul Syllable PAED"/* D32F */, /*27314*/"Hangul Syllable PAEL"/* D330 */,/*27315*/"Hangul Syllable PAELG"/* D331 */, /*27316*/"Hangul Syllable PAELM"/* D332 */,/*27317*/"Hangul Syllable PAELB"/* D333 */, /*27318*/"Hangul Syllable PAELS"/* D334 */,/*27319*/"Hangul Syllable PAELT"/* D335 */, /*27320*/"Hangul Syllable PAELP"/* D336 */,/*27321*/"Hangul Syllable PAELH"/* D337 */, /*27322*/"Hangul Syllable PAEM"/* D338 */,/*27323*/"Hangul Syllable PAEB"/* D339 */, /*27324*/"Hangul Syllable PAEBS"/* D33A */,/*27325*/"Hangul Syllable PAES"/* D33B */, /*27326*/"Hangul Syllable PAESS"/* D33C */,/*27327*/"Hangul Syllable PAENG"/* D33D */, /*27328*/"Hangul Syllable PAEJ"/* D33E */,/*27329*/"Hangul Syllable PAEC"/* D33F */, /*27330*/"Hangul Syllable PAEK"/* D340 */,/*27331*/"Hangul Syllable PAET"/* D341 */, /*27332*/"Hangul Syllable PAEP"/* D342 */,/*27333*/"Hangul Syllable PAEH"/* D343 */, /*27334*/"Hangul Syllable PYA"/* D344 */,/*27335*/"Hangul Syllable PYAG"/* D345 */, /*27336*/"Hangul Syllable PYAGG"/* D346 */,/*27337*/"Hangul Syllable PYAGS"/* D347 */, /*27338*/"Hangul Syllable PYAN"/* D348 */,/*27339*/"Hangul Syllable PYANJ"/* D349 */, /*27340*/"Hangul Syllable PYANH"/* D34A */,/*27341*/"Hangul Syllable PYAD"/* D34B */, /*27342*/"Hangul Syllable PYAL"/* D34C */,/*27343*/"Hangul Syllable PYALG"/* D34D */, /*27344*/"Hangul Syllable PYALM"/* D34E */,/*27345*/"Hangul Syllable PYALB"/* D34F */, /*27346*/"Hangul Syllable PYALS"/* D350 */,/*27347*/"Hangul Syllable PYALT"/* D351 */, /*27348*/"Hangul Syllable PYALP"/* D352 */,/*27349*/"Hangul Syllable PYALH"/* D353 */, /*27350*/"Hangul Syllable PYAM"/* D354 */,/*27351*/"Hangul Syllable PYAB"/* D355 */, /*27352*/"Hangul Syllable PYABS"/* D356 */,/*27353*/"Hangul Syllable PYAS"/* D357 */, /*27354*/"Hangul Syllable PYASS"/* D358 */,/*27355*/"Hangul Syllable PYANG"/* D359 */, /*27356*/"Hangul Syllable PYAJ"/* D35A */,/*27357*/"Hangul Syllable PYAC"/* D35B */, /*27358*/"Hangul Syllable PYAK"/* D35C */,/*27359*/"Hangul Syllable PYAT"/* D35D */, /*27360*/"Hangul Syllable PYAP"/* D35E */,/*27361*/"Hangul Syllable PYAH"/* D35F */, /*27362*/"Hangul Syllable PYAE"/* D360 */,/*27363*/"Hangul Syllable PYAEG"/* D361 */, /*27364*/"Hangul Syllable PYAEGG"/* D362 */,/*27365*/"Hangul Syllable PYAEGS"/* D363 */, /*27366*/"Hangul Syllable PYAEN"/* D364 */,/*27367*/"Hangul Syllable PYAENJ"/* D365 */, /*27368*/"Hangul Syllable PYAENH"/* D366 */,/*27369*/"Hangul Syllable PYAED"/* D367 */, /*27370*/"Hangul Syllable PYAEL"/* D368 */,/*27371*/"Hangul Syllable PYAELG"/* D369 */, /*27372*/"Hangul Syllable PYAELM"/* D36A */,/*27373*/"Hangul Syllable PYAELB"/* D36B */, /*27374*/"Hangul Syllable PYAELS"/* D36C */,/*27375*/"Hangul Syllable PYAELT"/* D36D */, /*27376*/"Hangul Syllable PYAELP"/* D36E */,/*27377*/"Hangul Syllable PYAELH"/* D36F */, /*27378*/"Hangul Syllable PYAEM"/* D370 */,/*27379*/"Hangul Syllable PYAEB"/* D371 */, /*27380*/"Hangul Syllable PYAEBS"/* D372 */,/*27381*/"Hangul Syllable PYAES"/* D373 */, /*27382*/"Hangul Syllable PYAESS"/* D374 */,/*27383*/"Hangul Syllable PYAENG"/* D375 */, /*27384*/"Hangul Syllable PYAEJ"/* D376 */,/*27385*/"Hangul Syllable PYAEC"/* D377 */, /*27386*/"Hangul Syllable PYAEK"/* D378 */,/*27387*/"Hangul Syllable PYAET"/* D379 */, /*27388*/"Hangul Syllable PYAEP"/* D37A */,/*27389*/"Hangul Syllable PYAEH"/* D37B */, /*27390*/"Hangul Syllable PEO"/* D37C */,/*27391*/"Hangul Syllable PEOG"/* D37D */, /*27392*/"Hangul Syllable PEOGG"/* D37E */,/*27393*/"Hangul Syllable PEOGS"/* D37F */, /*27394*/"Hangul Syllable PEON"/* D380 */,/*27395*/"Hangul Syllable PEONJ"/* D381 */, /*27396*/"Hangul Syllable PEONH"/* D382 */,/*27397*/"Hangul Syllable PEOD"/* D383 */, /*27398*/"Hangul Syllable PEOL"/* D384 */,/*27399*/"Hangul Syllable PEOLG"/* D385 */, /*27400*/"Hangul Syllable PEOLM"/* D386 */,/*27401*/"Hangul Syllable PEOLB"/* D387 */, /*27402*/"Hangul Syllable PEOLS"/* D388 */,/*27403*/"Hangul Syllable PEOLT"/* D389 */, /*27404*/"Hangul Syllable PEOLP"/* D38A */,/*27405*/"Hangul Syllable PEOLH"/* D38B */, /*27406*/"Hangul Syllable PEOM"/* D38C */,/*27407*/"Hangul Syllable PEOB"/* D38D */, /*27408*/"Hangul Syllable PEOBS"/* D38E */,/*27409*/"Hangul Syllable PEOS"/* D38F */, /*27410*/"Hangul Syllable PEOSS"/* D390 */,/*27411*/"Hangul Syllable PEONG"/* D391 */, /*27412*/"Hangul Syllable PEOJ"/* D392 */,/*27413*/"Hangul Syllable PEOC"/* D393 */, /*27414*/"Hangul Syllable PEOK"/* D394 */,/*27415*/"Hangul Syllable PEOT"/* D395 */, /*27416*/"Hangul Syllable PEOP"/* D396 */,/*27417*/"Hangul Syllable PEOH"/* D397 */, /*27418*/"Hangul Syllable PE"/* D398 */,/*27419*/"Hangul Syllable PEG"/* D399 */, /*27420*/"Hangul Syllable PEGG"/* D39A */,/*27421*/"Hangul Syllable PEGS"/* D39B */, /*27422*/"Hangul Syllable PEN"/* D39C */,/*27423*/"Hangul Syllable PENJ"/* D39D */, /*27424*/"Hangul Syllable PENH"/* D39E */,/*27425*/"Hangul Syllable PED"/* D39F */, /*27426*/"Hangul Syllable PEL"/* D3A0 */,/*27427*/"Hangul Syllable PELG"/* D3A1 */, /*27428*/"Hangul Syllable PELM"/* D3A2 */,/*27429*/"Hangul Syllable PELB"/* D3A3 */, /*27430*/"Hangul Syllable PELS"/* D3A4 */,/*27431*/"Hangul Syllable PELT"/* D3A5 */, /*27432*/"Hangul Syllable PELP"/* D3A6 */,/*27433*/"Hangul Syllable PELH"/* D3A7 */, /*27434*/"Hangul Syllable PEM"/* D3A8 */,/*27435*/"Hangul Syllable PEB"/* D3A9 */, /*27436*/"Hangul Syllable PEBS"/* D3AA */,/*27437*/"Hangul Syllable PES"/* D3AB */, /*27438*/"Hangul Syllable PESS"/* D3AC */,/*27439*/"Hangul Syllable PENG"/* D3AD */, /*27440*/"Hangul Syllable PEJ"/* D3AE */,/*27441*/"Hangul Syllable PEC"/* D3AF */, /*27442*/"Hangul Syllable PEK"/* D3B0 */,/*27443*/"Hangul Syllable PET"/* D3B1 */, /*27444*/"Hangul Syllable PEP"/* D3B2 */,/*27445*/"Hangul Syllable PEH"/* D3B3 */, /*27446*/"Hangul Syllable PYEO"/* D3B4 */,/*27447*/"Hangul Syllable PYEOG"/* D3B5 */, /*27448*/"Hangul Syllable PYEOGG"/* D3B6 */,/*27449*/"Hangul Syllable PYEOGS"/* D3B7 */, /*27450*/"Hangul Syllable PYEON"/* D3B8 */,/*27451*/"Hangul Syllable PYEONJ"/* D3B9 */, /*27452*/"Hangul Syllable PYEONH"/* D3BA */,/*27453*/"Hangul Syllable PYEOD"/* D3BB */, /*27454*/"Hangul Syllable PYEOL"/* D3BC */,/*27455*/"Hangul Syllable PYEOLG"/* D3BD */, /*27456*/"Hangul Syllable PYEOLM"/* D3BE */,/*27457*/"Hangul Syllable PYEOLB"/* D3BF */, /*27458*/"Hangul Syllable PYEOLS"/* D3C0 */,/*27459*/"Hangul Syllable PYEOLT"/* D3C1 */, /*27460*/"Hangul Syllable PYEOLP"/* D3C2 */,/*27461*/"Hangul Syllable PYEOLH"/* D3C3 */, /*27462*/"Hangul Syllable PYEOM"/* D3C4 */,/*27463*/"Hangul Syllable PYEOB"/* D3C5 */, /*27464*/"Hangul Syllable PYEOBS"/* D3C6 */,/*27465*/"Hangul Syllable PYEOS"/* D3C7 */, /*27466*/"Hangul Syllable PYEOSS"/* D3C8 */,/*27467*/"Hangul Syllable PYEONG"/* D3C9 */, /*27468*/"Hangul Syllable PYEOJ"/* D3CA */,/*27469*/"Hangul Syllable PYEOC"/* D3CB */, /*27470*/"Hangul Syllable PYEOK"/* D3CC */,/*27471*/"Hangul Syllable PYEOT"/* D3CD */, /*27472*/"Hangul Syllable PYEOP"/* D3CE */,/*27473*/"Hangul Syllable PYEOH"/* D3CF */, /*27474*/"Hangul Syllable PYE"/* D3D0 */,/*27475*/"Hangul Syllable PYEG"/* D3D1 */, /*27476*/"Hangul Syllable PYEGG"/* D3D2 */,/*27477*/"Hangul Syllable PYEGS"/* D3D3 */, /*27478*/"Hangul Syllable PYEN"/* D3D4 */,/*27479*/"Hangul Syllable PYENJ"/* D3D5 */, /*27480*/"Hangul Syllable PYENH"/* D3D6 */,/*27481*/"Hangul Syllable PYED"/* D3D7 */, /*27482*/"Hangul Syllable PYEL"/* D3D8 */,/*27483*/"Hangul Syllable PYELG"/* D3D9 */, /*27484*/"Hangul Syllable PYELM"/* D3DA */,/*27485*/"Hangul Syllable PYELB"/* D3DB */, /*27486*/"Hangul Syllable PYELS"/* D3DC */,/*27487*/"Hangul Syllable PYELT"/* D3DD */, /*27488*/"Hangul Syllable PYELP"/* D3DE */,/*27489*/"Hangul Syllable PYELH"/* D3DF */, /*27490*/"Hangul Syllable PYEM"/* D3E0 */,/*27491*/"Hangul Syllable PYEB"/* D3E1 */, /*27492*/"Hangul Syllable PYEBS"/* D3E2 */,/*27493*/"Hangul Syllable PYES"/* D3E3 */, /*27494*/"Hangul Syllable PYESS"/* D3E4 */,/*27495*/"Hangul Syllable PYENG"/* D3E5 */, /*27496*/"Hangul Syllable PYEJ"/* D3E6 */,/*27497*/"Hangul Syllable PYEC"/* D3E7 */, /*27498*/"Hangul Syllable PYEK"/* D3E8 */,/*27499*/"Hangul Syllable PYET"/* D3E9 */, /*27500*/"Hangul Syllable PYEP"/* D3EA */,/*27501*/"Hangul Syllable PYEH"/* D3EB */, /*27502*/"Hangul Syllable PO"/* D3EC */,/*27503*/"Hangul Syllable POG"/* D3ED */, /*27504*/"Hangul Syllable POGG"/* D3EE */,/*27505*/"Hangul Syllable POGS"/* D3EF */, /*27506*/"Hangul Syllable PON"/* D3F0 */,/*27507*/"Hangul Syllable PONJ"/* D3F1 */, /*27508*/"Hangul Syllable PONH"/* D3F2 */,/*27509*/"Hangul Syllable POD"/* D3F3 */, /*27510*/"Hangul Syllable POL"/* D3F4 */,/*27511*/"Hangul Syllable POLG"/* D3F5 */, /*27512*/"Hangul Syllable POLM"/* D3F6 */,/*27513*/"Hangul Syllable POLB"/* D3F7 */, /*27514*/"Hangul Syllable POLS"/* D3F8 */,/*27515*/"Hangul Syllable POLT"/* D3F9 */, /*27516*/"Hangul Syllable POLP"/* D3FA */,/*27517*/"Hangul Syllable POLH"/* D3FB */, /*27518*/"Hangul Syllable POM"/* D3FC */,/*27519*/"Hangul Syllable POB"/* D3FD */, /*27520*/"Hangul Syllable POBS"/* D3FE */,/*27521*/"Hangul Syllable POS"/* D3FF */, /*27522*/"Hangul Syllable POSS"/* D400 */,/*27523*/"Hangul Syllable PONG"/* D401 */, /*27524*/"Hangul Syllable POJ"/* D402 */,/*27525*/"Hangul Syllable POC"/* D403 */, /*27526*/"Hangul Syllable POK"/* D404 */,/*27527*/"Hangul Syllable POT"/* D405 */, /*27528*/"Hangul Syllable POP"/* D406 */,/*27529*/"Hangul Syllable POH"/* D407 */, /*27530*/"Hangul Syllable PWA"/* D408 */,/*27531*/"Hangul Syllable PWAG"/* D409 */, /*27532*/"Hangul Syllable PWAGG"/* D40A */,/*27533*/"Hangul Syllable PWAGS"/* D40B */, /*27534*/"Hangul Syllable PWAN"/* D40C */,/*27535*/"Hangul Syllable PWANJ"/* D40D */, /*27536*/"Hangul Syllable PWANH"/* D40E */,/*27537*/"Hangul Syllable PWAD"/* D40F */, /*27538*/"Hangul Syllable PWAL"/* D410 */,/*27539*/"Hangul Syllable PWALG"/* D411 */, /*27540*/"Hangul Syllable PWALM"/* D412 */,/*27541*/"Hangul Syllable PWALB"/* D413 */, /*27542*/"Hangul Syllable PWALS"/* D414 */,/*27543*/"Hangul Syllable PWALT"/* D415 */, /*27544*/"Hangul Syllable PWALP"/* D416 */,/*27545*/"Hangul Syllable PWALH"/* D417 */, /*27546*/"Hangul Syllable PWAM"/* D418 */,/*27547*/"Hangul Syllable PWAB"/* D419 */, /*27548*/"Hangul Syllable PWABS"/* D41A */,/*27549*/"Hangul Syllable PWAS"/* D41B */, /*27550*/"Hangul Syllable PWASS"/* D41C */,/*27551*/"Hangul Syllable PWANG"/* D41D */, /*27552*/"Hangul Syllable PWAJ"/* D41E */,/*27553*/"Hangul Syllable PWAC"/* D41F */, /*27554*/"Hangul Syllable PWAK"/* D420 */,/*27555*/"Hangul Syllable PWAT"/* D421 */, /*27556*/"Hangul Syllable PWAP"/* D422 */,/*27557*/"Hangul Syllable PWAH"/* D423 */, /*27558*/"Hangul Syllable PWAE"/* D424 */,/*27559*/"Hangul Syllable PWAEG"/* D425 */, /*27560*/"Hangul Syllable PWAEGG"/* D426 */,/*27561*/"Hangul Syllable PWAEGS"/* D427 */, /*27562*/"Hangul Syllable PWAEN"/* D428 */,/*27563*/"Hangul Syllable PWAENJ"/* D429 */, /*27564*/"Hangul Syllable PWAENH"/* D42A */,/*27565*/"Hangul Syllable PWAED"/* D42B */, /*27566*/"Hangul Syllable PWAEL"/* D42C */,/*27567*/"Hangul Syllable PWAELG"/* D42D */, /*27568*/"Hangul Syllable PWAELM"/* D42E */,/*27569*/"Hangul Syllable PWAELB"/* D42F */, /*27570*/"Hangul Syllable PWAELS"/* D430 */,/*27571*/"Hangul Syllable PWAELT"/* D431 */, /*27572*/"Hangul Syllable PWAELP"/* D432 */,/*27573*/"Hangul Syllable PWAELH"/* D433 */, /*27574*/"Hangul Syllable PWAEM"/* D434 */,/*27575*/"Hangul Syllable PWAEB"/* D435 */, /*27576*/"Hangul Syllable PWAEBS"/* D436 */,/*27577*/"Hangul Syllable PWAES"/* D437 */, /*27578*/"Hangul Syllable PWAESS"/* D438 */,/*27579*/"Hangul Syllable PWAENG"/* D439 */, /*27580*/"Hangul Syllable PWAEJ"/* D43A */,/*27581*/"Hangul Syllable PWAEC"/* D43B */, /*27582*/"Hangul Syllable PWAEK"/* D43C */,/*27583*/"Hangul Syllable PWAET"/* D43D */, /*27584*/"Hangul Syllable PWAEP"/* D43E */,/*27585*/"Hangul Syllable PWAEH"/* D43F */, /*27586*/"Hangul Syllable POE"/* D440 */,/*27587*/"Hangul Syllable POEG"/* D441 */, /*27588*/"Hangul Syllable POEGG"/* D442 */,/*27589*/"Hangul Syllable POEGS"/* D443 */, /*27590*/"Hangul Syllable POEN"/* D444 */,/*27591*/"Hangul Syllable POENJ"/* D445 */, /*27592*/"Hangul Syllable POENH"/* D446 */,/*27593*/"Hangul Syllable POED"/* D447 */, /*27594*/"Hangul Syllable POEL"/* D448 */,/*27595*/"Hangul Syllable POELG"/* D449 */, /*27596*/"Hangul Syllable POELM"/* D44A */,/*27597*/"Hangul Syllable POELB"/* D44B */, /*27598*/"Hangul Syllable POELS"/* D44C */,/*27599*/"Hangul Syllable POELT"/* D44D */, /*27600*/"Hangul Syllable POELP"/* D44E */,/*27601*/"Hangul Syllable POELH"/* D44F */, /*27602*/"Hangul Syllable POEM"/* D450 */,/*27603*/"Hangul Syllable POEB"/* D451 */, /*27604*/"Hangul Syllable POEBS"/* D452 */,/*27605*/"Hangul Syllable POES"/* D453 */, /*27606*/"Hangul Syllable POESS"/* D454 */,/*27607*/"Hangul Syllable POENG"/* D455 */, /*27608*/"Hangul Syllable POEJ"/* D456 */,/*27609*/"Hangul Syllable POEC"/* D457 */, /*27610*/"Hangul Syllable POEK"/* D458 */,/*27611*/"Hangul Syllable POET"/* D459 */, /*27612*/"Hangul Syllable POEP"/* D45A */,/*27613*/"Hangul Syllable POEH"/* D45B */, /*27614*/"Hangul Syllable PYO"/* D45C */,/*27615*/"Hangul Syllable PYOG"/* D45D */, /*27616*/"Hangul Syllable PYOGG"/* D45E */,/*27617*/"Hangul Syllable PYOGS"/* D45F */, /*27618*/"Hangul Syllable PYON"/* D460 */,/*27619*/"Hangul Syllable PYONJ"/* D461 */, /*27620*/"Hangul Syllable PYONH"/* D462 */,/*27621*/"Hangul Syllable PYOD"/* D463 */, /*27622*/"Hangul Syllable PYOL"/* D464 */,/*27623*/"Hangul Syllable PYOLG"/* D465 */, /*27624*/"Hangul Syllable PYOLM"/* D466 */,/*27625*/"Hangul Syllable PYOLB"/* D467 */, /*27626*/"Hangul Syllable PYOLS"/* D468 */,/*27627*/"Hangul Syllable PYOLT"/* D469 */, /*27628*/"Hangul Syllable PYOLP"/* D46A */,/*27629*/"Hangul Syllable PYOLH"/* D46B */, /*27630*/"Hangul Syllable PYOM"/* D46C */,/*27631*/"Hangul Syllable PYOB"/* D46D */, /*27632*/"Hangul Syllable PYOBS"/* D46E */,/*27633*/"Hangul Syllable PYOS"/* D46F */, /*27634*/"Hangul Syllable PYOSS"/* D470 */,/*27635*/"Hangul Syllable PYONG"/* D471 */, /*27636*/"Hangul Syllable PYOJ"/* D472 */,/*27637*/"Hangul Syllable PYOC"/* D473 */, /*27638*/"Hangul Syllable PYOK"/* D474 */,/*27639*/"Hangul Syllable PYOT"/* D475 */, /*27640*/"Hangul Syllable PYOP"/* D476 */,/*27641*/"Hangul Syllable PYOH"/* D477 */, /*27642*/"Hangul Syllable PU"/* D478 */,/*27643*/"Hangul Syllable PUG"/* D479 */, /*27644*/"Hangul Syllable PUGG"/* D47A */,/*27645*/"Hangul Syllable PUGS"/* D47B */, /*27646*/"Hangul Syllable PUN"/* D47C */,/*27647*/"Hangul Syllable PUNJ"/* D47D */, /*27648*/"Hangul Syllable PUNH"/* D47E */,/*27649*/"Hangul Syllable PUD"/* D47F */, /*27650*/"Hangul Syllable PUL"/* D480 */,/*27651*/"Hangul Syllable PULG"/* D481 */, /*27652*/"Hangul Syllable PULM"/* D482 */,/*27653*/"Hangul Syllable PULB"/* D483 */, /*27654*/"Hangul Syllable PULS"/* D484 */,/*27655*/"Hangul Syllable PULT"/* D485 */, /*27656*/"Hangul Syllable PULP"/* D486 */,/*27657*/"Hangul Syllable PULH"/* D487 */, /*27658*/"Hangul Syllable PUM"/* D488 */,/*27659*/"Hangul Syllable PUB"/* D489 */, /*27660*/"Hangul Syllable PUBS"/* D48A */,/*27661*/"Hangul Syllable PUS"/* D48B */, /*27662*/"Hangul Syllable PUSS"/* D48C */,/*27663*/"Hangul Syllable PUNG"/* D48D */, /*27664*/"Hangul Syllable PUJ"/* D48E */,/*27665*/"Hangul Syllable PUC"/* D48F */, /*27666*/"Hangul Syllable PUK"/* D490 */,/*27667*/"Hangul Syllable PUT"/* D491 */, /*27668*/"Hangul Syllable PUP"/* D492 */,/*27669*/"Hangul Syllable PUH"/* D493 */, /*27670*/"Hangul Syllable PWEO"/* D494 */,/*27671*/"Hangul Syllable PWEOG"/* D495 */, /*27672*/"Hangul Syllable PWEOGG"/* D496 */,/*27673*/"Hangul Syllable PWEOGS"/* D497 */, /*27674*/"Hangul Syllable PWEON"/* D498 */,/*27675*/"Hangul Syllable PWEONJ"/* D499 */, /*27676*/"Hangul Syllable PWEONH"/* D49A */,/*27677*/"Hangul Syllable PWEOD"/* D49B */, /*27678*/"Hangul Syllable PWEOL"/* D49C */,/*27679*/"Hangul Syllable PWEOLG"/* D49D */, /*27680*/"Hangul Syllable PWEOLM"/* D49E */,/*27681*/"Hangul Syllable PWEOLB"/* D49F */, /*27682*/"Hangul Syllable PWEOLS"/* D4A0 */,/*27683*/"Hangul Syllable PWEOLT"/* D4A1 */, /*27684*/"Hangul Syllable PWEOLP"/* D4A2 */,/*27685*/"Hangul Syllable PWEOLH"/* D4A3 */, /*27686*/"Hangul Syllable PWEOM"/* D4A4 */,/*27687*/"Hangul Syllable PWEOB"/* D4A5 */, /*27688*/"Hangul Syllable PWEOBS"/* D4A6 */,/*27689*/"Hangul Syllable PWEOS"/* D4A7 */, /*27690*/"Hangul Syllable PWEOSS"/* D4A8 */,/*27691*/"Hangul Syllable PWEONG"/* D4A9 */, /*27692*/"Hangul Syllable PWEOJ"/* D4AA */,/*27693*/"Hangul Syllable PWEOC"/* D4AB */, /*27694*/"Hangul Syllable PWEOK"/* D4AC */,/*27695*/"Hangul Syllable PWEOT"/* D4AD */, /*27696*/"Hangul Syllable PWEOP"/* D4AE */,/*27697*/"Hangul Syllable PWEOH"/* D4AF */, /*27698*/"Hangul Syllable PWE"/* D4B0 */,/*27699*/"Hangul Syllable PWEG"/* D4B1 */, /*27700*/"Hangul Syllable PWEGG"/* D4B2 */,/*27701*/"Hangul Syllable PWEGS"/* D4B3 */, /*27702*/"Hangul Syllable PWEN"/* D4B4 */,/*27703*/"Hangul Syllable PWENJ"/* D4B5 */, /*27704*/"Hangul Syllable PWENH"/* D4B6 */,/*27705*/"Hangul Syllable PWED"/* D4B7 */, /*27706*/"Hangul Syllable PWEL"/* D4B8 */,/*27707*/"Hangul Syllable PWELG"/* D4B9 */, /*27708*/"Hangul Syllable PWELM"/* D4BA */,/*27709*/"Hangul Syllable PWELB"/* D4BB */, /*27710*/"Hangul Syllable PWELS"/* D4BC */,/*27711*/"Hangul Syllable PWELT"/* D4BD */, /*27712*/"Hangul Syllable PWELP"/* D4BE */,/*27713*/"Hangul Syllable PWELH"/* D4BF */, /*27714*/"Hangul Syllable PWEM"/* D4C0 */,/*27715*/"Hangul Syllable PWEB"/* D4C1 */, /*27716*/"Hangul Syllable PWEBS"/* D4C2 */,/*27717*/"Hangul Syllable PWES"/* D4C3 */, /*27718*/"Hangul Syllable PWESS"/* D4C4 */,/*27719*/"Hangul Syllable PWENG"/* D4C5 */, /*27720*/"Hangul Syllable PWEJ"/* D4C6 */,/*27721*/"Hangul Syllable PWEC"/* D4C7 */, /*27722*/"Hangul Syllable PWEK"/* D4C8 */,/*27723*/"Hangul Syllable PWET"/* D4C9 */, /*27724*/"Hangul Syllable PWEP"/* D4CA */,/*27725*/"Hangul Syllable PWEH"/* D4CB */, /*27726*/"Hangul Syllable PWI"/* D4CC */,/*27727*/"Hangul Syllable PWIG"/* D4CD */, /*27728*/"Hangul Syllable PWIGG"/* D4CE */,/*27729*/"Hangul Syllable PWIGS"/* D4CF */, /*27730*/"Hangul Syllable PWIN"/* D4D0 */,/*27731*/"Hangul Syllable PWINJ"/* D4D1 */, /*27732*/"Hangul Syllable PWINH"/* D4D2 */,/*27733*/"Hangul Syllable PWID"/* D4D3 */, /*27734*/"Hangul Syllable PWIL"/* D4D4 */,/*27735*/"Hangul Syllable PWILG"/* D4D5 */, /*27736*/"Hangul Syllable PWILM"/* D4D6 */,/*27737*/"Hangul Syllable PWILB"/* D4D7 */, /*27738*/"Hangul Syllable PWILS"/* D4D8 */,/*27739*/"Hangul Syllable PWILT"/* D4D9 */, /*27740*/"Hangul Syllable PWILP"/* D4DA */,/*27741*/"Hangul Syllable PWILH"/* D4DB */, /*27742*/"Hangul Syllable PWIM"/* D4DC */,/*27743*/"Hangul Syllable PWIB"/* D4DD */, /*27744*/"Hangul Syllable PWIBS"/* D4DE */,/*27745*/"Hangul Syllable PWIS"/* D4DF */, /*27746*/"Hangul Syllable PWISS"/* D4E0 */,/*27747*/"Hangul Syllable PWING"/* D4E1 */, /*27748*/"Hangul Syllable PWIJ"/* D4E2 */,/*27749*/"Hangul Syllable PWIC"/* D4E3 */, /*27750*/"Hangul Syllable PWIK"/* D4E4 */,/*27751*/"Hangul Syllable PWIT"/* D4E5 */, /*27752*/"Hangul Syllable PWIP"/* D4E6 */,/*27753*/"Hangul Syllable PWIH"/* D4E7 */, /*27754*/"Hangul Syllable PYU"/* D4E8 */,/*27755*/"Hangul Syllable PYUG"/* D4E9 */, /*27756*/"Hangul Syllable PYUGG"/* D4EA */,/*27757*/"Hangul Syllable PYUGS"/* D4EB */, /*27758*/"Hangul Syllable PYUN"/* D4EC */,/*27759*/"Hangul Syllable PYUNJ"/* D4ED */, /*27760*/"Hangul Syllable PYUNH"/* D4EE */,/*27761*/"Hangul Syllable PYUD"/* D4EF */, /*27762*/"Hangul Syllable PYUL"/* D4F0 */,/*27763*/"Hangul Syllable PYULG"/* D4F1 */, /*27764*/"Hangul Syllable PYULM"/* D4F2 */,/*27765*/"Hangul Syllable PYULB"/* D4F3 */, /*27766*/"Hangul Syllable PYULS"/* D4F4 */,/*27767*/"Hangul Syllable PYULT"/* D4F5 */, /*27768*/"Hangul Syllable PYULP"/* D4F6 */,/*27769*/"Hangul Syllable PYULH"/* D4F7 */, /*27770*/"Hangul Syllable PYUM"/* D4F8 */,/*27771*/"Hangul Syllable PYUB"/* D4F9 */, /*27772*/"Hangul Syllable PYUBS"/* D4FA */,/*27773*/"Hangul Syllable PYUS"/* D4FB */, /*27774*/"Hangul Syllable PYUSS"/* D4FC */,/*27775*/"Hangul Syllable PYUNG"/* D4FD */, /*27776*/"Hangul Syllable PYUJ"/* D4FE */,/*27777*/"Hangul Syllable PYUC"/* D4FF */, /*27778*/"Hangul Syllable PYUK"/* D500 */,/*27779*/"Hangul Syllable PYUT"/* D501 */, /*27780*/"Hangul Syllable PYUP"/* D502 */,/*27781*/"Hangul Syllable PYUH"/* D503 */, /*27782*/"Hangul Syllable PEU"/* D504 */,/*27783*/"Hangul Syllable PEUG"/* D505 */, /*27784*/"Hangul Syllable PEUGG"/* D506 */,/*27785*/"Hangul Syllable PEUGS"/* D507 */, /*27786*/"Hangul Syllable PEUN"/* D508 */,/*27787*/"Hangul Syllable PEUNJ"/* D509 */, /*27788*/"Hangul Syllable PEUNH"/* D50A */,/*27789*/"Hangul Syllable PEUD"/* D50B */, /*27790*/"Hangul Syllable PEUL"/* D50C */,/*27791*/"Hangul Syllable PEULG"/* D50D */, /*27792*/"Hangul Syllable PEULM"/* D50E */,/*27793*/"Hangul Syllable PEULB"/* D50F */, /*27794*/"Hangul Syllable PEULS"/* D510 */,/*27795*/"Hangul Syllable PEULT"/* D511 */, /*27796*/"Hangul Syllable PEULP"/* D512 */,/*27797*/"Hangul Syllable PEULH"/* D513 */, /*27798*/"Hangul Syllable PEUM"/* D514 */,/*27799*/"Hangul Syllable PEUB"/* D515 */, /*27800*/"Hangul Syllable PEUBS"/* D516 */,/*27801*/"Hangul Syllable PEUS"/* D517 */, /*27802*/"Hangul Syllable PEUSS"/* D518 */,/*27803*/"Hangul Syllable PEUNG"/* D519 */, /*27804*/"Hangul Syllable PEUJ"/* D51A */,/*27805*/"Hangul Syllable PEUC"/* D51B */, /*27806*/"Hangul Syllable PEUK"/* D51C */,/*27807*/"Hangul Syllable PEUT"/* D51D */, /*27808*/"Hangul Syllable PEUP"/* D51E */,/*27809*/"Hangul Syllable PEUH"/* D51F */, /*27810*/"Hangul Syllable PYI"/* D520 */,/*27811*/"Hangul Syllable PYIG"/* D521 */, /*27812*/"Hangul Syllable PYIGG"/* D522 */,/*27813*/"Hangul Syllable PYIGS"/* D523 */, /*27814*/"Hangul Syllable PYIN"/* D524 */,/*27815*/"Hangul Syllable PYINJ"/* D525 */, /*27816*/"Hangul Syllable PYINH"/* D526 */,/*27817*/"Hangul Syllable PYID"/* D527 */, /*27818*/"Hangul Syllable PYIL"/* D528 */,/*27819*/"Hangul Syllable PYILG"/* D529 */, /*27820*/"Hangul Syllable PYILM"/* D52A */,/*27821*/"Hangul Syllable PYILB"/* D52B */, /*27822*/"Hangul Syllable PYILS"/* D52C */,/*27823*/"Hangul Syllable PYILT"/* D52D */, /*27824*/"Hangul Syllable PYILP"/* D52E */,/*27825*/"Hangul Syllable PYILH"/* D52F */, /*27826*/"Hangul Syllable PYIM"/* D530 */,/*27827*/"Hangul Syllable PYIB"/* D531 */, /*27828*/"Hangul Syllable PYIBS"/* D532 */,/*27829*/"Hangul Syllable PYIS"/* D533 */, /*27830*/"Hangul Syllable PYISS"/* D534 */,/*27831*/"Hangul Syllable PYING"/* D535 */, /*27832*/"Hangul Syllable PYIJ"/* D536 */,/*27833*/"Hangul Syllable PYIC"/* D537 */, /*27834*/"Hangul Syllable PYIK"/* D538 */,/*27835*/"Hangul Syllable PYIT"/* D539 */, /*27836*/"Hangul Syllable PYIP"/* D53A */,/*27837*/"Hangul Syllable PYIH"/* D53B */, /*27838*/"Hangul Syllable PI"/* D53C */,/*27839*/"Hangul Syllable PIG"/* D53D */, /*27840*/"Hangul Syllable PIGG"/* D53E */,/*27841*/"Hangul Syllable PIGS"/* D53F */, /*27842*/"Hangul Syllable PIN"/* D540 */,/*27843*/"Hangul Syllable PINJ"/* D541 */, /*27844*/"Hangul Syllable PINH"/* D542 */,/*27845*/"Hangul Syllable PID"/* D543 */, /*27846*/"Hangul Syllable PIL"/* D544 */,/*27847*/"Hangul Syllable PILG"/* D545 */, /*27848*/"Hangul Syllable PILM"/* D546 */,/*27849*/"Hangul Syllable PILB"/* D547 */, /*27850*/"Hangul Syllable PILS"/* D548 */,/*27851*/"Hangul Syllable PILT"/* D549 */, /*27852*/"Hangul Syllable PILP"/* D54A */,/*27853*/"Hangul Syllable PILH"/* D54B */, /*27854*/"Hangul Syllable PIM"/* D54C */,/*27855*/"Hangul Syllable PIB"/* D54D */, /*27856*/"Hangul Syllable PIBS"/* D54E */,/*27857*/"Hangul Syllable PIS"/* D54F */, /*27858*/"Hangul Syllable PISS"/* D550 */,/*27859*/"Hangul Syllable PING"/* D551 */, /*27860*/"Hangul Syllable PIJ"/* D552 */,/*27861*/"Hangul Syllable PIC"/* D553 */, /*27862*/"Hangul Syllable PIK"/* D554 */,/*27863*/"Hangul Syllable PIT"/* D555 */, /*27864*/"Hangul Syllable PIP"/* D556 */,/*27865*/"Hangul Syllable PIH"/* D557 */, /*27866*/"Hangul Syllable HA"/* D558 */,/*27867*/"Hangul Syllable HAG"/* D559 */, /*27868*/"Hangul Syllable HAGG"/* D55A */,/*27869*/"Hangul Syllable HAGS"/* D55B */, /*27870*/"Hangul Syllable HAN"/* D55C */,/*27871*/"Hangul Syllable HANJ"/* D55D */, /*27872*/"Hangul Syllable HANH"/* D55E */,/*27873*/"Hangul Syllable HAD"/* D55F */, /*27874*/"Hangul Syllable HAL"/* D560 */,/*27875*/"Hangul Syllable HALG"/* D561 */, /*27876*/"Hangul Syllable HALM"/* D562 */,/*27877*/"Hangul Syllable HALB"/* D563 */, /*27878*/"Hangul Syllable HALS"/* D564 */,/*27879*/"Hangul Syllable HALT"/* D565 */, /*27880*/"Hangul Syllable HALP"/* D566 */,/*27881*/"Hangul Syllable HALH"/* D567 */, /*27882*/"Hangul Syllable HAM"/* D568 */,/*27883*/"Hangul Syllable HAB"/* D569 */, /*27884*/"Hangul Syllable HABS"/* D56A */,/*27885*/"Hangul Syllable HAS"/* D56B */, /*27886*/"Hangul Syllable HASS"/* D56C */,/*27887*/"Hangul Syllable HANG"/* D56D */, /*27888*/"Hangul Syllable HAJ"/* D56E */,/*27889*/"Hangul Syllable HAC"/* D56F */, /*27890*/"Hangul Syllable HAK"/* D570 */,/*27891*/"Hangul Syllable HAT"/* D571 */, /*27892*/"Hangul Syllable HAP"/* D572 */,/*27893*/"Hangul Syllable HAH"/* D573 */, /*27894*/"Hangul Syllable HAE"/* D574 */,/*27895*/"Hangul Syllable HAEG"/* D575 */, /*27896*/"Hangul Syllable HAEGG"/* D576 */,/*27897*/"Hangul Syllable HAEGS"/* D577 */, /*27898*/"Hangul Syllable HAEN"/* D578 */,/*27899*/"Hangul Syllable HAENJ"/* D579 */, /*27900*/"Hangul Syllable HAENH"/* D57A */,/*27901*/"Hangul Syllable HAED"/* D57B */, /*27902*/"Hangul Syllable HAEL"/* D57C */,/*27903*/"Hangul Syllable HAELG"/* D57D */, /*27904*/"Hangul Syllable HAELM"/* D57E */,/*27905*/"Hangul Syllable HAELB"/* D57F */, /*27906*/"Hangul Syllable HAELS"/* D580 */,/*27907*/"Hangul Syllable HAELT"/* D581 */, /*27908*/"Hangul Syllable HAELP"/* D582 */,/*27909*/"Hangul Syllable HAELH"/* D583 */, /*27910*/"Hangul Syllable HAEM"/* D584 */,/*27911*/"Hangul Syllable HAEB"/* D585 */, /*27912*/"Hangul Syllable HAEBS"/* D586 */,/*27913*/"Hangul Syllable HAES"/* D587 */, /*27914*/"Hangul Syllable HAESS"/* D588 */,/*27915*/"Hangul Syllable HAENG"/* D589 */, /*27916*/"Hangul Syllable HAEJ"/* D58A */,/*27917*/"Hangul Syllable HAEC"/* D58B */, /*27918*/"Hangul Syllable HAEK"/* D58C */,/*27919*/"Hangul Syllable HAET"/* D58D */, /*27920*/"Hangul Syllable HAEP"/* D58E */,/*27921*/"Hangul Syllable HAEH"/* D58F */, /*27922*/"Hangul Syllable HYA"/* D590 */,/*27923*/"Hangul Syllable HYAG"/* D591 */, /*27924*/"Hangul Syllable HYAGG"/* D592 */,/*27925*/"Hangul Syllable HYAGS"/* D593 */, /*27926*/"Hangul Syllable HYAN"/* D594 */,/*27927*/"Hangul Syllable HYANJ"/* D595 */, /*27928*/"Hangul Syllable HYANH"/* D596 */,/*27929*/"Hangul Syllable HYAD"/* D597 */, /*27930*/"Hangul Syllable HYAL"/* D598 */,/*27931*/"Hangul Syllable HYALG"/* D599 */, /*27932*/"Hangul Syllable HYALM"/* D59A */,/*27933*/"Hangul Syllable HYALB"/* D59B */, /*27934*/"Hangul Syllable HYALS"/* D59C */,/*27935*/"Hangul Syllable HYALT"/* D59D */, /*27936*/"Hangul Syllable HYALP"/* D59E */,/*27937*/"Hangul Syllable HYALH"/* D59F */, /*27938*/"Hangul Syllable HYAM"/* D5A0 */,/*27939*/"Hangul Syllable HYAB"/* D5A1 */, /*27940*/"Hangul Syllable HYABS"/* D5A2 */,/*27941*/"Hangul Syllable HYAS"/* D5A3 */, /*27942*/"Hangul Syllable HYASS"/* D5A4 */,/*27943*/"Hangul Syllable HYANG"/* D5A5 */, /*27944*/"Hangul Syllable HYAJ"/* D5A6 */,/*27945*/"Hangul Syllable HYAC"/* D5A7 */, /*27946*/"Hangul Syllable HYAK"/* D5A8 */,/*27947*/"Hangul Syllable HYAT"/* D5A9 */, /*27948*/"Hangul Syllable HYAP"/* D5AA */,/*27949*/"Hangul Syllable HYAH"/* D5AB */, /*27950*/"Hangul Syllable HYAE"/* D5AC */,/*27951*/"Hangul Syllable HYAEG"/* D5AD */, /*27952*/"Hangul Syllable HYAEGG"/* D5AE */,/*27953*/"Hangul Syllable HYAEGS"/* D5AF */, /*27954*/"Hangul Syllable HYAEN"/* D5B0 */,/*27955*/"Hangul Syllable HYAENJ"/* D5B1 */, /*27956*/"Hangul Syllable HYAENH"/* D5B2 */,/*27957*/"Hangul Syllable HYAED"/* D5B3 */, /*27958*/"Hangul Syllable HYAEL"/* D5B4 */,/*27959*/"Hangul Syllable HYAELG"/* D5B5 */, /*27960*/"Hangul Syllable HYAELM"/* D5B6 */,/*27961*/"Hangul Syllable HYAELB"/* D5B7 */, /*27962*/"Hangul Syllable HYAELS"/* D5B8 */,/*27963*/"Hangul Syllable HYAELT"/* D5B9 */, /*27964*/"Hangul Syllable HYAELP"/* D5BA */,/*27965*/"Hangul Syllable HYAELH"/* D5BB */, /*27966*/"Hangul Syllable HYAEM"/* D5BC */,/*27967*/"Hangul Syllable HYAEB"/* D5BD */, /*27968*/"Hangul Syllable HYAEBS"/* D5BE */,/*27969*/"Hangul Syllable HYAES"/* D5BF */, /*27970*/"Hangul Syllable HYAESS"/* D5C0 */,/*27971*/"Hangul Syllable HYAENG"/* D5C1 */, /*27972*/"Hangul Syllable HYAEJ"/* D5C2 */,/*27973*/"Hangul Syllable HYAEC"/* D5C3 */, /*27974*/"Hangul Syllable HYAEK"/* D5C4 */,/*27975*/"Hangul Syllable HYAET"/* D5C5 */, /*27976*/"Hangul Syllable HYAEP"/* D5C6 */,/*27977*/"Hangul Syllable HYAEH"/* D5C7 */, /*27978*/"Hangul Syllable HEO"/* D5C8 */,/*27979*/"Hangul Syllable HEOG"/* D5C9 */, /*27980*/"Hangul Syllable HEOGG"/* D5CA */,/*27981*/"Hangul Syllable HEOGS"/* D5CB */, /*27982*/"Hangul Syllable HEON"/* D5CC */,/*27983*/"Hangul Syllable HEONJ"/* D5CD */, /*27984*/"Hangul Syllable HEONH"/* D5CE */,/*27985*/"Hangul Syllable HEOD"/* D5CF */, /*27986*/"Hangul Syllable HEOL"/* D5D0 */,/*27987*/"Hangul Syllable HEOLG"/* D5D1 */, /*27988*/"Hangul Syllable HEOLM"/* D5D2 */,/*27989*/"Hangul Syllable HEOLB"/* D5D3 */, /*27990*/"Hangul Syllable HEOLS"/* D5D4 */,/*27991*/"Hangul Syllable HEOLT"/* D5D5 */, /*27992*/"Hangul Syllable HEOLP"/* D5D6 */,/*27993*/"Hangul Syllable HEOLH"/* D5D7 */, /*27994*/"Hangul Syllable HEOM"/* D5D8 */,/*27995*/"Hangul Syllable HEOB"/* D5D9 */, /*27996*/"Hangul Syllable HEOBS"/* D5DA */,/*27997*/"Hangul Syllable HEOS"/* D5DB */, /*27998*/"Hangul Syllable HEOSS"/* D5DC */,/*27999*/"Hangul Syllable HEONG"/* D5DD */, /*28000*/"Hangul Syllable HEOJ"/* D5DE */,/*28001*/"Hangul Syllable HEOC"/* D5DF */, /*28002*/"Hangul Syllable HEOK"/* D5E0 */,/*28003*/"Hangul Syllable HEOT"/* D5E1 */, /*28004*/"Hangul Syllable HEOP"/* D5E2 */,/*28005*/"Hangul Syllable HEOH"/* D5E3 */, /*28006*/"Hangul Syllable HE"/* D5E4 */,/*28007*/"Hangul Syllable HEG"/* D5E5 */, /*28008*/"Hangul Syllable HEGG"/* D5E6 */,/*28009*/"Hangul Syllable HEGS"/* D5E7 */, /*28010*/"Hangul Syllable HEN"/* D5E8 */,/*28011*/"Hangul Syllable HENJ"/* D5E9 */, /*28012*/"Hangul Syllable HENH"/* D5EA */,/*28013*/"Hangul Syllable HED"/* D5EB */, /*28014*/"Hangul Syllable HEL"/* D5EC */,/*28015*/"Hangul Syllable HELG"/* D5ED */, /*28016*/"Hangul Syllable HELM"/* D5EE */,/*28017*/"Hangul Syllable HELB"/* D5EF */, /*28018*/"Hangul Syllable HELS"/* D5F0 */,/*28019*/"Hangul Syllable HELT"/* D5F1 */, /*28020*/"Hangul Syllable HELP"/* D5F2 */,/*28021*/"Hangul Syllable HELH"/* D5F3 */, /*28022*/"Hangul Syllable HEM"/* D5F4 */,/*28023*/"Hangul Syllable HEB"/* D5F5 */, /*28024*/"Hangul Syllable HEBS"/* D5F6 */,/*28025*/"Hangul Syllable HES"/* D5F7 */, /*28026*/"Hangul Syllable HESS"/* D5F8 */,/*28027*/"Hangul Syllable HENG"/* D5F9 */, /*28028*/"Hangul Syllable HEJ"/* D5FA */,/*28029*/"Hangul Syllable HEC"/* D5FB */, /*28030*/"Hangul Syllable HEK"/* D5FC */,/*28031*/"Hangul Syllable HET"/* D5FD */, /*28032*/"Hangul Syllable HEP"/* D5FE */,/*28033*/"Hangul Syllable HEH"/* D5FF */, /*28034*/"Hangul Syllable HYEO"/* D600 */,/*28035*/"Hangul Syllable HYEOG"/* D601 */, /*28036*/"Hangul Syllable HYEOGG"/* D602 */,/*28037*/"Hangul Syllable HYEOGS"/* D603 */, /*28038*/"Hangul Syllable HYEON"/* D604 */,/*28039*/"Hangul Syllable HYEONJ"/* D605 */, /*28040*/"Hangul Syllable HYEONH"/* D606 */,/*28041*/"Hangul Syllable HYEOD"/* D607 */, /*28042*/"Hangul Syllable HYEOL"/* D608 */,/*28043*/"Hangul Syllable HYEOLG"/* D609 */, /*28044*/"Hangul Syllable HYEOLM"/* D60A */,/*28045*/"Hangul Syllable HYEOLB"/* D60B */, /*28046*/"Hangul Syllable HYEOLS"/* D60C */,/*28047*/"Hangul Syllable HYEOLT"/* D60D */, /*28048*/"Hangul Syllable HYEOLP"/* D60E */,/*28049*/"Hangul Syllable HYEOLH"/* D60F */, /*28050*/"Hangul Syllable HYEOM"/* D610 */,/*28051*/"Hangul Syllable HYEOB"/* D611 */, /*28052*/"Hangul Syllable HYEOBS"/* D612 */,/*28053*/"Hangul Syllable HYEOS"/* D613 */, /*28054*/"Hangul Syllable HYEOSS"/* D614 */,/*28055*/"Hangul Syllable HYEONG"/* D615 */, /*28056*/"Hangul Syllable HYEOJ"/* D616 */,/*28057*/"Hangul Syllable HYEOC"/* D617 */, /*28058*/"Hangul Syllable HYEOK"/* D618 */,/*28059*/"Hangul Syllable HYEOT"/* D619 */, /*28060*/"Hangul Syllable HYEOP"/* D61A */,/*28061*/"Hangul Syllable HYEOH"/* D61B */, /*28062*/"Hangul Syllable HYE"/* D61C */,/*28063*/"Hangul Syllable HYEG"/* D61D */, /*28064*/"Hangul Syllable HYEGG"/* D61E */,/*28065*/"Hangul Syllable HYEGS"/* D61F */, /*28066*/"Hangul Syllable HYEN"/* D620 */,/*28067*/"Hangul Syllable HYENJ"/* D621 */, /*28068*/"Hangul Syllable HYENH"/* D622 */,/*28069*/"Hangul Syllable HYED"/* D623 */, /*28070*/"Hangul Syllable HYEL"/* D624 */,/*28071*/"Hangul Syllable HYELG"/* D625 */, /*28072*/"Hangul Syllable HYELM"/* D626 */,/*28073*/"Hangul Syllable HYELB"/* D627 */, /*28074*/"Hangul Syllable HYELS"/* D628 */,/*28075*/"Hangul Syllable HYELT"/* D629 */, /*28076*/"Hangul Syllable HYELP"/* D62A */,/*28077*/"Hangul Syllable HYELH"/* D62B */, /*28078*/"Hangul Syllable HYEM"/* D62C */,/*28079*/"Hangul Syllable HYEB"/* D62D */, /*28080*/"Hangul Syllable HYEBS"/* D62E */,/*28081*/"Hangul Syllable HYES"/* D62F */, /*28082*/"Hangul Syllable HYESS"/* D630 */,/*28083*/"Hangul Syllable HYENG"/* D631 */, /*28084*/"Hangul Syllable HYEJ"/* D632 */,/*28085*/"Hangul Syllable HYEC"/* D633 */, /*28086*/"Hangul Syllable HYEK"/* D634 */,/*28087*/"Hangul Syllable HYET"/* D635 */, /*28088*/"Hangul Syllable HYEP"/* D636 */,/*28089*/"Hangul Syllable HYEH"/* D637 */, /*28090*/"Hangul Syllable HO"/* D638 */,/*28091*/"Hangul Syllable HOG"/* D639 */, /*28092*/"Hangul Syllable HOGG"/* D63A */,/*28093*/"Hangul Syllable HOGS"/* D63B */, /*28094*/"Hangul Syllable HON"/* D63C */,/*28095*/"Hangul Syllable HONJ"/* D63D */, /*28096*/"Hangul Syllable HONH"/* D63E */,/*28097*/"Hangul Syllable HOD"/* D63F */, /*28098*/"Hangul Syllable HOL"/* D640 */,/*28099*/"Hangul Syllable HOLG"/* D641 */, /*28100*/"Hangul Syllable HOLM"/* D642 */,/*28101*/"Hangul Syllable HOLB"/* D643 */, /*28102*/"Hangul Syllable HOLS"/* D644 */,/*28103*/"Hangul Syllable HOLT"/* D645 */, /*28104*/"Hangul Syllable HOLP"/* D646 */,/*28105*/"Hangul Syllable HOLH"/* D647 */, /*28106*/"Hangul Syllable HOM"/* D648 */,/*28107*/"Hangul Syllable HOB"/* D649 */, /*28108*/"Hangul Syllable HOBS"/* D64A */,/*28109*/"Hangul Syllable HOS"/* D64B */, /*28110*/"Hangul Syllable HOSS"/* D64C */,/*28111*/"Hangul Syllable HONG"/* D64D */, /*28112*/"Hangul Syllable HOJ"/* D64E */,/*28113*/"Hangul Syllable HOC"/* D64F */, /*28114*/"Hangul Syllable HOK"/* D650 */,/*28115*/"Hangul Syllable HOT"/* D651 */, /*28116*/"Hangul Syllable HOP"/* D652 */,/*28117*/"Hangul Syllable HOH"/* D653 */, /*28118*/"Hangul Syllable HWA"/* D654 */,/*28119*/"Hangul Syllable HWAG"/* D655 */, /*28120*/"Hangul Syllable HWAGG"/* D656 */,/*28121*/"Hangul Syllable HWAGS"/* D657 */, /*28122*/"Hangul Syllable HWAN"/* D658 */,/*28123*/"Hangul Syllable HWANJ"/* D659 */, /*28124*/"Hangul Syllable HWANH"/* D65A */,/*28125*/"Hangul Syllable HWAD"/* D65B */, /*28126*/"Hangul Syllable HWAL"/* D65C */,/*28127*/"Hangul Syllable HWALG"/* D65D */, /*28128*/"Hangul Syllable HWALM"/* D65E */,/*28129*/"Hangul Syllable HWALB"/* D65F */, /*28130*/"Hangul Syllable HWALS"/* D660 */,/*28131*/"Hangul Syllable HWALT"/* D661 */, /*28132*/"Hangul Syllable HWALP"/* D662 */,/*28133*/"Hangul Syllable HWALH"/* D663 */, /*28134*/"Hangul Syllable HWAM"/* D664 */,/*28135*/"Hangul Syllable HWAB"/* D665 */, /*28136*/"Hangul Syllable HWABS"/* D666 */,/*28137*/"Hangul Syllable HWAS"/* D667 */, /*28138*/"Hangul Syllable HWASS"/* D668 */,/*28139*/"Hangul Syllable HWANG"/* D669 */, /*28140*/"Hangul Syllable HWAJ"/* D66A */,/*28141*/"Hangul Syllable HWAC"/* D66B */, /*28142*/"Hangul Syllable HWAK"/* D66C */,/*28143*/"Hangul Syllable HWAT"/* D66D */, /*28144*/"Hangul Syllable HWAP"/* D66E */,/*28145*/"Hangul Syllable HWAH"/* D66F */, /*28146*/"Hangul Syllable HWAE"/* D670 */,/*28147*/"Hangul Syllable HWAEG"/* D671 */, /*28148*/"Hangul Syllable HWAEGG"/* D672 */,/*28149*/"Hangul Syllable HWAEGS"/* D673 */, /*28150*/"Hangul Syllable HWAEN"/* D674 */,/*28151*/"Hangul Syllable HWAENJ"/* D675 */, /*28152*/"Hangul Syllable HWAENH"/* D676 */,/*28153*/"Hangul Syllable HWAED"/* D677 */, /*28154*/"Hangul Syllable HWAEL"/* D678 */,/*28155*/"Hangul Syllable HWAELG"/* D679 */, /*28156*/"Hangul Syllable HWAELM"/* D67A */,/*28157*/"Hangul Syllable HWAELB"/* D67B */, /*28158*/"Hangul Syllable HWAELS"/* D67C */,/*28159*/"Hangul Syllable HWAELT"/* D67D */, /*28160*/"Hangul Syllable HWAELP"/* D67E */,/*28161*/"Hangul Syllable HWAELH"/* D67F */, /*28162*/"Hangul Syllable HWAEM"/* D680 */,/*28163*/"Hangul Syllable HWAEB"/* D681 */, /*28164*/"Hangul Syllable HWAEBS"/* D682 */,/*28165*/"Hangul Syllable HWAES"/* D683 */, /*28166*/"Hangul Syllable HWAESS"/* D684 */,/*28167*/"Hangul Syllable HWAENG"/* D685 */, /*28168*/"Hangul Syllable HWAEJ"/* D686 */,/*28169*/"Hangul Syllable HWAEC"/* D687 */, /*28170*/"Hangul Syllable HWAEK"/* D688 */,/*28171*/"Hangul Syllable HWAET"/* D689 */, /*28172*/"Hangul Syllable HWAEP"/* D68A */,/*28173*/"Hangul Syllable HWAEH"/* D68B */, /*28174*/"Hangul Syllable HOE"/* D68C */,/*28175*/"Hangul Syllable HOEG"/* D68D */, /*28176*/"Hangul Syllable HOEGG"/* D68E */,/*28177*/"Hangul Syllable HOEGS"/* D68F */, /*28178*/"Hangul Syllable HOEN"/* D690 */,/*28179*/"Hangul Syllable HOENJ"/* D691 */, /*28180*/"Hangul Syllable HOENH"/* D692 */,/*28181*/"Hangul Syllable HOED"/* D693 */, /*28182*/"Hangul Syllable HOEL"/* D694 */,/*28183*/"Hangul Syllable HOELG"/* D695 */, /*28184*/"Hangul Syllable HOELM"/* D696 */,/*28185*/"Hangul Syllable HOELB"/* D697 */, /*28186*/"Hangul Syllable HOELS"/* D698 */,/*28187*/"Hangul Syllable HOELT"/* D699 */, /*28188*/"Hangul Syllable HOELP"/* D69A */,/*28189*/"Hangul Syllable HOELH"/* D69B */, /*28190*/"Hangul Syllable HOEM"/* D69C */,/*28191*/"Hangul Syllable HOEB"/* D69D */, /*28192*/"Hangul Syllable HOEBS"/* D69E */,/*28193*/"Hangul Syllable HOES"/* D69F */, /*28194*/"Hangul Syllable HOESS"/* D6A0 */,/*28195*/"Hangul Syllable HOENG"/* D6A1 */, /*28196*/"Hangul Syllable HOEJ"/* D6A2 */,/*28197*/"Hangul Syllable HOEC"/* D6A3 */, /*28198*/"Hangul Syllable HOEK"/* D6A4 */,/*28199*/"Hangul Syllable HOET"/* D6A5 */, /*28200*/"Hangul Syllable HOEP"/* D6A6 */,/*28201*/"Hangul Syllable HOEH"/* D6A7 */, /*28202*/"Hangul Syllable HYO"/* D6A8 */,/*28203*/"Hangul Syllable HYOG"/* D6A9 */, /*28204*/"Hangul Syllable HYOGG"/* D6AA */,/*28205*/"Hangul Syllable HYOGS"/* D6AB */, /*28206*/"Hangul Syllable HYON"/* D6AC */,/*28207*/"Hangul Syllable HYONJ"/* D6AD */, /*28208*/"Hangul Syllable HYONH"/* D6AE */,/*28209*/"Hangul Syllable HYOD"/* D6AF */, /*28210*/"Hangul Syllable HYOL"/* D6B0 */,/*28211*/"Hangul Syllable HYOLG"/* D6B1 */, /*28212*/"Hangul Syllable HYOLM"/* D6B2 */,/*28213*/"Hangul Syllable HYOLB"/* D6B3 */, /*28214*/"Hangul Syllable HYOLS"/* D6B4 */,/*28215*/"Hangul Syllable HYOLT"/* D6B5 */, /*28216*/"Hangul Syllable HYOLP"/* D6B6 */,/*28217*/"Hangul Syllable HYOLH"/* D6B7 */, /*28218*/"Hangul Syllable HYOM"/* D6B8 */,/*28219*/"Hangul Syllable HYOB"/* D6B9 */, /*28220*/"Hangul Syllable HYOBS"/* D6BA */,/*28221*/"Hangul Syllable HYOS"/* D6BB */, /*28222*/"Hangul Syllable HYOSS"/* D6BC */,/*28223*/"Hangul Syllable HYONG"/* D6BD */, /*28224*/"Hangul Syllable HYOJ"/* D6BE */,/*28225*/"Hangul Syllable HYOC"/* D6BF */, /*28226*/"Hangul Syllable HYOK"/* D6C0 */,/*28227*/"Hangul Syllable HYOT"/* D6C1 */, /*28228*/"Hangul Syllable HYOP"/* D6C2 */,/*28229*/"Hangul Syllable HYOH"/* D6C3 */, /*28230*/"Hangul Syllable HU"/* D6C4 */,/*28231*/"Hangul Syllable HUG"/* D6C5 */, /*28232*/"Hangul Syllable HUGG"/* D6C6 */,/*28233*/"Hangul Syllable HUGS"/* D6C7 */, /*28234*/"Hangul Syllable HUN"/* D6C8 */,/*28235*/"Hangul Syllable HUNJ"/* D6C9 */, /*28236*/"Hangul Syllable HUNH"/* D6CA */,/*28237*/"Hangul Syllable HUD"/* D6CB */, /*28238*/"Hangul Syllable HUL"/* D6CC */,/*28239*/"Hangul Syllable HULG"/* D6CD */, /*28240*/"Hangul Syllable HULM"/* D6CE */,/*28241*/"Hangul Syllable HULB"/* D6CF */, /*28242*/"Hangul Syllable HULS"/* D6D0 */,/*28243*/"Hangul Syllable HULT"/* D6D1 */, /*28244*/"Hangul Syllable HULP"/* D6D2 */,/*28245*/"Hangul Syllable HULH"/* D6D3 */, /*28246*/"Hangul Syllable HUM"/* D6D4 */,/*28247*/"Hangul Syllable HUB"/* D6D5 */, /*28248*/"Hangul Syllable HUBS"/* D6D6 */,/*28249*/"Hangul Syllable HUS"/* D6D7 */, /*28250*/"Hangul Syllable HUSS"/* D6D8 */,/*28251*/"Hangul Syllable HUNG"/* D6D9 */, /*28252*/"Hangul Syllable HUJ"/* D6DA */,/*28253*/"Hangul Syllable HUC"/* D6DB */, /*28254*/"Hangul Syllable HUK"/* D6DC */,/*28255*/"Hangul Syllable HUT"/* D6DD */, /*28256*/"Hangul Syllable HUP"/* D6DE */,/*28257*/"Hangul Syllable HUH"/* D6DF */, /*28258*/"Hangul Syllable HWEO"/* D6E0 */,/*28259*/"Hangul Syllable HWEOG"/* D6E1 */, /*28260*/"Hangul Syllable HWEOGG"/* D6E2 */,/*28261*/"Hangul Syllable HWEOGS"/* D6E3 */, /*28262*/"Hangul Syllable HWEON"/* D6E4 */,/*28263*/"Hangul Syllable HWEONJ"/* D6E5 */, /*28264*/"Hangul Syllable HWEONH"/* D6E6 */,/*28265*/"Hangul Syllable HWEOD"/* D6E7 */, /*28266*/"Hangul Syllable HWEOL"/* D6E8 */,/*28267*/"Hangul Syllable HWEOLG"/* D6E9 */, /*28268*/"Hangul Syllable HWEOLM"/* D6EA */,/*28269*/"Hangul Syllable HWEOLB"/* D6EB */, /*28270*/"Hangul Syllable HWEOLS"/* D6EC */,/*28271*/"Hangul Syllable HWEOLT"/* D6ED */, /*28272*/"Hangul Syllable HWEOLP"/* D6EE */,/*28273*/"Hangul Syllable HWEOLH"/* D6EF */, /*28274*/"Hangul Syllable HWEOM"/* D6F0 */,/*28275*/"Hangul Syllable HWEOB"/* D6F1 */, /*28276*/"Hangul Syllable HWEOBS"/* D6F2 */,/*28277*/"Hangul Syllable HWEOS"/* D6F3 */, /*28278*/"Hangul Syllable HWEOSS"/* D6F4 */,/*28279*/"Hangul Syllable HWEONG"/* D6F5 */, /*28280*/"Hangul Syllable HWEOJ"/* D6F6 */,/*28281*/"Hangul Syllable HWEOC"/* D6F7 */, /*28282*/"Hangul Syllable HWEOK"/* D6F8 */,/*28283*/"Hangul Syllable HWEOT"/* D6F9 */, /*28284*/"Hangul Syllable HWEOP"/* D6FA */,/*28285*/"Hangul Syllable HWEOH"/* D6FB */, /*28286*/"Hangul Syllable HWE"/* D6FC */,/*28287*/"Hangul Syllable HWEG"/* D6FD */, /*28288*/"Hangul Syllable HWEGG"/* D6FE */,/*28289*/"Hangul Syllable HWEGS"/* D6FF */, /*28290*/"Hangul Syllable HWEN"/* D700 */,/*28291*/"Hangul Syllable HWENJ"/* D701 */, /*28292*/"Hangul Syllable HWENH"/* D702 */,/*28293*/"Hangul Syllable HWED"/* D703 */, /*28294*/"Hangul Syllable HWEL"/* D704 */,/*28295*/"Hangul Syllable HWELG"/* D705 */, /*28296*/"Hangul Syllable HWELM"/* D706 */,/*28297*/"Hangul Syllable HWELB"/* D707 */, /*28298*/"Hangul Syllable HWELS"/* D708 */,/*28299*/"Hangul Syllable HWELT"/* D709 */, /*28300*/"Hangul Syllable HWELP"/* D70A */,/*28301*/"Hangul Syllable HWELH"/* D70B */, /*28302*/"Hangul Syllable HWEM"/* D70C */,/*28303*/"Hangul Syllable HWEB"/* D70D */, /*28304*/"Hangul Syllable HWEBS"/* D70E */,/*28305*/"Hangul Syllable HWES"/* D70F */, /*28306*/"Hangul Syllable HWESS"/* D710 */,/*28307*/"Hangul Syllable HWENG"/* D711 */, /*28308*/"Hangul Syllable HWEJ"/* D712 */,/*28309*/"Hangul Syllable HWEC"/* D713 */, /*28310*/"Hangul Syllable HWEK"/* D714 */,/*28311*/"Hangul Syllable HWET"/* D715 */, /*28312*/"Hangul Syllable HWEP"/* D716 */,/*28313*/"Hangul Syllable HWEH"/* D717 */, /*28314*/"Hangul Syllable HWI"/* D718 */,/*28315*/"Hangul Syllable HWIG"/* D719 */, /*28316*/"Hangul Syllable HWIGG"/* D71A */,/*28317*/"Hangul Syllable HWIGS"/* D71B */, /*28318*/"Hangul Syllable HWIN"/* D71C */,/*28319*/"Hangul Syllable HWINJ"/* D71D */, /*28320*/"Hangul Syllable HWINH"/* D71E */,/*28321*/"Hangul Syllable HWID"/* D71F */, /*28322*/"Hangul Syllable HWIL"/* D720 */,/*28323*/"Hangul Syllable HWILG"/* D721 */, /*28324*/"Hangul Syllable HWILM"/* D722 */,/*28325*/"Hangul Syllable HWILB"/* D723 */, /*28326*/"Hangul Syllable HWILS"/* D724 */,/*28327*/"Hangul Syllable HWILT"/* D725 */, /*28328*/"Hangul Syllable HWILP"/* D726 */,/*28329*/"Hangul Syllable HWILH"/* D727 */, /*28330*/"Hangul Syllable HWIM"/* D728 */,/*28331*/"Hangul Syllable HWIB"/* D729 */, /*28332*/"Hangul Syllable HWIBS"/* D72A */,/*28333*/"Hangul Syllable HWIS"/* D72B */, /*28334*/"Hangul Syllable HWISS"/* D72C */,/*28335*/"Hangul Syllable HWING"/* D72D */, /*28336*/"Hangul Syllable HWIJ"/* D72E */,/*28337*/"Hangul Syllable HWIC"/* D72F */, /*28338*/"Hangul Syllable HWIK"/* D730 */,/*28339*/"Hangul Syllable HWIT"/* D731 */, /*28340*/"Hangul Syllable HWIP"/* D732 */,/*28341*/"Hangul Syllable HWIH"/* D733 */, /*28342*/"Hangul Syllable HYU"/* D734 */,/*28343*/"Hangul Syllable HYUG"/* D735 */, /*28344*/"Hangul Syllable HYUGG"/* D736 */,/*28345*/"Hangul Syllable HYUGS"/* D737 */, /*28346*/"Hangul Syllable HYUN"/* D738 */,/*28347*/"Hangul Syllable HYUNJ"/* D739 */, /*28348*/"Hangul Syllable HYUNH"/* D73A */,/*28349*/"Hangul Syllable HYUD"/* D73B */, /*28350*/"Hangul Syllable HYUL"/* D73C */,/*28351*/"Hangul Syllable HYULG"/* D73D */, /*28352*/"Hangul Syllable HYULM"/* D73E */,/*28353*/"Hangul Syllable HYULB"/* D73F */, /*28354*/"Hangul Syllable HYULS"/* D740 */,/*28355*/"Hangul Syllable HYULT"/* D741 */, /*28356*/"Hangul Syllable HYULP"/* D742 */,/*28357*/"Hangul Syllable HYULH"/* D743 */, /*28358*/"Hangul Syllable HYUM"/* D744 */,/*28359*/"Hangul Syllable HYUB"/* D745 */, /*28360*/"Hangul Syllable HYUBS"/* D746 */,/*28361*/"Hangul Syllable HYUS"/* D747 */, /*28362*/"Hangul Syllable HYUSS"/* D748 */,/*28363*/"Hangul Syllable HYUNG"/* D749 */, /*28364*/"Hangul Syllable HYUJ"/* D74A */,/*28365*/"Hangul Syllable HYUC"/* D74B */, /*28366*/"Hangul Syllable HYUK"/* D74C */,/*28367*/"Hangul Syllable HYUT"/* D74D */, /*28368*/"Hangul Syllable HYUP"/* D74E */,/*28369*/"Hangul Syllable HYUH"/* D74F */, /*28370*/"Hangul Syllable HEU"/* D750 */,/*28371*/"Hangul Syllable HEUG"/* D751 */, /*28372*/"Hangul Syllable HEUGG"/* D752 */,/*28373*/"Hangul Syllable HEUGS"/* D753 */, /*28374*/"Hangul Syllable HEUN"/* D754 */,/*28375*/"Hangul Syllable HEUNJ"/* D755 */, /*28376*/"Hangul Syllable HEUNH"/* D756 */,/*28377*/"Hangul Syllable HEUD"/* D757 */, /*28378*/"Hangul Syllable HEUL"/* D758 */,/*28379*/"Hangul Syllable HEULG"/* D759 */, /*28380*/"Hangul Syllable HEULM"/* D75A */,/*28381*/"Hangul Syllable HEULB"/* D75B */, /*28382*/"Hangul Syllable HEULS"/* D75C */,/*28383*/"Hangul Syllable HEULT"/* D75D */, /*28384*/"Hangul Syllable HEULP"/* D75E */,/*28385*/"Hangul Syllable HEULH"/* D75F */, /*28386*/"Hangul Syllable HEUM"/* D760 */,/*28387*/"Hangul Syllable HEUB"/* D761 */, /*28388*/"Hangul Syllable HEUBS"/* D762 */,/*28389*/"Hangul Syllable HEUS"/* D763 */, /*28390*/"Hangul Syllable HEUSS"/* D764 */,/*28391*/"Hangul Syllable HEUNG"/* D765 */, /*28392*/"Hangul Syllable HEUJ"/* D766 */,/*28393*/"Hangul Syllable HEUC"/* D767 */, /*28394*/"Hangul Syllable HEUK"/* D768 */,/*28395*/"Hangul Syllable HEUT"/* D769 */, /*28396*/"Hangul Syllable HEUP"/* D76A */,/*28397*/"Hangul Syllable HEUH"/* D76B */, /*28398*/"Hangul Syllable HYI"/* D76C */,/*28399*/"Hangul Syllable HYIG"/* D76D */, /*28400*/"Hangul Syllable HYIGG"/* D76E */,/*28401*/"Hangul Syllable HYIGS"/* D76F */, /*28402*/"Hangul Syllable HYIN"/* D770 */,/*28403*/"Hangul Syllable HYINJ"/* D771 */, /*28404*/"Hangul Syllable HYINH"/* D772 */,/*28405*/"Hangul Syllable HYID"/* D773 */, /*28406*/"Hangul Syllable HYIL"/* D774 */,/*28407*/"Hangul Syllable HYILG"/* D775 */, /*28408*/"Hangul Syllable HYILM"/* D776 */,/*28409*/"Hangul Syllable HYILB"/* D777 */, /*28410*/"Hangul Syllable HYILS"/* D778 */,/*28411*/"Hangul Syllable HYILT"/* D779 */, /*28412*/"Hangul Syllable HYILP"/* D77A */,/*28413*/"Hangul Syllable HYILH"/* D77B */, /*28414*/"Hangul Syllable HYIM"/* D77C */,/*28415*/"Hangul Syllable HYIB"/* D77D */, /*28416*/"Hangul Syllable HYIBS"/* D77E */,/*28417*/"Hangul Syllable HYIS"/* D77F */, /*28418*/"Hangul Syllable HYISS"/* D780 */,/*28419*/"Hangul Syllable HYING"/* D781 */, /*28420*/"Hangul Syllable HYIJ"/* D782 */,/*28421*/"Hangul Syllable HYIC"/* D783 */, /*28422*/"Hangul Syllable HYIK"/* D784 */,/*28423*/"Hangul Syllable HYIT"/* D785 */, /*28424*/"Hangul Syllable HYIP"/* D786 */,/*28425*/"Hangul Syllable HYIH"/* D787 */, /*28426*/"Hangul Syllable HI"/* D788 */,/*28427*/"Hangul Syllable HIG"/* D789 */, /*28428*/"Hangul Syllable HIGG"/* D78A */,/*28429*/"Hangul Syllable HIGS"/* D78B */, /*28430*/"Hangul Syllable HIN"/* D78C */,/*28431*/"Hangul Syllable HINJ"/* D78D */, /*28432*/"Hangul Syllable HINH"/* D78E */,/*28433*/"Hangul Syllable HID"/* D78F */, /*28434*/"Hangul Syllable HIL"/* D790 */,/*28435*/"Hangul Syllable HILG"/* D791 */, /*28436*/"Hangul Syllable HILM"/* D792 */,/*28437*/"Hangul Syllable HILB"/* D793 */, /*28438*/"Hangul Syllable HILS"/* D794 */,/*28439*/"Hangul Syllable HILT"/* D795 */, /*28440*/"Hangul Syllable HILP"/* D796 */,/*28441*/"Hangul Syllable HILH"/* D797 */, /*28442*/"Hangul Syllable HIM"/* D798 */,/*28443*/"Hangul Syllable HIB"/* D799 */, /*28444*/"Hangul Syllable HIBS"/* D79A */,/*28445*/"Hangul Syllable HIS"/* D79B */, /*28446*/"Hangul Syllable HISS"/* D79C */,/*28447*/"Hangul Syllable HING"/* D79D */, /*28448*/"Hangul Syllable HIJ"/* D79E */,/*28449*/"Hangul Syllable HIC"/* D79F */, /*28450*/"Hangul Syllable HIK"/* D7A0 */,/*28451*/"Hangul Syllable HIT"/* D7A1 */, /*28452*/"Hangul Syllable HIP"/* D7A2 */,/*28453*/"Hangul Syllable HIH"/* D7A3 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,/*28466*/"HANGUL JUNGSEONG O-YEO"/* D7B0 */,/*28467*/"HANGUL JUNGSEONG O-O-I"/* D7B1 */, /*28468*/"HANGUL JUNGSEONG YO-A"/* D7B2 */,/*28469*/"HANGUL JUNGSEONG YO-AE"/* D7B3 */, /*28470*/"HANGUL JUNGSEONG YO-EO"/* D7B4 */,/*28471*/"HANGUL JUNGSEONG U-YEO"/* D7B5 */, /*28472*/"HANGUL JUNGSEONG U-I-I"/* D7B6 */,/*28473*/"HANGUL JUNGSEONG YU-AE"/* D7B7 */, /*28474*/"HANGUL JUNGSEONG YU-O"/* D7B8 */,/*28475*/"HANGUL JUNGSEONG EU-A"/* D7B9 */, /*28476*/"HANGUL JUNGSEONG EU-EO"/* D7BA */,/*28477*/"HANGUL JUNGSEONG EU-E"/* D7BB */, /*28478*/"HANGUL JUNGSEONG EU-O"/* D7BC */,/*28479*/"HANGUL JUNGSEONG I-YA-O"/* D7BD */, /*28480*/"HANGUL JUNGSEONG I-YAE"/* D7BE */,/*28481*/"HANGUL JUNGSEONG I-YEO"/* D7BF */, /*28482*/"HANGUL JUNGSEONG I-YE"/* D7C0 */,/*28483*/"HANGUL JUNGSEONG I-O-I"/* D7C1 */, /*28484*/"HANGUL JUNGSEONG I-YO"/* D7C2 */,/*28485*/"HANGUL JUNGSEONG I-YU"/* D7C3 */, /*28486*/"HANGUL JUNGSEONG I-I"/* D7C4 */,/*28487*/"HANGUL JUNGSEONG ARAEA-A"/* D7C5 */, /*28488*/"HANGUL JUNGSEONG ARAEA-E"/* D7C6 */,NULL,NULL,NULL,NULL,/*28493*/"HANGUL JONGSEONG NIEUN-RIEUL"/* D7CB */, /*28494*/"HANGUL JONGSEONG NIEUN-CHIEUCH"/* D7CC */,/*28495*/"HANGUL JONGSEONG SSANGTIKEUT"/* D7CD */, /*28496*/"HANGUL JONGSEONG SSANGTIKEUT-PIEUP"/* D7CE */,/*28497*/"HANGUL JONGSEONG TIKEUT-PIEUP"/* D7CF */, /*28498*/"HANGUL JONGSEONG TIKEUT-SIOS"/* D7D0 */,/*28499*/"HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK"/* D7D1 */, /*28500*/"HANGUL JONGSEONG TIKEUT-CIEUC"/* D7D2 */,/*28501*/"HANGUL JONGSEONG TIKEUT-CHIEUCH"/* D7D3 */, /*28502*/"HANGUL JONGSEONG TIKEUT-THIEUTH"/* D7D4 */,/*28503*/"HANGUL JONGSEONG RIEUL-SSANGKIYEOK"/* D7D5 */, /*28504*/"HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH"/* D7D6 */,/*28505*/"HANGUL JONGSEONG SSANGRIEUL-KHIEUKH"/* D7D7 */, /*28506*/"HANGUL JONGSEONG RIEUL-MIEUM-HIEUH"/* D7D8 */,/*28507*/"HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT"/* D7D9 */, /*28508*/"HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH"/* D7DA */,/*28509*/"HANGUL JONGSEONG RIEUL-YESIEUNG"/* D7DB */, /*28510*/"HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH"/* D7DC */,/*28511*/"HANGUL JONGSEONG KAPYEOUNRIEUL"/* D7DD */, /*28512*/"HANGUL JONGSEONG MIEUM-NIEUN"/* D7DE */,/*28513*/"HANGUL JONGSEONG MIEUM-SSANGNIEUN"/* D7DF */, /*28514*/"HANGUL JONGSEONG SSANGMIEUM"/* D7E0 */,/*28515*/"HANGUL JONGSEONG MIEUM-PIEUP-SIOS"/* D7E1 */, /*28516*/"HANGUL JONGSEONG MIEUM-CIEUC"/* D7E2 */,/*28517*/"HANGUL JONGSEONG PIEUP-TIKEUT"/* D7E3 */, /*28518*/"HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH"/* D7E4 */,/*28519*/"HANGUL JONGSEONG PIEUP-MIEUM"/* D7E5 */, /*28520*/"HANGUL JONGSEONG SSANGPIEUP"/* D7E6 */,/*28521*/"HANGUL JONGSEONG PIEUP-SIOS-TIKEUT"/* D7E7 */, /*28522*/"HANGUL JONGSEONG PIEUP-CIEUC"/* D7E8 */,/*28523*/"HANGUL JONGSEONG PIEUP-CHIEUCH"/* D7E9 */, /*28524*/"HANGUL JONGSEONG SIOS-MIEUM"/* D7EA */,/*28525*/"HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP"/* D7EB */, /*28526*/"HANGUL JONGSEONG SSANGSIOS-KIYEOK"/* D7EC */,/*28527*/"HANGUL JONGSEONG SSANGSIOS-TIKEUT"/* D7ED */, /*28528*/"HANGUL JONGSEONG SIOS-PANSIOS"/* D7EE */,/*28529*/"HANGUL JONGSEONG SIOS-CIEUC"/* D7EF */, /*28530*/"HANGUL JONGSEONG SIOS-CHIEUCH"/* D7F0 */,/*28531*/"HANGUL JONGSEONG SIOS-THIEUTH"/* D7F1 */, /*28532*/"HANGUL JONGSEONG SIOS-HIEUH"/* D7F2 */,/*28533*/"HANGUL JONGSEONG PANSIOS-PIEUP"/* D7F3 */, /*28534*/"HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP"/* D7F4 */,/*28535*/"HANGUL JONGSEONG YESIEUNG-MIEUM"/* D7F5 */, /*28536*/"HANGUL JONGSEONG YESIEUNG-HIEUH"/* D7F6 */,/*28537*/"HANGUL JONGSEONG CIEUC-PIEUP"/* D7F7 */, /*28538*/"HANGUL JONGSEONG CIEUC-SSANGPIEUP"/* D7F8 */,/*28539*/"HANGUL JONGSEONG SSANGCIEUC"/* D7F9 */, /*28540*/"HANGUL JONGSEONG PHIEUPH-SIOS"/* D7FA */,/*28541*/"HANGUL JONGSEONG PHIEUPH-THIEUTH"/* D7FB */,NULL,NULL,NULL, NULL,/*28546*/""/* D800 */,/*28547*/""/* DB80 */, /*28548*/""/* DC00 */,/*28549*/""/* E000 */, /*28550*/"CJK COMPATIBILITY IDEOGRAPH-F900"/* F900 */,/*28551*/"CJK COMPATIBILITY IDEOGRAPH-F901"/* F901 */, /*28552*/"CJK COMPATIBILITY IDEOGRAPH-F902"/* F902 */,/*28553*/"CJK COMPATIBILITY IDEOGRAPH-F903"/* F903 */, /*28554*/"CJK COMPATIBILITY IDEOGRAPH-F904"/* F904 */,/*28555*/"CJK COMPATIBILITY IDEOGRAPH-F905"/* F905 */, /*28556*/"CJK COMPATIBILITY IDEOGRAPH-F906"/* F906 */,/*28557*/"CJK COMPATIBILITY IDEOGRAPH-F907"/* F907 */, /*28558*/"CJK COMPATIBILITY IDEOGRAPH-F908"/* F908 */,/*28559*/"CJK COMPATIBILITY IDEOGRAPH-F909"/* F909 */, /*28560*/"CJK COMPATIBILITY IDEOGRAPH-F90A"/* F90A */,/*28561*/"CJK COMPATIBILITY IDEOGRAPH-F90B"/* F90B */, /*28562*/"CJK COMPATIBILITY IDEOGRAPH-F90C"/* F90C */,/*28563*/"CJK COMPATIBILITY IDEOGRAPH-F90D"/* F90D */, /*28564*/"CJK COMPATIBILITY IDEOGRAPH-F90E"/* F90E */,/*28565*/"CJK COMPATIBILITY IDEOGRAPH-F90F"/* F90F */, /*28566*/"CJK COMPATIBILITY IDEOGRAPH-F910"/* F910 */,/*28567*/"CJK COMPATIBILITY IDEOGRAPH-F911"/* F911 */, /*28568*/"CJK COMPATIBILITY IDEOGRAPH-F912"/* F912 */,/*28569*/"CJK COMPATIBILITY IDEOGRAPH-F913"/* F913 */, /*28570*/"CJK COMPATIBILITY IDEOGRAPH-F914"/* F914 */,/*28571*/"CJK COMPATIBILITY IDEOGRAPH-F915"/* F915 */, /*28572*/"CJK COMPATIBILITY IDEOGRAPH-F916"/* F916 */,/*28573*/"CJK COMPATIBILITY IDEOGRAPH-F917"/* F917 */, /*28574*/"CJK COMPATIBILITY IDEOGRAPH-F918"/* F918 */,/*28575*/"CJK COMPATIBILITY IDEOGRAPH-F919"/* F919 */, /*28576*/"CJK COMPATIBILITY IDEOGRAPH-F91A"/* F91A */,/*28577*/"CJK COMPATIBILITY IDEOGRAPH-F91B"/* F91B */, /*28578*/"CJK COMPATIBILITY IDEOGRAPH-F91C"/* F91C */,/*28579*/"CJK COMPATIBILITY IDEOGRAPH-F91D"/* F91D */, /*28580*/"CJK COMPATIBILITY IDEOGRAPH-F91E"/* F91E */,/*28581*/"CJK COMPATIBILITY IDEOGRAPH-F91F"/* F91F */, /*28582*/"CJK COMPATIBILITY IDEOGRAPH-F920"/* F920 */,/*28583*/"CJK COMPATIBILITY IDEOGRAPH-F921"/* F921 */, /*28584*/"CJK COMPATIBILITY IDEOGRAPH-F922"/* F922 */,/*28585*/"CJK COMPATIBILITY IDEOGRAPH-F923"/* F923 */, /*28586*/"CJK COMPATIBILITY IDEOGRAPH-F924"/* F924 */,/*28587*/"CJK COMPATIBILITY IDEOGRAPH-F925"/* F925 */, /*28588*/"CJK COMPATIBILITY IDEOGRAPH-F926"/* F926 */,/*28589*/"CJK COMPATIBILITY IDEOGRAPH-F927"/* F927 */, /*28590*/"CJK COMPATIBILITY IDEOGRAPH-F928"/* F928 */,/*28591*/"CJK COMPATIBILITY IDEOGRAPH-F929"/* F929 */, /*28592*/"CJK COMPATIBILITY IDEOGRAPH-F92A"/* F92A */,/*28593*/"CJK COMPATIBILITY IDEOGRAPH-F92B"/* F92B */, /*28594*/"CJK COMPATIBILITY IDEOGRAPH-F92C"/* F92C */,/*28595*/"CJK COMPATIBILITY IDEOGRAPH-F92D"/* F92D */, /*28596*/"CJK COMPATIBILITY IDEOGRAPH-F92E"/* F92E */,/*28597*/"CJK COMPATIBILITY IDEOGRAPH-F92F"/* F92F */, /*28598*/"CJK COMPATIBILITY IDEOGRAPH-F930"/* F930 */,/*28599*/"CJK COMPATIBILITY IDEOGRAPH-F931"/* F931 */, /*28600*/"CJK COMPATIBILITY IDEOGRAPH-F932"/* F932 */,/*28601*/"CJK COMPATIBILITY IDEOGRAPH-F933"/* F933 */, /*28602*/"CJK COMPATIBILITY IDEOGRAPH-F934"/* F934 */,/*28603*/"CJK COMPATIBILITY IDEOGRAPH-F935"/* F935 */, /*28604*/"CJK COMPATIBILITY IDEOGRAPH-F936"/* F936 */,/*28605*/"CJK COMPATIBILITY IDEOGRAPH-F937"/* F937 */, /*28606*/"CJK COMPATIBILITY IDEOGRAPH-F938"/* F938 */,/*28607*/"CJK COMPATIBILITY IDEOGRAPH-F939"/* F939 */, /*28608*/"CJK COMPATIBILITY IDEOGRAPH-F93A"/* F93A */,/*28609*/"CJK COMPATIBILITY IDEOGRAPH-F93B"/* F93B */, /*28610*/"CJK COMPATIBILITY IDEOGRAPH-F93C"/* F93C */,/*28611*/"CJK COMPATIBILITY IDEOGRAPH-F93D"/* F93D */, /*28612*/"CJK COMPATIBILITY IDEOGRAPH-F93E"/* F93E */,/*28613*/"CJK COMPATIBILITY IDEOGRAPH-F93F"/* F93F */, /*28614*/"CJK COMPATIBILITY IDEOGRAPH-F940"/* F940 */,/*28615*/"CJK COMPATIBILITY IDEOGRAPH-F941"/* F941 */, /*28616*/"CJK COMPATIBILITY IDEOGRAPH-F942"/* F942 */,/*28617*/"CJK COMPATIBILITY IDEOGRAPH-F943"/* F943 */, /*28618*/"CJK COMPATIBILITY IDEOGRAPH-F944"/* F944 */,/*28619*/"CJK COMPATIBILITY IDEOGRAPH-F945"/* F945 */, /*28620*/"CJK COMPATIBILITY IDEOGRAPH-F946"/* F946 */,/*28621*/"CJK COMPATIBILITY IDEOGRAPH-F947"/* F947 */, /*28622*/"CJK COMPATIBILITY IDEOGRAPH-F948"/* F948 */,/*28623*/"CJK COMPATIBILITY IDEOGRAPH-F949"/* F949 */, /*28624*/"CJK COMPATIBILITY IDEOGRAPH-F94A"/* F94A */,/*28625*/"CJK COMPATIBILITY IDEOGRAPH-F94B"/* F94B */, /*28626*/"CJK COMPATIBILITY IDEOGRAPH-F94C"/* F94C */,/*28627*/"CJK COMPATIBILITY IDEOGRAPH-F94D"/* F94D */, /*28628*/"CJK COMPATIBILITY IDEOGRAPH-F94E"/* F94E */,/*28629*/"CJK COMPATIBILITY IDEOGRAPH-F94F"/* F94F */, /*28630*/"CJK COMPATIBILITY IDEOGRAPH-F950"/* F950 */,/*28631*/"CJK COMPATIBILITY IDEOGRAPH-F951"/* F951 */, /*28632*/"CJK COMPATIBILITY IDEOGRAPH-F952"/* F952 */,/*28633*/"CJK COMPATIBILITY IDEOGRAPH-F953"/* F953 */, /*28634*/"CJK COMPATIBILITY IDEOGRAPH-F954"/* F954 */,/*28635*/"CJK COMPATIBILITY IDEOGRAPH-F955"/* F955 */, /*28636*/"CJK COMPATIBILITY IDEOGRAPH-F956"/* F956 */,/*28637*/"CJK COMPATIBILITY IDEOGRAPH-F957"/* F957 */, /*28638*/"CJK COMPATIBILITY IDEOGRAPH-F958"/* F958 */,/*28639*/"CJK COMPATIBILITY IDEOGRAPH-F959"/* F959 */, /*28640*/"CJK COMPATIBILITY IDEOGRAPH-F95A"/* F95A */,/*28641*/"CJK COMPATIBILITY IDEOGRAPH-F95B"/* F95B */, /*28642*/"CJK COMPATIBILITY IDEOGRAPH-F95C"/* F95C */,/*28643*/"CJK COMPATIBILITY IDEOGRAPH-F95D"/* F95D */, /*28644*/"CJK COMPATIBILITY IDEOGRAPH-F95E"/* F95E */,/*28645*/"CJK COMPATIBILITY IDEOGRAPH-F95F"/* F95F */, /*28646*/"CJK COMPATIBILITY IDEOGRAPH-F960"/* F960 */,/*28647*/"CJK COMPATIBILITY IDEOGRAPH-F961"/* F961 */, /*28648*/"CJK COMPATIBILITY IDEOGRAPH-F962"/* F962 */,/*28649*/"CJK COMPATIBILITY IDEOGRAPH-F963"/* F963 */, /*28650*/"CJK COMPATIBILITY IDEOGRAPH-F964"/* F964 */,/*28651*/"CJK COMPATIBILITY IDEOGRAPH-F965"/* F965 */, /*28652*/"CJK COMPATIBILITY IDEOGRAPH-F966"/* F966 */,/*28653*/"CJK COMPATIBILITY IDEOGRAPH-F967"/* F967 */, /*28654*/"CJK COMPATIBILITY IDEOGRAPH-F968"/* F968 */,/*28655*/"CJK COMPATIBILITY IDEOGRAPH-F969"/* F969 */, /*28656*/"CJK COMPATIBILITY IDEOGRAPH-F96A"/* F96A */,/*28657*/"CJK COMPATIBILITY IDEOGRAPH-F96B"/* F96B */, /*28658*/"CJK COMPATIBILITY IDEOGRAPH-F96C"/* F96C */,/*28659*/"CJK COMPATIBILITY IDEOGRAPH-F96D"/* F96D */, /*28660*/"CJK COMPATIBILITY IDEOGRAPH-F96E"/* F96E */,/*28661*/"CJK COMPATIBILITY IDEOGRAPH-F96F"/* F96F */, /*28662*/"CJK COMPATIBILITY IDEOGRAPH-F970"/* F970 */,/*28663*/"CJK COMPATIBILITY IDEOGRAPH-F971"/* F971 */, /*28664*/"CJK COMPATIBILITY IDEOGRAPH-F972"/* F972 */,/*28665*/"CJK COMPATIBILITY IDEOGRAPH-F973"/* F973 */, /*28666*/"CJK COMPATIBILITY IDEOGRAPH-F974"/* F974 */,/*28667*/"CJK COMPATIBILITY IDEOGRAPH-F975"/* F975 */, /*28668*/"CJK COMPATIBILITY IDEOGRAPH-F976"/* F976 */,/*28669*/"CJK COMPATIBILITY IDEOGRAPH-F977"/* F977 */, /*28670*/"CJK COMPATIBILITY IDEOGRAPH-F978"/* F978 */,/*28671*/"CJK COMPATIBILITY IDEOGRAPH-F979"/* F979 */, /*28672*/"CJK COMPATIBILITY IDEOGRAPH-F97A"/* F97A */,/*28673*/"CJK COMPATIBILITY IDEOGRAPH-F97B"/* F97B */, /*28674*/"CJK COMPATIBILITY IDEOGRAPH-F97C"/* F97C */,/*28675*/"CJK COMPATIBILITY IDEOGRAPH-F97D"/* F97D */, /*28676*/"CJK COMPATIBILITY IDEOGRAPH-F97E"/* F97E */,/*28677*/"CJK COMPATIBILITY IDEOGRAPH-F97F"/* F97F */, /*28678*/"CJK COMPATIBILITY IDEOGRAPH-F980"/* F980 */,/*28679*/"CJK COMPATIBILITY IDEOGRAPH-F981"/* F981 */, /*28680*/"CJK COMPATIBILITY IDEOGRAPH-F982"/* F982 */,/*28681*/"CJK COMPATIBILITY IDEOGRAPH-F983"/* F983 */, /*28682*/"CJK COMPATIBILITY IDEOGRAPH-F984"/* F984 */,/*28683*/"CJK COMPATIBILITY IDEOGRAPH-F985"/* F985 */, /*28684*/"CJK COMPATIBILITY IDEOGRAPH-F986"/* F986 */,/*28685*/"CJK COMPATIBILITY IDEOGRAPH-F987"/* F987 */, /*28686*/"CJK COMPATIBILITY IDEOGRAPH-F988"/* F988 */,/*28687*/"CJK COMPATIBILITY IDEOGRAPH-F989"/* F989 */, /*28688*/"CJK COMPATIBILITY IDEOGRAPH-F98A"/* F98A */,/*28689*/"CJK COMPATIBILITY IDEOGRAPH-F98B"/* F98B */, /*28690*/"CJK COMPATIBILITY IDEOGRAPH-F98C"/* F98C */,/*28691*/"CJK COMPATIBILITY IDEOGRAPH-F98D"/* F98D */, /*28692*/"CJK COMPATIBILITY IDEOGRAPH-F98E"/* F98E */,/*28693*/"CJK COMPATIBILITY IDEOGRAPH-F98F"/* F98F */, /*28694*/"CJK COMPATIBILITY IDEOGRAPH-F990"/* F990 */,/*28695*/"CJK COMPATIBILITY IDEOGRAPH-F991"/* F991 */, /*28696*/"CJK COMPATIBILITY IDEOGRAPH-F992"/* F992 */,/*28697*/"CJK COMPATIBILITY IDEOGRAPH-F993"/* F993 */, /*28698*/"CJK COMPATIBILITY IDEOGRAPH-F994"/* F994 */,/*28699*/"CJK COMPATIBILITY IDEOGRAPH-F995"/* F995 */, /*28700*/"CJK COMPATIBILITY IDEOGRAPH-F996"/* F996 */,/*28701*/"CJK COMPATIBILITY IDEOGRAPH-F997"/* F997 */, /*28702*/"CJK COMPATIBILITY IDEOGRAPH-F998"/* F998 */,/*28703*/"CJK COMPATIBILITY IDEOGRAPH-F999"/* F999 */, /*28704*/"CJK COMPATIBILITY IDEOGRAPH-F99A"/* F99A */,/*28705*/"CJK COMPATIBILITY IDEOGRAPH-F99B"/* F99B */, /*28706*/"CJK COMPATIBILITY IDEOGRAPH-F99C"/* F99C */,/*28707*/"CJK COMPATIBILITY IDEOGRAPH-F99D"/* F99D */, /*28708*/"CJK COMPATIBILITY IDEOGRAPH-F99E"/* F99E */,/*28709*/"CJK COMPATIBILITY IDEOGRAPH-F99F"/* F99F */, /*28710*/"CJK COMPATIBILITY IDEOGRAPH-F9A0"/* F9A0 */,/*28711*/"CJK COMPATIBILITY IDEOGRAPH-F9A1"/* F9A1 */, /*28712*/"CJK COMPATIBILITY IDEOGRAPH-F9A2"/* F9A2 */,/*28713*/"CJK COMPATIBILITY IDEOGRAPH-F9A3"/* F9A3 */, /*28714*/"CJK COMPATIBILITY IDEOGRAPH-F9A4"/* F9A4 */,/*28715*/"CJK COMPATIBILITY IDEOGRAPH-F9A5"/* F9A5 */, /*28716*/"CJK COMPATIBILITY IDEOGRAPH-F9A6"/* F9A6 */,/*28717*/"CJK COMPATIBILITY IDEOGRAPH-F9A7"/* F9A7 */, /*28718*/"CJK COMPATIBILITY IDEOGRAPH-F9A8"/* F9A8 */,/*28719*/"CJK COMPATIBILITY IDEOGRAPH-F9A9"/* F9A9 */, /*28720*/"CJK COMPATIBILITY IDEOGRAPH-F9AA"/* F9AA */,/*28721*/"CJK COMPATIBILITY IDEOGRAPH-F9AB"/* F9AB */, /*28722*/"CJK COMPATIBILITY IDEOGRAPH-F9AC"/* F9AC */,/*28723*/"CJK COMPATIBILITY IDEOGRAPH-F9AD"/* F9AD */, /*28724*/"CJK COMPATIBILITY IDEOGRAPH-F9AE"/* F9AE */,/*28725*/"CJK COMPATIBILITY IDEOGRAPH-F9AF"/* F9AF */, /*28726*/"CJK COMPATIBILITY IDEOGRAPH-F9B0"/* F9B0 */,/*28727*/"CJK COMPATIBILITY IDEOGRAPH-F9B1"/* F9B1 */, /*28728*/"CJK COMPATIBILITY IDEOGRAPH-F9B2"/* F9B2 */,/*28729*/"CJK COMPATIBILITY IDEOGRAPH-F9B3"/* F9B3 */, /*28730*/"CJK COMPATIBILITY IDEOGRAPH-F9B4"/* F9B4 */,/*28731*/"CJK COMPATIBILITY IDEOGRAPH-F9B5"/* F9B5 */, /*28732*/"CJK COMPATIBILITY IDEOGRAPH-F9B6"/* F9B6 */,/*28733*/"CJK COMPATIBILITY IDEOGRAPH-F9B7"/* F9B7 */, /*28734*/"CJK COMPATIBILITY IDEOGRAPH-F9B8"/* F9B8 */,/*28735*/"CJK COMPATIBILITY IDEOGRAPH-F9B9"/* F9B9 */, /*28736*/"CJK COMPATIBILITY IDEOGRAPH-F9BA"/* F9BA */,/*28737*/"CJK COMPATIBILITY IDEOGRAPH-F9BB"/* F9BB */, /*28738*/"CJK COMPATIBILITY IDEOGRAPH-F9BC"/* F9BC */,/*28739*/"CJK COMPATIBILITY IDEOGRAPH-F9BD"/* F9BD */, /*28740*/"CJK COMPATIBILITY IDEOGRAPH-F9BE"/* F9BE */,/*28741*/"CJK COMPATIBILITY IDEOGRAPH-F9BF"/* F9BF */, /*28742*/"CJK COMPATIBILITY IDEOGRAPH-F9C0"/* F9C0 */,/*28743*/"CJK COMPATIBILITY IDEOGRAPH-F9C1"/* F9C1 */, /*28744*/"CJK COMPATIBILITY IDEOGRAPH-F9C2"/* F9C2 */,/*28745*/"CJK COMPATIBILITY IDEOGRAPH-F9C3"/* F9C3 */, /*28746*/"CJK COMPATIBILITY IDEOGRAPH-F9C4"/* F9C4 */,/*28747*/"CJK COMPATIBILITY IDEOGRAPH-F9C5"/* F9C5 */, /*28748*/"CJK COMPATIBILITY IDEOGRAPH-F9C6"/* F9C6 */,/*28749*/"CJK COMPATIBILITY IDEOGRAPH-F9C7"/* F9C7 */, /*28750*/"CJK COMPATIBILITY IDEOGRAPH-F9C8"/* F9C8 */,/*28751*/"CJK COMPATIBILITY IDEOGRAPH-F9C9"/* F9C9 */, /*28752*/"CJK COMPATIBILITY IDEOGRAPH-F9CA"/* F9CA */,/*28753*/"CJK COMPATIBILITY IDEOGRAPH-F9CB"/* F9CB */, /*28754*/"CJK COMPATIBILITY IDEOGRAPH-F9CC"/* F9CC */,/*28755*/"CJK COMPATIBILITY IDEOGRAPH-F9CD"/* F9CD */, /*28756*/"CJK COMPATIBILITY IDEOGRAPH-F9CE"/* F9CE */,/*28757*/"CJK COMPATIBILITY IDEOGRAPH-F9CF"/* F9CF */, /*28758*/"CJK COMPATIBILITY IDEOGRAPH-F9D0"/* F9D0 */,/*28759*/"CJK COMPATIBILITY IDEOGRAPH-F9D1"/* F9D1 */, /*28760*/"CJK COMPATIBILITY IDEOGRAPH-F9D2"/* F9D2 */,/*28761*/"CJK COMPATIBILITY IDEOGRAPH-F9D3"/* F9D3 */, /*28762*/"CJK COMPATIBILITY IDEOGRAPH-F9D4"/* F9D4 */,/*28763*/"CJK COMPATIBILITY IDEOGRAPH-F9D5"/* F9D5 */, /*28764*/"CJK COMPATIBILITY IDEOGRAPH-F9D6"/* F9D6 */,/*28765*/"CJK COMPATIBILITY IDEOGRAPH-F9D7"/* F9D7 */, /*28766*/"CJK COMPATIBILITY IDEOGRAPH-F9D8"/* F9D8 */,/*28767*/"CJK COMPATIBILITY IDEOGRAPH-F9D9"/* F9D9 */, /*28768*/"CJK COMPATIBILITY IDEOGRAPH-F9DA"/* F9DA */,/*28769*/"CJK COMPATIBILITY IDEOGRAPH-F9DB"/* F9DB */, /*28770*/"CJK COMPATIBILITY IDEOGRAPH-F9DC"/* F9DC */,/*28771*/"CJK COMPATIBILITY IDEOGRAPH-F9DD"/* F9DD */, /*28772*/"CJK COMPATIBILITY IDEOGRAPH-F9DE"/* F9DE */,/*28773*/"CJK COMPATIBILITY IDEOGRAPH-F9DF"/* F9DF */, /*28774*/"CJK COMPATIBILITY IDEOGRAPH-F9E0"/* F9E0 */,/*28775*/"CJK COMPATIBILITY IDEOGRAPH-F9E1"/* F9E1 */, /*28776*/"CJK COMPATIBILITY IDEOGRAPH-F9E2"/* F9E2 */,/*28777*/"CJK COMPATIBILITY IDEOGRAPH-F9E3"/* F9E3 */, /*28778*/"CJK COMPATIBILITY IDEOGRAPH-F9E4"/* F9E4 */,/*28779*/"CJK COMPATIBILITY IDEOGRAPH-F9E5"/* F9E5 */, /*28780*/"CJK COMPATIBILITY IDEOGRAPH-F9E6"/* F9E6 */,/*28781*/"CJK COMPATIBILITY IDEOGRAPH-F9E7"/* F9E7 */, /*28782*/"CJK COMPATIBILITY IDEOGRAPH-F9E8"/* F9E8 */,/*28783*/"CJK COMPATIBILITY IDEOGRAPH-F9E9"/* F9E9 */, /*28784*/"CJK COMPATIBILITY IDEOGRAPH-F9EA"/* F9EA */,/*28785*/"CJK COMPATIBILITY IDEOGRAPH-F9EB"/* F9EB */, /*28786*/"CJK COMPATIBILITY IDEOGRAPH-F9EC"/* F9EC */,/*28787*/"CJK COMPATIBILITY IDEOGRAPH-F9ED"/* F9ED */, /*28788*/"CJK COMPATIBILITY IDEOGRAPH-F9EE"/* F9EE */,/*28789*/"CJK COMPATIBILITY IDEOGRAPH-F9EF"/* F9EF */, /*28790*/"CJK COMPATIBILITY IDEOGRAPH-F9F0"/* F9F0 */,/*28791*/"CJK COMPATIBILITY IDEOGRAPH-F9F1"/* F9F1 */, /*28792*/"CJK COMPATIBILITY IDEOGRAPH-F9F2"/* F9F2 */,/*28793*/"CJK COMPATIBILITY IDEOGRAPH-F9F3"/* F9F3 */, /*28794*/"CJK COMPATIBILITY IDEOGRAPH-F9F4"/* F9F4 */,/*28795*/"CJK COMPATIBILITY IDEOGRAPH-F9F5"/* F9F5 */, /*28796*/"CJK COMPATIBILITY IDEOGRAPH-F9F6"/* F9F6 */,/*28797*/"CJK COMPATIBILITY IDEOGRAPH-F9F7"/* F9F7 */, /*28798*/"CJK COMPATIBILITY IDEOGRAPH-F9F8"/* F9F8 */,/*28799*/"CJK COMPATIBILITY IDEOGRAPH-F9F9"/* F9F9 */, /*28800*/"CJK COMPATIBILITY IDEOGRAPH-F9FA"/* F9FA */,/*28801*/"CJK COMPATIBILITY IDEOGRAPH-F9FB"/* F9FB */, /*28802*/"CJK COMPATIBILITY IDEOGRAPH-F9FC"/* F9FC */,/*28803*/"CJK COMPATIBILITY IDEOGRAPH-F9FD"/* F9FD */, /*28804*/"CJK COMPATIBILITY IDEOGRAPH-F9FE"/* F9FE */,/*28805*/"CJK COMPATIBILITY IDEOGRAPH-F9FF"/* F9FF */, /*28806*/"CJK COMPATIBILITY IDEOGRAPH-FA00"/* FA00 */,/*28807*/"CJK COMPATIBILITY IDEOGRAPH-FA01"/* FA01 */, /*28808*/"CJK COMPATIBILITY IDEOGRAPH-FA02"/* FA02 */,/*28809*/"CJK COMPATIBILITY IDEOGRAPH-FA03"/* FA03 */, /*28810*/"CJK COMPATIBILITY IDEOGRAPH-FA04"/* FA04 */,/*28811*/"CJK COMPATIBILITY IDEOGRAPH-FA05"/* FA05 */, /*28812*/"CJK COMPATIBILITY IDEOGRAPH-FA06"/* FA06 */,/*28813*/"CJK COMPATIBILITY IDEOGRAPH-FA07"/* FA07 */, /*28814*/"CJK COMPATIBILITY IDEOGRAPH-FA08"/* FA08 */,/*28815*/"CJK COMPATIBILITY IDEOGRAPH-FA09"/* FA09 */, /*28816*/"CJK COMPATIBILITY IDEOGRAPH-FA0A"/* FA0A */,/*28817*/"CJK COMPATIBILITY IDEOGRAPH-FA0B"/* FA0B */, /*28818*/"CJK COMPATIBILITY IDEOGRAPH-FA0C"/* FA0C */,/*28819*/"CJK COMPATIBILITY IDEOGRAPH-FA0D"/* FA0D */, /*28820*/"CJK COMPATIBILITY IDEOGRAPH-FA0E"/* FA0E */,/*28821*/"CJK COMPATIBILITY IDEOGRAPH-FA0F"/* FA0F */, /*28822*/"CJK COMPATIBILITY IDEOGRAPH-FA10"/* FA10 */,/*28823*/"CJK COMPATIBILITY IDEOGRAPH-FA11"/* FA11 */, /*28824*/"CJK COMPATIBILITY IDEOGRAPH-FA12"/* FA12 */,/*28825*/"CJK COMPATIBILITY IDEOGRAPH-FA13"/* FA13 */, /*28826*/"CJK COMPATIBILITY IDEOGRAPH-FA14"/* FA14 */,/*28827*/"CJK COMPATIBILITY IDEOGRAPH-FA15"/* FA15 */, /*28828*/"CJK COMPATIBILITY IDEOGRAPH-FA16"/* FA16 */,/*28829*/"CJK COMPATIBILITY IDEOGRAPH-FA17"/* FA17 */, /*28830*/"CJK COMPATIBILITY IDEOGRAPH-FA18"/* FA18 */,/*28831*/"CJK COMPATIBILITY IDEOGRAPH-FA19"/* FA19 */, /*28832*/"CJK COMPATIBILITY IDEOGRAPH-FA1A"/* FA1A */,/*28833*/"CJK COMPATIBILITY IDEOGRAPH-FA1B"/* FA1B */, /*28834*/"CJK COMPATIBILITY IDEOGRAPH-FA1C"/* FA1C */,/*28835*/"CJK COMPATIBILITY IDEOGRAPH-FA1D"/* FA1D */, /*28836*/"CJK COMPATIBILITY IDEOGRAPH-FA1E"/* FA1E */,/*28837*/"CJK COMPATIBILITY IDEOGRAPH-FA1F"/* FA1F */, /*28838*/"CJK COMPATIBILITY IDEOGRAPH-FA20"/* FA20 */,/*28839*/"CJK COMPATIBILITY IDEOGRAPH-FA21"/* FA21 */, /*28840*/"CJK COMPATIBILITY IDEOGRAPH-FA22"/* FA22 */,/*28841*/"CJK COMPATIBILITY IDEOGRAPH-FA23"/* FA23 */, /*28842*/"CJK COMPATIBILITY IDEOGRAPH-FA24"/* FA24 */,/*28843*/"CJK COMPATIBILITY IDEOGRAPH-FA25"/* FA25 */, /*28844*/"CJK COMPATIBILITY IDEOGRAPH-FA26"/* FA26 */,/*28845*/"CJK COMPATIBILITY IDEOGRAPH-FA27"/* FA27 */, /*28846*/"CJK COMPATIBILITY IDEOGRAPH-FA28"/* FA28 */,/*28847*/"CJK COMPATIBILITY IDEOGRAPH-FA29"/* FA29 */, /*28848*/"CJK COMPATIBILITY IDEOGRAPH-FA2A"/* FA2A */,/*28849*/"CJK COMPATIBILITY IDEOGRAPH-FA2B"/* FA2B */, /*28850*/"CJK COMPATIBILITY IDEOGRAPH-FA2C"/* FA2C */,/*28851*/"CJK COMPATIBILITY IDEOGRAPH-FA2D"/* FA2D */, /*28852*/"CJK COMPATIBILITY IDEOGRAPH-FA2E"/* FA2E */,/*28853*/"CJK COMPATIBILITY IDEOGRAPH-FA2F"/* FA2F */, /*28854*/"CJK COMPATIBILITY IDEOGRAPH-FA30"/* FA30 */,/*28855*/"CJK COMPATIBILITY IDEOGRAPH-FA31"/* FA31 */, /*28856*/"CJK COMPATIBILITY IDEOGRAPH-FA32"/* FA32 */,/*28857*/"CJK COMPATIBILITY IDEOGRAPH-FA33"/* FA33 */, /*28858*/"CJK COMPATIBILITY IDEOGRAPH-FA34"/* FA34 */,/*28859*/"CJK COMPATIBILITY IDEOGRAPH-FA35"/* FA35 */, /*28860*/"CJK COMPATIBILITY IDEOGRAPH-FA36"/* FA36 */,/*28861*/"CJK COMPATIBILITY IDEOGRAPH-FA37"/* FA37 */, /*28862*/"CJK COMPATIBILITY IDEOGRAPH-FA38"/* FA38 */,/*28863*/"CJK COMPATIBILITY IDEOGRAPH-FA39"/* FA39 */, /*28864*/"CJK COMPATIBILITY IDEOGRAPH-FA3A"/* FA3A */,/*28865*/"CJK COMPATIBILITY IDEOGRAPH-FA3B"/* FA3B */, /*28866*/"CJK COMPATIBILITY IDEOGRAPH-FA3C"/* FA3C */,/*28867*/"CJK COMPATIBILITY IDEOGRAPH-FA3D"/* FA3D */, /*28868*/"CJK COMPATIBILITY IDEOGRAPH-FA3E"/* FA3E */,/*28869*/"CJK COMPATIBILITY IDEOGRAPH-FA3F"/* FA3F */, /*28870*/"CJK COMPATIBILITY IDEOGRAPH-FA40"/* FA40 */,/*28871*/"CJK COMPATIBILITY IDEOGRAPH-FA41"/* FA41 */, /*28872*/"CJK COMPATIBILITY IDEOGRAPH-FA42"/* FA42 */,/*28873*/"CJK COMPATIBILITY IDEOGRAPH-FA43"/* FA43 */, /*28874*/"CJK COMPATIBILITY IDEOGRAPH-FA44"/* FA44 */,/*28875*/"CJK COMPATIBILITY IDEOGRAPH-FA45"/* FA45 */, /*28876*/"CJK COMPATIBILITY IDEOGRAPH-FA46"/* FA46 */,/*28877*/"CJK COMPATIBILITY IDEOGRAPH-FA47"/* FA47 */, /*28878*/"CJK COMPATIBILITY IDEOGRAPH-FA48"/* FA48 */,/*28879*/"CJK COMPATIBILITY IDEOGRAPH-FA49"/* FA49 */, /*28880*/"CJK COMPATIBILITY IDEOGRAPH-FA4A"/* FA4A */,/*28881*/"CJK COMPATIBILITY IDEOGRAPH-FA4B"/* FA4B */, /*28882*/"CJK COMPATIBILITY IDEOGRAPH-FA4C"/* FA4C */,/*28883*/"CJK COMPATIBILITY IDEOGRAPH-FA4D"/* FA4D */, /*28884*/"CJK COMPATIBILITY IDEOGRAPH-FA4E"/* FA4E */,/*28885*/"CJK COMPATIBILITY IDEOGRAPH-FA4F"/* FA4F */, /*28886*/"CJK COMPATIBILITY IDEOGRAPH-FA50"/* FA50 */,/*28887*/"CJK COMPATIBILITY IDEOGRAPH-FA51"/* FA51 */, /*28888*/"CJK COMPATIBILITY IDEOGRAPH-FA52"/* FA52 */,/*28889*/"CJK COMPATIBILITY IDEOGRAPH-FA53"/* FA53 */, /*28890*/"CJK COMPATIBILITY IDEOGRAPH-FA54"/* FA54 */,/*28891*/"CJK COMPATIBILITY IDEOGRAPH-FA55"/* FA55 */, /*28892*/"CJK COMPATIBILITY IDEOGRAPH-FA56"/* FA56 */,/*28893*/"CJK COMPATIBILITY IDEOGRAPH-FA57"/* FA57 */, /*28894*/"CJK COMPATIBILITY IDEOGRAPH-FA58"/* FA58 */,/*28895*/"CJK COMPATIBILITY IDEOGRAPH-FA59"/* FA59 */, /*28896*/"CJK COMPATIBILITY IDEOGRAPH-FA5A"/* FA5A */,/*28897*/"CJK COMPATIBILITY IDEOGRAPH-FA5B"/* FA5B */, /*28898*/"CJK COMPATIBILITY IDEOGRAPH-FA5C"/* FA5C */,/*28899*/"CJK COMPATIBILITY IDEOGRAPH-FA5D"/* FA5D */, /*28900*/"CJK COMPATIBILITY IDEOGRAPH-FA5E"/* FA5E */,/*28901*/"CJK COMPATIBILITY IDEOGRAPH-FA5F"/* FA5F */, /*28902*/"CJK COMPATIBILITY IDEOGRAPH-FA60"/* FA60 */,/*28903*/"CJK COMPATIBILITY IDEOGRAPH-FA61"/* FA61 */, /*28904*/"CJK COMPATIBILITY IDEOGRAPH-FA62"/* FA62 */,/*28905*/"CJK COMPATIBILITY IDEOGRAPH-FA63"/* FA63 */, /*28906*/"CJK COMPATIBILITY IDEOGRAPH-FA64"/* FA64 */,/*28907*/"CJK COMPATIBILITY IDEOGRAPH-FA65"/* FA65 */, /*28908*/"CJK COMPATIBILITY IDEOGRAPH-FA66"/* FA66 */,/*28909*/"CJK COMPATIBILITY IDEOGRAPH-FA67"/* FA67 */, /*28910*/"CJK COMPATIBILITY IDEOGRAPH-FA68"/* FA68 */,/*28911*/"CJK COMPATIBILITY IDEOGRAPH-FA69"/* FA69 */, /*28912*/"CJK COMPATIBILITY IDEOGRAPH-FA6A"/* FA6A */,/*28913*/"CJK COMPATIBILITY IDEOGRAPH-FA6B"/* FA6B */, /*28914*/"CJK COMPATIBILITY IDEOGRAPH-FA6C"/* FA6C */,/*28915*/"CJK COMPATIBILITY IDEOGRAPH-FA6D"/* FA6D */,NULL,NULL, /*28918*/"CJK COMPATIBILITY IDEOGRAPH-FA70"/* FA70 */,/*28919*/"CJK COMPATIBILITY IDEOGRAPH-FA71"/* FA71 */, /*28920*/"CJK COMPATIBILITY IDEOGRAPH-FA72"/* FA72 */,/*28921*/"CJK COMPATIBILITY IDEOGRAPH-FA73"/* FA73 */, /*28922*/"CJK COMPATIBILITY IDEOGRAPH-FA74"/* FA74 */,/*28923*/"CJK COMPATIBILITY IDEOGRAPH-FA75"/* FA75 */, /*28924*/"CJK COMPATIBILITY IDEOGRAPH-FA76"/* FA76 */,/*28925*/"CJK COMPATIBILITY IDEOGRAPH-FA77"/* FA77 */, /*28926*/"CJK COMPATIBILITY IDEOGRAPH-FA78"/* FA78 */,/*28927*/"CJK COMPATIBILITY IDEOGRAPH-FA79"/* FA79 */, /*28928*/"CJK COMPATIBILITY IDEOGRAPH-FA7A"/* FA7A */,/*28929*/"CJK COMPATIBILITY IDEOGRAPH-FA7B"/* FA7B */, /*28930*/"CJK COMPATIBILITY IDEOGRAPH-FA7C"/* FA7C */,/*28931*/"CJK COMPATIBILITY IDEOGRAPH-FA7D"/* FA7D */, /*28932*/"CJK COMPATIBILITY IDEOGRAPH-FA7E"/* FA7E */,/*28933*/"CJK COMPATIBILITY IDEOGRAPH-FA7F"/* FA7F */, /*28934*/"CJK COMPATIBILITY IDEOGRAPH-FA80"/* FA80 */,/*28935*/"CJK COMPATIBILITY IDEOGRAPH-FA81"/* FA81 */, /*28936*/"CJK COMPATIBILITY IDEOGRAPH-FA82"/* FA82 */,/*28937*/"CJK COMPATIBILITY IDEOGRAPH-FA83"/* FA83 */, /*28938*/"CJK COMPATIBILITY IDEOGRAPH-FA84"/* FA84 */,/*28939*/"CJK COMPATIBILITY IDEOGRAPH-FA85"/* FA85 */, /*28940*/"CJK COMPATIBILITY IDEOGRAPH-FA86"/* FA86 */,/*28941*/"CJK COMPATIBILITY IDEOGRAPH-FA87"/* FA87 */, /*28942*/"CJK COMPATIBILITY IDEOGRAPH-FA88"/* FA88 */,/*28943*/"CJK COMPATIBILITY IDEOGRAPH-FA89"/* FA89 */, /*28944*/"CJK COMPATIBILITY IDEOGRAPH-FA8A"/* FA8A */,/*28945*/"CJK COMPATIBILITY IDEOGRAPH-FA8B"/* FA8B */, /*28946*/"CJK COMPATIBILITY IDEOGRAPH-FA8C"/* FA8C */,/*28947*/"CJK COMPATIBILITY IDEOGRAPH-FA8D"/* FA8D */, /*28948*/"CJK COMPATIBILITY IDEOGRAPH-FA8E"/* FA8E */,/*28949*/"CJK COMPATIBILITY IDEOGRAPH-FA8F"/* FA8F */, /*28950*/"CJK COMPATIBILITY IDEOGRAPH-FA90"/* FA90 */,/*28951*/"CJK COMPATIBILITY IDEOGRAPH-FA91"/* FA91 */, /*28952*/"CJK COMPATIBILITY IDEOGRAPH-FA92"/* FA92 */,/*28953*/"CJK COMPATIBILITY IDEOGRAPH-FA93"/* FA93 */, /*28954*/"CJK COMPATIBILITY IDEOGRAPH-FA94"/* FA94 */,/*28955*/"CJK COMPATIBILITY IDEOGRAPH-FA95"/* FA95 */, /*28956*/"CJK COMPATIBILITY IDEOGRAPH-FA96"/* FA96 */,/*28957*/"CJK COMPATIBILITY IDEOGRAPH-FA97"/* FA97 */, /*28958*/"CJK COMPATIBILITY IDEOGRAPH-FA98"/* FA98 */,/*28959*/"CJK COMPATIBILITY IDEOGRAPH-FA99"/* FA99 */, /*28960*/"CJK COMPATIBILITY IDEOGRAPH-FA9A"/* FA9A */,/*28961*/"CJK COMPATIBILITY IDEOGRAPH-FA9B"/* FA9B */, /*28962*/"CJK COMPATIBILITY IDEOGRAPH-FA9C"/* FA9C */,/*28963*/"CJK COMPATIBILITY IDEOGRAPH-FA9D"/* FA9D */, /*28964*/"CJK COMPATIBILITY IDEOGRAPH-FA9E"/* FA9E */,/*28965*/"CJK COMPATIBILITY IDEOGRAPH-FA9F"/* FA9F */, /*28966*/"CJK COMPATIBILITY IDEOGRAPH-FAA0"/* FAA0 */,/*28967*/"CJK COMPATIBILITY IDEOGRAPH-FAA1"/* FAA1 */, /*28968*/"CJK COMPATIBILITY IDEOGRAPH-FAA2"/* FAA2 */,/*28969*/"CJK COMPATIBILITY IDEOGRAPH-FAA3"/* FAA3 */, /*28970*/"CJK COMPATIBILITY IDEOGRAPH-FAA4"/* FAA4 */,/*28971*/"CJK COMPATIBILITY IDEOGRAPH-FAA5"/* FAA5 */, /*28972*/"CJK COMPATIBILITY IDEOGRAPH-FAA6"/* FAA6 */,/*28973*/"CJK COMPATIBILITY IDEOGRAPH-FAA7"/* FAA7 */, /*28974*/"CJK COMPATIBILITY IDEOGRAPH-FAA8"/* FAA8 */,/*28975*/"CJK COMPATIBILITY IDEOGRAPH-FAA9"/* FAA9 */, /*28976*/"CJK COMPATIBILITY IDEOGRAPH-FAAA"/* FAAA */,/*28977*/"CJK COMPATIBILITY IDEOGRAPH-FAAB"/* FAAB */, /*28978*/"CJK COMPATIBILITY IDEOGRAPH-FAAC"/* FAAC */,/*28979*/"CJK COMPATIBILITY IDEOGRAPH-FAAD"/* FAAD */, /*28980*/"CJK COMPATIBILITY IDEOGRAPH-FAAE"/* FAAE */,/*28981*/"CJK COMPATIBILITY IDEOGRAPH-FAAF"/* FAAF */, /*28982*/"CJK COMPATIBILITY IDEOGRAPH-FAB0"/* FAB0 */,/*28983*/"CJK COMPATIBILITY IDEOGRAPH-FAB1"/* FAB1 */, /*28984*/"CJK COMPATIBILITY IDEOGRAPH-FAB2"/* FAB2 */,/*28985*/"CJK COMPATIBILITY IDEOGRAPH-FAB3"/* FAB3 */, /*28986*/"CJK COMPATIBILITY IDEOGRAPH-FAB4"/* FAB4 */,/*28987*/"CJK COMPATIBILITY IDEOGRAPH-FAB5"/* FAB5 */, /*28988*/"CJK COMPATIBILITY IDEOGRAPH-FAB6"/* FAB6 */,/*28989*/"CJK COMPATIBILITY IDEOGRAPH-FAB7"/* FAB7 */, /*28990*/"CJK COMPATIBILITY IDEOGRAPH-FAB8"/* FAB8 */,/*28991*/"CJK COMPATIBILITY IDEOGRAPH-FAB9"/* FAB9 */, /*28992*/"CJK COMPATIBILITY IDEOGRAPH-FABA"/* FABA */,/*28993*/"CJK COMPATIBILITY IDEOGRAPH-FABB"/* FABB */, /*28994*/"CJK COMPATIBILITY IDEOGRAPH-FABC"/* FABC */,/*28995*/"CJK COMPATIBILITY IDEOGRAPH-FABD"/* FABD */, /*28996*/"CJK COMPATIBILITY IDEOGRAPH-FABE"/* FABE */,/*28997*/"CJK COMPATIBILITY IDEOGRAPH-FABF"/* FABF */, /*28998*/"CJK COMPATIBILITY IDEOGRAPH-FAC0"/* FAC0 */,/*28999*/"CJK COMPATIBILITY IDEOGRAPH-FAC1"/* FAC1 */, /*29000*/"CJK COMPATIBILITY IDEOGRAPH-FAC2"/* FAC2 */,/*29001*/"CJK COMPATIBILITY IDEOGRAPH-FAC3"/* FAC3 */, /*29002*/"CJK COMPATIBILITY IDEOGRAPH-FAC4"/* FAC4 */,/*29003*/"CJK COMPATIBILITY IDEOGRAPH-FAC5"/* FAC5 */, /*29004*/"CJK COMPATIBILITY IDEOGRAPH-FAC6"/* FAC6 */,/*29005*/"CJK COMPATIBILITY IDEOGRAPH-FAC7"/* FAC7 */, /*29006*/"CJK COMPATIBILITY IDEOGRAPH-FAC8"/* FAC8 */,/*29007*/"CJK COMPATIBILITY IDEOGRAPH-FAC9"/* FAC9 */, /*29008*/"CJK COMPATIBILITY IDEOGRAPH-FACA"/* FACA */,/*29009*/"CJK COMPATIBILITY IDEOGRAPH-FACB"/* FACB */, /*29010*/"CJK COMPATIBILITY IDEOGRAPH-FACC"/* FACC */,/*29011*/"CJK COMPATIBILITY IDEOGRAPH-FACD"/* FACD */, /*29012*/"CJK COMPATIBILITY IDEOGRAPH-FACE"/* FACE */,/*29013*/"CJK COMPATIBILITY IDEOGRAPH-FACF"/* FACF */, /*29014*/"CJK COMPATIBILITY IDEOGRAPH-FAD0"/* FAD0 */,/*29015*/"CJK COMPATIBILITY IDEOGRAPH-FAD1"/* FAD1 */, /*29016*/"CJK COMPATIBILITY IDEOGRAPH-FAD2"/* FAD2 */,/*29017*/"CJK COMPATIBILITY IDEOGRAPH-FAD3"/* FAD3 */, /*29018*/"CJK COMPATIBILITY IDEOGRAPH-FAD4"/* FAD4 */,/*29019*/"CJK COMPATIBILITY IDEOGRAPH-FAD5"/* FAD5 */, /*29020*/"CJK COMPATIBILITY IDEOGRAPH-FAD6"/* FAD6 */,/*29021*/"CJK COMPATIBILITY IDEOGRAPH-FAD7"/* FAD7 */, /*29022*/"CJK COMPATIBILITY IDEOGRAPH-FAD8"/* FAD8 */,/*29023*/"CJK COMPATIBILITY IDEOGRAPH-FAD9"/* FAD9 */,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*29062*/"LATIN SMALL LIGATURE FF"/* FB00 */, /*29063*/"LATIN SMALL LIGATURE FI"/* FB01 */,/*29064*/"LATIN SMALL LIGATURE FL"/* FB02 */, /*29065*/"LATIN SMALL LIGATURE FFI"/* FB03 */,/*29066*/"LATIN SMALL LIGATURE FFL"/* FB04 */, /*29067*/"LATIN SMALL LIGATURE LONG S T"/* FB05 */,/*29068*/"LATIN SMALL LIGATURE ST"/* FB06 */,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*29081*/"ARMENIAN SMALL LIGATURE MEN NOW"/* FB13 */, /*29082*/"ARMENIAN SMALL LIGATURE MEN ECH"/* FB14 */,/*29083*/"ARMENIAN SMALL LIGATURE MEN INI"/* FB15 */, /*29084*/"ARMENIAN SMALL LIGATURE VEW NOW"/* FB16 */,/*29085*/"ARMENIAN SMALL LIGATURE MEN XEH"/* FB17 */,NULL,NULL,NULL, NULL,NULL,/*29091*/"HEBREW LETTER YOD WITH HIRIQ"/* FB1D */,/*29092*/"HEBREW POINT JUDEO-SPANISH VARIKA"/* FB1E */, /*29093*/"HEBREW LIGATURE YIDDISH YOD YOD PATAH"/* FB1F */,/*29094*/"HEBREW LETTER ALTERNATIVE AYIN"/* FB20 */, /*29095*/"HEBREW LETTER WIDE ALEF"/* FB21 */,/*29096*/"HEBREW LETTER WIDE DALET"/* FB22 */, /*29097*/"HEBREW LETTER WIDE HE"/* FB23 */,/*29098*/"HEBREW LETTER WIDE KAF"/* FB24 */, /*29099*/"HEBREW LETTER WIDE LAMED"/* FB25 */,/*29100*/"HEBREW LETTER WIDE FINAL MEM"/* FB26 */, /*29101*/"HEBREW LETTER WIDE RESH"/* FB27 */,/*29102*/"HEBREW LETTER WIDE TAV"/* FB28 */, /*29103*/"HEBREW LETTER ALTERNATIVE PLUS SIGN"/* FB29 */,/*29104*/"HEBREW LETTER SHIN WITH SHIN DOT"/* FB2A */, /*29105*/"HEBREW LETTER SHIN WITH SIN DOT"/* FB2B */,/*29106*/"HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT"/* FB2C */, /*29107*/"HEBREW LETTER SHIN WITH DAGESH AND SIN DOT"/* FB2D */,/*29108*/"HEBREW LETTER ALEF WITH PATAH"/* FB2E */, /*29109*/"HEBREW LETTER ALEF WITH QAMATS"/* FB2F */,/*29110*/"HEBREW LETTER ALEF WITH MAPIQ"/* FB30 */, /*29111*/"HEBREW LETTER BET WITH DAGESH"/* FB31 */,/*29112*/"HEBREW LETTER GIMEL WITH DAGESH"/* FB32 */, /*29113*/"HEBREW LETTER DALET WITH DAGESH"/* FB33 */,/*29114*/"HEBREW LETTER HE WITH MAPIQ"/* FB34 */, /*29115*/"HEBREW LETTER VAV WITH DAGESH"/* FB35 */,/*29116*/"HEBREW LETTER ZAYIN WITH DAGESH"/* FB36 */,NULL, /*29118*/"HEBREW LETTER TET WITH DAGESH"/* FB38 */,/*29119*/"HEBREW LETTER YOD WITH DAGESH"/* FB39 */, /*29120*/"HEBREW LETTER FINAL KAF WITH DAGESH"/* FB3A */,/*29121*/"HEBREW LETTER KAF WITH DAGESH"/* FB3B */, /*29122*/"HEBREW LETTER LAMED WITH DAGESH"/* FB3C */,NULL,/*29124*/"HEBREW LETTER MEM WITH DAGESH"/* FB3E */,NULL, /*29126*/"HEBREW LETTER NUN WITH DAGESH"/* FB40 */,/*29127*/"HEBREW LETTER SAMEKH WITH DAGESH"/* FB41 */,NULL, /*29129*/"HEBREW LETTER FINAL PE WITH DAGESH"/* FB43 */,/*29130*/"HEBREW LETTER PE WITH DAGESH"/* FB44 */,NULL, /*29132*/"HEBREW LETTER TSADI WITH DAGESH"/* FB46 */,/*29133*/"HEBREW LETTER QOF WITH DAGESH"/* FB47 */, /*29134*/"HEBREW LETTER RESH WITH DAGESH"/* FB48 */,/*29135*/"HEBREW LETTER SHIN WITH DAGESH"/* FB49 */, /*29136*/"HEBREW LETTER TAV WITH DAGESH"/* FB4A */,/*29137*/"HEBREW LETTER VAV WITH HOLAM"/* FB4B */, /*29138*/"HEBREW LETTER BET WITH RAFE"/* FB4C */,/*29139*/"HEBREW LETTER KAF WITH RAFE"/* FB4D */, /*29140*/"HEBREW LETTER PE WITH RAFE"/* FB4E */,/*29141*/"HEBREW LIGATURE ALEF LAMED"/* FB4F */, /*29142*/"ARABIC LETTER ALEF WASLA ISOLATED FORM"/* FB50 */,/*29143*/"ARABIC LETTER ALEF WASLA FINAL FORM"/* FB51 */, /*29144*/"ARABIC LETTER BEEH ISOLATED FORM"/* FB52 */,/*29145*/"ARABIC LETTER BEEH FINAL FORM"/* FB53 */, /*29146*/"ARABIC LETTER BEEH INITIAL FORM"/* FB54 */,/*29147*/"ARABIC LETTER BEEH MEDIAL FORM"/* FB55 */, /*29148*/"ARABIC LETTER PEH ISOLATED FORM"/* FB56 */,/*29149*/"ARABIC LETTER PEH FINAL FORM"/* FB57 */, /*29150*/"ARABIC LETTER PEH INITIAL FORM"/* FB58 */,/*29151*/"ARABIC LETTER PEH MEDIAL FORM"/* FB59 */, /*29152*/"ARABIC LETTER BEHEH ISOLATED FORM"/* FB5A */,/*29153*/"ARABIC LETTER BEHEH FINAL FORM"/* FB5B */, /*29154*/"ARABIC LETTER BEHEH INITIAL FORM"/* FB5C */,/*29155*/"ARABIC LETTER BEHEH MEDIAL FORM"/* FB5D */, /*29156*/"ARABIC LETTER TTEHEH ISOLATED FORM"/* FB5E */,/*29157*/"ARABIC LETTER TTEHEH FINAL FORM"/* FB5F */, /*29158*/"ARABIC LETTER TTEHEH INITIAL FORM"/* FB60 */,/*29159*/"ARABIC LETTER TTEHEH MEDIAL FORM"/* FB61 */, /*29160*/"ARABIC LETTER TEHEH ISOLATED FORM"/* FB62 */,/*29161*/"ARABIC LETTER TEHEH FINAL FORM"/* FB63 */, /*29162*/"ARABIC LETTER TEHEH INITIAL FORM"/* FB64 */,/*29163*/"ARABIC LETTER TEHEH MEDIAL FORM"/* FB65 */, /*29164*/"ARABIC LETTER TTEH ISOLATED FORM"/* FB66 */,/*29165*/"ARABIC LETTER TTEH FINAL FORM"/* FB67 */, /*29166*/"ARABIC LETTER TTEH INITIAL FORM"/* FB68 */,/*29167*/"ARABIC LETTER TTEH MEDIAL FORM"/* FB69 */, /*29168*/"ARABIC LETTER VEH ISOLATED FORM"/* FB6A */,/*29169*/"ARABIC LETTER VEH FINAL FORM"/* FB6B */, /*29170*/"ARABIC LETTER VEH INITIAL FORM"/* FB6C */,/*29171*/"ARABIC LETTER VEH MEDIAL FORM"/* FB6D */, /*29172*/"ARABIC LETTER PEHEH ISOLATED FORM"/* FB6E */,/*29173*/"ARABIC LETTER PEHEH FINAL FORM"/* FB6F */, /*29174*/"ARABIC LETTER PEHEH INITIAL FORM"/* FB70 */,/*29175*/"ARABIC LETTER PEHEH MEDIAL FORM"/* FB71 */, /*29176*/"ARABIC LETTER DYEH ISOLATED FORM"/* FB72 */,/*29177*/"ARABIC LETTER DYEH FINAL FORM"/* FB73 */, /*29178*/"ARABIC LETTER DYEH INITIAL FORM"/* FB74 */,/*29179*/"ARABIC LETTER DYEH MEDIAL FORM"/* FB75 */, /*29180*/"ARABIC LETTER NYEH ISOLATED FORM"/* FB76 */,/*29181*/"ARABIC LETTER NYEH FINAL FORM"/* FB77 */, /*29182*/"ARABIC LETTER NYEH INITIAL FORM"/* FB78 */,/*29183*/"ARABIC LETTER NYEH MEDIAL FORM"/* FB79 */, /*29184*/"ARABIC LETTER TCHEH ISOLATED FORM"/* FB7A */,/*29185*/"ARABIC LETTER TCHEH FINAL FORM"/* FB7B */, /*29186*/"ARABIC LETTER TCHEH INITIAL FORM"/* FB7C */,/*29187*/"ARABIC LETTER TCHEH MEDIAL FORM"/* FB7D */, /*29188*/"ARABIC LETTER TCHEHEH ISOLATED FORM"/* FB7E */,/*29189*/"ARABIC LETTER TCHEHEH FINAL FORM"/* FB7F */, /*29190*/"ARABIC LETTER TCHEHEH INITIAL FORM"/* FB80 */,/*29191*/"ARABIC LETTER TCHEHEH MEDIAL FORM"/* FB81 */, /*29192*/"ARABIC LETTER DDAHAL ISOLATED FORM"/* FB82 */,/*29193*/"ARABIC LETTER DDAHAL FINAL FORM"/* FB83 */, /*29194*/"ARABIC LETTER DAHAL ISOLATED FORM"/* FB84 */,/*29195*/"ARABIC LETTER DAHAL FINAL FORM"/* FB85 */, /*29196*/"ARABIC LETTER DUL ISOLATED FORM"/* FB86 */,/*29197*/"ARABIC LETTER DUL FINAL FORM"/* FB87 */, /*29198*/"ARABIC LETTER DDAL ISOLATED FORM"/* FB88 */,/*29199*/"ARABIC LETTER DDAL FINAL FORM"/* FB89 */, /*29200*/"ARABIC LETTER JEH ISOLATED FORM"/* FB8A */,/*29201*/"ARABIC LETTER JEH FINAL FORM"/* FB8B */, /*29202*/"ARABIC LETTER RREH ISOLATED FORM"/* FB8C */,/*29203*/"ARABIC LETTER RREH FINAL FORM"/* FB8D */, /*29204*/"ARABIC LETTER KEHEH ISOLATED FORM"/* FB8E */,/*29205*/"ARABIC LETTER KEHEH FINAL FORM"/* FB8F */, /*29206*/"ARABIC LETTER KEHEH INITIAL FORM"/* FB90 */,/*29207*/"ARABIC LETTER KEHEH MEDIAL FORM"/* FB91 */, /*29208*/"ARABIC LETTER GAF ISOLATED FORM"/* FB92 */,/*29209*/"ARABIC LETTER GAF FINAL FORM"/* FB93 */, /*29210*/"ARABIC LETTER GAF INITIAL FORM"/* FB94 */,/*29211*/"ARABIC LETTER GAF MEDIAL FORM"/* FB95 */, /*29212*/"ARABIC LETTER GUEH ISOLATED FORM"/* FB96 */,/*29213*/"ARABIC LETTER GUEH FINAL FORM"/* FB97 */, /*29214*/"ARABIC LETTER GUEH INITIAL FORM"/* FB98 */,/*29215*/"ARABIC LETTER GUEH MEDIAL FORM"/* FB99 */, /*29216*/"ARABIC LETTER NGOEH ISOLATED FORM"/* FB9A */,/*29217*/"ARABIC LETTER NGOEH FINAL FORM"/* FB9B */, /*29218*/"ARABIC LETTER NGOEH INITIAL FORM"/* FB9C */,/*29219*/"ARABIC LETTER NGOEH MEDIAL FORM"/* FB9D */, /*29220*/"ARABIC LETTER NOON GHUNNA ISOLATED FORM"/* FB9E */,/*29221*/"ARABIC LETTER NOON GHUNNA FINAL FORM"/* FB9F */, /*29222*/"ARABIC LETTER RNOON ISOLATED FORM"/* FBA0 */,/*29223*/"ARABIC LETTER RNOON FINAL FORM"/* FBA1 */, /*29224*/"ARABIC LETTER RNOON INITIAL FORM"/* FBA2 */,/*29225*/"ARABIC LETTER RNOON MEDIAL FORM"/* FBA3 */, /*29226*/"ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM"/* FBA4 */, /*29227*/"ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM"/* FBA5 */, /*29228*/"ARABIC LETTER HEH GOAL ISOLATED FORM"/* FBA6 */,/*29229*/"ARABIC LETTER HEH GOAL FINAL FORM"/* FBA7 */, /*29230*/"ARABIC LETTER HEH GOAL INITIAL FORM"/* FBA8 */,/*29231*/"ARABIC LETTER HEH GOAL MEDIAL FORM"/* FBA9 */, /*29232*/"ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM"/* FBAA */, /*29233*/"ARABIC LETTER HEH DOACHASHMEE FINAL FORM"/* FBAB */, /*29234*/"ARABIC LETTER HEH DOACHASHMEE INITIAL FORM"/* FBAC */, /*29235*/"ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM"/* FBAD */, /*29236*/"ARABIC LETTER YEH BARREE ISOLATED FORM"/* FBAE */,/*29237*/"ARABIC LETTER YEH BARREE FINAL FORM"/* FBAF */, /*29238*/"ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM"/* FBB0 */, /*29239*/"ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM"/* FBB1 */,/*29240*/"ARABIC SYMBOL DOT ABOVE"/* FBB2 */, /*29241*/"ARABIC SYMBOL DOT BELOW"/* FBB3 */,/*29242*/"ARABIC SYMBOL TWO DOTS ABOVE"/* FBB4 */, /*29243*/"ARABIC SYMBOL TWO DOTS BELOW"/* FBB5 */,/*29244*/"ARABIC SYMBOL THREE DOTS ABOVE"/* FBB6 */, /*29245*/"ARABIC SYMBOL THREE DOTS BELOW"/* FBB7 */, /*29246*/"ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS ABOVE"/* FBB8 */, /*29247*/"ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS BELOW"/* FBB9 */, /*29248*/"ARABIC SYMBOL FOUR DOTS ABOVE"/* FBBA */,/*29249*/"ARABIC SYMBOL FOUR DOTS BELOW"/* FBBB */, /*29250*/"ARABIC SYMBOL DOUBLE VERTICAL BAR BELOW"/* FBBC */, /*29251*/"ARABIC SYMBOL TWO DOTS VERTICALLY ABOVE"/* FBBD */, /*29252*/"ARABIC SYMBOL TWO DOTS VERTICALLY BELOW"/* FBBE */,/*29253*/"ARABIC SYMBOL RING"/* FBBF */, /*29254*/"ARABIC SYMBOL SMALL TAH ABOVE"/* FBC0 */,/*29255*/"ARABIC SYMBOL SMALL TAH BELOW"/* FBC1 */,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*29273*/"ARABIC LETTER NG ISOLATED FORM"/* FBD3 */,/*29274*/"ARABIC LETTER NG FINAL FORM"/* FBD4 */, /*29275*/"ARABIC LETTER NG INITIAL FORM"/* FBD5 */,/*29276*/"ARABIC LETTER NG MEDIAL FORM"/* FBD6 */, /*29277*/"ARABIC LETTER U ISOLATED FORM"/* FBD7 */,/*29278*/"ARABIC LETTER U FINAL FORM"/* FBD8 */, /*29279*/"ARABIC LETTER OE ISOLATED FORM"/* FBD9 */,/*29280*/"ARABIC LETTER OE FINAL FORM"/* FBDA */, /*29281*/"ARABIC LETTER YU ISOLATED FORM"/* FBDB */,/*29282*/"ARABIC LETTER YU FINAL FORM"/* FBDC */, /*29283*/"ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM"/* FBDD */,/*29284*/"ARABIC LETTER VE ISOLATED FORM"/* FBDE */, /*29285*/"ARABIC LETTER VE FINAL FORM"/* FBDF */,/*29286*/"ARABIC LETTER KIRGHIZ OE ISOLATED FORM"/* FBE0 */, /*29287*/"ARABIC LETTER KIRGHIZ OE FINAL FORM"/* FBE1 */,/*29288*/"ARABIC LETTER KIRGHIZ YU ISOLATED FORM"/* FBE2 */, /*29289*/"ARABIC LETTER KIRGHIZ YU FINAL FORM"/* FBE3 */,/*29290*/"ARABIC LETTER E ISOLATED FORM"/* FBE4 */, /*29291*/"ARABIC LETTER E FINAL FORM"/* FBE5 */,/*29292*/"ARABIC LETTER E INITIAL FORM"/* FBE6 */, /*29293*/"ARABIC LETTER E MEDIAL FORM"/* FBE7 */, /*29294*/"ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM"/* FBE8 */, /*29295*/"ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM"/* FBE9 */, /*29296*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM"/* FBEA */, /*29297*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM"/* FBEB */, /*29298*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM"/* FBEC */, /*29299*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM"/* FBED */, /*29300*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM"/* FBEE */, /*29301*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM"/* FBEF */, /*29302*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM"/* FBF0 */, /*29303*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM"/* FBF1 */, /*29304*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM"/* FBF2 */, /*29305*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM"/* FBF3 */, /*29306*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM"/* FBF4 */, /*29307*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM"/* FBF5 */, /*29308*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM"/* FBF6 */, /*29309*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM"/* FBF7 */, /*29310*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM"/* FBF8 */, /*29311*/"ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM"/* FBF9 */, /*29312*/"ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM"/* FBFA */, /*29313*/"ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM"/* FBFB */, /*29314*/"ARABIC LETTER FARSI YEH ISOLATED FORM"/* FBFC */,/*29315*/"ARABIC LETTER FARSI YEH FINAL FORM"/* FBFD */, /*29316*/"ARABIC LETTER FARSI YEH INITIAL FORM"/* FBFE */,/*29317*/"ARABIC LETTER FARSI YEH MEDIAL FORM"/* FBFF */, /*29318*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM"/* FC00 */, /*29319*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM"/* FC01 */, /*29320*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM"/* FC02 */, /*29321*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM"/* FC03 */, /*29322*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM"/* FC04 */, /*29323*/"ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM"/* FC05 */, /*29324*/"ARABIC LIGATURE BEH WITH HAH ISOLATED FORM"/* FC06 */, /*29325*/"ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM"/* FC07 */, /*29326*/"ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM"/* FC08 */, /*29327*/"ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM"/* FC09 */, /*29328*/"ARABIC LIGATURE BEH WITH YEH ISOLATED FORM"/* FC0A */, /*29329*/"ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM"/* FC0B */, /*29330*/"ARABIC LIGATURE TEH WITH HAH ISOLATED FORM"/* FC0C */, /*29331*/"ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM"/* FC0D */, /*29332*/"ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM"/* FC0E */, /*29333*/"ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM"/* FC0F */, /*29334*/"ARABIC LIGATURE TEH WITH YEH ISOLATED FORM"/* FC10 */, /*29335*/"ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM"/* FC11 */, /*29336*/"ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM"/* FC12 */, /*29337*/"ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM"/* FC13 */, /*29338*/"ARABIC LIGATURE THEH WITH YEH ISOLATED FORM"/* FC14 */, /*29339*/"ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM"/* FC15 */, /*29340*/"ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM"/* FC16 */, /*29341*/"ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM"/* FC17 */, /*29342*/"ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM"/* FC18 */, /*29343*/"ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM"/* FC19 */, /*29344*/"ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM"/* FC1A */, /*29345*/"ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM"/* FC1B */, /*29346*/"ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM"/* FC1C */, /*29347*/"ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM"/* FC1D */, /*29348*/"ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM"/* FC1E */, /*29349*/"ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM"/* FC1F */, /*29350*/"ARABIC LIGATURE SAD WITH HAH ISOLATED FORM"/* FC20 */, /*29351*/"ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM"/* FC21 */, /*29352*/"ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM"/* FC22 */, /*29353*/"ARABIC LIGATURE DAD WITH HAH ISOLATED FORM"/* FC23 */, /*29354*/"ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM"/* FC24 */, /*29355*/"ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM"/* FC25 */, /*29356*/"ARABIC LIGATURE TAH WITH HAH ISOLATED FORM"/* FC26 */, /*29357*/"ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM"/* FC27 */, /*29358*/"ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM"/* FC28 */, /*29359*/"ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM"/* FC29 */, /*29360*/"ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM"/* FC2A */, /*29361*/"ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM"/* FC2B */, /*29362*/"ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM"/* FC2C */, /*29363*/"ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM"/* FC2D */, /*29364*/"ARABIC LIGATURE FEH WITH HAH ISOLATED FORM"/* FC2E */, /*29365*/"ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM"/* FC2F */, /*29366*/"ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM"/* FC30 */, /*29367*/"ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM"/* FC31 */, /*29368*/"ARABIC LIGATURE FEH WITH YEH ISOLATED FORM"/* FC32 */, /*29369*/"ARABIC LIGATURE QAF WITH HAH ISOLATED FORM"/* FC33 */, /*29370*/"ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM"/* FC34 */, /*29371*/"ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM"/* FC35 */, /*29372*/"ARABIC LIGATURE QAF WITH YEH ISOLATED FORM"/* FC36 */, /*29373*/"ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM"/* FC37 */, /*29374*/"ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM"/* FC38 */, /*29375*/"ARABIC LIGATURE KAF WITH HAH ISOLATED FORM"/* FC39 */, /*29376*/"ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM"/* FC3A */, /*29377*/"ARABIC LIGATURE KAF WITH LAM ISOLATED FORM"/* FC3B */, /*29378*/"ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM"/* FC3C */, /*29379*/"ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM"/* FC3D */, /*29380*/"ARABIC LIGATURE KAF WITH YEH ISOLATED FORM"/* FC3E */, /*29381*/"ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM"/* FC3F */, /*29382*/"ARABIC LIGATURE LAM WITH HAH ISOLATED FORM"/* FC40 */, /*29383*/"ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM"/* FC41 */, /*29384*/"ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM"/* FC42 */, /*29385*/"ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM"/* FC43 */, /*29386*/"ARABIC LIGATURE LAM WITH YEH ISOLATED FORM"/* FC44 */, /*29387*/"ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM"/* FC45 */, /*29388*/"ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM"/* FC46 */, /*29389*/"ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM"/* FC47 */, /*29390*/"ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM"/* FC48 */, /*29391*/"ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM"/* FC49 */, /*29392*/"ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM"/* FC4A */, /*29393*/"ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM"/* FC4B */, /*29394*/"ARABIC LIGATURE NOON WITH HAH ISOLATED FORM"/* FC4C */, /*29395*/"ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM"/* FC4D */, /*29396*/"ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM"/* FC4E */, /*29397*/"ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM"/* FC4F */, /*29398*/"ARABIC LIGATURE NOON WITH YEH ISOLATED FORM"/* FC50 */, /*29399*/"ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM"/* FC51 */, /*29400*/"ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM"/* FC52 */, /*29401*/"ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM"/* FC53 */, /*29402*/"ARABIC LIGATURE HEH WITH YEH ISOLATED FORM"/* FC54 */, /*29403*/"ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM"/* FC55 */, /*29404*/"ARABIC LIGATURE YEH WITH HAH ISOLATED FORM"/* FC56 */, /*29405*/"ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM"/* FC57 */, /*29406*/"ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM"/* FC58 */, /*29407*/"ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM"/* FC59 */, /*29408*/"ARABIC LIGATURE YEH WITH YEH ISOLATED FORM"/* FC5A */, /*29409*/"ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM"/* FC5B */, /*29410*/"ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM"/* FC5C */, /*29411*/"ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM"/* FC5D */, /*29412*/"ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM"/* FC5E */, /*29413*/"ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM"/* FC5F */, /*29414*/"ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM"/* FC60 */, /*29415*/"ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM"/* FC61 */, /*29416*/"ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM"/* FC62 */, /*29417*/"ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM"/* FC63 */, /*29418*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM"/* FC64 */, /*29419*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM"/* FC65 */, /*29420*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM"/* FC66 */, /*29421*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM"/* FC67 */, /*29422*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM"/* FC68 */, /*29423*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM"/* FC69 */, /*29424*/"ARABIC LIGATURE BEH WITH REH FINAL FORM"/* FC6A */, /*29425*/"ARABIC LIGATURE BEH WITH ZAIN FINAL FORM"/* FC6B */, /*29426*/"ARABIC LIGATURE BEH WITH MEEM FINAL FORM"/* FC6C */, /*29427*/"ARABIC LIGATURE BEH WITH NOON FINAL FORM"/* FC6D */, /*29428*/"ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM"/* FC6E */, /*29429*/"ARABIC LIGATURE BEH WITH YEH FINAL FORM"/* FC6F */, /*29430*/"ARABIC LIGATURE TEH WITH REH FINAL FORM"/* FC70 */, /*29431*/"ARABIC LIGATURE TEH WITH ZAIN FINAL FORM"/* FC71 */, /*29432*/"ARABIC LIGATURE TEH WITH MEEM FINAL FORM"/* FC72 */, /*29433*/"ARABIC LIGATURE TEH WITH NOON FINAL FORM"/* FC73 */, /*29434*/"ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM"/* FC74 */, /*29435*/"ARABIC LIGATURE TEH WITH YEH FINAL FORM"/* FC75 */, /*29436*/"ARABIC LIGATURE THEH WITH REH FINAL FORM"/* FC76 */, /*29437*/"ARABIC LIGATURE THEH WITH ZAIN FINAL FORM"/* FC77 */, /*29438*/"ARABIC LIGATURE THEH WITH MEEM FINAL FORM"/* FC78 */, /*29439*/"ARABIC LIGATURE THEH WITH NOON FINAL FORM"/* FC79 */, /*29440*/"ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM"/* FC7A */, /*29441*/"ARABIC LIGATURE THEH WITH YEH FINAL FORM"/* FC7B */, /*29442*/"ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM"/* FC7C */, /*29443*/"ARABIC LIGATURE FEH WITH YEH FINAL FORM"/* FC7D */, /*29444*/"ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM"/* FC7E */, /*29445*/"ARABIC LIGATURE QAF WITH YEH FINAL FORM"/* FC7F */, /*29446*/"ARABIC LIGATURE KAF WITH ALEF FINAL FORM"/* FC80 */, /*29447*/"ARABIC LIGATURE KAF WITH LAM FINAL FORM"/* FC81 */, /*29448*/"ARABIC LIGATURE KAF WITH MEEM FINAL FORM"/* FC82 */, /*29449*/"ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM"/* FC83 */, /*29450*/"ARABIC LIGATURE KAF WITH YEH FINAL FORM"/* FC84 */, /*29451*/"ARABIC LIGATURE LAM WITH MEEM FINAL FORM"/* FC85 */, /*29452*/"ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM"/* FC86 */, /*29453*/"ARABIC LIGATURE LAM WITH YEH FINAL FORM"/* FC87 */, /*29454*/"ARABIC LIGATURE MEEM WITH ALEF FINAL FORM"/* FC88 */, /*29455*/"ARABIC LIGATURE MEEM WITH MEEM FINAL FORM"/* FC89 */, /*29456*/"ARABIC LIGATURE NOON WITH REH FINAL FORM"/* FC8A */, /*29457*/"ARABIC LIGATURE NOON WITH ZAIN FINAL FORM"/* FC8B */, /*29458*/"ARABIC LIGATURE NOON WITH MEEM FINAL FORM"/* FC8C */, /*29459*/"ARABIC LIGATURE NOON WITH NOON FINAL FORM"/* FC8D */, /*29460*/"ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM"/* FC8E */, /*29461*/"ARABIC LIGATURE NOON WITH YEH FINAL FORM"/* FC8F */, /*29462*/"ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM"/* FC90 */, /*29463*/"ARABIC LIGATURE YEH WITH REH FINAL FORM"/* FC91 */, /*29464*/"ARABIC LIGATURE YEH WITH ZAIN FINAL FORM"/* FC92 */, /*29465*/"ARABIC LIGATURE YEH WITH MEEM FINAL FORM"/* FC93 */, /*29466*/"ARABIC LIGATURE YEH WITH NOON FINAL FORM"/* FC94 */, /*29467*/"ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM"/* FC95 */, /*29468*/"ARABIC LIGATURE YEH WITH YEH FINAL FORM"/* FC96 */, /*29469*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM"/* FC97 */, /*29470*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM"/* FC98 */, /*29471*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM"/* FC99 */, /*29472*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM"/* FC9A */, /*29473*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM"/* FC9B */, /*29474*/"ARABIC LIGATURE BEH WITH JEEM INITIAL FORM"/* FC9C */, /*29475*/"ARABIC LIGATURE BEH WITH HAH INITIAL FORM"/* FC9D */, /*29476*/"ARABIC LIGATURE BEH WITH KHAH INITIAL FORM"/* FC9E */, /*29477*/"ARABIC LIGATURE BEH WITH MEEM INITIAL FORM"/* FC9F */, /*29478*/"ARABIC LIGATURE BEH WITH HEH INITIAL FORM"/* FCA0 */, /*29479*/"ARABIC LIGATURE TEH WITH JEEM INITIAL FORM"/* FCA1 */, /*29480*/"ARABIC LIGATURE TEH WITH HAH INITIAL FORM"/* FCA2 */, /*29481*/"ARABIC LIGATURE TEH WITH KHAH INITIAL FORM"/* FCA3 */, /*29482*/"ARABIC LIGATURE TEH WITH MEEM INITIAL FORM"/* FCA4 */, /*29483*/"ARABIC LIGATURE TEH WITH HEH INITIAL FORM"/* FCA5 */, /*29484*/"ARABIC LIGATURE THEH WITH MEEM INITIAL FORM"/* FCA6 */, /*29485*/"ARABIC LIGATURE JEEM WITH HAH INITIAL FORM"/* FCA7 */, /*29486*/"ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM"/* FCA8 */, /*29487*/"ARABIC LIGATURE HAH WITH JEEM INITIAL FORM"/* FCA9 */, /*29488*/"ARABIC LIGATURE HAH WITH MEEM INITIAL FORM"/* FCAA */, /*29489*/"ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM"/* FCAB */, /*29490*/"ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM"/* FCAC */, /*29491*/"ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM"/* FCAD */, /*29492*/"ARABIC LIGATURE SEEN WITH HAH INITIAL FORM"/* FCAE */, /*29493*/"ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM"/* FCAF */, /*29494*/"ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM"/* FCB0 */, /*29495*/"ARABIC LIGATURE SAD WITH HAH INITIAL FORM"/* FCB1 */, /*29496*/"ARABIC LIGATURE SAD WITH KHAH INITIAL FORM"/* FCB2 */, /*29497*/"ARABIC LIGATURE SAD WITH MEEM INITIAL FORM"/* FCB3 */, /*29498*/"ARABIC LIGATURE DAD WITH JEEM INITIAL FORM"/* FCB4 */, /*29499*/"ARABIC LIGATURE DAD WITH HAH INITIAL FORM"/* FCB5 */, /*29500*/"ARABIC LIGATURE DAD WITH KHAH INITIAL FORM"/* FCB6 */, /*29501*/"ARABIC LIGATURE DAD WITH MEEM INITIAL FORM"/* FCB7 */, /*29502*/"ARABIC LIGATURE TAH WITH HAH INITIAL FORM"/* FCB8 */, /*29503*/"ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM"/* FCB9 */, /*29504*/"ARABIC LIGATURE AIN WITH JEEM INITIAL FORM"/* FCBA */, /*29505*/"ARABIC LIGATURE AIN WITH MEEM INITIAL FORM"/* FCBB */, /*29506*/"ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM"/* FCBC */, /*29507*/"ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM"/* FCBD */, /*29508*/"ARABIC LIGATURE FEH WITH JEEM INITIAL FORM"/* FCBE */, /*29509*/"ARABIC LIGATURE FEH WITH HAH INITIAL FORM"/* FCBF */, /*29510*/"ARABIC LIGATURE FEH WITH KHAH INITIAL FORM"/* FCC0 */, /*29511*/"ARABIC LIGATURE FEH WITH MEEM INITIAL FORM"/* FCC1 */, /*29512*/"ARABIC LIGATURE QAF WITH HAH INITIAL FORM"/* FCC2 */, /*29513*/"ARABIC LIGATURE QAF WITH MEEM INITIAL FORM"/* FCC3 */, /*29514*/"ARABIC LIGATURE KAF WITH JEEM INITIAL FORM"/* FCC4 */, /*29515*/"ARABIC LIGATURE KAF WITH HAH INITIAL FORM"/* FCC5 */, /*29516*/"ARABIC LIGATURE KAF WITH KHAH INITIAL FORM"/* FCC6 */, /*29517*/"ARABIC LIGATURE KAF WITH LAM INITIAL FORM"/* FCC7 */, /*29518*/"ARABIC LIGATURE KAF WITH MEEM INITIAL FORM"/* FCC8 */, /*29519*/"ARABIC LIGATURE LAM WITH JEEM INITIAL FORM"/* FCC9 */, /*29520*/"ARABIC LIGATURE LAM WITH HAH INITIAL FORM"/* FCCA */, /*29521*/"ARABIC LIGATURE LAM WITH KHAH INITIAL FORM"/* FCCB */, /*29522*/"ARABIC LIGATURE LAM WITH MEEM INITIAL FORM"/* FCCC */, /*29523*/"ARABIC LIGATURE LAM WITH HEH INITIAL FORM"/* FCCD */, /*29524*/"ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM"/* FCCE */, /*29525*/"ARABIC LIGATURE MEEM WITH HAH INITIAL FORM"/* FCCF */, /*29526*/"ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM"/* FCD0 */, /*29527*/"ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM"/* FCD1 */, /*29528*/"ARABIC LIGATURE NOON WITH JEEM INITIAL FORM"/* FCD2 */, /*29529*/"ARABIC LIGATURE NOON WITH HAH INITIAL FORM"/* FCD3 */, /*29530*/"ARABIC LIGATURE NOON WITH KHAH INITIAL FORM"/* FCD4 */, /*29531*/"ARABIC LIGATURE NOON WITH MEEM INITIAL FORM"/* FCD5 */, /*29532*/"ARABIC LIGATURE NOON WITH HEH INITIAL FORM"/* FCD6 */, /*29533*/"ARABIC LIGATURE HEH WITH JEEM INITIAL FORM"/* FCD7 */, /*29534*/"ARABIC LIGATURE HEH WITH MEEM INITIAL FORM"/* FCD8 */, /*29535*/"ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM"/* FCD9 */, /*29536*/"ARABIC LIGATURE YEH WITH JEEM INITIAL FORM"/* FCDA */, /*29537*/"ARABIC LIGATURE YEH WITH HAH INITIAL FORM"/* FCDB */, /*29538*/"ARABIC LIGATURE YEH WITH KHAH INITIAL FORM"/* FCDC */, /*29539*/"ARABIC LIGATURE YEH WITH MEEM INITIAL FORM"/* FCDD */, /*29540*/"ARABIC LIGATURE YEH WITH HEH INITIAL FORM"/* FCDE */, /*29541*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM"/* FCDF */, /*29542*/"ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM"/* FCE0 */, /*29543*/"ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM"/* FCE1 */, /*29544*/"ARABIC LIGATURE BEH WITH HEH MEDIAL FORM"/* FCE2 */, /*29545*/"ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM"/* FCE3 */, /*29546*/"ARABIC LIGATURE TEH WITH HEH MEDIAL FORM"/* FCE4 */, /*29547*/"ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM"/* FCE5 */, /*29548*/"ARABIC LIGATURE THEH WITH HEH MEDIAL FORM"/* FCE6 */, /*29549*/"ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM"/* FCE7 */, /*29550*/"ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM"/* FCE8 */, /*29551*/"ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM"/* FCE9 */, /*29552*/"ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM"/* FCEA */, /*29553*/"ARABIC LIGATURE KAF WITH LAM MEDIAL FORM"/* FCEB */, /*29554*/"ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM"/* FCEC */, /*29555*/"ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM"/* FCED */, /*29556*/"ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM"/* FCEE */, /*29557*/"ARABIC LIGATURE NOON WITH HEH MEDIAL FORM"/* FCEF */, /*29558*/"ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM"/* FCF0 */, /*29559*/"ARABIC LIGATURE YEH WITH HEH MEDIAL FORM"/* FCF1 */, /*29560*/"ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM"/* FCF2 */, /*29561*/"ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM"/* FCF3 */, /*29562*/"ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM"/* FCF4 */, /*29563*/"ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM"/* FCF5 */, /*29564*/"ARABIC LIGATURE TAH WITH YEH ISOLATED FORM"/* FCF6 */, /*29565*/"ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM"/* FCF7 */, /*29566*/"ARABIC LIGATURE AIN WITH YEH ISOLATED FORM"/* FCF8 */, /*29567*/"ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM"/* FCF9 */, /*29568*/"ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM"/* FCFA */, /*29569*/"ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM"/* FCFB */, /*29570*/"ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM"/* FCFC */, /*29571*/"ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM"/* FCFD */, /*29572*/"ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM"/* FCFE */, /*29573*/"ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM"/* FCFF */, /*29574*/"ARABIC LIGATURE HAH WITH YEH ISOLATED FORM"/* FD00 */, /*29575*/"ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM"/* FD01 */, /*29576*/"ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM"/* FD02 */, /*29577*/"ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM"/* FD03 */, /*29578*/"ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM"/* FD04 */, /*29579*/"ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM"/* FD05 */, /*29580*/"ARABIC LIGATURE SAD WITH YEH ISOLATED FORM"/* FD06 */, /*29581*/"ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM"/* FD07 */, /*29582*/"ARABIC LIGATURE DAD WITH YEH ISOLATED FORM"/* FD08 */, /*29583*/"ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM"/* FD09 */, /*29584*/"ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM"/* FD0A */, /*29585*/"ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM"/* FD0B */, /*29586*/"ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM"/* FD0C */, /*29587*/"ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM"/* FD0D */, /*29588*/"ARABIC LIGATURE SEEN WITH REH ISOLATED FORM"/* FD0E */, /*29589*/"ARABIC LIGATURE SAD WITH REH ISOLATED FORM"/* FD0F */, /*29590*/"ARABIC LIGATURE DAD WITH REH ISOLATED FORM"/* FD10 */, /*29591*/"ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM"/* FD11 */, /*29592*/"ARABIC LIGATURE TAH WITH YEH FINAL FORM"/* FD12 */, /*29593*/"ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM"/* FD13 */, /*29594*/"ARABIC LIGATURE AIN WITH YEH FINAL FORM"/* FD14 */, /*29595*/"ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM"/* FD15 */, /*29596*/"ARABIC LIGATURE GHAIN WITH YEH FINAL FORM"/* FD16 */, /*29597*/"ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM"/* FD17 */, /*29598*/"ARABIC LIGATURE SEEN WITH YEH FINAL FORM"/* FD18 */, /*29599*/"ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM"/* FD19 */, /*29600*/"ARABIC LIGATURE SHEEN WITH YEH FINAL FORM"/* FD1A */, /*29601*/"ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM"/* FD1B */, /*29602*/"ARABIC LIGATURE HAH WITH YEH FINAL FORM"/* FD1C */, /*29603*/"ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM"/* FD1D */, /*29604*/"ARABIC LIGATURE JEEM WITH YEH FINAL FORM"/* FD1E */, /*29605*/"ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM"/* FD1F */, /*29606*/"ARABIC LIGATURE KHAH WITH YEH FINAL FORM"/* FD20 */, /*29607*/"ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM"/* FD21 */, /*29608*/"ARABIC LIGATURE SAD WITH YEH FINAL FORM"/* FD22 */, /*29609*/"ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM"/* FD23 */, /*29610*/"ARABIC LIGATURE DAD WITH YEH FINAL FORM"/* FD24 */, /*29611*/"ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM"/* FD25 */, /*29612*/"ARABIC LIGATURE SHEEN WITH HAH FINAL FORM"/* FD26 */, /*29613*/"ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM"/* FD27 */, /*29614*/"ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM"/* FD28 */, /*29615*/"ARABIC LIGATURE SHEEN WITH REH FINAL FORM"/* FD29 */, /*29616*/"ARABIC LIGATURE SEEN WITH REH FINAL FORM"/* FD2A */, /*29617*/"ARABIC LIGATURE SAD WITH REH FINAL FORM"/* FD2B */, /*29618*/"ARABIC LIGATURE DAD WITH REH FINAL FORM"/* FD2C */, /*29619*/"ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM"/* FD2D */, /*29620*/"ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM"/* FD2E */, /*29621*/"ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM"/* FD2F */, /*29622*/"ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM"/* FD30 */, /*29623*/"ARABIC LIGATURE SEEN WITH HEH INITIAL FORM"/* FD31 */, /*29624*/"ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM"/* FD32 */, /*29625*/"ARABIC LIGATURE TAH WITH MEEM INITIAL FORM"/* FD33 */, /*29626*/"ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM"/* FD34 */, /*29627*/"ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM"/* FD35 */, /*29628*/"ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM"/* FD36 */, /*29629*/"ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM"/* FD37 */, /*29630*/"ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM"/* FD38 */, /*29631*/"ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM"/* FD39 */, /*29632*/"ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM"/* FD3A */, /*29633*/"ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM"/* FD3B */, /*29634*/"ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM"/* FD3C */, /*29635*/"ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM"/* FD3D */,/*29636*/"ORNATE LEFT PARENTHESIS"/* FD3E */, /*29637*/"ORNATE RIGHT PARENTHESIS"/* FD3F */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,/*29654*/"ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM"/* FD50 */, /*29655*/"ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM"/* FD51 */, /*29656*/"ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM"/* FD52 */, /*29657*/"ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM"/* FD53 */, /*29658*/"ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM"/* FD54 */, /*29659*/"ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM"/* FD55 */, /*29660*/"ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM"/* FD56 */, /*29661*/"ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM"/* FD57 */, /*29662*/"ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM"/* FD58 */, /*29663*/"ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM"/* FD59 */, /*29664*/"ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM"/* FD5A */, /*29665*/"ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM"/* FD5B */, /*29666*/"ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM"/* FD5C */, /*29667*/"ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM"/* FD5D */, /*29668*/"ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM"/* FD5E */, /*29669*/"ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM"/* FD5F */, /*29670*/"ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM"/* FD60 */, /*29671*/"ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM"/* FD61 */, /*29672*/"ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM"/* FD62 */, /*29673*/"ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM"/* FD63 */, /*29674*/"ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM"/* FD64 */, /*29675*/"ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM"/* FD65 */, /*29676*/"ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM"/* FD66 */, /*29677*/"ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM"/* FD67 */, /*29678*/"ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM"/* FD68 */, /*29679*/"ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM"/* FD69 */, /*29680*/"ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM"/* FD6A */, /*29681*/"ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM"/* FD6B */, /*29682*/"ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM"/* FD6C */, /*29683*/"ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM"/* FD6D */, /*29684*/"ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM"/* FD6E */, /*29685*/"ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM"/* FD6F */, /*29686*/"ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM"/* FD70 */, /*29687*/"ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM"/* FD71 */, /*29688*/"ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM"/* FD72 */, /*29689*/"ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM"/* FD73 */, /*29690*/"ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM"/* FD74 */, /*29691*/"ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM"/* FD75 */, /*29692*/"ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM"/* FD76 */, /*29693*/"ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM"/* FD77 */, /*29694*/"ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM"/* FD78 */, /*29695*/"ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM"/* FD79 */, /*29696*/"ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM"/* FD7A */, /*29697*/"ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM"/* FD7B */, /*29698*/"ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM"/* FD7C */, /*29699*/"ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM"/* FD7D */, /*29700*/"ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM"/* FD7E */, /*29701*/"ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM"/* FD7F */, /*29702*/"ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM"/* FD80 */, /*29703*/"ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM"/* FD81 */, /*29704*/"ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM"/* FD82 */, /*29705*/"ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM"/* FD83 */, /*29706*/"ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM"/* FD84 */, /*29707*/"ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM"/* FD85 */, /*29708*/"ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM"/* FD86 */, /*29709*/"ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM"/* FD87 */, /*29710*/"ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM"/* FD88 */, /*29711*/"ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM"/* FD89 */, /*29712*/"ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM"/* FD8A */, /*29713*/"ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM"/* FD8B */, /*29714*/"ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM"/* FD8C */, /*29715*/"ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM"/* FD8D */, /*29716*/"ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM"/* FD8E */, /*29717*/"ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM"/* FD8F */,NULL,NULL, /*29720*/"ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM"/* FD92 */, /*29721*/"ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM"/* FD93 */, /*29722*/"ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM"/* FD94 */, /*29723*/"ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM"/* FD95 */, /*29724*/"ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM"/* FD96 */, /*29725*/"ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM"/* FD97 */, /*29726*/"ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM"/* FD98 */, /*29727*/"ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM"/* FD99 */, /*29728*/"ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM"/* FD9A */, /*29729*/"ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM"/* FD9B */, /*29730*/"ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM"/* FD9C */, /*29731*/"ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM"/* FD9D */, /*29732*/"ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM"/* FD9E */, /*29733*/"ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM"/* FD9F */, /*29734*/"ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM"/* FDA0 */, /*29735*/"ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM"/* FDA1 */, /*29736*/"ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM"/* FDA2 */, /*29737*/"ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM"/* FDA3 */, /*29738*/"ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM"/* FDA4 */, /*29739*/"ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM"/* FDA5 */, /*29740*/"ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM"/* FDA6 */, /*29741*/"ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM"/* FDA7 */, /*29742*/"ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM"/* FDA8 */, /*29743*/"ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM"/* FDA9 */, /*29744*/"ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM"/* FDAA */, /*29745*/"ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM"/* FDAB */, /*29746*/"ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM"/* FDAC */, /*29747*/"ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM"/* FDAD */, /*29748*/"ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM"/* FDAE */, /*29749*/"ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM"/* FDAF */, /*29750*/"ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM"/* FDB0 */, /*29751*/"ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM"/* FDB1 */, /*29752*/"ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM"/* FDB2 */, /*29753*/"ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM"/* FDB3 */, /*29754*/"ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM"/* FDB4 */, /*29755*/"ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM"/* FDB5 */, /*29756*/"ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM"/* FDB6 */, /*29757*/"ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM"/* FDB7 */, /*29758*/"ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM"/* FDB8 */, /*29759*/"ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM"/* FDB9 */, /*29760*/"ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM"/* FDBA */, /*29761*/"ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM"/* FDBB */, /*29762*/"ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM"/* FDBC */, /*29763*/"ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM"/* FDBD */, /*29764*/"ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM"/* FDBE */, /*29765*/"ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM"/* FDBF */, /*29766*/"ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM"/* FDC0 */, /*29767*/"ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM"/* FDC1 */, /*29768*/"ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM"/* FDC2 */, /*29769*/"ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM"/* FDC3 */, /*29770*/"ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM"/* FDC4 */, /*29771*/"ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM"/* FDC5 */, /*29772*/"ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM"/* FDC6 */, /*29773*/"ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM"/* FDC7 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*29814*/"ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM"/* FDF0 */, /*29815*/"ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM"/* FDF1 */, /*29816*/"ARABIC LIGATURE ALLAH ISOLATED FORM"/* FDF2 */,/*29817*/"ARABIC LIGATURE AKBAR ISOLATED FORM"/* FDF3 */, /*29818*/"ARABIC LIGATURE MOHAMMAD ISOLATED FORM"/* FDF4 */,/*29819*/"ARABIC LIGATURE SALAM ISOLATED FORM"/* FDF5 */, /*29820*/"ARABIC LIGATURE RASOUL ISOLATED FORM"/* FDF6 */,/*29821*/"ARABIC LIGATURE ALAYHE ISOLATED FORM"/* FDF7 */, /*29822*/"ARABIC LIGATURE WASALLAM ISOLATED FORM"/* FDF8 */,/*29823*/"ARABIC LIGATURE SALLA ISOLATED FORM"/* FDF9 */, /*29824*/"ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM"/* FDFA */,/*29825*/"ARABIC LIGATURE JALLAJALALOUHOU"/* FDFB */, /*29826*/"RIAL SIGN"/* FDFC */,/*29827*/"ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM"/* FDFD */,NULL,NULL, /*29830*/"VARIATION SELECTOR-1"/* FE00 */,/*29831*/"VARIATION SELECTOR-2"/* FE01 */, /*29832*/"VARIATION SELECTOR-3"/* FE02 */,/*29833*/"VARIATION SELECTOR-4"/* FE03 */, /*29834*/"VARIATION SELECTOR-5"/* FE04 */,/*29835*/"VARIATION SELECTOR-6"/* FE05 */, /*29836*/"VARIATION SELECTOR-7"/* FE06 */,/*29837*/"VARIATION SELECTOR-8"/* FE07 */, /*29838*/"VARIATION SELECTOR-9"/* FE08 */,/*29839*/"VARIATION SELECTOR-10"/* FE09 */, /*29840*/"VARIATION SELECTOR-11"/* FE0A */,/*29841*/"VARIATION SELECTOR-12"/* FE0B */, /*29842*/"VARIATION SELECTOR-13"/* FE0C */,/*29843*/"VARIATION SELECTOR-14"/* FE0D */, /*29844*/"VARIATION SELECTOR-15"/* FE0E */,/*29845*/"VARIATION SELECTOR-16"/* FE0F */, /*29846*/"PRESENTATION FORM FOR VERTICAL COMMA"/* FE10 */, /*29847*/"PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA"/* FE11 */, /*29848*/"PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP"/* FE12 */, /*29849*/"PRESENTATION FORM FOR VERTICAL COLON"/* FE13 */,/*29850*/"PRESENTATION FORM FOR VERTICAL SEMICOLON"/* FE14 */, /*29851*/"PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK"/* FE15 */, /*29852*/"PRESENTATION FORM FOR VERTICAL QUESTION MARK"/* FE16 */, /*29853*/"PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET"/* FE17 */, /*29854*/"PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET"/* FE18 */, /*29855*/"PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS"/* FE19 */,NULL,NULL,NULL,NULL,NULL,NULL, /*29862*/"COMBINING LIGATURE LEFT HALF"/* FE20 */,/*29863*/"COMBINING LIGATURE RIGHT HALF"/* FE21 */, /*29864*/"COMBINING DOUBLE TILDE LEFT HALF"/* FE22 */,/*29865*/"COMBINING DOUBLE TILDE RIGHT HALF"/* FE23 */, /*29866*/"COMBINING MACRON LEFT HALF"/* FE24 */,/*29867*/"COMBINING MACRON RIGHT HALF"/* FE25 */, /*29868*/"COMBINING CONJOINING MACRON"/* FE26 */,/*29869*/"COMBINING LIGATURE LEFT HALF BELOW"/* FE27 */, /*29870*/"COMBINING LIGATURE RIGHT HALF BELOW"/* FE28 */,/*29871*/"COMBINING TILDE LEFT HALF BELOW"/* FE29 */, /*29872*/"COMBINING TILDE RIGHT HALF BELOW"/* FE2A */,/*29873*/"COMBINING MACRON LEFT HALF BELOW"/* FE2B */, /*29874*/"COMBINING MACRON RIGHT HALF BELOW"/* FE2C */,/*29875*/"COMBINING CONJOINING MACRON BELOW"/* FE2D */, /*29876*/"COMBINING CYRILLIC TITLO LEFT HALF"/* FE2E */,/*29877*/"COMBINING CYRILLIC TITLO RIGHT HALF"/* FE2F */, /*29878*/"PRESENTATION FORM FOR VERTICAL TWO DOT LEADER"/* FE30 */, /*29879*/"PRESENTATION FORM FOR VERTICAL EM DASH"/* FE31 */,/*29880*/"PRESENTATION FORM FOR VERTICAL EN DASH"/* FE32 */, /*29881*/"PRESENTATION FORM FOR VERTICAL LOW LINE"/* FE33 */, /*29882*/"PRESENTATION FORM FOR VERTICAL WAVY LOW LINE"/* FE34 */, /*29883*/"PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS"/* FE35 */, /*29884*/"PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS"/* FE36 */, /*29885*/"PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET"/* FE37 */, /*29886*/"PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET"/* FE38 */, /*29887*/"PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET"/* FE39 */, /*29888*/"PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET"/* FE3A */, /*29889*/"PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET"/* FE3B */, /*29890*/"PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET"/* FE3C */, /*29891*/"PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET"/* FE3D */, /*29892*/"PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET"/* FE3E */, /*29893*/"PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET"/* FE3F */, /*29894*/"PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET"/* FE40 */, /*29895*/"PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET"/* FE41 */, /*29896*/"PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET"/* FE42 */, /*29897*/"PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET"/* FE43 */, /*29898*/"PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET"/* FE44 */,/*29899*/"SESAME DOT"/* FE45 */, /*29900*/"WHITE SESAME DOT"/* FE46 */,/*29901*/"PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET"/* FE47 */, /*29902*/"PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET"/* FE48 */,/*29903*/"DASHED OVERLINE"/* FE49 */, /*29904*/"CENTRELINE OVERLINE"/* FE4A */,/*29905*/"WAVY OVERLINE"/* FE4B */,/*29906*/"DOUBLE WAVY OVERLINE"/* FE4C */, /*29907*/"DASHED LOW LINE"/* FE4D */,/*29908*/"CENTRELINE LOW LINE"/* FE4E */,/*29909*/"WAVY LOW LINE"/* FE4F */, /*29910*/"SMALL COMMA"/* FE50 */,/*29911*/"SMALL IDEOGRAPHIC COMMA"/* FE51 */,/*29912*/"SMALL FULL STOP"/* FE52 */,NULL, /*29914*/"SMALL SEMICOLON"/* FE54 */,/*29915*/"SMALL COLON"/* FE55 */,/*29916*/"SMALL QUESTION MARK"/* FE56 */, /*29917*/"SMALL EXCLAMATION MARK"/* FE57 */,/*29918*/"SMALL EM DASH"/* FE58 */, /*29919*/"SMALL LEFT PARENTHESIS"/* FE59 */,/*29920*/"SMALL RIGHT PARENTHESIS"/* FE5A */, /*29921*/"SMALL LEFT CURLY BRACKET"/* FE5B */,/*29922*/"SMALL RIGHT CURLY BRACKET"/* FE5C */, /*29923*/"SMALL LEFT TORTOISE SHELL BRACKET"/* FE5D */,/*29924*/"SMALL RIGHT TORTOISE SHELL BRACKET"/* FE5E */, /*29925*/"SMALL NUMBER SIGN"/* FE5F */,/*29926*/"SMALL AMPERSAND"/* FE60 */,/*29927*/"SMALL ASTERISK"/* FE61 */, /*29928*/"SMALL PLUS SIGN"/* FE62 */,/*29929*/"SMALL HYPHEN-MINUS"/* FE63 */,/*29930*/"SMALL LESS-THAN SIGN"/* FE64 */, /*29931*/"SMALL GREATER-THAN SIGN"/* FE65 */,/*29932*/"SMALL EQUALS SIGN"/* FE66 */,NULL, /*29934*/"SMALL REVERSE SOLIDUS"/* FE68 */,/*29935*/"SMALL DOLLAR SIGN"/* FE69 */, /*29936*/"SMALL PERCENT SIGN"/* FE6A */,/*29937*/"SMALL COMMERCIAL AT"/* FE6B */,NULL,NULL,NULL,NULL, /*29942*/"ARABIC FATHATAN ISOLATED FORM"/* FE70 */,/*29943*/"ARABIC TATWEEL WITH FATHATAN ABOVE"/* FE71 */, /*29944*/"ARABIC DAMMATAN ISOLATED FORM"/* FE72 */,/*29945*/"ARABIC TAIL FRAGMENT"/* FE73 */, /*29946*/"ARABIC KASRATAN ISOLATED FORM"/* FE74 */,NULL,/*29948*/"ARABIC FATHA ISOLATED FORM"/* FE76 */, /*29949*/"ARABIC FATHA MEDIAL FORM"/* FE77 */,/*29950*/"ARABIC DAMMA ISOLATED FORM"/* FE78 */, /*29951*/"ARABIC DAMMA MEDIAL FORM"/* FE79 */,/*29952*/"ARABIC KASRA ISOLATED FORM"/* FE7A */, /*29953*/"ARABIC KASRA MEDIAL FORM"/* FE7B */,/*29954*/"ARABIC SHADDA ISOLATED FORM"/* FE7C */, /*29955*/"ARABIC SHADDA MEDIAL FORM"/* FE7D */,/*29956*/"ARABIC SUKUN ISOLATED FORM"/* FE7E */, /*29957*/"ARABIC SUKUN MEDIAL FORM"/* FE7F */,/*29958*/"ARABIC LETTER HAMZA ISOLATED FORM"/* FE80 */, /*29959*/"ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM"/* FE81 */, /*29960*/"ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM"/* FE82 */, /*29961*/"ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM"/* FE83 */, /*29962*/"ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM"/* FE84 */, /*29963*/"ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM"/* FE85 */, /*29964*/"ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM"/* FE86 */, /*29965*/"ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM"/* FE87 */, /*29966*/"ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM"/* FE88 */, /*29967*/"ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM"/* FE89 */, /*29968*/"ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM"/* FE8A */, /*29969*/"ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM"/* FE8B */, /*29970*/"ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM"/* FE8C */, /*29971*/"ARABIC LETTER ALEF ISOLATED FORM"/* FE8D */,/*29972*/"ARABIC LETTER ALEF FINAL FORM"/* FE8E */, /*29973*/"ARABIC LETTER BEH ISOLATED FORM"/* FE8F */,/*29974*/"ARABIC LETTER BEH FINAL FORM"/* FE90 */, /*29975*/"ARABIC LETTER BEH INITIAL FORM"/* FE91 */,/*29976*/"ARABIC LETTER BEH MEDIAL FORM"/* FE92 */, /*29977*/"ARABIC LETTER TEH MARBUTA ISOLATED FORM"/* FE93 */,/*29978*/"ARABIC LETTER TEH MARBUTA FINAL FORM"/* FE94 */, /*29979*/"ARABIC LETTER TEH ISOLATED FORM"/* FE95 */,/*29980*/"ARABIC LETTER TEH FINAL FORM"/* FE96 */, /*29981*/"ARABIC LETTER TEH INITIAL FORM"/* FE97 */,/*29982*/"ARABIC LETTER TEH MEDIAL FORM"/* FE98 */, /*29983*/"ARABIC LETTER THEH ISOLATED FORM"/* FE99 */,/*29984*/"ARABIC LETTER THEH FINAL FORM"/* FE9A */, /*29985*/"ARABIC LETTER THEH INITIAL FORM"/* FE9B */,/*29986*/"ARABIC LETTER THEH MEDIAL FORM"/* FE9C */, /*29987*/"ARABIC LETTER JEEM ISOLATED FORM"/* FE9D */,/*29988*/"ARABIC LETTER JEEM FINAL FORM"/* FE9E */, /*29989*/"ARABIC LETTER JEEM INITIAL FORM"/* FE9F */,/*29990*/"ARABIC LETTER JEEM MEDIAL FORM"/* FEA0 */, /*29991*/"ARABIC LETTER HAH ISOLATED FORM"/* FEA1 */,/*29992*/"ARABIC LETTER HAH FINAL FORM"/* FEA2 */, /*29993*/"ARABIC LETTER HAH INITIAL FORM"/* FEA3 */,/*29994*/"ARABIC LETTER HAH MEDIAL FORM"/* FEA4 */, /*29995*/"ARABIC LETTER KHAH ISOLATED FORM"/* FEA5 */,/*29996*/"ARABIC LETTER KHAH FINAL FORM"/* FEA6 */, /*29997*/"ARABIC LETTER KHAH INITIAL FORM"/* FEA7 */,/*29998*/"ARABIC LETTER KHAH MEDIAL FORM"/* FEA8 */, /*29999*/"ARABIC LETTER DAL ISOLATED FORM"/* FEA9 */,/*30000*/"ARABIC LETTER DAL FINAL FORM"/* FEAA */, /*30001*/"ARABIC LETTER THAL ISOLATED FORM"/* FEAB */,/*30002*/"ARABIC LETTER THAL FINAL FORM"/* FEAC */, /*30003*/"ARABIC LETTER REH ISOLATED FORM"/* FEAD */,/*30004*/"ARABIC LETTER REH FINAL FORM"/* FEAE */, /*30005*/"ARABIC LETTER ZAIN ISOLATED FORM"/* FEAF */,/*30006*/"ARABIC LETTER ZAIN FINAL FORM"/* FEB0 */, /*30007*/"ARABIC LETTER SEEN ISOLATED FORM"/* FEB1 */,/*30008*/"ARABIC LETTER SEEN FINAL FORM"/* FEB2 */, /*30009*/"ARABIC LETTER SEEN INITIAL FORM"/* FEB3 */,/*30010*/"ARABIC LETTER SEEN MEDIAL FORM"/* FEB4 */, /*30011*/"ARABIC LETTER SHEEN ISOLATED FORM"/* FEB5 */,/*30012*/"ARABIC LETTER SHEEN FINAL FORM"/* FEB6 */, /*30013*/"ARABIC LETTER SHEEN INITIAL FORM"/* FEB7 */,/*30014*/"ARABIC LETTER SHEEN MEDIAL FORM"/* FEB8 */, /*30015*/"ARABIC LETTER SAD ISOLATED FORM"/* FEB9 */,/*30016*/"ARABIC LETTER SAD FINAL FORM"/* FEBA */, /*30017*/"ARABIC LETTER SAD INITIAL FORM"/* FEBB */,/*30018*/"ARABIC LETTER SAD MEDIAL FORM"/* FEBC */, /*30019*/"ARABIC LETTER DAD ISOLATED FORM"/* FEBD */,/*30020*/"ARABIC LETTER DAD FINAL FORM"/* FEBE */, /*30021*/"ARABIC LETTER DAD INITIAL FORM"/* FEBF */,/*30022*/"ARABIC LETTER DAD MEDIAL FORM"/* FEC0 */, /*30023*/"ARABIC LETTER TAH ISOLATED FORM"/* FEC1 */,/*30024*/"ARABIC LETTER TAH FINAL FORM"/* FEC2 */, /*30025*/"ARABIC LETTER TAH INITIAL FORM"/* FEC3 */,/*30026*/"ARABIC LETTER TAH MEDIAL FORM"/* FEC4 */, /*30027*/"ARABIC LETTER ZAH ISOLATED FORM"/* FEC5 */,/*30028*/"ARABIC LETTER ZAH FINAL FORM"/* FEC6 */, /*30029*/"ARABIC LETTER ZAH INITIAL FORM"/* FEC7 */,/*30030*/"ARABIC LETTER ZAH MEDIAL FORM"/* FEC8 */, /*30031*/"ARABIC LETTER AIN ISOLATED FORM"/* FEC9 */,/*30032*/"ARABIC LETTER AIN FINAL FORM"/* FECA */, /*30033*/"ARABIC LETTER AIN INITIAL FORM"/* FECB */,/*30034*/"ARABIC LETTER AIN MEDIAL FORM"/* FECC */, /*30035*/"ARABIC LETTER GHAIN ISOLATED FORM"/* FECD */,/*30036*/"ARABIC LETTER GHAIN FINAL FORM"/* FECE */, /*30037*/"ARABIC LETTER GHAIN INITIAL FORM"/* FECF */,/*30038*/"ARABIC LETTER GHAIN MEDIAL FORM"/* FED0 */, /*30039*/"ARABIC LETTER FEH ISOLATED FORM"/* FED1 */,/*30040*/"ARABIC LETTER FEH FINAL FORM"/* FED2 */, /*30041*/"ARABIC LETTER FEH INITIAL FORM"/* FED3 */,/*30042*/"ARABIC LETTER FEH MEDIAL FORM"/* FED4 */, /*30043*/"ARABIC LETTER QAF ISOLATED FORM"/* FED5 */,/*30044*/"ARABIC LETTER QAF FINAL FORM"/* FED6 */, /*30045*/"ARABIC LETTER QAF INITIAL FORM"/* FED7 */,/*30046*/"ARABIC LETTER QAF MEDIAL FORM"/* FED8 */, /*30047*/"ARABIC LETTER KAF ISOLATED FORM"/* FED9 */,/*30048*/"ARABIC LETTER KAF FINAL FORM"/* FEDA */, /*30049*/"ARABIC LETTER KAF INITIAL FORM"/* FEDB */,/*30050*/"ARABIC LETTER KAF MEDIAL FORM"/* FEDC */, /*30051*/"ARABIC LETTER LAM ISOLATED FORM"/* FEDD */,/*30052*/"ARABIC LETTER LAM FINAL FORM"/* FEDE */, /*30053*/"ARABIC LETTER LAM INITIAL FORM"/* FEDF */,/*30054*/"ARABIC LETTER LAM MEDIAL FORM"/* FEE0 */, /*30055*/"ARABIC LETTER MEEM ISOLATED FORM"/* FEE1 */,/*30056*/"ARABIC LETTER MEEM FINAL FORM"/* FEE2 */, /*30057*/"ARABIC LETTER MEEM INITIAL FORM"/* FEE3 */,/*30058*/"ARABIC LETTER MEEM MEDIAL FORM"/* FEE4 */, /*30059*/"ARABIC LETTER NOON ISOLATED FORM"/* FEE5 */,/*30060*/"ARABIC LETTER NOON FINAL FORM"/* FEE6 */, /*30061*/"ARABIC LETTER NOON INITIAL FORM"/* FEE7 */,/*30062*/"ARABIC LETTER NOON MEDIAL FORM"/* FEE8 */, /*30063*/"ARABIC LETTER HEH ISOLATED FORM"/* FEE9 */,/*30064*/"ARABIC LETTER HEH FINAL FORM"/* FEEA */, /*30065*/"ARABIC LETTER HEH INITIAL FORM"/* FEEB */,/*30066*/"ARABIC LETTER HEH MEDIAL FORM"/* FEEC */, /*30067*/"ARABIC LETTER WAW ISOLATED FORM"/* FEED */,/*30068*/"ARABIC LETTER WAW FINAL FORM"/* FEEE */, /*30069*/"ARABIC LETTER ALEF MAKSURA ISOLATED FORM"/* FEEF */,/*30070*/"ARABIC LETTER ALEF MAKSURA FINAL FORM"/* FEF0 */, /*30071*/"ARABIC LETTER YEH ISOLATED FORM"/* FEF1 */,/*30072*/"ARABIC LETTER YEH FINAL FORM"/* FEF2 */, /*30073*/"ARABIC LETTER YEH INITIAL FORM"/* FEF3 */,/*30074*/"ARABIC LETTER YEH MEDIAL FORM"/* FEF4 */, /*30075*/"ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM"/* FEF5 */, /*30076*/"ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM"/* FEF6 */, /*30077*/"ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM"/* FEF7 */, /*30078*/"ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM"/* FEF8 */, /*30079*/"ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM"/* FEF9 */, /*30080*/"ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM"/* FEFA */, /*30081*/"ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM"/* FEFB */, /*30082*/"ARABIC LIGATURE LAM WITH ALEF FINAL FORM"/* FEFC */,NULL,NULL,/*30085*/"ZERO WIDTH NO-BREAK SPACE"/* FEFF */, NULL,/*30087*/"FULLWIDTH EXCLAMATION MARK"/* FF01 */,/*30088*/"FULLWIDTH QUOTATION MARK"/* FF02 */, /*30089*/"FULLWIDTH NUMBER SIGN"/* FF03 */,/*30090*/"FULLWIDTH DOLLAR SIGN"/* FF04 */, /*30091*/"FULLWIDTH PERCENT SIGN"/* FF05 */,/*30092*/"FULLWIDTH AMPERSAND"/* FF06 */, /*30093*/"FULLWIDTH APOSTROPHE"/* FF07 */,/*30094*/"FULLWIDTH LEFT PARENTHESIS"/* FF08 */, /*30095*/"FULLWIDTH RIGHT PARENTHESIS"/* FF09 */,/*30096*/"FULLWIDTH ASTERISK"/* FF0A */, /*30097*/"FULLWIDTH PLUS SIGN"/* FF0B */,/*30098*/"FULLWIDTH COMMA"/* FF0C */, /*30099*/"FULLWIDTH HYPHEN-MINUS"/* FF0D */,/*30100*/"FULLWIDTH FULL STOP"/* FF0E */, /*30101*/"FULLWIDTH SOLIDUS"/* FF0F */,/*30102*/"FULLWIDTH DIGIT ZERO"/* FF10 */, /*30103*/"FULLWIDTH DIGIT ONE"/* FF11 */,/*30104*/"FULLWIDTH DIGIT TWO"/* FF12 */, /*30105*/"FULLWIDTH DIGIT THREE"/* FF13 */,/*30106*/"FULLWIDTH DIGIT FOUR"/* FF14 */, /*30107*/"FULLWIDTH DIGIT FIVE"/* FF15 */,/*30108*/"FULLWIDTH DIGIT SIX"/* FF16 */, /*30109*/"FULLWIDTH DIGIT SEVEN"/* FF17 */,/*30110*/"FULLWIDTH DIGIT EIGHT"/* FF18 */, /*30111*/"FULLWIDTH DIGIT NINE"/* FF19 */,/*30112*/"FULLWIDTH COLON"/* FF1A */,/*30113*/"FULLWIDTH SEMICOLON"/* FF1B */, /*30114*/"FULLWIDTH LESS-THAN SIGN"/* FF1C */,/*30115*/"FULLWIDTH EQUALS SIGN"/* FF1D */, /*30116*/"FULLWIDTH GREATER-THAN SIGN"/* FF1E */,/*30117*/"FULLWIDTH QUESTION MARK"/* FF1F */, /*30118*/"FULLWIDTH COMMERCIAL AT"/* FF20 */,/*30119*/"FULLWIDTH LATIN CAPITAL LETTER A"/* FF21 */, /*30120*/"FULLWIDTH LATIN CAPITAL LETTER B"/* FF22 */,/*30121*/"FULLWIDTH LATIN CAPITAL LETTER C"/* FF23 */, /*30122*/"FULLWIDTH LATIN CAPITAL LETTER D"/* FF24 */,/*30123*/"FULLWIDTH LATIN CAPITAL LETTER E"/* FF25 */, /*30124*/"FULLWIDTH LATIN CAPITAL LETTER F"/* FF26 */,/*30125*/"FULLWIDTH LATIN CAPITAL LETTER G"/* FF27 */, /*30126*/"FULLWIDTH LATIN CAPITAL LETTER H"/* FF28 */,/*30127*/"FULLWIDTH LATIN CAPITAL LETTER I"/* FF29 */, /*30128*/"FULLWIDTH LATIN CAPITAL LETTER J"/* FF2A */,/*30129*/"FULLWIDTH LATIN CAPITAL LETTER K"/* FF2B */, /*30130*/"FULLWIDTH LATIN CAPITAL LETTER L"/* FF2C */,/*30131*/"FULLWIDTH LATIN CAPITAL LETTER M"/* FF2D */, /*30132*/"FULLWIDTH LATIN CAPITAL LETTER N"/* FF2E */,/*30133*/"FULLWIDTH LATIN CAPITAL LETTER O"/* FF2F */, /*30134*/"FULLWIDTH LATIN CAPITAL LETTER P"/* FF30 */,/*30135*/"FULLWIDTH LATIN CAPITAL LETTER Q"/* FF31 */, /*30136*/"FULLWIDTH LATIN CAPITAL LETTER R"/* FF32 */,/*30137*/"FULLWIDTH LATIN CAPITAL LETTER S"/* FF33 */, /*30138*/"FULLWIDTH LATIN CAPITAL LETTER T"/* FF34 */,/*30139*/"FULLWIDTH LATIN CAPITAL LETTER U"/* FF35 */, /*30140*/"FULLWIDTH LATIN CAPITAL LETTER V"/* FF36 */,/*30141*/"FULLWIDTH LATIN CAPITAL LETTER W"/* FF37 */, /*30142*/"FULLWIDTH LATIN CAPITAL LETTER X"/* FF38 */,/*30143*/"FULLWIDTH LATIN CAPITAL LETTER Y"/* FF39 */, /*30144*/"FULLWIDTH LATIN CAPITAL LETTER Z"/* FF3A */,/*30145*/"FULLWIDTH LEFT SQUARE BRACKET"/* FF3B */, /*30146*/"FULLWIDTH REVERSE SOLIDUS"/* FF3C */,/*30147*/"FULLWIDTH RIGHT SQUARE BRACKET"/* FF3D */, /*30148*/"FULLWIDTH CIRCUMFLEX ACCENT"/* FF3E */,/*30149*/"FULLWIDTH LOW LINE"/* FF3F */, /*30150*/"FULLWIDTH GRAVE ACCENT"/* FF40 */,/*30151*/"FULLWIDTH LATIN SMALL LETTER A"/* FF41 */, /*30152*/"FULLWIDTH LATIN SMALL LETTER B"/* FF42 */,/*30153*/"FULLWIDTH LATIN SMALL LETTER C"/* FF43 */, /*30154*/"FULLWIDTH LATIN SMALL LETTER D"/* FF44 */,/*30155*/"FULLWIDTH LATIN SMALL LETTER E"/* FF45 */, /*30156*/"FULLWIDTH LATIN SMALL LETTER F"/* FF46 */,/*30157*/"FULLWIDTH LATIN SMALL LETTER G"/* FF47 */, /*30158*/"FULLWIDTH LATIN SMALL LETTER H"/* FF48 */,/*30159*/"FULLWIDTH LATIN SMALL LETTER I"/* FF49 */, /*30160*/"FULLWIDTH LATIN SMALL LETTER J"/* FF4A */,/*30161*/"FULLWIDTH LATIN SMALL LETTER K"/* FF4B */, /*30162*/"FULLWIDTH LATIN SMALL LETTER L"/* FF4C */,/*30163*/"FULLWIDTH LATIN SMALL LETTER M"/* FF4D */, /*30164*/"FULLWIDTH LATIN SMALL LETTER N"/* FF4E */,/*30165*/"FULLWIDTH LATIN SMALL LETTER O"/* FF4F */, /*30166*/"FULLWIDTH LATIN SMALL LETTER P"/* FF50 */,/*30167*/"FULLWIDTH LATIN SMALL LETTER Q"/* FF51 */, /*30168*/"FULLWIDTH LATIN SMALL LETTER R"/* FF52 */,/*30169*/"FULLWIDTH LATIN SMALL LETTER S"/* FF53 */, /*30170*/"FULLWIDTH LATIN SMALL LETTER T"/* FF54 */,/*30171*/"FULLWIDTH LATIN SMALL LETTER U"/* FF55 */, /*30172*/"FULLWIDTH LATIN SMALL LETTER V"/* FF56 */,/*30173*/"FULLWIDTH LATIN SMALL LETTER W"/* FF57 */, /*30174*/"FULLWIDTH LATIN SMALL LETTER X"/* FF58 */,/*30175*/"FULLWIDTH LATIN SMALL LETTER Y"/* FF59 */, /*30176*/"FULLWIDTH LATIN SMALL LETTER Z"/* FF5A */,/*30177*/"FULLWIDTH LEFT CURLY BRACKET"/* FF5B */, /*30178*/"FULLWIDTH VERTICAL LINE"/* FF5C */,/*30179*/"FULLWIDTH RIGHT CURLY BRACKET"/* FF5D */, /*30180*/"FULLWIDTH TILDE"/* FF5E */,/*30181*/"FULLWIDTH LEFT WHITE PARENTHESIS"/* FF5F */, /*30182*/"FULLWIDTH RIGHT WHITE PARENTHESIS"/* FF60 */,/*30183*/"HALFWIDTH IDEOGRAPHIC FULL STOP"/* FF61 */, /*30184*/"HALFWIDTH LEFT CORNER BRACKET"/* FF62 */,/*30185*/"HALFWIDTH RIGHT CORNER BRACKET"/* FF63 */, /*30186*/"HALFWIDTH IDEOGRAPHIC COMMA"/* FF64 */,/*30187*/"HALFWIDTH KATAKANA MIDDLE DOT"/* FF65 */, /*30188*/"HALFWIDTH KATAKANA LETTER WO"/* FF66 */,/*30189*/"HALFWIDTH KATAKANA LETTER SMALL A"/* FF67 */, /*30190*/"HALFWIDTH KATAKANA LETTER SMALL I"/* FF68 */,/*30191*/"HALFWIDTH KATAKANA LETTER SMALL U"/* FF69 */, /*30192*/"HALFWIDTH KATAKANA LETTER SMALL E"/* FF6A */,/*30193*/"HALFWIDTH KATAKANA LETTER SMALL O"/* FF6B */, /*30194*/"HALFWIDTH KATAKANA LETTER SMALL YA"/* FF6C */,/*30195*/"HALFWIDTH KATAKANA LETTER SMALL YU"/* FF6D */, /*30196*/"HALFWIDTH KATAKANA LETTER SMALL YO"/* FF6E */,/*30197*/"HALFWIDTH KATAKANA LETTER SMALL TU"/* FF6F */, /*30198*/"HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK"/* FF70 */,/*30199*/"HALFWIDTH KATAKANA LETTER A"/* FF71 */, /*30200*/"HALFWIDTH KATAKANA LETTER I"/* FF72 */,/*30201*/"HALFWIDTH KATAKANA LETTER U"/* FF73 */, /*30202*/"HALFWIDTH KATAKANA LETTER E"/* FF74 */,/*30203*/"HALFWIDTH KATAKANA LETTER O"/* FF75 */, /*30204*/"HALFWIDTH KATAKANA LETTER KA"/* FF76 */,/*30205*/"HALFWIDTH KATAKANA LETTER KI"/* FF77 */, /*30206*/"HALFWIDTH KATAKANA LETTER KU"/* FF78 */,/*30207*/"HALFWIDTH KATAKANA LETTER KE"/* FF79 */, /*30208*/"HALFWIDTH KATAKANA LETTER KO"/* FF7A */,/*30209*/"HALFWIDTH KATAKANA LETTER SA"/* FF7B */, /*30210*/"HALFWIDTH KATAKANA LETTER SI"/* FF7C */,/*30211*/"HALFWIDTH KATAKANA LETTER SU"/* FF7D */, /*30212*/"HALFWIDTH KATAKANA LETTER SE"/* FF7E */,/*30213*/"HALFWIDTH KATAKANA LETTER SO"/* FF7F */, /*30214*/"HALFWIDTH KATAKANA LETTER TA"/* FF80 */,/*30215*/"HALFWIDTH KATAKANA LETTER TI"/* FF81 */, /*30216*/"HALFWIDTH KATAKANA LETTER TU"/* FF82 */,/*30217*/"HALFWIDTH KATAKANA LETTER TE"/* FF83 */, /*30218*/"HALFWIDTH KATAKANA LETTER TO"/* FF84 */,/*30219*/"HALFWIDTH KATAKANA LETTER NA"/* FF85 */, /*30220*/"HALFWIDTH KATAKANA LETTER NI"/* FF86 */,/*30221*/"HALFWIDTH KATAKANA LETTER NU"/* FF87 */, /*30222*/"HALFWIDTH KATAKANA LETTER NE"/* FF88 */,/*30223*/"HALFWIDTH KATAKANA LETTER NO"/* FF89 */, /*30224*/"HALFWIDTH KATAKANA LETTER HA"/* FF8A */,/*30225*/"HALFWIDTH KATAKANA LETTER HI"/* FF8B */, /*30226*/"HALFWIDTH KATAKANA LETTER HU"/* FF8C */,/*30227*/"HALFWIDTH KATAKANA LETTER HE"/* FF8D */, /*30228*/"HALFWIDTH KATAKANA LETTER HO"/* FF8E */,/*30229*/"HALFWIDTH KATAKANA LETTER MA"/* FF8F */, /*30230*/"HALFWIDTH KATAKANA LETTER MI"/* FF90 */,/*30231*/"HALFWIDTH KATAKANA LETTER MU"/* FF91 */, /*30232*/"HALFWIDTH KATAKANA LETTER ME"/* FF92 */,/*30233*/"HALFWIDTH KATAKANA LETTER MO"/* FF93 */, /*30234*/"HALFWIDTH KATAKANA LETTER YA"/* FF94 */,/*30235*/"HALFWIDTH KATAKANA LETTER YU"/* FF95 */, /*30236*/"HALFWIDTH KATAKANA LETTER YO"/* FF96 */,/*30237*/"HALFWIDTH KATAKANA LETTER RA"/* FF97 */, /*30238*/"HALFWIDTH KATAKANA LETTER RI"/* FF98 */,/*30239*/"HALFWIDTH KATAKANA LETTER RU"/* FF99 */, /*30240*/"HALFWIDTH KATAKANA LETTER RE"/* FF9A */,/*30241*/"HALFWIDTH KATAKANA LETTER RO"/* FF9B */, /*30242*/"HALFWIDTH KATAKANA LETTER WA"/* FF9C */,/*30243*/"HALFWIDTH KATAKANA LETTER N"/* FF9D */, /*30244*/"HALFWIDTH KATAKANA VOICED SOUND MARK"/* FF9E */,/*30245*/"HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK"/* FF9F */, /*30246*/"HALFWIDTH HANGUL FILLER"/* FFA0 */,/*30247*/"HALFWIDTH HANGUL LETTER KIYEOK"/* FFA1 */, /*30248*/"HALFWIDTH HANGUL LETTER SSANGKIYEOK"/* FFA2 */,/*30249*/"HALFWIDTH HANGUL LETTER KIYEOK-SIOS"/* FFA3 */, /*30250*/"HALFWIDTH HANGUL LETTER NIEUN"/* FFA4 */,/*30251*/"HALFWIDTH HANGUL LETTER NIEUN-CIEUC"/* FFA5 */, /*30252*/"HALFWIDTH HANGUL LETTER NIEUN-HIEUH"/* FFA6 */,/*30253*/"HALFWIDTH HANGUL LETTER TIKEUT"/* FFA7 */, /*30254*/"HALFWIDTH HANGUL LETTER SSANGTIKEUT"/* FFA8 */,/*30255*/"HALFWIDTH HANGUL LETTER RIEUL"/* FFA9 */, /*30256*/"HALFWIDTH HANGUL LETTER RIEUL-KIYEOK"/* FFAA */,/*30257*/"HALFWIDTH HANGUL LETTER RIEUL-MIEUM"/* FFAB */, /*30258*/"HALFWIDTH HANGUL LETTER RIEUL-PIEUP"/* FFAC */,/*30259*/"HALFWIDTH HANGUL LETTER RIEUL-SIOS"/* FFAD */, /*30260*/"HALFWIDTH HANGUL LETTER RIEUL-THIEUTH"/* FFAE */,/*30261*/"HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH"/* FFAF */, /*30262*/"HALFWIDTH HANGUL LETTER RIEUL-HIEUH"/* FFB0 */,/*30263*/"HALFWIDTH HANGUL LETTER MIEUM"/* FFB1 */, /*30264*/"HALFWIDTH HANGUL LETTER PIEUP"/* FFB2 */,/*30265*/"HALFWIDTH HANGUL LETTER SSANGPIEUP"/* FFB3 */, /*30266*/"HALFWIDTH HANGUL LETTER PIEUP-SIOS"/* FFB4 */,/*30267*/"HALFWIDTH HANGUL LETTER SIOS"/* FFB5 */, /*30268*/"HALFWIDTH HANGUL LETTER SSANGSIOS"/* FFB6 */,/*30269*/"HALFWIDTH HANGUL LETTER IEUNG"/* FFB7 */, /*30270*/"HALFWIDTH HANGUL LETTER CIEUC"/* FFB8 */,/*30271*/"HALFWIDTH HANGUL LETTER SSANGCIEUC"/* FFB9 */, /*30272*/"HALFWIDTH HANGUL LETTER CHIEUCH"/* FFBA */,/*30273*/"HALFWIDTH HANGUL LETTER KHIEUKH"/* FFBB */, /*30274*/"HALFWIDTH HANGUL LETTER THIEUTH"/* FFBC */,/*30275*/"HALFWIDTH HANGUL LETTER PHIEUPH"/* FFBD */, /*30276*/"HALFWIDTH HANGUL LETTER HIEUH"/* FFBE */,NULL,NULL,NULL,/*30280*/"HALFWIDTH HANGUL LETTER A"/* FFC2 */, /*30281*/"HALFWIDTH HANGUL LETTER AE"/* FFC3 */,/*30282*/"HALFWIDTH HANGUL LETTER YA"/* FFC4 */, /*30283*/"HALFWIDTH HANGUL LETTER YAE"/* FFC5 */,/*30284*/"HALFWIDTH HANGUL LETTER EO"/* FFC6 */, /*30285*/"HALFWIDTH HANGUL LETTER E"/* FFC7 */,NULL,NULL,/*30288*/"HALFWIDTH HANGUL LETTER YEO"/* FFCA */, /*30289*/"HALFWIDTH HANGUL LETTER YE"/* FFCB */,/*30290*/"HALFWIDTH HANGUL LETTER O"/* FFCC */, /*30291*/"HALFWIDTH HANGUL LETTER WA"/* FFCD */,/*30292*/"HALFWIDTH HANGUL LETTER WAE"/* FFCE */, /*30293*/"HALFWIDTH HANGUL LETTER OE"/* FFCF */,NULL,NULL,/*30296*/"HALFWIDTH HANGUL LETTER YO"/* FFD2 */, /*30297*/"HALFWIDTH HANGUL LETTER U"/* FFD3 */,/*30298*/"HALFWIDTH HANGUL LETTER WEO"/* FFD4 */, /*30299*/"HALFWIDTH HANGUL LETTER WE"/* FFD5 */,/*30300*/"HALFWIDTH HANGUL LETTER WI"/* FFD6 */, /*30301*/"HALFWIDTH HANGUL LETTER YU"/* FFD7 */,NULL,NULL,/*30304*/"HALFWIDTH HANGUL LETTER EU"/* FFDA */, /*30305*/"HALFWIDTH HANGUL LETTER YI"/* FFDB */,/*30306*/"HALFWIDTH HANGUL LETTER I"/* FFDC */,NULL,NULL,NULL, /*30310*/"FULLWIDTH CENT SIGN"/* FFE0 */,/*30311*/"FULLWIDTH POUND SIGN"/* FFE1 */, /*30312*/"FULLWIDTH NOT SIGN"/* FFE2 */,/*30313*/"FULLWIDTH MACRON"/* FFE3 */,/*30314*/"FULLWIDTH BROKEN BAR"/* FFE4 */, /*30315*/"FULLWIDTH YEN SIGN"/* FFE5 */,/*30316*/"FULLWIDTH WON SIGN"/* FFE6 */,NULL, /*30318*/"HALFWIDTH FORMS LIGHT VERTICAL"/* FFE8 */,/*30319*/"HALFWIDTH LEFTWARDS ARROW"/* FFE9 */, /*30320*/"HALFWIDTH UPWARDS ARROW"/* FFEA */,/*30321*/"HALFWIDTH RIGHTWARDS ARROW"/* FFEB */, /*30322*/"HALFWIDTH DOWNWARDS ARROW"/* FFEC */,/*30323*/"HALFWIDTH BLACK SQUARE"/* FFED */, /*30324*/"HALFWIDTH WHITE CIRCLE"/* FFEE */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*30335*/"INTERLINEAR ANNOTATION ANCHOR"/* FFF9 */,/*30336*/"INTERLINEAR ANNOTATION SEPARATOR"/* FFFA */, /*30337*/"INTERLINEAR ANNOTATION TERMINATOR"/* FFFB */,/*30338*/"OBJECT REPLACEMENT CHARACTER"/* FFFC */, /*30339*/"REPLACEMENT CHARACTER"/* FFFD */,/*30340*/"LINEAR B SYLLABLE B008 A"/* 10000 */, /*30341*/"LINEAR B SYLLABLE B038 E"/* 10001 */,/*30342*/"LINEAR B SYLLABLE B028 I"/* 10002 */, /*30343*/"LINEAR B SYLLABLE B061 O"/* 10003 */,/*30344*/"LINEAR B SYLLABLE B010 U"/* 10004 */, /*30345*/"LINEAR B SYLLABLE B001 DA"/* 10005 */,/*30346*/"LINEAR B SYLLABLE B045 DE"/* 10006 */, /*30347*/"LINEAR B SYLLABLE B007 DI"/* 10007 */,/*30348*/"LINEAR B SYLLABLE B014 DO"/* 10008 */, /*30349*/"LINEAR B SYLLABLE B051 DU"/* 10009 */,/*30350*/"LINEAR B SYLLABLE B057 JA"/* 1000A */, /*30351*/"LINEAR B SYLLABLE B046 JE"/* 1000B */,NULL,/*30353*/"LINEAR B SYLLABLE B036 JO"/* 1000D */, /*30354*/"LINEAR B SYLLABLE B065 JU"/* 1000E */,/*30355*/"LINEAR B SYLLABLE B077 KA"/* 1000F */, /*30356*/"LINEAR B SYLLABLE B044 KE"/* 10010 */,/*30357*/"LINEAR B SYLLABLE B067 KI"/* 10011 */, /*30358*/"LINEAR B SYLLABLE B070 KO"/* 10012 */,/*30359*/"LINEAR B SYLLABLE B081 KU"/* 10013 */, /*30360*/"LINEAR B SYLLABLE B080 MA"/* 10014 */,/*30361*/"LINEAR B SYLLABLE B013 ME"/* 10015 */, /*30362*/"LINEAR B SYLLABLE B073 MI"/* 10016 */,/*30363*/"LINEAR B SYLLABLE B015 MO"/* 10017 */, /*30364*/"LINEAR B SYLLABLE B023 MU"/* 10018 */,/*30365*/"LINEAR B SYLLABLE B006 NA"/* 10019 */, /*30366*/"LINEAR B SYLLABLE B024 NE"/* 1001A */,/*30367*/"LINEAR B SYLLABLE B030 NI"/* 1001B */, /*30368*/"LINEAR B SYLLABLE B052 NO"/* 1001C */,/*30369*/"LINEAR B SYLLABLE B055 NU"/* 1001D */, /*30370*/"LINEAR B SYLLABLE B003 PA"/* 1001E */,/*30371*/"LINEAR B SYLLABLE B072 PE"/* 1001F */, /*30372*/"LINEAR B SYLLABLE B039 PI"/* 10020 */,/*30373*/"LINEAR B SYLLABLE B011 PO"/* 10021 */, /*30374*/"LINEAR B SYLLABLE B050 PU"/* 10022 */,/*30375*/"LINEAR B SYLLABLE B016 QA"/* 10023 */, /*30376*/"LINEAR B SYLLABLE B078 QE"/* 10024 */,/*30377*/"LINEAR B SYLLABLE B021 QI"/* 10025 */, /*30378*/"LINEAR B SYLLABLE B032 QO"/* 10026 */,NULL,/*30380*/"LINEAR B SYLLABLE B060 RA"/* 10028 */, /*30381*/"LINEAR B SYLLABLE B027 RE"/* 10029 */,/*30382*/"LINEAR B SYLLABLE B053 RI"/* 1002A */, /*30383*/"LINEAR B SYLLABLE B002 RO"/* 1002B */,/*30384*/"LINEAR B SYLLABLE B026 RU"/* 1002C */, /*30385*/"LINEAR B SYLLABLE B031 SA"/* 1002D */,/*30386*/"LINEAR B SYLLABLE B009 SE"/* 1002E */, /*30387*/"LINEAR B SYLLABLE B041 SI"/* 1002F */,/*30388*/"LINEAR B SYLLABLE B012 SO"/* 10030 */, /*30389*/"LINEAR B SYLLABLE B058 SU"/* 10031 */,/*30390*/"LINEAR B SYLLABLE B059 TA"/* 10032 */, /*30391*/"LINEAR B SYLLABLE B004 TE"/* 10033 */,/*30392*/"LINEAR B SYLLABLE B037 TI"/* 10034 */, /*30393*/"LINEAR B SYLLABLE B005 TO"/* 10035 */,/*30394*/"LINEAR B SYLLABLE B069 TU"/* 10036 */, /*30395*/"LINEAR B SYLLABLE B054 WA"/* 10037 */,/*30396*/"LINEAR B SYLLABLE B075 WE"/* 10038 */, /*30397*/"LINEAR B SYLLABLE B040 WI"/* 10039 */,/*30398*/"LINEAR B SYLLABLE B042 WO"/* 1003A */,NULL, /*30400*/"LINEAR B SYLLABLE B017 ZA"/* 1003C */,/*30401*/"LINEAR B SYLLABLE B074 ZE"/* 1003D */,NULL, /*30403*/"LINEAR B SYLLABLE B020 ZO"/* 1003F */,/*30404*/"LINEAR B SYLLABLE B025 A2"/* 10040 */, /*30405*/"LINEAR B SYLLABLE B043 A3"/* 10041 */,/*30406*/"LINEAR B SYLLABLE B085 AU"/* 10042 */, /*30407*/"LINEAR B SYLLABLE B071 DWE"/* 10043 */,/*30408*/"LINEAR B SYLLABLE B090 DWO"/* 10044 */, /*30409*/"LINEAR B SYLLABLE B048 NWA"/* 10045 */,/*30410*/"LINEAR B SYLLABLE B029 PU2"/* 10046 */, /*30411*/"LINEAR B SYLLABLE B062 PTE"/* 10047 */,/*30412*/"LINEAR B SYLLABLE B076 RA2"/* 10048 */, /*30413*/"LINEAR B SYLLABLE B033 RA3"/* 10049 */,/*30414*/"LINEAR B SYLLABLE B068 RO2"/* 1004A */, /*30415*/"LINEAR B SYLLABLE B066 TA2"/* 1004B */,/*30416*/"LINEAR B SYLLABLE B087 TWE"/* 1004C */, /*30417*/"LINEAR B SYLLABLE B091 TWO"/* 1004D */,NULL,NULL,/*30420*/"LINEAR B SYMBOL B018"/* 10050 */, /*30421*/"LINEAR B SYMBOL B019"/* 10051 */,/*30422*/"LINEAR B SYMBOL B022"/* 10052 */, /*30423*/"LINEAR B SYMBOL B034"/* 10053 */,/*30424*/"LINEAR B SYMBOL B047"/* 10054 */, /*30425*/"LINEAR B SYMBOL B049"/* 10055 */,/*30426*/"LINEAR B SYMBOL B056"/* 10056 */, /*30427*/"LINEAR B SYMBOL B063"/* 10057 */,/*30428*/"LINEAR B SYMBOL B064"/* 10058 */, /*30429*/"LINEAR B SYMBOL B079"/* 10059 */,/*30430*/"LINEAR B SYMBOL B082"/* 1005A */, /*30431*/"LINEAR B SYMBOL B083"/* 1005B */,/*30432*/"LINEAR B SYMBOL B086"/* 1005C */, /*30433*/"LINEAR B SYMBOL B089"/* 1005D */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*30468*/"LINEAR B IDEOGRAM B100 MAN"/* 10080 */,/*30469*/"LINEAR B IDEOGRAM B102 WOMAN"/* 10081 */, /*30470*/"LINEAR B IDEOGRAM B104 DEER"/* 10082 */,/*30471*/"LINEAR B IDEOGRAM B105 EQUID"/* 10083 */, /*30472*/"LINEAR B IDEOGRAM B105F MARE"/* 10084 */,/*30473*/"LINEAR B IDEOGRAM B105M STALLION"/* 10085 */, /*30474*/"LINEAR B IDEOGRAM B106F EWE"/* 10086 */,/*30475*/"LINEAR B IDEOGRAM B106M RAM"/* 10087 */, /*30476*/"LINEAR B IDEOGRAM B107F SHE-GOAT"/* 10088 */,/*30477*/"LINEAR B IDEOGRAM B107M HE-GOAT"/* 10089 */, /*30478*/"LINEAR B IDEOGRAM B108F SOW"/* 1008A */,/*30479*/"LINEAR B IDEOGRAM B108M BOAR"/* 1008B */, /*30480*/"LINEAR B IDEOGRAM B109F COW"/* 1008C */,/*30481*/"LINEAR B IDEOGRAM B109M BULL"/* 1008D */, /*30482*/"LINEAR B IDEOGRAM B120 WHEAT"/* 1008E */,/*30483*/"LINEAR B IDEOGRAM B121 BARLEY"/* 1008F */, /*30484*/"LINEAR B IDEOGRAM B122 OLIVE"/* 10090 */,/*30485*/"LINEAR B IDEOGRAM B123 SPICE"/* 10091 */, /*30486*/"LINEAR B IDEOGRAM B125 CYPERUS"/* 10092 */,/*30487*/"LINEAR B MONOGRAM B127 KAPO"/* 10093 */, /*30488*/"LINEAR B MONOGRAM B128 KANAKO"/* 10094 */,/*30489*/"LINEAR B IDEOGRAM B130 OIL"/* 10095 */, /*30490*/"LINEAR B IDEOGRAM B131 WINE"/* 10096 */,/*30491*/"LINEAR B IDEOGRAM B132"/* 10097 */, /*30492*/"LINEAR B MONOGRAM B133 AREPA"/* 10098 */,/*30493*/"LINEAR B MONOGRAM B135 MERI"/* 10099 */, /*30494*/"LINEAR B IDEOGRAM B140 BRONZE"/* 1009A */,/*30495*/"LINEAR B IDEOGRAM B141 GOLD"/* 1009B */, /*30496*/"LINEAR B IDEOGRAM B142"/* 1009C */,/*30497*/"LINEAR B IDEOGRAM B145 WOOL"/* 1009D */, /*30498*/"LINEAR B IDEOGRAM B146"/* 1009E */,/*30499*/"LINEAR B IDEOGRAM B150"/* 1009F */, /*30500*/"LINEAR B IDEOGRAM B151 HORN"/* 100A0 */,/*30501*/"LINEAR B IDEOGRAM B152"/* 100A1 */, /*30502*/"LINEAR B IDEOGRAM B153"/* 100A2 */,/*30503*/"LINEAR B IDEOGRAM B154"/* 100A3 */, /*30504*/"LINEAR B MONOGRAM B156 TURO2"/* 100A4 */,/*30505*/"LINEAR B IDEOGRAM B157"/* 100A5 */, /*30506*/"LINEAR B IDEOGRAM B158"/* 100A6 */,/*30507*/"LINEAR B IDEOGRAM B159 CLOTH"/* 100A7 */, /*30508*/"LINEAR B IDEOGRAM B160"/* 100A8 */,/*30509*/"LINEAR B IDEOGRAM B161"/* 100A9 */, /*30510*/"LINEAR B IDEOGRAM B162 GARMENT"/* 100AA */,/*30511*/"LINEAR B IDEOGRAM B163 ARMOUR"/* 100AB */, /*30512*/"LINEAR B IDEOGRAM B164"/* 100AC */,/*30513*/"LINEAR B IDEOGRAM B165"/* 100AD */, /*30514*/"LINEAR B IDEOGRAM B166"/* 100AE */,/*30515*/"LINEAR B IDEOGRAM B167"/* 100AF */, /*30516*/"LINEAR B IDEOGRAM B168"/* 100B0 */,/*30517*/"LINEAR B IDEOGRAM B169"/* 100B1 */, /*30518*/"LINEAR B IDEOGRAM B170"/* 100B2 */,/*30519*/"LINEAR B IDEOGRAM B171"/* 100B3 */, /*30520*/"LINEAR B IDEOGRAM B172"/* 100B4 */,/*30521*/"LINEAR B IDEOGRAM B173 MONTH"/* 100B5 */, /*30522*/"LINEAR B IDEOGRAM B174"/* 100B6 */,/*30523*/"LINEAR B IDEOGRAM B176 TREE"/* 100B7 */, /*30524*/"LINEAR B IDEOGRAM B177"/* 100B8 */,/*30525*/"LINEAR B IDEOGRAM B178"/* 100B9 */, /*30526*/"LINEAR B IDEOGRAM B179"/* 100BA */,/*30527*/"LINEAR B IDEOGRAM B180"/* 100BB */, /*30528*/"LINEAR B IDEOGRAM B181"/* 100BC */,/*30529*/"LINEAR B IDEOGRAM B182"/* 100BD */, /*30530*/"LINEAR B IDEOGRAM B183"/* 100BE */,/*30531*/"LINEAR B IDEOGRAM B184"/* 100BF */, /*30532*/"LINEAR B IDEOGRAM B185"/* 100C0 */,/*30533*/"LINEAR B IDEOGRAM B189"/* 100C1 */, /*30534*/"LINEAR B IDEOGRAM B190"/* 100C2 */,/*30535*/"LINEAR B IDEOGRAM B191 HELMET"/* 100C3 */, /*30536*/"LINEAR B IDEOGRAM B220 FOOTSTOOL"/* 100C4 */,/*30537*/"LINEAR B IDEOGRAM B225 BATHTUB"/* 100C5 */, /*30538*/"LINEAR B IDEOGRAM B230 SPEAR"/* 100C6 */,/*30539*/"LINEAR B IDEOGRAM B231 ARROW"/* 100C7 */, /*30540*/"LINEAR B IDEOGRAM B232"/* 100C8 */,/*30541*/"LINEAR B IDEOGRAM B233 SWORD"/* 100C9 */, /*30542*/"LINEAR B IDEOGRAM B234"/* 100CA */,/*30543*/"LINEAR B IDEOGRAM B236"/* 100CB */, /*30544*/"LINEAR B IDEOGRAM B240 WHEELED CHARIOT"/* 100CC */,/*30545*/"LINEAR B IDEOGRAM B241 CHARIOT"/* 100CD */, /*30546*/"LINEAR B IDEOGRAM B242 CHARIOT FRAME"/* 100CE */,/*30547*/"LINEAR B IDEOGRAM B243 WHEEL"/* 100CF */, /*30548*/"LINEAR B IDEOGRAM B245"/* 100D0 */,/*30549*/"LINEAR B IDEOGRAM B246"/* 100D1 */, /*30550*/"LINEAR B MONOGRAM B247 DIPTE"/* 100D2 */,/*30551*/"LINEAR B IDEOGRAM B248"/* 100D3 */, /*30552*/"LINEAR B IDEOGRAM B249"/* 100D4 */,/*30553*/"LINEAR B IDEOGRAM B251"/* 100D5 */, /*30554*/"LINEAR B IDEOGRAM B252"/* 100D6 */,/*30555*/"LINEAR B IDEOGRAM B253"/* 100D7 */, /*30556*/"LINEAR B IDEOGRAM B254 DART"/* 100D8 */,/*30557*/"LINEAR B IDEOGRAM B255"/* 100D9 */, /*30558*/"LINEAR B IDEOGRAM B256"/* 100DA */,/*30559*/"LINEAR B IDEOGRAM B257"/* 100DB */, /*30560*/"LINEAR B IDEOGRAM B258"/* 100DC */,/*30561*/"LINEAR B IDEOGRAM B259"/* 100DD */, /*30562*/"LINEAR B IDEOGRAM VESSEL B155"/* 100DE */,/*30563*/"LINEAR B IDEOGRAM VESSEL B200"/* 100DF */, /*30564*/"LINEAR B IDEOGRAM VESSEL B201"/* 100E0 */,/*30565*/"LINEAR B IDEOGRAM VESSEL B202"/* 100E1 */, /*30566*/"LINEAR B IDEOGRAM VESSEL B203"/* 100E2 */,/*30567*/"LINEAR B IDEOGRAM VESSEL B204"/* 100E3 */, /*30568*/"LINEAR B IDEOGRAM VESSEL B205"/* 100E4 */,/*30569*/"LINEAR B IDEOGRAM VESSEL B206"/* 100E5 */, /*30570*/"LINEAR B IDEOGRAM VESSEL B207"/* 100E6 */,/*30571*/"LINEAR B IDEOGRAM VESSEL B208"/* 100E7 */, /*30572*/"LINEAR B IDEOGRAM VESSEL B209"/* 100E8 */,/*30573*/"LINEAR B IDEOGRAM VESSEL B210"/* 100E9 */, /*30574*/"LINEAR B IDEOGRAM VESSEL B211"/* 100EA */,/*30575*/"LINEAR B IDEOGRAM VESSEL B212"/* 100EB */, /*30576*/"LINEAR B IDEOGRAM VESSEL B213"/* 100EC */,/*30577*/"LINEAR B IDEOGRAM VESSEL B214"/* 100ED */, /*30578*/"LINEAR B IDEOGRAM VESSEL B215"/* 100EE */,/*30579*/"LINEAR B IDEOGRAM VESSEL B216"/* 100EF */, /*30580*/"LINEAR B IDEOGRAM VESSEL B217"/* 100F0 */,/*30581*/"LINEAR B IDEOGRAM VESSEL B218"/* 100F1 */, /*30582*/"LINEAR B IDEOGRAM VESSEL B219"/* 100F2 */,/*30583*/"LINEAR B IDEOGRAM VESSEL B221"/* 100F3 */, /*30584*/"LINEAR B IDEOGRAM VESSEL B222"/* 100F4 */,/*30585*/"LINEAR B IDEOGRAM VESSEL B226"/* 100F5 */, /*30586*/"LINEAR B IDEOGRAM VESSEL B227"/* 100F6 */,/*30587*/"LINEAR B IDEOGRAM VESSEL B228"/* 100F7 */, /*30588*/"LINEAR B IDEOGRAM VESSEL B229"/* 100F8 */,/*30589*/"LINEAR B IDEOGRAM VESSEL B250"/* 100F9 */, /*30590*/"LINEAR B IDEOGRAM VESSEL B305"/* 100FA */,NULL,NULL,NULL,NULL,NULL, /*30596*/"AEGEAN WORD SEPARATOR LINE"/* 10100 */,/*30597*/"AEGEAN WORD SEPARATOR DOT"/* 10101 */, /*30598*/"AEGEAN CHECK MARK"/* 10102 */,NULL,NULL,NULL,NULL,/*30603*/"AEGEAN NUMBER ONE"/* 10107 */, /*30604*/"AEGEAN NUMBER TWO"/* 10108 */,/*30605*/"AEGEAN NUMBER THREE"/* 10109 */, /*30606*/"AEGEAN NUMBER FOUR"/* 1010A */,/*30607*/"AEGEAN NUMBER FIVE"/* 1010B */, /*30608*/"AEGEAN NUMBER SIX"/* 1010C */,/*30609*/"AEGEAN NUMBER SEVEN"/* 1010D */, /*30610*/"AEGEAN NUMBER EIGHT"/* 1010E */,/*30611*/"AEGEAN NUMBER NINE"/* 1010F */, /*30612*/"AEGEAN NUMBER TEN"/* 10110 */,/*30613*/"AEGEAN NUMBER TWENTY"/* 10111 */, /*30614*/"AEGEAN NUMBER THIRTY"/* 10112 */,/*30615*/"AEGEAN NUMBER FORTY"/* 10113 */, /*30616*/"AEGEAN NUMBER FIFTY"/* 10114 */,/*30617*/"AEGEAN NUMBER SIXTY"/* 10115 */, /*30618*/"AEGEAN NUMBER SEVENTY"/* 10116 */,/*30619*/"AEGEAN NUMBER EIGHTY"/* 10117 */, /*30620*/"AEGEAN NUMBER NINETY"/* 10118 */,/*30621*/"AEGEAN NUMBER ONE HUNDRED"/* 10119 */, /*30622*/"AEGEAN NUMBER TWO HUNDRED"/* 1011A */,/*30623*/"AEGEAN NUMBER THREE HUNDRED"/* 1011B */, /*30624*/"AEGEAN NUMBER FOUR HUNDRED"/* 1011C */,/*30625*/"AEGEAN NUMBER FIVE HUNDRED"/* 1011D */, /*30626*/"AEGEAN NUMBER SIX HUNDRED"/* 1011E */,/*30627*/"AEGEAN NUMBER SEVEN HUNDRED"/* 1011F */, /*30628*/"AEGEAN NUMBER EIGHT HUNDRED"/* 10120 */,/*30629*/"AEGEAN NUMBER NINE HUNDRED"/* 10121 */, /*30630*/"AEGEAN NUMBER ONE THOUSAND"/* 10122 */,/*30631*/"AEGEAN NUMBER TWO THOUSAND"/* 10123 */, /*30632*/"AEGEAN NUMBER THREE THOUSAND"/* 10124 */,/*30633*/"AEGEAN NUMBER FOUR THOUSAND"/* 10125 */, /*30634*/"AEGEAN NUMBER FIVE THOUSAND"/* 10126 */,/*30635*/"AEGEAN NUMBER SIX THOUSAND"/* 10127 */, /*30636*/"AEGEAN NUMBER SEVEN THOUSAND"/* 10128 */,/*30637*/"AEGEAN NUMBER EIGHT THOUSAND"/* 10129 */, /*30638*/"AEGEAN NUMBER NINE THOUSAND"/* 1012A */,/*30639*/"AEGEAN NUMBER TEN THOUSAND"/* 1012B */, /*30640*/"AEGEAN NUMBER TWENTY THOUSAND"/* 1012C */,/*30641*/"AEGEAN NUMBER THIRTY THOUSAND"/* 1012D */, /*30642*/"AEGEAN NUMBER FORTY THOUSAND"/* 1012E */,/*30643*/"AEGEAN NUMBER FIFTY THOUSAND"/* 1012F */, /*30644*/"AEGEAN NUMBER SIXTY THOUSAND"/* 10130 */,/*30645*/"AEGEAN NUMBER SEVENTY THOUSAND"/* 10131 */, /*30646*/"AEGEAN NUMBER EIGHTY THOUSAND"/* 10132 */,/*30647*/"AEGEAN NUMBER NINETY THOUSAND"/* 10133 */,NULL,NULL,NULL, /*30651*/"AEGEAN WEIGHT BASE UNIT"/* 10137 */,/*30652*/"AEGEAN WEIGHT FIRST SUBUNIT"/* 10138 */, /*30653*/"AEGEAN WEIGHT SECOND SUBUNIT"/* 10139 */,/*30654*/"AEGEAN WEIGHT THIRD SUBUNIT"/* 1013A */, /*30655*/"AEGEAN WEIGHT FOURTH SUBUNIT"/* 1013B */,/*30656*/"AEGEAN DRY MEASURE FIRST SUBUNIT"/* 1013C */, /*30657*/"AEGEAN LIQUID MEASURE FIRST SUBUNIT"/* 1013D */,/*30658*/"AEGEAN MEASURE SECOND SUBUNIT"/* 1013E */, /*30659*/"AEGEAN MEASURE THIRD SUBUNIT"/* 1013F */,/*30660*/"GREEK ACROPHONIC ATTIC ONE QUARTER"/* 10140 */, /*30661*/"GREEK ACROPHONIC ATTIC ONE HALF"/* 10141 */,/*30662*/"GREEK ACROPHONIC ATTIC ONE DRACHMA"/* 10142 */, /*30663*/"GREEK ACROPHONIC ATTIC FIVE"/* 10143 */,/*30664*/"GREEK ACROPHONIC ATTIC FIFTY"/* 10144 */, /*30665*/"GREEK ACROPHONIC ATTIC FIVE HUNDRED"/* 10145 */,/*30666*/"GREEK ACROPHONIC ATTIC FIVE THOUSAND"/* 10146 */, /*30667*/"GREEK ACROPHONIC ATTIC FIFTY THOUSAND"/* 10147 */,/*30668*/"GREEK ACROPHONIC ATTIC FIVE TALENTS"/* 10148 */, /*30669*/"GREEK ACROPHONIC ATTIC TEN TALENTS"/* 10149 */,/*30670*/"GREEK ACROPHONIC ATTIC FIFTY TALENTS"/* 1014A */, /*30671*/"GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS"/* 1014B */, /*30672*/"GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS"/* 1014C */, /*30673*/"GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS"/* 1014D */, /*30674*/"GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS"/* 1014E */, /*30675*/"GREEK ACROPHONIC ATTIC FIVE STATERS"/* 1014F */,/*30676*/"GREEK ACROPHONIC ATTIC TEN STATERS"/* 10150 */, /*30677*/"GREEK ACROPHONIC ATTIC FIFTY STATERS"/* 10151 */, /*30678*/"GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS"/* 10152 */, /*30679*/"GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS"/* 10153 */, /*30680*/"GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS"/* 10154 */, /*30681*/"GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS"/* 10155 */, /*30682*/"GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS"/* 10156 */, /*30683*/"GREEK ACROPHONIC ATTIC TEN MNAS"/* 10157 */,/*30684*/"GREEK ACROPHONIC HERAEUM ONE PLETHRON"/* 10158 */, /*30685*/"GREEK ACROPHONIC THESPIAN ONE"/* 10159 */,/*30686*/"GREEK ACROPHONIC HERMIONIAN ONE"/* 1015A */, /*30687*/"GREEK ACROPHONIC EPIDAUREAN TWO"/* 1015B */,/*30688*/"GREEK ACROPHONIC THESPIAN TWO"/* 1015C */, /*30689*/"GREEK ACROPHONIC CYRENAIC TWO DRACHMAS"/* 1015D */, /*30690*/"GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS"/* 1015E */,/*30691*/"GREEK ACROPHONIC TROEZENIAN FIVE"/* 1015F */, /*30692*/"GREEK ACROPHONIC TROEZENIAN TEN"/* 10160 */, /*30693*/"GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM"/* 10161 */, /*30694*/"GREEK ACROPHONIC HERMIONIAN TEN"/* 10162 */,/*30695*/"GREEK ACROPHONIC MESSENIAN TEN"/* 10163 */, /*30696*/"GREEK ACROPHONIC THESPIAN TEN"/* 10164 */,/*30697*/"GREEK ACROPHONIC THESPIAN THIRTY"/* 10165 */, /*30698*/"GREEK ACROPHONIC TROEZENIAN FIFTY"/* 10166 */, /*30699*/"GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM"/* 10167 */, /*30700*/"GREEK ACROPHONIC HERMIONIAN FIFTY"/* 10168 */,/*30701*/"GREEK ACROPHONIC THESPIAN FIFTY"/* 10169 */, /*30702*/"GREEK ACROPHONIC THESPIAN ONE HUNDRED"/* 1016A */, /*30703*/"GREEK ACROPHONIC THESPIAN THREE HUNDRED"/* 1016B */, /*30704*/"GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED"/* 1016C */, /*30705*/"GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED"/* 1016D */, /*30706*/"GREEK ACROPHONIC THESPIAN FIVE HUNDRED"/* 1016E */, /*30707*/"GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED"/* 1016F */,/*30708*/"GREEK ACROPHONIC NAXIAN FIVE HUNDRED"/* 10170 */, /*30709*/"GREEK ACROPHONIC THESPIAN ONE THOUSAND"/* 10171 */, /*30710*/"GREEK ACROPHONIC THESPIAN FIVE THOUSAND"/* 10172 */,/*30711*/"GREEK ACROPHONIC DELPHIC FIVE MNAS"/* 10173 */, /*30712*/"GREEK ACROPHONIC STRATIAN FIFTY MNAS"/* 10174 */,/*30713*/"GREEK ONE HALF SIGN"/* 10175 */, /*30714*/"GREEK ONE HALF SIGN ALTERNATE FORM"/* 10176 */,/*30715*/"GREEK TWO THIRDS SIGN"/* 10177 */, /*30716*/"GREEK THREE QUARTERS SIGN"/* 10178 */,/*30717*/"GREEK YEAR SIGN"/* 10179 */, /*30718*/"GREEK TALENT SIGN"/* 1017A */,/*30719*/"GREEK DRACHMA SIGN"/* 1017B */,/*30720*/"GREEK OBOL SIGN"/* 1017C */, /*30721*/"GREEK TWO OBOLS SIGN"/* 1017D */,/*30722*/"GREEK THREE OBOLS SIGN"/* 1017E */, /*30723*/"GREEK FOUR OBOLS SIGN"/* 1017F */,/*30724*/"GREEK FIVE OBOLS SIGN"/* 10180 */, /*30725*/"GREEK METRETES SIGN"/* 10181 */,/*30726*/"GREEK KYATHOS BASE SIGN"/* 10182 */, /*30727*/"GREEK LITRA SIGN"/* 10183 */,/*30728*/"GREEK OUNKIA SIGN"/* 10184 */,/*30729*/"GREEK XESTES SIGN"/* 10185 */, /*30730*/"GREEK ARTABE SIGN"/* 10186 */,/*30731*/"GREEK AROURA SIGN"/* 10187 */,/*30732*/"GREEK GRAMMA SIGN"/* 10188 */, /*30733*/"GREEK TRYBLION BASE SIGN"/* 10189 */,/*30734*/"GREEK ZERO SIGN"/* 1018A */, /*30735*/"GREEK ONE QUARTER SIGN"/* 1018B */,/*30736*/"GREEK SINUSOID SIGN"/* 1018C */, /*30737*/"GREEK INDICTION SIGN"/* 1018D */,/*30738*/"NOMISMA SIGN"/* 1018E */,NULL, /*30740*/"ROMAN SEXTANS SIGN"/* 10190 */,/*30741*/"ROMAN UNCIA SIGN"/* 10191 */, /*30742*/"ROMAN SEMUNCIA SIGN"/* 10192 */,/*30743*/"ROMAN SEXTULA SIGN"/* 10193 */, /*30744*/"ROMAN DIMIDIA SEXTULA SIGN"/* 10194 */,/*30745*/"ROMAN SILIQUA SIGN"/* 10195 */, /*30746*/"ROMAN DENARIUS SIGN"/* 10196 */,/*30747*/"ROMAN QUINARIUS SIGN"/* 10197 */, /*30748*/"ROMAN SESTERTIUS SIGN"/* 10198 */,/*30749*/"ROMAN DUPONDIUS SIGN"/* 10199 */, /*30750*/"ROMAN AS SIGN"/* 1019A */,/*30751*/"ROMAN CENTURIAL SIGN"/* 1019B */,NULL,NULL,NULL,NULL, /*30756*/"GREEK SYMBOL TAU RHO"/* 101A0 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*30804*/"PHAISTOS DISC SIGN PEDESTRIAN"/* 101D0 */, /*30805*/"PHAISTOS DISC SIGN PLUMED HEAD"/* 101D1 */,/*30806*/"PHAISTOS DISC SIGN TATTOOED HEAD"/* 101D2 */, /*30807*/"PHAISTOS DISC SIGN CAPTIVE"/* 101D3 */,/*30808*/"PHAISTOS DISC SIGN CHILD"/* 101D4 */, /*30809*/"PHAISTOS DISC SIGN WOMAN"/* 101D5 */,/*30810*/"PHAISTOS DISC SIGN HELMET"/* 101D6 */, /*30811*/"PHAISTOS DISC SIGN GAUNTLET"/* 101D7 */,/*30812*/"PHAISTOS DISC SIGN TIARA"/* 101D8 */, /*30813*/"PHAISTOS DISC SIGN ARROW"/* 101D9 */,/*30814*/"PHAISTOS DISC SIGN BOW"/* 101DA */, /*30815*/"PHAISTOS DISC SIGN SHIELD"/* 101DB */,/*30816*/"PHAISTOS DISC SIGN CLUB"/* 101DC */, /*30817*/"PHAISTOS DISC SIGN MANACLES"/* 101DD */,/*30818*/"PHAISTOS DISC SIGN MATTOCK"/* 101DE */, /*30819*/"PHAISTOS DISC SIGN SAW"/* 101DF */,/*30820*/"PHAISTOS DISC SIGN LID"/* 101E0 */, /*30821*/"PHAISTOS DISC SIGN BOOMERANG"/* 101E1 */,/*30822*/"PHAISTOS DISC SIGN CARPENTRY PLANE"/* 101E2 */, /*30823*/"PHAISTOS DISC SIGN DOLIUM"/* 101E3 */,/*30824*/"PHAISTOS DISC SIGN COMB"/* 101E4 */, /*30825*/"PHAISTOS DISC SIGN SLING"/* 101E5 */,/*30826*/"PHAISTOS DISC SIGN COLUMN"/* 101E6 */, /*30827*/"PHAISTOS DISC SIGN BEEHIVE"/* 101E7 */,/*30828*/"PHAISTOS DISC SIGN SHIP"/* 101E8 */, /*30829*/"PHAISTOS DISC SIGN HORN"/* 101E9 */,/*30830*/"PHAISTOS DISC SIGN HIDE"/* 101EA */, /*30831*/"PHAISTOS DISC SIGN BULLS LEG"/* 101EB */,/*30832*/"PHAISTOS DISC SIGN CAT"/* 101EC */, /*30833*/"PHAISTOS DISC SIGN RAM"/* 101ED */,/*30834*/"PHAISTOS DISC SIGN EAGLE"/* 101EE */, /*30835*/"PHAISTOS DISC SIGN DOVE"/* 101EF */,/*30836*/"PHAISTOS DISC SIGN TUNNY"/* 101F0 */, /*30837*/"PHAISTOS DISC SIGN BEE"/* 101F1 */,/*30838*/"PHAISTOS DISC SIGN PLANE TREE"/* 101F2 */, /*30839*/"PHAISTOS DISC SIGN VINE"/* 101F3 */,/*30840*/"PHAISTOS DISC SIGN PAPYRUS"/* 101F4 */, /*30841*/"PHAISTOS DISC SIGN ROSETTE"/* 101F5 */,/*30842*/"PHAISTOS DISC SIGN LILY"/* 101F6 */, /*30843*/"PHAISTOS DISC SIGN OX BACK"/* 101F7 */,/*30844*/"PHAISTOS DISC SIGN FLUTE"/* 101F8 */, /*30845*/"PHAISTOS DISC SIGN GRATER"/* 101F9 */,/*30846*/"PHAISTOS DISC SIGN STRAINER"/* 101FA */, /*30847*/"PHAISTOS DISC SIGN SMALL AXE"/* 101FB */,/*30848*/"PHAISTOS DISC SIGN WAVY BAND"/* 101FC */, /*30849*/"PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE"/* 101FD */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*30980*/"LYCIAN LETTER A"/* 10280 */,/*30981*/"LYCIAN LETTER E"/* 10281 */,/*30982*/"LYCIAN LETTER B"/* 10282 */, /*30983*/"LYCIAN LETTER BH"/* 10283 */,/*30984*/"LYCIAN LETTER G"/* 10284 */,/*30985*/"LYCIAN LETTER D"/* 10285 */, /*30986*/"LYCIAN LETTER I"/* 10286 */,/*30987*/"LYCIAN LETTER W"/* 10287 */,/*30988*/"LYCIAN LETTER Z"/* 10288 */, /*30989*/"LYCIAN LETTER TH"/* 10289 */,/*30990*/"LYCIAN LETTER J"/* 1028A */,/*30991*/"LYCIAN LETTER K"/* 1028B */, /*30992*/"LYCIAN LETTER Q"/* 1028C */,/*30993*/"LYCIAN LETTER L"/* 1028D */,/*30994*/"LYCIAN LETTER M"/* 1028E */, /*30995*/"LYCIAN LETTER N"/* 1028F */,/*30996*/"LYCIAN LETTER MM"/* 10290 */,/*30997*/"LYCIAN LETTER NN"/* 10291 */, /*30998*/"LYCIAN LETTER U"/* 10292 */,/*30999*/"LYCIAN LETTER P"/* 10293 */,/*31000*/"LYCIAN LETTER KK"/* 10294 */, /*31001*/"LYCIAN LETTER R"/* 10295 */,/*31002*/"LYCIAN LETTER S"/* 10296 */,/*31003*/"LYCIAN LETTER T"/* 10297 */, /*31004*/"LYCIAN LETTER TT"/* 10298 */,/*31005*/"LYCIAN LETTER AN"/* 10299 */,/*31006*/"LYCIAN LETTER EN"/* 1029A */, /*31007*/"LYCIAN LETTER H"/* 1029B */,/*31008*/"LYCIAN LETTER X"/* 1029C */,NULL,NULL,NULL, /*31012*/"CARIAN LETTER A"/* 102A0 */,/*31013*/"CARIAN LETTER P2"/* 102A1 */,/*31014*/"CARIAN LETTER D"/* 102A2 */, /*31015*/"CARIAN LETTER L"/* 102A3 */,/*31016*/"CARIAN LETTER UUU"/* 102A4 */,/*31017*/"CARIAN LETTER R"/* 102A5 */, /*31018*/"CARIAN LETTER LD"/* 102A6 */,/*31019*/"CARIAN LETTER A2"/* 102A7 */,/*31020*/"CARIAN LETTER Q"/* 102A8 */, /*31021*/"CARIAN LETTER B"/* 102A9 */,/*31022*/"CARIAN LETTER M"/* 102AA */,/*31023*/"CARIAN LETTER O"/* 102AB */, /*31024*/"CARIAN LETTER D2"/* 102AC */,/*31025*/"CARIAN LETTER T"/* 102AD */,/*31026*/"CARIAN LETTER SH"/* 102AE */, /*31027*/"CARIAN LETTER SH2"/* 102AF */,/*31028*/"CARIAN LETTER S"/* 102B0 */,/*31029*/"CARIAN LETTER C-18"/* 102B1 */, /*31030*/"CARIAN LETTER U"/* 102B2 */,/*31031*/"CARIAN LETTER NN"/* 102B3 */,/*31032*/"CARIAN LETTER X"/* 102B4 */, /*31033*/"CARIAN LETTER N"/* 102B5 */,/*31034*/"CARIAN LETTER TT2"/* 102B6 */,/*31035*/"CARIAN LETTER P"/* 102B7 */, /*31036*/"CARIAN LETTER SS"/* 102B8 */,/*31037*/"CARIAN LETTER I"/* 102B9 */,/*31038*/"CARIAN LETTER E"/* 102BA */, /*31039*/"CARIAN LETTER UUUU"/* 102BB */,/*31040*/"CARIAN LETTER K"/* 102BC */,/*31041*/"CARIAN LETTER K2"/* 102BD */, /*31042*/"CARIAN LETTER ND"/* 102BE */,/*31043*/"CARIAN LETTER UU"/* 102BF */,/*31044*/"CARIAN LETTER G"/* 102C0 */, /*31045*/"CARIAN LETTER G2"/* 102C1 */,/*31046*/"CARIAN LETTER ST"/* 102C2 */,/*31047*/"CARIAN LETTER ST2"/* 102C3 */, /*31048*/"CARIAN LETTER NG"/* 102C4 */,/*31049*/"CARIAN LETTER II"/* 102C5 */,/*31050*/"CARIAN LETTER C-39"/* 102C6 */, /*31051*/"CARIAN LETTER TT"/* 102C7 */,/*31052*/"CARIAN LETTER UUU2"/* 102C8 */,/*31053*/"CARIAN LETTER RR"/* 102C9 */, /*31054*/"CARIAN LETTER MB"/* 102CA */,/*31055*/"CARIAN LETTER MB2"/* 102CB */,/*31056*/"CARIAN LETTER MB3"/* 102CC */, /*31057*/"CARIAN LETTER MB4"/* 102CD */,/*31058*/"CARIAN LETTER LD2"/* 102CE */,/*31059*/"CARIAN LETTER E2"/* 102CF */, /*31060*/"CARIAN LETTER UUU3"/* 102D0 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*31076*/"COPTIC EPACT THOUSANDS MARK"/* 102E0 */,/*31077*/"COPTIC EPACT DIGIT ONE"/* 102E1 */, /*31078*/"COPTIC EPACT DIGIT TWO"/* 102E2 */,/*31079*/"COPTIC EPACT DIGIT THREE"/* 102E3 */, /*31080*/"COPTIC EPACT DIGIT FOUR"/* 102E4 */,/*31081*/"COPTIC EPACT DIGIT FIVE"/* 102E5 */, /*31082*/"COPTIC EPACT DIGIT SIX"/* 102E6 */,/*31083*/"COPTIC EPACT DIGIT SEVEN"/* 102E7 */, /*31084*/"COPTIC EPACT DIGIT EIGHT"/* 102E8 */,/*31085*/"COPTIC EPACT DIGIT NINE"/* 102E9 */, /*31086*/"COPTIC EPACT NUMBER TEN"/* 102EA */,/*31087*/"COPTIC EPACT NUMBER TWENTY"/* 102EB */, /*31088*/"COPTIC EPACT NUMBER THIRTY"/* 102EC */,/*31089*/"COPTIC EPACT NUMBER FORTY"/* 102ED */, /*31090*/"COPTIC EPACT NUMBER FIFTY"/* 102EE */,/*31091*/"COPTIC EPACT NUMBER SIXTY"/* 102EF */, /*31092*/"COPTIC EPACT NUMBER SEVENTY"/* 102F0 */,/*31093*/"COPTIC EPACT NUMBER EIGHTY"/* 102F1 */, /*31094*/"COPTIC EPACT NUMBER NINETY"/* 102F2 */,/*31095*/"COPTIC EPACT NUMBER ONE HUNDRED"/* 102F3 */, /*31096*/"COPTIC EPACT NUMBER TWO HUNDRED"/* 102F4 */,/*31097*/"COPTIC EPACT NUMBER THREE HUNDRED"/* 102F5 */, /*31098*/"COPTIC EPACT NUMBER FOUR HUNDRED"/* 102F6 */,/*31099*/"COPTIC EPACT NUMBER FIVE HUNDRED"/* 102F7 */, /*31100*/"COPTIC EPACT NUMBER SIX HUNDRED"/* 102F8 */,/*31101*/"COPTIC EPACT NUMBER SEVEN HUNDRED"/* 102F9 */, /*31102*/"COPTIC EPACT NUMBER EIGHT HUNDRED"/* 102FA */,/*31103*/"COPTIC EPACT NUMBER NINE HUNDRED"/* 102FB */,NULL,NULL, NULL,NULL,/*31108*/"OLD ITALIC LETTER A"/* 10300 */,/*31109*/"OLD ITALIC LETTER BE"/* 10301 */, /*31110*/"OLD ITALIC LETTER KE"/* 10302 */,/*31111*/"OLD ITALIC LETTER DE"/* 10303 */, /*31112*/"OLD ITALIC LETTER E"/* 10304 */,/*31113*/"OLD ITALIC LETTER VE"/* 10305 */, /*31114*/"OLD ITALIC LETTER ZE"/* 10306 */,/*31115*/"OLD ITALIC LETTER HE"/* 10307 */, /*31116*/"OLD ITALIC LETTER THE"/* 10308 */,/*31117*/"OLD ITALIC LETTER I"/* 10309 */, /*31118*/"OLD ITALIC LETTER KA"/* 1030A */,/*31119*/"OLD ITALIC LETTER EL"/* 1030B */, /*31120*/"OLD ITALIC LETTER EM"/* 1030C */,/*31121*/"OLD ITALIC LETTER EN"/* 1030D */, /*31122*/"OLD ITALIC LETTER ESH"/* 1030E */,/*31123*/"OLD ITALIC LETTER O"/* 1030F */, /*31124*/"OLD ITALIC LETTER PE"/* 10310 */,/*31125*/"OLD ITALIC LETTER SHE"/* 10311 */, /*31126*/"OLD ITALIC LETTER KU"/* 10312 */,/*31127*/"OLD ITALIC LETTER ER"/* 10313 */, /*31128*/"OLD ITALIC LETTER ES"/* 10314 */,/*31129*/"OLD ITALIC LETTER TE"/* 10315 */, /*31130*/"OLD ITALIC LETTER U"/* 10316 */,/*31131*/"OLD ITALIC LETTER EKS"/* 10317 */, /*31132*/"OLD ITALIC LETTER PHE"/* 10318 */,/*31133*/"OLD ITALIC LETTER KHE"/* 10319 */, /*31134*/"OLD ITALIC LETTER EF"/* 1031A */,/*31135*/"OLD ITALIC LETTER ERS"/* 1031B */, /*31136*/"OLD ITALIC LETTER CHE"/* 1031C */,/*31137*/"OLD ITALIC LETTER II"/* 1031D */, /*31138*/"OLD ITALIC LETTER UU"/* 1031E */,/*31139*/"OLD ITALIC LETTER ESS"/* 1031F */, /*31140*/"OLD ITALIC NUMERAL ONE"/* 10320 */,/*31141*/"OLD ITALIC NUMERAL FIVE"/* 10321 */, /*31142*/"OLD ITALIC NUMERAL TEN"/* 10322 */,/*31143*/"OLD ITALIC NUMERAL FIFTY"/* 10323 */,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,/*31153*/"OLD ITALIC LETTER YE"/* 1032D */,/*31154*/"OLD ITALIC LETTER NORTHERN TSE"/* 1032E */, /*31155*/"OLD ITALIC LETTER SOUTHERN TSE"/* 1032F */,/*31156*/"GOTHIC LETTER AHSA"/* 10330 */, /*31157*/"GOTHIC LETTER BAIRKAN"/* 10331 */,/*31158*/"GOTHIC LETTER GIBA"/* 10332 */, /*31159*/"GOTHIC LETTER DAGS"/* 10333 */,/*31160*/"GOTHIC LETTER AIHVUS"/* 10334 */, /*31161*/"GOTHIC LETTER QAIRTHRA"/* 10335 */,/*31162*/"GOTHIC LETTER IUJA"/* 10336 */, /*31163*/"GOTHIC LETTER HAGL"/* 10337 */,/*31164*/"GOTHIC LETTER THIUTH"/* 10338 */, /*31165*/"GOTHIC LETTER EIS"/* 10339 */,/*31166*/"GOTHIC LETTER KUSMA"/* 1033A */, /*31167*/"GOTHIC LETTER LAGUS"/* 1033B */,/*31168*/"GOTHIC LETTER MANNA"/* 1033C */, /*31169*/"GOTHIC LETTER NAUTHS"/* 1033D */,/*31170*/"GOTHIC LETTER JER"/* 1033E */, /*31171*/"GOTHIC LETTER URUS"/* 1033F */,/*31172*/"GOTHIC LETTER PAIRTHRA"/* 10340 */, /*31173*/"GOTHIC LETTER NINETY"/* 10341 */,/*31174*/"GOTHIC LETTER RAIDA"/* 10342 */, /*31175*/"GOTHIC LETTER SAUIL"/* 10343 */,/*31176*/"GOTHIC LETTER TEIWS"/* 10344 */, /*31177*/"GOTHIC LETTER WINJA"/* 10345 */,/*31178*/"GOTHIC LETTER FAIHU"/* 10346 */, /*31179*/"GOTHIC LETTER IGGWS"/* 10347 */,/*31180*/"GOTHIC LETTER HWAIR"/* 10348 */, /*31181*/"GOTHIC LETTER OTHAL"/* 10349 */,/*31182*/"GOTHIC LETTER NINE HUNDRED"/* 1034A */,NULL,NULL,NULL,NULL,NULL, /*31188*/"OLD PERMIC LETTER AN"/* 10350 */,/*31189*/"OLD PERMIC LETTER BUR"/* 10351 */, /*31190*/"OLD PERMIC LETTER GAI"/* 10352 */,/*31191*/"OLD PERMIC LETTER DOI"/* 10353 */, /*31192*/"OLD PERMIC LETTER E"/* 10354 */,/*31193*/"OLD PERMIC LETTER ZHOI"/* 10355 */, /*31194*/"OLD PERMIC LETTER DZHOI"/* 10356 */,/*31195*/"OLD PERMIC LETTER ZATA"/* 10357 */, /*31196*/"OLD PERMIC LETTER DZITA"/* 10358 */,/*31197*/"OLD PERMIC LETTER I"/* 10359 */, /*31198*/"OLD PERMIC LETTER KOKE"/* 1035A */,/*31199*/"OLD PERMIC LETTER LEI"/* 1035B */, /*31200*/"OLD PERMIC LETTER MENOE"/* 1035C */,/*31201*/"OLD PERMIC LETTER NENOE"/* 1035D */, /*31202*/"OLD PERMIC LETTER VOOI"/* 1035E */,/*31203*/"OLD PERMIC LETTER PEEI"/* 1035F */, /*31204*/"OLD PERMIC LETTER REI"/* 10360 */,/*31205*/"OLD PERMIC LETTER SII"/* 10361 */, /*31206*/"OLD PERMIC LETTER TAI"/* 10362 */,/*31207*/"OLD PERMIC LETTER U"/* 10363 */, /*31208*/"OLD PERMIC LETTER CHERY"/* 10364 */,/*31209*/"OLD PERMIC LETTER SHOOI"/* 10365 */, /*31210*/"OLD PERMIC LETTER SHCHOOI"/* 10366 */,/*31211*/"OLD PERMIC LETTER YRY"/* 10367 */, /*31212*/"OLD PERMIC LETTER YERU"/* 10368 */,/*31213*/"OLD PERMIC LETTER O"/* 10369 */, /*31214*/"OLD PERMIC LETTER OO"/* 1036A */,/*31215*/"OLD PERMIC LETTER EF"/* 1036B */, /*31216*/"OLD PERMIC LETTER HA"/* 1036C */,/*31217*/"OLD PERMIC LETTER TSIU"/* 1036D */, /*31218*/"OLD PERMIC LETTER VER"/* 1036E */,/*31219*/"OLD PERMIC LETTER YER"/* 1036F */, /*31220*/"OLD PERMIC LETTER YERI"/* 10370 */,/*31221*/"OLD PERMIC LETTER YAT"/* 10371 */, /*31222*/"OLD PERMIC LETTER IE"/* 10372 */,/*31223*/"OLD PERMIC LETTER YU"/* 10373 */, /*31224*/"OLD PERMIC LETTER YA"/* 10374 */,/*31225*/"OLD PERMIC LETTER IA"/* 10375 */, /*31226*/"COMBINING OLD PERMIC LETTER AN"/* 10376 */,/*31227*/"COMBINING OLD PERMIC LETTER DOI"/* 10377 */, /*31228*/"COMBINING OLD PERMIC LETTER ZATA"/* 10378 */,/*31229*/"COMBINING OLD PERMIC LETTER NENOE"/* 10379 */, /*31230*/"COMBINING OLD PERMIC LETTER SII"/* 1037A */,NULL,NULL,NULL,NULL,NULL, /*31236*/"UGARITIC LETTER ALPA"/* 10380 */,/*31237*/"UGARITIC LETTER BETA"/* 10381 */, /*31238*/"UGARITIC LETTER GAMLA"/* 10382 */,/*31239*/"UGARITIC LETTER KHA"/* 10383 */, /*31240*/"UGARITIC LETTER DELTA"/* 10384 */,/*31241*/"UGARITIC LETTER HO"/* 10385 */, /*31242*/"UGARITIC LETTER WO"/* 10386 */,/*31243*/"UGARITIC LETTER ZETA"/* 10387 */, /*31244*/"UGARITIC LETTER HOTA"/* 10388 */,/*31245*/"UGARITIC LETTER TET"/* 10389 */, /*31246*/"UGARITIC LETTER YOD"/* 1038A */,/*31247*/"UGARITIC LETTER KAF"/* 1038B */, /*31248*/"UGARITIC LETTER SHIN"/* 1038C */,/*31249*/"UGARITIC LETTER LAMDA"/* 1038D */, /*31250*/"UGARITIC LETTER MEM"/* 1038E */,/*31251*/"UGARITIC LETTER DHAL"/* 1038F */, /*31252*/"UGARITIC LETTER NUN"/* 10390 */,/*31253*/"UGARITIC LETTER ZU"/* 10391 */, /*31254*/"UGARITIC LETTER SAMKA"/* 10392 */,/*31255*/"UGARITIC LETTER AIN"/* 10393 */, /*31256*/"UGARITIC LETTER PU"/* 10394 */,/*31257*/"UGARITIC LETTER SADE"/* 10395 */, /*31258*/"UGARITIC LETTER QOPA"/* 10396 */,/*31259*/"UGARITIC LETTER RASHA"/* 10397 */, /*31260*/"UGARITIC LETTER THANNA"/* 10398 */,/*31261*/"UGARITIC LETTER GHAIN"/* 10399 */, /*31262*/"UGARITIC LETTER TO"/* 1039A */,/*31263*/"UGARITIC LETTER I"/* 1039B */,/*31264*/"UGARITIC LETTER U"/* 1039C */, /*31265*/"UGARITIC LETTER SSU"/* 1039D */,NULL,/*31267*/"UGARITIC WORD DIVIDER"/* 1039F */, /*31268*/"OLD PERSIAN SIGN A"/* 103A0 */,/*31269*/"OLD PERSIAN SIGN I"/* 103A1 */, /*31270*/"OLD PERSIAN SIGN U"/* 103A2 */,/*31271*/"OLD PERSIAN SIGN KA"/* 103A3 */, /*31272*/"OLD PERSIAN SIGN KU"/* 103A4 */,/*31273*/"OLD PERSIAN SIGN GA"/* 103A5 */, /*31274*/"OLD PERSIAN SIGN GU"/* 103A6 */,/*31275*/"OLD PERSIAN SIGN XA"/* 103A7 */, /*31276*/"OLD PERSIAN SIGN CA"/* 103A8 */,/*31277*/"OLD PERSIAN SIGN JA"/* 103A9 */, /*31278*/"OLD PERSIAN SIGN JI"/* 103AA */,/*31279*/"OLD PERSIAN SIGN TA"/* 103AB */, /*31280*/"OLD PERSIAN SIGN TU"/* 103AC */,/*31281*/"OLD PERSIAN SIGN DA"/* 103AD */, /*31282*/"OLD PERSIAN SIGN DI"/* 103AE */,/*31283*/"OLD PERSIAN SIGN DU"/* 103AF */, /*31284*/"OLD PERSIAN SIGN THA"/* 103B0 */,/*31285*/"OLD PERSIAN SIGN PA"/* 103B1 */, /*31286*/"OLD PERSIAN SIGN BA"/* 103B2 */,/*31287*/"OLD PERSIAN SIGN FA"/* 103B3 */, /*31288*/"OLD PERSIAN SIGN NA"/* 103B4 */,/*31289*/"OLD PERSIAN SIGN NU"/* 103B5 */, /*31290*/"OLD PERSIAN SIGN MA"/* 103B6 */,/*31291*/"OLD PERSIAN SIGN MI"/* 103B7 */, /*31292*/"OLD PERSIAN SIGN MU"/* 103B8 */,/*31293*/"OLD PERSIAN SIGN YA"/* 103B9 */, /*31294*/"OLD PERSIAN SIGN VA"/* 103BA */,/*31295*/"OLD PERSIAN SIGN VI"/* 103BB */, /*31296*/"OLD PERSIAN SIGN RA"/* 103BC */,/*31297*/"OLD PERSIAN SIGN RU"/* 103BD */, /*31298*/"OLD PERSIAN SIGN LA"/* 103BE */,/*31299*/"OLD PERSIAN SIGN SA"/* 103BF */, /*31300*/"OLD PERSIAN SIGN ZA"/* 103C0 */,/*31301*/"OLD PERSIAN SIGN SHA"/* 103C1 */, /*31302*/"OLD PERSIAN SIGN SSA"/* 103C2 */,/*31303*/"OLD PERSIAN SIGN HA"/* 103C3 */,NULL,NULL,NULL,NULL, /*31308*/"OLD PERSIAN SIGN AURAMAZDAA"/* 103C8 */,/*31309*/"OLD PERSIAN SIGN AURAMAZDAA-2"/* 103C9 */, /*31310*/"OLD PERSIAN SIGN AURAMAZDAAHA"/* 103CA */,/*31311*/"OLD PERSIAN SIGN XSHAAYATHIYA"/* 103CB */, /*31312*/"OLD PERSIAN SIGN DAHYAAUSH"/* 103CC */,/*31313*/"OLD PERSIAN SIGN DAHYAAUSH-2"/* 103CD */, /*31314*/"OLD PERSIAN SIGN BAGA"/* 103CE */,/*31315*/"OLD PERSIAN SIGN BUUMISH"/* 103CF */, /*31316*/"OLD PERSIAN WORD DIVIDER"/* 103D0 */,/*31317*/"OLD PERSIAN NUMBER ONE"/* 103D1 */, /*31318*/"OLD PERSIAN NUMBER TWO"/* 103D2 */,/*31319*/"OLD PERSIAN NUMBER TEN"/* 103D3 */, /*31320*/"OLD PERSIAN NUMBER TWENTY"/* 103D4 */,/*31321*/"OLD PERSIAN NUMBER HUNDRED"/* 103D5 */,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*31364*/"DESERET CAPITAL LETTER LONG I"/* 10400 */,/*31365*/"DESERET CAPITAL LETTER LONG E"/* 10401 */, /*31366*/"DESERET CAPITAL LETTER LONG A"/* 10402 */,/*31367*/"DESERET CAPITAL LETTER LONG AH"/* 10403 */, /*31368*/"DESERET CAPITAL LETTER LONG O"/* 10404 */,/*31369*/"DESERET CAPITAL LETTER LONG OO"/* 10405 */, /*31370*/"DESERET CAPITAL LETTER SHORT I"/* 10406 */,/*31371*/"DESERET CAPITAL LETTER SHORT E"/* 10407 */, /*31372*/"DESERET CAPITAL LETTER SHORT A"/* 10408 */,/*31373*/"DESERET CAPITAL LETTER SHORT AH"/* 10409 */, /*31374*/"DESERET CAPITAL LETTER SHORT O"/* 1040A */,/*31375*/"DESERET CAPITAL LETTER SHORT OO"/* 1040B */, /*31376*/"DESERET CAPITAL LETTER AY"/* 1040C */,/*31377*/"DESERET CAPITAL LETTER OW"/* 1040D */, /*31378*/"DESERET CAPITAL LETTER WU"/* 1040E */,/*31379*/"DESERET CAPITAL LETTER YEE"/* 1040F */, /*31380*/"DESERET CAPITAL LETTER H"/* 10410 */,/*31381*/"DESERET CAPITAL LETTER PEE"/* 10411 */, /*31382*/"DESERET CAPITAL LETTER BEE"/* 10412 */,/*31383*/"DESERET CAPITAL LETTER TEE"/* 10413 */, /*31384*/"DESERET CAPITAL LETTER DEE"/* 10414 */,/*31385*/"DESERET CAPITAL LETTER CHEE"/* 10415 */, /*31386*/"DESERET CAPITAL LETTER JEE"/* 10416 */,/*31387*/"DESERET CAPITAL LETTER KAY"/* 10417 */, /*31388*/"DESERET CAPITAL LETTER GAY"/* 10418 */,/*31389*/"DESERET CAPITAL LETTER EF"/* 10419 */, /*31390*/"DESERET CAPITAL LETTER VEE"/* 1041A */,/*31391*/"DESERET CAPITAL LETTER ETH"/* 1041B */, /*31392*/"DESERET CAPITAL LETTER THEE"/* 1041C */,/*31393*/"DESERET CAPITAL LETTER ES"/* 1041D */, /*31394*/"DESERET CAPITAL LETTER ZEE"/* 1041E */,/*31395*/"DESERET CAPITAL LETTER ESH"/* 1041F */, /*31396*/"DESERET CAPITAL LETTER ZHEE"/* 10420 */,/*31397*/"DESERET CAPITAL LETTER ER"/* 10421 */, /*31398*/"DESERET CAPITAL LETTER EL"/* 10422 */,/*31399*/"DESERET CAPITAL LETTER EM"/* 10423 */, /*31400*/"DESERET CAPITAL LETTER EN"/* 10424 */,/*31401*/"DESERET CAPITAL LETTER ENG"/* 10425 */, /*31402*/"DESERET CAPITAL LETTER OI"/* 10426 */,/*31403*/"DESERET CAPITAL LETTER EW"/* 10427 */, /*31404*/"DESERET SMALL LETTER LONG I"/* 10428 */,/*31405*/"DESERET SMALL LETTER LONG E"/* 10429 */, /*31406*/"DESERET SMALL LETTER LONG A"/* 1042A */,/*31407*/"DESERET SMALL LETTER LONG AH"/* 1042B */, /*31408*/"DESERET SMALL LETTER LONG O"/* 1042C */,/*31409*/"DESERET SMALL LETTER LONG OO"/* 1042D */, /*31410*/"DESERET SMALL LETTER SHORT I"/* 1042E */,/*31411*/"DESERET SMALL LETTER SHORT E"/* 1042F */, /*31412*/"DESERET SMALL LETTER SHORT A"/* 10430 */,/*31413*/"DESERET SMALL LETTER SHORT AH"/* 10431 */, /*31414*/"DESERET SMALL LETTER SHORT O"/* 10432 */,/*31415*/"DESERET SMALL LETTER SHORT OO"/* 10433 */, /*31416*/"DESERET SMALL LETTER AY"/* 10434 */,/*31417*/"DESERET SMALL LETTER OW"/* 10435 */, /*31418*/"DESERET SMALL LETTER WU"/* 10436 */,/*31419*/"DESERET SMALL LETTER YEE"/* 10437 */, /*31420*/"DESERET SMALL LETTER H"/* 10438 */,/*31421*/"DESERET SMALL LETTER PEE"/* 10439 */, /*31422*/"DESERET SMALL LETTER BEE"/* 1043A */,/*31423*/"DESERET SMALL LETTER TEE"/* 1043B */, /*31424*/"DESERET SMALL LETTER DEE"/* 1043C */,/*31425*/"DESERET SMALL LETTER CHEE"/* 1043D */, /*31426*/"DESERET SMALL LETTER JEE"/* 1043E */,/*31427*/"DESERET SMALL LETTER KAY"/* 1043F */, /*31428*/"DESERET SMALL LETTER GAY"/* 10440 */,/*31429*/"DESERET SMALL LETTER EF"/* 10441 */, /*31430*/"DESERET SMALL LETTER VEE"/* 10442 */,/*31431*/"DESERET SMALL LETTER ETH"/* 10443 */, /*31432*/"DESERET SMALL LETTER THEE"/* 10444 */,/*31433*/"DESERET SMALL LETTER ES"/* 10445 */, /*31434*/"DESERET SMALL LETTER ZEE"/* 10446 */,/*31435*/"DESERET SMALL LETTER ESH"/* 10447 */, /*31436*/"DESERET SMALL LETTER ZHEE"/* 10448 */,/*31437*/"DESERET SMALL LETTER ER"/* 10449 */, /*31438*/"DESERET SMALL LETTER EL"/* 1044A */,/*31439*/"DESERET SMALL LETTER EM"/* 1044B */, /*31440*/"DESERET SMALL LETTER EN"/* 1044C */,/*31441*/"DESERET SMALL LETTER ENG"/* 1044D */, /*31442*/"DESERET SMALL LETTER OI"/* 1044E */,/*31443*/"DESERET SMALL LETTER EW"/* 1044F */, /*31444*/"SHAVIAN LETTER PEEP"/* 10450 */,/*31445*/"SHAVIAN LETTER TOT"/* 10451 */, /*31446*/"SHAVIAN LETTER KICK"/* 10452 */,/*31447*/"SHAVIAN LETTER FEE"/* 10453 */, /*31448*/"SHAVIAN LETTER THIGH"/* 10454 */,/*31449*/"SHAVIAN LETTER SO"/* 10455 */, /*31450*/"SHAVIAN LETTER SURE"/* 10456 */,/*31451*/"SHAVIAN LETTER CHURCH"/* 10457 */, /*31452*/"SHAVIAN LETTER YEA"/* 10458 */,/*31453*/"SHAVIAN LETTER HUNG"/* 10459 */, /*31454*/"SHAVIAN LETTER BIB"/* 1045A */,/*31455*/"SHAVIAN LETTER DEAD"/* 1045B */, /*31456*/"SHAVIAN LETTER GAG"/* 1045C */,/*31457*/"SHAVIAN LETTER VOW"/* 1045D */, /*31458*/"SHAVIAN LETTER THEY"/* 1045E */,/*31459*/"SHAVIAN LETTER ZOO"/* 1045F */, /*31460*/"SHAVIAN LETTER MEASURE"/* 10460 */,/*31461*/"SHAVIAN LETTER JUDGE"/* 10461 */, /*31462*/"SHAVIAN LETTER WOE"/* 10462 */,/*31463*/"SHAVIAN LETTER HA-HA"/* 10463 */, /*31464*/"SHAVIAN LETTER LOLL"/* 10464 */,/*31465*/"SHAVIAN LETTER MIME"/* 10465 */, /*31466*/"SHAVIAN LETTER IF"/* 10466 */,/*31467*/"SHAVIAN LETTER EGG"/* 10467 */, /*31468*/"SHAVIAN LETTER ASH"/* 10468 */,/*31469*/"SHAVIAN LETTER ADO"/* 10469 */, /*31470*/"SHAVIAN LETTER ON"/* 1046A */,/*31471*/"SHAVIAN LETTER WOOL"/* 1046B */, /*31472*/"SHAVIAN LETTER OUT"/* 1046C */,/*31473*/"SHAVIAN LETTER AH"/* 1046D */, /*31474*/"SHAVIAN LETTER ROAR"/* 1046E */,/*31475*/"SHAVIAN LETTER NUN"/* 1046F */, /*31476*/"SHAVIAN LETTER EAT"/* 10470 */,/*31477*/"SHAVIAN LETTER AGE"/* 10471 */, /*31478*/"SHAVIAN LETTER ICE"/* 10472 */,/*31479*/"SHAVIAN LETTER UP"/* 10473 */, /*31480*/"SHAVIAN LETTER OAK"/* 10474 */,/*31481*/"SHAVIAN LETTER OOZE"/* 10475 */, /*31482*/"SHAVIAN LETTER OIL"/* 10476 */,/*31483*/"SHAVIAN LETTER AWE"/* 10477 */, /*31484*/"SHAVIAN LETTER ARE"/* 10478 */,/*31485*/"SHAVIAN LETTER OR"/* 10479 */, /*31486*/"SHAVIAN LETTER AIR"/* 1047A */,/*31487*/"SHAVIAN LETTER ERR"/* 1047B */, /*31488*/"SHAVIAN LETTER ARRAY"/* 1047C */,/*31489*/"SHAVIAN LETTER EAR"/* 1047D */, /*31490*/"SHAVIAN LETTER IAN"/* 1047E */,/*31491*/"SHAVIAN LETTER YEW"/* 1047F */, /*31492*/"OSMANYA LETTER ALEF"/* 10480 */,/*31493*/"OSMANYA LETTER BA"/* 10481 */, /*31494*/"OSMANYA LETTER TA"/* 10482 */,/*31495*/"OSMANYA LETTER JA"/* 10483 */,/*31496*/"OSMANYA LETTER XA"/* 10484 */, /*31497*/"OSMANYA LETTER KHA"/* 10485 */,/*31498*/"OSMANYA LETTER DEEL"/* 10486 */, /*31499*/"OSMANYA LETTER RA"/* 10487 */,/*31500*/"OSMANYA LETTER SA"/* 10488 */, /*31501*/"OSMANYA LETTER SHIIN"/* 10489 */,/*31502*/"OSMANYA LETTER DHA"/* 1048A */, /*31503*/"OSMANYA LETTER CAYN"/* 1048B */,/*31504*/"OSMANYA LETTER GA"/* 1048C */, /*31505*/"OSMANYA LETTER FA"/* 1048D */,/*31506*/"OSMANYA LETTER QAAF"/* 1048E */, /*31507*/"OSMANYA LETTER KAAF"/* 1048F */,/*31508*/"OSMANYA LETTER LAAN"/* 10490 */, /*31509*/"OSMANYA LETTER MIIN"/* 10491 */,/*31510*/"OSMANYA LETTER NUUN"/* 10492 */, /*31511*/"OSMANYA LETTER WAW"/* 10493 */,/*31512*/"OSMANYA LETTER HA"/* 10494 */,/*31513*/"OSMANYA LETTER YA"/* 10495 */, /*31514*/"OSMANYA LETTER A"/* 10496 */,/*31515*/"OSMANYA LETTER E"/* 10497 */,/*31516*/"OSMANYA LETTER I"/* 10498 */, /*31517*/"OSMANYA LETTER O"/* 10499 */,/*31518*/"OSMANYA LETTER U"/* 1049A */,/*31519*/"OSMANYA LETTER AA"/* 1049B */, /*31520*/"OSMANYA LETTER EE"/* 1049C */,/*31521*/"OSMANYA LETTER OO"/* 1049D */,NULL,NULL, /*31524*/"OSMANYA DIGIT ZERO"/* 104A0 */,/*31525*/"OSMANYA DIGIT ONE"/* 104A1 */,/*31526*/"OSMANYA DIGIT TWO"/* 104A2 */, /*31527*/"OSMANYA DIGIT THREE"/* 104A3 */,/*31528*/"OSMANYA DIGIT FOUR"/* 104A4 */, /*31529*/"OSMANYA DIGIT FIVE"/* 104A5 */,/*31530*/"OSMANYA DIGIT SIX"/* 104A6 */, /*31531*/"OSMANYA DIGIT SEVEN"/* 104A7 */,/*31532*/"OSMANYA DIGIT EIGHT"/* 104A8 */, /*31533*/"OSMANYA DIGIT NINE"/* 104A9 */,NULL,NULL,NULL,NULL,NULL,NULL,/*31540*/"OSAGE CAPITAL LETTER A"/* 104B0 */, /*31541*/"OSAGE CAPITAL LETTER AI"/* 104B1 */,/*31542*/"OSAGE CAPITAL LETTER AIN"/* 104B2 */, /*31543*/"OSAGE CAPITAL LETTER AH"/* 104B3 */,/*31544*/"OSAGE CAPITAL LETTER BRA"/* 104B4 */, /*31545*/"OSAGE CAPITAL LETTER CHA"/* 104B5 */,/*31546*/"OSAGE CAPITAL LETTER EHCHA"/* 104B6 */, /*31547*/"OSAGE CAPITAL LETTER E"/* 104B7 */,/*31548*/"OSAGE CAPITAL LETTER EIN"/* 104B8 */, /*31549*/"OSAGE CAPITAL LETTER HA"/* 104B9 */,/*31550*/"OSAGE CAPITAL LETTER HYA"/* 104BA */, /*31551*/"OSAGE CAPITAL LETTER I"/* 104BB */,/*31552*/"OSAGE CAPITAL LETTER KA"/* 104BC */, /*31553*/"OSAGE CAPITAL LETTER EHKA"/* 104BD */,/*31554*/"OSAGE CAPITAL LETTER KYA"/* 104BE */, /*31555*/"OSAGE CAPITAL LETTER LA"/* 104BF */,/*31556*/"OSAGE CAPITAL LETTER MA"/* 104C0 */, /*31557*/"OSAGE CAPITAL LETTER NA"/* 104C1 */,/*31558*/"OSAGE CAPITAL LETTER O"/* 104C2 */, /*31559*/"OSAGE CAPITAL LETTER OIN"/* 104C3 */,/*31560*/"OSAGE CAPITAL LETTER PA"/* 104C4 */, /*31561*/"OSAGE CAPITAL LETTER EHPA"/* 104C5 */,/*31562*/"OSAGE CAPITAL LETTER SA"/* 104C6 */, /*31563*/"OSAGE CAPITAL LETTER SHA"/* 104C7 */,/*31564*/"OSAGE CAPITAL LETTER TA"/* 104C8 */, /*31565*/"OSAGE CAPITAL LETTER EHTA"/* 104C9 */,/*31566*/"OSAGE CAPITAL LETTER TSA"/* 104CA */, /*31567*/"OSAGE CAPITAL LETTER EHTSA"/* 104CB */,/*31568*/"OSAGE CAPITAL LETTER TSHA"/* 104CC */, /*31569*/"OSAGE CAPITAL LETTER DHA"/* 104CD */,/*31570*/"OSAGE CAPITAL LETTER U"/* 104CE */, /*31571*/"OSAGE CAPITAL LETTER WA"/* 104CF */,/*31572*/"OSAGE CAPITAL LETTER KHA"/* 104D0 */, /*31573*/"OSAGE CAPITAL LETTER GHA"/* 104D1 */,/*31574*/"OSAGE CAPITAL LETTER ZA"/* 104D2 */, /*31575*/"OSAGE CAPITAL LETTER ZHA"/* 104D3 */,NULL,NULL,NULL,NULL,/*31580*/"OSAGE SMALL LETTER A"/* 104D8 */, /*31581*/"OSAGE SMALL LETTER AI"/* 104D9 */,/*31582*/"OSAGE SMALL LETTER AIN"/* 104DA */, /*31583*/"OSAGE SMALL LETTER AH"/* 104DB */,/*31584*/"OSAGE SMALL LETTER BRA"/* 104DC */, /*31585*/"OSAGE SMALL LETTER CHA"/* 104DD */,/*31586*/"OSAGE SMALL LETTER EHCHA"/* 104DE */, /*31587*/"OSAGE SMALL LETTER E"/* 104DF */,/*31588*/"OSAGE SMALL LETTER EIN"/* 104E0 */, /*31589*/"OSAGE SMALL LETTER HA"/* 104E1 */,/*31590*/"OSAGE SMALL LETTER HYA"/* 104E2 */, /*31591*/"OSAGE SMALL LETTER I"/* 104E3 */,/*31592*/"OSAGE SMALL LETTER KA"/* 104E4 */, /*31593*/"OSAGE SMALL LETTER EHKA"/* 104E5 */,/*31594*/"OSAGE SMALL LETTER KYA"/* 104E6 */, /*31595*/"OSAGE SMALL LETTER LA"/* 104E7 */,/*31596*/"OSAGE SMALL LETTER MA"/* 104E8 */, /*31597*/"OSAGE SMALL LETTER NA"/* 104E9 */,/*31598*/"OSAGE SMALL LETTER O"/* 104EA */, /*31599*/"OSAGE SMALL LETTER OIN"/* 104EB */,/*31600*/"OSAGE SMALL LETTER PA"/* 104EC */, /*31601*/"OSAGE SMALL LETTER EHPA"/* 104ED */,/*31602*/"OSAGE SMALL LETTER SA"/* 104EE */, /*31603*/"OSAGE SMALL LETTER SHA"/* 104EF */,/*31604*/"OSAGE SMALL LETTER TA"/* 104F0 */, /*31605*/"OSAGE SMALL LETTER EHTA"/* 104F1 */,/*31606*/"OSAGE SMALL LETTER TSA"/* 104F2 */, /*31607*/"OSAGE SMALL LETTER EHTSA"/* 104F3 */,/*31608*/"OSAGE SMALL LETTER TSHA"/* 104F4 */, /*31609*/"OSAGE SMALL LETTER DHA"/* 104F5 */,/*31610*/"OSAGE SMALL LETTER U"/* 104F6 */, /*31611*/"OSAGE SMALL LETTER WA"/* 104F7 */,/*31612*/"OSAGE SMALL LETTER KHA"/* 104F8 */, /*31613*/"OSAGE SMALL LETTER GHA"/* 104F9 */,/*31614*/"OSAGE SMALL LETTER ZA"/* 104FA */, /*31615*/"OSAGE SMALL LETTER ZHA"/* 104FB */,NULL,NULL,NULL,NULL,/*31620*/"ELBASAN LETTER A"/* 10500 */, /*31621*/"ELBASAN LETTER BE"/* 10501 */,/*31622*/"ELBASAN LETTER CE"/* 10502 */,/*31623*/"ELBASAN LETTER CHE"/* 10503 */, /*31624*/"ELBASAN LETTER DE"/* 10504 */,/*31625*/"ELBASAN LETTER NDE"/* 10505 */, /*31626*/"ELBASAN LETTER DHE"/* 10506 */,/*31627*/"ELBASAN LETTER EI"/* 10507 */,/*31628*/"ELBASAN LETTER E"/* 10508 */, /*31629*/"ELBASAN LETTER FE"/* 10509 */,/*31630*/"ELBASAN LETTER GE"/* 1050A */,/*31631*/"ELBASAN LETTER GJE"/* 1050B */, /*31632*/"ELBASAN LETTER HE"/* 1050C */,/*31633*/"ELBASAN LETTER I"/* 1050D */,/*31634*/"ELBASAN LETTER JE"/* 1050E */, /*31635*/"ELBASAN LETTER KE"/* 1050F */,/*31636*/"ELBASAN LETTER LE"/* 10510 */,/*31637*/"ELBASAN LETTER LLE"/* 10511 */, /*31638*/"ELBASAN LETTER ME"/* 10512 */,/*31639*/"ELBASAN LETTER NE"/* 10513 */,/*31640*/"ELBASAN LETTER NA"/* 10514 */, /*31641*/"ELBASAN LETTER NJE"/* 10515 */,/*31642*/"ELBASAN LETTER O"/* 10516 */,/*31643*/"ELBASAN LETTER PE"/* 10517 */, /*31644*/"ELBASAN LETTER QE"/* 10518 */,/*31645*/"ELBASAN LETTER RE"/* 10519 */,/*31646*/"ELBASAN LETTER RRE"/* 1051A */, /*31647*/"ELBASAN LETTER SE"/* 1051B */,/*31648*/"ELBASAN LETTER SHE"/* 1051C */,/*31649*/"ELBASAN LETTER TE"/* 1051D */, /*31650*/"ELBASAN LETTER THE"/* 1051E */,/*31651*/"ELBASAN LETTER U"/* 1051F */,/*31652*/"ELBASAN LETTER VE"/* 10520 */, /*31653*/"ELBASAN LETTER XE"/* 10521 */,/*31654*/"ELBASAN LETTER Y"/* 10522 */,/*31655*/"ELBASAN LETTER ZE"/* 10523 */, /*31656*/"ELBASAN LETTER ZHE"/* 10524 */,/*31657*/"ELBASAN LETTER GHE"/* 10525 */, /*31658*/"ELBASAN LETTER GHAMMA"/* 10526 */,/*31659*/"ELBASAN LETTER KHE"/* 10527 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,/*31668*/"CAUCASIAN ALBANIAN LETTER ALT"/* 10530 */,/*31669*/"CAUCASIAN ALBANIAN LETTER BET"/* 10531 */, /*31670*/"CAUCASIAN ALBANIAN LETTER GIM"/* 10532 */,/*31671*/"CAUCASIAN ALBANIAN LETTER DAT"/* 10533 */, /*31672*/"CAUCASIAN ALBANIAN LETTER EB"/* 10534 */,/*31673*/"CAUCASIAN ALBANIAN LETTER ZARL"/* 10535 */, /*31674*/"CAUCASIAN ALBANIAN LETTER EYN"/* 10536 */,/*31675*/"CAUCASIAN ALBANIAN LETTER ZHIL"/* 10537 */, /*31676*/"CAUCASIAN ALBANIAN LETTER TAS"/* 10538 */,/*31677*/"CAUCASIAN ALBANIAN LETTER CHA"/* 10539 */, /*31678*/"CAUCASIAN ALBANIAN LETTER YOWD"/* 1053A */,/*31679*/"CAUCASIAN ALBANIAN LETTER ZHA"/* 1053B */, /*31680*/"CAUCASIAN ALBANIAN LETTER IRB"/* 1053C */,/*31681*/"CAUCASIAN ALBANIAN LETTER SHA"/* 1053D */, /*31682*/"CAUCASIAN ALBANIAN LETTER LAN"/* 1053E */,/*31683*/"CAUCASIAN ALBANIAN LETTER INYA"/* 1053F */, /*31684*/"CAUCASIAN ALBANIAN LETTER XEYN"/* 10540 */,/*31685*/"CAUCASIAN ALBANIAN LETTER DYAN"/* 10541 */, /*31686*/"CAUCASIAN ALBANIAN LETTER CAR"/* 10542 */,/*31687*/"CAUCASIAN ALBANIAN LETTER JHOX"/* 10543 */, /*31688*/"CAUCASIAN ALBANIAN LETTER KAR"/* 10544 */,/*31689*/"CAUCASIAN ALBANIAN LETTER LYIT"/* 10545 */, /*31690*/"CAUCASIAN ALBANIAN LETTER HEYT"/* 10546 */,/*31691*/"CAUCASIAN ALBANIAN LETTER QAY"/* 10547 */, /*31692*/"CAUCASIAN ALBANIAN LETTER AOR"/* 10548 */,/*31693*/"CAUCASIAN ALBANIAN LETTER CHOY"/* 10549 */, /*31694*/"CAUCASIAN ALBANIAN LETTER CHI"/* 1054A */,/*31695*/"CAUCASIAN ALBANIAN LETTER CYAY"/* 1054B */, /*31696*/"CAUCASIAN ALBANIAN LETTER MAQ"/* 1054C */,/*31697*/"CAUCASIAN ALBANIAN LETTER QAR"/* 1054D */, /*31698*/"CAUCASIAN ALBANIAN LETTER NOWC"/* 1054E */,/*31699*/"CAUCASIAN ALBANIAN LETTER DZYAY"/* 1054F */, /*31700*/"CAUCASIAN ALBANIAN LETTER SHAK"/* 10550 */,/*31701*/"CAUCASIAN ALBANIAN LETTER JAYN"/* 10551 */, /*31702*/"CAUCASIAN ALBANIAN LETTER ON"/* 10552 */,/*31703*/"CAUCASIAN ALBANIAN LETTER TYAY"/* 10553 */, /*31704*/"CAUCASIAN ALBANIAN LETTER FAM"/* 10554 */,/*31705*/"CAUCASIAN ALBANIAN LETTER DZAY"/* 10555 */, /*31706*/"CAUCASIAN ALBANIAN LETTER CHAT"/* 10556 */,/*31707*/"CAUCASIAN ALBANIAN LETTER PEN"/* 10557 */, /*31708*/"CAUCASIAN ALBANIAN LETTER GHEYS"/* 10558 */,/*31709*/"CAUCASIAN ALBANIAN LETTER RAT"/* 10559 */, /*31710*/"CAUCASIAN ALBANIAN LETTER SEYK"/* 1055A */,/*31711*/"CAUCASIAN ALBANIAN LETTER VEYZ"/* 1055B */, /*31712*/"CAUCASIAN ALBANIAN LETTER TIWR"/* 1055C */,/*31713*/"CAUCASIAN ALBANIAN LETTER SHOY"/* 1055D */, /*31714*/"CAUCASIAN ALBANIAN LETTER IWN"/* 1055E */,/*31715*/"CAUCASIAN ALBANIAN LETTER CYAW"/* 1055F */, /*31716*/"CAUCASIAN ALBANIAN LETTER CAYN"/* 10560 */,/*31717*/"CAUCASIAN ALBANIAN LETTER YAYD"/* 10561 */, /*31718*/"CAUCASIAN ALBANIAN LETTER PIWR"/* 10562 */,/*31719*/"CAUCASIAN ALBANIAN LETTER KIW"/* 10563 */,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*31731*/"CAUCASIAN ALBANIAN CITATION MARK"/* 1056F */,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*31876*/"LINEAR A SIGN AB001"/* 10600 */,/*31877*/"LINEAR A SIGN AB002"/* 10601 */, /*31878*/"LINEAR A SIGN AB003"/* 10602 */,/*31879*/"LINEAR A SIGN AB004"/* 10603 */, /*31880*/"LINEAR A SIGN AB005"/* 10604 */,/*31881*/"LINEAR A SIGN AB006"/* 10605 */, /*31882*/"LINEAR A SIGN AB007"/* 10606 */,/*31883*/"LINEAR A SIGN AB008"/* 10607 */, /*31884*/"LINEAR A SIGN AB009"/* 10608 */,/*31885*/"LINEAR A SIGN AB010"/* 10609 */, /*31886*/"LINEAR A SIGN AB011"/* 1060A */,/*31887*/"LINEAR A SIGN AB013"/* 1060B */, /*31888*/"LINEAR A SIGN AB016"/* 1060C */,/*31889*/"LINEAR A SIGN AB017"/* 1060D */, /*31890*/"LINEAR A SIGN AB020"/* 1060E */,/*31891*/"LINEAR A SIGN AB021"/* 1060F */, /*31892*/"LINEAR A SIGN AB021F"/* 10610 */,/*31893*/"LINEAR A SIGN AB021M"/* 10611 */, /*31894*/"LINEAR A SIGN AB022"/* 10612 */,/*31895*/"LINEAR A SIGN AB022F"/* 10613 */, /*31896*/"LINEAR A SIGN AB022M"/* 10614 */,/*31897*/"LINEAR A SIGN AB023"/* 10615 */, /*31898*/"LINEAR A SIGN AB023M"/* 10616 */,/*31899*/"LINEAR A SIGN AB024"/* 10617 */, /*31900*/"LINEAR A SIGN AB026"/* 10618 */,/*31901*/"LINEAR A SIGN AB027"/* 10619 */, /*31902*/"LINEAR A SIGN AB028"/* 1061A */,/*31903*/"LINEAR A SIGN A028B"/* 1061B */, /*31904*/"LINEAR A SIGN AB029"/* 1061C */,/*31905*/"LINEAR A SIGN AB030"/* 1061D */, /*31906*/"LINEAR A SIGN AB031"/* 1061E */,/*31907*/"LINEAR A SIGN AB034"/* 1061F */, /*31908*/"LINEAR A SIGN AB037"/* 10620 */,/*31909*/"LINEAR A SIGN AB038"/* 10621 */, /*31910*/"LINEAR A SIGN AB039"/* 10622 */,/*31911*/"LINEAR A SIGN AB040"/* 10623 */, /*31912*/"LINEAR A SIGN AB041"/* 10624 */,/*31913*/"LINEAR A SIGN AB044"/* 10625 */, /*31914*/"LINEAR A SIGN AB045"/* 10626 */,/*31915*/"LINEAR A SIGN AB046"/* 10627 */, /*31916*/"LINEAR A SIGN AB047"/* 10628 */,/*31917*/"LINEAR A SIGN AB048"/* 10629 */, /*31918*/"LINEAR A SIGN AB049"/* 1062A */,/*31919*/"LINEAR A SIGN AB050"/* 1062B */, /*31920*/"LINEAR A SIGN AB051"/* 1062C */,/*31921*/"LINEAR A SIGN AB053"/* 1062D */, /*31922*/"LINEAR A SIGN AB054"/* 1062E */,/*31923*/"LINEAR A SIGN AB055"/* 1062F */, /*31924*/"LINEAR A SIGN AB056"/* 10630 */,/*31925*/"LINEAR A SIGN AB057"/* 10631 */, /*31926*/"LINEAR A SIGN AB058"/* 10632 */,/*31927*/"LINEAR A SIGN AB059"/* 10633 */, /*31928*/"LINEAR A SIGN AB060"/* 10634 */,/*31929*/"LINEAR A SIGN AB061"/* 10635 */, /*31930*/"LINEAR A SIGN AB065"/* 10636 */,/*31931*/"LINEAR A SIGN AB066"/* 10637 */, /*31932*/"LINEAR A SIGN AB067"/* 10638 */,/*31933*/"LINEAR A SIGN AB069"/* 10639 */, /*31934*/"LINEAR A SIGN AB070"/* 1063A */,/*31935*/"LINEAR A SIGN AB073"/* 1063B */, /*31936*/"LINEAR A SIGN AB074"/* 1063C */,/*31937*/"LINEAR A SIGN AB076"/* 1063D */, /*31938*/"LINEAR A SIGN AB077"/* 1063E */,/*31939*/"LINEAR A SIGN AB078"/* 1063F */, /*31940*/"LINEAR A SIGN AB079"/* 10640 */,/*31941*/"LINEAR A SIGN AB080"/* 10641 */, /*31942*/"LINEAR A SIGN AB081"/* 10642 */,/*31943*/"LINEAR A SIGN AB082"/* 10643 */, /*31944*/"LINEAR A SIGN AB085"/* 10644 */,/*31945*/"LINEAR A SIGN AB086"/* 10645 */, /*31946*/"LINEAR A SIGN AB087"/* 10646 */,/*31947*/"LINEAR A SIGN A100-102"/* 10647 */, /*31948*/"LINEAR A SIGN AB118"/* 10648 */,/*31949*/"LINEAR A SIGN AB120"/* 10649 */, /*31950*/"LINEAR A SIGN A120B"/* 1064A */,/*31951*/"LINEAR A SIGN AB122"/* 1064B */, /*31952*/"LINEAR A SIGN AB123"/* 1064C */,/*31953*/"LINEAR A SIGN AB131A"/* 1064D */, /*31954*/"LINEAR A SIGN AB131B"/* 1064E */,/*31955*/"LINEAR A SIGN A131C"/* 1064F */, /*31956*/"LINEAR A SIGN AB164"/* 10650 */,/*31957*/"LINEAR A SIGN AB171"/* 10651 */, /*31958*/"LINEAR A SIGN AB180"/* 10652 */,/*31959*/"LINEAR A SIGN AB188"/* 10653 */, /*31960*/"LINEAR A SIGN AB191"/* 10654 */,/*31961*/"LINEAR A SIGN A301"/* 10655 */, /*31962*/"LINEAR A SIGN A302"/* 10656 */,/*31963*/"LINEAR A SIGN A303"/* 10657 */, /*31964*/"LINEAR A SIGN A304"/* 10658 */,/*31965*/"LINEAR A SIGN A305"/* 10659 */, /*31966*/"LINEAR A SIGN A306"/* 1065A */,/*31967*/"LINEAR A SIGN A307"/* 1065B */, /*31968*/"LINEAR A SIGN A308"/* 1065C */,/*31969*/"LINEAR A SIGN A309A"/* 1065D */, /*31970*/"LINEAR A SIGN A309B"/* 1065E */,/*31971*/"LINEAR A SIGN A309C"/* 1065F */, /*31972*/"LINEAR A SIGN A310"/* 10660 */,/*31973*/"LINEAR A SIGN A311"/* 10661 */, /*31974*/"LINEAR A SIGN A312"/* 10662 */,/*31975*/"LINEAR A SIGN A313A"/* 10663 */, /*31976*/"LINEAR A SIGN A313B"/* 10664 */,/*31977*/"LINEAR A SIGN A313C"/* 10665 */, /*31978*/"LINEAR A SIGN A314"/* 10666 */,/*31979*/"LINEAR A SIGN A315"/* 10667 */, /*31980*/"LINEAR A SIGN A316"/* 10668 */,/*31981*/"LINEAR A SIGN A317"/* 10669 */, /*31982*/"LINEAR A SIGN A318"/* 1066A */,/*31983*/"LINEAR A SIGN A319"/* 1066B */, /*31984*/"LINEAR A SIGN A320"/* 1066C */,/*31985*/"LINEAR A SIGN A321"/* 1066D */, /*31986*/"LINEAR A SIGN A322"/* 1066E */,/*31987*/"LINEAR A SIGN A323"/* 1066F */, /*31988*/"LINEAR A SIGN A324"/* 10670 */,/*31989*/"LINEAR A SIGN A325"/* 10671 */, /*31990*/"LINEAR A SIGN A326"/* 10672 */,/*31991*/"LINEAR A SIGN A327"/* 10673 */, /*31992*/"LINEAR A SIGN A328"/* 10674 */,/*31993*/"LINEAR A SIGN A329"/* 10675 */, /*31994*/"LINEAR A SIGN A330"/* 10676 */,/*31995*/"LINEAR A SIGN A331"/* 10677 */, /*31996*/"LINEAR A SIGN A332"/* 10678 */,/*31997*/"LINEAR A SIGN A333"/* 10679 */, /*31998*/"LINEAR A SIGN A334"/* 1067A */,/*31999*/"LINEAR A SIGN A335"/* 1067B */, /*32000*/"LINEAR A SIGN A336"/* 1067C */,/*32001*/"LINEAR A SIGN A337"/* 1067D */, /*32002*/"LINEAR A SIGN A338"/* 1067E */,/*32003*/"LINEAR A SIGN A339"/* 1067F */, /*32004*/"LINEAR A SIGN A340"/* 10680 */,/*32005*/"LINEAR A SIGN A341"/* 10681 */, /*32006*/"LINEAR A SIGN A342"/* 10682 */,/*32007*/"LINEAR A SIGN A343"/* 10683 */, /*32008*/"LINEAR A SIGN A344"/* 10684 */,/*32009*/"LINEAR A SIGN A345"/* 10685 */, /*32010*/"LINEAR A SIGN A346"/* 10686 */,/*32011*/"LINEAR A SIGN A347"/* 10687 */, /*32012*/"LINEAR A SIGN A348"/* 10688 */,/*32013*/"LINEAR A SIGN A349"/* 10689 */, /*32014*/"LINEAR A SIGN A350"/* 1068A */,/*32015*/"LINEAR A SIGN A351"/* 1068B */, /*32016*/"LINEAR A SIGN A352"/* 1068C */,/*32017*/"LINEAR A SIGN A353"/* 1068D */, /*32018*/"LINEAR A SIGN A354"/* 1068E */,/*32019*/"LINEAR A SIGN A355"/* 1068F */, /*32020*/"LINEAR A SIGN A356"/* 10690 */,/*32021*/"LINEAR A SIGN A357"/* 10691 */, /*32022*/"LINEAR A SIGN A358"/* 10692 */,/*32023*/"LINEAR A SIGN A359"/* 10693 */, /*32024*/"LINEAR A SIGN A360"/* 10694 */,/*32025*/"LINEAR A SIGN A361"/* 10695 */, /*32026*/"LINEAR A SIGN A362"/* 10696 */,/*32027*/"LINEAR A SIGN A363"/* 10697 */, /*32028*/"LINEAR A SIGN A364"/* 10698 */,/*32029*/"LINEAR A SIGN A365"/* 10699 */, /*32030*/"LINEAR A SIGN A366"/* 1069A */,/*32031*/"LINEAR A SIGN A367"/* 1069B */, /*32032*/"LINEAR A SIGN A368"/* 1069C */,/*32033*/"LINEAR A SIGN A369"/* 1069D */, /*32034*/"LINEAR A SIGN A370"/* 1069E */,/*32035*/"LINEAR A SIGN A371"/* 1069F */, /*32036*/"LINEAR A SIGN A400-VAS"/* 106A0 */,/*32037*/"LINEAR A SIGN A401-VAS"/* 106A1 */, /*32038*/"LINEAR A SIGN A402-VAS"/* 106A2 */,/*32039*/"LINEAR A SIGN A403-VAS"/* 106A3 */, /*32040*/"LINEAR A SIGN A404-VAS"/* 106A4 */,/*32041*/"LINEAR A SIGN A405-VAS"/* 106A5 */, /*32042*/"LINEAR A SIGN A406-VAS"/* 106A6 */,/*32043*/"LINEAR A SIGN A407-VAS"/* 106A7 */, /*32044*/"LINEAR A SIGN A408-VAS"/* 106A8 */,/*32045*/"LINEAR A SIGN A409-VAS"/* 106A9 */, /*32046*/"LINEAR A SIGN A410-VAS"/* 106AA */,/*32047*/"LINEAR A SIGN A411-VAS"/* 106AB */, /*32048*/"LINEAR A SIGN A412-VAS"/* 106AC */,/*32049*/"LINEAR A SIGN A413-VAS"/* 106AD */, /*32050*/"LINEAR A SIGN A414-VAS"/* 106AE */,/*32051*/"LINEAR A SIGN A415-VAS"/* 106AF */, /*32052*/"LINEAR A SIGN A416-VAS"/* 106B0 */,/*32053*/"LINEAR A SIGN A417-VAS"/* 106B1 */, /*32054*/"LINEAR A SIGN A418-VAS"/* 106B2 */,/*32055*/"LINEAR A SIGN A501"/* 106B3 */, /*32056*/"LINEAR A SIGN A502"/* 106B4 */,/*32057*/"LINEAR A SIGN A503"/* 106B5 */, /*32058*/"LINEAR A SIGN A504"/* 106B6 */,/*32059*/"LINEAR A SIGN A505"/* 106B7 */, /*32060*/"LINEAR A SIGN A506"/* 106B8 */,/*32061*/"LINEAR A SIGN A508"/* 106B9 */, /*32062*/"LINEAR A SIGN A509"/* 106BA */,/*32063*/"LINEAR A SIGN A510"/* 106BB */, /*32064*/"LINEAR A SIGN A511"/* 106BC */,/*32065*/"LINEAR A SIGN A512"/* 106BD */, /*32066*/"LINEAR A SIGN A513"/* 106BE */,/*32067*/"LINEAR A SIGN A515"/* 106BF */, /*32068*/"LINEAR A SIGN A516"/* 106C0 */,/*32069*/"LINEAR A SIGN A520"/* 106C1 */, /*32070*/"LINEAR A SIGN A521"/* 106C2 */,/*32071*/"LINEAR A SIGN A523"/* 106C3 */, /*32072*/"LINEAR A SIGN A524"/* 106C4 */,/*32073*/"LINEAR A SIGN A525"/* 106C5 */, /*32074*/"LINEAR A SIGN A526"/* 106C6 */,/*32075*/"LINEAR A SIGN A527"/* 106C7 */, /*32076*/"LINEAR A SIGN A528"/* 106C8 */,/*32077*/"LINEAR A SIGN A529"/* 106C9 */, /*32078*/"LINEAR A SIGN A530"/* 106CA */,/*32079*/"LINEAR A SIGN A531"/* 106CB */, /*32080*/"LINEAR A SIGN A532"/* 106CC */,/*32081*/"LINEAR A SIGN A534"/* 106CD */, /*32082*/"LINEAR A SIGN A535"/* 106CE */,/*32083*/"LINEAR A SIGN A536"/* 106CF */, /*32084*/"LINEAR A SIGN A537"/* 106D0 */,/*32085*/"LINEAR A SIGN A538"/* 106D1 */, /*32086*/"LINEAR A SIGN A539"/* 106D2 */,/*32087*/"LINEAR A SIGN A540"/* 106D3 */, /*32088*/"LINEAR A SIGN A541"/* 106D4 */,/*32089*/"LINEAR A SIGN A542"/* 106D5 */, /*32090*/"LINEAR A SIGN A545"/* 106D6 */,/*32091*/"LINEAR A SIGN A547"/* 106D7 */, /*32092*/"LINEAR A SIGN A548"/* 106D8 */,/*32093*/"LINEAR A SIGN A549"/* 106D9 */, /*32094*/"LINEAR A SIGN A550"/* 106DA */,/*32095*/"LINEAR A SIGN A551"/* 106DB */, /*32096*/"LINEAR A SIGN A552"/* 106DC */,/*32097*/"LINEAR A SIGN A553"/* 106DD */, /*32098*/"LINEAR A SIGN A554"/* 106DE */,/*32099*/"LINEAR A SIGN A555"/* 106DF */, /*32100*/"LINEAR A SIGN A556"/* 106E0 */,/*32101*/"LINEAR A SIGN A557"/* 106E1 */, /*32102*/"LINEAR A SIGN A559"/* 106E2 */,/*32103*/"LINEAR A SIGN A563"/* 106E3 */, /*32104*/"LINEAR A SIGN A564"/* 106E4 */,/*32105*/"LINEAR A SIGN A565"/* 106E5 */, /*32106*/"LINEAR A SIGN A566"/* 106E6 */,/*32107*/"LINEAR A SIGN A568"/* 106E7 */, /*32108*/"LINEAR A SIGN A569"/* 106E8 */,/*32109*/"LINEAR A SIGN A570"/* 106E9 */, /*32110*/"LINEAR A SIGN A571"/* 106EA */,/*32111*/"LINEAR A SIGN A572"/* 106EB */, /*32112*/"LINEAR A SIGN A573"/* 106EC */,/*32113*/"LINEAR A SIGN A574"/* 106ED */, /*32114*/"LINEAR A SIGN A575"/* 106EE */,/*32115*/"LINEAR A SIGN A576"/* 106EF */, /*32116*/"LINEAR A SIGN A577"/* 106F0 */,/*32117*/"LINEAR A SIGN A578"/* 106F1 */, /*32118*/"LINEAR A SIGN A579"/* 106F2 */,/*32119*/"LINEAR A SIGN A580"/* 106F3 */, /*32120*/"LINEAR A SIGN A581"/* 106F4 */,/*32121*/"LINEAR A SIGN A582"/* 106F5 */, /*32122*/"LINEAR A SIGN A583"/* 106F6 */,/*32123*/"LINEAR A SIGN A584"/* 106F7 */, /*32124*/"LINEAR A SIGN A585"/* 106F8 */,/*32125*/"LINEAR A SIGN A586"/* 106F9 */, /*32126*/"LINEAR A SIGN A587"/* 106FA */,/*32127*/"LINEAR A SIGN A588"/* 106FB */, /*32128*/"LINEAR A SIGN A589"/* 106FC */,/*32129*/"LINEAR A SIGN A591"/* 106FD */, /*32130*/"LINEAR A SIGN A592"/* 106FE */,/*32131*/"LINEAR A SIGN A594"/* 106FF */, /*32132*/"LINEAR A SIGN A595"/* 10700 */,/*32133*/"LINEAR A SIGN A596"/* 10701 */, /*32134*/"LINEAR A SIGN A598"/* 10702 */,/*32135*/"LINEAR A SIGN A600"/* 10703 */, /*32136*/"LINEAR A SIGN A601"/* 10704 */,/*32137*/"LINEAR A SIGN A602"/* 10705 */, /*32138*/"LINEAR A SIGN A603"/* 10706 */,/*32139*/"LINEAR A SIGN A604"/* 10707 */, /*32140*/"LINEAR A SIGN A606"/* 10708 */,/*32141*/"LINEAR A SIGN A608"/* 10709 */, /*32142*/"LINEAR A SIGN A609"/* 1070A */,/*32143*/"LINEAR A SIGN A610"/* 1070B */, /*32144*/"LINEAR A SIGN A611"/* 1070C */,/*32145*/"LINEAR A SIGN A612"/* 1070D */, /*32146*/"LINEAR A SIGN A613"/* 1070E */,/*32147*/"LINEAR A SIGN A614"/* 1070F */, /*32148*/"LINEAR A SIGN A615"/* 10710 */,/*32149*/"LINEAR A SIGN A616"/* 10711 */, /*32150*/"LINEAR A SIGN A617"/* 10712 */,/*32151*/"LINEAR A SIGN A618"/* 10713 */, /*32152*/"LINEAR A SIGN A619"/* 10714 */,/*32153*/"LINEAR A SIGN A620"/* 10715 */, /*32154*/"LINEAR A SIGN A621"/* 10716 */,/*32155*/"LINEAR A SIGN A622"/* 10717 */, /*32156*/"LINEAR A SIGN A623"/* 10718 */,/*32157*/"LINEAR A SIGN A624"/* 10719 */, /*32158*/"LINEAR A SIGN A626"/* 1071A */,/*32159*/"LINEAR A SIGN A627"/* 1071B */, /*32160*/"LINEAR A SIGN A628"/* 1071C */,/*32161*/"LINEAR A SIGN A629"/* 1071D */, /*32162*/"LINEAR A SIGN A634"/* 1071E */,/*32163*/"LINEAR A SIGN A637"/* 1071F */, /*32164*/"LINEAR A SIGN A638"/* 10720 */,/*32165*/"LINEAR A SIGN A640"/* 10721 */, /*32166*/"LINEAR A SIGN A642"/* 10722 */,/*32167*/"LINEAR A SIGN A643"/* 10723 */, /*32168*/"LINEAR A SIGN A644"/* 10724 */,/*32169*/"LINEAR A SIGN A645"/* 10725 */, /*32170*/"LINEAR A SIGN A646"/* 10726 */,/*32171*/"LINEAR A SIGN A648"/* 10727 */, /*32172*/"LINEAR A SIGN A649"/* 10728 */,/*32173*/"LINEAR A SIGN A651"/* 10729 */, /*32174*/"LINEAR A SIGN A652"/* 1072A */,/*32175*/"LINEAR A SIGN A653"/* 1072B */, /*32176*/"LINEAR A SIGN A654"/* 1072C */,/*32177*/"LINEAR A SIGN A655"/* 1072D */, /*32178*/"LINEAR A SIGN A656"/* 1072E */,/*32179*/"LINEAR A SIGN A657"/* 1072F */, /*32180*/"LINEAR A SIGN A658"/* 10730 */,/*32181*/"LINEAR A SIGN A659"/* 10731 */, /*32182*/"LINEAR A SIGN A660"/* 10732 */,/*32183*/"LINEAR A SIGN A661"/* 10733 */, /*32184*/"LINEAR A SIGN A662"/* 10734 */,/*32185*/"LINEAR A SIGN A663"/* 10735 */, /*32186*/"LINEAR A SIGN A664"/* 10736 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*32196*/"LINEAR A SIGN A701 A"/* 10740 */,/*32197*/"LINEAR A SIGN A702 B"/* 10741 */, /*32198*/"LINEAR A SIGN A703 D"/* 10742 */,/*32199*/"LINEAR A SIGN A704 E"/* 10743 */, /*32200*/"LINEAR A SIGN A705 F"/* 10744 */,/*32201*/"LINEAR A SIGN A706 H"/* 10745 */, /*32202*/"LINEAR A SIGN A707 J"/* 10746 */,/*32203*/"LINEAR A SIGN A708 K"/* 10747 */, /*32204*/"LINEAR A SIGN A709 L"/* 10748 */,/*32205*/"LINEAR A SIGN A709-2 L2"/* 10749 */, /*32206*/"LINEAR A SIGN A709-3 L3"/* 1074A */,/*32207*/"LINEAR A SIGN A709-4 L4"/* 1074B */, /*32208*/"LINEAR A SIGN A709-6 L6"/* 1074C */,/*32209*/"LINEAR A SIGN A710 W"/* 1074D */, /*32210*/"LINEAR A SIGN A711 X"/* 1074E */,/*32211*/"LINEAR A SIGN A712 Y"/* 1074F */, /*32212*/"LINEAR A SIGN A713 OMEGA"/* 10750 */,/*32213*/"LINEAR A SIGN A714 ABB"/* 10751 */, /*32214*/"LINEAR A SIGN A715 BB"/* 10752 */,/*32215*/"LINEAR A SIGN A717 DD"/* 10753 */, /*32216*/"LINEAR A SIGN A726 EYYY"/* 10754 */,/*32217*/"LINEAR A SIGN A732 JE"/* 10755 */,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,/*32228*/"LINEAR A SIGN A800"/* 10760 */,/*32229*/"LINEAR A SIGN A801"/* 10761 */, /*32230*/"LINEAR A SIGN A802"/* 10762 */,/*32231*/"LINEAR A SIGN A803"/* 10763 */, /*32232*/"LINEAR A SIGN A804"/* 10764 */,/*32233*/"LINEAR A SIGN A805"/* 10765 */, /*32234*/"LINEAR A SIGN A806"/* 10766 */,/*32235*/"LINEAR A SIGN A807"/* 10767 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,/*32388*/"CYPRIOT SYLLABLE A"/* 10800 */,/*32389*/"CYPRIOT SYLLABLE E"/* 10801 */, /*32390*/"CYPRIOT SYLLABLE I"/* 10802 */,/*32391*/"CYPRIOT SYLLABLE O"/* 10803 */, /*32392*/"CYPRIOT SYLLABLE U"/* 10804 */,/*32393*/"CYPRIOT SYLLABLE JA"/* 10805 */,NULL,NULL, /*32396*/"CYPRIOT SYLLABLE JO"/* 10808 */,NULL,/*32398*/"CYPRIOT SYLLABLE KA"/* 1080A */, /*32399*/"CYPRIOT SYLLABLE KE"/* 1080B */,/*32400*/"CYPRIOT SYLLABLE KI"/* 1080C */, /*32401*/"CYPRIOT SYLLABLE KO"/* 1080D */,/*32402*/"CYPRIOT SYLLABLE KU"/* 1080E */, /*32403*/"CYPRIOT SYLLABLE LA"/* 1080F */,/*32404*/"CYPRIOT SYLLABLE LE"/* 10810 */, /*32405*/"CYPRIOT SYLLABLE LI"/* 10811 */,/*32406*/"CYPRIOT SYLLABLE LO"/* 10812 */, /*32407*/"CYPRIOT SYLLABLE LU"/* 10813 */,/*32408*/"CYPRIOT SYLLABLE MA"/* 10814 */, /*32409*/"CYPRIOT SYLLABLE ME"/* 10815 */,/*32410*/"CYPRIOT SYLLABLE MI"/* 10816 */, /*32411*/"CYPRIOT SYLLABLE MO"/* 10817 */,/*32412*/"CYPRIOT SYLLABLE MU"/* 10818 */, /*32413*/"CYPRIOT SYLLABLE NA"/* 10819 */,/*32414*/"CYPRIOT SYLLABLE NE"/* 1081A */, /*32415*/"CYPRIOT SYLLABLE NI"/* 1081B */,/*32416*/"CYPRIOT SYLLABLE NO"/* 1081C */, /*32417*/"CYPRIOT SYLLABLE NU"/* 1081D */,/*32418*/"CYPRIOT SYLLABLE PA"/* 1081E */, /*32419*/"CYPRIOT SYLLABLE PE"/* 1081F */,/*32420*/"CYPRIOT SYLLABLE PI"/* 10820 */, /*32421*/"CYPRIOT SYLLABLE PO"/* 10821 */,/*32422*/"CYPRIOT SYLLABLE PU"/* 10822 */, /*32423*/"CYPRIOT SYLLABLE RA"/* 10823 */,/*32424*/"CYPRIOT SYLLABLE RE"/* 10824 */, /*32425*/"CYPRIOT SYLLABLE RI"/* 10825 */,/*32426*/"CYPRIOT SYLLABLE RO"/* 10826 */, /*32427*/"CYPRIOT SYLLABLE RU"/* 10827 */,/*32428*/"CYPRIOT SYLLABLE SA"/* 10828 */, /*32429*/"CYPRIOT SYLLABLE SE"/* 10829 */,/*32430*/"CYPRIOT SYLLABLE SI"/* 1082A */, /*32431*/"CYPRIOT SYLLABLE SO"/* 1082B */,/*32432*/"CYPRIOT SYLLABLE SU"/* 1082C */, /*32433*/"CYPRIOT SYLLABLE TA"/* 1082D */,/*32434*/"CYPRIOT SYLLABLE TE"/* 1082E */, /*32435*/"CYPRIOT SYLLABLE TI"/* 1082F */,/*32436*/"CYPRIOT SYLLABLE TO"/* 10830 */, /*32437*/"CYPRIOT SYLLABLE TU"/* 10831 */,/*32438*/"CYPRIOT SYLLABLE WA"/* 10832 */, /*32439*/"CYPRIOT SYLLABLE WE"/* 10833 */,/*32440*/"CYPRIOT SYLLABLE WI"/* 10834 */, /*32441*/"CYPRIOT SYLLABLE WO"/* 10835 */,NULL,/*32443*/"CYPRIOT SYLLABLE XA"/* 10837 */, /*32444*/"CYPRIOT SYLLABLE XE"/* 10838 */,NULL,NULL,NULL,/*32448*/"CYPRIOT SYLLABLE ZA"/* 1083C */,NULL,NULL, /*32451*/"CYPRIOT SYLLABLE ZO"/* 1083F */,/*32452*/"IMPERIAL ARAMAIC LETTER ALEPH"/* 10840 */, /*32453*/"IMPERIAL ARAMAIC LETTER BETH"/* 10841 */,/*32454*/"IMPERIAL ARAMAIC LETTER GIMEL"/* 10842 */, /*32455*/"IMPERIAL ARAMAIC LETTER DALETH"/* 10843 */,/*32456*/"IMPERIAL ARAMAIC LETTER HE"/* 10844 */, /*32457*/"IMPERIAL ARAMAIC LETTER WAW"/* 10845 */,/*32458*/"IMPERIAL ARAMAIC LETTER ZAYIN"/* 10846 */, /*32459*/"IMPERIAL ARAMAIC LETTER HETH"/* 10847 */,/*32460*/"IMPERIAL ARAMAIC LETTER TETH"/* 10848 */, /*32461*/"IMPERIAL ARAMAIC LETTER YODH"/* 10849 */,/*32462*/"IMPERIAL ARAMAIC LETTER KAPH"/* 1084A */, /*32463*/"IMPERIAL ARAMAIC LETTER LAMEDH"/* 1084B */,/*32464*/"IMPERIAL ARAMAIC LETTER MEM"/* 1084C */, /*32465*/"IMPERIAL ARAMAIC LETTER NUN"/* 1084D */,/*32466*/"IMPERIAL ARAMAIC LETTER SAMEKH"/* 1084E */, /*32467*/"IMPERIAL ARAMAIC LETTER AYIN"/* 1084F */,/*32468*/"IMPERIAL ARAMAIC LETTER PE"/* 10850 */, /*32469*/"IMPERIAL ARAMAIC LETTER SADHE"/* 10851 */,/*32470*/"IMPERIAL ARAMAIC LETTER QOPH"/* 10852 */, /*32471*/"IMPERIAL ARAMAIC LETTER RESH"/* 10853 */,/*32472*/"IMPERIAL ARAMAIC LETTER SHIN"/* 10854 */, /*32473*/"IMPERIAL ARAMAIC LETTER TAW"/* 10855 */,NULL,/*32475*/"IMPERIAL ARAMAIC SECTION SIGN"/* 10857 */, /*32476*/"IMPERIAL ARAMAIC NUMBER ONE"/* 10858 */,/*32477*/"IMPERIAL ARAMAIC NUMBER TWO"/* 10859 */, /*32478*/"IMPERIAL ARAMAIC NUMBER THREE"/* 1085A */,/*32479*/"IMPERIAL ARAMAIC NUMBER TEN"/* 1085B */, /*32480*/"IMPERIAL ARAMAIC NUMBER TWENTY"/* 1085C */,/*32481*/"IMPERIAL ARAMAIC NUMBER ONE HUNDRED"/* 1085D */, /*32482*/"IMPERIAL ARAMAIC NUMBER ONE THOUSAND"/* 1085E */,/*32483*/"IMPERIAL ARAMAIC NUMBER TEN THOUSAND"/* 1085F */, /*32484*/"PALMYRENE LETTER ALEPH"/* 10860 */,/*32485*/"PALMYRENE LETTER BETH"/* 10861 */, /*32486*/"PALMYRENE LETTER GIMEL"/* 10862 */,/*32487*/"PALMYRENE LETTER DALETH"/* 10863 */, /*32488*/"PALMYRENE LETTER HE"/* 10864 */,/*32489*/"PALMYRENE LETTER WAW"/* 10865 */, /*32490*/"PALMYRENE LETTER ZAYIN"/* 10866 */,/*32491*/"PALMYRENE LETTER HETH"/* 10867 */, /*32492*/"PALMYRENE LETTER TETH"/* 10868 */,/*32493*/"PALMYRENE LETTER YODH"/* 10869 */, /*32494*/"PALMYRENE LETTER KAPH"/* 1086A */,/*32495*/"PALMYRENE LETTER LAMEDH"/* 1086B */, /*32496*/"PALMYRENE LETTER MEM"/* 1086C */,/*32497*/"PALMYRENE LETTER FINAL NUN"/* 1086D */, /*32498*/"PALMYRENE LETTER NUN"/* 1086E */,/*32499*/"PALMYRENE LETTER SAMEKH"/* 1086F */, /*32500*/"PALMYRENE LETTER AYIN"/* 10870 */,/*32501*/"PALMYRENE LETTER PE"/* 10871 */, /*32502*/"PALMYRENE LETTER SADHE"/* 10872 */,/*32503*/"PALMYRENE LETTER QOPH"/* 10873 */, /*32504*/"PALMYRENE LETTER RESH"/* 10874 */,/*32505*/"PALMYRENE LETTER SHIN"/* 10875 */, /*32506*/"PALMYRENE LETTER TAW"/* 10876 */,/*32507*/"PALMYRENE LEFT-POINTING FLEURON"/* 10877 */, /*32508*/"PALMYRENE RIGHT-POINTING FLEURON"/* 10878 */,/*32509*/"PALMYRENE NUMBER ONE"/* 10879 */, /*32510*/"PALMYRENE NUMBER TWO"/* 1087A */,/*32511*/"PALMYRENE NUMBER THREE"/* 1087B */, /*32512*/"PALMYRENE NUMBER FOUR"/* 1087C */,/*32513*/"PALMYRENE NUMBER FIVE"/* 1087D */, /*32514*/"PALMYRENE NUMBER TEN"/* 1087E */,/*32515*/"PALMYRENE NUMBER TWENTY"/* 1087F */, /*32516*/"NABATAEAN LETTER FINAL ALEPH"/* 10880 */,/*32517*/"NABATAEAN LETTER ALEPH"/* 10881 */, /*32518*/"NABATAEAN LETTER FINAL BETH"/* 10882 */,/*32519*/"NABATAEAN LETTER BETH"/* 10883 */, /*32520*/"NABATAEAN LETTER GIMEL"/* 10884 */,/*32521*/"NABATAEAN LETTER DALETH"/* 10885 */, /*32522*/"NABATAEAN LETTER FINAL HE"/* 10886 */,/*32523*/"NABATAEAN LETTER HE"/* 10887 */, /*32524*/"NABATAEAN LETTER WAW"/* 10888 */,/*32525*/"NABATAEAN LETTER ZAYIN"/* 10889 */, /*32526*/"NABATAEAN LETTER HETH"/* 1088A */,/*32527*/"NABATAEAN LETTER TETH"/* 1088B */, /*32528*/"NABATAEAN LETTER FINAL YODH"/* 1088C */,/*32529*/"NABATAEAN LETTER YODH"/* 1088D */, /*32530*/"NABATAEAN LETTER FINAL KAPH"/* 1088E */,/*32531*/"NABATAEAN LETTER KAPH"/* 1088F */, /*32532*/"NABATAEAN LETTER FINAL LAMEDH"/* 10890 */,/*32533*/"NABATAEAN LETTER LAMEDH"/* 10891 */, /*32534*/"NABATAEAN LETTER FINAL MEM"/* 10892 */,/*32535*/"NABATAEAN LETTER MEM"/* 10893 */, /*32536*/"NABATAEAN LETTER FINAL NUN"/* 10894 */,/*32537*/"NABATAEAN LETTER NUN"/* 10895 */, /*32538*/"NABATAEAN LETTER SAMEKH"/* 10896 */,/*32539*/"NABATAEAN LETTER AYIN"/* 10897 */, /*32540*/"NABATAEAN LETTER PE"/* 10898 */,/*32541*/"NABATAEAN LETTER SADHE"/* 10899 */, /*32542*/"NABATAEAN LETTER QOPH"/* 1089A */,/*32543*/"NABATAEAN LETTER RESH"/* 1089B */, /*32544*/"NABATAEAN LETTER FINAL SHIN"/* 1089C */,/*32545*/"NABATAEAN LETTER SHIN"/* 1089D */, /*32546*/"NABATAEAN LETTER TAW"/* 1089E */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*32555*/"NABATAEAN NUMBER ONE"/* 108A7 */,/*32556*/"NABATAEAN NUMBER TWO"/* 108A8 */, /*32557*/"NABATAEAN NUMBER THREE"/* 108A9 */,/*32558*/"NABATAEAN NUMBER FOUR"/* 108AA */, /*32559*/"NABATAEAN CRUCIFORM NUMBER FOUR"/* 108AB */,/*32560*/"NABATAEAN NUMBER FIVE"/* 108AC */, /*32561*/"NABATAEAN NUMBER TEN"/* 108AD */,/*32562*/"NABATAEAN NUMBER TWENTY"/* 108AE */, /*32563*/"NABATAEAN NUMBER ONE HUNDRED"/* 108AF */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*32612*/"HATRAN LETTER ALEPH"/* 108E0 */, /*32613*/"HATRAN LETTER BETH"/* 108E1 */,/*32614*/"HATRAN LETTER GIMEL"/* 108E2 */, /*32615*/"HATRAN LETTER DALETH-RESH"/* 108E3 */,/*32616*/"HATRAN LETTER HE"/* 108E4 */, /*32617*/"HATRAN LETTER WAW"/* 108E5 */,/*32618*/"HATRAN LETTER ZAYN"/* 108E6 */, /*32619*/"HATRAN LETTER HETH"/* 108E7 */,/*32620*/"HATRAN LETTER TETH"/* 108E8 */, /*32621*/"HATRAN LETTER YODH"/* 108E9 */,/*32622*/"HATRAN LETTER KAPH"/* 108EA */, /*32623*/"HATRAN LETTER LAMEDH"/* 108EB */,/*32624*/"HATRAN LETTER MEM"/* 108EC */, /*32625*/"HATRAN LETTER NUN"/* 108ED */,/*32626*/"HATRAN LETTER SAMEKH"/* 108EE */, /*32627*/"HATRAN LETTER AYN"/* 108EF */,/*32628*/"HATRAN LETTER PE"/* 108F0 */,/*32629*/"HATRAN LETTER SADHE"/* 108F1 */, /*32630*/"HATRAN LETTER QOPH"/* 108F2 */,NULL,/*32632*/"HATRAN LETTER SHIN"/* 108F4 */, /*32633*/"HATRAN LETTER TAW"/* 108F5 */,NULL,NULL,NULL,NULL,NULL,/*32639*/"HATRAN NUMBER ONE"/* 108FB */, /*32640*/"HATRAN NUMBER FIVE"/* 108FC */,/*32641*/"HATRAN NUMBER TEN"/* 108FD */, /*32642*/"HATRAN NUMBER TWENTY"/* 108FE */,/*32643*/"HATRAN NUMBER ONE HUNDRED"/* 108FF */, /*32644*/"PHOENICIAN LETTER ALF"/* 10900 */,/*32645*/"PHOENICIAN LETTER BET"/* 10901 */, /*32646*/"PHOENICIAN LETTER GAML"/* 10902 */,/*32647*/"PHOENICIAN LETTER DELT"/* 10903 */, /*32648*/"PHOENICIAN LETTER HE"/* 10904 */,/*32649*/"PHOENICIAN LETTER WAU"/* 10905 */, /*32650*/"PHOENICIAN LETTER ZAI"/* 10906 */,/*32651*/"PHOENICIAN LETTER HET"/* 10907 */, /*32652*/"PHOENICIAN LETTER TET"/* 10908 */,/*32653*/"PHOENICIAN LETTER YOD"/* 10909 */, /*32654*/"PHOENICIAN LETTER KAF"/* 1090A */,/*32655*/"PHOENICIAN LETTER LAMD"/* 1090B */, /*32656*/"PHOENICIAN LETTER MEM"/* 1090C */,/*32657*/"PHOENICIAN LETTER NUN"/* 1090D */, /*32658*/"PHOENICIAN LETTER SEMK"/* 1090E */,/*32659*/"PHOENICIAN LETTER AIN"/* 1090F */, /*32660*/"PHOENICIAN LETTER PE"/* 10910 */,/*32661*/"PHOENICIAN LETTER SADE"/* 10911 */, /*32662*/"PHOENICIAN LETTER QOF"/* 10912 */,/*32663*/"PHOENICIAN LETTER ROSH"/* 10913 */, /*32664*/"PHOENICIAN LETTER SHIN"/* 10914 */,/*32665*/"PHOENICIAN LETTER TAU"/* 10915 */, /*32666*/"PHOENICIAN NUMBER ONE"/* 10916 */,/*32667*/"PHOENICIAN NUMBER TEN"/* 10917 */, /*32668*/"PHOENICIAN NUMBER TWENTY"/* 10918 */,/*32669*/"PHOENICIAN NUMBER ONE HUNDRED"/* 10919 */, /*32670*/"PHOENICIAN NUMBER TWO"/* 1091A */,/*32671*/"PHOENICIAN NUMBER THREE"/* 1091B */,NULL,NULL,NULL, /*32675*/"PHOENICIAN WORD SEPARATOR"/* 1091F */,/*32676*/"LYDIAN LETTER A"/* 10920 */, /*32677*/"LYDIAN LETTER B"/* 10921 */,/*32678*/"LYDIAN LETTER G"/* 10922 */,/*32679*/"LYDIAN LETTER D"/* 10923 */, /*32680*/"LYDIAN LETTER E"/* 10924 */,/*32681*/"LYDIAN LETTER V"/* 10925 */,/*32682*/"LYDIAN LETTER I"/* 10926 */, /*32683*/"LYDIAN LETTER Y"/* 10927 */,/*32684*/"LYDIAN LETTER K"/* 10928 */,/*32685*/"LYDIAN LETTER L"/* 10929 */, /*32686*/"LYDIAN LETTER M"/* 1092A */,/*32687*/"LYDIAN LETTER N"/* 1092B */,/*32688*/"LYDIAN LETTER O"/* 1092C */, /*32689*/"LYDIAN LETTER R"/* 1092D */,/*32690*/"LYDIAN LETTER SS"/* 1092E */,/*32691*/"LYDIAN LETTER T"/* 1092F */, /*32692*/"LYDIAN LETTER U"/* 10930 */,/*32693*/"LYDIAN LETTER F"/* 10931 */,/*32694*/"LYDIAN LETTER Q"/* 10932 */, /*32695*/"LYDIAN LETTER S"/* 10933 */,/*32696*/"LYDIAN LETTER TT"/* 10934 */,/*32697*/"LYDIAN LETTER AN"/* 10935 */, /*32698*/"LYDIAN LETTER EN"/* 10936 */,/*32699*/"LYDIAN LETTER LY"/* 10937 */,/*32700*/"LYDIAN LETTER NN"/* 10938 */, /*32701*/"LYDIAN LETTER C"/* 10939 */,NULL,NULL,NULL,NULL,NULL,/*32707*/"LYDIAN TRIANGULAR MARK"/* 1093F */,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*32772*/"MEROITIC HIEROGLYPHIC LETTER A"/* 10980 */,/*32773*/"MEROITIC HIEROGLYPHIC LETTER E"/* 10981 */, /*32774*/"MEROITIC HIEROGLYPHIC LETTER I"/* 10982 */,/*32775*/"MEROITIC HIEROGLYPHIC LETTER O"/* 10983 */, /*32776*/"MEROITIC HIEROGLYPHIC LETTER YA"/* 10984 */,/*32777*/"MEROITIC HIEROGLYPHIC LETTER WA"/* 10985 */, /*32778*/"MEROITIC HIEROGLYPHIC LETTER BA"/* 10986 */,/*32779*/"MEROITIC HIEROGLYPHIC LETTER BA-2"/* 10987 */, /*32780*/"MEROITIC HIEROGLYPHIC LETTER PA"/* 10988 */,/*32781*/"MEROITIC HIEROGLYPHIC LETTER MA"/* 10989 */, /*32782*/"MEROITIC HIEROGLYPHIC LETTER NA"/* 1098A */,/*32783*/"MEROITIC HIEROGLYPHIC LETTER NA-2"/* 1098B */, /*32784*/"MEROITIC HIEROGLYPHIC LETTER NE"/* 1098C */,/*32785*/"MEROITIC HIEROGLYPHIC LETTER NE-2"/* 1098D */, /*32786*/"MEROITIC HIEROGLYPHIC LETTER RA"/* 1098E */,/*32787*/"MEROITIC HIEROGLYPHIC LETTER RA-2"/* 1098F */, /*32788*/"MEROITIC HIEROGLYPHIC LETTER LA"/* 10990 */,/*32789*/"MEROITIC HIEROGLYPHIC LETTER KHA"/* 10991 */, /*32790*/"MEROITIC HIEROGLYPHIC LETTER HHA"/* 10992 */,/*32791*/"MEROITIC HIEROGLYPHIC LETTER SA"/* 10993 */, /*32792*/"MEROITIC HIEROGLYPHIC LETTER SA-2"/* 10994 */,/*32793*/"MEROITIC HIEROGLYPHIC LETTER SE"/* 10995 */, /*32794*/"MEROITIC HIEROGLYPHIC LETTER KA"/* 10996 */,/*32795*/"MEROITIC HIEROGLYPHIC LETTER QA"/* 10997 */, /*32796*/"MEROITIC HIEROGLYPHIC LETTER TA"/* 10998 */,/*32797*/"MEROITIC HIEROGLYPHIC LETTER TA-2"/* 10999 */, /*32798*/"MEROITIC HIEROGLYPHIC LETTER TE"/* 1099A */,/*32799*/"MEROITIC HIEROGLYPHIC LETTER TE-2"/* 1099B */, /*32800*/"MEROITIC HIEROGLYPHIC LETTER TO"/* 1099C */,/*32801*/"MEROITIC HIEROGLYPHIC LETTER DA"/* 1099D */, /*32802*/"MEROITIC HIEROGLYPHIC SYMBOL VIDJ"/* 1099E */,/*32803*/"MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2"/* 1099F */, /*32804*/"MEROITIC CURSIVE LETTER A"/* 109A0 */,/*32805*/"MEROITIC CURSIVE LETTER E"/* 109A1 */, /*32806*/"MEROITIC CURSIVE LETTER I"/* 109A2 */,/*32807*/"MEROITIC CURSIVE LETTER O"/* 109A3 */, /*32808*/"MEROITIC CURSIVE LETTER YA"/* 109A4 */,/*32809*/"MEROITIC CURSIVE LETTER WA"/* 109A5 */, /*32810*/"MEROITIC CURSIVE LETTER BA"/* 109A6 */,/*32811*/"MEROITIC CURSIVE LETTER PA"/* 109A7 */, /*32812*/"MEROITIC CURSIVE LETTER MA"/* 109A8 */,/*32813*/"MEROITIC CURSIVE LETTER NA"/* 109A9 */, /*32814*/"MEROITIC CURSIVE LETTER NE"/* 109AA */,/*32815*/"MEROITIC CURSIVE LETTER RA"/* 109AB */, /*32816*/"MEROITIC CURSIVE LETTER LA"/* 109AC */,/*32817*/"MEROITIC CURSIVE LETTER KHA"/* 109AD */, /*32818*/"MEROITIC CURSIVE LETTER HHA"/* 109AE */,/*32819*/"MEROITIC CURSIVE LETTER SA"/* 109AF */, /*32820*/"MEROITIC CURSIVE LETTER ARCHAIC SA"/* 109B0 */,/*32821*/"MEROITIC CURSIVE LETTER SE"/* 109B1 */, /*32822*/"MEROITIC CURSIVE LETTER KA"/* 109B2 */,/*32823*/"MEROITIC CURSIVE LETTER QA"/* 109B3 */, /*32824*/"MEROITIC CURSIVE LETTER TA"/* 109B4 */,/*32825*/"MEROITIC CURSIVE LETTER TE"/* 109B5 */, /*32826*/"MEROITIC CURSIVE LETTER TO"/* 109B6 */,/*32827*/"MEROITIC CURSIVE LETTER DA"/* 109B7 */,NULL,NULL,NULL,NULL, /*32832*/"MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS"/* 109BC */,/*32833*/"MEROITIC CURSIVE FRACTION ONE HALF"/* 109BD */, /*32834*/"MEROITIC CURSIVE LOGOGRAM RMT"/* 109BE */,/*32835*/"MEROITIC CURSIVE LOGOGRAM IMN"/* 109BF */, /*32836*/"MEROITIC CURSIVE NUMBER ONE"/* 109C0 */,/*32837*/"MEROITIC CURSIVE NUMBER TWO"/* 109C1 */, /*32838*/"MEROITIC CURSIVE NUMBER THREE"/* 109C2 */,/*32839*/"MEROITIC CURSIVE NUMBER FOUR"/* 109C3 */, /*32840*/"MEROITIC CURSIVE NUMBER FIVE"/* 109C4 */,/*32841*/"MEROITIC CURSIVE NUMBER SIX"/* 109C5 */, /*32842*/"MEROITIC CURSIVE NUMBER SEVEN"/* 109C6 */,/*32843*/"MEROITIC CURSIVE NUMBER EIGHT"/* 109C7 */, /*32844*/"MEROITIC CURSIVE NUMBER NINE"/* 109C8 */,/*32845*/"MEROITIC CURSIVE NUMBER TEN"/* 109C9 */, /*32846*/"MEROITIC CURSIVE NUMBER TWENTY"/* 109CA */,/*32847*/"MEROITIC CURSIVE NUMBER THIRTY"/* 109CB */, /*32848*/"MEROITIC CURSIVE NUMBER FORTY"/* 109CC */,/*32849*/"MEROITIC CURSIVE NUMBER FIFTY"/* 109CD */, /*32850*/"MEROITIC CURSIVE NUMBER SIXTY"/* 109CE */,/*32851*/"MEROITIC CURSIVE NUMBER SEVENTY"/* 109CF */,NULL,NULL, /*32854*/"MEROITIC CURSIVE NUMBER ONE HUNDRED"/* 109D2 */,/*32855*/"MEROITIC CURSIVE NUMBER TWO HUNDRED"/* 109D3 */, /*32856*/"MEROITIC CURSIVE NUMBER THREE HUNDRED"/* 109D4 */,/*32857*/"MEROITIC CURSIVE NUMBER FOUR HUNDRED"/* 109D5 */, /*32858*/"MEROITIC CURSIVE NUMBER FIVE HUNDRED"/* 109D6 */,/*32859*/"MEROITIC CURSIVE NUMBER SIX HUNDRED"/* 109D7 */, /*32860*/"MEROITIC CURSIVE NUMBER SEVEN HUNDRED"/* 109D8 */,/*32861*/"MEROITIC CURSIVE NUMBER EIGHT HUNDRED"/* 109D9 */, /*32862*/"MEROITIC CURSIVE NUMBER NINE HUNDRED"/* 109DA */,/*32863*/"MEROITIC CURSIVE NUMBER ONE THOUSAND"/* 109DB */, /*32864*/"MEROITIC CURSIVE NUMBER TWO THOUSAND"/* 109DC */,/*32865*/"MEROITIC CURSIVE NUMBER THREE THOUSAND"/* 109DD */, /*32866*/"MEROITIC CURSIVE NUMBER FOUR THOUSAND"/* 109DE */,/*32867*/"MEROITIC CURSIVE NUMBER FIVE THOUSAND"/* 109DF */, /*32868*/"MEROITIC CURSIVE NUMBER SIX THOUSAND"/* 109E0 */,/*32869*/"MEROITIC CURSIVE NUMBER SEVEN THOUSAND"/* 109E1 */, /*32870*/"MEROITIC CURSIVE NUMBER EIGHT THOUSAND"/* 109E2 */,/*32871*/"MEROITIC CURSIVE NUMBER NINE THOUSAND"/* 109E3 */, /*32872*/"MEROITIC CURSIVE NUMBER TEN THOUSAND"/* 109E4 */,/*32873*/"MEROITIC CURSIVE NUMBER TWENTY THOUSAND"/* 109E5 */, /*32874*/"MEROITIC CURSIVE NUMBER THIRTY THOUSAND"/* 109E6 */, /*32875*/"MEROITIC CURSIVE NUMBER FORTY THOUSAND"/* 109E7 */, /*32876*/"MEROITIC CURSIVE NUMBER FIFTY THOUSAND"/* 109E8 */, /*32877*/"MEROITIC CURSIVE NUMBER SIXTY THOUSAND"/* 109E9 */, /*32878*/"MEROITIC CURSIVE NUMBER SEVENTY THOUSAND"/* 109EA */, /*32879*/"MEROITIC CURSIVE NUMBER EIGHTY THOUSAND"/* 109EB */, /*32880*/"MEROITIC CURSIVE NUMBER NINETY THOUSAND"/* 109EC */, /*32881*/"MEROITIC CURSIVE NUMBER ONE HUNDRED THOUSAND"/* 109ED */, /*32882*/"MEROITIC CURSIVE NUMBER TWO HUNDRED THOUSAND"/* 109EE */, /*32883*/"MEROITIC CURSIVE NUMBER THREE HUNDRED THOUSAND"/* 109EF */, /*32884*/"MEROITIC CURSIVE NUMBER FOUR HUNDRED THOUSAND"/* 109F0 */, /*32885*/"MEROITIC CURSIVE NUMBER FIVE HUNDRED THOUSAND"/* 109F1 */, /*32886*/"MEROITIC CURSIVE NUMBER SIX HUNDRED THOUSAND"/* 109F2 */, /*32887*/"MEROITIC CURSIVE NUMBER SEVEN HUNDRED THOUSAND"/* 109F3 */, /*32888*/"MEROITIC CURSIVE NUMBER EIGHT HUNDRED THOUSAND"/* 109F4 */, /*32889*/"MEROITIC CURSIVE NUMBER NINE HUNDRED THOUSAND"/* 109F5 */, /*32890*/"MEROITIC CURSIVE FRACTION ONE TWELFTH"/* 109F6 */,/*32891*/"MEROITIC CURSIVE FRACTION TWO TWELFTHS"/* 109F7 */, /*32892*/"MEROITIC CURSIVE FRACTION THREE TWELFTHS"/* 109F8 */, /*32893*/"MEROITIC CURSIVE FRACTION FOUR TWELFTHS"/* 109F9 */, /*32894*/"MEROITIC CURSIVE FRACTION FIVE TWELFTHS"/* 109FA */, /*32895*/"MEROITIC CURSIVE FRACTION SIX TWELFTHS"/* 109FB */, /*32896*/"MEROITIC CURSIVE FRACTION SEVEN TWELFTHS"/* 109FC */, /*32897*/"MEROITIC CURSIVE FRACTION EIGHT TWELFTHS"/* 109FD */, /*32898*/"MEROITIC CURSIVE FRACTION NINE TWELFTHS"/* 109FE */, /*32899*/"MEROITIC CURSIVE FRACTION TEN TWELFTHS"/* 109FF */,/*32900*/"KHAROSHTHI LETTER A"/* 10A00 */, /*32901*/"KHAROSHTHI VOWEL SIGN I"/* 10A01 */,/*32902*/"KHAROSHTHI VOWEL SIGN U"/* 10A02 */, /*32903*/"KHAROSHTHI VOWEL SIGN VOCALIC R"/* 10A03 */,NULL,/*32905*/"KHAROSHTHI VOWEL SIGN E"/* 10A05 */, /*32906*/"KHAROSHTHI VOWEL SIGN O"/* 10A06 */,NULL,NULL,NULL,NULL,NULL, /*32912*/"KHAROSHTHI VOWEL LENGTH MARK"/* 10A0C */,/*32913*/"KHAROSHTHI SIGN DOUBLE RING BELOW"/* 10A0D */, /*32914*/"KHAROSHTHI SIGN ANUSVARA"/* 10A0E */,/*32915*/"KHAROSHTHI SIGN VISARGA"/* 10A0F */, /*32916*/"KHAROSHTHI LETTER KA"/* 10A10 */,/*32917*/"KHAROSHTHI LETTER KHA"/* 10A11 */, /*32918*/"KHAROSHTHI LETTER GA"/* 10A12 */,/*32919*/"KHAROSHTHI LETTER GHA"/* 10A13 */,NULL, /*32921*/"KHAROSHTHI LETTER CA"/* 10A15 */,/*32922*/"KHAROSHTHI LETTER CHA"/* 10A16 */, /*32923*/"KHAROSHTHI LETTER JA"/* 10A17 */,NULL,/*32925*/"KHAROSHTHI LETTER NYA"/* 10A19 */, /*32926*/"KHAROSHTHI LETTER TTA"/* 10A1A */,/*32927*/"KHAROSHTHI LETTER TTHA"/* 10A1B */, /*32928*/"KHAROSHTHI LETTER DDA"/* 10A1C */,/*32929*/"KHAROSHTHI LETTER DDHA"/* 10A1D */, /*32930*/"KHAROSHTHI LETTER NNA"/* 10A1E */,/*32931*/"KHAROSHTHI LETTER TA"/* 10A1F */, /*32932*/"KHAROSHTHI LETTER THA"/* 10A20 */,/*32933*/"KHAROSHTHI LETTER DA"/* 10A21 */, /*32934*/"KHAROSHTHI LETTER DHA"/* 10A22 */,/*32935*/"KHAROSHTHI LETTER NA"/* 10A23 */, /*32936*/"KHAROSHTHI LETTER PA"/* 10A24 */,/*32937*/"KHAROSHTHI LETTER PHA"/* 10A25 */, /*32938*/"KHAROSHTHI LETTER BA"/* 10A26 */,/*32939*/"KHAROSHTHI LETTER BHA"/* 10A27 */, /*32940*/"KHAROSHTHI LETTER MA"/* 10A28 */,/*32941*/"KHAROSHTHI LETTER YA"/* 10A29 */, /*32942*/"KHAROSHTHI LETTER RA"/* 10A2A */,/*32943*/"KHAROSHTHI LETTER LA"/* 10A2B */, /*32944*/"KHAROSHTHI LETTER VA"/* 10A2C */,/*32945*/"KHAROSHTHI LETTER SHA"/* 10A2D */, /*32946*/"KHAROSHTHI LETTER SSA"/* 10A2E */,/*32947*/"KHAROSHTHI LETTER SA"/* 10A2F */, /*32948*/"KHAROSHTHI LETTER ZA"/* 10A30 */,/*32949*/"KHAROSHTHI LETTER HA"/* 10A31 */, /*32950*/"KHAROSHTHI LETTER KKA"/* 10A32 */,/*32951*/"KHAROSHTHI LETTER TTTHA"/* 10A33 */,NULL,NULL,NULL,NULL, /*32956*/"KHAROSHTHI SIGN BAR ABOVE"/* 10A38 */,/*32957*/"KHAROSHTHI SIGN CAUDA"/* 10A39 */, /*32958*/"KHAROSHTHI SIGN DOT BELOW"/* 10A3A */,NULL,NULL,NULL,NULL,/*32963*/"KHAROSHTHI VIRAMA"/* 10A3F */, /*32964*/"KHAROSHTHI DIGIT ONE"/* 10A40 */,/*32965*/"KHAROSHTHI DIGIT TWO"/* 10A41 */, /*32966*/"KHAROSHTHI DIGIT THREE"/* 10A42 */,/*32967*/"KHAROSHTHI DIGIT FOUR"/* 10A43 */, /*32968*/"KHAROSHTHI NUMBER TEN"/* 10A44 */,/*32969*/"KHAROSHTHI NUMBER TWENTY"/* 10A45 */, /*32970*/"KHAROSHTHI NUMBER ONE HUNDRED"/* 10A46 */,/*32971*/"KHAROSHTHI NUMBER ONE THOUSAND"/* 10A47 */,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,/*32980*/"KHAROSHTHI PUNCTUATION DOT"/* 10A50 */, /*32981*/"KHAROSHTHI PUNCTUATION SMALL CIRCLE"/* 10A51 */,/*32982*/"KHAROSHTHI PUNCTUATION CIRCLE"/* 10A52 */, /*32983*/"KHAROSHTHI PUNCTUATION CRESCENT BAR"/* 10A53 */,/*32984*/"KHAROSHTHI PUNCTUATION MANGALAM"/* 10A54 */, /*32985*/"KHAROSHTHI PUNCTUATION LOTUS"/* 10A55 */,/*32986*/"KHAROSHTHI PUNCTUATION DANDA"/* 10A56 */, /*32987*/"KHAROSHTHI PUNCTUATION DOUBLE DANDA"/* 10A57 */,/*32988*/"KHAROSHTHI PUNCTUATION LINES"/* 10A58 */,NULL,NULL, NULL,NULL,NULL,NULL,NULL,/*32996*/"OLD SOUTH ARABIAN LETTER HE"/* 10A60 */, /*32997*/"OLD SOUTH ARABIAN LETTER LAMEDH"/* 10A61 */,/*32998*/"OLD SOUTH ARABIAN LETTER HETH"/* 10A62 */, /*32999*/"OLD SOUTH ARABIAN LETTER MEM"/* 10A63 */,/*33000*/"OLD SOUTH ARABIAN LETTER QOPH"/* 10A64 */, /*33001*/"OLD SOUTH ARABIAN LETTER WAW"/* 10A65 */,/*33002*/"OLD SOUTH ARABIAN LETTER SHIN"/* 10A66 */, /*33003*/"OLD SOUTH ARABIAN LETTER RESH"/* 10A67 */,/*33004*/"OLD SOUTH ARABIAN LETTER BETH"/* 10A68 */, /*33005*/"OLD SOUTH ARABIAN LETTER TAW"/* 10A69 */,/*33006*/"OLD SOUTH ARABIAN LETTER SAT"/* 10A6A */, /*33007*/"OLD SOUTH ARABIAN LETTER KAPH"/* 10A6B */,/*33008*/"OLD SOUTH ARABIAN LETTER NUN"/* 10A6C */, /*33009*/"OLD SOUTH ARABIAN LETTER KHETH"/* 10A6D */,/*33010*/"OLD SOUTH ARABIAN LETTER SADHE"/* 10A6E */, /*33011*/"OLD SOUTH ARABIAN LETTER SAMEKH"/* 10A6F */,/*33012*/"OLD SOUTH ARABIAN LETTER FE"/* 10A70 */, /*33013*/"OLD SOUTH ARABIAN LETTER ALEF"/* 10A71 */,/*33014*/"OLD SOUTH ARABIAN LETTER AYN"/* 10A72 */, /*33015*/"OLD SOUTH ARABIAN LETTER DHADHE"/* 10A73 */,/*33016*/"OLD SOUTH ARABIAN LETTER GIMEL"/* 10A74 */, /*33017*/"OLD SOUTH ARABIAN LETTER DALETH"/* 10A75 */,/*33018*/"OLD SOUTH ARABIAN LETTER GHAYN"/* 10A76 */, /*33019*/"OLD SOUTH ARABIAN LETTER TETH"/* 10A77 */,/*33020*/"OLD SOUTH ARABIAN LETTER ZAYN"/* 10A78 */, /*33021*/"OLD SOUTH ARABIAN LETTER DHALETH"/* 10A79 */,/*33022*/"OLD SOUTH ARABIAN LETTER YODH"/* 10A7A */, /*33023*/"OLD SOUTH ARABIAN LETTER THAW"/* 10A7B */,/*33024*/"OLD SOUTH ARABIAN LETTER THETH"/* 10A7C */, /*33025*/"OLD SOUTH ARABIAN NUMBER ONE"/* 10A7D */,/*33026*/"OLD SOUTH ARABIAN NUMBER FIFTY"/* 10A7E */, /*33027*/"OLD SOUTH ARABIAN NUMERIC INDICATOR"/* 10A7F */,/*33028*/"OLD NORTH ARABIAN LETTER HEH"/* 10A80 */, /*33029*/"OLD NORTH ARABIAN LETTER LAM"/* 10A81 */,/*33030*/"OLD NORTH ARABIAN LETTER HAH"/* 10A82 */, /*33031*/"OLD NORTH ARABIAN LETTER MEEM"/* 10A83 */,/*33032*/"OLD NORTH ARABIAN LETTER QAF"/* 10A84 */, /*33033*/"OLD NORTH ARABIAN LETTER WAW"/* 10A85 */,/*33034*/"OLD NORTH ARABIAN LETTER ES-2"/* 10A86 */, /*33035*/"OLD NORTH ARABIAN LETTER REH"/* 10A87 */,/*33036*/"OLD NORTH ARABIAN LETTER BEH"/* 10A88 */, /*33037*/"OLD NORTH ARABIAN LETTER TEH"/* 10A89 */,/*33038*/"OLD NORTH ARABIAN LETTER ES-1"/* 10A8A */, /*33039*/"OLD NORTH ARABIAN LETTER KAF"/* 10A8B */,/*33040*/"OLD NORTH ARABIAN LETTER NOON"/* 10A8C */, /*33041*/"OLD NORTH ARABIAN LETTER KHAH"/* 10A8D */,/*33042*/"OLD NORTH ARABIAN LETTER SAD"/* 10A8E */, /*33043*/"OLD NORTH ARABIAN LETTER ES-3"/* 10A8F */,/*33044*/"OLD NORTH ARABIAN LETTER FEH"/* 10A90 */, /*33045*/"OLD NORTH ARABIAN LETTER ALEF"/* 10A91 */,/*33046*/"OLD NORTH ARABIAN LETTER AIN"/* 10A92 */, /*33047*/"OLD NORTH ARABIAN LETTER DAD"/* 10A93 */,/*33048*/"OLD NORTH ARABIAN LETTER GEEM"/* 10A94 */, /*33049*/"OLD NORTH ARABIAN LETTER DAL"/* 10A95 */,/*33050*/"OLD NORTH ARABIAN LETTER GHAIN"/* 10A96 */, /*33051*/"OLD NORTH ARABIAN LETTER TAH"/* 10A97 */,/*33052*/"OLD NORTH ARABIAN LETTER ZAIN"/* 10A98 */, /*33053*/"OLD NORTH ARABIAN LETTER THAL"/* 10A99 */,/*33054*/"OLD NORTH ARABIAN LETTER YEH"/* 10A9A */, /*33055*/"OLD NORTH ARABIAN LETTER THEH"/* 10A9B */,/*33056*/"OLD NORTH ARABIAN LETTER ZAH"/* 10A9C */, /*33057*/"OLD NORTH ARABIAN NUMBER ONE"/* 10A9D */,/*33058*/"OLD NORTH ARABIAN NUMBER TEN"/* 10A9E */, /*33059*/"OLD NORTH ARABIAN NUMBER TWENTY"/* 10A9F */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*33092*/"MANICHAEAN LETTER ALEPH"/* 10AC0 */,/*33093*/"MANICHAEAN LETTER BETH"/* 10AC1 */, /*33094*/"MANICHAEAN LETTER BHETH"/* 10AC2 */,/*33095*/"MANICHAEAN LETTER GIMEL"/* 10AC3 */, /*33096*/"MANICHAEAN LETTER GHIMEL"/* 10AC4 */,/*33097*/"MANICHAEAN LETTER DALETH"/* 10AC5 */, /*33098*/"MANICHAEAN LETTER HE"/* 10AC6 */,/*33099*/"MANICHAEAN LETTER WAW"/* 10AC7 */, /*33100*/"MANICHAEAN SIGN UD"/* 10AC8 */,/*33101*/"MANICHAEAN LETTER ZAYIN"/* 10AC9 */, /*33102*/"MANICHAEAN LETTER ZHAYIN"/* 10ACA */,/*33103*/"MANICHAEAN LETTER JAYIN"/* 10ACB */, /*33104*/"MANICHAEAN LETTER JHAYIN"/* 10ACC */,/*33105*/"MANICHAEAN LETTER HETH"/* 10ACD */, /*33106*/"MANICHAEAN LETTER TETH"/* 10ACE */,/*33107*/"MANICHAEAN LETTER YODH"/* 10ACF */, /*33108*/"MANICHAEAN LETTER KAPH"/* 10AD0 */,/*33109*/"MANICHAEAN LETTER XAPH"/* 10AD1 */, /*33110*/"MANICHAEAN LETTER KHAPH"/* 10AD2 */,/*33111*/"MANICHAEAN LETTER LAMEDH"/* 10AD3 */, /*33112*/"MANICHAEAN LETTER DHAMEDH"/* 10AD4 */,/*33113*/"MANICHAEAN LETTER THAMEDH"/* 10AD5 */, /*33114*/"MANICHAEAN LETTER MEM"/* 10AD6 */,/*33115*/"MANICHAEAN LETTER NUN"/* 10AD7 */, /*33116*/"MANICHAEAN LETTER SAMEKH"/* 10AD8 */,/*33117*/"MANICHAEAN LETTER AYIN"/* 10AD9 */, /*33118*/"MANICHAEAN LETTER AAYIN"/* 10ADA */,/*33119*/"MANICHAEAN LETTER PE"/* 10ADB */, /*33120*/"MANICHAEAN LETTER FE"/* 10ADC */,/*33121*/"MANICHAEAN LETTER SADHE"/* 10ADD */, /*33122*/"MANICHAEAN LETTER QOPH"/* 10ADE */,/*33123*/"MANICHAEAN LETTER XOPH"/* 10ADF */, /*33124*/"MANICHAEAN LETTER QHOPH"/* 10AE0 */,/*33125*/"MANICHAEAN LETTER RESH"/* 10AE1 */, /*33126*/"MANICHAEAN LETTER SHIN"/* 10AE2 */,/*33127*/"MANICHAEAN LETTER SSHIN"/* 10AE3 */, /*33128*/"MANICHAEAN LETTER TAW"/* 10AE4 */,/*33129*/"MANICHAEAN ABBREVIATION MARK ABOVE"/* 10AE5 */, /*33130*/"MANICHAEAN ABBREVIATION MARK BELOW"/* 10AE6 */,NULL,NULL,NULL,NULL,/*33135*/"MANICHAEAN NUMBER ONE"/* 10AEB */, /*33136*/"MANICHAEAN NUMBER FIVE"/* 10AEC */,/*33137*/"MANICHAEAN NUMBER TEN"/* 10AED */, /*33138*/"MANICHAEAN NUMBER TWENTY"/* 10AEE */,/*33139*/"MANICHAEAN NUMBER ONE HUNDRED"/* 10AEF */, /*33140*/"MANICHAEAN PUNCTUATION STAR"/* 10AF0 */,/*33141*/"MANICHAEAN PUNCTUATION FLEURON"/* 10AF1 */, /*33142*/"MANICHAEAN PUNCTUATION DOUBLE DOT WITHIN DOT"/* 10AF2 */, /*33143*/"MANICHAEAN PUNCTUATION DOT WITHIN DOT"/* 10AF3 */,/*33144*/"MANICHAEAN PUNCTUATION DOT"/* 10AF4 */, /*33145*/"MANICHAEAN PUNCTUATION TWO DOTS"/* 10AF5 */,/*33146*/"MANICHAEAN PUNCTUATION LINE FILLER"/* 10AF6 */,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*33156*/"AVESTAN LETTER A"/* 10B00 */,/*33157*/"AVESTAN LETTER AA"/* 10B01 */, /*33158*/"AVESTAN LETTER AO"/* 10B02 */,/*33159*/"AVESTAN LETTER AAO"/* 10B03 */,/*33160*/"AVESTAN LETTER AN"/* 10B04 */, /*33161*/"AVESTAN LETTER AAN"/* 10B05 */,/*33162*/"AVESTAN LETTER AE"/* 10B06 */, /*33163*/"AVESTAN LETTER AEE"/* 10B07 */,/*33164*/"AVESTAN LETTER E"/* 10B08 */,/*33165*/"AVESTAN LETTER EE"/* 10B09 */, /*33166*/"AVESTAN LETTER O"/* 10B0A */,/*33167*/"AVESTAN LETTER OO"/* 10B0B */,/*33168*/"AVESTAN LETTER I"/* 10B0C */, /*33169*/"AVESTAN LETTER II"/* 10B0D */,/*33170*/"AVESTAN LETTER U"/* 10B0E */,/*33171*/"AVESTAN LETTER UU"/* 10B0F */, /*33172*/"AVESTAN LETTER KE"/* 10B10 */,/*33173*/"AVESTAN LETTER XE"/* 10B11 */,/*33174*/"AVESTAN LETTER XYE"/* 10B12 */, /*33175*/"AVESTAN LETTER XVE"/* 10B13 */,/*33176*/"AVESTAN LETTER GE"/* 10B14 */, /*33177*/"AVESTAN LETTER GGE"/* 10B15 */,/*33178*/"AVESTAN LETTER GHE"/* 10B16 */, /*33179*/"AVESTAN LETTER CE"/* 10B17 */,/*33180*/"AVESTAN LETTER JE"/* 10B18 */,/*33181*/"AVESTAN LETTER TE"/* 10B19 */, /*33182*/"AVESTAN LETTER THE"/* 10B1A */,/*33183*/"AVESTAN LETTER DE"/* 10B1B */, /*33184*/"AVESTAN LETTER DHE"/* 10B1C */,/*33185*/"AVESTAN LETTER TTE"/* 10B1D */, /*33186*/"AVESTAN LETTER PE"/* 10B1E */,/*33187*/"AVESTAN LETTER FE"/* 10B1F */,/*33188*/"AVESTAN LETTER BE"/* 10B20 */, /*33189*/"AVESTAN LETTER BHE"/* 10B21 */,/*33190*/"AVESTAN LETTER NGE"/* 10B22 */, /*33191*/"AVESTAN LETTER NGYE"/* 10B23 */,/*33192*/"AVESTAN LETTER NGVE"/* 10B24 */, /*33193*/"AVESTAN LETTER NE"/* 10B25 */,/*33194*/"AVESTAN LETTER NYE"/* 10B26 */, /*33195*/"AVESTAN LETTER NNE"/* 10B27 */,/*33196*/"AVESTAN LETTER ME"/* 10B28 */, /*33197*/"AVESTAN LETTER HME"/* 10B29 */,/*33198*/"AVESTAN LETTER YYE"/* 10B2A */, /*33199*/"AVESTAN LETTER YE"/* 10B2B */,/*33200*/"AVESTAN LETTER VE"/* 10B2C */,/*33201*/"AVESTAN LETTER RE"/* 10B2D */, /*33202*/"AVESTAN LETTER LE"/* 10B2E */,/*33203*/"AVESTAN LETTER SE"/* 10B2F */,/*33204*/"AVESTAN LETTER ZE"/* 10B30 */, /*33205*/"AVESTAN LETTER SHE"/* 10B31 */,/*33206*/"AVESTAN LETTER ZHE"/* 10B32 */, /*33207*/"AVESTAN LETTER SHYE"/* 10B33 */,/*33208*/"AVESTAN LETTER SSHE"/* 10B34 */, /*33209*/"AVESTAN LETTER HE"/* 10B35 */,NULL,NULL,NULL,/*33213*/"AVESTAN ABBREVIATION MARK"/* 10B39 */, /*33214*/"TINY TWO DOTS OVER ONE DOT PUNCTUATION"/* 10B3A */, /*33215*/"SMALL TWO DOTS OVER ONE DOT PUNCTUATION"/* 10B3B */, /*33216*/"LARGE TWO DOTS OVER ONE DOT PUNCTUATION"/* 10B3C */, /*33217*/"LARGE ONE DOT OVER TWO DOTS PUNCTUATION"/* 10B3D */, /*33218*/"LARGE TWO RINGS OVER ONE RING PUNCTUATION"/* 10B3E */, /*33219*/"LARGE ONE RING OVER TWO RINGS PUNCTUATION"/* 10B3F */, /*33220*/"INSCRIPTIONAL PARTHIAN LETTER ALEPH"/* 10B40 */,/*33221*/"INSCRIPTIONAL PARTHIAN LETTER BETH"/* 10B41 */, /*33222*/"INSCRIPTIONAL PARTHIAN LETTER GIMEL"/* 10B42 */,/*33223*/"INSCRIPTIONAL PARTHIAN LETTER DALETH"/* 10B43 */, /*33224*/"INSCRIPTIONAL PARTHIAN LETTER HE"/* 10B44 */,/*33225*/"INSCRIPTIONAL PARTHIAN LETTER WAW"/* 10B45 */, /*33226*/"INSCRIPTIONAL PARTHIAN LETTER ZAYIN"/* 10B46 */,/*33227*/"INSCRIPTIONAL PARTHIAN LETTER HETH"/* 10B47 */, /*33228*/"INSCRIPTIONAL PARTHIAN LETTER TETH"/* 10B48 */,/*33229*/"INSCRIPTIONAL PARTHIAN LETTER YODH"/* 10B49 */, /*33230*/"INSCRIPTIONAL PARTHIAN LETTER KAPH"/* 10B4A */,/*33231*/"INSCRIPTIONAL PARTHIAN LETTER LAMEDH"/* 10B4B */, /*33232*/"INSCRIPTIONAL PARTHIAN LETTER MEM"/* 10B4C */,/*33233*/"INSCRIPTIONAL PARTHIAN LETTER NUN"/* 10B4D */, /*33234*/"INSCRIPTIONAL PARTHIAN LETTER SAMEKH"/* 10B4E */,/*33235*/"INSCRIPTIONAL PARTHIAN LETTER AYIN"/* 10B4F */, /*33236*/"INSCRIPTIONAL PARTHIAN LETTER PE"/* 10B50 */,/*33237*/"INSCRIPTIONAL PARTHIAN LETTER SADHE"/* 10B51 */, /*33238*/"INSCRIPTIONAL PARTHIAN LETTER QOPH"/* 10B52 */,/*33239*/"INSCRIPTIONAL PARTHIAN LETTER RESH"/* 10B53 */, /*33240*/"INSCRIPTIONAL PARTHIAN LETTER SHIN"/* 10B54 */,/*33241*/"INSCRIPTIONAL PARTHIAN LETTER TAW"/* 10B55 */,NULL, NULL,/*33244*/"INSCRIPTIONAL PARTHIAN NUMBER ONE"/* 10B58 */,/*33245*/"INSCRIPTIONAL PARTHIAN NUMBER TWO"/* 10B59 */, /*33246*/"INSCRIPTIONAL PARTHIAN NUMBER THREE"/* 10B5A */,/*33247*/"INSCRIPTIONAL PARTHIAN NUMBER FOUR"/* 10B5B */, /*33248*/"INSCRIPTIONAL PARTHIAN NUMBER TEN"/* 10B5C */,/*33249*/"INSCRIPTIONAL PARTHIAN NUMBER TWENTY"/* 10B5D */, /*33250*/"INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED"/* 10B5E */, /*33251*/"INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND"/* 10B5F */, /*33252*/"INSCRIPTIONAL PAHLAVI LETTER ALEPH"/* 10B60 */,/*33253*/"INSCRIPTIONAL PAHLAVI LETTER BETH"/* 10B61 */, /*33254*/"INSCRIPTIONAL PAHLAVI LETTER GIMEL"/* 10B62 */,/*33255*/"INSCRIPTIONAL PAHLAVI LETTER DALETH"/* 10B63 */, /*33256*/"INSCRIPTIONAL PAHLAVI LETTER HE"/* 10B64 */,/*33257*/"INSCRIPTIONAL PAHLAVI LETTER WAW-AYIN-RESH"/* 10B65 */, /*33258*/"INSCRIPTIONAL PAHLAVI LETTER ZAYIN"/* 10B66 */,/*33259*/"INSCRIPTIONAL PAHLAVI LETTER HETH"/* 10B67 */, /*33260*/"INSCRIPTIONAL PAHLAVI LETTER TETH"/* 10B68 */,/*33261*/"INSCRIPTIONAL PAHLAVI LETTER YODH"/* 10B69 */, /*33262*/"INSCRIPTIONAL PAHLAVI LETTER KAPH"/* 10B6A */,/*33263*/"INSCRIPTIONAL PAHLAVI LETTER LAMEDH"/* 10B6B */, /*33264*/"INSCRIPTIONAL PAHLAVI LETTER MEM-QOPH"/* 10B6C */,/*33265*/"INSCRIPTIONAL PAHLAVI LETTER NUN"/* 10B6D */, /*33266*/"INSCRIPTIONAL PAHLAVI LETTER SAMEKH"/* 10B6E */,/*33267*/"INSCRIPTIONAL PAHLAVI LETTER PE"/* 10B6F */, /*33268*/"INSCRIPTIONAL PAHLAVI LETTER SADHE"/* 10B70 */,/*33269*/"INSCRIPTIONAL PAHLAVI LETTER SHIN"/* 10B71 */, /*33270*/"INSCRIPTIONAL PAHLAVI LETTER TAW"/* 10B72 */,NULL,NULL,NULL,NULL,NULL, /*33276*/"INSCRIPTIONAL PAHLAVI NUMBER ONE"/* 10B78 */,/*33277*/"INSCRIPTIONAL PAHLAVI NUMBER TWO"/* 10B79 */, /*33278*/"INSCRIPTIONAL PAHLAVI NUMBER THREE"/* 10B7A */,/*33279*/"INSCRIPTIONAL PAHLAVI NUMBER FOUR"/* 10B7B */, /*33280*/"INSCRIPTIONAL PAHLAVI NUMBER TEN"/* 10B7C */,/*33281*/"INSCRIPTIONAL PAHLAVI NUMBER TWENTY"/* 10B7D */, /*33282*/"INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED"/* 10B7E */, /*33283*/"INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND"/* 10B7F */,/*33284*/"PSALTER PAHLAVI LETTER ALEPH"/* 10B80 */, /*33285*/"PSALTER PAHLAVI LETTER BETH"/* 10B81 */,/*33286*/"PSALTER PAHLAVI LETTER GIMEL"/* 10B82 */, /*33287*/"PSALTER PAHLAVI LETTER DALETH"/* 10B83 */,/*33288*/"PSALTER PAHLAVI LETTER HE"/* 10B84 */, /*33289*/"PSALTER PAHLAVI LETTER WAW-AYIN-RESH"/* 10B85 */,/*33290*/"PSALTER PAHLAVI LETTER ZAYIN"/* 10B86 */, /*33291*/"PSALTER PAHLAVI LETTER HETH"/* 10B87 */,/*33292*/"PSALTER PAHLAVI LETTER YODH"/* 10B88 */, /*33293*/"PSALTER PAHLAVI LETTER KAPH"/* 10B89 */,/*33294*/"PSALTER PAHLAVI LETTER LAMEDH"/* 10B8A */, /*33295*/"PSALTER PAHLAVI LETTER MEM-QOPH"/* 10B8B */,/*33296*/"PSALTER PAHLAVI LETTER NUN"/* 10B8C */, /*33297*/"PSALTER PAHLAVI LETTER SAMEKH"/* 10B8D */,/*33298*/"PSALTER PAHLAVI LETTER PE"/* 10B8E */, /*33299*/"PSALTER PAHLAVI LETTER SADHE"/* 10B8F */,/*33300*/"PSALTER PAHLAVI LETTER SHIN"/* 10B90 */, /*33301*/"PSALTER PAHLAVI LETTER TAW"/* 10B91 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*33309*/"PSALTER PAHLAVI SECTION MARK"/* 10B99 */,/*33310*/"PSALTER PAHLAVI TURNED SECTION MARK"/* 10B9A */, /*33311*/"PSALTER PAHLAVI FOUR DOTS WITH CROSS"/* 10B9B */,/*33312*/"PSALTER PAHLAVI FOUR DOTS WITH DOT"/* 10B9C */,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*33325*/"PSALTER PAHLAVI NUMBER ONE"/* 10BA9 */, /*33326*/"PSALTER PAHLAVI NUMBER TWO"/* 10BAA */,/*33327*/"PSALTER PAHLAVI NUMBER THREE"/* 10BAB */, /*33328*/"PSALTER PAHLAVI NUMBER FOUR"/* 10BAC */,/*33329*/"PSALTER PAHLAVI NUMBER TEN"/* 10BAD */, /*33330*/"PSALTER PAHLAVI NUMBER TWENTY"/* 10BAE */,/*33331*/"PSALTER PAHLAVI NUMBER ONE HUNDRED"/* 10BAF */,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,/*33412*/"OLD TURKIC LETTER ORKHON A"/* 10C00 */, /*33413*/"OLD TURKIC LETTER YENISEI A"/* 10C01 */,/*33414*/"OLD TURKIC LETTER YENISEI AE"/* 10C02 */, /*33415*/"OLD TURKIC LETTER ORKHON I"/* 10C03 */,/*33416*/"OLD TURKIC LETTER YENISEI I"/* 10C04 */, /*33417*/"OLD TURKIC LETTER YENISEI E"/* 10C05 */,/*33418*/"OLD TURKIC LETTER ORKHON O"/* 10C06 */, /*33419*/"OLD TURKIC LETTER ORKHON OE"/* 10C07 */,/*33420*/"OLD TURKIC LETTER YENISEI OE"/* 10C08 */, /*33421*/"OLD TURKIC LETTER ORKHON AB"/* 10C09 */,/*33422*/"OLD TURKIC LETTER YENISEI AB"/* 10C0A */, /*33423*/"OLD TURKIC LETTER ORKHON AEB"/* 10C0B */,/*33424*/"OLD TURKIC LETTER YENISEI AEB"/* 10C0C */, /*33425*/"OLD TURKIC LETTER ORKHON AG"/* 10C0D */,/*33426*/"OLD TURKIC LETTER YENISEI AG"/* 10C0E */, /*33427*/"OLD TURKIC LETTER ORKHON AEG"/* 10C0F */,/*33428*/"OLD TURKIC LETTER YENISEI AEG"/* 10C10 */, /*33429*/"OLD TURKIC LETTER ORKHON AD"/* 10C11 */,/*33430*/"OLD TURKIC LETTER YENISEI AD"/* 10C12 */, /*33431*/"OLD TURKIC LETTER ORKHON AED"/* 10C13 */,/*33432*/"OLD TURKIC LETTER ORKHON EZ"/* 10C14 */, /*33433*/"OLD TURKIC LETTER YENISEI EZ"/* 10C15 */,/*33434*/"OLD TURKIC LETTER ORKHON AY"/* 10C16 */, /*33435*/"OLD TURKIC LETTER YENISEI AY"/* 10C17 */,/*33436*/"OLD TURKIC LETTER ORKHON AEY"/* 10C18 */, /*33437*/"OLD TURKIC LETTER YENISEI AEY"/* 10C19 */,/*33438*/"OLD TURKIC LETTER ORKHON AEK"/* 10C1A */, /*33439*/"OLD TURKIC LETTER YENISEI AEK"/* 10C1B */,/*33440*/"OLD TURKIC LETTER ORKHON OEK"/* 10C1C */, /*33441*/"OLD TURKIC LETTER YENISEI OEK"/* 10C1D */,/*33442*/"OLD TURKIC LETTER ORKHON AL"/* 10C1E */, /*33443*/"OLD TURKIC LETTER YENISEI AL"/* 10C1F */,/*33444*/"OLD TURKIC LETTER ORKHON AEL"/* 10C20 */, /*33445*/"OLD TURKIC LETTER ORKHON ELT"/* 10C21 */,/*33446*/"OLD TURKIC LETTER ORKHON EM"/* 10C22 */, /*33447*/"OLD TURKIC LETTER ORKHON AN"/* 10C23 */,/*33448*/"OLD TURKIC LETTER ORKHON AEN"/* 10C24 */, /*33449*/"OLD TURKIC LETTER YENISEI AEN"/* 10C25 */,/*33450*/"OLD TURKIC LETTER ORKHON ENT"/* 10C26 */, /*33451*/"OLD TURKIC LETTER YENISEI ENT"/* 10C27 */,/*33452*/"OLD TURKIC LETTER ORKHON ENC"/* 10C28 */, /*33453*/"OLD TURKIC LETTER YENISEI ENC"/* 10C29 */,/*33454*/"OLD TURKIC LETTER ORKHON ENY"/* 10C2A */, /*33455*/"OLD TURKIC LETTER YENISEI ENY"/* 10C2B */,/*33456*/"OLD TURKIC LETTER YENISEI ANG"/* 10C2C */, /*33457*/"OLD TURKIC LETTER ORKHON ENG"/* 10C2D */,/*33458*/"OLD TURKIC LETTER YENISEI AENG"/* 10C2E */, /*33459*/"OLD TURKIC LETTER ORKHON EP"/* 10C2F */,/*33460*/"OLD TURKIC LETTER ORKHON OP"/* 10C30 */, /*33461*/"OLD TURKIC LETTER ORKHON IC"/* 10C31 */,/*33462*/"OLD TURKIC LETTER ORKHON EC"/* 10C32 */, /*33463*/"OLD TURKIC LETTER YENISEI EC"/* 10C33 */,/*33464*/"OLD TURKIC LETTER ORKHON AQ"/* 10C34 */, /*33465*/"OLD TURKIC LETTER YENISEI AQ"/* 10C35 */,/*33466*/"OLD TURKIC LETTER ORKHON IQ"/* 10C36 */, /*33467*/"OLD TURKIC LETTER YENISEI IQ"/* 10C37 */,/*33468*/"OLD TURKIC LETTER ORKHON OQ"/* 10C38 */, /*33469*/"OLD TURKIC LETTER YENISEI OQ"/* 10C39 */,/*33470*/"OLD TURKIC LETTER ORKHON AR"/* 10C3A */, /*33471*/"OLD TURKIC LETTER YENISEI AR"/* 10C3B */,/*33472*/"OLD TURKIC LETTER ORKHON AER"/* 10C3C */, /*33473*/"OLD TURKIC LETTER ORKHON AS"/* 10C3D */,/*33474*/"OLD TURKIC LETTER ORKHON AES"/* 10C3E */, /*33475*/"OLD TURKIC LETTER ORKHON ASH"/* 10C3F */,/*33476*/"OLD TURKIC LETTER YENISEI ASH"/* 10C40 */, /*33477*/"OLD TURKIC LETTER ORKHON ESH"/* 10C41 */,/*33478*/"OLD TURKIC LETTER YENISEI ESH"/* 10C42 */, /*33479*/"OLD TURKIC LETTER ORKHON AT"/* 10C43 */,/*33480*/"OLD TURKIC LETTER YENISEI AT"/* 10C44 */, /*33481*/"OLD TURKIC LETTER ORKHON AET"/* 10C45 */,/*33482*/"OLD TURKIC LETTER YENISEI AET"/* 10C46 */, /*33483*/"OLD TURKIC LETTER ORKHON OT"/* 10C47 */,/*33484*/"OLD TURKIC LETTER ORKHON BASH"/* 10C48 */,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,/*33540*/"OLD HUNGARIAN CAPITAL LETTER A"/* 10C80 */, /*33541*/"OLD HUNGARIAN CAPITAL LETTER AA"/* 10C81 */,/*33542*/"OLD HUNGARIAN CAPITAL LETTER EB"/* 10C82 */, /*33543*/"OLD HUNGARIAN CAPITAL LETTER AMB"/* 10C83 */,/*33544*/"OLD HUNGARIAN CAPITAL LETTER EC"/* 10C84 */, /*33545*/"OLD HUNGARIAN CAPITAL LETTER ENC"/* 10C85 */,/*33546*/"OLD HUNGARIAN CAPITAL LETTER ECS"/* 10C86 */, /*33547*/"OLD HUNGARIAN CAPITAL LETTER ED"/* 10C87 */,/*33548*/"OLD HUNGARIAN CAPITAL LETTER AND"/* 10C88 */, /*33549*/"OLD HUNGARIAN CAPITAL LETTER E"/* 10C89 */,/*33550*/"OLD HUNGARIAN CAPITAL LETTER CLOSE E"/* 10C8A */, /*33551*/"OLD HUNGARIAN CAPITAL LETTER EE"/* 10C8B */,/*33552*/"OLD HUNGARIAN CAPITAL LETTER EF"/* 10C8C */, /*33553*/"OLD HUNGARIAN CAPITAL LETTER EG"/* 10C8D */,/*33554*/"OLD HUNGARIAN CAPITAL LETTER EGY"/* 10C8E */, /*33555*/"OLD HUNGARIAN CAPITAL LETTER EH"/* 10C8F */,/*33556*/"OLD HUNGARIAN CAPITAL LETTER I"/* 10C90 */, /*33557*/"OLD HUNGARIAN CAPITAL LETTER II"/* 10C91 */,/*33558*/"OLD HUNGARIAN CAPITAL LETTER EJ"/* 10C92 */, /*33559*/"OLD HUNGARIAN CAPITAL LETTER EK"/* 10C93 */,/*33560*/"OLD HUNGARIAN CAPITAL LETTER AK"/* 10C94 */, /*33561*/"OLD HUNGARIAN CAPITAL LETTER UNK"/* 10C95 */,/*33562*/"OLD HUNGARIAN CAPITAL LETTER EL"/* 10C96 */, /*33563*/"OLD HUNGARIAN CAPITAL LETTER ELY"/* 10C97 */,/*33564*/"OLD HUNGARIAN CAPITAL LETTER EM"/* 10C98 */, /*33565*/"OLD HUNGARIAN CAPITAL LETTER EN"/* 10C99 */,/*33566*/"OLD HUNGARIAN CAPITAL LETTER ENY"/* 10C9A */, /*33567*/"OLD HUNGARIAN CAPITAL LETTER O"/* 10C9B */,/*33568*/"OLD HUNGARIAN CAPITAL LETTER OO"/* 10C9C */, /*33569*/"OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE"/* 10C9D */, /*33570*/"OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE"/* 10C9E */,/*33571*/"OLD HUNGARIAN CAPITAL LETTER OEE"/* 10C9F */, /*33572*/"OLD HUNGARIAN CAPITAL LETTER EP"/* 10CA0 */,/*33573*/"OLD HUNGARIAN CAPITAL LETTER EMP"/* 10CA1 */, /*33574*/"OLD HUNGARIAN CAPITAL LETTER ER"/* 10CA2 */,/*33575*/"OLD HUNGARIAN CAPITAL LETTER SHORT ER"/* 10CA3 */, /*33576*/"OLD HUNGARIAN CAPITAL LETTER ES"/* 10CA4 */,/*33577*/"OLD HUNGARIAN CAPITAL LETTER ESZ"/* 10CA5 */, /*33578*/"OLD HUNGARIAN CAPITAL LETTER ET"/* 10CA6 */,/*33579*/"OLD HUNGARIAN CAPITAL LETTER ENT"/* 10CA7 */, /*33580*/"OLD HUNGARIAN CAPITAL LETTER ETY"/* 10CA8 */,/*33581*/"OLD HUNGARIAN CAPITAL LETTER ECH"/* 10CA9 */, /*33582*/"OLD HUNGARIAN CAPITAL LETTER U"/* 10CAA */,/*33583*/"OLD HUNGARIAN CAPITAL LETTER UU"/* 10CAB */, /*33584*/"OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE"/* 10CAC */, /*33585*/"OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE"/* 10CAD */,/*33586*/"OLD HUNGARIAN CAPITAL LETTER EV"/* 10CAE */, /*33587*/"OLD HUNGARIAN CAPITAL LETTER EZ"/* 10CAF */,/*33588*/"OLD HUNGARIAN CAPITAL LETTER EZS"/* 10CB0 */, /*33589*/"OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN"/* 10CB1 */,/*33590*/"OLD HUNGARIAN CAPITAL LETTER US"/* 10CB2 */, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*33604*/"OLD HUNGARIAN SMALL LETTER A"/* 10CC0 */, /*33605*/"OLD HUNGARIAN SMALL LETTER AA"/* 10CC1 */,/*33606*/"OLD HUNGARIAN SMALL LETTER EB"/* 10CC2 */, /*33607*/"OLD HUNGARIAN SMALL LETTER AMB"/* 10CC3 */,/*33608*/"OLD HUNGARIAN SMALL LETTER EC"/* 10CC4 */, /*33609*/"OLD HUNGARIAN SMALL LETTER ENC"/* 10CC5 */,/*33610*/"OLD HUNGARIAN SMALL LETTER ECS"/* 10CC6 */, /*33611*/"OLD HUNGARIAN SMALL LETTER ED"/* 10CC7 */,/*33612*/"OLD HUNGARIAN SMALL LETTER AND"/* 10CC8 */, /*33613*/"OLD HUNGARIAN SMALL LETTER E"/* 10CC9 */,/*33614*/"OLD HUNGARIAN SMALL LETTER CLOSE E"/* 10CCA */, /*33615*/"OLD HUNGARIAN SMALL LETTER EE"/* 10CCB */,/*33616*/"OLD HUNGARIAN SMALL LETTER EF"/* 10CCC */, /*33617*/"OLD HUNGARIAN SMALL LETTER EG"/* 10CCD */,/*33618*/"OLD HUNGARIAN SMALL LETTER EGY"/* 10CCE */, /*33619*/"OLD HUNGARIAN SMALL LETTER EH"/* 10CCF */,/*33620*/"OLD HUNGARIAN SMALL LETTER I"/* 10CD0 */, /*33621*/"OLD HUNGARIAN SMALL LETTER II"/* 10CD1 */,/*33622*/"OLD HUNGARIAN SMALL LETTER EJ"/* 10CD2 */, /*33623*/"OLD HUNGARIAN SMALL LETTER EK"/* 10CD3 */,/*33624*/"OLD HUNGARIAN SMALL LETTER AK"/* 10CD4 */, /*33625*/"OLD HUNGARIAN SMALL LETTER UNK"/* 10CD5 */,/*33626*/"OLD HUNGARIAN SMALL LETTER EL"/* 10CD6 */, /*33627*/"OLD HUNGARIAN SMALL LETTER ELY"/* 10CD7 */,/*33628*/"OLD HUNGARIAN SMALL LETTER EM"/* 10CD8 */, /*33629*/"OLD HUNGARIAN SMALL LETTER EN"/* 10CD9 */,/*33630*/"OLD HUNGARIAN SMALL LETTER ENY"/* 10CDA */, /*33631*/"OLD HUNGARIAN SMALL LETTER O"/* 10CDB */,/*33632*/"OLD HUNGARIAN SMALL LETTER OO"/* 10CDC */, /*33633*/"OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE"/* 10CDD */, /*33634*/"OLD HUNGARIAN SMALL LETTER RUDIMENTA OE"/* 10CDE */,/*33635*/"OLD HUNGARIAN SMALL LETTER OEE"/* 10CDF */, /*33636*/"OLD HUNGARIAN SMALL LETTER EP"/* 10CE0 */,/*33637*/"OLD HUNGARIAN SMALL LETTER EMP"/* 10CE1 */, /*33638*/"OLD HUNGARIAN SMALL LETTER ER"/* 10CE2 */,/*33639*/"OLD HUNGARIAN SMALL LETTER SHORT ER"/* 10CE3 */, /*33640*/"OLD HUNGARIAN SMALL LETTER ES"/* 10CE4 */,/*33641*/"OLD HUNGARIAN SMALL LETTER ESZ"/* 10CE5 */, /*33642*/"OLD HUNGARIAN SMALL LETTER ET"/* 10CE6 */,/*33643*/"OLD HUNGARIAN SMALL LETTER ENT"/* 10CE7 */, /*33644*/"OLD HUNGARIAN SMALL LETTER ETY"/* 10CE8 */,/*33645*/"OLD HUNGARIAN SMALL LETTER ECH"/* 10CE9 */, /*33646*/"OLD HUNGARIAN SMALL LETTER U"/* 10CEA */,/*33647*/"OLD HUNGARIAN SMALL LETTER UU"/* 10CEB */, /*33648*/"OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE"/* 10CEC */, /*33649*/"OLD HUNGARIAN SMALL LETTER RUDIMENTA UE"/* 10CED */,/*33650*/"OLD HUNGARIAN SMALL LETTER EV"/* 10CEE */, /*33651*/"OLD HUNGARIAN SMALL LETTER EZ"/* 10CEF */,/*33652*/"OLD HUNGARIAN SMALL LETTER EZS"/* 10CF0 */, /*33653*/"OLD HUNGARIAN SMALL LETTER ENT-SHAPED SIGN"/* 10CF1 */,/*33654*/"OLD HUNGARIAN SMALL LETTER US"/* 10CF2 */, NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*33662*/"OLD HUNGARIAN NUMBER ONE"/* 10CFA */, /*33663*/"OLD HUNGARIAN NUMBER FIVE"/* 10CFB */,/*33664*/"OLD HUNGARIAN NUMBER TEN"/* 10CFC */, /*33665*/"OLD HUNGARIAN NUMBER FIFTY"/* 10CFD */,/*33666*/"OLD HUNGARIAN NUMBER ONE HUNDRED"/* 10CFE */, /*33667*/"OLD HUNGARIAN NUMBER ONE THOUSAND"/* 10CFF */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,/*34020*/"RUMI DIGIT ONE"/* 10E60 */,/*34021*/"RUMI DIGIT TWO"/* 10E61 */, /*34022*/"RUMI DIGIT THREE"/* 10E62 */,/*34023*/"RUMI DIGIT FOUR"/* 10E63 */,/*34024*/"RUMI DIGIT FIVE"/* 10E64 */, /*34025*/"RUMI DIGIT SIX"/* 10E65 */,/*34026*/"RUMI DIGIT SEVEN"/* 10E66 */,/*34027*/"RUMI DIGIT EIGHT"/* 10E67 */, /*34028*/"RUMI DIGIT NINE"/* 10E68 */,/*34029*/"RUMI NUMBER TEN"/* 10E69 */,/*34030*/"RUMI NUMBER TWENTY"/* 10E6A */, /*34031*/"RUMI NUMBER THIRTY"/* 10E6B */,/*34032*/"RUMI NUMBER FORTY"/* 10E6C */,/*34033*/"RUMI NUMBER FIFTY"/* 10E6D */, /*34034*/"RUMI NUMBER SIXTY"/* 10E6E */,/*34035*/"RUMI NUMBER SEVENTY"/* 10E6F */, /*34036*/"RUMI NUMBER EIGHTY"/* 10E70 */,/*34037*/"RUMI NUMBER NINETY"/* 10E71 */, /*34038*/"RUMI NUMBER ONE HUNDRED"/* 10E72 */,/*34039*/"RUMI NUMBER TWO HUNDRED"/* 10E73 */, /*34040*/"RUMI NUMBER THREE HUNDRED"/* 10E74 */,/*34041*/"RUMI NUMBER FOUR HUNDRED"/* 10E75 */, /*34042*/"RUMI NUMBER FIVE HUNDRED"/* 10E76 */,/*34043*/"RUMI NUMBER SIX HUNDRED"/* 10E77 */, /*34044*/"RUMI NUMBER SEVEN HUNDRED"/* 10E78 */,/*34045*/"RUMI NUMBER EIGHT HUNDRED"/* 10E79 */, /*34046*/"RUMI NUMBER NINE HUNDRED"/* 10E7A */,/*34047*/"RUMI FRACTION ONE HALF"/* 10E7B */, /*34048*/"RUMI FRACTION ONE QUARTER"/* 10E7C */,/*34049*/"RUMI FRACTION ONE THIRD"/* 10E7D */, /*34050*/"RUMI FRACTION TWO THIRDS"/* 10E7E */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*34436*/"BRAHMI SIGN CANDRABINDU"/* 11000 */, /*34437*/"BRAHMI SIGN ANUSVARA"/* 11001 */,/*34438*/"BRAHMI SIGN VISARGA"/* 11002 */, /*34439*/"BRAHMI SIGN JIHVAMULIYA"/* 11003 */,/*34440*/"BRAHMI SIGN UPADHMANIYA"/* 11004 */, /*34441*/"BRAHMI LETTER A"/* 11005 */,/*34442*/"BRAHMI LETTER AA"/* 11006 */,/*34443*/"BRAHMI LETTER I"/* 11007 */, /*34444*/"BRAHMI LETTER II"/* 11008 */,/*34445*/"BRAHMI LETTER U"/* 11009 */,/*34446*/"BRAHMI LETTER UU"/* 1100A */, /*34447*/"BRAHMI LETTER VOCALIC R"/* 1100B */,/*34448*/"BRAHMI LETTER VOCALIC RR"/* 1100C */, /*34449*/"BRAHMI LETTER VOCALIC L"/* 1100D */,/*34450*/"BRAHMI LETTER VOCALIC LL"/* 1100E */, /*34451*/"BRAHMI LETTER E"/* 1100F */,/*34452*/"BRAHMI LETTER AI"/* 11010 */,/*34453*/"BRAHMI LETTER O"/* 11011 */, /*34454*/"BRAHMI LETTER AU"/* 11012 */,/*34455*/"BRAHMI LETTER KA"/* 11013 */,/*34456*/"BRAHMI LETTER KHA"/* 11014 */, /*34457*/"BRAHMI LETTER GA"/* 11015 */,/*34458*/"BRAHMI LETTER GHA"/* 11016 */,/*34459*/"BRAHMI LETTER NGA"/* 11017 */, /*34460*/"BRAHMI LETTER CA"/* 11018 */,/*34461*/"BRAHMI LETTER CHA"/* 11019 */,/*34462*/"BRAHMI LETTER JA"/* 1101A */, /*34463*/"BRAHMI LETTER JHA"/* 1101B */,/*34464*/"BRAHMI LETTER NYA"/* 1101C */,/*34465*/"BRAHMI LETTER TTA"/* 1101D */, /*34466*/"BRAHMI LETTER TTHA"/* 1101E */,/*34467*/"BRAHMI LETTER DDA"/* 1101F */, /*34468*/"BRAHMI LETTER DDHA"/* 11020 */,/*34469*/"BRAHMI LETTER NNA"/* 11021 */,/*34470*/"BRAHMI LETTER TA"/* 11022 */, /*34471*/"BRAHMI LETTER THA"/* 11023 */,/*34472*/"BRAHMI LETTER DA"/* 11024 */,/*34473*/"BRAHMI LETTER DHA"/* 11025 */, /*34474*/"BRAHMI LETTER NA"/* 11026 */,/*34475*/"BRAHMI LETTER PA"/* 11027 */,/*34476*/"BRAHMI LETTER PHA"/* 11028 */, /*34477*/"BRAHMI LETTER BA"/* 11029 */,/*34478*/"BRAHMI LETTER BHA"/* 1102A */,/*34479*/"BRAHMI LETTER MA"/* 1102B */, /*34480*/"BRAHMI LETTER YA"/* 1102C */,/*34481*/"BRAHMI LETTER RA"/* 1102D */,/*34482*/"BRAHMI LETTER LA"/* 1102E */, /*34483*/"BRAHMI LETTER VA"/* 1102F */,/*34484*/"BRAHMI LETTER SHA"/* 11030 */,/*34485*/"BRAHMI LETTER SSA"/* 11031 */, /*34486*/"BRAHMI LETTER SA"/* 11032 */,/*34487*/"BRAHMI LETTER HA"/* 11033 */,/*34488*/"BRAHMI LETTER LLA"/* 11034 */, /*34489*/"BRAHMI LETTER OLD TAMIL LLLA"/* 11035 */,/*34490*/"BRAHMI LETTER OLD TAMIL RRA"/* 11036 */, /*34491*/"BRAHMI LETTER OLD TAMIL NNNA"/* 11037 */,/*34492*/"BRAHMI VOWEL SIGN AA"/* 11038 */, /*34493*/"BRAHMI VOWEL SIGN BHATTIPROLU AA"/* 11039 */,/*34494*/"BRAHMI VOWEL SIGN I"/* 1103A */, /*34495*/"BRAHMI VOWEL SIGN II"/* 1103B */,/*34496*/"BRAHMI VOWEL SIGN U"/* 1103C */, /*34497*/"BRAHMI VOWEL SIGN UU"/* 1103D */,/*34498*/"BRAHMI VOWEL SIGN VOCALIC R"/* 1103E */, /*34499*/"BRAHMI VOWEL SIGN VOCALIC RR"/* 1103F */,/*34500*/"BRAHMI VOWEL SIGN VOCALIC L"/* 11040 */, /*34501*/"BRAHMI VOWEL SIGN VOCALIC LL"/* 11041 */,/*34502*/"BRAHMI VOWEL SIGN E"/* 11042 */, /*34503*/"BRAHMI VOWEL SIGN AI"/* 11043 */,/*34504*/"BRAHMI VOWEL SIGN O"/* 11044 */, /*34505*/"BRAHMI VOWEL SIGN AU"/* 11045 */,/*34506*/"BRAHMI VIRAMA"/* 11046 */,/*34507*/"BRAHMI DANDA"/* 11047 */, /*34508*/"BRAHMI DOUBLE DANDA"/* 11048 */,/*34509*/"BRAHMI PUNCTUATION DOT"/* 11049 */, /*34510*/"BRAHMI PUNCTUATION DOUBLE DOT"/* 1104A */,/*34511*/"BRAHMI PUNCTUATION LINE"/* 1104B */, /*34512*/"BRAHMI PUNCTUATION CRESCENT BAR"/* 1104C */,/*34513*/"BRAHMI PUNCTUATION LOTUS"/* 1104D */,NULL,NULL,NULL,NULL, /*34518*/"BRAHMI NUMBER ONE"/* 11052 */,/*34519*/"BRAHMI NUMBER TWO"/* 11053 */, /*34520*/"BRAHMI NUMBER THREE"/* 11054 */,/*34521*/"BRAHMI NUMBER FOUR"/* 11055 */, /*34522*/"BRAHMI NUMBER FIVE"/* 11056 */,/*34523*/"BRAHMI NUMBER SIX"/* 11057 */, /*34524*/"BRAHMI NUMBER SEVEN"/* 11058 */,/*34525*/"BRAHMI NUMBER EIGHT"/* 11059 */, /*34526*/"BRAHMI NUMBER NINE"/* 1105A */,/*34527*/"BRAHMI NUMBER TEN"/* 1105B */, /*34528*/"BRAHMI NUMBER TWENTY"/* 1105C */,/*34529*/"BRAHMI NUMBER THIRTY"/* 1105D */, /*34530*/"BRAHMI NUMBER FORTY"/* 1105E */,/*34531*/"BRAHMI NUMBER FIFTY"/* 1105F */, /*34532*/"BRAHMI NUMBER SIXTY"/* 11060 */,/*34533*/"BRAHMI NUMBER SEVENTY"/* 11061 */, /*34534*/"BRAHMI NUMBER EIGHTY"/* 11062 */,/*34535*/"BRAHMI NUMBER NINETY"/* 11063 */, /*34536*/"BRAHMI NUMBER ONE HUNDRED"/* 11064 */,/*34537*/"BRAHMI NUMBER ONE THOUSAND"/* 11065 */, /*34538*/"BRAHMI DIGIT ZERO"/* 11066 */,/*34539*/"BRAHMI DIGIT ONE"/* 11067 */,/*34540*/"BRAHMI DIGIT TWO"/* 11068 */, /*34541*/"BRAHMI DIGIT THREE"/* 11069 */,/*34542*/"BRAHMI DIGIT FOUR"/* 1106A */,/*34543*/"BRAHMI DIGIT FIVE"/* 1106B */, /*34544*/"BRAHMI DIGIT SIX"/* 1106C */,/*34545*/"BRAHMI DIGIT SEVEN"/* 1106D */,/*34546*/"BRAHMI DIGIT EIGHT"/* 1106E */, /*34547*/"BRAHMI DIGIT NINE"/* 1106F */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*34563*/"BRAHMI NUMBER JOINER"/* 1107F */,/*34564*/"KAITHI SIGN CANDRABINDU"/* 11080 */, /*34565*/"KAITHI SIGN ANUSVARA"/* 11081 */,/*34566*/"KAITHI SIGN VISARGA"/* 11082 */, /*34567*/"KAITHI LETTER A"/* 11083 */,/*34568*/"KAITHI LETTER AA"/* 11084 */,/*34569*/"KAITHI LETTER I"/* 11085 */, /*34570*/"KAITHI LETTER II"/* 11086 */,/*34571*/"KAITHI LETTER U"/* 11087 */,/*34572*/"KAITHI LETTER UU"/* 11088 */, /*34573*/"KAITHI LETTER E"/* 11089 */,/*34574*/"KAITHI LETTER AI"/* 1108A */,/*34575*/"KAITHI LETTER O"/* 1108B */, /*34576*/"KAITHI LETTER AU"/* 1108C */,/*34577*/"KAITHI LETTER KA"/* 1108D */,/*34578*/"KAITHI LETTER KHA"/* 1108E */, /*34579*/"KAITHI LETTER GA"/* 1108F */,/*34580*/"KAITHI LETTER GHA"/* 11090 */,/*34581*/"KAITHI LETTER NGA"/* 11091 */, /*34582*/"KAITHI LETTER CA"/* 11092 */,/*34583*/"KAITHI LETTER CHA"/* 11093 */,/*34584*/"KAITHI LETTER JA"/* 11094 */, /*34585*/"KAITHI LETTER JHA"/* 11095 */,/*34586*/"KAITHI LETTER NYA"/* 11096 */,/*34587*/"KAITHI LETTER TTA"/* 11097 */, /*34588*/"KAITHI LETTER TTHA"/* 11098 */,/*34589*/"KAITHI LETTER DDA"/* 11099 */, /*34590*/"KAITHI LETTER DDDHA"/* 1109A */,/*34591*/"KAITHI LETTER DDHA"/* 1109B */, /*34592*/"KAITHI LETTER RHA"/* 1109C */,/*34593*/"KAITHI LETTER NNA"/* 1109D */,/*34594*/"KAITHI LETTER TA"/* 1109E */, /*34595*/"KAITHI LETTER THA"/* 1109F */,/*34596*/"KAITHI LETTER DA"/* 110A0 */,/*34597*/"KAITHI LETTER DHA"/* 110A1 */, /*34598*/"KAITHI LETTER NA"/* 110A2 */,/*34599*/"KAITHI LETTER PA"/* 110A3 */,/*34600*/"KAITHI LETTER PHA"/* 110A4 */, /*34601*/"KAITHI LETTER BA"/* 110A5 */,/*34602*/"KAITHI LETTER BHA"/* 110A6 */,/*34603*/"KAITHI LETTER MA"/* 110A7 */, /*34604*/"KAITHI LETTER YA"/* 110A8 */,/*34605*/"KAITHI LETTER RA"/* 110A9 */,/*34606*/"KAITHI LETTER LA"/* 110AA */, /*34607*/"KAITHI LETTER VA"/* 110AB */,/*34608*/"KAITHI LETTER SHA"/* 110AC */,/*34609*/"KAITHI LETTER SSA"/* 110AD */, /*34610*/"KAITHI LETTER SA"/* 110AE */,/*34611*/"KAITHI LETTER HA"/* 110AF */,/*34612*/"KAITHI VOWEL SIGN AA"/* 110B0 */, /*34613*/"KAITHI VOWEL SIGN I"/* 110B1 */,/*34614*/"KAITHI VOWEL SIGN II"/* 110B2 */, /*34615*/"KAITHI VOWEL SIGN U"/* 110B3 */,/*34616*/"KAITHI VOWEL SIGN UU"/* 110B4 */, /*34617*/"KAITHI VOWEL SIGN E"/* 110B5 */,/*34618*/"KAITHI VOWEL SIGN AI"/* 110B6 */, /*34619*/"KAITHI VOWEL SIGN O"/* 110B7 */,/*34620*/"KAITHI VOWEL SIGN AU"/* 110B8 */, /*34621*/"KAITHI SIGN VIRAMA"/* 110B9 */,/*34622*/"KAITHI SIGN NUKTA"/* 110BA */, /*34623*/"KAITHI ABBREVIATION SIGN"/* 110BB */,/*34624*/"KAITHI ENUMERATION SIGN"/* 110BC */, /*34625*/"KAITHI NUMBER SIGN"/* 110BD */,/*34626*/"KAITHI SECTION MARK"/* 110BE */, /*34627*/"KAITHI DOUBLE SECTION MARK"/* 110BF */,/*34628*/"KAITHI DANDA"/* 110C0 */, /*34629*/"KAITHI DOUBLE DANDA"/* 110C1 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*34644*/"SORA SOMPENG LETTER SAH"/* 110D0 */,/*34645*/"SORA SOMPENG LETTER TAH"/* 110D1 */, /*34646*/"SORA SOMPENG LETTER BAH"/* 110D2 */,/*34647*/"SORA SOMPENG LETTER CAH"/* 110D3 */, /*34648*/"SORA SOMPENG LETTER DAH"/* 110D4 */,/*34649*/"SORA SOMPENG LETTER GAH"/* 110D5 */, /*34650*/"SORA SOMPENG LETTER MAH"/* 110D6 */,/*34651*/"SORA SOMPENG LETTER NGAH"/* 110D7 */, /*34652*/"SORA SOMPENG LETTER LAH"/* 110D8 */,/*34653*/"SORA SOMPENG LETTER NAH"/* 110D9 */, /*34654*/"SORA SOMPENG LETTER VAH"/* 110DA */,/*34655*/"SORA SOMPENG LETTER PAH"/* 110DB */, /*34656*/"SORA SOMPENG LETTER YAH"/* 110DC */,/*34657*/"SORA SOMPENG LETTER RAH"/* 110DD */, /*34658*/"SORA SOMPENG LETTER HAH"/* 110DE */,/*34659*/"SORA SOMPENG LETTER KAH"/* 110DF */, /*34660*/"SORA SOMPENG LETTER JAH"/* 110E0 */,/*34661*/"SORA SOMPENG LETTER NYAH"/* 110E1 */, /*34662*/"SORA SOMPENG LETTER AH"/* 110E2 */,/*34663*/"SORA SOMPENG LETTER EEH"/* 110E3 */, /*34664*/"SORA SOMPENG LETTER IH"/* 110E4 */,/*34665*/"SORA SOMPENG LETTER UH"/* 110E5 */, /*34666*/"SORA SOMPENG LETTER OH"/* 110E6 */,/*34667*/"SORA SOMPENG LETTER EH"/* 110E7 */, /*34668*/"SORA SOMPENG LETTER MAE"/* 110E8 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*34676*/"SORA SOMPENG DIGIT ZERO"/* 110F0 */,/*34677*/"SORA SOMPENG DIGIT ONE"/* 110F1 */, /*34678*/"SORA SOMPENG DIGIT TWO"/* 110F2 */,/*34679*/"SORA SOMPENG DIGIT THREE"/* 110F3 */, /*34680*/"SORA SOMPENG DIGIT FOUR"/* 110F4 */,/*34681*/"SORA SOMPENG DIGIT FIVE"/* 110F5 */, /*34682*/"SORA SOMPENG DIGIT SIX"/* 110F6 */,/*34683*/"SORA SOMPENG DIGIT SEVEN"/* 110F7 */, /*34684*/"SORA SOMPENG DIGIT EIGHT"/* 110F8 */,/*34685*/"SORA SOMPENG DIGIT NINE"/* 110F9 */,NULL,NULL,NULL,NULL,NULL, NULL,/*34692*/"CHAKMA SIGN CANDRABINDU"/* 11100 */,/*34693*/"CHAKMA SIGN ANUSVARA"/* 11101 */, /*34694*/"CHAKMA SIGN VISARGA"/* 11102 */,/*34695*/"CHAKMA LETTER AA"/* 11103 */,/*34696*/"CHAKMA LETTER I"/* 11104 */, /*34697*/"CHAKMA LETTER U"/* 11105 */,/*34698*/"CHAKMA LETTER E"/* 11106 */,/*34699*/"CHAKMA LETTER KAA"/* 11107 */, /*34700*/"CHAKMA LETTER KHAA"/* 11108 */,/*34701*/"CHAKMA LETTER GAA"/* 11109 */, /*34702*/"CHAKMA LETTER GHAA"/* 1110A */,/*34703*/"CHAKMA LETTER NGAA"/* 1110B */, /*34704*/"CHAKMA LETTER CAA"/* 1110C */,/*34705*/"CHAKMA LETTER CHAA"/* 1110D */,/*34706*/"CHAKMA LETTER JAA"/* 1110E */, /*34707*/"CHAKMA LETTER JHAA"/* 1110F */,/*34708*/"CHAKMA LETTER NYAA"/* 11110 */, /*34709*/"CHAKMA LETTER TTAA"/* 11111 */,/*34710*/"CHAKMA LETTER TTHAA"/* 11112 */, /*34711*/"CHAKMA LETTER DDAA"/* 11113 */,/*34712*/"CHAKMA LETTER DDHAA"/* 11114 */, /*34713*/"CHAKMA LETTER NNAA"/* 11115 */,/*34714*/"CHAKMA LETTER TAA"/* 11116 */, /*34715*/"CHAKMA LETTER THAA"/* 11117 */,/*34716*/"CHAKMA LETTER DAA"/* 11118 */, /*34717*/"CHAKMA LETTER DHAA"/* 11119 */,/*34718*/"CHAKMA LETTER NAA"/* 1111A */,/*34719*/"CHAKMA LETTER PAA"/* 1111B */, /*34720*/"CHAKMA LETTER PHAA"/* 1111C */,/*34721*/"CHAKMA LETTER BAA"/* 1111D */, /*34722*/"CHAKMA LETTER BHAA"/* 1111E */,/*34723*/"CHAKMA LETTER MAA"/* 1111F */, /*34724*/"CHAKMA LETTER YYAA"/* 11120 */,/*34725*/"CHAKMA LETTER YAA"/* 11121 */,/*34726*/"CHAKMA LETTER RAA"/* 11122 */, /*34727*/"CHAKMA LETTER LAA"/* 11123 */,/*34728*/"CHAKMA LETTER WAA"/* 11124 */,/*34729*/"CHAKMA LETTER SAA"/* 11125 */, /*34730*/"CHAKMA LETTER HAA"/* 11126 */,/*34731*/"CHAKMA VOWEL SIGN A"/* 11127 */, /*34732*/"CHAKMA VOWEL SIGN I"/* 11128 */,/*34733*/"CHAKMA VOWEL SIGN II"/* 11129 */, /*34734*/"CHAKMA VOWEL SIGN U"/* 1112A */,/*34735*/"CHAKMA VOWEL SIGN UU"/* 1112B */, /*34736*/"CHAKMA VOWEL SIGN E"/* 1112C */,/*34737*/"CHAKMA VOWEL SIGN AI"/* 1112D */, /*34738*/"CHAKMA VOWEL SIGN O"/* 1112E */,/*34739*/"CHAKMA VOWEL SIGN AU"/* 1112F */, /*34740*/"CHAKMA VOWEL SIGN OI"/* 11130 */,/*34741*/"CHAKMA O MARK"/* 11131 */,/*34742*/"CHAKMA AU MARK"/* 11132 */, /*34743*/"CHAKMA VIRAMA"/* 11133 */,/*34744*/"CHAKMA MAAYYAA"/* 11134 */,NULL,/*34746*/"CHAKMA DIGIT ZERO"/* 11136 */, /*34747*/"CHAKMA DIGIT ONE"/* 11137 */,/*34748*/"CHAKMA DIGIT TWO"/* 11138 */,/*34749*/"CHAKMA DIGIT THREE"/* 11139 */, /*34750*/"CHAKMA DIGIT FOUR"/* 1113A */,/*34751*/"CHAKMA DIGIT FIVE"/* 1113B */,/*34752*/"CHAKMA DIGIT SIX"/* 1113C */, /*34753*/"CHAKMA DIGIT SEVEN"/* 1113D */,/*34754*/"CHAKMA DIGIT EIGHT"/* 1113E */, /*34755*/"CHAKMA DIGIT NINE"/* 1113F */,/*34756*/"CHAKMA SECTION MARK"/* 11140 */,/*34757*/"CHAKMA DANDA"/* 11141 */, /*34758*/"CHAKMA DOUBLE DANDA"/* 11142 */,/*34759*/"CHAKMA QUESTION MARK"/* 11143 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,/*34772*/"MAHAJANI LETTER A"/* 11150 */,/*34773*/"MAHAJANI LETTER I"/* 11151 */, /*34774*/"MAHAJANI LETTER U"/* 11152 */,/*34775*/"MAHAJANI LETTER E"/* 11153 */,/*34776*/"MAHAJANI LETTER O"/* 11154 */, /*34777*/"MAHAJANI LETTER KA"/* 11155 */,/*34778*/"MAHAJANI LETTER KHA"/* 11156 */, /*34779*/"MAHAJANI LETTER GA"/* 11157 */,/*34780*/"MAHAJANI LETTER GHA"/* 11158 */, /*34781*/"MAHAJANI LETTER CA"/* 11159 */,/*34782*/"MAHAJANI LETTER CHA"/* 1115A */, /*34783*/"MAHAJANI LETTER JA"/* 1115B */,/*34784*/"MAHAJANI LETTER JHA"/* 1115C */, /*34785*/"MAHAJANI LETTER NYA"/* 1115D */,/*34786*/"MAHAJANI LETTER TTA"/* 1115E */, /*34787*/"MAHAJANI LETTER TTHA"/* 1115F */,/*34788*/"MAHAJANI LETTER DDA"/* 11160 */, /*34789*/"MAHAJANI LETTER DDHA"/* 11161 */,/*34790*/"MAHAJANI LETTER NNA"/* 11162 */, /*34791*/"MAHAJANI LETTER TA"/* 11163 */,/*34792*/"MAHAJANI LETTER THA"/* 11164 */, /*34793*/"MAHAJANI LETTER DA"/* 11165 */,/*34794*/"MAHAJANI LETTER DHA"/* 11166 */, /*34795*/"MAHAJANI LETTER NA"/* 11167 */,/*34796*/"MAHAJANI LETTER PA"/* 11168 */, /*34797*/"MAHAJANI LETTER PHA"/* 11169 */,/*34798*/"MAHAJANI LETTER BA"/* 1116A */, /*34799*/"MAHAJANI LETTER BHA"/* 1116B */,/*34800*/"MAHAJANI LETTER MA"/* 1116C */, /*34801*/"MAHAJANI LETTER RA"/* 1116D */,/*34802*/"MAHAJANI LETTER LA"/* 1116E */, /*34803*/"MAHAJANI LETTER VA"/* 1116F */,/*34804*/"MAHAJANI LETTER SA"/* 11170 */, /*34805*/"MAHAJANI LETTER HA"/* 11171 */,/*34806*/"MAHAJANI LETTER RRA"/* 11172 */, /*34807*/"MAHAJANI SIGN NUKTA"/* 11173 */,/*34808*/"MAHAJANI ABBREVIATION SIGN"/* 11174 */, /*34809*/"MAHAJANI SECTION MARK"/* 11175 */,/*34810*/"MAHAJANI LIGATURE SHRI"/* 11176 */,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,/*34820*/"SHARADA SIGN CANDRABINDU"/* 11180 */,/*34821*/"SHARADA SIGN ANUSVARA"/* 11181 */, /*34822*/"SHARADA SIGN VISARGA"/* 11182 */,/*34823*/"SHARADA LETTER A"/* 11183 */, /*34824*/"SHARADA LETTER AA"/* 11184 */,/*34825*/"SHARADA LETTER I"/* 11185 */,/*34826*/"SHARADA LETTER II"/* 11186 */, /*34827*/"SHARADA LETTER U"/* 11187 */,/*34828*/"SHARADA LETTER UU"/* 11188 */, /*34829*/"SHARADA LETTER VOCALIC R"/* 11189 */,/*34830*/"SHARADA LETTER VOCALIC RR"/* 1118A */, /*34831*/"SHARADA LETTER VOCALIC L"/* 1118B */,/*34832*/"SHARADA LETTER VOCALIC LL"/* 1118C */, /*34833*/"SHARADA LETTER E"/* 1118D */,/*34834*/"SHARADA LETTER AI"/* 1118E */,/*34835*/"SHARADA LETTER O"/* 1118F */, /*34836*/"SHARADA LETTER AU"/* 11190 */,/*34837*/"SHARADA LETTER KA"/* 11191 */,/*34838*/"SHARADA LETTER KHA"/* 11192 */, /*34839*/"SHARADA LETTER GA"/* 11193 */,/*34840*/"SHARADA LETTER GHA"/* 11194 */, /*34841*/"SHARADA LETTER NGA"/* 11195 */,/*34842*/"SHARADA LETTER CA"/* 11196 */, /*34843*/"SHARADA LETTER CHA"/* 11197 */,/*34844*/"SHARADA LETTER JA"/* 11198 */, /*34845*/"SHARADA LETTER JHA"/* 11199 */,/*34846*/"SHARADA LETTER NYA"/* 1119A */, /*34847*/"SHARADA LETTER TTA"/* 1119B */,/*34848*/"SHARADA LETTER TTHA"/* 1119C */, /*34849*/"SHARADA LETTER DDA"/* 1119D */,/*34850*/"SHARADA LETTER DDHA"/* 1119E */, /*34851*/"SHARADA LETTER NNA"/* 1119F */,/*34852*/"SHARADA LETTER TA"/* 111A0 */, /*34853*/"SHARADA LETTER THA"/* 111A1 */,/*34854*/"SHARADA LETTER DA"/* 111A2 */, /*34855*/"SHARADA LETTER DHA"/* 111A3 */,/*34856*/"SHARADA LETTER NA"/* 111A4 */,/*34857*/"SHARADA LETTER PA"/* 111A5 */, /*34858*/"SHARADA LETTER PHA"/* 111A6 */,/*34859*/"SHARADA LETTER BA"/* 111A7 */, /*34860*/"SHARADA LETTER BHA"/* 111A8 */,/*34861*/"SHARADA LETTER MA"/* 111A9 */,/*34862*/"SHARADA LETTER YA"/* 111AA */, /*34863*/"SHARADA LETTER RA"/* 111AB */,/*34864*/"SHARADA LETTER LA"/* 111AC */,/*34865*/"SHARADA LETTER LLA"/* 111AD */, /*34866*/"SHARADA LETTER VA"/* 111AE */,/*34867*/"SHARADA LETTER SHA"/* 111AF */, /*34868*/"SHARADA LETTER SSA"/* 111B0 */,/*34869*/"SHARADA LETTER SA"/* 111B1 */,/*34870*/"SHARADA LETTER HA"/* 111B2 */, /*34871*/"SHARADA VOWEL SIGN AA"/* 111B3 */,/*34872*/"SHARADA VOWEL SIGN I"/* 111B4 */, /*34873*/"SHARADA VOWEL SIGN II"/* 111B5 */,/*34874*/"SHARADA VOWEL SIGN U"/* 111B6 */, /*34875*/"SHARADA VOWEL SIGN UU"/* 111B7 */,/*34876*/"SHARADA VOWEL SIGN VOCALIC R"/* 111B8 */, /*34877*/"SHARADA VOWEL SIGN VOCALIC RR"/* 111B9 */,/*34878*/"SHARADA VOWEL SIGN VOCALIC L"/* 111BA */, /*34879*/"SHARADA VOWEL SIGN VOCALIC LL"/* 111BB */,/*34880*/"SHARADA VOWEL SIGN E"/* 111BC */, /*34881*/"SHARADA VOWEL SIGN AI"/* 111BD */,/*34882*/"SHARADA VOWEL SIGN O"/* 111BE */, /*34883*/"SHARADA VOWEL SIGN AU"/* 111BF */,/*34884*/"SHARADA SIGN VIRAMA"/* 111C0 */, /*34885*/"SHARADA SIGN AVAGRAHA"/* 111C1 */,/*34886*/"SHARADA SIGN JIHVAMULIYA"/* 111C2 */, /*34887*/"SHARADA SIGN UPADHMANIYA"/* 111C3 */,/*34888*/"SHARADA OM"/* 111C4 */,/*34889*/"SHARADA DANDA"/* 111C5 */, /*34890*/"SHARADA DOUBLE DANDA"/* 111C6 */,/*34891*/"SHARADA ABBREVIATION SIGN"/* 111C7 */, /*34892*/"SHARADA SEPARATOR"/* 111C8 */,/*34893*/"SHARADA SANDHI MARK"/* 111C9 */, /*34894*/"SHARADA SIGN NUKTA"/* 111CA */,/*34895*/"SHARADA VOWEL MODIFIER MARK"/* 111CB */, /*34896*/"SHARADA EXTRA SHORT VOWEL MARK"/* 111CC */,/*34897*/"SHARADA SUTRA MARK"/* 111CD */,NULL,NULL, /*34900*/"SHARADA DIGIT ZERO"/* 111D0 */,/*34901*/"SHARADA DIGIT ONE"/* 111D1 */,/*34902*/"SHARADA DIGIT TWO"/* 111D2 */, /*34903*/"SHARADA DIGIT THREE"/* 111D3 */,/*34904*/"SHARADA DIGIT FOUR"/* 111D4 */, /*34905*/"SHARADA DIGIT FIVE"/* 111D5 */,/*34906*/"SHARADA DIGIT SIX"/* 111D6 */, /*34907*/"SHARADA DIGIT SEVEN"/* 111D7 */,/*34908*/"SHARADA DIGIT EIGHT"/* 111D8 */, /*34909*/"SHARADA DIGIT NINE"/* 111D9 */,/*34910*/"SHARADA EKAM"/* 111DA */,/*34911*/"SHARADA SIGN SIDDHAM"/* 111DB */, /*34912*/"SHARADA HEADSTROKE"/* 111DC */,/*34913*/"SHARADA CONTINUATION SIGN"/* 111DD */, /*34914*/"SHARADA SECTION MARK-1"/* 111DE */,/*34915*/"SHARADA SECTION MARK-2"/* 111DF */,NULL, /*34917*/"SINHALA ARCHAIC DIGIT ONE"/* 111E1 */,/*34918*/"SINHALA ARCHAIC DIGIT TWO"/* 111E2 */, /*34919*/"SINHALA ARCHAIC DIGIT THREE"/* 111E3 */,/*34920*/"SINHALA ARCHAIC DIGIT FOUR"/* 111E4 */, /*34921*/"SINHALA ARCHAIC DIGIT FIVE"/* 111E5 */,/*34922*/"SINHALA ARCHAIC DIGIT SIX"/* 111E6 */, /*34923*/"SINHALA ARCHAIC DIGIT SEVEN"/* 111E7 */,/*34924*/"SINHALA ARCHAIC DIGIT EIGHT"/* 111E8 */, /*34925*/"SINHALA ARCHAIC DIGIT NINE"/* 111E9 */,/*34926*/"SINHALA ARCHAIC NUMBER TEN"/* 111EA */, /*34927*/"SINHALA ARCHAIC NUMBER TWENTY"/* 111EB */,/*34928*/"SINHALA ARCHAIC NUMBER THIRTY"/* 111EC */, /*34929*/"SINHALA ARCHAIC NUMBER FORTY"/* 111ED */,/*34930*/"SINHALA ARCHAIC NUMBER FIFTY"/* 111EE */, /*34931*/"SINHALA ARCHAIC NUMBER SIXTY"/* 111EF */,/*34932*/"SINHALA ARCHAIC NUMBER SEVENTY"/* 111F0 */, /*34933*/"SINHALA ARCHAIC NUMBER EIGHTY"/* 111F1 */,/*34934*/"SINHALA ARCHAIC NUMBER NINETY"/* 111F2 */, /*34935*/"SINHALA ARCHAIC NUMBER ONE HUNDRED"/* 111F3 */,/*34936*/"SINHALA ARCHAIC NUMBER ONE THOUSAND"/* 111F4 */,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*34948*/"KHOJKI LETTER A"/* 11200 */, /*34949*/"KHOJKI LETTER AA"/* 11201 */,/*34950*/"KHOJKI LETTER I"/* 11202 */,/*34951*/"KHOJKI LETTER U"/* 11203 */, /*34952*/"KHOJKI LETTER E"/* 11204 */,/*34953*/"KHOJKI LETTER AI"/* 11205 */,/*34954*/"KHOJKI LETTER O"/* 11206 */, /*34955*/"KHOJKI LETTER AU"/* 11207 */,/*34956*/"KHOJKI LETTER KA"/* 11208 */,/*34957*/"KHOJKI LETTER KHA"/* 11209 */, /*34958*/"KHOJKI LETTER GA"/* 1120A */,/*34959*/"KHOJKI LETTER GGA"/* 1120B */,/*34960*/"KHOJKI LETTER GHA"/* 1120C */, /*34961*/"KHOJKI LETTER NGA"/* 1120D */,/*34962*/"KHOJKI LETTER CA"/* 1120E */,/*34963*/"KHOJKI LETTER CHA"/* 1120F */, /*34964*/"KHOJKI LETTER JA"/* 11210 */,/*34965*/"KHOJKI LETTER JJA"/* 11211 */,NULL, /*34967*/"KHOJKI LETTER NYA"/* 11213 */,/*34968*/"KHOJKI LETTER TTA"/* 11214 */,/*34969*/"KHOJKI LETTER TTHA"/* 11215 */, /*34970*/"KHOJKI LETTER DDA"/* 11216 */,/*34971*/"KHOJKI LETTER DDHA"/* 11217 */,/*34972*/"KHOJKI LETTER NNA"/* 11218 */, /*34973*/"KHOJKI LETTER TA"/* 11219 */,/*34974*/"KHOJKI LETTER THA"/* 1121A */,/*34975*/"KHOJKI LETTER DA"/* 1121B */, /*34976*/"KHOJKI LETTER DDDA"/* 1121C */,/*34977*/"KHOJKI LETTER DHA"/* 1121D */,/*34978*/"KHOJKI LETTER NA"/* 1121E */, /*34979*/"KHOJKI LETTER PA"/* 1121F */,/*34980*/"KHOJKI LETTER PHA"/* 11220 */,/*34981*/"KHOJKI LETTER BA"/* 11221 */, /*34982*/"KHOJKI LETTER BBA"/* 11222 */,/*34983*/"KHOJKI LETTER BHA"/* 11223 */,/*34984*/"KHOJKI LETTER MA"/* 11224 */, /*34985*/"KHOJKI LETTER YA"/* 11225 */,/*34986*/"KHOJKI LETTER RA"/* 11226 */,/*34987*/"KHOJKI LETTER LA"/* 11227 */, /*34988*/"KHOJKI LETTER VA"/* 11228 */,/*34989*/"KHOJKI LETTER SA"/* 11229 */,/*34990*/"KHOJKI LETTER HA"/* 1122A */, /*34991*/"KHOJKI LETTER LLA"/* 1122B */,/*34992*/"KHOJKI VOWEL SIGN AA"/* 1122C */, /*34993*/"KHOJKI VOWEL SIGN I"/* 1122D */,/*34994*/"KHOJKI VOWEL SIGN II"/* 1122E */, /*34995*/"KHOJKI VOWEL SIGN U"/* 1122F */,/*34996*/"KHOJKI VOWEL SIGN E"/* 11230 */, /*34997*/"KHOJKI VOWEL SIGN AI"/* 11231 */,/*34998*/"KHOJKI VOWEL SIGN O"/* 11232 */, /*34999*/"KHOJKI VOWEL SIGN AU"/* 11233 */,/*35000*/"KHOJKI SIGN ANUSVARA"/* 11234 */, /*35001*/"KHOJKI SIGN VIRAMA"/* 11235 */,/*35002*/"KHOJKI SIGN NUKTA"/* 11236 */, /*35003*/"KHOJKI SIGN SHADDA"/* 11237 */,/*35004*/"KHOJKI DANDA"/* 11238 */,/*35005*/"KHOJKI DOUBLE DANDA"/* 11239 */, /*35006*/"KHOJKI WORD SEPARATOR"/* 1123A */,/*35007*/"KHOJKI SECTION MARK"/* 1123B */, /*35008*/"KHOJKI DOUBLE SECTION MARK"/* 1123C */,/*35009*/"KHOJKI ABBREVIATION SIGN"/* 1123D */, /*35010*/"KHOJKI SIGN SUKUN"/* 1123E */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,/*35076*/"MULTANI LETTER A"/* 11280 */,/*35077*/"MULTANI LETTER I"/* 11281 */, /*35078*/"MULTANI LETTER U"/* 11282 */,/*35079*/"MULTANI LETTER E"/* 11283 */,/*35080*/"MULTANI LETTER KA"/* 11284 */, /*35081*/"MULTANI LETTER KHA"/* 11285 */,/*35082*/"MULTANI LETTER GA"/* 11286 */,NULL, /*35084*/"MULTANI LETTER GHA"/* 11288 */,NULL,/*35086*/"MULTANI LETTER CA"/* 1128A */, /*35087*/"MULTANI LETTER CHA"/* 1128B */,/*35088*/"MULTANI LETTER JA"/* 1128C */, /*35089*/"MULTANI LETTER JJA"/* 1128D */,NULL,/*35091*/"MULTANI LETTER NYA"/* 1128F */, /*35092*/"MULTANI LETTER TTA"/* 11290 */,/*35093*/"MULTANI LETTER TTHA"/* 11291 */, /*35094*/"MULTANI LETTER DDA"/* 11292 */,/*35095*/"MULTANI LETTER DDDA"/* 11293 */, /*35096*/"MULTANI LETTER DDHA"/* 11294 */,/*35097*/"MULTANI LETTER NNA"/* 11295 */, /*35098*/"MULTANI LETTER TA"/* 11296 */,/*35099*/"MULTANI LETTER THA"/* 11297 */,/*35100*/"MULTANI LETTER DA"/* 11298 */, /*35101*/"MULTANI LETTER DHA"/* 11299 */,/*35102*/"MULTANI LETTER NA"/* 1129A */,/*35103*/"MULTANI LETTER PA"/* 1129B */, /*35104*/"MULTANI LETTER PHA"/* 1129C */,/*35105*/"MULTANI LETTER BA"/* 1129D */,NULL, /*35107*/"MULTANI LETTER BHA"/* 1129F */,/*35108*/"MULTANI LETTER MA"/* 112A0 */,/*35109*/"MULTANI LETTER YA"/* 112A1 */, /*35110*/"MULTANI LETTER RA"/* 112A2 */,/*35111*/"MULTANI LETTER LA"/* 112A3 */,/*35112*/"MULTANI LETTER VA"/* 112A4 */, /*35113*/"MULTANI LETTER SA"/* 112A5 */,/*35114*/"MULTANI LETTER HA"/* 112A6 */,/*35115*/"MULTANI LETTER RRA"/* 112A7 */, /*35116*/"MULTANI LETTER RHA"/* 112A8 */,/*35117*/"MULTANI SECTION MARK"/* 112A9 */,NULL,NULL,NULL,NULL,NULL,NULL, /*35124*/"KHUDAWADI LETTER A"/* 112B0 */,/*35125*/"KHUDAWADI LETTER AA"/* 112B1 */, /*35126*/"KHUDAWADI LETTER I"/* 112B2 */,/*35127*/"KHUDAWADI LETTER II"/* 112B3 */, /*35128*/"KHUDAWADI LETTER U"/* 112B4 */,/*35129*/"KHUDAWADI LETTER UU"/* 112B5 */, /*35130*/"KHUDAWADI LETTER E"/* 112B6 */,/*35131*/"KHUDAWADI LETTER AI"/* 112B7 */, /*35132*/"KHUDAWADI LETTER O"/* 112B8 */,/*35133*/"KHUDAWADI LETTER AU"/* 112B9 */, /*35134*/"KHUDAWADI LETTER KA"/* 112BA */,/*35135*/"KHUDAWADI LETTER KHA"/* 112BB */, /*35136*/"KHUDAWADI LETTER GA"/* 112BC */,/*35137*/"KHUDAWADI LETTER GGA"/* 112BD */, /*35138*/"KHUDAWADI LETTER GHA"/* 112BE */,/*35139*/"KHUDAWADI LETTER NGA"/* 112BF */, /*35140*/"KHUDAWADI LETTER CA"/* 112C0 */,/*35141*/"KHUDAWADI LETTER CHA"/* 112C1 */, /*35142*/"KHUDAWADI LETTER JA"/* 112C2 */,/*35143*/"KHUDAWADI LETTER JJA"/* 112C3 */, /*35144*/"KHUDAWADI LETTER JHA"/* 112C4 */,/*35145*/"KHUDAWADI LETTER NYA"/* 112C5 */, /*35146*/"KHUDAWADI LETTER TTA"/* 112C6 */,/*35147*/"KHUDAWADI LETTER TTHA"/* 112C7 */, /*35148*/"KHUDAWADI LETTER DDA"/* 112C8 */,/*35149*/"KHUDAWADI LETTER DDDA"/* 112C9 */, /*35150*/"KHUDAWADI LETTER RRA"/* 112CA */,/*35151*/"KHUDAWADI LETTER DDHA"/* 112CB */, /*35152*/"KHUDAWADI LETTER NNA"/* 112CC */,/*35153*/"KHUDAWADI LETTER TA"/* 112CD */, /*35154*/"KHUDAWADI LETTER THA"/* 112CE */,/*35155*/"KHUDAWADI LETTER DA"/* 112CF */, /*35156*/"KHUDAWADI LETTER DHA"/* 112D0 */,/*35157*/"KHUDAWADI LETTER NA"/* 112D1 */, /*35158*/"KHUDAWADI LETTER PA"/* 112D2 */,/*35159*/"KHUDAWADI LETTER PHA"/* 112D3 */, /*35160*/"KHUDAWADI LETTER BA"/* 112D4 */,/*35161*/"KHUDAWADI LETTER BBA"/* 112D5 */, /*35162*/"KHUDAWADI LETTER BHA"/* 112D6 */,/*35163*/"KHUDAWADI LETTER MA"/* 112D7 */, /*35164*/"KHUDAWADI LETTER YA"/* 112D8 */,/*35165*/"KHUDAWADI LETTER RA"/* 112D9 */, /*35166*/"KHUDAWADI LETTER LA"/* 112DA */,/*35167*/"KHUDAWADI LETTER VA"/* 112DB */, /*35168*/"KHUDAWADI LETTER SHA"/* 112DC */,/*35169*/"KHUDAWADI LETTER SA"/* 112DD */, /*35170*/"KHUDAWADI LETTER HA"/* 112DE */,/*35171*/"KHUDAWADI SIGN ANUSVARA"/* 112DF */, /*35172*/"KHUDAWADI VOWEL SIGN AA"/* 112E0 */,/*35173*/"KHUDAWADI VOWEL SIGN I"/* 112E1 */, /*35174*/"KHUDAWADI VOWEL SIGN II"/* 112E2 */,/*35175*/"KHUDAWADI VOWEL SIGN U"/* 112E3 */, /*35176*/"KHUDAWADI VOWEL SIGN UU"/* 112E4 */,/*35177*/"KHUDAWADI VOWEL SIGN E"/* 112E5 */, /*35178*/"KHUDAWADI VOWEL SIGN AI"/* 112E6 */,/*35179*/"KHUDAWADI VOWEL SIGN O"/* 112E7 */, /*35180*/"KHUDAWADI VOWEL SIGN AU"/* 112E8 */,/*35181*/"KHUDAWADI SIGN NUKTA"/* 112E9 */, /*35182*/"KHUDAWADI SIGN VIRAMA"/* 112EA */,NULL,NULL,NULL,NULL,NULL,/*35188*/"KHUDAWADI DIGIT ZERO"/* 112F0 */, /*35189*/"KHUDAWADI DIGIT ONE"/* 112F1 */,/*35190*/"KHUDAWADI DIGIT TWO"/* 112F2 */, /*35191*/"KHUDAWADI DIGIT THREE"/* 112F3 */,/*35192*/"KHUDAWADI DIGIT FOUR"/* 112F4 */, /*35193*/"KHUDAWADI DIGIT FIVE"/* 112F5 */,/*35194*/"KHUDAWADI DIGIT SIX"/* 112F6 */, /*35195*/"KHUDAWADI DIGIT SEVEN"/* 112F7 */,/*35196*/"KHUDAWADI DIGIT EIGHT"/* 112F8 */, /*35197*/"KHUDAWADI DIGIT NINE"/* 112F9 */,NULL,NULL,NULL,NULL,NULL,NULL, /*35204*/"GRANTHA SIGN COMBINING ANUSVARA ABOVE"/* 11300 */,/*35205*/"GRANTHA SIGN CANDRABINDU"/* 11301 */, /*35206*/"GRANTHA SIGN ANUSVARA"/* 11302 */,/*35207*/"GRANTHA SIGN VISARGA"/* 11303 */,NULL, /*35209*/"GRANTHA LETTER A"/* 11305 */,/*35210*/"GRANTHA LETTER AA"/* 11306 */,/*35211*/"GRANTHA LETTER I"/* 11307 */, /*35212*/"GRANTHA LETTER II"/* 11308 */,/*35213*/"GRANTHA LETTER U"/* 11309 */,/*35214*/"GRANTHA LETTER UU"/* 1130A */, /*35215*/"GRANTHA LETTER VOCALIC R"/* 1130B */,/*35216*/"GRANTHA LETTER VOCALIC L"/* 1130C */,NULL,NULL, /*35219*/"GRANTHA LETTER EE"/* 1130F */,/*35220*/"GRANTHA LETTER AI"/* 11310 */,NULL,NULL, /*35223*/"GRANTHA LETTER OO"/* 11313 */,/*35224*/"GRANTHA LETTER AU"/* 11314 */,/*35225*/"GRANTHA LETTER KA"/* 11315 */, /*35226*/"GRANTHA LETTER KHA"/* 11316 */,/*35227*/"GRANTHA LETTER GA"/* 11317 */, /*35228*/"GRANTHA LETTER GHA"/* 11318 */,/*35229*/"GRANTHA LETTER NGA"/* 11319 */, /*35230*/"GRANTHA LETTER CA"/* 1131A */,/*35231*/"GRANTHA LETTER CHA"/* 1131B */,/*35232*/"GRANTHA LETTER JA"/* 1131C */, /*35233*/"GRANTHA LETTER JHA"/* 1131D */,/*35234*/"GRANTHA LETTER NYA"/* 1131E */, /*35235*/"GRANTHA LETTER TTA"/* 1131F */,/*35236*/"GRANTHA LETTER TTHA"/* 11320 */, /*35237*/"GRANTHA LETTER DDA"/* 11321 */,/*35238*/"GRANTHA LETTER DDHA"/* 11322 */, /*35239*/"GRANTHA LETTER NNA"/* 11323 */,/*35240*/"GRANTHA LETTER TA"/* 11324 */, /*35241*/"GRANTHA LETTER THA"/* 11325 */,/*35242*/"GRANTHA LETTER DA"/* 11326 */, /*35243*/"GRANTHA LETTER DHA"/* 11327 */,/*35244*/"GRANTHA LETTER NA"/* 11328 */,NULL, /*35246*/"GRANTHA LETTER PA"/* 1132A */,/*35247*/"GRANTHA LETTER PHA"/* 1132B */,/*35248*/"GRANTHA LETTER BA"/* 1132C */, /*35249*/"GRANTHA LETTER BHA"/* 1132D */,/*35250*/"GRANTHA LETTER MA"/* 1132E */,/*35251*/"GRANTHA LETTER YA"/* 1132F */, /*35252*/"GRANTHA LETTER RA"/* 11330 */,NULL,/*35254*/"GRANTHA LETTER LA"/* 11332 */, /*35255*/"GRANTHA LETTER LLA"/* 11333 */,NULL,/*35257*/"GRANTHA LETTER VA"/* 11335 */, /*35258*/"GRANTHA LETTER SHA"/* 11336 */,/*35259*/"GRANTHA LETTER SSA"/* 11337 */, /*35260*/"GRANTHA LETTER SA"/* 11338 */,/*35261*/"GRANTHA LETTER HA"/* 11339 */,NULL,NULL, /*35264*/"GRANTHA SIGN NUKTA"/* 1133C */,/*35265*/"GRANTHA SIGN AVAGRAHA"/* 1133D */, /*35266*/"GRANTHA VOWEL SIGN AA"/* 1133E */,/*35267*/"GRANTHA VOWEL SIGN I"/* 1133F */, /*35268*/"GRANTHA VOWEL SIGN II"/* 11340 */,/*35269*/"GRANTHA VOWEL SIGN U"/* 11341 */, /*35270*/"GRANTHA VOWEL SIGN UU"/* 11342 */,/*35271*/"GRANTHA VOWEL SIGN VOCALIC R"/* 11343 */, /*35272*/"GRANTHA VOWEL SIGN VOCALIC RR"/* 11344 */,NULL,NULL,/*35275*/"GRANTHA VOWEL SIGN EE"/* 11347 */, /*35276*/"GRANTHA VOWEL SIGN AI"/* 11348 */,NULL,NULL,/*35279*/"GRANTHA VOWEL SIGN OO"/* 1134B */, /*35280*/"GRANTHA VOWEL SIGN AU"/* 1134C */,/*35281*/"GRANTHA SIGN VIRAMA"/* 1134D */,NULL,NULL, /*35284*/"GRANTHA OM"/* 11350 */,NULL,NULL,NULL,NULL,NULL,NULL,/*35291*/"GRANTHA AU LENGTH MARK"/* 11357 */,NULL,NULL, NULL,NULL,NULL,/*35297*/"GRANTHA SIGN PLUTA"/* 1135D */,/*35298*/"GRANTHA LETTER VEDIC ANUSVARA"/* 1135E */, /*35299*/"GRANTHA LETTER VEDIC DOUBLE ANUSVARA"/* 1135F */,/*35300*/"GRANTHA LETTER VOCALIC RR"/* 11360 */, /*35301*/"GRANTHA LETTER VOCALIC LL"/* 11361 */,/*35302*/"GRANTHA VOWEL SIGN VOCALIC L"/* 11362 */, /*35303*/"GRANTHA VOWEL SIGN VOCALIC LL"/* 11363 */,NULL,NULL,/*35306*/"COMBINING GRANTHA DIGIT ZERO"/* 11366 */, /*35307*/"COMBINING GRANTHA DIGIT ONE"/* 11367 */,/*35308*/"COMBINING GRANTHA DIGIT TWO"/* 11368 */, /*35309*/"COMBINING GRANTHA DIGIT THREE"/* 11369 */,/*35310*/"COMBINING GRANTHA DIGIT FOUR"/* 1136A */, /*35311*/"COMBINING GRANTHA DIGIT FIVE"/* 1136B */,/*35312*/"COMBINING GRANTHA DIGIT SIX"/* 1136C */,NULL,NULL,NULL, /*35316*/"COMBINING GRANTHA LETTER A"/* 11370 */,/*35317*/"COMBINING GRANTHA LETTER KA"/* 11371 */, /*35318*/"COMBINING GRANTHA LETTER NA"/* 11372 */,/*35319*/"COMBINING GRANTHA LETTER VI"/* 11373 */, /*35320*/"COMBINING GRANTHA LETTER PA"/* 11374 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,/*35460*/"NEWA LETTER A"/* 11400 */,/*35461*/"NEWA LETTER AA"/* 11401 */, /*35462*/"NEWA LETTER I"/* 11402 */,/*35463*/"NEWA LETTER II"/* 11403 */,/*35464*/"NEWA LETTER U"/* 11404 */, /*35465*/"NEWA LETTER UU"/* 11405 */,/*35466*/"NEWA LETTER VOCALIC R"/* 11406 */, /*35467*/"NEWA LETTER VOCALIC RR"/* 11407 */,/*35468*/"NEWA LETTER VOCALIC L"/* 11408 */, /*35469*/"NEWA LETTER VOCALIC LL"/* 11409 */,/*35470*/"NEWA LETTER E"/* 1140A */,/*35471*/"NEWA LETTER AI"/* 1140B */, /*35472*/"NEWA LETTER O"/* 1140C */,/*35473*/"NEWA LETTER AU"/* 1140D */,/*35474*/"NEWA LETTER KA"/* 1140E */, /*35475*/"NEWA LETTER KHA"/* 1140F */,/*35476*/"NEWA LETTER GA"/* 11410 */,/*35477*/"NEWA LETTER GHA"/* 11411 */, /*35478*/"NEWA LETTER NGA"/* 11412 */,/*35479*/"NEWA LETTER NGHA"/* 11413 */,/*35480*/"NEWA LETTER CA"/* 11414 */, /*35481*/"NEWA LETTER CHA"/* 11415 */,/*35482*/"NEWA LETTER JA"/* 11416 */,/*35483*/"NEWA LETTER JHA"/* 11417 */, /*35484*/"NEWA LETTER NYA"/* 11418 */,/*35485*/"NEWA LETTER NYHA"/* 11419 */,/*35486*/"NEWA LETTER TTA"/* 1141A */, /*35487*/"NEWA LETTER TTHA"/* 1141B */,/*35488*/"NEWA LETTER DDA"/* 1141C */,/*35489*/"NEWA LETTER DDHA"/* 1141D */, /*35490*/"NEWA LETTER NNA"/* 1141E */,/*35491*/"NEWA LETTER TA"/* 1141F */,/*35492*/"NEWA LETTER THA"/* 11420 */, /*35493*/"NEWA LETTER DA"/* 11421 */,/*35494*/"NEWA LETTER DHA"/* 11422 */,/*35495*/"NEWA LETTER NA"/* 11423 */, /*35496*/"NEWA LETTER NHA"/* 11424 */,/*35497*/"NEWA LETTER PA"/* 11425 */,/*35498*/"NEWA LETTER PHA"/* 11426 */, /*35499*/"NEWA LETTER BA"/* 11427 */,/*35500*/"NEWA LETTER BHA"/* 11428 */,/*35501*/"NEWA LETTER MA"/* 11429 */, /*35502*/"NEWA LETTER MHA"/* 1142A */,/*35503*/"NEWA LETTER YA"/* 1142B */,/*35504*/"NEWA LETTER RA"/* 1142C */, /*35505*/"NEWA LETTER RHA"/* 1142D */,/*35506*/"NEWA LETTER LA"/* 1142E */,/*35507*/"NEWA LETTER LHA"/* 1142F */, /*35508*/"NEWA LETTER WA"/* 11430 */,/*35509*/"NEWA LETTER SHA"/* 11431 */,/*35510*/"NEWA LETTER SSA"/* 11432 */, /*35511*/"NEWA LETTER SA"/* 11433 */,/*35512*/"NEWA LETTER HA"/* 11434 */,/*35513*/"NEWA VOWEL SIGN AA"/* 11435 */, /*35514*/"NEWA VOWEL SIGN I"/* 11436 */,/*35515*/"NEWA VOWEL SIGN II"/* 11437 */,/*35516*/"NEWA VOWEL SIGN U"/* 11438 */, /*35517*/"NEWA VOWEL SIGN UU"/* 11439 */,/*35518*/"NEWA VOWEL SIGN VOCALIC R"/* 1143A */, /*35519*/"NEWA VOWEL SIGN VOCALIC RR"/* 1143B */,/*35520*/"NEWA VOWEL SIGN VOCALIC L"/* 1143C */, /*35521*/"NEWA VOWEL SIGN VOCALIC LL"/* 1143D */,/*35522*/"NEWA VOWEL SIGN E"/* 1143E */, /*35523*/"NEWA VOWEL SIGN AI"/* 1143F */,/*35524*/"NEWA VOWEL SIGN O"/* 11440 */, /*35525*/"NEWA VOWEL SIGN AU"/* 11441 */,/*35526*/"NEWA SIGN VIRAMA"/* 11442 */, /*35527*/"NEWA SIGN CANDRABINDU"/* 11443 */,/*35528*/"NEWA SIGN ANUSVARA"/* 11444 */, /*35529*/"NEWA SIGN VISARGA"/* 11445 */,/*35530*/"NEWA SIGN NUKTA"/* 11446 */,/*35531*/"NEWA SIGN AVAGRAHA"/* 11447 */, /*35532*/"NEWA SIGN FINAL ANUSVARA"/* 11448 */,/*35533*/"NEWA OM"/* 11449 */,/*35534*/"NEWA SIDDHI"/* 1144A */, /*35535*/"NEWA DANDA"/* 1144B */,/*35536*/"NEWA DOUBLE DANDA"/* 1144C */,/*35537*/"NEWA COMMA"/* 1144D */, /*35538*/"NEWA GAP FILLER"/* 1144E */,/*35539*/"NEWA ABBREVIATION SIGN"/* 1144F */,/*35540*/"NEWA DIGIT ZERO"/* 11450 */, /*35541*/"NEWA DIGIT ONE"/* 11451 */,/*35542*/"NEWA DIGIT TWO"/* 11452 */,/*35543*/"NEWA DIGIT THREE"/* 11453 */, /*35544*/"NEWA DIGIT FOUR"/* 11454 */,/*35545*/"NEWA DIGIT FIVE"/* 11455 */,/*35546*/"NEWA DIGIT SIX"/* 11456 */, /*35547*/"NEWA DIGIT SEVEN"/* 11457 */,/*35548*/"NEWA DIGIT EIGHT"/* 11458 */,/*35549*/"NEWA DIGIT NINE"/* 11459 */,NULL, /*35551*/"NEWA PLACEHOLDER MARK"/* 1145B */,NULL,/*35553*/"NEWA INSERTION SIGN"/* 1145D */,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,/*35588*/"TIRHUTA ANJI"/* 11480 */,/*35589*/"TIRHUTA LETTER A"/* 11481 */, /*35590*/"TIRHUTA LETTER AA"/* 11482 */,/*35591*/"TIRHUTA LETTER I"/* 11483 */,/*35592*/"TIRHUTA LETTER II"/* 11484 */, /*35593*/"TIRHUTA LETTER U"/* 11485 */,/*35594*/"TIRHUTA LETTER UU"/* 11486 */, /*35595*/"TIRHUTA LETTER VOCALIC R"/* 11487 */,/*35596*/"TIRHUTA LETTER VOCALIC RR"/* 11488 */, /*35597*/"TIRHUTA LETTER VOCALIC L"/* 11489 */,/*35598*/"TIRHUTA LETTER VOCALIC LL"/* 1148A */, /*35599*/"TIRHUTA LETTER E"/* 1148B */,/*35600*/"TIRHUTA LETTER AI"/* 1148C */,/*35601*/"TIRHUTA LETTER O"/* 1148D */, /*35602*/"TIRHUTA LETTER AU"/* 1148E */,/*35603*/"TIRHUTA LETTER KA"/* 1148F */,/*35604*/"TIRHUTA LETTER KHA"/* 11490 */, /*35605*/"TIRHUTA LETTER GA"/* 11491 */,/*35606*/"TIRHUTA LETTER GHA"/* 11492 */, /*35607*/"TIRHUTA LETTER NGA"/* 11493 */,/*35608*/"TIRHUTA LETTER CA"/* 11494 */, /*35609*/"TIRHUTA LETTER CHA"/* 11495 */,/*35610*/"TIRHUTA LETTER JA"/* 11496 */, /*35611*/"TIRHUTA LETTER JHA"/* 11497 */,/*35612*/"TIRHUTA LETTER NYA"/* 11498 */, /*35613*/"TIRHUTA LETTER TTA"/* 11499 */,/*35614*/"TIRHUTA LETTER TTHA"/* 1149A */, /*35615*/"TIRHUTA LETTER DDA"/* 1149B */,/*35616*/"TIRHUTA LETTER DDHA"/* 1149C */, /*35617*/"TIRHUTA LETTER NNA"/* 1149D */,/*35618*/"TIRHUTA LETTER TA"/* 1149E */, /*35619*/"TIRHUTA LETTER THA"/* 1149F */,/*35620*/"TIRHUTA LETTER DA"/* 114A0 */, /*35621*/"TIRHUTA LETTER DHA"/* 114A1 */,/*35622*/"TIRHUTA LETTER NA"/* 114A2 */,/*35623*/"TIRHUTA LETTER PA"/* 114A3 */, /*35624*/"TIRHUTA LETTER PHA"/* 114A4 */,/*35625*/"TIRHUTA LETTER BA"/* 114A5 */, /*35626*/"TIRHUTA LETTER BHA"/* 114A6 */,/*35627*/"TIRHUTA LETTER MA"/* 114A7 */,/*35628*/"TIRHUTA LETTER YA"/* 114A8 */, /*35629*/"TIRHUTA LETTER RA"/* 114A9 */,/*35630*/"TIRHUTA LETTER LA"/* 114AA */,/*35631*/"TIRHUTA LETTER VA"/* 114AB */, /*35632*/"TIRHUTA LETTER SHA"/* 114AC */,/*35633*/"TIRHUTA LETTER SSA"/* 114AD */, /*35634*/"TIRHUTA LETTER SA"/* 114AE */,/*35635*/"TIRHUTA LETTER HA"/* 114AF */, /*35636*/"TIRHUTA VOWEL SIGN AA"/* 114B0 */,/*35637*/"TIRHUTA VOWEL SIGN I"/* 114B1 */, /*35638*/"TIRHUTA VOWEL SIGN II"/* 114B2 */,/*35639*/"TIRHUTA VOWEL SIGN U"/* 114B3 */, /*35640*/"TIRHUTA VOWEL SIGN UU"/* 114B4 */,/*35641*/"TIRHUTA VOWEL SIGN VOCALIC R"/* 114B5 */, /*35642*/"TIRHUTA VOWEL SIGN VOCALIC RR"/* 114B6 */,/*35643*/"TIRHUTA VOWEL SIGN VOCALIC L"/* 114B7 */, /*35644*/"TIRHUTA VOWEL SIGN VOCALIC LL"/* 114B8 */,/*35645*/"TIRHUTA VOWEL SIGN E"/* 114B9 */, /*35646*/"TIRHUTA VOWEL SIGN SHORT E"/* 114BA */,/*35647*/"TIRHUTA VOWEL SIGN AI"/* 114BB */, /*35648*/"TIRHUTA VOWEL SIGN O"/* 114BC */,/*35649*/"TIRHUTA VOWEL SIGN SHORT O"/* 114BD */, /*35650*/"TIRHUTA VOWEL SIGN AU"/* 114BE */,/*35651*/"TIRHUTA SIGN CANDRABINDU"/* 114BF */, /*35652*/"TIRHUTA SIGN ANUSVARA"/* 114C0 */,/*35653*/"TIRHUTA SIGN VISARGA"/* 114C1 */, /*35654*/"TIRHUTA SIGN VIRAMA"/* 114C2 */,/*35655*/"TIRHUTA SIGN NUKTA"/* 114C3 */, /*35656*/"TIRHUTA SIGN AVAGRAHA"/* 114C4 */,/*35657*/"TIRHUTA GVANG"/* 114C5 */, /*35658*/"TIRHUTA ABBREVIATION SIGN"/* 114C6 */,/*35659*/"TIRHUTA OM"/* 114C7 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*35668*/"TIRHUTA DIGIT ZERO"/* 114D0 */,/*35669*/"TIRHUTA DIGIT ONE"/* 114D1 */,/*35670*/"TIRHUTA DIGIT TWO"/* 114D2 */, /*35671*/"TIRHUTA DIGIT THREE"/* 114D3 */,/*35672*/"TIRHUTA DIGIT FOUR"/* 114D4 */, /*35673*/"TIRHUTA DIGIT FIVE"/* 114D5 */,/*35674*/"TIRHUTA DIGIT SIX"/* 114D6 */, /*35675*/"TIRHUTA DIGIT SEVEN"/* 114D7 */,/*35676*/"TIRHUTA DIGIT EIGHT"/* 114D8 */, /*35677*/"TIRHUTA DIGIT NINE"/* 114D9 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,/*35844*/"SIDDHAM LETTER A"/* 11580 */,/*35845*/"SIDDHAM LETTER AA"/* 11581 */, /*35846*/"SIDDHAM LETTER I"/* 11582 */,/*35847*/"SIDDHAM LETTER II"/* 11583 */,/*35848*/"SIDDHAM LETTER U"/* 11584 */, /*35849*/"SIDDHAM LETTER UU"/* 11585 */,/*35850*/"SIDDHAM LETTER VOCALIC R"/* 11586 */, /*35851*/"SIDDHAM LETTER VOCALIC RR"/* 11587 */,/*35852*/"SIDDHAM LETTER VOCALIC L"/* 11588 */, /*35853*/"SIDDHAM LETTER VOCALIC LL"/* 11589 */,/*35854*/"SIDDHAM LETTER E"/* 1158A */, /*35855*/"SIDDHAM LETTER AI"/* 1158B */,/*35856*/"SIDDHAM LETTER O"/* 1158C */,/*35857*/"SIDDHAM LETTER AU"/* 1158D */, /*35858*/"SIDDHAM LETTER KA"/* 1158E */,/*35859*/"SIDDHAM LETTER KHA"/* 1158F */,/*35860*/"SIDDHAM LETTER GA"/* 11590 */, /*35861*/"SIDDHAM LETTER GHA"/* 11591 */,/*35862*/"SIDDHAM LETTER NGA"/* 11592 */, /*35863*/"SIDDHAM LETTER CA"/* 11593 */,/*35864*/"SIDDHAM LETTER CHA"/* 11594 */,/*35865*/"SIDDHAM LETTER JA"/* 11595 */, /*35866*/"SIDDHAM LETTER JHA"/* 11596 */,/*35867*/"SIDDHAM LETTER NYA"/* 11597 */, /*35868*/"SIDDHAM LETTER TTA"/* 11598 */,/*35869*/"SIDDHAM LETTER TTHA"/* 11599 */, /*35870*/"SIDDHAM LETTER DDA"/* 1159A */,/*35871*/"SIDDHAM LETTER DDHA"/* 1159B */, /*35872*/"SIDDHAM LETTER NNA"/* 1159C */,/*35873*/"SIDDHAM LETTER TA"/* 1159D */, /*35874*/"SIDDHAM LETTER THA"/* 1159E */,/*35875*/"SIDDHAM LETTER DA"/* 1159F */, /*35876*/"SIDDHAM LETTER DHA"/* 115A0 */,/*35877*/"SIDDHAM LETTER NA"/* 115A1 */,/*35878*/"SIDDHAM LETTER PA"/* 115A2 */, /*35879*/"SIDDHAM LETTER PHA"/* 115A3 */,/*35880*/"SIDDHAM LETTER BA"/* 115A4 */, /*35881*/"SIDDHAM LETTER BHA"/* 115A5 */,/*35882*/"SIDDHAM LETTER MA"/* 115A6 */,/*35883*/"SIDDHAM LETTER YA"/* 115A7 */, /*35884*/"SIDDHAM LETTER RA"/* 115A8 */,/*35885*/"SIDDHAM LETTER LA"/* 115A9 */,/*35886*/"SIDDHAM LETTER VA"/* 115AA */, /*35887*/"SIDDHAM LETTER SHA"/* 115AB */,/*35888*/"SIDDHAM LETTER SSA"/* 115AC */, /*35889*/"SIDDHAM LETTER SA"/* 115AD */,/*35890*/"SIDDHAM LETTER HA"/* 115AE */, /*35891*/"SIDDHAM VOWEL SIGN AA"/* 115AF */,/*35892*/"SIDDHAM VOWEL SIGN I"/* 115B0 */, /*35893*/"SIDDHAM VOWEL SIGN II"/* 115B1 */,/*35894*/"SIDDHAM VOWEL SIGN U"/* 115B2 */, /*35895*/"SIDDHAM VOWEL SIGN UU"/* 115B3 */,/*35896*/"SIDDHAM VOWEL SIGN VOCALIC R"/* 115B4 */, /*35897*/"SIDDHAM VOWEL SIGN VOCALIC RR"/* 115B5 */,NULL,NULL,/*35900*/"SIDDHAM VOWEL SIGN E"/* 115B8 */, /*35901*/"SIDDHAM VOWEL SIGN AI"/* 115B9 */,/*35902*/"SIDDHAM VOWEL SIGN O"/* 115BA */, /*35903*/"SIDDHAM VOWEL SIGN AU"/* 115BB */,/*35904*/"SIDDHAM SIGN CANDRABINDU"/* 115BC */, /*35905*/"SIDDHAM SIGN ANUSVARA"/* 115BD */,/*35906*/"SIDDHAM SIGN VISARGA"/* 115BE */, /*35907*/"SIDDHAM SIGN VIRAMA"/* 115BF */,/*35908*/"SIDDHAM SIGN NUKTA"/* 115C0 */, /*35909*/"SIDDHAM SIGN SIDDHAM"/* 115C1 */,/*35910*/"SIDDHAM DANDA"/* 115C2 */, /*35911*/"SIDDHAM DOUBLE DANDA"/* 115C3 */,/*35912*/"SIDDHAM SEPARATOR DOT"/* 115C4 */, /*35913*/"SIDDHAM SEPARATOR BAR"/* 115C5 */,/*35914*/"SIDDHAM REPETITION MARK-1"/* 115C6 */, /*35915*/"SIDDHAM REPETITION MARK-2"/* 115C7 */,/*35916*/"SIDDHAM REPETITION MARK-3"/* 115C8 */, /*35917*/"SIDDHAM END OF TEXT MARK"/* 115C9 */, /*35918*/"SIDDHAM SECTION MARK WITH TRIDENT AND U-SHAPED ORNAMENTS"/* 115CA */, /*35919*/"SIDDHAM SECTION MARK WITH TRIDENT AND DOTTED CRESCENTS"/* 115CB */, /*35920*/"SIDDHAM SECTION MARK WITH RAYS AND DOTTED CRESCENTS"/* 115CC */, /*35921*/"SIDDHAM SECTION MARK WITH RAYS AND DOTTED DOUBLE CRESCENTS"/* 115CD */, /*35922*/"SIDDHAM SECTION MARK WITH RAYS AND DOTTED TRIPLE CRESCENTS"/* 115CE */, /*35923*/"SIDDHAM SECTION MARK DOUBLE RING"/* 115CF */,/*35924*/"SIDDHAM SECTION MARK DOUBLE RING WITH RAYS"/* 115D0 */, /*35925*/"SIDDHAM SECTION MARK WITH DOUBLE CRESCENTS"/* 115D1 */, /*35926*/"SIDDHAM SECTION MARK WITH TRIPLE CRESCENTS"/* 115D2 */, /*35927*/"SIDDHAM SECTION MARK WITH QUADRUPLE CRESCENTS"/* 115D3 */, /*35928*/"SIDDHAM SECTION MARK WITH SEPTUPLE CRESCENTS"/* 115D4 */, /*35929*/"SIDDHAM SECTION MARK WITH CIRCLES AND RAYS"/* 115D5 */, /*35930*/"SIDDHAM SECTION MARK WITH CIRCLES AND TWO ENCLOSURES"/* 115D6 */, /*35931*/"SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES"/* 115D7 */, /*35932*/"SIDDHAM LETTER THREE-CIRCLE ALTERNATE I"/* 115D8 */, /*35933*/"SIDDHAM LETTER TWO-CIRCLE ALTERNATE I"/* 115D9 */,/*35934*/"SIDDHAM LETTER TWO-CIRCLE ALTERNATE II"/* 115DA */, /*35935*/"SIDDHAM LETTER ALTERNATE U"/* 115DB */,/*35936*/"SIDDHAM VOWEL SIGN ALTERNATE U"/* 115DC */, /*35937*/"SIDDHAM VOWEL SIGN ALTERNATE UU"/* 115DD */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*35972*/"MODI LETTER A"/* 11600 */,/*35973*/"MODI LETTER AA"/* 11601 */,/*35974*/"MODI LETTER I"/* 11602 */, /*35975*/"MODI LETTER II"/* 11603 */,/*35976*/"MODI LETTER U"/* 11604 */,/*35977*/"MODI LETTER UU"/* 11605 */, /*35978*/"MODI LETTER VOCALIC R"/* 11606 */,/*35979*/"MODI LETTER VOCALIC RR"/* 11607 */, /*35980*/"MODI LETTER VOCALIC L"/* 11608 */,/*35981*/"MODI LETTER VOCALIC LL"/* 11609 */, /*35982*/"MODI LETTER E"/* 1160A */,/*35983*/"MODI LETTER AI"/* 1160B */,/*35984*/"MODI LETTER O"/* 1160C */, /*35985*/"MODI LETTER AU"/* 1160D */,/*35986*/"MODI LETTER KA"/* 1160E */,/*35987*/"MODI LETTER KHA"/* 1160F */, /*35988*/"MODI LETTER GA"/* 11610 */,/*35989*/"MODI LETTER GHA"/* 11611 */,/*35990*/"MODI LETTER NGA"/* 11612 */, /*35991*/"MODI LETTER CA"/* 11613 */,/*35992*/"MODI LETTER CHA"/* 11614 */,/*35993*/"MODI LETTER JA"/* 11615 */, /*35994*/"MODI LETTER JHA"/* 11616 */,/*35995*/"MODI LETTER NYA"/* 11617 */,/*35996*/"MODI LETTER TTA"/* 11618 */, /*35997*/"MODI LETTER TTHA"/* 11619 */,/*35998*/"MODI LETTER DDA"/* 1161A */,/*35999*/"MODI LETTER DDHA"/* 1161B */, /*36000*/"MODI LETTER NNA"/* 1161C */,/*36001*/"MODI LETTER TA"/* 1161D */,/*36002*/"MODI LETTER THA"/* 1161E */, /*36003*/"MODI LETTER DA"/* 1161F */,/*36004*/"MODI LETTER DHA"/* 11620 */,/*36005*/"MODI LETTER NA"/* 11621 */, /*36006*/"MODI LETTER PA"/* 11622 */,/*36007*/"MODI LETTER PHA"/* 11623 */,/*36008*/"MODI LETTER BA"/* 11624 */, /*36009*/"MODI LETTER BHA"/* 11625 */,/*36010*/"MODI LETTER MA"/* 11626 */,/*36011*/"MODI LETTER YA"/* 11627 */, /*36012*/"MODI LETTER RA"/* 11628 */,/*36013*/"MODI LETTER LA"/* 11629 */,/*36014*/"MODI LETTER VA"/* 1162A */, /*36015*/"MODI LETTER SHA"/* 1162B */,/*36016*/"MODI LETTER SSA"/* 1162C */,/*36017*/"MODI LETTER SA"/* 1162D */, /*36018*/"MODI LETTER HA"/* 1162E */,/*36019*/"MODI LETTER LLA"/* 1162F */,/*36020*/"MODI VOWEL SIGN AA"/* 11630 */, /*36021*/"MODI VOWEL SIGN I"/* 11631 */,/*36022*/"MODI VOWEL SIGN II"/* 11632 */,/*36023*/"MODI VOWEL SIGN U"/* 11633 */, /*36024*/"MODI VOWEL SIGN UU"/* 11634 */,/*36025*/"MODI VOWEL SIGN VOCALIC R"/* 11635 */, /*36026*/"MODI VOWEL SIGN VOCALIC RR"/* 11636 */,/*36027*/"MODI VOWEL SIGN VOCALIC L"/* 11637 */, /*36028*/"MODI VOWEL SIGN VOCALIC LL"/* 11638 */,/*36029*/"MODI VOWEL SIGN E"/* 11639 */, /*36030*/"MODI VOWEL SIGN AI"/* 1163A */,/*36031*/"MODI VOWEL SIGN O"/* 1163B */, /*36032*/"MODI VOWEL SIGN AU"/* 1163C */,/*36033*/"MODI SIGN ANUSVARA"/* 1163D */, /*36034*/"MODI SIGN VISARGA"/* 1163E */,/*36035*/"MODI SIGN VIRAMA"/* 1163F */, /*36036*/"MODI SIGN ARDHACANDRA"/* 11640 */,/*36037*/"MODI DANDA"/* 11641 */,/*36038*/"MODI DOUBLE DANDA"/* 11642 */, /*36039*/"MODI ABBREVIATION SIGN"/* 11643 */,/*36040*/"MODI SIGN HUVA"/* 11644 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,/*36052*/"MODI DIGIT ZERO"/* 11650 */,/*36053*/"MODI DIGIT ONE"/* 11651 */, /*36054*/"MODI DIGIT TWO"/* 11652 */,/*36055*/"MODI DIGIT THREE"/* 11653 */,/*36056*/"MODI DIGIT FOUR"/* 11654 */, /*36057*/"MODI DIGIT FIVE"/* 11655 */,/*36058*/"MODI DIGIT SIX"/* 11656 */,/*36059*/"MODI DIGIT SEVEN"/* 11657 */, /*36060*/"MODI DIGIT EIGHT"/* 11658 */,/*36061*/"MODI DIGIT NINE"/* 11659 */,NULL,NULL,NULL,NULL,NULL,NULL, /*36068*/"MONGOLIAN BIRGA WITH ORNAMENT"/* 11660 */,/*36069*/"MONGOLIAN ROTATED BIRGA"/* 11661 */, /*36070*/"MONGOLIAN DOUBLE BIRGA WITH ORNAMENT"/* 11662 */,/*36071*/"MONGOLIAN TRIPLE BIRGA WITH ORNAMENT"/* 11663 */, /*36072*/"MONGOLIAN BIRGA WITH DOUBLE ORNAMENT"/* 11664 */,/*36073*/"MONGOLIAN ROTATED BIRGA WITH ORNAMENT"/* 11665 */, /*36074*/"MONGOLIAN ROTATED BIRGA WITH DOUBLE ORNAMENT"/* 11666 */,/*36075*/"MONGOLIAN INVERTED BIRGA"/* 11667 */, /*36076*/"MONGOLIAN INVERTED BIRGA WITH DOUBLE ORNAMENT"/* 11668 */,/*36077*/"MONGOLIAN SWIRL BIRGA"/* 11669 */, /*36078*/"MONGOLIAN SWIRL BIRGA WITH ORNAMENT"/* 1166A */, /*36079*/"MONGOLIAN SWIRL BIRGA WITH DOUBLE ORNAMENT"/* 1166B */, /*36080*/"MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT"/* 1166C */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*36100*/"TAKRI LETTER A"/* 11680 */, /*36101*/"TAKRI LETTER AA"/* 11681 */,/*36102*/"TAKRI LETTER I"/* 11682 */,/*36103*/"TAKRI LETTER II"/* 11683 */, /*36104*/"TAKRI LETTER U"/* 11684 */,/*36105*/"TAKRI LETTER UU"/* 11685 */,/*36106*/"TAKRI LETTER E"/* 11686 */, /*36107*/"TAKRI LETTER AI"/* 11687 */,/*36108*/"TAKRI LETTER O"/* 11688 */,/*36109*/"TAKRI LETTER AU"/* 11689 */, /*36110*/"TAKRI LETTER KA"/* 1168A */,/*36111*/"TAKRI LETTER KHA"/* 1168B */,/*36112*/"TAKRI LETTER GA"/* 1168C */, /*36113*/"TAKRI LETTER GHA"/* 1168D */,/*36114*/"TAKRI LETTER NGA"/* 1168E */,/*36115*/"TAKRI LETTER CA"/* 1168F */, /*36116*/"TAKRI LETTER CHA"/* 11690 */,/*36117*/"TAKRI LETTER JA"/* 11691 */,/*36118*/"TAKRI LETTER JHA"/* 11692 */, /*36119*/"TAKRI LETTER NYA"/* 11693 */,/*36120*/"TAKRI LETTER TTA"/* 11694 */,/*36121*/"TAKRI LETTER TTHA"/* 11695 */, /*36122*/"TAKRI LETTER DDA"/* 11696 */,/*36123*/"TAKRI LETTER DDHA"/* 11697 */,/*36124*/"TAKRI LETTER NNA"/* 11698 */, /*36125*/"TAKRI LETTER TA"/* 11699 */,/*36126*/"TAKRI LETTER THA"/* 1169A */,/*36127*/"TAKRI LETTER DA"/* 1169B */, /*36128*/"TAKRI LETTER DHA"/* 1169C */,/*36129*/"TAKRI LETTER NA"/* 1169D */,/*36130*/"TAKRI LETTER PA"/* 1169E */, /*36131*/"TAKRI LETTER PHA"/* 1169F */,/*36132*/"TAKRI LETTER BA"/* 116A0 */,/*36133*/"TAKRI LETTER BHA"/* 116A1 */, /*36134*/"TAKRI LETTER MA"/* 116A2 */,/*36135*/"TAKRI LETTER YA"/* 116A3 */,/*36136*/"TAKRI LETTER RA"/* 116A4 */, /*36137*/"TAKRI LETTER LA"/* 116A5 */,/*36138*/"TAKRI LETTER VA"/* 116A6 */,/*36139*/"TAKRI LETTER SHA"/* 116A7 */, /*36140*/"TAKRI LETTER SA"/* 116A8 */,/*36141*/"TAKRI LETTER HA"/* 116A9 */,/*36142*/"TAKRI LETTER RRA"/* 116AA */, /*36143*/"TAKRI SIGN ANUSVARA"/* 116AB */,/*36144*/"TAKRI SIGN VISARGA"/* 116AC */, /*36145*/"TAKRI VOWEL SIGN AA"/* 116AD */,/*36146*/"TAKRI VOWEL SIGN I"/* 116AE */, /*36147*/"TAKRI VOWEL SIGN II"/* 116AF */,/*36148*/"TAKRI VOWEL SIGN U"/* 116B0 */, /*36149*/"TAKRI VOWEL SIGN UU"/* 116B1 */,/*36150*/"TAKRI VOWEL SIGN E"/* 116B2 */, /*36151*/"TAKRI VOWEL SIGN AI"/* 116B3 */,/*36152*/"TAKRI VOWEL SIGN O"/* 116B4 */, /*36153*/"TAKRI VOWEL SIGN AU"/* 116B5 */,/*36154*/"TAKRI SIGN VIRAMA"/* 116B6 */,/*36155*/"TAKRI SIGN NUKTA"/* 116B7 */, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*36164*/"TAKRI DIGIT ZERO"/* 116C0 */,/*36165*/"TAKRI DIGIT ONE"/* 116C1 */, /*36166*/"TAKRI DIGIT TWO"/* 116C2 */,/*36167*/"TAKRI DIGIT THREE"/* 116C3 */,/*36168*/"TAKRI DIGIT FOUR"/* 116C4 */, /*36169*/"TAKRI DIGIT FIVE"/* 116C5 */,/*36170*/"TAKRI DIGIT SIX"/* 116C6 */,/*36171*/"TAKRI DIGIT SEVEN"/* 116C7 */, /*36172*/"TAKRI DIGIT EIGHT"/* 116C8 */,/*36173*/"TAKRI DIGIT NINE"/* 116C9 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*36228*/"AHOM LETTER KA"/* 11700 */,/*36229*/"AHOM LETTER KHA"/* 11701 */,/*36230*/"AHOM LETTER NGA"/* 11702 */, /*36231*/"AHOM LETTER NA"/* 11703 */,/*36232*/"AHOM LETTER TA"/* 11704 */,/*36233*/"AHOM LETTER ALTERNATE TA"/* 11705 */, /*36234*/"AHOM LETTER PA"/* 11706 */,/*36235*/"AHOM LETTER PHA"/* 11707 */,/*36236*/"AHOM LETTER BA"/* 11708 */, /*36237*/"AHOM LETTER MA"/* 11709 */,/*36238*/"AHOM LETTER JA"/* 1170A */,/*36239*/"AHOM LETTER CHA"/* 1170B */, /*36240*/"AHOM LETTER THA"/* 1170C */,/*36241*/"AHOM LETTER RA"/* 1170D */,/*36242*/"AHOM LETTER LA"/* 1170E */, /*36243*/"AHOM LETTER SA"/* 1170F */,/*36244*/"AHOM LETTER NYA"/* 11710 */,/*36245*/"AHOM LETTER HA"/* 11711 */, /*36246*/"AHOM LETTER A"/* 11712 */,/*36247*/"AHOM LETTER DA"/* 11713 */,/*36248*/"AHOM LETTER DHA"/* 11714 */, /*36249*/"AHOM LETTER GA"/* 11715 */,/*36250*/"AHOM LETTER ALTERNATE GA"/* 11716 */, /*36251*/"AHOM LETTER GHA"/* 11717 */,/*36252*/"AHOM LETTER BHA"/* 11718 */,/*36253*/"AHOM LETTER JHA"/* 11719 */,NULL, NULL,NULL,/*36257*/"AHOM CONSONANT SIGN MEDIAL LA"/* 1171D */,/*36258*/"AHOM CONSONANT SIGN MEDIAL RA"/* 1171E */, /*36259*/"AHOM CONSONANT SIGN MEDIAL LIGATING RA"/* 1171F */,/*36260*/"AHOM VOWEL SIGN A"/* 11720 */, /*36261*/"AHOM VOWEL SIGN AA"/* 11721 */,/*36262*/"AHOM VOWEL SIGN I"/* 11722 */, /*36263*/"AHOM VOWEL SIGN II"/* 11723 */,/*36264*/"AHOM VOWEL SIGN U"/* 11724 */, /*36265*/"AHOM VOWEL SIGN UU"/* 11725 */,/*36266*/"AHOM VOWEL SIGN E"/* 11726 */, /*36267*/"AHOM VOWEL SIGN AW"/* 11727 */,/*36268*/"AHOM VOWEL SIGN O"/* 11728 */, /*36269*/"AHOM VOWEL SIGN AI"/* 11729 */,/*36270*/"AHOM VOWEL SIGN AM"/* 1172A */,/*36271*/"AHOM SIGN KILLER"/* 1172B */, NULL,NULL,NULL,NULL,/*36276*/"AHOM DIGIT ZERO"/* 11730 */,/*36277*/"AHOM DIGIT ONE"/* 11731 */, /*36278*/"AHOM DIGIT TWO"/* 11732 */,/*36279*/"AHOM DIGIT THREE"/* 11733 */,/*36280*/"AHOM DIGIT FOUR"/* 11734 */, /*36281*/"AHOM DIGIT FIVE"/* 11735 */,/*36282*/"AHOM DIGIT SIX"/* 11736 */,/*36283*/"AHOM DIGIT SEVEN"/* 11737 */, /*36284*/"AHOM DIGIT EIGHT"/* 11738 */,/*36285*/"AHOM DIGIT NINE"/* 11739 */,/*36286*/"AHOM NUMBER TEN"/* 1173A */, /*36287*/"AHOM NUMBER TWENTY"/* 1173B */,/*36288*/"AHOM SIGN SMALL SECTION"/* 1173C */, /*36289*/"AHOM SIGN SECTION"/* 1173D */,/*36290*/"AHOM SIGN RULAI"/* 1173E */,/*36291*/"AHOM SYMBOL VI"/* 1173F */,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*36644*/"WARANG CITI CAPITAL LETTER NGAA"/* 118A0 */,/*36645*/"WARANG CITI CAPITAL LETTER A"/* 118A1 */, /*36646*/"WARANG CITI CAPITAL LETTER WI"/* 118A2 */,/*36647*/"WARANG CITI CAPITAL LETTER YU"/* 118A3 */, /*36648*/"WARANG CITI CAPITAL LETTER YA"/* 118A4 */,/*36649*/"WARANG CITI CAPITAL LETTER YO"/* 118A5 */, /*36650*/"WARANG CITI CAPITAL LETTER II"/* 118A6 */,/*36651*/"WARANG CITI CAPITAL LETTER UU"/* 118A7 */, /*36652*/"WARANG CITI CAPITAL LETTER E"/* 118A8 */,/*36653*/"WARANG CITI CAPITAL LETTER O"/* 118A9 */, /*36654*/"WARANG CITI CAPITAL LETTER ANG"/* 118AA */,/*36655*/"WARANG CITI CAPITAL LETTER GA"/* 118AB */, /*36656*/"WARANG CITI CAPITAL LETTER KO"/* 118AC */,/*36657*/"WARANG CITI CAPITAL LETTER ENY"/* 118AD */, /*36658*/"WARANG CITI CAPITAL LETTER YUJ"/* 118AE */,/*36659*/"WARANG CITI CAPITAL LETTER UC"/* 118AF */, /*36660*/"WARANG CITI CAPITAL LETTER ENN"/* 118B0 */,/*36661*/"WARANG CITI CAPITAL LETTER ODD"/* 118B1 */, /*36662*/"WARANG CITI CAPITAL LETTER TTE"/* 118B2 */,/*36663*/"WARANG CITI CAPITAL LETTER NUNG"/* 118B3 */, /*36664*/"WARANG CITI CAPITAL LETTER DA"/* 118B4 */,/*36665*/"WARANG CITI CAPITAL LETTER AT"/* 118B5 */, /*36666*/"WARANG CITI CAPITAL LETTER AM"/* 118B6 */,/*36667*/"WARANG CITI CAPITAL LETTER BU"/* 118B7 */, /*36668*/"WARANG CITI CAPITAL LETTER PU"/* 118B8 */,/*36669*/"WARANG CITI CAPITAL LETTER HIYO"/* 118B9 */, /*36670*/"WARANG CITI CAPITAL LETTER HOLO"/* 118BA */,/*36671*/"WARANG CITI CAPITAL LETTER HORR"/* 118BB */, /*36672*/"WARANG CITI CAPITAL LETTER HAR"/* 118BC */,/*36673*/"WARANG CITI CAPITAL LETTER SSUU"/* 118BD */, /*36674*/"WARANG CITI CAPITAL LETTER SII"/* 118BE */,/*36675*/"WARANG CITI CAPITAL LETTER VIYO"/* 118BF */, /*36676*/"WARANG CITI SMALL LETTER NGAA"/* 118C0 */,/*36677*/"WARANG CITI SMALL LETTER A"/* 118C1 */, /*36678*/"WARANG CITI SMALL LETTER WI"/* 118C2 */,/*36679*/"WARANG CITI SMALL LETTER YU"/* 118C3 */, /*36680*/"WARANG CITI SMALL LETTER YA"/* 118C4 */,/*36681*/"WARANG CITI SMALL LETTER YO"/* 118C5 */, /*36682*/"WARANG CITI SMALL LETTER II"/* 118C6 */,/*36683*/"WARANG CITI SMALL LETTER UU"/* 118C7 */, /*36684*/"WARANG CITI SMALL LETTER E"/* 118C8 */,/*36685*/"WARANG CITI SMALL LETTER O"/* 118C9 */, /*36686*/"WARANG CITI SMALL LETTER ANG"/* 118CA */,/*36687*/"WARANG CITI SMALL LETTER GA"/* 118CB */, /*36688*/"WARANG CITI SMALL LETTER KO"/* 118CC */,/*36689*/"WARANG CITI SMALL LETTER ENY"/* 118CD */, /*36690*/"WARANG CITI SMALL LETTER YUJ"/* 118CE */,/*36691*/"WARANG CITI SMALL LETTER UC"/* 118CF */, /*36692*/"WARANG CITI SMALL LETTER ENN"/* 118D0 */,/*36693*/"WARANG CITI SMALL LETTER ODD"/* 118D1 */, /*36694*/"WARANG CITI SMALL LETTER TTE"/* 118D2 */,/*36695*/"WARANG CITI SMALL LETTER NUNG"/* 118D3 */, /*36696*/"WARANG CITI SMALL LETTER DA"/* 118D4 */,/*36697*/"WARANG CITI SMALL LETTER AT"/* 118D5 */, /*36698*/"WARANG CITI SMALL LETTER AM"/* 118D6 */,/*36699*/"WARANG CITI SMALL LETTER BU"/* 118D7 */, /*36700*/"WARANG CITI SMALL LETTER PU"/* 118D8 */,/*36701*/"WARANG CITI SMALL LETTER HIYO"/* 118D9 */, /*36702*/"WARANG CITI SMALL LETTER HOLO"/* 118DA */,/*36703*/"WARANG CITI SMALL LETTER HORR"/* 118DB */, /*36704*/"WARANG CITI SMALL LETTER HAR"/* 118DC */,/*36705*/"WARANG CITI SMALL LETTER SSUU"/* 118DD */, /*36706*/"WARANG CITI SMALL LETTER SII"/* 118DE */,/*36707*/"WARANG CITI SMALL LETTER VIYO"/* 118DF */, /*36708*/"WARANG CITI DIGIT ZERO"/* 118E0 */,/*36709*/"WARANG CITI DIGIT ONE"/* 118E1 */, /*36710*/"WARANG CITI DIGIT TWO"/* 118E2 */,/*36711*/"WARANG CITI DIGIT THREE"/* 118E3 */, /*36712*/"WARANG CITI DIGIT FOUR"/* 118E4 */,/*36713*/"WARANG CITI DIGIT FIVE"/* 118E5 */, /*36714*/"WARANG CITI DIGIT SIX"/* 118E6 */,/*36715*/"WARANG CITI DIGIT SEVEN"/* 118E7 */, /*36716*/"WARANG CITI DIGIT EIGHT"/* 118E8 */,/*36717*/"WARANG CITI DIGIT NINE"/* 118E9 */, /*36718*/"WARANG CITI NUMBER TEN"/* 118EA */,/*36719*/"WARANG CITI NUMBER TWENTY"/* 118EB */, /*36720*/"WARANG CITI NUMBER THIRTY"/* 118EC */,/*36721*/"WARANG CITI NUMBER FORTY"/* 118ED */, /*36722*/"WARANG CITI NUMBER FIFTY"/* 118EE */,/*36723*/"WARANG CITI NUMBER SIXTY"/* 118EF */, /*36724*/"WARANG CITI NUMBER SEVENTY"/* 118F0 */,/*36725*/"WARANG CITI NUMBER EIGHTY"/* 118F1 */, /*36726*/"WARANG CITI NUMBER NINETY"/* 118F2 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*36739*/"WARANG CITI OM"/* 118FF */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*36996*/"ZANABAZAR SQUARE LETTER A"/* 11A00 */,/*36997*/"ZANABAZAR SQUARE VOWEL SIGN I"/* 11A01 */, /*36998*/"ZANABAZAR SQUARE VOWEL SIGN UE"/* 11A02 */,/*36999*/"ZANABAZAR SQUARE VOWEL SIGN U"/* 11A03 */, /*37000*/"ZANABAZAR SQUARE VOWEL SIGN E"/* 11A04 */,/*37001*/"ZANABAZAR SQUARE VOWEL SIGN OE"/* 11A05 */, /*37002*/"ZANABAZAR SQUARE VOWEL SIGN O"/* 11A06 */,/*37003*/"ZANABAZAR SQUARE VOWEL SIGN AI"/* 11A07 */, /*37004*/"ZANABAZAR SQUARE VOWEL SIGN AU"/* 11A08 */,/*37005*/"ZANABAZAR SQUARE VOWEL SIGN REVERSED I"/* 11A09 */, /*37006*/"ZANABAZAR SQUARE VOWEL LENGTH MARK"/* 11A0A */,/*37007*/"ZANABAZAR SQUARE LETTER KA"/* 11A0B */, /*37008*/"ZANABAZAR SQUARE LETTER KHA"/* 11A0C */,/*37009*/"ZANABAZAR SQUARE LETTER GA"/* 11A0D */, /*37010*/"ZANABAZAR SQUARE LETTER GHA"/* 11A0E */,/*37011*/"ZANABAZAR SQUARE LETTER NGA"/* 11A0F */, /*37012*/"ZANABAZAR SQUARE LETTER CA"/* 11A10 */,/*37013*/"ZANABAZAR SQUARE LETTER CHA"/* 11A11 */, /*37014*/"ZANABAZAR SQUARE LETTER JA"/* 11A12 */,/*37015*/"ZANABAZAR SQUARE LETTER NYA"/* 11A13 */, /*37016*/"ZANABAZAR SQUARE LETTER TTA"/* 11A14 */,/*37017*/"ZANABAZAR SQUARE LETTER TTHA"/* 11A15 */, /*37018*/"ZANABAZAR SQUARE LETTER DDA"/* 11A16 */,/*37019*/"ZANABAZAR SQUARE LETTER DDHA"/* 11A17 */, /*37020*/"ZANABAZAR SQUARE LETTER NNA"/* 11A18 */,/*37021*/"ZANABAZAR SQUARE LETTER TA"/* 11A19 */, /*37022*/"ZANABAZAR SQUARE LETTER THA"/* 11A1A */,/*37023*/"ZANABAZAR SQUARE LETTER DA"/* 11A1B */, /*37024*/"ZANABAZAR SQUARE LETTER DHA"/* 11A1C */,/*37025*/"ZANABAZAR SQUARE LETTER NA"/* 11A1D */, /*37026*/"ZANABAZAR SQUARE LETTER PA"/* 11A1E */,/*37027*/"ZANABAZAR SQUARE LETTER PHA"/* 11A1F */, /*37028*/"ZANABAZAR SQUARE LETTER BA"/* 11A20 */,/*37029*/"ZANABAZAR SQUARE LETTER BHA"/* 11A21 */, /*37030*/"ZANABAZAR SQUARE LETTER MA"/* 11A22 */,/*37031*/"ZANABAZAR SQUARE LETTER TSA"/* 11A23 */, /*37032*/"ZANABAZAR SQUARE LETTER TSHA"/* 11A24 */,/*37033*/"ZANABAZAR SQUARE LETTER DZA"/* 11A25 */, /*37034*/"ZANABAZAR SQUARE LETTER DZHA"/* 11A26 */,/*37035*/"ZANABAZAR SQUARE LETTER ZHA"/* 11A27 */, /*37036*/"ZANABAZAR SQUARE LETTER ZA"/* 11A28 */,/*37037*/"ZANABAZAR SQUARE LETTER -A"/* 11A29 */, /*37038*/"ZANABAZAR SQUARE LETTER YA"/* 11A2A */,/*37039*/"ZANABAZAR SQUARE LETTER RA"/* 11A2B */, /*37040*/"ZANABAZAR SQUARE LETTER LA"/* 11A2C */,/*37041*/"ZANABAZAR SQUARE LETTER VA"/* 11A2D */, /*37042*/"ZANABAZAR SQUARE LETTER SHA"/* 11A2E */,/*37043*/"ZANABAZAR SQUARE LETTER SSA"/* 11A2F */, /*37044*/"ZANABAZAR SQUARE LETTER SA"/* 11A30 */,/*37045*/"ZANABAZAR SQUARE LETTER HA"/* 11A31 */, /*37046*/"ZANABAZAR SQUARE LETTER KSSA"/* 11A32 */,/*37047*/"ZANABAZAR SQUARE FINAL CONSONANT MARK"/* 11A33 */, /*37048*/"ZANABAZAR SQUARE SIGN VIRAMA"/* 11A34 */,/*37049*/"ZANABAZAR SQUARE SIGN CANDRABINDU"/* 11A35 */, /*37050*/"ZANABAZAR SQUARE SIGN CANDRABINDU WITH ORNAMENT"/* 11A36 */, /*37051*/"ZANABAZAR SQUARE SIGN CANDRA WITH ORNAMENT"/* 11A37 */,/*37052*/"ZANABAZAR SQUARE SIGN ANUSVARA"/* 11A38 */, /*37053*/"ZANABAZAR SQUARE SIGN VISARGA"/* 11A39 */,/*37054*/"ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA"/* 11A3A */, /*37055*/"ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA"/* 11A3B */, /*37056*/"ZANABAZAR SQUARE CLUSTER-FINAL LETTER RA"/* 11A3C */, /*37057*/"ZANABAZAR SQUARE CLUSTER-FINAL LETTER LA"/* 11A3D */, /*37058*/"ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA"/* 11A3E */,/*37059*/"ZANABAZAR SQUARE INITIAL HEAD MARK"/* 11A3F */, /*37060*/"ZANABAZAR SQUARE CLOSING HEAD MARK"/* 11A40 */,/*37061*/"ZANABAZAR SQUARE MARK TSHEG"/* 11A41 */, /*37062*/"ZANABAZAR SQUARE MARK SHAD"/* 11A42 */,/*37063*/"ZANABAZAR SQUARE MARK DOUBLE SHAD"/* 11A43 */, /*37064*/"ZANABAZAR SQUARE MARK LONG TSHEG"/* 11A44 */, /*37065*/"ZANABAZAR SQUARE INITIAL DOUBLE-LINED HEAD MARK"/* 11A45 */, /*37066*/"ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK"/* 11A46 */,/*37067*/"ZANABAZAR SQUARE SUBJOINER"/* 11A47 */, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*37076*/"SOYOMBO LETTER A"/* 11A50 */, /*37077*/"SOYOMBO VOWEL SIGN I"/* 11A51 */,/*37078*/"SOYOMBO VOWEL SIGN UE"/* 11A52 */, /*37079*/"SOYOMBO VOWEL SIGN U"/* 11A53 */,/*37080*/"SOYOMBO VOWEL SIGN E"/* 11A54 */, /*37081*/"SOYOMBO VOWEL SIGN O"/* 11A55 */,/*37082*/"SOYOMBO VOWEL SIGN OE"/* 11A56 */, /*37083*/"SOYOMBO VOWEL SIGN AI"/* 11A57 */,/*37084*/"SOYOMBO VOWEL SIGN AU"/* 11A58 */, /*37085*/"SOYOMBO VOWEL SIGN VOCALIC R"/* 11A59 */,/*37086*/"SOYOMBO VOWEL SIGN VOCALIC L"/* 11A5A */, /*37087*/"SOYOMBO VOWEL LENGTH MARK"/* 11A5B */,/*37088*/"SOYOMBO LETTER KA"/* 11A5C */, /*37089*/"SOYOMBO LETTER KHA"/* 11A5D */,/*37090*/"SOYOMBO LETTER GA"/* 11A5E */, /*37091*/"SOYOMBO LETTER GHA"/* 11A5F */,/*37092*/"SOYOMBO LETTER NGA"/* 11A60 */, /*37093*/"SOYOMBO LETTER CA"/* 11A61 */,/*37094*/"SOYOMBO LETTER CHA"/* 11A62 */,/*37095*/"SOYOMBO LETTER JA"/* 11A63 */, /*37096*/"SOYOMBO LETTER JHA"/* 11A64 */,/*37097*/"SOYOMBO LETTER NYA"/* 11A65 */, /*37098*/"SOYOMBO LETTER TTA"/* 11A66 */,/*37099*/"SOYOMBO LETTER TTHA"/* 11A67 */, /*37100*/"SOYOMBO LETTER DDA"/* 11A68 */,/*37101*/"SOYOMBO LETTER DDHA"/* 11A69 */, /*37102*/"SOYOMBO LETTER NNA"/* 11A6A */,/*37103*/"SOYOMBO LETTER TA"/* 11A6B */, /*37104*/"SOYOMBO LETTER THA"/* 11A6C */,/*37105*/"SOYOMBO LETTER DA"/* 11A6D */, /*37106*/"SOYOMBO LETTER DHA"/* 11A6E */,/*37107*/"SOYOMBO LETTER NA"/* 11A6F */,/*37108*/"SOYOMBO LETTER PA"/* 11A70 */, /*37109*/"SOYOMBO LETTER PHA"/* 11A71 */,/*37110*/"SOYOMBO LETTER BA"/* 11A72 */, /*37111*/"SOYOMBO LETTER BHA"/* 11A73 */,/*37112*/"SOYOMBO LETTER MA"/* 11A74 */, /*37113*/"SOYOMBO LETTER TSA"/* 11A75 */,/*37114*/"SOYOMBO LETTER TSHA"/* 11A76 */, /*37115*/"SOYOMBO LETTER DZA"/* 11A77 */,/*37116*/"SOYOMBO LETTER ZHA"/* 11A78 */, /*37117*/"SOYOMBO LETTER ZA"/* 11A79 */,/*37118*/"SOYOMBO LETTER -A"/* 11A7A */,/*37119*/"SOYOMBO LETTER YA"/* 11A7B */, /*37120*/"SOYOMBO LETTER RA"/* 11A7C */,/*37121*/"SOYOMBO LETTER LA"/* 11A7D */,/*37122*/"SOYOMBO LETTER VA"/* 11A7E */, /*37123*/"SOYOMBO LETTER SHA"/* 11A7F */,/*37124*/"SOYOMBO LETTER SSA"/* 11A80 */, /*37125*/"SOYOMBO LETTER SA"/* 11A81 */,/*37126*/"SOYOMBO LETTER HA"/* 11A82 */, /*37127*/"SOYOMBO LETTER KSSA"/* 11A83 */,NULL,NULL,/*37130*/"SOYOMBO CLUSTER-INITIAL LETTER RA"/* 11A86 */, /*37131*/"SOYOMBO CLUSTER-INITIAL LETTER LA"/* 11A87 */,/*37132*/"SOYOMBO CLUSTER-INITIAL LETTER SHA"/* 11A88 */, /*37133*/"SOYOMBO CLUSTER-INITIAL LETTER SA"/* 11A89 */,/*37134*/"SOYOMBO FINAL CONSONANT SIGN G"/* 11A8A */, /*37135*/"SOYOMBO FINAL CONSONANT SIGN K"/* 11A8B */,/*37136*/"SOYOMBO FINAL CONSONANT SIGN NG"/* 11A8C */, /*37137*/"SOYOMBO FINAL CONSONANT SIGN D"/* 11A8D */,/*37138*/"SOYOMBO FINAL CONSONANT SIGN N"/* 11A8E */, /*37139*/"SOYOMBO FINAL CONSONANT SIGN B"/* 11A8F */,/*37140*/"SOYOMBO FINAL CONSONANT SIGN M"/* 11A90 */, /*37141*/"SOYOMBO FINAL CONSONANT SIGN R"/* 11A91 */,/*37142*/"SOYOMBO FINAL CONSONANT SIGN L"/* 11A92 */, /*37143*/"SOYOMBO FINAL CONSONANT SIGN SH"/* 11A93 */,/*37144*/"SOYOMBO FINAL CONSONANT SIGN S"/* 11A94 */, /*37145*/"SOYOMBO FINAL CONSONANT SIGN -A"/* 11A95 */,/*37146*/"SOYOMBO SIGN ANUSVARA"/* 11A96 */, /*37147*/"SOYOMBO SIGN VISARGA"/* 11A97 */,/*37148*/"SOYOMBO GEMINATION MARK"/* 11A98 */, /*37149*/"SOYOMBO SUBJOINER"/* 11A99 */,/*37150*/"SOYOMBO MARK TSHEG"/* 11A9A */,/*37151*/"SOYOMBO MARK SHAD"/* 11A9B */, /*37152*/"SOYOMBO MARK DOUBLE SHAD"/* 11A9C */,NULL, /*37154*/"SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME"/* 11A9E */, /*37155*/"SOYOMBO HEAD MARK WITH MOON AND SUN AND FLAME"/* 11A9F */, /*37156*/"SOYOMBO HEAD MARK WITH MOON AND SUN"/* 11AA0 */,/*37157*/"SOYOMBO TERMINAL MARK-1"/* 11AA1 */, /*37158*/"SOYOMBO TERMINAL MARK-2"/* 11AA2 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*37188*/"PAU CIN HAU LETTER PA"/* 11AC0 */, /*37189*/"PAU CIN HAU LETTER KA"/* 11AC1 */,/*37190*/"PAU CIN HAU LETTER LA"/* 11AC2 */, /*37191*/"PAU CIN HAU LETTER MA"/* 11AC3 */,/*37192*/"PAU CIN HAU LETTER DA"/* 11AC4 */, /*37193*/"PAU CIN HAU LETTER ZA"/* 11AC5 */,/*37194*/"PAU CIN HAU LETTER VA"/* 11AC6 */, /*37195*/"PAU CIN HAU LETTER NGA"/* 11AC7 */,/*37196*/"PAU CIN HAU LETTER HA"/* 11AC8 */, /*37197*/"PAU CIN HAU LETTER GA"/* 11AC9 */,/*37198*/"PAU CIN HAU LETTER KHA"/* 11ACA */, /*37199*/"PAU CIN HAU LETTER SA"/* 11ACB */,/*37200*/"PAU CIN HAU LETTER BA"/* 11ACC */, /*37201*/"PAU CIN HAU LETTER CA"/* 11ACD */,/*37202*/"PAU CIN HAU LETTER TA"/* 11ACE */, /*37203*/"PAU CIN HAU LETTER THA"/* 11ACF */,/*37204*/"PAU CIN HAU LETTER NA"/* 11AD0 */, /*37205*/"PAU CIN HAU LETTER PHA"/* 11AD1 */,/*37206*/"PAU CIN HAU LETTER RA"/* 11AD2 */, /*37207*/"PAU CIN HAU LETTER FA"/* 11AD3 */,/*37208*/"PAU CIN HAU LETTER CHA"/* 11AD4 */, /*37209*/"PAU CIN HAU LETTER A"/* 11AD5 */,/*37210*/"PAU CIN HAU LETTER E"/* 11AD6 */, /*37211*/"PAU CIN HAU LETTER I"/* 11AD7 */,/*37212*/"PAU CIN HAU LETTER O"/* 11AD8 */, /*37213*/"PAU CIN HAU LETTER U"/* 11AD9 */,/*37214*/"PAU CIN HAU LETTER UA"/* 11ADA */, /*37215*/"PAU CIN HAU LETTER IA"/* 11ADB */,/*37216*/"PAU CIN HAU LETTER FINAL P"/* 11ADC */, /*37217*/"PAU CIN HAU LETTER FINAL K"/* 11ADD */,/*37218*/"PAU CIN HAU LETTER FINAL T"/* 11ADE */, /*37219*/"PAU CIN HAU LETTER FINAL M"/* 11ADF */,/*37220*/"PAU CIN HAU LETTER FINAL N"/* 11AE0 */, /*37221*/"PAU CIN HAU LETTER FINAL L"/* 11AE1 */,/*37222*/"PAU CIN HAU LETTER FINAL W"/* 11AE2 */, /*37223*/"PAU CIN HAU LETTER FINAL NG"/* 11AE3 */,/*37224*/"PAU CIN HAU LETTER FINAL Y"/* 11AE4 */, /*37225*/"PAU CIN HAU RISING TONE LONG"/* 11AE5 */,/*37226*/"PAU CIN HAU RISING TONE"/* 11AE6 */, /*37227*/"PAU CIN HAU SANDHI GLOTTAL STOP"/* 11AE7 */,/*37228*/"PAU CIN HAU RISING TONE LONG FINAL"/* 11AE8 */, /*37229*/"PAU CIN HAU RISING TONE FINAL"/* 11AE9 */,/*37230*/"PAU CIN HAU SANDHI GLOTTAL STOP FINAL"/* 11AEA */, /*37231*/"PAU CIN HAU SANDHI TONE LONG"/* 11AEB */,/*37232*/"PAU CIN HAU SANDHI TONE"/* 11AEC */, /*37233*/"PAU CIN HAU SANDHI TONE LONG FINAL"/* 11AED */,/*37234*/"PAU CIN HAU SANDHI TONE FINAL"/* 11AEE */, /*37235*/"PAU CIN HAU MID-LEVEL TONE"/* 11AEF */,/*37236*/"PAU CIN HAU GLOTTAL STOP VARIANT"/* 11AF0 */, /*37237*/"PAU CIN HAU MID-LEVEL TONE LONG FINAL"/* 11AF1 */,/*37238*/"PAU CIN HAU MID-LEVEL TONE FINAL"/* 11AF2 */, /*37239*/"PAU CIN HAU LOW-FALLING TONE LONG"/* 11AF3 */,/*37240*/"PAU CIN HAU LOW-FALLING TONE"/* 11AF4 */, /*37241*/"PAU CIN HAU GLOTTAL STOP"/* 11AF5 */,/*37242*/"PAU CIN HAU LOW-FALLING TONE LONG FINAL"/* 11AF6 */, /*37243*/"PAU CIN HAU LOW-FALLING TONE FINAL"/* 11AF7 */,/*37244*/"PAU CIN HAU GLOTTAL STOP FINAL"/* 11AF8 */,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*37508*/"BHAIKSUKI LETTER A"/* 11C00 */,/*37509*/"BHAIKSUKI LETTER AA"/* 11C01 */, /*37510*/"BHAIKSUKI LETTER I"/* 11C02 */,/*37511*/"BHAIKSUKI LETTER II"/* 11C03 */, /*37512*/"BHAIKSUKI LETTER U"/* 11C04 */,/*37513*/"BHAIKSUKI LETTER UU"/* 11C05 */, /*37514*/"BHAIKSUKI LETTER VOCALIC R"/* 11C06 */,/*37515*/"BHAIKSUKI LETTER VOCALIC RR"/* 11C07 */, /*37516*/"BHAIKSUKI LETTER VOCALIC L"/* 11C08 */,NULL,/*37518*/"BHAIKSUKI LETTER E"/* 11C0A */, /*37519*/"BHAIKSUKI LETTER AI"/* 11C0B */,/*37520*/"BHAIKSUKI LETTER O"/* 11C0C */, /*37521*/"BHAIKSUKI LETTER AU"/* 11C0D */,/*37522*/"BHAIKSUKI LETTER KA"/* 11C0E */, /*37523*/"BHAIKSUKI LETTER KHA"/* 11C0F */,/*37524*/"BHAIKSUKI LETTER GA"/* 11C10 */, /*37525*/"BHAIKSUKI LETTER GHA"/* 11C11 */,/*37526*/"BHAIKSUKI LETTER NGA"/* 11C12 */, /*37527*/"BHAIKSUKI LETTER CA"/* 11C13 */,/*37528*/"BHAIKSUKI LETTER CHA"/* 11C14 */, /*37529*/"BHAIKSUKI LETTER JA"/* 11C15 */,/*37530*/"BHAIKSUKI LETTER JHA"/* 11C16 */, /*37531*/"BHAIKSUKI LETTER NYA"/* 11C17 */,/*37532*/"BHAIKSUKI LETTER TTA"/* 11C18 */, /*37533*/"BHAIKSUKI LETTER TTHA"/* 11C19 */,/*37534*/"BHAIKSUKI LETTER DDA"/* 11C1A */, /*37535*/"BHAIKSUKI LETTER DDHA"/* 11C1B */,/*37536*/"BHAIKSUKI LETTER NNA"/* 11C1C */, /*37537*/"BHAIKSUKI LETTER TA"/* 11C1D */,/*37538*/"BHAIKSUKI LETTER THA"/* 11C1E */, /*37539*/"BHAIKSUKI LETTER DA"/* 11C1F */,/*37540*/"BHAIKSUKI LETTER DHA"/* 11C20 */, /*37541*/"BHAIKSUKI LETTER NA"/* 11C21 */,/*37542*/"BHAIKSUKI LETTER PA"/* 11C22 */, /*37543*/"BHAIKSUKI LETTER PHA"/* 11C23 */,/*37544*/"BHAIKSUKI LETTER BA"/* 11C24 */, /*37545*/"BHAIKSUKI LETTER BHA"/* 11C25 */,/*37546*/"BHAIKSUKI LETTER MA"/* 11C26 */, /*37547*/"BHAIKSUKI LETTER YA"/* 11C27 */,/*37548*/"BHAIKSUKI LETTER RA"/* 11C28 */, /*37549*/"BHAIKSUKI LETTER LA"/* 11C29 */,/*37550*/"BHAIKSUKI LETTER VA"/* 11C2A */, /*37551*/"BHAIKSUKI LETTER SHA"/* 11C2B */,/*37552*/"BHAIKSUKI LETTER SSA"/* 11C2C */, /*37553*/"BHAIKSUKI LETTER SA"/* 11C2D */,/*37554*/"BHAIKSUKI LETTER HA"/* 11C2E */, /*37555*/"BHAIKSUKI VOWEL SIGN AA"/* 11C2F */,/*37556*/"BHAIKSUKI VOWEL SIGN I"/* 11C30 */, /*37557*/"BHAIKSUKI VOWEL SIGN II"/* 11C31 */,/*37558*/"BHAIKSUKI VOWEL SIGN U"/* 11C32 */, /*37559*/"BHAIKSUKI VOWEL SIGN UU"/* 11C33 */,/*37560*/"BHAIKSUKI VOWEL SIGN VOCALIC R"/* 11C34 */, /*37561*/"BHAIKSUKI VOWEL SIGN VOCALIC RR"/* 11C35 */,/*37562*/"BHAIKSUKI VOWEL SIGN VOCALIC L"/* 11C36 */,NULL, /*37564*/"BHAIKSUKI VOWEL SIGN E"/* 11C38 */,/*37565*/"BHAIKSUKI VOWEL SIGN AI"/* 11C39 */, /*37566*/"BHAIKSUKI VOWEL SIGN O"/* 11C3A */,/*37567*/"BHAIKSUKI VOWEL SIGN AU"/* 11C3B */, /*37568*/"BHAIKSUKI SIGN CANDRABINDU"/* 11C3C */,/*37569*/"BHAIKSUKI SIGN ANUSVARA"/* 11C3D */, /*37570*/"BHAIKSUKI SIGN VISARGA"/* 11C3E */,/*37571*/"BHAIKSUKI SIGN VIRAMA"/* 11C3F */, /*37572*/"BHAIKSUKI SIGN AVAGRAHA"/* 11C40 */,/*37573*/"BHAIKSUKI DANDA"/* 11C41 */, /*37574*/"BHAIKSUKI DOUBLE DANDA"/* 11C42 */,/*37575*/"BHAIKSUKI WORD SEPARATOR"/* 11C43 */, /*37576*/"BHAIKSUKI GAP FILLER-1"/* 11C44 */,/*37577*/"BHAIKSUKI GAP FILLER-2"/* 11C45 */,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,/*37588*/"BHAIKSUKI DIGIT ZERO"/* 11C50 */,/*37589*/"BHAIKSUKI DIGIT ONE"/* 11C51 */, /*37590*/"BHAIKSUKI DIGIT TWO"/* 11C52 */,/*37591*/"BHAIKSUKI DIGIT THREE"/* 11C53 */, /*37592*/"BHAIKSUKI DIGIT FOUR"/* 11C54 */,/*37593*/"BHAIKSUKI DIGIT FIVE"/* 11C55 */, /*37594*/"BHAIKSUKI DIGIT SIX"/* 11C56 */,/*37595*/"BHAIKSUKI DIGIT SEVEN"/* 11C57 */, /*37596*/"BHAIKSUKI DIGIT EIGHT"/* 11C58 */,/*37597*/"BHAIKSUKI DIGIT NINE"/* 11C59 */, /*37598*/"BHAIKSUKI NUMBER ONE"/* 11C5A */,/*37599*/"BHAIKSUKI NUMBER TWO"/* 11C5B */, /*37600*/"BHAIKSUKI NUMBER THREE"/* 11C5C */,/*37601*/"BHAIKSUKI NUMBER FOUR"/* 11C5D */, /*37602*/"BHAIKSUKI NUMBER FIVE"/* 11C5E */,/*37603*/"BHAIKSUKI NUMBER SIX"/* 11C5F */, /*37604*/"BHAIKSUKI NUMBER SEVEN"/* 11C60 */,/*37605*/"BHAIKSUKI NUMBER EIGHT"/* 11C61 */, /*37606*/"BHAIKSUKI NUMBER NINE"/* 11C62 */,/*37607*/"BHAIKSUKI NUMBER TEN"/* 11C63 */, /*37608*/"BHAIKSUKI NUMBER TWENTY"/* 11C64 */,/*37609*/"BHAIKSUKI NUMBER THIRTY"/* 11C65 */, /*37610*/"BHAIKSUKI NUMBER FORTY"/* 11C66 */,/*37611*/"BHAIKSUKI NUMBER FIFTY"/* 11C67 */, /*37612*/"BHAIKSUKI NUMBER SIXTY"/* 11C68 */,/*37613*/"BHAIKSUKI NUMBER SEVENTY"/* 11C69 */, /*37614*/"BHAIKSUKI NUMBER EIGHTY"/* 11C6A */,/*37615*/"BHAIKSUKI NUMBER NINETY"/* 11C6B */, /*37616*/"BHAIKSUKI HUNDREDS UNIT MARK"/* 11C6C */,NULL,NULL,NULL,/*37620*/"MARCHEN HEAD MARK"/* 11C70 */, /*37621*/"MARCHEN MARK SHAD"/* 11C71 */,/*37622*/"MARCHEN LETTER KA"/* 11C72 */,/*37623*/"MARCHEN LETTER KHA"/* 11C73 */, /*37624*/"MARCHEN LETTER GA"/* 11C74 */,/*37625*/"MARCHEN LETTER NGA"/* 11C75 */,/*37626*/"MARCHEN LETTER CA"/* 11C76 */, /*37627*/"MARCHEN LETTER CHA"/* 11C77 */,/*37628*/"MARCHEN LETTER JA"/* 11C78 */, /*37629*/"MARCHEN LETTER NYA"/* 11C79 */,/*37630*/"MARCHEN LETTER TA"/* 11C7A */, /*37631*/"MARCHEN LETTER THA"/* 11C7B */,/*37632*/"MARCHEN LETTER DA"/* 11C7C */,/*37633*/"MARCHEN LETTER NA"/* 11C7D */, /*37634*/"MARCHEN LETTER PA"/* 11C7E */,/*37635*/"MARCHEN LETTER PHA"/* 11C7F */,/*37636*/"MARCHEN LETTER BA"/* 11C80 */, /*37637*/"MARCHEN LETTER MA"/* 11C81 */,/*37638*/"MARCHEN LETTER TSA"/* 11C82 */, /*37639*/"MARCHEN LETTER TSHA"/* 11C83 */,/*37640*/"MARCHEN LETTER DZA"/* 11C84 */, /*37641*/"MARCHEN LETTER WA"/* 11C85 */,/*37642*/"MARCHEN LETTER ZHA"/* 11C86 */,/*37643*/"MARCHEN LETTER ZA"/* 11C87 */, /*37644*/"MARCHEN LETTER -A"/* 11C88 */,/*37645*/"MARCHEN LETTER YA"/* 11C89 */,/*37646*/"MARCHEN LETTER RA"/* 11C8A */, /*37647*/"MARCHEN LETTER LA"/* 11C8B */,/*37648*/"MARCHEN LETTER SHA"/* 11C8C */,/*37649*/"MARCHEN LETTER SA"/* 11C8D */, /*37650*/"MARCHEN LETTER HA"/* 11C8E */,/*37651*/"MARCHEN LETTER A"/* 11C8F */,NULL,NULL, /*37654*/"MARCHEN SUBJOINED LETTER KA"/* 11C92 */,/*37655*/"MARCHEN SUBJOINED LETTER KHA"/* 11C93 */, /*37656*/"MARCHEN SUBJOINED LETTER GA"/* 11C94 */,/*37657*/"MARCHEN SUBJOINED LETTER NGA"/* 11C95 */, /*37658*/"MARCHEN SUBJOINED LETTER CA"/* 11C96 */,/*37659*/"MARCHEN SUBJOINED LETTER CHA"/* 11C97 */, /*37660*/"MARCHEN SUBJOINED LETTER JA"/* 11C98 */,/*37661*/"MARCHEN SUBJOINED LETTER NYA"/* 11C99 */, /*37662*/"MARCHEN SUBJOINED LETTER TA"/* 11C9A */,/*37663*/"MARCHEN SUBJOINED LETTER THA"/* 11C9B */, /*37664*/"MARCHEN SUBJOINED LETTER DA"/* 11C9C */,/*37665*/"MARCHEN SUBJOINED LETTER NA"/* 11C9D */, /*37666*/"MARCHEN SUBJOINED LETTER PA"/* 11C9E */,/*37667*/"MARCHEN SUBJOINED LETTER PHA"/* 11C9F */, /*37668*/"MARCHEN SUBJOINED LETTER BA"/* 11CA0 */,/*37669*/"MARCHEN SUBJOINED LETTER MA"/* 11CA1 */, /*37670*/"MARCHEN SUBJOINED LETTER TSA"/* 11CA2 */,/*37671*/"MARCHEN SUBJOINED LETTER TSHA"/* 11CA3 */, /*37672*/"MARCHEN SUBJOINED LETTER DZA"/* 11CA4 */,/*37673*/"MARCHEN SUBJOINED LETTER WA"/* 11CA5 */, /*37674*/"MARCHEN SUBJOINED LETTER ZHA"/* 11CA6 */,/*37675*/"MARCHEN SUBJOINED LETTER ZA"/* 11CA7 */,NULL, /*37677*/"MARCHEN SUBJOINED LETTER YA"/* 11CA9 */,/*37678*/"MARCHEN SUBJOINED LETTER RA"/* 11CAA */, /*37679*/"MARCHEN SUBJOINED LETTER LA"/* 11CAB */,/*37680*/"MARCHEN SUBJOINED LETTER SHA"/* 11CAC */, /*37681*/"MARCHEN SUBJOINED LETTER SA"/* 11CAD */,/*37682*/"MARCHEN SUBJOINED LETTER HA"/* 11CAE */, /*37683*/"MARCHEN SUBJOINED LETTER A"/* 11CAF */,/*37684*/"MARCHEN VOWEL SIGN AA"/* 11CB0 */, /*37685*/"MARCHEN VOWEL SIGN I"/* 11CB1 */,/*37686*/"MARCHEN VOWEL SIGN U"/* 11CB2 */, /*37687*/"MARCHEN VOWEL SIGN E"/* 11CB3 */,/*37688*/"MARCHEN VOWEL SIGN O"/* 11CB4 */, /*37689*/"MARCHEN SIGN ANUSVARA"/* 11CB5 */,/*37690*/"MARCHEN SIGN CANDRABINDU"/* 11CB6 */,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*37764*/"MASARAM GONDI LETTER A"/* 11D00 */,/*37765*/"MASARAM GONDI LETTER AA"/* 11D01 */, /*37766*/"MASARAM GONDI LETTER I"/* 11D02 */,/*37767*/"MASARAM GONDI LETTER II"/* 11D03 */, /*37768*/"MASARAM GONDI LETTER U"/* 11D04 */,/*37769*/"MASARAM GONDI LETTER UU"/* 11D05 */, /*37770*/"MASARAM GONDI LETTER E"/* 11D06 */,NULL,/*37772*/"MASARAM GONDI LETTER AI"/* 11D08 */, /*37773*/"MASARAM GONDI LETTER O"/* 11D09 */,NULL,/*37775*/"MASARAM GONDI LETTER AU"/* 11D0B */, /*37776*/"MASARAM GONDI LETTER KA"/* 11D0C */,/*37777*/"MASARAM GONDI LETTER KHA"/* 11D0D */, /*37778*/"MASARAM GONDI LETTER GA"/* 11D0E */,/*37779*/"MASARAM GONDI LETTER GHA"/* 11D0F */, /*37780*/"MASARAM GONDI LETTER NGA"/* 11D10 */,/*37781*/"MASARAM GONDI LETTER CA"/* 11D11 */, /*37782*/"MASARAM GONDI LETTER CHA"/* 11D12 */,/*37783*/"MASARAM GONDI LETTER JA"/* 11D13 */, /*37784*/"MASARAM GONDI LETTER JHA"/* 11D14 */,/*37785*/"MASARAM GONDI LETTER NYA"/* 11D15 */, /*37786*/"MASARAM GONDI LETTER TTA"/* 11D16 */,/*37787*/"MASARAM GONDI LETTER TTHA"/* 11D17 */, /*37788*/"MASARAM GONDI LETTER DDA"/* 11D18 */,/*37789*/"MASARAM GONDI LETTER DDHA"/* 11D19 */, /*37790*/"MASARAM GONDI LETTER NNA"/* 11D1A */,/*37791*/"MASARAM GONDI LETTER TA"/* 11D1B */, /*37792*/"MASARAM GONDI LETTER THA"/* 11D1C */,/*37793*/"MASARAM GONDI LETTER DA"/* 11D1D */, /*37794*/"MASARAM GONDI LETTER DHA"/* 11D1E */,/*37795*/"MASARAM GONDI LETTER NA"/* 11D1F */, /*37796*/"MASARAM GONDI LETTER PA"/* 11D20 */,/*37797*/"MASARAM GONDI LETTER PHA"/* 11D21 */, /*37798*/"MASARAM GONDI LETTER BA"/* 11D22 */,/*37799*/"MASARAM GONDI LETTER BHA"/* 11D23 */, /*37800*/"MASARAM GONDI LETTER MA"/* 11D24 */,/*37801*/"MASARAM GONDI LETTER YA"/* 11D25 */, /*37802*/"MASARAM GONDI LETTER RA"/* 11D26 */,/*37803*/"MASARAM GONDI LETTER LA"/* 11D27 */, /*37804*/"MASARAM GONDI LETTER VA"/* 11D28 */,/*37805*/"MASARAM GONDI LETTER SHA"/* 11D29 */, /*37806*/"MASARAM GONDI LETTER SSA"/* 11D2A */,/*37807*/"MASARAM GONDI LETTER SA"/* 11D2B */, /*37808*/"MASARAM GONDI LETTER HA"/* 11D2C */,/*37809*/"MASARAM GONDI LETTER LLA"/* 11D2D */, /*37810*/"MASARAM GONDI LETTER KSSA"/* 11D2E */,/*37811*/"MASARAM GONDI LETTER JNYA"/* 11D2F */, /*37812*/"MASARAM GONDI LETTER TRA"/* 11D30 */,/*37813*/"MASARAM GONDI VOWEL SIGN AA"/* 11D31 */, /*37814*/"MASARAM GONDI VOWEL SIGN I"/* 11D32 */,/*37815*/"MASARAM GONDI VOWEL SIGN II"/* 11D33 */, /*37816*/"MASARAM GONDI VOWEL SIGN U"/* 11D34 */,/*37817*/"MASARAM GONDI VOWEL SIGN UU"/* 11D35 */, /*37818*/"MASARAM GONDI VOWEL SIGN VOCALIC R"/* 11D36 */,NULL,NULL,NULL,/*37822*/"MASARAM GONDI VOWEL SIGN E"/* 11D3A */, NULL,/*37824*/"MASARAM GONDI VOWEL SIGN AI"/* 11D3C */,/*37825*/"MASARAM GONDI VOWEL SIGN O"/* 11D3D */,NULL, /*37827*/"MASARAM GONDI VOWEL SIGN AU"/* 11D3F */,/*37828*/"MASARAM GONDI SIGN ANUSVARA"/* 11D40 */, /*37829*/"MASARAM GONDI SIGN VISARGA"/* 11D41 */,/*37830*/"MASARAM GONDI SIGN NUKTA"/* 11D42 */, /*37831*/"MASARAM GONDI SIGN CANDRA"/* 11D43 */,/*37832*/"MASARAM GONDI SIGN HALANTA"/* 11D44 */, /*37833*/"MASARAM GONDI VIRAMA"/* 11D45 */,/*37834*/"MASARAM GONDI REPHA"/* 11D46 */, /*37835*/"MASARAM GONDI RA-KARA"/* 11D47 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*37844*/"MASARAM GONDI DIGIT ZERO"/* 11D50 */,/*37845*/"MASARAM GONDI DIGIT ONE"/* 11D51 */, /*37846*/"MASARAM GONDI DIGIT TWO"/* 11D52 */,/*37847*/"MASARAM GONDI DIGIT THREE"/* 11D53 */, /*37848*/"MASARAM GONDI DIGIT FOUR"/* 11D54 */,/*37849*/"MASARAM GONDI DIGIT FIVE"/* 11D55 */, /*37850*/"MASARAM GONDI DIGIT SIX"/* 11D56 */,/*37851*/"MASARAM GONDI DIGIT SEVEN"/* 11D57 */, /*37852*/"MASARAM GONDI DIGIT EIGHT"/* 11D58 */,/*37853*/"MASARAM GONDI DIGIT NINE"/* 11D59 */,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,/*38532*/"CUNEIFORM SIGN A"/* 12000 */,/*38533*/"CUNEIFORM SIGN A TIMES A"/* 12001 */, /*38534*/"CUNEIFORM SIGN A TIMES BAD"/* 12002 */,/*38535*/"CUNEIFORM SIGN A TIMES GAN2 TENU"/* 12003 */, /*38536*/"CUNEIFORM SIGN A TIMES HA"/* 12004 */,/*38537*/"CUNEIFORM SIGN A TIMES IGI"/* 12005 */, /*38538*/"CUNEIFORM SIGN A TIMES LAGAR GUNU"/* 12006 */,/*38539*/"CUNEIFORM SIGN A TIMES MUSH"/* 12007 */, /*38540*/"CUNEIFORM SIGN A TIMES SAG"/* 12008 */,/*38541*/"CUNEIFORM SIGN A2"/* 12009 */, /*38542*/"CUNEIFORM SIGN AB"/* 1200A */,/*38543*/"CUNEIFORM SIGN AB TIMES ASH2"/* 1200B */, /*38544*/"CUNEIFORM SIGN AB TIMES DUN3 GUNU"/* 1200C */,/*38545*/"CUNEIFORM SIGN AB TIMES GAL"/* 1200D */, /*38546*/"CUNEIFORM SIGN AB TIMES GAN2 TENU"/* 1200E */,/*38547*/"CUNEIFORM SIGN AB TIMES HA"/* 1200F */, /*38548*/"CUNEIFORM SIGN AB TIMES IGI GUNU"/* 12010 */,/*38549*/"CUNEIFORM SIGN AB TIMES IMIN"/* 12011 */, /*38550*/"CUNEIFORM SIGN AB TIMES LAGAB"/* 12012 */,/*38551*/"CUNEIFORM SIGN AB TIMES SHESH"/* 12013 */, /*38552*/"CUNEIFORM SIGN AB TIMES U PLUS U PLUS U"/* 12014 */,/*38553*/"CUNEIFORM SIGN AB GUNU"/* 12015 */, /*38554*/"CUNEIFORM SIGN AB2"/* 12016 */,/*38555*/"CUNEIFORM SIGN AB2 TIMES BALAG"/* 12017 */, /*38556*/"CUNEIFORM SIGN AB2 TIMES GAN2 TENU"/* 12018 */,/*38557*/"CUNEIFORM SIGN AB2 TIMES ME PLUS EN"/* 12019 */, /*38558*/"CUNEIFORM SIGN AB2 TIMES SHA3"/* 1201A */,/*38559*/"CUNEIFORM SIGN AB2 TIMES TAK4"/* 1201B */, /*38560*/"CUNEIFORM SIGN AD"/* 1201C */,/*38561*/"CUNEIFORM SIGN AK"/* 1201D */, /*38562*/"CUNEIFORM SIGN AK TIMES ERIN2"/* 1201E */,/*38563*/"CUNEIFORM SIGN AK TIMES SHITA PLUS GISH"/* 1201F */, /*38564*/"CUNEIFORM SIGN AL"/* 12020 */,/*38565*/"CUNEIFORM SIGN AL TIMES AL"/* 12021 */, /*38566*/"CUNEIFORM SIGN AL TIMES DIM2"/* 12022 */,/*38567*/"CUNEIFORM SIGN AL TIMES GISH"/* 12023 */, /*38568*/"CUNEIFORM SIGN AL TIMES HA"/* 12024 */,/*38569*/"CUNEIFORM SIGN AL TIMES KAD3"/* 12025 */, /*38570*/"CUNEIFORM SIGN AL TIMES KI"/* 12026 */,/*38571*/"CUNEIFORM SIGN AL TIMES SHE"/* 12027 */, /*38572*/"CUNEIFORM SIGN AL TIMES USH"/* 12028 */,/*38573*/"CUNEIFORM SIGN ALAN"/* 12029 */, /*38574*/"CUNEIFORM SIGN ALEPH"/* 1202A */,/*38575*/"CUNEIFORM SIGN AMAR"/* 1202B */, /*38576*/"CUNEIFORM SIGN AMAR TIMES SHE"/* 1202C */,/*38577*/"CUNEIFORM SIGN AN"/* 1202D */, /*38578*/"CUNEIFORM SIGN AN OVER AN"/* 1202E */,/*38579*/"CUNEIFORM SIGN AN THREE TIMES"/* 1202F */, /*38580*/"CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA"/* 12030 */, /*38581*/"CUNEIFORM SIGN AN PLUS NAGA SQUARED"/* 12031 */,/*38582*/"CUNEIFORM SIGN ANSHE"/* 12032 */, /*38583*/"CUNEIFORM SIGN APIN"/* 12033 */,/*38584*/"CUNEIFORM SIGN ARAD"/* 12034 */, /*38585*/"CUNEIFORM SIGN ARAD TIMES KUR"/* 12035 */,/*38586*/"CUNEIFORM SIGN ARKAB"/* 12036 */, /*38587*/"CUNEIFORM SIGN ASAL2"/* 12037 */,/*38588*/"CUNEIFORM SIGN ASH"/* 12038 */, /*38589*/"CUNEIFORM SIGN ASH ZIDA TENU"/* 12039 */,/*38590*/"CUNEIFORM SIGN ASH KABA TENU"/* 1203A */, /*38591*/"CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP"/* 1203B */, /*38592*/"CUNEIFORM SIGN ASH OVER ASH OVER ASH"/* 1203C */, /*38593*/"CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH"/* 1203D */, /*38594*/"CUNEIFORM SIGN ASH2"/* 1203E */,/*38595*/"CUNEIFORM SIGN ASHGAB"/* 1203F */, /*38596*/"CUNEIFORM SIGN BA"/* 12040 */,/*38597*/"CUNEIFORM SIGN BAD"/* 12041 */, /*38598*/"CUNEIFORM SIGN BAG3"/* 12042 */,/*38599*/"CUNEIFORM SIGN BAHAR2"/* 12043 */, /*38600*/"CUNEIFORM SIGN BAL"/* 12044 */,/*38601*/"CUNEIFORM SIGN BAL OVER BAL"/* 12045 */, /*38602*/"CUNEIFORM SIGN BALAG"/* 12046 */,/*38603*/"CUNEIFORM SIGN BAR"/* 12047 */, /*38604*/"CUNEIFORM SIGN BARA2"/* 12048 */,/*38605*/"CUNEIFORM SIGN BI"/* 12049 */, /*38606*/"CUNEIFORM SIGN BI TIMES A"/* 1204A */,/*38607*/"CUNEIFORM SIGN BI TIMES GAR"/* 1204B */, /*38608*/"CUNEIFORM SIGN BI TIMES IGI GUNU"/* 1204C */,/*38609*/"CUNEIFORM SIGN BU"/* 1204D */, /*38610*/"CUNEIFORM SIGN BU OVER BU AB"/* 1204E */,/*38611*/"CUNEIFORM SIGN BU OVER BU UN"/* 1204F */, /*38612*/"CUNEIFORM SIGN BU CROSSING BU"/* 12050 */,/*38613*/"CUNEIFORM SIGN BULUG"/* 12051 */, /*38614*/"CUNEIFORM SIGN BULUG OVER BULUG"/* 12052 */,/*38615*/"CUNEIFORM SIGN BUR"/* 12053 */, /*38616*/"CUNEIFORM SIGN BUR2"/* 12054 */,/*38617*/"CUNEIFORM SIGN DA"/* 12055 */, /*38618*/"CUNEIFORM SIGN DAG"/* 12056 */,/*38619*/"CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH"/* 12057 */, /*38620*/"CUNEIFORM SIGN DAG KISIM5 TIMES AMAR"/* 12058 */,/*38621*/"CUNEIFORM SIGN DAG KISIM5 TIMES BALAG"/* 12059 */, /*38622*/"CUNEIFORM SIGN DAG KISIM5 TIMES BI"/* 1205A */,/*38623*/"CUNEIFORM SIGN DAG KISIM5 TIMES GA"/* 1205B */, /*38624*/"CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH"/* 1205C */, /*38625*/"CUNEIFORM SIGN DAG KISIM5 TIMES GI"/* 1205D */,/*38626*/"CUNEIFORM SIGN DAG KISIM5 TIMES GIR2"/* 1205E */, /*38627*/"CUNEIFORM SIGN DAG KISIM5 TIMES GUD"/* 1205F */,/*38628*/"CUNEIFORM SIGN DAG KISIM5 TIMES HA"/* 12060 */, /*38629*/"CUNEIFORM SIGN DAG KISIM5 TIMES IR"/* 12061 */, /*38630*/"CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU"/* 12062 */, /*38631*/"CUNEIFORM SIGN DAG KISIM5 TIMES KAK"/* 12063 */,/*38632*/"CUNEIFORM SIGN DAG KISIM5 TIMES LA"/* 12064 */, /*38633*/"CUNEIFORM SIGN DAG KISIM5 TIMES LU"/* 12065 */, /*38634*/"CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2"/* 12066 */, /*38635*/"CUNEIFORM SIGN DAG KISIM5 TIMES LUM"/* 12067 */,/*38636*/"CUNEIFORM SIGN DAG KISIM5 TIMES NE"/* 12068 */, /*38637*/"CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP"/* 12069 */, /*38638*/"CUNEIFORM SIGN DAG KISIM5 TIMES SI"/* 1206A */,/*38639*/"CUNEIFORM SIGN DAG KISIM5 TIMES TAK4"/* 1206B */, /*38640*/"CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2"/* 1206C */, /*38641*/"CUNEIFORM SIGN DAG KISIM5 TIMES USH"/* 1206D */,/*38642*/"CUNEIFORM SIGN DAM"/* 1206E */, /*38643*/"CUNEIFORM SIGN DAR"/* 1206F */,/*38644*/"CUNEIFORM SIGN DARA3"/* 12070 */, /*38645*/"CUNEIFORM SIGN DARA4"/* 12071 */,/*38646*/"CUNEIFORM SIGN DI"/* 12072 */, /*38647*/"CUNEIFORM SIGN DIB"/* 12073 */,/*38648*/"CUNEIFORM SIGN DIM"/* 12074 */, /*38649*/"CUNEIFORM SIGN DIM TIMES SHE"/* 12075 */,/*38650*/"CUNEIFORM SIGN DIM2"/* 12076 */, /*38651*/"CUNEIFORM SIGN DIN"/* 12077 */,/*38652*/"CUNEIFORM SIGN DIN KASKAL U GUNU DISH"/* 12078 */, /*38653*/"CUNEIFORM SIGN DISH"/* 12079 */,/*38654*/"CUNEIFORM SIGN DU"/* 1207A */, /*38655*/"CUNEIFORM SIGN DU OVER DU"/* 1207B */,/*38656*/"CUNEIFORM SIGN DU GUNU"/* 1207C */, /*38657*/"CUNEIFORM SIGN DU SHESHIG"/* 1207D */,/*38658*/"CUNEIFORM SIGN DUB"/* 1207E */, /*38659*/"CUNEIFORM SIGN DUB TIMES ESH2"/* 1207F */,/*38660*/"CUNEIFORM SIGN DUB2"/* 12080 */, /*38661*/"CUNEIFORM SIGN DUG"/* 12081 */,/*38662*/"CUNEIFORM SIGN DUGUD"/* 12082 */, /*38663*/"CUNEIFORM SIGN DUH"/* 12083 */,/*38664*/"CUNEIFORM SIGN DUN"/* 12084 */, /*38665*/"CUNEIFORM SIGN DUN3"/* 12085 */,/*38666*/"CUNEIFORM SIGN DUN3 GUNU"/* 12086 */, /*38667*/"CUNEIFORM SIGN DUN3 GUNU GUNU"/* 12087 */,/*38668*/"CUNEIFORM SIGN DUN4"/* 12088 */, /*38669*/"CUNEIFORM SIGN DUR2"/* 12089 */,/*38670*/"CUNEIFORM SIGN E"/* 1208A */, /*38671*/"CUNEIFORM SIGN E TIMES PAP"/* 1208B */,/*38672*/"CUNEIFORM SIGN E OVER E NUN OVER NUN"/* 1208C */, /*38673*/"CUNEIFORM SIGN E2"/* 1208D */,/*38674*/"CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA"/* 1208E */, /*38675*/"CUNEIFORM SIGN E2 TIMES GAR"/* 1208F */,/*38676*/"CUNEIFORM SIGN E2 TIMES MI"/* 12090 */, /*38677*/"CUNEIFORM SIGN E2 TIMES SAL"/* 12091 */,/*38678*/"CUNEIFORM SIGN E2 TIMES SHE"/* 12092 */, /*38679*/"CUNEIFORM SIGN E2 TIMES U"/* 12093 */,/*38680*/"CUNEIFORM SIGN EDIN"/* 12094 */, /*38681*/"CUNEIFORM SIGN EGIR"/* 12095 */,/*38682*/"CUNEIFORM SIGN EL"/* 12096 */, /*38683*/"CUNEIFORM SIGN EN"/* 12097 */,/*38684*/"CUNEIFORM SIGN EN TIMES GAN2"/* 12098 */, /*38685*/"CUNEIFORM SIGN EN TIMES GAN2 TENU"/* 12099 */,/*38686*/"CUNEIFORM SIGN EN TIMES ME"/* 1209A */, /*38687*/"CUNEIFORM SIGN EN CROSSING EN"/* 1209B */,/*38688*/"CUNEIFORM SIGN EN OPPOSING EN"/* 1209C */, /*38689*/"CUNEIFORM SIGN EN SQUARED"/* 1209D */,/*38690*/"CUNEIFORM SIGN EREN"/* 1209E */, /*38691*/"CUNEIFORM SIGN ERIN2"/* 1209F */,/*38692*/"CUNEIFORM SIGN ESH2"/* 120A0 */, /*38693*/"CUNEIFORM SIGN EZEN"/* 120A1 */,/*38694*/"CUNEIFORM SIGN EZEN TIMES A"/* 120A2 */, /*38695*/"CUNEIFORM SIGN EZEN TIMES A PLUS LAL"/* 120A3 */, /*38696*/"CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL"/* 120A4 */,/*38697*/"CUNEIFORM SIGN EZEN TIMES AN"/* 120A5 */, /*38698*/"CUNEIFORM SIGN EZEN TIMES BAD"/* 120A6 */,/*38699*/"CUNEIFORM SIGN EZEN TIMES DUN3 GUNU"/* 120A7 */, /*38700*/"CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU"/* 120A8 */,/*38701*/"CUNEIFORM SIGN EZEN TIMES HA"/* 120A9 */, /*38702*/"CUNEIFORM SIGN EZEN TIMES HA GUNU"/* 120AA */,/*38703*/"CUNEIFORM SIGN EZEN TIMES IGI GUNU"/* 120AB */, /*38704*/"CUNEIFORM SIGN EZEN TIMES KASKAL"/* 120AC */,/*38705*/"CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED"/* 120AD */, /*38706*/"CUNEIFORM SIGN EZEN TIMES KU3"/* 120AE */,/*38707*/"CUNEIFORM SIGN EZEN TIMES LA"/* 120AF */, /*38708*/"CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL"/* 120B0 */,/*38709*/"CUNEIFORM SIGN EZEN TIMES LI"/* 120B1 */, /*38710*/"CUNEIFORM SIGN EZEN TIMES LU"/* 120B2 */,/*38711*/"CUNEIFORM SIGN EZEN TIMES U2"/* 120B3 */, /*38712*/"CUNEIFORM SIGN EZEN TIMES UD"/* 120B4 */,/*38713*/"CUNEIFORM SIGN GA"/* 120B5 */, /*38714*/"CUNEIFORM SIGN GA GUNU"/* 120B6 */,/*38715*/"CUNEIFORM SIGN GA2"/* 120B7 */, /*38716*/"CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA"/* 120B8 */, /*38717*/"CUNEIFORM SIGN GA2 TIMES A PLUS HA"/* 120B9 */,/*38718*/"CUNEIFORM SIGN GA2 TIMES A PLUS IGI"/* 120BA */, /*38719*/"CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB"/* 120BB */,/*38720*/"CUNEIFORM SIGN GA2 TIMES AN"/* 120BC */, /*38721*/"CUNEIFORM SIGN GA2 TIMES ASH"/* 120BD */,/*38722*/"CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL"/* 120BE */, /*38723*/"CUNEIFORM SIGN GA2 TIMES BAD"/* 120BF */,/*38724*/"CUNEIFORM SIGN GA2 TIMES BAR PLUS RA"/* 120C0 */, /*38725*/"CUNEIFORM SIGN GA2 TIMES BUR"/* 120C1 */,/*38726*/"CUNEIFORM SIGN GA2 TIMES BUR PLUS RA"/* 120C2 */, /*38727*/"CUNEIFORM SIGN GA2 TIMES DA"/* 120C3 */,/*38728*/"CUNEIFORM SIGN GA2 TIMES DI"/* 120C4 */, /*38729*/"CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE"/* 120C5 */,/*38730*/"CUNEIFORM SIGN GA2 TIMES DUB"/* 120C6 */, /*38731*/"CUNEIFORM SIGN GA2 TIMES EL"/* 120C7 */,/*38732*/"CUNEIFORM SIGN GA2 TIMES EL PLUS LA"/* 120C8 */, /*38733*/"CUNEIFORM SIGN GA2 TIMES EN"/* 120C9 */,/*38734*/"CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU"/* 120CA */, /*38735*/"CUNEIFORM SIGN GA2 TIMES GAN2 TENU"/* 120CB */,/*38736*/"CUNEIFORM SIGN GA2 TIMES GAR"/* 120CC */, /*38737*/"CUNEIFORM SIGN GA2 TIMES GI"/* 120CD */,/*38738*/"CUNEIFORM SIGN GA2 TIMES GI4"/* 120CE */, /*38739*/"CUNEIFORM SIGN GA2 TIMES GI4 PLUS A"/* 120CF */,/*38740*/"CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU"/* 120D0 */, /*38741*/"CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2"/* 120D1 */,/*38742*/"CUNEIFORM SIGN GA2 TIMES HAL"/* 120D2 */, /*38743*/"CUNEIFORM SIGN GA2 TIMES HAL PLUS LA"/* 120D3 */,/*38744*/"CUNEIFORM SIGN GA2 TIMES HI PLUS LI"/* 120D4 */, /*38745*/"CUNEIFORM SIGN GA2 TIMES HUB2"/* 120D5 */,/*38746*/"CUNEIFORM SIGN GA2 TIMES IGI GUNU"/* 120D6 */, /*38747*/"CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH"/* 120D7 */,/*38748*/"CUNEIFORM SIGN GA2 TIMES KAK"/* 120D8 */, /*38749*/"CUNEIFORM SIGN GA2 TIMES KASKAL"/* 120D9 */,/*38750*/"CUNEIFORM SIGN GA2 TIMES KID"/* 120DA */, /*38751*/"CUNEIFORM SIGN GA2 TIMES KID PLUS LAL"/* 120DB */,/*38752*/"CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN"/* 120DC */, /*38753*/"CUNEIFORM SIGN GA2 TIMES LA"/* 120DD */,/*38754*/"CUNEIFORM SIGN GA2 TIMES ME PLUS EN"/* 120DE */, /*38755*/"CUNEIFORM SIGN GA2 TIMES MI"/* 120DF */,/*38756*/"CUNEIFORM SIGN GA2 TIMES NUN"/* 120E0 */, /*38757*/"CUNEIFORM SIGN GA2 TIMES NUN OVER NUN"/* 120E1 */,/*38758*/"CUNEIFORM SIGN GA2 TIMES PA"/* 120E2 */, /*38759*/"CUNEIFORM SIGN GA2 TIMES SAL"/* 120E3 */,/*38760*/"CUNEIFORM SIGN GA2 TIMES SAR"/* 120E4 */, /*38761*/"CUNEIFORM SIGN GA2 TIMES SHE"/* 120E5 */,/*38762*/"CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR"/* 120E6 */, /*38763*/"CUNEIFORM SIGN GA2 TIMES SHID"/* 120E7 */,/*38764*/"CUNEIFORM SIGN GA2 TIMES SUM"/* 120E8 */, /*38765*/"CUNEIFORM SIGN GA2 TIMES TAK4"/* 120E9 */,/*38766*/"CUNEIFORM SIGN GA2 TIMES U"/* 120EA */, /*38767*/"CUNEIFORM SIGN GA2 TIMES UD"/* 120EB */,/*38768*/"CUNEIFORM SIGN GA2 TIMES UD PLUS DU"/* 120EC */, /*38769*/"CUNEIFORM SIGN GA2 OVER GA2"/* 120ED */,/*38770*/"CUNEIFORM SIGN GABA"/* 120EE */, /*38771*/"CUNEIFORM SIGN GABA CROSSING GABA"/* 120EF */,/*38772*/"CUNEIFORM SIGN GAD"/* 120F0 */, /*38773*/"CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR"/* 120F1 */,/*38774*/"CUNEIFORM SIGN GAL"/* 120F2 */, /*38775*/"CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR"/* 120F3 */,/*38776*/"CUNEIFORM SIGN GALAM"/* 120F4 */, /*38777*/"CUNEIFORM SIGN GAM"/* 120F5 */,/*38778*/"CUNEIFORM SIGN GAN"/* 120F6 */, /*38779*/"CUNEIFORM SIGN GAN2"/* 120F7 */,/*38780*/"CUNEIFORM SIGN GAN2 TENU"/* 120F8 */, /*38781*/"CUNEIFORM SIGN GAN2 OVER GAN2"/* 120F9 */,/*38782*/"CUNEIFORM SIGN GAN2 CROSSING GAN2"/* 120FA */, /*38783*/"CUNEIFORM SIGN GAR"/* 120FB */,/*38784*/"CUNEIFORM SIGN GAR3"/* 120FC */, /*38785*/"CUNEIFORM SIGN GASHAN"/* 120FD */,/*38786*/"CUNEIFORM SIGN GESHTIN"/* 120FE */, /*38787*/"CUNEIFORM SIGN GESHTIN TIMES KUR"/* 120FF */,/*38788*/"CUNEIFORM SIGN GI"/* 12100 */, /*38789*/"CUNEIFORM SIGN GI TIMES E"/* 12101 */,/*38790*/"CUNEIFORM SIGN GI TIMES U"/* 12102 */, /*38791*/"CUNEIFORM SIGN GI CROSSING GI"/* 12103 */,/*38792*/"CUNEIFORM SIGN GI4"/* 12104 */, /*38793*/"CUNEIFORM SIGN GI4 OVER GI4"/* 12105 */,/*38794*/"CUNEIFORM SIGN GI4 CROSSING GI4"/* 12106 */, /*38795*/"CUNEIFORM SIGN GIDIM"/* 12107 */,/*38796*/"CUNEIFORM SIGN GIR2"/* 12108 */, /*38797*/"CUNEIFORM SIGN GIR2 GUNU"/* 12109 */,/*38798*/"CUNEIFORM SIGN GIR3"/* 1210A */, /*38799*/"CUNEIFORM SIGN GIR3 TIMES A PLUS IGI"/* 1210B */,/*38800*/"CUNEIFORM SIGN GIR3 TIMES GAN2 TENU"/* 1210C */, /*38801*/"CUNEIFORM SIGN GIR3 TIMES IGI"/* 1210D */,/*38802*/"CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI"/* 1210E */, /*38803*/"CUNEIFORM SIGN GIR3 TIMES PA"/* 1210F */,/*38804*/"CUNEIFORM SIGN GISAL"/* 12110 */, /*38805*/"CUNEIFORM SIGN GISH"/* 12111 */,/*38806*/"CUNEIFORM SIGN GISH CROSSING GISH"/* 12112 */, /*38807*/"CUNEIFORM SIGN GISH TIMES BAD"/* 12113 */,/*38808*/"CUNEIFORM SIGN GISH TIMES TAK4"/* 12114 */, /*38809*/"CUNEIFORM SIGN GISH TENU"/* 12115 */,/*38810*/"CUNEIFORM SIGN GU"/* 12116 */, /*38811*/"CUNEIFORM SIGN GU CROSSING GU"/* 12117 */,/*38812*/"CUNEIFORM SIGN GU2"/* 12118 */, /*38813*/"CUNEIFORM SIGN GU2 TIMES KAK"/* 12119 */,/*38814*/"CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU"/* 1211A */, /*38815*/"CUNEIFORM SIGN GU2 TIMES NUN"/* 1211B */,/*38816*/"CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2"/* 1211C */, /*38817*/"CUNEIFORM SIGN GU2 GUNU"/* 1211D */,/*38818*/"CUNEIFORM SIGN GUD"/* 1211E */, /*38819*/"CUNEIFORM SIGN GUD TIMES A PLUS KUR"/* 1211F */,/*38820*/"CUNEIFORM SIGN GUD TIMES KUR"/* 12120 */, /*38821*/"CUNEIFORM SIGN GUD OVER GUD LUGAL"/* 12121 */,/*38822*/"CUNEIFORM SIGN GUL"/* 12122 */, /*38823*/"CUNEIFORM SIGN GUM"/* 12123 */,/*38824*/"CUNEIFORM SIGN GUM TIMES SHE"/* 12124 */, /*38825*/"CUNEIFORM SIGN GUR"/* 12125 */,/*38826*/"CUNEIFORM SIGN GUR7"/* 12126 */, /*38827*/"CUNEIFORM SIGN GURUN"/* 12127 */,/*38828*/"CUNEIFORM SIGN GURUSH"/* 12128 */, /*38829*/"CUNEIFORM SIGN HA"/* 12129 */,/*38830*/"CUNEIFORM SIGN HA TENU"/* 1212A */, /*38831*/"CUNEIFORM SIGN HA GUNU"/* 1212B */,/*38832*/"CUNEIFORM SIGN HAL"/* 1212C */, /*38833*/"CUNEIFORM SIGN HI"/* 1212D */,/*38834*/"CUNEIFORM SIGN HI TIMES ASH"/* 1212E */, /*38835*/"CUNEIFORM SIGN HI TIMES ASH2"/* 1212F */,/*38836*/"CUNEIFORM SIGN HI TIMES BAD"/* 12130 */, /*38837*/"CUNEIFORM SIGN HI TIMES DISH"/* 12131 */,/*38838*/"CUNEIFORM SIGN HI TIMES GAD"/* 12132 */, /*38839*/"CUNEIFORM SIGN HI TIMES KIN"/* 12133 */,/*38840*/"CUNEIFORM SIGN HI TIMES NUN"/* 12134 */, /*38841*/"CUNEIFORM SIGN HI TIMES SHE"/* 12135 */,/*38842*/"CUNEIFORM SIGN HI TIMES U"/* 12136 */, /*38843*/"CUNEIFORM SIGN HU"/* 12137 */,/*38844*/"CUNEIFORM SIGN HUB2"/* 12138 */, /*38845*/"CUNEIFORM SIGN HUB2 TIMES AN"/* 12139 */,/*38846*/"CUNEIFORM SIGN HUB2 TIMES HAL"/* 1213A */, /*38847*/"CUNEIFORM SIGN HUB2 TIMES KASKAL"/* 1213B */,/*38848*/"CUNEIFORM SIGN HUB2 TIMES LISH"/* 1213C */, /*38849*/"CUNEIFORM SIGN HUB2 TIMES UD"/* 1213D */,/*38850*/"CUNEIFORM SIGN HUL2"/* 1213E */, /*38851*/"CUNEIFORM SIGN I"/* 1213F */,/*38852*/"CUNEIFORM SIGN I A"/* 12140 */,/*38853*/"CUNEIFORM SIGN IB"/* 12141 */, /*38854*/"CUNEIFORM SIGN IDIM"/* 12142 */,/*38855*/"CUNEIFORM SIGN IDIM OVER IDIM BUR"/* 12143 */, /*38856*/"CUNEIFORM SIGN IDIM OVER IDIM SQUARED"/* 12144 */,/*38857*/"CUNEIFORM SIGN IG"/* 12145 */, /*38858*/"CUNEIFORM SIGN IGI"/* 12146 */,/*38859*/"CUNEIFORM SIGN IGI DIB"/* 12147 */, /*38860*/"CUNEIFORM SIGN IGI RI"/* 12148 */,/*38861*/"CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD"/* 12149 */, /*38862*/"CUNEIFORM SIGN IGI GUNU"/* 1214A */,/*38863*/"CUNEIFORM SIGN IL"/* 1214B */, /*38864*/"CUNEIFORM SIGN IL TIMES GAN2 TENU"/* 1214C */,/*38865*/"CUNEIFORM SIGN IL2"/* 1214D */, /*38866*/"CUNEIFORM SIGN IM"/* 1214E */,/*38867*/"CUNEIFORM SIGN IM TIMES TAK4"/* 1214F */, /*38868*/"CUNEIFORM SIGN IM CROSSING IM"/* 12150 */,/*38869*/"CUNEIFORM SIGN IM OPPOSING IM"/* 12151 */, /*38870*/"CUNEIFORM SIGN IM SQUARED"/* 12152 */,/*38871*/"CUNEIFORM SIGN IMIN"/* 12153 */, /*38872*/"CUNEIFORM SIGN IN"/* 12154 */,/*38873*/"CUNEIFORM SIGN IR"/* 12155 */,/*38874*/"CUNEIFORM SIGN ISH"/* 12156 */, /*38875*/"CUNEIFORM SIGN KA"/* 12157 */,/*38876*/"CUNEIFORM SIGN KA TIMES A"/* 12158 */, /*38877*/"CUNEIFORM SIGN KA TIMES AD"/* 12159 */,/*38878*/"CUNEIFORM SIGN KA TIMES AD PLUS KU3"/* 1215A */, /*38879*/"CUNEIFORM SIGN KA TIMES ASH2"/* 1215B */,/*38880*/"CUNEIFORM SIGN KA TIMES BAD"/* 1215C */, /*38881*/"CUNEIFORM SIGN KA TIMES BALAG"/* 1215D */,/*38882*/"CUNEIFORM SIGN KA TIMES BAR"/* 1215E */, /*38883*/"CUNEIFORM SIGN KA TIMES BI"/* 1215F */,/*38884*/"CUNEIFORM SIGN KA TIMES ERIN2"/* 12160 */, /*38885*/"CUNEIFORM SIGN KA TIMES ESH2"/* 12161 */,/*38886*/"CUNEIFORM SIGN KA TIMES GA"/* 12162 */, /*38887*/"CUNEIFORM SIGN KA TIMES GAL"/* 12163 */,/*38888*/"CUNEIFORM SIGN KA TIMES GAN2 TENU"/* 12164 */, /*38889*/"CUNEIFORM SIGN KA TIMES GAR"/* 12165 */,/*38890*/"CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A"/* 12166 */, /*38891*/"CUNEIFORM SIGN KA TIMES GI"/* 12167 */,/*38892*/"CUNEIFORM SIGN KA TIMES GIR2"/* 12168 */, /*38893*/"CUNEIFORM SIGN KA TIMES GISH PLUS SAR"/* 12169 */, /*38894*/"CUNEIFORM SIGN KA TIMES GISH CROSSING GISH"/* 1216A */,/*38895*/"CUNEIFORM SIGN KA TIMES GU"/* 1216B */, /*38896*/"CUNEIFORM SIGN KA TIMES GUR7"/* 1216C */,/*38897*/"CUNEIFORM SIGN KA TIMES IGI"/* 1216D */, /*38898*/"CUNEIFORM SIGN KA TIMES IM"/* 1216E */,/*38899*/"CUNEIFORM SIGN KA TIMES KAK"/* 1216F */, /*38900*/"CUNEIFORM SIGN KA TIMES KI"/* 12170 */,/*38901*/"CUNEIFORM SIGN KA TIMES KID"/* 12171 */, /*38902*/"CUNEIFORM SIGN KA TIMES LI"/* 12172 */,/*38903*/"CUNEIFORM SIGN KA TIMES LU"/* 12173 */, /*38904*/"CUNEIFORM SIGN KA TIMES ME"/* 12174 */,/*38905*/"CUNEIFORM SIGN KA TIMES ME PLUS DU"/* 12175 */, /*38906*/"CUNEIFORM SIGN KA TIMES ME PLUS GI"/* 12176 */,/*38907*/"CUNEIFORM SIGN KA TIMES ME PLUS TE"/* 12177 */, /*38908*/"CUNEIFORM SIGN KA TIMES MI"/* 12178 */,/*38909*/"CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ"/* 12179 */, /*38910*/"CUNEIFORM SIGN KA TIMES NE"/* 1217A */,/*38911*/"CUNEIFORM SIGN KA TIMES NUN"/* 1217B */, /*38912*/"CUNEIFORM SIGN KA TIMES PI"/* 1217C */,/*38913*/"CUNEIFORM SIGN KA TIMES RU"/* 1217D */, /*38914*/"CUNEIFORM SIGN KA TIMES SA"/* 1217E */,/*38915*/"CUNEIFORM SIGN KA TIMES SAR"/* 1217F */, /*38916*/"CUNEIFORM SIGN KA TIMES SHA"/* 12180 */,/*38917*/"CUNEIFORM SIGN KA TIMES SHE"/* 12181 */, /*38918*/"CUNEIFORM SIGN KA TIMES SHID"/* 12182 */,/*38919*/"CUNEIFORM SIGN KA TIMES SHU"/* 12183 */, /*38920*/"CUNEIFORM SIGN KA TIMES SIG"/* 12184 */,/*38921*/"CUNEIFORM SIGN KA TIMES SUHUR"/* 12185 */, /*38922*/"CUNEIFORM SIGN KA TIMES TAR"/* 12186 */,/*38923*/"CUNEIFORM SIGN KA TIMES U"/* 12187 */, /*38924*/"CUNEIFORM SIGN KA TIMES U2"/* 12188 */,/*38925*/"CUNEIFORM SIGN KA TIMES UD"/* 12189 */, /*38926*/"CUNEIFORM SIGN KA TIMES UMUM TIMES PA"/* 1218A */,/*38927*/"CUNEIFORM SIGN KA TIMES USH"/* 1218B */, /*38928*/"CUNEIFORM SIGN KA TIMES ZI"/* 1218C */,/*38929*/"CUNEIFORM SIGN KA2"/* 1218D */, /*38930*/"CUNEIFORM SIGN KA2 CROSSING KA2"/* 1218E */,/*38931*/"CUNEIFORM SIGN KAB"/* 1218F */, /*38932*/"CUNEIFORM SIGN KAD2"/* 12190 */,/*38933*/"CUNEIFORM SIGN KAD3"/* 12191 */, /*38934*/"CUNEIFORM SIGN KAD4"/* 12192 */,/*38935*/"CUNEIFORM SIGN KAD5"/* 12193 */, /*38936*/"CUNEIFORM SIGN KAD5 OVER KAD5"/* 12194 */,/*38937*/"CUNEIFORM SIGN KAK"/* 12195 */, /*38938*/"CUNEIFORM SIGN KAK TIMES IGI GUNU"/* 12196 */,/*38939*/"CUNEIFORM SIGN KAL"/* 12197 */, /*38940*/"CUNEIFORM SIGN KAL TIMES BAD"/* 12198 */,/*38941*/"CUNEIFORM SIGN KAL CROSSING KAL"/* 12199 */, /*38942*/"CUNEIFORM SIGN KAM2"/* 1219A */,/*38943*/"CUNEIFORM SIGN KAM4"/* 1219B */, /*38944*/"CUNEIFORM SIGN KASKAL"/* 1219C */,/*38945*/"CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U"/* 1219D */, /*38946*/"CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U"/* 1219E */, /*38947*/"CUNEIFORM SIGN KESH2"/* 1219F */,/*38948*/"CUNEIFORM SIGN KI"/* 121A0 */, /*38949*/"CUNEIFORM SIGN KI TIMES BAD"/* 121A1 */,/*38950*/"CUNEIFORM SIGN KI TIMES U"/* 121A2 */, /*38951*/"CUNEIFORM SIGN KI TIMES UD"/* 121A3 */,/*38952*/"CUNEIFORM SIGN KID"/* 121A4 */, /*38953*/"CUNEIFORM SIGN KIN"/* 121A5 */,/*38954*/"CUNEIFORM SIGN KISAL"/* 121A6 */, /*38955*/"CUNEIFORM SIGN KISH"/* 121A7 */,/*38956*/"CUNEIFORM SIGN KISIM5"/* 121A8 */, /*38957*/"CUNEIFORM SIGN KISIM5 OVER KISIM5"/* 121A9 */,/*38958*/"CUNEIFORM SIGN KU"/* 121AA */, /*38959*/"CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2"/* 121AB */, /*38960*/"CUNEIFORM SIGN KU3"/* 121AC */,/*38961*/"CUNEIFORM SIGN KU4"/* 121AD */, /*38962*/"CUNEIFORM SIGN KU4 VARIANT FORM"/* 121AE */,/*38963*/"CUNEIFORM SIGN KU7"/* 121AF */, /*38964*/"CUNEIFORM SIGN KUL"/* 121B0 */,/*38965*/"CUNEIFORM SIGN KUL GUNU"/* 121B1 */, /*38966*/"CUNEIFORM SIGN KUN"/* 121B2 */,/*38967*/"CUNEIFORM SIGN KUR"/* 121B3 */, /*38968*/"CUNEIFORM SIGN KUR OPPOSING KUR"/* 121B4 */,/*38969*/"CUNEIFORM SIGN KUSHU2"/* 121B5 */, /*38970*/"CUNEIFORM SIGN KWU318"/* 121B6 */,/*38971*/"CUNEIFORM SIGN LA"/* 121B7 */, /*38972*/"CUNEIFORM SIGN LAGAB"/* 121B8 */,/*38973*/"CUNEIFORM SIGN LAGAB TIMES A"/* 121B9 */, /*38974*/"CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA"/* 121BA */, /*38975*/"CUNEIFORM SIGN LAGAB TIMES A PLUS GAR"/* 121BB */,/*38976*/"CUNEIFORM SIGN LAGAB TIMES A PLUS LAL"/* 121BC */, /*38977*/"CUNEIFORM SIGN LAGAB TIMES AL"/* 121BD */,/*38978*/"CUNEIFORM SIGN LAGAB TIMES AN"/* 121BE */, /*38979*/"CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU"/* 121BF */,/*38980*/"CUNEIFORM SIGN LAGAB TIMES BAD"/* 121C0 */, /*38981*/"CUNEIFORM SIGN LAGAB TIMES BI"/* 121C1 */,/*38982*/"CUNEIFORM SIGN LAGAB TIMES DAR"/* 121C2 */, /*38983*/"CUNEIFORM SIGN LAGAB TIMES EN"/* 121C3 */,/*38984*/"CUNEIFORM SIGN LAGAB TIMES GA"/* 121C4 */, /*38985*/"CUNEIFORM SIGN LAGAB TIMES GAR"/* 121C5 */,/*38986*/"CUNEIFORM SIGN LAGAB TIMES GUD"/* 121C6 */, /*38987*/"CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD"/* 121C7 */,/*38988*/"CUNEIFORM SIGN LAGAB TIMES HA"/* 121C8 */, /*38989*/"CUNEIFORM SIGN LAGAB TIMES HAL"/* 121C9 */,/*38990*/"CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN"/* 121CA */, /*38991*/"CUNEIFORM SIGN LAGAB TIMES IGI GUNU"/* 121CB */,/*38992*/"CUNEIFORM SIGN LAGAB TIMES IM"/* 121CC */, /*38993*/"CUNEIFORM SIGN LAGAB TIMES IM PLUS HA"/* 121CD */,/*38994*/"CUNEIFORM SIGN LAGAB TIMES IM PLUS LU"/* 121CE */, /*38995*/"CUNEIFORM SIGN LAGAB TIMES KI"/* 121CF */,/*38996*/"CUNEIFORM SIGN LAGAB TIMES KIN"/* 121D0 */, /*38997*/"CUNEIFORM SIGN LAGAB TIMES KU3"/* 121D1 */,/*38998*/"CUNEIFORM SIGN LAGAB TIMES KUL"/* 121D2 */, /*38999*/"CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A"/* 121D3 */, /*39000*/"CUNEIFORM SIGN LAGAB TIMES LAGAB"/* 121D4 */,/*39001*/"CUNEIFORM SIGN LAGAB TIMES LISH"/* 121D5 */, /*39002*/"CUNEIFORM SIGN LAGAB TIMES LU"/* 121D6 */,/*39003*/"CUNEIFORM SIGN LAGAB TIMES LUL"/* 121D7 */, /*39004*/"CUNEIFORM SIGN LAGAB TIMES ME"/* 121D8 */,/*39005*/"CUNEIFORM SIGN LAGAB TIMES ME PLUS EN"/* 121D9 */, /*39006*/"CUNEIFORM SIGN LAGAB TIMES MUSH"/* 121DA */,/*39007*/"CUNEIFORM SIGN LAGAB TIMES NE"/* 121DB */, /*39008*/"CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM"/* 121DC */, /*39009*/"CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2"/* 121DD */, /*39010*/"CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU"/* 121DE */, /*39011*/"CUNEIFORM SIGN LAGAB TIMES SHU2"/* 121DF */,/*39012*/"CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2"/* 121E0 */, /*39013*/"CUNEIFORM SIGN LAGAB TIMES SUM"/* 121E1 */,/*39014*/"CUNEIFORM SIGN LAGAB TIMES TAG"/* 121E2 */, /*39015*/"CUNEIFORM SIGN LAGAB TIMES TAK4"/* 121E3 */, /*39016*/"CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA"/* 121E4 */, /*39017*/"CUNEIFORM SIGN LAGAB TIMES U"/* 121E5 */,/*39018*/"CUNEIFORM SIGN LAGAB TIMES U PLUS A"/* 121E6 */, /*39019*/"CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U"/* 121E7 */, /*39020*/"CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH"/* 121E8 */,/*39021*/"CUNEIFORM SIGN LAGAB TIMES UD"/* 121E9 */, /*39022*/"CUNEIFORM SIGN LAGAB TIMES USH"/* 121EA */,/*39023*/"CUNEIFORM SIGN LAGAB SQUARED"/* 121EB */, /*39024*/"CUNEIFORM SIGN LAGAR"/* 121EC */,/*39025*/"CUNEIFORM SIGN LAGAR TIMES SHE"/* 121ED */, /*39026*/"CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM"/* 121EE */,/*39027*/"CUNEIFORM SIGN LAGAR GUNU"/* 121EF */, /*39028*/"CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE"/* 121F0 */,/*39029*/"CUNEIFORM SIGN LAHSHU"/* 121F1 */, /*39030*/"CUNEIFORM SIGN LAL"/* 121F2 */,/*39031*/"CUNEIFORM SIGN LAL TIMES LAL"/* 121F3 */, /*39032*/"CUNEIFORM SIGN LAM"/* 121F4 */,/*39033*/"CUNEIFORM SIGN LAM TIMES KUR"/* 121F5 */, /*39034*/"CUNEIFORM SIGN LAM TIMES KUR PLUS RU"/* 121F6 */,/*39035*/"CUNEIFORM SIGN LI"/* 121F7 */, /*39036*/"CUNEIFORM SIGN LIL"/* 121F8 */,/*39037*/"CUNEIFORM SIGN LIMMU2"/* 121F9 */, /*39038*/"CUNEIFORM SIGN LISH"/* 121FA */,/*39039*/"CUNEIFORM SIGN LU"/* 121FB */, /*39040*/"CUNEIFORM SIGN LU TIMES BAD"/* 121FC */,/*39041*/"CUNEIFORM SIGN LU2"/* 121FD */, /*39042*/"CUNEIFORM SIGN LU2 TIMES AL"/* 121FE */,/*39043*/"CUNEIFORM SIGN LU2 TIMES BAD"/* 121FF */, /*39044*/"CUNEIFORM SIGN LU2 TIMES ESH2"/* 12200 */,/*39045*/"CUNEIFORM SIGN LU2 TIMES ESH2 TENU"/* 12201 */, /*39046*/"CUNEIFORM SIGN LU2 TIMES GAN2 TENU"/* 12202 */,/*39047*/"CUNEIFORM SIGN LU2 TIMES HI TIMES BAD"/* 12203 */, /*39048*/"CUNEIFORM SIGN LU2 TIMES IM"/* 12204 */,/*39049*/"CUNEIFORM SIGN LU2 TIMES KAD2"/* 12205 */, /*39050*/"CUNEIFORM SIGN LU2 TIMES KAD3"/* 12206 */,/*39051*/"CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH"/* 12207 */, /*39052*/"CUNEIFORM SIGN LU2 TIMES KI"/* 12208 */,/*39053*/"CUNEIFORM SIGN LU2 TIMES LA PLUS ASH"/* 12209 */, /*39054*/"CUNEIFORM SIGN LU2 TIMES LAGAB"/* 1220A */,/*39055*/"CUNEIFORM SIGN LU2 TIMES ME PLUS EN"/* 1220B */, /*39056*/"CUNEIFORM SIGN LU2 TIMES NE"/* 1220C */,/*39057*/"CUNEIFORM SIGN LU2 TIMES NU"/* 1220D */, /*39058*/"CUNEIFORM SIGN LU2 TIMES SI PLUS ASH"/* 1220E */,/*39059*/"CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU"/* 1220F */, /*39060*/"CUNEIFORM SIGN LU2 TIMES TUG2"/* 12210 */,/*39061*/"CUNEIFORM SIGN LU2 TENU"/* 12211 */, /*39062*/"CUNEIFORM SIGN LU2 CROSSING LU2"/* 12212 */,/*39063*/"CUNEIFORM SIGN LU2 OPPOSING LU2"/* 12213 */, /*39064*/"CUNEIFORM SIGN LU2 SQUARED"/* 12214 */,/*39065*/"CUNEIFORM SIGN LU2 SHESHIG"/* 12215 */, /*39066*/"CUNEIFORM SIGN LU3"/* 12216 */,/*39067*/"CUNEIFORM SIGN LUGAL"/* 12217 */, /*39068*/"CUNEIFORM SIGN LUGAL OVER LUGAL"/* 12218 */,/*39069*/"CUNEIFORM SIGN LUGAL OPPOSING LUGAL"/* 12219 */, /*39070*/"CUNEIFORM SIGN LUGAL SHESHIG"/* 1221A */,/*39071*/"CUNEIFORM SIGN LUH"/* 1221B */, /*39072*/"CUNEIFORM SIGN LUL"/* 1221C */,/*39073*/"CUNEIFORM SIGN LUM"/* 1221D */, /*39074*/"CUNEIFORM SIGN LUM OVER LUM"/* 1221E */,/*39075*/"CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR"/* 1221F */, /*39076*/"CUNEIFORM SIGN MA"/* 12220 */,/*39077*/"CUNEIFORM SIGN MA TIMES TAK4"/* 12221 */, /*39078*/"CUNEIFORM SIGN MA GUNU"/* 12222 */,/*39079*/"CUNEIFORM SIGN MA2"/* 12223 */, /*39080*/"CUNEIFORM SIGN MAH"/* 12224 */,/*39081*/"CUNEIFORM SIGN MAR"/* 12225 */, /*39082*/"CUNEIFORM SIGN MASH"/* 12226 */,/*39083*/"CUNEIFORM SIGN MASH2"/* 12227 */, /*39084*/"CUNEIFORM SIGN ME"/* 12228 */,/*39085*/"CUNEIFORM SIGN MES"/* 12229 */,/*39086*/"CUNEIFORM SIGN MI"/* 1222A */, /*39087*/"CUNEIFORM SIGN MIN"/* 1222B */,/*39088*/"CUNEIFORM SIGN MU"/* 1222C */, /*39089*/"CUNEIFORM SIGN MU OVER MU"/* 1222D */,/*39090*/"CUNEIFORM SIGN MUG"/* 1222E */, /*39091*/"CUNEIFORM SIGN MUG GUNU"/* 1222F */,/*39092*/"CUNEIFORM SIGN MUNSUB"/* 12230 */, /*39093*/"CUNEIFORM SIGN MURGU2"/* 12231 */,/*39094*/"CUNEIFORM SIGN MUSH"/* 12232 */, /*39095*/"CUNEIFORM SIGN MUSH TIMES A"/* 12233 */,/*39096*/"CUNEIFORM SIGN MUSH TIMES KUR"/* 12234 */, /*39097*/"CUNEIFORM SIGN MUSH TIMES ZA"/* 12235 */,/*39098*/"CUNEIFORM SIGN MUSH OVER MUSH"/* 12236 */, /*39099*/"CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA"/* 12237 */, /*39100*/"CUNEIFORM SIGN MUSH CROSSING MUSH"/* 12238 */,/*39101*/"CUNEIFORM SIGN MUSH3"/* 12239 */, /*39102*/"CUNEIFORM SIGN MUSH3 TIMES A"/* 1223A */,/*39103*/"CUNEIFORM SIGN MUSH3 TIMES A PLUS DI"/* 1223B */, /*39104*/"CUNEIFORM SIGN MUSH3 TIMES DI"/* 1223C */,/*39105*/"CUNEIFORM SIGN MUSH3 GUNU"/* 1223D */, /*39106*/"CUNEIFORM SIGN NA"/* 1223E */,/*39107*/"CUNEIFORM SIGN NA2"/* 1223F */, /*39108*/"CUNEIFORM SIGN NAGA"/* 12240 */,/*39109*/"CUNEIFORM SIGN NAGA INVERTED"/* 12241 */, /*39110*/"CUNEIFORM SIGN NAGA TIMES SHU TENU"/* 12242 */,/*39111*/"CUNEIFORM SIGN NAGA OPPOSING NAGA"/* 12243 */, /*39112*/"CUNEIFORM SIGN NAGAR"/* 12244 */,/*39113*/"CUNEIFORM SIGN NAM NUTILLU"/* 12245 */, /*39114*/"CUNEIFORM SIGN NAM"/* 12246 */,/*39115*/"CUNEIFORM SIGN NAM2"/* 12247 */, /*39116*/"CUNEIFORM SIGN NE"/* 12248 */,/*39117*/"CUNEIFORM SIGN NE TIMES A"/* 12249 */, /*39118*/"CUNEIFORM SIGN NE TIMES UD"/* 1224A */,/*39119*/"CUNEIFORM SIGN NE SHESHIG"/* 1224B */, /*39120*/"CUNEIFORM SIGN NI"/* 1224C */,/*39121*/"CUNEIFORM SIGN NI TIMES E"/* 1224D */, /*39122*/"CUNEIFORM SIGN NI2"/* 1224E */,/*39123*/"CUNEIFORM SIGN NIM"/* 1224F */, /*39124*/"CUNEIFORM SIGN NIM TIMES GAN2 TENU"/* 12250 */, /*39125*/"CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU"/* 12251 */,/*39126*/"CUNEIFORM SIGN NINDA2"/* 12252 */, /*39127*/"CUNEIFORM SIGN NINDA2 TIMES AN"/* 12253 */,/*39128*/"CUNEIFORM SIGN NINDA2 TIMES ASH"/* 12254 */, /*39129*/"CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH"/* 12255 */,/*39130*/"CUNEIFORM SIGN NINDA2 TIMES GUD"/* 12256 */, /*39131*/"CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU"/* 12257 */,/*39132*/"CUNEIFORM SIGN NINDA2 TIMES NE"/* 12258 */, /*39133*/"CUNEIFORM SIGN NINDA2 TIMES NUN"/* 12259 */,/*39134*/"CUNEIFORM SIGN NINDA2 TIMES SHE"/* 1225A */, /*39135*/"CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN"/* 1225B */, /*39136*/"CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH"/* 1225C */, /*39137*/"CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH"/* 1225D */, /*39138*/"CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH"/* 1225E */,/*39139*/"CUNEIFORM SIGN NINDA2 TIMES USH"/* 1225F */, /*39140*/"CUNEIFORM SIGN NISAG"/* 12260 */,/*39141*/"CUNEIFORM SIGN NU"/* 12261 */, /*39142*/"CUNEIFORM SIGN NU11"/* 12262 */,/*39143*/"CUNEIFORM SIGN NUN"/* 12263 */, /*39144*/"CUNEIFORM SIGN NUN LAGAR TIMES GAR"/* 12264 */,/*39145*/"CUNEIFORM SIGN NUN LAGAR TIMES MASH"/* 12265 */, /*39146*/"CUNEIFORM SIGN NUN LAGAR TIMES SAL"/* 12266 */, /*39147*/"CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL"/* 12267 */, /*39148*/"CUNEIFORM SIGN NUN LAGAR TIMES USH"/* 12268 */,/*39149*/"CUNEIFORM SIGN NUN TENU"/* 12269 */, /*39150*/"CUNEIFORM SIGN NUN OVER NUN"/* 1226A */,/*39151*/"CUNEIFORM SIGN NUN CROSSING NUN"/* 1226B */, /*39152*/"CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR"/* 1226C */,/*39153*/"CUNEIFORM SIGN NUNUZ"/* 1226D */, /*39154*/"CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB"/* 1226E */,/*39155*/"CUNEIFORM SIGN NUNUZ AB2 TIMES BI"/* 1226F */, /*39156*/"CUNEIFORM SIGN NUNUZ AB2 TIMES DUG"/* 12270 */,/*39157*/"CUNEIFORM SIGN NUNUZ AB2 TIMES GUD"/* 12271 */, /*39158*/"CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU"/* 12272 */,/*39159*/"CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3"/* 12273 */, /*39160*/"CUNEIFORM SIGN NUNUZ AB2 TIMES LA"/* 12274 */,/*39161*/"CUNEIFORM SIGN NUNUZ AB2 TIMES NE"/* 12275 */, /*39162*/"CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3"/* 12276 */,/*39163*/"CUNEIFORM SIGN NUNUZ AB2 TIMES U2"/* 12277 */, /*39164*/"CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI"/* 12278 */,/*39165*/"CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U"/* 12279 */, /*39166*/"CUNEIFORM SIGN PA"/* 1227A */,/*39167*/"CUNEIFORM SIGN PAD"/* 1227B */, /*39168*/"CUNEIFORM SIGN PAN"/* 1227C */,/*39169*/"CUNEIFORM SIGN PAP"/* 1227D */, /*39170*/"CUNEIFORM SIGN PESH2"/* 1227E */,/*39171*/"CUNEIFORM SIGN PI"/* 1227F */, /*39172*/"CUNEIFORM SIGN PI TIMES A"/* 12280 */,/*39173*/"CUNEIFORM SIGN PI TIMES AB"/* 12281 */, /*39174*/"CUNEIFORM SIGN PI TIMES BI"/* 12282 */,/*39175*/"CUNEIFORM SIGN PI TIMES BU"/* 12283 */, /*39176*/"CUNEIFORM SIGN PI TIMES E"/* 12284 */,/*39177*/"CUNEIFORM SIGN PI TIMES I"/* 12285 */, /*39178*/"CUNEIFORM SIGN PI TIMES IB"/* 12286 */,/*39179*/"CUNEIFORM SIGN PI TIMES U"/* 12287 */, /*39180*/"CUNEIFORM SIGN PI TIMES U2"/* 12288 */,/*39181*/"CUNEIFORM SIGN PI CROSSING PI"/* 12289 */, /*39182*/"CUNEIFORM SIGN PIRIG"/* 1228A */,/*39183*/"CUNEIFORM SIGN PIRIG TIMES KAL"/* 1228B */, /*39184*/"CUNEIFORM SIGN PIRIG TIMES UD"/* 1228C */,/*39185*/"CUNEIFORM SIGN PIRIG TIMES ZA"/* 1228D */, /*39186*/"CUNEIFORM SIGN PIRIG OPPOSING PIRIG"/* 1228E */,/*39187*/"CUNEIFORM SIGN RA"/* 1228F */, /*39188*/"CUNEIFORM SIGN RAB"/* 12290 */,/*39189*/"CUNEIFORM SIGN RI"/* 12291 */,/*39190*/"CUNEIFORM SIGN RU"/* 12292 */, /*39191*/"CUNEIFORM SIGN SA"/* 12293 */,/*39192*/"CUNEIFORM SIGN SAG NUTILLU"/* 12294 */, /*39193*/"CUNEIFORM SIGN SAG"/* 12295 */,/*39194*/"CUNEIFORM SIGN SAG TIMES A"/* 12296 */, /*39195*/"CUNEIFORM SIGN SAG TIMES DU"/* 12297 */,/*39196*/"CUNEIFORM SIGN SAG TIMES DUB"/* 12298 */, /*39197*/"CUNEIFORM SIGN SAG TIMES HA"/* 12299 */,/*39198*/"CUNEIFORM SIGN SAG TIMES KAK"/* 1229A */, /*39199*/"CUNEIFORM SIGN SAG TIMES KUR"/* 1229B */,/*39200*/"CUNEIFORM SIGN SAG TIMES LUM"/* 1229C */, /*39201*/"CUNEIFORM SIGN SAG TIMES MI"/* 1229D */,/*39202*/"CUNEIFORM SIGN SAG TIMES NUN"/* 1229E */, /*39203*/"CUNEIFORM SIGN SAG TIMES SAL"/* 1229F */,/*39204*/"CUNEIFORM SIGN SAG TIMES SHID"/* 122A0 */, /*39205*/"CUNEIFORM SIGN SAG TIMES TAB"/* 122A1 */,/*39206*/"CUNEIFORM SIGN SAG TIMES U2"/* 122A2 */, /*39207*/"CUNEIFORM SIGN SAG TIMES UB"/* 122A3 */,/*39208*/"CUNEIFORM SIGN SAG TIMES UM"/* 122A4 */, /*39209*/"CUNEIFORM SIGN SAG TIMES UR"/* 122A5 */,/*39210*/"CUNEIFORM SIGN SAG TIMES USH"/* 122A6 */, /*39211*/"CUNEIFORM SIGN SAG OVER SAG"/* 122A7 */,/*39212*/"CUNEIFORM SIGN SAG GUNU"/* 122A8 */, /*39213*/"CUNEIFORM SIGN SAL"/* 122A9 */,/*39214*/"CUNEIFORM SIGN SAL LAGAB TIMES ASH2"/* 122AA */, /*39215*/"CUNEIFORM SIGN SANGA2"/* 122AB */,/*39216*/"CUNEIFORM SIGN SAR"/* 122AC */, /*39217*/"CUNEIFORM SIGN SHA"/* 122AD */,/*39218*/"CUNEIFORM SIGN SHA3"/* 122AE */, /*39219*/"CUNEIFORM SIGN SHA3 TIMES A"/* 122AF */,/*39220*/"CUNEIFORM SIGN SHA3 TIMES BAD"/* 122B0 */, /*39221*/"CUNEIFORM SIGN SHA3 TIMES GISH"/* 122B1 */,/*39222*/"CUNEIFORM SIGN SHA3 TIMES NE"/* 122B2 */, /*39223*/"CUNEIFORM SIGN SHA3 TIMES SHU2"/* 122B3 */,/*39224*/"CUNEIFORM SIGN SHA3 TIMES TUR"/* 122B4 */, /*39225*/"CUNEIFORM SIGN SHA3 TIMES U"/* 122B5 */,/*39226*/"CUNEIFORM SIGN SHA3 TIMES U PLUS A"/* 122B6 */, /*39227*/"CUNEIFORM SIGN SHA6"/* 122B7 */,/*39228*/"CUNEIFORM SIGN SHAB6"/* 122B8 */, /*39229*/"CUNEIFORM SIGN SHAR2"/* 122B9 */,/*39230*/"CUNEIFORM SIGN SHE"/* 122BA */, /*39231*/"CUNEIFORM SIGN SHE HU"/* 122BB */,/*39232*/"CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR"/* 122BC */, /*39233*/"CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR"/* 122BD */,/*39234*/"CUNEIFORM SIGN SHEG9"/* 122BE */, /*39235*/"CUNEIFORM SIGN SHEN"/* 122BF */,/*39236*/"CUNEIFORM SIGN SHESH"/* 122C0 */, /*39237*/"CUNEIFORM SIGN SHESH2"/* 122C1 */,/*39238*/"CUNEIFORM SIGN SHESHLAM"/* 122C2 */, /*39239*/"CUNEIFORM SIGN SHID"/* 122C3 */,/*39240*/"CUNEIFORM SIGN SHID TIMES A"/* 122C4 */, /*39241*/"CUNEIFORM SIGN SHID TIMES IM"/* 122C5 */,/*39242*/"CUNEIFORM SIGN SHIM"/* 122C6 */, /*39243*/"CUNEIFORM SIGN SHIM TIMES A"/* 122C7 */,/*39244*/"CUNEIFORM SIGN SHIM TIMES BAL"/* 122C8 */, /*39245*/"CUNEIFORM SIGN SHIM TIMES BULUG"/* 122C9 */,/*39246*/"CUNEIFORM SIGN SHIM TIMES DIN"/* 122CA */, /*39247*/"CUNEIFORM SIGN SHIM TIMES GAR"/* 122CB */,/*39248*/"CUNEIFORM SIGN SHIM TIMES IGI"/* 122CC */, /*39249*/"CUNEIFORM SIGN SHIM TIMES IGI GUNU"/* 122CD */,/*39250*/"CUNEIFORM SIGN SHIM TIMES KUSHU2"/* 122CE */, /*39251*/"CUNEIFORM SIGN SHIM TIMES LUL"/* 122CF */,/*39252*/"CUNEIFORM SIGN SHIM TIMES MUG"/* 122D0 */, /*39253*/"CUNEIFORM SIGN SHIM TIMES SAL"/* 122D1 */,/*39254*/"CUNEIFORM SIGN SHINIG"/* 122D2 */, /*39255*/"CUNEIFORM SIGN SHIR"/* 122D3 */,/*39256*/"CUNEIFORM SIGN SHIR TENU"/* 122D4 */, /*39257*/"CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR"/* 122D5 */,/*39258*/"CUNEIFORM SIGN SHITA"/* 122D6 */, /*39259*/"CUNEIFORM SIGN SHU"/* 122D7 */,/*39260*/"CUNEIFORM SIGN SHU OVER INVERTED SHU"/* 122D8 */, /*39261*/"CUNEIFORM SIGN SHU2"/* 122D9 */,/*39262*/"CUNEIFORM SIGN SHUBUR"/* 122DA */, /*39263*/"CUNEIFORM SIGN SI"/* 122DB */,/*39264*/"CUNEIFORM SIGN SI GUNU"/* 122DC */, /*39265*/"CUNEIFORM SIGN SIG"/* 122DD */,/*39266*/"CUNEIFORM SIGN SIG4"/* 122DE */, /*39267*/"CUNEIFORM SIGN SIG4 OVER SIG4 SHU2"/* 122DF */,/*39268*/"CUNEIFORM SIGN SIK2"/* 122E0 */, /*39269*/"CUNEIFORM SIGN SILA3"/* 122E1 */,/*39270*/"CUNEIFORM SIGN SU"/* 122E2 */, /*39271*/"CUNEIFORM SIGN SU OVER SU"/* 122E3 */,/*39272*/"CUNEIFORM SIGN SUD"/* 122E4 */, /*39273*/"CUNEIFORM SIGN SUD2"/* 122E5 */,/*39274*/"CUNEIFORM SIGN SUHUR"/* 122E6 */, /*39275*/"CUNEIFORM SIGN SUM"/* 122E7 */,/*39276*/"CUNEIFORM SIGN SUMASH"/* 122E8 */, /*39277*/"CUNEIFORM SIGN SUR"/* 122E9 */,/*39278*/"CUNEIFORM SIGN SUR9"/* 122EA */, /*39279*/"CUNEIFORM SIGN TA"/* 122EB */,/*39280*/"CUNEIFORM SIGN TA ASTERISK"/* 122EC */, /*39281*/"CUNEIFORM SIGN TA TIMES HI"/* 122ED */,/*39282*/"CUNEIFORM SIGN TA TIMES MI"/* 122EE */, /*39283*/"CUNEIFORM SIGN TA GUNU"/* 122EF */,/*39284*/"CUNEIFORM SIGN TAB"/* 122F0 */, /*39285*/"CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH"/* 122F1 */, /*39286*/"CUNEIFORM SIGN TAB SQUARED"/* 122F2 */,/*39287*/"CUNEIFORM SIGN TAG"/* 122F3 */, /*39288*/"CUNEIFORM SIGN TAG TIMES BI"/* 122F4 */,/*39289*/"CUNEIFORM SIGN TAG TIMES GUD"/* 122F5 */, /*39290*/"CUNEIFORM SIGN TAG TIMES SHE"/* 122F6 */,/*39291*/"CUNEIFORM SIGN TAG TIMES SHU"/* 122F7 */, /*39292*/"CUNEIFORM SIGN TAG TIMES TUG2"/* 122F8 */,/*39293*/"CUNEIFORM SIGN TAG TIMES UD"/* 122F9 */, /*39294*/"CUNEIFORM SIGN TAK4"/* 122FA */,/*39295*/"CUNEIFORM SIGN TAR"/* 122FB */, /*39296*/"CUNEIFORM SIGN TE"/* 122FC */,/*39297*/"CUNEIFORM SIGN TE GUNU"/* 122FD */, /*39298*/"CUNEIFORM SIGN TI"/* 122FE */,/*39299*/"CUNEIFORM SIGN TI TENU"/* 122FF */, /*39300*/"CUNEIFORM SIGN TIL"/* 12300 */,/*39301*/"CUNEIFORM SIGN TIR"/* 12301 */, /*39302*/"CUNEIFORM SIGN TIR TIMES TAK4"/* 12302 */,/*39303*/"CUNEIFORM SIGN TIR OVER TIR"/* 12303 */, /*39304*/"CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR"/* 12304 */,/*39305*/"CUNEIFORM SIGN TU"/* 12305 */, /*39306*/"CUNEIFORM SIGN TUG2"/* 12306 */,/*39307*/"CUNEIFORM SIGN TUK"/* 12307 */, /*39308*/"CUNEIFORM SIGN TUM"/* 12308 */,/*39309*/"CUNEIFORM SIGN TUR"/* 12309 */, /*39310*/"CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA"/* 1230A */,/*39311*/"CUNEIFORM SIGN U"/* 1230B */, /*39312*/"CUNEIFORM SIGN U GUD"/* 1230C */,/*39313*/"CUNEIFORM SIGN U U U"/* 1230D */, /*39314*/"CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR"/* 1230E */, /*39315*/"CUNEIFORM SIGN U OVER U SUR OVER SUR"/* 1230F */, /*39316*/"CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED"/* 12310 */,/*39317*/"CUNEIFORM SIGN U2"/* 12311 */, /*39318*/"CUNEIFORM SIGN UB"/* 12312 */,/*39319*/"CUNEIFORM SIGN UD"/* 12313 */, /*39320*/"CUNEIFORM SIGN UD KUSHU2"/* 12314 */,/*39321*/"CUNEIFORM SIGN UD TIMES BAD"/* 12315 */, /*39322*/"CUNEIFORM SIGN UD TIMES MI"/* 12316 */,/*39323*/"CUNEIFORM SIGN UD TIMES U PLUS U PLUS U"/* 12317 */, /*39324*/"CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU"/* 12318 */,/*39325*/"CUNEIFORM SIGN UD GUNU"/* 12319 */, /*39326*/"CUNEIFORM SIGN UD SHESHIG"/* 1231A */,/*39327*/"CUNEIFORM SIGN UD SHESHIG TIMES BAD"/* 1231B */, /*39328*/"CUNEIFORM SIGN UDUG"/* 1231C */,/*39329*/"CUNEIFORM SIGN UM"/* 1231D */, /*39330*/"CUNEIFORM SIGN UM TIMES LAGAB"/* 1231E */,/*39331*/"CUNEIFORM SIGN UM TIMES ME PLUS DA"/* 1231F */, /*39332*/"CUNEIFORM SIGN UM TIMES SHA3"/* 12320 */,/*39333*/"CUNEIFORM SIGN UM TIMES U"/* 12321 */, /*39334*/"CUNEIFORM SIGN UMBIN"/* 12322 */,/*39335*/"CUNEIFORM SIGN UMUM"/* 12323 */, /*39336*/"CUNEIFORM SIGN UMUM TIMES KASKAL"/* 12324 */,/*39337*/"CUNEIFORM SIGN UMUM TIMES PA"/* 12325 */, /*39338*/"CUNEIFORM SIGN UN"/* 12326 */,/*39339*/"CUNEIFORM SIGN UN GUNU"/* 12327 */, /*39340*/"CUNEIFORM SIGN UR"/* 12328 */,/*39341*/"CUNEIFORM SIGN UR CROSSING UR"/* 12329 */, /*39342*/"CUNEIFORM SIGN UR SHESHIG"/* 1232A */,/*39343*/"CUNEIFORM SIGN UR2"/* 1232B */, /*39344*/"CUNEIFORM SIGN UR2 TIMES A PLUS HA"/* 1232C */,/*39345*/"CUNEIFORM SIGN UR2 TIMES A PLUS NA"/* 1232D */, /*39346*/"CUNEIFORM SIGN UR2 TIMES AL"/* 1232E */,/*39347*/"CUNEIFORM SIGN UR2 TIMES HA"/* 1232F */, /*39348*/"CUNEIFORM SIGN UR2 TIMES NUN"/* 12330 */,/*39349*/"CUNEIFORM SIGN UR2 TIMES U2"/* 12331 */, /*39350*/"CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH"/* 12332 */,/*39351*/"CUNEIFORM SIGN UR2 TIMES U2 PLUS BI"/* 12333 */, /*39352*/"CUNEIFORM SIGN UR4"/* 12334 */,/*39353*/"CUNEIFORM SIGN URI"/* 12335 */, /*39354*/"CUNEIFORM SIGN URI3"/* 12336 */,/*39355*/"CUNEIFORM SIGN URU"/* 12337 */, /*39356*/"CUNEIFORM SIGN URU TIMES A"/* 12338 */,/*39357*/"CUNEIFORM SIGN URU TIMES ASHGAB"/* 12339 */, /*39358*/"CUNEIFORM SIGN URU TIMES BAR"/* 1233A */,/*39359*/"CUNEIFORM SIGN URU TIMES DUN"/* 1233B */, /*39360*/"CUNEIFORM SIGN URU TIMES GA"/* 1233C */,/*39361*/"CUNEIFORM SIGN URU TIMES GAL"/* 1233D */, /*39362*/"CUNEIFORM SIGN URU TIMES GAN2 TENU"/* 1233E */,/*39363*/"CUNEIFORM SIGN URU TIMES GAR"/* 1233F */, /*39364*/"CUNEIFORM SIGN URU TIMES GU"/* 12340 */,/*39365*/"CUNEIFORM SIGN URU TIMES HA"/* 12341 */, /*39366*/"CUNEIFORM SIGN URU TIMES IGI"/* 12342 */,/*39367*/"CUNEIFORM SIGN URU TIMES IM"/* 12343 */, /*39368*/"CUNEIFORM SIGN URU TIMES ISH"/* 12344 */,/*39369*/"CUNEIFORM SIGN URU TIMES KI"/* 12345 */, /*39370*/"CUNEIFORM SIGN URU TIMES LUM"/* 12346 */,/*39371*/"CUNEIFORM SIGN URU TIMES MIN"/* 12347 */, /*39372*/"CUNEIFORM SIGN URU TIMES PA"/* 12348 */,/*39373*/"CUNEIFORM SIGN URU TIMES SHE"/* 12349 */, /*39374*/"CUNEIFORM SIGN URU TIMES SIG4"/* 1234A */,/*39375*/"CUNEIFORM SIGN URU TIMES TU"/* 1234B */, /*39376*/"CUNEIFORM SIGN URU TIMES U PLUS GUD"/* 1234C */,/*39377*/"CUNEIFORM SIGN URU TIMES UD"/* 1234D */, /*39378*/"CUNEIFORM SIGN URU TIMES URUDA"/* 1234E */,/*39379*/"CUNEIFORM SIGN URUDA"/* 1234F */, /*39380*/"CUNEIFORM SIGN URUDA TIMES U"/* 12350 */,/*39381*/"CUNEIFORM SIGN USH"/* 12351 */, /*39382*/"CUNEIFORM SIGN USH TIMES A"/* 12352 */,/*39383*/"CUNEIFORM SIGN USH TIMES KU"/* 12353 */, /*39384*/"CUNEIFORM SIGN USH TIMES KUR"/* 12354 */,/*39385*/"CUNEIFORM SIGN USH TIMES TAK4"/* 12355 */, /*39386*/"CUNEIFORM SIGN USHX"/* 12356 */,/*39387*/"CUNEIFORM SIGN USH2"/* 12357 */, /*39388*/"CUNEIFORM SIGN USHUMX"/* 12358 */,/*39389*/"CUNEIFORM SIGN UTUKI"/* 12359 */, /*39390*/"CUNEIFORM SIGN UZ3"/* 1235A */,/*39391*/"CUNEIFORM SIGN UZ3 TIMES KASKAL"/* 1235B */, /*39392*/"CUNEIFORM SIGN UZU"/* 1235C */,/*39393*/"CUNEIFORM SIGN ZA"/* 1235D */, /*39394*/"CUNEIFORM SIGN ZA TENU"/* 1235E */,/*39395*/"CUNEIFORM SIGN ZA SQUARED TIMES KUR"/* 1235F */, /*39396*/"CUNEIFORM SIGN ZAG"/* 12360 */,/*39397*/"CUNEIFORM SIGN ZAMX"/* 12361 */, /*39398*/"CUNEIFORM SIGN ZE2"/* 12362 */,/*39399*/"CUNEIFORM SIGN ZI"/* 12363 */, /*39400*/"CUNEIFORM SIGN ZI OVER ZI"/* 12364 */,/*39401*/"CUNEIFORM SIGN ZI3"/* 12365 */, /*39402*/"CUNEIFORM SIGN ZIB"/* 12366 */,/*39403*/"CUNEIFORM SIGN ZIB KABA TENU"/* 12367 */, /*39404*/"CUNEIFORM SIGN ZIG"/* 12368 */,/*39405*/"CUNEIFORM SIGN ZIZ2"/* 12369 */, /*39406*/"CUNEIFORM SIGN ZU"/* 1236A */,/*39407*/"CUNEIFORM SIGN ZU5"/* 1236B */, /*39408*/"CUNEIFORM SIGN ZU5 TIMES A"/* 1236C */,/*39409*/"CUNEIFORM SIGN ZUBUR"/* 1236D */, /*39410*/"CUNEIFORM SIGN ZUM"/* 1236E */,/*39411*/"CUNEIFORM SIGN KAP ELAMITE"/* 1236F */, /*39412*/"CUNEIFORM SIGN AB TIMES NUN"/* 12370 */,/*39413*/"CUNEIFORM SIGN AB2 TIMES A"/* 12371 */, /*39414*/"CUNEIFORM SIGN AMAR TIMES KUG"/* 12372 */,/*39415*/"CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS MASH"/* 12373 */, /*39416*/"CUNEIFORM SIGN DAG3"/* 12374 */,/*39417*/"CUNEIFORM SIGN DISH PLUS SHU"/* 12375 */, /*39418*/"CUNEIFORM SIGN DUB TIMES SHE"/* 12376 */,/*39419*/"CUNEIFORM SIGN EZEN TIMES GUD"/* 12377 */, /*39420*/"CUNEIFORM SIGN EZEN TIMES SHE"/* 12378 */,/*39421*/"CUNEIFORM SIGN GA2 TIMES AN PLUS KAK PLUS A"/* 12379 */, /*39422*/"CUNEIFORM SIGN GA2 TIMES ASH2"/* 1237A */,/*39423*/"CUNEIFORM SIGN GE22"/* 1237B */, /*39424*/"CUNEIFORM SIGN GIG"/* 1237C */,/*39425*/"CUNEIFORM SIGN HUSH"/* 1237D */, /*39426*/"CUNEIFORM SIGN KA TIMES ANSHE"/* 1237E */,/*39427*/"CUNEIFORM SIGN KA TIMES ASH3"/* 1237F */, /*39428*/"CUNEIFORM SIGN KA TIMES GISH"/* 12380 */,/*39429*/"CUNEIFORM SIGN KA TIMES GUD"/* 12381 */, /*39430*/"CUNEIFORM SIGN KA TIMES HI TIMES ASH2"/* 12382 */,/*39431*/"CUNEIFORM SIGN KA TIMES LUM"/* 12383 */, /*39432*/"CUNEIFORM SIGN KA TIMES PA"/* 12384 */,/*39433*/"CUNEIFORM SIGN KA TIMES SHUL"/* 12385 */, /*39434*/"CUNEIFORM SIGN KA TIMES TU"/* 12386 */,/*39435*/"CUNEIFORM SIGN KA TIMES UR2"/* 12387 */, /*39436*/"CUNEIFORM SIGN LAGAB TIMES GI"/* 12388 */,/*39437*/"CUNEIFORM SIGN LU2 SHESHIG TIMES BAD"/* 12389 */, /*39438*/"CUNEIFORM SIGN LU2 TIMES ESH2 PLUS LAL"/* 1238A */,/*39439*/"CUNEIFORM SIGN LU2 TIMES SHU"/* 1238B */, /*39440*/"CUNEIFORM SIGN MESH"/* 1238C */,/*39441*/"CUNEIFORM SIGN MUSH3 TIMES ZA"/* 1238D */, /*39442*/"CUNEIFORM SIGN NA4"/* 1238E */,/*39443*/"CUNEIFORM SIGN NIN"/* 1238F */, /*39444*/"CUNEIFORM SIGN NIN9"/* 12390 */,/*39445*/"CUNEIFORM SIGN NINDA2 TIMES BAL"/* 12391 */, /*39446*/"CUNEIFORM SIGN NINDA2 TIMES GI"/* 12392 */,/*39447*/"CUNEIFORM SIGN NU11 ROTATED NINETY DEGREES"/* 12393 */, /*39448*/"CUNEIFORM SIGN PESH2 ASTERISK"/* 12394 */,/*39449*/"CUNEIFORM SIGN PIR2"/* 12395 */, /*39450*/"CUNEIFORM SIGN SAG TIMES IGI GUNU"/* 12396 */,/*39451*/"CUNEIFORM SIGN TI2"/* 12397 */, /*39452*/"CUNEIFORM SIGN UM TIMES ME"/* 12398 */,/*39453*/"CUNEIFORM SIGN U U"/* 12399 */,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*39556*/"CUNEIFORM NUMERIC SIGN TWO ASH"/* 12400 */,/*39557*/"CUNEIFORM NUMERIC SIGN THREE ASH"/* 12401 */, /*39558*/"CUNEIFORM NUMERIC SIGN FOUR ASH"/* 12402 */,/*39559*/"CUNEIFORM NUMERIC SIGN FIVE ASH"/* 12403 */, /*39560*/"CUNEIFORM NUMERIC SIGN SIX ASH"/* 12404 */,/*39561*/"CUNEIFORM NUMERIC SIGN SEVEN ASH"/* 12405 */, /*39562*/"CUNEIFORM NUMERIC SIGN EIGHT ASH"/* 12406 */,/*39563*/"CUNEIFORM NUMERIC SIGN NINE ASH"/* 12407 */, /*39564*/"CUNEIFORM NUMERIC SIGN THREE DISH"/* 12408 */,/*39565*/"CUNEIFORM NUMERIC SIGN FOUR DISH"/* 12409 */, /*39566*/"CUNEIFORM NUMERIC SIGN FIVE DISH"/* 1240A */,/*39567*/"CUNEIFORM NUMERIC SIGN SIX DISH"/* 1240B */, /*39568*/"CUNEIFORM NUMERIC SIGN SEVEN DISH"/* 1240C */,/*39569*/"CUNEIFORM NUMERIC SIGN EIGHT DISH"/* 1240D */, /*39570*/"CUNEIFORM NUMERIC SIGN NINE DISH"/* 1240E */,/*39571*/"CUNEIFORM NUMERIC SIGN FOUR U"/* 1240F */, /*39572*/"CUNEIFORM NUMERIC SIGN FIVE U"/* 12410 */,/*39573*/"CUNEIFORM NUMERIC SIGN SIX U"/* 12411 */, /*39574*/"CUNEIFORM NUMERIC SIGN SEVEN U"/* 12412 */,/*39575*/"CUNEIFORM NUMERIC SIGN EIGHT U"/* 12413 */, /*39576*/"CUNEIFORM NUMERIC SIGN NINE U"/* 12414 */,/*39577*/"CUNEIFORM NUMERIC SIGN ONE GESH2"/* 12415 */, /*39578*/"CUNEIFORM NUMERIC SIGN TWO GESH2"/* 12416 */,/*39579*/"CUNEIFORM NUMERIC SIGN THREE GESH2"/* 12417 */, /*39580*/"CUNEIFORM NUMERIC SIGN FOUR GESH2"/* 12418 */,/*39581*/"CUNEIFORM NUMERIC SIGN FIVE GESH2"/* 12419 */, /*39582*/"CUNEIFORM NUMERIC SIGN SIX GESH2"/* 1241A */,/*39583*/"CUNEIFORM NUMERIC SIGN SEVEN GESH2"/* 1241B */, /*39584*/"CUNEIFORM NUMERIC SIGN EIGHT GESH2"/* 1241C */,/*39585*/"CUNEIFORM NUMERIC SIGN NINE GESH2"/* 1241D */, /*39586*/"CUNEIFORM NUMERIC SIGN ONE GESHU"/* 1241E */,/*39587*/"CUNEIFORM NUMERIC SIGN TWO GESHU"/* 1241F */, /*39588*/"CUNEIFORM NUMERIC SIGN THREE GESHU"/* 12420 */,/*39589*/"CUNEIFORM NUMERIC SIGN FOUR GESHU"/* 12421 */, /*39590*/"CUNEIFORM NUMERIC SIGN FIVE GESHU"/* 12422 */,/*39591*/"CUNEIFORM NUMERIC SIGN TWO SHAR2"/* 12423 */, /*39592*/"CUNEIFORM NUMERIC SIGN THREE SHAR2"/* 12424 */, /*39593*/"CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM"/* 12425 */, /*39594*/"CUNEIFORM NUMERIC SIGN FOUR SHAR2"/* 12426 */,/*39595*/"CUNEIFORM NUMERIC SIGN FIVE SHAR2"/* 12427 */, /*39596*/"CUNEIFORM NUMERIC SIGN SIX SHAR2"/* 12428 */,/*39597*/"CUNEIFORM NUMERIC SIGN SEVEN SHAR2"/* 12429 */, /*39598*/"CUNEIFORM NUMERIC SIGN EIGHT SHAR2"/* 1242A */,/*39599*/"CUNEIFORM NUMERIC SIGN NINE SHAR2"/* 1242B */, /*39600*/"CUNEIFORM NUMERIC SIGN ONE SHARU"/* 1242C */,/*39601*/"CUNEIFORM NUMERIC SIGN TWO SHARU"/* 1242D */, /*39602*/"CUNEIFORM NUMERIC SIGN THREE SHARU"/* 1242E */, /*39603*/"CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM"/* 1242F */, /*39604*/"CUNEIFORM NUMERIC SIGN FOUR SHARU"/* 12430 */,/*39605*/"CUNEIFORM NUMERIC SIGN FIVE SHARU"/* 12431 */, /*39606*/"CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH"/* 12432 */, /*39607*/"CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN"/* 12433 */, /*39608*/"CUNEIFORM NUMERIC SIGN ONE BURU"/* 12434 */,/*39609*/"CUNEIFORM NUMERIC SIGN TWO BURU"/* 12435 */, /*39610*/"CUNEIFORM NUMERIC SIGN THREE BURU"/* 12436 */, /*39611*/"CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM"/* 12437 */, /*39612*/"CUNEIFORM NUMERIC SIGN FOUR BURU"/* 12438 */,/*39613*/"CUNEIFORM NUMERIC SIGN FIVE BURU"/* 12439 */, /*39614*/"CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16"/* 1243A */, /*39615*/"CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21"/* 1243B */, /*39616*/"CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU"/* 1243C */, /*39617*/"CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4"/* 1243D */, /*39618*/"CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A"/* 1243E */, /*39619*/"CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B"/* 1243F */, /*39620*/"CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9"/* 12440 */, /*39621*/"CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3"/* 12441 */, /*39622*/"CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A"/* 12442 */, /*39623*/"CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B"/* 12443 */, /*39624*/"CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU"/* 12444 */, /*39625*/"CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3"/* 12445 */, /*39626*/"CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU"/* 12446 */, /*39627*/"CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3"/* 12447 */, /*39628*/"CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4"/* 12448 */, /*39629*/"CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A"/* 12449 */, /*39630*/"CUNEIFORM NUMERIC SIGN TWO ASH TENU"/* 1244A */,/*39631*/"CUNEIFORM NUMERIC SIGN THREE ASH TENU"/* 1244B */, /*39632*/"CUNEIFORM NUMERIC SIGN FOUR ASH TENU"/* 1244C */,/*39633*/"CUNEIFORM NUMERIC SIGN FIVE ASH TENU"/* 1244D */, /*39634*/"CUNEIFORM NUMERIC SIGN SIX ASH TENU"/* 1244E */,/*39635*/"CUNEIFORM NUMERIC SIGN ONE BAN2"/* 1244F */, /*39636*/"CUNEIFORM NUMERIC SIGN TWO BAN2"/* 12450 */,/*39637*/"CUNEIFORM NUMERIC SIGN THREE BAN2"/* 12451 */, /*39638*/"CUNEIFORM NUMERIC SIGN FOUR BAN2"/* 12452 */, /*39639*/"CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM"/* 12453 */, /*39640*/"CUNEIFORM NUMERIC SIGN FIVE BAN2"/* 12454 */, /*39641*/"CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM"/* 12455 */, /*39642*/"CUNEIFORM NUMERIC SIGN NIGIDAMIN"/* 12456 */,/*39643*/"CUNEIFORM NUMERIC SIGN NIGIDAESH"/* 12457 */, /*39644*/"CUNEIFORM NUMERIC SIGN ONE ESHE3"/* 12458 */,/*39645*/"CUNEIFORM NUMERIC SIGN TWO ESHE3"/* 12459 */, /*39646*/"CUNEIFORM NUMERIC SIGN ONE THIRD DISH"/* 1245A */,/*39647*/"CUNEIFORM NUMERIC SIGN TWO THIRDS DISH"/* 1245B */, /*39648*/"CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH"/* 1245C */, /*39649*/"CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A"/* 1245D */, /*39650*/"CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A"/* 1245E */, /*39651*/"CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH"/* 1245F */,/*39652*/"CUNEIFORM NUMERIC SIGN ONE QUARTER ASH"/* 12460 */, /*39653*/"CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH"/* 12461 */, /*39654*/"CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER"/* 12462 */, /*39655*/"CUNEIFORM NUMERIC SIGN ONE QUARTER GUR"/* 12463 */,/*39656*/"CUNEIFORM NUMERIC SIGN ONE HALF GUR"/* 12464 */, /*39657*/"CUNEIFORM NUMERIC SIGN ELAMITE ONE THIRD"/* 12465 */, /*39658*/"CUNEIFORM NUMERIC SIGN ELAMITE TWO THIRDS"/* 12466 */, /*39659*/"CUNEIFORM NUMERIC SIGN ELAMITE FORTY"/* 12467 */,/*39660*/"CUNEIFORM NUMERIC SIGN ELAMITE FIFTY"/* 12468 */, /*39661*/"CUNEIFORM NUMERIC SIGN FOUR U VARIANT FORM"/* 12469 */, /*39662*/"CUNEIFORM NUMERIC SIGN FIVE U VARIANT FORM"/* 1246A */, /*39663*/"CUNEIFORM NUMERIC SIGN SIX U VARIANT FORM"/* 1246B */, /*39664*/"CUNEIFORM NUMERIC SIGN SEVEN U VARIANT FORM"/* 1246C */, /*39665*/"CUNEIFORM NUMERIC SIGN EIGHT U VARIANT FORM"/* 1246D */, /*39666*/"CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM"/* 1246E */,NULL, /*39668*/"CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER"/* 12470 */, /*39669*/"CUNEIFORM PUNCTUATION SIGN VERTICAL COLON"/* 12471 */, /*39670*/"CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON"/* 12472 */, /*39671*/"CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON"/* 12473 */, /*39672*/"CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON"/* 12474 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,/*39684*/"CUNEIFORM SIGN AB TIMES NUN TENU"/* 12480 */,/*39685*/"CUNEIFORM SIGN AB TIMES SHU2"/* 12481 */, /*39686*/"CUNEIFORM SIGN AD TIMES ESH2"/* 12482 */,/*39687*/"CUNEIFORM SIGN BAD TIMES DISH TENU"/* 12483 */, /*39688*/"CUNEIFORM SIGN BAHAR2 TIMES AB2"/* 12484 */,/*39689*/"CUNEIFORM SIGN BAHAR2 TIMES NI"/* 12485 */, /*39690*/"CUNEIFORM SIGN BAHAR2 TIMES ZA"/* 12486 */,/*39691*/"CUNEIFORM SIGN BU OVER BU TIMES NA2"/* 12487 */, /*39692*/"CUNEIFORM SIGN DA TIMES TAK4"/* 12488 */,/*39693*/"CUNEIFORM SIGN DAG TIMES KUR"/* 12489 */, /*39694*/"CUNEIFORM SIGN DIM TIMES IGI"/* 1248A */,/*39695*/"CUNEIFORM SIGN DIM TIMES U U U"/* 1248B */, /*39696*/"CUNEIFORM SIGN DIM2 TIMES UD"/* 1248C */,/*39697*/"CUNEIFORM SIGN DUG TIMES ANSHE"/* 1248D */, /*39698*/"CUNEIFORM SIGN DUG TIMES ASH"/* 1248E */,/*39699*/"CUNEIFORM SIGN DUG TIMES ASH AT LEFT"/* 1248F */, /*39700*/"CUNEIFORM SIGN DUG TIMES DIN"/* 12490 */,/*39701*/"CUNEIFORM SIGN DUG TIMES DUN"/* 12491 */, /*39702*/"CUNEIFORM SIGN DUG TIMES ERIN2"/* 12492 */,/*39703*/"CUNEIFORM SIGN DUG TIMES GA"/* 12493 */, /*39704*/"CUNEIFORM SIGN DUG TIMES GI"/* 12494 */,/*39705*/"CUNEIFORM SIGN DUG TIMES GIR2 GUNU"/* 12495 */, /*39706*/"CUNEIFORM SIGN DUG TIMES GISH"/* 12496 */,/*39707*/"CUNEIFORM SIGN DUG TIMES HA"/* 12497 */, /*39708*/"CUNEIFORM SIGN DUG TIMES HI"/* 12498 */,/*39709*/"CUNEIFORM SIGN DUG TIMES IGI GUNU"/* 12499 */, /*39710*/"CUNEIFORM SIGN DUG TIMES KASKAL"/* 1249A */,/*39711*/"CUNEIFORM SIGN DUG TIMES KUR"/* 1249B */, /*39712*/"CUNEIFORM SIGN DUG TIMES KUSHU2"/* 1249C */,/*39713*/"CUNEIFORM SIGN DUG TIMES KUSHU2 PLUS KASKAL"/* 1249D */, /*39714*/"CUNEIFORM SIGN DUG TIMES LAK-020"/* 1249E */,/*39715*/"CUNEIFORM SIGN DUG TIMES LAM"/* 1249F */, /*39716*/"CUNEIFORM SIGN DUG TIMES LAM TIMES KUR"/* 124A0 */, /*39717*/"CUNEIFORM SIGN DUG TIMES LUH PLUS GISH"/* 124A1 */,/*39718*/"CUNEIFORM SIGN DUG TIMES MASH"/* 124A2 */, /*39719*/"CUNEIFORM SIGN DUG TIMES MES"/* 124A3 */,/*39720*/"CUNEIFORM SIGN DUG TIMES MI"/* 124A4 */, /*39721*/"CUNEIFORM SIGN DUG TIMES NI"/* 124A5 */,/*39722*/"CUNEIFORM SIGN DUG TIMES PI"/* 124A6 */, /*39723*/"CUNEIFORM SIGN DUG TIMES SHE"/* 124A7 */,/*39724*/"CUNEIFORM SIGN DUG TIMES SI GUNU"/* 124A8 */, /*39725*/"CUNEIFORM SIGN E2 TIMES KUR"/* 124A9 */,/*39726*/"CUNEIFORM SIGN E2 TIMES PAP"/* 124AA */, /*39727*/"CUNEIFORM SIGN ERIN2 X"/* 124AB */,/*39728*/"CUNEIFORM SIGN ESH2 CROSSING ESH2"/* 124AC */, /*39729*/"CUNEIFORM SIGN EZEN SHESHIG TIMES ASH"/* 124AD */,/*39730*/"CUNEIFORM SIGN EZEN SHESHIG TIMES HI"/* 124AE */, /*39731*/"CUNEIFORM SIGN EZEN SHESHIG TIMES IGI GUNU"/* 124AF */, /*39732*/"CUNEIFORM SIGN EZEN SHESHIG TIMES LA"/* 124B0 */,/*39733*/"CUNEIFORM SIGN EZEN SHESHIG TIMES LAL"/* 124B1 */, /*39734*/"CUNEIFORM SIGN EZEN SHESHIG TIMES ME"/* 124B2 */,/*39735*/"CUNEIFORM SIGN EZEN SHESHIG TIMES MES"/* 124B3 */, /*39736*/"CUNEIFORM SIGN EZEN SHESHIG TIMES SU"/* 124B4 */,/*39737*/"CUNEIFORM SIGN EZEN TIMES SU"/* 124B5 */, /*39738*/"CUNEIFORM SIGN GA2 TIMES BAHAR2"/* 124B6 */,/*39739*/"CUNEIFORM SIGN GA2 TIMES DIM GUNU"/* 124B7 */, /*39740*/"CUNEIFORM SIGN GA2 TIMES DUG TIMES IGI GUNU"/* 124B8 */, /*39741*/"CUNEIFORM SIGN GA2 TIMES DUG TIMES KASKAL"/* 124B9 */,/*39742*/"CUNEIFORM SIGN GA2 TIMES EREN"/* 124BA */, /*39743*/"CUNEIFORM SIGN GA2 TIMES GA"/* 124BB */,/*39744*/"CUNEIFORM SIGN GA2 TIMES GAR PLUS DI"/* 124BC */, /*39745*/"CUNEIFORM SIGN GA2 TIMES GAR PLUS NE"/* 124BD */,/*39746*/"CUNEIFORM SIGN GA2 TIMES HA PLUS A"/* 124BE */, /*39747*/"CUNEIFORM SIGN GA2 TIMES KUSHU2 PLUS KASKAL"/* 124BF */,/*39748*/"CUNEIFORM SIGN GA2 TIMES LAM"/* 124C0 */, /*39749*/"CUNEIFORM SIGN GA2 TIMES LAM TIMES KUR"/* 124C1 */,/*39750*/"CUNEIFORM SIGN GA2 TIMES LUH"/* 124C2 */, /*39751*/"CUNEIFORM SIGN GA2 TIMES MUSH"/* 124C3 */,/*39752*/"CUNEIFORM SIGN GA2 TIMES NE"/* 124C4 */, /*39753*/"CUNEIFORM SIGN GA2 TIMES NE PLUS E2"/* 124C5 */,/*39754*/"CUNEIFORM SIGN GA2 TIMES NE PLUS GI"/* 124C6 */, /*39755*/"CUNEIFORM SIGN GA2 TIMES SHIM"/* 124C7 */,/*39756*/"CUNEIFORM SIGN GA2 TIMES ZIZ2"/* 124C8 */, /*39757*/"CUNEIFORM SIGN GABA ROTATED NINETY DEGREES"/* 124C9 */,/*39758*/"CUNEIFORM SIGN GESHTIN TIMES U"/* 124CA */, /*39759*/"CUNEIFORM SIGN GISH TIMES GISH CROSSING GISH"/* 124CB */, /*39760*/"CUNEIFORM SIGN GU2 TIMES IGI GUNU"/* 124CC */,/*39761*/"CUNEIFORM SIGN GUD PLUS GISH TIMES TAK4"/* 124CD */, /*39762*/"CUNEIFORM SIGN HA TENU GUNU"/* 124CE */,/*39763*/"CUNEIFORM SIGN HI TIMES ASH OVER HI TIMES ASH"/* 124CF */, /*39764*/"CUNEIFORM SIGN KA TIMES BU"/* 124D0 */,/*39765*/"CUNEIFORM SIGN KA TIMES KA"/* 124D1 */, /*39766*/"CUNEIFORM SIGN KA TIMES U U U"/* 124D2 */,/*39767*/"CUNEIFORM SIGN KA TIMES UR"/* 124D3 */, /*39768*/"CUNEIFORM SIGN LAGAB TIMES ZU OVER ZU"/* 124D4 */,/*39769*/"CUNEIFORM SIGN LAK-003"/* 124D5 */, /*39770*/"CUNEIFORM SIGN LAK-021"/* 124D6 */,/*39771*/"CUNEIFORM SIGN LAK-025"/* 124D7 */, /*39772*/"CUNEIFORM SIGN LAK-030"/* 124D8 */,/*39773*/"CUNEIFORM SIGN LAK-050"/* 124D9 */, /*39774*/"CUNEIFORM SIGN LAK-051"/* 124DA */,/*39775*/"CUNEIFORM SIGN LAK-062"/* 124DB */, /*39776*/"CUNEIFORM SIGN LAK-079 OVER LAK-079 GUNU"/* 124DC */,/*39777*/"CUNEIFORM SIGN LAK-080"/* 124DD */, /*39778*/"CUNEIFORM SIGN LAK-081 OVER LAK-081"/* 124DE */,/*39779*/"CUNEIFORM SIGN LAK-092"/* 124DF */, /*39780*/"CUNEIFORM SIGN LAK-130"/* 124E0 */,/*39781*/"CUNEIFORM SIGN LAK-142"/* 124E1 */, /*39782*/"CUNEIFORM SIGN LAK-210"/* 124E2 */,/*39783*/"CUNEIFORM SIGN LAK-219"/* 124E3 */, /*39784*/"CUNEIFORM SIGN LAK-220"/* 124E4 */,/*39785*/"CUNEIFORM SIGN LAK-225"/* 124E5 */, /*39786*/"CUNEIFORM SIGN LAK-228"/* 124E6 */,/*39787*/"CUNEIFORM SIGN LAK-238"/* 124E7 */, /*39788*/"CUNEIFORM SIGN LAK-265"/* 124E8 */,/*39789*/"CUNEIFORM SIGN LAK-266"/* 124E9 */, /*39790*/"CUNEIFORM SIGN LAK-343"/* 124EA */,/*39791*/"CUNEIFORM SIGN LAK-347"/* 124EB */, /*39792*/"CUNEIFORM SIGN LAK-348"/* 124EC */,/*39793*/"CUNEIFORM SIGN LAK-383"/* 124ED */, /*39794*/"CUNEIFORM SIGN LAK-384"/* 124EE */,/*39795*/"CUNEIFORM SIGN LAK-390"/* 124EF */, /*39796*/"CUNEIFORM SIGN LAK-441"/* 124F0 */,/*39797*/"CUNEIFORM SIGN LAK-449"/* 124F1 */, /*39798*/"CUNEIFORM SIGN LAK-449 TIMES GU"/* 124F2 */,/*39799*/"CUNEIFORM SIGN LAK-449 TIMES IGI"/* 124F3 */, /*39800*/"CUNEIFORM SIGN LAK-449 TIMES PAP PLUS LU3"/* 124F4 */, /*39801*/"CUNEIFORM SIGN LAK-449 TIMES PAP PLUS PAP PLUS LU3"/* 124F5 */, /*39802*/"CUNEIFORM SIGN LAK-449 TIMES U2 PLUS BA"/* 124F6 */,/*39803*/"CUNEIFORM SIGN LAK-450"/* 124F7 */, /*39804*/"CUNEIFORM SIGN LAK-457"/* 124F8 */,/*39805*/"CUNEIFORM SIGN LAK-470"/* 124F9 */, /*39806*/"CUNEIFORM SIGN LAK-483"/* 124FA */,/*39807*/"CUNEIFORM SIGN LAK-490"/* 124FB */, /*39808*/"CUNEIFORM SIGN LAK-492"/* 124FC */,/*39809*/"CUNEIFORM SIGN LAK-493"/* 124FD */, /*39810*/"CUNEIFORM SIGN LAK-495"/* 124FE */,/*39811*/"CUNEIFORM SIGN LAK-550"/* 124FF */, /*39812*/"CUNEIFORM SIGN LAK-608"/* 12500 */,/*39813*/"CUNEIFORM SIGN LAK-617"/* 12501 */, /*39814*/"CUNEIFORM SIGN LAK-617 TIMES ASH"/* 12502 */,/*39815*/"CUNEIFORM SIGN LAK-617 TIMES BAD"/* 12503 */, /*39816*/"CUNEIFORM SIGN LAK-617 TIMES DUN3 GUNU GUNU"/* 12504 */,/*39817*/"CUNEIFORM SIGN LAK-617 TIMES KU3"/* 12505 */, /*39818*/"CUNEIFORM SIGN LAK-617 TIMES LA"/* 12506 */,/*39819*/"CUNEIFORM SIGN LAK-617 TIMES TAR"/* 12507 */, /*39820*/"CUNEIFORM SIGN LAK-617 TIMES TE"/* 12508 */,/*39821*/"CUNEIFORM SIGN LAK-617 TIMES U2"/* 12509 */, /*39822*/"CUNEIFORM SIGN LAK-617 TIMES UD"/* 1250A */,/*39823*/"CUNEIFORM SIGN LAK-617 TIMES URUDA"/* 1250B */, /*39824*/"CUNEIFORM SIGN LAK-636"/* 1250C */,/*39825*/"CUNEIFORM SIGN LAK-648"/* 1250D */, /*39826*/"CUNEIFORM SIGN LAK-648 TIMES DUB"/* 1250E */,/*39827*/"CUNEIFORM SIGN LAK-648 TIMES GA"/* 1250F */, /*39828*/"CUNEIFORM SIGN LAK-648 TIMES IGI"/* 12510 */,/*39829*/"CUNEIFORM SIGN LAK-648 TIMES IGI GUNU"/* 12511 */, /*39830*/"CUNEIFORM SIGN LAK-648 TIMES NI"/* 12512 */, /*39831*/"CUNEIFORM SIGN LAK-648 TIMES PAP PLUS PAP PLUS LU3"/* 12513 */, /*39832*/"CUNEIFORM SIGN LAK-648 TIMES SHESH PLUS KI"/* 12514 */,/*39833*/"CUNEIFORM SIGN LAK-648 TIMES UD"/* 12515 */, /*39834*/"CUNEIFORM SIGN LAK-648 TIMES URUDA"/* 12516 */,/*39835*/"CUNEIFORM SIGN LAK-724"/* 12517 */, /*39836*/"CUNEIFORM SIGN LAK-749"/* 12518 */,/*39837*/"CUNEIFORM SIGN LU2 GUNU TIMES ASH"/* 12519 */, /*39838*/"CUNEIFORM SIGN LU2 TIMES DISH"/* 1251A */,/*39839*/"CUNEIFORM SIGN LU2 TIMES HAL"/* 1251B */, /*39840*/"CUNEIFORM SIGN LU2 TIMES PAP"/* 1251C */,/*39841*/"CUNEIFORM SIGN LU2 TIMES PAP PLUS PAP PLUS LU3"/* 1251D */, /*39842*/"CUNEIFORM SIGN LU2 TIMES TAK4"/* 1251E */,/*39843*/"CUNEIFORM SIGN MI PLUS ZA7"/* 1251F */, /*39844*/"CUNEIFORM SIGN MUSH OVER MUSH TIMES GA"/* 12520 */, /*39845*/"CUNEIFORM SIGN MUSH OVER MUSH TIMES KAK"/* 12521 */,/*39846*/"CUNEIFORM SIGN NINDA2 TIMES DIM GUNU"/* 12522 */, /*39847*/"CUNEIFORM SIGN NINDA2 TIMES GISH"/* 12523 */,/*39848*/"CUNEIFORM SIGN NINDA2 TIMES GUL"/* 12524 */, /*39849*/"CUNEIFORM SIGN NINDA2 TIMES HI"/* 12525 */,/*39850*/"CUNEIFORM SIGN NINDA2 TIMES KESH2"/* 12526 */, /*39851*/"CUNEIFORM SIGN NINDA2 TIMES LAK-050"/* 12527 */,/*39852*/"CUNEIFORM SIGN NINDA2 TIMES MASH"/* 12528 */, /*39853*/"CUNEIFORM SIGN NINDA2 TIMES PAP PLUS PAP"/* 12529 */,/*39854*/"CUNEIFORM SIGN NINDA2 TIMES U"/* 1252A */, /*39855*/"CUNEIFORM SIGN NINDA2 TIMES U PLUS U"/* 1252B */,/*39856*/"CUNEIFORM SIGN NINDA2 TIMES URUDA"/* 1252C */, /*39857*/"CUNEIFORM SIGN SAG GUNU TIMES HA"/* 1252D */,/*39858*/"CUNEIFORM SIGN SAG TIMES EN"/* 1252E */, /*39859*/"CUNEIFORM SIGN SAG TIMES SHE AT LEFT"/* 1252F */,/*39860*/"CUNEIFORM SIGN SAG TIMES TAK4"/* 12530 */, /*39861*/"CUNEIFORM SIGN SHA6 TENU"/* 12531 */,/*39862*/"CUNEIFORM SIGN SHE OVER SHE"/* 12532 */, /*39863*/"CUNEIFORM SIGN SHE PLUS HUB2"/* 12533 */,/*39864*/"CUNEIFORM SIGN SHE PLUS NAM2"/* 12534 */, /*39865*/"CUNEIFORM SIGN SHE PLUS SAR"/* 12535 */,/*39866*/"CUNEIFORM SIGN SHU2 PLUS DUG TIMES NI"/* 12536 */, /*39867*/"CUNEIFORM SIGN SHU2 PLUS E2 TIMES AN"/* 12537 */,/*39868*/"CUNEIFORM SIGN SI TIMES TAK4"/* 12538 */, /*39869*/"CUNEIFORM SIGN TAK4 PLUS SAG"/* 12539 */,/*39870*/"CUNEIFORM SIGN TUM TIMES GAN2 TENU"/* 1253A */, /*39871*/"CUNEIFORM SIGN TUM TIMES THREE DISH"/* 1253B */,/*39872*/"CUNEIFORM SIGN UR2 INVERTED"/* 1253C */, /*39873*/"CUNEIFORM SIGN UR2 TIMES UD"/* 1253D */,/*39874*/"CUNEIFORM SIGN URU TIMES DARA3"/* 1253E */, /*39875*/"CUNEIFORM SIGN URU TIMES LAK-668"/* 1253F */,/*39876*/"CUNEIFORM SIGN URU TIMES LU3"/* 12540 */, /*39877*/"CUNEIFORM SIGN ZA7"/* 12541 */,/*39878*/"CUNEIFORM SIGN ZU OVER ZU PLUS SAR"/* 12542 */, /*39879*/"CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU"/* 12543 */,/*39880*/"EGYPTIAN HIEROGLYPH A001"/* 13000 */, /*39881*/"EGYPTIAN HIEROGLYPH A002"/* 13001 */,/*39882*/"EGYPTIAN HIEROGLYPH A003"/* 13002 */, /*39883*/"EGYPTIAN HIEROGLYPH A004"/* 13003 */,/*39884*/"EGYPTIAN HIEROGLYPH A005"/* 13004 */, /*39885*/"EGYPTIAN HIEROGLYPH A005A"/* 13005 */,/*39886*/"EGYPTIAN HIEROGLYPH A006"/* 13006 */, /*39887*/"EGYPTIAN HIEROGLYPH A006A"/* 13007 */,/*39888*/"EGYPTIAN HIEROGLYPH A006B"/* 13008 */, /*39889*/"EGYPTIAN HIEROGLYPH A007"/* 13009 */,/*39890*/"EGYPTIAN HIEROGLYPH A008"/* 1300A */, /*39891*/"EGYPTIAN HIEROGLYPH A009"/* 1300B */,/*39892*/"EGYPTIAN HIEROGLYPH A010"/* 1300C */, /*39893*/"EGYPTIAN HIEROGLYPH A011"/* 1300D */,/*39894*/"EGYPTIAN HIEROGLYPH A012"/* 1300E */, /*39895*/"EGYPTIAN HIEROGLYPH A013"/* 1300F */,/*39896*/"EGYPTIAN HIEROGLYPH A014"/* 13010 */, /*39897*/"EGYPTIAN HIEROGLYPH A014A"/* 13011 */,/*39898*/"EGYPTIAN HIEROGLYPH A015"/* 13012 */, /*39899*/"EGYPTIAN HIEROGLYPH A016"/* 13013 */,/*39900*/"EGYPTIAN HIEROGLYPH A017"/* 13014 */, /*39901*/"EGYPTIAN HIEROGLYPH A017A"/* 13015 */,/*39902*/"EGYPTIAN HIEROGLYPH A018"/* 13016 */, /*39903*/"EGYPTIAN HIEROGLYPH A019"/* 13017 */,/*39904*/"EGYPTIAN HIEROGLYPH A020"/* 13018 */, /*39905*/"EGYPTIAN HIEROGLYPH A021"/* 13019 */,/*39906*/"EGYPTIAN HIEROGLYPH A022"/* 1301A */, /*39907*/"EGYPTIAN HIEROGLYPH A023"/* 1301B */,/*39908*/"EGYPTIAN HIEROGLYPH A024"/* 1301C */, /*39909*/"EGYPTIAN HIEROGLYPH A025"/* 1301D */,/*39910*/"EGYPTIAN HIEROGLYPH A026"/* 1301E */, /*39911*/"EGYPTIAN HIEROGLYPH A027"/* 1301F */,/*39912*/"EGYPTIAN HIEROGLYPH A028"/* 13020 */, /*39913*/"EGYPTIAN HIEROGLYPH A029"/* 13021 */,/*39914*/"EGYPTIAN HIEROGLYPH A030"/* 13022 */, /*39915*/"EGYPTIAN HIEROGLYPH A031"/* 13023 */,/*39916*/"EGYPTIAN HIEROGLYPH A032"/* 13024 */, /*39917*/"EGYPTIAN HIEROGLYPH A032A"/* 13025 */,/*39918*/"EGYPTIAN HIEROGLYPH A033"/* 13026 */, /*39919*/"EGYPTIAN HIEROGLYPH A034"/* 13027 */,/*39920*/"EGYPTIAN HIEROGLYPH A035"/* 13028 */, /*39921*/"EGYPTIAN HIEROGLYPH A036"/* 13029 */,/*39922*/"EGYPTIAN HIEROGLYPH A037"/* 1302A */, /*39923*/"EGYPTIAN HIEROGLYPH A038"/* 1302B */,/*39924*/"EGYPTIAN HIEROGLYPH A039"/* 1302C */, /*39925*/"EGYPTIAN HIEROGLYPH A040"/* 1302D */,/*39926*/"EGYPTIAN HIEROGLYPH A040A"/* 1302E */, /*39927*/"EGYPTIAN HIEROGLYPH A041"/* 1302F */,/*39928*/"EGYPTIAN HIEROGLYPH A042"/* 13030 */, /*39929*/"EGYPTIAN HIEROGLYPH A042A"/* 13031 */,/*39930*/"EGYPTIAN HIEROGLYPH A043"/* 13032 */, /*39931*/"EGYPTIAN HIEROGLYPH A043A"/* 13033 */,/*39932*/"EGYPTIAN HIEROGLYPH A044"/* 13034 */, /*39933*/"EGYPTIAN HIEROGLYPH A045"/* 13035 */,/*39934*/"EGYPTIAN HIEROGLYPH A045A"/* 13036 */, /*39935*/"EGYPTIAN HIEROGLYPH A046"/* 13037 */,/*39936*/"EGYPTIAN HIEROGLYPH A047"/* 13038 */, /*39937*/"EGYPTIAN HIEROGLYPH A048"/* 13039 */,/*39938*/"EGYPTIAN HIEROGLYPH A049"/* 1303A */, /*39939*/"EGYPTIAN HIEROGLYPH A050"/* 1303B */,/*39940*/"EGYPTIAN HIEROGLYPH A051"/* 1303C */, /*39941*/"EGYPTIAN HIEROGLYPH A052"/* 1303D */,/*39942*/"EGYPTIAN HIEROGLYPH A053"/* 1303E */, /*39943*/"EGYPTIAN HIEROGLYPH A054"/* 1303F */,/*39944*/"EGYPTIAN HIEROGLYPH A055"/* 13040 */, /*39945*/"EGYPTIAN HIEROGLYPH A056"/* 13041 */,/*39946*/"EGYPTIAN HIEROGLYPH A057"/* 13042 */, /*39947*/"EGYPTIAN HIEROGLYPH A058"/* 13043 */,/*39948*/"EGYPTIAN HIEROGLYPH A059"/* 13044 */, /*39949*/"EGYPTIAN HIEROGLYPH A060"/* 13045 */,/*39950*/"EGYPTIAN HIEROGLYPH A061"/* 13046 */, /*39951*/"EGYPTIAN HIEROGLYPH A062"/* 13047 */,/*39952*/"EGYPTIAN HIEROGLYPH A063"/* 13048 */, /*39953*/"EGYPTIAN HIEROGLYPH A064"/* 13049 */,/*39954*/"EGYPTIAN HIEROGLYPH A065"/* 1304A */, /*39955*/"EGYPTIAN HIEROGLYPH A066"/* 1304B */,/*39956*/"EGYPTIAN HIEROGLYPH A067"/* 1304C */, /*39957*/"EGYPTIAN HIEROGLYPH A068"/* 1304D */,/*39958*/"EGYPTIAN HIEROGLYPH A069"/* 1304E */, /*39959*/"EGYPTIAN HIEROGLYPH A070"/* 1304F */,/*39960*/"EGYPTIAN HIEROGLYPH B001"/* 13050 */, /*39961*/"EGYPTIAN HIEROGLYPH B002"/* 13051 */,/*39962*/"EGYPTIAN HIEROGLYPH B003"/* 13052 */, /*39963*/"EGYPTIAN HIEROGLYPH B004"/* 13053 */,/*39964*/"EGYPTIAN HIEROGLYPH B005"/* 13054 */, /*39965*/"EGYPTIAN HIEROGLYPH B005A"/* 13055 */,/*39966*/"EGYPTIAN HIEROGLYPH B006"/* 13056 */, /*39967*/"EGYPTIAN HIEROGLYPH B007"/* 13057 */,/*39968*/"EGYPTIAN HIEROGLYPH B008"/* 13058 */, /*39969*/"EGYPTIAN HIEROGLYPH B009"/* 13059 */,/*39970*/"EGYPTIAN HIEROGLYPH C001"/* 1305A */, /*39971*/"EGYPTIAN HIEROGLYPH C002"/* 1305B */,/*39972*/"EGYPTIAN HIEROGLYPH C002A"/* 1305C */, /*39973*/"EGYPTIAN HIEROGLYPH C002B"/* 1305D */,/*39974*/"EGYPTIAN HIEROGLYPH C002C"/* 1305E */, /*39975*/"EGYPTIAN HIEROGLYPH C003"/* 1305F */,/*39976*/"EGYPTIAN HIEROGLYPH C004"/* 13060 */, /*39977*/"EGYPTIAN HIEROGLYPH C005"/* 13061 */,/*39978*/"EGYPTIAN HIEROGLYPH C006"/* 13062 */, /*39979*/"EGYPTIAN HIEROGLYPH C007"/* 13063 */,/*39980*/"EGYPTIAN HIEROGLYPH C008"/* 13064 */, /*39981*/"EGYPTIAN HIEROGLYPH C009"/* 13065 */,/*39982*/"EGYPTIAN HIEROGLYPH C010"/* 13066 */, /*39983*/"EGYPTIAN HIEROGLYPH C010A"/* 13067 */,/*39984*/"EGYPTIAN HIEROGLYPH C011"/* 13068 */, /*39985*/"EGYPTIAN HIEROGLYPH C012"/* 13069 */,/*39986*/"EGYPTIAN HIEROGLYPH C013"/* 1306A */, /*39987*/"EGYPTIAN HIEROGLYPH C014"/* 1306B */,/*39988*/"EGYPTIAN HIEROGLYPH C015"/* 1306C */, /*39989*/"EGYPTIAN HIEROGLYPH C016"/* 1306D */,/*39990*/"EGYPTIAN HIEROGLYPH C017"/* 1306E */, /*39991*/"EGYPTIAN HIEROGLYPH C018"/* 1306F */,/*39992*/"EGYPTIAN HIEROGLYPH C019"/* 13070 */, /*39993*/"EGYPTIAN HIEROGLYPH C020"/* 13071 */,/*39994*/"EGYPTIAN HIEROGLYPH C021"/* 13072 */, /*39995*/"EGYPTIAN HIEROGLYPH C022"/* 13073 */,/*39996*/"EGYPTIAN HIEROGLYPH C023"/* 13074 */, /*39997*/"EGYPTIAN HIEROGLYPH C024"/* 13075 */,/*39998*/"EGYPTIAN HIEROGLYPH D001"/* 13076 */, /*39999*/"EGYPTIAN HIEROGLYPH D002"/* 13077 */,/*40000*/"EGYPTIAN HIEROGLYPH D003"/* 13078 */, /*40001*/"EGYPTIAN HIEROGLYPH D004"/* 13079 */,/*40002*/"EGYPTIAN HIEROGLYPH D005"/* 1307A */, /*40003*/"EGYPTIAN HIEROGLYPH D006"/* 1307B */,/*40004*/"EGYPTIAN HIEROGLYPH D007"/* 1307C */, /*40005*/"EGYPTIAN HIEROGLYPH D008"/* 1307D */,/*40006*/"EGYPTIAN HIEROGLYPH D008A"/* 1307E */, /*40007*/"EGYPTIAN HIEROGLYPH D009"/* 1307F */,/*40008*/"EGYPTIAN HIEROGLYPH D010"/* 13080 */, /*40009*/"EGYPTIAN HIEROGLYPH D011"/* 13081 */,/*40010*/"EGYPTIAN HIEROGLYPH D012"/* 13082 */, /*40011*/"EGYPTIAN HIEROGLYPH D013"/* 13083 */,/*40012*/"EGYPTIAN HIEROGLYPH D014"/* 13084 */, /*40013*/"EGYPTIAN HIEROGLYPH D015"/* 13085 */,/*40014*/"EGYPTIAN HIEROGLYPH D016"/* 13086 */, /*40015*/"EGYPTIAN HIEROGLYPH D017"/* 13087 */,/*40016*/"EGYPTIAN HIEROGLYPH D018"/* 13088 */, /*40017*/"EGYPTIAN HIEROGLYPH D019"/* 13089 */,/*40018*/"EGYPTIAN HIEROGLYPH D020"/* 1308A */, /*40019*/"EGYPTIAN HIEROGLYPH D021"/* 1308B */,/*40020*/"EGYPTIAN HIEROGLYPH D022"/* 1308C */, /*40021*/"EGYPTIAN HIEROGLYPH D023"/* 1308D */,/*40022*/"EGYPTIAN HIEROGLYPH D024"/* 1308E */, /*40023*/"EGYPTIAN HIEROGLYPH D025"/* 1308F */,/*40024*/"EGYPTIAN HIEROGLYPH D026"/* 13090 */, /*40025*/"EGYPTIAN HIEROGLYPH D027"/* 13091 */,/*40026*/"EGYPTIAN HIEROGLYPH D027A"/* 13092 */, /*40027*/"EGYPTIAN HIEROGLYPH D028"/* 13093 */,/*40028*/"EGYPTIAN HIEROGLYPH D029"/* 13094 */, /*40029*/"EGYPTIAN HIEROGLYPH D030"/* 13095 */,/*40030*/"EGYPTIAN HIEROGLYPH D031"/* 13096 */, /*40031*/"EGYPTIAN HIEROGLYPH D031A"/* 13097 */,/*40032*/"EGYPTIAN HIEROGLYPH D032"/* 13098 */, /*40033*/"EGYPTIAN HIEROGLYPH D033"/* 13099 */,/*40034*/"EGYPTIAN HIEROGLYPH D034"/* 1309A */, /*40035*/"EGYPTIAN HIEROGLYPH D034A"/* 1309B */,/*40036*/"EGYPTIAN HIEROGLYPH D035"/* 1309C */, /*40037*/"EGYPTIAN HIEROGLYPH D036"/* 1309D */,/*40038*/"EGYPTIAN HIEROGLYPH D037"/* 1309E */, /*40039*/"EGYPTIAN HIEROGLYPH D038"/* 1309F */,/*40040*/"EGYPTIAN HIEROGLYPH D039"/* 130A0 */, /*40041*/"EGYPTIAN HIEROGLYPH D040"/* 130A1 */,/*40042*/"EGYPTIAN HIEROGLYPH D041"/* 130A2 */, /*40043*/"EGYPTIAN HIEROGLYPH D042"/* 130A3 */,/*40044*/"EGYPTIAN HIEROGLYPH D043"/* 130A4 */, /*40045*/"EGYPTIAN HIEROGLYPH D044"/* 130A5 */,/*40046*/"EGYPTIAN HIEROGLYPH D045"/* 130A6 */, /*40047*/"EGYPTIAN HIEROGLYPH D046"/* 130A7 */,/*40048*/"EGYPTIAN HIEROGLYPH D046A"/* 130A8 */, /*40049*/"EGYPTIAN HIEROGLYPH D047"/* 130A9 */,/*40050*/"EGYPTIAN HIEROGLYPH D048"/* 130AA */, /*40051*/"EGYPTIAN HIEROGLYPH D048A"/* 130AB */,/*40052*/"EGYPTIAN HIEROGLYPH D049"/* 130AC */, /*40053*/"EGYPTIAN HIEROGLYPH D050"/* 130AD */,/*40054*/"EGYPTIAN HIEROGLYPH D050A"/* 130AE */, /*40055*/"EGYPTIAN HIEROGLYPH D050B"/* 130AF */,/*40056*/"EGYPTIAN HIEROGLYPH D050C"/* 130B0 */, /*40057*/"EGYPTIAN HIEROGLYPH D050D"/* 130B1 */,/*40058*/"EGYPTIAN HIEROGLYPH D050E"/* 130B2 */, /*40059*/"EGYPTIAN HIEROGLYPH D050F"/* 130B3 */,/*40060*/"EGYPTIAN HIEROGLYPH D050G"/* 130B4 */, /*40061*/"EGYPTIAN HIEROGLYPH D050H"/* 130B5 */,/*40062*/"EGYPTIAN HIEROGLYPH D050I"/* 130B6 */, /*40063*/"EGYPTIAN HIEROGLYPH D051"/* 130B7 */,/*40064*/"EGYPTIAN HIEROGLYPH D052"/* 130B8 */, /*40065*/"EGYPTIAN HIEROGLYPH D052A"/* 130B9 */,/*40066*/"EGYPTIAN HIEROGLYPH D053"/* 130BA */, /*40067*/"EGYPTIAN HIEROGLYPH D054"/* 130BB */,/*40068*/"EGYPTIAN HIEROGLYPH D054A"/* 130BC */, /*40069*/"EGYPTIAN HIEROGLYPH D055"/* 130BD */,/*40070*/"EGYPTIAN HIEROGLYPH D056"/* 130BE */, /*40071*/"EGYPTIAN HIEROGLYPH D057"/* 130BF */,/*40072*/"EGYPTIAN HIEROGLYPH D058"/* 130C0 */, /*40073*/"EGYPTIAN HIEROGLYPH D059"/* 130C1 */,/*40074*/"EGYPTIAN HIEROGLYPH D060"/* 130C2 */, /*40075*/"EGYPTIAN HIEROGLYPH D061"/* 130C3 */,/*40076*/"EGYPTIAN HIEROGLYPH D062"/* 130C4 */, /*40077*/"EGYPTIAN HIEROGLYPH D063"/* 130C5 */,/*40078*/"EGYPTIAN HIEROGLYPH D064"/* 130C6 */, /*40079*/"EGYPTIAN HIEROGLYPH D065"/* 130C7 */,/*40080*/"EGYPTIAN HIEROGLYPH D066"/* 130C8 */, /*40081*/"EGYPTIAN HIEROGLYPH D067"/* 130C9 */,/*40082*/"EGYPTIAN HIEROGLYPH D067A"/* 130CA */, /*40083*/"EGYPTIAN HIEROGLYPH D067B"/* 130CB */,/*40084*/"EGYPTIAN HIEROGLYPH D067C"/* 130CC */, /*40085*/"EGYPTIAN HIEROGLYPH D067D"/* 130CD */,/*40086*/"EGYPTIAN HIEROGLYPH D067E"/* 130CE */, /*40087*/"EGYPTIAN HIEROGLYPH D067F"/* 130CF */,/*40088*/"EGYPTIAN HIEROGLYPH D067G"/* 130D0 */, /*40089*/"EGYPTIAN HIEROGLYPH D067H"/* 130D1 */,/*40090*/"EGYPTIAN HIEROGLYPH E001"/* 130D2 */, /*40091*/"EGYPTIAN HIEROGLYPH E002"/* 130D3 */,/*40092*/"EGYPTIAN HIEROGLYPH E003"/* 130D4 */, /*40093*/"EGYPTIAN HIEROGLYPH E004"/* 130D5 */,/*40094*/"EGYPTIAN HIEROGLYPH E005"/* 130D6 */, /*40095*/"EGYPTIAN HIEROGLYPH E006"/* 130D7 */,/*40096*/"EGYPTIAN HIEROGLYPH E007"/* 130D8 */, /*40097*/"EGYPTIAN HIEROGLYPH E008"/* 130D9 */,/*40098*/"EGYPTIAN HIEROGLYPH E008A"/* 130DA */, /*40099*/"EGYPTIAN HIEROGLYPH E009"/* 130DB */,/*40100*/"EGYPTIAN HIEROGLYPH E009A"/* 130DC */, /*40101*/"EGYPTIAN HIEROGLYPH E010"/* 130DD */,/*40102*/"EGYPTIAN HIEROGLYPH E011"/* 130DE */, /*40103*/"EGYPTIAN HIEROGLYPH E012"/* 130DF */,/*40104*/"EGYPTIAN HIEROGLYPH E013"/* 130E0 */, /*40105*/"EGYPTIAN HIEROGLYPH E014"/* 130E1 */,/*40106*/"EGYPTIAN HIEROGLYPH E015"/* 130E2 */, /*40107*/"EGYPTIAN HIEROGLYPH E016"/* 130E3 */,/*40108*/"EGYPTIAN HIEROGLYPH E016A"/* 130E4 */, /*40109*/"EGYPTIAN HIEROGLYPH E017"/* 130E5 */,/*40110*/"EGYPTIAN HIEROGLYPH E017A"/* 130E6 */, /*40111*/"EGYPTIAN HIEROGLYPH E018"/* 130E7 */,/*40112*/"EGYPTIAN HIEROGLYPH E019"/* 130E8 */, /*40113*/"EGYPTIAN HIEROGLYPH E020"/* 130E9 */,/*40114*/"EGYPTIAN HIEROGLYPH E020A"/* 130EA */, /*40115*/"EGYPTIAN HIEROGLYPH E021"/* 130EB */,/*40116*/"EGYPTIAN HIEROGLYPH E022"/* 130EC */, /*40117*/"EGYPTIAN HIEROGLYPH E023"/* 130ED */,/*40118*/"EGYPTIAN HIEROGLYPH E024"/* 130EE */, /*40119*/"EGYPTIAN HIEROGLYPH E025"/* 130EF */,/*40120*/"EGYPTIAN HIEROGLYPH E026"/* 130F0 */, /*40121*/"EGYPTIAN HIEROGLYPH E027"/* 130F1 */,/*40122*/"EGYPTIAN HIEROGLYPH E028"/* 130F2 */, /*40123*/"EGYPTIAN HIEROGLYPH E028A"/* 130F3 */,/*40124*/"EGYPTIAN HIEROGLYPH E029"/* 130F4 */, /*40125*/"EGYPTIAN HIEROGLYPH E030"/* 130F5 */,/*40126*/"EGYPTIAN HIEROGLYPH E031"/* 130F6 */, /*40127*/"EGYPTIAN HIEROGLYPH E032"/* 130F7 */,/*40128*/"EGYPTIAN HIEROGLYPH E033"/* 130F8 */, /*40129*/"EGYPTIAN HIEROGLYPH E034"/* 130F9 */,/*40130*/"EGYPTIAN HIEROGLYPH E034A"/* 130FA */, /*40131*/"EGYPTIAN HIEROGLYPH E036"/* 130FB */,/*40132*/"EGYPTIAN HIEROGLYPH E037"/* 130FC */, /*40133*/"EGYPTIAN HIEROGLYPH E038"/* 130FD */,/*40134*/"EGYPTIAN HIEROGLYPH F001"/* 130FE */, /*40135*/"EGYPTIAN HIEROGLYPH F001A"/* 130FF */,/*40136*/"EGYPTIAN HIEROGLYPH F002"/* 13100 */, /*40137*/"EGYPTIAN HIEROGLYPH F003"/* 13101 */,/*40138*/"EGYPTIAN HIEROGLYPH F004"/* 13102 */, /*40139*/"EGYPTIAN HIEROGLYPH F005"/* 13103 */,/*40140*/"EGYPTIAN HIEROGLYPH F006"/* 13104 */, /*40141*/"EGYPTIAN HIEROGLYPH F007"/* 13105 */,/*40142*/"EGYPTIAN HIEROGLYPH F008"/* 13106 */, /*40143*/"EGYPTIAN HIEROGLYPH F009"/* 13107 */,/*40144*/"EGYPTIAN HIEROGLYPH F010"/* 13108 */, /*40145*/"EGYPTIAN HIEROGLYPH F011"/* 13109 */,/*40146*/"EGYPTIAN HIEROGLYPH F012"/* 1310A */, /*40147*/"EGYPTIAN HIEROGLYPH F013"/* 1310B */,/*40148*/"EGYPTIAN HIEROGLYPH F013A"/* 1310C */, /*40149*/"EGYPTIAN HIEROGLYPH F014"/* 1310D */,/*40150*/"EGYPTIAN HIEROGLYPH F015"/* 1310E */, /*40151*/"EGYPTIAN HIEROGLYPH F016"/* 1310F */,/*40152*/"EGYPTIAN HIEROGLYPH F017"/* 13110 */, /*40153*/"EGYPTIAN HIEROGLYPH F018"/* 13111 */,/*40154*/"EGYPTIAN HIEROGLYPH F019"/* 13112 */, /*40155*/"EGYPTIAN HIEROGLYPH F020"/* 13113 */,/*40156*/"EGYPTIAN HIEROGLYPH F021"/* 13114 */, /*40157*/"EGYPTIAN HIEROGLYPH F021A"/* 13115 */,/*40158*/"EGYPTIAN HIEROGLYPH F022"/* 13116 */, /*40159*/"EGYPTIAN HIEROGLYPH F023"/* 13117 */,/*40160*/"EGYPTIAN HIEROGLYPH F024"/* 13118 */, /*40161*/"EGYPTIAN HIEROGLYPH F025"/* 13119 */,/*40162*/"EGYPTIAN HIEROGLYPH F026"/* 1311A */, /*40163*/"EGYPTIAN HIEROGLYPH F027"/* 1311B */,/*40164*/"EGYPTIAN HIEROGLYPH F028"/* 1311C */, /*40165*/"EGYPTIAN HIEROGLYPH F029"/* 1311D */,/*40166*/"EGYPTIAN HIEROGLYPH F030"/* 1311E */, /*40167*/"EGYPTIAN HIEROGLYPH F031"/* 1311F */,/*40168*/"EGYPTIAN HIEROGLYPH F031A"/* 13120 */, /*40169*/"EGYPTIAN HIEROGLYPH F032"/* 13121 */,/*40170*/"EGYPTIAN HIEROGLYPH F033"/* 13122 */, /*40171*/"EGYPTIAN HIEROGLYPH F034"/* 13123 */,/*40172*/"EGYPTIAN HIEROGLYPH F035"/* 13124 */, /*40173*/"EGYPTIAN HIEROGLYPH F036"/* 13125 */,/*40174*/"EGYPTIAN HIEROGLYPH F037"/* 13126 */, /*40175*/"EGYPTIAN HIEROGLYPH F037A"/* 13127 */,/*40176*/"EGYPTIAN HIEROGLYPH F038"/* 13128 */, /*40177*/"EGYPTIAN HIEROGLYPH F038A"/* 13129 */,/*40178*/"EGYPTIAN HIEROGLYPH F039"/* 1312A */, /*40179*/"EGYPTIAN HIEROGLYPH F040"/* 1312B */,/*40180*/"EGYPTIAN HIEROGLYPH F041"/* 1312C */, /*40181*/"EGYPTIAN HIEROGLYPH F042"/* 1312D */,/*40182*/"EGYPTIAN HIEROGLYPH F043"/* 1312E */, /*40183*/"EGYPTIAN HIEROGLYPH F044"/* 1312F */,/*40184*/"EGYPTIAN HIEROGLYPH F045"/* 13130 */, /*40185*/"EGYPTIAN HIEROGLYPH F045A"/* 13131 */,/*40186*/"EGYPTIAN HIEROGLYPH F046"/* 13132 */, /*40187*/"EGYPTIAN HIEROGLYPH F046A"/* 13133 */,/*40188*/"EGYPTIAN HIEROGLYPH F047"/* 13134 */, /*40189*/"EGYPTIAN HIEROGLYPH F047A"/* 13135 */,/*40190*/"EGYPTIAN HIEROGLYPH F048"/* 13136 */, /*40191*/"EGYPTIAN HIEROGLYPH F049"/* 13137 */,/*40192*/"EGYPTIAN HIEROGLYPH F050"/* 13138 */, /*40193*/"EGYPTIAN HIEROGLYPH F051"/* 13139 */,/*40194*/"EGYPTIAN HIEROGLYPH F051A"/* 1313A */, /*40195*/"EGYPTIAN HIEROGLYPH F051B"/* 1313B */,/*40196*/"EGYPTIAN HIEROGLYPH F051C"/* 1313C */, /*40197*/"EGYPTIAN HIEROGLYPH F052"/* 1313D */,/*40198*/"EGYPTIAN HIEROGLYPH F053"/* 1313E */, /*40199*/"EGYPTIAN HIEROGLYPH G001"/* 1313F */,/*40200*/"EGYPTIAN HIEROGLYPH G002"/* 13140 */, /*40201*/"EGYPTIAN HIEROGLYPH G003"/* 13141 */,/*40202*/"EGYPTIAN HIEROGLYPH G004"/* 13142 */, /*40203*/"EGYPTIAN HIEROGLYPH G005"/* 13143 */,/*40204*/"EGYPTIAN HIEROGLYPH G006"/* 13144 */, /*40205*/"EGYPTIAN HIEROGLYPH G006A"/* 13145 */,/*40206*/"EGYPTIAN HIEROGLYPH G007"/* 13146 */, /*40207*/"EGYPTIAN HIEROGLYPH G007A"/* 13147 */,/*40208*/"EGYPTIAN HIEROGLYPH G007B"/* 13148 */, /*40209*/"EGYPTIAN HIEROGLYPH G008"/* 13149 */,/*40210*/"EGYPTIAN HIEROGLYPH G009"/* 1314A */, /*40211*/"EGYPTIAN HIEROGLYPH G010"/* 1314B */,/*40212*/"EGYPTIAN HIEROGLYPH G011"/* 1314C */, /*40213*/"EGYPTIAN HIEROGLYPH G011A"/* 1314D */,/*40214*/"EGYPTIAN HIEROGLYPH G012"/* 1314E */, /*40215*/"EGYPTIAN HIEROGLYPH G013"/* 1314F */,/*40216*/"EGYPTIAN HIEROGLYPH G014"/* 13150 */, /*40217*/"EGYPTIAN HIEROGLYPH G015"/* 13151 */,/*40218*/"EGYPTIAN HIEROGLYPH G016"/* 13152 */, /*40219*/"EGYPTIAN HIEROGLYPH G017"/* 13153 */,/*40220*/"EGYPTIAN HIEROGLYPH G018"/* 13154 */, /*40221*/"EGYPTIAN HIEROGLYPH G019"/* 13155 */,/*40222*/"EGYPTIAN HIEROGLYPH G020"/* 13156 */, /*40223*/"EGYPTIAN HIEROGLYPH G020A"/* 13157 */,/*40224*/"EGYPTIAN HIEROGLYPH G021"/* 13158 */, /*40225*/"EGYPTIAN HIEROGLYPH G022"/* 13159 */,/*40226*/"EGYPTIAN HIEROGLYPH G023"/* 1315A */, /*40227*/"EGYPTIAN HIEROGLYPH G024"/* 1315B */,/*40228*/"EGYPTIAN HIEROGLYPH G025"/* 1315C */, /*40229*/"EGYPTIAN HIEROGLYPH G026"/* 1315D */,/*40230*/"EGYPTIAN HIEROGLYPH G026A"/* 1315E */, /*40231*/"EGYPTIAN HIEROGLYPH G027"/* 1315F */,/*40232*/"EGYPTIAN HIEROGLYPH G028"/* 13160 */, /*40233*/"EGYPTIAN HIEROGLYPH G029"/* 13161 */,/*40234*/"EGYPTIAN HIEROGLYPH G030"/* 13162 */, /*40235*/"EGYPTIAN HIEROGLYPH G031"/* 13163 */,/*40236*/"EGYPTIAN HIEROGLYPH G032"/* 13164 */, /*40237*/"EGYPTIAN HIEROGLYPH G033"/* 13165 */,/*40238*/"EGYPTIAN HIEROGLYPH G034"/* 13166 */, /*40239*/"EGYPTIAN HIEROGLYPH G035"/* 13167 */,/*40240*/"EGYPTIAN HIEROGLYPH G036"/* 13168 */, /*40241*/"EGYPTIAN HIEROGLYPH G036A"/* 13169 */,/*40242*/"EGYPTIAN HIEROGLYPH G037"/* 1316A */, /*40243*/"EGYPTIAN HIEROGLYPH G037A"/* 1316B */,/*40244*/"EGYPTIAN HIEROGLYPH G038"/* 1316C */, /*40245*/"EGYPTIAN HIEROGLYPH G039"/* 1316D */,/*40246*/"EGYPTIAN HIEROGLYPH G040"/* 1316E */, /*40247*/"EGYPTIAN HIEROGLYPH G041"/* 1316F */,/*40248*/"EGYPTIAN HIEROGLYPH G042"/* 13170 */, /*40249*/"EGYPTIAN HIEROGLYPH G043"/* 13171 */,/*40250*/"EGYPTIAN HIEROGLYPH G043A"/* 13172 */, /*40251*/"EGYPTIAN HIEROGLYPH G044"/* 13173 */,/*40252*/"EGYPTIAN HIEROGLYPH G045"/* 13174 */, /*40253*/"EGYPTIAN HIEROGLYPH G045A"/* 13175 */,/*40254*/"EGYPTIAN HIEROGLYPH G046"/* 13176 */, /*40255*/"EGYPTIAN HIEROGLYPH G047"/* 13177 */,/*40256*/"EGYPTIAN HIEROGLYPH G048"/* 13178 */, /*40257*/"EGYPTIAN HIEROGLYPH G049"/* 13179 */,/*40258*/"EGYPTIAN HIEROGLYPH G050"/* 1317A */, /*40259*/"EGYPTIAN HIEROGLYPH G051"/* 1317B */,/*40260*/"EGYPTIAN HIEROGLYPH G052"/* 1317C */, /*40261*/"EGYPTIAN HIEROGLYPH G053"/* 1317D */,/*40262*/"EGYPTIAN HIEROGLYPH G054"/* 1317E */, /*40263*/"EGYPTIAN HIEROGLYPH H001"/* 1317F */,/*40264*/"EGYPTIAN HIEROGLYPH H002"/* 13180 */, /*40265*/"EGYPTIAN HIEROGLYPH H003"/* 13181 */,/*40266*/"EGYPTIAN HIEROGLYPH H004"/* 13182 */, /*40267*/"EGYPTIAN HIEROGLYPH H005"/* 13183 */,/*40268*/"EGYPTIAN HIEROGLYPH H006"/* 13184 */, /*40269*/"EGYPTIAN HIEROGLYPH H006A"/* 13185 */,/*40270*/"EGYPTIAN HIEROGLYPH H007"/* 13186 */, /*40271*/"EGYPTIAN HIEROGLYPH H008"/* 13187 */,/*40272*/"EGYPTIAN HIEROGLYPH I001"/* 13188 */, /*40273*/"EGYPTIAN HIEROGLYPH I002"/* 13189 */,/*40274*/"EGYPTIAN HIEROGLYPH I003"/* 1318A */, /*40275*/"EGYPTIAN HIEROGLYPH I004"/* 1318B */,/*40276*/"EGYPTIAN HIEROGLYPH I005"/* 1318C */, /*40277*/"EGYPTIAN HIEROGLYPH I005A"/* 1318D */,/*40278*/"EGYPTIAN HIEROGLYPH I006"/* 1318E */, /*40279*/"EGYPTIAN HIEROGLYPH I007"/* 1318F */,/*40280*/"EGYPTIAN HIEROGLYPH I008"/* 13190 */, /*40281*/"EGYPTIAN HIEROGLYPH I009"/* 13191 */,/*40282*/"EGYPTIAN HIEROGLYPH I009A"/* 13192 */, /*40283*/"EGYPTIAN HIEROGLYPH I010"/* 13193 */,/*40284*/"EGYPTIAN HIEROGLYPH I010A"/* 13194 */, /*40285*/"EGYPTIAN HIEROGLYPH I011"/* 13195 */,/*40286*/"EGYPTIAN HIEROGLYPH I011A"/* 13196 */, /*40287*/"EGYPTIAN HIEROGLYPH I012"/* 13197 */,/*40288*/"EGYPTIAN HIEROGLYPH I013"/* 13198 */, /*40289*/"EGYPTIAN HIEROGLYPH I014"/* 13199 */,/*40290*/"EGYPTIAN HIEROGLYPH I015"/* 1319A */, /*40291*/"EGYPTIAN HIEROGLYPH K001"/* 1319B */,/*40292*/"EGYPTIAN HIEROGLYPH K002"/* 1319C */, /*40293*/"EGYPTIAN HIEROGLYPH K003"/* 1319D */,/*40294*/"EGYPTIAN HIEROGLYPH K004"/* 1319E */, /*40295*/"EGYPTIAN HIEROGLYPH K005"/* 1319F */,/*40296*/"EGYPTIAN HIEROGLYPH K006"/* 131A0 */, /*40297*/"EGYPTIAN HIEROGLYPH K007"/* 131A1 */,/*40298*/"EGYPTIAN HIEROGLYPH K008"/* 131A2 */, /*40299*/"EGYPTIAN HIEROGLYPH L001"/* 131A3 */,/*40300*/"EGYPTIAN HIEROGLYPH L002"/* 131A4 */, /*40301*/"EGYPTIAN HIEROGLYPH L002A"/* 131A5 */,/*40302*/"EGYPTIAN HIEROGLYPH L003"/* 131A6 */, /*40303*/"EGYPTIAN HIEROGLYPH L004"/* 131A7 */,/*40304*/"EGYPTIAN HIEROGLYPH L005"/* 131A8 */, /*40305*/"EGYPTIAN HIEROGLYPH L006"/* 131A9 */,/*40306*/"EGYPTIAN HIEROGLYPH L006A"/* 131AA */, /*40307*/"EGYPTIAN HIEROGLYPH L007"/* 131AB */,/*40308*/"EGYPTIAN HIEROGLYPH L008"/* 131AC */, /*40309*/"EGYPTIAN HIEROGLYPH M001"/* 131AD */,/*40310*/"EGYPTIAN HIEROGLYPH M001A"/* 131AE */, /*40311*/"EGYPTIAN HIEROGLYPH M001B"/* 131AF */,/*40312*/"EGYPTIAN HIEROGLYPH M002"/* 131B0 */, /*40313*/"EGYPTIAN HIEROGLYPH M003"/* 131B1 */,/*40314*/"EGYPTIAN HIEROGLYPH M003A"/* 131B2 */, /*40315*/"EGYPTIAN HIEROGLYPH M004"/* 131B3 */,/*40316*/"EGYPTIAN HIEROGLYPH M005"/* 131B4 */, /*40317*/"EGYPTIAN HIEROGLYPH M006"/* 131B5 */,/*40318*/"EGYPTIAN HIEROGLYPH M007"/* 131B6 */, /*40319*/"EGYPTIAN HIEROGLYPH M008"/* 131B7 */,/*40320*/"EGYPTIAN HIEROGLYPH M009"/* 131B8 */, /*40321*/"EGYPTIAN HIEROGLYPH M010"/* 131B9 */,/*40322*/"EGYPTIAN HIEROGLYPH M010A"/* 131BA */, /*40323*/"EGYPTIAN HIEROGLYPH M011"/* 131BB */,/*40324*/"EGYPTIAN HIEROGLYPH M012"/* 131BC */, /*40325*/"EGYPTIAN HIEROGLYPH M012A"/* 131BD */,/*40326*/"EGYPTIAN HIEROGLYPH M012B"/* 131BE */, /*40327*/"EGYPTIAN HIEROGLYPH M012C"/* 131BF */,/*40328*/"EGYPTIAN HIEROGLYPH M012D"/* 131C0 */, /*40329*/"EGYPTIAN HIEROGLYPH M012E"/* 131C1 */,/*40330*/"EGYPTIAN HIEROGLYPH M012F"/* 131C2 */, /*40331*/"EGYPTIAN HIEROGLYPH M012G"/* 131C3 */,/*40332*/"EGYPTIAN HIEROGLYPH M012H"/* 131C4 */, /*40333*/"EGYPTIAN HIEROGLYPH M013"/* 131C5 */,/*40334*/"EGYPTIAN HIEROGLYPH M014"/* 131C6 */, /*40335*/"EGYPTIAN HIEROGLYPH M015"/* 131C7 */,/*40336*/"EGYPTIAN HIEROGLYPH M015A"/* 131C8 */, /*40337*/"EGYPTIAN HIEROGLYPH M016"/* 131C9 */,/*40338*/"EGYPTIAN HIEROGLYPH M016A"/* 131CA */, /*40339*/"EGYPTIAN HIEROGLYPH M017"/* 131CB */,/*40340*/"EGYPTIAN HIEROGLYPH M017A"/* 131CC */, /*40341*/"EGYPTIAN HIEROGLYPH M018"/* 131CD */,/*40342*/"EGYPTIAN HIEROGLYPH M019"/* 131CE */, /*40343*/"EGYPTIAN HIEROGLYPH M020"/* 131CF */,/*40344*/"EGYPTIAN HIEROGLYPH M021"/* 131D0 */, /*40345*/"EGYPTIAN HIEROGLYPH M022"/* 131D1 */,/*40346*/"EGYPTIAN HIEROGLYPH M022A"/* 131D2 */, /*40347*/"EGYPTIAN HIEROGLYPH M023"/* 131D3 */,/*40348*/"EGYPTIAN HIEROGLYPH M024"/* 131D4 */, /*40349*/"EGYPTIAN HIEROGLYPH M024A"/* 131D5 */,/*40350*/"EGYPTIAN HIEROGLYPH M025"/* 131D6 */, /*40351*/"EGYPTIAN HIEROGLYPH M026"/* 131D7 */,/*40352*/"EGYPTIAN HIEROGLYPH M027"/* 131D8 */, /*40353*/"EGYPTIAN HIEROGLYPH M028"/* 131D9 */,/*40354*/"EGYPTIAN HIEROGLYPH M028A"/* 131DA */, /*40355*/"EGYPTIAN HIEROGLYPH M029"/* 131DB */,/*40356*/"EGYPTIAN HIEROGLYPH M030"/* 131DC */, /*40357*/"EGYPTIAN HIEROGLYPH M031"/* 131DD */,/*40358*/"EGYPTIAN HIEROGLYPH M031A"/* 131DE */, /*40359*/"EGYPTIAN HIEROGLYPH M032"/* 131DF */,/*40360*/"EGYPTIAN HIEROGLYPH M033"/* 131E0 */, /*40361*/"EGYPTIAN HIEROGLYPH M033A"/* 131E1 */,/*40362*/"EGYPTIAN HIEROGLYPH M033B"/* 131E2 */, /*40363*/"EGYPTIAN HIEROGLYPH M034"/* 131E3 */,/*40364*/"EGYPTIAN HIEROGLYPH M035"/* 131E4 */, /*40365*/"EGYPTIAN HIEROGLYPH M036"/* 131E5 */,/*40366*/"EGYPTIAN HIEROGLYPH M037"/* 131E6 */, /*40367*/"EGYPTIAN HIEROGLYPH M038"/* 131E7 */,/*40368*/"EGYPTIAN HIEROGLYPH M039"/* 131E8 */, /*40369*/"EGYPTIAN HIEROGLYPH M040"/* 131E9 */,/*40370*/"EGYPTIAN HIEROGLYPH M040A"/* 131EA */, /*40371*/"EGYPTIAN HIEROGLYPH M041"/* 131EB */,/*40372*/"EGYPTIAN HIEROGLYPH M042"/* 131EC */, /*40373*/"EGYPTIAN HIEROGLYPH M043"/* 131ED */,/*40374*/"EGYPTIAN HIEROGLYPH M044"/* 131EE */, /*40375*/"EGYPTIAN HIEROGLYPH N001"/* 131EF */,/*40376*/"EGYPTIAN HIEROGLYPH N002"/* 131F0 */, /*40377*/"EGYPTIAN HIEROGLYPH N003"/* 131F1 */,/*40378*/"EGYPTIAN HIEROGLYPH N004"/* 131F2 */, /*40379*/"EGYPTIAN HIEROGLYPH N005"/* 131F3 */,/*40380*/"EGYPTIAN HIEROGLYPH N006"/* 131F4 */, /*40381*/"EGYPTIAN HIEROGLYPH N007"/* 131F5 */,/*40382*/"EGYPTIAN HIEROGLYPH N008"/* 131F6 */, /*40383*/"EGYPTIAN HIEROGLYPH N009"/* 131F7 */,/*40384*/"EGYPTIAN HIEROGLYPH N010"/* 131F8 */, /*40385*/"EGYPTIAN HIEROGLYPH N011"/* 131F9 */,/*40386*/"EGYPTIAN HIEROGLYPH N012"/* 131FA */, /*40387*/"EGYPTIAN HIEROGLYPH N013"/* 131FB */,/*40388*/"EGYPTIAN HIEROGLYPH N014"/* 131FC */, /*40389*/"EGYPTIAN HIEROGLYPH N015"/* 131FD */,/*40390*/"EGYPTIAN HIEROGLYPH N016"/* 131FE */, /*40391*/"EGYPTIAN HIEROGLYPH N017"/* 131FF */,/*40392*/"EGYPTIAN HIEROGLYPH N018"/* 13200 */, /*40393*/"EGYPTIAN HIEROGLYPH N018A"/* 13201 */,/*40394*/"EGYPTIAN HIEROGLYPH N018B"/* 13202 */, /*40395*/"EGYPTIAN HIEROGLYPH N019"/* 13203 */,/*40396*/"EGYPTIAN HIEROGLYPH N020"/* 13204 */, /*40397*/"EGYPTIAN HIEROGLYPH N021"/* 13205 */,/*40398*/"EGYPTIAN HIEROGLYPH N022"/* 13206 */, /*40399*/"EGYPTIAN HIEROGLYPH N023"/* 13207 */,/*40400*/"EGYPTIAN HIEROGLYPH N024"/* 13208 */, /*40401*/"EGYPTIAN HIEROGLYPH N025"/* 13209 */,/*40402*/"EGYPTIAN HIEROGLYPH N025A"/* 1320A */, /*40403*/"EGYPTIAN HIEROGLYPH N026"/* 1320B */,/*40404*/"EGYPTIAN HIEROGLYPH N027"/* 1320C */, /*40405*/"EGYPTIAN HIEROGLYPH N028"/* 1320D */,/*40406*/"EGYPTIAN HIEROGLYPH N029"/* 1320E */, /*40407*/"EGYPTIAN HIEROGLYPH N030"/* 1320F */,/*40408*/"EGYPTIAN HIEROGLYPH N031"/* 13210 */, /*40409*/"EGYPTIAN HIEROGLYPH N032"/* 13211 */,/*40410*/"EGYPTIAN HIEROGLYPH N033"/* 13212 */, /*40411*/"EGYPTIAN HIEROGLYPH N033A"/* 13213 */,/*40412*/"EGYPTIAN HIEROGLYPH N034"/* 13214 */, /*40413*/"EGYPTIAN HIEROGLYPH N034A"/* 13215 */,/*40414*/"EGYPTIAN HIEROGLYPH N035"/* 13216 */, /*40415*/"EGYPTIAN HIEROGLYPH N035A"/* 13217 */,/*40416*/"EGYPTIAN HIEROGLYPH N036"/* 13218 */, /*40417*/"EGYPTIAN HIEROGLYPH N037"/* 13219 */,/*40418*/"EGYPTIAN HIEROGLYPH N037A"/* 1321A */, /*40419*/"EGYPTIAN HIEROGLYPH N038"/* 1321B */,/*40420*/"EGYPTIAN HIEROGLYPH N039"/* 1321C */, /*40421*/"EGYPTIAN HIEROGLYPH N040"/* 1321D */,/*40422*/"EGYPTIAN HIEROGLYPH N041"/* 1321E */, /*40423*/"EGYPTIAN HIEROGLYPH N042"/* 1321F */,/*40424*/"EGYPTIAN HIEROGLYPH NL001"/* 13220 */, /*40425*/"EGYPTIAN HIEROGLYPH NL002"/* 13221 */,/*40426*/"EGYPTIAN HIEROGLYPH NL003"/* 13222 */, /*40427*/"EGYPTIAN HIEROGLYPH NL004"/* 13223 */,/*40428*/"EGYPTIAN HIEROGLYPH NL005"/* 13224 */, /*40429*/"EGYPTIAN HIEROGLYPH NL005A"/* 13225 */,/*40430*/"EGYPTIAN HIEROGLYPH NL006"/* 13226 */, /*40431*/"EGYPTIAN HIEROGLYPH NL007"/* 13227 */,/*40432*/"EGYPTIAN HIEROGLYPH NL008"/* 13228 */, /*40433*/"EGYPTIAN HIEROGLYPH NL009"/* 13229 */,/*40434*/"EGYPTIAN HIEROGLYPH NL010"/* 1322A */, /*40435*/"EGYPTIAN HIEROGLYPH NL011"/* 1322B */,/*40436*/"EGYPTIAN HIEROGLYPH NL012"/* 1322C */, /*40437*/"EGYPTIAN HIEROGLYPH NL013"/* 1322D */,/*40438*/"EGYPTIAN HIEROGLYPH NL014"/* 1322E */, /*40439*/"EGYPTIAN HIEROGLYPH NL015"/* 1322F */,/*40440*/"EGYPTIAN HIEROGLYPH NL016"/* 13230 */, /*40441*/"EGYPTIAN HIEROGLYPH NL017"/* 13231 */,/*40442*/"EGYPTIAN HIEROGLYPH NL017A"/* 13232 */, /*40443*/"EGYPTIAN HIEROGLYPH NL018"/* 13233 */,/*40444*/"EGYPTIAN HIEROGLYPH NL019"/* 13234 */, /*40445*/"EGYPTIAN HIEROGLYPH NL020"/* 13235 */,/*40446*/"EGYPTIAN HIEROGLYPH NU001"/* 13236 */, /*40447*/"EGYPTIAN HIEROGLYPH NU002"/* 13237 */,/*40448*/"EGYPTIAN HIEROGLYPH NU003"/* 13238 */, /*40449*/"EGYPTIAN HIEROGLYPH NU004"/* 13239 */,/*40450*/"EGYPTIAN HIEROGLYPH NU005"/* 1323A */, /*40451*/"EGYPTIAN HIEROGLYPH NU006"/* 1323B */,/*40452*/"EGYPTIAN HIEROGLYPH NU007"/* 1323C */, /*40453*/"EGYPTIAN HIEROGLYPH NU008"/* 1323D */,/*40454*/"EGYPTIAN HIEROGLYPH NU009"/* 1323E */, /*40455*/"EGYPTIAN HIEROGLYPH NU010"/* 1323F */,/*40456*/"EGYPTIAN HIEROGLYPH NU010A"/* 13240 */, /*40457*/"EGYPTIAN HIEROGLYPH NU011"/* 13241 */,/*40458*/"EGYPTIAN HIEROGLYPH NU011A"/* 13242 */, /*40459*/"EGYPTIAN HIEROGLYPH NU012"/* 13243 */,/*40460*/"EGYPTIAN HIEROGLYPH NU013"/* 13244 */, /*40461*/"EGYPTIAN HIEROGLYPH NU014"/* 13245 */,/*40462*/"EGYPTIAN HIEROGLYPH NU015"/* 13246 */, /*40463*/"EGYPTIAN HIEROGLYPH NU016"/* 13247 */,/*40464*/"EGYPTIAN HIEROGLYPH NU017"/* 13248 */, /*40465*/"EGYPTIAN HIEROGLYPH NU018"/* 13249 */,/*40466*/"EGYPTIAN HIEROGLYPH NU018A"/* 1324A */, /*40467*/"EGYPTIAN HIEROGLYPH NU019"/* 1324B */,/*40468*/"EGYPTIAN HIEROGLYPH NU020"/* 1324C */, /*40469*/"EGYPTIAN HIEROGLYPH NU021"/* 1324D */,/*40470*/"EGYPTIAN HIEROGLYPH NU022"/* 1324E */, /*40471*/"EGYPTIAN HIEROGLYPH NU022A"/* 1324F */,/*40472*/"EGYPTIAN HIEROGLYPH O001"/* 13250 */, /*40473*/"EGYPTIAN HIEROGLYPH O001A"/* 13251 */,/*40474*/"EGYPTIAN HIEROGLYPH O002"/* 13252 */, /*40475*/"EGYPTIAN HIEROGLYPH O003"/* 13253 */,/*40476*/"EGYPTIAN HIEROGLYPH O004"/* 13254 */, /*40477*/"EGYPTIAN HIEROGLYPH O005"/* 13255 */,/*40478*/"EGYPTIAN HIEROGLYPH O005A"/* 13256 */, /*40479*/"EGYPTIAN HIEROGLYPH O006"/* 13257 */,/*40480*/"EGYPTIAN HIEROGLYPH O006A"/* 13258 */, /*40481*/"EGYPTIAN HIEROGLYPH O006B"/* 13259 */,/*40482*/"EGYPTIAN HIEROGLYPH O006C"/* 1325A */, /*40483*/"EGYPTIAN HIEROGLYPH O006D"/* 1325B */,/*40484*/"EGYPTIAN HIEROGLYPH O006E"/* 1325C */, /*40485*/"EGYPTIAN HIEROGLYPH O006F"/* 1325D */,/*40486*/"EGYPTIAN HIEROGLYPH O007"/* 1325E */, /*40487*/"EGYPTIAN HIEROGLYPH O008"/* 1325F */,/*40488*/"EGYPTIAN HIEROGLYPH O009"/* 13260 */, /*40489*/"EGYPTIAN HIEROGLYPH O010"/* 13261 */,/*40490*/"EGYPTIAN HIEROGLYPH O010A"/* 13262 */, /*40491*/"EGYPTIAN HIEROGLYPH O010B"/* 13263 */,/*40492*/"EGYPTIAN HIEROGLYPH O010C"/* 13264 */, /*40493*/"EGYPTIAN HIEROGLYPH O011"/* 13265 */,/*40494*/"EGYPTIAN HIEROGLYPH O012"/* 13266 */, /*40495*/"EGYPTIAN HIEROGLYPH O013"/* 13267 */,/*40496*/"EGYPTIAN HIEROGLYPH O014"/* 13268 */, /*40497*/"EGYPTIAN HIEROGLYPH O015"/* 13269 */,/*40498*/"EGYPTIAN HIEROGLYPH O016"/* 1326A */, /*40499*/"EGYPTIAN HIEROGLYPH O017"/* 1326B */,/*40500*/"EGYPTIAN HIEROGLYPH O018"/* 1326C */, /*40501*/"EGYPTIAN HIEROGLYPH O019"/* 1326D */,/*40502*/"EGYPTIAN HIEROGLYPH O019A"/* 1326E */, /*40503*/"EGYPTIAN HIEROGLYPH O020"/* 1326F */,/*40504*/"EGYPTIAN HIEROGLYPH O020A"/* 13270 */, /*40505*/"EGYPTIAN HIEROGLYPH O021"/* 13271 */,/*40506*/"EGYPTIAN HIEROGLYPH O022"/* 13272 */, /*40507*/"EGYPTIAN HIEROGLYPH O023"/* 13273 */,/*40508*/"EGYPTIAN HIEROGLYPH O024"/* 13274 */, /*40509*/"EGYPTIAN HIEROGLYPH O024A"/* 13275 */,/*40510*/"EGYPTIAN HIEROGLYPH O025"/* 13276 */, /*40511*/"EGYPTIAN HIEROGLYPH O025A"/* 13277 */,/*40512*/"EGYPTIAN HIEROGLYPH O026"/* 13278 */, /*40513*/"EGYPTIAN HIEROGLYPH O027"/* 13279 */,/*40514*/"EGYPTIAN HIEROGLYPH O028"/* 1327A */, /*40515*/"EGYPTIAN HIEROGLYPH O029"/* 1327B */,/*40516*/"EGYPTIAN HIEROGLYPH O029A"/* 1327C */, /*40517*/"EGYPTIAN HIEROGLYPH O030"/* 1327D */,/*40518*/"EGYPTIAN HIEROGLYPH O030A"/* 1327E */, /*40519*/"EGYPTIAN HIEROGLYPH O031"/* 1327F */,/*40520*/"EGYPTIAN HIEROGLYPH O032"/* 13280 */, /*40521*/"EGYPTIAN HIEROGLYPH O033"/* 13281 */,/*40522*/"EGYPTIAN HIEROGLYPH O033A"/* 13282 */, /*40523*/"EGYPTIAN HIEROGLYPH O034"/* 13283 */,/*40524*/"EGYPTIAN HIEROGLYPH O035"/* 13284 */, /*40525*/"EGYPTIAN HIEROGLYPH O036"/* 13285 */,/*40526*/"EGYPTIAN HIEROGLYPH O036A"/* 13286 */, /*40527*/"EGYPTIAN HIEROGLYPH O036B"/* 13287 */,/*40528*/"EGYPTIAN HIEROGLYPH O036C"/* 13288 */, /*40529*/"EGYPTIAN HIEROGLYPH O036D"/* 13289 */,/*40530*/"EGYPTIAN HIEROGLYPH O037"/* 1328A */, /*40531*/"EGYPTIAN HIEROGLYPH O038"/* 1328B */,/*40532*/"EGYPTIAN HIEROGLYPH O039"/* 1328C */, /*40533*/"EGYPTIAN HIEROGLYPH O040"/* 1328D */,/*40534*/"EGYPTIAN HIEROGLYPH O041"/* 1328E */, /*40535*/"EGYPTIAN HIEROGLYPH O042"/* 1328F */,/*40536*/"EGYPTIAN HIEROGLYPH O043"/* 13290 */, /*40537*/"EGYPTIAN HIEROGLYPH O044"/* 13291 */,/*40538*/"EGYPTIAN HIEROGLYPH O045"/* 13292 */, /*40539*/"EGYPTIAN HIEROGLYPH O046"/* 13293 */,/*40540*/"EGYPTIAN HIEROGLYPH O047"/* 13294 */, /*40541*/"EGYPTIAN HIEROGLYPH O048"/* 13295 */,/*40542*/"EGYPTIAN HIEROGLYPH O049"/* 13296 */, /*40543*/"EGYPTIAN HIEROGLYPH O050"/* 13297 */,/*40544*/"EGYPTIAN HIEROGLYPH O050A"/* 13298 */, /*40545*/"EGYPTIAN HIEROGLYPH O050B"/* 13299 */,/*40546*/"EGYPTIAN HIEROGLYPH O051"/* 1329A */, /*40547*/"EGYPTIAN HIEROGLYPH P001"/* 1329B */,/*40548*/"EGYPTIAN HIEROGLYPH P001A"/* 1329C */, /*40549*/"EGYPTIAN HIEROGLYPH P002"/* 1329D */,/*40550*/"EGYPTIAN HIEROGLYPH P003"/* 1329E */, /*40551*/"EGYPTIAN HIEROGLYPH P003A"/* 1329F */,/*40552*/"EGYPTIAN HIEROGLYPH P004"/* 132A0 */, /*40553*/"EGYPTIAN HIEROGLYPH P005"/* 132A1 */,/*40554*/"EGYPTIAN HIEROGLYPH P006"/* 132A2 */, /*40555*/"EGYPTIAN HIEROGLYPH P007"/* 132A3 */,/*40556*/"EGYPTIAN HIEROGLYPH P008"/* 132A4 */, /*40557*/"EGYPTIAN HIEROGLYPH P009"/* 132A5 */,/*40558*/"EGYPTIAN HIEROGLYPH P010"/* 132A6 */, /*40559*/"EGYPTIAN HIEROGLYPH P011"/* 132A7 */,/*40560*/"EGYPTIAN HIEROGLYPH Q001"/* 132A8 */, /*40561*/"EGYPTIAN HIEROGLYPH Q002"/* 132A9 */,/*40562*/"EGYPTIAN HIEROGLYPH Q003"/* 132AA */, /*40563*/"EGYPTIAN HIEROGLYPH Q004"/* 132AB */,/*40564*/"EGYPTIAN HIEROGLYPH Q005"/* 132AC */, /*40565*/"EGYPTIAN HIEROGLYPH Q006"/* 132AD */,/*40566*/"EGYPTIAN HIEROGLYPH Q007"/* 132AE */, /*40567*/"EGYPTIAN HIEROGLYPH R001"/* 132AF */,/*40568*/"EGYPTIAN HIEROGLYPH R002"/* 132B0 */, /*40569*/"EGYPTIAN HIEROGLYPH R002A"/* 132B1 */,/*40570*/"EGYPTIAN HIEROGLYPH R003"/* 132B2 */, /*40571*/"EGYPTIAN HIEROGLYPH R003A"/* 132B3 */,/*40572*/"EGYPTIAN HIEROGLYPH R003B"/* 132B4 */, /*40573*/"EGYPTIAN HIEROGLYPH R004"/* 132B5 */,/*40574*/"EGYPTIAN HIEROGLYPH R005"/* 132B6 */, /*40575*/"EGYPTIAN HIEROGLYPH R006"/* 132B7 */,/*40576*/"EGYPTIAN HIEROGLYPH R007"/* 132B8 */, /*40577*/"EGYPTIAN HIEROGLYPH R008"/* 132B9 */,/*40578*/"EGYPTIAN HIEROGLYPH R009"/* 132BA */, /*40579*/"EGYPTIAN HIEROGLYPH R010"/* 132BB */,/*40580*/"EGYPTIAN HIEROGLYPH R010A"/* 132BC */, /*40581*/"EGYPTIAN HIEROGLYPH R011"/* 132BD */,/*40582*/"EGYPTIAN HIEROGLYPH R012"/* 132BE */, /*40583*/"EGYPTIAN HIEROGLYPH R013"/* 132BF */,/*40584*/"EGYPTIAN HIEROGLYPH R014"/* 132C0 */, /*40585*/"EGYPTIAN HIEROGLYPH R015"/* 132C1 */,/*40586*/"EGYPTIAN HIEROGLYPH R016"/* 132C2 */, /*40587*/"EGYPTIAN HIEROGLYPH R016A"/* 132C3 */,/*40588*/"EGYPTIAN HIEROGLYPH R017"/* 132C4 */, /*40589*/"EGYPTIAN HIEROGLYPH R018"/* 132C5 */,/*40590*/"EGYPTIAN HIEROGLYPH R019"/* 132C6 */, /*40591*/"EGYPTIAN HIEROGLYPH R020"/* 132C7 */,/*40592*/"EGYPTIAN HIEROGLYPH R021"/* 132C8 */, /*40593*/"EGYPTIAN HIEROGLYPH R022"/* 132C9 */,/*40594*/"EGYPTIAN HIEROGLYPH R023"/* 132CA */, /*40595*/"EGYPTIAN HIEROGLYPH R024"/* 132CB */,/*40596*/"EGYPTIAN HIEROGLYPH R025"/* 132CC */, /*40597*/"EGYPTIAN HIEROGLYPH R026"/* 132CD */,/*40598*/"EGYPTIAN HIEROGLYPH R027"/* 132CE */, /*40599*/"EGYPTIAN HIEROGLYPH R028"/* 132CF */,/*40600*/"EGYPTIAN HIEROGLYPH R029"/* 132D0 */, /*40601*/"EGYPTIAN HIEROGLYPH S001"/* 132D1 */,/*40602*/"EGYPTIAN HIEROGLYPH S002"/* 132D2 */, /*40603*/"EGYPTIAN HIEROGLYPH S002A"/* 132D3 */,/*40604*/"EGYPTIAN HIEROGLYPH S003"/* 132D4 */, /*40605*/"EGYPTIAN HIEROGLYPH S004"/* 132D5 */,/*40606*/"EGYPTIAN HIEROGLYPH S005"/* 132D6 */, /*40607*/"EGYPTIAN HIEROGLYPH S006"/* 132D7 */,/*40608*/"EGYPTIAN HIEROGLYPH S006A"/* 132D8 */, /*40609*/"EGYPTIAN HIEROGLYPH S007"/* 132D9 */,/*40610*/"EGYPTIAN HIEROGLYPH S008"/* 132DA */, /*40611*/"EGYPTIAN HIEROGLYPH S009"/* 132DB */,/*40612*/"EGYPTIAN HIEROGLYPH S010"/* 132DC */, /*40613*/"EGYPTIAN HIEROGLYPH S011"/* 132DD */,/*40614*/"EGYPTIAN HIEROGLYPH S012"/* 132DE */, /*40615*/"EGYPTIAN HIEROGLYPH S013"/* 132DF */,/*40616*/"EGYPTIAN HIEROGLYPH S014"/* 132E0 */, /*40617*/"EGYPTIAN HIEROGLYPH S014A"/* 132E1 */,/*40618*/"EGYPTIAN HIEROGLYPH S014B"/* 132E2 */, /*40619*/"EGYPTIAN HIEROGLYPH S015"/* 132E3 */,/*40620*/"EGYPTIAN HIEROGLYPH S016"/* 132E4 */, /*40621*/"EGYPTIAN HIEROGLYPH S017"/* 132E5 */,/*40622*/"EGYPTIAN HIEROGLYPH S017A"/* 132E6 */, /*40623*/"EGYPTIAN HIEROGLYPH S018"/* 132E7 */,/*40624*/"EGYPTIAN HIEROGLYPH S019"/* 132E8 */, /*40625*/"EGYPTIAN HIEROGLYPH S020"/* 132E9 */,/*40626*/"EGYPTIAN HIEROGLYPH S021"/* 132EA */, /*40627*/"EGYPTIAN HIEROGLYPH S022"/* 132EB */,/*40628*/"EGYPTIAN HIEROGLYPH S023"/* 132EC */, /*40629*/"EGYPTIAN HIEROGLYPH S024"/* 132ED */,/*40630*/"EGYPTIAN HIEROGLYPH S025"/* 132EE */, /*40631*/"EGYPTIAN HIEROGLYPH S026"/* 132EF */,/*40632*/"EGYPTIAN HIEROGLYPH S026A"/* 132F0 */, /*40633*/"EGYPTIAN HIEROGLYPH S026B"/* 132F1 */,/*40634*/"EGYPTIAN HIEROGLYPH S027"/* 132F2 */, /*40635*/"EGYPTIAN HIEROGLYPH S028"/* 132F3 */,/*40636*/"EGYPTIAN HIEROGLYPH S029"/* 132F4 */, /*40637*/"EGYPTIAN HIEROGLYPH S030"/* 132F5 */,/*40638*/"EGYPTIAN HIEROGLYPH S031"/* 132F6 */, /*40639*/"EGYPTIAN HIEROGLYPH S032"/* 132F7 */,/*40640*/"EGYPTIAN HIEROGLYPH S033"/* 132F8 */, /*40641*/"EGYPTIAN HIEROGLYPH S034"/* 132F9 */,/*40642*/"EGYPTIAN HIEROGLYPH S035"/* 132FA */, /*40643*/"EGYPTIAN HIEROGLYPH S035A"/* 132FB */,/*40644*/"EGYPTIAN HIEROGLYPH S036"/* 132FC */, /*40645*/"EGYPTIAN HIEROGLYPH S037"/* 132FD */,/*40646*/"EGYPTIAN HIEROGLYPH S038"/* 132FE */, /*40647*/"EGYPTIAN HIEROGLYPH S039"/* 132FF */,/*40648*/"EGYPTIAN HIEROGLYPH S040"/* 13300 */, /*40649*/"EGYPTIAN HIEROGLYPH S041"/* 13301 */,/*40650*/"EGYPTIAN HIEROGLYPH S042"/* 13302 */, /*40651*/"EGYPTIAN HIEROGLYPH S043"/* 13303 */,/*40652*/"EGYPTIAN HIEROGLYPH S044"/* 13304 */, /*40653*/"EGYPTIAN HIEROGLYPH S045"/* 13305 */,/*40654*/"EGYPTIAN HIEROGLYPH S046"/* 13306 */, /*40655*/"EGYPTIAN HIEROGLYPH T001"/* 13307 */,/*40656*/"EGYPTIAN HIEROGLYPH T002"/* 13308 */, /*40657*/"EGYPTIAN HIEROGLYPH T003"/* 13309 */,/*40658*/"EGYPTIAN HIEROGLYPH T003A"/* 1330A */, /*40659*/"EGYPTIAN HIEROGLYPH T004"/* 1330B */,/*40660*/"EGYPTIAN HIEROGLYPH T005"/* 1330C */, /*40661*/"EGYPTIAN HIEROGLYPH T006"/* 1330D */,/*40662*/"EGYPTIAN HIEROGLYPH T007"/* 1330E */, /*40663*/"EGYPTIAN HIEROGLYPH T007A"/* 1330F */,/*40664*/"EGYPTIAN HIEROGLYPH T008"/* 13310 */, /*40665*/"EGYPTIAN HIEROGLYPH T008A"/* 13311 */,/*40666*/"EGYPTIAN HIEROGLYPH T009"/* 13312 */, /*40667*/"EGYPTIAN HIEROGLYPH T009A"/* 13313 */,/*40668*/"EGYPTIAN HIEROGLYPH T010"/* 13314 */, /*40669*/"EGYPTIAN HIEROGLYPH T011"/* 13315 */,/*40670*/"EGYPTIAN HIEROGLYPH T011A"/* 13316 */, /*40671*/"EGYPTIAN HIEROGLYPH T012"/* 13317 */,/*40672*/"EGYPTIAN HIEROGLYPH T013"/* 13318 */, /*40673*/"EGYPTIAN HIEROGLYPH T014"/* 13319 */,/*40674*/"EGYPTIAN HIEROGLYPH T015"/* 1331A */, /*40675*/"EGYPTIAN HIEROGLYPH T016"/* 1331B */,/*40676*/"EGYPTIAN HIEROGLYPH T016A"/* 1331C */, /*40677*/"EGYPTIAN HIEROGLYPH T017"/* 1331D */,/*40678*/"EGYPTIAN HIEROGLYPH T018"/* 1331E */, /*40679*/"EGYPTIAN HIEROGLYPH T019"/* 1331F */,/*40680*/"EGYPTIAN HIEROGLYPH T020"/* 13320 */, /*40681*/"EGYPTIAN HIEROGLYPH T021"/* 13321 */,/*40682*/"EGYPTIAN HIEROGLYPH T022"/* 13322 */, /*40683*/"EGYPTIAN HIEROGLYPH T023"/* 13323 */,/*40684*/"EGYPTIAN HIEROGLYPH T024"/* 13324 */, /*40685*/"EGYPTIAN HIEROGLYPH T025"/* 13325 */,/*40686*/"EGYPTIAN HIEROGLYPH T026"/* 13326 */, /*40687*/"EGYPTIAN HIEROGLYPH T027"/* 13327 */,/*40688*/"EGYPTIAN HIEROGLYPH T028"/* 13328 */, /*40689*/"EGYPTIAN HIEROGLYPH T029"/* 13329 */,/*40690*/"EGYPTIAN HIEROGLYPH T030"/* 1332A */, /*40691*/"EGYPTIAN HIEROGLYPH T031"/* 1332B */,/*40692*/"EGYPTIAN HIEROGLYPH T032"/* 1332C */, /*40693*/"EGYPTIAN HIEROGLYPH T032A"/* 1332D */,/*40694*/"EGYPTIAN HIEROGLYPH T033"/* 1332E */, /*40695*/"EGYPTIAN HIEROGLYPH T033A"/* 1332F */,/*40696*/"EGYPTIAN HIEROGLYPH T034"/* 13330 */, /*40697*/"EGYPTIAN HIEROGLYPH T035"/* 13331 */,/*40698*/"EGYPTIAN HIEROGLYPH T036"/* 13332 */, /*40699*/"EGYPTIAN HIEROGLYPH U001"/* 13333 */,/*40700*/"EGYPTIAN HIEROGLYPH U002"/* 13334 */, /*40701*/"EGYPTIAN HIEROGLYPH U003"/* 13335 */,/*40702*/"EGYPTIAN HIEROGLYPH U004"/* 13336 */, /*40703*/"EGYPTIAN HIEROGLYPH U005"/* 13337 */,/*40704*/"EGYPTIAN HIEROGLYPH U006"/* 13338 */, /*40705*/"EGYPTIAN HIEROGLYPH U006A"/* 13339 */,/*40706*/"EGYPTIAN HIEROGLYPH U006B"/* 1333A */, /*40707*/"EGYPTIAN HIEROGLYPH U007"/* 1333B */,/*40708*/"EGYPTIAN HIEROGLYPH U008"/* 1333C */, /*40709*/"EGYPTIAN HIEROGLYPH U009"/* 1333D */,/*40710*/"EGYPTIAN HIEROGLYPH U010"/* 1333E */, /*40711*/"EGYPTIAN HIEROGLYPH U011"/* 1333F */,/*40712*/"EGYPTIAN HIEROGLYPH U012"/* 13340 */, /*40713*/"EGYPTIAN HIEROGLYPH U013"/* 13341 */,/*40714*/"EGYPTIAN HIEROGLYPH U014"/* 13342 */, /*40715*/"EGYPTIAN HIEROGLYPH U015"/* 13343 */,/*40716*/"EGYPTIAN HIEROGLYPH U016"/* 13344 */, /*40717*/"EGYPTIAN HIEROGLYPH U017"/* 13345 */,/*40718*/"EGYPTIAN HIEROGLYPH U018"/* 13346 */, /*40719*/"EGYPTIAN HIEROGLYPH U019"/* 13347 */,/*40720*/"EGYPTIAN HIEROGLYPH U020"/* 13348 */, /*40721*/"EGYPTIAN HIEROGLYPH U021"/* 13349 */,/*40722*/"EGYPTIAN HIEROGLYPH U022"/* 1334A */, /*40723*/"EGYPTIAN HIEROGLYPH U023"/* 1334B */,/*40724*/"EGYPTIAN HIEROGLYPH U023A"/* 1334C */, /*40725*/"EGYPTIAN HIEROGLYPH U024"/* 1334D */,/*40726*/"EGYPTIAN HIEROGLYPH U025"/* 1334E */, /*40727*/"EGYPTIAN HIEROGLYPH U026"/* 1334F */,/*40728*/"EGYPTIAN HIEROGLYPH U027"/* 13350 */, /*40729*/"EGYPTIAN HIEROGLYPH U028"/* 13351 */,/*40730*/"EGYPTIAN HIEROGLYPH U029"/* 13352 */, /*40731*/"EGYPTIAN HIEROGLYPH U029A"/* 13353 */,/*40732*/"EGYPTIAN HIEROGLYPH U030"/* 13354 */, /*40733*/"EGYPTIAN HIEROGLYPH U031"/* 13355 */,/*40734*/"EGYPTIAN HIEROGLYPH U032"/* 13356 */, /*40735*/"EGYPTIAN HIEROGLYPH U032A"/* 13357 */,/*40736*/"EGYPTIAN HIEROGLYPH U033"/* 13358 */, /*40737*/"EGYPTIAN HIEROGLYPH U034"/* 13359 */,/*40738*/"EGYPTIAN HIEROGLYPH U035"/* 1335A */, /*40739*/"EGYPTIAN HIEROGLYPH U036"/* 1335B */,/*40740*/"EGYPTIAN HIEROGLYPH U037"/* 1335C */, /*40741*/"EGYPTIAN HIEROGLYPH U038"/* 1335D */,/*40742*/"EGYPTIAN HIEROGLYPH U039"/* 1335E */, /*40743*/"EGYPTIAN HIEROGLYPH U040"/* 1335F */,/*40744*/"EGYPTIAN HIEROGLYPH U041"/* 13360 */, /*40745*/"EGYPTIAN HIEROGLYPH U042"/* 13361 */,/*40746*/"EGYPTIAN HIEROGLYPH V001"/* 13362 */, /*40747*/"EGYPTIAN HIEROGLYPH V001A"/* 13363 */,/*40748*/"EGYPTIAN HIEROGLYPH V001B"/* 13364 */, /*40749*/"EGYPTIAN HIEROGLYPH V001C"/* 13365 */,/*40750*/"EGYPTIAN HIEROGLYPH V001D"/* 13366 */, /*40751*/"EGYPTIAN HIEROGLYPH V001E"/* 13367 */,/*40752*/"EGYPTIAN HIEROGLYPH V001F"/* 13368 */, /*40753*/"EGYPTIAN HIEROGLYPH V001G"/* 13369 */,/*40754*/"EGYPTIAN HIEROGLYPH V001H"/* 1336A */, /*40755*/"EGYPTIAN HIEROGLYPH V001I"/* 1336B */,/*40756*/"EGYPTIAN HIEROGLYPH V002"/* 1336C */, /*40757*/"EGYPTIAN HIEROGLYPH V002A"/* 1336D */,/*40758*/"EGYPTIAN HIEROGLYPH V003"/* 1336E */, /*40759*/"EGYPTIAN HIEROGLYPH V004"/* 1336F */,/*40760*/"EGYPTIAN HIEROGLYPH V005"/* 13370 */, /*40761*/"EGYPTIAN HIEROGLYPH V006"/* 13371 */,/*40762*/"EGYPTIAN HIEROGLYPH V007"/* 13372 */, /*40763*/"EGYPTIAN HIEROGLYPH V007A"/* 13373 */,/*40764*/"EGYPTIAN HIEROGLYPH V007B"/* 13374 */, /*40765*/"EGYPTIAN HIEROGLYPH V008"/* 13375 */,/*40766*/"EGYPTIAN HIEROGLYPH V009"/* 13376 */, /*40767*/"EGYPTIAN HIEROGLYPH V010"/* 13377 */,/*40768*/"EGYPTIAN HIEROGLYPH V011"/* 13378 */, /*40769*/"EGYPTIAN HIEROGLYPH V011A"/* 13379 */,/*40770*/"EGYPTIAN HIEROGLYPH V011B"/* 1337A */, /*40771*/"EGYPTIAN HIEROGLYPH V011C"/* 1337B */,/*40772*/"EGYPTIAN HIEROGLYPH V012"/* 1337C */, /*40773*/"EGYPTIAN HIEROGLYPH V012A"/* 1337D */,/*40774*/"EGYPTIAN HIEROGLYPH V012B"/* 1337E */, /*40775*/"EGYPTIAN HIEROGLYPH V013"/* 1337F */,/*40776*/"EGYPTIAN HIEROGLYPH V014"/* 13380 */, /*40777*/"EGYPTIAN HIEROGLYPH V015"/* 13381 */,/*40778*/"EGYPTIAN HIEROGLYPH V016"/* 13382 */, /*40779*/"EGYPTIAN HIEROGLYPH V017"/* 13383 */,/*40780*/"EGYPTIAN HIEROGLYPH V018"/* 13384 */, /*40781*/"EGYPTIAN HIEROGLYPH V019"/* 13385 */,/*40782*/"EGYPTIAN HIEROGLYPH V020"/* 13386 */, /*40783*/"EGYPTIAN HIEROGLYPH V020A"/* 13387 */,/*40784*/"EGYPTIAN HIEROGLYPH V020B"/* 13388 */, /*40785*/"EGYPTIAN HIEROGLYPH V020C"/* 13389 */,/*40786*/"EGYPTIAN HIEROGLYPH V020D"/* 1338A */, /*40787*/"EGYPTIAN HIEROGLYPH V020E"/* 1338B */,/*40788*/"EGYPTIAN HIEROGLYPH V020F"/* 1338C */, /*40789*/"EGYPTIAN HIEROGLYPH V020G"/* 1338D */,/*40790*/"EGYPTIAN HIEROGLYPH V020H"/* 1338E */, /*40791*/"EGYPTIAN HIEROGLYPH V020I"/* 1338F */,/*40792*/"EGYPTIAN HIEROGLYPH V020J"/* 13390 */, /*40793*/"EGYPTIAN HIEROGLYPH V020K"/* 13391 */,/*40794*/"EGYPTIAN HIEROGLYPH V020L"/* 13392 */, /*40795*/"EGYPTIAN HIEROGLYPH V021"/* 13393 */,/*40796*/"EGYPTIAN HIEROGLYPH V022"/* 13394 */, /*40797*/"EGYPTIAN HIEROGLYPH V023"/* 13395 */,/*40798*/"EGYPTIAN HIEROGLYPH V023A"/* 13396 */, /*40799*/"EGYPTIAN HIEROGLYPH V024"/* 13397 */,/*40800*/"EGYPTIAN HIEROGLYPH V025"/* 13398 */, /*40801*/"EGYPTIAN HIEROGLYPH V026"/* 13399 */,/*40802*/"EGYPTIAN HIEROGLYPH V027"/* 1339A */, /*40803*/"EGYPTIAN HIEROGLYPH V028"/* 1339B */,/*40804*/"EGYPTIAN HIEROGLYPH V028A"/* 1339C */, /*40805*/"EGYPTIAN HIEROGLYPH V029"/* 1339D */,/*40806*/"EGYPTIAN HIEROGLYPH V029A"/* 1339E */, /*40807*/"EGYPTIAN HIEROGLYPH V030"/* 1339F */,/*40808*/"EGYPTIAN HIEROGLYPH V030A"/* 133A0 */, /*40809*/"EGYPTIAN HIEROGLYPH V031"/* 133A1 */,/*40810*/"EGYPTIAN HIEROGLYPH V031A"/* 133A2 */, /*40811*/"EGYPTIAN HIEROGLYPH V032"/* 133A3 */,/*40812*/"EGYPTIAN HIEROGLYPH V033"/* 133A4 */, /*40813*/"EGYPTIAN HIEROGLYPH V033A"/* 133A5 */,/*40814*/"EGYPTIAN HIEROGLYPH V034"/* 133A6 */, /*40815*/"EGYPTIAN HIEROGLYPH V035"/* 133A7 */,/*40816*/"EGYPTIAN HIEROGLYPH V036"/* 133A8 */, /*40817*/"EGYPTIAN HIEROGLYPH V037"/* 133A9 */,/*40818*/"EGYPTIAN HIEROGLYPH V037A"/* 133AA */, /*40819*/"EGYPTIAN HIEROGLYPH V038"/* 133AB */,/*40820*/"EGYPTIAN HIEROGLYPH V039"/* 133AC */, /*40821*/"EGYPTIAN HIEROGLYPH V040"/* 133AD */,/*40822*/"EGYPTIAN HIEROGLYPH V040A"/* 133AE */, /*40823*/"EGYPTIAN HIEROGLYPH W001"/* 133AF */,/*40824*/"EGYPTIAN HIEROGLYPH W002"/* 133B0 */, /*40825*/"EGYPTIAN HIEROGLYPH W003"/* 133B1 */,/*40826*/"EGYPTIAN HIEROGLYPH W003A"/* 133B2 */, /*40827*/"EGYPTIAN HIEROGLYPH W004"/* 133B3 */,/*40828*/"EGYPTIAN HIEROGLYPH W005"/* 133B4 */, /*40829*/"EGYPTIAN HIEROGLYPH W006"/* 133B5 */,/*40830*/"EGYPTIAN HIEROGLYPH W007"/* 133B6 */, /*40831*/"EGYPTIAN HIEROGLYPH W008"/* 133B7 */,/*40832*/"EGYPTIAN HIEROGLYPH W009"/* 133B8 */, /*40833*/"EGYPTIAN HIEROGLYPH W009A"/* 133B9 */,/*40834*/"EGYPTIAN HIEROGLYPH W010"/* 133BA */, /*40835*/"EGYPTIAN HIEROGLYPH W010A"/* 133BB */,/*40836*/"EGYPTIAN HIEROGLYPH W011"/* 133BC */, /*40837*/"EGYPTIAN HIEROGLYPH W012"/* 133BD */,/*40838*/"EGYPTIAN HIEROGLYPH W013"/* 133BE */, /*40839*/"EGYPTIAN HIEROGLYPH W014"/* 133BF */,/*40840*/"EGYPTIAN HIEROGLYPH W014A"/* 133C0 */, /*40841*/"EGYPTIAN HIEROGLYPH W015"/* 133C1 */,/*40842*/"EGYPTIAN HIEROGLYPH W016"/* 133C2 */, /*40843*/"EGYPTIAN HIEROGLYPH W017"/* 133C3 */,/*40844*/"EGYPTIAN HIEROGLYPH W017A"/* 133C4 */, /*40845*/"EGYPTIAN HIEROGLYPH W018"/* 133C5 */,/*40846*/"EGYPTIAN HIEROGLYPH W018A"/* 133C6 */, /*40847*/"EGYPTIAN HIEROGLYPH W019"/* 133C7 */,/*40848*/"EGYPTIAN HIEROGLYPH W020"/* 133C8 */, /*40849*/"EGYPTIAN HIEROGLYPH W021"/* 133C9 */,/*40850*/"EGYPTIAN HIEROGLYPH W022"/* 133CA */, /*40851*/"EGYPTIAN HIEROGLYPH W023"/* 133CB */,/*40852*/"EGYPTIAN HIEROGLYPH W024"/* 133CC */, /*40853*/"EGYPTIAN HIEROGLYPH W024A"/* 133CD */,/*40854*/"EGYPTIAN HIEROGLYPH W025"/* 133CE */, /*40855*/"EGYPTIAN HIEROGLYPH X001"/* 133CF */,/*40856*/"EGYPTIAN HIEROGLYPH X002"/* 133D0 */, /*40857*/"EGYPTIAN HIEROGLYPH X003"/* 133D1 */,/*40858*/"EGYPTIAN HIEROGLYPH X004"/* 133D2 */, /*40859*/"EGYPTIAN HIEROGLYPH X004A"/* 133D3 */,/*40860*/"EGYPTIAN HIEROGLYPH X004B"/* 133D4 */, /*40861*/"EGYPTIAN HIEROGLYPH X005"/* 133D5 */,/*40862*/"EGYPTIAN HIEROGLYPH X006"/* 133D6 */, /*40863*/"EGYPTIAN HIEROGLYPH X006A"/* 133D7 */,/*40864*/"EGYPTIAN HIEROGLYPH X007"/* 133D8 */, /*40865*/"EGYPTIAN HIEROGLYPH X008"/* 133D9 */,/*40866*/"EGYPTIAN HIEROGLYPH X008A"/* 133DA */, /*40867*/"EGYPTIAN HIEROGLYPH Y001"/* 133DB */,/*40868*/"EGYPTIAN HIEROGLYPH Y001A"/* 133DC */, /*40869*/"EGYPTIAN HIEROGLYPH Y002"/* 133DD */,/*40870*/"EGYPTIAN HIEROGLYPH Y003"/* 133DE */, /*40871*/"EGYPTIAN HIEROGLYPH Y004"/* 133DF */,/*40872*/"EGYPTIAN HIEROGLYPH Y005"/* 133E0 */, /*40873*/"EGYPTIAN HIEROGLYPH Y006"/* 133E1 */,/*40874*/"EGYPTIAN HIEROGLYPH Y007"/* 133E2 */, /*40875*/"EGYPTIAN HIEROGLYPH Y008"/* 133E3 */,/*40876*/"EGYPTIAN HIEROGLYPH Z001"/* 133E4 */, /*40877*/"EGYPTIAN HIEROGLYPH Z002"/* 133E5 */,/*40878*/"EGYPTIAN HIEROGLYPH Z002A"/* 133E6 */, /*40879*/"EGYPTIAN HIEROGLYPH Z002B"/* 133E7 */,/*40880*/"EGYPTIAN HIEROGLYPH Z002C"/* 133E8 */, /*40881*/"EGYPTIAN HIEROGLYPH Z002D"/* 133E9 */,/*40882*/"EGYPTIAN HIEROGLYPH Z003"/* 133EA */, /*40883*/"EGYPTIAN HIEROGLYPH Z003A"/* 133EB */,/*40884*/"EGYPTIAN HIEROGLYPH Z003B"/* 133EC */, /*40885*/"EGYPTIAN HIEROGLYPH Z004"/* 133ED */,/*40886*/"EGYPTIAN HIEROGLYPH Z004A"/* 133EE */, /*40887*/"EGYPTIAN HIEROGLYPH Z005"/* 133EF */,/*40888*/"EGYPTIAN HIEROGLYPH Z005A"/* 133F0 */, /*40889*/"EGYPTIAN HIEROGLYPH Z006"/* 133F1 */,/*40890*/"EGYPTIAN HIEROGLYPH Z007"/* 133F2 */, /*40891*/"EGYPTIAN HIEROGLYPH Z008"/* 133F3 */,/*40892*/"EGYPTIAN HIEROGLYPH Z009"/* 133F4 */, /*40893*/"EGYPTIAN HIEROGLYPH Z010"/* 133F5 */,/*40894*/"EGYPTIAN HIEROGLYPH Z011"/* 133F6 */, /*40895*/"EGYPTIAN HIEROGLYPH Z012"/* 133F7 */,/*40896*/"EGYPTIAN HIEROGLYPH Z013"/* 133F8 */, /*40897*/"EGYPTIAN HIEROGLYPH Z014"/* 133F9 */,/*40898*/"EGYPTIAN HIEROGLYPH Z015"/* 133FA */, /*40899*/"EGYPTIAN HIEROGLYPH Z015A"/* 133FB */,/*40900*/"EGYPTIAN HIEROGLYPH Z015B"/* 133FC */, /*40901*/"EGYPTIAN HIEROGLYPH Z015C"/* 133FD */,/*40902*/"EGYPTIAN HIEROGLYPH Z015D"/* 133FE */, /*40903*/"EGYPTIAN HIEROGLYPH Z015E"/* 133FF */,/*40904*/"EGYPTIAN HIEROGLYPH Z015F"/* 13400 */, /*40905*/"EGYPTIAN HIEROGLYPH Z015G"/* 13401 */,/*40906*/"EGYPTIAN HIEROGLYPH Z015H"/* 13402 */, /*40907*/"EGYPTIAN HIEROGLYPH Z015I"/* 13403 */,/*40908*/"EGYPTIAN HIEROGLYPH Z016"/* 13404 */, /*40909*/"EGYPTIAN HIEROGLYPH Z016A"/* 13405 */,/*40910*/"EGYPTIAN HIEROGLYPH Z016B"/* 13406 */, /*40911*/"EGYPTIAN HIEROGLYPH Z016C"/* 13407 */,/*40912*/"EGYPTIAN HIEROGLYPH Z016D"/* 13408 */, /*40913*/"EGYPTIAN HIEROGLYPH Z016E"/* 13409 */,/*40914*/"EGYPTIAN HIEROGLYPH Z016F"/* 1340A */, /*40915*/"EGYPTIAN HIEROGLYPH Z016G"/* 1340B */,/*40916*/"EGYPTIAN HIEROGLYPH Z016H"/* 1340C */, /*40917*/"EGYPTIAN HIEROGLYPH AA001"/* 1340D */,/*40918*/"EGYPTIAN HIEROGLYPH AA002"/* 1340E */, /*40919*/"EGYPTIAN HIEROGLYPH AA003"/* 1340F */,/*40920*/"EGYPTIAN HIEROGLYPH AA004"/* 13410 */, /*40921*/"EGYPTIAN HIEROGLYPH AA005"/* 13411 */,/*40922*/"EGYPTIAN HIEROGLYPH AA006"/* 13412 */, /*40923*/"EGYPTIAN HIEROGLYPH AA007"/* 13413 */,/*40924*/"EGYPTIAN HIEROGLYPH AA007A"/* 13414 */, /*40925*/"EGYPTIAN HIEROGLYPH AA007B"/* 13415 */,/*40926*/"EGYPTIAN HIEROGLYPH AA008"/* 13416 */, /*40927*/"EGYPTIAN HIEROGLYPH AA009"/* 13417 */,/*40928*/"EGYPTIAN HIEROGLYPH AA010"/* 13418 */, /*40929*/"EGYPTIAN HIEROGLYPH AA011"/* 13419 */,/*40930*/"EGYPTIAN HIEROGLYPH AA012"/* 1341A */, /*40931*/"EGYPTIAN HIEROGLYPH AA013"/* 1341B */,/*40932*/"EGYPTIAN HIEROGLYPH AA014"/* 1341C */, /*40933*/"EGYPTIAN HIEROGLYPH AA015"/* 1341D */,/*40934*/"EGYPTIAN HIEROGLYPH AA016"/* 1341E */, /*40935*/"EGYPTIAN HIEROGLYPH AA017"/* 1341F */,/*40936*/"EGYPTIAN HIEROGLYPH AA018"/* 13420 */, /*40937*/"EGYPTIAN HIEROGLYPH AA019"/* 13421 */,/*40938*/"EGYPTIAN HIEROGLYPH AA020"/* 13422 */, /*40939*/"EGYPTIAN HIEROGLYPH AA021"/* 13423 */,/*40940*/"EGYPTIAN HIEROGLYPH AA022"/* 13424 */, /*40941*/"EGYPTIAN HIEROGLYPH AA023"/* 13425 */,/*40942*/"EGYPTIAN HIEROGLYPH AA024"/* 13426 */, /*40943*/"EGYPTIAN HIEROGLYPH AA025"/* 13427 */,/*40944*/"EGYPTIAN HIEROGLYPH AA026"/* 13428 */, /*40945*/"EGYPTIAN HIEROGLYPH AA027"/* 13429 */,/*40946*/"EGYPTIAN HIEROGLYPH AA028"/* 1342A */, /*40947*/"EGYPTIAN HIEROGLYPH AA029"/* 1342B */,/*40948*/"EGYPTIAN HIEROGLYPH AA030"/* 1342C */, /*40949*/"EGYPTIAN HIEROGLYPH AA031"/* 1342D */,/*40950*/"EGYPTIAN HIEROGLYPH AA032"/* 1342E */, /*40951*/"ANATOLIAN HIEROGLYPH A001"/* 14400 */,/*40952*/"ANATOLIAN HIEROGLYPH A002"/* 14401 */, /*40953*/"ANATOLIAN HIEROGLYPH A003"/* 14402 */,/*40954*/"ANATOLIAN HIEROGLYPH A004"/* 14403 */, /*40955*/"ANATOLIAN HIEROGLYPH A005"/* 14404 */,/*40956*/"ANATOLIAN HIEROGLYPH A006"/* 14405 */, /*40957*/"ANATOLIAN HIEROGLYPH A007"/* 14406 */,/*40958*/"ANATOLIAN HIEROGLYPH A008"/* 14407 */, /*40959*/"ANATOLIAN HIEROGLYPH A009"/* 14408 */,/*40960*/"ANATOLIAN HIEROGLYPH A010"/* 14409 */, /*40961*/"ANATOLIAN HIEROGLYPH A010A"/* 1440A */,/*40962*/"ANATOLIAN HIEROGLYPH A011"/* 1440B */, /*40963*/"ANATOLIAN HIEROGLYPH A012"/* 1440C */,/*40964*/"ANATOLIAN HIEROGLYPH A013"/* 1440D */, /*40965*/"ANATOLIAN HIEROGLYPH A014"/* 1440E */,/*40966*/"ANATOLIAN HIEROGLYPH A015"/* 1440F */, /*40967*/"ANATOLIAN HIEROGLYPH A016"/* 14410 */,/*40968*/"ANATOLIAN HIEROGLYPH A017"/* 14411 */, /*40969*/"ANATOLIAN HIEROGLYPH A018"/* 14412 */,/*40970*/"ANATOLIAN HIEROGLYPH A019"/* 14413 */, /*40971*/"ANATOLIAN HIEROGLYPH A020"/* 14414 */,/*40972*/"ANATOLIAN HIEROGLYPH A021"/* 14415 */, /*40973*/"ANATOLIAN HIEROGLYPH A022"/* 14416 */,/*40974*/"ANATOLIAN HIEROGLYPH A023"/* 14417 */, /*40975*/"ANATOLIAN HIEROGLYPH A024"/* 14418 */,/*40976*/"ANATOLIAN HIEROGLYPH A025"/* 14419 */, /*40977*/"ANATOLIAN HIEROGLYPH A026"/* 1441A */,/*40978*/"ANATOLIAN HIEROGLYPH A026A"/* 1441B */, /*40979*/"ANATOLIAN HIEROGLYPH A027"/* 1441C */,/*40980*/"ANATOLIAN HIEROGLYPH A028"/* 1441D */, /*40981*/"ANATOLIAN HIEROGLYPH A029"/* 1441E */,/*40982*/"ANATOLIAN HIEROGLYPH A030"/* 1441F */, /*40983*/"ANATOLIAN HIEROGLYPH A031"/* 14420 */,/*40984*/"ANATOLIAN HIEROGLYPH A032"/* 14421 */, /*40985*/"ANATOLIAN HIEROGLYPH A033"/* 14422 */,/*40986*/"ANATOLIAN HIEROGLYPH A034"/* 14423 */, /*40987*/"ANATOLIAN HIEROGLYPH A035"/* 14424 */,/*40988*/"ANATOLIAN HIEROGLYPH A036"/* 14425 */, /*40989*/"ANATOLIAN HIEROGLYPH A037"/* 14426 */,/*40990*/"ANATOLIAN HIEROGLYPH A038"/* 14427 */, /*40991*/"ANATOLIAN HIEROGLYPH A039"/* 14428 */,/*40992*/"ANATOLIAN HIEROGLYPH A039A"/* 14429 */, /*40993*/"ANATOLIAN HIEROGLYPH A040"/* 1442A */,/*40994*/"ANATOLIAN HIEROGLYPH A041"/* 1442B */, /*40995*/"ANATOLIAN HIEROGLYPH A041A"/* 1442C */,/*40996*/"ANATOLIAN HIEROGLYPH A042"/* 1442D */, /*40997*/"ANATOLIAN HIEROGLYPH A043"/* 1442E */,/*40998*/"ANATOLIAN HIEROGLYPH A044"/* 1442F */, /*40999*/"ANATOLIAN HIEROGLYPH A045"/* 14430 */,/*41000*/"ANATOLIAN HIEROGLYPH A045A"/* 14431 */, /*41001*/"ANATOLIAN HIEROGLYPH A046"/* 14432 */,/*41002*/"ANATOLIAN HIEROGLYPH A046A"/* 14433 */, /*41003*/"ANATOLIAN HIEROGLYPH A046B"/* 14434 */,/*41004*/"ANATOLIAN HIEROGLYPH A047"/* 14435 */, /*41005*/"ANATOLIAN HIEROGLYPH A048"/* 14436 */,/*41006*/"ANATOLIAN HIEROGLYPH A049"/* 14437 */, /*41007*/"ANATOLIAN HIEROGLYPH A050"/* 14438 */,/*41008*/"ANATOLIAN HIEROGLYPH A051"/* 14439 */, /*41009*/"ANATOLIAN HIEROGLYPH A052"/* 1443A */,/*41010*/"ANATOLIAN HIEROGLYPH A053"/* 1443B */, /*41011*/"ANATOLIAN HIEROGLYPH A054"/* 1443C */,/*41012*/"ANATOLIAN HIEROGLYPH A055"/* 1443D */, /*41013*/"ANATOLIAN HIEROGLYPH A056"/* 1443E */,/*41014*/"ANATOLIAN HIEROGLYPH A057"/* 1443F */, /*41015*/"ANATOLIAN HIEROGLYPH A058"/* 14440 */,/*41016*/"ANATOLIAN HIEROGLYPH A059"/* 14441 */, /*41017*/"ANATOLIAN HIEROGLYPH A060"/* 14442 */,/*41018*/"ANATOLIAN HIEROGLYPH A061"/* 14443 */, /*41019*/"ANATOLIAN HIEROGLYPH A062"/* 14444 */,/*41020*/"ANATOLIAN HIEROGLYPH A063"/* 14445 */, /*41021*/"ANATOLIAN HIEROGLYPH A064"/* 14446 */,/*41022*/"ANATOLIAN HIEROGLYPH A065"/* 14447 */, /*41023*/"ANATOLIAN HIEROGLYPH A066"/* 14448 */,/*41024*/"ANATOLIAN HIEROGLYPH A066A"/* 14449 */, /*41025*/"ANATOLIAN HIEROGLYPH A066B"/* 1444A */,/*41026*/"ANATOLIAN HIEROGLYPH A066C"/* 1444B */, /*41027*/"ANATOLIAN HIEROGLYPH A067"/* 1444C */,/*41028*/"ANATOLIAN HIEROGLYPH A068"/* 1444D */, /*41029*/"ANATOLIAN HIEROGLYPH A069"/* 1444E */,/*41030*/"ANATOLIAN HIEROGLYPH A070"/* 1444F */, /*41031*/"ANATOLIAN HIEROGLYPH A071"/* 14450 */,/*41032*/"ANATOLIAN HIEROGLYPH A072"/* 14451 */, /*41033*/"ANATOLIAN HIEROGLYPH A073"/* 14452 */,/*41034*/"ANATOLIAN HIEROGLYPH A074"/* 14453 */, /*41035*/"ANATOLIAN HIEROGLYPH A075"/* 14454 */,/*41036*/"ANATOLIAN HIEROGLYPH A076"/* 14455 */, /*41037*/"ANATOLIAN HIEROGLYPH A077"/* 14456 */,/*41038*/"ANATOLIAN HIEROGLYPH A078"/* 14457 */, /*41039*/"ANATOLIAN HIEROGLYPH A079"/* 14458 */,/*41040*/"ANATOLIAN HIEROGLYPH A080"/* 14459 */, /*41041*/"ANATOLIAN HIEROGLYPH A081"/* 1445A */,/*41042*/"ANATOLIAN HIEROGLYPH A082"/* 1445B */, /*41043*/"ANATOLIAN HIEROGLYPH A083"/* 1445C */,/*41044*/"ANATOLIAN HIEROGLYPH A084"/* 1445D */, /*41045*/"ANATOLIAN HIEROGLYPH A085"/* 1445E */,/*41046*/"ANATOLIAN HIEROGLYPH A086"/* 1445F */, /*41047*/"ANATOLIAN HIEROGLYPH A087"/* 14460 */,/*41048*/"ANATOLIAN HIEROGLYPH A088"/* 14461 */, /*41049*/"ANATOLIAN HIEROGLYPH A089"/* 14462 */,/*41050*/"ANATOLIAN HIEROGLYPH A090"/* 14463 */, /*41051*/"ANATOLIAN HIEROGLYPH A091"/* 14464 */,/*41052*/"ANATOLIAN HIEROGLYPH A092"/* 14465 */, /*41053*/"ANATOLIAN HIEROGLYPH A093"/* 14466 */,/*41054*/"ANATOLIAN HIEROGLYPH A094"/* 14467 */, /*41055*/"ANATOLIAN HIEROGLYPH A095"/* 14468 */,/*41056*/"ANATOLIAN HIEROGLYPH A096"/* 14469 */, /*41057*/"ANATOLIAN HIEROGLYPH A097"/* 1446A */,/*41058*/"ANATOLIAN HIEROGLYPH A097A"/* 1446B */, /*41059*/"ANATOLIAN HIEROGLYPH A098"/* 1446C */,/*41060*/"ANATOLIAN HIEROGLYPH A098A"/* 1446D */, /*41061*/"ANATOLIAN HIEROGLYPH A099"/* 1446E */,/*41062*/"ANATOLIAN HIEROGLYPH A100"/* 1446F */, /*41063*/"ANATOLIAN HIEROGLYPH A100A"/* 14470 */,/*41064*/"ANATOLIAN HIEROGLYPH A101"/* 14471 */, /*41065*/"ANATOLIAN HIEROGLYPH A101A"/* 14472 */,/*41066*/"ANATOLIAN HIEROGLYPH A102"/* 14473 */, /*41067*/"ANATOLIAN HIEROGLYPH A102A"/* 14474 */,/*41068*/"ANATOLIAN HIEROGLYPH A103"/* 14475 */, /*41069*/"ANATOLIAN HIEROGLYPH A104"/* 14476 */,/*41070*/"ANATOLIAN HIEROGLYPH A104A"/* 14477 */, /*41071*/"ANATOLIAN HIEROGLYPH A104B"/* 14478 */,/*41072*/"ANATOLIAN HIEROGLYPH A104C"/* 14479 */, /*41073*/"ANATOLIAN HIEROGLYPH A105"/* 1447A */,/*41074*/"ANATOLIAN HIEROGLYPH A105A"/* 1447B */, /*41075*/"ANATOLIAN HIEROGLYPH A105B"/* 1447C */,/*41076*/"ANATOLIAN HIEROGLYPH A106"/* 1447D */, /*41077*/"ANATOLIAN HIEROGLYPH A107"/* 1447E */,/*41078*/"ANATOLIAN HIEROGLYPH A107A"/* 1447F */, /*41079*/"ANATOLIAN HIEROGLYPH A107B"/* 14480 */,/*41080*/"ANATOLIAN HIEROGLYPH A107C"/* 14481 */, /*41081*/"ANATOLIAN HIEROGLYPH A108"/* 14482 */,/*41082*/"ANATOLIAN HIEROGLYPH A109"/* 14483 */, /*41083*/"ANATOLIAN HIEROGLYPH A110"/* 14484 */,/*41084*/"ANATOLIAN HIEROGLYPH A110A"/* 14485 */, /*41085*/"ANATOLIAN HIEROGLYPH A110B"/* 14486 */,/*41086*/"ANATOLIAN HIEROGLYPH A111"/* 14487 */, /*41087*/"ANATOLIAN HIEROGLYPH A112"/* 14488 */,/*41088*/"ANATOLIAN HIEROGLYPH A113"/* 14489 */, /*41089*/"ANATOLIAN HIEROGLYPH A114"/* 1448A */,/*41090*/"ANATOLIAN HIEROGLYPH A115"/* 1448B */, /*41091*/"ANATOLIAN HIEROGLYPH A115A"/* 1448C */,/*41092*/"ANATOLIAN HIEROGLYPH A116"/* 1448D */, /*41093*/"ANATOLIAN HIEROGLYPH A117"/* 1448E */,/*41094*/"ANATOLIAN HIEROGLYPH A118"/* 1448F */, /*41095*/"ANATOLIAN HIEROGLYPH A119"/* 14490 */,/*41096*/"ANATOLIAN HIEROGLYPH A120"/* 14491 */, /*41097*/"ANATOLIAN HIEROGLYPH A121"/* 14492 */,/*41098*/"ANATOLIAN HIEROGLYPH A122"/* 14493 */, /*41099*/"ANATOLIAN HIEROGLYPH A123"/* 14494 */,/*41100*/"ANATOLIAN HIEROGLYPH A124"/* 14495 */, /*41101*/"ANATOLIAN HIEROGLYPH A125"/* 14496 */,/*41102*/"ANATOLIAN HIEROGLYPH A125A"/* 14497 */, /*41103*/"ANATOLIAN HIEROGLYPH A126"/* 14498 */,/*41104*/"ANATOLIAN HIEROGLYPH A127"/* 14499 */, /*41105*/"ANATOLIAN HIEROGLYPH A128"/* 1449A */,/*41106*/"ANATOLIAN HIEROGLYPH A129"/* 1449B */, /*41107*/"ANATOLIAN HIEROGLYPH A130"/* 1449C */,/*41108*/"ANATOLIAN HIEROGLYPH A131"/* 1449D */, /*41109*/"ANATOLIAN HIEROGLYPH A132"/* 1449E */,/*41110*/"ANATOLIAN HIEROGLYPH A133"/* 1449F */, /*41111*/"ANATOLIAN HIEROGLYPH A134"/* 144A0 */,/*41112*/"ANATOLIAN HIEROGLYPH A135"/* 144A1 */, /*41113*/"ANATOLIAN HIEROGLYPH A135A"/* 144A2 */,/*41114*/"ANATOLIAN HIEROGLYPH A136"/* 144A3 */, /*41115*/"ANATOLIAN HIEROGLYPH A137"/* 144A4 */,/*41116*/"ANATOLIAN HIEROGLYPH A138"/* 144A5 */, /*41117*/"ANATOLIAN HIEROGLYPH A139"/* 144A6 */,/*41118*/"ANATOLIAN HIEROGLYPH A140"/* 144A7 */, /*41119*/"ANATOLIAN HIEROGLYPH A141"/* 144A8 */,/*41120*/"ANATOLIAN HIEROGLYPH A142"/* 144A9 */, /*41121*/"ANATOLIAN HIEROGLYPH A143"/* 144AA */,/*41122*/"ANATOLIAN HIEROGLYPH A144"/* 144AB */, /*41123*/"ANATOLIAN HIEROGLYPH A145"/* 144AC */,/*41124*/"ANATOLIAN HIEROGLYPH A146"/* 144AD */, /*41125*/"ANATOLIAN HIEROGLYPH A147"/* 144AE */,/*41126*/"ANATOLIAN HIEROGLYPH A148"/* 144AF */, /*41127*/"ANATOLIAN HIEROGLYPH A149"/* 144B0 */,/*41128*/"ANATOLIAN HIEROGLYPH A150"/* 144B1 */, /*41129*/"ANATOLIAN HIEROGLYPH A151"/* 144B2 */,/*41130*/"ANATOLIAN HIEROGLYPH A152"/* 144B3 */, /*41131*/"ANATOLIAN HIEROGLYPH A153"/* 144B4 */,/*41132*/"ANATOLIAN HIEROGLYPH A154"/* 144B5 */, /*41133*/"ANATOLIAN HIEROGLYPH A155"/* 144B6 */,/*41134*/"ANATOLIAN HIEROGLYPH A156"/* 144B7 */, /*41135*/"ANATOLIAN HIEROGLYPH A157"/* 144B8 */,/*41136*/"ANATOLIAN HIEROGLYPH A158"/* 144B9 */, /*41137*/"ANATOLIAN HIEROGLYPH A159"/* 144BA */,/*41138*/"ANATOLIAN HIEROGLYPH A160"/* 144BB */, /*41139*/"ANATOLIAN HIEROGLYPH A161"/* 144BC */,/*41140*/"ANATOLIAN HIEROGLYPH A162"/* 144BD */, /*41141*/"ANATOLIAN HIEROGLYPH A163"/* 144BE */,/*41142*/"ANATOLIAN HIEROGLYPH A164"/* 144BF */, /*41143*/"ANATOLIAN HIEROGLYPH A165"/* 144C0 */,/*41144*/"ANATOLIAN HIEROGLYPH A166"/* 144C1 */, /*41145*/"ANATOLIAN HIEROGLYPH A167"/* 144C2 */,/*41146*/"ANATOLIAN HIEROGLYPH A168"/* 144C3 */, /*41147*/"ANATOLIAN HIEROGLYPH A169"/* 144C4 */,/*41148*/"ANATOLIAN HIEROGLYPH A170"/* 144C5 */, /*41149*/"ANATOLIAN HIEROGLYPH A171"/* 144C6 */,/*41150*/"ANATOLIAN HIEROGLYPH A172"/* 144C7 */, /*41151*/"ANATOLIAN HIEROGLYPH A173"/* 144C8 */,/*41152*/"ANATOLIAN HIEROGLYPH A174"/* 144C9 */, /*41153*/"ANATOLIAN HIEROGLYPH A175"/* 144CA */,/*41154*/"ANATOLIAN HIEROGLYPH A176"/* 144CB */, /*41155*/"ANATOLIAN HIEROGLYPH A177"/* 144CC */,/*41156*/"ANATOLIAN HIEROGLYPH A178"/* 144CD */, /*41157*/"ANATOLIAN HIEROGLYPH A179"/* 144CE */,/*41158*/"ANATOLIAN HIEROGLYPH A180"/* 144CF */, /*41159*/"ANATOLIAN HIEROGLYPH A181"/* 144D0 */,/*41160*/"ANATOLIAN HIEROGLYPH A182"/* 144D1 */, /*41161*/"ANATOLIAN HIEROGLYPH A183"/* 144D2 */,/*41162*/"ANATOLIAN HIEROGLYPH A184"/* 144D3 */, /*41163*/"ANATOLIAN HIEROGLYPH A185"/* 144D4 */,/*41164*/"ANATOLIAN HIEROGLYPH A186"/* 144D5 */, /*41165*/"ANATOLIAN HIEROGLYPH A187"/* 144D6 */,/*41166*/"ANATOLIAN HIEROGLYPH A188"/* 144D7 */, /*41167*/"ANATOLIAN HIEROGLYPH A189"/* 144D8 */,/*41168*/"ANATOLIAN HIEROGLYPH A190"/* 144D9 */, /*41169*/"ANATOLIAN HIEROGLYPH A191"/* 144DA */,/*41170*/"ANATOLIAN HIEROGLYPH A192"/* 144DB */, /*41171*/"ANATOLIAN HIEROGLYPH A193"/* 144DC */,/*41172*/"ANATOLIAN HIEROGLYPH A194"/* 144DD */, /*41173*/"ANATOLIAN HIEROGLYPH A195"/* 144DE */,/*41174*/"ANATOLIAN HIEROGLYPH A196"/* 144DF */, /*41175*/"ANATOLIAN HIEROGLYPH A197"/* 144E0 */,/*41176*/"ANATOLIAN HIEROGLYPH A198"/* 144E1 */, /*41177*/"ANATOLIAN HIEROGLYPH A199"/* 144E2 */,/*41178*/"ANATOLIAN HIEROGLYPH A200"/* 144E3 */, /*41179*/"ANATOLIAN HIEROGLYPH A201"/* 144E4 */,/*41180*/"ANATOLIAN HIEROGLYPH A202"/* 144E5 */, /*41181*/"ANATOLIAN HIEROGLYPH A202A"/* 144E6 */,/*41182*/"ANATOLIAN HIEROGLYPH A202B"/* 144E7 */, /*41183*/"ANATOLIAN HIEROGLYPH A203"/* 144E8 */,/*41184*/"ANATOLIAN HIEROGLYPH A204"/* 144E9 */, /*41185*/"ANATOLIAN HIEROGLYPH A205"/* 144EA */,/*41186*/"ANATOLIAN HIEROGLYPH A206"/* 144EB */, /*41187*/"ANATOLIAN HIEROGLYPH A207"/* 144EC */,/*41188*/"ANATOLIAN HIEROGLYPH A207A"/* 144ED */, /*41189*/"ANATOLIAN HIEROGLYPH A208"/* 144EE */,/*41190*/"ANATOLIAN HIEROGLYPH A209"/* 144EF */, /*41191*/"ANATOLIAN HIEROGLYPH A209A"/* 144F0 */,/*41192*/"ANATOLIAN HIEROGLYPH A210"/* 144F1 */, /*41193*/"ANATOLIAN HIEROGLYPH A211"/* 144F2 */,/*41194*/"ANATOLIAN HIEROGLYPH A212"/* 144F3 */, /*41195*/"ANATOLIAN HIEROGLYPH A213"/* 144F4 */,/*41196*/"ANATOLIAN HIEROGLYPH A214"/* 144F5 */, /*41197*/"ANATOLIAN HIEROGLYPH A215"/* 144F6 */,/*41198*/"ANATOLIAN HIEROGLYPH A215A"/* 144F7 */, /*41199*/"ANATOLIAN HIEROGLYPH A216"/* 144F8 */,/*41200*/"ANATOLIAN HIEROGLYPH A216A"/* 144F9 */, /*41201*/"ANATOLIAN HIEROGLYPH A217"/* 144FA */,/*41202*/"ANATOLIAN HIEROGLYPH A218"/* 144FB */, /*41203*/"ANATOLIAN HIEROGLYPH A219"/* 144FC */,/*41204*/"ANATOLIAN HIEROGLYPH A220"/* 144FD */, /*41205*/"ANATOLIAN HIEROGLYPH A221"/* 144FE */,/*41206*/"ANATOLIAN HIEROGLYPH A222"/* 144FF */, /*41207*/"ANATOLIAN HIEROGLYPH A223"/* 14500 */,/*41208*/"ANATOLIAN HIEROGLYPH A224"/* 14501 */, /*41209*/"ANATOLIAN HIEROGLYPH A225"/* 14502 */,/*41210*/"ANATOLIAN HIEROGLYPH A226"/* 14503 */, /*41211*/"ANATOLIAN HIEROGLYPH A227"/* 14504 */,/*41212*/"ANATOLIAN HIEROGLYPH A227A"/* 14505 */, /*41213*/"ANATOLIAN HIEROGLYPH A228"/* 14506 */,/*41214*/"ANATOLIAN HIEROGLYPH A229"/* 14507 */, /*41215*/"ANATOLIAN HIEROGLYPH A230"/* 14508 */,/*41216*/"ANATOLIAN HIEROGLYPH A231"/* 14509 */, /*41217*/"ANATOLIAN HIEROGLYPH A232"/* 1450A */,/*41218*/"ANATOLIAN HIEROGLYPH A233"/* 1450B */, /*41219*/"ANATOLIAN HIEROGLYPH A234"/* 1450C */,/*41220*/"ANATOLIAN HIEROGLYPH A235"/* 1450D */, /*41221*/"ANATOLIAN HIEROGLYPH A236"/* 1450E */,/*41222*/"ANATOLIAN HIEROGLYPH A237"/* 1450F */, /*41223*/"ANATOLIAN HIEROGLYPH A238"/* 14510 */,/*41224*/"ANATOLIAN HIEROGLYPH A239"/* 14511 */, /*41225*/"ANATOLIAN HIEROGLYPH A240"/* 14512 */,/*41226*/"ANATOLIAN HIEROGLYPH A241"/* 14513 */, /*41227*/"ANATOLIAN HIEROGLYPH A242"/* 14514 */,/*41228*/"ANATOLIAN HIEROGLYPH A243"/* 14515 */, /*41229*/"ANATOLIAN HIEROGLYPH A244"/* 14516 */,/*41230*/"ANATOLIAN HIEROGLYPH A245"/* 14517 */, /*41231*/"ANATOLIAN HIEROGLYPH A246"/* 14518 */,/*41232*/"ANATOLIAN HIEROGLYPH A247"/* 14519 */, /*41233*/"ANATOLIAN HIEROGLYPH A248"/* 1451A */,/*41234*/"ANATOLIAN HIEROGLYPH A249"/* 1451B */, /*41235*/"ANATOLIAN HIEROGLYPH A250"/* 1451C */,/*41236*/"ANATOLIAN HIEROGLYPH A251"/* 1451D */, /*41237*/"ANATOLIAN HIEROGLYPH A252"/* 1451E */,/*41238*/"ANATOLIAN HIEROGLYPH A253"/* 1451F */, /*41239*/"ANATOLIAN HIEROGLYPH A254"/* 14520 */,/*41240*/"ANATOLIAN HIEROGLYPH A255"/* 14521 */, /*41241*/"ANATOLIAN HIEROGLYPH A256"/* 14522 */,/*41242*/"ANATOLIAN HIEROGLYPH A257"/* 14523 */, /*41243*/"ANATOLIAN HIEROGLYPH A258"/* 14524 */,/*41244*/"ANATOLIAN HIEROGLYPH A259"/* 14525 */, /*41245*/"ANATOLIAN HIEROGLYPH A260"/* 14526 */,/*41246*/"ANATOLIAN HIEROGLYPH A261"/* 14527 */, /*41247*/"ANATOLIAN HIEROGLYPH A262"/* 14528 */,/*41248*/"ANATOLIAN HIEROGLYPH A263"/* 14529 */, /*41249*/"ANATOLIAN HIEROGLYPH A264"/* 1452A */,/*41250*/"ANATOLIAN HIEROGLYPH A265"/* 1452B */, /*41251*/"ANATOLIAN HIEROGLYPH A266"/* 1452C */,/*41252*/"ANATOLIAN HIEROGLYPH A267"/* 1452D */, /*41253*/"ANATOLIAN HIEROGLYPH A267A"/* 1452E */,/*41254*/"ANATOLIAN HIEROGLYPH A268"/* 1452F */, /*41255*/"ANATOLIAN HIEROGLYPH A269"/* 14530 */,/*41256*/"ANATOLIAN HIEROGLYPH A270"/* 14531 */, /*41257*/"ANATOLIAN HIEROGLYPH A271"/* 14532 */,/*41258*/"ANATOLIAN HIEROGLYPH A272"/* 14533 */, /*41259*/"ANATOLIAN HIEROGLYPH A273"/* 14534 */,/*41260*/"ANATOLIAN HIEROGLYPH A274"/* 14535 */, /*41261*/"ANATOLIAN HIEROGLYPH A275"/* 14536 */,/*41262*/"ANATOLIAN HIEROGLYPH A276"/* 14537 */, /*41263*/"ANATOLIAN HIEROGLYPH A277"/* 14538 */,/*41264*/"ANATOLIAN HIEROGLYPH A278"/* 14539 */, /*41265*/"ANATOLIAN HIEROGLYPH A279"/* 1453A */,/*41266*/"ANATOLIAN HIEROGLYPH A280"/* 1453B */, /*41267*/"ANATOLIAN HIEROGLYPH A281"/* 1453C */,/*41268*/"ANATOLIAN HIEROGLYPH A282"/* 1453D */, /*41269*/"ANATOLIAN HIEROGLYPH A283"/* 1453E */,/*41270*/"ANATOLIAN HIEROGLYPH A284"/* 1453F */, /*41271*/"ANATOLIAN HIEROGLYPH A285"/* 14540 */,/*41272*/"ANATOLIAN HIEROGLYPH A286"/* 14541 */, /*41273*/"ANATOLIAN HIEROGLYPH A287"/* 14542 */,/*41274*/"ANATOLIAN HIEROGLYPH A288"/* 14543 */, /*41275*/"ANATOLIAN HIEROGLYPH A289"/* 14544 */,/*41276*/"ANATOLIAN HIEROGLYPH A289A"/* 14545 */, /*41277*/"ANATOLIAN HIEROGLYPH A290"/* 14546 */,/*41278*/"ANATOLIAN HIEROGLYPH A291"/* 14547 */, /*41279*/"ANATOLIAN HIEROGLYPH A292"/* 14548 */,/*41280*/"ANATOLIAN HIEROGLYPH A293"/* 14549 */, /*41281*/"ANATOLIAN HIEROGLYPH A294"/* 1454A */,/*41282*/"ANATOLIAN HIEROGLYPH A294A"/* 1454B */, /*41283*/"ANATOLIAN HIEROGLYPH A295"/* 1454C */,/*41284*/"ANATOLIAN HIEROGLYPH A296"/* 1454D */, /*41285*/"ANATOLIAN HIEROGLYPH A297"/* 1454E */,/*41286*/"ANATOLIAN HIEROGLYPH A298"/* 1454F */, /*41287*/"ANATOLIAN HIEROGLYPH A299"/* 14550 */,/*41288*/"ANATOLIAN HIEROGLYPH A299A"/* 14551 */, /*41289*/"ANATOLIAN HIEROGLYPH A300"/* 14552 */,/*41290*/"ANATOLIAN HIEROGLYPH A301"/* 14553 */, /*41291*/"ANATOLIAN HIEROGLYPH A302"/* 14554 */,/*41292*/"ANATOLIAN HIEROGLYPH A303"/* 14555 */, /*41293*/"ANATOLIAN HIEROGLYPH A304"/* 14556 */,/*41294*/"ANATOLIAN HIEROGLYPH A305"/* 14557 */, /*41295*/"ANATOLIAN HIEROGLYPH A306"/* 14558 */,/*41296*/"ANATOLIAN HIEROGLYPH A307"/* 14559 */, /*41297*/"ANATOLIAN HIEROGLYPH A308"/* 1455A */,/*41298*/"ANATOLIAN HIEROGLYPH A309"/* 1455B */, /*41299*/"ANATOLIAN HIEROGLYPH A309A"/* 1455C */,/*41300*/"ANATOLIAN HIEROGLYPH A310"/* 1455D */, /*41301*/"ANATOLIAN HIEROGLYPH A311"/* 1455E */,/*41302*/"ANATOLIAN HIEROGLYPH A312"/* 1455F */, /*41303*/"ANATOLIAN HIEROGLYPH A313"/* 14560 */,/*41304*/"ANATOLIAN HIEROGLYPH A314"/* 14561 */, /*41305*/"ANATOLIAN HIEROGLYPH A315"/* 14562 */,/*41306*/"ANATOLIAN HIEROGLYPH A316"/* 14563 */, /*41307*/"ANATOLIAN HIEROGLYPH A317"/* 14564 */,/*41308*/"ANATOLIAN HIEROGLYPH A318"/* 14565 */, /*41309*/"ANATOLIAN HIEROGLYPH A319"/* 14566 */,/*41310*/"ANATOLIAN HIEROGLYPH A320"/* 14567 */, /*41311*/"ANATOLIAN HIEROGLYPH A321"/* 14568 */,/*41312*/"ANATOLIAN HIEROGLYPH A322"/* 14569 */, /*41313*/"ANATOLIAN HIEROGLYPH A323"/* 1456A */,/*41314*/"ANATOLIAN HIEROGLYPH A324"/* 1456B */, /*41315*/"ANATOLIAN HIEROGLYPH A325"/* 1456C */,/*41316*/"ANATOLIAN HIEROGLYPH A326"/* 1456D */, /*41317*/"ANATOLIAN HIEROGLYPH A327"/* 1456E */,/*41318*/"ANATOLIAN HIEROGLYPH A328"/* 1456F */, /*41319*/"ANATOLIAN HIEROGLYPH A329"/* 14570 */,/*41320*/"ANATOLIAN HIEROGLYPH A329A"/* 14571 */, /*41321*/"ANATOLIAN HIEROGLYPH A330"/* 14572 */,/*41322*/"ANATOLIAN HIEROGLYPH A331"/* 14573 */, /*41323*/"ANATOLIAN HIEROGLYPH A332A"/* 14574 */,/*41324*/"ANATOLIAN HIEROGLYPH A332B"/* 14575 */, /*41325*/"ANATOLIAN HIEROGLYPH A332C"/* 14576 */,/*41326*/"ANATOLIAN HIEROGLYPH A333"/* 14577 */, /*41327*/"ANATOLIAN HIEROGLYPH A334"/* 14578 */,/*41328*/"ANATOLIAN HIEROGLYPH A335"/* 14579 */, /*41329*/"ANATOLIAN HIEROGLYPH A336"/* 1457A */,/*41330*/"ANATOLIAN HIEROGLYPH A336A"/* 1457B */, /*41331*/"ANATOLIAN HIEROGLYPH A336B"/* 1457C */,/*41332*/"ANATOLIAN HIEROGLYPH A336C"/* 1457D */, /*41333*/"ANATOLIAN HIEROGLYPH A337"/* 1457E */,/*41334*/"ANATOLIAN HIEROGLYPH A338"/* 1457F */, /*41335*/"ANATOLIAN HIEROGLYPH A339"/* 14580 */,/*41336*/"ANATOLIAN HIEROGLYPH A340"/* 14581 */, /*41337*/"ANATOLIAN HIEROGLYPH A341"/* 14582 */,/*41338*/"ANATOLIAN HIEROGLYPH A342"/* 14583 */, /*41339*/"ANATOLIAN HIEROGLYPH A343"/* 14584 */,/*41340*/"ANATOLIAN HIEROGLYPH A344"/* 14585 */, /*41341*/"ANATOLIAN HIEROGLYPH A345"/* 14586 */,/*41342*/"ANATOLIAN HIEROGLYPH A346"/* 14587 */, /*41343*/"ANATOLIAN HIEROGLYPH A347"/* 14588 */,/*41344*/"ANATOLIAN HIEROGLYPH A348"/* 14589 */, /*41345*/"ANATOLIAN HIEROGLYPH A349"/* 1458A */,/*41346*/"ANATOLIAN HIEROGLYPH A350"/* 1458B */, /*41347*/"ANATOLIAN HIEROGLYPH A351"/* 1458C */,/*41348*/"ANATOLIAN HIEROGLYPH A352"/* 1458D */, /*41349*/"ANATOLIAN HIEROGLYPH A353"/* 1458E */,/*41350*/"ANATOLIAN HIEROGLYPH A354"/* 1458F */, /*41351*/"ANATOLIAN HIEROGLYPH A355"/* 14590 */,/*41352*/"ANATOLIAN HIEROGLYPH A356"/* 14591 */, /*41353*/"ANATOLIAN HIEROGLYPH A357"/* 14592 */,/*41354*/"ANATOLIAN HIEROGLYPH A358"/* 14593 */, /*41355*/"ANATOLIAN HIEROGLYPH A359"/* 14594 */,/*41356*/"ANATOLIAN HIEROGLYPH A359A"/* 14595 */, /*41357*/"ANATOLIAN HIEROGLYPH A360"/* 14596 */,/*41358*/"ANATOLIAN HIEROGLYPH A361"/* 14597 */, /*41359*/"ANATOLIAN HIEROGLYPH A362"/* 14598 */,/*41360*/"ANATOLIAN HIEROGLYPH A363"/* 14599 */, /*41361*/"ANATOLIAN HIEROGLYPH A364"/* 1459A */,/*41362*/"ANATOLIAN HIEROGLYPH A364A"/* 1459B */, /*41363*/"ANATOLIAN HIEROGLYPH A365"/* 1459C */,/*41364*/"ANATOLIAN HIEROGLYPH A366"/* 1459D */, /*41365*/"ANATOLIAN HIEROGLYPH A367"/* 1459E */,/*41366*/"ANATOLIAN HIEROGLYPH A368"/* 1459F */, /*41367*/"ANATOLIAN HIEROGLYPH A368A"/* 145A0 */,/*41368*/"ANATOLIAN HIEROGLYPH A369"/* 145A1 */, /*41369*/"ANATOLIAN HIEROGLYPH A370"/* 145A2 */,/*41370*/"ANATOLIAN HIEROGLYPH A371"/* 145A3 */, /*41371*/"ANATOLIAN HIEROGLYPH A371A"/* 145A4 */,/*41372*/"ANATOLIAN HIEROGLYPH A372"/* 145A5 */, /*41373*/"ANATOLIAN HIEROGLYPH A373"/* 145A6 */,/*41374*/"ANATOLIAN HIEROGLYPH A374"/* 145A7 */, /*41375*/"ANATOLIAN HIEROGLYPH A375"/* 145A8 */,/*41376*/"ANATOLIAN HIEROGLYPH A376"/* 145A9 */, /*41377*/"ANATOLIAN HIEROGLYPH A377"/* 145AA */,/*41378*/"ANATOLIAN HIEROGLYPH A378"/* 145AB */, /*41379*/"ANATOLIAN HIEROGLYPH A379"/* 145AC */,/*41380*/"ANATOLIAN HIEROGLYPH A380"/* 145AD */, /*41381*/"ANATOLIAN HIEROGLYPH A381"/* 145AE */,/*41382*/"ANATOLIAN HIEROGLYPH A381A"/* 145AF */, /*41383*/"ANATOLIAN HIEROGLYPH A382"/* 145B0 */,/*41384*/"ANATOLIAN HIEROGLYPH A383 RA OR RI"/* 145B1 */, /*41385*/"ANATOLIAN HIEROGLYPH A383A"/* 145B2 */,/*41386*/"ANATOLIAN HIEROGLYPH A384"/* 145B3 */, /*41387*/"ANATOLIAN HIEROGLYPH A385"/* 145B4 */,/*41388*/"ANATOLIAN HIEROGLYPH A386"/* 145B5 */, /*41389*/"ANATOLIAN HIEROGLYPH A386A"/* 145B6 */,/*41390*/"ANATOLIAN HIEROGLYPH A387"/* 145B7 */, /*41391*/"ANATOLIAN HIEROGLYPH A388"/* 145B8 */,/*41392*/"ANATOLIAN HIEROGLYPH A389"/* 145B9 */, /*41393*/"ANATOLIAN HIEROGLYPH A390"/* 145BA */,/*41394*/"ANATOLIAN HIEROGLYPH A391"/* 145BB */, /*41395*/"ANATOLIAN HIEROGLYPH A392"/* 145BC */,/*41396*/"ANATOLIAN HIEROGLYPH A393 EIGHT"/* 145BD */, /*41397*/"ANATOLIAN HIEROGLYPH A394"/* 145BE */,/*41398*/"ANATOLIAN HIEROGLYPH A395"/* 145BF */, /*41399*/"ANATOLIAN HIEROGLYPH A396"/* 145C0 */,/*41400*/"ANATOLIAN HIEROGLYPH A397"/* 145C1 */, /*41401*/"ANATOLIAN HIEROGLYPH A398"/* 145C2 */,/*41402*/"ANATOLIAN HIEROGLYPH A399"/* 145C3 */, /*41403*/"ANATOLIAN HIEROGLYPH A400"/* 145C4 */,/*41404*/"ANATOLIAN HIEROGLYPH A401"/* 145C5 */, /*41405*/"ANATOLIAN HIEROGLYPH A402"/* 145C6 */,/*41406*/"ANATOLIAN HIEROGLYPH A403"/* 145C7 */, /*41407*/"ANATOLIAN HIEROGLYPH A404"/* 145C8 */,/*41408*/"ANATOLIAN HIEROGLYPH A405"/* 145C9 */, /*41409*/"ANATOLIAN HIEROGLYPH A406"/* 145CA */,/*41410*/"ANATOLIAN HIEROGLYPH A407"/* 145CB */, /*41411*/"ANATOLIAN HIEROGLYPH A408"/* 145CC */,/*41412*/"ANATOLIAN HIEROGLYPH A409"/* 145CD */, /*41413*/"ANATOLIAN HIEROGLYPH A410 BEGIN LOGOGRAM MARK"/* 145CE */, /*41414*/"ANATOLIAN HIEROGLYPH A410A END LOGOGRAM MARK"/* 145CF */,/*41415*/"ANATOLIAN HIEROGLYPH A411"/* 145D0 */, /*41416*/"ANATOLIAN HIEROGLYPH A412"/* 145D1 */,/*41417*/"ANATOLIAN HIEROGLYPH A413"/* 145D2 */, /*41418*/"ANATOLIAN HIEROGLYPH A414"/* 145D3 */,/*41419*/"ANATOLIAN HIEROGLYPH A415"/* 145D4 */, /*41420*/"ANATOLIAN HIEROGLYPH A416"/* 145D5 */,/*41421*/"ANATOLIAN HIEROGLYPH A417"/* 145D6 */, /*41422*/"ANATOLIAN HIEROGLYPH A418"/* 145D7 */,/*41423*/"ANATOLIAN HIEROGLYPH A419"/* 145D8 */, /*41424*/"ANATOLIAN HIEROGLYPH A420"/* 145D9 */,/*41425*/"ANATOLIAN HIEROGLYPH A421"/* 145DA */, /*41426*/"ANATOLIAN HIEROGLYPH A422"/* 145DB */,/*41427*/"ANATOLIAN HIEROGLYPH A423"/* 145DC */, /*41428*/"ANATOLIAN HIEROGLYPH A424"/* 145DD */,/*41429*/"ANATOLIAN HIEROGLYPH A425"/* 145DE */, /*41430*/"ANATOLIAN HIEROGLYPH A426"/* 145DF */,/*41431*/"ANATOLIAN HIEROGLYPH A427"/* 145E0 */, /*41432*/"ANATOLIAN HIEROGLYPH A428"/* 145E1 */,/*41433*/"ANATOLIAN HIEROGLYPH A429"/* 145E2 */, /*41434*/"ANATOLIAN HIEROGLYPH A430"/* 145E3 */,/*41435*/"ANATOLIAN HIEROGLYPH A431"/* 145E4 */, /*41436*/"ANATOLIAN HIEROGLYPH A432"/* 145E5 */,/*41437*/"ANATOLIAN HIEROGLYPH A433"/* 145E6 */, /*41438*/"ANATOLIAN HIEROGLYPH A434"/* 145E7 */,/*41439*/"ANATOLIAN HIEROGLYPH A435"/* 145E8 */, /*41440*/"ANATOLIAN HIEROGLYPH A436"/* 145E9 */,/*41441*/"ANATOLIAN HIEROGLYPH A437"/* 145EA */, /*41442*/"ANATOLIAN HIEROGLYPH A438"/* 145EB */,/*41443*/"ANATOLIAN HIEROGLYPH A439"/* 145EC */, /*41444*/"ANATOLIAN HIEROGLYPH A440"/* 145ED */,/*41445*/"ANATOLIAN HIEROGLYPH A441"/* 145EE */, /*41446*/"ANATOLIAN HIEROGLYPH A442"/* 145EF */,/*41447*/"ANATOLIAN HIEROGLYPH A443"/* 145F0 */, /*41448*/"ANATOLIAN HIEROGLYPH A444"/* 145F1 */,/*41449*/"ANATOLIAN HIEROGLYPH A445"/* 145F2 */, /*41450*/"ANATOLIAN HIEROGLYPH A446"/* 145F3 */,/*41451*/"ANATOLIAN HIEROGLYPH A447"/* 145F4 */, /*41452*/"ANATOLIAN HIEROGLYPH A448"/* 145F5 */,/*41453*/"ANATOLIAN HIEROGLYPH A449"/* 145F6 */, /*41454*/"ANATOLIAN HIEROGLYPH A450"/* 145F7 */,/*41455*/"ANATOLIAN HIEROGLYPH A450A"/* 145F8 */, /*41456*/"ANATOLIAN HIEROGLYPH A451"/* 145F9 */,/*41457*/"ANATOLIAN HIEROGLYPH A452"/* 145FA */, /*41458*/"ANATOLIAN HIEROGLYPH A453"/* 145FB */,/*41459*/"ANATOLIAN HIEROGLYPH A454"/* 145FC */, /*41460*/"ANATOLIAN HIEROGLYPH A455"/* 145FD */,/*41461*/"ANATOLIAN HIEROGLYPH A456"/* 145FE */, /*41462*/"ANATOLIAN HIEROGLYPH A457"/* 145FF */,/*41463*/"ANATOLIAN HIEROGLYPH A457A"/* 14600 */, /*41464*/"ANATOLIAN HIEROGLYPH A458"/* 14601 */,/*41465*/"ANATOLIAN HIEROGLYPH A459"/* 14602 */, /*41466*/"ANATOLIAN HIEROGLYPH A460"/* 14603 */,/*41467*/"ANATOLIAN HIEROGLYPH A461"/* 14604 */, /*41468*/"ANATOLIAN HIEROGLYPH A462"/* 14605 */,/*41469*/"ANATOLIAN HIEROGLYPH A463"/* 14606 */, /*41470*/"ANATOLIAN HIEROGLYPH A464"/* 14607 */,/*41471*/"ANATOLIAN HIEROGLYPH A465"/* 14608 */, /*41472*/"ANATOLIAN HIEROGLYPH A466"/* 14609 */,/*41473*/"ANATOLIAN HIEROGLYPH A467"/* 1460A */, /*41474*/"ANATOLIAN HIEROGLYPH A468"/* 1460B */,/*41475*/"ANATOLIAN HIEROGLYPH A469"/* 1460C */, /*41476*/"ANATOLIAN HIEROGLYPH A470"/* 1460D */,/*41477*/"ANATOLIAN HIEROGLYPH A471"/* 1460E */, /*41478*/"ANATOLIAN HIEROGLYPH A472"/* 1460F */,/*41479*/"ANATOLIAN HIEROGLYPH A473"/* 14610 */, /*41480*/"ANATOLIAN HIEROGLYPH A474"/* 14611 */,/*41481*/"ANATOLIAN HIEROGLYPH A475"/* 14612 */, /*41482*/"ANATOLIAN HIEROGLYPH A476"/* 14613 */,/*41483*/"ANATOLIAN HIEROGLYPH A477"/* 14614 */, /*41484*/"ANATOLIAN HIEROGLYPH A478"/* 14615 */,/*41485*/"ANATOLIAN HIEROGLYPH A479"/* 14616 */, /*41486*/"ANATOLIAN HIEROGLYPH A480"/* 14617 */,/*41487*/"ANATOLIAN HIEROGLYPH A481"/* 14618 */, /*41488*/"ANATOLIAN HIEROGLYPH A482"/* 14619 */,/*41489*/"ANATOLIAN HIEROGLYPH A483"/* 1461A */, /*41490*/"ANATOLIAN HIEROGLYPH A484"/* 1461B */,/*41491*/"ANATOLIAN HIEROGLYPH A485"/* 1461C */, /*41492*/"ANATOLIAN HIEROGLYPH A486"/* 1461D */,/*41493*/"ANATOLIAN HIEROGLYPH A487"/* 1461E */, /*41494*/"ANATOLIAN HIEROGLYPH A488"/* 1461F */,/*41495*/"ANATOLIAN HIEROGLYPH A489"/* 14620 */, /*41496*/"ANATOLIAN HIEROGLYPH A490"/* 14621 */,/*41497*/"ANATOLIAN HIEROGLYPH A491"/* 14622 */, /*41498*/"ANATOLIAN HIEROGLYPH A492"/* 14623 */,/*41499*/"ANATOLIAN HIEROGLYPH A493"/* 14624 */, /*41500*/"ANATOLIAN HIEROGLYPH A494"/* 14625 */,/*41501*/"ANATOLIAN HIEROGLYPH A495"/* 14626 */, /*41502*/"ANATOLIAN HIEROGLYPH A496"/* 14627 */,/*41503*/"ANATOLIAN HIEROGLYPH A497"/* 14628 */, /*41504*/"ANATOLIAN HIEROGLYPH A501"/* 14629 */,/*41505*/"ANATOLIAN HIEROGLYPH A502"/* 1462A */, /*41506*/"ANATOLIAN HIEROGLYPH A503"/* 1462B */,/*41507*/"ANATOLIAN HIEROGLYPH A504"/* 1462C */, /*41508*/"ANATOLIAN HIEROGLYPH A505"/* 1462D */,/*41509*/"ANATOLIAN HIEROGLYPH A506"/* 1462E */, /*41510*/"ANATOLIAN HIEROGLYPH A507"/* 1462F */,/*41511*/"ANATOLIAN HIEROGLYPH A508"/* 14630 */, /*41512*/"ANATOLIAN HIEROGLYPH A509"/* 14631 */,/*41513*/"ANATOLIAN HIEROGLYPH A510"/* 14632 */, /*41514*/"ANATOLIAN HIEROGLYPH A511"/* 14633 */,/*41515*/"ANATOLIAN HIEROGLYPH A512"/* 14634 */, /*41516*/"ANATOLIAN HIEROGLYPH A513"/* 14635 */,/*41517*/"ANATOLIAN HIEROGLYPH A514"/* 14636 */, /*41518*/"ANATOLIAN HIEROGLYPH A515"/* 14637 */,/*41519*/"ANATOLIAN HIEROGLYPH A516"/* 14638 */, /*41520*/"ANATOLIAN HIEROGLYPH A517"/* 14639 */,/*41521*/"ANATOLIAN HIEROGLYPH A518"/* 1463A */, /*41522*/"ANATOLIAN HIEROGLYPH A519"/* 1463B */,/*41523*/"ANATOLIAN HIEROGLYPH A520"/* 1463C */, /*41524*/"ANATOLIAN HIEROGLYPH A521"/* 1463D */,/*41525*/"ANATOLIAN HIEROGLYPH A522"/* 1463E */, /*41526*/"ANATOLIAN HIEROGLYPH A523"/* 1463F */,/*41527*/"ANATOLIAN HIEROGLYPH A524"/* 14640 */, /*41528*/"ANATOLIAN HIEROGLYPH A525"/* 14641 */,/*41529*/"ANATOLIAN HIEROGLYPH A526"/* 14642 */, /*41530*/"ANATOLIAN HIEROGLYPH A527"/* 14643 */,/*41531*/"ANATOLIAN HIEROGLYPH A528"/* 14644 */, /*41532*/"ANATOLIAN HIEROGLYPH A529"/* 14645 */,/*41533*/"ANATOLIAN HIEROGLYPH A530"/* 14646 */, /*41534*/"BAMUM LETTER PHASE-A NGKUE MFON"/* 16800 */,/*41535*/"BAMUM LETTER PHASE-A GBIEE FON"/* 16801 */, /*41536*/"BAMUM LETTER PHASE-A PON MFON PIPAEMGBIEE"/* 16802 */, /*41537*/"BAMUM LETTER PHASE-A PON MFON PIPAEMBA"/* 16803 */,/*41538*/"BAMUM LETTER PHASE-A NAA MFON"/* 16804 */, /*41539*/"BAMUM LETTER PHASE-A SHUENSHUET"/* 16805 */,/*41540*/"BAMUM LETTER PHASE-A TITA MFON"/* 16806 */, /*41541*/"BAMUM LETTER PHASE-A NZA MFON"/* 16807 */,/*41542*/"BAMUM LETTER PHASE-A SHINDA PA NJI"/* 16808 */, /*41543*/"BAMUM LETTER PHASE-A PON PA NJI PIPAEMGBIEE"/* 16809 */, /*41544*/"BAMUM LETTER PHASE-A PON PA NJI PIPAEMBA"/* 1680A */,/*41545*/"BAMUM LETTER PHASE-A MAEMBGBIEE"/* 1680B */, /*41546*/"BAMUM LETTER PHASE-A TU MAEMBA"/* 1680C */,/*41547*/"BAMUM LETTER PHASE-A NGANGU"/* 1680D */, /*41548*/"BAMUM LETTER PHASE-A MAEMVEUX"/* 1680E */,/*41549*/"BAMUM LETTER PHASE-A MANSUAE"/* 1680F */, /*41550*/"BAMUM LETTER PHASE-A MVEUAENGAM"/* 16810 */,/*41551*/"BAMUM LETTER PHASE-A SEUNYAM"/* 16811 */, /*41552*/"BAMUM LETTER PHASE-A NTOQPEN"/* 16812 */,/*41553*/"BAMUM LETTER PHASE-A KEUKEUTNDA"/* 16813 */, /*41554*/"BAMUM LETTER PHASE-A NKINDI"/* 16814 */,/*41555*/"BAMUM LETTER PHASE-A SUU"/* 16815 */, /*41556*/"BAMUM LETTER PHASE-A NGKUENZEUM"/* 16816 */,/*41557*/"BAMUM LETTER PHASE-A LAPAQ"/* 16817 */, /*41558*/"BAMUM LETTER PHASE-A LET KUT"/* 16818 */,/*41559*/"BAMUM LETTER PHASE-A NTAP MFAA"/* 16819 */, /*41560*/"BAMUM LETTER PHASE-A MAEKEUP"/* 1681A */,/*41561*/"BAMUM LETTER PHASE-A PASHAE"/* 1681B */, /*41562*/"BAMUM LETTER PHASE-A GHEUAERAE"/* 1681C */,/*41563*/"BAMUM LETTER PHASE-A PAMSHAE"/* 1681D */, /*41564*/"BAMUM LETTER PHASE-A MON NGGEUAET"/* 1681E */,/*41565*/"BAMUM LETTER PHASE-A NZUN MEUT"/* 1681F */, /*41566*/"BAMUM LETTER PHASE-A U YUQ NAE"/* 16820 */,/*41567*/"BAMUM LETTER PHASE-A GHEUAEGHEUAE"/* 16821 */, /*41568*/"BAMUM LETTER PHASE-A NTAP NTAA"/* 16822 */,/*41569*/"BAMUM LETTER PHASE-A SISA"/* 16823 */, /*41570*/"BAMUM LETTER PHASE-A MGBASA"/* 16824 */,/*41571*/"BAMUM LETTER PHASE-A MEUNJOMNDEUQ"/* 16825 */, /*41572*/"BAMUM LETTER PHASE-A MOOMPUQ"/* 16826 */,/*41573*/"BAMUM LETTER PHASE-A KAFA"/* 16827 */, /*41574*/"BAMUM LETTER PHASE-A PA LEERAEWA"/* 16828 */,/*41575*/"BAMUM LETTER PHASE-A NDA LEERAEWA"/* 16829 */, /*41576*/"BAMUM LETTER PHASE-A PET"/* 1682A */,/*41577*/"BAMUM LETTER PHASE-A MAEMKPEN"/* 1682B */, /*41578*/"BAMUM LETTER PHASE-A NIKA"/* 1682C */,/*41579*/"BAMUM LETTER PHASE-A PUP"/* 1682D */, /*41580*/"BAMUM LETTER PHASE-A TUAEP"/* 1682E */,/*41581*/"BAMUM LETTER PHASE-A LUAEP"/* 1682F */, /*41582*/"BAMUM LETTER PHASE-A SONJAM"/* 16830 */,/*41583*/"BAMUM LETTER PHASE-A TEUTEUWEN"/* 16831 */, /*41584*/"BAMUM LETTER PHASE-A MAENYI"/* 16832 */,/*41585*/"BAMUM LETTER PHASE-A KET"/* 16833 */, /*41586*/"BAMUM LETTER PHASE-A NDAANGGEUAET"/* 16834 */,/*41587*/"BAMUM LETTER PHASE-A KUOQ"/* 16835 */, /*41588*/"BAMUM LETTER PHASE-A MOOMEUT"/* 16836 */,/*41589*/"BAMUM LETTER PHASE-A SHUM"/* 16837 */, /*41590*/"BAMUM LETTER PHASE-A LOMMAE"/* 16838 */,/*41591*/"BAMUM LETTER PHASE-A FIRI"/* 16839 */, /*41592*/"BAMUM LETTER PHASE-A ROM"/* 1683A */,/*41593*/"BAMUM LETTER PHASE-A KPOQ"/* 1683B */, /*41594*/"BAMUM LETTER PHASE-A SOQ"/* 1683C */,/*41595*/"BAMUM LETTER PHASE-A MAP PIEET"/* 1683D */, /*41596*/"BAMUM LETTER PHASE-A SHIRAE"/* 1683E */,/*41597*/"BAMUM LETTER PHASE-A NTAP"/* 1683F */, /*41598*/"BAMUM LETTER PHASE-A SHOQ NSHUT YUM"/* 16840 */,/*41599*/"BAMUM LETTER PHASE-A NYIT MONGKEUAEQ"/* 16841 */, /*41600*/"BAMUM LETTER PHASE-A PAARAE"/* 16842 */,/*41601*/"BAMUM LETTER PHASE-A NKAARAE"/* 16843 */, /*41602*/"BAMUM LETTER PHASE-A UNKNOWN"/* 16844 */,/*41603*/"BAMUM LETTER PHASE-A NGGEN"/* 16845 */, /*41604*/"BAMUM LETTER PHASE-A MAESI"/* 16846 */,/*41605*/"BAMUM LETTER PHASE-A NJAM"/* 16847 */, /*41606*/"BAMUM LETTER PHASE-A MBANYI"/* 16848 */,/*41607*/"BAMUM LETTER PHASE-A NYET"/* 16849 */, /*41608*/"BAMUM LETTER PHASE-A TEUAEN"/* 1684A */,/*41609*/"BAMUM LETTER PHASE-A SOT"/* 1684B */, /*41610*/"BAMUM LETTER PHASE-A PAAM"/* 1684C */,/*41611*/"BAMUM LETTER PHASE-A NSHIEE"/* 1684D */, /*41612*/"BAMUM LETTER PHASE-A MAEM"/* 1684E */,/*41613*/"BAMUM LETTER PHASE-A NYI"/* 1684F */, /*41614*/"BAMUM LETTER PHASE-A KAQ"/* 16850 */,/*41615*/"BAMUM LETTER PHASE-A NSHA"/* 16851 */, /*41616*/"BAMUM LETTER PHASE-A VEE"/* 16852 */,/*41617*/"BAMUM LETTER PHASE-A LU"/* 16853 */, /*41618*/"BAMUM LETTER PHASE-A NEN"/* 16854 */,/*41619*/"BAMUM LETTER PHASE-A NAQ"/* 16855 */, /*41620*/"BAMUM LETTER PHASE-A MBAQ"/* 16856 */,/*41621*/"BAMUM LETTER PHASE-B NSHUET"/* 16857 */, /*41622*/"BAMUM LETTER PHASE-B TU MAEMGBIEE"/* 16858 */,/*41623*/"BAMUM LETTER PHASE-B SIEE"/* 16859 */, /*41624*/"BAMUM LETTER PHASE-B SET TU"/* 1685A */,/*41625*/"BAMUM LETTER PHASE-B LOM NTEUM"/* 1685B */, /*41626*/"BAMUM LETTER PHASE-B MBA MAELEE"/* 1685C */,/*41627*/"BAMUM LETTER PHASE-B KIEEM"/* 1685D */, /*41628*/"BAMUM LETTER PHASE-B YEURAE"/* 1685E */,/*41629*/"BAMUM LETTER PHASE-B MBAARAE"/* 1685F */, /*41630*/"BAMUM LETTER PHASE-B KAM"/* 16860 */,/*41631*/"BAMUM LETTER PHASE-B PEESHI"/* 16861 */, /*41632*/"BAMUM LETTER PHASE-B YAFU LEERAEWA"/* 16862 */,/*41633*/"BAMUM LETTER PHASE-B LAM NSHUT NYAM"/* 16863 */, /*41634*/"BAMUM LETTER PHASE-B NTIEE SHEUOQ"/* 16864 */,/*41635*/"BAMUM LETTER PHASE-B NDU NJAA"/* 16865 */, /*41636*/"BAMUM LETTER PHASE-B GHEUGHEUAEM"/* 16866 */,/*41637*/"BAMUM LETTER PHASE-B PIT"/* 16867 */, /*41638*/"BAMUM LETTER PHASE-B TU NSIEE"/* 16868 */,/*41639*/"BAMUM LETTER PHASE-B SHET NJAQ"/* 16869 */, /*41640*/"BAMUM LETTER PHASE-B SHEUAEQTU"/* 1686A */,/*41641*/"BAMUM LETTER PHASE-B MFON TEUAEQ"/* 1686B */, /*41642*/"BAMUM LETTER PHASE-B MBIT MBAAKET"/* 1686C */,/*41643*/"BAMUM LETTER PHASE-B NYI NTEUM"/* 1686D */, /*41644*/"BAMUM LETTER PHASE-B KEUPUQ"/* 1686E */,/*41645*/"BAMUM LETTER PHASE-B GHEUGHEN"/* 1686F */, /*41646*/"BAMUM LETTER PHASE-B KEUYEUX"/* 16870 */,/*41647*/"BAMUM LETTER PHASE-B LAANAE"/* 16871 */, /*41648*/"BAMUM LETTER PHASE-B PARUM"/* 16872 */,/*41649*/"BAMUM LETTER PHASE-B VEUM"/* 16873 */, /*41650*/"BAMUM LETTER PHASE-B NGKINDI MVOP"/* 16874 */,/*41651*/"BAMUM LETTER PHASE-B NGGEU MBU"/* 16875 */, /*41652*/"BAMUM LETTER PHASE-B WUAET"/* 16876 */,/*41653*/"BAMUM LETTER PHASE-B SAKEUAE"/* 16877 */, /*41654*/"BAMUM LETTER PHASE-B TAAM"/* 16878 */,/*41655*/"BAMUM LETTER PHASE-B MEUQ"/* 16879 */, /*41656*/"BAMUM LETTER PHASE-B NGGUOQ"/* 1687A */,/*41657*/"BAMUM LETTER PHASE-B NGGUOQ LARGE"/* 1687B */, /*41658*/"BAMUM LETTER PHASE-B MFIYAQ"/* 1687C */,/*41659*/"BAMUM LETTER PHASE-B SUE"/* 1687D */, /*41660*/"BAMUM LETTER PHASE-B MBEURI"/* 1687E */,/*41661*/"BAMUM LETTER PHASE-B MONTIEEN"/* 1687F */, /*41662*/"BAMUM LETTER PHASE-B NYAEMAE"/* 16880 */,/*41663*/"BAMUM LETTER PHASE-B PUNGAAM"/* 16881 */, /*41664*/"BAMUM LETTER PHASE-B MEUT NGGEET"/* 16882 */,/*41665*/"BAMUM LETTER PHASE-B FEUX"/* 16883 */, /*41666*/"BAMUM LETTER PHASE-B MBUOQ"/* 16884 */,/*41667*/"BAMUM LETTER PHASE-B FEE"/* 16885 */, /*41668*/"BAMUM LETTER PHASE-B KEUAEM"/* 16886 */,/*41669*/"BAMUM LETTER PHASE-B MA NJEUAENA"/* 16887 */, /*41670*/"BAMUM LETTER PHASE-B MA NJUQA"/* 16888 */,/*41671*/"BAMUM LETTER PHASE-B LET"/* 16889 */, /*41672*/"BAMUM LETTER PHASE-B NGGAAM"/* 1688A */,/*41673*/"BAMUM LETTER PHASE-B NSEN"/* 1688B */, /*41674*/"BAMUM LETTER PHASE-B MA"/* 1688C */,/*41675*/"BAMUM LETTER PHASE-B KIQ"/* 1688D */, /*41676*/"BAMUM LETTER PHASE-B NGOM"/* 1688E */,/*41677*/"BAMUM LETTER PHASE-C NGKUE MAEMBA"/* 1688F */, /*41678*/"BAMUM LETTER PHASE-C NZA"/* 16890 */,/*41679*/"BAMUM LETTER PHASE-C YUM"/* 16891 */, /*41680*/"BAMUM LETTER PHASE-C WANGKUOQ"/* 16892 */,/*41681*/"BAMUM LETTER PHASE-C NGGEN"/* 16893 */, /*41682*/"BAMUM LETTER PHASE-C NDEUAEREE"/* 16894 */,/*41683*/"BAMUM LETTER PHASE-C NGKAQ"/* 16895 */, /*41684*/"BAMUM LETTER PHASE-C GHARAE"/* 16896 */,/*41685*/"BAMUM LETTER PHASE-C MBEEKEET"/* 16897 */, /*41686*/"BAMUM LETTER PHASE-C GBAYI"/* 16898 */,/*41687*/"BAMUM LETTER PHASE-C NYIR MKPARAQ MEUN"/* 16899 */, /*41688*/"BAMUM LETTER PHASE-C NTU MBIT"/* 1689A */,/*41689*/"BAMUM LETTER PHASE-C MBEUM"/* 1689B */, /*41690*/"BAMUM LETTER PHASE-C PIRIEEN"/* 1689C */,/*41691*/"BAMUM LETTER PHASE-C NDOMBU"/* 1689D */, /*41692*/"BAMUM LETTER PHASE-C MBAA CABBAGE-TREE"/* 1689E */,/*41693*/"BAMUM LETTER PHASE-C KEUSHEUAEP"/* 1689F */, /*41694*/"BAMUM LETTER PHASE-C GHAP"/* 168A0 */,/*41695*/"BAMUM LETTER PHASE-C KEUKAQ"/* 168A1 */, /*41696*/"BAMUM LETTER PHASE-C YU MUOMAE"/* 168A2 */,/*41697*/"BAMUM LETTER PHASE-C NZEUM"/* 168A3 */, /*41698*/"BAMUM LETTER PHASE-C MBUE"/* 168A4 */,/*41699*/"BAMUM LETTER PHASE-C NSEUAEN"/* 168A5 */, /*41700*/"BAMUM LETTER PHASE-C MBIT"/* 168A6 */,/*41701*/"BAMUM LETTER PHASE-C YEUQ"/* 168A7 */, /*41702*/"BAMUM LETTER PHASE-C KPARAQ"/* 168A8 */,/*41703*/"BAMUM LETTER PHASE-C KAA"/* 168A9 */, /*41704*/"BAMUM LETTER PHASE-C SEUX"/* 168AA */,/*41705*/"BAMUM LETTER PHASE-C NDIDA"/* 168AB */, /*41706*/"BAMUM LETTER PHASE-C TAASHAE"/* 168AC */,/*41707*/"BAMUM LETTER PHASE-C NJUEQ"/* 168AD */, /*41708*/"BAMUM LETTER PHASE-C TITA YUE"/* 168AE */,/*41709*/"BAMUM LETTER PHASE-C SUAET"/* 168AF */, /*41710*/"BAMUM LETTER PHASE-C NGGUAEN NYAM"/* 168B0 */,/*41711*/"BAMUM LETTER PHASE-C VEUX"/* 168B1 */, /*41712*/"BAMUM LETTER PHASE-C NANSANAQ"/* 168B2 */,/*41713*/"BAMUM LETTER PHASE-C MA KEUAERI"/* 168B3 */, /*41714*/"BAMUM LETTER PHASE-C NTAA"/* 168B4 */,/*41715*/"BAMUM LETTER PHASE-C NGGUON"/* 168B5 */, /*41716*/"BAMUM LETTER PHASE-C LAP"/* 168B6 */,/*41717*/"BAMUM LETTER PHASE-C MBIRIEEN"/* 168B7 */, /*41718*/"BAMUM LETTER PHASE-C MGBASAQ"/* 168B8 */,/*41719*/"BAMUM LETTER PHASE-C NTEUNGBA"/* 168B9 */, /*41720*/"BAMUM LETTER PHASE-C TEUTEUX"/* 168BA */,/*41721*/"BAMUM LETTER PHASE-C NGGUM"/* 168BB */, /*41722*/"BAMUM LETTER PHASE-C FUE"/* 168BC */,/*41723*/"BAMUM LETTER PHASE-C NDEUT"/* 168BD */, /*41724*/"BAMUM LETTER PHASE-C NSA"/* 168BE */,/*41725*/"BAMUM LETTER PHASE-C NSHAQ"/* 168BF */, /*41726*/"BAMUM LETTER PHASE-C BUNG"/* 168C0 */,/*41727*/"BAMUM LETTER PHASE-C VEUAEPEN"/* 168C1 */, /*41728*/"BAMUM LETTER PHASE-C MBERAE"/* 168C2 */,/*41729*/"BAMUM LETTER PHASE-C RU"/* 168C3 */, /*41730*/"BAMUM LETTER PHASE-C NJAEM"/* 168C4 */,/*41731*/"BAMUM LETTER PHASE-C LAM"/* 168C5 */, /*41732*/"BAMUM LETTER PHASE-C TITUAEP"/* 168C6 */,/*41733*/"BAMUM LETTER PHASE-C NSUOT NGOM"/* 168C7 */, /*41734*/"BAMUM LETTER PHASE-C NJEEEE"/* 168C8 */,/*41735*/"BAMUM LETTER PHASE-C KET"/* 168C9 */, /*41736*/"BAMUM LETTER PHASE-C NGGU"/* 168CA */,/*41737*/"BAMUM LETTER PHASE-C MAESI"/* 168CB */, /*41738*/"BAMUM LETTER PHASE-C MBUAEM"/* 168CC */,/*41739*/"BAMUM LETTER PHASE-C LU"/* 168CD */, /*41740*/"BAMUM LETTER PHASE-C KUT"/* 168CE */,/*41741*/"BAMUM LETTER PHASE-C NJAM"/* 168CF */, /*41742*/"BAMUM LETTER PHASE-C NGOM"/* 168D0 */,/*41743*/"BAMUM LETTER PHASE-C WUP"/* 168D1 */, /*41744*/"BAMUM LETTER PHASE-C NGGUEET"/* 168D2 */,/*41745*/"BAMUM LETTER PHASE-C NSOM"/* 168D3 */, /*41746*/"BAMUM LETTER PHASE-C NTEN"/* 168D4 */,/*41747*/"BAMUM LETTER PHASE-C KUOP NKAARAE"/* 168D5 */, /*41748*/"BAMUM LETTER PHASE-C NSUN"/* 168D6 */,/*41749*/"BAMUM LETTER PHASE-C NDAM"/* 168D7 */, /*41750*/"BAMUM LETTER PHASE-C MA NSIEE"/* 168D8 */,/*41751*/"BAMUM LETTER PHASE-C YAA"/* 168D9 */, /*41752*/"BAMUM LETTER PHASE-C NDAP"/* 168DA */,/*41753*/"BAMUM LETTER PHASE-C SHUEQ"/* 168DB */, /*41754*/"BAMUM LETTER PHASE-C SETFON"/* 168DC */,/*41755*/"BAMUM LETTER PHASE-C MBI"/* 168DD */, /*41756*/"BAMUM LETTER PHASE-C MAEMBA"/* 168DE */,/*41757*/"BAMUM LETTER PHASE-C MBANYI"/* 168DF */, /*41758*/"BAMUM LETTER PHASE-C KEUSEUX"/* 168E0 */,/*41759*/"BAMUM LETTER PHASE-C MBEUX"/* 168E1 */, /*41760*/"BAMUM LETTER PHASE-C KEUM"/* 168E2 */,/*41761*/"BAMUM LETTER PHASE-C MBAA PICKET"/* 168E3 */, /*41762*/"BAMUM LETTER PHASE-C YUWOQ"/* 168E4 */,/*41763*/"BAMUM LETTER PHASE-C NJEUX"/* 168E5 */, /*41764*/"BAMUM LETTER PHASE-C MIEE"/* 168E6 */,/*41765*/"BAMUM LETTER PHASE-C MUAE"/* 168E7 */, /*41766*/"BAMUM LETTER PHASE-C SHIQ"/* 168E8 */,/*41767*/"BAMUM LETTER PHASE-C KEN LAW"/* 168E9 */, /*41768*/"BAMUM LETTER PHASE-C KEN FATIGUE"/* 168EA */,/*41769*/"BAMUM LETTER PHASE-C NGAQ"/* 168EB */, /*41770*/"BAMUM LETTER PHASE-C NAQ"/* 168EC */,/*41771*/"BAMUM LETTER PHASE-C LIQ"/* 168ED */, /*41772*/"BAMUM LETTER PHASE-C PIN"/* 168EE */,/*41773*/"BAMUM LETTER PHASE-C PEN"/* 168EF */, /*41774*/"BAMUM LETTER PHASE-C TET"/* 168F0 */,/*41775*/"BAMUM LETTER PHASE-D MBUO"/* 168F1 */, /*41776*/"BAMUM LETTER PHASE-D WAP"/* 168F2 */,/*41777*/"BAMUM LETTER PHASE-D NJI"/* 168F3 */, /*41778*/"BAMUM LETTER PHASE-D MFON"/* 168F4 */,/*41779*/"BAMUM LETTER PHASE-D NJIEE"/* 168F5 */, /*41780*/"BAMUM LETTER PHASE-D LIEE"/* 168F6 */,/*41781*/"BAMUM LETTER PHASE-D NJEUT"/* 168F7 */, /*41782*/"BAMUM LETTER PHASE-D NSHEE"/* 168F8 */,/*41783*/"BAMUM LETTER PHASE-D NGGAAMAE"/* 168F9 */, /*41784*/"BAMUM LETTER PHASE-D NYAM"/* 168FA */,/*41785*/"BAMUM LETTER PHASE-D WUAEN"/* 168FB */, /*41786*/"BAMUM LETTER PHASE-D NGKUN"/* 168FC */,/*41787*/"BAMUM LETTER PHASE-D SHEE"/* 168FD */, /*41788*/"BAMUM LETTER PHASE-D NGKAP"/* 168FE */,/*41789*/"BAMUM LETTER PHASE-D KEUAETMEUN"/* 168FF */, /*41790*/"BAMUM LETTER PHASE-D TEUT"/* 16900 */,/*41791*/"BAMUM LETTER PHASE-D SHEUAE"/* 16901 */, /*41792*/"BAMUM LETTER PHASE-D NJAP"/* 16902 */,/*41793*/"BAMUM LETTER PHASE-D SUE"/* 16903 */, /*41794*/"BAMUM LETTER PHASE-D KET"/* 16904 */,/*41795*/"BAMUM LETTER PHASE-D YAEMMAE"/* 16905 */, /*41796*/"BAMUM LETTER PHASE-D KUOM"/* 16906 */,/*41797*/"BAMUM LETTER PHASE-D SAP"/* 16907 */, /*41798*/"BAMUM LETTER PHASE-D MFEUT"/* 16908 */,/*41799*/"BAMUM LETTER PHASE-D NDEUX"/* 16909 */, /*41800*/"BAMUM LETTER PHASE-D MALEERI"/* 1690A */,/*41801*/"BAMUM LETTER PHASE-D MEUT"/* 1690B */, /*41802*/"BAMUM LETTER PHASE-D SEUAEQ"/* 1690C */,/*41803*/"BAMUM LETTER PHASE-D YEN"/* 1690D */, /*41804*/"BAMUM LETTER PHASE-D NJEUAEM"/* 1690E */,/*41805*/"BAMUM LETTER PHASE-D KEUOT MBUAE"/* 1690F */, /*41806*/"BAMUM LETTER PHASE-D NGKEURI"/* 16910 */,/*41807*/"BAMUM LETTER PHASE-D TU"/* 16911 */, /*41808*/"BAMUM LETTER PHASE-D GHAA"/* 16912 */,/*41809*/"BAMUM LETTER PHASE-D NGKYEE"/* 16913 */, /*41810*/"BAMUM LETTER PHASE-D FEUFEUAET"/* 16914 */,/*41811*/"BAMUM LETTER PHASE-D NDEE"/* 16915 */, /*41812*/"BAMUM LETTER PHASE-D MGBOFUM"/* 16916 */,/*41813*/"BAMUM LETTER PHASE-D LEUAEP"/* 16917 */, /*41814*/"BAMUM LETTER PHASE-D NDON"/* 16918 */,/*41815*/"BAMUM LETTER PHASE-D MONI"/* 16919 */, /*41816*/"BAMUM LETTER PHASE-D MGBEUN"/* 1691A */,/*41817*/"BAMUM LETTER PHASE-D PUUT"/* 1691B */, /*41818*/"BAMUM LETTER PHASE-D MGBIEE"/* 1691C */,/*41819*/"BAMUM LETTER PHASE-D MFO"/* 1691D */, /*41820*/"BAMUM LETTER PHASE-D LUM"/* 1691E */,/*41821*/"BAMUM LETTER PHASE-D NSIEEP"/* 1691F */, /*41822*/"BAMUM LETTER PHASE-D MBAA"/* 16920 */,/*41823*/"BAMUM LETTER PHASE-D KWAET"/* 16921 */, /*41824*/"BAMUM LETTER PHASE-D NYET"/* 16922 */,/*41825*/"BAMUM LETTER PHASE-D TEUAEN"/* 16923 */, /*41826*/"BAMUM LETTER PHASE-D SOT"/* 16924 */,/*41827*/"BAMUM LETTER PHASE-D YUWOQ"/* 16925 */, /*41828*/"BAMUM LETTER PHASE-D KEUM"/* 16926 */,/*41829*/"BAMUM LETTER PHASE-D RAEM"/* 16927 */, /*41830*/"BAMUM LETTER PHASE-D TEEEE"/* 16928 */,/*41831*/"BAMUM LETTER PHASE-D NGKEUAEQ"/* 16929 */, /*41832*/"BAMUM LETTER PHASE-D MFEUAE"/* 1692A */,/*41833*/"BAMUM LETTER PHASE-D NSIEET"/* 1692B */, /*41834*/"BAMUM LETTER PHASE-D KEUP"/* 1692C */,/*41835*/"BAMUM LETTER PHASE-D PIP"/* 1692D */, /*41836*/"BAMUM LETTER PHASE-D PEUTAE"/* 1692E */,/*41837*/"BAMUM LETTER PHASE-D NYUE"/* 1692F */, /*41838*/"BAMUM LETTER PHASE-D LET"/* 16930 */,/*41839*/"BAMUM LETTER PHASE-D NGGAAM"/* 16931 */, /*41840*/"BAMUM LETTER PHASE-D MFIEE"/* 16932 */,/*41841*/"BAMUM LETTER PHASE-D NGGWAEN"/* 16933 */, /*41842*/"BAMUM LETTER PHASE-D YUOM"/* 16934 */,/*41843*/"BAMUM LETTER PHASE-D PAP"/* 16935 */, /*41844*/"BAMUM LETTER PHASE-D YUOP"/* 16936 */,/*41845*/"BAMUM LETTER PHASE-D NDAM"/* 16937 */, /*41846*/"BAMUM LETTER PHASE-D NTEUM"/* 16938 */,/*41847*/"BAMUM LETTER PHASE-D SUAE"/* 16939 */, /*41848*/"BAMUM LETTER PHASE-D KUN"/* 1693A */,/*41849*/"BAMUM LETTER PHASE-D NGGEUX"/* 1693B */, /*41850*/"BAMUM LETTER PHASE-D NGKIEE"/* 1693C */,/*41851*/"BAMUM LETTER PHASE-D TUOT"/* 1693D */, /*41852*/"BAMUM LETTER PHASE-D MEUN"/* 1693E */,/*41853*/"BAMUM LETTER PHASE-D KUQ"/* 1693F */, /*41854*/"BAMUM LETTER PHASE-D NSUM"/* 16940 */,/*41855*/"BAMUM LETTER PHASE-D TEUN"/* 16941 */, /*41856*/"BAMUM LETTER PHASE-D MAENJET"/* 16942 */,/*41857*/"BAMUM LETTER PHASE-D NGGAP"/* 16943 */, /*41858*/"BAMUM LETTER PHASE-D LEUM"/* 16944 */,/*41859*/"BAMUM LETTER PHASE-D NGGUOM"/* 16945 */, /*41860*/"BAMUM LETTER PHASE-D NSHUT"/* 16946 */,/*41861*/"BAMUM LETTER PHASE-D NJUEQ"/* 16947 */, /*41862*/"BAMUM LETTER PHASE-D GHEUAE"/* 16948 */,/*41863*/"BAMUM LETTER PHASE-D KU"/* 16949 */, /*41864*/"BAMUM LETTER PHASE-D REN OLD"/* 1694A */,/*41865*/"BAMUM LETTER PHASE-D TAE"/* 1694B */, /*41866*/"BAMUM LETTER PHASE-D TOQ"/* 1694C */,/*41867*/"BAMUM LETTER PHASE-D NYI"/* 1694D */, /*41868*/"BAMUM LETTER PHASE-D RII"/* 1694E */,/*41869*/"BAMUM LETTER PHASE-D LEEEE"/* 1694F */, /*41870*/"BAMUM LETTER PHASE-D MEEEE"/* 16950 */,/*41871*/"BAMUM LETTER PHASE-D M"/* 16951 */, /*41872*/"BAMUM LETTER PHASE-D SUU"/* 16952 */,/*41873*/"BAMUM LETTER PHASE-D MU"/* 16953 */, /*41874*/"BAMUM LETTER PHASE-D SHII"/* 16954 */,/*41875*/"BAMUM LETTER PHASE-D SHEUX"/* 16955 */, /*41876*/"BAMUM LETTER PHASE-D KYEE"/* 16956 */,/*41877*/"BAMUM LETTER PHASE-D NU"/* 16957 */, /*41878*/"BAMUM LETTER PHASE-D SHU"/* 16958 */,/*41879*/"BAMUM LETTER PHASE-D NTEE"/* 16959 */, /*41880*/"BAMUM LETTER PHASE-D PEE"/* 1695A */,/*41881*/"BAMUM LETTER PHASE-D NI"/* 1695B */, /*41882*/"BAMUM LETTER PHASE-D SHOQ"/* 1695C */,/*41883*/"BAMUM LETTER PHASE-D PUQ"/* 1695D */, /*41884*/"BAMUM LETTER PHASE-D MVOP"/* 1695E */,/*41885*/"BAMUM LETTER PHASE-D LOQ"/* 1695F */, /*41886*/"BAMUM LETTER PHASE-D REN MUCH"/* 16960 */,/*41887*/"BAMUM LETTER PHASE-D TI"/* 16961 */, /*41888*/"BAMUM LETTER PHASE-D NTUU"/* 16962 */,/*41889*/"BAMUM LETTER PHASE-D MBAA SEVEN"/* 16963 */, /*41890*/"BAMUM LETTER PHASE-D SAQ"/* 16964 */,/*41891*/"BAMUM LETTER PHASE-D FAA"/* 16965 */, /*41892*/"BAMUM LETTER PHASE-E NDAP"/* 16966 */,/*41893*/"BAMUM LETTER PHASE-E TOON"/* 16967 */, /*41894*/"BAMUM LETTER PHASE-E MBEUM"/* 16968 */,/*41895*/"BAMUM LETTER PHASE-E LAP"/* 16969 */, /*41896*/"BAMUM LETTER PHASE-E VOM"/* 1696A */,/*41897*/"BAMUM LETTER PHASE-E LOON"/* 1696B */, /*41898*/"BAMUM LETTER PHASE-E PAA"/* 1696C */,/*41899*/"BAMUM LETTER PHASE-E SOM"/* 1696D */, /*41900*/"BAMUM LETTER PHASE-E RAQ"/* 1696E */,/*41901*/"BAMUM LETTER PHASE-E NSHUOP"/* 1696F */, /*41902*/"BAMUM LETTER PHASE-E NDUN"/* 16970 */,/*41903*/"BAMUM LETTER PHASE-E PUAE"/* 16971 */, /*41904*/"BAMUM LETTER PHASE-E TAM"/* 16972 */,/*41905*/"BAMUM LETTER PHASE-E NGKA"/* 16973 */, /*41906*/"BAMUM LETTER PHASE-E KPEUX"/* 16974 */,/*41907*/"BAMUM LETTER PHASE-E WUO"/* 16975 */, /*41908*/"BAMUM LETTER PHASE-E SEE"/* 16976 */,/*41909*/"BAMUM LETTER PHASE-E NGGEUAET"/* 16977 */, /*41910*/"BAMUM LETTER PHASE-E PAAM"/* 16978 */,/*41911*/"BAMUM LETTER PHASE-E TOO"/* 16979 */, /*41912*/"BAMUM LETTER PHASE-E KUOP"/* 1697A */,/*41913*/"BAMUM LETTER PHASE-E LOM"/* 1697B */, /*41914*/"BAMUM LETTER PHASE-E NSHIEE"/* 1697C */,/*41915*/"BAMUM LETTER PHASE-E NGOP"/* 1697D */, /*41916*/"BAMUM LETTER PHASE-E MAEM"/* 1697E */,/*41917*/"BAMUM LETTER PHASE-E NGKEUX"/* 1697F */, /*41918*/"BAMUM LETTER PHASE-E NGOQ"/* 16980 */,/*41919*/"BAMUM LETTER PHASE-E NSHUE"/* 16981 */, /*41920*/"BAMUM LETTER PHASE-E RIMGBA"/* 16982 */,/*41921*/"BAMUM LETTER PHASE-E NJEUX"/* 16983 */, /*41922*/"BAMUM LETTER PHASE-E PEEM"/* 16984 */,/*41923*/"BAMUM LETTER PHASE-E SAA"/* 16985 */, /*41924*/"BAMUM LETTER PHASE-E NGGURAE"/* 16986 */,/*41925*/"BAMUM LETTER PHASE-E MGBA"/* 16987 */, /*41926*/"BAMUM LETTER PHASE-E GHEUX"/* 16988 */,/*41927*/"BAMUM LETTER PHASE-E NGKEUAEM"/* 16989 */, /*41928*/"BAMUM LETTER PHASE-E NJAEMLI"/* 1698A */,/*41929*/"BAMUM LETTER PHASE-E MAP"/* 1698B */, /*41930*/"BAMUM LETTER PHASE-E LOOT"/* 1698C */,/*41931*/"BAMUM LETTER PHASE-E NGGEEEE"/* 1698D */, /*41932*/"BAMUM LETTER PHASE-E NDIQ"/* 1698E */,/*41933*/"BAMUM LETTER PHASE-E TAEN NTEUM"/* 1698F */, /*41934*/"BAMUM LETTER PHASE-E SET"/* 16990 */,/*41935*/"BAMUM LETTER PHASE-E PUM"/* 16991 */, /*41936*/"BAMUM LETTER PHASE-E NDAA SOFTNESS"/* 16992 */,/*41937*/"BAMUM LETTER PHASE-E NGGUAESHAE NYAM"/* 16993 */, /*41938*/"BAMUM LETTER PHASE-E YIEE"/* 16994 */,/*41939*/"BAMUM LETTER PHASE-E GHEUN"/* 16995 */, /*41940*/"BAMUM LETTER PHASE-E TUAE"/* 16996 */,/*41941*/"BAMUM LETTER PHASE-E YEUAE"/* 16997 */, /*41942*/"BAMUM LETTER PHASE-E PO"/* 16998 */,/*41943*/"BAMUM LETTER PHASE-E TUMAE"/* 16999 */, /*41944*/"BAMUM LETTER PHASE-E KEUAE"/* 1699A */,/*41945*/"BAMUM LETTER PHASE-E SUAEN"/* 1699B */, /*41946*/"BAMUM LETTER PHASE-E TEUAEQ"/* 1699C */,/*41947*/"BAMUM LETTER PHASE-E VEUAE"/* 1699D */, /*41948*/"BAMUM LETTER PHASE-E WEUX"/* 1699E */,/*41949*/"BAMUM LETTER PHASE-E LAAM"/* 1699F */, /*41950*/"BAMUM LETTER PHASE-E PU"/* 169A0 */,/*41951*/"BAMUM LETTER PHASE-E TAAQ"/* 169A1 */, /*41952*/"BAMUM LETTER PHASE-E GHAAMAE"/* 169A2 */,/*41953*/"BAMUM LETTER PHASE-E NGEUREUT"/* 169A3 */, /*41954*/"BAMUM LETTER PHASE-E SHEUAEQ"/* 169A4 */,/*41955*/"BAMUM LETTER PHASE-E MGBEN"/* 169A5 */, /*41956*/"BAMUM LETTER PHASE-E MBEE"/* 169A6 */,/*41957*/"BAMUM LETTER PHASE-E NZAQ"/* 169A7 */, /*41958*/"BAMUM LETTER PHASE-E NKOM"/* 169A8 */,/*41959*/"BAMUM LETTER PHASE-E GBET"/* 169A9 */, /*41960*/"BAMUM LETTER PHASE-E TUM"/* 169AA */,/*41961*/"BAMUM LETTER PHASE-E KUET"/* 169AB */, /*41962*/"BAMUM LETTER PHASE-E YAP"/* 169AC */,/*41963*/"BAMUM LETTER PHASE-E NYI CLEAVER"/* 169AD */, /*41964*/"BAMUM LETTER PHASE-E YIT"/* 169AE */,/*41965*/"BAMUM LETTER PHASE-E MFEUQ"/* 169AF */, /*41966*/"BAMUM LETTER PHASE-E NDIAQ"/* 169B0 */,/*41967*/"BAMUM LETTER PHASE-E PIEEQ"/* 169B1 */, /*41968*/"BAMUM LETTER PHASE-E YUEQ"/* 169B2 */,/*41969*/"BAMUM LETTER PHASE-E LEUAEM"/* 169B3 */, /*41970*/"BAMUM LETTER PHASE-E FUE"/* 169B4 */,/*41971*/"BAMUM LETTER PHASE-E GBEUX"/* 169B5 */, /*41972*/"BAMUM LETTER PHASE-E NGKUP"/* 169B6 */,/*41973*/"BAMUM LETTER PHASE-E KET"/* 169B7 */, /*41974*/"BAMUM LETTER PHASE-E MAE"/* 169B8 */,/*41975*/"BAMUM LETTER PHASE-E NGKAAMI"/* 169B9 */, /*41976*/"BAMUM LETTER PHASE-E GHET"/* 169BA */,/*41977*/"BAMUM LETTER PHASE-E FA"/* 169BB */, /*41978*/"BAMUM LETTER PHASE-E NTUM"/* 169BC */,/*41979*/"BAMUM LETTER PHASE-E PEUT"/* 169BD */, /*41980*/"BAMUM LETTER PHASE-E YEUM"/* 169BE */,/*41981*/"BAMUM LETTER PHASE-E NGGEUAE"/* 169BF */, /*41982*/"BAMUM LETTER PHASE-E NYI BETWEEN"/* 169C0 */,/*41983*/"BAMUM LETTER PHASE-E NZUQ"/* 169C1 */, /*41984*/"BAMUM LETTER PHASE-E POON"/* 169C2 */,/*41985*/"BAMUM LETTER PHASE-E MIEE"/* 169C3 */, /*41986*/"BAMUM LETTER PHASE-E FUET"/* 169C4 */,/*41987*/"BAMUM LETTER PHASE-E NAE"/* 169C5 */, /*41988*/"BAMUM LETTER PHASE-E MUAE"/* 169C6 */,/*41989*/"BAMUM LETTER PHASE-E GHEUAE"/* 169C7 */, /*41990*/"BAMUM LETTER PHASE-E FU I"/* 169C8 */,/*41991*/"BAMUM LETTER PHASE-E MVI"/* 169C9 */, /*41992*/"BAMUM LETTER PHASE-E PUAQ"/* 169CA */,/*41993*/"BAMUM LETTER PHASE-E NGKUM"/* 169CB */, /*41994*/"BAMUM LETTER PHASE-E KUT"/* 169CC */,/*41995*/"BAMUM LETTER PHASE-E PIET"/* 169CD */, /*41996*/"BAMUM LETTER PHASE-E NTAP"/* 169CE */,/*41997*/"BAMUM LETTER PHASE-E YEUAET"/* 169CF */, /*41998*/"BAMUM LETTER PHASE-E NGGUP"/* 169D0 */,/*41999*/"BAMUM LETTER PHASE-E PA PEOPLE"/* 169D1 */, /*42000*/"BAMUM LETTER PHASE-E FU CALL"/* 169D2 */,/*42001*/"BAMUM LETTER PHASE-E FOM"/* 169D3 */, /*42002*/"BAMUM LETTER PHASE-E NJEE"/* 169D4 */,/*42003*/"BAMUM LETTER PHASE-E A"/* 169D5 */, /*42004*/"BAMUM LETTER PHASE-E TOQ"/* 169D6 */,/*42005*/"BAMUM LETTER PHASE-E O"/* 169D7 */, /*42006*/"BAMUM LETTER PHASE-E I"/* 169D8 */,/*42007*/"BAMUM LETTER PHASE-E LAQ"/* 169D9 */, /*42008*/"BAMUM LETTER PHASE-E PA PLURAL"/* 169DA */,/*42009*/"BAMUM LETTER PHASE-E TAA"/* 169DB */, /*42010*/"BAMUM LETTER PHASE-E TAQ"/* 169DC */,/*42011*/"BAMUM LETTER PHASE-E NDAA MY HOUSE"/* 169DD */, /*42012*/"BAMUM LETTER PHASE-E SHIQ"/* 169DE */,/*42013*/"BAMUM LETTER PHASE-E YEUX"/* 169DF */, /*42014*/"BAMUM LETTER PHASE-E NGUAE"/* 169E0 */,/*42015*/"BAMUM LETTER PHASE-E YUAEN"/* 169E1 */, /*42016*/"BAMUM LETTER PHASE-E YOQ SWIMMING"/* 169E2 */,/*42017*/"BAMUM LETTER PHASE-E YOQ COVER"/* 169E3 */, /*42018*/"BAMUM LETTER PHASE-E YUQ"/* 169E4 */,/*42019*/"BAMUM LETTER PHASE-E YUN"/* 169E5 */, /*42020*/"BAMUM LETTER PHASE-E KEUX"/* 169E6 */,/*42021*/"BAMUM LETTER PHASE-E PEUX"/* 169E7 */, /*42022*/"BAMUM LETTER PHASE-E NJEE EPOCH"/* 169E8 */,/*42023*/"BAMUM LETTER PHASE-E PUE"/* 169E9 */, /*42024*/"BAMUM LETTER PHASE-E WUE"/* 169EA */,/*42025*/"BAMUM LETTER PHASE-E FEE"/* 169EB */, /*42026*/"BAMUM LETTER PHASE-E VEE"/* 169EC */,/*42027*/"BAMUM LETTER PHASE-E LU"/* 169ED */, /*42028*/"BAMUM LETTER PHASE-E MI"/* 169EE */,/*42029*/"BAMUM LETTER PHASE-E REUX"/* 169EF */, /*42030*/"BAMUM LETTER PHASE-E RAE"/* 169F0 */,/*42031*/"BAMUM LETTER PHASE-E NGUAET"/* 169F1 */, /*42032*/"BAMUM LETTER PHASE-E NGA"/* 169F2 */,/*42033*/"BAMUM LETTER PHASE-E SHO"/* 169F3 */, /*42034*/"BAMUM LETTER PHASE-E SHOQ"/* 169F4 */,/*42035*/"BAMUM LETTER PHASE-E FU REMEDY"/* 169F5 */, /*42036*/"BAMUM LETTER PHASE-E NA"/* 169F6 */,/*42037*/"BAMUM LETTER PHASE-E PI"/* 169F7 */, /*42038*/"BAMUM LETTER PHASE-E LOQ"/* 169F8 */,/*42039*/"BAMUM LETTER PHASE-E KO"/* 169F9 */, /*42040*/"BAMUM LETTER PHASE-E MEN"/* 169FA */,/*42041*/"BAMUM LETTER PHASE-E MA"/* 169FB */, /*42042*/"BAMUM LETTER PHASE-E MAQ"/* 169FC */,/*42043*/"BAMUM LETTER PHASE-E TEU"/* 169FD */, /*42044*/"BAMUM LETTER PHASE-E KI"/* 169FE */,/*42045*/"BAMUM LETTER PHASE-E MON"/* 169FF */, /*42046*/"BAMUM LETTER PHASE-E TEN"/* 16A00 */,/*42047*/"BAMUM LETTER PHASE-E FAQ"/* 16A01 */, /*42048*/"BAMUM LETTER PHASE-E GHOM"/* 16A02 */,/*42049*/"BAMUM LETTER PHASE-F KA"/* 16A03 */, /*42050*/"BAMUM LETTER PHASE-F U"/* 16A04 */,/*42051*/"BAMUM LETTER PHASE-F KU"/* 16A05 */, /*42052*/"BAMUM LETTER PHASE-F EE"/* 16A06 */,/*42053*/"BAMUM LETTER PHASE-F REE"/* 16A07 */, /*42054*/"BAMUM LETTER PHASE-F TAE"/* 16A08 */,/*42055*/"BAMUM LETTER PHASE-F NYI"/* 16A09 */, /*42056*/"BAMUM LETTER PHASE-F LA"/* 16A0A */,/*42057*/"BAMUM LETTER PHASE-F RII"/* 16A0B */, /*42058*/"BAMUM LETTER PHASE-F RIEE"/* 16A0C */,/*42059*/"BAMUM LETTER PHASE-F MEEEE"/* 16A0D */, /*42060*/"BAMUM LETTER PHASE-F TAA"/* 16A0E */,/*42061*/"BAMUM LETTER PHASE-F NDAA"/* 16A0F */, /*42062*/"BAMUM LETTER PHASE-F NJAEM"/* 16A10 */,/*42063*/"BAMUM LETTER PHASE-F M"/* 16A11 */, /*42064*/"BAMUM LETTER PHASE-F SUU"/* 16A12 */,/*42065*/"BAMUM LETTER PHASE-F SHII"/* 16A13 */, /*42066*/"BAMUM LETTER PHASE-F SI"/* 16A14 */,/*42067*/"BAMUM LETTER PHASE-F SEUX"/* 16A15 */, /*42068*/"BAMUM LETTER PHASE-F KYEE"/* 16A16 */,/*42069*/"BAMUM LETTER PHASE-F KET"/* 16A17 */, /*42070*/"BAMUM LETTER PHASE-F NUAE"/* 16A18 */,/*42071*/"BAMUM LETTER PHASE-F NU"/* 16A19 */, /*42072*/"BAMUM LETTER PHASE-F NJUAE"/* 16A1A */,/*42073*/"BAMUM LETTER PHASE-F YOQ"/* 16A1B */, /*42074*/"BAMUM LETTER PHASE-F SHU"/* 16A1C */,/*42075*/"BAMUM LETTER PHASE-F YA"/* 16A1D */, /*42076*/"BAMUM LETTER PHASE-F NSHA"/* 16A1E */,/*42077*/"BAMUM LETTER PHASE-F PEUX"/* 16A1F */, /*42078*/"BAMUM LETTER PHASE-F NTEE"/* 16A20 */,/*42079*/"BAMUM LETTER PHASE-F WUE"/* 16A21 */, /*42080*/"BAMUM LETTER PHASE-F PEE"/* 16A22 */,/*42081*/"BAMUM LETTER PHASE-F RU"/* 16A23 */, /*42082*/"BAMUM LETTER PHASE-F NI"/* 16A24 */,/*42083*/"BAMUM LETTER PHASE-F REUX"/* 16A25 */, /*42084*/"BAMUM LETTER PHASE-F KEN"/* 16A26 */,/*42085*/"BAMUM LETTER PHASE-F NGKWAEN"/* 16A27 */, /*42086*/"BAMUM LETTER PHASE-F NGGA"/* 16A28 */,/*42087*/"BAMUM LETTER PHASE-F SHO"/* 16A29 */, /*42088*/"BAMUM LETTER PHASE-F PUAE"/* 16A2A */,/*42089*/"BAMUM LETTER PHASE-F FOM"/* 16A2B */, /*42090*/"BAMUM LETTER PHASE-F WA"/* 16A2C */,/*42091*/"BAMUM LETTER PHASE-F LI"/* 16A2D */, /*42092*/"BAMUM LETTER PHASE-F LOQ"/* 16A2E */,/*42093*/"BAMUM LETTER PHASE-F KO"/* 16A2F */, /*42094*/"BAMUM LETTER PHASE-F MBEN"/* 16A30 */,/*42095*/"BAMUM LETTER PHASE-F REN"/* 16A31 */, /*42096*/"BAMUM LETTER PHASE-F MA"/* 16A32 */,/*42097*/"BAMUM LETTER PHASE-F MO"/* 16A33 */, /*42098*/"BAMUM LETTER PHASE-F MBAA"/* 16A34 */,/*42099*/"BAMUM LETTER PHASE-F TET"/* 16A35 */, /*42100*/"BAMUM LETTER PHASE-F KPA"/* 16A36 */,/*42101*/"BAMUM LETTER PHASE-F SAMBA"/* 16A37 */, /*42102*/"BAMUM LETTER PHASE-F VUEQ"/* 16A38 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*42110*/"MRO LETTER TA"/* 16A40 */, /*42111*/"MRO LETTER NGI"/* 16A41 */,/*42112*/"MRO LETTER YO"/* 16A42 */,/*42113*/"MRO LETTER MIM"/* 16A43 */, /*42114*/"MRO LETTER BA"/* 16A44 */,/*42115*/"MRO LETTER DA"/* 16A45 */,/*42116*/"MRO LETTER A"/* 16A46 */, /*42117*/"MRO LETTER PHI"/* 16A47 */,/*42118*/"MRO LETTER KHAI"/* 16A48 */,/*42119*/"MRO LETTER HAO"/* 16A49 */, /*42120*/"MRO LETTER DAI"/* 16A4A */,/*42121*/"MRO LETTER CHU"/* 16A4B */,/*42122*/"MRO LETTER KEAAE"/* 16A4C */, /*42123*/"MRO LETTER OL"/* 16A4D */,/*42124*/"MRO LETTER MAEM"/* 16A4E */,/*42125*/"MRO LETTER NIN"/* 16A4F */, /*42126*/"MRO LETTER PA"/* 16A50 */,/*42127*/"MRO LETTER OO"/* 16A51 */,/*42128*/"MRO LETTER O"/* 16A52 */, /*42129*/"MRO LETTER RO"/* 16A53 */,/*42130*/"MRO LETTER SHI"/* 16A54 */,/*42131*/"MRO LETTER THEA"/* 16A55 */, /*42132*/"MRO LETTER EA"/* 16A56 */,/*42133*/"MRO LETTER WA"/* 16A57 */,/*42134*/"MRO LETTER E"/* 16A58 */, /*42135*/"MRO LETTER KO"/* 16A59 */,/*42136*/"MRO LETTER LAN"/* 16A5A */,/*42137*/"MRO LETTER LA"/* 16A5B */, /*42138*/"MRO LETTER HAI"/* 16A5C */,/*42139*/"MRO LETTER RI"/* 16A5D */,/*42140*/"MRO LETTER TEK"/* 16A5E */,NULL, /*42142*/"MRO DIGIT ZERO"/* 16A60 */,/*42143*/"MRO DIGIT ONE"/* 16A61 */,/*42144*/"MRO DIGIT TWO"/* 16A62 */, /*42145*/"MRO DIGIT THREE"/* 16A63 */,/*42146*/"MRO DIGIT FOUR"/* 16A64 */,/*42147*/"MRO DIGIT FIVE"/* 16A65 */, /*42148*/"MRO DIGIT SIX"/* 16A66 */,/*42149*/"MRO DIGIT SEVEN"/* 16A67 */,/*42150*/"MRO DIGIT EIGHT"/* 16A68 */, /*42151*/"MRO DIGIT NINE"/* 16A69 */,NULL,NULL,NULL,NULL,/*42156*/"MRO DANDA"/* 16A6E */, /*42157*/"MRO DOUBLE DANDA"/* 16A6F */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*42254*/"BASSA VAH LETTER ENNI"/* 16AD0 */, /*42255*/"BASSA VAH LETTER KA"/* 16AD1 */,/*42256*/"BASSA VAH LETTER SE"/* 16AD2 */, /*42257*/"BASSA VAH LETTER FA"/* 16AD3 */,/*42258*/"BASSA VAH LETTER MBE"/* 16AD4 */, /*42259*/"BASSA VAH LETTER YIE"/* 16AD5 */,/*42260*/"BASSA VAH LETTER GAH"/* 16AD6 */, /*42261*/"BASSA VAH LETTER DHII"/* 16AD7 */,/*42262*/"BASSA VAH LETTER KPAH"/* 16AD8 */, /*42263*/"BASSA VAH LETTER JO"/* 16AD9 */,/*42264*/"BASSA VAH LETTER HWAH"/* 16ADA */, /*42265*/"BASSA VAH LETTER WA"/* 16ADB */,/*42266*/"BASSA VAH LETTER ZO"/* 16ADC */, /*42267*/"BASSA VAH LETTER GBU"/* 16ADD */,/*42268*/"BASSA VAH LETTER DO"/* 16ADE */, /*42269*/"BASSA VAH LETTER CE"/* 16ADF */,/*42270*/"BASSA VAH LETTER UWU"/* 16AE0 */, /*42271*/"BASSA VAH LETTER TO"/* 16AE1 */,/*42272*/"BASSA VAH LETTER BA"/* 16AE2 */, /*42273*/"BASSA VAH LETTER VU"/* 16AE3 */,/*42274*/"BASSA VAH LETTER YEIN"/* 16AE4 */, /*42275*/"BASSA VAH LETTER PA"/* 16AE5 */,/*42276*/"BASSA VAH LETTER WADDA"/* 16AE6 */, /*42277*/"BASSA VAH LETTER A"/* 16AE7 */,/*42278*/"BASSA VAH LETTER O"/* 16AE8 */, /*42279*/"BASSA VAH LETTER OO"/* 16AE9 */,/*42280*/"BASSA VAH LETTER U"/* 16AEA */, /*42281*/"BASSA VAH LETTER EE"/* 16AEB */,/*42282*/"BASSA VAH LETTER E"/* 16AEC */, /*42283*/"BASSA VAH LETTER I"/* 16AED */,NULL,NULL,/*42286*/"BASSA VAH COMBINING HIGH TONE"/* 16AF0 */, /*42287*/"BASSA VAH COMBINING LOW TONE"/* 16AF1 */,/*42288*/"BASSA VAH COMBINING MID TONE"/* 16AF2 */, /*42289*/"BASSA VAH COMBINING LOW-MID TONE"/* 16AF3 */,/*42290*/"BASSA VAH COMBINING HIGH-LOW TONE"/* 16AF4 */, /*42291*/"BASSA VAH FULL STOP"/* 16AF5 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*42302*/"PAHAWH HMONG VOWEL KEEB"/* 16B00 */,/*42303*/"PAHAWH HMONG VOWEL KEEV"/* 16B01 */, /*42304*/"PAHAWH HMONG VOWEL KIB"/* 16B02 */,/*42305*/"PAHAWH HMONG VOWEL KIV"/* 16B03 */, /*42306*/"PAHAWH HMONG VOWEL KAUB"/* 16B04 */,/*42307*/"PAHAWH HMONG VOWEL KAUV"/* 16B05 */, /*42308*/"PAHAWH HMONG VOWEL KUB"/* 16B06 */,/*42309*/"PAHAWH HMONG VOWEL KUV"/* 16B07 */, /*42310*/"PAHAWH HMONG VOWEL KEB"/* 16B08 */,/*42311*/"PAHAWH HMONG VOWEL KEV"/* 16B09 */, /*42312*/"PAHAWH HMONG VOWEL KAIB"/* 16B0A */,/*42313*/"PAHAWH HMONG VOWEL KAIV"/* 16B0B */, /*42314*/"PAHAWH HMONG VOWEL KOOB"/* 16B0C */,/*42315*/"PAHAWH HMONG VOWEL KOOV"/* 16B0D */, /*42316*/"PAHAWH HMONG VOWEL KAWB"/* 16B0E */,/*42317*/"PAHAWH HMONG VOWEL KAWV"/* 16B0F */, /*42318*/"PAHAWH HMONG VOWEL KUAB"/* 16B10 */,/*42319*/"PAHAWH HMONG VOWEL KUAV"/* 16B11 */, /*42320*/"PAHAWH HMONG VOWEL KOB"/* 16B12 */,/*42321*/"PAHAWH HMONG VOWEL KOV"/* 16B13 */, /*42322*/"PAHAWH HMONG VOWEL KIAB"/* 16B14 */,/*42323*/"PAHAWH HMONG VOWEL KIAV"/* 16B15 */, /*42324*/"PAHAWH HMONG VOWEL KAB"/* 16B16 */,/*42325*/"PAHAWH HMONG VOWEL KAV"/* 16B17 */, /*42326*/"PAHAWH HMONG VOWEL KWB"/* 16B18 */,/*42327*/"PAHAWH HMONG VOWEL KWV"/* 16B19 */, /*42328*/"PAHAWH HMONG VOWEL KAAB"/* 16B1A */,/*42329*/"PAHAWH HMONG VOWEL KAAV"/* 16B1B */, /*42330*/"PAHAWH HMONG CONSONANT VAU"/* 16B1C */,/*42331*/"PAHAWH HMONG CONSONANT NTSAU"/* 16B1D */, /*42332*/"PAHAWH HMONG CONSONANT LAU"/* 16B1E */,/*42333*/"PAHAWH HMONG CONSONANT HAU"/* 16B1F */, /*42334*/"PAHAWH HMONG CONSONANT NLAU"/* 16B20 */,/*42335*/"PAHAWH HMONG CONSONANT RAU"/* 16B21 */, /*42336*/"PAHAWH HMONG CONSONANT NKAU"/* 16B22 */,/*42337*/"PAHAWH HMONG CONSONANT QHAU"/* 16B23 */, /*42338*/"PAHAWH HMONG CONSONANT YAU"/* 16B24 */,/*42339*/"PAHAWH HMONG CONSONANT HLAU"/* 16B25 */, /*42340*/"PAHAWH HMONG CONSONANT MAU"/* 16B26 */,/*42341*/"PAHAWH HMONG CONSONANT CHAU"/* 16B27 */, /*42342*/"PAHAWH HMONG CONSONANT NCHAU"/* 16B28 */,/*42343*/"PAHAWH HMONG CONSONANT HNAU"/* 16B29 */, /*42344*/"PAHAWH HMONG CONSONANT PLHAU"/* 16B2A */,/*42345*/"PAHAWH HMONG CONSONANT NTHAU"/* 16B2B */, /*42346*/"PAHAWH HMONG CONSONANT NAU"/* 16B2C */,/*42347*/"PAHAWH HMONG CONSONANT AU"/* 16B2D */, /*42348*/"PAHAWH HMONG CONSONANT XAU"/* 16B2E */,/*42349*/"PAHAWH HMONG CONSONANT CAU"/* 16B2F */, /*42350*/"PAHAWH HMONG MARK CIM TUB"/* 16B30 */,/*42351*/"PAHAWH HMONG MARK CIM SO"/* 16B31 */, /*42352*/"PAHAWH HMONG MARK CIM KES"/* 16B32 */,/*42353*/"PAHAWH HMONG MARK CIM KHAV"/* 16B33 */, /*42354*/"PAHAWH HMONG MARK CIM SUAM"/* 16B34 */,/*42355*/"PAHAWH HMONG MARK CIM HOM"/* 16B35 */, /*42356*/"PAHAWH HMONG MARK CIM TAUM"/* 16B36 */,/*42357*/"PAHAWH HMONG SIGN VOS THOM"/* 16B37 */, /*42358*/"PAHAWH HMONG SIGN VOS TSHAB CEEB"/* 16B38 */,/*42359*/"PAHAWH HMONG SIGN CIM CHEEM"/* 16B39 */, /*42360*/"PAHAWH HMONG SIGN VOS THIAB"/* 16B3A */,/*42361*/"PAHAWH HMONG SIGN VOS FEEM"/* 16B3B */, /*42362*/"PAHAWH HMONG SIGN XYEEM NTXIV"/* 16B3C */,/*42363*/"PAHAWH HMONG SIGN XYEEM RHO"/* 16B3D */, /*42364*/"PAHAWH HMONG SIGN XYEEM TOV"/* 16B3E */,/*42365*/"PAHAWH HMONG SIGN XYEEM FAIB"/* 16B3F */, /*42366*/"PAHAWH HMONG SIGN VOS SEEV"/* 16B40 */,/*42367*/"PAHAWH HMONG SIGN MEEJ SUAB"/* 16B41 */, /*42368*/"PAHAWH HMONG SIGN VOS NRUA"/* 16B42 */,/*42369*/"PAHAWH HMONG SIGN IB YAM"/* 16B43 */, /*42370*/"PAHAWH HMONG SIGN XAUS"/* 16B44 */,/*42371*/"PAHAWH HMONG SIGN CIM TSOV ROG"/* 16B45 */,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,/*42382*/"PAHAWH HMONG DIGIT ZERO"/* 16B50 */,/*42383*/"PAHAWH HMONG DIGIT ONE"/* 16B51 */, /*42384*/"PAHAWH HMONG DIGIT TWO"/* 16B52 */,/*42385*/"PAHAWH HMONG DIGIT THREE"/* 16B53 */, /*42386*/"PAHAWH HMONG DIGIT FOUR"/* 16B54 */,/*42387*/"PAHAWH HMONG DIGIT FIVE"/* 16B55 */, /*42388*/"PAHAWH HMONG DIGIT SIX"/* 16B56 */,/*42389*/"PAHAWH HMONG DIGIT SEVEN"/* 16B57 */, /*42390*/"PAHAWH HMONG DIGIT EIGHT"/* 16B58 */,/*42391*/"PAHAWH HMONG DIGIT NINE"/* 16B59 */,NULL, /*42393*/"PAHAWH HMONG NUMBER TENS"/* 16B5B */,/*42394*/"PAHAWH HMONG NUMBER HUNDREDS"/* 16B5C */, /*42395*/"PAHAWH HMONG NUMBER TEN THOUSANDS"/* 16B5D */,/*42396*/"PAHAWH HMONG NUMBER MILLIONS"/* 16B5E */, /*42397*/"PAHAWH HMONG NUMBER HUNDRED MILLIONS"/* 16B5F */,/*42398*/"PAHAWH HMONG NUMBER TEN BILLIONS"/* 16B60 */, /*42399*/"PAHAWH HMONG NUMBER TRILLIONS"/* 16B61 */,NULL,/*42401*/"PAHAWH HMONG SIGN VOS LUB"/* 16B63 */, /*42402*/"PAHAWH HMONG SIGN XYOO"/* 16B64 */,/*42403*/"PAHAWH HMONG SIGN HLI"/* 16B65 */, /*42404*/"PAHAWH HMONG SIGN THIRD-STAGE HLI"/* 16B66 */,/*42405*/"PAHAWH HMONG SIGN ZWJ THAJ"/* 16B67 */, /*42406*/"PAHAWH HMONG SIGN HNUB"/* 16B68 */,/*42407*/"PAHAWH HMONG SIGN NQIG"/* 16B69 */, /*42408*/"PAHAWH HMONG SIGN XIAB"/* 16B6A */,/*42409*/"PAHAWH HMONG SIGN NTUJ"/* 16B6B */, /*42410*/"PAHAWH HMONG SIGN AV"/* 16B6C */,/*42411*/"PAHAWH HMONG SIGN TXHEEJ CEEV"/* 16B6D */, /*42412*/"PAHAWH HMONG SIGN MEEJ TSEEB"/* 16B6E */,/*42413*/"PAHAWH HMONG SIGN TAU"/* 16B6F */, /*42414*/"PAHAWH HMONG SIGN LOS"/* 16B70 */,/*42415*/"PAHAWH HMONG SIGN MUS"/* 16B71 */, /*42416*/"PAHAWH HMONG SIGN CIM HAIS LUS NTOG NTOG"/* 16B72 */,/*42417*/"PAHAWH HMONG SIGN CIM CUAM TSHOOJ"/* 16B73 */, /*42418*/"PAHAWH HMONG SIGN CIM TXWV"/* 16B74 */,/*42419*/"PAHAWH HMONG SIGN CIM TXWV CHWV"/* 16B75 */, /*42420*/"PAHAWH HMONG SIGN CIM PUB DAWB"/* 16B76 */,/*42421*/"PAHAWH HMONG SIGN CIM NRES TOS"/* 16B77 */,NULL,NULL,NULL, NULL,NULL,/*42427*/"PAHAWH HMONG CLAN SIGN TSHEEJ"/* 16B7D */,/*42428*/"PAHAWH HMONG CLAN SIGN YEEG"/* 16B7E */, /*42429*/"PAHAWH HMONG CLAN SIGN LIS"/* 16B7F */,/*42430*/"PAHAWH HMONG CLAN SIGN LAUJ"/* 16B80 */, /*42431*/"PAHAWH HMONG CLAN SIGN XYOOJ"/* 16B81 */,/*42432*/"PAHAWH HMONG CLAN SIGN KOO"/* 16B82 */, /*42433*/"PAHAWH HMONG CLAN SIGN HAWJ"/* 16B83 */,/*42434*/"PAHAWH HMONG CLAN SIGN MUAS"/* 16B84 */, /*42435*/"PAHAWH HMONG CLAN SIGN THOJ"/* 16B85 */,/*42436*/"PAHAWH HMONG CLAN SIGN TSAB"/* 16B86 */, /*42437*/"PAHAWH HMONG CLAN SIGN PHAB"/* 16B87 */,/*42438*/"PAHAWH HMONG CLAN SIGN KHAB"/* 16B88 */, /*42439*/"PAHAWH HMONG CLAN SIGN HAM"/* 16B89 */,/*42440*/"PAHAWH HMONG CLAN SIGN VAJ"/* 16B8A */, /*42441*/"PAHAWH HMONG CLAN SIGN FAJ"/* 16B8B */,/*42442*/"PAHAWH HMONG CLAN SIGN YAJ"/* 16B8C */, /*42443*/"PAHAWH HMONG CLAN SIGN TSWB"/* 16B8D */,/*42444*/"PAHAWH HMONG CLAN SIGN KWM"/* 16B8E */, /*42445*/"PAHAWH HMONG CLAN SIGN VWJ"/* 16B8F */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,/*43326*/"MIAO LETTER PA"/* 16F00 */,/*43327*/"MIAO LETTER BA"/* 16F01 */, /*43328*/"MIAO LETTER YI PA"/* 16F02 */,/*43329*/"MIAO LETTER PLA"/* 16F03 */,/*43330*/"MIAO LETTER MA"/* 16F04 */, /*43331*/"MIAO LETTER MHA"/* 16F05 */,/*43332*/"MIAO LETTER ARCHAIC MA"/* 16F06 */,/*43333*/"MIAO LETTER FA"/* 16F07 */, /*43334*/"MIAO LETTER VA"/* 16F08 */,/*43335*/"MIAO LETTER VFA"/* 16F09 */,/*43336*/"MIAO LETTER TA"/* 16F0A */, /*43337*/"MIAO LETTER DA"/* 16F0B */,/*43338*/"MIAO LETTER YI TTA"/* 16F0C */,/*43339*/"MIAO LETTER YI TA"/* 16F0D */, /*43340*/"MIAO LETTER TTA"/* 16F0E */,/*43341*/"MIAO LETTER DDA"/* 16F0F */,/*43342*/"MIAO LETTER NA"/* 16F10 */, /*43343*/"MIAO LETTER NHA"/* 16F11 */,/*43344*/"MIAO LETTER YI NNA"/* 16F12 */, /*43345*/"MIAO LETTER ARCHAIC NA"/* 16F13 */,/*43346*/"MIAO LETTER NNA"/* 16F14 */, /*43347*/"MIAO LETTER NNHA"/* 16F15 */,/*43348*/"MIAO LETTER LA"/* 16F16 */,/*43349*/"MIAO LETTER LYA"/* 16F17 */, /*43350*/"MIAO LETTER LHA"/* 16F18 */,/*43351*/"MIAO LETTER LHYA"/* 16F19 */,/*43352*/"MIAO LETTER TLHA"/* 16F1A */, /*43353*/"MIAO LETTER DLHA"/* 16F1B */,/*43354*/"MIAO LETTER TLHYA"/* 16F1C */,/*43355*/"MIAO LETTER DLHYA"/* 16F1D */, /*43356*/"MIAO LETTER KA"/* 16F1E */,/*43357*/"MIAO LETTER GA"/* 16F1F */,/*43358*/"MIAO LETTER YI KA"/* 16F20 */, /*43359*/"MIAO LETTER QA"/* 16F21 */,/*43360*/"MIAO LETTER QGA"/* 16F22 */,/*43361*/"MIAO LETTER NGA"/* 16F23 */, /*43362*/"MIAO LETTER NGHA"/* 16F24 */,/*43363*/"MIAO LETTER ARCHAIC NGA"/* 16F25 */, /*43364*/"MIAO LETTER HA"/* 16F26 */,/*43365*/"MIAO LETTER XA"/* 16F27 */,/*43366*/"MIAO LETTER GHA"/* 16F28 */, /*43367*/"MIAO LETTER GHHA"/* 16F29 */,/*43368*/"MIAO LETTER TSSA"/* 16F2A */,/*43369*/"MIAO LETTER DZZA"/* 16F2B */, /*43370*/"MIAO LETTER NYA"/* 16F2C */,/*43371*/"MIAO LETTER NYHA"/* 16F2D */,/*43372*/"MIAO LETTER TSHA"/* 16F2E */, /*43373*/"MIAO LETTER DZHA"/* 16F2F */,/*43374*/"MIAO LETTER YI TSHA"/* 16F30 */, /*43375*/"MIAO LETTER YI DZHA"/* 16F31 */,/*43376*/"MIAO LETTER REFORMED TSHA"/* 16F32 */, /*43377*/"MIAO LETTER SHA"/* 16F33 */,/*43378*/"MIAO LETTER SSA"/* 16F34 */,/*43379*/"MIAO LETTER ZHA"/* 16F35 */, /*43380*/"MIAO LETTER ZSHA"/* 16F36 */,/*43381*/"MIAO LETTER TSA"/* 16F37 */,/*43382*/"MIAO LETTER DZA"/* 16F38 */, /*43383*/"MIAO LETTER YI TSA"/* 16F39 */,/*43384*/"MIAO LETTER SA"/* 16F3A */,/*43385*/"MIAO LETTER ZA"/* 16F3B */, /*43386*/"MIAO LETTER ZSA"/* 16F3C */,/*43387*/"MIAO LETTER ZZA"/* 16F3D */,/*43388*/"MIAO LETTER ZZSA"/* 16F3E */, /*43389*/"MIAO LETTER ARCHAIC ZZA"/* 16F3F */,/*43390*/"MIAO LETTER ZZYA"/* 16F40 */, /*43391*/"MIAO LETTER ZZSYA"/* 16F41 */,/*43392*/"MIAO LETTER WA"/* 16F42 */,/*43393*/"MIAO LETTER AH"/* 16F43 */, /*43394*/"MIAO LETTER HHA"/* 16F44 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*43406*/"MIAO LETTER NASALIZATION"/* 16F50 */,/*43407*/"MIAO SIGN ASPIRATION"/* 16F51 */, /*43408*/"MIAO SIGN REFORMED VOICING"/* 16F52 */,/*43409*/"MIAO SIGN REFORMED ASPIRATION"/* 16F53 */, /*43410*/"MIAO VOWEL SIGN A"/* 16F54 */,/*43411*/"MIAO VOWEL SIGN AA"/* 16F55 */, /*43412*/"MIAO VOWEL SIGN AHH"/* 16F56 */,/*43413*/"MIAO VOWEL SIGN AN"/* 16F57 */, /*43414*/"MIAO VOWEL SIGN ANG"/* 16F58 */,/*43415*/"MIAO VOWEL SIGN O"/* 16F59 */, /*43416*/"MIAO VOWEL SIGN OO"/* 16F5A */,/*43417*/"MIAO VOWEL SIGN WO"/* 16F5B */, /*43418*/"MIAO VOWEL SIGN W"/* 16F5C */,/*43419*/"MIAO VOWEL SIGN E"/* 16F5D */,/*43420*/"MIAO VOWEL SIGN EN"/* 16F5E */, /*43421*/"MIAO VOWEL SIGN ENG"/* 16F5F */,/*43422*/"MIAO VOWEL SIGN OEY"/* 16F60 */, /*43423*/"MIAO VOWEL SIGN I"/* 16F61 */,/*43424*/"MIAO VOWEL SIGN IA"/* 16F62 */, /*43425*/"MIAO VOWEL SIGN IAN"/* 16F63 */,/*43426*/"MIAO VOWEL SIGN IANG"/* 16F64 */, /*43427*/"MIAO VOWEL SIGN IO"/* 16F65 */,/*43428*/"MIAO VOWEL SIGN IE"/* 16F66 */, /*43429*/"MIAO VOWEL SIGN II"/* 16F67 */,/*43430*/"MIAO VOWEL SIGN IU"/* 16F68 */, /*43431*/"MIAO VOWEL SIGN ING"/* 16F69 */,/*43432*/"MIAO VOWEL SIGN U"/* 16F6A */, /*43433*/"MIAO VOWEL SIGN UA"/* 16F6B */,/*43434*/"MIAO VOWEL SIGN UAN"/* 16F6C */, /*43435*/"MIAO VOWEL SIGN UANG"/* 16F6D */,/*43436*/"MIAO VOWEL SIGN UU"/* 16F6E */, /*43437*/"MIAO VOWEL SIGN UEI"/* 16F6F */,/*43438*/"MIAO VOWEL SIGN UNG"/* 16F70 */, /*43439*/"MIAO VOWEL SIGN Y"/* 16F71 */,/*43440*/"MIAO VOWEL SIGN YI"/* 16F72 */, /*43441*/"MIAO VOWEL SIGN AE"/* 16F73 */,/*43442*/"MIAO VOWEL SIGN AEE"/* 16F74 */, /*43443*/"MIAO VOWEL SIGN ERR"/* 16F75 */,/*43444*/"MIAO VOWEL SIGN ROUNDED ERR"/* 16F76 */, /*43445*/"MIAO VOWEL SIGN ER"/* 16F77 */,/*43446*/"MIAO VOWEL SIGN ROUNDED ER"/* 16F78 */, /*43447*/"MIAO VOWEL SIGN AI"/* 16F79 */,/*43448*/"MIAO VOWEL SIGN EI"/* 16F7A */, /*43449*/"MIAO VOWEL SIGN AU"/* 16F7B */,/*43450*/"MIAO VOWEL SIGN OU"/* 16F7C */, /*43451*/"MIAO VOWEL SIGN N"/* 16F7D */,/*43452*/"MIAO VOWEL SIGN NG"/* 16F7E */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*43469*/"MIAO TONE RIGHT"/* 16F8F */,/*43470*/"MIAO TONE TOP RIGHT"/* 16F90 */, /*43471*/"MIAO TONE ABOVE"/* 16F91 */,/*43472*/"MIAO TONE BELOW"/* 16F92 */,/*43473*/"MIAO LETTER TONE-2"/* 16F93 */, /*43474*/"MIAO LETTER TONE-3"/* 16F94 */,/*43475*/"MIAO LETTER TONE-4"/* 16F95 */, /*43476*/"MIAO LETTER TONE-5"/* 16F96 */,/*43477*/"MIAO LETTER TONE-6"/* 16F97 */, /*43478*/"MIAO LETTER TONE-7"/* 16F98 */,/*43479*/"MIAO LETTER TONE-8"/* 16F99 */, /*43480*/"MIAO LETTER REFORMED TONE-1"/* 16F9A */,/*43481*/"MIAO LETTER REFORMED TONE-2"/* 16F9B */, /*43482*/"MIAO LETTER REFORMED TONE-4"/* 16F9C */,/*43483*/"MIAO LETTER REFORMED TONE-5"/* 16F9D */, /*43484*/"MIAO LETTER REFORMED TONE-6"/* 16F9E */,/*43485*/"MIAO LETTER REFORMED TONE-8"/* 16F9F */,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*43550*/"TANGUT ITERATION MARK"/* 16FE0 */, /*43551*/"NUSHU ITERATION MARK"/* 16FE1 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*43582*/""/* 17000 */,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*43602*/"TANGUT COMPONENT-001"/* 18800 */,/*43603*/"TANGUT COMPONENT-002"/* 18801 */, /*43604*/"TANGUT COMPONENT-003"/* 18802 */,/*43605*/"TANGUT COMPONENT-004"/* 18803 */, /*43606*/"TANGUT COMPONENT-005"/* 18804 */,/*43607*/"TANGUT COMPONENT-006"/* 18805 */, /*43608*/"TANGUT COMPONENT-007"/* 18806 */,/*43609*/"TANGUT COMPONENT-008"/* 18807 */, /*43610*/"TANGUT COMPONENT-009"/* 18808 */,/*43611*/"TANGUT COMPONENT-010"/* 18809 */, /*43612*/"TANGUT COMPONENT-011"/* 1880A */,/*43613*/"TANGUT COMPONENT-012"/* 1880B */, /*43614*/"TANGUT COMPONENT-013"/* 1880C */,/*43615*/"TANGUT COMPONENT-014"/* 1880D */, /*43616*/"TANGUT COMPONENT-015"/* 1880E */,/*43617*/"TANGUT COMPONENT-016"/* 1880F */, /*43618*/"TANGUT COMPONENT-017"/* 18810 */,/*43619*/"TANGUT COMPONENT-018"/* 18811 */, /*43620*/"TANGUT COMPONENT-019"/* 18812 */,/*43621*/"TANGUT COMPONENT-020"/* 18813 */, /*43622*/"TANGUT COMPONENT-021"/* 18814 */,/*43623*/"TANGUT COMPONENT-022"/* 18815 */, /*43624*/"TANGUT COMPONENT-023"/* 18816 */,/*43625*/"TANGUT COMPONENT-024"/* 18817 */, /*43626*/"TANGUT COMPONENT-025"/* 18818 */,/*43627*/"TANGUT COMPONENT-026"/* 18819 */, /*43628*/"TANGUT COMPONENT-027"/* 1881A */,/*43629*/"TANGUT COMPONENT-028"/* 1881B */, /*43630*/"TANGUT COMPONENT-029"/* 1881C */,/*43631*/"TANGUT COMPONENT-030"/* 1881D */, /*43632*/"TANGUT COMPONENT-031"/* 1881E */,/*43633*/"TANGUT COMPONENT-032"/* 1881F */, /*43634*/"TANGUT COMPONENT-033"/* 18820 */,/*43635*/"TANGUT COMPONENT-034"/* 18821 */, /*43636*/"TANGUT COMPONENT-035"/* 18822 */,/*43637*/"TANGUT COMPONENT-036"/* 18823 */, /*43638*/"TANGUT COMPONENT-037"/* 18824 */,/*43639*/"TANGUT COMPONENT-038"/* 18825 */, /*43640*/"TANGUT COMPONENT-039"/* 18826 */,/*43641*/"TANGUT COMPONENT-040"/* 18827 */, /*43642*/"TANGUT COMPONENT-041"/* 18828 */,/*43643*/"TANGUT COMPONENT-042"/* 18829 */, /*43644*/"TANGUT COMPONENT-043"/* 1882A */,/*43645*/"TANGUT COMPONENT-044"/* 1882B */, /*43646*/"TANGUT COMPONENT-045"/* 1882C */,/*43647*/"TANGUT COMPONENT-046"/* 1882D */, /*43648*/"TANGUT COMPONENT-047"/* 1882E */,/*43649*/"TANGUT COMPONENT-048"/* 1882F */, /*43650*/"TANGUT COMPONENT-049"/* 18830 */,/*43651*/"TANGUT COMPONENT-050"/* 18831 */, /*43652*/"TANGUT COMPONENT-051"/* 18832 */,/*43653*/"TANGUT COMPONENT-052"/* 18833 */, /*43654*/"TANGUT COMPONENT-053"/* 18834 */,/*43655*/"TANGUT COMPONENT-054"/* 18835 */, /*43656*/"TANGUT COMPONENT-055"/* 18836 */,/*43657*/"TANGUT COMPONENT-056"/* 18837 */, /*43658*/"TANGUT COMPONENT-057"/* 18838 */,/*43659*/"TANGUT COMPONENT-058"/* 18839 */, /*43660*/"TANGUT COMPONENT-059"/* 1883A */,/*43661*/"TANGUT COMPONENT-060"/* 1883B */, /*43662*/"TANGUT COMPONENT-061"/* 1883C */,/*43663*/"TANGUT COMPONENT-062"/* 1883D */, /*43664*/"TANGUT COMPONENT-063"/* 1883E */,/*43665*/"TANGUT COMPONENT-064"/* 1883F */, /*43666*/"TANGUT COMPONENT-065"/* 18840 */,/*43667*/"TANGUT COMPONENT-066"/* 18841 */, /*43668*/"TANGUT COMPONENT-067"/* 18842 */,/*43669*/"TANGUT COMPONENT-068"/* 18843 */, /*43670*/"TANGUT COMPONENT-069"/* 18844 */,/*43671*/"TANGUT COMPONENT-070"/* 18845 */, /*43672*/"TANGUT COMPONENT-071"/* 18846 */,/*43673*/"TANGUT COMPONENT-072"/* 18847 */, /*43674*/"TANGUT COMPONENT-073"/* 18848 */,/*43675*/"TANGUT COMPONENT-074"/* 18849 */, /*43676*/"TANGUT COMPONENT-075"/* 1884A */,/*43677*/"TANGUT COMPONENT-076"/* 1884B */, /*43678*/"TANGUT COMPONENT-077"/* 1884C */,/*43679*/"TANGUT COMPONENT-078"/* 1884D */, /*43680*/"TANGUT COMPONENT-079"/* 1884E */,/*43681*/"TANGUT COMPONENT-080"/* 1884F */, /*43682*/"TANGUT COMPONENT-081"/* 18850 */,/*43683*/"TANGUT COMPONENT-082"/* 18851 */, /*43684*/"TANGUT COMPONENT-083"/* 18852 */,/*43685*/"TANGUT COMPONENT-084"/* 18853 */, /*43686*/"TANGUT COMPONENT-085"/* 18854 */,/*43687*/"TANGUT COMPONENT-086"/* 18855 */, /*43688*/"TANGUT COMPONENT-087"/* 18856 */,/*43689*/"TANGUT COMPONENT-088"/* 18857 */, /*43690*/"TANGUT COMPONENT-089"/* 18858 */,/*43691*/"TANGUT COMPONENT-090"/* 18859 */, /*43692*/"TANGUT COMPONENT-091"/* 1885A */,/*43693*/"TANGUT COMPONENT-092"/* 1885B */, /*43694*/"TANGUT COMPONENT-093"/* 1885C */,/*43695*/"TANGUT COMPONENT-094"/* 1885D */, /*43696*/"TANGUT COMPONENT-095"/* 1885E */,/*43697*/"TANGUT COMPONENT-096"/* 1885F */, /*43698*/"TANGUT COMPONENT-097"/* 18860 */,/*43699*/"TANGUT COMPONENT-098"/* 18861 */, /*43700*/"TANGUT COMPONENT-099"/* 18862 */,/*43701*/"TANGUT COMPONENT-100"/* 18863 */, /*43702*/"TANGUT COMPONENT-101"/* 18864 */,/*43703*/"TANGUT COMPONENT-102"/* 18865 */, /*43704*/"TANGUT COMPONENT-103"/* 18866 */,/*43705*/"TANGUT COMPONENT-104"/* 18867 */, /*43706*/"TANGUT COMPONENT-105"/* 18868 */,/*43707*/"TANGUT COMPONENT-106"/* 18869 */, /*43708*/"TANGUT COMPONENT-107"/* 1886A */,/*43709*/"TANGUT COMPONENT-108"/* 1886B */, /*43710*/"TANGUT COMPONENT-109"/* 1886C */,/*43711*/"TANGUT COMPONENT-110"/* 1886D */, /*43712*/"TANGUT COMPONENT-111"/* 1886E */,/*43713*/"TANGUT COMPONENT-112"/* 1886F */, /*43714*/"TANGUT COMPONENT-113"/* 18870 */,/*43715*/"TANGUT COMPONENT-114"/* 18871 */, /*43716*/"TANGUT COMPONENT-115"/* 18872 */,/*43717*/"TANGUT COMPONENT-116"/* 18873 */, /*43718*/"TANGUT COMPONENT-117"/* 18874 */,/*43719*/"TANGUT COMPONENT-118"/* 18875 */, /*43720*/"TANGUT COMPONENT-119"/* 18876 */,/*43721*/"TANGUT COMPONENT-120"/* 18877 */, /*43722*/"TANGUT COMPONENT-121"/* 18878 */,/*43723*/"TANGUT COMPONENT-122"/* 18879 */, /*43724*/"TANGUT COMPONENT-123"/* 1887A */,/*43725*/"TANGUT COMPONENT-124"/* 1887B */, /*43726*/"TANGUT COMPONENT-125"/* 1887C */,/*43727*/"TANGUT COMPONENT-126"/* 1887D */, /*43728*/"TANGUT COMPONENT-127"/* 1887E */,/*43729*/"TANGUT COMPONENT-128"/* 1887F */, /*43730*/"TANGUT COMPONENT-129"/* 18880 */,/*43731*/"TANGUT COMPONENT-130"/* 18881 */, /*43732*/"TANGUT COMPONENT-131"/* 18882 */,/*43733*/"TANGUT COMPONENT-132"/* 18883 */, /*43734*/"TANGUT COMPONENT-133"/* 18884 */,/*43735*/"TANGUT COMPONENT-134"/* 18885 */, /*43736*/"TANGUT COMPONENT-135"/* 18886 */,/*43737*/"TANGUT COMPONENT-136"/* 18887 */, /*43738*/"TANGUT COMPONENT-137"/* 18888 */,/*43739*/"TANGUT COMPONENT-138"/* 18889 */, /*43740*/"TANGUT COMPONENT-139"/* 1888A */,/*43741*/"TANGUT COMPONENT-140"/* 1888B */, /*43742*/"TANGUT COMPONENT-141"/* 1888C */,/*43743*/"TANGUT COMPONENT-142"/* 1888D */, /*43744*/"TANGUT COMPONENT-143"/* 1888E */,/*43745*/"TANGUT COMPONENT-144"/* 1888F */, /*43746*/"TANGUT COMPONENT-145"/* 18890 */,/*43747*/"TANGUT COMPONENT-146"/* 18891 */, /*43748*/"TANGUT COMPONENT-147"/* 18892 */,/*43749*/"TANGUT COMPONENT-148"/* 18893 */, /*43750*/"TANGUT COMPONENT-149"/* 18894 */,/*43751*/"TANGUT COMPONENT-150"/* 18895 */, /*43752*/"TANGUT COMPONENT-151"/* 18896 */,/*43753*/"TANGUT COMPONENT-152"/* 18897 */, /*43754*/"TANGUT COMPONENT-153"/* 18898 */,/*43755*/"TANGUT COMPONENT-154"/* 18899 */, /*43756*/"TANGUT COMPONENT-155"/* 1889A */,/*43757*/"TANGUT COMPONENT-156"/* 1889B */, /*43758*/"TANGUT COMPONENT-157"/* 1889C */,/*43759*/"TANGUT COMPONENT-158"/* 1889D */, /*43760*/"TANGUT COMPONENT-159"/* 1889E */,/*43761*/"TANGUT COMPONENT-160"/* 1889F */, /*43762*/"TANGUT COMPONENT-161"/* 188A0 */,/*43763*/"TANGUT COMPONENT-162"/* 188A1 */, /*43764*/"TANGUT COMPONENT-163"/* 188A2 */,/*43765*/"TANGUT COMPONENT-164"/* 188A3 */, /*43766*/"TANGUT COMPONENT-165"/* 188A4 */,/*43767*/"TANGUT COMPONENT-166"/* 188A5 */, /*43768*/"TANGUT COMPONENT-167"/* 188A6 */,/*43769*/"TANGUT COMPONENT-168"/* 188A7 */, /*43770*/"TANGUT COMPONENT-169"/* 188A8 */,/*43771*/"TANGUT COMPONENT-170"/* 188A9 */, /*43772*/"TANGUT COMPONENT-171"/* 188AA */,/*43773*/"TANGUT COMPONENT-172"/* 188AB */, /*43774*/"TANGUT COMPONENT-173"/* 188AC */,/*43775*/"TANGUT COMPONENT-174"/* 188AD */, /*43776*/"TANGUT COMPONENT-175"/* 188AE */,/*43777*/"TANGUT COMPONENT-176"/* 188AF */, /*43778*/"TANGUT COMPONENT-177"/* 188B0 */,/*43779*/"TANGUT COMPONENT-178"/* 188B1 */, /*43780*/"TANGUT COMPONENT-179"/* 188B2 */,/*43781*/"TANGUT COMPONENT-180"/* 188B3 */, /*43782*/"TANGUT COMPONENT-181"/* 188B4 */,/*43783*/"TANGUT COMPONENT-182"/* 188B5 */, /*43784*/"TANGUT COMPONENT-183"/* 188B6 */,/*43785*/"TANGUT COMPONENT-184"/* 188B7 */, /*43786*/"TANGUT COMPONENT-185"/* 188B8 */,/*43787*/"TANGUT COMPONENT-186"/* 188B9 */, /*43788*/"TANGUT COMPONENT-187"/* 188BA */,/*43789*/"TANGUT COMPONENT-188"/* 188BB */, /*43790*/"TANGUT COMPONENT-189"/* 188BC */,/*43791*/"TANGUT COMPONENT-190"/* 188BD */, /*43792*/"TANGUT COMPONENT-191"/* 188BE */,/*43793*/"TANGUT COMPONENT-192"/* 188BF */, /*43794*/"TANGUT COMPONENT-193"/* 188C0 */,/*43795*/"TANGUT COMPONENT-194"/* 188C1 */, /*43796*/"TANGUT COMPONENT-195"/* 188C2 */,/*43797*/"TANGUT COMPONENT-196"/* 188C3 */, /*43798*/"TANGUT COMPONENT-197"/* 188C4 */,/*43799*/"TANGUT COMPONENT-198"/* 188C5 */, /*43800*/"TANGUT COMPONENT-199"/* 188C6 */,/*43801*/"TANGUT COMPONENT-200"/* 188C7 */, /*43802*/"TANGUT COMPONENT-201"/* 188C8 */,/*43803*/"TANGUT COMPONENT-202"/* 188C9 */, /*43804*/"TANGUT COMPONENT-203"/* 188CA */,/*43805*/"TANGUT COMPONENT-204"/* 188CB */, /*43806*/"TANGUT COMPONENT-205"/* 188CC */,/*43807*/"TANGUT COMPONENT-206"/* 188CD */, /*43808*/"TANGUT COMPONENT-207"/* 188CE */,/*43809*/"TANGUT COMPONENT-208"/* 188CF */, /*43810*/"TANGUT COMPONENT-209"/* 188D0 */,/*43811*/"TANGUT COMPONENT-210"/* 188D1 */, /*43812*/"TANGUT COMPONENT-211"/* 188D2 */,/*43813*/"TANGUT COMPONENT-212"/* 188D3 */, /*43814*/"TANGUT COMPONENT-213"/* 188D4 */,/*43815*/"TANGUT COMPONENT-214"/* 188D5 */, /*43816*/"TANGUT COMPONENT-215"/* 188D6 */,/*43817*/"TANGUT COMPONENT-216"/* 188D7 */, /*43818*/"TANGUT COMPONENT-217"/* 188D8 */,/*43819*/"TANGUT COMPONENT-218"/* 188D9 */, /*43820*/"TANGUT COMPONENT-219"/* 188DA */,/*43821*/"TANGUT COMPONENT-220"/* 188DB */, /*43822*/"TANGUT COMPONENT-221"/* 188DC */,/*43823*/"TANGUT COMPONENT-222"/* 188DD */, /*43824*/"TANGUT COMPONENT-223"/* 188DE */,/*43825*/"TANGUT COMPONENT-224"/* 188DF */, /*43826*/"TANGUT COMPONENT-225"/* 188E0 */,/*43827*/"TANGUT COMPONENT-226"/* 188E1 */, /*43828*/"TANGUT COMPONENT-227"/* 188E2 */,/*43829*/"TANGUT COMPONENT-228"/* 188E3 */, /*43830*/"TANGUT COMPONENT-229"/* 188E4 */,/*43831*/"TANGUT COMPONENT-230"/* 188E5 */, /*43832*/"TANGUT COMPONENT-231"/* 188E6 */,/*43833*/"TANGUT COMPONENT-232"/* 188E7 */, /*43834*/"TANGUT COMPONENT-233"/* 188E8 */,/*43835*/"TANGUT COMPONENT-234"/* 188E9 */, /*43836*/"TANGUT COMPONENT-235"/* 188EA */,/*43837*/"TANGUT COMPONENT-236"/* 188EB */, /*43838*/"TANGUT COMPONENT-237"/* 188EC */,/*43839*/"TANGUT COMPONENT-238"/* 188ED */, /*43840*/"TANGUT COMPONENT-239"/* 188EE */,/*43841*/"TANGUT COMPONENT-240"/* 188EF */, /*43842*/"TANGUT COMPONENT-241"/* 188F0 */,/*43843*/"TANGUT COMPONENT-242"/* 188F1 */, /*43844*/"TANGUT COMPONENT-243"/* 188F2 */,/*43845*/"TANGUT COMPONENT-244"/* 188F3 */, /*43846*/"TANGUT COMPONENT-245"/* 188F4 */,/*43847*/"TANGUT COMPONENT-246"/* 188F5 */, /*43848*/"TANGUT COMPONENT-247"/* 188F6 */,/*43849*/"TANGUT COMPONENT-248"/* 188F7 */, /*43850*/"TANGUT COMPONENT-249"/* 188F8 */,/*43851*/"TANGUT COMPONENT-250"/* 188F9 */, /*43852*/"TANGUT COMPONENT-251"/* 188FA */,/*43853*/"TANGUT COMPONENT-252"/* 188FB */, /*43854*/"TANGUT COMPONENT-253"/* 188FC */,/*43855*/"TANGUT COMPONENT-254"/* 188FD */, /*43856*/"TANGUT COMPONENT-255"/* 188FE */,/*43857*/"TANGUT COMPONENT-256"/* 188FF */, /*43858*/"TANGUT COMPONENT-257"/* 18900 */,/*43859*/"TANGUT COMPONENT-258"/* 18901 */, /*43860*/"TANGUT COMPONENT-259"/* 18902 */,/*43861*/"TANGUT COMPONENT-260"/* 18903 */, /*43862*/"TANGUT COMPONENT-261"/* 18904 */,/*43863*/"TANGUT COMPONENT-262"/* 18905 */, /*43864*/"TANGUT COMPONENT-263"/* 18906 */,/*43865*/"TANGUT COMPONENT-264"/* 18907 */, /*43866*/"TANGUT COMPONENT-265"/* 18908 */,/*43867*/"TANGUT COMPONENT-266"/* 18909 */, /*43868*/"TANGUT COMPONENT-267"/* 1890A */,/*43869*/"TANGUT COMPONENT-268"/* 1890B */, /*43870*/"TANGUT COMPONENT-269"/* 1890C */,/*43871*/"TANGUT COMPONENT-270"/* 1890D */, /*43872*/"TANGUT COMPONENT-271"/* 1890E */,/*43873*/"TANGUT COMPONENT-272"/* 1890F */, /*43874*/"TANGUT COMPONENT-273"/* 18910 */,/*43875*/"TANGUT COMPONENT-274"/* 18911 */, /*43876*/"TANGUT COMPONENT-275"/* 18912 */,/*43877*/"TANGUT COMPONENT-276"/* 18913 */, /*43878*/"TANGUT COMPONENT-277"/* 18914 */,/*43879*/"TANGUT COMPONENT-278"/* 18915 */, /*43880*/"TANGUT COMPONENT-279"/* 18916 */,/*43881*/"TANGUT COMPONENT-280"/* 18917 */, /*43882*/"TANGUT COMPONENT-281"/* 18918 */,/*43883*/"TANGUT COMPONENT-282"/* 18919 */, /*43884*/"TANGUT COMPONENT-283"/* 1891A */,/*43885*/"TANGUT COMPONENT-284"/* 1891B */, /*43886*/"TANGUT COMPONENT-285"/* 1891C */,/*43887*/"TANGUT COMPONENT-286"/* 1891D */, /*43888*/"TANGUT COMPONENT-287"/* 1891E */,/*43889*/"TANGUT COMPONENT-288"/* 1891F */, /*43890*/"TANGUT COMPONENT-289"/* 18920 */,/*43891*/"TANGUT COMPONENT-290"/* 18921 */, /*43892*/"TANGUT COMPONENT-291"/* 18922 */,/*43893*/"TANGUT COMPONENT-292"/* 18923 */, /*43894*/"TANGUT COMPONENT-293"/* 18924 */,/*43895*/"TANGUT COMPONENT-294"/* 18925 */, /*43896*/"TANGUT COMPONENT-295"/* 18926 */,/*43897*/"TANGUT COMPONENT-296"/* 18927 */, /*43898*/"TANGUT COMPONENT-297"/* 18928 */,/*43899*/"TANGUT COMPONENT-298"/* 18929 */, /*43900*/"TANGUT COMPONENT-299"/* 1892A */,/*43901*/"TANGUT COMPONENT-300"/* 1892B */, /*43902*/"TANGUT COMPONENT-301"/* 1892C */,/*43903*/"TANGUT COMPONENT-302"/* 1892D */, /*43904*/"TANGUT COMPONENT-303"/* 1892E */,/*43905*/"TANGUT COMPONENT-304"/* 1892F */, /*43906*/"TANGUT COMPONENT-305"/* 18930 */,/*43907*/"TANGUT COMPONENT-306"/* 18931 */, /*43908*/"TANGUT COMPONENT-307"/* 18932 */,/*43909*/"TANGUT COMPONENT-308"/* 18933 */, /*43910*/"TANGUT COMPONENT-309"/* 18934 */,/*43911*/"TANGUT COMPONENT-310"/* 18935 */, /*43912*/"TANGUT COMPONENT-311"/* 18936 */,/*43913*/"TANGUT COMPONENT-312"/* 18937 */, /*43914*/"TANGUT COMPONENT-313"/* 18938 */,/*43915*/"TANGUT COMPONENT-314"/* 18939 */, /*43916*/"TANGUT COMPONENT-315"/* 1893A */,/*43917*/"TANGUT COMPONENT-316"/* 1893B */, /*43918*/"TANGUT COMPONENT-317"/* 1893C */,/*43919*/"TANGUT COMPONENT-318"/* 1893D */, /*43920*/"TANGUT COMPONENT-319"/* 1893E */,/*43921*/"TANGUT COMPONENT-320"/* 1893F */, /*43922*/"TANGUT COMPONENT-321"/* 18940 */,/*43923*/"TANGUT COMPONENT-322"/* 18941 */, /*43924*/"TANGUT COMPONENT-323"/* 18942 */,/*43925*/"TANGUT COMPONENT-324"/* 18943 */, /*43926*/"TANGUT COMPONENT-325"/* 18944 */,/*43927*/"TANGUT COMPONENT-326"/* 18945 */, /*43928*/"TANGUT COMPONENT-327"/* 18946 */,/*43929*/"TANGUT COMPONENT-328"/* 18947 */, /*43930*/"TANGUT COMPONENT-329"/* 18948 */,/*43931*/"TANGUT COMPONENT-330"/* 18949 */, /*43932*/"TANGUT COMPONENT-331"/* 1894A */,/*43933*/"TANGUT COMPONENT-332"/* 1894B */, /*43934*/"TANGUT COMPONENT-333"/* 1894C */,/*43935*/"TANGUT COMPONENT-334"/* 1894D */, /*43936*/"TANGUT COMPONENT-335"/* 1894E */,/*43937*/"TANGUT COMPONENT-336"/* 1894F */, /*43938*/"TANGUT COMPONENT-337"/* 18950 */,/*43939*/"TANGUT COMPONENT-338"/* 18951 */, /*43940*/"TANGUT COMPONENT-339"/* 18952 */,/*43941*/"TANGUT COMPONENT-340"/* 18953 */, /*43942*/"TANGUT COMPONENT-341"/* 18954 */,/*43943*/"TANGUT COMPONENT-342"/* 18955 */, /*43944*/"TANGUT COMPONENT-343"/* 18956 */,/*43945*/"TANGUT COMPONENT-344"/* 18957 */, /*43946*/"TANGUT COMPONENT-345"/* 18958 */,/*43947*/"TANGUT COMPONENT-346"/* 18959 */, /*43948*/"TANGUT COMPONENT-347"/* 1895A */,/*43949*/"TANGUT COMPONENT-348"/* 1895B */, /*43950*/"TANGUT COMPONENT-349"/* 1895C */,/*43951*/"TANGUT COMPONENT-350"/* 1895D */, /*43952*/"TANGUT COMPONENT-351"/* 1895E */,/*43953*/"TANGUT COMPONENT-352"/* 1895F */, /*43954*/"TANGUT COMPONENT-353"/* 18960 */,/*43955*/"TANGUT COMPONENT-354"/* 18961 */, /*43956*/"TANGUT COMPONENT-355"/* 18962 */,/*43957*/"TANGUT COMPONENT-356"/* 18963 */, /*43958*/"TANGUT COMPONENT-357"/* 18964 */,/*43959*/"TANGUT COMPONENT-358"/* 18965 */, /*43960*/"TANGUT COMPONENT-359"/* 18966 */,/*43961*/"TANGUT COMPONENT-360"/* 18967 */, /*43962*/"TANGUT COMPONENT-361"/* 18968 */,/*43963*/"TANGUT COMPONENT-362"/* 18969 */, /*43964*/"TANGUT COMPONENT-363"/* 1896A */,/*43965*/"TANGUT COMPONENT-364"/* 1896B */, /*43966*/"TANGUT COMPONENT-365"/* 1896C */,/*43967*/"TANGUT COMPONENT-366"/* 1896D */, /*43968*/"TANGUT COMPONENT-367"/* 1896E */,/*43969*/"TANGUT COMPONENT-368"/* 1896F */, /*43970*/"TANGUT COMPONENT-369"/* 18970 */,/*43971*/"TANGUT COMPONENT-370"/* 18971 */, /*43972*/"TANGUT COMPONENT-371"/* 18972 */,/*43973*/"TANGUT COMPONENT-372"/* 18973 */, /*43974*/"TANGUT COMPONENT-373"/* 18974 */,/*43975*/"TANGUT COMPONENT-374"/* 18975 */, /*43976*/"TANGUT COMPONENT-375"/* 18976 */,/*43977*/"TANGUT COMPONENT-376"/* 18977 */, /*43978*/"TANGUT COMPONENT-377"/* 18978 */,/*43979*/"TANGUT COMPONENT-378"/* 18979 */, /*43980*/"TANGUT COMPONENT-379"/* 1897A */,/*43981*/"TANGUT COMPONENT-380"/* 1897B */, /*43982*/"TANGUT COMPONENT-381"/* 1897C */,/*43983*/"TANGUT COMPONENT-382"/* 1897D */, /*43984*/"TANGUT COMPONENT-383"/* 1897E */,/*43985*/"TANGUT COMPONENT-384"/* 1897F */, /*43986*/"TANGUT COMPONENT-385"/* 18980 */,/*43987*/"TANGUT COMPONENT-386"/* 18981 */, /*43988*/"TANGUT COMPONENT-387"/* 18982 */,/*43989*/"TANGUT COMPONENT-388"/* 18983 */, /*43990*/"TANGUT COMPONENT-389"/* 18984 */,/*43991*/"TANGUT COMPONENT-390"/* 18985 */, /*43992*/"TANGUT COMPONENT-391"/* 18986 */,/*43993*/"TANGUT COMPONENT-392"/* 18987 */, /*43994*/"TANGUT COMPONENT-393"/* 18988 */,/*43995*/"TANGUT COMPONENT-394"/* 18989 */, /*43996*/"TANGUT COMPONENT-395"/* 1898A */,/*43997*/"TANGUT COMPONENT-396"/* 1898B */, /*43998*/"TANGUT COMPONENT-397"/* 1898C */,/*43999*/"TANGUT COMPONENT-398"/* 1898D */, /*44000*/"TANGUT COMPONENT-399"/* 1898E */,/*44001*/"TANGUT COMPONENT-400"/* 1898F */, /*44002*/"TANGUT COMPONENT-401"/* 18990 */,/*44003*/"TANGUT COMPONENT-402"/* 18991 */, /*44004*/"TANGUT COMPONENT-403"/* 18992 */,/*44005*/"TANGUT COMPONENT-404"/* 18993 */, /*44006*/"TANGUT COMPONENT-405"/* 18994 */,/*44007*/"TANGUT COMPONENT-406"/* 18995 */, /*44008*/"TANGUT COMPONENT-407"/* 18996 */,/*44009*/"TANGUT COMPONENT-408"/* 18997 */, /*44010*/"TANGUT COMPONENT-409"/* 18998 */,/*44011*/"TANGUT COMPONENT-410"/* 18999 */, /*44012*/"TANGUT COMPONENT-411"/* 1899A */,/*44013*/"TANGUT COMPONENT-412"/* 1899B */, /*44014*/"TANGUT COMPONENT-413"/* 1899C */,/*44015*/"TANGUT COMPONENT-414"/* 1899D */, /*44016*/"TANGUT COMPONENT-415"/* 1899E */,/*44017*/"TANGUT COMPONENT-416"/* 1899F */, /*44018*/"TANGUT COMPONENT-417"/* 189A0 */,/*44019*/"TANGUT COMPONENT-418"/* 189A1 */, /*44020*/"TANGUT COMPONENT-419"/* 189A2 */,/*44021*/"TANGUT COMPONENT-420"/* 189A3 */, /*44022*/"TANGUT COMPONENT-421"/* 189A4 */,/*44023*/"TANGUT COMPONENT-422"/* 189A5 */, /*44024*/"TANGUT COMPONENT-423"/* 189A6 */,/*44025*/"TANGUT COMPONENT-424"/* 189A7 */, /*44026*/"TANGUT COMPONENT-425"/* 189A8 */,/*44027*/"TANGUT COMPONENT-426"/* 189A9 */, /*44028*/"TANGUT COMPONENT-427"/* 189AA */,/*44029*/"TANGUT COMPONENT-428"/* 189AB */, /*44030*/"TANGUT COMPONENT-429"/* 189AC */,/*44031*/"TANGUT COMPONENT-430"/* 189AD */, /*44032*/"TANGUT COMPONENT-431"/* 189AE */,/*44033*/"TANGUT COMPONENT-432"/* 189AF */, /*44034*/"TANGUT COMPONENT-433"/* 189B0 */,/*44035*/"TANGUT COMPONENT-434"/* 189B1 */, /*44036*/"TANGUT COMPONENT-435"/* 189B2 */,/*44037*/"TANGUT COMPONENT-436"/* 189B3 */, /*44038*/"TANGUT COMPONENT-437"/* 189B4 */,/*44039*/"TANGUT COMPONENT-438"/* 189B5 */, /*44040*/"TANGUT COMPONENT-439"/* 189B6 */,/*44041*/"TANGUT COMPONENT-440"/* 189B7 */, /*44042*/"TANGUT COMPONENT-441"/* 189B8 */,/*44043*/"TANGUT COMPONENT-442"/* 189B9 */, /*44044*/"TANGUT COMPONENT-443"/* 189BA */,/*44045*/"TANGUT COMPONENT-444"/* 189BB */, /*44046*/"TANGUT COMPONENT-445"/* 189BC */,/*44047*/"TANGUT COMPONENT-446"/* 189BD */, /*44048*/"TANGUT COMPONENT-447"/* 189BE */,/*44049*/"TANGUT COMPONENT-448"/* 189BF */, /*44050*/"TANGUT COMPONENT-449"/* 189C0 */,/*44051*/"TANGUT COMPONENT-450"/* 189C1 */, /*44052*/"TANGUT COMPONENT-451"/* 189C2 */,/*44053*/"TANGUT COMPONENT-452"/* 189C3 */, /*44054*/"TANGUT COMPONENT-453"/* 189C4 */,/*44055*/"TANGUT COMPONENT-454"/* 189C5 */, /*44056*/"TANGUT COMPONENT-455"/* 189C6 */,/*44057*/"TANGUT COMPONENT-456"/* 189C7 */, /*44058*/"TANGUT COMPONENT-457"/* 189C8 */,/*44059*/"TANGUT COMPONENT-458"/* 189C9 */, /*44060*/"TANGUT COMPONENT-459"/* 189CA */,/*44061*/"TANGUT COMPONENT-460"/* 189CB */, /*44062*/"TANGUT COMPONENT-461"/* 189CC */,/*44063*/"TANGUT COMPONENT-462"/* 189CD */, /*44064*/"TANGUT COMPONENT-463"/* 189CE */,/*44065*/"TANGUT COMPONENT-464"/* 189CF */, /*44066*/"TANGUT COMPONENT-465"/* 189D0 */,/*44067*/"TANGUT COMPONENT-466"/* 189D1 */, /*44068*/"TANGUT COMPONENT-467"/* 189D2 */,/*44069*/"TANGUT COMPONENT-468"/* 189D3 */, /*44070*/"TANGUT COMPONENT-469"/* 189D4 */,/*44071*/"TANGUT COMPONENT-470"/* 189D5 */, /*44072*/"TANGUT COMPONENT-471"/* 189D6 */,/*44073*/"TANGUT COMPONENT-472"/* 189D7 */, /*44074*/"TANGUT COMPONENT-473"/* 189D8 */,/*44075*/"TANGUT COMPONENT-474"/* 189D9 */, /*44076*/"TANGUT COMPONENT-475"/* 189DA */,/*44077*/"TANGUT COMPONENT-476"/* 189DB */, /*44078*/"TANGUT COMPONENT-477"/* 189DC */,/*44079*/"TANGUT COMPONENT-478"/* 189DD */, /*44080*/"TANGUT COMPONENT-479"/* 189DE */,/*44081*/"TANGUT COMPONENT-480"/* 189DF */, /*44082*/"TANGUT COMPONENT-481"/* 189E0 */,/*44083*/"TANGUT COMPONENT-482"/* 189E1 */, /*44084*/"TANGUT COMPONENT-483"/* 189E2 */,/*44085*/"TANGUT COMPONENT-484"/* 189E3 */, /*44086*/"TANGUT COMPONENT-485"/* 189E4 */,/*44087*/"TANGUT COMPONENT-486"/* 189E5 */, /*44088*/"TANGUT COMPONENT-487"/* 189E6 */,/*44089*/"TANGUT COMPONENT-488"/* 189E7 */, /*44090*/"TANGUT COMPONENT-489"/* 189E8 */,/*44091*/"TANGUT COMPONENT-490"/* 189E9 */, /*44092*/"TANGUT COMPONENT-491"/* 189EA */,/*44093*/"TANGUT COMPONENT-492"/* 189EB */, /*44094*/"TANGUT COMPONENT-493"/* 189EC */,/*44095*/"TANGUT COMPONENT-494"/* 189ED */, /*44096*/"TANGUT COMPONENT-495"/* 189EE */,/*44097*/"TANGUT COMPONENT-496"/* 189EF */, /*44098*/"TANGUT COMPONENT-497"/* 189F0 */,/*44099*/"TANGUT COMPONENT-498"/* 189F1 */, /*44100*/"TANGUT COMPONENT-499"/* 189F2 */,/*44101*/"TANGUT COMPONENT-500"/* 189F3 */, /*44102*/"TANGUT COMPONENT-501"/* 189F4 */,/*44103*/"TANGUT COMPONENT-502"/* 189F5 */, /*44104*/"TANGUT COMPONENT-503"/* 189F6 */,/*44105*/"TANGUT COMPONENT-504"/* 189F7 */, /*44106*/"TANGUT COMPONENT-505"/* 189F8 */,/*44107*/"TANGUT COMPONENT-506"/* 189F9 */, /*44108*/"TANGUT COMPONENT-507"/* 189FA */,/*44109*/"TANGUT COMPONENT-508"/* 189FB */, /*44110*/"TANGUT COMPONENT-509"/* 189FC */,/*44111*/"TANGUT COMPONENT-510"/* 189FD */, /*44112*/"TANGUT COMPONENT-511"/* 189FE */,/*44113*/"TANGUT COMPONENT-512"/* 189FF */, /*44114*/"TANGUT COMPONENT-513"/* 18A00 */,/*44115*/"TANGUT COMPONENT-514"/* 18A01 */, /*44116*/"TANGUT COMPONENT-515"/* 18A02 */,/*44117*/"TANGUT COMPONENT-516"/* 18A03 */, /*44118*/"TANGUT COMPONENT-517"/* 18A04 */,/*44119*/"TANGUT COMPONENT-518"/* 18A05 */, /*44120*/"TANGUT COMPONENT-519"/* 18A06 */,/*44121*/"TANGUT COMPONENT-520"/* 18A07 */, /*44122*/"TANGUT COMPONENT-521"/* 18A08 */,/*44123*/"TANGUT COMPONENT-522"/* 18A09 */, /*44124*/"TANGUT COMPONENT-523"/* 18A0A */,/*44125*/"TANGUT COMPONENT-524"/* 18A0B */, /*44126*/"TANGUT COMPONENT-525"/* 18A0C */,/*44127*/"TANGUT COMPONENT-526"/* 18A0D */, /*44128*/"TANGUT COMPONENT-527"/* 18A0E */,/*44129*/"TANGUT COMPONENT-528"/* 18A0F */, /*44130*/"TANGUT COMPONENT-529"/* 18A10 */,/*44131*/"TANGUT COMPONENT-530"/* 18A11 */, /*44132*/"TANGUT COMPONENT-531"/* 18A12 */,/*44133*/"TANGUT COMPONENT-532"/* 18A13 */, /*44134*/"TANGUT COMPONENT-533"/* 18A14 */,/*44135*/"TANGUT COMPONENT-534"/* 18A15 */, /*44136*/"TANGUT COMPONENT-535"/* 18A16 */,/*44137*/"TANGUT COMPONENT-536"/* 18A17 */, /*44138*/"TANGUT COMPONENT-537"/* 18A18 */,/*44139*/"TANGUT COMPONENT-538"/* 18A19 */, /*44140*/"TANGUT COMPONENT-539"/* 18A1A */,/*44141*/"TANGUT COMPONENT-540"/* 18A1B */, /*44142*/"TANGUT COMPONENT-541"/* 18A1C */,/*44143*/"TANGUT COMPONENT-542"/* 18A1D */, /*44144*/"TANGUT COMPONENT-543"/* 18A1E */,/*44145*/"TANGUT COMPONENT-544"/* 18A1F */, /*44146*/"TANGUT COMPONENT-545"/* 18A20 */,/*44147*/"TANGUT COMPONENT-546"/* 18A21 */, /*44148*/"TANGUT COMPONENT-547"/* 18A22 */,/*44149*/"TANGUT COMPONENT-548"/* 18A23 */, /*44150*/"TANGUT COMPONENT-549"/* 18A24 */,/*44151*/"TANGUT COMPONENT-550"/* 18A25 */, /*44152*/"TANGUT COMPONENT-551"/* 18A26 */,/*44153*/"TANGUT COMPONENT-552"/* 18A27 */, /*44154*/"TANGUT COMPONENT-553"/* 18A28 */,/*44155*/"TANGUT COMPONENT-554"/* 18A29 */, /*44156*/"TANGUT COMPONENT-555"/* 18A2A */,/*44157*/"TANGUT COMPONENT-556"/* 18A2B */, /*44158*/"TANGUT COMPONENT-557"/* 18A2C */,/*44159*/"TANGUT COMPONENT-558"/* 18A2D */, /*44160*/"TANGUT COMPONENT-559"/* 18A2E */,/*44161*/"TANGUT COMPONENT-560"/* 18A2F */, /*44162*/"TANGUT COMPONENT-561"/* 18A30 */,/*44163*/"TANGUT COMPONENT-562"/* 18A31 */, /*44164*/"TANGUT COMPONENT-563"/* 18A32 */,/*44165*/"TANGUT COMPONENT-564"/* 18A33 */, /*44166*/"TANGUT COMPONENT-565"/* 18A34 */,/*44167*/"TANGUT COMPONENT-566"/* 18A35 */, /*44168*/"TANGUT COMPONENT-567"/* 18A36 */,/*44169*/"TANGUT COMPONENT-568"/* 18A37 */, /*44170*/"TANGUT COMPONENT-569"/* 18A38 */,/*44171*/"TANGUT COMPONENT-570"/* 18A39 */, /*44172*/"TANGUT COMPONENT-571"/* 18A3A */,/*44173*/"TANGUT COMPONENT-572"/* 18A3B */, /*44174*/"TANGUT COMPONENT-573"/* 18A3C */,/*44175*/"TANGUT COMPONENT-574"/* 18A3D */, /*44176*/"TANGUT COMPONENT-575"/* 18A3E */,/*44177*/"TANGUT COMPONENT-576"/* 18A3F */, /*44178*/"TANGUT COMPONENT-577"/* 18A40 */,/*44179*/"TANGUT COMPONENT-578"/* 18A41 */, /*44180*/"TANGUT COMPONENT-579"/* 18A42 */,/*44181*/"TANGUT COMPONENT-580"/* 18A43 */, /*44182*/"TANGUT COMPONENT-581"/* 18A44 */,/*44183*/"TANGUT COMPONENT-582"/* 18A45 */, /*44184*/"TANGUT COMPONENT-583"/* 18A46 */,/*44185*/"TANGUT COMPONENT-584"/* 18A47 */, /*44186*/"TANGUT COMPONENT-585"/* 18A48 */,/*44187*/"TANGUT COMPONENT-586"/* 18A49 */, /*44188*/"TANGUT COMPONENT-587"/* 18A4A */,/*44189*/"TANGUT COMPONENT-588"/* 18A4B */, /*44190*/"TANGUT COMPONENT-589"/* 18A4C */,/*44191*/"TANGUT COMPONENT-590"/* 18A4D */, /*44192*/"TANGUT COMPONENT-591"/* 18A4E */,/*44193*/"TANGUT COMPONENT-592"/* 18A4F */, /*44194*/"TANGUT COMPONENT-593"/* 18A50 */,/*44195*/"TANGUT COMPONENT-594"/* 18A51 */, /*44196*/"TANGUT COMPONENT-595"/* 18A52 */,/*44197*/"TANGUT COMPONENT-596"/* 18A53 */, /*44198*/"TANGUT COMPONENT-597"/* 18A54 */,/*44199*/"TANGUT COMPONENT-598"/* 18A55 */, /*44200*/"TANGUT COMPONENT-599"/* 18A56 */,/*44201*/"TANGUT COMPONENT-600"/* 18A57 */, /*44202*/"TANGUT COMPONENT-601"/* 18A58 */,/*44203*/"TANGUT COMPONENT-602"/* 18A59 */, /*44204*/"TANGUT COMPONENT-603"/* 18A5A */,/*44205*/"TANGUT COMPONENT-604"/* 18A5B */, /*44206*/"TANGUT COMPONENT-605"/* 18A5C */,/*44207*/"TANGUT COMPONENT-606"/* 18A5D */, /*44208*/"TANGUT COMPONENT-607"/* 18A5E */,/*44209*/"TANGUT COMPONENT-608"/* 18A5F */, /*44210*/"TANGUT COMPONENT-609"/* 18A60 */,/*44211*/"TANGUT COMPONENT-610"/* 18A61 */, /*44212*/"TANGUT COMPONENT-611"/* 18A62 */,/*44213*/"TANGUT COMPONENT-612"/* 18A63 */, /*44214*/"TANGUT COMPONENT-613"/* 18A64 */,/*44215*/"TANGUT COMPONENT-614"/* 18A65 */, /*44216*/"TANGUT COMPONENT-615"/* 18A66 */,/*44217*/"TANGUT COMPONENT-616"/* 18A67 */, /*44218*/"TANGUT COMPONENT-617"/* 18A68 */,/*44219*/"TANGUT COMPONENT-618"/* 18A69 */, /*44220*/"TANGUT COMPONENT-619"/* 18A6A */,/*44221*/"TANGUT COMPONENT-620"/* 18A6B */, /*44222*/"TANGUT COMPONENT-621"/* 18A6C */,/*44223*/"TANGUT COMPONENT-622"/* 18A6D */, /*44224*/"TANGUT COMPONENT-623"/* 18A6E */,/*44225*/"TANGUT COMPONENT-624"/* 18A6F */, /*44226*/"TANGUT COMPONENT-625"/* 18A70 */,/*44227*/"TANGUT COMPONENT-626"/* 18A71 */, /*44228*/"TANGUT COMPONENT-627"/* 18A72 */,/*44229*/"TANGUT COMPONENT-628"/* 18A73 */, /*44230*/"TANGUT COMPONENT-629"/* 18A74 */,/*44231*/"TANGUT COMPONENT-630"/* 18A75 */, /*44232*/"TANGUT COMPONENT-631"/* 18A76 */,/*44233*/"TANGUT COMPONENT-632"/* 18A77 */, /*44234*/"TANGUT COMPONENT-633"/* 18A78 */,/*44235*/"TANGUT COMPONENT-634"/* 18A79 */, /*44236*/"TANGUT COMPONENT-635"/* 18A7A */,/*44237*/"TANGUT COMPONENT-636"/* 18A7B */, /*44238*/"TANGUT COMPONENT-637"/* 18A7C */,/*44239*/"TANGUT COMPONENT-638"/* 18A7D */, /*44240*/"TANGUT COMPONENT-639"/* 18A7E */,/*44241*/"TANGUT COMPONENT-640"/* 18A7F */, /*44242*/"TANGUT COMPONENT-641"/* 18A80 */,/*44243*/"TANGUT COMPONENT-642"/* 18A81 */, /*44244*/"TANGUT COMPONENT-643"/* 18A82 */,/*44245*/"TANGUT COMPONENT-644"/* 18A83 */, /*44246*/"TANGUT COMPONENT-645"/* 18A84 */,/*44247*/"TANGUT COMPONENT-646"/* 18A85 */, /*44248*/"TANGUT COMPONENT-647"/* 18A86 */,/*44249*/"TANGUT COMPONENT-648"/* 18A87 */, /*44250*/"TANGUT COMPONENT-649"/* 18A88 */,/*44251*/"TANGUT COMPONENT-650"/* 18A89 */, /*44252*/"TANGUT COMPONENT-651"/* 18A8A */,/*44253*/"TANGUT COMPONENT-652"/* 18A8B */, /*44254*/"TANGUT COMPONENT-653"/* 18A8C */,/*44255*/"TANGUT COMPONENT-654"/* 18A8D */, /*44256*/"TANGUT COMPONENT-655"/* 18A8E */,/*44257*/"TANGUT COMPONENT-656"/* 18A8F */, /*44258*/"TANGUT COMPONENT-657"/* 18A90 */,/*44259*/"TANGUT COMPONENT-658"/* 18A91 */, /*44260*/"TANGUT COMPONENT-659"/* 18A92 */,/*44261*/"TANGUT COMPONENT-660"/* 18A93 */, /*44262*/"TANGUT COMPONENT-661"/* 18A94 */,/*44263*/"TANGUT COMPONENT-662"/* 18A95 */, /*44264*/"TANGUT COMPONENT-663"/* 18A96 */,/*44265*/"TANGUT COMPONENT-664"/* 18A97 */, /*44266*/"TANGUT COMPONENT-665"/* 18A98 */,/*44267*/"TANGUT COMPONENT-666"/* 18A99 */, /*44268*/"TANGUT COMPONENT-667"/* 18A9A */,/*44269*/"TANGUT COMPONENT-668"/* 18A9B */, /*44270*/"TANGUT COMPONENT-669"/* 18A9C */,/*44271*/"TANGUT COMPONENT-670"/* 18A9D */, /*44272*/"TANGUT COMPONENT-671"/* 18A9E */,/*44273*/"TANGUT COMPONENT-672"/* 18A9F */, /*44274*/"TANGUT COMPONENT-673"/* 18AA0 */,/*44275*/"TANGUT COMPONENT-674"/* 18AA1 */, /*44276*/"TANGUT COMPONENT-675"/* 18AA2 */,/*44277*/"TANGUT COMPONENT-676"/* 18AA3 */, /*44278*/"TANGUT COMPONENT-677"/* 18AA4 */,/*44279*/"TANGUT COMPONENT-678"/* 18AA5 */, /*44280*/"TANGUT COMPONENT-679"/* 18AA6 */,/*44281*/"TANGUT COMPONENT-680"/* 18AA7 */, /*44282*/"TANGUT COMPONENT-681"/* 18AA8 */,/*44283*/"TANGUT COMPONENT-682"/* 18AA9 */, /*44284*/"TANGUT COMPONENT-683"/* 18AAA */,/*44285*/"TANGUT COMPONENT-684"/* 18AAB */, /*44286*/"TANGUT COMPONENT-685"/* 18AAC */,/*44287*/"TANGUT COMPONENT-686"/* 18AAD */, /*44288*/"TANGUT COMPONENT-687"/* 18AAE */,/*44289*/"TANGUT COMPONENT-688"/* 18AAF */, /*44290*/"TANGUT COMPONENT-689"/* 18AB0 */,/*44291*/"TANGUT COMPONENT-690"/* 18AB1 */, /*44292*/"TANGUT COMPONENT-691"/* 18AB2 */,/*44293*/"TANGUT COMPONENT-692"/* 18AB3 */, /*44294*/"TANGUT COMPONENT-693"/* 18AB4 */,/*44295*/"TANGUT COMPONENT-694"/* 18AB5 */, /*44296*/"TANGUT COMPONENT-695"/* 18AB6 */,/*44297*/"TANGUT COMPONENT-696"/* 18AB7 */, /*44298*/"TANGUT COMPONENT-697"/* 18AB8 */,/*44299*/"TANGUT COMPONENT-698"/* 18AB9 */, /*44300*/"TANGUT COMPONENT-699"/* 18ABA */,/*44301*/"TANGUT COMPONENT-700"/* 18ABB */, /*44302*/"TANGUT COMPONENT-701"/* 18ABC */,/*44303*/"TANGUT COMPONENT-702"/* 18ABD */, /*44304*/"TANGUT COMPONENT-703"/* 18ABE */,/*44305*/"TANGUT COMPONENT-704"/* 18ABF */, /*44306*/"TANGUT COMPONENT-705"/* 18AC0 */,/*44307*/"TANGUT COMPONENT-706"/* 18AC1 */, /*44308*/"TANGUT COMPONENT-707"/* 18AC2 */,/*44309*/"TANGUT COMPONENT-708"/* 18AC3 */, /*44310*/"TANGUT COMPONENT-709"/* 18AC4 */,/*44311*/"TANGUT COMPONENT-710"/* 18AC5 */, /*44312*/"TANGUT COMPONENT-711"/* 18AC6 */,/*44313*/"TANGUT COMPONENT-712"/* 18AC7 */, /*44314*/"TANGUT COMPONENT-713"/* 18AC8 */,/*44315*/"TANGUT COMPONENT-714"/* 18AC9 */, /*44316*/"TANGUT COMPONENT-715"/* 18ACA */,/*44317*/"TANGUT COMPONENT-716"/* 18ACB */, /*44318*/"TANGUT COMPONENT-717"/* 18ACC */,/*44319*/"TANGUT COMPONENT-718"/* 18ACD */, /*44320*/"TANGUT COMPONENT-719"/* 18ACE */,/*44321*/"TANGUT COMPONENT-720"/* 18ACF */, /*44322*/"TANGUT COMPONENT-721"/* 18AD0 */,/*44323*/"TANGUT COMPONENT-722"/* 18AD1 */, /*44324*/"TANGUT COMPONENT-723"/* 18AD2 */,/*44325*/"TANGUT COMPONENT-724"/* 18AD3 */, /*44326*/"TANGUT COMPONENT-725"/* 18AD4 */,/*44327*/"TANGUT COMPONENT-726"/* 18AD5 */, /*44328*/"TANGUT COMPONENT-727"/* 18AD6 */,/*44329*/"TANGUT COMPONENT-728"/* 18AD7 */, /*44330*/"TANGUT COMPONENT-729"/* 18AD8 */,/*44331*/"TANGUT COMPONENT-730"/* 18AD9 */, /*44332*/"TANGUT COMPONENT-731"/* 18ADA */,/*44333*/"TANGUT COMPONENT-732"/* 18ADB */, /*44334*/"TANGUT COMPONENT-733"/* 18ADC */,/*44335*/"TANGUT COMPONENT-734"/* 18ADD */, /*44336*/"TANGUT COMPONENT-735"/* 18ADE */,/*44337*/"TANGUT COMPONENT-736"/* 18ADF */, /*44338*/"TANGUT COMPONENT-737"/* 18AE0 */,/*44339*/"TANGUT COMPONENT-738"/* 18AE1 */, /*44340*/"TANGUT COMPONENT-739"/* 18AE2 */,/*44341*/"TANGUT COMPONENT-740"/* 18AE3 */, /*44342*/"TANGUT COMPONENT-741"/* 18AE4 */,/*44343*/"TANGUT COMPONENT-742"/* 18AE5 */, /*44344*/"TANGUT COMPONENT-743"/* 18AE6 */,/*44345*/"TANGUT COMPONENT-744"/* 18AE7 */, /*44346*/"TANGUT COMPONENT-745"/* 18AE8 */,/*44347*/"TANGUT COMPONENT-746"/* 18AE9 */, /*44348*/"TANGUT COMPONENT-747"/* 18AEA */,/*44349*/"TANGUT COMPONENT-748"/* 18AEB */, /*44350*/"TANGUT COMPONENT-749"/* 18AEC */,/*44351*/"TANGUT COMPONENT-750"/* 18AED */, /*44352*/"TANGUT COMPONENT-751"/* 18AEE */,/*44353*/"TANGUT COMPONENT-752"/* 18AEF */, /*44354*/"TANGUT COMPONENT-753"/* 18AF0 */,/*44355*/"TANGUT COMPONENT-754"/* 18AF1 */, /*44356*/"TANGUT COMPONENT-755"/* 18AF2 */,/*44357*/"KATAKANA LETTER ARCHAIC E"/* 1B000 */, /*44358*/"HIRAGANA LETTER ARCHAIC YE"/* 1B001 */,/*44359*/"HENTAIGANA LETTER A-1"/* 1B002 */, /*44360*/"HENTAIGANA LETTER A-2"/* 1B003 */,/*44361*/"HENTAIGANA LETTER A-3"/* 1B004 */, /*44362*/"HENTAIGANA LETTER A-WO"/* 1B005 */,/*44363*/"HENTAIGANA LETTER I-1"/* 1B006 */, /*44364*/"HENTAIGANA LETTER I-2"/* 1B007 */,/*44365*/"HENTAIGANA LETTER I-3"/* 1B008 */, /*44366*/"HENTAIGANA LETTER I-4"/* 1B009 */,/*44367*/"HENTAIGANA LETTER U-1"/* 1B00A */, /*44368*/"HENTAIGANA LETTER U-2"/* 1B00B */,/*44369*/"HENTAIGANA LETTER U-3"/* 1B00C */, /*44370*/"HENTAIGANA LETTER U-4"/* 1B00D */,/*44371*/"HENTAIGANA LETTER U-5"/* 1B00E */, /*44372*/"HENTAIGANA LETTER E-2"/* 1B00F */,/*44373*/"HENTAIGANA LETTER E-3"/* 1B010 */, /*44374*/"HENTAIGANA LETTER E-4"/* 1B011 */,/*44375*/"HENTAIGANA LETTER E-5"/* 1B012 */, /*44376*/"HENTAIGANA LETTER E-6"/* 1B013 */,/*44377*/"HENTAIGANA LETTER O-1"/* 1B014 */, /*44378*/"HENTAIGANA LETTER O-2"/* 1B015 */,/*44379*/"HENTAIGANA LETTER O-3"/* 1B016 */, /*44380*/"HENTAIGANA LETTER KA-1"/* 1B017 */,/*44381*/"HENTAIGANA LETTER KA-2"/* 1B018 */, /*44382*/"HENTAIGANA LETTER KA-3"/* 1B019 */,/*44383*/"HENTAIGANA LETTER KA-4"/* 1B01A */, /*44384*/"HENTAIGANA LETTER KA-5"/* 1B01B */,/*44385*/"HENTAIGANA LETTER KA-6"/* 1B01C */, /*44386*/"HENTAIGANA LETTER KA-7"/* 1B01D */,/*44387*/"HENTAIGANA LETTER KA-8"/* 1B01E */, /*44388*/"HENTAIGANA LETTER KA-9"/* 1B01F */,/*44389*/"HENTAIGANA LETTER KA-10"/* 1B020 */, /*44390*/"HENTAIGANA LETTER KA-11"/* 1B021 */,/*44391*/"HENTAIGANA LETTER KA-KE"/* 1B022 */, /*44392*/"HENTAIGANA LETTER KI-1"/* 1B023 */,/*44393*/"HENTAIGANA LETTER KI-2"/* 1B024 */, /*44394*/"HENTAIGANA LETTER KI-3"/* 1B025 */,/*44395*/"HENTAIGANA LETTER KI-4"/* 1B026 */, /*44396*/"HENTAIGANA LETTER KI-5"/* 1B027 */,/*44397*/"HENTAIGANA LETTER KI-6"/* 1B028 */, /*44398*/"HENTAIGANA LETTER KI-7"/* 1B029 */,/*44399*/"HENTAIGANA LETTER KI-8"/* 1B02A */, /*44400*/"HENTAIGANA LETTER KU-1"/* 1B02B */,/*44401*/"HENTAIGANA LETTER KU-2"/* 1B02C */, /*44402*/"HENTAIGANA LETTER KU-3"/* 1B02D */,/*44403*/"HENTAIGANA LETTER KU-4"/* 1B02E */, /*44404*/"HENTAIGANA LETTER KU-5"/* 1B02F */,/*44405*/"HENTAIGANA LETTER KU-6"/* 1B030 */, /*44406*/"HENTAIGANA LETTER KU-7"/* 1B031 */,/*44407*/"HENTAIGANA LETTER KE-1"/* 1B032 */, /*44408*/"HENTAIGANA LETTER KE-2"/* 1B033 */,/*44409*/"HENTAIGANA LETTER KE-3"/* 1B034 */, /*44410*/"HENTAIGANA LETTER KE-4"/* 1B035 */,/*44411*/"HENTAIGANA LETTER KE-5"/* 1B036 */, /*44412*/"HENTAIGANA LETTER KE-6"/* 1B037 */,/*44413*/"HENTAIGANA LETTER KO-1"/* 1B038 */, /*44414*/"HENTAIGANA LETTER KO-2"/* 1B039 */,/*44415*/"HENTAIGANA LETTER KO-3"/* 1B03A */, /*44416*/"HENTAIGANA LETTER KO-KI"/* 1B03B */,/*44417*/"HENTAIGANA LETTER SA-1"/* 1B03C */, /*44418*/"HENTAIGANA LETTER SA-2"/* 1B03D */,/*44419*/"HENTAIGANA LETTER SA-3"/* 1B03E */, /*44420*/"HENTAIGANA LETTER SA-4"/* 1B03F */,/*44421*/"HENTAIGANA LETTER SA-5"/* 1B040 */, /*44422*/"HENTAIGANA LETTER SA-6"/* 1B041 */,/*44423*/"HENTAIGANA LETTER SA-7"/* 1B042 */, /*44424*/"HENTAIGANA LETTER SA-8"/* 1B043 */,/*44425*/"HENTAIGANA LETTER SI-1"/* 1B044 */, /*44426*/"HENTAIGANA LETTER SI-2"/* 1B045 */,/*44427*/"HENTAIGANA LETTER SI-3"/* 1B046 */, /*44428*/"HENTAIGANA LETTER SI-4"/* 1B047 */,/*44429*/"HENTAIGANA LETTER SI-5"/* 1B048 */, /*44430*/"HENTAIGANA LETTER SI-6"/* 1B049 */,/*44431*/"HENTAIGANA LETTER SU-1"/* 1B04A */, /*44432*/"HENTAIGANA LETTER SU-2"/* 1B04B */,/*44433*/"HENTAIGANA LETTER SU-3"/* 1B04C */, /*44434*/"HENTAIGANA LETTER SU-4"/* 1B04D */,/*44435*/"HENTAIGANA LETTER SU-5"/* 1B04E */, /*44436*/"HENTAIGANA LETTER SU-6"/* 1B04F */,/*44437*/"HENTAIGANA LETTER SU-7"/* 1B050 */, /*44438*/"HENTAIGANA LETTER SU-8"/* 1B051 */,/*44439*/"HENTAIGANA LETTER SE-1"/* 1B052 */, /*44440*/"HENTAIGANA LETTER SE-2"/* 1B053 */,/*44441*/"HENTAIGANA LETTER SE-3"/* 1B054 */, /*44442*/"HENTAIGANA LETTER SE-4"/* 1B055 */,/*44443*/"HENTAIGANA LETTER SE-5"/* 1B056 */, /*44444*/"HENTAIGANA LETTER SO-1"/* 1B057 */,/*44445*/"HENTAIGANA LETTER SO-2"/* 1B058 */, /*44446*/"HENTAIGANA LETTER SO-3"/* 1B059 */,/*44447*/"HENTAIGANA LETTER SO-4"/* 1B05A */, /*44448*/"HENTAIGANA LETTER SO-5"/* 1B05B */,/*44449*/"HENTAIGANA LETTER SO-6"/* 1B05C */, /*44450*/"HENTAIGANA LETTER SO-7"/* 1B05D */,/*44451*/"HENTAIGANA LETTER TA-1"/* 1B05E */, /*44452*/"HENTAIGANA LETTER TA-2"/* 1B05F */,/*44453*/"HENTAIGANA LETTER TA-3"/* 1B060 */, /*44454*/"HENTAIGANA LETTER TA-4"/* 1B061 */,/*44455*/"HENTAIGANA LETTER TI-1"/* 1B062 */, /*44456*/"HENTAIGANA LETTER TI-2"/* 1B063 */,/*44457*/"HENTAIGANA LETTER TI-3"/* 1B064 */, /*44458*/"HENTAIGANA LETTER TI-4"/* 1B065 */,/*44459*/"HENTAIGANA LETTER TI-5"/* 1B066 */, /*44460*/"HENTAIGANA LETTER TI-6"/* 1B067 */,/*44461*/"HENTAIGANA LETTER TI-7"/* 1B068 */, /*44462*/"HENTAIGANA LETTER TU-1"/* 1B069 */,/*44463*/"HENTAIGANA LETTER TU-2"/* 1B06A */, /*44464*/"HENTAIGANA LETTER TU-3"/* 1B06B */,/*44465*/"HENTAIGANA LETTER TU-4"/* 1B06C */, /*44466*/"HENTAIGANA LETTER TU-TO"/* 1B06D */,/*44467*/"HENTAIGANA LETTER TE-1"/* 1B06E */, /*44468*/"HENTAIGANA LETTER TE-2"/* 1B06F */,/*44469*/"HENTAIGANA LETTER TE-3"/* 1B070 */, /*44470*/"HENTAIGANA LETTER TE-4"/* 1B071 */,/*44471*/"HENTAIGANA LETTER TE-5"/* 1B072 */, /*44472*/"HENTAIGANA LETTER TE-6"/* 1B073 */,/*44473*/"HENTAIGANA LETTER TE-7"/* 1B074 */, /*44474*/"HENTAIGANA LETTER TE-8"/* 1B075 */,/*44475*/"HENTAIGANA LETTER TE-9"/* 1B076 */, /*44476*/"HENTAIGANA LETTER TO-1"/* 1B077 */,/*44477*/"HENTAIGANA LETTER TO-2"/* 1B078 */, /*44478*/"HENTAIGANA LETTER TO-3"/* 1B079 */,/*44479*/"HENTAIGANA LETTER TO-4"/* 1B07A */, /*44480*/"HENTAIGANA LETTER TO-5"/* 1B07B */,/*44481*/"HENTAIGANA LETTER TO-6"/* 1B07C */, /*44482*/"HENTAIGANA LETTER TO-RA"/* 1B07D */,/*44483*/"HENTAIGANA LETTER NA-1"/* 1B07E */, /*44484*/"HENTAIGANA LETTER NA-2"/* 1B07F */,/*44485*/"HENTAIGANA LETTER NA-3"/* 1B080 */, /*44486*/"HENTAIGANA LETTER NA-4"/* 1B081 */,/*44487*/"HENTAIGANA LETTER NA-5"/* 1B082 */, /*44488*/"HENTAIGANA LETTER NA-6"/* 1B083 */,/*44489*/"HENTAIGANA LETTER NA-7"/* 1B084 */, /*44490*/"HENTAIGANA LETTER NA-8"/* 1B085 */,/*44491*/"HENTAIGANA LETTER NA-9"/* 1B086 */, /*44492*/"HENTAIGANA LETTER NI-1"/* 1B087 */,/*44493*/"HENTAIGANA LETTER NI-2"/* 1B088 */, /*44494*/"HENTAIGANA LETTER NI-3"/* 1B089 */,/*44495*/"HENTAIGANA LETTER NI-4"/* 1B08A */, /*44496*/"HENTAIGANA LETTER NI-5"/* 1B08B */,/*44497*/"HENTAIGANA LETTER NI-6"/* 1B08C */, /*44498*/"HENTAIGANA LETTER NI-7"/* 1B08D */,/*44499*/"HENTAIGANA LETTER NI-TE"/* 1B08E */, /*44500*/"HENTAIGANA LETTER NU-1"/* 1B08F */,/*44501*/"HENTAIGANA LETTER NU-2"/* 1B090 */, /*44502*/"HENTAIGANA LETTER NU-3"/* 1B091 */,/*44503*/"HENTAIGANA LETTER NE-1"/* 1B092 */, /*44504*/"HENTAIGANA LETTER NE-2"/* 1B093 */,/*44505*/"HENTAIGANA LETTER NE-3"/* 1B094 */, /*44506*/"HENTAIGANA LETTER NE-4"/* 1B095 */,/*44507*/"HENTAIGANA LETTER NE-5"/* 1B096 */, /*44508*/"HENTAIGANA LETTER NE-6"/* 1B097 */,/*44509*/"HENTAIGANA LETTER NE-KO"/* 1B098 */, /*44510*/"HENTAIGANA LETTER NO-1"/* 1B099 */,/*44511*/"HENTAIGANA LETTER NO-2"/* 1B09A */, /*44512*/"HENTAIGANA LETTER NO-3"/* 1B09B */,/*44513*/"HENTAIGANA LETTER NO-4"/* 1B09C */, /*44514*/"HENTAIGANA LETTER NO-5"/* 1B09D */,/*44515*/"HENTAIGANA LETTER HA-1"/* 1B09E */, /*44516*/"HENTAIGANA LETTER HA-2"/* 1B09F */,/*44517*/"HENTAIGANA LETTER HA-3"/* 1B0A0 */, /*44518*/"HENTAIGANA LETTER HA-4"/* 1B0A1 */,/*44519*/"HENTAIGANA LETTER HA-5"/* 1B0A2 */, /*44520*/"HENTAIGANA LETTER HA-6"/* 1B0A3 */,/*44521*/"HENTAIGANA LETTER HA-7"/* 1B0A4 */, /*44522*/"HENTAIGANA LETTER HA-8"/* 1B0A5 */,/*44523*/"HENTAIGANA LETTER HA-9"/* 1B0A6 */, /*44524*/"HENTAIGANA LETTER HA-10"/* 1B0A7 */,/*44525*/"HENTAIGANA LETTER HA-11"/* 1B0A8 */, /*44526*/"HENTAIGANA LETTER HI-1"/* 1B0A9 */,/*44527*/"HENTAIGANA LETTER HI-2"/* 1B0AA */, /*44528*/"HENTAIGANA LETTER HI-3"/* 1B0AB */,/*44529*/"HENTAIGANA LETTER HI-4"/* 1B0AC */, /*44530*/"HENTAIGANA LETTER HI-5"/* 1B0AD */,/*44531*/"HENTAIGANA LETTER HI-6"/* 1B0AE */, /*44532*/"HENTAIGANA LETTER HI-7"/* 1B0AF */,/*44533*/"HENTAIGANA LETTER HU-1"/* 1B0B0 */, /*44534*/"HENTAIGANA LETTER HU-2"/* 1B0B1 */,/*44535*/"HENTAIGANA LETTER HU-3"/* 1B0B2 */, /*44536*/"HENTAIGANA LETTER HE-1"/* 1B0B3 */,/*44537*/"HENTAIGANA LETTER HE-2"/* 1B0B4 */, /*44538*/"HENTAIGANA LETTER HE-3"/* 1B0B5 */,/*44539*/"HENTAIGANA LETTER HE-4"/* 1B0B6 */, /*44540*/"HENTAIGANA LETTER HE-5"/* 1B0B7 */,/*44541*/"HENTAIGANA LETTER HE-6"/* 1B0B8 */, /*44542*/"HENTAIGANA LETTER HE-7"/* 1B0B9 */,/*44543*/"HENTAIGANA LETTER HO-1"/* 1B0BA */, /*44544*/"HENTAIGANA LETTER HO-2"/* 1B0BB */,/*44545*/"HENTAIGANA LETTER HO-3"/* 1B0BC */, /*44546*/"HENTAIGANA LETTER HO-4"/* 1B0BD */,/*44547*/"HENTAIGANA LETTER HO-5"/* 1B0BE */, /*44548*/"HENTAIGANA LETTER HO-6"/* 1B0BF */,/*44549*/"HENTAIGANA LETTER HO-7"/* 1B0C0 */, /*44550*/"HENTAIGANA LETTER HO-8"/* 1B0C1 */,/*44551*/"HENTAIGANA LETTER MA-1"/* 1B0C2 */, /*44552*/"HENTAIGANA LETTER MA-2"/* 1B0C3 */,/*44553*/"HENTAIGANA LETTER MA-3"/* 1B0C4 */, /*44554*/"HENTAIGANA LETTER MA-4"/* 1B0C5 */,/*44555*/"HENTAIGANA LETTER MA-5"/* 1B0C6 */, /*44556*/"HENTAIGANA LETTER MA-6"/* 1B0C7 */,/*44557*/"HENTAIGANA LETTER MA-7"/* 1B0C8 */, /*44558*/"HENTAIGANA LETTER MI-1"/* 1B0C9 */,/*44559*/"HENTAIGANA LETTER MI-2"/* 1B0CA */, /*44560*/"HENTAIGANA LETTER MI-3"/* 1B0CB */,/*44561*/"HENTAIGANA LETTER MI-4"/* 1B0CC */, /*44562*/"HENTAIGANA LETTER MI-5"/* 1B0CD */,/*44563*/"HENTAIGANA LETTER MI-6"/* 1B0CE */, /*44564*/"HENTAIGANA LETTER MI-7"/* 1B0CF */,/*44565*/"HENTAIGANA LETTER MU-1"/* 1B0D0 */, /*44566*/"HENTAIGANA LETTER MU-2"/* 1B0D1 */,/*44567*/"HENTAIGANA LETTER MU-3"/* 1B0D2 */, /*44568*/"HENTAIGANA LETTER MU-4"/* 1B0D3 */,/*44569*/"HENTAIGANA LETTER ME-1"/* 1B0D4 */, /*44570*/"HENTAIGANA LETTER ME-2"/* 1B0D5 */,/*44571*/"HENTAIGANA LETTER ME-MA"/* 1B0D6 */, /*44572*/"HENTAIGANA LETTER MO-1"/* 1B0D7 */,/*44573*/"HENTAIGANA LETTER MO-2"/* 1B0D8 */, /*44574*/"HENTAIGANA LETTER MO-3"/* 1B0D9 */,/*44575*/"HENTAIGANA LETTER MO-4"/* 1B0DA */, /*44576*/"HENTAIGANA LETTER MO-5"/* 1B0DB */,/*44577*/"HENTAIGANA LETTER MO-6"/* 1B0DC */, /*44578*/"HENTAIGANA LETTER YA-1"/* 1B0DD */,/*44579*/"HENTAIGANA LETTER YA-2"/* 1B0DE */, /*44580*/"HENTAIGANA LETTER YA-3"/* 1B0DF */,/*44581*/"HENTAIGANA LETTER YA-4"/* 1B0E0 */, /*44582*/"HENTAIGANA LETTER YA-5"/* 1B0E1 */,/*44583*/"HENTAIGANA LETTER YA-YO"/* 1B0E2 */, /*44584*/"HENTAIGANA LETTER YU-1"/* 1B0E3 */,/*44585*/"HENTAIGANA LETTER YU-2"/* 1B0E4 */, /*44586*/"HENTAIGANA LETTER YU-3"/* 1B0E5 */,/*44587*/"HENTAIGANA LETTER YU-4"/* 1B0E6 */, /*44588*/"HENTAIGANA LETTER YO-1"/* 1B0E7 */,/*44589*/"HENTAIGANA LETTER YO-2"/* 1B0E8 */, /*44590*/"HENTAIGANA LETTER YO-3"/* 1B0E9 */,/*44591*/"HENTAIGANA LETTER YO-4"/* 1B0EA */, /*44592*/"HENTAIGANA LETTER YO-5"/* 1B0EB */,/*44593*/"HENTAIGANA LETTER YO-6"/* 1B0EC */, /*44594*/"HENTAIGANA LETTER RA-1"/* 1B0ED */,/*44595*/"HENTAIGANA LETTER RA-2"/* 1B0EE */, /*44596*/"HENTAIGANA LETTER RA-3"/* 1B0EF */,/*44597*/"HENTAIGANA LETTER RA-4"/* 1B0F0 */, /*44598*/"HENTAIGANA LETTER RI-1"/* 1B0F1 */,/*44599*/"HENTAIGANA LETTER RI-2"/* 1B0F2 */, /*44600*/"HENTAIGANA LETTER RI-3"/* 1B0F3 */,/*44601*/"HENTAIGANA LETTER RI-4"/* 1B0F4 */, /*44602*/"HENTAIGANA LETTER RI-5"/* 1B0F5 */,/*44603*/"HENTAIGANA LETTER RI-6"/* 1B0F6 */, /*44604*/"HENTAIGANA LETTER RI-7"/* 1B0F7 */,/*44605*/"HENTAIGANA LETTER RU-1"/* 1B0F8 */, /*44606*/"HENTAIGANA LETTER RU-2"/* 1B0F9 */,/*44607*/"HENTAIGANA LETTER RU-3"/* 1B0FA */, /*44608*/"HENTAIGANA LETTER RU-4"/* 1B0FB */,/*44609*/"HENTAIGANA LETTER RU-5"/* 1B0FC */, /*44610*/"HENTAIGANA LETTER RU-6"/* 1B0FD */,/*44611*/"HENTAIGANA LETTER RE-1"/* 1B0FE */, /*44612*/"HENTAIGANA LETTER RE-2"/* 1B0FF */,/*44613*/"HENTAIGANA LETTER RE-3"/* 1B100 */, /*44614*/"HENTAIGANA LETTER RE-4"/* 1B101 */,/*44615*/"HENTAIGANA LETTER RO-1"/* 1B102 */, /*44616*/"HENTAIGANA LETTER RO-2"/* 1B103 */,/*44617*/"HENTAIGANA LETTER RO-3"/* 1B104 */, /*44618*/"HENTAIGANA LETTER RO-4"/* 1B105 */,/*44619*/"HENTAIGANA LETTER RO-5"/* 1B106 */, /*44620*/"HENTAIGANA LETTER RO-6"/* 1B107 */,/*44621*/"HENTAIGANA LETTER WA-1"/* 1B108 */, /*44622*/"HENTAIGANA LETTER WA-2"/* 1B109 */,/*44623*/"HENTAIGANA LETTER WA-3"/* 1B10A */, /*44624*/"HENTAIGANA LETTER WA-4"/* 1B10B */,/*44625*/"HENTAIGANA LETTER WA-5"/* 1B10C */, /*44626*/"HENTAIGANA LETTER WI-1"/* 1B10D */,/*44627*/"HENTAIGANA LETTER WI-2"/* 1B10E */, /*44628*/"HENTAIGANA LETTER WI-3"/* 1B10F */,/*44629*/"HENTAIGANA LETTER WI-4"/* 1B110 */, /*44630*/"HENTAIGANA LETTER WI-5"/* 1B111 */,/*44631*/"HENTAIGANA LETTER WE-1"/* 1B112 */, /*44632*/"HENTAIGANA LETTER WE-2"/* 1B113 */,/*44633*/"HENTAIGANA LETTER WE-3"/* 1B114 */, /*44634*/"HENTAIGANA LETTER WE-4"/* 1B115 */,/*44635*/"HENTAIGANA LETTER WO-1"/* 1B116 */, /*44636*/"HENTAIGANA LETTER WO-2"/* 1B117 */,/*44637*/"HENTAIGANA LETTER WO-3"/* 1B118 */, /*44638*/"HENTAIGANA LETTER WO-4"/* 1B119 */,/*44639*/"HENTAIGANA LETTER WO-5"/* 1B11A */, /*44640*/"HENTAIGANA LETTER WO-6"/* 1B11B */,/*44641*/"HENTAIGANA LETTER WO-7"/* 1B11C */, /*44642*/"HENTAIGANA LETTER N-MU-MO-1"/* 1B11D */,/*44643*/"HENTAIGANA LETTER N-MU-MO-2"/* 1B11E */,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,/*44725*/"NUSHU CHARACTER-1B170"/* 1B170 */,/*44726*/"NUSHU CHARACTER-1B171"/* 1B171 */, /*44727*/"NUSHU CHARACTER-1B172"/* 1B172 */,/*44728*/"NUSHU CHARACTER-1B173"/* 1B173 */, /*44729*/"NUSHU CHARACTER-1B174"/* 1B174 */,/*44730*/"NUSHU CHARACTER-1B175"/* 1B175 */, /*44731*/"NUSHU CHARACTER-1B176"/* 1B176 */,/*44732*/"NUSHU CHARACTER-1B177"/* 1B177 */, /*44733*/"NUSHU CHARACTER-1B178"/* 1B178 */,/*44734*/"NUSHU CHARACTER-1B179"/* 1B179 */, /*44735*/"NUSHU CHARACTER-1B17A"/* 1B17A */,/*44736*/"NUSHU CHARACTER-1B17B"/* 1B17B */, /*44737*/"NUSHU CHARACTER-1B17C"/* 1B17C */,/*44738*/"NUSHU CHARACTER-1B17D"/* 1B17D */, /*44739*/"NUSHU CHARACTER-1B17E"/* 1B17E */,/*44740*/"NUSHU CHARACTER-1B17F"/* 1B17F */, /*44741*/"NUSHU CHARACTER-1B180"/* 1B180 */,/*44742*/"NUSHU CHARACTER-1B181"/* 1B181 */, /*44743*/"NUSHU CHARACTER-1B182"/* 1B182 */,/*44744*/"NUSHU CHARACTER-1B183"/* 1B183 */, /*44745*/"NUSHU CHARACTER-1B184"/* 1B184 */,/*44746*/"NUSHU CHARACTER-1B185"/* 1B185 */, /*44747*/"NUSHU CHARACTER-1B186"/* 1B186 */,/*44748*/"NUSHU CHARACTER-1B187"/* 1B187 */, /*44749*/"NUSHU CHARACTER-1B188"/* 1B188 */,/*44750*/"NUSHU CHARACTER-1B189"/* 1B189 */, /*44751*/"NUSHU CHARACTER-1B18A"/* 1B18A */,/*44752*/"NUSHU CHARACTER-1B18B"/* 1B18B */, /*44753*/"NUSHU CHARACTER-1B18C"/* 1B18C */,/*44754*/"NUSHU CHARACTER-1B18D"/* 1B18D */, /*44755*/"NUSHU CHARACTER-1B18E"/* 1B18E */,/*44756*/"NUSHU CHARACTER-1B18F"/* 1B18F */, /*44757*/"NUSHU CHARACTER-1B190"/* 1B190 */,/*44758*/"NUSHU CHARACTER-1B191"/* 1B191 */, /*44759*/"NUSHU CHARACTER-1B192"/* 1B192 */,/*44760*/"NUSHU CHARACTER-1B193"/* 1B193 */, /*44761*/"NUSHU CHARACTER-1B194"/* 1B194 */,/*44762*/"NUSHU CHARACTER-1B195"/* 1B195 */, /*44763*/"NUSHU CHARACTER-1B196"/* 1B196 */,/*44764*/"NUSHU CHARACTER-1B197"/* 1B197 */, /*44765*/"NUSHU CHARACTER-1B198"/* 1B198 */,/*44766*/"NUSHU CHARACTER-1B199"/* 1B199 */, /*44767*/"NUSHU CHARACTER-1B19A"/* 1B19A */,/*44768*/"NUSHU CHARACTER-1B19B"/* 1B19B */, /*44769*/"NUSHU CHARACTER-1B19C"/* 1B19C */,/*44770*/"NUSHU CHARACTER-1B19D"/* 1B19D */, /*44771*/"NUSHU CHARACTER-1B19E"/* 1B19E */,/*44772*/"NUSHU CHARACTER-1B19F"/* 1B19F */, /*44773*/"NUSHU CHARACTER-1B1A0"/* 1B1A0 */,/*44774*/"NUSHU CHARACTER-1B1A1"/* 1B1A1 */, /*44775*/"NUSHU CHARACTER-1B1A2"/* 1B1A2 */,/*44776*/"NUSHU CHARACTER-1B1A3"/* 1B1A3 */, /*44777*/"NUSHU CHARACTER-1B1A4"/* 1B1A4 */,/*44778*/"NUSHU CHARACTER-1B1A5"/* 1B1A5 */, /*44779*/"NUSHU CHARACTER-1B1A6"/* 1B1A6 */,/*44780*/"NUSHU CHARACTER-1B1A7"/* 1B1A7 */, /*44781*/"NUSHU CHARACTER-1B1A8"/* 1B1A8 */,/*44782*/"NUSHU CHARACTER-1B1A9"/* 1B1A9 */, /*44783*/"NUSHU CHARACTER-1B1AA"/* 1B1AA */,/*44784*/"NUSHU CHARACTER-1B1AB"/* 1B1AB */, /*44785*/"NUSHU CHARACTER-1B1AC"/* 1B1AC */,/*44786*/"NUSHU CHARACTER-1B1AD"/* 1B1AD */, /*44787*/"NUSHU CHARACTER-1B1AE"/* 1B1AE */,/*44788*/"NUSHU CHARACTER-1B1AF"/* 1B1AF */, /*44789*/"NUSHU CHARACTER-1B1B0"/* 1B1B0 */,/*44790*/"NUSHU CHARACTER-1B1B1"/* 1B1B1 */, /*44791*/"NUSHU CHARACTER-1B1B2"/* 1B1B2 */,/*44792*/"NUSHU CHARACTER-1B1B3"/* 1B1B3 */, /*44793*/"NUSHU CHARACTER-1B1B4"/* 1B1B4 */,/*44794*/"NUSHU CHARACTER-1B1B5"/* 1B1B5 */, /*44795*/"NUSHU CHARACTER-1B1B6"/* 1B1B6 */,/*44796*/"NUSHU CHARACTER-1B1B7"/* 1B1B7 */, /*44797*/"NUSHU CHARACTER-1B1B8"/* 1B1B8 */,/*44798*/"NUSHU CHARACTER-1B1B9"/* 1B1B9 */, /*44799*/"NUSHU CHARACTER-1B1BA"/* 1B1BA */,/*44800*/"NUSHU CHARACTER-1B1BB"/* 1B1BB */, /*44801*/"NUSHU CHARACTER-1B1BC"/* 1B1BC */,/*44802*/"NUSHU CHARACTER-1B1BD"/* 1B1BD */, /*44803*/"NUSHU CHARACTER-1B1BE"/* 1B1BE */,/*44804*/"NUSHU CHARACTER-1B1BF"/* 1B1BF */, /*44805*/"NUSHU CHARACTER-1B1C0"/* 1B1C0 */,/*44806*/"NUSHU CHARACTER-1B1C1"/* 1B1C1 */, /*44807*/"NUSHU CHARACTER-1B1C2"/* 1B1C2 */,/*44808*/"NUSHU CHARACTER-1B1C3"/* 1B1C3 */, /*44809*/"NUSHU CHARACTER-1B1C4"/* 1B1C4 */,/*44810*/"NUSHU CHARACTER-1B1C5"/* 1B1C5 */, /*44811*/"NUSHU CHARACTER-1B1C6"/* 1B1C6 */,/*44812*/"NUSHU CHARACTER-1B1C7"/* 1B1C7 */, /*44813*/"NUSHU CHARACTER-1B1C8"/* 1B1C8 */,/*44814*/"NUSHU CHARACTER-1B1C9"/* 1B1C9 */, /*44815*/"NUSHU CHARACTER-1B1CA"/* 1B1CA */,/*44816*/"NUSHU CHARACTER-1B1CB"/* 1B1CB */, /*44817*/"NUSHU CHARACTER-1B1CC"/* 1B1CC */,/*44818*/"NUSHU CHARACTER-1B1CD"/* 1B1CD */, /*44819*/"NUSHU CHARACTER-1B1CE"/* 1B1CE */,/*44820*/"NUSHU CHARACTER-1B1CF"/* 1B1CF */, /*44821*/"NUSHU CHARACTER-1B1D0"/* 1B1D0 */,/*44822*/"NUSHU CHARACTER-1B1D1"/* 1B1D1 */, /*44823*/"NUSHU CHARACTER-1B1D2"/* 1B1D2 */,/*44824*/"NUSHU CHARACTER-1B1D3"/* 1B1D3 */, /*44825*/"NUSHU CHARACTER-1B1D4"/* 1B1D4 */,/*44826*/"NUSHU CHARACTER-1B1D5"/* 1B1D5 */, /*44827*/"NUSHU CHARACTER-1B1D6"/* 1B1D6 */,/*44828*/"NUSHU CHARACTER-1B1D7"/* 1B1D7 */, /*44829*/"NUSHU CHARACTER-1B1D8"/* 1B1D8 */,/*44830*/"NUSHU CHARACTER-1B1D9"/* 1B1D9 */, /*44831*/"NUSHU CHARACTER-1B1DA"/* 1B1DA */,/*44832*/"NUSHU CHARACTER-1B1DB"/* 1B1DB */, /*44833*/"NUSHU CHARACTER-1B1DC"/* 1B1DC */,/*44834*/"NUSHU CHARACTER-1B1DD"/* 1B1DD */, /*44835*/"NUSHU CHARACTER-1B1DE"/* 1B1DE */,/*44836*/"NUSHU CHARACTER-1B1DF"/* 1B1DF */, /*44837*/"NUSHU CHARACTER-1B1E0"/* 1B1E0 */,/*44838*/"NUSHU CHARACTER-1B1E1"/* 1B1E1 */, /*44839*/"NUSHU CHARACTER-1B1E2"/* 1B1E2 */,/*44840*/"NUSHU CHARACTER-1B1E3"/* 1B1E3 */, /*44841*/"NUSHU CHARACTER-1B1E4"/* 1B1E4 */,/*44842*/"NUSHU CHARACTER-1B1E5"/* 1B1E5 */, /*44843*/"NUSHU CHARACTER-1B1E6"/* 1B1E6 */,/*44844*/"NUSHU CHARACTER-1B1E7"/* 1B1E7 */, /*44845*/"NUSHU CHARACTER-1B1E8"/* 1B1E8 */,/*44846*/"NUSHU CHARACTER-1B1E9"/* 1B1E9 */, /*44847*/"NUSHU CHARACTER-1B1EA"/* 1B1EA */,/*44848*/"NUSHU CHARACTER-1B1EB"/* 1B1EB */, /*44849*/"NUSHU CHARACTER-1B1EC"/* 1B1EC */,/*44850*/"NUSHU CHARACTER-1B1ED"/* 1B1ED */, /*44851*/"NUSHU CHARACTER-1B1EE"/* 1B1EE */,/*44852*/"NUSHU CHARACTER-1B1EF"/* 1B1EF */, /*44853*/"NUSHU CHARACTER-1B1F0"/* 1B1F0 */,/*44854*/"NUSHU CHARACTER-1B1F1"/* 1B1F1 */, /*44855*/"NUSHU CHARACTER-1B1F2"/* 1B1F2 */,/*44856*/"NUSHU CHARACTER-1B1F3"/* 1B1F3 */, /*44857*/"NUSHU CHARACTER-1B1F4"/* 1B1F4 */,/*44858*/"NUSHU CHARACTER-1B1F5"/* 1B1F5 */, /*44859*/"NUSHU CHARACTER-1B1F6"/* 1B1F6 */,/*44860*/"NUSHU CHARACTER-1B1F7"/* 1B1F7 */, /*44861*/"NUSHU CHARACTER-1B1F8"/* 1B1F8 */,/*44862*/"NUSHU CHARACTER-1B1F9"/* 1B1F9 */, /*44863*/"NUSHU CHARACTER-1B1FA"/* 1B1FA */,/*44864*/"NUSHU CHARACTER-1B1FB"/* 1B1FB */, /*44865*/"NUSHU CHARACTER-1B1FC"/* 1B1FC */,/*44866*/"NUSHU CHARACTER-1B1FD"/* 1B1FD */, /*44867*/"NUSHU CHARACTER-1B1FE"/* 1B1FE */,/*44868*/"NUSHU CHARACTER-1B1FF"/* 1B1FF */, /*44869*/"NUSHU CHARACTER-1B200"/* 1B200 */,/*44870*/"NUSHU CHARACTER-1B201"/* 1B201 */, /*44871*/"NUSHU CHARACTER-1B202"/* 1B202 */,/*44872*/"NUSHU CHARACTER-1B203"/* 1B203 */, /*44873*/"NUSHU CHARACTER-1B204"/* 1B204 */,/*44874*/"NUSHU CHARACTER-1B205"/* 1B205 */, /*44875*/"NUSHU CHARACTER-1B206"/* 1B206 */,/*44876*/"NUSHU CHARACTER-1B207"/* 1B207 */, /*44877*/"NUSHU CHARACTER-1B208"/* 1B208 */,/*44878*/"NUSHU CHARACTER-1B209"/* 1B209 */, /*44879*/"NUSHU CHARACTER-1B20A"/* 1B20A */,/*44880*/"NUSHU CHARACTER-1B20B"/* 1B20B */, /*44881*/"NUSHU CHARACTER-1B20C"/* 1B20C */,/*44882*/"NUSHU CHARACTER-1B20D"/* 1B20D */, /*44883*/"NUSHU CHARACTER-1B20E"/* 1B20E */,/*44884*/"NUSHU CHARACTER-1B20F"/* 1B20F */, /*44885*/"NUSHU CHARACTER-1B210"/* 1B210 */,/*44886*/"NUSHU CHARACTER-1B211"/* 1B211 */, /*44887*/"NUSHU CHARACTER-1B212"/* 1B212 */,/*44888*/"NUSHU CHARACTER-1B213"/* 1B213 */, /*44889*/"NUSHU CHARACTER-1B214"/* 1B214 */,/*44890*/"NUSHU CHARACTER-1B215"/* 1B215 */, /*44891*/"NUSHU CHARACTER-1B216"/* 1B216 */,/*44892*/"NUSHU CHARACTER-1B217"/* 1B217 */, /*44893*/"NUSHU CHARACTER-1B218"/* 1B218 */,/*44894*/"NUSHU CHARACTER-1B219"/* 1B219 */, /*44895*/"NUSHU CHARACTER-1B21A"/* 1B21A */,/*44896*/"NUSHU CHARACTER-1B21B"/* 1B21B */, /*44897*/"NUSHU CHARACTER-1B21C"/* 1B21C */,/*44898*/"NUSHU CHARACTER-1B21D"/* 1B21D */, /*44899*/"NUSHU CHARACTER-1B21E"/* 1B21E */,/*44900*/"NUSHU CHARACTER-1B21F"/* 1B21F */, /*44901*/"NUSHU CHARACTER-1B220"/* 1B220 */,/*44902*/"NUSHU CHARACTER-1B221"/* 1B221 */, /*44903*/"NUSHU CHARACTER-1B222"/* 1B222 */,/*44904*/"NUSHU CHARACTER-1B223"/* 1B223 */, /*44905*/"NUSHU CHARACTER-1B224"/* 1B224 */,/*44906*/"NUSHU CHARACTER-1B225"/* 1B225 */, /*44907*/"NUSHU CHARACTER-1B226"/* 1B226 */,/*44908*/"NUSHU CHARACTER-1B227"/* 1B227 */, /*44909*/"NUSHU CHARACTER-1B228"/* 1B228 */,/*44910*/"NUSHU CHARACTER-1B229"/* 1B229 */, /*44911*/"NUSHU CHARACTER-1B22A"/* 1B22A */,/*44912*/"NUSHU CHARACTER-1B22B"/* 1B22B */, /*44913*/"NUSHU CHARACTER-1B22C"/* 1B22C */,/*44914*/"NUSHU CHARACTER-1B22D"/* 1B22D */, /*44915*/"NUSHU CHARACTER-1B22E"/* 1B22E */,/*44916*/"NUSHU CHARACTER-1B22F"/* 1B22F */, /*44917*/"NUSHU CHARACTER-1B230"/* 1B230 */,/*44918*/"NUSHU CHARACTER-1B231"/* 1B231 */, /*44919*/"NUSHU CHARACTER-1B232"/* 1B232 */,/*44920*/"NUSHU CHARACTER-1B233"/* 1B233 */, /*44921*/"NUSHU CHARACTER-1B234"/* 1B234 */,/*44922*/"NUSHU CHARACTER-1B235"/* 1B235 */, /*44923*/"NUSHU CHARACTER-1B236"/* 1B236 */,/*44924*/"NUSHU CHARACTER-1B237"/* 1B237 */, /*44925*/"NUSHU CHARACTER-1B238"/* 1B238 */,/*44926*/"NUSHU CHARACTER-1B239"/* 1B239 */, /*44927*/"NUSHU CHARACTER-1B23A"/* 1B23A */,/*44928*/"NUSHU CHARACTER-1B23B"/* 1B23B */, /*44929*/"NUSHU CHARACTER-1B23C"/* 1B23C */,/*44930*/"NUSHU CHARACTER-1B23D"/* 1B23D */, /*44931*/"NUSHU CHARACTER-1B23E"/* 1B23E */,/*44932*/"NUSHU CHARACTER-1B23F"/* 1B23F */, /*44933*/"NUSHU CHARACTER-1B240"/* 1B240 */,/*44934*/"NUSHU CHARACTER-1B241"/* 1B241 */, /*44935*/"NUSHU CHARACTER-1B242"/* 1B242 */,/*44936*/"NUSHU CHARACTER-1B243"/* 1B243 */, /*44937*/"NUSHU CHARACTER-1B244"/* 1B244 */,/*44938*/"NUSHU CHARACTER-1B245"/* 1B245 */, /*44939*/"NUSHU CHARACTER-1B246"/* 1B246 */,/*44940*/"NUSHU CHARACTER-1B247"/* 1B247 */, /*44941*/"NUSHU CHARACTER-1B248"/* 1B248 */,/*44942*/"NUSHU CHARACTER-1B249"/* 1B249 */, /*44943*/"NUSHU CHARACTER-1B24A"/* 1B24A */,/*44944*/"NUSHU CHARACTER-1B24B"/* 1B24B */, /*44945*/"NUSHU CHARACTER-1B24C"/* 1B24C */,/*44946*/"NUSHU CHARACTER-1B24D"/* 1B24D */, /*44947*/"NUSHU CHARACTER-1B24E"/* 1B24E */,/*44948*/"NUSHU CHARACTER-1B24F"/* 1B24F */, /*44949*/"NUSHU CHARACTER-1B250"/* 1B250 */,/*44950*/"NUSHU CHARACTER-1B251"/* 1B251 */, /*44951*/"NUSHU CHARACTER-1B252"/* 1B252 */,/*44952*/"NUSHU CHARACTER-1B253"/* 1B253 */, /*44953*/"NUSHU CHARACTER-1B254"/* 1B254 */,/*44954*/"NUSHU CHARACTER-1B255"/* 1B255 */, /*44955*/"NUSHU CHARACTER-1B256"/* 1B256 */,/*44956*/"NUSHU CHARACTER-1B257"/* 1B257 */, /*44957*/"NUSHU CHARACTER-1B258"/* 1B258 */,/*44958*/"NUSHU CHARACTER-1B259"/* 1B259 */, /*44959*/"NUSHU CHARACTER-1B25A"/* 1B25A */,/*44960*/"NUSHU CHARACTER-1B25B"/* 1B25B */, /*44961*/"NUSHU CHARACTER-1B25C"/* 1B25C */,/*44962*/"NUSHU CHARACTER-1B25D"/* 1B25D */, /*44963*/"NUSHU CHARACTER-1B25E"/* 1B25E */,/*44964*/"NUSHU CHARACTER-1B25F"/* 1B25F */, /*44965*/"NUSHU CHARACTER-1B260"/* 1B260 */,/*44966*/"NUSHU CHARACTER-1B261"/* 1B261 */, /*44967*/"NUSHU CHARACTER-1B262"/* 1B262 */,/*44968*/"NUSHU CHARACTER-1B263"/* 1B263 */, /*44969*/"NUSHU CHARACTER-1B264"/* 1B264 */,/*44970*/"NUSHU CHARACTER-1B265"/* 1B265 */, /*44971*/"NUSHU CHARACTER-1B266"/* 1B266 */,/*44972*/"NUSHU CHARACTER-1B267"/* 1B267 */, /*44973*/"NUSHU CHARACTER-1B268"/* 1B268 */,/*44974*/"NUSHU CHARACTER-1B269"/* 1B269 */, /*44975*/"NUSHU CHARACTER-1B26A"/* 1B26A */,/*44976*/"NUSHU CHARACTER-1B26B"/* 1B26B */, /*44977*/"NUSHU CHARACTER-1B26C"/* 1B26C */,/*44978*/"NUSHU CHARACTER-1B26D"/* 1B26D */, /*44979*/"NUSHU CHARACTER-1B26E"/* 1B26E */,/*44980*/"NUSHU CHARACTER-1B26F"/* 1B26F */, /*44981*/"NUSHU CHARACTER-1B270"/* 1B270 */,/*44982*/"NUSHU CHARACTER-1B271"/* 1B271 */, /*44983*/"NUSHU CHARACTER-1B272"/* 1B272 */,/*44984*/"NUSHU CHARACTER-1B273"/* 1B273 */, /*44985*/"NUSHU CHARACTER-1B274"/* 1B274 */,/*44986*/"NUSHU CHARACTER-1B275"/* 1B275 */, /*44987*/"NUSHU CHARACTER-1B276"/* 1B276 */,/*44988*/"NUSHU CHARACTER-1B277"/* 1B277 */, /*44989*/"NUSHU CHARACTER-1B278"/* 1B278 */,/*44990*/"NUSHU CHARACTER-1B279"/* 1B279 */, /*44991*/"NUSHU CHARACTER-1B27A"/* 1B27A */,/*44992*/"NUSHU CHARACTER-1B27B"/* 1B27B */, /*44993*/"NUSHU CHARACTER-1B27C"/* 1B27C */,/*44994*/"NUSHU CHARACTER-1B27D"/* 1B27D */, /*44995*/"NUSHU CHARACTER-1B27E"/* 1B27E */,/*44996*/"NUSHU CHARACTER-1B27F"/* 1B27F */, /*44997*/"NUSHU CHARACTER-1B280"/* 1B280 */,/*44998*/"NUSHU CHARACTER-1B281"/* 1B281 */, /*44999*/"NUSHU CHARACTER-1B282"/* 1B282 */,/*45000*/"NUSHU CHARACTER-1B283"/* 1B283 */, /*45001*/"NUSHU CHARACTER-1B284"/* 1B284 */,/*45002*/"NUSHU CHARACTER-1B285"/* 1B285 */, /*45003*/"NUSHU CHARACTER-1B286"/* 1B286 */,/*45004*/"NUSHU CHARACTER-1B287"/* 1B287 */, /*45005*/"NUSHU CHARACTER-1B288"/* 1B288 */,/*45006*/"NUSHU CHARACTER-1B289"/* 1B289 */, /*45007*/"NUSHU CHARACTER-1B28A"/* 1B28A */,/*45008*/"NUSHU CHARACTER-1B28B"/* 1B28B */, /*45009*/"NUSHU CHARACTER-1B28C"/* 1B28C */,/*45010*/"NUSHU CHARACTER-1B28D"/* 1B28D */, /*45011*/"NUSHU CHARACTER-1B28E"/* 1B28E */,/*45012*/"NUSHU CHARACTER-1B28F"/* 1B28F */, /*45013*/"NUSHU CHARACTER-1B290"/* 1B290 */,/*45014*/"NUSHU CHARACTER-1B291"/* 1B291 */, /*45015*/"NUSHU CHARACTER-1B292"/* 1B292 */,/*45016*/"NUSHU CHARACTER-1B293"/* 1B293 */, /*45017*/"NUSHU CHARACTER-1B294"/* 1B294 */,/*45018*/"NUSHU CHARACTER-1B295"/* 1B295 */, /*45019*/"NUSHU CHARACTER-1B296"/* 1B296 */,/*45020*/"NUSHU CHARACTER-1B297"/* 1B297 */, /*45021*/"NUSHU CHARACTER-1B298"/* 1B298 */,/*45022*/"NUSHU CHARACTER-1B299"/* 1B299 */, /*45023*/"NUSHU CHARACTER-1B29A"/* 1B29A */,/*45024*/"NUSHU CHARACTER-1B29B"/* 1B29B */, /*45025*/"NUSHU CHARACTER-1B29C"/* 1B29C */,/*45026*/"NUSHU CHARACTER-1B29D"/* 1B29D */, /*45027*/"NUSHU CHARACTER-1B29E"/* 1B29E */,/*45028*/"NUSHU CHARACTER-1B29F"/* 1B29F */, /*45029*/"NUSHU CHARACTER-1B2A0"/* 1B2A0 */,/*45030*/"NUSHU CHARACTER-1B2A1"/* 1B2A1 */, /*45031*/"NUSHU CHARACTER-1B2A2"/* 1B2A2 */,/*45032*/"NUSHU CHARACTER-1B2A3"/* 1B2A3 */, /*45033*/"NUSHU CHARACTER-1B2A4"/* 1B2A4 */,/*45034*/"NUSHU CHARACTER-1B2A5"/* 1B2A5 */, /*45035*/"NUSHU CHARACTER-1B2A6"/* 1B2A6 */,/*45036*/"NUSHU CHARACTER-1B2A7"/* 1B2A7 */, /*45037*/"NUSHU CHARACTER-1B2A8"/* 1B2A8 */,/*45038*/"NUSHU CHARACTER-1B2A9"/* 1B2A9 */, /*45039*/"NUSHU CHARACTER-1B2AA"/* 1B2AA */,/*45040*/"NUSHU CHARACTER-1B2AB"/* 1B2AB */, /*45041*/"NUSHU CHARACTER-1B2AC"/* 1B2AC */,/*45042*/"NUSHU CHARACTER-1B2AD"/* 1B2AD */, /*45043*/"NUSHU CHARACTER-1B2AE"/* 1B2AE */,/*45044*/"NUSHU CHARACTER-1B2AF"/* 1B2AF */, /*45045*/"NUSHU CHARACTER-1B2B0"/* 1B2B0 */,/*45046*/"NUSHU CHARACTER-1B2B1"/* 1B2B1 */, /*45047*/"NUSHU CHARACTER-1B2B2"/* 1B2B2 */,/*45048*/"NUSHU CHARACTER-1B2B3"/* 1B2B3 */, /*45049*/"NUSHU CHARACTER-1B2B4"/* 1B2B4 */,/*45050*/"NUSHU CHARACTER-1B2B5"/* 1B2B5 */, /*45051*/"NUSHU CHARACTER-1B2B6"/* 1B2B6 */,/*45052*/"NUSHU CHARACTER-1B2B7"/* 1B2B7 */, /*45053*/"NUSHU CHARACTER-1B2B8"/* 1B2B8 */,/*45054*/"NUSHU CHARACTER-1B2B9"/* 1B2B9 */, /*45055*/"NUSHU CHARACTER-1B2BA"/* 1B2BA */,/*45056*/"NUSHU CHARACTER-1B2BB"/* 1B2BB */, /*45057*/"NUSHU CHARACTER-1B2BC"/* 1B2BC */,/*45058*/"NUSHU CHARACTER-1B2BD"/* 1B2BD */, /*45059*/"NUSHU CHARACTER-1B2BE"/* 1B2BE */,/*45060*/"NUSHU CHARACTER-1B2BF"/* 1B2BF */, /*45061*/"NUSHU CHARACTER-1B2C0"/* 1B2C0 */,/*45062*/"NUSHU CHARACTER-1B2C1"/* 1B2C1 */, /*45063*/"NUSHU CHARACTER-1B2C2"/* 1B2C2 */,/*45064*/"NUSHU CHARACTER-1B2C3"/* 1B2C3 */, /*45065*/"NUSHU CHARACTER-1B2C4"/* 1B2C4 */,/*45066*/"NUSHU CHARACTER-1B2C5"/* 1B2C5 */, /*45067*/"NUSHU CHARACTER-1B2C6"/* 1B2C6 */,/*45068*/"NUSHU CHARACTER-1B2C7"/* 1B2C7 */, /*45069*/"NUSHU CHARACTER-1B2C8"/* 1B2C8 */,/*45070*/"NUSHU CHARACTER-1B2C9"/* 1B2C9 */, /*45071*/"NUSHU CHARACTER-1B2CA"/* 1B2CA */,/*45072*/"NUSHU CHARACTER-1B2CB"/* 1B2CB */, /*45073*/"NUSHU CHARACTER-1B2CC"/* 1B2CC */,/*45074*/"NUSHU CHARACTER-1B2CD"/* 1B2CD */, /*45075*/"NUSHU CHARACTER-1B2CE"/* 1B2CE */,/*45076*/"NUSHU CHARACTER-1B2CF"/* 1B2CF */, /*45077*/"NUSHU CHARACTER-1B2D0"/* 1B2D0 */,/*45078*/"NUSHU CHARACTER-1B2D1"/* 1B2D1 */, /*45079*/"NUSHU CHARACTER-1B2D2"/* 1B2D2 */,/*45080*/"NUSHU CHARACTER-1B2D3"/* 1B2D3 */, /*45081*/"NUSHU CHARACTER-1B2D4"/* 1B2D4 */,/*45082*/"NUSHU CHARACTER-1B2D5"/* 1B2D5 */, /*45083*/"NUSHU CHARACTER-1B2D6"/* 1B2D6 */,/*45084*/"NUSHU CHARACTER-1B2D7"/* 1B2D7 */, /*45085*/"NUSHU CHARACTER-1B2D8"/* 1B2D8 */,/*45086*/"NUSHU CHARACTER-1B2D9"/* 1B2D9 */, /*45087*/"NUSHU CHARACTER-1B2DA"/* 1B2DA */,/*45088*/"NUSHU CHARACTER-1B2DB"/* 1B2DB */, /*45089*/"NUSHU CHARACTER-1B2DC"/* 1B2DC */,/*45090*/"NUSHU CHARACTER-1B2DD"/* 1B2DD */, /*45091*/"NUSHU CHARACTER-1B2DE"/* 1B2DE */,/*45092*/"NUSHU CHARACTER-1B2DF"/* 1B2DF */, /*45093*/"NUSHU CHARACTER-1B2E0"/* 1B2E0 */,/*45094*/"NUSHU CHARACTER-1B2E1"/* 1B2E1 */, /*45095*/"NUSHU CHARACTER-1B2E2"/* 1B2E2 */,/*45096*/"NUSHU CHARACTER-1B2E3"/* 1B2E3 */, /*45097*/"NUSHU CHARACTER-1B2E4"/* 1B2E4 */,/*45098*/"NUSHU CHARACTER-1B2E5"/* 1B2E5 */, /*45099*/"NUSHU CHARACTER-1B2E6"/* 1B2E6 */,/*45100*/"NUSHU CHARACTER-1B2E7"/* 1B2E7 */, /*45101*/"NUSHU CHARACTER-1B2E8"/* 1B2E8 */,/*45102*/"NUSHU CHARACTER-1B2E9"/* 1B2E9 */, /*45103*/"NUSHU CHARACTER-1B2EA"/* 1B2EA */,/*45104*/"NUSHU CHARACTER-1B2EB"/* 1B2EB */, /*45105*/"NUSHU CHARACTER-1B2EC"/* 1B2EC */,/*45106*/"NUSHU CHARACTER-1B2ED"/* 1B2ED */, /*45107*/"NUSHU CHARACTER-1B2EE"/* 1B2EE */,/*45108*/"NUSHU CHARACTER-1B2EF"/* 1B2EF */, /*45109*/"NUSHU CHARACTER-1B2F0"/* 1B2F0 */,/*45110*/"NUSHU CHARACTER-1B2F1"/* 1B2F1 */, /*45111*/"NUSHU CHARACTER-1B2F2"/* 1B2F2 */,/*45112*/"NUSHU CHARACTER-1B2F3"/* 1B2F3 */, /*45113*/"NUSHU CHARACTER-1B2F4"/* 1B2F4 */,/*45114*/"NUSHU CHARACTER-1B2F5"/* 1B2F5 */, /*45115*/"NUSHU CHARACTER-1B2F6"/* 1B2F6 */,/*45116*/"NUSHU CHARACTER-1B2F7"/* 1B2F7 */, /*45117*/"NUSHU CHARACTER-1B2F8"/* 1B2F8 */,/*45118*/"NUSHU CHARACTER-1B2F9"/* 1B2F9 */, /*45119*/"NUSHU CHARACTER-1B2FA"/* 1B2FA */,/*45120*/"NUSHU CHARACTER-1B2FB"/* 1B2FB */, /*45121*/"DUPLOYAN LETTER H"/* 1BC00 */,/*45122*/"DUPLOYAN LETTER X"/* 1BC01 */,/*45123*/"DUPLOYAN LETTER P"/* 1BC02 */, /*45124*/"DUPLOYAN LETTER T"/* 1BC03 */,/*45125*/"DUPLOYAN LETTER F"/* 1BC04 */,/*45126*/"DUPLOYAN LETTER K"/* 1BC05 */, /*45127*/"DUPLOYAN LETTER L"/* 1BC06 */,/*45128*/"DUPLOYAN LETTER B"/* 1BC07 */,/*45129*/"DUPLOYAN LETTER D"/* 1BC08 */, /*45130*/"DUPLOYAN LETTER V"/* 1BC09 */,/*45131*/"DUPLOYAN LETTER G"/* 1BC0A */,/*45132*/"DUPLOYAN LETTER R"/* 1BC0B */, /*45133*/"DUPLOYAN LETTER P N"/* 1BC0C */,/*45134*/"DUPLOYAN LETTER D S"/* 1BC0D */, /*45135*/"DUPLOYAN LETTER F N"/* 1BC0E */,/*45136*/"DUPLOYAN LETTER K M"/* 1BC0F */, /*45137*/"DUPLOYAN LETTER R S"/* 1BC10 */,/*45138*/"DUPLOYAN LETTER TH"/* 1BC11 */, /*45139*/"DUPLOYAN LETTER SLOAN DH"/* 1BC12 */,/*45140*/"DUPLOYAN LETTER DH"/* 1BC13 */, /*45141*/"DUPLOYAN LETTER KK"/* 1BC14 */,/*45142*/"DUPLOYAN LETTER SLOAN J"/* 1BC15 */, /*45143*/"DUPLOYAN LETTER HL"/* 1BC16 */,/*45144*/"DUPLOYAN LETTER LH"/* 1BC17 */, /*45145*/"DUPLOYAN LETTER RH"/* 1BC18 */,/*45146*/"DUPLOYAN LETTER M"/* 1BC19 */,/*45147*/"DUPLOYAN LETTER N"/* 1BC1A */, /*45148*/"DUPLOYAN LETTER J"/* 1BC1B */,/*45149*/"DUPLOYAN LETTER S"/* 1BC1C */, /*45150*/"DUPLOYAN LETTER M N"/* 1BC1D */,/*45151*/"DUPLOYAN LETTER N M"/* 1BC1E */, /*45152*/"DUPLOYAN LETTER J M"/* 1BC1F */,/*45153*/"DUPLOYAN LETTER S J"/* 1BC20 */, /*45154*/"DUPLOYAN LETTER M WITH DOT"/* 1BC21 */,/*45155*/"DUPLOYAN LETTER N WITH DOT"/* 1BC22 */, /*45156*/"DUPLOYAN LETTER J WITH DOT"/* 1BC23 */,/*45157*/"DUPLOYAN LETTER J WITH DOTS INSIDE AND ABOVE"/* 1BC24 */, /*45158*/"DUPLOYAN LETTER S WITH DOT"/* 1BC25 */,/*45159*/"DUPLOYAN LETTER S WITH DOT BELOW"/* 1BC26 */, /*45160*/"DUPLOYAN LETTER M S"/* 1BC27 */,/*45161*/"DUPLOYAN LETTER N S"/* 1BC28 */, /*45162*/"DUPLOYAN LETTER J S"/* 1BC29 */,/*45163*/"DUPLOYAN LETTER S S"/* 1BC2A */, /*45164*/"DUPLOYAN LETTER M N S"/* 1BC2B */,/*45165*/"DUPLOYAN LETTER N M S"/* 1BC2C */, /*45166*/"DUPLOYAN LETTER J M S"/* 1BC2D */,/*45167*/"DUPLOYAN LETTER S J S"/* 1BC2E */, /*45168*/"DUPLOYAN LETTER J S WITH DOT"/* 1BC2F */,/*45169*/"DUPLOYAN LETTER J N"/* 1BC30 */, /*45170*/"DUPLOYAN LETTER J N S"/* 1BC31 */,/*45171*/"DUPLOYAN LETTER S T"/* 1BC32 */, /*45172*/"DUPLOYAN LETTER S T R"/* 1BC33 */,/*45173*/"DUPLOYAN LETTER S P"/* 1BC34 */, /*45174*/"DUPLOYAN LETTER S P R"/* 1BC35 */,/*45175*/"DUPLOYAN LETTER T S"/* 1BC36 */, /*45176*/"DUPLOYAN LETTER T R S"/* 1BC37 */,/*45177*/"DUPLOYAN LETTER W"/* 1BC38 */, /*45178*/"DUPLOYAN LETTER WH"/* 1BC39 */,/*45179*/"DUPLOYAN LETTER W R"/* 1BC3A */, /*45180*/"DUPLOYAN LETTER S N"/* 1BC3B */,/*45181*/"DUPLOYAN LETTER S M"/* 1BC3C */, /*45182*/"DUPLOYAN LETTER K R S"/* 1BC3D */,/*45183*/"DUPLOYAN LETTER G R S"/* 1BC3E */, /*45184*/"DUPLOYAN LETTER S K"/* 1BC3F */,/*45185*/"DUPLOYAN LETTER S K R"/* 1BC40 */, /*45186*/"DUPLOYAN LETTER A"/* 1BC41 */,/*45187*/"DUPLOYAN LETTER SLOAN OW"/* 1BC42 */, /*45188*/"DUPLOYAN LETTER OA"/* 1BC43 */,/*45189*/"DUPLOYAN LETTER O"/* 1BC44 */, /*45190*/"DUPLOYAN LETTER AOU"/* 1BC45 */,/*45191*/"DUPLOYAN LETTER I"/* 1BC46 */, /*45192*/"DUPLOYAN LETTER E"/* 1BC47 */,/*45193*/"DUPLOYAN LETTER IE"/* 1BC48 */, /*45194*/"DUPLOYAN LETTER SHORT I"/* 1BC49 */,/*45195*/"DUPLOYAN LETTER UI"/* 1BC4A */, /*45196*/"DUPLOYAN LETTER EE"/* 1BC4B */,/*45197*/"DUPLOYAN LETTER SLOAN EH"/* 1BC4C */, /*45198*/"DUPLOYAN LETTER ROMANIAN I"/* 1BC4D */,/*45199*/"DUPLOYAN LETTER SLOAN EE"/* 1BC4E */, /*45200*/"DUPLOYAN LETTER LONG I"/* 1BC4F */,/*45201*/"DUPLOYAN LETTER YE"/* 1BC50 */, /*45202*/"DUPLOYAN LETTER U"/* 1BC51 */,/*45203*/"DUPLOYAN LETTER EU"/* 1BC52 */, /*45204*/"DUPLOYAN LETTER XW"/* 1BC53 */,/*45205*/"DUPLOYAN LETTER U N"/* 1BC54 */, /*45206*/"DUPLOYAN LETTER LONG U"/* 1BC55 */,/*45207*/"DUPLOYAN LETTER ROMANIAN U"/* 1BC56 */, /*45208*/"DUPLOYAN LETTER UH"/* 1BC57 */,/*45209*/"DUPLOYAN LETTER SLOAN U"/* 1BC58 */, /*45210*/"DUPLOYAN LETTER OOH"/* 1BC59 */,/*45211*/"DUPLOYAN LETTER OW"/* 1BC5A */, /*45212*/"DUPLOYAN LETTER OU"/* 1BC5B */,/*45213*/"DUPLOYAN LETTER WA"/* 1BC5C */, /*45214*/"DUPLOYAN LETTER WO"/* 1BC5D */,/*45215*/"DUPLOYAN LETTER WI"/* 1BC5E */, /*45216*/"DUPLOYAN LETTER WEI"/* 1BC5F */,/*45217*/"DUPLOYAN LETTER WOW"/* 1BC60 */, /*45218*/"DUPLOYAN LETTER NASAL U"/* 1BC61 */,/*45219*/"DUPLOYAN LETTER NASAL O"/* 1BC62 */, /*45220*/"DUPLOYAN LETTER NASAL I"/* 1BC63 */,/*45221*/"DUPLOYAN LETTER NASAL A"/* 1BC64 */, /*45222*/"DUPLOYAN LETTER PERNIN AN"/* 1BC65 */,/*45223*/"DUPLOYAN LETTER PERNIN AM"/* 1BC66 */, /*45224*/"DUPLOYAN LETTER SLOAN EN"/* 1BC67 */,/*45225*/"DUPLOYAN LETTER SLOAN AN"/* 1BC68 */, /*45226*/"DUPLOYAN LETTER SLOAN ON"/* 1BC69 */,/*45227*/"DUPLOYAN LETTER VOCALIC M"/* 1BC6A */,NULL,NULL,NULL,NULL,NULL, /*45233*/"DUPLOYAN AFFIX LEFT HORIZONTAL SECANT"/* 1BC70 */,/*45234*/"DUPLOYAN AFFIX MID HORIZONTAL SECANT"/* 1BC71 */, /*45235*/"DUPLOYAN AFFIX RIGHT HORIZONTAL SECANT"/* 1BC72 */,/*45236*/"DUPLOYAN AFFIX LOW VERTICAL SECANT"/* 1BC73 */, /*45237*/"DUPLOYAN AFFIX MID VERTICAL SECANT"/* 1BC74 */,/*45238*/"DUPLOYAN AFFIX HIGH VERTICAL SECANT"/* 1BC75 */, /*45239*/"DUPLOYAN AFFIX ATTACHED SECANT"/* 1BC76 */,/*45240*/"DUPLOYAN AFFIX ATTACHED LEFT-TO-RIGHT SECANT"/* 1BC77 */, /*45241*/"DUPLOYAN AFFIX ATTACHED TANGENT"/* 1BC78 */,/*45242*/"DUPLOYAN AFFIX ATTACHED TAIL"/* 1BC79 */, /*45243*/"DUPLOYAN AFFIX ATTACHED E HOOK"/* 1BC7A */,/*45244*/"DUPLOYAN AFFIX ATTACHED I HOOK"/* 1BC7B */, /*45245*/"DUPLOYAN AFFIX ATTACHED TANGENT HOOK"/* 1BC7C */,NULL,NULL,NULL, /*45249*/"DUPLOYAN AFFIX HIGH ACUTE"/* 1BC80 */,/*45250*/"DUPLOYAN AFFIX HIGH TIGHT ACUTE"/* 1BC81 */, /*45251*/"DUPLOYAN AFFIX HIGH GRAVE"/* 1BC82 */,/*45252*/"DUPLOYAN AFFIX HIGH LONG GRAVE"/* 1BC83 */, /*45253*/"DUPLOYAN AFFIX HIGH DOT"/* 1BC84 */,/*45254*/"DUPLOYAN AFFIX HIGH CIRCLE"/* 1BC85 */, /*45255*/"DUPLOYAN AFFIX HIGH LINE"/* 1BC86 */,/*45256*/"DUPLOYAN AFFIX HIGH WAVE"/* 1BC87 */, /*45257*/"DUPLOYAN AFFIX HIGH VERTICAL"/* 1BC88 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*45265*/"DUPLOYAN AFFIX LOW ACUTE"/* 1BC90 */,/*45266*/"DUPLOYAN AFFIX LOW TIGHT ACUTE"/* 1BC91 */, /*45267*/"DUPLOYAN AFFIX LOW GRAVE"/* 1BC92 */,/*45268*/"DUPLOYAN AFFIX LOW LONG GRAVE"/* 1BC93 */, /*45269*/"DUPLOYAN AFFIX LOW DOT"/* 1BC94 */,/*45270*/"DUPLOYAN AFFIX LOW CIRCLE"/* 1BC95 */, /*45271*/"DUPLOYAN AFFIX LOW LINE"/* 1BC96 */,/*45272*/"DUPLOYAN AFFIX LOW WAVE"/* 1BC97 */, /*45273*/"DUPLOYAN AFFIX LOW VERTICAL"/* 1BC98 */,/*45274*/"DUPLOYAN AFFIX LOW ARROW"/* 1BC99 */,NULL,NULL, /*45277*/"DUPLOYAN SIGN O WITH CROSS"/* 1BC9C */,/*45278*/"DUPLOYAN THICK LETTER SELECTOR"/* 1BC9D */, /*45279*/"DUPLOYAN DOUBLE MARK"/* 1BC9E */,/*45280*/"DUPLOYAN PUNCTUATION CHINOOK FULL STOP"/* 1BC9F */, /*45281*/"SHORTHAND FORMAT LETTER OVERLAP"/* 1BCA0 */,/*45282*/"SHORTHAND FORMAT CONTINUING OVERLAP"/* 1BCA1 */, /*45283*/"SHORTHAND FORMAT DOWN STEP"/* 1BCA2 */,/*45284*/"SHORTHAND FORMAT UP STEP"/* 1BCA3 */, /*45285*/"BYZANTINE MUSICAL SYMBOL PSILI"/* 1D000 */,/*45286*/"BYZANTINE MUSICAL SYMBOL DASEIA"/* 1D001 */, /*45287*/"BYZANTINE MUSICAL SYMBOL PERISPOMENI"/* 1D002 */, /*45288*/"BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON"/* 1D003 */, /*45289*/"BYZANTINE MUSICAL SYMBOL OXEIA DIPLI"/* 1D004 */, /*45290*/"BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON"/* 1D005 */, /*45291*/"BYZANTINE MUSICAL SYMBOL VAREIA DIPLI"/* 1D006 */,/*45292*/"BYZANTINE MUSICAL SYMBOL KATHISTI"/* 1D007 */, /*45293*/"BYZANTINE MUSICAL SYMBOL SYRMATIKI"/* 1D008 */,/*45294*/"BYZANTINE MUSICAL SYMBOL PARAKLITIKI"/* 1D009 */, /*45295*/"BYZANTINE MUSICAL SYMBOL YPOKRISIS"/* 1D00A */,/*45296*/"BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI"/* 1D00B */, /*45297*/"BYZANTINE MUSICAL SYMBOL KREMASTI"/* 1D00C */,/*45298*/"BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON"/* 1D00D */, /*45299*/"BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON"/* 1D00E */,/*45300*/"BYZANTINE MUSICAL SYMBOL TELEIA"/* 1D00F */, /*45301*/"BYZANTINE MUSICAL SYMBOL KENTIMATA"/* 1D010 */,/*45302*/"BYZANTINE MUSICAL SYMBOL APOSTROFOS"/* 1D011 */, /*45303*/"BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI"/* 1D012 */,/*45304*/"BYZANTINE MUSICAL SYMBOL SYNEVMA"/* 1D013 */, /*45305*/"BYZANTINE MUSICAL SYMBOL THITA"/* 1D014 */,/*45306*/"BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION"/* 1D015 */, /*45307*/"BYZANTINE MUSICAL SYMBOL GORGON ARCHAION"/* 1D016 */,/*45308*/"BYZANTINE MUSICAL SYMBOL PSILON"/* 1D017 */, /*45309*/"BYZANTINE MUSICAL SYMBOL CHAMILON"/* 1D018 */,/*45310*/"BYZANTINE MUSICAL SYMBOL VATHY"/* 1D019 */, /*45311*/"BYZANTINE MUSICAL SYMBOL ISON ARCHAION"/* 1D01A */, /*45312*/"BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION"/* 1D01B */, /*45313*/"BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION"/* 1D01C */, /*45314*/"BYZANTINE MUSICAL SYMBOL SAXIMATA"/* 1D01D */,/*45315*/"BYZANTINE MUSICAL SYMBOL PARICHON"/* 1D01E */, /*45316*/"BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA"/* 1D01F */, /*45317*/"BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION"/* 1D020 */, /*45318*/"BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION"/* 1D021 */, /*45319*/"BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION"/* 1D022 */,/*45320*/"BYZANTINE MUSICAL SYMBOL APOTHEMA"/* 1D023 */, /*45321*/"BYZANTINE MUSICAL SYMBOL KLASMA"/* 1D024 */,/*45322*/"BYZANTINE MUSICAL SYMBOL REVMA"/* 1D025 */, /*45323*/"BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION"/* 1D026 */,/*45324*/"BYZANTINE MUSICAL SYMBOL TINAGMA"/* 1D027 */, /*45325*/"BYZANTINE MUSICAL SYMBOL ANATRICHISMA"/* 1D028 */,/*45326*/"BYZANTINE MUSICAL SYMBOL SEISMA"/* 1D029 */, /*45327*/"BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION"/* 1D02A */, /*45328*/"BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU"/* 1D02B */, /*45329*/"BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION"/* 1D02C */,/*45330*/"BYZANTINE MUSICAL SYMBOL THEMA"/* 1D02D */, /*45331*/"BYZANTINE MUSICAL SYMBOL LEMOI"/* 1D02E */,/*45332*/"BYZANTINE MUSICAL SYMBOL DYO"/* 1D02F */, /*45333*/"BYZANTINE MUSICAL SYMBOL TRIA"/* 1D030 */,/*45334*/"BYZANTINE MUSICAL SYMBOL TESSERA"/* 1D031 */, /*45335*/"BYZANTINE MUSICAL SYMBOL KRATIMATA"/* 1D032 */,/*45336*/"BYZANTINE MUSICAL SYMBOL APESO EXO NEO"/* 1D033 */, /*45337*/"BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION"/* 1D034 */,/*45338*/"BYZANTINE MUSICAL SYMBOL IMIFTHORA"/* 1D035 */, /*45339*/"BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION"/* 1D036 */, /*45340*/"BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON"/* 1D037 */,/*45341*/"BYZANTINE MUSICAL SYMBOL PELASTON"/* 1D038 */, /*45342*/"BYZANTINE MUSICAL SYMBOL PSIFISTON"/* 1D039 */,/*45343*/"BYZANTINE MUSICAL SYMBOL KONTEVMA"/* 1D03A */, /*45344*/"BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION"/* 1D03B */,/*45345*/"BYZANTINE MUSICAL SYMBOL RAPISMA"/* 1D03C */, /*45346*/"BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION"/* 1D03D */, /*45347*/"BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION"/* 1D03E */, /*45348*/"BYZANTINE MUSICAL SYMBOL ICHADIN"/* 1D03F */,/*45349*/"BYZANTINE MUSICAL SYMBOL NANA"/* 1D040 */, /*45350*/"BYZANTINE MUSICAL SYMBOL PETASMA"/* 1D041 */,/*45351*/"BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO"/* 1D042 */, /*45352*/"BYZANTINE MUSICAL SYMBOL TROMIKON ALLO"/* 1D043 */,/*45353*/"BYZANTINE MUSICAL SYMBOL STRAGGISMATA"/* 1D044 */, /*45354*/"BYZANTINE MUSICAL SYMBOL GRONTHISMATA"/* 1D045 */,/*45355*/"BYZANTINE MUSICAL SYMBOL ISON NEO"/* 1D046 */, /*45356*/"BYZANTINE MUSICAL SYMBOL OLIGON NEO"/* 1D047 */,/*45357*/"BYZANTINE MUSICAL SYMBOL OXEIA NEO"/* 1D048 */, /*45358*/"BYZANTINE MUSICAL SYMBOL PETASTI"/* 1D049 */,/*45359*/"BYZANTINE MUSICAL SYMBOL KOUFISMA"/* 1D04A */, /*45360*/"BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA"/* 1D04B */, /*45361*/"BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA"/* 1D04C */, /*45362*/"BYZANTINE MUSICAL SYMBOL PELASTON NEO"/* 1D04D */, /*45363*/"BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO"/* 1D04E */, /*45364*/"BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO"/* 1D04F */,/*45365*/"BYZANTINE MUSICAL SYMBOL YPSILI"/* 1D050 */, /*45366*/"BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO"/* 1D051 */, /*45367*/"BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO"/* 1D052 */, /*45368*/"BYZANTINE MUSICAL SYMBOL YPORROI"/* 1D053 */,/*45369*/"BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON"/* 1D054 */, /*45370*/"BYZANTINE MUSICAL SYMBOL ELAFRON"/* 1D055 */,/*45371*/"BYZANTINE MUSICAL SYMBOL CHAMILI"/* 1D056 */, /*45372*/"BYZANTINE MUSICAL SYMBOL MIKRON ISON"/* 1D057 */,/*45373*/"BYZANTINE MUSICAL SYMBOL VAREIA NEO"/* 1D058 */, /*45374*/"BYZANTINE MUSICAL SYMBOL PIASMA NEO"/* 1D059 */,/*45375*/"BYZANTINE MUSICAL SYMBOL PSIFISTON NEO"/* 1D05A */, /*45376*/"BYZANTINE MUSICAL SYMBOL OMALON"/* 1D05B */,/*45377*/"BYZANTINE MUSICAL SYMBOL ANTIKENOMA"/* 1D05C */, /*45378*/"BYZANTINE MUSICAL SYMBOL LYGISMA"/* 1D05D */,/*45379*/"BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO"/* 1D05E */, /*45380*/"BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO"/* 1D05F */, /*45381*/"BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA"/* 1D060 */,/*45382*/"BYZANTINE MUSICAL SYMBOL KYLISMA"/* 1D061 */, /*45383*/"BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA"/* 1D062 */, /*45384*/"BYZANTINE MUSICAL SYMBOL TROMIKON NEO"/* 1D063 */,/*45385*/"BYZANTINE MUSICAL SYMBOL EKSTREPTON"/* 1D064 */, /*45386*/"BYZANTINE MUSICAL SYMBOL SYNAGMA NEO"/* 1D065 */,/*45387*/"BYZANTINE MUSICAL SYMBOL SYRMA"/* 1D066 */, /*45388*/"BYZANTINE MUSICAL SYMBOL CHOREVMA NEO"/* 1D067 */,/*45389*/"BYZANTINE MUSICAL SYMBOL EPEGERMA"/* 1D068 */, /*45390*/"BYZANTINE MUSICAL SYMBOL SEISMA NEO"/* 1D069 */,/*45391*/"BYZANTINE MUSICAL SYMBOL XIRON KLASMA"/* 1D06A */, /*45392*/"BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON"/* 1D06B */, /*45393*/"BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA"/* 1D06C */, /*45394*/"BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA"/* 1D06D */, /*45395*/"BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA"/* 1D06E */, /*45396*/"BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA"/* 1D06F */, /*45397*/"BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA"/* 1D070 */, /*45398*/"BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA"/* 1D071 */, /*45399*/"BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON"/* 1D072 */, /*45400*/"BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON"/* 1D073 */, /*45401*/"BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON"/* 1D074 */, /*45402*/"BYZANTINE MUSICAL SYMBOL OYRANISMA NEO"/* 1D075 */, /*45403*/"BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO"/* 1D076 */, /*45404*/"BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO"/* 1D077 */, /*45405*/"BYZANTINE MUSICAL SYMBOL THEMA APLOUN"/* 1D078 */, /*45406*/"BYZANTINE MUSICAL SYMBOL THES KAI APOTHES"/* 1D079 */,/*45407*/"BYZANTINE MUSICAL SYMBOL KATAVASMA"/* 1D07A */, /*45408*/"BYZANTINE MUSICAL SYMBOL ENDOFONON"/* 1D07B */,/*45409*/"BYZANTINE MUSICAL SYMBOL YFEN KATO"/* 1D07C */, /*45410*/"BYZANTINE MUSICAL SYMBOL YFEN ANO"/* 1D07D */,/*45411*/"BYZANTINE MUSICAL SYMBOL STAVROS"/* 1D07E */, /*45412*/"BYZANTINE MUSICAL SYMBOL KLASMA ANO"/* 1D07F */,/*45413*/"BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION"/* 1D080 */, /*45414*/"BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION"/* 1D081 */, /*45415*/"BYZANTINE MUSICAL SYMBOL KRATIMA ALLO"/* 1D082 */,/*45416*/"BYZANTINE MUSICAL SYMBOL KRATIMA NEO"/* 1D083 */, /*45417*/"BYZANTINE MUSICAL SYMBOL APODERMA NEO"/* 1D084 */,/*45418*/"BYZANTINE MUSICAL SYMBOL APLI"/* 1D085 */, /*45419*/"BYZANTINE MUSICAL SYMBOL DIPLI"/* 1D086 */,/*45420*/"BYZANTINE MUSICAL SYMBOL TRIPLI"/* 1D087 */, /*45421*/"BYZANTINE MUSICAL SYMBOL TETRAPLI"/* 1D088 */,/*45422*/"BYZANTINE MUSICAL SYMBOL KORONIS"/* 1D089 */, /*45423*/"BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU"/* 1D08A */, /*45424*/"BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON"/* 1D08B */, /*45425*/"BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON"/* 1D08C */, /*45426*/"BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON"/* 1D08D */, /*45427*/"BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU"/* 1D08E */, /*45428*/"BYZANTINE MUSICAL SYMBOL GORGON NEO ANO"/* 1D08F */, /*45429*/"BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA"/* 1D090 */, /*45430*/"BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA"/* 1D091 */, /*45431*/"BYZANTINE MUSICAL SYMBOL DIGORGON"/* 1D092 */, /*45432*/"BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO"/* 1D093 */, /*45433*/"BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO"/* 1D094 */, /*45434*/"BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA"/* 1D095 */, /*45435*/"BYZANTINE MUSICAL SYMBOL TRIGORGON"/* 1D096 */,/*45436*/"BYZANTINE MUSICAL SYMBOL ARGON"/* 1D097 */, /*45437*/"BYZANTINE MUSICAL SYMBOL IMIDIARGON"/* 1D098 */,/*45438*/"BYZANTINE MUSICAL SYMBOL DIARGON"/* 1D099 */, /*45439*/"BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI"/* 1D09A */, /*45440*/"BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI"/* 1D09B */,/*45441*/"BYZANTINE MUSICAL SYMBOL AGOGI ARGI"/* 1D09C */, /*45442*/"BYZANTINE MUSICAL SYMBOL AGOGI METRIA"/* 1D09D */,/*45443*/"BYZANTINE MUSICAL SYMBOL AGOGI MESI"/* 1D09E */, /*45444*/"BYZANTINE MUSICAL SYMBOL AGOGI GORGI"/* 1D09F */, /*45445*/"BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI"/* 1D0A0 */, /*45446*/"BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI"/* 1D0A1 */, /*45447*/"BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS"/* 1D0A2 */, /*45448*/"BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS"/* 1D0A3 */, /*45449*/"BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS"/* 1D0A4 */, /*45450*/"BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS"/* 1D0A5 */, /*45451*/"BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS"/* 1D0A6 */, /*45452*/"BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS"/* 1D0A7 */, /*45453*/"BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS"/* 1D0A8 */, /*45454*/"BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS"/* 1D0A9 */, /*45455*/"BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS"/* 1D0AA */, /*45456*/"BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS"/* 1D0AB */, /*45457*/"BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS"/* 1D0AC */, /*45458*/"BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS"/* 1D0AD */, /*45459*/"BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS"/* 1D0AE */, /*45460*/"BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS"/* 1D0AF */, /*45461*/"BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS"/* 1D0B0 */, /*45462*/"BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS"/* 1D0B1 */, /*45463*/"BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS"/* 1D0B2 */, /*45464*/"BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS"/* 1D0B3 */, /*45465*/"BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN"/* 1D0B4 */, /*45466*/"BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN"/* 1D0B5 */, /*45467*/"BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU"/* 1D0B6 */, /*45468*/"BYZANTINE MUSICAL SYMBOL IMIFONON"/* 1D0B7 */,/*45469*/"BYZANTINE MUSICAL SYMBOL IMIFTHORON"/* 1D0B8 */, /*45470*/"BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU"/* 1D0B9 */, /*45471*/"BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA"/* 1D0BA */, /*45472*/"BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA"/* 1D0BB */, /*45473*/"BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS"/* 1D0BC */, /*45474*/"BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI"/* 1D0BD */, /*45475*/"BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI"/* 1D0BE */, /*45476*/"BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE"/* 1D0BF */, /*45477*/"BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO"/* 1D0C0 */, /*45478*/"BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO"/* 1D0C1 */, /*45479*/"BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO"/* 1D0C2 */, /*45480*/"BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS"/* 1D0C3 */, /*45481*/"BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS"/* 1D0C4 */, /*45482*/"BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS"/* 1D0C5 */, /*45483*/"BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI"/* 1D0C6 */, /*45484*/"BYZANTINE MUSICAL SYMBOL FTHORA NENANO"/* 1D0C7 */,/*45485*/"BYZANTINE MUSICAL SYMBOL CHROA ZYGOS"/* 1D0C8 */, /*45486*/"BYZANTINE MUSICAL SYMBOL CHROA KLITON"/* 1D0C9 */,/*45487*/"BYZANTINE MUSICAL SYMBOL CHROA SPATHI"/* 1D0CA */, /*45488*/"BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION"/* 1D0CB */, /*45489*/"BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA"/* 1D0CC */, /*45490*/"BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION"/* 1D0CD */, /*45491*/"BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION"/* 1D0CE */, /*45492*/"BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION"/* 1D0CF */, /*45493*/"BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA"/* 1D0D0 */, /*45494*/"BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA"/* 1D0D1 */, /*45495*/"BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA"/* 1D0D2 */, /*45496*/"BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA"/* 1D0D3 */, /*45497*/"BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA"/* 1D0D4 */, /*45498*/"BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA"/* 1D0D5 */, /*45499*/"BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA"/* 1D0D6 */, /*45500*/"BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA"/* 1D0D7 */, /*45501*/"BYZANTINE MUSICAL SYMBOL GENIKI DIESIS"/* 1D0D8 */, /*45502*/"BYZANTINE MUSICAL SYMBOL GENIKI YFESIS"/* 1D0D9 */, /*45503*/"BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI"/* 1D0DA */, /*45504*/"BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI"/* 1D0DB */, /*45505*/"BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI"/* 1D0DC */, /*45506*/"BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS"/* 1D0DD */, /*45507*/"BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS"/* 1D0DE */, /*45508*/"BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU"/* 1D0DF */, /*45509*/"BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU"/* 1D0E0 */, /*45510*/"BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU"/* 1D0E1 */, /*45511*/"BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS"/* 1D0E2 */, /*45512*/"BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU"/* 1D0E3 */, /*45513*/"BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU"/* 1D0E4 */, /*45514*/"BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU"/* 1D0E5 */, /*45515*/"BYZANTINE MUSICAL SYMBOL DIGRAMMA GG"/* 1D0E6 */,/*45516*/"BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU"/* 1D0E7 */, /*45517*/"BYZANTINE MUSICAL SYMBOL STIGMA"/* 1D0E8 */,/*45518*/"BYZANTINE MUSICAL SYMBOL ARKTIKO PA"/* 1D0E9 */, /*45519*/"BYZANTINE MUSICAL SYMBOL ARKTIKO VOU"/* 1D0EA */,/*45520*/"BYZANTINE MUSICAL SYMBOL ARKTIKO GA"/* 1D0EB */, /*45521*/"BYZANTINE MUSICAL SYMBOL ARKTIKO DI"/* 1D0EC */,/*45522*/"BYZANTINE MUSICAL SYMBOL ARKTIKO KE"/* 1D0ED */, /*45523*/"BYZANTINE MUSICAL SYMBOL ARKTIKO ZO"/* 1D0EE */,/*45524*/"BYZANTINE MUSICAL SYMBOL ARKTIKO NI"/* 1D0EF */, /*45525*/"BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO"/* 1D0F0 */, /*45526*/"BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO"/* 1D0F1 */, /*45527*/"BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO"/* 1D0F2 */, /*45528*/"BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO"/* 1D0F3 */, /*45529*/"BYZANTINE MUSICAL SYMBOL KLASMA KATO"/* 1D0F4 */, /*45530*/"BYZANTINE MUSICAL SYMBOL GORGON NEO KATO"/* 1D0F5 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*45541*/"MUSICAL SYMBOL SINGLE BARLINE"/* 1D100 */,/*45542*/"MUSICAL SYMBOL DOUBLE BARLINE"/* 1D101 */, /*45543*/"MUSICAL SYMBOL FINAL BARLINE"/* 1D102 */,/*45544*/"MUSICAL SYMBOL REVERSE FINAL BARLINE"/* 1D103 */, /*45545*/"MUSICAL SYMBOL DASHED BARLINE"/* 1D104 */,/*45546*/"MUSICAL SYMBOL SHORT BARLINE"/* 1D105 */, /*45547*/"MUSICAL SYMBOL LEFT REPEAT SIGN"/* 1D106 */,/*45548*/"MUSICAL SYMBOL RIGHT REPEAT SIGN"/* 1D107 */, /*45549*/"MUSICAL SYMBOL REPEAT DOTS"/* 1D108 */,/*45550*/"MUSICAL SYMBOL DAL SEGNO"/* 1D109 */, /*45551*/"MUSICAL SYMBOL DA CAPO"/* 1D10A */,/*45552*/"MUSICAL SYMBOL SEGNO"/* 1D10B */, /*45553*/"MUSICAL SYMBOL CODA"/* 1D10C */,/*45554*/"MUSICAL SYMBOL REPEATED FIGURE-1"/* 1D10D */, /*45555*/"MUSICAL SYMBOL REPEATED FIGURE-2"/* 1D10E */,/*45556*/"MUSICAL SYMBOL REPEATED FIGURE-3"/* 1D10F */, /*45557*/"MUSICAL SYMBOL FERMATA"/* 1D110 */,/*45558*/"MUSICAL SYMBOL FERMATA BELOW"/* 1D111 */, /*45559*/"MUSICAL SYMBOL BREATH MARK"/* 1D112 */,/*45560*/"MUSICAL SYMBOL CAESURA"/* 1D113 */, /*45561*/"MUSICAL SYMBOL BRACE"/* 1D114 */,/*45562*/"MUSICAL SYMBOL BRACKET"/* 1D115 */, /*45563*/"MUSICAL SYMBOL ONE-LINE STAFF"/* 1D116 */,/*45564*/"MUSICAL SYMBOL TWO-LINE STAFF"/* 1D117 */, /*45565*/"MUSICAL SYMBOL THREE-LINE STAFF"/* 1D118 */,/*45566*/"MUSICAL SYMBOL FOUR-LINE STAFF"/* 1D119 */, /*45567*/"MUSICAL SYMBOL FIVE-LINE STAFF"/* 1D11A */,/*45568*/"MUSICAL SYMBOL SIX-LINE STAFF"/* 1D11B */, /*45569*/"MUSICAL SYMBOL SIX-STRING FRETBOARD"/* 1D11C */,/*45570*/"MUSICAL SYMBOL FOUR-STRING FRETBOARD"/* 1D11D */, /*45571*/"MUSICAL SYMBOL G CLEF"/* 1D11E */,/*45572*/"MUSICAL SYMBOL G CLEF OTTAVA ALTA"/* 1D11F */, /*45573*/"MUSICAL SYMBOL G CLEF OTTAVA BASSA"/* 1D120 */,/*45574*/"MUSICAL SYMBOL C CLEF"/* 1D121 */, /*45575*/"MUSICAL SYMBOL F CLEF"/* 1D122 */,/*45576*/"MUSICAL SYMBOL F CLEF OTTAVA ALTA"/* 1D123 */, /*45577*/"MUSICAL SYMBOL F CLEF OTTAVA BASSA"/* 1D124 */,/*45578*/"MUSICAL SYMBOL DRUM CLEF-1"/* 1D125 */, /*45579*/"MUSICAL SYMBOL DRUM CLEF-2"/* 1D126 */,NULL,NULL,/*45582*/"MUSICAL SYMBOL MULTIPLE MEASURE REST"/* 1D129 */, /*45583*/"MUSICAL SYMBOL DOUBLE SHARP"/* 1D12A */,/*45584*/"MUSICAL SYMBOL DOUBLE FLAT"/* 1D12B */, /*45585*/"MUSICAL SYMBOL FLAT UP"/* 1D12C */,/*45586*/"MUSICAL SYMBOL FLAT DOWN"/* 1D12D */, /*45587*/"MUSICAL SYMBOL NATURAL UP"/* 1D12E */,/*45588*/"MUSICAL SYMBOL NATURAL DOWN"/* 1D12F */, /*45589*/"MUSICAL SYMBOL SHARP UP"/* 1D130 */,/*45590*/"MUSICAL SYMBOL SHARP DOWN"/* 1D131 */, /*45591*/"MUSICAL SYMBOL QUARTER TONE SHARP"/* 1D132 */,/*45592*/"MUSICAL SYMBOL QUARTER TONE FLAT"/* 1D133 */, /*45593*/"MUSICAL SYMBOL COMMON TIME"/* 1D134 */,/*45594*/"MUSICAL SYMBOL CUT TIME"/* 1D135 */, /*45595*/"MUSICAL SYMBOL OTTAVA ALTA"/* 1D136 */,/*45596*/"MUSICAL SYMBOL OTTAVA BASSA"/* 1D137 */, /*45597*/"MUSICAL SYMBOL QUINDICESIMA ALTA"/* 1D138 */,/*45598*/"MUSICAL SYMBOL QUINDICESIMA BASSA"/* 1D139 */, /*45599*/"MUSICAL SYMBOL MULTI REST"/* 1D13A */,/*45600*/"MUSICAL SYMBOL WHOLE REST"/* 1D13B */, /*45601*/"MUSICAL SYMBOL HALF REST"/* 1D13C */,/*45602*/"MUSICAL SYMBOL QUARTER REST"/* 1D13D */, /*45603*/"MUSICAL SYMBOL EIGHTH REST"/* 1D13E */,/*45604*/"MUSICAL SYMBOL SIXTEENTH REST"/* 1D13F */, /*45605*/"MUSICAL SYMBOL THIRTY-SECOND REST"/* 1D140 */,/*45606*/"MUSICAL SYMBOL SIXTY-FOURTH REST"/* 1D141 */, /*45607*/"MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST"/* 1D142 */,/*45608*/"MUSICAL SYMBOL X NOTEHEAD"/* 1D143 */, /*45609*/"MUSICAL SYMBOL PLUS NOTEHEAD"/* 1D144 */,/*45610*/"MUSICAL SYMBOL CIRCLE X NOTEHEAD"/* 1D145 */, /*45611*/"MUSICAL SYMBOL SQUARE NOTEHEAD WHITE"/* 1D146 */,/*45612*/"MUSICAL SYMBOL SQUARE NOTEHEAD BLACK"/* 1D147 */, /*45613*/"MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE"/* 1D148 */, /*45614*/"MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK"/* 1D149 */, /*45615*/"MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE"/* 1D14A */, /*45616*/"MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK"/* 1D14B */, /*45617*/"MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE"/* 1D14C */, /*45618*/"MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK"/* 1D14D */, /*45619*/"MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE"/* 1D14E */, /*45620*/"MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK"/* 1D14F */, /*45621*/"MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE"/* 1D150 */, /*45622*/"MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK"/* 1D151 */, /*45623*/"MUSICAL SYMBOL MOON NOTEHEAD WHITE"/* 1D152 */,/*45624*/"MUSICAL SYMBOL MOON NOTEHEAD BLACK"/* 1D153 */, /*45625*/"MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE"/* 1D154 */, /*45626*/"MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK"/* 1D155 */, /*45627*/"MUSICAL SYMBOL PARENTHESIS NOTEHEAD"/* 1D156 */,/*45628*/"MUSICAL SYMBOL VOID NOTEHEAD"/* 1D157 */, /*45629*/"MUSICAL SYMBOL NOTEHEAD BLACK"/* 1D158 */,/*45630*/"MUSICAL SYMBOL NULL NOTEHEAD"/* 1D159 */, /*45631*/"MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE"/* 1D15A */,/*45632*/"MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK"/* 1D15B */, /*45633*/"MUSICAL SYMBOL BREVE"/* 1D15C */,/*45634*/"MUSICAL SYMBOL WHOLE NOTE"/* 1D15D */, /*45635*/"MUSICAL SYMBOL HALF NOTE"/* 1D15E */,/*45636*/"MUSICAL SYMBOL QUARTER NOTE"/* 1D15F */, /*45637*/"MUSICAL SYMBOL EIGHTH NOTE"/* 1D160 */,/*45638*/"MUSICAL SYMBOL SIXTEENTH NOTE"/* 1D161 */, /*45639*/"MUSICAL SYMBOL THIRTY-SECOND NOTE"/* 1D162 */,/*45640*/"MUSICAL SYMBOL SIXTY-FOURTH NOTE"/* 1D163 */, /*45641*/"MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE"/* 1D164 */,/*45642*/"MUSICAL SYMBOL COMBINING STEM"/* 1D165 */, /*45643*/"MUSICAL SYMBOL COMBINING SPRECHGESANG STEM"/* 1D166 */, /*45644*/"MUSICAL SYMBOL COMBINING TREMOLO-1"/* 1D167 */,/*45645*/"MUSICAL SYMBOL COMBINING TREMOLO-2"/* 1D168 */, /*45646*/"MUSICAL SYMBOL COMBINING TREMOLO-3"/* 1D169 */,/*45647*/"MUSICAL SYMBOL FINGERED TREMOLO-1"/* 1D16A */, /*45648*/"MUSICAL SYMBOL FINGERED TREMOLO-2"/* 1D16B */,/*45649*/"MUSICAL SYMBOL FINGERED TREMOLO-3"/* 1D16C */, /*45650*/"MUSICAL SYMBOL COMBINING AUGMENTATION DOT"/* 1D16D */,/*45651*/"MUSICAL SYMBOL COMBINING FLAG-1"/* 1D16E */, /*45652*/"MUSICAL SYMBOL COMBINING FLAG-2"/* 1D16F */,/*45653*/"MUSICAL SYMBOL COMBINING FLAG-3"/* 1D170 */, /*45654*/"MUSICAL SYMBOL COMBINING FLAG-4"/* 1D171 */,/*45655*/"MUSICAL SYMBOL COMBINING FLAG-5"/* 1D172 */, /*45656*/"MUSICAL SYMBOL BEGIN BEAM"/* 1D173 */,/*45657*/"MUSICAL SYMBOL END BEAM"/* 1D174 */, /*45658*/"MUSICAL SYMBOL BEGIN TIE"/* 1D175 */,/*45659*/"MUSICAL SYMBOL END TIE"/* 1D176 */, /*45660*/"MUSICAL SYMBOL BEGIN SLUR"/* 1D177 */,/*45661*/"MUSICAL SYMBOL END SLUR"/* 1D178 */, /*45662*/"MUSICAL SYMBOL BEGIN PHRASE"/* 1D179 */,/*45663*/"MUSICAL SYMBOL END PHRASE"/* 1D17A */, /*45664*/"MUSICAL SYMBOL COMBINING ACCENT"/* 1D17B */,/*45665*/"MUSICAL SYMBOL COMBINING STACCATO"/* 1D17C */, /*45666*/"MUSICAL SYMBOL COMBINING TENUTO"/* 1D17D */,/*45667*/"MUSICAL SYMBOL COMBINING STACCATISSIMO"/* 1D17E */, /*45668*/"MUSICAL SYMBOL COMBINING MARCATO"/* 1D17F */,/*45669*/"MUSICAL SYMBOL COMBINING MARCATO-STACCATO"/* 1D180 */, /*45670*/"MUSICAL SYMBOL COMBINING ACCENT-STACCATO"/* 1D181 */,/*45671*/"MUSICAL SYMBOL COMBINING LOURE"/* 1D182 */, /*45672*/"MUSICAL SYMBOL ARPEGGIATO UP"/* 1D183 */,/*45673*/"MUSICAL SYMBOL ARPEGGIATO DOWN"/* 1D184 */, /*45674*/"MUSICAL SYMBOL COMBINING DOIT"/* 1D185 */,/*45675*/"MUSICAL SYMBOL COMBINING RIP"/* 1D186 */, /*45676*/"MUSICAL SYMBOL COMBINING FLIP"/* 1D187 */,/*45677*/"MUSICAL SYMBOL COMBINING SMEAR"/* 1D188 */, /*45678*/"MUSICAL SYMBOL COMBINING BEND"/* 1D189 */,/*45679*/"MUSICAL SYMBOL COMBINING DOUBLE TONGUE"/* 1D18A */, /*45680*/"MUSICAL SYMBOL COMBINING TRIPLE TONGUE"/* 1D18B */,/*45681*/"MUSICAL SYMBOL RINFORZANDO"/* 1D18C */, /*45682*/"MUSICAL SYMBOL SUBITO"/* 1D18D */,/*45683*/"MUSICAL SYMBOL Z"/* 1D18E */, /*45684*/"MUSICAL SYMBOL PIANO"/* 1D18F */,/*45685*/"MUSICAL SYMBOL MEZZO"/* 1D190 */, /*45686*/"MUSICAL SYMBOL FORTE"/* 1D191 */,/*45687*/"MUSICAL SYMBOL CRESCENDO"/* 1D192 */, /*45688*/"MUSICAL SYMBOL DECRESCENDO"/* 1D193 */,/*45689*/"MUSICAL SYMBOL GRACE NOTE SLASH"/* 1D194 */, /*45690*/"MUSICAL SYMBOL GRACE NOTE NO SLASH"/* 1D195 */,/*45691*/"MUSICAL SYMBOL TR"/* 1D196 */, /*45692*/"MUSICAL SYMBOL TURN"/* 1D197 */,/*45693*/"MUSICAL SYMBOL INVERTED TURN"/* 1D198 */, /*45694*/"MUSICAL SYMBOL TURN SLASH"/* 1D199 */,/*45695*/"MUSICAL SYMBOL TURN UP"/* 1D19A */, /*45696*/"MUSICAL SYMBOL ORNAMENT STROKE-1"/* 1D19B */,/*45697*/"MUSICAL SYMBOL ORNAMENT STROKE-2"/* 1D19C */, /*45698*/"MUSICAL SYMBOL ORNAMENT STROKE-3"/* 1D19D */,/*45699*/"MUSICAL SYMBOL ORNAMENT STROKE-4"/* 1D19E */, /*45700*/"MUSICAL SYMBOL ORNAMENT STROKE-5"/* 1D19F */,/*45701*/"MUSICAL SYMBOL ORNAMENT STROKE-6"/* 1D1A0 */, /*45702*/"MUSICAL SYMBOL ORNAMENT STROKE-7"/* 1D1A1 */,/*45703*/"MUSICAL SYMBOL ORNAMENT STROKE-8"/* 1D1A2 */, /*45704*/"MUSICAL SYMBOL ORNAMENT STROKE-9"/* 1D1A3 */,/*45705*/"MUSICAL SYMBOL ORNAMENT STROKE-10"/* 1D1A4 */, /*45706*/"MUSICAL SYMBOL ORNAMENT STROKE-11"/* 1D1A5 */,/*45707*/"MUSICAL SYMBOL HAUPTSTIMME"/* 1D1A6 */, /*45708*/"MUSICAL SYMBOL NEBENSTIMME"/* 1D1A7 */,/*45709*/"MUSICAL SYMBOL END OF STIMME"/* 1D1A8 */, /*45710*/"MUSICAL SYMBOL DEGREE SLASH"/* 1D1A9 */,/*45711*/"MUSICAL SYMBOL COMBINING DOWN BOW"/* 1D1AA */, /*45712*/"MUSICAL SYMBOL COMBINING UP BOW"/* 1D1AB */,/*45713*/"MUSICAL SYMBOL COMBINING HARMONIC"/* 1D1AC */, /*45714*/"MUSICAL SYMBOL COMBINING SNAP PIZZICATO"/* 1D1AD */,/*45715*/"MUSICAL SYMBOL PEDAL MARK"/* 1D1AE */, /*45716*/"MUSICAL SYMBOL PEDAL UP MARK"/* 1D1AF */,/*45717*/"MUSICAL SYMBOL HALF PEDAL MARK"/* 1D1B0 */, /*45718*/"MUSICAL SYMBOL GLISSANDO UP"/* 1D1B1 */,/*45719*/"MUSICAL SYMBOL GLISSANDO DOWN"/* 1D1B2 */, /*45720*/"MUSICAL SYMBOL WITH FINGERNAILS"/* 1D1B3 */,/*45721*/"MUSICAL SYMBOL DAMP"/* 1D1B4 */, /*45722*/"MUSICAL SYMBOL DAMP ALL"/* 1D1B5 */,/*45723*/"MUSICAL SYMBOL MAXIMA"/* 1D1B6 */, /*45724*/"MUSICAL SYMBOL LONGA"/* 1D1B7 */,/*45725*/"MUSICAL SYMBOL BREVIS"/* 1D1B8 */, /*45726*/"MUSICAL SYMBOL SEMIBREVIS WHITE"/* 1D1B9 */,/*45727*/"MUSICAL SYMBOL SEMIBREVIS BLACK"/* 1D1BA */, /*45728*/"MUSICAL SYMBOL MINIMA"/* 1D1BB */,/*45729*/"MUSICAL SYMBOL MINIMA BLACK"/* 1D1BC */, /*45730*/"MUSICAL SYMBOL SEMIMINIMA WHITE"/* 1D1BD */,/*45731*/"MUSICAL SYMBOL SEMIMINIMA BLACK"/* 1D1BE */, /*45732*/"MUSICAL SYMBOL FUSA WHITE"/* 1D1BF */,/*45733*/"MUSICAL SYMBOL FUSA BLACK"/* 1D1C0 */, /*45734*/"MUSICAL SYMBOL LONGA PERFECTA REST"/* 1D1C1 */,/*45735*/"MUSICAL SYMBOL LONGA IMPERFECTA REST"/* 1D1C2 */, /*45736*/"MUSICAL SYMBOL BREVIS REST"/* 1D1C3 */,/*45737*/"MUSICAL SYMBOL SEMIBREVIS REST"/* 1D1C4 */, /*45738*/"MUSICAL SYMBOL MINIMA REST"/* 1D1C5 */,/*45739*/"MUSICAL SYMBOL SEMIMINIMA REST"/* 1D1C6 */, /*45740*/"MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA"/* 1D1C7 */, /*45741*/"MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA"/* 1D1C8 */, /*45742*/"MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1"/* 1D1C9 */, /*45743*/"MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA"/* 1D1CA */, /*45744*/"MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA"/* 1D1CB */, /*45745*/"MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1"/* 1D1CC */, /*45746*/"MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2"/* 1D1CD */, /*45747*/"MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3"/* 1D1CE */, /*45748*/"MUSICAL SYMBOL CROIX"/* 1D1CF */,/*45749*/"MUSICAL SYMBOL GREGORIAN C CLEF"/* 1D1D0 */, /*45750*/"MUSICAL SYMBOL GREGORIAN F CLEF"/* 1D1D1 */,/*45751*/"MUSICAL SYMBOL SQUARE B"/* 1D1D2 */, /*45752*/"MUSICAL SYMBOL VIRGA"/* 1D1D3 */,/*45753*/"MUSICAL SYMBOL PODATUS"/* 1D1D4 */, /*45754*/"MUSICAL SYMBOL CLIVIS"/* 1D1D5 */,/*45755*/"MUSICAL SYMBOL SCANDICUS"/* 1D1D6 */, /*45756*/"MUSICAL SYMBOL CLIMACUS"/* 1D1D7 */,/*45757*/"MUSICAL SYMBOL TORCULUS"/* 1D1D8 */, /*45758*/"MUSICAL SYMBOL PORRECTUS"/* 1D1D9 */,/*45759*/"MUSICAL SYMBOL PORRECTUS FLEXUS"/* 1D1DA */, /*45760*/"MUSICAL SYMBOL SCANDICUS FLEXUS"/* 1D1DB */,/*45761*/"MUSICAL SYMBOL TORCULUS RESUPINUS"/* 1D1DC */, /*45762*/"MUSICAL SYMBOL PES SUBPUNCTIS"/* 1D1DD */,/*45763*/"MUSICAL SYMBOL KIEVAN C CLEF"/* 1D1DE */, /*45764*/"MUSICAL SYMBOL KIEVAN END OF PIECE"/* 1D1DF */,/*45765*/"MUSICAL SYMBOL KIEVAN FINAL NOTE"/* 1D1E0 */, /*45766*/"MUSICAL SYMBOL KIEVAN RECITATIVE MARK"/* 1D1E1 */,/*45767*/"MUSICAL SYMBOL KIEVAN WHOLE NOTE"/* 1D1E2 */, /*45768*/"MUSICAL SYMBOL KIEVAN HALF NOTE"/* 1D1E3 */,/*45769*/"MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM DOWN"/* 1D1E4 */, /*45770*/"MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM UP"/* 1D1E5 */, /*45771*/"MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM DOWN"/* 1D1E6 */, /*45772*/"MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM UP"/* 1D1E7 */,/*45773*/"MUSICAL SYMBOL KIEVAN FLAT SIGN"/* 1D1E8 */, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*45797*/"GREEK VOCAL NOTATION SYMBOL-1"/* 1D200 */,/*45798*/"GREEK VOCAL NOTATION SYMBOL-2"/* 1D201 */, /*45799*/"GREEK VOCAL NOTATION SYMBOL-3"/* 1D202 */,/*45800*/"GREEK VOCAL NOTATION SYMBOL-4"/* 1D203 */, /*45801*/"GREEK VOCAL NOTATION SYMBOL-5"/* 1D204 */,/*45802*/"GREEK VOCAL NOTATION SYMBOL-6"/* 1D205 */, /*45803*/"GREEK VOCAL NOTATION SYMBOL-7"/* 1D206 */,/*45804*/"GREEK VOCAL NOTATION SYMBOL-8"/* 1D207 */, /*45805*/"GREEK VOCAL NOTATION SYMBOL-9"/* 1D208 */,/*45806*/"GREEK VOCAL NOTATION SYMBOL-10"/* 1D209 */, /*45807*/"GREEK VOCAL NOTATION SYMBOL-11"/* 1D20A */,/*45808*/"GREEK VOCAL NOTATION SYMBOL-12"/* 1D20B */, /*45809*/"GREEK VOCAL NOTATION SYMBOL-13"/* 1D20C */,/*45810*/"GREEK VOCAL NOTATION SYMBOL-14"/* 1D20D */, /*45811*/"GREEK VOCAL NOTATION SYMBOL-15"/* 1D20E */,/*45812*/"GREEK VOCAL NOTATION SYMBOL-16"/* 1D20F */, /*45813*/"GREEK VOCAL NOTATION SYMBOL-17"/* 1D210 */,/*45814*/"GREEK VOCAL NOTATION SYMBOL-18"/* 1D211 */, /*45815*/"GREEK VOCAL NOTATION SYMBOL-19"/* 1D212 */,/*45816*/"GREEK VOCAL NOTATION SYMBOL-20"/* 1D213 */, /*45817*/"GREEK VOCAL NOTATION SYMBOL-21"/* 1D214 */,/*45818*/"GREEK VOCAL NOTATION SYMBOL-22"/* 1D215 */, /*45819*/"GREEK VOCAL NOTATION SYMBOL-23"/* 1D216 */,/*45820*/"GREEK VOCAL NOTATION SYMBOL-24"/* 1D217 */, /*45821*/"GREEK VOCAL NOTATION SYMBOL-50"/* 1D218 */,/*45822*/"GREEK VOCAL NOTATION SYMBOL-51"/* 1D219 */, /*45823*/"GREEK VOCAL NOTATION SYMBOL-52"/* 1D21A */,/*45824*/"GREEK VOCAL NOTATION SYMBOL-53"/* 1D21B */, /*45825*/"GREEK VOCAL NOTATION SYMBOL-54"/* 1D21C */,/*45826*/"GREEK INSTRUMENTAL NOTATION SYMBOL-1"/* 1D21D */, /*45827*/"GREEK INSTRUMENTAL NOTATION SYMBOL-2"/* 1D21E */,/*45828*/"GREEK INSTRUMENTAL NOTATION SYMBOL-4"/* 1D21F */, /*45829*/"GREEK INSTRUMENTAL NOTATION SYMBOL-5"/* 1D220 */,/*45830*/"GREEK INSTRUMENTAL NOTATION SYMBOL-7"/* 1D221 */, /*45831*/"GREEK INSTRUMENTAL NOTATION SYMBOL-8"/* 1D222 */,/*45832*/"GREEK INSTRUMENTAL NOTATION SYMBOL-11"/* 1D223 */, /*45833*/"GREEK INSTRUMENTAL NOTATION SYMBOL-12"/* 1D224 */,/*45834*/"GREEK INSTRUMENTAL NOTATION SYMBOL-13"/* 1D225 */, /*45835*/"GREEK INSTRUMENTAL NOTATION SYMBOL-14"/* 1D226 */,/*45836*/"GREEK INSTRUMENTAL NOTATION SYMBOL-17"/* 1D227 */, /*45837*/"GREEK INSTRUMENTAL NOTATION SYMBOL-18"/* 1D228 */,/*45838*/"GREEK INSTRUMENTAL NOTATION SYMBOL-19"/* 1D229 */, /*45839*/"GREEK INSTRUMENTAL NOTATION SYMBOL-23"/* 1D22A */,/*45840*/"GREEK INSTRUMENTAL NOTATION SYMBOL-24"/* 1D22B */, /*45841*/"GREEK INSTRUMENTAL NOTATION SYMBOL-25"/* 1D22C */,/*45842*/"GREEK INSTRUMENTAL NOTATION SYMBOL-26"/* 1D22D */, /*45843*/"GREEK INSTRUMENTAL NOTATION SYMBOL-27"/* 1D22E */,/*45844*/"GREEK INSTRUMENTAL NOTATION SYMBOL-29"/* 1D22F */, /*45845*/"GREEK INSTRUMENTAL NOTATION SYMBOL-30"/* 1D230 */,/*45846*/"GREEK INSTRUMENTAL NOTATION SYMBOL-32"/* 1D231 */, /*45847*/"GREEK INSTRUMENTAL NOTATION SYMBOL-36"/* 1D232 */,/*45848*/"GREEK INSTRUMENTAL NOTATION SYMBOL-37"/* 1D233 */, /*45849*/"GREEK INSTRUMENTAL NOTATION SYMBOL-38"/* 1D234 */,/*45850*/"GREEK INSTRUMENTAL NOTATION SYMBOL-39"/* 1D235 */, /*45851*/"GREEK INSTRUMENTAL NOTATION SYMBOL-40"/* 1D236 */,/*45852*/"GREEK INSTRUMENTAL NOTATION SYMBOL-42"/* 1D237 */, /*45853*/"GREEK INSTRUMENTAL NOTATION SYMBOL-43"/* 1D238 */,/*45854*/"GREEK INSTRUMENTAL NOTATION SYMBOL-45"/* 1D239 */, /*45855*/"GREEK INSTRUMENTAL NOTATION SYMBOL-47"/* 1D23A */,/*45856*/"GREEK INSTRUMENTAL NOTATION SYMBOL-48"/* 1D23B */, /*45857*/"GREEK INSTRUMENTAL NOTATION SYMBOL-49"/* 1D23C */,/*45858*/"GREEK INSTRUMENTAL NOTATION SYMBOL-50"/* 1D23D */, /*45859*/"GREEK INSTRUMENTAL NOTATION SYMBOL-51"/* 1D23E */,/*45860*/"GREEK INSTRUMENTAL NOTATION SYMBOL-52"/* 1D23F */, /*45861*/"GREEK INSTRUMENTAL NOTATION SYMBOL-53"/* 1D240 */,/*45862*/"GREEK INSTRUMENTAL NOTATION SYMBOL-54"/* 1D241 */, /*45863*/"COMBINING GREEK MUSICAL TRISEME"/* 1D242 */,/*45864*/"COMBINING GREEK MUSICAL TETRASEME"/* 1D243 */, /*45865*/"COMBINING GREEK MUSICAL PENTASEME"/* 1D244 */,/*45866*/"GREEK MUSICAL LEIMMA"/* 1D245 */,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*46053*/"MONOGRAM FOR EARTH"/* 1D300 */, /*46054*/"DIGRAM FOR HEAVENLY EARTH"/* 1D301 */,/*46055*/"DIGRAM FOR HUMAN EARTH"/* 1D302 */, /*46056*/"DIGRAM FOR EARTHLY HEAVEN"/* 1D303 */,/*46057*/"DIGRAM FOR EARTHLY HUMAN"/* 1D304 */, /*46058*/"DIGRAM FOR EARTH"/* 1D305 */,/*46059*/"TETRAGRAM FOR CENTRE"/* 1D306 */, /*46060*/"TETRAGRAM FOR FULL CIRCLE"/* 1D307 */,/*46061*/"TETRAGRAM FOR MIRED"/* 1D308 */, /*46062*/"TETRAGRAM FOR BARRIER"/* 1D309 */,/*46063*/"TETRAGRAM FOR KEEPING SMALL"/* 1D30A */, /*46064*/"TETRAGRAM FOR CONTRARIETY"/* 1D30B */,/*46065*/"TETRAGRAM FOR ASCENT"/* 1D30C */, /*46066*/"TETRAGRAM FOR OPPOSITION"/* 1D30D */,/*46067*/"TETRAGRAM FOR BRANCHING OUT"/* 1D30E */, /*46068*/"TETRAGRAM FOR DEFECTIVENESS OR DISTORTION"/* 1D30F */,/*46069*/"TETRAGRAM FOR DIVERGENCE"/* 1D310 */, /*46070*/"TETRAGRAM FOR YOUTHFULNESS"/* 1D311 */,/*46071*/"TETRAGRAM FOR INCREASE"/* 1D312 */, /*46072*/"TETRAGRAM FOR PENETRATION"/* 1D313 */,/*46073*/"TETRAGRAM FOR REACH"/* 1D314 */, /*46074*/"TETRAGRAM FOR CONTACT"/* 1D315 */,/*46075*/"TETRAGRAM FOR HOLDING BACK"/* 1D316 */, /*46076*/"TETRAGRAM FOR WAITING"/* 1D317 */,/*46077*/"TETRAGRAM FOR FOLLOWING"/* 1D318 */, /*46078*/"TETRAGRAM FOR ADVANCE"/* 1D319 */,/*46079*/"TETRAGRAM FOR RELEASE"/* 1D31A */, /*46080*/"TETRAGRAM FOR RESISTANCE"/* 1D31B */,/*46081*/"TETRAGRAM FOR EASE"/* 1D31C */, /*46082*/"TETRAGRAM FOR JOY"/* 1D31D */,/*46083*/"TETRAGRAM FOR CONTENTION"/* 1D31E */, /*46084*/"TETRAGRAM FOR ENDEAVOUR"/* 1D31F */,/*46085*/"TETRAGRAM FOR DUTIES"/* 1D320 */, /*46086*/"TETRAGRAM FOR CHANGE"/* 1D321 */,/*46087*/"TETRAGRAM FOR DECISIVENESS"/* 1D322 */, /*46088*/"TETRAGRAM FOR BOLD RESOLUTION"/* 1D323 */,/*46089*/"TETRAGRAM FOR PACKING"/* 1D324 */, /*46090*/"TETRAGRAM FOR LEGION"/* 1D325 */,/*46091*/"TETRAGRAM FOR CLOSENESS"/* 1D326 */, /*46092*/"TETRAGRAM FOR KINSHIP"/* 1D327 */,/*46093*/"TETRAGRAM FOR GATHERING"/* 1D328 */, /*46094*/"TETRAGRAM FOR STRENGTH"/* 1D329 */,/*46095*/"TETRAGRAM FOR PURITY"/* 1D32A */, /*46096*/"TETRAGRAM FOR FULLNESS"/* 1D32B */,/*46097*/"TETRAGRAM FOR RESIDENCE"/* 1D32C */, /*46098*/"TETRAGRAM FOR LAW OR MODEL"/* 1D32D */,/*46099*/"TETRAGRAM FOR RESPONSE"/* 1D32E */, /*46100*/"TETRAGRAM FOR GOING TO MEET"/* 1D32F */,/*46101*/"TETRAGRAM FOR ENCOUNTERS"/* 1D330 */, /*46102*/"TETRAGRAM FOR STOVE"/* 1D331 */,/*46103*/"TETRAGRAM FOR GREATNESS"/* 1D332 */, /*46104*/"TETRAGRAM FOR ENLARGEMENT"/* 1D333 */,/*46105*/"TETRAGRAM FOR PATTERN"/* 1D334 */, /*46106*/"TETRAGRAM FOR RITUAL"/* 1D335 */,/*46107*/"TETRAGRAM FOR FLIGHT"/* 1D336 */, /*46108*/"TETRAGRAM FOR VASTNESS OR WASTING"/* 1D337 */,/*46109*/"TETRAGRAM FOR CONSTANCY"/* 1D338 */, /*46110*/"TETRAGRAM FOR MEASURE"/* 1D339 */,/*46111*/"TETRAGRAM FOR ETERNITY"/* 1D33A */, /*46112*/"TETRAGRAM FOR UNITY"/* 1D33B */,/*46113*/"TETRAGRAM FOR DIMINISHMENT"/* 1D33C */, /*46114*/"TETRAGRAM FOR CLOSED MOUTH"/* 1D33D */,/*46115*/"TETRAGRAM FOR GUARDEDNESS"/* 1D33E */, /*46116*/"TETRAGRAM FOR GATHERING IN"/* 1D33F */,/*46117*/"TETRAGRAM FOR MASSING"/* 1D340 */, /*46118*/"TETRAGRAM FOR ACCUMULATION"/* 1D341 */,/*46119*/"TETRAGRAM FOR EMBELLISHMENT"/* 1D342 */, /*46120*/"TETRAGRAM FOR DOUBT"/* 1D343 */,/*46121*/"TETRAGRAM FOR WATCH"/* 1D344 */, /*46122*/"TETRAGRAM FOR SINKING"/* 1D345 */,/*46123*/"TETRAGRAM FOR INNER"/* 1D346 */, /*46124*/"TETRAGRAM FOR DEPARTURE"/* 1D347 */,/*46125*/"TETRAGRAM FOR DARKENING"/* 1D348 */, /*46126*/"TETRAGRAM FOR DIMMING"/* 1D349 */,/*46127*/"TETRAGRAM FOR EXHAUSTION"/* 1D34A */, /*46128*/"TETRAGRAM FOR SEVERANCE"/* 1D34B */,/*46129*/"TETRAGRAM FOR STOPPAGE"/* 1D34C */, /*46130*/"TETRAGRAM FOR HARDNESS"/* 1D34D */,/*46131*/"TETRAGRAM FOR COMPLETION"/* 1D34E */, /*46132*/"TETRAGRAM FOR CLOSURE"/* 1D34F */,/*46133*/"TETRAGRAM FOR FAILURE"/* 1D350 */, /*46134*/"TETRAGRAM FOR AGGRAVATION"/* 1D351 */,/*46135*/"TETRAGRAM FOR COMPLIANCE"/* 1D352 */, /*46136*/"TETRAGRAM FOR ON THE VERGE"/* 1D353 */,/*46137*/"TETRAGRAM FOR DIFFICULTIES"/* 1D354 */, /*46138*/"TETRAGRAM FOR LABOURING"/* 1D355 */,/*46139*/"TETRAGRAM FOR FOSTERING"/* 1D356 */,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,/*46149*/"COUNTING ROD UNIT DIGIT ONE"/* 1D360 */,/*46150*/"COUNTING ROD UNIT DIGIT TWO"/* 1D361 */, /*46151*/"COUNTING ROD UNIT DIGIT THREE"/* 1D362 */,/*46152*/"COUNTING ROD UNIT DIGIT FOUR"/* 1D363 */, /*46153*/"COUNTING ROD UNIT DIGIT FIVE"/* 1D364 */,/*46154*/"COUNTING ROD UNIT DIGIT SIX"/* 1D365 */, /*46155*/"COUNTING ROD UNIT DIGIT SEVEN"/* 1D366 */,/*46156*/"COUNTING ROD UNIT DIGIT EIGHT"/* 1D367 */, /*46157*/"COUNTING ROD UNIT DIGIT NINE"/* 1D368 */,/*46158*/"COUNTING ROD TENS DIGIT ONE"/* 1D369 */, /*46159*/"COUNTING ROD TENS DIGIT TWO"/* 1D36A */,/*46160*/"COUNTING ROD TENS DIGIT THREE"/* 1D36B */, /*46161*/"COUNTING ROD TENS DIGIT FOUR"/* 1D36C */,/*46162*/"COUNTING ROD TENS DIGIT FIVE"/* 1D36D */, /*46163*/"COUNTING ROD TENS DIGIT SIX"/* 1D36E */,/*46164*/"COUNTING ROD TENS DIGIT SEVEN"/* 1D36F */, /*46165*/"COUNTING ROD TENS DIGIT EIGHT"/* 1D370 */,/*46166*/"COUNTING ROD TENS DIGIT NINE"/* 1D371 */,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*46309*/"MATHEMATICAL BOLD CAPITAL A"/* 1D400 */,/*46310*/"MATHEMATICAL BOLD CAPITAL B"/* 1D401 */, /*46311*/"MATHEMATICAL BOLD CAPITAL C"/* 1D402 */,/*46312*/"MATHEMATICAL BOLD CAPITAL D"/* 1D403 */, /*46313*/"MATHEMATICAL BOLD CAPITAL E"/* 1D404 */,/*46314*/"MATHEMATICAL BOLD CAPITAL F"/* 1D405 */, /*46315*/"MATHEMATICAL BOLD CAPITAL G"/* 1D406 */,/*46316*/"MATHEMATICAL BOLD CAPITAL H"/* 1D407 */, /*46317*/"MATHEMATICAL BOLD CAPITAL I"/* 1D408 */,/*46318*/"MATHEMATICAL BOLD CAPITAL J"/* 1D409 */, /*46319*/"MATHEMATICAL BOLD CAPITAL K"/* 1D40A */,/*46320*/"MATHEMATICAL BOLD CAPITAL L"/* 1D40B */, /*46321*/"MATHEMATICAL BOLD CAPITAL M"/* 1D40C */,/*46322*/"MATHEMATICAL BOLD CAPITAL N"/* 1D40D */, /*46323*/"MATHEMATICAL BOLD CAPITAL O"/* 1D40E */,/*46324*/"MATHEMATICAL BOLD CAPITAL P"/* 1D40F */, /*46325*/"MATHEMATICAL BOLD CAPITAL Q"/* 1D410 */,/*46326*/"MATHEMATICAL BOLD CAPITAL R"/* 1D411 */, /*46327*/"MATHEMATICAL BOLD CAPITAL S"/* 1D412 */,/*46328*/"MATHEMATICAL BOLD CAPITAL T"/* 1D413 */, /*46329*/"MATHEMATICAL BOLD CAPITAL U"/* 1D414 */,/*46330*/"MATHEMATICAL BOLD CAPITAL V"/* 1D415 */, /*46331*/"MATHEMATICAL BOLD CAPITAL W"/* 1D416 */,/*46332*/"MATHEMATICAL BOLD CAPITAL X"/* 1D417 */, /*46333*/"MATHEMATICAL BOLD CAPITAL Y"/* 1D418 */,/*46334*/"MATHEMATICAL BOLD CAPITAL Z"/* 1D419 */, /*46335*/"MATHEMATICAL BOLD SMALL A"/* 1D41A */,/*46336*/"MATHEMATICAL BOLD SMALL B"/* 1D41B */, /*46337*/"MATHEMATICAL BOLD SMALL C"/* 1D41C */,/*46338*/"MATHEMATICAL BOLD SMALL D"/* 1D41D */, /*46339*/"MATHEMATICAL BOLD SMALL E"/* 1D41E */,/*46340*/"MATHEMATICAL BOLD SMALL F"/* 1D41F */, /*46341*/"MATHEMATICAL BOLD SMALL G"/* 1D420 */,/*46342*/"MATHEMATICAL BOLD SMALL H"/* 1D421 */, /*46343*/"MATHEMATICAL BOLD SMALL I"/* 1D422 */,/*46344*/"MATHEMATICAL BOLD SMALL J"/* 1D423 */, /*46345*/"MATHEMATICAL BOLD SMALL K"/* 1D424 */,/*46346*/"MATHEMATICAL BOLD SMALL L"/* 1D425 */, /*46347*/"MATHEMATICAL BOLD SMALL M"/* 1D426 */,/*46348*/"MATHEMATICAL BOLD SMALL N"/* 1D427 */, /*46349*/"MATHEMATICAL BOLD SMALL O"/* 1D428 */,/*46350*/"MATHEMATICAL BOLD SMALL P"/* 1D429 */, /*46351*/"MATHEMATICAL BOLD SMALL Q"/* 1D42A */,/*46352*/"MATHEMATICAL BOLD SMALL R"/* 1D42B */, /*46353*/"MATHEMATICAL BOLD SMALL S"/* 1D42C */,/*46354*/"MATHEMATICAL BOLD SMALL T"/* 1D42D */, /*46355*/"MATHEMATICAL BOLD SMALL U"/* 1D42E */,/*46356*/"MATHEMATICAL BOLD SMALL V"/* 1D42F */, /*46357*/"MATHEMATICAL BOLD SMALL W"/* 1D430 */,/*46358*/"MATHEMATICAL BOLD SMALL X"/* 1D431 */, /*46359*/"MATHEMATICAL BOLD SMALL Y"/* 1D432 */,/*46360*/"MATHEMATICAL BOLD SMALL Z"/* 1D433 */, /*46361*/"MATHEMATICAL ITALIC CAPITAL A"/* 1D434 */,/*46362*/"MATHEMATICAL ITALIC CAPITAL B"/* 1D435 */, /*46363*/"MATHEMATICAL ITALIC CAPITAL C"/* 1D436 */,/*46364*/"MATHEMATICAL ITALIC CAPITAL D"/* 1D437 */, /*46365*/"MATHEMATICAL ITALIC CAPITAL E"/* 1D438 */,/*46366*/"MATHEMATICAL ITALIC CAPITAL F"/* 1D439 */, /*46367*/"MATHEMATICAL ITALIC CAPITAL G"/* 1D43A */,/*46368*/"MATHEMATICAL ITALIC CAPITAL H"/* 1D43B */, /*46369*/"MATHEMATICAL ITALIC CAPITAL I"/* 1D43C */,/*46370*/"MATHEMATICAL ITALIC CAPITAL J"/* 1D43D */, /*46371*/"MATHEMATICAL ITALIC CAPITAL K"/* 1D43E */,/*46372*/"MATHEMATICAL ITALIC CAPITAL L"/* 1D43F */, /*46373*/"MATHEMATICAL ITALIC CAPITAL M"/* 1D440 */,/*46374*/"MATHEMATICAL ITALIC CAPITAL N"/* 1D441 */, /*46375*/"MATHEMATICAL ITALIC CAPITAL O"/* 1D442 */,/*46376*/"MATHEMATICAL ITALIC CAPITAL P"/* 1D443 */, /*46377*/"MATHEMATICAL ITALIC CAPITAL Q"/* 1D444 */,/*46378*/"MATHEMATICAL ITALIC CAPITAL R"/* 1D445 */, /*46379*/"MATHEMATICAL ITALIC CAPITAL S"/* 1D446 */,/*46380*/"MATHEMATICAL ITALIC CAPITAL T"/* 1D447 */, /*46381*/"MATHEMATICAL ITALIC CAPITAL U"/* 1D448 */,/*46382*/"MATHEMATICAL ITALIC CAPITAL V"/* 1D449 */, /*46383*/"MATHEMATICAL ITALIC CAPITAL W"/* 1D44A */,/*46384*/"MATHEMATICAL ITALIC CAPITAL X"/* 1D44B */, /*46385*/"MATHEMATICAL ITALIC CAPITAL Y"/* 1D44C */,/*46386*/"MATHEMATICAL ITALIC CAPITAL Z"/* 1D44D */, /*46387*/"MATHEMATICAL ITALIC SMALL A"/* 1D44E */,/*46388*/"MATHEMATICAL ITALIC SMALL B"/* 1D44F */, /*46389*/"MATHEMATICAL ITALIC SMALL C"/* 1D450 */,/*46390*/"MATHEMATICAL ITALIC SMALL D"/* 1D451 */, /*46391*/"MATHEMATICAL ITALIC SMALL E"/* 1D452 */,/*46392*/"MATHEMATICAL ITALIC SMALL F"/* 1D453 */, /*46393*/"MATHEMATICAL ITALIC SMALL G"/* 1D454 */,NULL,/*46395*/"MATHEMATICAL ITALIC SMALL I"/* 1D456 */, /*46396*/"MATHEMATICAL ITALIC SMALL J"/* 1D457 */,/*46397*/"MATHEMATICAL ITALIC SMALL K"/* 1D458 */, /*46398*/"MATHEMATICAL ITALIC SMALL L"/* 1D459 */,/*46399*/"MATHEMATICAL ITALIC SMALL M"/* 1D45A */, /*46400*/"MATHEMATICAL ITALIC SMALL N"/* 1D45B */,/*46401*/"MATHEMATICAL ITALIC SMALL O"/* 1D45C */, /*46402*/"MATHEMATICAL ITALIC SMALL P"/* 1D45D */,/*46403*/"MATHEMATICAL ITALIC SMALL Q"/* 1D45E */, /*46404*/"MATHEMATICAL ITALIC SMALL R"/* 1D45F */,/*46405*/"MATHEMATICAL ITALIC SMALL S"/* 1D460 */, /*46406*/"MATHEMATICAL ITALIC SMALL T"/* 1D461 */,/*46407*/"MATHEMATICAL ITALIC SMALL U"/* 1D462 */, /*46408*/"MATHEMATICAL ITALIC SMALL V"/* 1D463 */,/*46409*/"MATHEMATICAL ITALIC SMALL W"/* 1D464 */, /*46410*/"MATHEMATICAL ITALIC SMALL X"/* 1D465 */,/*46411*/"MATHEMATICAL ITALIC SMALL Y"/* 1D466 */, /*46412*/"MATHEMATICAL ITALIC SMALL Z"/* 1D467 */,/*46413*/"MATHEMATICAL BOLD ITALIC CAPITAL A"/* 1D468 */, /*46414*/"MATHEMATICAL BOLD ITALIC CAPITAL B"/* 1D469 */,/*46415*/"MATHEMATICAL BOLD ITALIC CAPITAL C"/* 1D46A */, /*46416*/"MATHEMATICAL BOLD ITALIC CAPITAL D"/* 1D46B */,/*46417*/"MATHEMATICAL BOLD ITALIC CAPITAL E"/* 1D46C */, /*46418*/"MATHEMATICAL BOLD ITALIC CAPITAL F"/* 1D46D */,/*46419*/"MATHEMATICAL BOLD ITALIC CAPITAL G"/* 1D46E */, /*46420*/"MATHEMATICAL BOLD ITALIC CAPITAL H"/* 1D46F */,/*46421*/"MATHEMATICAL BOLD ITALIC CAPITAL I"/* 1D470 */, /*46422*/"MATHEMATICAL BOLD ITALIC CAPITAL J"/* 1D471 */,/*46423*/"MATHEMATICAL BOLD ITALIC CAPITAL K"/* 1D472 */, /*46424*/"MATHEMATICAL BOLD ITALIC CAPITAL L"/* 1D473 */,/*46425*/"MATHEMATICAL BOLD ITALIC CAPITAL M"/* 1D474 */, /*46426*/"MATHEMATICAL BOLD ITALIC CAPITAL N"/* 1D475 */,/*46427*/"MATHEMATICAL BOLD ITALIC CAPITAL O"/* 1D476 */, /*46428*/"MATHEMATICAL BOLD ITALIC CAPITAL P"/* 1D477 */,/*46429*/"MATHEMATICAL BOLD ITALIC CAPITAL Q"/* 1D478 */, /*46430*/"MATHEMATICAL BOLD ITALIC CAPITAL R"/* 1D479 */,/*46431*/"MATHEMATICAL BOLD ITALIC CAPITAL S"/* 1D47A */, /*46432*/"MATHEMATICAL BOLD ITALIC CAPITAL T"/* 1D47B */,/*46433*/"MATHEMATICAL BOLD ITALIC CAPITAL U"/* 1D47C */, /*46434*/"MATHEMATICAL BOLD ITALIC CAPITAL V"/* 1D47D */,/*46435*/"MATHEMATICAL BOLD ITALIC CAPITAL W"/* 1D47E */, /*46436*/"MATHEMATICAL BOLD ITALIC CAPITAL X"/* 1D47F */,/*46437*/"MATHEMATICAL BOLD ITALIC CAPITAL Y"/* 1D480 */, /*46438*/"MATHEMATICAL BOLD ITALIC CAPITAL Z"/* 1D481 */,/*46439*/"MATHEMATICAL BOLD ITALIC SMALL A"/* 1D482 */, /*46440*/"MATHEMATICAL BOLD ITALIC SMALL B"/* 1D483 */,/*46441*/"MATHEMATICAL BOLD ITALIC SMALL C"/* 1D484 */, /*46442*/"MATHEMATICAL BOLD ITALIC SMALL D"/* 1D485 */,/*46443*/"MATHEMATICAL BOLD ITALIC SMALL E"/* 1D486 */, /*46444*/"MATHEMATICAL BOLD ITALIC SMALL F"/* 1D487 */,/*46445*/"MATHEMATICAL BOLD ITALIC SMALL G"/* 1D488 */, /*46446*/"MATHEMATICAL BOLD ITALIC SMALL H"/* 1D489 */,/*46447*/"MATHEMATICAL BOLD ITALIC SMALL I"/* 1D48A */, /*46448*/"MATHEMATICAL BOLD ITALIC SMALL J"/* 1D48B */,/*46449*/"MATHEMATICAL BOLD ITALIC SMALL K"/* 1D48C */, /*46450*/"MATHEMATICAL BOLD ITALIC SMALL L"/* 1D48D */,/*46451*/"MATHEMATICAL BOLD ITALIC SMALL M"/* 1D48E */, /*46452*/"MATHEMATICAL BOLD ITALIC SMALL N"/* 1D48F */,/*46453*/"MATHEMATICAL BOLD ITALIC SMALL O"/* 1D490 */, /*46454*/"MATHEMATICAL BOLD ITALIC SMALL P"/* 1D491 */,/*46455*/"MATHEMATICAL BOLD ITALIC SMALL Q"/* 1D492 */, /*46456*/"MATHEMATICAL BOLD ITALIC SMALL R"/* 1D493 */,/*46457*/"MATHEMATICAL BOLD ITALIC SMALL S"/* 1D494 */, /*46458*/"MATHEMATICAL BOLD ITALIC SMALL T"/* 1D495 */,/*46459*/"MATHEMATICAL BOLD ITALIC SMALL U"/* 1D496 */, /*46460*/"MATHEMATICAL BOLD ITALIC SMALL V"/* 1D497 */,/*46461*/"MATHEMATICAL BOLD ITALIC SMALL W"/* 1D498 */, /*46462*/"MATHEMATICAL BOLD ITALIC SMALL X"/* 1D499 */,/*46463*/"MATHEMATICAL BOLD ITALIC SMALL Y"/* 1D49A */, /*46464*/"MATHEMATICAL BOLD ITALIC SMALL Z"/* 1D49B */,/*46465*/"MATHEMATICAL SCRIPT CAPITAL A"/* 1D49C */,NULL, /*46467*/"MATHEMATICAL SCRIPT CAPITAL C"/* 1D49E */,/*46468*/"MATHEMATICAL SCRIPT CAPITAL D"/* 1D49F */,NULL,NULL, /*46471*/"MATHEMATICAL SCRIPT CAPITAL G"/* 1D4A2 */,NULL,NULL,/*46474*/"MATHEMATICAL SCRIPT CAPITAL J"/* 1D4A5 */, /*46475*/"MATHEMATICAL SCRIPT CAPITAL K"/* 1D4A6 */,NULL,NULL,/*46478*/"MATHEMATICAL SCRIPT CAPITAL N"/* 1D4A9 */, /*46479*/"MATHEMATICAL SCRIPT CAPITAL O"/* 1D4AA */,/*46480*/"MATHEMATICAL SCRIPT CAPITAL P"/* 1D4AB */, /*46481*/"MATHEMATICAL SCRIPT CAPITAL Q"/* 1D4AC */,NULL,/*46483*/"MATHEMATICAL SCRIPT CAPITAL S"/* 1D4AE */, /*46484*/"MATHEMATICAL SCRIPT CAPITAL T"/* 1D4AF */,/*46485*/"MATHEMATICAL SCRIPT CAPITAL U"/* 1D4B0 */, /*46486*/"MATHEMATICAL SCRIPT CAPITAL V"/* 1D4B1 */,/*46487*/"MATHEMATICAL SCRIPT CAPITAL W"/* 1D4B2 */, /*46488*/"MATHEMATICAL SCRIPT CAPITAL X"/* 1D4B3 */,/*46489*/"MATHEMATICAL SCRIPT CAPITAL Y"/* 1D4B4 */, /*46490*/"MATHEMATICAL SCRIPT CAPITAL Z"/* 1D4B5 */,/*46491*/"MATHEMATICAL SCRIPT SMALL A"/* 1D4B6 */, /*46492*/"MATHEMATICAL SCRIPT SMALL B"/* 1D4B7 */,/*46493*/"MATHEMATICAL SCRIPT SMALL C"/* 1D4B8 */, /*46494*/"MATHEMATICAL SCRIPT SMALL D"/* 1D4B9 */,NULL,/*46496*/"MATHEMATICAL SCRIPT SMALL F"/* 1D4BB */,NULL, /*46498*/"MATHEMATICAL SCRIPT SMALL H"/* 1D4BD */,/*46499*/"MATHEMATICAL SCRIPT SMALL I"/* 1D4BE */, /*46500*/"MATHEMATICAL SCRIPT SMALL J"/* 1D4BF */,/*46501*/"MATHEMATICAL SCRIPT SMALL K"/* 1D4C0 */, /*46502*/"MATHEMATICAL SCRIPT SMALL L"/* 1D4C1 */,/*46503*/"MATHEMATICAL SCRIPT SMALL M"/* 1D4C2 */, /*46504*/"MATHEMATICAL SCRIPT SMALL N"/* 1D4C3 */,NULL,/*46506*/"MATHEMATICAL SCRIPT SMALL P"/* 1D4C5 */, /*46507*/"MATHEMATICAL SCRIPT SMALL Q"/* 1D4C6 */,/*46508*/"MATHEMATICAL SCRIPT SMALL R"/* 1D4C7 */, /*46509*/"MATHEMATICAL SCRIPT SMALL S"/* 1D4C8 */,/*46510*/"MATHEMATICAL SCRIPT SMALL T"/* 1D4C9 */, /*46511*/"MATHEMATICAL SCRIPT SMALL U"/* 1D4CA */,/*46512*/"MATHEMATICAL SCRIPT SMALL V"/* 1D4CB */, /*46513*/"MATHEMATICAL SCRIPT SMALL W"/* 1D4CC */,/*46514*/"MATHEMATICAL SCRIPT SMALL X"/* 1D4CD */, /*46515*/"MATHEMATICAL SCRIPT SMALL Y"/* 1D4CE */,/*46516*/"MATHEMATICAL SCRIPT SMALL Z"/* 1D4CF */, /*46517*/"MATHEMATICAL BOLD SCRIPT CAPITAL A"/* 1D4D0 */,/*46518*/"MATHEMATICAL BOLD SCRIPT CAPITAL B"/* 1D4D1 */, /*46519*/"MATHEMATICAL BOLD SCRIPT CAPITAL C"/* 1D4D2 */,/*46520*/"MATHEMATICAL BOLD SCRIPT CAPITAL D"/* 1D4D3 */, /*46521*/"MATHEMATICAL BOLD SCRIPT CAPITAL E"/* 1D4D4 */,/*46522*/"MATHEMATICAL BOLD SCRIPT CAPITAL F"/* 1D4D5 */, /*46523*/"MATHEMATICAL BOLD SCRIPT CAPITAL G"/* 1D4D6 */,/*46524*/"MATHEMATICAL BOLD SCRIPT CAPITAL H"/* 1D4D7 */, /*46525*/"MATHEMATICAL BOLD SCRIPT CAPITAL I"/* 1D4D8 */,/*46526*/"MATHEMATICAL BOLD SCRIPT CAPITAL J"/* 1D4D9 */, /*46527*/"MATHEMATICAL BOLD SCRIPT CAPITAL K"/* 1D4DA */,/*46528*/"MATHEMATICAL BOLD SCRIPT CAPITAL L"/* 1D4DB */, /*46529*/"MATHEMATICAL BOLD SCRIPT CAPITAL M"/* 1D4DC */,/*46530*/"MATHEMATICAL BOLD SCRIPT CAPITAL N"/* 1D4DD */, /*46531*/"MATHEMATICAL BOLD SCRIPT CAPITAL O"/* 1D4DE */,/*46532*/"MATHEMATICAL BOLD SCRIPT CAPITAL P"/* 1D4DF */, /*46533*/"MATHEMATICAL BOLD SCRIPT CAPITAL Q"/* 1D4E0 */,/*46534*/"MATHEMATICAL BOLD SCRIPT CAPITAL R"/* 1D4E1 */, /*46535*/"MATHEMATICAL BOLD SCRIPT CAPITAL S"/* 1D4E2 */,/*46536*/"MATHEMATICAL BOLD SCRIPT CAPITAL T"/* 1D4E3 */, /*46537*/"MATHEMATICAL BOLD SCRIPT CAPITAL U"/* 1D4E4 */,/*46538*/"MATHEMATICAL BOLD SCRIPT CAPITAL V"/* 1D4E5 */, /*46539*/"MATHEMATICAL BOLD SCRIPT CAPITAL W"/* 1D4E6 */,/*46540*/"MATHEMATICAL BOLD SCRIPT CAPITAL X"/* 1D4E7 */, /*46541*/"MATHEMATICAL BOLD SCRIPT CAPITAL Y"/* 1D4E8 */,/*46542*/"MATHEMATICAL BOLD SCRIPT CAPITAL Z"/* 1D4E9 */, /*46543*/"MATHEMATICAL BOLD SCRIPT SMALL A"/* 1D4EA */,/*46544*/"MATHEMATICAL BOLD SCRIPT SMALL B"/* 1D4EB */, /*46545*/"MATHEMATICAL BOLD SCRIPT SMALL C"/* 1D4EC */,/*46546*/"MATHEMATICAL BOLD SCRIPT SMALL D"/* 1D4ED */, /*46547*/"MATHEMATICAL BOLD SCRIPT SMALL E"/* 1D4EE */,/*46548*/"MATHEMATICAL BOLD SCRIPT SMALL F"/* 1D4EF */, /*46549*/"MATHEMATICAL BOLD SCRIPT SMALL G"/* 1D4F0 */,/*46550*/"MATHEMATICAL BOLD SCRIPT SMALL H"/* 1D4F1 */, /*46551*/"MATHEMATICAL BOLD SCRIPT SMALL I"/* 1D4F2 */,/*46552*/"MATHEMATICAL BOLD SCRIPT SMALL J"/* 1D4F3 */, /*46553*/"MATHEMATICAL BOLD SCRIPT SMALL K"/* 1D4F4 */,/*46554*/"MATHEMATICAL BOLD SCRIPT SMALL L"/* 1D4F5 */, /*46555*/"MATHEMATICAL BOLD SCRIPT SMALL M"/* 1D4F6 */,/*46556*/"MATHEMATICAL BOLD SCRIPT SMALL N"/* 1D4F7 */, /*46557*/"MATHEMATICAL BOLD SCRIPT SMALL O"/* 1D4F8 */,/*46558*/"MATHEMATICAL BOLD SCRIPT SMALL P"/* 1D4F9 */, /*46559*/"MATHEMATICAL BOLD SCRIPT SMALL Q"/* 1D4FA */,/*46560*/"MATHEMATICAL BOLD SCRIPT SMALL R"/* 1D4FB */, /*46561*/"MATHEMATICAL BOLD SCRIPT SMALL S"/* 1D4FC */,/*46562*/"MATHEMATICAL BOLD SCRIPT SMALL T"/* 1D4FD */, /*46563*/"MATHEMATICAL BOLD SCRIPT SMALL U"/* 1D4FE */,/*46564*/"MATHEMATICAL BOLD SCRIPT SMALL V"/* 1D4FF */, /*46565*/"MATHEMATICAL BOLD SCRIPT SMALL W"/* 1D500 */,/*46566*/"MATHEMATICAL BOLD SCRIPT SMALL X"/* 1D501 */, /*46567*/"MATHEMATICAL BOLD SCRIPT SMALL Y"/* 1D502 */,/*46568*/"MATHEMATICAL BOLD SCRIPT SMALL Z"/* 1D503 */, /*46569*/"MATHEMATICAL FRAKTUR CAPITAL A"/* 1D504 */,/*46570*/"MATHEMATICAL FRAKTUR CAPITAL B"/* 1D505 */,NULL, /*46572*/"MATHEMATICAL FRAKTUR CAPITAL D"/* 1D507 */,/*46573*/"MATHEMATICAL FRAKTUR CAPITAL E"/* 1D508 */, /*46574*/"MATHEMATICAL FRAKTUR CAPITAL F"/* 1D509 */,/*46575*/"MATHEMATICAL FRAKTUR CAPITAL G"/* 1D50A */,NULL,NULL, /*46578*/"MATHEMATICAL FRAKTUR CAPITAL J"/* 1D50D */,/*46579*/"MATHEMATICAL FRAKTUR CAPITAL K"/* 1D50E */, /*46580*/"MATHEMATICAL FRAKTUR CAPITAL L"/* 1D50F */,/*46581*/"MATHEMATICAL FRAKTUR CAPITAL M"/* 1D510 */, /*46582*/"MATHEMATICAL FRAKTUR CAPITAL N"/* 1D511 */,/*46583*/"MATHEMATICAL FRAKTUR CAPITAL O"/* 1D512 */, /*46584*/"MATHEMATICAL FRAKTUR CAPITAL P"/* 1D513 */,/*46585*/"MATHEMATICAL FRAKTUR CAPITAL Q"/* 1D514 */,NULL, /*46587*/"MATHEMATICAL FRAKTUR CAPITAL S"/* 1D516 */,/*46588*/"MATHEMATICAL FRAKTUR CAPITAL T"/* 1D517 */, /*46589*/"MATHEMATICAL FRAKTUR CAPITAL U"/* 1D518 */,/*46590*/"MATHEMATICAL FRAKTUR CAPITAL V"/* 1D519 */, /*46591*/"MATHEMATICAL FRAKTUR CAPITAL W"/* 1D51A */,/*46592*/"MATHEMATICAL FRAKTUR CAPITAL X"/* 1D51B */, /*46593*/"MATHEMATICAL FRAKTUR CAPITAL Y"/* 1D51C */,NULL,/*46595*/"MATHEMATICAL FRAKTUR SMALL A"/* 1D51E */, /*46596*/"MATHEMATICAL FRAKTUR SMALL B"/* 1D51F */,/*46597*/"MATHEMATICAL FRAKTUR SMALL C"/* 1D520 */, /*46598*/"MATHEMATICAL FRAKTUR SMALL D"/* 1D521 */,/*46599*/"MATHEMATICAL FRAKTUR SMALL E"/* 1D522 */, /*46600*/"MATHEMATICAL FRAKTUR SMALL F"/* 1D523 */,/*46601*/"MATHEMATICAL FRAKTUR SMALL G"/* 1D524 */, /*46602*/"MATHEMATICAL FRAKTUR SMALL H"/* 1D525 */,/*46603*/"MATHEMATICAL FRAKTUR SMALL I"/* 1D526 */, /*46604*/"MATHEMATICAL FRAKTUR SMALL J"/* 1D527 */,/*46605*/"MATHEMATICAL FRAKTUR SMALL K"/* 1D528 */, /*46606*/"MATHEMATICAL FRAKTUR SMALL L"/* 1D529 */,/*46607*/"MATHEMATICAL FRAKTUR SMALL M"/* 1D52A */, /*46608*/"MATHEMATICAL FRAKTUR SMALL N"/* 1D52B */,/*46609*/"MATHEMATICAL FRAKTUR SMALL O"/* 1D52C */, /*46610*/"MATHEMATICAL FRAKTUR SMALL P"/* 1D52D */,/*46611*/"MATHEMATICAL FRAKTUR SMALL Q"/* 1D52E */, /*46612*/"MATHEMATICAL FRAKTUR SMALL R"/* 1D52F */,/*46613*/"MATHEMATICAL FRAKTUR SMALL S"/* 1D530 */, /*46614*/"MATHEMATICAL FRAKTUR SMALL T"/* 1D531 */,/*46615*/"MATHEMATICAL FRAKTUR SMALL U"/* 1D532 */, /*46616*/"MATHEMATICAL FRAKTUR SMALL V"/* 1D533 */,/*46617*/"MATHEMATICAL FRAKTUR SMALL W"/* 1D534 */, /*46618*/"MATHEMATICAL FRAKTUR SMALL X"/* 1D535 */,/*46619*/"MATHEMATICAL FRAKTUR SMALL Y"/* 1D536 */, /*46620*/"MATHEMATICAL FRAKTUR SMALL Z"/* 1D537 */,/*46621*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL A"/* 1D538 */, /*46622*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL B"/* 1D539 */,NULL, /*46624*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL D"/* 1D53B */,/*46625*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL E"/* 1D53C */, /*46626*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL F"/* 1D53D */,/*46627*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL G"/* 1D53E */, NULL,/*46629*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL I"/* 1D540 */, /*46630*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL J"/* 1D541 */,/*46631*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL K"/* 1D542 */, /*46632*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL L"/* 1D543 */,/*46633*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL M"/* 1D544 */, NULL,/*46635*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL O"/* 1D546 */,NULL,NULL,NULL, /*46639*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL S"/* 1D54A */,/*46640*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL T"/* 1D54B */, /*46641*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL U"/* 1D54C */,/*46642*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL V"/* 1D54D */, /*46643*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL W"/* 1D54E */,/*46644*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL X"/* 1D54F */, /*46645*/"MATHEMATICAL DOUBLE-STRUCK CAPITAL Y"/* 1D550 */,NULL,/*46647*/"MATHEMATICAL DOUBLE-STRUCK SMALL A"/* 1D552 */, /*46648*/"MATHEMATICAL DOUBLE-STRUCK SMALL B"/* 1D553 */,/*46649*/"MATHEMATICAL DOUBLE-STRUCK SMALL C"/* 1D554 */, /*46650*/"MATHEMATICAL DOUBLE-STRUCK SMALL D"/* 1D555 */,/*46651*/"MATHEMATICAL DOUBLE-STRUCK SMALL E"/* 1D556 */, /*46652*/"MATHEMATICAL DOUBLE-STRUCK SMALL F"/* 1D557 */,/*46653*/"MATHEMATICAL DOUBLE-STRUCK SMALL G"/* 1D558 */, /*46654*/"MATHEMATICAL DOUBLE-STRUCK SMALL H"/* 1D559 */,/*46655*/"MATHEMATICAL DOUBLE-STRUCK SMALL I"/* 1D55A */, /*46656*/"MATHEMATICAL DOUBLE-STRUCK SMALL J"/* 1D55B */,/*46657*/"MATHEMATICAL DOUBLE-STRUCK SMALL K"/* 1D55C */, /*46658*/"MATHEMATICAL DOUBLE-STRUCK SMALL L"/* 1D55D */,/*46659*/"MATHEMATICAL DOUBLE-STRUCK SMALL M"/* 1D55E */, /*46660*/"MATHEMATICAL DOUBLE-STRUCK SMALL N"/* 1D55F */,/*46661*/"MATHEMATICAL DOUBLE-STRUCK SMALL O"/* 1D560 */, /*46662*/"MATHEMATICAL DOUBLE-STRUCK SMALL P"/* 1D561 */,/*46663*/"MATHEMATICAL DOUBLE-STRUCK SMALL Q"/* 1D562 */, /*46664*/"MATHEMATICAL DOUBLE-STRUCK SMALL R"/* 1D563 */,/*46665*/"MATHEMATICAL DOUBLE-STRUCK SMALL S"/* 1D564 */, /*46666*/"MATHEMATICAL DOUBLE-STRUCK SMALL T"/* 1D565 */,/*46667*/"MATHEMATICAL DOUBLE-STRUCK SMALL U"/* 1D566 */, /*46668*/"MATHEMATICAL DOUBLE-STRUCK SMALL V"/* 1D567 */,/*46669*/"MATHEMATICAL DOUBLE-STRUCK SMALL W"/* 1D568 */, /*46670*/"MATHEMATICAL DOUBLE-STRUCK SMALL X"/* 1D569 */,/*46671*/"MATHEMATICAL DOUBLE-STRUCK SMALL Y"/* 1D56A */, /*46672*/"MATHEMATICAL DOUBLE-STRUCK SMALL Z"/* 1D56B */,/*46673*/"MATHEMATICAL BOLD FRAKTUR CAPITAL A"/* 1D56C */, /*46674*/"MATHEMATICAL BOLD FRAKTUR CAPITAL B"/* 1D56D */,/*46675*/"MATHEMATICAL BOLD FRAKTUR CAPITAL C"/* 1D56E */, /*46676*/"MATHEMATICAL BOLD FRAKTUR CAPITAL D"/* 1D56F */,/*46677*/"MATHEMATICAL BOLD FRAKTUR CAPITAL E"/* 1D570 */, /*46678*/"MATHEMATICAL BOLD FRAKTUR CAPITAL F"/* 1D571 */,/*46679*/"MATHEMATICAL BOLD FRAKTUR CAPITAL G"/* 1D572 */, /*46680*/"MATHEMATICAL BOLD FRAKTUR CAPITAL H"/* 1D573 */,/*46681*/"MATHEMATICAL BOLD FRAKTUR CAPITAL I"/* 1D574 */, /*46682*/"MATHEMATICAL BOLD FRAKTUR CAPITAL J"/* 1D575 */,/*46683*/"MATHEMATICAL BOLD FRAKTUR CAPITAL K"/* 1D576 */, /*46684*/"MATHEMATICAL BOLD FRAKTUR CAPITAL L"/* 1D577 */,/*46685*/"MATHEMATICAL BOLD FRAKTUR CAPITAL M"/* 1D578 */, /*46686*/"MATHEMATICAL BOLD FRAKTUR CAPITAL N"/* 1D579 */,/*46687*/"MATHEMATICAL BOLD FRAKTUR CAPITAL O"/* 1D57A */, /*46688*/"MATHEMATICAL BOLD FRAKTUR CAPITAL P"/* 1D57B */,/*46689*/"MATHEMATICAL BOLD FRAKTUR CAPITAL Q"/* 1D57C */, /*46690*/"MATHEMATICAL BOLD FRAKTUR CAPITAL R"/* 1D57D */,/*46691*/"MATHEMATICAL BOLD FRAKTUR CAPITAL S"/* 1D57E */, /*46692*/"MATHEMATICAL BOLD FRAKTUR CAPITAL T"/* 1D57F */,/*46693*/"MATHEMATICAL BOLD FRAKTUR CAPITAL U"/* 1D580 */, /*46694*/"MATHEMATICAL BOLD FRAKTUR CAPITAL V"/* 1D581 */,/*46695*/"MATHEMATICAL BOLD FRAKTUR CAPITAL W"/* 1D582 */, /*46696*/"MATHEMATICAL BOLD FRAKTUR CAPITAL X"/* 1D583 */,/*46697*/"MATHEMATICAL BOLD FRAKTUR CAPITAL Y"/* 1D584 */, /*46698*/"MATHEMATICAL BOLD FRAKTUR CAPITAL Z"/* 1D585 */,/*46699*/"MATHEMATICAL BOLD FRAKTUR SMALL A"/* 1D586 */, /*46700*/"MATHEMATICAL BOLD FRAKTUR SMALL B"/* 1D587 */,/*46701*/"MATHEMATICAL BOLD FRAKTUR SMALL C"/* 1D588 */, /*46702*/"MATHEMATICAL BOLD FRAKTUR SMALL D"/* 1D589 */,/*46703*/"MATHEMATICAL BOLD FRAKTUR SMALL E"/* 1D58A */, /*46704*/"MATHEMATICAL BOLD FRAKTUR SMALL F"/* 1D58B */,/*46705*/"MATHEMATICAL BOLD FRAKTUR SMALL G"/* 1D58C */, /*46706*/"MATHEMATICAL BOLD FRAKTUR SMALL H"/* 1D58D */,/*46707*/"MATHEMATICAL BOLD FRAKTUR SMALL I"/* 1D58E */, /*46708*/"MATHEMATICAL BOLD FRAKTUR SMALL J"/* 1D58F */,/*46709*/"MATHEMATICAL BOLD FRAKTUR SMALL K"/* 1D590 */, /*46710*/"MATHEMATICAL BOLD FRAKTUR SMALL L"/* 1D591 */,/*46711*/"MATHEMATICAL BOLD FRAKTUR SMALL M"/* 1D592 */, /*46712*/"MATHEMATICAL BOLD FRAKTUR SMALL N"/* 1D593 */,/*46713*/"MATHEMATICAL BOLD FRAKTUR SMALL O"/* 1D594 */, /*46714*/"MATHEMATICAL BOLD FRAKTUR SMALL P"/* 1D595 */,/*46715*/"MATHEMATICAL BOLD FRAKTUR SMALL Q"/* 1D596 */, /*46716*/"MATHEMATICAL BOLD FRAKTUR SMALL R"/* 1D597 */,/*46717*/"MATHEMATICAL BOLD FRAKTUR SMALL S"/* 1D598 */, /*46718*/"MATHEMATICAL BOLD FRAKTUR SMALL T"/* 1D599 */,/*46719*/"MATHEMATICAL BOLD FRAKTUR SMALL U"/* 1D59A */, /*46720*/"MATHEMATICAL BOLD FRAKTUR SMALL V"/* 1D59B */,/*46721*/"MATHEMATICAL BOLD FRAKTUR SMALL W"/* 1D59C */, /*46722*/"MATHEMATICAL BOLD FRAKTUR SMALL X"/* 1D59D */,/*46723*/"MATHEMATICAL BOLD FRAKTUR SMALL Y"/* 1D59E */, /*46724*/"MATHEMATICAL BOLD FRAKTUR SMALL Z"/* 1D59F */,/*46725*/"MATHEMATICAL SANS-SERIF CAPITAL A"/* 1D5A0 */, /*46726*/"MATHEMATICAL SANS-SERIF CAPITAL B"/* 1D5A1 */,/*46727*/"MATHEMATICAL SANS-SERIF CAPITAL C"/* 1D5A2 */, /*46728*/"MATHEMATICAL SANS-SERIF CAPITAL D"/* 1D5A3 */,/*46729*/"MATHEMATICAL SANS-SERIF CAPITAL E"/* 1D5A4 */, /*46730*/"MATHEMATICAL SANS-SERIF CAPITAL F"/* 1D5A5 */,/*46731*/"MATHEMATICAL SANS-SERIF CAPITAL G"/* 1D5A6 */, /*46732*/"MATHEMATICAL SANS-SERIF CAPITAL H"/* 1D5A7 */,/*46733*/"MATHEMATICAL SANS-SERIF CAPITAL I"/* 1D5A8 */, /*46734*/"MATHEMATICAL SANS-SERIF CAPITAL J"/* 1D5A9 */,/*46735*/"MATHEMATICAL SANS-SERIF CAPITAL K"/* 1D5AA */, /*46736*/"MATHEMATICAL SANS-SERIF CAPITAL L"/* 1D5AB */,/*46737*/"MATHEMATICAL SANS-SERIF CAPITAL M"/* 1D5AC */, /*46738*/"MATHEMATICAL SANS-SERIF CAPITAL N"/* 1D5AD */,/*46739*/"MATHEMATICAL SANS-SERIF CAPITAL O"/* 1D5AE */, /*46740*/"MATHEMATICAL SANS-SERIF CAPITAL P"/* 1D5AF */,/*46741*/"MATHEMATICAL SANS-SERIF CAPITAL Q"/* 1D5B0 */, /*46742*/"MATHEMATICAL SANS-SERIF CAPITAL R"/* 1D5B1 */,/*46743*/"MATHEMATICAL SANS-SERIF CAPITAL S"/* 1D5B2 */, /*46744*/"MATHEMATICAL SANS-SERIF CAPITAL T"/* 1D5B3 */,/*46745*/"MATHEMATICAL SANS-SERIF CAPITAL U"/* 1D5B4 */, /*46746*/"MATHEMATICAL SANS-SERIF CAPITAL V"/* 1D5B5 */,/*46747*/"MATHEMATICAL SANS-SERIF CAPITAL W"/* 1D5B6 */, /*46748*/"MATHEMATICAL SANS-SERIF CAPITAL X"/* 1D5B7 */,/*46749*/"MATHEMATICAL SANS-SERIF CAPITAL Y"/* 1D5B8 */, /*46750*/"MATHEMATICAL SANS-SERIF CAPITAL Z"/* 1D5B9 */,/*46751*/"MATHEMATICAL SANS-SERIF SMALL A"/* 1D5BA */, /*46752*/"MATHEMATICAL SANS-SERIF SMALL B"/* 1D5BB */,/*46753*/"MATHEMATICAL SANS-SERIF SMALL C"/* 1D5BC */, /*46754*/"MATHEMATICAL SANS-SERIF SMALL D"/* 1D5BD */,/*46755*/"MATHEMATICAL SANS-SERIF SMALL E"/* 1D5BE */, /*46756*/"MATHEMATICAL SANS-SERIF SMALL F"/* 1D5BF */,/*46757*/"MATHEMATICAL SANS-SERIF SMALL G"/* 1D5C0 */, /*46758*/"MATHEMATICAL SANS-SERIF SMALL H"/* 1D5C1 */,/*46759*/"MATHEMATICAL SANS-SERIF SMALL I"/* 1D5C2 */, /*46760*/"MATHEMATICAL SANS-SERIF SMALL J"/* 1D5C3 */,/*46761*/"MATHEMATICAL SANS-SERIF SMALL K"/* 1D5C4 */, /*46762*/"MATHEMATICAL SANS-SERIF SMALL L"/* 1D5C5 */,/*46763*/"MATHEMATICAL SANS-SERIF SMALL M"/* 1D5C6 */, /*46764*/"MATHEMATICAL SANS-SERIF SMALL N"/* 1D5C7 */,/*46765*/"MATHEMATICAL SANS-SERIF SMALL O"/* 1D5C8 */, /*46766*/"MATHEMATICAL SANS-SERIF SMALL P"/* 1D5C9 */,/*46767*/"MATHEMATICAL SANS-SERIF SMALL Q"/* 1D5CA */, /*46768*/"MATHEMATICAL SANS-SERIF SMALL R"/* 1D5CB */,/*46769*/"MATHEMATICAL SANS-SERIF SMALL S"/* 1D5CC */, /*46770*/"MATHEMATICAL SANS-SERIF SMALL T"/* 1D5CD */,/*46771*/"MATHEMATICAL SANS-SERIF SMALL U"/* 1D5CE */, /*46772*/"MATHEMATICAL SANS-SERIF SMALL V"/* 1D5CF */,/*46773*/"MATHEMATICAL SANS-SERIF SMALL W"/* 1D5D0 */, /*46774*/"MATHEMATICAL SANS-SERIF SMALL X"/* 1D5D1 */,/*46775*/"MATHEMATICAL SANS-SERIF SMALL Y"/* 1D5D2 */, /*46776*/"MATHEMATICAL SANS-SERIF SMALL Z"/* 1D5D3 */,/*46777*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL A"/* 1D5D4 */, /*46778*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL B"/* 1D5D5 */, /*46779*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL C"/* 1D5D6 */, /*46780*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL D"/* 1D5D7 */, /*46781*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL E"/* 1D5D8 */, /*46782*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL F"/* 1D5D9 */, /*46783*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL G"/* 1D5DA */, /*46784*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL H"/* 1D5DB */, /*46785*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL I"/* 1D5DC */, /*46786*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL J"/* 1D5DD */, /*46787*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL K"/* 1D5DE */, /*46788*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL L"/* 1D5DF */, /*46789*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL M"/* 1D5E0 */, /*46790*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL N"/* 1D5E1 */, /*46791*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL O"/* 1D5E2 */, /*46792*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL P"/* 1D5E3 */, /*46793*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL Q"/* 1D5E4 */, /*46794*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL R"/* 1D5E5 */, /*46795*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL S"/* 1D5E6 */, /*46796*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL T"/* 1D5E7 */, /*46797*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL U"/* 1D5E8 */, /*46798*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL V"/* 1D5E9 */, /*46799*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL W"/* 1D5EA */, /*46800*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL X"/* 1D5EB */, /*46801*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL Y"/* 1D5EC */, /*46802*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL Z"/* 1D5ED */,/*46803*/"MATHEMATICAL SANS-SERIF BOLD SMALL A"/* 1D5EE */, /*46804*/"MATHEMATICAL SANS-SERIF BOLD SMALL B"/* 1D5EF */,/*46805*/"MATHEMATICAL SANS-SERIF BOLD SMALL C"/* 1D5F0 */, /*46806*/"MATHEMATICAL SANS-SERIF BOLD SMALL D"/* 1D5F1 */,/*46807*/"MATHEMATICAL SANS-SERIF BOLD SMALL E"/* 1D5F2 */, /*46808*/"MATHEMATICAL SANS-SERIF BOLD SMALL F"/* 1D5F3 */,/*46809*/"MATHEMATICAL SANS-SERIF BOLD SMALL G"/* 1D5F4 */, /*46810*/"MATHEMATICAL SANS-SERIF BOLD SMALL H"/* 1D5F5 */,/*46811*/"MATHEMATICAL SANS-SERIF BOLD SMALL I"/* 1D5F6 */, /*46812*/"MATHEMATICAL SANS-SERIF BOLD SMALL J"/* 1D5F7 */,/*46813*/"MATHEMATICAL SANS-SERIF BOLD SMALL K"/* 1D5F8 */, /*46814*/"MATHEMATICAL SANS-SERIF BOLD SMALL L"/* 1D5F9 */,/*46815*/"MATHEMATICAL SANS-SERIF BOLD SMALL M"/* 1D5FA */, /*46816*/"MATHEMATICAL SANS-SERIF BOLD SMALL N"/* 1D5FB */,/*46817*/"MATHEMATICAL SANS-SERIF BOLD SMALL O"/* 1D5FC */, /*46818*/"MATHEMATICAL SANS-SERIF BOLD SMALL P"/* 1D5FD */,/*46819*/"MATHEMATICAL SANS-SERIF BOLD SMALL Q"/* 1D5FE */, /*46820*/"MATHEMATICAL SANS-SERIF BOLD SMALL R"/* 1D5FF */,/*46821*/"MATHEMATICAL SANS-SERIF BOLD SMALL S"/* 1D600 */, /*46822*/"MATHEMATICAL SANS-SERIF BOLD SMALL T"/* 1D601 */,/*46823*/"MATHEMATICAL SANS-SERIF BOLD SMALL U"/* 1D602 */, /*46824*/"MATHEMATICAL SANS-SERIF BOLD SMALL V"/* 1D603 */,/*46825*/"MATHEMATICAL SANS-SERIF BOLD SMALL W"/* 1D604 */, /*46826*/"MATHEMATICAL SANS-SERIF BOLD SMALL X"/* 1D605 */,/*46827*/"MATHEMATICAL SANS-SERIF BOLD SMALL Y"/* 1D606 */, /*46828*/"MATHEMATICAL SANS-SERIF BOLD SMALL Z"/* 1D607 */, /*46829*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL A"/* 1D608 */, /*46830*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL B"/* 1D609 */, /*46831*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL C"/* 1D60A */, /*46832*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL D"/* 1D60B */, /*46833*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL E"/* 1D60C */, /*46834*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL F"/* 1D60D */, /*46835*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL G"/* 1D60E */, /*46836*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL H"/* 1D60F */, /*46837*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL I"/* 1D610 */, /*46838*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL J"/* 1D611 */, /*46839*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL K"/* 1D612 */, /*46840*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL L"/* 1D613 */, /*46841*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL M"/* 1D614 */, /*46842*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL N"/* 1D615 */, /*46843*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL O"/* 1D616 */, /*46844*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL P"/* 1D617 */, /*46845*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q"/* 1D618 */, /*46846*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL R"/* 1D619 */, /*46847*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL S"/* 1D61A */, /*46848*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL T"/* 1D61B */, /*46849*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL U"/* 1D61C */, /*46850*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL V"/* 1D61D */, /*46851*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL W"/* 1D61E */, /*46852*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL X"/* 1D61F */, /*46853*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y"/* 1D620 */, /*46854*/"MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z"/* 1D621 */, /*46855*/"MATHEMATICAL SANS-SERIF ITALIC SMALL A"/* 1D622 */, /*46856*/"MATHEMATICAL SANS-SERIF ITALIC SMALL B"/* 1D623 */, /*46857*/"MATHEMATICAL SANS-SERIF ITALIC SMALL C"/* 1D624 */, /*46858*/"MATHEMATICAL SANS-SERIF ITALIC SMALL D"/* 1D625 */, /*46859*/"MATHEMATICAL SANS-SERIF ITALIC SMALL E"/* 1D626 */, /*46860*/"MATHEMATICAL SANS-SERIF ITALIC SMALL F"/* 1D627 */, /*46861*/"MATHEMATICAL SANS-SERIF ITALIC SMALL G"/* 1D628 */, /*46862*/"MATHEMATICAL SANS-SERIF ITALIC SMALL H"/* 1D629 */, /*46863*/"MATHEMATICAL SANS-SERIF ITALIC SMALL I"/* 1D62A */, /*46864*/"MATHEMATICAL SANS-SERIF ITALIC SMALL J"/* 1D62B */, /*46865*/"MATHEMATICAL SANS-SERIF ITALIC SMALL K"/* 1D62C */, /*46866*/"MATHEMATICAL SANS-SERIF ITALIC SMALL L"/* 1D62D */, /*46867*/"MATHEMATICAL SANS-SERIF ITALIC SMALL M"/* 1D62E */, /*46868*/"MATHEMATICAL SANS-SERIF ITALIC SMALL N"/* 1D62F */, /*46869*/"MATHEMATICAL SANS-SERIF ITALIC SMALL O"/* 1D630 */, /*46870*/"MATHEMATICAL SANS-SERIF ITALIC SMALL P"/* 1D631 */, /*46871*/"MATHEMATICAL SANS-SERIF ITALIC SMALL Q"/* 1D632 */, /*46872*/"MATHEMATICAL SANS-SERIF ITALIC SMALL R"/* 1D633 */, /*46873*/"MATHEMATICAL SANS-SERIF ITALIC SMALL S"/* 1D634 */, /*46874*/"MATHEMATICAL SANS-SERIF ITALIC SMALL T"/* 1D635 */, /*46875*/"MATHEMATICAL SANS-SERIF ITALIC SMALL U"/* 1D636 */, /*46876*/"MATHEMATICAL SANS-SERIF ITALIC SMALL V"/* 1D637 */, /*46877*/"MATHEMATICAL SANS-SERIF ITALIC SMALL W"/* 1D638 */, /*46878*/"MATHEMATICAL SANS-SERIF ITALIC SMALL X"/* 1D639 */, /*46879*/"MATHEMATICAL SANS-SERIF ITALIC SMALL Y"/* 1D63A */, /*46880*/"MATHEMATICAL SANS-SERIF ITALIC SMALL Z"/* 1D63B */, /*46881*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A"/* 1D63C */, /*46882*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B"/* 1D63D */, /*46883*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C"/* 1D63E */, /*46884*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D"/* 1D63F */, /*46885*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E"/* 1D640 */, /*46886*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F"/* 1D641 */, /*46887*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G"/* 1D642 */, /*46888*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H"/* 1D643 */, /*46889*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I"/* 1D644 */, /*46890*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J"/* 1D645 */, /*46891*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K"/* 1D646 */, /*46892*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L"/* 1D647 */, /*46893*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M"/* 1D648 */, /*46894*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N"/* 1D649 */, /*46895*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O"/* 1D64A */, /*46896*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P"/* 1D64B */, /*46897*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q"/* 1D64C */, /*46898*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R"/* 1D64D */, /*46899*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S"/* 1D64E */, /*46900*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T"/* 1D64F */, /*46901*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U"/* 1D650 */, /*46902*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V"/* 1D651 */, /*46903*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W"/* 1D652 */, /*46904*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X"/* 1D653 */, /*46905*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y"/* 1D654 */, /*46906*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z"/* 1D655 */, /*46907*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A"/* 1D656 */, /*46908*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B"/* 1D657 */, /*46909*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C"/* 1D658 */, /*46910*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D"/* 1D659 */, /*46911*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E"/* 1D65A */, /*46912*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F"/* 1D65B */, /*46913*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G"/* 1D65C */, /*46914*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H"/* 1D65D */, /*46915*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I"/* 1D65E */, /*46916*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J"/* 1D65F */, /*46917*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K"/* 1D660 */, /*46918*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L"/* 1D661 */, /*46919*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M"/* 1D662 */, /*46920*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N"/* 1D663 */, /*46921*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O"/* 1D664 */, /*46922*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P"/* 1D665 */, /*46923*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q"/* 1D666 */, /*46924*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R"/* 1D667 */, /*46925*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S"/* 1D668 */, /*46926*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T"/* 1D669 */, /*46927*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U"/* 1D66A */, /*46928*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V"/* 1D66B */, /*46929*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W"/* 1D66C */, /*46930*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X"/* 1D66D */, /*46931*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y"/* 1D66E */, /*46932*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z"/* 1D66F */,/*46933*/"MATHEMATICAL MONOSPACE CAPITAL A"/* 1D670 */, /*46934*/"MATHEMATICAL MONOSPACE CAPITAL B"/* 1D671 */,/*46935*/"MATHEMATICAL MONOSPACE CAPITAL C"/* 1D672 */, /*46936*/"MATHEMATICAL MONOSPACE CAPITAL D"/* 1D673 */,/*46937*/"MATHEMATICAL MONOSPACE CAPITAL E"/* 1D674 */, /*46938*/"MATHEMATICAL MONOSPACE CAPITAL F"/* 1D675 */,/*46939*/"MATHEMATICAL MONOSPACE CAPITAL G"/* 1D676 */, /*46940*/"MATHEMATICAL MONOSPACE CAPITAL H"/* 1D677 */,/*46941*/"MATHEMATICAL MONOSPACE CAPITAL I"/* 1D678 */, /*46942*/"MATHEMATICAL MONOSPACE CAPITAL J"/* 1D679 */,/*46943*/"MATHEMATICAL MONOSPACE CAPITAL K"/* 1D67A */, /*46944*/"MATHEMATICAL MONOSPACE CAPITAL L"/* 1D67B */,/*46945*/"MATHEMATICAL MONOSPACE CAPITAL M"/* 1D67C */, /*46946*/"MATHEMATICAL MONOSPACE CAPITAL N"/* 1D67D */,/*46947*/"MATHEMATICAL MONOSPACE CAPITAL O"/* 1D67E */, /*46948*/"MATHEMATICAL MONOSPACE CAPITAL P"/* 1D67F */,/*46949*/"MATHEMATICAL MONOSPACE CAPITAL Q"/* 1D680 */, /*46950*/"MATHEMATICAL MONOSPACE CAPITAL R"/* 1D681 */,/*46951*/"MATHEMATICAL MONOSPACE CAPITAL S"/* 1D682 */, /*46952*/"MATHEMATICAL MONOSPACE CAPITAL T"/* 1D683 */,/*46953*/"MATHEMATICAL MONOSPACE CAPITAL U"/* 1D684 */, /*46954*/"MATHEMATICAL MONOSPACE CAPITAL V"/* 1D685 */,/*46955*/"MATHEMATICAL MONOSPACE CAPITAL W"/* 1D686 */, /*46956*/"MATHEMATICAL MONOSPACE CAPITAL X"/* 1D687 */,/*46957*/"MATHEMATICAL MONOSPACE CAPITAL Y"/* 1D688 */, /*46958*/"MATHEMATICAL MONOSPACE CAPITAL Z"/* 1D689 */,/*46959*/"MATHEMATICAL MONOSPACE SMALL A"/* 1D68A */, /*46960*/"MATHEMATICAL MONOSPACE SMALL B"/* 1D68B */,/*46961*/"MATHEMATICAL MONOSPACE SMALL C"/* 1D68C */, /*46962*/"MATHEMATICAL MONOSPACE SMALL D"/* 1D68D */,/*46963*/"MATHEMATICAL MONOSPACE SMALL E"/* 1D68E */, /*46964*/"MATHEMATICAL MONOSPACE SMALL F"/* 1D68F */,/*46965*/"MATHEMATICAL MONOSPACE SMALL G"/* 1D690 */, /*46966*/"MATHEMATICAL MONOSPACE SMALL H"/* 1D691 */,/*46967*/"MATHEMATICAL MONOSPACE SMALL I"/* 1D692 */, /*46968*/"MATHEMATICAL MONOSPACE SMALL J"/* 1D693 */,/*46969*/"MATHEMATICAL MONOSPACE SMALL K"/* 1D694 */, /*46970*/"MATHEMATICAL MONOSPACE SMALL L"/* 1D695 */,/*46971*/"MATHEMATICAL MONOSPACE SMALL M"/* 1D696 */, /*46972*/"MATHEMATICAL MONOSPACE SMALL N"/* 1D697 */,/*46973*/"MATHEMATICAL MONOSPACE SMALL O"/* 1D698 */, /*46974*/"MATHEMATICAL MONOSPACE SMALL P"/* 1D699 */,/*46975*/"MATHEMATICAL MONOSPACE SMALL Q"/* 1D69A */, /*46976*/"MATHEMATICAL MONOSPACE SMALL R"/* 1D69B */,/*46977*/"MATHEMATICAL MONOSPACE SMALL S"/* 1D69C */, /*46978*/"MATHEMATICAL MONOSPACE SMALL T"/* 1D69D */,/*46979*/"MATHEMATICAL MONOSPACE SMALL U"/* 1D69E */, /*46980*/"MATHEMATICAL MONOSPACE SMALL V"/* 1D69F */,/*46981*/"MATHEMATICAL MONOSPACE SMALL W"/* 1D6A0 */, /*46982*/"MATHEMATICAL MONOSPACE SMALL X"/* 1D6A1 */,/*46983*/"MATHEMATICAL MONOSPACE SMALL Y"/* 1D6A2 */, /*46984*/"MATHEMATICAL MONOSPACE SMALL Z"/* 1D6A3 */,/*46985*/"MATHEMATICAL ITALIC SMALL DOTLESS I"/* 1D6A4 */, /*46986*/"MATHEMATICAL ITALIC SMALL DOTLESS J"/* 1D6A5 */,NULL,NULL, /*46989*/"MATHEMATICAL BOLD CAPITAL ALPHA"/* 1D6A8 */,/*46990*/"MATHEMATICAL BOLD CAPITAL BETA"/* 1D6A9 */, /*46991*/"MATHEMATICAL BOLD CAPITAL GAMMA"/* 1D6AA */,/*46992*/"MATHEMATICAL BOLD CAPITAL DELTA"/* 1D6AB */, /*46993*/"MATHEMATICAL BOLD CAPITAL EPSILON"/* 1D6AC */,/*46994*/"MATHEMATICAL BOLD CAPITAL ZETA"/* 1D6AD */, /*46995*/"MATHEMATICAL BOLD CAPITAL ETA"/* 1D6AE */,/*46996*/"MATHEMATICAL BOLD CAPITAL THETA"/* 1D6AF */, /*46997*/"MATHEMATICAL BOLD CAPITAL IOTA"/* 1D6B0 */,/*46998*/"MATHEMATICAL BOLD CAPITAL KAPPA"/* 1D6B1 */, /*46999*/"MATHEMATICAL BOLD CAPITAL LAMDA"/* 1D6B2 */,/*47000*/"MATHEMATICAL BOLD CAPITAL MU"/* 1D6B3 */, /*47001*/"MATHEMATICAL BOLD CAPITAL NU"/* 1D6B4 */,/*47002*/"MATHEMATICAL BOLD CAPITAL XI"/* 1D6B5 */, /*47003*/"MATHEMATICAL BOLD CAPITAL OMICRON"/* 1D6B6 */,/*47004*/"MATHEMATICAL BOLD CAPITAL PI"/* 1D6B7 */, /*47005*/"MATHEMATICAL BOLD CAPITAL RHO"/* 1D6B8 */,/*47006*/"MATHEMATICAL BOLD CAPITAL THETA SYMBOL"/* 1D6B9 */, /*47007*/"MATHEMATICAL BOLD CAPITAL SIGMA"/* 1D6BA */,/*47008*/"MATHEMATICAL BOLD CAPITAL TAU"/* 1D6BB */, /*47009*/"MATHEMATICAL BOLD CAPITAL UPSILON"/* 1D6BC */,/*47010*/"MATHEMATICAL BOLD CAPITAL PHI"/* 1D6BD */, /*47011*/"MATHEMATICAL BOLD CAPITAL CHI"/* 1D6BE */,/*47012*/"MATHEMATICAL BOLD CAPITAL PSI"/* 1D6BF */, /*47013*/"MATHEMATICAL BOLD CAPITAL OMEGA"/* 1D6C0 */,/*47014*/"MATHEMATICAL BOLD NABLA"/* 1D6C1 */, /*47015*/"MATHEMATICAL BOLD SMALL ALPHA"/* 1D6C2 */,/*47016*/"MATHEMATICAL BOLD SMALL BETA"/* 1D6C3 */, /*47017*/"MATHEMATICAL BOLD SMALL GAMMA"/* 1D6C4 */,/*47018*/"MATHEMATICAL BOLD SMALL DELTA"/* 1D6C5 */, /*47019*/"MATHEMATICAL BOLD SMALL EPSILON"/* 1D6C6 */,/*47020*/"MATHEMATICAL BOLD SMALL ZETA"/* 1D6C7 */, /*47021*/"MATHEMATICAL BOLD SMALL ETA"/* 1D6C8 */,/*47022*/"MATHEMATICAL BOLD SMALL THETA"/* 1D6C9 */, /*47023*/"MATHEMATICAL BOLD SMALL IOTA"/* 1D6CA */,/*47024*/"MATHEMATICAL BOLD SMALL KAPPA"/* 1D6CB */, /*47025*/"MATHEMATICAL BOLD SMALL LAMDA"/* 1D6CC */,/*47026*/"MATHEMATICAL BOLD SMALL MU"/* 1D6CD */, /*47027*/"MATHEMATICAL BOLD SMALL NU"/* 1D6CE */,/*47028*/"MATHEMATICAL BOLD SMALL XI"/* 1D6CF */, /*47029*/"MATHEMATICAL BOLD SMALL OMICRON"/* 1D6D0 */,/*47030*/"MATHEMATICAL BOLD SMALL PI"/* 1D6D1 */, /*47031*/"MATHEMATICAL BOLD SMALL RHO"/* 1D6D2 */,/*47032*/"MATHEMATICAL BOLD SMALL FINAL SIGMA"/* 1D6D3 */, /*47033*/"MATHEMATICAL BOLD SMALL SIGMA"/* 1D6D4 */,/*47034*/"MATHEMATICAL BOLD SMALL TAU"/* 1D6D5 */, /*47035*/"MATHEMATICAL BOLD SMALL UPSILON"/* 1D6D6 */,/*47036*/"MATHEMATICAL BOLD SMALL PHI"/* 1D6D7 */, /*47037*/"MATHEMATICAL BOLD SMALL CHI"/* 1D6D8 */,/*47038*/"MATHEMATICAL BOLD SMALL PSI"/* 1D6D9 */, /*47039*/"MATHEMATICAL BOLD SMALL OMEGA"/* 1D6DA */,/*47040*/"MATHEMATICAL BOLD PARTIAL DIFFERENTIAL"/* 1D6DB */, /*47041*/"MATHEMATICAL BOLD EPSILON SYMBOL"/* 1D6DC */,/*47042*/"MATHEMATICAL BOLD THETA SYMBOL"/* 1D6DD */, /*47043*/"MATHEMATICAL BOLD KAPPA SYMBOL"/* 1D6DE */,/*47044*/"MATHEMATICAL BOLD PHI SYMBOL"/* 1D6DF */, /*47045*/"MATHEMATICAL BOLD RHO SYMBOL"/* 1D6E0 */,/*47046*/"MATHEMATICAL BOLD PI SYMBOL"/* 1D6E1 */, /*47047*/"MATHEMATICAL ITALIC CAPITAL ALPHA"/* 1D6E2 */,/*47048*/"MATHEMATICAL ITALIC CAPITAL BETA"/* 1D6E3 */, /*47049*/"MATHEMATICAL ITALIC CAPITAL GAMMA"/* 1D6E4 */,/*47050*/"MATHEMATICAL ITALIC CAPITAL DELTA"/* 1D6E5 */, /*47051*/"MATHEMATICAL ITALIC CAPITAL EPSILON"/* 1D6E6 */,/*47052*/"MATHEMATICAL ITALIC CAPITAL ZETA"/* 1D6E7 */, /*47053*/"MATHEMATICAL ITALIC CAPITAL ETA"/* 1D6E8 */,/*47054*/"MATHEMATICAL ITALIC CAPITAL THETA"/* 1D6E9 */, /*47055*/"MATHEMATICAL ITALIC CAPITAL IOTA"/* 1D6EA */,/*47056*/"MATHEMATICAL ITALIC CAPITAL KAPPA"/* 1D6EB */, /*47057*/"MATHEMATICAL ITALIC CAPITAL LAMDA"/* 1D6EC */,/*47058*/"MATHEMATICAL ITALIC CAPITAL MU"/* 1D6ED */, /*47059*/"MATHEMATICAL ITALIC CAPITAL NU"/* 1D6EE */,/*47060*/"MATHEMATICAL ITALIC CAPITAL XI"/* 1D6EF */, /*47061*/"MATHEMATICAL ITALIC CAPITAL OMICRON"/* 1D6F0 */,/*47062*/"MATHEMATICAL ITALIC CAPITAL PI"/* 1D6F1 */, /*47063*/"MATHEMATICAL ITALIC CAPITAL RHO"/* 1D6F2 */,/*47064*/"MATHEMATICAL ITALIC CAPITAL THETA SYMBOL"/* 1D6F3 */, /*47065*/"MATHEMATICAL ITALIC CAPITAL SIGMA"/* 1D6F4 */,/*47066*/"MATHEMATICAL ITALIC CAPITAL TAU"/* 1D6F5 */, /*47067*/"MATHEMATICAL ITALIC CAPITAL UPSILON"/* 1D6F6 */,/*47068*/"MATHEMATICAL ITALIC CAPITAL PHI"/* 1D6F7 */, /*47069*/"MATHEMATICAL ITALIC CAPITAL CHI"/* 1D6F8 */,/*47070*/"MATHEMATICAL ITALIC CAPITAL PSI"/* 1D6F9 */, /*47071*/"MATHEMATICAL ITALIC CAPITAL OMEGA"/* 1D6FA */,/*47072*/"MATHEMATICAL ITALIC NABLA"/* 1D6FB */, /*47073*/"MATHEMATICAL ITALIC SMALL ALPHA"/* 1D6FC */,/*47074*/"MATHEMATICAL ITALIC SMALL BETA"/* 1D6FD */, /*47075*/"MATHEMATICAL ITALIC SMALL GAMMA"/* 1D6FE */,/*47076*/"MATHEMATICAL ITALIC SMALL DELTA"/* 1D6FF */, /*47077*/"MATHEMATICAL ITALIC SMALL EPSILON"/* 1D700 */,/*47078*/"MATHEMATICAL ITALIC SMALL ZETA"/* 1D701 */, /*47079*/"MATHEMATICAL ITALIC SMALL ETA"/* 1D702 */,/*47080*/"MATHEMATICAL ITALIC SMALL THETA"/* 1D703 */, /*47081*/"MATHEMATICAL ITALIC SMALL IOTA"/* 1D704 */,/*47082*/"MATHEMATICAL ITALIC SMALL KAPPA"/* 1D705 */, /*47083*/"MATHEMATICAL ITALIC SMALL LAMDA"/* 1D706 */,/*47084*/"MATHEMATICAL ITALIC SMALL MU"/* 1D707 */, /*47085*/"MATHEMATICAL ITALIC SMALL NU"/* 1D708 */,/*47086*/"MATHEMATICAL ITALIC SMALL XI"/* 1D709 */, /*47087*/"MATHEMATICAL ITALIC SMALL OMICRON"/* 1D70A */,/*47088*/"MATHEMATICAL ITALIC SMALL PI"/* 1D70B */, /*47089*/"MATHEMATICAL ITALIC SMALL RHO"/* 1D70C */,/*47090*/"MATHEMATICAL ITALIC SMALL FINAL SIGMA"/* 1D70D */, /*47091*/"MATHEMATICAL ITALIC SMALL SIGMA"/* 1D70E */,/*47092*/"MATHEMATICAL ITALIC SMALL TAU"/* 1D70F */, /*47093*/"MATHEMATICAL ITALIC SMALL UPSILON"/* 1D710 */,/*47094*/"MATHEMATICAL ITALIC SMALL PHI"/* 1D711 */, /*47095*/"MATHEMATICAL ITALIC SMALL CHI"/* 1D712 */,/*47096*/"MATHEMATICAL ITALIC SMALL PSI"/* 1D713 */, /*47097*/"MATHEMATICAL ITALIC SMALL OMEGA"/* 1D714 */,/*47098*/"MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL"/* 1D715 */, /*47099*/"MATHEMATICAL ITALIC EPSILON SYMBOL"/* 1D716 */,/*47100*/"MATHEMATICAL ITALIC THETA SYMBOL"/* 1D717 */, /*47101*/"MATHEMATICAL ITALIC KAPPA SYMBOL"/* 1D718 */,/*47102*/"MATHEMATICAL ITALIC PHI SYMBOL"/* 1D719 */, /*47103*/"MATHEMATICAL ITALIC RHO SYMBOL"/* 1D71A */,/*47104*/"MATHEMATICAL ITALIC PI SYMBOL"/* 1D71B */, /*47105*/"MATHEMATICAL BOLD ITALIC CAPITAL ALPHA"/* 1D71C */,/*47106*/"MATHEMATICAL BOLD ITALIC CAPITAL BETA"/* 1D71D */, /*47107*/"MATHEMATICAL BOLD ITALIC CAPITAL GAMMA"/* 1D71E */, /*47108*/"MATHEMATICAL BOLD ITALIC CAPITAL DELTA"/* 1D71F */, /*47109*/"MATHEMATICAL BOLD ITALIC CAPITAL EPSILON"/* 1D720 */, /*47110*/"MATHEMATICAL BOLD ITALIC CAPITAL ZETA"/* 1D721 */,/*47111*/"MATHEMATICAL BOLD ITALIC CAPITAL ETA"/* 1D722 */, /*47112*/"MATHEMATICAL BOLD ITALIC CAPITAL THETA"/* 1D723 */,/*47113*/"MATHEMATICAL BOLD ITALIC CAPITAL IOTA"/* 1D724 */, /*47114*/"MATHEMATICAL BOLD ITALIC CAPITAL KAPPA"/* 1D725 */, /*47115*/"MATHEMATICAL BOLD ITALIC CAPITAL LAMDA"/* 1D726 */,/*47116*/"MATHEMATICAL BOLD ITALIC CAPITAL MU"/* 1D727 */, /*47117*/"MATHEMATICAL BOLD ITALIC CAPITAL NU"/* 1D728 */,/*47118*/"MATHEMATICAL BOLD ITALIC CAPITAL XI"/* 1D729 */, /*47119*/"MATHEMATICAL BOLD ITALIC CAPITAL OMICRON"/* 1D72A */,/*47120*/"MATHEMATICAL BOLD ITALIC CAPITAL PI"/* 1D72B */, /*47121*/"MATHEMATICAL BOLD ITALIC CAPITAL RHO"/* 1D72C */, /*47122*/"MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL"/* 1D72D */, /*47123*/"MATHEMATICAL BOLD ITALIC CAPITAL SIGMA"/* 1D72E */,/*47124*/"MATHEMATICAL BOLD ITALIC CAPITAL TAU"/* 1D72F */, /*47125*/"MATHEMATICAL BOLD ITALIC CAPITAL UPSILON"/* 1D730 */, /*47126*/"MATHEMATICAL BOLD ITALIC CAPITAL PHI"/* 1D731 */,/*47127*/"MATHEMATICAL BOLD ITALIC CAPITAL CHI"/* 1D732 */, /*47128*/"MATHEMATICAL BOLD ITALIC CAPITAL PSI"/* 1D733 */,/*47129*/"MATHEMATICAL BOLD ITALIC CAPITAL OMEGA"/* 1D734 */, /*47130*/"MATHEMATICAL BOLD ITALIC NABLA"/* 1D735 */,/*47131*/"MATHEMATICAL BOLD ITALIC SMALL ALPHA"/* 1D736 */, /*47132*/"MATHEMATICAL BOLD ITALIC SMALL BETA"/* 1D737 */,/*47133*/"MATHEMATICAL BOLD ITALIC SMALL GAMMA"/* 1D738 */, /*47134*/"MATHEMATICAL BOLD ITALIC SMALL DELTA"/* 1D739 */,/*47135*/"MATHEMATICAL BOLD ITALIC SMALL EPSILON"/* 1D73A */, /*47136*/"MATHEMATICAL BOLD ITALIC SMALL ZETA"/* 1D73B */,/*47137*/"MATHEMATICAL BOLD ITALIC SMALL ETA"/* 1D73C */, /*47138*/"MATHEMATICAL BOLD ITALIC SMALL THETA"/* 1D73D */,/*47139*/"MATHEMATICAL BOLD ITALIC SMALL IOTA"/* 1D73E */, /*47140*/"MATHEMATICAL BOLD ITALIC SMALL KAPPA"/* 1D73F */,/*47141*/"MATHEMATICAL BOLD ITALIC SMALL LAMDA"/* 1D740 */, /*47142*/"MATHEMATICAL BOLD ITALIC SMALL MU"/* 1D741 */,/*47143*/"MATHEMATICAL BOLD ITALIC SMALL NU"/* 1D742 */, /*47144*/"MATHEMATICAL BOLD ITALIC SMALL XI"/* 1D743 */,/*47145*/"MATHEMATICAL BOLD ITALIC SMALL OMICRON"/* 1D744 */, /*47146*/"MATHEMATICAL BOLD ITALIC SMALL PI"/* 1D745 */,/*47147*/"MATHEMATICAL BOLD ITALIC SMALL RHO"/* 1D746 */, /*47148*/"MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA"/* 1D747 */, /*47149*/"MATHEMATICAL BOLD ITALIC SMALL SIGMA"/* 1D748 */,/*47150*/"MATHEMATICAL BOLD ITALIC SMALL TAU"/* 1D749 */, /*47151*/"MATHEMATICAL BOLD ITALIC SMALL UPSILON"/* 1D74A */,/*47152*/"MATHEMATICAL BOLD ITALIC SMALL PHI"/* 1D74B */, /*47153*/"MATHEMATICAL BOLD ITALIC SMALL CHI"/* 1D74C */,/*47154*/"MATHEMATICAL BOLD ITALIC SMALL PSI"/* 1D74D */, /*47155*/"MATHEMATICAL BOLD ITALIC SMALL OMEGA"/* 1D74E */, /*47156*/"MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL"/* 1D74F */, /*47157*/"MATHEMATICAL BOLD ITALIC EPSILON SYMBOL"/* 1D750 */, /*47158*/"MATHEMATICAL BOLD ITALIC THETA SYMBOL"/* 1D751 */,/*47159*/"MATHEMATICAL BOLD ITALIC KAPPA SYMBOL"/* 1D752 */, /*47160*/"MATHEMATICAL BOLD ITALIC PHI SYMBOL"/* 1D753 */,/*47161*/"MATHEMATICAL BOLD ITALIC RHO SYMBOL"/* 1D754 */, /*47162*/"MATHEMATICAL BOLD ITALIC PI SYMBOL"/* 1D755 */, /*47163*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA"/* 1D756 */, /*47164*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA"/* 1D757 */, /*47165*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA"/* 1D758 */, /*47166*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA"/* 1D759 */, /*47167*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON"/* 1D75A */, /*47168*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA"/* 1D75B */, /*47169*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA"/* 1D75C */, /*47170*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA"/* 1D75D */, /*47171*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA"/* 1D75E */, /*47172*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA"/* 1D75F */, /*47173*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA"/* 1D760 */, /*47174*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL MU"/* 1D761 */, /*47175*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL NU"/* 1D762 */, /*47176*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL XI"/* 1D763 */, /*47177*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON"/* 1D764 */, /*47178*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL PI"/* 1D765 */, /*47179*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO"/* 1D766 */, /*47180*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL"/* 1D767 */, /*47181*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA"/* 1D768 */, /*47182*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU"/* 1D769 */, /*47183*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON"/* 1D76A */, /*47184*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI"/* 1D76B */, /*47185*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI"/* 1D76C */, /*47186*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI"/* 1D76D */, /*47187*/"MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA"/* 1D76E */, /*47188*/"MATHEMATICAL SANS-SERIF BOLD NABLA"/* 1D76F */,/*47189*/"MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA"/* 1D770 */, /*47190*/"MATHEMATICAL SANS-SERIF BOLD SMALL BETA"/* 1D771 */, /*47191*/"MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA"/* 1D772 */, /*47192*/"MATHEMATICAL SANS-SERIF BOLD SMALL DELTA"/* 1D773 */, /*47193*/"MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON"/* 1D774 */, /*47194*/"MATHEMATICAL SANS-SERIF BOLD SMALL ZETA"/* 1D775 */, /*47195*/"MATHEMATICAL SANS-SERIF BOLD SMALL ETA"/* 1D776 */, /*47196*/"MATHEMATICAL SANS-SERIF BOLD SMALL THETA"/* 1D777 */, /*47197*/"MATHEMATICAL SANS-SERIF BOLD SMALL IOTA"/* 1D778 */, /*47198*/"MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA"/* 1D779 */, /*47199*/"MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA"/* 1D77A */, /*47200*/"MATHEMATICAL SANS-SERIF BOLD SMALL MU"/* 1D77B */,/*47201*/"MATHEMATICAL SANS-SERIF BOLD SMALL NU"/* 1D77C */, /*47202*/"MATHEMATICAL SANS-SERIF BOLD SMALL XI"/* 1D77D */, /*47203*/"MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON"/* 1D77E */, /*47204*/"MATHEMATICAL SANS-SERIF BOLD SMALL PI"/* 1D77F */,/*47205*/"MATHEMATICAL SANS-SERIF BOLD SMALL RHO"/* 1D780 */, /*47206*/"MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA"/* 1D781 */, /*47207*/"MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA"/* 1D782 */, /*47208*/"MATHEMATICAL SANS-SERIF BOLD SMALL TAU"/* 1D783 */, /*47209*/"MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON"/* 1D784 */, /*47210*/"MATHEMATICAL SANS-SERIF BOLD SMALL PHI"/* 1D785 */, /*47211*/"MATHEMATICAL SANS-SERIF BOLD SMALL CHI"/* 1D786 */, /*47212*/"MATHEMATICAL SANS-SERIF BOLD SMALL PSI"/* 1D787 */, /*47213*/"MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA"/* 1D788 */, /*47214*/"MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL"/* 1D789 */, /*47215*/"MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL"/* 1D78A */, /*47216*/"MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL"/* 1D78B */, /*47217*/"MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL"/* 1D78C */, /*47218*/"MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL"/* 1D78D */, /*47219*/"MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL"/* 1D78E */, /*47220*/"MATHEMATICAL SANS-SERIF BOLD PI SYMBOL"/* 1D78F */, /*47221*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA"/* 1D790 */, /*47222*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA"/* 1D791 */, /*47223*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA"/* 1D792 */, /*47224*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA"/* 1D793 */, /*47225*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON"/* 1D794 */, /*47226*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA"/* 1D795 */, /*47227*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA"/* 1D796 */, /*47228*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA"/* 1D797 */, /*47229*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA"/* 1D798 */, /*47230*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA"/* 1D799 */, /*47231*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA"/* 1D79A */, /*47232*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU"/* 1D79B */, /*47233*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU"/* 1D79C */, /*47234*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI"/* 1D79D */, /*47235*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON"/* 1D79E */, /*47236*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI"/* 1D79F */, /*47237*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO"/* 1D7A0 */, /*47238*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL"/* 1D7A1 */, /*47239*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA"/* 1D7A2 */, /*47240*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU"/* 1D7A3 */, /*47241*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON"/* 1D7A4 */, /*47242*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI"/* 1D7A5 */, /*47243*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI"/* 1D7A6 */, /*47244*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI"/* 1D7A7 */, /*47245*/"MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA"/* 1D7A8 */, /*47246*/"MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA"/* 1D7A9 */, /*47247*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA"/* 1D7AA */, /*47248*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA"/* 1D7AB */, /*47249*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA"/* 1D7AC */, /*47250*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA"/* 1D7AD */, /*47251*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON"/* 1D7AE */, /*47252*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA"/* 1D7AF */, /*47253*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA"/* 1D7B0 */, /*47254*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA"/* 1D7B1 */, /*47255*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA"/* 1D7B2 */, /*47256*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA"/* 1D7B3 */, /*47257*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA"/* 1D7B4 */, /*47258*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU"/* 1D7B5 */, /*47259*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU"/* 1D7B6 */, /*47260*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI"/* 1D7B7 */, /*47261*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON"/* 1D7B8 */, /*47262*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI"/* 1D7B9 */, /*47263*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO"/* 1D7BA */, /*47264*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA"/* 1D7BB */, /*47265*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA"/* 1D7BC */, /*47266*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU"/* 1D7BD */, /*47267*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON"/* 1D7BE */, /*47268*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI"/* 1D7BF */, /*47269*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI"/* 1D7C0 */, /*47270*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI"/* 1D7C1 */, /*47271*/"MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA"/* 1D7C2 */, /*47272*/"MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL"/* 1D7C3 */, /*47273*/"MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL"/* 1D7C4 */, /*47274*/"MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL"/* 1D7C5 */, /*47275*/"MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL"/* 1D7C6 */, /*47276*/"MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL"/* 1D7C7 */, /*47277*/"MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL"/* 1D7C8 */, /*47278*/"MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL"/* 1D7C9 */, /*47279*/"MATHEMATICAL BOLD CAPITAL DIGAMMA"/* 1D7CA */,/*47280*/"MATHEMATICAL BOLD SMALL DIGAMMA"/* 1D7CB */,NULL,NULL, /*47283*/"MATHEMATICAL BOLD DIGIT ZERO"/* 1D7CE */,/*47284*/"MATHEMATICAL BOLD DIGIT ONE"/* 1D7CF */, /*47285*/"MATHEMATICAL BOLD DIGIT TWO"/* 1D7D0 */,/*47286*/"MATHEMATICAL BOLD DIGIT THREE"/* 1D7D1 */, /*47287*/"MATHEMATICAL BOLD DIGIT FOUR"/* 1D7D2 */,/*47288*/"MATHEMATICAL BOLD DIGIT FIVE"/* 1D7D3 */, /*47289*/"MATHEMATICAL BOLD DIGIT SIX"/* 1D7D4 */,/*47290*/"MATHEMATICAL BOLD DIGIT SEVEN"/* 1D7D5 */, /*47291*/"MATHEMATICAL BOLD DIGIT EIGHT"/* 1D7D6 */,/*47292*/"MATHEMATICAL BOLD DIGIT NINE"/* 1D7D7 */, /*47293*/"MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO"/* 1D7D8 */,/*47294*/"MATHEMATICAL DOUBLE-STRUCK DIGIT ONE"/* 1D7D9 */, /*47295*/"MATHEMATICAL DOUBLE-STRUCK DIGIT TWO"/* 1D7DA */,/*47296*/"MATHEMATICAL DOUBLE-STRUCK DIGIT THREE"/* 1D7DB */, /*47297*/"MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR"/* 1D7DC */,/*47298*/"MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE"/* 1D7DD */, /*47299*/"MATHEMATICAL DOUBLE-STRUCK DIGIT SIX"/* 1D7DE */,/*47300*/"MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN"/* 1D7DF */, /*47301*/"MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT"/* 1D7E0 */,/*47302*/"MATHEMATICAL DOUBLE-STRUCK DIGIT NINE"/* 1D7E1 */, /*47303*/"MATHEMATICAL SANS-SERIF DIGIT ZERO"/* 1D7E2 */,/*47304*/"MATHEMATICAL SANS-SERIF DIGIT ONE"/* 1D7E3 */, /*47305*/"MATHEMATICAL SANS-SERIF DIGIT TWO"/* 1D7E4 */,/*47306*/"MATHEMATICAL SANS-SERIF DIGIT THREE"/* 1D7E5 */, /*47307*/"MATHEMATICAL SANS-SERIF DIGIT FOUR"/* 1D7E6 */,/*47308*/"MATHEMATICAL SANS-SERIF DIGIT FIVE"/* 1D7E7 */, /*47309*/"MATHEMATICAL SANS-SERIF DIGIT SIX"/* 1D7E8 */,/*47310*/"MATHEMATICAL SANS-SERIF DIGIT SEVEN"/* 1D7E9 */, /*47311*/"MATHEMATICAL SANS-SERIF DIGIT EIGHT"/* 1D7EA */,/*47312*/"MATHEMATICAL SANS-SERIF DIGIT NINE"/* 1D7EB */, /*47313*/"MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO"/* 1D7EC */, /*47314*/"MATHEMATICAL SANS-SERIF BOLD DIGIT ONE"/* 1D7ED */, /*47315*/"MATHEMATICAL SANS-SERIF BOLD DIGIT TWO"/* 1D7EE */, /*47316*/"MATHEMATICAL SANS-SERIF BOLD DIGIT THREE"/* 1D7EF */, /*47317*/"MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR"/* 1D7F0 */, /*47318*/"MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE"/* 1D7F1 */, /*47319*/"MATHEMATICAL SANS-SERIF BOLD DIGIT SIX"/* 1D7F2 */, /*47320*/"MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN"/* 1D7F3 */, /*47321*/"MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT"/* 1D7F4 */, /*47322*/"MATHEMATICAL SANS-SERIF BOLD DIGIT NINE"/* 1D7F5 */,/*47323*/"MATHEMATICAL MONOSPACE DIGIT ZERO"/* 1D7F6 */, /*47324*/"MATHEMATICAL MONOSPACE DIGIT ONE"/* 1D7F7 */,/*47325*/"MATHEMATICAL MONOSPACE DIGIT TWO"/* 1D7F8 */, /*47326*/"MATHEMATICAL MONOSPACE DIGIT THREE"/* 1D7F9 */,/*47327*/"MATHEMATICAL MONOSPACE DIGIT FOUR"/* 1D7FA */, /*47328*/"MATHEMATICAL MONOSPACE DIGIT FIVE"/* 1D7FB */,/*47329*/"MATHEMATICAL MONOSPACE DIGIT SIX"/* 1D7FC */, /*47330*/"MATHEMATICAL MONOSPACE DIGIT SEVEN"/* 1D7FD */,/*47331*/"MATHEMATICAL MONOSPACE DIGIT EIGHT"/* 1D7FE */, /*47332*/"MATHEMATICAL MONOSPACE DIGIT NINE"/* 1D7FF */,/*47333*/"SIGNWRITING HAND-FIST INDEX"/* 1D800 */, /*47334*/"SIGNWRITING HAND-CIRCLE INDEX"/* 1D801 */,/*47335*/"SIGNWRITING HAND-CUP INDEX"/* 1D802 */, /*47336*/"SIGNWRITING HAND-OVAL INDEX"/* 1D803 */,/*47337*/"SIGNWRITING HAND-HINGE INDEX"/* 1D804 */, /*47338*/"SIGNWRITING HAND-ANGLE INDEX"/* 1D805 */,/*47339*/"SIGNWRITING HAND-FIST INDEX BENT"/* 1D806 */, /*47340*/"SIGNWRITING HAND-CIRCLE INDEX BENT"/* 1D807 */, /*47341*/"SIGNWRITING HAND-FIST THUMB UNDER INDEX BENT"/* 1D808 */, /*47342*/"SIGNWRITING HAND-FIST INDEX RAISED KNUCKLE"/* 1D809 */, /*47343*/"SIGNWRITING HAND-FIST INDEX CUPPED"/* 1D80A */,/*47344*/"SIGNWRITING HAND-FIST INDEX HINGED"/* 1D80B */, /*47345*/"SIGNWRITING HAND-FIST INDEX HINGED LOW"/* 1D80C */,/*47346*/"SIGNWRITING HAND-CIRCLE INDEX HINGE"/* 1D80D */, /*47347*/"SIGNWRITING HAND-FIST INDEX MIDDLE"/* 1D80E */,/*47348*/"SIGNWRITING HAND-CIRCLE INDEX MIDDLE"/* 1D80F */, /*47349*/"SIGNWRITING HAND-FIST INDEX MIDDLE BENT"/* 1D810 */, /*47350*/"SIGNWRITING HAND-FIST INDEX MIDDLE RAISED KNUCKLES"/* 1D811 */, /*47351*/"SIGNWRITING HAND-FIST INDEX MIDDLE HINGED"/* 1D812 */, /*47352*/"SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED"/* 1D813 */, /*47353*/"SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP"/* 1D814 */, /*47354*/"SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED"/* 1D815 */, /*47355*/"SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED INDEX BENT"/* 1D816 */, /*47356*/"SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED MIDDLE BENT"/* 1D817 */, /*47357*/"SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED"/* 1D818 */, /*47358*/"SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED"/* 1D819 */, /*47359*/"SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED"/* 1D81A */, /*47360*/"SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSSED"/* 1D81B */, /*47361*/"SIGNWRITING HAND-FIST MIDDLE BENT OVER INDEX"/* 1D81C */, /*47362*/"SIGNWRITING HAND-FIST INDEX BENT OVER MIDDLE"/* 1D81D */, /*47363*/"SIGNWRITING HAND-FIST INDEX MIDDLE THUMB"/* 1D81E */, /*47364*/"SIGNWRITING HAND-CIRCLE INDEX MIDDLE THUMB"/* 1D81F */, /*47365*/"SIGNWRITING HAND-FIST INDEX MIDDLE STRAIGHT THUMB BENT"/* 1D820 */, /*47366*/"SIGNWRITING HAND-FIST INDEX MIDDLE BENT THUMB STRAIGHT"/* 1D821 */, /*47367*/"SIGNWRITING HAND-FIST INDEX MIDDLE THUMB BENT"/* 1D822 */, /*47368*/"SIGNWRITING HAND-FIST INDEX MIDDLE HINGED SPREAD THUMB SIDE"/* 1D823 */, /*47369*/"SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB SIDE"/* 1D824 */, /*47370*/"SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB CONJOINED"/* 1D825 */, /*47371*/"SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP THUMB SIDE"/* 1D826 */, /*47372*/"SIGNWRITING HAND-FIST INDEX MIDDLE UP SPREAD THUMB FORWARD"/* 1D827 */, /*47373*/"SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CUPPED"/* 1D828 */, /*47374*/"SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CIRCLED"/* 1D829 */, /*47375*/"SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HOOKED"/* 1D82A */, /*47376*/"SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HINGED"/* 1D82B */, /*47377*/"SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE STRAIGHT"/* 1D82C */, /*47378*/"SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE"/* 1D82D */, /*47379*/"SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE CONJOINED"/* 1D82E */, /*47380*/"SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE BENT"/* 1D82F */, /*47381*/"SIGNWRITING HAND-FIST MIDDLE THUMB HOOKED INDEX UP"/* 1D830 */, /*47382*/"SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE UP"/* 1D831 */, /*47383*/"SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED THUMB SIDE"/* 1D832 */, /*47384*/"SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED THUMB SIDE"/* 1D833 */, /*47385*/"SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB FORWARD"/* 1D834 */, /*47386*/"SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED THUMB FORWARD"/* 1D835 */, /*47387*/"SIGNWRITING HAND-FIST MIDDLE THUMB CUPPED INDEX UP"/* 1D836 */, /*47388*/"SIGNWRITING HAND-FIST INDEX THUMB CUPPED MIDDLE UP"/* 1D837 */, /*47389*/"SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX UP"/* 1D838 */, /*47390*/"SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX HINGED"/* 1D839 */, /*47391*/"SIGNWRITING HAND-FIST INDEX THUMB ANGLED OUT MIDDLE UP"/* 1D83A */, /*47392*/"SIGNWRITING HAND-FIST INDEX THUMB ANGLED IN MIDDLE UP"/* 1D83B */, /*47393*/"SIGNWRITING HAND-FIST INDEX THUMB CIRCLED MIDDLE UP"/* 1D83C */, /*47394*/"SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CONJOINED HINGED"/* 1D83D */, /*47395*/"SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED OUT"/* 1D83E */, /*47396*/"SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED"/* 1D83F */, /*47397*/"SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX UP"/* 1D840 */, /*47398*/"SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX CROSSED"/* 1D841 */, /*47399*/"SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED INDEX UP"/* 1D842 */, /*47400*/"SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE HINGED"/* 1D843 */, /*47401*/"SIGNWRITING HAND-FLAT FOUR FINGERS"/* 1D844 */,/*47402*/"SIGNWRITING HAND-FLAT FOUR FINGERS BENT"/* 1D845 */, /*47403*/"SIGNWRITING HAND-FLAT FOUR FINGERS HINGED"/* 1D846 */, /*47404*/"SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED"/* 1D847 */, /*47405*/"SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED SPLIT"/* 1D848 */, /*47406*/"SIGNWRITING HAND-CLAW FOUR FINGERS CONJOINED"/* 1D849 */, /*47407*/"SIGNWRITING HAND-FIST FOUR FINGERS CONJOINED BENT"/* 1D84A */, /*47408*/"SIGNWRITING HAND-HINGE FOUR FINGERS CONJOINED"/* 1D84B */, /*47409*/"SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD"/* 1D84C */, /*47410*/"SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD"/* 1D84D */, /*47411*/"SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD FOUR BENT"/* 1D84E */, /*47412*/"SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD FOUR BENT"/* 1D84F */, /*47413*/"SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD BENT"/* 1D850 */, /*47414*/"SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD BENT"/* 1D851 */, /*47415*/"SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD THUMB FORWARD"/* 1D852 */, /*47416*/"SIGNWRITING HAND-CUP FIVE FINGERS SPREAD"/* 1D853 */, /*47417*/"SIGNWRITING HAND-CUP FIVE FINGERS SPREAD OPEN"/* 1D854 */, /*47418*/"SIGNWRITING HAND-HINGE FIVE FINGERS SPREAD OPEN"/* 1D855 */, /*47419*/"SIGNWRITING HAND-OVAL FIVE FINGERS SPREAD"/* 1D856 */, /*47420*/"SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED"/* 1D857 */, /*47421*/"SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED THUMB SIDE"/* 1D858 */, /*47422*/"SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED NO THUMB"/* 1D859 */, /*47423*/"SIGNWRITING HAND-FLAT"/* 1D85A */,/*47424*/"SIGNWRITING HAND-FLAT BETWEEN PALM FACINGS"/* 1D85B */, /*47425*/"SIGNWRITING HAND-FLAT HEEL"/* 1D85C */,/*47426*/"SIGNWRITING HAND-FLAT THUMB SIDE"/* 1D85D */, /*47427*/"SIGNWRITING HAND-FLAT HEEL THUMB SIDE"/* 1D85E */,/*47428*/"SIGNWRITING HAND-FLAT THUMB BENT"/* 1D85F */, /*47429*/"SIGNWRITING HAND-FLAT THUMB FORWARD"/* 1D860 */, /*47430*/"SIGNWRITING HAND-FLAT SPLIT INDEX THUMB SIDE"/* 1D861 */, /*47431*/"SIGNWRITING HAND-FLAT SPLIT CENTRE"/* 1D862 */, /*47432*/"SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE"/* 1D863 */, /*47433*/"SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE BENT"/* 1D864 */, /*47434*/"SIGNWRITING HAND-FLAT SPLIT LITTLE"/* 1D865 */,/*47435*/"SIGNWRITING HAND-CLAW"/* 1D866 */, /*47436*/"SIGNWRITING HAND-CLAW THUMB SIDE"/* 1D867 */,/*47437*/"SIGNWRITING HAND-CLAW NO THUMB"/* 1D868 */, /*47438*/"SIGNWRITING HAND-CLAW THUMB FORWARD"/* 1D869 */,/*47439*/"SIGNWRITING HAND-HOOK CURLICUE"/* 1D86A */, /*47440*/"SIGNWRITING HAND-HOOK"/* 1D86B */,/*47441*/"SIGNWRITING HAND-CUP OPEN"/* 1D86C */, /*47442*/"SIGNWRITING HAND-CUP"/* 1D86D */,/*47443*/"SIGNWRITING HAND-CUP OPEN THUMB SIDE"/* 1D86E */, /*47444*/"SIGNWRITING HAND-CUP THUMB SIDE"/* 1D86F */,/*47445*/"SIGNWRITING HAND-CUP OPEN NO THUMB"/* 1D870 */, /*47446*/"SIGNWRITING HAND-CUP NO THUMB"/* 1D871 */,/*47447*/"SIGNWRITING HAND-CUP OPEN THUMB FORWARD"/* 1D872 */, /*47448*/"SIGNWRITING HAND-CUP THUMB FORWARD"/* 1D873 */,/*47449*/"SIGNWRITING HAND-CURLICUE OPEN"/* 1D874 */, /*47450*/"SIGNWRITING HAND-CURLICUE"/* 1D875 */,/*47451*/"SIGNWRITING HAND-CIRCLE"/* 1D876 */, /*47452*/"SIGNWRITING HAND-OVAL"/* 1D877 */,/*47453*/"SIGNWRITING HAND-OVAL THUMB SIDE"/* 1D878 */, /*47454*/"SIGNWRITING HAND-OVAL NO THUMB"/* 1D879 */,/*47455*/"SIGNWRITING HAND-OVAL THUMB FORWARD"/* 1D87A */, /*47456*/"SIGNWRITING HAND-HINGE OPEN"/* 1D87B */,/*47457*/"SIGNWRITING HAND-HINGE OPEN THUMB FORWARD"/* 1D87C */, /*47458*/"SIGNWRITING HAND-HINGE"/* 1D87D */,/*47459*/"SIGNWRITING HAND-HINGE SMALL"/* 1D87E */, /*47460*/"SIGNWRITING HAND-HINGE OPEN THUMB SIDE"/* 1D87F */,/*47461*/"SIGNWRITING HAND-HINGE THUMB SIDE"/* 1D880 */, /*47462*/"SIGNWRITING HAND-HINGE OPEN NO THUMB"/* 1D881 */,/*47463*/"SIGNWRITING HAND-HINGE NO THUMB"/* 1D882 */, /*47464*/"SIGNWRITING HAND-HINGE THUMB SIDE TOUCHING INDEX"/* 1D883 */, /*47465*/"SIGNWRITING HAND-HINGE THUMB BETWEEN MIDDLE RING"/* 1D884 */,/*47466*/"SIGNWRITING HAND-ANGLE"/* 1D885 */, /*47467*/"SIGNWRITING HAND-FIST INDEX MIDDLE RING"/* 1D886 */, /*47468*/"SIGNWRITING HAND-CIRCLE INDEX MIDDLE RING"/* 1D887 */, /*47469*/"SIGNWRITING HAND-HINGE INDEX MIDDLE RING"/* 1D888 */, /*47470*/"SIGNWRITING HAND-ANGLE INDEX MIDDLE RING"/* 1D889 */,/*47471*/"SIGNWRITING HAND-HINGE LITTLE"/* 1D88A */, /*47472*/"SIGNWRITING HAND-FIST INDEX MIDDLE RING BENT"/* 1D88B */, /*47473*/"SIGNWRITING HAND-FIST INDEX MIDDLE RING CONJOINED"/* 1D88C */, /*47474*/"SIGNWRITING HAND-HINGE INDEX MIDDLE RING CONJOINED"/* 1D88D */, /*47475*/"SIGNWRITING HAND-FIST LITTLE DOWN"/* 1D88E */, /*47476*/"SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE STRAIGHT"/* 1D88F */, /*47477*/"SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE CURVED"/* 1D890 */, /*47478*/"SIGNWRITING HAND-FIST LITTLE DOWN OTHERS CIRCLED"/* 1D891 */, /*47479*/"SIGNWRITING HAND-FIST LITTLE UP"/* 1D892 */,/*47480*/"SIGNWRITING HAND-FIST THUMB UNDER LITTLE UP"/* 1D893 */, /*47481*/"SIGNWRITING HAND-CIRCLE LITTLE UP"/* 1D894 */,/*47482*/"SIGNWRITING HAND-OVAL LITTLE UP"/* 1D895 */, /*47483*/"SIGNWRITING HAND-ANGLE LITTLE UP"/* 1D896 */,/*47484*/"SIGNWRITING HAND-FIST LITTLE RAISED KNUCKLE"/* 1D897 */, /*47485*/"SIGNWRITING HAND-FIST LITTLE BENT"/* 1D898 */,/*47486*/"SIGNWRITING HAND-FIST LITTLE TOUCHES THUMB"/* 1D899 */, /*47487*/"SIGNWRITING HAND-FIST LITTLE THUMB"/* 1D89A */,/*47488*/"SIGNWRITING HAND-HINGE LITTLE THUMB"/* 1D89B */, /*47489*/"SIGNWRITING HAND-FIST LITTLE INDEX THUMB"/* 1D89C */, /*47490*/"SIGNWRITING HAND-HINGE LITTLE INDEX THUMB"/* 1D89D */, /*47491*/"SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB OUT"/* 1D89E */, /*47492*/"SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB"/* 1D89F */, /*47493*/"SIGNWRITING HAND-FIST LITTLE INDEX"/* 1D8A0 */,/*47494*/"SIGNWRITING HAND-CIRCLE LITTLE INDEX"/* 1D8A1 */, /*47495*/"SIGNWRITING HAND-HINGE LITTLE INDEX"/* 1D8A2 */,/*47496*/"SIGNWRITING HAND-ANGLE LITTLE INDEX"/* 1D8A3 */, /*47497*/"SIGNWRITING HAND-FIST INDEX MIDDLE LITTLE"/* 1D8A4 */, /*47498*/"SIGNWRITING HAND-CIRCLE INDEX MIDDLE LITTLE"/* 1D8A5 */, /*47499*/"SIGNWRITING HAND-HINGE INDEX MIDDLE LITTLE"/* 1D8A6 */,/*47500*/"SIGNWRITING HAND-HINGE RING"/* 1D8A7 */, /*47501*/"SIGNWRITING HAND-ANGLE INDEX MIDDLE LITTLE"/* 1D8A8 */, /*47502*/"SIGNWRITING HAND-FIST INDEX MIDDLE CROSS LITTLE"/* 1D8A9 */, /*47503*/"SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSS LITTLE"/* 1D8AA */, /*47504*/"SIGNWRITING HAND-FIST RING DOWN"/* 1D8AB */, /*47505*/"SIGNWRITING HAND-HINGE RING DOWN INDEX THUMB HOOK MIDDLE"/* 1D8AC */, /*47506*/"SIGNWRITING HAND-ANGLE RING DOWN MIDDLE THUMB INDEX CROSS"/* 1D8AD */, /*47507*/"SIGNWRITING HAND-FIST RING UP"/* 1D8AE */,/*47508*/"SIGNWRITING HAND-FIST RING RAISED KNUCKLE"/* 1D8AF */, /*47509*/"SIGNWRITING HAND-FIST RING LITTLE"/* 1D8B0 */,/*47510*/"SIGNWRITING HAND-CIRCLE RING LITTLE"/* 1D8B1 */, /*47511*/"SIGNWRITING HAND-OVAL RING LITTLE"/* 1D8B2 */,/*47512*/"SIGNWRITING HAND-ANGLE RING LITTLE"/* 1D8B3 */, /*47513*/"SIGNWRITING HAND-FIST RING MIDDLE"/* 1D8B4 */, /*47514*/"SIGNWRITING HAND-FIST RING MIDDLE CONJOINED"/* 1D8B5 */, /*47515*/"SIGNWRITING HAND-FIST RING MIDDLE RAISED KNUCKLES"/* 1D8B6 */, /*47516*/"SIGNWRITING HAND-FIST RING INDEX"/* 1D8B7 */,/*47517*/"SIGNWRITING HAND-FIST RING THUMB"/* 1D8B8 */, /*47518*/"SIGNWRITING HAND-HOOK RING THUMB"/* 1D8B9 */,/*47519*/"SIGNWRITING HAND-FIST INDEX RING LITTLE"/* 1D8BA */, /*47520*/"SIGNWRITING HAND-CIRCLE INDEX RING LITTLE"/* 1D8BB */, /*47521*/"SIGNWRITING HAND-CURLICUE INDEX RING LITTLE ON"/* 1D8BC */, /*47522*/"SIGNWRITING HAND-HOOK INDEX RING LITTLE OUT"/* 1D8BD */, /*47523*/"SIGNWRITING HAND-HOOK INDEX RING LITTLE IN"/* 1D8BE */, /*47524*/"SIGNWRITING HAND-HOOK INDEX RING LITTLE UNDER"/* 1D8BF */, /*47525*/"SIGNWRITING HAND-CUP INDEX RING LITTLE"/* 1D8C0 */, /*47526*/"SIGNWRITING HAND-HINGE INDEX RING LITTLE"/* 1D8C1 */, /*47527*/"SIGNWRITING HAND-ANGLE INDEX RING LITTLE OUT"/* 1D8C2 */, /*47528*/"SIGNWRITING HAND-ANGLE INDEX RING LITTLE"/* 1D8C3 */,/*47529*/"SIGNWRITING HAND-FIST MIDDLE DOWN"/* 1D8C4 */, /*47530*/"SIGNWRITING HAND-HINGE MIDDLE"/* 1D8C5 */,/*47531*/"SIGNWRITING HAND-FIST MIDDLE UP"/* 1D8C6 */, /*47532*/"SIGNWRITING HAND-CIRCLE MIDDLE UP"/* 1D8C7 */, /*47533*/"SIGNWRITING HAND-FIST MIDDLE RAISED KNUCKLE"/* 1D8C8 */, /*47534*/"SIGNWRITING HAND-FIST MIDDLE UP THUMB SIDE"/* 1D8C9 */, /*47535*/"SIGNWRITING HAND-HOOK MIDDLE THUMB"/* 1D8CA */,/*47536*/"SIGNWRITING HAND-FIST MIDDLE THUMB LITTLE"/* 1D8CB */, /*47537*/"SIGNWRITING HAND-FIST MIDDLE LITTLE"/* 1D8CC */,/*47538*/"SIGNWRITING HAND-FIST MIDDLE RING LITTLE"/* 1D8CD */, /*47539*/"SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE"/* 1D8CE */, /*47540*/"SIGNWRITING HAND-CURLICUE MIDDLE RING LITTLE ON"/* 1D8CF */, /*47541*/"SIGNWRITING HAND-CUP MIDDLE RING LITTLE"/* 1D8D0 */, /*47542*/"SIGNWRITING HAND-HINGE MIDDLE RING LITTLE"/* 1D8D1 */, /*47543*/"SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE OUT"/* 1D8D2 */, /*47544*/"SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE IN"/* 1D8D3 */, /*47545*/"SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE"/* 1D8D4 */, /*47546*/"SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE BENT"/* 1D8D5 */, /*47547*/"SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED"/* 1D8D6 */, /*47548*/"SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED SIDE"/* 1D8D7 */, /*47549*/"SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED OUT"/* 1D8D8 */, /*47550*/"SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED IN"/* 1D8D9 */, /*47551*/"SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED"/* 1D8DA */, /*47552*/"SIGNWRITING HAND-HINGE INDEX HINGED"/* 1D8DB */,/*47553*/"SIGNWRITING HAND-FIST INDEX THUMB SIDE"/* 1D8DC */, /*47554*/"SIGNWRITING HAND-HINGE INDEX THUMB SIDE"/* 1D8DD */, /*47555*/"SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB DIAGONAL"/* 1D8DE */, /*47556*/"SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB CONJOINED"/* 1D8DF */, /*47557*/"SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB BENT"/* 1D8E0 */, /*47558*/"SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX BENT"/* 1D8E1 */, /*47559*/"SIGNWRITING HAND-FIST INDEX THUMB SIDE BOTH BENT"/* 1D8E2 */, /*47560*/"SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX HINGE"/* 1D8E3 */, /*47561*/"SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX STRAIGHT"/* 1D8E4 */, /*47562*/"SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX BENT"/* 1D8E5 */, /*47563*/"SIGNWRITING HAND-FIST INDEX THUMB HOOK"/* 1D8E6 */, /*47564*/"SIGNWRITING HAND-FIST INDEX THUMB CURLICUE"/* 1D8E7 */, /*47565*/"SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB INSIDE"/* 1D8E8 */, /*47566*/"SIGNWRITING HAND-CLAW INDEX THUMB CURVE THUMB INSIDE"/* 1D8E9 */, /*47567*/"SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB UNDER"/* 1D8EA */, /*47568*/"SIGNWRITING HAND-FIST INDEX THUMB CIRCLE"/* 1D8EB */,/*47569*/"SIGNWRITING HAND-CUP INDEX THUMB"/* 1D8EC */, /*47570*/"SIGNWRITING HAND-CUP INDEX THUMB OPEN"/* 1D8ED */, /*47571*/"SIGNWRITING HAND-HINGE INDEX THUMB OPEN"/* 1D8EE */, /*47572*/"SIGNWRITING HAND-HINGE INDEX THUMB LARGE"/* 1D8EF */,/*47573*/"SIGNWRITING HAND-HINGE INDEX THUMB"/* 1D8F0 */, /*47574*/"SIGNWRITING HAND-HINGE INDEX THUMB SMALL"/* 1D8F1 */, /*47575*/"SIGNWRITING HAND-ANGLE INDEX THUMB OUT"/* 1D8F2 */,/*47576*/"SIGNWRITING HAND-ANGLE INDEX THUMB IN"/* 1D8F3 */, /*47577*/"SIGNWRITING HAND-ANGLE INDEX THUMB"/* 1D8F4 */,/*47578*/"SIGNWRITING HAND-FIST THUMB"/* 1D8F5 */, /*47579*/"SIGNWRITING HAND-FIST THUMB HEEL"/* 1D8F6 */,/*47580*/"SIGNWRITING HAND-FIST THUMB SIDE DIAGONAL"/* 1D8F7 */, /*47581*/"SIGNWRITING HAND-FIST THUMB SIDE CONJOINED"/* 1D8F8 */, /*47582*/"SIGNWRITING HAND-FIST THUMB SIDE BENT"/* 1D8F9 */,/*47583*/"SIGNWRITING HAND-FIST THUMB FORWARD"/* 1D8FA */, /*47584*/"SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE"/* 1D8FB */, /*47585*/"SIGNWRITING HAND-FIST THUMB BETWEEN MIDDLE RING"/* 1D8FC */, /*47586*/"SIGNWRITING HAND-FIST THUMB BETWEEN RING LITTLE"/* 1D8FD */, /*47587*/"SIGNWRITING HAND-FIST THUMB UNDER TWO FINGERS"/* 1D8FE */, /*47588*/"SIGNWRITING HAND-FIST THUMB OVER TWO FINGERS"/* 1D8FF */, /*47589*/"SIGNWRITING HAND-FIST THUMB UNDER THREE FINGERS"/* 1D900 */, /*47590*/"SIGNWRITING HAND-FIST THUMB UNDER FOUR FINGERS"/* 1D901 */, /*47591*/"SIGNWRITING HAND-FIST THUMB OVER FOUR RAISED KNUCKLES"/* 1D902 */,/*47592*/"SIGNWRITING HAND-FIST"/* 1D903 */, /*47593*/"SIGNWRITING HAND-FIST HEEL"/* 1D904 */,/*47594*/"SIGNWRITING TOUCH SINGLE"/* 1D905 */, /*47595*/"SIGNWRITING TOUCH MULTIPLE"/* 1D906 */,/*47596*/"SIGNWRITING TOUCH BETWEEN"/* 1D907 */, /*47597*/"SIGNWRITING GRASP SINGLE"/* 1D908 */,/*47598*/"SIGNWRITING GRASP MULTIPLE"/* 1D909 */, /*47599*/"SIGNWRITING GRASP BETWEEN"/* 1D90A */,/*47600*/"SIGNWRITING STRIKE SINGLE"/* 1D90B */, /*47601*/"SIGNWRITING STRIKE MULTIPLE"/* 1D90C */,/*47602*/"SIGNWRITING STRIKE BETWEEN"/* 1D90D */, /*47603*/"SIGNWRITING BRUSH SINGLE"/* 1D90E */,/*47604*/"SIGNWRITING BRUSH MULTIPLE"/* 1D90F */, /*47605*/"SIGNWRITING BRUSH BETWEEN"/* 1D910 */,/*47606*/"SIGNWRITING RUB SINGLE"/* 1D911 */, /*47607*/"SIGNWRITING RUB MULTIPLE"/* 1D912 */,/*47608*/"SIGNWRITING RUB BETWEEN"/* 1D913 */, /*47609*/"SIGNWRITING SURFACE SYMBOLS"/* 1D914 */,/*47610*/"SIGNWRITING SURFACE BETWEEN"/* 1D915 */, /*47611*/"SIGNWRITING SQUEEZE LARGE SINGLE"/* 1D916 */,/*47612*/"SIGNWRITING SQUEEZE SMALL SINGLE"/* 1D917 */, /*47613*/"SIGNWRITING SQUEEZE LARGE MULTIPLE"/* 1D918 */,/*47614*/"SIGNWRITING SQUEEZE SMALL MULTIPLE"/* 1D919 */, /*47615*/"SIGNWRITING SQUEEZE SEQUENTIAL"/* 1D91A */,/*47616*/"SIGNWRITING FLICK LARGE SINGLE"/* 1D91B */, /*47617*/"SIGNWRITING FLICK SMALL SINGLE"/* 1D91C */,/*47618*/"SIGNWRITING FLICK LARGE MULTIPLE"/* 1D91D */, /*47619*/"SIGNWRITING FLICK SMALL MULTIPLE"/* 1D91E */,/*47620*/"SIGNWRITING FLICK SEQUENTIAL"/* 1D91F */, /*47621*/"SIGNWRITING SQUEEZE FLICK ALTERNATING"/* 1D920 */, /*47622*/"SIGNWRITING MOVEMENT-HINGE UP DOWN LARGE"/* 1D921 */, /*47623*/"SIGNWRITING MOVEMENT-HINGE UP DOWN SMALL"/* 1D922 */, /*47624*/"SIGNWRITING MOVEMENT-HINGE UP SEQUENTIAL"/* 1D923 */, /*47625*/"SIGNWRITING MOVEMENT-HINGE DOWN SEQUENTIAL"/* 1D924 */, /*47626*/"SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING LARGE"/* 1D925 */, /*47627*/"SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING SMALL"/* 1D926 */, /*47628*/"SIGNWRITING MOVEMENT-HINGE SIDE TO SIDE SCISSORS"/* 1D927 */, /*47629*/"SIGNWRITING MOVEMENT-WALLPLANE FINGER CONTACT"/* 1D928 */, /*47630*/"SIGNWRITING MOVEMENT-FLOORPLANE FINGER CONTACT"/* 1D929 */, /*47631*/"SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT SMALL"/* 1D92A */, /*47632*/"SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT MEDIUM"/* 1D92B */, /*47633*/"SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGE"/* 1D92C */, /*47634*/"SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGEST"/* 1D92D */, /*47635*/"SIGNWRITING MOVEMENT-WALLPLANE SINGLE WRIST FLEX"/* 1D92E */, /*47636*/"SIGNWRITING MOVEMENT-WALLPLANE DOUBLE STRAIGHT"/* 1D92F */, /*47637*/"SIGNWRITING MOVEMENT-WALLPLANE DOUBLE WRIST FLEX"/* 1D930 */, /*47638*/"SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING"/* 1D931 */, /*47639*/"SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING WRIST FLEX"/* 1D932 */, /*47640*/"SIGNWRITING MOVEMENT-WALLPLANE CROSS"/* 1D933 */, /*47641*/"SIGNWRITING MOVEMENT-WALLPLANE TRIPLE STRAIGHT MOVEMENT"/* 1D934 */, /*47642*/"SIGNWRITING MOVEMENT-WALLPLANE TRIPLE WRIST FLEX"/* 1D935 */, /*47643*/"SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING"/* 1D936 */, /*47644*/"SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING WRIST FLEX"/* 1D937 */, /*47645*/"SIGNWRITING MOVEMENT-WALLPLANE BEND SMALL"/* 1D938 */, /*47646*/"SIGNWRITING MOVEMENT-WALLPLANE BEND MEDIUM"/* 1D939 */, /*47647*/"SIGNWRITING MOVEMENT-WALLPLANE BEND LARGE"/* 1D93A */, /*47648*/"SIGNWRITING MOVEMENT-WALLPLANE CORNER SMALL"/* 1D93B */, /*47649*/"SIGNWRITING MOVEMENT-WALLPLANE CORNER MEDIUM"/* 1D93C */, /*47650*/"SIGNWRITING MOVEMENT-WALLPLANE CORNER LARGE"/* 1D93D */, /*47651*/"SIGNWRITING MOVEMENT-WALLPLANE CORNER ROTATION"/* 1D93E */, /*47652*/"SIGNWRITING MOVEMENT-WALLPLANE CHECK SMALL"/* 1D93F */, /*47653*/"SIGNWRITING MOVEMENT-WALLPLANE CHECK MEDIUM"/* 1D940 */, /*47654*/"SIGNWRITING MOVEMENT-WALLPLANE CHECK LARGE"/* 1D941 */, /*47655*/"SIGNWRITING MOVEMENT-WALLPLANE BOX SMALL"/* 1D942 */, /*47656*/"SIGNWRITING MOVEMENT-WALLPLANE BOX MEDIUM"/* 1D943 */, /*47657*/"SIGNWRITING MOVEMENT-WALLPLANE BOX LARGE"/* 1D944 */, /*47658*/"SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG SMALL"/* 1D945 */, /*47659*/"SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG MEDIUM"/* 1D946 */, /*47660*/"SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG LARGE"/* 1D947 */, /*47661*/"SIGNWRITING MOVEMENT-WALLPLANE PEAKS SMALL"/* 1D948 */, /*47662*/"SIGNWRITING MOVEMENT-WALLPLANE PEAKS MEDIUM"/* 1D949 */, /*47663*/"SIGNWRITING MOVEMENT-WALLPLANE PEAKS LARGE"/* 1D94A */, /*47664*/"SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE SINGLE"/* 1D94B */, /*47665*/"SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE DOUBLE"/* 1D94C */, /*47666*/"SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE ALTERNATING"/* 1D94D */, /*47667*/"SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE SINGLE"/* 1D94E */, /*47668*/"SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE DOUBLE"/* 1D94F */, /*47669*/"SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE ALTERNATING"/* 1D950 */, /*47670*/"SIGNWRITING TRAVEL-WALLPLANE SHAKING"/* 1D951 */, /*47671*/"SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL SINGLE"/* 1D952 */, /*47672*/"SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL DOUBLE"/* 1D953 */, /*47673*/"SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL TRIPLE"/* 1D954 */, /*47674*/"SIGNWRITING MOVEMENT-DIAGONAL AWAY SMALL"/* 1D955 */, /*47675*/"SIGNWRITING MOVEMENT-DIAGONAL AWAY MEDIUM"/* 1D956 */, /*47676*/"SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGE"/* 1D957 */, /*47677*/"SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGEST"/* 1D958 */, /*47678*/"SIGNWRITING MOVEMENT-DIAGONAL TOWARDS SMALL"/* 1D959 */, /*47679*/"SIGNWRITING MOVEMENT-DIAGONAL TOWARDS MEDIUM"/* 1D95A */, /*47680*/"SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGE"/* 1D95B */, /*47681*/"SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGEST"/* 1D95C */, /*47682*/"SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY SMALL"/* 1D95D */, /*47683*/"SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY MEDIUM"/* 1D95E */, /*47684*/"SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGE"/* 1D95F */, /*47685*/"SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGEST"/* 1D960 */, /*47686*/"SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS SMALL"/* 1D961 */, /*47687*/"SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS MEDIUM"/* 1D962 */, /*47688*/"SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGE"/* 1D963 */, /*47689*/"SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGEST"/* 1D964 */, /*47690*/"SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT SMALL"/* 1D965 */, /*47691*/"SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT MEDIUM"/* 1D966 */, /*47692*/"SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGE"/* 1D967 */, /*47693*/"SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGEST"/* 1D968 */, /*47694*/"SIGNWRITING MOVEMENT-FLOORPLANE SINGLE WRIST FLEX"/* 1D969 */, /*47695*/"SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE STRAIGHT"/* 1D96A */, /*47696*/"SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE WRIST FLEX"/* 1D96B */, /*47697*/"SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING"/* 1D96C */, /*47698*/"SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING WRIST FLEX"/* 1D96D */, /*47699*/"SIGNWRITING MOVEMENT-FLOORPLANE CROSS"/* 1D96E */, /*47700*/"SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE STRAIGHT MOVEMENT"/* 1D96F */, /*47701*/"SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE WRIST FLEX"/* 1D970 */, /*47702*/"SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING MOVEMENT"/* 1D971 */, /*47703*/"SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING WRIST FLEX"/* 1D972 */, /*47704*/"SIGNWRITING MOVEMENT-FLOORPLANE BEND"/* 1D973 */, /*47705*/"SIGNWRITING MOVEMENT-FLOORPLANE CORNER SMALL"/* 1D974 */, /*47706*/"SIGNWRITING MOVEMENT-FLOORPLANE CORNER MEDIUM"/* 1D975 */, /*47707*/"SIGNWRITING MOVEMENT-FLOORPLANE CORNER LARGE"/* 1D976 */, /*47708*/"SIGNWRITING MOVEMENT-FLOORPLANE CHECK"/* 1D977 */, /*47709*/"SIGNWRITING MOVEMENT-FLOORPLANE BOX SMALL"/* 1D978 */, /*47710*/"SIGNWRITING MOVEMENT-FLOORPLANE BOX MEDIUM"/* 1D979 */, /*47711*/"SIGNWRITING MOVEMENT-FLOORPLANE BOX LARGE"/* 1D97A */, /*47712*/"SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG SMALL"/* 1D97B */, /*47713*/"SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG MEDIUM"/* 1D97C */, /*47714*/"SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG LARGE"/* 1D97D */, /*47715*/"SIGNWRITING MOVEMENT-FLOORPLANE PEAKS SMALL"/* 1D97E */, /*47716*/"SIGNWRITING MOVEMENT-FLOORPLANE PEAKS MEDIUM"/* 1D97F */, /*47717*/"SIGNWRITING MOVEMENT-FLOORPLANE PEAKS LARGE"/* 1D980 */, /*47718*/"SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE SINGLE"/* 1D981 */, /*47719*/"SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE DOUBLE"/* 1D982 */, /*47720*/"SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE ALTERNATING"/* 1D983 */, /*47721*/"SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE SINGLE"/* 1D984 */, /*47722*/"SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE DOUBLE"/* 1D985 */, /*47723*/"SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE ALTERNATING"/* 1D986 */, /*47724*/"SIGNWRITING TRAVEL-FLOORPLANE SHAKING"/* 1D987 */, /*47725*/"SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER SMALL"/* 1D988 */, /*47726*/"SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER MEDIUM"/* 1D989 */, /*47727*/"SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGE"/* 1D98A */, /*47728*/"SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGEST"/* 1D98B */, /*47729*/"SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE SMALL"/* 1D98C */, /*47730*/"SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE MEDIUM"/* 1D98D */, /*47731*/"SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGE"/* 1D98E */, /*47732*/"SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGEST"/* 1D98F */, /*47733*/"SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE SMALL"/* 1D990 */, /*47734*/"SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE MEDIUM"/* 1D991 */, /*47735*/"SIGNWRITING MOVEMENT-WALLPLANE HUMP SMALL"/* 1D992 */, /*47736*/"SIGNWRITING MOVEMENT-WALLPLANE HUMP MEDIUM"/* 1D993 */, /*47737*/"SIGNWRITING MOVEMENT-WALLPLANE HUMP LARGE"/* 1D994 */, /*47738*/"SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL"/* 1D995 */, /*47739*/"SIGNWRITING MOVEMENT-WALLPLANE LOOP MEDIUM"/* 1D996 */, /*47740*/"SIGNWRITING MOVEMENT-WALLPLANE LOOP LARGE"/* 1D997 */, /*47741*/"SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL DOUBLE"/* 1D998 */, /*47742*/"SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE SMALL"/* 1D999 */, /*47743*/"SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE MEDIUM"/* 1D99A */, /*47744*/"SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE LARGE"/* 1D99B */, /*47745*/"SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE SMALL"/* 1D99C */, /*47746*/"SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE MEDIUM"/* 1D99D */, /*47747*/"SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE LARGE"/* 1D99E */, /*47748*/"SIGNWRITING MOVEMENT-WALLPLANE CURVE THEN STRAIGHT"/* 1D99F */, /*47749*/"SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS SMALL"/* 1D9A0 */, /*47750*/"SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS MEDIUM"/* 1D9A1 */, /*47751*/"SIGNWRITING ROTATION-WALLPLANE SINGLE"/* 1D9A2 */,/*47752*/"SIGNWRITING ROTATION-WALLPLANE DOUBLE"/* 1D9A3 */, /*47753*/"SIGNWRITING ROTATION-WALLPLANE ALTERNATE"/* 1D9A4 */, /*47754*/"SIGNWRITING MOVEMENT-WALLPLANE SHAKING"/* 1D9A5 */, /*47755*/"SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING FRONT WALL"/* 1D9A6 */, /*47756*/"SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING FRONT WALL"/* 1D9A7 */, /*47757*/"SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING FRONT WALL"/* 1D9A8 */, /*47758*/"SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING FRONT WALL"/* 1D9A9 */, /*47759*/"SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING FRONT WALL"/* 1D9AA */, /*47760*/"SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING FRONT WALL"/* 1D9AB */, /*47761*/"SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING FRONT WALL"/* 1D9AC */, /*47762*/"SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING CHEST"/* 1D9AD */, /*47763*/"SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING CHEST"/* 1D9AE */, /*47764*/"SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING CHEST"/* 1D9AF */, /*47765*/"SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING CHEST"/* 1D9B0 */, /*47766*/"SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING CHEST"/* 1D9B1 */, /*47767*/"SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING CHEST"/* 1D9B2 */, /*47768*/"SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING CHEST"/* 1D9B3 */, /*47769*/"SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH SMALL"/* 1D9B4 */, /*47770*/"SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH MEDIUM"/* 1D9B5 */, /*47771*/"SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH LARGE"/* 1D9B6 */, /*47772*/"SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING SMALL"/* 1D9B7 */, /*47773*/"SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING LARGE"/* 1D9B8 */, /*47774*/"SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL DOUBLE"/* 1D9B9 */, /*47775*/"SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE DOUBLE"/* 1D9BA */, /*47776*/"SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL TRIPLE"/* 1D9BB */, /*47777*/"SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE TRIPLE"/* 1D9BC */, /*47778*/"SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL SINGLE"/* 1D9BD */, /*47779*/"SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE SINGLE"/* 1D9BE */, /*47780*/"SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL DOUBLE"/* 1D9BF */, /*47781*/"SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE DOUBLE"/* 1D9C0 */, /*47782*/"SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING SMALL"/* 1D9C1 */, /*47783*/"SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING LARGE"/* 1D9C2 */, /*47784*/"SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING CEILING"/* 1D9C3 */, /*47785*/"SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING CEILING"/* 1D9C4 */, /*47786*/"SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING CEILING"/* 1D9C5 */, /*47787*/"SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR SMALL"/* 1D9C6 */, /*47788*/"SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR LARGE"/* 1D9C7 */, /*47789*/"SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR SMALL DOUBLE"/* 1D9C8 */, /*47790*/"SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR LARGE DOUBLE"/* 1D9C9 */, /*47791*/"SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE SMALL TRIPLE"/* 1D9CA */, /*47792*/"SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE LARGE TRIPLE"/* 1D9CB */, /*47793*/"SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL SINGLE"/* 1D9CC */, /*47794*/"SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE SINGLE"/* 1D9CD */, /*47795*/"SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL DOUBLE"/* 1D9CE */, /*47796*/"SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE DOUBLE"/* 1D9CF */, /*47797*/"SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR SMALL"/* 1D9D0 */, /*47798*/"SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR LARGE"/* 1D9D1 */, /*47799*/"SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING FLOOR"/* 1D9D2 */, /*47800*/"SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING FLOOR"/* 1D9D3 */, /*47801*/"SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING FLOOR"/* 1D9D4 */, /*47802*/"SIGNWRITING MOVEMENT-FLOORPLANE CURVE SMALL"/* 1D9D5 */, /*47803*/"SIGNWRITING MOVEMENT-FLOORPLANE CURVE MEDIUM"/* 1D9D6 */, /*47804*/"SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGE"/* 1D9D7 */, /*47805*/"SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGEST"/* 1D9D8 */, /*47806*/"SIGNWRITING MOVEMENT-FLOORPLANE CURVE COMBINED"/* 1D9D9 */, /*47807*/"SIGNWRITING MOVEMENT-FLOORPLANE HUMP SMALL"/* 1D9DA */, /*47808*/"SIGNWRITING MOVEMENT-FLOORPLANE LOOP SMALL"/* 1D9DB */, /*47809*/"SIGNWRITING MOVEMENT-FLOORPLANE WAVE SNAKE"/* 1D9DC */, /*47810*/"SIGNWRITING MOVEMENT-FLOORPLANE WAVE SMALL"/* 1D9DD */, /*47811*/"SIGNWRITING MOVEMENT-FLOORPLANE WAVE LARGE"/* 1D9DE */, /*47812*/"SIGNWRITING ROTATION-FLOORPLANE SINGLE"/* 1D9DF */, /*47813*/"SIGNWRITING ROTATION-FLOORPLANE DOUBLE"/* 1D9E0 */, /*47814*/"SIGNWRITING ROTATION-FLOORPLANE ALTERNATING"/* 1D9E1 */, /*47815*/"SIGNWRITING MOVEMENT-FLOORPLANE SHAKING PARALLEL"/* 1D9E2 */, /*47816*/"SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL SINGLE"/* 1D9E3 */, /*47817*/"SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM SINGLE"/* 1D9E4 */, /*47818*/"SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL DOUBLE"/* 1D9E5 */, /*47819*/"SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM DOUBLE"/* 1D9E6 */, /*47820*/"SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL SINGLE"/* 1D9E7 */, /*47821*/"SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM SINGLE"/* 1D9E8 */, /*47822*/"SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE SINGLE"/* 1D9E9 */, /*47823*/"SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL DOUBLE"/* 1D9EA */, /*47824*/"SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM DOUBLE"/* 1D9EB */, /*47825*/"SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE DOUBLE"/* 1D9EC */, /*47826*/"SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT SINGLE"/* 1D9ED */, /*47827*/"SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT DOUBLE"/* 1D9EE */, /*47828*/"SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL SINGLE"/* 1D9EF */, /*47829*/"SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL DOUBLE"/* 1D9F0 */, /*47830*/"SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES SINGLE"/* 1D9F1 */, /*47831*/"SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES DOUBLE"/* 1D9F2 */, /*47832*/"SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL SINGLE"/* 1D9F3 */, /*47833*/"SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL DOUBLE"/* 1D9F4 */, /*47834*/"SIGNWRITING DYNAMIC ARROWHEAD SMALL"/* 1D9F5 */,/*47835*/"SIGNWRITING DYNAMIC ARROWHEAD LARGE"/* 1D9F6 */, /*47836*/"SIGNWRITING DYNAMIC FAST"/* 1D9F7 */,/*47837*/"SIGNWRITING DYNAMIC SLOW"/* 1D9F8 */, /*47838*/"SIGNWRITING DYNAMIC TENSE"/* 1D9F9 */,/*47839*/"SIGNWRITING DYNAMIC RELAXED"/* 1D9FA */, /*47840*/"SIGNWRITING DYNAMIC SIMULTANEOUS"/* 1D9FB */, /*47841*/"SIGNWRITING DYNAMIC SIMULTANEOUS ALTERNATING"/* 1D9FC */, /*47842*/"SIGNWRITING DYNAMIC EVERY OTHER TIME"/* 1D9FD */,/*47843*/"SIGNWRITING DYNAMIC GRADUAL"/* 1D9FE */, /*47844*/"SIGNWRITING HEAD"/* 1D9FF */,/*47845*/"SIGNWRITING HEAD RIM"/* 1DA00 */, /*47846*/"SIGNWRITING HEAD MOVEMENT-WALLPLANE STRAIGHT"/* 1DA01 */, /*47847*/"SIGNWRITING HEAD MOVEMENT-WALLPLANE TILT"/* 1DA02 */, /*47848*/"SIGNWRITING HEAD MOVEMENT-FLOORPLANE STRAIGHT"/* 1DA03 */, /*47849*/"SIGNWRITING HEAD MOVEMENT-WALLPLANE CURVE"/* 1DA04 */, /*47850*/"SIGNWRITING HEAD MOVEMENT-FLOORPLANE CURVE"/* 1DA05 */,/*47851*/"SIGNWRITING HEAD MOVEMENT CIRCLE"/* 1DA06 */, /*47852*/"SIGNWRITING FACE DIRECTION POSITION NOSE FORWARD TILTING"/* 1DA07 */, /*47853*/"SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN"/* 1DA08 */, /*47854*/"SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN TILTING"/* 1DA09 */, /*47855*/"SIGNWRITING EYEBROWS STRAIGHT UP"/* 1DA0A */,/*47856*/"SIGNWRITING EYEBROWS STRAIGHT NEUTRAL"/* 1DA0B */, /*47857*/"SIGNWRITING EYEBROWS STRAIGHT DOWN"/* 1DA0C */,/*47858*/"SIGNWRITING DREAMY EYEBROWS NEUTRAL DOWN"/* 1DA0D */, /*47859*/"SIGNWRITING DREAMY EYEBROWS DOWN NEUTRAL"/* 1DA0E */, /*47860*/"SIGNWRITING DREAMY EYEBROWS UP NEUTRAL"/* 1DA0F */, /*47861*/"SIGNWRITING DREAMY EYEBROWS NEUTRAL UP"/* 1DA10 */,/*47862*/"SIGNWRITING FOREHEAD NEUTRAL"/* 1DA11 */, /*47863*/"SIGNWRITING FOREHEAD CONTACT"/* 1DA12 */,/*47864*/"SIGNWRITING FOREHEAD WRINKLED"/* 1DA13 */, /*47865*/"SIGNWRITING EYES OPEN"/* 1DA14 */,/*47866*/"SIGNWRITING EYES SQUEEZED"/* 1DA15 */, /*47867*/"SIGNWRITING EYES CLOSED"/* 1DA16 */,/*47868*/"SIGNWRITING EYE BLINK SINGLE"/* 1DA17 */, /*47869*/"SIGNWRITING EYE BLINK MULTIPLE"/* 1DA18 */,/*47870*/"SIGNWRITING EYES HALF OPEN"/* 1DA19 */, /*47871*/"SIGNWRITING EYES WIDE OPEN"/* 1DA1A */,/*47872*/"SIGNWRITING EYES HALF CLOSED"/* 1DA1B */, /*47873*/"SIGNWRITING EYES WIDENING MOVEMENT"/* 1DA1C */,/*47874*/"SIGNWRITING EYE WINK"/* 1DA1D */, /*47875*/"SIGNWRITING EYELASHES UP"/* 1DA1E */,/*47876*/"SIGNWRITING EYELASHES DOWN"/* 1DA1F */, /*47877*/"SIGNWRITING EYELASHES FLUTTERING"/* 1DA20 */,/*47878*/"SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT"/* 1DA21 */, /*47879*/"SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT DOUBLE"/* 1DA22 */, /*47880*/"SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT ALTERNATING"/* 1DA23 */, /*47881*/"SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT"/* 1DA24 */, /*47882*/"SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT DOUBLE"/* 1DA25 */, /*47883*/"SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT ALTERNATING"/* 1DA26 */, /*47884*/"SIGNWRITING EYEGAZE-WALLPLANE CURVED"/* 1DA27 */,/*47885*/"SIGNWRITING EYEGAZE-FLOORPLANE CURVED"/* 1DA28 */, /*47886*/"SIGNWRITING EYEGAZE-WALLPLANE CIRCLING"/* 1DA29 */,/*47887*/"SIGNWRITING CHEEKS PUFFED"/* 1DA2A */, /*47888*/"SIGNWRITING CHEEKS NEUTRAL"/* 1DA2B */,/*47889*/"SIGNWRITING CHEEKS SUCKED"/* 1DA2C */, /*47890*/"SIGNWRITING TENSE CHEEKS HIGH"/* 1DA2D */,/*47891*/"SIGNWRITING TENSE CHEEKS MIDDLE"/* 1DA2E */, /*47892*/"SIGNWRITING TENSE CHEEKS LOW"/* 1DA2F */,/*47893*/"SIGNWRITING EARS"/* 1DA30 */, /*47894*/"SIGNWRITING NOSE NEUTRAL"/* 1DA31 */,/*47895*/"SIGNWRITING NOSE CONTACT"/* 1DA32 */, /*47896*/"SIGNWRITING NOSE WRINKLES"/* 1DA33 */,/*47897*/"SIGNWRITING NOSE WIGGLES"/* 1DA34 */, /*47898*/"SIGNWRITING AIR BLOWING OUT"/* 1DA35 */,/*47899*/"SIGNWRITING AIR SUCKING IN"/* 1DA36 */, /*47900*/"SIGNWRITING AIR BLOW SMALL ROTATIONS"/* 1DA37 */,/*47901*/"SIGNWRITING AIR SUCK SMALL ROTATIONS"/* 1DA38 */, /*47902*/"SIGNWRITING BREATH INHALE"/* 1DA39 */,/*47903*/"SIGNWRITING BREATH EXHALE"/* 1DA3A */, /*47904*/"SIGNWRITING MOUTH CLOSED NEUTRAL"/* 1DA3B */,/*47905*/"SIGNWRITING MOUTH CLOSED FORWARD"/* 1DA3C */, /*47906*/"SIGNWRITING MOUTH CLOSED CONTACT"/* 1DA3D */,/*47907*/"SIGNWRITING MOUTH SMILE"/* 1DA3E */, /*47908*/"SIGNWRITING MOUTH SMILE WRINKLED"/* 1DA3F */,/*47909*/"SIGNWRITING MOUTH SMILE OPEN"/* 1DA40 */, /*47910*/"SIGNWRITING MOUTH FROWN"/* 1DA41 */,/*47911*/"SIGNWRITING MOUTH FROWN WRINKLED"/* 1DA42 */, /*47912*/"SIGNWRITING MOUTH FROWN OPEN"/* 1DA43 */,/*47913*/"SIGNWRITING MOUTH OPEN CIRCLE"/* 1DA44 */, /*47914*/"SIGNWRITING MOUTH OPEN FORWARD"/* 1DA45 */,/*47915*/"SIGNWRITING MOUTH OPEN WRINKLED"/* 1DA46 */, /*47916*/"SIGNWRITING MOUTH OPEN OVAL"/* 1DA47 */,/*47917*/"SIGNWRITING MOUTH OPEN OVAL WRINKLED"/* 1DA48 */, /*47918*/"SIGNWRITING MOUTH OPEN OVAL YAWN"/* 1DA49 */,/*47919*/"SIGNWRITING MOUTH OPEN RECTANGLE"/* 1DA4A */, /*47920*/"SIGNWRITING MOUTH OPEN RECTANGLE WRINKLED"/* 1DA4B */, /*47921*/"SIGNWRITING MOUTH OPEN RECTANGLE YAWN"/* 1DA4C */,/*47922*/"SIGNWRITING MOUTH KISS"/* 1DA4D */, /*47923*/"SIGNWRITING MOUTH KISS FORWARD"/* 1DA4E */,/*47924*/"SIGNWRITING MOUTH KISS WRINKLED"/* 1DA4F */, /*47925*/"SIGNWRITING MOUTH TENSE"/* 1DA50 */,/*47926*/"SIGNWRITING MOUTH TENSE FORWARD"/* 1DA51 */, /*47927*/"SIGNWRITING MOUTH TENSE SUCKED"/* 1DA52 */,/*47928*/"SIGNWRITING LIPS PRESSED TOGETHER"/* 1DA53 */, /*47929*/"SIGNWRITING LIP LOWER OVER UPPER"/* 1DA54 */,/*47930*/"SIGNWRITING LIP UPPER OVER LOWER"/* 1DA55 */, /*47931*/"SIGNWRITING MOUTH CORNERS"/* 1DA56 */,/*47932*/"SIGNWRITING MOUTH WRINKLES SINGLE"/* 1DA57 */, /*47933*/"SIGNWRITING MOUTH WRINKLES DOUBLE"/* 1DA58 */,/*47934*/"SIGNWRITING TONGUE STICKING OUT FAR"/* 1DA59 */, /*47935*/"SIGNWRITING TONGUE LICKING LIPS"/* 1DA5A */,/*47936*/"SIGNWRITING TONGUE TIP BETWEEN LIPS"/* 1DA5B */, /*47937*/"SIGNWRITING TONGUE TIP TOUCHING INSIDE MOUTH"/* 1DA5C */, /*47938*/"SIGNWRITING TONGUE INSIDE MOUTH RELAXED"/* 1DA5D */, /*47939*/"SIGNWRITING TONGUE MOVES AGAINST CHEEK"/* 1DA5E */, /*47940*/"SIGNWRITING TONGUE CENTRE STICKING OUT"/* 1DA5F */, /*47941*/"SIGNWRITING TONGUE CENTRE INSIDE MOUTH"/* 1DA60 */,/*47942*/"SIGNWRITING TEETH"/* 1DA61 */, /*47943*/"SIGNWRITING TEETH MOVEMENT"/* 1DA62 */,/*47944*/"SIGNWRITING TEETH ON TONGUE"/* 1DA63 */, /*47945*/"SIGNWRITING TEETH ON TONGUE MOVEMENT"/* 1DA64 */,/*47946*/"SIGNWRITING TEETH ON LIPS"/* 1DA65 */, /*47947*/"SIGNWRITING TEETH ON LIPS MOVEMENT"/* 1DA66 */,/*47948*/"SIGNWRITING TEETH BITE LIPS"/* 1DA67 */, /*47949*/"SIGNWRITING MOVEMENT-WALLPLANE JAW"/* 1DA68 */,/*47950*/"SIGNWRITING MOVEMENT-FLOORPLANE JAW"/* 1DA69 */, /*47951*/"SIGNWRITING NECK"/* 1DA6A */,/*47952*/"SIGNWRITING HAIR"/* 1DA6B */, /*47953*/"SIGNWRITING EXCITEMENT"/* 1DA6C */,/*47954*/"SIGNWRITING SHOULDER HIP SPINE"/* 1DA6D */, /*47955*/"SIGNWRITING SHOULDER HIP POSITIONS"/* 1DA6E */,/*47956*/"SIGNWRITING WALLPLANE SHOULDER HIP MOVE"/* 1DA6F */, /*47957*/"SIGNWRITING FLOORPLANE SHOULDER HIP MOVE"/* 1DA70 */, /*47958*/"SIGNWRITING SHOULDER TILTING FROM WAIST"/* 1DA71 */, /*47959*/"SIGNWRITING TORSO-WALLPLANE STRAIGHT STRETCH"/* 1DA72 */, /*47960*/"SIGNWRITING TORSO-WALLPLANE CURVED BEND"/* 1DA73 */, /*47961*/"SIGNWRITING TORSO-FLOORPLANE TWISTING"/* 1DA74 */, /*47962*/"SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS"/* 1DA75 */,/*47963*/"SIGNWRITING LIMB COMBINATION"/* 1DA76 */, /*47964*/"SIGNWRITING LIMB LENGTH-1"/* 1DA77 */,/*47965*/"SIGNWRITING LIMB LENGTH-2"/* 1DA78 */, /*47966*/"SIGNWRITING LIMB LENGTH-3"/* 1DA79 */,/*47967*/"SIGNWRITING LIMB LENGTH-4"/* 1DA7A */, /*47968*/"SIGNWRITING LIMB LENGTH-5"/* 1DA7B */,/*47969*/"SIGNWRITING LIMB LENGTH-6"/* 1DA7C */, /*47970*/"SIGNWRITING LIMB LENGTH-7"/* 1DA7D */,/*47971*/"SIGNWRITING FINGER"/* 1DA7E */, /*47972*/"SIGNWRITING LOCATION-WALLPLANE SPACE"/* 1DA7F */,/*47973*/"SIGNWRITING LOCATION-FLOORPLANE SPACE"/* 1DA80 */, /*47974*/"SIGNWRITING LOCATION HEIGHT"/* 1DA81 */,/*47975*/"SIGNWRITING LOCATION WIDTH"/* 1DA82 */, /*47976*/"SIGNWRITING LOCATION DEPTH"/* 1DA83 */,/*47977*/"SIGNWRITING LOCATION HEAD NECK"/* 1DA84 */, /*47978*/"SIGNWRITING LOCATION TORSO"/* 1DA85 */,/*47979*/"SIGNWRITING LOCATION LIMBS DIGITS"/* 1DA86 */, /*47980*/"SIGNWRITING COMMA"/* 1DA87 */,/*47981*/"SIGNWRITING FULL STOP"/* 1DA88 */, /*47982*/"SIGNWRITING SEMICOLON"/* 1DA89 */,/*47983*/"SIGNWRITING COLON"/* 1DA8A */, /*47984*/"SIGNWRITING PARENTHESIS"/* 1DA8B */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*48000*/"SIGNWRITING FILL MODIFIER-2"/* 1DA9B */,/*48001*/"SIGNWRITING FILL MODIFIER-3"/* 1DA9C */, /*48002*/"SIGNWRITING FILL MODIFIER-4"/* 1DA9D */,/*48003*/"SIGNWRITING FILL MODIFIER-5"/* 1DA9E */, /*48004*/"SIGNWRITING FILL MODIFIER-6"/* 1DA9F */,NULL,/*48006*/"SIGNWRITING ROTATION MODIFIER-2"/* 1DAA1 */, /*48007*/"SIGNWRITING ROTATION MODIFIER-3"/* 1DAA2 */,/*48008*/"SIGNWRITING ROTATION MODIFIER-4"/* 1DAA3 */, /*48009*/"SIGNWRITING ROTATION MODIFIER-5"/* 1DAA4 */,/*48010*/"SIGNWRITING ROTATION MODIFIER-6"/* 1DAA5 */, /*48011*/"SIGNWRITING ROTATION MODIFIER-7"/* 1DAA6 */,/*48012*/"SIGNWRITING ROTATION MODIFIER-8"/* 1DAA7 */, /*48013*/"SIGNWRITING ROTATION MODIFIER-9"/* 1DAA8 */,/*48014*/"SIGNWRITING ROTATION MODIFIER-10"/* 1DAA9 */, /*48015*/"SIGNWRITING ROTATION MODIFIER-11"/* 1DAAA */,/*48016*/"SIGNWRITING ROTATION MODIFIER-12"/* 1DAAB */, /*48017*/"SIGNWRITING ROTATION MODIFIER-13"/* 1DAAC */,/*48018*/"SIGNWRITING ROTATION MODIFIER-14"/* 1DAAD */, /*48019*/"SIGNWRITING ROTATION MODIFIER-15"/* 1DAAE */,/*48020*/"SIGNWRITING ROTATION MODIFIER-16"/* 1DAAF */, /*48021*/"COMBINING GLAGOLITIC LETTER AZU"/* 1E000 */,/*48022*/"COMBINING GLAGOLITIC LETTER BUKY"/* 1E001 */, /*48023*/"COMBINING GLAGOLITIC LETTER VEDE"/* 1E002 */,/*48024*/"COMBINING GLAGOLITIC LETTER GLAGOLI"/* 1E003 */, /*48025*/"COMBINING GLAGOLITIC LETTER DOBRO"/* 1E004 */,/*48026*/"COMBINING GLAGOLITIC LETTER YESTU"/* 1E005 */, /*48027*/"COMBINING GLAGOLITIC LETTER ZHIVETE"/* 1E006 */,NULL,/*48029*/"COMBINING GLAGOLITIC LETTER ZEMLJA"/* 1E008 */, /*48030*/"COMBINING GLAGOLITIC LETTER IZHE"/* 1E009 */,/*48031*/"COMBINING GLAGOLITIC LETTER INITIAL IZHE"/* 1E00A */, /*48032*/"COMBINING GLAGOLITIC LETTER I"/* 1E00B */,/*48033*/"COMBINING GLAGOLITIC LETTER DJERVI"/* 1E00C */, /*48034*/"COMBINING GLAGOLITIC LETTER KAKO"/* 1E00D */,/*48035*/"COMBINING GLAGOLITIC LETTER LJUDIJE"/* 1E00E */, /*48036*/"COMBINING GLAGOLITIC LETTER MYSLITE"/* 1E00F */,/*48037*/"COMBINING GLAGOLITIC LETTER NASHI"/* 1E010 */, /*48038*/"COMBINING GLAGOLITIC LETTER ONU"/* 1E011 */,/*48039*/"COMBINING GLAGOLITIC LETTER POKOJI"/* 1E012 */, /*48040*/"COMBINING GLAGOLITIC LETTER RITSI"/* 1E013 */,/*48041*/"COMBINING GLAGOLITIC LETTER SLOVO"/* 1E014 */, /*48042*/"COMBINING GLAGOLITIC LETTER TVRIDO"/* 1E015 */,/*48043*/"COMBINING GLAGOLITIC LETTER UKU"/* 1E016 */, /*48044*/"COMBINING GLAGOLITIC LETTER FRITU"/* 1E017 */,/*48045*/"COMBINING GLAGOLITIC LETTER HERU"/* 1E018 */,NULL,NULL, /*48048*/"COMBINING GLAGOLITIC LETTER SHTA"/* 1E01B */,/*48049*/"COMBINING GLAGOLITIC LETTER TSI"/* 1E01C */, /*48050*/"COMBINING GLAGOLITIC LETTER CHRIVI"/* 1E01D */,/*48051*/"COMBINING GLAGOLITIC LETTER SHA"/* 1E01E */, /*48052*/"COMBINING GLAGOLITIC LETTER YERU"/* 1E01F */,/*48053*/"COMBINING GLAGOLITIC LETTER YERI"/* 1E020 */, /*48054*/"COMBINING GLAGOLITIC LETTER YATI"/* 1E021 */,NULL,/*48056*/"COMBINING GLAGOLITIC LETTER YU"/* 1E023 */, /*48057*/"COMBINING GLAGOLITIC LETTER SMALL YUS"/* 1E024 */,NULL,/*48059*/"COMBINING GLAGOLITIC LETTER YO"/* 1E026 */, /*48060*/"COMBINING GLAGOLITIC LETTER IOTATED SMALL YUS"/* 1E027 */, /*48061*/"COMBINING GLAGOLITIC LETTER BIG YUS"/* 1E028 */, /*48062*/"COMBINING GLAGOLITIC LETTER IOTATED BIG YUS"/* 1E029 */,/*48063*/"COMBINING GLAGOLITIC LETTER FITA"/* 1E02A */, /*48064*/"MENDE KIKAKUI SYLLABLE M001 KI"/* 1E800 */,/*48065*/"MENDE KIKAKUI SYLLABLE M002 KA"/* 1E801 */, /*48066*/"MENDE KIKAKUI SYLLABLE M003 KU"/* 1E802 */,/*48067*/"MENDE KIKAKUI SYLLABLE M065 KEE"/* 1E803 */, /*48068*/"MENDE KIKAKUI SYLLABLE M095 KE"/* 1E804 */,/*48069*/"MENDE KIKAKUI SYLLABLE M076 KOO"/* 1E805 */, /*48070*/"MENDE KIKAKUI SYLLABLE M048 KO"/* 1E806 */,/*48071*/"MENDE KIKAKUI SYLLABLE M179 KUA"/* 1E807 */, /*48072*/"MENDE KIKAKUI SYLLABLE M004 WI"/* 1E808 */,/*48073*/"MENDE KIKAKUI SYLLABLE M005 WA"/* 1E809 */, /*48074*/"MENDE KIKAKUI SYLLABLE M006 WU"/* 1E80A */,/*48075*/"MENDE KIKAKUI SYLLABLE M126 WEE"/* 1E80B */, /*48076*/"MENDE KIKAKUI SYLLABLE M118 WE"/* 1E80C */,/*48077*/"MENDE KIKAKUI SYLLABLE M114 WOO"/* 1E80D */, /*48078*/"MENDE KIKAKUI SYLLABLE M045 WO"/* 1E80E */,/*48079*/"MENDE KIKAKUI SYLLABLE M194 WUI"/* 1E80F */, /*48080*/"MENDE KIKAKUI SYLLABLE M143 WEI"/* 1E810 */,/*48081*/"MENDE KIKAKUI SYLLABLE M061 WVI"/* 1E811 */, /*48082*/"MENDE KIKAKUI SYLLABLE M049 WVA"/* 1E812 */,/*48083*/"MENDE KIKAKUI SYLLABLE M139 WVE"/* 1E813 */, /*48084*/"MENDE KIKAKUI SYLLABLE M007 MIN"/* 1E814 */,/*48085*/"MENDE KIKAKUI SYLLABLE M008 MAN"/* 1E815 */, /*48086*/"MENDE KIKAKUI SYLLABLE M009 MUN"/* 1E816 */,/*48087*/"MENDE KIKAKUI SYLLABLE M059 MEN"/* 1E817 */, /*48088*/"MENDE KIKAKUI SYLLABLE M094 MON"/* 1E818 */,/*48089*/"MENDE KIKAKUI SYLLABLE M154 MUAN"/* 1E819 */, /*48090*/"MENDE KIKAKUI SYLLABLE M189 MUEN"/* 1E81A */,/*48091*/"MENDE KIKAKUI SYLLABLE M010 BI"/* 1E81B */, /*48092*/"MENDE KIKAKUI SYLLABLE M011 BA"/* 1E81C */,/*48093*/"MENDE KIKAKUI SYLLABLE M012 BU"/* 1E81D */, /*48094*/"MENDE KIKAKUI SYLLABLE M150 BEE"/* 1E81E */,/*48095*/"MENDE KIKAKUI SYLLABLE M097 BE"/* 1E81F */, /*48096*/"MENDE KIKAKUI SYLLABLE M103 BOO"/* 1E820 */,/*48097*/"MENDE KIKAKUI SYLLABLE M138 BO"/* 1E821 */, /*48098*/"MENDE KIKAKUI SYLLABLE M013 I"/* 1E822 */,/*48099*/"MENDE KIKAKUI SYLLABLE M014 A"/* 1E823 */, /*48100*/"MENDE KIKAKUI SYLLABLE M015 U"/* 1E824 */,/*48101*/"MENDE KIKAKUI SYLLABLE M163 EE"/* 1E825 */, /*48102*/"MENDE KIKAKUI SYLLABLE M100 E"/* 1E826 */,/*48103*/"MENDE KIKAKUI SYLLABLE M165 OO"/* 1E827 */, /*48104*/"MENDE KIKAKUI SYLLABLE M147 O"/* 1E828 */,/*48105*/"MENDE KIKAKUI SYLLABLE M137 EI"/* 1E829 */, /*48106*/"MENDE KIKAKUI SYLLABLE M131 IN"/* 1E82A */,/*48107*/"MENDE KIKAKUI SYLLABLE M135 IN"/* 1E82B */, /*48108*/"MENDE KIKAKUI SYLLABLE M195 AN"/* 1E82C */,/*48109*/"MENDE KIKAKUI SYLLABLE M178 EN"/* 1E82D */, /*48110*/"MENDE KIKAKUI SYLLABLE M019 SI"/* 1E82E */,/*48111*/"MENDE KIKAKUI SYLLABLE M020 SA"/* 1E82F */, /*48112*/"MENDE KIKAKUI SYLLABLE M021 SU"/* 1E830 */,/*48113*/"MENDE KIKAKUI SYLLABLE M162 SEE"/* 1E831 */, /*48114*/"MENDE KIKAKUI SYLLABLE M116 SE"/* 1E832 */,/*48115*/"MENDE KIKAKUI SYLLABLE M136 SOO"/* 1E833 */, /*48116*/"MENDE KIKAKUI SYLLABLE M079 SO"/* 1E834 */,/*48117*/"MENDE KIKAKUI SYLLABLE M196 SIA"/* 1E835 */, /*48118*/"MENDE KIKAKUI SYLLABLE M025 LI"/* 1E836 */,/*48119*/"MENDE KIKAKUI SYLLABLE M026 LA"/* 1E837 */, /*48120*/"MENDE KIKAKUI SYLLABLE M027 LU"/* 1E838 */,/*48121*/"MENDE KIKAKUI SYLLABLE M084 LEE"/* 1E839 */, /*48122*/"MENDE KIKAKUI SYLLABLE M073 LE"/* 1E83A */,/*48123*/"MENDE KIKAKUI SYLLABLE M054 LOO"/* 1E83B */, /*48124*/"MENDE KIKAKUI SYLLABLE M153 LO"/* 1E83C */,/*48125*/"MENDE KIKAKUI SYLLABLE M110 LONG LE"/* 1E83D */, /*48126*/"MENDE KIKAKUI SYLLABLE M016 DI"/* 1E83E */,/*48127*/"MENDE KIKAKUI SYLLABLE M017 DA"/* 1E83F */, /*48128*/"MENDE KIKAKUI SYLLABLE M018 DU"/* 1E840 */,/*48129*/"MENDE KIKAKUI SYLLABLE M089 DEE"/* 1E841 */, /*48130*/"MENDE KIKAKUI SYLLABLE M180 DOO"/* 1E842 */,/*48131*/"MENDE KIKAKUI SYLLABLE M181 DO"/* 1E843 */, /*48132*/"MENDE KIKAKUI SYLLABLE M022 TI"/* 1E844 */,/*48133*/"MENDE KIKAKUI SYLLABLE M023 TA"/* 1E845 */, /*48134*/"MENDE KIKAKUI SYLLABLE M024 TU"/* 1E846 */,/*48135*/"MENDE KIKAKUI SYLLABLE M091 TEE"/* 1E847 */, /*48136*/"MENDE KIKAKUI SYLLABLE M055 TE"/* 1E848 */,/*48137*/"MENDE KIKAKUI SYLLABLE M104 TOO"/* 1E849 */, /*48138*/"MENDE KIKAKUI SYLLABLE M069 TO"/* 1E84A */,/*48139*/"MENDE KIKAKUI SYLLABLE M028 JI"/* 1E84B */, /*48140*/"MENDE KIKAKUI SYLLABLE M029 JA"/* 1E84C */,/*48141*/"MENDE KIKAKUI SYLLABLE M030 JU"/* 1E84D */, /*48142*/"MENDE KIKAKUI SYLLABLE M157 JEE"/* 1E84E */,/*48143*/"MENDE KIKAKUI SYLLABLE M113 JE"/* 1E84F */, /*48144*/"MENDE KIKAKUI SYLLABLE M160 JOO"/* 1E850 */,/*48145*/"MENDE KIKAKUI SYLLABLE M063 JO"/* 1E851 */, /*48146*/"MENDE KIKAKUI SYLLABLE M175 LONG JO"/* 1E852 */,/*48147*/"MENDE KIKAKUI SYLLABLE M031 YI"/* 1E853 */, /*48148*/"MENDE KIKAKUI SYLLABLE M032 YA"/* 1E854 */,/*48149*/"MENDE KIKAKUI SYLLABLE M033 YU"/* 1E855 */, /*48150*/"MENDE KIKAKUI SYLLABLE M109 YEE"/* 1E856 */,/*48151*/"MENDE KIKAKUI SYLLABLE M080 YE"/* 1E857 */, /*48152*/"MENDE KIKAKUI SYLLABLE M141 YOO"/* 1E858 */,/*48153*/"MENDE KIKAKUI SYLLABLE M121 YO"/* 1E859 */, /*48154*/"MENDE KIKAKUI SYLLABLE M034 FI"/* 1E85A */,/*48155*/"MENDE KIKAKUI SYLLABLE M035 FA"/* 1E85B */, /*48156*/"MENDE KIKAKUI SYLLABLE M036 FU"/* 1E85C */,/*48157*/"MENDE KIKAKUI SYLLABLE M078 FEE"/* 1E85D */, /*48158*/"MENDE KIKAKUI SYLLABLE M075 FE"/* 1E85E */,/*48159*/"MENDE KIKAKUI SYLLABLE M133 FOO"/* 1E85F */, /*48160*/"MENDE KIKAKUI SYLLABLE M088 FO"/* 1E860 */,/*48161*/"MENDE KIKAKUI SYLLABLE M197 FUA"/* 1E861 */, /*48162*/"MENDE KIKAKUI SYLLABLE M101 FAN"/* 1E862 */,/*48163*/"MENDE KIKAKUI SYLLABLE M037 NIN"/* 1E863 */, /*48164*/"MENDE KIKAKUI SYLLABLE M038 NAN"/* 1E864 */,/*48165*/"MENDE KIKAKUI SYLLABLE M039 NUN"/* 1E865 */, /*48166*/"MENDE KIKAKUI SYLLABLE M117 NEN"/* 1E866 */,/*48167*/"MENDE KIKAKUI SYLLABLE M169 NON"/* 1E867 */, /*48168*/"MENDE KIKAKUI SYLLABLE M176 HI"/* 1E868 */,/*48169*/"MENDE KIKAKUI SYLLABLE M041 HA"/* 1E869 */, /*48170*/"MENDE KIKAKUI SYLLABLE M186 HU"/* 1E86A */,/*48171*/"MENDE KIKAKUI SYLLABLE M040 HEE"/* 1E86B */, /*48172*/"MENDE KIKAKUI SYLLABLE M096 HE"/* 1E86C */,/*48173*/"MENDE KIKAKUI SYLLABLE M042 HOO"/* 1E86D */, /*48174*/"MENDE KIKAKUI SYLLABLE M140 HO"/* 1E86E */,/*48175*/"MENDE KIKAKUI SYLLABLE M083 HEEI"/* 1E86F */, /*48176*/"MENDE KIKAKUI SYLLABLE M128 HOOU"/* 1E870 */,/*48177*/"MENDE KIKAKUI SYLLABLE M053 HIN"/* 1E871 */, /*48178*/"MENDE KIKAKUI SYLLABLE M130 HAN"/* 1E872 */,/*48179*/"MENDE KIKAKUI SYLLABLE M087 HUN"/* 1E873 */, /*48180*/"MENDE KIKAKUI SYLLABLE M052 HEN"/* 1E874 */,/*48181*/"MENDE KIKAKUI SYLLABLE M193 HON"/* 1E875 */, /*48182*/"MENDE KIKAKUI SYLLABLE M046 HUAN"/* 1E876 */,/*48183*/"MENDE KIKAKUI SYLLABLE M090 NGGI"/* 1E877 */, /*48184*/"MENDE KIKAKUI SYLLABLE M043 NGGA"/* 1E878 */,/*48185*/"MENDE KIKAKUI SYLLABLE M082 NGGU"/* 1E879 */, /*48186*/"MENDE KIKAKUI SYLLABLE M115 NGGEE"/* 1E87A */,/*48187*/"MENDE KIKAKUI SYLLABLE M146 NGGE"/* 1E87B */, /*48188*/"MENDE KIKAKUI SYLLABLE M156 NGGOO"/* 1E87C */,/*48189*/"MENDE KIKAKUI SYLLABLE M120 NGGO"/* 1E87D */, /*48190*/"MENDE KIKAKUI SYLLABLE M159 NGGAA"/* 1E87E */,/*48191*/"MENDE KIKAKUI SYLLABLE M127 NGGUA"/* 1E87F */, /*48192*/"MENDE KIKAKUI SYLLABLE M086 LONG NGGE"/* 1E880 */,/*48193*/"MENDE KIKAKUI SYLLABLE M106 LONG NGGOO"/* 1E881 */, /*48194*/"MENDE KIKAKUI SYLLABLE M183 LONG NGGO"/* 1E882 */,/*48195*/"MENDE KIKAKUI SYLLABLE M155 GI"/* 1E883 */, /*48196*/"MENDE KIKAKUI SYLLABLE M111 GA"/* 1E884 */,/*48197*/"MENDE KIKAKUI SYLLABLE M168 GU"/* 1E885 */, /*48198*/"MENDE KIKAKUI SYLLABLE M190 GEE"/* 1E886 */,/*48199*/"MENDE KIKAKUI SYLLABLE M166 GUEI"/* 1E887 */, /*48200*/"MENDE KIKAKUI SYLLABLE M167 GUAN"/* 1E888 */,/*48201*/"MENDE KIKAKUI SYLLABLE M184 NGEN"/* 1E889 */, /*48202*/"MENDE KIKAKUI SYLLABLE M057 NGON"/* 1E88A */,/*48203*/"MENDE KIKAKUI SYLLABLE M177 NGUAN"/* 1E88B */, /*48204*/"MENDE KIKAKUI SYLLABLE M068 PI"/* 1E88C */,/*48205*/"MENDE KIKAKUI SYLLABLE M099 PA"/* 1E88D */, /*48206*/"MENDE KIKAKUI SYLLABLE M050 PU"/* 1E88E */,/*48207*/"MENDE KIKAKUI SYLLABLE M081 PEE"/* 1E88F */, /*48208*/"MENDE KIKAKUI SYLLABLE M051 PE"/* 1E890 */,/*48209*/"MENDE KIKAKUI SYLLABLE M102 POO"/* 1E891 */, /*48210*/"MENDE KIKAKUI SYLLABLE M066 PO"/* 1E892 */,/*48211*/"MENDE KIKAKUI SYLLABLE M145 MBI"/* 1E893 */, /*48212*/"MENDE KIKAKUI SYLLABLE M062 MBA"/* 1E894 */,/*48213*/"MENDE KIKAKUI SYLLABLE M122 MBU"/* 1E895 */, /*48214*/"MENDE KIKAKUI SYLLABLE M047 MBEE"/* 1E896 */,/*48215*/"MENDE KIKAKUI SYLLABLE M188 MBEE"/* 1E897 */, /*48216*/"MENDE KIKAKUI SYLLABLE M072 MBE"/* 1E898 */,/*48217*/"MENDE KIKAKUI SYLLABLE M172 MBOO"/* 1E899 */, /*48218*/"MENDE KIKAKUI SYLLABLE M174 MBO"/* 1E89A */,/*48219*/"MENDE KIKAKUI SYLLABLE M187 MBUU"/* 1E89B */, /*48220*/"MENDE KIKAKUI SYLLABLE M161 LONG MBE"/* 1E89C */,/*48221*/"MENDE KIKAKUI SYLLABLE M105 LONG MBOO"/* 1E89D */, /*48222*/"MENDE KIKAKUI SYLLABLE M142 LONG MBO"/* 1E89E */,/*48223*/"MENDE KIKAKUI SYLLABLE M132 KPI"/* 1E89F */, /*48224*/"MENDE KIKAKUI SYLLABLE M092 KPA"/* 1E8A0 */,/*48225*/"MENDE KIKAKUI SYLLABLE M074 KPU"/* 1E8A1 */, /*48226*/"MENDE KIKAKUI SYLLABLE M044 KPEE"/* 1E8A2 */,/*48227*/"MENDE KIKAKUI SYLLABLE M108 KPE"/* 1E8A3 */, /*48228*/"MENDE KIKAKUI SYLLABLE M112 KPOO"/* 1E8A4 */,/*48229*/"MENDE KIKAKUI SYLLABLE M158 KPO"/* 1E8A5 */, /*48230*/"MENDE KIKAKUI SYLLABLE M124 GBI"/* 1E8A6 */,/*48231*/"MENDE KIKAKUI SYLLABLE M056 GBA"/* 1E8A7 */, /*48232*/"MENDE KIKAKUI SYLLABLE M148 GBU"/* 1E8A8 */,/*48233*/"MENDE KIKAKUI SYLLABLE M093 GBEE"/* 1E8A9 */, /*48234*/"MENDE KIKAKUI SYLLABLE M107 GBE"/* 1E8AA */,/*48235*/"MENDE KIKAKUI SYLLABLE M071 GBOO"/* 1E8AB */, /*48236*/"MENDE KIKAKUI SYLLABLE M070 GBO"/* 1E8AC */,/*48237*/"MENDE KIKAKUI SYLLABLE M171 RA"/* 1E8AD */, /*48238*/"MENDE KIKAKUI SYLLABLE M123 NDI"/* 1E8AE */,/*48239*/"MENDE KIKAKUI SYLLABLE M129 NDA"/* 1E8AF */, /*48240*/"MENDE KIKAKUI SYLLABLE M125 NDU"/* 1E8B0 */,/*48241*/"MENDE KIKAKUI SYLLABLE M191 NDEE"/* 1E8B1 */, /*48242*/"MENDE KIKAKUI SYLLABLE M119 NDE"/* 1E8B2 */,/*48243*/"MENDE KIKAKUI SYLLABLE M067 NDOO"/* 1E8B3 */, /*48244*/"MENDE KIKAKUI SYLLABLE M064 NDO"/* 1E8B4 */,/*48245*/"MENDE KIKAKUI SYLLABLE M152 NJA"/* 1E8B5 */, /*48246*/"MENDE KIKAKUI SYLLABLE M192 NJU"/* 1E8B6 */,/*48247*/"MENDE KIKAKUI SYLLABLE M149 NJEE"/* 1E8B7 */, /*48248*/"MENDE KIKAKUI SYLLABLE M134 NJOO"/* 1E8B8 */,/*48249*/"MENDE KIKAKUI SYLLABLE M182 VI"/* 1E8B9 */, /*48250*/"MENDE KIKAKUI SYLLABLE M185 VA"/* 1E8BA */,/*48251*/"MENDE KIKAKUI SYLLABLE M151 VU"/* 1E8BB */, /*48252*/"MENDE KIKAKUI SYLLABLE M173 VEE"/* 1E8BC */,/*48253*/"MENDE KIKAKUI SYLLABLE M085 VE"/* 1E8BD */, /*48254*/"MENDE KIKAKUI SYLLABLE M144 VOO"/* 1E8BE */,/*48255*/"MENDE KIKAKUI SYLLABLE M077 VO"/* 1E8BF */, /*48256*/"MENDE KIKAKUI SYLLABLE M164 NYIN"/* 1E8C0 */,/*48257*/"MENDE KIKAKUI SYLLABLE M058 NYAN"/* 1E8C1 */, /*48258*/"MENDE KIKAKUI SYLLABLE M170 NYUN"/* 1E8C2 */,/*48259*/"MENDE KIKAKUI SYLLABLE M098 NYEN"/* 1E8C3 */, /*48260*/"MENDE KIKAKUI SYLLABLE M060 NYON"/* 1E8C4 */,NULL,NULL,/*48263*/"MENDE KIKAKUI DIGIT ONE"/* 1E8C7 */, /*48264*/"MENDE KIKAKUI DIGIT TWO"/* 1E8C8 */,/*48265*/"MENDE KIKAKUI DIGIT THREE"/* 1E8C9 */, /*48266*/"MENDE KIKAKUI DIGIT FOUR"/* 1E8CA */,/*48267*/"MENDE KIKAKUI DIGIT FIVE"/* 1E8CB */, /*48268*/"MENDE KIKAKUI DIGIT SIX"/* 1E8CC */,/*48269*/"MENDE KIKAKUI DIGIT SEVEN"/* 1E8CD */, /*48270*/"MENDE KIKAKUI DIGIT EIGHT"/* 1E8CE */,/*48271*/"MENDE KIKAKUI DIGIT NINE"/* 1E8CF */, /*48272*/"MENDE KIKAKUI COMBINING NUMBER TEENS"/* 1E8D0 */,/*48273*/"MENDE KIKAKUI COMBINING NUMBER TENS"/* 1E8D1 */, /*48274*/"MENDE KIKAKUI COMBINING NUMBER HUNDREDS"/* 1E8D2 */, /*48275*/"MENDE KIKAKUI COMBINING NUMBER THOUSANDS"/* 1E8D3 */, /*48276*/"MENDE KIKAKUI COMBINING NUMBER TEN THOUSANDS"/* 1E8D4 */, /*48277*/"MENDE KIKAKUI COMBINING NUMBER HUNDRED THOUSANDS"/* 1E8D5 */, /*48278*/"MENDE KIKAKUI COMBINING NUMBER MILLIONS"/* 1E8D6 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,/*48320*/"ADLAM CAPITAL LETTER ALIF"/* 1E900 */, /*48321*/"ADLAM CAPITAL LETTER DAALI"/* 1E901 */,/*48322*/"ADLAM CAPITAL LETTER LAAM"/* 1E902 */, /*48323*/"ADLAM CAPITAL LETTER MIIM"/* 1E903 */,/*48324*/"ADLAM CAPITAL LETTER BA"/* 1E904 */, /*48325*/"ADLAM CAPITAL LETTER SINNYIIYHE"/* 1E905 */,/*48326*/"ADLAM CAPITAL LETTER PE"/* 1E906 */, /*48327*/"ADLAM CAPITAL LETTER BHE"/* 1E907 */,/*48328*/"ADLAM CAPITAL LETTER RA"/* 1E908 */, /*48329*/"ADLAM CAPITAL LETTER E"/* 1E909 */,/*48330*/"ADLAM CAPITAL LETTER FA"/* 1E90A */, /*48331*/"ADLAM CAPITAL LETTER I"/* 1E90B */,/*48332*/"ADLAM CAPITAL LETTER O"/* 1E90C */, /*48333*/"ADLAM CAPITAL LETTER DHA"/* 1E90D */,/*48334*/"ADLAM CAPITAL LETTER YHE"/* 1E90E */, /*48335*/"ADLAM CAPITAL LETTER WAW"/* 1E90F */,/*48336*/"ADLAM CAPITAL LETTER NUN"/* 1E910 */, /*48337*/"ADLAM CAPITAL LETTER KAF"/* 1E911 */,/*48338*/"ADLAM CAPITAL LETTER YA"/* 1E912 */, /*48339*/"ADLAM CAPITAL LETTER U"/* 1E913 */,/*48340*/"ADLAM CAPITAL LETTER JIIM"/* 1E914 */, /*48341*/"ADLAM CAPITAL LETTER CHI"/* 1E915 */,/*48342*/"ADLAM CAPITAL LETTER HA"/* 1E916 */, /*48343*/"ADLAM CAPITAL LETTER QAAF"/* 1E917 */,/*48344*/"ADLAM CAPITAL LETTER GA"/* 1E918 */, /*48345*/"ADLAM CAPITAL LETTER NYA"/* 1E919 */,/*48346*/"ADLAM CAPITAL LETTER TU"/* 1E91A */, /*48347*/"ADLAM CAPITAL LETTER NHA"/* 1E91B */,/*48348*/"ADLAM CAPITAL LETTER VA"/* 1E91C */, /*48349*/"ADLAM CAPITAL LETTER KHA"/* 1E91D */,/*48350*/"ADLAM CAPITAL LETTER GBE"/* 1E91E */, /*48351*/"ADLAM CAPITAL LETTER ZAL"/* 1E91F */,/*48352*/"ADLAM CAPITAL LETTER KPO"/* 1E920 */, /*48353*/"ADLAM CAPITAL LETTER SHA"/* 1E921 */,/*48354*/"ADLAM SMALL LETTER ALIF"/* 1E922 */, /*48355*/"ADLAM SMALL LETTER DAALI"/* 1E923 */,/*48356*/"ADLAM SMALL LETTER LAAM"/* 1E924 */, /*48357*/"ADLAM SMALL LETTER MIIM"/* 1E925 */,/*48358*/"ADLAM SMALL LETTER BA"/* 1E926 */, /*48359*/"ADLAM SMALL LETTER SINNYIIYHE"/* 1E927 */,/*48360*/"ADLAM SMALL LETTER PE"/* 1E928 */, /*48361*/"ADLAM SMALL LETTER BHE"/* 1E929 */,/*48362*/"ADLAM SMALL LETTER RA"/* 1E92A */, /*48363*/"ADLAM SMALL LETTER E"/* 1E92B */,/*48364*/"ADLAM SMALL LETTER FA"/* 1E92C */, /*48365*/"ADLAM SMALL LETTER I"/* 1E92D */,/*48366*/"ADLAM SMALL LETTER O"/* 1E92E */, /*48367*/"ADLAM SMALL LETTER DHA"/* 1E92F */,/*48368*/"ADLAM SMALL LETTER YHE"/* 1E930 */, /*48369*/"ADLAM SMALL LETTER WAW"/* 1E931 */,/*48370*/"ADLAM SMALL LETTER NUN"/* 1E932 */, /*48371*/"ADLAM SMALL LETTER KAF"/* 1E933 */,/*48372*/"ADLAM SMALL LETTER YA"/* 1E934 */, /*48373*/"ADLAM SMALL LETTER U"/* 1E935 */,/*48374*/"ADLAM SMALL LETTER JIIM"/* 1E936 */, /*48375*/"ADLAM SMALL LETTER CHI"/* 1E937 */,/*48376*/"ADLAM SMALL LETTER HA"/* 1E938 */, /*48377*/"ADLAM SMALL LETTER QAAF"/* 1E939 */,/*48378*/"ADLAM SMALL LETTER GA"/* 1E93A */, /*48379*/"ADLAM SMALL LETTER NYA"/* 1E93B */,/*48380*/"ADLAM SMALL LETTER TU"/* 1E93C */, /*48381*/"ADLAM SMALL LETTER NHA"/* 1E93D */,/*48382*/"ADLAM SMALL LETTER VA"/* 1E93E */, /*48383*/"ADLAM SMALL LETTER KHA"/* 1E93F */,/*48384*/"ADLAM SMALL LETTER GBE"/* 1E940 */, /*48385*/"ADLAM SMALL LETTER ZAL"/* 1E941 */,/*48386*/"ADLAM SMALL LETTER KPO"/* 1E942 */, /*48387*/"ADLAM SMALL LETTER SHA"/* 1E943 */,/*48388*/"ADLAM ALIF LENGTHENER"/* 1E944 */, /*48389*/"ADLAM VOWEL LENGTHENER"/* 1E945 */,/*48390*/"ADLAM GEMINATION MARK"/* 1E946 */, /*48391*/"ADLAM HAMZA"/* 1E947 */,/*48392*/"ADLAM CONSONANT MODIFIER"/* 1E948 */, /*48393*/"ADLAM GEMINATE CONSONANT MODIFIER"/* 1E949 */,/*48394*/"ADLAM NUKTA"/* 1E94A */,NULL,NULL,NULL,NULL,NULL, /*48400*/"ADLAM DIGIT ZERO"/* 1E950 */,/*48401*/"ADLAM DIGIT ONE"/* 1E951 */,/*48402*/"ADLAM DIGIT TWO"/* 1E952 */, /*48403*/"ADLAM DIGIT THREE"/* 1E953 */,/*48404*/"ADLAM DIGIT FOUR"/* 1E954 */,/*48405*/"ADLAM DIGIT FIVE"/* 1E955 */, /*48406*/"ADLAM DIGIT SIX"/* 1E956 */,/*48407*/"ADLAM DIGIT SEVEN"/* 1E957 */,/*48408*/"ADLAM DIGIT EIGHT"/* 1E958 */, /*48409*/"ADLAM DIGIT NINE"/* 1E959 */,NULL,NULL,NULL,NULL,/*48414*/"ADLAM INITIAL EXCLAMATION MARK"/* 1E95E */, /*48415*/"ADLAM INITIAL QUESTION MARK"/* 1E95F */,/*48416*/"ARABIC MATHEMATICAL ALEF"/* 1EE00 */, /*48417*/"ARABIC MATHEMATICAL BEH"/* 1EE01 */,/*48418*/"ARABIC MATHEMATICAL JEEM"/* 1EE02 */, /*48419*/"ARABIC MATHEMATICAL DAL"/* 1EE03 */,NULL,/*48421*/"ARABIC MATHEMATICAL WAW"/* 1EE05 */, /*48422*/"ARABIC MATHEMATICAL ZAIN"/* 1EE06 */,/*48423*/"ARABIC MATHEMATICAL HAH"/* 1EE07 */, /*48424*/"ARABIC MATHEMATICAL TAH"/* 1EE08 */,/*48425*/"ARABIC MATHEMATICAL YEH"/* 1EE09 */, /*48426*/"ARABIC MATHEMATICAL KAF"/* 1EE0A */,/*48427*/"ARABIC MATHEMATICAL LAM"/* 1EE0B */, /*48428*/"ARABIC MATHEMATICAL MEEM"/* 1EE0C */,/*48429*/"ARABIC MATHEMATICAL NOON"/* 1EE0D */, /*48430*/"ARABIC MATHEMATICAL SEEN"/* 1EE0E */,/*48431*/"ARABIC MATHEMATICAL AIN"/* 1EE0F */, /*48432*/"ARABIC MATHEMATICAL FEH"/* 1EE10 */,/*48433*/"ARABIC MATHEMATICAL SAD"/* 1EE11 */, /*48434*/"ARABIC MATHEMATICAL QAF"/* 1EE12 */,/*48435*/"ARABIC MATHEMATICAL REH"/* 1EE13 */, /*48436*/"ARABIC MATHEMATICAL SHEEN"/* 1EE14 */,/*48437*/"ARABIC MATHEMATICAL TEH"/* 1EE15 */, /*48438*/"ARABIC MATHEMATICAL THEH"/* 1EE16 */,/*48439*/"ARABIC MATHEMATICAL KHAH"/* 1EE17 */, /*48440*/"ARABIC MATHEMATICAL THAL"/* 1EE18 */,/*48441*/"ARABIC MATHEMATICAL DAD"/* 1EE19 */, /*48442*/"ARABIC MATHEMATICAL ZAH"/* 1EE1A */,/*48443*/"ARABIC MATHEMATICAL GHAIN"/* 1EE1B */, /*48444*/"ARABIC MATHEMATICAL DOTLESS BEH"/* 1EE1C */,/*48445*/"ARABIC MATHEMATICAL DOTLESS NOON"/* 1EE1D */, /*48446*/"ARABIC MATHEMATICAL DOTLESS FEH"/* 1EE1E */,/*48447*/"ARABIC MATHEMATICAL DOTLESS QAF"/* 1EE1F */,NULL, /*48449*/"ARABIC MATHEMATICAL INITIAL BEH"/* 1EE21 */,/*48450*/"ARABIC MATHEMATICAL INITIAL JEEM"/* 1EE22 */,NULL, /*48452*/"ARABIC MATHEMATICAL INITIAL HEH"/* 1EE24 */,NULL,NULL,/*48455*/"ARABIC MATHEMATICAL INITIAL HAH"/* 1EE27 */, NULL,/*48457*/"ARABIC MATHEMATICAL INITIAL YEH"/* 1EE29 */,/*48458*/"ARABIC MATHEMATICAL INITIAL KAF"/* 1EE2A */, /*48459*/"ARABIC MATHEMATICAL INITIAL LAM"/* 1EE2B */,/*48460*/"ARABIC MATHEMATICAL INITIAL MEEM"/* 1EE2C */, /*48461*/"ARABIC MATHEMATICAL INITIAL NOON"/* 1EE2D */,/*48462*/"ARABIC MATHEMATICAL INITIAL SEEN"/* 1EE2E */, /*48463*/"ARABIC MATHEMATICAL INITIAL AIN"/* 1EE2F */,/*48464*/"ARABIC MATHEMATICAL INITIAL FEH"/* 1EE30 */, /*48465*/"ARABIC MATHEMATICAL INITIAL SAD"/* 1EE31 */,/*48466*/"ARABIC MATHEMATICAL INITIAL QAF"/* 1EE32 */,NULL, /*48468*/"ARABIC MATHEMATICAL INITIAL SHEEN"/* 1EE34 */,/*48469*/"ARABIC MATHEMATICAL INITIAL TEH"/* 1EE35 */, /*48470*/"ARABIC MATHEMATICAL INITIAL THEH"/* 1EE36 */,/*48471*/"ARABIC MATHEMATICAL INITIAL KHAH"/* 1EE37 */,NULL, /*48473*/"ARABIC MATHEMATICAL INITIAL DAD"/* 1EE39 */,NULL,/*48475*/"ARABIC MATHEMATICAL INITIAL GHAIN"/* 1EE3B */,NULL, NULL,NULL,NULL,NULL,NULL,/*48482*/"ARABIC MATHEMATICAL TAILED JEEM"/* 1EE42 */,NULL,NULL,NULL,NULL, /*48487*/"ARABIC MATHEMATICAL TAILED HAH"/* 1EE47 */,NULL,/*48489*/"ARABIC MATHEMATICAL TAILED YEH"/* 1EE49 */,NULL, /*48491*/"ARABIC MATHEMATICAL TAILED LAM"/* 1EE4B */,NULL,/*48493*/"ARABIC MATHEMATICAL TAILED NOON"/* 1EE4D */, /*48494*/"ARABIC MATHEMATICAL TAILED SEEN"/* 1EE4E */,/*48495*/"ARABIC MATHEMATICAL TAILED AIN"/* 1EE4F */,NULL, /*48497*/"ARABIC MATHEMATICAL TAILED SAD"/* 1EE51 */,/*48498*/"ARABIC MATHEMATICAL TAILED QAF"/* 1EE52 */,NULL, /*48500*/"ARABIC MATHEMATICAL TAILED SHEEN"/* 1EE54 */,NULL,NULL,/*48503*/"ARABIC MATHEMATICAL TAILED KHAH"/* 1EE57 */, NULL,/*48505*/"ARABIC MATHEMATICAL TAILED DAD"/* 1EE59 */,NULL,/*48507*/"ARABIC MATHEMATICAL TAILED GHAIN"/* 1EE5B */, NULL,/*48509*/"ARABIC MATHEMATICAL TAILED DOTLESS NOON"/* 1EE5D */,NULL, /*48511*/"ARABIC MATHEMATICAL TAILED DOTLESS QAF"/* 1EE5F */,NULL, /*48513*/"ARABIC MATHEMATICAL STRETCHED BEH"/* 1EE61 */,/*48514*/"ARABIC MATHEMATICAL STRETCHED JEEM"/* 1EE62 */,NULL, /*48516*/"ARABIC MATHEMATICAL STRETCHED HEH"/* 1EE64 */,NULL,NULL, /*48519*/"ARABIC MATHEMATICAL STRETCHED HAH"/* 1EE67 */,/*48520*/"ARABIC MATHEMATICAL STRETCHED TAH"/* 1EE68 */, /*48521*/"ARABIC MATHEMATICAL STRETCHED YEH"/* 1EE69 */,/*48522*/"ARABIC MATHEMATICAL STRETCHED KAF"/* 1EE6A */,NULL, /*48524*/"ARABIC MATHEMATICAL STRETCHED MEEM"/* 1EE6C */,/*48525*/"ARABIC MATHEMATICAL STRETCHED NOON"/* 1EE6D */, /*48526*/"ARABIC MATHEMATICAL STRETCHED SEEN"/* 1EE6E */,/*48527*/"ARABIC MATHEMATICAL STRETCHED AIN"/* 1EE6F */, /*48528*/"ARABIC MATHEMATICAL STRETCHED FEH"/* 1EE70 */,/*48529*/"ARABIC MATHEMATICAL STRETCHED SAD"/* 1EE71 */, /*48530*/"ARABIC MATHEMATICAL STRETCHED QAF"/* 1EE72 */,NULL,/*48532*/"ARABIC MATHEMATICAL STRETCHED SHEEN"/* 1EE74 */, /*48533*/"ARABIC MATHEMATICAL STRETCHED TEH"/* 1EE75 */,/*48534*/"ARABIC MATHEMATICAL STRETCHED THEH"/* 1EE76 */, /*48535*/"ARABIC MATHEMATICAL STRETCHED KHAH"/* 1EE77 */,NULL,/*48537*/"ARABIC MATHEMATICAL STRETCHED DAD"/* 1EE79 */, /*48538*/"ARABIC MATHEMATICAL STRETCHED ZAH"/* 1EE7A */,/*48539*/"ARABIC MATHEMATICAL STRETCHED GHAIN"/* 1EE7B */, /*48540*/"ARABIC MATHEMATICAL STRETCHED DOTLESS BEH"/* 1EE7C */,NULL, /*48542*/"ARABIC MATHEMATICAL STRETCHED DOTLESS FEH"/* 1EE7E */,NULL, /*48544*/"ARABIC MATHEMATICAL LOOPED ALEF"/* 1EE80 */,/*48545*/"ARABIC MATHEMATICAL LOOPED BEH"/* 1EE81 */, /*48546*/"ARABIC MATHEMATICAL LOOPED JEEM"/* 1EE82 */,/*48547*/"ARABIC MATHEMATICAL LOOPED DAL"/* 1EE83 */, /*48548*/"ARABIC MATHEMATICAL LOOPED HEH"/* 1EE84 */,/*48549*/"ARABIC MATHEMATICAL LOOPED WAW"/* 1EE85 */, /*48550*/"ARABIC MATHEMATICAL LOOPED ZAIN"/* 1EE86 */,/*48551*/"ARABIC MATHEMATICAL LOOPED HAH"/* 1EE87 */, /*48552*/"ARABIC MATHEMATICAL LOOPED TAH"/* 1EE88 */,/*48553*/"ARABIC MATHEMATICAL LOOPED YEH"/* 1EE89 */,NULL, /*48555*/"ARABIC MATHEMATICAL LOOPED LAM"/* 1EE8B */,/*48556*/"ARABIC MATHEMATICAL LOOPED MEEM"/* 1EE8C */, /*48557*/"ARABIC MATHEMATICAL LOOPED NOON"/* 1EE8D */,/*48558*/"ARABIC MATHEMATICAL LOOPED SEEN"/* 1EE8E */, /*48559*/"ARABIC MATHEMATICAL LOOPED AIN"/* 1EE8F */,/*48560*/"ARABIC MATHEMATICAL LOOPED FEH"/* 1EE90 */, /*48561*/"ARABIC MATHEMATICAL LOOPED SAD"/* 1EE91 */,/*48562*/"ARABIC MATHEMATICAL LOOPED QAF"/* 1EE92 */, /*48563*/"ARABIC MATHEMATICAL LOOPED REH"/* 1EE93 */,/*48564*/"ARABIC MATHEMATICAL LOOPED SHEEN"/* 1EE94 */, /*48565*/"ARABIC MATHEMATICAL LOOPED TEH"/* 1EE95 */,/*48566*/"ARABIC MATHEMATICAL LOOPED THEH"/* 1EE96 */, /*48567*/"ARABIC MATHEMATICAL LOOPED KHAH"/* 1EE97 */,/*48568*/"ARABIC MATHEMATICAL LOOPED THAL"/* 1EE98 */, /*48569*/"ARABIC MATHEMATICAL LOOPED DAD"/* 1EE99 */,/*48570*/"ARABIC MATHEMATICAL LOOPED ZAH"/* 1EE9A */, /*48571*/"ARABIC MATHEMATICAL LOOPED GHAIN"/* 1EE9B */,NULL,NULL,NULL,NULL,NULL, /*48577*/"ARABIC MATHEMATICAL DOUBLE-STRUCK BEH"/* 1EEA1 */,/*48578*/"ARABIC MATHEMATICAL DOUBLE-STRUCK JEEM"/* 1EEA2 */, /*48579*/"ARABIC MATHEMATICAL DOUBLE-STRUCK DAL"/* 1EEA3 */,NULL, /*48581*/"ARABIC MATHEMATICAL DOUBLE-STRUCK WAW"/* 1EEA5 */,/*48582*/"ARABIC MATHEMATICAL DOUBLE-STRUCK ZAIN"/* 1EEA6 */, /*48583*/"ARABIC MATHEMATICAL DOUBLE-STRUCK HAH"/* 1EEA7 */,/*48584*/"ARABIC MATHEMATICAL DOUBLE-STRUCK TAH"/* 1EEA8 */, /*48585*/"ARABIC MATHEMATICAL DOUBLE-STRUCK YEH"/* 1EEA9 */,NULL, /*48587*/"ARABIC MATHEMATICAL DOUBLE-STRUCK LAM"/* 1EEAB */,/*48588*/"ARABIC MATHEMATICAL DOUBLE-STRUCK MEEM"/* 1EEAC */, /*48589*/"ARABIC MATHEMATICAL DOUBLE-STRUCK NOON"/* 1EEAD */, /*48590*/"ARABIC MATHEMATICAL DOUBLE-STRUCK SEEN"/* 1EEAE */,/*48591*/"ARABIC MATHEMATICAL DOUBLE-STRUCK AIN"/* 1EEAF */, /*48592*/"ARABIC MATHEMATICAL DOUBLE-STRUCK FEH"/* 1EEB0 */,/*48593*/"ARABIC MATHEMATICAL DOUBLE-STRUCK SAD"/* 1EEB1 */, /*48594*/"ARABIC MATHEMATICAL DOUBLE-STRUCK QAF"/* 1EEB2 */,/*48595*/"ARABIC MATHEMATICAL DOUBLE-STRUCK REH"/* 1EEB3 */, /*48596*/"ARABIC MATHEMATICAL DOUBLE-STRUCK SHEEN"/* 1EEB4 */, /*48597*/"ARABIC MATHEMATICAL DOUBLE-STRUCK TEH"/* 1EEB5 */,/*48598*/"ARABIC MATHEMATICAL DOUBLE-STRUCK THEH"/* 1EEB6 */, /*48599*/"ARABIC MATHEMATICAL DOUBLE-STRUCK KHAH"/* 1EEB7 */, /*48600*/"ARABIC MATHEMATICAL DOUBLE-STRUCK THAL"/* 1EEB8 */,/*48601*/"ARABIC MATHEMATICAL DOUBLE-STRUCK DAD"/* 1EEB9 */, /*48602*/"ARABIC MATHEMATICAL DOUBLE-STRUCK ZAH"/* 1EEBA */, /*48603*/"ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN"/* 1EEBB */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*48656*/"ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL"/* 1EEF0 */, /*48657*/"ARABIC MATHEMATICAL OPERATOR HAH WITH DAL"/* 1EEF1 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*48928*/"MAHJONG TILE EAST WIND"/* 1F000 */,/*48929*/"MAHJONG TILE SOUTH WIND"/* 1F001 */, /*48930*/"MAHJONG TILE WEST WIND"/* 1F002 */,/*48931*/"MAHJONG TILE NORTH WIND"/* 1F003 */, /*48932*/"MAHJONG TILE RED DRAGON"/* 1F004 */,/*48933*/"MAHJONG TILE GREEN DRAGON"/* 1F005 */, /*48934*/"MAHJONG TILE WHITE DRAGON"/* 1F006 */,/*48935*/"MAHJONG TILE ONE OF CHARACTERS"/* 1F007 */, /*48936*/"MAHJONG TILE TWO OF CHARACTERS"/* 1F008 */,/*48937*/"MAHJONG TILE THREE OF CHARACTERS"/* 1F009 */, /*48938*/"MAHJONG TILE FOUR OF CHARACTERS"/* 1F00A */,/*48939*/"MAHJONG TILE FIVE OF CHARACTERS"/* 1F00B */, /*48940*/"MAHJONG TILE SIX OF CHARACTERS"/* 1F00C */,/*48941*/"MAHJONG TILE SEVEN OF CHARACTERS"/* 1F00D */, /*48942*/"MAHJONG TILE EIGHT OF CHARACTERS"/* 1F00E */,/*48943*/"MAHJONG TILE NINE OF CHARACTERS"/* 1F00F */, /*48944*/"MAHJONG TILE ONE OF BAMBOOS"/* 1F010 */,/*48945*/"MAHJONG TILE TWO OF BAMBOOS"/* 1F011 */, /*48946*/"MAHJONG TILE THREE OF BAMBOOS"/* 1F012 */,/*48947*/"MAHJONG TILE FOUR OF BAMBOOS"/* 1F013 */, /*48948*/"MAHJONG TILE FIVE OF BAMBOOS"/* 1F014 */,/*48949*/"MAHJONG TILE SIX OF BAMBOOS"/* 1F015 */, /*48950*/"MAHJONG TILE SEVEN OF BAMBOOS"/* 1F016 */,/*48951*/"MAHJONG TILE EIGHT OF BAMBOOS"/* 1F017 */, /*48952*/"MAHJONG TILE NINE OF BAMBOOS"/* 1F018 */,/*48953*/"MAHJONG TILE ONE OF CIRCLES"/* 1F019 */, /*48954*/"MAHJONG TILE TWO OF CIRCLES"/* 1F01A */,/*48955*/"MAHJONG TILE THREE OF CIRCLES"/* 1F01B */, /*48956*/"MAHJONG TILE FOUR OF CIRCLES"/* 1F01C */,/*48957*/"MAHJONG TILE FIVE OF CIRCLES"/* 1F01D */, /*48958*/"MAHJONG TILE SIX OF CIRCLES"/* 1F01E */,/*48959*/"MAHJONG TILE SEVEN OF CIRCLES"/* 1F01F */, /*48960*/"MAHJONG TILE EIGHT OF CIRCLES"/* 1F020 */,/*48961*/"MAHJONG TILE NINE OF CIRCLES"/* 1F021 */, /*48962*/"MAHJONG TILE PLUM"/* 1F022 */,/*48963*/"MAHJONG TILE ORCHID"/* 1F023 */, /*48964*/"MAHJONG TILE BAMBOO"/* 1F024 */,/*48965*/"MAHJONG TILE CHRYSANTHEMUM"/* 1F025 */, /*48966*/"MAHJONG TILE SPRING"/* 1F026 */,/*48967*/"MAHJONG TILE SUMMER"/* 1F027 */, /*48968*/"MAHJONG TILE AUTUMN"/* 1F028 */,/*48969*/"MAHJONG TILE WINTER"/* 1F029 */, /*48970*/"MAHJONG TILE JOKER"/* 1F02A */,/*48971*/"MAHJONG TILE BACK"/* 1F02B */,NULL,NULL,NULL,NULL, /*48976*/"DOMINO TILE HORIZONTAL BACK"/* 1F030 */,/*48977*/"DOMINO TILE HORIZONTAL-00-00"/* 1F031 */, /*48978*/"DOMINO TILE HORIZONTAL-00-01"/* 1F032 */,/*48979*/"DOMINO TILE HORIZONTAL-00-02"/* 1F033 */, /*48980*/"DOMINO TILE HORIZONTAL-00-03"/* 1F034 */,/*48981*/"DOMINO TILE HORIZONTAL-00-04"/* 1F035 */, /*48982*/"DOMINO TILE HORIZONTAL-00-05"/* 1F036 */,/*48983*/"DOMINO TILE HORIZONTAL-00-06"/* 1F037 */, /*48984*/"DOMINO TILE HORIZONTAL-01-00"/* 1F038 */,/*48985*/"DOMINO TILE HORIZONTAL-01-01"/* 1F039 */, /*48986*/"DOMINO TILE HORIZONTAL-01-02"/* 1F03A */,/*48987*/"DOMINO TILE HORIZONTAL-01-03"/* 1F03B */, /*48988*/"DOMINO TILE HORIZONTAL-01-04"/* 1F03C */,/*48989*/"DOMINO TILE HORIZONTAL-01-05"/* 1F03D */, /*48990*/"DOMINO TILE HORIZONTAL-01-06"/* 1F03E */,/*48991*/"DOMINO TILE HORIZONTAL-02-00"/* 1F03F */, /*48992*/"DOMINO TILE HORIZONTAL-02-01"/* 1F040 */,/*48993*/"DOMINO TILE HORIZONTAL-02-02"/* 1F041 */, /*48994*/"DOMINO TILE HORIZONTAL-02-03"/* 1F042 */,/*48995*/"DOMINO TILE HORIZONTAL-02-04"/* 1F043 */, /*48996*/"DOMINO TILE HORIZONTAL-02-05"/* 1F044 */,/*48997*/"DOMINO TILE HORIZONTAL-02-06"/* 1F045 */, /*48998*/"DOMINO TILE HORIZONTAL-03-00"/* 1F046 */,/*48999*/"DOMINO TILE HORIZONTAL-03-01"/* 1F047 */, /*49000*/"DOMINO TILE HORIZONTAL-03-02"/* 1F048 */,/*49001*/"DOMINO TILE HORIZONTAL-03-03"/* 1F049 */, /*49002*/"DOMINO TILE HORIZONTAL-03-04"/* 1F04A */,/*49003*/"DOMINO TILE HORIZONTAL-03-05"/* 1F04B */, /*49004*/"DOMINO TILE HORIZONTAL-03-06"/* 1F04C */,/*49005*/"DOMINO TILE HORIZONTAL-04-00"/* 1F04D */, /*49006*/"DOMINO TILE HORIZONTAL-04-01"/* 1F04E */,/*49007*/"DOMINO TILE HORIZONTAL-04-02"/* 1F04F */, /*49008*/"DOMINO TILE HORIZONTAL-04-03"/* 1F050 */,/*49009*/"DOMINO TILE HORIZONTAL-04-04"/* 1F051 */, /*49010*/"DOMINO TILE HORIZONTAL-04-05"/* 1F052 */,/*49011*/"DOMINO TILE HORIZONTAL-04-06"/* 1F053 */, /*49012*/"DOMINO TILE HORIZONTAL-05-00"/* 1F054 */,/*49013*/"DOMINO TILE HORIZONTAL-05-01"/* 1F055 */, /*49014*/"DOMINO TILE HORIZONTAL-05-02"/* 1F056 */,/*49015*/"DOMINO TILE HORIZONTAL-05-03"/* 1F057 */, /*49016*/"DOMINO TILE HORIZONTAL-05-04"/* 1F058 */,/*49017*/"DOMINO TILE HORIZONTAL-05-05"/* 1F059 */, /*49018*/"DOMINO TILE HORIZONTAL-05-06"/* 1F05A */,/*49019*/"DOMINO TILE HORIZONTAL-06-00"/* 1F05B */, /*49020*/"DOMINO TILE HORIZONTAL-06-01"/* 1F05C */,/*49021*/"DOMINO TILE HORIZONTAL-06-02"/* 1F05D */, /*49022*/"DOMINO TILE HORIZONTAL-06-03"/* 1F05E */,/*49023*/"DOMINO TILE HORIZONTAL-06-04"/* 1F05F */, /*49024*/"DOMINO TILE HORIZONTAL-06-05"/* 1F060 */,/*49025*/"DOMINO TILE HORIZONTAL-06-06"/* 1F061 */, /*49026*/"DOMINO TILE VERTICAL BACK"/* 1F062 */,/*49027*/"DOMINO TILE VERTICAL-00-00"/* 1F063 */, /*49028*/"DOMINO TILE VERTICAL-00-01"/* 1F064 */,/*49029*/"DOMINO TILE VERTICAL-00-02"/* 1F065 */, /*49030*/"DOMINO TILE VERTICAL-00-03"/* 1F066 */,/*49031*/"DOMINO TILE VERTICAL-00-04"/* 1F067 */, /*49032*/"DOMINO TILE VERTICAL-00-05"/* 1F068 */,/*49033*/"DOMINO TILE VERTICAL-00-06"/* 1F069 */, /*49034*/"DOMINO TILE VERTICAL-01-00"/* 1F06A */,/*49035*/"DOMINO TILE VERTICAL-01-01"/* 1F06B */, /*49036*/"DOMINO TILE VERTICAL-01-02"/* 1F06C */,/*49037*/"DOMINO TILE VERTICAL-01-03"/* 1F06D */, /*49038*/"DOMINO TILE VERTICAL-01-04"/* 1F06E */,/*49039*/"DOMINO TILE VERTICAL-01-05"/* 1F06F */, /*49040*/"DOMINO TILE VERTICAL-01-06"/* 1F070 */,/*49041*/"DOMINO TILE VERTICAL-02-00"/* 1F071 */, /*49042*/"DOMINO TILE VERTICAL-02-01"/* 1F072 */,/*49043*/"DOMINO TILE VERTICAL-02-02"/* 1F073 */, /*49044*/"DOMINO TILE VERTICAL-02-03"/* 1F074 */,/*49045*/"DOMINO TILE VERTICAL-02-04"/* 1F075 */, /*49046*/"DOMINO TILE VERTICAL-02-05"/* 1F076 */,/*49047*/"DOMINO TILE VERTICAL-02-06"/* 1F077 */, /*49048*/"DOMINO TILE VERTICAL-03-00"/* 1F078 */,/*49049*/"DOMINO TILE VERTICAL-03-01"/* 1F079 */, /*49050*/"DOMINO TILE VERTICAL-03-02"/* 1F07A */,/*49051*/"DOMINO TILE VERTICAL-03-03"/* 1F07B */, /*49052*/"DOMINO TILE VERTICAL-03-04"/* 1F07C */,/*49053*/"DOMINO TILE VERTICAL-03-05"/* 1F07D */, /*49054*/"DOMINO TILE VERTICAL-03-06"/* 1F07E */,/*49055*/"DOMINO TILE VERTICAL-04-00"/* 1F07F */, /*49056*/"DOMINO TILE VERTICAL-04-01"/* 1F080 */,/*49057*/"DOMINO TILE VERTICAL-04-02"/* 1F081 */, /*49058*/"DOMINO TILE VERTICAL-04-03"/* 1F082 */,/*49059*/"DOMINO TILE VERTICAL-04-04"/* 1F083 */, /*49060*/"DOMINO TILE VERTICAL-04-05"/* 1F084 */,/*49061*/"DOMINO TILE VERTICAL-04-06"/* 1F085 */, /*49062*/"DOMINO TILE VERTICAL-05-00"/* 1F086 */,/*49063*/"DOMINO TILE VERTICAL-05-01"/* 1F087 */, /*49064*/"DOMINO TILE VERTICAL-05-02"/* 1F088 */,/*49065*/"DOMINO TILE VERTICAL-05-03"/* 1F089 */, /*49066*/"DOMINO TILE VERTICAL-05-04"/* 1F08A */,/*49067*/"DOMINO TILE VERTICAL-05-05"/* 1F08B */, /*49068*/"DOMINO TILE VERTICAL-05-06"/* 1F08C */,/*49069*/"DOMINO TILE VERTICAL-06-00"/* 1F08D */, /*49070*/"DOMINO TILE VERTICAL-06-01"/* 1F08E */,/*49071*/"DOMINO TILE VERTICAL-06-02"/* 1F08F */, /*49072*/"DOMINO TILE VERTICAL-06-03"/* 1F090 */,/*49073*/"DOMINO TILE VERTICAL-06-04"/* 1F091 */, /*49074*/"DOMINO TILE VERTICAL-06-05"/* 1F092 */,/*49075*/"DOMINO TILE VERTICAL-06-06"/* 1F093 */,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*49088*/"PLAYING CARD BACK"/* 1F0A0 */, /*49089*/"PLAYING CARD ACE OF SPADES"/* 1F0A1 */,/*49090*/"PLAYING CARD TWO OF SPADES"/* 1F0A2 */, /*49091*/"PLAYING CARD THREE OF SPADES"/* 1F0A3 */,/*49092*/"PLAYING CARD FOUR OF SPADES"/* 1F0A4 */, /*49093*/"PLAYING CARD FIVE OF SPADES"/* 1F0A5 */,/*49094*/"PLAYING CARD SIX OF SPADES"/* 1F0A6 */, /*49095*/"PLAYING CARD SEVEN OF SPADES"/* 1F0A7 */,/*49096*/"PLAYING CARD EIGHT OF SPADES"/* 1F0A8 */, /*49097*/"PLAYING CARD NINE OF SPADES"/* 1F0A9 */,/*49098*/"PLAYING CARD TEN OF SPADES"/* 1F0AA */, /*49099*/"PLAYING CARD JACK OF SPADES"/* 1F0AB */,/*49100*/"PLAYING CARD KNIGHT OF SPADES"/* 1F0AC */, /*49101*/"PLAYING CARD QUEEN OF SPADES"/* 1F0AD */,/*49102*/"PLAYING CARD KING OF SPADES"/* 1F0AE */,NULL,NULL, /*49105*/"PLAYING CARD ACE OF HEARTS"/* 1F0B1 */,/*49106*/"PLAYING CARD TWO OF HEARTS"/* 1F0B2 */, /*49107*/"PLAYING CARD THREE OF HEARTS"/* 1F0B3 */,/*49108*/"PLAYING CARD FOUR OF HEARTS"/* 1F0B4 */, /*49109*/"PLAYING CARD FIVE OF HEARTS"/* 1F0B5 */,/*49110*/"PLAYING CARD SIX OF HEARTS"/* 1F0B6 */, /*49111*/"PLAYING CARD SEVEN OF HEARTS"/* 1F0B7 */,/*49112*/"PLAYING CARD EIGHT OF HEARTS"/* 1F0B8 */, /*49113*/"PLAYING CARD NINE OF HEARTS"/* 1F0B9 */,/*49114*/"PLAYING CARD TEN OF HEARTS"/* 1F0BA */, /*49115*/"PLAYING CARD JACK OF HEARTS"/* 1F0BB */,/*49116*/"PLAYING CARD KNIGHT OF HEARTS"/* 1F0BC */, /*49117*/"PLAYING CARD QUEEN OF HEARTS"/* 1F0BD */,/*49118*/"PLAYING CARD KING OF HEARTS"/* 1F0BE */, /*49119*/"PLAYING CARD RED JOKER"/* 1F0BF */,NULL,/*49121*/"PLAYING CARD ACE OF DIAMONDS"/* 1F0C1 */, /*49122*/"PLAYING CARD TWO OF DIAMONDS"/* 1F0C2 */,/*49123*/"PLAYING CARD THREE OF DIAMONDS"/* 1F0C3 */, /*49124*/"PLAYING CARD FOUR OF DIAMONDS"/* 1F0C4 */,/*49125*/"PLAYING CARD FIVE OF DIAMONDS"/* 1F0C5 */, /*49126*/"PLAYING CARD SIX OF DIAMONDS"/* 1F0C6 */,/*49127*/"PLAYING CARD SEVEN OF DIAMONDS"/* 1F0C7 */, /*49128*/"PLAYING CARD EIGHT OF DIAMONDS"/* 1F0C8 */,/*49129*/"PLAYING CARD NINE OF DIAMONDS"/* 1F0C9 */, /*49130*/"PLAYING CARD TEN OF DIAMONDS"/* 1F0CA */,/*49131*/"PLAYING CARD JACK OF DIAMONDS"/* 1F0CB */, /*49132*/"PLAYING CARD KNIGHT OF DIAMONDS"/* 1F0CC */,/*49133*/"PLAYING CARD QUEEN OF DIAMONDS"/* 1F0CD */, /*49134*/"PLAYING CARD KING OF DIAMONDS"/* 1F0CE */,/*49135*/"PLAYING CARD BLACK JOKER"/* 1F0CF */,NULL, /*49137*/"PLAYING CARD ACE OF CLUBS"/* 1F0D1 */,/*49138*/"PLAYING CARD TWO OF CLUBS"/* 1F0D2 */, /*49139*/"PLAYING CARD THREE OF CLUBS"/* 1F0D3 */,/*49140*/"PLAYING CARD FOUR OF CLUBS"/* 1F0D4 */, /*49141*/"PLAYING CARD FIVE OF CLUBS"/* 1F0D5 */,/*49142*/"PLAYING CARD SIX OF CLUBS"/* 1F0D6 */, /*49143*/"PLAYING CARD SEVEN OF CLUBS"/* 1F0D7 */,/*49144*/"PLAYING CARD EIGHT OF CLUBS"/* 1F0D8 */, /*49145*/"PLAYING CARD NINE OF CLUBS"/* 1F0D9 */,/*49146*/"PLAYING CARD TEN OF CLUBS"/* 1F0DA */, /*49147*/"PLAYING CARD JACK OF CLUBS"/* 1F0DB */,/*49148*/"PLAYING CARD KNIGHT OF CLUBS"/* 1F0DC */, /*49149*/"PLAYING CARD QUEEN OF CLUBS"/* 1F0DD */,/*49150*/"PLAYING CARD KING OF CLUBS"/* 1F0DE */, /*49151*/"PLAYING CARD WHITE JOKER"/* 1F0DF */,/*49152*/"PLAYING CARD FOOL"/* 1F0E0 */, /*49153*/"PLAYING CARD TRUMP-1"/* 1F0E1 */,/*49154*/"PLAYING CARD TRUMP-2"/* 1F0E2 */, /*49155*/"PLAYING CARD TRUMP-3"/* 1F0E3 */,/*49156*/"PLAYING CARD TRUMP-4"/* 1F0E4 */, /*49157*/"PLAYING CARD TRUMP-5"/* 1F0E5 */,/*49158*/"PLAYING CARD TRUMP-6"/* 1F0E6 */, /*49159*/"PLAYING CARD TRUMP-7"/* 1F0E7 */,/*49160*/"PLAYING CARD TRUMP-8"/* 1F0E8 */, /*49161*/"PLAYING CARD TRUMP-9"/* 1F0E9 */,/*49162*/"PLAYING CARD TRUMP-10"/* 1F0EA */, /*49163*/"PLAYING CARD TRUMP-11"/* 1F0EB */,/*49164*/"PLAYING CARD TRUMP-12"/* 1F0EC */, /*49165*/"PLAYING CARD TRUMP-13"/* 1F0ED */,/*49166*/"PLAYING CARD TRUMP-14"/* 1F0EE */, /*49167*/"PLAYING CARD TRUMP-15"/* 1F0EF */,/*49168*/"PLAYING CARD TRUMP-16"/* 1F0F0 */, /*49169*/"PLAYING CARD TRUMP-17"/* 1F0F1 */,/*49170*/"PLAYING CARD TRUMP-18"/* 1F0F2 */, /*49171*/"PLAYING CARD TRUMP-19"/* 1F0F3 */,/*49172*/"PLAYING CARD TRUMP-20"/* 1F0F4 */, /*49173*/"PLAYING CARD TRUMP-21"/* 1F0F5 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*49184*/"DIGIT ZERO FULL STOP"/* 1F100 */,/*49185*/"DIGIT ZERO COMMA"/* 1F101 */,/*49186*/"DIGIT ONE COMMA"/* 1F102 */, /*49187*/"DIGIT TWO COMMA"/* 1F103 */,/*49188*/"DIGIT THREE COMMA"/* 1F104 */,/*49189*/"DIGIT FOUR COMMA"/* 1F105 */, /*49190*/"DIGIT FIVE COMMA"/* 1F106 */,/*49191*/"DIGIT SIX COMMA"/* 1F107 */,/*49192*/"DIGIT SEVEN COMMA"/* 1F108 */, /*49193*/"DIGIT EIGHT COMMA"/* 1F109 */,/*49194*/"DIGIT NINE COMMA"/* 1F10A */, /*49195*/"DINGBAT CIRCLED SANS-SERIF DIGIT ZERO"/* 1F10B */, /*49196*/"DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO"/* 1F10C */,NULL,NULL,NULL, /*49200*/"PARENTHESIZED LATIN CAPITAL LETTER A"/* 1F110 */,/*49201*/"PARENTHESIZED LATIN CAPITAL LETTER B"/* 1F111 */, /*49202*/"PARENTHESIZED LATIN CAPITAL LETTER C"/* 1F112 */,/*49203*/"PARENTHESIZED LATIN CAPITAL LETTER D"/* 1F113 */, /*49204*/"PARENTHESIZED LATIN CAPITAL LETTER E"/* 1F114 */,/*49205*/"PARENTHESIZED LATIN CAPITAL LETTER F"/* 1F115 */, /*49206*/"PARENTHESIZED LATIN CAPITAL LETTER G"/* 1F116 */,/*49207*/"PARENTHESIZED LATIN CAPITAL LETTER H"/* 1F117 */, /*49208*/"PARENTHESIZED LATIN CAPITAL LETTER I"/* 1F118 */,/*49209*/"PARENTHESIZED LATIN CAPITAL LETTER J"/* 1F119 */, /*49210*/"PARENTHESIZED LATIN CAPITAL LETTER K"/* 1F11A */,/*49211*/"PARENTHESIZED LATIN CAPITAL LETTER L"/* 1F11B */, /*49212*/"PARENTHESIZED LATIN CAPITAL LETTER M"/* 1F11C */,/*49213*/"PARENTHESIZED LATIN CAPITAL LETTER N"/* 1F11D */, /*49214*/"PARENTHESIZED LATIN CAPITAL LETTER O"/* 1F11E */,/*49215*/"PARENTHESIZED LATIN CAPITAL LETTER P"/* 1F11F */, /*49216*/"PARENTHESIZED LATIN CAPITAL LETTER Q"/* 1F120 */,/*49217*/"PARENTHESIZED LATIN CAPITAL LETTER R"/* 1F121 */, /*49218*/"PARENTHESIZED LATIN CAPITAL LETTER S"/* 1F122 */,/*49219*/"PARENTHESIZED LATIN CAPITAL LETTER T"/* 1F123 */, /*49220*/"PARENTHESIZED LATIN CAPITAL LETTER U"/* 1F124 */,/*49221*/"PARENTHESIZED LATIN CAPITAL LETTER V"/* 1F125 */, /*49222*/"PARENTHESIZED LATIN CAPITAL LETTER W"/* 1F126 */,/*49223*/"PARENTHESIZED LATIN CAPITAL LETTER X"/* 1F127 */, /*49224*/"PARENTHESIZED LATIN CAPITAL LETTER Y"/* 1F128 */,/*49225*/"PARENTHESIZED LATIN CAPITAL LETTER Z"/* 1F129 */, /*49226*/"TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S"/* 1F12A */, /*49227*/"CIRCLED ITALIC LATIN CAPITAL LETTER C"/* 1F12B */,/*49228*/"CIRCLED ITALIC LATIN CAPITAL LETTER R"/* 1F12C */, /*49229*/"CIRCLED CD"/* 1F12D */,/*49230*/"CIRCLED WZ"/* 1F12E */,NULL, /*49232*/"SQUARED LATIN CAPITAL LETTER A"/* 1F130 */,/*49233*/"SQUARED LATIN CAPITAL LETTER B"/* 1F131 */, /*49234*/"SQUARED LATIN CAPITAL LETTER C"/* 1F132 */,/*49235*/"SQUARED LATIN CAPITAL LETTER D"/* 1F133 */, /*49236*/"SQUARED LATIN CAPITAL LETTER E"/* 1F134 */,/*49237*/"SQUARED LATIN CAPITAL LETTER F"/* 1F135 */, /*49238*/"SQUARED LATIN CAPITAL LETTER G"/* 1F136 */,/*49239*/"SQUARED LATIN CAPITAL LETTER H"/* 1F137 */, /*49240*/"SQUARED LATIN CAPITAL LETTER I"/* 1F138 */,/*49241*/"SQUARED LATIN CAPITAL LETTER J"/* 1F139 */, /*49242*/"SQUARED LATIN CAPITAL LETTER K"/* 1F13A */,/*49243*/"SQUARED LATIN CAPITAL LETTER L"/* 1F13B */, /*49244*/"SQUARED LATIN CAPITAL LETTER M"/* 1F13C */,/*49245*/"SQUARED LATIN CAPITAL LETTER N"/* 1F13D */, /*49246*/"SQUARED LATIN CAPITAL LETTER O"/* 1F13E */,/*49247*/"SQUARED LATIN CAPITAL LETTER P"/* 1F13F */, /*49248*/"SQUARED LATIN CAPITAL LETTER Q"/* 1F140 */,/*49249*/"SQUARED LATIN CAPITAL LETTER R"/* 1F141 */, /*49250*/"SQUARED LATIN CAPITAL LETTER S"/* 1F142 */,/*49251*/"SQUARED LATIN CAPITAL LETTER T"/* 1F143 */, /*49252*/"SQUARED LATIN CAPITAL LETTER U"/* 1F144 */,/*49253*/"SQUARED LATIN CAPITAL LETTER V"/* 1F145 */, /*49254*/"SQUARED LATIN CAPITAL LETTER W"/* 1F146 */,/*49255*/"SQUARED LATIN CAPITAL LETTER X"/* 1F147 */, /*49256*/"SQUARED LATIN CAPITAL LETTER Y"/* 1F148 */,/*49257*/"SQUARED LATIN CAPITAL LETTER Z"/* 1F149 */, /*49258*/"SQUARED HV"/* 1F14A */,/*49259*/"SQUARED MV"/* 1F14B */,/*49260*/"SQUARED SD"/* 1F14C */, /*49261*/"SQUARED SS"/* 1F14D */,/*49262*/"SQUARED PPV"/* 1F14E */,/*49263*/"SQUARED WC"/* 1F14F */, /*49264*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER A"/* 1F150 */, /*49265*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER B"/* 1F151 */, /*49266*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER C"/* 1F152 */, /*49267*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER D"/* 1F153 */, /*49268*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER E"/* 1F154 */, /*49269*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER F"/* 1F155 */, /*49270*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER G"/* 1F156 */, /*49271*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER H"/* 1F157 */, /*49272*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER I"/* 1F158 */, /*49273*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER J"/* 1F159 */, /*49274*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER K"/* 1F15A */, /*49275*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER L"/* 1F15B */, /*49276*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER M"/* 1F15C */, /*49277*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER N"/* 1F15D */, /*49278*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER O"/* 1F15E */, /*49279*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER P"/* 1F15F */, /*49280*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER Q"/* 1F160 */, /*49281*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER R"/* 1F161 */, /*49282*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER S"/* 1F162 */, /*49283*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER T"/* 1F163 */, /*49284*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER U"/* 1F164 */, /*49285*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER V"/* 1F165 */, /*49286*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER W"/* 1F166 */, /*49287*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER X"/* 1F167 */, /*49288*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER Y"/* 1F168 */, /*49289*/"NEGATIVE CIRCLED LATIN CAPITAL LETTER Z"/* 1F169 */,/*49290*/"RAISED MC SIGN"/* 1F16A */, /*49291*/"RAISED MD SIGN"/* 1F16B */,NULL,NULL,NULL,NULL,/*49296*/"NEGATIVE SQUARED LATIN CAPITAL LETTER A"/* 1F170 */, /*49297*/"NEGATIVE SQUARED LATIN CAPITAL LETTER B"/* 1F171 */, /*49298*/"NEGATIVE SQUARED LATIN CAPITAL LETTER C"/* 1F172 */, /*49299*/"NEGATIVE SQUARED LATIN CAPITAL LETTER D"/* 1F173 */, /*49300*/"NEGATIVE SQUARED LATIN CAPITAL LETTER E"/* 1F174 */, /*49301*/"NEGATIVE SQUARED LATIN CAPITAL LETTER F"/* 1F175 */, /*49302*/"NEGATIVE SQUARED LATIN CAPITAL LETTER G"/* 1F176 */, /*49303*/"NEGATIVE SQUARED LATIN CAPITAL LETTER H"/* 1F177 */, /*49304*/"NEGATIVE SQUARED LATIN CAPITAL LETTER I"/* 1F178 */, /*49305*/"NEGATIVE SQUARED LATIN CAPITAL LETTER J"/* 1F179 */, /*49306*/"NEGATIVE SQUARED LATIN CAPITAL LETTER K"/* 1F17A */, /*49307*/"NEGATIVE SQUARED LATIN CAPITAL LETTER L"/* 1F17B */, /*49308*/"NEGATIVE SQUARED LATIN CAPITAL LETTER M"/* 1F17C */, /*49309*/"NEGATIVE SQUARED LATIN CAPITAL LETTER N"/* 1F17D */, /*49310*/"NEGATIVE SQUARED LATIN CAPITAL LETTER O"/* 1F17E */, /*49311*/"NEGATIVE SQUARED LATIN CAPITAL LETTER P"/* 1F17F */, /*49312*/"NEGATIVE SQUARED LATIN CAPITAL LETTER Q"/* 1F180 */, /*49313*/"NEGATIVE SQUARED LATIN CAPITAL LETTER R"/* 1F181 */, /*49314*/"NEGATIVE SQUARED LATIN CAPITAL LETTER S"/* 1F182 */, /*49315*/"NEGATIVE SQUARED LATIN CAPITAL LETTER T"/* 1F183 */, /*49316*/"NEGATIVE SQUARED LATIN CAPITAL LETTER U"/* 1F184 */, /*49317*/"NEGATIVE SQUARED LATIN CAPITAL LETTER V"/* 1F185 */, /*49318*/"NEGATIVE SQUARED LATIN CAPITAL LETTER W"/* 1F186 */, /*49319*/"NEGATIVE SQUARED LATIN CAPITAL LETTER X"/* 1F187 */, /*49320*/"NEGATIVE SQUARED LATIN CAPITAL LETTER Y"/* 1F188 */, /*49321*/"NEGATIVE SQUARED LATIN CAPITAL LETTER Z"/* 1F189 */, /*49322*/"CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P"/* 1F18A */,/*49323*/"NEGATIVE SQUARED IC"/* 1F18B */, /*49324*/"NEGATIVE SQUARED PA"/* 1F18C */,/*49325*/"NEGATIVE SQUARED SA"/* 1F18D */, /*49326*/"NEGATIVE SQUARED AB"/* 1F18E */,/*49327*/"NEGATIVE SQUARED WC"/* 1F18F */,/*49328*/"SQUARE DJ"/* 1F190 */, /*49329*/"SQUARED CL"/* 1F191 */,/*49330*/"SQUARED COOL"/* 1F192 */,/*49331*/"SQUARED FREE"/* 1F193 */, /*49332*/"SQUARED ID"/* 1F194 */,/*49333*/"SQUARED NEW"/* 1F195 */,/*49334*/"SQUARED NG"/* 1F196 */, /*49335*/"SQUARED OK"/* 1F197 */,/*49336*/"SQUARED SOS"/* 1F198 */, /*49337*/"SQUARED UP WITH EXCLAMATION MARK"/* 1F199 */,/*49338*/"SQUARED VS"/* 1F19A */, /*49339*/"SQUARED THREE D"/* 1F19B */,/*49340*/"SQUARED SECOND SCREEN"/* 1F19C */,/*49341*/"SQUARED TWO K"/* 1F19D */, /*49342*/"SQUARED FOUR K"/* 1F19E */,/*49343*/"SQUARED EIGHT K"/* 1F19F */,/*49344*/"SQUARED FIVE POINT ONE"/* 1F1A0 */, /*49345*/"SQUARED SEVEN POINT ONE"/* 1F1A1 */,/*49346*/"SQUARED TWENTY-TWO POINT TWO"/* 1F1A2 */, /*49347*/"SQUARED SIXTY P"/* 1F1A3 */,/*49348*/"SQUARED ONE HUNDRED TWENTY P"/* 1F1A4 */, /*49349*/"SQUARED LATIN SMALL LETTER D"/* 1F1A5 */,/*49350*/"SQUARED HC"/* 1F1A6 */,/*49351*/"SQUARED HDR"/* 1F1A7 */, /*49352*/"SQUARED HI-RES"/* 1F1A8 */,/*49353*/"SQUARED LOSSLESS"/* 1F1A9 */,/*49354*/"SQUARED SHV"/* 1F1AA */, /*49355*/"SQUARED UHD"/* 1F1AB */,/*49356*/"SQUARED VOD"/* 1F1AC */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*49414*/"REGIONAL INDICATOR SYMBOL LETTER A"/* 1F1E6 */,/*49415*/"REGIONAL INDICATOR SYMBOL LETTER B"/* 1F1E7 */, /*49416*/"REGIONAL INDICATOR SYMBOL LETTER C"/* 1F1E8 */,/*49417*/"REGIONAL INDICATOR SYMBOL LETTER D"/* 1F1E9 */, /*49418*/"REGIONAL INDICATOR SYMBOL LETTER E"/* 1F1EA */,/*49419*/"REGIONAL INDICATOR SYMBOL LETTER F"/* 1F1EB */, /*49420*/"REGIONAL INDICATOR SYMBOL LETTER G"/* 1F1EC */,/*49421*/"REGIONAL INDICATOR SYMBOL LETTER H"/* 1F1ED */, /*49422*/"REGIONAL INDICATOR SYMBOL LETTER I"/* 1F1EE */,/*49423*/"REGIONAL INDICATOR SYMBOL LETTER J"/* 1F1EF */, /*49424*/"REGIONAL INDICATOR SYMBOL LETTER K"/* 1F1F0 */,/*49425*/"REGIONAL INDICATOR SYMBOL LETTER L"/* 1F1F1 */, /*49426*/"REGIONAL INDICATOR SYMBOL LETTER M"/* 1F1F2 */,/*49427*/"REGIONAL INDICATOR SYMBOL LETTER N"/* 1F1F3 */, /*49428*/"REGIONAL INDICATOR SYMBOL LETTER O"/* 1F1F4 */,/*49429*/"REGIONAL INDICATOR SYMBOL LETTER P"/* 1F1F5 */, /*49430*/"REGIONAL INDICATOR SYMBOL LETTER Q"/* 1F1F6 */,/*49431*/"REGIONAL INDICATOR SYMBOL LETTER R"/* 1F1F7 */, /*49432*/"REGIONAL INDICATOR SYMBOL LETTER S"/* 1F1F8 */,/*49433*/"REGIONAL INDICATOR SYMBOL LETTER T"/* 1F1F9 */, /*49434*/"REGIONAL INDICATOR SYMBOL LETTER U"/* 1F1FA */,/*49435*/"REGIONAL INDICATOR SYMBOL LETTER V"/* 1F1FB */, /*49436*/"REGIONAL INDICATOR SYMBOL LETTER W"/* 1F1FC */,/*49437*/"REGIONAL INDICATOR SYMBOL LETTER X"/* 1F1FD */, /*49438*/"REGIONAL INDICATOR SYMBOL LETTER Y"/* 1F1FE */,/*49439*/"REGIONAL INDICATOR SYMBOL LETTER Z"/* 1F1FF */, /*49440*/"SQUARE HIRAGANA HOKA"/* 1F200 */,/*49441*/"SQUARED KATAKANA KOKO"/* 1F201 */, /*49442*/"SQUARED KATAKANA SA"/* 1F202 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*49456*/"SQUARED CJK UNIFIED IDEOGRAPH-624B"/* 1F210 */,/*49457*/"SQUARED CJK UNIFIED IDEOGRAPH-5B57"/* 1F211 */, /*49458*/"SQUARED CJK UNIFIED IDEOGRAPH-53CC"/* 1F212 */,/*49459*/"SQUARED KATAKANA DE"/* 1F213 */, /*49460*/"SQUARED CJK UNIFIED IDEOGRAPH-4E8C"/* 1F214 */,/*49461*/"SQUARED CJK UNIFIED IDEOGRAPH-591A"/* 1F215 */, /*49462*/"SQUARED CJK UNIFIED IDEOGRAPH-89E3"/* 1F216 */,/*49463*/"SQUARED CJK UNIFIED IDEOGRAPH-5929"/* 1F217 */, /*49464*/"SQUARED CJK UNIFIED IDEOGRAPH-4EA4"/* 1F218 */,/*49465*/"SQUARED CJK UNIFIED IDEOGRAPH-6620"/* 1F219 */, /*49466*/"SQUARED CJK UNIFIED IDEOGRAPH-7121"/* 1F21A */,/*49467*/"SQUARED CJK UNIFIED IDEOGRAPH-6599"/* 1F21B */, /*49468*/"SQUARED CJK UNIFIED IDEOGRAPH-524D"/* 1F21C */,/*49469*/"SQUARED CJK UNIFIED IDEOGRAPH-5F8C"/* 1F21D */, /*49470*/"SQUARED CJK UNIFIED IDEOGRAPH-518D"/* 1F21E */,/*49471*/"SQUARED CJK UNIFIED IDEOGRAPH-65B0"/* 1F21F */, /*49472*/"SQUARED CJK UNIFIED IDEOGRAPH-521D"/* 1F220 */,/*49473*/"SQUARED CJK UNIFIED IDEOGRAPH-7D42"/* 1F221 */, /*49474*/"SQUARED CJK UNIFIED IDEOGRAPH-751F"/* 1F222 */,/*49475*/"SQUARED CJK UNIFIED IDEOGRAPH-8CA9"/* 1F223 */, /*49476*/"SQUARED CJK UNIFIED IDEOGRAPH-58F0"/* 1F224 */,/*49477*/"SQUARED CJK UNIFIED IDEOGRAPH-5439"/* 1F225 */, /*49478*/"SQUARED CJK UNIFIED IDEOGRAPH-6F14"/* 1F226 */,/*49479*/"SQUARED CJK UNIFIED IDEOGRAPH-6295"/* 1F227 */, /*49480*/"SQUARED CJK UNIFIED IDEOGRAPH-6355"/* 1F228 */,/*49481*/"SQUARED CJK UNIFIED IDEOGRAPH-4E00"/* 1F229 */, /*49482*/"SQUARED CJK UNIFIED IDEOGRAPH-4E09"/* 1F22A */,/*49483*/"SQUARED CJK UNIFIED IDEOGRAPH-904A"/* 1F22B */, /*49484*/"SQUARED CJK UNIFIED IDEOGRAPH-5DE6"/* 1F22C */,/*49485*/"SQUARED CJK UNIFIED IDEOGRAPH-4E2D"/* 1F22D */, /*49486*/"SQUARED CJK UNIFIED IDEOGRAPH-53F3"/* 1F22E */,/*49487*/"SQUARED CJK UNIFIED IDEOGRAPH-6307"/* 1F22F */, /*49488*/"SQUARED CJK UNIFIED IDEOGRAPH-8D70"/* 1F230 */,/*49489*/"SQUARED CJK UNIFIED IDEOGRAPH-6253"/* 1F231 */, /*49490*/"SQUARED CJK UNIFIED IDEOGRAPH-7981"/* 1F232 */,/*49491*/"SQUARED CJK UNIFIED IDEOGRAPH-7A7A"/* 1F233 */, /*49492*/"SQUARED CJK UNIFIED IDEOGRAPH-5408"/* 1F234 */,/*49493*/"SQUARED CJK UNIFIED IDEOGRAPH-6E80"/* 1F235 */, /*49494*/"SQUARED CJK UNIFIED IDEOGRAPH-6709"/* 1F236 */,/*49495*/"SQUARED CJK UNIFIED IDEOGRAPH-6708"/* 1F237 */, /*49496*/"SQUARED CJK UNIFIED IDEOGRAPH-7533"/* 1F238 */,/*49497*/"SQUARED CJK UNIFIED IDEOGRAPH-5272"/* 1F239 */, /*49498*/"SQUARED CJK UNIFIED IDEOGRAPH-55B6"/* 1F23A */,/*49499*/"SQUARED CJK UNIFIED IDEOGRAPH-914D"/* 1F23B */,NULL, NULL,NULL,NULL,/*49504*/"TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C"/* 1F240 */, /*49505*/"TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09"/* 1F241 */, /*49506*/"TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C"/* 1F242 */, /*49507*/"TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89"/* 1F243 */, /*49508*/"TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9"/* 1F244 */, /*49509*/"TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253"/* 1F245 */, /*49510*/"TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7"/* 1F246 */, /*49511*/"TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD"/* 1F247 */, /*49512*/"TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557"/* 1F248 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*49520*/"CIRCLED IDEOGRAPH ADVANTAGE"/* 1F250 */,/*49521*/"CIRCLED IDEOGRAPH ACCEPT"/* 1F251 */,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*49536*/"ROUNDED SYMBOL FOR FU"/* 1F260 */, /*49537*/"ROUNDED SYMBOL FOR LU"/* 1F261 */,/*49538*/"ROUNDED SYMBOL FOR SHOU"/* 1F262 */, /*49539*/"ROUNDED SYMBOL FOR XI"/* 1F263 */,/*49540*/"ROUNDED SYMBOL FOR SHUANGXI"/* 1F264 */, /*49541*/"ROUNDED SYMBOL FOR CAI"/* 1F265 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*49696*/"CYCLONE"/* 1F300 */,/*49697*/"FOGGY"/* 1F301 */,/*49698*/"CLOSED UMBRELLA"/* 1F302 */, /*49699*/"NIGHT WITH STARS"/* 1F303 */,/*49700*/"SUNRISE OVER MOUNTAINS"/* 1F304 */,/*49701*/"SUNRISE"/* 1F305 */, /*49702*/"CITYSCAPE AT DUSK"/* 1F306 */,/*49703*/"SUNSET OVER BUILDINGS"/* 1F307 */,/*49704*/"RAINBOW"/* 1F308 */, /*49705*/"BRIDGE AT NIGHT"/* 1F309 */,/*49706*/"WATER WAVE"/* 1F30A */,/*49707*/"VOLCANO"/* 1F30B */, /*49708*/"MILKY WAY"/* 1F30C */,/*49709*/"EARTH GLOBE EUROPE-AFRICA"/* 1F30D */, /*49710*/"EARTH GLOBE AMERICAS"/* 1F30E */,/*49711*/"EARTH GLOBE ASIA-AUSTRALIA"/* 1F30F */, /*49712*/"GLOBE WITH MERIDIANS"/* 1F310 */,/*49713*/"NEW MOON SYMBOL"/* 1F311 */, /*49714*/"WAXING CRESCENT MOON SYMBOL"/* 1F312 */,/*49715*/"FIRST QUARTER MOON SYMBOL"/* 1F313 */, /*49716*/"WAXING GIBBOUS MOON SYMBOL"/* 1F314 */,/*49717*/"FULL MOON SYMBOL"/* 1F315 */, /*49718*/"WANING GIBBOUS MOON SYMBOL"/* 1F316 */,/*49719*/"LAST QUARTER MOON SYMBOL"/* 1F317 */, /*49720*/"WANING CRESCENT MOON SYMBOL"/* 1F318 */,/*49721*/"CRESCENT MOON"/* 1F319 */, /*49722*/"NEW MOON WITH FACE"/* 1F31A */,/*49723*/"FIRST QUARTER MOON WITH FACE"/* 1F31B */, /*49724*/"LAST QUARTER MOON WITH FACE"/* 1F31C */,/*49725*/"FULL MOON WITH FACE"/* 1F31D */, /*49726*/"SUN WITH FACE"/* 1F31E */,/*49727*/"GLOWING STAR"/* 1F31F */,/*49728*/"SHOOTING STAR"/* 1F320 */, /*49729*/"THERMOMETER"/* 1F321 */,/*49730*/"BLACK DROPLET"/* 1F322 */,/*49731*/"WHITE SUN"/* 1F323 */, /*49732*/"WHITE SUN WITH SMALL CLOUD"/* 1F324 */,/*49733*/"WHITE SUN BEHIND CLOUD"/* 1F325 */, /*49734*/"WHITE SUN BEHIND CLOUD WITH RAIN"/* 1F326 */,/*49735*/"CLOUD WITH RAIN"/* 1F327 */, /*49736*/"CLOUD WITH SNOW"/* 1F328 */,/*49737*/"CLOUD WITH LIGHTNING"/* 1F329 */, /*49738*/"CLOUD WITH TORNADO"/* 1F32A */,/*49739*/"FOG"/* 1F32B */,/*49740*/"WIND BLOWING FACE"/* 1F32C */, /*49741*/"HOT DOG"/* 1F32D */,/*49742*/"TACO"/* 1F32E */,/*49743*/"BURRITO"/* 1F32F */,/*49744*/"CHESTNUT"/* 1F330 */, /*49745*/"SEEDLING"/* 1F331 */,/*49746*/"EVERGREEN TREE"/* 1F332 */,/*49747*/"DECIDUOUS TREE"/* 1F333 */, /*49748*/"PALM TREE"/* 1F334 */,/*49749*/"CACTUS"/* 1F335 */,/*49750*/"HOT PEPPER"/* 1F336 */, /*49751*/"TULIP"/* 1F337 */,/*49752*/"CHERRY BLOSSOM"/* 1F338 */,/*49753*/"ROSE"/* 1F339 */, /*49754*/"HIBISCUS"/* 1F33A */,/*49755*/"SUNFLOWER"/* 1F33B */,/*49756*/"BLOSSOM"/* 1F33C */, /*49757*/"EAR OF MAIZE"/* 1F33D */,/*49758*/"EAR OF RICE"/* 1F33E */,/*49759*/"HERB"/* 1F33F */, /*49760*/"FOUR LEAF CLOVER"/* 1F340 */,/*49761*/"MAPLE LEAF"/* 1F341 */,/*49762*/"FALLEN LEAF"/* 1F342 */, /*49763*/"LEAF FLUTTERING IN WIND"/* 1F343 */,/*49764*/"MUSHROOM"/* 1F344 */,/*49765*/"TOMATO"/* 1F345 */, /*49766*/"AUBERGINE"/* 1F346 */,/*49767*/"GRAPES"/* 1F347 */,/*49768*/"MELON"/* 1F348 */, /*49769*/"WATERMELON"/* 1F349 */,/*49770*/"TANGERINE"/* 1F34A */,/*49771*/"LEMON"/* 1F34B */, /*49772*/"BANANA"/* 1F34C */,/*49773*/"PINEAPPLE"/* 1F34D */,/*49774*/"RED APPLE"/* 1F34E */, /*49775*/"GREEN APPLE"/* 1F34F */,/*49776*/"PEAR"/* 1F350 */,/*49777*/"PEACH"/* 1F351 */,/*49778*/"CHERRIES"/* 1F352 */, /*49779*/"STRAWBERRY"/* 1F353 */,/*49780*/"HAMBURGER"/* 1F354 */,/*49781*/"SLICE OF PIZZA"/* 1F355 */, /*49782*/"MEAT ON BONE"/* 1F356 */,/*49783*/"POULTRY LEG"/* 1F357 */,/*49784*/"RICE CRACKER"/* 1F358 */, /*49785*/"RICE BALL"/* 1F359 */,/*49786*/"COOKED RICE"/* 1F35A */,/*49787*/"CURRY AND RICE"/* 1F35B */, /*49788*/"STEAMING BOWL"/* 1F35C */,/*49789*/"SPAGHETTI"/* 1F35D */,/*49790*/"BREAD"/* 1F35E */, /*49791*/"FRENCH FRIES"/* 1F35F */,/*49792*/"ROASTED SWEET POTATO"/* 1F360 */,/*49793*/"DANGO"/* 1F361 */, /*49794*/"ODEN"/* 1F362 */,/*49795*/"SUSHI"/* 1F363 */,/*49796*/"FRIED SHRIMP"/* 1F364 */, /*49797*/"FISH CAKE WITH SWIRL DESIGN"/* 1F365 */,/*49798*/"SOFT ICE CREAM"/* 1F366 */,/*49799*/"SHAVED ICE"/* 1F367 */, /*49800*/"ICE CREAM"/* 1F368 */,/*49801*/"DOUGHNUT"/* 1F369 */,/*49802*/"COOKIE"/* 1F36A */, /*49803*/"CHOCOLATE BAR"/* 1F36B */,/*49804*/"CANDY"/* 1F36C */,/*49805*/"LOLLIPOP"/* 1F36D */, /*49806*/"CUSTARD"/* 1F36E */,/*49807*/"HONEY POT"/* 1F36F */,/*49808*/"SHORTCAKE"/* 1F370 */, /*49809*/"BENTO BOX"/* 1F371 */,/*49810*/"POT OF FOOD"/* 1F372 */,/*49811*/"COOKING"/* 1F373 */, /*49812*/"FORK AND KNIFE"/* 1F374 */,/*49813*/"TEACUP WITHOUT HANDLE"/* 1F375 */, /*49814*/"SAKE BOTTLE AND CUP"/* 1F376 */,/*49815*/"WINE GLASS"/* 1F377 */,/*49816*/"COCKTAIL GLASS"/* 1F378 */, /*49817*/"TROPICAL DRINK"/* 1F379 */,/*49818*/"BEER MUG"/* 1F37A */,/*49819*/"CLINKING BEER MUGS"/* 1F37B */, /*49820*/"BABY BOTTLE"/* 1F37C */,/*49821*/"FORK AND KNIFE WITH PLATE"/* 1F37D */, /*49822*/"BOTTLE WITH POPPING CORK"/* 1F37E */,/*49823*/"POPCORN"/* 1F37F */,/*49824*/"RIBBON"/* 1F380 */, /*49825*/"WRAPPED PRESENT"/* 1F381 */,/*49826*/"BIRTHDAY CAKE"/* 1F382 */,/*49827*/"JACK-O-LANTERN"/* 1F383 */, /*49828*/"CHRISTMAS TREE"/* 1F384 */,/*49829*/"FATHER CHRISTMAS"/* 1F385 */,/*49830*/"FIREWORKS"/* 1F386 */, /*49831*/"FIREWORK SPARKLER"/* 1F387 */,/*49832*/"BALLOON"/* 1F388 */,/*49833*/"PARTY POPPER"/* 1F389 */, /*49834*/"CONFETTI BALL"/* 1F38A */,/*49835*/"TANABATA TREE"/* 1F38B */,/*49836*/"CROSSED FLAGS"/* 1F38C */, /*49837*/"PINE DECORATION"/* 1F38D */,/*49838*/"JAPANESE DOLLS"/* 1F38E */,/*49839*/"CARP STREAMER"/* 1F38F */, /*49840*/"WIND CHIME"/* 1F390 */,/*49841*/"MOON VIEWING CEREMONY"/* 1F391 */,/*49842*/"SCHOOL SATCHEL"/* 1F392 */, /*49843*/"GRADUATION CAP"/* 1F393 */,/*49844*/"HEART WITH TIP ON THE LEFT"/* 1F394 */, /*49845*/"BOUQUET OF FLOWERS"/* 1F395 */,/*49846*/"MILITARY MEDAL"/* 1F396 */,/*49847*/"REMINDER RIBBON"/* 1F397 */, /*49848*/"MUSICAL KEYBOARD WITH JACKS"/* 1F398 */,/*49849*/"STUDIO MICROPHONE"/* 1F399 */, /*49850*/"LEVEL SLIDER"/* 1F39A */,/*49851*/"CONTROL KNOBS"/* 1F39B */, /*49852*/"BEAMED ASCENDING MUSICAL NOTES"/* 1F39C */,/*49853*/"BEAMED DESCENDING MUSICAL NOTES"/* 1F39D */, /*49854*/"FILM FRAMES"/* 1F39E */,/*49855*/"ADMISSION TICKETS"/* 1F39F */,/*49856*/"CAROUSEL HORSE"/* 1F3A0 */, /*49857*/"FERRIS WHEEL"/* 1F3A1 */,/*49858*/"ROLLER COASTER"/* 1F3A2 */,/*49859*/"FISHING POLE AND FISH"/* 1F3A3 */, /*49860*/"MICROPHONE"/* 1F3A4 */,/*49861*/"MOVIE CAMERA"/* 1F3A5 */,/*49862*/"CINEMA"/* 1F3A6 */, /*49863*/"HEADPHONE"/* 1F3A7 */,/*49864*/"ARTIST PALETTE"/* 1F3A8 */,/*49865*/"TOP HAT"/* 1F3A9 */, /*49866*/"CIRCUS TENT"/* 1F3AA */,/*49867*/"TICKET"/* 1F3AB */,/*49868*/"CLAPPER BOARD"/* 1F3AC */, /*49869*/"PERFORMING ARTS"/* 1F3AD */,/*49870*/"VIDEO GAME"/* 1F3AE */,/*49871*/"DIRECT HIT"/* 1F3AF */, /*49872*/"SLOT MACHINE"/* 1F3B0 */,/*49873*/"BILLIARDS"/* 1F3B1 */,/*49874*/"GAME DIE"/* 1F3B2 */, /*49875*/"BOWLING"/* 1F3B3 */,/*49876*/"FLOWER PLAYING CARDS"/* 1F3B4 */,/*49877*/"MUSICAL NOTE"/* 1F3B5 */, /*49878*/"MULTIPLE MUSICAL NOTES"/* 1F3B6 */,/*49879*/"SAXOPHONE"/* 1F3B7 */,/*49880*/"GUITAR"/* 1F3B8 */, /*49881*/"MUSICAL KEYBOARD"/* 1F3B9 */,/*49882*/"TRUMPET"/* 1F3BA */,/*49883*/"VIOLIN"/* 1F3BB */, /*49884*/"MUSICAL SCORE"/* 1F3BC */,/*49885*/"RUNNING SHIRT WITH SASH"/* 1F3BD */, /*49886*/"TENNIS RACQUET AND BALL"/* 1F3BE */,/*49887*/"SKI AND SKI BOOT"/* 1F3BF */, /*49888*/"BASKETBALL AND HOOP"/* 1F3C0 */,/*49889*/"CHEQUERED FLAG"/* 1F3C1 */,/*49890*/"SNOWBOARDER"/* 1F3C2 */, /*49891*/"RUNNER"/* 1F3C3 */,/*49892*/"SURFER"/* 1F3C4 */,/*49893*/"SPORTS MEDAL"/* 1F3C5 */, /*49894*/"TROPHY"/* 1F3C6 */,/*49895*/"HORSE RACING"/* 1F3C7 */,/*49896*/"AMERICAN FOOTBALL"/* 1F3C8 */, /*49897*/"RUGBY FOOTBALL"/* 1F3C9 */,/*49898*/"SWIMMER"/* 1F3CA */,/*49899*/"WEIGHT LIFTER"/* 1F3CB */, /*49900*/"GOLFER"/* 1F3CC */,/*49901*/"RACING MOTORCYCLE"/* 1F3CD */,/*49902*/"RACING CAR"/* 1F3CE */, /*49903*/"CRICKET BAT AND BALL"/* 1F3CF */,/*49904*/"VOLLEYBALL"/* 1F3D0 */, /*49905*/"FIELD HOCKEY STICK AND BALL"/* 1F3D1 */,/*49906*/"ICE HOCKEY STICK AND PUCK"/* 1F3D2 */, /*49907*/"TABLE TENNIS PADDLE AND BALL"/* 1F3D3 */,/*49908*/"SNOW CAPPED MOUNTAIN"/* 1F3D4 */, /*49909*/"CAMPING"/* 1F3D5 */,/*49910*/"BEACH WITH UMBRELLA"/* 1F3D6 */,/*49911*/"BUILDING CONSTRUCTION"/* 1F3D7 */, /*49912*/"HOUSE BUILDINGS"/* 1F3D8 */,/*49913*/"CITYSCAPE"/* 1F3D9 */,/*49914*/"DERELICT HOUSE BUILDING"/* 1F3DA */, /*49915*/"CLASSICAL BUILDING"/* 1F3DB */,/*49916*/"DESERT"/* 1F3DC */,/*49917*/"DESERT ISLAND"/* 1F3DD */, /*49918*/"NATIONAL PARK"/* 1F3DE */,/*49919*/"STADIUM"/* 1F3DF */,/*49920*/"HOUSE BUILDING"/* 1F3E0 */, /*49921*/"HOUSE WITH GARDEN"/* 1F3E1 */,/*49922*/"OFFICE BUILDING"/* 1F3E2 */,/*49923*/"JAPANESE POST OFFICE"/* 1F3E3 */, /*49924*/"EUROPEAN POST OFFICE"/* 1F3E4 */,/*49925*/"HOSPITAL"/* 1F3E5 */,/*49926*/"BANK"/* 1F3E6 */, /*49927*/"AUTOMATED TELLER MACHINE"/* 1F3E7 */,/*49928*/"HOTEL"/* 1F3E8 */,/*49929*/"LOVE HOTEL"/* 1F3E9 */, /*49930*/"CONVENIENCE STORE"/* 1F3EA */,/*49931*/"SCHOOL"/* 1F3EB */,/*49932*/"DEPARTMENT STORE"/* 1F3EC */, /*49933*/"FACTORY"/* 1F3ED */,/*49934*/"IZAKAYA LANTERN"/* 1F3EE */,/*49935*/"JAPANESE CASTLE"/* 1F3EF */, /*49936*/"EUROPEAN CASTLE"/* 1F3F0 */,/*49937*/"WHITE PENNANT"/* 1F3F1 */,/*49938*/"BLACK PENNANT"/* 1F3F2 */, /*49939*/"WAVING WHITE FLAG"/* 1F3F3 */,/*49940*/"WAVING BLACK FLAG"/* 1F3F4 */,/*49941*/"ROSETTE"/* 1F3F5 */, /*49942*/"BLACK ROSETTE"/* 1F3F6 */,/*49943*/"LABEL"/* 1F3F7 */,/*49944*/"BADMINTON RACQUET AND SHUTTLECOCK"/* 1F3F8 */, /*49945*/"BOW AND ARROW"/* 1F3F9 */,/*49946*/"AMPHORA"/* 1F3FA */, /*49947*/"EMOJI MODIFIER FITZPATRICK TYPE-1-2"/* 1F3FB */,/*49948*/"EMOJI MODIFIER FITZPATRICK TYPE-3"/* 1F3FC */, /*49949*/"EMOJI MODIFIER FITZPATRICK TYPE-4"/* 1F3FD */,/*49950*/"EMOJI MODIFIER FITZPATRICK TYPE-5"/* 1F3FE */, /*49951*/"EMOJI MODIFIER FITZPATRICK TYPE-6"/* 1F3FF */,/*49952*/"RAT"/* 1F400 */,/*49953*/"MOUSE"/* 1F401 */, /*49954*/"OX"/* 1F402 */,/*49955*/"WATER BUFFALO"/* 1F403 */,/*49956*/"COW"/* 1F404 */,/*49957*/"TIGER"/* 1F405 */, /*49958*/"LEOPARD"/* 1F406 */,/*49959*/"RABBIT"/* 1F407 */,/*49960*/"CAT"/* 1F408 */,/*49961*/"DRAGON"/* 1F409 */, /*49962*/"CROCODILE"/* 1F40A */,/*49963*/"WHALE"/* 1F40B */,/*49964*/"SNAIL"/* 1F40C */,/*49965*/"SNAKE"/* 1F40D */, /*49966*/"HORSE"/* 1F40E */,/*49967*/"RAM"/* 1F40F */,/*49968*/"GOAT"/* 1F410 */,/*49969*/"SHEEP"/* 1F411 */, /*49970*/"MONKEY"/* 1F412 */,/*49971*/"ROOSTER"/* 1F413 */,/*49972*/"CHICKEN"/* 1F414 */,/*49973*/"DOG"/* 1F415 */, /*49974*/"PIG"/* 1F416 */,/*49975*/"BOAR"/* 1F417 */,/*49976*/"ELEPHANT"/* 1F418 */,/*49977*/"OCTOPUS"/* 1F419 */, /*49978*/"SPIRAL SHELL"/* 1F41A */,/*49979*/"BUG"/* 1F41B */,/*49980*/"ANT"/* 1F41C */,/*49981*/"HONEYBEE"/* 1F41D */, /*49982*/"LADY BEETLE"/* 1F41E */,/*49983*/"FISH"/* 1F41F */,/*49984*/"TROPICAL FISH"/* 1F420 */, /*49985*/"BLOWFISH"/* 1F421 */,/*49986*/"TURTLE"/* 1F422 */,/*49987*/"HATCHING CHICK"/* 1F423 */, /*49988*/"BABY CHICK"/* 1F424 */,/*49989*/"FRONT-FACING BABY CHICK"/* 1F425 */,/*49990*/"BIRD"/* 1F426 */, /*49991*/"PENGUIN"/* 1F427 */,/*49992*/"KOALA"/* 1F428 */,/*49993*/"POODLE"/* 1F429 */, /*49994*/"DROMEDARY CAMEL"/* 1F42A */,/*49995*/"BACTRIAN CAMEL"/* 1F42B */,/*49996*/"DOLPHIN"/* 1F42C */, /*49997*/"MOUSE FACE"/* 1F42D */,/*49998*/"COW FACE"/* 1F42E */,/*49999*/"TIGER FACE"/* 1F42F */, /*50000*/"RABBIT FACE"/* 1F430 */,/*50001*/"CAT FACE"/* 1F431 */,/*50002*/"DRAGON FACE"/* 1F432 */, /*50003*/"SPOUTING WHALE"/* 1F433 */,/*50004*/"HORSE FACE"/* 1F434 */,/*50005*/"MONKEY FACE"/* 1F435 */, /*50006*/"DOG FACE"/* 1F436 */,/*50007*/"PIG FACE"/* 1F437 */,/*50008*/"FROG FACE"/* 1F438 */, /*50009*/"HAMSTER FACE"/* 1F439 */,/*50010*/"WOLF FACE"/* 1F43A */,/*50011*/"BEAR FACE"/* 1F43B */, /*50012*/"PANDA FACE"/* 1F43C */,/*50013*/"PIG NOSE"/* 1F43D */,/*50014*/"PAW PRINTS"/* 1F43E */, /*50015*/"CHIPMUNK"/* 1F43F */,/*50016*/"EYES"/* 1F440 */,/*50017*/"EYE"/* 1F441 */,/*50018*/"EAR"/* 1F442 */, /*50019*/"NOSE"/* 1F443 */,/*50020*/"MOUTH"/* 1F444 */,/*50021*/"TONGUE"/* 1F445 */, /*50022*/"WHITE UP POINTING BACKHAND INDEX"/* 1F446 */,/*50023*/"WHITE DOWN POINTING BACKHAND INDEX"/* 1F447 */, /*50024*/"WHITE LEFT POINTING BACKHAND INDEX"/* 1F448 */,/*50025*/"WHITE RIGHT POINTING BACKHAND INDEX"/* 1F449 */, /*50026*/"FISTED HAND SIGN"/* 1F44A */,/*50027*/"WAVING HAND SIGN"/* 1F44B */,/*50028*/"OK HAND SIGN"/* 1F44C */, /*50029*/"THUMBS UP SIGN"/* 1F44D */,/*50030*/"THUMBS DOWN SIGN"/* 1F44E */,/*50031*/"CLAPPING HANDS SIGN"/* 1F44F */, /*50032*/"OPEN HANDS SIGN"/* 1F450 */,/*50033*/"CROWN"/* 1F451 */,/*50034*/"WOMANS HAT"/* 1F452 */, /*50035*/"EYEGLASSES"/* 1F453 */,/*50036*/"NECKTIE"/* 1F454 */,/*50037*/"T-SHIRT"/* 1F455 */,/*50038*/"JEANS"/* 1F456 */, /*50039*/"DRESS"/* 1F457 */,/*50040*/"KIMONO"/* 1F458 */,/*50041*/"BIKINI"/* 1F459 */, /*50042*/"WOMANS CLOTHES"/* 1F45A */,/*50043*/"PURSE"/* 1F45B */,/*50044*/"HANDBAG"/* 1F45C */, /*50045*/"POUCH"/* 1F45D */,/*50046*/"MANS SHOE"/* 1F45E */,/*50047*/"ATHLETIC SHOE"/* 1F45F */, /*50048*/"HIGH-HEELED SHOE"/* 1F460 */,/*50049*/"WOMANS SANDAL"/* 1F461 */,/*50050*/"WOMANS BOOTS"/* 1F462 */, /*50051*/"FOOTPRINTS"/* 1F463 */,/*50052*/"BUST IN SILHOUETTE"/* 1F464 */,/*50053*/"BUSTS IN SILHOUETTE"/* 1F465 */, /*50054*/"BOY"/* 1F466 */,/*50055*/"GIRL"/* 1F467 */,/*50056*/"MAN"/* 1F468 */,/*50057*/"WOMAN"/* 1F469 */, /*50058*/"FAMILY"/* 1F46A */,/*50059*/"MAN AND WOMAN HOLDING HANDS"/* 1F46B */, /*50060*/"TWO MEN HOLDING HANDS"/* 1F46C */,/*50061*/"TWO WOMEN HOLDING HANDS"/* 1F46D */, /*50062*/"POLICE OFFICER"/* 1F46E */,/*50063*/"WOMAN WITH BUNNY EARS"/* 1F46F */,/*50064*/"BRIDE WITH VEIL"/* 1F470 */, /*50065*/"PERSON WITH BLOND HAIR"/* 1F471 */,/*50066*/"MAN WITH GUA PI MAO"/* 1F472 */, /*50067*/"MAN WITH TURBAN"/* 1F473 */,/*50068*/"OLDER MAN"/* 1F474 */,/*50069*/"OLDER WOMAN"/* 1F475 */, /*50070*/"BABY"/* 1F476 */,/*50071*/"CONSTRUCTION WORKER"/* 1F477 */,/*50072*/"PRINCESS"/* 1F478 */, /*50073*/"JAPANESE OGRE"/* 1F479 */,/*50074*/"JAPANESE GOBLIN"/* 1F47A */,/*50075*/"GHOST"/* 1F47B */, /*50076*/"BABY ANGEL"/* 1F47C */,/*50077*/"EXTRATERRESTRIAL ALIEN"/* 1F47D */,/*50078*/"ALIEN MONSTER"/* 1F47E */, /*50079*/"IMP"/* 1F47F */,/*50080*/"SKULL"/* 1F480 */,/*50081*/"INFORMATION DESK PERSON"/* 1F481 */, /*50082*/"GUARDSMAN"/* 1F482 */,/*50083*/"DANCER"/* 1F483 */,/*50084*/"LIPSTICK"/* 1F484 */, /*50085*/"NAIL POLISH"/* 1F485 */,/*50086*/"FACE MASSAGE"/* 1F486 */,/*50087*/"HAIRCUT"/* 1F487 */, /*50088*/"BARBER POLE"/* 1F488 */,/*50089*/"SYRINGE"/* 1F489 */,/*50090*/"PILL"/* 1F48A */, /*50091*/"KISS MARK"/* 1F48B */,/*50092*/"LOVE LETTER"/* 1F48C */,/*50093*/"RING"/* 1F48D */, /*50094*/"GEM STONE"/* 1F48E */,/*50095*/"KISS"/* 1F48F */,/*50096*/"BOUQUET"/* 1F490 */, /*50097*/"COUPLE WITH HEART"/* 1F491 */,/*50098*/"WEDDING"/* 1F492 */,/*50099*/"BEATING HEART"/* 1F493 */, /*50100*/"BROKEN HEART"/* 1F494 */,/*50101*/"TWO HEARTS"/* 1F495 */,/*50102*/"SPARKLING HEART"/* 1F496 */, /*50103*/"GROWING HEART"/* 1F497 */,/*50104*/"HEART WITH ARROW"/* 1F498 */,/*50105*/"BLUE HEART"/* 1F499 */, /*50106*/"GREEN HEART"/* 1F49A */,/*50107*/"YELLOW HEART"/* 1F49B */,/*50108*/"PURPLE HEART"/* 1F49C */, /*50109*/"HEART WITH RIBBON"/* 1F49D */,/*50110*/"REVOLVING HEARTS"/* 1F49E */,/*50111*/"HEART DECORATION"/* 1F49F */, /*50112*/"DIAMOND SHAPE WITH A DOT INSIDE"/* 1F4A0 */,/*50113*/"ELECTRIC LIGHT BULB"/* 1F4A1 */, /*50114*/"ANGER SYMBOL"/* 1F4A2 */,/*50115*/"BOMB"/* 1F4A3 */,/*50116*/"SLEEPING SYMBOL"/* 1F4A4 */, /*50117*/"COLLISION SYMBOL"/* 1F4A5 */,/*50118*/"SPLASHING SWEAT SYMBOL"/* 1F4A6 */,/*50119*/"DROPLET"/* 1F4A7 */, /*50120*/"DASH SYMBOL"/* 1F4A8 */,/*50121*/"PILE OF POO"/* 1F4A9 */,/*50122*/"FLEXED BICEPS"/* 1F4AA */, /*50123*/"DIZZY SYMBOL"/* 1F4AB */,/*50124*/"SPEECH BALLOON"/* 1F4AC */,/*50125*/"THOUGHT BALLOON"/* 1F4AD */, /*50126*/"WHITE FLOWER"/* 1F4AE */,/*50127*/"HUNDRED POINTS SYMBOL"/* 1F4AF */,/*50128*/"MONEY BAG"/* 1F4B0 */, /*50129*/"CURRENCY EXCHANGE"/* 1F4B1 */,/*50130*/"HEAVY DOLLAR SIGN"/* 1F4B2 */,/*50131*/"CREDIT CARD"/* 1F4B3 */, /*50132*/"BANKNOTE WITH YEN SIGN"/* 1F4B4 */,/*50133*/"BANKNOTE WITH DOLLAR SIGN"/* 1F4B5 */, /*50134*/"BANKNOTE WITH EURO SIGN"/* 1F4B6 */,/*50135*/"BANKNOTE WITH POUND SIGN"/* 1F4B7 */, /*50136*/"MONEY WITH WINGS"/* 1F4B8 */,/*50137*/"CHART WITH UPWARDS TREND AND YEN SIGN"/* 1F4B9 */, /*50138*/"SEAT"/* 1F4BA */,/*50139*/"PERSONAL COMPUTER"/* 1F4BB */,/*50140*/"BRIEFCASE"/* 1F4BC */, /*50141*/"MINIDISC"/* 1F4BD */,/*50142*/"FLOPPY DISK"/* 1F4BE */,/*50143*/"OPTICAL DISC"/* 1F4BF */, /*50144*/"DVD"/* 1F4C0 */,/*50145*/"FILE FOLDER"/* 1F4C1 */,/*50146*/"OPEN FILE FOLDER"/* 1F4C2 */, /*50147*/"PAGE WITH CURL"/* 1F4C3 */,/*50148*/"PAGE FACING UP"/* 1F4C4 */,/*50149*/"CALENDAR"/* 1F4C5 */, /*50150*/"TEAR-OFF CALENDAR"/* 1F4C6 */,/*50151*/"CARD INDEX"/* 1F4C7 */,/*50152*/"CHART WITH UPWARDS TREND"/* 1F4C8 */, /*50153*/"CHART WITH DOWNWARDS TREND"/* 1F4C9 */,/*50154*/"BAR CHART"/* 1F4CA */,/*50155*/"CLIPBOARD"/* 1F4CB */, /*50156*/"PUSHPIN"/* 1F4CC */,/*50157*/"ROUND PUSHPIN"/* 1F4CD */,/*50158*/"PAPERCLIP"/* 1F4CE */, /*50159*/"STRAIGHT RULER"/* 1F4CF */,/*50160*/"TRIANGULAR RULER"/* 1F4D0 */,/*50161*/"BOOKMARK TABS"/* 1F4D1 */, /*50162*/"LEDGER"/* 1F4D2 */,/*50163*/"NOTEBOOK"/* 1F4D3 */,/*50164*/"NOTEBOOK WITH DECORATIVE COVER"/* 1F4D4 */, /*50165*/"CLOSED BOOK"/* 1F4D5 */,/*50166*/"OPEN BOOK"/* 1F4D6 */,/*50167*/"GREEN BOOK"/* 1F4D7 */, /*50168*/"BLUE BOOK"/* 1F4D8 */,/*50169*/"ORANGE BOOK"/* 1F4D9 */,/*50170*/"BOOKS"/* 1F4DA */, /*50171*/"NAME BADGE"/* 1F4DB */,/*50172*/"SCROLL"/* 1F4DC */,/*50173*/"MEMO"/* 1F4DD */, /*50174*/"TELEPHONE RECEIVER"/* 1F4DE */,/*50175*/"PAGER"/* 1F4DF */,/*50176*/"FAX MACHINE"/* 1F4E0 */, /*50177*/"SATELLITE ANTENNA"/* 1F4E1 */,/*50178*/"PUBLIC ADDRESS LOUDSPEAKER"/* 1F4E2 */, /*50179*/"CHEERING MEGAPHONE"/* 1F4E3 */,/*50180*/"OUTBOX TRAY"/* 1F4E4 */,/*50181*/"INBOX TRAY"/* 1F4E5 */, /*50182*/"PACKAGE"/* 1F4E6 */,/*50183*/"E-MAIL SYMBOL"/* 1F4E7 */,/*50184*/"INCOMING ENVELOPE"/* 1F4E8 */, /*50185*/"ENVELOPE WITH DOWNWARDS ARROW ABOVE"/* 1F4E9 */,/*50186*/"CLOSED MAILBOX WITH LOWERED FLAG"/* 1F4EA */, /*50187*/"CLOSED MAILBOX WITH RAISED FLAG"/* 1F4EB */,/*50188*/"OPEN MAILBOX WITH RAISED FLAG"/* 1F4EC */, /*50189*/"OPEN MAILBOX WITH LOWERED FLAG"/* 1F4ED */,/*50190*/"POSTBOX"/* 1F4EE */,/*50191*/"POSTAL HORN"/* 1F4EF */, /*50192*/"NEWSPAPER"/* 1F4F0 */,/*50193*/"MOBILE PHONE"/* 1F4F1 */, /*50194*/"MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT"/* 1F4F2 */,/*50195*/"VIBRATION MODE"/* 1F4F3 */, /*50196*/"MOBILE PHONE OFF"/* 1F4F4 */,/*50197*/"NO MOBILE PHONES"/* 1F4F5 */,/*50198*/"ANTENNA WITH BARS"/* 1F4F6 */, /*50199*/"CAMERA"/* 1F4F7 */,/*50200*/"CAMERA WITH FLASH"/* 1F4F8 */,/*50201*/"VIDEO CAMERA"/* 1F4F9 */, /*50202*/"TELEVISION"/* 1F4FA */,/*50203*/"RADIO"/* 1F4FB */,/*50204*/"VIDEOCASSETTE"/* 1F4FC */, /*50205*/"FILM PROJECTOR"/* 1F4FD */,/*50206*/"PORTABLE STEREO"/* 1F4FE */,/*50207*/"PRAYER BEADS"/* 1F4FF */, /*50208*/"TWISTED RIGHTWARDS ARROWS"/* 1F500 */, /*50209*/"CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS"/* 1F501 */, /*50210*/"CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY"/* 1F502 */, /*50211*/"CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS"/* 1F503 */, /*50212*/"ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS"/* 1F504 */,/*50213*/"LOW BRIGHTNESS SYMBOL"/* 1F505 */, /*50214*/"HIGH BRIGHTNESS SYMBOL"/* 1F506 */,/*50215*/"SPEAKER WITH CANCELLATION STROKE"/* 1F507 */, /*50216*/"SPEAKER"/* 1F508 */,/*50217*/"SPEAKER WITH ONE SOUND WAVE"/* 1F509 */, /*50218*/"SPEAKER WITH THREE SOUND WAVES"/* 1F50A */,/*50219*/"BATTERY"/* 1F50B */,/*50220*/"ELECTRIC PLUG"/* 1F50C */, /*50221*/"LEFT-POINTING MAGNIFYING GLASS"/* 1F50D */,/*50222*/"RIGHT-POINTING MAGNIFYING GLASS"/* 1F50E */, /*50223*/"LOCK WITH INK PEN"/* 1F50F */,/*50224*/"CLOSED LOCK WITH KEY"/* 1F510 */,/*50225*/"KEY"/* 1F511 */, /*50226*/"LOCK"/* 1F512 */,/*50227*/"OPEN LOCK"/* 1F513 */,/*50228*/"BELL"/* 1F514 */, /*50229*/"BELL WITH CANCELLATION STROKE"/* 1F515 */,/*50230*/"BOOKMARK"/* 1F516 */,/*50231*/"LINK SYMBOL"/* 1F517 */, /*50232*/"RADIO BUTTON"/* 1F518 */,/*50233*/"BACK WITH LEFTWARDS ARROW ABOVE"/* 1F519 */, /*50234*/"END WITH LEFTWARDS ARROW ABOVE"/* 1F51A */, /*50235*/"ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE"/* 1F51B */, /*50236*/"SOON WITH RIGHTWARDS ARROW ABOVE"/* 1F51C */,/*50237*/"TOP WITH UPWARDS ARROW ABOVE"/* 1F51D */, /*50238*/"NO ONE UNDER EIGHTEEN SYMBOL"/* 1F51E */,/*50239*/"KEYCAP TEN"/* 1F51F */, /*50240*/"INPUT SYMBOL FOR LATIN CAPITAL LETTERS"/* 1F520 */,/*50241*/"INPUT SYMBOL FOR LATIN SMALL LETTERS"/* 1F521 */, /*50242*/"INPUT SYMBOL FOR NUMBERS"/* 1F522 */,/*50243*/"INPUT SYMBOL FOR SYMBOLS"/* 1F523 */, /*50244*/"INPUT SYMBOL FOR LATIN LETTERS"/* 1F524 */,/*50245*/"FIRE"/* 1F525 */,/*50246*/"ELECTRIC TORCH"/* 1F526 */, /*50247*/"WRENCH"/* 1F527 */,/*50248*/"HAMMER"/* 1F528 */,/*50249*/"NUT AND BOLT"/* 1F529 */,/*50250*/"HOCHO"/* 1F52A */, /*50251*/"PISTOL"/* 1F52B */,/*50252*/"MICROSCOPE"/* 1F52C */,/*50253*/"TELESCOPE"/* 1F52D */, /*50254*/"CRYSTAL BALL"/* 1F52E */,/*50255*/"SIX POINTED STAR WITH MIDDLE DOT"/* 1F52F */, /*50256*/"JAPANESE SYMBOL FOR BEGINNER"/* 1F530 */,/*50257*/"TRIDENT EMBLEM"/* 1F531 */, /*50258*/"BLACK SQUARE BUTTON"/* 1F532 */,/*50259*/"WHITE SQUARE BUTTON"/* 1F533 */, /*50260*/"LARGE RED CIRCLE"/* 1F534 */,/*50261*/"LARGE BLUE CIRCLE"/* 1F535 */, /*50262*/"LARGE ORANGE DIAMOND"/* 1F536 */,/*50263*/"LARGE BLUE DIAMOND"/* 1F537 */, /*50264*/"SMALL ORANGE DIAMOND"/* 1F538 */,/*50265*/"SMALL BLUE DIAMOND"/* 1F539 */, /*50266*/"UP-POINTING RED TRIANGLE"/* 1F53A */,/*50267*/"DOWN-POINTING RED TRIANGLE"/* 1F53B */, /*50268*/"UP-POINTING SMALL RED TRIANGLE"/* 1F53C */,/*50269*/"DOWN-POINTING SMALL RED TRIANGLE"/* 1F53D */, /*50270*/"LOWER RIGHT SHADOWED WHITE CIRCLE"/* 1F53E */,/*50271*/"UPPER RIGHT SHADOWED WHITE CIRCLE"/* 1F53F */, /*50272*/"CIRCLED CROSS POMMEE"/* 1F540 */,/*50273*/"CROSS POMMEE WITH HALF-CIRCLE BELOW"/* 1F541 */, /*50274*/"CROSS POMMEE"/* 1F542 */,/*50275*/"NOTCHED LEFT SEMICIRCLE WITH THREE DOTS"/* 1F543 */, /*50276*/"NOTCHED RIGHT SEMICIRCLE WITH THREE DOTS"/* 1F544 */,/*50277*/"SYMBOL FOR MARKS CHAPTER"/* 1F545 */, /*50278*/"WHITE LATIN CROSS"/* 1F546 */,/*50279*/"HEAVY LATIN CROSS"/* 1F547 */,/*50280*/"CELTIC CROSS"/* 1F548 */, /*50281*/"OM SYMBOL"/* 1F549 */,/*50282*/"DOVE OF PEACE"/* 1F54A */,/*50283*/"KAABA"/* 1F54B */, /*50284*/"MOSQUE"/* 1F54C */,/*50285*/"SYNAGOGUE"/* 1F54D */,/*50286*/"MENORAH WITH NINE BRANCHES"/* 1F54E */, /*50287*/"BOWL OF HYGIEIA"/* 1F54F */,/*50288*/"CLOCK FACE ONE OCLOCK"/* 1F550 */, /*50289*/"CLOCK FACE TWO OCLOCK"/* 1F551 */,/*50290*/"CLOCK FACE THREE OCLOCK"/* 1F552 */, /*50291*/"CLOCK FACE FOUR OCLOCK"/* 1F553 */,/*50292*/"CLOCK FACE FIVE OCLOCK"/* 1F554 */, /*50293*/"CLOCK FACE SIX OCLOCK"/* 1F555 */,/*50294*/"CLOCK FACE SEVEN OCLOCK"/* 1F556 */, /*50295*/"CLOCK FACE EIGHT OCLOCK"/* 1F557 */,/*50296*/"CLOCK FACE NINE OCLOCK"/* 1F558 */, /*50297*/"CLOCK FACE TEN OCLOCK"/* 1F559 */,/*50298*/"CLOCK FACE ELEVEN OCLOCK"/* 1F55A */, /*50299*/"CLOCK FACE TWELVE OCLOCK"/* 1F55B */,/*50300*/"CLOCK FACE ONE-THIRTY"/* 1F55C */, /*50301*/"CLOCK FACE TWO-THIRTY"/* 1F55D */,/*50302*/"CLOCK FACE THREE-THIRTY"/* 1F55E */, /*50303*/"CLOCK FACE FOUR-THIRTY"/* 1F55F */,/*50304*/"CLOCK FACE FIVE-THIRTY"/* 1F560 */, /*50305*/"CLOCK FACE SIX-THIRTY"/* 1F561 */,/*50306*/"CLOCK FACE SEVEN-THIRTY"/* 1F562 */, /*50307*/"CLOCK FACE EIGHT-THIRTY"/* 1F563 */,/*50308*/"CLOCK FACE NINE-THIRTY"/* 1F564 */, /*50309*/"CLOCK FACE TEN-THIRTY"/* 1F565 */,/*50310*/"CLOCK FACE ELEVEN-THIRTY"/* 1F566 */, /*50311*/"CLOCK FACE TWELVE-THIRTY"/* 1F567 */,/*50312*/"RIGHT SPEAKER"/* 1F568 */, /*50313*/"RIGHT SPEAKER WITH ONE SOUND WAVE"/* 1F569 */,/*50314*/"RIGHT SPEAKER WITH THREE SOUND WAVES"/* 1F56A */, /*50315*/"BULLHORN"/* 1F56B */,/*50316*/"BULLHORN WITH SOUND WAVES"/* 1F56C */,/*50317*/"RINGING BELL"/* 1F56D */, /*50318*/"BOOK"/* 1F56E */,/*50319*/"CANDLE"/* 1F56F */,/*50320*/"MANTELPIECE CLOCK"/* 1F570 */, /*50321*/"BLACK SKULL AND CROSSBONES"/* 1F571 */,/*50322*/"NO PIRACY"/* 1F572 */,/*50323*/"HOLE"/* 1F573 */, /*50324*/"MAN IN BUSINESS SUIT LEVITATING"/* 1F574 */,/*50325*/"SLEUTH OR SPY"/* 1F575 */, /*50326*/"DARK SUNGLASSES"/* 1F576 */,/*50327*/"SPIDER"/* 1F577 */,/*50328*/"SPIDER WEB"/* 1F578 */, /*50329*/"JOYSTICK"/* 1F579 */,/*50330*/"MAN DANCING"/* 1F57A */,/*50331*/"LEFT HAND TELEPHONE RECEIVER"/* 1F57B */, /*50332*/"TELEPHONE RECEIVER WITH PAGE"/* 1F57C */,/*50333*/"RIGHT HAND TELEPHONE RECEIVER"/* 1F57D */, /*50334*/"WHITE TOUCHTONE TELEPHONE"/* 1F57E */,/*50335*/"BLACK TOUCHTONE TELEPHONE"/* 1F57F */, /*50336*/"TELEPHONE ON TOP OF MODEM"/* 1F580 */,/*50337*/"CLAMSHELL MOBILE PHONE"/* 1F581 */, /*50338*/"BACK OF ENVELOPE"/* 1F582 */,/*50339*/"STAMPED ENVELOPE"/* 1F583 */, /*50340*/"ENVELOPE WITH LIGHTNING"/* 1F584 */,/*50341*/"FLYING ENVELOPE"/* 1F585 */, /*50342*/"PEN OVER STAMPED ENVELOPE"/* 1F586 */,/*50343*/"LINKED PAPERCLIPS"/* 1F587 */, /*50344*/"BLACK PUSHPIN"/* 1F588 */,/*50345*/"LOWER LEFT PENCIL"/* 1F589 */, /*50346*/"LOWER LEFT BALLPOINT PEN"/* 1F58A */,/*50347*/"LOWER LEFT FOUNTAIN PEN"/* 1F58B */, /*50348*/"LOWER LEFT PAINTBRUSH"/* 1F58C */,/*50349*/"LOWER LEFT CRAYON"/* 1F58D */, /*50350*/"LEFT WRITING HAND"/* 1F58E */,/*50351*/"TURNED OK HAND SIGN"/* 1F58F */, /*50352*/"RAISED HAND WITH FINGERS SPLAYED"/* 1F590 */,/*50353*/"REVERSED RAISED HAND WITH FINGERS SPLAYED"/* 1F591 */, /*50354*/"REVERSED THUMBS UP SIGN"/* 1F592 */,/*50355*/"REVERSED THUMBS DOWN SIGN"/* 1F593 */, /*50356*/"REVERSED VICTORY HAND"/* 1F594 */,/*50357*/"REVERSED HAND WITH MIDDLE FINGER EXTENDED"/* 1F595 */, /*50358*/"RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS"/* 1F596 */, /*50359*/"WHITE DOWN POINTING LEFT HAND INDEX"/* 1F597 */,/*50360*/"SIDEWAYS WHITE LEFT POINTING INDEX"/* 1F598 */, /*50361*/"SIDEWAYS WHITE RIGHT POINTING INDEX"/* 1F599 */,/*50362*/"SIDEWAYS BLACK LEFT POINTING INDEX"/* 1F59A */, /*50363*/"SIDEWAYS BLACK RIGHT POINTING INDEX"/* 1F59B */,/*50364*/"BLACK LEFT POINTING BACKHAND INDEX"/* 1F59C */, /*50365*/"BLACK RIGHT POINTING BACKHAND INDEX"/* 1F59D */,/*50366*/"SIDEWAYS WHITE UP POINTING INDEX"/* 1F59E */, /*50367*/"SIDEWAYS WHITE DOWN POINTING INDEX"/* 1F59F */,/*50368*/"SIDEWAYS BLACK UP POINTING INDEX"/* 1F5A0 */, /*50369*/"SIDEWAYS BLACK DOWN POINTING INDEX"/* 1F5A1 */,/*50370*/"BLACK UP POINTING BACKHAND INDEX"/* 1F5A2 */, /*50371*/"BLACK DOWN POINTING BACKHAND INDEX"/* 1F5A3 */,/*50372*/"BLACK HEART"/* 1F5A4 */, /*50373*/"DESKTOP COMPUTER"/* 1F5A5 */,/*50374*/"KEYBOARD AND MOUSE"/* 1F5A6 */, /*50375*/"THREE NETWORKED COMPUTERS"/* 1F5A7 */,/*50376*/"PRINTER"/* 1F5A8 */,/*50377*/"POCKET CALCULATOR"/* 1F5A9 */, /*50378*/"BLACK HARD SHELL FLOPPY DISK"/* 1F5AA */,/*50379*/"WHITE HARD SHELL FLOPPY DISK"/* 1F5AB */, /*50380*/"SOFT SHELL FLOPPY DISK"/* 1F5AC */,/*50381*/"TAPE CARTRIDGE"/* 1F5AD */,/*50382*/"WIRED KEYBOARD"/* 1F5AE */, /*50383*/"ONE BUTTON MOUSE"/* 1F5AF */,/*50384*/"TWO BUTTON MOUSE"/* 1F5B0 */,/*50385*/"THREE BUTTON MOUSE"/* 1F5B1 */, /*50386*/"TRACKBALL"/* 1F5B2 */,/*50387*/"OLD PERSONAL COMPUTER"/* 1F5B3 */,/*50388*/"HARD DISK"/* 1F5B4 */, /*50389*/"SCREEN"/* 1F5B5 */,/*50390*/"PRINTER ICON"/* 1F5B6 */,/*50391*/"FAX ICON"/* 1F5B7 */, /*50392*/"OPTICAL DISC ICON"/* 1F5B8 */,/*50393*/"DOCUMENT WITH TEXT"/* 1F5B9 */, /*50394*/"DOCUMENT WITH TEXT AND PICTURE"/* 1F5BA */,/*50395*/"DOCUMENT WITH PICTURE"/* 1F5BB */, /*50396*/"FRAME WITH PICTURE"/* 1F5BC */,/*50397*/"FRAME WITH TILES"/* 1F5BD */,/*50398*/"FRAME WITH AN X"/* 1F5BE */, /*50399*/"BLACK FOLDER"/* 1F5BF */,/*50400*/"FOLDER"/* 1F5C0 */,/*50401*/"OPEN FOLDER"/* 1F5C1 */, /*50402*/"CARD INDEX DIVIDERS"/* 1F5C2 */,/*50403*/"CARD FILE BOX"/* 1F5C3 */,/*50404*/"FILE CABINET"/* 1F5C4 */, /*50405*/"EMPTY NOTE"/* 1F5C5 */,/*50406*/"EMPTY NOTE PAGE"/* 1F5C6 */,/*50407*/"EMPTY NOTE PAD"/* 1F5C7 */, /*50408*/"NOTE"/* 1F5C8 */,/*50409*/"NOTE PAGE"/* 1F5C9 */,/*50410*/"NOTE PAD"/* 1F5CA */, /*50411*/"EMPTY DOCUMENT"/* 1F5CB */,/*50412*/"EMPTY PAGE"/* 1F5CC */,/*50413*/"EMPTY PAGES"/* 1F5CD */, /*50414*/"DOCUMENT"/* 1F5CE */,/*50415*/"PAGE"/* 1F5CF */,/*50416*/"PAGES"/* 1F5D0 */,/*50417*/"WASTEBASKET"/* 1F5D1 */, /*50418*/"SPIRAL NOTE PAD"/* 1F5D2 */,/*50419*/"SPIRAL CALENDAR PAD"/* 1F5D3 */,/*50420*/"DESKTOP WINDOW"/* 1F5D4 */, /*50421*/"MINIMIZE"/* 1F5D5 */,/*50422*/"MAXIMIZE"/* 1F5D6 */,/*50423*/"OVERLAP"/* 1F5D7 */, /*50424*/"CLOCKWISE RIGHT AND LEFT SEMICIRCLE ARROWS"/* 1F5D8 */,/*50425*/"CANCELLATION X"/* 1F5D9 */, /*50426*/"INCREASE FONT SIZE SYMBOL"/* 1F5DA */,/*50427*/"DECREASE FONT SIZE SYMBOL"/* 1F5DB */, /*50428*/"COMPRESSION"/* 1F5DC */,/*50429*/"OLD KEY"/* 1F5DD */,/*50430*/"ROLLED-UP NEWSPAPER"/* 1F5DE */, /*50431*/"PAGE WITH CIRCLED TEXT"/* 1F5DF */,/*50432*/"STOCK CHART"/* 1F5E0 */,/*50433*/"DAGGER KNIFE"/* 1F5E1 */, /*50434*/"LIPS"/* 1F5E2 */,/*50435*/"SPEAKING HEAD IN SILHOUETTE"/* 1F5E3 */,/*50436*/"THREE RAYS ABOVE"/* 1F5E4 */, /*50437*/"THREE RAYS BELOW"/* 1F5E5 */,/*50438*/"THREE RAYS LEFT"/* 1F5E6 */,/*50439*/"THREE RAYS RIGHT"/* 1F5E7 */, /*50440*/"LEFT SPEECH BUBBLE"/* 1F5E8 */,/*50441*/"RIGHT SPEECH BUBBLE"/* 1F5E9 */, /*50442*/"TWO SPEECH BUBBLES"/* 1F5EA */,/*50443*/"THREE SPEECH BUBBLES"/* 1F5EB */, /*50444*/"LEFT THOUGHT BUBBLE"/* 1F5EC */,/*50445*/"RIGHT THOUGHT BUBBLE"/* 1F5ED */, /*50446*/"LEFT ANGER BUBBLE"/* 1F5EE */,/*50447*/"RIGHT ANGER BUBBLE"/* 1F5EF */,/*50448*/"MOOD BUBBLE"/* 1F5F0 */, /*50449*/"LIGHTNING MOOD BUBBLE"/* 1F5F1 */,/*50450*/"LIGHTNING MOOD"/* 1F5F2 */, /*50451*/"BALLOT BOX WITH BALLOT"/* 1F5F3 */,/*50452*/"BALLOT SCRIPT X"/* 1F5F4 */, /*50453*/"BALLOT BOX WITH SCRIPT X"/* 1F5F5 */,/*50454*/"BALLOT BOLD SCRIPT X"/* 1F5F6 */, /*50455*/"BALLOT BOX WITH BOLD SCRIPT X"/* 1F5F7 */,/*50456*/"LIGHT CHECK MARK"/* 1F5F8 */, /*50457*/"BALLOT BOX WITH BOLD CHECK"/* 1F5F9 */,/*50458*/"WORLD MAP"/* 1F5FA */,/*50459*/"MOUNT FUJI"/* 1F5FB */, /*50460*/"TOKYO TOWER"/* 1F5FC */,/*50461*/"STATUE OF LIBERTY"/* 1F5FD */,/*50462*/"SILHOUETTE OF JAPAN"/* 1F5FE */, /*50463*/"MOYAI"/* 1F5FF */,/*50464*/"GRINNING FACE"/* 1F600 */,/*50465*/"GRINNING FACE WITH SMILING EYES"/* 1F601 */, /*50466*/"FACE WITH TEARS OF JOY"/* 1F602 */,/*50467*/"SMILING FACE WITH OPEN MOUTH"/* 1F603 */, /*50468*/"SMILING FACE WITH OPEN MOUTH AND SMILING EYES"/* 1F604 */, /*50469*/"SMILING FACE WITH OPEN MOUTH AND COLD SWEAT"/* 1F605 */, /*50470*/"SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES"/* 1F606 */,/*50471*/"SMILING FACE WITH HALO"/* 1F607 */, /*50472*/"SMILING FACE WITH HORNS"/* 1F608 */,/*50473*/"WINKING FACE"/* 1F609 */, /*50474*/"SMILING FACE WITH SMILING EYES"/* 1F60A */,/*50475*/"FACE SAVOURING DELICIOUS FOOD"/* 1F60B */, /*50476*/"RELIEVED FACE"/* 1F60C */,/*50477*/"SMILING FACE WITH HEART-SHAPED EYES"/* 1F60D */, /*50478*/"SMILING FACE WITH SUNGLASSES"/* 1F60E */,/*50479*/"SMIRKING FACE"/* 1F60F */, /*50480*/"NEUTRAL FACE"/* 1F610 */,/*50481*/"EXPRESSIONLESS FACE"/* 1F611 */,/*50482*/"UNAMUSED FACE"/* 1F612 */, /*50483*/"FACE WITH COLD SWEAT"/* 1F613 */,/*50484*/"PENSIVE FACE"/* 1F614 */,/*50485*/"CONFUSED FACE"/* 1F615 */, /*50486*/"CONFOUNDED FACE"/* 1F616 */,/*50487*/"KISSING FACE"/* 1F617 */,/*50488*/"FACE THROWING A KISS"/* 1F618 */, /*50489*/"KISSING FACE WITH SMILING EYES"/* 1F619 */,/*50490*/"KISSING FACE WITH CLOSED EYES"/* 1F61A */, /*50491*/"FACE WITH STUCK-OUT TONGUE"/* 1F61B */,/*50492*/"FACE WITH STUCK-OUT TONGUE AND WINKING EYE"/* 1F61C */, /*50493*/"FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES"/* 1F61D */,/*50494*/"DISAPPOINTED FACE"/* 1F61E */, /*50495*/"WORRIED FACE"/* 1F61F */,/*50496*/"ANGRY FACE"/* 1F620 */,/*50497*/"POUTING FACE"/* 1F621 */, /*50498*/"CRYING FACE"/* 1F622 */,/*50499*/"PERSEVERING FACE"/* 1F623 */,/*50500*/"FACE WITH LOOK OF TRIUMPH"/* 1F624 */, /*50501*/"DISAPPOINTED BUT RELIEVED FACE"/* 1F625 */,/*50502*/"FROWNING FACE WITH OPEN MOUTH"/* 1F626 */, /*50503*/"ANGUISHED FACE"/* 1F627 */,/*50504*/"FEARFUL FACE"/* 1F628 */,/*50505*/"WEARY FACE"/* 1F629 */, /*50506*/"SLEEPY FACE"/* 1F62A */,/*50507*/"TIRED FACE"/* 1F62B */,/*50508*/"GRIMACING FACE"/* 1F62C */, /*50509*/"LOUDLY CRYING FACE"/* 1F62D */,/*50510*/"FACE WITH OPEN MOUTH"/* 1F62E */,/*50511*/"HUSHED FACE"/* 1F62F */, /*50512*/"FACE WITH OPEN MOUTH AND COLD SWEAT"/* 1F630 */,/*50513*/"FACE SCREAMING IN FEAR"/* 1F631 */, /*50514*/"ASTONISHED FACE"/* 1F632 */,/*50515*/"FLUSHED FACE"/* 1F633 */,/*50516*/"SLEEPING FACE"/* 1F634 */, /*50517*/"DIZZY FACE"/* 1F635 */,/*50518*/"FACE WITHOUT MOUTH"/* 1F636 */,/*50519*/"FACE WITH MEDICAL MASK"/* 1F637 */, /*50520*/"GRINNING CAT FACE WITH SMILING EYES"/* 1F638 */,/*50521*/"CAT FACE WITH TEARS OF JOY"/* 1F639 */, /*50522*/"SMILING CAT FACE WITH OPEN MOUTH"/* 1F63A */,/*50523*/"SMILING CAT FACE WITH HEART-SHAPED EYES"/* 1F63B */, /*50524*/"CAT FACE WITH WRY SMILE"/* 1F63C */,/*50525*/"KISSING CAT FACE WITH CLOSED EYES"/* 1F63D */, /*50526*/"POUTING CAT FACE"/* 1F63E */,/*50527*/"CRYING CAT FACE"/* 1F63F */,/*50528*/"WEARY CAT FACE"/* 1F640 */, /*50529*/"SLIGHTLY FROWNING FACE"/* 1F641 */,/*50530*/"SLIGHTLY SMILING FACE"/* 1F642 */, /*50531*/"UPSIDE-DOWN FACE"/* 1F643 */,/*50532*/"FACE WITH ROLLING EYES"/* 1F644 */, /*50533*/"FACE WITH NO GOOD GESTURE"/* 1F645 */,/*50534*/"FACE WITH OK GESTURE"/* 1F646 */, /*50535*/"PERSON BOWING DEEPLY"/* 1F647 */,/*50536*/"SEE-NO-EVIL MONKEY"/* 1F648 */, /*50537*/"HEAR-NO-EVIL MONKEY"/* 1F649 */,/*50538*/"SPEAK-NO-EVIL MONKEY"/* 1F64A */, /*50539*/"HAPPY PERSON RAISING ONE HAND"/* 1F64B */,/*50540*/"PERSON RAISING BOTH HANDS IN CELEBRATION"/* 1F64C */, /*50541*/"PERSON FROWNING"/* 1F64D */,/*50542*/"PERSON WITH POUTING FACE"/* 1F64E */, /*50543*/"PERSON WITH FOLDED HANDS"/* 1F64F */,/*50544*/"NORTH WEST POINTING LEAF"/* 1F650 */, /*50545*/"SOUTH WEST POINTING LEAF"/* 1F651 */,/*50546*/"NORTH EAST POINTING LEAF"/* 1F652 */, /*50547*/"SOUTH EAST POINTING LEAF"/* 1F653 */,/*50548*/"TURNED NORTH WEST POINTING LEAF"/* 1F654 */, /*50549*/"TURNED SOUTH WEST POINTING LEAF"/* 1F655 */,/*50550*/"TURNED NORTH EAST POINTING LEAF"/* 1F656 */, /*50551*/"TURNED SOUTH EAST POINTING LEAF"/* 1F657 */,/*50552*/"NORTH WEST POINTING VINE LEAF"/* 1F658 */, /*50553*/"SOUTH WEST POINTING VINE LEAF"/* 1F659 */,/*50554*/"NORTH EAST POINTING VINE LEAF"/* 1F65A */, /*50555*/"SOUTH EAST POINTING VINE LEAF"/* 1F65B */,/*50556*/"HEAVY NORTH WEST POINTING VINE LEAF"/* 1F65C */, /*50557*/"HEAVY SOUTH WEST POINTING VINE LEAF"/* 1F65D */,/*50558*/"HEAVY NORTH EAST POINTING VINE LEAF"/* 1F65E */, /*50559*/"HEAVY SOUTH EAST POINTING VINE LEAF"/* 1F65F */,/*50560*/"NORTH WEST POINTING BUD"/* 1F660 */, /*50561*/"SOUTH WEST POINTING BUD"/* 1F661 */,/*50562*/"NORTH EAST POINTING BUD"/* 1F662 */, /*50563*/"SOUTH EAST POINTING BUD"/* 1F663 */,/*50564*/"HEAVY NORTH WEST POINTING BUD"/* 1F664 */, /*50565*/"HEAVY SOUTH WEST POINTING BUD"/* 1F665 */,/*50566*/"HEAVY NORTH EAST POINTING BUD"/* 1F666 */, /*50567*/"HEAVY SOUTH EAST POINTING BUD"/* 1F667 */,/*50568*/"HOLLOW QUILT SQUARE ORNAMENT"/* 1F668 */, /*50569*/"HOLLOW QUILT SQUARE ORNAMENT IN BLACK SQUARE"/* 1F669 */,/*50570*/"SOLID QUILT SQUARE ORNAMENT"/* 1F66A */, /*50571*/"SOLID QUILT SQUARE ORNAMENT IN BLACK SQUARE"/* 1F66B */,/*50572*/"LEFTWARDS ROCKET"/* 1F66C */, /*50573*/"UPWARDS ROCKET"/* 1F66D */,/*50574*/"RIGHTWARDS ROCKET"/* 1F66E */,/*50575*/"DOWNWARDS ROCKET"/* 1F66F */, /*50576*/"SCRIPT LIGATURE ET ORNAMENT"/* 1F670 */,/*50577*/"HEAVY SCRIPT LIGATURE ET ORNAMENT"/* 1F671 */, /*50578*/"LIGATURE OPEN ET ORNAMENT"/* 1F672 */,/*50579*/"HEAVY LIGATURE OPEN ET ORNAMENT"/* 1F673 */, /*50580*/"HEAVY AMPERSAND ORNAMENT"/* 1F674 */,/*50581*/"SWASH AMPERSAND ORNAMENT"/* 1F675 */, /*50582*/"SANS-SERIF HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT"/* 1F676 */, /*50583*/"SANS-SERIF HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT"/* 1F677 */, /*50584*/"SANS-SERIF HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT"/* 1F678 */, /*50585*/"HEAVY INTERROBANG ORNAMENT"/* 1F679 */,/*50586*/"SANS-SERIF INTERROBANG ORNAMENT"/* 1F67A */, /*50587*/"HEAVY SANS-SERIF INTERROBANG ORNAMENT"/* 1F67B */,/*50588*/"VERY HEAVY SOLIDUS"/* 1F67C */, /*50589*/"VERY HEAVY REVERSE SOLIDUS"/* 1F67D */,/*50590*/"CHECKER BOARD"/* 1F67E */, /*50591*/"REVERSE CHECKER BOARD"/* 1F67F */,/*50592*/"ROCKET"/* 1F680 */,/*50593*/"HELICOPTER"/* 1F681 */, /*50594*/"STEAM LOCOMOTIVE"/* 1F682 */,/*50595*/"RAILWAY CAR"/* 1F683 */,/*50596*/"HIGH-SPEED TRAIN"/* 1F684 */, /*50597*/"HIGH-SPEED TRAIN WITH BULLET NOSE"/* 1F685 */,/*50598*/"TRAIN"/* 1F686 */,/*50599*/"METRO"/* 1F687 */, /*50600*/"LIGHT RAIL"/* 1F688 */,/*50601*/"STATION"/* 1F689 */,/*50602*/"TRAM"/* 1F68A */,/*50603*/"TRAM CAR"/* 1F68B */, /*50604*/"BUS"/* 1F68C */,/*50605*/"ONCOMING BUS"/* 1F68D */,/*50606*/"TROLLEYBUS"/* 1F68E */, /*50607*/"BUS STOP"/* 1F68F */,/*50608*/"MINIBUS"/* 1F690 */,/*50609*/"AMBULANCE"/* 1F691 */, /*50610*/"FIRE ENGINE"/* 1F692 */,/*50611*/"POLICE CAR"/* 1F693 */,/*50612*/"ONCOMING POLICE CAR"/* 1F694 */, /*50613*/"TAXI"/* 1F695 */,/*50614*/"ONCOMING TAXI"/* 1F696 */,/*50615*/"AUTOMOBILE"/* 1F697 */, /*50616*/"ONCOMING AUTOMOBILE"/* 1F698 */,/*50617*/"RECREATIONAL VEHICLE"/* 1F699 */, /*50618*/"DELIVERY TRUCK"/* 1F69A */,/*50619*/"ARTICULATED LORRY"/* 1F69B */,/*50620*/"TRACTOR"/* 1F69C */, /*50621*/"MONORAIL"/* 1F69D */,/*50622*/"MOUNTAIN RAILWAY"/* 1F69E */,/*50623*/"SUSPENSION RAILWAY"/* 1F69F */, /*50624*/"MOUNTAIN CABLEWAY"/* 1F6A0 */,/*50625*/"AERIAL TRAMWAY"/* 1F6A1 */,/*50626*/"SHIP"/* 1F6A2 */, /*50627*/"ROWBOAT"/* 1F6A3 */,/*50628*/"SPEEDBOAT"/* 1F6A4 */,/*50629*/"HORIZONTAL TRAFFIC LIGHT"/* 1F6A5 */, /*50630*/"VERTICAL TRAFFIC LIGHT"/* 1F6A6 */,/*50631*/"CONSTRUCTION SIGN"/* 1F6A7 */, /*50632*/"POLICE CARS REVOLVING LIGHT"/* 1F6A8 */,/*50633*/"TRIANGULAR FLAG ON POST"/* 1F6A9 */, /*50634*/"DOOR"/* 1F6AA */,/*50635*/"NO ENTRY SIGN"/* 1F6AB */,/*50636*/"SMOKING SYMBOL"/* 1F6AC */, /*50637*/"NO SMOKING SYMBOL"/* 1F6AD */,/*50638*/"PUT LITTER IN ITS PLACE SYMBOL"/* 1F6AE */, /*50639*/"DO NOT LITTER SYMBOL"/* 1F6AF */,/*50640*/"POTABLE WATER SYMBOL"/* 1F6B0 */, /*50641*/"NON-POTABLE WATER SYMBOL"/* 1F6B1 */,/*50642*/"BICYCLE"/* 1F6B2 */,/*50643*/"NO BICYCLES"/* 1F6B3 */, /*50644*/"BICYCLIST"/* 1F6B4 */,/*50645*/"MOUNTAIN BICYCLIST"/* 1F6B5 */,/*50646*/"PEDESTRIAN"/* 1F6B6 */, /*50647*/"NO PEDESTRIANS"/* 1F6B7 */,/*50648*/"CHILDREN CROSSING"/* 1F6B8 */,/*50649*/"MENS SYMBOL"/* 1F6B9 */, /*50650*/"WOMENS SYMBOL"/* 1F6BA */,/*50651*/"RESTROOM"/* 1F6BB */,/*50652*/"BABY SYMBOL"/* 1F6BC */, /*50653*/"TOILET"/* 1F6BD */,/*50654*/"WATER CLOSET"/* 1F6BE */,/*50655*/"SHOWER"/* 1F6BF */,/*50656*/"BATH"/* 1F6C0 */, /*50657*/"BATHTUB"/* 1F6C1 */,/*50658*/"PASSPORT CONTROL"/* 1F6C2 */,/*50659*/"CUSTOMS"/* 1F6C3 */, /*50660*/"BAGGAGE CLAIM"/* 1F6C4 */,/*50661*/"LEFT LUGGAGE"/* 1F6C5 */, /*50662*/"TRIANGLE WITH ROUNDED CORNERS"/* 1F6C6 */,/*50663*/"PROHIBITED SIGN"/* 1F6C7 */, /*50664*/"CIRCLED INFORMATION SOURCE"/* 1F6C8 */,/*50665*/"BOYS SYMBOL"/* 1F6C9 */,/*50666*/"GIRLS SYMBOL"/* 1F6CA */, /*50667*/"COUCH AND LAMP"/* 1F6CB */,/*50668*/"SLEEPING ACCOMMODATION"/* 1F6CC */,/*50669*/"SHOPPING BAGS"/* 1F6CD */, /*50670*/"BELLHOP BELL"/* 1F6CE */,/*50671*/"BED"/* 1F6CF */,/*50672*/"PLACE OF WORSHIP"/* 1F6D0 */, /*50673*/"OCTAGONAL SIGN"/* 1F6D1 */,/*50674*/"SHOPPING TROLLEY"/* 1F6D2 */,/*50675*/"STUPA"/* 1F6D3 */, /*50676*/"PAGODA"/* 1F6D4 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*50688*/"HAMMER AND WRENCH"/* 1F6E0 */,/*50689*/"SHIELD"/* 1F6E1 */,/*50690*/"OIL DRUM"/* 1F6E2 */, /*50691*/"MOTORWAY"/* 1F6E3 */,/*50692*/"RAILWAY TRACK"/* 1F6E4 */,/*50693*/"MOTOR BOAT"/* 1F6E5 */, /*50694*/"UP-POINTING MILITARY AIRPLANE"/* 1F6E6 */,/*50695*/"UP-POINTING AIRPLANE"/* 1F6E7 */, /*50696*/"UP-POINTING SMALL AIRPLANE"/* 1F6E8 */,/*50697*/"SMALL AIRPLANE"/* 1F6E9 */, /*50698*/"NORTHEAST-POINTING AIRPLANE"/* 1F6EA */,/*50699*/"AIRPLANE DEPARTURE"/* 1F6EB */, /*50700*/"AIRPLANE ARRIVING"/* 1F6EC */,NULL,NULL,NULL,/*50704*/"SATELLITE"/* 1F6F0 */, /*50705*/"ONCOMING FIRE ENGINE"/* 1F6F1 */,/*50706*/"DIESEL LOCOMOTIVE"/* 1F6F2 */,/*50707*/"PASSENGER SHIP"/* 1F6F3 */, /*50708*/"SCOOTER"/* 1F6F4 */,/*50709*/"MOTOR SCOOTER"/* 1F6F5 */,/*50710*/"CANOE"/* 1F6F6 */,/*50711*/"SLED"/* 1F6F7 */, /*50712*/"FLYING SAUCER"/* 1F6F8 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*50720*/"ALCHEMICAL SYMBOL FOR QUINTESSENCE"/* 1F700 */,/*50721*/"ALCHEMICAL SYMBOL FOR AIR"/* 1F701 */, /*50722*/"ALCHEMICAL SYMBOL FOR FIRE"/* 1F702 */,/*50723*/"ALCHEMICAL SYMBOL FOR EARTH"/* 1F703 */, /*50724*/"ALCHEMICAL SYMBOL FOR WATER"/* 1F704 */,/*50725*/"ALCHEMICAL SYMBOL FOR AQUAFORTIS"/* 1F705 */, /*50726*/"ALCHEMICAL SYMBOL FOR AQUA REGIA"/* 1F706 */,/*50727*/"ALCHEMICAL SYMBOL FOR AQUA REGIA-2"/* 1F707 */, /*50728*/"ALCHEMICAL SYMBOL FOR AQUA VITAE"/* 1F708 */,/*50729*/"ALCHEMICAL SYMBOL FOR AQUA VITAE-2"/* 1F709 */, /*50730*/"ALCHEMICAL SYMBOL FOR VINEGAR"/* 1F70A */,/*50731*/"ALCHEMICAL SYMBOL FOR VINEGAR-2"/* 1F70B */, /*50732*/"ALCHEMICAL SYMBOL FOR VINEGAR-3"/* 1F70C */,/*50733*/"ALCHEMICAL SYMBOL FOR SULFUR"/* 1F70D */, /*50734*/"ALCHEMICAL SYMBOL FOR PHILOSOPHERS SULFUR"/* 1F70E */,/*50735*/"ALCHEMICAL SYMBOL FOR BLACK SULFUR"/* 1F70F */, /*50736*/"ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE"/* 1F710 */, /*50737*/"ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-2"/* 1F711 */, /*50738*/"ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-3"/* 1F712 */,/*50739*/"ALCHEMICAL SYMBOL FOR CINNABAR"/* 1F713 */, /*50740*/"ALCHEMICAL SYMBOL FOR SALT"/* 1F714 */,/*50741*/"ALCHEMICAL SYMBOL FOR NITRE"/* 1F715 */, /*50742*/"ALCHEMICAL SYMBOL FOR VITRIOL"/* 1F716 */,/*50743*/"ALCHEMICAL SYMBOL FOR VITRIOL-2"/* 1F717 */, /*50744*/"ALCHEMICAL SYMBOL FOR ROCK SALT"/* 1F718 */,/*50745*/"ALCHEMICAL SYMBOL FOR ROCK SALT-2"/* 1F719 */, /*50746*/"ALCHEMICAL SYMBOL FOR GOLD"/* 1F71A */,/*50747*/"ALCHEMICAL SYMBOL FOR SILVER"/* 1F71B */, /*50748*/"ALCHEMICAL SYMBOL FOR IRON ORE"/* 1F71C */,/*50749*/"ALCHEMICAL SYMBOL FOR IRON ORE-2"/* 1F71D */, /*50750*/"ALCHEMICAL SYMBOL FOR CROCUS OF IRON"/* 1F71E */,/*50751*/"ALCHEMICAL SYMBOL FOR REGULUS OF IRON"/* 1F71F */, /*50752*/"ALCHEMICAL SYMBOL FOR COPPER ORE"/* 1F720 */,/*50753*/"ALCHEMICAL SYMBOL FOR IRON-COPPER ORE"/* 1F721 */, /*50754*/"ALCHEMICAL SYMBOL FOR SUBLIMATE OF COPPER"/* 1F722 */, /*50755*/"ALCHEMICAL SYMBOL FOR CROCUS OF COPPER"/* 1F723 */, /*50756*/"ALCHEMICAL SYMBOL FOR CROCUS OF COPPER-2"/* 1F724 */, /*50757*/"ALCHEMICAL SYMBOL FOR COPPER ANTIMONIATE"/* 1F725 */, /*50758*/"ALCHEMICAL SYMBOL FOR SALT OF COPPER ANTIMONIATE"/* 1F726 */, /*50759*/"ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF COPPER"/* 1F727 */, /*50760*/"ALCHEMICAL SYMBOL FOR VERDIGRIS"/* 1F728 */,/*50761*/"ALCHEMICAL SYMBOL FOR TIN ORE"/* 1F729 */, /*50762*/"ALCHEMICAL SYMBOL FOR LEAD ORE"/* 1F72A */,/*50763*/"ALCHEMICAL SYMBOL FOR ANTIMONY ORE"/* 1F72B */, /*50764*/"ALCHEMICAL SYMBOL FOR SUBLIMATE OF ANTIMONY"/* 1F72C */, /*50765*/"ALCHEMICAL SYMBOL FOR SALT OF ANTIMONY"/* 1F72D */, /*50766*/"ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF ANTIMONY"/* 1F72E */, /*50767*/"ALCHEMICAL SYMBOL FOR VINEGAR OF ANTIMONY"/* 1F72F */, /*50768*/"ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY"/* 1F730 */, /*50769*/"ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY-2"/* 1F731 */,/*50770*/"ALCHEMICAL SYMBOL FOR REGULUS"/* 1F732 */, /*50771*/"ALCHEMICAL SYMBOL FOR REGULUS-2"/* 1F733 */,/*50772*/"ALCHEMICAL SYMBOL FOR REGULUS-3"/* 1F734 */, /*50773*/"ALCHEMICAL SYMBOL FOR REGULUS-4"/* 1F735 */,/*50774*/"ALCHEMICAL SYMBOL FOR ALKALI"/* 1F736 */, /*50775*/"ALCHEMICAL SYMBOL FOR ALKALI-2"/* 1F737 */,/*50776*/"ALCHEMICAL SYMBOL FOR MARCASITE"/* 1F738 */, /*50777*/"ALCHEMICAL SYMBOL FOR SAL-AMMONIAC"/* 1F739 */,/*50778*/"ALCHEMICAL SYMBOL FOR ARSENIC"/* 1F73A */, /*50779*/"ALCHEMICAL SYMBOL FOR REALGAR"/* 1F73B */,/*50780*/"ALCHEMICAL SYMBOL FOR REALGAR-2"/* 1F73C */, /*50781*/"ALCHEMICAL SYMBOL FOR AURIPIGMENT"/* 1F73D */,/*50782*/"ALCHEMICAL SYMBOL FOR BISMUTH ORE"/* 1F73E */, /*50783*/"ALCHEMICAL SYMBOL FOR TARTAR"/* 1F73F */,/*50784*/"ALCHEMICAL SYMBOL FOR TARTAR-2"/* 1F740 */, /*50785*/"ALCHEMICAL SYMBOL FOR QUICK LIME"/* 1F741 */,/*50786*/"ALCHEMICAL SYMBOL FOR BORAX"/* 1F742 */, /*50787*/"ALCHEMICAL SYMBOL FOR BORAX-2"/* 1F743 */,/*50788*/"ALCHEMICAL SYMBOL FOR BORAX-3"/* 1F744 */, /*50789*/"ALCHEMICAL SYMBOL FOR ALUM"/* 1F745 */,/*50790*/"ALCHEMICAL SYMBOL FOR OIL"/* 1F746 */, /*50791*/"ALCHEMICAL SYMBOL FOR SPIRIT"/* 1F747 */,/*50792*/"ALCHEMICAL SYMBOL FOR TINCTURE"/* 1F748 */, /*50793*/"ALCHEMICAL SYMBOL FOR GUM"/* 1F749 */,/*50794*/"ALCHEMICAL SYMBOL FOR WAX"/* 1F74A */, /*50795*/"ALCHEMICAL SYMBOL FOR POWDER"/* 1F74B */,/*50796*/"ALCHEMICAL SYMBOL FOR CALX"/* 1F74C */, /*50797*/"ALCHEMICAL SYMBOL FOR TUTTY"/* 1F74D */,/*50798*/"ALCHEMICAL SYMBOL FOR CAPUT MORTUUM"/* 1F74E */, /*50799*/"ALCHEMICAL SYMBOL FOR SCEPTER OF JOVE"/* 1F74F */,/*50800*/"ALCHEMICAL SYMBOL FOR CADUCEUS"/* 1F750 */, /*50801*/"ALCHEMICAL SYMBOL FOR TRIDENT"/* 1F751 */,/*50802*/"ALCHEMICAL SYMBOL FOR STARRED TRIDENT"/* 1F752 */, /*50803*/"ALCHEMICAL SYMBOL FOR LODESTONE"/* 1F753 */,/*50804*/"ALCHEMICAL SYMBOL FOR SOAP"/* 1F754 */, /*50805*/"ALCHEMICAL SYMBOL FOR URINE"/* 1F755 */,/*50806*/"ALCHEMICAL SYMBOL FOR HORSE DUNG"/* 1F756 */, /*50807*/"ALCHEMICAL SYMBOL FOR ASHES"/* 1F757 */,/*50808*/"ALCHEMICAL SYMBOL FOR POT ASHES"/* 1F758 */, /*50809*/"ALCHEMICAL SYMBOL FOR BRICK"/* 1F759 */,/*50810*/"ALCHEMICAL SYMBOL FOR POWDERED BRICK"/* 1F75A */, /*50811*/"ALCHEMICAL SYMBOL FOR AMALGAM"/* 1F75B */,/*50812*/"ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM"/* 1F75C */, /*50813*/"ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM-2"/* 1F75D */, /*50814*/"ALCHEMICAL SYMBOL FOR SUBLIMATION"/* 1F75E */,/*50815*/"ALCHEMICAL SYMBOL FOR PRECIPITATE"/* 1F75F */, /*50816*/"ALCHEMICAL SYMBOL FOR DISTILL"/* 1F760 */,/*50817*/"ALCHEMICAL SYMBOL FOR DISSOLVE"/* 1F761 */, /*50818*/"ALCHEMICAL SYMBOL FOR DISSOLVE-2"/* 1F762 */,/*50819*/"ALCHEMICAL SYMBOL FOR PURIFY"/* 1F763 */, /*50820*/"ALCHEMICAL SYMBOL FOR PUTREFACTION"/* 1F764 */,/*50821*/"ALCHEMICAL SYMBOL FOR CRUCIBLE"/* 1F765 */, /*50822*/"ALCHEMICAL SYMBOL FOR CRUCIBLE-2"/* 1F766 */,/*50823*/"ALCHEMICAL SYMBOL FOR CRUCIBLE-3"/* 1F767 */, /*50824*/"ALCHEMICAL SYMBOL FOR CRUCIBLE-4"/* 1F768 */,/*50825*/"ALCHEMICAL SYMBOL FOR CRUCIBLE-5"/* 1F769 */, /*50826*/"ALCHEMICAL SYMBOL FOR ALEMBIC"/* 1F76A */,/*50827*/"ALCHEMICAL SYMBOL FOR BATH OF MARY"/* 1F76B */, /*50828*/"ALCHEMICAL SYMBOL FOR BATH OF VAPOURS"/* 1F76C */,/*50829*/"ALCHEMICAL SYMBOL FOR RETORT"/* 1F76D */, /*50830*/"ALCHEMICAL SYMBOL FOR HOUR"/* 1F76E */,/*50831*/"ALCHEMICAL SYMBOL FOR NIGHT"/* 1F76F */, /*50832*/"ALCHEMICAL SYMBOL FOR DAY-NIGHT"/* 1F770 */,/*50833*/"ALCHEMICAL SYMBOL FOR MONTH"/* 1F771 */, /*50834*/"ALCHEMICAL SYMBOL FOR HALF DRAM"/* 1F772 */,/*50835*/"ALCHEMICAL SYMBOL FOR HALF OUNCE"/* 1F773 */,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*50848*/"BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE"/* 1F780 */, /*50849*/"BLACK UP-POINTING ISOSCELES RIGHT TRIANGLE"/* 1F781 */, /*50850*/"BLACK RIGHT-POINTING ISOSCELES RIGHT TRIANGLE"/* 1F782 */, /*50851*/"BLACK DOWN-POINTING ISOSCELES RIGHT TRIANGLE"/* 1F783 */,/*50852*/"BLACK SLIGHTLY SMALL CIRCLE"/* 1F784 */, /*50853*/"MEDIUM BOLD WHITE CIRCLE"/* 1F785 */,/*50854*/"BOLD WHITE CIRCLE"/* 1F786 */, /*50855*/"HEAVY WHITE CIRCLE"/* 1F787 */,/*50856*/"VERY HEAVY WHITE CIRCLE"/* 1F788 */, /*50857*/"EXTREMELY HEAVY WHITE CIRCLE"/* 1F789 */,/*50858*/"WHITE CIRCLE CONTAINING BLACK SMALL CIRCLE"/* 1F78A */, /*50859*/"ROUND TARGET"/* 1F78B */,/*50860*/"BLACK TINY SQUARE"/* 1F78C */, /*50861*/"BLACK SLIGHTLY SMALL SQUARE"/* 1F78D */,/*50862*/"LIGHT WHITE SQUARE"/* 1F78E */, /*50863*/"MEDIUM WHITE SQUARE"/* 1F78F */,/*50864*/"BOLD WHITE SQUARE"/* 1F790 */, /*50865*/"HEAVY WHITE SQUARE"/* 1F791 */,/*50866*/"VERY HEAVY WHITE SQUARE"/* 1F792 */, /*50867*/"EXTREMELY HEAVY WHITE SQUARE"/* 1F793 */,/*50868*/"WHITE SQUARE CONTAINING BLACK VERY SMALL SQUARE"/* 1F794 */, /*50869*/"WHITE SQUARE CONTAINING BLACK MEDIUM SQUARE"/* 1F795 */,/*50870*/"SQUARE TARGET"/* 1F796 */, /*50871*/"BLACK TINY DIAMOND"/* 1F797 */,/*50872*/"BLACK VERY SMALL DIAMOND"/* 1F798 */, /*50873*/"BLACK MEDIUM SMALL DIAMOND"/* 1F799 */,/*50874*/"WHITE DIAMOND CONTAINING BLACK VERY SMALL DIAMOND"/* 1F79A */, /*50875*/"WHITE DIAMOND CONTAINING BLACK MEDIUM DIAMOND"/* 1F79B */,/*50876*/"DIAMOND TARGET"/* 1F79C */, /*50877*/"BLACK TINY LOZENGE"/* 1F79D */,/*50878*/"BLACK VERY SMALL LOZENGE"/* 1F79E */, /*50879*/"BLACK MEDIUM SMALL LOZENGE"/* 1F79F */,/*50880*/"WHITE LOZENGE CONTAINING BLACK SMALL LOZENGE"/* 1F7A0 */, /*50881*/"THIN GREEK CROSS"/* 1F7A1 */,/*50882*/"LIGHT GREEK CROSS"/* 1F7A2 */,/*50883*/"MEDIUM GREEK CROSS"/* 1F7A3 */, /*50884*/"BOLD GREEK CROSS"/* 1F7A4 */,/*50885*/"VERY BOLD GREEK CROSS"/* 1F7A5 */, /*50886*/"VERY HEAVY GREEK CROSS"/* 1F7A6 */,/*50887*/"EXTREMELY HEAVY GREEK CROSS"/* 1F7A7 */, /*50888*/"THIN SALTIRE"/* 1F7A8 */,/*50889*/"LIGHT SALTIRE"/* 1F7A9 */,/*50890*/"MEDIUM SALTIRE"/* 1F7AA */, /*50891*/"BOLD SALTIRE"/* 1F7AB */,/*50892*/"HEAVY SALTIRE"/* 1F7AC */,/*50893*/"VERY HEAVY SALTIRE"/* 1F7AD */, /*50894*/"EXTREMELY HEAVY SALTIRE"/* 1F7AE */,/*50895*/"LIGHT FIVE SPOKED ASTERISK"/* 1F7AF */, /*50896*/"MEDIUM FIVE SPOKED ASTERISK"/* 1F7B0 */,/*50897*/"BOLD FIVE SPOKED ASTERISK"/* 1F7B1 */, /*50898*/"HEAVY FIVE SPOKED ASTERISK"/* 1F7B2 */,/*50899*/"VERY HEAVY FIVE SPOKED ASTERISK"/* 1F7B3 */, /*50900*/"EXTREMELY HEAVY FIVE SPOKED ASTERISK"/* 1F7B4 */,/*50901*/"LIGHT SIX SPOKED ASTERISK"/* 1F7B5 */, /*50902*/"MEDIUM SIX SPOKED ASTERISK"/* 1F7B6 */,/*50903*/"BOLD SIX SPOKED ASTERISK"/* 1F7B7 */, /*50904*/"HEAVY SIX SPOKED ASTERISK"/* 1F7B8 */,/*50905*/"VERY HEAVY SIX SPOKED ASTERISK"/* 1F7B9 */, /*50906*/"EXTREMELY HEAVY SIX SPOKED ASTERISK"/* 1F7BA */,/*50907*/"LIGHT EIGHT SPOKED ASTERISK"/* 1F7BB */, /*50908*/"MEDIUM EIGHT SPOKED ASTERISK"/* 1F7BC */,/*50909*/"BOLD EIGHT SPOKED ASTERISK"/* 1F7BD */, /*50910*/"HEAVY EIGHT SPOKED ASTERISK"/* 1F7BE */,/*50911*/"VERY HEAVY EIGHT SPOKED ASTERISK"/* 1F7BF */, /*50912*/"LIGHT THREE POINTED BLACK STAR"/* 1F7C0 */,/*50913*/"MEDIUM THREE POINTED BLACK STAR"/* 1F7C1 */, /*50914*/"THREE POINTED BLACK STAR"/* 1F7C2 */,/*50915*/"MEDIUM THREE POINTED PINWHEEL STAR"/* 1F7C3 */, /*50916*/"LIGHT FOUR POINTED BLACK STAR"/* 1F7C4 */,/*50917*/"MEDIUM FOUR POINTED BLACK STAR"/* 1F7C5 */, /*50918*/"FOUR POINTED BLACK STAR"/* 1F7C6 */,/*50919*/"MEDIUM FOUR POINTED PINWHEEL STAR"/* 1F7C7 */, /*50920*/"REVERSE LIGHT FOUR POINTED PINWHEEL STAR"/* 1F7C8 */,/*50921*/"LIGHT FIVE POINTED BLACK STAR"/* 1F7C9 */, /*50922*/"HEAVY FIVE POINTED BLACK STAR"/* 1F7CA */,/*50923*/"MEDIUM SIX POINTED BLACK STAR"/* 1F7CB */, /*50924*/"HEAVY SIX POINTED BLACK STAR"/* 1F7CC */,/*50925*/"SIX POINTED PINWHEEL STAR"/* 1F7CD */, /*50926*/"MEDIUM EIGHT POINTED BLACK STAR"/* 1F7CE */,/*50927*/"HEAVY EIGHT POINTED BLACK STAR"/* 1F7CF */, /*50928*/"VERY HEAVY EIGHT POINTED BLACK STAR"/* 1F7D0 */,/*50929*/"HEAVY EIGHT POINTED PINWHEEL STAR"/* 1F7D1 */, /*50930*/"LIGHT TWELVE POINTED BLACK STAR"/* 1F7D2 */,/*50931*/"HEAVY TWELVE POINTED BLACK STAR"/* 1F7D3 */, /*50932*/"HEAVY TWELVE POINTED PINWHEEL STAR"/* 1F7D4 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*50976*/"LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD"/* 1F800 */, /*50977*/"UPWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD"/* 1F801 */, /*50978*/"RIGHTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD"/* 1F802 */, /*50979*/"DOWNWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD"/* 1F803 */, /*50980*/"LEFTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD"/* 1F804 */, /*50981*/"UPWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD"/* 1F805 */, /*50982*/"RIGHTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD"/* 1F806 */, /*50983*/"DOWNWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD"/* 1F807 */, /*50984*/"LEFTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD"/* 1F808 */, /*50985*/"UPWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD"/* 1F809 */, /*50986*/"RIGHTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD"/* 1F80A */, /*50987*/"DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD"/* 1F80B */,NULL,NULL,NULL,NULL, /*50992*/"LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD"/* 1F810 */, /*50993*/"UPWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD"/* 1F811 */, /*50994*/"RIGHTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD"/* 1F812 */, /*50995*/"DOWNWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD"/* 1F813 */, /*50996*/"LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD"/* 1F814 */, /*50997*/"UPWARDS ARROW WITH EQUILATERAL ARROWHEAD"/* 1F815 */, /*50998*/"RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD"/* 1F816 */, /*50999*/"DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD"/* 1F817 */, /*51000*/"HEAVY LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD"/* 1F818 */, /*51001*/"HEAVY UPWARDS ARROW WITH EQUILATERAL ARROWHEAD"/* 1F819 */, /*51002*/"HEAVY RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD"/* 1F81A */, /*51003*/"HEAVY DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD"/* 1F81B */, /*51004*/"HEAVY LEFTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD"/* 1F81C */, /*51005*/"HEAVY UPWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD"/* 1F81D */, /*51006*/"HEAVY RIGHTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD"/* 1F81E */, /*51007*/"HEAVY DOWNWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD"/* 1F81F */, /*51008*/"LEFTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT"/* 1F820 */, /*51009*/"UPWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT"/* 1F821 */, /*51010*/"RIGHTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT"/* 1F822 */, /*51011*/"DOWNWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT"/* 1F823 */, /*51012*/"LEFTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT"/* 1F824 */, /*51013*/"UPWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT"/* 1F825 */, /*51014*/"RIGHTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT"/* 1F826 */, /*51015*/"DOWNWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT"/* 1F827 */, /*51016*/"LEFTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT"/* 1F828 */, /*51017*/"UPWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT"/* 1F829 */, /*51018*/"RIGHTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT"/* 1F82A */, /*51019*/"DOWNWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT"/* 1F82B */, /*51020*/"LEFTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT"/* 1F82C */, /*51021*/"UPWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT"/* 1F82D */, /*51022*/"RIGHTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT"/* 1F82E */, /*51023*/"DOWNWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT"/* 1F82F */, /*51024*/"LEFTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT"/* 1F830 */, /*51025*/"UPWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT"/* 1F831 */, /*51026*/"RIGHTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT"/* 1F832 */, /*51027*/"DOWNWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT"/* 1F833 */, /*51028*/"LEFTWARDS FINGER-POST ARROW"/* 1F834 */,/*51029*/"UPWARDS FINGER-POST ARROW"/* 1F835 */, /*51030*/"RIGHTWARDS FINGER-POST ARROW"/* 1F836 */,/*51031*/"DOWNWARDS FINGER-POST ARROW"/* 1F837 */, /*51032*/"LEFTWARDS SQUARED ARROW"/* 1F838 */,/*51033*/"UPWARDS SQUARED ARROW"/* 1F839 */, /*51034*/"RIGHTWARDS SQUARED ARROW"/* 1F83A */,/*51035*/"DOWNWARDS SQUARED ARROW"/* 1F83B */, /*51036*/"LEFTWARDS COMPRESSED ARROW"/* 1F83C */,/*51037*/"UPWARDS COMPRESSED ARROW"/* 1F83D */, /*51038*/"RIGHTWARDS COMPRESSED ARROW"/* 1F83E */,/*51039*/"DOWNWARDS COMPRESSED ARROW"/* 1F83F */, /*51040*/"LEFTWARDS HEAVY COMPRESSED ARROW"/* 1F840 */,/*51041*/"UPWARDS HEAVY COMPRESSED ARROW"/* 1F841 */, /*51042*/"RIGHTWARDS HEAVY COMPRESSED ARROW"/* 1F842 */,/*51043*/"DOWNWARDS HEAVY COMPRESSED ARROW"/* 1F843 */, /*51044*/"LEFTWARDS HEAVY ARROW"/* 1F844 */,/*51045*/"UPWARDS HEAVY ARROW"/* 1F845 */, /*51046*/"RIGHTWARDS HEAVY ARROW"/* 1F846 */,/*51047*/"DOWNWARDS HEAVY ARROW"/* 1F847 */,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,/*51056*/"LEFTWARDS SANS-SERIF ARROW"/* 1F850 */,/*51057*/"UPWARDS SANS-SERIF ARROW"/* 1F851 */, /*51058*/"RIGHTWARDS SANS-SERIF ARROW"/* 1F852 */,/*51059*/"DOWNWARDS SANS-SERIF ARROW"/* 1F853 */, /*51060*/"NORTH WEST SANS-SERIF ARROW"/* 1F854 */,/*51061*/"NORTH EAST SANS-SERIF ARROW"/* 1F855 */, /*51062*/"SOUTH EAST SANS-SERIF ARROW"/* 1F856 */,/*51063*/"SOUTH WEST SANS-SERIF ARROW"/* 1F857 */, /*51064*/"LEFT RIGHT SANS-SERIF ARROW"/* 1F858 */,/*51065*/"UP DOWN SANS-SERIF ARROW"/* 1F859 */,NULL,NULL,NULL,NULL, NULL,NULL,/*51072*/"WIDE-HEADED LEFTWARDS LIGHT BARB ARROW"/* 1F860 */, /*51073*/"WIDE-HEADED UPWARDS LIGHT BARB ARROW"/* 1F861 */,/*51074*/"WIDE-HEADED RIGHTWARDS LIGHT BARB ARROW"/* 1F862 */, /*51075*/"WIDE-HEADED DOWNWARDS LIGHT BARB ARROW"/* 1F863 */, /*51076*/"WIDE-HEADED NORTH WEST LIGHT BARB ARROW"/* 1F864 */, /*51077*/"WIDE-HEADED NORTH EAST LIGHT BARB ARROW"/* 1F865 */, /*51078*/"WIDE-HEADED SOUTH EAST LIGHT BARB ARROW"/* 1F866 */, /*51079*/"WIDE-HEADED SOUTH WEST LIGHT BARB ARROW"/* 1F867 */,/*51080*/"WIDE-HEADED LEFTWARDS BARB ARROW"/* 1F868 */, /*51081*/"WIDE-HEADED UPWARDS BARB ARROW"/* 1F869 */,/*51082*/"WIDE-HEADED RIGHTWARDS BARB ARROW"/* 1F86A */, /*51083*/"WIDE-HEADED DOWNWARDS BARB ARROW"/* 1F86B */,/*51084*/"WIDE-HEADED NORTH WEST BARB ARROW"/* 1F86C */, /*51085*/"WIDE-HEADED NORTH EAST BARB ARROW"/* 1F86D */,/*51086*/"WIDE-HEADED SOUTH EAST BARB ARROW"/* 1F86E */, /*51087*/"WIDE-HEADED SOUTH WEST BARB ARROW"/* 1F86F */,/*51088*/"WIDE-HEADED LEFTWARDS MEDIUM BARB ARROW"/* 1F870 */, /*51089*/"WIDE-HEADED UPWARDS MEDIUM BARB ARROW"/* 1F871 */, /*51090*/"WIDE-HEADED RIGHTWARDS MEDIUM BARB ARROW"/* 1F872 */, /*51091*/"WIDE-HEADED DOWNWARDS MEDIUM BARB ARROW"/* 1F873 */, /*51092*/"WIDE-HEADED NORTH WEST MEDIUM BARB ARROW"/* 1F874 */, /*51093*/"WIDE-HEADED NORTH EAST MEDIUM BARB ARROW"/* 1F875 */, /*51094*/"WIDE-HEADED SOUTH EAST MEDIUM BARB ARROW"/* 1F876 */, /*51095*/"WIDE-HEADED SOUTH WEST MEDIUM BARB ARROW"/* 1F877 */, /*51096*/"WIDE-HEADED LEFTWARDS HEAVY BARB ARROW"/* 1F878 */,/*51097*/"WIDE-HEADED UPWARDS HEAVY BARB ARROW"/* 1F879 */, /*51098*/"WIDE-HEADED RIGHTWARDS HEAVY BARB ARROW"/* 1F87A */, /*51099*/"WIDE-HEADED DOWNWARDS HEAVY BARB ARROW"/* 1F87B */, /*51100*/"WIDE-HEADED NORTH WEST HEAVY BARB ARROW"/* 1F87C */, /*51101*/"WIDE-HEADED NORTH EAST HEAVY BARB ARROW"/* 1F87D */, /*51102*/"WIDE-HEADED SOUTH EAST HEAVY BARB ARROW"/* 1F87E */, /*51103*/"WIDE-HEADED SOUTH WEST HEAVY BARB ARROW"/* 1F87F */, /*51104*/"WIDE-HEADED LEFTWARDS VERY HEAVY BARB ARROW"/* 1F880 */, /*51105*/"WIDE-HEADED UPWARDS VERY HEAVY BARB ARROW"/* 1F881 */, /*51106*/"WIDE-HEADED RIGHTWARDS VERY HEAVY BARB ARROW"/* 1F882 */, /*51107*/"WIDE-HEADED DOWNWARDS VERY HEAVY BARB ARROW"/* 1F883 */, /*51108*/"WIDE-HEADED NORTH WEST VERY HEAVY BARB ARROW"/* 1F884 */, /*51109*/"WIDE-HEADED NORTH EAST VERY HEAVY BARB ARROW"/* 1F885 */, /*51110*/"WIDE-HEADED SOUTH EAST VERY HEAVY BARB ARROW"/* 1F886 */, /*51111*/"WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW"/* 1F887 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*51120*/"LEFTWARDS TRIANGLE ARROWHEAD"/* 1F890 */,/*51121*/"UPWARDS TRIANGLE ARROWHEAD"/* 1F891 */, /*51122*/"RIGHTWARDS TRIANGLE ARROWHEAD"/* 1F892 */,/*51123*/"DOWNWARDS TRIANGLE ARROWHEAD"/* 1F893 */, /*51124*/"LEFTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD"/* 1F894 */, /*51125*/"UPWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD"/* 1F895 */, /*51126*/"RIGHTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD"/* 1F896 */, /*51127*/"DOWNWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD"/* 1F897 */, /*51128*/"LEFTWARDS ARROW WITH NOTCHED TAIL"/* 1F898 */,/*51129*/"UPWARDS ARROW WITH NOTCHED TAIL"/* 1F899 */, /*51130*/"RIGHTWARDS ARROW WITH NOTCHED TAIL"/* 1F89A */,/*51131*/"DOWNWARDS ARROW WITH NOTCHED TAIL"/* 1F89B */, /*51132*/"HEAVY ARROW SHAFT WIDTH ONE"/* 1F89C */,/*51133*/"HEAVY ARROW SHAFT WIDTH TWO THIRDS"/* 1F89D */, /*51134*/"HEAVY ARROW SHAFT WIDTH ONE HALF"/* 1F89E */,/*51135*/"HEAVY ARROW SHAFT WIDTH ONE THIRD"/* 1F89F */, /*51136*/"LEFTWARDS BOTTOM-SHADED WHITE ARROW"/* 1F8A0 */,/*51137*/"RIGHTWARDS BOTTOM SHADED WHITE ARROW"/* 1F8A1 */, /*51138*/"LEFTWARDS TOP SHADED WHITE ARROW"/* 1F8A2 */,/*51139*/"RIGHTWARDS TOP SHADED WHITE ARROW"/* 1F8A3 */, /*51140*/"LEFTWARDS LEFT-SHADED WHITE ARROW"/* 1F8A4 */,/*51141*/"RIGHTWARDS RIGHT-SHADED WHITE ARROW"/* 1F8A5 */, /*51142*/"LEFTWARDS RIGHT-SHADED WHITE ARROW"/* 1F8A6 */,/*51143*/"RIGHTWARDS LEFT-SHADED WHITE ARROW"/* 1F8A7 */, /*51144*/"LEFTWARDS BACK-TILTED SHADOWED WHITE ARROW"/* 1F8A8 */, /*51145*/"RIGHTWARDS BACK-TILTED SHADOWED WHITE ARROW"/* 1F8A9 */, /*51146*/"LEFTWARDS FRONT-TILTED SHADOWED WHITE ARROW"/* 1F8AA */, /*51147*/"RIGHTWARDS FRONT-TILTED SHADOWED WHITE ARROW"/* 1F8AB */,/*51148*/"WHITE ARROW SHAFT WIDTH ONE"/* 1F8AC */, /*51149*/"WHITE ARROW SHAFT WIDTH TWO THIRDS"/* 1F8AD */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*51232*/"CIRCLED CROSS FORMEE WITH FOUR DOTS"/* 1F900 */,/*51233*/"CIRCLED CROSS FORMEE WITH TWO DOTS"/* 1F901 */, /*51234*/"CIRCLED CROSS FORMEE"/* 1F902 */,/*51235*/"LEFT HALF CIRCLE WITH FOUR DOTS"/* 1F903 */, /*51236*/"LEFT HALF CIRCLE WITH THREE DOTS"/* 1F904 */,/*51237*/"LEFT HALF CIRCLE WITH TWO DOTS"/* 1F905 */, /*51238*/"LEFT HALF CIRCLE WITH DOT"/* 1F906 */,/*51239*/"LEFT HALF CIRCLE"/* 1F907 */, /*51240*/"DOWNWARD FACING HOOK"/* 1F908 */,/*51241*/"DOWNWARD FACING NOTCHED HOOK"/* 1F909 */, /*51242*/"DOWNWARD FACING HOOK WITH DOT"/* 1F90A */,/*51243*/"DOWNWARD FACING NOTCHED HOOK WITH DOT"/* 1F90B */,NULL, NULL,NULL,NULL,/*51248*/"ZIPPER-MOUTH FACE"/* 1F910 */,/*51249*/"MONEY-MOUTH FACE"/* 1F911 */, /*51250*/"FACE WITH THERMOMETER"/* 1F912 */,/*51251*/"NERD FACE"/* 1F913 */,/*51252*/"THINKING FACE"/* 1F914 */, /*51253*/"FACE WITH HEAD-BANDAGE"/* 1F915 */,/*51254*/"ROBOT FACE"/* 1F916 */,/*51255*/"HUGGING FACE"/* 1F917 */, /*51256*/"SIGN OF THE HORNS"/* 1F918 */,/*51257*/"CALL ME HAND"/* 1F919 */,/*51258*/"RAISED BACK OF HAND"/* 1F91A */, /*51259*/"LEFT-FACING FIST"/* 1F91B */,/*51260*/"RIGHT-FACING FIST"/* 1F91C */,/*51261*/"HANDSHAKE"/* 1F91D */, /*51262*/"HAND WITH INDEX AND MIDDLE FINGERS CROSSED"/* 1F91E */,/*51263*/"I LOVE YOU HAND SIGN"/* 1F91F */, /*51264*/"FACE WITH COWBOY HAT"/* 1F920 */,/*51265*/"CLOWN FACE"/* 1F921 */,/*51266*/"NAUSEATED FACE"/* 1F922 */, /*51267*/"ROLLING ON THE FLOOR LAUGHING"/* 1F923 */,/*51268*/"DROOLING FACE"/* 1F924 */,/*51269*/"LYING FACE"/* 1F925 */, /*51270*/"FACE PALM"/* 1F926 */,/*51271*/"SNEEZING FACE"/* 1F927 */,/*51272*/"FACE WITH ONE EYEBROW RAISED"/* 1F928 */, /*51273*/"GRINNING FACE WITH STAR EYES"/* 1F929 */,/*51274*/"GRINNING FACE WITH ONE LARGE AND ONE SMALL EYE"/* 1F92A */, /*51275*/"FACE WITH FINGER COVERING CLOSED LIPS"/* 1F92B */, /*51276*/"SERIOUS FACE WITH SYMBOLS COVERING MOUTH"/* 1F92C */, /*51277*/"SMILING FACE WITH SMILING EYES AND HAND COVERING MOUTH"/* 1F92D */, /*51278*/"FACE WITH OPEN MOUTH VOMITING"/* 1F92E */,/*51279*/"SHOCKED FACE WITH EXPLODING HEAD"/* 1F92F */, /*51280*/"PREGNANT WOMAN"/* 1F930 */,/*51281*/"BREAST-FEEDING"/* 1F931 */,/*51282*/"PALMS UP TOGETHER"/* 1F932 */, /*51283*/"SELFIE"/* 1F933 */,/*51284*/"PRINCE"/* 1F934 */,/*51285*/"MAN IN TUXEDO"/* 1F935 */, /*51286*/"MOTHER CHRISTMAS"/* 1F936 */,/*51287*/"SHRUG"/* 1F937 */,/*51288*/"PERSON DOING CARTWHEEL"/* 1F938 */, /*51289*/"JUGGLING"/* 1F939 */,/*51290*/"FENCER"/* 1F93A */,/*51291*/"MODERN PENTATHLON"/* 1F93B */, /*51292*/"WRESTLERS"/* 1F93C */,/*51293*/"WATER POLO"/* 1F93D */,/*51294*/"HANDBALL"/* 1F93E */,NULL, /*51296*/"WILTED FLOWER"/* 1F940 */,/*51297*/"DRUM WITH DRUMSTICKS"/* 1F941 */,/*51298*/"CLINKING GLASSES"/* 1F942 */, /*51299*/"TUMBLER GLASS"/* 1F943 */,/*51300*/"SPOON"/* 1F944 */,/*51301*/"GOAL NET"/* 1F945 */, /*51302*/"RIFLE"/* 1F946 */,/*51303*/"FIRST PLACE MEDAL"/* 1F947 */,/*51304*/"SECOND PLACE MEDAL"/* 1F948 */, /*51305*/"THIRD PLACE MEDAL"/* 1F949 */,/*51306*/"BOXING GLOVE"/* 1F94A */,/*51307*/"MARTIAL ARTS UNIFORM"/* 1F94B */, /*51308*/"CURLING STONE"/* 1F94C */,NULL,NULL,NULL,/*51312*/"CROISSANT"/* 1F950 */,/*51313*/"AVOCADO"/* 1F951 */, /*51314*/"CUCUMBER"/* 1F952 */,/*51315*/"BACON"/* 1F953 */,/*51316*/"POTATO"/* 1F954 */,/*51317*/"CARROT"/* 1F955 */, /*51318*/"BAGUETTE BREAD"/* 1F956 */,/*51319*/"GREEN SALAD"/* 1F957 */,/*51320*/"SHALLOW PAN OF FOOD"/* 1F958 */, /*51321*/"STUFFED FLATBREAD"/* 1F959 */,/*51322*/"EGG"/* 1F95A */,/*51323*/"GLASS OF MILK"/* 1F95B */, /*51324*/"PEANUTS"/* 1F95C */,/*51325*/"KIWIFRUIT"/* 1F95D */,/*51326*/"PANCAKES"/* 1F95E */, /*51327*/"DUMPLING"/* 1F95F */,/*51328*/"FORTUNE COOKIE"/* 1F960 */,/*51329*/"TAKEOUT BOX"/* 1F961 */, /*51330*/"CHOPSTICKS"/* 1F962 */,/*51331*/"BOWL WITH SPOON"/* 1F963 */,/*51332*/"CUP WITH STRAW"/* 1F964 */, /*51333*/"COCONUT"/* 1F965 */,/*51334*/"BROCCOLI"/* 1F966 */,/*51335*/"PIE"/* 1F967 */,/*51336*/"PRETZEL"/* 1F968 */, /*51337*/"CUT OF MEAT"/* 1F969 */,/*51338*/"SANDWICH"/* 1F96A */,/*51339*/"CANNED FOOD"/* 1F96B */,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*51360*/"CRAB"/* 1F980 */, /*51361*/"LION FACE"/* 1F981 */,/*51362*/"SCORPION"/* 1F982 */,/*51363*/"TURKEY"/* 1F983 */, /*51364*/"UNICORN FACE"/* 1F984 */,/*51365*/"EAGLE"/* 1F985 */,/*51366*/"DUCK"/* 1F986 */,/*51367*/"BAT"/* 1F987 */, /*51368*/"SHARK"/* 1F988 */,/*51369*/"OWL"/* 1F989 */,/*51370*/"FOX FACE"/* 1F98A */,/*51371*/"BUTTERFLY"/* 1F98B */, /*51372*/"DEER"/* 1F98C */,/*51373*/"GORILLA"/* 1F98D */,/*51374*/"LIZARD"/* 1F98E */,/*51375*/"RHINOCEROS"/* 1F98F */, /*51376*/"SHRIMP"/* 1F990 */,/*51377*/"SQUID"/* 1F991 */,/*51378*/"GIRAFFE FACE"/* 1F992 */, /*51379*/"ZEBRA FACE"/* 1F993 */,/*51380*/"HEDGEHOG"/* 1F994 */,/*51381*/"SAUROPOD"/* 1F995 */, /*51382*/"T-REX"/* 1F996 */,/*51383*/"CRICKET"/* 1F997 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,/*51424*/"CHEESE WEDGE"/* 1F9C0 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,/*51440*/"FACE WITH MONOCLE"/* 1F9D0 */,/*51441*/"ADULT"/* 1F9D1 */,/*51442*/"CHILD"/* 1F9D2 */, /*51443*/"OLDER ADULT"/* 1F9D3 */,/*51444*/"BEARDED PERSON"/* 1F9D4 */,/*51445*/"PERSON WITH HEADSCARF"/* 1F9D5 */, /*51446*/"PERSON IN STEAMY ROOM"/* 1F9D6 */,/*51447*/"PERSON CLIMBING"/* 1F9D7 */, /*51448*/"PERSON IN LOTUS POSITION"/* 1F9D8 */,/*51449*/"MAGE"/* 1F9D9 */,/*51450*/"FAIRY"/* 1F9DA */, /*51451*/"VAMPIRE"/* 1F9DB */,/*51452*/"MERPERSON"/* 1F9DC */,/*51453*/"ELF"/* 1F9DD */,/*51454*/"GENIE"/* 1F9DE */, /*51455*/"ZOMBIE"/* 1F9DF */,/*51456*/"BRAIN"/* 1F9E0 */,/*51457*/"ORANGE HEART"/* 1F9E1 */, /*51458*/"BILLED CAP"/* 1F9E2 */,/*51459*/"SCARF"/* 1F9E3 */,/*51460*/"GLOVES"/* 1F9E4 */,/*51461*/"COAT"/* 1F9E5 */, /*51462*/"SOCKS"/* 1F9E6 */,/*51463*/""/* 20000 */, /*51464*/""/* 20001 */,/*51465*/""/* 20002 */,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*51490*/""/* 2001B */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*51515*/""/* 20034 */,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*51540*/""/* 2004D */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*51563*/""/* 20064 */, /*51564*/""/* 20065 */,/*51565*/""/* 200E2 */, /*51566*/""/* 200E3 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*51591*/""/* 200FC */,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*51616*/""/* 20115 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*51628*/""/* 20121 */,/*51629*/""/* 20122 */, /*51630*/""/* 2092A */,/*51631*/""/* 2092B */,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*51656*/""/* 20944 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*51681*/""/* 2095D */,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*51706*/""/* 20976 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*51719*/""/* 20983 */,/*51720*/""/* 20984 */,NULL,NULL,NULL,NULL, NULL,NULL,NULL,/*51728*/""/* 2098C */,/*51729*/""/* 2098D */,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*51744*/""/* 2099C */, /*51745*/""/* 2099D */,/*51746*/""/* 20AEA */, /*51747*/""/* 20AEB */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,/*51765*/""/* 20AFD */,/*51766*/""/* 20AFE */,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*51791*/""/* 20B17 */,NULL,/*51793*/""/* 20B19 */, /*51794*/""/* 20B1A */,/*51795*/""/* 22390 */, /*51796*/""/* 22391 */,/*51797*/""/* 22998 */, /*51798*/""/* 22999 */,/*51799*/""/* 23B1B */, /*51800*/""/* 23B1C */,/*51801*/""/* 2626D */, /*51802*/""/* 2626E */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,/*51844*/""/* 2A700 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, /*51856*/""/* 2B740 */,NULL,NULL,/*51859*/""/* 2B820 */,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*51874*/""/* 2CEB0 */, /*51875*/"CJK COMPATIBILITY IDEOGRAPH-2F800"/* 2F800 */,/*51876*/"CJK COMPATIBILITY IDEOGRAPH-2F801"/* 2F801 */, /*51877*/"CJK COMPATIBILITY IDEOGRAPH-2F802"/* 2F802 */,/*51878*/"CJK COMPATIBILITY IDEOGRAPH-2F803"/* 2F803 */, /*51879*/"CJK COMPATIBILITY IDEOGRAPH-2F804"/* 2F804 */,/*51880*/"CJK COMPATIBILITY IDEOGRAPH-2F805"/* 2F805 */, /*51881*/"CJK COMPATIBILITY IDEOGRAPH-2F806"/* 2F806 */,/*51882*/"CJK COMPATIBILITY IDEOGRAPH-2F807"/* 2F807 */, /*51883*/"CJK COMPATIBILITY IDEOGRAPH-2F808"/* 2F808 */,/*51884*/"CJK COMPATIBILITY IDEOGRAPH-2F809"/* 2F809 */, /*51885*/"CJK COMPATIBILITY IDEOGRAPH-2F80A"/* 2F80A */,/*51886*/"CJK COMPATIBILITY IDEOGRAPH-2F80B"/* 2F80B */, /*51887*/"CJK COMPATIBILITY IDEOGRAPH-2F80C"/* 2F80C */,/*51888*/"CJK COMPATIBILITY IDEOGRAPH-2F80D"/* 2F80D */, /*51889*/"CJK COMPATIBILITY IDEOGRAPH-2F80E"/* 2F80E */,/*51890*/"CJK COMPATIBILITY IDEOGRAPH-2F80F"/* 2F80F */, /*51891*/"CJK COMPATIBILITY IDEOGRAPH-2F810"/* 2F810 */,/*51892*/"CJK COMPATIBILITY IDEOGRAPH-2F811"/* 2F811 */, /*51893*/"CJK COMPATIBILITY IDEOGRAPH-2F812"/* 2F812 */,/*51894*/"CJK COMPATIBILITY IDEOGRAPH-2F813"/* 2F813 */, /*51895*/"CJK COMPATIBILITY IDEOGRAPH-2F814"/* 2F814 */,/*51896*/"CJK COMPATIBILITY IDEOGRAPH-2F815"/* 2F815 */, /*51897*/"CJK COMPATIBILITY IDEOGRAPH-2F816"/* 2F816 */,/*51898*/"CJK COMPATIBILITY IDEOGRAPH-2F817"/* 2F817 */, /*51899*/"CJK COMPATIBILITY IDEOGRAPH-2F818"/* 2F818 */,/*51900*/"CJK COMPATIBILITY IDEOGRAPH-2F819"/* 2F819 */, /*51901*/"CJK COMPATIBILITY IDEOGRAPH-2F81A"/* 2F81A */,/*51902*/"CJK COMPATIBILITY IDEOGRAPH-2F81B"/* 2F81B */, /*51903*/"CJK COMPATIBILITY IDEOGRAPH-2F81C"/* 2F81C */,/*51904*/"CJK COMPATIBILITY IDEOGRAPH-2F81D"/* 2F81D */, /*51905*/"CJK COMPATIBILITY IDEOGRAPH-2F81E"/* 2F81E */,/*51906*/"CJK COMPATIBILITY IDEOGRAPH-2F81F"/* 2F81F */, /*51907*/"CJK COMPATIBILITY IDEOGRAPH-2F820"/* 2F820 */,/*51908*/"CJK COMPATIBILITY IDEOGRAPH-2F821"/* 2F821 */, /*51909*/"CJK COMPATIBILITY IDEOGRAPH-2F822"/* 2F822 */,/*51910*/"CJK COMPATIBILITY IDEOGRAPH-2F823"/* 2F823 */, /*51911*/"CJK COMPATIBILITY IDEOGRAPH-2F824"/* 2F824 */,/*51912*/"CJK COMPATIBILITY IDEOGRAPH-2F825"/* 2F825 */, /*51913*/"CJK COMPATIBILITY IDEOGRAPH-2F826"/* 2F826 */,/*51914*/"CJK COMPATIBILITY IDEOGRAPH-2F827"/* 2F827 */, /*51915*/"CJK COMPATIBILITY IDEOGRAPH-2F828"/* 2F828 */,/*51916*/"CJK COMPATIBILITY IDEOGRAPH-2F829"/* 2F829 */, /*51917*/"CJK COMPATIBILITY IDEOGRAPH-2F82A"/* 2F82A */,/*51918*/"CJK COMPATIBILITY IDEOGRAPH-2F82B"/* 2F82B */, /*51919*/"CJK COMPATIBILITY IDEOGRAPH-2F82C"/* 2F82C */,/*51920*/"CJK COMPATIBILITY IDEOGRAPH-2F82D"/* 2F82D */, /*51921*/"CJK COMPATIBILITY IDEOGRAPH-2F82E"/* 2F82E */,/*51922*/"CJK COMPATIBILITY IDEOGRAPH-2F82F"/* 2F82F */, /*51923*/"CJK COMPATIBILITY IDEOGRAPH-2F830"/* 2F830 */,/*51924*/"CJK COMPATIBILITY IDEOGRAPH-2F831"/* 2F831 */, /*51925*/"CJK COMPATIBILITY IDEOGRAPH-2F832"/* 2F832 */,/*51926*/"CJK COMPATIBILITY IDEOGRAPH-2F833"/* 2F833 */, /*51927*/"CJK COMPATIBILITY IDEOGRAPH-2F834"/* 2F834 */,/*51928*/"CJK COMPATIBILITY IDEOGRAPH-2F835"/* 2F835 */, /*51929*/"CJK COMPATIBILITY IDEOGRAPH-2F836"/* 2F836 */,/*51930*/"CJK COMPATIBILITY IDEOGRAPH-2F837"/* 2F837 */, /*51931*/"CJK COMPATIBILITY IDEOGRAPH-2F838"/* 2F838 */,/*51932*/"CJK COMPATIBILITY IDEOGRAPH-2F839"/* 2F839 */, /*51933*/"CJK COMPATIBILITY IDEOGRAPH-2F83A"/* 2F83A */,/*51934*/"CJK COMPATIBILITY IDEOGRAPH-2F83B"/* 2F83B */, /*51935*/"CJK COMPATIBILITY IDEOGRAPH-2F83C"/* 2F83C */,/*51936*/"CJK COMPATIBILITY IDEOGRAPH-2F83D"/* 2F83D */, /*51937*/"CJK COMPATIBILITY IDEOGRAPH-2F83E"/* 2F83E */,/*51938*/"CJK COMPATIBILITY IDEOGRAPH-2F83F"/* 2F83F */, /*51939*/"CJK COMPATIBILITY IDEOGRAPH-2F840"/* 2F840 */,/*51940*/"CJK COMPATIBILITY IDEOGRAPH-2F841"/* 2F841 */, /*51941*/"CJK COMPATIBILITY IDEOGRAPH-2F842"/* 2F842 */,/*51942*/"CJK COMPATIBILITY IDEOGRAPH-2F843"/* 2F843 */, /*51943*/"CJK COMPATIBILITY IDEOGRAPH-2F844"/* 2F844 */,/*51944*/"CJK COMPATIBILITY IDEOGRAPH-2F845"/* 2F845 */, /*51945*/"CJK COMPATIBILITY IDEOGRAPH-2F846"/* 2F846 */,/*51946*/"CJK COMPATIBILITY IDEOGRAPH-2F847"/* 2F847 */, /*51947*/"CJK COMPATIBILITY IDEOGRAPH-2F848"/* 2F848 */,/*51948*/"CJK COMPATIBILITY IDEOGRAPH-2F849"/* 2F849 */, /*51949*/"CJK COMPATIBILITY IDEOGRAPH-2F84A"/* 2F84A */,/*51950*/"CJK COMPATIBILITY IDEOGRAPH-2F84B"/* 2F84B */, /*51951*/"CJK COMPATIBILITY IDEOGRAPH-2F84C"/* 2F84C */,/*51952*/"CJK COMPATIBILITY IDEOGRAPH-2F84D"/* 2F84D */, /*51953*/"CJK COMPATIBILITY IDEOGRAPH-2F84E"/* 2F84E */,/*51954*/"CJK COMPATIBILITY IDEOGRAPH-2F84F"/* 2F84F */, /*51955*/"CJK COMPATIBILITY IDEOGRAPH-2F850"/* 2F850 */,/*51956*/"CJK COMPATIBILITY IDEOGRAPH-2F851"/* 2F851 */, /*51957*/"CJK COMPATIBILITY IDEOGRAPH-2F852"/* 2F852 */,/*51958*/"CJK COMPATIBILITY IDEOGRAPH-2F853"/* 2F853 */, /*51959*/"CJK COMPATIBILITY IDEOGRAPH-2F854"/* 2F854 */,/*51960*/"CJK COMPATIBILITY IDEOGRAPH-2F855"/* 2F855 */, /*51961*/"CJK COMPATIBILITY IDEOGRAPH-2F856"/* 2F856 */,/*51962*/"CJK COMPATIBILITY IDEOGRAPH-2F857"/* 2F857 */, /*51963*/"CJK COMPATIBILITY IDEOGRAPH-2F858"/* 2F858 */,/*51964*/"CJK COMPATIBILITY IDEOGRAPH-2F859"/* 2F859 */, /*51965*/"CJK COMPATIBILITY IDEOGRAPH-2F85A"/* 2F85A */,/*51966*/"CJK COMPATIBILITY IDEOGRAPH-2F85B"/* 2F85B */, /*51967*/"CJK COMPATIBILITY IDEOGRAPH-2F85C"/* 2F85C */,/*51968*/"CJK COMPATIBILITY IDEOGRAPH-2F85D"/* 2F85D */, /*51969*/"CJK COMPATIBILITY IDEOGRAPH-2F85E"/* 2F85E */,/*51970*/"CJK COMPATIBILITY IDEOGRAPH-2F85F"/* 2F85F */, /*51971*/"CJK COMPATIBILITY IDEOGRAPH-2F860"/* 2F860 */,/*51972*/"CJK COMPATIBILITY IDEOGRAPH-2F861"/* 2F861 */, /*51973*/"CJK COMPATIBILITY IDEOGRAPH-2F862"/* 2F862 */,/*51974*/"CJK COMPATIBILITY IDEOGRAPH-2F863"/* 2F863 */, /*51975*/"CJK COMPATIBILITY IDEOGRAPH-2F864"/* 2F864 */,/*51976*/"CJK COMPATIBILITY IDEOGRAPH-2F865"/* 2F865 */, /*51977*/"CJK COMPATIBILITY IDEOGRAPH-2F866"/* 2F866 */,/*51978*/"CJK COMPATIBILITY IDEOGRAPH-2F867"/* 2F867 */, /*51979*/"CJK COMPATIBILITY IDEOGRAPH-2F868"/* 2F868 */,/*51980*/"CJK COMPATIBILITY IDEOGRAPH-2F869"/* 2F869 */, /*51981*/"CJK COMPATIBILITY IDEOGRAPH-2F86A"/* 2F86A */,/*51982*/"CJK COMPATIBILITY IDEOGRAPH-2F86B"/* 2F86B */, /*51983*/"CJK COMPATIBILITY IDEOGRAPH-2F86C"/* 2F86C */,/*51984*/"CJK COMPATIBILITY IDEOGRAPH-2F86D"/* 2F86D */, /*51985*/"CJK COMPATIBILITY IDEOGRAPH-2F86E"/* 2F86E */,/*51986*/"CJK COMPATIBILITY IDEOGRAPH-2F86F"/* 2F86F */, /*51987*/"CJK COMPATIBILITY IDEOGRAPH-2F870"/* 2F870 */,/*51988*/"CJK COMPATIBILITY IDEOGRAPH-2F871"/* 2F871 */, /*51989*/"CJK COMPATIBILITY IDEOGRAPH-2F872"/* 2F872 */,/*51990*/"CJK COMPATIBILITY IDEOGRAPH-2F873"/* 2F873 */, /*51991*/"CJK COMPATIBILITY IDEOGRAPH-2F874"/* 2F874 */,/*51992*/"CJK COMPATIBILITY IDEOGRAPH-2F875"/* 2F875 */, /*51993*/"CJK COMPATIBILITY IDEOGRAPH-2F876"/* 2F876 */,/*51994*/"CJK COMPATIBILITY IDEOGRAPH-2F877"/* 2F877 */, /*51995*/"CJK COMPATIBILITY IDEOGRAPH-2F878"/* 2F878 */,/*51996*/"CJK COMPATIBILITY IDEOGRAPH-2F879"/* 2F879 */, /*51997*/"CJK COMPATIBILITY IDEOGRAPH-2F87A"/* 2F87A */,/*51998*/"CJK COMPATIBILITY IDEOGRAPH-2F87B"/* 2F87B */, /*51999*/"CJK COMPATIBILITY IDEOGRAPH-2F87C"/* 2F87C */,/*52000*/"CJK COMPATIBILITY IDEOGRAPH-2F87D"/* 2F87D */, /*52001*/"CJK COMPATIBILITY IDEOGRAPH-2F87E"/* 2F87E */,/*52002*/"CJK COMPATIBILITY IDEOGRAPH-2F87F"/* 2F87F */, /*52003*/"CJK COMPATIBILITY IDEOGRAPH-2F880"/* 2F880 */,/*52004*/"CJK COMPATIBILITY IDEOGRAPH-2F881"/* 2F881 */, /*52005*/"CJK COMPATIBILITY IDEOGRAPH-2F882"/* 2F882 */,/*52006*/"CJK COMPATIBILITY IDEOGRAPH-2F883"/* 2F883 */, /*52007*/"CJK COMPATIBILITY IDEOGRAPH-2F884"/* 2F884 */,/*52008*/"CJK COMPATIBILITY IDEOGRAPH-2F885"/* 2F885 */, /*52009*/"CJK COMPATIBILITY IDEOGRAPH-2F886"/* 2F886 */,/*52010*/"CJK COMPATIBILITY IDEOGRAPH-2F887"/* 2F887 */, /*52011*/"CJK COMPATIBILITY IDEOGRAPH-2F888"/* 2F888 */,/*52012*/"CJK COMPATIBILITY IDEOGRAPH-2F889"/* 2F889 */, /*52013*/"CJK COMPATIBILITY IDEOGRAPH-2F88A"/* 2F88A */,/*52014*/"CJK COMPATIBILITY IDEOGRAPH-2F88B"/* 2F88B */, /*52015*/"CJK COMPATIBILITY IDEOGRAPH-2F88C"/* 2F88C */,/*52016*/"CJK COMPATIBILITY IDEOGRAPH-2F88D"/* 2F88D */, /*52017*/"CJK COMPATIBILITY IDEOGRAPH-2F88E"/* 2F88E */,/*52018*/"CJK COMPATIBILITY IDEOGRAPH-2F88F"/* 2F88F */, /*52019*/"CJK COMPATIBILITY IDEOGRAPH-2F890"/* 2F890 */,/*52020*/"CJK COMPATIBILITY IDEOGRAPH-2F891"/* 2F891 */, /*52021*/"CJK COMPATIBILITY IDEOGRAPH-2F892"/* 2F892 */,/*52022*/"CJK COMPATIBILITY IDEOGRAPH-2F893"/* 2F893 */, /*52023*/"CJK COMPATIBILITY IDEOGRAPH-2F894"/* 2F894 */,/*52024*/"CJK COMPATIBILITY IDEOGRAPH-2F895"/* 2F895 */, /*52025*/"CJK COMPATIBILITY IDEOGRAPH-2F896"/* 2F896 */,/*52026*/"CJK COMPATIBILITY IDEOGRAPH-2F897"/* 2F897 */, /*52027*/"CJK COMPATIBILITY IDEOGRAPH-2F898"/* 2F898 */,/*52028*/"CJK COMPATIBILITY IDEOGRAPH-2F899"/* 2F899 */, /*52029*/"CJK COMPATIBILITY IDEOGRAPH-2F89A"/* 2F89A */,/*52030*/"CJK COMPATIBILITY IDEOGRAPH-2F89B"/* 2F89B */, /*52031*/"CJK COMPATIBILITY IDEOGRAPH-2F89C"/* 2F89C */,/*52032*/"CJK COMPATIBILITY IDEOGRAPH-2F89D"/* 2F89D */, /*52033*/"CJK COMPATIBILITY IDEOGRAPH-2F89E"/* 2F89E */,/*52034*/"CJK COMPATIBILITY IDEOGRAPH-2F89F"/* 2F89F */, /*52035*/"CJK COMPATIBILITY IDEOGRAPH-2F8A0"/* 2F8A0 */,/*52036*/"CJK COMPATIBILITY IDEOGRAPH-2F8A1"/* 2F8A1 */, /*52037*/"CJK COMPATIBILITY IDEOGRAPH-2F8A2"/* 2F8A2 */,/*52038*/"CJK COMPATIBILITY IDEOGRAPH-2F8A3"/* 2F8A3 */, /*52039*/"CJK COMPATIBILITY IDEOGRAPH-2F8A4"/* 2F8A4 */,/*52040*/"CJK COMPATIBILITY IDEOGRAPH-2F8A5"/* 2F8A5 */, /*52041*/"CJK COMPATIBILITY IDEOGRAPH-2F8A6"/* 2F8A6 */,/*52042*/"CJK COMPATIBILITY IDEOGRAPH-2F8A7"/* 2F8A7 */, /*52043*/"CJK COMPATIBILITY IDEOGRAPH-2F8A8"/* 2F8A8 */,/*52044*/"CJK COMPATIBILITY IDEOGRAPH-2F8A9"/* 2F8A9 */, /*52045*/"CJK COMPATIBILITY IDEOGRAPH-2F8AA"/* 2F8AA */,/*52046*/"CJK COMPATIBILITY IDEOGRAPH-2F8AB"/* 2F8AB */, /*52047*/"CJK COMPATIBILITY IDEOGRAPH-2F8AC"/* 2F8AC */,/*52048*/"CJK COMPATIBILITY IDEOGRAPH-2F8AD"/* 2F8AD */, /*52049*/"CJK COMPATIBILITY IDEOGRAPH-2F8AE"/* 2F8AE */,/*52050*/"CJK COMPATIBILITY IDEOGRAPH-2F8AF"/* 2F8AF */, /*52051*/"CJK COMPATIBILITY IDEOGRAPH-2F8B0"/* 2F8B0 */,/*52052*/"CJK COMPATIBILITY IDEOGRAPH-2F8B1"/* 2F8B1 */, /*52053*/"CJK COMPATIBILITY IDEOGRAPH-2F8B2"/* 2F8B2 */,/*52054*/"CJK COMPATIBILITY IDEOGRAPH-2F8B3"/* 2F8B3 */, /*52055*/"CJK COMPATIBILITY IDEOGRAPH-2F8B4"/* 2F8B4 */,/*52056*/"CJK COMPATIBILITY IDEOGRAPH-2F8B5"/* 2F8B5 */, /*52057*/"CJK COMPATIBILITY IDEOGRAPH-2F8B6"/* 2F8B6 */,/*52058*/"CJK COMPATIBILITY IDEOGRAPH-2F8B7"/* 2F8B7 */, /*52059*/"CJK COMPATIBILITY IDEOGRAPH-2F8B8"/* 2F8B8 */,/*52060*/"CJK COMPATIBILITY IDEOGRAPH-2F8B9"/* 2F8B9 */, /*52061*/"CJK COMPATIBILITY IDEOGRAPH-2F8BA"/* 2F8BA */,/*52062*/"CJK COMPATIBILITY IDEOGRAPH-2F8BB"/* 2F8BB */, /*52063*/"CJK COMPATIBILITY IDEOGRAPH-2F8BC"/* 2F8BC */,/*52064*/"CJK COMPATIBILITY IDEOGRAPH-2F8BD"/* 2F8BD */, /*52065*/"CJK COMPATIBILITY IDEOGRAPH-2F8BE"/* 2F8BE */,/*52066*/"CJK COMPATIBILITY IDEOGRAPH-2F8BF"/* 2F8BF */, /*52067*/"CJK COMPATIBILITY IDEOGRAPH-2F8C0"/* 2F8C0 */,/*52068*/"CJK COMPATIBILITY IDEOGRAPH-2F8C1"/* 2F8C1 */, /*52069*/"CJK COMPATIBILITY IDEOGRAPH-2F8C2"/* 2F8C2 */,/*52070*/"CJK COMPATIBILITY IDEOGRAPH-2F8C3"/* 2F8C3 */, /*52071*/"CJK COMPATIBILITY IDEOGRAPH-2F8C4"/* 2F8C4 */,/*52072*/"CJK COMPATIBILITY IDEOGRAPH-2F8C5"/* 2F8C5 */, /*52073*/"CJK COMPATIBILITY IDEOGRAPH-2F8C6"/* 2F8C6 */,/*52074*/"CJK COMPATIBILITY IDEOGRAPH-2F8C7"/* 2F8C7 */, /*52075*/"CJK COMPATIBILITY IDEOGRAPH-2F8C8"/* 2F8C8 */,/*52076*/"CJK COMPATIBILITY IDEOGRAPH-2F8C9"/* 2F8C9 */, /*52077*/"CJK COMPATIBILITY IDEOGRAPH-2F8CA"/* 2F8CA */,/*52078*/"CJK COMPATIBILITY IDEOGRAPH-2F8CB"/* 2F8CB */, /*52079*/"CJK COMPATIBILITY IDEOGRAPH-2F8CC"/* 2F8CC */,/*52080*/"CJK COMPATIBILITY IDEOGRAPH-2F8CD"/* 2F8CD */, /*52081*/"CJK COMPATIBILITY IDEOGRAPH-2F8CE"/* 2F8CE */,/*52082*/"CJK COMPATIBILITY IDEOGRAPH-2F8CF"/* 2F8CF */, /*52083*/"CJK COMPATIBILITY IDEOGRAPH-2F8D0"/* 2F8D0 */,/*52084*/"CJK COMPATIBILITY IDEOGRAPH-2F8D1"/* 2F8D1 */, /*52085*/"CJK COMPATIBILITY IDEOGRAPH-2F8D2"/* 2F8D2 */,/*52086*/"CJK COMPATIBILITY IDEOGRAPH-2F8D3"/* 2F8D3 */, /*52087*/"CJK COMPATIBILITY IDEOGRAPH-2F8D4"/* 2F8D4 */,/*52088*/"CJK COMPATIBILITY IDEOGRAPH-2F8D5"/* 2F8D5 */, /*52089*/"CJK COMPATIBILITY IDEOGRAPH-2F8D6"/* 2F8D6 */,/*52090*/"CJK COMPATIBILITY IDEOGRAPH-2F8D7"/* 2F8D7 */, /*52091*/"CJK COMPATIBILITY IDEOGRAPH-2F8D8"/* 2F8D8 */,/*52092*/"CJK COMPATIBILITY IDEOGRAPH-2F8D9"/* 2F8D9 */, /*52093*/"CJK COMPATIBILITY IDEOGRAPH-2F8DA"/* 2F8DA */,/*52094*/"CJK COMPATIBILITY IDEOGRAPH-2F8DB"/* 2F8DB */, /*52095*/"CJK COMPATIBILITY IDEOGRAPH-2F8DC"/* 2F8DC */,/*52096*/"CJK COMPATIBILITY IDEOGRAPH-2F8DD"/* 2F8DD */, /*52097*/"CJK COMPATIBILITY IDEOGRAPH-2F8DE"/* 2F8DE */,/*52098*/"CJK COMPATIBILITY IDEOGRAPH-2F8DF"/* 2F8DF */, /*52099*/"CJK COMPATIBILITY IDEOGRAPH-2F8E0"/* 2F8E0 */,/*52100*/"CJK COMPATIBILITY IDEOGRAPH-2F8E1"/* 2F8E1 */, /*52101*/"CJK COMPATIBILITY IDEOGRAPH-2F8E2"/* 2F8E2 */,/*52102*/"CJK COMPATIBILITY IDEOGRAPH-2F8E3"/* 2F8E3 */, /*52103*/"CJK COMPATIBILITY IDEOGRAPH-2F8E4"/* 2F8E4 */,/*52104*/"CJK COMPATIBILITY IDEOGRAPH-2F8E5"/* 2F8E5 */, /*52105*/"CJK COMPATIBILITY IDEOGRAPH-2F8E6"/* 2F8E6 */,/*52106*/"CJK COMPATIBILITY IDEOGRAPH-2F8E7"/* 2F8E7 */, /*52107*/"CJK COMPATIBILITY IDEOGRAPH-2F8E8"/* 2F8E8 */,/*52108*/"CJK COMPATIBILITY IDEOGRAPH-2F8E9"/* 2F8E9 */, /*52109*/"CJK COMPATIBILITY IDEOGRAPH-2F8EA"/* 2F8EA */,/*52110*/"CJK COMPATIBILITY IDEOGRAPH-2F8EB"/* 2F8EB */, /*52111*/"CJK COMPATIBILITY IDEOGRAPH-2F8EC"/* 2F8EC */,/*52112*/"CJK COMPATIBILITY IDEOGRAPH-2F8ED"/* 2F8ED */, /*52113*/"CJK COMPATIBILITY IDEOGRAPH-2F8EE"/* 2F8EE */,/*52114*/"CJK COMPATIBILITY IDEOGRAPH-2F8EF"/* 2F8EF */, /*52115*/"CJK COMPATIBILITY IDEOGRAPH-2F8F0"/* 2F8F0 */,/*52116*/"CJK COMPATIBILITY IDEOGRAPH-2F8F1"/* 2F8F1 */, /*52117*/"CJK COMPATIBILITY IDEOGRAPH-2F8F2"/* 2F8F2 */,/*52118*/"CJK COMPATIBILITY IDEOGRAPH-2F8F3"/* 2F8F3 */, /*52119*/"CJK COMPATIBILITY IDEOGRAPH-2F8F4"/* 2F8F4 */,/*52120*/"CJK COMPATIBILITY IDEOGRAPH-2F8F5"/* 2F8F5 */, /*52121*/"CJK COMPATIBILITY IDEOGRAPH-2F8F6"/* 2F8F6 */,/*52122*/"CJK COMPATIBILITY IDEOGRAPH-2F8F7"/* 2F8F7 */, /*52123*/"CJK COMPATIBILITY IDEOGRAPH-2F8F8"/* 2F8F8 */,/*52124*/"CJK COMPATIBILITY IDEOGRAPH-2F8F9"/* 2F8F9 */, /*52125*/"CJK COMPATIBILITY IDEOGRAPH-2F8FA"/* 2F8FA */,/*52126*/"CJK COMPATIBILITY IDEOGRAPH-2F8FB"/* 2F8FB */, /*52127*/"CJK COMPATIBILITY IDEOGRAPH-2F8FC"/* 2F8FC */,/*52128*/"CJK COMPATIBILITY IDEOGRAPH-2F8FD"/* 2F8FD */, /*52129*/"CJK COMPATIBILITY IDEOGRAPH-2F8FE"/* 2F8FE */,/*52130*/"CJK COMPATIBILITY IDEOGRAPH-2F8FF"/* 2F8FF */, /*52131*/"CJK COMPATIBILITY IDEOGRAPH-2F900"/* 2F900 */,/*52132*/"CJK COMPATIBILITY IDEOGRAPH-2F901"/* 2F901 */, /*52133*/"CJK COMPATIBILITY IDEOGRAPH-2F902"/* 2F902 */,/*52134*/"CJK COMPATIBILITY IDEOGRAPH-2F903"/* 2F903 */, /*52135*/"CJK COMPATIBILITY IDEOGRAPH-2F904"/* 2F904 */,/*52136*/"CJK COMPATIBILITY IDEOGRAPH-2F905"/* 2F905 */, /*52137*/"CJK COMPATIBILITY IDEOGRAPH-2F906"/* 2F906 */,/*52138*/"CJK COMPATIBILITY IDEOGRAPH-2F907"/* 2F907 */, /*52139*/"CJK COMPATIBILITY IDEOGRAPH-2F908"/* 2F908 */,/*52140*/"CJK COMPATIBILITY IDEOGRAPH-2F909"/* 2F909 */, /*52141*/"CJK COMPATIBILITY IDEOGRAPH-2F90A"/* 2F90A */,/*52142*/"CJK COMPATIBILITY IDEOGRAPH-2F90B"/* 2F90B */, /*52143*/"CJK COMPATIBILITY IDEOGRAPH-2F90C"/* 2F90C */,/*52144*/"CJK COMPATIBILITY IDEOGRAPH-2F90D"/* 2F90D */, /*52145*/"CJK COMPATIBILITY IDEOGRAPH-2F90E"/* 2F90E */,/*52146*/"CJK COMPATIBILITY IDEOGRAPH-2F90F"/* 2F90F */, /*52147*/"CJK COMPATIBILITY IDEOGRAPH-2F910"/* 2F910 */,/*52148*/"CJK COMPATIBILITY IDEOGRAPH-2F911"/* 2F911 */, /*52149*/"CJK COMPATIBILITY IDEOGRAPH-2F912"/* 2F912 */,/*52150*/"CJK COMPATIBILITY IDEOGRAPH-2F913"/* 2F913 */, /*52151*/"CJK COMPATIBILITY IDEOGRAPH-2F914"/* 2F914 */,/*52152*/"CJK COMPATIBILITY IDEOGRAPH-2F915"/* 2F915 */, /*52153*/"CJK COMPATIBILITY IDEOGRAPH-2F916"/* 2F916 */,/*52154*/"CJK COMPATIBILITY IDEOGRAPH-2F917"/* 2F917 */, /*52155*/"CJK COMPATIBILITY IDEOGRAPH-2F918"/* 2F918 */,/*52156*/"CJK COMPATIBILITY IDEOGRAPH-2F919"/* 2F919 */, /*52157*/"CJK COMPATIBILITY IDEOGRAPH-2F91A"/* 2F91A */,/*52158*/"CJK COMPATIBILITY IDEOGRAPH-2F91B"/* 2F91B */, /*52159*/"CJK COMPATIBILITY IDEOGRAPH-2F91C"/* 2F91C */,/*52160*/"CJK COMPATIBILITY IDEOGRAPH-2F91D"/* 2F91D */, /*52161*/"CJK COMPATIBILITY IDEOGRAPH-2F91E"/* 2F91E */,/*52162*/"CJK COMPATIBILITY IDEOGRAPH-2F91F"/* 2F91F */, /*52163*/"CJK COMPATIBILITY IDEOGRAPH-2F920"/* 2F920 */,/*52164*/"CJK COMPATIBILITY IDEOGRAPH-2F921"/* 2F921 */, /*52165*/"CJK COMPATIBILITY IDEOGRAPH-2F922"/* 2F922 */,/*52166*/"CJK COMPATIBILITY IDEOGRAPH-2F923"/* 2F923 */, /*52167*/"CJK COMPATIBILITY IDEOGRAPH-2F924"/* 2F924 */,/*52168*/"CJK COMPATIBILITY IDEOGRAPH-2F925"/* 2F925 */, /*52169*/"CJK COMPATIBILITY IDEOGRAPH-2F926"/* 2F926 */,/*52170*/"CJK COMPATIBILITY IDEOGRAPH-2F927"/* 2F927 */, /*52171*/"CJK COMPATIBILITY IDEOGRAPH-2F928"/* 2F928 */,/*52172*/"CJK COMPATIBILITY IDEOGRAPH-2F929"/* 2F929 */, /*52173*/"CJK COMPATIBILITY IDEOGRAPH-2F92A"/* 2F92A */,/*52174*/"CJK COMPATIBILITY IDEOGRAPH-2F92B"/* 2F92B */, /*52175*/"CJK COMPATIBILITY IDEOGRAPH-2F92C"/* 2F92C */,/*52176*/"CJK COMPATIBILITY IDEOGRAPH-2F92D"/* 2F92D */, /*52177*/"CJK COMPATIBILITY IDEOGRAPH-2F92E"/* 2F92E */,/*52178*/"CJK COMPATIBILITY IDEOGRAPH-2F92F"/* 2F92F */, /*52179*/"CJK COMPATIBILITY IDEOGRAPH-2F930"/* 2F930 */,/*52180*/"CJK COMPATIBILITY IDEOGRAPH-2F931"/* 2F931 */, /*52181*/"CJK COMPATIBILITY IDEOGRAPH-2F932"/* 2F932 */,/*52182*/"CJK COMPATIBILITY IDEOGRAPH-2F933"/* 2F933 */, /*52183*/"CJK COMPATIBILITY IDEOGRAPH-2F934"/* 2F934 */,/*52184*/"CJK COMPATIBILITY IDEOGRAPH-2F935"/* 2F935 */, /*52185*/"CJK COMPATIBILITY IDEOGRAPH-2F936"/* 2F936 */,/*52186*/"CJK COMPATIBILITY IDEOGRAPH-2F937"/* 2F937 */, /*52187*/"CJK COMPATIBILITY IDEOGRAPH-2F938"/* 2F938 */,/*52188*/"CJK COMPATIBILITY IDEOGRAPH-2F939"/* 2F939 */, /*52189*/"CJK COMPATIBILITY IDEOGRAPH-2F93A"/* 2F93A */,/*52190*/"CJK COMPATIBILITY IDEOGRAPH-2F93B"/* 2F93B */, /*52191*/"CJK COMPATIBILITY IDEOGRAPH-2F93C"/* 2F93C */,/*52192*/"CJK COMPATIBILITY IDEOGRAPH-2F93D"/* 2F93D */, /*52193*/"CJK COMPATIBILITY IDEOGRAPH-2F93E"/* 2F93E */,/*52194*/"CJK COMPATIBILITY IDEOGRAPH-2F93F"/* 2F93F */, /*52195*/"CJK COMPATIBILITY IDEOGRAPH-2F940"/* 2F940 */,/*52196*/"CJK COMPATIBILITY IDEOGRAPH-2F941"/* 2F941 */, /*52197*/"CJK COMPATIBILITY IDEOGRAPH-2F942"/* 2F942 */,/*52198*/"CJK COMPATIBILITY IDEOGRAPH-2F943"/* 2F943 */, /*52199*/"CJK COMPATIBILITY IDEOGRAPH-2F944"/* 2F944 */,/*52200*/"CJK COMPATIBILITY IDEOGRAPH-2F945"/* 2F945 */, /*52201*/"CJK COMPATIBILITY IDEOGRAPH-2F946"/* 2F946 */,/*52202*/"CJK COMPATIBILITY IDEOGRAPH-2F947"/* 2F947 */, /*52203*/"CJK COMPATIBILITY IDEOGRAPH-2F948"/* 2F948 */,/*52204*/"CJK COMPATIBILITY IDEOGRAPH-2F949"/* 2F949 */, /*52205*/"CJK COMPATIBILITY IDEOGRAPH-2F94A"/* 2F94A */,/*52206*/"CJK COMPATIBILITY IDEOGRAPH-2F94B"/* 2F94B */, /*52207*/"CJK COMPATIBILITY IDEOGRAPH-2F94C"/* 2F94C */,/*52208*/"CJK COMPATIBILITY IDEOGRAPH-2F94D"/* 2F94D */, /*52209*/"CJK COMPATIBILITY IDEOGRAPH-2F94E"/* 2F94E */,/*52210*/"CJK COMPATIBILITY IDEOGRAPH-2F94F"/* 2F94F */, /*52211*/"CJK COMPATIBILITY IDEOGRAPH-2F950"/* 2F950 */,/*52212*/"CJK COMPATIBILITY IDEOGRAPH-2F951"/* 2F951 */, /*52213*/"CJK COMPATIBILITY IDEOGRAPH-2F952"/* 2F952 */,/*52214*/"CJK COMPATIBILITY IDEOGRAPH-2F953"/* 2F953 */, /*52215*/"CJK COMPATIBILITY IDEOGRAPH-2F954"/* 2F954 */,/*52216*/"CJK COMPATIBILITY IDEOGRAPH-2F955"/* 2F955 */, /*52217*/"CJK COMPATIBILITY IDEOGRAPH-2F956"/* 2F956 */,/*52218*/"CJK COMPATIBILITY IDEOGRAPH-2F957"/* 2F957 */, /*52219*/"CJK COMPATIBILITY IDEOGRAPH-2F958"/* 2F958 */,/*52220*/"CJK COMPATIBILITY IDEOGRAPH-2F959"/* 2F959 */, /*52221*/"CJK COMPATIBILITY IDEOGRAPH-2F95A"/* 2F95A */,/*52222*/"CJK COMPATIBILITY IDEOGRAPH-2F95B"/* 2F95B */, /*52223*/"CJK COMPATIBILITY IDEOGRAPH-2F95C"/* 2F95C */,/*52224*/"CJK COMPATIBILITY IDEOGRAPH-2F95D"/* 2F95D */, /*52225*/"CJK COMPATIBILITY IDEOGRAPH-2F95E"/* 2F95E */,/*52226*/"CJK COMPATIBILITY IDEOGRAPH-2F95F"/* 2F95F */, /*52227*/"CJK COMPATIBILITY IDEOGRAPH-2F960"/* 2F960 */,/*52228*/"CJK COMPATIBILITY IDEOGRAPH-2F961"/* 2F961 */, /*52229*/"CJK COMPATIBILITY IDEOGRAPH-2F962"/* 2F962 */,/*52230*/"CJK COMPATIBILITY IDEOGRAPH-2F963"/* 2F963 */, /*52231*/"CJK COMPATIBILITY IDEOGRAPH-2F964"/* 2F964 */,/*52232*/"CJK COMPATIBILITY IDEOGRAPH-2F965"/* 2F965 */, /*52233*/"CJK COMPATIBILITY IDEOGRAPH-2F966"/* 2F966 */,/*52234*/"CJK COMPATIBILITY IDEOGRAPH-2F967"/* 2F967 */, /*52235*/"CJK COMPATIBILITY IDEOGRAPH-2F968"/* 2F968 */,/*52236*/"CJK COMPATIBILITY IDEOGRAPH-2F969"/* 2F969 */, /*52237*/"CJK COMPATIBILITY IDEOGRAPH-2F96A"/* 2F96A */,/*52238*/"CJK COMPATIBILITY IDEOGRAPH-2F96B"/* 2F96B */, /*52239*/"CJK COMPATIBILITY IDEOGRAPH-2F96C"/* 2F96C */,/*52240*/"CJK COMPATIBILITY IDEOGRAPH-2F96D"/* 2F96D */, /*52241*/"CJK COMPATIBILITY IDEOGRAPH-2F96E"/* 2F96E */,/*52242*/"CJK COMPATIBILITY IDEOGRAPH-2F96F"/* 2F96F */, /*52243*/"CJK COMPATIBILITY IDEOGRAPH-2F970"/* 2F970 */,/*52244*/"CJK COMPATIBILITY IDEOGRAPH-2F971"/* 2F971 */, /*52245*/"CJK COMPATIBILITY IDEOGRAPH-2F972"/* 2F972 */,/*52246*/"CJK COMPATIBILITY IDEOGRAPH-2F973"/* 2F973 */, /*52247*/"CJK COMPATIBILITY IDEOGRAPH-2F974"/* 2F974 */,/*52248*/"CJK COMPATIBILITY IDEOGRAPH-2F975"/* 2F975 */, /*52249*/"CJK COMPATIBILITY IDEOGRAPH-2F976"/* 2F976 */,/*52250*/"CJK COMPATIBILITY IDEOGRAPH-2F977"/* 2F977 */, /*52251*/"CJK COMPATIBILITY IDEOGRAPH-2F978"/* 2F978 */,/*52252*/"CJK COMPATIBILITY IDEOGRAPH-2F979"/* 2F979 */, /*52253*/"CJK COMPATIBILITY IDEOGRAPH-2F97A"/* 2F97A */,/*52254*/"CJK COMPATIBILITY IDEOGRAPH-2F97B"/* 2F97B */, /*52255*/"CJK COMPATIBILITY IDEOGRAPH-2F97C"/* 2F97C */,/*52256*/"CJK COMPATIBILITY IDEOGRAPH-2F97D"/* 2F97D */, /*52257*/"CJK COMPATIBILITY IDEOGRAPH-2F97E"/* 2F97E */,/*52258*/"CJK COMPATIBILITY IDEOGRAPH-2F97F"/* 2F97F */, /*52259*/"CJK COMPATIBILITY IDEOGRAPH-2F980"/* 2F980 */,/*52260*/"CJK COMPATIBILITY IDEOGRAPH-2F981"/* 2F981 */, /*52261*/"CJK COMPATIBILITY IDEOGRAPH-2F982"/* 2F982 */,/*52262*/"CJK COMPATIBILITY IDEOGRAPH-2F983"/* 2F983 */, /*52263*/"CJK COMPATIBILITY IDEOGRAPH-2F984"/* 2F984 */,/*52264*/"CJK COMPATIBILITY IDEOGRAPH-2F985"/* 2F985 */, /*52265*/"CJK COMPATIBILITY IDEOGRAPH-2F986"/* 2F986 */,/*52266*/"CJK COMPATIBILITY IDEOGRAPH-2F987"/* 2F987 */, /*52267*/"CJK COMPATIBILITY IDEOGRAPH-2F988"/* 2F988 */,/*52268*/"CJK COMPATIBILITY IDEOGRAPH-2F989"/* 2F989 */, /*52269*/"CJK COMPATIBILITY IDEOGRAPH-2F98A"/* 2F98A */,/*52270*/"CJK COMPATIBILITY IDEOGRAPH-2F98B"/* 2F98B */, /*52271*/"CJK COMPATIBILITY IDEOGRAPH-2F98C"/* 2F98C */,/*52272*/"CJK COMPATIBILITY IDEOGRAPH-2F98D"/* 2F98D */, /*52273*/"CJK COMPATIBILITY IDEOGRAPH-2F98E"/* 2F98E */,/*52274*/"CJK COMPATIBILITY IDEOGRAPH-2F98F"/* 2F98F */, /*52275*/"CJK COMPATIBILITY IDEOGRAPH-2F990"/* 2F990 */,/*52276*/"CJK COMPATIBILITY IDEOGRAPH-2F991"/* 2F991 */, /*52277*/"CJK COMPATIBILITY IDEOGRAPH-2F992"/* 2F992 */,/*52278*/"CJK COMPATIBILITY IDEOGRAPH-2F993"/* 2F993 */, /*52279*/"CJK COMPATIBILITY IDEOGRAPH-2F994"/* 2F994 */,/*52280*/"CJK COMPATIBILITY IDEOGRAPH-2F995"/* 2F995 */, /*52281*/"CJK COMPATIBILITY IDEOGRAPH-2F996"/* 2F996 */,/*52282*/"CJK COMPATIBILITY IDEOGRAPH-2F997"/* 2F997 */, /*52283*/"CJK COMPATIBILITY IDEOGRAPH-2F998"/* 2F998 */,/*52284*/"CJK COMPATIBILITY IDEOGRAPH-2F999"/* 2F999 */, /*52285*/"CJK COMPATIBILITY IDEOGRAPH-2F99A"/* 2F99A */,/*52286*/"CJK COMPATIBILITY IDEOGRAPH-2F99B"/* 2F99B */, /*52287*/"CJK COMPATIBILITY IDEOGRAPH-2F99C"/* 2F99C */,/*52288*/"CJK COMPATIBILITY IDEOGRAPH-2F99D"/* 2F99D */, /*52289*/"CJK COMPATIBILITY IDEOGRAPH-2F99E"/* 2F99E */,/*52290*/"CJK COMPATIBILITY IDEOGRAPH-2F99F"/* 2F99F */, /*52291*/"CJK COMPATIBILITY IDEOGRAPH-2F9A0"/* 2F9A0 */,/*52292*/"CJK COMPATIBILITY IDEOGRAPH-2F9A1"/* 2F9A1 */, /*52293*/"CJK COMPATIBILITY IDEOGRAPH-2F9A2"/* 2F9A2 */,/*52294*/"CJK COMPATIBILITY IDEOGRAPH-2F9A3"/* 2F9A3 */, /*52295*/"CJK COMPATIBILITY IDEOGRAPH-2F9A4"/* 2F9A4 */,/*52296*/"CJK COMPATIBILITY IDEOGRAPH-2F9A5"/* 2F9A5 */, /*52297*/"CJK COMPATIBILITY IDEOGRAPH-2F9A6"/* 2F9A6 */,/*52298*/"CJK COMPATIBILITY IDEOGRAPH-2F9A7"/* 2F9A7 */, /*52299*/"CJK COMPATIBILITY IDEOGRAPH-2F9A8"/* 2F9A8 */,/*52300*/"CJK COMPATIBILITY IDEOGRAPH-2F9A9"/* 2F9A9 */, /*52301*/"CJK COMPATIBILITY IDEOGRAPH-2F9AA"/* 2F9AA */,/*52302*/"CJK COMPATIBILITY IDEOGRAPH-2F9AB"/* 2F9AB */, /*52303*/"CJK COMPATIBILITY IDEOGRAPH-2F9AC"/* 2F9AC */,/*52304*/"CJK COMPATIBILITY IDEOGRAPH-2F9AD"/* 2F9AD */, /*52305*/"CJK COMPATIBILITY IDEOGRAPH-2F9AE"/* 2F9AE */,/*52306*/"CJK COMPATIBILITY IDEOGRAPH-2F9AF"/* 2F9AF */, /*52307*/"CJK COMPATIBILITY IDEOGRAPH-2F9B0"/* 2F9B0 */,/*52308*/"CJK COMPATIBILITY IDEOGRAPH-2F9B1"/* 2F9B1 */, /*52309*/"CJK COMPATIBILITY IDEOGRAPH-2F9B2"/* 2F9B2 */,/*52310*/"CJK COMPATIBILITY IDEOGRAPH-2F9B3"/* 2F9B3 */, /*52311*/"CJK COMPATIBILITY IDEOGRAPH-2F9B4"/* 2F9B4 */,/*52312*/"CJK COMPATIBILITY IDEOGRAPH-2F9B5"/* 2F9B5 */, /*52313*/"CJK COMPATIBILITY IDEOGRAPH-2F9B6"/* 2F9B6 */,/*52314*/"CJK COMPATIBILITY IDEOGRAPH-2F9B7"/* 2F9B7 */, /*52315*/"CJK COMPATIBILITY IDEOGRAPH-2F9B8"/* 2F9B8 */,/*52316*/"CJK COMPATIBILITY IDEOGRAPH-2F9B9"/* 2F9B9 */, /*52317*/"CJK COMPATIBILITY IDEOGRAPH-2F9BA"/* 2F9BA */,/*52318*/"CJK COMPATIBILITY IDEOGRAPH-2F9BB"/* 2F9BB */, /*52319*/"CJK COMPATIBILITY IDEOGRAPH-2F9BC"/* 2F9BC */,/*52320*/"CJK COMPATIBILITY IDEOGRAPH-2F9BD"/* 2F9BD */, /*52321*/"CJK COMPATIBILITY IDEOGRAPH-2F9BE"/* 2F9BE */,/*52322*/"CJK COMPATIBILITY IDEOGRAPH-2F9BF"/* 2F9BF */, /*52323*/"CJK COMPATIBILITY IDEOGRAPH-2F9C0"/* 2F9C0 */,/*52324*/"CJK COMPATIBILITY IDEOGRAPH-2F9C1"/* 2F9C1 */, /*52325*/"CJK COMPATIBILITY IDEOGRAPH-2F9C2"/* 2F9C2 */,/*52326*/"CJK COMPATIBILITY IDEOGRAPH-2F9C3"/* 2F9C3 */, /*52327*/"CJK COMPATIBILITY IDEOGRAPH-2F9C4"/* 2F9C4 */,/*52328*/"CJK COMPATIBILITY IDEOGRAPH-2F9C5"/* 2F9C5 */, /*52329*/"CJK COMPATIBILITY IDEOGRAPH-2F9C6"/* 2F9C6 */,/*52330*/"CJK COMPATIBILITY IDEOGRAPH-2F9C7"/* 2F9C7 */, /*52331*/"CJK COMPATIBILITY IDEOGRAPH-2F9C8"/* 2F9C8 */,/*52332*/"CJK COMPATIBILITY IDEOGRAPH-2F9C9"/* 2F9C9 */, /*52333*/"CJK COMPATIBILITY IDEOGRAPH-2F9CA"/* 2F9CA */,/*52334*/"CJK COMPATIBILITY IDEOGRAPH-2F9CB"/* 2F9CB */, /*52335*/"CJK COMPATIBILITY IDEOGRAPH-2F9CC"/* 2F9CC */,/*52336*/"CJK COMPATIBILITY IDEOGRAPH-2F9CD"/* 2F9CD */, /*52337*/"CJK COMPATIBILITY IDEOGRAPH-2F9CE"/* 2F9CE */,/*52338*/"CJK COMPATIBILITY IDEOGRAPH-2F9CF"/* 2F9CF */, /*52339*/"CJK COMPATIBILITY IDEOGRAPH-2F9D0"/* 2F9D0 */,/*52340*/"CJK COMPATIBILITY IDEOGRAPH-2F9D1"/* 2F9D1 */, /*52341*/"CJK COMPATIBILITY IDEOGRAPH-2F9D2"/* 2F9D2 */,/*52342*/"CJK COMPATIBILITY IDEOGRAPH-2F9D3"/* 2F9D3 */, /*52343*/"CJK COMPATIBILITY IDEOGRAPH-2F9D4"/* 2F9D4 */,/*52344*/"CJK COMPATIBILITY IDEOGRAPH-2F9D5"/* 2F9D5 */, /*52345*/"CJK COMPATIBILITY IDEOGRAPH-2F9D6"/* 2F9D6 */,/*52346*/"CJK COMPATIBILITY IDEOGRAPH-2F9D7"/* 2F9D7 */, /*52347*/"CJK COMPATIBILITY IDEOGRAPH-2F9D8"/* 2F9D8 */,/*52348*/"CJK COMPATIBILITY IDEOGRAPH-2F9D9"/* 2F9D9 */, /*52349*/"CJK COMPATIBILITY IDEOGRAPH-2F9DA"/* 2F9DA */,/*52350*/"CJK COMPATIBILITY IDEOGRAPH-2F9DB"/* 2F9DB */, /*52351*/"CJK COMPATIBILITY IDEOGRAPH-2F9DC"/* 2F9DC */,/*52352*/"CJK COMPATIBILITY IDEOGRAPH-2F9DD"/* 2F9DD */, /*52353*/"CJK COMPATIBILITY IDEOGRAPH-2F9DE"/* 2F9DE */,/*52354*/"CJK COMPATIBILITY IDEOGRAPH-2F9DF"/* 2F9DF */, /*52355*/"CJK COMPATIBILITY IDEOGRAPH-2F9E0"/* 2F9E0 */,/*52356*/"CJK COMPATIBILITY IDEOGRAPH-2F9E1"/* 2F9E1 */, /*52357*/"CJK COMPATIBILITY IDEOGRAPH-2F9E2"/* 2F9E2 */,/*52358*/"CJK COMPATIBILITY IDEOGRAPH-2F9E3"/* 2F9E3 */, /*52359*/"CJK COMPATIBILITY IDEOGRAPH-2F9E4"/* 2F9E4 */,/*52360*/"CJK COMPATIBILITY IDEOGRAPH-2F9E5"/* 2F9E5 */, /*52361*/"CJK COMPATIBILITY IDEOGRAPH-2F9E6"/* 2F9E6 */,/*52362*/"CJK COMPATIBILITY IDEOGRAPH-2F9E7"/* 2F9E7 */, /*52363*/"CJK COMPATIBILITY IDEOGRAPH-2F9E8"/* 2F9E8 */,/*52364*/"CJK COMPATIBILITY IDEOGRAPH-2F9E9"/* 2F9E9 */, /*52365*/"CJK COMPATIBILITY IDEOGRAPH-2F9EA"/* 2F9EA */,/*52366*/"CJK COMPATIBILITY IDEOGRAPH-2F9EB"/* 2F9EB */, /*52367*/"CJK COMPATIBILITY IDEOGRAPH-2F9EC"/* 2F9EC */,/*52368*/"CJK COMPATIBILITY IDEOGRAPH-2F9ED"/* 2F9ED */, /*52369*/"CJK COMPATIBILITY IDEOGRAPH-2F9EE"/* 2F9EE */,/*52370*/"CJK COMPATIBILITY IDEOGRAPH-2F9EF"/* 2F9EF */, /*52371*/"CJK COMPATIBILITY IDEOGRAPH-2F9F0"/* 2F9F0 */,/*52372*/"CJK COMPATIBILITY IDEOGRAPH-2F9F1"/* 2F9F1 */, /*52373*/"CJK COMPATIBILITY IDEOGRAPH-2F9F2"/* 2F9F2 */,/*52374*/"CJK COMPATIBILITY IDEOGRAPH-2F9F3"/* 2F9F3 */, /*52375*/"CJK COMPATIBILITY IDEOGRAPH-2F9F4"/* 2F9F4 */,/*52376*/"CJK COMPATIBILITY IDEOGRAPH-2F9F5"/* 2F9F5 */, /*52377*/"CJK COMPATIBILITY IDEOGRAPH-2F9F6"/* 2F9F6 */,/*52378*/"CJK COMPATIBILITY IDEOGRAPH-2F9F7"/* 2F9F7 */, /*52379*/"CJK COMPATIBILITY IDEOGRAPH-2F9F8"/* 2F9F8 */,/*52380*/"CJK COMPATIBILITY IDEOGRAPH-2F9F9"/* 2F9F9 */, /*52381*/"CJK COMPATIBILITY IDEOGRAPH-2F9FA"/* 2F9FA */,/*52382*/"CJK COMPATIBILITY IDEOGRAPH-2F9FB"/* 2F9FB */, /*52383*/"CJK COMPATIBILITY IDEOGRAPH-2F9FC"/* 2F9FC */,/*52384*/"CJK COMPATIBILITY IDEOGRAPH-2F9FD"/* 2F9FD */, /*52385*/"CJK COMPATIBILITY IDEOGRAPH-2F9FE"/* 2F9FE */,/*52386*/"CJK COMPATIBILITY IDEOGRAPH-2F9FF"/* 2F9FF */, /*52387*/"CJK COMPATIBILITY IDEOGRAPH-2FA00"/* 2FA00 */,/*52388*/"CJK COMPATIBILITY IDEOGRAPH-2FA01"/* 2FA01 */, /*52389*/"CJK COMPATIBILITY IDEOGRAPH-2FA02"/* 2FA02 */,/*52390*/"CJK COMPATIBILITY IDEOGRAPH-2FA03"/* 2FA03 */, /*52391*/"CJK COMPATIBILITY IDEOGRAPH-2FA04"/* 2FA04 */,/*52392*/"CJK COMPATIBILITY IDEOGRAPH-2FA05"/* 2FA05 */, /*52393*/"CJK COMPATIBILITY IDEOGRAPH-2FA06"/* 2FA06 */,/*52394*/"CJK COMPATIBILITY IDEOGRAPH-2FA07"/* 2FA07 */, /*52395*/"CJK COMPATIBILITY IDEOGRAPH-2FA08"/* 2FA08 */,/*52396*/"CJK COMPATIBILITY IDEOGRAPH-2FA09"/* 2FA09 */, /*52397*/"CJK COMPATIBILITY IDEOGRAPH-2FA0A"/* 2FA0A */,/*52398*/"CJK COMPATIBILITY IDEOGRAPH-2FA0B"/* 2FA0B */, /*52399*/"CJK COMPATIBILITY IDEOGRAPH-2FA0C"/* 2FA0C */,/*52400*/"CJK COMPATIBILITY IDEOGRAPH-2FA0D"/* 2FA0D */, /*52401*/"CJK COMPATIBILITY IDEOGRAPH-2FA0E"/* 2FA0E */,/*52402*/"CJK COMPATIBILITY IDEOGRAPH-2FA0F"/* 2FA0F */, /*52403*/"CJK COMPATIBILITY IDEOGRAPH-2FA10"/* 2FA10 */,/*52404*/"CJK COMPATIBILITY IDEOGRAPH-2FA11"/* 2FA11 */, /*52405*/"CJK COMPATIBILITY IDEOGRAPH-2FA12"/* 2FA12 */,/*52406*/"CJK COMPATIBILITY IDEOGRAPH-2FA13"/* 2FA13 */, /*52407*/"CJK COMPATIBILITY IDEOGRAPH-2FA14"/* 2FA14 */,/*52408*/"CJK COMPATIBILITY IDEOGRAPH-2FA15"/* 2FA15 */, /*52409*/"CJK COMPATIBILITY IDEOGRAPH-2FA16"/* 2FA16 */,/*52410*/"CJK COMPATIBILITY IDEOGRAPH-2FA17"/* 2FA17 */, /*52411*/"CJK COMPATIBILITY IDEOGRAPH-2FA18"/* 2FA18 */,/*52412*/"CJK COMPATIBILITY IDEOGRAPH-2FA19"/* 2FA19 */, /*52413*/"CJK COMPATIBILITY IDEOGRAPH-2FA1A"/* 2FA1A */,/*52414*/"CJK COMPATIBILITY IDEOGRAPH-2FA1B"/* 2FA1B */, /*52415*/"CJK COMPATIBILITY IDEOGRAPH-2FA1C"/* 2FA1C */,/*52416*/"CJK COMPATIBILITY IDEOGRAPH-2FA1D"/* 2FA1D */, /*52417*/"LANGUAGE TAG"/* E0001 */,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,/*52448*/"TAG SPACE"/* E0020 */, /*52449*/"TAG EXCLAMATION MARK"/* E0021 */,/*52450*/"TAG QUOTATION MARK"/* E0022 */, /*52451*/"TAG NUMBER SIGN"/* E0023 */,/*52452*/"TAG DOLLAR SIGN"/* E0024 */,/*52453*/"TAG PERCENT SIGN"/* E0025 */, /*52454*/"TAG AMPERSAND"/* E0026 */,/*52455*/"TAG APOSTROPHE"/* E0027 */,/*52456*/"TAG LEFT PARENTHESIS"/* E0028 */, /*52457*/"TAG RIGHT PARENTHESIS"/* E0029 */,/*52458*/"TAG ASTERISK"/* E002A */,/*52459*/"TAG PLUS SIGN"/* E002B */, /*52460*/"TAG COMMA"/* E002C */,/*52461*/"TAG HYPHEN-MINUS"/* E002D */,/*52462*/"TAG FULL STOP"/* E002E */, /*52463*/"TAG SOLIDUS"/* E002F */,/*52464*/"TAG DIGIT ZERO"/* E0030 */,/*52465*/"TAG DIGIT ONE"/* E0031 */, /*52466*/"TAG DIGIT TWO"/* E0032 */,/*52467*/"TAG DIGIT THREE"/* E0033 */,/*52468*/"TAG DIGIT FOUR"/* E0034 */, /*52469*/"TAG DIGIT FIVE"/* E0035 */,/*52470*/"TAG DIGIT SIX"/* E0036 */,/*52471*/"TAG DIGIT SEVEN"/* E0037 */, /*52472*/"TAG DIGIT EIGHT"/* E0038 */,/*52473*/"TAG DIGIT NINE"/* E0039 */,/*52474*/"TAG COLON"/* E003A */, /*52475*/"TAG SEMICOLON"/* E003B */,/*52476*/"TAG LESS-THAN SIGN"/* E003C */,/*52477*/"TAG EQUALS SIGN"/* E003D */, /*52478*/"TAG GREATER-THAN SIGN"/* E003E */,/*52479*/"TAG QUESTION MARK"/* E003F */, /*52480*/"TAG COMMERCIAL AT"/* E0040 */,/*52481*/"TAG LATIN CAPITAL LETTER A"/* E0041 */, /*52482*/"TAG LATIN CAPITAL LETTER B"/* E0042 */,/*52483*/"TAG LATIN CAPITAL LETTER C"/* E0043 */, /*52484*/"TAG LATIN CAPITAL LETTER D"/* E0044 */,/*52485*/"TAG LATIN CAPITAL LETTER E"/* E0045 */, /*52486*/"TAG LATIN CAPITAL LETTER F"/* E0046 */,/*52487*/"TAG LATIN CAPITAL LETTER G"/* E0047 */, /*52488*/"TAG LATIN CAPITAL LETTER H"/* E0048 */,/*52489*/"TAG LATIN CAPITAL LETTER I"/* E0049 */, /*52490*/"TAG LATIN CAPITAL LETTER J"/* E004A */,/*52491*/"TAG LATIN CAPITAL LETTER K"/* E004B */, /*52492*/"TAG LATIN CAPITAL LETTER L"/* E004C */,/*52493*/"TAG LATIN CAPITAL LETTER M"/* E004D */, /*52494*/"TAG LATIN CAPITAL LETTER N"/* E004E */,/*52495*/"TAG LATIN CAPITAL LETTER O"/* E004F */, /*52496*/"TAG LATIN CAPITAL LETTER P"/* E0050 */,/*52497*/"TAG LATIN CAPITAL LETTER Q"/* E0051 */, /*52498*/"TAG LATIN CAPITAL LETTER R"/* E0052 */,/*52499*/"TAG LATIN CAPITAL LETTER S"/* E0053 */, /*52500*/"TAG LATIN CAPITAL LETTER T"/* E0054 */,/*52501*/"TAG LATIN CAPITAL LETTER U"/* E0055 */, /*52502*/"TAG LATIN CAPITAL LETTER V"/* E0056 */,/*52503*/"TAG LATIN CAPITAL LETTER W"/* E0057 */, /*52504*/"TAG LATIN CAPITAL LETTER X"/* E0058 */,/*52505*/"TAG LATIN CAPITAL LETTER Y"/* E0059 */, /*52506*/"TAG LATIN CAPITAL LETTER Z"/* E005A */,/*52507*/"TAG LEFT SQUARE BRACKET"/* E005B */, /*52508*/"TAG REVERSE SOLIDUS"/* E005C */,/*52509*/"TAG RIGHT SQUARE BRACKET"/* E005D */, /*52510*/"TAG CIRCUMFLEX ACCENT"/* E005E */,/*52511*/"TAG LOW LINE"/* E005F */,/*52512*/"TAG GRAVE ACCENT"/* E0060 */, /*52513*/"TAG LATIN SMALL LETTER A"/* E0061 */,/*52514*/"TAG LATIN SMALL LETTER B"/* E0062 */, /*52515*/"TAG LATIN SMALL LETTER C"/* E0063 */,/*52516*/"TAG LATIN SMALL LETTER D"/* E0064 */, /*52517*/"TAG LATIN SMALL LETTER E"/* E0065 */,/*52518*/"TAG LATIN SMALL LETTER F"/* E0066 */, /*52519*/"TAG LATIN SMALL LETTER G"/* E0067 */,/*52520*/"TAG LATIN SMALL LETTER H"/* E0068 */, /*52521*/"TAG LATIN SMALL LETTER I"/* E0069 */,/*52522*/"TAG LATIN SMALL LETTER J"/* E006A */, /*52523*/"TAG LATIN SMALL LETTER K"/* E006B */,/*52524*/"TAG LATIN SMALL LETTER L"/* E006C */, /*52525*/"TAG LATIN SMALL LETTER M"/* E006D */,/*52526*/"TAG LATIN SMALL LETTER N"/* E006E */, /*52527*/"TAG LATIN SMALL LETTER O"/* E006F */,/*52528*/"TAG LATIN SMALL LETTER P"/* E0070 */, /*52529*/"TAG LATIN SMALL LETTER Q"/* E0071 */,/*52530*/"TAG LATIN SMALL LETTER R"/* E0072 */, /*52531*/"TAG LATIN SMALL LETTER S"/* E0073 */,/*52532*/"TAG LATIN SMALL LETTER T"/* E0074 */, /*52533*/"TAG LATIN SMALL LETTER U"/* E0075 */,/*52534*/"TAG LATIN SMALL LETTER V"/* E0076 */, /*52535*/"TAG LATIN SMALL LETTER W"/* E0077 */,/*52536*/"TAG LATIN SMALL LETTER X"/* E0078 */, /*52537*/"TAG LATIN SMALL LETTER Y"/* E0079 */,/*52538*/"TAG LATIN SMALL LETTER Z"/* E007A */, /*52539*/"TAG LEFT CURLY BRACKET"/* E007B */,/*52540*/"TAG VERTICAL LINE"/* E007C */, /*52541*/"TAG RIGHT CURLY BRACKET"/* E007D */,/*52542*/"TAG TILDE"/* E007E */,/*52543*/"CANCEL TAG"/* E007F */,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,/*52672*/"VARIATION SELECTOR-17"/* E0100 */,/*52673*/"VARIATION SELECTOR-18"/* E0101 */, /*52674*/"VARIATION SELECTOR-19"/* E0102 */,/*52675*/"VARIATION SELECTOR-20"/* E0103 */, /*52676*/"VARIATION SELECTOR-21"/* E0104 */,/*52677*/"VARIATION SELECTOR-22"/* E0105 */, /*52678*/"VARIATION SELECTOR-23"/* E0106 */,/*52679*/"VARIATION SELECTOR-24"/* E0107 */, /*52680*/"VARIATION SELECTOR-25"/* E0108 */,/*52681*/"VARIATION SELECTOR-26"/* E0109 */, /*52682*/"VARIATION SELECTOR-27"/* E010A */,/*52683*/"VARIATION SELECTOR-28"/* E010B */, /*52684*/"VARIATION SELECTOR-29"/* E010C */,/*52685*/"VARIATION SELECTOR-30"/* E010D */, /*52686*/"VARIATION SELECTOR-31"/* E010E */,/*52687*/"VARIATION SELECTOR-32"/* E010F */, /*52688*/"VARIATION SELECTOR-33"/* E0110 */,/*52689*/"VARIATION SELECTOR-34"/* E0111 */, /*52690*/"VARIATION SELECTOR-35"/* E0112 */,/*52691*/"VARIATION SELECTOR-36"/* E0113 */, /*52692*/"VARIATION SELECTOR-37"/* E0114 */,/*52693*/"VARIATION SELECTOR-38"/* E0115 */, /*52694*/"VARIATION SELECTOR-39"/* E0116 */,/*52695*/"VARIATION SELECTOR-40"/* E0117 */, /*52696*/"VARIATION SELECTOR-41"/* E0118 */,/*52697*/"VARIATION SELECTOR-42"/* E0119 */, /*52698*/"VARIATION SELECTOR-43"/* E011A */,/*52699*/"VARIATION SELECTOR-44"/* E011B */, /*52700*/"VARIATION SELECTOR-45"/* E011C */,/*52701*/"VARIATION SELECTOR-46"/* E011D */, /*52702*/"VARIATION SELECTOR-47"/* E011E */,/*52703*/"VARIATION SELECTOR-48"/* E011F */, /*52704*/"VARIATION SELECTOR-49"/* E0120 */,/*52705*/"VARIATION SELECTOR-50"/* E0121 */, /*52706*/"VARIATION SELECTOR-51"/* E0122 */,/*52707*/"VARIATION SELECTOR-52"/* E0123 */, /*52708*/"VARIATION SELECTOR-53"/* E0124 */,/*52709*/"VARIATION SELECTOR-54"/* E0125 */, /*52710*/"VARIATION SELECTOR-55"/* E0126 */,/*52711*/"VARIATION SELECTOR-56"/* E0127 */, /*52712*/"VARIATION SELECTOR-57"/* E0128 */,/*52713*/"VARIATION SELECTOR-58"/* E0129 */, /*52714*/"VARIATION SELECTOR-59"/* E012A */,/*52715*/"VARIATION SELECTOR-60"/* E012B */, /*52716*/"VARIATION SELECTOR-61"/* E012C */,/*52717*/"VARIATION SELECTOR-62"/* E012D */, /*52718*/"VARIATION SELECTOR-63"/* E012E */,/*52719*/"VARIATION SELECTOR-64"/* E012F */, /*52720*/"VARIATION SELECTOR-65"/* E0130 */,/*52721*/"VARIATION SELECTOR-66"/* E0131 */, /*52722*/"VARIATION SELECTOR-67"/* E0132 */,/*52723*/"VARIATION SELECTOR-68"/* E0133 */, /*52724*/"VARIATION SELECTOR-69"/* E0134 */,/*52725*/"VARIATION SELECTOR-70"/* E0135 */, /*52726*/"VARIATION SELECTOR-71"/* E0136 */,/*52727*/"VARIATION SELECTOR-72"/* E0137 */, /*52728*/"VARIATION SELECTOR-73"/* E0138 */,/*52729*/"VARIATION SELECTOR-74"/* E0139 */, /*52730*/"VARIATION SELECTOR-75"/* E013A */,/*52731*/"VARIATION SELECTOR-76"/* E013B */, /*52732*/"VARIATION SELECTOR-77"/* E013C */,/*52733*/"VARIATION SELECTOR-78"/* E013D */, /*52734*/"VARIATION SELECTOR-79"/* E013E */,/*52735*/"VARIATION SELECTOR-80"/* E013F */, /*52736*/"VARIATION SELECTOR-81"/* E0140 */,/*52737*/"VARIATION SELECTOR-82"/* E0141 */, /*52738*/"VARIATION SELECTOR-83"/* E0142 */,/*52739*/"VARIATION SELECTOR-84"/* E0143 */, /*52740*/"VARIATION SELECTOR-85"/* E0144 */,/*52741*/"VARIATION SELECTOR-86"/* E0145 */, /*52742*/"VARIATION SELECTOR-87"/* E0146 */,/*52743*/"VARIATION SELECTOR-88"/* E0147 */, /*52744*/"VARIATION SELECTOR-89"/* E0148 */,/*52745*/"VARIATION SELECTOR-90"/* E0149 */, /*52746*/"VARIATION SELECTOR-91"/* E014A */,/*52747*/"VARIATION SELECTOR-92"/* E014B */, /*52748*/"VARIATION SELECTOR-93"/* E014C */,/*52749*/"VARIATION SELECTOR-94"/* E014D */, /*52750*/"VARIATION SELECTOR-95"/* E014E */,/*52751*/"VARIATION SELECTOR-96"/* E014F */, /*52752*/"VARIATION SELECTOR-97"/* E0150 */,/*52753*/"VARIATION SELECTOR-98"/* E0151 */, /*52754*/"VARIATION SELECTOR-99"/* E0152 */,/*52755*/"VARIATION SELECTOR-100"/* E0153 */, /*52756*/"VARIATION SELECTOR-101"/* E0154 */,/*52757*/"VARIATION SELECTOR-102"/* E0155 */, /*52758*/"VARIATION SELECTOR-103"/* E0156 */,/*52759*/"VARIATION SELECTOR-104"/* E0157 */, /*52760*/"VARIATION SELECTOR-105"/* E0158 */,/*52761*/"VARIATION SELECTOR-106"/* E0159 */, /*52762*/"VARIATION SELECTOR-107"/* E015A */,/*52763*/"VARIATION SELECTOR-108"/* E015B */, /*52764*/"VARIATION SELECTOR-109"/* E015C */,/*52765*/"VARIATION SELECTOR-110"/* E015D */, /*52766*/"VARIATION SELECTOR-111"/* E015E */,/*52767*/"VARIATION SELECTOR-112"/* E015F */, /*52768*/"VARIATION SELECTOR-113"/* E0160 */,/*52769*/"VARIATION SELECTOR-114"/* E0161 */, /*52770*/"VARIATION SELECTOR-115"/* E0162 */,/*52771*/"VARIATION SELECTOR-116"/* E0163 */, /*52772*/"VARIATION SELECTOR-117"/* E0164 */,/*52773*/"VARIATION SELECTOR-118"/* E0165 */, /*52774*/"VARIATION SELECTOR-119"/* E0166 */,/*52775*/"VARIATION SELECTOR-120"/* E0167 */, /*52776*/"VARIATION SELECTOR-121"/* E0168 */,/*52777*/"VARIATION SELECTOR-122"/* E0169 */, /*52778*/"VARIATION SELECTOR-123"/* E016A */,/*52779*/"VARIATION SELECTOR-124"/* E016B */, /*52780*/"VARIATION SELECTOR-125"/* E016C */,/*52781*/"VARIATION SELECTOR-126"/* E016D */, /*52782*/"VARIATION SELECTOR-127"/* E016E */,/*52783*/"VARIATION SELECTOR-128"/* E016F */, /*52784*/"VARIATION SELECTOR-129"/* E0170 */,/*52785*/"VARIATION SELECTOR-130"/* E0171 */, /*52786*/"VARIATION SELECTOR-131"/* E0172 */,/*52787*/"VARIATION SELECTOR-132"/* E0173 */, /*52788*/"VARIATION SELECTOR-133"/* E0174 */,/*52789*/"VARIATION SELECTOR-134"/* E0175 */, /*52790*/"VARIATION SELECTOR-135"/* E0176 */,/*52791*/"VARIATION SELECTOR-136"/* E0177 */, /*52792*/"VARIATION SELECTOR-137"/* E0178 */,/*52793*/"VARIATION SELECTOR-138"/* E0179 */, /*52794*/"VARIATION SELECTOR-139"/* E017A */,/*52795*/"VARIATION SELECTOR-140"/* E017B */, /*52796*/"VARIATION SELECTOR-141"/* E017C */,/*52797*/"VARIATION SELECTOR-142"/* E017D */, /*52798*/"VARIATION SELECTOR-143"/* E017E */,/*52799*/"VARIATION SELECTOR-144"/* E017F */, /*52800*/"VARIATION SELECTOR-145"/* E0180 */,/*52801*/"VARIATION SELECTOR-146"/* E0181 */, /*52802*/"VARIATION SELECTOR-147"/* E0182 */,/*52803*/"VARIATION SELECTOR-148"/* E0183 */, /*52804*/"VARIATION SELECTOR-149"/* E0184 */,/*52805*/"VARIATION SELECTOR-150"/* E0185 */, /*52806*/"VARIATION SELECTOR-151"/* E0186 */,/*52807*/"VARIATION SELECTOR-152"/* E0187 */, /*52808*/"VARIATION SELECTOR-153"/* E0188 */,/*52809*/"VARIATION SELECTOR-154"/* E0189 */, /*52810*/"VARIATION SELECTOR-155"/* E018A */,/*52811*/"VARIATION SELECTOR-156"/* E018B */, /*52812*/"VARIATION SELECTOR-157"/* E018C */,/*52813*/"VARIATION SELECTOR-158"/* E018D */, /*52814*/"VARIATION SELECTOR-159"/* E018E */,/*52815*/"VARIATION SELECTOR-160"/* E018F */, /*52816*/"VARIATION SELECTOR-161"/* E0190 */,/*52817*/"VARIATION SELECTOR-162"/* E0191 */, /*52818*/"VARIATION SELECTOR-163"/* E0192 */,/*52819*/"VARIATION SELECTOR-164"/* E0193 */, /*52820*/"VARIATION SELECTOR-165"/* E0194 */,/*52821*/"VARIATION SELECTOR-166"/* E0195 */, /*52822*/"VARIATION SELECTOR-167"/* E0196 */,/*52823*/"VARIATION SELECTOR-168"/* E0197 */, /*52824*/"VARIATION SELECTOR-169"/* E0198 */,/*52825*/"VARIATION SELECTOR-170"/* E0199 */, /*52826*/"VARIATION SELECTOR-171"/* E019A */,/*52827*/"VARIATION SELECTOR-172"/* E019B */, /*52828*/"VARIATION SELECTOR-173"/* E019C */,/*52829*/"VARIATION SELECTOR-174"/* E019D */, /*52830*/"VARIATION SELECTOR-175"/* E019E */,/*52831*/"VARIATION SELECTOR-176"/* E019F */, /*52832*/"VARIATION SELECTOR-177"/* E01A0 */,/*52833*/"VARIATION SELECTOR-178"/* E01A1 */, /*52834*/"VARIATION SELECTOR-179"/* E01A2 */,/*52835*/"VARIATION SELECTOR-180"/* E01A3 */, /*52836*/"VARIATION SELECTOR-181"/* E01A4 */,/*52837*/"VARIATION SELECTOR-182"/* E01A5 */, /*52838*/"VARIATION SELECTOR-183"/* E01A6 */,/*52839*/"VARIATION SELECTOR-184"/* E01A7 */, /*52840*/"VARIATION SELECTOR-185"/* E01A8 */,/*52841*/"VARIATION SELECTOR-186"/* E01A9 */, /*52842*/"VARIATION SELECTOR-187"/* E01AA */,/*52843*/"VARIATION SELECTOR-188"/* E01AB */, /*52844*/"VARIATION SELECTOR-189"/* E01AC */,/*52845*/"VARIATION SELECTOR-190"/* E01AD */, /*52846*/"VARIATION SELECTOR-191"/* E01AE */,/*52847*/"VARIATION SELECTOR-192"/* E01AF */, /*52848*/"VARIATION SELECTOR-193"/* E01B0 */,/*52849*/"VARIATION SELECTOR-194"/* E01B1 */, /*52850*/"VARIATION SELECTOR-195"/* E01B2 */,/*52851*/"VARIATION SELECTOR-196"/* E01B3 */, /*52852*/"VARIATION SELECTOR-197"/* E01B4 */,/*52853*/"VARIATION SELECTOR-198"/* E01B5 */, /*52854*/"VARIATION SELECTOR-199"/* E01B6 */,/*52855*/"VARIATION SELECTOR-200"/* E01B7 */, /*52856*/"VARIATION SELECTOR-201"/* E01B8 */,/*52857*/"VARIATION SELECTOR-202"/* E01B9 */, /*52858*/"VARIATION SELECTOR-203"/* E01BA */,/*52859*/"VARIATION SELECTOR-204"/* E01BB */, /*52860*/"VARIATION SELECTOR-205"/* E01BC */,/*52861*/"VARIATION SELECTOR-206"/* E01BD */, /*52862*/"VARIATION SELECTOR-207"/* E01BE */,/*52863*/"VARIATION SELECTOR-208"/* E01BF */, /*52864*/"VARIATION SELECTOR-209"/* E01C0 */,/*52865*/"VARIATION SELECTOR-210"/* E01C1 */, /*52866*/"VARIATION SELECTOR-211"/* E01C2 */,/*52867*/"VARIATION SELECTOR-212"/* E01C3 */, /*52868*/"VARIATION SELECTOR-213"/* E01C4 */,/*52869*/"VARIATION SELECTOR-214"/* E01C5 */, /*52870*/"VARIATION SELECTOR-215"/* E01C6 */,/*52871*/"VARIATION SELECTOR-216"/* E01C7 */, /*52872*/"VARIATION SELECTOR-217"/* E01C8 */,/*52873*/"VARIATION SELECTOR-218"/* E01C9 */, /*52874*/"VARIATION SELECTOR-219"/* E01CA */,/*52875*/"VARIATION SELECTOR-220"/* E01CB */, /*52876*/"VARIATION SELECTOR-221"/* E01CC */,/*52877*/"VARIATION SELECTOR-222"/* E01CD */, /*52878*/"VARIATION SELECTOR-223"/* E01CE */,/*52879*/"VARIATION SELECTOR-224"/* E01CF */, /*52880*/"VARIATION SELECTOR-225"/* E01D0 */,/*52881*/"VARIATION SELECTOR-226"/* E01D1 */, /*52882*/"VARIATION SELECTOR-227"/* E01D2 */,/*52883*/"VARIATION SELECTOR-228"/* E01D3 */, /*52884*/"VARIATION SELECTOR-229"/* E01D4 */,/*52885*/"VARIATION SELECTOR-230"/* E01D5 */, /*52886*/"VARIATION SELECTOR-231"/* E01D6 */,/*52887*/"VARIATION SELECTOR-232"/* E01D7 */, /*52888*/"VARIATION SELECTOR-233"/* E01D8 */,/*52889*/"VARIATION SELECTOR-234"/* E01D9 */, /*52890*/"VARIATION SELECTOR-235"/* E01DA */,/*52891*/"VARIATION SELECTOR-236"/* E01DB */, /*52892*/"VARIATION SELECTOR-237"/* E01DC */,/*52893*/"VARIATION SELECTOR-238"/* E01DD */, /*52894*/"VARIATION SELECTOR-239"/* E01DE */,/*52895*/"VARIATION SELECTOR-240"/* E01DF */, /*52896*/"VARIATION SELECTOR-241"/* E01E0 */,/*52897*/"VARIATION SELECTOR-242"/* E01E1 */, /*52898*/"VARIATION SELECTOR-243"/* E01E2 */,/*52899*/"VARIATION SELECTOR-244"/* E01E3 */, /*52900*/"VARIATION SELECTOR-245"/* E01E4 */,/*52901*/"VARIATION SELECTOR-246"/* E01E5 */, /*52902*/"VARIATION SELECTOR-247"/* E01E6 */,/*52903*/"VARIATION SELECTOR-248"/* E01E7 */, /*52904*/"VARIATION SELECTOR-249"/* E01E8 */,/*52905*/"VARIATION SELECTOR-250"/* E01E9 */, /*52906*/"VARIATION SELECTOR-251"/* E01EA */,/*52907*/"VARIATION SELECTOR-252"/* E01EB */, /*52908*/"VARIATION SELECTOR-253"/* E01EC */,/*52909*/"VARIATION SELECTOR-254"/* E01ED */, /*52910*/"VARIATION SELECTOR-255"/* E01EE */,/*52911*/"VARIATION SELECTOR-256"/* E01EF */, /*52912*/""/* F0000 */,/*52913*/""/* 100000 */, /*52914*/"Out of Range"/* 110000 */ }; static const MVMuint32 props_bitfield[29541][9] = { {0,0,0,0,0,0,0,0,0},/*1*/{0,8u,65537u,68201487u,536870920u,1677721600u,12u,4208640u,0}/* 0000 */, /*2*/{0,8u,65537u,69246991u,536920072u,1677721600u,4116u,138442752u,2148007936u}/* 0009 */, /*3*/{0,8u,65537u,70294543u,403324936u,1677721600u,4124u,138442752u,2148007936u}/* 000A */, /*4*/{0,8u,65537u,71344143u,537706504u,1677721600u,4132u,138442752u,2148007936u}/* 000B */, /*5*/{0,8u,65537u,71345167u,537706504u,1677721600u,4140u,138442752u,2148007936u}/* 000C */, /*6*/{0,8u,65537u,72391695u,268967944u,1677721600u,4148u,138442752u,2148007936u}/* 000D */, /*7*/{0,8u,65537u,68197391u,536870920u,1677721600u,12u,4208640u,0}/* 001C */, /*8*/{0,8u,65537u,68198415u,536870920u,1677721600u,12u,4208640u,0}/* 001F */, /*9*/{0,13u,65537u,73442316u,49192u,1610612768u,4180u,138442752u,2148073472u}/* 0020 */, /*10*/{0,13u,65537u,74491927u,98344u,1610612768u,4884u,138442755u,41943040u}/* 0021 */, /*11*/{0,13u,65537u,75540503u,237608u,1610612768u,6260u,138442755u,536870912u}/* 0022 */, /*12*/{0,13u,65537u,76582935u,8u,1610618912u,7380u,138442755u,0}/* 0023 */, /*13*/{0,13u,65537u,77631513u,40u,1610612768u,58308u,138442753u,67108864u}/* 0024 */, /*14*/{0,13u,65537u,78680087u,40u,1610612768u,7388u,138442755u,0}/* 0025 */, /*15*/{0,13u,65537u,76589079u,40u,1610612768u,7364u,138442755u,0}/* 0026 */, /*16*/{0,13u,65537u,75540503u,368680u,1627389984u,6204u,138442755u,536870912u}/* 0027 */, /*17*/{0,4109u,65537u,79734804u,106536u,1744830496u,6348u,138442755u,0}/* 0028 */, /*18*/{0,8205u,65537u,80783381u,106536u,1744830496u,6356u,138442755u,0}/* 0029 */, /*19*/{0,13u,65537u,76589079u,8u,1610618912u,7308u,138442755u,0}/* 002A */, /*20*/{0,13u,65537u,77630488u,40u,1610612768u,12654u,138442753u,67108864u}/* 002B */, /*21*/{0,13u,65537u,81827863u,1818664u,1610612768u,4380u,138442755u,8388608u}/* 002C */, /*22*/{0,13u,65537u,82873363u,114728u,1610678306u,4212u,138442755u,0}/* 002D */, /*23*/{0,13u,65537u,81827863u,1925160u,1627389984u,5068u,138442755u,41943040u}/* 002E */, /*24*/{0,13u,65537u,83925015u,40u,1610612768u,7348u,138442755u,0}/* 002F */, /*25*/{0,13u,33620993u,84969481u,10436623u,1610618916u,1073800485u,138442752u,262144u}/* 0030 */, /*26*/{0,13u,536937985u,84969481u,10436623u,1610618916u,1073800493u,138442752u,262144u}/* 0031 */, /*27*/{0,13u,570493441u,84969481u,10436623u,1610618916u,1073800501u,138442752u,262144u}/* 0032 */, /*28*/{0,13u,604047361u,84969481u,10436623u,1610618916u,1073800509u,138442752u,262144u}/* 0033 */, /*29*/{0,13u,637603841u,84969481u,10436623u,1610618916u,1073800517u,138442752u,262144u}/* 0034 */, /*30*/{0,13u,671157249u,84969481u,10436623u,1610618916u,1073800525u,138442752u,262144u}/* 0035 */, /*31*/{0,13u,704714241u,84969481u,10436623u,1610618916u,1073800533u,138442752u,262144u}/* 0036 */, /*32*/{0,13u,738266625u,84969481u,10436623u,1610618916u,1073800541u,138442752u,262144u}/* 0037 */, /*33*/{0,13u,771824641u,84969481u,10436623u,1610618916u,1073800549u,138442752u,262144u}/* 0038 */, /*34*/{0,13u,805377025u,84969481u,10436623u,1610618916u,1073800557u,138442752u,262144u}/* 0039 */, /*35*/{0,13u,65537u,81827863u,1687592u,1627389984u,4572u,138442755u,8388608u}/* 003A */, /*36*/{0,13u,65537u,81831959u,1703976u,1610612768u,4524u,138442755u,8388608u}/* 003B */, /*37*/{0,12301u,65537u,76589080u,40u,1744830496u,12686u,138442753u,67108864u}/* 003C */, /*38*/{0,13u,65537u,76589080u,40u,1610612768u,12694u,138442753u,67108864u}/* 003D */, /*39*/{0,16397u,65537u,76589080u,40u,1744830496u,12702u,138442753u,67108864u}/* 003E */, /*40*/{0,13u,65537u,74491927u,98344u,1610612768u,4932u,138442755u,41943040u}/* 003F */, /*41*/{0,13u,65537u,76589079u,40u,1610612768u,7300u,138442755u,0}/* 0040 */, /*42*/{128u,2097165u,131073u,76578817u,1507369u,3807903780u,1711334772u,138491904u,2490368u}/* 0041 */, /*43*/{256u,4194317u,131073u,76578817u,1507369u,3807903780u,1711334972u,138491904u,2490368u}/* 0042 */, /*44*/{384u,6291469u,131073u,76578817u,1507369u,3807903780u,1711335180u,138491904u,2490368u}/* 0043 */, /*45*/{512u,8388621u,131073u,76578817u,1507369u,3807903780u,1711335348u,138491904u,2490368u}/* 0044 */, /*46*/{640u,10485773u,131073u,76578817u,1507369u,3807903780u,1711335564u,138491904u,2490368u}/* 0045 */, /*47*/{768u,12582925u,131073u,76578817u,1507369u,3807903780u,1711336036u,138491904u,2490368u}/* 0046 */, /*48*/{896u,14680077u,131073u,76578817u,1507368u,3807903776u,1711336156u,138491904u,2490368u}/* 0047 */, /*49*/{1024u,16777229u,131073u,76578817u,1507368u,3807903776u,1711336444u,138491904u,2490368u}/* 0048 */, /*50*/{1152u,18874381u,131073u,76578817u,1507368u,3807903776u,1711336652u,138491904u,2490368u}/* 0049 */, /*51*/{1280u,20971533u,131073u,76578817u,1507368u,3807903776u,1711336860u,138491904u,2490368u}/* 004A */, /*52*/{1408u,23068685u,131073u,76578817u,1507368u,3807903776u,1711337060u,138491904u,2490368u}/* 004B */, /*53*/{1536u,25165837u,131073u,76578817u,1507368u,3807903776u,1711337200u,138491904u,2490368u}/* 004C */, /*54*/{1664u,27262989u,131073u,76578817u,1507368u,3807903776u,1711337612u,138491904u,2490368u}/* 004D */, /*55*/{1792u,29360141u,131073u,76578817u,1507368u,3807903776u,1711337732u,138491904u,2490368u}/* 004E */, /*56*/{1920u,31457293u,131073u,76578817u,1507368u,3807903776u,1711338020u,138491904u,2490368u}/* 004F */, /*57*/{2048u,33554445u,131073u,76578817u,1507368u,3807903776u,1711338396u,138491904u,2490368u}/* 0050 */, /*58*/{2176u,35651597u,131073u,76578817u,1507368u,3807903776u,1711338564u,138491904u,2490368u}/* 0051 */, /*59*/{2304u,37748749u,131073u,76578817u,1507368u,3807903776u,1711338708u,138491904u,2490368u}/* 0052 */, /*60*/{2432u,39845901u,131073u,76578817u,1507368u,3807903776u,1711339204u,138491904u,2490368u}/* 0053 */, /*61*/{2560u,41943053u,131073u,76578817u,1507368u,3807903776u,1711339492u,138491904u,2490368u}/* 0054 */, /*62*/{2688u,44040205u,131073u,76578817u,1507368u,3807903776u,1711339748u,138491904u,2490368u}/* 0055 */, /*63*/{2816u,46137357u,131073u,76578817u,1507368u,3807903776u,1711340116u,138491904u,2490368u}/* 0056 */, /*64*/{2944u,48234509u,131073u,76578817u,1507368u,3807903776u,1711340260u,138491904u,2490368u}/* 0057 */, /*65*/{3072u,50331661u,131073u,76578817u,1507368u,3807903776u,1711340340u,138491904u,2490368u}/* 0058 */, /*66*/{3200u,52428813u,131073u,76578817u,1507368u,3807903776u,1711340436u,138491904u,2490368u}/* 0059 */, /*67*/{3328u,54525965u,131073u,76578817u,1507368u,3807903776u,1711340612u,138491904u,2490368u}/* 005A */, /*68*/{0,20493u,65537u,79734804u,106536u,1744830496u,6364u,138442755u,0}/* 005B */, /*69*/{0,13u,65537u,77637655u,40u,1610612768u,7356u,138442755u,0}/* 005C */, /*70*/{0,24589u,65537u,80783381u,106536u,1744830496u,6372u,138442755u,0}/* 005D */, /*71*/{0,13u,65537u,76589082u,40u,1627398176u,9446u,138442761u,67108864u}/* 005E */, /*72*/{0,13u,65537u,76589078u,2097192u,1610612768u,1073746020u,138442754u,262144u}/* 005F */, /*73*/{0,13u,65537u,76589082u,40u,1627398176u,9420u,138442753u,67108864u}/* 0060 */, /*74*/{3456u,13u,131073u,76578818u,1499177u,3768975396u,1719723380u,138442752u,393216u}/* 0061 */, /*75*/{3584u,13u,131073u,76578818u,1499177u,3768975396u,1719723580u,138442752u,393216u}/* 0062 */, /*76*/{3712u,13u,131073u,76578818u,1499177u,3768975396u,1719723788u,138442752u,393216u}/* 0063 */, /*77*/{3840u,13u,131073u,76578818u,1499177u,3768975396u,1719723956u,138442752u,393216u}/* 0064 */, /*78*/{3968u,13u,131073u,76578818u,1499177u,3768975396u,1719724172u,138442752u,393216u}/* 0065 */, /*79*/{4096u,13u,131073u,76578818u,1499177u,3768975396u,1719724644u,138442752u,393216u}/* 0066 */, /*80*/{4224u,13u,131073u,76578818u,1499176u,3768975392u,1719724764u,138442752u,393216u}/* 0067 */, /*81*/{4352u,13u,131073u,76578818u,1499176u,3768975392u,1719725052u,138442752u,393216u}/* 0068 */, /*82*/{4480u,13u,131073u,76578818u,1499176u,3768975392u,1719725260u,138442752u,17170432u}/* 0069 */, /*83*/{4608u,13u,131073u,76578818u,1499176u,3768975392u,1719725468u,138442752u,17170432u}/* 006A */, /*84*/{4736u,13u,131073u,76578818u,1499176u,3768975392u,1719725668u,138442752u,393216u}/* 006B */, /*85*/{4864u,13u,131073u,76578818u,1499176u,3768975392u,1719725808u,138442752u,393216u}/* 006C */, /*86*/{4992u,13u,131073u,76578818u,1499176u,3768975392u,1719726220u,138442752u,393216u}/* 006D */, /*87*/{5120u,13u,131073u,76578818u,1499176u,3768975392u,1719726340u,138442752u,393216u}/* 006E */, /*88*/{5248u,13u,131073u,76578818u,1499176u,3768975392u,1719726628u,138442752u,393216u}/* 006F */, /*89*/{5376u,13u,131073u,76578818u,1499176u,3768975392u,1719727004u,138442752u,393216u}/* 0070 */, /*90*/{5504u,13u,131073u,76578818u,1499176u,3768975392u,1719727172u,138442752u,393216u}/* 0071 */, /*91*/{5632u,13u,131073u,76578818u,1499176u,3768975392u,1719727316u,138442752u,393216u}/* 0072 */, /*92*/{5760u,13u,131073u,76578818u,1499176u,3768975392u,1719727812u,138442752u,393216u}/* 0073 */, /*93*/{5888u,13u,131073u,76578818u,1499176u,3768975392u,1719728100u,138442752u,393216u}/* 0074 */, /*94*/{6016u,13u,131073u,76578818u,1499176u,3768975392u,1719728356u,138442752u,393216u}/* 0075 */, /*95*/{6144u,13u,131073u,76578818u,1499176u,3768975392u,1719728724u,138442752u,393216u}/* 0076 */, /*96*/{6272u,13u,131073u,76578818u,1499176u,3768975392u,1719728868u,138442752u,393216u}/* 0077 */, /*97*/{6400u,13u,131073u,76578818u,1499176u,3768975392u,1719728948u,138442752u,393216u}/* 0078 */, /*98*/{6528u,13u,131073u,76578818u,1499176u,3768975392u,1719729044u,138442752u,393216u}/* 0079 */, /*99*/{6656u,13u,131073u,76578818u,1499176u,3768975392u,1719729220u,138442752u,393216u}/* 007A */, /*100*/{0,28685u,65537u,79734804u,106536u,1744830496u,6380u,138442755u,0}/* 007B */, /*101*/{0,13u,65537u,69249048u,40u,1610612768u,12718u,138442753u,67108864u}/* 007C */, /*102*/{0,32781u,65537u,86026261u,106536u,1744830496u,6388u,138442755u,0}/* 007D */, /*103*/{0,13u,65537u,76589080u,40u,1610612768u,12734u,138442753u,67108864u}/* 007E */, /*104*/{0,16u,65537u,68201487u,536870920u,1677721600u,12u,4208640u,0}/* 0080 */, /*105*/{0,16u,65537u,87071759u,537690120u,1677721600u,4156u,138442752u,2148007936u}/* 0085 */, /*106*/{524288u,16u,65537u,88119436u,49184u,1611137056u,4180u,138645504u,589824u}/* 00A0 */, /*107*/{0,17u,65537u,79734807u,40u,1610612768u,4892u,138442755u,0}/* 00A1 */, /*108*/{0,21u,65537u,78680089u,40u,1610612768u,58300u,138442753u,67108864u}/* 00A2 */, /*109*/{0,21u,65537u,77631513u,40u,1610612768u,58316u,138442753u,67108864u}/* 00A3 */, /*110*/{0,17u,65537u,77631513u,40u,1610612768u,58292u,138442753u,67108864u}/* 00A4 */, /*111*/{0,21u,65537u,77631513u,40u,1610612768u,58324u,138442753u,67108864u}/* 00A5 */, /*112*/{0,21u,65537u,76589083u,40u,1610612768u,12724u,138442753u,67108864u}/* 00A6 */, /*113*/{0,17u,65537u,89171991u,40u,1610612768u,7260u,138442755u,0}/* 00A7 */, /*114*/{1048576u,17u,65537u,89172058u,32u,1627922464u,9476u,138440704u,67108864u}/* 00A8 */, /*115*/{0,16u,65537u,76589083u,8u,1610616864u,11484u,138442753u,67108864u}/* 00A9 */, /*116*/{1572864u,17u,131073u,89162053u,1499168u,3767009312u,1686168948u,138588176u,393216u}/* 00AA */, /*117*/{0,36880u,65537u,75540508u,106536u,1744830496u,6332u,138442755u,536870912u}/* 00AB */, /*118*/{0,21u,65537u,76589080u,40u,1610612768u,12710u,138442753u,67108864u}/* 00AC */, /*119*/{0,17u,65537u,69250064u,538091528u,1695055874u,12u,4208640u,0}/* 00AD */, /*120*/{0,17u,65537u,76589083u,8u,1610616864u,11492u,138442753u,67108864u}/* 00AE */, /*121*/{2097152u,21u,65537u,76589146u,32u,1627922464u,9452u,138440704u,67108864u}/* 00AF */, /*122*/{0,17u,65537u,78680091u,40u,1610612768u,10348u,138442753u,67108864u}/* 00B0 */, /*123*/{0,17u,65537u,77631512u,40u,1610612768u,12662u,138442753u,67108864u}/* 00B1 */, /*124*/{2621440u,17u,570493441u,89164107u,8388644u,1611137056u,58677u,138588160u,0}/* 00B2 */, /*125*/{3145728u,17u,604047361u,89164107u,8388644u,1611137056u,58685u,138588160u,0}/* 00B3 */, /*126*/{3670016u,17u,65537u,90220634u,32u,1627922464u,9428u,138440704u,67108864u}/* 00B4 */, /*127*/{4201088u,56623120u,65537u,76578882u,1499168u,3807248416u,1719730580u,138457088u,393216u}/* 00B5 */, /*128*/{0,17u,65537u,89171991u,40u,1610612768u,7276u,138442755u,0}/* 00B6 */, /*129*/{0,17u,65537u,89171991u,1572904u,1627398304u,1073747052u,138442818u,262144u}/* 00B7 */, /*130*/{4718592u,17u,65537u,89172058u,32u,1627922464u,9500u,138440704u,67108864u}/* 00B8 */, /*131*/{5242880u,17u,536937985u,89164107u,8388644u,1611137056u,58669u,138588160u,0}/* 00B9 */, /*132*/{5767168u,17u,131073u,89162053u,1499168u,3767009312u,1686172196u,138588176u,393216u}/* 00BA */, /*133*/{0,40976u,65537u,75540509u,106536u,1744830496u,6340u,138442755u,536870912u}/* 00BB */, /*134*/{6291456u,17u,285279745u,89172523u,62914594u,1611137056u,130117u,407597056u,0}/* 00BC */, /*135*/{6815744u,17u,369165825u,89172523u,4194338u,1611137056u,130101u,407597056u,0}/* 00BD */, /*136*/{7340032u,17u,453052417u,89172523u,62914594u,1611137056u,130133u,407597056u,0}/* 00BE */, /*137*/{0,17u,65537u,79734807u,40u,1610612768u,4940u,138442755u,0}/* 00BF */, /*138*/{7871232u,58720272u,131073u,76578849u,1507368u,3807903776u,1711334772u,293691392u,2490368u}/* 00C0 */, /*139*/{8395648u,60817424u,131073u,76578849u,1507368u,3807903776u,1711334772u,289497088u,2490368u}/* 00C1 */, /*140*/{8920064u,62914576u,131073u,76578849u,1507368u,3807903776u,1711334772u,302080000u,2490368u}/* 00C2 */, /*141*/{9444480u,65011728u,131073u,76578849u,1507368u,3807903776u,1711334772u,327245824u,2490368u}/* 00C3 */, /*142*/{9968896u,67108880u,131073u,76578849u,1507368u,3807903776u,1711334772u,318857216u,2490368u}/* 00C4 */, /*143*/{10493312u,69206032u,131073u,76578849u,1507368u,3807903776u,1711334772u,310468608u,2490368u}/* 00C5 */, /*144*/{7680u,71303185u,131073u,76578817u,1507368u,3807903776u,1711394292u,1417885696u,2490368u}/* 00C6 */, /*145*/{11017856u,73400336u,131073u,76578849u,1507368u,3807903776u,1711335180u,339828736u,2490368u}/* 00C7 */, /*146*/{11542272u,75497488u,131073u,76578849u,1507368u,3807903776u,1711335564u,293691392u,2490368u}/* 00C8 */, /*147*/{12066688u,77594640u,131073u,76578849u,1507368u,3807903776u,1711335564u,289497088u,2490368u}/* 00C9 */, /*148*/{12591104u,79691792u,131073u,76578849u,1507368u,3807903776u,1711335564u,302080000u,2490368u}/* 00CA */, /*149*/{13115520u,81788944u,131073u,76578849u,1507368u,3807903776u,1711335564u,318857216u,2490368u}/* 00CB */, /*150*/{13639936u,83886096u,131073u,76578849u,1507368u,3807903776u,1711336652u,293691392u,2490368u}/* 00CC */, /*151*/{14164352u,85983248u,131073u,76578849u,1507368u,3807903776u,1711336652u,289497088u,2490368u}/* 00CD */, /*152*/{14688768u,88080400u,131073u,76578849u,1507368u,3807903776u,1711336652u,302080000u,2490368u}/* 00CE */, /*153*/{15213184u,90177552u,131073u,76578849u,1507368u,3807903776u,1711336652u,318857216u,2490368u}/* 00CF */, /*154*/{8960u,92274705u,131073u,76578817u,1507368u,3807903776u,1711335348u,1283586048u,2490368u}/* 00D0 */, /*155*/{15737728u,94371856u,131073u,76578849u,1507368u,3807903776u,1711337732u,327245824u,2490368u}/* 00D1 */, /*156*/{16262144u,96469008u,131073u,76578849u,1507368u,3807903776u,1711338020u,293691392u,2490368u}/* 00D2 */, /*157*/{16786560u,98566160u,131073u,76578849u,1507368u,3807903776u,1711338020u,289497088u,2490368u}/* 00D3 */, /*158*/{17310976u,100663312u,131073u,76578849u,1507368u,3807903776u,1711338020u,302080000u,2490368u}/* 00D4 */, /*159*/{17835392u,102760464u,131073u,76578849u,1507368u,3807903776u,1711338020u,327245824u,2490368u}/* 00D5 */, /*160*/{18359808u,104857616u,131073u,76578849u,1507368u,3807903776u,1711338020u,318857216u,2490368u}/* 00D6 */, /*161*/{0,17u,65537u,89171992u,40u,1610612768u,12678u,138442753u,67108864u}/* 00D7 */, /*162*/{9856u,106954769u,131073u,76578817u,1507368u,3807903776u,1711338020u,335640576u,2490368u}/* 00D8 */, /*163*/{18884352u,109051920u,131073u,76578849u,1507368u,3807903776u,1711339748u,293691392u,2490368u}/* 00D9 */, /*164*/{19408768u,111149072u,131073u,76578849u,1507368u,3807903776u,1711339748u,289497088u,2490368u}/* 00DA */, /*165*/{19933184u,113246224u,131073u,76578849u,1507368u,3807903776u,1711339748u,302080000u,2490368u}/* 00DB */, /*166*/{20457600u,115343376u,131073u,76578849u,1507368u,3807903776u,1711339748u,318857216u,2490368u}/* 00DC */, /*167*/{20982016u,117440528u,131073u,76578849u,1507368u,3807903776u,1711340436u,289497088u,2490368u}/* 00DD */, /*168*/{10624u,119537681u,131073u,76578817u,1507368u,3807903776u,1711340988u,138491904u,2490368u}/* 00DE */, /*169*/{0,2097169u,131077u,76578818u,1499176u,3773693984u,1719790972u,1417787392u,393216u}/* 00DF */, /*170*/{21506560u,17u,131073u,76578850u,1499176u,3768975392u,1719723380u,293642240u,393216u}/* 00E0 */, /*171*/{22030976u,17u,131073u,76578850u,1499176u,3768975392u,1719723380u,289447936u,393216u}/* 00E1 */, /*172*/{22555392u,16u,131073u,76578850u,1499176u,3768975392u,1719723380u,302030848u,393216u}/* 00E2 */, /*173*/{23079808u,16u,131073u,76578850u,1499176u,3768975392u,1719723380u,327196672u,393216u}/* 00E3 */, /*174*/{23604224u,16u,131073u,76578850u,1499176u,3768975392u,1719723380u,318808064u,393216u}/* 00E4 */, /*175*/{24128640u,16u,131073u,76578850u,1499176u,3768975392u,1719723380u,310419456u,393216u}/* 00E5 */, /*176*/{11520u,17u,131073u,76578818u,1499176u,3768975392u,1719782900u,1417787392u,393216u}/* 00E6 */, /*177*/{24653184u,16u,131073u,76578850u,1499176u,3768975392u,1719723788u,339779584u,393216u}/* 00E7 */, /*178*/{25177600u,17u,131073u,76578850u,1499176u,3768975392u,1719724172u,293642240u,393216u}/* 00E8 */, /*179*/{25702016u,17u,131073u,76578850u,1499176u,3768975392u,1719724172u,289447936u,393216u}/* 00E9 */, /*180*/{26226432u,17u,131073u,76578850u,1499176u,3768975392u,1719724172u,302030848u,393216u}/* 00EA */, /*181*/{26750848u,16u,131073u,76578850u,1499176u,3768975392u,1719724172u,318808064u,393216u}/* 00EB */, /*182*/{27275264u,17u,131073u,76578850u,1499176u,3768975392u,1719725260u,293642240u,393216u}/* 00EC */, /*183*/{27799680u,17u,131073u,76578850u,1499176u,3768975392u,1719725260u,289447936u,393216u}/* 00ED */, /*184*/{28324096u,16u,131073u,76578850u,1499176u,3768975392u,1719725260u,302030848u,393216u}/* 00EE */, /*185*/{28848512u,16u,131073u,76578850u,1499176u,3768975392u,1719725260u,318808064u,393216u}/* 00EF */, /*186*/{12800u,17u,131073u,76578818u,1499176u,3768975392u,1719723956u,1283536896u,393216u}/* 00F0 */, /*187*/{29373056u,16u,131073u,76578850u,1499176u,3768975392u,1719726340u,327196672u,393216u}/* 00F1 */, /*188*/{29897472u,17u,131073u,76578850u,1499176u,3768975392u,1719726628u,293642240u,393216u}/* 00F2 */, /*189*/{30421888u,17u,131073u,76578850u,1499176u,3768975392u,1719726628u,289447936u,393216u}/* 00F3 */, /*190*/{30946304u,16u,131073u,76578850u,1499176u,3768975392u,1719726628u,302030848u,393216u}/* 00F4 */, /*191*/{31470720u,16u,131073u,76578850u,1499176u,3768975392u,1719726628u,327196672u,393216u}/* 00F5 */, /*192*/{31995136u,16u,131073u,76578850u,1499176u,3768975392u,1719726628u,318808064u,393216u}/* 00F6 */, /*193*/{0,17u,65537u,89171992u,40u,1610612768u,12670u,138442753u,67108864u}/* 00F7 */, /*194*/{13696u,17u,131073u,76578818u,1499176u,3768975392u,1719726628u,335591424u,393216u}/* 00F8 */, /*195*/{32519680u,17u,131073u,76578850u,1499176u,3768975392u,1719728356u,293642240u,393216u}/* 00F9 */, /*196*/{33044096u,17u,131073u,76578850u,1499176u,3768975392u,1719728356u,289447936u,393216u}/* 00FA */, /*197*/{33568512u,16u,131073u,76578850u,1499176u,3768975392u,1719728356u,302030848u,393216u}/* 00FB */, /*198*/{34092928u,17u,131073u,76578850u,1499176u,3768975392u,1719728356u,318808064u,393216u}/* 00FC */, /*199*/{34617344u,16u,131073u,76578850u,1499176u,3768975392u,1719729044u,289447936u,393216u}/* 00FD */, /*200*/{14464u,17u,131073u,76578818u,1499176u,3768975392u,1719729596u,138442752u,393216u}/* 00FE */, /*201*/{35141888u,16u,131073u,76578850u,1499176u,3768975392u,1719729044u,318808064u,393216u}/* 00FF */, /*202*/{35666304u,121634840u,131073u,76578849u,1507368u,3807903776u,1711334772u,348217344u,2490368u}/* 0100 */, /*203*/{36190720u,25u,131073u,76578850u,1499176u,3768975392u,1719723380u,348168192u,393216u}/* 0101 */, /*204*/{36715136u,123731992u,131073u,76578849u,1507368u,3807903776u,1711334772u,297885696u,2490368u}/* 0102 */, /*205*/{37239552u,24u,131073u,76578850u,1499176u,3768975392u,1719723380u,297836544u,393216u}/* 0103 */, /*206*/{37763968u,125829144u,131073u,76578849u,1507368u,3807903776u,1711334772u,344023040u,2490368u}/* 0104 */, /*207*/{38288384u,24u,131073u,76578850u,1499176u,3768975392u,1719723380u,343973888u,393216u}/* 0105 */, /*208*/{38812800u,127926296u,131073u,76578849u,1507368u,3807903776u,1711335180u,289497088u,2490368u}/* 0106 */, /*209*/{39337216u,24u,131073u,76578850u,1499176u,3768975392u,1719723788u,289447936u,393216u}/* 0107 */, /*210*/{39861632u,130023448u,131073u,76578849u,1507368u,3807903776u,1711335180u,302080000u,2490368u}/* 0108 */, /*211*/{40386048u,24u,131073u,76578850u,1499176u,3768975392u,1719723788u,302030848u,393216u}/* 0109 */, /*212*/{40910464u,132120600u,131073u,76578849u,1507368u,3807903776u,1711335180u,331440128u,2490368u}/* 010A */, /*213*/{41434880u,24u,131073u,76578850u,1499176u,3768975392u,1719723788u,331390976u,393216u}/* 010B */, /*214*/{41959296u,134217752u,131073u,76578849u,1507368u,3807903776u,1711335180u,306274304u,2490368u}/* 010C */, /*215*/{42483712u,24u,131073u,76578850u,1499176u,3768975392u,1719723788u,306225152u,393216u}/* 010D */, /*216*/{43008128u,136314904u,131073u,76578849u,1507368u,3807903776u,1711335348u,306274304u,2490368u}/* 010E */, /*217*/{43532544u,24u,131073u,76578850u,1499176u,3768975392u,1719723956u,306225152u,393216u}/* 010F */, /*218*/{16768u,138412056u,131073u,76578817u,1507368u,3807903776u,1711335348u,377583616u,2490368u}/* 0110 */, /*219*/{16896u,25u,131073u,76578818u,1499176u,3768975392u,1719723956u,377534464u,393216u}/* 0111 */, /*220*/{44057216u,140509208u,131073u,76578849u,1507368u,3807903776u,1711335564u,348217344u,2490368u}/* 0112 */, /*221*/{44581632u,25u,131073u,76578850u,1499176u,3768975392u,1719724172u,348168192u,393216u}/* 0113 */, /*222*/{45106048u,142606360u,131073u,76578849u,1507368u,3807903776u,1711335564u,297885696u,2490368u}/* 0114 */, /*223*/{45630464u,24u,131073u,76578850u,1499176u,3768975392u,1719724172u,297836544u,393216u}/* 0115 */, /*224*/{46154880u,144703512u,131073u,76578849u,1507368u,3807903776u,1711335564u,331440128u,2490368u}/* 0116 */, /*225*/{46679296u,24u,131073u,76578850u,1499176u,3768975392u,1719724172u,331390976u,393216u}/* 0117 */, /*226*/{47203712u,146800664u,131073u,76578849u,1507368u,3807903776u,1711335564u,344023040u,2490368u}/* 0118 */, /*227*/{47728128u,24u,131073u,76578850u,1499176u,3768975392u,1719724172u,343973888u,393216u}/* 0119 */, /*228*/{48252544u,148897816u,131073u,76578849u,1507368u,3807903776u,1711335564u,306274304u,2490368u}/* 011A */, /*229*/{48776960u,25u,131073u,76578850u,1499176u,3768975392u,1719724172u,306225152u,393216u}/* 011B */, /*230*/{49301376u,150994968u,131073u,76578849u,1507368u,3807903776u,1711336156u,302080000u,2490368u}/* 011C */, /*231*/{49825792u,24u,131073u,76578850u,1499176u,3768975392u,1719724764u,302030848u,393216u}/* 011D */, /*232*/{50350208u,153092120u,131073u,76578849u,1507368u,3807903776u,1711336156u,297885696u,2490368u}/* 011E */, /*233*/{50874624u,24u,131073u,76578850u,1499176u,3768975392u,1719724764u,297836544u,393216u}/* 011F */, /*234*/{51399040u,155189272u,131073u,76578849u,1507368u,3807903776u,1711336156u,331440128u,2490368u}/* 0120 */, /*235*/{51923456u,24u,131073u,76578850u,1499176u,3768975392u,1719724764u,331390976u,393216u}/* 0121 */, /*236*/{52447872u,157286424u,131073u,76578849u,1507368u,3807903776u,1711336156u,339828736u,2490368u}/* 0122 */, /*237*/{52972288u,24u,131073u,76578850u,1499176u,3768975392u,1719724764u,339779584u,393216u}/* 0123 */, /*238*/{53496704u,159383576u,131073u,76578849u,1507368u,3807903776u,1711336444u,302080000u,2490368u}/* 0124 */, /*239*/{54021120u,24u,131073u,76578850u,1499176u,3768975392u,1719725052u,302030848u,393216u}/* 0125 */, /*240*/{19584u,161480729u,131073u,76578817u,1507368u,3807903776u,1711336444u,377583616u,2490368u}/* 0126 */, /*241*/{19712u,25u,131073u,76578818u,1499176u,3768975392u,1719725052u,377534464u,393216u}/* 0127 */, /*242*/{54545792u,163577880u,131073u,76578849u,1507368u,3807903776u,1711336652u,327245824u,2490368u}/* 0128 */, /*243*/{55070208u,24u,131073u,76578850u,1499176u,3768975392u,1719725260u,327196672u,393216u}/* 0129 */, /*244*/{55594624u,165675032u,131073u,76578849u,1507368u,3807903776u,1711336652u,348217344u,2490368u}/* 012A */, /*245*/{56119040u,25u,131073u,76578850u,1499176u,3768975392u,1719725260u,348168192u,393216u}/* 012B */, /*246*/{56643456u,167772184u,131073u,76578849u,1507368u,3807903776u,1711336652u,297885696u,2490368u}/* 012C */, /*247*/{57167872u,24u,131073u,76578850u,1499176u,3768975392u,1719725260u,297836544u,393216u}/* 012D */, /*248*/{57692288u,169869336u,131073u,76578849u,1507368u,3807903776u,1711336652u,344023040u,2490368u}/* 012E */, /*249*/{58216704u,24u,131073u,76578850u,1499176u,3768975392u,1719725260u,343973888u,17170432u}/* 012F */, /*250*/{58741120u,4194328u,131081u,76578849u,1507368u,3774349344u,1711336652u,331440128u,2490368u}/* 0130 */, /*251*/{20992u,25u,131073u,76578818u,1499176u,3768975392u,1719725292u,138442752u,393216u}/* 0131 */, /*252*/{59265664u,171966489u,131073u,76578881u,1507360u,3807903776u,1711397468u,272805888u,2490368u}/* 0132 */, /*253*/{59790080u,25u,131073u,76578882u,1499168u,3769499680u,1719786076u,272707584u,393216u}/* 0133 */, /*254*/{60314496u,174063640u,131073u,76578849u,1507368u,3807903776u,1711336860u,302080000u,2490368u}/* 0134 */, /*255*/{60838912u,24u,131073u,76578850u,1499176u,3768975392u,1719725468u,302030848u,393216u}/* 0135 */, /*256*/{61363328u,176160792u,131073u,76578849u,1507368u,3807903776u,1711337060u,339828736u,2490368u}/* 0136 */, /*257*/{61887744u,24u,131073u,76578850u,1499176u,3768975392u,1719725668u,339779584u,393216u}/* 0137 */, /*258*/{0,25u,131073u,76578818u,1499176u,3766485024u,1719727284u,138442752u,393216u}/* 0138 */, /*259*/{62412160u,178257944u,131073u,76578849u,1507368u,3807903776u,1711337204u,289497088u,2490368u}/* 0139 */, /*260*/{62936576u,24u,131073u,76578850u,1499176u,3768975392u,1719725812u,289447936u,393216u}/* 013A */, /*261*/{63460992u,180355096u,131073u,76578849u,1507368u,3807903776u,1711337204u,339828736u,2490368u}/* 013B */, /*262*/{63985408u,24u,131073u,76578850u,1499176u,3768975392u,1719725812u,339779584u,393216u}/* 013C */, /*263*/{64509824u,182452248u,131073u,76578849u,1507368u,3807903776u,1711337204u,306274304u,2490368u}/* 013D */, /*264*/{65034240u,24u,131073u,76578850u,1499176u,3768975392u,1719725812u,306225152u,393216u}/* 013E */, /*265*/{65558656u,184549401u,131073u,76578881u,1507360u,3807903776u,1711337204u,1283551232u,2490368u}/* 013F */, /*266*/{66083072u,25u,131073u,76578882u,1499168u,3769499680u,1719725812u,1283502080u,393216u}/* 0140 */, /*267*/{22912u,186646553u,131073u,76578817u,1507368u,3807903776u,1711337204u,377583616u,2490368u}/* 0141 */, /*268*/{23040u,25u,131073u,76578818u,1499176u,3768975392u,1719725812u,377534464u,393216u}/* 0142 */, /*269*/{66607744u,188743704u,131073u,76578849u,1507368u,3807903776u,1711337732u,289497088u,2490368u}/* 0143 */, /*270*/{67132160u,25u,131073u,76578850u,1499176u,3768975392u,1719726340u,289447936u,393216u}/* 0144 */, /*271*/{67656576u,190840856u,131073u,76578849u,1507368u,3807903776u,1711337732u,339828736u,2490368u}/* 0145 */, /*272*/{68180992u,24u,131073u,76578850u,1499176u,3768975392u,1719726340u,339779584u,393216u}/* 0146 */, /*273*/{68705408u,192938008u,131073u,76578849u,1507368u,3807903776u,1711337732u,306274304u,2490368u}/* 0147 */, /*274*/{69229824u,25u,131073u,76578850u,1499176u,3768975392u,1719726340u,306225152u,393216u}/* 0148 */, /*275*/{69730304u,6291481u,131137u,76578882u,1499168u,3773710368u,1719791652u,272707584u,393216u}/* 0149 */, /*276*/{23936u,195035161u,131073u,76578817u,1507368u,3807903776u,1711337980u,138491904u,2490368u}/* 014A */, /*277*/{24064u,25u,131073u,76578818u,1499176u,3768975392u,1719726588u,138442752u,393216u}/* 014B */, /*278*/{70278784u,197132312u,131073u,76578849u,1507368u,3807903776u,1711338020u,348217344u,2490368u}/* 014C */, /*279*/{70803200u,25u,131073u,76578850u,1499176u,3768975392u,1719726628u,348168192u,393216u}/* 014D */, /*280*/{71327616u,199229464u,131073u,76578849u,1507368u,3807903776u,1711338020u,297885696u,2490368u}/* 014E */, /*281*/{71852032u,24u,131073u,76578850u,1499176u,3768975392u,1719726628u,297836544u,393216u}/* 014F */, /*282*/{72376448u,201326616u,131073u,76578849u,1507368u,3807903776u,1711338020u,323051520u,2490368u}/* 0150 */, /*283*/{72900864u,24u,131073u,76578850u,1499176u,3768975392u,1719726628u,323002368u,393216u}/* 0151 */, /*284*/{24960u,203423769u,131073u,76578817u,1507368u,3807903776u,1711397540u,1417885696u,2490368u}/* 0152 */, /*285*/{25088u,25u,131073u,76578818u,1499176u,3768975392u,1719786148u,1417787392u,393216u}/* 0153 */, /*286*/{73425536u,205520920u,131073u,76578849u,1507368u,3807903776u,1711338708u,289497088u,2490368u}/* 0154 */, /*287*/{73949952u,24u,131073u,76578850u,1499176u,3768975392u,1719727316u,289447936u,393216u}/* 0155 */, /*288*/{74474368u,207618072u,131073u,76578849u,1507368u,3807903776u,1711338708u,339828736u,2490368u}/* 0156 */, /*289*/{74998784u,24u,131073u,76578850u,1499176u,3768975392u,1719727316u,339779584u,393216u}/* 0157 */, /*290*/{75523200u,209715224u,131073u,76578849u,1507368u,3807903776u,1711338708u,306274304u,2490368u}/* 0158 */, /*291*/{76047616u,24u,131073u,76578850u,1499176u,3768975392u,1719727316u,306225152u,393216u}/* 0159 */, /*292*/{76572032u,211812376u,131073u,76578849u,1507368u,3807903776u,1711339204u,289497088u,2490368u}/* 015A */, /*293*/{77096448u,24u,131073u,76578850u,1499176u,3768975392u,1719727812u,289447936u,393216u}/* 015B */, /*294*/{77620864u,213909528u,131073u,76578849u,1507368u,3807903776u,1711339204u,302080000u,2490368u}/* 015C */, /*295*/{78145280u,24u,131073u,76578850u,1499176u,3768975392u,1719727812u,302030848u,393216u}/* 015D */, /*296*/{78669696u,216006680u,131073u,76578849u,1507368u,3807903776u,1711339204u,339828736u,2490368u}/* 015E */, /*297*/{79194112u,24u,131073u,76578850u,1499176u,3768975392u,1719727812u,339779584u,393216u}/* 015F */, /*298*/{79718528u,218103832u,131073u,76578849u,1507368u,3807903776u,1711339204u,306274304u,2490368u}/* 0160 */, /*299*/{80242944u,24u,131073u,76578850u,1499176u,3768975392u,1719727812u,306225152u,393216u}/* 0161 */, /*300*/{80767360u,220200984u,131073u,76578849u,1507368u,3807903776u,1711339492u,339828736u,2490368u}/* 0162 */, /*301*/{81291776u,24u,131073u,76578850u,1499176u,3768975392u,1719728100u,339779584u,393216u}/* 0163 */, /*302*/{81816192u,222298136u,131073u,76578849u,1507368u,3807903776u,1711339492u,306274304u,2490368u}/* 0164 */, /*303*/{82340608u,24u,131073u,76578850u,1499176u,3768975392u,1719728100u,306225152u,393216u}/* 0165 */, /*304*/{27520u,224395289u,131073u,76578817u,1507368u,3807903776u,1711339532u,138491904u,2490368u}/* 0166 */, /*305*/{27648u,25u,131073u,76578818u,1499176u,3768975392u,1719728140u,138442752u,393216u}/* 0167 */, /*306*/{82865280u,226492440u,131073u,76578849u,1507368u,3807903776u,1711339748u,327245824u,2490368u}/* 0168 */, /*307*/{83389696u,24u,131073u,76578850u,1499176u,3768975392u,1719728356u,327196672u,393216u}/* 0169 */, /*308*/{83914112u,228589592u,131073u,76578849u,1507368u,3807903776u,1711339748u,348217344u,2490368u}/* 016A */, /*309*/{84438528u,25u,131073u,76578850u,1499176u,3768975392u,1719728356u,348168192u,393216u}/* 016B */, /*310*/{84962944u,230686744u,131073u,76578849u,1507368u,3807903776u,1711339748u,297885696u,2490368u}/* 016C */, /*311*/{85487360u,24u,131073u,76578850u,1499176u,3768975392u,1719728356u,297836544u,393216u}/* 016D */, /*312*/{86011776u,232783896u,131073u,76578849u,1507368u,3807903776u,1711339748u,310468608u,2490368u}/* 016E */, /*313*/{86536192u,24u,131073u,76578850u,1499176u,3768975392u,1719728356u,310419456u,393216u}/* 016F */, /*314*/{87060608u,234881048u,131073u,76578849u,1507368u,3807903776u,1711339748u,323051520u,2490368u}/* 0170 */, /*315*/{87585024u,24u,131073u,76578850u,1499176u,3768975392u,1719728356u,323002368u,393216u}/* 0171 */, /*316*/{88109440u,236978200u,131073u,76578849u,1507368u,3807903776u,1711339748u,344023040u,2490368u}/* 0172 */, /*317*/{88633856u,24u,131073u,76578850u,1499176u,3768975392u,1719728356u,343973888u,393216u}/* 0173 */, /*318*/{89158272u,239075352u,131073u,76578849u,1507368u,3807903776u,1711340260u,302080000u,2490368u}/* 0174 */, /*319*/{89682688u,24u,131073u,76578850u,1499176u,3768975392u,1719728868u,302030848u,393216u}/* 0175 */, /*320*/{90207104u,241172504u,131073u,76578849u,1507368u,3807903776u,1711340436u,302080000u,2490368u}/* 0176 */, /*321*/{90731520u,24u,131073u,76578850u,1499176u,3768975392u,1719729044u,302030848u,393216u}/* 0177 */, /*322*/{91255936u,243269656u,131073u,76578849u,1507368u,3807903776u,1711340436u,318857216u,2490368u}/* 0178 */, /*323*/{91780352u,245366808u,131073u,76578849u,1507368u,3807903776u,1711340612u,289497088u,2490368u}/* 0179 */, /*324*/{92304768u,24u,131073u,76578850u,1499176u,3768975392u,1719729220u,289447936u,393216u}/* 017A */, /*325*/{92829184u,247463960u,131073u,76578849u,1507368u,3807903776u,1711340612u,331440128u,2490368u}/* 017B */, /*326*/{93353600u,24u,131073u,76578850u,1499176u,3768975392u,1719729220u,331390976u,393216u}/* 017C */, /*327*/{93878016u,249561112u,131073u,76578849u,1507368u,3807903776u,1711340612u,306274304u,2490368u}/* 017D */, /*328*/{94402432u,24u,131073u,76578850u,1499176u,3768975392u,1719729220u,306225152u,393216u}/* 017E */, /*329*/{94926848u,251658264u,131073u,76578882u,1499168u,3807248416u,1719727812u,1287729152u,393216u}/* 017F */, /*330*/{30848u,32u,131073u,76578818u,1499176u,3768975392u,1719723644u,138442752u,393216u}/* 0180 */, /*331*/{30976u,253755424u,131073u,76578817u,1507368u,3807903776u,1711335108u,138491904u,2490368u}/* 0181 */, /*332*/{31104u,255852576u,131073u,76578817u,1507368u,3807903776u,1711335140u,138491904u,2490368u}/* 0182 */, /*333*/{31232u,32u,131073u,76578818u,1499176u,3768975392u,1719723748u,138442752u,393216u}/* 0183 */, /*334*/{31360u,257949728u,131073u,76578817u,1507368u,3807903776u,1711341252u,138491904u,2490368u}/* 0184 */, /*335*/{31488u,32u,131073u,76578818u,1499176u,3768975392u,1719729860u,138442752u,393216u}/* 0185 */, /*336*/{31616u,260046880u,131073u,76578817u,1507368u,3807903776u,1711338172u,138491904u,2490368u}/* 0186 */, /*337*/{31744u,262144032u,131073u,76578817u,1507368u,3807903776u,1711335268u,138491904u,2490368u}/* 0187 */, /*338*/{31872u,32u,131073u,76578818u,1499176u,3768975392u,1719723876u,138442752u,393216u}/* 0188 */, /*339*/{32000u,264241184u,131073u,76578817u,1507368u,3807903776u,1711335412u,138491904u,2490368u}/* 0189 */, /*340*/{32128u,266338336u,131073u,76578817u,1507368u,3807903776u,1711335444u,138491904u,2490368u}/* 018A */, /*341*/{32256u,268435488u,131073u,76578817u,1507368u,3807903776u,1711335484u,138491904u,2490368u}/* 018B */, /*342*/{32384u,32u,131073u,76578818u,1499176u,3768975392u,1719724092u,138442752u,393216u}/* 018C */, /*343*/{0,32u,131073u,76578818u,1499176u,3766485024u,1719793436u,272709632u,393216u}/* 018D */, /*344*/{32512u,270532640u,131073u,76578817u,1507368u,3807903776u,1711335676u,138491904u,2490368u}/* 018E */, /*345*/{32640u,272629792u,131073u,76578817u,1507368u,3807903776u,1711335716u,138491904u,2490368u}/* 018F */, /*346*/{32768u,274726944u,131073u,76578817u,1507368u,3807903776u,1711335756u,138491904u,2490368u}/* 0190 */, /*347*/{32896u,276824096u,131073u,76578817u,1507368u,3807903776u,1711336108u,138491904u,2490368u}/* 0191 */, /*348*/{33024u,32u,131073u,76578818u,1499176u,3768975392u,1719724716u,138442752u,393216u}/* 0192 */, /*349*/{33152u,278921248u,131073u,76578817u,1507368u,3807903776u,1711336300u,138491904u,2490368u}/* 0193 */, /*350*/{33280u,281018400u,131073u,76578817u,1507368u,3807903776u,1711336380u,138491904u,2490368u}/* 0194 */, /*351*/{33408u,32u,131073u,76578818u,1499176u,3768975392u,1719725116u,138442752u,393216u}/* 0195 */, /*352*/{33536u,283115552u,131073u,76578817u,1507368u,3807903776u,1711336820u,138491904u,2490368u}/* 0196 */, /*353*/{33664u,285212704u,131073u,76578817u,1507368u,3807903776u,1711336772u,138491904u,2490368u}/* 0197 */, /*354*/{33792u,287309856u,131073u,76578817u,1507368u,3807903776u,1711337108u,138491904u,2490368u}/* 0198 */, /*355*/{33920u,32u,131073u,76578818u,1499176u,3768975392u,1719725716u,138442752u,393216u}/* 0199 */, /*356*/{34048u,32u,131073u,76578818u,1499176u,3768975392u,1719725900u,138442752u,393216u}/* 019A */, /*357*/{0,32u,131073u,76578818u,1499176u,3766485024u,1719726156u,138442752u,393216u}/* 019B */, /*358*/{34176u,289407008u,131073u,76578817u,1507368u,3807903776u,1711339996u,138491904u,2490368u}/* 019C */, /*359*/{34304u,291504160u,131073u,76578817u,1507368u,3807903776u,1711337820u,138491904u,2490368u}/* 019D */, /*360*/{34432u,32u,131073u,76578818u,1499176u,3768975392u,1719726460u,138442752u,393216u}/* 019E */, /*361*/{34560u,293601312u,131073u,76578817u,1507368u,3807903776u,1711338276u,138491904u,2490368u}/* 019F */, /*362*/{95455104u,295698464u,131073u,76578849u,1507368u,3807903776u,1711338020u,402743296u,2490368u}/* 01A0 */, /*363*/{95979520u,32u,131073u,76578850u,1499176u,3768975392u,1719726628u,402694144u,393216u}/* 01A1 */, /*364*/{34944u,297795616u,131073u,76578817u,1507368u,3807903776u,1711336412u,138491904u,2490368u}/* 01A2 */, /*365*/{35072u,32u,131073u,76578818u,1499176u,3768975392u,1719725020u,138442752u,393216u}/* 01A3 */, /*366*/{35200u,299892768u,131073u,76578817u,1507368u,3807903776u,1711338468u,138491904u,2490368u}/* 01A4 */, /*367*/{35328u,32u,131073u,76578818u,1499176u,3768975392u,1719727076u,138442752u,393216u}/* 01A5 */, /*368*/{35456u,301989920u,131073u,76578817u,1507368u,3807903776u,1711338748u,138491904u,2490368u}/* 01A6 */, /*369*/{35584u,304087072u,131073u,76578817u,1507368u,3807903776u,1711341188u,138491904u,2490368u}/* 01A7 */, /*370*/{35712u,32u,131073u,76578818u,1499176u,3768975392u,1719729796u,138442752u,393216u}/* 01A8 */, /*371*/{35840u,306184224u,131073u,76578817u,1507368u,3807903776u,1711339340u,138491904u,2490368u}/* 01A9 */, /*372*/{0,32u,131073u,76578818u,1499176u,3766485024u,1719727996u,138442752u,393216u}/* 01AA */, /*373*/{0,32u,131073u,76578818u,1499176u,3766485024u,1719728188u,138442752u,393216u}/* 01AB */, /*374*/{35968u,308281376u,131073u,76578817u,1507368u,3807903776u,1711339612u,138491904u,2490368u}/* 01AC */, /*375*/{36096u,32u,131073u,76578818u,1499176u,3768975392u,1719728220u,138442752u,393216u}/* 01AD */, /*376*/{36224u,310378528u,131073u,76578817u,1507368u,3807903776u,1711339644u,138491904u,2490368u}/* 01AE */, /*377*/{96505344u,312475680u,131073u,76578849u,1507368u,3807903776u,1711339748u,402743296u,2490368u}/* 01AF */, /*378*/{97029760u,32u,131073u,76578850u,1499176u,3768975392u,1719728356u,402694144u,393216u}/* 01B0 */, /*379*/{36608u,314572832u,131073u,76578817u,1507368u,3807903776u,1711340076u,138491904u,2490368u}/* 01B1 */, /*380*/{36736u,316669984u,131073u,76578817u,1507368u,3807903776u,1711340172u,138491904u,2490368u}/* 01B2 */, /*381*/{36864u,318767136u,131073u,76578817u,1507368u,3807903776u,1711340532u,138491904u,2490368u}/* 01B3 */, /*382*/{36992u,32u,131073u,76578818u,1499176u,3768975392u,1719729140u,138442752u,393216u}/* 01B4 */, /*383*/{37120u,320864288u,131073u,76578817u,1507368u,3807903776u,1711340652u,138491904u,2490368u}/* 01B5 */, /*384*/{37248u,32u,131073u,76578818u,1499176u,3768975392u,1719729260u,138442752u,393216u}/* 01B6 */, /*385*/{37376u,322961440u,131073u,76578817u,1507368u,3807903776u,1711340844u,138491904u,2490368u}/* 01B7 */, /*386*/{37504u,325058592u,131073u,76578817u,1507368u,3807903776u,1711340884u,138491904u,2490368u}/* 01B8 */, /*387*/{37632u,32u,131073u,76578818u,1499176u,3768975392u,1719729492u,138442752u,393216u}/* 01B9 */, /*388*/{0,32u,131073u,76578818u,1499176u,3766485024u,1719729532u,138442752u,393216u}/* 01BA */, /*389*/{0,32u,131073u,76578821u,1515560u,3758096416u,1677786700u,138442752u,393216u}/* 01BB */, /*390*/{37760u,327155744u,131073u,76578817u,1507368u,3807903776u,1711341220u,138491904u,2490368u}/* 01BC */, /*391*/{37888u,32u,131073u,76578818u,1499176u,3768975392u,1719729828u,138442752u,393216u}/* 01BD */, /*392*/{0,32u,131073u,76578818u,1499176u,3766485024u,1719791260u,272709632u,393216u}/* 01BE */, /*393*/{38016u,32u,131073u,76578818u,1499176u,3768975392u,1719729644u,138442752u,393216u}/* 01BF */, /*394*/{0,32u,131073u,76578821u,1515560u,3758096416u,1677787140u,138442752u,393216u}/* 01C0 */, /*395*/{0,32u,131073u,76578821u,1515560u,3758096416u,1677787172u,138442752u,393216u}/* 01C1 */, /*396*/{0,32u,131073u,76578821u,1515560u,3758096416u,1677787204u,138442752u,393216u}/* 01C2 */, /*397*/{0,32u,131073u,76578821u,1515560u,3758096416u,1677787236u,138442752u,393216u}/* 01C3 */, /*398*/{97555712u,329252896u,131073u,76578881u,1507360u,3808165920u,1711399916u,440610816u,2490368u}/* 01C4 */, /*399*/{98080128u,331350048u,131073u,76578883u,1507360u,3808034848u,1711399916u,440561664u,393216u}/* 01C5 */, /*400*/{98604544u,32u,131073u,76578882u,1499168u,3769499680u,1719788524u,440512512u,393216u}/* 01C6 */, /*401*/{99128960u,333447200u,131073u,76578881u,1507360u,3808165920u,1711398020u,272805888u,2490368u}/* 01C7 */, /*402*/{99653376u,335544352u,131073u,76578883u,1507360u,3808034848u,1711398020u,272756736u,393216u}/* 01C8 */, /*403*/{100177792u,32u,131073u,76578882u,1499168u,3769499680u,1719786628u,272707584u,393216u}/* 01C9 */, /*404*/{100702208u,337641504u,131073u,76578881u,1507360u,3808165920u,1711398548u,272805888u,2490368u}/* 01CA */, /*405*/{101226624u,339738656u,131073u,76578883u,1507360u,3808034848u,1711398548u,272756736u,393216u}/* 01CB */, /*406*/{101751040u,32u,131073u,76578882u,1499168u,3769499680u,1719787156u,272707584u,393216u}/* 01CC */, /*407*/{102275456u,341835808u,131073u,76578849u,1507368u,3807903776u,1711334772u,306274304u,2490368u}/* 01CD */, /*408*/{102799872u,33u,131073u,76578850u,1499176u,3768975392u,1719723380u,306225152u,393216u}/* 01CE */, /*409*/{103324288u,343932960u,131073u,76578849u,1507368u,3807903776u,1711336652u,306274304u,2490368u}/* 01CF */, /*410*/{103848704u,33u,131073u,76578850u,1499176u,3768975392u,1719725260u,306225152u,393216u}/* 01D0 */, /*411*/{104373120u,346030112u,131073u,76578849u,1507368u,3807903776u,1711338020u,306274304u,2490368u}/* 01D1 */, /*412*/{104897536u,33u,131073u,76578850u,1499176u,3768975392u,1719726628u,306225152u,393216u}/* 01D2 */, /*413*/{105421952u,348127264u,131073u,76578849u,1507368u,3807903776u,1711339748u,306274304u,2490368u}/* 01D3 */, /*414*/{105946368u,33u,131073u,76578850u,1499176u,3768975392u,1719728356u,306225152u,393216u}/* 01D4 */, /*415*/{106470784u,350224416u,131073u,76578849u,1507368u,3807903776u,1711339748u,528588800u,2490368u}/* 01D5 */, /*416*/{106995200u,33u,131073u,76578850u,1499176u,3768975392u,1719728356u,528539648u,393216u}/* 01D6 */, /*417*/{107519616u,352321568u,131073u,76578849u,1507368u,3807903776u,1711339748u,469868544u,2490368u}/* 01D7 */, /*418*/{108044032u,33u,131073u,76578850u,1499176u,3768975392u,1719728356u,469819392u,393216u}/* 01D8 */, /*419*/{108568448u,354418720u,131073u,76578849u,1507368u,3807903776u,1711339748u,486645760u,2490368u}/* 01D9 */, /*420*/{109092864u,33u,131073u,76578850u,1499176u,3768975392u,1719728356u,486596608u,393216u}/* 01DA */, /*421*/{109617280u,356515872u,131073u,76578849u,1507368u,3807903776u,1711339748u,474062848u,2490368u}/* 01DB */, /*422*/{110141696u,33u,131073u,76578850u,1499176u,3768975392u,1719728356u,474013696u,393216u}/* 01DC */, /*423*/{41344u,32u,131073u,76578818u,1499176u,3768975392u,1719724284u,138442752u,393216u}/* 01DD */, /*424*/{110666240u,358613024u,131073u,76578849u,1507368u,3807903776u,1711334772u,528588800u,2490368u}/* 01DE */, /*425*/{111190656u,32u,131073u,76578850u,1499176u,3768975392u,1719723380u,528539648u,393216u}/* 01DF */, /*426*/{111715072u,360710176u,131073u,76578849u,1507368u,3807903776u,1711334772u,541171712u,2490368u}/* 01E0 */, /*427*/{112239488u,32u,131073u,76578850u,1499176u,3768975392u,1719723380u,541122560u,393216u}/* 01E1 */, /*428*/{112763904u,362807328u,131073u,76578849u,1507368u,3807903776u,1711394292u,1627611136u,2490368u}/* 01E2 */, /*429*/{113288320u,32u,131073u,76578850u,1499176u,3768975392u,1719782900u,1627512832u,393216u}/* 01E3 */, /*430*/{42240u,364904480u,131073u,76578817u,1507368u,3807903776u,1711336260u,138491904u,2490368u}/* 01E4 */, /*431*/{42368u,32u,131073u,76578818u,1499176u,3768975392u,1719724868u,138442752u,393216u}/* 01E5 */, /*432*/{113812992u,367001632u,131073u,76578849u,1507368u,3807903776u,1711336156u,306274304u,2490368u}/* 01E6 */, /*433*/{114337408u,32u,131073u,76578850u,1499176u,3768975392u,1719724764u,306225152u,393216u}/* 01E7 */, /*434*/{114861824u,369098784u,131073u,76578849u,1507368u,3807903776u,1711337060u,306274304u,2490368u}/* 01E8 */, /*435*/{115386240u,32u,131073u,76578850u,1499176u,3768975392u,1719725668u,306225152u,393216u}/* 01E9 */, /*436*/{115910656u,371195936u,131073u,76578849u,1507368u,3807903776u,1711338020u,344023040u,2490368u}/* 01EA */, /*437*/{116435072u,32u,131073u,76578850u,1499176u,3768975392u,1719726628u,343973888u,393216u}/* 01EB */, /*438*/{116959488u,373293088u,131073u,76578849u,1507368u,3807903776u,1711338020u,553754624u,2490368u}/* 01EC */, /*439*/{117483904u,32u,131073u,76578850u,1499176u,3768975392u,1719726628u,553705472u,393216u}/* 01ED */, /*440*/{118008320u,375390240u,131073u,76578849u,1507368u,3807903776u,1711340844u,306274304u,2490368u}/* 01EE */, /*441*/{118532736u,32u,131073u,76578850u,1499176u,3768975392u,1719729452u,306225152u,393216u}/* 01EF */, /*442*/{119013376u,8388640u,131149u,76578850u,1499176u,3768975392u,1719725468u,306225152u,393216u}/* 01F0 */, /*443*/{119581440u,377487392u,131073u,76578881u,1507360u,3808165920u,1711399916u,272805888u,2490368u}/* 01F1 */, /*444*/{120105856u,379584544u,131073u,76578883u,1507360u,3808034848u,1711399916u,272756736u,393216u}/* 01F2 */, /*445*/{120630272u,32u,131073u,76578882u,1499168u,3769499680u,1719788524u,272707584u,393216u}/* 01F3 */, /*446*/{121154688u,381681696u,131073u,76578849u,1507368u,3807903776u,1711336156u,289497088u,2490368u}/* 01F4 */, /*447*/{121679104u,32u,131073u,76578850u,1499176u,3768975392u,1719724764u,289447936u,393216u}/* 01F5 */, /*448*/{44416u,383778848u,131073u,76677121u,1507368u,3807903776u,1711336508u,138491904u,2490368u}/* 01F6 */, /*449*/{44544u,385876000u,131073u,76677121u,1507368u,3807903776u,1711341036u,138491904u,2490368u}/* 01F7 */, /*450*/{122203776u,387973152u,131073u,76677153u,1507368u,3807903776u,1711337732u,293691392u,2490368u}/* 01F8 */, /*451*/{122728192u,32u,131073u,76677154u,1499176u,3768975392u,1719726340u,293642240u,393216u}/* 01F9 */, /*452*/{123252608u,390070304u,131073u,76578849u,1507368u,3807903776u,1711334772u,461479936u,2490368u}/* 01FA */, /*453*/{123777024u,32u,131073u,76578850u,1499176u,3768975392u,1719723380u,461430784u,393216u}/* 01FB */, /*454*/{124301440u,392167456u,131073u,76578849u,1507368u,3807903776u,1711394292u,1568890880u,2490368u}/* 01FC */, /*455*/{124825856u,32u,131073u,76578850u,1499176u,3768975392u,1719782900u,1568792576u,393216u}/* 01FD */, /*456*/{125350272u,394264608u,131073u,76578849u,1507368u,3807903776u,1711338020u,486645760u,2490368u}/* 01FE */, /*457*/{125874688u,32u,131073u,76578850u,1499176u,3768975392u,1719726628u,486596608u,393216u}/* 01FF */, /*458*/{126399104u,396361760u,131073u,76578849u,1507368u,3807903776u,1711334772u,390160384u,2490368u}/* 0200 */, /*459*/{126923520u,32u,131073u,76578850u,1499176u,3768975392u,1719723380u,390111232u,393216u}/* 0201 */, /*460*/{127447936u,398458912u,131073u,76578849u,1507368u,3807903776u,1711334772u,398548992u,2490368u}/* 0202 */, /*461*/{127972352u,32u,131073u,76578850u,1499176u,3768975392u,1719723380u,398499840u,393216u}/* 0203 */, /*462*/{128496768u,400556064u,131073u,76578849u,1507368u,3807903776u,1711335564u,390160384u,2490368u}/* 0204 */, /*463*/{129021184u,32u,131073u,76578850u,1499176u,3768975392u,1719724172u,390111232u,393216u}/* 0205 */, /*464*/{129545600u,402653216u,131073u,76578849u,1507368u,3807903776u,1711335564u,398548992u,2490368u}/* 0206 */, /*465*/{130070016u,32u,131073u,76578850u,1499176u,3768975392u,1719724172u,398499840u,393216u}/* 0207 */, /*466*/{130594432u,404750368u,131073u,76578849u,1507368u,3807903776u,1711336652u,390160384u,2490368u}/* 0208 */, /*467*/{131118848u,32u,131073u,76578850u,1499176u,3768975392u,1719725260u,390111232u,393216u}/* 0209 */, /*468*/{131643264u,406847520u,131073u,76578849u,1507368u,3807903776u,1711336652u,398548992u,2490368u}/* 020A */, /*469*/{132167680u,32u,131073u,76578850u,1499176u,3768975392u,1719725260u,398499840u,393216u}/* 020B */, /*470*/{132692096u,408944672u,131073u,76578849u,1507368u,3807903776u,1711338020u,390160384u,2490368u}/* 020C */, /*471*/{133216512u,32u,131073u,76578850u,1499176u,3768975392u,1719726628u,390111232u,393216u}/* 020D */, /*472*/{133740928u,411041824u,131073u,76578849u,1507368u,3807903776u,1711338020u,398548992u,2490368u}/* 020E */, /*473*/{134265344u,32u,131073u,76578850u,1499176u,3768975392u,1719726628u,398499840u,393216u}/* 020F */, /*474*/{134789760u,413138976u,131073u,76578849u,1507368u,3807903776u,1711338708u,390160384u,2490368u}/* 0210 */, /*475*/{135314176u,32u,131073u,76578850u,1499176u,3768975392u,1719727316u,390111232u,393216u}/* 0211 */, /*476*/{135838592u,415236128u,131073u,76578849u,1507368u,3807903776u,1711338708u,398548992u,2490368u}/* 0212 */, /*477*/{136363008u,32u,131073u,76578850u,1499176u,3768975392u,1719727316u,398499840u,393216u}/* 0213 */, /*478*/{136887424u,417333280u,131073u,76578849u,1507368u,3807903776u,1711339748u,390160384u,2490368u}/* 0214 */, /*479*/{137411840u,32u,131073u,76578850u,1499176u,3768975392u,1719728356u,390111232u,393216u}/* 0215 */, /*480*/{137936256u,419430432u,131073u,76578849u,1507368u,3807903776u,1711339748u,398548992u,2490368u}/* 0216 */, /*481*/{138460672u,32u,131073u,76578850u,1499176u,3768975392u,1719728356u,398499840u,393216u}/* 0217 */, /*482*/{138985088u,421527584u,131073u,76677153u,1507368u,3807903776u,1711339204u,427909120u,2490368u}/* 0218 */, /*483*/{139509504u,32u,131073u,76677154u,1499176u,3768975392u,1719727812u,427859968u,393216u}/* 0219 */, /*484*/{140033920u,423624736u,131073u,76677153u,1507368u,3807903776u,1711339492u,427909120u,2490368u}/* 021A */, /*485*/{140558336u,32u,131073u,76677154u,1499176u,3768975392u,1719728100u,427859968u,393216u}/* 021B */, /*486*/{49280u,425721888u,131073u,76677121u,1507368u,3807903776u,1711340580u,138491904u,2490368u}/* 021C */, /*487*/{49408u,32u,131073u,76677122u,1499176u,3768975392u,1719729188u,138442752u,393216u}/* 021D */, /*488*/{141083008u,427819040u,131073u,76677153u,1507368u,3807903776u,1711336444u,306274304u,2490368u}/* 021E */, /*489*/{141607424u,32u,131073u,76677154u,1499176u,3768975392u,1719725052u,306225152u,393216u}/* 021F */, /*490*/{49792u,429916192u,131073u,76742657u,1507368u,3807903776u,1711337852u,138491904u,2490368u}/* 0220 */, /*491*/{0,32u,131073u,76775426u,1499176u,3766485024u,1719724124u,138442752u,393216u}/* 0221 */, /*492*/{49920u,432013344u,131073u,76677121u,1507368u,3807903776u,1711338356u,138491904u,2490368u}/* 0222 */, /*493*/{50048u,32u,131073u,76677122u,1499176u,3768975392u,1719726964u,138442752u,393216u}/* 0223 */, /*494*/{50176u,434110496u,131073u,76677121u,1507368u,3807903776u,1711340700u,138491904u,2490368u}/* 0224 */, /*495*/{50304u,32u,131073u,76677122u,1499176u,3768975392u,1719729308u,138442752u,393216u}/* 0225 */, /*496*/{142132480u,436207648u,131073u,76677153u,1507368u,3807903776u,1711334772u,331440128u,2490368u}/* 0226 */, /*497*/{142656896u,32u,131073u,76677154u,1499176u,3768975392u,1719723380u,331390976u,393216u}/* 0227 */, /*498*/{143181312u,438304800u,131073u,76677153u,1507368u,3807903776u,1711335564u,339828736u,2490368u}/* 0228 */, /*499*/{143705728u,32u,131073u,76677154u,1499176u,3768975392u,1719724172u,339779584u,393216u}/* 0229 */, /*500*/{144230144u,440401952u,131073u,76677153u,1507368u,3807903776u,1711338020u,528588800u,2490368u}/* 022A */, /*501*/{144754560u,32u,131073u,76677154u,1499176u,3768975392u,1719726628u,528539648u,393216u}/* 022B */, /*502*/{145278976u,442499104u,131073u,76677153u,1507368u,3807903776u,1711338020u,536977408u,2490368u}/* 022C */, /*503*/{145803392u,32u,131073u,76677154u,1499176u,3768975392u,1719726628u,536928256u,393216u}/* 022D */, /*504*/{146327808u,444596256u,131073u,76677153u,1507368u,3807903776u,1711338020u,331440128u,2490368u}/* 022E */, /*505*/{146852224u,32u,131073u,76677154u,1499176u,3768975392u,1719726628u,331390976u,393216u}/* 022F */, /*506*/{147376640u,446693408u,131073u,76677153u,1507368u,3807903776u,1711338020u,541171712u,2490368u}/* 0230 */, /*507*/{147901056u,32u,131073u,76677154u,1499176u,3768975392u,1719726628u,541122560u,393216u}/* 0231 */, /*508*/{148425472u,448790560u,131073u,76677153u,1507368u,3807903776u,1711340436u,348217344u,2490368u}/* 0232 */, /*509*/{148949888u,32u,131073u,76677154u,1499176u,3768975392u,1719729044u,348168192u,393216u}/* 0233 */, /*510*/{0,32u,131073u,76775426u,1499176u,3766485024u,1719726076u,138442752u,393216u}/* 0234 */, /*511*/{0,32u,131073u,76775426u,1499176u,3766485024u,1719726540u,138442752u,393216u}/* 0235 */, /*512*/{0,32u,131073u,76775426u,1499176u,3766485024u,1719728284u,138442752u,393216u}/* 0236 */, /*513*/{0,32u,131073u,76808194u,1499176u,3766485024u,1719725500u,138442752u,393216u}/* 0237 */, /*514*/{0,32u,131073u,76808194u,1499176u,3766485024u,1719782884u,272709632u,393216u}/* 0238 */, /*515*/{0,32u,131073u,76808194u,1499176u,3766485024u,1719789524u,272709632u,393216u}/* 0239 */, /*516*/{52224u,450887712u,131073u,76808193u,1507368u,3807903776u,1711334812u,138491904u,2490368u}/* 023A */, /*517*/{52352u,452984864u,131073u,76808193u,1507368u,3807903776u,1711335220u,138491904u,2490368u}/* 023B */, /*518*/{52480u,32u,131073u,76808194u,1499176u,3768975392u,1719723828u,138442752u,393216u}/* 023C */, /*519*/{52608u,455082016u,131073u,76808193u,1507368u,3807903776u,1711337292u,138491904u,2490368u}/* 023D */, /*520*/{52736u,457179168u,131073u,76808193u,1507368u,3807903776u,1711339564u,138491904u,2490368u}/* 023E */, /*521*/{52864u,32u,131073u,76808194u,1499176u,3768975392u,1719727900u,138442752u,393216u}/* 023F */, /*522*/{52992u,32u,131073u,76808194u,1499176u,3768975392u,1719729404u,138442752u,393216u}/* 0240 */, /*523*/{53120u,459276320u,131073u,76808193u,1507368u,3807903776u,1711341316u,138491904u,2490368u}/* 0241 */, /*524*/{53248u,32u,131073u,76840962u,1499176u,3768975392u,1719729924u,138442752u,393216u}/* 0242 */, /*525*/{53376u,461373472u,131073u,76840961u,1507368u,3807903776u,1711335036u,138491904u,2490368u}/* 0243 */, /*526*/{53504u,463470624u,131073u,76840961u,1507368u,3807903776u,1711339836u,138491904u,2490368u}/* 0244 */, /*527*/{53632u,465567776u,131073u,76840961u,1507368u,3807903776u,1711340228u,138491904u,2490368u}/* 0245 */, /*528*/{53760u,467664928u,131073u,76840961u,1507368u,3807903776u,1711335620u,138491904u,2490368u}/* 0246 */, /*529*/{53888u,32u,131073u,76840962u,1499176u,3768975392u,1719724228u,138442752u,393216u}/* 0247 */, /*530*/{54016u,469762080u,131073u,76840961u,1507368u,3807903776u,1711336932u,138491904u,2490368u}/* 0248 */, /*531*/{54144u,32u,131073u,76840962u,1499176u,3768975392u,1719725540u,138442752u,17170432u}/* 0249 */, /*532*/{54272u,471859232u,131073u,76840961u,1507368u,3807903776u,1711338644u,138491904u,2490368u}/* 024A */, /*533*/{54400u,32u,131073u,76840962u,1499176u,3768975392u,1719727252u,138442752u,393216u}/* 024B */, /*534*/{54528u,473956384u,131073u,76840961u,1507368u,3807903776u,1711338804u,138491904u,2490368u}/* 024C */, /*535*/{54656u,32u,131073u,76840962u,1499176u,3768975392u,1719727412u,138442752u,393216u}/* 024D */, /*536*/{54784u,476053536u,131073u,76840961u,1507368u,3807903776u,1711340500u,138491904u,2490368u}/* 024E */, /*537*/{54912u,32u,131073u,76840962u,1499176u,3768975392u,1719729108u,138442752u,393216u}/* 024F */, /*538*/{55040u,40u,131073u,76578818u,1499176u,3768975392u,1719723460u,138442752u,393216u}/* 0250 */, /*539*/{55168u,41u,131073u,76578818u,1499176u,3768975392u,1719723492u,138442752u,393216u}/* 0251 */, /*540*/{55296u,40u,131073u,76578818u,1499176u,3768975392u,1719723540u,138442752u,393216u}/* 0252 */, /*541*/{55424u,40u,131073u,76578818u,1499176u,3768975392u,1719723716u,138442752u,393216u}/* 0253 */, /*542*/{55552u,40u,131073u,76578818u,1499176u,3768975392u,1719726780u,138442752u,393216u}/* 0254 */, /*543*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719723908u,138442752u,393216u}/* 0255 */, /*544*/{55680u,40u,131073u,76578818u,1499176u,3768975392u,1719724020u,138442752u,393216u}/* 0256 */, /*545*/{55808u,40u,131073u,76578818u,1499176u,3768975392u,1719724052u,138442752u,393216u}/* 0257 */, /*546*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719724404u,138442752u,393216u}/* 0258 */, /*547*/{55936u,40u,131073u,76578818u,1499176u,3768975392u,1719724324u,138442752u,393216u}/* 0259 */, /*548*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719724436u,138442752u,393216u}/* 025A */, /*549*/{56064u,40u,131073u,76578818u,1499176u,3768975392u,1719724364u,138442752u,393216u}/* 025B */, /*550*/{56192u,40u,131073u,76578818u,1499176u,3768975392u,1719724468u,138442752u,393216u}/* 025C */, /*551*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719724516u,138442752u,393216u}/* 025D */, /*552*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719724548u,138442752u,393216u}/* 025E */, /*553*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719725604u,138442752u,393216u}/* 025F */, /*554*/{56320u,40u,131073u,76578818u,1499176u,3768975392u,1719724908u,138442752u,393216u}/* 0260 */, /*555*/{56448u,41u,131073u,76578818u,1499176u,3768975392u,1719724796u,138442752u,393216u}/* 0261 */, /*556*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719724836u,138442752u,393216u}/* 0262 */, /*557*/{56576u,40u,131073u,76578818u,1499176u,3768975392u,1719724988u,138442752u,393216u}/* 0263 */, /*558*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719724612u,138442752u,393216u}/* 0264 */, /*559*/{56704u,40u,131073u,76578818u,1499176u,3768975392u,1719728508u,138442752u,393216u}/* 0265 */, /*560*/{56832u,40u,131073u,76578818u,1499176u,3768975392u,1719725156u,138442752u,393216u}/* 0266 */, /*561*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719725212u,138442752u,393216u}/* 0267 */, /*562*/{56960u,40u,131073u,76578818u,1499176u,3768975392u,1719725380u,138442752u,17170432u}/* 0268 */, /*563*/{57088u,40u,131073u,76578818u,1499176u,3768975392u,1719725428u,138442752u,393216u}/* 0269 */, /*564*/{57216u,40u,131073u,76578818u,1499176u,3768975392u,1719725324u,138442752u,393216u}/* 026A */, /*565*/{57344u,40u,131073u,76578818u,1499176u,3768975392u,1719725940u,138442752u,393216u}/* 026B */, /*566*/{57472u,40u,131073u,76578818u,1499176u,3768975392u,1719725988u,138442752u,393216u}/* 026C */, /*567*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719726036u,138442752u,393216u}/* 026D */, /*568*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719726116u,138442752u,393216u}/* 026E */, /*569*/{57600u,40u,131073u,76578818u,1499176u,3768975392u,1719728604u,138442752u,393216u}/* 026F */, /*570*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719728652u,138442752u,393216u}/* 0270 */, /*571*/{57728u,40u,131073u,76578818u,1499176u,3768975392u,1719726276u,138442752u,393216u}/* 0271 */, /*572*/{57856u,40u,131073u,76578818u,1499176u,3768975392u,1719726428u,138442752u,393216u}/* 0272 */, /*573*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719726508u,138442752u,393216u}/* 0273 */, /*574*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719726372u,138442752u,393216u}/* 0274 */, /*575*/{57984u,40u,131073u,76578818u,1499176u,3768975392u,1719726884u,138442752u,393216u}/* 0275 */, /*576*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719726684u,138442752u,393216u}/* 0276 */, /*577*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719726924u,138442752u,393216u}/* 0277 */, /*578*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719727132u,138442752u,393216u}/* 0278 */, /*579*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719727452u,138442752u,393216u}/* 0279 */, /*580*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719727492u,138442752u,393216u}/* 027A */, /*581*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719727532u,138442752u,393216u}/* 027B */, /*582*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719727572u,138442752u,393216u}/* 027C */, /*583*/{58112u,40u,131073u,76578818u,1499176u,3768975392u,1719727604u,138442752u,393216u}/* 027D */, /*584*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719727644u,138442752u,393216u}/* 027E */, /*585*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719727684u,138442752u,393216u}/* 027F */, /*586*/{58240u,40u,131073u,76578818u,1499176u,3768975392u,1719727356u,138442752u,393216u}/* 0280 */, /*587*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719727756u,138442752u,393216u}/* 0281 */, /*588*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719727868u,138442752u,393216u}/* 0282 */, /*589*/{58368u,40u,131073u,76578818u,1499176u,3768975392u,1719727948u,138442752u,393216u}/* 0283 */, /*590*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719725636u,138442752u,393216u}/* 0284 */, /*591*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719728028u,138442752u,393216u}/* 0285 */, /*592*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719728068u,138442752u,393216u}/* 0286 */, /*593*/{58496u,40u,131073u,76578818u,1499176u,3768975392u,1719728324u,138442752u,393216u}/* 0287 */, /*594*/{58624u,40u,131073u,76578818u,1499176u,3768975392u,1719728252u,138442752u,393216u}/* 0288 */, /*595*/{58752u,40u,131073u,76578818u,1499176u,3768975392u,1719728444u,138442752u,393216u}/* 0289 */, /*596*/{58880u,40u,131073u,76578818u,1499176u,3768975392u,1719728684u,138442752u,393216u}/* 028A */, /*597*/{59008u,40u,131073u,76578818u,1499176u,3768975392u,1719728780u,138442752u,393216u}/* 028B */, /*598*/{59136u,40u,131073u,76578818u,1499176u,3768975392u,1719728836u,138442752u,393216u}/* 028C */, /*599*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719728916u,138442752u,393216u}/* 028D */, /*600*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719726188u,138442752u,393216u}/* 028E */, /*601*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719729076u,138442752u,393216u}/* 028F */, /*602*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719729340u,138442752u,393216u}/* 0290 */, /*603*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719729372u,138442752u,393216u}/* 0291 */, /*604*/{59264u,40u,131073u,76578818u,1499176u,3768975392u,1719729452u,138442752u,393216u}/* 0292 */, /*605*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719729564u,138442752u,393216u}/* 0293 */, /*606*/{0,40u,131073u,76578821u,1515560u,3758096416u,1677786852u,138442752u,393216u}/* 0294 */, /*607*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719730012u,138442752u,393216u}/* 0295 */, /*608*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719730148u,138442752u,393216u}/* 0296 */, /*609*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719730308u,138442752u,393216u}/* 0297 */, /*610*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719730340u,138442752u,393216u}/* 0298 */, /*611*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719723612u,138442752u,393216u}/* 0299 */, /*612*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719724580u,138442752u,393216u}/* 029A */, /*613*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719724940u,138442752u,393216u}/* 029B */, /*614*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719725084u,138442752u,393216u}/* 029C */, /*615*/{59392u,40u,131073u,76578818u,1499176u,3768975392u,1719725572u,138442752u,17170432u}/* 029D */, /*616*/{59520u,40u,131073u,76578818u,1499176u,3768975392u,1719725780u,138442752u,393216u}/* 029E */, /*617*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719725844u,138442752u,393216u}/* 029F */, /*618*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719727220u,138442752u,393216u}/* 02A0 */, /*619*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719730084u,138442752u,393216u}/* 02A1 */, /*620*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719730116u,138442752u,393216u}/* 02A2 */, /*621*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719788524u,272709632u,393216u}/* 02A3 */, /*622*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719788756u,272709632u,393216u}/* 02A4 */, /*623*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719788676u,272709632u,393216u}/* 02A5 */, /*624*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719791260u,272709632u,393216u}/* 02A6 */, /*625*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719791396u,272709632u,393216u}/* 02A7 */, /*626*/{0,40u,131073u,76578818u,1499176u,3766485024u,1719787356u,272709632u,393216u}/* 02A8 */, /*627*/{0,40u,131073u,76677122u,1499176u,3766485024u,1719786580u,272709632u,393216u}/* 02A9 */, /*628*/{0,40u,131073u,76677122u,1499176u,3766485024u,1719788972u,272709632u,393216u}/* 02AA */, /*629*/{0,40u,131073u,76677122u,1499176u,3766485024u,1719790380u,272709632u,393216u}/* 02AB */, /*630*/{0,40u,131073u,76677122u,1499176u,3766485024u,1719730372u,138442752u,393216u}/* 02AC */, /*631*/{0,40u,131073u,76677122u,1499176u,3766485024u,1719730404u,138442752u,393216u}/* 02AD */, /*632*/{0,40u,131073u,76775426u,1499176u,3766485024u,1719728540u,138442752u,393216u}/* 02AE */, /*633*/{0,40u,131073u,76775426u,1499176u,3766485024u,1719728572u,138442752u,393216u}/* 02AF */, /*634*/{149422080u,48u,131073u,76579140u,1499168u,3783794720u,1686170620u,138588176u,393216u}/* 02B0 */, /*635*/{149946368u,48u,131073u,76579140u,1499168u,3783794720u,1686170724u,138588176u,393216u}/* 02B1 */, /*636*/{150470656u,48u,131073u,76579140u,1499168u,3783794720u,1686171036u,138588176u,17170432u}/* 02B2 */, /*637*/{150994944u,48u,131073u,76579140u,1499168u,3783794720u,1686172884u,138588176u,393216u}/* 02B3 */, /*638*/{151519232u,48u,131073u,76579140u,1499168u,3783794720u,1686173020u,138588176u,393216u}/* 02B4 */, /*639*/{152043520u,48u,131073u,76579140u,1499168u,3783794720u,1686173100u,138588176u,393216u}/* 02B5 */, /*640*/{152567808u,48u,131073u,76579140u,1499168u,3783794720u,1686173324u,138588176u,393216u}/* 02B6 */, /*641*/{153092096u,48u,131073u,76579140u,1499168u,3783794720u,1686174436u,138588176u,393216u}/* 02B7 */, /*642*/{153616384u,48u,131073u,76579140u,1499168u,3783794720u,1686174612u,138588176u,393216u}/* 02B8 */, /*643*/{0,48u,65537u,76589060u,1515560u,3774881824u,1677731156u,138442752u,393216u}/* 02B9 */, /*644*/{0,48u,65537u,76589060u,1515560u,3774881824u,1677731172u,138442752u,393216u}/* 02BA */, /*645*/{0,48u,65537u,76578820u,1515560u,3774881824u,1677782204u,138442752u,393216u}/* 02BB */, /*646*/{0,48u,65537u,76578820u,1515560u,3774881824u,1677786924u,138442752u,393216u}/* 02BC */, /*647*/{0,48u,65537u,76578820u,1515560u,3774881824u,1677782212u,138442752u,393216u}/* 02BD */, /*648*/{0,48u,65537u,76578820u,1515560u,3774881824u,1677786940u,138442752u,393216u}/* 02BE */, /*649*/{0,48u,65537u,76578820u,1515560u,3774881824u,1677787004u,138442752u,393216u}/* 02BF */, /*650*/{0,48u,65537u,76578820u,1499176u,3783270432u,1686175524u,138442768u,393216u}/* 02C0 */, /*651*/{0,48u,65537u,76578820u,1499176u,3783270432u,1686175620u,138442768u,393216u}/* 02C1 */, /*652*/{0,48u,65537u,76589082u,1441832u,1627398176u,9580u,138442752u,67108864u}/* 02C2 */, /*653*/{0,48u,65537u,76589082u,1441832u,1627398176u,9588u,138442752u,67108864u}/* 02C3 */, /*654*/{0,49u,65537u,76589082u,1441832u,1627398176u,9596u,138442752u,67108864u}/* 02C4 */, /*655*/{0,48u,65537u,76589082u,1441832u,1627398176u,9604u,138442752u,67108864u}/* 02C5 */, /*656*/{0,48u,65537u,76589060u,1515560u,3774881824u,1677731212u,138442752u,393216u}/* 02C6 */, /*657*/{0,49u,65537u,89171972u,1515560u,3774881824u,1677731220u,138442752u,393216u}/* 02C7 */, /*658*/{0,48u,65537u,90220548u,1515560u,3774881824u,1677731228u,138442752u,393216u}/* 02C8 */, /*659*/{0,49u,65537u,89171972u,1515560u,3774881824u,1677731236u,138442752u,393216u}/* 02C9 */, /*660*/{0,49u,65537u,89171972u,1515560u,3774881824u,1677731244u,138442752u,393216u}/* 02CA */, /*661*/{0,49u,65537u,89171972u,1515560u,3774881824u,1677731252u,138442752u,393216u}/* 02CB */, /*662*/{0,48u,65537u,90220548u,1515560u,3774881824u,1677731260u,138442752u,393216u}/* 02CC */, /*663*/{0,49u,65537u,89171972u,1515560u,3774881824u,1677731268u,138442752u,393216u}/* 02CD */, /*664*/{0,48u,65537u,76589060u,1515560u,3774881824u,1677731276u,138442752u,393216u}/* 02CE */, /*665*/{0,48u,65537u,76589060u,1515560u,3774881824u,1677731284u,138442752u,393216u}/* 02CF */, /*666*/{0,49u,65537u,89161732u,1515560u,3774881952u,1677779692u,138442752u,393216u}/* 02D0 */, /*667*/{0,48u,65537u,76578820u,1515560u,3774881952u,1677779700u,138442752u,393216u}/* 02D1 */, /*668*/{0,48u,65537u,76589082u,1441832u,1627398176u,9692u,138442752u,67108864u}/* 02D2 */, /*669*/{0,48u,65537u,76589082u,1441832u,1627398176u,9700u,138442752u,67108864u}/* 02D3 */, /*670*/{0,48u,65537u,76589082u,1441832u,1627398176u,9708u,138442752u,67108864u}/* 02D4 */, /*671*/{0,48u,65537u,76589082u,1441832u,1627398176u,9716u,138442752u,67108864u}/* 02D5 */, /*672*/{0,48u,65537u,76589082u,1441832u,1627398176u,9724u,138442752u,67108864u}/* 02D6 */, /*673*/{0,48u,65537u,76589082u,1441832u,1627398176u,9732u,138442752u,67108864u}/* 02D7 */, /*674*/{154140672u,49u,65537u,89172058u,32u,1627922464u,9460u,138440704u,67108864u}/* 02D8 */, /*675*/{154664960u,49u,65537u,89172058u,32u,1627922464u,9468u,138440704u,67108864u}/* 02D9 */, /*676*/{155189248u,49u,65537u,89172058u,32u,1627922464u,9484u,138440704u,67108864u}/* 02DA */, /*677*/{155713536u,49u,65537u,89172058u,32u,1627922464u,9508u,138440704u,67108864u}/* 02DB */, /*678*/{156237824u,48u,65537u,76589146u,32u,1627922464u,9436u,138440704u,67108864u}/* 02DC */, /*679*/{156762112u,49u,65537u,89172058u,32u,1627922464u,9492u,138440704u,67108864u}/* 02DD */, /*680*/{0,48u,65537u,76589082u,1441832u,1627398176u,9740u,138442752u,67108864u}/* 02DE */, /*681*/{0,49u,65537u,90318874u,1441832u,1627398176u,9748u,138442752u,67108864u}/* 02DF */, /*682*/{157286400u,48u,131073u,76579140u,1499168u,3783794720u,1686170556u,138588176u,393216u}/* 02E0 */, /*683*/{157810688u,48u,131073u,76579140u,1499168u,3783794720u,1686171380u,138588176u,393216u}/* 02E1 */, /*684*/{158334976u,48u,131073u,76579140u,1499168u,3783794720u,1686173380u,138588176u,393216u}/* 02E2 */, /*685*/{158859264u,48u,131073u,76579140u,1499168u,3783794720u,1686174516u,138588176u,393216u}/* 02E3 */, /*686*/{159383552u,48u,131073u,76579140u,1499168u,3783794720u,1686175580u,138588176u,393216u}/* 02E4 */, /*687*/{0,48u,65537u,76589082u,40u,1627398176u,9756u,138442752u,67108864u}/* 02E5 */, /*688*/{0,48u,65537u,76589082u,40u,1627398176u,9764u,138442752u,67108864u}/* 02E6 */, /*689*/{0,48u,65537u,76589082u,40u,1627398176u,9772u,138442752u,67108864u}/* 02E7 */, /*690*/{0,48u,65537u,76589082u,40u,1627398176u,9780u,138442752u,67108864u}/* 02E8 */, /*691*/{0,48u,65537u,76589082u,40u,1627398176u,9788u,138442752u,67108864u}/* 02E9 */, /*692*/{0,48u,2293761u,76687386u,40u,1627398176u,9796u,138442752u,67108864u}/* 02EA */, /*693*/{0,48u,2293761u,76687386u,40u,1627398176u,9804u,138442752u,67108864u}/* 02EB */, /*694*/{0,48u,65537u,76687364u,1515560u,3774881824u,1677731412u,138442752u,393216u}/* 02EC */, /*695*/{0,48u,65537u,76687386u,1441832u,1627398176u,9820u,138442752u,67108864u}/* 02ED */, /*696*/{0,48u,65537u,76677124u,1515560u,3774881824u,1677786932u,138442752u,393216u}/* 02EE */, /*697*/{0,48u,65537u,76785690u,1441832u,1627398176u,9828u,138442752u,67108864u}/* 02EF */, /*698*/{0,48u,65537u,76785690u,1441832u,1627398176u,9836u,138442752u,67108864u}/* 02F0 */, /*699*/{0,48u,65537u,76785690u,1441832u,1627398176u,9844u,138442752u,67108864u}/* 02F1 */, /*700*/{0,48u,65537u,76785690u,1441832u,1627398176u,9852u,138442752u,67108864u}/* 02F2 */, /*701*/{0,48u,65537u,76785690u,1441832u,1627398176u,9860u,138442752u,67108864u}/* 02F3 */, /*702*/{0,48u,65537u,76785690u,1441832u,1627398176u,9868u,138442752u,67108864u}/* 02F4 */, /*703*/{0,48u,65537u,76785690u,1441832u,1627398176u,9876u,138442752u,67108864u}/* 02F5 */, /*704*/{0,48u,65537u,76785690u,1441832u,1627398176u,9884u,138442752u,67108864u}/* 02F6 */, /*705*/{0,48u,65537u,76785690u,1441832u,1627398176u,9892u,138442752u,67108864u}/* 02F7 */, /*706*/{0,48u,65537u,76785690u,1441832u,1627398176u,9900u,138442752u,67108864u}/* 02F8 */, /*707*/{0,48u,65537u,76785690u,1441832u,1627398176u,9908u,138442752u,67108864u}/* 02F9 */, /*708*/{0,48u,65537u,76785690u,1441832u,1627398176u,9916u,138442752u,67108864u}/* 02FA */, /*709*/{0,48u,65537u,76785690u,1441832u,1627398176u,9924u,138442752u,67108864u}/* 02FB */, /*710*/{0,48u,65537u,76785690u,1441832u,1627398176u,9932u,138442752u,67108864u}/* 02FC */, /*711*/{0,48u,65537u,76785690u,1441832u,1627398176u,9940u,138442752u,67108864u}/* 02FD */, /*712*/{0,48u,65537u,76785690u,1441832u,1627398176u,9948u,138442752u,67108864u}/* 02FE */, /*713*/{0,48u,65537u,76785690u,1441832u,1627398176u,9956u,138442752u,67108864u}/* 02FF */, /*714*/{0,57u,2686978u,3423645702u,672030736u,1627398160u,1077936140u,159414272u,262144u}/* 0300 */, /*715*/{0,57u,2686978u,3423645702u,672030736u,1627398160u,1077936140u,155219968u,262144u}/* 0301 */, /*716*/{0,57u,2686978u,3423645702u,672030736u,1627398160u,1077936140u,167802880u,262144u}/* 0302 */, /*717*/{0,57u,2686978u,3423645702u,672030736u,1627398160u,1077936140u,192968704u,262144u}/* 0303 */, /*718*/{0,57u,2686978u,3423645702u,672030736u,1627398160u,1077936140u,213940224u,262144u}/* 0304 */, /*719*/{0,57u,2686977u,3423645702u,672030728u,1627398160u,1077936140u,247494656u,262144u}/* 0305 */, /*720*/{0,57u,2686978u,3423645702u,672030736u,1627398160u,1077936140u,163608576u,262144u}/* 0306 */, /*721*/{0,57u,2686978u,3423645702u,672030736u,1627398160u,1077936140u,197163008u,262144u}/* 0307 */, /*722*/{0,57u,2686978u,3423645702u,672030736u,1627398160u,1077936140u,184580096u,262144u}/* 0308 */, /*723*/{0,57u,2686978u,3423645702u,672030736u,1627398160u,1077936140u,251688960u,262144u}/* 0309 */, /*724*/{0,57u,2686978u,3423645702u,672030736u,1627398160u,1077936140u,176191488u,262144u}/* 030A */, /*725*/{0,57u,2686978u,3423645702u,672030736u,1627398160u,1077936140u,188774400u,262144u}/* 030B */, /*726*/{0,57u,2686978u,3423645702u,672030736u,1627398160u,1077936140u,171997184u,262144u}/* 030C */, /*727*/{0,57u,2686977u,3423645702u,672030728u,1627398160u,1077936140u,218134528u,262144u}/* 030D */, /*728*/{0,57u,2686978u,3423645702u,672030736u,1627398160u,1077936140u,255883264u,262144u}/* 030F */, /*729*/{0,57u,2686977u,3423645702u,672030728u,1627398160u,1077936140u,260077568u,262144u}/* 0310 */, /*730*/{0,57u,2686978u,3423645702u,672030736u,1627398160u,1077936140u,264271872u,262144u}/* 0311 */, /*731*/{0,57u,2686978u,3423645702u,672030736u,1627398160u,1077936140u,146831360u,262144u}/* 0313 */, /*732*/{0,57u,2686978u,3423645702u,672030736u,1627398160u,1077936140u,151025664u,262144u}/* 0314 */, /*733*/{0,57u,2686977u,3490754566u,672030728u,1627398160u,1077936140u,218134528u,262144u}/* 0315 */, /*734*/{0,57u,2686977u,3088101382u,672030728u,1627398160u,1077936140u,222328832u,262144u}/* 0316 */, /*735*/{0,57u,2686978u,2953883654u,672030736u,1627398160u,1077936140u,268466176u,262144u}/* 031B */, /*736*/{0,57u,2686977u,2819665926u,672030728u,1627398160u,1077936140u,272660480u,262144u}/* 0321 */, /*737*/{0,57u,2686977u,2819665926u,672030728u,1627398160u,1077936140u,276854784u,262144u}/* 0322 */, /*738*/{0,57u,2686978u,3088101382u,672030736u,1627398160u,1077936140u,281049088u,262144u}/* 0323 */, /*739*/{0,57u,2686978u,3088101382u,672030736u,1627398160u,1077936140u,285243392u,262144u}/* 0324 */, /*740*/{0,57u,2686978u,3088101382u,672030736u,1627398160u,1077936140u,289437696u,262144u}/* 0325 */, /*741*/{0,57u,2686978u,3088101382u,672030736u,1627398160u,1077936140u,293632000u,262144u}/* 0326 */, /*742*/{0,57u,2686978u,2819665926u,672030736u,1627398160u,1077936140u,205551616u,262144u}/* 0327 */, /*743*/{0,57u,2686978u,2819665926u,672030736u,1627398160u,1077936140u,209745920u,262144u}/* 0328 */, /*744*/{0,57u,2686978u,3088101382u,672030736u,1627398160u,1077936140u,297826304u,262144u}/* 032D */, /*745*/{0,57u,2686978u,3088101382u,672030736u,1627398160u,1077936140u,302020608u,262144u}/* 032E */, /*746*/{0,57u,2686978u,3088101382u,672030736u,1627398160u,1077936140u,306214912u,262144u}/* 0330 */, /*747*/{0,57u,2686978u,3088101382u,672030736u,1627398160u,1077936140u,310409216u,262144u}/* 0331 */, /*748*/{0,57u,2686977u,3088101382u,672030728u,1627398160u,1077936140u,142637056u,262144u}/* 0332 */, /*749*/{0,57u,2686977u,135311366u,672030728u,1627398160u,1077936140u,314603520u,262144u}/* 0334 */, /*750*/{0,57u,2686977u,135311366u,672030728u,1627398160u,1077936140u,243300352u,262144u}/* 0335 */, /*751*/{0,57u,2686977u,135311366u,672030728u,1627398160u,1077936140u,226523136u,262144u}/* 0336 */, /*752*/{0,57u,2686978u,135311366u,672030736u,1627398160u,1077936140u,201357312u,262144u}/* 0338 */, /*753*/{0,57u,2686977u,3088101382u,672030728u,1627398160u,1077936140u,318797824u,262144u}/* 0339 */, /*754*/{159907840u,57u,2686976u,3423645734u,672030720u,1627922512u,1077936140u,159408128u,262144u}/* 0340 */, /*755*/{160432128u,57u,2686976u,3423645734u,672030720u,1627922512u,1077936140u,155213824u,262144u}/* 0341 */, /*756*/{0,57u,2686978u,3423645702u,672030736u,1627398160u,1077936140u,180385792u,262144u}/* 0342 */, /*757*/{160956416u,57u,2686976u,3423645734u,672030720u,1627922512u,1077936140u,146825216u,262144u}/* 0343 */, /*758*/{161480704u,57u,2686976u,3423645734u,672030720u,1627922512u,1077936140u,335585280u,262144u}/* 0344 */, /*759*/{59648u,478150713u,2686978u,3692081158u,672030736u,3824033808u,1086324748u,322992656u,262144u}/* 0345 */, /*760*/{0,57u,2686977u,3423744006u,672030728u,1627398160u,1077936140u,218134528u,262144u}/* 0346 */, /*761*/{0,57u,2686977u,3088199686u,672030728u,1627398160u,1077936140u,222328832u,262144u}/* 0347 */, /*762*/{0,57u,2686977u,88289286u,672030728u,1627947024u,1077936140u,4208896u,262144u}/* 034F */, /*763*/{0,57u,2686977u,3423842310u,672030728u,1627398160u,1077936140u,218134528u,262144u}/* 0350 */, /*764*/{0,57u,2686977u,3088297990u,672030728u,1627398160u,1077936140u,222328832u,262144u}/* 0353 */, /*765*/{0,57u,2686977u,3490983942u,672030728u,1627389968u,1077936140u,327186432u,262144u}/* 0358 */, /*766*/{0,57u,2686977u,3088330758u,672030728u,1627389968u,1077936140u,222328832u,262144u}/* 0359 */, /*767*/{0,57u,2686977u,3423875078u,672030728u,1627389968u,1077936140u,218134528u,262144u}/* 035B */, /*768*/{0,57u,2686977u,3578015750u,672030728u,1627389968u,1077936140u,222328832u,262144u}/* 035C */, /*769*/{0,57u,2686977u,3645091846u,672030728u,1627398160u,1077936140u,218134528u,262144u}/* 035D */, /*770*/{0,57u,2686977u,3577982982u,672030728u,1627398160u,1077936140u,222328832u,262144u}/* 035F */, /*771*/{0,57u,2686977u,3644895238u,672030728u,1627398160u,1077936140u,331380736u,262144u}/* 0360 */, /*772*/{0,57u,2686977u,3644895238u,672030728u,1627398160u,1077936140u,335575040u,262144u}/* 0361 */, /*773*/{0,57u,2686977u,3577884678u,672030728u,1627398160u,1077936140u,222328832u,262144u}/* 0362 */, /*774*/{0,57u,2686977u,3423809542u,672030728u,1627389968u,1077994868u,138459136u,262144u}/* 0363 */, /*775*/{0,57u,2686977u,3423809542u,672030728u,1627389968u,1077995660u,138459136u,262144u}/* 0364 */, /*776*/{0,57u,2686977u,3423809542u,672030728u,1627389968u,1077996748u,138459136u,262144u}/* 0365 */, /*777*/{0,57u,2686977u,3423809542u,672030728u,1627389968u,1077998116u,138459136u,262144u}/* 0366 */, /*778*/{0,57u,2686977u,3423809542u,672030728u,1627389968u,1077999844u,138459136u,262144u}/* 0367 */, /*779*/{0,57u,2686977u,3423809542u,672030728u,1627389968u,1077995276u,138459136u,262144u}/* 0368 */, /*780*/{0,57u,2686977u,3423809542u,672030728u,1627389968u,1077995444u,138459136u,262144u}/* 0369 */, /*781*/{0,57u,2686977u,3423809542u,672030728u,1627389968u,1077996540u,138459136u,262144u}/* 036A */, /*782*/{0,57u,2686977u,3423809542u,672030728u,1627389968u,1077997708u,138459136u,262144u}/* 036B */, /*783*/{0,57u,2686977u,3423809542u,672030728u,1627389968u,1077998804u,138459136u,262144u}/* 036C */, /*784*/{0,57u,2686977u,3423809542u,672030728u,1627389968u,1077999588u,138459136u,262144u}/* 036D */, /*785*/{0,57u,2686977u,3423809542u,672030728u,1627389968u,1078000212u,138459136u,262144u}/* 036E */, /*786*/{0,57u,2686977u,3423809542u,672030728u,1627389968u,1078000436u,138459136u,262144u}/* 036F */, /*787*/{59776u,480247872u,196609u,76873729u,1507368u,3807903776u,1711341908u,138491904u,2490368u}/* 0370 */, /*788*/{59904u,64u,196609u,76873730u,1499176u,3768975392u,1719730516u,138442752u,393216u}/* 0371 */, /*789*/{60032u,482345024u,196609u,76873729u,1507368u,3807903776u,1711342172u,138491904u,2490368u}/* 0372 */, /*790*/{60160u,64u,196609u,76873730u,1499176u,3768975392u,1719730780u,138442752u,393216u}/* 0373 */, /*791*/{162004992u,64u,65536u,76589092u,1515520u,3775406176u,1677731156u,138436608u,393216u}/* 0374 */, /*792*/{0,64u,196609u,76589082u,40u,1627398176u,9564u,138442752u,67108864u}/* 0375 */, /*793*/{60288u,484442176u,196609u,76873729u,1507368u,3807903776u,1711341884u,138491904u,2490368u}/* 0376 */, /*794*/{60416u,64u,196609u,76873730u,1499176u,3768975392u,1719730492u,138442752u,393216u}/* 0377 */, /*795*/{162529280u,64u,196609u,76578884u,1499168u,3783794720u,1686176108u,138457104u,0}/* 037A */, /*796*/{60544u,64u,196609u,76840962u,1499176u,3768975392u,1719730692u,138442752u,393216u}/* 037B */, /*797*/{60672u,64u,196609u,76840962u,1499176u,3768975392u,1719730684u,138442752u,393216u}/* 037C */, /*798*/{60800u,64u,196609u,76840962u,1499176u,3768975392u,1719730700u,138442752u,393216u}/* 037D */, /*799*/{163053568u,64u,65536u,81831991u,1703936u,1611137120u,4524u,138436610u,8388608u}/* 037E */, /*800*/{60928u,486539328u,196609u,77070337u,1507368u,3807903776u,1711341940u,138491904u,2490368u}/* 037F */, /*801*/{163577856u,64u,196609u,76589146u,32u,1627922464u,9428u,138440704u,67108864u}/* 0384 */, /*802*/{164102144u,64u,65537u,76589114u,32u,1627922464u,9476u,289447936u,67108864u}/* 0385 */, /*803*/{164687488u,488636480u,196609u,76578849u,1507368u,3807903776u,1711341828u,289497088u,2490368u}/* 0386 */, /*804*/{165150720u,64u,65536u,76589111u,1572864u,1627914336u,1073747052u,138436674u,8650752u}/* 0387 */, /*805*/{165736192u,490733632u,196609u,76578849u,1507368u,3807903776u,1711341868u,289497088u,2490368u}/* 0388 */, /*806*/{166260608u,492830784u,196609u,76578849u,1507368u,3807903776u,1711341916u,289497088u,2490368u}/* 0389 */, /*807*/{166785024u,494927936u,196609u,76578849u,1507368u,3807903776u,1711341932u,289497088u,2490368u}/* 038A */, /*808*/{167309440u,497025088u,196609u,76578849u,1507368u,3807903776u,1711341996u,289497088u,2490368u}/* 038C */, /*809*/{167833856u,499122240u,196609u,76578849u,1507368u,3807903776u,1711342108u,289497088u,2490368u}/* 038E */, /*810*/{168358272u,501219392u,196609u,76578849u,1507368u,3807903776u,1711342148u,289497088u,2490368u}/* 038F */, /*811*/{168820736u,10485824u,196677u,76578850u,1499176u,3768975392u,1719730540u,469819392u,393216u}/* 0390 */, /*812*/{61952u,503316545u,196609u,76578817u,1507368u,3807903776u,1711341828u,138491904u,2490368u}/* 0391 */, /*813*/{62080u,505413697u,196609u,76578817u,1507368u,3807903776u,1711341836u,138491904u,2490368u}/* 0392 */, /*814*/{62208u,507510849u,196609u,76578817u,1507368u,3807903776u,1711341844u,138491904u,2490368u}/* 0393 */, /*815*/{62336u,509608001u,196609u,76578817u,1507368u,3807903776u,1711341860u,138491904u,2490368u}/* 0394 */, /*816*/{62464u,511705153u,196609u,76578817u,1507368u,3807903776u,1711341868u,138491904u,2490368u}/* 0395 */, /*817*/{62592u,513802305u,196609u,76578817u,1507368u,3807903776u,1711341900u,138491904u,2490368u}/* 0396 */, /*818*/{62720u,515899457u,196609u,76578817u,1507368u,3807903776u,1711341916u,138491904u,2490368u}/* 0397 */, /*819*/{62848u,517996609u,196609u,76578817u,1507368u,3807903776u,1711341924u,138491904u,2490368u}/* 0398 */, /*820*/{62976u,520093761u,196609u,76578817u,1507368u,3807903776u,1711341932u,138491904u,2490368u}/* 0399 */, /*821*/{63104u,522190913u,196609u,76578817u,1507368u,3807903776u,1711341948u,138491904u,2490368u}/* 039A */, /*822*/{63232u,524288065u,196609u,76578817u,1507368u,3807903776u,1711341956u,138491904u,2490368u}/* 039B */, /*823*/{63360u,526385217u,196609u,76578817u,1507368u,3807903776u,1711341972u,138491904u,2490368u}/* 039C */, /*824*/{63488u,528482369u,196609u,76578817u,1507368u,3807903776u,1711341980u,138491904u,2490368u}/* 039D */, /*825*/{63616u,530579521u,196609u,76578817u,1507368u,3807903776u,1711341988u,138491904u,2490368u}/* 039E */, /*826*/{63744u,532676673u,196609u,76578817u,1507368u,3807903776u,1711341996u,138491904u,2490368u}/* 039F */, /*827*/{63872u,534773825u,196609u,76578817u,1507368u,3807903776u,1711342004u,138491904u,2490368u}/* 03A0 */, /*828*/{64000u,536870977u,196609u,76578817u,1507368u,3807903776u,1711342044u,138491904u,2490368u}/* 03A1 */, /*829*/{64128u,538968129u,196609u,76578817u,1507368u,3807903776u,1711342068u,138491904u,2490368u}/* 03A3 */, /*830*/{64256u,541065281u,196609u,76578817u,1507368u,3807903776u,1711342100u,138491904u,2490368u}/* 03A4 */, /*831*/{64384u,543162433u,196609u,76578817u,1507368u,3807903776u,1711342108u,138491904u,2490368u}/* 03A5 */, /*832*/{64512u,545259585u,196609u,76578817u,1507368u,3807903776u,1711342116u,138491904u,2490368u}/* 03A6 */, /*833*/{64640u,547356737u,196609u,76578817u,1507368u,3807903776u,1711342124u,138491904u,2490368u}/* 03A7 */, /*834*/{64768u,549453889u,196609u,76578817u,1507368u,3807903776u,1711342132u,138491904u,2490368u}/* 03A8 */, /*835*/{64896u,551551041u,196609u,76578817u,1507368u,3807903776u,1711342148u,138491904u,2490368u}/* 03A9 */, /*836*/{169410048u,553648192u,196609u,76578849u,1507368u,3807903776u,1711341932u,318857216u,2490368u}/* 03AA */, /*837*/{169934464u,555745344u,196609u,76578849u,1507368u,3807903776u,1711342108u,318857216u,2490368u}/* 03AB */, /*838*/{170458880u,64u,196609u,76578850u,1499176u,3768975392u,1719730436u,289447936u,393216u}/* 03AC */, /*839*/{170983296u,64u,196609u,76578850u,1499176u,3768975392u,1719730476u,289447936u,393216u}/* 03AD */, /*840*/{171507712u,64u,196609u,76578850u,1499176u,3768975392u,1719730524u,289447936u,393216u}/* 03AE */, /*841*/{172032128u,64u,196609u,76578850u,1499176u,3768975392u,1719730540u,289447936u,393216u}/* 03AF */, /*842*/{172490752u,12582976u,196681u,76578850u,1499176u,3768975392u,1719730716u,469819392u,393216u}/* 03B0 */, /*843*/{65792u,65u,196609u,76578818u,1499176u,3768975392u,1719730436u,138442752u,393216u}/* 03B1 */, /*844*/{65920u,65u,196609u,76578818u,1499176u,3768975392u,1719730444u,138442752u,393216u}/* 03B2 */, /*845*/{66048u,65u,196609u,76578818u,1499176u,3768975392u,1719730452u,138442752u,393216u}/* 03B3 */, /*846*/{66176u,65u,196609u,76578818u,1499176u,3768975392u,1719730468u,138442752u,393216u}/* 03B4 */, /*847*/{66304u,65u,196609u,76578818u,1499176u,3768975392u,1719730476u,138442752u,393216u}/* 03B5 */, /*848*/{66432u,65u,196609u,76578818u,1499176u,3768975392u,1719730508u,138442752u,393216u}/* 03B6 */, /*849*/{66560u,65u,196609u,76578818u,1499176u,3768975392u,1719730524u,138442752u,393216u}/* 03B7 */, /*850*/{66688u,65u,196609u,76578818u,1499176u,3768975392u,1719730532u,138442752u,393216u}/* 03B8 */, /*851*/{66816u,65u,196609u,76578818u,1499176u,3768975392u,1719730540u,138442752u,393216u}/* 03B9 */, /*852*/{66944u,65u,196609u,76578818u,1499176u,3768975392u,1719730556u,138442752u,393216u}/* 03BA */, /*853*/{67072u,65u,196609u,76578818u,1499176u,3768975392u,1719730564u,138442752u,393216u}/* 03BB */, /*854*/{67200u,65u,196609u,76578818u,1499176u,3768975392u,1719730580u,138442752u,393216u}/* 03BC */, /*855*/{67328u,65u,196609u,76578818u,1499176u,3768975392u,1719730588u,138442752u,393216u}/* 03BD */, /*856*/{67456u,65u,196609u,76578818u,1499176u,3768975392u,1719730596u,138442752u,393216u}/* 03BE */, /*857*/{67584u,65u,196609u,76578818u,1499176u,3768975392u,1719730604u,138442752u,393216u}/* 03BF */, /*858*/{67712u,65u,196609u,76578818u,1499176u,3768975392u,1719730612u,138442752u,393216u}/* 03C0 */, /*859*/{67840u,65u,196609u,76578818u,1499176u,3768975392u,1719730652u,138442752u,393216u}/* 03C1 */, /*860*/{67968u,557842496u,196609u,76578818u,1499176u,3807248416u,1719730676u,138631168u,393216u}/* 03C2 */, /*861*/{68096u,65u,196609u,76578818u,1499176u,3768975392u,1719730676u,138442752u,393216u}/* 03C3 */, /*862*/{68224u,65u,196609u,76578818u,1499176u,3768975392u,1719730708u,138442752u,393216u}/* 03C4 */, /*863*/{68352u,65u,196609u,76578818u,1499176u,3768975392u,1719730716u,138442752u,393216u}/* 03C5 */, /*864*/{68480u,65u,196609u,76578818u,1499176u,3768975392u,1719730724u,138442752u,393216u}/* 03C6 */, /*865*/{68608u,65u,196609u,76578818u,1499176u,3768975392u,1719730732u,138442752u,393216u}/* 03C7 */, /*866*/{68736u,65u,196609u,76578818u,1499176u,3768975392u,1719730740u,138442752u,393216u}/* 03C8 */, /*867*/{68864u,65u,196609u,76578818u,1499176u,3768975392u,1719730756u,138442752u,393216u}/* 03C9 */, /*868*/{173084032u,64u,196609u,76578850u,1499176u,3768975392u,1719730540u,318808064u,393216u}/* 03CA */, /*869*/{173608448u,64u,196609u,76578850u,1499176u,3768975392u,1719730716u,318808064u,393216u}/* 03CB */, /*870*/{174132864u,64u,196609u,76578850u,1499176u,3768975392u,1719730604u,289447936u,393216u}/* 03CC */, /*871*/{174657280u,64u,196609u,76578850u,1499176u,3768975392u,1719730716u,289447936u,393216u}/* 03CD */, /*872*/{175181696u,64u,196609u,76578850u,1499176u,3768975392u,1719730756u,289447936u,393216u}/* 03CE */, /*873*/{69632u,559939648u,196609u,76873729u,1507368u,3807903776u,1711473620u,407009280u,2490368u}/* 03CF */, /*874*/{175706240u,562036800u,196609u,76578882u,1499168u,3807248416u,1719730446u,138457096u,393216u}/* 03D0 */, /*875*/{176230656u,564133952u,196609u,76578882u,1499168u,3807248416u,1719730534u,138457096u,393216u}/* 03D1 */, /*876*/{176685056u,64u,196609u,76578881u,1507360u,3767009312u,1711342110u,138506248u,2490368u}/* 03D2 */, /*877*/{177209344u,64u,196609u,76578849u,1507360u,3767009312u,1711342108u,289513472u,2490368u}/* 03D3 */, /*878*/{177733632u,64u,196609u,76578849u,1507360u,3767009312u,1711342108u,318873600u,2490368u}/* 03D4 */, /*879*/{178327936u,566231104u,196609u,76578882u,1499168u,3807248416u,1719730726u,138457096u,393216u}/* 03D5 */, /*880*/{178852352u,568328256u,196609u,76578882u,1499168u,3807248416u,1719730612u,138457088u,393216u}/* 03D6 */, /*881*/{70272u,64u,196609u,76677122u,1499176u,3768975392u,1719862228u,406960128u,393216u}/* 03D7 */, /*882*/{70400u,570425408u,196609u,76742657u,1507368u,3807903776u,1711342036u,138491904u,2490368u}/* 03D8 */, /*883*/{70528u,64u,196609u,76742658u,1499176u,3768975392u,1719730644u,138442752u,393216u}/* 03D9 */, /*884*/{70656u,572522560u,196609u,76578817u,1507368u,3807903776u,1711341892u,138491904u,2490368u}/* 03DA */, /*885*/{70784u,64u,196609u,76677122u,1499176u,3768975392u,1719730500u,138442752u,393216u}/* 03DB */, /*886*/{70912u,574619712u,196609u,76578817u,1507368u,3807903776u,1711341876u,138491904u,2490368u}/* 03DC */, /*887*/{71040u,64u,196609u,76677122u,1499176u,3768975392u,1719730484u,138442752u,393216u}/* 03DD */, /*888*/{71168u,576716864u,196609u,76578817u,1507368u,3807903776u,1711342028u,138491904u,2490368u}/* 03DE */, /*889*/{71296u,64u,196609u,76677122u,1499176u,3768975392u,1719730636u,138442752u,393216u}/* 03DF */, /*890*/{71424u,578814016u,196609u,76578817u,1507368u,3807903776u,1711342164u,138491904u,2490368u}/* 03E0 */, /*891*/{71552u,64u,196609u,76677122u,1499176u,3768975392u,1719730772u,138442752u,393216u}/* 03E1 */, /*892*/{71680u,580911168u,3604481u,76578817u,1507368u,3807903776u,1711342436u,138491904u,2490368u}/* 03E2 */, /*893*/{71808u,64u,3604481u,76578818u,1499176u,3768975392u,1719731044u,138442752u,393216u}/* 03E3 */, /*894*/{71936u,583008320u,3604481u,76578817u,1507368u,3807903776u,1711342476u,138491904u,2490368u}/* 03E4 */, /*895*/{72064u,64u,3604481u,76578818u,1499176u,3768975392u,1719731084u,138442752u,393216u}/* 03E5 */, /*896*/{72192u,585105472u,3604481u,76578817u,1507368u,3807903776u,1711342484u,138491904u,2490368u}/* 03E6 */, /*897*/{72320u,64u,3604481u,76578818u,1499176u,3768975392u,1719731092u,138442752u,393216u}/* 03E7 */, /*898*/{72448u,587202624u,3604481u,76578817u,1507368u,3807903776u,1711342508u,138491904u,2490368u}/* 03E8 */, /*899*/{72576u,64u,3604481u,76578818u,1499176u,3768975392u,1719731116u,138442752u,393216u}/* 03E9 */, /*900*/{72704u,589299776u,3604481u,76578817u,1507368u,3807903776u,1711342564u,138491904u,2490368u}/* 03EA */, /*901*/{72832u,64u,3604481u,76578818u,1499176u,3768975392u,1719731172u,138442752u,393216u}/* 03EB */, /*902*/{72960u,591396928u,3604481u,76578817u,1507368u,3807903776u,1711342588u,138491904u,2490368u}/* 03EC */, /*903*/{73088u,64u,3604481u,76578818u,1499176u,3768975392u,1719731196u,138442752u,393216u}/* 03ED */, /*904*/{73216u,593494080u,3604481u,76578817u,1507368u,3807903776u,1711342620u,138491904u,2490368u}/* 03EE */, /*905*/{73344u,64u,3604481u,76578818u,1499176u,3768975392u,1719731228u,138442752u,393216u}/* 03EF */, /*906*/{179379968u,595591232u,196609u,76578882u,1499168u,3807248416u,1719730558u,138457096u,393216u}/* 03F0 */, /*907*/{179904384u,597688384u,196609u,76578882u,1499168u,3807248416u,1719730654u,138457096u,393216u}/* 03F1 */, /*908*/{180428800u,64u,196609u,76578882u,1499168u,3769499680u,1719730676u,138457088u,393216u}/* 03F2 */, /*909*/{73856u,64u,196609u,76578818u,1499176u,3768975392u,1719730548u,138442752u,17170432u}/* 03F3 */, /*910*/{180953344u,599785536u,196609u,76709953u,1507360u,3807903776u,1711341926u,138506248u,2490368u}/* 03F4 */, /*911*/{181477760u,601882688u,196609u,76709954u,1499168u,3807248416u,1719730478u,138457096u,393216u}/* 03F5 */, /*912*/{0,64u,196609u,76752920u,40u,1610612768u,12614u,138442752u,67108864u}/* 03F6 */, /*913*/{74240u,603979840u,196609u,76775425u,1507368u,3807903776u,1711342180u,138491904u,2490368u}/* 03F7 */, /*914*/{74368u,64u,196609u,76775426u,1499176u,3768975392u,1719730788u,138442752u,393216u}/* 03F8 */, /*915*/{182002432u,606076992u,196609u,76775489u,1507360u,3807903776u,1711342068u,138506240u,2490368u}/* 03F9 */, /*916*/{74624u,608174144u,196609u,76775425u,1507368u,3807903776u,1711342020u,138491904u,2490368u}/* 03FA */, /*917*/{74752u,64u,196609u,76775426u,1499176u,3768975392u,1719730628u,138442752u,393216u}/* 03FB */, /*918*/{0,64u,196609u,76808194u,1499176u,3766485024u,1719730668u,138442752u,393216u}/* 03FC */, /*919*/{74880u,610271296u,196609u,76808193u,1507368u,3807903776u,1711342084u,138491904u,2490368u}/* 03FD */, /*920*/{75008u,612368448u,196609u,76808193u,1507368u,3807903776u,1711342076u,138491904u,2490368u}/* 03FE */, /*921*/{75136u,614465600u,196609u,76808193u,1507368u,3807903776u,1711342092u,138491904u,2490368u}/* 03FF */, /*922*/{182527488u,616562760u,262145u,76677153u,1507368u,3807903776u,1711343116u,293691392u,2490368u}/* 0400 */, /*923*/{183051904u,618659913u,262145u,76578849u,1507368u,3807903776u,1711343116u,318857216u,2490368u}/* 0401 */, /*924*/{75520u,620757064u,262145u,76578817u,1507368u,3807903776u,1711343036u,138491904u,2490368u}/* 0402 */, /*925*/{183576448u,622854216u,262145u,76578849u,1507368u,3807903776u,1711342828u,289497088u,2490368u}/* 0403 */, /*926*/{75776u,624951368u,262145u,76578817u,1507368u,3807903776u,1711343148u,138491904u,2490368u}/* 0404 */, /*927*/{75904u,627048520u,262145u,76578817u,1507368u,3807903776u,1711343324u,138491904u,2490368u}/* 0405 */, /*928*/{76032u,629145672u,262145u,76578817u,1507368u,3807903776u,1711343484u,138491904u,2490368u}/* 0406 */, /*929*/{184101248u,631242824u,262145u,76578849u,1507368u,3807903776u,1711343484u,318857216u,2490368u}/* 0407 */, /*930*/{76288u,633339976u,262145u,76578817u,1507368u,3807903776u,1711343556u,138491904u,2490368u}/* 0408 */, /*931*/{76416u,635437128u,262145u,76578817u,1507368u,3807903776u,1711343900u,138491904u,2490368u}/* 0409 */, /*932*/{76544u,637534280u,262145u,76578817u,1507368u,3807903776u,1711344204u,138491904u,2490368u}/* 040A */, /*933*/{76672u,639631432u,262145u,76578817u,1507368u,3807903776u,1711344644u,138491904u,2490368u}/* 040B */, /*934*/{184626176u,641728584u,262145u,76578849u,1507368u,3807903776u,1711343596u,289497088u,2490368u}/* 040C */, /*935*/{185150592u,643825736u,262145u,76677153u,1507368u,3807903776u,1711343420u,293691392u,2490368u}/* 040D */, /*936*/{185675008u,645922888u,262145u,76578849u,1507368u,3807903776u,1711344676u,297885696u,2490368u}/* 040E */, /*937*/{77184u,648020040u,262145u,76578817u,1507368u,3807903776u,1711345460u,138491904u,2490368u}/* 040F */, /*938*/{77312u,650117193u,262145u,76578817u,1507368u,3807903776u,1711342668u,138491904u,2490368u}/* 0410 */, /*939*/{77440u,652214345u,262145u,76578817u,1507368u,3807903776u,1711342764u,138491904u,2490368u}/* 0411 */, /*940*/{77568u,654311497u,262145u,76578817u,1507368u,3807903776u,1711342796u,138491904u,2490368u}/* 0412 */, /*941*/{77696u,656408649u,262145u,76578817u,1507368u,3807903776u,1711342828u,138491904u,2490368u}/* 0413 */, /*942*/{77824u,658505801u,262145u,76578817u,1507368u,3807903776u,1711342988u,138491904u,2490368u}/* 0414 */, /*943*/{77952u,660602953u,262145u,76578817u,1507368u,3807903776u,1711343116u,138491904u,2490368u}/* 0415 */, /*944*/{78080u,662700105u,262145u,76578817u,1507368u,3807903776u,1711343180u,138491904u,2490368u}/* 0416 */, /*945*/{78208u,664797257u,262145u,76578817u,1507368u,3807903776u,1711343260u,138491904u,2490368u}/* 0417 */, /*946*/{78336u,666894409u,262145u,76578817u,1507368u,3807903776u,1711343416u,138491904u,2490368u}/* 0418 */, /*947*/{186200704u,668991561u,262145u,76578849u,1507368u,3807903776u,1711343524u,138485760u,2490368u}/* 0419 */, /*948*/{78592u,671088713u,262145u,76578817u,1507368u,3807903776u,1711343596u,138491904u,2490368u}/* 041A */, /*949*/{78720u,673185865u,262145u,76578817u,1507368u,3807903776u,1711343804u,138491904u,2490368u}/* 041B */, /*950*/{78848u,675283017u,262145u,76578817u,1507368u,3807903776u,1711343956u,138491904u,2490368u}/* 041C */, /*951*/{78976u,677380169u,262145u,76578817u,1507368u,3807903776u,1711344028u,138491904u,2490368u}/* 041D */, /*952*/{79104u,679477321u,262145u,76578817u,1507368u,3807903776u,1711344244u,138491904u,2490368u}/* 041E */, /*953*/{79232u,681574473u,262145u,76578817u,1507368u,3807903776u,1711344308u,138491904u,2490368u}/* 041F */, /*954*/{79360u,683671625u,262145u,76578817u,1507368u,3807903776u,1711344412u,138491904u,2490368u}/* 0420 */, /*955*/{79488u,685768777u,262145u,76578817u,1507368u,3807903776u,1711344484u,138491904u,2490368u}/* 0421 */, /*956*/{79616u,687865929u,262145u,76578817u,1507368u,3807903776u,1711344556u,138491904u,2490368u}/* 0422 */, /*957*/{79744u,689963081u,262145u,76578817u,1507368u,3807903776u,1711344676u,138491904u,2490368u}/* 0423 */, /*958*/{79872u,692060233u,262145u,76578817u,1507368u,3807903776u,1711344812u,138491904u,2490368u}/* 0424 */, /*959*/{80000u,694157385u,262145u,76578817u,1507368u,3807903776u,1711344844u,138491904u,2490368u}/* 0425 */, /*960*/{80128u,696254537u,262145u,76578817u,1507368u,3807903776u,1711345156u,138491904u,2490368u}/* 0426 */, /*961*/{80256u,698351689u,262145u,76578817u,1507368u,3807903776u,1711345244u,138491904u,2490368u}/* 0427 */, /*962*/{80384u,700448841u,262145u,76578817u,1507368u,3807903776u,1711345492u,138491904u,2490368u}/* 0428 */, /*963*/{80512u,702545993u,262145u,76578817u,1507368u,3807903776u,1711345532u,138491904u,2490368u}/* 0429 */, /*964*/{80640u,704643145u,262145u,76578817u,1507368u,3807903776u,1711345588u,138491904u,2490368u}/* 042A */, /*965*/{80768u,706740297u,262145u,76578817u,1507368u,3807903776u,1711345628u,138491904u,2490368u}/* 042B */, /*966*/{80896u,708837449u,262145u,76578817u,1507368u,3807903776u,1711345660u,138491904u,2490368u}/* 042C */, /*967*/{81024u,710934601u,262145u,76578817u,1507368u,3807903776u,1711345764u,138491904u,2490368u}/* 042D */, /*968*/{81152u,713031753u,262145u,76578817u,1507368u,3807903776u,1711345796u,138491904u,2490368u}/* 042E */, /*969*/{81280u,715128905u,262145u,76578817u,1507368u,3807903776u,1711345844u,138491904u,2490368u}/* 042F */, /*970*/{81408u,73u,262145u,76578818u,1499176u,3768975392u,1719731276u,138442752u,393216u}/* 0430 */, /*971*/{81536u,73u,262145u,76578818u,1499176u,3768975392u,1719731372u,138442752u,393216u}/* 0431 */, /*972*/{81664u,73u,262145u,76578818u,1499176u,3768975392u,1719731404u,138442752u,393216u}/* 0432 */, /*973*/{81792u,73u,262145u,76578818u,1499176u,3768975392u,1719731436u,138442752u,393216u}/* 0433 */, /*974*/{81920u,73u,262145u,76578818u,1499176u,3768975392u,1719731596u,138442752u,393216u}/* 0434 */, /*975*/{82048u,73u,262145u,76578818u,1499176u,3768975392u,1719731724u,138442752u,393216u}/* 0435 */, /*976*/{82176u,73u,262145u,76578818u,1499176u,3768975392u,1719731788u,138442752u,393216u}/* 0436 */, /*977*/{82304u,73u,262145u,76578818u,1499176u,3768975392u,1719731868u,138442752u,393216u}/* 0437 */, /*978*/{82432u,73u,262145u,76578818u,1499176u,3768975392u,1719732024u,138442752u,393216u}/* 0438 */, /*979*/{186729088u,73u,262145u,76578850u,1499176u,3768975392u,1719732132u,138436608u,393216u}/* 0439 */, /*980*/{82688u,73u,262145u,76578818u,1499176u,3768975392u,1719732204u,138442752u,393216u}/* 043A */, /*981*/{82816u,73u,262145u,76578818u,1499176u,3768975392u,1719732412u,138442752u,393216u}/* 043B */, /*982*/{82944u,73u,262145u,76578818u,1499176u,3768975392u,1719732564u,138442752u,393216u}/* 043C */, /*983*/{83072u,73u,262145u,76578818u,1499176u,3768975392u,1719732636u,138442752u,393216u}/* 043D */, /*984*/{83200u,73u,262145u,76578818u,1499176u,3768975392u,1719732852u,138442752u,393216u}/* 043E */, /*985*/{83328u,73u,262145u,76578818u,1499176u,3768975392u,1719732916u,138442752u,393216u}/* 043F */, /*986*/{83456u,73u,262145u,76578818u,1499176u,3768975392u,1719733020u,138442752u,393216u}/* 0440 */, /*987*/{83584u,73u,262145u,76578818u,1499176u,3768975392u,1719733092u,138442752u,393216u}/* 0441 */, /*988*/{83712u,73u,262145u,76578818u,1499176u,3768975392u,1719733164u,138442752u,393216u}/* 0442 */, /*989*/{83840u,73u,262145u,76578818u,1499176u,3768975392u,1719733284u,138442752u,393216u}/* 0443 */, /*990*/{83968u,73u,262145u,76578818u,1499176u,3768975392u,1719733420u,138442752u,393216u}/* 0444 */, /*991*/{84096u,73u,262145u,76578818u,1499176u,3768975392u,1719733452u,138442752u,393216u}/* 0445 */, /*992*/{84224u,73u,262145u,76578818u,1499176u,3768975392u,1719733764u,138442752u,393216u}/* 0446 */, /*993*/{84352u,73u,262145u,76578818u,1499176u,3768975392u,1719733852u,138442752u,393216u}/* 0447 */, /*994*/{84480u,73u,262145u,76578818u,1499176u,3768975392u,1719734100u,138442752u,393216u}/* 0448 */, /*995*/{84608u,73u,262145u,76578818u,1499176u,3768975392u,1719734140u,138442752u,393216u}/* 0449 */, /*996*/{84736u,73u,262145u,76578818u,1499176u,3768975392u,1719734196u,138442752u,393216u}/* 044A */, /*997*/{84864u,73u,262145u,76578818u,1499176u,3768975392u,1719734236u,138442752u,393216u}/* 044B */, /*998*/{84992u,73u,262145u,76578818u,1499176u,3768975392u,1719734268u,138442752u,393216u}/* 044C */, /*999*/{85120u,73u,262145u,76578818u,1499176u,3768975392u,1719734372u,138442752u,393216u}/* 044D */, /*1000*/{85248u,73u,262145u,76578818u,1499176u,3768975392u,1719734404u,138442752u,393216u}/* 044E */, /*1001*/{85376u,73u,262145u,76578818u,1499176u,3768975392u,1719734452u,138442752u,393216u}/* 044F */, /*1002*/{187256320u,72u,262145u,76677154u,1499176u,3768975392u,1719731724u,293642240u,393216u}/* 0450 */, /*1003*/{187780736u,73u,262145u,76578850u,1499176u,3768975392u,1719731724u,318808064u,393216u}/* 0451 */, /*1004*/{85760u,72u,262145u,76578818u,1499176u,3768975392u,1719731644u,138442752u,393216u}/* 0452 */, /*1005*/{188305280u,72u,262145u,76578850u,1499176u,3768975392u,1719731436u,289447936u,393216u}/* 0453 */, /*1006*/{86016u,72u,262145u,76578818u,1499176u,3768975392u,1719731756u,138442752u,393216u}/* 0454 */, /*1007*/{86144u,72u,262145u,76578818u,1499176u,3768975392u,1719731932u,138442752u,393216u}/* 0455 */, /*1008*/{86272u,72u,262145u,76578818u,1499176u,3768975392u,1719732092u,138442752u,17170432u}/* 0456 */, /*1009*/{188830080u,72u,262145u,76578850u,1499176u,3768975392u,1719732092u,318808064u,393216u}/* 0457 */, /*1010*/{86528u,72u,262145u,76578818u,1499176u,3768975392u,1719732164u,138442752u,17170432u}/* 0458 */, /*1011*/{86656u,72u,262145u,76578818u,1499176u,3768975392u,1719732508u,138442752u,393216u}/* 0459 */, /*1012*/{86784u,72u,262145u,76578818u,1499176u,3768975392u,1719732812u,138442752u,393216u}/* 045A */, /*1013*/{86912u,72u,262145u,76578818u,1499176u,3768975392u,1719733252u,138442752u,393216u}/* 045B */, /*1014*/{189355008u,72u,262145u,76578850u,1499176u,3768975392u,1719732204u,289447936u,393216u}/* 045C */, /*1015*/{189879424u,72u,262145u,76677154u,1499176u,3768975392u,1719732028u,293642240u,393216u}/* 045D */, /*1016*/{190403840u,72u,262145u,76578850u,1499176u,3768975392u,1719733284u,297836544u,393216u}/* 045E */, /*1017*/{87424u,72u,262145u,76578818u,1499176u,3768975392u,1719734068u,138442752u,393216u}/* 045F */, /*1018*/{87552u,717226056u,262145u,76578817u,1507368u,3807903776u,1711345020u,138491904u,2490368u}/* 0460 */, /*1019*/{87680u,72u,262145u,76578818u,1499176u,3768975392u,1719733628u,138442752u,393216u}/* 0461 */, /*1020*/{87808u,719323208u,262145u,76578817u,1507368u,3807903776u,1711345724u,138491904u,2490368u}/* 0462 */, /*1021*/{87936u,72u,262145u,76578818u,1499176u,3768975392u,1719734332u,138442752u,393216u}/* 0463 */, /*1022*/{88064u,721420360u,262145u,76578817u,1507368u,3807903776u,1711345884u,138491904u,2490368u}/* 0464 */, /*1023*/{88192u,72u,262145u,76578818u,1499176u,3768975392u,1719734492u,138442752u,393216u}/* 0465 */, /*1024*/{88320u,723517512u,262145u,76578817u,1507368u,3807903776u,1711345916u,138491904u,2490368u}/* 0466 */, /*1025*/{88448u,72u,262145u,76578818u,1499176u,3768975392u,1719734524u,138442752u,393216u}/* 0467 */, /*1026*/{88576u,725614664u,262145u,76578817u,1507368u,3807903776u,1711345996u,138491904u,2490368u}/* 0468 */, /*1027*/{88704u,72u,262145u,76578818u,1499176u,3768975392u,1719734604u,138442752u,393216u}/* 0469 */, /*1028*/{88832u,727711816u,262145u,76578817u,1507368u,3807903776u,1711345956u,138491904u,2490368u}/* 046A */, /*1029*/{88960u,72u,262145u,76578818u,1499176u,3768975392u,1719734564u,138442752u,393216u}/* 046B */, /*1030*/{89088u,729808968u,262145u,76578817u,1507368u,3807903776u,1711346036u,138491904u,2490368u}/* 046C */, /*1031*/{89216u,72u,262145u,76578818u,1499176u,3768975392u,1719734644u,138442752u,393216u}/* 046D */, /*1032*/{89344u,731906120u,262145u,76578817u,1507368u,3807903776u,1711346068u,138491904u,2490368u}/* 046E */, /*1033*/{89472u,72u,262145u,76578818u,1499176u,3768975392u,1719734676u,138442752u,393216u}/* 046F */, /*1034*/{89600u,734003272u,262145u,76578817u,1507368u,3807903776u,1711346100u,138491904u,2490368u}/* 0470 */, /*1035*/{89728u,72u,262145u,76578818u,1499176u,3768975392u,1719734708u,138442752u,393216u}/* 0471 */, /*1036*/{89856u,736100424u,262145u,76578817u,1507368u,3807903776u,1711346132u,138491904u,2490368u}/* 0472 */, /*1037*/{89984u,72u,262145u,76578818u,1499176u,3768975392u,1719734740u,138442752u,393216u}/* 0473 */, /*1038*/{90112u,738197576u,262145u,76578817u,1507368u,3807903776u,1711346164u,138491904u,2490368u}/* 0474 */, /*1039*/{90240u,72u,262145u,76578818u,1499176u,3768975392u,1719734772u,138442752u,393216u}/* 0475 */, /*1040*/{190931200u,740294728u,262145u,76578849u,1507368u,3807903776u,1711346164u,390160384u,2490368u}/* 0476 */, /*1041*/{191455616u,72u,262145u,76578850u,1499176u,3768975392u,1719734772u,390111232u,393216u}/* 0477 */, /*1042*/{90624u,742391880u,262145u,76578817u,1507368u,3807903776u,1711344780u,138491904u,2490368u}/* 0478 */, /*1043*/{90752u,72u,262145u,76578818u,1499176u,3768975392u,1719733388u,138442752u,393216u}/* 0479 */, /*1044*/{90880u,744489032u,262145u,76578817u,1507368u,3807903776u,1711345124u,138491904u,2490368u}/* 047A */, /*1045*/{91008u,72u,262145u,76578818u,1499176u,3768975392u,1719733732u,138442752u,393216u}/* 047B */, /*1046*/{91136u,746586184u,262145u,76578817u,1507368u,3807903776u,1711345092u,138491904u,2490368u}/* 047C */, /*1047*/{91264u,72u,262145u,76578818u,1499176u,3768975392u,1719733700u,138442752u,393216u}/* 047D */, /*1048*/{91392u,748683336u,262145u,76578817u,1507368u,3807903776u,1711345052u,138491904u,2490368u}/* 047E */, /*1049*/{91520u,72u,262145u,76578818u,1499176u,3768975392u,1719733660u,138442752u,393216u}/* 047F */, /*1050*/{91648u,750780488u,262145u,76578817u,1507368u,3807903776u,1711344380u,138491904u,2490368u}/* 0480 */, /*1051*/{91776u,72u,262145u,76578818u,1499176u,3768975392u,1719732988u,138442752u,393216u}/* 0481 */, /*1052*/{0,72u,262145u,76578843u,40u,1610612768u,10356u,138442752u,67108864u}/* 0482 */, /*1053*/{0,72u,262145u,3423645702u,672030728u,1627398160u,1077936140u,339769344u,262144u}/* 0483 */, /*1054*/{0,72u,262145u,3423645702u,672030728u,1627398160u,1077936140u,218134528u,262144u}/* 0484 */, /*1055*/{0,72u,2686977u,3423645702u,672030728u,1627398160u,1077936140u,151025664u,262144u}/* 0485 */, /*1056*/{0,72u,2686977u,3423645702u,672030728u,1627398160u,1077936140u,146831360u,262144u}/* 0486 */, /*1057*/{0,72u,262145u,3423940614u,672030728u,1627398160u,1077936140u,218134528u,262144u}/* 0487 */, /*1058*/{0,72u,262145u,68300807u,672030728u,1627389968u,4194316u,4208640u,0}/* 0488 */, /*1059*/{91904u,752877640u,262145u,76742657u,1507368u,3807903776u,1711343452u,138491904u,2490368u}/* 048A */, /*1060*/{92032u,72u,262145u,76742658u,1499176u,3768975392u,1719732060u,138442752u,393216u}/* 048B */, /*1061*/{92160u,754974792u,262145u,76677121u,1507368u,3807903776u,1711345692u,138491904u,2490368u}/* 048C */, /*1062*/{92288u,72u,262145u,76677122u,1499176u,3768975392u,1719734300u,138442752u,393216u}/* 048D */, /*1063*/{92416u,757071944u,262145u,76677121u,1507368u,3807903776u,1711344444u,138491904u,2490368u}/* 048E */, /*1064*/{92544u,72u,262145u,76677122u,1499176u,3768975392u,1719733052u,138442752u,393216u}/* 048F */, /*1065*/{92672u,759169096u,262145u,76578817u,1507368u,3807903776u,1711342828u,1287780352u,2490368u}/* 0490 */, /*1066*/{92800u,72u,262145u,76578818u,1499176u,3768975392u,1719731436u,1287731200u,393216u}/* 0491 */, /*1067*/{92928u,761266248u,262145u,76578817u,1507368u,3807903776u,1711342860u,138491904u,2490368u}/* 0492 */, /*1068*/{93056u,72u,262145u,76578818u,1499176u,3768975392u,1719731468u,138442752u,393216u}/* 0493 */, /*1069*/{93184u,763363400u,262145u,76578817u,1507368u,3807903776u,1711342924u,138491904u,2490368u}/* 0494 */, /*1070*/{93312u,72u,262145u,76578818u,1499176u,3768975392u,1719731532u,138442752u,393216u}/* 0495 */, /*1071*/{93440u,765460552u,262145u,76578817u,1507368u,3807903776u,1711343228u,138491904u,2490368u}/* 0496 */, /*1072*/{93568u,72u,262145u,76578818u,1499176u,3768975392u,1719731836u,138442752u,393216u}/* 0497 */, /*1073*/{93696u,767557704u,262145u,76578817u,1507368u,3807903776u,1711343084u,138491904u,2490368u}/* 0498 */, /*1074*/{93824u,72u,262145u,76578818u,1499176u,3768975392u,1719731692u,138442752u,393216u}/* 0499 */, /*1075*/{93952u,769654856u,262145u,76578817u,1507368u,3807903776u,1711343628u,138491904u,2490368u}/* 049A */, /*1076*/{94080u,72u,262145u,76578818u,1499176u,3768975392u,1719732236u,138442752u,393216u}/* 049B */, /*1077*/{94208u,771752008u,262145u,76578817u,1507368u,3807903776u,1711343756u,138491904u,2490368u}/* 049C */, /*1078*/{94336u,72u,262145u,76578818u,1499176u,3768975392u,1719732364u,138442752u,393216u}/* 049D */, /*1079*/{94464u,773849160u,262145u,76578817u,1507368u,3807903776u,1711343724u,138491904u,2490368u}/* 049E */, /*1080*/{94592u,72u,262145u,76578818u,1499176u,3768975392u,1719732332u,138442752u,393216u}/* 049F */, /*1081*/{94720u,775946312u,262145u,76578817u,1507368u,3807903776u,1711343692u,138491904u,2490368u}/* 04A0 */, /*1082*/{94848u,72u,262145u,76578818u,1499176u,3768975392u,1719732300u,138442752u,393216u}/* 04A1 */, /*1083*/{94976u,778043464u,262145u,76578817u,1507368u,3807903776u,1711344100u,138491904u,2490368u}/* 04A2 */, /*1084*/{95104u,72u,262145u,76578818u,1499176u,3768975392u,1719732708u,138442752u,393216u}/* 04A3 */, /*1085*/{95232u,780140616u,262145u,76578817u,1507368u,3807903776u,1711344172u,138491904u,2490368u}/* 04A4 */, /*1086*/{95360u,72u,262145u,76578818u,1499176u,3768975392u,1719732780u,138442752u,393216u}/* 04A5 */, /*1087*/{95488u,782237768u,262145u,76578817u,1507368u,3807903776u,1711344348u,138491904u,2490368u}/* 04A6 */, /*1088*/{95616u,72u,262145u,76578818u,1499176u,3768975392u,1719732956u,138442752u,393216u}/* 04A7 */, /*1089*/{95744u,784334920u,262145u,76578817u,1507368u,3807903776u,1711346204u,138491904u,2490368u}/* 04A8 */, /*1090*/{95872u,72u,262145u,76578818u,1499176u,3768975392u,1719734812u,138442752u,393216u}/* 04A9 */, /*1091*/{96000u,786432072u,262145u,76578817u,1507368u,3807903776u,1711344524u,138491904u,2490368u}/* 04AA */, /*1092*/{96128u,72u,262145u,76578818u,1499176u,3768975392u,1719733132u,138442752u,393216u}/* 04AB */, /*1093*/{96256u,788529224u,262145u,76578817u,1507368u,3807903776u,1711344604u,138491904u,2490368u}/* 04AC */, /*1094*/{96384u,72u,262145u,76578818u,1499176u,3768975392u,1719733212u,138442752u,393216u}/* 04AD */, /*1095*/{96512u,790626376u,262145u,76578817u,1507368u,3807903776u,1711344708u,138491904u,2490368u}/* 04AE */, /*1096*/{96640u,72u,262145u,76578818u,1499176u,3768975392u,1719733316u,138442752u,393216u}/* 04AF */, /*1097*/{96768u,792723528u,262145u,76578817u,1507368u,3807903776u,1711344740u,138491904u,2490368u}/* 04B0 */, /*1098*/{96896u,72u,262145u,76578818u,1499176u,3768975392u,1719733348u,138442752u,393216u}/* 04B1 */, /*1099*/{97024u,794820680u,262145u,76578817u,1507368u,3807903776u,1711344940u,138491904u,2490368u}/* 04B2 */, /*1100*/{97152u,72u,262145u,76578818u,1499176u,3768975392u,1719733548u,138442752u,393216u}/* 04B3 */, /*1101*/{97280u,796917832u,262145u,76578817u,1507368u,3807903776u,1711345204u,138491904u,2490368u}/* 04B4 */, /*1102*/{97408u,72u,262145u,76578818u,1499176u,3768975392u,1719733812u,138442752u,393216u}/* 04B5 */, /*1103*/{97536u,799014984u,262145u,76578817u,1507368u,3807903776u,1711345292u,138491904u,2490368u}/* 04B6 */, /*1104*/{97664u,72u,262145u,76578818u,1499176u,3768975392u,1719733900u,138442752u,393216u}/* 04B7 */, /*1105*/{97792u,801112136u,262145u,76578817u,1507368u,3807903776u,1711345356u,138491904u,2490368u}/* 04B8 */, /*1106*/{97920u,72u,262145u,76578818u,1499176u,3768975392u,1719733964u,138442752u,393216u}/* 04B9 */, /*1107*/{98048u,803209288u,262145u,76578817u,1507368u,3807903776u,1711344972u,138491904u,2490368u}/* 04BA */, /*1108*/{98176u,72u,262145u,76578818u,1499176u,3768975392u,1719733580u,138442752u,393216u}/* 04BB */, /*1109*/{98304u,805306440u,262145u,76578817u,1507368u,3807903776u,1711345396u,138491904u,2490368u}/* 04BC */, /*1110*/{98432u,72u,262145u,76578818u,1499176u,3768975392u,1719734004u,138442752u,393216u}/* 04BD */, /*1111*/{98560u,807403592u,262145u,76578817u,1507368u,3807903776u,1711345428u,138491904u,2490368u}/* 04BE */, /*1112*/{98688u,72u,262145u,76578818u,1499176u,3768975392u,1719734036u,138442752u,393216u}/* 04BF */, /*1113*/{98816u,809500744u,262145u,76578817u,1507368u,3807903776u,1711346244u,138491904u,2490368u}/* 04C0 */, /*1114*/{191988352u,811597896u,262145u,76578849u,1507368u,3807903776u,1711343180u,297885696u,2490368u}/* 04C1 */, /*1115*/{192512768u,72u,262145u,76578850u,1499176u,3768975392u,1719731788u,297836544u,393216u}/* 04C2 */, /*1116*/{99200u,813695048u,262145u,76578817u,1507368u,3807903776u,1711343660u,138491904u,2490368u}/* 04C3 */, /*1117*/{99328u,72u,262145u,76578818u,1499176u,3768975392u,1719732268u,138442752u,393216u}/* 04C4 */, /*1118*/{99456u,815792200u,262145u,76742657u,1507368u,3807903776u,1711343844u,138491904u,2490368u}/* 04C5 */, /*1119*/{99584u,72u,262145u,76742658u,1499176u,3768975392u,1719732452u,138442752u,393216u}/* 04C6 */, /*1120*/{99712u,817889352u,262145u,76578817u,1507368u,3807903776u,1711344132u,138491904u,2490368u}/* 04C7 */, /*1121*/{99840u,72u,262145u,76578818u,1499176u,3768975392u,1719732740u,138442752u,393216u}/* 04C8 */, /*1122*/{99968u,819986504u,262145u,76742657u,1507368u,3807903776u,1711344068u,138491904u,2490368u}/* 04C9 */, /*1123*/{100096u,72u,262145u,76742658u,1499176u,3768975392u,1719732676u,138442752u,393216u}/* 04CA */, /*1124*/{100224u,822083656u,262145u,76578817u,1507368u,3807903776u,1711345324u,138491904u,2490368u}/* 04CB */, /*1125*/{100352u,72u,262145u,76578818u,1499176u,3768975392u,1719733932u,138442752u,393216u}/* 04CC */, /*1126*/{100480u,824180808u,262145u,76742657u,1507368u,3807903776u,1711343988u,138491904u,2490368u}/* 04CD */, /*1127*/{100608u,72u,262145u,76742658u,1499176u,3768975392u,1719732596u,138442752u,393216u}/* 04CE */, /*1128*/{100736u,72u,262145u,76840962u,1499176u,3768975392u,1719734852u,138442752u,393216u}/* 04CF */, /*1129*/{193038848u,826277960u,262145u,76578849u,1507368u,3807903776u,1711342668u,297885696u,2490368u}/* 04D0 */, /*1130*/{193563264u,72u,262145u,76578850u,1499176u,3768975392u,1719731276u,297836544u,393216u}/* 04D1 */, /*1131*/{194087680u,828375112u,262145u,76578849u,1507368u,3807903776u,1711342668u,318857216u,2490368u}/* 04D2 */, /*1132*/{194612096u,72u,262145u,76578850u,1499176u,3768975392u,1719731276u,318808064u,393216u}/* 04D3 */, /*1133*/{101376u,830472264u,262145u,76578817u,1507368u,3807903776u,1711342732u,138491904u,2490368u}/* 04D4 */, /*1134*/{101504u,72u,262145u,76578818u,1499176u,3768975392u,1719731340u,138442752u,393216u}/* 04D5 */, /*1135*/{195136768u,832569416u,262145u,76578849u,1507368u,3807903776u,1711343116u,297885696u,2490368u}/* 04D6 */, /*1136*/{195661184u,72u,262145u,76578850u,1499176u,3768975392u,1719731724u,297836544u,393216u}/* 04D7 */, /*1137*/{101888u,834666568u,262145u,76578817u,1507368u,3807903776u,1711342700u,138491904u,2490368u}/* 04D8 */, /*1138*/{102016u,72u,262145u,76578818u,1499176u,3768975392u,1719731308u,138442752u,393216u}/* 04D9 */, /*1139*/{196185856u,836763720u,262145u,76578849u,1507368u,3807903776u,1711342700u,318857216u,2490368u}/* 04DA */, /*1140*/{196710272u,72u,262145u,76578850u,1499176u,3768975392u,1719731308u,318808064u,393216u}/* 04DB */, /*1141*/{197234688u,838860872u,262145u,76578849u,1507368u,3807903776u,1711343180u,318857216u,2490368u}/* 04DC */, /*1142*/{197759104u,72u,262145u,76578850u,1499176u,3768975392u,1719731788u,318808064u,393216u}/* 04DD */, /*1143*/{198283520u,840958024u,262145u,76578849u,1507368u,3807903776u,1711343260u,318857216u,2490368u}/* 04DE */, /*1144*/{198807936u,72u,262145u,76578850u,1499176u,3768975392u,1719731868u,318808064u,393216u}/* 04DF */, /*1145*/{102912u,843055176u,262145u,76578817u,1507368u,3807903776u,1711343364u,138491904u,2490368u}/* 04E0 */, /*1146*/{103040u,72u,262145u,76578818u,1499176u,3768975392u,1719731972u,138442752u,393216u}/* 04E1 */, /*1147*/{199332608u,845152328u,262145u,76578849u,1507368u,3807903776u,1711343420u,348217344u,2490368u}/* 04E2 */, /*1148*/{199857024u,72u,262145u,76578850u,1499176u,3768975392u,1719732028u,348168192u,393216u}/* 04E3 */, /*1149*/{200381440u,847249480u,262145u,76578849u,1507368u,3807903776u,1711343420u,318857216u,2490368u}/* 04E4 */, /*1150*/{200905856u,72u,262145u,76578850u,1499176u,3768975392u,1719732028u,318808064u,393216u}/* 04E5 */, /*1151*/{201430272u,849346632u,262145u,76578849u,1507368u,3807903776u,1711344244u,318857216u,2490368u}/* 04E6 */, /*1152*/{201954688u,72u,262145u,76578850u,1499176u,3768975392u,1719732852u,318808064u,393216u}/* 04E7 */, /*1153*/{103936u,851443784u,262145u,76578817u,1507368u,3807903776u,1711344276u,138491904u,2490368u}/* 04E8 */, /*1154*/{104064u,72u,262145u,76578818u,1499176u,3768975392u,1719732884u,138442752u,393216u}/* 04E9 */, /*1155*/{202479360u,853540936u,262145u,76578849u,1507368u,3807903776u,1711344276u,318857216u,2490368u}/* 04EA */, /*1156*/{203003776u,72u,262145u,76578850u,1499176u,3768975392u,1719732884u,318808064u,393216u}/* 04EB */, /*1157*/{203528192u,855638088u,262145u,76677153u,1507368u,3807903776u,1711345764u,318857216u,2490368u}/* 04EC */, /*1158*/{204052608u,72u,262145u,76677154u,1499176u,3768975392u,1719734372u,318808064u,393216u}/* 04ED */, /*1159*/{204577024u,857735240u,262145u,76578849u,1507368u,3807903776u,1711344676u,348217344u,2490368u}/* 04EE */, /*1160*/{205101440u,72u,262145u,76578850u,1499176u,3768975392u,1719733284u,348168192u,393216u}/* 04EF */, /*1161*/{205625856u,859832392u,262145u,76578849u,1507368u,3807903776u,1711344676u,318857216u,2490368u}/* 04F0 */, /*1162*/{206150272u,72u,262145u,76578850u,1499176u,3768975392u,1719733284u,318808064u,393216u}/* 04F1 */, /*1163*/{206674688u,861929544u,262145u,76578849u,1507368u,3807903776u,1711344676u,323051520u,2490368u}/* 04F2 */, /*1164*/{207199104u,72u,262145u,76578850u,1499176u,3768975392u,1719733284u,323002368u,393216u}/* 04F3 */, /*1165*/{207723520u,864026696u,262145u,76578849u,1507368u,3807903776u,1711345244u,318857216u,2490368u}/* 04F4 */, /*1166*/{208247936u,72u,262145u,76578850u,1499176u,3768975392u,1719733852u,318808064u,393216u}/* 04F5 */, /*1167*/{105728u,866123848u,262145u,76808193u,1507368u,3807903776u,1711342956u,138491904u,2490368u}/* 04F6 */, /*1168*/{105856u,72u,262145u,76808194u,1499176u,3768975392u,1719731564u,138442752u,393216u}/* 04F7 */, /*1169*/{208772608u,868221000u,262145u,76578849u,1507368u,3807903776u,1711345628u,318857216u,2490368u}/* 04F8 */, /*1170*/{209297024u,72u,262145u,76578850u,1499176u,3768975392u,1719734236u,318808064u,393216u}/* 04F9 */, /*1171*/{106240u,870318152u,262145u,76840961u,1507368u,3807903776u,1711342892u,138491904u,2490368u}/* 04FA */, /*1172*/{106368u,72u,262145u,76840962u,1499176u,3768975392u,1719731500u,138442752u,393216u}/* 04FB */, /*1173*/{106496u,872415304u,262145u,76840961u,1507368u,3807903776u,1711344876u,138491904u,2490368u}/* 04FC */, /*1174*/{106624u,72u,262145u,76840962u,1499176u,3768975392u,1719733484u,138442752u,393216u}/* 04FD */, /*1175*/{106752u,874512456u,262145u,76840961u,1507368u,3807903776u,1711344908u,138491904u,2490368u}/* 04FE */, /*1176*/{106880u,72u,262145u,76840962u,1499176u,3768975392u,1719733516u,138442752u,393216u}/* 04FF */, /*1177*/{107008u,876609616u,262145u,76742657u,1507368u,3807903776u,1711343020u,138491904u,2490368u}/* 0500 */, /*1178*/{107136u,80u,262145u,76742658u,1499176u,3768975392u,1719731628u,138442752u,393216u}/* 0501 */, /*1179*/{107264u,878706768u,262145u,76742657u,1507368u,3807903776u,1711343076u,138491904u,2490368u}/* 0502 */, /*1180*/{107392u,80u,262145u,76742658u,1499176u,3768975392u,1719731684u,138442752u,393216u}/* 0503 */, /*1181*/{107520u,880803920u,262145u,76742657u,1507368u,3807903776u,1711343300u,138491904u,2490368u}/* 0504 */, /*1182*/{107648u,80u,262145u,76742658u,1499176u,3768975392u,1719731908u,138442752u,393216u}/* 0505 */, /*1183*/{107776u,882901072u,262145u,76742657u,1507368u,3807903776u,1711343404u,138491904u,2490368u}/* 0506 */, /*1184*/{107904u,80u,262145u,76742658u,1499176u,3768975392u,1719732012u,138442752u,393216u}/* 0507 */, /*1185*/{108032u,884998224u,262145u,76742657u,1507368u,3807903776u,1711343940u,138491904u,2490368u}/* 0508 */, /*1186*/{108160u,80u,262145u,76742658u,1499176u,3768975392u,1719732548u,138442752u,393216u}/* 0509 */, /*1187*/{108288u,887095376u,262145u,76742657u,1507368u,3807903776u,1711344236u,138491904u,2490368u}/* 050A */, /*1188*/{108416u,80u,262145u,76742658u,1499176u,3768975392u,1719732844u,138442752u,393216u}/* 050B */, /*1189*/{108544u,889192528u,262145u,76742657u,1507368u,3807903776u,1711344516u,138491904u,2490368u}/* 050C */, /*1190*/{108672u,80u,262145u,76742658u,1499176u,3768975392u,1719733124u,138442752u,393216u}/* 050D */, /*1191*/{108800u,891289680u,262145u,76742657u,1507368u,3807903776u,1711344596u,138491904u,2490368u}/* 050E */, /*1192*/{108928u,80u,262145u,76742658u,1499176u,3768975392u,1719733204u,138442752u,393216u}/* 050F */, /*1193*/{109056u,893386832u,262145u,76840961u,1507368u,3807903776u,1711343308u,138491904u,2490368u}/* 0510 */, /*1194*/{109184u,80u,262145u,76840962u,1499176u,3768975392u,1719731916u,138442752u,393216u}/* 0511 */, /*1195*/{109312u,895483984u,262145u,76840961u,1507368u,3807903776u,1711343884u,138491904u,2490368u}/* 0512 */, /*1196*/{109440u,80u,262145u,76840962u,1499176u,3768975392u,1719732492u,138442752u,393216u}/* 0513 */, /*1197*/{109568u,897581136u,262145u,76873729u,1507368u,3807903776u,1711343948u,138491904u,2490368u}/* 0514 */, /*1198*/{109696u,80u,262145u,76873730u,1499176u,3768975392u,1719732556u,138442752u,393216u}/* 0515 */, /*1199*/{109824u,899678288u,262145u,76873729u,1507368u,3807903776u,1711344476u,138491904u,2490368u}/* 0516 */, /*1200*/{109952u,80u,262145u,76873730u,1499176u,3768975392u,1719733084u,138442752u,393216u}/* 0517 */, /*1201*/{110080u,901775440u,262145u,76873729u,1507368u,3807903776u,1711345876u,138491904u,2490368u}/* 0518 */, /*1202*/{110208u,80u,262145u,76873730u,1499176u,3768975392u,1719734484u,138442752u,393216u}/* 0519 */, /*1203*/{110336u,903872592u,262145u,76873729u,1507368u,3807903776u,1711343796u,138491904u,2490368u}/* 051A */, /*1204*/{110464u,80u,262145u,76873730u,1499176u,3768975392u,1719732404u,138442752u,393216u}/* 051B */, /*1205*/{110592u,905969744u,262145u,76873729u,1507368u,3807903776u,1711346236u,138491904u,2490368u}/* 051C */, /*1206*/{110720u,80u,262145u,76873730u,1499176u,3768975392u,1719734844u,138442752u,393216u}/* 051D */, /*1207*/{110848u,908066896u,262145u,76873729u,1507368u,3807903776u,1711343788u,138491904u,2490368u}/* 051E */, /*1208*/{110976u,80u,262145u,76873730u,1499176u,3768975392u,1719732396u,138442752u,393216u}/* 051F */, /*1209*/{111104u,910164048u,262145u,76873729u,1507368u,3807903776u,1711343892u,138491904u,2490368u}/* 0520 */, /*1210*/{111232u,80u,262145u,76873730u,1499176u,3768975392u,1719732500u,138442752u,393216u}/* 0521 */, /*1211*/{111360u,912261200u,262145u,76873729u,1507368u,3807903776u,1711344164u,138491904u,2490368u}/* 0522 */, /*1212*/{111488u,80u,262145u,76873730u,1499176u,3768975392u,1719732772u,138442752u,393216u}/* 0523 */, /*1213*/{111616u,914358352u,262145u,76906497u,1507368u,3807903776u,1711344340u,138491904u,2490368u}/* 0524 */, /*1214*/{111744u,80u,262145u,76906498u,1499176u,3768975392u,1719732948u,138442752u,393216u}/* 0525 */, /*1215*/{111872u,916455504u,262145u,76939265u,1507368u,3807903776u,1711345004u,138491904u,2490368u}/* 0526 */, /*1216*/{112000u,80u,262145u,76939266u,1499176u,3768975392u,1719733612u,138442752u,393216u}/* 0527 */, /*1217*/{112128u,918552656u,262145u,77070337u,1507368u,3807903776u,1711344060u,138491904u,2490368u}/* 0528 */, /*1218*/{112256u,80u,262145u,77070338u,1499176u,3768975392u,1719732668u,138442752u,393216u}/* 0529 */, /*1219*/{112384u,920649808u,262145u,77070337u,1507368u,3807903776u,1711343212u,138491904u,2490368u}/* 052A */, /*1220*/{112512u,80u,262145u,77070338u,1499176u,3768975392u,1719731820u,138442752u,393216u}/* 052B */, /*1221*/{112640u,922746960u,262145u,77070337u,1507368u,3807903776u,1711345276u,138491904u,2490368u}/* 052C */, /*1222*/{112768u,80u,262145u,77070338u,1499176u,3768975392u,1719733884u,138442752u,393216u}/* 052D */, /*1223*/{112896u,924844112u,262145u,77070337u,1507368u,3807903776u,1711343876u,138491904u,2490368u}/* 052E */, /*1224*/{113024u,80u,262145u,77070338u,1499176u,3768975392u,1719732484u,138442752u,393216u}/* 052F */, /*1225*/{113152u,926941272u,327681u,76578817u,1507368u,3807903776u,1711347644u,138491904u,2490368u}/* 0531 */, /*1226*/{113280u,929038424u,327681u,76578817u,1507368u,3807903776u,1711347652u,138491904u,2490368u}/* 0532 */, /*1227*/{113408u,931135576u,327681u,76578817u,1507368u,3807903776u,1711347660u,138491904u,2490368u}/* 0533 */, /*1228*/{113536u,933232728u,327681u,76578817u,1507368u,3807903776u,1711347668u,138491904u,2490368u}/* 0534 */, /*1229*/{113664u,935329880u,327681u,76578817u,1507368u,3807903776u,1711347676u,138491904u,2490368u}/* 0535 */, /*1230*/{113792u,937427032u,327681u,76578817u,1507368u,3807903776u,1711347684u,138491904u,2490368u}/* 0536 */, /*1231*/{113920u,939524184u,327681u,76578817u,1507368u,3807903776u,1711347692u,138491904u,2490368u}/* 0537 */, /*1232*/{114048u,941621336u,327681u,76578817u,1507368u,3807903776u,1711347700u,138491904u,2490368u}/* 0538 */, /*1233*/{114176u,943718488u,327681u,76578817u,1507368u,3807903776u,1711347708u,138491904u,2490368u}/* 0539 */, /*1234*/{114304u,945815640u,327681u,76578817u,1507368u,3807903776u,1711347716u,138491904u,2490368u}/* 053A */, /*1235*/{114432u,947912792u,327681u,76578817u,1507368u,3807903776u,1711347724u,138491904u,2490368u}/* 053B */, /*1236*/{114560u,950009944u,327681u,76578817u,1507368u,3807903776u,1711347732u,138491904u,2490368u}/* 053C */, /*1237*/{114688u,952107096u,327681u,76578817u,1507368u,3807903776u,1711347740u,138491904u,2490368u}/* 053D */, /*1238*/{114816u,954204248u,327681u,76578817u,1507368u,3807903776u,1711347748u,138491904u,2490368u}/* 053E */, /*1239*/{114944u,956301400u,327681u,76578817u,1507368u,3807903776u,1711347756u,138491904u,2490368u}/* 053F */, /*1240*/{115072u,958398552u,327681u,76578817u,1507368u,3807903776u,1711347764u,138491904u,2490368u}/* 0540 */, /*1241*/{115200u,960495704u,327681u,76578817u,1507368u,3807903776u,1711347772u,138491904u,2490368u}/* 0541 */, /*1242*/{115328u,962592856u,327681u,76578817u,1507368u,3807903776u,1711347780u,138491904u,2490368u}/* 0542 */, /*1243*/{115456u,964690008u,327681u,76578817u,1507368u,3807903776u,1711347788u,138491904u,2490368u}/* 0543 */, /*1244*/{115584u,966787160u,327681u,76578817u,1507368u,3807903776u,1711347796u,138491904u,2490368u}/* 0544 */, /*1245*/{115712u,968884312u,327681u,76578817u,1507368u,3807903776u,1711347804u,138491904u,2490368u}/* 0545 */, /*1246*/{115840u,970981464u,327681u,76578817u,1507368u,3807903776u,1711347812u,138491904u,2490368u}/* 0546 */, /*1247*/{115968u,973078616u,327681u,76578817u,1507368u,3807903776u,1711347820u,138491904u,2490368u}/* 0547 */, /*1248*/{116096u,975175768u,327681u,76578817u,1507368u,3807903776u,1711347828u,138491904u,2490368u}/* 0548 */, /*1249*/{116224u,977272920u,327681u,76578817u,1507368u,3807903776u,1711347836u,138491904u,2490368u}/* 0549 */, /*1250*/{116352u,979370072u,327681u,76578817u,1507368u,3807903776u,1711347844u,138491904u,2490368u}/* 054A */, /*1251*/{116480u,981467224u,327681u,76578817u,1507368u,3807903776u,1711347852u,138491904u,2490368u}/* 054B */, /*1252*/{116608u,983564376u,327681u,76578817u,1507368u,3807903776u,1711347860u,138491904u,2490368u}/* 054C */, /*1253*/{116736u,985661528u,327681u,76578817u,1507368u,3807903776u,1711347868u,138491904u,2490368u}/* 054D */, /*1254*/{116864u,987758680u,327681u,76578817u,1507368u,3807903776u,1711347876u,138491904u,2490368u}/* 054E */, /*1255*/{116992u,989855832u,327681u,76578817u,1507368u,3807903776u,1711347884u,138491904u,2490368u}/* 054F */, /*1256*/{117120u,991952984u,327681u,76578817u,1507368u,3807903776u,1711347892u,138491904u,2490368u}/* 0550 */, /*1257*/{117248u,994050136u,327681u,76578817u,1507368u,3807903776u,1711347900u,138491904u,2490368u}/* 0551 */, /*1258*/{117376u,996147288u,327681u,76578817u,1507368u,3807903776u,1711347908u,138491904u,2490368u}/* 0552 */, /*1259*/{117504u,998244440u,327681u,76578817u,1507368u,3807903776u,1711347916u,138491904u,2490368u}/* 0553 */, /*1260*/{117632u,1000341592u,327681u,76578817u,1507368u,3807903776u,1711347924u,138491904u,2490368u}/* 0554 */, /*1261*/{117760u,1002438744u,327681u,76578817u,1507368u,3807903776u,1711347932u,138491904u,2490368u}/* 0555 */, /*1262*/{117888u,1004535896u,327681u,76578817u,1507368u,3807903776u,1711347940u,138491904u,2490368u}/* 0556 */, /*1263*/{0,88u,327681u,76578820u,1515560u,3774881824u,1677793516u,138442752u,393216u}/* 0559 */, /*1264*/{0,88u,327681u,76578839u,40u,1610612768u,7820u,138442754u,0}/* 055A */, /*1265*/{0,88u,327681u,76578839u,40u,1610612768u,7828u,138442754u,0}/* 055B */, /*1266*/{0,88u,327681u,76578839u,40u,1610612768u,4900u,138442754u,0}/* 055C */, /*1267*/{0,88u,327681u,76578839u,114728u,1610612768u,4412u,138442754u,0}/* 055D */, /*1268*/{0,88u,327681u,76578839u,40u,1610612768u,4956u,138442754u,0}/* 055E */, /*1269*/{0,88u,327681u,76578839u,40u,1610612768u,7836u,138442754u,0}/* 055F */, /*1270*/{118016u,88u,327681u,76578818u,1499176u,3768975392u,1719736252u,138442752u,393216u}/* 0561 */, /*1271*/{118144u,88u,327681u,76578818u,1499176u,3768975392u,1719736260u,138442752u,393216u}/* 0562 */, /*1272*/{118272u,88u,327681u,76578818u,1499176u,3768975392u,1719736268u,138442752u,393216u}/* 0563 */, /*1273*/{118400u,88u,327681u,76578818u,1499176u,3768975392u,1719736276u,138442752u,393216u}/* 0564 */, /*1274*/{118528u,88u,327681u,76578818u,1499176u,3768975392u,1719736284u,138442752u,393216u}/* 0565 */, /*1275*/{118656u,88u,327681u,76578818u,1499176u,3768975392u,1719736292u,138442752u,393216u}/* 0566 */, /*1276*/{118784u,88u,327681u,76578818u,1499176u,3768975392u,1719736300u,138442752u,393216u}/* 0567 */, /*1277*/{118912u,88u,327681u,76578818u,1499176u,3768975392u,1719736308u,138442752u,393216u}/* 0568 */, /*1278*/{119040u,88u,327681u,76578818u,1499176u,3768975392u,1719736316u,138442752u,393216u}/* 0569 */, /*1279*/{119168u,88u,327681u,76578818u,1499176u,3768975392u,1719736324u,138442752u,393216u}/* 056A */, /*1280*/{119296u,88u,327681u,76578818u,1499176u,3768975392u,1719736332u,138442752u,393216u}/* 056B */, /*1281*/{119424u,88u,327681u,76578818u,1499176u,3768975392u,1719736340u,138442752u,393216u}/* 056C */, /*1282*/{119552u,88u,327681u,76578818u,1499176u,3768975392u,1719736348u,138442752u,393216u}/* 056D */, /*1283*/{119680u,88u,327681u,76578818u,1499176u,3768975392u,1719736356u,138442752u,393216u}/* 056E */, /*1284*/{119808u,88u,327681u,76578818u,1499176u,3768975392u,1719736364u,138442752u,393216u}/* 056F */, /*1285*/{119936u,88u,327681u,76578818u,1499176u,3768975392u,1719736372u,138442752u,393216u}/* 0570 */, /*1286*/{120064u,88u,327681u,76578818u,1499176u,3768975392u,1719736380u,138442752u,393216u}/* 0571 */, /*1287*/{120192u,88u,327681u,76578818u,1499176u,3768975392u,1719736388u,138442752u,393216u}/* 0572 */, /*1288*/{120320u,88u,327681u,76578818u,1499176u,3768975392u,1719736396u,138442752u,393216u}/* 0573 */, /*1289*/{120448u,88u,327681u,76578818u,1499176u,3768975392u,1719736404u,138442752u,393216u}/* 0574 */, /*1290*/{120576u,88u,327681u,76578818u,1499176u,3768975392u,1719736412u,138442752u,393216u}/* 0575 */, /*1291*/{120704u,88u,327681u,76578818u,1499176u,3768975392u,1719736420u,138442752u,393216u}/* 0576 */, /*1292*/{120832u,88u,327681u,76578818u,1499176u,3768975392u,1719736428u,138442752u,393216u}/* 0577 */, /*1293*/{120960u,88u,327681u,76578818u,1499176u,3768975392u,1719736436u,138442752u,393216u}/* 0578 */, /*1294*/{121088u,88u,327681u,76578818u,1499176u,3768975392u,1719736444u,138442752u,393216u}/* 0579 */, /*1295*/{121216u,88u,327681u,76578818u,1499176u,3768975392u,1719736452u,138442752u,393216u}/* 057A */, /*1296*/{121344u,88u,327681u,76578818u,1499176u,3768975392u,1719736460u,138442752u,393216u}/* 057B */, /*1297*/{121472u,88u,327681u,76578818u,1499176u,3768975392u,1719736468u,138442752u,393216u}/* 057C */, /*1298*/{121600u,88u,327681u,76578818u,1499176u,3768975392u,1719736476u,138442752u,393216u}/* 057D */, /*1299*/{121728u,88u,327681u,76578818u,1499176u,3768975392u,1719736484u,138442752u,393216u}/* 057E */, /*1300*/{121856u,88u,327681u,76578818u,1499176u,3768975392u,1719736492u,138442752u,393216u}/* 057F */, /*1301*/{121984u,88u,327681u,76578818u,1499176u,3768975392u,1719736500u,138442752u,393216u}/* 0580 */, /*1302*/{122112u,88u,327681u,76578818u,1499176u,3768975392u,1719736508u,138442752u,393216u}/* 0581 */, /*1303*/{122240u,88u,327681u,76578818u,1499176u,3768975392u,1719736516u,138442752u,393216u}/* 0582 */, /*1304*/{122368u,88u,327681u,76578818u,1499176u,3768975392u,1719736524u,138442752u,393216u}/* 0583 */, /*1305*/{122496u,88u,327681u,76578818u,1499176u,3768975392u,1719736532u,138442752u,393216u}/* 0584 */, /*1306*/{122624u,88u,327681u,76578818u,1499176u,3768975392u,1719736540u,138442752u,393216u}/* 0585 */, /*1307*/{122752u,88u,327681u,76578818u,1499176u,3768975392u,1719736548u,138442752u,393216u}/* 0586 */, /*1308*/{209715200u,14680152u,327721u,76578882u,1499168u,3773693984u,1719808148u,272707584u,393216u}/* 0587 */, /*1309*/{0,88u,65537u,81821719u,1802280u,1610612768u,4580u,138442754u,41943040u}/* 0589 */, /*1310*/{0,88u,327681u,69347347u,40u,1610678306u,4220u,138442754u,0}/* 058A */, /*1311*/{0,88u,327681u,77080603u,40u,1610612768u,10364u,138442752u,67108864u}/* 058D */, /*1312*/{0,88u,327681u,77080603u,40u,1610612768u,10372u,138442752u,67108864u}/* 058E */, /*1313*/{0,88u,327681u,78024729u,40u,1610612768u,58332u,138442752u,67108864u}/* 058F */, /*1314*/{0,96u,393217u,3088134150u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* 0591 */, /*1315*/{0,96u,393217u,3423678470u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* 0592 */, /*1316*/{0,96u,393217u,3155243014u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* 059A */, /*1317*/{0,96u,393217u,3088330758u,672030728u,1627389968u,1077936140u,4208640u,262144u}/* 05A2 */, /*1318*/{0,96u,393217u,3356569606u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* 05AE */, /*1319*/{0,96u,393217u,403746822u,672030728u,3774881808u,1077936140u,348158464u,262144u}/* 05B0 */, /*1320*/{0,96u,393217u,470855686u,672030728u,3774881808u,1077936140u,352352768u,262144u}/* 05B1 */, /*1321*/{0,96u,393217u,537964550u,672030728u,3774881808u,1077936140u,356547072u,262144u}/* 05B2 */, /*1322*/{0,96u,393217u,605073414u,672030728u,3774881808u,1077936140u,360741376u,262144u}/* 05B3 */, /*1323*/{0,96u,393217u,672182278u,672030728u,3774881808u,1077936140u,364935680u,262144u}/* 05B4 */, /*1324*/{0,96u,393217u,739291142u,672030728u,3774881808u,1077936140u,369129984u,262144u}/* 05B5 */, /*1325*/{0,96u,393217u,806400006u,672030728u,3774881808u,1077936140u,373324288u,262144u}/* 05B6 */, /*1326*/{0,96u,393217u,873508870u,672030728u,3774881808u,1077936140u,377518592u,262144u}/* 05B7 */, /*1327*/{0,96u,393217u,940617734u,672030728u,3774881808u,1077936140u,381712896u,262144u}/* 05B8 */, /*1328*/{0,96u,393217u,1007726598u,672030728u,3774881808u,1077936140u,385907200u,262144u}/* 05B9 */, /*1329*/{0,96u,393217u,1007988742u,672030728u,3774881808u,1077936140u,385907200u,262144u}/* 05BA */, /*1330*/{0,96u,393217u,1074835462u,672030728u,3774881808u,1077936140u,390101504u,262144u}/* 05BB */, /*1331*/{0,96u,393217u,1141944326u,672030728u,3774881808u,1077936140u,402684416u,262144u}/* 05BC */, /*1332*/{0,96u,393217u,1209053190u,672030728u,3774881808u,1077936140u,4209152u,262144u}/* 05BD */, /*1333*/{0,96u,393217u,69239827u,40u,1610678304u,7844u,138442754u,0}/* 05BE */, /*1334*/{0,96u,393217u,1276162054u,672030728u,3774881808u,1077936140u,406878720u,262144u}/* 05BF */, /*1335*/{0,96u,393217u,76579863u,40u,1610612768u,7852u,138442754u,0}/* 05C0 */, /*1336*/{0,96u,393217u,1343270918u,672030728u,3774881808u,1077936140u,398490112u,262144u}/* 05C1 */, /*1337*/{0,96u,393217u,1410379782u,672030728u,3774881808u,1077936140u,394295808u,262144u}/* 05C2 */, /*1338*/{0,96u,393217u,76579863u,40u,1610612768u,7860u,138442754u,8388608u}/* 05C3 */, /*1339*/{0,96u,393217u,3423678470u,672030728u,3774881808u,1077936140u,4209152u,262144u}/* 05C4 */, /*1340*/{0,96u,393217u,3088330758u,672030728u,3774873616u,1077936140u,4209152u,262144u}/* 05C5 */, /*1341*/{0,96u,393217u,74712087u,40u,1610612768u,7868u,138442754u,0}/* 05C6 */, /*1342*/{0,96u,393217u,940847110u,672030728u,3774873616u,1077936140u,381712896u,262144u}/* 05C7 */, /*1343*/{0,96u,393217u,91259909u,466984u,3758096416u,1677793524u,138442752u,393216u}/* 05D0 */, /*1344*/{0,96u,393217u,91259909u,466984u,3758096416u,1677793532u,138442752u,393216u}/* 05D1 */, /*1345*/{0,96u,393217u,91259909u,466984u,3758096416u,1677793540u,138442752u,393216u}/* 05D2 */, /*1346*/{0,96u,393217u,91259909u,466984u,3758096416u,1677793548u,138442752u,393216u}/* 05D3 */, /*1347*/{0,96u,393217u,91259909u,466984u,3758096416u,1677793556u,138442752u,393216u}/* 05D4 */, /*1348*/{0,96u,393217u,91259909u,466984u,3758096416u,1677793564u,138442752u,393216u}/* 05D5 */, /*1349*/{0,96u,393217u,91259909u,466984u,3758096416u,1677793572u,138442752u,393216u}/* 05D6 */, /*1350*/{0,96u,393217u,91259909u,466984u,3758096416u,1677793580u,138442752u,393216u}/* 05D7 */, /*1351*/{0,96u,393217u,91259909u,466984u,3758096416u,1677793588u,138442752u,393216u}/* 05D8 */, /*1352*/{0,96u,393217u,91259909u,466984u,3758096416u,1677793596u,138442752u,393216u}/* 05D9 */, /*1353*/{0,96u,393217u,91259909u,466984u,3758096416u,1677793604u,138631168u,393216u}/* 05DA */, /*1354*/{0,96u,393217u,91259909u,466984u,3758096416u,1677793604u,138442752u,393216u}/* 05DB */, /*1355*/{0,96u,393217u,91259909u,466984u,3758096416u,1677793612u,138442752u,393216u}/* 05DC */, /*1356*/{0,96u,393217u,91259909u,466984u,3758096416u,1677793620u,138631168u,393216u}/* 05DD */, /*1357*/{0,96u,393217u,91259909u,466984u,3758096416u,1677793620u,138442752u,393216u}/* 05DE */, /*1358*/{0,96u,393217u,91259909u,466984u,3758096416u,1677793628u,138631168u,393216u}/* 05DF */, /*1359*/{0,96u,393217u,91259909u,466984u,3758096416u,1677793628u,138442752u,393216u}/* 05E0 */, /*1360*/{0,96u,393217u,91259909u,466984u,3758096416u,1677793636u,138442752u,393216u}/* 05E1 */, /*1361*/{0,96u,393217u,91259909u,466984u,3758096416u,1677793644u,138442752u,393216u}/* 05E2 */, /*1362*/{0,96u,393217u,91259909u,466984u,3758096416u,1677793652u,138631168u,393216u}/* 05E3 */, /*1363*/{0,96u,393217u,91259909u,466984u,3758096416u,1677793652u,138442752u,393216u}/* 05E4 */, /*1364*/{0,96u,393217u,91259909u,466984u,3758096416u,1677793660u,138631168u,393216u}/* 05E5 */, /*1365*/{0,96u,393217u,91259909u,466984u,3758096416u,1677793660u,138442752u,393216u}/* 05E6 */, /*1366*/{0,96u,393217u,91259909u,466984u,3758096416u,1677793668u,138442752u,393216u}/* 05E7 */, /*1367*/{0,96u,393217u,91259909u,466984u,3758096416u,1677793676u,138442752u,393216u}/* 05E8 */, /*1368*/{0,96u,393217u,91259909u,466984u,3758096416u,1677793684u,138442752u,393216u}/* 05E9 */, /*1369*/{0,96u,393217u,91259909u,466984u,3758096416u,1677793692u,138442752u,393216u}/* 05EA */, /*1370*/{0,96u,393217u,91259909u,466984u,3758096416u,1677865516u,272709632u,393216u}/* 05F0 */, /*1371*/{0,96u,393217u,91259909u,466984u,3758096416u,1677865548u,272709632u,393216u}/* 05F1 */, /*1372*/{0,96u,393217u,91259909u,466984u,3758096416u,1677865580u,272709632u,393216u}/* 05F2 */, /*1373*/{0,96u,393217u,76579863u,1515560u,1610612768u,7876u,138442754u,0}/* 05F3 */, /*1374*/{0,96u,393217u,76579863u,1572904u,1627389984u,7884u,138442754u,0}/* 05F4 */, /*1375*/{0u,104u,458753u,76780560u,135438344u,1694498816u,12u,4208640u,1073741824u}/* 0600 */, /*1376*/{0u,104u,458753u,76977168u,135438344u,1694498816u,12u,4208640u,1073741824u}/* 0604 */, /*1377*/{0u,104u,65537u,77075472u,135438344u,1694498816u,12u,4208640u,1073741824u}/* 0605 */, /*1378*/{0,104u,458753u,76883992u,40u,1610612768u,12838u,138442752u,67108864u}/* 0606 */, /*1379*/{0,104u,458753u,76883992u,40u,1610612768u,12854u,138442752u,67108864u}/* 0607 */, /*1380*/{0u,104u,458753u,76887064u,40u,1610612768u,10382u,138442752u,67108864u}/* 0608 */, /*1381*/{0,104u,458753u,78974999u,40u,1610612768u,7412u,138442754u,0}/* 0609 */, /*1382*/{0,104u,458753u,78974999u,40u,1610612768u,7428u,138442754u,0}/* 060A */, /*1383*/{0u,104u,458753u,78918681u,40u,1610612768u,58340u,138442752u,67108864u}/* 060B */, /*1384*/{0,104u,65537u,81827863u,1818664u,1610612768u,4420u,138442754u,8388608u}/* 060C */, /*1385*/{0,104u,458753u,82031639u,1818664u,1610612768u,4428u,138442754u,0}/* 060D */, /*1386*/{0,104u,458753u,76785691u,40u,1610612768u,10404u,138442752u,67108864u}/* 060E */, /*1387*/{0,104u,458753u,76785691u,40u,1610612768u,10412u,138442752u,67108864u}/* 060F */, /*1388*/{0,104u,458753u,3423842310u,672030728u,3774873616u,1077936140u,4209152u,262144u}/* 0610 */, /*1389*/{0,104u,458753u,3423940614u,672030728u,3774873616u,1077936140u,4209152u,262144u}/* 0616 */, /*1390*/{0,104u,458753u,1746219014u,672030728u,3774873616u,1077936140u,4209152u,262144u}/* 0618 */, /*1391*/{0,104u,458753u,1813327878u,672030728u,3774873616u,1077936140u,4209152u,262144u}/* 0619 */, /*1392*/{0,104u,458753u,1880436742u,672030728u,3774873616u,1077936140u,4209152u,262144u}/* 061A */, /*1393*/{0,104u,65537u,74494999u,40u,1610612768u,4532u,138442754u,8388608u}/* 061B */, /*1394*/{0,104u,458753u,68662288u,538091528u,1963491328u,12u,4208640u,0}/* 061C */, /*1395*/{0,104u,458753u,74724375u,40u,1610612768u,4588u,138442754u,0}/* 061E */, /*1396*/{0,104u,65537u,74494999u,98344u,1610612768u,4964u,138442754u,41943040u}/* 061F */, /*1397*/{1u,104u,458753u,76952581u,1515688u,3758096416u,1677795764u,138442752u,393216u}/* 0620 */, /*1398*/{0u,104u,458753u,76592133u,1515560u,3758096416u,1677794084u,138442752u,393216u}/* 0621 */, /*1399*/{210239490u,104u,458753u,76592165u,1515816u,3758096416u,1677794092u,138436608u,393216u}/* 0622 */, /*1400*/{210763778u,104u,458753u,76592165u,1515816u,3758096416u,1677794100u,138436608u,393216u}/* 0623 */, /*1401*/{211288067u,104u,458753u,76592165u,1515816u,3758096416u,1677794124u,138436608u,393216u}/* 0624 */, /*1402*/{211812354u,104u,458753u,76592165u,1515816u,3758096416u,1677794132u,138436608u,393216u}/* 0625 */, /*1403*/{212336641u,104u,458753u,76592165u,1515688u,3758096416u,1677794164u,138436608u,393216u}/* 0626 */, /*1404*/{2u,104u,458753u,76592133u,1515816u,3758096416u,1677794192u,138442752u,393216u}/* 0627 */, /*1405*/{4u,104u,458753u,76592133u,1515688u,3758096416u,1677794212u,138442752u,393216u}/* 0628 */, /*1406*/{5u,104u,458753u,76592133u,1515816u,3758096416u,1677794332u,138442752u,393216u}/* 0629 */, /*1407*/{4u,104u,458753u,76592133u,1515688u,3758096416u,1677794340u,138442752u,393216u}/* 062A */, /*1408*/{4u,104u,458753u,76592133u,1515688u,3758096416u,1677794348u,138442752u,393216u}/* 062B */, /*1409*/{6u,104u,458753u,76592133u,1515688u,3758096416u,1677794404u,138442752u,393216u}/* 062C */, /*1410*/{6u,104u,458753u,76592133u,1515688u,3758096416u,1677794460u,138442752u,393216u}/* 062D */, /*1411*/{6u,104u,458753u,76592133u,1515688u,3758096416u,1677794468u,138442752u,393216u}/* 062E */, /*1412*/{7u,104u,458753u,76592133u,1515816u,3758096416u,1677794548u,138442752u,393216u}/* 062F */, /*1413*/{7u,104u,458753u,76592133u,1515816u,3758096416u,1677794556u,138442752u,393216u}/* 0630 */, /*1414*/{8u,104u,458753u,76592133u,1515816u,3758096416u,1677794668u,138442752u,393216u}/* 0631 */, /*1415*/{8u,104u,458753u,76592133u,1515816u,3758096416u,1677794676u,138442752u,393216u}/* 0632 */, /*1416*/{9u,104u,458753u,76592133u,1515688u,3758096416u,1677794820u,138442752u,393216u}/* 0633 */, /*1417*/{9u,104u,458753u,76592133u,1515688u,3758096416u,1677794828u,138442752u,393216u}/* 0634 */, /*1418*/{10u,104u,458753u,76592133u,1515688u,3758096416u,1677794908u,138442752u,393216u}/* 0635 */, /*1419*/{10u,104u,458753u,76592133u,1515688u,3758096416u,1677794916u,138442752u,393216u}/* 0636 */, /*1420*/{11u,104u,458753u,76592133u,1515688u,3758096416u,1677794956u,138442752u,393216u}/* 0637 */, /*1421*/{11u,104u,458753u,76592133u,1515688u,3758096416u,1677794964u,138442752u,393216u}/* 0638 */, /*1422*/{12u,104u,458753u,76592133u,1515688u,3758096416u,1677794988u,138442752u,393216u}/* 0639 */, /*1423*/{12u,104u,458753u,76592133u,1515688u,3758096416u,1677794996u,138442752u,393216u}/* 063A */, /*1424*/{13u,104u,458753u,76887045u,1515688u,3758096416u,1677795324u,138442752u,393216u}/* 063B */, /*1425*/{13u,104u,458753u,76887045u,1515688u,3758096416u,1677795332u,138442752u,393216u}/* 063C */, /*1426*/{14u,104u,458753u,76887045u,1515688u,3758096416u,1677795740u,138442752u,393216u}/* 063D */, /*1427*/{14u,104u,458753u,76887045u,1515688u,3758096416u,1677795748u,138442752u,393216u}/* 063E */, /*1428*/{14u,104u,458753u,76887045u,1515688u,3758096416u,1677795756u,138442752u,393216u}/* 063F */, /*1429*/{0u,104u,65537u,76592132u,1515944u,3774873760u,1677721612u,4208640u,393216u}/* 0640 */, /*1430*/{15u,104u,458753u,76592133u,1515688u,3758096416u,1677795052u,138442752u,393216u}/* 0641 */, /*1431*/{16u,104u,458753u,76592133u,1515688u,3758096416u,1677795148u,138442752u,393216u}/* 0642 */, /*1432*/{17u,104u,458753u,76592133u,1515688u,3758096416u,1677795188u,138442752u,393216u}/* 0643 */, /*1433*/{18u,104u,458753u,76592133u,1515688u,3758096416u,1677795356u,138442752u,393216u}/* 0644 */, /*1434*/{19u,104u,458753u,76592133u,1515688u,3758096416u,1677795412u,138442752u,393216u}/* 0645 */, /*1435*/{20u,104u,458753u,76592133u,1515688u,3758096416u,1677795444u,138442752u,393216u}/* 0646 */, /*1436*/{21u,104u,458753u,76592133u,1515688u,3758096416u,1677795524u,138442752u,393216u}/* 0647 */, /*1437*/{3u,104u,458753u,76592133u,1515816u,3758096416u,1677795568u,138442752u,393216u}/* 0648 */, /*1438*/{1u,104u,458753u,76592133u,1515688u,3758096416u,1677795684u,138442752u,393216u}/* 0649 */, /*1439*/{1u,104u,458753u,76592133u,1515688u,3758096416u,1677795688u,138442752u,393216u}/* 064A */, /*1440*/{0,104u,2686977u,1544597510u,672030728u,3774881808u,1077936140u,461404672u,262144u}/* 064B */, /*1441*/{0,104u,2686977u,1611706374u,672030728u,3774881808u,1077936140u,473987584u,262144u}/* 064C */, /*1442*/{0,104u,2686977u,1678815238u,672030728u,3774881808u,1077936140u,486570496u,262144u}/* 064D */, /*1443*/{0,104u,2686977u,1745924102u,672030728u,3774881808u,1077936140u,499153408u,262144u}/* 064E */, /*1444*/{0,104u,2686977u,1813032966u,672030728u,3774881808u,1077936140u,515930624u,262144u}/* 064F */, /*1445*/{0,104u,2686977u,1880141830u,672030728u,3774881808u,1077936140u,528513536u,262144u}/* 0650 */, /*1446*/{0,104u,2686977u,1947250694u,672030728u,3774881808u,1077936140u,541096448u,262144u}/* 0651 */, /*1447*/{0,104u,2686977u,2014359558u,672030728u,3774881808u,1077936140u,545290752u,262144u}/* 0652 */, /*1448*/{0,104u,2686978u,3423744006u,672030736u,3774873616u,1077936140u,549485056u,262144u}/* 0653 */, /*1449*/{0,104u,2686978u,3423744006u,672030736u,3774873616u,1077936140u,553679360u,262144u}/* 0654 */, /*1450*/{0,104u,2686978u,3088199686u,672030736u,3774873616u,1077936140u,557873664u,262144u}/* 0655 */, /*1451*/{0,104u,458753u,3088297990u,672030728u,3774873616u,1077936140u,566262272u,262144u}/* 0656 */, /*1452*/{0,104u,458753u,3423842310u,672030728u,3774881808u,1077936140u,570456576u,262144u}/* 0657 */, /*1453*/{0,104u,458753u,3423842310u,672030728u,1627398160u,1077936140u,574650368u,262144u}/* 0658 */, /*1454*/{0,104u,458753u,3423875078u,672030728u,3774873616u,1077936140u,583039488u,262144u}/* 0659 */, /*1455*/{0,104u,458753u,3423875078u,672030728u,3774873616u,1077936140u,587233792u,262144u}/* 065A */, /*1456*/{0,104u,458753u,3423875078u,672030728u,3774873616u,1077936140u,591428096u,262144u}/* 065B */, /*1457*/{0,104u,458753u,3088330758u,672030728u,3774873616u,1077936140u,595622400u,262144u}/* 065C */, /*1458*/{0,104u,458753u,3423875078u,672030728u,3774873616u,1077936140u,599816704u,262144u}/* 065D */, /*1459*/{0,104u,458753u,3423875078u,672030728u,3774873616u,1077936140u,604011008u,262144u}/* 065E */, /*1460*/{0,104u,458753u,3088461830u,672030728u,3774873616u,1077936140u,562067968u,262144u}/* 065F */, /*1461*/{0,104u,34014209u,84972553u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 0660 */, /*1462*/{0,104u,537331201u,84972553u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 0661 */, /*1463*/{0,104u,570886657u,84972553u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 0662 */, /*1464*/{0,104u,604440577u,84972553u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 0663 */, /*1465*/{0,104u,637997057u,84972553u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 0664 */, /*1466*/{0,104u,671550465u,84972553u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 0665 */, /*1467*/{0,104u,705107457u,84972553u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 0666 */, /*1468*/{0,104u,738659841u,84972553u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 0667 */, /*1469*/{0,104u,772217857u,84972553u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 0668 */, /*1470*/{0,104u,805770241u,84972553u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 0669 */, /*1471*/{0,104u,458753u,78680087u,40u,1610612768u,7396u,138442754u,0}/* 066A */, /*1472*/{0,104u,458753u,84972567u,2048040u,1610612768u,4436u,138442754u,0}/* 066B */, /*1473*/{0,104u,458753u,84972567u,1785896u,1610612768u,4444u,138442754u,0}/* 066C */, /*1474*/{0,104u,458753u,76592151u,40u,1610612768u,7332u,138442754u,0}/* 066D */, /*1475*/{4u,104u,458753u,76755973u,1515688u,3758096416u,1677794204u,138442752u,393216u}/* 066E */, /*1476*/{16u,104u,458753u,76755973u,1515688u,3758096416u,1677795140u,138442752u,393216u}/* 066F */, /*1477*/{0,104u,2686977u,2081468422u,672030728u,3774873616u,1077936140u,641759744u,262144u}/* 0670 */, /*1478*/{2u,104u,458753u,76592133u,1515816u,3758096416u,1677794116u,138442752u,393216u}/* 0671 */, /*1479*/{2u,104u,458753u,76592133u,1515816u,3758096416u,1677794108u,138442752u,393216u}/* 0672 */, /*1480*/{2u,104u,458753u,76592133u,1515816u,3758112800u,1677794140u,138442752u,393216u}/* 0673 */, /*1481*/{0u,104u,458753u,76592133u,1515560u,3758096416u,1677794084u,138459136u,393216u}/* 0674 */, /*1482*/{212860930u,104u,458753u,76592197u,1515808u,3758620704u,1677866668u,272707584u,393216u}/* 0675 */, /*1483*/{213385219u,104u,458753u,76592197u,1515808u,3758620704u,1677868044u,272707584u,393216u}/* 0676 */, /*1484*/{213909507u,104u,458753u,76592197u,1515808u,3758620704u,1677868076u,272707584u,393216u}/* 0677 */, /*1485*/{214433793u,104u,458753u,76592197u,1515680u,3758620704u,1677868164u,272707584u,393216u}/* 0678 */, /*1486*/{4u,104u,458753u,76592133u,1515688u,3758096416u,1677794356u,138442752u,393216u}/* 0679 */, /*1487*/{4u,104u,458753u,76592133u,1515688u,3758096416u,1677794364u,138442752u,393216u}/* 067A */, /*1488*/{4u,104u,458753u,76592133u,1515688u,3758096416u,1677794220u,138442752u,393216u}/* 067B */, /*1489*/{4u,104u,458753u,76592133u,1515688u,3758096416u,1677794372u,138442752u,393216u}/* 067C */, /*1490*/{4u,104u,458753u,76592133u,1515688u,3758096416u,1677794380u,138442752u,393216u}/* 067D */, /*1491*/{4u,104u,458753u,76592133u,1515688u,3758096416u,1677794228u,138442752u,393216u}/* 067E */, /*1492*/{4u,104u,458753u,76592133u,1515688u,3758096416u,1677794388u,138442752u,393216u}/* 067F */, /*1493*/{4u,104u,458753u,76592133u,1515688u,3758096416u,1677794236u,138442752u,393216u}/* 0680 */, /*1494*/{6u,104u,458753u,76592133u,1515688u,3758096416u,1677794476u,138442752u,393216u}/* 0681 */, /*1495*/{6u,104u,458753u,76592133u,1515688u,3758096416u,1677794484u,138442752u,393216u}/* 0682 */, /*1496*/{6u,104u,458753u,76592133u,1515688u,3758096416u,1677794412u,138442752u,393216u}/* 0683 */, /*1497*/{6u,104u,458753u,76592133u,1515688u,3758096416u,1677794420u,138442752u,393216u}/* 0684 */, /*1498*/{6u,104u,458753u,76592133u,1515688u,3758096416u,1677794492u,138442752u,393216u}/* 0685 */, /*1499*/{6u,104u,458753u,76592133u,1515688u,3758096416u,1677794428u,138442752u,393216u}/* 0686 */, /*1500*/{6u,104u,458753u,76592133u,1515688u,3758096416u,1677794444u,138442752u,393216u}/* 0687 */, /*1501*/{7u,104u,458753u,76592133u,1515816u,3758096416u,1677794564u,138442752u,393216u}/* 0688 */, /*1502*/{7u,104u,458753u,76592133u,1515816u,3758096416u,1677794572u,138442752u,393216u}/* 0689 */, /*1503*/{7u,104u,458753u,76592133u,1515816u,3758096416u,1677794580u,138442752u,393216u}/* 068A */, /*1504*/{7u,104u,458753u,76592133u,1515816u,3758096416u,1677794588u,138442752u,393216u}/* 068B */, /*1505*/{7u,104u,458753u,76592133u,1515816u,3758096416u,1677794596u,138442752u,393216u}/* 068C */, /*1506*/{7u,104u,458753u,76592133u,1515816u,3758096416u,1677794604u,138442752u,393216u}/* 068D */, /*1507*/{7u,104u,458753u,76592133u,1515816u,3758096416u,1677794620u,138442752u,393216u}/* 068E */, /*1508*/{7u,104u,458753u,76592133u,1515816u,3758096416u,1677794628u,138442752u,393216u}/* 068F */, /*1509*/{7u,104u,458753u,76592133u,1515816u,3758096416u,1677794636u,138442752u,393216u}/* 0690 */, /*1510*/{8u,104u,458753u,76592133u,1515816u,3758096416u,1677794684u,138442752u,393216u}/* 0691 */, /*1511*/{8u,104u,458753u,76592133u,1515816u,3758096416u,1677794692u,138442752u,393216u}/* 0692 */, /*1512*/{8u,104u,458753u,76592133u,1515816u,3758096416u,1677794700u,138442752u,393216u}/* 0693 */, /*1513*/{8u,104u,458753u,76592133u,1515816u,3758096416u,1677794708u,138442752u,393216u}/* 0694 */, /*1514*/{8u,104u,458753u,76592133u,1515816u,3758096416u,1677794716u,138442752u,393216u}/* 0695 */, /*1515*/{8u,104u,458753u,76592133u,1515816u,3758096416u,1677794724u,138442752u,393216u}/* 0696 */, /*1516*/{8u,104u,458753u,76592133u,1515816u,3758096416u,1677794732u,138442752u,393216u}/* 0697 */, /*1517*/{8u,104u,458753u,76592133u,1515816u,3758096416u,1677794740u,138442752u,393216u}/* 0698 */, /*1518*/{8u,104u,458753u,76592133u,1515816u,3758096416u,1677794748u,138442752u,393216u}/* 0699 */, /*1519*/{9u,104u,458753u,76592133u,1515688u,3758096416u,1677794836u,138442752u,393216u}/* 069A */, /*1520*/{9u,104u,458753u,76592133u,1515688u,3758096416u,1677794844u,138442752u,393216u}/* 069B */, /*1521*/{9u,104u,458753u,76592133u,1515688u,3758096416u,1677794852u,138442752u,393216u}/* 069C */, /*1522*/{10u,104u,458753u,76592133u,1515688u,3758096416u,1677794924u,138442752u,393216u}/* 069D */, /*1523*/{10u,104u,458753u,76592133u,1515688u,3758096416u,1677794940u,138442752u,393216u}/* 069E */, /*1524*/{11u,104u,458753u,76592133u,1515688u,3758096416u,1677794972u,138442752u,393216u}/* 069F */, /*1525*/{12u,104u,458753u,76592133u,1515688u,3758096416u,1677795004u,138442752u,393216u}/* 06A0 */, /*1526*/{15u,104u,458753u,76592133u,1515688u,3758096416u,1677795060u,138442752u,393216u}/* 06A1 */, /*1527*/{15u,104u,458753u,76592133u,1515688u,3758096416u,1677795068u,138442752u,393216u}/* 06A2 */, /*1528*/{15u,104u,458753u,76592133u,1515688u,3758096416u,1677795084u,138442752u,393216u}/* 06A3 */, /*1529*/{15u,104u,458753u,76592133u,1515688u,3758096416u,1677795092u,138442752u,393216u}/* 06A4 */, /*1530*/{15u,104u,458753u,76592133u,1515688u,3758096416u,1677795108u,138442752u,393216u}/* 06A5 */, /*1531*/{15u,104u,458753u,76592133u,1515688u,3758096416u,1677795116u,138442752u,393216u}/* 06A6 */, /*1532*/{16u,104u,458753u,76592133u,1515688u,3758096416u,1677795156u,138442752u,393216u}/* 06A7 */, /*1533*/{16u,104u,458753u,76592133u,1515688u,3758096416u,1677795172u,138442752u,393216u}/* 06A8 */, /*1534*/{13u,104u,458753u,76592133u,1515688u,3758096416u,1677795196u,138442752u,393216u}/* 06A9 */, /*1535*/{22u,104u,458753u,76592133u,1515688u,3758096416u,1677795204u,138442752u,393216u}/* 06AA */, /*1536*/{13u,104u,458753u,76592133u,1515688u,3758096416u,1677795212u,138442752u,393216u}/* 06AB */, /*1537*/{17u,104u,458753u,76592133u,1515688u,3758096416u,1677795220u,138442752u,393216u}/* 06AC */, /*1538*/{17u,104u,458753u,76592133u,1515688u,3758096416u,1677795236u,138442752u,393216u}/* 06AD */, /*1539*/{17u,104u,458753u,76592133u,1515688u,3758096416u,1677795244u,138442752u,393216u}/* 06AE */, /*1540*/{13u,104u,458753u,76592133u,1515688u,3758096416u,1677795260u,138442752u,393216u}/* 06AF */, /*1541*/{13u,104u,458753u,76592133u,1515688u,3758096416u,1677795276u,138442752u,393216u}/* 06B0 */, /*1542*/{13u,104u,458753u,76592133u,1515688u,3758096416u,1677795284u,138442752u,393216u}/* 06B1 */, /*1543*/{13u,104u,458753u,76592133u,1515688u,3758096416u,1677795292u,138442752u,393216u}/* 06B2 */, /*1544*/{13u,104u,458753u,76592133u,1515688u,3758096416u,1677795300u,138442752u,393216u}/* 06B3 */, /*1545*/{13u,104u,458753u,76592133u,1515688u,3758096416u,1677795308u,138442752u,393216u}/* 06B4 */, /*1546*/{18u,104u,458753u,76592133u,1515688u,3758096416u,1677795364u,138442752u,393216u}/* 06B5 */, /*1547*/{18u,104u,458753u,76592133u,1515688u,3758096416u,1677795372u,138442752u,393216u}/* 06B6 */, /*1548*/{18u,104u,458753u,76592133u,1515688u,3758096416u,1677795380u,138442752u,393216u}/* 06B7 */, /*1549*/{18u,104u,458753u,76690437u,1515688u,3758096416u,1677795388u,138442752u,393216u}/* 06B8 */, /*1550*/{20u,104u,458753u,76690437u,1515688u,3758096416u,1677795492u,138442752u,393216u}/* 06B9 */, /*1551*/{20u,104u,458753u,76592133u,1515688u,3758096416u,1677795452u,138442752u,393216u}/* 06BA */, /*1552*/{20u,104u,458753u,76592133u,1515688u,3758096416u,1677795468u,138442752u,393216u}/* 06BB */, /*1553*/{20u,104u,458753u,76592133u,1515688u,3758096416u,1677795476u,138442752u,393216u}/* 06BC */, /*1554*/{23u,104u,458753u,76592133u,1515688u,3758096416u,1677795484u,138442752u,393216u}/* 06BD */, /*1555*/{24u,104u,458753u,76592133u,1515688u,3758096416u,1677795532u,138442752u,393216u}/* 06BE */, /*1556*/{6u,104u,458753u,76690437u,1515688u,3758096416u,1677794436u,138442752u,393216u}/* 06BF */, /*1557*/{214958085u,104u,458753u,76592165u,1515816u,3758096416u,1677795564u,687906816u,393216u}/* 06C0 */, /*1558*/{25u,104u,458753u,76592133u,1515688u,3758096416u,1677795540u,138442752u,393216u}/* 06C1 */, /*1559*/{215482393u,104u,458753u,76592165u,1515688u,3758096416u,1677795540u,687906816u,393216u}/* 06C2 */, /*1560*/{26u,104u,458753u,76592133u,1515816u,3758096416u,1677795548u,138442752u,393216u}/* 06C3 */, /*1561*/{3u,104u,458753u,76592133u,1515816u,3758096416u,1677795580u,138442752u,393216u}/* 06C4 */, /*1562*/{3u,104u,458753u,76592133u,1515816u,3758096416u,1677795588u,138442752u,393216u}/* 06C5 */, /*1563*/{3u,104u,458753u,76592133u,1515816u,3758096416u,1677795596u,138442752u,393216u}/* 06C6 */, /*1564*/{3u,104u,458753u,76592133u,1515816u,3758096416u,1677795604u,138442752u,393216u}/* 06C7 */, /*1565*/{3u,104u,458753u,76592133u,1515816u,3758096416u,1677795612u,138442752u,393216u}/* 06C8 */, /*1566*/{3u,104u,458753u,76592133u,1515816u,3758096416u,1677795620u,138442752u,393216u}/* 06C9 */, /*1567*/{3u,104u,458753u,76592133u,1515816u,3758096416u,1677795628u,138442752u,393216u}/* 06CA */, /*1568*/{3u,104u,458753u,76592133u,1515816u,3758096416u,1677795636u,138442752u,393216u}/* 06CB */, /*1569*/{14u,104u,458753u,76592133u,1515688u,3758096416u,1677795700u,138442752u,393216u}/* 06CC */, /*1570*/{27u,104u,458753u,76592133u,1515816u,3758096416u,1677795708u,138442752u,393216u}/* 06CD */, /*1571*/{14u,104u,458753u,76592133u,1515688u,3758096416u,1677795716u,138442752u,393216u}/* 06CE */, /*1572*/{3u,104u,458753u,76690437u,1515816u,3758096416u,1677795652u,138442752u,393216u}/* 06CF */, /*1573*/{1u,104u,458753u,76592133u,1515688u,3758096416u,1677795724u,138442752u,393216u}/* 06D0 */, /*1574*/{1u,104u,458753u,76592133u,1515688u,3758096416u,1677795732u,138442752u,393216u}/* 06D1 */, /*1575*/{28u,104u,458753u,76592133u,1515816u,3758096416u,1677795804u,138442752u,393216u}/* 06D2 */, /*1576*/{216006684u,104u,458753u,76592165u,1515816u,3758096416u,1677795804u,687906816u,393216u}/* 06D3 */, /*1577*/{0,104u,458753u,74494999u,98344u,1610612768u,5084u,138442754u,41943040u}/* 06D4 */, /*1578*/{5u,104u,458753u,76592133u,1515816u,3758096416u,1677795564u,138442752u,393216u}/* 06D5 */, /*1579*/{0,104u,458753u,3423645702u,672030728u,3774873616u,1077936140u,4209152u,262144u}/* 06D6 */, /*1580*/{0u,104u,65537u,76583952u,135438344u,1694498816u,12u,4208640u,1073741824u}/* 06DD */, /*1581*/{0,104u,458753u,76589083u,40u,1610612768u,10420u,138442752u,67108864u}/* 06DE */, /*1582*/{0,104u,458753u,3423645702u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* 06DF */, /*1583*/{0,104u,458753u,3088101382u,672030728u,3774873616u,1077936140u,4209152u,262144u}/* 06E3 */, /*1584*/{0,104u,458753u,76592132u,1515560u,3774881824u,1677795572u,138459136u,393216u}/* 06E5 */, /*1585*/{0,104u,458753u,76592132u,1515560u,3774881824u,1677795692u,138459136u,393216u}/* 06E6 */, /*1586*/{0,104u,458753u,76589083u,40u,1610612768u,10428u,138442752u,67108864u}/* 06E9 */, /*1587*/{0,104u,458753u,3088101382u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* 06EA */, /*1588*/{7u,104u,458753u,76788741u,1515816u,3758096416u,1677794644u,138442752u,393216u}/* 06EE */, /*1589*/{8u,104u,458753u,76788741u,1515816u,3758096416u,1677794756u,138442752u,393216u}/* 06EF */, /*1590*/{0,104u,34014209u,84969481u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 06F0 */, /*1591*/{0,104u,537331201u,84969481u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 06F1 */, /*1592*/{0,104u,570886657u,84969481u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 06F2 */, /*1593*/{0,104u,604440577u,84969481u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 06F3 */, /*1594*/{0,104u,637997057u,84969481u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 06F4 */, /*1595*/{0,104u,671550465u,84969481u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 06F5 */, /*1596*/{0,104u,705107457u,84969481u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 06F6 */, /*1597*/{0,104u,738659841u,84969481u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 06F7 */, /*1598*/{0,104u,772217857u,84969481u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 06F8 */, /*1599*/{0,104u,805770241u,84969481u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 06F9 */, /*1600*/{9u,104u,458753u,76690437u,1515688u,3758096416u,1677794860u,138442752u,393216u}/* 06FA */, /*1601*/{10u,104u,458753u,76690437u,1515688u,3758096416u,1677794948u,138442752u,393216u}/* 06FB */, /*1602*/{12u,104u,458753u,76690437u,1515688u,3758096416u,1677795012u,138442752u,393216u}/* 06FC */, /*1603*/{0,104u,458753u,76690459u,40u,1610612768u,72484u,1287731200u,67108864u}/* 06FD */, /*1604*/{0,104u,458753u,76690459u,40u,1610612768u,73812u,1287731200u,67108864u}/* 06FE */, /*1605*/{24u,104u,458753u,76788741u,1515688u,3758096416u,1677795556u,138442752u,393216u}/* 06FF */, /*1606*/{0,112u,524289u,76690455u,98344u,1610612768u,5684u,138442754u,41943040u}/* 0700 */, /*1607*/{0,112u,524289u,76690455u,98344u,1610612768u,5092u,138442754u,41943040u}/* 0701 */, /*1608*/{0,112u,524289u,76690455u,98344u,1610612768u,5100u,138442754u,41943040u}/* 0702 */, /*1609*/{0,112u,524289u,76690455u,40u,1610612768u,4596u,138442754u,8388608u}/* 0703 */, /*1610*/{0,112u,524289u,76690455u,40u,1610612768u,4604u,138442754u,8388608u}/* 0704 */, /*1611*/{0,112u,524289u,76690455u,40u,1610612768u,4612u,138442754u,8388608u}/* 0705 */, /*1612*/{0,112u,524289u,76690455u,40u,1610612768u,4620u,138442754u,8388608u}/* 0706 */, /*1613*/{0,112u,524289u,76690455u,40u,1610612768u,4628u,138442754u,8388608u}/* 0707 */, /*1614*/{0,112u,524289u,76690455u,40u,1610612768u,4636u,138442754u,8388608u}/* 0708 */, /*1615*/{0,112u,524289u,76690455u,40u,1610612768u,4972u,138442754u,8388608u}/* 0709 */, /*1616*/{0,112u,524289u,76690455u,40u,1610612768u,7892u,138442754u,8388608u}/* 070A */, /*1617*/{0,112u,524289u,76690455u,40u,1610612768u,7900u,138442754u,0}/* 070B */, /*1618*/{0,112u,524289u,76690455u,40u,1610612768u,7908u,138442754u,8388608u}/* 070C */, /*1619*/{0,112u,524289u,76690455u,40u,1610612768u,7916u,138442754u,0}/* 070D */, /*1620*/{0,112u,524289u,76690448u,135438344u,1694498816u,12u,4208640u,1073741824u}/* 070F */, /*1621*/{29u,112u,524289u,76690437u,1515816u,3758096416u,1677795828u,138442752u,393216u}/* 0710 */, /*1622*/{0,112u,524289u,2148675590u,672030728u,3774873616u,1077936140u,645954048u,262144u}/* 0711 */, /*1623*/{30u,112u,524289u,76690437u,1515688u,3758096416u,1677795836u,138442752u,393216u}/* 0712 */, /*1624*/{31u,112u,524289u,76690437u,1515688u,3758096416u,1677795844u,138442752u,393216u}/* 0713 */, /*1625*/{31u,112u,524289u,76690437u,1515688u,3758096416u,1677795844u,1287731200u,393216u}/* 0714 */, /*1626*/{32u,112u,524289u,76690437u,1515816u,3758096416u,1677795860u,138442752u,393216u}/* 0715 */, /*1627*/{32u,112u,524289u,76690437u,1515816u,3758096416u,1677795852u,138442752u,393216u}/* 0716 */, /*1628*/{33u,112u,524289u,76690437u,1515816u,3758096416u,1677795868u,138442752u,393216u}/* 0717 */, /*1629*/{34u,112u,524289u,76690437u,1515816u,3758096416u,1677795876u,138442752u,393216u}/* 0718 */, /*1630*/{35u,112u,524289u,76690437u,1515816u,3758096416u,1677795884u,138442752u,393216u}/* 0719 */, /*1631*/{36u,112u,524289u,76690437u,1515688u,3758096416u,1677795900u,138442752u,393216u}/* 071A */, /*1632*/{37u,112u,524289u,76690437u,1515688u,3758096416u,1677795908u,138442752u,393216u}/* 071B */, /*1633*/{37u,112u,524289u,76690437u,1515688u,3758096416u,1677795908u,1287731200u,393216u}/* 071C */, /*1634*/{38u,112u,524289u,76690437u,1515688u,3758096416u,1677795916u,138442752u,393216u}/* 071D */, /*1635*/{39u,112u,524289u,76690437u,1515816u,3758096416u,1677795924u,138442752u,393216u}/* 071E */, /*1636*/{40u,112u,524289u,76690437u,1515688u,3758096416u,1677795932u,138442752u,393216u}/* 071F */, /*1637*/{41u,112u,524289u,76690437u,1515688u,3758096416u,1677795948u,138442752u,393216u}/* 0720 */, /*1638*/{42u,112u,524289u,76690437u,1515688u,3758096416u,1677795956u,138442752u,393216u}/* 0721 */, /*1639*/{43u,112u,524289u,76690437u,1515688u,3758096416u,1677795964u,138442752u,393216u}/* 0722 */, /*1640*/{44u,112u,524289u,76690437u,1515688u,3758096416u,1677795972u,138442752u,393216u}/* 0723 */, /*1641*/{45u,112u,524289u,76690437u,1515688u,3758096416u,1677795972u,138631168u,393216u}/* 0724 */, /*1642*/{46u,112u,524289u,76690437u,1515688u,3758096416u,1677795980u,138442752u,393216u}/* 0725 */, /*1643*/{47u,112u,524289u,76690437u,1515688u,3758096416u,1677795988u,138442752u,393216u}/* 0726 */, /*1644*/{48u,112u,524289u,76690437u,1515688u,3758096416u,1677795988u,1287731200u,393216u}/* 0727 */, /*1645*/{49u,112u,524289u,76690437u,1515816u,3758096416u,1677796004u,138442752u,393216u}/* 0728 */, /*1646*/{50u,112u,524289u,76690437u,1515688u,3758096416u,1677796012u,138442752u,393216u}/* 0729 */, /*1647*/{32u,112u,524289u,76690437u,1515816u,3758096416u,1677796020u,138442752u,393216u}/* 072A */, /*1648*/{51u,112u,524289u,76690437u,1515688u,3758096416u,1677796028u,138442752u,393216u}/* 072B */, /*1649*/{52u,112u,524289u,76690437u,1515816u,3758096416u,1677796036u,138442752u,393216u}/* 072C */, /*1650*/{30u,112u,524289u,76788741u,1515688u,3758096416u,1677795836u,1291925504u,393216u}/* 072D */, /*1651*/{31u,112u,524289u,76788741u,1515688u,3758096416u,1677795844u,1291925504u,393216u}/* 072E */, /*1652*/{32u,112u,524289u,76788741u,1515816u,3758096416u,1677795860u,1291925504u,393216u}/* 072F */, /*1653*/{0,112u,524289u,3423744006u,672030728u,3774881808u,1077936140u,650148352u,262144u}/* 0730 */, /*1654*/{0,112u,524289u,3088199686u,672030728u,3774881808u,1077936140u,654342656u,262144u}/* 0731 */, /*1655*/{0,112u,524289u,3423744006u,672030728u,3774881808u,1077936140u,658536960u,262144u}/* 0732 */, /*1656*/{0,112u,524289u,3423744006u,672030728u,3774881808u,1077936140u,662731264u,262144u}/* 0733 */, /*1657*/{0,112u,524289u,3088199686u,672030728u,3774881808u,1077936140u,666925568u,262144u}/* 0734 */, /*1658*/{0,112u,524289u,3423744006u,672030728u,3774881808u,1077936140u,671119872u,262144u}/* 0735 */, /*1659*/{0,112u,524289u,3423744006u,672030728u,3774881808u,1077936140u,675314176u,262144u}/* 0736 */, /*1660*/{0,112u,524289u,3088199686u,672030728u,3774881808u,1077936140u,679508480u,262144u}/* 0737 */, /*1661*/{0,112u,524289u,3088199686u,672030728u,3774881808u,1077936140u,683702784u,262144u}/* 0738 */, /*1662*/{0,112u,524289u,3088199686u,672030728u,3774881808u,1077936140u,687897088u,262144u}/* 0739 */, /*1663*/{0,112u,524289u,3423744006u,672030728u,3774881808u,1077936140u,692091392u,262144u}/* 073A */, /*1664*/{0,112u,524289u,3088199686u,672030728u,3774881808u,1077936140u,696285696u,262144u}/* 073B */, /*1665*/{0,112u,524289u,3088199686u,672030728u,3774881808u,1077936140u,700480000u,262144u}/* 073C */, /*1666*/{0,112u,524289u,3423744006u,672030728u,3774881808u,1077936140u,704674304u,262144u}/* 073D */, /*1667*/{0,112u,524289u,3088199686u,672030728u,3774881808u,1077936140u,708868608u,262144u}/* 073E */, /*1668*/{0,112u,524289u,3423744006u,672030728u,3774881808u,1077936140u,713062912u,262144u}/* 073F */, /*1669*/{0,112u,524289u,3423744006u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* 0740 */, /*1670*/{0,112u,524289u,3423744006u,672030728u,1627398160u,1077936140u,218134528u,262144u}/* 0741 */, /*1671*/{0,112u,524289u,3088199686u,672030728u,1627398160u,1077936140u,222328832u,262144u}/* 0742 */, /*1672*/{0,112u,524289u,3088199686u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* 0744 */, /*1673*/{53u,112u,524289u,76788741u,1515816u,3758096416u,1677795892u,138442752u,393216u}/* 074D */, /*1674*/{54u,112u,524289u,76788741u,1515688u,3758096416u,1677795940u,138442752u,393216u}/* 074E */, /*1675*/{55u,112u,524289u,76788741u,1515688u,3758096416u,1677795996u,138442752u,393216u}/* 074F */, /*1676*/{4u,120u,458753u,76821509u,1515688u,3758096416u,1677794244u,138442752u,393216u}/* 0750 */, /*1677*/{4u,120u,458753u,76821509u,1515688u,3758096416u,1677794252u,138442752u,393216u}/* 0751 */, /*1678*/{4u,120u,458753u,76821509u,1515688u,3758096416u,1677794260u,138442752u,393216u}/* 0752 */, /*1679*/{4u,120u,458753u,76821509u,1515688u,3758096416u,1677794268u,138442752u,393216u}/* 0753 */, /*1680*/{4u,120u,458753u,76821509u,1515688u,3758096416u,1677794276u,138442752u,393216u}/* 0754 */, /*1681*/{4u,120u,458753u,76821509u,1515688u,3758096416u,1677794284u,138442752u,393216u}/* 0755 */, /*1682*/{4u,120u,458753u,76821509u,1515688u,3758096416u,1677794300u,138442752u,393216u}/* 0756 */, /*1683*/{6u,120u,458753u,76821509u,1515688u,3758096416u,1677794500u,138442752u,393216u}/* 0757 */, /*1684*/{6u,120u,458753u,76821509u,1515688u,3758096416u,1677794508u,138442752u,393216u}/* 0758 */, /*1685*/{7u,120u,458753u,76821509u,1515816u,3758096416u,1677794652u,138442752u,393216u}/* 0759 */, /*1686*/{7u,120u,458753u,76821509u,1515816u,3758096416u,1677794660u,138442752u,393216u}/* 075A */, /*1687*/{8u,120u,458753u,76821509u,1515816u,3758096416u,1677794764u,138442752u,393216u}/* 075B */, /*1688*/{9u,120u,458753u,76821509u,1515688u,3758096416u,1677794868u,138442752u,393216u}/* 075C */, /*1689*/{12u,120u,458753u,76821509u,1515688u,3758096416u,1677795020u,138442752u,393216u}/* 075D */, /*1690*/{12u,120u,458753u,76821509u,1515688u,3758096416u,1677795028u,138442752u,393216u}/* 075E */, /*1691*/{12u,120u,458753u,76821509u,1515688u,3758096416u,1677795036u,138442752u,393216u}/* 075F */, /*1692*/{15u,120u,458753u,76821509u,1515688u,3758096416u,1677795124u,138442752u,393216u}/* 0760 */, /*1693*/{15u,120u,458753u,76821509u,1515688u,3758096416u,1677795132u,138442752u,393216u}/* 0761 */, /*1694*/{13u,120u,458753u,76821509u,1515688u,3758096416u,1677795316u,138442752u,393216u}/* 0762 */, /*1695*/{13u,120u,458753u,76821509u,1515688u,3758096416u,1677795340u,138442752u,393216u}/* 0763 */, /*1696*/{13u,120u,458753u,76821509u,1515688u,3758096416u,1677795348u,138442752u,393216u}/* 0764 */, /*1697*/{19u,120u,458753u,76821509u,1515688u,3758096416u,1677795420u,138442752u,393216u}/* 0765 */, /*1698*/{19u,120u,458753u,76821509u,1515688u,3758096416u,1677795428u,138442752u,393216u}/* 0766 */, /*1699*/{20u,120u,458753u,76821509u,1515688u,3758096416u,1677795500u,138442752u,393216u}/* 0767 */, /*1700*/{20u,120u,458753u,76821509u,1515688u,3758096416u,1677795508u,138442752u,393216u}/* 0768 */, /*1701*/{20u,120u,458753u,76821509u,1515688u,3758096416u,1677795516u,138442752u,393216u}/* 0769 */, /*1702*/{18u,120u,458753u,76821509u,1515688u,3758096416u,1677795396u,138442752u,393216u}/* 076A */, /*1703*/{8u,120u,458753u,76821509u,1515816u,3758096416u,1677794772u,138442752u,393216u}/* 076B */, /*1704*/{8u,120u,458753u,76821509u,1515816u,3758096416u,1677794780u,138442752u,393216u}/* 076C */, /*1705*/{9u,120u,458753u,76821509u,1515688u,3758096416u,1677794876u,138442752u,393216u}/* 076D */, /*1706*/{6u,120u,458753u,76887045u,1515688u,3758096416u,1677794516u,138442752u,393216u}/* 076E */, /*1707*/{6u,120u,458753u,76887045u,1515688u,3758096416u,1677794524u,138442752u,393216u}/* 076F */, /*1708*/{9u,120u,458753u,76887045u,1515688u,3758096416u,1677794884u,138442752u,393216u}/* 0770 */, /*1709*/{8u,120u,458753u,76887045u,1515816u,3758096416u,1677794788u,138442752u,393216u}/* 0771 */, /*1710*/{6u,120u,458753u,76887045u,1515688u,3758096416u,1677794532u,138442752u,393216u}/* 0772 */, /*1711*/{2u,120u,458753u,76887045u,1515816u,3758096416u,1677794148u,138442752u,393216u}/* 0773 */, /*1712*/{2u,120u,458753u,76887045u,1515816u,3758096416u,1677794156u,138442752u,393216u}/* 0774 */, /*1713*/{14u,120u,458753u,76887045u,1515688u,3758096416u,1677795772u,138442752u,393216u}/* 0775 */, /*1714*/{14u,120u,458753u,76887045u,1515688u,3758096416u,1677795780u,138442752u,393216u}/* 0776 */, /*1715*/{1u,120u,458753u,76887045u,1515688u,3758096416u,1677795788u,138442752u,393216u}/* 0777 */, /*1716*/{3u,120u,458753u,76887045u,1515816u,3758096416u,1677795660u,138442752u,393216u}/* 0778 */, /*1717*/{3u,120u,458753u,76887045u,1515816u,3758096416u,1677795668u,138442752u,393216u}/* 0779 */, /*1718*/{56u,120u,458753u,76887045u,1515688u,3758096416u,1677795812u,138442752u,393216u}/* 077A */, /*1719*/{56u,120u,458753u,76887045u,1515688u,3758096416u,1677795820u,138442752u,393216u}/* 077B */, /*1720*/{6u,120u,458753u,76887045u,1515688u,3758096416u,1677794540u,138442752u,393216u}/* 077C */, /*1721*/{9u,120u,458753u,76887045u,1515688u,3758096416u,1677794892u,138442752u,393216u}/* 077D */, /*1722*/{9u,120u,458753u,76887045u,1515688u,3758096416u,1677794900u,138442752u,393216u}/* 077E */, /*1723*/{17u,120u,458753u,76887045u,1515688u,3758096416u,1677795228u,138442752u,393216u}/* 077F */, /*1724*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796332u,138442752u,393216u}/* 0780 */, /*1725*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796356u,138442752u,393216u}/* 0781 */, /*1726*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796364u,138442752u,393216u}/* 0782 */, /*1727*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796372u,138442752u,393216u}/* 0783 */, /*1728*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796388u,138442752u,393216u}/* 0784 */, /*1729*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796396u,138442752u,393216u}/* 0785 */, /*1730*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796404u,138442752u,393216u}/* 0786 */, /*1731*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796412u,138442752u,393216u}/* 0787 */, /*1732*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796436u,138442752u,393216u}/* 0788 */, /*1733*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796452u,138442752u,393216u}/* 0789 */, /*1734*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796460u,138442752u,393216u}/* 078A */, /*1735*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796468u,138442752u,393216u}/* 078B */, /*1736*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796484u,138442752u,393216u}/* 078C */, /*1737*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796516u,138442752u,393216u}/* 078D */, /*1738*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796524u,138442752u,393216u}/* 078E */, /*1739*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796540u,138442752u,393216u}/* 078F */, /*1740*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796548u,138442752u,393216u}/* 0790 */, /*1741*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796580u,138442752u,393216u}/* 0791 */, /*1742*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796588u,138442752u,393216u}/* 0792 */, /*1743*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796596u,138442752u,393216u}/* 0793 */, /*1744*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796604u,138442752u,393216u}/* 0794 */, /*1745*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796612u,138442752u,393216u}/* 0795 */, /*1746*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796620u,138442752u,393216u}/* 0796 */, /*1747*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796628u,138442752u,393216u}/* 0797 */, /*1748*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796492u,138442752u,393216u}/* 0798 */, /*1749*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796340u,138442752u,393216u}/* 0799 */, /*1750*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796348u,138442752u,393216u}/* 079A */, /*1751*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796476u,138442752u,393216u}/* 079B */, /*1752*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796380u,138442752u,393216u}/* 079C */, /*1753*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796556u,138442752u,393216u}/* 079D */, /*1754*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796564u,138442752u,393216u}/* 079E */, /*1755*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796572u,138442752u,393216u}/* 079F */, /*1756*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796500u,138442752u,393216u}/* 07A0 */, /*1757*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796508u,138442752u,393216u}/* 07A1 */, /*1758*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796420u,138442752u,393216u}/* 07A2 */, /*1759*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796428u,138442752u,393216u}/* 07A3 */, /*1760*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796532u,138442752u,393216u}/* 07A4 */, /*1761*/{0,128u,589825u,76690437u,1515560u,3758096416u,1677796444u,138442752u,393216u}/* 07A5 */, /*1762*/{0,128u,589825u,68300806u,672030728u,3774881808u,1078011172u,138443264u,262144u}/* 07A6 */, /*1763*/{0,128u,589825u,68300806u,672030728u,3774881808u,1078011180u,138443264u,262144u}/* 07A7 */, /*1764*/{0,128u,589825u,68300806u,672030728u,3774881808u,1078011188u,138443264u,262144u}/* 07A8 */, /*1765*/{0,128u,589825u,68300806u,672030728u,3774881808u,1078011196u,138443264u,262144u}/* 07A9 */, /*1766*/{0,128u,589825u,68300806u,672030728u,3774881808u,1078011204u,138443264u,262144u}/* 07AA */, /*1767*/{0,128u,589825u,68300806u,672030728u,3774881808u,1078011212u,138443264u,262144u}/* 07AB */, /*1768*/{0,128u,589825u,68300806u,672030728u,3774881808u,1078011220u,138443264u,262144u}/* 07AC */, /*1769*/{0,128u,589825u,68300806u,672030728u,3774881808u,1078011228u,138443264u,262144u}/* 07AD */, /*1770*/{0,128u,589825u,68300806u,672030728u,3774881808u,1078011236u,138443264u,262144u}/* 07AE */, /*1771*/{0,128u,589825u,68300806u,672030728u,3774881808u,1078011244u,138443264u,262144u}/* 07AF */, /*1772*/{0,128u,589825u,68300806u,672030728u,3774881808u,1078011252u,138443264u,262144u}/* 07B0 */, /*1773*/{0,128u,589825u,76755973u,1515560u,3758096416u,1677796636u,138442752u,393216u}/* 07B1 */, /*1774*/{0,136u,37880833u,85230601u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 07C0 */, /*1775*/{0,136u,541197825u,85230601u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 07C1 */, /*1776*/{0,136u,574753281u,85230601u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 07C2 */, /*1777*/{0,136u,608307201u,85230601u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 07C3 */, /*1778*/{0,136u,641863681u,85230601u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 07C4 */, /*1779*/{0,136u,675417089u,85230601u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 07C5 */, /*1780*/{0,136u,708974081u,85230601u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 07C6 */, /*1781*/{0,136u,742526465u,85230601u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 07C7 */, /*1782*/{0,136u,776084481u,85230601u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 07C8 */, /*1783*/{0,136u,809636865u,85230601u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 07C9 */, /*1784*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796732u,138442752u,393216u}/* 07CA */, /*1785*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796740u,138442752u,393216u}/* 07CB */, /*1786*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796748u,138442752u,393216u}/* 07CC */, /*1787*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796756u,138442752u,393216u}/* 07CD */, /*1788*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796764u,138442752u,393216u}/* 07CE */, /*1789*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796772u,138442752u,393216u}/* 07CF */, /*1790*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796780u,138442752u,393216u}/* 07D0 */, /*1791*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796788u,138442752u,393216u}/* 07D1 */, /*1792*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796796u,138442752u,393216u}/* 07D2 */, /*1793*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796804u,138442752u,393216u}/* 07D3 */, /*1794*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796812u,138442752u,393216u}/* 07D4 */, /*1795*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796820u,138442752u,393216u}/* 07D5 */, /*1796*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796828u,138442752u,393216u}/* 07D6 */, /*1797*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796836u,138442752u,393216u}/* 07D7 */, /*1798*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796844u,138442752u,393216u}/* 07D8 */, /*1799*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796852u,138442752u,393216u}/* 07D9 */, /*1800*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796860u,138442752u,393216u}/* 07DA */, /*1801*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796868u,138442752u,393216u}/* 07DB */, /*1802*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796876u,138442752u,393216u}/* 07DC */, /*1803*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796884u,138442752u,393216u}/* 07DD */, /*1804*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796892u,138442752u,393216u}/* 07DE */, /*1805*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796900u,138442752u,393216u}/* 07DF */, /*1806*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796908u,138442752u,393216u}/* 07E0 */, /*1807*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796916u,138442752u,393216u}/* 07E1 */, /*1808*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796924u,138442752u,393216u}/* 07E2 */, /*1809*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796932u,138442752u,393216u}/* 07E3 */, /*1810*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796940u,138442752u,393216u}/* 07E4 */, /*1811*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796948u,138442752u,393216u}/* 07E5 */, /*1812*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796956u,138442752u,393216u}/* 07E6 */, /*1813*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796964u,138442752u,393216u}/* 07E7 */, /*1814*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796828u,1283536896u,393216u}/* 07E8 */, /*1815*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796836u,1283536896u,393216u}/* 07E9 */, /*1816*/{0u,136u,4325377u,76841989u,1515688u,3758096416u,1677796852u,1283536896u,393216u}/* 07EA */, /*1817*/{0,136u,4325377u,3423907846u,672030728u,1627398160u,1077936140u,717256704u,262144u}/* 07EB */, /*1818*/{0,136u,4325377u,3423907846u,672030728u,1627398160u,1077936140u,721451008u,262144u}/* 07EC */, /*1819*/{0,136u,4325377u,3423907846u,672030728u,1627398160u,1077936140u,725645312u,262144u}/* 07ED */, /*1820*/{0,136u,4325377u,3423907846u,672030728u,1627398160u,1077936140u,729839616u,262144u}/* 07EE */, /*1821*/{0,136u,4325377u,3423907846u,672030728u,1627398160u,1077936140u,734033920u,262144u}/* 07EF */, /*1822*/{0,136u,4325377u,3423907846u,672030728u,1627398160u,1077936140u,738228224u,262144u}/* 07F0 */, /*1823*/{0,136u,4325377u,3423907846u,672030728u,1627398160u,1077936140u,742422528u,262144u}/* 07F1 */, /*1824*/{0,136u,4325377u,3088363526u,672030728u,1627398160u,1077936140u,746616832u,262144u}/* 07F2 */, /*1825*/{0,136u,4325377u,3423907846u,672030728u,1627398160u,1077936140u,750811136u,262144u}/* 07F3 */, /*1826*/{0,136u,4325377u,76841988u,1515560u,3774881824u,1677796972u,138442752u,393216u}/* 07F4 */, /*1827*/{0,136u,4325377u,76841988u,1515560u,3774881824u,1677796980u,138442752u,393216u}/* 07F5 */, /*1828*/{0,136u,4325377u,76851227u,40u,1610612768u,10572u,138442752u,67108864u}/* 07F6 */, /*1829*/{0,136u,4325377u,76851223u,40u,1610612768u,5692u,138442754u,0}/* 07F7 */, /*1830*/{0,136u,4325377u,82094103u,1818664u,1610612768u,4452u,138442754u,8388608u}/* 07F8 */, /*1831*/{0,136u,4325377u,74754071u,98344u,1610612768u,4908u,138442754u,41943040u}/* 07F9 */, /*1832*/{0u,136u,4325377u,76841988u,1515944u,3774873760u,1677721612u,4208640u,393216u}/* 07FA */, /*1833*/{0,144u,5373953u,76907525u,1515560u,3758096416u,1677793876u,138442752u,393216u}/* 0800 */, /*1834*/{0,144u,5373953u,76907525u,1515560u,3758096416u,1677793884u,138442752u,393216u}/* 0801 */, /*1835*/{0,144u,5373953u,76907525u,1515560u,3758096416u,1677793892u,138442752u,393216u}/* 0802 */, /*1836*/{0,144u,5373953u,76907525u,1515560u,3758096416u,1677793900u,138442752u,393216u}/* 0803 */, /*1837*/{0,144u,5373953u,76907525u,1515560u,3758096416u,1677793908u,138442752u,393216u}/* 0804 */, /*1838*/{0,144u,5373953u,76907525u,1515560u,3758096416u,1677793916u,138442752u,393216u}/* 0805 */, /*1839*/{0,144u,5373953u,76907525u,1515560u,3758096416u,1677793924u,138442752u,393216u}/* 0806 */, /*1840*/{0,144u,5373953u,76907525u,1515560u,3758096416u,1677793932u,138442752u,393216u}/* 0807 */, /*1841*/{0,144u,5373953u,76907525u,1515560u,3758096416u,1677793940u,138442752u,393216u}/* 0808 */, /*1842*/{0,144u,5373953u,76907525u,1515560u,3758096416u,1677793948u,138442752u,393216u}/* 0809 */, /*1843*/{0,144u,5373953u,76907525u,1515560u,3758096416u,1677793956u,138442752u,393216u}/* 080A */, /*1844*/{0,144u,5373953u,76907525u,1515560u,3758096416u,1677793964u,138442752u,393216u}/* 080B */, /*1845*/{0,144u,5373953u,76907525u,1515560u,3758096416u,1677793972u,138442752u,393216u}/* 080C */, /*1846*/{0,144u,5373953u,76907525u,1515560u,3758096416u,1677793980u,138442752u,393216u}/* 080D */, /*1847*/{0,144u,5373953u,76907525u,1515560u,3758096416u,1677793988u,138442752u,393216u}/* 080E */, /*1848*/{0,144u,5373953u,76907525u,1515560u,3758096416u,1677793996u,138442752u,393216u}/* 080F */, /*1849*/{0,144u,5373953u,76907525u,1515560u,3758096416u,1677794004u,138442752u,393216u}/* 0810 */, /*1850*/{0,144u,5373953u,76907525u,1515560u,3758096416u,1677794012u,138442752u,393216u}/* 0811 */, /*1851*/{0,144u,5373953u,76907525u,1515560u,3758096416u,1677794020u,138442752u,393216u}/* 0812 */, /*1852*/{0,144u,5373953u,76907525u,1515560u,3758096416u,1677794028u,138442752u,393216u}/* 0813 */, /*1853*/{0,144u,5373953u,76907525u,1515560u,3758096416u,1677794036u,138442752u,393216u}/* 0814 */, /*1854*/{0,144u,5373953u,76907525u,1515560u,3758096416u,1677794044u,138442752u,393216u}/* 0815 */, /*1855*/{0,144u,5373953u,3423973382u,672030728u,3774873616u,1078008580u,138443264u,262144u}/* 0816 */, /*1856*/{0,144u,5373953u,3423973382u,672030728u,3774873616u,1078008588u,138443264u,262144u}/* 0817 */, /*1857*/{0,144u,5373953u,3423973382u,672030728u,1627398160u,1077936140u,448821248u,262144u}/* 0818 */, /*1858*/{0,144u,5373953u,3423973382u,672030728u,1627398160u,1077936140u,453015552u,262144u}/* 0819 */, /*1859*/{0,144u,5373953u,76907524u,1515560u,3774873632u,1677794068u,138442752u,393216u}/* 081A */, /*1860*/{0,144u,5373953u,3423973382u,672030728u,3774873616u,1078008604u,138443264u,262144u}/* 081B */, /*1861*/{0,144u,5373953u,3423973382u,672030728u,3774873616u,1077936140u,415267328u,262144u}/* 081C */, /*1862*/{0,144u,5373953u,3423973382u,672030728u,3774873616u,1077936140u,419461632u,262144u}/* 081E */, /*1863*/{0,144u,5373953u,3423973382u,672030728u,3774873616u,1077936140u,423655936u,262144u}/* 0821 */, /*1864*/{0,144u,5373953u,76907524u,1515560u,3774873632u,1677721612u,427849728u,393216u}/* 0824 */, /*1865*/{0,144u,5373953u,3423973382u,672030728u,3774873616u,1077936140u,427850240u,262144u}/* 0825 */, /*1866*/{0,144u,5373953u,3423973382u,672030728u,3774873616u,1077936140u,432044544u,262144u}/* 0826 */, /*1867*/{0,144u,5373953u,76907524u,1515560u,3774873632u,1677721612u,436238336u,393216u}/* 0828 */, /*1868*/{0,144u,5373953u,3423973382u,672030728u,3774873616u,1077936140u,436238848u,262144u}/* 0829 */, /*1869*/{0,144u,5373953u,3423973382u,672030728u,3774873616u,1077936140u,440433152u,262144u}/* 082B */, /*1870*/{0,144u,5373953u,3423973382u,672030728u,3774873616u,1077936140u,444627456u,262144u}/* 082C */, /*1871*/{0,144u,5373953u,3423973382u,672030728u,1627389968u,1077936140u,457209856u,262144u}/* 082D */, /*1872*/{0,144u,5373953u,76907543u,40u,1610612768u,4644u,138442754u,8388608u}/* 0830 */, /*1873*/{0,144u,5373953u,76907543u,40u,1610612768u,4652u,138442754u,8388608u}/* 0831 */, /*1874*/{0,144u,5373953u,76907543u,40u,1610612768u,4660u,138442754u,8388608u}/* 0832 */, /*1875*/{0,144u,5373953u,76907543u,40u,1610612768u,4668u,138442754u,8388608u}/* 0833 */, /*1876*/{0,144u,5373953u,76907543u,40u,1610612768u,4676u,138442754u,8388608u}/* 0834 */, /*1877*/{0,144u,5373953u,76907543u,40u,1610612768u,4684u,138442754u,8388608u}/* 0835 */, /*1878*/{0,144u,5373953u,76907543u,40u,1610612768u,4692u,138442754u,8388608u}/* 0836 */, /*1879*/{0,144u,5373953u,76907543u,40u,1610612768u,4700u,138442754u,8388608u}/* 0837 */, /*1880*/{0,144u,5373953u,76907543u,40u,1610612768u,4708u,138442754u,8388608u}/* 0838 */, /*1881*/{0,144u,5373953u,76907543u,40u,1610612768u,4716u,138442754u,8388608u}/* 0839 */, /*1882*/{0,144u,5373953u,76907543u,40u,1610612768u,4724u,138442754u,8388608u}/* 083A */, /*1883*/{0,144u,5373953u,76907543u,40u,1610612768u,4732u,138442754u,8388608u}/* 083B */, /*1884*/{0,144u,5373953u,76907543u,40u,1610612768u,4740u,138442754u,8388608u}/* 083C */, /*1885*/{0,144u,5373953u,76907543u,40u,1610612768u,4748u,138442754u,8388608u}/* 083D */, /*1886*/{0,144u,5373953u,76907543u,40u,1610612768u,4756u,138442754u,8388608u}/* 083E */, /*1887*/{0u,152u,6225921u,76940293u,1515816u,3758096416u,1677796132u,138442752u,393216u}/* 0840 */, /*1888*/{0u,152u,6225921u,76940293u,1515688u,3758096416u,1677796140u,138442752u,393216u}/* 0841 */, /*1889*/{0u,152u,6225921u,76940293u,1515688u,3758096416u,1677796148u,138442752u,393216u}/* 0842 */, /*1890*/{0u,152u,6225921u,76940293u,1515688u,3758096416u,1677796156u,138442752u,393216u}/* 0843 */, /*1891*/{0u,152u,6225921u,76940293u,1515688u,3758096416u,1677796164u,138442752u,393216u}/* 0844 */, /*1892*/{0u,152u,6225921u,76940293u,1515688u,3758096416u,1677796172u,138442752u,393216u}/* 0845 */, /*1893*/{0u,152u,6225921u,76940293u,1515816u,3758096416u,1677796180u,138442752u,393216u}/* 0846 */, /*1894*/{0u,152u,6225921u,76940293u,1515816u,3758096416u,1677796188u,138442752u,393216u}/* 0847 */, /*1895*/{0u,152u,6225921u,76940293u,1515688u,3758096416u,1677796196u,138442752u,393216u}/* 0848 */, /*1896*/{0u,152u,6225921u,76940293u,1515816u,3758096416u,1677796204u,138442752u,393216u}/* 0849 */, /*1897*/{0u,152u,6225921u,76940293u,1515688u,3758096416u,1677796212u,138442752u,393216u}/* 084A */, /*1898*/{0u,152u,6225921u,76940293u,1515688u,3758096416u,1677796220u,138442752u,393216u}/* 084B */, /*1899*/{0u,152u,6225921u,76940293u,1515688u,3758096416u,1677796228u,138442752u,393216u}/* 084C */, /*1900*/{0u,152u,6225921u,76940293u,1515688u,3758096416u,1677796236u,138442752u,393216u}/* 084D */, /*1901*/{0u,152u,6225921u,76940293u,1515688u,3758096416u,1677796244u,138442752u,393216u}/* 084E */, /*1902*/{0u,152u,6225921u,76940293u,1515688u,3758096416u,1677796252u,138442752u,393216u}/* 084F */, /*1903*/{0u,152u,6225921u,76940293u,1515688u,3758096416u,1677796260u,138442752u,393216u}/* 0850 */, /*1904*/{0u,152u,6225921u,76940293u,1515688u,3758096416u,1677796268u,138442752u,393216u}/* 0851 */, /*1905*/{0u,152u,6225921u,76940293u,1515688u,3758096416u,1677796276u,138442752u,393216u}/* 0852 */, /*1906*/{0u,152u,6225921u,76940293u,1515688u,3758096416u,1677796284u,138442752u,393216u}/* 0853 */, /*1907*/{0u,152u,6225921u,76940293u,1515816u,3758096416u,1677796292u,138442752u,393216u}/* 0854 */, /*1908*/{0u,152u,6225921u,76940293u,1515688u,3758096416u,1677796300u,138442752u,393216u}/* 0855 */, /*1909*/{0u,152u,6225921u,76940293u,1515560u,3758096416u,1677796308u,138442752u,393216u}/* 0856 */, /*1910*/{0u,152u,6225921u,76940293u,1515560u,3758096416u,1677796316u,138442752u,393216u}/* 0857 */, /*1911*/{0u,152u,6225921u,76940293u,1515560u,3758096416u,1677796324u,138442752u,393216u}/* 0858 */, /*1912*/{0,152u,6225921u,3088461830u,672030728u,1627389968u,1077936140u,222328832u,262144u}/* 0859 */, /*1913*/{0,152u,6225921u,76940311u,40u,1610612768u,7924u,138442754u,8388608u}/* 085E */, /*1914*/{57u,160u,524289u,77181957u,1515688u,3758096416u,1677796044u,138442752u,393216u}/* 0860 */, /*1915*/{58u,160u,524289u,77181957u,1515560u,3758096416u,1677796052u,138442752u,393216u}/* 0861 */, /*1916*/{59u,160u,524289u,77181957u,1515688u,3758096416u,1677796060u,138442752u,393216u}/* 0862 */, /*1917*/{60u,160u,524289u,77181957u,1515688u,3758096416u,1677796068u,138442752u,393216u}/* 0863 */, /*1918*/{61u,160u,524289u,77181957u,1515688u,3758096416u,1677796076u,138442752u,393216u}/* 0864 */, /*1919*/{62u,160u,524289u,77181957u,1515688u,3758096416u,1677796084u,138442752u,393216u}/* 0865 */, /*1920*/{63u,160u,524289u,77181957u,1515560u,3758096416u,1677796092u,138442752u,393216u}/* 0866 */, /*1921*/{64u,160u,524289u,77181957u,1515816u,3758096416u,1677796100u,138442752u,393216u}/* 0867 */, /*1922*/{65u,160u,524289u,77181957u,1515688u,3758096416u,1677796108u,138442752u,393216u}/* 0868 */, /*1923*/{66u,160u,524289u,77181957u,1515816u,3758096416u,1677796116u,138442752u,393216u}/* 0869 */, /*1924*/{67u,160u,524289u,77181957u,1515816u,3758096416u,1677796124u,138442752u,393216u}/* 086A */, /*1925*/{4u,168u,458753u,76985349u,1515688u,3758096416u,1677794292u,138442752u,393216u}/* 08A0 */, /*1926*/{4u,168u,458753u,77083653u,1515688u,3758096416u,1677794308u,138442752u,393216u}/* 08A1 */, /*1927*/{6u,168u,458753u,76985349u,1515688u,3758096416u,1677794452u,138442752u,393216u}/* 08A2 */, /*1928*/{11u,168u,458753u,76985349u,1515688u,3758096416u,1677794980u,138442752u,393216u}/* 08A3 */, /*1929*/{15u,168u,458753u,76985349u,1515688u,3758096416u,1677795100u,138442752u,393216u}/* 08A4 */, /*1930*/{16u,168u,458753u,76985349u,1515688u,3758096416u,1677795180u,138442752u,393216u}/* 08A5 */, /*1931*/{18u,168u,458753u,76985349u,1515688u,3758096416u,1677795404u,138442752u,393216u}/* 08A6 */, /*1932*/{19u,168u,458753u,76985349u,1515688u,3758096416u,1677795436u,138442752u,393216u}/* 08A7 */, /*1933*/{1u,168u,458753u,76985349u,1515688u,3758096416u,1677794172u,138442752u,393216u}/* 08A8 */, /*1934*/{1u,168u,458753u,76985349u,1515688u,3758096416u,1677794180u,138442752u,393216u}/* 08A9 */, /*1935*/{8u,168u,458753u,76985349u,1515816u,3758096416u,1677794796u,138442752u,393216u}/* 08AA */, /*1936*/{3u,168u,458753u,76985349u,1515816u,3758096416u,1677795676u,138442752u,393216u}/* 08AB */, /*1937*/{68u,168u,458753u,76985349u,1515816u,3758096416u,1677794188u,138442752u,393216u}/* 08AC */, /*1938*/{0u,168u,458753u,77083653u,1515560u,3758096416u,1677794196u,138459136u,393216u}/* 08AD */, /*1939*/{7u,168u,458753u,77083653u,1515816u,3758096416u,1677794612u,138442752u,393216u}/* 08AE */, /*1940*/{10u,168u,458753u,77083653u,1515688u,3758096416u,1677794932u,138442752u,393216u}/* 08AF */, /*1941*/{13u,168u,458753u,77083653u,1515688u,3758096416u,1677795268u,138442752u,393216u}/* 08B0 */, /*1942*/{69u,168u,458753u,77083653u,1515816u,3758096416u,1677795644u,138442752u,393216u}/* 08B1 */, /*1943*/{8u,168u,458753u,77083653u,1515816u,3758096416u,1677794804u,138442752u,393216u}/* 08B2 */, /*1944*/{12u,168u,458753u,77116421u,1515688u,3758096416u,1677795044u,138442752u,393216u}/* 08B3 */, /*1945*/{17u,168u,458753u,77116421u,1515688u,3758096416u,1677795252u,138442752u,393216u}/* 08B4 */, /*1946*/{4u,168u,458753u,77149189u,1515688u,3758096416u,1677794316u,138442752u,393216u}/* 08B6 */, /*1947*/{4u,168u,458753u,77149189u,1515688u,3758096416u,1677794324u,138442752u,393216u}/* 08B7 */, /*1948*/{4u,168u,458753u,77149189u,1515688u,3758096416u,1677794396u,138442752u,393216u}/* 08B8 */, /*1949*/{8u,168u,458753u,77149189u,1515816u,3758096416u,1677794812u,138442752u,393216u}/* 08B9 */, /*1950*/{1u,168u,458753u,77149189u,1515688u,3758096416u,1677795796u,138442752u,393216u}/* 08BA */, /*1951*/{70u,168u,458753u,77149189u,1515688u,3758096416u,1677795076u,138442752u,393216u}/* 08BB */, /*1952*/{71u,168u,458753u,77149189u,1515688u,3758096416u,1677795164u,138442752u,393216u}/* 08BC */, /*1953*/{72u,168u,458753u,77149189u,1515688u,3758096416u,1677795460u,138442752u,393216u}/* 08BD */, /*1954*/{0,168u,458753u,3424202758u,672030728u,3774873616u,1077936140u,4209152u,262144u}/* 08D4 */, /*1955*/{0,168u,458753u,3424202758u,672030728u,1627389968u,1077936140u,4208640u,262144u}/* 08E0 */, /*1956*/{0u,168u,65537u,77141008u,135438344u,1694498816u,12u,4208640u,1073741824u}/* 08E2 */, /*1957*/{0,168u,458753u,3088625670u,672030728u,3774881808u,1077936140u,608205312u,262144u}/* 08E3 */, /*1958*/{0,168u,458753u,3424038918u,672030728u,3774881808u,1077936140u,503347712u,262144u}/* 08E4 */, /*1959*/{0,168u,458753u,3424038918u,672030728u,3774881808u,1077936140u,520124928u,262144u}/* 08E5 */, /*1960*/{0,168u,458753u,3088494598u,672030728u,3774881808u,1077936140u,532707840u,262144u}/* 08E6 */, /*1961*/{0,168u,458753u,3424038918u,672030728u,3774881808u,1077936140u,469793280u,262144u}/* 08E7 */, /*1962*/{0,168u,458753u,3424038918u,672030728u,3774881808u,1077936140u,482376192u,262144u}/* 08E8 */, /*1963*/{0,168u,458753u,3088494598u,672030728u,3774881808u,1077936140u,494959104u,262144u}/* 08E9 */, /*1964*/{0,168u,458753u,3424038918u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* 08EA */, /*1965*/{0,168u,458753u,3088494598u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* 08ED */, /*1966*/{0,168u,458753u,1544990726u,672030728u,3774881808u,1077936140u,465598976u,262144u}/* 08F0 */, /*1967*/{0,168u,458753u,1612099590u,672030728u,3774881808u,1077936140u,478181888u,262144u}/* 08F1 */, /*1968*/{0,168u,458753u,1679208454u,672030728u,3774881808u,1077936140u,490764800u,262144u}/* 08F2 */, /*1969*/{0,168u,458753u,3424038918u,672030728u,3774881808u,1077936140u,4209152u,262144u}/* 08F3 */, /*1970*/{0,168u,458753u,3424038918u,672030728u,3774881808u,1077936140u,507542016u,262144u}/* 08F4 */, /*1971*/{0,168u,458753u,3424038918u,672030728u,3774881808u,1077936140u,511736320u,262144u}/* 08F5 */, /*1972*/{0,168u,458753u,3088494598u,672030728u,3774881808u,1077936140u,536902144u,262144u}/* 08F6 */, /*1973*/{0,168u,458753u,3424038918u,672030728u,3774881808u,1077936140u,612399616u,262144u}/* 08F7 */, /*1974*/{0,168u,458753u,3424038918u,672030728u,3774881808u,1077936140u,616593920u,262144u}/* 08F8 */, /*1975*/{0,168u,458753u,3088494598u,672030728u,3774881808u,1077936140u,633371136u,262144u}/* 08F9 */, /*1976*/{0,168u,458753u,3088494598u,672030728u,3774881808u,1077936140u,637565440u,262144u}/* 08FA */, /*1977*/{0,168u,458753u,3424038918u,672030728u,3774881808u,1077936140u,624982528u,262144u}/* 08FB */, /*1978*/{0,168u,458753u,3424038918u,672030728u,3774881808u,1077936140u,629176832u,262144u}/* 08FC */, /*1979*/{0,168u,458753u,3424038918u,672030728u,3774881808u,1077936140u,620788224u,262144u}/* 08FD */, /*1980*/{0,168u,458753u,3424038918u,672030728u,3774881808u,1077936140u,524319232u,262144u}/* 08FE */, /*1981*/{0,168u,458753u,3424137222u,672030728u,3774873616u,1077936140u,578845184u,262144u}/* 08FF */, /*1982*/{0,176u,655361u,68530182u,672030728u,3774873616u,1077936140u,822114816u,262144u}/* 0900 */, /*1983*/{0,176u,655361u,68202502u,672030728u,3774873616u,1077936140u,822114816u,262144u}/* 0901 */, /*1984*/{0,176u,655361u,68202502u,672030728u,3774873616u,1077936140u,826309120u,262144u}/* 0902 */, /*1985*/{0,176u,655361u,68190216u,940466184u,3758096416u,1077936140u,830503424u,262144u}/* 0903 */, /*1986*/{0,176u,655361u,76775429u,1515560u,3758096416u,1677801092u,138442752u,393216u}/* 0904 */, /*1987*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801100u,138442752u,393216u}/* 0905 */, /*1988*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801108u,138442752u,393216u}/* 0906 */, /*1989*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801156u,138442752u,393216u}/* 0907 */, /*1990*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801164u,138442752u,393216u}/* 0908 */, /*1991*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801172u,138442752u,393216u}/* 0909 */, /*1992*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801180u,138442752u,393216u}/* 090A */, /*1993*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801188u,138442752u,393216u}/* 090B */, /*1994*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801204u,138442752u,393216u}/* 090C */, /*1995*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801220u,138442752u,393216u}/* 090D */, /*1996*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801228u,138442752u,393216u}/* 090E */, /*1997*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801236u,138442752u,393216u}/* 090F */, /*1998*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801244u,138442752u,393216u}/* 0910 */, /*1999*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801252u,138442752u,393216u}/* 0911 */, /*2000*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801260u,138442752u,393216u}/* 0912 */, /*2001*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801268u,138442752u,393216u}/* 0913 */, /*2002*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801276u,138442752u,393216u}/* 0914 */, /*2003*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801284u,138442752u,393216u}/* 0915 */, /*2004*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801292u,138442752u,393216u}/* 0916 */, /*2005*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801300u,138442752u,393216u}/* 0917 */, /*2006*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801316u,138442752u,393216u}/* 0918 */, /*2007*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801324u,138442752u,393216u}/* 0919 */, /*2008*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801332u,138442752u,393216u}/* 091A */, /*2009*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801340u,138442752u,393216u}/* 091B */, /*2010*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801348u,138442752u,393216u}/* 091C */, /*2011*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801372u,138442752u,393216u}/* 091D */, /*2012*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801380u,138442752u,393216u}/* 091E */, /*2013*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801388u,138442752u,393216u}/* 091F */, /*2014*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801396u,138442752u,393216u}/* 0920 */, /*2015*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801412u,138442752u,393216u}/* 0921 */, /*2016*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801428u,138442752u,393216u}/* 0922 */, /*2017*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801436u,138442752u,393216u}/* 0923 */, /*2018*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801444u,138442752u,393216u}/* 0924 */, /*2019*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801452u,138442752u,393216u}/* 0925 */, /*2020*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801460u,138442752u,393216u}/* 0926 */, /*2021*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801468u,138442752u,393216u}/* 0927 */, /*2022*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801476u,138442752u,393216u}/* 0928 */, /*2023*/{216530944u,176u,655361u,76578853u,1515560u,3758096416u,1677801476u,952147968u,393216u}/* 0929 */, /*2024*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801484u,138442752u,393216u}/* 092A */, /*2025*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801492u,138442752u,393216u}/* 092B */, /*2026*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801500u,138442752u,393216u}/* 092C */, /*2027*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801516u,138442752u,393216u}/* 092D */, /*2028*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801524u,138442752u,393216u}/* 092E */, /*2029*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801532u,138442752u,393216u}/* 092F */, /*2030*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801548u,138442752u,393216u}/* 0930 */, /*2031*/{217055232u,176u,655361u,76578853u,1515560u,3758096416u,1677801548u,952147968u,393216u}/* 0931 */, /*2032*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801556u,138442752u,393216u}/* 0932 */, /*2033*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801564u,138442752u,393216u}/* 0933 */, /*2034*/{217579520u,176u,655361u,76578853u,1515560u,3758096416u,1677801564u,952147968u,393216u}/* 0934 */, /*2035*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801572u,138442752u,393216u}/* 0935 */, /*2036*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801580u,138442752u,393216u}/* 0936 */, /*2037*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801588u,138442752u,393216u}/* 0937 */, /*2038*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801596u,138442752u,393216u}/* 0938 */, /*2039*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801604u,138442752u,393216u}/* 0939 */, /*2040*/{0,176u,655361u,68562950u,672030728u,3774873616u,1078016204u,138443264u,262144u}/* 093A */, /*2041*/{0,176u,655361u,68550664u,940466184u,3758096416u,1078016212u,138443264u,262144u}/* 093B */, /*2042*/{0,176u,655362u,202420230u,672030736u,1627398160u,1077936140u,817920000u,262144u}/* 093C */, /*2043*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801612u,138442752u,393216u}/* 093D */, /*2044*/{0,176u,655361u,68190216u,940466184u,3758096416u,1078016196u,138443264u,262144u}/* 093E */, /*2045*/{0,176u,655361u,68190216u,940466184u,3758096416u,1078016244u,138443264u,262144u}/* 093F */, /*2046*/{0,176u,655361u,68190216u,940466184u,3758096416u,1078016252u,138443264u,262144u}/* 0940 */, /*2047*/{0,176u,655361u,68202502u,672030728u,3774873616u,1078016260u,138443264u,262144u}/* 0941 */, /*2048*/{0,176u,655361u,68202502u,672030728u,3774873616u,1078016268u,138443264u,262144u}/* 0942 */, /*2049*/{0,176u,655361u,68202502u,672030728u,3774873616u,1078016276u,138443264u,262144u}/* 0943 */, /*2050*/{0,176u,655361u,68202502u,672030728u,3774873616u,1078016284u,138443264u,262144u}/* 0944 */, /*2051*/{0,176u,655361u,68202502u,672030728u,3774873616u,1078016308u,138443264u,262144u}/* 0945 */, /*2052*/{0,176u,655361u,68202502u,672030728u,3774873616u,1078016324u,138443264u,262144u}/* 0946 */, /*2053*/{0,176u,655361u,68202502u,672030728u,3774873616u,1078016332u,138443264u,262144u}/* 0947 */, /*2054*/{0,176u,655361u,68202502u,672030728u,3774873616u,1078016348u,138443264u,262144u}/* 0948 */, /*2055*/{0,176u,655361u,68190216u,940466184u,3758096416u,1078016356u,138443264u,262144u}/* 0949 */, /*2056*/{0,176u,655361u,68190216u,940466184u,3758096416u,1078016364u,138443264u,262144u}/* 094A */, /*2057*/{0,176u,655361u,68190216u,940466184u,3758096416u,1078016372u,138443264u,262144u}/* 094B */, /*2058*/{0,176u,655361u,68190216u,940466184u,3758096416u,1078016380u,138443264u,262144u}/* 094C */, /*2059*/{0,176u,655361u,336637958u,672030728u,1627398168u,1078016388u,138442752u,262144u}/* 094D */, /*2060*/{0,176u,655361u,68517896u,940466184u,3758096416u,1078016340u,138443264u,262144u}/* 094E */, /*2061*/{0,176u,655361u,68550664u,940466184u,3758096416u,1078016220u,138443264u,262144u}/* 094F */, /*2062*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801068u,138442752u,393216u}/* 0950 */, /*2063*/{0,176u,2686977u,3423645702u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* 0951 */, /*2064*/{0,176u,2686977u,3088101382u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* 0952 */, /*2065*/{0,176u,655361u,3423645702u,672030728u,1627398160u,1077936140u,159414272u,262144u}/* 0953 */, /*2066*/{0,176u,655361u,3423645702u,672030728u,1627398160u,1077936140u,155219968u,262144u}/* 0954 */, /*2067*/{0,176u,655361u,68530182u,672030728u,3774873616u,1078016316u,138443264u,262144u}/* 0955 */, /*2068*/{0,176u,655361u,68562950u,672030728u,3774873616u,1078016228u,138443264u,262144u}/* 0956 */, /*2069*/{0,176u,655361u,68562950u,672030728u,3774873616u,1078016236u,138443264u,262144u}/* 0957 */, /*2070*/{218103808u,176u,655360u,76578853u,1515520u,3758620768u,1677801284u,952147968u,393216u}/* 0958 */, /*2071*/{218628096u,176u,655360u,76578853u,1515520u,3758620768u,1677801292u,952147968u,393216u}/* 0959 */, /*2072*/{219152384u,176u,655360u,76578853u,1515520u,3758620768u,1677801300u,952147968u,393216u}/* 095A */, /*2073*/{219676672u,176u,655360u,76578853u,1515520u,3758620768u,1677801348u,952147968u,393216u}/* 095B */, /*2074*/{220200960u,176u,655360u,76578853u,1515520u,3758620768u,1677801412u,952147968u,393216u}/* 095C */, /*2075*/{220725248u,176u,655360u,76578853u,1515520u,3758620768u,1677801428u,952147968u,393216u}/* 095D */, /*2076*/{221249536u,176u,655360u,76578853u,1515520u,3758620768u,1677801492u,952147968u,393216u}/* 095E */, /*2077*/{221773824u,176u,655360u,76578853u,1515520u,3758620768u,1677801532u,952147968u,393216u}/* 095F */, /*2078*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801196u,138442752u,393216u}/* 0960 */, /*2079*/{0,176u,655361u,76578821u,1515560u,3758096416u,1677801212u,138442752u,393216u}/* 0961 */, /*2080*/{0,176u,655361u,68202502u,672030728u,3774873616u,1078016292u,138443264u,262144u}/* 0962 */, /*2081*/{0,176u,655361u,68202502u,672030728u,3774873616u,1078016300u,138443264u,262144u}/* 0963 */, /*2082*/{0,176u,65537u,69238807u,98344u,1610612768u,5252u,138442754u,41943040u}/* 0964 */, /*2083*/{0,176u,65537u,69238807u,98344u,1610612768u,5260u,138442754u,41943040u}/* 0965 */, /*2084*/{0,176u,34210817u,84967433u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 0966 */, /*2085*/{0,176u,537527809u,84967433u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 0967 */, /*2086*/{0,176u,571083265u,84967433u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 0968 */, /*2087*/{0,176u,604637185u,84967433u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 0969 */, /*2088*/{0,176u,638193665u,84967433u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 096A */, /*2089*/{0,176u,671747073u,84967433u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 096B */, /*2090*/{0,176u,705304065u,84967433u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 096C */, /*2091*/{0,176u,738856449u,84967433u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 096D */, /*2092*/{0,176u,772414465u,84967433u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 096E */, /*2093*/{0,176u,805966849u,84967433u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 096F */, /*2094*/{0,176u,655361u,76578839u,40u,1610612768u,8044u,138442754u,0}/* 0970 */, /*2095*/{0,176u,655361u,76873732u,1515560u,3774881824u,1677779708u,138442752u,393216u}/* 0971 */, /*2096*/{0,176u,655361u,76873733u,1515560u,3758096416u,1677801084u,138442752u,393216u}/* 0972 */, /*2097*/{0,176u,655361u,76939269u,1515560u,3758096416u,1677801116u,138442752u,393216u}/* 0973 */, /*2098*/{0,176u,655361u,76939269u,1515560u,3758096416u,1677801124u,138442752u,393216u}/* 0974 */, /*2099*/{0,176u,655361u,76939269u,1515560u,3758096416u,1677801132u,138442752u,393216u}/* 0975 */, /*2100*/{0,176u,655361u,76939269u,1515560u,3758096416u,1677801140u,138442752u,393216u}/* 0976 */, /*2101*/{0,176u,655361u,76939269u,1515560u,3758096416u,1677801148u,138442752u,393216u}/* 0977 */, /*2102*/{0,176u,655361u,77070341u,1515560u,3758096416u,1677801404u,138442752u,393216u}/* 0978 */, /*2103*/{0,176u,655361u,76906501u,1515560u,3758096416u,1677801356u,138442752u,393216u}/* 0979 */, /*2104*/{0,176u,655361u,76906501u,1515560u,3758096416u,1677801540u,138442752u,393216u}/* 097A */, /*2105*/{0,176u,655361u,76840965u,1515560u,3758096416u,1677801308u,138442752u,393216u}/* 097B */, /*2106*/{0,176u,655361u,76840965u,1515560u,3758096416u,1677801364u,138442752u,393216u}/* 097C */, /*2107*/{0,176u,655361u,76808197u,1515560u,3758096416u,1677801620u,138442752u,393216u}/* 097D */, /*2108*/{0,176u,655361u,76840965u,1515560u,3758096416u,1677801420u,138442752u,393216u}/* 097E */, /*2109*/{0,176u,655361u,76840965u,1515560u,3758096416u,1677801508u,138442752u,393216u}/* 097F */, /*2110*/{0,184u,720897u,77070341u,1515560u,3758096416u,1677801868u,138442752u,393216u}/* 0980 */, /*2111*/{0,184u,720897u,68202502u,672030728u,3774873616u,1077936140u,822114816u,262144u}/* 0981 */, /*2112*/{0,184u,720897u,68190216u,940466184u,3758096416u,1077936140u,826309120u,262144u}/* 0982 */, /*2113*/{0,184u,720897u,68190216u,940466184u,3758096416u,1077936140u,830503424u,262144u}/* 0983 */, /*2114*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677801876u,138442752u,393216u}/* 0985 */, /*2115*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677801884u,138442752u,393216u}/* 0986 */, /*2116*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677801892u,138442752u,393216u}/* 0987 */, /*2117*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677801900u,138442752u,393216u}/* 0988 */, /*2118*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677801908u,138442752u,393216u}/* 0989 */, /*2119*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677801916u,138442752u,393216u}/* 098A */, /*2120*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677801924u,138442752u,393216u}/* 098B */, /*2121*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677801940u,138442752u,393216u}/* 098C */, /*2122*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677801956u,138442752u,393216u}/* 098F */, /*2123*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677801964u,138442752u,393216u}/* 0990 */, /*2124*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677801972u,138442752u,393216u}/* 0993 */, /*2125*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677801980u,138442752u,393216u}/* 0994 */, /*2126*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677801988u,138442752u,393216u}/* 0995 */, /*2127*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677801996u,138442752u,393216u}/* 0996 */, /*2128*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802004u,138442752u,393216u}/* 0997 */, /*2129*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802012u,138442752u,393216u}/* 0998 */, /*2130*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802020u,138442752u,393216u}/* 0999 */, /*2131*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802028u,138442752u,393216u}/* 099A */, /*2132*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802036u,138442752u,393216u}/* 099B */, /*2133*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802044u,138442752u,393216u}/* 099C */, /*2134*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802052u,138442752u,393216u}/* 099D */, /*2135*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802060u,138442752u,393216u}/* 099E */, /*2136*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802068u,138442752u,393216u}/* 099F */, /*2137*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802076u,138442752u,393216u}/* 09A0 */, /*2138*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802084u,138442752u,393216u}/* 09A1 */, /*2139*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802092u,138442752u,393216u}/* 09A2 */, /*2140*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802100u,138442752u,393216u}/* 09A3 */, /*2141*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802108u,138442752u,393216u}/* 09A4 */, /*2142*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802116u,138442752u,393216u}/* 09A5 */, /*2143*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802124u,138442752u,393216u}/* 09A6 */, /*2144*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802132u,138442752u,393216u}/* 09A7 */, /*2145*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802140u,138442752u,393216u}/* 09A8 */, /*2146*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802148u,138442752u,393216u}/* 09AA */, /*2147*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802156u,138442752u,393216u}/* 09AB */, /*2148*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802164u,138442752u,393216u}/* 09AC */, /*2149*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802172u,138442752u,393216u}/* 09AD */, /*2150*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802180u,138442752u,393216u}/* 09AE */, /*2151*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802188u,138442752u,393216u}/* 09AF */, /*2152*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802196u,138442752u,393216u}/* 09B0 */, /*2153*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802212u,138442752u,393216u}/* 09B2 */, /*2154*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802228u,138442752u,393216u}/* 09B6 */, /*2155*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802236u,138442752u,393216u}/* 09B7 */, /*2156*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802244u,138442752u,393216u}/* 09B8 */, /*2157*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802252u,138442752u,393216u}/* 09B9 */, /*2158*/{0,184u,720897u,202420230u,672030728u,1627398160u,1077936140u,817920000u,262144u}/* 09BC */, /*2159*/{0,184u,720897u,76775429u,1515560u,3758096416u,1677802260u,138442752u,393216u}/* 09BD */, /*2160*/{0,184u,720898u,68190216u,672030736u,3758096400u,1078016796u,138443392u,262144u}/* 09BE */, /*2161*/{0,184u,720897u,68190216u,940466184u,3758096416u,1078016804u,138443264u,262144u}/* 09BF */, /*2162*/{0,184u,720897u,68190216u,940466184u,3758096416u,1078016812u,138443264u,262144u}/* 09C0 */, /*2163*/{0,184u,720897u,68202502u,672030728u,3774873616u,1078016820u,138443264u,262144u}/* 09C1 */, /*2164*/{0,184u,720897u,68202502u,672030728u,3774873616u,1078016828u,138443264u,262144u}/* 09C2 */, /*2165*/{0,184u,720897u,68202502u,672030728u,3774873616u,1078016836u,138443264u,262144u}/* 09C3 */, /*2166*/{0,184u,720897u,68202502u,672030728u,3774873616u,1078016844u,138443264u,262144u}/* 09C4 */, /*2167*/{0,184u,720897u,68190216u,940466184u,3758096416u,1078016864u,138443264u,262144u}/* 09C7 */, /*2168*/{0,184u,720897u,68190216u,940466184u,3758096416u,1078016876u,138443264u,262144u}/* 09C8 */, /*2169*/{222298112u,184u,720897u,68190248u,940466184u,3758096416u,1078016884u,138437120u,262144u}/* 09CB */, /*2170*/{222822400u,184u,720897u,68190248u,940466184u,3758096416u,1078016892u,138437120u,262144u}/* 09CC */, /*2171*/{0,184u,720897u,336637958u,672030728u,1627398168u,1078016900u,138442752u,262144u}/* 09CD */, /*2172*/{0,184u,720897u,76808197u,1515560u,3758096416u,1677882868u,272709632u,393216u}/* 09CE */, /*2173*/{0,184u,720898u,68190216u,672030736u,3758096400u,1078016908u,138443392u,262144u}/* 09D7 */, /*2174*/{223346688u,184u,720896u,76578853u,1515520u,3758620768u,1677802084u,952147968u,393216u}/* 09DC */, /*2175*/{223870976u,184u,720896u,76578853u,1515520u,3758620768u,1677802092u,952147968u,393216u}/* 09DD */, /*2176*/{224395264u,184u,720896u,76578853u,1515520u,3758620768u,1677802188u,952147968u,393216u}/* 09DF */, /*2177*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677801932u,138442752u,393216u}/* 09E0 */, /*2178*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677801948u,138442752u,393216u}/* 09E1 */, /*2179*/{0,184u,720897u,68202502u,672030728u,3774873616u,1078016852u,138443264u,262144u}/* 09E2 */, /*2180*/{0,184u,720897u,68202502u,672030728u,3774873616u,1078016860u,138443264u,262144u}/* 09E3 */, /*2181*/{0,184u,34276353u,84967433u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 09E6 */, /*2182*/{0,184u,537593345u,84967433u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 09E7 */, /*2183*/{0,184u,571148801u,84967433u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 09E8 */, /*2184*/{0,184u,604702721u,84967433u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 09E9 */, /*2185*/{0,184u,638259201u,84967433u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 09EA */, /*2186*/{0,184u,671812609u,84967433u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 09EB */, /*2187*/{0,184u,705369601u,84967433u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 09EC */, /*2188*/{0,184u,738921985u,84967433u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 09ED */, /*2189*/{0,184u,772480001u,84967433u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 09EE */, /*2190*/{0,184u,806032385u,84967433u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 09EF */, /*2191*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802204u,138442752u,393216u}/* 09F0 */, /*2192*/{0,184u,720897u,76578821u,1515560u,3758096416u,1677802220u,138442752u,393216u}/* 09F1 */, /*2193*/{0,184u,720897u,78680089u,40u,1610612768u,58348u,138442752u,67108864u}/* 09F2 */, /*2194*/{0,184u,720897u,78680089u,40u,1610612768u,58356u,138442752u,67108864u}/* 09F3 */, /*2195*/{0,184u,118162945u,76578827u,29360170u,1610612768u,55261u,138442752u,0}/* 09F4 */, /*2196*/{0,184u,185271809u,76578827u,46137386u,1610612768u,55269u,138442752u,0}/* 09F5 */, /*2197*/{0,184u,252381185u,76578827u,29360170u,1610612768u,55277u,138442752u,0}/* 09F6 */, /*2198*/{0,184u,285935105u,76578827u,62914602u,1610612768u,55285u,138442752u,0}/* 09F7 */, /*2199*/{0,184u,453707777u,76578827u,62914602u,1610612768u,55293u,138442752u,0}/* 09F8 */, /*2200*/{0,184u,923477505u,78675979u,8388650u,1610612768u,55301u,138442752u,0}/* 09F9 */, /*2201*/{0,184u,720897u,76578843u,40u,1610612768u,10580u,138442752u,67108864u}/* 09FA */, /*2202*/{0,184u,720897u,77959193u,40u,1610612768u,58364u,138442752u,67108864u}/* 09FB */, /*2203*/{0,184u,720897u,77168645u,1515560u,3758096416u,1677802388u,138442752u,393216u}/* 09FC */, /*2204*/{0,184u,720897u,77168663u,40u,1610612768u,8084u,138442754u,0}/* 09FD */, /*2205*/{0,192u,786433u,68399110u,672030728u,3774873616u,1077936140u,822114816u,262144u}/* 0A01 */, /*2206*/{0,192u,786433u,68202502u,672030728u,3774873616u,1077936140u,826309120u,262144u}/* 0A02 */, /*2207*/{0,192u,786433u,68386824u,940466184u,3758096416u,1077936140u,830503424u,262144u}/* 0A03 */, /*2208*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802436u,138442752u,393216u}/* 0A05 */, /*2209*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802444u,138442752u,393216u}/* 0A06 */, /*2210*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802476u,138442752u,393216u}/* 0A07 */, /*2211*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802484u,138442752u,393216u}/* 0A08 */, /*2212*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802412u,138442752u,393216u}/* 0A09 */, /*2213*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802420u,138442752u,393216u}/* 0A0A */, /*2214*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802492u,138442752u,393216u}/* 0A0F */, /*2215*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802452u,138442752u,393216u}/* 0A10 */, /*2216*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802428u,138442752u,393216u}/* 0A13 */, /*2217*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802460u,138442752u,393216u}/* 0A14 */, /*2218*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802524u,138442752u,393216u}/* 0A15 */, /*2219*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802532u,138442752u,393216u}/* 0A16 */, /*2220*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802540u,138442752u,393216u}/* 0A17 */, /*2221*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802548u,138442752u,393216u}/* 0A18 */, /*2222*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802556u,138442752u,393216u}/* 0A19 */, /*2223*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802564u,138442752u,393216u}/* 0A1A */, /*2224*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802572u,138442752u,393216u}/* 0A1B */, /*2225*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802580u,138442752u,393216u}/* 0A1C */, /*2226*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802588u,138442752u,393216u}/* 0A1D */, /*2227*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802596u,138442752u,393216u}/* 0A1E */, /*2228*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802604u,138442752u,393216u}/* 0A1F */, /*2229*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802612u,138442752u,393216u}/* 0A20 */, /*2230*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802620u,138442752u,393216u}/* 0A21 */, /*2231*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802628u,138442752u,393216u}/* 0A22 */, /*2232*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802636u,138442752u,393216u}/* 0A23 */, /*2233*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802644u,138442752u,393216u}/* 0A24 */, /*2234*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802652u,138442752u,393216u}/* 0A25 */, /*2235*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802660u,138442752u,393216u}/* 0A26 */, /*2236*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802668u,138442752u,393216u}/* 0A27 */, /*2237*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802676u,138442752u,393216u}/* 0A28 */, /*2238*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802684u,138442752u,393216u}/* 0A2A */, /*2239*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802692u,138442752u,393216u}/* 0A2B */, /*2240*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802700u,138442752u,393216u}/* 0A2C */, /*2241*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802708u,138442752u,393216u}/* 0A2D */, /*2242*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802716u,138442752u,393216u}/* 0A2E */, /*2243*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802724u,138442752u,393216u}/* 0A2F */, /*2244*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802740u,138442752u,393216u}/* 0A30 */, /*2245*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802748u,138442752u,393216u}/* 0A32 */, /*2246*/{224919552u,192u,786432u,76578853u,1515520u,3758620768u,1677802748u,952147968u,393216u}/* 0A33 */, /*2247*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802756u,138442752u,393216u}/* 0A35 */, /*2248*/{225443840u,192u,786432u,76578853u,1515520u,3758620768u,1677802500u,952147968u,393216u}/* 0A36 */, /*2249*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802500u,138442752u,393216u}/* 0A38 */, /*2250*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802508u,138442752u,393216u}/* 0A39 */, /*2251*/{0,192u,786433u,202420230u,672030728u,1627398160u,1077936140u,817920000u,262144u}/* 0A3C */, /*2252*/{0,192u,786433u,68190216u,940466184u,3758096416u,1078017300u,138443264u,262144u}/* 0A3E */, /*2253*/{0,192u,786433u,68190216u,940466184u,3758096416u,1078017308u,138443264u,262144u}/* 0A3F */, /*2254*/{0,192u,786433u,68190216u,940466184u,3758096416u,1078017316u,138443264u,262144u}/* 0A40 */, /*2255*/{0,192u,786433u,68202502u,672030728u,3774873616u,1078017324u,138443264u,262144u}/* 0A41 */, /*2256*/{0,192u,786433u,68202502u,672030728u,3774873616u,1078017332u,138443264u,262144u}/* 0A42 */, /*2257*/{0,192u,786433u,68202502u,672030728u,3774873616u,1078017340u,138443264u,262144u}/* 0A47 */, /*2258*/{0,192u,786433u,68202502u,672030728u,3774873616u,1078017348u,138443264u,262144u}/* 0A48 */, /*2259*/{0,192u,786433u,68202502u,672030728u,3774873616u,1078017356u,138443264u,262144u}/* 0A4B */, /*2260*/{0,192u,786433u,68202502u,672030728u,3774873616u,1078017364u,138443264u,262144u}/* 0A4C */, /*2261*/{0,192u,786433u,336637958u,672030728u,1627398168u,1078017372u,138442752u,262144u}/* 0A4D */, /*2262*/{0,192u,786433u,68497414u,672030728u,3774873616u,1078017044u,138443264u,262144u}/* 0A51 */, /*2263*/{225968128u,192u,786432u,76578853u,1515520u,3758620768u,1677802532u,952147968u,393216u}/* 0A59 */, /*2264*/{226492416u,192u,786432u,76578853u,1515520u,3758620768u,1677802540u,952147968u,393216u}/* 0A5A */, /*2265*/{227016704u,192u,786432u,76578853u,1515520u,3758620768u,1677802580u,952147968u,393216u}/* 0A5B */, /*2266*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802764u,138442752u,393216u}/* 0A5C */, /*2267*/{227540992u,192u,786432u,76578853u,1515520u,3758620768u,1677802692u,952147968u,393216u}/* 0A5E */, /*2268*/{0,192u,34341889u,84967433u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 0A66 */, /*2269*/{0,192u,537658881u,84967433u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 0A67 */, /*2270*/{0,192u,571214337u,84967433u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 0A68 */, /*2271*/{0,192u,604768257u,84967433u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 0A69 */, /*2272*/{0,192u,638324737u,84967433u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 0A6A */, /*2273*/{0,192u,671878145u,84967433u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 0A6B */, /*2274*/{0,192u,705435137u,84967433u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 0A6C */, /*2275*/{0,192u,738987521u,84967433u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 0A6D */, /*2276*/{0,192u,772545537u,84967433u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 0A6E */, /*2277*/{0,192u,806097921u,84967433u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 0A6F */, /*2278*/{0,192u,786433u,68202502u,672030728u,3774873616u,1077936140u,834697728u,262144u}/* 0A70 */, /*2279*/{0,192u,786433u,68202502u,672030728u,3774873616u,1077936140u,838892032u,262144u}/* 0A71 */, /*2280*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802468u,138442752u,393216u}/* 0A72 */, /*2281*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802404u,138442752u,393216u}/* 0A73 */, /*2282*/{0,192u,786433u,76578821u,1515560u,3758096416u,1677802396u,138442752u,393216u}/* 0A74 */, /*2283*/{0,192u,786433u,68497414u,672030728u,3774873616u,1078017260u,138443264u,262144u}/* 0A75 */, /*2284*/{0,200u,851969u,68202502u,672030728u,3774873616u,1077936140u,822114816u,262144u}/* 0A81 */, /*2285*/{0,200u,851969u,68202502u,672030728u,3774873616u,1077936140u,826309120u,262144u}/* 0A82 */, /*2286*/{0,200u,851969u,68190216u,940466184u,3758096416u,1077936140u,830503424u,262144u}/* 0A83 */, /*2287*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677802860u,138442752u,393216u}/* 0A85 */, /*2288*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677802868u,138442752u,393216u}/* 0A86 */, /*2289*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677802876u,138442752u,393216u}/* 0A87 */, /*2290*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677802884u,138442752u,393216u}/* 0A88 */, /*2291*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677802892u,138442752u,393216u}/* 0A89 */, /*2292*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677802900u,138442752u,393216u}/* 0A8A */, /*2293*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677802908u,138442752u,393216u}/* 0A8B */, /*2294*/{0,200u,851969u,76775429u,1515560u,3758096416u,1677802924u,138442752u,393216u}/* 0A8C */, /*2295*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677802940u,138442752u,393216u}/* 0A8D */, /*2296*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677802948u,138442752u,393216u}/* 0A8F */, /*2297*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677802956u,138442752u,393216u}/* 0A90 */, /*2298*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677802964u,138442752u,393216u}/* 0A91 */, /*2299*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677802972u,138442752u,393216u}/* 0A93 */, /*2300*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677802980u,138442752u,393216u}/* 0A94 */, /*2301*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677802988u,138442752u,393216u}/* 0A95 */, /*2302*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677802996u,138442752u,393216u}/* 0A96 */, /*2303*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803004u,138442752u,393216u}/* 0A97 */, /*2304*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803012u,138442752u,393216u}/* 0A98 */, /*2305*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803020u,138442752u,393216u}/* 0A99 */, /*2306*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803028u,138442752u,393216u}/* 0A9A */, /*2307*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803036u,138442752u,393216u}/* 0A9B */, /*2308*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803044u,138442752u,393216u}/* 0A9C */, /*2309*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803060u,138442752u,393216u}/* 0A9D */, /*2310*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803068u,138442752u,393216u}/* 0A9E */, /*2311*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803076u,138442752u,393216u}/* 0A9F */, /*2312*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803084u,138442752u,393216u}/* 0AA0 */, /*2313*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803092u,138442752u,393216u}/* 0AA1 */, /*2314*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803100u,138442752u,393216u}/* 0AA2 */, /*2315*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803108u,138442752u,393216u}/* 0AA3 */, /*2316*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803116u,138442752u,393216u}/* 0AA4 */, /*2317*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803124u,138442752u,393216u}/* 0AA5 */, /*2318*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803132u,138442752u,393216u}/* 0AA6 */, /*2319*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803140u,138442752u,393216u}/* 0AA7 */, /*2320*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803148u,138442752u,393216u}/* 0AA8 */, /*2321*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803156u,138442752u,393216u}/* 0AAA */, /*2322*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803164u,138442752u,393216u}/* 0AAB */, /*2323*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803172u,138442752u,393216u}/* 0AAC */, /*2324*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803180u,138442752u,393216u}/* 0AAD */, /*2325*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803188u,138442752u,393216u}/* 0AAE */, /*2326*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803196u,138442752u,393216u}/* 0AAF */, /*2327*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803204u,138442752u,393216u}/* 0AB0 */, /*2328*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803212u,138442752u,393216u}/* 0AB2 */, /*2329*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803260u,138442752u,393216u}/* 0AB3 */, /*2330*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803220u,138442752u,393216u}/* 0AB5 */, /*2331*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803228u,138442752u,393216u}/* 0AB6 */, /*2332*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803236u,138442752u,393216u}/* 0AB7 */, /*2333*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803244u,138442752u,393216u}/* 0AB8 */, /*2334*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803252u,138442752u,393216u}/* 0AB9 */, /*2335*/{0,200u,851969u,202420230u,672030728u,1627398160u,1077936140u,817920000u,262144u}/* 0ABC */, /*2336*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677803268u,138442752u,393216u}/* 0ABD */, /*2337*/{0,200u,851969u,68190216u,940466184u,3758096416u,1078017804u,138443264u,262144u}/* 0ABE */, /*2338*/{0,200u,851969u,68190216u,940466184u,3758096416u,1078017812u,138443264u,262144u}/* 0ABF */, /*2339*/{0,200u,851969u,68190216u,940466184u,3758096416u,1078017820u,138443264u,262144u}/* 0AC0 */, /*2340*/{0,200u,851969u,68202502u,672030728u,3774873616u,1078017828u,138443264u,262144u}/* 0AC1 */, /*2341*/{0,200u,851969u,68202502u,672030728u,3774873616u,1078017836u,138443264u,262144u}/* 0AC2 */, /*2342*/{0,200u,851969u,68202502u,672030728u,3774873616u,1078017844u,138443264u,262144u}/* 0AC3 */, /*2343*/{0,200u,851969u,68202502u,672030728u,3774873616u,1078017852u,138443264u,262144u}/* 0AC4 */, /*2344*/{0,200u,851969u,68202502u,672030728u,3774873616u,1078017876u,138443264u,262144u}/* 0AC5 */, /*2345*/{0,200u,851969u,68202502u,672030728u,3774873616u,1078017884u,138443264u,262144u}/* 0AC7 */, /*2346*/{0,200u,851969u,68202502u,672030728u,3774873616u,1078017892u,138443264u,262144u}/* 0AC8 */, /*2347*/{0,200u,851969u,68190216u,940466184u,3758096416u,1078017900u,138443264u,262144u}/* 0AC9 */, /*2348*/{0,200u,851969u,68190216u,940466184u,3758096416u,1078017908u,138443264u,262144u}/* 0ACB */, /*2349*/{0,200u,851969u,68190216u,940466184u,3758096416u,1078017916u,138443264u,262144u}/* 0ACC */, /*2350*/{0,200u,851969u,336637958u,672030728u,1627398168u,1078017924u,138442752u,262144u}/* 0ACD */, /*2351*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677802852u,138442752u,393216u}/* 0AD0 */, /*2352*/{0,200u,851969u,76578821u,1515560u,3758096416u,1677802916u,138442752u,393216u}/* 0AE0 */, /*2353*/{0,200u,851969u,76775429u,1515560u,3758096416u,1677802932u,138442752u,393216u}/* 0AE1 */, /*2354*/{0,200u,851969u,68399110u,672030728u,3774873616u,1078017860u,138443264u,262144u}/* 0AE2 */, /*2355*/{0,200u,851969u,68399110u,672030728u,3774873616u,1078017868u,138443264u,262144u}/* 0AE3 */, /*2356*/{0,200u,34407425u,84967433u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 0AE6 */, /*2357*/{0,200u,537724417u,84967433u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 0AE7 */, /*2358*/{0,200u,571279873u,84967433u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 0AE8 */, /*2359*/{0,200u,604833793u,84967433u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 0AE9 */, /*2360*/{0,200u,638390273u,84967433u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 0AEA */, /*2361*/{0,200u,671943681u,84967433u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 0AEB */, /*2362*/{0,200u,705500673u,84967433u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 0AEC */, /*2363*/{0,200u,739053057u,84967433u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 0AED */, /*2364*/{0,200u,772611073u,84967433u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 0AEE */, /*2365*/{0,200u,806163457u,84967433u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 0AEF */, /*2366*/{0,200u,851969u,76972055u,40u,1610612768u,8092u,138442754u,0}/* 0AF0 */, /*2367*/{0,200u,851969u,77828121u,40u,1610612768u,58372u,138442752u,67108864u}/* 0AF1 */, /*2368*/{0,200u,851969u,77103109u,1515560u,3758096416u,1677803052u,138442752u,393216u}/* 0AF9 */, /*2369*/{0,200u,851969u,68792326u,672030728u,3774873616u,1077936140u,545290752u,262144u}/* 0AFA */, /*2370*/{0,200u,851969u,68792326u,672030728u,3774873616u,1077936140u,541096448u,262144u}/* 0AFB */, /*2371*/{0,200u,851969u,68792326u,672030728u,3774873616u,1077936140u,549485056u,262144u}/* 0AFC */, /*2372*/{0,200u,851969u,68792326u,672030728u,1627398160u,1077936140u,817920000u,262144u}/* 0AFD */, /*2373*/{0,208u,917505u,68202502u,672030728u,3774873616u,1077936140u,822114816u,262144u}/* 0B01 */, /*2374*/{0,208u,917505u,68190216u,940466184u,3758096416u,1077936140u,826309120u,262144u}/* 0B02 */, /*2375*/{0,208u,917505u,68190216u,940466184u,3758096416u,1077936140u,830503424u,262144u}/* 0B03 */, /*2376*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803404u,138442752u,393216u}/* 0B05 */, /*2377*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803412u,138442752u,393216u}/* 0B06 */, /*2378*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803420u,138442752u,393216u}/* 0B07 */, /*2379*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803428u,138442752u,393216u}/* 0B08 */, /*2380*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803436u,138442752u,393216u}/* 0B09 */, /*2381*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803444u,138442752u,393216u}/* 0B0A */, /*2382*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803452u,138442752u,393216u}/* 0B0B */, /*2383*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803468u,138442752u,393216u}/* 0B0C */, /*2384*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803484u,138442752u,393216u}/* 0B0F */, /*2385*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803492u,138442752u,393216u}/* 0B10 */, /*2386*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803500u,138442752u,393216u}/* 0B13 */, /*2387*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803508u,138442752u,393216u}/* 0B14 */, /*2388*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803516u,138442752u,393216u}/* 0B15 */, /*2389*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803524u,138442752u,393216u}/* 0B16 */, /*2390*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803532u,138442752u,393216u}/* 0B17 */, /*2391*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803540u,138442752u,393216u}/* 0B18 */, /*2392*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803548u,138442752u,393216u}/* 0B19 */, /*2393*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803556u,138442752u,393216u}/* 0B1A */, /*2394*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803564u,138442752u,393216u}/* 0B1B */, /*2395*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803572u,138442752u,393216u}/* 0B1C */, /*2396*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803580u,138442752u,393216u}/* 0B1D */, /*2397*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803588u,138442752u,393216u}/* 0B1E */, /*2398*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803596u,138442752u,393216u}/* 0B1F */, /*2399*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803604u,138442752u,393216u}/* 0B20 */, /*2400*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803612u,138442752u,393216u}/* 0B21 */, /*2401*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803620u,138442752u,393216u}/* 0B22 */, /*2402*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803628u,138442752u,393216u}/* 0B23 */, /*2403*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803636u,138442752u,393216u}/* 0B24 */, /*2404*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803644u,138442752u,393216u}/* 0B25 */, /*2405*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803652u,138442752u,393216u}/* 0B26 */, /*2406*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803660u,138442752u,393216u}/* 0B27 */, /*2407*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803668u,138442752u,393216u}/* 0B28 */, /*2408*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803676u,138442752u,393216u}/* 0B2A */, /*2409*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803684u,138442752u,393216u}/* 0B2B */, /*2410*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803692u,138442752u,393216u}/* 0B2C */, /*2411*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803700u,138442752u,393216u}/* 0B2D */, /*2412*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803708u,138442752u,393216u}/* 0B2E */, /*2413*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803716u,138442752u,393216u}/* 0B2F */, /*2414*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803732u,138442752u,393216u}/* 0B30 */, /*2415*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803740u,138442752u,393216u}/* 0B32 */, /*2416*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803748u,138442752u,393216u}/* 0B33 */, /*2417*/{0,208u,917505u,76775429u,1515560u,3758096416u,1677803756u,138442752u,393216u}/* 0B35 */, /*2418*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803772u,138442752u,393216u}/* 0B36 */, /*2419*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803780u,138442752u,393216u}/* 0B37 */, /*2420*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803788u,138442752u,393216u}/* 0B38 */, /*2421*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803796u,138442752u,393216u}/* 0B39 */, /*2422*/{0,208u,917505u,202420230u,672030728u,1627398160u,1077936140u,817920000u,262144u}/* 0B3C */, /*2423*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803804u,138442752u,393216u}/* 0B3D */, /*2424*/{0,208u,917506u,68190216u,672030736u,3758096400u,1078018340u,138443392u,262144u}/* 0B3E */, /*2425*/{0,208u,917505u,68202502u,672030728u,3774873616u,1078018348u,138443264u,262144u}/* 0B3F */, /*2426*/{0,208u,917505u,68190216u,940466184u,3758096416u,1078018356u,138443264u,262144u}/* 0B40 */, /*2427*/{0,208u,917505u,68202502u,672030728u,3774873616u,1078018364u,138443264u,262144u}/* 0B41 */, /*2428*/{0,208u,917505u,68202502u,672030728u,3774873616u,1078018372u,138443264u,262144u}/* 0B42 */, /*2429*/{0,208u,917505u,68202502u,672030728u,3774873616u,1078018380u,138443264u,262144u}/* 0B43 */, /*2430*/{0,208u,917505u,68497414u,672030728u,3774873616u,1078018388u,138443264u,262144u}/* 0B44 */, /*2431*/{0,208u,917505u,68190216u,940466184u,3758096416u,1078018408u,138443264u,262144u}/* 0B47 */, /*2432*/{228065280u,208u,917505u,68190248u,940466184u,3758096416u,1078018420u,138437120u,262144u}/* 0B48 */, /*2433*/{228589568u,208u,917505u,68190248u,940466184u,3758096416u,1078018428u,138437120u,262144u}/* 0B4B */, /*2434*/{229113856u,208u,917505u,68190248u,940466184u,3758096416u,1078018436u,138437120u,262144u}/* 0B4C */, /*2435*/{0,208u,917505u,336637958u,672030728u,1627398168u,1078018444u,138442752u,262144u}/* 0B4D */, /*2436*/{0,208u,917506u,68202502u,672030736u,3774873616u,1078018452u,138443264u,262144u}/* 0B56 */, /*2437*/{0,208u,917506u,68190216u,672030736u,3758096400u,1078018460u,138443392u,262144u}/* 0B57 */, /*2438*/{229638144u,208u,917504u,76578853u,1515520u,3758620768u,1677803612u,952147968u,393216u}/* 0B5C */, /*2439*/{230162432u,208u,917504u,76578853u,1515520u,3758620768u,1677803620u,952147968u,393216u}/* 0B5D */, /*2440*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803724u,138442752u,393216u}/* 0B5F */, /*2441*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803460u,138442752u,393216u}/* 0B60 */, /*2442*/{0,208u,917505u,76578821u,1515560u,3758096416u,1677803476u,138442752u,393216u}/* 0B61 */, /*2443*/{0,208u,917505u,68497414u,672030728u,3774873616u,1078018396u,138443264u,262144u}/* 0B62 */, /*2444*/{0,208u,917505u,68497414u,672030728u,3774873616u,1078018404u,138443264u,262144u}/* 0B63 */, /*2445*/{0,208u,34472961u,84967433u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 0B66 */, /*2446*/{0,208u,537789953u,84967433u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 0B67 */, /*2447*/{0,208u,571345409u,84967433u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 0B68 */, /*2448*/{0,208u,604899329u,84967433u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 0B69 */, /*2449*/{0,208u,638455809u,84967433u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 0B6A */, /*2450*/{0,208u,672009217u,84967433u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 0B6B */, /*2451*/{0,208u,705566209u,84967433u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 0B6C */, /*2452*/{0,208u,739118593u,84967433u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 0B6D */, /*2453*/{0,208u,772676609u,84967433u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 0B6E */, /*2454*/{0,208u,806228993u,84967433u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 0B6F */, /*2455*/{0,208u,917505u,76578843u,40u,1610612768u,10588u,138442752u,67108864u}/* 0B70 */, /*2456*/{0,208u,917505u,76775429u,1515560u,3758096416u,1677803764u,138442752u,393216u}/* 0B71 */, /*2457*/{0,208u,286131713u,76939275u,62914602u,1610612768u,55309u,138442752u,0}/* 0B72 */, /*2458*/{0,208u,370017793u,76939275u,4194346u,1610612768u,55317u,138442752u,0}/* 0B73 */, /*2459*/{0,208u,453904385u,76939275u,62914602u,1610612768u,55325u,138442752u,0}/* 0B74 */, /*2460*/{0,208u,118359553u,76939275u,29360170u,1610612768u,55333u,138442752u,0}/* 0B75 */, /*2461*/{0,208u,185468417u,76939275u,46137386u,1610612768u,55341u,138442752u,0}/* 0B76 */, /*2462*/{0,208u,252577793u,76939275u,29360170u,1610612768u,55349u,138442752u,0}/* 0B77 */, /*2463*/{0,216u,983041u,68202502u,672030728u,3774873616u,1077936140u,826309120u,262144u}/* 0B82 */, /*2464*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677804044u,138442752u,393216u}/* 0B83 */, /*2465*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677803948u,138442752u,393216u}/* 0B85 */, /*2466*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677803956u,138442752u,393216u}/* 0B86 */, /*2467*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677803964u,138442752u,393216u}/* 0B87 */, /*2468*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677803972u,138442752u,393216u}/* 0B88 */, /*2469*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677803980u,138442752u,393216u}/* 0B89 */, /*2470*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677803988u,138442752u,393216u}/* 0B8A */, /*2471*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677803996u,138442752u,393216u}/* 0B8E */, /*2472*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677804004u,138442752u,393216u}/* 0B8F */, /*2473*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677804012u,138442752u,393216u}/* 0B90 */, /*2474*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677804016u,138442752u,393216u}/* 0B92 */, /*2475*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677804028u,138442752u,393216u}/* 0B93 */, /*2476*/{230686720u,216u,983041u,76578853u,1515560u,3758096416u,1677804036u,138436608u,393216u}/* 0B94 */, /*2477*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677804052u,138442752u,393216u}/* 0B95 */, /*2478*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677804060u,138442752u,393216u}/* 0B99 */, /*2479*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677804068u,138442752u,393216u}/* 0B9A */, /*2480*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677804196u,138442752u,393216u}/* 0B9C */, /*2481*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677804076u,138442752u,393216u}/* 0B9E */, /*2482*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677804084u,138442752u,393216u}/* 0B9F */, /*2483*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677804092u,138442752u,393216u}/* 0BA3 */, /*2484*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677804100u,138442752u,393216u}/* 0BA4 */, /*2485*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677804108u,138442752u,393216u}/* 0BA8 */, /*2486*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677804188u,138442752u,393216u}/* 0BA9 */, /*2487*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677804116u,138442752u,393216u}/* 0BAA */, /*2488*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677804124u,138442752u,393216u}/* 0BAE */, /*2489*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677804132u,138442752u,393216u}/* 0BAF */, /*2490*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677804140u,138442752u,393216u}/* 0BB0 */, /*2491*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677804180u,138442752u,393216u}/* 0BB1 */, /*2492*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677804148u,138442752u,393216u}/* 0BB2 */, /*2493*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677804172u,138442752u,393216u}/* 0BB3 */, /*2494*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677804164u,138442752u,393216u}/* 0BB4 */, /*2495*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677804156u,138442752u,393216u}/* 0BB5 */, /*2496*/{0,216u,983041u,76808197u,1515560u,3758096416u,1677804204u,138442752u,393216u}/* 0BB6 */, /*2497*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677804212u,138442752u,393216u}/* 0BB7 */, /*2498*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677804220u,138442752u,393216u}/* 0BB8 */, /*2499*/{0,216u,983041u,76578821u,1515560u,3758096416u,1677804228u,138442752u,393216u}/* 0BB9 */, /*2500*/{0,216u,983042u,68190216u,672030736u,3758096400u,1078018764u,138443392u,262144u}/* 0BBE */, /*2501*/{0,216u,983041u,68190216u,940466184u,3758096416u,1078018772u,138443264u,262144u}/* 0BBF */, /*2502*/{0,216u,983041u,68202502u,672030728u,3774873616u,1078018780u,138443264u,262144u}/* 0BC0 */, /*2503*/{0,216u,983041u,68190216u,940466184u,3758096416u,1078018788u,138443264u,262144u}/* 0BC1 */, /*2504*/{0,216u,983041u,68190216u,940466184u,3758096416u,1078018796u,138443264u,262144u}/* 0BC2 */, /*2505*/{0,216u,983041u,68190216u,940466184u,3758096416u,1078018800u,138443264u,262144u}/* 0BC6 */, /*2506*/{0,216u,983041u,68190216u,940466184u,3758096416u,1078018808u,138443264u,262144u}/* 0BC7 */, /*2507*/{0,216u,983041u,68190216u,940466184u,3758096416u,1078018820u,138443264u,262144u}/* 0BC8 */, /*2508*/{231211008u,216u,983041u,68190248u,940466184u,3758096416u,1078018828u,138437120u,262144u}/* 0BCA */, /*2509*/{231735296u,216u,983041u,68190248u,940466184u,3758096416u,1078018836u,138437120u,262144u}/* 0BCB */, /*2510*/{232259584u,216u,983041u,68190248u,940466184u,3758096416u,1078018844u,138437120u,262144u}/* 0BCC */, /*2511*/{0,216u,983041u,336637958u,672030728u,1627398168u,1078018852u,138442752u,262144u}/* 0BCD */, /*2512*/{0,216u,983041u,76873733u,1515560u,3758096416u,1677803940u,138442752u,393216u}/* 0BD0 */, /*2513*/{0,216u,983042u,68190216u,672030736u,3758096400u,1078018860u,138443392u,262144u}/* 0BD7 */, /*2514*/{0,216u,34538497u,85196809u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 0BE6 */, /*2515*/{0,216u,537855489u,84967433u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 0BE7 */, /*2516*/{0,216u,571410945u,84967433u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 0BE8 */, /*2517*/{0,216u,604964865u,84967433u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 0BE9 */, /*2518*/{0,216u,638521345u,84967433u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 0BEA */, /*2519*/{0,216u,672074753u,84967433u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 0BEB */, /*2520*/{0,216u,705631745u,84967433u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 0BEC */, /*2521*/{0,216u,739184129u,84967433u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 0BED */, /*2522*/{0,216u,772742145u,84967433u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 0BEE */, /*2523*/{0,216u,806294529u,84967433u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 0BEF */, /*2524*/{0,216u,823074817u,76578827u,8388650u,1610612768u,55405u,138442752u,0}/* 0BF0 */, /*2525*/{0,216u,1578070529u,76578827u,8388650u,1610612768u,55413u,138442752u,0}/* 0BF1 */, /*2526*/{0,216u,1729070081u,76578827u,8388650u,1610612768u,55421u,138442752u,0}/* 0BF2 */, /*2527*/{0,216u,983041u,76785691u,40u,1610612768u,10596u,138442752u,67108864u}/* 0BF3 */, /*2528*/{0,216u,983041u,76785691u,40u,1610612768u,10604u,138442752u,67108864u}/* 0BF4 */, /*2529*/{0,216u,983041u,76785691u,40u,1610612768u,10612u,138442752u,67108864u}/* 0BF5 */, /*2530*/{0,216u,983041u,76785691u,40u,1610612768u,10620u,138442752u,67108864u}/* 0BF6 */, /*2531*/{0,216u,983041u,76785691u,40u,1610612768u,10628u,138442752u,67108864u}/* 0BF7 */, /*2532*/{0,216u,983041u,76785691u,40u,1610612768u,10636u,138442752u,67108864u}/* 0BF8 */, /*2533*/{0,216u,983041u,77828121u,40u,1610612768u,58388u,138442752u,67108864u}/* 0BF9 */, /*2534*/{0,216u,983041u,76785691u,40u,1610612768u,10644u,138442752u,67108864u}/* 0BFA */, /*2535*/{0,224u,1048577u,68694022u,672030728u,3774873616u,1077936140u,822114816u,262144u}/* 0C00 */, /*2536*/{0,224u,1048577u,68190216u,940466184u,3758096416u,1077936140u,822114816u,262144u}/* 0C01 */, /*2537*/{0,224u,1048577u,68190216u,940466184u,3758096416u,1077936140u,826309120u,262144u}/* 0C02 */, /*2538*/{0,224u,1048577u,68190216u,940466184u,3758096416u,1077936140u,830503424u,262144u}/* 0C03 */, /*2539*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804340u,138442752u,393216u}/* 0C05 */, /*2540*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804348u,138442752u,393216u}/* 0C06 */, /*2541*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804356u,138442752u,393216u}/* 0C07 */, /*2542*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804364u,138442752u,393216u}/* 0C08 */, /*2543*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804372u,138442752u,393216u}/* 0C09 */, /*2544*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804380u,138442752u,393216u}/* 0C0A */, /*2545*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804388u,138442752u,393216u}/* 0C0B */, /*2546*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804404u,138442752u,393216u}/* 0C0C */, /*2547*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804420u,138442752u,393216u}/* 0C0E */, /*2548*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804428u,138442752u,393216u}/* 0C0F */, /*2549*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804436u,138442752u,393216u}/* 0C10 */, /*2550*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804444u,138442752u,393216u}/* 0C12 */, /*2551*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804452u,138442752u,393216u}/* 0C13 */, /*2552*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804460u,138442752u,393216u}/* 0C14 */, /*2553*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804468u,138442752u,393216u}/* 0C15 */, /*2554*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804476u,138442752u,393216u}/* 0C16 */, /*2555*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804484u,138442752u,393216u}/* 0C17 */, /*2556*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804492u,138442752u,393216u}/* 0C18 */, /*2557*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804500u,138442752u,393216u}/* 0C19 */, /*2558*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804508u,138442752u,393216u}/* 0C1A */, /*2559*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804524u,138442752u,393216u}/* 0C1B */, /*2560*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804532u,138442752u,393216u}/* 0C1C */, /*2561*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804548u,138442752u,393216u}/* 0C1D */, /*2562*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804556u,138442752u,393216u}/* 0C1E */, /*2563*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804564u,138442752u,393216u}/* 0C1F */, /*2564*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804572u,138442752u,393216u}/* 0C20 */, /*2565*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804580u,138442752u,393216u}/* 0C21 */, /*2566*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804588u,138442752u,393216u}/* 0C22 */, /*2567*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804596u,138442752u,393216u}/* 0C23 */, /*2568*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804604u,138442752u,393216u}/* 0C24 */, /*2569*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804612u,138442752u,393216u}/* 0C25 */, /*2570*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804620u,138442752u,393216u}/* 0C26 */, /*2571*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804628u,138442752u,393216u}/* 0C27 */, /*2572*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804636u,138442752u,393216u}/* 0C28 */, /*2573*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804644u,138442752u,393216u}/* 0C2A */, /*2574*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804652u,138442752u,393216u}/* 0C2B */, /*2575*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804660u,138442752u,393216u}/* 0C2C */, /*2576*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804668u,138442752u,393216u}/* 0C2D */, /*2577*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804676u,138442752u,393216u}/* 0C2E */, /*2578*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804684u,138442752u,393216u}/* 0C2F */, /*2579*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804692u,138442752u,393216u}/* 0C30 */, /*2580*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804700u,138442752u,393216u}/* 0C31 */, /*2581*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804708u,138442752u,393216u}/* 0C32 */, /*2582*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804756u,138442752u,393216u}/* 0C33 */, /*2583*/{0,224u,1048577u,77070341u,1515560u,3758096416u,1677804764u,138442752u,393216u}/* 0C34 */, /*2584*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804716u,138442752u,393216u}/* 0C35 */, /*2585*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804724u,138442752u,393216u}/* 0C36 */, /*2586*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804732u,138442752u,393216u}/* 0C37 */, /*2587*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804740u,138442752u,393216u}/* 0C38 */, /*2588*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804748u,138442752u,393216u}/* 0C39 */, /*2589*/{0,224u,1048577u,76873733u,1515560u,3758096416u,1677804780u,138442752u,393216u}/* 0C3D */, /*2590*/{0,224u,1048577u,68202502u,672030728u,3774873616u,1078019316u,138443264u,262144u}/* 0C3E */, /*2591*/{0,224u,1048577u,68202502u,672030728u,3774873616u,1078019324u,138443264u,262144u}/* 0C3F */, /*2592*/{0,224u,1048577u,68202502u,672030728u,3774873616u,1078019332u,138443264u,262144u}/* 0C40 */, /*2593*/{0,224u,1048577u,68190216u,940466184u,3758096416u,1078019340u,138443264u,262144u}/* 0C41 */, /*2594*/{0,224u,1048577u,68190216u,940466184u,3758096416u,1078019348u,138443264u,262144u}/* 0C42 */, /*2595*/{0,224u,1048577u,68190216u,940466184u,3758096416u,1078019356u,138443264u,262144u}/* 0C43 */, /*2596*/{0,224u,1048577u,68190216u,940466184u,3758096416u,1078019364u,138443264u,262144u}/* 0C44 */, /*2597*/{0,224u,1048577u,68202502u,672030728u,3774873616u,1078019384u,138443264u,262144u}/* 0C46 */, /*2598*/{0,224u,1048577u,68202502u,672030728u,3774873616u,1078019396u,138443264u,262144u}/* 0C47 */, /*2599*/{232783872u,224u,1048577u,68202534u,672030728u,3774873616u,1078019404u,138437120u,262144u}/* 0C48 */, /*2600*/{0,224u,1048577u,68202502u,672030728u,3774873616u,1078019412u,138443264u,262144u}/* 0C4A */, /*2601*/{0,224u,1048577u,68202502u,672030728u,3774873616u,1078019420u,138443264u,262144u}/* 0C4B */, /*2602*/{0,224u,1048577u,68202502u,672030728u,3774873616u,1078019428u,138443264u,262144u}/* 0C4C */, /*2603*/{0,224u,1048577u,336637958u,672030728u,1627398168u,1078019436u,138442752u,262144u}/* 0C4D */, /*2604*/{0,224u,1048577u,2215686150u,672030728u,3774873616u,1078019444u,138443264u,262144u}/* 0C55 */, /*2605*/{0,224u,1048578u,2282795014u,672030736u,3774873616u,1078019452u,138443264u,262144u}/* 0C56 */, /*2606*/{0,224u,1048577u,76873733u,1515560u,3758096416u,1677804516u,138442752u,393216u}/* 0C58 */, /*2607*/{0,224u,1048577u,76873733u,1515560u,3758096416u,1677804540u,138442752u,393216u}/* 0C59 */, /*2608*/{0,224u,1048577u,77103109u,1515560u,3758096416u,1677804772u,138442752u,393216u}/* 0C5A */, /*2609*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804396u,138442752u,393216u}/* 0C60 */, /*2610*/{0,224u,1048577u,76578821u,1515560u,3758096416u,1677804412u,138442752u,393216u}/* 0C61 */, /*2611*/{0,224u,1048577u,68497414u,672030728u,3774873616u,1078019372u,138443264u,262144u}/* 0C62 */, /*2612*/{0,224u,1048577u,68497414u,672030728u,3774873616u,1078019380u,138443264u,262144u}/* 0C63 */, /*2613*/{0,224u,34604033u,84967433u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 0C66 */, /*2614*/{0,224u,537921025u,84967433u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 0C67 */, /*2615*/{0,224u,571476481u,84967433u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 0C68 */, /*2616*/{0,224u,605030401u,84967433u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 0C69 */, /*2617*/{0,224u,638586881u,84967433u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 0C6A */, /*2618*/{0,224u,672140289u,84967433u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 0C6B */, /*2619*/{0,224u,705697281u,84967433u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 0C6C */, /*2620*/{0,224u,739249665u,84967433u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 0C6D */, /*2621*/{0,224u,772807681u,84967433u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 0C6E */, /*2622*/{0,224u,806360065u,84967433u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 0C6F */, /*2623*/{0,224u,34604033u,76883979u,8388650u,1610612768u,58661u,138442752u,0}/* 0C78 */, /*2624*/{0,224u,537921025u,76883979u,8388650u,1610612768u,58669u,138442752u,0}/* 0C79 */, /*2625*/{0,224u,571476481u,76883979u,8388650u,1610612768u,58677u,138442752u,0}/* 0C7A */, /*2626*/{0,224u,605030401u,76883979u,8388650u,1610612768u,58685u,138442752u,0}/* 0C7B */, /*2627*/{0,224u,1048577u,76873755u,40u,1610612768u,10652u,138442752u,67108864u}/* 0C7F */, /*2628*/{0,232u,1114113u,77135877u,1515560u,3758096416u,1677805372u,138442752u,393216u}/* 0C80 */, /*2629*/{0,232u,1114113u,68694022u,672030728u,3774873616u,1077936140u,822114816u,262144u}/* 0C81 */, /*2630*/{0,232u,1114113u,68190216u,940466184u,3758096416u,1077936140u,826309120u,262144u}/* 0C82 */, /*2631*/{0,232u,1114113u,68190216u,940466184u,3758096416u,1077936140u,830503424u,262144u}/* 0C83 */, /*2632*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677804932u,138442752u,393216u}/* 0C85 */, /*2633*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677804940u,138442752u,393216u}/* 0C86 */, /*2634*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677804948u,138442752u,393216u}/* 0C87 */, /*2635*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677804956u,138442752u,393216u}/* 0C88 */, /*2636*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677804964u,138442752u,393216u}/* 0C89 */, /*2637*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677804972u,138442752u,393216u}/* 0C8A */, /*2638*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677804980u,138442752u,393216u}/* 0C8B */, /*2639*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677804996u,138442752u,393216u}/* 0C8C */, /*2640*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805012u,138442752u,393216u}/* 0C8E */, /*2641*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805020u,138442752u,393216u}/* 0C8F */, /*2642*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805028u,138442752u,393216u}/* 0C90 */, /*2643*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805036u,138442752u,393216u}/* 0C92 */, /*2644*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805044u,138442752u,393216u}/* 0C93 */, /*2645*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805052u,138442752u,393216u}/* 0C94 */, /*2646*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805060u,138442752u,393216u}/* 0C95 */, /*2647*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805068u,138442752u,393216u}/* 0C96 */, /*2648*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805076u,138442752u,393216u}/* 0C97 */, /*2649*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805084u,138442752u,393216u}/* 0C98 */, /*2650*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805092u,138442752u,393216u}/* 0C99 */, /*2651*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805100u,138442752u,393216u}/* 0C9A */, /*2652*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805108u,138442752u,393216u}/* 0C9B */, /*2653*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805116u,138442752u,393216u}/* 0C9C */, /*2654*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805124u,138442752u,393216u}/* 0C9D */, /*2655*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805132u,138442752u,393216u}/* 0C9E */, /*2656*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805140u,138442752u,393216u}/* 0C9F */, /*2657*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805148u,138442752u,393216u}/* 0CA0 */, /*2658*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805156u,138442752u,393216u}/* 0CA1 */, /*2659*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805164u,138442752u,393216u}/* 0CA2 */, /*2660*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805172u,138442752u,393216u}/* 0CA3 */, /*2661*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805180u,138442752u,393216u}/* 0CA4 */, /*2662*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805188u,138442752u,393216u}/* 0CA5 */, /*2663*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805196u,138442752u,393216u}/* 0CA6 */, /*2664*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805204u,138442752u,393216u}/* 0CA7 */, /*2665*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805212u,138442752u,393216u}/* 0CA8 */, /*2666*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805220u,138442752u,393216u}/* 0CAA */, /*2667*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805228u,138442752u,393216u}/* 0CAB */, /*2668*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805236u,138442752u,393216u}/* 0CAC */, /*2669*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805244u,138442752u,393216u}/* 0CAD */, /*2670*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805252u,138442752u,393216u}/* 0CAE */, /*2671*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805260u,138442752u,393216u}/* 0CAF */, /*2672*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805268u,138442752u,393216u}/* 0CB0 */, /*2673*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805276u,138442752u,393216u}/* 0CB1 */, /*2674*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805284u,138442752u,393216u}/* 0CB2 */, /*2675*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805332u,138442752u,393216u}/* 0CB3 */, /*2676*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805292u,138442752u,393216u}/* 0CB5 */, /*2677*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805300u,138442752u,393216u}/* 0CB6 */, /*2678*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805308u,138442752u,393216u}/* 0CB7 */, /*2679*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805316u,138442752u,393216u}/* 0CB8 */, /*2680*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805324u,138442752u,393216u}/* 0CB9 */, /*2681*/{0,232u,1114113u,202616838u,672030728u,1627398160u,1077936140u,817920000u,262144u}/* 0CBC */, /*2682*/{0,232u,1114113u,76775429u,1515560u,3758096416u,1677805348u,138442752u,393216u}/* 0CBD */, /*2683*/{0,232u,1114113u,68190216u,940466184u,3758096416u,1078019908u,138443264u,262144u}/* 0CBE */, /*2684*/{0,232u,1114113u,68190214u,672030728u,3774873616u,1078019912u,138443264u,262144u}/* 0CBF */, /*2685*/{233308160u,232u,1114113u,68190248u,940466184u,3758096416u,1078019924u,138437120u,262144u}/* 0CC0 */, /*2686*/{0,232u,1114113u,68190216u,940466184u,3758096416u,1078019932u,138443264u,262144u}/* 0CC1 */, /*2687*/{0,232u,1114114u,68190216u,672030736u,3758096400u,1078019940u,138443392u,262144u}/* 0CC2 */, /*2688*/{0,232u,1114113u,68190216u,940466184u,3758096416u,1078019948u,138443264u,262144u}/* 0CC3 */, /*2689*/{0,232u,1114113u,68190216u,940466184u,3758096416u,1078019956u,138443264u,262144u}/* 0CC4 */, /*2690*/{0,232u,1114113u,68190214u,672030728u,3774873616u,1078019976u,138443264u,262144u}/* 0CC6 */, /*2691*/{233832448u,232u,1114113u,68190248u,940466184u,3758096416u,1078019988u,138437120u,262144u}/* 0CC7 */, /*2692*/{234356736u,232u,1114113u,68190248u,940466184u,3758096416u,1078019996u,138437120u,262144u}/* 0CC8 */, /*2693*/{234881024u,232u,1114113u,68190248u,940466184u,3758096416u,1078020000u,138437120u,262144u}/* 0CCA */, /*2694*/{235405312u,232u,1114113u,68190248u,940466184u,3758096416u,1078020012u,138437120u,262144u}/* 0CCB */, /*2695*/{0,232u,1114113u,68202502u,672030728u,3774873616u,1078020020u,138443264u,262144u}/* 0CCC */, /*2696*/{0,232u,1114113u,336637958u,672030728u,1627398168u,1078020028u,138442752u,262144u}/* 0CCD */, /*2697*/{0,232u,1114114u,68190216u,672030736u,3758096400u,1078020036u,138443392u,262144u}/* 0CD5 */, /*2698*/{0,232u,1114114u,68190216u,672030736u,3758096400u,1078020044u,138443392u,262144u}/* 0CD6 */, /*2699*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805340u,138442752u,393216u}/* 0CDE */, /*2700*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677804988u,138442752u,393216u}/* 0CE0 */, /*2701*/{0,232u,1114113u,76578821u,1515560u,3758096416u,1677805004u,138442752u,393216u}/* 0CE1 */, /*2702*/{0,232u,1114113u,68464646u,672030728u,3774873616u,1078019964u,138443264u,262144u}/* 0CE2 */, /*2703*/{0,232u,1114113u,68464646u,672030728u,3774873616u,1078019972u,138443264u,262144u}/* 0CE3 */, /*2704*/{0,232u,34669569u,84967433u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 0CE6 */, /*2705*/{0,232u,537986561u,84967433u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 0CE7 */, /*2706*/{0,232u,571542017u,84967433u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 0CE8 */, /*2707*/{0,232u,605095937u,84967433u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 0CE9 */, /*2708*/{0,232u,638652417u,84967433u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 0CEA */, /*2709*/{0,232u,672205825u,84967433u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 0CEB */, /*2710*/{0,232u,705762817u,84967433u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 0CEC */, /*2711*/{0,232u,739315201u,84967433u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 0CED */, /*2712*/{0,232u,772873217u,84967433u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 0CEE */, /*2713*/{0,232u,806425601u,84967433u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 0CEF */, /*2714*/{0,232u,1114113u,76840965u,1515560u,3758096416u,1677805356u,138442752u,393216u}/* 0CF1 */, /*2715*/{0,232u,1114113u,76840965u,1515560u,3758096416u,1677805364u,138442752u,393216u}/* 0CF2 */, /*2716*/{0,240u,1179649u,68792326u,672030728u,3774873616u,1077936140u,826309120u,262144u}/* 0D00 */, /*2717*/{0,240u,1179649u,68694022u,672030728u,3774873616u,1077936140u,822114816u,262144u}/* 0D01 */, /*2718*/{0,240u,1179649u,68190216u,940466184u,3758096416u,1077936140u,826309120u,262144u}/* 0D02 */, /*2719*/{0,240u,1179649u,68190216u,940466184u,3758096416u,1077936140u,830503424u,262144u}/* 0D03 */, /*2720*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805524u,138442752u,393216u}/* 0D05 */, /*2721*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805532u,138442752u,393216u}/* 0D06 */, /*2722*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805540u,138442752u,393216u}/* 0D07 */, /*2723*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805548u,138442752u,393216u}/* 0D08 */, /*2724*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805564u,138442752u,393216u}/* 0D09 */, /*2725*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805572u,138442752u,393216u}/* 0D0A */, /*2726*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805580u,138442752u,393216u}/* 0D0B */, /*2727*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805596u,138442752u,393216u}/* 0D0C */, /*2728*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805612u,138442752u,393216u}/* 0D0E */, /*2729*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805620u,138442752u,393216u}/* 0D0F */, /*2730*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805628u,138442752u,393216u}/* 0D10 */, /*2731*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805636u,138442752u,393216u}/* 0D12 */, /*2732*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805644u,138442752u,393216u}/* 0D13 */, /*2733*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805652u,138442752u,393216u}/* 0D14 */, /*2734*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805660u,138442752u,393216u}/* 0D15 */, /*2735*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805668u,138442752u,393216u}/* 0D16 */, /*2736*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805676u,138442752u,393216u}/* 0D17 */, /*2737*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805684u,138442752u,393216u}/* 0D18 */, /*2738*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805692u,138442752u,393216u}/* 0D19 */, /*2739*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805700u,138442752u,393216u}/* 0D1A */, /*2740*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805708u,138442752u,393216u}/* 0D1B */, /*2741*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805716u,138442752u,393216u}/* 0D1C */, /*2742*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805724u,138442752u,393216u}/* 0D1D */, /*2743*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805732u,138442752u,393216u}/* 0D1E */, /*2744*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805740u,138442752u,393216u}/* 0D1F */, /*2745*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805748u,138442752u,393216u}/* 0D20 */, /*2746*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805756u,138442752u,393216u}/* 0D21 */, /*2747*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805764u,138442752u,393216u}/* 0D22 */, /*2748*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805772u,138442752u,393216u}/* 0D23 */, /*2749*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805780u,138442752u,393216u}/* 0D24 */, /*2750*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805788u,138442752u,393216u}/* 0D25 */, /*2751*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805796u,138442752u,393216u}/* 0D26 */, /*2752*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805804u,138442752u,393216u}/* 0D27 */, /*2753*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805812u,138442752u,393216u}/* 0D28 */, /*2754*/{0,240u,1179649u,76939269u,1515560u,3758096416u,1677805820u,138442752u,393216u}/* 0D29 */, /*2755*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805828u,138442752u,393216u}/* 0D2A */, /*2756*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805836u,138442752u,393216u}/* 0D2B */, /*2757*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805844u,138442752u,393216u}/* 0D2C */, /*2758*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805852u,138442752u,393216u}/* 0D2D */, /*2759*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805860u,138442752u,393216u}/* 0D2E */, /*2760*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805868u,138442752u,393216u}/* 0D2F */, /*2761*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805876u,138442752u,393216u}/* 0D30 */, /*2762*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805948u,138442752u,393216u}/* 0D31 */, /*2763*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805884u,138442752u,393216u}/* 0D32 */, /*2764*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805932u,138442752u,393216u}/* 0D33 */, /*2765*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805940u,138442752u,393216u}/* 0D34 */, /*2766*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805892u,138442752u,393216u}/* 0D35 */, /*2767*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805900u,138442752u,393216u}/* 0D36 */, /*2768*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805908u,138442752u,393216u}/* 0D37 */, /*2769*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805916u,138442752u,393216u}/* 0D38 */, /*2770*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805924u,138442752u,393216u}/* 0D39 */, /*2771*/{0,240u,1179649u,76939269u,1515560u,3758096416u,1677805956u,138442752u,393216u}/* 0D3A */, /*2772*/{0,240u,1179649u,337227782u,672030728u,1627398168u,1078020628u,138459136u,262144u}/* 0D3B */, /*2773*/{0,240u,1179649u,76873733u,1515560u,3758096416u,1677805964u,138442752u,393216u}/* 0D3D */, /*2774*/{0,240u,1179650u,68190216u,672030736u,3758096400u,1078020500u,138443392u,262144u}/* 0D3E */, /*2775*/{0,240u,1179649u,68190216u,940466184u,3758096416u,1078020508u,138443264u,262144u}/* 0D3F */, /*2776*/{0,240u,1179649u,68190216u,940466184u,3758096416u,1078020516u,138443264u,262144u}/* 0D40 */, /*2777*/{0,240u,1179649u,68202502u,672030728u,3774873616u,1078020524u,138443264u,262144u}/* 0D41 */, /*2778*/{0,240u,1179649u,68202502u,672030728u,3774873616u,1078020532u,138443264u,262144u}/* 0D42 */, /*2779*/{0,240u,1179649u,68202502u,672030728u,3774873616u,1078020540u,138443264u,262144u}/* 0D43 */, /*2780*/{0,240u,1179649u,68497414u,672030728u,3774873616u,1078020548u,138443264u,262144u}/* 0D44 */, /*2781*/{0,240u,1179649u,68190216u,940466184u,3758096416u,1078020568u,138443264u,262144u}/* 0D46 */, /*2782*/{0,240u,1179649u,68190216u,940466184u,3758096416u,1078020576u,138443264u,262144u}/* 0D47 */, /*2783*/{0,240u,1179649u,68190216u,940466184u,3758096416u,1078020588u,138443264u,262144u}/* 0D48 */, /*2784*/{235929600u,240u,1179649u,68190248u,940466184u,3758096416u,1078020596u,138437120u,262144u}/* 0D4A */, /*2785*/{236453888u,240u,1179649u,68190248u,940466184u,3758096416u,1078020604u,138437120u,262144u}/* 0D4B */, /*2786*/{236978176u,240u,1179649u,68190248u,940466184u,3758096416u,1078020612u,138437120u,262144u}/* 0D4C */, /*2787*/{0,240u,1179649u,336637958u,672030728u,1627398168u,1078020628u,138442752u,262144u}/* 0D4D */, /*2788*/{0,240u,1179649u,76939269u,135733256u,3758096416u,1677890364u,272709632u,393216u}/* 0D4E */, /*2789*/{0,240u,1179649u,77135899u,40u,1610612768u,10660u,138442752u,67108864u}/* 0D4F */, /*2790*/{0,240u,1179649u,77135877u,1515560u,3758096416u,1677890348u,272709632u,393216u}/* 0D54 */, /*2791*/{0,240u,1179649u,77135877u,1515560u,3758096416u,1677890356u,272709632u,393216u}/* 0D55 */, /*2792*/{0,240u,1179649u,77135877u,1515560u,3758096416u,1677890428u,272709632u,393216u}/* 0D56 */, /*2793*/{0,240u,1179650u,68190216u,672030736u,3758096400u,1078020620u,138443392u,262144u}/* 0D57 */, /*2794*/{0,240u,51512833u,77135883u,12582954u,1610612768u,55429u,138442752u,0}/* 0D58 */, /*2795*/{0,240u,68290049u,77135883u,16777258u,1610612768u,55437u,138442752u,0}/* 0D59 */, /*2796*/{0,240u,85067777u,77135883u,20971562u,1610612768u,55445u,138442752u,0}/* 0D5A */, /*2797*/{0,240u,101844481u,77135883u,25165866u,1610612768u,55453u,138442752u,0}/* 0D5B */, /*2798*/{0,240u,152176129u,77135883u,37748778u,1610612768u,55461u,138442752u,0}/* 0D5C */, /*2799*/{0,240u,219285505u,77135883u,25165866u,1610612768u,55469u,138442752u,0}/* 0D5D */, /*2800*/{0,240u,269616641u,77135883u,58720298u,1610612768u,55477u,138442752u,0}/* 0D5E */, /*2801*/{0,240u,1179649u,77103109u,1515560u,3758096416u,1677805556u,138442752u,393216u}/* 0D5F */, /*2802*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805588u,138442752u,393216u}/* 0D60 */, /*2803*/{0,240u,1179649u,76578821u,1515560u,3758096416u,1677805604u,138442752u,393216u}/* 0D61 */, /*2804*/{0,240u,1179649u,68497414u,672030728u,3774873616u,1078020556u,138443264u,262144u}/* 0D62 */, /*2805*/{0,240u,1179649u,68497414u,672030728u,3774873616u,1078020564u,138443264u,262144u}/* 0D63 */, /*2806*/{0,240u,34735105u,84967433u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 0D66 */, /*2807*/{0,240u,538052097u,84967433u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 0D67 */, /*2808*/{0,240u,571607553u,84967433u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 0D68 */, /*2809*/{0,240u,605161473u,84967433u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 0D69 */, /*2810*/{0,240u,638717953u,84967433u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 0D6A */, /*2811*/{0,240u,672271361u,84967433u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 0D6B */, /*2812*/{0,240u,705828353u,84967433u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 0D6C */, /*2813*/{0,240u,739380737u,84967433u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 0D6D */, /*2814*/{0,240u,772938753u,84967433u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 0D6E */, /*2815*/{0,240u,806491137u,84967433u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 0D6F */, /*2816*/{0,240u,823271425u,76873739u,8388650u,1610612768u,55485u,138442752u,0}/* 0D70 */, /*2817*/{0,240u,1578267137u,76873739u,8388650u,1610612768u,55493u,138442752u,0}/* 0D71 */, /*2818*/{0,240u,1729266689u,76873739u,8388650u,1610612768u,55501u,138442752u,0}/* 0D72 */, /*2819*/{0,240u,286393857u,76873739u,62914602u,1610612768u,55509u,138442752u,0}/* 0D73 */, /*2820*/{0,240u,370279937u,76873739u,4194346u,1610612768u,55517u,138442752u,0}/* 0D74 */, /*2821*/{0,240u,454166529u,76873739u,62914602u,1610612768u,55525u,138442752u,0}/* 0D75 */, /*2822*/{0,240u,118621697u,77135883u,29360170u,1610612768u,55533u,138442752u,0}/* 0D76 */, /*2823*/{0,240u,185730561u,77135883u,46137386u,1610612768u,55541u,138442752u,0}/* 0D77 */, /*2824*/{0,240u,252839937u,77135883u,29360170u,1610612768u,55549u,138442752u,0}/* 0D78 */, /*2825*/{0,240u,1179649u,78970907u,40u,1610612768u,10668u,138442752u,67108864u}/* 0D79 */, /*2826*/{0,240u,1179649u,76873733u,1515560u,3758096416u,1677890260u,272709632u,393216u}/* 0D7A */, /*2827*/{0,240u,1179649u,76873733u,1515560u,3758096416u,1677890300u,272709632u,393216u}/* 0D7B */, /*2828*/{0,240u,1179649u,76873733u,1515560u,3758096416u,1677890364u,272709632u,393216u}/* 0D7C */, /*2829*/{0,240u,1179649u,76873733u,1515560u,3758096416u,1677890372u,272709632u,393216u}/* 0D7D */, /*2830*/{0,240u,1179649u,76873733u,1515560u,3758096416u,1677890420u,272709632u,393216u}/* 0D7E */, /*2831*/{0,240u,1179649u,76873733u,1515560u,3758096416u,1677890148u,272709632u,393216u}/* 0D7F */, /*2832*/{0,248u,1245185u,68288520u,940466184u,3758096416u,1077936140u,826309120u,262144u}/* 0D82 */, /*2833*/{0,248u,1245185u,68288520u,940466184u,3758096416u,1077936140u,830503424u,262144u}/* 0D83 */, /*2834*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806108u,138442752u,393216u}/* 0D85 */, /*2835*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806116u,138442752u,393216u}/* 0D86 */, /*2836*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806124u,138442752u,393216u}/* 0D87 */, /*2837*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806132u,138442752u,393216u}/* 0D88 */, /*2838*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806140u,138442752u,393216u}/* 0D89 */, /*2839*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806148u,138442752u,393216u}/* 0D8A */, /*2840*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806156u,138442752u,393216u}/* 0D8B */, /*2841*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806164u,138442752u,393216u}/* 0D8C */, /*2842*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806172u,138442752u,393216u}/* 0D8D */, /*2843*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806180u,138442752u,393216u}/* 0D8E */, /*2844*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806188u,138442752u,393216u}/* 0D8F */, /*2845*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806196u,138442752u,393216u}/* 0D90 */, /*2846*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806204u,138442752u,393216u}/* 0D91 */, /*2847*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806212u,138442752u,393216u}/* 0D92 */, /*2848*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806220u,138442752u,393216u}/* 0D93 */, /*2849*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806228u,138442752u,393216u}/* 0D94 */, /*2850*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806236u,138442752u,393216u}/* 0D95 */, /*2851*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806244u,138442752u,393216u}/* 0D96 */, /*2852*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806252u,138442752u,393216u}/* 0D9A */, /*2853*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806260u,138442752u,393216u}/* 0D9B */, /*2854*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806268u,138442752u,393216u}/* 0D9C */, /*2855*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806276u,138442752u,393216u}/* 0D9D */, /*2856*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806284u,138442752u,393216u}/* 0D9E */, /*2857*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806292u,138442752u,393216u}/* 0D9F */, /*2858*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806300u,138442752u,393216u}/* 0DA0 */, /*2859*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806308u,138442752u,393216u}/* 0DA1 */, /*2860*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806316u,138442752u,393216u}/* 0DA2 */, /*2861*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806324u,138442752u,393216u}/* 0DA3 */, /*2862*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806332u,138442752u,393216u}/* 0DA4 */, /*2863*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806340u,138442752u,393216u}/* 0DA5 */, /*2864*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806348u,138442752u,393216u}/* 0DA6 */, /*2865*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806356u,138442752u,393216u}/* 0DA7 */, /*2866*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806364u,138442752u,393216u}/* 0DA8 */, /*2867*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806372u,138442752u,393216u}/* 0DA9 */, /*2868*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806380u,138442752u,393216u}/* 0DAA */, /*2869*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806388u,138442752u,393216u}/* 0DAB */, /*2870*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806396u,138442752u,393216u}/* 0DAC */, /*2871*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806404u,138442752u,393216u}/* 0DAD */, /*2872*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806412u,138442752u,393216u}/* 0DAE */, /*2873*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806420u,138442752u,393216u}/* 0DAF */, /*2874*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806428u,138442752u,393216u}/* 0DB0 */, /*2875*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806436u,138442752u,393216u}/* 0DB1 */, /*2876*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806444u,138442752u,393216u}/* 0DB3 */, /*2877*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806452u,138442752u,393216u}/* 0DB4 */, /*2878*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806460u,138442752u,393216u}/* 0DB5 */, /*2879*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806468u,138442752u,393216u}/* 0DB6 */, /*2880*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806476u,138442752u,393216u}/* 0DB7 */, /*2881*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806484u,138442752u,393216u}/* 0DB8 */, /*2882*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806492u,138442752u,393216u}/* 0DB9 */, /*2883*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806500u,138442752u,393216u}/* 0DBA */, /*2884*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806508u,138442752u,393216u}/* 0DBB */, /*2885*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806516u,138442752u,393216u}/* 0DBD */, /*2886*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806524u,138442752u,393216u}/* 0DC0 */, /*2887*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806532u,138442752u,393216u}/* 0DC1 */, /*2888*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806540u,138442752u,393216u}/* 0DC2 */, /*2889*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806548u,138442752u,393216u}/* 0DC3 */, /*2890*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806556u,138442752u,393216u}/* 0DC4 */, /*2891*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806564u,138442752u,393216u}/* 0DC5 */, /*2892*/{0,248u,1245185u,76677125u,1515560u,3758096416u,1677806572u,138442752u,393216u}/* 0DC6 */, /*2893*/{0,248u,1245186u,336736262u,672030736u,1627398168u,1078021244u,138442752u,262144u}/* 0DCA */, /*2894*/{0,248u,1245186u,68288520u,672030736u,3758096400u,1078021108u,138443392u,262144u}/* 0DCF */, /*2895*/{0,248u,1245185u,68288520u,940466184u,3758096416u,1078021116u,138443264u,262144u}/* 0DD0 */, /*2896*/{0,248u,1245185u,68288520u,940466184u,3758096416u,1078021124u,138443264u,262144u}/* 0DD1 */, /*2897*/{0,248u,1245185u,68300806u,672030728u,3774873616u,1078021132u,138443264u,262144u}/* 0DD2 */, /*2898*/{0,248u,1245185u,68300806u,672030728u,3774873616u,1078021140u,138443264u,262144u}/* 0DD3 */, /*2899*/{0,248u,1245185u,68300806u,672030728u,3774873616u,1078021148u,138443264u,262144u}/* 0DD4 */, /*2900*/{0,248u,1245185u,68300806u,672030728u,3774873616u,1078021156u,138443264u,262144u}/* 0DD6 */, /*2901*/{0,248u,1245185u,68288520u,940466184u,3758096416u,1078021164u,138443264u,262144u}/* 0DD8 */, /*2902*/{0,248u,1245185u,68288520u,940466184u,3758096416u,1078021192u,138443264u,262144u}/* 0DD9 */, /*2903*/{237502464u,248u,1245185u,68288552u,940466184u,3758096416u,1078021204u,138437120u,262144u}/* 0DDA */, /*2904*/{0,248u,1245185u,68288520u,940466184u,3758096416u,1078021212u,138443264u,262144u}/* 0DDB */, /*2905*/{238026752u,248u,1245185u,68288552u,940466184u,3758096416u,1078021216u,138437120u,262144u}/* 0DDC */, /*2906*/{238551040u,248u,1245185u,68288552u,940466184u,3758096416u,1078021228u,138437120u,262144u}/* 0DDD */, /*2907*/{239075328u,248u,1245185u,68288552u,940466184u,3758096416u,1078021236u,138437120u,262144u}/* 0DDE */, /*2908*/{0,248u,1245186u,68288520u,672030736u,3758096400u,1078021180u,138443392u,262144u}/* 0DDF */, /*2909*/{0,248u,34800641u,85458953u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 0DE6 */, /*2910*/{0,248u,538117633u,85458953u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 0DE7 */, /*2911*/{0,248u,571673089u,85458953u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 0DE8 */, /*2912*/{0,248u,605227009u,85458953u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 0DE9 */, /*2913*/{0,248u,638783489u,85458953u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 0DEA */, /*2914*/{0,248u,672336897u,85458953u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 0DEB */, /*2915*/{0,248u,705893889u,85458953u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 0DEC */, /*2916*/{0,248u,739446273u,85458953u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 0DED */, /*2917*/{0,248u,773004289u,85458953u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 0DEE */, /*2918*/{0,248u,806556673u,85458953u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 0DEF */, /*2919*/{0,248u,1245185u,68288520u,940466184u,3758096416u,1078021172u,138443264u,262144u}/* 0DF2 */, /*2920*/{0,248u,1245185u,68288520u,940466184u,3758096416u,1078021188u,138443264u,262144u}/* 0DF3 */, /*2921*/{0,248u,1245185u,76677143u,40u,1610612768u,8100u,138442754u,0}/* 0DF4 */, /*2922*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816076u,138442752u,393216u}/* 0E01 */, /*2923*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816084u,138442752u,393216u}/* 0E02 */, /*2924*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816092u,138442752u,393216u}/* 0E03 */, /*2925*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816100u,138442752u,393216u}/* 0E04 */, /*2926*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816108u,138442752u,393216u}/* 0E05 */, /*2927*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816116u,138442752u,393216u}/* 0E06 */, /*2928*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816124u,138442752u,393216u}/* 0E07 */, /*2929*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816132u,138442752u,393216u}/* 0E08 */, /*2930*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816140u,138442752u,393216u}/* 0E09 */, /*2931*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816148u,138442752u,393216u}/* 0E0A */, /*2932*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816156u,138442752u,393216u}/* 0E0B */, /*2933*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816164u,138442752u,393216u}/* 0E0C */, /*2934*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816172u,138442752u,393216u}/* 0E0D */, /*2935*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816180u,138442752u,393216u}/* 0E0E */, /*2936*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816188u,138442752u,393216u}/* 0E0F */, /*2937*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816196u,138442752u,393216u}/* 0E10 */, /*2938*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816204u,138442752u,393216u}/* 0E11 */, /*2939*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816212u,138442752u,393216u}/* 0E12 */, /*2940*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816220u,138442752u,393216u}/* 0E13 */, /*2941*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816228u,138442752u,393216u}/* 0E14 */, /*2942*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816236u,138442752u,393216u}/* 0E15 */, /*2943*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816244u,138442752u,393216u}/* 0E16 */, /*2944*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816252u,138442752u,393216u}/* 0E17 */, /*2945*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816260u,138442752u,393216u}/* 0E18 */, /*2946*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816268u,138442752u,393216u}/* 0E19 */, /*2947*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816276u,138442752u,393216u}/* 0E1A */, /*2948*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816284u,138442752u,393216u}/* 0E1B */, /*2949*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816292u,138442752u,393216u}/* 0E1C */, /*2950*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816300u,138442752u,393216u}/* 0E1D */, /*2951*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816308u,138442752u,393216u}/* 0E1E */, /*2952*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816316u,138442752u,393216u}/* 0E1F */, /*2953*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816324u,138442752u,393216u}/* 0E20 */, /*2954*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816332u,138442752u,393216u}/* 0E21 */, /*2955*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816340u,138442752u,393216u}/* 0E22 */, /*2956*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816348u,138442752u,393216u}/* 0E23 */, /*2957*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816356u,138442752u,393216u}/* 0E24 */, /*2958*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816364u,138442752u,393216u}/* 0E25 */, /*2959*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816372u,138442752u,393216u}/* 0E26 */, /*2960*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816380u,138442752u,393216u}/* 0E27 */, /*2961*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816388u,138442752u,393216u}/* 0E28 */, /*2962*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816396u,138442752u,393216u}/* 0E29 */, /*2963*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816404u,138442752u,393216u}/* 0E2A */, /*2964*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816412u,138442752u,393216u}/* 0E2B */, /*2965*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816420u,138442752u,393216u}/* 0E2C */, /*2966*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816428u,138442752u,393216u}/* 0E2D */, /*2967*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816436u,138442752u,393216u}/* 0E2E */, /*2968*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816444u,138442752u,393216u}/* 0E2F */, /*2969*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816452u,138442752u,393216u}/* 0E30 */, /*2970*/{0,256u,1310721u,92319750u,672030728u,3774873616u,1078030988u,138443264u,262144u}/* 0E31 */, /*2971*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816468u,138442752u,393216u}/* 0E32 */, /*2972*/{239599616u,256u,1310721u,92307525u,939597824u,3758620704u,1677816476u,138440704u,262144u}/* 0E33 */, /*2973*/{0,256u,1310721u,92319750u,672030728u,3774873616u,1078031012u,138443264u,262144u}/* 0E34 */, /*2974*/{0,256u,1310721u,92319750u,672030728u,3774873616u,1078031020u,138443264u,262144u}/* 0E35 */, /*2975*/{0,256u,1310721u,92319750u,672030728u,3774873616u,1078031028u,138443264u,262144u}/* 0E36 */, /*2976*/{0,256u,1310721u,92319750u,672030728u,3774873616u,1078031036u,138443264u,262144u}/* 0E37 */, /*2977*/{0,256u,1310721u,2374021126u,672030728u,3774873616u,1078031044u,138443264u,262144u}/* 0E38 */, /*2978*/{0,256u,1310721u,2374021126u,672030728u,3774873616u,1078031052u,138443264u,262144u}/* 0E39 */, /*2979*/{0,256u,1310721u,360755206u,672030728u,3774873624u,1078031060u,138443264u,262144u}/* 0E3A */, /*2980*/{0,256u,65537u,77631513u,40u,1610612768u,58396u,138442752u,67108864u}/* 0E3F */, /*2981*/{0,256u,1310721u,92307461u,73768u,3758096416u,1694593752u,138442752u,393216u}/* 0E40 */, /*2982*/{0,256u,1310721u,92307461u,73768u,3758096416u,1694593760u,138442752u,393216u}/* 0E41 */, /*2983*/{0,256u,1310721u,92307461u,73768u,3758096416u,1694593768u,138442752u,393216u}/* 0E42 */, /*2984*/{0,256u,1310721u,92307461u,73768u,3758096416u,1694593776u,138442752u,393216u}/* 0E43 */, /*2985*/{0,256u,1310721u,92307461u,73768u,3758096416u,1694593784u,138442752u,393216u}/* 0E44 */, /*2986*/{0,256u,1310721u,92307461u,73768u,3758096416u,1677816580u,138442752u,393216u}/* 0E45 */, /*2987*/{0,256u,1310721u,92307460u,73768u,3774873760u,1677779716u,138442752u,393216u}/* 0E46 */, /*2988*/{0,256u,1310721u,92319750u,672030728u,1627398160u,1077936140u,889223168u,262144u}/* 0E47 */, /*2989*/{0,256u,1310721u,2441129990u,672030728u,1627398160u,1077936140u,893417472u,262144u}/* 0E48 */, /*2990*/{0,256u,1310721u,2441129990u,672030728u,1627398160u,1077936140u,897611776u,262144u}/* 0E49 */, /*2991*/{0,256u,1310721u,2441129990u,672030728u,1627398160u,1077936140u,901806080u,262144u}/* 0E4A */, /*2992*/{0,256u,1310721u,2441129990u,672030728u,1627398160u,1077936140u,906000384u,262144u}/* 0E4B */, /*2993*/{0,256u,1310721u,92319750u,672030728u,1627398160u,1077936140u,910194688u,262144u}/* 0E4C */, /*2994*/{0,256u,1310721u,92319750u,672030728u,3774873616u,1077936136u,914389504u,262144u}/* 0E4D */, /*2995*/{0,256u,1310721u,92319750u,672030728u,1627398160u,1077936140u,885028864u,262144u}/* 0E4E */, /*2996*/{0,256u,1310721u,76578839u,40u,1610612768u,8108u,138442754u,0}/* 0E4F */, /*2997*/{0,256u,34866177u,84967433u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 0E50 */, /*2998*/{0,256u,538183169u,84967433u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 0E51 */, /*2999*/{0,256u,571738625u,84967433u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 0E52 */, /*3000*/{0,256u,605292545u,84967433u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 0E53 */, /*3001*/{0,256u,638849025u,84967433u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 0E54 */, /*3002*/{0,256u,672402433u,84967433u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 0E55 */, /*3003*/{0,256u,705959425u,84967433u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 0E56 */, /*3004*/{0,256u,739511809u,84967433u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 0E57 */, /*3005*/{0,256u,773069825u,84967433u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 0E58 */, /*3006*/{0,256u,806622209u,84967433u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 0E59 */, /*3007*/{0,256u,1310721u,69238807u,40u,1610612768u,8116u,138442754u,8388608u}/* 0E5A */, /*3008*/{0,256u,1310721u,69238807u,40u,1610612768u,8124u,138442754u,8388608u}/* 0E5B */, /*3009*/{0,264u,1376257u,92307461u,73768u,3758096416u,1677816596u,138442752u,393216u}/* 0E81 */, /*3010*/{0,264u,1376257u,92307461u,73768u,3758096416u,1677816604u,138442752u,393216u}/* 0E82 */, /*3011*/{0,264u,1376257u,92307461u,73768u,3758096416u,1677816612u,138442752u,393216u}/* 0E84 */, /*3012*/{0,264u,1376257u,92307461u,73768u,3758096416u,1677816620u,138442752u,393216u}/* 0E87 */, /*3013*/{0,264u,1376257u,92307461u,73768u,3758096416u,1677816628u,138442752u,393216u}/* 0E88 */, /*3014*/{0,264u,1376257u,92307461u,73768u,3758096416u,1677816644u,138442752u,393216u}/* 0E8A */, /*3015*/{0,264u,1376257u,92307461u,73768u,3758096416u,1677816660u,138442752u,393216u}/* 0E8D */, /*3016*/{0,264u,1376257u,92307461u,73768u,3758096416u,1677816668u,138442752u,393216u}/* 0E94 */, /*3017*/{0,264u,1376257u,92307461u,73768u,3758096416u,1677816676u,138442752u,393216u}/* 0E95 */, /*3018*/{0,264u,1376257u,92307461u,73768u,3758096416u,1677816684u,138442752u,393216u}/* 0E96 */, /*3019*/{0,264u,1376257u,92307461u,73768u,3758096416u,1677816692u,138442752u,393216u}/* 0E97 */, /*3020*/{0,264u,1376257u,92307461u,73768u,3758096416u,1677816700u,138442752u,393216u}/* 0E99 */, /*3021*/{0,264u,1376257u,92307461u,73768u,3758096416u,1677816708u,138442752u,393216u}/* 0E9A */, /*3022*/{0,264u,1376257u,92307461u,73768u,3758096416u,1677816716u,138442752u,393216u}/* 0E9B */, /*3023*/{0,264u,1376257u,92307461u,73768u,3758096416u,1677816724u,138442752u,393216u}/* 0E9C */, /*3024*/{0,264u,1376257u,92307461u,73768u,3758096416u,1677816732u,138442752u,393216u}/* 0E9D */, /*3025*/{0,264u,1376257u,92307461u,73768u,3758096416u,1677816740u,138442752u,393216u}/* 0E9E */, /*3026*/{0,264u,1376257u,92307461u,73768u,3758096416u,1677816748u,138442752u,393216u}/* 0E9F */, /*3027*/{0,264u,1376257u,92307461u,73768u,3758096416u,1677816756u,138442752u,393216u}/* 0EA1 */, /*3028*/{0,264u,1376257u,92307461u,73768u,3758096416u,1677816764u,138442752u,393216u}/* 0EA2 */, /*3029*/{0,264u,1376257u,92307461u,73768u,3758096416u,1677816772u,138442752u,393216u}/* 0EA3 */, /*3030*/{0,264u,1376257u,92307461u,73768u,3758096416u,1677816780u,138442752u,393216u}/* 0EA5 */, /*3031*/{0,264u,1376257u,92307461u,73768u,3758096416u,1677816788u,138442752u,393216u}/* 0EA7 */, /*3032*/{0,264u,1376257u,92307461u,73768u,3758096416u,1677816636u,138442752u,393216u}/* 0EAA */, /*3033*/{0,264u,1376257u,92307461u,73768u,3758096416u,1677816796u,138442752u,393216u}/* 0EAB */, /*3034*/{0,264u,1376257u,92307461u,73768u,3758096416u,1677816804u,138442752u,393216u}/* 0EAD */, /*3035*/{0,264u,1376257u,92307461u,73768u,3758096416u,1677816812u,138442752u,393216u}/* 0EAE */, /*3036*/{0,264u,1376257u,92307461u,73768u,3758096416u,1677816820u,138442752u,393216u}/* 0EAF */, /*3037*/{0,264u,1376257u,92307461u,73768u,3758096416u,1677816828u,138442752u,393216u}/* 0EB0 */, /*3038*/{0,264u,1376257u,92319750u,672030728u,3774873616u,1078031364u,138443264u,262144u}/* 0EB1 */, /*3039*/{0,264u,1376257u,92307461u,73768u,3758096416u,1677816844u,138442752u,393216u}/* 0EB2 */, /*3040*/{240123904u,264u,1376257u,92307525u,939597824u,3758620704u,1677816852u,138440704u,262144u}/* 0EB3 */, /*3041*/{0,264u,1376257u,92319750u,672030728u,3774873616u,1078031388u,138443264u,262144u}/* 0EB4 */, /*3042*/{0,264u,1376257u,92319750u,672030728u,3774873616u,1078031396u,138443264u,262144u}/* 0EB5 */, /*3043*/{0,264u,1376257u,92319750u,672030728u,3774873616u,1078031404u,138443264u,262144u}/* 0EB6 */, /*3044*/{0,264u,1376257u,92319750u,672030728u,3774873616u,1078031412u,138443264u,262144u}/* 0EB7 */, /*3045*/{0,264u,1376257u,2508238854u,672030728u,3774873616u,1078031420u,138443264u,262144u}/* 0EB8 */, /*3046*/{0,264u,1376257u,2508238854u,672030728u,3774873616u,1078031428u,138443264u,262144u}/* 0EB9 */, /*3047*/{0,264u,1376257u,92319750u,672030728u,3774873616u,1078031436u,138443264u,262144u}/* 0EBB */, /*3048*/{0,264u,1376257u,92319750u,672030728u,3774873616u,1078031444u,138443264u,262144u}/* 0EBC */, /*3049*/{0,264u,1376257u,92307461u,73768u,3758096416u,1677816924u,138442752u,393216u}/* 0EBD */, /*3050*/{0,264u,1376257u,92307461u,73768u,3758096416u,1694594144u,138442752u,393216u}/* 0EC0 */, /*3051*/{0,264u,1376257u,92307461u,73768u,3758096416u,1694594152u,138442752u,393216u}/* 0EC1 */, /*3052*/{0,264u,1376257u,92307461u,73768u,3758096416u,1694594160u,138442752u,393216u}/* 0EC2 */, /*3053*/{0,264u,1376257u,92307461u,73768u,3758096416u,1694594168u,138442752u,393216u}/* 0EC3 */, /*3054*/{0,264u,1376257u,92307461u,73768u,3758096416u,1694594176u,138442752u,393216u}/* 0EC4 */, /*3055*/{0,264u,1376257u,92307460u,73768u,3774873760u,1677779724u,138442752u,393216u}/* 0EC6 */, /*3056*/{0,264u,1376257u,2575347718u,672030728u,1627398160u,1077936140u,918583296u,262144u}/* 0EC8 */, /*3057*/{0,264u,1376257u,2575347718u,672030728u,1627398160u,1077936140u,922777600u,262144u}/* 0EC9 */, /*3058*/{0,264u,1376257u,2575347718u,672030728u,1627398160u,1077936140u,926971904u,262144u}/* 0ECA */, /*3059*/{0,264u,1376257u,2575347718u,672030728u,1627398160u,1077936140u,931166208u,262144u}/* 0ECB */, /*3060*/{0,264u,1376257u,92319750u,672030728u,1627398160u,1077936140u,935360512u,262144u}/* 0ECC */, /*3061*/{0,264u,1376257u,92319750u,672030728u,3774873616u,1077936136u,939555328u,262144u}/* 0ECD */, /*3062*/{0,264u,34931713u,84967433u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 0ED0 */, /*3063*/{0,264u,538248705u,84967433u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 0ED1 */, /*3064*/{0,264u,571804161u,84967433u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 0ED2 */, /*3065*/{0,264u,605358081u,84967433u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 0ED3 */, /*3066*/{0,264u,638914561u,84967433u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 0ED4 */, /*3067*/{0,264u,672467969u,84967433u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 0ED5 */, /*3068*/{0,264u,706024961u,84967433u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 0ED6 */, /*3069*/{0,264u,739577345u,84967433u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 0ED7 */, /*3070*/{0,264u,773135361u,84967433u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 0ED8 */, /*3071*/{0,264u,806687745u,84967433u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 0ED9 */, /*3072*/{240648192u,264u,1376257u,92307525u,73760u,3758620704u,1677911884u,272707584u,393216u}/* 0EDC */, /*3073*/{241172480u,264u,1376257u,92307525u,73760u,3758620704u,1677911940u,272707584u,393216u}/* 0EDD */, /*3074*/{0,264u,1376257u,92700677u,73768u,3758096416u,1677816588u,138442752u,393216u}/* 0EDE */, /*3075*/{0,264u,1376257u,92700677u,73768u,3758096416u,1677816652u,138442752u,393216u}/* 0EDF */, /*3076*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677914708u,1094825984u,393216u}/* 0F00 */, /*3077*/{0,272u,1441793u,90243099u,40u,1610612768u,10732u,138442752u,67108864u}/* 0F01 */, /*3078*/{0,272u,1441793u,90243099u,40u,1610612768u,10740u,138442752u,67108864u}/* 0F02 */, /*3079*/{0,272u,1441793u,90243099u,40u,1610612768u,10748u,138442752u,67108864u}/* 0F03 */, /*3080*/{0,272u,1441793u,90243095u,40u,1610612768u,8148u,138442754u,0}/* 0F04 */, /*3081*/{0,272u,1441793u,76611607u,40u,1610612768u,8156u,138442754u,0}/* 0F05 */, /*3082*/{0,272u,1441793u,90243095u,40u,1610612768u,8164u,138442754u,0}/* 0F06 */, /*3083*/{0,272u,1441793u,90243095u,40u,1610612768u,8172u,138442754u,0}/* 0F07 */, /*3084*/{0,272u,1441793u,88145943u,40u,1610612768u,8180u,138442754u,8388608u}/* 0F08 */, /*3085*/{0,272u,1441793u,90243095u,40u,1610612768u,8188u,138442754u,0}/* 0F09 */, /*3086*/{0,272u,1441793u,90243095u,40u,1610612768u,8196u,138442754u,0}/* 0F0A */, /*3087*/{0,272u,1441793u,69271575u,40u,1610612768u,8220u,138442754u,0}/* 0F0B */, /*3088*/{241696768u,272u,1441793u,88146071u,32u,1611137056u,8220u,138645506u,0}/* 0F0C */, /*3089*/{0,272u,1441793u,74514455u,40u,1610612768u,8228u,138442754u,8388608u}/* 0F0D */, /*3090*/{0,272u,1441793u,74514455u,40u,1610612768u,8236u,138442754u,8388608u}/* 0F0E */, /*3091*/{0,272u,1441793u,74514455u,40u,1610612768u,8244u,138442754u,8388608u}/* 0F0F */, /*3092*/{0,272u,1441793u,74514455u,40u,1610612768u,8252u,138442754u,8388608u}/* 0F10 */, /*3093*/{0,272u,1441793u,74514455u,40u,1610612768u,8260u,138442754u,8388608u}/* 0F11 */, /*3094*/{0,272u,1441793u,88145943u,40u,1610612768u,8268u,138442754u,8388608u}/* 0F12 */, /*3095*/{0,272u,1441793u,76611611u,40u,1610612768u,10756u,138442752u,67108864u}/* 0F13 */, /*3096*/{0,272u,1441793u,74514455u,40u,1610612768u,4820u,138442754u,0}/* 0F14 */, /*3097*/{0,272u,1441793u,76611611u,40u,1610612768u,10764u,138442752u,67108864u}/* 0F15 */, /*3098*/{0,272u,1441793u,76611611u,40u,1610612768u,10772u,138442752u,67108864u}/* 0F16 */, /*3099*/{0,272u,1441793u,76611611u,40u,1610612768u,10780u,138442752u,67108864u}/* 0F17 */, /*3100*/{0,272u,1441793u,3088134150u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* 0F18 */, /*3101*/{0,272u,1441793u,76611611u,40u,1610612768u,10788u,138442752u,67108864u}/* 0F1A */, /*3102*/{0,272u,1441793u,76611611u,40u,1610612768u,10796u,138442752u,67108864u}/* 0F1B */, /*3103*/{0,272u,1441793u,76611611u,40u,1610612768u,10804u,138442752u,67108864u}/* 0F1C */, /*3104*/{0,272u,1441793u,76611611u,40u,1610612768u,10812u,138442752u,67108864u}/* 0F1D */, /*3105*/{0,272u,1441793u,76611611u,40u,1610612768u,10820u,138442752u,67108864u}/* 0F1E */, /*3106*/{0,272u,1441793u,76611611u,40u,1610612768u,10828u,138442752u,67108864u}/* 0F1F */, /*3107*/{0,272u,34997249u,85000201u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 0F20 */, /*3108*/{0,272u,538314241u,85000201u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 0F21 */, /*3109*/{0,272u,571869697u,85000201u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 0F22 */, /*3110*/{0,272u,605423617u,85000201u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 0F23 */, /*3111*/{0,272u,638980097u,85000201u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 0F24 */, /*3112*/{0,272u,672533505u,85000201u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 0F25 */, /*3113*/{0,272u,706090497u,85000201u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 0F26 */, /*3114*/{0,272u,739642881u,85000201u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 0F27 */, /*3115*/{0,272u,773200897u,85000201u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 0F28 */, /*3116*/{0,272u,806753281u,85000201u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 0F29 */, /*3117*/{0,272u,370542081u,76611595u,4194346u,1610612768u,58669u,138459136u,0}/* 0F2A */, /*3118*/{0,272u,555091969u,76611595u,4194346u,1610612768u,58677u,138459136u,0}/* 0F2B */, /*3119*/{0,272u,588647425u,76611595u,4194346u,1610612768u,58685u,138459136u,0}/* 0F2C */, /*3120*/{0,272u,622202369u,76611595u,4194346u,1610612768u,58693u,138459136u,0}/* 0F2D */, /*3121*/{0,272u,655758337u,76611595u,4194346u,1610612768u,58701u,138459136u,0}/* 0F2E */, /*3122*/{0,272u,689312257u,76611595u,4194346u,1610612768u,58709u,138459136u,0}/* 0F2F */, /*3123*/{0,272u,722868225u,76611595u,4194346u,1610612768u,58717u,138459136u,0}/* 0F30 */, /*3124*/{0,272u,756423169u,76611595u,4194346u,1610612768u,58725u,138459136u,0}/* 0F31 */, /*3125*/{0,272u,789978625u,76611595u,4194346u,1610612768u,58733u,138459136u,0}/* 0F32 */, /*3126*/{0,272u,18219521u,76611595u,4194346u,1610612768u,58661u,138459136u,0}/* 0F33 */, /*3127*/{0,272u,1441793u,69271579u,40u,1610612768u,10836u,138442752u,67108864u}/* 0F34 */, /*3128*/{0,272u,1441793u,76611611u,40u,1610612768u,10844u,138442752u,67108864u}/* 0F36 */, /*3129*/{0,272u,1441793u,76611611u,40u,1610612768u,10852u,138442752u,67108864u}/* 0F38 */, /*3130*/{0,272u,1441793u,2953916422u,672030728u,1627398160u,1077936140u,952137728u,262144u}/* 0F39 */, /*3131*/{0,45328u,1441793u,79767572u,106536u,1744830496u,6396u,138442754u,0}/* 0F3A */, /*3132*/{0,49424u,1441793u,86059029u,106536u,1744830496u,6404u,138442754u,0}/* 0F3B */, /*3133*/{0,53520u,1441793u,79767572u,106536u,1744830496u,6412u,138442754u,0}/* 0F3C */, /*3134*/{0,57616u,1441793u,86059029u,106536u,1744830496u,6420u,138442754u,0}/* 0F3D */, /*3135*/{0,272u,1441793u,68222984u,940466184u,1610620960u,1077936140u,4208640u,262144u}/* 0F3E */, /*3136*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677817508u,138442752u,393216u}/* 0F40 */, /*3137*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677817532u,138442752u,393216u}/* 0F41 */, /*3138*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677817548u,138442752u,393216u}/* 0F42 */, /*3139*/{242221056u,272u,1441792u,76611621u,1515520u,3758620768u,1677913996u,272670720u,393216u}/* 0F43 */, /*3140*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677817564u,138442752u,393216u}/* 0F44 */, /*3141*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677817580u,138442752u,393216u}/* 0F45 */, /*3142*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677817596u,138442752u,393216u}/* 0F46 */, /*3143*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677817612u,138442752u,393216u}/* 0F47 */, /*3144*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677817628u,138442752u,393216u}/* 0F49 */, /*3145*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677817644u,138442752u,393216u}/* 0F4A */, /*3146*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677817660u,138442752u,393216u}/* 0F4B */, /*3147*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677817676u,138442752u,393216u}/* 0F4C */, /*3148*/{242745344u,272u,1441792u,76611621u,1515520u,3758620768u,1677914124u,272670720u,393216u}/* 0F4D */, /*3149*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677817692u,138442752u,393216u}/* 0F4E */, /*3150*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677817708u,138442752u,393216u}/* 0F4F */, /*3151*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677817724u,138442752u,393216u}/* 0F50 */, /*3152*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677817740u,138442752u,393216u}/* 0F51 */, /*3153*/{243269632u,272u,1441792u,76611621u,1515520u,3758620768u,1677914188u,272670720u,393216u}/* 0F52 */, /*3154*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677817756u,138442752u,393216u}/* 0F53 */, /*3155*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677817772u,138442752u,393216u}/* 0F54 */, /*3156*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677817788u,138442752u,393216u}/* 0F55 */, /*3157*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677817804u,138442752u,393216u}/* 0F56 */, /*3158*/{243793920u,272u,1441792u,76611621u,1515520u,3758620768u,1677914252u,272670720u,393216u}/* 0F57 */, /*3159*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677817820u,138442752u,393216u}/* 0F58 */, /*3160*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677817836u,138442752u,393216u}/* 0F59 */, /*3161*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677817852u,138442752u,393216u}/* 0F5A */, /*3162*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677817868u,138442752u,393216u}/* 0F5B */, /*3163*/{244318208u,272u,1441792u,76611621u,1515520u,3758620768u,1677914316u,272670720u,393216u}/* 0F5C */, /*3164*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677817884u,138442752u,393216u}/* 0F5D */, /*3165*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677817900u,138442752u,393216u}/* 0F5E */, /*3166*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677817916u,138442752u,393216u}/* 0F5F */, /*3167*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677817932u,138442752u,393216u}/* 0F60 */, /*3168*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677817948u,138442752u,393216u}/* 0F61 */, /*3169*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677817964u,138442752u,393216u}/* 0F62 */, /*3170*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677817988u,138442752u,393216u}/* 0F63 */, /*3171*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677818004u,138442752u,393216u}/* 0F64 */, /*3172*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677818020u,138442752u,393216u}/* 0F65 */, /*3173*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677818036u,138442752u,393216u}/* 0F66 */, /*3174*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677818052u,138442752u,393216u}/* 0F67 */, /*3175*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677818068u,138442752u,393216u}/* 0F68 */, /*3176*/{244842496u,272u,1441792u,76611621u,1515520u,3758620768u,1677913924u,272670720u,393216u}/* 0F69 */, /*3177*/{0,272u,1441793u,76677125u,1515560u,3758096416u,1677817964u,1287731200u,393216u}/* 0F6A */, /*3178*/{0,272u,1441793u,76873733u,1515560u,3758096416u,1677817524u,138442752u,393216u}/* 0F6B */, /*3179*/{0,272u,1441793u,76873733u,1515560u,3758096416u,1677817980u,138442752u,393216u}/* 0F6C */, /*3180*/{0,272u,1441793u,2618372102u,672030728u,3774873616u,1078032672u,138443264u,262144u}/* 0F71 */, /*3181*/{0,272u,1441793u,2685480966u,672030728u,3774873616u,1078032684u,138443264u,262144u}/* 0F72 */, /*3182*/{245366784u,272u,1441792u,68235302u,672030720u,3775397968u,1078032692u,138437120u,262144u}/* 0F73 */, /*3183*/{0,272u,1441793u,2752589830u,672030728u,3774873616u,1078032716u,138443264u,262144u}/* 0F74 */, /*3184*/{245891072u,272u,1441792u,68235302u,672030720u,3775397968u,1078032724u,138437120u,262144u}/* 0F75 */, /*3185*/{246415360u,272u,1441792u,68235302u,672030720u,3775397968u,1078032732u,138437120u,262144u}/* 0F76 */, /*3186*/{246939648u,272u,1441793u,68235334u,672030720u,3775414288u,1078032740u,138441216u,262144u}/* 0F77 */, /*3187*/{247463936u,272u,1441792u,68235302u,672030720u,3775397968u,1078032748u,138437120u,262144u}/* 0F78 */, /*3188*/{247988224u,272u,1441793u,68235334u,672030720u,3775414288u,1078032756u,138441216u,262144u}/* 0F79 */, /*3189*/{0,272u,1441793u,2685480966u,672030728u,3774873616u,1078032764u,138443264u,262144u}/* 0F7A */, /*3190*/{0,272u,1441793u,2685480966u,672030728u,3774873616u,1078032772u,138443264u,262144u}/* 0F7B */, /*3191*/{0,272u,1441793u,2685480966u,672030728u,3774873616u,1078032780u,138443264u,262144u}/* 0F7C */, /*3192*/{0,272u,1441793u,2685480966u,672030728u,3774873616u,1078032788u,138443264u,262144u}/* 0F7D */, /*3193*/{0,272u,1441793u,68235270u,672030728u,3774873616u,1077936140u,826309120u,262144u}/* 0F7E */, /*3194*/{0,272u,1441793u,69271560u,940466184u,3758096416u,1077936140u,830503424u,262144u}/* 0F7F */, /*3195*/{0,272u,1441793u,2685480966u,672030728u,3774873616u,1078032700u,138443264u,262144u}/* 0F80 */, /*3196*/{248512512u,272u,1441792u,68235302u,672030720u,3775397968u,1078032708u,138437120u,262144u}/* 0F81 */, /*3197*/{0,272u,1441793u,3423678470u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* 0F82 */, /*3198*/{0,272u,1441793u,336670726u,672030728u,1627398168u,1078032796u,138442752u,262144u}/* 0F84 */, /*3199*/{0,272u,1441793u,69271575u,40u,1610612768u,8276u,138442754u,0}/* 0F85 */, /*3200*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677818084u,138442752u,393216u}/* 0F88 */, /*3201*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677818100u,138442752u,393216u}/* 0F89 */, /*3202*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677818132u,138442752u,393216u}/* 0F8A */, /*3203*/{0,272u,1441793u,76611589u,1515560u,3758096416u,1677818140u,138442752u,393216u}/* 0F8B */, /*3204*/{0,272u,1441793u,76939269u,1515560u,3758096416u,1677818116u,138442752u,393216u}/* 0F8C */, /*3205*/{0,272u,1441793u,68562950u,672030728u,3774873616u,1078032620u,138443264u,262144u}/* 0F8D */, /*3206*/{0,272u,1441793u,68562950u,672030728u,3774873616u,1078032636u,138443264u,262144u}/* 0F8E */, /*3207*/{0,272u,1441793u,68562950u,672030728u,3774873616u,1078032652u,138443264u,262144u}/* 0F8F */, /*3208*/{0,272u,1441793u,68235270u,672030728u,3774873616u,1078032044u,138443264u,262144u}/* 0F90 */, /*3209*/{0,272u,1441793u,68235270u,672030728u,3774873616u,1078032068u,138443264u,262144u}/* 0F91 */, /*3210*/{0,272u,1441793u,68235270u,672030728u,3774873616u,1078032084u,138443264u,262144u}/* 0F92 */, /*3211*/{249036800u,272u,1441792u,68235302u,672030720u,3775397968u,1078128532u,272671232u,262144u}/* 0F93 */, /*3212*/{0,272u,1441793u,68235270u,672030728u,3774873616u,1078032100u,138443264u,262144u}/* 0F94 */, /*3213*/{0,272u,1441793u,68235270u,672030728u,3774873616u,1078032116u,138443264u,262144u}/* 0F95 */, /*3214*/{0,272u,1441793u,68300806u,672030728u,3774873616u,1078032132u,138443264u,262144u}/* 0F96 */, /*3215*/{0,272u,1441793u,68235270u,672030728u,3774873616u,1078032148u,138443264u,262144u}/* 0F97 */, /*3216*/{0,272u,1441793u,68235270u,672030728u,3774873616u,1078032164u,138443264u,262144u}/* 0F99 */, /*3217*/{0,272u,1441793u,68235270u,672030728u,3774873616u,1078032180u,138443264u,262144u}/* 0F9A */, /*3218*/{0,272u,1441793u,68235270u,672030728u,3774873616u,1078032196u,138443264u,262144u}/* 0F9B */, /*3219*/{0,272u,1441793u,68235270u,672030728u,3774873616u,1078032212u,138443264u,262144u}/* 0F9C */, /*3220*/{249561088u,272u,1441792u,68235302u,672030720u,3775397968u,1078128660u,272671232u,262144u}/* 0F9D */, /*3221*/{0,272u,1441793u,68235270u,672030728u,3774873616u,1078032228u,138443264u,262144u}/* 0F9E */, /*3222*/{0,272u,1441793u,68235270u,672030728u,3774873616u,1078032244u,138443264u,262144u}/* 0F9F */, /*3223*/{0,272u,1441793u,68235270u,672030728u,3774873616u,1078032260u,138443264u,262144u}/* 0FA0 */, /*3224*/{0,272u,1441793u,68235270u,672030728u,3774873616u,1078032276u,138443264u,262144u}/* 0FA1 */, /*3225*/{250085376u,272u,1441792u,68235302u,672030720u,3775397968u,1078128724u,272671232u,262144u}/* 0FA2 */, /*3226*/{0,272u,1441793u,68235270u,672030728u,3774873616u,1078032292u,138443264u,262144u}/* 0FA3 */, /*3227*/{0,272u,1441793u,68235270u,672030728u,3774873616u,1078032308u,138443264u,262144u}/* 0FA4 */, /*3228*/{0,272u,1441793u,68235270u,672030728u,3774873616u,1078032324u,138443264u,262144u}/* 0FA5 */, /*3229*/{0,272u,1441793u,68235270u,672030728u,3774873616u,1078032340u,138443264u,262144u}/* 0FA6 */, /*3230*/{250609664u,272u,1441792u,68235302u,672030720u,3775397968u,1078128788u,272671232u,262144u}/* 0FA7 */, /*3231*/{0,272u,1441793u,68235270u,672030728u,3774873616u,1078032356u,138443264u,262144u}/* 0FA8 */, /*3232*/{0,272u,1441793u,68235270u,672030728u,3774873616u,1078032372u,138443264u,262144u}/* 0FA9 */, /*3233*/{0,272u,1441793u,68235270u,672030728u,3774873616u,1078032388u,138443264u,262144u}/* 0FAA */, /*3234*/{0,272u,1441793u,68235270u,672030728u,3774873616u,1078032404u,138443264u,262144u}/* 0FAB */, /*3235*/{251133952u,272u,1441792u,68235302u,672030720u,3775397968u,1078128852u,272671232u,262144u}/* 0FAC */, /*3236*/{0,272u,1441793u,68235270u,672030728u,3774873616u,1078032420u,138443264u,262144u}/* 0FAD */, /*3237*/{0,272u,1441793u,68300806u,672030728u,3774873616u,1078032436u,138443264u,262144u}/* 0FAE */, /*3238*/{0,272u,1441793u,68300806u,672030728u,3774873616u,1078032452u,138443264u,262144u}/* 0FAF */, /*3239*/{0,272u,1441793u,68300806u,672030728u,3774873616u,1078032468u,138443264u,262144u}/* 0FB0 */, /*3240*/{0,272u,1441793u,68235270u,672030728u,3774873616u,1078032484u,138443264u,262144u}/* 0FB1 */, /*3241*/{0,272u,1441793u,68235270u,672030728u,3774873616u,1078032496u,138443264u,262144u}/* 0FB2 */, /*3242*/{0,272u,1441793u,68235270u,672030728u,3774873616u,1078032520u,138443264u,262144u}/* 0FB3 */, /*3243*/{0,272u,1441793u,68235270u,672030728u,3774873616u,1078032540u,138443264u,262144u}/* 0FB4 */, /*3244*/{0,272u,1441793u,68235270u,672030728u,3774873616u,1078032556u,138443264u,262144u}/* 0FB5 */, /*3245*/{0,272u,1441793u,68235270u,672030728u,3774873616u,1078032572u,138443264u,262144u}/* 0FB6 */, /*3246*/{0,272u,1441793u,68235270u,672030728u,3774873616u,1078032588u,138443264u,262144u}/* 0FB7 */, /*3247*/{0,272u,1441793u,68300806u,672030728u,3774873616u,1078032604u,138443264u,262144u}/* 0FB8 */, /*3248*/{251658240u,272u,1441792u,68235302u,672030720u,3775397968u,1078128460u,272671232u,262144u}/* 0FB9 */, /*3249*/{0,272u,1441793u,68300806u,672030728u,3774873616u,1078032420u,1287731712u,262144u}/* 0FBA */, /*3250*/{0,272u,1441793u,68300806u,672030728u,3774873616u,1078032484u,1287731712u,262144u}/* 0FBB */, /*3251*/{0,272u,1441793u,68300806u,672030728u,3774873616u,1078032500u,1287731712u,262144u}/* 0FBC */, /*3252*/{0,272u,1441793u,69337115u,40u,1610612768u,10860u,138442752u,67108864u}/* 0FBE */, /*3253*/{0,272u,1441793u,69337115u,40u,1610612768u,10868u,138442752u,67108864u}/* 0FBF */, /*3254*/{0,272u,1441793u,76677147u,40u,1610612768u,10876u,138442752u,67108864u}/* 0FC0 */, /*3255*/{0,272u,1441793u,76677147u,40u,1610612768u,10884u,138442752u,67108864u}/* 0FC1 */, /*3256*/{0,272u,1441793u,76677147u,40u,1610612768u,10892u,138442752u,67108864u}/* 0FC2 */, /*3257*/{0,272u,1441793u,76677147u,40u,1610612768u,10900u,138442752u,67108864u}/* 0FC3 */, /*3258*/{0,272u,1441793u,76677147u,40u,1610612768u,10908u,138442752u,67108864u}/* 0FC4 */, /*3259*/{0,272u,1441793u,76677147u,40u,1610612768u,10916u,138442752u,67108864u}/* 0FC5 */, /*3260*/{0,272u,1441793u,3088199686u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* 0FC6 */, /*3261*/{0,272u,1441793u,76677147u,40u,1610612768u,10924u,138442752u,67108864u}/* 0FC7 */, /*3262*/{0,272u,1441793u,76677147u,40u,1610612768u,10932u,138442752u,67108864u}/* 0FC8 */, /*3263*/{0,272u,1441793u,76677147u,40u,1610612768u,10940u,138442752u,67108864u}/* 0FC9 */, /*3264*/{0,272u,1441793u,76677147u,40u,1610612768u,10948u,138442752u,67108864u}/* 0FCA */, /*3265*/{0,272u,1441793u,76677147u,40u,1610612768u,10956u,138442752u,67108864u}/* 0FCB */, /*3266*/{0,272u,1441793u,76677147u,40u,1610612768u,10964u,138442752u,67108864u}/* 0FCC */, /*3267*/{0,272u,1441793u,76873755u,40u,1610612768u,10972u,138442752u,67108864u}/* 0FCE */, /*3268*/{0,272u,1441793u,76677147u,40u,1610612768u,10980u,138442752u,67108864u}/* 0FCF */, /*3269*/{0,272u,1441793u,90439703u,40u,1610612768u,8204u,138442754u,0}/* 0FD0 */, /*3270*/{0,272u,1441793u,90439703u,40u,1610612768u,8212u,138442754u,0}/* 0FD1 */, /*3271*/{0,272u,1441793u,69533719u,40u,1610612768u,8284u,138442754u,0}/* 0FD2 */, /*3272*/{0,272u,1441793u,90505239u,40u,1610612768u,8292u,138442754u,0}/* 0FD3 */, /*3273*/{0,272u,1441793u,76873751u,40u,1610612768u,8300u,138442754u,0}/* 0FD4 */, /*3274*/{0,272u,65537u,76906523u,40u,1610612768u,10988u,138442752u,67108864u}/* 0FD5 */, /*3275*/{0,272u,65537u,76906523u,40u,1610612768u,10996u,138442752u,67108864u}/* 0FD6 */, /*3276*/{0,272u,65537u,76906523u,40u,1610612768u,11004u,138442752u,67108864u}/* 0FD7 */, /*3277*/{0,272u,65537u,76906523u,40u,1610612768u,11012u,138442752u,67108864u}/* 0FD8 */, /*3278*/{0,272u,1441793u,88473623u,40u,1610612768u,8308u,138442754u,0}/* 0FD9 */, /*3279*/{0,272u,1441793u,88473623u,40u,1610612768u,8316u,138442754u,0}/* 0FDA */, /*3280*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677822572u,138442752u,393216u}/* 1000 */, /*3281*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677822588u,138442752u,393216u}/* 1001 */, /*3282*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677822604u,138442752u,393216u}/* 1002 */, /*3283*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677822636u,138442752u,393216u}/* 1003 */, /*3284*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677822660u,138442752u,393216u}/* 1004 */, /*3285*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677822676u,138442752u,393216u}/* 1005 */, /*3286*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677822700u,138442752u,393216u}/* 1006 */, /*3287*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677822732u,138442752u,393216u}/* 1007 */, /*3288*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677822772u,138442752u,393216u}/* 1008 */, /*3289*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677822828u,138442752u,393216u}/* 1009 */, /*3290*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677822860u,138442752u,393216u}/* 100A */, /*3291*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677822868u,138442752u,393216u}/* 100B */, /*3292*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677822884u,138442752u,393216u}/* 100C */, /*3293*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677822900u,138442752u,393216u}/* 100D */, /*3294*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677822924u,138442752u,393216u}/* 100E */, /*3295*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677822948u,138442752u,393216u}/* 100F */, /*3296*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677822980u,138442752u,393216u}/* 1010 */, /*3297*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677822988u,138442752u,393216u}/* 1011 */, /*3298*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677822996u,138442752u,393216u}/* 1012 */, /*3299*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677823020u,138442752u,393216u}/* 1013 */, /*3300*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677823044u,138442752u,393216u}/* 1014 */, /*3301*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677823076u,138442752u,393216u}/* 1015 */, /*3302*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677823084u,138442752u,393216u}/* 1016 */, /*3303*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677823132u,138442752u,393216u}/* 1017 */, /*3304*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677823156u,138442752u,393216u}/* 1018 */, /*3305*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677823180u,138442752u,393216u}/* 1019 */, /*3306*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677823196u,138442752u,393216u}/* 101A */, /*3307*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677823212u,138442752u,393216u}/* 101B */, /*3308*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677823244u,138442752u,393216u}/* 101C */, /*3309*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677823260u,138442752u,393216u}/* 101D */, /*3310*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677823316u,138442752u,393216u}/* 101E */, /*3311*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677823332u,138442752u,393216u}/* 101F */, /*3312*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677823380u,138442752u,393216u}/* 1020 */, /*3313*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677823436u,138442752u,393216u}/* 1021 */, /*3314*/{0,280u,1507329u,92602373u,73768u,3758096416u,1677823444u,138442752u,393216u}/* 1022 */, /*3315*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677823452u,138442752u,393216u}/* 1023 */, /*3316*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677823460u,138442752u,393216u}/* 1024 */, /*3317*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677823464u,138442752u,393216u}/* 1025 */, /*3318*/{252182528u,280u,1507329u,92405797u,73768u,3758096416u,1677823476u,138436608u,393216u}/* 1026 */, /*3319*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677823516u,138442752u,393216u}/* 1027 */, /*3320*/{0,280u,1507329u,92602373u,73768u,3758096416u,1677823524u,138442752u,393216u}/* 1028 */, /*3321*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677823532u,138442752u,393216u}/* 1029 */, /*3322*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677823540u,138442752u,393216u}/* 102A */, /*3323*/{0,280u,1507329u,92602376u,942088u,3758096416u,1078038076u,138459648u,262144u}/* 102B */, /*3324*/{0,280u,1507329u,92405768u,942088u,3758096416u,1078038076u,138443264u,262144u}/* 102C */, /*3325*/{0,280u,1507329u,92418054u,672030728u,3774873616u,1078038108u,138443264u,262144u}/* 102D */, /*3326*/{0,280u,1507330u,92418054u,672030736u,3774873616u,1078038124u,138443264u,262144u}/* 102E */, /*3327*/{0,280u,1507329u,92418054u,672030728u,3774873616u,1078038140u,138443264u,262144u}/* 102F */, /*3328*/{0,280u,1507329u,92418054u,672030728u,3774873616u,1078038164u,138443264u,262144u}/* 1030 */, /*3329*/{0,280u,1507329u,92405768u,940466184u,3758096416u,1078038204u,138443264u,262144u}/* 1031 */, /*3330*/{0,280u,1507329u,92418054u,672030728u,3774873616u,1078038236u,138443264u,262144u}/* 1032 */, /*3331*/{0,280u,1507329u,92614662u,672030728u,3774873616u,1078038132u,138443264u,262144u}/* 1033 */, /*3332*/{0,280u,1507329u,92614662u,672030728u,3774873616u,1078038252u,138443264u,262144u}/* 1034 */, /*3333*/{0,280u,1507329u,92614662u,672030728u,3774873616u,1078038220u,138443264u,262144u}/* 1035 */, /*3334*/{0,280u,1507329u,92418054u,672030728u,3774873616u,1077936140u,826309120u,262144u}/* 1036 */, /*3335*/{0,280u,1507329u,226635782u,672030728u,1627398160u,1077936140u,968914944u,262144u}/* 1037 */, /*3336*/{0,280u,1507329u,92405768u,942088u,3758096416u,1077936140u,830503424u,262144u}/* 1038 */, /*3337*/{0,280u,1507329u,360853510u,672030728u,1627398168u,1078038300u,138442752u,262144u}/* 1039 */, /*3338*/{0,280u,1507329u,361050118u,672030728u,1627398168u,1078038308u,138442752u,262144u}/* 103A */, /*3339*/{0,280u,1507329u,92602376u,940466184u,3758096416u,1078037732u,138443264u,262144u}/* 103B */, /*3340*/{0,280u,1507329u,92602376u,940466184u,3758096416u,1078037764u,138443264u,262144u}/* 103C */, /*3341*/{0,280u,1507329u,92614662u,672030728u,3774873616u,1078037796u,138443264u,262144u}/* 103D */, /*3342*/{0,280u,1507329u,92614662u,672030728u,3774873616u,1078037884u,138443264u,262144u}/* 103E */, /*3343*/{0,280u,1507329u,92602373u,73768u,3758096416u,1678027180u,406960128u,393216u}/* 103F */, /*3344*/{0,280u,35062785u,85065737u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 1040 */, /*3345*/{0,280u,538379777u,85065737u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 1041 */, /*3346*/{0,280u,571935233u,85065737u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 1042 */, /*3347*/{0,280u,605489153u,85065737u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 1043 */, /*3348*/{0,280u,639045633u,85065737u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 1044 */, /*3349*/{0,280u,672599041u,85065737u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 1045 */, /*3350*/{0,280u,706156033u,85065737u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 1046 */, /*3351*/{0,280u,739708417u,85065737u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 1047 */, /*3352*/{0,280u,773266433u,85065737u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 1048 */, /*3353*/{0,280u,806818817u,85065737u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 1049 */, /*3354*/{0,280u,1507329u,69337111u,98344u,1610612768u,5340u,138442754u,41943040u}/* 104A */, /*3355*/{0,280u,1507329u,69337111u,98344u,1610612768u,5348u,138442754u,41943040u}/* 104B */, /*3356*/{0,280u,1507329u,76677143u,40u,1610612768u,8492u,138442754u,0}/* 104C */, /*3357*/{0,280u,1507329u,76677143u,40u,1610612768u,8500u,138442754u,0}/* 104D */, /*3358*/{0,280u,1507329u,76677143u,40u,1610612768u,8508u,138442754u,0}/* 104E */, /*3359*/{0,280u,1507329u,76677143u,40u,1610612768u,8516u,138442754u,0}/* 104F */, /*3360*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677823292u,138442752u,393216u}/* 1050 */, /*3361*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677823300u,138442752u,393216u}/* 1051 */, /*3362*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677823484u,138442752u,393216u}/* 1052 */, /*3363*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677823492u,138442752u,393216u}/* 1053 */, /*3364*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677823500u,138442752u,393216u}/* 1054 */, /*3365*/{0,280u,1507329u,92405765u,73768u,3758096416u,1677823508u,138442752u,393216u}/* 1055 */, /*3366*/{0,280u,1507329u,92405768u,940466184u,3758096416u,1078038172u,138443264u,262144u}/* 1056 */, /*3367*/{0,280u,1507329u,92405768u,940466184u,3758096416u,1078038180u,138443264u,262144u}/* 1057 */, /*3368*/{0,280u,1507329u,92418054u,672030728u,3774873616u,1078038188u,138443264u,262144u}/* 1058 */, /*3369*/{0,280u,1507329u,92418054u,672030728u,3774873616u,1078038196u,138443264u,262144u}/* 1059 */, /*3370*/{0,280u,1507329u,92602373u,73768u,3758096416u,1677822668u,138442752u,393216u}/* 105A */, /*3371*/{0,280u,1507329u,92602373u,73768u,3758096416u,1677822780u,138442752u,393216u}/* 105B */, /*3372*/{0,280u,1507329u,92602373u,73768u,3758096416u,1677823396u,138442752u,393216u}/* 105C */, /*3373*/{0,280u,1507329u,92602373u,73768u,3758096416u,1677823404u,138442752u,393216u}/* 105D */, /*3374*/{0,280u,1507329u,92614662u,672030728u,3774873616u,1078037596u,138443264u,262144u}/* 105E */, /*3375*/{0,280u,1507329u,92614662u,672030728u,3774873616u,1078037716u,138443264u,262144u}/* 105F */, /*3376*/{0,280u,1507329u,92614662u,672030728u,3774873616u,1078037780u,138443264u,262144u}/* 1060 */, /*3377*/{0,280u,1507329u,92602373u,73768u,3758096416u,1677822812u,138442752u,393216u}/* 1061 */, /*3378*/{0,280u,1507329u,92602376u,942088u,3758096416u,1078038260u,138443264u,262144u}/* 1062 */, /*3379*/{0,280u,1507329u,92602376u,942088u,1610612768u,1078038316u,138442752u,262144u}/* 1063 */, /*3380*/{0,280u,1507329u,92602376u,942088u,1610612768u,1078038324u,138442752u,262144u}/* 1064 */, /*3381*/{0,280u,1507329u,92602373u,73768u,3758096416u,1677823308u,138442752u,393216u}/* 1065 */, /*3382*/{0,280u,1507329u,92602373u,73768u,3758096416u,1677823428u,138442752u,393216u}/* 1066 */, /*3383*/{0,280u,1507329u,92602376u,942088u,3758096416u,1078038268u,138443264u,262144u}/* 1067 */, /*3384*/{0,280u,1507329u,92602376u,942088u,3758096416u,1078038276u,138443264u,262144u}/* 1068 */, /*3385*/{0,280u,1507329u,92602376u,942088u,1610612768u,1078038332u,138442752u,262144u}/* 1069 */, /*3386*/{0,280u,1507329u,92602376u,942088u,1610612768u,1078038340u,138442752u,262144u}/* 106A */, /*3387*/{0,280u,1507329u,92602376u,942088u,1610612768u,1078038348u,138442752u,262144u}/* 106B */, /*3388*/{0,280u,1507329u,92602376u,942088u,1610612768u,1078038356u,138442752u,262144u}/* 106C */, /*3389*/{0,280u,1507329u,92602376u,942088u,1610612768u,1078038364u,138442752u,262144u}/* 106D */, /*3390*/{0,280u,1507329u,92602373u,73768u,3758096416u,1677822956u,138442752u,393216u}/* 106E */, /*3391*/{0,280u,1507329u,92602373u,73768u,3758096416u,1677823412u,138442752u,393216u}/* 106F */, /*3392*/{0,280u,1507329u,92602373u,73768u,3758096416u,1677823420u,138442752u,393216u}/* 1070 */, /*3393*/{0,280u,1507329u,92614662u,672030728u,3774873616u,1078038116u,138443264u,262144u}/* 1071 */, /*3394*/{0,280u,1507329u,92614662u,672030728u,3774873616u,1078038092u,138443264u,262144u}/* 1072 */, /*3395*/{0,280u,1507329u,92614662u,672030728u,3774873616u,1078038148u,138443264u,262144u}/* 1073 */, /*3396*/{0,280u,1507329u,92614662u,672030728u,3774873616u,1078038156u,138443264u,262144u}/* 1074 */, /*3397*/{0,280u,1507329u,92602373u,73768u,3758096416u,1677822580u,138442752u,393216u}/* 1075 */, /*3398*/{0,280u,1507329u,92602373u,73768u,3758096416u,1677822596u,138442752u,393216u}/* 1076 */, /*3399*/{0,280u,1507329u,92602373u,73768u,3758096416u,1677822612u,138442752u,393216u}/* 1077 */, /*3400*/{0,280u,1507329u,92602373u,73768u,3758096416u,1677822684u,138442752u,393216u}/* 1078 */, /*3401*/{0,280u,1507329u,92602373u,73768u,3758096416u,1677822756u,138442752u,393216u}/* 1079 */, /*3402*/{0,280u,1507329u,92602373u,73768u,3758096416u,1677822836u,138442752u,393216u}/* 107A */, /*3403*/{0,280u,1507329u,92602373u,73768u,3758096416u,1677823004u,138442752u,393216u}/* 107B */, /*3404*/{0,280u,1507329u,92602373u,73768u,3758096416u,1677823052u,138442752u,393216u}/* 107C */, /*3405*/{0,280u,1507329u,92602373u,73768u,3758096416u,1677823092u,138442752u,393216u}/* 107D */, /*3406*/{0,280u,1507329u,92602373u,73768u,3758096416u,1677823100u,138442752u,393216u}/* 107E */, /*3407*/{0,280u,1507329u,92602373u,73768u,3758096416u,1677823140u,138442752u,393216u}/* 107F */, /*3408*/{0,280u,1507329u,92602373u,73768u,3758096416u,1677823284u,138442752u,393216u}/* 1080 */, /*3409*/{0,280u,1507329u,92602373u,73768u,3758096416u,1677823340u,138442752u,393216u}/* 1081 */, /*3410*/{0,280u,1507329u,92614662u,672030728u,3774873616u,1078037804u,138443264u,262144u}/* 1082 */, /*3411*/{0,280u,1507329u,92602376u,942088u,3758096416u,1078038084u,138443264u,262144u}/* 1083 */, /*3412*/{0,280u,1507329u,92602376u,940466184u,3758096416u,1078038212u,138443264u,262144u}/* 1084 */, /*3413*/{0,280u,1507329u,92614662u,672030728u,3774873616u,1078038228u,138443264u,262144u}/* 1085 */, /*3414*/{0,280u,1507329u,92614662u,672030728u,3774873616u,1078038292u,138443264u,262144u}/* 1086 */, /*3415*/{0,280u,1507329u,92602376u,942088u,1610620960u,1078038372u,138442752u,262144u}/* 1087 */, /*3416*/{0,280u,1507329u,92602376u,942088u,1610620960u,1078038388u,138442752u,262144u}/* 1088 */, /*3417*/{0,280u,1507329u,92602376u,942088u,1610620960u,1078038412u,138442752u,262144u}/* 1089 */, /*3418*/{0,280u,1507329u,92602376u,942088u,1610620960u,1078038420u,138442752u,262144u}/* 108A */, /*3419*/{0,280u,1507329u,92602376u,942088u,1610620960u,1078038380u,138442752u,262144u}/* 108B */, /*3420*/{0,280u,1507329u,92602376u,942088u,1610620960u,1078038396u,138442752u,262144u}/* 108C */, /*3421*/{0,280u,1507329u,3112513542u,672030728u,1627398160u,1078038404u,138442752u,262144u}/* 108D */, /*3422*/{0,280u,1507329u,92602373u,73768u,3758096416u,1677823116u,138442752u,393216u}/* 108E */, /*3423*/{0,280u,1507329u,92602376u,942088u,1610620960u,1078038428u,138442752u,262144u}/* 108F */, /*3424*/{0,280u,35062785u,85262345u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 1090 */, /*3425*/{0,280u,538379777u,85262345u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 1091 */, /*3426*/{0,280u,571935233u,85262345u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 1092 */, /*3427*/{0,280u,605489153u,85262345u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 1093 */, /*3428*/{0,280u,639045633u,85262345u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 1094 */, /*3429*/{0,280u,672599041u,85262345u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 1095 */, /*3430*/{0,280u,706156033u,85262345u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 1096 */, /*3431*/{0,280u,739708417u,85262345u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 1097 */, /*3432*/{0,280u,773266433u,85262345u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 1098 */, /*3433*/{0,280u,806818817u,85262345u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 1099 */, /*3434*/{0,280u,1507329u,92635144u,942088u,1610620960u,1078038436u,138442752u,262144u}/* 109A */, /*3435*/{0,280u,1507329u,92635144u,942088u,1610620960u,1078038444u,138442752u,262144u}/* 109B */, /*3436*/{0,280u,1507329u,92635144u,942088u,3758096416u,1078038100u,138443264u,262144u}/* 109C */, /*3437*/{0,280u,1507329u,92647430u,672030728u,3774873616u,1078038244u,138443264u,262144u}/* 109D */, /*3438*/{0,280u,1507329u,92602395u,40u,1610612768u,11028u,138442752u,67108864u}/* 109E */, /*3439*/{0,280u,1507329u,92602395u,40u,1610612768u,11036u,138442752u,67108864u}/* 109F */, /*3440*/{122880u,1006633248u,1572865u,76578817u,1507368u,3807903776u,1711346964u,138491904u,2490368u}/* 10A0 */, /*3441*/{123008u,1008730400u,1572865u,76578817u,1507368u,3807903776u,1711346980u,138491904u,2490368u}/* 10A1 */, /*3442*/{123136u,1010827552u,1572865u,76578817u,1507368u,3807903776u,1711346996u,138491904u,2490368u}/* 10A2 */, /*3443*/{123264u,1012924704u,1572865u,76578817u,1507368u,3807903776u,1711347012u,138491904u,2490368u}/* 10A3 */, /*3444*/{123392u,1015021856u,1572865u,76578817u,1507368u,3807903776u,1711347028u,138491904u,2490368u}/* 10A4 */, /*3445*/{123520u,1017119008u,1572865u,76578817u,1507368u,3807903776u,1711347044u,138491904u,2490368u}/* 10A5 */, /*3446*/{123648u,1019216160u,1572865u,76578817u,1507368u,3807903776u,1711347060u,138491904u,2490368u}/* 10A6 */, /*3447*/{123776u,1021313312u,1572865u,76578817u,1507368u,3807903776u,1711347092u,138491904u,2490368u}/* 10A7 */, /*3448*/{123904u,1023410464u,1572865u,76578817u,1507368u,3807903776u,1711347108u,138491904u,2490368u}/* 10A8 */, /*3449*/{124032u,1025507616u,1572865u,76578817u,1507368u,3807903776u,1711347124u,138491904u,2490368u}/* 10A9 */, /*3450*/{124160u,1027604768u,1572865u,76578817u,1507368u,3807903776u,1711347140u,138491904u,2490368u}/* 10AA */, /*3451*/{124288u,1029701920u,1572865u,76578817u,1507368u,3807903776u,1711347156u,138491904u,2490368u}/* 10AB */, /*3452*/{124416u,1031799072u,1572865u,76578817u,1507368u,3807903776u,1711347172u,138491904u,2490368u}/* 10AC */, /*3453*/{124544u,1033896224u,1572865u,76578817u,1507368u,3807903776u,1711347204u,138491904u,2490368u}/* 10AD */, /*3454*/{124672u,1035993376u,1572865u,76578817u,1507368u,3807903776u,1711347220u,138491904u,2490368u}/* 10AE */, /*3455*/{124800u,1038090528u,1572865u,76578817u,1507368u,3807903776u,1711347236u,138491904u,2490368u}/* 10AF */, /*3456*/{124928u,1040187680u,1572865u,76578817u,1507368u,3807903776u,1711347252u,138491904u,2490368u}/* 10B0 */, /*3457*/{125056u,1042284832u,1572865u,76578817u,1507368u,3807903776u,1711347268u,138491904u,2490368u}/* 10B1 */, /*3458*/{125184u,1044381984u,1572865u,76578817u,1507368u,3807903776u,1711347284u,138491904u,2490368u}/* 10B2 */, /*3459*/{125312u,1046479136u,1572865u,76578817u,1507368u,3807903776u,1711347316u,138491904u,2490368u}/* 10B3 */, /*3460*/{125440u,1048576288u,1572865u,76578817u,1507368u,3807903776u,1711347332u,138491904u,2490368u}/* 10B4 */, /*3461*/{125568u,1050673440u,1572865u,76578817u,1507368u,3807903776u,1711347348u,138491904u,2490368u}/* 10B5 */, /*3462*/{125696u,1052770592u,1572865u,76578817u,1507368u,3807903776u,1711347364u,138491904u,2490368u}/* 10B6 */, /*3463*/{125824u,1054867744u,1572865u,76578817u,1507368u,3807903776u,1711347380u,138491904u,2490368u}/* 10B7 */, /*3464*/{125952u,1056964896u,1572865u,76578817u,1507368u,3807903776u,1711347396u,138491904u,2490368u}/* 10B8 */, /*3465*/{126080u,1059062048u,1572865u,76578817u,1507368u,3807903776u,1711347412u,138491904u,2490368u}/* 10B9 */, /*3466*/{126208u,1061159200u,1572865u,76578817u,1507368u,3807903776u,1711347428u,138491904u,2490368u}/* 10BA */, /*3467*/{126336u,1063256352u,1572865u,76578817u,1507368u,3807903776u,1711347444u,138491904u,2490368u}/* 10BB */, /*3468*/{126464u,1065353504u,1572865u,76578817u,1507368u,3807903776u,1711347460u,138491904u,2490368u}/* 10BC */, /*3469*/{126592u,1067450656u,1572865u,76578817u,1507368u,3807903776u,1711347476u,138491904u,2490368u}/* 10BD */, /*3470*/{126720u,1069547808u,1572865u,76578817u,1507368u,3807903776u,1711347492u,138491904u,2490368u}/* 10BE */, /*3471*/{126848u,1071644960u,1572865u,76578817u,1507368u,3807903776u,1711347524u,138491904u,2490368u}/* 10BF */, /*3472*/{126976u,1073742112u,1572865u,76578817u,1507368u,3807903776u,1711347540u,138491904u,2490368u}/* 10C0 */, /*3473*/{127104u,1075839264u,1572865u,76578817u,1507368u,3807903776u,1711347076u,138491904u,2490368u}/* 10C1 */, /*3474*/{127232u,1077936416u,1572865u,76578817u,1507368u,3807903776u,1711347188u,138491904u,2490368u}/* 10C2 */, /*3475*/{127360u,1080033568u,1572865u,76578817u,1507368u,3807903776u,1711347300u,138491904u,2490368u}/* 10C3 */, /*3476*/{127488u,1082130720u,1572865u,76578817u,1507368u,3807903776u,1711347508u,138491904u,2490368u}/* 10C4 */, /*3477*/{127616u,1084227872u,1572865u,76578817u,1507368u,3807903776u,1711347556u,138491904u,2490368u}/* 10C5 */, /*3478*/{127744u,1086325024u,1572865u,76972033u,1507368u,3807903776u,1711347580u,138491904u,2490368u}/* 10C7 */, /*3479*/{127872u,1088422176u,1572865u,76972033u,1507368u,3807903776u,1711347620u,138491904u,2490368u}/* 10CD */, /*3480*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677792524u,138442752u,393216u}/* 10D0 */, /*3481*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677792540u,138442752u,393216u}/* 10D1 */, /*3482*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677792556u,138442752u,393216u}/* 10D2 */, /*3483*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677792572u,138442752u,393216u}/* 10D3 */, /*3484*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677792588u,138442752u,393216u}/* 10D4 */, /*3485*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677792604u,138442752u,393216u}/* 10D5 */, /*3486*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677792620u,138442752u,393216u}/* 10D6 */, /*3487*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677792652u,138442752u,393216u}/* 10D7 */, /*3488*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677792668u,138442752u,393216u}/* 10D8 */, /*3489*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677792684u,138442752u,393216u}/* 10D9 */, /*3490*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677792700u,138442752u,393216u}/* 10DA */, /*3491*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677792716u,138442752u,393216u}/* 10DB */, /*3492*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677792732u,138442752u,393216u}/* 10DC */, /*3493*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677792764u,138442752u,393216u}/* 10DD */, /*3494*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677792780u,138442752u,393216u}/* 10DE */, /*3495*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677792796u,138442752u,393216u}/* 10DF */, /*3496*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677792812u,138442752u,393216u}/* 10E0 */, /*3497*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677792828u,138442752u,393216u}/* 10E1 */, /*3498*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677792844u,138442752u,393216u}/* 10E2 */, /*3499*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677792876u,138442752u,393216u}/* 10E3 */, /*3500*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677792892u,138442752u,393216u}/* 10E4 */, /*3501*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677792908u,138442752u,393216u}/* 10E5 */, /*3502*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677792924u,138442752u,393216u}/* 10E6 */, /*3503*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677792940u,138442752u,393216u}/* 10E7 */, /*3504*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677792956u,138442752u,393216u}/* 10E8 */, /*3505*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677792972u,138442752u,393216u}/* 10E9 */, /*3506*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677792988u,138442752u,393216u}/* 10EA */, /*3507*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677793004u,138442752u,393216u}/* 10EB */, /*3508*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677793020u,138442752u,393216u}/* 10EC */, /*3509*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677793036u,138442752u,393216u}/* 10ED */, /*3510*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677793052u,138442752u,393216u}/* 10EE */, /*3511*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677793084u,138442752u,393216u}/* 10EF */, /*3512*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677793100u,138442752u,393216u}/* 10F0 */, /*3513*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677792636u,138442752u,393216u}/* 10F1 */, /*3514*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677792748u,138442752u,393216u}/* 10F2 */, /*3515*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677792860u,138442752u,393216u}/* 10F3 */, /*3516*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677793068u,138442752u,393216u}/* 10F4 */, /*3517*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677793116u,138442752u,393216u}/* 10F5 */, /*3518*/{0,288u,1572865u,76578821u,1515560u,3758096416u,1677793132u,138442752u,393216u}/* 10F6 */, /*3519*/{0,288u,1572865u,76742661u,1515560u,3758096416u,1677793140u,138442752u,393216u}/* 10F7 */, /*3520*/{0,288u,1572865u,76742661u,1515560u,3758096416u,1677793156u,138442752u,393216u}/* 10F8 */, /*3521*/{0,288u,1572865u,76808197u,1515560u,3758096416u,1677793164u,138442752u,393216u}/* 10F9 */, /*3522*/{0,288u,1572865u,76808197u,1515560u,3758096416u,1677793172u,138442752u,393216u}/* 10FA */, /*3523*/{0,288u,65537u,76578839u,40u,1610612768u,5700u,138442754u,0}/* 10FB */, /*3524*/{252706816u,288u,1572865u,76808516u,1515552u,3775397920u,1677792732u,138588160u,393216u}/* 10FC */, /*3525*/{0,288u,1572865u,76972037u,1515560u,3758096416u,1677793180u,138442752u,393216u}/* 10FD */, /*3526*/{0,288u,1572865u,76972037u,1515560u,3758096416u,1677793196u,138442752u,393216u}/* 10FE */, /*3527*/{0,288u,1572865u,76972037u,1515560u,3758096416u,1677793204u,138442752u,393216u}/* 10FF */, /*3528*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846636u,138442752u,393216u}/* 1100 */, /*3529*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846644u,138442752u,393216u}/* 1101 */, /*3530*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846652u,138442752u,393216u}/* 1102 */, /*3531*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846660u,138442752u,393216u}/* 1103 */, /*3532*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846668u,138442752u,393216u}/* 1104 */, /*3533*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846676u,138442752u,393216u}/* 1105 */, /*3534*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846684u,138442752u,393216u}/* 1106 */, /*3535*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846692u,138442752u,393216u}/* 1107 */, /*3536*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846700u,138442752u,393216u}/* 1108 */, /*3537*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846708u,138442752u,393216u}/* 1109 */, /*3538*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846716u,138442752u,393216u}/* 110A */, /*3539*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846724u,138442752u,393216u}/* 110B */, /*3540*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846732u,138442752u,393216u}/* 110C */, /*3541*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846740u,138442752u,393216u}/* 110D */, /*3542*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846748u,138442752u,393216u}/* 110E */, /*3543*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846756u,138442752u,393216u}/* 110F */, /*3544*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846764u,138442752u,393216u}/* 1110 */, /*3545*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846772u,138442752u,393216u}/* 1111 */, /*3546*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846780u,138442752u,393216u}/* 1112 */, /*3547*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846788u,138442752u,393216u}/* 1113 */, /*3548*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846796u,138442752u,393216u}/* 1114 */, /*3549*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846804u,138442752u,393216u}/* 1115 */, /*3550*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846812u,138442752u,393216u}/* 1116 */, /*3551*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846820u,138442752u,393216u}/* 1117 */, /*3552*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846828u,138442752u,393216u}/* 1118 */, /*3553*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846836u,138442752u,393216u}/* 1119 */, /*3554*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846844u,138442752u,393216u}/* 111A */, /*3555*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846852u,138442752u,393216u}/* 111B */, /*3556*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846860u,138442752u,393216u}/* 111C */, /*3557*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846868u,138442752u,393216u}/* 111D */, /*3558*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846876u,138442752u,393216u}/* 111E */, /*3559*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846884u,138442752u,393216u}/* 111F */, /*3560*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846892u,138442752u,393216u}/* 1120 */, /*3561*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846900u,138442752u,393216u}/* 1121 */, /*3562*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846908u,138442752u,393216u}/* 1122 */, /*3563*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846916u,138442752u,393216u}/* 1123 */, /*3564*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846924u,138442752u,393216u}/* 1124 */, /*3565*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846932u,138442752u,393216u}/* 1125 */, /*3566*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846940u,138442752u,393216u}/* 1126 */, /*3567*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846948u,138442752u,393216u}/* 1127 */, /*3568*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846956u,138442752u,393216u}/* 1128 */, /*3569*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846964u,138442752u,393216u}/* 1129 */, /*3570*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846972u,138442752u,393216u}/* 112A */, /*3571*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846980u,138442752u,393216u}/* 112B */, /*3572*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846988u,138442752u,393216u}/* 112C */, /*3573*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677846996u,138442752u,393216u}/* 112D */, /*3574*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847004u,138442752u,393216u}/* 112E */, /*3575*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847012u,138442752u,393216u}/* 112F */, /*3576*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847020u,138442752u,393216u}/* 1130 */, /*3577*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847028u,138442752u,393216u}/* 1131 */, /*3578*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847036u,138442752u,393216u}/* 1132 */, /*3579*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847044u,138442752u,393216u}/* 1133 */, /*3580*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847052u,138442752u,393216u}/* 1134 */, /*3581*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847060u,138442752u,393216u}/* 1135 */, /*3582*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847068u,138442752u,393216u}/* 1136 */, /*3583*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847076u,138442752u,393216u}/* 1137 */, /*3584*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847084u,138442752u,393216u}/* 1138 */, /*3585*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847092u,138442752u,393216u}/* 1139 */, /*3586*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847100u,138442752u,393216u}/* 113A */, /*3587*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847108u,138442752u,393216u}/* 113B */, /*3588*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847116u,138442752u,393216u}/* 113C */, /*3589*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847124u,138442752u,393216u}/* 113D */, /*3590*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847132u,138442752u,393216u}/* 113E */, /*3591*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847140u,138442752u,393216u}/* 113F */, /*3592*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847148u,138442752u,393216u}/* 1140 */, /*3593*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847156u,138442752u,393216u}/* 1141 */, /*3594*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847164u,138442752u,393216u}/* 1142 */, /*3595*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847172u,138442752u,393216u}/* 1143 */, /*3596*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847180u,138442752u,393216u}/* 1144 */, /*3597*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847188u,138442752u,393216u}/* 1145 */, /*3598*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847196u,138442752u,393216u}/* 1146 */, /*3599*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847204u,138442752u,393216u}/* 1147 */, /*3600*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847212u,138442752u,393216u}/* 1148 */, /*3601*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847220u,138442752u,393216u}/* 1149 */, /*3602*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847228u,138442752u,393216u}/* 114A */, /*3603*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847236u,138442752u,393216u}/* 114B */, /*3604*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847244u,138442752u,393216u}/* 114C */, /*3605*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847252u,138442752u,393216u}/* 114D */, /*3606*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847260u,138442752u,393216u}/* 114E */, /*3607*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847268u,138442752u,393216u}/* 114F */, /*3608*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847276u,138442752u,393216u}/* 1150 */, /*3609*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847284u,138442752u,393216u}/* 1151 */, /*3610*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847292u,138442752u,393216u}/* 1152 */, /*3611*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847300u,138442752u,393216u}/* 1153 */, /*3612*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847308u,138442752u,393216u}/* 1154 */, /*3613*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847316u,138442752u,393216u}/* 1155 */, /*3614*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847324u,138442752u,393216u}/* 1156 */, /*3615*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847332u,138442752u,393216u}/* 1157 */, /*3616*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847340u,138442752u,393216u}/* 1158 */, /*3617*/{0,299u,1638401u,93356037u,1075258376u,3758096416u,1677847348u,138442752u,393216u}/* 1159 */, /*3618*/{0,299u,1638401u,93683717u,1075258376u,3758096416u,1677847356u,138442752u,393216u}/* 115A */, /*3619*/{0,299u,1638401u,93683717u,1075258376u,3758096416u,1677847364u,138442752u,393216u}/* 115B */, /*3620*/{0,299u,1638401u,93683717u,1075258376u,3758096416u,1677847372u,138442752u,393216u}/* 115C */, /*3621*/{0,299u,1638401u,93683717u,1075258376u,3758096416u,1677847380u,138442752u,393216u}/* 115D */, /*3622*/{0,299u,1638401u,93683717u,1075258376u,3758096416u,1677847388u,138442752u,393216u}/* 115E */, /*3623*/{0,299u,1638401u,93356037u,1075258376u,3758653472u,1677847628u,138443008u,393216u}/* 115F */, /*3624*/{0,296u,1638401u,94404613u,1209477128u,3758653472u,1677847636u,138443008u,393216u}/* 1160 */, /*3625*/{0,296u,1638402u,94404613u,1209477136u,3758096416u,1677847644u,138442752u,393216u}/* 1161 */, /*3626*/{0,296u,1638402u,94404613u,1209477136u,3758096416u,1677847652u,138442752u,393216u}/* 1162 */, /*3627*/{0,296u,1638402u,94404613u,1209477136u,3758096416u,1677847660u,138442752u,393216u}/* 1163 */, /*3628*/{0,296u,1638402u,94404613u,1209477136u,3758096416u,1677847668u,138442752u,393216u}/* 1164 */, /*3629*/{0,296u,1638402u,94404613u,1209477136u,3758096416u,1677847676u,138442752u,393216u}/* 1165 */, /*3630*/{0,296u,1638402u,94404613u,1209477136u,3758096416u,1677847684u,138442752u,393216u}/* 1166 */, /*3631*/{0,296u,1638402u,94404613u,1209477136u,3758096416u,1677847692u,138442752u,393216u}/* 1167 */, /*3632*/{0,296u,1638402u,94404613u,1209477136u,3758096416u,1677847700u,138442752u,393216u}/* 1168 */, /*3633*/{0,296u,1638402u,94404613u,1209477136u,3758096416u,1677847708u,138442752u,393216u}/* 1169 */, /*3634*/{0,296u,1638402u,94404613u,1209477136u,3758096416u,1677847716u,138442752u,393216u}/* 116A */, /*3635*/{0,296u,1638402u,94404613u,1209477136u,3758096416u,1677847724u,138442752u,393216u}/* 116B */, /*3636*/{0,296u,1638402u,94404613u,1209477136u,3758096416u,1677847732u,138442752u,393216u}/* 116C */, /*3637*/{0,296u,1638402u,94404613u,1209477136u,3758096416u,1677847740u,138442752u,393216u}/* 116D */, /*3638*/{0,296u,1638402u,94404613u,1209477136u,3758096416u,1677847748u,138442752u,393216u}/* 116E */, /*3639*/{0,296u,1638402u,94404613u,1209477136u,3758096416u,1677847756u,138442752u,393216u}/* 116F */, /*3640*/{0,296u,1638402u,94404613u,1209477136u,3758096416u,1677847764u,138442752u,393216u}/* 1170 */, /*3641*/{0,296u,1638402u,94404613u,1209477136u,3758096416u,1677847772u,138442752u,393216u}/* 1171 */, /*3642*/{0,296u,1638402u,94404613u,1209477136u,3758096416u,1677847780u,138442752u,393216u}/* 1172 */, /*3643*/{0,296u,1638402u,94404613u,1209477136u,3758096416u,1677847788u,138442752u,393216u}/* 1173 */, /*3644*/{0,296u,1638402u,94404613u,1209477136u,3758096416u,1677847796u,138442752u,393216u}/* 1174 */, /*3645*/{0,296u,1638402u,94404613u,1209477136u,3758096416u,1677847804u,138442752u,393216u}/* 1175 */, /*3646*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677847812u,138442752u,393216u}/* 1176 */, /*3647*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677847820u,138442752u,393216u}/* 1177 */, /*3648*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677847828u,138442752u,393216u}/* 1178 */, /*3649*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677847836u,138442752u,393216u}/* 1179 */, /*3650*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677847844u,138442752u,393216u}/* 117A */, /*3651*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677847852u,138442752u,393216u}/* 117B */, /*3652*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677847860u,138442752u,393216u}/* 117C */, /*3653*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677847868u,138442752u,393216u}/* 117D */, /*3654*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677847876u,138442752u,393216u}/* 117E */, /*3655*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677847884u,138442752u,393216u}/* 117F */, /*3656*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677847892u,138442752u,393216u}/* 1180 */, /*3657*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677847900u,138442752u,393216u}/* 1181 */, /*3658*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677847908u,138442752u,393216u}/* 1182 */, /*3659*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677847916u,138442752u,393216u}/* 1183 */, /*3660*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677847924u,138442752u,393216u}/* 1184 */, /*3661*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677847932u,138442752u,393216u}/* 1185 */, /*3662*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677847940u,138442752u,393216u}/* 1186 */, /*3663*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677847948u,138442752u,393216u}/* 1187 */, /*3664*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677847956u,138442752u,393216u}/* 1188 */, /*3665*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677847964u,138442752u,393216u}/* 1189 */, /*3666*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677847972u,138442752u,393216u}/* 118A */, /*3667*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677847980u,138442752u,393216u}/* 118B */, /*3668*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677847988u,138442752u,393216u}/* 118C */, /*3669*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677847996u,138442752u,393216u}/* 118D */, /*3670*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677848004u,138442752u,393216u}/* 118E */, /*3671*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677848012u,138442752u,393216u}/* 118F */, /*3672*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677848020u,138442752u,393216u}/* 1190 */, /*3673*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677848028u,138442752u,393216u}/* 1191 */, /*3674*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677848036u,138442752u,393216u}/* 1192 */, /*3675*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677848044u,138442752u,393216u}/* 1193 */, /*3676*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677848052u,138442752u,393216u}/* 1194 */, /*3677*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677848060u,138442752u,393216u}/* 1195 */, /*3678*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677848068u,138442752u,393216u}/* 1196 */, /*3679*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677848076u,138442752u,393216u}/* 1197 */, /*3680*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677848084u,138442752u,393216u}/* 1198 */, /*3681*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677848092u,138442752u,393216u}/* 1199 */, /*3682*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677848100u,138442752u,393216u}/* 119A */, /*3683*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677848108u,138442752u,393216u}/* 119B */, /*3684*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677848116u,138442752u,393216u}/* 119C */, /*3685*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677848124u,138442752u,393216u}/* 119D */, /*3686*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677848132u,138442752u,393216u}/* 119E */, /*3687*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677848140u,138442752u,393216u}/* 119F */, /*3688*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677848148u,138442752u,393216u}/* 11A0 */, /*3689*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677848156u,138442752u,393216u}/* 11A1 */, /*3690*/{0,296u,1638401u,94404613u,1209477128u,3758096416u,1677848164u,138442752u,393216u}/* 11A2 */, /*3691*/{0,296u,1638401u,94732293u,1209477128u,3758096416u,1677848172u,138442752u,393216u}/* 11A3 */, /*3692*/{0,296u,1638401u,94732293u,1209477128u,3758096416u,1677848180u,138442752u,393216u}/* 11A4 */, /*3693*/{0,296u,1638401u,94732293u,1209477128u,3758096416u,1677848188u,138442752u,393216u}/* 11A5 */, /*3694*/{0,296u,1638401u,94732293u,1209477128u,3758096416u,1677848196u,138442752u,393216u}/* 11A6 */, /*3695*/{0,296u,1638401u,94732293u,1209477128u,3758096416u,1677848204u,138442752u,393216u}/* 11A7 */, /*3696*/{0,296u,1638402u,95453189u,1343695888u,3758096416u,1677848396u,138442752u,393216u}/* 11A8 */, /*3697*/{0,296u,1638402u,95453189u,1343695888u,3758096416u,1677848404u,138442752u,393216u}/* 11A9 */, /*3698*/{0,296u,1638402u,95453189u,1343695888u,3758096416u,1677848412u,138442752u,393216u}/* 11AA */, /*3699*/{0,296u,1638402u,95453189u,1343695888u,3758096416u,1677848420u,138442752u,393216u}/* 11AB */, /*3700*/{0,296u,1638402u,95453189u,1343695888u,3758096416u,1677848428u,138442752u,393216u}/* 11AC */, /*3701*/{0,296u,1638402u,95453189u,1343695888u,3758096416u,1677848436u,138442752u,393216u}/* 11AD */, /*3702*/{0,296u,1638402u,95453189u,1343695888u,3758096416u,1677848444u,138442752u,393216u}/* 11AE */, /*3703*/{0,296u,1638402u,95453189u,1343695888u,3758096416u,1677848452u,138442752u,393216u}/* 11AF */, /*3704*/{0,296u,1638402u,95453189u,1343695888u,3758096416u,1677848460u,138442752u,393216u}/* 11B0 */, /*3705*/{0,296u,1638402u,95453189u,1343695888u,3758096416u,1677848468u,138442752u,393216u}/* 11B1 */, /*3706*/{0,296u,1638402u,95453189u,1343695888u,3758096416u,1677848476u,138442752u,393216u}/* 11B2 */, /*3707*/{0,296u,1638402u,95453189u,1343695888u,3758096416u,1677848484u,138442752u,393216u}/* 11B3 */, /*3708*/{0,296u,1638402u,95453189u,1343695888u,3758096416u,1677848492u,138442752u,393216u}/* 11B4 */, /*3709*/{0,296u,1638402u,95453189u,1343695888u,3758096416u,1677848500u,138442752u,393216u}/* 11B5 */, /*3710*/{0,296u,1638402u,95453189u,1343695888u,3758096416u,1677848508u,138442752u,393216u}/* 11B6 */, /*3711*/{0,296u,1638402u,95453189u,1343695888u,3758096416u,1677848516u,138442752u,393216u}/* 11B7 */, /*3712*/{0,296u,1638402u,95453189u,1343695888u,3758096416u,1677848524u,138442752u,393216u}/* 11B8 */, /*3713*/{0,296u,1638402u,95453189u,1343695888u,3758096416u,1677848532u,138442752u,393216u}/* 11B9 */, /*3714*/{0,296u,1638402u,95453189u,1343695888u,3758096416u,1677848540u,138442752u,393216u}/* 11BA */, /*3715*/{0,296u,1638402u,95453189u,1343695888u,3758096416u,1677848548u,138442752u,393216u}/* 11BB */, /*3716*/{0,296u,1638402u,95453189u,1343695888u,3758096416u,1677848556u,138442752u,393216u}/* 11BC */, /*3717*/{0,296u,1638402u,95453189u,1343695888u,3758096416u,1677848564u,138442752u,393216u}/* 11BD */, /*3718*/{0,296u,1638402u,95453189u,1343695888u,3758096416u,1677848572u,138442752u,393216u}/* 11BE */, /*3719*/{0,296u,1638402u,95453189u,1343695888u,3758096416u,1677848580u,138442752u,393216u}/* 11BF */, /*3720*/{0,296u,1638402u,95453189u,1343695888u,3758096416u,1677848588u,138442752u,393216u}/* 11C0 */, /*3721*/{0,296u,1638402u,95453189u,1343695888u,3758096416u,1677848596u,138442752u,393216u}/* 11C1 */, /*3722*/{0,296u,1638402u,95453189u,1343695888u,3758096416u,1677848604u,138442752u,393216u}/* 11C2 */, /*3723*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848612u,138442752u,393216u}/* 11C3 */, /*3724*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848620u,138442752u,393216u}/* 11C4 */, /*3725*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848628u,138442752u,393216u}/* 11C5 */, /*3726*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848636u,138442752u,393216u}/* 11C6 */, /*3727*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848644u,138442752u,393216u}/* 11C7 */, /*3728*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848652u,138442752u,393216u}/* 11C8 */, /*3729*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848660u,138442752u,393216u}/* 11C9 */, /*3730*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848668u,138442752u,393216u}/* 11CA */, /*3731*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848676u,138442752u,393216u}/* 11CB */, /*3732*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848684u,138442752u,393216u}/* 11CC */, /*3733*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848692u,138442752u,393216u}/* 11CD */, /*3734*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848700u,138442752u,393216u}/* 11CE */, /*3735*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848708u,138442752u,393216u}/* 11CF */, /*3736*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848716u,138442752u,393216u}/* 11D0 */, /*3737*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848724u,138442752u,393216u}/* 11D1 */, /*3738*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848732u,138442752u,393216u}/* 11D2 */, /*3739*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848740u,138442752u,393216u}/* 11D3 */, /*3740*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848748u,138442752u,393216u}/* 11D4 */, /*3741*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848756u,138442752u,393216u}/* 11D5 */, /*3742*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848764u,138442752u,393216u}/* 11D6 */, /*3743*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848772u,138442752u,393216u}/* 11D7 */, /*3744*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848780u,138442752u,393216u}/* 11D8 */, /*3745*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848788u,138442752u,393216u}/* 11D9 */, /*3746*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848796u,138442752u,393216u}/* 11DA */, /*3747*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848804u,138442752u,393216u}/* 11DB */, /*3748*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848812u,138442752u,393216u}/* 11DC */, /*3749*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848820u,138442752u,393216u}/* 11DD */, /*3750*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848828u,138442752u,393216u}/* 11DE */, /*3751*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848836u,138442752u,393216u}/* 11DF */, /*3752*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848844u,138442752u,393216u}/* 11E0 */, /*3753*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848852u,138442752u,393216u}/* 11E1 */, /*3754*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848860u,138442752u,393216u}/* 11E2 */, /*3755*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848868u,138442752u,393216u}/* 11E3 */, /*3756*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848876u,138442752u,393216u}/* 11E4 */, /*3757*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848884u,138442752u,393216u}/* 11E5 */, /*3758*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848892u,138442752u,393216u}/* 11E6 */, /*3759*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848900u,138442752u,393216u}/* 11E7 */, /*3760*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848908u,138442752u,393216u}/* 11E8 */, /*3761*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848916u,138442752u,393216u}/* 11E9 */, /*3762*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848924u,138442752u,393216u}/* 11EA */, /*3763*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848932u,138442752u,393216u}/* 11EB */, /*3764*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848940u,138442752u,393216u}/* 11EC */, /*3765*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848948u,138442752u,393216u}/* 11ED */, /*3766*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848956u,138442752u,393216u}/* 11EE */, /*3767*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848964u,138442752u,393216u}/* 11EF */, /*3768*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848972u,138442752u,393216u}/* 11F0 */, /*3769*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848980u,138442752u,393216u}/* 11F1 */, /*3770*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848988u,138442752u,393216u}/* 11F2 */, /*3771*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677848996u,138442752u,393216u}/* 11F3 */, /*3772*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677849004u,138442752u,393216u}/* 11F4 */, /*3773*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677849012u,138442752u,393216u}/* 11F5 */, /*3774*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677849020u,138442752u,393216u}/* 11F6 */, /*3775*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677849028u,138442752u,393216u}/* 11F7 */, /*3776*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677849036u,138442752u,393216u}/* 11F8 */, /*3777*/{0,296u,1638401u,95453189u,1343695880u,3758096416u,1677849044u,138442752u,393216u}/* 11F9 */, /*3778*/{0,296u,1638401u,95780869u,1343695880u,3758096416u,1677849052u,138442752u,393216u}/* 11FA */, /*3779*/{0,296u,1638401u,95780869u,1343695880u,3758096416u,1677849060u,138442752u,393216u}/* 11FB */, /*3780*/{0,296u,1638401u,95780869u,1343695880u,3758096416u,1677849068u,138442752u,393216u}/* 11FC */, /*3781*/{0,296u,1638401u,95780869u,1343695880u,3758096416u,1677849076u,138442752u,393216u}/* 11FD */, /*3782*/{0,296u,1638401u,95780869u,1343695880u,3758096416u,1677849084u,138442752u,393216u}/* 11FE */, /*3783*/{0,296u,1638401u,95780869u,1343695880u,3758096416u,1677849092u,138442752u,393216u}/* 11FF */, /*3784*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797444u,138442752u,393216u}/* 1200 */, /*3785*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797452u,138442752u,393216u}/* 1201 */, /*3786*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797460u,138442752u,393216u}/* 1202 */, /*3787*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797468u,138442752u,393216u}/* 1203 */, /*3788*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797476u,138442752u,393216u}/* 1204 */, /*3789*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797484u,138442752u,393216u}/* 1205 */, /*3790*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797492u,138442752u,393216u}/* 1206 */, /*3791*/{0,304u,1703937u,76808197u,1515560u,3758096416u,1677797500u,138442752u,393216u}/* 1207 */, /*3792*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797508u,138442752u,393216u}/* 1208 */, /*3793*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797516u,138442752u,393216u}/* 1209 */, /*3794*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797524u,138442752u,393216u}/* 120A */, /*3795*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797532u,138442752u,393216u}/* 120B */, /*3796*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797540u,138442752u,393216u}/* 120C */, /*3797*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797548u,138442752u,393216u}/* 120D */, /*3798*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797556u,138442752u,393216u}/* 120E */, /*3799*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797564u,138442752u,393216u}/* 120F */, /*3800*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797580u,138442752u,393216u}/* 1210 */, /*3801*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797588u,138442752u,393216u}/* 1211 */, /*3802*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797596u,138442752u,393216u}/* 1212 */, /*3803*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797604u,138442752u,393216u}/* 1213 */, /*3804*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797612u,138442752u,393216u}/* 1214 */, /*3805*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797620u,138442752u,393216u}/* 1215 */, /*3806*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797628u,138442752u,393216u}/* 1216 */, /*3807*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797636u,138442752u,393216u}/* 1217 */, /*3808*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797644u,138442752u,393216u}/* 1218 */, /*3809*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797652u,138442752u,393216u}/* 1219 */, /*3810*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797660u,138442752u,393216u}/* 121A */, /*3811*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797668u,138442752u,393216u}/* 121B */, /*3812*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797676u,138442752u,393216u}/* 121C */, /*3813*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797684u,138442752u,393216u}/* 121D */, /*3814*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797692u,138442752u,393216u}/* 121E */, /*3815*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797700u,138442752u,393216u}/* 121F */, /*3816*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797748u,138442752u,393216u}/* 1220 */, /*3817*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797756u,138442752u,393216u}/* 1221 */, /*3818*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797764u,138442752u,393216u}/* 1222 */, /*3819*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797772u,138442752u,393216u}/* 1223 */, /*3820*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797780u,138442752u,393216u}/* 1224 */, /*3821*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797788u,138442752u,393216u}/* 1225 */, /*3822*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797796u,138442752u,393216u}/* 1226 */, /*3823*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797804u,138442752u,393216u}/* 1227 */, /*3824*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797812u,138442752u,393216u}/* 1228 */, /*3825*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797820u,138442752u,393216u}/* 1229 */, /*3826*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797828u,138442752u,393216u}/* 122A */, /*3827*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797836u,138442752u,393216u}/* 122B */, /*3828*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797844u,138442752u,393216u}/* 122C */, /*3829*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797852u,138442752u,393216u}/* 122D */, /*3830*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797860u,138442752u,393216u}/* 122E */, /*3831*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797868u,138442752u,393216u}/* 122F */, /*3832*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797884u,138442752u,393216u}/* 1230 */, /*3833*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797892u,138442752u,393216u}/* 1231 */, /*3834*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797900u,138442752u,393216u}/* 1232 */, /*3835*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797908u,138442752u,393216u}/* 1233 */, /*3836*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797916u,138442752u,393216u}/* 1234 */, /*3837*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797924u,138442752u,393216u}/* 1235 */, /*3838*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797932u,138442752u,393216u}/* 1236 */, /*3839*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677797940u,138442752u,393216u}/* 1237 */, /*3840*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798004u,138442752u,393216u}/* 1238 */, /*3841*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798012u,138442752u,393216u}/* 1239 */, /*3842*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798020u,138442752u,393216u}/* 123A */, /*3843*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798028u,138442752u,393216u}/* 123B */, /*3844*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798036u,138442752u,393216u}/* 123C */, /*3845*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798044u,138442752u,393216u}/* 123D */, /*3846*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798052u,138442752u,393216u}/* 123E */, /*3847*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798060u,138442752u,393216u}/* 123F */, /*3848*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798076u,138442752u,393216u}/* 1240 */, /*3849*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798084u,138442752u,393216u}/* 1241 */, /*3850*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798092u,138442752u,393216u}/* 1242 */, /*3851*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798100u,138442752u,393216u}/* 1243 */, /*3852*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798108u,138442752u,393216u}/* 1244 */, /*3853*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798116u,138442752u,393216u}/* 1245 */, /*3854*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798124u,138442752u,393216u}/* 1246 */, /*3855*/{0,304u,1703937u,76808197u,1515560u,3758096416u,1677798132u,138442752u,393216u}/* 1247 */, /*3856*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798140u,138442752u,393216u}/* 1248 */, /*3857*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798148u,138442752u,393216u}/* 124A */, /*3858*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798156u,138442752u,393216u}/* 124B */, /*3859*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798164u,138442752u,393216u}/* 124C */, /*3860*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798172u,138442752u,393216u}/* 124D */, /*3861*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798180u,138442752u,393216u}/* 1250 */, /*3862*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798188u,138442752u,393216u}/* 1251 */, /*3863*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798196u,138442752u,393216u}/* 1252 */, /*3864*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798204u,138442752u,393216u}/* 1253 */, /*3865*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798212u,138442752u,393216u}/* 1254 */, /*3866*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798220u,138442752u,393216u}/* 1255 */, /*3867*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798228u,138442752u,393216u}/* 1256 */, /*3868*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798236u,138442752u,393216u}/* 1258 */, /*3869*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798244u,138442752u,393216u}/* 125A */, /*3870*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798252u,138442752u,393216u}/* 125B */, /*3871*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798260u,138442752u,393216u}/* 125C */, /*3872*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798268u,138442752u,393216u}/* 125D */, /*3873*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798276u,138442752u,393216u}/* 1260 */, /*3874*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798284u,138442752u,393216u}/* 1261 */, /*3875*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798292u,138442752u,393216u}/* 1262 */, /*3876*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798300u,138442752u,393216u}/* 1263 */, /*3877*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798308u,138442752u,393216u}/* 1264 */, /*3878*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798316u,138442752u,393216u}/* 1265 */, /*3879*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798324u,138442752u,393216u}/* 1266 */, /*3880*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798332u,138442752u,393216u}/* 1267 */, /*3881*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798380u,138442752u,393216u}/* 1268 */, /*3882*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798388u,138442752u,393216u}/* 1269 */, /*3883*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798396u,138442752u,393216u}/* 126A */, /*3884*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798404u,138442752u,393216u}/* 126B */, /*3885*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798412u,138442752u,393216u}/* 126C */, /*3886*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798420u,138442752u,393216u}/* 126D */, /*3887*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798428u,138442752u,393216u}/* 126E */, /*3888*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798436u,138442752u,393216u}/* 126F */, /*3889*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798444u,138442752u,393216u}/* 1270 */, /*3890*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798452u,138442752u,393216u}/* 1271 */, /*3891*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798460u,138442752u,393216u}/* 1272 */, /*3892*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798468u,138442752u,393216u}/* 1273 */, /*3893*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798476u,138442752u,393216u}/* 1274 */, /*3894*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798484u,138442752u,393216u}/* 1275 */, /*3895*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798492u,138442752u,393216u}/* 1276 */, /*3896*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798500u,138442752u,393216u}/* 1277 */, /*3897*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798516u,138442752u,393216u}/* 1278 */, /*3898*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798524u,138442752u,393216u}/* 1279 */, /*3899*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798532u,138442752u,393216u}/* 127A */, /*3900*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798540u,138442752u,393216u}/* 127B */, /*3901*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798548u,138442752u,393216u}/* 127C */, /*3902*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798556u,138442752u,393216u}/* 127D */, /*3903*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798564u,138442752u,393216u}/* 127E */, /*3904*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798572u,138442752u,393216u}/* 127F */, /*3905*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798588u,138442752u,393216u}/* 1280 */, /*3906*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798596u,138442752u,393216u}/* 1281 */, /*3907*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798604u,138442752u,393216u}/* 1282 */, /*3908*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798612u,138442752u,393216u}/* 1283 */, /*3909*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798620u,138442752u,393216u}/* 1284 */, /*3910*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798628u,138442752u,393216u}/* 1285 */, /*3911*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798636u,138442752u,393216u}/* 1286 */, /*3912*/{0,304u,1703937u,76808197u,1515560u,3758096416u,1677798644u,138442752u,393216u}/* 1287 */, /*3913*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798652u,138442752u,393216u}/* 1288 */, /*3914*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798660u,138442752u,393216u}/* 128A */, /*3915*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798668u,138442752u,393216u}/* 128B */, /*3916*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798676u,138442752u,393216u}/* 128C */, /*3917*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798684u,138442752u,393216u}/* 128D */, /*3918*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798692u,138442752u,393216u}/* 1290 */, /*3919*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798700u,138442752u,393216u}/* 1291 */, /*3920*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798708u,138442752u,393216u}/* 1292 */, /*3921*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798716u,138442752u,393216u}/* 1293 */, /*3922*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798724u,138442752u,393216u}/* 1294 */, /*3923*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798732u,138442752u,393216u}/* 1295 */, /*3924*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798740u,138442752u,393216u}/* 1296 */, /*3925*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798748u,138442752u,393216u}/* 1297 */, /*3926*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798764u,138442752u,393216u}/* 1298 */, /*3927*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798772u,138442752u,393216u}/* 1299 */, /*3928*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798780u,138442752u,393216u}/* 129A */, /*3929*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798788u,138442752u,393216u}/* 129B */, /*3930*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798796u,138442752u,393216u}/* 129C */, /*3931*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798804u,138442752u,393216u}/* 129D */, /*3932*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798812u,138442752u,393216u}/* 129E */, /*3933*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798820u,138442752u,393216u}/* 129F */, /*3934*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798836u,138442752u,393216u}/* 12A0 */, /*3935*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798844u,138442752u,393216u}/* 12A1 */, /*3936*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798852u,138442752u,393216u}/* 12A2 */, /*3937*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798860u,138442752u,393216u}/* 12A3 */, /*3938*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798868u,138442752u,393216u}/* 12A4 */, /*3939*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798876u,138442752u,393216u}/* 12A5 */, /*3940*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798884u,138442752u,393216u}/* 12A6 */, /*3941*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798892u,138442752u,393216u}/* 12A7 */, /*3942*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798908u,138442752u,393216u}/* 12A8 */, /*3943*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798916u,138442752u,393216u}/* 12A9 */, /*3944*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798924u,138442752u,393216u}/* 12AA */, /*3945*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798932u,138442752u,393216u}/* 12AB */, /*3946*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798940u,138442752u,393216u}/* 12AC */, /*3947*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798948u,138442752u,393216u}/* 12AD */, /*3948*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798956u,138442752u,393216u}/* 12AE */, /*3949*/{0,304u,1703937u,76808197u,1515560u,3758096416u,1677798964u,138442752u,393216u}/* 12AF */, /*3950*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798972u,138442752u,393216u}/* 12B0 */, /*3951*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798980u,138442752u,393216u}/* 12B2 */, /*3952*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798988u,138442752u,393216u}/* 12B3 */, /*3953*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677798996u,138442752u,393216u}/* 12B4 */, /*3954*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799004u,138442752u,393216u}/* 12B5 */, /*3955*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799012u,138442752u,393216u}/* 12B8 */, /*3956*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799020u,138442752u,393216u}/* 12B9 */, /*3957*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799028u,138442752u,393216u}/* 12BA */, /*3958*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799036u,138442752u,393216u}/* 12BB */, /*3959*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799044u,138442752u,393216u}/* 12BC */, /*3960*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799052u,138442752u,393216u}/* 12BD */, /*3961*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799060u,138442752u,393216u}/* 12BE */, /*3962*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799068u,138442752u,393216u}/* 12C0 */, /*3963*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799076u,138442752u,393216u}/* 12C2 */, /*3964*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799084u,138442752u,393216u}/* 12C3 */, /*3965*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799092u,138442752u,393216u}/* 12C4 */, /*3966*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799100u,138442752u,393216u}/* 12C5 */, /*3967*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799108u,138442752u,393216u}/* 12C8 */, /*3968*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799116u,138442752u,393216u}/* 12C9 */, /*3969*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799124u,138442752u,393216u}/* 12CA */, /*3970*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799132u,138442752u,393216u}/* 12CB */, /*3971*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799140u,138442752u,393216u}/* 12CC */, /*3972*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799148u,138442752u,393216u}/* 12CD */, /*3973*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799156u,138442752u,393216u}/* 12CE */, /*3974*/{0,304u,1703937u,76808197u,1515560u,3758096416u,1677799164u,138442752u,393216u}/* 12CF */, /*3975*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799172u,138442752u,393216u}/* 12D0 */, /*3976*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799180u,138442752u,393216u}/* 12D1 */, /*3977*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799188u,138442752u,393216u}/* 12D2 */, /*3978*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799196u,138442752u,393216u}/* 12D3 */, /*3979*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799204u,138442752u,393216u}/* 12D4 */, /*3980*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799212u,138442752u,393216u}/* 12D5 */, /*3981*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799220u,138442752u,393216u}/* 12D6 */, /*3982*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799228u,138442752u,393216u}/* 12D8 */, /*3983*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799236u,138442752u,393216u}/* 12D9 */, /*3984*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799244u,138442752u,393216u}/* 12DA */, /*3985*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799252u,138442752u,393216u}/* 12DB */, /*3986*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799260u,138442752u,393216u}/* 12DC */, /*3987*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799268u,138442752u,393216u}/* 12DD */, /*3988*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799276u,138442752u,393216u}/* 12DE */, /*3989*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799284u,138442752u,393216u}/* 12DF */, /*3990*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799348u,138442752u,393216u}/* 12E0 */, /*3991*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799356u,138442752u,393216u}/* 12E1 */, /*3992*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799364u,138442752u,393216u}/* 12E2 */, /*3993*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799372u,138442752u,393216u}/* 12E3 */, /*3994*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799380u,138442752u,393216u}/* 12E4 */, /*3995*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799388u,138442752u,393216u}/* 12E5 */, /*3996*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799396u,138442752u,393216u}/* 12E6 */, /*3997*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799404u,138442752u,393216u}/* 12E7 */, /*3998*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799412u,138442752u,393216u}/* 12E8 */, /*3999*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799420u,138442752u,393216u}/* 12E9 */, /*4000*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799428u,138442752u,393216u}/* 12EA */, /*4001*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799436u,138442752u,393216u}/* 12EB */, /*4002*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799444u,138442752u,393216u}/* 12EC */, /*4003*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799452u,138442752u,393216u}/* 12ED */, /*4004*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799460u,138442752u,393216u}/* 12EE */, /*4005*/{0,304u,1703937u,76808197u,1515560u,3758096416u,1677799468u,138442752u,393216u}/* 12EF */, /*4006*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799476u,138442752u,393216u}/* 12F0 */, /*4007*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799484u,138442752u,393216u}/* 12F1 */, /*4008*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799492u,138442752u,393216u}/* 12F2 */, /*4009*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799500u,138442752u,393216u}/* 12F3 */, /*4010*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799508u,138442752u,393216u}/* 12F4 */, /*4011*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799516u,138442752u,393216u}/* 12F5 */, /*4012*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799524u,138442752u,393216u}/* 12F6 */, /*4013*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799532u,138442752u,393216u}/* 12F7 */, /*4014*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799596u,138442752u,393216u}/* 12F8 */, /*4015*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799604u,138442752u,393216u}/* 12F9 */, /*4016*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799612u,138442752u,393216u}/* 12FA */, /*4017*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799620u,138442752u,393216u}/* 12FB */, /*4018*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799628u,138442752u,393216u}/* 12FC */, /*4019*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799636u,138442752u,393216u}/* 12FD */, /*4020*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799644u,138442752u,393216u}/* 12FE */, /*4021*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799652u,138442752u,393216u}/* 12FF */, /*4022*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799668u,138442752u,393216u}/* 1300 */, /*4023*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799676u,138442752u,393216u}/* 1301 */, /*4024*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799684u,138442752u,393216u}/* 1302 */, /*4025*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799692u,138442752u,393216u}/* 1303 */, /*4026*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799700u,138442752u,393216u}/* 1304 */, /*4027*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799708u,138442752u,393216u}/* 1305 */, /*4028*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799716u,138442752u,393216u}/* 1306 */, /*4029*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799724u,138442752u,393216u}/* 1307 */, /*4030*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799740u,138442752u,393216u}/* 1308 */, /*4031*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799748u,138442752u,393216u}/* 1309 */, /*4032*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799756u,138442752u,393216u}/* 130A */, /*4033*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799764u,138442752u,393216u}/* 130B */, /*4034*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799772u,138442752u,393216u}/* 130C */, /*4035*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799780u,138442752u,393216u}/* 130D */, /*4036*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799788u,138442752u,393216u}/* 130E */, /*4037*/{0,304u,1703937u,76808197u,1515560u,3758096416u,1677799796u,138442752u,393216u}/* 130F */, /*4038*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799804u,138442752u,393216u}/* 1310 */, /*4039*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799812u,138442752u,393216u}/* 1312 */, /*4040*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799820u,138442752u,393216u}/* 1313 */, /*4041*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799828u,138442752u,393216u}/* 1314 */, /*4042*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799836u,138442752u,393216u}/* 1315 */, /*4043*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799844u,138442752u,393216u}/* 1318 */, /*4044*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799852u,138442752u,393216u}/* 1319 */, /*4045*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799860u,138442752u,393216u}/* 131A */, /*4046*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799868u,138442752u,393216u}/* 131B */, /*4047*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799876u,138442752u,393216u}/* 131C */, /*4048*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799884u,138442752u,393216u}/* 131D */, /*4049*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799892u,138442752u,393216u}/* 131E */, /*4050*/{0,304u,1703937u,76808197u,1515560u,3758096416u,1677799900u,138442752u,393216u}/* 131F */, /*4051*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799940u,138442752u,393216u}/* 1320 */, /*4052*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799948u,138442752u,393216u}/* 1321 */, /*4053*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799956u,138442752u,393216u}/* 1322 */, /*4054*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799964u,138442752u,393216u}/* 1323 */, /*4055*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799972u,138442752u,393216u}/* 1324 */, /*4056*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799980u,138442752u,393216u}/* 1325 */, /*4057*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799988u,138442752u,393216u}/* 1326 */, /*4058*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677799996u,138442752u,393216u}/* 1327 */, /*4059*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800012u,138442752u,393216u}/* 1328 */, /*4060*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800020u,138442752u,393216u}/* 1329 */, /*4061*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800028u,138442752u,393216u}/* 132A */, /*4062*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800036u,138442752u,393216u}/* 132B */, /*4063*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800044u,138442752u,393216u}/* 132C */, /*4064*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800052u,138442752u,393216u}/* 132D */, /*4065*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800060u,138442752u,393216u}/* 132E */, /*4066*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800068u,138442752u,393216u}/* 132F */, /*4067*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800140u,138442752u,393216u}/* 1330 */, /*4068*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800148u,138442752u,393216u}/* 1331 */, /*4069*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800156u,138442752u,393216u}/* 1332 */, /*4070*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800164u,138442752u,393216u}/* 1333 */, /*4071*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800172u,138442752u,393216u}/* 1334 */, /*4072*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800180u,138442752u,393216u}/* 1335 */, /*4073*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800188u,138442752u,393216u}/* 1336 */, /*4074*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800196u,138442752u,393216u}/* 1337 */, /*4075*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800212u,138442752u,393216u}/* 1338 */, /*4076*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800220u,138442752u,393216u}/* 1339 */, /*4077*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800228u,138442752u,393216u}/* 133A */, /*4078*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800236u,138442752u,393216u}/* 133B */, /*4079*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800244u,138442752u,393216u}/* 133C */, /*4080*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800252u,138442752u,393216u}/* 133D */, /*4081*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800260u,138442752u,393216u}/* 133E */, /*4082*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800268u,138442752u,393216u}/* 133F */, /*4083*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800332u,138442752u,393216u}/* 1340 */, /*4084*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800340u,138442752u,393216u}/* 1341 */, /*4085*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800348u,138442752u,393216u}/* 1342 */, /*4086*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800356u,138442752u,393216u}/* 1343 */, /*4087*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800364u,138442752u,393216u}/* 1344 */, /*4088*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800372u,138442752u,393216u}/* 1345 */, /*4089*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800380u,138442752u,393216u}/* 1346 */, /*4090*/{0,304u,1703937u,76808197u,1515560u,3758096416u,1677800388u,138442752u,393216u}/* 1347 */, /*4091*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800396u,138442752u,393216u}/* 1348 */, /*4092*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800404u,138442752u,393216u}/* 1349 */, /*4093*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800412u,138442752u,393216u}/* 134A */, /*4094*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800420u,138442752u,393216u}/* 134B */, /*4095*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800428u,138442752u,393216u}/* 134C */, /*4096*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800436u,138442752u,393216u}/* 134D */, /*4097*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800444u,138442752u,393216u}/* 134E */, /*4098*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800452u,138442752u,393216u}/* 134F */, /*4099*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800492u,138442752u,393216u}/* 1350 */, /*4100*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800500u,138442752u,393216u}/* 1351 */, /*4101*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800508u,138442752u,393216u}/* 1352 */, /*4102*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800516u,138442752u,393216u}/* 1353 */, /*4103*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800524u,138442752u,393216u}/* 1354 */, /*4104*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800532u,138442752u,393216u}/* 1355 */, /*4105*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800540u,138442752u,393216u}/* 1356 */, /*4106*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800548u,138442752u,393216u}/* 1357 */, /*4107*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800596u,138442752u,393216u}/* 1358 */, /*4108*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800604u,138442752u,393216u}/* 1359 */, /*4109*/{0,304u,1703937u,76677125u,1515560u,3758096416u,1677800612u,138442752u,393216u}/* 135A */, /*4110*/{0,304u,1703937u,3424006150u,672030728u,1627389968u,1077936140u,763394048u,262144u}/* 135D */, /*4111*/{0,304u,1703937u,3424006150u,672030728u,1627389968u,1077936140u,759199744u,262144u}/* 135E */, /*4112*/{0,304u,1703937u,3423875078u,672030728u,3774873616u,1077936140u,755005952u,262144u}/* 135F */, /*4113*/{0,304u,1703937u,76808215u,40u,1610612768u,5708u,138442754u,0}/* 1360 */, /*4114*/{0,304u,1703937u,69337111u,40u,1610612768u,4764u,138442754u,8388608u}/* 1361 */, /*4115*/{0,304u,1703937u,76677143u,98344u,1610612768u,5108u,138442754u,41943040u}/* 1362 */, /*4116*/{0,304u,1703937u,76677143u,40u,1610612768u,4772u,138442754u,8388608u}/* 1363 */, /*4117*/{0,304u,1703937u,76677143u,40u,1610612768u,4780u,138442754u,8388608u}/* 1364 */, /*4118*/{0,304u,1703937u,76677143u,40u,1610612768u,4788u,138442754u,8388608u}/* 1365 */, /*4119*/{0,304u,1703937u,76677143u,40u,1610612768u,4796u,138442754u,8388608u}/* 1366 */, /*4120*/{0,304u,1703937u,76677143u,98344u,1610612768u,4980u,138442754u,41943040u}/* 1367 */, /*4121*/{0,304u,1703937u,76677143u,98344u,1610612768u,5716u,138442754u,41943040u}/* 1368 */, /*4122*/{0,304u,538576385u,76677131u,8388652u,1610612768u,1073800493u,138442816u,262144u}/* 1369 */, /*4123*/{0,304u,572131841u,76677131u,8388652u,1610612768u,1073800501u,138442816u,262144u}/* 136A */, /*4124*/{0,304u,605685761u,76677131u,8388652u,1610612768u,1073800509u,138442816u,262144u}/* 136B */, /*4125*/{0,304u,639242241u,76677131u,8388652u,1610612768u,1073800517u,138442816u,262144u}/* 136C */, /*4126*/{0,304u,672795649u,76677131u,8388652u,1610612768u,1073800525u,138442816u,262144u}/* 136D */, /*4127*/{0,304u,706352641u,76677131u,8388652u,1610612768u,1073800533u,138442816u,262144u}/* 136E */, /*4128*/{0,304u,739905025u,76677131u,8388652u,1610612768u,1073800541u,138442816u,262144u}/* 136F */, /*4129*/{0,304u,773463041u,76677131u,8388652u,1610612768u,1073800549u,138442816u,262144u}/* 1370 */, /*4130*/{0,304u,807015425u,76677131u,8388652u,1610612768u,1073800557u,138442816u,262144u}/* 1371 */, /*4131*/{0,304u,823795713u,76677131u,8388650u,1610612768u,55557u,138442752u,0}/* 1372 */, /*4132*/{0,304u,991570945u,76677131u,8388650u,1610612768u,55565u,138442752u,0}/* 1373 */, /*4133*/{0,304u,1159348225u,76677131u,8388650u,1610612768u,55573u,138442752u,0}/* 1374 */, /*4134*/{0,304u,1327125505u,76677131u,8388650u,1610612768u,55581u,138442752u,0}/* 1375 */, /*4135*/{0,304u,1494902785u,76677131u,8388650u,1610612768u,55589u,138442752u,0}/* 1376 */, /*4136*/{0,304u,1511680513u,76677131u,8388650u,1610612768u,55597u,138442752u,0}/* 1377 */, /*4137*/{0,304u,1528458241u,76677131u,8388650u,1610612768u,55605u,138442752u,0}/* 1378 */, /*4138*/{0,304u,1545235969u,76677131u,8388650u,1610612768u,55613u,138442752u,0}/* 1379 */, /*4139*/{0,304u,1562013697u,76677131u,8388650u,1610612768u,55621u,138442752u,0}/* 137A */, /*4140*/{0,304u,1578791425u,76677131u,8388650u,1610612768u,55629u,138442752u,0}/* 137B */, /*4141*/{0,304u,1880790529u,76677131u,8388650u,1610612768u,55637u,138442752u,0}/* 137C */, /*4142*/{0,312u,1703937u,76808197u,1515560u,3758096416u,1677797708u,138442752u,393216u}/* 1380 */, /*4143*/{0,312u,1703937u,76808197u,1515560u,3758096416u,1677797716u,138442752u,393216u}/* 1381 */, /*4144*/{0,312u,1703937u,76808197u,1515560u,3758096416u,1677797724u,138442752u,393216u}/* 1382 */, /*4145*/{0,312u,1703937u,76808197u,1515560u,3758096416u,1677797732u,138442752u,393216u}/* 1383 */, /*4146*/{0,312u,1703937u,76808197u,1515560u,3758096416u,1677798340u,138442752u,393216u}/* 1384 */, /*4147*/{0,312u,1703937u,76808197u,1515560u,3758096416u,1677798348u,138442752u,393216u}/* 1385 */, /*4148*/{0,312u,1703937u,76808197u,1515560u,3758096416u,1677798356u,138442752u,393216u}/* 1386 */, /*4149*/{0,312u,1703937u,76808197u,1515560u,3758096416u,1677798364u,138442752u,393216u}/* 1387 */, /*4150*/{0,312u,1703937u,76808197u,1515560u,3758096416u,1677800460u,138442752u,393216u}/* 1388 */, /*4151*/{0,312u,1703937u,76808197u,1515560u,3758096416u,1677800468u,138442752u,393216u}/* 1389 */, /*4152*/{0,312u,1703937u,76808197u,1515560u,3758096416u,1677800476u,138442752u,393216u}/* 138A */, /*4153*/{0,312u,1703937u,76808197u,1515560u,3758096416u,1677800484u,138442752u,393216u}/* 138B */, /*4154*/{0,312u,1703937u,76808197u,1515560u,3758096416u,1677800556u,138442752u,393216u}/* 138C */, /*4155*/{0,312u,1703937u,76808197u,1515560u,3758096416u,1677800564u,138442752u,393216u}/* 138D */, /*4156*/{0,312u,1703937u,76808197u,1515560u,3758096416u,1677800572u,138442752u,393216u}/* 138E */, /*4157*/{0,312u,1703937u,76808197u,1515560u,3758096416u,1677800580u,138442752u,393216u}/* 138F */, /*4158*/{0,312u,1703937u,76818459u,40u,1610612768u,9964u,138442752u,67108864u}/* 1390 */, /*4159*/{0,312u,1703937u,76818459u,40u,1610612768u,9972u,138442752u,67108864u}/* 1391 */, /*4160*/{0,312u,1703937u,76818459u,40u,1610612768u,9980u,138442752u,67108864u}/* 1392 */, /*4161*/{0,312u,1703937u,76818459u,40u,1610612768u,9988u,138442752u,67108864u}/* 1393 */, /*4162*/{0,312u,1703937u,76818459u,40u,1610612768u,9996u,138442752u,67108864u}/* 1394 */, /*4163*/{0,312u,1703937u,76818459u,40u,1610612768u,10004u,138442752u,67108864u}/* 1395 */, /*4164*/{0,312u,1703937u,76818459u,40u,1610612768u,10012u,138442752u,67108864u}/* 1396 */, /*4165*/{0,312u,1703937u,76818459u,40u,1610612768u,10020u,138442752u,67108864u}/* 1397 */, /*4166*/{0,312u,1703937u,76818459u,40u,1610612768u,10028u,138442752u,67108864u}/* 1398 */, /*4167*/{0,312u,1703937u,76818459u,40u,1610612768u,10036u,138442752u,67108864u}/* 1399 */, /*4168*/{128000u,320u,1769473u,76677121u,1507368u,3769630752u,1711383740u,138491904u,2490368u}/* 13A0 */, /*4169*/{128128u,320u,1769473u,76677121u,1507368u,3769630752u,1711383748u,138491904u,2490368u}/* 13A1 */, /*4170*/{128256u,320u,1769473u,76677121u,1507368u,3769630752u,1711383756u,138491904u,2490368u}/* 13A2 */, /*4171*/{128384u,320u,1769473u,76677121u,1507368u,3769630752u,1711383764u,138491904u,2490368u}/* 13A3 */, /*4172*/{128512u,320u,1769473u,76677121u,1507368u,3769630752u,1711383772u,138491904u,2490368u}/* 13A4 */, /*4173*/{128640u,320u,1769473u,76677121u,1507368u,3769630752u,1711383780u,138491904u,2490368u}/* 13A5 */, /*4174*/{128768u,320u,1769473u,76677121u,1507368u,3769630752u,1711383788u,138491904u,2490368u}/* 13A6 */, /*4175*/{128896u,320u,1769473u,76677121u,1507368u,3769630752u,1711383796u,138491904u,2490368u}/* 13A7 */, /*4176*/{129024u,320u,1769473u,76677121u,1507368u,3769630752u,1711383804u,138491904u,2490368u}/* 13A8 */, /*4177*/{129152u,320u,1769473u,76677121u,1507368u,3769630752u,1711383812u,138491904u,2490368u}/* 13A9 */, /*4178*/{129280u,320u,1769473u,76677121u,1507368u,3769630752u,1711383820u,138491904u,2490368u}/* 13AA */, /*4179*/{129408u,320u,1769473u,76677121u,1507368u,3769630752u,1711383828u,138491904u,2490368u}/* 13AB */, /*4180*/{129536u,320u,1769473u,76677121u,1507368u,3769630752u,1711383836u,138491904u,2490368u}/* 13AC */, /*4181*/{129664u,320u,1769473u,76677121u,1507368u,3769630752u,1711383844u,138491904u,2490368u}/* 13AD */, /*4182*/{129792u,320u,1769473u,76677121u,1507368u,3769630752u,1711383852u,138491904u,2490368u}/* 13AE */, /*4183*/{129920u,320u,1769473u,76677121u,1507368u,3769630752u,1711383860u,138491904u,2490368u}/* 13AF */, /*4184*/{130048u,320u,1769473u,76677121u,1507368u,3769630752u,1711383868u,138491904u,2490368u}/* 13B0 */, /*4185*/{130176u,320u,1769473u,76677121u,1507368u,3769630752u,1711383876u,138491904u,2490368u}/* 13B1 */, /*4186*/{130304u,320u,1769473u,76677121u,1507368u,3769630752u,1711383884u,138491904u,2490368u}/* 13B2 */, /*4187*/{130432u,320u,1769473u,76677121u,1507368u,3769630752u,1711383892u,138491904u,2490368u}/* 13B3 */, /*4188*/{130560u,320u,1769473u,76677121u,1507368u,3769630752u,1711383900u,138491904u,2490368u}/* 13B4 */, /*4189*/{130688u,320u,1769473u,76677121u,1507368u,3769630752u,1711383908u,138491904u,2490368u}/* 13B5 */, /*4190*/{130816u,320u,1769473u,76677121u,1507368u,3769630752u,1711383916u,138491904u,2490368u}/* 13B6 */, /*4191*/{130944u,320u,1769473u,76677121u,1507368u,3769630752u,1711383924u,138491904u,2490368u}/* 13B7 */, /*4192*/{131072u,320u,1769473u,76677121u,1507368u,3769630752u,1711383932u,138491904u,2490368u}/* 13B8 */, /*4193*/{131200u,320u,1769473u,76677121u,1507368u,3769630752u,1711383940u,138491904u,2490368u}/* 13B9 */, /*4194*/{131328u,320u,1769473u,76677121u,1507368u,3769630752u,1711383948u,138491904u,2490368u}/* 13BA */, /*4195*/{131456u,320u,1769473u,76677121u,1507368u,3769630752u,1711383956u,138491904u,2490368u}/* 13BB */, /*4196*/{131584u,320u,1769473u,76677121u,1507368u,3769630752u,1711383964u,138491904u,2490368u}/* 13BC */, /*4197*/{131712u,320u,1769473u,76677121u,1507368u,3769630752u,1711383972u,138491904u,2490368u}/* 13BD */, /*4198*/{131840u,320u,1769473u,76677121u,1507368u,3769630752u,1711383980u,138491904u,2490368u}/* 13BE */, /*4199*/{131968u,320u,1769473u,76677121u,1507368u,3769630752u,1711383988u,138491904u,2490368u}/* 13BF */, /*4200*/{132096u,320u,1769473u,76677121u,1507368u,3769630752u,1711383996u,138491904u,2490368u}/* 13C0 */, /*4201*/{132224u,320u,1769473u,76677121u,1507368u,3769630752u,1711384004u,138491904u,2490368u}/* 13C1 */, /*4202*/{132352u,320u,1769473u,76677121u,1507368u,3769630752u,1711384012u,138491904u,2490368u}/* 13C2 */, /*4203*/{132480u,320u,1769473u,76677121u,1507368u,3769630752u,1711384020u,138491904u,2490368u}/* 13C3 */, /*4204*/{132608u,320u,1769473u,76677121u,1507368u,3769630752u,1711384028u,138491904u,2490368u}/* 13C4 */, /*4205*/{132736u,320u,1769473u,76677121u,1507368u,3769630752u,1711384036u,138491904u,2490368u}/* 13C5 */, /*4206*/{132864u,320u,1769473u,76677121u,1507368u,3769630752u,1711384044u,138491904u,2490368u}/* 13C6 */, /*4207*/{132992u,320u,1769473u,76677121u,1507368u,3769630752u,1711384052u,138491904u,2490368u}/* 13C7 */, /*4208*/{133120u,320u,1769473u,76677121u,1507368u,3769630752u,1711384060u,138491904u,2490368u}/* 13C8 */, /*4209*/{133248u,320u,1769473u,76677121u,1507368u,3769630752u,1711384068u,138491904u,2490368u}/* 13C9 */, /*4210*/{133376u,320u,1769473u,76677121u,1507368u,3769630752u,1711384076u,138491904u,2490368u}/* 13CA */, /*4211*/{133504u,320u,1769473u,76677121u,1507368u,3769630752u,1711384084u,138491904u,2490368u}/* 13CB */, /*4212*/{133632u,320u,1769473u,76677121u,1507368u,3769630752u,1711384092u,138491904u,2490368u}/* 13CC */, /*4213*/{133760u,320u,1769473u,76677121u,1507368u,3769630752u,1711384100u,138491904u,2490368u}/* 13CD */, /*4214*/{133888u,320u,1769473u,76677121u,1507368u,3769630752u,1711384108u,138491904u,2490368u}/* 13CE */, /*4215*/{134016u,320u,1769473u,76677121u,1507368u,3769630752u,1711384116u,138491904u,2490368u}/* 13CF */, /*4216*/{134144u,320u,1769473u,76677121u,1507368u,3769630752u,1711384124u,138491904u,2490368u}/* 13D0 */, /*4217*/{134272u,320u,1769473u,76677121u,1507368u,3769630752u,1711384132u,138491904u,2490368u}/* 13D1 */, /*4218*/{134400u,320u,1769473u,76677121u,1507368u,3769630752u,1711384140u,138491904u,2490368u}/* 13D2 */, /*4219*/{134528u,320u,1769473u,76677121u,1507368u,3769630752u,1711384148u,138491904u,2490368u}/* 13D3 */, /*4220*/{134656u,320u,1769473u,76677121u,1507368u,3769630752u,1711384156u,138491904u,2490368u}/* 13D4 */, /*4221*/{134784u,320u,1769473u,76677121u,1507368u,3769630752u,1711384164u,138491904u,2490368u}/* 13D5 */, /*4222*/{134912u,320u,1769473u,76677121u,1507368u,3769630752u,1711384172u,138491904u,2490368u}/* 13D6 */, /*4223*/{135040u,320u,1769473u,76677121u,1507368u,3769630752u,1711384180u,138491904u,2490368u}/* 13D7 */, /*4224*/{135168u,320u,1769473u,76677121u,1507368u,3769630752u,1711384188u,138491904u,2490368u}/* 13D8 */, /*4225*/{135296u,320u,1769473u,76677121u,1507368u,3769630752u,1711384196u,138491904u,2490368u}/* 13D9 */, /*4226*/{135424u,320u,1769473u,76677121u,1507368u,3769630752u,1711384204u,138491904u,2490368u}/* 13DA */, /*4227*/{135552u,320u,1769473u,76677121u,1507368u,3769630752u,1711384212u,138491904u,2490368u}/* 13DB */, /*4228*/{135680u,320u,1769473u,76677121u,1507368u,3769630752u,1711384220u,138491904u,2490368u}/* 13DC */, /*4229*/{135808u,320u,1769473u,76677121u,1507368u,3769630752u,1711384228u,138491904u,2490368u}/* 13DD */, /*4230*/{135936u,320u,1769473u,76677121u,1507368u,3769630752u,1711384236u,138491904u,2490368u}/* 13DE */, /*4231*/{136064u,320u,1769473u,76677121u,1507368u,3769630752u,1711384244u,138491904u,2490368u}/* 13DF */, /*4232*/{136192u,320u,1769473u,76677121u,1507368u,3769630752u,1711384252u,138491904u,2490368u}/* 13E0 */, /*4233*/{136320u,320u,1769473u,76677121u,1507368u,3769630752u,1711384260u,138491904u,2490368u}/* 13E1 */, /*4234*/{136448u,320u,1769473u,76677121u,1507368u,3769630752u,1711384268u,138491904u,2490368u}/* 13E2 */, /*4235*/{136576u,320u,1769473u,76677121u,1507368u,3769630752u,1711384276u,138491904u,2490368u}/* 13E3 */, /*4236*/{136704u,320u,1769473u,76677121u,1507368u,3769630752u,1711384284u,138491904u,2490368u}/* 13E4 */, /*4237*/{136832u,320u,1769473u,76677121u,1507368u,3769630752u,1711384292u,138491904u,2490368u}/* 13E5 */, /*4238*/{136960u,320u,1769473u,76677121u,1507368u,3769630752u,1711384300u,138491904u,2490368u}/* 13E6 */, /*4239*/{137088u,320u,1769473u,76677121u,1507368u,3769630752u,1711384308u,138491904u,2490368u}/* 13E7 */, /*4240*/{137216u,320u,1769473u,76677121u,1507368u,3769630752u,1711384316u,138491904u,2490368u}/* 13E8 */, /*4241*/{137344u,320u,1769473u,76677121u,1507368u,3769630752u,1711384324u,138491904u,2490368u}/* 13E9 */, /*4242*/{137472u,320u,1769473u,76677121u,1507368u,3769630752u,1711384332u,138491904u,2490368u}/* 13EA */, /*4243*/{137600u,320u,1769473u,76677121u,1507368u,3769630752u,1711384340u,138491904u,2490368u}/* 13EB */, /*4244*/{137728u,320u,1769473u,76677121u,1507368u,3769630752u,1711384348u,138491904u,2490368u}/* 13EC */, /*4245*/{137856u,320u,1769473u,76677121u,1507368u,3769630752u,1711384356u,138491904u,2490368u}/* 13ED */, /*4246*/{137984u,320u,1769473u,76677121u,1507368u,3769630752u,1711384364u,138491904u,2490368u}/* 13EE */, /*4247*/{138112u,320u,1769473u,76677121u,1507368u,3769630752u,1711384372u,138491904u,2490368u}/* 13EF */, /*4248*/{138240u,320u,1769473u,76677121u,1507368u,3769630752u,1711384380u,138491904u,2490368u}/* 13F0 */, /*4249*/{138368u,320u,1769473u,76677121u,1507368u,3769630752u,1711384388u,138491904u,2490368u}/* 13F1 */, /*4250*/{138496u,320u,1769473u,76677121u,1507368u,3769630752u,1711384396u,138491904u,2490368u}/* 13F2 */, /*4251*/{138624u,320u,1769473u,76677121u,1507368u,3769630752u,1711384404u,138491904u,2490368u}/* 13F3 */, /*4252*/{138752u,320u,1769473u,76677121u,1507368u,3769630752u,1711384412u,138491904u,2490368u}/* 13F4 */, /*4253*/{138880u,320u,1769473u,77103105u,1507368u,3769630752u,1711384420u,138491904u,2490368u}/* 13F5 */, /*4254*/{139008u,1090519360u,1769473u,77103106u,1499176u,3807248416u,1719772988u,138442752u,393216u}/* 13F8 */, /*4255*/{139136u,1092616512u,1769473u,77103106u,1499176u,3807248416u,1719772996u,138442752u,393216u}/* 13F9 */, /*4256*/{139264u,1094713664u,1769473u,77103106u,1499176u,3807248416u,1719773004u,138442752u,393216u}/* 13FA */, /*4257*/{139392u,1096810816u,1769473u,77103106u,1499176u,3807248416u,1719773012u,138442752u,393216u}/* 13FB */, /*4258*/{139520u,1098907968u,1769473u,77103106u,1499176u,3807248416u,1719773020u,138442752u,393216u}/* 13FC */, /*4259*/{139648u,1101005120u,1769473u,77103106u,1499176u,3807248416u,1719773028u,138442752u,393216u}/* 13FD */, /*4260*/{0,328u,1835009u,69576723u,40u,1610678304u,4228u,138442754u,0}/* 1400 */, /*4261*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830284u,138442752u,393216u}/* 1401 */, /*4262*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830292u,138442752u,393216u}/* 1402 */, /*4263*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830300u,138442752u,393216u}/* 1403 */, /*4264*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830308u,138442752u,393216u}/* 1404 */, /*4265*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830316u,138442752u,393216u}/* 1405 */, /*4266*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830324u,138442752u,393216u}/* 1406 */, /*4267*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830332u,138442752u,393216u}/* 1407 */, /*4268*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830340u,138442752u,393216u}/* 1408 */, /*4269*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830348u,138442752u,393216u}/* 1409 */, /*4270*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830356u,138442752u,393216u}/* 140A */, /*4271*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830364u,138442752u,393216u}/* 140B */, /*4272*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830372u,138442752u,393216u}/* 140C */, /*4273*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830380u,138442752u,393216u}/* 140D */, /*4274*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830388u,138442752u,393216u}/* 140E */, /*4275*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830396u,138442752u,393216u}/* 140F */, /*4276*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830404u,138442752u,393216u}/* 1410 */, /*4277*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830412u,138442752u,393216u}/* 1411 */, /*4278*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830420u,138442752u,393216u}/* 1412 */, /*4279*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830428u,138442752u,393216u}/* 1413 */, /*4280*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830436u,138442752u,393216u}/* 1414 */, /*4281*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830444u,138442752u,393216u}/* 1415 */, /*4282*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830452u,138442752u,393216u}/* 1416 */, /*4283*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830460u,138442752u,393216u}/* 1417 */, /*4284*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830468u,138442752u,393216u}/* 1418 */, /*4285*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830476u,138442752u,393216u}/* 1419 */, /*4286*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830484u,138442752u,393216u}/* 141A */, /*4287*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830492u,138442752u,393216u}/* 141B */, /*4288*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830500u,138442752u,393216u}/* 141C */, /*4289*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830508u,138442752u,393216u}/* 141D */, /*4290*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830516u,138442752u,393216u}/* 141E */, /*4291*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830524u,138442752u,393216u}/* 141F */, /*4292*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830532u,138442752u,393216u}/* 1420 */, /*4293*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830540u,138442752u,393216u}/* 1421 */, /*4294*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830548u,138442752u,393216u}/* 1422 */, /*4295*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830556u,138442752u,393216u}/* 1423 */, /*4296*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830564u,138442752u,393216u}/* 1424 */, /*4297*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830572u,138442752u,393216u}/* 1425 */, /*4298*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830580u,138442752u,393216u}/* 1426 */, /*4299*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830588u,138442752u,393216u}/* 1427 */, /*4300*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830596u,138442752u,393216u}/* 1428 */, /*4301*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830604u,138442752u,393216u}/* 1429 */, /*4302*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830612u,138442752u,393216u}/* 142A */, /*4303*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830620u,138442752u,393216u}/* 142B */, /*4304*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830628u,138442752u,393216u}/* 142C */, /*4305*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830636u,138442752u,393216u}/* 142D */, /*4306*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830644u,138442752u,393216u}/* 142E */, /*4307*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830652u,138442752u,393216u}/* 142F */, /*4308*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830660u,138442752u,393216u}/* 1430 */, /*4309*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830668u,138442752u,393216u}/* 1431 */, /*4310*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830676u,138442752u,393216u}/* 1432 */, /*4311*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830684u,138442752u,393216u}/* 1433 */, /*4312*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830692u,138442752u,393216u}/* 1434 */, /*4313*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830700u,138442752u,393216u}/* 1435 */, /*4314*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830708u,138442752u,393216u}/* 1436 */, /*4315*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830716u,138442752u,393216u}/* 1437 */, /*4316*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830724u,138442752u,393216u}/* 1438 */, /*4317*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830732u,138442752u,393216u}/* 1439 */, /*4318*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830740u,138442752u,393216u}/* 143A */, /*4319*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830748u,138442752u,393216u}/* 143B */, /*4320*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830756u,138442752u,393216u}/* 143C */, /*4321*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830764u,138442752u,393216u}/* 143D */, /*4322*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830772u,138442752u,393216u}/* 143E */, /*4323*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830780u,138442752u,393216u}/* 143F */, /*4324*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830788u,138442752u,393216u}/* 1440 */, /*4325*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830796u,138442752u,393216u}/* 1441 */, /*4326*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830804u,138442752u,393216u}/* 1442 */, /*4327*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830812u,138442752u,393216u}/* 1443 */, /*4328*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830820u,138442752u,393216u}/* 1444 */, /*4329*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830828u,138442752u,393216u}/* 1445 */, /*4330*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830836u,138442752u,393216u}/* 1446 */, /*4331*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830844u,138442752u,393216u}/* 1447 */, /*4332*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830852u,138442752u,393216u}/* 1448 */, /*4333*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830860u,138442752u,393216u}/* 1449 */, /*4334*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830868u,138442752u,393216u}/* 144A */, /*4335*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830876u,138442752u,393216u}/* 144B */, /*4336*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830884u,138442752u,393216u}/* 144C */, /*4337*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830892u,138442752u,393216u}/* 144D */, /*4338*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830900u,138442752u,393216u}/* 144E */, /*4339*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830908u,138442752u,393216u}/* 144F */, /*4340*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830916u,138442752u,393216u}/* 1450 */, /*4341*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830924u,138442752u,393216u}/* 1451 */, /*4342*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830932u,138442752u,393216u}/* 1452 */, /*4343*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830940u,138442752u,393216u}/* 1453 */, /*4344*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830948u,138442752u,393216u}/* 1454 */, /*4345*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830956u,138442752u,393216u}/* 1455 */, /*4346*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830964u,138442752u,393216u}/* 1456 */, /*4347*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830972u,138442752u,393216u}/* 1457 */, /*4348*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830980u,138442752u,393216u}/* 1458 */, /*4349*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830988u,138442752u,393216u}/* 1459 */, /*4350*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677830996u,138442752u,393216u}/* 145A */, /*4351*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831004u,138442752u,393216u}/* 145B */, /*4352*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831012u,138442752u,393216u}/* 145C */, /*4353*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831020u,138442752u,393216u}/* 145D */, /*4354*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831028u,138442752u,393216u}/* 145E */, /*4355*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831036u,138442752u,393216u}/* 145F */, /*4356*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831044u,138442752u,393216u}/* 1460 */, /*4357*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831052u,138442752u,393216u}/* 1461 */, /*4358*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831060u,138442752u,393216u}/* 1462 */, /*4359*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831068u,138442752u,393216u}/* 1463 */, /*4360*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831076u,138442752u,393216u}/* 1464 */, /*4361*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831084u,138442752u,393216u}/* 1465 */, /*4362*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831092u,138442752u,393216u}/* 1466 */, /*4363*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831100u,138442752u,393216u}/* 1467 */, /*4364*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831108u,138442752u,393216u}/* 1468 */, /*4365*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831116u,138442752u,393216u}/* 1469 */, /*4366*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831124u,138442752u,393216u}/* 146A */, /*4367*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831132u,138442752u,393216u}/* 146B */, /*4368*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831140u,138442752u,393216u}/* 146C */, /*4369*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831148u,138442752u,393216u}/* 146D */, /*4370*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831156u,138442752u,393216u}/* 146E */, /*4371*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831164u,138442752u,393216u}/* 146F */, /*4372*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831172u,138442752u,393216u}/* 1470 */, /*4373*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831180u,138442752u,393216u}/* 1471 */, /*4374*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831188u,138442752u,393216u}/* 1472 */, /*4375*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831196u,138442752u,393216u}/* 1473 */, /*4376*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831204u,138442752u,393216u}/* 1474 */, /*4377*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831212u,138442752u,393216u}/* 1475 */, /*4378*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831220u,138442752u,393216u}/* 1476 */, /*4379*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831228u,138442752u,393216u}/* 1477 */, /*4380*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831236u,138442752u,393216u}/* 1478 */, /*4381*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831244u,138442752u,393216u}/* 1479 */, /*4382*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831252u,138442752u,393216u}/* 147A */, /*4383*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831260u,138442752u,393216u}/* 147B */, /*4384*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831268u,138442752u,393216u}/* 147C */, /*4385*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831276u,138442752u,393216u}/* 147D */, /*4386*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831284u,138442752u,393216u}/* 147E */, /*4387*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831292u,138442752u,393216u}/* 147F */, /*4388*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831300u,138442752u,393216u}/* 1480 */, /*4389*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831308u,138442752u,393216u}/* 1481 */, /*4390*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831316u,138442752u,393216u}/* 1482 */, /*4391*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831324u,138442752u,393216u}/* 1483 */, /*4392*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831332u,138442752u,393216u}/* 1484 */, /*4393*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831340u,138442752u,393216u}/* 1485 */, /*4394*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831348u,138442752u,393216u}/* 1486 */, /*4395*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831356u,138442752u,393216u}/* 1487 */, /*4396*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831364u,138442752u,393216u}/* 1488 */, /*4397*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831372u,138442752u,393216u}/* 1489 */, /*4398*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831380u,138442752u,393216u}/* 148A */, /*4399*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831388u,138442752u,393216u}/* 148B */, /*4400*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831396u,138442752u,393216u}/* 148C */, /*4401*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831404u,138442752u,393216u}/* 148D */, /*4402*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831412u,138442752u,393216u}/* 148E */, /*4403*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831420u,138442752u,393216u}/* 148F */, /*4404*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831428u,138442752u,393216u}/* 1490 */, /*4405*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831436u,138442752u,393216u}/* 1491 */, /*4406*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831444u,138442752u,393216u}/* 1492 */, /*4407*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831452u,138442752u,393216u}/* 1493 */, /*4408*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831460u,138442752u,393216u}/* 1494 */, /*4409*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831468u,138442752u,393216u}/* 1495 */, /*4410*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831476u,138442752u,393216u}/* 1496 */, /*4411*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831484u,138442752u,393216u}/* 1497 */, /*4412*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831492u,138442752u,393216u}/* 1498 */, /*4413*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831500u,138442752u,393216u}/* 1499 */, /*4414*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831508u,138442752u,393216u}/* 149A */, /*4415*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831516u,138442752u,393216u}/* 149B */, /*4416*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831524u,138442752u,393216u}/* 149C */, /*4417*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831532u,138442752u,393216u}/* 149D */, /*4418*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831540u,138442752u,393216u}/* 149E */, /*4419*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831548u,138442752u,393216u}/* 149F */, /*4420*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831556u,138442752u,393216u}/* 14A0 */, /*4421*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831564u,138442752u,393216u}/* 14A1 */, /*4422*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831572u,138442752u,393216u}/* 14A2 */, /*4423*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831580u,138442752u,393216u}/* 14A3 */, /*4424*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831588u,138442752u,393216u}/* 14A4 */, /*4425*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831596u,138442752u,393216u}/* 14A5 */, /*4426*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831604u,138442752u,393216u}/* 14A6 */, /*4427*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831612u,138442752u,393216u}/* 14A7 */, /*4428*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831620u,138442752u,393216u}/* 14A8 */, /*4429*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831628u,138442752u,393216u}/* 14A9 */, /*4430*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831636u,138442752u,393216u}/* 14AA */, /*4431*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831644u,138442752u,393216u}/* 14AB */, /*4432*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831652u,138442752u,393216u}/* 14AC */, /*4433*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831660u,138442752u,393216u}/* 14AD */, /*4434*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831668u,138442752u,393216u}/* 14AE */, /*4435*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831676u,138442752u,393216u}/* 14AF */, /*4436*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831684u,138442752u,393216u}/* 14B0 */, /*4437*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831692u,138442752u,393216u}/* 14B1 */, /*4438*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831700u,138442752u,393216u}/* 14B2 */, /*4439*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831708u,138442752u,393216u}/* 14B3 */, /*4440*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831716u,138442752u,393216u}/* 14B4 */, /*4441*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831724u,138442752u,393216u}/* 14B5 */, /*4442*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831732u,138442752u,393216u}/* 14B6 */, /*4443*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831740u,138442752u,393216u}/* 14B7 */, /*4444*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831748u,138442752u,393216u}/* 14B8 */, /*4445*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831756u,138442752u,393216u}/* 14B9 */, /*4446*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831764u,138442752u,393216u}/* 14BA */, /*4447*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831772u,138442752u,393216u}/* 14BB */, /*4448*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831780u,138442752u,393216u}/* 14BC */, /*4449*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831788u,138442752u,393216u}/* 14BD */, /*4450*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831796u,138442752u,393216u}/* 14BE */, /*4451*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831804u,138442752u,393216u}/* 14BF */, /*4452*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831812u,138442752u,393216u}/* 14C0 */, /*4453*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831820u,138442752u,393216u}/* 14C1 */, /*4454*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831828u,138442752u,393216u}/* 14C2 */, /*4455*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831836u,138442752u,393216u}/* 14C3 */, /*4456*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831844u,138442752u,393216u}/* 14C4 */, /*4457*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831852u,138442752u,393216u}/* 14C5 */, /*4458*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831860u,138442752u,393216u}/* 14C6 */, /*4459*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831868u,138442752u,393216u}/* 14C7 */, /*4460*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831876u,138442752u,393216u}/* 14C8 */, /*4461*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831884u,138442752u,393216u}/* 14C9 */, /*4462*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831892u,138442752u,393216u}/* 14CA */, /*4463*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831900u,138442752u,393216u}/* 14CB */, /*4464*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831908u,138442752u,393216u}/* 14CC */, /*4465*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831916u,138442752u,393216u}/* 14CD */, /*4466*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831924u,138442752u,393216u}/* 14CE */, /*4467*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831932u,138442752u,393216u}/* 14CF */, /*4468*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831940u,138442752u,393216u}/* 14D0 */, /*4469*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831948u,138442752u,393216u}/* 14D1 */, /*4470*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831956u,138442752u,393216u}/* 14D2 */, /*4471*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831964u,138442752u,393216u}/* 14D3 */, /*4472*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831972u,138442752u,393216u}/* 14D4 */, /*4473*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831980u,138442752u,393216u}/* 14D5 */, /*4474*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831988u,138442752u,393216u}/* 14D6 */, /*4475*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677831996u,138442752u,393216u}/* 14D7 */, /*4476*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832004u,138442752u,393216u}/* 14D8 */, /*4477*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832012u,138442752u,393216u}/* 14D9 */, /*4478*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832020u,138442752u,393216u}/* 14DA */, /*4479*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832028u,138442752u,393216u}/* 14DB */, /*4480*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832036u,138442752u,393216u}/* 14DC */, /*4481*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832044u,138442752u,393216u}/* 14DD */, /*4482*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832052u,138442752u,393216u}/* 14DE */, /*4483*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832060u,138442752u,393216u}/* 14DF */, /*4484*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832068u,138442752u,393216u}/* 14E0 */, /*4485*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832076u,138442752u,393216u}/* 14E1 */, /*4486*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832084u,138442752u,393216u}/* 14E2 */, /*4487*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832092u,138442752u,393216u}/* 14E3 */, /*4488*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832100u,138442752u,393216u}/* 14E4 */, /*4489*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832108u,138442752u,393216u}/* 14E5 */, /*4490*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832116u,138442752u,393216u}/* 14E6 */, /*4491*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832124u,138442752u,393216u}/* 14E7 */, /*4492*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832132u,138442752u,393216u}/* 14E8 */, /*4493*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832140u,138442752u,393216u}/* 14E9 */, /*4494*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832148u,138442752u,393216u}/* 14EA */, /*4495*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832156u,138442752u,393216u}/* 14EB */, /*4496*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832164u,138442752u,393216u}/* 14EC */, /*4497*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832172u,138442752u,393216u}/* 14ED */, /*4498*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832180u,138442752u,393216u}/* 14EE */, /*4499*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832188u,138442752u,393216u}/* 14EF */, /*4500*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832196u,138442752u,393216u}/* 14F0 */, /*4501*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832204u,138442752u,393216u}/* 14F1 */, /*4502*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832212u,138442752u,393216u}/* 14F2 */, /*4503*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832220u,138442752u,393216u}/* 14F3 */, /*4504*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832228u,138442752u,393216u}/* 14F4 */, /*4505*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832236u,138442752u,393216u}/* 14F5 */, /*4506*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832244u,138442752u,393216u}/* 14F6 */, /*4507*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832252u,138442752u,393216u}/* 14F7 */, /*4508*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832260u,138442752u,393216u}/* 14F8 */, /*4509*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832268u,138442752u,393216u}/* 14F9 */, /*4510*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832276u,138442752u,393216u}/* 14FA */, /*4511*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832284u,138442752u,393216u}/* 14FB */, /*4512*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832292u,138442752u,393216u}/* 14FC */, /*4513*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832300u,138442752u,393216u}/* 14FD */, /*4514*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832308u,138442752u,393216u}/* 14FE */, /*4515*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832316u,138442752u,393216u}/* 14FF */, /*4516*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832324u,138442752u,393216u}/* 1500 */, /*4517*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832332u,138442752u,393216u}/* 1501 */, /*4518*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832340u,138442752u,393216u}/* 1502 */, /*4519*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832348u,138442752u,393216u}/* 1503 */, /*4520*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832356u,138442752u,393216u}/* 1504 */, /*4521*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832364u,138442752u,393216u}/* 1505 */, /*4522*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832372u,138442752u,393216u}/* 1506 */, /*4523*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832380u,138442752u,393216u}/* 1507 */, /*4524*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832388u,138442752u,393216u}/* 1508 */, /*4525*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832396u,138442752u,393216u}/* 1509 */, /*4526*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832404u,138442752u,393216u}/* 150A */, /*4527*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832412u,138442752u,393216u}/* 150B */, /*4528*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832420u,138442752u,393216u}/* 150C */, /*4529*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832428u,138442752u,393216u}/* 150D */, /*4530*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832436u,138442752u,393216u}/* 150E */, /*4531*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832444u,138442752u,393216u}/* 150F */, /*4532*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832452u,138442752u,393216u}/* 1510 */, /*4533*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832460u,138442752u,393216u}/* 1511 */, /*4534*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832468u,138442752u,393216u}/* 1512 */, /*4535*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832476u,138442752u,393216u}/* 1513 */, /*4536*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832484u,138442752u,393216u}/* 1514 */, /*4537*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832492u,138442752u,393216u}/* 1515 */, /*4538*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832500u,138442752u,393216u}/* 1516 */, /*4539*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832508u,138442752u,393216u}/* 1517 */, /*4540*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832516u,138442752u,393216u}/* 1518 */, /*4541*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832524u,138442752u,393216u}/* 1519 */, /*4542*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832532u,138442752u,393216u}/* 151A */, /*4543*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832540u,138442752u,393216u}/* 151B */, /*4544*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832548u,138442752u,393216u}/* 151C */, /*4545*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832556u,138442752u,393216u}/* 151D */, /*4546*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832564u,138442752u,393216u}/* 151E */, /*4547*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832572u,138442752u,393216u}/* 151F */, /*4548*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832580u,138442752u,393216u}/* 1520 */, /*4549*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832588u,138442752u,393216u}/* 1521 */, /*4550*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832596u,138442752u,393216u}/* 1522 */, /*4551*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832604u,138442752u,393216u}/* 1523 */, /*4552*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832612u,138442752u,393216u}/* 1524 */, /*4553*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832620u,138442752u,393216u}/* 1525 */, /*4554*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832628u,138442752u,393216u}/* 1526 */, /*4555*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832636u,138442752u,393216u}/* 1527 */, /*4556*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832644u,138442752u,393216u}/* 1528 */, /*4557*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832652u,138442752u,393216u}/* 1529 */, /*4558*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832660u,138442752u,393216u}/* 152A */, /*4559*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832668u,138442752u,393216u}/* 152B */, /*4560*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832676u,138442752u,393216u}/* 152C */, /*4561*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832684u,138442752u,393216u}/* 152D */, /*4562*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832692u,138442752u,393216u}/* 152E */, /*4563*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832700u,138442752u,393216u}/* 152F */, /*4564*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832708u,138442752u,393216u}/* 1530 */, /*4565*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832716u,138442752u,393216u}/* 1531 */, /*4566*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832724u,138442752u,393216u}/* 1532 */, /*4567*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832732u,138442752u,393216u}/* 1533 */, /*4568*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832740u,138442752u,393216u}/* 1534 */, /*4569*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832748u,138442752u,393216u}/* 1535 */, /*4570*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832756u,138442752u,393216u}/* 1536 */, /*4571*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832764u,138442752u,393216u}/* 1537 */, /*4572*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832772u,138442752u,393216u}/* 1538 */, /*4573*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832780u,138442752u,393216u}/* 1539 */, /*4574*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832788u,138442752u,393216u}/* 153A */, /*4575*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832796u,138442752u,393216u}/* 153B */, /*4576*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832804u,138442752u,393216u}/* 153C */, /*4577*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832812u,138442752u,393216u}/* 153D */, /*4578*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832820u,138442752u,393216u}/* 153E */, /*4579*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832828u,138442752u,393216u}/* 153F */, /*4580*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832836u,138442752u,393216u}/* 1540 */, /*4581*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832844u,138442752u,393216u}/* 1541 */, /*4582*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832852u,138442752u,393216u}/* 1542 */, /*4583*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832860u,138442752u,393216u}/* 1543 */, /*4584*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832868u,138442752u,393216u}/* 1544 */, /*4585*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832876u,138442752u,393216u}/* 1545 */, /*4586*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832884u,138442752u,393216u}/* 1546 */, /*4587*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832892u,138442752u,393216u}/* 1547 */, /*4588*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832900u,138442752u,393216u}/* 1548 */, /*4589*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832908u,138442752u,393216u}/* 1549 */, /*4590*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832916u,138442752u,393216u}/* 154A */, /*4591*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832924u,138442752u,393216u}/* 154B */, /*4592*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832932u,138442752u,393216u}/* 154C */, /*4593*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832940u,138442752u,393216u}/* 154D */, /*4594*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832948u,138442752u,393216u}/* 154E */, /*4595*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832956u,138442752u,393216u}/* 154F */, /*4596*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832964u,138442752u,393216u}/* 1550 */, /*4597*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832972u,138442752u,393216u}/* 1551 */, /*4598*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832980u,138442752u,393216u}/* 1552 */, /*4599*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832988u,138442752u,393216u}/* 1553 */, /*4600*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677832996u,138442752u,393216u}/* 1554 */, /*4601*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833004u,138442752u,393216u}/* 1555 */, /*4602*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833012u,138442752u,393216u}/* 1556 */, /*4603*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833020u,138442752u,393216u}/* 1557 */, /*4604*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833028u,138442752u,393216u}/* 1558 */, /*4605*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833036u,138442752u,393216u}/* 1559 */, /*4606*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833044u,138442752u,393216u}/* 155A */, /*4607*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833052u,138442752u,393216u}/* 155B */, /*4608*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833060u,138442752u,393216u}/* 155C */, /*4609*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833068u,138442752u,393216u}/* 155D */, /*4610*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833076u,138442752u,393216u}/* 155E */, /*4611*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833084u,138442752u,393216u}/* 155F */, /*4612*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833092u,138442752u,393216u}/* 1560 */, /*4613*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833100u,138442752u,393216u}/* 1561 */, /*4614*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833108u,138442752u,393216u}/* 1562 */, /*4615*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833116u,138442752u,393216u}/* 1563 */, /*4616*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833124u,138442752u,393216u}/* 1564 */, /*4617*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833132u,138442752u,393216u}/* 1565 */, /*4618*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833140u,138442752u,393216u}/* 1566 */, /*4619*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833148u,138442752u,393216u}/* 1567 */, /*4620*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833156u,138442752u,393216u}/* 1568 */, /*4621*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833164u,138442752u,393216u}/* 1569 */, /*4622*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833172u,138442752u,393216u}/* 156A */, /*4623*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833180u,138442752u,393216u}/* 156B */, /*4624*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833188u,138442752u,393216u}/* 156C */, /*4625*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833196u,138442752u,393216u}/* 156D */, /*4626*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833204u,138442752u,393216u}/* 156E */, /*4627*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833212u,138442752u,393216u}/* 156F */, /*4628*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833220u,138442752u,393216u}/* 1570 */, /*4629*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833228u,138442752u,393216u}/* 1571 */, /*4630*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833236u,138442752u,393216u}/* 1572 */, /*4631*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833244u,138442752u,393216u}/* 1573 */, /*4632*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833252u,138442752u,393216u}/* 1574 */, /*4633*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833260u,138442752u,393216u}/* 1575 */, /*4634*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833268u,138442752u,393216u}/* 1576 */, /*4635*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833276u,138442752u,393216u}/* 1577 */, /*4636*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833284u,138442752u,393216u}/* 1578 */, /*4637*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833292u,138442752u,393216u}/* 1579 */, /*4638*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833300u,138442752u,393216u}/* 157A */, /*4639*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833308u,138442752u,393216u}/* 157B */, /*4640*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833716u,138442752u,393216u}/* 157C */, /*4641*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833316u,138442752u,393216u}/* 157D */, /*4642*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833332u,138442752u,393216u}/* 157E */, /*4643*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833340u,138442752u,393216u}/* 157F */, /*4644*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833348u,138442752u,393216u}/* 1580 */, /*4645*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833356u,138442752u,393216u}/* 1581 */, /*4646*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833364u,138442752u,393216u}/* 1582 */, /*4647*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833372u,138442752u,393216u}/* 1583 */, /*4648*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833380u,138442752u,393216u}/* 1584 */, /*4649*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833388u,138442752u,393216u}/* 1585 */, /*4650*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833396u,138442752u,393216u}/* 1586 */, /*4651*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833404u,138442752u,393216u}/* 1587 */, /*4652*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833412u,138442752u,393216u}/* 1588 */, /*4653*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833420u,138442752u,393216u}/* 1589 */, /*4654*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833428u,138442752u,393216u}/* 158A */, /*4655*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833436u,138442752u,393216u}/* 158B */, /*4656*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833444u,138442752u,393216u}/* 158C */, /*4657*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833452u,138442752u,393216u}/* 158D */, /*4658*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833468u,138442752u,393216u}/* 158E */, /*4659*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833476u,138442752u,393216u}/* 158F */, /*4660*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833484u,138442752u,393216u}/* 1590 */, /*4661*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833492u,138442752u,393216u}/* 1591 */, /*4662*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833500u,138442752u,393216u}/* 1592 */, /*4663*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833508u,138442752u,393216u}/* 1593 */, /*4664*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833516u,138442752u,393216u}/* 1594 */, /*4665*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833524u,138442752u,393216u}/* 1595 */, /*4666*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833580u,138442752u,393216u}/* 1596 */, /*4667*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833588u,138442752u,393216u}/* 1597 */, /*4668*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833596u,138442752u,393216u}/* 1598 */, /*4669*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833604u,138442752u,393216u}/* 1599 */, /*4670*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833612u,138442752u,393216u}/* 159A */, /*4671*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833620u,138442752u,393216u}/* 159B */, /*4672*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833628u,138442752u,393216u}/* 159C */, /*4673*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833636u,138442752u,393216u}/* 159D */, /*4674*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833644u,138442752u,393216u}/* 159E */, /*4675*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833652u,138442752u,393216u}/* 159F */, /*4676*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833660u,138442752u,393216u}/* 15A0 */, /*4677*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833668u,138442752u,393216u}/* 15A1 */, /*4678*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833676u,138442752u,393216u}/* 15A2 */, /*4679*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833684u,138442752u,393216u}/* 15A3 */, /*4680*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833692u,138442752u,393216u}/* 15A4 */, /*4681*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833700u,138442752u,393216u}/* 15A5 */, /*4682*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833708u,138442752u,393216u}/* 15A6 */, /*4683*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833724u,138442752u,393216u}/* 15A7 */, /*4684*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833732u,138442752u,393216u}/* 15A8 */, /*4685*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833740u,138442752u,393216u}/* 15A9 */, /*4686*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833748u,138442752u,393216u}/* 15AA */, /*4687*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833756u,138442752u,393216u}/* 15AB */, /*4688*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833764u,138442752u,393216u}/* 15AC */, /*4689*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833772u,138442752u,393216u}/* 15AD */, /*4690*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833780u,138442752u,393216u}/* 15AE */, /*4691*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833788u,138442752u,393216u}/* 15AF */, /*4692*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833796u,138442752u,393216u}/* 15B0 */, /*4693*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833804u,138442752u,393216u}/* 15B1 */, /*4694*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833812u,138442752u,393216u}/* 15B2 */, /*4695*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833820u,138442752u,393216u}/* 15B3 */, /*4696*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833828u,138442752u,393216u}/* 15B4 */, /*4697*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833836u,138442752u,393216u}/* 15B5 */, /*4698*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833844u,138442752u,393216u}/* 15B6 */, /*4699*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833852u,138442752u,393216u}/* 15B7 */, /*4700*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833860u,138442752u,393216u}/* 15B8 */, /*4701*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833868u,138442752u,393216u}/* 15B9 */, /*4702*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833876u,138442752u,393216u}/* 15BA */, /*4703*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833884u,138442752u,393216u}/* 15BB */, /*4704*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833892u,138442752u,393216u}/* 15BC */, /*4705*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833900u,138442752u,393216u}/* 15BD */, /*4706*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833908u,138442752u,393216u}/* 15BE */, /*4707*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833916u,138442752u,393216u}/* 15BF */, /*4708*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833924u,138442752u,393216u}/* 15C0 */, /*4709*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833932u,138442752u,393216u}/* 15C1 */, /*4710*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833940u,138442752u,393216u}/* 15C2 */, /*4711*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833948u,138442752u,393216u}/* 15C3 */, /*4712*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833956u,138442752u,393216u}/* 15C4 */, /*4713*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833964u,138442752u,393216u}/* 15C5 */, /*4714*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833972u,138442752u,393216u}/* 15C6 */, /*4715*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833980u,138442752u,393216u}/* 15C7 */, /*4716*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833988u,138442752u,393216u}/* 15C8 */, /*4717*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833996u,138442752u,393216u}/* 15C9 */, /*4718*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834004u,138442752u,393216u}/* 15CA */, /*4719*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834012u,138442752u,393216u}/* 15CB */, /*4720*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834020u,138442752u,393216u}/* 15CC */, /*4721*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834028u,138442752u,393216u}/* 15CD */, /*4722*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834036u,138442752u,393216u}/* 15CE */, /*4723*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834044u,138442752u,393216u}/* 15CF */, /*4724*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834052u,138442752u,393216u}/* 15D0 */, /*4725*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834060u,138442752u,393216u}/* 15D1 */, /*4726*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834068u,138442752u,393216u}/* 15D2 */, /*4727*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834076u,138442752u,393216u}/* 15D3 */, /*4728*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834084u,138442752u,393216u}/* 15D4 */, /*4729*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834092u,138442752u,393216u}/* 15D5 */, /*4730*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834100u,138442752u,393216u}/* 15D6 */, /*4731*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834108u,138442752u,393216u}/* 15D7 */, /*4732*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834116u,138442752u,393216u}/* 15D8 */, /*4733*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834124u,138442752u,393216u}/* 15D9 */, /*4734*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834132u,138442752u,393216u}/* 15DA */, /*4735*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834140u,138442752u,393216u}/* 15DB */, /*4736*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834148u,138442752u,393216u}/* 15DC */, /*4737*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834156u,138442752u,393216u}/* 15DD */, /*4738*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834164u,138442752u,393216u}/* 15DE */, /*4739*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834172u,138442752u,393216u}/* 15DF */, /*4740*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834180u,138442752u,393216u}/* 15E0 */, /*4741*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834188u,138442752u,393216u}/* 15E1 */, /*4742*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834196u,138442752u,393216u}/* 15E2 */, /*4743*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834204u,138442752u,393216u}/* 15E3 */, /*4744*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834212u,138442752u,393216u}/* 15E4 */, /*4745*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834220u,138442752u,393216u}/* 15E5 */, /*4746*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834228u,138442752u,393216u}/* 15E6 */, /*4747*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834236u,138442752u,393216u}/* 15E7 */, /*4748*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834244u,138442752u,393216u}/* 15E8 */, /*4749*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834252u,138442752u,393216u}/* 15E9 */, /*4750*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834260u,138442752u,393216u}/* 15EA */, /*4751*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834268u,138442752u,393216u}/* 15EB */, /*4752*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834276u,138442752u,393216u}/* 15EC */, /*4753*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834284u,138442752u,393216u}/* 15ED */, /*4754*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834292u,138442752u,393216u}/* 15EE */, /*4755*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834300u,138442752u,393216u}/* 15EF */, /*4756*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834308u,138442752u,393216u}/* 15F0 */, /*4757*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834316u,138442752u,393216u}/* 15F1 */, /*4758*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834324u,138442752u,393216u}/* 15F2 */, /*4759*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834332u,138442752u,393216u}/* 15F3 */, /*4760*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834340u,138442752u,393216u}/* 15F4 */, /*4761*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834348u,138442752u,393216u}/* 15F5 */, /*4762*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834356u,138442752u,393216u}/* 15F6 */, /*4763*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834364u,138442752u,393216u}/* 15F7 */, /*4764*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834372u,138442752u,393216u}/* 15F8 */, /*4765*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834380u,138442752u,393216u}/* 15F9 */, /*4766*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834388u,138442752u,393216u}/* 15FA */, /*4767*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834396u,138442752u,393216u}/* 15FB */, /*4768*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834404u,138442752u,393216u}/* 15FC */, /*4769*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834412u,138442752u,393216u}/* 15FD */, /*4770*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834420u,138442752u,393216u}/* 15FE */, /*4771*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834428u,138442752u,393216u}/* 15FF */, /*4772*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834436u,138442752u,393216u}/* 1600 */, /*4773*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834444u,138442752u,393216u}/* 1601 */, /*4774*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834452u,138442752u,393216u}/* 1602 */, /*4775*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834460u,138442752u,393216u}/* 1603 */, /*4776*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834468u,138442752u,393216u}/* 1604 */, /*4777*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834476u,138442752u,393216u}/* 1605 */, /*4778*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834484u,138442752u,393216u}/* 1606 */, /*4779*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834492u,138442752u,393216u}/* 1607 */, /*4780*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834500u,138442752u,393216u}/* 1608 */, /*4781*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834508u,138442752u,393216u}/* 1609 */, /*4782*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834516u,138442752u,393216u}/* 160A */, /*4783*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834524u,138442752u,393216u}/* 160B */, /*4784*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834532u,138442752u,393216u}/* 160C */, /*4785*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834540u,138442752u,393216u}/* 160D */, /*4786*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834548u,138442752u,393216u}/* 160E */, /*4787*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834556u,138442752u,393216u}/* 160F */, /*4788*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834564u,138442752u,393216u}/* 1610 */, /*4789*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834572u,138442752u,393216u}/* 1611 */, /*4790*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834580u,138442752u,393216u}/* 1612 */, /*4791*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834588u,138442752u,393216u}/* 1613 */, /*4792*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834596u,138442752u,393216u}/* 1614 */, /*4793*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834604u,138442752u,393216u}/* 1615 */, /*4794*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834612u,138442752u,393216u}/* 1616 */, /*4795*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834620u,138442752u,393216u}/* 1617 */, /*4796*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834628u,138442752u,393216u}/* 1618 */, /*4797*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834636u,138442752u,393216u}/* 1619 */, /*4798*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834644u,138442752u,393216u}/* 161A */, /*4799*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834652u,138442752u,393216u}/* 161B */, /*4800*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834660u,138442752u,393216u}/* 161C */, /*4801*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834668u,138442752u,393216u}/* 161D */, /*4802*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834676u,138442752u,393216u}/* 161E */, /*4803*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834684u,138442752u,393216u}/* 161F */, /*4804*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834692u,138442752u,393216u}/* 1620 */, /*4805*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834700u,138442752u,393216u}/* 1621 */, /*4806*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834708u,138442752u,393216u}/* 1622 */, /*4807*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834716u,138442752u,393216u}/* 1623 */, /*4808*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834724u,138442752u,393216u}/* 1624 */, /*4809*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834732u,138442752u,393216u}/* 1625 */, /*4810*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834740u,138442752u,393216u}/* 1626 */, /*4811*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834748u,138442752u,393216u}/* 1627 */, /*4812*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834756u,138442752u,393216u}/* 1628 */, /*4813*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834764u,138442752u,393216u}/* 1629 */, /*4814*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834772u,138442752u,393216u}/* 162A */, /*4815*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834780u,138442752u,393216u}/* 162B */, /*4816*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834788u,138442752u,393216u}/* 162C */, /*4817*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834796u,138442752u,393216u}/* 162D */, /*4818*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834804u,138442752u,393216u}/* 162E */, /*4819*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834812u,138442752u,393216u}/* 162F */, /*4820*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834820u,138442752u,393216u}/* 1630 */, /*4821*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834828u,138442752u,393216u}/* 1631 */, /*4822*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834836u,138442752u,393216u}/* 1632 */, /*4823*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834844u,138442752u,393216u}/* 1633 */, /*4824*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834852u,138442752u,393216u}/* 1634 */, /*4825*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834860u,138442752u,393216u}/* 1635 */, /*4826*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834868u,138442752u,393216u}/* 1636 */, /*4827*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834876u,138442752u,393216u}/* 1637 */, /*4828*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834884u,138442752u,393216u}/* 1638 */, /*4829*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834892u,138442752u,393216u}/* 1639 */, /*4830*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834900u,138442752u,393216u}/* 163A */, /*4831*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834908u,138442752u,393216u}/* 163B */, /*4832*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834916u,138442752u,393216u}/* 163C */, /*4833*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834924u,138442752u,393216u}/* 163D */, /*4834*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834932u,138442752u,393216u}/* 163E */, /*4835*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834940u,138442752u,393216u}/* 163F */, /*4836*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834948u,138442752u,393216u}/* 1640 */, /*4837*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834956u,138442752u,393216u}/* 1641 */, /*4838*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834964u,138442752u,393216u}/* 1642 */, /*4839*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834972u,138442752u,393216u}/* 1643 */, /*4840*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834980u,138442752u,393216u}/* 1644 */, /*4841*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834988u,138442752u,393216u}/* 1645 */, /*4842*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677834996u,138442752u,393216u}/* 1646 */, /*4843*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835004u,138442752u,393216u}/* 1647 */, /*4844*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835012u,138442752u,393216u}/* 1648 */, /*4845*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835020u,138442752u,393216u}/* 1649 */, /*4846*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835028u,138442752u,393216u}/* 164A */, /*4847*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835036u,138442752u,393216u}/* 164B */, /*4848*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835044u,138442752u,393216u}/* 164C */, /*4849*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835052u,138442752u,393216u}/* 164D */, /*4850*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835060u,138442752u,393216u}/* 164E */, /*4851*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835068u,138442752u,393216u}/* 164F */, /*4852*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835076u,138442752u,393216u}/* 1650 */, /*4853*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835084u,138442752u,393216u}/* 1651 */, /*4854*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835092u,138442752u,393216u}/* 1652 */, /*4855*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835100u,138442752u,393216u}/* 1653 */, /*4856*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835108u,138442752u,393216u}/* 1654 */, /*4857*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835116u,138442752u,393216u}/* 1655 */, /*4858*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835124u,138442752u,393216u}/* 1656 */, /*4859*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835132u,138442752u,393216u}/* 1657 */, /*4860*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835140u,138442752u,393216u}/* 1658 */, /*4861*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835148u,138442752u,393216u}/* 1659 */, /*4862*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835156u,138442752u,393216u}/* 165A */, /*4863*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835164u,138442752u,393216u}/* 165B */, /*4864*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835172u,138442752u,393216u}/* 165C */, /*4865*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835180u,138442752u,393216u}/* 165D */, /*4866*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835188u,138442752u,393216u}/* 165E */, /*4867*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835196u,138442752u,393216u}/* 165F */, /*4868*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835204u,138442752u,393216u}/* 1660 */, /*4869*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835212u,138442752u,393216u}/* 1661 */, /*4870*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835220u,138442752u,393216u}/* 1662 */, /*4871*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835228u,138442752u,393216u}/* 1663 */, /*4872*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835236u,138442752u,393216u}/* 1664 */, /*4873*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835244u,138442752u,393216u}/* 1665 */, /*4874*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835252u,138442752u,393216u}/* 1666 */, /*4875*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835260u,138442752u,393216u}/* 1667 */, /*4876*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835268u,138442752u,393216u}/* 1668 */, /*4877*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835276u,138442752u,393216u}/* 1669 */, /*4878*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835284u,138442752u,393216u}/* 166A */, /*4879*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835292u,138442752u,393216u}/* 166B */, /*4880*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677835300u,138442752u,393216u}/* 166C */, /*4881*/{0,328u,1835009u,76677143u,40u,1610612768u,8620u,138442754u,8388608u}/* 166D */, /*4882*/{0,328u,1835009u,76677143u,98344u,1610612768u,5132u,138442754u,41943040u}/* 166E */, /*4883*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833324u,138442752u,393216u}/* 166F */, /*4884*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833460u,138442752u,393216u}/* 1670 */, /*4885*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833532u,138442752u,393216u}/* 1671 */, /*4886*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833540u,138442752u,393216u}/* 1672 */, /*4887*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833548u,138442752u,393216u}/* 1673 */, /*4888*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833556u,138442752u,393216u}/* 1674 */, /*4889*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833564u,138442752u,393216u}/* 1675 */, /*4890*/{0,328u,1835009u,76677125u,1515560u,3758096416u,1677833572u,138442752u,393216u}/* 1676 */, /*4891*/{0,328u,1835009u,76906501u,1515560u,3758096416u,1677835308u,138442752u,393216u}/* 1677 */, /*4892*/{0,328u,1835009u,76906501u,1515560u,3758096416u,1677835316u,138442752u,393216u}/* 1678 */, /*4893*/{0,328u,1835009u,76906501u,1515560u,3758096416u,1677835324u,138442752u,393216u}/* 1679 */, /*4894*/{0,328u,1835009u,76906501u,1515560u,3758096416u,1677835332u,138442752u,393216u}/* 167A */, /*4895*/{0,328u,1835009u,76906501u,1515560u,3758096416u,1677835340u,138442752u,393216u}/* 167B */, /*4896*/{0,328u,1835009u,76906501u,1515560u,3758096416u,1677835348u,138442752u,393216u}/* 167C */, /*4897*/{0,328u,1835009u,76906501u,1515560u,3758096416u,1677835356u,138442752u,393216u}/* 167D */, /*4898*/{0,328u,1835009u,76906501u,1515560u,3758096416u,1677835364u,138442752u,393216u}/* 167E */, /*4899*/{0,328u,1835009u,76906501u,1515560u,3758096416u,1677835372u,138442752u,393216u}/* 167F */, /*4900*/{0,336u,1900545u,69346316u,49192u,1610612768u,4180u,138459136u,589824u}/* 1680 */, /*4901*/{0,336u,1900545u,76677125u,1515560u,3758096416u,1677835940u,138442752u,393216u}/* 1681 */, /*4902*/{0,336u,1900545u,76677125u,1515560u,3758096416u,1677835948u,138442752u,393216u}/* 1682 */, /*4903*/{0,336u,1900545u,76677125u,1515560u,3758096416u,1677835956u,138442752u,393216u}/* 1683 */, /*4904*/{0,336u,1900545u,76677125u,1515560u,3758096416u,1677835964u,138442752u,393216u}/* 1684 */, /*4905*/{0,336u,1900545u,76677125u,1515560u,3758096416u,1677835972u,138442752u,393216u}/* 1685 */, /*4906*/{0,336u,1900545u,76677125u,1515560u,3758096416u,1677835980u,138442752u,393216u}/* 1686 */, /*4907*/{0,336u,1900545u,76677125u,1515560u,3758096416u,1677835988u,138442752u,393216u}/* 1687 */, /*4908*/{0,336u,1900545u,76677125u,1515560u,3758096416u,1677835996u,138442752u,393216u}/* 1688 */, /*4909*/{0,336u,1900545u,76677125u,1515560u,3758096416u,1677836004u,138442752u,393216u}/* 1689 */, /*4910*/{0,336u,1900545u,76677125u,1515560u,3758096416u,1677836012u,138442752u,393216u}/* 168A */, /*4911*/{0,336u,1900545u,76677125u,1515560u,3758096416u,1677836020u,138442752u,393216u}/* 168B */, /*4912*/{0,336u,1900545u,76677125u,1515560u,3758096416u,1677836028u,138442752u,393216u}/* 168C */, /*4913*/{0,336u,1900545u,76677125u,1515560u,3758096416u,1677836036u,138442752u,393216u}/* 168D */, /*4914*/{0,336u,1900545u,76677125u,1515560u,3758096416u,1677836044u,138442752u,393216u}/* 168E */, /*4915*/{0,336u,1900545u,76677125u,1515560u,3758096416u,1677836052u,138442752u,393216u}/* 168F */, /*4916*/{0,336u,1900545u,76677125u,1515560u,3758096416u,1677836060u,138442752u,393216u}/* 1690 */, /*4917*/{0,336u,1900545u,76677125u,1515560u,3758096416u,1677836068u,138442752u,393216u}/* 1691 */, /*4918*/{0,336u,1900545u,76677125u,1515560u,3758096416u,1677836076u,138442752u,393216u}/* 1692 */, /*4919*/{0,336u,1900545u,76677125u,1515560u,3758096416u,1677836084u,138442752u,393216u}/* 1693 */, /*4920*/{0,336u,1900545u,76677125u,1515560u,3758096416u,1677836092u,138442752u,393216u}/* 1694 */, /*4921*/{0,336u,1900545u,76677125u,1515560u,3758096416u,1677836100u,138442752u,393216u}/* 1695 */, /*4922*/{0,336u,1900545u,76677125u,1515560u,3758096416u,1677836108u,138442752u,393216u}/* 1696 */, /*4923*/{0,336u,1900545u,76677125u,1515560u,3758096416u,1677836116u,138442752u,393216u}/* 1697 */, /*4924*/{0,336u,1900545u,76677125u,1515560u,3758096416u,1677836124u,138442752u,393216u}/* 1698 */, /*4925*/{0,336u,1900545u,76677125u,1515560u,3758096416u,1677836132u,138442752u,393216u}/* 1699 */, /*4926*/{0,336u,1900545u,76677125u,1515560u,3758096416u,1677836140u,138442752u,393216u}/* 169A */, /*4927*/{0,61776u,1900545u,79833108u,106536u,1744830496u,6428u,138442754u,0}/* 169B */, /*4928*/{0,65872u,1900545u,86124565u,106536u,1744830496u,6436u,138442754u,0}/* 169C */, /*4929*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836148u,138442752u,393216u}/* 16A0 */, /*4930*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836148u,1283536896u,393216u}/* 16A1 */, /*4931*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836156u,138442752u,393216u}/* 16A2 */, /*4932*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836444u,138442752u,393216u}/* 16A3 */, /*4933*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836156u,1283536896u,393216u}/* 16A4 */, /*4934*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836156u,1287731200u,393216u}/* 16A5 */, /*4935*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836164u,138442752u,393216u}/* 16A6 */, /*4936*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836164u,1283536896u,393216u}/* 16A7 */, /*4937*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836172u,138442752u,393216u}/* 16A8 */, /*4938*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836172u,1283536896u,393216u}/* 16A9 */, /*4939*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836412u,138442752u,393216u}/* 16AA */, /*4940*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836428u,138442752u,393216u}/* 16AB */, /*4941*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836172u,1287731200u,393216u}/* 16AC */, /*4942*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836172u,1291925504u,393216u}/* 16AD */, /*4943*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836172u,1296119808u,393216u}/* 16AE */, /*4944*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836188u,138442752u,393216u}/* 16AF */, /*4945*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836196u,138442752u,393216u}/* 16B0 */, /*4946*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836204u,138442752u,393216u}/* 16B1 */, /*4947*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836212u,138442752u,393216u}/* 16B2 */, /*4948*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836212u,1283536896u,393216u}/* 16B3 */, /*4949*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836212u,1287731200u,393216u}/* 16B4 */, /*4950*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836212u,1291925504u,393216u}/* 16B5 */, /*4951*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836212u,1296119808u,393216u}/* 16B6 */, /*4952*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836228u,138442752u,393216u}/* 16B7 */, /*4953*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836468u,138442752u,393216u}/* 16B8 */, /*4954*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836236u,138442752u,393216u}/* 16B9 */, /*4955*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836244u,138442752u,393216u}/* 16BA */, /*4956*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836244u,1283536896u,393216u}/* 16BB */, /*4957*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836244u,1287731200u,393216u}/* 16BC */, /*4958*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836244u,1291925504u,393216u}/* 16BD */, /*4959*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836252u,138442752u,393216u}/* 16BE */, /*4960*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836252u,1283536896u,393216u}/* 16BF */, /*4961*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836252u,1287731200u,393216u}/* 16C0 */, /*4962*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836260u,138442752u,393216u}/* 16C1 */, /*4963*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836260u,1283536896u,393216u}/* 16C2 */, /*4964*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836276u,138442752u,393216u}/* 16C3 */, /*4965*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836276u,1283536896u,393216u}/* 16C4 */, /*4966*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836284u,138442752u,393216u}/* 16C5 */, /*4967*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836284u,1283536896u,393216u}/* 16C6 */, /*4968*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836292u,138442752u,393216u}/* 16C7 */, /*4969*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836300u,138442752u,393216u}/* 16C8 */, /*4970*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836308u,138442752u,393216u}/* 16C9 */, /*4971*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836316u,138442752u,393216u}/* 16CA */, /*4972*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836316u,1283536896u,393216u}/* 16CB */, /*4973*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836316u,1291925504u,393216u}/* 16CC */, /*4974*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836316u,1296119808u,393216u}/* 16CD */, /*4975*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836316u,1300314112u,393216u}/* 16CE */, /*4976*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836332u,138442752u,393216u}/* 16CF */, /*4977*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836332u,1283536896u,393216u}/* 16D0 */, /*4978*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836332u,1287731200u,393216u}/* 16D1 */, /*4979*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836340u,138442752u,393216u}/* 16D2 */, /*4980*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836340u,1283536896u,393216u}/* 16D3 */, /*4981*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836340u,1287731200u,393216u}/* 16D4 */, /*4982*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836300u,1283536896u,393216u}/* 16D5 */, /*4983*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836348u,138442752u,393216u}/* 16D6 */, /*4984*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836364u,138442752u,393216u}/* 16D7 */, /*4985*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836364u,1283536896u,393216u}/* 16D8 */, /*4986*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836364u,1287731200u,393216u}/* 16D9 */, /*4987*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836372u,138442752u,393216u}/* 16DA */, /*4988*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836372u,1283536896u,393216u}/* 16DB */, /*4989*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836380u,138442752u,393216u}/* 16DC */, /*4990*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836380u,1283536896u,393216u}/* 16DD */, /*4991*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836388u,138442752u,393216u}/* 16DE */, /*4992*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836396u,138442752u,393216u}/* 16DF */, /*4993*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836452u,138442752u,393216u}/* 16E0 */, /*4994*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836484u,138442752u,393216u}/* 16E1 */, /*4995*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836492u,138442752u,393216u}/* 16E2 */, /*4996*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836460u,138442752u,393216u}/* 16E3 */, /*4997*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836476u,138442752u,393216u}/* 16E4 */, /*4998*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836500u,138442752u,393216u}/* 16E5 */, /*4999*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836508u,138442752u,393216u}/* 16E6 */, /*5000*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836508u,1283536896u,393216u}/* 16E7 */, /*5001*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836508u,1287731200u,393216u}/* 16E8 */, /*5002*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836236u,1283536896u,393216u}/* 16E9 */, /*5003*/{0,344u,1966081u,76677125u,1515560u,3758096416u,1677836316u,1287731200u,393216u}/* 16EA */, /*5004*/{0,344u,65537u,69337111u,40u,1610612768u,4852u,138442754u,8388608u}/* 16EB */, /*5005*/{0,344u,65537u,69337111u,40u,1610612768u,4860u,138442754u,8388608u}/* 16EC */, /*5006*/{0,344u,65537u,69337111u,40u,1610612768u,4868u,138442754u,8388608u}/* 16ED */, /*5007*/{0,344u,941497857u,76677130u,9904170u,3758096416u,1610842181u,272709632u,393216u}/* 16EE */, /*5008*/{0,344u,958277633u,76677130u,9904170u,3758096416u,1610842253u,2562865152u,393216u}/* 16EF */, /*5009*/{0,344u,975055361u,76677130u,9904170u,3758096416u,1610841853u,272709632u,393216u}/* 16F0 */, /*5010*/{0,344u,1966081u,77070341u,1515560u,3758096416u,1677836220u,138442752u,393216u}/* 16F1 */, /*5011*/{0,344u,1966081u,77070341u,1515560u,3758096416u,1677836324u,138442752u,393216u}/* 16F2 */, /*5012*/{0,344u,1966081u,77070341u,1515560u,3758096416u,1677836404u,138442752u,393216u}/* 16F3 */, /*5013*/{0,344u,1966081u,77070341u,1515560u,3758096416u,1677836180u,138442752u,393216u}/* 16F4 */, /*5014*/{0,344u,1966081u,77070341u,1515560u,3758096416u,1677836268u,138442752u,393216u}/* 16F5 */, /*5015*/{0,344u,1966081u,77070341u,1515560u,3758096416u,1677836356u,138442752u,393216u}/* 16F6 */, /*5016*/{0,344u,1966081u,77070341u,1515560u,3758096416u,1677836420u,138442752u,393216u}/* 16F7 */, /*5017*/{0,344u,1966081u,77070341u,1515560u,3758096416u,1677836436u,138442752u,393216u}/* 16F8 */, /*5018*/{0,352u,2752513u,76742661u,1515560u,3758096416u,1677820916u,138442752u,393216u}/* 1700 */, /*5019*/{0,352u,2752513u,76742661u,1515560u,3758096416u,1677820924u,138442752u,393216u}/* 1701 */, /*5020*/{0,352u,2752513u,76742661u,1515560u,3758096416u,1677820932u,138442752u,393216u}/* 1702 */, /*5021*/{0,352u,2752513u,76742661u,1515560u,3758096416u,1677820940u,138442752u,393216u}/* 1703 */, /*5022*/{0,352u,2752513u,76742661u,1515560u,3758096416u,1677820948u,138442752u,393216u}/* 1704 */, /*5023*/{0,352u,2752513u,76742661u,1515560u,3758096416u,1677820956u,138442752u,393216u}/* 1705 */, /*5024*/{0,352u,2752513u,76742661u,1515560u,3758096416u,1677820964u,138442752u,393216u}/* 1706 */, /*5025*/{0,352u,2752513u,76742661u,1515560u,3758096416u,1677820972u,138442752u,393216u}/* 1707 */, /*5026*/{0,352u,2752513u,76742661u,1515560u,3758096416u,1677820980u,138442752u,393216u}/* 1708 */, /*5027*/{0,352u,2752513u,76742661u,1515560u,3758096416u,1677820988u,138442752u,393216u}/* 1709 */, /*5028*/{0,352u,2752513u,76742661u,1515560u,3758096416u,1677820996u,138442752u,393216u}/* 170A */, /*5029*/{0,352u,2752513u,76742661u,1515560u,3758096416u,1677821004u,138442752u,393216u}/* 170B */, /*5030*/{0,352u,2752513u,76742661u,1515560u,3758096416u,1677821012u,138442752u,393216u}/* 170C */, /*5031*/{0,352u,2752513u,76742661u,1515560u,3758096416u,1677821020u,138442752u,393216u}/* 170E */, /*5032*/{0,352u,2752513u,76742661u,1515560u,3758096416u,1677821028u,138442752u,393216u}/* 170F */, /*5033*/{0,352u,2752513u,76742661u,1515560u,3758096416u,1677821036u,138442752u,393216u}/* 1710 */, /*5034*/{0,352u,2752513u,76742661u,1515560u,3758096416u,1677821044u,138442752u,393216u}/* 1711 */, /*5035*/{0,352u,2752513u,68366342u,672030728u,3774873616u,1078035580u,138443264u,262144u}/* 1712 */, /*5036*/{0,352u,2752513u,68366342u,672030728u,3774873616u,1078035588u,138443264u,262144u}/* 1713 */, /*5037*/{0,352u,2752513u,336801798u,672030728u,1627389976u,1078035596u,138442752u,262144u}/* 1714 */, /*5038*/{0,360u,2818049u,76742661u,1515560u,3758096416u,1677821076u,138442752u,393216u}/* 1720 */, /*5039*/{0,360u,2818049u,76742661u,1515560u,3758096416u,1677821084u,138442752u,393216u}/* 1721 */, /*5040*/{0,360u,2818049u,76742661u,1515560u,3758096416u,1677821092u,138442752u,393216u}/* 1722 */, /*5041*/{0,360u,2818049u,76742661u,1515560u,3758096416u,1677821100u,138442752u,393216u}/* 1723 */, /*5042*/{0,360u,2818049u,76742661u,1515560u,3758096416u,1677821108u,138442752u,393216u}/* 1724 */, /*5043*/{0,360u,2818049u,76742661u,1515560u,3758096416u,1677821116u,138442752u,393216u}/* 1725 */, /*5044*/{0,360u,2818049u,76742661u,1515560u,3758096416u,1677821124u,138442752u,393216u}/* 1726 */, /*5045*/{0,360u,2818049u,76742661u,1515560u,3758096416u,1677821132u,138442752u,393216u}/* 1727 */, /*5046*/{0,360u,2818049u,76742661u,1515560u,3758096416u,1677821140u,138442752u,393216u}/* 1728 */, /*5047*/{0,360u,2818049u,76742661u,1515560u,3758096416u,1677821148u,138442752u,393216u}/* 1729 */, /*5048*/{0,360u,2818049u,76742661u,1515560u,3758096416u,1677821156u,138442752u,393216u}/* 172A */, /*5049*/{0,360u,2818049u,76742661u,1515560u,3758096416u,1677821164u,138442752u,393216u}/* 172B */, /*5050*/{0,360u,2818049u,76742661u,1515560u,3758096416u,1677821172u,138442752u,393216u}/* 172C */, /*5051*/{0,360u,2818049u,76742661u,1515560u,3758096416u,1677821180u,138442752u,393216u}/* 172D */, /*5052*/{0,360u,2818049u,76742661u,1515560u,3758096416u,1677821188u,138442752u,393216u}/* 172E */, /*5053*/{0,360u,2818049u,76742661u,1515560u,3758096416u,1677821196u,138442752u,393216u}/* 172F */, /*5054*/{0,360u,2818049u,76742661u,1515560u,3758096416u,1677821204u,138442752u,393216u}/* 1730 */, /*5055*/{0,360u,2818049u,76742661u,1515560u,3758096416u,1677821212u,138442752u,393216u}/* 1731 */, /*5056*/{0,360u,2818049u,68366342u,672030728u,3774873616u,1078035748u,138443264u,262144u}/* 1732 */, /*5057*/{0,360u,2818049u,68366342u,672030728u,3774873616u,1078035756u,138443264u,262144u}/* 1733 */, /*5058*/{0,360u,2818049u,336801798u,672030728u,1627389976u,1078035764u,138442752u,262144u}/* 1734 */, /*5059*/{0,360u,65537u,69402647u,98344u,1610612768u,5316u,138442754u,41943040u}/* 1735 */, /*5060*/{0,360u,65537u,69402647u,98344u,1610612768u,5324u,138442754u,41943040u}/* 1736 */, /*5061*/{0,368u,2883585u,76742661u,1515560u,3758096416u,1677821244u,138442752u,393216u}/* 1740 */, /*5062*/{0,368u,2883585u,76742661u,1515560u,3758096416u,1677821252u,138442752u,393216u}/* 1741 */, /*5063*/{0,368u,2883585u,76742661u,1515560u,3758096416u,1677821260u,138442752u,393216u}/* 1742 */, /*5064*/{0,368u,2883585u,76742661u,1515560u,3758096416u,1677821268u,138442752u,393216u}/* 1743 */, /*5065*/{0,368u,2883585u,76742661u,1515560u,3758096416u,1677821276u,138442752u,393216u}/* 1744 */, /*5066*/{0,368u,2883585u,76742661u,1515560u,3758096416u,1677821284u,138442752u,393216u}/* 1745 */, /*5067*/{0,368u,2883585u,76742661u,1515560u,3758096416u,1677821292u,138442752u,393216u}/* 1746 */, /*5068*/{0,368u,2883585u,76742661u,1515560u,3758096416u,1677821300u,138442752u,393216u}/* 1747 */, /*5069*/{0,368u,2883585u,76742661u,1515560u,3758096416u,1677821308u,138442752u,393216u}/* 1748 */, /*5070*/{0,368u,2883585u,76742661u,1515560u,3758096416u,1677821316u,138442752u,393216u}/* 1749 */, /*5071*/{0,368u,2883585u,76742661u,1515560u,3758096416u,1677821324u,138442752u,393216u}/* 174A */, /*5072*/{0,368u,2883585u,76742661u,1515560u,3758096416u,1677821332u,138442752u,393216u}/* 174B */, /*5073*/{0,368u,2883585u,76742661u,1515560u,3758096416u,1677821340u,138442752u,393216u}/* 174C */, /*5074*/{0,368u,2883585u,76742661u,1515560u,3758096416u,1677821348u,138442752u,393216u}/* 174D */, /*5075*/{0,368u,2883585u,76742661u,1515560u,3758096416u,1677821356u,138442752u,393216u}/* 174E */, /*5076*/{0,368u,2883585u,76742661u,1515560u,3758096416u,1677821364u,138442752u,393216u}/* 174F */, /*5077*/{0,368u,2883585u,76742661u,1515560u,3758096416u,1677821372u,138442752u,393216u}/* 1750 */, /*5078*/{0,368u,2883585u,76742661u,1515560u,3758096416u,1677821380u,138442752u,393216u}/* 1751 */, /*5079*/{0,368u,2883585u,68366342u,672030728u,3774873616u,1078035916u,138443264u,262144u}/* 1752 */, /*5080*/{0,368u,2883585u,68366342u,672030728u,3774873616u,1078035924u,138443264u,262144u}/* 1753 */, /*5081*/{0,376u,2949121u,76742661u,1515560u,3758096416u,1677821404u,138442752u,393216u}/* 1760 */, /*5082*/{0,376u,2949121u,76742661u,1515560u,3758096416u,1677821412u,138442752u,393216u}/* 1761 */, /*5083*/{0,376u,2949121u,76742661u,1515560u,3758096416u,1677821420u,138442752u,393216u}/* 1762 */, /*5084*/{0,376u,2949121u,76742661u,1515560u,3758096416u,1677821428u,138442752u,393216u}/* 1763 */, /*5085*/{0,376u,2949121u,76742661u,1515560u,3758096416u,1677821436u,138442752u,393216u}/* 1764 */, /*5086*/{0,376u,2949121u,76742661u,1515560u,3758096416u,1677821444u,138442752u,393216u}/* 1765 */, /*5087*/{0,376u,2949121u,76742661u,1515560u,3758096416u,1677821452u,138442752u,393216u}/* 1766 */, /*5088*/{0,376u,2949121u,76742661u,1515560u,3758096416u,1677821460u,138442752u,393216u}/* 1767 */, /*5089*/{0,376u,2949121u,76742661u,1515560u,3758096416u,1677821468u,138442752u,393216u}/* 1768 */, /*5090*/{0,376u,2949121u,76742661u,1515560u,3758096416u,1677821476u,138442752u,393216u}/* 1769 */, /*5091*/{0,376u,2949121u,76742661u,1515560u,3758096416u,1677821484u,138442752u,393216u}/* 176A */, /*5092*/{0,376u,2949121u,76742661u,1515560u,3758096416u,1677821492u,138442752u,393216u}/* 176B */, /*5093*/{0,376u,2949121u,76742661u,1515560u,3758096416u,1677821500u,138442752u,393216u}/* 176C */, /*5094*/{0,376u,2949121u,76742661u,1515560u,3758096416u,1677821508u,138442752u,393216u}/* 176E */, /*5095*/{0,376u,2949121u,76742661u,1515560u,3758096416u,1677821516u,138442752u,393216u}/* 176F */, /*5096*/{0,376u,2949121u,76742661u,1515560u,3758096416u,1677821524u,138442752u,393216u}/* 1770 */, /*5097*/{0,376u,2949121u,68366342u,672030728u,3774873616u,1078036060u,138443264u,262144u}/* 1772 */, /*5098*/{0,376u,2949121u,68366342u,672030728u,3774873616u,1078036068u,138443264u,262144u}/* 1773 */, /*5099*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824372u,138442752u,393216u}/* 1780 */, /*5100*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824380u,138442752u,393216u}/* 1781 */, /*5101*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824388u,138442752u,393216u}/* 1782 */, /*5102*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824396u,138442752u,393216u}/* 1783 */, /*5103*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824404u,138442752u,393216u}/* 1784 */, /*5104*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824412u,138442752u,393216u}/* 1785 */, /*5105*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824420u,138442752u,393216u}/* 1786 */, /*5106*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824428u,138442752u,393216u}/* 1787 */, /*5107*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824436u,138442752u,393216u}/* 1788 */, /*5108*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824444u,138442752u,393216u}/* 1789 */, /*5109*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824452u,138442752u,393216u}/* 178A */, /*5110*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824460u,138442752u,393216u}/* 178B */, /*5111*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824468u,138442752u,393216u}/* 178C */, /*5112*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824476u,138442752u,393216u}/* 178D */, /*5113*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824484u,138442752u,393216u}/* 178E */, /*5114*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824492u,138442752u,393216u}/* 178F */, /*5115*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824500u,138442752u,393216u}/* 1790 */, /*5116*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824508u,138442752u,393216u}/* 1791 */, /*5117*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824516u,138442752u,393216u}/* 1792 */, /*5118*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824524u,138442752u,393216u}/* 1793 */, /*5119*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824532u,138442752u,393216u}/* 1794 */, /*5120*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824540u,138442752u,393216u}/* 1795 */, /*5121*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824548u,138442752u,393216u}/* 1796 */, /*5122*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824556u,138442752u,393216u}/* 1797 */, /*5123*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824564u,138442752u,393216u}/* 1798 */, /*5124*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824572u,138442752u,393216u}/* 1799 */, /*5125*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824580u,138442752u,393216u}/* 179A */, /*5126*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824588u,138442752u,393216u}/* 179B */, /*5127*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824596u,138442752u,393216u}/* 179C */, /*5128*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824604u,138442752u,393216u}/* 179D */, /*5129*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824612u,138442752u,393216u}/* 179E */, /*5130*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824620u,138442752u,393216u}/* 179F */, /*5131*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824628u,138442752u,393216u}/* 17A0 */, /*5132*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824636u,138442752u,393216u}/* 17A1 */, /*5133*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824644u,138442752u,393216u}/* 17A2 */, /*5134*/{0,384u,2031617u,92405765u,73768u,3758112800u,1677824660u,138442752u,393216u}/* 17A3 */, /*5135*/{0,384u,2031617u,92405765u,73768u,3758112800u,1677824668u,138442752u,393216u}/* 17A4 */, /*5136*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824676u,138442752u,393216u}/* 17A5 */, /*5137*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824684u,138442752u,393216u}/* 17A6 */, /*5138*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824692u,138442752u,393216u}/* 17A7 */, /*5139*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824700u,138442752u,393216u}/* 17A8 */, /*5140*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824708u,138442752u,393216u}/* 17A9 */, /*5141*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824716u,138442752u,393216u}/* 17AA */, /*5142*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824724u,138442752u,393216u}/* 17AB */, /*5143*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824732u,138442752u,393216u}/* 17AC */, /*5144*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824740u,138442752u,393216u}/* 17AD */, /*5145*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824748u,138442752u,393216u}/* 17AE */, /*5146*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824756u,138442752u,393216u}/* 17AF */, /*5147*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824764u,138442752u,393216u}/* 17B0 */, /*5148*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824772u,138442752u,393216u}/* 17B1 */, /*5149*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824780u,138442752u,393216u}/* 17B2 */, /*5150*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824788u,138442752u,393216u}/* 17B3 */, /*5151*/{0,384u,2031617u,92418054u,672030728u,1627947024u,1077936140u,4208896u,262144u}/* 17B4 */, /*5152*/{0,384u,2031617u,92405768u,940466184u,3758096416u,1078039324u,138443264u,262144u}/* 17B6 */, /*5153*/{0,384u,2031617u,92418054u,672030728u,3774873616u,1078039332u,138443264u,262144u}/* 17B7 */, /*5154*/{0,384u,2031617u,92418054u,672030728u,3774873616u,1078039340u,138443264u,262144u}/* 17B8 */, /*5155*/{0,384u,2031617u,92418054u,672030728u,3774873616u,1078039348u,138443264u,262144u}/* 17B9 */, /*5156*/{0,384u,2031617u,92418054u,672030728u,3774873616u,1078039356u,138443264u,262144u}/* 17BA */, /*5157*/{0,384u,2031617u,92418054u,672030728u,3774873616u,1078039364u,138443264u,262144u}/* 17BB */, /*5158*/{0,384u,2031617u,92418054u,672030728u,3774873616u,1078039372u,138443264u,262144u}/* 17BC */, /*5159*/{0,384u,2031617u,92418054u,672030728u,3774873616u,1078039380u,138443264u,262144u}/* 17BD */, /*5160*/{0,384u,2031617u,92405768u,940466184u,3758096416u,1078039388u,138443264u,262144u}/* 17BE */, /*5161*/{0,384u,2031617u,92405768u,940466184u,3758096416u,1078039396u,138443264u,262144u}/* 17BF */, /*5162*/{0,384u,2031617u,92405768u,940466184u,3758096416u,1078039404u,138443264u,262144u}/* 17C0 */, /*5163*/{0,384u,2031617u,92405768u,940466184u,3758096416u,1078039412u,138443264u,262144u}/* 17C1 */, /*5164*/{0,384u,2031617u,92405768u,940466184u,3758096416u,1078039420u,138443264u,262144u}/* 17C2 */, /*5165*/{0,384u,2031617u,92405768u,940466184u,3758096416u,1078039428u,138443264u,262144u}/* 17C3 */, /*5166*/{0,384u,2031617u,92405768u,940466184u,3758096416u,1078039436u,138443264u,262144u}/* 17C4 */, /*5167*/{0,384u,2031617u,92405768u,940466184u,3758096416u,1078039444u,138443264u,262144u}/* 17C5 */, /*5168*/{0,384u,2031617u,92418054u,672030728u,3774873616u,1077936140u,826309120u,262144u}/* 17C6 */, /*5169*/{0,384u,2031617u,92405768u,940466184u,3758096416u,1077936140u,830503424u,262144u}/* 17C7 */, /*5170*/{0,384u,2031617u,92405768u,940466184u,3758096416u,1077936140u,973109760u,262144u}/* 17C8 */, /*5171*/{0,384u,2031617u,92418054u,672030728u,1627398160u,1077936140u,977303552u,262144u}/* 17C9 */, /*5172*/{0,384u,2031617u,92418054u,672030728u,1627398160u,1077936140u,981497856u,262144u}/* 17CA */, /*5173*/{0,384u,2031617u,92418054u,672030728u,1627398160u,1077936140u,218134528u,262144u}/* 17CB */, /*5174*/{0,384u,2031617u,360853510u,672030728u,1627398168u,1078039452u,138442752u,262144u}/* 17D2 */, /*5175*/{0,384u,2031617u,92418054u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* 17D3 */, /*5176*/{0,384u,2031617u,69337111u,40u,1610612768u,5356u,138442754u,8388608u}/* 17D4 */, /*5177*/{0,384u,2031617u,69337111u,40u,1610612768u,5364u,138442754u,8388608u}/* 17D5 */, /*5178*/{0,384u,2031617u,96600087u,40u,1610612768u,4828u,138442754u,8388608u}/* 17D6 */, /*5179*/{0,384u,2031617u,92405764u,73768u,3774873632u,1677779732u,138442752u,393216u}/* 17D7 */, /*5180*/{0,384u,2031617u,69337111u,40u,1610612768u,8524u,138442754u,0}/* 17D8 */, /*5181*/{0,384u,2031617u,76677143u,40u,1610612768u,8532u,138442754u,0}/* 17D9 */, /*5182*/{0,384u,2031617u,69337111u,40u,1610612768u,8540u,138442754u,8388608u}/* 17DA */, /*5183*/{0,384u,2031617u,77729817u,40u,1610612768u,58404u,138442752u,67108864u}/* 17DB */, /*5184*/{0,384u,2031617u,92405765u,73768u,3758096416u,1677824652u,138442752u,393216u}/* 17DC */, /*5185*/{0,384u,2031617u,3447959558u,672030728u,1627398160u,1077936140u,218134528u,262144u}/* 17DD */, /*5186*/{0,384u,35587073u,85065737u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 17E0 */, /*5187*/{0,384u,538904065u,85065737u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 17E1 */, /*5188*/{0,384u,572459521u,85065737u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 17E2 */, /*5189*/{0,384u,606013441u,85065737u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 17E3 */, /*5190*/{0,384u,639569921u,85065737u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 17E4 */, /*5191*/{0,384u,673123329u,85065737u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 17E5 */, /*5192*/{0,384u,706680321u,85065737u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 17E6 */, /*5193*/{0,384u,740232705u,85065737u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 17E7 */, /*5194*/{0,384u,773790721u,85065737u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 17E8 */, /*5195*/{0,384u,807343105u,85065737u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 17E9 */, /*5196*/{0,384u,35587073u,76785675u,8388650u,1610612768u,58661u,138442752u,0}/* 17F0 */, /*5197*/{0,384u,538904065u,76785675u,8388650u,1610612768u,58669u,138442752u,0}/* 17F1 */, /*5198*/{0,384u,572459521u,76785675u,8388650u,1610612768u,58677u,138442752u,0}/* 17F2 */, /*5199*/{0,384u,606013441u,76785675u,8388650u,1610612768u,58685u,138442752u,0}/* 17F3 */, /*5200*/{0,384u,639569921u,76785675u,8388650u,1610612768u,58693u,138442752u,0}/* 17F4 */, /*5201*/{0,384u,673123329u,76785675u,8388650u,1610612768u,58701u,138442752u,0}/* 17F5 */, /*5202*/{0,384u,706680321u,76785675u,8388650u,1610612768u,58709u,138442752u,0}/* 17F6 */, /*5203*/{0,384u,740232705u,76785675u,8388650u,1610612768u,58717u,138442752u,0}/* 17F7 */, /*5204*/{0,384u,773790721u,76785675u,8388650u,1610612768u,58725u,138442752u,0}/* 17F8 */, /*5205*/{0,384u,807343105u,76785675u,8388650u,1610612768u,58733u,138442752u,0}/* 17F9 */, /*5206*/{0,392u,2097153u,76687383u,40u,1610612768u,7932u,138442754u,0}/* 1800 */, /*5207*/{0,392u,2097153u,76687383u,40u,1610612768u,5076u,138442754u,0}/* 1801 */, /*5208*/{0,392u,65537u,74590231u,114728u,1610612768u,4460u,138442754u,8388608u}/* 1802 */, /*5209*/{0,392u,65537u,74590231u,98344u,1610612768u,5116u,138442754u,41943040u}/* 1803 */, /*5210*/{0,392u,2097153u,69347351u,40u,1610612768u,4804u,138442754u,8388608u}/* 1804 */, /*5211*/{0,392u,65537u,69347351u,40u,1610612768u,4812u,138442754u,8388608u}/* 1805 */, /*5212*/{0u,392u,2097153u,90318867u,40u,1610678306u,4244u,138442754u,0}/* 1806 */, /*5213*/{0u,392u,2097153u,76687383u,168u,1610612768u,4252u,138442754u,0}/* 1807 */, /*5214*/{0,392u,2097153u,74590231u,114728u,1610612768u,4468u,138442754u,8388608u}/* 1808 */, /*5215*/{0,392u,2097153u,74590231u,98344u,1610612768u,5124u,138442754u,41943040u}/* 1809 */, /*5216*/{0u,392u,2097153u,76687383u,424u,1610612896u,12u,4208642u,0}/* 180A */, /*5217*/{0,392u,2097153u,68300806u,672030728u,1627947024u,1077936140u,4208640u,1310720u}/* 180B */, /*5218*/{0u,392u,2097153u,88222736u,538091528u,1695055872u,12u,4208640u,0}/* 180E */, /*5219*/{0,392u,35652609u,85065737u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 1810 */, /*5220*/{0,392u,538969601u,85065737u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 1811 */, /*5221*/{0,392u,572525057u,85065737u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 1812 */, /*5222*/{0,392u,606078977u,85065737u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 1813 */, /*5223*/{0,392u,639635457u,85065737u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 1814 */, /*5224*/{0,392u,673188865u,85065737u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 1815 */, /*5225*/{0,392u,706745857u,85065737u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 1816 */, /*5226*/{0,392u,740298241u,85065737u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 1817 */, /*5227*/{0,392u,773856257u,85065737u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 1818 */, /*5228*/{0,392u,807408641u,85065737u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 1819 */, /*5229*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828036u,138442752u,393216u}/* 1820 */, /*5230*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828052u,138442752u,393216u}/* 1821 */, /*5231*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828076u,138442752u,393216u}/* 1822 */, /*5232*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828124u,138442752u,393216u}/* 1823 */, /*5233*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828140u,138442752u,393216u}/* 1824 */, /*5234*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828164u,138442752u,393216u}/* 1825 */, /*5235*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828180u,138442752u,393216u}/* 1826 */, /*5236*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828204u,138442752u,393216u}/* 1827 */, /*5237*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828212u,138442752u,393216u}/* 1828 */, /*5238*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828220u,138442752u,393216u}/* 1829 */, /*5239*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828260u,138442752u,393216u}/* 182A */, /*5240*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828276u,138442752u,393216u}/* 182B */, /*5241*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828300u,138442752u,393216u}/* 182C */, /*5242*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828316u,138442752u,393216u}/* 182D */, /*5243*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828356u,138442752u,393216u}/* 182E */, /*5244*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828372u,138442752u,393216u}/* 182F */, /*5245*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828380u,138442752u,393216u}/* 1830 */, /*5246*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828388u,138442752u,393216u}/* 1831 */, /*5247*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828444u,138442752u,393216u}/* 1832 */, /*5248*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828468u,138442752u,393216u}/* 1833 */, /*5249*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828492u,138442752u,393216u}/* 1834 */, /*5250*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828532u,138442752u,393216u}/* 1835 */, /*5251*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828564u,138442752u,393216u}/* 1836 */, /*5252*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828588u,138442752u,393216u}/* 1837 */, /*5253*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828604u,138442752u,393216u}/* 1838 */, /*5254*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828620u,138442752u,393216u}/* 1839 */, /*5255*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828644u,138442752u,393216u}/* 183A */, /*5256*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828684u,138442752u,393216u}/* 183B */, /*5257*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828692u,138442752u,393216u}/* 183C */, /*5258*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828716u,138442752u,393216u}/* 183D */, /*5259*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828748u,138442752u,393216u}/* 183E */, /*5260*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828772u,138442752u,393216u}/* 183F */, /*5261*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828780u,138442752u,393216u}/* 1840 */, /*5262*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828788u,138442752u,393216u}/* 1841 */, /*5263*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828796u,138442752u,393216u}/* 1842 */, /*5264*/{0u,392u,2097153u,76677124u,1515688u,3774873760u,1677828028u,138442752u,393216u}/* 1843 */, /*5265*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828060u,138442752u,393216u}/* 1844 */, /*5266*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828084u,138442752u,393216u}/* 1845 */, /*5267*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828132u,138442752u,393216u}/* 1846 */, /*5268*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828148u,138442752u,393216u}/* 1847 */, /*5269*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828172u,138442752u,393216u}/* 1848 */, /*5270*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828188u,138442752u,393216u}/* 1849 */, /*5271*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828228u,138442752u,393216u}/* 184A */, /*5272*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828268u,138442752u,393216u}/* 184B */, /*5273*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828284u,138442752u,393216u}/* 184C */, /*5274*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828308u,138442752u,393216u}/* 184D */, /*5275*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828324u,138442752u,393216u}/* 184E */, /*5276*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828364u,138442752u,393216u}/* 184F */, /*5277*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828452u,138442752u,393216u}/* 1850 */, /*5278*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828476u,138442752u,393216u}/* 1851 */, /*5279*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828500u,138442752u,393216u}/* 1852 */, /*5280*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828540u,138442752u,393216u}/* 1853 */, /*5281*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828700u,138442752u,393216u}/* 1854 */, /*5282*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828572u,138442752u,393216u}/* 1855 */, /*5283*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828612u,138442752u,393216u}/* 1856 */, /*5284*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828652u,138442752u,393216u}/* 1857 */, /*5285*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828732u,138442752u,393216u}/* 1858 */, /*5286*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828756u,138442752u,393216u}/* 1859 */, /*5287*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828804u,138442752u,393216u}/* 185A */, /*5288*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828812u,138442752u,393216u}/* 185B */, /*5289*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828516u,138442752u,393216u}/* 185C */, /*5290*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828068u,138442752u,393216u}/* 185D */, /*5291*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828092u,138442752u,393216u}/* 185E */, /*5292*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828116u,138442752u,393216u}/* 185F */, /*5293*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828196u,138442752u,393216u}/* 1860 */, /*5294*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828156u,138442752u,393216u}/* 1861 */, /*5295*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828236u,138442752u,393216u}/* 1862 */, /*5296*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828660u,138442752u,393216u}/* 1863 */, /*5297*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828332u,138442752u,393216u}/* 1864 */, /*5298*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828348u,138442752u,393216u}/* 1865 */, /*5299*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828292u,138442752u,393216u}/* 1866 */, /*5300*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828396u,138442752u,393216u}/* 1867 */, /*5301*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828460u,138442752u,393216u}/* 1868 */, /*5302*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828484u,138442752u,393216u}/* 1869 */, /*5303*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828548u,138442752u,393216u}/* 186A */, /*5304*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828628u,138442752u,393216u}/* 186B */, /*5305*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828740u,138442752u,393216u}/* 186C */, /*5306*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828764u,138442752u,393216u}/* 186D */, /*5307*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828708u,138442752u,393216u}/* 186E */, /*5308*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828724u,138442752u,393216u}/* 186F */, /*5309*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828820u,138442752u,393216u}/* 1870 */, /*5310*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828508u,138442752u,393216u}/* 1871 */, /*5311*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828580u,138442752u,393216u}/* 1872 */, /*5312*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828100u,138442752u,393216u}/* 1873 */, /*5313*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828668u,138442752u,393216u}/* 1874 */, /*5314*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828596u,138442752u,393216u}/* 1875 */, /*5315*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828636u,138442752u,393216u}/* 1876 */, /*5316*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828556u,138442752u,393216u}/* 1877 */, /*5317*/{0u,392u,2097153u,76677125u,1515560u,3758096416u,1677827972u,138442752u,393216u}/* 1880 */, /*5318*/{0u,392u,2097153u,76677125u,1515560u,3758096416u,1677827980u,138442752u,393216u}/* 1881 */, /*5319*/{0u,392u,2097153u,76677125u,1515560u,3758096416u,1677827988u,138442752u,393216u}/* 1882 */, /*5320*/{0u,392u,2097153u,76677125u,1515560u,3758096416u,1677827996u,138442752u,393216u}/* 1883 */, /*5321*/{0u,392u,2097153u,76677125u,1515560u,3758096416u,1677828004u,138442752u,393216u}/* 1884 */, /*5322*/{0u,392u,2097153u,68300806u,672031240u,3774873616u,1614913452u,138443296u,393216u}/* 1885 */, /*5323*/{0u,392u,2097153u,68300806u,672031240u,3774873616u,1614913460u,138443296u,393216u}/* 1886 */, /*5324*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828044u,138442752u,393216u}/* 1887 */, /*5325*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828108u,138442752u,393216u}/* 1888 */, /*5326*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828676u,138442752u,393216u}/* 1889 */, /*5327*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828244u,138442752u,393216u}/* 188A */, /*5328*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828524u,138442752u,393216u}/* 188B */, /*5329*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828828u,138442752u,393216u}/* 188C */, /*5330*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828844u,138442752u,393216u}/* 188D */, /*5331*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828852u,138442752u,393216u}/* 188E */, /*5332*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828868u,138442752u,393216u}/* 188F */, /*5333*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828876u,138442752u,393216u}/* 1890 */, /*5334*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828900u,138442752u,393216u}/* 1891 */, /*5335*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828916u,138442752u,393216u}/* 1892 */, /*5336*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828924u,138442752u,393216u}/* 1893 */, /*5337*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828940u,138442752u,393216u}/* 1894 */, /*5338*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828956u,138442752u,393216u}/* 1895 */, /*5339*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828972u,138442752u,393216u}/* 1896 */, /*5340*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828980u,138442752u,393216u}/* 1897 */, /*5341*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828884u,138442752u,393216u}/* 1898 */, /*5342*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828964u,138442752u,393216u}/* 1899 */, /*5343*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828340u,138442752u,393216u}/* 189A */, /*5344*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828252u,138442752u,393216u}/* 189B */, /*5345*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828404u,138442752u,393216u}/* 189C */, /*5346*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828412u,138442752u,393216u}/* 189D */, /*5347*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828836u,138442752u,393216u}/* 189E */, /*5348*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828860u,138442752u,393216u}/* 189F */, /*5349*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828892u,138442752u,393216u}/* 18A0 */, /*5350*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828908u,138442752u,393216u}/* 18A1 */, /*5351*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828420u,138442752u,393216u}/* 18A2 */, /*5352*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828948u,138442752u,393216u}/* 18A3 */, /*5353*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828428u,138442752u,393216u}/* 18A4 */, /*5354*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828436u,138442752u,393216u}/* 18A5 */, /*5355*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828988u,138442752u,393216u}/* 18A6 */, /*5356*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828996u,138442752u,393216u}/* 18A7 */, /*5357*/{0u,392u,2097153u,76677125u,1515688u,3758096416u,1677828932u,138442752u,393216u}/* 18A8 */, /*5358*/{0,392u,2097153u,3356635142u,672030728u,3774873616u,1078043540u,138443264u,262144u}/* 18A9 */, /*5359*/{0u,392u,2097153u,76873733u,1515688u,3758096416u,1677829004u,138442752u,393216u}/* 18AA */, /*5360*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835380u,138442752u,393216u}/* 18B0 */, /*5361*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835388u,138442752u,393216u}/* 18B1 */, /*5362*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835396u,138442752u,393216u}/* 18B2 */, /*5363*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835404u,138442752u,393216u}/* 18B3 */, /*5364*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835412u,138442752u,393216u}/* 18B4 */, /*5365*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835420u,138442752u,393216u}/* 18B5 */, /*5366*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835428u,138442752u,393216u}/* 18B6 */, /*5367*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835436u,138442752u,393216u}/* 18B7 */, /*5368*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835444u,138442752u,393216u}/* 18B8 */, /*5369*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835452u,138442752u,393216u}/* 18B9 */, /*5370*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835460u,138442752u,393216u}/* 18BA */, /*5371*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835468u,138442752u,393216u}/* 18BB */, /*5372*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835476u,138442752u,393216u}/* 18BC */, /*5373*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835484u,138442752u,393216u}/* 18BD */, /*5374*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835492u,138442752u,393216u}/* 18BE */, /*5375*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835500u,138442752u,393216u}/* 18BF */, /*5376*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835508u,138442752u,393216u}/* 18C0 */, /*5377*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835516u,138442752u,393216u}/* 18C1 */, /*5378*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835524u,138442752u,393216u}/* 18C2 */, /*5379*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835532u,138442752u,393216u}/* 18C3 */, /*5380*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835540u,138442752u,393216u}/* 18C4 */, /*5381*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835548u,138442752u,393216u}/* 18C5 */, /*5382*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835556u,138442752u,393216u}/* 18C6 */, /*5383*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835564u,138442752u,393216u}/* 18C7 */, /*5384*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835572u,138442752u,393216u}/* 18C8 */, /*5385*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835580u,138442752u,393216u}/* 18C9 */, /*5386*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835588u,138442752u,393216u}/* 18CA */, /*5387*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835596u,138442752u,393216u}/* 18CB */, /*5388*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835604u,138442752u,393216u}/* 18CC */, /*5389*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835612u,138442752u,393216u}/* 18CD */, /*5390*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835620u,138442752u,393216u}/* 18CE */, /*5391*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835628u,138442752u,393216u}/* 18CF */, /*5392*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835636u,138442752u,393216u}/* 18D0 */, /*5393*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835644u,138442752u,393216u}/* 18D1 */, /*5394*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835652u,138442752u,393216u}/* 18D2 */, /*5395*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835660u,138442752u,393216u}/* 18D3 */, /*5396*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835668u,138442752u,393216u}/* 18D4 */, /*5397*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835676u,138442752u,393216u}/* 18D5 */, /*5398*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835684u,138442752u,393216u}/* 18D6 */, /*5399*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835692u,138442752u,393216u}/* 18D7 */, /*5400*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835700u,138442752u,393216u}/* 18D8 */, /*5401*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835708u,138442752u,393216u}/* 18D9 */, /*5402*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835716u,138442752u,393216u}/* 18DA */, /*5403*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835724u,138442752u,393216u}/* 18DB */, /*5404*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835732u,138442752u,393216u}/* 18DC */, /*5405*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835740u,138442752u,393216u}/* 18DD */, /*5406*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835748u,138442752u,393216u}/* 18DE */, /*5407*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835756u,138442752u,393216u}/* 18DF */, /*5408*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835764u,138442752u,393216u}/* 18E0 */, /*5409*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835772u,138442752u,393216u}/* 18E1 */, /*5410*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835780u,138442752u,393216u}/* 18E2 */, /*5411*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835788u,138442752u,393216u}/* 18E3 */, /*5412*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835796u,138442752u,393216u}/* 18E4 */, /*5413*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835804u,138442752u,393216u}/* 18E5 */, /*5414*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835812u,138442752u,393216u}/* 18E6 */, /*5415*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835820u,138442752u,393216u}/* 18E7 */, /*5416*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835828u,138442752u,393216u}/* 18E8 */, /*5417*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835836u,138442752u,393216u}/* 18E9 */, /*5418*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835844u,138442752u,393216u}/* 18EA */, /*5419*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835852u,138442752u,393216u}/* 18EB */, /*5420*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835860u,138442752u,393216u}/* 18EC */, /*5421*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835868u,138442752u,393216u}/* 18ED */, /*5422*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835876u,138442752u,393216u}/* 18EE */, /*5423*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835884u,138442752u,393216u}/* 18EF */, /*5424*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835892u,138442752u,393216u}/* 18F0 */, /*5425*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835900u,138442752u,393216u}/* 18F1 */, /*5426*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835908u,138442752u,393216u}/* 18F2 */, /*5427*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835916u,138442752u,393216u}/* 18F3 */, /*5428*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835924u,138442752u,393216u}/* 18F4 */, /*5429*/{0,400u,1835009u,76906501u,1515560u,3758096416u,1677835932u,138442752u,393216u}/* 18F5 */, /*5430*/{0,408u,3014657u,76775429u,1515560u,3758096416u,1677820516u,138442752u,393216u}/* 1900 */, /*5431*/{0,408u,3014657u,76775429u,1515560u,3758096416u,1677820524u,138442752u,393216u}/* 1901 */, /*5432*/{0,408u,3014657u,76775429u,1515560u,3758096416u,1677820532u,138442752u,393216u}/* 1902 */, /*5433*/{0,408u,3014657u,76775429u,1515560u,3758096416u,1677820540u,138442752u,393216u}/* 1903 */, /*5434*/{0,408u,3014657u,76775429u,1515560u,3758096416u,1677820548u,138442752u,393216u}/* 1904 */, /*5435*/{0,408u,3014657u,76775429u,1515560u,3758096416u,1677820556u,138442752u,393216u}/* 1905 */, /*5436*/{0,408u,3014657u,76775429u,1515560u,3758096416u,1677820564u,138442752u,393216u}/* 1906 */, /*5437*/{0,408u,3014657u,76775429u,1515560u,3758096416u,1677820572u,138442752u,393216u}/* 1907 */, /*5438*/{0,408u,3014657u,76775429u,1515560u,3758096416u,1677820580u,138442752u,393216u}/* 1908 */, /*5439*/{0,408u,3014657u,76775429u,1515560u,3758096416u,1677820588u,138442752u,393216u}/* 1909 */, /*5440*/{0,408u,3014657u,76775429u,1515560u,3758096416u,1677820596u,138442752u,393216u}/* 190A */, /*5441*/{0,408u,3014657u,76775429u,1515560u,3758096416u,1677820604u,138442752u,393216u}/* 190B */, /*5442*/{0,408u,3014657u,76775429u,1515560u,3758096416u,1677820612u,138442752u,393216u}/* 190C */, /*5443*/{0,408u,3014657u,76775429u,1515560u,3758096416u,1677820620u,138442752u,393216u}/* 190D */, /*5444*/{0,408u,3014657u,76775429u,1515560u,3758096416u,1677820628u,138442752u,393216u}/* 190E */, /*5445*/{0,408u,3014657u,76775429u,1515560u,3758096416u,1677820636u,138442752u,393216u}/* 190F */, /*5446*/{0,408u,3014657u,76775429u,1515560u,3758096416u,1677820644u,138442752u,393216u}/* 1910 */, /*5447*/{0,408u,3014657u,76775429u,1515560u,3758096416u,1677820652u,138442752u,393216u}/* 1911 */, /*5448*/{0,408u,3014657u,76775429u,1515560u,3758096416u,1677820660u,138442752u,393216u}/* 1912 */, /*5449*/{0,408u,3014657u,76775429u,1515560u,3758096416u,1677820668u,138442752u,393216u}/* 1913 */, /*5450*/{0,408u,3014657u,76775429u,1515560u,3758096416u,1677820676u,138442752u,393216u}/* 1914 */, /*5451*/{0,408u,3014657u,76775429u,1515560u,3758096416u,1677820684u,138442752u,393216u}/* 1915 */, /*5452*/{0,408u,3014657u,76775429u,1515560u,3758096416u,1677820692u,138442752u,393216u}/* 1916 */, /*5453*/{0,408u,3014657u,76775429u,1515560u,3758096416u,1677820700u,138442752u,393216u}/* 1917 */, /*5454*/{0,408u,3014657u,76775429u,1515560u,3758096416u,1677820708u,138442752u,393216u}/* 1918 */, /*5455*/{0,408u,3014657u,76775429u,1515560u,3758096416u,1677820716u,138442752u,393216u}/* 1919 */, /*5456*/{0,408u,3014657u,76775429u,1515560u,3758096416u,1677820724u,138442752u,393216u}/* 191A */, /*5457*/{0,408u,3014657u,76775429u,1515560u,3758096416u,1677820732u,138442752u,393216u}/* 191B */, /*5458*/{0,408u,3014657u,76775429u,1515560u,3758096416u,1677820740u,138442752u,393216u}/* 191C */, /*5459*/{0,408u,3014657u,77070341u,1515560u,3758096416u,1677919788u,272709632u,393216u}/* 191D */, /*5460*/{0,408u,3014657u,77070341u,1515560u,3758096416u,1677919820u,272709632u,393216u}/* 191E */, /*5461*/{0,408u,3014657u,68399110u,672030728u,3774873616u,1078035276u,138443264u,262144u}/* 1920 */, /*5462*/{0,408u,3014657u,68399110u,672030728u,3774873616u,1078035284u,138443264u,262144u}/* 1921 */, /*5463*/{0,408u,3014657u,68399110u,672030728u,3774873616u,1078035292u,138443264u,262144u}/* 1922 */, /*5464*/{0,408u,3014657u,68386824u,940466184u,3758096416u,1078035300u,138443264u,262144u}/* 1923 */, /*5465*/{0,408u,3014657u,68386824u,940466184u,3758096416u,1078035308u,138443264u,262144u}/* 1924 */, /*5466*/{0,408u,3014657u,68386824u,940466184u,3758096416u,1078035316u,138443264u,262144u}/* 1925 */, /*5467*/{0,408u,3014657u,68386824u,940466184u,3758096416u,1078035324u,138443264u,262144u}/* 1926 */, /*5468*/{0,408u,3014657u,68399110u,672030728u,3774873616u,1078035332u,138443264u,262144u}/* 1927 */, /*5469*/{0,408u,3014657u,68399110u,672030728u,3774873616u,1078035340u,138443264u,262144u}/* 1928 */, /*5470*/{0,408u,3014657u,68386824u,940466184u,3758096416u,1078035348u,138443264u,262144u}/* 1929 */, /*5471*/{0,408u,3014657u,68386824u,940466184u,3758096416u,1078035356u,138443264u,262144u}/* 192A */, /*5472*/{0,408u,3014657u,68386824u,940466184u,3758096416u,1078035364u,138443264u,262144u}/* 192B */, /*5473*/{0,408u,3014657u,68386824u,940466184u,3758096416u,1078035372u,138443264u,262144u}/* 1930 */, /*5474*/{0,408u,3014657u,68386824u,940466184u,3758096416u,1078035380u,138443264u,262144u}/* 1931 */, /*5475*/{0,408u,3014657u,68399110u,672030728u,3774873616u,1078035388u,138443264u,262144u}/* 1932 */, /*5476*/{0,408u,3014657u,68386824u,940466184u,3758096416u,1078035396u,138443264u,262144u}/* 1933 */, /*5477*/{0,408u,3014657u,68386824u,940466184u,3758096416u,1078035404u,138443264u,262144u}/* 1934 */, /*5478*/{0,408u,3014657u,68386824u,940466184u,3758096416u,1078035412u,138443264u,262144u}/* 1935 */, /*5479*/{0,408u,3014657u,68386824u,940466184u,3758096416u,1078035420u,138443264u,262144u}/* 1936 */, /*5480*/{0,408u,3014657u,68386824u,940466184u,3758096416u,1078035428u,138443264u,262144u}/* 1937 */, /*5481*/{0,408u,3014657u,68386824u,940466184u,3758096416u,1078035436u,138443264u,262144u}/* 1938 */, /*5482*/{0,408u,3014657u,3155406854u,672030728u,1627398160u,1077936140u,1019246592u,262144u}/* 1939 */, /*5483*/{0,408u,3014657u,3423842310u,672030728u,1627398160u,1077936140u,1023440896u,262144u}/* 193A */, /*5484*/{0,408u,3014657u,3088297990u,672030728u,1627398160u,1077936140u,1027635200u,262144u}/* 193B */, /*5485*/{0,408u,3014657u,76785691u,40u,1610612768u,11020u,138442752u,67108864u}/* 1940 */, /*5486*/{0,408u,3014657u,74688535u,98344u,1610612768u,4916u,138442754u,41943040u}/* 1944 */, /*5487*/{0,408u,3014657u,74688535u,98344u,1610612768u,4988u,138442754u,41943040u}/* 1945 */, /*5488*/{0,408u,36570113u,85164041u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 1946 */, /*5489*/{0,408u,539887105u,85164041u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 1947 */, /*5490*/{0,408u,573442561u,85164041u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 1948 */, /*5491*/{0,408u,606996481u,85164041u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 1949 */, /*5492*/{0,408u,640552961u,85164041u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 194A */, /*5493*/{0,408u,674106369u,85164041u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 194B */, /*5494*/{0,408u,707663361u,85164041u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 194C */, /*5495*/{0,408u,741215745u,85164041u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 194D */, /*5496*/{0,408u,774773761u,85164041u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 194E */, /*5497*/{0,408u,808326145u,85164041u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 194F */, /*5498*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677824932u,138442752u,393216u}/* 1950 */, /*5499*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677824940u,138442752u,393216u}/* 1951 */, /*5500*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677824948u,138442752u,393216u}/* 1952 */, /*5501*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677824956u,138442752u,393216u}/* 1953 */, /*5502*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677824964u,138442752u,393216u}/* 1954 */, /*5503*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677824972u,138442752u,393216u}/* 1955 */, /*5504*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677824980u,138442752u,393216u}/* 1956 */, /*5505*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677824988u,138442752u,393216u}/* 1957 */, /*5506*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677824996u,138442752u,393216u}/* 1958 */, /*5507*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677825004u,138442752u,393216u}/* 1959 */, /*5508*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677825012u,138442752u,393216u}/* 195A */, /*5509*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677825020u,138442752u,393216u}/* 195B */, /*5510*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677825028u,138442752u,393216u}/* 195C */, /*5511*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677825036u,138442752u,393216u}/* 195D */, /*5512*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677825044u,138442752u,393216u}/* 195E */, /*5513*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677825052u,138442752u,393216u}/* 195F */, /*5514*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677825060u,138442752u,393216u}/* 1960 */, /*5515*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677825068u,138442752u,393216u}/* 1961 */, /*5516*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677825076u,138442752u,393216u}/* 1962 */, /*5517*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677825084u,138442752u,393216u}/* 1963 */, /*5518*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677825092u,138442752u,393216u}/* 1964 */, /*5519*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677825100u,138442752u,393216u}/* 1965 */, /*5520*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677825108u,138442752u,393216u}/* 1966 */, /*5521*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677825116u,138442752u,393216u}/* 1967 */, /*5522*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677825124u,138442752u,393216u}/* 1968 */, /*5523*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677825132u,138442752u,393216u}/* 1969 */, /*5524*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677825140u,138442752u,393216u}/* 196A */, /*5525*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677825148u,138442752u,393216u}/* 196B */, /*5526*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677825156u,138442752u,393216u}/* 196C */, /*5527*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677825164u,138442752u,393216u}/* 196D */, /*5528*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677825172u,138442752u,393216u}/* 1970 */, /*5529*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677825180u,138442752u,393216u}/* 1971 */, /*5530*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677825188u,138442752u,393216u}/* 1972 */, /*5531*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677825196u,138442752u,393216u}/* 1973 */, /*5532*/{0,416u,3080193u,92504069u,73768u,3758096416u,1677825204u,138442752u,393216u}/* 1974 */, /*5533*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825212u,138442752u,393216u}/* 1980 */, /*5534*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825220u,138442752u,393216u}/* 1981 */, /*5535*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825228u,138442752u,393216u}/* 1982 */, /*5536*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825236u,138442752u,393216u}/* 1983 */, /*5537*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825244u,138442752u,393216u}/* 1984 */, /*5538*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825252u,138442752u,393216u}/* 1985 */, /*5539*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825260u,138442752u,393216u}/* 1986 */, /*5540*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825268u,138442752u,393216u}/* 1987 */, /*5541*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825276u,138442752u,393216u}/* 1988 */, /*5542*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825284u,138442752u,393216u}/* 1989 */, /*5543*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825292u,138442752u,393216u}/* 198A */, /*5544*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825300u,138442752u,393216u}/* 198B */, /*5545*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825308u,138442752u,393216u}/* 198C */, /*5546*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825316u,138442752u,393216u}/* 198D */, /*5547*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825324u,138442752u,393216u}/* 198E */, /*5548*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825332u,138442752u,393216u}/* 198F */, /*5549*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825340u,138442752u,393216u}/* 1990 */, /*5550*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825348u,138442752u,393216u}/* 1991 */, /*5551*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825356u,138442752u,393216u}/* 1992 */, /*5552*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825364u,138442752u,393216u}/* 1993 */, /*5553*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825372u,138442752u,393216u}/* 1994 */, /*5554*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825380u,138442752u,393216u}/* 1995 */, /*5555*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825388u,138442752u,393216u}/* 1996 */, /*5556*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825396u,138442752u,393216u}/* 1997 */, /*5557*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825404u,138442752u,393216u}/* 1998 */, /*5558*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825412u,138442752u,393216u}/* 1999 */, /*5559*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825420u,138442752u,393216u}/* 199A */, /*5560*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825428u,138442752u,393216u}/* 199B */, /*5561*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825436u,138442752u,393216u}/* 199C */, /*5562*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825444u,138442752u,393216u}/* 199D */, /*5563*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825452u,138442752u,393216u}/* 199E */, /*5564*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825460u,138442752u,393216u}/* 199F */, /*5565*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825468u,138442752u,393216u}/* 19A0 */, /*5566*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825476u,138442752u,393216u}/* 19A1 */, /*5567*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825484u,138442752u,393216u}/* 19A2 */, /*5568*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825492u,138442752u,393216u}/* 19A3 */, /*5569*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825500u,138442752u,393216u}/* 19A4 */, /*5570*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825508u,138442752u,393216u}/* 19A5 */, /*5571*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825516u,138442752u,393216u}/* 19A6 */, /*5572*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825524u,138442752u,393216u}/* 19A7 */, /*5573*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825532u,138442752u,393216u}/* 19A8 */, /*5574*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825540u,138442752u,393216u}/* 19A9 */, /*5575*/{0,424u,3670017u,92635141u,73768u,3758096416u,1677825548u,138442752u,393216u}/* 19AA */, /*5576*/{0,424u,3670017u,92635141u,73768u,3758096416u,1677825556u,138442752u,393216u}/* 19AB */, /*5577*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825564u,138442752u,393216u}/* 19B0 */, /*5578*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825572u,138442752u,393216u}/* 19B1 */, /*5579*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825580u,138442752u,393216u}/* 19B2 */, /*5580*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825588u,138442752u,393216u}/* 19B3 */, /*5581*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825596u,138442752u,393216u}/* 19B4 */, /*5582*/{0,424u,3670017u,92536837u,73768u,3758096416u,1694602816u,138442752u,393216u}/* 19B5 */, /*5583*/{0,424u,3670017u,92536837u,73768u,3758096416u,1694602824u,138442752u,393216u}/* 19B6 */, /*5584*/{0,424u,3670017u,92536837u,73768u,3758096416u,1694602832u,138442752u,393216u}/* 19B7 */, /*5585*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825628u,138442752u,393216u}/* 19B8 */, /*5586*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825636u,138442752u,393216u}/* 19B9 */, /*5587*/{0,424u,3670017u,92536837u,73768u,3758096416u,1694602856u,138442752u,393216u}/* 19BA */, /*5588*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825652u,138442752u,393216u}/* 19BB */, /*5589*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825660u,138442752u,393216u}/* 19BC */, /*5590*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825668u,138442752u,393216u}/* 19BD */, /*5591*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825676u,138442752u,393216u}/* 19BE */, /*5592*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825684u,138442752u,393216u}/* 19BF */, /*5593*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825692u,138442752u,393216u}/* 19C0 */, /*5594*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825700u,138442752u,393216u}/* 19C1 */, /*5595*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825708u,138442752u,393216u}/* 19C2 */, /*5596*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825716u,138442752u,393216u}/* 19C3 */, /*5597*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825724u,138442752u,393216u}/* 19C4 */, /*5598*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825732u,138442752u,393216u}/* 19C5 */, /*5599*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825740u,138442752u,393216u}/* 19C6 */, /*5600*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825748u,138442752u,393216u}/* 19C7 */, /*5601*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825756u,138442752u,393216u}/* 19C8 */, /*5602*/{0,424u,3670017u,92536837u,73768u,3758096416u,1677825764u,138442752u,393216u}/* 19C9 */, /*5603*/{0,424u,37225473u,85196809u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 19D0 */, /*5604*/{0,424u,540542465u,85196809u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 19D1 */, /*5605*/{0,424u,574097921u,85196809u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 19D2 */, /*5606*/{0,424u,607651841u,85196809u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 19D3 */, /*5607*/{0,424u,641208321u,85196809u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 19D4 */, /*5608*/{0,424u,674761729u,85196809u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 19D5 */, /*5609*/{0,424u,708318721u,85196809u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 19D6 */, /*5610*/{0,424u,741871105u,85196809u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 19D7 */, /*5611*/{0,424u,775429121u,85196809u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 19D8 */, /*5612*/{0,424u,808981505u,85196809u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 19D9 */, /*5613*/{0,424u,540542465u,92635147u,8388652u,1610612768u,1073800493u,138442816u,262144u}/* 19DA */, /*5614*/{0,424u,3670017u,92547099u,40u,1610612768u,207836u,272709632u,67108864u}/* 19DE */, /*5615*/{0,424u,3670017u,92547099u,40u,1610612768u,311924u,406960128u,67108864u}/* 19DF */, /*5616*/{0,432u,2031617u,76785691u,40u,1610612768u,11076u,138442752u,67108864u}/* 19E0 */, /*5617*/{0,432u,2031617u,76785691u,40u,1610612768u,11084u,138442752u,67108864u}/* 19E1 */, /*5618*/{0,432u,2031617u,76785691u,40u,1610612768u,11092u,138442752u,67108864u}/* 19E2 */, /*5619*/{0,432u,2031617u,76785691u,40u,1610612768u,11100u,138442752u,67108864u}/* 19E3 */, /*5620*/{0,432u,2031617u,76785691u,40u,1610612768u,11108u,138442752u,67108864u}/* 19E4 */, /*5621*/{0,432u,2031617u,76785691u,40u,1610612768u,11116u,138442752u,67108864u}/* 19E5 */, /*5622*/{0,432u,2031617u,76785691u,40u,1610612768u,11124u,138442752u,67108864u}/* 19E6 */, /*5623*/{0,432u,2031617u,76785691u,40u,1610612768u,11132u,138442752u,67108864u}/* 19E7 */, /*5624*/{0,432u,2031617u,76785691u,40u,1610612768u,11140u,138442752u,67108864u}/* 19E8 */, /*5625*/{0,432u,2031617u,76785691u,40u,1610612768u,11148u,138442752u,67108864u}/* 19E9 */, /*5626*/{0,432u,2031617u,76785691u,40u,1610612768u,11156u,138442752u,67108864u}/* 19EA */, /*5627*/{0,432u,2031617u,76785691u,40u,1610612768u,11164u,138442752u,67108864u}/* 19EB */, /*5628*/{0,432u,2031617u,76785691u,40u,1610612768u,11172u,138442752u,67108864u}/* 19EC */, /*5629*/{0,432u,2031617u,76785691u,40u,1610612768u,11180u,138442752u,67108864u}/* 19ED */, /*5630*/{0,432u,2031617u,76785691u,40u,1610612768u,11188u,138442752u,67108864u}/* 19EE */, /*5631*/{0,432u,2031617u,76785691u,40u,1610612768u,11196u,138442752u,67108864u}/* 19EF */, /*5632*/{0,432u,2031617u,76785691u,40u,1610612768u,11204u,138442752u,67108864u}/* 19F0 */, /*5633*/{0,432u,2031617u,76785691u,40u,1610612768u,11212u,138442752u,67108864u}/* 19F1 */, /*5634*/{0,432u,2031617u,76785691u,40u,1610612768u,11220u,138442752u,67108864u}/* 19F2 */, /*5635*/{0,432u,2031617u,76785691u,40u,1610612768u,11228u,138442752u,67108864u}/* 19F3 */, /*5636*/{0,432u,2031617u,76785691u,40u,1610612768u,11236u,138442752u,67108864u}/* 19F4 */, /*5637*/{0,432u,2031617u,76785691u,40u,1610612768u,11244u,138442752u,67108864u}/* 19F5 */, /*5638*/{0,432u,2031617u,76785691u,40u,1610612768u,11252u,138442752u,67108864u}/* 19F6 */, /*5639*/{0,432u,2031617u,76785691u,40u,1610612768u,11260u,138442752u,67108864u}/* 19F7 */, /*5640*/{0,432u,2031617u,76785691u,40u,1610612768u,11268u,138442752u,67108864u}/* 19F8 */, /*5641*/{0,432u,2031617u,76785691u,40u,1610612768u,11276u,138442752u,67108864u}/* 19F9 */, /*5642*/{0,432u,2031617u,76785691u,40u,1610612768u,11284u,138442752u,67108864u}/* 19FA */, /*5643*/{0,432u,2031617u,76785691u,40u,1610612768u,11292u,138442752u,67108864u}/* 19FB */, /*5644*/{0,432u,2031617u,76785691u,40u,1610612768u,11300u,138442752u,67108864u}/* 19FC */, /*5645*/{0,432u,2031617u,76785691u,40u,1610612768u,11308u,138442752u,67108864u}/* 19FD */, /*5646*/{0,432u,2031617u,76785691u,40u,1610612768u,11316u,138442752u,67108864u}/* 19FE */, /*5647*/{0,432u,2031617u,76785691u,40u,1610612768u,11324u,138442752u,67108864u}/* 19FF */, /*5648*/{0,440u,3538945u,76808197u,1515560u,3758096416u,1677821548u,138442752u,393216u}/* 1A00 */, /*5649*/{0,440u,3538945u,76808197u,1515560u,3758096416u,1677821556u,138442752u,393216u}/* 1A01 */, /*5650*/{0,440u,3538945u,76808197u,1515560u,3758096416u,1677821564u,138442752u,393216u}/* 1A02 */, /*5651*/{0,440u,3538945u,76808197u,1515560u,3758096416u,1677821572u,138442752u,393216u}/* 1A03 */, /*5652*/{0,440u,3538945u,76808197u,1515560u,3758096416u,1677821580u,138442752u,393216u}/* 1A04 */, /*5653*/{0,440u,3538945u,76808197u,1515560u,3758096416u,1677821588u,138442752u,393216u}/* 1A05 */, /*5654*/{0,440u,3538945u,76808197u,1515560u,3758096416u,1677821596u,138442752u,393216u}/* 1A06 */, /*5655*/{0,440u,3538945u,76808197u,1515560u,3758096416u,1677821604u,138442752u,393216u}/* 1A07 */, /*5656*/{0,440u,3538945u,76808197u,1515560u,3758096416u,1677821612u,138442752u,393216u}/* 1A08 */, /*5657*/{0,440u,3538945u,76808197u,1515560u,3758096416u,1677821620u,138442752u,393216u}/* 1A09 */, /*5658*/{0,440u,3538945u,76808197u,1515560u,3758096416u,1677821628u,138442752u,393216u}/* 1A0A */, /*5659*/{0,440u,3538945u,76808197u,1515560u,3758096416u,1677821636u,138442752u,393216u}/* 1A0B */, /*5660*/{0,440u,3538945u,76808197u,1515560u,3758096416u,1677821644u,138442752u,393216u}/* 1A0C */, /*5661*/{0,440u,3538945u,76808197u,1515560u,3758096416u,1677821652u,138442752u,393216u}/* 1A0D */, /*5662*/{0,440u,3538945u,76808197u,1515560u,3758096416u,1677821660u,138442752u,393216u}/* 1A0E */, /*5663*/{0,440u,3538945u,76808197u,1515560u,3758096416u,1677821668u,138442752u,393216u}/* 1A0F */, /*5664*/{0,440u,3538945u,76808197u,1515560u,3758096416u,1677821676u,138442752u,393216u}/* 1A10 */, /*5665*/{0,440u,3538945u,76808197u,1515560u,3758096416u,1677821684u,138442752u,393216u}/* 1A11 */, /*5666*/{0,440u,3538945u,76808197u,1515560u,3758096416u,1677821692u,138442752u,393216u}/* 1A12 */, /*5667*/{0,440u,3538945u,76808197u,1515560u,3758096416u,1677821700u,138442752u,393216u}/* 1A13 */, /*5668*/{0,440u,3538945u,76808197u,1515560u,3758096416u,1677821708u,138442752u,393216u}/* 1A14 */, /*5669*/{0,440u,3538945u,76808197u,1515560u,3758096416u,1677821716u,138442752u,393216u}/* 1A15 */, /*5670*/{0,440u,3538945u,76808197u,1515560u,3758096416u,1677821724u,138442752u,393216u}/* 1A16 */, /*5671*/{0,440u,3538945u,3423875078u,672030728u,3774873616u,1078036260u,138443264u,262144u}/* 1A17 */, /*5672*/{0,440u,3538945u,3088330758u,672030728u,3774873616u,1078036268u,138443264u,262144u}/* 1A18 */, /*5673*/{0,440u,3538945u,68419592u,940466184u,3758096416u,1078036276u,138443264u,262144u}/* 1A19 */, /*5674*/{0,440u,3538945u,68419592u,940466184u,3758096416u,1078036284u,138443264u,262144u}/* 1A1A */, /*5675*/{0,440u,3538945u,68431878u,672030728u,3774873616u,1078036292u,138443264u,262144u}/* 1A1B */, /*5676*/{0,440u,3538945u,76808215u,40u,1610612768u,5724u,138442754u,0}/* 1A1E */, /*5677*/{0,440u,3538945u,76808215u,40u,1610612768u,5732u,138442754u,0}/* 1A1F */, /*5678*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677825772u,138442752u,393216u}/* 1A20 */, /*5679*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677825780u,138442752u,393216u}/* 1A21 */, /*5680*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677825788u,138442752u,393216u}/* 1A22 */, /*5681*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677825796u,138442752u,393216u}/* 1A23 */, /*5682*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677825804u,138442752u,393216u}/* 1A24 */, /*5683*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677825812u,138442752u,393216u}/* 1A25 */, /*5684*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677825820u,138442752u,393216u}/* 1A26 */, /*5685*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677825828u,138442752u,393216u}/* 1A27 */, /*5686*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677825836u,138442752u,393216u}/* 1A28 */, /*5687*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677825844u,138442752u,393216u}/* 1A29 */, /*5688*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677825852u,138442752u,393216u}/* 1A2A */, /*5689*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677825860u,138442752u,393216u}/* 1A2B */, /*5690*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677825868u,138442752u,393216u}/* 1A2C */, /*5691*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677825876u,138442752u,393216u}/* 1A2D */, /*5692*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677825884u,138442752u,393216u}/* 1A2E */, /*5693*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677825892u,138442752u,393216u}/* 1A2F */, /*5694*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677825900u,138442752u,393216u}/* 1A30 */, /*5695*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677825908u,138442752u,393216u}/* 1A31 */, /*5696*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677825916u,138442752u,393216u}/* 1A32 */, /*5697*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677825924u,138442752u,393216u}/* 1A33 */, /*5698*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677825932u,138442752u,393216u}/* 1A34 */, /*5699*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677825940u,138442752u,393216u}/* 1A35 */, /*5700*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677825948u,138442752u,393216u}/* 1A36 */, /*5701*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677825956u,138442752u,393216u}/* 1A37 */, /*5702*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677825964u,138442752u,393216u}/* 1A38 */, /*5703*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677825972u,138442752u,393216u}/* 1A39 */, /*5704*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677825980u,138442752u,393216u}/* 1A3A */, /*5705*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677825988u,138442752u,393216u}/* 1A3B */, /*5706*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677825996u,138442752u,393216u}/* 1A3C */, /*5707*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677826004u,138442752u,393216u}/* 1A3D */, /*5708*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677826012u,138442752u,393216u}/* 1A3E */, /*5709*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677826020u,138442752u,393216u}/* 1A3F */, /*5710*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677826028u,138442752u,393216u}/* 1A40 */, /*5711*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677826036u,138442752u,393216u}/* 1A41 */, /*5712*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677826044u,138442752u,393216u}/* 1A42 */, /*5713*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677826052u,138442752u,393216u}/* 1A43 */, /*5714*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677826060u,138442752u,393216u}/* 1A44 */, /*5715*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677826068u,138442752u,393216u}/* 1A45 */, /*5716*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677826076u,138442752u,393216u}/* 1A46 */, /*5717*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677826084u,138442752u,393216u}/* 1A47 */, /*5718*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677826092u,138442752u,393216u}/* 1A48 */, /*5719*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677826100u,138442752u,393216u}/* 1A49 */, /*5720*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677826108u,138442752u,393216u}/* 1A4A */, /*5721*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677826116u,138442752u,393216u}/* 1A4B */, /*5722*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677826124u,138442752u,393216u}/* 1A4C */, /*5723*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677826196u,138442752u,393216u}/* 1A4D */, /*5724*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677826204u,138442752u,393216u}/* 1A4E */, /*5725*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677826212u,138442752u,393216u}/* 1A4F */, /*5726*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677826220u,138442752u,393216u}/* 1A50 */, /*5727*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677826228u,138442752u,393216u}/* 1A51 */, /*5728*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677826236u,138442752u,393216u}/* 1A52 */, /*5729*/{0,448u,5111809u,92635141u,73768u,3758096416u,1677826132u,138442752u,393216u}/* 1A53 */, /*5730*/{0,448u,5111809u,92635141u,73768u,3758096416u,1678035308u,406960128u,393216u}/* 1A54 */, /*5731*/{0,448u,5111809u,92635144u,940466184u,3758096416u,1078040676u,138443264u,262144u}/* 1A55 */, /*5732*/{0,448u,5111809u,92647430u,672030728u,3774873616u,1078040684u,138443264u,262144u}/* 1A56 */, /*5733*/{0,448u,5111809u,92635144u,940466184u,3758096416u,1078040692u,138443264u,262144u}/* 1A57 */, /*5734*/{0,448u,5111809u,92647430u,672030728u,3774873616u,1078040348u,138459648u,262144u}/* 1A58 */, /*5735*/{0,448u,5111809u,92647430u,672030728u,3774873616u,1078040516u,138459648u,262144u}/* 1A5A */, /*5736*/{0,448u,5111809u,92647430u,672030728u,3774873616u,1078040700u,138443264u,262144u}/* 1A5C */, /*5737*/{0,448u,5111809u,92647430u,672030728u,3774873616u,1078040708u,138443264u,262144u}/* 1A5D */, /*5738*/{0,448u,5111809u,92647430u,672030728u,3774873616u,1078040716u,138443264u,262144u}/* 1A5E */, /*5739*/{0,448u,5111809u,361082886u,672030728u,1627389976u,1078040908u,138442752u,262144u}/* 1A60 */, /*5740*/{0,448u,5111809u,92635144u,942088u,3758096416u,1078040772u,138443264u,262144u}/* 1A61 */, /*5741*/{0,448u,5111809u,92647430u,672030728u,3774873616u,1078040788u,138443264u,262144u}/* 1A62 */, /*5742*/{0,448u,5111809u,92635144u,942088u,3758096416u,1078040796u,138443264u,262144u}/* 1A63 */, /*5743*/{0,448u,5111809u,92635144u,942088u,3758096416u,1078040796u,138459648u,262144u}/* 1A64 */, /*5744*/{0,448u,5111809u,92647430u,672030728u,3774873616u,1078040804u,138443264u,262144u}/* 1A65 */, /*5745*/{0,448u,5111809u,92647430u,672030728u,3774873616u,1078040812u,138443264u,262144u}/* 1A66 */, /*5746*/{0,448u,5111809u,92647430u,672030728u,3774873616u,1078040820u,138443264u,262144u}/* 1A67 */, /*5747*/{0,448u,5111809u,92647430u,672030728u,3774873616u,1078040828u,138443264u,262144u}/* 1A68 */, /*5748*/{0,448u,5111809u,92647430u,672030728u,3774873616u,1078040836u,138443264u,262144u}/* 1A69 */, /*5749*/{0,448u,5111809u,92647430u,672030728u,3774873616u,1078040844u,138443264u,262144u}/* 1A6A */, /*5750*/{0,448u,5111809u,92647430u,672030728u,3774873616u,1078040668u,138443264u,262144u}/* 1A6B */, /*5751*/{0,448u,5111809u,92647430u,672030728u,3774873616u,1078040780u,138443264u,262144u}/* 1A6C */, /*5752*/{0,448u,5111809u,92635144u,940466184u,3758096416u,1078040900u,138443264u,262144u}/* 1A6D */, /*5753*/{0,448u,5111809u,92635144u,940466184u,3758096416u,1078040852u,138443264u,262144u}/* 1A6E */, /*5754*/{0,448u,5111809u,92635144u,940466184u,3758096416u,1078040860u,138443264u,262144u}/* 1A6F */, /*5755*/{0,448u,5111809u,92635144u,940466184u,3758096416u,1078040876u,138443264u,262144u}/* 1A70 */, /*5756*/{0,448u,5111809u,92635144u,940466184u,3758096416u,1078040884u,138443264u,262144u}/* 1A71 */, /*5757*/{0,448u,5111809u,92635144u,940466184u,3758096416u,1078040892u,138443264u,262144u}/* 1A72 */, /*5758*/{0,448u,5111809u,92647430u,672030728u,3774873616u,1078040868u,138443264u,262144u}/* 1A73 */, /*5759*/{0,448u,5111809u,92647430u,672030728u,3774873616u,1077936140u,826309120u,262144u}/* 1A74 */, /*5760*/{0,448u,5111809u,3448090630u,672030728u,1627398160u,1077936140u,985692160u,262144u}/* 1A75 */, /*5761*/{0,448u,5111809u,3448090630u,672030728u,1627398160u,1077936140u,989886464u,262144u}/* 1A76 */, /*5762*/{0,448u,5111809u,3448090630u,672030728u,1627398160u,1077936140u,994080768u,262144u}/* 1A77 */, /*5763*/{0,448u,5111809u,3448090630u,672030728u,1627398160u,1077936140u,998275072u,262144u}/* 1A78 */, /*5764*/{0,448u,5111809u,3448090630u,672030728u,1627398160u,1077936140u,1002469376u,262144u}/* 1A79 */, /*5765*/{0,448u,5111809u,3448090630u,672030728u,1627398160u,1077936140u,1006663680u,262144u}/* 1A7A */, /*5766*/{0,448u,5111809u,3448090630u,672030728u,1627398160u,1077936140u,1010857984u,262144u}/* 1A7B */, /*5767*/{0,448u,5111809u,3448090630u,672030728u,1627398160u,1077936140u,1015052288u,262144u}/* 1A7C */, /*5768*/{0,448u,5111809u,3088429062u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* 1A7F */, /*5769*/{0,448u,38667265u,85295113u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 1A80 */, /*5770*/{0,448u,541984257u,85295113u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 1A81 */, /*5771*/{0,448u,575539713u,85295113u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 1A82 */, /*5772*/{0,448u,609093633u,85295113u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 1A83 */, /*5773*/{0,448u,642650113u,85295113u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 1A84 */, /*5774*/{0,448u,676203521u,85295113u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 1A85 */, /*5775*/{0,448u,709760513u,85295113u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 1A86 */, /*5776*/{0,448u,743312897u,85295113u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 1A87 */, /*5777*/{0,448u,776870913u,85295113u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 1A88 */, /*5778*/{0,448u,810423297u,85295113u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 1A89 */, /*5779*/{0,448u,5111809u,92635159u,40u,1610612768u,8548u,138442754u,0}/* 1AA0 */, /*5780*/{0,448u,5111809u,92635159u,40u,1610612768u,8556u,138442754u,0}/* 1AA1 */, /*5781*/{0,448u,5111809u,92635159u,40u,1610612768u,8564u,138442754u,0}/* 1AA2 */, /*5782*/{0,448u,5111809u,92635159u,40u,1610612768u,8572u,138442754u,0}/* 1AA3 */, /*5783*/{0,448u,5111809u,92635159u,40u,1610612768u,8580u,138442754u,0}/* 1AA4 */, /*5784*/{0,448u,5111809u,92635159u,40u,1610612768u,8588u,138442754u,0}/* 1AA5 */, /*5785*/{0,448u,5111809u,92635159u,40u,1610612768u,8596u,138442754u,0}/* 1AA6 */, /*5786*/{0,448u,5111809u,92635140u,73768u,3774873760u,1677779740u,138442752u,393216u}/* 1AA7 */, /*5787*/{0,448u,5111809u,92635159u,98344u,1610612768u,5372u,138442754u,41943040u}/* 1AA8 */, /*5788*/{0,448u,5111809u,92635159u,98344u,1610612768u,5380u,138442754u,41943040u}/* 1AA9 */, /*5789*/{0,448u,5111809u,92635159u,98344u,1610612768u,5388u,138442754u,41943040u}/* 1AAA */, /*5790*/{0,448u,5111809u,92635159u,98344u,1610612768u,5396u,138442754u,41943040u}/* 1AAB */, /*5791*/{0,448u,5111809u,92635159u,40u,1610612768u,8604u,138442754u,0}/* 1AAC */, /*5792*/{0,448u,5111809u,92635159u,40u,1610612768u,8612u,138442754u,0}/* 1AAD */, /*5793*/{0,456u,2686977u,3424137222u,672030728u,1627398160u,1077936140u,218134528u,262144u}/* 1AB0 */, /*5794*/{0,456u,2686977u,3088592902u,672030728u,1627398160u,1077936140u,222328832u,262144u}/* 1AB5 */, /*5795*/{0,456u,2686977u,68694023u,672030728u,1627389968u,4194316u,230717440u,0}/* 1ABE */, /*5796*/{0,464u,4063233u,68464646u,672030728u,3774873616u,1077936140u,822114816u,262144u}/* 1B00 */, /*5797*/{0,464u,4063233u,68464646u,672030728u,3774873616u,1077936140u,826309120u,262144u}/* 1B02 */, /*5798*/{0,464u,4063233u,68464646u,672030728u,3774873616u,1077936140u,843086336u,262144u}/* 1B03 */, /*5799*/{0,464u,4063233u,68452360u,940466184u,3758096416u,1077936140u,830503424u,262144u}/* 1B04 */, /*5800*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677826936u,138442752u,393216u}/* 1B05 */, /*5801*/{253231104u,464u,4063233u,76840997u,1515560u,3758096416u,1677826948u,138436608u,393216u}/* 1B06 */, /*5802*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677826952u,138442752u,393216u}/* 1B07 */, /*5803*/{253755392u,464u,4063233u,76840997u,1515560u,3758096416u,1677826964u,138436608u,393216u}/* 1B08 */, /*5804*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677826968u,138442752u,393216u}/* 1B09 */, /*5805*/{254279680u,464u,4063233u,76840997u,1515560u,3758096416u,1677826980u,138436608u,393216u}/* 1B0A */, /*5806*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677826984u,138442752u,393216u}/* 1B0B */, /*5807*/{254803968u,464u,4063233u,76840997u,1515560u,3758096416u,1677826996u,138436608u,393216u}/* 1B0C */, /*5808*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827000u,138442752u,393216u}/* 1B0D */, /*5809*/{255328256u,464u,4063233u,76840997u,1515560u,3758096416u,1677827012u,138436608u,393216u}/* 1B0E */, /*5810*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827020u,138442752u,393216u}/* 1B0F */, /*5811*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827028u,138442752u,393216u}/* 1B10 */, /*5812*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827032u,138442752u,393216u}/* 1B11 */, /*5813*/{255852544u,464u,4063233u,76840997u,1515560u,3758096416u,1677827044u,138436608u,393216u}/* 1B12 */, /*5814*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827052u,138442752u,393216u}/* 1B13 */, /*5815*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827076u,138442752u,393216u}/* 1B14 */, /*5816*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827084u,138442752u,393216u}/* 1B15 */, /*5817*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827092u,138442752u,393216u}/* 1B16 */, /*5818*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827100u,138442752u,393216u}/* 1B17 */, /*5819*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827108u,138442752u,393216u}/* 1B18 */, /*5820*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827116u,138442752u,393216u}/* 1B19 */, /*5821*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827124u,138442752u,393216u}/* 1B1A */, /*5822*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827132u,138442752u,393216u}/* 1B1B */, /*5823*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827140u,138442752u,393216u}/* 1B1C */, /*5824*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827148u,138442752u,393216u}/* 1B1D */, /*5825*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827156u,138442752u,393216u}/* 1B1E */, /*5826*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827164u,138442752u,393216u}/* 1B1F */, /*5827*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827172u,138442752u,393216u}/* 1B20 */, /*5828*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827180u,138442752u,393216u}/* 1B21 */, /*5829*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827188u,138442752u,393216u}/* 1B22 */, /*5830*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827204u,138442752u,393216u}/* 1B23 */, /*5831*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827212u,138442752u,393216u}/* 1B24 */, /*5832*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827220u,138442752u,393216u}/* 1B25 */, /*5833*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827228u,138442752u,393216u}/* 1B26 */, /*5834*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827236u,138442752u,393216u}/* 1B27 */, /*5835*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827252u,138442752u,393216u}/* 1B28 */, /*5836*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827260u,138442752u,393216u}/* 1B29 */, /*5837*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827268u,138442752u,393216u}/* 1B2A */, /*5838*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827276u,138442752u,393216u}/* 1B2B */, /*5839*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827284u,138442752u,393216u}/* 1B2C */, /*5840*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827292u,138442752u,393216u}/* 1B2D */, /*5841*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827300u,138442752u,393216u}/* 1B2E */, /*5842*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827308u,138442752u,393216u}/* 1B2F */, /*5843*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827324u,138442752u,393216u}/* 1B30 */, /*5844*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827332u,138442752u,393216u}/* 1B31 */, /*5845*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827340u,138442752u,393216u}/* 1B32 */, /*5846*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827364u,138442752u,393216u}/* 1B33 */, /*5847*/{0,464u,4063233u,202682374u,672030728u,1627398160u,1077936140u,817920000u,262144u}/* 1B34 */, /*5848*/{0,464u,4063234u,68452360u,940466192u,3758096416u,1078041900u,138443264u,262144u}/* 1B35 */, /*5849*/{0,464u,4063233u,68464646u,672030728u,3774873616u,1078041908u,138443264u,262144u}/* 1B36 */, /*5850*/{0,464u,4063233u,68464646u,672030728u,3774873616u,1078041916u,138443264u,262144u}/* 1B37 */, /*5851*/{0,464u,4063233u,68464646u,672030728u,3774873616u,1078041924u,138443264u,262144u}/* 1B38 */, /*5852*/{0,464u,4063233u,68464646u,672030728u,3774873616u,1078041932u,138443264u,262144u}/* 1B39 */, /*5853*/{0,464u,4063233u,68464646u,672030728u,3774873616u,1078041936u,138443264u,262144u}/* 1B3A */, /*5854*/{256376832u,464u,4063233u,68452392u,940466184u,3758096416u,1078041948u,138437120u,262144u}/* 1B3B */, /*5855*/{0,464u,4063233u,68464646u,672030728u,3774873616u,1078041952u,138443264u,262144u}/* 1B3C */, /*5856*/{256901120u,464u,4063233u,68452392u,940466184u,3758096416u,1078041964u,138437120u,262144u}/* 1B3D */, /*5857*/{0,464u,4063233u,68452360u,940466184u,3758096416u,1078041968u,138443264u,262144u}/* 1B3E */, /*5858*/{0,464u,4063233u,68452360u,940466184u,3758096416u,1078041976u,138443264u,262144u}/* 1B3F */, /*5859*/{257425408u,464u,4063233u,68452392u,940466184u,3758096416u,1078041988u,138437120u,262144u}/* 1B40 */, /*5860*/{257949696u,464u,4063233u,68452392u,940466184u,3758096416u,1078041996u,138437120u,262144u}/* 1B41 */, /*5861*/{0,464u,4063233u,68464646u,672030728u,3774873616u,1078042000u,138443264u,262144u}/* 1B42 */, /*5862*/{258473984u,464u,4063233u,68452392u,940466184u,3758096416u,1078042012u,138437120u,262144u}/* 1B43 */, /*5863*/{0,464u,4063233u,336887816u,940466184u,1610620968u,1078042020u,138442752u,262144u}/* 1B44 */, /*5864*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827060u,138442752u,393216u}/* 1B45 */, /*5865*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827068u,138442752u,393216u}/* 1B46 */, /*5866*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827196u,138442752u,393216u}/* 1B47 */, /*5867*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827244u,138442752u,393216u}/* 1B48 */, /*5868*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827316u,138442752u,393216u}/* 1B49 */, /*5869*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827348u,138442752u,393216u}/* 1B4A */, /*5870*/{0,464u,4063233u,76840965u,1515560u,3758096416u,1677827356u,138442752u,393216u}/* 1B4B */, /*5871*/{0,464u,37618689u,85229577u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 1B50 */, /*5872*/{0,464u,540935681u,85229577u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 1B51 */, /*5873*/{0,464u,574491137u,85229577u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 1B52 */, /*5874*/{0,464u,608045057u,85229577u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 1B53 */, /*5875*/{0,464u,641601537u,85229577u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 1B54 */, /*5876*/{0,464u,675154945u,85229577u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 1B55 */, /*5877*/{0,464u,708711937u,85229577u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 1B56 */, /*5878*/{0,464u,742264321u,85229577u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 1B57 */, /*5879*/{0,464u,775822337u,85229577u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 1B58 */, /*5880*/{0,464u,809374721u,85229577u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 1B59 */, /*5881*/{0,464u,4063233u,69500951u,98344u,1610612768u,5740u,138442754u,41943040u}/* 1B5A */, /*5882*/{0,464u,4063233u,69500951u,98344u,1610612768u,5748u,138442754u,41943040u}/* 1B5B */, /*5883*/{0,464u,4063233u,76840983u,40u,1610612768u,5140u,138442754u,0}/* 1B5C */, /*5884*/{0,464u,4063233u,69500951u,40u,1610612768u,4836u,138442754u,8388608u}/* 1B5D */, /*5885*/{0,464u,4063233u,69500951u,98344u,1610612768u,5404u,138442754u,41943040u}/* 1B5E */, /*5886*/{0,464u,4063233u,69500951u,98344u,1610612768u,5412u,138442754u,41943040u}/* 1B5F */, /*5887*/{0,464u,4063233u,69500951u,40u,1610612768u,4236u,138442754u,0}/* 1B60 */, /*5888*/{0,464u,4063233u,76840987u,40u,1610612768u,11332u,138442752u,67108864u}/* 1B61 */, /*5889*/{0,464u,4063233u,76840987u,40u,1610612768u,11340u,138442752u,67108864u}/* 1B62 */, /*5890*/{0,464u,4063233u,76840987u,40u,1610612768u,11348u,138442752u,67108864u}/* 1B63 */, /*5891*/{0,464u,4063233u,76840987u,40u,1610612768u,11356u,138442752u,67108864u}/* 1B64 */, /*5892*/{0,464u,4063233u,76840987u,40u,1610612768u,11364u,138442752u,67108864u}/* 1B65 */, /*5893*/{0,464u,4063233u,76840987u,40u,1610612768u,11372u,138442752u,67108864u}/* 1B66 */, /*5894*/{0,464u,4063233u,76840987u,40u,1610612768u,11380u,138442752u,67108864u}/* 1B67 */, /*5895*/{0,464u,4063233u,76840987u,40u,1610612768u,11388u,138442752u,67108864u}/* 1B68 */, /*5896*/{0,464u,4063233u,76840987u,40u,1610612768u,11396u,138442752u,67108864u}/* 1B69 */, /*5897*/{0,464u,4063233u,76840987u,40u,1610612768u,11404u,138442752u,67108864u}/* 1B6A */, /*5898*/{0,464u,4063233u,3423907846u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* 1B6B */, /*5899*/{0,464u,4063233u,3088363526u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* 1B6C */, /*5900*/{0,464u,4063233u,76840987u,40u,1610612768u,11412u,138442752u,67108864u}/* 1B74 */, /*5901*/{0,464u,4063233u,76840987u,40u,1610612768u,11420u,138442752u,67108864u}/* 1B75 */, /*5902*/{0,464u,4063233u,76840987u,40u,1610612768u,11428u,138442752u,67108864u}/* 1B76 */, /*5903*/{0,464u,4063233u,76840987u,40u,1610612768u,11436u,138442752u,67108864u}/* 1B77 */, /*5904*/{0,464u,4063233u,76840987u,40u,1610612768u,11444u,138442752u,67108864u}/* 1B78 */, /*5905*/{0,464u,4063233u,76840987u,40u,1610612768u,11452u,138442752u,67108864u}/* 1B79 */, /*5906*/{0,464u,4063233u,76840987u,40u,1610612768u,11460u,138442752u,67108864u}/* 1B7A */, /*5907*/{0,464u,4063233u,76840987u,40u,1610612768u,11468u,138442752u,67108864u}/* 1B7B */, /*5908*/{0,464u,4063233u,76840987u,40u,1610612768u,11476u,138442752u,67108864u}/* 1B7C */, /*5909*/{0,472u,4390913u,68497414u,672030728u,3774873616u,1077936140u,826309120u,262144u}/* 1B80 */, /*5910*/{0,472u,4390913u,68497414u,672030728u,3774873616u,1077936140u,851474944u,262144u}/* 1B81 */, /*5911*/{0,472u,4390913u,68485128u,940466184u,3758096416u,1077936140u,830503424u,262144u}/* 1B82 */, /*5912*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814324u,138442752u,393216u}/* 1B83 */, /*5913*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814332u,138442752u,393216u}/* 1B84 */, /*5914*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814340u,138442752u,393216u}/* 1B85 */, /*5915*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814348u,138442752u,393216u}/* 1B86 */, /*5916*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814356u,138442752u,393216u}/* 1B87 */, /*5917*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814364u,138442752u,393216u}/* 1B88 */, /*5918*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814372u,138442752u,393216u}/* 1B89 */, /*5919*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814380u,138442752u,393216u}/* 1B8A */, /*5920*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814396u,138442752u,393216u}/* 1B8B */, /*5921*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814404u,138442752u,393216u}/* 1B8C */, /*5922*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814412u,138442752u,393216u}/* 1B8D */, /*5923*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814420u,138442752u,393216u}/* 1B8E */, /*5924*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814428u,138442752u,393216u}/* 1B8F */, /*5925*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814436u,138442752u,393216u}/* 1B90 */, /*5926*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814444u,138442752u,393216u}/* 1B91 */, /*5927*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814452u,138442752u,393216u}/* 1B92 */, /*5928*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814460u,138442752u,393216u}/* 1B93 */, /*5929*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814468u,138442752u,393216u}/* 1B94 */, /*5930*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814476u,138442752u,393216u}/* 1B95 */, /*5931*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814484u,138442752u,393216u}/* 1B96 */, /*5932*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814492u,138442752u,393216u}/* 1B97 */, /*5933*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814500u,138442752u,393216u}/* 1B98 */, /*5934*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814516u,138442752u,393216u}/* 1B99 */, /*5935*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814532u,138442752u,393216u}/* 1B9A */, /*5936*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814548u,138442752u,393216u}/* 1B9B */, /*5937*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814572u,138442752u,393216u}/* 1B9C */, /*5938*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814596u,138442752u,393216u}/* 1B9D */, /*5939*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814612u,138442752u,393216u}/* 1B9E */, /*5940*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814620u,138442752u,393216u}/* 1B9F */, /*5941*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814636u,138442752u,393216u}/* 1BA0 */, /*5942*/{0,472u,4390913u,68485128u,940466184u,3758096416u,1078029068u,138443264u,262144u}/* 1BA1 */, /*5943*/{0,472u,4390913u,68497414u,672030728u,3774873616u,1078029084u,138443264u,262144u}/* 1BA2 */, /*5944*/{0,472u,4390913u,68497414u,672030728u,3774873616u,1078029108u,138443264u,262144u}/* 1BA3 */, /*5945*/{0,472u,4390913u,68497414u,672030728u,3774873616u,1078029172u,138443264u,262144u}/* 1BA4 */, /*5946*/{0,472u,4390913u,68497414u,672030728u,3774873616u,1078029180u,138443264u,262144u}/* 1BA5 */, /*5947*/{0,472u,4390913u,68485128u,940466184u,3758096416u,1078029188u,138443264u,262144u}/* 1BA6 */, /*5948*/{0,472u,4390913u,68485128u,940466184u,3758096416u,1078029196u,138443264u,262144u}/* 1BA7 */, /*5949*/{0,472u,4390913u,68497414u,672030728u,3774873616u,1078029204u,138443264u,262144u}/* 1BA8 */, /*5950*/{0,472u,4390913u,68497414u,672030728u,3774873616u,1078029212u,138443264u,262144u}/* 1BA9 */, /*5951*/{0,472u,4390913u,336920584u,940466184u,1610620968u,1078029220u,138442752u,262144u}/* 1BAA */, /*5952*/{0,472u,4390913u,337031174u,672030728u,1627398168u,1078029228u,138442752u,262144u}/* 1BAB */, /*5953*/{0,472u,4390913u,68595718u,672030728u,3774873616u,1078029052u,138443264u,262144u}/* 1BAC */, /*5954*/{0,472u,4390913u,68595718u,672030728u,3774873616u,1078029132u,138443264u,262144u}/* 1BAD */, /*5955*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814388u,138442752u,393216u}/* 1BAE */, /*5956*/{0,472u,4390913u,76873733u,1515560u,3758096416u,1677814628u,138442752u,393216u}/* 1BAF */, /*5957*/{0,472u,37946369u,85262345u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 1BB0 */, /*5958*/{0,472u,541263361u,85262345u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 1BB1 */, /*5959*/{0,472u,574818817u,85262345u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 1BB2 */, /*5960*/{0,472u,608372737u,85262345u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 1BB3 */, /*5961*/{0,472u,641929217u,85262345u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 1BB4 */, /*5962*/{0,472u,675482625u,85262345u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 1BB5 */, /*5963*/{0,472u,709039617u,85262345u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 1BB6 */, /*5964*/{0,472u,742592001u,85262345u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 1BB7 */, /*5965*/{0,472u,776150017u,85262345u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 1BB8 */, /*5966*/{0,472u,809702401u,85262345u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 1BB9 */, /*5967*/{0,472u,4390913u,76972037u,1515560u,3758096416u,1677814324u,138459136u,393216u}/* 1BBA */, /*5968*/{0,472u,4390913u,76972037u,1515560u,3758096416u,1677814564u,138442752u,393216u}/* 1BBB */, /*5969*/{0,472u,4390913u,76972037u,1515560u,3758096416u,1677814588u,138442752u,393216u}/* 1BBC */, /*5970*/{0,472u,4390913u,76972037u,1515560u,3758096416u,1677814508u,138442752u,393216u}/* 1BBD */, /*5971*/{0,472u,4390913u,76972037u,1515560u,3758096416u,1677814380u,138631168u,393216u}/* 1BBE */, /*5972*/{0,472u,4390913u,76972037u,1515560u,3758096416u,1677814516u,138631168u,393216u}/* 1BBF */, /*5973*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821772u,138442752u,393216u}/* 1BC0 */, /*5974*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821772u,138459136u,393216u}/* 1BC1 */, /*5975*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821780u,138442752u,393216u}/* 1BC2 */, /*5976*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821780u,138459136u,393216u}/* 1BC3 */, /*5977*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821788u,138442752u,393216u}/* 1BC5 */, /*5978*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821788u,138459136u,393216u}/* 1BC6 */, /*5979*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821796u,138442752u,393216u}/* 1BC7 */, /*5980*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821796u,138459136u,393216u}/* 1BC8 */, /*5981*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821804u,138442752u,393216u}/* 1BC9 */, /*5982*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821804u,138459136u,393216u}/* 1BCA */, /*5983*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821812u,138442752u,393216u}/* 1BCB */, /*5984*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821812u,138459136u,393216u}/* 1BCC */, /*5985*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821820u,138442752u,393216u}/* 1BCE */, /*5986*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821820u,138459136u,393216u}/* 1BCF */, /*5987*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821828u,138442752u,393216u}/* 1BD0 */, /*5988*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821836u,138442752u,393216u}/* 1BD1 */, /*5989*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821844u,138442752u,393216u}/* 1BD2 */, /*5990*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821844u,138459136u,393216u}/* 1BD3 */, /*5991*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821852u,138442752u,393216u}/* 1BD4 */, /*5992*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821852u,138459136u,393216u}/* 1BD5 */, /*5993*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821860u,138442752u,393216u}/* 1BD6 */, /*5994*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821860u,138459136u,393216u}/* 1BD7 */, /*5995*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821868u,138442752u,393216u}/* 1BD8 */, /*5996*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821868u,138459136u,393216u}/* 1BD9 */, /*5997*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821876u,138442752u,393216u}/* 1BDB */, /*5998*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821876u,138459136u,393216u}/* 1BDC */, /*5999*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821884u,138442752u,393216u}/* 1BDD */, /*6000*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821892u,138442752u,393216u}/* 1BDE */, /*6001*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821892u,138459136u,393216u}/* 1BDF */, /*6002*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821900u,138442752u,393216u}/* 1BE0 */, /*6003*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821908u,138442752u,393216u}/* 1BE1 */, /*6004*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821916u,138442752u,393216u}/* 1BE2 */, /*6005*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821924u,138442752u,393216u}/* 1BE3 */, /*6006*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821932u,138442752u,393216u}/* 1BE4 */, /*6007*/{0,480u,6094849u,76939269u,1515560u,3758096416u,1677821940u,138442752u,393216u}/* 1BE5 */, /*6008*/{0,480u,6094849u,202780678u,672030728u,1627389968u,1077936140u,817920000u,262144u}/* 1BE6 */, /*6009*/{0,480u,6094849u,68550664u,940466184u,3758096416u,1078036476u,138443264u,262144u}/* 1BE7 */, /*6010*/{0,480u,6094849u,68562950u,672030728u,3774873616u,1078036476u,138459648u,262144u}/* 1BE8 */, /*6011*/{0,480u,6094849u,68562950u,672030728u,3774873616u,1078036484u,138443264u,262144u}/* 1BE9 */, /*6012*/{0,480u,6094849u,68550664u,940466184u,3758096416u,1078036492u,138443264u,262144u}/* 1BEA */, /*6013*/{0,480u,6094849u,68550664u,940466184u,3758096416u,1078036492u,138459648u,262144u}/* 1BEB */, /*6014*/{0,480u,6094849u,68550664u,940466184u,3758096416u,1078036500u,138443264u,262144u}/* 1BEC */, /*6015*/{0,480u,6094849u,68562950u,672030728u,3774873616u,1078036500u,138459648u,262144u}/* 1BED */, /*6016*/{0,480u,6094849u,68550664u,940466184u,3758096416u,1078036508u,138443264u,262144u}/* 1BEE */, /*6017*/{0,480u,6094849u,68562950u,672030728u,3774873616u,1078036508u,138459648u,262144u}/* 1BEF */, /*6018*/{0,480u,6094849u,68562950u,672030728u,3774873616u,1078036516u,138443264u,262144u}/* 1BF0 */, /*6019*/{0,480u,6094849u,68562950u,672030728u,3774873616u,1078036524u,138443264u,262144u}/* 1BF1 */, /*6020*/{0,480u,6094849u,336986120u,940466184u,1610612776u,1078036532u,138442752u,262144u}/* 1BF2 */, /*6021*/{0,480u,6094849u,336986120u,940466184u,1610612776u,1078036540u,138442752u,262144u}/* 1BF3 */, /*6022*/{0,480u,6094849u,76939287u,40u,1610612768u,8716u,138442754u,0}/* 1BFC */, /*6023*/{0,480u,6094849u,76939287u,40u,1610612768u,8724u,138442754u,0}/* 1BFD */, /*6024*/{0,480u,6094849u,76939287u,40u,1610612768u,8732u,138442754u,0}/* 1BFE */, /*6025*/{0,480u,6094849u,76939287u,40u,1610612768u,8740u,138442754u,0}/* 1BFF */, /*6026*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819636u,138442752u,393216u}/* 1C00 */, /*6027*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819644u,138442752u,393216u}/* 1C01 */, /*6028*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819652u,138442752u,393216u}/* 1C02 */, /*6029*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819660u,138442752u,393216u}/* 1C03 */, /*6030*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819668u,138442752u,393216u}/* 1C04 */, /*6031*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819676u,138442752u,393216u}/* 1C05 */, /*6032*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819684u,138442752u,393216u}/* 1C06 */, /*6033*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819692u,138442752u,393216u}/* 1C07 */, /*6034*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819700u,138442752u,393216u}/* 1C08 */, /*6035*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819708u,138442752u,393216u}/* 1C09 */, /*6036*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819740u,138442752u,393216u}/* 1C0A */, /*6037*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819748u,138442752u,393216u}/* 1C0B */, /*6038*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819756u,138442752u,393216u}/* 1C0C */, /*6039*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819764u,138442752u,393216u}/* 1C0D */, /*6040*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819772u,138442752u,393216u}/* 1C0E */, /*6041*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819780u,138442752u,393216u}/* 1C0F */, /*6042*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819788u,138442752u,393216u}/* 1C10 */, /*6043*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819796u,138442752u,393216u}/* 1C11 */, /*6044*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819804u,138442752u,393216u}/* 1C12 */, /*6045*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819812u,138442752u,393216u}/* 1C13 */, /*6046*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819820u,138442752u,393216u}/* 1C14 */, /*6047*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819828u,138442752u,393216u}/* 1C15 */, /*6048*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819836u,138442752u,393216u}/* 1C16 */, /*6049*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819844u,138442752u,393216u}/* 1C17 */, /*6050*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819852u,138442752u,393216u}/* 1C18 */, /*6051*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819860u,138442752u,393216u}/* 1C19 */, /*6052*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819868u,138442752u,393216u}/* 1C1A */, /*6053*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819884u,138442752u,393216u}/* 1C1B */, /*6054*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819900u,138442752u,393216u}/* 1C1C */, /*6055*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819908u,138442752u,393216u}/* 1C1D */, /*6056*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819916u,138442752u,393216u}/* 1C1E */, /*6057*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819924u,138442752u,393216u}/* 1C1F */, /*6058*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819932u,138442752u,393216u}/* 1C20 */, /*6059*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819940u,138442752u,393216u}/* 1C21 */, /*6060*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819948u,138442752u,393216u}/* 1C22 */, /*6061*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819956u,138442752u,393216u}/* 1C23 */, /*6062*/{0,488u,4456449u,68485128u,940466184u,3758096416u,1078034404u,138443264u,262144u}/* 1C24 */, /*6063*/{0,488u,4456449u,68485128u,940466184u,3758096416u,1078034420u,138443264u,262144u}/* 1C25 */, /*6064*/{0,488u,4456449u,68485128u,940466184u,3758096416u,1078034500u,138443264u,262144u}/* 1C26 */, /*6065*/{0,488u,4456449u,68485128u,940466184u,3758096416u,1078034508u,138443264u,262144u}/* 1C27 */, /*6066*/{0,488u,4456449u,68485128u,940466184u,3758096416u,1078034516u,138443264u,262144u}/* 1C28 */, /*6067*/{0,488u,4456449u,68485128u,940466184u,3758096416u,1078034524u,138443264u,262144u}/* 1C29 */, /*6068*/{0,488u,4456449u,68485128u,940466184u,3758096416u,1078034532u,138443264u,262144u}/* 1C2A */, /*6069*/{0,488u,4456449u,68485128u,940466184u,3758096416u,1078034540u,138443264u,262144u}/* 1C2B */, /*6070*/{0,488u,4456449u,68497414u,672030728u,3774873616u,1078034548u,138443264u,262144u}/* 1C2C */, /*6071*/{0,488u,4456449u,68497414u,672030728u,3774873616u,1078034556u,138443264u,262144u}/* 1C2D */, /*6072*/{0,488u,4456449u,68497414u,672030728u,3774873616u,1078034564u,138443264u,262144u}/* 1C2E */, /*6073*/{0,488u,4456449u,68497414u,672030728u,3774873616u,1078034572u,138443264u,262144u}/* 1C2F */, /*6074*/{0,488u,4456449u,68497414u,672030728u,3774873616u,1078034580u,138443264u,262144u}/* 1C30 */, /*6075*/{0,488u,4456449u,68497414u,672030728u,3774873616u,1078034588u,138443264u,262144u}/* 1C31 */, /*6076*/{0,488u,4456449u,68497414u,672030728u,3774873616u,1078034596u,138443264u,262144u}/* 1C32 */, /*6077*/{0,488u,4456449u,68497414u,672030728u,3774873616u,1078034604u,138443264u,262144u}/* 1C33 */, /*6078*/{0,488u,4456449u,68485128u,940466184u,3758096416u,1078034612u,138443264u,262144u}/* 1C34 */, /*6079*/{0,488u,4456449u,68485128u,940466184u,3758096416u,1078034620u,138443264u,262144u}/* 1C35 */, /*6080*/{0,488u,4456449u,68497414u,672030728u,1627398288u,1078034492u,138442752u,262144u}/* 1C36 */, /*6081*/{0,488u,4456449u,202715142u,672030728u,1627398160u,1077936140u,817920000u,262144u}/* 1C37 */, /*6082*/{0,488u,4456449u,69533719u,98344u,1610612768u,5284u,138442754u,41943040u}/* 1C3B */, /*6083*/{0,488u,4456449u,69533719u,98344u,1610612768u,5292u,138442754u,41943040u}/* 1C3C */, /*6084*/{0,488u,4456449u,69533719u,40u,1610612768u,8468u,138442754u,8388608u}/* 1C3D */, /*6085*/{0,488u,4456449u,69533719u,40u,1610612768u,8476u,138442754u,8388608u}/* 1C3E */, /*6086*/{0,488u,4456449u,69533719u,40u,1610612768u,8484u,138442754u,8388608u}/* 1C3F */, /*6087*/{0,488u,38011905u,85262345u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 1C40 */, /*6088*/{0,488u,541328897u,85262345u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 1C41 */, /*6089*/{0,488u,574884353u,85262345u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 1C42 */, /*6090*/{0,488u,608438273u,85262345u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 1C43 */, /*6091*/{0,488u,641994753u,85262345u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 1C44 */, /*6092*/{0,488u,675548161u,85262345u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 1C45 */, /*6093*/{0,488u,709105153u,85262345u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 1C46 */, /*6094*/{0,488u,742657537u,85262345u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 1C47 */, /*6095*/{0,488u,776215553u,85262345u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 1C48 */, /*6096*/{0,488u,809767937u,85262345u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 1C49 */, /*6097*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819716u,138442752u,393216u}/* 1C4D */, /*6098*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819724u,138442752u,393216u}/* 1C4E */, /*6099*/{0,488u,4456449u,76873733u,1515560u,3758096416u,1677819732u,138442752u,393216u}/* 1C4F */, /*6100*/{0,496u,38077441u,85262345u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 1C50 */, /*6101*/{0,496u,541394433u,85262345u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 1C51 */, /*6102*/{0,496u,574949889u,85262345u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 1C52 */, /*6103*/{0,496u,608503809u,85262345u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 1C53 */, /*6104*/{0,496u,642060289u,85262345u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 1C54 */, /*6105*/{0,496u,675613697u,85262345u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 1C55 */, /*6106*/{0,496u,709170689u,85262345u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 1C56 */, /*6107*/{0,496u,742723073u,85262345u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 1C57 */, /*6108*/{0,496u,776281089u,85262345u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 1C58 */, /*6109*/{0,496u,809833473u,85262345u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 1C59 */, /*6110*/{0,496u,4521985u,76873733u,1515560u,3758096416u,1677829020u,138442752u,393216u}/* 1C5A */, /*6111*/{0,496u,4521985u,76873733u,1515560u,3758096416u,1677829028u,138442752u,393216u}/* 1C5B */, /*6112*/{0,496u,4521985u,76873733u,1515560u,3758096416u,1677829036u,138442752u,393216u}/* 1C5C */, /*6113*/{0,496u,4521985u,76873733u,1515560u,3758096416u,1677829044u,138442752u,393216u}/* 1C5D */, /*6114*/{0,496u,4521985u,76873733u,1515560u,3758096416u,1677829052u,138442752u,393216u}/* 1C5E */, /*6115*/{0,496u,4521985u,76873733u,1515560u,3758096416u,1677829060u,138442752u,393216u}/* 1C5F */, /*6116*/{0,496u,4521985u,76873733u,1515560u,3758096416u,1677829068u,138442752u,393216u}/* 1C60 */, /*6117*/{0,496u,4521985u,76873733u,1515560u,3758096416u,1677829076u,138442752u,393216u}/* 1C61 */, /*6118*/{0,496u,4521985u,76873733u,1515560u,3758096416u,1677829084u,138442752u,393216u}/* 1C62 */, /*6119*/{0,496u,4521985u,76873733u,1515560u,3758096416u,1677829092u,138442752u,393216u}/* 1C63 */, /*6120*/{0,496u,4521985u,76873733u,1515560u,3758096416u,1677829100u,138442752u,393216u}/* 1C64 */, /*6121*/{0,496u,4521985u,76873733u,1515560u,3758096416u,1677829108u,138442752u,393216u}/* 1C65 */, /*6122*/{0,496u,4521985u,76873733u,1515560u,3758096416u,1677829116u,138442752u,393216u}/* 1C66 */, /*6123*/{0,496u,4521985u,76873733u,1515560u,3758096416u,1677829124u,138442752u,393216u}/* 1C67 */, /*6124*/{0,496u,4521985u,76873733u,1515560u,3758096416u,1677829132u,138442752u,393216u}/* 1C68 */, /*6125*/{0,496u,4521985u,76873733u,1515560u,3758096416u,1677829140u,138442752u,393216u}/* 1C69 */, /*6126*/{0,496u,4521985u,76873733u,1515560u,3758096416u,1677829148u,138442752u,393216u}/* 1C6A */, /*6127*/{0,496u,4521985u,76873733u,1515560u,3758096416u,1677829156u,138442752u,393216u}/* 1C6B */, /*6128*/{0,496u,4521985u,76873733u,1515560u,3758096416u,1677829164u,138442752u,393216u}/* 1C6C */, /*6129*/{0,496u,4521985u,76873733u,1515560u,3758096416u,1677829172u,138442752u,393216u}/* 1C6D */, /*6130*/{0,496u,4521985u,76873733u,1515560u,3758096416u,1677829180u,138442752u,393216u}/* 1C6E */, /*6131*/{0,496u,4521985u,76873733u,1515560u,3758096416u,1677829188u,138442752u,393216u}/* 1C6F */, /*6132*/{0,496u,4521985u,76873733u,1515560u,3758096416u,1677829196u,138442752u,393216u}/* 1C70 */, /*6133*/{0,496u,4521985u,76873733u,1515560u,3758096416u,1677829204u,138442752u,393216u}/* 1C71 */, /*6134*/{0,496u,4521985u,76873733u,1515560u,3758096416u,1677829212u,138442752u,393216u}/* 1C72 */, /*6135*/{0,496u,4521985u,76873733u,1515560u,3758096416u,1677829220u,138442752u,393216u}/* 1C73 */, /*6136*/{0,496u,4521985u,76873733u,1515560u,3758096416u,1677829228u,138442752u,393216u}/* 1C74 */, /*6137*/{0,496u,4521985u,76873733u,1515560u,3758096416u,1677829236u,138442752u,393216u}/* 1C75 */, /*6138*/{0,496u,4521985u,76873733u,1515560u,3758096416u,1677829244u,138442752u,393216u}/* 1C76 */, /*6139*/{0,496u,4521985u,76873733u,1515560u,3758096416u,1677829252u,138442752u,393216u}/* 1C77 */, /*6140*/{0,496u,4521985u,76873732u,1515560u,3774881824u,1677829260u,138442752u,393216u}/* 1C78 */, /*6141*/{0,496u,4521985u,76873732u,1515560u,3774881824u,1677829268u,138442752u,393216u}/* 1C79 */, /*6142*/{0,496u,4521985u,76873732u,1515560u,3774881824u,1677829276u,138442752u,393216u}/* 1C7A */, /*6143*/{0,496u,4521985u,76873732u,1515560u,3774881952u,1677829284u,138442752u,393216u}/* 1C7B */, /*6144*/{0,496u,4521985u,76873732u,1515560u,3774881824u,1677829292u,138442752u,393216u}/* 1C7C */, /*6145*/{0,496u,4521985u,76873732u,1515560u,3774881824u,1677829300u,138442752u,393216u}/* 1C7D */, /*6146*/{0,496u,4521985u,69533719u,98344u,1610612768u,5668u,138442754u,41943040u}/* 1C7E */, /*6147*/{0,496u,4521985u,69533719u,98344u,1610612768u,5676u,138442754u,41943040u}/* 1C7F */, /*6148*/{139776u,1103102456u,262145u,77135874u,1499176u,3807248416u,1719731404u,138459136u,393216u}/* 1C80 */, /*6149*/{139904u,1105199608u,262145u,77135874u,1499176u,3807248416u,1719731596u,138459136u,393216u}/* 1C81 */, /*6150*/{140032u,1107296760u,262145u,77135874u,1499176u,3807248416u,1719732852u,138459136u,393216u}/* 1C82 */, /*6151*/{140160u,1109393912u,262145u,77135874u,1499176u,3807248416u,1719733092u,138459136u,393216u}/* 1C83 */, /*6152*/{140288u,1111491064u,262145u,77135874u,1499176u,3807248416u,1719733164u,138459136u,393216u}/* 1C84 */, /*6153*/{140416u,1113588216u,262145u,77135874u,1499176u,3807248416u,1719733164u,138459136u,393216u}/* 1C85 */, /*6154*/{140544u,1115685368u,262145u,77135874u,1499176u,3807248416u,1719734196u,138459136u,393216u}/* 1C86 */, /*6155*/{140672u,1117782520u,262145u,77135874u,1499176u,3807248416u,1719734332u,138459136u,393216u}/* 1C87 */, /*6156*/{140800u,1119879672u,262145u,77135874u,1499176u,3807248416u,1719733380u,138459136u,393216u}/* 1C88 */, /*6157*/{0,512u,4390913u,76972055u,40u,1610612768u,8628u,138442754u,0}/* 1CC0 */, /*6158*/{0,512u,4390913u,76972055u,40u,1610612768u,8636u,138442754u,0}/* 1CC1 */, /*6159*/{0,512u,4390913u,76972055u,40u,1610612768u,8644u,138442754u,0}/* 1CC2 */, /*6160*/{0,512u,4390913u,76972055u,40u,1610612768u,8652u,138442754u,0}/* 1CC3 */, /*6161*/{0,512u,4390913u,76972055u,40u,1610612768u,8660u,138442754u,0}/* 1CC4 */, /*6162*/{0,512u,4390913u,76972055u,40u,1610612768u,8668u,138442754u,0}/* 1CC5 */, /*6163*/{0,512u,4390913u,76972055u,40u,1610612768u,8676u,138442754u,0}/* 1CC6 */, /*6164*/{0,512u,4390913u,76972055u,40u,1610612768u,8684u,138442754u,0}/* 1CC7 */, /*6165*/{0,520u,2686977u,3423973382u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* 1CD0 */, /*6166*/{0,520u,65537u,76906519u,40u,1610620960u,12u,4208642u,0}/* 1CD3 */, /*6167*/{0,520u,2686977u,135639046u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* 1CD4 */, /*6168*/{0,520u,2686977u,3088429062u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* 1CD5 */, /*6169*/{0,520u,65537u,68517896u,940466184u,1610620960u,1077936140u,4208640u,262144u}/* 1CE1 */, /*6170*/{0,520u,65537u,76906501u,1515560u,3758096416u,1677801628u,138442752u,393216u}/* 1CE9 */, /*6171*/{0,520u,65537u,76906501u,1515560u,3758096416u,1677801628u,138459136u,393216u}/* 1CEA */, /*6172*/{0,520u,2686977u,3088429062u,672030728u,1627398160u,1077936140u,826308608u,262144u}/* 1CED */, /*6173*/{0,520u,65537u,68517896u,940466184u,3758096416u,1077936140u,830503424u,262144u}/* 1CF2 */, /*6174*/{0,520u,65537u,68583432u,940466184u,3758096416u,1077936140u,830503424u,262144u}/* 1CF3 */, /*6175*/{0,520u,2686977u,3424038918u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* 1CF4 */, /*6176*/{0,520u,65537u,76972037u,1515560u,3758096416u,1677801636u,138442752u,393216u}/* 1CF5 */, /*6177*/{0,520u,65537u,76972037u,1515560u,3758096416u,1677801644u,138442752u,393216u}/* 1CF6 */, /*6178*/{0,520u,65537u,68780040u,940466184u,1610620960u,1077936140u,4208640u,262144u}/* 1CF7 */, /*6179*/{0,520u,2686977u,3424137222u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* 1CF8 */, /*6180*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719723412u,138442752u,393216u}/* 1D00 */, /*6181*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719723436u,138442752u,393216u}/* 1D01 */, /*6182*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719723444u,138442752u,393216u}/* 1D02 */, /*6183*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719723684u,138442752u,393216u}/* 1D03 */, /*6184*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719723820u,138442752u,393216u}/* 1D04 */, /*6185*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719723988u,138442752u,393216u}/* 1D05 */, /*6186*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719723996u,138442752u,393216u}/* 1D06 */, /*6187*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719724204u,138442752u,393216u}/* 1D07 */, /*6188*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719724508u,138442752u,393216u}/* 1D08 */, /*6189*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719725372u,138442752u,393216u}/* 1D09 */, /*6190*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719725532u,138442752u,393216u}/* 1D0A */, /*6191*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719725700u,138442752u,393216u}/* 1D0B */, /*6192*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719725884u,138442752u,393216u}/* 1D0C */, /*6193*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719726252u,138442752u,393216u}/* 1D0D */, /*6194*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719726412u,138442752u,393216u}/* 1D0E */, /*6195*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719726660u,138442752u,393216u}/* 1D0F */, /*6196*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719726812u,138442752u,393216u}/* 1D10 */, /*6197*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719726668u,138442752u,393216u}/* 1D11 */, /*6198*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719726820u,138442752u,393216u}/* 1D12 */, /*6199*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719726764u,138442752u,393216u}/* 1D13 */, /*6200*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719726716u,138442752u,393216u}/* 1D14 */, /*6201*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719726996u,138442752u,393216u}/* 1D15 */, /*6202*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719726860u,138442752u,393216u}/* 1D16 */, /*6203*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719726868u,138442752u,393216u}/* 1D17 */, /*6204*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719727036u,138442752u,393216u}/* 1D18 */, /*6205*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719727404u,138442752u,393216u}/* 1D19 */, /*6206*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719727484u,138442752u,393216u}/* 1D1A */, /*6207*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719728132u,138442752u,393216u}/* 1D1B */, /*6208*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719728388u,138442752u,393216u}/* 1D1C */, /*6209*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719728404u,138442752u,393216u}/* 1D1D */, /*6210*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719728412u,138442752u,393216u}/* 1D1E */, /*6211*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719728644u,138442752u,393216u}/* 1D1F */, /*6212*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719728756u,138442752u,393216u}/* 1D20 */, /*6213*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719728900u,138442752u,393216u}/* 1D21 */, /*6214*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719729252u,138442752u,393216u}/* 1D22 */, /*6215*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719729484u,138442752u,393216u}/* 1D23 */, /*6216*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719730060u,138442752u,393216u}/* 1D24 */, /*6217*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719730068u,138442752u,393216u}/* 1D25 */, /*6218*/{0,528u,196609u,76775426u,1499176u,3766485024u,1719730460u,138442752u,393216u}/* 1D26 */, /*6219*/{0,528u,196609u,76775426u,1499176u,3766485024u,1719730572u,138442752u,393216u}/* 1D27 */, /*6220*/{0,528u,196609u,76775426u,1499176u,3766485024u,1719730620u,138442752u,393216u}/* 1D28 */, /*6221*/{0,528u,196609u,76775426u,1499176u,3766485024u,1719730660u,138442752u,393216u}/* 1D29 */, /*6222*/{0,528u,196609u,76775426u,1499176u,3766485024u,1719730748u,138442752u,393216u}/* 1D2A */, /*6223*/{0,528u,262145u,76775426u,1499176u,3766485024u,1719732444u,138442752u,393216u}/* 1D2B */, /*6224*/{258998272u,528u,131073u,76775748u,1499168u,3783794720u,1686168948u,138661904u,393216u}/* 1D2C */, /*6225*/{259522560u,528u,131073u,76775748u,1499168u,3783794720u,1686228468u,1418178576u,393216u}/* 1D2D */, /*6226*/{260046848u,528u,131073u,76775748u,1499168u,3783794720u,1686169148u,138661904u,393216u}/* 1D2E */, /*6227*/{0,528u,131073u,76775428u,1499176u,3783270432u,1686169244u,138442768u,393216u}/* 1D2F */, /*6228*/{260571136u,528u,131073u,76775748u,1499168u,3783794720u,1686169524u,138661904u,393216u}/* 1D30 */, /*6229*/{261095424u,528u,131073u,76775748u,1499168u,3783794720u,1686169740u,138661904u,393216u}/* 1D31 */, /*6230*/{261619712u,528u,131073u,76775748u,1499168u,3783794720u,1686169852u,138661904u,393216u}/* 1D32 */, /*6231*/{262144000u,528u,131073u,76775748u,1499168u,3783794720u,1686170332u,138661904u,393216u}/* 1D33 */, /*6232*/{262668288u,528u,131073u,76775748u,1499168u,3783794720u,1686170620u,138661904u,393216u}/* 1D34 */, /*6233*/{263192576u,528u,131073u,76775748u,1499168u,3783794720u,1686170828u,138661904u,393216u}/* 1D35 */, /*6234*/{263716864u,528u,131073u,76775748u,1499168u,3783794720u,1686171036u,138661904u,393216u}/* 1D36 */, /*6235*/{264241152u,528u,131073u,76775748u,1499168u,3783794720u,1686171236u,138661904u,393216u}/* 1D37 */, /*6236*/{264765440u,528u,131073u,76775748u,1499168u,3783794720u,1686171380u,138661904u,393216u}/* 1D38 */, /*6237*/{265289728u,528u,131073u,76775748u,1499168u,3783794720u,1686171788u,138661904u,393216u}/* 1D39 */, /*6238*/{265814016u,528u,131073u,76775748u,1499168u,3783794720u,1686171908u,138661904u,393216u}/* 1D3A */, /*6239*/{0,528u,131073u,76775428u,1499176u,3783270432u,1686171972u,138442768u,393216u}/* 1D3B */, /*6240*/{266338304u,528u,131073u,76775748u,1499168u,3783794720u,1686172196u,138661904u,393216u}/* 1D3C */, /*6241*/{266862592u,528u,131073u,76775748u,1499168u,3783794720u,1686172532u,138661904u,393216u}/* 1D3D */, /*6242*/{267386880u,528u,131073u,76775748u,1499168u,3783794720u,1686172572u,138661904u,393216u}/* 1D3E */, /*6243*/{267911168u,528u,131073u,76775748u,1499168u,3783794720u,1686172884u,138661904u,393216u}/* 1D3F */, /*6244*/{268435456u,528u,131073u,76775748u,1499168u,3783794720u,1686173668u,138661904u,393216u}/* 1D40 */, /*6245*/{268959744u,528u,131073u,76775748u,1499168u,3783794720u,1686173924u,138661904u,393216u}/* 1D41 */, /*6246*/{269484032u,528u,131073u,76775748u,1499168u,3783794720u,1686174436u,138661904u,393216u}/* 1D42 */, /*6247*/{270008320u,528u,131073u,76775748u,1499168u,3783794720u,1686168948u,138588176u,393216u}/* 1D43 */, /*6248*/{270532608u,528u,131073u,76775748u,1499168u,3783794720u,1686169028u,138588176u,393216u}/* 1D44 */, /*6249*/{271056896u,528u,131073u,76775748u,1499168u,3783794720u,1686169060u,138588176u,393216u}/* 1D45 */, /*6250*/{271581184u,528u,131073u,76775748u,1499168u,3783794720u,1686169012u,138588176u,393216u}/* 1D46 */, /*6251*/{272105472u,528u,131073u,76775748u,1499168u,3783794720u,1686169148u,138588176u,393216u}/* 1D47 */, /*6252*/{272629760u,528u,131073u,76775748u,1499168u,3783794720u,1686169524u,138588176u,393216u}/* 1D48 */, /*6253*/{273154048u,528u,131073u,76775748u,1499168u,3783794720u,1686169740u,138588176u,393216u}/* 1D49 */, /*6254*/{273678336u,528u,131073u,76775748u,1499168u,3783794720u,1686169892u,138588176u,393216u}/* 1D4A */, /*6255*/{274202624u,528u,131073u,76775748u,1499168u,3783794720u,1686169932u,138588176u,393216u}/* 1D4B */, /*6256*/{274726912u,528u,131073u,76775748u,1499168u,3783794720u,1686170076u,138588176u,393216u}/* 1D4C */, /*6257*/{275251200u,528u,131073u,76775748u,1499168u,3783794720u,1686170332u,138588176u,393216u}/* 1D4D */, /*6258*/{0,528u,131073u,76775428u,1499176u,3783270432u,1686170940u,138590224u,393216u}/* 1D4E */, /*6259*/{275775488u,528u,131073u,76775748u,1499168u,3783794720u,1686171236u,138588176u,393216u}/* 1D4F */, /*6260*/{276299776u,528u,131073u,76775748u,1499168u,3783794720u,1686171788u,138588176u,393216u}/* 1D50 */, /*6261*/{276824064u,528u,131073u,76775748u,1499168u,3783794720u,1686172156u,138588176u,393216u}/* 1D51 */, /*6262*/{277348352u,528u,131073u,76775748u,1499168u,3783794720u,1686172196u,138588176u,393216u}/* 1D52 */, /*6263*/{277872640u,528u,131073u,76775748u,1499168u,3783794720u,1686172348u,138588176u,393216u}/* 1D53 */, /*6264*/{278396928u,528u,131073u,76775748u,1499168u,3783794720u,1686172428u,138588176u,393216u}/* 1D54 */, /*6265*/{278921216u,528u,131073u,76775748u,1499168u,3783794720u,1686172436u,138588176u,393216u}/* 1D55 */, /*6266*/{279445504u,528u,131073u,76775748u,1499168u,3783794720u,1686172572u,138588176u,393216u}/* 1D56 */, /*6267*/{279969792u,528u,131073u,76775748u,1499168u,3783794720u,1686173668u,138588176u,393216u}/* 1D57 */, /*6268*/{280494080u,528u,131073u,76775748u,1499168u,3783794720u,1686173924u,138588176u,393216u}/* 1D58 */, /*6269*/{281018368u,528u,131073u,76775748u,1499168u,3783794720u,1686173972u,138588176u,393216u}/* 1D59 */, /*6270*/{281542656u,528u,131073u,76775748u,1499168u,3783794720u,1686174172u,138588176u,393216u}/* 1D5A */, /*6271*/{282066944u,528u,131073u,76775748u,1499168u,3783794720u,1686174292u,138588176u,393216u}/* 1D5B */, /*6272*/{282591232u,528u,131073u,76775748u,1499168u,3783794720u,1686175636u,138588176u,393216u}/* 1D5C */, /*6273*/{283115520u,528u,196609u,76775748u,1499168u,3783794720u,1686176012u,138588176u,393216u}/* 1D5D */, /*6274*/{283639808u,528u,196609u,76775748u,1499168u,3783794720u,1686176020u,138588176u,393216u}/* 1D5E */, /*6275*/{284164096u,528u,196609u,76775748u,1499168u,3783794720u,1686176036u,138588176u,393216u}/* 1D5F */, /*6276*/{284688384u,528u,196609u,76775748u,1499168u,3783794720u,1686176292u,138588176u,393216u}/* 1D60 */, /*6277*/{285212672u,528u,196609u,76775748u,1499168u,3783794720u,1686176300u,138588176u,393216u}/* 1D61 */, /*6278*/{285736960u,528u,131073u,76775780u,1499168u,3783794720u,1686170828u,138596368u,17170432u}/* 1D62 */, /*6279*/{286261248u,528u,131073u,76775780u,1499168u,3783794720u,1686172884u,138596368u,393216u}/* 1D63 */, /*6280*/{286785536u,528u,131073u,76775780u,1499168u,3783794720u,1686173924u,138596368u,393216u}/* 1D64 */, /*6281*/{287309824u,528u,131073u,76775780u,1499168u,3783794720u,1686174292u,138596368u,393216u}/* 1D65 */, /*6282*/{287834112u,528u,196609u,76775780u,1499168u,3783794720u,1686176012u,138596368u,393216u}/* 1D66 */, /*6283*/{288358400u,528u,196609u,76775780u,1499168u,3783794720u,1686176020u,138596368u,393216u}/* 1D67 */, /*6284*/{288882688u,528u,196609u,76775780u,1499168u,3783794720u,1686176220u,138596368u,393216u}/* 1D68 */, /*6285*/{289406976u,528u,196609u,76775780u,1499168u,3783794720u,1686176292u,138596368u,393216u}/* 1D69 */, /*6286*/{289931264u,528u,196609u,76775780u,1499168u,3783794720u,1686176300u,138596368u,393216u}/* 1D6A */, /*6287*/{0,528u,131073u,76775426u,1499176u,3766485024u,1719728420u,138442752u,393216u}/* 1D6B */, /*6288*/{0,528u,131073u,76808194u,1499176u,3766485024u,1719723692u,138442752u,393216u}/* 1D6C */, /*6289*/{0,528u,131073u,76808194u,1499176u,3766485024u,1719724004u,138442752u,393216u}/* 1D6D */, /*6290*/{0,528u,131073u,76808194u,1499176u,3766485024u,1719724700u,138442752u,393216u}/* 1D6E */, /*6291*/{0,528u,131073u,76808194u,1499176u,3766485024u,1719726260u,138442752u,393216u}/* 1D6F */, /*6292*/{0,528u,131073u,76808194u,1499176u,3766485024u,1719726420u,138442752u,393216u}/* 1D70 */, /*6293*/{0,528u,131073u,76808194u,1499176u,3766485024u,1719727060u,138442752u,393216u}/* 1D71 */, /*6294*/{0,528u,131073u,76808194u,1499176u,3766485024u,1719727444u,138442752u,393216u}/* 1D72 */, /*6295*/{0,528u,131073u,76808194u,1499176u,3766485024u,1719727676u,138442752u,393216u}/* 1D73 */, /*6296*/{0,528u,131073u,76808194u,1499176u,3766485024u,1719727852u,138442752u,393216u}/* 1D74 */, /*6297*/{0,528u,131073u,76808194u,1499176u,3766485024u,1719728180u,138442752u,393216u}/* 1D75 */, /*6298*/{0,528u,131073u,76808194u,1499176u,3766485024u,1719729292u,138442752u,393216u}/* 1D76 */, /*6299*/{0,528u,131073u,76808194u,1499176u,3766485024u,1719724972u,138442752u,393216u}/* 1D77 */, /*6300*/{290455552u,528u,262145u,76808516u,1499168u,3783786528u,1686178204u,138588176u,393216u}/* 1D78 */, /*6301*/{140928u,528u,131073u,76808194u,1499176u,3768975392u,1719724764u,1287731200u,393216u}/* 1D79 */, /*6302*/{0,528u,131073u,76808194u,1499176u,3766485024u,1719788500u,1417787392u,393216u}/* 1D7A */, /*6303*/{0,528u,131073u,76808194u,1499176u,3766485024u,1719725412u,138442752u,393216u}/* 1D7B */, /*6304*/{0,528u,131073u,76808194u,1499176u,3766485024u,1719725460u,138442752u,393216u}/* 1D7C */, /*6305*/{141056u,528u,131073u,76808194u,1499176u,3768975392u,1719727044u,138442752u,393216u}/* 1D7D */, /*6306*/{0,528u,131073u,76808194u,1499176u,3766485024u,1719728484u,138442752u,393216u}/* 1D7E */, /*6307*/{0,528u,131073u,76808194u,1499176u,3766485024u,1719728716u,138442752u,393216u}/* 1D7F */, /*6308*/{0,536u,131073u,76808194u,1499176u,3766485024u,1719723708u,138442752u,393216u}/* 1D80 */, /*6309*/{0,536u,131073u,76808194u,1499176u,3766485024u,1719724012u,138442752u,393216u}/* 1D81 */, /*6310*/{0,536u,131073u,76808194u,1499176u,3766485024u,1719724708u,138442752u,393216u}/* 1D82 */, /*6311*/{0,536u,131073u,76808194u,1499176u,3766485024u,1719724900u,138442752u,393216u}/* 1D83 */, /*6312*/{0,536u,131073u,76808194u,1499176u,3766485024u,1719725708u,138442752u,393216u}/* 1D84 */, /*6313*/{0,536u,131073u,76808194u,1499176u,3766485024u,1719726028u,138442752u,393216u}/* 1D85 */, /*6314*/{0,536u,131073u,76808194u,1499176u,3766485024u,1719726268u,138442752u,393216u}/* 1D86 */, /*6315*/{0,536u,131073u,76808194u,1499176u,3766485024u,1719726500u,138442752u,393216u}/* 1D87 */, /*6316*/{0,536u,131073u,76808194u,1499176u,3766485024u,1719727068u,138442752u,393216u}/* 1D88 */, /*6317*/{0,536u,131073u,76808194u,1499176u,3766485024u,1719727524u,138442752u,393216u}/* 1D89 */, /*6318*/{0,536u,131073u,76808194u,1499176u,3766485024u,1719727860u,138442752u,393216u}/* 1D8A */, /*6319*/{0,536u,131073u,76808194u,1499176u,3766485024u,1719727988u,138442752u,393216u}/* 1D8B */, /*6320*/{0,536u,131073u,76808194u,1499176u,3766485024u,1719728772u,138442752u,393216u}/* 1D8C */, /*6321*/{0,536u,131073u,76808194u,1499176u,3766485024u,1719728980u,138442752u,393216u}/* 1D8D */, /*6322*/{0,536u,131073u,76808194u,1499176u,3766485024u,1719729300u,138442752u,393216u}/* 1D8E */, /*6323*/{0,536u,131073u,76808194u,1499176u,3766485024u,1719723428u,138442752u,393216u}/* 1D8F */, /*6324*/{0,536u,131073u,76808194u,1499176u,3766485024u,1719723532u,138442752u,393216u}/* 1D90 */, /*6325*/{0,536u,131073u,76808194u,1499176u,3766485024u,1719724084u,138442752u,393216u}/* 1D91 */, /*6326*/{0,536u,131073u,76808194u,1499176u,3766485024u,1719724260u,138442752u,393216u}/* 1D92 */, /*6327*/{0,536u,131073u,76808194u,1499176u,3766485024u,1719724396u,138442752u,393216u}/* 1D93 */, /*6328*/{0,536u,131073u,76808194u,1499176u,3766485024u,1719724500u,138442752u,393216u}/* 1D94 */, /*6329*/{0,536u,131073u,76808194u,1499176u,3766485024u,1719724356u,138442752u,393216u}/* 1D95 */, /*6330*/{0,536u,131073u,76808194u,1499176u,3766485024u,1719725420u,138442752u,17170432u}/* 1D96 */, /*6331*/{0,536u,131073u,76808194u,1499176u,3766485024u,1719726836u,138442752u,393216u}/* 1D97 */, /*6332*/{0,536u,131073u,76808194u,1499176u,3766485024u,1719728060u,138442752u,393216u}/* 1D98 */, /*6333*/{0,536u,131073u,76808194u,1499176u,3766485024u,1719728492u,138442752u,393216u}/* 1D99 */, /*6334*/{0,536u,131073u,76808194u,1499176u,3766485024u,1719729524u,138442752u,393216u}/* 1D9A */, /*6335*/{290979840u,536u,131073u,76808516u,1499168u,3783786528u,1686169108u,138588176u,393216u}/* 1D9B */, /*6336*/{291504128u,536u,131073u,76808516u,1499168u,3783786528u,1686169356u,138588176u,393216u}/* 1D9C */, /*6337*/{292028416u,536u,131073u,76808516u,1499168u,3783786528u,1686169476u,138588176u,393216u}/* 1D9D */, /*6338*/{292552704u,536u,131073u,76808516u,1499168u,3783786528u,1686169524u,1283797008u,393216u}/* 1D9E */, /*6339*/{293076992u,536u,131073u,76808516u,1499168u,3783786528u,1686170036u,138588176u,393216u}/* 1D9F */, /*6340*/{293601280u,536u,131073u,76808516u,1499168u,3783786528u,1686170212u,138588176u,393216u}/* 1DA0 */, /*6341*/{294125568u,536u,131073u,76808516u,1499168u,3783786528u,1686171172u,138588176u,393216u}/* 1DA1 */, /*6342*/{294649856u,536u,131073u,76808516u,1499168u,3783786528u,1686170364u,138588176u,393216u}/* 1DA2 */, /*6343*/{295174144u,536u,131073u,76808516u,1499168u,3783786528u,1686174076u,138588176u,393216u}/* 1DA3 */, /*6344*/{295698432u,536u,131073u,76808516u,1499168u,3783786528u,1686170948u,138588176u,17170432u}/* 1DA4 */, /*6345*/{296222720u,536u,131073u,76808516u,1499168u,3783786528u,1686170996u,138588176u,393216u}/* 1DA5 */, /*6346*/{296747008u,536u,131073u,76808516u,1499168u,3783786528u,1686170892u,138588176u,393216u}/* 1DA6 */, /*6347*/{297271296u,536u,131073u,76808516u,1499168u,3783786528u,1686170980u,138588176u,393216u}/* 1DA7 */, /*6348*/{297795584u,536u,131073u,76808516u,1499168u,3783786528u,1686171140u,138588176u,17170432u}/* 1DA8 */, /*6349*/{298319872u,536u,131073u,76808516u,1499168u,3783786528u,1686171604u,138588176u,393216u}/* 1DA9 */, /*6350*/{298844160u,536u,131073u,76808516u,1499168u,3783786528u,1686171596u,138588176u,393216u}/* 1DAA */, /*6351*/{299368448u,536u,131073u,76808516u,1499168u,3783786528u,1686171412u,138588176u,393216u}/* 1DAB */, /*6352*/{299892736u,536u,131073u,76808516u,1499168u,3783786528u,1686171844u,138588176u,393216u}/* 1DAC */, /*6353*/{300417024u,536u,131073u,76808516u,1499168u,3783786528u,1686174220u,138588176u,393216u}/* 1DAD */, /*6354*/{300941312u,536u,131073u,76808516u,1499168u,3783786528u,1686171996u,138588176u,393216u}/* 1DAE */, /*6355*/{301465600u,536u,131073u,76808516u,1499168u,3783786528u,1686172076u,138588176u,393216u}/* 1DAF */, /*6356*/{301989888u,536u,131073u,76808516u,1499168u,3783786528u,1686171940u,138588176u,393216u}/* 1DB0 */, /*6357*/{302514176u,536u,131073u,76808516u,1499168u,3783786528u,1686172452u,138588176u,393216u}/* 1DB1 */, /*6358*/{303038464u,536u,131073u,76808516u,1499168u,3783786528u,1686172700u,138588176u,393216u}/* 1DB2 */, /*6359*/{303562752u,536u,131073u,76808516u,1499168u,3783786528u,1686173436u,138588176u,393216u}/* 1DB3 */, /*6360*/{304087040u,536u,131073u,76808516u,1499168u,3783786528u,1686173516u,138588176u,393216u}/* 1DB4 */, /*6361*/{304611328u,536u,131073u,76808516u,1499168u,3783786528u,1686173756u,138588176u,393216u}/* 1DB5 */, /*6362*/{305135616u,536u,131073u,76808516u,1499168u,3783786528u,1686174012u,138588176u,393216u}/* 1DB6 */, /*6363*/{305659904u,536u,131073u,76808516u,1499168u,3783786528u,1686174252u,138588176u,393216u}/* 1DB7 */, /*6364*/{306184192u,536u,131073u,76808516u,1499168u,3783786528u,1686173956u,138588176u,393216u}/* 1DB8 */, /*6365*/{306708480u,536u,131073u,76808516u,1499168u,3783786528u,1686174348u,138588176u,393216u}/* 1DB9 */, /*6366*/{307232768u,536u,131073u,76808516u,1499168u,3783786528u,1686174404u,138588176u,393216u}/* 1DBA */, /*6367*/{307757056u,536u,131073u,76808516u,1499168u,3783786528u,1686174788u,138588176u,393216u}/* 1DBB */, /*6368*/{308281344u,536u,131073u,76808516u,1499168u,3783786528u,1686174908u,138588176u,393216u}/* 1DBC */, /*6369*/{308805632u,536u,131073u,76808516u,1499168u,3783786528u,1686174940u,138588176u,393216u}/* 1DBD */, /*6370*/{309329920u,536u,131073u,76808516u,1499168u,3783786528u,1686175020u,138588176u,393216u}/* 1DBE */, /*6371*/{309854208u,536u,196609u,76808516u,1499168u,3783786528u,1686176100u,138588176u,393216u}/* 1DBF */, /*6372*/{0,544u,2686977u,3423875078u,672030728u,1627389968u,1077936140u,218134528u,262144u}/* 1DC0 */, /*6373*/{0,544u,2686977u,3088330758u,672030728u,1627389968u,1077936140u,222328832u,262144u}/* 1DC2 */, /*6374*/{0,544u,2686977u,3423907846u,672030728u,1627398160u,1077936140u,218134528u,262144u}/* 1DC4 */, /*6375*/{0,544u,2686977u,3088363526u,672030728u,1627398160u,1077998804u,138459136u,262144u}/* 1DCA */, /*6376*/{0,544u,2686977u,3423940614u,672030728u,1627398160u,1077936140u,218134528u,262144u}/* 1DCB */, /*6377*/{0,544u,2686977u,3625267206u,672030728u,1627398160u,1077936140u,218134528u,262144u}/* 1DCD */, /*6378*/{0,544u,2686977u,2887069702u,672030728u,1627398160u,1077936140u,218134528u,262144u}/* 1DCE */, /*6379*/{0,544u,2686977u,3088396294u,672030728u,1627398160u,1077936140u,222328832u,262144u}/* 1DCF */, /*6380*/{0,544u,2686977u,2819960838u,672030728u,1627389968u,1077936140u,222328832u,262144u}/* 1DD0 */, /*6381*/{0,544u,2686977u,3423940614u,672030728u,1627389968u,1077936140u,218134528u,262144u}/* 1DD1 */, /*6382*/{0,544u,2686977u,3423940614u,672030728u,1627389968u,1078001212u,138459136u,262144u}/* 1DD2 */, /*6383*/{0,544u,2686977u,3423940614u,672030728u,1627389968u,1077994868u,1283536896u,262144u}/* 1DD3 */, /*6384*/{0,544u,2686977u,3423940614u,672030728u,1627389968u,1078054388u,1417787392u,262144u}/* 1DD4 */, /*6385*/{0,544u,2686977u,3423940614u,672030728u,1627389968u,1078056844u,272709632u,262144u}/* 1DD5 */, /*6386*/{0,544u,2686977u,3423940614u,672030728u,1627389968u,1078058940u,272709632u,262144u}/* 1DD6 */, /*6387*/{0,544u,2686977u,3423940614u,672030728u,1627389968u,1077995276u,339818496u,262144u}/* 1DD7 */, /*6388*/{0,544u,2686977u,3423940614u,672030728u,1627389968u,1077995444u,1287731200u,262144u}/* 1DD8 */, /*6389*/{0,544u,2686977u,3423940614u,672030728u,1627389968u,1077995444u,1283536896u,262144u}/* 1DD9 */, /*6390*/{0,544u,2686977u,3423940614u,672030728u,1627389968u,1077996252u,138459136u,262144u}/* 1DDA */, /*6391*/{0,544u,2686977u,3423940614u,672030728u,1627389968u,1077996324u,138459136u,262144u}/* 1DDB */, /*6392*/{0,544u,2686977u,3423940614u,672030728u,1627389968u,1077997156u,138459136u,262144u}/* 1DDC */, /*6393*/{0,544u,2686977u,3423940614u,672030728u,1627389968u,1077997300u,138459136u,262144u}/* 1DDD */, /*6394*/{0,544u,2686977u,3423940614u,672030728u,1627389968u,1077997332u,138459136u,262144u}/* 1DDE */, /*6395*/{0,544u,2686977u,3423940614u,672030728u,1627389968u,1077997740u,138459136u,262144u}/* 1DDF */, /*6396*/{0,544u,2686977u,3423940614u,672030728u,1627389968u,1077997828u,138459136u,262144u}/* 1DE0 */, /*6397*/{0,544u,2686977u,3423940614u,672030728u,1627389968u,1077997860u,138459136u,262144u}/* 1DE1 */, /*6398*/{0,544u,2686977u,3423940614u,672030728u,1627389968u,1077998844u,138459136u,262144u}/* 1DE2 */, /*6399*/{0,544u,2686977u,3423940614u,672030728u,1627389968u,1077998884u,138459136u,262144u}/* 1DE3 */, /*6400*/{0,544u,2686977u,3423940614u,672030728u,1627389968u,1077999300u,138459136u,262144u}/* 1DE4 */, /*6401*/{0,544u,2686977u,3423940614u,672030728u,1627389968u,1077999300u,1287731200u,262144u}/* 1DE5 */, /*6402*/{0,544u,2686977u,3423940614u,672030728u,1627389968u,1078000708u,138459136u,262144u}/* 1DE6 */, /*6403*/{0,544u,2686977u,3424137222u,672030728u,3774873616u,1077994980u,138459648u,262144u}/* 1DE7 */, /*6404*/{0,544u,2686977u,3424137222u,672030728u,3774873616u,1077995068u,138459648u,262144u}/* 1DE8 */, /*6405*/{0,544u,2686977u,3424137222u,672030728u,3774873616u,1077995268u,138459648u,262144u}/* 1DE9 */, /*6406*/{0,544u,2686977u,3424137222u,672030728u,3774873616u,1077995812u,138459648u,262144u}/* 1DEA */, /*6407*/{0,544u,2686977u,3424137222u,672030728u,3774873616u,1077996132u,138459648u,262144u}/* 1DEB */, /*6408*/{0,544u,2686977u,3424137222u,672030728u,3774873616u,1077997460u,138459648u,262144u}/* 1DEC */, /*6409*/{0,544u,2686977u,3424137222u,672030728u,3774873616u,1077998116u,356596224u,262144u}/* 1DED */, /*6410*/{0,544u,2686977u,3424137222u,672030728u,3774873616u,1077998492u,138459648u,262144u}/* 1DEE */, /*6411*/{0,544u,2686977u,3424137222u,672030728u,3774873616u,1077999436u,138459648u,262144u}/* 1DEF */, /*6412*/{0,544u,2686977u,3424137222u,672030728u,3774873616u,1077999844u,356596224u,262144u}/* 1DF0 */, /*6413*/{0,544u,2686977u,3424137222u,672030728u,3774873616u,1078000356u,138459648u,262144u}/* 1DF1 */, /*6414*/{0,544u,2686977u,3424137222u,672030728u,3774873616u,1077994868u,318847488u,262144u}/* 1DF2 */, /*6415*/{0,544u,2686977u,3424137222u,672030728u,3774873616u,1077998116u,318847488u,262144u}/* 1DF3 */, /*6416*/{0,544u,2686977u,3424137222u,672030728u,3774873616u,1077999844u,318847488u,262144u}/* 1DF4 */, /*6417*/{0,544u,2686977u,3424137222u,672030728u,1627398160u,1077936140u,218134528u,262144u}/* 1DF5 */, /*6418*/{0,544u,2686977u,3491344390u,672030728u,1627398160u,1077936140u,218134528u,262144u}/* 1DF6 */, /*6419*/{0,544u,2686977u,3357126662u,672030728u,1627398160u,1077936140u,218134528u,262144u}/* 1DF7 */, /*6420*/{0,544u,2686977u,3088691206u,672030728u,1627398160u,1077936140u,222328832u,262144u}/* 1DF9 */, /*6421*/{0,544u,2686977u,3424202758u,672030728u,1627389968u,1077936140u,218134528u,262144u}/* 1DFB */, /*6422*/{0,544u,2686977u,3558223878u,672030728u,1627389968u,1077936140u,222328832u,262144u}/* 1DFC */, /*6423*/{0,544u,2686977u,3088429062u,672030728u,1627398160u,1077936140u,222328832u,262144u}/* 1DFD */, /*6424*/{0,544u,2686977u,3088363526u,672030728u,1627398160u,1077936140u,222328832u,262144u}/* 1DFF */, /*6425*/{310519680u,1121976872u,131073u,76578849u,1507368u,3807903776u,1711334772u,423714816u,2490368u}/* 1E00 */, /*6426*/{311044096u,552u,131073u,76578850u,1499176u,3768975392u,1719723380u,423665664u,393216u}/* 1E01 */, /*6427*/{311568512u,1124074024u,131073u,76578849u,1507368u,3807903776u,1711334972u,331440128u,2490368u}/* 1E02 */, /*6428*/{312092928u,552u,131073u,76578850u,1499176u,3768975392u,1719723580u,331390976u,393216u}/* 1E03 */, /*6429*/{312617344u,1126171176u,131073u,76578849u,1507368u,3807903776u,1711334972u,415326208u,2490368u}/* 1E04 */, /*6430*/{313141760u,552u,131073u,76578850u,1499176u,3768975392u,1719723580u,415277056u,393216u}/* 1E05 */, /*6431*/{313666176u,1128268328u,131073u,76578849u,1507368u,3807903776u,1711334972u,444686336u,2490368u}/* 1E06 */, /*6432*/{314190592u,552u,131073u,76578850u,1499176u,3768975392u,1719723580u,444637184u,393216u}/* 1E07 */, /*6433*/{314715008u,1130365480u,131073u,76578849u,1507368u,3807903776u,1711335180u,490840064u,2490368u}/* 1E08 */, /*6434*/{315239424u,552u,131073u,76578850u,1499176u,3768975392u,1719723788u,490790912u,393216u}/* 1E09 */, /*6435*/{315763840u,1132462632u,131073u,76578849u,1507368u,3807903776u,1711335348u,331440128u,2490368u}/* 1E0A */, /*6436*/{316288256u,552u,131073u,76578850u,1499176u,3768975392u,1719723956u,331390976u,393216u}/* 1E0B */, /*6437*/{316812672u,1134559784u,131073u,76578849u,1507368u,3807903776u,1711335348u,415326208u,2490368u}/* 1E0C */, /*6438*/{317337088u,552u,131073u,76578850u,1499176u,3768975392u,1719723956u,415277056u,393216u}/* 1E0D */, /*6439*/{317861504u,1136656936u,131073u,76578849u,1507368u,3807903776u,1711335348u,444686336u,2490368u}/* 1E0E */, /*6440*/{318385920u,552u,131073u,76578850u,1499176u,3768975392u,1719723956u,444637184u,393216u}/* 1E0F */, /*6441*/{318910336u,1138754088u,131073u,76578849u,1507368u,3807903776u,1711335348u,339828736u,2490368u}/* 1E10 */, /*6442*/{319434752u,552u,131073u,76578850u,1499176u,3768975392u,1719723956u,339779584u,393216u}/* 1E11 */, /*6443*/{319959168u,1140851240u,131073u,76578849u,1507368u,3807903776u,1711335348u,432103424u,2490368u}/* 1E12 */, /*6444*/{320483584u,552u,131073u,76578850u,1499176u,3768975392u,1719723956u,432054272u,393216u}/* 1E13 */, /*6445*/{321008000u,1142948392u,131073u,76578849u,1507368u,3807903776u,1711335564u,503422976u,2490368u}/* 1E14 */, /*6446*/{321532416u,552u,131073u,76578850u,1499176u,3768975392u,1719724172u,503373824u,393216u}/* 1E15 */, /*6447*/{322056832u,1145045544u,131073u,76578849u,1507368u,3807903776u,1711335564u,499228672u,2490368u}/* 1E16 */, /*6448*/{322581248u,552u,131073u,76578850u,1499176u,3768975392u,1719724172u,499179520u,393216u}/* 1E17 */, /*6449*/{323105664u,1147142696u,131073u,76578849u,1507368u,3807903776u,1711335564u,432103424u,2490368u}/* 1E18 */, /*6450*/{323630080u,552u,131073u,76578850u,1499176u,3768975392u,1719724172u,432054272u,393216u}/* 1E19 */, /*6451*/{324154496u,1149239848u,131073u,76578849u,1507368u,3807903776u,1711335564u,440492032u,2490368u}/* 1E1A */, /*6452*/{324678912u,552u,131073u,76578850u,1499176u,3768975392u,1719724172u,440442880u,393216u}/* 1E1B */, /*6453*/{325203328u,1151337000u,131073u,76578849u,1507368u,3807903776u,1711335564u,499228672u,2490368u}/* 1E1C */, /*6454*/{325727744u,552u,131073u,76578850u,1499176u,3768975392u,1719724172u,499179520u,393216u}/* 1E1D */, /*6455*/{326252160u,1153434152u,131073u,76578849u,1507368u,3807903776u,1711336036u,331440128u,2490368u}/* 1E1E */, /*6456*/{326776576u,552u,131073u,76578850u,1499176u,3768975392u,1719724644u,331390976u,393216u}/* 1E1F */, /*6457*/{327300992u,1155531304u,131073u,76578849u,1507368u,3807903776u,1711336156u,348217344u,2490368u}/* 1E20 */, /*6458*/{327825408u,552u,131073u,76578850u,1499176u,3768975392u,1719724764u,348168192u,393216u}/* 1E21 */, /*6459*/{328349824u,1157628456u,131073u,76578849u,1507368u,3807903776u,1711336444u,331440128u,2490368u}/* 1E22 */, /*6460*/{328874240u,552u,131073u,76578850u,1499176u,3768975392u,1719725052u,331390976u,393216u}/* 1E23 */, /*6461*/{329398656u,1159725608u,131073u,76578849u,1507368u,3807903776u,1711336444u,415326208u,2490368u}/* 1E24 */, /*6462*/{329923072u,552u,131073u,76578850u,1499176u,3768975392u,1719725052u,415277056u,393216u}/* 1E25 */, /*6463*/{330447488u,1161822760u,131073u,76578849u,1507368u,3807903776u,1711336444u,318857216u,2490368u}/* 1E26 */, /*6464*/{330971904u,552u,131073u,76578850u,1499176u,3768975392u,1719725052u,318808064u,393216u}/* 1E27 */, /*6465*/{331496320u,1163919912u,131073u,76578849u,1507368u,3807903776u,1711336444u,339828736u,2490368u}/* 1E28 */, /*6466*/{332020736u,552u,131073u,76578850u,1499176u,3768975392u,1719725052u,339779584u,393216u}/* 1E29 */, /*6467*/{332545152u,1166017064u,131073u,76578849u,1507368u,3807903776u,1711336444u,436297728u,2490368u}/* 1E2A */, /*6468*/{333069568u,552u,131073u,76578850u,1499176u,3768975392u,1719725052u,436248576u,393216u}/* 1E2B */, /*6469*/{333593984u,1168114216u,131073u,76578849u,1507368u,3807903776u,1711336652u,440492032u,2490368u}/* 1E2C */, /*6470*/{334118400u,552u,131073u,76578850u,1499176u,3768975392u,1719725260u,440442880u,17170432u}/* 1E2D */, /*6471*/{334642816u,1170211368u,131073u,76578849u,1507368u,3807903776u,1711336652u,469868544u,2490368u}/* 1E2E */, /*6472*/{335167232u,552u,131073u,76578850u,1499176u,3768975392u,1719725260u,469819392u,393216u}/* 1E2F */, /*6473*/{335691648u,1172308520u,131073u,76578849u,1507368u,3807903776u,1711337060u,289497088u,2490368u}/* 1E30 */, /*6474*/{336216064u,552u,131073u,76578850u,1499176u,3768975392u,1719725668u,289447936u,393216u}/* 1E31 */, /*6475*/{336740480u,1174405672u,131073u,76578849u,1507368u,3807903776u,1711337060u,415326208u,2490368u}/* 1E32 */, /*6476*/{337264896u,552u,131073u,76578850u,1499176u,3768975392u,1719725668u,415277056u,393216u}/* 1E33 */, /*6477*/{337789312u,1176502824u,131073u,76578849u,1507368u,3807903776u,1711337060u,444686336u,2490368u}/* 1E34 */, /*6478*/{338313728u,552u,131073u,76578850u,1499176u,3768975392u,1719725668u,444637184u,393216u}/* 1E35 */, /*6479*/{338838144u,1178599976u,131073u,76578849u,1507368u,3807903776u,1711337204u,415326208u,2490368u}/* 1E36 */, /*6480*/{339362560u,552u,131073u,76578850u,1499176u,3768975392u,1719725812u,415277056u,393216u}/* 1E37 */, /*6481*/{339886976u,1180697128u,131073u,76578849u,1507368u,3807903776u,1711337204u,625057792u,2490368u}/* 1E38 */, /*6482*/{340411392u,552u,131073u,76578850u,1499176u,3768975392u,1719725812u,625008640u,393216u}/* 1E39 */, /*6483*/{340935808u,1182794280u,131073u,76578849u,1507368u,3807903776u,1711337204u,444686336u,2490368u}/* 1E3A */, /*6484*/{341460224u,552u,131073u,76578850u,1499176u,3768975392u,1719725812u,444637184u,393216u}/* 1E3B */, /*6485*/{341984640u,1184891432u,131073u,76578849u,1507368u,3807903776u,1711337204u,432103424u,2490368u}/* 1E3C */, /*6486*/{342509056u,552u,131073u,76578850u,1499176u,3768975392u,1719725812u,432054272u,393216u}/* 1E3D */, /*6487*/{343033472u,1186988584u,131073u,76578849u,1507368u,3807903776u,1711337612u,289497088u,2490368u}/* 1E3E */, /*6488*/{343557888u,552u,131073u,76578850u,1499176u,3768975392u,1719726220u,289447936u,393216u}/* 1E3F */, /*6489*/{344082304u,1189085736u,131073u,76578849u,1507368u,3807903776u,1711337612u,331440128u,2490368u}/* 1E40 */, /*6490*/{344606720u,552u,131073u,76578850u,1499176u,3768975392u,1719726220u,331390976u,393216u}/* 1E41 */, /*6491*/{345131136u,1191182888u,131073u,76578849u,1507368u,3807903776u,1711337612u,415326208u,2490368u}/* 1E42 */, /*6492*/{345655552u,552u,131073u,76578850u,1499176u,3768975392u,1719726220u,415277056u,393216u}/* 1E43 */, /*6493*/{346179968u,1193280040u,131073u,76578849u,1507368u,3807903776u,1711337732u,331440128u,2490368u}/* 1E44 */, /*6494*/{346704384u,552u,131073u,76578850u,1499176u,3768975392u,1719726340u,331390976u,393216u}/* 1E45 */, /*6495*/{347228800u,1195377192u,131073u,76578849u,1507368u,3807903776u,1711337732u,415326208u,2490368u}/* 1E46 */, /*6496*/{347753216u,552u,131073u,76578850u,1499176u,3768975392u,1719726340u,415277056u,393216u}/* 1E47 */, /*6497*/{348277632u,1197474344u,131073u,76578849u,1507368u,3807903776u,1711337732u,444686336u,2490368u}/* 1E48 */, /*6498*/{348802048u,552u,131073u,76578850u,1499176u,3768975392u,1719726340u,444637184u,393216u}/* 1E49 */, /*6499*/{349326464u,1199571496u,131073u,76578849u,1507368u,3807903776u,1711337732u,432103424u,2490368u}/* 1E4A */, /*6500*/{349850880u,552u,131073u,76578850u,1499176u,3768975392u,1719726340u,432054272u,393216u}/* 1E4B */, /*6501*/{350375296u,1201668648u,131073u,76578849u,1507368u,3807903776u,1711338020u,478257152u,2490368u}/* 1E4C */, /*6502*/{350899712u,552u,131073u,76578850u,1499176u,3768975392u,1719726628u,478208000u,393216u}/* 1E4D */, /*6503*/{351424128u,1203765800u,131073u,76578849u,1507368u,3807903776u,1711338020u,507617280u,2490368u}/* 1E4E */, /*6504*/{351948544u,552u,131073u,76578850u,1499176u,3768975392u,1719726628u,507568128u,393216u}/* 1E4F */, /*6505*/{352472960u,1205862952u,131073u,76578849u,1507368u,3807903776u,1711338020u,503422976u,2490368u}/* 1E50 */, /*6506*/{352997376u,552u,131073u,76578850u,1499176u,3768975392u,1719726628u,503373824u,393216u}/* 1E51 */, /*6507*/{353521792u,1207960104u,131073u,76578849u,1507368u,3807903776u,1711338020u,499228672u,2490368u}/* 1E52 */, /*6508*/{354046208u,552u,131073u,76578850u,1499176u,3768975392u,1719726628u,499179520u,393216u}/* 1E53 */, /*6509*/{354570624u,1210057256u,131073u,76578849u,1507368u,3807903776u,1711338396u,289497088u,2490368u}/* 1E54 */, /*6510*/{355095040u,552u,131073u,76578850u,1499176u,3768975392u,1719727004u,289447936u,393216u}/* 1E55 */, /*6511*/{355619456u,1212154408u,131073u,76578849u,1507368u,3807903776u,1711338396u,331440128u,2490368u}/* 1E56 */, /*6512*/{356143872u,552u,131073u,76578850u,1499176u,3768975392u,1719727004u,331390976u,393216u}/* 1E57 */, /*6513*/{356668288u,1214251560u,131073u,76578849u,1507368u,3807903776u,1711338708u,331440128u,2490368u}/* 1E58 */, /*6514*/{357192704u,552u,131073u,76578850u,1499176u,3768975392u,1719727316u,331390976u,393216u}/* 1E59 */, /*6515*/{357717120u,1216348712u,131073u,76578849u,1507368u,3807903776u,1711338708u,415326208u,2490368u}/* 1E5A */, /*6516*/{358241536u,552u,131073u,76578850u,1499176u,3768975392u,1719727316u,415277056u,393216u}/* 1E5B */, /*6517*/{358765952u,1218445864u,131073u,76578849u,1507368u,3807903776u,1711338708u,625057792u,2490368u}/* 1E5C */, /*6518*/{359290368u,552u,131073u,76578850u,1499176u,3768975392u,1719727316u,625008640u,393216u}/* 1E5D */, /*6519*/{359814784u,1220543016u,131073u,76578849u,1507368u,3807903776u,1711338708u,444686336u,2490368u}/* 1E5E */, /*6520*/{360339200u,552u,131073u,76578850u,1499176u,3768975392u,1719727316u,444637184u,393216u}/* 1E5F */, /*6521*/{360863616u,1222640168u,131073u,76578849u,1507368u,3807903776u,1711339204u,331440128u,2490368u}/* 1E60 */, /*6522*/{361388032u,552u,131073u,76578850u,1499176u,3768975392u,1719727812u,331390976u,393216u}/* 1E61 */, /*6523*/{361912448u,1224737320u,131073u,76578849u,1507368u,3807903776u,1711339204u,415326208u,2490368u}/* 1E62 */, /*6524*/{362436864u,552u,131073u,76578850u,1499176u,3768975392u,1719727812u,415277056u,393216u}/* 1E63 */, /*6525*/{362961280u,1226834472u,131073u,76578849u,1507368u,3807903776u,1711339204u,482451456u,2490368u}/* 1E64 */, /*6526*/{363485696u,552u,131073u,76578850u,1499176u,3768975392u,1719727812u,482402304u,393216u}/* 1E65 */, /*6527*/{364010112u,1228931624u,131073u,76578849u,1507368u,3807903776u,1711339204u,499228672u,2490368u}/* 1E66 */, /*6528*/{364534528u,552u,131073u,76578850u,1499176u,3768975392u,1719727812u,499179520u,393216u}/* 1E67 */, /*6529*/{365058944u,1231028776u,131073u,76578849u,1507368u,3807903776u,1711339204u,608280576u,2490368u}/* 1E68 */, /*6530*/{365583360u,552u,131073u,76578850u,1499176u,3768975392u,1719727812u,608231424u,393216u}/* 1E69 */, /*6531*/{366107776u,1233125928u,131073u,76578849u,1507368u,3807903776u,1711339492u,331440128u,2490368u}/* 1E6A */, /*6532*/{366632192u,552u,131073u,76578850u,1499176u,3768975392u,1719728100u,331390976u,393216u}/* 1E6B */, /*6533*/{367156608u,1235223080u,131073u,76578849u,1507368u,3807903776u,1711339492u,415326208u,2490368u}/* 1E6C */, /*6534*/{367681024u,552u,131073u,76578850u,1499176u,3768975392u,1719728100u,415277056u,393216u}/* 1E6D */, /*6535*/{368205440u,1237320232u,131073u,76578849u,1507368u,3807903776u,1711339492u,444686336u,2490368u}/* 1E6E */, /*6536*/{368729856u,552u,131073u,76578850u,1499176u,3768975392u,1719728100u,444637184u,393216u}/* 1E6F */, /*6537*/{369254272u,1239417384u,131073u,76578849u,1507368u,3807903776u,1711339492u,432103424u,2490368u}/* 1E70 */, /*6538*/{369778688u,552u,131073u,76578850u,1499176u,3768975392u,1719728100u,432054272u,393216u}/* 1E71 */, /*6539*/{370303104u,1241514536u,131073u,76578849u,1507368u,3807903776u,1711339748u,419520512u,2490368u}/* 1E72 */, /*6540*/{370827520u,552u,131073u,76578850u,1499176u,3768975392u,1719728356u,419471360u,393216u}/* 1E73 */, /*6541*/{371351936u,1243611688u,131073u,76578849u,1507368u,3807903776u,1711339748u,440492032u,2490368u}/* 1E74 */, /*6542*/{371876352u,552u,131073u,76578850u,1499176u,3768975392u,1719728356u,440442880u,393216u}/* 1E75 */, /*6543*/{372400768u,1245708840u,131073u,76578849u,1507368u,3807903776u,1711339748u,432103424u,2490368u}/* 1E76 */, /*6544*/{372925184u,552u,131073u,76578850u,1499176u,3768975392u,1719728356u,432054272u,393216u}/* 1E77 */, /*6545*/{373449600u,1247805992u,131073u,76578849u,1507368u,3807903776u,1711339748u,478257152u,2490368u}/* 1E78 */, /*6546*/{373974016u,552u,131073u,76578850u,1499176u,3768975392u,1719728356u,478208000u,393216u}/* 1E79 */, /*6547*/{374498432u,1249903144u,131073u,76578849u,1507368u,3807903776u,1711339748u,528588800u,2490368u}/* 1E7A */, /*6548*/{375022848u,552u,131073u,76578850u,1499176u,3768975392u,1719728356u,528539648u,393216u}/* 1E7B */, /*6549*/{375547264u,1252000296u,131073u,76578849u,1507368u,3807903776u,1711340116u,327245824u,2490368u}/* 1E7C */, /*6550*/{376071680u,552u,131073u,76578850u,1499176u,3768975392u,1719728724u,327196672u,393216u}/* 1E7D */, /*6551*/{376596096u,1254097448u,131073u,76578849u,1507368u,3807903776u,1711340116u,415326208u,2490368u}/* 1E7E */, /*6552*/{377120512u,552u,131073u,76578850u,1499176u,3768975392u,1719728724u,415277056u,393216u}/* 1E7F */, /*6553*/{377644928u,1256194600u,131073u,76578849u,1507368u,3807903776u,1711340260u,293691392u,2490368u}/* 1E80 */, /*6554*/{378169344u,552u,131073u,76578850u,1499176u,3768975392u,1719728868u,293642240u,393216u}/* 1E81 */, /*6555*/{378693760u,1258291752u,131073u,76578849u,1507368u,3807903776u,1711340260u,289497088u,2490368u}/* 1E82 */, /*6556*/{379218176u,552u,131073u,76578850u,1499176u,3768975392u,1719728868u,289447936u,393216u}/* 1E83 */, /*6557*/{379742592u,1260388904u,131073u,76578849u,1507368u,3807903776u,1711340260u,318857216u,2490368u}/* 1E84 */, /*6558*/{380267008u,552u,131073u,76578850u,1499176u,3768975392u,1719728868u,318808064u,393216u}/* 1E85 */, /*6559*/{380791424u,1262486056u,131073u,76578849u,1507368u,3807903776u,1711340260u,331440128u,2490368u}/* 1E86 */, /*6560*/{381315840u,552u,131073u,76578850u,1499176u,3768975392u,1719728868u,331390976u,393216u}/* 1E87 */, /*6561*/{381840256u,1264583208u,131073u,76578849u,1507368u,3807903776u,1711340260u,415326208u,2490368u}/* 1E88 */, /*6562*/{382364672u,552u,131073u,76578850u,1499176u,3768975392u,1719728868u,415277056u,393216u}/* 1E89 */, /*6563*/{382889088u,1266680360u,131073u,76578849u,1507368u,3807903776u,1711340340u,331440128u,2490368u}/* 1E8A */, /*6564*/{383413504u,552u,131073u,76578850u,1499176u,3768975392u,1719728948u,331390976u,393216u}/* 1E8B */, /*6565*/{383937920u,1268777512u,131073u,76578849u,1507368u,3807903776u,1711340340u,318857216u,2490368u}/* 1E8C */, /*6566*/{384462336u,552u,131073u,76578850u,1499176u,3768975392u,1719728948u,318808064u,393216u}/* 1E8D */, /*6567*/{384986752u,1270874664u,131073u,76578849u,1507368u,3807903776u,1711340436u,331440128u,2490368u}/* 1E8E */, /*6568*/{385511168u,552u,131073u,76578850u,1499176u,3768975392u,1719729044u,331390976u,393216u}/* 1E8F */, /*6569*/{386035584u,1272971816u,131073u,76578849u,1507368u,3807903776u,1711340612u,302080000u,2490368u}/* 1E90 */, /*6570*/{386560000u,552u,131073u,76578850u,1499176u,3768975392u,1719729220u,302030848u,393216u}/* 1E91 */, /*6571*/{387084416u,1275068968u,131073u,76578849u,1507368u,3807903776u,1711340612u,415326208u,2490368u}/* 1E92 */, /*6572*/{387608832u,552u,131073u,76578850u,1499176u,3768975392u,1719729220u,415277056u,393216u}/* 1E93 */, /*6573*/{388133248u,1277166120u,131073u,76578849u,1507368u,3807903776u,1711340612u,444686336u,2490368u}/* 1E94 */, /*6574*/{388657664u,552u,131073u,76578850u,1499176u,3768975392u,1719729220u,444637184u,393216u}/* 1E95 */, /*6575*/{389021696u,16777768u,131153u,76578850u,1499176u,3768975392u,1719725052u,444637184u,393216u}/* 1E96 */, /*6576*/{389545984u,18874920u,131157u,76578850u,1499176u,3768975392u,1719728100u,318808064u,393216u}/* 1E97 */, /*6577*/{390070272u,20972072u,131161u,76578850u,1499176u,3768975392u,1719728868u,310419456u,393216u}/* 1E98 */, /*6578*/{390594560u,23069224u,131165u,76578850u,1499176u,3768975392u,1719729044u,310419456u,393216u}/* 1E99 */, /*6579*/{391118848u,25166376u,131169u,76578882u,1499168u,3773693984u,1719788708u,272707584u,393216u}/* 1E9A */, /*6580*/{391803520u,1279263272u,131073u,76611618u,1499168u,3807248416u,1719727812u,1480679424u,393216u}/* 1E9B */, /*6581*/{0,552u,131073u,76873730u,1499176u,3766485024u,1719727932u,138442752u,393216u}/* 1E9C */, /*6582*/{0,552u,131073u,76873730u,1499176u,3766485024u,1719727940u,138442752u,393216u}/* 1E9D */, /*6583*/{160512u,27263528u,131073u,76873729u,1507368u,3774349344u,1711402364u,1417885696u,2490368u}/* 1E9E */, /*6584*/{0,552u,131073u,76873730u,1499176u,3766485024u,1719724164u,138442752u,393216u}/* 1E9F */, /*6585*/{392328064u,1281360424u,131073u,76578849u,1507368u,3807903776u,1711334772u,415326208u,2490368u}/* 1EA0 */, /*6586*/{392852480u,552u,131073u,76578850u,1499176u,3768975392u,1719723380u,415277056u,393216u}/* 1EA1 */, /*6587*/{393376896u,1283457576u,131073u,76578849u,1507368u,3807903776u,1711334772u,385966080u,2490368u}/* 1EA2 */, /*6588*/{393901312u,552u,131073u,76578850u,1499176u,3768975392u,1719723380u,385916928u,393216u}/* 1EA3 */, /*6589*/{394425728u,1285554728u,131073u,76578849u,1507368u,3807903776u,1711334772u,453091328u,2490368u}/* 1EA4 */, /*6590*/{394950144u,552u,131073u,76578850u,1499176u,3768975392u,1719723380u,453042176u,393216u}/* 1EA5 */, /*6591*/{395474560u,1287651880u,131073u,76578849u,1507368u,3807903776u,1711334772u,457285632u,2490368u}/* 1EA6 */, /*6592*/{395998976u,552u,131073u,76578850u,1499176u,3768975392u,1719723380u,457236480u,393216u}/* 1EA7 */, /*6593*/{396523392u,1289749032u,131073u,76578849u,1507368u,3807903776u,1711334772u,549560320u,2490368u}/* 1EA8 */, /*6594*/{397047808u,552u,131073u,76578850u,1499176u,3768975392u,1719723380u,549511168u,393216u}/* 1EA9 */, /*6595*/{397572224u,1291846184u,131073u,76578849u,1507368u,3807903776u,1711334772u,490840064u,2490368u}/* 1EAA */, /*6596*/{398096640u,552u,131073u,76578850u,1499176u,3768975392u,1719723380u,490790912u,393216u}/* 1EAB */, /*6597*/{398621056u,1293943336u,131073u,76578849u,1507368u,3807903776u,1711334772u,578920448u,2490368u}/* 1EAC */, /*6598*/{399145472u,552u,131073u,76578850u,1499176u,3768975392u,1719723380u,578871296u,393216u}/* 1EAD */, /*6599*/{399669888u,1296040488u,131073u,76578849u,1507368u,3807903776u,1711334772u,448897024u,2490368u}/* 1EAE */, /*6600*/{400194304u,552u,131073u,76578850u,1499176u,3768975392u,1719723380u,448847872u,393216u}/* 1EAF */, /*6601*/{400718720u,1298137640u,131073u,76578849u,1507368u,3807903776u,1711334772u,453091328u,2490368u}/* 1EB0 */, /*6602*/{401243136u,552u,131073u,76578850u,1499176u,3768975392u,1719723380u,453042176u,393216u}/* 1EB1 */, /*6603*/{401767552u,1300234792u,131073u,76578849u,1507368u,3807903776u,1711334772u,545366016u,2490368u}/* 1EB2 */, /*6604*/{402291968u,552u,131073u,76578850u,1499176u,3768975392u,1719723380u,545316864u,393216u}/* 1EB3 */, /*6605*/{402816384u,1302331944u,131073u,76578849u,1507368u,3807903776u,1711334772u,486645760u,2490368u}/* 1EB4 */, /*6606*/{403340800u,552u,131073u,76578850u,1499176u,3768975392u,1719723380u,486596608u,393216u}/* 1EB5 */, /*6607*/{403865216u,1304429096u,131073u,76578849u,1507368u,3807903776u,1711334772u,574726144u,2490368u}/* 1EB6 */, /*6608*/{404389632u,552u,131073u,76578850u,1499176u,3768975392u,1719723380u,574676992u,393216u}/* 1EB7 */, /*6609*/{404914048u,1306526248u,131073u,76578849u,1507368u,3807903776u,1711335564u,415326208u,2490368u}/* 1EB8 */, /*6610*/{405438464u,552u,131073u,76578850u,1499176u,3768975392u,1719724172u,415277056u,393216u}/* 1EB9 */, /*6611*/{405962880u,1308623400u,131073u,76578849u,1507368u,3807903776u,1711335564u,385966080u,2490368u}/* 1EBA */, /*6612*/{406487296u,552u,131073u,76578850u,1499176u,3768975392u,1719724172u,385916928u,393216u}/* 1EBB */, /*6613*/{407011712u,1310720552u,131073u,76578849u,1507368u,3807903776u,1711335564u,327245824u,2490368u}/* 1EBC */, /*6614*/{407536128u,552u,131073u,76578850u,1499176u,3768975392u,1719724172u,327196672u,393216u}/* 1EBD */, /*6615*/{408060544u,1312817704u,131073u,76578849u,1507368u,3807903776u,1711335564u,453091328u,2490368u}/* 1EBE */, /*6616*/{408584960u,552u,131073u,76578850u,1499176u,3768975392u,1719724172u,453042176u,393216u}/* 1EBF */, /*6617*/{409109376u,1314914856u,131073u,76578849u,1507368u,3807903776u,1711335564u,457285632u,2490368u}/* 1EC0 */, /*6618*/{409633792u,552u,131073u,76578850u,1499176u,3768975392u,1719724172u,457236480u,393216u}/* 1EC1 */, /*6619*/{410158208u,1317012008u,131073u,76578849u,1507368u,3807903776u,1711335564u,549560320u,2490368u}/* 1EC2 */, /*6620*/{410682624u,552u,131073u,76578850u,1499176u,3768975392u,1719724172u,549511168u,393216u}/* 1EC3 */, /*6621*/{411207040u,1319109160u,131073u,76578849u,1507368u,3807903776u,1711335564u,490840064u,2490368u}/* 1EC4 */, /*6622*/{411731456u,552u,131073u,76578850u,1499176u,3768975392u,1719724172u,490790912u,393216u}/* 1EC5 */, /*6623*/{412255872u,1321206312u,131073u,76578849u,1507368u,3807903776u,1711335564u,578920448u,2490368u}/* 1EC6 */, /*6624*/{412780288u,552u,131073u,76578850u,1499176u,3768975392u,1719724172u,578871296u,393216u}/* 1EC7 */, /*6625*/{413304704u,1323303464u,131073u,76578849u,1507368u,3807903776u,1711336652u,385966080u,2490368u}/* 1EC8 */, /*6626*/{413829120u,552u,131073u,76578850u,1499176u,3768975392u,1719725260u,385916928u,393216u}/* 1EC9 */, /*6627*/{414353536u,1325400616u,131073u,76578849u,1507368u,3807903776u,1711336652u,415326208u,2490368u}/* 1ECA */, /*6628*/{414877952u,552u,131073u,76578850u,1499176u,3768975392u,1719725260u,415277056u,17170432u}/* 1ECB */, /*6629*/{415402368u,1327497768u,131073u,76578849u,1507368u,3807903776u,1711338020u,415326208u,2490368u}/* 1ECC */, /*6630*/{415926784u,552u,131073u,76578850u,1499176u,3768975392u,1719726628u,415277056u,393216u}/* 1ECD */, /*6631*/{416451200u,1329594920u,131073u,76578849u,1507368u,3807903776u,1711338020u,385966080u,2490368u}/* 1ECE */, /*6632*/{416975616u,552u,131073u,76578850u,1499176u,3768975392u,1719726628u,385916928u,393216u}/* 1ECF */, /*6633*/{417500032u,1331692072u,131073u,76578849u,1507368u,3807903776u,1711338020u,453091328u,2490368u}/* 1ED0 */, /*6634*/{418024448u,552u,131073u,76578850u,1499176u,3768975392u,1719726628u,453042176u,393216u}/* 1ED1 */, /*6635*/{418548864u,1333789224u,131073u,76578849u,1507368u,3807903776u,1711338020u,457285632u,2490368u}/* 1ED2 */, /*6636*/{419073280u,552u,131073u,76578850u,1499176u,3768975392u,1719726628u,457236480u,393216u}/* 1ED3 */, /*6637*/{419597696u,1335886376u,131073u,76578849u,1507368u,3807903776u,1711338020u,549560320u,2490368u}/* 1ED4 */, /*6638*/{420122112u,552u,131073u,76578850u,1499176u,3768975392u,1719726628u,549511168u,393216u}/* 1ED5 */, /*6639*/{420646528u,1337983528u,131073u,76578849u,1507368u,3807903776u,1711338020u,490840064u,2490368u}/* 1ED6 */, /*6640*/{421170944u,552u,131073u,76578850u,1499176u,3768975392u,1719726628u,490790912u,393216u}/* 1ED7 */, /*6641*/{421695360u,1340080680u,131073u,76578849u,1507368u,3807903776u,1711338020u,578920448u,2490368u}/* 1ED8 */, /*6642*/{422219776u,552u,131073u,76578850u,1499176u,3768975392u,1719726628u,578871296u,393216u}/* 1ED9 */, /*6643*/{422744192u,1342177832u,131073u,76578849u,1507368u,3807903776u,1711338020u,553754624u,2490368u}/* 1EDA */, /*6644*/{423268608u,552u,131073u,76578850u,1499176u,3768975392u,1719726628u,553705472u,393216u}/* 1EDB */, /*6645*/{423793024u,1344274984u,131073u,76578849u,1507368u,3807903776u,1711338020u,557948928u,2490368u}/* 1EDC */, /*6646*/{424317440u,552u,131073u,76578850u,1499176u,3768975392u,1719726628u,557899776u,393216u}/* 1EDD */, /*6647*/{424841856u,1346372136u,131073u,76578849u,1507368u,3807903776u,1711338020u,650223616u,2490368u}/* 1EDE */, /*6648*/{425366272u,552u,131073u,76578850u,1499176u,3768975392u,1719726628u,650174464u,393216u}/* 1EDF */, /*6649*/{425890688u,1348469288u,131073u,76578849u,1507368u,3807903776u,1711338020u,591503360u,2490368u}/* 1EE0 */, /*6650*/{426415104u,552u,131073u,76578850u,1499176u,3768975392u,1719726628u,591454208u,393216u}/* 1EE1 */, /*6651*/{426939520u,1350566440u,131073u,76578849u,1507368u,3807903776u,1711338020u,679583744u,2490368u}/* 1EE2 */, /*6652*/{427463936u,552u,131073u,76578850u,1499176u,3768975392u,1719726628u,679534592u,393216u}/* 1EE3 */, /*6653*/{427988352u,1352663592u,131073u,76578849u,1507368u,3807903776u,1711339748u,415326208u,2490368u}/* 1EE4 */, /*6654*/{428512768u,552u,131073u,76578850u,1499176u,3768975392u,1719728356u,415277056u,393216u}/* 1EE5 */, /*6655*/{429037184u,1354760744u,131073u,76578849u,1507368u,3807903776u,1711339748u,385966080u,2490368u}/* 1EE6 */, /*6656*/{429561600u,552u,131073u,76578850u,1499176u,3768975392u,1719728356u,385916928u,393216u}/* 1EE7 */, /*6657*/{430086016u,1356857896u,131073u,76578849u,1507368u,3807903776u,1711339748u,553754624u,2490368u}/* 1EE8 */, /*6658*/{430610432u,552u,131073u,76578850u,1499176u,3768975392u,1719728356u,553705472u,393216u}/* 1EE9 */, /*6659*/{431134848u,1358955048u,131073u,76578849u,1507368u,3807903776u,1711339748u,557948928u,2490368u}/* 1EEA */, /*6660*/{431659264u,552u,131073u,76578850u,1499176u,3768975392u,1719728356u,557899776u,393216u}/* 1EEB */, /*6661*/{432183680u,1361052200u,131073u,76578849u,1507368u,3807903776u,1711339748u,650223616u,2490368u}/* 1EEC */, /*6662*/{432708096u,552u,131073u,76578850u,1499176u,3768975392u,1719728356u,650174464u,393216u}/* 1EED */, /*6663*/{433232512u,1363149352u,131073u,76578849u,1507368u,3807903776u,1711339748u,591503360u,2490368u}/* 1EEE */, /*6664*/{433756928u,552u,131073u,76578850u,1499176u,3768975392u,1719728356u,591454208u,393216u}/* 1EEF */, /*6665*/{434281344u,1365246504u,131073u,76578849u,1507368u,3807903776u,1711339748u,679583744u,2490368u}/* 1EF0 */, /*6666*/{434805760u,552u,131073u,76578850u,1499176u,3768975392u,1719728356u,679534592u,393216u}/* 1EF1 */, /*6667*/{435330176u,1367343656u,131073u,76578849u,1507368u,3807903776u,1711340436u,293691392u,2490368u}/* 1EF2 */, /*6668*/{435854592u,552u,131073u,76578850u,1499176u,3768975392u,1719729044u,293642240u,393216u}/* 1EF3 */, /*6669*/{436379008u,1369440808u,131073u,76578849u,1507368u,3807903776u,1711340436u,415326208u,2490368u}/* 1EF4 */, /*6670*/{436903424u,552u,131073u,76578850u,1499176u,3768975392u,1719729044u,415277056u,393216u}/* 1EF5 */, /*6671*/{437427840u,1371537960u,131073u,76578849u,1507368u,3807903776u,1711340436u,385966080u,2490368u}/* 1EF6 */, /*6672*/{437952256u,552u,131073u,76578850u,1499176u,3768975392u,1719729044u,385916928u,393216u}/* 1EF7 */, /*6673*/{438476672u,1373635112u,131073u,76578849u,1507368u,3807903776u,1711340436u,327245824u,2490368u}/* 1EF8 */, /*6674*/{439001088u,552u,131073u,76578850u,1499176u,3768975392u,1719729044u,327196672u,393216u}/* 1EF9 */, /*6675*/{172160u,1375732264u,131073u,76873729u,1507368u,3807903776u,1711398364u,272807936u,2490368u}/* 1EFA */, /*6676*/{172288u,552u,131073u,76873730u,1499176u,3768975392u,1719786972u,272709632u,393216u}/* 1EFB */, /*6677*/{172416u,1377829416u,131073u,76873729u,1507368u,3807903776u,1711340220u,138491904u,2490368u}/* 1EFC */, /*6678*/{172544u,552u,131073u,76873730u,1499176u,3768975392u,1719728828u,138442752u,393216u}/* 1EFD */, /*6679*/{172672u,1379926568u,131073u,76873729u,1507368u,3807903776u,1711340564u,138491904u,2490368u}/* 1EFE */, /*6680*/{172800u,552u,131073u,76873730u,1499176u,3768975392u,1719729172u,138442752u,393216u}/* 1EFF */, /*6681*/{439526272u,560u,196609u,76578850u,1499176u,3768975392u,1719730436u,281059328u,393216u}/* 1F00 */, /*6682*/{440050688u,560u,196609u,76578850u,1499176u,3768975392u,1719730436u,285253632u,393216u}/* 1F01 */, /*6683*/{440575104u,560u,196609u,76578850u,1499176u,3768975392u,1719730436u,436264960u,393216u}/* 1F02 */, /*6684*/{441099520u,560u,196609u,76578850u,1499176u,3768975392u,1719730436u,440459264u,393216u}/* 1F03 */, /*6685*/{441623936u,560u,196609u,76578850u,1499176u,3768975392u,1719730436u,432070656u,393216u}/* 1F04 */, /*6686*/{442148352u,560u,196609u,76578850u,1499176u,3768975392u,1719730436u,436264960u,393216u}/* 1F05 */, /*6687*/{442672768u,560u,196609u,76578850u,1499176u,3768975392u,1719730436u,457236480u,393216u}/* 1F06 */, /*6688*/{443197184u,560u,196609u,76578850u,1499176u,3768975392u,1719730436u,461430784u,393216u}/* 1F07 */, /*6689*/{443721600u,1382023728u,196609u,76578849u,1507368u,3807903776u,1711341828u,281108480u,2490368u}/* 1F08 */, /*6690*/{444246016u,1384120880u,196609u,76578849u,1507368u,3807903776u,1711341828u,285302784u,2490368u}/* 1F09 */, /*6691*/{444770432u,1386218032u,196609u,76578849u,1507368u,3807903776u,1711341828u,436314112u,2490368u}/* 1F0A */, /*6692*/{445294848u,1388315184u,196609u,76578849u,1507368u,3807903776u,1711341828u,440508416u,2490368u}/* 1F0B */, /*6693*/{445819264u,1390412336u,196609u,76578849u,1507368u,3807903776u,1711341828u,432119808u,2490368u}/* 1F0C */, /*6694*/{446343680u,1392509488u,196609u,76578849u,1507368u,3807903776u,1711341828u,436314112u,2490368u}/* 1F0D */, /*6695*/{446868096u,1394606640u,196609u,76578849u,1507368u,3807903776u,1711341828u,457285632u,2490368u}/* 1F0E */, /*6696*/{447392512u,1396703792u,196609u,76578849u,1507368u,3807903776u,1711341828u,461479936u,2490368u}/* 1F0F */, /*6697*/{447916928u,560u,196609u,76578850u,1499176u,3768975392u,1719730476u,281059328u,393216u}/* 1F10 */, /*6698*/{448441344u,560u,196609u,76578850u,1499176u,3768975392u,1719730476u,285253632u,393216u}/* 1F11 */, /*6699*/{448965760u,560u,196609u,76578850u,1499176u,3768975392u,1719730476u,436264960u,393216u}/* 1F12 */, /*6700*/{449490176u,560u,196609u,76578850u,1499176u,3768975392u,1719730476u,440459264u,393216u}/* 1F13 */, /*6701*/{450014592u,560u,196609u,76578850u,1499176u,3768975392u,1719730476u,432070656u,393216u}/* 1F14 */, /*6702*/{450539008u,560u,196609u,76578850u,1499176u,3768975392u,1719730476u,436264960u,393216u}/* 1F15 */, /*6703*/{451063424u,1398800944u,196609u,76578849u,1507368u,3807903776u,1711341868u,281108480u,2490368u}/* 1F18 */, /*6704*/{451587840u,1400898096u,196609u,76578849u,1507368u,3807903776u,1711341868u,285302784u,2490368u}/* 1F19 */, /*6705*/{452112256u,1402995248u,196609u,76578849u,1507368u,3807903776u,1711341868u,436314112u,2490368u}/* 1F1A */, /*6706*/{452636672u,1405092400u,196609u,76578849u,1507368u,3807903776u,1711341868u,440508416u,2490368u}/* 1F1B */, /*6707*/{453161088u,1407189552u,196609u,76578849u,1507368u,3807903776u,1711341868u,432119808u,2490368u}/* 1F1C */, /*6708*/{453685504u,1409286704u,196609u,76578849u,1507368u,3807903776u,1711341868u,436314112u,2490368u}/* 1F1D */, /*6709*/{454209920u,560u,196609u,76578850u,1499176u,3768975392u,1719730524u,281059328u,393216u}/* 1F20 */, /*6710*/{454734336u,560u,196609u,76578850u,1499176u,3768975392u,1719730524u,285253632u,393216u}/* 1F21 */, /*6711*/{455258752u,560u,196609u,76578850u,1499176u,3768975392u,1719730524u,436264960u,393216u}/* 1F22 */, /*6712*/{455783168u,560u,196609u,76578850u,1499176u,3768975392u,1719730524u,440459264u,393216u}/* 1F23 */, /*6713*/{456307584u,560u,196609u,76578850u,1499176u,3768975392u,1719730524u,432070656u,393216u}/* 1F24 */, /*6714*/{456832000u,560u,196609u,76578850u,1499176u,3768975392u,1719730524u,436264960u,393216u}/* 1F25 */, /*6715*/{457356416u,560u,196609u,76578850u,1499176u,3768975392u,1719730524u,457236480u,393216u}/* 1F26 */, /*6716*/{457880832u,560u,196609u,76578850u,1499176u,3768975392u,1719730524u,461430784u,393216u}/* 1F27 */, /*6717*/{458405248u,1411383856u,196609u,76578849u,1507368u,3807903776u,1711341916u,281108480u,2490368u}/* 1F28 */, /*6718*/{458929664u,1413481008u,196609u,76578849u,1507368u,3807903776u,1711341916u,285302784u,2490368u}/* 1F29 */, /*6719*/{459454080u,1415578160u,196609u,76578849u,1507368u,3807903776u,1711341916u,436314112u,2490368u}/* 1F2A */, /*6720*/{459978496u,1417675312u,196609u,76578849u,1507368u,3807903776u,1711341916u,440508416u,2490368u}/* 1F2B */, /*6721*/{460502912u,1419772464u,196609u,76578849u,1507368u,3807903776u,1711341916u,432119808u,2490368u}/* 1F2C */, /*6722*/{461027328u,1421869616u,196609u,76578849u,1507368u,3807903776u,1711341916u,436314112u,2490368u}/* 1F2D */, /*6723*/{461551744u,1423966768u,196609u,76578849u,1507368u,3807903776u,1711341916u,457285632u,2490368u}/* 1F2E */, /*6724*/{462076160u,1426063920u,196609u,76578849u,1507368u,3807903776u,1711341916u,461479936u,2490368u}/* 1F2F */, /*6725*/{462600576u,560u,196609u,76578850u,1499176u,3768975392u,1719730540u,281059328u,393216u}/* 1F30 */, /*6726*/{463124992u,560u,196609u,76578850u,1499176u,3768975392u,1719730540u,285253632u,393216u}/* 1F31 */, /*6727*/{463649408u,560u,196609u,76578850u,1499176u,3768975392u,1719730540u,436264960u,393216u}/* 1F32 */, /*6728*/{464173824u,560u,196609u,76578850u,1499176u,3768975392u,1719730540u,440459264u,393216u}/* 1F33 */, /*6729*/{464698240u,560u,196609u,76578850u,1499176u,3768975392u,1719730540u,432070656u,393216u}/* 1F34 */, /*6730*/{465222656u,560u,196609u,76578850u,1499176u,3768975392u,1719730540u,436264960u,393216u}/* 1F35 */, /*6731*/{465747072u,560u,196609u,76578850u,1499176u,3768975392u,1719730540u,457236480u,393216u}/* 1F36 */, /*6732*/{466271488u,560u,196609u,76578850u,1499176u,3768975392u,1719730540u,461430784u,393216u}/* 1F37 */, /*6733*/{466795904u,1428161072u,196609u,76578849u,1507368u,3807903776u,1711341932u,281108480u,2490368u}/* 1F38 */, /*6734*/{467320320u,1430258224u,196609u,76578849u,1507368u,3807903776u,1711341932u,285302784u,2490368u}/* 1F39 */, /*6735*/{467844736u,1432355376u,196609u,76578849u,1507368u,3807903776u,1711341932u,436314112u,2490368u}/* 1F3A */, /*6736*/{468369152u,1434452528u,196609u,76578849u,1507368u,3807903776u,1711341932u,440508416u,2490368u}/* 1F3B */, /*6737*/{468893568u,1436549680u,196609u,76578849u,1507368u,3807903776u,1711341932u,432119808u,2490368u}/* 1F3C */, /*6738*/{469417984u,1438646832u,196609u,76578849u,1507368u,3807903776u,1711341932u,436314112u,2490368u}/* 1F3D */, /*6739*/{469942400u,1440743984u,196609u,76578849u,1507368u,3807903776u,1711341932u,457285632u,2490368u}/* 1F3E */, /*6740*/{470466816u,1442841136u,196609u,76578849u,1507368u,3807903776u,1711341932u,461479936u,2490368u}/* 1F3F */, /*6741*/{470991232u,560u,196609u,76578850u,1499176u,3768975392u,1719730604u,281059328u,393216u}/* 1F40 */, /*6742*/{471515648u,560u,196609u,76578850u,1499176u,3768975392u,1719730604u,285253632u,393216u}/* 1F41 */, /*6743*/{472040064u,560u,196609u,76578850u,1499176u,3768975392u,1719730604u,436264960u,393216u}/* 1F42 */, /*6744*/{472564480u,560u,196609u,76578850u,1499176u,3768975392u,1719730604u,440459264u,393216u}/* 1F43 */, /*6745*/{473088896u,560u,196609u,76578850u,1499176u,3768975392u,1719730604u,432070656u,393216u}/* 1F44 */, /*6746*/{473613312u,560u,196609u,76578850u,1499176u,3768975392u,1719730604u,436264960u,393216u}/* 1F45 */, /*6747*/{474137728u,1444938288u,196609u,76578849u,1507368u,3807903776u,1711341996u,281108480u,2490368u}/* 1F48 */, /*6748*/{474662144u,1447035440u,196609u,76578849u,1507368u,3807903776u,1711341996u,285302784u,2490368u}/* 1F49 */, /*6749*/{475186560u,1449132592u,196609u,76578849u,1507368u,3807903776u,1711341996u,436314112u,2490368u}/* 1F4A */, /*6750*/{475710976u,1451229744u,196609u,76578849u,1507368u,3807903776u,1711341996u,440508416u,2490368u}/* 1F4B */, /*6751*/{476235392u,1453326896u,196609u,76578849u,1507368u,3807903776u,1711341996u,432119808u,2490368u}/* 1F4C */, /*6752*/{476759808u,1455424048u,196609u,76578849u,1507368u,3807903776u,1711341996u,436314112u,2490368u}/* 1F4D */, /*6753*/{477102080u,29360688u,196709u,76578850u,1499176u,3768975392u,1719730716u,281059328u,393216u}/* 1F50 */, /*6754*/{477808512u,560u,196609u,76578850u,1499176u,3768975392u,1719730716u,285253632u,393216u}/* 1F51 */, /*6755*/{478150656u,31457840u,196713u,76578850u,1499176u,3768975392u,1719730716u,436264960u,393216u}/* 1F52 */, /*6756*/{478857216u,560u,196609u,76578850u,1499176u,3768975392u,1719730716u,440459264u,393216u}/* 1F53 */, /*6757*/{479199232u,33554992u,196717u,76578850u,1499176u,3768975392u,1719730716u,432070656u,393216u}/* 1F54 */, /*6758*/{479905920u,560u,196609u,76578850u,1499176u,3768975392u,1719730716u,436264960u,393216u}/* 1F55 */, /*6759*/{480247808u,35652144u,196721u,76578850u,1499176u,3768975392u,1719730716u,457236480u,393216u}/* 1F56 */, /*6760*/{480954624u,560u,196609u,76578850u,1499176u,3768975392u,1719730716u,461430784u,393216u}/* 1F57 */, /*6761*/{481479040u,1457521200u,196609u,76578849u,1507368u,3807903776u,1711342108u,285302784u,2490368u}/* 1F59 */, /*6762*/{482003456u,1459618352u,196609u,76578849u,1507368u,3807903776u,1711342108u,440508416u,2490368u}/* 1F5B */, /*6763*/{482527872u,1461715504u,196609u,76578849u,1507368u,3807903776u,1711342108u,436314112u,2490368u}/* 1F5D */, /*6764*/{483052288u,1463812656u,196609u,76578849u,1507368u,3807903776u,1711342108u,461479936u,2490368u}/* 1F5F */, /*6765*/{483576704u,560u,196609u,76578850u,1499176u,3768975392u,1719730756u,281059328u,393216u}/* 1F60 */, /*6766*/{484101120u,560u,196609u,76578850u,1499176u,3768975392u,1719730756u,285253632u,393216u}/* 1F61 */, /*6767*/{484625536u,560u,196609u,76578850u,1499176u,3768975392u,1719730756u,436264960u,393216u}/* 1F62 */, /*6768*/{485149952u,560u,196609u,76578850u,1499176u,3768975392u,1719730756u,440459264u,393216u}/* 1F63 */, /*6769*/{485674368u,560u,196609u,76578850u,1499176u,3768975392u,1719730756u,432070656u,393216u}/* 1F64 */, /*6770*/{486198784u,560u,196609u,76578850u,1499176u,3768975392u,1719730756u,436264960u,393216u}/* 1F65 */, /*6771*/{486723200u,560u,196609u,76578850u,1499176u,3768975392u,1719730756u,457236480u,393216u}/* 1F66 */, /*6772*/{487247616u,560u,196609u,76578850u,1499176u,3768975392u,1719730756u,461430784u,393216u}/* 1F67 */, /*6773*/{487772032u,1465909808u,196609u,76578849u,1507368u,3807903776u,1711342148u,281108480u,2490368u}/* 1F68 */, /*6774*/{488296448u,1468006960u,196609u,76578849u,1507368u,3807903776u,1711342148u,285302784u,2490368u}/* 1F69 */, /*6775*/{488820864u,1470104112u,196609u,76578849u,1507368u,3807903776u,1711342148u,436314112u,2490368u}/* 1F6A */, /*6776*/{489345280u,1472201264u,196609u,76578849u,1507368u,3807903776u,1711342148u,440508416u,2490368u}/* 1F6B */, /*6777*/{489869696u,1474298416u,196609u,76578849u,1507368u,3807903776u,1711342148u,432119808u,2490368u}/* 1F6C */, /*6778*/{490394112u,1476395568u,196609u,76578849u,1507368u,3807903776u,1711342148u,436314112u,2490368u}/* 1F6D */, /*6779*/{490918528u,1478492720u,196609u,76578849u,1507368u,3807903776u,1711342148u,457285632u,2490368u}/* 1F6E */, /*6780*/{491442944u,1480589872u,196609u,76578849u,1507368u,3807903776u,1711342148u,461479936u,2490368u}/* 1F6F */, /*6781*/{491967360u,560u,196609u,76578850u,1499176u,3768975392u,1719730436u,293642240u,393216u}/* 1F70 */, /*6782*/{492491776u,560u,196608u,76578850u,1499136u,3769499744u,1719730436u,289447936u,393216u}/* 1F71 */, /*6783*/{493016192u,560u,196609u,76578850u,1499176u,3768975392u,1719730476u,293642240u,393216u}/* 1F72 */, /*6784*/{493540608u,560u,196608u,76578850u,1499136u,3769499744u,1719730476u,289447936u,393216u}/* 1F73 */, /*6785*/{494065024u,560u,196609u,76578850u,1499176u,3768975392u,1719730524u,293642240u,393216u}/* 1F74 */, /*6786*/{494589440u,560u,196608u,76578850u,1499136u,3769499744u,1719730524u,289447936u,393216u}/* 1F75 */, /*6787*/{495113856u,560u,196609u,76578850u,1499176u,3768975392u,1719730540u,293642240u,393216u}/* 1F76 */, /*6788*/{495638272u,560u,196608u,76578850u,1499136u,3769499744u,1719730540u,289447936u,393216u}/* 1F77 */, /*6789*/{496162688u,560u,196609u,76578850u,1499176u,3768975392u,1719730604u,293642240u,393216u}/* 1F78 */, /*6790*/{496687104u,560u,196608u,76578850u,1499136u,3769499744u,1719730604u,289447936u,393216u}/* 1F79 */, /*6791*/{497211520u,560u,196609u,76578850u,1499176u,3768975392u,1719730716u,293642240u,393216u}/* 1F7A */, /*6792*/{497735936u,560u,196608u,76578850u,1499136u,3769499744u,1719730716u,289447936u,393216u}/* 1F7B */, /*6793*/{498260352u,560u,196609u,76578850u,1499176u,3768975392u,1719730756u,293642240u,393216u}/* 1F7C */, /*6794*/{498784768u,560u,196608u,76578850u,1499136u,3769499744u,1719730756u,289447936u,393216u}/* 1F7D */, /*6795*/{499309184u,37749296u,196773u,76578850u,1499176u,3773693984u,1719730436u,599842816u,393216u}/* 1F80 */, /*6796*/{499833600u,39846448u,196777u,76578850u,1499176u,3773693984u,1719730436u,604037120u,393216u}/* 1F81 */, /*6797*/{500358016u,41943600u,196781u,76578850u,1499176u,3773693984u,1719730436u,755048448u,393216u}/* 1F82 */, /*6798*/{500882432u,44040752u,196785u,76578850u,1499176u,3773693984u,1719730436u,759242752u,393216u}/* 1F83 */, /*6799*/{501406848u,46137904u,196789u,76578850u,1499176u,3773693984u,1719730436u,750854144u,393216u}/* 1F84 */, /*6800*/{501931264u,48235056u,196793u,76578850u,1499176u,3773693984u,1719730436u,755048448u,393216u}/* 1F85 */, /*6801*/{502455680u,50332208u,196797u,76578850u,1499176u,3773693984u,1719730436u,776019968u,393216u}/* 1F86 */, /*6802*/{502980096u,52429360u,196801u,76578850u,1499176u,3773693984u,1719730436u,780214272u,393216u}/* 1F87 */, /*6803*/{503504512u,54526512u,196805u,76578851u,1507368u,3774480416u,1711341828u,599891968u,393216u}/* 1F88 */, /*6804*/{504028928u,56623664u,196809u,76578851u,1507368u,3774480416u,1711341828u,604086272u,393216u}/* 1F89 */, /*6805*/{504553344u,58720816u,196813u,76578851u,1507368u,3774480416u,1711341828u,755097600u,393216u}/* 1F8A */, /*6806*/{505077760u,60817968u,196817u,76578851u,1507368u,3774480416u,1711341828u,759291904u,393216u}/* 1F8B */, /*6807*/{505602176u,62915120u,196821u,76578851u,1507368u,3774480416u,1711341828u,750903296u,393216u}/* 1F8C */, /*6808*/{506126592u,65012272u,196825u,76578851u,1507368u,3774480416u,1711341828u,755097600u,393216u}/* 1F8D */, /*6809*/{506651008u,67109424u,196829u,76578851u,1507368u,3774480416u,1711341828u,776069120u,393216u}/* 1F8E */, /*6810*/{507175424u,69206576u,196833u,76578851u,1507368u,3774480416u,1711341828u,780263424u,393216u}/* 1F8F */, /*6811*/{507699840u,71303728u,196837u,76578850u,1499176u,3773693984u,1719730524u,599842816u,393216u}/* 1F90 */, /*6812*/{508224256u,73400880u,196841u,76578850u,1499176u,3773693984u,1719730524u,604037120u,393216u}/* 1F91 */, /*6813*/{508748672u,75498032u,196845u,76578850u,1499176u,3773693984u,1719730524u,755048448u,393216u}/* 1F92 */, /*6814*/{509273088u,77595184u,196849u,76578850u,1499176u,3773693984u,1719730524u,759242752u,393216u}/* 1F93 */, /*6815*/{509797504u,79692336u,196853u,76578850u,1499176u,3773693984u,1719730524u,750854144u,393216u}/* 1F94 */, /*6816*/{510321920u,81789488u,196857u,76578850u,1499176u,3773693984u,1719730524u,755048448u,393216u}/* 1F95 */, /*6817*/{510846336u,83886640u,196861u,76578850u,1499176u,3773693984u,1719730524u,776019968u,393216u}/* 1F96 */, /*6818*/{511370752u,85983792u,196865u,76578850u,1499176u,3773693984u,1719730524u,780214272u,393216u}/* 1F97 */, /*6819*/{511895168u,88080944u,196869u,76578851u,1507368u,3774480416u,1711341916u,599891968u,393216u}/* 1F98 */, /*6820*/{512419584u,90178096u,196873u,76578851u,1507368u,3774480416u,1711341916u,604086272u,393216u}/* 1F99 */, /*6821*/{512944000u,92275248u,196877u,76578851u,1507368u,3774480416u,1711341916u,755097600u,393216u}/* 1F9A */, /*6822*/{513468416u,94372400u,196881u,76578851u,1507368u,3774480416u,1711341916u,759291904u,393216u}/* 1F9B */, /*6823*/{513992832u,96469552u,196885u,76578851u,1507368u,3774480416u,1711341916u,750903296u,393216u}/* 1F9C */, /*6824*/{514517248u,98566704u,196889u,76578851u,1507368u,3774480416u,1711341916u,755097600u,393216u}/* 1F9D */, /*6825*/{515041664u,100663856u,196893u,76578851u,1507368u,3774480416u,1711341916u,776069120u,393216u}/* 1F9E */, /*6826*/{515566080u,102761008u,196897u,76578851u,1507368u,3774480416u,1711341916u,780263424u,393216u}/* 1F9F */, /*6827*/{516090496u,104858160u,196901u,76578850u,1499176u,3773693984u,1719730756u,599842816u,393216u}/* 1FA0 */, /*6828*/{516614912u,106955312u,196905u,76578850u,1499176u,3773693984u,1719730756u,604037120u,393216u}/* 1FA1 */, /*6829*/{517139328u,109052464u,196909u,76578850u,1499176u,3773693984u,1719730756u,755048448u,393216u}/* 1FA2 */, /*6830*/{517663744u,111149616u,196913u,76578850u,1499176u,3773693984u,1719730756u,759242752u,393216u}/* 1FA3 */, /*6831*/{518188160u,113246768u,196917u,76578850u,1499176u,3773693984u,1719730756u,750854144u,393216u}/* 1FA4 */, /*6832*/{518712576u,115343920u,196921u,76578850u,1499176u,3773693984u,1719730756u,755048448u,393216u}/* 1FA5 */, /*6833*/{519236992u,117441072u,196925u,76578850u,1499176u,3773693984u,1719730756u,776019968u,393216u}/* 1FA6 */, /*6834*/{519761408u,119538224u,196929u,76578850u,1499176u,3773693984u,1719730756u,780214272u,393216u}/* 1FA7 */, /*6835*/{520285824u,121635376u,196933u,76578851u,1507368u,3774480416u,1711342148u,599891968u,393216u}/* 1FA8 */, /*6836*/{520810240u,123732528u,196937u,76578851u,1507368u,3774480416u,1711342148u,604086272u,393216u}/* 1FA9 */, /*6837*/{521334656u,125829680u,196941u,76578851u,1507368u,3774480416u,1711342148u,755097600u,393216u}/* 1FAA */, /*6838*/{521859072u,127926832u,196945u,76578851u,1507368u,3774480416u,1711342148u,759291904u,393216u}/* 1FAB */, /*6839*/{522383488u,130023984u,196949u,76578851u,1507368u,3774480416u,1711342148u,750903296u,393216u}/* 1FAC */, /*6840*/{522907904u,132121136u,196953u,76578851u,1507368u,3774480416u,1711342148u,755097600u,393216u}/* 1FAD */, /*6841*/{523432320u,134218288u,196957u,76578851u,1507368u,3774480416u,1711342148u,776069120u,393216u}/* 1FAE */, /*6842*/{523956736u,136315440u,196961u,76578851u,1507368u,3774480416u,1711342148u,780263424u,393216u}/* 1FAF */, /*6843*/{524481152u,560u,196609u,76578850u,1499176u,3768975392u,1719730436u,297836544u,393216u}/* 1FB0 */, /*6844*/{525005568u,560u,196609u,76578850u,1499176u,3768975392u,1719730436u,348168192u,393216u}/* 1FB1 */, /*6845*/{525336576u,138412592u,196989u,76578850u,1499176u,3773693984u,1719730436u,612425728u,393216u}/* 1FB2 */, /*6846*/{526054272u,140509744u,196965u,76578850u,1499176u,3773693984u,1719730436u,457220096u,393216u}/* 1FB3 */, /*6847*/{526385152u,142606896u,196993u,76578850u,1499176u,3773693984u,1719730436u,608231424u,393216u}/* 1FB4 */, /*6848*/{526909440u,144704048u,196725u,76578850u,1499176u,3768975392u,1719730436u,314613760u,393216u}/* 1FB6 */, /*6849*/{527433728u,146801200u,197013u,76578850u,1499176u,3773693984u,1719730436u,633397248u,393216u}/* 1FB7 */, /*6850*/{528151552u,1482687024u,196609u,76578849u,1507368u,3807903776u,1711341828u,297885696u,2490368u}/* 1FB8 */, /*6851*/{528675968u,1484784176u,196609u,76578849u,1507368u,3807903776u,1711341828u,348217344u,2490368u}/* 1FB9 */, /*6852*/{529200384u,1486881328u,196609u,76578849u,1507368u,3807903776u,1711341828u,293691392u,2490368u}/* 1FBA */, /*6853*/{529724800u,1488978480u,196608u,76578849u,1507328u,3807903840u,1711341828u,289497088u,2490368u}/* 1FBB */, /*6854*/{530249216u,148898352u,196969u,76578851u,1507368u,3774480416u,1711341828u,457269248u,393216u}/* 1FBC */, /*6855*/{530579456u,560u,196609u,76589146u,32u,1627922464u,9516u,138440704u,67108864u}/* 1FBD */, /*6856*/{531297920u,1491075632u,196608u,76578850u,1499136u,3803054176u,1719730540u,138436608u,393216u}/* 1FBE */, /*6857*/{531628032u,560u,196609u,76589146u,32u,1627922464u,9516u,138440704u,67108864u}/* 1FBF */, /*6858*/{532152320u,560u,196609u,76589146u,32u,1627922464u,9532u,138440704u,67108864u}/* 1FC0 */, /*6859*/{532676608u,560u,196609u,76589114u,32u,1627922464u,9476u,314613760u,67108864u}/* 1FC1 */, /*6860*/{533200896u,150995504u,196997u,76578850u,1499176u,3773693984u,1719730524u,612425728u,393216u}/* 1FC2 */, /*6861*/{533919488u,153092656u,196973u,76578850u,1499176u,3773693984u,1719730524u,457220096u,393216u}/* 1FC3 */, /*6862*/{534249472u,155189808u,197001u,76578850u,1499176u,3773693984u,1719730524u,608231424u,393216u}/* 1FC4 */, /*6863*/{534773760u,157286960u,196729u,76578850u,1499176u,3768975392u,1719730524u,314613760u,393216u}/* 1FC6 */, /*6864*/{535298048u,159384112u,197017u,76578850u,1499176u,3773693984u,1719730524u,633397248u,393216u}/* 1FC7 */, /*6865*/{536016768u,1493172784u,196609u,76578849u,1507368u,3807903776u,1711341868u,293691392u,2490368u}/* 1FC8 */, /*6866*/{536541184u,1495269936u,196608u,76578849u,1507328u,3807903840u,1711341868u,289497088u,2490368u}/* 1FC9 */, /*6867*/{537065600u,1497367088u,196609u,76578849u,1507368u,3807903776u,1711341916u,293691392u,2490368u}/* 1FCA */, /*6868*/{537590016u,1499464240u,196608u,76578849u,1507328u,3807903840u,1711341916u,289497088u,2490368u}/* 1FCB */, /*6869*/{538114432u,161481264u,196977u,76578851u,1507368u,3774480416u,1711341916u,457269248u,393216u}/* 1FCC */, /*6870*/{538443776u,560u,196609u,76589114u,32u,1627922464u,9516u,293642240u,67108864u}/* 1FCD */, /*6871*/{538968064u,560u,196609u,76589114u,32u,1627922464u,9516u,289447936u,67108864u}/* 1FCE */, /*6872*/{539492352u,560u,196609u,76589114u,32u,1627922464u,9516u,314613760u,67108864u}/* 1FCF */, /*6873*/{540211712u,560u,196609u,76578850u,1499176u,3768975392u,1719730540u,297836544u,393216u}/* 1FD0 */, /*6874*/{540736128u,560u,196609u,76578850u,1499176u,3768975392u,1719730540u,348168192u,393216u}/* 1FD1 */, /*6875*/{541065216u,163578416u,196733u,76578850u,1499176u,3768975392u,1719730540u,474013696u,393216u}/* 1FD2 */, /*6876*/{541589504u,165675568u,196736u,76578850u,1499136u,3769499744u,1719730540u,469819392u,393216u}/* 1FD3 */, /*6877*/{542113792u,167772720u,196741u,76578850u,1499176u,3768975392u,1719730540u,314613760u,393216u}/* 1FD6 */, /*6878*/{542638080u,169869872u,196745u,76578850u,1499176u,3768975392u,1719730540u,494985216u,393216u}/* 1FD7 */, /*6879*/{543357696u,1501561392u,196609u,76578849u,1507368u,3807903776u,1711341932u,297885696u,2490368u}/* 1FD8 */, /*6880*/{543882112u,1503658544u,196609u,76578849u,1507368u,3807903776u,1711341932u,348217344u,2490368u}/* 1FD9 */, /*6881*/{544406528u,1505755696u,196609u,76578849u,1507368u,3807903776u,1711341932u,293691392u,2490368u}/* 1FDA */, /*6882*/{544930944u,1507852848u,196608u,76578849u,1507328u,3807903840u,1711341932u,289497088u,2490368u}/* 1FDB */, /*6883*/{545259520u,560u,196609u,76589114u,32u,1627922464u,9524u,293642240u,67108864u}/* 1FDD */, /*6884*/{545783808u,560u,196609u,76589114u,32u,1627922464u,9524u,289447936u,67108864u}/* 1FDE */, /*6885*/{546308096u,560u,196609u,76589114u,32u,1627922464u,9524u,314613760u,67108864u}/* 1FDF */, /*6886*/{547028224u,560u,196609u,76578850u,1499176u,3768975392u,1719730716u,297836544u,393216u}/* 1FE0 */, /*6887*/{547552640u,560u,196609u,76578850u,1499176u,3768975392u,1719730716u,348168192u,393216u}/* 1FE1 */, /*6888*/{547880960u,171967024u,196749u,76578850u,1499176u,3768975392u,1719730716u,474013696u,393216u}/* 1FE2 */, /*6889*/{548405248u,174064176u,196752u,76578850u,1499136u,3769499744u,1719730716u,469819392u,393216u}/* 1FE3 */, /*6890*/{548929536u,176161328u,196757u,76578850u,1499176u,3768975392u,1719730652u,281059328u,393216u}/* 1FE4 */, /*6891*/{549649920u,560u,196609u,76578850u,1499176u,3768975392u,1719730652u,285253632u,393216u}/* 1FE5 */, /*6892*/{549978112u,178258480u,196761u,76578850u,1499176u,3768975392u,1719730716u,314613760u,393216u}/* 1FE6 */, /*6893*/{550502400u,180355632u,196765u,76578850u,1499176u,3768975392u,1719730716u,494985216u,393216u}/* 1FE7 */, /*6894*/{551222912u,1509950000u,196609u,76578849u,1507368u,3807903776u,1711342108u,297885696u,2490368u}/* 1FE8 */, /*6895*/{551747328u,1512047152u,196609u,76578849u,1507368u,3807903776u,1711342108u,348217344u,2490368u}/* 1FE9 */, /*6896*/{552271744u,1514144304u,196609u,76578849u,1507368u,3807903776u,1711342108u,293691392u,2490368u}/* 1FEA */, /*6897*/{552796160u,1516241456u,196608u,76578849u,1507328u,3807903840u,1711342108u,289497088u,2490368u}/* 1FEB */, /*6898*/{553320576u,1518338608u,196609u,76578849u,1507368u,3807903776u,1711342044u,285302784u,2490368u}/* 1FEC */, /*6899*/{553648128u,560u,196609u,76589114u,32u,1627922464u,9476u,293642240u,67108864u}/* 1FED */, /*6900*/{554172416u,560u,196608u,76589114u,0u,1627922528u,9476u,289447936u,67108864u}/* 1FEE */, /*6901*/{554696704u,560u,196608u,76589114u,0u,1627922528u,9420u,138436608u,67108864u}/* 1FEF */, /*6902*/{555220992u,182452784u,197005u,76578850u,1499176u,3773693984u,1719730756u,612425728u,393216u}/* 1FF2 */, /*6903*/{555942144u,184549936u,196981u,76578850u,1499176u,3773693984u,1719730756u,457220096u,393216u}/* 1FF3 */, /*6904*/{556269568u,186647088u,197009u,76578850u,1499176u,3773693984u,1719730756u,608231424u,393216u}/* 1FF4 */, /*6905*/{556793856u,188744240u,196769u,76578850u,1499176u,3768975392u,1719730756u,314613760u,393216u}/* 1FF6 */, /*6906*/{557318144u,190841392u,197021u,76578850u,1499176u,3773693984u,1719730756u,633397248u,393216u}/* 1FF7 */, /*6907*/{558039424u,1520435760u,196609u,76578849u,1507368u,3807903776u,1711341996u,293691392u,2490368u}/* 1FF8 */, /*6908*/{558563840u,1522532912u,196608u,76578849u,1507328u,3807903840u,1711341996u,289497088u,2490368u}/* 1FF9 */, /*6909*/{559088256u,1524630064u,196609u,76578849u,1507368u,3807903776u,1711342148u,293691392u,2490368u}/* 1FFA */, /*6910*/{559612672u,1526727216u,196608u,76578849u,1507328u,3807903840u,1711342148u,289497088u,2490368u}/* 1FFB */, /*6911*/{560137088u,192938544u,196985u,76578851u,1507368u,3774480416u,1711342148u,457269248u,393216u}/* 1FFC */, /*6912*/{560463872u,560u,196608u,90220602u,0u,1627922528u,9428u,138436608u,67108864u}/* 1FFD */, /*6913*/{560988160u,560u,196609u,76589146u,32u,1627922464u,9524u,138440704u,67108864u}/* 1FFE */, /*6914*/{561512448u,568u,65536u,69248044u,49152u,1611137120u,4180u,138452992u,589824u}/* 2000 */, /*6915*/{562036736u,568u,65536u,69248044u,49152u,1611137120u,4180u,138452992u,589824u}/* 2001 */, /*6916*/{562561024u,568u,65537u,69248076u,49184u,1611137056u,4180u,138457088u,589824u}/* 2002 */, /*6917*/{563085312u,568u,65537u,69248076u,49184u,1611137056u,4180u,138457088u,589824u}/* 2003 */, /*6918*/{563609600u,568u,65537u,69248076u,49184u,1611137056u,4180u,138457088u,589824u}/* 2004 */, /*6919*/{564133888u,568u,65537u,69248076u,49184u,1611137056u,4180u,138457088u,589824u}/* 2005 */, /*6920*/{564658176u,568u,65537u,69248076u,49184u,1611137056u,4180u,138457088u,589824u}/* 2006 */, /*6921*/{565182464u,568u,65537u,88122508u,49184u,1611137056u,4180u,138645504u,589824u}/* 2007 */, /*6922*/{565706752u,568u,65537u,69248076u,49184u,1611137056u,4180u,138457088u,589824u}/* 2008 */, /*6923*/{566231040u,568u,65537u,69248076u,49184u,1611137056u,4180u,138457088u,589824u}/* 2009 */, /*6924*/{566755328u,568u,65537u,69248076u,49184u,1611137056u,4180u,138457088u,589824u}/* 200A */, /*6925*/{0,568u,65537u,97561616u,536911880u,1695055872u,12u,4208640u,0}/* 200B */, /*6926*/{0u,568u,2686977u,68201488u,672030728u,1695055888u,134217740u,4208768u,0}/* 200C */, /*6927*/{0u,568u,2686977u,98610192u,2015781256u,1695055872u,134217740u,4208640u,0}/* 200D */, /*6928*/{0,568u,65537u,68190224u,538091528u,1963491328u,12u,4208640u,2147483648u}/* 200E */, /*6929*/{0,568u,65537u,68191248u,538091528u,1963491328u,12u,4208640u,2147483648u}/* 200F */, /*6930*/{0,569u,65537u,69249043u,40u,1610678306u,4260u,138442755u,0}/* 2010 */, /*6931*/{567279616u,568u,65537u,88123539u,32u,1611202594u,4260u,138645507u,0}/* 2011 */, /*6932*/{0,568u,65537u,69249043u,40u,1610678304u,4268u,138442755u,0}/* 2012 */, /*6933*/{0,569u,65537u,69249043u,114728u,1610678304u,4276u,138442755u,0}/* 2013 */, /*6934*/{0,569u,65537u,99657747u,114728u,1610678304u,4284u,138442755u,0}/* 2014 */, /*6935*/{0,569u,65537u,89171987u,40u,1610678304u,4292u,138442755u,0}/* 2015 */, /*6936*/{0,569u,65537u,89171991u,40u,1610612768u,7214u,138442763u,0}/* 2016 */, /*6937*/{567803904u,568u,65537u,76589143u,32u,1611137056u,4204u,138440707u,0}/* 2017 */, /*6938*/{0,569u,65537u,75540508u,1941544u,1627389984u,6212u,138442755u,536870912u}/* 2018 */, /*6939*/{0,569u,65537u,75540509u,1941544u,1627389984u,6220u,138442755u,536870912u}/* 2019 */, /*6940*/{0,568u,65537u,79734804u,106536u,1610612768u,6228u,138442755u,536870912u}/* 201A */, /*6941*/{0,568u,65537u,75540508u,106536u,1610612768u,6236u,138442755u,536870912u}/* 201B */, /*6942*/{0,569u,65537u,75540508u,106536u,1610612768u,6268u,138442755u,536870912u}/* 201C */, /*6943*/{0,569u,65537u,75540509u,106536u,1610612768u,6276u,138442755u,536870912u}/* 201D */, /*6944*/{0,568u,65537u,79734804u,106536u,1610612768u,6284u,138442755u,536870912u}/* 201E */, /*6945*/{0,568u,65537u,75540508u,106536u,1610612768u,6292u,138442755u,536870912u}/* 201F */, /*6946*/{0,569u,65537u,89171991u,40u,1610612768u,7436u,138442755u,0}/* 2020 */, /*6947*/{0,569u,65537u,89171991u,40u,1610612768u,7444u,138442755u,0}/* 2021 */, /*6948*/{0,569u,65537u,76589079u,40u,1610612768u,7476u,138442755u,0}/* 2022 */, /*6949*/{0,568u,65537u,76589079u,40u,1610612768u,7484u,138442755u,0}/* 2023 */, /*6950*/{568328192u,569u,65537u,100706391u,1925152u,1627914272u,5068u,138457091u,0}/* 2024 */, /*6951*/{568852480u,569u,65537u,100706391u,32u,1611137056u,10124u,272707587u,0}/* 2025 */, /*6952*/{569376768u,569u,65537u,100706391u,32u,1611137056u,15180u,406958083u,0}/* 2026 */, /*6953*/{0,569u,65537u,69249047u,1572904u,1627389984u,7492u,138442755u,0}/* 2027 */, /*6954*/{0,568u,65537u,71345165u,537690120u,1610612736u,4164u,138442752u,2148073472u}/* 2028 */, /*6955*/{0,568u,65537u,71343118u,537690120u,1610612736u,4172u,138442752u,2148073472u}/* 2029 */, /*6956*/{0,568u,65537u,68206608u,538091528u,1963491328u,12u,4208640u,0}/* 202A */, /*6957*/{0,568u,65537u,68207632u,538091528u,1963491328u,12u,4208640u,0}/* 202B */, /*6958*/{0,568u,65537u,68208656u,538091528u,1963491328u,12u,4208640u,0}/* 202C */, /*6959*/{0,568u,65537u,68204560u,538091528u,1963491328u,12u,4208640u,0}/* 202D */, /*6960*/{0,568u,65537u,68205584u,538091528u,1963491328u,12u,4208640u,0}/* 202E */, /*6961*/{569901056u,568u,65537u,88217740u,2146336u,1611137056u,4180u,138645504u,589824u}/* 202F */, /*6962*/{0,569u,65537u,78680087u,40u,1610612768u,7404u,138442755u,0}/* 2030 */, /*6963*/{0,568u,65537u,78680087u,40u,1610612768u,7420u,138442755u,0}/* 2031 */, /*6964*/{0,569u,65537u,78680087u,40u,1610612768u,7526u,138442763u,0}/* 2032 */, /*6965*/{570425344u,569u,65537u,78680151u,32u,1611137056u,15038u,272707595u,0}/* 2033 */, /*6966*/{570949632u,568u,65537u,78680151u,32u,1611137056u,22550u,406958091u,0}/* 2034 */, /*6967*/{0,569u,65537u,78686231u,40u,1610612768u,7532u,138442755u,0}/* 2035 */, /*6968*/{571473920u,568u,65537u,78686295u,32u,1611137056u,15052u,272707587u,0}/* 2036 */, /*6969*/{571998208u,568u,65537u,78686295u,32u,1611137056u,22572u,406958083u,0}/* 2037 */, /*6970*/{0,568u,65537u,76589079u,40u,1610612768u,7556u,138442755u,0}/* 2038 */, /*6971*/{0,70200u,65537u,75540508u,106536u,1744830496u,6244u,138442755u,536870912u}/* 2039 */, /*6972*/{0,74296u,65537u,75540509u,106536u,1744830496u,6252u,138442755u,536870912u}/* 203A */, /*6973*/{0,569u,65537u,89171991u,40u,1610612768u,7564u,138442755u,0}/* 203B */, /*6974*/{572522496u,568u,65537u,96512087u,98304u,1611141152u,9756u,272707587u,41943040u}/* 203C */, /*6975*/{0,568u,65537u,96512023u,98344u,1610612768u,5052u,138442755u,41943040u}/* 203D */, /*6976*/{573046784u,569u,65537u,76589143u,32u,1611137056u,4188u,138440707u,0}/* 203E */, /*6977*/{0,568u,65537u,76589078u,2097192u,1610612768u,1073749396u,138442754u,262144u}/* 203F */, /*6978*/{0,568u,65537u,76589078u,2097192u,1610612768u,1073749414u,138442762u,262144u}/* 2040 */, /*6979*/{0,568u,65537u,76589079u,40u,1610612768u,7604u,138442755u,0}/* 2041 */, /*6980*/{0,568u,65537u,76589079u,40u,1610612768u,7612u,138442755u,0}/* 2042 */, /*6981*/{0,568u,65537u,76589079u,40u,1610612768u,7500u,138442755u,0}/* 2043 */, /*6982*/{0,568u,65537u,81827864u,1703976u,1610612768u,12782u,138442753u,67108864u}/* 2044 */, /*6983*/{0,78392u,65537u,79734804u,106536u,1744830496u,6444u,138442755u,0}/* 2045 */, /*6984*/{0,82488u,65537u,86026261u,106536u,1744830496u,6452u,138442755u,0}/* 2046 */, /*6985*/{573571072u,568u,65537u,96675927u,98336u,1611137056u,9852u,272707587u,41943040u}/* 2047 */, /*6986*/{574095360u,568u,65537u,96610391u,98336u,1611137056u,9804u,272707587u,41943040u}/* 2048 */, /*6987*/{574619648u,568u,65537u,96610391u,98304u,1611141152u,9804u,272707587u,41943040u}/* 2049 */, /*6988*/{0,568u,65537u,76687383u,40u,1610612768u,7372u,138442755u,0}/* 204A */, /*6989*/{0,568u,65537u,76687383u,40u,1610612768u,7284u,138442755u,0}/* 204B */, /*6990*/{0,568u,65537u,76687383u,40u,1610612768u,7508u,138442755u,0}/* 204C */, /*6991*/{0,568u,65537u,76687383u,40u,1610612768u,7516u,138442755u,0}/* 204D */, /*6992*/{0,568u,65537u,76752919u,40u,1610612768u,7316u,138442755u,0}/* 204E */, /*6993*/{0,568u,65537u,76752919u,40u,1610612768u,4540u,138442755u,0}/* 204F */, /*6994*/{0,568u,65537u,76752919u,40u,1610612768u,7596u,138442755u,0}/* 2050 */, /*6995*/{0,568u,65537u,76752919u,40u,1610612768u,7324u,138442755u,0}/* 2051 */, /*6996*/{0,568u,65537u,76752920u,40u,1610612768u,12750u,138442753u,67108864u}/* 2052 */, /*6997*/{0,568u,65537u,76785687u,40u,1610678304u,4316u,138442755u,0}/* 2053 */, /*6998*/{0,568u,65537u,76785686u,2097192u,1610612768u,1073749404u,138442754u,262144u}/* 2054 */, /*6999*/{0,568u,65537u,76818455u,40u,1610612768u,5972u,138442755u,0}/* 2055 */, /*7000*/{0,568u,65537u,69478423u,40u,1610612768u,5980u,138442755u,0}/* 2056 */, /*7001*/{575143936u,568u,65537u,76752983u,32u,1611137056u,30060u,541208579u,0}/* 2057 */, /*7002*/{0,568u,65537u,69478423u,40u,1610612768u,5988u,138442755u,0}/* 2058 */, /*7003*/{0,568u,65537u,69478423u,40u,1610612768u,5996u,138442755u,0}/* 2059 */, /*7004*/{0,568u,65537u,69478423u,40u,1610612768u,6004u,138442755u,0}/* 205A */, /*7005*/{0,568u,65537u,69478423u,40u,1610612768u,6012u,138442755u,0}/* 205B */, /*7006*/{0,568u,65537u,76818455u,40u,1610612768u,6020u,138442755u,0}/* 205C */, /*7007*/{0,568u,65537u,69478423u,40u,1610612768u,6028u,138442755u,0}/* 205D */, /*7008*/{0,568u,65537u,69478423u,40u,1610612768u,6036u,138442755u,0}/* 205E */, /*7009*/{575668224u,568u,65537u,69411916u,49184u,1611137056u,4180u,138457088u,589824u}/* 205F */, /*7010*/{0,568u,65537u,101919760u,538091528u,1695055872u,12u,4208640u,0}/* 2060 */, /*7011*/{0,568u,65537u,76753936u,538091528u,1695055872u,14u,4208648u,0}/* 2061 */, /*7012*/{0,568u,65537u,76885008u,538091528u,1695055872u,14u,4208648u,0}/* 2064 */, /*7013*/{0u,568u,65537u,68668432u,538091528u,1963491328u,12u,4208640u,0}/* 2066 */, /*7014*/{0u,568u,65537u,68669456u,538091528u,1963491328u,12u,4208640u,0}/* 2067 */, /*7015*/{0u,568u,65537u,68670480u,538091528u,1963491328u,12u,4208640u,0}/* 2068 */, /*7016*/{0u,568u,65537u,68671504u,538091528u,1963491328u,12u,4208640u,0}/* 2069 */, /*7017*/{0,568u,65537u,68201488u,538091528u,1695072256u,12u,4208640u,0}/* 206A */, /*7018*/{576192512u,576u,33620993u,76581195u,8388644u,1611137056u,58661u,138588160u,0}/* 2070 */, /*7019*/{576716800u,576u,131073u,76742980u,1499168u,3783786528u,1686170828u,138588176u,17170432u}/* 2071 */, /*7020*/{577241088u,577u,637603841u,89164107u,8388644u,1611137056u,58693u,138588160u,0}/* 2074 */, /*7021*/{577765376u,576u,671157249u,76581195u,8388644u,1611137056u,58701u,138588160u,0}/* 2075 */, /*7022*/{578289664u,576u,704714241u,76581195u,8388644u,1611137056u,58709u,138588160u,0}/* 2076 */, /*7023*/{578813952u,576u,738266625u,76581195u,8388644u,1611137056u,58717u,138588160u,0}/* 2077 */, /*7024*/{579338240u,576u,771824641u,76581195u,8388644u,1611137056u,58725u,138588160u,0}/* 2078 */, /*7025*/{579862528u,576u,805377025u,76581195u,8388644u,1611137056u,58733u,138588160u,0}/* 2079 */, /*7026*/{580386816u,576u,65537u,76582232u,32u,1611137056u,12654u,138588160u,67108864u}/* 207A */, /*7027*/{580911104u,576u,65537u,76582232u,32u,1611202592u,12742u,138588160u,67108864u}/* 207B */, /*7028*/{581435392u,576u,65537u,76589400u,32u,1611137056u,12694u,138588160u,67108864u}/* 207C */, /*7029*/{581959680u,86592u,65537u,79735124u,106528u,1745354784u,6350u,138588170u,0}/* 207D */, /*7030*/{582483968u,90688u,65537u,86026581u,106528u,1745354784u,6358u,138588170u,0}/* 207E */, /*7031*/{583008256u,577u,131073u,89162052u,1499168u,3783786528u,1686171908u,138588176u,393216u}/* 207F */, /*7032*/{583532544u,576u,33620993u,76581227u,8388644u,1611137056u,58661u,138596352u,0}/* 2080 */, /*7033*/{584056832u,577u,536937985u,89164139u,8388644u,1611137056u,58669u,138596352u,0}/* 2081 */, /*7034*/{584581120u,577u,570493441u,89164139u,8388644u,1611137056u,58677u,138596352u,0}/* 2082 */, /*7035*/{585105408u,577u,604047361u,89164139u,8388644u,1611137056u,58685u,138596352u,0}/* 2083 */, /*7036*/{585629696u,577u,637603841u,89164139u,8388644u,1611137056u,58693u,138596352u,0}/* 2084 */, /*7037*/{586153984u,576u,671157249u,76581227u,8388644u,1611137056u,58701u,138596352u,0}/* 2085 */, /*7038*/{586678272u,576u,704714241u,76581227u,8388644u,1611137056u,58709u,138596352u,0}/* 2086 */, /*7039*/{587202560u,576u,738266625u,76581227u,8388644u,1611137056u,58717u,138596352u,0}/* 2087 */, /*7040*/{587726848u,576u,771824641u,76581227u,8388644u,1611137056u,58725u,138596352u,0}/* 2088 */, /*7041*/{588251136u,576u,805377025u,76581227u,8388644u,1611137056u,58733u,138596352u,0}/* 2089 */, /*7042*/{588775424u,576u,65537u,76582264u,32u,1611137056u,12654u,138596352u,67108864u}/* 208A */, /*7043*/{589299712u,576u,65537u,76582264u,32u,1611202592u,12742u,138596352u,67108864u}/* 208B */, /*7044*/{589824000u,576u,65537u,76589432u,32u,1611137056u,12694u,138596352u,67108864u}/* 208C */, /*7045*/{590348288u,94784u,65537u,79735156u,106528u,1745354784u,6350u,138596362u,0}/* 208D */, /*7046*/{590872576u,98880u,65537u,86026613u,106528u,1745354784u,6358u,138596362u,0}/* 208E */, /*7047*/{591396864u,576u,131073u,76808548u,1499168u,3783786528u,1686168948u,138596368u,393216u}/* 2090 */, /*7048*/{591921152u,576u,131073u,76808548u,1499168u,3783786528u,1686169740u,138596368u,393216u}/* 2091 */, /*7049*/{592445440u,576u,131073u,76808548u,1499168u,3783786528u,1686172196u,138596368u,393216u}/* 2092 */, /*7050*/{592969728u,576u,131073u,76808548u,1499168u,3783786528u,1686174516u,138596368u,393216u}/* 2093 */, /*7051*/{593494016u,576u,131073u,76808548u,1499168u,3783786528u,1686169892u,138596368u,393216u}/* 2094 */, /*7052*/{594018304u,576u,131073u,76939620u,1499168u,3783786528u,1686170620u,138596368u,393216u}/* 2095 */, /*7053*/{594542592u,576u,131073u,76939620u,1499168u,3783786528u,1686171236u,138596368u,393216u}/* 2096 */, /*7054*/{595066880u,576u,131073u,76939620u,1499168u,3783786528u,1686171380u,138596368u,393216u}/* 2097 */, /*7055*/{595591168u,576u,131073u,76939620u,1499168u,3783786528u,1686171788u,138596368u,393216u}/* 2098 */, /*7056*/{596115456u,576u,131073u,76939620u,1499168u,3783786528u,1686171908u,138596368u,393216u}/* 2099 */, /*7057*/{596639744u,576u,131073u,76939620u,1499168u,3783786528u,1686172572u,138596368u,393216u}/* 209A */, /*7058*/{597164032u,576u,131073u,76939620u,1499168u,3783786528u,1686173380u,138596368u,393216u}/* 209B */, /*7059*/{597688320u,576u,131073u,76939620u,1499168u,3783786528u,1686173668u,138596368u,393216u}/* 209C */, /*7060*/{0,584u,65537u,77631513u,40u,1610612768u,58412u,138442752u,67108864u}/* 20A0 */, /*7061*/{0,584u,65537u,77631513u,40u,1610612768u,58420u,138442752u,67108864u}/* 20A1 */, /*7062*/{0,584u,65537u,77631513u,40u,1610612768u,58428u,138442752u,67108864u}/* 20A2 */, /*7063*/{0,584u,65537u,77631513u,40u,1610612768u,58436u,138442752u,67108864u}/* 20A3 */, /*7064*/{0,584u,65537u,77631513u,40u,1610612768u,58444u,138442752u,67108864u}/* 20A4 */, /*7065*/{0,584u,65537u,77631513u,40u,1610612768u,58452u,138442752u,67108864u}/* 20A5 */, /*7066*/{0,584u,65537u,77631513u,40u,1610612768u,58460u,138442752u,67108864u}/* 20A6 */, /*7067*/{0,584u,65537u,78680089u,40u,1610612768u,58468u,138442752u,67108864u}/* 20A7 */, /*7068*/{598212608u,584u,65537u,77631577u,32u,1611137056u,125836u,272756736u,67108864u}/* 20A8 */, /*7069*/{0,586u,65537u,77631513u,40u,1610612768u,58476u,138442752u,67108864u}/* 20A9 */, /*7070*/{0,584u,65537u,77631513u,40u,1610612768u,58484u,138442752u,67108864u}/* 20AA */, /*7071*/{0,584u,65537u,77664281u,40u,1610612768u,58492u,138442752u,67108864u}/* 20AB */, /*7072*/{0,585u,65537u,77697049u,40u,1610612768u,58500u,138442752u,67108864u}/* 20AC */, /*7073*/{0,584u,65537u,77729817u,40u,1610612768u,58508u,138442752u,67108864u}/* 20AD */, /*7074*/{0,584u,65537u,77729817u,40u,1610612768u,58516u,138442752u,67108864u}/* 20AE */, /*7075*/{0,584u,65537u,77729817u,40u,1610612768u,58524u,138442752u,67108864u}/* 20AF */, /*7076*/{0,584u,65537u,77795353u,40u,1610612768u,58532u,138442752u,67108864u}/* 20B0 */, /*7077*/{0,584u,65537u,77795353u,40u,1610612768u,58540u,138442752u,67108864u}/* 20B1 */, /*7078*/{0,584u,65537u,77860889u,40u,1610612768u,58548u,138442752u,67108864u}/* 20B2 */, /*7079*/{0,584u,65537u,77860889u,40u,1610612768u,58556u,138442752u,67108864u}/* 20B3 */, /*7080*/{0,584u,65537u,77860889u,40u,1610612768u,58564u,138442752u,67108864u}/* 20B4 */, /*7081*/{0,584u,65537u,77860889u,40u,1610612768u,58572u,138442752u,67108864u}/* 20B5 */, /*7082*/{0,584u,65537u,79007769u,40u,1610612768u,58580u,138442752u,67108864u}/* 20B6 */, /*7083*/{0,584u,65537u,77959193u,40u,1610612768u,58588u,138442752u,67108864u}/* 20B7 */, /*7084*/{0,584u,65537u,77959193u,40u,1610612768u,58596u,138442752u,67108864u}/* 20B8 */, /*7085*/{0,584u,65537u,77991961u,40u,1610612768u,58604u,138442752u,67108864u}/* 20B9 */, /*7086*/{0,584u,65537u,78057497u,40u,1610612768u,58612u,138442752u,67108864u}/* 20BA */, /*7087*/{0,584u,65537u,79171609u,40u,1610612768u,58620u,138442752u,67108864u}/* 20BB */, /*7088*/{0,584u,65537u,78123033u,40u,1610612768u,58628u,138442752u,67108864u}/* 20BC */, /*7089*/{0,584u,65537u,78123033u,40u,1610612768u,58636u,138442752u,67108864u}/* 20BD */, /*7090*/{0,584u,65537u,79204377u,40u,1610612768u,58644u,138442752u,67108864u}/* 20BE */, /*7091*/{0,584u,65537u,78221337u,40u,1610612768u,58652u,138442752u,67108864u}/* 20BF */, /*7092*/{0,592u,2686977u,3423645702u,672030728u,1627389968u,1077936142u,1086355464u,262144u}/* 20D0 */, /*7093*/{0,592u,2686977u,3423645702u,672030728u,1627389968u,1077936142u,1090549768u,262144u}/* 20D1 */, /*7094*/{0,592u,2686977u,135311366u,672030728u,1627389968u,1077936142u,1094744072u,262144u}/* 20D2 */, /*7095*/{0,592u,2686977u,3423645702u,672030728u,1627389968u,1077936142u,1098938376u,262144u}/* 20D4 */, /*7096*/{0,592u,2686977u,3423645702u,672030728u,1627389968u,1077936142u,1103132680u,262144u}/* 20D5 */, /*7097*/{0,592u,2686977u,3423645702u,672030728u,1627389968u,1077936142u,1107326984u,262144u}/* 20D6 */, /*7098*/{0,592u,2686977u,3423645702u,672030728u,1627389968u,1077936142u,1111521288u,262144u}/* 20D7 */, /*7099*/{0,592u,2686977u,135311366u,672030728u,1627389968u,1077936142u,226523144u,262144u}/* 20D8 */, /*7100*/{0,592u,2686977u,3423645702u,672030728u,1627389968u,1077936142u,1115715592u,262144u}/* 20DB */, /*7101*/{0,592u,2686977u,3423645702u,672030728u,1627389968u,1077936142u,1119909896u,262144u}/* 20DC */, /*7102*/{0,592u,2686977u,68202503u,672030728u,1627389968u,4194316u,230717440u,0}/* 20DD */, /*7103*/{0,592u,2686977u,3423645702u,672030728u,1627389968u,1077936142u,1124104200u,262144u}/* 20E1 */, /*7104*/{0,592u,2686977u,68300807u,672030728u,1627389968u,4194316u,230717440u,0}/* 20E2 */, /*7105*/{0,592u,2686977u,68366343u,672030728u,1627389968u,4194316u,230717440u,0}/* 20E4 */, /*7106*/{0,592u,2686977u,135475206u,672030728u,1627389968u,1077936142u,226523144u,262144u}/* 20E5 */, /*7107*/{0,592u,2686977u,135475206u,672030728u,1627389968u,1077936142u,1128298504u,262144u}/* 20E6 */, /*7108*/{0,592u,2686977u,3423809542u,672030728u,1627389968u,1077936140u,1132492800u,262144u}/* 20E7 */, /*7109*/{0,592u,2686977u,3088265222u,672030728u,1627389968u,1077936140u,1136687104u,262144u}/* 20E8 */, /*7110*/{0,592u,2686977u,3423809542u,672030728u,1627389968u,1077936140u,1140881408u,262144u}/* 20E9 */, /*7111*/{0,592u,2686977u,135475206u,672030728u,1627389968u,1077936140u,226523136u,262144u}/* 20EA */, /*7112*/{0,592u,2686977u,135540742u,672030728u,1627389968u,1077936142u,226523144u,262144u}/* 20EB */, /*7113*/{0,592u,2686977u,3088363526u,672030728u,1627389968u,1077936142u,222328840u,262144u}/* 20EC */, /*7114*/{0,592u,2686977u,3423940614u,672030728u,1627389968u,1077936140u,218134528u,262144u}/* 20F0 */, /*7115*/{598736896u,600u,65537u,76589147u,32u,1611137056u,125212u,406958080u,67108864u}/* 2100 */, /*7116*/{599261184u,600u,65537u,76589147u,32u,1611137056u,129236u,406958080u,67108864u}/* 2101 */, /*7117*/{599785472u,600u,65537u,76578913u,1507360u,3767009312u,1711335182u,138514440u,2490368u}/* 2102 */, /*7118*/{600309760u,601u,65537u,78686299u,32u,1611137056u,69484u,272756736u,67108864u}/* 2103 */, /*7119*/{0,600u,65537u,76589083u,40u,1610612768u,11500u,138442752u,67108864u}/* 2104 */, /*7120*/{600834048u,601u,65537u,89172059u,32u,1611137056u,128460u,406958080u,67108864u}/* 2105 */, /*7121*/{601358336u,600u,65537u,76589147u,32u,1611137056u,130188u,406958080u,67108864u}/* 2106 */, /*7122*/{601882624u,600u,65537u,76578881u,1507360u,3767009312u,1711335758u,138506248u,2490368u}/* 2107 */, /*7123*/{0,600u,65537u,76589083u,40u,1610612768u,11508u,138442752u,67108864u}/* 2108 */, /*7124*/{602406912u,601u,65537u,78686299u,32u,1611137056u,70340u,272756736u,67108864u}/* 2109 */, /*7125*/{602931200u,600u,65537u,76578914u,1499168u,3767009312u,1719724766u,138465288u,393216u}/* 210A */, /*7126*/{603455488u,600u,65537u,76578913u,1507360u,3767009312u,1711336446u,138514440u,2490368u}/* 210B */, /*7127*/{603979776u,600u,65537u,76578913u,1507360u,3767009312u,1711336446u,138514440u,2490368u}/* 210C */, /*7128*/{604504064u,600u,65537u,76578913u,1507360u,3767009312u,1711336446u,138514440u,2490368u}/* 210D */, /*7129*/{605028352u,600u,65537u,76578914u,1499168u,3767009312u,1719725054u,138465288u,393216u}/* 210E */, /*7130*/{605552640u,600u,65537u,76578914u,1499168u,3767009312u,1719725054u,377532424u,393216u}/* 210F */, /*7131*/{606076928u,600u,65537u,76578913u,1507360u,3767009312u,1711336654u,138514440u,2490368u}/* 2110 */, /*7132*/{606601216u,600u,65537u,76578913u,1507360u,3767009312u,1711336654u,138514440u,2490368u}/* 2111 */, /*7133*/{607125504u,600u,65537u,76578913u,1507360u,3767009312u,1711337206u,138514440u,2490368u}/* 2112 */, /*7134*/{607649792u,601u,65537u,89161826u,1499168u,3767009312u,1719725814u,138465288u,393216u}/* 2113 */, /*7135*/{0,600u,65537u,76589083u,40u,1610612768u,11516u,138442752u,67108864u}/* 2114 */, /*7136*/{608174080u,600u,65537u,76578913u,1507360u,3767009312u,1711337734u,138514440u,2490368u}/* 2115 */, /*7137*/{608698368u,601u,65537u,77637723u,32u,1611137056u,123676u,272756736u,67108864u}/* 2116 */, /*7138*/{0,600u,65537u,76589083u,40u,1610612768u,11524u,138442752u,67108864u}/* 2117 */, /*7139*/{0,600u,65537u,76589080u,40u,1610612768u,1610624270u,138442784u,67502080u}/* 2118 */, /*7140*/{609222656u,600u,65537u,76578913u,1507360u,3767009312u,1711338398u,138514440u,2490368u}/* 2119 */, /*7141*/{609746944u,600u,65537u,76578913u,1507360u,3767009312u,1711338566u,138514440u,2490368u}/* 211A */, /*7142*/{610271232u,600u,65537u,76578913u,1507360u,3767009312u,1711338710u,138514440u,2490368u}/* 211B */, /*7143*/{610795520u,600u,65537u,76578913u,1507360u,3767009312u,1711338710u,138514440u,2490368u}/* 211C */, /*7144*/{611319808u,600u,65537u,76578913u,1507360u,3767009312u,1711338710u,138514440u,2490368u}/* 211D */, /*7145*/{0,600u,65537u,76589083u,40u,1610612768u,11540u,138442752u,67108864u}/* 211E */, /*7146*/{0,600u,65537u,76589083u,40u,1610612768u,11548u,138442752u,67108864u}/* 211F */, /*7147*/{611844096u,600u,65537u,76589403u,32u,1611137056u,124740u,272969728u,67108864u}/* 2120 */, /*7148*/{612368384u,601u,65537u,89172059u,32u,1611137056u,184140u,407105536u,67108864u}/* 2121 */, /*7149*/{612892672u,601u,65537u,89172315u,0u,1611141152u,125028u,272969728u,67108864u}/* 2122 */, /*7150*/{0,600u,65537u,76589083u,40u,1610612768u,11556u,138442752u,67108864u}/* 2123 */, /*7151*/{613416960u,600u,65537u,76578913u,1507360u,3767009312u,1711340614u,138514440u,2490368u}/* 2124 */, /*7152*/{0,600u,65537u,76589083u,40u,1610612768u,11564u,138442752u,67108864u}/* 2125 */, /*7153*/{614138880u,1528824409u,196608u,76578849u,1507328u,3807903840u,1711342148u,138485760u,2490368u}/* 2126 */, /*7154*/{0,600u,65537u,76589083u,40u,1610612768u,11572u,138442752u,67108864u}/* 2127 */, /*7155*/{614465536u,600u,65537u,76578913u,1507360u,3767009312u,1711340614u,138514440u,2490368u}/* 2128 */, /*7156*/{0,600u,65537u,76589083u,40u,1610612768u,11582u,138442760u,67108864u}/* 2129 */, /*7157*/{615187584u,1530921560u,131072u,76578849u,1507328u,3807903840u,1711337060u,138485760u,2490368u}/* 212A */, /*7158*/{615712000u,1533018713u,131072u,89161761u,1507328u,3807903840u,1711334772u,310468608u,2490368u}/* 212B */, /*7159*/{616038400u,600u,65537u,76578913u,1507360u,3767009312u,1711334974u,138514440u,2490368u}/* 212C */, /*7160*/{616562688u,600u,65537u,76578913u,1507360u,3767009312u,1711335182u,138514440u,2490368u}/* 212D */, /*7161*/{0,600u,65537u,76582939u,40u,1610612768u,1610624324u,138442784u,67502080u}/* 212E */, /*7162*/{617086976u,600u,65537u,76578914u,1499168u,3767009312u,1719724174u,138465288u,393216u}/* 212F */, /*7163*/{617611264u,600u,65537u,76578913u,1507360u,3767009312u,1711335566u,138514440u,2490368u}/* 2130 */, /*7164*/{618135552u,600u,65537u,76578913u,1507360u,3767009312u,1711336038u,138514440u,2490368u}/* 2131 */, /*7165*/{198016u,1535115864u,131073u,76578817u,1507368u,3807903776u,1711336140u,138491904u,2490368u}/* 2132 */, /*7166*/{618659840u,600u,65537u,76578913u,1507360u,3767009312u,1711337614u,138514440u,2490368u}/* 2133 */, /*7167*/{619184128u,600u,65537u,76578914u,1499168u,3767009312u,1719726630u,138465288u,393216u}/* 2134 */, /*7168*/{619708416u,600u,65537u,76578885u,1515552u,3758620704u,1677793526u,138457096u,393216u}/* 2135 */, /*7169*/{620232704u,600u,65537u,76578885u,1515552u,3758620704u,1677793534u,138457096u,393216u}/* 2136 */, /*7170*/{620756992u,600u,65537u,76578885u,1515552u,3758620704u,1677793542u,138457096u,393216u}/* 2137 */, /*7171*/{621281280u,600u,65537u,76578885u,1515552u,3758620704u,1677793550u,138457096u,393216u}/* 2138 */, /*7172*/{621805568u,600u,65537u,76677218u,1499136u,3767013408u,1719725260u,138465280u,393216u}/* 2139 */, /*7173*/{0,600u,65537u,76687387u,40u,1610612768u,11596u,138442752u,67108864u}/* 213A */, /*7174*/{622329856u,600u,65537u,76785755u,32u,1611137056u,183028u,407105536u,67108864u}/* 213B */, /*7175*/{622854144u,600u,65537u,76808290u,1499168u,3767009312u,1719730614u,138465288u,393216u}/* 213C */, /*7176*/{623378432u,600u,65537u,76742754u,1499168u,3767009312u,1719730454u,138465288u,393216u}/* 213D */, /*7177*/{623902720u,600u,65537u,76742753u,1507360u,3767009312u,1711341846u,138514440u,2490368u}/* 213E */, /*7178*/{624427008u,600u,65537u,76742753u,1507360u,3767009312u,1711342006u,138514440u,2490368u}/* 213F */, /*7179*/{624951296u,600u,65537u,76753016u,32u,1745354784u,12646u,138465280u,67108864u}/* 2140 */, /*7180*/{0,600u,65537u,76752920u,40u,1610612768u,11606u,138442752u,67108864u}/* 2141 */, /*7181*/{0,600u,65537u,76752920u,40u,1610612768u,11614u,138442752u,67108864u}/* 2142 */, /*7182*/{0,600u,65537u,76752920u,40u,1610612768u,11622u,138442752u,67108864u}/* 2143 */, /*7183*/{0,600u,65537u,76752920u,40u,1610612768u,11630u,138442752u,67108864u}/* 2144 */, /*7184*/{625475584u,600u,65537u,76742753u,1507360u,3767009312u,1711335350u,138514440u,2490368u}/* 2145 */, /*7185*/{625999872u,600u,65537u,76742754u,1499168u,3767009312u,1719723958u,138465288u,393216u}/* 2146 */, /*7186*/{626524160u,600u,65537u,76742754u,1499168u,3767009312u,1719724174u,138465288u,393216u}/* 2147 */, /*7187*/{627048448u,600u,65537u,76742754u,1499168u,3767009312u,1719725262u,138465288u,17170432u}/* 2148 */, /*7188*/{627572736u,600u,65537u,76742754u,1499168u,3767009312u,1719725470u,138465288u,17170432u}/* 2149 */, /*7189*/{0,600u,65537u,76752923u,40u,1610612768u,11636u,138442752u,67108864u}/* 214A */, /*7190*/{0,600u,65537u,76752920u,40u,1610612768u,13894u,138442752u,67108864u}/* 214B */, /*7191*/{0,600u,65537u,76818459u,40u,1610612768u,11644u,138442752u,67108864u}/* 214C */, /*7192*/{0,600u,65537u,76851227u,40u,1610612768u,129236u,407058432u,67108864u}/* 214D */, /*7193*/{198144u,600u,131073u,76840962u,1499176u,3768975392u,1719724748u,138442752u,393216u}/* 214E */, /*7194*/{0,600u,65537u,76873755u,40u,1610612768u,11652u,138442752u,67108864u}/* 214F */, /*7195*/{628097024u,608u,201393665u,76917291u,50331682u,1611137056u,130141u,407597056u,0}/* 2150 */, /*7196*/{628621312u,608u,167839233u,76917291u,41943074u,1611137056u,130157u,407597056u,0}/* 2151 */, /*7197*/{629145600u,608u,151062017u,76917291u,37748770u,1611137056u,188741u,542060544u,0}/* 2152 */, /*7198*/{629669888u,609u,302056961u,76589611u,67108898u,1611137056u,130109u,407597056u,0}/* 2153 */, /*7199*/{630194176u,609u,436275713u,89172523u,67108898u,1611137056u,130117u,407597056u,0}/* 2154 */, /*7200*/{630718464u,608u,268502529u,89172523u,58720290u,1611137056u,130125u,407597056u,0}/* 2155 */, /*7201*/{631242752u,608u,335612417u,76589611u,58720290u,1611137056u,130133u,407597056u,0}/* 2156 */, /*7202*/{631767040u,608u,402720769u,76589611u,58720290u,1611137056u,130141u,407597056u,0}/* 2157 */, /*7203*/{632291328u,608u,469831681u,76589611u,58720290u,1611137056u,130149u,407597056u,0}/* 2158 */, /*7204*/{632815616u,608u,234948097u,76589611u,54525986u,1611137056u,130133u,407597056u,0}/* 2159 */, /*7205*/{633339904u,608u,486607873u,76589611u,54525986u,1611137056u,130165u,407597056u,0}/* 215A */, /*7206*/{633864192u,609u,184616449u,89172523u,46137378u,1611137056u,130149u,407597056u,0}/* 215B */, /*7207*/{634388480u,609u,318834689u,76589611u,46137378u,1611137056u,130165u,407597056u,0}/* 215C */, /*7208*/{634912768u,609u,419499009u,76589611u,46137378u,1611137056u,130181u,407597056u,0}/* 215D */, /*7209*/{635437056u,609u,503385601u,89172523u,46137378u,1611137056u,130197u,407597056u,0}/* 215E */, /*7210*/{635961344u,608u,536937985u,76589611u,8388642u,1611137056u,71437u,273133568u,0}/* 215F */, /*7211*/{636683904u,1537213025u,537003521u,89161802u,9895970u,3807903776u,1610673357u,138506244u,2490368u}/* 2160 */, /*7212*/{637208320u,1539310177u,570558977u,89161802u,9895970u,3807903776u,1610733965u,272805892u,2490368u}/* 2161 */, /*7213*/{637732736u,1541407329u,604112897u,89161802u,9895970u,3807903776u,1610794573u,407105540u,2490368u}/* 2162 */, /*7214*/{638257152u,1543504481u,637669377u,89161802u,9895970u,3807903776u,1610737429u,272805892u,2490368u}/* 2163 */, /*7215*/{638781568u,1545601633u,671222785u,89161802u,9895970u,3807903776u,1610676821u,138506244u,2490368u}/* 2164 */, /*7216*/{639305984u,1547698785u,704779777u,89161802u,9895970u,3807903776u,1610737429u,272805892u,2490368u}/* 2165 */, /*7217*/{639830400u,1549795937u,738332161u,89161802u,9895970u,3807903776u,1610798037u,407105540u,2490368u}/* 2166 */, /*7218*/{640354816u,1551893089u,771890177u,89161802u,9895970u,3807903776u,1610858645u,541405188u,2490368u}/* 2167 */, /*7219*/{640879232u,1553990241u,805442561u,89161802u,9895970u,3807903776u,1610737653u,272805892u,2490368u}/* 2168 */, /*7220*/{641403648u,1556087393u,822222849u,89161802u,9895970u,3807903776u,1610677045u,138506244u,2490368u}/* 2169 */, /*7221*/{641928064u,1558184545u,838996481u,89161802u,9895970u,3807903776u,1610737653u,272805892u,2490368u}/* 216A */, /*7222*/{642452480u,1560281697u,855777793u,89161802u,9895970u,3807903776u,1610798261u,407105540u,2490368u}/* 216B */, /*7223*/{642976896u,1562378848u,1493329921u,76578890u,9895970u,3807903776u,1610673909u,138506244u,2490368u}/* 216C */, /*7224*/{643501312u,1564476000u,1577218561u,76578890u,9895970u,3807903776u,1610671885u,138506244u,2490368u}/* 216D */, /*7225*/{644025728u,1566573152u,1644329473u,76578890u,9895970u,3807903776u,1610672053u,138506244u,2490368u}/* 216E */, /*7226*/{644550144u,1568670304u,1728218113u,76578890u,9895970u,3807903776u,1610674317u,138506244u,2490368u}/* 216F */, /*7227*/{645074560u,609u,537003521u,89161802u,9887778u,3769499680u,1619061965u,138457104u,393216u}/* 2170 */, /*7228*/{645598976u,609u,570558977u,89161802u,9887778u,3769499680u,1619122573u,272707600u,393216u}/* 2171 */, /*7229*/{646123392u,609u,604112897u,89161802u,9887778u,3769499680u,1619183181u,406958096u,393216u}/* 2172 */, /*7230*/{646647808u,609u,637669377u,89161802u,9887778u,3769499680u,1619126037u,272707600u,393216u}/* 2173 */, /*7231*/{647172224u,609u,671222785u,89161802u,9887778u,3769499680u,1619065429u,138457104u,393216u}/* 2174 */, /*7232*/{647696640u,609u,704779777u,89161802u,9887778u,3769499680u,1619126037u,272707600u,393216u}/* 2175 */, /*7233*/{648221056u,609u,738332161u,89161802u,9887778u,3769499680u,1619186645u,406958096u,393216u}/* 2176 */, /*7234*/{648745472u,609u,771890177u,89161802u,9887778u,3769499680u,1619247253u,541208592u,393216u}/* 2177 */, /*7235*/{649269888u,609u,805442561u,89161802u,9887778u,3769499680u,1619126261u,272707600u,393216u}/* 2178 */, /*7236*/{649794304u,609u,822222849u,89161802u,9887778u,3769499680u,1619065653u,138457104u,393216u}/* 2179 */, /*7237*/{650318720u,608u,838996481u,76578890u,9887778u,3769499680u,1619126261u,272707600u,393216u}/* 217A */, /*7238*/{650843136u,608u,855777793u,76578890u,9887778u,3769499680u,1619186869u,406958096u,393216u}/* 217B */, /*7239*/{651367552u,608u,1493329921u,76578890u,9887778u,3769499680u,1619062517u,138457104u,393216u}/* 217C */, /*7240*/{651891968u,608u,1577218561u,76578890u,9887778u,3769499680u,1619060493u,138457104u,393216u}/* 217D */, /*7241*/{652416384u,608u,1644329473u,76578890u,9887778u,3769499680u,1619060661u,138457104u,393216u}/* 217E */, /*7242*/{652940800u,608u,1728218113u,76578890u,9887778u,3769499680u,1619062925u,138457104u,393216u}/* 217F */, /*7243*/{0,608u,1728218113u,76578826u,9904170u,3758096416u,1610668381u,138442752u,393216u}/* 2180 */, /*7244*/{0,608u,1795329025u,76578826u,9904170u,3758096416u,1610668389u,138442752u,393216u}/* 2181 */, /*7245*/{0,608u,1879217665u,76578826u,9904170u,3758096416u,1610668397u,138442752u,393216u}/* 2182 */, /*7246*/{202368u,1570767456u,131073u,76677121u,1507368u,3807903776u,1711335332u,138491904u,2490368u}/* 2183 */, /*7247*/{202496u,608u,131073u,76840962u,1499176u,3768975392u,1719723940u,138442752u,393216u}/* 2184 */, /*7248*/{0,608u,704779777u,76873738u,9904170u,3758096416u,1610671445u,138442752u,393216u}/* 2185 */, /*7249*/{0,608u,1493329921u,76873738u,9904170u,3758096416u,1610668405u,138442752u,393216u}/* 2186 */, /*7250*/{0,608u,1946328577u,76873738u,9904170u,3758096416u,1610668413u,138442752u,393216u}/* 2187 */, /*7251*/{0,608u,2030217217u,76873738u,9904170u,3758096416u,1610668421u,138442752u,393216u}/* 2188 */, /*7252*/{653262848u,609u,33620993u,89500203u,8388642u,1611137056u,130101u,407597056u,0}/* 2189 */, /*7253*/{0,608u,65537u,77113371u,40u,1610612768u,11660u,138442752u,67108864u}/* 218A */, /*7254*/{0,608u,65537u,77113371u,40u,1610612768u,11668u,138442752u,67108864u}/* 218B */, /*7255*/{0,617u,65537u,89171992u,40u,1610612768u,11678u,138442753u,67108864u}/* 2190 */, /*7256*/{0,617u,65537u,89171992u,40u,1610612768u,11694u,138442753u,67108864u}/* 2191 */, /*7257*/{0,617u,65537u,89171992u,40u,1610612768u,11686u,138442753u,67108864u}/* 2192 */, /*7258*/{0,617u,65537u,89171992u,40u,1610612768u,11702u,138442753u,67108864u}/* 2193 */, /*7259*/{0,617u,65537u,89171992u,8u,1610616864u,11710u,138442753u,67108864u}/* 2194 */, /*7260*/{0,617u,65537u,89171995u,8u,1610616864u,11718u,138442761u,67108864u}/* 2195 */, /*7261*/{0,617u,65537u,89171995u,8u,1610616864u,11726u,138442761u,67108864u}/* 2196 */, /*7262*/{0,617u,65537u,89171995u,8u,1610616864u,11734u,138442761u,67108864u}/* 2197 */, /*7263*/{0,617u,65537u,89171995u,8u,1610616864u,11742u,138442761u,67108864u}/* 2198 */, /*7264*/{0,617u,65537u,89171995u,8u,1610616864u,11750u,138442761u,67108864u}/* 2199 */, /*7265*/{653787136u,616u,65537u,76589112u,40u,1610612768u,11678u,335585281u,67108864u}/* 219A */, /*7266*/{654311424u,616u,65537u,76589112u,40u,1610612768u,11686u,335585281u,67108864u}/* 219B */, /*7267*/{0,616u,65537u,76589083u,40u,1610612768u,11758u,138442761u,67108864u}/* 219C */, /*7268*/{0,616u,65537u,76589083u,40u,1610612768u,11766u,138442761u,67108864u}/* 219D */, /*7269*/{0,616u,65537u,76589083u,40u,1610612768u,11774u,138442761u,67108864u}/* 219E */, /*7270*/{0,616u,65537u,76589083u,40u,1610612768u,11782u,138442761u,67108864u}/* 219F */, /*7271*/{0,616u,65537u,76589080u,40u,1610612768u,11790u,138442753u,67108864u}/* 21A0 */, /*7272*/{0,616u,65537u,76589083u,40u,1610612768u,11798u,138442761u,67108864u}/* 21A1 */, /*7273*/{0,616u,65537u,76589083u,40u,1610612768u,11806u,138442761u,67108864u}/* 21A2 */, /*7274*/{0,616u,65537u,76589080u,40u,1610612768u,11814u,138442753u,67108864u}/* 21A3 */, /*7275*/{0,616u,65537u,76589083u,40u,1610612768u,11822u,138442761u,67108864u}/* 21A4 */, /*7276*/{0,616u,65537u,76589083u,40u,1610612768u,11830u,138442761u,67108864u}/* 21A5 */, /*7277*/{0,616u,65537u,76589080u,40u,1610612768u,11838u,138442753u,67108864u}/* 21A6 */, /*7278*/{0,616u,65537u,76589083u,40u,1610612768u,11846u,138442761u,67108864u}/* 21A7 */, /*7279*/{0,616u,65537u,76589083u,40u,1610612768u,11852u,138442753u,67108864u}/* 21A8 */, /*7280*/{0,616u,65537u,76589083u,8u,1610616864u,11862u,138442761u,67108864u}/* 21A9 */, /*7281*/{0,616u,65537u,76589083u,8u,1610616864u,11870u,138442761u,67108864u}/* 21AA */, /*7282*/{0,616u,65537u,76589083u,40u,1610612768u,11878u,138442761u,67108864u}/* 21AB */, /*7283*/{0,616u,65537u,76589083u,40u,1610612768u,11886u,138442761u,67108864u}/* 21AC */, /*7284*/{0,616u,65537u,76589083u,40u,1610612768u,11894u,138442761u,67108864u}/* 21AD */, /*7285*/{654835712u,616u,65537u,76589112u,40u,1610612768u,11710u,335585281u,67108864u}/* 21AE */, /*7286*/{0,616u,65537u,76589083u,40u,1610612768u,11900u,138442753u,67108864u}/* 21AF */, /*7287*/{0,616u,65537u,76589083u,40u,1610612768u,11910u,138442761u,67108864u}/* 21B0 */, /*7288*/{0,616u,65537u,76589083u,40u,1610612768u,11918u,138442761u,67108864u}/* 21B1 */, /*7289*/{0,616u,65537u,76589083u,40u,1610612768u,11924u,138442753u,67108864u}/* 21B2 */, /*7290*/{0,616u,65537u,76589083u,40u,1610612768u,11932u,138442753u,67108864u}/* 21B3 */, /*7291*/{0,616u,65537u,76589083u,40u,1610612768u,11940u,138442753u,67108864u}/* 21B4 */, /*7292*/{0,616u,65537u,76589083u,40u,1610612768u,11948u,138442753u,67108864u}/* 21B5 */, /*7293*/{0,616u,65537u,76589083u,40u,1610612768u,11958u,138442761u,67108864u}/* 21B6 */, /*7294*/{0,616u,65537u,76589083u,40u,1610612768u,11966u,138442761u,67108864u}/* 21B7 */, /*7295*/{0,617u,65537u,76589083u,40u,1610612768u,11972u,138442753u,67108864u}/* 21B8 */, /*7296*/{0,617u,65537u,76589083u,40u,1610612768u,11980u,138442753u,67108864u}/* 21B9 */, /*7297*/{0,616u,65537u,76589083u,40u,1610612768u,11988u,138442753u,67108864u}/* 21BA */, /*7298*/{0,616u,65537u,76589083u,40u,1610612768u,11996u,138442753u,67108864u}/* 21BB */, /*7299*/{0,616u,65537u,76589083u,40u,1610612768u,12006u,138442761u,67108864u}/* 21BC */, /*7300*/{0,616u,65537u,76589083u,40u,1610612768u,12014u,138442761u,67108864u}/* 21BD */, /*7301*/{0,616u,65537u,76589083u,40u,1610612768u,12022u,138442761u,67108864u}/* 21BE */, /*7302*/{0,616u,65537u,76589083u,40u,1610612768u,12030u,138442761u,67108864u}/* 21BF */, /*7303*/{0,616u,65537u,76589083u,40u,1610612768u,12038u,138442761u,67108864u}/* 21C0 */, /*7304*/{0,616u,65537u,76589083u,40u,1610612768u,12046u,138442761u,67108864u}/* 21C1 */, /*7305*/{0,616u,65537u,76589083u,40u,1610612768u,12054u,138442761u,67108864u}/* 21C2 */, /*7306*/{0,616u,65537u,76589083u,40u,1610612768u,12062u,138442761u,67108864u}/* 21C3 */, /*7307*/{0,616u,65537u,76589083u,40u,1610612768u,12070u,138442761u,67108864u}/* 21C4 */, /*7308*/{0,616u,65537u,76589083u,40u,1610612768u,12078u,138442761u,67108864u}/* 21C5 */, /*7309*/{0,616u,65537u,76589083u,40u,1610612768u,12086u,138442761u,67108864u}/* 21C6 */, /*7310*/{0,616u,65537u,76589083u,40u,1610612768u,12094u,138442761u,67108864u}/* 21C7 */, /*7311*/{0,616u,65537u,76589083u,40u,1610612768u,12102u,138442761u,67108864u}/* 21C8 */, /*7312*/{0,616u,65537u,76589083u,40u,1610612768u,12110u,138442761u,67108864u}/* 21C9 */, /*7313*/{0,616u,65537u,76589083u,40u,1610612768u,12118u,138442761u,67108864u}/* 21CA */, /*7314*/{0,616u,65537u,76589083u,40u,1610612768u,12126u,138442761u,67108864u}/* 21CB */, /*7315*/{0,616u,65537u,76589083u,40u,1610612768u,12134u,138442761u,67108864u}/* 21CC */, /*7316*/{655360000u,616u,65537u,76589115u,40u,1610612768u,12142u,335585289u,67108864u}/* 21CD */, /*7317*/{655884288u,616u,65537u,76589112u,40u,1610612768u,12174u,335585281u,67108864u}/* 21CE */, /*7318*/{656408576u,616u,65537u,76589112u,40u,1610612768u,12158u,335585281u,67108864u}/* 21CF */, /*7319*/{0,616u,65537u,76589083u,40u,1610612768u,12142u,138442761u,67108864u}/* 21D0 */, /*7320*/{0,616u,65537u,76589083u,40u,1610612768u,12150u,138442761u,67108864u}/* 21D1 */, /*7321*/{0,617u,65537u,89171992u,40u,1610612768u,12158u,138442753u,67108864u}/* 21D2 */, /*7322*/{0,616u,65537u,76589083u,40u,1610612768u,12166u,138442761u,67108864u}/* 21D3 */, /*7323*/{0,617u,65537u,89171992u,40u,1610612768u,12174u,138442753u,67108864u}/* 21D4 */, /*7324*/{0,616u,65537u,76589083u,40u,1610612768u,12182u,138442761u,67108864u}/* 21D5 */, /*7325*/{0,616u,65537u,76589083u,40u,1610612768u,12190u,138442761u,67108864u}/* 21D6 */, /*7326*/{0,616u,65537u,76589083u,40u,1610612768u,12198u,138442761u,67108864u}/* 21D7 */, /*7327*/{0,616u,65537u,76589083u,40u,1610612768u,12206u,138442761u,67108864u}/* 21D8 */, /*7328*/{0,616u,65537u,76589083u,40u,1610612768u,12214u,138442761u,67108864u}/* 21D9 */, /*7329*/{0,616u,65537u,76589083u,40u,1610612768u,12222u,138442761u,67108864u}/* 21DA */, /*7330*/{0,616u,65537u,76589083u,40u,1610612768u,12230u,138442761u,67108864u}/* 21DB */, /*7331*/{0,616u,65537u,76589083u,40u,1610612768u,12236u,138442753u,67108864u}/* 21DC */, /*7332*/{0,616u,65537u,76589083u,40u,1610612768u,12246u,138442761u,67108864u}/* 21DD */, /*7333*/{0,616u,65537u,76589083u,40u,1610612768u,12252u,138442753u,67108864u}/* 21DE */, /*7334*/{0,616u,65537u,76589083u,40u,1610612768u,12260u,138442753u,67108864u}/* 21DF */, /*7335*/{0,616u,65537u,76589083u,40u,1610612768u,12268u,138442753u,67108864u}/* 21E0 */, /*7336*/{0,616u,65537u,76589083u,40u,1610612768u,12276u,138442753u,67108864u}/* 21E1 */, /*7337*/{0,616u,65537u,76589083u,40u,1610612768u,12284u,138442753u,67108864u}/* 21E2 */, /*7338*/{0,616u,65537u,76589083u,40u,1610612768u,12292u,138442753u,67108864u}/* 21E3 */, /*7339*/{0,616u,65537u,76589083u,40u,1610612768u,12302u,138442761u,67108864u}/* 21E4 */, /*7340*/{0,616u,65537u,76589083u,40u,1610612768u,12310u,138442761u,67108864u}/* 21E5 */, /*7341*/{0,616u,65537u,76589083u,40u,1610612768u,12316u,138442753u,67108864u}/* 21E6 */, /*7342*/{0,617u,65537u,76589083u,40u,1610612768u,12324u,138442753u,67108864u}/* 21E7 */, /*7343*/{0,616u,65537u,76589083u,40u,1610612768u,12332u,138442753u,67108864u}/* 21E8 */, /*7344*/{0,616u,65537u,76589083u,40u,1610612768u,12340u,138442753u,67108864u}/* 21E9 */, /*7345*/{0,616u,65537u,76589083u,40u,1610612768u,12348u,138442753u,67108864u}/* 21EA */, /*7346*/{0,616u,65537u,76687387u,40u,1610612768u,12356u,138442753u,67108864u}/* 21EB */, /*7347*/{0,616u,65537u,76687387u,40u,1610612768u,12364u,138442753u,67108864u}/* 21EC */, /*7348*/{0,616u,65537u,76687387u,40u,1610612768u,12372u,138442753u,67108864u}/* 21ED */, /*7349*/{0,616u,65537u,76687387u,40u,1610612768u,12380u,138442753u,67108864u}/* 21EE */, /*7350*/{0,616u,65537u,76687387u,40u,1610612768u,12388u,138442753u,67108864u}/* 21EF */, /*7351*/{0,616u,65537u,76687387u,40u,1610612768u,12396u,138442753u,67108864u}/* 21F0 */, /*7352*/{0,616u,65537u,76687387u,40u,1610612768u,12404u,138442753u,67108864u}/* 21F1 */, /*7353*/{0,616u,65537u,76687387u,40u,1610612768u,12412u,138442753u,67108864u}/* 21F2 */, /*7354*/{0,616u,65537u,76687387u,40u,1610612768u,12420u,138442753u,67108864u}/* 21F3 */, /*7355*/{0,616u,65537u,76752920u,40u,1610612768u,12430u,138442753u,67108864u}/* 21F4 */, /*7356*/{0,616u,65537u,76752920u,40u,1610612768u,12438u,138442753u,67108864u}/* 21F5 */, /*7357*/{0,616u,65537u,76752920u,40u,1610612768u,12446u,138442753u,67108864u}/* 21F6 */, /*7358*/{0,616u,65537u,76752920u,40u,1610612768u,12454u,138442753u,67108864u}/* 21F7 */, /*7359*/{0,616u,65537u,76752920u,40u,1610612768u,12462u,138442753u,67108864u}/* 21F8 */, /*7360*/{0,616u,65537u,76752920u,40u,1610612768u,12470u,138442753u,67108864u}/* 21F9 */, /*7361*/{0,616u,65537u,76752920u,40u,1610612768u,12478u,138442753u,67108864u}/* 21FA */, /*7362*/{0,616u,65537u,76752920u,40u,1610612768u,12486u,138442753u,67108864u}/* 21FB */, /*7363*/{0,616u,65537u,76752920u,40u,1610612768u,12494u,138442753u,67108864u}/* 21FC */, /*7364*/{0,616u,65537u,76752920u,40u,1610612768u,12502u,138442753u,67108864u}/* 21FD */, /*7365*/{0,616u,65537u,76752920u,40u,1610612768u,12510u,138442753u,67108864u}/* 21FE */, /*7366*/{0,616u,65537u,76752920u,40u,1610612768u,12518u,138442753u,67108864u}/* 21FF */, /*7367*/{0,625u,65537u,89171992u,40u,1610612768u,12526u,138442753u,67108864u}/* 2200 */, /*7368*/{0,624u,65537u,76589080u,40u,1744830496u,12534u,138442753u,67108864u}/* 2201 */, /*7369*/{0,625u,65537u,89171992u,40u,1744830496u,12542u,138442753u,67108864u}/* 2202 */, /*7370*/{0,625u,65537u,89171992u,40u,1744830496u,12550u,138442753u,67108864u}/* 2203 */, /*7371*/{656932864u,624u,65537u,76589112u,40u,1744830496u,12550u,335585281u,67108864u}/* 2204 */, /*7372*/{0,624u,65537u,76589080u,40u,1610612768u,12558u,138442753u,67108864u}/* 2205 */, /*7373*/{0,624u,65537u,76589080u,40u,1610612768u,12566u,138442753u,67108864u}/* 2206 */, /*7374*/{0,625u,65537u,89171992u,40u,1610612768u,12574u,138442753u,67108864u}/* 2207 */, /*7375*/{0,103025u,65537u,89171992u,40u,1744830496u,12582u,138442753u,67108864u}/* 2208 */, /*7376*/{657457152u,107120u,65537u,76589112u,40u,1744830496u,12582u,335585281u,67108864u}/* 2209 */, /*7377*/{0,111216u,65537u,76589080u,40u,1744830496u,12590u,138442753u,67108864u}/* 220A */, /*7378*/{0,115313u,65537u,89171992u,40u,1744830496u,12598u,138442753u,67108864u}/* 220B */, /*7379*/{657981440u,119408u,65537u,76589112u,40u,1744830496u,12598u,335585281u,67108864u}/* 220C */, /*7380*/{0,123504u,65537u,76589080u,40u,1744830496u,12606u,138442753u,67108864u}/* 220D */, /*7381*/{0,624u,65537u,76589080u,40u,1610612768u,12622u,138442753u,67108864u}/* 220E */, /*7382*/{0,625u,65537u,89171992u,40u,1610612768u,12630u,138442753u,67108864u}/* 220F */, /*7383*/{0,624u,65537u,76589080u,40u,1610612768u,12638u,138442753u,67108864u}/* 2210 */, /*7384*/{0,625u,65537u,89171992u,40u,1744830496u,12646u,138442753u,67108864u}/* 2211 */, /*7385*/{0,624u,65537u,77630488u,40u,1610678304u,12742u,138442753u,67108864u}/* 2212 */, /*7386*/{0,624u,65537u,77631512u,40u,1610612768u,12758u,138442753u,67108864u}/* 2213 */, /*7387*/{0,624u,65537u,76589080u,40u,1610612768u,12766u,138442753u,67108864u}/* 2214 */, /*7388*/{0,127601u,65537u,89171992u,40u,1744830496u,12774u,138442753u,67108864u}/* 2215 */, /*7389*/{0,624u,65537u,76589080u,40u,1744830496u,12790u,138442753u,67108864u}/* 2216 */, /*7390*/{0,624u,65537u,76589080u,40u,1610612768u,12798u,138442753u,67108864u}/* 2217 */, /*7391*/{0,624u,65537u,76589080u,40u,1610612768u,12806u,138442753u,67108864u}/* 2218 */, /*7392*/{0,624u,65537u,76589080u,40u,1610612768u,12814u,138442753u,67108864u}/* 2219 */, /*7393*/{0,625u,65537u,89171992u,40u,1744830496u,12822u,138442753u,67108864u}/* 221A */, /*7394*/{0,624u,65537u,76589080u,40u,1744830496u,12830u,138442753u,67108864u}/* 221B */, /*7395*/{0,624u,65537u,76589080u,40u,1744830496u,12846u,138442753u,67108864u}/* 221C */, /*7396*/{0,625u,65537u,89171992u,40u,1744830496u,12862u,138442753u,67108864u}/* 221D */, /*7397*/{0,625u,65537u,89171992u,40u,1610612768u,12870u,138442753u,67108864u}/* 221E */, /*7398*/{0,625u,65537u,89171992u,40u,1744830496u,12878u,138442753u,67108864u}/* 221F */, /*7399*/{0,625u,65537u,89171992u,40u,1744830496u,12886u,138442753u,67108864u}/* 2220 */, /*7400*/{0,624u,65537u,76589080u,40u,1744830496u,12894u,138442753u,67108864u}/* 2221 */, /*7401*/{0,624u,65537u,76589080u,40u,1744830496u,12902u,138442753u,67108864u}/* 2222 */, /*7402*/{0,625u,65537u,89171992u,40u,1610612768u,12910u,138442753u,67108864u}/* 2223 */, /*7403*/{658505728u,624u,65537u,76589112u,40u,1744830496u,12910u,335585281u,67108864u}/* 2224 */, /*7404*/{0,625u,65537u,89171992u,40u,1610612768u,12918u,138442753u,67108864u}/* 2225 */, /*7405*/{659030016u,624u,65537u,76589112u,40u,1744830496u,12918u,335585281u,67108864u}/* 2226 */, /*7406*/{0,625u,65537u,89171992u,40u,1610612768u,12926u,138442753u,67108864u}/* 2227 */, /*7407*/{0,625u,65537u,89171992u,40u,1610612768u,12934u,138442753u,67108864u}/* 2228 */, /*7408*/{0,625u,65537u,89171992u,40u,1610612768u,12942u,138442753u,67108864u}/* 2229 */, /*7409*/{0,625u,65537u,89171992u,40u,1610612768u,12950u,138442753u,67108864u}/* 222A */, /*7410*/{0,625u,65537u,89171992u,40u,1744830496u,12958u,138442753u,67108864u}/* 222B */, /*7411*/{659554304u,625u,65537u,89172056u,32u,1745354784u,25902u,272707585u,67108864u}/* 222C */, /*7412*/{660078592u,624u,65537u,76589144u,32u,1745354784u,38846u,406958081u,67108864u}/* 222D */, /*7413*/{0,625u,65537u,89171992u,40u,1744830496u,12966u,138442753u,67108864u}/* 222E */, /*7414*/{660602880u,624u,65537u,76589144u,32u,1745354784u,25918u,272707585u,67108864u}/* 222F */, /*7415*/{661127168u,624u,65537u,76589144u,32u,1745354784u,38870u,406958081u,67108864u}/* 2230 */, /*7416*/{0,624u,65537u,76589080u,40u,1744830496u,12974u,138442753u,67108864u}/* 2231 */, /*7417*/{0,624u,65537u,76589080u,40u,1744830496u,12982u,138442753u,67108864u}/* 2232 */, /*7418*/{0,624u,65537u,76589080u,40u,1744830496u,12990u,138442753u,67108864u}/* 2233 */, /*7419*/{0,625u,65537u,89171992u,40u,1610612768u,12998u,138442753u,67108864u}/* 2234 */, /*7420*/{0,625u,65537u,89171992u,40u,1610612768u,13006u,138442753u,67108864u}/* 2235 */, /*7421*/{0,625u,65537u,89171992u,40u,1610612768u,13014u,138442753u,67108864u}/* 2236 */, /*7422*/{0,625u,65537u,89171992u,40u,1610612768u,13022u,138442753u,67108864u}/* 2237 */, /*7423*/{0,624u,65537u,76589080u,40u,1610612768u,13030u,138442753u,67108864u}/* 2238 */, /*7424*/{0,624u,65537u,76589080u,40u,1744830496u,13038u,138442753u,67108864u}/* 2239 */, /*7425*/{0,624u,65537u,76589080u,40u,1610612768u,13046u,138442753u,67108864u}/* 223A */, /*7426*/{0,624u,65537u,76589080u,40u,1744830496u,13054u,138442753u,67108864u}/* 223B */, /*7427*/{0,131697u,65537u,89171992u,40u,1744830496u,13062u,138442753u,67108864u}/* 223C */, /*7428*/{0,135793u,65537u,89171992u,40u,1744830496u,13070u,138442753u,67108864u}/* 223D */, /*7429*/{0,624u,65537u,76589080u,40u,1744830496u,13078u,138442753u,67108864u}/* 223E */, /*7430*/{0,624u,65537u,76589080u,40u,1744830496u,13086u,138442753u,67108864u}/* 223F */, /*7431*/{0,624u,65537u,76589080u,40u,1744830496u,13094u,138442753u,67108864u}/* 2240 */, /*7432*/{661651456u,624u,65537u,76589112u,40u,1744830496u,13062u,335585281u,67108864u}/* 2241 */, /*7433*/{0,624u,65537u,76589080u,40u,1744830496u,13102u,138442753u,67108864u}/* 2242 */, /*7434*/{0,139888u,65537u,76589080u,40u,1744830496u,13110u,138442753u,67108864u}/* 2243 */, /*7435*/{662175744u,624u,65537u,76589112u,40u,1744830496u,13110u,335585281u,67108864u}/* 2244 */, /*7436*/{0,624u,65537u,76589080u,40u,1744830496u,13118u,138442753u,67108864u}/* 2245 */, /*7437*/{0,624u,65537u,76589080u,40u,1744830496u,13126u,138442753u,67108864u}/* 2246 */, /*7438*/{662700032u,624u,65537u,76589112u,40u,1744830496u,13118u,335585281u,67108864u}/* 2247 */, /*7439*/{0,625u,65537u,89171992u,40u,1744830496u,13134u,138442753u,67108864u}/* 2248 */, /*7440*/{663224320u,624u,65537u,76589112u,40u,1744830496u,13134u,335585281u,67108864u}/* 2249 */, /*7441*/{0,624u,65537u,76589080u,40u,1744830496u,13142u,138442753u,67108864u}/* 224A */, /*7442*/{0,624u,65537u,76589080u,40u,1744830496u,13150u,138442753u,67108864u}/* 224B */, /*7443*/{0,625u,65537u,89171992u,40u,1744830496u,13158u,138442753u,67108864u}/* 224C */, /*7444*/{0,624u,65537u,76589080u,40u,1610612768u,13166u,138442753u,67108864u}/* 224D */, /*7445*/{0,624u,65537u,76589080u,40u,1610612768u,13174u,138442753u,67108864u}/* 224E */, /*7446*/{0,624u,65537u,76589080u,40u,1610612768u,13182u,138442753u,67108864u}/* 224F */, /*7447*/{0,624u,65537u,76589080u,40u,1610612768u,13190u,138442753u,67108864u}/* 2250 */, /*7448*/{0,624u,65537u,76589080u,40u,1610612768u,13198u,138442753u,67108864u}/* 2251 */, /*7449*/{0,143985u,65537u,89171992u,40u,1744830496u,13206u,138442753u,67108864u}/* 2252 */, /*7450*/{0,148080u,65537u,76589080u,40u,1744830496u,13214u,138442753u,67108864u}/* 2253 */, /*7451*/{0,152176u,65537u,76589080u,40u,1744830496u,13222u,138442753u,67108864u}/* 2254 */, /*7452*/{0,156272u,65537u,76589080u,40u,1744830496u,13230u,138442753u,67108864u}/* 2255 */, /*7453*/{0,624u,65537u,76589080u,40u,1610612768u,13238u,138442753u,67108864u}/* 2256 */, /*7454*/{0,624u,65537u,76589080u,40u,1610612768u,13246u,138442753u,67108864u}/* 2257 */, /*7455*/{0,624u,65537u,76589080u,40u,1610612768u,13254u,138442753u,67108864u}/* 2258 */, /*7456*/{0,624u,65537u,76589080u,40u,1610612768u,13262u,138442753u,67108864u}/* 2259 */, /*7457*/{0,624u,65537u,76589080u,40u,1610612768u,13270u,138442753u,67108864u}/* 225A */, /*7458*/{0,624u,65537u,76589080u,40u,1610612768u,13278u,138442753u,67108864u}/* 225B */, /*7459*/{0,624u,65537u,76589080u,40u,1610612768u,13286u,138442753u,67108864u}/* 225C */, /*7460*/{0,624u,65537u,76589080u,40u,1610612768u,13294u,138442753u,67108864u}/* 225D */, /*7461*/{0,624u,65537u,76589080u,40u,1610612768u,13302u,138442753u,67108864u}/* 225E */, /*7462*/{0,624u,65537u,76589080u,40u,1744830496u,13310u,138442753u,67108864u}/* 225F */, /*7463*/{663748608u,625u,65537u,89172024u,40u,1744830496u,12694u,335585281u,67108864u}/* 2260 */, /*7464*/{0,625u,65537u,89171992u,40u,1610612768u,13318u,138442753u,67108864u}/* 2261 */, /*7465*/{664272896u,624u,65537u,76589112u,40u,1744830496u,13318u,335585281u,67108864u}/* 2262 */, /*7466*/{0,624u,65537u,76589080u,40u,1610612768u,13326u,138442753u,67108864u}/* 2263 */, /*7467*/{0,160369u,65537u,89171992u,40u,1744830496u,13334u,138442753u,67108864u}/* 2264 */, /*7468*/{0,164465u,65537u,89171992u,40u,1744830496u,13342u,138442753u,67108864u}/* 2265 */, /*7469*/{0,168561u,65537u,89171992u,40u,1744830496u,13350u,138442753u,67108864u}/* 2266 */, /*7470*/{0,172657u,65537u,89171992u,40u,1744830496u,13358u,138442753u,67108864u}/* 2267 */, /*7471*/{0,176752u,65537u,76589080u,40u,1744830496u,13366u,138442753u,67108864u}/* 2268 */, /*7472*/{0,180848u,65537u,76589080u,40u,1744830496u,13374u,138442753u,67108864u}/* 2269 */, /*7473*/{0,184945u,65537u,89171992u,40u,1744830496u,13382u,138442753u,67108864u}/* 226A */, /*7474*/{0,189041u,65537u,89171992u,40u,1744830496u,13390u,138442753u,67108864u}/* 226B */, /*7475*/{0,624u,65537u,76589080u,40u,1610612768u,13398u,138442753u,67108864u}/* 226C */, /*7476*/{664797184u,624u,65537u,76589112u,40u,1610612768u,13166u,335585281u,67108864u}/* 226D */, /*7477*/{665321472u,193137u,65537u,89172024u,40u,1744830496u,12686u,335585281u,67108864u}/* 226E */, /*7478*/{665845760u,197233u,65537u,89172024u,40u,1744830496u,12702u,335585281u,67108864u}/* 226F */, /*7479*/{666370048u,201328u,65537u,76589112u,40u,1744830496u,13334u,335585281u,67108864u}/* 2270 */, /*7480*/{666894336u,205424u,65537u,76589112u,40u,1744830496u,13342u,335585281u,67108864u}/* 2271 */, /*7481*/{0,209520u,65537u,76589080u,40u,1744830496u,13406u,138442753u,67108864u}/* 2272 */, /*7482*/{0,213616u,65537u,76589080u,40u,1744830496u,13414u,138442753u,67108864u}/* 2273 */, /*7483*/{667418624u,217712u,65537u,76589112u,40u,1744830496u,13406u,335585281u,67108864u}/* 2274 */, /*7484*/{667942912u,221808u,65537u,76589112u,40u,1744830496u,13414u,335585281u,67108864u}/* 2275 */, /*7485*/{0,225904u,65537u,76589080u,40u,1744830496u,13422u,138442753u,67108864u}/* 2276 */, /*7486*/{0,230000u,65537u,76589080u,40u,1744830496u,13430u,138442753u,67108864u}/* 2277 */, /*7487*/{668467200u,234096u,65537u,76589112u,40u,1744830496u,13422u,335585281u,67108864u}/* 2278 */, /*7488*/{668991488u,238192u,65537u,76589112u,40u,1744830496u,13430u,335585281u,67108864u}/* 2279 */, /*7489*/{0,242288u,65537u,76589080u,40u,1744830496u,13438u,138442753u,67108864u}/* 227A */, /*7490*/{0,246384u,65537u,76589080u,40u,1744830496u,13446u,138442753u,67108864u}/* 227B */, /*7491*/{0,250480u,65537u,76589080u,40u,1744830496u,13454u,138442753u,67108864u}/* 227C */, /*7492*/{0,254576u,65537u,76589080u,40u,1744830496u,13462u,138442753u,67108864u}/* 227D */, /*7493*/{0,258672u,65537u,76589080u,40u,1744830496u,13470u,138442753u,67108864u}/* 227E */, /*7494*/{0,262768u,65537u,76589080u,40u,1744830496u,13478u,138442753u,67108864u}/* 227F */, /*7495*/{669515776u,266864u,65537u,76589112u,40u,1744830496u,13438u,335585281u,67108864u}/* 2280 */, /*7496*/{670040064u,270960u,65537u,76589112u,40u,1744830496u,13446u,335585281u,67108864u}/* 2281 */, /*7497*/{0,275057u,65537u,89171992u,40u,1744830496u,13486u,138442753u,67108864u}/* 2282 */, /*7498*/{0,279153u,65537u,89171992u,40u,1744830496u,13494u,138442753u,67108864u}/* 2283 */, /*7499*/{670564352u,283248u,65537u,76589112u,40u,1744830496u,13486u,335585281u,67108864u}/* 2284 */, /*7500*/{671088640u,287344u,65537u,76589112u,40u,1744830496u,13494u,335585281u,67108864u}/* 2285 */, /*7501*/{0,291441u,65537u,89171992u,40u,1744830496u,13502u,138442753u,67108864u}/* 2286 */, /*7502*/{0,295537u,65537u,89171992u,40u,1744830496u,13510u,138442753u,67108864u}/* 2287 */, /*7503*/{671612928u,299632u,65537u,76589112u,40u,1744830496u,13502u,335585281u,67108864u}/* 2288 */, /*7504*/{672137216u,303728u,65537u,76589112u,40u,1744830496u,13510u,335585281u,67108864u}/* 2289 */, /*7505*/{0,307824u,65537u,76589080u,40u,1744830496u,13518u,138442753u,67108864u}/* 228A */, /*7506*/{0,311920u,65537u,76589080u,40u,1744830496u,13526u,138442753u,67108864u}/* 228B */, /*7507*/{0,624u,65537u,76589080u,40u,1744830496u,13534u,138442753u,67108864u}/* 228C */, /*7508*/{0,624u,65537u,76589080u,40u,1610612768u,13542u,138442753u,67108864u}/* 228D */, /*7509*/{0,624u,65537u,76589080u,40u,1610612768u,13550u,138442753u,67108864u}/* 228E */, /*7510*/{0,316016u,65537u,76589080u,40u,1744830496u,13558u,138442753u,67108864u}/* 228F */, /*7511*/{0,320112u,65537u,76589080u,40u,1744830496u,13566u,138442753u,67108864u}/* 2290 */, /*7512*/{0,324208u,65537u,76589080u,40u,1744830496u,13574u,138442753u,67108864u}/* 2291 */, /*7513*/{0,328304u,65537u,76589080u,40u,1744830496u,13582u,138442753u,67108864u}/* 2292 */, /*7514*/{0,624u,65537u,76589080u,40u,1610612768u,13590u,138442753u,67108864u}/* 2293 */, /*7515*/{0,624u,65537u,76589080u,40u,1610612768u,13598u,138442753u,67108864u}/* 2294 */, /*7516*/{0,625u,65537u,89171992u,40u,1610612768u,13606u,138442753u,67108864u}/* 2295 */, /*7517*/{0,624u,65537u,76589080u,40u,1610612768u,13614u,138442753u,67108864u}/* 2296 */, /*7518*/{0,624u,65537u,76589080u,40u,1610612768u,13622u,138442753u,67108864u}/* 2297 */, /*7519*/{0,332400u,65537u,76589080u,40u,1744830496u,13630u,138442753u,67108864u}/* 2298 */, /*7520*/{0,625u,65537u,89171992u,40u,1610612768u,13638u,138442753u,67108864u}/* 2299 */, /*7521*/{0,624u,65537u,76589080u,40u,1610612768u,13646u,138442753u,67108864u}/* 229A */, /*7522*/{0,624u,65537u,76589080u,40u,1610612768u,13654u,138442753u,67108864u}/* 229B */, /*7523*/{0,624u,65537u,76589080u,40u,1610612768u,13662u,138442753u,67108864u}/* 229C */, /*7524*/{0,624u,65537u,76589080u,40u,1610612768u,13670u,138442753u,67108864u}/* 229D */, /*7525*/{0,624u,65537u,76589080u,40u,1610612768u,13678u,138442753u,67108864u}/* 229E */, /*7526*/{0,624u,65537u,76589080u,40u,1610612768u,13686u,138442753u,67108864u}/* 229F */, /*7527*/{0,624u,65537u,76589080u,40u,1610612768u,13694u,138442753u,67108864u}/* 22A0 */, /*7528*/{0,624u,65537u,76589080u,40u,1610612768u,13702u,138442753u,67108864u}/* 22A1 */, /*7529*/{0,336496u,65537u,76589080u,40u,1744830496u,13710u,138442753u,67108864u}/* 22A2 */, /*7530*/{0,340592u,65537u,76589080u,40u,1744830496u,13718u,138442753u,67108864u}/* 22A3 */, /*7531*/{0,624u,65537u,76589080u,40u,1610612768u,13726u,138442753u,67108864u}/* 22A4 */, /*7532*/{0,625u,65537u,89171992u,40u,1610612768u,13734u,138442753u,67108864u}/* 22A5 */, /*7533*/{0,344688u,65537u,76589080u,40u,1744830496u,13742u,138442753u,67108864u}/* 22A6 */, /*7534*/{0,624u,65537u,76589080u,40u,1744830496u,13750u,138442753u,67108864u}/* 22A7 */, /*7535*/{0,348784u,65537u,76589080u,40u,1744830496u,13758u,138442753u,67108864u}/* 22A8 */, /*7536*/{0,352880u,65537u,76589080u,40u,1744830496u,13766u,138442753u,67108864u}/* 22A9 */, /*7537*/{0,624u,65537u,76589080u,40u,1744830496u,13774u,138442753u,67108864u}/* 22AA */, /*7538*/{0,356976u,65537u,76589080u,40u,1744830496u,13782u,138442753u,67108864u}/* 22AB */, /*7539*/{672661504u,624u,65537u,76589112u,40u,1744830496u,13710u,335585281u,67108864u}/* 22AC */, /*7540*/{673185792u,624u,65537u,76589112u,40u,1744830496u,13758u,335585281u,67108864u}/* 22AD */, /*7541*/{673710080u,624u,65537u,76589112u,40u,1744830496u,13766u,335585281u,67108864u}/* 22AE */, /*7542*/{674234368u,624u,65537u,76589112u,40u,1744830496u,13782u,335585281u,67108864u}/* 22AF */, /*7543*/{0,361072u,65537u,76589080u,40u,1744830496u,13790u,138442753u,67108864u}/* 22B0 */, /*7544*/{0,365168u,65537u,76589080u,40u,1744830496u,13798u,138442753u,67108864u}/* 22B1 */, /*7545*/{0,369264u,65537u,76589080u,40u,1744830496u,13806u,138442753u,67108864u}/* 22B2 */, /*7546*/{0,373360u,65537u,76589080u,40u,1744830496u,13814u,138442753u,67108864u}/* 22B3 */, /*7547*/{0,377456u,65537u,76589080u,40u,1744830496u,13822u,138442753u,67108864u}/* 22B4 */, /*7548*/{0,381552u,65537u,76589080u,40u,1744830496u,13830u,138442753u,67108864u}/* 22B5 */, /*7549*/{0,385648u,65537u,76589080u,40u,1744830496u,13838u,138442753u,67108864u}/* 22B6 */, /*7550*/{0,389744u,65537u,76589080u,40u,1744830496u,13846u,138442753u,67108864u}/* 22B7 */, /*7551*/{0,624u,65537u,76589080u,40u,1744830496u,13854u,138442753u,67108864u}/* 22B8 */, /*7552*/{0,624u,65537u,76589080u,40u,1610612768u,13862u,138442753u,67108864u}/* 22B9 */, /*7553*/{0,624u,65537u,76589080u,40u,1610612768u,13870u,138442753u,67108864u}/* 22BA */, /*7554*/{0,624u,65537u,76589080u,40u,1610612768u,13878u,138442753u,67108864u}/* 22BB */, /*7555*/{0,624u,65537u,76589080u,40u,1610612768u,13886u,138442753u,67108864u}/* 22BC */, /*7556*/{0,624u,65537u,76589080u,40u,1610612768u,13902u,138442753u,67108864u}/* 22BD */, /*7557*/{0,624u,65537u,76589080u,40u,1744830496u,13910u,138442753u,67108864u}/* 22BE */, /*7558*/{0,625u,65537u,89171992u,40u,1744830496u,13918u,138442753u,67108864u}/* 22BF */, /*7559*/{0,624u,65537u,76589080u,40u,1610612768u,13926u,138442753u,67108864u}/* 22C0 */, /*7560*/{0,624u,65537u,76589080u,40u,1610612768u,13934u,138442753u,67108864u}/* 22C1 */, /*7561*/{0,624u,65537u,76589080u,40u,1610612768u,13942u,138442753u,67108864u}/* 22C2 */, /*7562*/{0,624u,65537u,76589080u,40u,1610612768u,13950u,138442753u,67108864u}/* 22C3 */, /*7563*/{0,624u,65537u,76589080u,40u,1610612768u,13958u,138442753u,67108864u}/* 22C4 */, /*7564*/{0,624u,65537u,76589080u,40u,1610612768u,13966u,138442753u,67108864u}/* 22C5 */, /*7565*/{0,624u,65537u,76589080u,40u,1610612768u,13974u,138442753u,67108864u}/* 22C6 */, /*7566*/{0,624u,65537u,76589080u,40u,1610612768u,13982u,138442753u,67108864u}/* 22C7 */, /*7567*/{0,624u,65537u,76589080u,40u,1610612768u,13990u,138442753u,67108864u}/* 22C8 */, /*7568*/{0,393840u,65537u,76589080u,40u,1744830496u,13998u,138442753u,67108864u}/* 22C9 */, /*7569*/{0,397936u,65537u,76589080u,40u,1744830496u,14006u,138442753u,67108864u}/* 22CA */, /*7570*/{0,402032u,65537u,76589080u,40u,1744830496u,14014u,138442753u,67108864u}/* 22CB */, /*7571*/{0,406128u,65537u,76589080u,40u,1744830496u,14022u,138442753u,67108864u}/* 22CC */, /*7572*/{0,410224u,65537u,76589080u,40u,1744830496u,14030u,138442753u,67108864u}/* 22CD */, /*7573*/{0,624u,65537u,76589080u,40u,1610612768u,14038u,138442753u,67108864u}/* 22CE */, /*7574*/{0,624u,65537u,76589080u,40u,1610612768u,14046u,138442753u,67108864u}/* 22CF */, /*7575*/{0,414320u,65537u,76589080u,40u,1744830496u,14054u,138442753u,67108864u}/* 22D0 */, /*7576*/{0,418416u,65537u,76589080u,40u,1744830496u,14062u,138442753u,67108864u}/* 22D1 */, /*7577*/{0,624u,65537u,76589080u,40u,1610612768u,14070u,138442753u,67108864u}/* 22D2 */, /*7578*/{0,624u,65537u,76589080u,40u,1610612768u,14078u,138442753u,67108864u}/* 22D3 */, /*7579*/{0,624u,65537u,76589080u,40u,1610612768u,14086u,138442753u,67108864u}/* 22D4 */, /*7580*/{0,624u,65537u,76589080u,40u,1610612768u,14094u,138442753u,67108864u}/* 22D5 */, /*7581*/{0,422512u,65537u,76589080u,40u,1744830496u,14102u,138442753u,67108864u}/* 22D6 */, /*7582*/{0,426608u,65537u,76589080u,40u,1744830496u,14110u,138442753u,67108864u}/* 22D7 */, /*7583*/{0,430704u,65537u,76589080u,40u,1744830496u,14118u,138442753u,67108864u}/* 22D8 */, /*7584*/{0,434800u,65537u,76589080u,40u,1744830496u,14126u,138442753u,67108864u}/* 22D9 */, /*7585*/{0,438896u,65537u,76589080u,40u,1744830496u,14134u,138442753u,67108864u}/* 22DA */, /*7586*/{0,442992u,65537u,76589080u,40u,1744830496u,14142u,138442753u,67108864u}/* 22DB */, /*7587*/{0,447088u,65537u,76589080u,40u,1744830496u,14150u,138442753u,67108864u}/* 22DC */, /*7588*/{0,451184u,65537u,76589080u,40u,1744830496u,14158u,138442753u,67108864u}/* 22DD */, /*7589*/{0,455280u,65537u,76589080u,40u,1744830496u,14166u,138442753u,67108864u}/* 22DE */, /*7590*/{0,459376u,65537u,76589080u,40u,1744830496u,14174u,138442753u,67108864u}/* 22DF */, /*7591*/{674758656u,463472u,65537u,76589112u,40u,1744830496u,13454u,335585281u,67108864u}/* 22E0 */, /*7592*/{675282944u,467568u,65537u,76589112u,40u,1744830496u,13462u,335585281u,67108864u}/* 22E1 */, /*7593*/{675807232u,471664u,65537u,76589112u,40u,1744830496u,13574u,335585281u,67108864u}/* 22E2 */, /*7594*/{676331520u,475760u,65537u,76589112u,40u,1744830496u,13582u,335585281u,67108864u}/* 22E3 */, /*7595*/{0,479856u,65537u,76589080u,40u,1744830496u,14182u,138442753u,67108864u}/* 22E4 */, /*7596*/{0,483952u,65537u,76589080u,40u,1744830496u,14190u,138442753u,67108864u}/* 22E5 */, /*7597*/{0,488048u,65537u,76589080u,40u,1744830496u,14198u,138442753u,67108864u}/* 22E6 */, /*7598*/{0,492144u,65537u,76589080u,40u,1744830496u,14206u,138442753u,67108864u}/* 22E7 */, /*7599*/{0,496240u,65537u,76589080u,40u,1744830496u,14214u,138442753u,67108864u}/* 22E8 */, /*7600*/{0,500336u,65537u,76589080u,40u,1744830496u,14222u,138442753u,67108864u}/* 22E9 */, /*7601*/{676855808u,504432u,65537u,76589112u,40u,1744830496u,13806u,335585281u,67108864u}/* 22EA */, /*7602*/{677380096u,508528u,65537u,76589112u,40u,1744830496u,13814u,335585281u,67108864u}/* 22EB */, /*7603*/{677904384u,512624u,65537u,76589112u,40u,1744830496u,13822u,335585281u,67108864u}/* 22EC */, /*7604*/{678428672u,516720u,65537u,76589112u,40u,1744830496u,13830u,335585281u,67108864u}/* 22ED */, /*7605*/{0,624u,65537u,76589080u,40u,1610612768u,14230u,138442753u,67108864u}/* 22EE */, /*7606*/{0,624u,65537u,100706328u,40u,1610612768u,14238u,138442753u,67108864u}/* 22EF */, /*7607*/{0,520816u,65537u,76589080u,40u,1744830496u,14246u,138442753u,67108864u}/* 22F0 */, /*7608*/{0,524912u,65537u,76589080u,40u,1744830496u,14254u,138442753u,67108864u}/* 22F1 */, /*7609*/{0,529008u,65537u,76752920u,40u,1744830496u,14262u,138442753u,67108864u}/* 22F2 */, /*7610*/{0,533104u,65537u,76752920u,40u,1744830496u,14270u,138442753u,67108864u}/* 22F3 */, /*7611*/{0,537200u,65537u,76752920u,40u,1744830496u,14278u,138442753u,67108864u}/* 22F4 */, /*7612*/{0,624u,65537u,76752920u,40u,1744830496u,14286u,138442753u,67108864u}/* 22F5 */, /*7613*/{0,541296u,65537u,76752920u,40u,1744830496u,14294u,138442753u,67108864u}/* 22F6 */, /*7614*/{0,545392u,65537u,76752920u,40u,1744830496u,14302u,138442753u,67108864u}/* 22F7 */, /*7615*/{0,624u,65537u,76752920u,40u,1744830496u,14310u,138442753u,67108864u}/* 22F8 */, /*7616*/{0,624u,65537u,76752920u,40u,1744830496u,14318u,138442753u,67108864u}/* 22F9 */, /*7617*/{0,549488u,65537u,76752920u,40u,1744830496u,14326u,138442753u,67108864u}/* 22FA */, /*7618*/{0,553584u,65537u,76752920u,40u,1744830496u,14334u,138442753u,67108864u}/* 22FB */, /*7619*/{0,557680u,65537u,76752920u,40u,1744830496u,14342u,138442753u,67108864u}/* 22FC */, /*7620*/{0,561776u,65537u,76752920u,40u,1744830496u,14350u,138442753u,67108864u}/* 22FD */, /*7621*/{0,565872u,65537u,76752920u,40u,1744830496u,14358u,138442753u,67108864u}/* 22FE */, /*7622*/{0,624u,65537u,76752920u,40u,1744830496u,14366u,138442753u,67108864u}/* 22FF */, /*7623*/{0,632u,65537u,76589083u,40u,1610612768u,14372u,138442753u,67108864u}/* 2300 */, /*7624*/{0,632u,65537u,76687387u,40u,1610612768u,14380u,138442753u,67108864u}/* 2301 */, /*7625*/{0,632u,65537u,76589083u,40u,1610612768u,14388u,138442753u,67108864u}/* 2302 */, /*7626*/{0,632u,65537u,76589083u,40u,1610612768u,14396u,138442753u,67108864u}/* 2303 */, /*7627*/{0,632u,65537u,76589083u,40u,1610612768u,14404u,138442753u,67108864u}/* 2304 */, /*7628*/{0,632u,65537u,76589083u,40u,1610612768u,14412u,138442753u,67108864u}/* 2305 */, /*7629*/{0,632u,65537u,76589083u,40u,1610612768u,14420u,138442753u,67108864u}/* 2306 */, /*7630*/{0,632u,65537u,76589083u,40u,1610612768u,14428u,138442753u,67108864u}/* 2307 */, /*7631*/{0,569976u,65537u,79734804u,106536u,1744830496u,6462u,138442763u,0}/* 2308 */, /*7632*/{0,574072u,65537u,86026261u,106536u,1744830496u,6470u,138442763u,0}/* 2309 */, /*7633*/{0,578168u,65537u,79734804u,106536u,1744830496u,6478u,138442763u,0}/* 230A */, /*7634*/{0,582264u,65537u,86026261u,106536u,1744830496u,6486u,138442763u,0}/* 230B */, /*7635*/{0,632u,65537u,76589083u,40u,1610612768u,14436u,138442753u,67108864u}/* 230C */, /*7636*/{0,632u,65537u,76589083u,40u,1610612768u,14444u,138442753u,67108864u}/* 230D */, /*7637*/{0,632u,65537u,76589083u,40u,1610612768u,14452u,138442753u,67108864u}/* 230E */, /*7638*/{0,632u,65537u,76589083u,40u,1610612768u,14460u,138442753u,67108864u}/* 230F */, /*7639*/{0,632u,65537u,76589083u,40u,1610612768u,14468u,138442753u,67108864u}/* 2310 */, /*7640*/{0,632u,65537u,76589083u,40u,1610612768u,14476u,138442753u,67108864u}/* 2311 */, /*7641*/{0,633u,65537u,89171995u,40u,1610612768u,14484u,138442753u,67108864u}/* 2312 */, /*7642*/{0,632u,65537u,76589083u,40u,1610612768u,14492u,138442753u,67108864u}/* 2313 */, /*7643*/{0,632u,65537u,76589083u,40u,1610612768u,14500u,138442753u,67108864u}/* 2314 */, /*7644*/{0,632u,65537u,76589083u,40u,1610612768u,14508u,138442753u,67108864u}/* 2315 */, /*7645*/{0,632u,65537u,76589083u,40u,1610612768u,14516u,138442753u,67108864u}/* 2316 */, /*7646*/{0,632u,65537u,76589083u,40u,1610612768u,14524u,138442753u,67108864u}/* 2317 */, /*7647*/{0,632u,65537u,76589083u,40u,1610612768u,14532u,138442753u,67108864u}/* 2318 */, /*7648*/{0,632u,65537u,76589083u,40u,1610612768u,14540u,138442753u,67108864u}/* 2319 */, /*7649*/{0,635u,65537u,102803483u,8u,1610617120u,14548u,138442753u,67108864u}/* 231A */, /*7650*/{0,635u,65537u,102803483u,8u,1610617120u,14556u,138442753u,67108864u}/* 231B */, /*7651*/{0,632u,65537u,76589083u,40u,1610612768u,14564u,138442753u,67108864u}/* 231C */, /*7652*/{0,632u,65537u,76589083u,40u,1610612768u,14572u,138442753u,67108864u}/* 231D */, /*7653*/{0,632u,65537u,76589083u,40u,1610612768u,14580u,138442753u,67108864u}/* 231E */, /*7654*/{0,632u,65537u,76589083u,40u,1610612768u,14588u,138442753u,67108864u}/* 231F */, /*7655*/{0,632u,65537u,76589080u,40u,1744830496u,14598u,138442753u,67108864u}/* 2320 */, /*7656*/{0,632u,65537u,76589080u,40u,1744830496u,14606u,138442753u,67108864u}/* 2321 */, /*7657*/{0,632u,65537u,76589083u,40u,1610612768u,14612u,138442753u,67108864u}/* 2322 */, /*7658*/{0,632u,65537u,76589083u,40u,1610612768u,14620u,138442753u,67108864u}/* 2323 */, /*7659*/{0,632u,65537u,76589083u,40u,1610612768u,14628u,138442753u,67108864u}/* 2324 */, /*7660*/{0,632u,65537u,76589083u,40u,1610612768u,14636u,138442753u,67108864u}/* 2325 */, /*7661*/{0,632u,65537u,76589083u,40u,1610612768u,14644u,138442753u,67108864u}/* 2326 */, /*7662*/{0,632u,65537u,76589083u,40u,1610612768u,14652u,138442753u,67108864u}/* 2327 */, /*7663*/{0,632u,65537u,76589083u,8u,1610616864u,14660u,138442753u,67108864u}/* 2328 */, /*7664*/{678952960u,586363u,65536u,79734836u,106496u,1745371232u,7052u,138436611u,0}/* 2329 */, /*7665*/{679477248u,590459u,65536u,86026293u,106496u,1745371232u,7060u,138436611u,0}/* 232A */, /*7666*/{0,632u,65537u,76589083u,40u,1610612768u,14668u,138442753u,67108864u}/* 232B */, /*7667*/{0,632u,65537u,76589083u,40u,1610612768u,14676u,138442753u,67108864u}/* 232C */, /*7668*/{0,632u,65537u,76589083u,40u,1610612768u,14684u,138442753u,67108864u}/* 232D */, /*7669*/{0,632u,65537u,76589083u,40u,1610612768u,14692u,138442753u,67108864u}/* 232E */, /*7670*/{0,632u,65537u,76589083u,40u,1610612768u,14700u,138442753u,67108864u}/* 232F */, /*7671*/{0,632u,65537u,76589083u,40u,1610612768u,14708u,138442753u,67108864u}/* 2330 */, /*7672*/{0,632u,65537u,76589083u,40u,1610612768u,14716u,138442753u,67108864u}/* 2331 */, /*7673*/{0,632u,65537u,76589083u,40u,1610612768u,14724u,138442753u,67108864u}/* 2332 */, /*7674*/{0,632u,65537u,76589083u,40u,1610612768u,14732u,138442753u,67108864u}/* 2333 */, /*7675*/{0,632u,65537u,76589083u,40u,1610612768u,14740u,138442753u,67108864u}/* 2334 */, /*7676*/{0,632u,65537u,76589083u,40u,1610612768u,14748u,138442753u,67108864u}/* 2335 */, /*7677*/{0,632u,65537u,76578843u,40u,1610612768u,14756u,138442753u,67108864u}/* 2336 */, /*7678*/{0,632u,65537u,76578843u,40u,1610612768u,14764u,138442753u,67108864u}/* 2337 */, /*7679*/{0,632u,65537u,76578843u,40u,1610612768u,14772u,138442753u,67108864u}/* 2338 */, /*7680*/{0,632u,65537u,76578843u,40u,1610612768u,14780u,138442753u,67108864u}/* 2339 */, /*7681*/{0,632u,65537u,76578843u,40u,1610612768u,14788u,138442753u,67108864u}/* 233A */, /*7682*/{0,632u,65537u,76578843u,40u,1610612768u,14796u,138442753u,67108864u}/* 233B */, /*7683*/{0,632u,65537u,76578843u,40u,1610612768u,14804u,138442753u,67108864u}/* 233C */, /*7684*/{0,632u,65537u,76578843u,40u,1610612768u,14812u,138442753u,67108864u}/* 233D */, /*7685*/{0,632u,65537u,76578843u,40u,1610612768u,14820u,138442753u,67108864u}/* 233E */, /*7686*/{0,632u,65537u,76578843u,40u,1610612768u,14828u,138442753u,67108864u}/* 233F */, /*7687*/{0,632u,65537u,76578843u,40u,1610612768u,14836u,138442753u,67108864u}/* 2340 */, /*7688*/{0,632u,65537u,76578843u,40u,1610612768u,14844u,138442753u,67108864u}/* 2341 */, /*7689*/{0,632u,65537u,76578843u,40u,1610612768u,14852u,138442753u,67108864u}/* 2342 */, /*7690*/{0,632u,65537u,76578843u,40u,1610612768u,14860u,138442753u,67108864u}/* 2343 */, /*7691*/{0,632u,65537u,76578843u,40u,1610612768u,14868u,138442753u,67108864u}/* 2344 */, /*7692*/{0,632u,65537u,76578843u,40u,1610612768u,14876u,138442753u,67108864u}/* 2345 */, /*7693*/{0,632u,65537u,76578843u,40u,1610612768u,14884u,138442753u,67108864u}/* 2346 */, /*7694*/{0,632u,65537u,76578843u,40u,1610612768u,14892u,138442753u,67108864u}/* 2347 */, /*7695*/{0,632u,65537u,76578843u,40u,1610612768u,14900u,138442753u,67108864u}/* 2348 */, /*7696*/{0,632u,65537u,76578843u,40u,1610612768u,14908u,138442753u,67108864u}/* 2349 */, /*7697*/{0,632u,65537u,76578843u,40u,1610612768u,14916u,138442753u,67108864u}/* 234A */, /*7698*/{0,632u,65537u,76578843u,40u,1610612768u,14924u,138442753u,67108864u}/* 234B */, /*7699*/{0,632u,65537u,76578843u,40u,1610612768u,14932u,138442753u,67108864u}/* 234C */, /*7700*/{0,632u,65537u,76578843u,40u,1610612768u,14940u,138442753u,67108864u}/* 234D */, /*7701*/{0,632u,65537u,76578843u,40u,1610612768u,14948u,138442753u,67108864u}/* 234E */, /*7702*/{0,632u,65537u,76578843u,40u,1610612768u,14956u,138442753u,67108864u}/* 234F */, /*7703*/{0,632u,65537u,76578843u,40u,1610612768u,14964u,138442753u,67108864u}/* 2350 */, /*7704*/{0,632u,65537u,76578843u,40u,1610612768u,14972u,138442753u,67108864u}/* 2351 */, /*7705*/{0,632u,65537u,76578843u,40u,1610612768u,14980u,138442753u,67108864u}/* 2352 */, /*7706*/{0,632u,65537u,76578843u,40u,1610612768u,14988u,138442753u,67108864u}/* 2353 */, /*7707*/{0,632u,65537u,76578843u,40u,1610612768u,14996u,138442753u,67108864u}/* 2354 */, /*7708*/{0,632u,65537u,76578843u,40u,1610612768u,15004u,138442753u,67108864u}/* 2355 */, /*7709*/{0,632u,65537u,76578843u,40u,1610612768u,15012u,138442753u,67108864u}/* 2356 */, /*7710*/{0,632u,65537u,76578843u,40u,1610612768u,15020u,138442753u,67108864u}/* 2357 */, /*7711*/{0,632u,65537u,76578843u,40u,1610612768u,15028u,138442753u,67108864u}/* 2358 */, /*7712*/{0,632u,65537u,76578843u,40u,1610612768u,15036u,138442753u,67108864u}/* 2359 */, /*7713*/{0,632u,65537u,76578843u,40u,1610612768u,15044u,138442753u,67108864u}/* 235A */, /*7714*/{0,632u,65537u,76578843u,40u,1610612768u,15052u,138442753u,67108864u}/* 235B */, /*7715*/{0,632u,65537u,76578843u,40u,1610612768u,15060u,138442753u,67108864u}/* 235C */, /*7716*/{0,632u,65537u,76578843u,40u,1610612768u,15068u,138442753u,67108864u}/* 235D */, /*7717*/{0,632u,65537u,76578843u,40u,1610612768u,15076u,138442753u,67108864u}/* 235E */, /*7718*/{0,632u,65537u,76578843u,40u,1610612768u,15084u,138442753u,67108864u}/* 235F */, /*7719*/{0,632u,65537u,76578843u,40u,1610612768u,15092u,138442753u,67108864u}/* 2360 */, /*7720*/{0,632u,65537u,76578843u,40u,1610612768u,15100u,138442753u,67108864u}/* 2361 */, /*7721*/{0,632u,65537u,76578843u,40u,1610612768u,15108u,138442753u,67108864u}/* 2362 */, /*7722*/{0,632u,65537u,76578843u,40u,1610612768u,15116u,138442753u,67108864u}/* 2363 */, /*7723*/{0,632u,65537u,76578843u,40u,1610612768u,15124u,138442753u,67108864u}/* 2364 */, /*7724*/{0,632u,65537u,76578843u,40u,1610612768u,15132u,138442753u,67108864u}/* 2365 */, /*7725*/{0,632u,65537u,76578843u,40u,1610612768u,15140u,138442753u,67108864u}/* 2366 */, /*7726*/{0,632u,65537u,76578843u,40u,1610612768u,15148u,138442753u,67108864u}/* 2367 */, /*7727*/{0,632u,65537u,76578843u,40u,1610612768u,15156u,138442753u,67108864u}/* 2368 */, /*7728*/{0,632u,65537u,76578843u,40u,1610612768u,15164u,138442753u,67108864u}/* 2369 */, /*7729*/{0,632u,65537u,76578843u,40u,1610612768u,15172u,138442753u,67108864u}/* 236A */, /*7730*/{0,632u,65537u,76578843u,40u,1610612768u,15180u,138442753u,67108864u}/* 236B */, /*7731*/{0,632u,65537u,76578843u,40u,1610612768u,15188u,138442753u,67108864u}/* 236C */, /*7732*/{0,632u,65537u,76578843u,40u,1610612768u,15196u,138442753u,67108864u}/* 236D */, /*7733*/{0,632u,65537u,76578843u,40u,1610612768u,15204u,138442753u,67108864u}/* 236E */, /*7734*/{0,632u,65537u,76578843u,40u,1610612768u,15212u,138442753u,67108864u}/* 236F */, /*7735*/{0,632u,65537u,76578843u,40u,1610612768u,15220u,138442753u,67108864u}/* 2370 */, /*7736*/{0,632u,65537u,76578843u,40u,1610612768u,15228u,138442753u,67108864u}/* 2371 */, /*7737*/{0,632u,65537u,76578843u,40u,1610612768u,15236u,138442753u,67108864u}/* 2372 */, /*7738*/{0,632u,65537u,76578843u,40u,1610612768u,15244u,138442753u,67108864u}/* 2373 */, /*7739*/{0,632u,65537u,76578843u,40u,1610612768u,15252u,138442753u,67108864u}/* 2374 */, /*7740*/{0,632u,65537u,76578843u,40u,1610612768u,15260u,138442753u,67108864u}/* 2375 */, /*7741*/{0,632u,65537u,76578843u,40u,1610612768u,15268u,138442753u,67108864u}/* 2376 */, /*7742*/{0,632u,65537u,76578843u,40u,1610612768u,15276u,138442753u,67108864u}/* 2377 */, /*7743*/{0,632u,65537u,76578843u,40u,1610612768u,15284u,138442753u,67108864u}/* 2378 */, /*7744*/{0,632u,65537u,76578843u,40u,1610612768u,15292u,138442753u,67108864u}/* 2379 */, /*7745*/{0,632u,65537u,76578843u,40u,1610612768u,15300u,138442753u,67108864u}/* 237A */, /*7746*/{0,632u,65537u,76687387u,40u,1610612768u,15308u,138442753u,67108864u}/* 237B */, /*7747*/{0,632u,65537u,76752920u,40u,1610612768u,15318u,138442753u,67108864u}/* 237C */, /*7748*/{0,632u,65537u,76687387u,40u,1610612768u,15324u,138442753u,67108864u}/* 237D */, /*7749*/{0,632u,65537u,76687387u,40u,1610612768u,15332u,138442753u,67108864u}/* 237E */, /*7750*/{0,632u,65537u,76687387u,40u,1610612768u,15340u,138442753u,67108864u}/* 237F */, /*7751*/{0,632u,65537u,76687387u,40u,1610612768u,15348u,138442753u,67108864u}/* 2380 */, /*7752*/{0,632u,65537u,76687387u,40u,1610612768u,15356u,138442753u,67108864u}/* 2381 */, /*7753*/{0,632u,65537u,76687387u,40u,1610612768u,15364u,138442753u,67108864u}/* 2382 */, /*7754*/{0,632u,65537u,76687387u,40u,1610612768u,15372u,138442753u,67108864u}/* 2383 */, /*7755*/{0,632u,65537u,76687387u,40u,1610612768u,15380u,138442753u,67108864u}/* 2384 */, /*7756*/{0,632u,65537u,76687387u,40u,1610612768u,15388u,138442753u,67108864u}/* 2385 */, /*7757*/{0,632u,65537u,76687387u,40u,1610612768u,15396u,138442753u,67108864u}/* 2386 */, /*7758*/{0,632u,65537u,76687387u,40u,1610612768u,15404u,138442753u,67108864u}/* 2387 */, /*7759*/{0,632u,65537u,76687387u,40u,1610612768u,15412u,138442753u,67108864u}/* 2388 */, /*7760*/{0,632u,65537u,76687387u,40u,1610612768u,15420u,138442753u,67108864u}/* 2389 */, /*7761*/{0,632u,65537u,76687387u,40u,1610612768u,15428u,138442753u,67108864u}/* 238A */, /*7762*/{0,632u,65537u,76687387u,40u,1610612768u,15436u,138442753u,67108864u}/* 238B */, /*7763*/{0,632u,65537u,76687387u,40u,1610612768u,15444u,138442753u,67108864u}/* 238C */, /*7764*/{0,632u,65537u,76687387u,40u,1610612768u,15452u,138442753u,67108864u}/* 238D */, /*7765*/{0,632u,65537u,76687387u,40u,1610612768u,15460u,138442753u,67108864u}/* 238E */, /*7766*/{0,632u,65537u,76687387u,40u,1610612768u,15468u,138442753u,67108864u}/* 238F */, /*7767*/{0,632u,65537u,76687387u,40u,1610612768u,15476u,138442753u,67108864u}/* 2390 */, /*7768*/{0,632u,65537u,76687387u,40u,1610612768u,15484u,138442753u,67108864u}/* 2391 */, /*7769*/{0,632u,65537u,76687387u,40u,1610612768u,15492u,138442753u,67108864u}/* 2392 */, /*7770*/{0,632u,65537u,76687387u,40u,1610612768u,15500u,138442753u,67108864u}/* 2393 */, /*7771*/{0,632u,65537u,76687387u,40u,1610612768u,15508u,138442753u,67108864u}/* 2394 */, /*7772*/{0,632u,65537u,76677147u,40u,1610612768u,15516u,138442753u,67108864u}/* 2395 */, /*7773*/{0,632u,65537u,76687387u,40u,1610612768u,15524u,138442753u,67108864u}/* 2396 */, /*7774*/{0,632u,65537u,76687387u,40u,1610612768u,15532u,138442753u,67108864u}/* 2397 */, /*7775*/{0,632u,65537u,76687387u,40u,1610612768u,15540u,138442753u,67108864u}/* 2398 */, /*7776*/{0,632u,65537u,76687387u,40u,1610612768u,15548u,138442753u,67108864u}/* 2399 */, /*7777*/{0,632u,65537u,76687387u,40u,1610612768u,15556u,138442753u,67108864u}/* 239A */, /*7778*/{0,632u,65537u,76752920u,40u,1610612768u,15566u,138442753u,67108864u}/* 239B */, /*7779*/{0,632u,65537u,76752920u,40u,1610612768u,15574u,138442753u,67108864u}/* 239C */, /*7780*/{0,632u,65537u,76752920u,40u,1610612768u,15582u,138442753u,67108864u}/* 239D */, /*7781*/{0,632u,65537u,76752920u,40u,1610612768u,15590u,138442753u,67108864u}/* 239E */, /*7782*/{0,632u,65537u,76752920u,40u,1610612768u,15598u,138442753u,67108864u}/* 239F */, /*7783*/{0,632u,65537u,76752920u,40u,1610612768u,15606u,138442753u,67108864u}/* 23A0 */, /*7784*/{0,632u,65537u,76752920u,40u,1610612768u,15614u,138442753u,67108864u}/* 23A1 */, /*7785*/{0,632u,65537u,76752920u,40u,1610612768u,15622u,138442753u,67108864u}/* 23A2 */, /*7786*/{0,632u,65537u,76752920u,40u,1610612768u,15630u,138442753u,67108864u}/* 23A3 */, /*7787*/{0,632u,65537u,76752920u,40u,1610612768u,15638u,138442753u,67108864u}/* 23A4 */, /*7788*/{0,632u,65537u,76752920u,40u,1610612768u,15646u,138442753u,67108864u}/* 23A5 */, /*7789*/{0,632u,65537u,76752920u,40u,1610612768u,15654u,138442753u,67108864u}/* 23A6 */, /*7790*/{0,632u,65537u,76752920u,40u,1610612768u,15662u,138442753u,67108864u}/* 23A7 */, /*7791*/{0,632u,65537u,76752920u,40u,1610612768u,15670u,138442753u,67108864u}/* 23A8 */, /*7792*/{0,632u,65537u,76752920u,40u,1610612768u,15678u,138442753u,67108864u}/* 23A9 */, /*7793*/{0,632u,65537u,76752920u,40u,1610612768u,15686u,138442753u,67108864u}/* 23AA */, /*7794*/{0,632u,65537u,76752920u,40u,1610612768u,15694u,138442753u,67108864u}/* 23AB */, /*7795*/{0,632u,65537u,76752920u,40u,1610612768u,15702u,138442753u,67108864u}/* 23AC */, /*7796*/{0,632u,65537u,76752920u,40u,1610612768u,15710u,138442753u,67108864u}/* 23AD */, /*7797*/{0,632u,65537u,76752920u,40u,1610612768u,15718u,138442753u,67108864u}/* 23AE */, /*7798*/{0,632u,65537u,76752920u,40u,1610612768u,15726u,138442753u,67108864u}/* 23AF */, /*7799*/{0,632u,65537u,76752920u,40u,1610612768u,15734u,138442753u,67108864u}/* 23B0 */, /*7800*/{0,632u,65537u,76752920u,40u,1610612768u,15742u,138442753u,67108864u}/* 23B1 */, /*7801*/{0,632u,65537u,76752920u,40u,1610612768u,15750u,138442753u,67108864u}/* 23B2 */, /*7802*/{0,632u,65537u,76752920u,40u,1610612768u,15758u,138442753u,67108864u}/* 23B3 */, /*7803*/{0,632u,65537u,76752923u,40u,1610612768u,15766u,138442761u,67108864u}/* 23B4 */, /*7804*/{0,632u,65537u,76752923u,40u,1610612768u,15774u,138442761u,67108864u}/* 23B5 */, /*7805*/{0,632u,65537u,76752923u,40u,1610612768u,15780u,138442753u,67108864u}/* 23B6 */, /*7806*/{0,632u,65537u,76752923u,40u,1610612768u,15790u,138442761u,67108864u}/* 23B7 */, /*7807*/{0,632u,65537u,76752923u,40u,1610612768u,15796u,138442753u,67108864u}/* 23B8 */, /*7808*/{0,632u,65537u,76752923u,40u,1610612768u,15804u,138442753u,67108864u}/* 23B9 */, /*7809*/{0,632u,65537u,76752923u,40u,1610612768u,15812u,138442753u,67108864u}/* 23BA */, /*7810*/{0,632u,65537u,76752923u,40u,1610612768u,15820u,138442753u,67108864u}/* 23BB */, /*7811*/{0,632u,65537u,76752923u,40u,1610612768u,15828u,138442753u,67108864u}/* 23BC */, /*7812*/{0,632u,65537u,76752923u,40u,1610612768u,15836u,138442753u,67108864u}/* 23BD */, /*7813*/{0,632u,65537u,76752923u,40u,1610612768u,15844u,138442753u,67108864u}/* 23BE */, /*7814*/{0,632u,65537u,76752923u,40u,1610612768u,15852u,138442753u,67108864u}/* 23BF */, /*7815*/{0,632u,65537u,76752923u,40u,1610612768u,15860u,138442753u,67108864u}/* 23C0 */, /*7816*/{0,632u,65537u,76752923u,40u,1610612768u,15868u,138442753u,67108864u}/* 23C1 */, /*7817*/{0,632u,65537u,76752923u,40u,1610612768u,15876u,138442753u,67108864u}/* 23C2 */, /*7818*/{0,632u,65537u,76752923u,40u,1610612768u,15884u,138442753u,67108864u}/* 23C3 */, /*7819*/{0,632u,65537u,76752923u,40u,1610612768u,15892u,138442753u,67108864u}/* 23C4 */, /*7820*/{0,632u,65537u,76752923u,40u,1610612768u,15900u,138442753u,67108864u}/* 23C5 */, /*7821*/{0,632u,65537u,76752923u,40u,1610612768u,15908u,138442753u,67108864u}/* 23C6 */, /*7822*/{0,632u,65537u,76752923u,40u,1610612768u,15916u,138442753u,67108864u}/* 23C7 */, /*7823*/{0,632u,65537u,76752923u,40u,1610612768u,15924u,138442753u,67108864u}/* 23C8 */, /*7824*/{0,632u,65537u,76752923u,40u,1610612768u,15932u,138442753u,67108864u}/* 23C9 */, /*7825*/{0,632u,65537u,76752923u,40u,1610612768u,15940u,138442753u,67108864u}/* 23CA */, /*7826*/{0,632u,65537u,76752923u,40u,1610612768u,15948u,138442753u,67108864u}/* 23CB */, /*7827*/{0,632u,65537u,76752923u,40u,1610612768u,15956u,138442753u,67108864u}/* 23CC */, /*7828*/{0,632u,65537u,76752923u,40u,1610612768u,15964u,138442753u,67108864u}/* 23CD */, /*7829*/{0,632u,65537u,76752923u,40u,1610612768u,15972u,138442753u,67108864u}/* 23CE */, /*7830*/{0,632u,65537u,76785691u,8u,1610616864u,15980u,138442753u,67108864u}/* 23CF */, /*7831*/{0,632u,65537u,76785691u,40u,1610612768u,15990u,138442761u,67108864u}/* 23D0 */, /*7832*/{0,632u,65537u,76818459u,40u,1610612768u,15996u,138442753u,67108864u}/* 23D1 */, /*7833*/{0,632u,65537u,76818459u,40u,1610612768u,16004u,138442753u,67108864u}/* 23D2 */, /*7834*/{0,632u,65537u,76818459u,40u,1610612768u,16012u,138442753u,67108864u}/* 23D3 */, /*7835*/{0,632u,65537u,76818459u,40u,1610612768u,16020u,138442753u,67108864u}/* 23D4 */, /*7836*/{0,632u,65537u,76818459u,40u,1610612768u,16028u,138442753u,67108864u}/* 23D5 */, /*7837*/{0,632u,65537u,76818459u,40u,1610612768u,16036u,138442753u,67108864u}/* 23D6 */, /*7838*/{0,632u,65537u,76818459u,40u,1610612768u,16044u,138442753u,67108864u}/* 23D7 */, /*7839*/{0,632u,65537u,76818459u,40u,1610612768u,16052u,138442753u,67108864u}/* 23D8 */, /*7840*/{0,632u,65537u,76818459u,40u,1610612768u,16060u,138442753u,67108864u}/* 23D9 */, /*7841*/{0,632u,65537u,76818459u,40u,1610612768u,16068u,138442753u,67108864u}/* 23DA */, /*7842*/{0,632u,65537u,76818459u,40u,1610612768u,16076u,138442753u,67108864u}/* 23DB */, /*7843*/{0,632u,65537u,76851224u,40u,1610612768u,16086u,138442753u,67108864u}/* 23DC */, /*7844*/{0,632u,65537u,76851224u,40u,1610612768u,16094u,138442753u,67108864u}/* 23DD */, /*7845*/{0,632u,65537u,76851224u,40u,1610612768u,16102u,138442753u,67108864u}/* 23DE */, /*7846*/{0,632u,65537u,76851224u,40u,1610612768u,16110u,138442753u,67108864u}/* 23DF */, /*7847*/{0,632u,65537u,76851224u,40u,1610612768u,16118u,138442753u,67108864u}/* 23E0 */, /*7848*/{0,632u,65537u,76851224u,40u,1610612768u,16126u,138442753u,67108864u}/* 23E1 */, /*7849*/{0,632u,65537u,76851227u,40u,1610612768u,16134u,138442761u,67108864u}/* 23E2 */, /*7850*/{0,632u,65537u,76851227u,40u,1610612768u,16140u,138442753u,67108864u}/* 23E3 */, /*7851*/{0,632u,65537u,76851227u,40u,1610612768u,16148u,138442753u,67108864u}/* 23E4 */, /*7852*/{0,632u,65537u,76851227u,40u,1610612768u,16156u,138442753u,67108864u}/* 23E5 */, /*7853*/{0,632u,65537u,76851227u,40u,1610612768u,16164u,138442753u,67108864u}/* 23E6 */, /*7854*/{0,632u,65537u,76851227u,40u,1610612768u,16172u,138442753u,67108864u}/* 23E7 */, /*7855*/{0,632u,65537u,76916763u,40u,1610612768u,16180u,138442753u,67108864u}/* 23E8 */, /*7856*/{0,635u,65537u,76949531u,8u,1610617120u,16188u,138442753u,67108864u}/* 23E9 */, /*7857*/{0,635u,65537u,76949531u,8u,1610617120u,16196u,138442753u,67108864u}/* 23EA */, /*7858*/{0,635u,65537u,76949531u,8u,1610617120u,16204u,138442753u,67108864u}/* 23EB */, /*7859*/{0,635u,65537u,76949531u,8u,1610617120u,16212u,138442753u,67108864u}/* 23EC */, /*7860*/{0,632u,65537u,76949531u,8u,1610616864u,16220u,138442753u,67108864u}/* 23ED */, /*7861*/{0,632u,65537u,76949531u,8u,1610616864u,16228u,138442753u,67108864u}/* 23EE */, /*7862*/{0,632u,65537u,76949531u,8u,1610616864u,16236u,138442753u,67108864u}/* 23EF */, /*7863*/{0,635u,65537u,103163931u,8u,1610617120u,16244u,138442753u,67108864u}/* 23F0 */, /*7864*/{0,632u,65537u,103163931u,8u,1610616864u,16252u,138442753u,67108864u}/* 23F1 */, /*7865*/{0,632u,65537u,103163931u,8u,1610616864u,16260u,138442753u,67108864u}/* 23F2 */, /*7866*/{0,635u,65537u,103163931u,8u,1610617120u,16268u,138442753u,67108864u}/* 23F3 */, /*7867*/{0,632u,65537u,77080603u,40u,1610612768u,16276u,138442753u,67108864u}/* 23F4 */, /*7868*/{0,632u,65537u,77080603u,40u,1610612768u,16284u,138442753u,67108864u}/* 23F5 */, /*7869*/{0,632u,65537u,77080603u,40u,1610612768u,16292u,138442753u,67108864u}/* 23F6 */, /*7870*/{0,632u,65537u,77080603u,40u,1610612768u,16300u,138442753u,67108864u}/* 23F7 */, /*7871*/{0,632u,65537u,77080603u,8u,1610616864u,16308u,138442753u,67108864u}/* 23F8 */, /*7872*/{0,632u,65537u,77080603u,8u,1610616864u,16316u,138442753u,67108864u}/* 23F9 */, /*7873*/{0,632u,65537u,77080603u,8u,1610616864u,16324u,138442753u,67108864u}/* 23FA */, /*7874*/{0,632u,65537u,77146139u,40u,1610612768u,16332u,138442753u,67108864u}/* 23FB */, /*7875*/{0,632u,65537u,77146139u,40u,1610612768u,16340u,138442753u,67108864u}/* 23FC */, /*7876*/{0,632u,65537u,77146139u,40u,1610612768u,16348u,138442753u,67108864u}/* 23FD */, /*7877*/{0,632u,65537u,77146139u,40u,1610612768u,16356u,138442753u,67108864u}/* 23FE */, /*7878*/{0,632u,65537u,77178907u,40u,1610612768u,16364u,138442753u,67108864u}/* 23FF */, /*7879*/{0,640u,65537u,76589083u,40u,1610612768u,16372u,138442753u,67108864u}/* 2400 */, /*7880*/{0,640u,65537u,76589083u,40u,1610612768u,16380u,138442753u,67108864u}/* 2401 */, /*7881*/{0,640u,65537u,76589083u,40u,1610612768u,16388u,138442753u,67108864u}/* 2402 */, /*7882*/{0,640u,65537u,76589083u,40u,1610612768u,16396u,138442753u,67108864u}/* 2403 */, /*7883*/{0,640u,65537u,76589083u,40u,1610612768u,16404u,138442753u,67108864u}/* 2404 */, /*7884*/{0,640u,65537u,76589083u,40u,1610612768u,16412u,138442753u,67108864u}/* 2405 */, /*7885*/{0,640u,65537u,76589083u,40u,1610612768u,16420u,138442753u,67108864u}/* 2406 */, /*7886*/{0,640u,65537u,76589083u,40u,1610612768u,16428u,138442753u,67108864u}/* 2407 */, /*7887*/{0,640u,65537u,76589083u,40u,1610612768u,16436u,138442753u,67108864u}/* 2408 */, /*7888*/{0,640u,65537u,76589083u,40u,1610612768u,16444u,138442753u,67108864u}/* 2409 */, /*7889*/{0,640u,65537u,76589083u,40u,1610612768u,16452u,138442753u,67108864u}/* 240A */, /*7890*/{0,640u,65537u,76589083u,40u,1610612768u,16460u,138442753u,67108864u}/* 240B */, /*7891*/{0,640u,65537u,76589083u,40u,1610612768u,16468u,138442753u,67108864u}/* 240C */, /*7892*/{0,640u,65537u,76589083u,40u,1610612768u,16476u,138442753u,67108864u}/* 240D */, /*7893*/{0,640u,65537u,76589083u,40u,1610612768u,16484u,138442753u,67108864u}/* 240E */, /*7894*/{0,640u,65537u,76589083u,40u,1610612768u,16492u,138442753u,67108864u}/* 240F */, /*7895*/{0,640u,65537u,76589083u,40u,1610612768u,16500u,138442753u,67108864u}/* 2410 */, /*7896*/{0,640u,65537u,76589083u,40u,1610612768u,16508u,138442753u,67108864u}/* 2411 */, /*7897*/{0,640u,65537u,76589083u,40u,1610612768u,16516u,138442753u,67108864u}/* 2412 */, /*7898*/{0,640u,65537u,76589083u,40u,1610612768u,16524u,138442753u,67108864u}/* 2413 */, /*7899*/{0,640u,65537u,76589083u,40u,1610612768u,16532u,138442753u,67108864u}/* 2414 */, /*7900*/{0,640u,65537u,76589083u,40u,1610612768u,16540u,138442753u,67108864u}/* 2415 */, /*7901*/{0,640u,65537u,76589083u,40u,1610612768u,16548u,138442753u,67108864u}/* 2416 */, /*7902*/{0,640u,65537u,76589083u,40u,1610612768u,16556u,138442753u,67108864u}/* 2417 */, /*7903*/{0,640u,65537u,76589083u,40u,1610612768u,16564u,138442753u,67108864u}/* 2418 */, /*7904*/{0,640u,65537u,76589083u,40u,1610612768u,16572u,138442753u,67108864u}/* 2419 */, /*7905*/{0,640u,65537u,76589083u,40u,1610612768u,16580u,138442753u,67108864u}/* 241A */, /*7906*/{0,640u,65537u,76589083u,40u,1610612768u,16588u,138442753u,67108864u}/* 241B */, /*7907*/{0,640u,65537u,76589083u,40u,1610612768u,16596u,138442753u,67108864u}/* 241C */, /*7908*/{0,640u,65537u,76589083u,40u,1610612768u,16604u,138442753u,67108864u}/* 241D */, /*7909*/{0,640u,65537u,76589083u,40u,1610612768u,16612u,138442753u,67108864u}/* 241E */, /*7910*/{0,640u,65537u,76589083u,40u,1610612768u,16620u,138442753u,67108864u}/* 241F */, /*7911*/{0,640u,65537u,76589083u,40u,1610612768u,16628u,138442753u,67108864u}/* 2420 */, /*7912*/{0,640u,65537u,76589083u,40u,1610612768u,16636u,138442753u,67108864u}/* 2421 */, /*7913*/{0,640u,65537u,76589083u,40u,1610612768u,16644u,138442753u,67108864u}/* 2422 */, /*7914*/{0,640u,65537u,76589083u,40u,1610612768u,16652u,138442753u,67108864u}/* 2423 */, /*7915*/{0,640u,65537u,76589083u,40u,1610612768u,16660u,138442753u,67108864u}/* 2424 */, /*7916*/{0,640u,65537u,76687387u,40u,1610612768u,16668u,138442753u,67108864u}/* 2425 */, /*7917*/{0,640u,65537u,76687387u,40u,1610612768u,16676u,138442753u,67108864u}/* 2426 */, /*7918*/{0,648u,65537u,76589083u,40u,1610612768u,16684u,138442753u,67108864u}/* 2440 */, /*7919*/{0,648u,65537u,76589083u,40u,1610612768u,16692u,138442753u,67108864u}/* 2441 */, /*7920*/{0,648u,65537u,76589083u,40u,1610612768u,16700u,138442753u,67108864u}/* 2442 */, /*7921*/{0,648u,65537u,76589083u,40u,1610612768u,16708u,138442753u,67108864u}/* 2443 */, /*7922*/{0,648u,65537u,76589083u,40u,1610612768u,16716u,138442753u,67108864u}/* 2444 */, /*7923*/{0,648u,65537u,76589083u,40u,1610612768u,16724u,138442753u,67108864u}/* 2445 */, /*7924*/{0,648u,65537u,76589083u,40u,1610612768u,16732u,138442753u,67108864u}/* 2446 */, /*7925*/{0,648u,65537u,76589083u,40u,1610612768u,16740u,138442753u,67108864u}/* 2447 */, /*7926*/{0,648u,65537u,76589083u,40u,1610612768u,16748u,138442753u,67108864u}/* 2448 */, /*7927*/{0,648u,65537u,76589083u,40u,1610612768u,16756u,138442753u,67108864u}/* 2449 */, /*7928*/{0,648u,65537u,76589083u,40u,1610612768u,16764u,138442753u,67108864u}/* 244A */, /*7929*/{680001536u,657u,536937985u,89172267u,8388644u,1611137056u,58669u,138473472u,0}/* 2460 */, /*7930*/{680525824u,657u,570493441u,89172267u,8388644u,1611137056u,58677u,138473472u,0}/* 2461 */, /*7931*/{681050112u,657u,604047361u,89172267u,8388644u,1611137056u,58685u,138473472u,0}/* 2462 */, /*7932*/{681574400u,657u,637603841u,89172267u,8388644u,1611137056u,58693u,138473472u,0}/* 2463 */, /*7933*/{682098688u,657u,671157249u,89172267u,8388644u,1611137056u,58701u,138473472u,0}/* 2464 */, /*7934*/{682622976u,657u,704714241u,89172267u,8388644u,1611137056u,58709u,138473472u,0}/* 2465 */, /*7935*/{683147264u,657u,738266625u,89172267u,8388644u,1611137056u,58717u,138473472u,0}/* 2466 */, /*7936*/{683671552u,657u,771824641u,89172267u,8388644u,1611137056u,58725u,138473472u,0}/* 2467 */, /*7937*/{684195840u,657u,805377025u,89172267u,8388644u,1611137056u,58733u,138473472u,0}/* 2468 */, /*7938*/{684720128u,657u,822157313u,89172267u,8388642u,1611137056u,117317u,272740352u,0}/* 2469 */, /*7939*/{685244416u,657u,838930945u,89172267u,8388642u,1611137056u,117325u,272740352u,0}/* 246A */, /*7940*/{685768704u,657u,855712257u,89172267u,8388642u,1611137056u,117333u,272740352u,0}/* 246B */, /*7941*/{686292992u,657u,872486913u,89172267u,8388642u,1611137056u,117341u,272740352u,0}/* 246C */, /*7942*/{686817280u,657u,889267201u,89172267u,8388642u,1611137056u,117349u,272740352u,0}/* 246D */, /*7943*/{687341568u,657u,906041857u,89172267u,8388642u,1611137056u,117357u,272740352u,0}/* 246E */, /*7944*/{687865856u,657u,922822145u,89172267u,8388642u,1611137056u,117365u,272740352u,0}/* 246F */, /*7945*/{688390144u,657u,939597313u,89172267u,8388642u,1611137056u,117373u,272740352u,0}/* 2470 */, /*7946*/{688914432u,657u,956377089u,89172267u,8388642u,1611137056u,117381u,272740352u,0}/* 2471 */, /*7947*/{689438720u,657u,973154817u,89172267u,8388642u,1611137056u,117389u,272740352u,0}/* 2472 */, /*7948*/{689963008u,657u,989932545u,89172267u,8388642u,1611137056u,117325u,272740352u,0}/* 2473 */, /*7949*/{690487296u,657u,536937985u,89172043u,8388644u,1611137056u,71349u,406958080u,0}/* 2474 */, /*7950*/{691011584u,657u,570493441u,89172043u,8388644u,1611137056u,71357u,406958080u,0}/* 2475 */, /*7951*/{691535872u,657u,604047361u,89172043u,8388644u,1611137056u,71365u,406958080u,0}/* 2476 */, /*7952*/{692060160u,657u,637603841u,89172043u,8388644u,1611137056u,71373u,406958080u,0}/* 2477 */, /*7953*/{692584448u,657u,671157249u,89172043u,8388644u,1611137056u,71381u,406958080u,0}/* 2478 */, /*7954*/{693108736u,657u,704714241u,89172043u,8388644u,1611137056u,71389u,406958080u,0}/* 2479 */, /*7955*/{693633024u,657u,738266625u,89172043u,8388644u,1611137056u,71397u,406958080u,0}/* 247A */, /*7956*/{694157312u,657u,771824641u,89172043u,8388644u,1611137056u,71405u,406958080u,0}/* 247B */, /*7957*/{694681600u,657u,805377025u,89172043u,8388644u,1611137056u,71413u,406958080u,0}/* 247C */, /*7958*/{695205888u,657u,822157313u,89172043u,8388642u,1611137056u,129997u,541208576u,0}/* 247D */, /*7959*/{695730176u,657u,838930945u,89172043u,8388642u,1611137056u,130005u,541208576u,0}/* 247E */, /*7960*/{696254464u,657u,855712257u,89172043u,8388642u,1611137056u,130013u,541208576u,0}/* 247F */, /*7961*/{696778752u,657u,872486913u,89172043u,8388642u,1611137056u,130021u,541208576u,0}/* 2480 */, /*7962*/{697303040u,657u,889267201u,89172043u,8388642u,1611137056u,130029u,541208576u,0}/* 2481 */, /*7963*/{697827328u,657u,906041857u,89172043u,8388642u,1611137056u,130037u,541208576u,0}/* 2482 */, /*7964*/{698351616u,657u,922822145u,89172043u,8388642u,1611137056u,130045u,541208576u,0}/* 2483 */, /*7965*/{698875904u,657u,939597313u,89172043u,8388642u,1611137056u,130053u,541208576u,0}/* 2484 */, /*7966*/{699400192u,657u,956377089u,89172043u,8388642u,1611137056u,130061u,541208576u,0}/* 2485 */, /*7967*/{699924480u,657u,973154817u,89172043u,8388642u,1611137056u,130069u,541208576u,0}/* 2486 */, /*7968*/{700448768u,657u,989932545u,89172043u,8388642u,1611137056u,130005u,541208576u,0}/* 2487 */, /*7969*/{700973056u,657u,536937985u,89163851u,8388644u,1611137056u,63725u,272707584u,0}/* 2488 */, /*7970*/{701497344u,657u,570493441u,89163851u,8388644u,1611137056u,63733u,272707584u,0}/* 2489 */, /*7971*/{702021632u,657u,604047361u,89163851u,8388644u,1611137056u,63741u,272707584u,0}/* 248A */, /*7972*/{702545920u,657u,637603841u,89163851u,8388644u,1611137056u,63749u,272707584u,0}/* 248B */, /*7973*/{703070208u,657u,671157249u,89163851u,8388644u,1611137056u,63757u,272707584u,0}/* 248C */, /*7974*/{703594496u,657u,704714241u,89163851u,8388644u,1611137056u,63765u,272707584u,0}/* 248D */, /*7975*/{704118784u,657u,738266625u,89163851u,8388644u,1611137056u,63773u,272707584u,0}/* 248E */, /*7976*/{704643072u,657u,771824641u,89163851u,8388644u,1611137056u,63781u,272707584u,0}/* 248F */, /*7977*/{705167360u,657u,805377025u,89163851u,8388644u,1611137056u,63789u,272707584u,0}/* 2490 */, /*7978*/{705691648u,657u,822157313u,89163851u,8388642u,1611137056u,122373u,406958080u,0}/* 2491 */, /*7979*/{706215936u,657u,838930945u,89163851u,8388642u,1611137056u,122381u,406958080u,0}/* 2492 */, /*7980*/{706740224u,657u,855712257u,89163851u,8388642u,1611137056u,122389u,406958080u,0}/* 2493 */, /*7981*/{707264512u,657u,872486913u,89163851u,8388642u,1611137056u,122397u,406958080u,0}/* 2494 */, /*7982*/{707788800u,657u,889267201u,89163851u,8388642u,1611137056u,122405u,406958080u,0}/* 2495 */, /*7983*/{708313088u,657u,906041857u,89163851u,8388642u,1611137056u,122413u,406958080u,0}/* 2496 */, /*7984*/{708837376u,657u,922822145u,89163851u,8388642u,1611137056u,122421u,406958080u,0}/* 2497 */, /*7985*/{709361664u,657u,939597313u,89163851u,8388642u,1611137056u,122429u,406958080u,0}/* 2498 */, /*7986*/{709885952u,657u,956377089u,89163851u,8388642u,1611137056u,122437u,406958080u,0}/* 2499 */, /*7987*/{710410240u,657u,973154817u,89163851u,8388642u,1611137056u,122445u,406958080u,0}/* 249A */, /*7988*/{710934528u,657u,989932545u,89163851u,8388642u,1611137056u,122381u,406958080u,0}/* 249B */, /*7989*/{711458816u,657u,65537u,89161819u,32u,1611137056u,71420u,406958080u,67108864u}/* 249C */, /*7990*/{711983104u,657u,65537u,89161819u,32u,1611137056u,71620u,406958080u,67108864u}/* 249D */, /*7991*/{712507392u,657u,65537u,89161819u,32u,1611137056u,71828u,406958080u,67108864u}/* 249E */, /*7992*/{713031680u,657u,65537u,89161819u,32u,1611137056u,71996u,406958080u,67108864u}/* 249F */, /*7993*/{713555968u,657u,65537u,89161819u,32u,1611137056u,72212u,406958080u,67108864u}/* 24A0 */, /*7994*/{714080256u,657u,65537u,89161819u,32u,1611137056u,72684u,406958080u,67108864u}/* 24A1 */, /*7995*/{714604544u,657u,65537u,89161819u,32u,1611137056u,72804u,406958080u,67108864u}/* 24A2 */, /*7996*/{715128832u,657u,65537u,89161819u,32u,1611137056u,73092u,406958080u,67108864u}/* 24A3 */, /*7997*/{715653120u,657u,65537u,89161819u,32u,1611137056u,73300u,406958080u,67108864u}/* 24A4 */, /*7998*/{716177408u,657u,65537u,89161819u,32u,1611137056u,73508u,406958080u,67108864u}/* 24A5 */, /*7999*/{716701696u,657u,65537u,89161819u,32u,1611137056u,73708u,406958080u,67108864u}/* 24A6 */, /*8000*/{717225984u,657u,65537u,89161819u,32u,1611137056u,73852u,406958080u,67108864u}/* 24A7 */, /*8001*/{717750272u,657u,65537u,89161819u,32u,1611137056u,74260u,406958080u,67108864u}/* 24A8 */, /*8002*/{718274560u,657u,65537u,89161819u,32u,1611137056u,74380u,406958080u,67108864u}/* 24A9 */, /*8003*/{718798848u,657u,65537u,89161819u,32u,1611137056u,74668u,406958080u,67108864u}/* 24AA */, /*8004*/{719323136u,657u,65537u,89161819u,32u,1611137056u,75044u,406958080u,67108864u}/* 24AB */, /*8005*/{719847424u,657u,65537u,89161819u,32u,1611137056u,75212u,406958080u,67108864u}/* 24AC */, /*8006*/{720371712u,657u,65537u,89161819u,32u,1611137056u,75356u,406958080u,67108864u}/* 24AD */, /*8007*/{720896000u,657u,65537u,89161819u,32u,1611137056u,75852u,406958080u,67108864u}/* 24AE */, /*8008*/{721420288u,657u,65537u,89161819u,32u,1611137056u,76140u,406958080u,67108864u}/* 24AF */, /*8009*/{721944576u,657u,65537u,89161819u,32u,1611137056u,76396u,406958080u,67108864u}/* 24B0 */, /*8010*/{722468864u,657u,65537u,89161819u,32u,1611137056u,76764u,406958080u,67108864u}/* 24B1 */, /*8011*/{722993152u,657u,65537u,89161819u,32u,1611137056u,76908u,406958080u,67108864u}/* 24B2 */, /*8012*/{723517440u,657u,65537u,89161819u,32u,1611137056u,76988u,406958080u,67108864u}/* 24B3 */, /*8013*/{724041728u,657u,65537u,89161819u,32u,1611137056u,77084u,406958080u,67108864u}/* 24B4 */, /*8014*/{724566016u,657u,65537u,89161819u,32u,1611137056u,77260u,406958080u,67108864u}/* 24B5 */, /*8015*/{725292928u,1572864657u,65537u,89162043u,1507360u,3807903776u,58740u,138523140u,69206016u}/* 24B6 */, /*8016*/{725817344u,1574961809u,65537u,89162043u,1507360u,3807903776u,58940u,138523140u,69206016u}/* 24B7 */, /*8017*/{726341760u,1577058961u,65537u,89162043u,1507360u,3807903776u,59148u,138523140u,69206016u}/* 24B8 */, /*8018*/{726866176u,1579156113u,65537u,89162043u,1507360u,3807903776u,59316u,138523140u,69206016u}/* 24B9 */, /*8019*/{727390592u,1581253265u,65537u,89162043u,1507360u,3807903776u,59532u,138523140u,69206016u}/* 24BA */, /*8020*/{727915008u,1583350417u,65537u,89162043u,1507360u,3807903776u,60004u,138523140u,69206016u}/* 24BB */, /*8021*/{728439424u,1585447569u,65537u,89162043u,1507360u,3807903776u,60124u,138523140u,69206016u}/* 24BC */, /*8022*/{728963840u,1587544721u,65537u,89162043u,1507360u,3807903776u,60412u,138523140u,69206016u}/* 24BD */, /*8023*/{729488256u,1589641873u,65537u,89162043u,1507360u,3807903776u,60620u,138523140u,69206016u}/* 24BE */, /*8024*/{730012672u,1591739025u,65537u,89162043u,1507360u,3807903776u,60828u,138523140u,69206016u}/* 24BF */, /*8025*/{730537088u,1593836177u,65537u,89162043u,1507360u,3807903776u,61028u,138523140u,69206016u}/* 24C0 */, /*8026*/{731061504u,1595933329u,65537u,89162043u,1507360u,3807903776u,61172u,138523140u,69206016u}/* 24C1 */, /*8027*/{731585920u,1598030481u,65537u,89162043u,1507328u,3807907872u,61580u,138523140u,69206016u}/* 24C2 */, /*8028*/{732110336u,1600127633u,65537u,89162043u,1507360u,3807903776u,61700u,138523140u,69206016u}/* 24C3 */, /*8029*/{732634752u,1602224785u,65537u,89162043u,1507360u,3807903776u,61988u,138523140u,69206016u}/* 24C4 */, /*8030*/{733159168u,1604321937u,65537u,89162043u,1507360u,3807903776u,62364u,138523140u,69206016u}/* 24C5 */, /*8031*/{733683584u,1606419089u,65537u,89162043u,1507360u,3807903776u,62532u,138523140u,69206016u}/* 24C6 */, /*8032*/{734208000u,1608516241u,65537u,89162043u,1507360u,3807903776u,62676u,138523140u,69206016u}/* 24C7 */, /*8033*/{734732416u,1610613393u,65537u,89162043u,1507360u,3807903776u,63172u,138523140u,69206016u}/* 24C8 */, /*8034*/{735256832u,1612710545u,65537u,89162043u,1507360u,3807903776u,63460u,138523140u,69206016u}/* 24C9 */, /*8035*/{735781248u,1614807697u,65537u,89162043u,1507360u,3807903776u,63716u,138523140u,69206016u}/* 24CA */, /*8036*/{736305664u,1616904849u,65537u,89162043u,1507360u,3807903776u,64084u,138523140u,69206016u}/* 24CB */, /*8037*/{736830080u,1619002001u,65537u,89162043u,1507360u,3807903776u,64228u,138523140u,69206016u}/* 24CC */, /*8038*/{737354496u,1621099153u,65537u,89162043u,1507360u,3807903776u,64308u,138523140u,69206016u}/* 24CD */, /*8039*/{737878912u,1623196305u,65537u,89162043u,1507360u,3807903776u,64404u,138523140u,69206016u}/* 24CE */, /*8040*/{738403328u,1625293457u,65537u,89162043u,1507360u,3807903776u,64580u,138523140u,69206016u}/* 24CF */, /*8041*/{738927744u,657u,65537u,89162043u,1499168u,3769499680u,8447348u,138474000u,67108864u}/* 24D0 */, /*8042*/{739452160u,657u,65537u,89162043u,1499168u,3769499680u,8447548u,138474000u,67108864u}/* 24D1 */, /*8043*/{739976576u,657u,65537u,89162043u,1499168u,3769499680u,8447756u,138474000u,67108864u}/* 24D2 */, /*8044*/{740500992u,657u,65537u,89162043u,1499168u,3769499680u,8447924u,138474000u,67108864u}/* 24D3 */, /*8045*/{741025408u,657u,65537u,89162043u,1499168u,3769499680u,8448140u,138474000u,67108864u}/* 24D4 */, /*8046*/{741549824u,657u,65537u,89162043u,1499168u,3769499680u,8448612u,138474000u,67108864u}/* 24D5 */, /*8047*/{742074240u,657u,65537u,89162043u,1499168u,3769499680u,8448732u,138474000u,67108864u}/* 24D6 */, /*8048*/{742598656u,657u,65537u,89162043u,1499168u,3769499680u,8449020u,138474000u,67108864u}/* 24D7 */, /*8049*/{743123072u,657u,65537u,89162043u,1499168u,3769499680u,8449228u,138474000u,67108864u}/* 24D8 */, /*8050*/{743647488u,657u,65537u,89162043u,1499168u,3769499680u,8449436u,138474000u,67108864u}/* 24D9 */, /*8051*/{744171904u,657u,65537u,89162043u,1499168u,3769499680u,8449636u,138474000u,67108864u}/* 24DA */, /*8052*/{744696320u,657u,65537u,89162043u,1499168u,3769499680u,8449780u,138474000u,67108864u}/* 24DB */, /*8053*/{745220736u,657u,65537u,89162043u,1499168u,3769499680u,8450188u,138474000u,67108864u}/* 24DC */, /*8054*/{745745152u,657u,65537u,89162043u,1499168u,3769499680u,8450308u,138474000u,67108864u}/* 24DD */, /*8055*/{746269568u,657u,65537u,89162043u,1499168u,3769499680u,8450596u,138474000u,67108864u}/* 24DE */, /*8056*/{746793984u,657u,65537u,89162043u,1499168u,3769499680u,8450972u,138474000u,67108864u}/* 24DF */, /*8057*/{747318400u,657u,65537u,89162043u,1499168u,3769499680u,8451140u,138474000u,67108864u}/* 24E0 */, /*8058*/{747842816u,657u,65537u,89162043u,1499168u,3769499680u,8451284u,138474000u,67108864u}/* 24E1 */, /*8059*/{748367232u,657u,65537u,89162043u,1499168u,3769499680u,8451780u,138474000u,67108864u}/* 24E2 */, /*8060*/{748891648u,657u,65537u,89162043u,1499168u,3769499680u,8452068u,138474000u,67108864u}/* 24E3 */, /*8061*/{749416064u,657u,65537u,89162043u,1499168u,3769499680u,8452324u,138474000u,67108864u}/* 24E4 */, /*8062*/{749940480u,657u,65537u,89162043u,1499168u,3769499680u,8452692u,138474000u,67108864u}/* 24E5 */, /*8063*/{750464896u,657u,65537u,89162043u,1499168u,3769499680u,8452836u,138474000u,67108864u}/* 24E6 */, /*8064*/{750989312u,657u,65537u,89162043u,1499168u,3769499680u,8452916u,138474000u,67108864u}/* 24E7 */, /*8065*/{751513728u,657u,65537u,89162043u,1499168u,3769499680u,8453012u,138474000u,67108864u}/* 24E8 */, /*8066*/{752038144u,657u,65537u,89162043u,1499168u,3769499680u,8453188u,138474000u,67108864u}/* 24E9 */, /*8067*/{752353280u,656u,33620993u,89172267u,8388644u,1611137056u,58661u,138473472u,0}/* 24EA */, /*8068*/{0,657u,838930945u,89335819u,8388650u,1610612768u,117325u,272742400u,0}/* 24EB */, /*8069*/{0,657u,855712257u,89335819u,8388650u,1610612768u,117333u,272742400u,0}/* 24EC */, /*8070*/{0,657u,872486913u,89335819u,8388650u,1610612768u,117341u,272742400u,0}/* 24ED */, /*8071*/{0,657u,889267201u,89335819u,8388650u,1610612768u,117349u,272742400u,0}/* 24EE */, /*8072*/{0,657u,906041857u,89335819u,8388650u,1610612768u,117357u,272742400u,0}/* 24EF */, /*8073*/{0,657u,922822145u,89335819u,8388650u,1610612768u,117365u,272742400u,0}/* 24F0 */, /*8074*/{0,657u,939597313u,89335819u,8388650u,1610612768u,117373u,272742400u,0}/* 24F1 */, /*8075*/{0,657u,956377089u,89335819u,8388650u,1610612768u,117381u,272742400u,0}/* 24F2 */, /*8076*/{0,657u,973154817u,89335819u,8388650u,1610612768u,117389u,272742400u,0}/* 24F3 */, /*8077*/{0,657u,989932545u,89335819u,8388650u,1610612768u,117325u,272742400u,0}/* 24F4 */, /*8078*/{0,657u,536937985u,89335819u,8388652u,1610612768u,58669u,138475520u,0}/* 24F5 */, /*8079*/{0,657u,570493441u,89335819u,8388652u,1610612768u,58677u,138475520u,0}/* 24F6 */, /*8080*/{0,657u,604047361u,89335819u,8388652u,1610612768u,58685u,138475520u,0}/* 24F7 */, /*8081*/{0,657u,637603841u,89335819u,8388652u,1610612768u,58693u,138475520u,0}/* 24F8 */, /*8082*/{0,657u,671157249u,89335819u,8388652u,1610612768u,58701u,138475520u,0}/* 24F9 */, /*8083*/{0,657u,704714241u,89335819u,8388652u,1610612768u,58709u,138475520u,0}/* 24FA */, /*8084*/{0,657u,738266625u,89335819u,8388652u,1610612768u,58717u,138475520u,0}/* 24FB */, /*8085*/{0,657u,771824641u,89335819u,8388652u,1610612768u,58725u,138475520u,0}/* 24FC */, /*8086*/{0,657u,805377025u,89335819u,8388652u,1610612768u,58733u,138475520u,0}/* 24FD */, /*8087*/{0,657u,822157313u,89335819u,8388650u,1610612768u,117317u,272742400u,0}/* 24FE */, /*8088*/{0,657u,33620993u,76785675u,8388652u,1610612768u,58661u,138475520u,0}/* 24FF */, /*8089*/{0,665u,65537u,89171995u,40u,1610612768u,16772u,138442753u,67108864u}/* 2500 */, /*8090*/{0,665u,65537u,89171995u,40u,1610612768u,16780u,138442753u,67108864u}/* 2501 */, /*8091*/{0,665u,65537u,89171995u,40u,1610612768u,16788u,138442753u,67108864u}/* 2502 */, /*8092*/{0,665u,65537u,89171995u,40u,1610612768u,16796u,138442753u,67108864u}/* 2503 */, /*8093*/{0,665u,65537u,89171995u,40u,1610612768u,16804u,138442753u,67108864u}/* 2504 */, /*8094*/{0,665u,65537u,89171995u,40u,1610612768u,16812u,138442753u,67108864u}/* 2505 */, /*8095*/{0,665u,65537u,89171995u,40u,1610612768u,16820u,138442753u,67108864u}/* 2506 */, /*8096*/{0,665u,65537u,89171995u,40u,1610612768u,16828u,138442753u,67108864u}/* 2507 */, /*8097*/{0,665u,65537u,89171995u,40u,1610612768u,16836u,138442753u,67108864u}/* 2508 */, /*8098*/{0,665u,65537u,89171995u,40u,1610612768u,16844u,138442753u,67108864u}/* 2509 */, /*8099*/{0,665u,65537u,89171995u,40u,1610612768u,16852u,138442753u,67108864u}/* 250A */, /*8100*/{0,665u,65537u,89171995u,40u,1610612768u,16860u,138442753u,67108864u}/* 250B */, /*8101*/{0,665u,65537u,89171995u,40u,1610612768u,16868u,138442753u,67108864u}/* 250C */, /*8102*/{0,665u,65537u,89171995u,40u,1610612768u,16876u,138442753u,67108864u}/* 250D */, /*8103*/{0,665u,65537u,89171995u,40u,1610612768u,16884u,138442753u,67108864u}/* 250E */, /*8104*/{0,665u,65537u,89171995u,40u,1610612768u,16892u,138442753u,67108864u}/* 250F */, /*8105*/{0,665u,65537u,89171995u,40u,1610612768u,16900u,138442753u,67108864u}/* 2510 */, /*8106*/{0,665u,65537u,89171995u,40u,1610612768u,16908u,138442753u,67108864u}/* 2511 */, /*8107*/{0,665u,65537u,89171995u,40u,1610612768u,16916u,138442753u,67108864u}/* 2512 */, /*8108*/{0,665u,65537u,89171995u,40u,1610612768u,16924u,138442753u,67108864u}/* 2513 */, /*8109*/{0,665u,65537u,89171995u,40u,1610612768u,16932u,138442753u,67108864u}/* 2514 */, /*8110*/{0,665u,65537u,89171995u,40u,1610612768u,16940u,138442753u,67108864u}/* 2515 */, /*8111*/{0,665u,65537u,89171995u,40u,1610612768u,16948u,138442753u,67108864u}/* 2516 */, /*8112*/{0,665u,65537u,89171995u,40u,1610612768u,16956u,138442753u,67108864u}/* 2517 */, /*8113*/{0,665u,65537u,89171995u,40u,1610612768u,16964u,138442753u,67108864u}/* 2518 */, /*8114*/{0,665u,65537u,89171995u,40u,1610612768u,16972u,138442753u,67108864u}/* 2519 */, /*8115*/{0,665u,65537u,89171995u,40u,1610612768u,16980u,138442753u,67108864u}/* 251A */, /*8116*/{0,665u,65537u,89171995u,40u,1610612768u,16988u,138442753u,67108864u}/* 251B */, /*8117*/{0,665u,65537u,89171995u,40u,1610612768u,16996u,138442753u,67108864u}/* 251C */, /*8118*/{0,665u,65537u,89171995u,40u,1610612768u,17004u,138442753u,67108864u}/* 251D */, /*8119*/{0,665u,65537u,89171995u,40u,1610612768u,17012u,138442753u,67108864u}/* 251E */, /*8120*/{0,665u,65537u,89171995u,40u,1610612768u,17020u,138442753u,67108864u}/* 251F */, /*8121*/{0,665u,65537u,89171995u,40u,1610612768u,17028u,138442753u,67108864u}/* 2520 */, /*8122*/{0,665u,65537u,89171995u,40u,1610612768u,17036u,138442753u,67108864u}/* 2521 */, /*8123*/{0,665u,65537u,89171995u,40u,1610612768u,17044u,138442753u,67108864u}/* 2522 */, /*8124*/{0,665u,65537u,89171995u,40u,1610612768u,17052u,138442753u,67108864u}/* 2523 */, /*8125*/{0,665u,65537u,89171995u,40u,1610612768u,17060u,138442753u,67108864u}/* 2524 */, /*8126*/{0,665u,65537u,89171995u,40u,1610612768u,17068u,138442753u,67108864u}/* 2525 */, /*8127*/{0,665u,65537u,89171995u,40u,1610612768u,17076u,138442753u,67108864u}/* 2526 */, /*8128*/{0,665u,65537u,89171995u,40u,1610612768u,17084u,138442753u,67108864u}/* 2527 */, /*8129*/{0,665u,65537u,89171995u,40u,1610612768u,17092u,138442753u,67108864u}/* 2528 */, /*8130*/{0,665u,65537u,89171995u,40u,1610612768u,17100u,138442753u,67108864u}/* 2529 */, /*8131*/{0,665u,65537u,89171995u,40u,1610612768u,17108u,138442753u,67108864u}/* 252A */, /*8132*/{0,665u,65537u,89171995u,40u,1610612768u,17116u,138442753u,67108864u}/* 252B */, /*8133*/{0,665u,65537u,89171995u,40u,1610612768u,17124u,138442753u,67108864u}/* 252C */, /*8134*/{0,665u,65537u,89171995u,40u,1610612768u,17132u,138442753u,67108864u}/* 252D */, /*8135*/{0,665u,65537u,89171995u,40u,1610612768u,17140u,138442753u,67108864u}/* 252E */, /*8136*/{0,665u,65537u,89171995u,40u,1610612768u,17148u,138442753u,67108864u}/* 252F */, /*8137*/{0,665u,65537u,89171995u,40u,1610612768u,17156u,138442753u,67108864u}/* 2530 */, /*8138*/{0,665u,65537u,89171995u,40u,1610612768u,17164u,138442753u,67108864u}/* 2531 */, /*8139*/{0,665u,65537u,89171995u,40u,1610612768u,17172u,138442753u,67108864u}/* 2532 */, /*8140*/{0,665u,65537u,89171995u,40u,1610612768u,17180u,138442753u,67108864u}/* 2533 */, /*8141*/{0,665u,65537u,89171995u,40u,1610612768u,17188u,138442753u,67108864u}/* 2534 */, /*8142*/{0,665u,65537u,89171995u,40u,1610612768u,17196u,138442753u,67108864u}/* 2535 */, /*8143*/{0,665u,65537u,89171995u,40u,1610612768u,17204u,138442753u,67108864u}/* 2536 */, /*8144*/{0,665u,65537u,89171995u,40u,1610612768u,17212u,138442753u,67108864u}/* 2537 */, /*8145*/{0,665u,65537u,89171995u,40u,1610612768u,17220u,138442753u,67108864u}/* 2538 */, /*8146*/{0,665u,65537u,89171995u,40u,1610612768u,17228u,138442753u,67108864u}/* 2539 */, /*8147*/{0,665u,65537u,89171995u,40u,1610612768u,17236u,138442753u,67108864u}/* 253A */, /*8148*/{0,665u,65537u,89171995u,40u,1610612768u,17244u,138442753u,67108864u}/* 253B */, /*8149*/{0,665u,65537u,89171995u,40u,1610612768u,17252u,138442753u,67108864u}/* 253C */, /*8150*/{0,665u,65537u,89171995u,40u,1610612768u,17260u,138442753u,67108864u}/* 253D */, /*8151*/{0,665u,65537u,89171995u,40u,1610612768u,17268u,138442753u,67108864u}/* 253E */, /*8152*/{0,665u,65537u,89171995u,40u,1610612768u,17276u,138442753u,67108864u}/* 253F */, /*8153*/{0,665u,65537u,89171995u,40u,1610612768u,17284u,138442753u,67108864u}/* 2540 */, /*8154*/{0,665u,65537u,89171995u,40u,1610612768u,17292u,138442753u,67108864u}/* 2541 */, /*8155*/{0,665u,65537u,89171995u,40u,1610612768u,17300u,138442753u,67108864u}/* 2542 */, /*8156*/{0,665u,65537u,89171995u,40u,1610612768u,17308u,138442753u,67108864u}/* 2543 */, /*8157*/{0,665u,65537u,89171995u,40u,1610612768u,17316u,138442753u,67108864u}/* 2544 */, /*8158*/{0,665u,65537u,89171995u,40u,1610612768u,17324u,138442753u,67108864u}/* 2545 */, /*8159*/{0,665u,65537u,89171995u,40u,1610612768u,17332u,138442753u,67108864u}/* 2546 */, /*8160*/{0,665u,65537u,89171995u,40u,1610612768u,17340u,138442753u,67108864u}/* 2547 */, /*8161*/{0,665u,65537u,89171995u,40u,1610612768u,17348u,138442753u,67108864u}/* 2548 */, /*8162*/{0,665u,65537u,89171995u,40u,1610612768u,17356u,138442753u,67108864u}/* 2549 */, /*8163*/{0,665u,65537u,89171995u,40u,1610612768u,17364u,138442753u,67108864u}/* 254A */, /*8164*/{0,665u,65537u,89171995u,40u,1610612768u,17372u,138442753u,67108864u}/* 254B */, /*8165*/{0,664u,65537u,76589083u,40u,1610612768u,17380u,138442753u,67108864u}/* 254C */, /*8166*/{0,664u,65537u,76589083u,40u,1610612768u,17388u,138442753u,67108864u}/* 254D */, /*8167*/{0,664u,65537u,76589083u,40u,1610612768u,17396u,138442753u,67108864u}/* 254E */, /*8168*/{0,664u,65537u,76589083u,40u,1610612768u,17404u,138442753u,67108864u}/* 254F */, /*8169*/{0,665u,65537u,89171995u,40u,1610612768u,17412u,138442753u,67108864u}/* 2550 */, /*8170*/{0,665u,65537u,89171995u,40u,1610612768u,17420u,138442753u,67108864u}/* 2551 */, /*8171*/{0,665u,65537u,89171995u,40u,1610612768u,17428u,138442753u,67108864u}/* 2552 */, /*8172*/{0,665u,65537u,89171995u,40u,1610612768u,17436u,138442753u,67108864u}/* 2553 */, /*8173*/{0,665u,65537u,89171995u,40u,1610612768u,17444u,138442753u,67108864u}/* 2554 */, /*8174*/{0,665u,65537u,89171995u,40u,1610612768u,17452u,138442753u,67108864u}/* 2555 */, /*8175*/{0,665u,65537u,89171995u,40u,1610612768u,17460u,138442753u,67108864u}/* 2556 */, /*8176*/{0,665u,65537u,89171995u,40u,1610612768u,17468u,138442753u,67108864u}/* 2557 */, /*8177*/{0,665u,65537u,89171995u,40u,1610612768u,17476u,138442753u,67108864u}/* 2558 */, /*8178*/{0,665u,65537u,89171995u,40u,1610612768u,17484u,138442753u,67108864u}/* 2559 */, /*8179*/{0,665u,65537u,89171995u,40u,1610612768u,17492u,138442753u,67108864u}/* 255A */, /*8180*/{0,665u,65537u,89171995u,40u,1610612768u,17500u,138442753u,67108864u}/* 255B */, /*8181*/{0,665u,65537u,89171995u,40u,1610612768u,17508u,138442753u,67108864u}/* 255C */, /*8182*/{0,665u,65537u,89171995u,40u,1610612768u,17516u,138442753u,67108864u}/* 255D */, /*8183*/{0,665u,65537u,89171995u,40u,1610612768u,17524u,138442753u,67108864u}/* 255E */, /*8184*/{0,665u,65537u,89171995u,40u,1610612768u,17532u,138442753u,67108864u}/* 255F */, /*8185*/{0,665u,65537u,89171995u,40u,1610612768u,17540u,138442753u,67108864u}/* 2560 */, /*8186*/{0,665u,65537u,89171995u,40u,1610612768u,17548u,138442753u,67108864u}/* 2561 */, /*8187*/{0,665u,65537u,89171995u,40u,1610612768u,17556u,138442753u,67108864u}/* 2562 */, /*8188*/{0,665u,65537u,89171995u,40u,1610612768u,17564u,138442753u,67108864u}/* 2563 */, /*8189*/{0,665u,65537u,89171995u,40u,1610612768u,17572u,138442753u,67108864u}/* 2564 */, /*8190*/{0,665u,65537u,89171995u,40u,1610612768u,17580u,138442753u,67108864u}/* 2565 */, /*8191*/{0,665u,65537u,89171995u,40u,1610612768u,17588u,138442753u,67108864u}/* 2566 */, /*8192*/{0,665u,65537u,89171995u,40u,1610612768u,17596u,138442753u,67108864u}/* 2567 */, /*8193*/{0,665u,65537u,89171995u,40u,1610612768u,17604u,138442753u,67108864u}/* 2568 */, /*8194*/{0,665u,65537u,89171995u,40u,1610612768u,17612u,138442753u,67108864u}/* 2569 */, /*8195*/{0,665u,65537u,89171995u,40u,1610612768u,17620u,138442753u,67108864u}/* 256A */, /*8196*/{0,665u,65537u,89171995u,40u,1610612768u,17628u,138442753u,67108864u}/* 256B */, /*8197*/{0,665u,65537u,89171995u,40u,1610612768u,17636u,138442753u,67108864u}/* 256C */, /*8198*/{0,665u,65537u,89171995u,40u,1610612768u,17644u,138442753u,67108864u}/* 256D */, /*8199*/{0,665u,65537u,89171995u,40u,1610612768u,17652u,138442753u,67108864u}/* 256E */, /*8200*/{0,665u,65537u,89171995u,40u,1610612768u,17660u,138442753u,67108864u}/* 256F */, /*8201*/{0,665u,65537u,89171995u,40u,1610612768u,17668u,138442753u,67108864u}/* 2570 */, /*8202*/{0,665u,65537u,89171995u,40u,1610612768u,17676u,138442753u,67108864u}/* 2571 */, /*8203*/{0,665u,65537u,89171995u,40u,1610612768u,17684u,138442753u,67108864u}/* 2572 */, /*8204*/{0,665u,65537u,89171995u,40u,1610612768u,17692u,138442753u,67108864u}/* 2573 */, /*8205*/{0,664u,65537u,89171995u,40u,1610612768u,17700u,138442753u,67108864u}/* 2574 */, /*8206*/{0,664u,65537u,76589083u,40u,1610612768u,17708u,138442753u,67108864u}/* 2575 */, /*8207*/{0,664u,65537u,76589083u,40u,1610612768u,17716u,138442753u,67108864u}/* 2576 */, /*8208*/{0,664u,65537u,76589083u,40u,1610612768u,17724u,138442753u,67108864u}/* 2577 */, /*8209*/{0,664u,65537u,76589083u,40u,1610612768u,17732u,138442753u,67108864u}/* 2578 */, /*8210*/{0,664u,65537u,76589083u,40u,1610612768u,17740u,138442753u,67108864u}/* 2579 */, /*8211*/{0,664u,65537u,76589083u,40u,1610612768u,17748u,138442753u,67108864u}/* 257A */, /*8212*/{0,664u,65537u,76589083u,40u,1610612768u,17756u,138442753u,67108864u}/* 257B */, /*8213*/{0,664u,65537u,76589083u,40u,1610612768u,17764u,138442753u,67108864u}/* 257C */, /*8214*/{0,664u,65537u,76589083u,40u,1610612768u,17772u,138442753u,67108864u}/* 257D */, /*8215*/{0,664u,65537u,76589083u,40u,1610612768u,17780u,138442753u,67108864u}/* 257E */, /*8216*/{0,664u,65537u,76589083u,40u,1610612768u,17788u,138442753u,67108864u}/* 257F */, /*8217*/{0,673u,65537u,89171995u,40u,1610612768u,17796u,138442753u,67108864u}/* 2580 */, /*8218*/{0,673u,65537u,89171995u,40u,1610612768u,17804u,138442753u,67108864u}/* 2581 */, /*8219*/{0,673u,65537u,89171995u,40u,1610612768u,17812u,138442753u,67108864u}/* 2582 */, /*8220*/{0,673u,65537u,89171995u,40u,1610612768u,17820u,138442753u,67108864u}/* 2583 */, /*8221*/{0,673u,65537u,89171995u,40u,1610612768u,17828u,138442753u,67108864u}/* 2584 */, /*8222*/{0,673u,65537u,89171995u,40u,1610612768u,17836u,138442753u,67108864u}/* 2585 */, /*8223*/{0,673u,65537u,89171995u,40u,1610612768u,17844u,138442753u,67108864u}/* 2586 */, /*8224*/{0,673u,65537u,89171995u,40u,1610612768u,17852u,138442753u,67108864u}/* 2587 */, /*8225*/{0,673u,65537u,89171995u,40u,1610612768u,17860u,138442753u,67108864u}/* 2588 */, /*8226*/{0,673u,65537u,89171995u,40u,1610612768u,17868u,138442753u,67108864u}/* 2589 */, /*8227*/{0,673u,65537u,89171995u,40u,1610612768u,17876u,138442753u,67108864u}/* 258A */, /*8228*/{0,673u,65537u,89171995u,40u,1610612768u,17884u,138442753u,67108864u}/* 258B */, /*8229*/{0,673u,65537u,89171995u,40u,1610612768u,17892u,138442753u,67108864u}/* 258C */, /*8230*/{0,673u,65537u,89171995u,40u,1610612768u,17900u,138442753u,67108864u}/* 258D */, /*8231*/{0,673u,65537u,89171995u,40u,1610612768u,17908u,138442753u,67108864u}/* 258E */, /*8232*/{0,673u,65537u,89171995u,40u,1610612768u,17916u,138442753u,67108864u}/* 258F */, /*8233*/{0,672u,65537u,76589083u,40u,1610612768u,17924u,138442753u,67108864u}/* 2590 */, /*8234*/{0,672u,65537u,76589083u,40u,1610612768u,17932u,138442753u,67108864u}/* 2591 */, /*8235*/{0,673u,65537u,89171995u,40u,1610612768u,17940u,138442753u,67108864u}/* 2592 */, /*8236*/{0,673u,65537u,89171995u,40u,1610612768u,17948u,138442753u,67108864u}/* 2593 */, /*8237*/{0,673u,65537u,89171995u,40u,1610612768u,17956u,138442753u,67108864u}/* 2594 */, /*8238*/{0,673u,65537u,89171995u,40u,1610612768u,17964u,138442753u,67108864u}/* 2595 */, /*8239*/{0,672u,65537u,76752923u,40u,1610612768u,17972u,138442753u,67108864u}/* 2596 */, /*8240*/{0,672u,65537u,76752923u,40u,1610612768u,17980u,138442753u,67108864u}/* 2597 */, /*8241*/{0,672u,65537u,76752923u,40u,1610612768u,17988u,138442753u,67108864u}/* 2598 */, /*8242*/{0,672u,65537u,76752923u,40u,1610612768u,17996u,138442753u,67108864u}/* 2599 */, /*8243*/{0,672u,65537u,76752923u,40u,1610612768u,18004u,138442753u,67108864u}/* 259A */, /*8244*/{0,672u,65537u,76752923u,40u,1610612768u,18012u,138442753u,67108864u}/* 259B */, /*8245*/{0,672u,65537u,76752923u,40u,1610612768u,18020u,138442753u,67108864u}/* 259C */, /*8246*/{0,672u,65537u,76752923u,40u,1610612768u,18028u,138442753u,67108864u}/* 259D */, /*8247*/{0,672u,65537u,76752923u,40u,1610612768u,18036u,138442753u,67108864u}/* 259E */, /*8248*/{0,672u,65537u,76752923u,40u,1610612768u,18044u,138442753u,67108864u}/* 259F */, /*8249*/{0,681u,65537u,89171995u,40u,1610612768u,18054u,138442761u,67108864u}/* 25A0 */, /*8250*/{0,681u,65537u,89171995u,40u,1610612768u,18062u,138442761u,67108864u}/* 25A1 */, /*8251*/{0,680u,65537u,76589083u,40u,1610612768u,18068u,138442753u,67108864u}/* 25A2 */, /*8252*/{0,681u,65537u,89171995u,40u,1610612768u,18076u,138442753u,67108864u}/* 25A3 */, /*8253*/{0,681u,65537u,89171995u,40u,1610612768u,18084u,138442753u,67108864u}/* 25A4 */, /*8254*/{0,681u,65537u,89171995u,40u,1610612768u,18092u,138442753u,67108864u}/* 25A5 */, /*8255*/{0,681u,65537u,89171995u,40u,1610612768u,18100u,138442753u,67108864u}/* 25A6 */, /*8256*/{0,681u,65537u,89171995u,40u,1610612768u,18108u,138442753u,67108864u}/* 25A7 */, /*8257*/{0,681u,65537u,89171995u,40u,1610612768u,18116u,138442753u,67108864u}/* 25A8 */, /*8258*/{0,681u,65537u,89171995u,40u,1610612768u,18124u,138442753u,67108864u}/* 25A9 */, /*8259*/{0,680u,65537u,76589083u,8u,1610616864u,18132u,138442753u,67108864u}/* 25AA */, /*8260*/{0,680u,65537u,76589083u,8u,1610616864u,18140u,138442753u,67108864u}/* 25AB */, /*8261*/{0,680u,65537u,76589083u,40u,1610612768u,18148u,138442753u,67108864u}/* 25AC */, /*8262*/{0,680u,65537u,76589083u,40u,1610612768u,18156u,138442753u,67108864u}/* 25AD */, /*8263*/{0,680u,65537u,76589083u,40u,1610612768u,18166u,138442761u,67108864u}/* 25AE */, /*8264*/{0,680u,65537u,76589083u,40u,1610612768u,18174u,138442761u,67108864u}/* 25AF */, /*8265*/{0,680u,65537u,76589083u,40u,1610612768u,18182u,138442761u,67108864u}/* 25B0 */, /*8266*/{0,680u,65537u,76589083u,40u,1610612768u,18190u,138442761u,67108864u}/* 25B1 */, /*8267*/{0,681u,65537u,89171995u,40u,1610612768u,18198u,138442761u,67108864u}/* 25B2 */, /*8268*/{0,681u,65537u,89171995u,40u,1610612768u,18206u,138442761u,67108864u}/* 25B3 */, /*8269*/{0,680u,65537u,76589083u,40u,1610612768u,18214u,138442761u,67108864u}/* 25B4 */, /*8270*/{0,680u,65537u,76589083u,40u,1610612768u,18222u,138442761u,67108864u}/* 25B5 */, /*8271*/{0,681u,65537u,89171995u,8u,1610616864u,18230u,138442761u,67108864u}/* 25B6 */, /*8272*/{0,681u,65537u,89171992u,40u,1610612768u,18238u,138442753u,67108864u}/* 25B7 */, /*8273*/{0,680u,65537u,76589083u,40u,1610612768u,18244u,138442753u,67108864u}/* 25B8 */, /*8274*/{0,680u,65537u,76589083u,40u,1610612768u,18252u,138442753u,67108864u}/* 25B9 */, /*8275*/{0,680u,65537u,76589083u,40u,1610612768u,18260u,138442753u,67108864u}/* 25BA */, /*8276*/{0,680u,65537u,76589083u,40u,1610612768u,18268u,138442753u,67108864u}/* 25BB */, /*8277*/{0,681u,65537u,89171995u,40u,1610612768u,18278u,138442761u,67108864u}/* 25BC */, /*8278*/{0,681u,65537u,89171995u,40u,1610612768u,18286u,138442761u,67108864u}/* 25BD */, /*8279*/{0,680u,65537u,76589083u,40u,1610612768u,18294u,138442761u,67108864u}/* 25BE */, /*8280*/{0,680u,65537u,76589083u,40u,1610612768u,18302u,138442761u,67108864u}/* 25BF */, /*8281*/{0,681u,65537u,89171995u,8u,1610616864u,18310u,138442761u,67108864u}/* 25C0 */, /*8282*/{0,681u,65537u,89171992u,40u,1610612768u,18318u,138442753u,67108864u}/* 25C1 */, /*8283*/{0,680u,65537u,76589083u,40u,1610612768u,18324u,138442753u,67108864u}/* 25C2 */, /*8284*/{0,680u,65537u,76589083u,40u,1610612768u,18332u,138442753u,67108864u}/* 25C3 */, /*8285*/{0,680u,65537u,76589083u,40u,1610612768u,18340u,138442753u,67108864u}/* 25C4 */, /*8286*/{0,680u,65537u,76589083u,40u,1610612768u,18348u,138442753u,67108864u}/* 25C5 */, /*8287*/{0,681u,65537u,89171995u,40u,1610612768u,18358u,138442761u,67108864u}/* 25C6 */, /*8288*/{0,681u,65537u,89171995u,40u,1610612768u,18366u,138442761u,67108864u}/* 25C7 */, /*8289*/{0,681u,65537u,89171995u,40u,1610612768u,18372u,138442753u,67108864u}/* 25C8 */, /*8290*/{0,680u,65537u,76589083u,40u,1610612768u,18380u,138442753u,67108864u}/* 25C9 */, /*8291*/{0,680u,65537u,76589083u,40u,1610612768u,18390u,138442761u,67108864u}/* 25CA */, /*8292*/{0,681u,65537u,89171995u,40u,1610612768u,18398u,138442761u,67108864u}/* 25CB */, /*8293*/{0,680u,65537u,76589083u,40u,1610612768u,18404u,138442753u,67108864u}/* 25CC */, /*8294*/{0,680u,65537u,76589083u,40u,1610612768u,18412u,138442753u,67108864u}/* 25CD */, /*8295*/{0,681u,65537u,89171995u,40u,1610612768u,18420u,138442753u,67108864u}/* 25CE */, /*8296*/{0,681u,65537u,89171995u,40u,1610612768u,18430u,138442761u,67108864u}/* 25CF */, /*8297*/{0,681u,65537u,89171995u,40u,1610612768u,18438u,138442761u,67108864u}/* 25D0 */, /*8298*/{0,681u,65537u,89171995u,40u,1610612768u,18446u,138442761u,67108864u}/* 25D1 */, /*8299*/{0,680u,65537u,76589083u,40u,1610612768u,18454u,138442761u,67108864u}/* 25D2 */, /*8300*/{0,680u,65537u,76589083u,40u,1610612768u,18462u,138442761u,67108864u}/* 25D3 */, /*8301*/{0,680u,65537u,76589083u,40u,1610612768u,18468u,138442753u,67108864u}/* 25D4 */, /*8302*/{0,680u,65537u,76589083u,40u,1610612768u,18476u,138442753u,67108864u}/* 25D5 */, /*8303*/{0,680u,65537u,76589083u,40u,1610612768u,18484u,138442753u,67108864u}/* 25D6 */, /*8304*/{0,680u,65537u,76589083u,40u,1610612768u,18492u,138442753u,67108864u}/* 25D7 */, /*8305*/{0,680u,65537u,76589083u,40u,1610612768u,18500u,138442753u,67108864u}/* 25D8 */, /*8306*/{0,680u,65537u,76589083u,40u,1610612768u,18508u,138442753u,67108864u}/* 25D9 */, /*8307*/{0,680u,65537u,76589083u,40u,1610612768u,18516u,138442753u,67108864u}/* 25DA */, /*8308*/{0,680u,65537u,76589083u,40u,1610612768u,18524u,138442753u,67108864u}/* 25DB */, /*8309*/{0,680u,65537u,76589083u,40u,1610612768u,18532u,138442753u,67108864u}/* 25DC */, /*8310*/{0,680u,65537u,76589083u,40u,1610612768u,18540u,138442753u,67108864u}/* 25DD */, /*8311*/{0,680u,65537u,76589083u,40u,1610612768u,18548u,138442753u,67108864u}/* 25DE */, /*8312*/{0,680u,65537u,76589083u,40u,1610612768u,18556u,138442753u,67108864u}/* 25DF */, /*8313*/{0,680u,65537u,76589083u,40u,1610612768u,18564u,138442753u,67108864u}/* 25E0 */, /*8314*/{0,680u,65537u,76589083u,40u,1610612768u,18572u,138442753u,67108864u}/* 25E1 */, /*8315*/{0,681u,65537u,89171995u,40u,1610612768u,18582u,138442761u,67108864u}/* 25E2 */, /*8316*/{0,681u,65537u,89171995u,40u,1610612768u,18588u,138442753u,67108864u}/* 25E3 */, /*8317*/{0,681u,65537u,89171995u,40u,1610612768u,18598u,138442761u,67108864u}/* 25E4 */, /*8318*/{0,681u,65537u,89171995u,40u,1610612768u,18604u,138442753u,67108864u}/* 25E5 */, /*8319*/{0,680u,65537u,76589083u,40u,1610612768u,18612u,138442753u,67108864u}/* 25E6 */, /*8320*/{0,680u,65537u,76589083u,40u,1610612768u,18622u,138442761u,67108864u}/* 25E7 */, /*8321*/{0,680u,65537u,76589083u,40u,1610612768u,18630u,138442761u,67108864u}/* 25E8 */, /*8322*/{0,680u,65537u,76589083u,40u,1610612768u,18638u,138442761u,67108864u}/* 25E9 */, /*8323*/{0,680u,65537u,76589083u,40u,1610612768u,18646u,138442761u,67108864u}/* 25EA */, /*8324*/{0,680u,65537u,76589083u,40u,1610612768u,18654u,138442761u,67108864u}/* 25EB */, /*8325*/{0,680u,65537u,76589083u,40u,1610612768u,18662u,138442761u,67108864u}/* 25EC */, /*8326*/{0,680u,65537u,76589083u,40u,1610612768u,18668u,138442753u,67108864u}/* 25ED */, /*8327*/{0,680u,65537u,76589083u,40u,1610612768u,18676u,138442753u,67108864u}/* 25EE */, /*8328*/{0,681u,65537u,89171995u,40u,1610612768u,18684u,138442753u,67108864u}/* 25EF */, /*8329*/{0,680u,65537u,76687387u,40u,1610612768u,18692u,138442753u,67108864u}/* 25F0 */, /*8330*/{0,680u,65537u,76687387u,40u,1610612768u,18700u,138442753u,67108864u}/* 25F1 */, /*8331*/{0,680u,65537u,76687387u,40u,1610612768u,18708u,138442753u,67108864u}/* 25F2 */, /*8332*/{0,680u,65537u,76687387u,40u,1610612768u,18716u,138442753u,67108864u}/* 25F3 */, /*8333*/{0,680u,65537u,76687387u,40u,1610612768u,18724u,138442753u,67108864u}/* 25F4 */, /*8334*/{0,680u,65537u,76687387u,40u,1610612768u,18732u,138442753u,67108864u}/* 25F5 */, /*8335*/{0,680u,65537u,76687387u,40u,1610612768u,18740u,138442753u,67108864u}/* 25F6 */, /*8336*/{0,680u,65537u,76687387u,40u,1610612768u,18748u,138442753u,67108864u}/* 25F7 */, /*8337*/{0,680u,65537u,76752920u,40u,1610612768u,18758u,138442753u,67108864u}/* 25F8 */, /*8338*/{0,680u,65537u,76752920u,40u,1610612768u,18766u,138442753u,67108864u}/* 25F9 */, /*8339*/{0,680u,65537u,76752920u,40u,1610612768u,18774u,138442753u,67108864u}/* 25FA */, /*8340*/{0,680u,65537u,76752920u,8u,1610616864u,18782u,138442753u,67108864u}/* 25FB */, /*8341*/{0,680u,65537u,76752920u,8u,1610616864u,18790u,138442753u,67108864u}/* 25FC */, /*8342*/{0,683u,65537u,76752920u,8u,1610617120u,18798u,138442753u,67108864u}/* 25FD */, /*8343*/{0,683u,65537u,76752920u,8u,1610617120u,18806u,138442753u,67108864u}/* 25FE */, /*8344*/{0,680u,65537u,76752920u,40u,1610612768u,18814u,138442753u,67108864u}/* 25FF */, /*8345*/{0,688u,65537u,102803483u,8u,1610616864u,18820u,138442753u,67108864u}/* 2600 */, /*8346*/{0,688u,65537u,102803483u,8u,1610616864u,18828u,138442753u,67108864u}/* 2601 */, /*8347*/{0,688u,65537u,102803483u,8u,1610616864u,18836u,138442753u,67108864u}/* 2602 */, /*8348*/{0,688u,65537u,102803483u,8u,1610616864u,18844u,138442753u,67108864u}/* 2603 */, /*8349*/{0,688u,65537u,76589083u,8u,1610616864u,18852u,138442753u,67108864u}/* 2604 */, /*8350*/{0,689u,65537u,89171995u,40u,1610612768u,18862u,138442761u,67108864u}/* 2605 */, /*8351*/{0,689u,65537u,89171995u,40u,1610612768u,18870u,138442761u,67108864u}/* 2606 */, /*8352*/{0,688u,65537u,76589083u,40u,1610612768u,18876u,138442753u,67108864u}/* 2607 */, /*8353*/{0,688u,65537u,76589083u,40u,1610612768u,18884u,138442753u,67108864u}/* 2608 */, /*8354*/{0,689u,65537u,89171995u,40u,1610612768u,18892u,138442753u,67108864u}/* 2609 */, /*8355*/{0,688u,65537u,76589083u,40u,1610612768u,18900u,138442753u,67108864u}/* 260A */, /*8356*/{0,688u,65537u,76589083u,40u,1610612768u,18908u,138442753u,67108864u}/* 260B */, /*8357*/{0,688u,65537u,76589083u,40u,1610612768u,18916u,138442753u,67108864u}/* 260C */, /*8358*/{0,688u,65537u,76589083u,40u,1610612768u,18924u,138442753u,67108864u}/* 260D */, /*8359*/{0,689u,65537u,89171995u,8u,1610616864u,18932u,138442753u,67108864u}/* 260E */, /*8360*/{0,689u,65537u,89171995u,40u,1610612768u,18940u,138442753u,67108864u}/* 260F */, /*8361*/{0,688u,65537u,76589083u,40u,1610612768u,18948u,138442753u,67108864u}/* 2610 */, /*8362*/{0,688u,65537u,76589083u,8u,1610616864u,18956u,138442753u,67108864u}/* 2611 */, /*8363*/{0,688u,65537u,76589083u,40u,1610612768u,18964u,138442753u,67108864u}/* 2612 */, /*8364*/{0,688u,65537u,76589083u,40u,1610612768u,18972u,138442753u,67108864u}/* 2613 */, /*8365*/{0,691u,65537u,103000091u,8u,1610617120u,18980u,138442753u,67108864u}/* 2614 */, /*8366*/{0,691u,65537u,103000091u,8u,1610617120u,18988u,138442753u,67108864u}/* 2615 */, /*8367*/{0,688u,65537u,89335835u,40u,1610612768u,18996u,138442753u,67108864u}/* 2616 */, /*8368*/{0,688u,65537u,89335835u,40u,1610612768u,19004u,138442753u,67108864u}/* 2617 */, /*8369*/{0,688u,65537u,103032859u,8u,1610616864u,19012u,138442753u,67108864u}/* 2618 */, /*8370*/{0,688u,65537u,76687387u,40u,1610612768u,19020u,138442753u,67108864u}/* 2619 */, /*8371*/{0,688u,65537u,102803483u,40u,1610612768u,19028u,138442753u,67108864u}/* 261A */, /*8372*/{0,688u,65537u,102803483u,40u,1610612768u,19036u,138442753u,67108864u}/* 261B */, /*8373*/{0,689u,65537u,102803483u,40u,1610612768u,19044u,138442753u,67108864u}/* 261C */, /*8374*/{0,688u,65537u,103852059u,1747058696u,1610617376u,19052u,138442753u,67108864u}/* 261D */, /*8375*/{0,689u,65537u,102803483u,40u,1610612768u,19060u,138442753u,67108864u}/* 261E */, /*8376*/{0,688u,65537u,102803483u,40u,1610612768u,19068u,138442753u,67108864u}/* 261F */, /*8377*/{0,688u,65537u,76589083u,8u,1610616864u,19076u,138442753u,67108864u}/* 2620 */, /*8378*/{0,688u,65537u,76589083u,40u,1610612768u,19084u,138442753u,67108864u}/* 2621 */, /*8379*/{0,688u,65537u,76589083u,8u,1610616864u,19092u,138442753u,67108864u}/* 2622 */, /*8380*/{0,688u,65537u,76589083u,8u,1610616864u,19100u,138442753u,67108864u}/* 2623 */, /*8381*/{0,688u,65537u,76589083u,40u,1610612768u,19108u,138442753u,67108864u}/* 2624 */, /*8382*/{0,688u,65537u,76589083u,40u,1610612768u,19116u,138442753u,67108864u}/* 2625 */, /*8383*/{0,688u,65537u,76589083u,8u,1610616864u,19124u,138442753u,67108864u}/* 2626 */, /*8384*/{0,688u,65537u,76589083u,40u,1610612768u,19132u,138442753u,67108864u}/* 2627 */, /*8385*/{0,688u,65537u,76589083u,40u,1610612768u,19140u,138442753u,67108864u}/* 2628 */, /*8386*/{0,688u,65537u,76589083u,40u,1610612768u,19148u,138442753u,67108864u}/* 2629 */, /*8387*/{0,688u,65537u,76589083u,8u,1610616864u,19156u,138442753u,67108864u}/* 262A */, /*8388*/{0,688u,65537u,76589083u,40u,1610612768u,19164u,138442753u,67108864u}/* 262B */, /*8389*/{0,688u,65537u,76589083u,40u,1610612768u,19172u,138442753u,67108864u}/* 262C */, /*8390*/{0,688u,65537u,76589083u,40u,1610612768u,19180u,138442753u,67108864u}/* 262D */, /*8391*/{0,688u,65537u,76589083u,8u,1610616864u,19188u,138442753u,67108864u}/* 262E */, /*8392*/{0,688u,65537u,76589083u,8u,1610616864u,19196u,138442753u,67108864u}/* 262F */, /*8393*/{0,688u,65537u,76589083u,40u,1610612768u,30172u,138442753u,67108864u}/* 2630 */, /*8394*/{0,688u,65537u,76589083u,40u,1610612768u,30180u,138442753u,67108864u}/* 2631 */, /*8395*/{0,688u,65537u,76589083u,40u,1610612768u,30188u,138442753u,67108864u}/* 2632 */, /*8396*/{0,688u,65537u,76589083u,40u,1610612768u,30196u,138442753u,67108864u}/* 2633 */, /*8397*/{0,688u,65537u,76589083u,40u,1610612768u,30204u,138442753u,67108864u}/* 2634 */, /*8398*/{0,688u,65537u,76589083u,40u,1610612768u,30212u,138442753u,67108864u}/* 2635 */, /*8399*/{0,688u,65537u,76589083u,40u,1610612768u,30220u,138442753u,67108864u}/* 2636 */, /*8400*/{0,688u,65537u,76589083u,40u,1610612768u,30228u,138442753u,67108864u}/* 2637 */, /*8401*/{0,688u,65537u,76589083u,8u,1610616864u,19204u,138442753u,67108864u}/* 2638 */, /*8402*/{0,688u,65537u,102803483u,8u,1610616864u,19212u,138442753u,67108864u}/* 2639 */, /*8403*/{0,688u,65537u,102803483u,8u,1610616864u,19220u,138442753u,67108864u}/* 263A */, /*8404*/{0,688u,65537u,102803483u,40u,1610612768u,19228u,138442753u,67108864u}/* 263B */, /*8405*/{0,688u,65537u,76589083u,40u,1610612768u,19236u,138442753u,67108864u}/* 263C */, /*8406*/{0,688u,65537u,76589083u,40u,1610612768u,19244u,138442753u,67108864u}/* 263D */, /*8407*/{0,688u,65537u,76589083u,40u,1610612768u,19252u,138442753u,67108864u}/* 263E */, /*8408*/{0,688u,65537u,76589083u,40u,1610612768u,19260u,138442753u,67108864u}/* 263F */, /*8409*/{0,689u,65537u,89171995u,2150105096u,1610616864u,19270u,138442761u,67108864u}/* 2640 */, /*8410*/{0,688u,65537u,76589083u,40u,1610612768u,19276u,138442753u,67108864u}/* 2641 */, /*8411*/{0,689u,65537u,89171995u,2150105096u,1610616864u,19286u,138442761u,67108864u}/* 2642 */, /*8412*/{0,688u,65537u,76589083u,40u,1610612768u,19292u,138442753u,67108864u}/* 2643 */, /*8413*/{0,688u,65537u,76589083u,40u,1610612768u,19300u,138442753u,67108864u}/* 2644 */, /*8414*/{0,688u,65537u,76589083u,40u,1610612768u,19308u,138442753u,67108864u}/* 2645 */, /*8415*/{0,688u,65537u,76589083u,40u,1610612768u,19316u,138442753u,67108864u}/* 2646 */, /*8416*/{0,688u,65537u,76589083u,40u,1610612768u,19324u,138442753u,67108864u}/* 2647 */, /*8417*/{0,691u,65537u,76589083u,8u,1610617120u,19332u,138442753u,67108864u}/* 2648 */, /*8418*/{0,691u,65537u,76589083u,8u,1610617120u,19340u,138442753u,67108864u}/* 2649 */, /*8419*/{0,691u,65537u,76589083u,8u,1610617120u,19348u,138442753u,67108864u}/* 264A */, /*8420*/{0,691u,65537u,76589083u,8u,1610617120u,19356u,138442753u,67108864u}/* 264B */, /*8421*/{0,691u,65537u,76589083u,8u,1610617120u,19364u,138442753u,67108864u}/* 264C */, /*8422*/{0,691u,65537u,76589083u,8u,1610617120u,19372u,138442753u,67108864u}/* 264D */, /*8423*/{0,691u,65537u,76589083u,8u,1610617120u,19380u,138442753u,67108864u}/* 264E */, /*8424*/{0,691u,65537u,76589083u,8u,1610617120u,19388u,138442753u,67108864u}/* 264F */, /*8425*/{0,691u,65537u,76589083u,8u,1610617120u,19396u,138442753u,67108864u}/* 2650 */, /*8426*/{0,691u,65537u,76589083u,8u,1610617120u,19404u,138442753u,67108864u}/* 2651 */, /*8427*/{0,691u,65537u,76589083u,8u,1610617120u,19412u,138442753u,67108864u}/* 2652 */, /*8428*/{0,691u,65537u,76589083u,8u,1610617120u,19420u,138442753u,67108864u}/* 2653 */, /*8429*/{0,688u,65537u,76589083u,40u,1610612768u,19428u,138442753u,67108864u}/* 2654 */, /*8430*/{0,688u,65537u,76589083u,40u,1610612768u,19436u,138442753u,67108864u}/* 2655 */, /*8431*/{0,688u,65537u,76589083u,40u,1610612768u,19444u,138442753u,67108864u}/* 2656 */, /*8432*/{0,688u,65537u,76589083u,40u,1610612768u,19452u,138442753u,67108864u}/* 2657 */, /*8433*/{0,688u,65537u,76589083u,40u,1610612768u,19460u,138442753u,67108864u}/* 2658 */, /*8434*/{0,688u,65537u,76589083u,40u,1610612768u,19468u,138442753u,67108864u}/* 2659 */, /*8435*/{0,688u,65537u,76589083u,40u,1610612768u,19476u,138442753u,67108864u}/* 265A */, /*8436*/{0,688u,65537u,76589083u,40u,1610612768u,19484u,138442753u,67108864u}/* 265B */, /*8437*/{0,688u,65537u,76589083u,40u,1610612768u,19492u,138442753u,67108864u}/* 265C */, /*8438*/{0,688u,65537u,76589083u,40u,1610612768u,19500u,138442753u,67108864u}/* 265D */, /*8439*/{0,688u,65537u,76589083u,40u,1610612768u,19508u,138442753u,67108864u}/* 265E */, /*8440*/{0,688u,65537u,76589083u,40u,1610612768u,19516u,138442753u,67108864u}/* 265F */, /*8441*/{0,689u,65537u,89171995u,8u,1610616864u,19526u,138442761u,67108864u}/* 2660 */, /*8442*/{0,689u,65537u,89171995u,40u,1610612768u,19534u,138442761u,67108864u}/* 2661 */, /*8443*/{0,688u,65537u,76589083u,40u,1610612768u,19542u,138442761u,67108864u}/* 2662 */, /*8444*/{0,689u,65537u,89171995u,8u,1610616864u,19550u,138442761u,67108864u}/* 2663 */, /*8445*/{0,689u,65537u,89171995u,40u,1610612768u,19556u,138442753u,67108864u}/* 2664 */, /*8446*/{0,689u,65537u,89171995u,8u,1610616864u,19564u,138442753u,67108864u}/* 2665 */, /*8447*/{0,688u,65537u,76589083u,8u,1610616864u,19572u,138442753u,67108864u}/* 2666 */, /*8448*/{0,689u,65537u,89171995u,40u,1610612768u,19580u,138442753u,67108864u}/* 2667 */, /*8449*/{0,689u,65537u,102803483u,8u,1610616864u,19588u,138442753u,67108864u}/* 2668 */, /*8450*/{0,689u,65537u,89171995u,40u,1610612768u,19596u,138442753u,67108864u}/* 2669 */, /*8451*/{0,689u,65537u,89171995u,40u,1610612768u,19604u,138442753u,67108864u}/* 266A */, /*8452*/{0,688u,65537u,76589083u,40u,1610612768u,19612u,138442753u,67108864u}/* 266B */, /*8453*/{0,689u,65537u,89171995u,40u,1610612768u,19620u,138442753u,67108864u}/* 266C */, /*8454*/{0,689u,65537u,89171995u,40u,1610612768u,34918u,138442761u,67108864u}/* 266D */, /*8455*/{0,688u,65537u,76589083u,40u,1610612768u,34926u,138442761u,67108864u}/* 266E */, /*8456*/{0,689u,65537u,89171992u,40u,1610612768u,34934u,138442753u,67108864u}/* 266F */, /*8457*/{0,688u,65537u,76687387u,40u,1610612768u,19628u,138442753u,67108864u}/* 2670 */, /*8458*/{0,688u,65537u,76687387u,40u,1610612768u,19636u,138442753u,67108864u}/* 2671 */, /*8459*/{0,688u,65537u,76752923u,40u,1610612768u,19644u,138442753u,67108864u}/* 2672 */, /*8460*/{0,688u,65537u,76752923u,40u,1610612768u,19652u,138442753u,67108864u}/* 2673 */, /*8461*/{0,688u,65537u,76752923u,40u,1610612768u,19660u,138442753u,67108864u}/* 2674 */, /*8462*/{0,688u,65537u,76752923u,40u,1610612768u,19668u,138442753u,67108864u}/* 2675 */, /*8463*/{0,688u,65537u,76752923u,40u,1610612768u,19676u,138442753u,67108864u}/* 2676 */, /*8464*/{0,688u,65537u,76752923u,40u,1610612768u,19684u,138442753u,67108864u}/* 2677 */, /*8465*/{0,688u,65537u,76752923u,40u,1610612768u,19692u,138442753u,67108864u}/* 2678 */, /*8466*/{0,688u,65537u,76752923u,40u,1610612768u,19700u,138442753u,67108864u}/* 2679 */, /*8467*/{0,688u,65537u,76752923u,40u,1610612768u,19708u,138442753u,67108864u}/* 267A */, /*8468*/{0,688u,65537u,76752923u,8u,1610616864u,19716u,138442753u,67108864u}/* 267B */, /*8469*/{0,688u,65537u,76752923u,40u,1610612768u,19724u,138442753u,67108864u}/* 267C */, /*8470*/{0,688u,65537u,76752923u,40u,1610612768u,19732u,138442753u,67108864u}/* 267D */, /*8471*/{0,688u,65537u,76818459u,40u,1610612768u,19740u,138442753u,67108864u}/* 267E */, /*8472*/{0,691u,65537u,103032859u,8u,1610617120u,19748u,138442753u,67108864u}/* 267F */, /*8473*/{0,688u,65537u,76752923u,40u,1610612768u,19756u,138442753u,67108864u}/* 2680 */, /*8474*/{0,688u,65537u,76752923u,40u,1610612768u,19764u,138442753u,67108864u}/* 2681 */, /*8475*/{0,688u,65537u,76752923u,40u,1610612768u,19772u,138442753u,67108864u}/* 2682 */, /*8476*/{0,688u,65537u,76752923u,40u,1610612768u,19780u,138442753u,67108864u}/* 2683 */, /*8477*/{0,688u,65537u,76752923u,40u,1610612768u,19788u,138442753u,67108864u}/* 2684 */, /*8478*/{0,688u,65537u,76752923u,40u,1610612768u,19796u,138442753u,67108864u}/* 2685 */, /*8479*/{0,688u,65537u,76752923u,40u,1610612768u,19804u,138442753u,67108864u}/* 2686 */, /*8480*/{0,688u,65537u,76752923u,40u,1610612768u,19812u,138442753u,67108864u}/* 2687 */, /*8481*/{0,688u,65537u,76752923u,40u,1610612768u,19820u,138442753u,67108864u}/* 2688 */, /*8482*/{0,688u,65537u,76752923u,40u,1610612768u,19828u,138442753u,67108864u}/* 2689 */, /*8483*/{0,688u,65537u,76785691u,40u,1610612768u,30124u,138442753u,67108864u}/* 268A */, /*8484*/{0,688u,65537u,76785691u,40u,1610612768u,30132u,138442753u,67108864u}/* 268B */, /*8485*/{0,688u,65537u,76785691u,40u,1610612768u,30140u,138442753u,67108864u}/* 268C */, /*8486*/{0,688u,65537u,76785691u,40u,1610612768u,30148u,138442753u,67108864u}/* 268D */, /*8487*/{0,688u,65537u,76785691u,40u,1610612768u,30156u,138442753u,67108864u}/* 268E */, /*8488*/{0,688u,65537u,76785691u,40u,1610612768u,30164u,138442753u,67108864u}/* 268F */, /*8489*/{0,688u,65537u,76785691u,40u,1610612768u,19836u,138442753u,67108864u}/* 2690 */, /*8490*/{0,688u,65537u,76785691u,40u,1610612768u,19844u,138442753u,67108864u}/* 2691 */, /*8491*/{0,688u,65537u,76818459u,8u,1610616864u,19852u,138442753u,67108864u}/* 2692 */, /*8492*/{0,691u,65537u,76818459u,8u,1610617120u,19860u,138442753u,67108864u}/* 2693 */, /*8493*/{0,688u,65537u,76818459u,8u,1610616864u,19868u,138442753u,67108864u}/* 2694 */, /*8494*/{0,688u,65537u,76818459u,2150105096u,1610616864u,19876u,138442753u,67108864u}/* 2695 */, /*8495*/{0,688u,65537u,76818459u,2150105096u,1610616864u,19884u,138442753u,67108864u}/* 2696 */, /*8496*/{0,688u,65537u,76818459u,8u,1610616864u,19892u,138442753u,67108864u}/* 2697 */, /*8497*/{0,688u,65537u,76818459u,40u,1610612768u,19900u,138442753u,67108864u}/* 2698 */, /*8498*/{0,688u,65537u,76818459u,8u,1610616864u,19908u,138442753u,67108864u}/* 2699 */, /*8499*/{0,688u,65537u,76818459u,40u,1610612768u,19916u,138442753u,67108864u}/* 269A */, /*8500*/{0,688u,65537u,76818459u,8u,1610616864u,19924u,138442753u,67108864u}/* 269B */, /*8501*/{0,688u,65537u,76818459u,8u,1610616864u,19932u,138442753u,67108864u}/* 269C */, /*8502*/{0,688u,65537u,76883995u,40u,1610612768u,19940u,138442753u,67108864u}/* 269D */, /*8503*/{0,689u,65537u,89499675u,40u,1610612768u,19948u,138442753u,67108864u}/* 269E */, /*8504*/{0,689u,65537u,89499675u,40u,1610612768u,19956u,138442753u,67108864u}/* 269F */, /*8505*/{0,688u,65537u,76785691u,8u,1610616864u,19964u,138442753u,67108864u}/* 26A0 */, /*8506*/{0,691u,65537u,76785691u,8u,1610617120u,19972u,138442753u,67108864u}/* 26A1 */, /*8507*/{0,688u,65537u,76818459u,40u,1610612768u,19980u,138442753u,67108864u}/* 26A2 */, /*8508*/{0,688u,65537u,76818459u,40u,1610612768u,19988u,138442753u,67108864u}/* 26A3 */, /*8509*/{0,688u,65537u,76818459u,40u,1610612768u,19996u,138442753u,67108864u}/* 26A4 */, /*8510*/{0,688u,65537u,76818459u,40u,1610612768u,20004u,138442753u,67108864u}/* 26A5 */, /*8511*/{0,688u,65537u,76818459u,40u,1610612768u,20012u,138442753u,67108864u}/* 26A6 */, /*8512*/{0,688u,65537u,76818459u,40u,1610612768u,20020u,138442753u,67108864u}/* 26A7 */, /*8513*/{0,688u,65537u,76818459u,40u,1610612768u,20028u,138442753u,67108864u}/* 26A8 */, /*8514*/{0,688u,65537u,76818459u,40u,1610612768u,20036u,138442753u,67108864u}/* 26A9 */, /*8515*/{0,691u,65537u,76818459u,8u,1610617120u,20044u,138442753u,67108864u}/* 26AA */, /*8516*/{0,691u,65537u,76818459u,8u,1610617120u,20052u,138442753u,67108864u}/* 26AB */, /*8517*/{0,688u,65537u,76808219u,40u,1610612768u,20060u,138442753u,67108864u}/* 26AC */, /*8518*/{0,688u,65537u,76818459u,40u,1610612768u,20068u,138442753u,67108864u}/* 26AD */, /*8519*/{0,688u,65537u,76818459u,40u,1610612768u,20076u,138442753u,67108864u}/* 26AE */, /*8520*/{0,688u,65537u,76818459u,40u,1610612768u,20084u,138442753u,67108864u}/* 26AF */, /*8521*/{0,688u,65537u,76818459u,8u,1610616864u,20092u,138442753u,67108864u}/* 26B0 */, /*8522*/{0,688u,65537u,76818459u,8u,1610616864u,20100u,138442753u,67108864u}/* 26B1 */, /*8523*/{0,688u,65537u,76851227u,40u,1610612768u,20108u,138442753u,67108864u}/* 26B2 */, /*8524*/{0,688u,65537u,76883995u,40u,1610612768u,20116u,138442753u,67108864u}/* 26B3 */, /*8525*/{0,688u,65537u,76883995u,40u,1610612768u,20124u,138442753u,67108864u}/* 26B4 */, /*8526*/{0,688u,65537u,76883995u,40u,1610612768u,20132u,138442753u,67108864u}/* 26B5 */, /*8527*/{0,688u,65537u,76883995u,40u,1610612768u,20140u,138442753u,67108864u}/* 26B6 */, /*8528*/{0,688u,65537u,76883995u,40u,1610612768u,20148u,138442753u,67108864u}/* 26B7 */, /*8529*/{0,688u,65537u,76883995u,40u,1610612768u,20156u,138442753u,67108864u}/* 26B8 */, /*8530*/{0,688u,65537u,76883995u,40u,1610612768u,20164u,138442753u,67108864u}/* 26B9 */, /*8531*/{0,688u,65537u,76883995u,40u,1610612768u,20172u,138442753u,67108864u}/* 26BA */, /*8532*/{0,688u,65537u,76883995u,40u,1610612768u,20180u,138442753u,67108864u}/* 26BB */, /*8533*/{0,688u,65537u,76883995u,40u,1610612768u,20188u,138442753u,67108864u}/* 26BC */, /*8534*/{0,691u,65537u,103131163u,8u,1610617120u,20196u,138442753u,67108864u}/* 26BD */, /*8535*/{0,691u,65537u,103131163u,8u,1610617120u,20204u,138442753u,67108864u}/* 26BE */, /*8536*/{0,689u,65537u,103131163u,40u,1610612768u,20212u,138442753u,67108864u}/* 26BF */, /*8537*/{0,688u,65537u,103098395u,40u,1610612768u,20220u,138442753u,67108864u}/* 26C0 */, /*8538*/{0,688u,65537u,103098395u,40u,1610612768u,20228u,138442753u,67108864u}/* 26C1 */, /*8539*/{0,688u,65537u,103098395u,40u,1610612768u,20236u,138442753u,67108864u}/* 26C2 */, /*8540*/{0,688u,65537u,103098395u,40u,1610612768u,20244u,138442753u,67108864u}/* 26C3 */, /*8541*/{0,691u,65537u,103131163u,8u,1610617120u,20252u,138442753u,67108864u}/* 26C4 */, /*8542*/{0,691u,65537u,103131163u,8u,1610617120u,20260u,138442753u,67108864u}/* 26C5 */, /*8543*/{0,689u,65537u,103131163u,40u,1610612768u,20268u,138442753u,67108864u}/* 26C6 */, /*8544*/{0,689u,65537u,103131163u,40u,1610612768u,20276u,138442753u,67108864u}/* 26C7 */, /*8545*/{0,689u,65537u,103131163u,8u,1610616864u,20284u,138442753u,67108864u}/* 26C8 */, /*8546*/{0,689u,65537u,89499675u,40u,1610612768u,20292u,138442753u,67108864u}/* 26C9 */, /*8547*/{0,689u,65537u,89499675u,40u,1610612768u,20300u,138442753u,67108864u}/* 26CA */, /*8548*/{0,689u,65537u,89499675u,40u,1610612768u,20308u,138442753u,67108864u}/* 26CB */, /*8549*/{0,689u,65537u,89499675u,40u,1610612768u,20316u,138442753u,67108864u}/* 26CC */, /*8550*/{0,689u,65537u,103131163u,40u,1610612768u,20324u,138442753u,67108864u}/* 26CD */, /*8551*/{0,691u,65537u,76949531u,8u,1610617120u,20332u,138442753u,67108864u}/* 26CE */, /*8552*/{0,689u,65537u,103131163u,8u,1610616864u,20340u,138442753u,67108864u}/* 26CF */, /*8553*/{0,689u,65537u,103131163u,40u,1610612768u,20348u,138442753u,67108864u}/* 26D0 */, /*8554*/{0,689u,65537u,103131163u,8u,1610616864u,20356u,138442753u,67108864u}/* 26D1 */, /*8555*/{0,689u,65537u,89499675u,40u,1610612768u,20364u,138442753u,67108864u}/* 26D2 */, /*8556*/{0,689u,65537u,103131163u,8u,1610616864u,20372u,138442753u,67108864u}/* 26D3 */, /*8557*/{0,691u,65537u,103131163u,8u,1610617120u,20380u,138442753u,67108864u}/* 26D4 */, /*8558*/{0,689u,65537u,89499675u,40u,1610612768u,20388u,138442753u,67108864u}/* 26D5 */, /*8559*/{0,689u,65537u,89499675u,40u,1610612768u,20396u,138442753u,67108864u}/* 26D6 */, /*8560*/{0,689u,65537u,89499675u,40u,1610612768u,20404u,138442753u,67108864u}/* 26D7 */, /*8561*/{0,689u,65537u,103131163u,40u,1610612768u,20412u,138442753u,67108864u}/* 26D8 */, /*8562*/{0,689u,65537u,103131163u,40u,1610612768u,20420u,138442753u,67108864u}/* 26D9 */, /*8563*/{0,689u,65537u,89499675u,40u,1610612768u,20428u,138442753u,67108864u}/* 26DA */, /*8564*/{0,689u,65537u,89499675u,40u,1610612768u,20436u,138442753u,67108864u}/* 26DB */, /*8565*/{0,689u,65537u,103131163u,40u,1610612768u,20444u,138442753u,67108864u}/* 26DC */, /*8566*/{0,689u,65537u,89499675u,40u,1610612768u,20452u,138442753u,67108864u}/* 26DD */, /*8567*/{0,689u,65537u,89499675u,40u,1610612768u,20460u,138442753u,67108864u}/* 26DE */, /*8568*/{0,689u,65537u,103131163u,40u,1610612768u,20468u,138442753u,67108864u}/* 26DF */, /*8569*/{0,689u,65537u,103131163u,40u,1610612768u,20476u,138442753u,67108864u}/* 26E0 */, /*8570*/{0,689u,65537u,103131163u,40u,1610612768u,20484u,138442753u,67108864u}/* 26E1 */, /*8571*/{0,688u,65537u,76949531u,40u,1610612768u,20492u,138442753u,67108864u}/* 26E2 */, /*8572*/{0,689u,65537u,89499675u,40u,1610612768u,20500u,138442753u,67108864u}/* 26E3 */, /*8573*/{0,688u,65537u,76949531u,40u,1610612768u,20508u,138442753u,67108864u}/* 26E4 */, /*8574*/{0,688u,65537u,76949531u,40u,1610612768u,20516u,138442753u,67108864u}/* 26E5 */, /*8575*/{0,688u,65537u,76949531u,40u,1610612768u,20524u,138442753u,67108864u}/* 26E6 */, /*8576*/{0,688u,65537u,76949531u,40u,1610612768u,20532u,138442753u,67108864u}/* 26E7 */, /*8577*/{0,689u,65537u,89499675u,40u,1610612768u,20540u,138442753u,67108864u}/* 26E8 */, /*8578*/{0,689u,65537u,89499675u,8u,1610616864u,20548u,138442753u,67108864u}/* 26E9 */, /*8579*/{0,691u,65537u,103131163u,8u,1610617120u,20556u,138442753u,67108864u}/* 26EA */, /*8580*/{0,689u,65537u,89499675u,40u,1610612768u,20564u,138442753u,67108864u}/* 26EB */, /*8581*/{0,689u,65537u,89499675u,40u,1610612768u,20572u,138442753u,67108864u}/* 26EC */, /*8582*/{0,689u,65537u,89499675u,40u,1610612768u,20580u,138442753u,67108864u}/* 26ED */, /*8583*/{0,689u,65537u,89499675u,40u,1610612768u,20588u,138442753u,67108864u}/* 26EE */, /*8584*/{0,689u,65537u,89499675u,40u,1610612768u,20596u,138442753u,67108864u}/* 26EF */, /*8585*/{0,689u,65537u,89499675u,8u,1610616864u,20604u,138442753u,67108864u}/* 26F0 */, /*8586*/{0,689u,65537u,103131163u,8u,1610616864u,20612u,138442753u,67108864u}/* 26F1 */, /*8587*/{0,691u,65537u,103131163u,8u,1610617120u,20620u,138442753u,67108864u}/* 26F2 */, /*8588*/{0,691u,65537u,103131163u,8u,1610617120u,20628u,138442753u,67108864u}/* 26F3 */, /*8589*/{0,689u,65537u,103131163u,8u,1610616864u,20636u,138442753u,67108864u}/* 26F4 */, /*8590*/{0,691u,65537u,103131163u,8u,1610617120u,20644u,138442753u,67108864u}/* 26F5 */, /*8591*/{0,689u,65537u,89499675u,40u,1610612768u,20652u,138442753u,67108864u}/* 26F6 */, /*8592*/{0,689u,65537u,103131163u,8u,1610616864u,20660u,138442753u,67108864u}/* 26F7 */, /*8593*/{0,689u,65537u,103131163u,8u,1610616864u,20668u,138442753u,67108864u}/* 26F8 */, /*8594*/{0,689u,65537u,104179739u,1747058696u,1610617376u,20676u,138442753u,67108864u}/* 26F9 */, /*8595*/{0,691u,65537u,103131163u,8u,1610617120u,20684u,138442753u,67108864u}/* 26FA */, /*8596*/{0,689u,65537u,89499675u,40u,1610612768u,20692u,138442753u,67108864u}/* 26FB */, /*8597*/{0,689u,65537u,89499675u,40u,1610612768u,20700u,138442753u,67108864u}/* 26FC */, /*8598*/{0,691u,65537u,103131163u,8u,1610617120u,20708u,138442753u,67108864u}/* 26FD */, /*8599*/{0,689u,65537u,103131163u,40u,1610612768u,20716u,138442753u,67108864u}/* 26FE */, /*8600*/{0,689u,65537u,103131163u,40u,1610612768u,20724u,138442753u,67108864u}/* 26FF */, /*8601*/{0,696u,65537u,103295003u,40u,1610612768u,20940u,138442753u,67108864u}/* 2700 */, /*8602*/{0,696u,65537u,102803483u,40u,1610612768u,20948u,138442753u,67108864u}/* 2701 */, /*8603*/{0,696u,65537u,102803483u,8u,1610616864u,20956u,138442753u,67108864u}/* 2702 */, /*8604*/{0,696u,65537u,102803483u,40u,1610612768u,20964u,138442753u,67108864u}/* 2703 */, /*8605*/{0,696u,65537u,102803483u,40u,1610612768u,20972u,138442753u,67108864u}/* 2704 */, /*8606*/{0,699u,65537u,76949531u,8u,1610617120u,20980u,138442753u,67108864u}/* 2705 */, /*8607*/{0,696u,65537u,76589083u,40u,1610612768u,20988u,138442753u,67108864u}/* 2706 */, /*8608*/{0,696u,65537u,76589083u,40u,1610612768u,20996u,138442753u,67108864u}/* 2707 */, /*8609*/{0,696u,65537u,102803483u,2150105096u,1610616864u,21004u,138442753u,67108864u}/* 2708 */, /*8610*/{0,696u,65537u,102803483u,8u,1610616864u,21012u,138442753u,67108864u}/* 2709 */, /*8611*/{0,699u,65537u,104212507u,1747058696u,1610617632u,21020u,138442753u,67108864u}/* 270A */, /*8612*/{0,699u,65537u,104212507u,1747058696u,1610617632u,21028u,138442753u,67108864u}/* 270B */, /*8613*/{0,696u,65537u,103852059u,1747058696u,1610617376u,21036u,138442753u,67108864u}/* 270C */, /*8614*/{0,696u,65537u,103852059u,1747058696u,1610617376u,21044u,138442753u,67108864u}/* 270D */, /*8615*/{0,696u,65537u,76589083u,40u,1610612768u,21052u,138442753u,67108864u}/* 270E */, /*8616*/{0,696u,65537u,76589083u,8u,1610616864u,21060u,138442753u,67108864u}/* 270F */, /*8617*/{0,696u,65537u,76589083u,40u,1610612768u,21068u,138442753u,67108864u}/* 2710 */, /*8618*/{0,696u,65537u,76589083u,40u,1610612768u,21076u,138442753u,67108864u}/* 2711 */, /*8619*/{0,696u,65537u,76589083u,8u,1610616864u,21084u,138442753u,67108864u}/* 2712 */, /*8620*/{0,696u,65537u,76589083u,40u,1610612768u,21092u,138442753u,67108864u}/* 2713 */, /*8621*/{0,696u,65537u,76589083u,8u,1610616864u,21100u,138442753u,67108864u}/* 2714 */, /*8622*/{0,696u,65537u,76589083u,40u,1610612768u,21108u,138442753u,67108864u}/* 2715 */, /*8623*/{0,696u,65537u,76589083u,8u,1610616864u,21116u,138442753u,67108864u}/* 2716 */, /*8624*/{0,696u,65537u,76589083u,40u,1610612768u,21124u,138442753u,67108864u}/* 2717 */, /*8625*/{0,696u,65537u,76589083u,40u,1610612768u,21132u,138442753u,67108864u}/* 2718 */, /*8626*/{0,696u,65537u,76589083u,40u,1610612768u,21140u,138442753u,67108864u}/* 2719 */, /*8627*/{0,696u,65537u,76589083u,40u,1610612768u,21148u,138442753u,67108864u}/* 271A */, /*8628*/{0,696u,65537u,76589083u,40u,1610612768u,21156u,138442753u,67108864u}/* 271B */, /*8629*/{0,696u,65537u,76589083u,40u,1610612768u,21164u,138442753u,67108864u}/* 271C */, /*8630*/{0,696u,65537u,76589083u,8u,1610616864u,21172u,138442753u,67108864u}/* 271D */, /*8631*/{0,696u,65537u,76589083u,40u,1610612768u,21180u,138442753u,67108864u}/* 271E */, /*8632*/{0,696u,65537u,76589083u,40u,1610612768u,21188u,138442753u,67108864u}/* 271F */, /*8633*/{0,696u,65537u,76589083u,40u,1610612768u,21196u,138442753u,67108864u}/* 2720 */, /*8634*/{0,696u,65537u,76589083u,8u,1610616864u,21204u,138442753u,67108864u}/* 2721 */, /*8635*/{0,696u,65537u,76589083u,40u,1610612768u,21212u,138442753u,67108864u}/* 2722 */, /*8636*/{0,696u,65537u,76589083u,40u,1610612768u,21220u,138442753u,67108864u}/* 2723 */, /*8637*/{0,696u,65537u,76589083u,40u,1610612768u,21228u,138442753u,67108864u}/* 2724 */, /*8638*/{0,696u,65537u,76589083u,40u,1610612768u,21236u,138442753u,67108864u}/* 2725 */, /*8639*/{0,696u,65537u,76589083u,40u,1610612768u,21244u,138442753u,67108864u}/* 2726 */, /*8640*/{0,696u,65537u,76589083u,40u,1610612768u,21252u,138442753u,67108864u}/* 2727 */, /*8641*/{0,699u,65537u,76949531u,8u,1610617120u,21260u,138442753u,67108864u}/* 2728 */, /*8642*/{0,696u,65537u,76589083u,40u,1610612768u,21268u,138442753u,67108864u}/* 2729 */, /*8643*/{0,696u,65537u,76589083u,40u,1610612768u,21276u,138442753u,67108864u}/* 272A */, /*8644*/{0,696u,65537u,76589083u,40u,1610612768u,21284u,138442753u,67108864u}/* 272B */, /*8645*/{0,696u,65537u,76589083u,40u,1610612768u,21292u,138442753u,67108864u}/* 272C */, /*8646*/{0,696u,65537u,76589083u,40u,1610612768u,21300u,138442753u,67108864u}/* 272D */, /*8647*/{0,696u,65537u,76589083u,40u,1610612768u,21308u,138442753u,67108864u}/* 272E */, /*8648*/{0,696u,65537u,76589083u,40u,1610612768u,21316u,138442753u,67108864u}/* 272F */, /*8649*/{0,696u,65537u,76589083u,40u,1610612768u,21324u,138442753u,67108864u}/* 2730 */, /*8650*/{0,696u,65537u,76589083u,40u,1610612768u,21332u,138442753u,67108864u}/* 2731 */, /*8651*/{0,696u,65537u,76589083u,40u,1610612768u,21340u,138442753u,67108864u}/* 2732 */, /*8652*/{0,696u,65537u,76589083u,8u,1610616864u,21348u,138442753u,67108864u}/* 2733 */, /*8653*/{0,696u,65537u,76589083u,8u,1610616864u,21356u,138442753u,67108864u}/* 2734 */, /*8654*/{0,696u,65537u,76589083u,40u,1610612768u,21364u,138442753u,67108864u}/* 2735 */, /*8655*/{0,696u,65537u,76589083u,40u,1610612768u,21372u,138442753u,67108864u}/* 2736 */, /*8656*/{0,696u,65537u,76589083u,40u,1610612768u,21380u,138442753u,67108864u}/* 2737 */, /*8657*/{0,696u,65537u,76589083u,40u,1610612768u,21388u,138442753u,67108864u}/* 2738 */, /*8658*/{0,696u,65537u,76589083u,40u,1610612768u,21396u,138442753u,67108864u}/* 2739 */, /*8659*/{0,696u,65537u,76589083u,40u,1610612768u,21404u,138442753u,67108864u}/* 273A */, /*8660*/{0,696u,65537u,76589083u,40u,1610612768u,21412u,138442753u,67108864u}/* 273B */, /*8661*/{0,696u,65537u,76589083u,40u,1610612768u,21420u,138442753u,67108864u}/* 273C */, /*8662*/{0,697u,65537u,76589083u,40u,1610612768u,21428u,138442753u,67108864u}/* 273D */, /*8663*/{0,696u,65537u,76589083u,40u,1610612768u,21436u,138442753u,67108864u}/* 273E */, /*8664*/{0,696u,65537u,76589083u,40u,1610612768u,21444u,138442753u,67108864u}/* 273F */, /*8665*/{0,696u,65537u,76589083u,40u,1610612768u,21452u,138442753u,67108864u}/* 2740 */, /*8666*/{0,696u,65537u,76589083u,40u,1610612768u,21460u,138442753u,67108864u}/* 2741 */, /*8667*/{0,696u,65537u,76589083u,40u,1610612768u,21468u,138442753u,67108864u}/* 2742 */, /*8668*/{0,696u,65537u,76589083u,40u,1610612768u,21476u,138442753u,67108864u}/* 2743 */, /*8669*/{0,696u,65537u,76589083u,8u,1610616864u,21484u,138442753u,67108864u}/* 2744 */, /*8670*/{0,696u,65537u,76589083u,40u,1610612768u,21492u,138442753u,67108864u}/* 2745 */, /*8671*/{0,696u,65537u,76589083u,40u,1610612768u,21500u,138442753u,67108864u}/* 2746 */, /*8672*/{0,696u,65537u,76589083u,8u,1610616864u,21508u,138442753u,67108864u}/* 2747 */, /*8673*/{0,696u,65537u,76589083u,40u,1610612768u,21516u,138442753u,67108864u}/* 2748 */, /*8674*/{0,696u,65537u,76589083u,40u,1610612768u,21524u,138442753u,67108864u}/* 2749 */, /*8675*/{0,696u,65537u,76589083u,40u,1610612768u,21532u,138442753u,67108864u}/* 274A */, /*8676*/{0,696u,65537u,76589083u,40u,1610612768u,21540u,138442753u,67108864u}/* 274B */, /*8677*/{0,699u,65537u,76949531u,8u,1610617120u,21548u,138442753u,67108864u}/* 274C */, /*8678*/{0,696u,65537u,76589083u,40u,1610612768u,21556u,138442753u,67108864u}/* 274D */, /*8679*/{0,699u,65537u,76949531u,8u,1610617120u,21564u,138442753u,67108864u}/* 274E */, /*8680*/{0,696u,65537u,76589083u,40u,1610612768u,21572u,138442753u,67108864u}/* 274F */, /*8681*/{0,696u,65537u,76589083u,40u,1610612768u,21580u,138442753u,67108864u}/* 2750 */, /*8682*/{0,696u,65537u,76589083u,40u,1610612768u,21588u,138442753u,67108864u}/* 2751 */, /*8683*/{0,696u,65537u,76589083u,40u,1610612768u,21596u,138442753u,67108864u}/* 2752 */, /*8684*/{0,699u,65537u,76949531u,8u,1610617120u,21604u,138442753u,67108864u}/* 2753 */, /*8685*/{0,699u,65537u,76949531u,8u,1610617120u,21612u,138442753u,67108864u}/* 2754 */, /*8686*/{0,699u,65537u,76949531u,8u,1610617120u,21620u,138442753u,67108864u}/* 2755 */, /*8687*/{0,696u,65537u,76589083u,40u,1610612768u,21628u,138442753u,67108864u}/* 2756 */, /*8688*/{0,699u,65537u,89499675u,8u,1610617120u,21636u,138442753u,67108864u}/* 2757 */, /*8689*/{0,696u,65537u,76589083u,40u,1610612768u,21644u,138442753u,67108864u}/* 2758 */, /*8690*/{0,696u,65537u,76589083u,40u,1610612768u,21652u,138442753u,67108864u}/* 2759 */, /*8691*/{0,696u,65537u,76589083u,40u,1610612768u,21660u,138442753u,67108864u}/* 275A */, /*8692*/{0,696u,65537u,75540507u,106536u,1610612768u,21668u,138442753u,67108864u}/* 275B */, /*8693*/{0,696u,65537u,75540507u,106536u,1610612768u,21676u,138442753u,67108864u}/* 275C */, /*8694*/{0,696u,65537u,75540507u,106536u,1610612768u,21684u,138442753u,67108864u}/* 275D */, /*8695*/{0,696u,65537u,75540507u,106536u,1610612768u,21692u,138442753u,67108864u}/* 275E */, /*8696*/{0,696u,65537u,75900955u,106536u,1610612768u,21700u,138442753u,67108864u}/* 275F */, /*8697*/{0,696u,65537u,75900955u,106536u,1610612768u,21708u,138442753u,67108864u}/* 2760 */, /*8698*/{0,696u,65537u,76589083u,40u,1610612768u,21716u,138442753u,67108864u}/* 2761 */, /*8699*/{0,696u,65537u,74491931u,40u,1610612768u,21724u,138442753u,67108864u}/* 2762 */, /*8700*/{0,696u,65537u,74491931u,8u,1610616864u,21732u,138442753u,67108864u}/* 2763 */, /*8701*/{0,696u,65537u,102803483u,2150105096u,1610616864u,21740u,138442753u,67108864u}/* 2764 */, /*8702*/{0,696u,65537u,76589083u,40u,1610612768u,21748u,138442753u,67108864u}/* 2765 */, /*8703*/{0,696u,65537u,76589083u,40u,1610612768u,21756u,138442753u,67108864u}/* 2766 */, /*8704*/{0,696u,65537u,76589083u,40u,1610612768u,21764u,138442753u,67108864u}/* 2767 */, /*8705*/{0,594616u,65537u,79898644u,106536u,1744830496u,6780u,138442755u,0}/* 2768 */, /*8706*/{0,598712u,65537u,86190101u,106536u,1744830496u,6788u,138442755u,0}/* 2769 */, /*8707*/{0,602808u,65537u,79898644u,106536u,1744830496u,6796u,138442755u,0}/* 276A */, /*8708*/{0,606904u,65537u,86190101u,106536u,1744830496u,6804u,138442755u,0}/* 276B */, /*8709*/{0,611000u,65537u,79898644u,106536u,1744830496u,6812u,138442755u,0}/* 276C */, /*8710*/{0,615096u,65537u,86190101u,106536u,1744830496u,6820u,138442755u,0}/* 276D */, /*8711*/{0,619192u,65537u,79898644u,106536u,1744830496u,6828u,138442755u,0}/* 276E */, /*8712*/{0,623288u,65537u,86190101u,106536u,1744830496u,6836u,138442755u,0}/* 276F */, /*8713*/{0,627384u,65537u,79898644u,106536u,1744830496u,6844u,138442755u,0}/* 2770 */, /*8714*/{0,631480u,65537u,86190101u,106536u,1744830496u,6852u,138442755u,0}/* 2771 */, /*8715*/{0,635576u,65537u,79898644u,106536u,1744830496u,6860u,138442755u,0}/* 2772 */, /*8716*/{0,639672u,65537u,86190101u,106536u,1744830496u,6868u,138442755u,0}/* 2773 */, /*8717*/{0,643768u,65537u,79898644u,106536u,1744830496u,6876u,138442755u,0}/* 2774 */, /*8718*/{0,647864u,65537u,86190101u,106536u,1744830496u,6884u,138442755u,0}/* 2775 */, /*8719*/{0,697u,536937985u,89171979u,8388652u,1610612768u,58669u,138475520u,0}/* 2776 */, /*8720*/{0,697u,570493441u,89171979u,8388652u,1610612768u,58677u,138475520u,0}/* 2777 */, /*8721*/{0,697u,604047361u,89171979u,8388652u,1610612768u,58685u,138475520u,0}/* 2778 */, /*8722*/{0,697u,637603841u,89171979u,8388652u,1610612768u,58693u,138475520u,0}/* 2779 */, /*8723*/{0,697u,671157249u,89171979u,8388652u,1610612768u,58701u,138475520u,0}/* 277A */, /*8724*/{0,697u,704714241u,89171979u,8388652u,1610612768u,58709u,138475520u,0}/* 277B */, /*8725*/{0,697u,738266625u,89171979u,8388652u,1610612768u,58717u,138475520u,0}/* 277C */, /*8726*/{0,697u,771824641u,89171979u,8388652u,1610612768u,58725u,138475520u,0}/* 277D */, /*8727*/{0,697u,805377025u,89171979u,8388652u,1610612768u,58733u,138475520u,0}/* 277E */, /*8728*/{0,697u,822157313u,89171979u,8388650u,1610612768u,117317u,272742400u,0}/* 277F */, /*8729*/{0,696u,536937985u,89171979u,8388652u,1610612768u,58669u,138475520u,0}/* 2780 */, /*8730*/{0,696u,570493441u,89171979u,8388652u,1610612768u,58677u,138475520u,0}/* 2781 */, /*8731*/{0,696u,604047361u,89171979u,8388652u,1610612768u,58685u,138475520u,0}/* 2782 */, /*8732*/{0,696u,637603841u,89171979u,8388652u,1610612768u,58693u,138475520u,0}/* 2783 */, /*8733*/{0,696u,671157249u,89171979u,8388652u,1610612768u,58701u,138475520u,0}/* 2784 */, /*8734*/{0,696u,704714241u,89171979u,8388652u,1610612768u,58709u,138475520u,0}/* 2785 */, /*8735*/{0,696u,738266625u,89171979u,8388652u,1610612768u,58717u,138475520u,0}/* 2786 */, /*8736*/{0,696u,771824641u,89171979u,8388652u,1610612768u,58725u,138475520u,0}/* 2787 */, /*8737*/{0,696u,805377025u,89171979u,8388652u,1610612768u,58733u,138475520u,0}/* 2788 */, /*8738*/{0,696u,822157313u,89171979u,8388650u,1610612768u,117317u,272742400u,0}/* 2789 */, /*8739*/{0,696u,65537u,76589083u,40u,1610612768u,21772u,138442753u,67108864u}/* 2794 */, /*8740*/{0,699u,65537u,76949531u,8u,1610617120u,21780u,138442753u,67108864u}/* 2795 */, /*8741*/{0,699u,65537u,76949531u,8u,1610617120u,21788u,138442753u,67108864u}/* 2796 */, /*8742*/{0,699u,65537u,76949531u,8u,1610617120u,21796u,138442753u,67108864u}/* 2797 */, /*8743*/{0,696u,65537u,76589083u,40u,1610612768u,21804u,138442753u,67108864u}/* 2798 */, /*8744*/{0,696u,65537u,76589083u,40u,1610612768u,21812u,138442753u,67108864u}/* 2799 */, /*8745*/{0,696u,65537u,76589083u,40u,1610612768u,21820u,138442753u,67108864u}/* 279A */, /*8746*/{0,696u,65537u,76589083u,40u,1610612768u,21828u,138442753u,67108864u}/* 279B */, /*8747*/{0,696u,65537u,76589083u,40u,1610612768u,21836u,138442753u,67108864u}/* 279C */, /*8748*/{0,696u,65537u,76589083u,40u,1610612768u,21844u,138442753u,67108864u}/* 279D */, /*8749*/{0,696u,65537u,76589083u,40u,1610612768u,21852u,138442753u,67108864u}/* 279E */, /*8750*/{0,696u,65537u,76589083u,40u,1610612768u,21860u,138442753u,67108864u}/* 279F */, /*8751*/{0,696u,65537u,76589083u,40u,1610612768u,21868u,138442753u,67108864u}/* 27A0 */, /*8752*/{0,696u,65537u,76589083u,8u,1610616864u,21876u,138442753u,67108864u}/* 27A1 */, /*8753*/{0,696u,65537u,76589083u,40u,1610612768u,21884u,138442753u,67108864u}/* 27A2 */, /*8754*/{0,696u,65537u,76589083u,40u,1610612768u,21892u,138442753u,67108864u}/* 27A3 */, /*8755*/{0,696u,65537u,76589083u,40u,1610612768u,21900u,138442753u,67108864u}/* 27A4 */, /*8756*/{0,696u,65537u,76589083u,40u,1610612768u,21908u,138442753u,67108864u}/* 27A5 */, /*8757*/{0,696u,65537u,76589083u,40u,1610612768u,21916u,138442753u,67108864u}/* 27A6 */, /*8758*/{0,696u,65537u,76589083u,40u,1610612768u,21924u,138442753u,67108864u}/* 27A7 */, /*8759*/{0,696u,65537u,76589083u,40u,1610612768u,21932u,138442753u,67108864u}/* 27A8 */, /*8760*/{0,696u,65537u,76589083u,40u,1610612768u,21940u,138442753u,67108864u}/* 27A9 */, /*8761*/{0,696u,65537u,76589083u,40u,1610612768u,21948u,138442753u,67108864u}/* 27AA */, /*8762*/{0,696u,65537u,76589083u,40u,1610612768u,21956u,138442753u,67108864u}/* 27AB */, /*8763*/{0,696u,65537u,76589083u,40u,1610612768u,21964u,138442753u,67108864u}/* 27AC */, /*8764*/{0,696u,65537u,76589083u,40u,1610612768u,21972u,138442753u,67108864u}/* 27AD */, /*8765*/{0,696u,65537u,76589083u,40u,1610612768u,21980u,138442753u,67108864u}/* 27AE */, /*8766*/{0,696u,65537u,76589083u,40u,1610612768u,21988u,138442753u,67108864u}/* 27AF */, /*8767*/{0,699u,65537u,76949531u,8u,1610617120u,21996u,138442753u,67108864u}/* 27B0 */, /*8768*/{0,696u,65537u,76589083u,40u,1610612768u,22004u,138442753u,67108864u}/* 27B1 */, /*8769*/{0,696u,65537u,76589083u,40u,1610612768u,22012u,138442753u,67108864u}/* 27B2 */, /*8770*/{0,696u,65537u,76589083u,40u,1610612768u,22020u,138442753u,67108864u}/* 27B3 */, /*8771*/{0,696u,65537u,76589083u,40u,1610612768u,22028u,138442753u,67108864u}/* 27B4 */, /*8772*/{0,696u,65537u,76589083u,40u,1610612768u,22036u,138442753u,67108864u}/* 27B5 */, /*8773*/{0,696u,65537u,76589083u,40u,1610612768u,22044u,138442753u,67108864u}/* 27B6 */, /*8774*/{0,696u,65537u,76589083u,40u,1610612768u,22052u,138442753u,67108864u}/* 27B7 */, /*8775*/{0,696u,65537u,76589083u,40u,1610612768u,22060u,138442753u,67108864u}/* 27B8 */, /*8776*/{0,696u,65537u,76589083u,40u,1610612768u,22068u,138442753u,67108864u}/* 27B9 */, /*8777*/{0,696u,65537u,76589083u,40u,1610612768u,22076u,138442753u,67108864u}/* 27BA */, /*8778*/{0,696u,65537u,76589083u,40u,1610612768u,22084u,138442753u,67108864u}/* 27BB */, /*8779*/{0,696u,65537u,76589083u,40u,1610612768u,22092u,138442753u,67108864u}/* 27BC */, /*8780*/{0,696u,65537u,76589083u,40u,1610612768u,22100u,138442753u,67108864u}/* 27BD */, /*8781*/{0,696u,65537u,76589083u,40u,1610612768u,22108u,138442753u,67108864u}/* 27BE */, /*8782*/{0,699u,65537u,76949531u,8u,1610617120u,22116u,138442753u,67108864u}/* 27BF */, /*8783*/{0,704u,65537u,76818456u,40u,1744830496u,22126u,138442753u,67108864u}/* 27C0 */, /*8784*/{0,704u,65537u,76818456u,40u,1610612768u,22134u,138442753u,67108864u}/* 27C1 */, /*8785*/{0,704u,65537u,76818456u,40u,1610612768u,22142u,138442753u,67108864u}/* 27C2 */, /*8786*/{0,651968u,65537u,76818456u,40u,1744830496u,22150u,138442753u,67108864u}/* 27C3 */, /*8787*/{0,656064u,65537u,76818456u,40u,1744830496u,22158u,138442753u,67108864u}/* 27C4 */, /*8788*/{0,660160u,65537u,79964180u,106536u,1744830496u,6686u,138442763u,0}/* 27C5 */, /*8789*/{0,664256u,65537u,86255637u,106536u,1744830496u,6694u,138442763u,0}/* 27C6 */, /*8790*/{0,704u,65537u,76851224u,40u,1610612768u,22166u,138442753u,67108864u}/* 27C7 */, /*8791*/{0,668352u,65537u,76851224u,40u,1744830496u,22174u,138442753u,67108864u}/* 27C8 */, /*8792*/{0,672448u,65537u,76851224u,40u,1744830496u,22182u,138442753u,67108864u}/* 27C9 */, /*8793*/{0,704u,65537u,76851224u,40u,1610612768u,22190u,138442753u,67108864u}/* 27CA */, /*8794*/{0,676544u,65537u,76982296u,40u,1744830496u,22198u,138442753u,67108864u}/* 27CB */, /*8795*/{0,704u,65537u,76883992u,40u,1744830496u,22206u,138442753u,67108864u}/* 27CC */, /*8796*/{0,680640u,65537u,76982296u,40u,1744830496u,22214u,138442753u,67108864u}/* 27CD */, /*8797*/{0,704u,65537u,76949528u,40u,1610612768u,22222u,138442753u,67108864u}/* 27CE */, /*8798*/{0,704u,65537u,76949528u,40u,1610612768u,22230u,138442753u,67108864u}/* 27CF */, /*8799*/{0,704u,65537u,76752920u,40u,1610612768u,22238u,138442753u,67108864u}/* 27D0 */, /*8800*/{0,704u,65537u,76752920u,40u,1610612768u,22246u,138442753u,67108864u}/* 27D1 */, /*8801*/{0,704u,65537u,76752920u,40u,1610612768u,22254u,138442753u,67108864u}/* 27D2 */, /*8802*/{0,704u,65537u,76752920u,40u,1744830496u,22262u,138442753u,67108864u}/* 27D3 */, /*8803*/{0,704u,65537u,76752920u,40u,1744830496u,22270u,138442753u,67108864u}/* 27D4 */, /*8804*/{0,684736u,65537u,76752920u,40u,1744830496u,22278u,138442753u,67108864u}/* 27D5 */, /*8805*/{0,688832u,65537u,76752920u,40u,1744830496u,22286u,138442753u,67108864u}/* 27D6 */, /*8806*/{0,704u,65537u,76752920u,40u,1610612768u,22294u,138442753u,67108864u}/* 27D7 */, /*8807*/{0,704u,65537u,76752920u,40u,1610612768u,22302u,138442753u,67108864u}/* 27D8 */, /*8808*/{0,704u,65537u,76752920u,40u,1610612768u,22310u,138442753u,67108864u}/* 27D9 */, /*8809*/{0,704u,65537u,76752920u,40u,1610612768u,22318u,138442753u,67108864u}/* 27DA */, /*8810*/{0,704u,65537u,76752920u,40u,1610612768u,22326u,138442753u,67108864u}/* 27DB */, /*8811*/{0,704u,65537u,76752920u,40u,1744830496u,22334u,138442753u,67108864u}/* 27DC */, /*8812*/{0,692928u,65537u,76752920u,40u,1744830496u,22342u,138442753u,67108864u}/* 27DD */, /*8813*/{0,697024u,65537u,76752920u,40u,1744830496u,22350u,138442753u,67108864u}/* 27DE */, /*8814*/{0,704u,65537u,76752920u,40u,1610612768u,22358u,138442753u,67108864u}/* 27DF */, /*8815*/{0,704u,65537u,76752920u,40u,1610612768u,22366u,138442753u,67108864u}/* 27E0 */, /*8816*/{0,704u,65537u,76752920u,40u,1610612768u,22374u,138442753u,67108864u}/* 27E1 */, /*8817*/{0,701120u,65537u,76752920u,40u,1744830496u,22382u,138442753u,67108864u}/* 27E2 */, /*8818*/{0,705216u,65537u,76752920u,40u,1744830496u,22390u,138442753u,67108864u}/* 27E3 */, /*8819*/{0,709312u,65537u,76752920u,40u,1744830496u,22398u,138442753u,67108864u}/* 27E4 */, /*8820*/{0,713408u,65537u,76752920u,40u,1744830496u,22406u,138442753u,67108864u}/* 27E5 */, /*8821*/{0,717509u,65537u,79898644u,106536u,1744830496u,6702u,138442763u,0}/* 27E6 */, /*8822*/{0,721605u,65537u,86190101u,106536u,1744830496u,6710u,138442763u,0}/* 27E7 */, /*8823*/{0,725701u,65537u,79898644u,106536u,1744830496u,6718u,138442763u,0}/* 27E8 */, /*8824*/{0,729797u,65537u,86190101u,106536u,1744830496u,6726u,138442763u,0}/* 27E9 */, /*8825*/{0,733893u,65537u,79898644u,106536u,1744830496u,6734u,138442763u,0}/* 27EA */, /*8826*/{0,737989u,65537u,86190101u,106536u,1744830496u,6742u,138442763u,0}/* 27EB */, /*8827*/{0,742085u,65537u,80029716u,106536u,1744830496u,6750u,138442763u,0}/* 27EC */, /*8828*/{0,746181u,65537u,86321173u,106536u,1744830496u,6758u,138442763u,0}/* 27ED */, /*8829*/{0,750272u,65537u,80029716u,106536u,1744830496u,6766u,138442763u,0}/* 27EE */, /*8830*/{0,754368u,65537u,86321173u,106536u,1744830496u,6774u,138442763u,0}/* 27EF */, /*8831*/{0,712u,65537u,76752920u,40u,1610612768u,22414u,138442753u,67108864u}/* 27F0 */, /*8832*/{0,712u,65537u,76752920u,40u,1610612768u,22422u,138442753u,67108864u}/* 27F1 */, /*8833*/{0,712u,65537u,76752920u,40u,1610612768u,22430u,138442753u,67108864u}/* 27F2 */, /*8834*/{0,712u,65537u,76752920u,40u,1610612768u,22438u,138442753u,67108864u}/* 27F3 */, /*8835*/{0,712u,65537u,76752920u,40u,1610612768u,22446u,138442753u,67108864u}/* 27F4 */, /*8836*/{0,712u,65537u,76752920u,40u,1610612768u,22454u,138442753u,67108864u}/* 27F5 */, /*8837*/{0,712u,65537u,76752920u,40u,1610612768u,22462u,138442753u,67108864u}/* 27F6 */, /*8838*/{0,712u,65537u,76752920u,40u,1610612768u,22470u,138442753u,67108864u}/* 27F7 */, /*8839*/{0,712u,65537u,76752920u,40u,1610612768u,22478u,138442753u,67108864u}/* 27F8 */, /*8840*/{0,712u,65537u,76752920u,40u,1610612768u,22486u,138442753u,67108864u}/* 27F9 */, /*8841*/{0,712u,65537u,76752920u,40u,1610612768u,22494u,138442753u,67108864u}/* 27FA */, /*8842*/{0,712u,65537u,76752920u,40u,1610612768u,22502u,138442753u,67108864u}/* 27FB */, /*8843*/{0,712u,65537u,76752920u,40u,1610612768u,22510u,138442753u,67108864u}/* 27FC */, /*8844*/{0,712u,65537u,76752920u,40u,1610612768u,22518u,138442753u,67108864u}/* 27FD */, /*8845*/{0,712u,65537u,76752920u,40u,1610612768u,22526u,138442753u,67108864u}/* 27FE */, /*8846*/{0,712u,65537u,76752920u,40u,1610612768u,22534u,138442753u,67108864u}/* 27FF */, /*8847*/{0,720u,3473409u,76677147u,40u,1610612768u,28076u,138442753u,67108864u}/* 2800 */, /*8848*/{0,720u,3473409u,76677147u,40u,1610612768u,28084u,138442753u,67108864u}/* 2801 */, /*8849*/{0,720u,3473409u,76677147u,40u,1610612768u,28092u,138442753u,67108864u}/* 2802 */, /*8850*/{0,720u,3473409u,76677147u,40u,1610612768u,28100u,138442753u,67108864u}/* 2803 */, /*8851*/{0,720u,3473409u,76677147u,40u,1610612768u,28108u,138442753u,67108864u}/* 2804 */, /*8852*/{0,720u,3473409u,76677147u,40u,1610612768u,28116u,138442753u,67108864u}/* 2805 */, /*8853*/{0,720u,3473409u,76677147u,40u,1610612768u,28124u,138442753u,67108864u}/* 2806 */, /*8854*/{0,720u,3473409u,76677147u,40u,1610612768u,28132u,138442753u,67108864u}/* 2807 */, /*8855*/{0,720u,3473409u,76677147u,40u,1610612768u,28140u,138442753u,67108864u}/* 2808 */, /*8856*/{0,720u,3473409u,76677147u,40u,1610612768u,28148u,138442753u,67108864u}/* 2809 */, /*8857*/{0,720u,3473409u,76677147u,40u,1610612768u,28156u,138442753u,67108864u}/* 280A */, /*8858*/{0,720u,3473409u,76677147u,40u,1610612768u,28164u,138442753u,67108864u}/* 280B */, /*8859*/{0,720u,3473409u,76677147u,40u,1610612768u,28172u,138442753u,67108864u}/* 280C */, /*8860*/{0,720u,3473409u,76677147u,40u,1610612768u,28180u,138442753u,67108864u}/* 280D */, /*8861*/{0,720u,3473409u,76677147u,40u,1610612768u,28188u,138442753u,67108864u}/* 280E */, /*8862*/{0,720u,3473409u,76677147u,40u,1610612768u,28196u,138442753u,67108864u}/* 280F */, /*8863*/{0,720u,3473409u,76677147u,40u,1610612768u,28204u,138442753u,67108864u}/* 2810 */, /*8864*/{0,720u,3473409u,76677147u,40u,1610612768u,28212u,138442753u,67108864u}/* 2811 */, /*8865*/{0,720u,3473409u,76677147u,40u,1610612768u,28220u,138442753u,67108864u}/* 2812 */, /*8866*/{0,720u,3473409u,76677147u,40u,1610612768u,28228u,138442753u,67108864u}/* 2813 */, /*8867*/{0,720u,3473409u,76677147u,40u,1610612768u,28236u,138442753u,67108864u}/* 2814 */, /*8868*/{0,720u,3473409u,76677147u,40u,1610612768u,28244u,138442753u,67108864u}/* 2815 */, /*8869*/{0,720u,3473409u,76677147u,40u,1610612768u,28252u,138442753u,67108864u}/* 2816 */, /*8870*/{0,720u,3473409u,76677147u,40u,1610612768u,28260u,138442753u,67108864u}/* 2817 */, /*8871*/{0,720u,3473409u,76677147u,40u,1610612768u,28268u,138442753u,67108864u}/* 2818 */, /*8872*/{0,720u,3473409u,76677147u,40u,1610612768u,28276u,138442753u,67108864u}/* 2819 */, /*8873*/{0,720u,3473409u,76677147u,40u,1610612768u,28284u,138442753u,67108864u}/* 281A */, /*8874*/{0,720u,3473409u,76677147u,40u,1610612768u,28292u,138442753u,67108864u}/* 281B */, /*8875*/{0,720u,3473409u,76677147u,40u,1610612768u,28300u,138442753u,67108864u}/* 281C */, /*8876*/{0,720u,3473409u,76677147u,40u,1610612768u,28308u,138442753u,67108864u}/* 281D */, /*8877*/{0,720u,3473409u,76677147u,40u,1610612768u,28316u,138442753u,67108864u}/* 281E */, /*8878*/{0,720u,3473409u,76677147u,40u,1610612768u,28324u,138442753u,67108864u}/* 281F */, /*8879*/{0,720u,3473409u,76677147u,40u,1610612768u,28332u,138442753u,67108864u}/* 2820 */, /*8880*/{0,720u,3473409u,76677147u,40u,1610612768u,28340u,138442753u,67108864u}/* 2821 */, /*8881*/{0,720u,3473409u,76677147u,40u,1610612768u,28348u,138442753u,67108864u}/* 2822 */, /*8882*/{0,720u,3473409u,76677147u,40u,1610612768u,28356u,138442753u,67108864u}/* 2823 */, /*8883*/{0,720u,3473409u,76677147u,40u,1610612768u,28364u,138442753u,67108864u}/* 2824 */, /*8884*/{0,720u,3473409u,76677147u,40u,1610612768u,28372u,138442753u,67108864u}/* 2825 */, /*8885*/{0,720u,3473409u,76677147u,40u,1610612768u,28380u,138442753u,67108864u}/* 2826 */, /*8886*/{0,720u,3473409u,76677147u,40u,1610612768u,28388u,138442753u,67108864u}/* 2827 */, /*8887*/{0,720u,3473409u,76677147u,40u,1610612768u,28396u,138442753u,67108864u}/* 2828 */, /*8888*/{0,720u,3473409u,76677147u,40u,1610612768u,28404u,138442753u,67108864u}/* 2829 */, /*8889*/{0,720u,3473409u,76677147u,40u,1610612768u,28412u,138442753u,67108864u}/* 282A */, /*8890*/{0,720u,3473409u,76677147u,40u,1610612768u,28420u,138442753u,67108864u}/* 282B */, /*8891*/{0,720u,3473409u,76677147u,40u,1610612768u,28428u,138442753u,67108864u}/* 282C */, /*8892*/{0,720u,3473409u,76677147u,40u,1610612768u,28436u,138442753u,67108864u}/* 282D */, /*8893*/{0,720u,3473409u,76677147u,40u,1610612768u,28444u,138442753u,67108864u}/* 282E */, /*8894*/{0,720u,3473409u,76677147u,40u,1610612768u,28452u,138442753u,67108864u}/* 282F */, /*8895*/{0,720u,3473409u,76677147u,40u,1610612768u,28460u,138442753u,67108864u}/* 2830 */, /*8896*/{0,720u,3473409u,76677147u,40u,1610612768u,28468u,138442753u,67108864u}/* 2831 */, /*8897*/{0,720u,3473409u,76677147u,40u,1610612768u,28476u,138442753u,67108864u}/* 2832 */, /*8898*/{0,720u,3473409u,76677147u,40u,1610612768u,28484u,138442753u,67108864u}/* 2833 */, /*8899*/{0,720u,3473409u,76677147u,40u,1610612768u,28492u,138442753u,67108864u}/* 2834 */, /*8900*/{0,720u,3473409u,76677147u,40u,1610612768u,28500u,138442753u,67108864u}/* 2835 */, /*8901*/{0,720u,3473409u,76677147u,40u,1610612768u,28508u,138442753u,67108864u}/* 2836 */, /*8902*/{0,720u,3473409u,76677147u,40u,1610612768u,28516u,138442753u,67108864u}/* 2837 */, /*8903*/{0,720u,3473409u,76677147u,40u,1610612768u,28524u,138442753u,67108864u}/* 2838 */, /*8904*/{0,720u,3473409u,76677147u,40u,1610612768u,28532u,138442753u,67108864u}/* 2839 */, /*8905*/{0,720u,3473409u,76677147u,40u,1610612768u,28540u,138442753u,67108864u}/* 283A */, /*8906*/{0,720u,3473409u,76677147u,40u,1610612768u,28548u,138442753u,67108864u}/* 283B */, /*8907*/{0,720u,3473409u,76677147u,40u,1610612768u,28556u,138442753u,67108864u}/* 283C */, /*8908*/{0,720u,3473409u,76677147u,40u,1610612768u,28564u,138442753u,67108864u}/* 283D */, /*8909*/{0,720u,3473409u,76677147u,40u,1610612768u,28572u,138442753u,67108864u}/* 283E */, /*8910*/{0,720u,3473409u,76677147u,40u,1610612768u,28580u,138442753u,67108864u}/* 283F */, /*8911*/{0,720u,3473409u,76677147u,40u,1610612768u,28588u,138442753u,67108864u}/* 2840 */, /*8912*/{0,720u,3473409u,76677147u,40u,1610612768u,28596u,138442753u,67108864u}/* 2841 */, /*8913*/{0,720u,3473409u,76677147u,40u,1610612768u,28604u,138442753u,67108864u}/* 2842 */, /*8914*/{0,720u,3473409u,76677147u,40u,1610612768u,28612u,138442753u,67108864u}/* 2843 */, /*8915*/{0,720u,3473409u,76677147u,40u,1610612768u,28620u,138442753u,67108864u}/* 2844 */, /*8916*/{0,720u,3473409u,76677147u,40u,1610612768u,28628u,138442753u,67108864u}/* 2845 */, /*8917*/{0,720u,3473409u,76677147u,40u,1610612768u,28636u,138442753u,67108864u}/* 2846 */, /*8918*/{0,720u,3473409u,76677147u,40u,1610612768u,28644u,138442753u,67108864u}/* 2847 */, /*8919*/{0,720u,3473409u,76677147u,40u,1610612768u,28652u,138442753u,67108864u}/* 2848 */, /*8920*/{0,720u,3473409u,76677147u,40u,1610612768u,28660u,138442753u,67108864u}/* 2849 */, /*8921*/{0,720u,3473409u,76677147u,40u,1610612768u,28668u,138442753u,67108864u}/* 284A */, /*8922*/{0,720u,3473409u,76677147u,40u,1610612768u,28676u,138442753u,67108864u}/* 284B */, /*8923*/{0,720u,3473409u,76677147u,40u,1610612768u,28684u,138442753u,67108864u}/* 284C */, /*8924*/{0,720u,3473409u,76677147u,40u,1610612768u,28692u,138442753u,67108864u}/* 284D */, /*8925*/{0,720u,3473409u,76677147u,40u,1610612768u,28700u,138442753u,67108864u}/* 284E */, /*8926*/{0,720u,3473409u,76677147u,40u,1610612768u,28708u,138442753u,67108864u}/* 284F */, /*8927*/{0,720u,3473409u,76677147u,40u,1610612768u,28716u,138442753u,67108864u}/* 2850 */, /*8928*/{0,720u,3473409u,76677147u,40u,1610612768u,28724u,138442753u,67108864u}/* 2851 */, /*8929*/{0,720u,3473409u,76677147u,40u,1610612768u,28732u,138442753u,67108864u}/* 2852 */, /*8930*/{0,720u,3473409u,76677147u,40u,1610612768u,28740u,138442753u,67108864u}/* 2853 */, /*8931*/{0,720u,3473409u,76677147u,40u,1610612768u,28748u,138442753u,67108864u}/* 2854 */, /*8932*/{0,720u,3473409u,76677147u,40u,1610612768u,28756u,138442753u,67108864u}/* 2855 */, /*8933*/{0,720u,3473409u,76677147u,40u,1610612768u,28764u,138442753u,67108864u}/* 2856 */, /*8934*/{0,720u,3473409u,76677147u,40u,1610612768u,28772u,138442753u,67108864u}/* 2857 */, /*8935*/{0,720u,3473409u,76677147u,40u,1610612768u,28780u,138442753u,67108864u}/* 2858 */, /*8936*/{0,720u,3473409u,76677147u,40u,1610612768u,28788u,138442753u,67108864u}/* 2859 */, /*8937*/{0,720u,3473409u,76677147u,40u,1610612768u,28796u,138442753u,67108864u}/* 285A */, /*8938*/{0,720u,3473409u,76677147u,40u,1610612768u,28804u,138442753u,67108864u}/* 285B */, /*8939*/{0,720u,3473409u,76677147u,40u,1610612768u,28812u,138442753u,67108864u}/* 285C */, /*8940*/{0,720u,3473409u,76677147u,40u,1610612768u,28820u,138442753u,67108864u}/* 285D */, /*8941*/{0,720u,3473409u,76677147u,40u,1610612768u,28828u,138442753u,67108864u}/* 285E */, /*8942*/{0,720u,3473409u,76677147u,40u,1610612768u,28836u,138442753u,67108864u}/* 285F */, /*8943*/{0,720u,3473409u,76677147u,40u,1610612768u,28844u,138442753u,67108864u}/* 2860 */, /*8944*/{0,720u,3473409u,76677147u,40u,1610612768u,28852u,138442753u,67108864u}/* 2861 */, /*8945*/{0,720u,3473409u,76677147u,40u,1610612768u,28860u,138442753u,67108864u}/* 2862 */, /*8946*/{0,720u,3473409u,76677147u,40u,1610612768u,28868u,138442753u,67108864u}/* 2863 */, /*8947*/{0,720u,3473409u,76677147u,40u,1610612768u,28876u,138442753u,67108864u}/* 2864 */, /*8948*/{0,720u,3473409u,76677147u,40u,1610612768u,28884u,138442753u,67108864u}/* 2865 */, /*8949*/{0,720u,3473409u,76677147u,40u,1610612768u,28892u,138442753u,67108864u}/* 2866 */, /*8950*/{0,720u,3473409u,76677147u,40u,1610612768u,28900u,138442753u,67108864u}/* 2867 */, /*8951*/{0,720u,3473409u,76677147u,40u,1610612768u,28908u,138442753u,67108864u}/* 2868 */, /*8952*/{0,720u,3473409u,76677147u,40u,1610612768u,28916u,138442753u,67108864u}/* 2869 */, /*8953*/{0,720u,3473409u,76677147u,40u,1610612768u,28924u,138442753u,67108864u}/* 286A */, /*8954*/{0,720u,3473409u,76677147u,40u,1610612768u,28932u,138442753u,67108864u}/* 286B */, /*8955*/{0,720u,3473409u,76677147u,40u,1610612768u,28940u,138442753u,67108864u}/* 286C */, /*8956*/{0,720u,3473409u,76677147u,40u,1610612768u,28948u,138442753u,67108864u}/* 286D */, /*8957*/{0,720u,3473409u,76677147u,40u,1610612768u,28956u,138442753u,67108864u}/* 286E */, /*8958*/{0,720u,3473409u,76677147u,40u,1610612768u,28964u,138442753u,67108864u}/* 286F */, /*8959*/{0,720u,3473409u,76677147u,40u,1610612768u,28972u,138442753u,67108864u}/* 2870 */, /*8960*/{0,720u,3473409u,76677147u,40u,1610612768u,28980u,138442753u,67108864u}/* 2871 */, /*8961*/{0,720u,3473409u,76677147u,40u,1610612768u,28988u,138442753u,67108864u}/* 2872 */, /*8962*/{0,720u,3473409u,76677147u,40u,1610612768u,28996u,138442753u,67108864u}/* 2873 */, /*8963*/{0,720u,3473409u,76677147u,40u,1610612768u,29004u,138442753u,67108864u}/* 2874 */, /*8964*/{0,720u,3473409u,76677147u,40u,1610612768u,29012u,138442753u,67108864u}/* 2875 */, /*8965*/{0,720u,3473409u,76677147u,40u,1610612768u,29020u,138442753u,67108864u}/* 2876 */, /*8966*/{0,720u,3473409u,76677147u,40u,1610612768u,29028u,138442753u,67108864u}/* 2877 */, /*8967*/{0,720u,3473409u,76677147u,40u,1610612768u,29036u,138442753u,67108864u}/* 2878 */, /*8968*/{0,720u,3473409u,76677147u,40u,1610612768u,29044u,138442753u,67108864u}/* 2879 */, /*8969*/{0,720u,3473409u,76677147u,40u,1610612768u,29052u,138442753u,67108864u}/* 287A */, /*8970*/{0,720u,3473409u,76677147u,40u,1610612768u,29060u,138442753u,67108864u}/* 287B */, /*8971*/{0,720u,3473409u,76677147u,40u,1610612768u,29068u,138442753u,67108864u}/* 287C */, /*8972*/{0,720u,3473409u,76677147u,40u,1610612768u,29076u,138442753u,67108864u}/* 287D */, /*8973*/{0,720u,3473409u,76677147u,40u,1610612768u,29084u,138442753u,67108864u}/* 287E */, /*8974*/{0,720u,3473409u,76677147u,40u,1610612768u,29092u,138442753u,67108864u}/* 287F */, /*8975*/{0,720u,3473409u,76677147u,40u,1610612768u,29100u,138442753u,67108864u}/* 2880 */, /*8976*/{0,720u,3473409u,76677147u,40u,1610612768u,29108u,138442753u,67108864u}/* 2881 */, /*8977*/{0,720u,3473409u,76677147u,40u,1610612768u,29116u,138442753u,67108864u}/* 2882 */, /*8978*/{0,720u,3473409u,76677147u,40u,1610612768u,29124u,138442753u,67108864u}/* 2883 */, /*8979*/{0,720u,3473409u,76677147u,40u,1610612768u,29132u,138442753u,67108864u}/* 2884 */, /*8980*/{0,720u,3473409u,76677147u,40u,1610612768u,29140u,138442753u,67108864u}/* 2885 */, /*8981*/{0,720u,3473409u,76677147u,40u,1610612768u,29148u,138442753u,67108864u}/* 2886 */, /*8982*/{0,720u,3473409u,76677147u,40u,1610612768u,29156u,138442753u,67108864u}/* 2887 */, /*8983*/{0,720u,3473409u,76677147u,40u,1610612768u,29164u,138442753u,67108864u}/* 2888 */, /*8984*/{0,720u,3473409u,76677147u,40u,1610612768u,29172u,138442753u,67108864u}/* 2889 */, /*8985*/{0,720u,3473409u,76677147u,40u,1610612768u,29180u,138442753u,67108864u}/* 288A */, /*8986*/{0,720u,3473409u,76677147u,40u,1610612768u,29188u,138442753u,67108864u}/* 288B */, /*8987*/{0,720u,3473409u,76677147u,40u,1610612768u,29196u,138442753u,67108864u}/* 288C */, /*8988*/{0,720u,3473409u,76677147u,40u,1610612768u,29204u,138442753u,67108864u}/* 288D */, /*8989*/{0,720u,3473409u,76677147u,40u,1610612768u,29212u,138442753u,67108864u}/* 288E */, /*8990*/{0,720u,3473409u,76677147u,40u,1610612768u,29220u,138442753u,67108864u}/* 288F */, /*8991*/{0,720u,3473409u,76677147u,40u,1610612768u,29228u,138442753u,67108864u}/* 2890 */, /*8992*/{0,720u,3473409u,76677147u,40u,1610612768u,29236u,138442753u,67108864u}/* 2891 */, /*8993*/{0,720u,3473409u,76677147u,40u,1610612768u,29244u,138442753u,67108864u}/* 2892 */, /*8994*/{0,720u,3473409u,76677147u,40u,1610612768u,29252u,138442753u,67108864u}/* 2893 */, /*8995*/{0,720u,3473409u,76677147u,40u,1610612768u,29260u,138442753u,67108864u}/* 2894 */, /*8996*/{0,720u,3473409u,76677147u,40u,1610612768u,29268u,138442753u,67108864u}/* 2895 */, /*8997*/{0,720u,3473409u,76677147u,40u,1610612768u,29276u,138442753u,67108864u}/* 2896 */, /*8998*/{0,720u,3473409u,76677147u,40u,1610612768u,29284u,138442753u,67108864u}/* 2897 */, /*8999*/{0,720u,3473409u,76677147u,40u,1610612768u,29292u,138442753u,67108864u}/* 2898 */, /*9000*/{0,720u,3473409u,76677147u,40u,1610612768u,29300u,138442753u,67108864u}/* 2899 */, /*9001*/{0,720u,3473409u,76677147u,40u,1610612768u,29308u,138442753u,67108864u}/* 289A */, /*9002*/{0,720u,3473409u,76677147u,40u,1610612768u,29316u,138442753u,67108864u}/* 289B */, /*9003*/{0,720u,3473409u,76677147u,40u,1610612768u,29324u,138442753u,67108864u}/* 289C */, /*9004*/{0,720u,3473409u,76677147u,40u,1610612768u,29332u,138442753u,67108864u}/* 289D */, /*9005*/{0,720u,3473409u,76677147u,40u,1610612768u,29340u,138442753u,67108864u}/* 289E */, /*9006*/{0,720u,3473409u,76677147u,40u,1610612768u,29348u,138442753u,67108864u}/* 289F */, /*9007*/{0,720u,3473409u,76677147u,40u,1610612768u,29356u,138442753u,67108864u}/* 28A0 */, /*9008*/{0,720u,3473409u,76677147u,40u,1610612768u,29364u,138442753u,67108864u}/* 28A1 */, /*9009*/{0,720u,3473409u,76677147u,40u,1610612768u,29372u,138442753u,67108864u}/* 28A2 */, /*9010*/{0,720u,3473409u,76677147u,40u,1610612768u,29380u,138442753u,67108864u}/* 28A3 */, /*9011*/{0,720u,3473409u,76677147u,40u,1610612768u,29388u,138442753u,67108864u}/* 28A4 */, /*9012*/{0,720u,3473409u,76677147u,40u,1610612768u,29396u,138442753u,67108864u}/* 28A5 */, /*9013*/{0,720u,3473409u,76677147u,40u,1610612768u,29404u,138442753u,67108864u}/* 28A6 */, /*9014*/{0,720u,3473409u,76677147u,40u,1610612768u,29412u,138442753u,67108864u}/* 28A7 */, /*9015*/{0,720u,3473409u,76677147u,40u,1610612768u,29420u,138442753u,67108864u}/* 28A8 */, /*9016*/{0,720u,3473409u,76677147u,40u,1610612768u,29428u,138442753u,67108864u}/* 28A9 */, /*9017*/{0,720u,3473409u,76677147u,40u,1610612768u,29436u,138442753u,67108864u}/* 28AA */, /*9018*/{0,720u,3473409u,76677147u,40u,1610612768u,29444u,138442753u,67108864u}/* 28AB */, /*9019*/{0,720u,3473409u,76677147u,40u,1610612768u,29452u,138442753u,67108864u}/* 28AC */, /*9020*/{0,720u,3473409u,76677147u,40u,1610612768u,29460u,138442753u,67108864u}/* 28AD */, /*9021*/{0,720u,3473409u,76677147u,40u,1610612768u,29468u,138442753u,67108864u}/* 28AE */, /*9022*/{0,720u,3473409u,76677147u,40u,1610612768u,29476u,138442753u,67108864u}/* 28AF */, /*9023*/{0,720u,3473409u,76677147u,40u,1610612768u,29484u,138442753u,67108864u}/* 28B0 */, /*9024*/{0,720u,3473409u,76677147u,40u,1610612768u,29492u,138442753u,67108864u}/* 28B1 */, /*9025*/{0,720u,3473409u,76677147u,40u,1610612768u,29500u,138442753u,67108864u}/* 28B2 */, /*9026*/{0,720u,3473409u,76677147u,40u,1610612768u,29508u,138442753u,67108864u}/* 28B3 */, /*9027*/{0,720u,3473409u,76677147u,40u,1610612768u,29516u,138442753u,67108864u}/* 28B4 */, /*9028*/{0,720u,3473409u,76677147u,40u,1610612768u,29524u,138442753u,67108864u}/* 28B5 */, /*9029*/{0,720u,3473409u,76677147u,40u,1610612768u,29532u,138442753u,67108864u}/* 28B6 */, /*9030*/{0,720u,3473409u,76677147u,40u,1610612768u,29540u,138442753u,67108864u}/* 28B7 */, /*9031*/{0,720u,3473409u,76677147u,40u,1610612768u,29548u,138442753u,67108864u}/* 28B8 */, /*9032*/{0,720u,3473409u,76677147u,40u,1610612768u,29556u,138442753u,67108864u}/* 28B9 */, /*9033*/{0,720u,3473409u,76677147u,40u,1610612768u,29564u,138442753u,67108864u}/* 28BA */, /*9034*/{0,720u,3473409u,76677147u,40u,1610612768u,29572u,138442753u,67108864u}/* 28BB */, /*9035*/{0,720u,3473409u,76677147u,40u,1610612768u,29580u,138442753u,67108864u}/* 28BC */, /*9036*/{0,720u,3473409u,76677147u,40u,1610612768u,29588u,138442753u,67108864u}/* 28BD */, /*9037*/{0,720u,3473409u,76677147u,40u,1610612768u,29596u,138442753u,67108864u}/* 28BE */, /*9038*/{0,720u,3473409u,76677147u,40u,1610612768u,29604u,138442753u,67108864u}/* 28BF */, /*9039*/{0,720u,3473409u,76677147u,40u,1610612768u,29612u,138442753u,67108864u}/* 28C0 */, /*9040*/{0,720u,3473409u,76677147u,40u,1610612768u,29620u,138442753u,67108864u}/* 28C1 */, /*9041*/{0,720u,3473409u,76677147u,40u,1610612768u,29628u,138442753u,67108864u}/* 28C2 */, /*9042*/{0,720u,3473409u,76677147u,40u,1610612768u,29636u,138442753u,67108864u}/* 28C3 */, /*9043*/{0,720u,3473409u,76677147u,40u,1610612768u,29644u,138442753u,67108864u}/* 28C4 */, /*9044*/{0,720u,3473409u,76677147u,40u,1610612768u,29652u,138442753u,67108864u}/* 28C5 */, /*9045*/{0,720u,3473409u,76677147u,40u,1610612768u,29660u,138442753u,67108864u}/* 28C6 */, /*9046*/{0,720u,3473409u,76677147u,40u,1610612768u,29668u,138442753u,67108864u}/* 28C7 */, /*9047*/{0,720u,3473409u,76677147u,40u,1610612768u,29676u,138442753u,67108864u}/* 28C8 */, /*9048*/{0,720u,3473409u,76677147u,40u,1610612768u,29684u,138442753u,67108864u}/* 28C9 */, /*9049*/{0,720u,3473409u,76677147u,40u,1610612768u,29692u,138442753u,67108864u}/* 28CA */, /*9050*/{0,720u,3473409u,76677147u,40u,1610612768u,29700u,138442753u,67108864u}/* 28CB */, /*9051*/{0,720u,3473409u,76677147u,40u,1610612768u,29708u,138442753u,67108864u}/* 28CC */, /*9052*/{0,720u,3473409u,76677147u,40u,1610612768u,29716u,138442753u,67108864u}/* 28CD */, /*9053*/{0,720u,3473409u,76677147u,40u,1610612768u,29724u,138442753u,67108864u}/* 28CE */, /*9054*/{0,720u,3473409u,76677147u,40u,1610612768u,29732u,138442753u,67108864u}/* 28CF */, /*9055*/{0,720u,3473409u,76677147u,40u,1610612768u,29740u,138442753u,67108864u}/* 28D0 */, /*9056*/{0,720u,3473409u,76677147u,40u,1610612768u,29748u,138442753u,67108864u}/* 28D1 */, /*9057*/{0,720u,3473409u,76677147u,40u,1610612768u,29756u,138442753u,67108864u}/* 28D2 */, /*9058*/{0,720u,3473409u,76677147u,40u,1610612768u,29764u,138442753u,67108864u}/* 28D3 */, /*9059*/{0,720u,3473409u,76677147u,40u,1610612768u,29772u,138442753u,67108864u}/* 28D4 */, /*9060*/{0,720u,3473409u,76677147u,40u,1610612768u,29780u,138442753u,67108864u}/* 28D5 */, /*9061*/{0,720u,3473409u,76677147u,40u,1610612768u,29788u,138442753u,67108864u}/* 28D6 */, /*9062*/{0,720u,3473409u,76677147u,40u,1610612768u,29796u,138442753u,67108864u}/* 28D7 */, /*9063*/{0,720u,3473409u,76677147u,40u,1610612768u,29804u,138442753u,67108864u}/* 28D8 */, /*9064*/{0,720u,3473409u,76677147u,40u,1610612768u,29812u,138442753u,67108864u}/* 28D9 */, /*9065*/{0,720u,3473409u,76677147u,40u,1610612768u,29820u,138442753u,67108864u}/* 28DA */, /*9066*/{0,720u,3473409u,76677147u,40u,1610612768u,29828u,138442753u,67108864u}/* 28DB */, /*9067*/{0,720u,3473409u,76677147u,40u,1610612768u,29836u,138442753u,67108864u}/* 28DC */, /*9068*/{0,720u,3473409u,76677147u,40u,1610612768u,29844u,138442753u,67108864u}/* 28DD */, /*9069*/{0,720u,3473409u,76677147u,40u,1610612768u,29852u,138442753u,67108864u}/* 28DE */, /*9070*/{0,720u,3473409u,76677147u,40u,1610612768u,29860u,138442753u,67108864u}/* 28DF */, /*9071*/{0,720u,3473409u,76677147u,40u,1610612768u,29868u,138442753u,67108864u}/* 28E0 */, /*9072*/{0,720u,3473409u,76677147u,40u,1610612768u,29876u,138442753u,67108864u}/* 28E1 */, /*9073*/{0,720u,3473409u,76677147u,40u,1610612768u,29884u,138442753u,67108864u}/* 28E2 */, /*9074*/{0,720u,3473409u,76677147u,40u,1610612768u,29892u,138442753u,67108864u}/* 28E3 */, /*9075*/{0,720u,3473409u,76677147u,40u,1610612768u,29900u,138442753u,67108864u}/* 28E4 */, /*9076*/{0,720u,3473409u,76677147u,40u,1610612768u,29908u,138442753u,67108864u}/* 28E5 */, /*9077*/{0,720u,3473409u,76677147u,40u,1610612768u,29916u,138442753u,67108864u}/* 28E6 */, /*9078*/{0,720u,3473409u,76677147u,40u,1610612768u,29924u,138442753u,67108864u}/* 28E7 */, /*9079*/{0,720u,3473409u,76677147u,40u,1610612768u,29932u,138442753u,67108864u}/* 28E8 */, /*9080*/{0,720u,3473409u,76677147u,40u,1610612768u,29940u,138442753u,67108864u}/* 28E9 */, /*9081*/{0,720u,3473409u,76677147u,40u,1610612768u,29948u,138442753u,67108864u}/* 28EA */, /*9082*/{0,720u,3473409u,76677147u,40u,1610612768u,29956u,138442753u,67108864u}/* 28EB */, /*9083*/{0,720u,3473409u,76677147u,40u,1610612768u,29964u,138442753u,67108864u}/* 28EC */, /*9084*/{0,720u,3473409u,76677147u,40u,1610612768u,29972u,138442753u,67108864u}/* 28ED */, /*9085*/{0,720u,3473409u,76677147u,40u,1610612768u,29980u,138442753u,67108864u}/* 28EE */, /*9086*/{0,720u,3473409u,76677147u,40u,1610612768u,29988u,138442753u,67108864u}/* 28EF */, /*9087*/{0,720u,3473409u,76677147u,40u,1610612768u,29996u,138442753u,67108864u}/* 28F0 */, /*9088*/{0,720u,3473409u,76677147u,40u,1610612768u,30004u,138442753u,67108864u}/* 28F1 */, /*9089*/{0,720u,3473409u,76677147u,40u,1610612768u,30012u,138442753u,67108864u}/* 28F2 */, /*9090*/{0,720u,3473409u,76677147u,40u,1610612768u,30020u,138442753u,67108864u}/* 28F3 */, /*9091*/{0,720u,3473409u,76677147u,40u,1610612768u,30028u,138442753u,67108864u}/* 28F4 */, /*9092*/{0,720u,3473409u,76677147u,40u,1610612768u,30036u,138442753u,67108864u}/* 28F5 */, /*9093*/{0,720u,3473409u,76677147u,40u,1610612768u,30044u,138442753u,67108864u}/* 28F6 */, /*9094*/{0,720u,3473409u,76677147u,40u,1610612768u,30052u,138442753u,67108864u}/* 28F7 */, /*9095*/{0,720u,3473409u,76677147u,40u,1610612768u,30060u,138442753u,67108864u}/* 28F8 */, /*9096*/{0,720u,3473409u,76677147u,40u,1610612768u,30068u,138442753u,67108864u}/* 28F9 */, /*9097*/{0,720u,3473409u,76677147u,40u,1610612768u,30076u,138442753u,67108864u}/* 28FA */, /*9098*/{0,720u,3473409u,76677147u,40u,1610612768u,30084u,138442753u,67108864u}/* 28FB */, /*9099*/{0,720u,3473409u,76677147u,40u,1610612768u,30092u,138442753u,67108864u}/* 28FC */, /*9100*/{0,720u,3473409u,76677147u,40u,1610612768u,30100u,138442753u,67108864u}/* 28FD */, /*9101*/{0,720u,3473409u,76677147u,40u,1610612768u,30108u,138442753u,67108864u}/* 28FE */, /*9102*/{0,720u,3473409u,76677147u,40u,1610612768u,30116u,138442753u,67108864u}/* 28FF */, /*9103*/{0,728u,65537u,76752920u,40u,1610612768u,22542u,138442753u,67108864u}/* 2900 */, /*9104*/{0,728u,65537u,76752920u,40u,1610612768u,22550u,138442753u,67108864u}/* 2901 */, /*9105*/{0,728u,65537u,76752920u,40u,1610612768u,22558u,138442753u,67108864u}/* 2902 */, /*9106*/{0,728u,65537u,76752920u,40u,1610612768u,22566u,138442753u,67108864u}/* 2903 */, /*9107*/{0,728u,65537u,76752920u,40u,1610612768u,22574u,138442753u,67108864u}/* 2904 */, /*9108*/{0,728u,65537u,76752920u,40u,1610612768u,22582u,138442753u,67108864u}/* 2905 */, /*9109*/{0,728u,65537u,76752920u,40u,1610612768u,22590u,138442753u,67108864u}/* 2906 */, /*9110*/{0,728u,65537u,76752920u,40u,1610612768u,22598u,138442753u,67108864u}/* 2907 */, /*9111*/{0,728u,65537u,76752920u,40u,1610612768u,22606u,138442753u,67108864u}/* 2908 */, /*9112*/{0,728u,65537u,76752920u,40u,1610612768u,22614u,138442753u,67108864u}/* 2909 */, /*9113*/{0,728u,65537u,76752920u,40u,1610612768u,22622u,138442753u,67108864u}/* 290A */, /*9114*/{0,728u,65537u,76752920u,40u,1610612768u,22630u,138442753u,67108864u}/* 290B */, /*9115*/{0,728u,65537u,76752920u,40u,1610612768u,22638u,138442753u,67108864u}/* 290C */, /*9116*/{0,728u,65537u,76752920u,40u,1610612768u,22646u,138442753u,67108864u}/* 290D */, /*9117*/{0,728u,65537u,76752920u,40u,1610612768u,22654u,138442753u,67108864u}/* 290E */, /*9118*/{0,728u,65537u,76752920u,40u,1610612768u,22662u,138442753u,67108864u}/* 290F */, /*9119*/{0,728u,65537u,76752920u,40u,1610612768u,22670u,138442753u,67108864u}/* 2910 */, /*9120*/{0,728u,65537u,76752920u,40u,1610612768u,22678u,138442753u,67108864u}/* 2911 */, /*9121*/{0,728u,65537u,76752920u,40u,1610612768u,22686u,138442753u,67108864u}/* 2912 */, /*9122*/{0,728u,65537u,76752920u,40u,1610612768u,22694u,138442753u,67108864u}/* 2913 */, /*9123*/{0,728u,65537u,76752920u,40u,1610612768u,22702u,138442753u,67108864u}/* 2914 */, /*9124*/{0,728u,65537u,76752920u,40u,1610612768u,22710u,138442753u,67108864u}/* 2915 */, /*9125*/{0,728u,65537u,76752920u,40u,1610612768u,22718u,138442753u,67108864u}/* 2916 */, /*9126*/{0,728u,65537u,76752920u,40u,1610612768u,22726u,138442753u,67108864u}/* 2917 */, /*9127*/{0,728u,65537u,76752920u,40u,1610612768u,22734u,138442753u,67108864u}/* 2918 */, /*9128*/{0,728u,65537u,76752920u,40u,1610612768u,22742u,138442753u,67108864u}/* 2919 */, /*9129*/{0,728u,65537u,76752920u,40u,1610612768u,22750u,138442753u,67108864u}/* 291A */, /*9130*/{0,728u,65537u,76752920u,40u,1610612768u,22758u,138442753u,67108864u}/* 291B */, /*9131*/{0,728u,65537u,76752920u,40u,1610612768u,22766u,138442753u,67108864u}/* 291C */, /*9132*/{0,728u,65537u,76752920u,40u,1610612768u,22774u,138442753u,67108864u}/* 291D */, /*9133*/{0,728u,65537u,76752920u,40u,1610612768u,22782u,138442753u,67108864u}/* 291E */, /*9134*/{0,728u,65537u,76752920u,40u,1610612768u,22790u,138442753u,67108864u}/* 291F */, /*9135*/{0,728u,65537u,76752920u,40u,1610612768u,22798u,138442753u,67108864u}/* 2920 */, /*9136*/{0,728u,65537u,76752920u,40u,1610612768u,22806u,138442753u,67108864u}/* 2921 */, /*9137*/{0,728u,65537u,76752920u,40u,1610612768u,22814u,138442753u,67108864u}/* 2922 */, /*9138*/{0,728u,65537u,76752920u,40u,1610612768u,22822u,138442753u,67108864u}/* 2923 */, /*9139*/{0,728u,65537u,76752920u,40u,1610612768u,22830u,138442753u,67108864u}/* 2924 */, /*9140*/{0,728u,65537u,76752920u,40u,1610612768u,22838u,138442753u,67108864u}/* 2925 */, /*9141*/{0,728u,65537u,76752920u,40u,1610612768u,22846u,138442753u,67108864u}/* 2926 */, /*9142*/{0,728u,65537u,76752920u,40u,1610612768u,22854u,138442753u,67108864u}/* 2927 */, /*9143*/{0,728u,65537u,76752920u,40u,1610612768u,22862u,138442753u,67108864u}/* 2928 */, /*9144*/{0,728u,65537u,76752920u,40u,1610612768u,22870u,138442753u,67108864u}/* 2929 */, /*9145*/{0,728u,65537u,76752920u,40u,1610612768u,22878u,138442753u,67108864u}/* 292A */, /*9146*/{0,728u,65537u,76752920u,40u,1610612768u,22886u,138442753u,67108864u}/* 292B */, /*9147*/{0,728u,65537u,76752920u,40u,1610612768u,22894u,138442753u,67108864u}/* 292C */, /*9148*/{0,728u,65537u,76752920u,40u,1610612768u,22902u,138442753u,67108864u}/* 292D */, /*9149*/{0,728u,65537u,76752920u,40u,1610612768u,22910u,138442753u,67108864u}/* 292E */, /*9150*/{0,728u,65537u,76752920u,40u,1610612768u,22918u,138442753u,67108864u}/* 292F */, /*9151*/{0,728u,65537u,76752920u,40u,1610612768u,22926u,138442753u,67108864u}/* 2930 */, /*9152*/{0,728u,65537u,76752920u,40u,1610612768u,22934u,138442753u,67108864u}/* 2931 */, /*9153*/{0,728u,65537u,76752920u,40u,1610612768u,22942u,138442753u,67108864u}/* 2932 */, /*9154*/{0,728u,65537u,76752920u,40u,1610612768u,22950u,138442753u,67108864u}/* 2933 */, /*9155*/{0,728u,65537u,76752920u,8u,1610616864u,22958u,138442753u,67108864u}/* 2934 */, /*9156*/{0,728u,65537u,76752920u,8u,1610616864u,22966u,138442753u,67108864u}/* 2935 */, /*9157*/{0,728u,65537u,76752920u,40u,1610612768u,22974u,138442753u,67108864u}/* 2936 */, /*9158*/{0,728u,65537u,76752920u,40u,1610612768u,22982u,138442753u,67108864u}/* 2937 */, /*9159*/{0,728u,65537u,76752920u,40u,1610612768u,22990u,138442753u,67108864u}/* 2938 */, /*9160*/{0,728u,65537u,76752920u,40u,1610612768u,22998u,138442753u,67108864u}/* 2939 */, /*9161*/{0,728u,65537u,76752920u,40u,1610612768u,23006u,138442753u,67108864u}/* 293A */, /*9162*/{0,728u,65537u,76752920u,40u,1610612768u,23014u,138442753u,67108864u}/* 293B */, /*9163*/{0,728u,65537u,76752920u,40u,1610612768u,23022u,138442753u,67108864u}/* 293C */, /*9164*/{0,728u,65537u,76752920u,40u,1610612768u,23030u,138442753u,67108864u}/* 293D */, /*9165*/{0,728u,65537u,76752920u,40u,1610612768u,23038u,138442753u,67108864u}/* 293E */, /*9166*/{0,728u,65537u,76752920u,40u,1610612768u,23046u,138442753u,67108864u}/* 293F */, /*9167*/{0,728u,65537u,76752920u,40u,1610612768u,23054u,138442753u,67108864u}/* 2940 */, /*9168*/{0,728u,65537u,76752920u,40u,1610612768u,23062u,138442753u,67108864u}/* 2941 */, /*9169*/{0,728u,65537u,76752920u,40u,1610612768u,23070u,138442753u,67108864u}/* 2942 */, /*9170*/{0,728u,65537u,76752920u,40u,1610612768u,23078u,138442753u,67108864u}/* 2943 */, /*9171*/{0,728u,65537u,76752920u,40u,1610612768u,23086u,138442753u,67108864u}/* 2944 */, /*9172*/{0,728u,65537u,76752920u,40u,1610612768u,23094u,138442753u,67108864u}/* 2945 */, /*9173*/{0,728u,65537u,76752920u,40u,1610612768u,23102u,138442753u,67108864u}/* 2946 */, /*9174*/{0,728u,65537u,76752920u,40u,1610612768u,23110u,138442753u,67108864u}/* 2947 */, /*9175*/{0,728u,65537u,76752920u,40u,1610612768u,23118u,138442753u,67108864u}/* 2948 */, /*9176*/{0,728u,65537u,76752920u,40u,1610612768u,23126u,138442753u,67108864u}/* 2949 */, /*9177*/{0,728u,65537u,76752920u,40u,1610612768u,23134u,138442753u,67108864u}/* 294A */, /*9178*/{0,728u,65537u,76752920u,40u,1610612768u,23142u,138442753u,67108864u}/* 294B */, /*9179*/{0,728u,65537u,76752920u,40u,1610612768u,23150u,138442753u,67108864u}/* 294C */, /*9180*/{0,728u,65537u,76752920u,40u,1610612768u,23158u,138442753u,67108864u}/* 294D */, /*9181*/{0,728u,65537u,76752920u,40u,1610612768u,23166u,138442753u,67108864u}/* 294E */, /*9182*/{0,728u,65537u,76752920u,40u,1610612768u,23174u,138442753u,67108864u}/* 294F */, /*9183*/{0,728u,65537u,76752920u,40u,1610612768u,23182u,138442753u,67108864u}/* 2950 */, /*9184*/{0,728u,65537u,76752920u,40u,1610612768u,23190u,138442753u,67108864u}/* 2951 */, /*9185*/{0,728u,65537u,76752920u,40u,1610612768u,23198u,138442753u,67108864u}/* 2952 */, /*9186*/{0,728u,65537u,76752920u,40u,1610612768u,23206u,138442753u,67108864u}/* 2953 */, /*9187*/{0,728u,65537u,76752920u,40u,1610612768u,23214u,138442753u,67108864u}/* 2954 */, /*9188*/{0,728u,65537u,76752920u,40u,1610612768u,23222u,138442753u,67108864u}/* 2955 */, /*9189*/{0,728u,65537u,76752920u,40u,1610612768u,23230u,138442753u,67108864u}/* 2956 */, /*9190*/{0,728u,65537u,76752920u,40u,1610612768u,23238u,138442753u,67108864u}/* 2957 */, /*9191*/{0,728u,65537u,76752920u,40u,1610612768u,23246u,138442753u,67108864u}/* 2958 */, /*9192*/{0,728u,65537u,76752920u,40u,1610612768u,23254u,138442753u,67108864u}/* 2959 */, /*9193*/{0,728u,65537u,76752920u,40u,1610612768u,23262u,138442753u,67108864u}/* 295A */, /*9194*/{0,728u,65537u,76752920u,40u,1610612768u,23270u,138442753u,67108864u}/* 295B */, /*9195*/{0,728u,65537u,76752920u,40u,1610612768u,23278u,138442753u,67108864u}/* 295C */, /*9196*/{0,728u,65537u,76752920u,40u,1610612768u,23286u,138442753u,67108864u}/* 295D */, /*9197*/{0,728u,65537u,76752920u,40u,1610612768u,23294u,138442753u,67108864u}/* 295E */, /*9198*/{0,728u,65537u,76752920u,40u,1610612768u,23302u,138442753u,67108864u}/* 295F */, /*9199*/{0,728u,65537u,76752920u,40u,1610612768u,23310u,138442753u,67108864u}/* 2960 */, /*9200*/{0,728u,65537u,76752920u,40u,1610612768u,23318u,138442753u,67108864u}/* 2961 */, /*9201*/{0,728u,65537u,76752920u,40u,1610612768u,23326u,138442753u,67108864u}/* 2962 */, /*9202*/{0,728u,65537u,76752920u,40u,1610612768u,23334u,138442753u,67108864u}/* 2963 */, /*9203*/{0,728u,65537u,76752920u,40u,1610612768u,23342u,138442753u,67108864u}/* 2964 */, /*9204*/{0,728u,65537u,76752920u,40u,1610612768u,23350u,138442753u,67108864u}/* 2965 */, /*9205*/{0,728u,65537u,76752920u,40u,1610612768u,23358u,138442753u,67108864u}/* 2966 */, /*9206*/{0,728u,65537u,76752920u,40u,1610612768u,23366u,138442753u,67108864u}/* 2967 */, /*9207*/{0,728u,65537u,76752920u,40u,1610612768u,23374u,138442753u,67108864u}/* 2968 */, /*9208*/{0,728u,65537u,76752920u,40u,1610612768u,23382u,138442753u,67108864u}/* 2969 */, /*9209*/{0,728u,65537u,76752920u,40u,1610612768u,23390u,138442753u,67108864u}/* 296A */, /*9210*/{0,728u,65537u,76752920u,40u,1610612768u,23398u,138442753u,67108864u}/* 296B */, /*9211*/{0,728u,65537u,76752920u,40u,1610612768u,23406u,138442753u,67108864u}/* 296C */, /*9212*/{0,728u,65537u,76752920u,40u,1610612768u,23414u,138442753u,67108864u}/* 296D */, /*9213*/{0,728u,65537u,76752920u,40u,1610612768u,23422u,138442753u,67108864u}/* 296E */, /*9214*/{0,728u,65537u,76752920u,40u,1610612768u,23430u,138442753u,67108864u}/* 296F */, /*9215*/{0,728u,65537u,76752920u,40u,1610612768u,23438u,138442753u,67108864u}/* 2970 */, /*9216*/{0,728u,65537u,76752920u,40u,1610612768u,23446u,138442753u,67108864u}/* 2971 */, /*9217*/{0,728u,65537u,76752920u,40u,1610612768u,23454u,138442753u,67108864u}/* 2972 */, /*9218*/{0,728u,65537u,76752920u,40u,1610612768u,23462u,138442753u,67108864u}/* 2973 */, /*9219*/{0,728u,65537u,76752920u,40u,1610612768u,23470u,138442753u,67108864u}/* 2974 */, /*9220*/{0,728u,65537u,76752920u,40u,1610612768u,23478u,138442753u,67108864u}/* 2975 */, /*9221*/{0,728u,65537u,76752920u,40u,1610612768u,23486u,138442753u,67108864u}/* 2976 */, /*9222*/{0,728u,65537u,76752920u,40u,1610612768u,23494u,138442753u,67108864u}/* 2977 */, /*9223*/{0,728u,65537u,76752920u,40u,1610612768u,23502u,138442753u,67108864u}/* 2978 */, /*9224*/{0,728u,65537u,76752920u,40u,1610612768u,23510u,138442753u,67108864u}/* 2979 */, /*9225*/{0,728u,65537u,76752920u,40u,1610612768u,23518u,138442753u,67108864u}/* 297A */, /*9226*/{0,728u,65537u,76752920u,40u,1610612768u,23526u,138442753u,67108864u}/* 297B */, /*9227*/{0,728u,65537u,76752920u,40u,1610612768u,23534u,138442753u,67108864u}/* 297C */, /*9228*/{0,728u,65537u,76752920u,40u,1610612768u,23542u,138442753u,67108864u}/* 297D */, /*9229*/{0,728u,65537u,76752920u,40u,1610612768u,23550u,138442753u,67108864u}/* 297E */, /*9230*/{0,728u,65537u,76752920u,40u,1610612768u,23558u,138442753u,67108864u}/* 297F */, /*9231*/{0,736u,65537u,76752920u,40u,1610612768u,23566u,138442753u,67108864u}/* 2980 */, /*9232*/{0,736u,65537u,76752920u,40u,1610612768u,23574u,138442753u,67108864u}/* 2981 */, /*9233*/{0,736u,65537u,76752920u,40u,1610612768u,23582u,138442753u,67108864u}/* 2982 */, /*9234*/{0,758496u,65537u,79898644u,106536u,1744830496u,6510u,138442763u,0}/* 2983 */, /*9235*/{0,762592u,65537u,86190101u,106536u,1744830496u,6518u,138442763u,0}/* 2984 */, /*9236*/{0,766693u,65537u,79898644u,106536u,1744830496u,6526u,138442763u,0}/* 2985 */, /*9237*/{0,770789u,65537u,86190101u,106536u,1744830496u,6534u,138442763u,0}/* 2986 */, /*9238*/{0,774880u,65537u,79898644u,106536u,1744830496u,6542u,138442763u,0}/* 2987 */, /*9239*/{0,778976u,65537u,86190101u,106536u,1744830496u,6550u,138442763u,0}/* 2988 */, /*9240*/{0,783072u,65537u,79898644u,106536u,1744830496u,6558u,138442763u,0}/* 2989 */, /*9241*/{0,787168u,65537u,86190101u,106536u,1744830496u,6566u,138442763u,0}/* 298A */, /*9242*/{0,791264u,65537u,79898644u,106536u,1744830496u,6574u,138442763u,0}/* 298B */, /*9243*/{0,795360u,65537u,86190101u,106536u,1744830496u,6582u,138442763u,0}/* 298C */, /*9244*/{0,799456u,65537u,79898644u,106536u,1744830496u,6590u,138442763u,0}/* 298D */, /*9245*/{0,803552u,65537u,86190101u,106536u,1744830496u,6598u,138442763u,0}/* 298E */, /*9246*/{0,807648u,65537u,79898644u,106536u,1744830496u,6606u,138442763u,0}/* 298F */, /*9247*/{0,811744u,65537u,86190101u,106536u,1744830496u,6614u,138442763u,0}/* 2990 */, /*9248*/{0,815840u,65537u,79898644u,106536u,1744830496u,6622u,138442763u,0}/* 2991 */, /*9249*/{0,819936u,65537u,86190101u,106536u,1744830496u,6630u,138442763u,0}/* 2992 */, /*9250*/{0,824032u,65537u,79898644u,106536u,1744830496u,6638u,138442763u,0}/* 2993 */, /*9251*/{0,828128u,65537u,86190101u,106536u,1744830496u,6646u,138442763u,0}/* 2994 */, /*9252*/{0,832224u,65537u,79898644u,106536u,1744830496u,6654u,138442763u,0}/* 2995 */, /*9253*/{0,836320u,65537u,86190101u,106536u,1744830496u,6662u,138442763u,0}/* 2996 */, /*9254*/{0,840416u,65537u,79898644u,106536u,1744830496u,6670u,138442763u,0}/* 2997 */, /*9255*/{0,844512u,65537u,86190101u,106536u,1744830496u,6678u,138442763u,0}/* 2998 */, /*9256*/{0,736u,65537u,76752920u,40u,1610612768u,23590u,138442753u,67108864u}/* 2999 */, /*9257*/{0,736u,65537u,76752920u,40u,1610612768u,23598u,138442753u,67108864u}/* 299A */, /*9258*/{0,736u,65537u,76752920u,40u,1744830496u,23606u,138442753u,67108864u}/* 299B */, /*9259*/{0,736u,65537u,76752920u,40u,1744830496u,23614u,138442753u,67108864u}/* 299C */, /*9260*/{0,736u,65537u,76752920u,40u,1744830496u,23622u,138442753u,67108864u}/* 299D */, /*9261*/{0,736u,65537u,76752920u,40u,1744830496u,23630u,138442753u,67108864u}/* 299E */, /*9262*/{0,736u,65537u,76752920u,40u,1744830496u,23638u,138442753u,67108864u}/* 299F */, /*9263*/{0,736u,65537u,76752920u,40u,1744830496u,23646u,138442753u,67108864u}/* 29A0 */, /*9264*/{0,736u,65537u,76752920u,40u,1744830496u,23654u,138442753u,67108864u}/* 29A1 */, /*9265*/{0,736u,65537u,76752920u,40u,1744830496u,23662u,138442753u,67108864u}/* 29A2 */, /*9266*/{0,736u,65537u,76752920u,40u,1744830496u,23670u,138442753u,67108864u}/* 29A3 */, /*9267*/{0,736u,65537u,76752920u,40u,1744830496u,23678u,138442753u,67108864u}/* 29A4 */, /*9268*/{0,736u,65537u,76752920u,40u,1744830496u,23686u,138442753u,67108864u}/* 29A5 */, /*9269*/{0,736u,65537u,76752920u,40u,1744830496u,23694u,138442753u,67108864u}/* 29A6 */, /*9270*/{0,736u,65537u,76752920u,40u,1744830496u,23702u,138442753u,67108864u}/* 29A7 */, /*9271*/{0,736u,65537u,76752920u,40u,1744830496u,23710u,138442753u,67108864u}/* 29A8 */, /*9272*/{0,736u,65537u,76752920u,40u,1744830496u,23718u,138442753u,67108864u}/* 29A9 */, /*9273*/{0,736u,65537u,76752920u,40u,1744830496u,23726u,138442753u,67108864u}/* 29AA */, /*9274*/{0,736u,65537u,76752920u,40u,1744830496u,23734u,138442753u,67108864u}/* 29AB */, /*9275*/{0,736u,65537u,76752920u,40u,1744830496u,23742u,138442753u,67108864u}/* 29AC */, /*9276*/{0,736u,65537u,76752920u,40u,1744830496u,23750u,138442753u,67108864u}/* 29AD */, /*9277*/{0,736u,65537u,76752920u,40u,1744830496u,23758u,138442753u,67108864u}/* 29AE */, /*9278*/{0,736u,65537u,76752920u,40u,1744830496u,23766u,138442753u,67108864u}/* 29AF */, /*9279*/{0,736u,65537u,76752920u,40u,1610612768u,23774u,138442753u,67108864u}/* 29B0 */, /*9280*/{0,736u,65537u,76752920u,40u,1610612768u,23782u,138442753u,67108864u}/* 29B1 */, /*9281*/{0,736u,65537u,76752920u,40u,1610612768u,23790u,138442753u,67108864u}/* 29B2 */, /*9282*/{0,736u,65537u,76752920u,40u,1610612768u,23798u,138442753u,67108864u}/* 29B3 */, /*9283*/{0,736u,65537u,76752920u,40u,1610612768u,23806u,138442753u,67108864u}/* 29B4 */, /*9284*/{0,736u,65537u,76752920u,40u,1610612768u,23814u,138442753u,67108864u}/* 29B5 */, /*9285*/{0,736u,65537u,76752920u,40u,1610612768u,23822u,138442753u,67108864u}/* 29B6 */, /*9286*/{0,736u,65537u,76752920u,40u,1610612768u,23830u,138442753u,67108864u}/* 29B7 */, /*9287*/{0,848608u,65537u,76752920u,40u,1744830496u,23838u,138442753u,67108864u}/* 29B8 */, /*9288*/{0,736u,65537u,76752920u,40u,1610612768u,23846u,138442753u,67108864u}/* 29B9 */, /*9289*/{0,736u,65537u,76752920u,40u,1610612768u,23854u,138442753u,67108864u}/* 29BA */, /*9290*/{0,736u,65537u,76752920u,40u,1610612768u,23862u,138442753u,67108864u}/* 29BB */, /*9291*/{0,736u,65537u,76752920u,40u,1610612768u,23870u,138442753u,67108864u}/* 29BC */, /*9292*/{0,736u,65537u,76752920u,40u,1610612768u,23878u,138442753u,67108864u}/* 29BD */, /*9293*/{0,736u,65537u,76752920u,40u,1610612768u,23886u,138442753u,67108864u}/* 29BE */, /*9294*/{0,736u,65537u,76752920u,40u,1610612768u,23894u,138442753u,67108864u}/* 29BF */, /*9295*/{0,852704u,65537u,76752920u,40u,1744830496u,23902u,138442753u,67108864u}/* 29C0 */, /*9296*/{0,856800u,65537u,76752920u,40u,1744830496u,23910u,138442753u,67108864u}/* 29C1 */, /*9297*/{0,736u,65537u,76752920u,40u,1744830496u,23918u,138442753u,67108864u}/* 29C2 */, /*9298*/{0,736u,65537u,76752920u,40u,1744830496u,23926u,138442753u,67108864u}/* 29C3 */, /*9299*/{0,860896u,65537u,76752920u,40u,1744830496u,23934u,138442753u,67108864u}/* 29C4 */, /*9300*/{0,864992u,65537u,76752920u,40u,1744830496u,23942u,138442753u,67108864u}/* 29C5 */, /*9301*/{0,736u,65537u,76752920u,40u,1610612768u,23950u,138442753u,67108864u}/* 29C6 */, /*9302*/{0,736u,65537u,76752920u,40u,1610612768u,23958u,138442753u,67108864u}/* 29C7 */, /*9303*/{0,736u,65537u,76752920u,40u,1610612768u,23966u,138442753u,67108864u}/* 29C8 */, /*9304*/{0,736u,65537u,76752920u,40u,1744830496u,23974u,138442753u,67108864u}/* 29C9 */, /*9305*/{0,736u,65537u,76752920u,40u,1610612768u,23982u,138442753u,67108864u}/* 29CA */, /*9306*/{0,736u,65537u,76752920u,40u,1610612768u,23990u,138442753u,67108864u}/* 29CB */, /*9307*/{0,736u,65537u,76752920u,40u,1610612768u,23998u,138442753u,67108864u}/* 29CC */, /*9308*/{0,736u,65537u,76752920u,40u,1610612768u,24006u,138442753u,67108864u}/* 29CD */, /*9309*/{0,736u,65537u,76752920u,40u,1744830496u,24014u,138442753u,67108864u}/* 29CE */, /*9310*/{0,869088u,65537u,76752920u,40u,1744830496u,24022u,138442753u,67108864u}/* 29CF */, /*9311*/{0,873184u,65537u,76752920u,40u,1744830496u,24030u,138442753u,67108864u}/* 29D0 */, /*9312*/{0,877280u,65537u,76752920u,40u,1744830496u,24038u,138442753u,67108864u}/* 29D1 */, /*9313*/{0,881376u,65537u,76752920u,40u,1744830496u,24046u,138442753u,67108864u}/* 29D2 */, /*9314*/{0,736u,65537u,76752920u,40u,1610612768u,24054u,138442753u,67108864u}/* 29D3 */, /*9315*/{0,885472u,65537u,76752920u,40u,1744830496u,24062u,138442753u,67108864u}/* 29D4 */, /*9316*/{0,889568u,65537u,76752920u,40u,1744830496u,24070u,138442753u,67108864u}/* 29D5 */, /*9317*/{0,736u,65537u,76752920u,40u,1610612768u,24078u,138442753u,67108864u}/* 29D6 */, /*9318*/{0,736u,65537u,76752920u,40u,1610612768u,24086u,138442753u,67108864u}/* 29D7 */, /*9319*/{0,893664u,65537u,79898644u,106536u,1744830496u,7230u,138442763u,0}/* 29D8 */, /*9320*/{0,897760u,65537u,86190101u,106536u,1744830496u,7238u,138442763u,0}/* 29D9 */, /*9321*/{0,901856u,65537u,79898644u,106536u,1744830496u,7246u,138442763u,0}/* 29DA */, /*9322*/{0,905952u,65537u,86190101u,106536u,1744830496u,7254u,138442763u,0}/* 29DB */, /*9323*/{0,736u,65537u,76752920u,40u,1744830496u,24094u,138442753u,67108864u}/* 29DC */, /*9324*/{0,736u,65537u,76752920u,40u,1610612768u,24102u,138442753u,67108864u}/* 29DD */, /*9325*/{0,736u,65537u,76752920u,40u,1610612768u,24110u,138442753u,67108864u}/* 29DE */, /*9326*/{0,736u,65537u,76752920u,40u,1610612768u,24118u,138442753u,67108864u}/* 29DF */, /*9327*/{0,736u,65537u,76752920u,40u,1610612768u,24126u,138442753u,67108864u}/* 29E0 */, /*9328*/{0,736u,65537u,76752920u,40u,1744830496u,24134u,138442753u,67108864u}/* 29E1 */, /*9329*/{0,736u,65537u,76752920u,40u,1610612768u,24142u,138442753u,67108864u}/* 29E2 */, /*9330*/{0,736u,65537u,76752920u,40u,1744830496u,24150u,138442753u,67108864u}/* 29E3 */, /*9331*/{0,736u,65537u,76752920u,40u,1744830496u,24158u,138442753u,67108864u}/* 29E4 */, /*9332*/{0,736u,65537u,76752920u,40u,1744830496u,24166u,138442753u,67108864u}/* 29E5 */, /*9333*/{0,736u,65537u,76752920u,40u,1610612768u,24174u,138442753u,67108864u}/* 29E6 */, /*9334*/{0,736u,65537u,76752920u,40u,1610612768u,24182u,138442753u,67108864u}/* 29E7 */, /*9335*/{0,736u,65537u,76752920u,40u,1744830496u,24190u,138442753u,67108864u}/* 29E8 */, /*9336*/{0,736u,65537u,76752920u,40u,1744830496u,24198u,138442753u,67108864u}/* 29E9 */, /*9337*/{0,736u,65537u,76752920u,40u,1610612768u,24206u,138442753u,67108864u}/* 29EA */, /*9338*/{0,736u,65537u,76752920u,40u,1610612768u,24214u,138442753u,67108864u}/* 29EB */, /*9339*/{0,736u,65537u,76752920u,40u,1610612768u,24222u,138442753u,67108864u}/* 29EC */, /*9340*/{0,736u,65537u,76752920u,40u,1610612768u,24230u,138442753u,67108864u}/* 29ED */, /*9341*/{0,736u,65537u,76752920u,40u,1610612768u,24238u,138442753u,67108864u}/* 29EE */, /*9342*/{0,736u,65537u,76752920u,40u,1610612768u,24246u,138442753u,67108864u}/* 29EF */, /*9343*/{0,736u,65537u,76752920u,40u,1610612768u,24254u,138442753u,67108864u}/* 29F0 */, /*9344*/{0,736u,65537u,76752920u,40u,1610612768u,24262u,138442753u,67108864u}/* 29F1 */, /*9345*/{0,736u,65537u,76752920u,40u,1610612768u,24270u,138442753u,67108864u}/* 29F2 */, /*9346*/{0,736u,65537u,76752920u,40u,1610612768u,24278u,138442753u,67108864u}/* 29F3 */, /*9347*/{0,736u,65537u,76752920u,40u,1744830496u,24286u,138442753u,67108864u}/* 29F4 */, /*9348*/{0,910048u,65537u,76752920u,40u,1744830496u,24294u,138442753u,67108864u}/* 29F5 */, /*9349*/{0,736u,65537u,76752920u,40u,1744830496u,24302u,138442753u,67108864u}/* 29F6 */, /*9350*/{0,736u,65537u,76752920u,40u,1744830496u,24310u,138442753u,67108864u}/* 29F7 */, /*9351*/{0,914144u,65537u,76752920u,40u,1744830496u,24318u,138442753u,67108864u}/* 29F8 */, /*9352*/{0,918240u,65537u,76752920u,40u,1744830496u,24326u,138442753u,67108864u}/* 29F9 */, /*9353*/{0,736u,65537u,76752920u,40u,1610612768u,24334u,138442753u,67108864u}/* 29FA */, /*9354*/{0,736u,65537u,76752920u,40u,1610612768u,24342u,138442753u,67108864u}/* 29FB */, /*9355*/{0,922336u,65537u,79898644u,106536u,1744830496u,6494u,138442763u,0}/* 29FC */, /*9356*/{0,926432u,65537u,86190101u,106536u,1744830496u,6502u,138442763u,0}/* 29FD */, /*9357*/{0,736u,65537u,76752920u,40u,1610612768u,24350u,138442753u,67108864u}/* 29FE */, /*9358*/{0,736u,65537u,76752920u,40u,1610612768u,24358u,138442753u,67108864u}/* 29FF */, /*9359*/{0,744u,65537u,76752920u,40u,1610612768u,24366u,138442753u,67108864u}/* 2A00 */, /*9360*/{0,744u,65537u,76752920u,40u,1610612768u,24374u,138442753u,67108864u}/* 2A01 */, /*9361*/{0,744u,65537u,76752920u,40u,1610612768u,24382u,138442753u,67108864u}/* 2A02 */, /*9362*/{0,744u,65537u,76752920u,40u,1610612768u,24390u,138442753u,67108864u}/* 2A03 */, /*9363*/{0,744u,65537u,76752920u,40u,1610612768u,24398u,138442753u,67108864u}/* 2A04 */, /*9364*/{0,744u,65537u,76752920u,40u,1610612768u,24406u,138442753u,67108864u}/* 2A05 */, /*9365*/{0,744u,65537u,76752920u,40u,1610612768u,24414u,138442753u,67108864u}/* 2A06 */, /*9366*/{0,744u,65537u,76752920u,40u,1610612768u,24422u,138442753u,67108864u}/* 2A07 */, /*9367*/{0,744u,65537u,76752920u,40u,1610612768u,24430u,138442753u,67108864u}/* 2A08 */, /*9368*/{0,744u,65537u,76752920u,40u,1610612768u,24438u,138442753u,67108864u}/* 2A09 */, /*9369*/{0,744u,65537u,76752920u,40u,1744830496u,24446u,138442753u,67108864u}/* 2A0A */, /*9370*/{0,744u,65537u,76752920u,40u,1744830496u,24454u,138442753u,67108864u}/* 2A0B */, /*9371*/{752877568u,744u,65537u,76752984u,32u,1745354784u,51790u,541208577u,67108864u}/* 2A0C */, /*9372*/{0,744u,65537u,76752920u,40u,1744830496u,24462u,138442753u,67108864u}/* 2A0D */, /*9373*/{0,744u,65537u,76752920u,40u,1744830496u,24470u,138442753u,67108864u}/* 2A0E */, /*9374*/{0,744u,65537u,76752920u,40u,1744830496u,24478u,138442753u,67108864u}/* 2A0F */, /*9375*/{0,744u,65537u,76752920u,40u,1744830496u,24486u,138442753u,67108864u}/* 2A10 */, /*9376*/{0,744u,65537u,76752920u,40u,1744830496u,24494u,138442753u,67108864u}/* 2A11 */, /*9377*/{0,744u,65537u,76752920u,40u,1744830496u,24502u,138442753u,67108864u}/* 2A12 */, /*9378*/{0,744u,65537u,76752920u,40u,1744830496u,24510u,138442753u,67108864u}/* 2A13 */, /*9379*/{0,744u,65537u,76752920u,40u,1744830496u,24518u,138442753u,67108864u}/* 2A14 */, /*9380*/{0,744u,65537u,76752920u,40u,1744830496u,24526u,138442753u,67108864u}/* 2A15 */, /*9381*/{0,744u,65537u,76752920u,40u,1744830496u,24534u,138442753u,67108864u}/* 2A16 */, /*9382*/{0,744u,65537u,76752920u,40u,1744830496u,24542u,138442753u,67108864u}/* 2A17 */, /*9383*/{0,744u,65537u,76752920u,40u,1744830496u,24550u,138442753u,67108864u}/* 2A18 */, /*9384*/{0,744u,65537u,76752920u,40u,1744830496u,24558u,138442753u,67108864u}/* 2A19 */, /*9385*/{0,744u,65537u,76752920u,40u,1744830496u,24566u,138442753u,67108864u}/* 2A1A */, /*9386*/{0,744u,65537u,76752920u,40u,1744830496u,24574u,138442753u,67108864u}/* 2A1B */, /*9387*/{0,744u,65537u,76752920u,40u,1744830496u,24582u,138442753u,67108864u}/* 2A1C */, /*9388*/{0,744u,65537u,76752920u,40u,1610612768u,24590u,138442753u,67108864u}/* 2A1D */, /*9389*/{0,744u,65537u,76752920u,40u,1744830496u,24598u,138442753u,67108864u}/* 2A1E */, /*9390*/{0,744u,65537u,76752920u,40u,1744830496u,24606u,138442753u,67108864u}/* 2A1F */, /*9391*/{0,744u,65537u,76752920u,40u,1744830496u,24614u,138442753u,67108864u}/* 2A20 */, /*9392*/{0,744u,65537u,76752920u,40u,1744830496u,24622u,138442753u,67108864u}/* 2A21 */, /*9393*/{0,744u,65537u,76752920u,40u,1610612768u,24630u,138442753u,67108864u}/* 2A22 */, /*9394*/{0,744u,65537u,76752920u,40u,1610612768u,24638u,138442753u,67108864u}/* 2A23 */, /*9395*/{0,744u,65537u,76752920u,40u,1744830496u,24646u,138442753u,67108864u}/* 2A24 */, /*9396*/{0,744u,65537u,76752920u,40u,1610612768u,24654u,138442753u,67108864u}/* 2A25 */, /*9397*/{0,744u,65537u,76752920u,40u,1744830496u,24662u,138442753u,67108864u}/* 2A26 */, /*9398*/{0,744u,65537u,76752920u,40u,1610612768u,24670u,138442753u,67108864u}/* 2A27 */, /*9399*/{0,744u,65537u,76752920u,40u,1610612768u,24678u,138442753u,67108864u}/* 2A28 */, /*9400*/{0,744u,65537u,76752920u,40u,1744830496u,24686u,138442753u,67108864u}/* 2A29 */, /*9401*/{0,744u,65537u,76752920u,40u,1610612768u,24694u,138442753u,67108864u}/* 2A2A */, /*9402*/{0,930536u,65537u,76752920u,40u,1744830496u,24702u,138442753u,67108864u}/* 2A2B */, /*9403*/{0,934632u,65537u,76752920u,40u,1744830496u,24710u,138442753u,67108864u}/* 2A2C */, /*9404*/{0,938728u,65537u,76752920u,40u,1744830496u,24718u,138442753u,67108864u}/* 2A2D */, /*9405*/{0,942824u,65537u,76752920u,40u,1744830496u,24726u,138442753u,67108864u}/* 2A2E */, /*9406*/{0,744u,65537u,76752920u,40u,1610612768u,24734u,138442753u,67108864u}/* 2A2F */, /*9407*/{0,744u,65537u,76752920u,40u,1610612768u,24742u,138442753u,67108864u}/* 2A30 */, /*9408*/{0,744u,65537u,76752920u,40u,1610612768u,24750u,138442753u,67108864u}/* 2A31 */, /*9409*/{0,744u,65537u,76752920u,40u,1610612768u,24758u,138442753u,67108864u}/* 2A32 */, /*9410*/{0,744u,65537u,76752920u,40u,1610612768u,24766u,138442753u,67108864u}/* 2A33 */, /*9411*/{0,946920u,65537u,76752920u,40u,1744830496u,24774u,138442753u,67108864u}/* 2A34 */, /*9412*/{0,951016u,65537u,76752920u,40u,1744830496u,24782u,138442753u,67108864u}/* 2A35 */, /*9413*/{0,744u,65537u,76752920u,40u,1610612768u,24790u,138442753u,67108864u}/* 2A36 */, /*9414*/{0,744u,65537u,76752920u,40u,1610612768u,24798u,138442753u,67108864u}/* 2A37 */, /*9415*/{0,744u,65537u,76752920u,40u,1610612768u,24806u,138442753u,67108864u}/* 2A38 */, /*9416*/{0,744u,65537u,76752920u,40u,1610612768u,24814u,138442753u,67108864u}/* 2A39 */, /*9417*/{0,744u,65537u,76752920u,40u,1610612768u,24822u,138442753u,67108864u}/* 2A3A */, /*9418*/{0,744u,65537u,76752920u,40u,1610612768u,24830u,138442753u,67108864u}/* 2A3B */, /*9419*/{0,955112u,65537u,76752920u,40u,1744830496u,24838u,138442753u,67108864u}/* 2A3C */, /*9420*/{0,959208u,65537u,76752920u,40u,1744830496u,24846u,138442753u,67108864u}/* 2A3D */, /*9421*/{0,744u,65537u,76752920u,40u,1744830496u,24854u,138442753u,67108864u}/* 2A3E */, /*9422*/{0,744u,65537u,76752920u,40u,1610612768u,24862u,138442753u,67108864u}/* 2A3F */, /*9423*/{0,744u,65537u,76752920u,40u,1610612768u,24870u,138442753u,67108864u}/* 2A40 */, /*9424*/{0,744u,65537u,76752920u,40u,1610612768u,24878u,138442753u,67108864u}/* 2A41 */, /*9425*/{0,744u,65537u,76752920u,40u,1610612768u,24886u,138442753u,67108864u}/* 2A42 */, /*9426*/{0,744u,65537u,76752920u,40u,1610612768u,24894u,138442753u,67108864u}/* 2A43 */, /*9427*/{0,744u,65537u,76752920u,40u,1610612768u,24902u,138442753u,67108864u}/* 2A44 */, /*9428*/{0,744u,65537u,76752920u,40u,1610612768u,24910u,138442753u,67108864u}/* 2A45 */, /*9429*/{0,744u,65537u,76752920u,40u,1610612768u,24918u,138442753u,67108864u}/* 2A46 */, /*9430*/{0,744u,65537u,76752920u,40u,1610612768u,24926u,138442753u,67108864u}/* 2A47 */, /*9431*/{0,744u,65537u,76752920u,40u,1610612768u,24934u,138442753u,67108864u}/* 2A48 */, /*9432*/{0,744u,65537u,76752920u,40u,1610612768u,24942u,138442753u,67108864u}/* 2A49 */, /*9433*/{0,744u,65537u,76752920u,40u,1610612768u,24950u,138442753u,67108864u}/* 2A4A */, /*9434*/{0,744u,65537u,76752920u,40u,1610612768u,24958u,138442753u,67108864u}/* 2A4B */, /*9435*/{0,744u,65537u,76752920u,40u,1610612768u,24966u,138442753u,67108864u}/* 2A4C */, /*9436*/{0,744u,65537u,76752920u,40u,1610612768u,24974u,138442753u,67108864u}/* 2A4D */, /*9437*/{0,744u,65537u,76752920u,40u,1610612768u,24982u,138442753u,67108864u}/* 2A4E */, /*9438*/{0,744u,65537u,76752920u,40u,1610612768u,24990u,138442753u,67108864u}/* 2A4F */, /*9439*/{0,744u,65537u,76752920u,40u,1610612768u,24998u,138442753u,67108864u}/* 2A50 */, /*9440*/{0,744u,65537u,76752920u,40u,1610612768u,25006u,138442753u,67108864u}/* 2A51 */, /*9441*/{0,744u,65537u,76752920u,40u,1610612768u,25014u,138442753u,67108864u}/* 2A52 */, /*9442*/{0,744u,65537u,76752920u,40u,1610612768u,25022u,138442753u,67108864u}/* 2A53 */, /*9443*/{0,744u,65537u,76752920u,40u,1610612768u,25030u,138442753u,67108864u}/* 2A54 */, /*9444*/{0,744u,65537u,76752920u,40u,1610612768u,25038u,138442753u,67108864u}/* 2A55 */, /*9445*/{0,744u,65537u,76752920u,40u,1610612768u,25046u,138442753u,67108864u}/* 2A56 */, /*9446*/{0,744u,65537u,76752920u,40u,1744830496u,25054u,138442753u,67108864u}/* 2A57 */, /*9447*/{0,744u,65537u,76752920u,40u,1744830496u,25062u,138442753u,67108864u}/* 2A58 */, /*9448*/{0,744u,65537u,76752920u,40u,1610612768u,25070u,138442753u,67108864u}/* 2A59 */, /*9449*/{0,744u,65537u,76752920u,40u,1610612768u,25078u,138442753u,67108864u}/* 2A5A */, /*9450*/{0,744u,65537u,76752920u,40u,1610612768u,25086u,138442753u,67108864u}/* 2A5B */, /*9451*/{0,744u,65537u,76752920u,40u,1610612768u,25094u,138442753u,67108864u}/* 2A5C */, /*9452*/{0,744u,65537u,76752920u,40u,1610612768u,25102u,138442753u,67108864u}/* 2A5D */, /*9453*/{0,744u,65537u,76752920u,40u,1610612768u,25110u,138442753u,67108864u}/* 2A5E */, /*9454*/{0,744u,65537u,76752920u,40u,1610612768u,25118u,138442753u,67108864u}/* 2A5F */, /*9455*/{0,744u,65537u,76752920u,40u,1610612768u,25126u,138442753u,67108864u}/* 2A60 */, /*9456*/{0,744u,65537u,76752920u,40u,1610612768u,25134u,138442753u,67108864u}/* 2A61 */, /*9457*/{0,744u,65537u,76752920u,40u,1610612768u,25142u,138442753u,67108864u}/* 2A62 */, /*9458*/{0,744u,65537u,76752920u,40u,1610612768u,25150u,138442753u,67108864u}/* 2A63 */, /*9459*/{0,963304u,65537u,76752920u,40u,1744830496u,25158u,138442753u,67108864u}/* 2A64 */, /*9460*/{0,967400u,65537u,76752920u,40u,1744830496u,25166u,138442753u,67108864u}/* 2A65 */, /*9461*/{0,744u,65537u,76752920u,40u,1610612768u,25174u,138442753u,67108864u}/* 2A66 */, /*9462*/{0,744u,65537u,76752920u,40u,1610612768u,25182u,138442753u,67108864u}/* 2A67 */, /*9463*/{0,744u,65537u,76752920u,40u,1610612768u,25190u,138442753u,67108864u}/* 2A68 */, /*9464*/{0,744u,65537u,76752920u,40u,1610612768u,25198u,138442753u,67108864u}/* 2A69 */, /*9465*/{0,744u,65537u,76752920u,40u,1744830496u,25206u,138442753u,67108864u}/* 2A6A */, /*9466*/{0,744u,65537u,76752920u,40u,1744830496u,25214u,138442753u,67108864u}/* 2A6B */, /*9467*/{0,744u,65537u,76752920u,40u,1744830496u,25222u,138442753u,67108864u}/* 2A6C */, /*9468*/{0,744u,65537u,76752920u,40u,1744830496u,25230u,138442753u,67108864u}/* 2A6D */, /*9469*/{0,744u,65537u,76752920u,40u,1610612768u,25238u,138442753u,67108864u}/* 2A6E */, /*9470*/{0,744u,65537u,76752920u,40u,1744830496u,25246u,138442753u,67108864u}/* 2A6F */, /*9471*/{0,744u,65537u,76752920u,40u,1744830496u,25254u,138442753u,67108864u}/* 2A70 */, /*9472*/{0,744u,65537u,76752920u,40u,1610612768u,25262u,138442753u,67108864u}/* 2A71 */, /*9473*/{0,744u,65537u,76752920u,40u,1610612768u,25270u,138442753u,67108864u}/* 2A72 */, /*9474*/{0,744u,65537u,76752920u,40u,1744830496u,25278u,138442753u,67108864u}/* 2A73 */, /*9475*/{753401856u,744u,65537u,76752984u,32u,1745354784u,21814u,406958081u,67108864u}/* 2A74 */, /*9476*/{753926144u,744u,65537u,76752984u,32u,1611137056u,25374u,272707585u,67108864u}/* 2A75 */, /*9477*/{754450432u,744u,65537u,76752984u,32u,1611137056u,38054u,406958081u,67108864u}/* 2A76 */, /*9478*/{0,744u,65537u,76752920u,40u,1610612768u,25286u,138442753u,67108864u}/* 2A77 */, /*9479*/{0,744u,65537u,76752920u,40u,1610612768u,25294u,138442753u,67108864u}/* 2A78 */, /*9480*/{0,971496u,65537u,76752920u,40u,1744830496u,25302u,138442753u,67108864u}/* 2A79 */, /*9481*/{0,975592u,65537u,76752920u,40u,1744830496u,25310u,138442753u,67108864u}/* 2A7A */, /*9482*/{0,744u,65537u,76752920u,40u,1744830496u,25318u,138442753u,67108864u}/* 2A7B */, /*9483*/{0,744u,65537u,76752920u,40u,1744830496u,25326u,138442753u,67108864u}/* 2A7C */, /*9484*/{0,979688u,65537u,76752920u,40u,1744830496u,25334u,138442753u,67108864u}/* 2A7D */, /*9485*/{0,983784u,65537u,76752920u,40u,1744830496u,25342u,138442753u,67108864u}/* 2A7E */, /*9486*/{0,987880u,65537u,76752920u,40u,1744830496u,25350u,138442753u,67108864u}/* 2A7F */, /*9487*/{0,991976u,65537u,76752920u,40u,1744830496u,25358u,138442753u,67108864u}/* 2A80 */, /*9488*/{0,996072u,65537u,76752920u,40u,1744830496u,25366u,138442753u,67108864u}/* 2A81 */, /*9489*/{0,1000168u,65537u,76752920u,40u,1744830496u,25374u,138442753u,67108864u}/* 2A82 */, /*9490*/{0,1004264u,65537u,76752920u,40u,1744830496u,25382u,138442753u,67108864u}/* 2A83 */, /*9491*/{0,1008360u,65537u,76752920u,40u,1744830496u,25390u,138442753u,67108864u}/* 2A84 */, /*9492*/{0,744u,65537u,76752920u,40u,1744830496u,25398u,138442753u,67108864u}/* 2A85 */, /*9493*/{0,744u,65537u,76752920u,40u,1744830496u,25406u,138442753u,67108864u}/* 2A86 */, /*9494*/{0,744u,65537u,76752920u,40u,1744830496u,25414u,138442753u,67108864u}/* 2A87 */, /*9495*/{0,744u,65537u,76752920u,40u,1744830496u,25422u,138442753u,67108864u}/* 2A88 */, /*9496*/{0,744u,65537u,76752920u,40u,1744830496u,25430u,138442753u,67108864u}/* 2A89 */, /*9497*/{0,744u,65537u,76752920u,40u,1744830496u,25438u,138442753u,67108864u}/* 2A8A */, /*9498*/{0,1012456u,65537u,76752920u,40u,1744830496u,25446u,138442753u,67108864u}/* 2A8B */, /*9499*/{0,1016552u,65537u,76752920u,40u,1744830496u,25454u,138442753u,67108864u}/* 2A8C */, /*9500*/{0,744u,65537u,76752920u,40u,1744830496u,25462u,138442753u,67108864u}/* 2A8D */, /*9501*/{0,744u,65537u,76752920u,40u,1744830496u,25470u,138442753u,67108864u}/* 2A8E */, /*9502*/{0,744u,65537u,76752920u,40u,1744830496u,25478u,138442753u,67108864u}/* 2A8F */, /*9503*/{0,744u,65537u,76752920u,40u,1744830496u,25486u,138442753u,67108864u}/* 2A90 */, /*9504*/{0,1020648u,65537u,76752920u,40u,1744830496u,25494u,138442753u,67108864u}/* 2A91 */, /*9505*/{0,1024744u,65537u,76752920u,40u,1744830496u,25502u,138442753u,67108864u}/* 2A92 */, /*9506*/{0,1028840u,65537u,76752920u,40u,1744830496u,25510u,138442753u,67108864u}/* 2A93 */, /*9507*/{0,1032936u,65537u,76752920u,40u,1744830496u,25518u,138442753u,67108864u}/* 2A94 */, /*9508*/{0,1037032u,65537u,76752920u,40u,1744830496u,25526u,138442753u,67108864u}/* 2A95 */, /*9509*/{0,1041128u,65537u,76752920u,40u,1744830496u,25534u,138442753u,67108864u}/* 2A96 */, /*9510*/{0,1045224u,65537u,76752920u,40u,1744830496u,25542u,138442753u,67108864u}/* 2A97 */, /*9511*/{0,1049320u,65537u,76752920u,40u,1744830496u,25550u,138442753u,67108864u}/* 2A98 */, /*9512*/{0,1053416u,65537u,76752920u,40u,1744830496u,25558u,138442753u,67108864u}/* 2A99 */, /*9513*/{0,1057512u,65537u,76752920u,40u,1744830496u,25566u,138442753u,67108864u}/* 2A9A */, /*9514*/{0,1061608u,65537u,76752920u,40u,1744830496u,25574u,138442753u,67108864u}/* 2A9B */, /*9515*/{0,1065704u,65537u,76752920u,40u,1744830496u,25582u,138442753u,67108864u}/* 2A9C */, /*9516*/{0,744u,65537u,76752920u,40u,1744830496u,25590u,138442753u,67108864u}/* 2A9D */, /*9517*/{0,744u,65537u,76752920u,40u,1744830496u,25598u,138442753u,67108864u}/* 2A9E */, /*9518*/{0,744u,65537u,76752920u,40u,1744830496u,25606u,138442753u,67108864u}/* 2A9F */, /*9519*/{0,744u,65537u,76752920u,40u,1744830496u,25614u,138442753u,67108864u}/* 2AA0 */, /*9520*/{0,1069800u,65537u,76752920u,40u,1744830496u,25622u,138442753u,67108864u}/* 2AA1 */, /*9521*/{0,1073896u,65537u,76752920u,40u,1744830496u,25630u,138442753u,67108864u}/* 2AA2 */, /*9522*/{0,744u,65537u,76752920u,40u,1744830496u,25638u,138442753u,67108864u}/* 2AA3 */, /*9523*/{0,744u,65537u,76752920u,40u,1610612768u,25646u,138442753u,67108864u}/* 2AA4 */, /*9524*/{0,744u,65537u,76752920u,40u,1610612768u,25654u,138442753u,67108864u}/* 2AA5 */, /*9525*/{0,1077992u,65537u,76752920u,40u,1744830496u,25662u,138442753u,67108864u}/* 2AA6 */, /*9526*/{0,1082088u,65537u,76752920u,40u,1744830496u,25670u,138442753u,67108864u}/* 2AA7 */, /*9527*/{0,1086184u,65537u,76752920u,40u,1744830496u,25678u,138442753u,67108864u}/* 2AA8 */, /*9528*/{0,1090280u,65537u,76752920u,40u,1744830496u,25686u,138442753u,67108864u}/* 2AA9 */, /*9529*/{0,1094376u,65537u,76752920u,40u,1744830496u,25694u,138442753u,67108864u}/* 2AAA */, /*9530*/{0,1098472u,65537u,76752920u,40u,1744830496u,25702u,138442753u,67108864u}/* 2AAB */, /*9531*/{0,1102568u,65537u,76752920u,40u,1744830496u,25710u,138442753u,67108864u}/* 2AAC */, /*9532*/{0,1106664u,65537u,76752920u,40u,1744830496u,25718u,138442753u,67108864u}/* 2AAD */, /*9533*/{0,744u,65537u,76752920u,40u,1610612768u,25726u,138442753u,67108864u}/* 2AAE */, /*9534*/{0,1110760u,65537u,76752920u,40u,1744830496u,25734u,138442753u,67108864u}/* 2AAF */, /*9535*/{0,1114856u,65537u,76752920u,40u,1744830496u,25742u,138442753u,67108864u}/* 2AB0 */, /*9536*/{0,744u,65537u,76752920u,40u,1744830496u,25750u,138442753u,67108864u}/* 2AB1 */, /*9537*/{0,744u,65537u,76752920u,40u,1744830496u,25758u,138442753u,67108864u}/* 2AB2 */, /*9538*/{0,1118952u,65537u,76752920u,40u,1744830496u,25766u,138442753u,67108864u}/* 2AB3 */, /*9539*/{0,1123048u,65537u,76752920u,40u,1744830496u,25774u,138442753u,67108864u}/* 2AB4 */, /*9540*/{0,744u,65537u,76752920u,40u,1744830496u,25782u,138442753u,67108864u}/* 2AB5 */, /*9541*/{0,744u,65537u,76752920u,40u,1744830496u,25790u,138442753u,67108864u}/* 2AB6 */, /*9542*/{0,744u,65537u,76752920u,40u,1744830496u,25798u,138442753u,67108864u}/* 2AB7 */, /*9543*/{0,744u,65537u,76752920u,40u,1744830496u,25806u,138442753u,67108864u}/* 2AB8 */, /*9544*/{0,744u,65537u,76752920u,40u,1744830496u,25814u,138442753u,67108864u}/* 2AB9 */, /*9545*/{0,744u,65537u,76752920u,40u,1744830496u,25822u,138442753u,67108864u}/* 2ABA */, /*9546*/{0,1127144u,65537u,76752920u,40u,1744830496u,25830u,138442753u,67108864u}/* 2ABB */, /*9547*/{0,1131240u,65537u,76752920u,40u,1744830496u,25838u,138442753u,67108864u}/* 2ABC */, /*9548*/{0,1135336u,65537u,76752920u,40u,1744830496u,25846u,138442753u,67108864u}/* 2ABD */, /*9549*/{0,1139432u,65537u,76752920u,40u,1744830496u,25854u,138442753u,67108864u}/* 2ABE */, /*9550*/{0,1143528u,65537u,76752920u,40u,1744830496u,25862u,138442753u,67108864u}/* 2ABF */, /*9551*/{0,1147624u,65537u,76752920u,40u,1744830496u,25870u,138442753u,67108864u}/* 2AC0 */, /*9552*/{0,1151720u,65537u,76752920u,40u,1744830496u,25878u,138442753u,67108864u}/* 2AC1 */, /*9553*/{0,1155816u,65537u,76752920u,40u,1744830496u,25886u,138442753u,67108864u}/* 2AC2 */, /*9554*/{0,1159912u,65537u,76752920u,40u,1744830496u,25894u,138442753u,67108864u}/* 2AC3 */, /*9555*/{0,1164008u,65537u,76752920u,40u,1744830496u,25902u,138442753u,67108864u}/* 2AC4 */, /*9556*/{0,1168104u,65537u,76752920u,40u,1744830496u,25910u,138442753u,67108864u}/* 2AC5 */, /*9557*/{0,1172200u,65537u,76752920u,40u,1744830496u,25918u,138442753u,67108864u}/* 2AC6 */, /*9558*/{0,744u,65537u,76752920u,40u,1744830496u,25926u,138442753u,67108864u}/* 2AC7 */, /*9559*/{0,744u,65537u,76752920u,40u,1744830496u,25934u,138442753u,67108864u}/* 2AC8 */, /*9560*/{0,744u,65537u,76752920u,40u,1744830496u,25942u,138442753u,67108864u}/* 2AC9 */, /*9561*/{0,744u,65537u,76752920u,40u,1744830496u,25950u,138442753u,67108864u}/* 2ACA */, /*9562*/{0,744u,65537u,76752920u,40u,1744830496u,25958u,138442753u,67108864u}/* 2ACB */, /*9563*/{0,744u,65537u,76752920u,40u,1744830496u,25966u,138442753u,67108864u}/* 2ACC */, /*9564*/{0,1176296u,65537u,76752920u,40u,1744830496u,25974u,138442753u,67108864u}/* 2ACD */, /*9565*/{0,1180392u,65537u,76752920u,40u,1744830496u,25982u,138442753u,67108864u}/* 2ACE */, /*9566*/{0,1184488u,65537u,76752920u,40u,1744830496u,25990u,138442753u,67108864u}/* 2ACF */, /*9567*/{0,1188584u,65537u,76752920u,40u,1744830496u,25998u,138442753u,67108864u}/* 2AD0 */, /*9568*/{0,1192680u,65537u,76752920u,40u,1744830496u,26006u,138442753u,67108864u}/* 2AD1 */, /*9569*/{0,1196776u,65537u,76752920u,40u,1744830496u,26014u,138442753u,67108864u}/* 2AD2 */, /*9570*/{0,1200872u,65537u,76752920u,40u,1744830496u,26022u,138442753u,67108864u}/* 2AD3 */, /*9571*/{0,1204968u,65537u,76752920u,40u,1744830496u,26030u,138442753u,67108864u}/* 2AD4 */, /*9572*/{0,1209064u,65537u,76752920u,40u,1744830496u,26038u,138442753u,67108864u}/* 2AD5 */, /*9573*/{0,1213160u,65537u,76752920u,40u,1744830496u,26046u,138442753u,67108864u}/* 2AD6 */, /*9574*/{0,744u,65537u,76752920u,40u,1610612768u,26054u,138442753u,67108864u}/* 2AD7 */, /*9575*/{0,744u,65537u,76752920u,40u,1610612768u,26062u,138442753u,67108864u}/* 2AD8 */, /*9576*/{0,744u,65537u,76752920u,40u,1610612768u,26070u,138442753u,67108864u}/* 2AD9 */, /*9577*/{0,744u,65537u,76752920u,40u,1610612768u,26078u,138442753u,67108864u}/* 2ADA */, /*9578*/{0,744u,65537u,76752920u,40u,1610612768u,26086u,138442753u,67108864u}/* 2ADB */, /*9579*/{754974720u,744u,65536u,76752952u,0u,1745354848u,26094u,335585281u,67108864u}/* 2ADC */, /*9580*/{0,744u,65537u,76752920u,40u,1610612768u,26094u,138442753u,67108864u}/* 2ADD */, /*9581*/{0,1217256u,65537u,76752920u,40u,1744830496u,26102u,138442753u,67108864u}/* 2ADE */, /*9582*/{0,744u,65537u,76752920u,40u,1610612768u,26110u,138442753u,67108864u}/* 2ADF */, /*9583*/{0,744u,65537u,76752920u,40u,1610612768u,26118u,138442753u,67108864u}/* 2AE0 */, /*9584*/{0,744u,65537u,76752920u,40u,1610612768u,26126u,138442753u,67108864u}/* 2AE1 */, /*9585*/{0,744u,65537u,76752920u,40u,1744830496u,26134u,138442753u,67108864u}/* 2AE2 */, /*9586*/{0,1221352u,65537u,76752920u,40u,1744830496u,26142u,138442753u,67108864u}/* 2AE3 */, /*9587*/{0,1225448u,65537u,76752920u,40u,1744830496u,26150u,138442753u,67108864u}/* 2AE4 */, /*9588*/{0,1229544u,65537u,76752920u,40u,1744830496u,26158u,138442753u,67108864u}/* 2AE5 */, /*9589*/{0,744u,65537u,76752920u,40u,1744830496u,26166u,138442753u,67108864u}/* 2AE6 */, /*9590*/{0,744u,65537u,76752920u,40u,1610612768u,26174u,138442753u,67108864u}/* 2AE7 */, /*9591*/{0,744u,65537u,76752920u,40u,1610612768u,26182u,138442753u,67108864u}/* 2AE8 */, /*9592*/{0,744u,65537u,76752920u,40u,1610612768u,26190u,138442753u,67108864u}/* 2AE9 */, /*9593*/{0,744u,65537u,76752920u,40u,1610612768u,26198u,138442753u,67108864u}/* 2AEA */, /*9594*/{0,744u,65537u,76752920u,40u,1610612768u,26206u,138442753u,67108864u}/* 2AEB */, /*9595*/{0,1233640u,65537u,76752920u,40u,1744830496u,26214u,138442753u,67108864u}/* 2AEC */, /*9596*/{0,1237736u,65537u,76752920u,40u,1744830496u,26222u,138442753u,67108864u}/* 2AED */, /*9597*/{0,744u,65537u,76752920u,40u,1744830496u,26230u,138442753u,67108864u}/* 2AEE */, /*9598*/{0,744u,65537u,76752920u,40u,1610612768u,26238u,138442753u,67108864u}/* 2AEF */, /*9599*/{0,744u,65537u,76752920u,40u,1610612768u,26246u,138442753u,67108864u}/* 2AF0 */, /*9600*/{0,744u,65537u,76752920u,40u,1610612768u,26254u,138442753u,67108864u}/* 2AF1 */, /*9601*/{0,744u,65537u,76752920u,40u,1610612768u,26262u,138442753u,67108864u}/* 2AF2 */, /*9602*/{0,744u,65537u,76752920u,40u,1744830496u,26270u,138442753u,67108864u}/* 2AF3 */, /*9603*/{0,744u,65537u,76752920u,40u,1610612768u,26278u,138442753u,67108864u}/* 2AF4 */, /*9604*/{0,744u,65537u,76752920u,40u,1610612768u,26286u,138442753u,67108864u}/* 2AF5 */, /*9605*/{0,744u,65537u,76752920u,40u,1610612768u,26294u,138442753u,67108864u}/* 2AF6 */, /*9606*/{0,1241832u,65537u,76752920u,40u,1744830496u,26302u,138442753u,67108864u}/* 2AF7 */, /*9607*/{0,1245928u,65537u,76752920u,40u,1744830496u,26310u,138442753u,67108864u}/* 2AF8 */, /*9608*/{0,1250024u,65537u,76752920u,40u,1744830496u,26318u,138442753u,67108864u}/* 2AF9 */, /*9609*/{0,1254120u,65537u,76752920u,40u,1744830496u,26326u,138442753u,67108864u}/* 2AFA */, /*9610*/{0,744u,65537u,76752920u,40u,1744830496u,26334u,138442753u,67108864u}/* 2AFB */, /*9611*/{0,744u,65537u,76752920u,40u,1610612768u,26342u,138442753u,67108864u}/* 2AFC */, /*9612*/{0,744u,65537u,76752920u,40u,1744830496u,26350u,138442753u,67108864u}/* 2AFD */, /*9613*/{0,744u,65537u,76752920u,40u,1610612768u,26358u,138442753u,67108864u}/* 2AFE */, /*9614*/{0,744u,65537u,76752920u,40u,1610612768u,26366u,138442753u,67108864u}/* 2AFF */, /*9615*/{0,752u,65537u,76785691u,40u,1610612768u,26372u,138442753u,67108864u}/* 2B00 */, /*9616*/{0,752u,65537u,76785691u,40u,1610612768u,26380u,138442753u,67108864u}/* 2B01 */, /*9617*/{0,752u,65537u,76785691u,40u,1610612768u,26388u,138442753u,67108864u}/* 2B02 */, /*9618*/{0,752u,65537u,76785691u,40u,1610612768u,26396u,138442753u,67108864u}/* 2B03 */, /*9619*/{0,752u,65537u,76785691u,40u,1610612768u,26404u,138442753u,67108864u}/* 2B04 */, /*9620*/{0,752u,65537u,76785691u,8u,1610616864u,26412u,138442753u,67108864u}/* 2B05 */, /*9621*/{0,752u,65537u,76785691u,8u,1610616864u,26420u,138442753u,67108864u}/* 2B06 */, /*9622*/{0,752u,65537u,76785691u,8u,1610616864u,26428u,138442753u,67108864u}/* 2B07 */, /*9623*/{0,752u,65537u,76785691u,40u,1610612768u,26436u,138442753u,67108864u}/* 2B08 */, /*9624*/{0,752u,65537u,76785691u,40u,1610612768u,26444u,138442753u,67108864u}/* 2B09 */, /*9625*/{0,752u,65537u,76785691u,40u,1610612768u,26452u,138442753u,67108864u}/* 2B0A */, /*9626*/{0,752u,65537u,76785691u,40u,1610612768u,26460u,138442753u,67108864u}/* 2B0B */, /*9627*/{0,752u,65537u,76785691u,40u,1610612768u,26468u,138442753u,67108864u}/* 2B0C */, /*9628*/{0,752u,65537u,76785691u,40u,1610612768u,26476u,138442753u,67108864u}/* 2B0D */, /*9629*/{0,752u,65537u,76818459u,40u,1610612768u,26484u,138442753u,67108864u}/* 2B0E */, /*9630*/{0,752u,65537u,76818459u,40u,1610612768u,26492u,138442753u,67108864u}/* 2B0F */, /*9631*/{0,752u,65537u,76818459u,40u,1610612768u,26500u,138442753u,67108864u}/* 2B10 */, /*9632*/{0,752u,65537u,76818459u,40u,1610612768u,26508u,138442753u,67108864u}/* 2B11 */, /*9633*/{0,752u,65537u,76818459u,40u,1610612768u,26516u,138442753u,67108864u}/* 2B12 */, /*9634*/{0,752u,65537u,76818459u,40u,1610612768u,26524u,138442753u,67108864u}/* 2B13 */, /*9635*/{0,752u,65537u,76851227u,40u,1610612768u,26532u,138442753u,67108864u}/* 2B14 */, /*9636*/{0,752u,65537u,76851227u,40u,1610612768u,26540u,138442753u,67108864u}/* 2B15 */, /*9637*/{0,752u,65537u,76851227u,40u,1610612768u,26548u,138442753u,67108864u}/* 2B16 */, /*9638*/{0,752u,65537u,76851227u,40u,1610612768u,26556u,138442753u,67108864u}/* 2B17 */, /*9639*/{0,752u,65537u,76851227u,40u,1610612768u,26564u,138442753u,67108864u}/* 2B18 */, /*9640*/{0,752u,65537u,76851227u,40u,1610612768u,26572u,138442753u,67108864u}/* 2B19 */, /*9641*/{0,752u,65537u,76851227u,40u,1610612768u,26580u,138442753u,67108864u}/* 2B1A */, /*9642*/{0,755u,65537u,76883995u,8u,1610617120u,26588u,138442753u,67108864u}/* 2B1B */, /*9643*/{0,755u,65537u,76883995u,8u,1610617120u,26596u,138442753u,67108864u}/* 2B1C */, /*9644*/{0,752u,65537u,76883995u,40u,1610612768u,26604u,138442753u,67108864u}/* 2B1D */, /*9645*/{0,752u,65537u,76883995u,40u,1610612768u,26612u,138442753u,67108864u}/* 2B1E */, /*9646*/{0,752u,65537u,76883995u,40u,1610612768u,26620u,138442753u,67108864u}/* 2B1F */, /*9647*/{0,752u,65537u,76851227u,40u,1610612768u,26628u,138442753u,67108864u}/* 2B20 */, /*9648*/{0,752u,65537u,76851227u,40u,1610612768u,26636u,138442753u,67108864u}/* 2B21 */, /*9649*/{0,752u,65537u,76851227u,40u,1610612768u,26644u,138442753u,67108864u}/* 2B22 */, /*9650*/{0,752u,65537u,76851227u,40u,1610612768u,26652u,138442753u,67108864u}/* 2B23 */, /*9651*/{0,752u,65537u,76883995u,40u,1610612768u,26660u,138442753u,67108864u}/* 2B24 */, /*9652*/{0,752u,65537u,76883995u,40u,1610612768u,26668u,138442753u,67108864u}/* 2B25 */, /*9653*/{0,752u,65537u,76883995u,40u,1610612768u,26676u,138442753u,67108864u}/* 2B26 */, /*9654*/{0,752u,65537u,76883995u,40u,1610612768u,26684u,138442753u,67108864u}/* 2B27 */, /*9655*/{0,752u,65537u,76883995u,40u,1610612768u,26692u,138442753u,67108864u}/* 2B28 */, /*9656*/{0,752u,65537u,76883995u,40u,1610612768u,26700u,138442753u,67108864u}/* 2B29 */, /*9657*/{0,752u,65537u,76883995u,40u,1610612768u,26708u,138442753u,67108864u}/* 2B2A */, /*9658*/{0,752u,65537u,76883995u,40u,1610612768u,26716u,138442753u,67108864u}/* 2B2B */, /*9659*/{0,752u,65537u,76883995u,40u,1610612768u,26724u,138442753u,67108864u}/* 2B2C */, /*9660*/{0,752u,65537u,76883995u,40u,1610612768u,26732u,138442753u,67108864u}/* 2B2D */, /*9661*/{0,752u,65537u,76883995u,40u,1610612768u,26740u,138442753u,67108864u}/* 2B2E */, /*9662*/{0,752u,65537u,76883995u,40u,1610612768u,26748u,138442753u,67108864u}/* 2B2F */, /*9663*/{0,752u,65537u,76883992u,40u,1610612768u,26758u,138442753u,67108864u}/* 2B30 */, /*9664*/{0,752u,65537u,76883992u,40u,1610612768u,26766u,138442753u,67108864u}/* 2B31 */, /*9665*/{0,752u,65537u,76883992u,40u,1610612768u,26774u,138442753u,67108864u}/* 2B32 */, /*9666*/{0,752u,65537u,76883992u,40u,1610612768u,26782u,138442753u,67108864u}/* 2B33 */, /*9667*/{0,752u,65537u,76883992u,40u,1610612768u,26790u,138442753u,67108864u}/* 2B34 */, /*9668*/{0,752u,65537u,76883992u,40u,1610612768u,26798u,138442753u,67108864u}/* 2B35 */, /*9669*/{0,752u,65537u,76883992u,40u,1610612768u,26806u,138442753u,67108864u}/* 2B36 */, /*9670*/{0,752u,65537u,76883992u,40u,1610612768u,26814u,138442753u,67108864u}/* 2B37 */, /*9671*/{0,752u,65537u,76883992u,40u,1610612768u,26822u,138442753u,67108864u}/* 2B38 */, /*9672*/{0,752u,65537u,76883992u,40u,1610612768u,26830u,138442753u,67108864u}/* 2B39 */, /*9673*/{0,752u,65537u,76883992u,40u,1610612768u,26838u,138442753u,67108864u}/* 2B3A */, /*9674*/{0,752u,65537u,76883992u,40u,1610612768u,26846u,138442753u,67108864u}/* 2B3B */, /*9675*/{0,752u,65537u,76883992u,40u,1610612768u,26854u,138442753u,67108864u}/* 2B3C */, /*9676*/{0,752u,65537u,76883992u,40u,1610612768u,26862u,138442753u,67108864u}/* 2B3D */, /*9677*/{0,752u,65537u,76883992u,40u,1610612768u,26870u,138442753u,67108864u}/* 2B3E */, /*9678*/{0,752u,65537u,76883992u,40u,1610612768u,26878u,138442753u,67108864u}/* 2B3F */, /*9679*/{0,752u,65537u,76883992u,40u,1610612768u,26886u,138442753u,67108864u}/* 2B40 */, /*9680*/{0,752u,65537u,76883992u,40u,1610612768u,26894u,138442753u,67108864u}/* 2B41 */, /*9681*/{0,752u,65537u,76883992u,40u,1610612768u,26902u,138442753u,67108864u}/* 2B42 */, /*9682*/{0,752u,65537u,76883992u,40u,1610612768u,26910u,138442753u,67108864u}/* 2B43 */, /*9683*/{0,752u,65537u,76883992u,40u,1610612768u,26918u,138442753u,67108864u}/* 2B44 */, /*9684*/{0,752u,65537u,76883995u,40u,1610612768u,26924u,138442753u,67108864u}/* 2B45 */, /*9685*/{0,752u,65537u,76883995u,40u,1610612768u,26932u,138442753u,67108864u}/* 2B46 */, /*9686*/{0,752u,65537u,76883992u,40u,1610612768u,26942u,138442753u,67108864u}/* 2B47 */, /*9687*/{0,752u,65537u,76883992u,40u,1610612768u,26950u,138442753u,67108864u}/* 2B48 */, /*9688*/{0,752u,65537u,76883992u,40u,1610612768u,26958u,138442753u,67108864u}/* 2B49 */, /*9689*/{0,752u,65537u,76883992u,40u,1610612768u,26966u,138442753u,67108864u}/* 2B4A */, /*9690*/{0,752u,65537u,76883992u,40u,1610612768u,26974u,138442753u,67108864u}/* 2B4B */, /*9691*/{0,752u,65537u,76883992u,40u,1610612768u,26982u,138442753u,67108864u}/* 2B4C */, /*9692*/{0,752u,65537u,77080603u,40u,1610612768u,26988u,138442753u,67108864u}/* 2B4D */, /*9693*/{0,752u,65537u,77080603u,40u,1610612768u,26996u,138442753u,67108864u}/* 2B4E */, /*9694*/{0,752u,65537u,77080603u,40u,1610612768u,27004u,138442753u,67108864u}/* 2B4F */, /*9695*/{0,755u,65537u,76883995u,8u,1610617120u,27012u,138442753u,67108864u}/* 2B50 */, /*9696*/{0,752u,65537u,76883995u,40u,1610612768u,27020u,138442753u,67108864u}/* 2B51 */, /*9697*/{0,752u,65537u,76883995u,40u,1610612768u,27028u,138442753u,67108864u}/* 2B52 */, /*9698*/{0,752u,65537u,76883995u,40u,1610612768u,27036u,138442753u,67108864u}/* 2B53 */, /*9699*/{0,752u,65537u,76883995u,40u,1610612768u,27044u,138442753u,67108864u}/* 2B54 */, /*9700*/{0,755u,65537u,89499675u,8u,1610617120u,27052u,138442753u,67108864u}/* 2B55 */, /*9701*/{0,753u,65537u,89499675u,40u,1610612768u,27060u,138442753u,67108864u}/* 2B56 */, /*9702*/{0,753u,65537u,89499675u,40u,1610612768u,27068u,138442753u,67108864u}/* 2B57 */, /*9703*/{0,753u,65537u,89499675u,40u,1610612768u,27076u,138442753u,67108864u}/* 2B58 */, /*9704*/{0,753u,65537u,89499675u,40u,1610612768u,27084u,138442753u,67108864u}/* 2B59 */, /*9705*/{0,752u,65537u,77080603u,40u,1610612768u,27092u,138442753u,67108864u}/* 2B5A */, /*9706*/{0,752u,65537u,77080603u,40u,1610612768u,27100u,138442753u,67108864u}/* 2B5B */, /*9707*/{0,752u,65537u,77080603u,40u,1610612768u,27108u,138442753u,67108864u}/* 2B5C */, /*9708*/{0,752u,65537u,77080603u,40u,1610612768u,27116u,138442753u,67108864u}/* 2B5D */, /*9709*/{0,752u,65537u,77080603u,40u,1610612768u,27124u,138442753u,67108864u}/* 2B5E */, /*9710*/{0,752u,65537u,77080603u,40u,1610612768u,27132u,138442753u,67108864u}/* 2B5F */, /*9711*/{0,752u,65537u,77080603u,40u,1610612768u,27140u,138442753u,67108864u}/* 2B60 */, /*9712*/{0,752u,65537u,77080603u,40u,1610612768u,27148u,138442753u,67108864u}/* 2B61 */, /*9713*/{0,752u,65537u,77080603u,40u,1610612768u,27156u,138442753u,67108864u}/* 2B62 */, /*9714*/{0,752u,65537u,77080603u,40u,1610612768u,27164u,138442753u,67108864u}/* 2B63 */, /*9715*/{0,752u,65537u,77080603u,40u,1610612768u,27172u,138442753u,67108864u}/* 2B64 */, /*9716*/{0,752u,65537u,77080603u,40u,1610612768u,27180u,138442753u,67108864u}/* 2B65 */, /*9717*/{0,752u,65537u,77080603u,40u,1610612768u,27188u,138442753u,67108864u}/* 2B66 */, /*9718*/{0,752u,65537u,77080603u,40u,1610612768u,27196u,138442753u,67108864u}/* 2B67 */, /*9719*/{0,752u,65537u,77080603u,40u,1610612768u,27204u,138442753u,67108864u}/* 2B68 */, /*9720*/{0,752u,65537u,77080603u,40u,1610612768u,27212u,138442753u,67108864u}/* 2B69 */, /*9721*/{0,752u,65537u,77080603u,40u,1610612768u,27220u,138442753u,67108864u}/* 2B6A */, /*9722*/{0,752u,65537u,77080603u,40u,1610612768u,27228u,138442753u,67108864u}/* 2B6B */, /*9723*/{0,752u,65537u,77080603u,40u,1610612768u,27236u,138442753u,67108864u}/* 2B6C */, /*9724*/{0,752u,65537u,77080603u,40u,1610612768u,27244u,138442753u,67108864u}/* 2B6D */, /*9725*/{0,752u,65537u,77080603u,40u,1610612768u,27252u,138442753u,67108864u}/* 2B6E */, /*9726*/{0,752u,65537u,77080603u,40u,1610612768u,27260u,138442753u,67108864u}/* 2B6F */, /*9727*/{0,752u,65537u,77080603u,40u,1610612768u,27268u,138442753u,67108864u}/* 2B70 */, /*9728*/{0,752u,65537u,77080603u,40u,1610612768u,27276u,138442753u,67108864u}/* 2B71 */, /*9729*/{0,752u,65537u,77080603u,40u,1610612768u,27284u,138442753u,67108864u}/* 2B72 */, /*9730*/{0,752u,65537u,77080603u,40u,1610612768u,27292u,138442753u,67108864u}/* 2B73 */, /*9731*/{0,752u,65537u,77080603u,40u,1610612768u,27300u,138442753u,67108864u}/* 2B76 */, /*9732*/{0,752u,65537u,77080603u,40u,1610612768u,27308u,138442753u,67108864u}/* 2B77 */, /*9733*/{0,752u,65537u,77080603u,40u,1610612768u,27316u,138442753u,67108864u}/* 2B78 */, /*9734*/{0,752u,65537u,77080603u,40u,1610612768u,27324u,138442753u,67108864u}/* 2B79 */, /*9735*/{0,752u,65537u,77080603u,40u,1610612768u,27332u,138442753u,67108864u}/* 2B7A */, /*9736*/{0,752u,65537u,77080603u,40u,1610612768u,27340u,138442753u,67108864u}/* 2B7B */, /*9737*/{0,752u,65537u,77080603u,40u,1610612768u,27348u,138442753u,67108864u}/* 2B7C */, /*9738*/{0,752u,65537u,77080603u,40u,1610612768u,27356u,138442753u,67108864u}/* 2B7D */, /*9739*/{0,752u,65537u,77080603u,40u,1610612768u,27364u,138442753u,67108864u}/* 2B7E */, /*9740*/{0,752u,65537u,77080603u,40u,1610612768u,27372u,138442753u,67108864u}/* 2B7F */, /*9741*/{0,752u,65537u,77080603u,40u,1610612768u,27380u,138442753u,67108864u}/* 2B80 */, /*9742*/{0,752u,65537u,77080603u,40u,1610612768u,27388u,138442753u,67108864u}/* 2B81 */, /*9743*/{0,752u,65537u,77080603u,40u,1610612768u,27396u,138442753u,67108864u}/* 2B82 */, /*9744*/{0,752u,65537u,77080603u,40u,1610612768u,27404u,138442753u,67108864u}/* 2B83 */, /*9745*/{0,752u,65537u,77080603u,40u,1610612768u,27412u,138442753u,67108864u}/* 2B84 */, /*9746*/{0,752u,65537u,77080603u,40u,1610612768u,27420u,138442753u,67108864u}/* 2B85 */, /*9747*/{0,752u,65537u,77080603u,40u,1610612768u,27428u,138442753u,67108864u}/* 2B86 */, /*9748*/{0,752u,65537u,77080603u,40u,1610612768u,27436u,138442753u,67108864u}/* 2B87 */, /*9749*/{0,752u,65537u,77080603u,40u,1610612768u,27444u,138442753u,67108864u}/* 2B88 */, /*9750*/{0,752u,65537u,77080603u,40u,1610612768u,27452u,138442753u,67108864u}/* 2B89 */, /*9751*/{0,752u,65537u,77080603u,40u,1610612768u,27460u,138442753u,67108864u}/* 2B8A */, /*9752*/{0,752u,65537u,77080603u,40u,1610612768u,27468u,138442753u,67108864u}/* 2B8B */, /*9753*/{0,752u,65537u,77080603u,40u,1610612768u,27476u,138442753u,67108864u}/* 2B8C */, /*9754*/{0,752u,65537u,77080603u,40u,1610612768u,27484u,138442753u,67108864u}/* 2B8D */, /*9755*/{0,752u,65537u,77080603u,40u,1610612768u,27492u,138442753u,67108864u}/* 2B8E */, /*9756*/{0,752u,65537u,77080603u,40u,1610612768u,27500u,138442753u,67108864u}/* 2B8F */, /*9757*/{0,752u,65537u,77080603u,40u,1610612768u,27508u,138442753u,67108864u}/* 2B90 */, /*9758*/{0,752u,65537u,77080603u,40u,1610612768u,27516u,138442753u,67108864u}/* 2B91 */, /*9759*/{0,752u,65537u,77080603u,40u,1610612768u,27524u,138442753u,67108864u}/* 2B92 */, /*9760*/{0,752u,65537u,77080603u,40u,1610612768u,27532u,138442753u,67108864u}/* 2B93 */, /*9761*/{0,752u,65537u,77080603u,40u,1610612768u,27540u,138442753u,67108864u}/* 2B94 */, /*9762*/{0,752u,65537u,77080603u,40u,1610612768u,27548u,138442753u,67108864u}/* 2B95 */, /*9763*/{0,752u,65537u,77080603u,40u,1610612768u,27556u,138442753u,67108864u}/* 2B98 */, /*9764*/{0,752u,65537u,77080603u,40u,1610612768u,27564u,138442753u,67108864u}/* 2B99 */, /*9765*/{0,752u,65537u,77080603u,40u,1610612768u,27572u,138442753u,67108864u}/* 2B9A */, /*9766*/{0,752u,65537u,77080603u,40u,1610612768u,27580u,138442753u,67108864u}/* 2B9B */, /*9767*/{0,752u,65537u,77080603u,40u,1610612768u,27588u,138442753u,67108864u}/* 2B9C */, /*9768*/{0,752u,65537u,77080603u,40u,1610612768u,27596u,138442753u,67108864u}/* 2B9D */, /*9769*/{0,752u,65537u,77080603u,40u,1610612768u,27604u,138442753u,67108864u}/* 2B9E */, /*9770*/{0,752u,65537u,77080603u,40u,1610612768u,27612u,138442753u,67108864u}/* 2B9F */, /*9771*/{0,752u,65537u,77080603u,40u,1610612768u,27620u,138442753u,67108864u}/* 2BA0 */, /*9772*/{0,752u,65537u,77080603u,40u,1610612768u,27628u,138442753u,67108864u}/* 2BA1 */, /*9773*/{0,752u,65537u,77080603u,40u,1610612768u,27636u,138442753u,67108864u}/* 2BA2 */, /*9774*/{0,752u,65537u,77080603u,40u,1610612768u,27644u,138442753u,67108864u}/* 2BA3 */, /*9775*/{0,752u,65537u,77080603u,40u,1610612768u,27652u,138442753u,67108864u}/* 2BA4 */, /*9776*/{0,752u,65537u,77080603u,40u,1610612768u,27660u,138442753u,67108864u}/* 2BA5 */, /*9777*/{0,752u,65537u,77080603u,40u,1610612768u,27668u,138442753u,67108864u}/* 2BA6 */, /*9778*/{0,752u,65537u,77080603u,40u,1610612768u,27676u,138442753u,67108864u}/* 2BA7 */, /*9779*/{0,752u,65537u,77080603u,40u,1610612768u,27684u,138442753u,67108864u}/* 2BA8 */, /*9780*/{0,752u,65537u,77080603u,40u,1610612768u,27692u,138442753u,67108864u}/* 2BA9 */, /*9781*/{0,752u,65537u,77080603u,40u,1610612768u,27700u,138442753u,67108864u}/* 2BAA */, /*9782*/{0,752u,65537u,77080603u,40u,1610612768u,27708u,138442753u,67108864u}/* 2BAB */, /*9783*/{0,752u,65537u,77080603u,40u,1610612768u,27716u,138442753u,67108864u}/* 2BAC */, /*9784*/{0,752u,65537u,77080603u,40u,1610612768u,27724u,138442753u,67108864u}/* 2BAD */, /*9785*/{0,752u,65537u,77080603u,40u,1610612768u,27732u,138442753u,67108864u}/* 2BAE */, /*9786*/{0,752u,65537u,77080603u,40u,1610612768u,27740u,138442753u,67108864u}/* 2BAF */, /*9787*/{0,752u,65537u,77080603u,40u,1610612768u,27748u,138442753u,67108864u}/* 2BB0 */, /*9788*/{0,752u,65537u,77080603u,40u,1610612768u,27756u,138442753u,67108864u}/* 2BB1 */, /*9789*/{0,752u,65537u,77080603u,40u,1610612768u,27764u,138442753u,67108864u}/* 2BB2 */, /*9790*/{0,752u,65537u,77080603u,40u,1610612768u,27772u,138442753u,67108864u}/* 2BB3 */, /*9791*/{0,752u,65537u,77080603u,40u,1610612768u,27780u,138442753u,67108864u}/* 2BB4 */, /*9792*/{0,752u,65537u,77080603u,40u,1610612768u,27788u,138442753u,67108864u}/* 2BB5 */, /*9793*/{0,752u,65537u,77080603u,40u,1610612768u,27796u,138442753u,67108864u}/* 2BB6 */, /*9794*/{0,752u,65537u,77080603u,40u,1610612768u,27804u,138442753u,67108864u}/* 2BB7 */, /*9795*/{0,752u,65537u,77080603u,40u,1610612768u,27812u,138442753u,67108864u}/* 2BB8 */, /*9796*/{0,752u,65537u,77080603u,40u,1610612768u,27820u,138442753u,67108864u}/* 2BB9 */, /*9797*/{0,752u,65537u,77080603u,40u,1610612768u,27828u,138442753u,67108864u}/* 2BBD */, /*9798*/{0,752u,65537u,77080603u,40u,1610612768u,27836u,138442753u,67108864u}/* 2BBE */, /*9799*/{0,752u,65537u,77080603u,40u,1610612768u,27844u,138442753u,67108864u}/* 2BBF */, /*9800*/{0,752u,65537u,77080603u,40u,1610612768u,27852u,138442753u,67108864u}/* 2BC0 */, /*9801*/{0,752u,65537u,77080603u,40u,1610612768u,27860u,138442753u,67108864u}/* 2BC1 */, /*9802*/{0,752u,65537u,77080603u,40u,1610612768u,27868u,138442753u,67108864u}/* 2BC2 */, /*9803*/{0,752u,65537u,77080603u,40u,1610612768u,27876u,138442753u,67108864u}/* 2BC3 */, /*9804*/{0,752u,65537u,77080603u,40u,1610612768u,27884u,138442753u,67108864u}/* 2BC4 */, /*9805*/{0,752u,65537u,77080603u,40u,1610612768u,27892u,138442753u,67108864u}/* 2BC5 */, /*9806*/{0,752u,65537u,77080603u,40u,1610612768u,27900u,138442753u,67108864u}/* 2BC6 */, /*9807*/{0,752u,65537u,77080603u,40u,1610612768u,27908u,138442753u,67108864u}/* 2BC7 */, /*9808*/{0,752u,65537u,77080603u,40u,1610612768u,27916u,138442753u,67108864u}/* 2BC8 */, /*9809*/{0,752u,65537u,77080603u,40u,1610612768u,27924u,138442753u,67108864u}/* 2BCA */, /*9810*/{0,752u,65537u,77080603u,40u,1610612768u,27932u,138442753u,67108864u}/* 2BCB */, /*9811*/{0,752u,65537u,77080603u,40u,1610612768u,27940u,138442753u,67108864u}/* 2BCC */, /*9812*/{0,752u,65537u,77080603u,40u,1610612768u,27948u,138442753u,67108864u}/* 2BCD */, /*9813*/{0,752u,65537u,77080603u,40u,1610612768u,27956u,138442753u,67108864u}/* 2BCE */, /*9814*/{0,752u,65537u,77080603u,40u,1610612768u,27964u,138442753u,67108864u}/* 2BCF */, /*9815*/{0,752u,65537u,77080603u,40u,1610612768u,27972u,138442753u,67108864u}/* 2BD0 */, /*9816*/{0,752u,65537u,77080603u,40u,1610612768u,27980u,138442753u,67108864u}/* 2BD1 */, /*9817*/{0,752u,65537u,77178907u,40u,1610612768u,27988u,138442753u,67108864u}/* 2BD2 */, /*9818*/{0,752u,65537u,77113371u,40u,1610612768u,27996u,138442753u,67108864u}/* 2BEC */, /*9819*/{0,752u,65537u,77113371u,40u,1610612768u,28004u,138442753u,67108864u}/* 2BED */, /*9820*/{0,752u,65537u,77113371u,40u,1610612768u,28012u,138442753u,67108864u}/* 2BEE */, /*9821*/{0,752u,65537u,77113371u,40u,1610612768u,28020u,138442753u,67108864u}/* 2BEF */, /*9822*/{209280u,1627390712u,3735553u,76808193u,1507368u,3807903776u,1711346276u,138491904u,2490368u}/* 2C00 */, /*9823*/{209408u,1629487864u,3735553u,76808193u,1507368u,3807903776u,1711346284u,138491904u,2490368u}/* 2C01 */, /*9824*/{209536u,1631585016u,3735553u,76808193u,1507368u,3807903776u,1711346292u,138491904u,2490368u}/* 2C02 */, /*9825*/{209664u,1633682168u,3735553u,76808193u,1507368u,3807903776u,1711346300u,138491904u,2490368u}/* 2C03 */, /*9826*/{209792u,1635779320u,3735553u,76808193u,1507368u,3807903776u,1711346308u,138491904u,2490368u}/* 2C04 */, /*9827*/{209920u,1637876472u,3735553u,76808193u,1507368u,3807903776u,1711346316u,138491904u,2490368u}/* 2C05 */, /*9828*/{210048u,1639973624u,3735553u,76808193u,1507368u,3807903776u,1711346324u,138491904u,2490368u}/* 2C06 */, /*9829*/{210176u,1642070776u,3735553u,76808193u,1507368u,3807903776u,1711346332u,138491904u,2490368u}/* 2C07 */, /*9830*/{210304u,1644167928u,3735553u,76808193u,1507368u,3807903776u,1711346340u,138491904u,2490368u}/* 2C08 */, /*9831*/{210432u,1646265080u,3735553u,76808193u,1507368u,3807903776u,1711346348u,138491904u,2490368u}/* 2C09 */, /*9832*/{210560u,1648362232u,3735553u,76808193u,1507368u,3807903776u,1711346356u,138491904u,2490368u}/* 2C0A */, /*9833*/{210688u,1650459384u,3735553u,76808193u,1507368u,3807903776u,1711346364u,138491904u,2490368u}/* 2C0B */, /*9834*/{210816u,1652556536u,3735553u,76808193u,1507368u,3807903776u,1711346372u,138491904u,2490368u}/* 2C0C */, /*9835*/{210944u,1654653688u,3735553u,76808193u,1507368u,3807903776u,1711346380u,138491904u,2490368u}/* 2C0D */, /*9836*/{211072u,1656750840u,3735553u,76808193u,1507368u,3807903776u,1711346388u,138491904u,2490368u}/* 2C0E */, /*9837*/{211200u,1658847992u,3735553u,76808193u,1507368u,3807903776u,1711346396u,138491904u,2490368u}/* 2C0F */, /*9838*/{211328u,1660945144u,3735553u,76808193u,1507368u,3807903776u,1711346404u,138491904u,2490368u}/* 2C10 */, /*9839*/{211456u,1663042296u,3735553u,76808193u,1507368u,3807903776u,1711346412u,138491904u,2490368u}/* 2C11 */, /*9840*/{211584u,1665139448u,3735553u,76808193u,1507368u,3807903776u,1711346420u,138491904u,2490368u}/* 2C12 */, /*9841*/{211712u,1667236600u,3735553u,76808193u,1507368u,3807903776u,1711346428u,138491904u,2490368u}/* 2C13 */, /*9842*/{211840u,1669333752u,3735553u,76808193u,1507368u,3807903776u,1711346436u,138491904u,2490368u}/* 2C14 */, /*9843*/{211968u,1671430904u,3735553u,76808193u,1507368u,3807903776u,1711346444u,138491904u,2490368u}/* 2C15 */, /*9844*/{212096u,1673528056u,3735553u,76808193u,1507368u,3807903776u,1711346452u,138491904u,2490368u}/* 2C16 */, /*9845*/{212224u,1675625208u,3735553u,76808193u,1507368u,3807903776u,1711346460u,138491904u,2490368u}/* 2C17 */, /*9846*/{212352u,1677722360u,3735553u,76808193u,1507368u,3807903776u,1711346468u,138491904u,2490368u}/* 2C18 */, /*9847*/{212480u,1679819512u,3735553u,76808193u,1507368u,3807903776u,1711346476u,138491904u,2490368u}/* 2C19 */, /*9848*/{212608u,1681916664u,3735553u,76808193u,1507368u,3807903776u,1711346484u,138491904u,2490368u}/* 2C1A */, /*9849*/{212736u,1684013816u,3735553u,76808193u,1507368u,3807903776u,1711346492u,138491904u,2490368u}/* 2C1B */, /*9850*/{212864u,1686110968u,3735553u,76808193u,1507368u,3807903776u,1711346500u,138491904u,2490368u}/* 2C1C */, /*9851*/{212992u,1688208120u,3735553u,76808193u,1507368u,3807903776u,1711346508u,138491904u,2490368u}/* 2C1D */, /*9852*/{213120u,1690305272u,3735553u,76808193u,1507368u,3807903776u,1711346516u,138491904u,2490368u}/* 2C1E */, /*9853*/{213248u,1692402424u,3735553u,76808193u,1507368u,3807903776u,1711346524u,138491904u,2490368u}/* 2C1F */, /*9854*/{213376u,1694499576u,3735553u,76808193u,1507368u,3807903776u,1711346532u,138491904u,2490368u}/* 2C20 */, /*9855*/{213504u,1696596728u,3735553u,76808193u,1507368u,3807903776u,1711346540u,138491904u,2490368u}/* 2C21 */, /*9856*/{213632u,1698693880u,3735553u,76808193u,1507368u,3807903776u,1711346548u,138491904u,2490368u}/* 2C22 */, /*9857*/{213760u,1700791032u,3735553u,76808193u,1507368u,3807903776u,1711346556u,138491904u,2490368u}/* 2C23 */, /*9858*/{213888u,1702888184u,3735553u,76808193u,1507368u,3807903776u,1711346564u,138491904u,2490368u}/* 2C24 */, /*9859*/{214016u,1704985336u,3735553u,76808193u,1507368u,3807903776u,1711346572u,138491904u,2490368u}/* 2C25 */, /*9860*/{214144u,1707082488u,3735553u,76808193u,1507368u,3807903776u,1711346580u,138491904u,2490368u}/* 2C26 */, /*9861*/{214272u,1709179640u,3735553u,76808193u,1507368u,3807903776u,1711346588u,138491904u,2490368u}/* 2C27 */, /*9862*/{214400u,1711276792u,3735553u,76808193u,1507368u,3807903776u,1711346596u,138491904u,2490368u}/* 2C28 */, /*9863*/{214528u,1713373944u,3735553u,76808193u,1507368u,3807903776u,1711346604u,138491904u,2490368u}/* 2C29 */, /*9864*/{214656u,1715471096u,3735553u,76808193u,1507368u,3807903776u,1711346612u,138491904u,2490368u}/* 2C2A */, /*9865*/{214784u,1717568248u,3735553u,76808193u,1507368u,3807903776u,1711346620u,138491904u,2490368u}/* 2C2B */, /*9866*/{214912u,1719665400u,3735553u,76808193u,1507368u,3807903776u,1711346628u,138491904u,2490368u}/* 2C2C */, /*9867*/{215040u,1721762552u,3735553u,76808193u,1507368u,3807903776u,1711346636u,138491904u,2490368u}/* 2C2D */, /*9868*/{215168u,1723859704u,3735553u,76808193u,1507368u,3807903776u,1711346644u,138491904u,2490368u}/* 2C2E */, /*9869*/{215296u,760u,3735553u,76808194u,1499176u,3768975392u,1719734884u,138442752u,393216u}/* 2C30 */, /*9870*/{215424u,760u,3735553u,76808194u,1499176u,3768975392u,1719734892u,138442752u,393216u}/* 2C31 */, /*9871*/{215552u,760u,3735553u,76808194u,1499176u,3768975392u,1719734900u,138442752u,393216u}/* 2C32 */, /*9872*/{215680u,760u,3735553u,76808194u,1499176u,3768975392u,1719734908u,138442752u,393216u}/* 2C33 */, /*9873*/{215808u,760u,3735553u,76808194u,1499176u,3768975392u,1719734916u,138442752u,393216u}/* 2C34 */, /*9874*/{215936u,760u,3735553u,76808194u,1499176u,3768975392u,1719734924u,138442752u,393216u}/* 2C35 */, /*9875*/{216064u,760u,3735553u,76808194u,1499176u,3768975392u,1719734932u,138442752u,393216u}/* 2C36 */, /*9876*/{216192u,760u,3735553u,76808194u,1499176u,3768975392u,1719734940u,138442752u,393216u}/* 2C37 */, /*9877*/{216320u,760u,3735553u,76808194u,1499176u,3768975392u,1719734948u,138442752u,393216u}/* 2C38 */, /*9878*/{216448u,760u,3735553u,76808194u,1499176u,3768975392u,1719734956u,138442752u,393216u}/* 2C39 */, /*9879*/{216576u,760u,3735553u,76808194u,1499176u,3768975392u,1719734964u,138442752u,393216u}/* 2C3A */, /*9880*/{216704u,760u,3735553u,76808194u,1499176u,3768975392u,1719734972u,138442752u,393216u}/* 2C3B */, /*9881*/{216832u,760u,3735553u,76808194u,1499176u,3768975392u,1719734980u,138442752u,393216u}/* 2C3C */, /*9882*/{216960u,760u,3735553u,76808194u,1499176u,3768975392u,1719734988u,138442752u,393216u}/* 2C3D */, /*9883*/{217088u,760u,3735553u,76808194u,1499176u,3768975392u,1719734996u,138442752u,393216u}/* 2C3E */, /*9884*/{217216u,760u,3735553u,76808194u,1499176u,3768975392u,1719735004u,138442752u,393216u}/* 2C3F */, /*9885*/{217344u,760u,3735553u,76808194u,1499176u,3768975392u,1719735012u,138442752u,393216u}/* 2C40 */, /*9886*/{217472u,760u,3735553u,76808194u,1499176u,3768975392u,1719735020u,138442752u,393216u}/* 2C41 */, /*9887*/{217600u,760u,3735553u,76808194u,1499176u,3768975392u,1719735028u,138442752u,393216u}/* 2C42 */, /*9888*/{217728u,760u,3735553u,76808194u,1499176u,3768975392u,1719735036u,138442752u,393216u}/* 2C43 */, /*9889*/{217856u,760u,3735553u,76808194u,1499176u,3768975392u,1719735044u,138442752u,393216u}/* 2C44 */, /*9890*/{217984u,760u,3735553u,76808194u,1499176u,3768975392u,1719735052u,138442752u,393216u}/* 2C45 */, /*9891*/{218112u,760u,3735553u,76808194u,1499176u,3768975392u,1719735060u,138442752u,393216u}/* 2C46 */, /*9892*/{218240u,760u,3735553u,76808194u,1499176u,3768975392u,1719735068u,138442752u,393216u}/* 2C47 */, /*9893*/{218368u,760u,3735553u,76808194u,1499176u,3768975392u,1719735076u,138442752u,393216u}/* 2C48 */, /*9894*/{218496u,760u,3735553u,76808194u,1499176u,3768975392u,1719735084u,138442752u,393216u}/* 2C49 */, /*9895*/{218624u,760u,3735553u,76808194u,1499176u,3768975392u,1719735092u,138442752u,393216u}/* 2C4A */, /*9896*/{218752u,760u,3735553u,76808194u,1499176u,3768975392u,1719735100u,138442752u,393216u}/* 2C4B */, /*9897*/{218880u,760u,3735553u,76808194u,1499176u,3768975392u,1719735108u,138442752u,393216u}/* 2C4C */, /*9898*/{219008u,760u,3735553u,76808194u,1499176u,3768975392u,1719735116u,138442752u,393216u}/* 2C4D */, /*9899*/{219136u,760u,3735553u,76808194u,1499176u,3768975392u,1719735124u,138442752u,393216u}/* 2C4E */, /*9900*/{219264u,760u,3735553u,76808194u,1499176u,3768975392u,1719735132u,138442752u,393216u}/* 2C4F */, /*9901*/{219392u,760u,3735553u,76808194u,1499176u,3768975392u,1719735140u,138442752u,393216u}/* 2C50 */, /*9902*/{219520u,760u,3735553u,76808194u,1499176u,3768975392u,1719735148u,138442752u,393216u}/* 2C51 */, /*9903*/{219648u,760u,3735553u,76808194u,1499176u,3768975392u,1719735156u,138442752u,393216u}/* 2C52 */, /*9904*/{219776u,760u,3735553u,76808194u,1499176u,3768975392u,1719735164u,138442752u,393216u}/* 2C53 */, /*9905*/{219904u,760u,3735553u,76808194u,1499176u,3768975392u,1719735172u,138442752u,393216u}/* 2C54 */, /*9906*/{220032u,760u,3735553u,76808194u,1499176u,3768975392u,1719735180u,138442752u,393216u}/* 2C55 */, /*9907*/{220160u,760u,3735553u,76808194u,1499176u,3768975392u,1719735188u,138442752u,393216u}/* 2C56 */, /*9908*/{220288u,760u,3735553u,76808194u,1499176u,3768975392u,1719735196u,138442752u,393216u}/* 2C57 */, /*9909*/{220416u,760u,3735553u,76808194u,1499176u,3768975392u,1719735204u,138442752u,393216u}/* 2C58 */, /*9910*/{220544u,760u,3735553u,76808194u,1499176u,3768975392u,1719735212u,138442752u,393216u}/* 2C59 */, /*9911*/{220672u,760u,3735553u,76808194u,1499176u,3768975392u,1719735220u,138442752u,393216u}/* 2C5A */, /*9912*/{220800u,760u,3735553u,76808194u,1499176u,3768975392u,1719735228u,138442752u,393216u}/* 2C5B */, /*9913*/{220928u,760u,3735553u,76808194u,1499176u,3768975392u,1719735236u,138442752u,393216u}/* 2C5C */, /*9914*/{221056u,760u,3735553u,76808194u,1499176u,3768975392u,1719735244u,138442752u,393216u}/* 2C5D */, /*9915*/{221184u,760u,3735553u,76808194u,1499176u,3768975392u,1719735252u,138442752u,393216u}/* 2C5E */, /*9916*/{221312u,1725956864u,131073u,76840961u,1507368u,3807903776u,1711337324u,138491904u,2490368u}/* 2C60 */, /*9917*/{221440u,768u,131073u,76840962u,1499176u,3768975392u,1719725932u,138442752u,393216u}/* 2C61 */, /*9918*/{221568u,1728054016u,131073u,76840961u,1507368u,3807903776u,1711337332u,138491904u,2490368u}/* 2C62 */, /*9919*/{221696u,1730151168u,131073u,76840961u,1507368u,3807903776u,1711338436u,138491904u,2490368u}/* 2C63 */, /*9920*/{221824u,1732248320u,131073u,76840961u,1507368u,3807903776u,1711338996u,138491904u,2490368u}/* 2C64 */, /*9921*/{221952u,768u,131073u,76840962u,1499176u,3768975392u,1719723420u,138442752u,393216u}/* 2C65 */, /*9922*/{222080u,768u,131073u,76840962u,1499176u,3768975392u,1719728172u,138442752u,393216u}/* 2C66 */, /*9923*/{222208u,1734345472u,131073u,76840961u,1507368u,3807903776u,1711336580u,138491904u,2490368u}/* 2C67 */, /*9924*/{222336u,768u,131073u,76840962u,1499176u,3768975392u,1719725188u,138442752u,393216u}/* 2C68 */, /*9925*/{222464u,1736442624u,131073u,76840961u,1507368u,3807903776u,1711337140u,138491904u,2490368u}/* 2C69 */, /*9926*/{222592u,768u,131073u,76840962u,1499176u,3768975392u,1719725748u,138442752u,393216u}/* 2C6A */, /*9927*/{222720u,1738539776u,131073u,76840961u,1507368u,3807903776u,1711340828u,138491904u,2490368u}/* 2C6B */, /*9928*/{222848u,768u,131073u,76840962u,1499176u,3768975392u,1719729436u,138442752u,393216u}/* 2C6C */, /*9929*/{222976u,1740636928u,131073u,76873729u,1507368u,3807903776u,1711334884u,138491904u,2490368u}/* 2C6D */, /*9930*/{223104u,1742734080u,131073u,76873729u,1507368u,3807903776u,1711337668u,138491904u,2490368u}/* 2C6E */, /*9931*/{223232u,1744831232u,131073u,76873729u,1507368u,3807903776u,1711334852u,138491904u,2490368u}/* 2C6F */, /*9932*/{223360u,1746928384u,131073u,76906497u,1507368u,3807903776u,1711334932u,138491904u,2490368u}/* 2C70 */, /*9933*/{0,768u,131073u,76873730u,1499176u,3766485024u,1719728812u,138442752u,393216u}/* 2C71 */, /*9934*/{223488u,1749025536u,131073u,76873729u,1507368u,3807903776u,1711340300u,138491904u,2490368u}/* 2C72 */, /*9935*/{223616u,768u,131073u,76873730u,1499176u,3768975392u,1719728908u,138442752u,393216u}/* 2C73 */, /*9936*/{0,768u,131073u,76840962u,1499176u,3766485024u,1719728820u,138442752u,393216u}/* 2C74 */, /*9937*/{223744u,1751122688u,131073u,76840961u,1507368u,3807903776u,1711336588u,138491904u,2490368u}/* 2C75 */, /*9938*/{223872u,768u,131073u,76840962u,1499176u,3768975392u,1719725196u,138442752u,393216u}/* 2C76 */, /*9939*/{0,768u,131073u,76840962u,1499176u,3766485024u,1719727164u,138442752u,393216u}/* 2C77 */, /*9940*/{0,768u,131073u,76873730u,1499176u,3766485024u,1719724276u,138442752u,393216u}/* 2C78 */, /*9941*/{0,768u,131073u,76873730u,1499176u,3766485024u,1719727564u,138442752u,393216u}/* 2C79 */, /*9942*/{0,768u,131073u,76873730u,1499176u,3766485024u,1719726876u,138442752u,393216u}/* 2C7A */, /*9943*/{0,768u,131073u,76873730u,1499176u,3766485024u,1719724316u,138442752u,393216u}/* 2C7B */, /*9944*/{755499008u,768u,131073u,76874084u,1499168u,3783786528u,1686171036u,138596368u,17170432u}/* 2C7C */, /*9945*/{756023296u,768u,131073u,76874052u,1499168u,3783786528u,1686174292u,138661904u,393216u}/* 2C7D */, /*9946*/{224000u,1753219840u,131073u,76906497u,1507368u,3807903776u,1711339292u,138491904u,2490368u}/* 2C7E */, /*9947*/{224128u,1755316992u,131073u,76906497u,1507368u,3807903776u,1711340796u,138491904u,2490368u}/* 2C7F */, /*9948*/{224256u,1757414152u,3604481u,76808193u,1507368u,3807903776u,1711342188u,138491904u,2490368u}/* 2C80 */, /*9949*/{224384u,776u,3604481u,76808194u,1499176u,3768975392u,1719730796u,138442752u,393216u}/* 2C81 */, /*9950*/{224512u,1759511304u,3604481u,76808193u,1507368u,3807903776u,1711342196u,138491904u,2490368u}/* 2C82 */, /*9951*/{224640u,776u,3604481u,76808194u,1499176u,3768975392u,1719730804u,138442752u,393216u}/* 2C83 */, /*9952*/{224768u,1761608456u,3604481u,76808193u,1507368u,3807903776u,1711342204u,138491904u,2490368u}/* 2C84 */, /*9953*/{224896u,776u,3604481u,76808194u,1499176u,3768975392u,1719730812u,138442752u,393216u}/* 2C85 */, /*9954*/{225024u,1763705608u,3604481u,76808193u,1507368u,3807903776u,1711342212u,138491904u,2490368u}/* 2C86 */, /*9955*/{225152u,776u,3604481u,76808194u,1499176u,3768975392u,1719730820u,138442752u,393216u}/* 2C87 */, /*9956*/{225280u,1765802760u,3604481u,76808193u,1507368u,3807903776u,1711342220u,138491904u,2490368u}/* 2C88 */, /*9957*/{225408u,776u,3604481u,76808194u,1499176u,3768975392u,1719730828u,138442752u,393216u}/* 2C89 */, /*9958*/{225536u,1767899912u,3604481u,76808193u,1507368u,3807903776u,1711342236u,138491904u,2490368u}/* 2C8A */, /*9959*/{225664u,776u,3604481u,76808194u,1499176u,3768975392u,1719730844u,138442752u,393216u}/* 2C8B */, /*9960*/{225792u,1769997064u,3604481u,76808193u,1507368u,3807903776u,1711342244u,138491904u,2490368u}/* 2C8C */, /*9961*/{225920u,776u,3604481u,76808194u,1499176u,3768975392u,1719730852u,138442752u,393216u}/* 2C8D */, /*9962*/{226048u,1772094216u,3604481u,76808193u,1507368u,3807903776u,1711342252u,138491904u,2490368u}/* 2C8E */, /*9963*/{226176u,776u,3604481u,76808194u,1499176u,3768975392u,1719730860u,138442752u,393216u}/* 2C8F */, /*9964*/{226304u,1774191368u,3604481u,76808193u,1507368u,3807903776u,1711342260u,138491904u,2490368u}/* 2C90 */, /*9965*/{226432u,776u,3604481u,76808194u,1499176u,3768975392u,1719730868u,138442752u,393216u}/* 2C91 */, /*9966*/{226560u,1776288520u,3604481u,76808193u,1507368u,3807903776u,1711342268u,138491904u,2490368u}/* 2C92 */, /*9967*/{226688u,776u,3604481u,76808194u,1499176u,3768975392u,1719730876u,138442752u,393216u}/* 2C93 */, /*9968*/{226816u,1778385672u,3604481u,76808193u,1507368u,3807903776u,1711342276u,138491904u,2490368u}/* 2C94 */, /*9969*/{226944u,776u,3604481u,76808194u,1499176u,3768975392u,1719730884u,138442752u,393216u}/* 2C95 */, /*9970*/{227072u,1780482824u,3604481u,76808193u,1507368u,3807903776u,1711342292u,138491904u,2490368u}/* 2C96 */, /*9971*/{227200u,776u,3604481u,76808194u,1499176u,3768975392u,1719730900u,138442752u,393216u}/* 2C97 */, /*9972*/{227328u,1782579976u,3604481u,76808193u,1507368u,3807903776u,1711342300u,138491904u,2490368u}/* 2C98 */, /*9973*/{227456u,776u,3604481u,76808194u,1499176u,3768975392u,1719730908u,138442752u,393216u}/* 2C99 */, /*9974*/{227584u,1784677128u,3604481u,76808193u,1507368u,3807903776u,1711342308u,138491904u,2490368u}/* 2C9A */, /*9975*/{227712u,776u,3604481u,76808194u,1499176u,3768975392u,1719730916u,138442752u,393216u}/* 2C9B */, /*9976*/{227840u,1786774280u,3604481u,76808193u,1507368u,3807903776u,1711342332u,138491904u,2490368u}/* 2C9C */, /*9977*/{227968u,776u,3604481u,76808194u,1499176u,3768975392u,1719730940u,138442752u,393216u}/* 2C9D */, /*9978*/{228096u,1788871432u,3604481u,76808193u,1507368u,3807903776u,1711342340u,138491904u,2490368u}/* 2C9E */, /*9979*/{228224u,776u,3604481u,76808194u,1499176u,3768975392u,1719730948u,138442752u,393216u}/* 2C9F */, /*9980*/{228352u,1790968584u,3604481u,76808193u,1507368u,3807903776u,1711342348u,138491904u,2490368u}/* 2CA0 */, /*9981*/{228480u,776u,3604481u,76808194u,1499176u,3768975392u,1719730956u,138442752u,393216u}/* 2CA1 */, /*9982*/{228608u,1793065736u,3604481u,76808193u,1507368u,3807903776u,1711342356u,138491904u,2490368u}/* 2CA2 */, /*9983*/{228736u,776u,3604481u,76808194u,1499176u,3768975392u,1719730964u,138442752u,393216u}/* 2CA3 */, /*9984*/{228864u,1795162888u,3604481u,76808193u,1507368u,3807903776u,1711342364u,138491904u,2490368u}/* 2CA4 */, /*9985*/{228992u,776u,3604481u,76808194u,1499176u,3768975392u,1719730972u,138442752u,393216u}/* 2CA5 */, /*9986*/{229120u,1797260040u,3604481u,76808193u,1507368u,3807903776u,1711342372u,138491904u,2490368u}/* 2CA6 */, /*9987*/{229248u,776u,3604481u,76808194u,1499176u,3768975392u,1719730980u,138442752u,393216u}/* 2CA7 */, /*9988*/{229376u,1799357192u,3604481u,76808193u,1507368u,3807903776u,1711342380u,138491904u,2490368u}/* 2CA8 */, /*9989*/{229504u,776u,3604481u,76808194u,1499176u,3768975392u,1719730988u,138442752u,393216u}/* 2CA9 */, /*9990*/{229632u,1801454344u,3604481u,76808193u,1507368u,3807903776u,1711342388u,138491904u,2490368u}/* 2CAA */, /*9991*/{229760u,776u,3604481u,76808194u,1499176u,3768975392u,1719730996u,138442752u,393216u}/* 2CAB */, /*9992*/{229888u,1803551496u,3604481u,76808193u,1507368u,3807903776u,1711342396u,138491904u,2490368u}/* 2CAC */, /*9993*/{230016u,776u,3604481u,76808194u,1499176u,3768975392u,1719731004u,138442752u,393216u}/* 2CAD */, /*9994*/{230144u,1805648648u,3604481u,76808193u,1507368u,3807903776u,1711342404u,138491904u,2490368u}/* 2CAE */, /*9995*/{230272u,776u,3604481u,76808194u,1499176u,3768975392u,1719731012u,138442752u,393216u}/* 2CAF */, /*9996*/{230400u,1807745800u,3604481u,76808193u,1507368u,3807903776u,1711342412u,138491904u,2490368u}/* 2CB0 */, /*9997*/{230528u,776u,3604481u,76808194u,1499176u,3768975392u,1719731020u,138442752u,393216u}/* 2CB1 */, /*9998*/{230656u,1809842952u,3604481u,76808193u,1507368u,3807903776u,1711342628u,138491904u,2490368u}/* 2CB2 */, /*9999*/{230784u,776u,3604481u,76808194u,1499176u,3768975392u,1719731236u,138442752u,393216u}/* 2CB3 */, /*10000*/{230912u,1811940104u,3604481u,76808193u,1507368u,3807903776u,1711342636u,138491904u,2490368u}/* 2CB4 */, /*10001*/{231040u,776u,3604481u,76808194u,1499176u,3768975392u,1719731244u,138442752u,393216u}/* 2CB5 */, /*10002*/{231168u,1814037256u,3604481u,76808193u,1507368u,3807903776u,1711342228u,138491904u,2490368u}/* 2CB6 */, /*10003*/{231296u,776u,3604481u,76808194u,1499176u,3768975392u,1719730836u,138442752u,393216u}/* 2CB7 */, /*10004*/{231424u,1816134408u,3604481u,76808193u,1507368u,3807903776u,1711342284u,138491904u,2490368u}/* 2CB8 */, /*10005*/{231552u,776u,3604481u,76808194u,1499176u,3768975392u,1719730892u,138442752u,393216u}/* 2CB9 */, /*10006*/{231680u,1818231560u,3604481u,76808193u,1507368u,3807903776u,1711342316u,138491904u,2490368u}/* 2CBA */, /*10007*/{231808u,776u,3604481u,76808194u,1499176u,3768975392u,1719730924u,138442752u,393216u}/* 2CBB */, /*10008*/{231936u,1820328712u,3604481u,76808193u,1507368u,3807903776u,1711342324u,138491904u,2490368u}/* 2CBC */, /*10009*/{232064u,776u,3604481u,76808194u,1499176u,3768975392u,1719730932u,138442752u,393216u}/* 2CBD */, /*10010*/{232192u,1822425864u,3604481u,76808193u,1507368u,3807903776u,1711342420u,138491904u,2490368u}/* 2CBE */, /*10011*/{232320u,776u,3604481u,76808194u,1499176u,3768975392u,1719731028u,138442752u,393216u}/* 2CBF */, /*10012*/{232448u,1824523016u,3604481u,76808193u,1507368u,3807903776u,1711342428u,138491904u,2490368u}/* 2CC0 */, /*10013*/{232576u,776u,3604481u,76808194u,1499176u,3768975392u,1719731036u,138442752u,393216u}/* 2CC1 */, /*10014*/{232704u,1826620168u,3604481u,76808193u,1507368u,3807903776u,1711342452u,138491904u,2490368u}/* 2CC2 */, /*10015*/{232832u,776u,3604481u,76808194u,1499176u,3768975392u,1719731060u,138442752u,393216u}/* 2CC3 */, /*10016*/{232960u,1828717320u,3604481u,76808193u,1507368u,3807903776u,1711342460u,138491904u,2490368u}/* 2CC4 */, /*10017*/{233088u,776u,3604481u,76808194u,1499176u,3768975392u,1719731068u,138442752u,393216u}/* 2CC5 */, /*10018*/{233216u,1830814472u,3604481u,76808193u,1507368u,3807903776u,1711342468u,138491904u,2490368u}/* 2CC6 */, /*10019*/{233344u,776u,3604481u,76808194u,1499176u,3768975392u,1719731076u,138442752u,393216u}/* 2CC7 */, /*10020*/{233472u,1832911624u,3604481u,76808193u,1507368u,3807903776u,1711342500u,138491904u,2490368u}/* 2CC8 */, /*10021*/{233600u,776u,3604481u,76808194u,1499176u,3768975392u,1719731108u,138442752u,393216u}/* 2CC9 */, /*10022*/{233728u,1835008776u,3604481u,76808193u,1507368u,3807903776u,1711342516u,138491904u,2490368u}/* 2CCA */, /*10023*/{233856u,776u,3604481u,76808194u,1499176u,3768975392u,1719731124u,138442752u,393216u}/* 2CCB */, /*10024*/{233984u,1837105928u,3604481u,76808193u,1507368u,3807903776u,1711342524u,138491904u,2490368u}/* 2CCC */, /*10025*/{234112u,776u,3604481u,76808194u,1499176u,3768975392u,1719731132u,138442752u,393216u}/* 2CCD */, /*10026*/{234240u,1839203080u,3604481u,76808193u,1507368u,3807903776u,1711342532u,138491904u,2490368u}/* 2CCE */, /*10027*/{234368u,776u,3604481u,76808194u,1499176u,3768975392u,1719731140u,138442752u,393216u}/* 2CCF */, /*10028*/{234496u,1841300232u,3604481u,76808193u,1507368u,3807903776u,1711342540u,138491904u,2490368u}/* 2CD0 */, /*10029*/{234624u,776u,3604481u,76808194u,1499176u,3768975392u,1719731148u,138442752u,393216u}/* 2CD1 */, /*10030*/{234752u,1843397384u,3604481u,76808193u,1507368u,3807903776u,1711342548u,138491904u,2490368u}/* 2CD2 */, /*10031*/{234880u,776u,3604481u,76808194u,1499176u,3768975392u,1719731156u,138442752u,393216u}/* 2CD3 */, /*10032*/{235008u,1845494536u,3604481u,76808193u,1507368u,3807903776u,1711342556u,138491904u,2490368u}/* 2CD4 */, /*10033*/{235136u,776u,3604481u,76808194u,1499176u,3768975392u,1719731164u,138442752u,393216u}/* 2CD5 */, /*10034*/{235264u,1847591688u,3604481u,76808193u,1507368u,3807903776u,1711342580u,138491904u,2490368u}/* 2CD6 */, /*10035*/{235392u,776u,3604481u,76808194u,1499176u,3768975392u,1719731188u,138442752u,393216u}/* 2CD7 */, /*10036*/{235520u,1849688840u,3604481u,76808193u,1507368u,3807903776u,1711342596u,138491904u,2490368u}/* 2CD8 */, /*10037*/{235648u,776u,3604481u,76808194u,1499176u,3768975392u,1719731204u,138442752u,393216u}/* 2CD9 */, /*10038*/{235776u,1851785992u,3604481u,76808193u,1507368u,3807903776u,1711342604u,138491904u,2490368u}/* 2CDA */, /*10039*/{235904u,776u,3604481u,76808194u,1499176u,3768975392u,1719731212u,138442752u,393216u}/* 2CDB */, /*10040*/{236032u,1853883144u,3604481u,76808193u,1507368u,3807903776u,1711342612u,138491904u,2490368u}/* 2CDC */, /*10041*/{236160u,776u,3604481u,76808194u,1499176u,3768975392u,1719731220u,138442752u,393216u}/* 2CDD */, /*10042*/{236288u,1855980296u,3604481u,76808193u,1507368u,3807903776u,1711342644u,138491904u,2490368u}/* 2CDE */, /*10043*/{236416u,776u,3604481u,76808194u,1499176u,3768975392u,1719731252u,138442752u,393216u}/* 2CDF */, /*10044*/{236544u,1858077448u,3604481u,76808193u,1507368u,3807903776u,1711342652u,138491904u,2490368u}/* 2CE0 */, /*10045*/{236672u,776u,3604481u,76808194u,1499176u,3768975392u,1719731260u,138442752u,393216u}/* 2CE1 */, /*10046*/{236800u,1860174600u,3604481u,76808193u,1507368u,3807903776u,1711342660u,138491904u,2490368u}/* 2CE2 */, /*10047*/{236928u,776u,3604481u,76808194u,1499176u,3768975392u,1719731268u,138442752u,393216u}/* 2CE3 */, /*10048*/{0,776u,3604481u,76808194u,1499176u,3766485024u,1719863252u,406960128u,393216u}/* 2CE4 */, /*10049*/{0,776u,3604481u,76818459u,40u,1610612768u,28028u,138442752u,67108864u}/* 2CE5 */, /*10050*/{0,776u,3604481u,76818459u,40u,1610612768u,28036u,138442752u,67108864u}/* 2CE6 */, /*10051*/{0,776u,3604481u,76818459u,40u,1610612768u,28044u,138442752u,67108864u}/* 2CE7 */, /*10052*/{0,776u,3604481u,76818459u,40u,1610612768u,28052u,138442752u,67108864u}/* 2CE8 */, /*10053*/{0,776u,3604481u,76818459u,40u,1610612768u,28060u,138442752u,67108864u}/* 2CE9 */, /*10054*/{0,776u,3604481u,76818459u,40u,1610612768u,28068u,138442752u,67108864u}/* 2CEA */, /*10055*/{237056u,1862271752u,3604481u,76906497u,1507368u,3807903776u,1711342444u,138491904u,2490368u}/* 2CEB */, /*10056*/{237184u,776u,3604481u,76906498u,1499176u,3768975392u,1719731052u,138442752u,393216u}/* 2CEC */, /*10057*/{237312u,1864368904u,3604481u,76906497u,1507368u,3807903776u,1711342572u,138491904u,2490368u}/* 2CED */, /*10058*/{237440u,776u,3604481u,76906498u,1499176u,3768975392u,1719731180u,138442752u,393216u}/* 2CEE */, /*10059*/{0,776u,3604481u,3423973382u,672030728u,1627398160u,1077936140u,218134528u,262144u}/* 2CEF */, /*10060*/{0,776u,3604481u,3423973382u,672030728u,1627398160u,1077936140u,151025664u,262144u}/* 2CF0 */, /*10061*/{0,776u,3604481u,3423973382u,672030728u,1627398160u,1077936140u,146831360u,262144u}/* 2CF1 */, /*10062*/{237568u,1866466056u,3604481u,76972033u,1507368u,3807903776u,1711342492u,138491904u,2490368u}/* 2CF2 */, /*10063*/{237696u,776u,3604481u,76972034u,1499176u,3768975392u,1719731100u,138442752u,393216u}/* 2CF3 */, /*10064*/{0,776u,3604481u,74721303u,40u,1610612768u,5148u,138442754u,0}/* 2CF9 */, /*10065*/{0,776u,3604481u,69478423u,40u,1610612768u,4996u,138442754u,0}/* 2CFA */, /*10066*/{0,776u,3604481u,69478423u,40u,1610612768u,5004u,138442754u,0}/* 2CFB */, /*10067*/{0,776u,3604481u,69478423u,40u,1610612768u,6084u,138442754u,0}/* 2CFC */, /*10068*/{0,776u,372704769u,76818443u,4194346u,1610612768u,55869u,138442752u,0}/* 2CFD */, /*10069*/{0,776u,3604481u,74721303u,40u,1610612768u,5156u,138442754u,0}/* 2CFE */, /*10070*/{0,776u,3604481u,69478423u,40u,1610612768u,6092u,138442754u,0}/* 2CFF */, /*10071*/{237824u,784u,1572865u,76808194u,1499176u,3768975392u,1719735572u,138442752u,393216u}/* 2D00 */, /*10072*/{237952u,784u,1572865u,76808194u,1499176u,3768975392u,1719735588u,138442752u,393216u}/* 2D01 */, /*10073*/{238080u,784u,1572865u,76808194u,1499176u,3768975392u,1719735604u,138442752u,393216u}/* 2D02 */, /*10074*/{238208u,784u,1572865u,76808194u,1499176u,3768975392u,1719735620u,138442752u,393216u}/* 2D03 */, /*10075*/{238336u,784u,1572865u,76808194u,1499176u,3768975392u,1719735636u,138442752u,393216u}/* 2D04 */, /*10076*/{238464u,784u,1572865u,76808194u,1499176u,3768975392u,1719735652u,138442752u,393216u}/* 2D05 */, /*10077*/{238592u,784u,1572865u,76808194u,1499176u,3768975392u,1719735668u,138442752u,393216u}/* 2D06 */, /*10078*/{238720u,784u,1572865u,76808194u,1499176u,3768975392u,1719735700u,138442752u,393216u}/* 2D07 */, /*10079*/{238848u,784u,1572865u,76808194u,1499176u,3768975392u,1719735716u,138442752u,393216u}/* 2D08 */, /*10080*/{238976u,784u,1572865u,76808194u,1499176u,3768975392u,1719735732u,138442752u,393216u}/* 2D09 */, /*10081*/{239104u,784u,1572865u,76808194u,1499176u,3768975392u,1719735748u,138442752u,393216u}/* 2D0A */, /*10082*/{239232u,784u,1572865u,76808194u,1499176u,3768975392u,1719735764u,138442752u,393216u}/* 2D0B */, /*10083*/{239360u,784u,1572865u,76808194u,1499176u,3768975392u,1719735780u,138442752u,393216u}/* 2D0C */, /*10084*/{239488u,784u,1572865u,76808194u,1499176u,3768975392u,1719735812u,138442752u,393216u}/* 2D0D */, /*10085*/{239616u,784u,1572865u,76808194u,1499176u,3768975392u,1719735828u,138442752u,393216u}/* 2D0E */, /*10086*/{239744u,784u,1572865u,76808194u,1499176u,3768975392u,1719735844u,138442752u,393216u}/* 2D0F */, /*10087*/{239872u,784u,1572865u,76808194u,1499176u,3768975392u,1719735860u,138442752u,393216u}/* 2D10 */, /*10088*/{240000u,784u,1572865u,76808194u,1499176u,3768975392u,1719735876u,138442752u,393216u}/* 2D11 */, /*10089*/{240128u,784u,1572865u,76808194u,1499176u,3768975392u,1719735892u,138442752u,393216u}/* 2D12 */, /*10090*/{240256u,784u,1572865u,76808194u,1499176u,3768975392u,1719735924u,138442752u,393216u}/* 2D13 */, /*10091*/{240384u,784u,1572865u,76808194u,1499176u,3768975392u,1719735940u,138442752u,393216u}/* 2D14 */, /*10092*/{240512u,784u,1572865u,76808194u,1499176u,3768975392u,1719735956u,138442752u,393216u}/* 2D15 */, /*10093*/{240640u,784u,1572865u,76808194u,1499176u,3768975392u,1719735972u,138442752u,393216u}/* 2D16 */, /*10094*/{240768u,784u,1572865u,76808194u,1499176u,3768975392u,1719735988u,138442752u,393216u}/* 2D17 */, /*10095*/{240896u,784u,1572865u,76808194u,1499176u,3768975392u,1719736004u,138442752u,393216u}/* 2D18 */, /*10096*/{241024u,784u,1572865u,76808194u,1499176u,3768975392u,1719736020u,138442752u,393216u}/* 2D19 */, /*10097*/{241152u,784u,1572865u,76808194u,1499176u,3768975392u,1719736036u,138442752u,393216u}/* 2D1A */, /*10098*/{241280u,784u,1572865u,76808194u,1499176u,3768975392u,1719736052u,138442752u,393216u}/* 2D1B */, /*10099*/{241408u,784u,1572865u,76808194u,1499176u,3768975392u,1719736068u,138442752u,393216u}/* 2D1C */, /*10100*/{241536u,784u,1572865u,76808194u,1499176u,3768975392u,1719736084u,138442752u,393216u}/* 2D1D */, /*10101*/{241664u,784u,1572865u,76808194u,1499176u,3768975392u,1719736100u,138442752u,393216u}/* 2D1E */, /*10102*/{241792u,784u,1572865u,76808194u,1499176u,3768975392u,1719736132u,138442752u,393216u}/* 2D1F */, /*10103*/{241920u,784u,1572865u,76808194u,1499176u,3768975392u,1719736148u,138442752u,393216u}/* 2D20 */, /*10104*/{242048u,784u,1572865u,76808194u,1499176u,3768975392u,1719735684u,138442752u,393216u}/* 2D21 */, /*10105*/{242176u,784u,1572865u,76808194u,1499176u,3768975392u,1719735796u,138442752u,393216u}/* 2D22 */, /*10106*/{242304u,784u,1572865u,76808194u,1499176u,3768975392u,1719735908u,138442752u,393216u}/* 2D23 */, /*10107*/{242432u,784u,1572865u,76808194u,1499176u,3768975392u,1719736116u,138442752u,393216u}/* 2D24 */, /*10108*/{242560u,784u,1572865u,76808194u,1499176u,3768975392u,1719736164u,138442752u,393216u}/* 2D25 */, /*10109*/{242688u,784u,1572865u,76972034u,1499176u,3768975392u,1719736188u,138442752u,393216u}/* 2D27 */, /*10110*/{242816u,784u,1572865u,76972034u,1499176u,3768975392u,1719736228u,138442752u,393216u}/* 2D2D */, /*10111*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677796988u,138442752u,393216u}/* 2D30 */, /*10112*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677796996u,138442752u,393216u}/* 2D31 */, /*10113*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797004u,138442752u,393216u}/* 2D32 */, /*10114*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797012u,138442752u,393216u}/* 2D33 */, /*10115*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797020u,138442752u,393216u}/* 2D34 */, /*10116*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797028u,138442752u,393216u}/* 2D35 */, /*10117*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797036u,138442752u,393216u}/* 2D36 */, /*10118*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797044u,138442752u,393216u}/* 2D37 */, /*10119*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797052u,138442752u,393216u}/* 2D38 */, /*10120*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797060u,138442752u,393216u}/* 2D39 */, /*10121*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797068u,138442752u,393216u}/* 2D3A */, /*10122*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797076u,138442752u,393216u}/* 2D3B */, /*10123*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797092u,138442752u,393216u}/* 2D3C */, /*10124*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797100u,138442752u,393216u}/* 2D3D */, /*10125*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797108u,138442752u,393216u}/* 2D3E */, /*10126*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797116u,138442752u,393216u}/* 2D3F */, /*10127*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797124u,138442752u,393216u}/* 2D40 */, /*10128*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797132u,138442752u,393216u}/* 2D41 */, /*10129*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797140u,138442752u,393216u}/* 2D42 */, /*10130*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797148u,138442752u,393216u}/* 2D43 */, /*10131*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797156u,138442752u,393216u}/* 2D44 */, /*10132*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797164u,138442752u,393216u}/* 2D45 */, /*10133*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797172u,138442752u,393216u}/* 2D46 */, /*10134*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797180u,138442752u,393216u}/* 2D47 */, /*10135*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797188u,138442752u,393216u}/* 2D48 */, /*10136*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797196u,138442752u,393216u}/* 2D49 */, /*10137*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797204u,138442752u,393216u}/* 2D4A */, /*10138*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797212u,138442752u,393216u}/* 2D4B */, /*10139*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797220u,138442752u,393216u}/* 2D4C */, /*10140*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797228u,138442752u,393216u}/* 2D4D */, /*10141*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797236u,138442752u,393216u}/* 2D4E */, /*10142*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797244u,138442752u,393216u}/* 2D4F */, /*10143*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797252u,138442752u,393216u}/* 2D50 */, /*10144*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797260u,138442752u,393216u}/* 2D51 */, /*10145*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797268u,138442752u,393216u}/* 2D52 */, /*10146*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797276u,138442752u,393216u}/* 2D53 */, /*10147*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797292u,138442752u,393216u}/* 2D54 */, /*10148*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797300u,138442752u,393216u}/* 2D55 */, /*10149*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797308u,138442752u,393216u}/* 2D56 */, /*10150*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797316u,138442752u,393216u}/* 2D57 */, /*10151*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797324u,138442752u,393216u}/* 2D58 */, /*10152*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797332u,138442752u,393216u}/* 2D59 */, /*10153*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797340u,138442752u,393216u}/* 2D5A */, /*10154*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797348u,138442752u,393216u}/* 2D5B */, /*10155*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797356u,138442752u,393216u}/* 2D5C */, /*10156*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797364u,138442752u,393216u}/* 2D5D */, /*10157*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797372u,138442752u,393216u}/* 2D5E */, /*10158*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797380u,138442752u,393216u}/* 2D5F */, /*10159*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797388u,138442752u,393216u}/* 2D60 */, /*10160*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797396u,138442752u,393216u}/* 2D61 */, /*10161*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797404u,138442752u,393216u}/* 2D62 */, /*10162*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797412u,138442752u,393216u}/* 2D63 */, /*10163*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797420u,138442752u,393216u}/* 2D64 */, /*10164*/{0,792u,3801089u,76808197u,1515560u,3758096416u,1677797428u,138442752u,393216u}/* 2D65 */, /*10165*/{0,792u,3801089u,76972037u,1515560u,3758096416u,1677797084u,138442752u,393216u}/* 2D66 */, /*10166*/{0,792u,3801089u,76972037u,1515560u,3758096416u,1677797284u,138442752u,393216u}/* 2D67 */, /*10167*/{756547584u,792u,3801089u,76808516u,1515552u,3775397920u,1677797436u,138440704u,393216u}/* 2D6F */, /*10168*/{0,792u,3801089u,69599255u,40u,1610612768u,8692u,138442754u,0}/* 2D70 */, /*10169*/{0,792u,3801089u,336998406u,672030728u,1627389976u,1077936140u,4208640u,262144u}/* 2D7F */, /*10170*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677797572u,138442752u,393216u}/* 2D80 */, /*10171*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677797740u,138442752u,393216u}/* 2D81 */, /*10172*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677797876u,138442752u,393216u}/* 2D82 */, /*10173*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677797948u,138442752u,393216u}/* 2D83 */, /*10174*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677798068u,138442752u,393216u}/* 2D84 */, /*10175*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677798372u,138442752u,393216u}/* 2D85 */, /*10176*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677798508u,138442752u,393216u}/* 2D86 */, /*10177*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677798580u,138442752u,393216u}/* 2D87 */, /*10178*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677798756u,138442752u,393216u}/* 2D88 */, /*10179*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677798828u,138442752u,393216u}/* 2D89 */, /*10180*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677798900u,138442752u,393216u}/* 2D8A */, /*10181*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677799292u,138442752u,393216u}/* 2D8B */, /*10182*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677799540u,138442752u,393216u}/* 2D8C */, /*10183*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677799660u,138442752u,393216u}/* 2D8D */, /*10184*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677799732u,138442752u,393216u}/* 2D8E */, /*10185*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800004u,138442752u,393216u}/* 2D8F */, /*10186*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800076u,138442752u,393216u}/* 2D90 */, /*10187*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800204u,138442752u,393216u}/* 2D91 */, /*10188*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800588u,138442752u,393216u}/* 2D92 */, /*10189*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677799908u,138442752u,393216u}/* 2D93 */, /*10190*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677799916u,138442752u,393216u}/* 2D94 */, /*10191*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677799924u,138442752u,393216u}/* 2D95 */, /*10192*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677799932u,138442752u,393216u}/* 2D96 */, /*10193*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800620u,138442752u,393216u}/* 2DA0 */, /*10194*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800628u,138442752u,393216u}/* 2DA1 */, /*10195*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800636u,138442752u,393216u}/* 2DA2 */, /*10196*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800644u,138442752u,393216u}/* 2DA3 */, /*10197*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800652u,138442752u,393216u}/* 2DA4 */, /*10198*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800660u,138442752u,393216u}/* 2DA5 */, /*10199*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800668u,138442752u,393216u}/* 2DA6 */, /*10200*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800676u,138442752u,393216u}/* 2DA8 */, /*10201*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800684u,138442752u,393216u}/* 2DA9 */, /*10202*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800692u,138442752u,393216u}/* 2DAA */, /*10203*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800700u,138442752u,393216u}/* 2DAB */, /*10204*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800708u,138442752u,393216u}/* 2DAC */, /*10205*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800716u,138442752u,393216u}/* 2DAD */, /*10206*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800724u,138442752u,393216u}/* 2DAE */, /*10207*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800732u,138442752u,393216u}/* 2DB0 */, /*10208*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800740u,138442752u,393216u}/* 2DB1 */, /*10209*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800748u,138442752u,393216u}/* 2DB2 */, /*10210*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800756u,138442752u,393216u}/* 2DB3 */, /*10211*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800764u,138442752u,393216u}/* 2DB4 */, /*10212*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800772u,138442752u,393216u}/* 2DB5 */, /*10213*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800780u,138442752u,393216u}/* 2DB6 */, /*10214*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800788u,138442752u,393216u}/* 2DB8 */, /*10215*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800796u,138442752u,393216u}/* 2DB9 */, /*10216*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800804u,138442752u,393216u}/* 2DBA */, /*10217*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800812u,138442752u,393216u}/* 2DBB */, /*10218*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800820u,138442752u,393216u}/* 2DBC */, /*10219*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800828u,138442752u,393216u}/* 2DBD */, /*10220*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800836u,138442752u,393216u}/* 2DBE */, /*10221*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800844u,138442752u,393216u}/* 2DC0 */, /*10222*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800852u,138442752u,393216u}/* 2DC1 */, /*10223*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800860u,138442752u,393216u}/* 2DC2 */, /*10224*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800868u,138442752u,393216u}/* 2DC3 */, /*10225*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800876u,138442752u,393216u}/* 2DC4 */, /*10226*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800884u,138442752u,393216u}/* 2DC5 */, /*10227*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800892u,138442752u,393216u}/* 2DC6 */, /*10228*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800900u,138442752u,393216u}/* 2DC8 */, /*10229*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800908u,138442752u,393216u}/* 2DC9 */, /*10230*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800916u,138442752u,393216u}/* 2DCA */, /*10231*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800924u,138442752u,393216u}/* 2DCB */, /*10232*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800932u,138442752u,393216u}/* 2DCC */, /*10233*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800940u,138442752u,393216u}/* 2DCD */, /*10234*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800948u,138442752u,393216u}/* 2DCE */, /*10235*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800956u,138442752u,393216u}/* 2DD0 */, /*10236*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800964u,138442752u,393216u}/* 2DD1 */, /*10237*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800972u,138442752u,393216u}/* 2DD2 */, /*10238*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800980u,138442752u,393216u}/* 2DD3 */, /*10239*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800988u,138442752u,393216u}/* 2DD4 */, /*10240*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677800996u,138442752u,393216u}/* 2DD5 */, /*10241*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677801004u,138442752u,393216u}/* 2DD6 */, /*10242*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677801012u,138442752u,393216u}/* 2DD8 */, /*10243*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677801020u,138442752u,393216u}/* 2DD9 */, /*10244*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677801028u,138442752u,393216u}/* 2DDA */, /*10245*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677801036u,138442752u,393216u}/* 2DDB */, /*10246*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677801044u,138442752u,393216u}/* 2DDC */, /*10247*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677801052u,138442752u,393216u}/* 2DDD */, /*10248*/{0,800u,1703937u,76808197u,1515560u,3758096416u,1677801060u,138442752u,393216u}/* 2DDE */, /*10249*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078002860u,138459648u,262144u}/* 2DE0 */, /*10250*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078002892u,138459648u,262144u}/* 2DE1 */, /*10251*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078002924u,138459648u,262144u}/* 2DE2 */, /*10252*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078003084u,138459648u,262144u}/* 2DE3 */, /*10253*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078003276u,138459648u,262144u}/* 2DE4 */, /*10254*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078003356u,138459648u,262144u}/* 2DE5 */, /*10255*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078003692u,138459648u,262144u}/* 2DE6 */, /*10256*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078003900u,138459648u,262144u}/* 2DE7 */, /*10257*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078004052u,138459648u,262144u}/* 2DE8 */, /*10258*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078004124u,138459648u,262144u}/* 2DE9 */, /*10259*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078004340u,138459648u,262144u}/* 2DEA */, /*10260*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078004404u,138459648u,262144u}/* 2DEB */, /*10261*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078004508u,138459648u,262144u}/* 2DEC */, /*10262*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078004580u,138459648u,262144u}/* 2DED */, /*10263*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078004652u,138459648u,262144u}/* 2DEE */, /*10264*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078004940u,138459648u,262144u}/* 2DEF */, /*10265*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078005252u,138459648u,262144u}/* 2DF0 */, /*10266*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078005340u,138459648u,262144u}/* 2DF1 */, /*10267*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078005588u,138459648u,262144u}/* 2DF2 */, /*10268*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078005628u,138459648u,262144u}/* 2DF3 */, /*10269*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078006228u,138459648u,262144u}/* 2DF4 */, /*10270*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078073092u,272710144u,262144u}/* 2DF5 */, /*10271*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078002764u,138459648u,262144u}/* 2DF6 */, /*10272*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078003212u,138459648u,262144u}/* 2DF7 */, /*10273*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078003684u,138459648u,262144u}/* 2DF8 */, /*10274*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078004868u,138459648u,262144u}/* 2DF9 */, /*10275*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078005820u,138459648u,262144u}/* 2DFA */, /*10276*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078005892u,138459648u,262144u}/* 2DFB */, /*10277*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078005932u,138459648u,262144u}/* 2DFC */, /*10278*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078006012u,138459648u,262144u}/* 2DFD */, /*10279*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078006052u,138459648u,262144u}/* 2DFE */, /*10280*/{0,808u,262145u,3423940614u,672030728u,3774873616u,1078006132u,138459648u,262144u}/* 2DFF */, /*10281*/{0,816u,65537u,75769879u,106536u,1610612768u,7620u,138442755u,0}/* 2E00 */, /*10282*/{0,816u,65537u,75769879u,106536u,1610612768u,7628u,138442755u,0}/* 2E01 */, /*10283*/{0,1258288u,65537u,75769884u,106536u,1744830496u,6892u,138442755u,0}/* 2E02 */, /*10284*/{0,1262384u,65537u,75769885u,106536u,1744830496u,6900u,138442755u,0}/* 2E03 */, /*10285*/{0,1266480u,65537u,75769884u,106536u,1744830496u,6908u,138442755u,0}/* 2E04 */, /*10286*/{0,1270576u,65537u,75769885u,106536u,1744830496u,6916u,138442755u,0}/* 2E05 */, /*10287*/{0,816u,65537u,75769879u,106536u,1610612768u,7636u,138442755u,0}/* 2E06 */, /*10288*/{0,816u,65537u,75769879u,106536u,1610612768u,7644u,138442755u,0}/* 2E07 */, /*10289*/{0,816u,65537u,75769879u,106536u,1610612768u,7652u,138442755u,0}/* 2E08 */, /*10290*/{0,1274672u,65537u,75769884u,106536u,1744830496u,6924u,138442755u,0}/* 2E09 */, /*10291*/{0,1278768u,65537u,75769885u,106536u,1744830496u,6932u,138442755u,0}/* 2E0A */, /*10292*/{0,816u,65537u,75769879u,106536u,1610612768u,7660u,138442755u,0}/* 2E0B */, /*10293*/{0,1282864u,65537u,75769884u,106536u,1744830496u,6940u,138442755u,0}/* 2E0C */, /*10294*/{0,1286960u,65537u,75769885u,106536u,1744830496u,6948u,138442755u,0}/* 2E0D */, /*10295*/{0,816u,65537u,69478423u,40u,1610612768u,7668u,138442755u,0}/* 2E0E */, /*10296*/{0,816u,65537u,69478423u,40u,1610612768u,7676u,138442755u,0}/* 2E0F */, /*10297*/{0,816u,65537u,69478423u,40u,1610612768u,7684u,138442755u,0}/* 2E10 */, /*10298*/{0,816u,65537u,69478423u,40u,1610612768u,7692u,138442755u,0}/* 2E11 */, /*10299*/{0,816u,65537u,69478423u,40u,1610612768u,7700u,138442755u,0}/* 2E12 */, /*10300*/{0,816u,65537u,69478423u,40u,1610612768u,7708u,138442755u,0}/* 2E13 */, /*10301*/{0,816u,65537u,69478423u,40u,1610612768u,7716u,138442755u,0}/* 2E14 */, /*10302*/{0,816u,65537u,69478423u,40u,1610612768u,7724u,138442755u,0}/* 2E15 */, /*10303*/{0,816u,65537u,76818455u,40u,1610612768u,7732u,138442755u,0}/* 2E16 */, /*10304*/{0,816u,65537u,69478419u,40u,1610678306u,4332u,138442755u,0}/* 2E17 */, /*10305*/{0,816u,65537u,80029719u,40u,1610612768u,5060u,138442755u,0}/* 2E18 */, /*10306*/{0,816u,65537u,69543959u,40u,1610612768u,6100u,138442755u,0}/* 2E19 */, /*10307*/{0,816u,65537u,76883987u,40u,1610678304u,7740u,138442755u,0}/* 2E1A */, /*10308*/{0,816u,65537u,76883991u,40u,1610612768u,7748u,138442755u,0}/* 2E1B */, /*10309*/{0,1291056u,65537u,75769884u,106536u,1744830496u,6956u,138442755u,0}/* 2E1C */, /*10310*/{0,1295152u,65537u,75769885u,106536u,1744830496u,6964u,138442755u,0}/* 2E1D */, /*10311*/{0,816u,65537u,76883991u,40u,1610612768u,7756u,138442755u,0}/* 2E1E */, /*10312*/{0,816u,65537u,76883991u,40u,1610612768u,7764u,138442755u,0}/* 2E1F */, /*10313*/{0,1299248u,65537u,75835420u,106536u,1744830496u,6972u,138442755u,0}/* 2E20 */, /*10314*/{0,1303344u,65537u,75835421u,106536u,1744830496u,6980u,138442755u,0}/* 2E21 */, /*10315*/{0,1307440u,65537u,80029716u,106536u,1744830496u,6988u,138442755u,0}/* 2E22 */, /*10316*/{0,1311536u,65537u,86321173u,106536u,1744830496u,6996u,138442755u,0}/* 2E23 */, /*10317*/{0,1315632u,65537u,80029716u,106536u,1744830496u,7004u,138442755u,0}/* 2E24 */, /*10318*/{0,1319728u,65537u,86321173u,106536u,1744830496u,7012u,138442755u,0}/* 2E25 */, /*10319*/{0,1323824u,65537u,80029716u,106536u,1744830496u,7020u,138442755u,0}/* 2E26 */, /*10320*/{0,1327920u,65537u,86321173u,106536u,1744830496u,7028u,138442755u,0}/* 2E27 */, /*10321*/{0,1332016u,65537u,80029716u,106536u,1744830496u,7036u,138442755u,0}/* 2E28 */, /*10322*/{0,1336112u,65537u,86321173u,106536u,1744830496u,7044u,138442755u,0}/* 2E29 */, /*10323*/{0,816u,65537u,69543959u,40u,1610612768u,6044u,138442755u,0}/* 2E2A */, /*10324*/{0,816u,65537u,69543959u,40u,1610612768u,6052u,138442755u,0}/* 2E2B */, /*10325*/{0,816u,65537u,69543959u,40u,1610612768u,6060u,138442755u,0}/* 2E2C */, /*10326*/{0,816u,65537u,69543959u,40u,1610612768u,6068u,138442755u,0}/* 2E2D */, /*10327*/{0,816u,65537u,74786839u,98344u,1610612768u,4948u,138442755u,41943040u}/* 2E2E */, /*10328*/{0,816u,65537u,76883972u,1515560u,3774881824u,67178404u,138442753u,0}/* 2E2F */, /*10329*/{0,816u,65537u,69543959u,40u,1610612768u,5164u,138442755u,0}/* 2E30 */, /*10330*/{0,816u,65537u,69576727u,40u,1610612768u,5236u,138442755u,0}/* 2E31 */, /*10331*/{0,816u,65537u,76982295u,40u,1610612768u,4396u,138442755u,0}/* 2E32 */, /*10332*/{0,816u,65537u,69642263u,40u,1610612768u,5244u,138442755u,0}/* 2E33 */, /*10333*/{0,816u,65537u,69642263u,40u,1610612768u,4388u,138442755u,0}/* 2E34 */, /*10334*/{0,816u,65537u,76982295u,40u,1610612768u,4548u,138442755u,0}/* 2E35 */, /*10335*/{0,816u,65537u,76982295u,40u,1610612768u,7452u,138442755u,0}/* 2E36 */, /*10336*/{0,816u,65537u,76982295u,40u,1610612768u,7460u,138442755u,0}/* 2E37 */, /*10337*/{0,816u,65537u,76982295u,40u,1610612768u,7468u,138442755u,0}/* 2E38 */, /*10338*/{0,816u,65537u,76982295u,40u,1610612768u,7268u,138442755u,0}/* 2E39 */, /*10339*/{0,816u,65537u,100050963u,40u,1610678304u,4300u,138442755u,0}/* 2E3A */, /*10340*/{0,816u,65537u,100050963u,40u,1610678304u,4308u,138442755u,0}/* 2E3B */, /*10341*/{0,816u,65537u,69740567u,98344u,1610612768u,5172u,138442755u,41943040u}/* 2E3C */, /*10342*/{0,816u,65537u,69740567u,40u,1610612768u,6076u,138442755u,0}/* 2E3D */, /*10343*/{0,816u,65537u,69740567u,40u,1610612768u,7220u,138442755u,0}/* 2E3E */, /*10344*/{0,816u,65537u,77080599u,40u,1610612768u,7292u,138442755u,0}/* 2E3F */, /*10345*/{0,816u,65537u,69740563u,40u,1610678304u,4340u,138442755u,0}/* 2E40 */, /*10346*/{0,816u,65537u,69740567u,40u,1610612768u,4404u,138442755u,8388608u}/* 2E41 */, /*10347*/{0,816u,65537u,80226324u,106536u,1610612768u,6300u,138442755u,536870912u}/* 2E42 */, /*10348*/{0,816u,65537u,69806103u,40u,1610612768u,4324u,138442755u,0}/* 2E43 */, /*10349*/{0,816u,65537u,69806103u,40u,1610612768u,7772u,138442755u,0}/* 2E44 */, /*10350*/{0,816u,65537u,69838871u,40u,1610612768u,7780u,138442755u,0}/* 2E45 */, /*10351*/{0,816u,65537u,69838871u,40u,1610612768u,7788u,138442755u,0}/* 2E46 */, /*10352*/{0,816u,65537u,69838871u,40u,1610612768u,7796u,138442755u,0}/* 2E47 */, /*10353*/{0,816u,65537u,69838871u,40u,1610612768u,7804u,138442755u,0}/* 2E48 */, /*10354*/{0,816u,65537u,69838871u,40u,1610612768u,4564u,138442755u,0}/* 2E49 */, /*10355*/{0,827u,2359297u,102901787u,40u,1610612768u,936892u,1283536896u,335544320u}/* 2E80 */, /*10356*/{0,827u,2359297u,102901787u,40u,1610612768u,947740u,1283536896u,335544320u}/* 2E81 */, /*10357*/{0,827u,2359297u,102901787u,40u,1610612768u,937188u,138459136u,335544320u}/* 2E82 */, /*10358*/{0,827u,2359297u,102901787u,40u,1610612768u,937180u,138459136u,335544320u}/* 2E83 */, /*10359*/{0,827u,2359297u,102901787u,40u,1610612768u,937172u,1283536896u,335544320u}/* 2E84 */, /*10360*/{0,827u,2359297u,102901787u,40u,1610612768u,937956u,138459136u,335544320u}/* 2E85 */, /*10361*/{0,827u,2359297u,102901787u,40u,1610612768u,943644u,1283536896u,335544320u}/* 2E86 */, /*10362*/{0,827u,2359297u,102901787u,40u,1610612768u,944396u,1283536896u,335544320u}/* 2E87 */, /*10363*/{0,827u,2359297u,102901787u,40u,1610612768u,944652u,1283536896u,335544320u}/* 2E88 */, /*10364*/{0,827u,2359297u,102901787u,40u,1610612768u,944668u,138459136u,335544320u}/* 2E89 */, /*10365*/{0,827u,2359297u,102901787u,40u,1610612768u,947436u,1283536896u,335544320u}/* 2E8A */, /*10366*/{0,827u,2359297u,102901787u,40u,1610612768u,947540u,1283536896u,335544320u}/* 2E8B */, /*10367*/{0,827u,2359297u,102901787u,40u,1610612768u,965252u,1283536896u,335544320u}/* 2E8C */, /*10368*/{0,827u,2359297u,102901787u,40u,1610612768u,965252u,1287731200u,335544320u}/* 2E8D */, /*10369*/{0,827u,2359297u,102901787u,40u,1610612768u,965404u,1283536896u,335544320u}/* 2E8E */, /*10370*/{0,827u,2359297u,102901787u,40u,1610612768u,965412u,138459136u,335544320u}/* 2E8F */, /*10371*/{0,827u,2359297u,102901787u,40u,1610612768u,965404u,138459136u,335544320u}/* 2E90 */, /*10372*/{0,827u,2359297u,102901787u,40u,1610612768u,965412u,1283536896u,335544320u}/* 2E91 */, /*10373*/{0,827u,2359297u,102901787u,40u,1610612768u,969124u,138459136u,335544320u}/* 2E92 */, /*10374*/{0,827u,2359297u,102901787u,40u,1610612768u,970204u,138459136u,335544320u}/* 2E93 */, /*10375*/{0,827u,2359297u,102901787u,40u,1610612768u,971924u,138459136u,335544320u}/* 2E94 */, /*10376*/{0,827u,2359297u,102901787u,40u,1610612768u,971916u,1283536896u,335544320u}/* 2E95 */, /*10377*/{0,827u,2359297u,102901787u,40u,1610612768u,972844u,138459136u,335544320u}/* 2E96 */, /*10378*/{0,827u,2359297u,102901787u,40u,1610612768u,972836u,1283536896u,335544320u}/* 2E97 */, /*10379*/{0,827u,2359297u,102901787u,40u,1610612768u,978028u,138459136u,335544320u}/* 2E98 */, /*10380*/{0,827u,2359297u,102901787u,40u,1610612768u,983988u,138459136u,335544320u}/* 2E99 */, /*10381*/{0,827u,2359297u,102901787u,40u,1610612768u,985364u,138459136u,335544320u}/* 2E9B */, /*10382*/{0,827u,2359297u,102901787u,40u,1610612768u,985396u,1283536896u,335544320u}/* 2E9C */, /*10383*/{0,827u,2359297u,102901787u,40u,1610612768u,987724u,1283536896u,335544320u}/* 2E9D */, /*10384*/{0,827u,2359297u,102901787u,40u,1610612768u,996828u,1283536896u,335544320u}/* 2E9E */, /*10385*/{757071872u,827u,2359297u,102901851u,32u,1611137056u,997492u,138457088u,335544320u}/* 2E9F */, /*10386*/{0,827u,2359297u,102901787u,40u,1610612768u,998036u,138459136u,335544320u}/* 2EA0 */, /*10387*/{0,827u,2359297u,102901787u,40u,1610612768u,998324u,138459136u,335544320u}/* 2EA1 */, /*10388*/{0,827u,2359297u,102901787u,40u,1610612768u,998364u,138459136u,335544320u}/* 2EA2 */, /*10389*/{0,827u,2359297u,102901787u,40u,1610612768u,1006956u,138459136u,335544320u}/* 2EA3 */, /*10390*/{0,827u,2359297u,102901787u,40u,1610612768u,1010532u,138459136u,335544320u}/* 2EA4 */, /*10391*/{0,827u,2359297u,102901787u,40u,1610612768u,1010532u,1283536896u,335544320u}/* 2EA5 */, /*10392*/{0,827u,2359297u,102901787u,40u,1610612768u,936812u,138459136u,335544320u}/* 2EA6 */, /*10393*/{0,827u,2359297u,102901787u,40u,1610612768u,1010916u,1283536896u,335544320u}/* 2EA7 */, /*10394*/{0,827u,2359297u,102901787u,40u,1610612768u,1011572u,138459136u,335544320u}/* 2EA8 */, /*10395*/{0,827u,2359297u,102901787u,40u,1610612768u,1013348u,1283536896u,335544320u}/* 2EA9 */, /*10396*/{0,827u,2359297u,102901787u,40u,1610612768u,1017444u,1283536896u,335544320u}/* 2EAA */, /*10397*/{0,827u,2359297u,102901787u,40u,1610612768u,1020284u,1283536896u,335544320u}/* 2EAB */, /*10398*/{0,827u,2359297u,102901787u,40u,1610612768u,1024988u,1283536896u,335544320u}/* 2EAC */, /*10399*/{0,827u,2359297u,102901787u,40u,1610612768u,1024996u,138459136u,335544320u}/* 2EAD */, /*10400*/{0,827u,2359297u,102901787u,40u,1610612768u,1028564u,1283536896u,335544320u}/* 2EAE */, /*10401*/{0,827u,2359297u,102901787u,40u,1610612768u,1032660u,138459136u,335544320u}/* 2EAF */, /*10402*/{0,827u,2359297u,102901787u,40u,1610612768u,1036036u,138459136u,335544320u}/* 2EB0 */, /*10403*/{0,827u,2359297u,102901787u,40u,1610612768u,1037476u,138459136u,335544320u}/* 2EB1 */, /*10404*/{0,827u,2359297u,102901787u,40u,1610612768u,1037468u,138459136u,335544320u}/* 2EB2 */, /*10405*/{0,827u,2359297u,102901787u,40u,1610612768u,1037476u,1283536896u,335544320u}/* 2EB3 */, /*10406*/{0,827u,2359297u,102901787u,40u,1610612768u,1037476u,1287731200u,335544320u}/* 2EB4 */, /*10407*/{0,827u,2359297u,102901787u,40u,1610612768u,1037468u,1283536896u,335544320u}/* 2EB5 */, /*10408*/{0,827u,2359297u,102901787u,40u,1610612768u,1037916u,1283536896u,335544320u}/* 2EB6 */, /*10409*/{0,827u,2359297u,102901787u,40u,1610612768u,1037916u,1287731200u,335544320u}/* 2EB7 */, /*10410*/{0,827u,2359297u,102901787u,40u,1610612768u,1037924u,138459136u,335544320u}/* 2EB8 */, /*10411*/{0,827u,2359297u,102901787u,40u,1610612768u,776740u,138459136u,335544320u}/* 2EB9 */, /*10412*/{0,827u,2359297u,102901787u,40u,1610612768u,777748u,138459136u,335544320u}/* 2EBA */, /*10413*/{0,827u,2359297u,102901787u,40u,1610612768u,777740u,1283536896u,335544320u}/* 2EBB */, /*10414*/{0,827u,2359297u,102901787u,40u,1610612768u,777820u,1283536896u,335544320u}/* 2EBC */, /*10415*/{0,827u,2359297u,102901787u,40u,1610612768u,780788u,1283536896u,335544320u}/* 2EBD */, /*10416*/{0,827u,2359297u,102901787u,40u,1610612768u,781788u,138459136u,335544320u}/* 2EBE */, /*10417*/{0,827u,2359297u,102901787u,40u,1610612768u,781788u,1283536896u,335544320u}/* 2EBF */, /*10418*/{0,827u,2359297u,102901787u,40u,1610612768u,781788u,1287731200u,335544320u}/* 2EC0 */, /*10419*/{0,827u,2359297u,102901787u,40u,1610612768u,789636u,138459136u,335544320u}/* 2EC1 */, /*10420*/{0,827u,2359297u,102901787u,40u,1610612768u,793908u,138459136u,335544320u}/* 2EC2 */, /*10421*/{0,827u,2359297u,102901787u,40u,1610612768u,796180u,138459136u,335544320u}/* 2EC3 */, /*10422*/{0,827u,2359297u,102901787u,40u,1610612768u,796172u,138459136u,335544320u}/* 2EC4 */, /*10423*/{0,827u,2359297u,102901787u,40u,1610612768u,796700u,138459136u,335544320u}/* 2EC5 */, /*10424*/{0,827u,2359297u,102901787u,40u,1610612768u,796836u,138459136u,335544320u}/* 2EC6 */, /*10425*/{0,827u,2359297u,102901787u,40u,1610612768u,796836u,1283536896u,335544320u}/* 2EC7 */, /*10426*/{0,827u,2359297u,102901787u,40u,1610612768u,800532u,138459136u,335544320u}/* 2EC8 */, /*10427*/{0,827u,2359297u,102901787u,40u,1610612768u,803580u,138459136u,335544320u}/* 2EC9 */, /*10428*/{0,827u,2359297u,102901787u,40u,1610612768u,804780u,1283536896u,335544320u}/* 2ECA */, /*10429*/{0,827u,2359297u,102901787u,40u,1610612768u,808260u,138459136u,335544320u}/* 2ECB */, /*10430*/{0,827u,2359297u,102901787u,40u,1610612768u,808900u,138459136u,335544320u}/* 2ECC */, /*10431*/{0,827u,2359297u,102901787u,40u,1610612768u,808900u,1283536896u,335544320u}/* 2ECD */, /*10432*/{0,827u,2359297u,102901787u,40u,1610612768u,808900u,1287731200u,335544320u}/* 2ECE */, /*10433*/{0,827u,2359297u,102901787u,40u,1610612768u,810652u,1283536896u,335544320u}/* 2ECF */, /*10434*/{0,827u,2359297u,102901787u,40u,1610612768u,818748u,138459136u,335544320u}/* 2ED0 */, /*10435*/{0,827u,2359297u,102901787u,40u,1610612768u,820684u,138459136u,335544320u}/* 2ED1 */, /*10436*/{0,827u,2359297u,102901787u,40u,1610612768u,820692u,138459136u,335544320u}/* 2ED2 */, /*10437*/{0,827u,2359297u,102901787u,40u,1610612768u,820748u,138459136u,335544320u}/* 2ED3 */, /*10438*/{0,827u,2359297u,102901787u,40u,1610612768u,821588u,138459136u,335544320u}/* 2ED4 */, /*10439*/{0,827u,2359297u,102901787u,40u,1610612768u,822004u,1283536896u,335544320u}/* 2ED5 */, /*10440*/{0,827u,2359297u,102901787u,40u,1610612768u,822012u,138459136u,335544320u}/* 2ED6 */, /*10441*/{0,827u,2359297u,102901787u,40u,1610612768u,823636u,1283536896u,335544320u}/* 2ED7 */, /*10442*/{0,827u,2359297u,102901787u,40u,1610612768u,824484u,138459136u,335544320u}/* 2ED8 */, /*10443*/{0,827u,2359297u,102901787u,40u,1610612768u,825668u,138459136u,335544320u}/* 2ED9 */, /*10444*/{0,827u,2359297u,102901787u,40u,1610612768u,826812u,138459136u,335544320u}/* 2EDA */, /*10445*/{0,827u,2359297u,102901787u,40u,1610612768u,827524u,138459136u,335544320u}/* 2EDB */, /*10446*/{0,827u,2359297u,102901787u,40u,1610612768u,827652u,138459136u,335544320u}/* 2EDC */, /*10447*/{0,827u,2359297u,102901787u,40u,1610612768u,827660u,138459136u,335544320u}/* 2EDD */, /*10448*/{0,827u,2359297u,102901787u,40u,1610612768u,827668u,1283536896u,335544320u}/* 2EDE */, /*10449*/{0,827u,2359297u,102901787u,40u,1610612768u,827668u,138459136u,335544320u}/* 2EDF */, /*10450*/{0,827u,2359297u,102901787u,40u,1610612768u,828716u,138459136u,335544320u}/* 2EE0 */, /*10451*/{0,827u,2359297u,102901787u,40u,1610612768u,829124u,1283536896u,335544320u}/* 2EE1 */, /*10452*/{0,827u,2359297u,102901787u,40u,1610612768u,830836u,138459136u,335544320u}/* 2EE2 */, /*10453*/{0,827u,2359297u,102901787u,40u,1610612768u,831316u,1283536896u,335544320u}/* 2EE3 */, /*10454*/{0,827u,2359297u,102901787u,40u,1610612768u,832500u,1283536896u,335544320u}/* 2EE4 */, /*10455*/{0,827u,2359297u,102901787u,40u,1610612768u,835060u,138459136u,335544320u}/* 2EE5 */, /*10456*/{0,827u,2359297u,102901787u,40u,1610612768u,838412u,138459136u,335544320u}/* 2EE6 */, /*10457*/{0,827u,2359297u,102901787u,40u,1610612768u,839100u,1283536896u,335544320u}/* 2EE7 */, /*10458*/{0,827u,2359297u,102901787u,40u,1610612768u,839492u,138459136u,335544320u}/* 2EE8 */, /*10459*/{0,827u,2359297u,102901787u,40u,1610612768u,839732u,138459136u,335544320u}/* 2EE9 */, /*10460*/{0,827u,2359297u,102901787u,40u,1610612768u,840196u,138459136u,335544320u}/* 2EEA */, /*10461*/{0,827u,2359297u,102901787u,40u,1610612768u,840804u,1283536896u,335544320u}/* 2EEB */, /*10462*/{0,827u,2359297u,102901787u,40u,1610612768u,840852u,138459136u,335544320u}/* 2EEC */, /*10463*/{0,827u,2359297u,102901787u,40u,1610612768u,840868u,1283536896u,335544320u}/* 2EED */, /*10464*/{0,827u,2359297u,102901787u,40u,1610612768u,841228u,138459136u,335544320u}/* 2EEE */, /*10465*/{0,827u,2359297u,102901787u,40u,1610612768u,841340u,1283536896u,335544320u}/* 2EEF */, /*10466*/{0,827u,2359297u,102901787u,40u,1610612768u,841436u,138459136u,335544320u}/* 2EF0 */, /*10467*/{0,827u,2359297u,102901787u,40u,1610612768u,841460u,1283536896u,335544320u}/* 2EF1 */, /*10468*/{0,827u,2359297u,102901787u,40u,1610612768u,841460u,1287731200u,335544320u}/* 2EF2 */, /*10469*/{757596160u,827u,2359297u,102901851u,32u,1611137056u,841484u,138457088u,335544320u}/* 2EF3 */, /*10470*/{758120448u,835u,2359297u,102901851u,32u,1611137056u,936460u,138457088u,335544320u}/* 2F00 */, /*10471*/{758644736u,835u,2359297u,102901851u,32u,1611137056u,936780u,138457088u,335544320u}/* 2F01 */, /*10472*/{759169024u,835u,2359297u,102901851u,32u,1611137056u,936892u,138457088u,335544320u}/* 2F02 */, /*10473*/{759693312u,835u,2359297u,102901851u,32u,1611137056u,936964u,138457088u,335544320u}/* 2F03 */, /*10474*/{760217600u,835u,2359297u,102901851u,32u,1611137056u,937172u,138457088u,335544320u}/* 2F04 */, /*10475*/{760741888u,835u,2359297u,102901851u,32u,1611137056u,937524u,138457088u,335544320u}/* 2F05 */, /*10476*/{761266176u,835u,2359297u,102901851u,32u,1611137056u,937580u,138457088u,335544320u}/* 2F06 */, /*10477*/{761790464u,835u,2359297u,102901851u,32u,1611137056u,937740u,138457088u,335544320u}/* 2F07 */, /*10478*/{762314752u,835u,2359297u,102901851u,32u,1611137056u,937948u,138457088u,335544320u}/* 2F08 */, /*10479*/{762839040u,835u,2359297u,102901851u,32u,1611137056u,943108u,138457088u,335544320u}/* 2F09 */, /*10480*/{763363328u,835u,2359297u,102901851u,32u,1611137056u,943412u,138457088u,335544320u}/* 2F0A */, /*10481*/{763887616u,835u,2359297u,102901851u,32u,1611137056u,943460u,138457088u,335544320u}/* 2F0B */, /*10482*/{764411904u,835u,2359297u,102901851u,32u,1611137056u,943644u,138457088u,335544320u}/* 2F0C */, /*10483*/{764936192u,835u,2359297u,102901851u,32u,1611137056u,943804u,138457088u,335544320u}/* 2F0D */, /*10484*/{765460480u,835u,2359297u,102901851u,32u,1611137056u,943972u,138457088u,335544320u}/* 2F0E */, /*10485*/{765984768u,835u,2359297u,102901851u,32u,1611137056u,944396u,138457088u,335544320u}/* 2F0F */, /*10486*/{766509056u,835u,2359297u,102901851u,32u,1611137056u,944564u,138457088u,335544320u}/* 2F10 */, /*10487*/{767033344u,835u,2359297u,102901851u,32u,1611137056u,944652u,138457088u,335544320u}/* 2F11 */, /*10488*/{767557632u,835u,2359297u,102901851u,32u,1611137056u,945892u,138457088u,335544320u}/* 2F12 */, /*10489*/{768081920u,835u,2359297u,102901851u,32u,1611137056u,946644u,138457088u,335544320u}/* 2F13 */, /*10490*/{768606208u,835u,2359297u,102901851u,32u,1611137056u,946868u,138457088u,335544320u}/* 2F14 */, /*10491*/{769130496u,835u,2359297u,102901851u,32u,1611137056u,946908u,138457088u,335544320u}/* 2F15 */, /*10492*/{769654784u,835u,2359297u,102901851u,32u,1611137056u,947148u,138457088u,335544320u}/* 2F16 */, /*10493*/{770179072u,835u,2359297u,102901851u,32u,1611137056u,947220u,138457088u,335544320u}/* 2F17 */, /*10494*/{770703360u,835u,2359297u,102901851u,32u,1611137056u,947436u,138457088u,335544320u}/* 2F18 */, /*10495*/{771227648u,835u,2359297u,102901851u,32u,1611137056u,947540u,138457088u,335544320u}/* 2F19 */, /*10496*/{771751936u,835u,2359297u,102901851u,32u,1611137056u,947740u,138457088u,335544320u}/* 2F1A */, /*10497*/{772276224u,835u,2359297u,102901851u,32u,1611137056u,948156u,138457088u,335544320u}/* 2F1B */, /*10498*/{772800512u,835u,2359297u,102901851u,32u,1611137056u,948300u,138457088u,335544320u}/* 2F1C */, /*10499*/{773324800u,835u,2359297u,102901851u,32u,1611137056u,948516u,138457088u,335544320u}/* 2F1D */, /*10500*/{773849088u,835u,2359297u,102901851u,32u,1611137056u,954564u,138457088u,335544320u}/* 2F1E */, /*10501*/{774373376u,835u,2359297u,102901851u,32u,1611137056u,955140u,138457088u,335544320u}/* 2F1F */, /*10502*/{774897664u,835u,2359297u,102901851u,32u,1611137056u,958820u,138457088u,335544320u}/* 2F20 */, /*10503*/{775421952u,835u,2359297u,102901851u,32u,1611137056u,959004u,138457088u,335544320u}/* 2F21 */, /*10504*/{775946240u,835u,2359297u,102901851u,32u,1611137056u,959068u,138457088u,335544320u}/* 2F22 */, /*10505*/{776470528u,835u,2359297u,102901851u,32u,1611137056u,959156u,138457088u,335544320u}/* 2F23 */, /*10506*/{776994816u,835u,2359297u,102901851u,32u,1611137056u,959300u,138457088u,335544320u}/* 2F24 */, /*10507*/{777519104u,835u,2359297u,102901851u,32u,1611137056u,959908u,138457088u,335544320u}/* 2F25 */, /*10508*/{778043392u,835u,2359297u,102901851u,32u,1611137056u,963724u,138457088u,335544320u}/* 2F26 */, /*10509*/{778567680u,835u,2359297u,102901851u,32u,1611137056u,964108u,138457088u,335544320u}/* 2F27 */, /*10510*/{779091968u,835u,2359297u,102901851u,32u,1611137056u,965068u,138457088u,335544320u}/* 2F28 */, /*10511*/{779616256u,835u,2359297u,102901851u,32u,1611137056u,965252u,138457088u,335544320u}/* 2F29 */, /*10512*/{780140544u,835u,2359297u,102901851u,32u,1611137056u,965404u,138457088u,335544320u}/* 2F2A */, /*10513*/{780664832u,835u,2359297u,102901851u,32u,1611137056u,965580u,138457088u,335544320u}/* 2F2B */, /*10514*/{781189120u,835u,2359297u,102901851u,32u,1611137056u,966012u,138457088u,335544320u}/* 2F2C */, /*10515*/{781713408u,835u,2359297u,102901851u,32u,1611137056u,966036u,138457088u,335544320u}/* 2F2D */, /*10516*/{782237696u,835u,2359297u,102901851u,32u,1611137056u,968932u,138457088u,335544320u}/* 2F2E */, /*10517*/{782761984u,835u,2359297u,102901851u,32u,1611137056u,969012u,138457088u,335544320u}/* 2F2F */, /*10518*/{783286272u,835u,2359297u,102901851u,32u,1611137056u,969108u,138457088u,335544320u}/* 2F30 */, /*10519*/{783810560u,835u,2359297u,102901851u,32u,1611137056u,969212u,138457088u,335544320u}/* 2F31 */, /*10520*/{784334848u,835u,2359297u,102901851u,32u,1611137056u,970140u,138457088u,335544320u}/* 2F32 */, /*10521*/{784859136u,835u,2359297u,102901851u,32u,1611137056u,970204u,138457088u,335544320u}/* 2F33 */, /*10522*/{785383424u,835u,2359297u,102901851u,32u,1611137056u,970244u,138457088u,335544320u}/* 2F34 */, /*10523*/{785907712u,835u,2359297u,102901851u,32u,1611137056u,971180u,138457088u,335544320u}/* 2F35 */, /*10524*/{786432000u,835u,2359297u,102901851u,32u,1611137056u,971260u,138457088u,335544320u}/* 2F36 */, /*10525*/{786956288u,835u,2359297u,102901851u,32u,1611137056u,971364u,138457088u,335544320u}/* 2F37 */, /*10526*/{787480576u,835u,2359297u,102901851u,32u,1611137056u,971428u,138457088u,335544320u}/* 2F38 */, /*10527*/{788004864u,835u,2359297u,102901851u,32u,1611137056u,971916u,138457088u,335544320u}/* 2F39 */, /*10528*/{788529152u,835u,2359297u,102901851u,32u,1611137056u,972052u,138457088u,335544320u}/* 2F3A */, /*10529*/{789053440u,835u,2359297u,102901851u,32u,1611137056u,972196u,138457088u,335544320u}/* 2F3B */, /*10530*/{789577728u,835u,2359297u,102901851u,32u,1611137056u,972836u,138457088u,335544320u}/* 2F3C */, /*10531*/{790102016u,835u,2359297u,102901851u,32u,1611137056u,977484u,138457088u,335544320u}/* 2F3D */, /*10532*/{790626304u,835u,2359297u,102901851u,32u,1611137056u,977852u,138457088u,335544320u}/* 2F3E */, /*10533*/{791150592u,835u,2359297u,102901851u,32u,1611137056u,978020u,138457088u,335544320u}/* 2F3F */, /*10534*/{791674880u,835u,2359297u,102901851u,32u,1611137056u,983940u,138457088u,335544320u}/* 2F40 */, /*10535*/{792199168u,835u,2359297u,102901851u,32u,1611137056u,983980u,138457088u,335544320u}/* 2F41 */, /*10536*/{792723456u,835u,2359297u,102901851u,32u,1611137056u,984644u,138457088u,335544320u}/* 2F42 */, /*10537*/{793247744u,835u,2359297u,102901851u,32u,1611137056u,984772u,138457088u,335544320u}/* 2F43 */, /*10538*/{793772032u,835u,2359297u,102901851u,32u,1611137056u,984876u,138457088u,335544320u}/* 2F44 */, /*10539*/{794296320u,835u,2359297u,102901851u,32u,1611137056u,985044u,138457088u,335544320u}/* 2F45 */, /*10540*/{794820608u,835u,2359297u,102901851u,32u,1611137056u,985356u,138457088u,335544320u}/* 2F46 */, /*10541*/{795344896u,835u,2359297u,102901851u,32u,1611137056u,985396u,138457088u,335544320u}/* 2F47 */, /*10542*/{795869184u,835u,2359297u,102901851u,32u,1611137056u,987532u,138457088u,335544320u}/* 2F48 */, /*10543*/{796393472u,835u,2359297u,102901851u,32u,1611137056u,987724u,138457088u,335544320u}/* 2F49 */, /*10544*/{796917760u,835u,2359297u,102901851u,32u,1611137056u,987980u,138457088u,335544320u}/* 2F4A */, /*10545*/{797442048u,835u,2359297u,102901851u,32u,1611137056u,996108u,138457088u,335544320u}/* 2F4B */, /*10546*/{797966336u,835u,2359297u,102901851u,32u,1611137056u,996636u,138457088u,335544320u}/* 2F4C */, /*10547*/{798490624u,835u,2359297u,102901851u,32u,1611137056u,996820u,138457088u,335544320u}/* 2F4D */, /*10548*/{799014912u,835u,2359297u,102901851u,32u,1611137056u,997284u,138457088u,335544320u}/* 2F4E */, /*10549*/{799539200u,835u,2359297u,102901851u,32u,1611137056u,997476u,138457088u,335544320u}/* 2F4F */, /*10550*/{800063488u,835u,2359297u,102901851u,32u,1611137056u,997548u,138457088u,335544320u}/* 2F50 */, /*10551*/{800587776u,835u,2359297u,102901851u,32u,1611137056u,997604u,138457088u,335544320u}/* 2F51 */, /*10552*/{801112064u,835u,2359297u,102901851u,32u,1611137056u,998020u,138457088u,335544320u}/* 2F52 */, /*10553*/{801636352u,835u,2359297u,102901851u,32u,1611137056u,998060u,138457088u,335544320u}/* 2F53 */, /*10554*/{802160640u,835u,2359297u,102901851u,32u,1611137056u,998316u,138457088u,335544320u}/* 2F54 */, /*10555*/{802684928u,835u,2359297u,102901851u,32u,1611137056u,1006948u,138457088u,335544320u}/* 2F55 */, /*10556*/{803209216u,835u,2359297u,102901851u,32u,1611137056u,1010524u,138457088u,335544320u}/* 2F56 */, /*10557*/{803733504u,835u,2359297u,102901851u,32u,1611137056u,1010620u,138457088u,335544320u}/* 2F57 */, /*10558*/{804257792u,835u,2359297u,102901851u,32u,1611137056u,1010660u,138457088u,335544320u}/* 2F58 */, /*10559*/{804782080u,835u,2359297u,102901851u,32u,1611137056u,1010692u,138457088u,335544320u}/* 2F59 */, /*10560*/{805306368u,835u,2359297u,102901851u,32u,1611137056u,1010756u,138457088u,335544320u}/* 2F5A */, /*10561*/{805830656u,835u,2359297u,102901851u,32u,1611137056u,1010900u,138457088u,335544320u}/* 2F5B */, /*10562*/{806354944u,835u,2359297u,102901851u,32u,1611137056u,1010916u,138457088u,335544320u}/* 2F5C */, /*10563*/{806879232u,835u,2359297u,102901851u,32u,1611137056u,1011564u,138457088u,335544320u}/* 2F5D */, /*10564*/{807403520u,835u,2359297u,102901851u,32u,1611137056u,1013292u,138457088u,335544320u}/* 2F5E */, /*10565*/{807927808u,835u,2359297u,102901851u,32u,1611137056u,1013332u,138457088u,335544320u}/* 2F5F */, /*10566*/{808452096u,835u,2359297u,102901851u,32u,1611137056u,1016044u,138457088u,335544320u}/* 2F60 */, /*10567*/{808976384u,835u,2359297u,102901851u,32u,1611137056u,1016124u,138457088u,335544320u}/* 2F61 */, /*10568*/{809500672u,835u,2359297u,102901851u,32u,1611137056u,1016524u,138457088u,335544320u}/* 2F62 */, /*10569*/{810024960u,835u,2359297u,102901851u,32u,1611137056u,1016580u,138457088u,335544320u}/* 2F63 */, /*10570*/{810549248u,835u,2359297u,102901851u,32u,1611137056u,1016652u,138457088u,335544320u}/* 2F64 */, /*10571*/{811073536u,835u,2359297u,102901851u,32u,1611137056u,1016716u,138457088u,335544320u}/* 2F65 */, /*10572*/{811597824u,835u,2359297u,102901851u,32u,1611137056u,1017444u,138457088u,335544320u}/* 2F66 */, /*10573*/{812122112u,835u,2359297u,102901851u,32u,1611137056u,1017500u,138457088u,335544320u}/* 2F67 */, /*10574*/{812646400u,835u,2359297u,102901851u,32u,1611137056u,1019324u,138457088u,335544320u}/* 2F68 */, /*10575*/{813170688u,835u,2359297u,102901851u,32u,1611137056u,1019380u,138457088u,335544320u}/* 2F69 */, /*10576*/{813694976u,835u,2359297u,102901851u,32u,1611137056u,1019772u,138457088u,335544320u}/* 2F6A */, /*10577*/{814219264u,835u,2359297u,102901851u,32u,1611137056u,1019908u,138457088u,335544320u}/* 2F6B */, /*10578*/{814743552u,835u,2359297u,102901851u,32u,1611137056u,1020284u,138457088u,335544320u}/* 2F6C */, /*10579*/{815267840u,835u,2359297u,102901851u,32u,1611137056u,1022180u,138457088u,335544320u}/* 2F6D */, /*10580*/{815792128u,835u,2359297u,102901851u,32u,1611137056u,1022236u,138457088u,335544320u}/* 2F6E */, /*10581*/{816316416u,835u,2359297u,102901851u,32u,1611137056u,1022372u,138457088u,335544320u}/* 2F6F */, /*10582*/{816840704u,835u,2359297u,102901851u,32u,1611137056u,1024988u,138457088u,335544320u}/* 2F70 */, /*10583*/{817364992u,835u,2359297u,102901851u,32u,1611137056u,1025996u,138457088u,335544320u}/* 2F71 */, /*10584*/{817889280u,835u,2359297u,102901851u,32u,1611137056u,1026044u,138457088u,335544320u}/* 2F72 */, /*10585*/{818413568u,835u,2359297u,102901851u,32u,1611137056u,1027500u,138457088u,335544320u}/* 2F73 */, /*10586*/{818937856u,835u,2359297u,102901851u,32u,1611137056u,1028196u,138457088u,335544320u}/* 2F74 */, /*10587*/{819462144u,835u,2359297u,102901851u,32u,1611137056u,1028564u,138457088u,335544320u}/* 2F75 */, /*10588*/{819986432u,835u,2359297u,102901851u,32u,1611137056u,1031588u,138457088u,335544320u}/* 2F76 */, /*10589*/{820510720u,835u,2359297u,102901851u,32u,1611137056u,1032652u,138457088u,335544320u}/* 2F77 */, /*10590*/{821035008u,835u,2359297u,102901851u,32u,1611137056u,1037244u,138457088u,335544320u}/* 2F78 */, /*10591*/{821559296u,835u,2359297u,102901851u,32u,1611137056u,1037460u,138457088u,335544320u}/* 2F79 */, /*10592*/{822083584u,835u,2359297u,102901851u,32u,1611137056u,1037916u,138457088u,335544320u}/* 2F7A */, /*10593*/{822607872u,835u,2359297u,102901851u,32u,1611137056u,1038324u,138457088u,335544320u}/* 2F7B */, /*10594*/{823132160u,835u,2359297u,102901851u,32u,1611137056u,776732u,138457088u,335544320u}/* 2F7C */, /*10595*/{823656448u,835u,2359297u,102901851u,32u,1611137056u,776820u,138457088u,335544320u}/* 2F7D */, /*10596*/{824180736u,835u,2359297u,102901851u,32u,1611137056u,776868u,138457088u,335544320u}/* 2F7E */, /*10597*/{824705024u,835u,2359297u,102901851u,32u,1611137056u,777132u,138457088u,335544320u}/* 2F7F */, /*10598*/{825229312u,835u,2359297u,102901851u,32u,1611137056u,777740u,138457088u,335544320u}/* 2F80 */, /*10599*/{825753600u,835u,2359297u,102901851u,32u,1611137056u,777820u,138457088u,335544320u}/* 2F81 */, /*10600*/{826277888u,835u,2359297u,102901851u,32u,1611137056u,780588u,138457088u,335544320u}/* 2F82 */, /*10601*/{826802176u,835u,2359297u,102901851u,32u,1611137056u,780644u,138457088u,335544320u}/* 2F83 */, /*10602*/{827326464u,835u,2359297u,102901851u,32u,1611137056u,780716u,138457088u,335544320u}/* 2F84 */, /*10603*/{827850752u,835u,2359297u,102901851u,32u,1611137056u,780788u,138457088u,335544320u}/* 2F85 */, /*10604*/{828375040u,835u,2359297u,102901851u,32u,1611137056u,780916u,138457088u,335544320u}/* 2F86 */, /*10605*/{828899328u,835u,2359297u,102901851u,32u,1611137056u,781036u,138457088u,335544320u}/* 2F87 */, /*10606*/{829423616u,835u,2359297u,102901851u,32u,1611137056u,781068u,138457088u,335544320u}/* 2F88 */, /*10607*/{829947904u,835u,2359297u,102901851u,32u,1611137056u,781700u,138457088u,335544320u}/* 2F89 */, /*10608*/{830472192u,835u,2359297u,102901851u,32u,1611137056u,781732u,138457088u,335544320u}/* 2F8A */, /*10609*/{830996480u,835u,2359297u,102901851u,32u,1611137056u,781780u,138457088u,335544320u}/* 2F8B */, /*10610*/{831520768u,835u,2359297u,102901851u,32u,1611137056u,789628u,138457088u,335544320u}/* 2F8C */, /*10611*/{832045056u,835u,2359297u,102901851u,32u,1611137056u,789868u,138457088u,335544320u}/* 2F8D */, /*10612*/{832569344u,835u,2359297u,102901851u,32u,1611137056u,793620u,138457088u,335544320u}/* 2F8E */, /*10613*/{833093632u,835u,2359297u,102901851u,32u,1611137056u,793716u,138457088u,335544320u}/* 2F8F */, /*10614*/{833617920u,835u,2359297u,102901851u,32u,1611137056u,793900u,138457088u,335544320u}/* 2F90 */, /*10615*/{834142208u,835u,2359297u,102901851u,32u,1611137056u,796164u,138457088u,335544320u}/* 2F91 */, /*10616*/{834666496u,835u,2359297u,102901851u,32u,1611137056u,796268u,138457088u,335544320u}/* 2F92 */, /*10617*/{835190784u,835u,2359297u,102901851u,32u,1611137056u,796836u,138457088u,335544320u}/* 2F93 */, /*10618*/{835715072u,835u,2359297u,102901851u,32u,1611137056u,797204u,138457088u,335544320u}/* 2F94 */, /*10619*/{836239360u,835u,2359297u,102901851u,32u,1611137056u,801740u,138457088u,335544320u}/* 2F95 */, /*10620*/{836763648u,835u,2359297u,102901851u,32u,1611137056u,801860u,138457088u,335544320u}/* 2F96 */, /*10621*/{837287936u,835u,2359297u,102901851u,32u,1611137056u,801980u,138457088u,335544320u}/* 2F97 */, /*10622*/{837812224u,835u,2359297u,102901851u,32u,1611137056u,802260u,138457088u,335544320u}/* 2F98 */, /*10623*/{838336512u,835u,2359297u,102901851u,32u,1611137056u,802556u,138457088u,335544320u}/* 2F99 */, /*10624*/{838860800u,835u,2359297u,102901851u,32u,1611137056u,804148u,138457088u,335544320u}/* 2F9A */, /*10625*/{839385088u,835u,2359297u,102901851u,32u,1611137056u,804244u,138457088u,335544320u}/* 2F9B */, /*10626*/{839909376u,835u,2359297u,102901851u,32u,1611137056u,804780u,138457088u,335544320u}/* 2F9C */, /*10627*/{840433664u,835u,2359297u,102901851u,32u,1611137056u,806764u,138457088u,335544320u}/* 2F9D */, /*10628*/{840957952u,835u,2359297u,102901851u,32u,1611137056u,807012u,138457088u,335544320u}/* 2F9E */, /*10629*/{841482240u,835u,2359297u,102901851u,32u,1611137056u,808684u,138457088u,335544320u}/* 2F9F */, /*10630*/{842006528u,835u,2359297u,102901851u,32u,1611137056u,808852u,138457088u,335544320u}/* 2FA0 */, /*10631*/{842530816u,835u,2359297u,102901851u,32u,1611137056u,808892u,138457088u,335544320u}/* 2FA1 */, /*10632*/{843055104u,835u,2359297u,102901851u,32u,1611137056u,810652u,138457088u,335544320u}/* 2FA2 */, /*10633*/{843579392u,835u,2359297u,102901851u,32u,1611137056u,812124u,138457088u,335544320u}/* 2FA3 */, /*10634*/{844103680u,835u,2359297u,102901851u,32u,1611137056u,813124u,138457088u,335544320u}/* 2FA4 */, /*10635*/{844627968u,835u,2359297u,102901851u,32u,1611137056u,813172u,138457088u,335544320u}/* 2FA5 */, /*10636*/{845152256u,835u,2359297u,102901851u,32u,1611137056u,813212u,138457088u,335544320u}/* 2FA6 */, /*10637*/{845676544u,835u,2359297u,102901851u,32u,1611137056u,820684u,138457088u,335544320u}/* 2FA7 */, /*10638*/{846200832u,835u,2359297u,102901851u,32u,1611137056u,820756u,138457088u,335544320u}/* 2FA8 */, /*10639*/{846725120u,835u,2359297u,102901851u,32u,1611137056u,822004u,138457088u,335544320u}/* 2FA9 */, /*10640*/{847249408u,835u,2359297u,102901851u,32u,1611137056u,823236u,138457088u,335544320u}/* 2FAA */, /*10641*/{847773696u,835u,2359297u,102901851u,32u,1611137056u,823260u,138457088u,335544320u}/* 2FAB */, /*10642*/{848297984u,835u,2359297u,102901851u,32u,1611137056u,823636u,138457088u,335544320u}/* 2FAC */, /*10643*/{848822272u,835u,2359297u,102901851u,32u,1611137056u,824476u,138457088u,335544320u}/* 2FAD */, /*10644*/{849346560u,835u,2359297u,102901851u,32u,1611137056u,824580u,138457088u,335544320u}/* 2FAE */, /*10645*/{849870848u,835u,2359297u,102901851u,32u,1611137056u,824612u,138457088u,335544320u}/* 2FAF */, /*10646*/{850395136u,835u,2359297u,102901851u,32u,1611137056u,824668u,138457088u,335544320u}/* 2FB0 */, /*10647*/{850919424u,835u,2359297u,102901851u,32u,1611137056u,825452u,138457088u,335544320u}/* 2FB1 */, /*10648*/{851443712u,835u,2359297u,102901851u,32u,1611137056u,825724u,138457088u,335544320u}/* 2FB2 */, /*10649*/{851968000u,835u,2359297u,102901851u,32u,1611137056u,825772u,138457088u,335544320u}/* 2FB3 */, /*10650*/{852492288u,835u,2359297u,102901851u,32u,1611137056u,825884u,138457088u,335544320u}/* 2FB4 */, /*10651*/{853016576u,835u,2359297u,102901851u,32u,1611137056u,827220u,138457088u,335544320u}/* 2FB5 */, /*10652*/{853540864u,835u,2359297u,102901851u,32u,1611137056u,827628u,138457088u,335544320u}/* 2FB6 */, /*10653*/{854065152u,835u,2359297u,102901851u,32u,1611137056u,827660u,138457088u,335544320u}/* 2FB7 */, /*10654*/{854589440u,835u,2359297u,102901851u,32u,1611137056u,829124u,138457088u,335544320u}/* 2FB8 */, /*10655*/{855113728u,835u,2359297u,102901851u,32u,1611137056u,829148u,138457088u,335544320u}/* 2FB9 */, /*10656*/{855638016u,835u,2359297u,102901851u,32u,1611137056u,829300u,138457088u,335544320u}/* 2FBA */, /*10657*/{856162304u,835u,2359297u,102901851u,32u,1611137056u,831316u,138457088u,335544320u}/* 2FBB */, /*10658*/{856686592u,835u,2359297u,102901851u,32u,1611137056u,831700u,138457088u,335544320u}/* 2FBC */, /*10659*/{857210880u,835u,2359297u,102901851u,32u,1611137056u,831756u,138457088u,335544320u}/* 2FBD */, /*10660*/{857735168u,835u,2359297u,102901851u,32u,1611137056u,832316u,138457088u,335544320u}/* 2FBE */, /*10661*/{858259456u,835u,2359297u,102901851u,32u,1611137056u,832396u,138457088u,335544320u}/* 2FBF */, /*10662*/{858783744u,835u,2359297u,102901851u,32u,1611137056u,832420u,138457088u,335544320u}/* 2FC0 */, /*10663*/{859308032u,835u,2359297u,102901851u,32u,1611137056u,832500u,138457088u,335544320u}/* 2FC1 */, /*10664*/{859832320u,835u,2359297u,102901851u,32u,1611137056u,832740u,138457088u,335544320u}/* 2FC2 */, /*10665*/{860356608u,835u,2359297u,102901851u,32u,1611137056u,835900u,138457088u,335544320u}/* 2FC3 */, /*10666*/{860880896u,835u,2359297u,102901851u,32u,1611137056u,839100u,138457088u,335544320u}/* 2FC4 */, /*10667*/{861405184u,835u,2359297u,102901851u,32u,1611137056u,839180u,138457088u,335544320u}/* 2FC5 */, /*10668*/{861929472u,835u,2359297u,102901851u,32u,1611137056u,839484u,138457088u,335544320u}/* 2FC6 */, /*10669*/{862453760u,835u,2359297u,102901851u,32u,1611137056u,839660u,138457088u,335544320u}/* 2FC7 */, /*10670*/{862978048u,835u,2359297u,102901851u,32u,1611137056u,839724u,138457088u,335544320u}/* 2FC8 */, /*10671*/{863502336u,835u,2359297u,102901851u,32u,1611137056u,839804u,138457088u,335544320u}/* 2FC9 */, /*10672*/{864026624u,835u,2359297u,102901851u,32u,1611137056u,839836u,138457088u,335544320u}/* 2FCA */, /*10673*/{864550912u,835u,2359297u,102901851u,32u,1611137056u,840156u,138457088u,335544320u}/* 2FCB */, /*10674*/{865075200u,835u,2359297u,102901851u,32u,1611137056u,840188u,138457088u,335544320u}/* 2FCC */, /*10675*/{865599488u,835u,2359297u,102901851u,32u,1611137056u,840324u,138457088u,335544320u}/* 2FCD */, /*10676*/{866123776u,835u,2359297u,102901851u,32u,1611137056u,840364u,138457088u,335544320u}/* 2FCE */, /*10677*/{866648064u,835u,2359297u,102901851u,32u,1611137056u,840468u,138457088u,335544320u}/* 2FCF */, /*10678*/{867172352u,835u,2359297u,102901851u,32u,1611137056u,840684u,138457088u,335544320u}/* 2FD0 */, /*10679*/{867696640u,835u,2359297u,102901851u,32u,1611137056u,840804u,138457088u,335544320u}/* 2FD1 */, /*10680*/{868220928u,835u,2359297u,102901851u,32u,1611137056u,840868u,138457088u,335544320u}/* 2FD2 */, /*10681*/{868745216u,835u,2359297u,102901851u,32u,1611137056u,841340u,138457088u,335544320u}/* 2FD3 */, /*10682*/{869269504u,835u,2359297u,102901851u,32u,1611137056u,841460u,138457088u,335544320u}/* 2FD4 */, /*10683*/{869793792u,835u,2359297u,102901851u,32u,1611137056u,841492u,138457088u,335544320u}/* 2FD5 */, /*10684*/{0,843u,65537u,102901787u,40u,1610612769u,54788u,138442752u,67108864u}/* 2FF0 */, /*10685*/{0,843u,65537u,102901787u,40u,1610612769u,54796u,138442752u,67108864u}/* 2FF1 */, /*10686*/{0,843u,65537u,102901787u,40u,1610612768u,2147538452u,138442752u,67108864u}/* 2FF2 */, /*10687*/{0,843u,65537u,102901787u,40u,1610612768u,2147538460u,138442752u,67108864u}/* 2FF3 */, /*10688*/{0,843u,65537u,102901787u,40u,1610612769u,54820u,138442752u,67108864u}/* 2FF4 */, /*10689*/{0,843u,65537u,102901787u,40u,1610612769u,54828u,138442752u,67108864u}/* 2FF5 */, /*10690*/{0,843u,65537u,102901787u,40u,1610612769u,54836u,138442752u,67108864u}/* 2FF6 */, /*10691*/{0,843u,65537u,102901787u,40u,1610612769u,54844u,138442752u,67108864u}/* 2FF7 */, /*10692*/{0,843u,65537u,102901787u,40u,1610612769u,54852u,138442752u,67108864u}/* 2FF8 */, /*10693*/{0,843u,65537u,102901787u,40u,1610612769u,54860u,138442752u,67108864u}/* 2FF9 */, /*10694*/{0,843u,65537u,102901787u,40u,1610612769u,54868u,138442752u,67108864u}/* 2FFA */, /*10695*/{0,843u,65537u,102901787u,40u,1610612769u,54876u,138442752u,67108864u}/* 2FFB */, /*10696*/{870318080u,852u,65537u,69248428u,49184u,1611137056u,4180u,138448896u,589824u}/* 3000 */, /*10697*/{0,851u,65537u,86026263u,114728u,1610612768u,4500u,138442755u,8388608u}/* 3001 */, /*10698*/{0,851u,65537u,86026263u,98344u,1610612768u,5220u,138442755u,41943040u}/* 3002 */, /*10699*/{0,851u,65537u,102803479u,40u,1610612768u,7540u,138442755u,0}/* 3003 */, /*10700*/{0,851u,65537u,102803483u,40u,1610612768u,55172u,138442752u,67108864u}/* 3004 */, /*10701*/{0,851u,2359297u,96501764u,1515560u,3774873760u,1677779812u,138442752u,393216u}/* 3005 */, /*10702*/{0,851u,65537u,102793221u,73768u,3758096416u,1946413196u,272709632u,393216u}/* 3006 */, /*10703*/{0,851u,35914753u,102793226u,8462378u,3758096416u,1879106853u,138442752u,393216u}/* 3007 */, /*10704*/{0,1340243u,65537u,79734804u,106536u,1744830496u,7052u,138442755u,0}/* 3008 */, /*10705*/{0,1344339u,65537u,86026261u,106536u,1744830496u,7060u,138442755u,0}/* 3009 */, /*10706*/{0,1348435u,65537u,79734804u,106536u,1744830496u,7068u,138442755u,0}/* 300A */, /*10707*/{0,1352531u,65537u,86026261u,106536u,1744830496u,7076u,138442755u,0}/* 300B */, /*10708*/{0,1356627u,65537u,79734804u,106536u,1744830496u,7084u,138442755u,536870912u}/* 300C */, /*10709*/{0,1360723u,65537u,86026261u,106536u,1744830496u,7092u,138442755u,536870912u}/* 300D */, /*10710*/{0,1364819u,65537u,79734804u,106536u,1744830496u,7100u,138442755u,536870912u}/* 300E */, /*10711*/{0,1368915u,65537u,86026261u,106536u,1744830496u,7108u,138442755u,536870912u}/* 300F */, /*10712*/{0,1373011u,65537u,79734804u,106536u,1744830496u,7116u,138442755u,0}/* 3010 */, /*10713*/{0,1377107u,65537u,86026261u,106536u,1744830496u,7124u,138442755u,0}/* 3011 */, /*10714*/{0,851u,65537u,102803483u,40u,1610612768u,55180u,138442753u,67108864u}/* 3012 */, /*10715*/{0,851u,65537u,102803483u,40u,1610612768u,55188u,138442753u,67108864u}/* 3013 */, /*10716*/{0,1381203u,65537u,79734804u,106536u,1744830496u,7132u,138442755u,0}/* 3014 */, /*10717*/{0,1385299u,65537u,86026261u,106536u,1744830496u,7140u,138442755u,0}/* 3015 */, /*10718*/{0,1389395u,65537u,79734804u,106536u,1744830496u,7148u,138442755u,0}/* 3016 */, /*10719*/{0,1393491u,65537u,86026261u,106536u,1744830496u,7156u,138442755u,0}/* 3017 */, /*10720*/{0,1397587u,65537u,79734804u,106536u,1744830496u,7164u,138442755u,0}/* 3018 */, /*10721*/{0,1401683u,65537u,86026261u,106536u,1744830496u,7172u,138442755u,0}/* 3019 */, /*10722*/{0,1405779u,65537u,79734804u,106536u,1744830496u,7180u,138442755u,0}/* 301A */, /*10723*/{0,1409875u,65537u,86026261u,106536u,1744830496u,7188u,138442755u,0}/* 301B */, /*10724*/{0,851u,65537u,96512019u,40u,1610678304u,4348u,138442755u,0}/* 301C */, /*10725*/{0,851u,65537u,79734804u,106536u,1610612768u,6308u,138442755u,536870912u}/* 301D */, /*10726*/{0,851u,65537u,86026261u,106536u,1610612768u,6316u,138442755u,536870912u}/* 301E */, /*10727*/{0,851u,65537u,86026261u,106536u,1610612768u,6324u,138442755u,536870912u}/* 301F */, /*10728*/{0,851u,65537u,102803483u,40u,1610612768u,55196u,138442753u,67108864u}/* 3020 */, /*10729*/{0,851u,539231745u,102793226u,8462378u,3758096416u,1879106861u,138442752u,393216u}/* 3021 */, /*10730*/{0,851u,572787201u,102793226u,8462378u,3758096416u,1879106869u,138442752u,393216u}/* 3022 */, /*10731*/{0,851u,606341121u,102793226u,8462378u,3758096416u,1879106877u,138442752u,393216u}/* 3023 */, /*10732*/{0,851u,639897601u,102793226u,8462378u,3758096416u,1879106885u,138442752u,393216u}/* 3024 */, /*10733*/{0,851u,673451009u,102793226u,8462378u,3758096416u,1879106893u,138442752u,393216u}/* 3025 */, /*10734*/{0,851u,707008001u,102793226u,8462378u,3758096416u,1879106901u,138442752u,393216u}/* 3026 */, /*10735*/{0,851u,740560385u,102793226u,8462378u,3758096416u,1879106909u,138442752u,393216u}/* 3027 */, /*10736*/{0,851u,774118401u,102793226u,8462378u,3758096416u,1879106917u,138442752u,393216u}/* 3028 */, /*10737*/{0,851u,807670785u,102793226u,8462378u,3758096416u,1879106925u,138442752u,393216u}/* 3029 */, /*10738*/{0,851u,2686977u,3020992518u,672030728u,1627398160u,1077936140u,1061189632u,262144u}/* 302A */, /*10739*/{0,851u,2686977u,3356536838u,672030728u,1627398160u,1077936140u,1065383936u,262144u}/* 302B */, /*10740*/{0,851u,2686977u,3490754566u,672030728u,1627398160u,1077936140u,1069578240u,262144u}/* 302C */, /*10741*/{0,851u,2686977u,3155210246u,672030728u,1627398160u,1077936140u,1073772544u,262144u}/* 302D */, /*10742*/{0,851u,1638401u,3222306824u,672030728u,1610620944u,1077936140u,1077966976u,262144u}/* 302E */, /*10743*/{0,851u,1638401u,3222306824u,672030728u,1610620944u,1077936140u,1082161280u,262144u}/* 302F */, /*10744*/{0,851u,65537u,102803475u,8u,1610682400u,4356u,138442755u,0}/* 3030 */, /*10745*/{0,851u,65537u,102793220u,1384488u,3774873760u,1677779844u,138442752u,393216u}/* 3031 */, /*10746*/{0,851u,65537u,102793220u,1384488u,3774873760u,1677779844u,369145856u,393216u}/* 3032 */, /*10747*/{0,851u,65537u,102793220u,1384488u,3774873760u,1677779852u,138442752u,393216u}/* 3033 */, /*10748*/{0,851u,65537u,102793220u,1384488u,3774873760u,1677779852u,369145856u,393216u}/* 3034 */, /*10749*/{0,851u,65537u,68190212u,1384488u,3774873760u,1677779860u,138442752u,393216u}/* 3035 */, /*10750*/{870842368u,851u,65537u,102803547u,32u,1611137056u,55180u,138457088u,67108864u}/* 3036 */, /*10751*/{0,851u,65537u,102803483u,40u,1610612768u,55204u,138442752u,67108864u}/* 3037 */, /*10752*/{871366656u,851u,824451073u,102891594u,8462370u,3758620704u,1879995413u,138457088u,393216u}/* 3038 */, /*10753*/{871890944u,851u,992226305u,102891594u,8462370u,3758620704u,1879995437u,138457088u,393216u}/* 3039 */, /*10754*/{872415232u,851u,1160003585u,102891594u,8462370u,3758620704u,1879995445u,138457088u,393216u}/* 303A */, /*10755*/{0,851u,2359297u,96665604u,1515560u,3774873632u,1677779820u,138442752u,393216u}/* 303B */, /*10756*/{0,851u,65537u,96665605u,1515560u,3758096416u,1677977724u,272709632u,393216u}/* 303C */, /*10757*/{0,851u,65537u,102967319u,8u,1610616864u,7548u,138442754u,0}/* 303D */, /*10758*/{0,851u,65537u,102901787u,40u,1610612768u,55212u,138442752u,67108864u}/* 303E */, /*10759*/{0,848u,65537u,102803483u,40u,1610612768u,55220u,138442752u,67108864u}/* 303F */, /*10760*/{0,859u,2162689u,104890373u,73768u,3758096416u,1677849492u,138532864u,393216u}/* 3041 */, /*10761*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849492u,138541056u,393216u}/* 3042 */, /*10762*/{0,859u,2162689u,104890373u,73768u,3758096416u,1677849500u,138532864u,393216u}/* 3043 */, /*10763*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849500u,138541056u,393216u}/* 3044 */, /*10764*/{0,859u,2162689u,104890373u,73768u,3758096416u,1677849508u,138532864u,393216u}/* 3045 */, /*10765*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849508u,138541056u,393216u}/* 3046 */, /*10766*/{0,859u,2162689u,104890373u,73768u,3758096416u,1677849524u,138532864u,393216u}/* 3047 */, /*10767*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849524u,138541056u,393216u}/* 3048 */, /*10768*/{0,859u,2162689u,104890373u,73768u,3758096416u,1677849532u,138532864u,393216u}/* 3049 */, /*10769*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849532u,138541056u,393216u}/* 304A */, /*10770*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849540u,138541056u,393216u}/* 304B */, /*10771*/{872939520u,859u,2162689u,102793253u,73768u,3758096416u,1677849540u,369238016u,393216u}/* 304C */, /*10772*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849548u,138541056u,393216u}/* 304D */, /*10773*/{873463808u,859u,2162689u,102793253u,73768u,3758096416u,1677849548u,369238016u,393216u}/* 304E */, /*10774*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849556u,138541056u,393216u}/* 304F */, /*10775*/{873988096u,859u,2162689u,102793253u,73768u,3758096416u,1677849556u,369238016u,393216u}/* 3050 */, /*10776*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849564u,138541056u,393216u}/* 3051 */, /*10777*/{874512384u,859u,2162689u,102793253u,73768u,3758096416u,1677849564u,369238016u,393216u}/* 3052 */, /*10778*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849572u,138541056u,393216u}/* 3053 */, /*10779*/{875036672u,859u,2162689u,102793253u,73768u,3758096416u,1677849572u,369238016u,393216u}/* 3054 */, /*10780*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849580u,138541056u,393216u}/* 3055 */, /*10781*/{875560960u,859u,2162689u,102793253u,73768u,3758096416u,1677849580u,369238016u,393216u}/* 3056 */, /*10782*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849588u,138541056u,393216u}/* 3057 */, /*10783*/{876085248u,859u,2162689u,102793253u,73768u,3758096416u,1677849588u,369238016u,393216u}/* 3058 */, /*10784*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849596u,138541056u,393216u}/* 3059 */, /*10785*/{876609536u,859u,2162689u,102793253u,73768u,3758096416u,1677849596u,369238016u,393216u}/* 305A */, /*10786*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849604u,138541056u,393216u}/* 305B */, /*10787*/{877133824u,859u,2162689u,102793253u,73768u,3758096416u,1677849604u,369238016u,393216u}/* 305C */, /*10788*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849612u,138541056u,393216u}/* 305D */, /*10789*/{877658112u,859u,2162689u,102793253u,73768u,3758096416u,1677849612u,369238016u,393216u}/* 305E */, /*10790*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849620u,138541056u,393216u}/* 305F */, /*10791*/{878182400u,859u,2162689u,102793253u,73768u,3758096416u,1677849620u,369238016u,393216u}/* 3060 */, /*10792*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849628u,138541056u,393216u}/* 3061 */, /*10793*/{878706688u,859u,2162689u,102793253u,73768u,3758096416u,1677849628u,369238016u,393216u}/* 3062 */, /*10794*/{0,859u,2162689u,104890373u,73768u,3758096416u,1677849636u,138532864u,393216u}/* 3063 */, /*10795*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849636u,138541056u,393216u}/* 3064 */, /*10796*/{879230976u,859u,2162689u,102793253u,73768u,3758096416u,1677849636u,369238016u,393216u}/* 3065 */, /*10797*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849644u,138541056u,393216u}/* 3066 */, /*10798*/{879755264u,859u,2162689u,102793253u,73768u,3758096416u,1677849644u,369238016u,393216u}/* 3067 */, /*10799*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849652u,138541056u,393216u}/* 3068 */, /*10800*/{880279552u,859u,2162689u,102793253u,73768u,3758096416u,1677849652u,369238016u,393216u}/* 3069 */, /*10801*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849660u,138541056u,393216u}/* 306A */, /*10802*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849668u,138541056u,393216u}/* 306B */, /*10803*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849676u,138541056u,393216u}/* 306C */, /*10804*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849684u,138541056u,393216u}/* 306D */, /*10805*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849692u,138541056u,393216u}/* 306E */, /*10806*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849700u,138541056u,393216u}/* 306F */, /*10807*/{880803840u,859u,2162689u,102793253u,73768u,3758096416u,1677849700u,369238016u,393216u}/* 3070 */, /*10808*/{881328128u,859u,2162689u,102793253u,73768u,3758096416u,1677849700u,373432320u,393216u}/* 3071 */, /*10809*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849708u,138541056u,393216u}/* 3072 */, /*10810*/{881852416u,859u,2162689u,102793253u,73768u,3758096416u,1677849708u,369238016u,393216u}/* 3073 */, /*10811*/{882376704u,859u,2162689u,102793253u,73768u,3758096416u,1677849708u,373432320u,393216u}/* 3074 */, /*10812*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849716u,138541056u,393216u}/* 3075 */, /*10813*/{882900992u,859u,2162689u,102793253u,73768u,3758096416u,1677849716u,369238016u,393216u}/* 3076 */, /*10814*/{883425280u,859u,2162689u,102793253u,73768u,3758096416u,1677849716u,373432320u,393216u}/* 3077 */, /*10815*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849724u,138541056u,393216u}/* 3078 */, /*10816*/{883949568u,859u,2162689u,102793253u,73768u,3758096416u,1677849724u,369238016u,393216u}/* 3079 */, /*10817*/{884473856u,859u,2162689u,102793253u,73768u,3758096416u,1677849724u,373432320u,393216u}/* 307A */, /*10818*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849732u,138541056u,393216u}/* 307B */, /*10819*/{884998144u,859u,2162689u,102793253u,73768u,3758096416u,1677849732u,369238016u,393216u}/* 307C */, /*10820*/{885522432u,859u,2162689u,102793253u,73768u,3758096416u,1677849732u,373432320u,393216u}/* 307D */, /*10821*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849740u,138541056u,393216u}/* 307E */, /*10822*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849748u,138541056u,393216u}/* 307F */, /*10823*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849756u,138541056u,393216u}/* 3080 */, /*10824*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849764u,138541056u,393216u}/* 3081 */, /*10825*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849772u,138541056u,393216u}/* 3082 */, /*10826*/{0,859u,2162689u,104890373u,73768u,3758096416u,1677849780u,138532864u,393216u}/* 3083 */, /*10827*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849780u,138541056u,393216u}/* 3084 */, /*10828*/{0,859u,2162689u,104890373u,73768u,3758096416u,1677849788u,138532864u,393216u}/* 3085 */, /*10829*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849788u,138541056u,393216u}/* 3086 */, /*10830*/{0,859u,2162689u,104890373u,73768u,3758096416u,1677849796u,138532864u,393216u}/* 3087 */, /*10831*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849796u,138541056u,393216u}/* 3088 */, /*10832*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849804u,138541056u,393216u}/* 3089 */, /*10833*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849812u,138541056u,393216u}/* 308A */, /*10834*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849820u,138541056u,393216u}/* 308B */, /*10835*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849828u,138541056u,393216u}/* 308C */, /*10836*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849836u,138541056u,393216u}/* 308D */, /*10837*/{0,859u,2162689u,104890373u,73768u,3758096416u,1677849844u,138532864u,393216u}/* 308E */, /*10838*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849844u,138541056u,393216u}/* 308F */, /*10839*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849852u,138541056u,393216u}/* 3090 */, /*10840*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849860u,138541056u,393216u}/* 3091 */, /*10841*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849868u,138541056u,393216u}/* 3092 */, /*10842*/{0,859u,2162689u,102793221u,73768u,3758096416u,1677849876u,138541056u,393216u}/* 3093 */, /*10843*/{886046720u,859u,2162689u,102793253u,73768u,3758096416u,1677849508u,369238016u,393216u}/* 3094 */, /*10844*/{0,859u,2162689u,105054213u,73768u,3758096416u,1677849540u,138532864u,393216u}/* 3095 */, /*10845*/{0,859u,2162689u,105054213u,73768u,3758096416u,1677849564u,138532864u,393216u}/* 3096 */, /*10846*/{0,859u,2686978u,269529094u,672030736u,1627398160u,1077936140u,234911744u,262144u}/* 3099 */, /*10847*/{0,859u,2686978u,269529094u,672030736u,1627398160u,1077936140u,239106048u,262144u}/* 309A */, /*10848*/{886571008u,859u,65537u,96512090u,1310752u,1627922464u,1610622276u,138440736u,67108864u}/* 309B */, /*10849*/{887095296u,859u,65537u,96512090u,1310752u,1627922464u,1610622284u,138440736u,67108864u}/* 309C */, /*10850*/{0,859u,2162689u,96501764u,73768u,3774873760u,1677779868u,138442752u,393216u}/* 309D */, /*10851*/{887619584u,859u,2162689u,96501796u,73768u,3774873760u,1677779868u,369139712u,393216u}/* 309E */, /*10852*/{888143872u,859u,2162689u,102957445u,73760u,3758620704u,1677977996u,273002496u,393216u}/* 309F */, /*10853*/{0,867u,65537u,96675859u,1310760u,1610678304u,4364u,138442754u,0}/* 30A0 */, /*10854*/{0,867u,2228225u,104890373u,1384488u,3758096416u,1677849492u,138549248u,393216u}/* 30A1 */, /*10855*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849492u,138565632u,393216u}/* 30A2 */, /*10856*/{0,867u,2228225u,104890373u,1384488u,3758096416u,1677849500u,138549248u,393216u}/* 30A3 */, /*10857*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849500u,138565632u,393216u}/* 30A4 */, /*10858*/{0,867u,2228225u,104890373u,1384488u,3758096416u,1677849508u,138549248u,393216u}/* 30A5 */, /*10859*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849508u,138565632u,393216u}/* 30A6 */, /*10860*/{0,867u,2228225u,104890373u,1384488u,3758096416u,1677849524u,138549248u,393216u}/* 30A7 */, /*10861*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849524u,138565632u,393216u}/* 30A8 */, /*10862*/{0,867u,2228225u,104890373u,1384488u,3758096416u,1677849532u,138549248u,393216u}/* 30A9 */, /*10863*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849532u,138565632u,393216u}/* 30AA */, /*10864*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849540u,138565632u,393216u}/* 30AB */, /*10865*/{888668160u,867u,2228225u,102793253u,1384488u,3758096416u,1677849540u,369262592u,393216u}/* 30AC */, /*10866*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849548u,138565632u,393216u}/* 30AD */, /*10867*/{889192448u,867u,2228225u,102793253u,1384488u,3758096416u,1677849548u,369262592u,393216u}/* 30AE */, /*10868*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849556u,138565632u,393216u}/* 30AF */, /*10869*/{889716736u,867u,2228225u,102793253u,1384488u,3758096416u,1677849556u,369262592u,393216u}/* 30B0 */, /*10870*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849564u,138565632u,393216u}/* 30B1 */, /*10871*/{890241024u,867u,2228225u,102793253u,1384488u,3758096416u,1677849564u,369262592u,393216u}/* 30B2 */, /*10872*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849572u,138565632u,393216u}/* 30B3 */, /*10873*/{890765312u,867u,2228225u,102793253u,1384488u,3758096416u,1677849572u,369262592u,393216u}/* 30B4 */, /*10874*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849580u,138565632u,393216u}/* 30B5 */, /*10875*/{891289600u,867u,2228225u,102793253u,1384488u,3758096416u,1677849580u,369262592u,393216u}/* 30B6 */, /*10876*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849588u,138565632u,393216u}/* 30B7 */, /*10877*/{891813888u,867u,2228225u,102793253u,1384488u,3758096416u,1677849588u,369262592u,393216u}/* 30B8 */, /*10878*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849596u,138565632u,393216u}/* 30B9 */, /*10879*/{892338176u,867u,2228225u,102793253u,1384488u,3758096416u,1677849596u,369262592u,393216u}/* 30BA */, /*10880*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849604u,138565632u,393216u}/* 30BB */, /*10881*/{892862464u,867u,2228225u,102793253u,1384488u,3758096416u,1677849604u,369262592u,393216u}/* 30BC */, /*10882*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849612u,138565632u,393216u}/* 30BD */, /*10883*/{893386752u,867u,2228225u,102793253u,1384488u,3758096416u,1677849612u,369262592u,393216u}/* 30BE */, /*10884*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849620u,138565632u,393216u}/* 30BF */, /*10885*/{893911040u,867u,2228225u,102793253u,1384488u,3758096416u,1677849620u,369262592u,393216u}/* 30C0 */, /*10886*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849628u,138565632u,393216u}/* 30C1 */, /*10887*/{894435328u,867u,2228225u,102793253u,1384488u,3758096416u,1677849628u,369262592u,393216u}/* 30C2 */, /*10888*/{0,867u,2228225u,104890373u,1384488u,3758096416u,1677849636u,138549248u,393216u}/* 30C3 */, /*10889*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849636u,138565632u,393216u}/* 30C4 */, /*10890*/{894959616u,867u,2228225u,102793253u,1384488u,3758096416u,1677849636u,369262592u,393216u}/* 30C5 */, /*10891*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849644u,138565632u,393216u}/* 30C6 */, /*10892*/{895483904u,867u,2228225u,102793253u,1384488u,3758096416u,1677849644u,369262592u,393216u}/* 30C7 */, /*10893*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849652u,138565632u,393216u}/* 30C8 */, /*10894*/{896008192u,867u,2228225u,102793253u,1384488u,3758096416u,1677849652u,369262592u,393216u}/* 30C9 */, /*10895*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849660u,138565632u,393216u}/* 30CA */, /*10896*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849668u,138565632u,393216u}/* 30CB */, /*10897*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849676u,138565632u,393216u}/* 30CC */, /*10898*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849684u,138565632u,393216u}/* 30CD */, /*10899*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849692u,138565632u,393216u}/* 30CE */, /*10900*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849700u,138565632u,393216u}/* 30CF */, /*10901*/{896532480u,867u,2228225u,102793253u,1384488u,3758096416u,1677849700u,369262592u,393216u}/* 30D0 */, /*10902*/{897056768u,867u,2228225u,102793253u,1384488u,3758096416u,1677849700u,373456896u,393216u}/* 30D1 */, /*10903*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849708u,138565632u,393216u}/* 30D2 */, /*10904*/{897581056u,867u,2228225u,102793253u,1384488u,3758096416u,1677849708u,369262592u,393216u}/* 30D3 */, /*10905*/{898105344u,867u,2228225u,102793253u,1384488u,3758096416u,1677849708u,373456896u,393216u}/* 30D4 */, /*10906*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849716u,138565632u,393216u}/* 30D5 */, /*10907*/{898629632u,867u,2228225u,102793253u,1384488u,3758096416u,1677849716u,369262592u,393216u}/* 30D6 */, /*10908*/{899153920u,867u,2228225u,102793253u,1384488u,3758096416u,1677849716u,373456896u,393216u}/* 30D7 */, /*10909*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849724u,138565632u,393216u}/* 30D8 */, /*10910*/{899678208u,867u,2228225u,102793253u,1384488u,3758096416u,1677849724u,369262592u,393216u}/* 30D9 */, /*10911*/{900202496u,867u,2228225u,102793253u,1384488u,3758096416u,1677849724u,373456896u,393216u}/* 30DA */, /*10912*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849732u,138565632u,393216u}/* 30DB */, /*10913*/{900726784u,867u,2228225u,102793253u,1384488u,3758096416u,1677849732u,369262592u,393216u}/* 30DC */, /*10914*/{901251072u,867u,2228225u,102793253u,1384488u,3758096416u,1677849732u,373456896u,393216u}/* 30DD */, /*10915*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849740u,138565632u,393216u}/* 30DE */, /*10916*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849748u,138565632u,393216u}/* 30DF */, /*10917*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849756u,138565632u,393216u}/* 30E0 */, /*10918*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849764u,138565632u,393216u}/* 30E1 */, /*10919*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849772u,138565632u,393216u}/* 30E2 */, /*10920*/{0,867u,2228225u,104890373u,1384488u,3758096416u,1677849780u,138549248u,393216u}/* 30E3 */, /*10921*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849780u,138565632u,393216u}/* 30E4 */, /*10922*/{0,867u,2228225u,104890373u,1384488u,3758096416u,1677849788u,138549248u,393216u}/* 30E5 */, /*10923*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849788u,138565632u,393216u}/* 30E6 */, /*10924*/{0,867u,2228225u,104890373u,1384488u,3758096416u,1677849796u,138549248u,393216u}/* 30E7 */, /*10925*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849796u,138565632u,393216u}/* 30E8 */, /*10926*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849804u,138565632u,393216u}/* 30E9 */, /*10927*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849812u,138565632u,393216u}/* 30EA */, /*10928*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849820u,138565632u,393216u}/* 30EB */, /*10929*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849828u,138565632u,393216u}/* 30EC */, /*10930*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849836u,138565632u,393216u}/* 30ED */, /*10931*/{0,867u,2228225u,104890373u,1384488u,3758096416u,1677849844u,138549248u,393216u}/* 30EE */, /*10932*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849844u,138565632u,393216u}/* 30EF */, /*10933*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849852u,138565632u,393216u}/* 30F0 */, /*10934*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849860u,138565632u,393216u}/* 30F1 */, /*10935*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849868u,138565632u,393216u}/* 30F2 */, /*10936*/{0,867u,2228225u,102793221u,1384488u,3758096416u,1677849876u,138565632u,393216u}/* 30F3 */, /*10937*/{901775360u,867u,2228225u,102793253u,1384488u,3758096416u,1677849508u,369262592u,393216u}/* 30F4 */, /*10938*/{0,867u,2228225u,104890373u,1384488u,3758096416u,1677849540u,138549248u,393216u}/* 30F5 */, /*10939*/{0,867u,2228225u,104890373u,1384488u,3758096416u,1677849564u,138549248u,393216u}/* 30F6 */, /*10940*/{902299648u,867u,2228225u,102793253u,1384488u,3758096416u,1677849844u,369262592u,393216u}/* 30F7 */, /*10941*/{902823936u,867u,2228225u,102793253u,1384488u,3758096416u,1677849852u,369262592u,393216u}/* 30F8 */, /*10942*/{903348224u,867u,2228225u,102793253u,1384488u,3758096416u,1677849860u,369262592u,393216u}/* 30F9 */, /*10943*/{903872512u,867u,2228225u,102793253u,1384488u,3758096416u,1677849868u,369262592u,393216u}/* 30FA */, /*10944*/{0,867u,65537u,96512023u,40u,1610612770u,4372u,138442754u,0}/* 30FB */, /*10945*/{0,867u,65537u,104890372u,1384488u,3774881952u,1677779876u,138442752u,393216u}/* 30FC */, /*10946*/{0,867u,2228225u,96501764u,1384488u,3774873760u,1677779884u,138442752u,393216u}/* 30FD */, /*10947*/{904396800u,867u,2228225u,96501796u,1384488u,3774873760u,1677779884u,369139712u,393216u}/* 30FE */, /*10948*/{904921088u,867u,2228225u,102957445u,1384480u,3758620704u,1677977612u,273002496u,393216u}/* 30FF */, /*10949*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852172u,138442752u,393216u}/* 3105 */, /*10950*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852180u,138442752u,393216u}/* 3106 */, /*10951*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852188u,138442752u,393216u}/* 3107 */, /*10952*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852196u,138442752u,393216u}/* 3108 */, /*10953*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852212u,138442752u,393216u}/* 3109 */, /*10954*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852220u,138442752u,393216u}/* 310A */, /*10955*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852228u,138442752u,393216u}/* 310B */, /*10956*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852236u,138442752u,393216u}/* 310C */, /*10957*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852244u,138442752u,393216u}/* 310D */, /*10958*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852252u,138442752u,393216u}/* 310E */, /*10959*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852276u,138442752u,393216u}/* 310F */, /*10960*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852284u,138442752u,393216u}/* 3110 */, /*10961*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852292u,138442752u,393216u}/* 3111 */, /*10962*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852300u,138442752u,393216u}/* 3112 */, /*10963*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852316u,138442752u,393216u}/* 3113 */, /*10964*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852324u,138442752u,393216u}/* 3114 */, /*10965*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852332u,138442752u,393216u}/* 3115 */, /*10966*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852340u,138442752u,393216u}/* 3116 */, /*10967*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852348u,138442752u,393216u}/* 3117 */, /*10968*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852356u,138442752u,393216u}/* 3118 */, /*10969*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852364u,138442752u,393216u}/* 3119 */, /*10970*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852396u,138442752u,393216u}/* 311A */, /*10971*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852404u,138442752u,393216u}/* 311B */, /*10972*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852420u,138442752u,393216u}/* 311C */, /*10973*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852428u,138442752u,393216u}/* 311D */, /*10974*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852444u,138442752u,393216u}/* 311E */, /*10975*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852452u,138442752u,393216u}/* 311F */, /*10976*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852460u,138442752u,393216u}/* 3120 */, /*10977*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852468u,138442752u,393216u}/* 3121 */, /*10978*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852476u,138442752u,393216u}/* 3122 */, /*10979*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852484u,138442752u,393216u}/* 3123 */, /*10980*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852492u,138442752u,393216u}/* 3124 */, /*10981*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852508u,138442752u,393216u}/* 3125 */, /*10982*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852540u,138442752u,393216u}/* 3126 */, /*10983*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852548u,138442752u,393216u}/* 3127 */, /*10984*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852556u,138442752u,393216u}/* 3128 */, /*10985*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852564u,138442752u,393216u}/* 3129 */, /*10986*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852204u,138442752u,393216u}/* 312A */, /*10987*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852260u,138442752u,393216u}/* 312B */, /*10988*/{0,875u,2293761u,102793221u,1515560u,3758096416u,1677852308u,138442752u,393216u}/* 312C */, /*10989*/{0,875u,2293761u,103088133u,1515560u,3758096416u,1677852572u,138442752u,393216u}/* 312D */, /*10990*/{0,875u,2293761u,103383045u,1515560u,3758096416u,1677852420u,138459136u,393216u}/* 312E */, /*10991*/{905445376u,883u,1638401u,102793285u,1515552u,3758620704u,1677846636u,138457088u,393216u}/* 3131 */, /*10992*/{905969664u,883u,1638401u,102793285u,1515552u,3758620704u,1677846644u,138457088u,393216u}/* 3132 */, /*10993*/{906493952u,883u,1638401u,102793285u,1515552u,3758620704u,1677848412u,138457088u,393216u}/* 3133 */, /*10994*/{907018240u,883u,1638401u,102793285u,1515552u,3758620704u,1677846652u,138457088u,393216u}/* 3134 */, /*10995*/{907542528u,883u,1638401u,102793285u,1515552u,3758620704u,1677848428u,138457088u,393216u}/* 3135 */, /*10996*/{908066816u,883u,1638401u,102793285u,1515552u,3758620704u,1677848436u,138457088u,393216u}/* 3136 */, /*10997*/{908591104u,883u,1638401u,102793285u,1515552u,3758620704u,1677846660u,138457088u,393216u}/* 3137 */, /*10998*/{909115392u,883u,1638401u,102793285u,1515552u,3758620704u,1677846668u,138457088u,393216u}/* 3138 */, /*10999*/{909639680u,883u,1638401u,102793285u,1515552u,3758620704u,1677846676u,138457088u,393216u}/* 3139 */, /*11000*/{910163968u,883u,1638401u,102793285u,1515552u,3758620704u,1677848460u,138457088u,393216u}/* 313A */, /*11001*/{910688256u,883u,1638401u,102793285u,1515552u,3758620704u,1677848468u,138457088u,393216u}/* 313B */, /*11002*/{911212544u,883u,1638401u,102793285u,1515552u,3758620704u,1677848476u,138457088u,393216u}/* 313C */, /*11003*/{911736832u,883u,1638401u,102793285u,1515552u,3758620704u,1677848484u,138457088u,393216u}/* 313D */, /*11004*/{912261120u,883u,1638401u,102793285u,1515552u,3758620704u,1677848492u,138457088u,393216u}/* 313E */, /*11005*/{912785408u,883u,1638401u,102793285u,1515552u,3758620704u,1677848500u,138457088u,393216u}/* 313F */, /*11006*/{913309696u,883u,1638401u,102793285u,1515552u,3758620704u,1677846844u,138457088u,393216u}/* 3140 */, /*11007*/{913833984u,883u,1638401u,102793285u,1515552u,3758620704u,1677846684u,138457088u,393216u}/* 3141 */, /*11008*/{914358272u,883u,1638401u,102793285u,1515552u,3758620704u,1677846692u,138457088u,393216u}/* 3142 */, /*11009*/{914882560u,883u,1638401u,102793285u,1515552u,3758620704u,1677846700u,138457088u,393216u}/* 3143 */, /*11010*/{915406848u,883u,1638401u,102793285u,1515552u,3758620704u,1677846900u,138457088u,393216u}/* 3144 */, /*11011*/{915931136u,883u,1638401u,102793285u,1515552u,3758620704u,1677846708u,138457088u,393216u}/* 3145 */, /*11012*/{916455424u,883u,1638401u,102793285u,1515552u,3758620704u,1677846716u,138457088u,393216u}/* 3146 */, /*11013*/{916979712u,883u,1638401u,102793285u,1515552u,3758620704u,1677846724u,138457088u,393216u}/* 3147 */, /*11014*/{917504000u,883u,1638401u,102793285u,1515552u,3758620704u,1677846732u,138457088u,393216u}/* 3148 */, /*11015*/{918028288u,883u,1638401u,102793285u,1515552u,3758620704u,1677846740u,138457088u,393216u}/* 3149 */, /*11016*/{918552576u,883u,1638401u,102793285u,1515552u,3758620704u,1677846748u,138457088u,393216u}/* 314A */, /*11017*/{919076864u,883u,1638401u,102793285u,1515552u,3758620704u,1677846756u,138457088u,393216u}/* 314B */, /*11018*/{919601152u,883u,1638401u,102793285u,1515552u,3758620704u,1677846764u,138457088u,393216u}/* 314C */, /*11019*/{920125440u,883u,1638401u,102793285u,1515552u,3758620704u,1677846772u,138457088u,393216u}/* 314D */, /*11020*/{920649728u,883u,1638401u,102793285u,1515552u,3758620704u,1677846780u,138457088u,393216u}/* 314E */, /*11021*/{921174016u,883u,1638401u,102793285u,1515552u,3758620704u,1677847644u,138457088u,393216u}/* 314F */, /*11022*/{921698304u,883u,1638401u,102793285u,1515552u,3758620704u,1677847652u,138457088u,393216u}/* 3150 */, /*11023*/{922222592u,883u,1638401u,102793285u,1515552u,3758620704u,1677847660u,138457088u,393216u}/* 3151 */, /*11024*/{922746880u,883u,1638401u,102793285u,1515552u,3758620704u,1677847668u,138457088u,393216u}/* 3152 */, /*11025*/{923271168u,883u,1638401u,102793285u,1515552u,3758620704u,1677847676u,138457088u,393216u}/* 3153 */, /*11026*/{923795456u,883u,1638401u,102793285u,1515552u,3758620704u,1677847684u,138457088u,393216u}/* 3154 */, /*11027*/{924319744u,883u,1638401u,102793285u,1515552u,3758620704u,1677847692u,138457088u,393216u}/* 3155 */, /*11028*/{924844032u,883u,1638401u,102793285u,1515552u,3758620704u,1677847700u,138457088u,393216u}/* 3156 */, /*11029*/{925368320u,883u,1638401u,102793285u,1515552u,3758620704u,1677847708u,138457088u,393216u}/* 3157 */, /*11030*/{925892608u,883u,1638401u,102793285u,1515552u,3758620704u,1677847716u,138457088u,393216u}/* 3158 */, /*11031*/{926416896u,883u,1638401u,102793285u,1515552u,3758620704u,1677847724u,138457088u,393216u}/* 3159 */, /*11032*/{926941184u,883u,1638401u,102793285u,1515552u,3758620704u,1677847732u,138457088u,393216u}/* 315A */, /*11033*/{927465472u,883u,1638401u,102793285u,1515552u,3758620704u,1677847740u,138457088u,393216u}/* 315B */, /*11034*/{927989760u,883u,1638401u,102793285u,1515552u,3758620704u,1677847748u,138457088u,393216u}/* 315C */, /*11035*/{928514048u,883u,1638401u,102793285u,1515552u,3758620704u,1677847756u,138457088u,393216u}/* 315D */, /*11036*/{929038336u,883u,1638401u,102793285u,1515552u,3758620704u,1677847764u,138457088u,393216u}/* 315E */, /*11037*/{929562624u,883u,1638401u,102793285u,1515552u,3758620704u,1677847772u,138457088u,393216u}/* 315F */, /*11038*/{930086912u,883u,1638401u,102793285u,1515552u,3758620704u,1677847780u,138457088u,393216u}/* 3160 */, /*11039*/{930611200u,883u,1638401u,102793285u,1515552u,3758620704u,1677847788u,138457088u,393216u}/* 3161 */, /*11040*/{931135488u,883u,1638401u,102793285u,1515552u,3758620704u,1677847796u,138457088u,393216u}/* 3162 */, /*11041*/{931659776u,883u,1638401u,102793285u,1515552u,3758620704u,1677847804u,138457088u,393216u}/* 3163 */, /*11042*/{932184064u,883u,1638401u,102793285u,1515552u,3758653472u,1677847636u,138457344u,393216u}/* 3164 */, /*11043*/{932708352u,883u,1638401u,102793285u,1515552u,3758620704u,1677846796u,138457088u,393216u}/* 3165 */, /*11044*/{933232640u,883u,1638401u,102793285u,1515552u,3758620704u,1677846804u,138457088u,393216u}/* 3166 */, /*11045*/{933756928u,883u,1638401u,102793285u,1515552u,3758620704u,1677848644u,138457088u,393216u}/* 3167 */, /*11046*/{934281216u,883u,1638401u,102793285u,1515552u,3758620704u,1677848652u,138457088u,393216u}/* 3168 */, /*11047*/{934805504u,883u,1638401u,102793285u,1515552u,3758620704u,1677848684u,138457088u,393216u}/* 3169 */, /*11048*/{935329792u,883u,1638401u,102793285u,1515552u,3758620704u,1677848700u,138457088u,393216u}/* 316A */, /*11049*/{935854080u,883u,1638401u,102793285u,1515552u,3758620704u,1677848740u,138457088u,393216u}/* 316B */, /*11050*/{936378368u,883u,1638401u,102793285u,1515552u,3758620704u,1677848772u,138457088u,393216u}/* 316C */, /*11051*/{936902656u,883u,1638401u,102793285u,1515552u,3758620704u,1677848788u,138457088u,393216u}/* 316D */, /*11052*/{937426944u,883u,1638401u,102793285u,1515552u,3758620704u,1677846860u,138457088u,393216u}/* 316E */, /*11053*/{937951232u,883u,1638401u,102793285u,1515552u,3758620704u,1677848820u,138457088u,393216u}/* 316F */, /*11054*/{938475520u,883u,1638401u,102793285u,1515552u,3758620704u,1677848836u,138457088u,393216u}/* 3170 */, /*11055*/{938999808u,883u,1638401u,102793285u,1515552u,3758620704u,1677846868u,138457088u,393216u}/* 3171 */, /*11056*/{939524096u,883u,1638401u,102793285u,1515552u,3758620704u,1677846876u,138457088u,393216u}/* 3172 */, /*11057*/{940048384u,883u,1638401u,102793285u,1515552u,3758620704u,1677846892u,138457088u,393216u}/* 3173 */, /*11058*/{940572672u,883u,1638401u,102793285u,1515552u,3758620704u,1677846908u,138457088u,393216u}/* 3174 */, /*11059*/{941096960u,883u,1638401u,102793285u,1515552u,3758620704u,1677846916u,138457088u,393216u}/* 3175 */, /*11060*/{941621248u,883u,1638401u,102793285u,1515552u,3758620704u,1677846948u,138457088u,393216u}/* 3176 */, /*11061*/{942145536u,883u,1638401u,102793285u,1515552u,3758620704u,1677846964u,138457088u,393216u}/* 3177 */, /*11062*/{942669824u,883u,1638401u,102793285u,1515552u,3758620704u,1677846980u,138457088u,393216u}/* 3178 */, /*11063*/{943194112u,883u,1638401u,102793285u,1515552u,3758620704u,1677846988u,138457088u,393216u}/* 3179 */, /*11064*/{943718400u,883u,1638401u,102793285u,1515552u,3758620704u,1677846996u,138457088u,393216u}/* 317A */, /*11065*/{944242688u,883u,1638401u,102793285u,1515552u,3758620704u,1677847004u,138457088u,393216u}/* 317B */, /*11066*/{944766976u,883u,1638401u,102793285u,1515552u,3758620704u,1677847012u,138457088u,393216u}/* 317C */, /*11067*/{945291264u,883u,1638401u,102793285u,1515552u,3758620704u,1677847036u,138457088u,393216u}/* 317D */, /*11068*/{945815552u,883u,1638401u,102793285u,1515552u,3758620704u,1677847068u,138457088u,393216u}/* 317E */, /*11069*/{946339840u,883u,1638401u,102793285u,1515552u,3758620704u,1677847148u,138457088u,393216u}/* 317F */, /*11070*/{946864128u,883u,1638401u,102793285u,1515552u,3758620704u,1677847204u,138457088u,393216u}/* 3180 */, /*11071*/{947388416u,883u,1638401u,102793285u,1515552u,3758620704u,1677847244u,138457088u,393216u}/* 3181 */, /*11072*/{947912704u,883u,1638401u,102793285u,1515552u,3758620704u,1677848980u,138457088u,393216u}/* 3182 */, /*11073*/{948436992u,883u,1638401u,102793285u,1515552u,3758620704u,1677848988u,138457088u,393216u}/* 3183 */, /*11074*/{948961280u,883u,1638401u,102793285u,1515552u,3758620704u,1677847332u,138457088u,393216u}/* 3184 */, /*11075*/{949485568u,883u,1638401u,102793285u,1515552u,3758620704u,1677847340u,138457088u,393216u}/* 3185 */, /*11076*/{950009856u,883u,1638401u,102793285u,1515552u,3758620704u,1677847348u,138457088u,393216u}/* 3186 */, /*11077*/{950534144u,883u,1638401u,102793285u,1515552u,3758620704u,1677847924u,138457088u,393216u}/* 3187 */, /*11078*/{951058432u,883u,1638401u,102793285u,1515552u,3758620704u,1677847932u,138457088u,393216u}/* 3188 */, /*11079*/{951582720u,883u,1638401u,102793285u,1515552u,3758620704u,1677847956u,138457088u,393216u}/* 3189 */, /*11080*/{952107008u,883u,1638401u,102793285u,1515552u,3758620704u,1677848028u,138457088u,393216u}/* 318A */, /*11081*/{952631296u,883u,1638401u,102793285u,1515552u,3758620704u,1677848036u,138457088u,393216u}/* 318B */, /*11082*/{953155584u,883u,1638401u,102793285u,1515552u,3758620704u,1677848052u,138457088u,393216u}/* 318C */, /*11083*/{953679872u,883u,1638401u,102793285u,1515552u,3758620704u,1677848132u,138457088u,393216u}/* 318D */, /*11084*/{954204160u,883u,1638401u,102793285u,1515552u,3758620704u,1677848156u,138457088u,393216u}/* 318E */, /*11085*/{0,891u,65537u,102793243u,40u,1610612768u,55228u,138442752u,67108864u}/* 3190 */, /*11086*/{0,891u,65537u,102793243u,40u,1610612768u,55236u,138442752u,67108864u}/* 3191 */, /*11087*/{954728448u,891u,536937985u,102793547u,8388642u,1611137056u,936461u,138588160u,0}/* 3192 */, /*11088*/{955252736u,891u,570493441u,102793547u,8388642u,1611137056u,937581u,138588160u,0}/* 3193 */, /*11089*/{955777024u,891u,604047361u,102793547u,8388642u,1611137056u,936533u,138588160u,0}/* 3194 */, /*11090*/{956301312u,891u,637603841u,102793547u,8388642u,1611137056u,954597u,138588160u,0}/* 3195 */, /*11091*/{956825600u,891u,65537u,102793563u,32u,1611137056u,936540u,138588160u,67108864u}/* 3196 */, /*11092*/{957349888u,891u,65537u,102793563u,32u,1611137056u,936820u,138588160u,67108864u}/* 3197 */, /*11093*/{957874176u,891u,65537u,102793563u,32u,1611137056u,936548u,138588160u,67108864u}/* 3198 */, /*11094*/{958398464u,891u,65537u,102793563u,32u,1611137056u,1016732u,138588160u,67108864u}/* 3199 */, /*11095*/{958922752u,891u,65537u,102793563u,32u,1611137056u,937172u,138588160u,67108864u}/* 319A */, /*11096*/{959447040u,891u,65537u,102793563u,32u,1611137056u,936660u,138588160u,67108864u}/* 319B */, /*11097*/{959971328u,891u,65537u,102793563u,32u,1611137056u,936468u,138588160u,67108864u}/* 319C */, /*11098*/{960495616u,891u,65537u,102793563u,32u,1611137056u,959316u,138588160u,67108864u}/* 319D */, /*11099*/{961019904u,891u,65537u,102793563u,32u,1611137056u,955276u,138588160u,67108864u}/* 319E */, /*11100*/{961544192u,891u,65537u,102793563u,32u,1611137056u,937948u,138588160u,67108864u}/* 319F */, /*11101*/{0,899u,2293761u,102891525u,1515560u,3758096416u,1677852172u,1287731200u,393216u}/* 31A0 */, /*11102*/{0,899u,2293761u,102891525u,1515560u,3758096416u,1677852348u,1287731200u,393216u}/* 31A1 */, /*11103*/{0,899u,2293761u,102891525u,1515560u,3758096416u,1677852284u,1287731200u,393216u}/* 31A2 */, /*11104*/{0,899u,2293761u,102891525u,1515560u,3758096416u,1677852244u,1287731200u,393216u}/* 31A3 */, /*11105*/{0,899u,2293761u,102891525u,1515560u,3758096416u,1677852436u,138442752u,393216u}/* 31A4 */, /*11106*/{0,899u,2293761u,102891525u,1515560u,3758096416u,1677852436u,1287731200u,393216u}/* 31A5 */, /*11107*/{0,899u,2293761u,102891525u,1515560u,3758096416u,1677852412u,138442752u,393216u}/* 31A6 */, /*11108*/{0,899u,2293761u,102891525u,1515560u,3758096416u,1677852404u,1287731200u,393216u}/* 31A7 */, /*11109*/{0,899u,2293761u,102891525u,1515560u,3758096416u,1677852556u,1291925504u,393216u}/* 31A8 */, /*11110*/{0,899u,2293761u,102891525u,1515560u,3758096416u,1677852396u,1287731200u,393216u}/* 31A9 */, /*11111*/{0,899u,2293761u,102891525u,1515560u,3758096416u,1677852548u,1287731200u,393216u}/* 31AA */, /*11112*/{0,899u,2293761u,102891525u,1515560u,3758096416u,1677852556u,1287731200u,393216u}/* 31AB */, /*11113*/{0,899u,2293761u,102891525u,1515560u,3758096416u,1677852532u,138442752u,393216u}/* 31AC */, /*11114*/{0,899u,2293761u,102891525u,1515560u,3758096416u,1677852268u,138442752u,393216u}/* 31AD */, /*11115*/{0,899u,2293761u,102891525u,1515560u,3758096416u,1677852444u,1287731200u,393216u}/* 31AE */, /*11116*/{0,899u,2293761u,102891525u,1515560u,3758096416u,1677852460u,1287731200u,393216u}/* 31AF */, /*11117*/{0,899u,2293761u,102891525u,1515560u,3758096416u,1677852516u,138442752u,393216u}/* 31B0 */, /*11118*/{0,899u,2293761u,102891525u,1515560u,3758096416u,1677852524u,138442752u,393216u}/* 31B1 */, /*11119*/{0,899u,2293761u,102891525u,1515560u,3758096416u,1677852500u,138442752u,393216u}/* 31B2 */, /*11120*/{0,899u,2293761u,102891525u,1515560u,3758096416u,1677852548u,1288026112u,393216u}/* 31B3 */, /*11121*/{0,899u,2293761u,102891525u,1515560u,3758096416u,1677852180u,138631168u,393216u}/* 31B4 */, /*11122*/{0,899u,2293761u,102891525u,1515560u,3758096416u,1677852220u,138631168u,393216u}/* 31B5 */, /*11123*/{0,899u,2293761u,102891525u,1515560u,3758096416u,1677852252u,138631168u,393216u}/* 31B6 */, /*11124*/{0,899u,2293761u,102891525u,1515560u,3758096416u,1677852276u,138631168u,393216u}/* 31B7 */, /*11125*/{0,899u,2293761u,103153669u,1515560u,3758096416u,1677852372u,138442752u,393216u}/* 31B8 */, /*11126*/{0,899u,2293761u,103153669u,1515560u,3758096416u,1677852380u,138442752u,393216u}/* 31B9 */, /*11127*/{0,899u,2293761u,103153669u,1515560u,3758096416u,1677852388u,138442752u,393216u}/* 31BA */, /*11128*/{0,907u,65537u,103032859u,40u,1610612768u,54884u,138442752u,67108864u}/* 31C0 */, /*11129*/{0,907u,65537u,103032859u,40u,1610612768u,54892u,138442752u,67108864u}/* 31C1 */, /*11130*/{0,907u,65537u,103032859u,40u,1610612768u,54900u,138442752u,67108864u}/* 31C2 */, /*11131*/{0,907u,65537u,103032859u,40u,1610612768u,54908u,138442752u,67108864u}/* 31C3 */, /*11132*/{0,907u,65537u,103032859u,40u,1610612768u,54916u,138442752u,67108864u}/* 31C4 */, /*11133*/{0,907u,65537u,103032859u,40u,1610612768u,54924u,138442752u,67108864u}/* 31C5 */, /*11134*/{0,907u,65537u,103032859u,40u,1610612768u,54932u,138442752u,67108864u}/* 31C6 */, /*11135*/{0,907u,65537u,103032859u,40u,1610612768u,54940u,138442752u,67108864u}/* 31C7 */, /*11136*/{0,907u,65537u,103032859u,40u,1610612768u,54948u,138442752u,67108864u}/* 31C8 */, /*11137*/{0,907u,65537u,103032859u,40u,1610612768u,54956u,138442752u,67108864u}/* 31C9 */, /*11138*/{0,907u,65537u,103032859u,40u,1610612768u,54964u,138442752u,67108864u}/* 31CA */, /*11139*/{0,907u,65537u,103032859u,40u,1610612768u,54972u,138442752u,67108864u}/* 31CB */, /*11140*/{0,907u,65537u,103032859u,40u,1610612768u,54980u,138442752u,67108864u}/* 31CC */, /*11141*/{0,907u,65537u,103032859u,40u,1610612768u,54988u,138442752u,67108864u}/* 31CD */, /*11142*/{0,907u,65537u,103032859u,40u,1610612768u,54996u,138442752u,67108864u}/* 31CE */, /*11143*/{0,907u,65537u,103032859u,40u,1610612768u,55004u,138442752u,67108864u}/* 31CF */, /*11144*/{0,907u,65537u,103098395u,40u,1610612768u,55012u,138442752u,67108864u}/* 31D0 */, /*11145*/{0,907u,65537u,103098395u,40u,1610612768u,55020u,138442752u,67108864u}/* 31D1 */, /*11146*/{0,907u,65537u,103098395u,40u,1610612768u,55028u,138442752u,67108864u}/* 31D2 */, /*11147*/{0,907u,65537u,103098395u,40u,1610612768u,55036u,138442752u,67108864u}/* 31D3 */, /*11148*/{0,907u,65537u,103098395u,40u,1610612768u,55044u,138442752u,67108864u}/* 31D4 */, /*11149*/{0,907u,65537u,103098395u,40u,1610612768u,55052u,138442752u,67108864u}/* 31D5 */, /*11150*/{0,907u,65537u,103098395u,40u,1610612768u,55060u,138442752u,67108864u}/* 31D6 */, /*11151*/{0,907u,65537u,103098395u,40u,1610612768u,55068u,138442752u,67108864u}/* 31D7 */, /*11152*/{0,907u,65537u,103098395u,40u,1610612768u,55076u,138442752u,67108864u}/* 31D8 */, /*11153*/{0,907u,65537u,103098395u,40u,1610612768u,55084u,138442752u,67108864u}/* 31D9 */, /*11154*/{0,907u,65537u,103098395u,40u,1610612768u,55092u,138442752u,67108864u}/* 31DA */, /*11155*/{0,907u,65537u,103098395u,40u,1610612768u,55100u,138442752u,67108864u}/* 31DB */, /*11156*/{0,907u,65537u,103098395u,40u,1610612768u,55108u,138442752u,67108864u}/* 31DC */, /*11157*/{0,907u,65537u,103098395u,40u,1610612768u,55116u,138442752u,67108864u}/* 31DD */, /*11158*/{0,907u,65537u,103098395u,40u,1610612768u,55124u,138442752u,67108864u}/* 31DE */, /*11159*/{0,907u,65537u,103098395u,40u,1610612768u,55132u,138442752u,67108864u}/* 31DF */, /*11160*/{0,907u,65537u,103098395u,40u,1610612768u,55140u,138442752u,67108864u}/* 31E0 */, /*11161*/{0,907u,65537u,103098395u,40u,1610612768u,55148u,138442752u,67108864u}/* 31E1 */, /*11162*/{0,907u,65537u,103098395u,40u,1610612768u,55156u,138442752u,67108864u}/* 31E2 */, /*11163*/{0,907u,65537u,103098395u,40u,1610612768u,55164u,138442752u,67108864u}/* 31E3 */, /*11164*/{0,915u,2228225u,105054213u,1384488u,3758096416u,1677849556u,138549248u,393216u}/* 31F0 */, /*11165*/{0,915u,2228225u,105054213u,1384488u,3758096416u,1677849588u,138549248u,393216u}/* 31F1 */, /*11166*/{0,915u,2228225u,105054213u,1384488u,3758096416u,1677849596u,138549248u,393216u}/* 31F2 */, /*11167*/{0,915u,2228225u,105054213u,1384488u,3758096416u,1677849652u,138549248u,393216u}/* 31F3 */, /*11168*/{0,915u,2228225u,105054213u,1384488u,3758096416u,1677849676u,138549248u,393216u}/* 31F4 */, /*11169*/{0,915u,2228225u,105054213u,1384488u,3758096416u,1677849700u,138549248u,393216u}/* 31F5 */, /*11170*/{0,915u,2228225u,105054213u,1384488u,3758096416u,1677849708u,138549248u,393216u}/* 31F6 */, /*11171*/{0,915u,2228225u,105054213u,1384488u,3758096416u,1677849716u,138549248u,393216u}/* 31F7 */, /*11172*/{0,915u,2228225u,105054213u,1384488u,3758096416u,1677849724u,138549248u,393216u}/* 31F8 */, /*11173*/{0,915u,2228225u,105054213u,1384488u,3758096416u,1677849732u,138549248u,393216u}/* 31F9 */, /*11174*/{0,915u,2228225u,105054213u,1384488u,3758096416u,1677849756u,138549248u,393216u}/* 31FA */, /*11175*/{0,915u,2228225u,105054213u,1384488u,3758096416u,1677849804u,138549248u,393216u}/* 31FB */, /*11176*/{0,915u,2228225u,105054213u,1384488u,3758096416u,1677849812u,138549248u,393216u}/* 31FC */, /*11177*/{0,915u,2228225u,105054213u,1384488u,3758096416u,1677849820u,138549248u,393216u}/* 31FD */, /*11178*/{0,915u,2228225u,105054213u,1384488u,3758096416u,1677849828u,138549248u,393216u}/* 31FE */, /*11179*/{0,915u,2228225u,105054213u,1384488u,3758096416u,1677849836u,138549248u,393216u}/* 31FF */, /*11180*/{962068480u,923u,1638401u,102793307u,32u,1611137056u,137716u,406958080u,67108864u}/* 3200 */, /*11181*/{962592768u,923u,1638401u,102793307u,32u,1611137056u,137732u,406958080u,67108864u}/* 3201 */, /*11182*/{963117056u,923u,1638401u,102793307u,32u,1611137056u,137740u,406958080u,67108864u}/* 3202 */, /*11183*/{963641344u,923u,1638401u,102793307u,32u,1611137056u,137756u,406958080u,67108864u}/* 3203 */, /*11184*/{964165632u,923u,1638401u,102793307u,32u,1611137056u,137764u,406958080u,67108864u}/* 3204 */, /*11185*/{964689920u,923u,1638401u,102793307u,32u,1611137056u,137772u,406958080u,67108864u}/* 3205 */, /*11186*/{965214208u,923u,1638401u,102793307u,32u,1611137056u,137788u,406958080u,67108864u}/* 3206 */, /*11187*/{965738496u,923u,1638401u,102793307u,32u,1611137056u,137804u,406958080u,67108864u}/* 3207 */, /*11188*/{966262784u,923u,1638401u,102793307u,32u,1611137056u,137812u,406958080u,67108864u}/* 3208 */, /*11189*/{966787072u,923u,1638401u,102793307u,32u,1611137056u,137828u,406958080u,67108864u}/* 3209 */, /*11190*/{967311360u,923u,1638401u,102793307u,32u,1611137056u,137836u,406958080u,67108864u}/* 320A */, /*11191*/{967835648u,923u,1638401u,102793307u,32u,1611137056u,137844u,406958080u,67108864u}/* 320B */, /*11192*/{968359936u,923u,1638401u,102793307u,32u,1611137056u,137852u,406958080u,67108864u}/* 320C */, /*11193*/{968884224u,923u,1638401u,102793307u,32u,1611137056u,137860u,406958080u,67108864u}/* 320D */, /*11194*/{969408512u,923u,1638401u,102793307u,32u,1611137056u,263748u,541208576u,67108864u}/* 320E */, /*11195*/{969932800u,923u,1638401u,102793307u,32u,1611137056u,263764u,541208576u,67108864u}/* 320F */, /*11196*/{970457088u,923u,1638401u,102793307u,32u,1611137056u,263772u,541208576u,67108864u}/* 3210 */, /*11197*/{970981376u,923u,1638401u,102793307u,32u,1611137056u,263788u,541208576u,67108864u}/* 3211 */, /*11198*/{971505664u,923u,1638401u,102793307u,32u,1611137056u,263796u,541208576u,67108864u}/* 3212 */, /*11199*/{972029952u,923u,1638401u,102793307u,32u,1611137056u,263804u,541208576u,67108864u}/* 3213 */, /*11200*/{972554240u,923u,1638401u,102793307u,32u,1611137056u,263820u,541208576u,67108864u}/* 3214 */, /*11201*/{973078528u,923u,1638401u,102793307u,32u,1611137056u,263836u,541208576u,67108864u}/* 3215 */, /*11202*/{973602816u,923u,1638401u,102793307u,32u,1611137056u,263844u,541208576u,67108864u}/* 3216 */, /*11203*/{974127104u,923u,1638401u,102793307u,32u,1611137056u,263860u,541208576u,67108864u}/* 3217 */, /*11204*/{974651392u,923u,1638401u,102793307u,32u,1611137056u,263868u,541208576u,67108864u}/* 3218 */, /*11205*/{975175680u,923u,1638401u,102793307u,32u,1611137056u,263876u,541208576u,67108864u}/* 3219 */, /*11206*/{975699968u,923u,1638401u,102793307u,32u,1611137056u,263884u,541208576u,67108864u}/* 321A */, /*11207*/{976224256u,923u,1638401u,102793307u,32u,1611137056u,263892u,541208576u,67108864u}/* 321B */, /*11208*/{976748544u,923u,1638401u,102793307u,32u,1611137056u,263948u,541208576u,67108864u}/* 321C */, /*11209*/{977272832u,923u,1638401u,103000155u,32u,1611137056u,641892u,943960064u,67108864u}/* 321D */, /*11210*/{977797120u,923u,1638401u,103000155u,32u,1611137056u,515204u,809709568u,67108864u}/* 321E */, /*11211*/{978321408u,923u,536937985u,102793291u,8388642u,1611137056u,949141u,406958080u,0}/* 3220 */, /*11212*/{978845696u,923u,570493441u,102793291u,8388642u,1611137056u,950261u,406958080u,0}/* 3221 */, /*11213*/{979369984u,923u,604047361u,102793291u,8388642u,1611137056u,949213u,406958080u,0}/* 3222 */, /*11214*/{979894272u,923u,637603841u,102793291u,8388642u,1611137056u,967277u,406958080u,0}/* 3223 */, /*11215*/{980418560u,923u,671157249u,102793291u,8388642u,1611137056u,950325u,406958080u,0}/* 3224 */, /*11216*/{980942848u,923u,704714241u,102793291u,8388642u,1611137056u,956157u,406958080u,0}/* 3225 */, /*11217*/{981467136u,923u,738266625u,102793291u,8388642u,1611137056u,949165u,406958080u,0}/* 3226 */, /*11218*/{981991424u,923u,771824641u,102793291u,8388642u,1611137056u,956141u,406958080u,0}/* 3227 */, /*11219*/{982515712u,923u,805377025u,102793291u,8388642u,1611137056u,949885u,406958080u,0}/* 3228 */, /*11220*/{983040000u,923u,822157313u,102793291u,8388642u,1611137056u,959901u,406958080u,0}/* 3229 */, /*11221*/{983564288u,923u,65537u,102793307u,32u,1611137056u,1000404u,406958080u,67108864u}/* 322A */, /*11222*/{984088576u,923u,65537u,102793307u,32u,1611137056u,1019628u,406958080u,67108864u}/* 322B */, /*11223*/{984612864u,923u,65537u,102793307u,32u,1611137056u,1010996u,406958080u,67108864u}/* 322C */, /*11224*/{985137152u,923u,65537u,102793307u,32u,1611137056u,1000660u,406958080u,67108864u}/* 322D */, /*11225*/{985661440u,923u,65537u,102793307u,32u,1611137056u,825892u,406958080u,67108864u}/* 322E */, /*11226*/{986185728u,923u,65537u,102793307u,32u,1611137056u,967820u,406958080u,67108864u}/* 322F */, /*11227*/{986710016u,923u,65537u,102793307u,32u,1611137056u,998076u,406958080u,67108864u}/* 3230 */, /*11228*/{987234304u,923u,65537u,102793307u,32u,1611137056u,1002724u,406958080u,67108864u}/* 3231 */, /*11229*/{987758592u,923u,65537u,102793307u,32u,1611137056u,1000412u,406958080u,67108864u}/* 3232 */, /*11230*/{988282880u,923u,65537u,102793307u,32u,1611137056u,1037700u,406958080u,67108864u}/* 3233 */, /*11231*/{988807168u,923u,65537u,102793307u,32u,1611137056u,961532u,406958080u,67108864u}/* 3234 */, /*11232*/{989331456u,923u,65537u,102793307u,32u,1611137056u,1023836u,406958080u,67108864u}/* 3235 */, /*11233*/{989855744u,923u,65537u,102793307u,32u,1611137056u,815268u,406958080u,67108864u}/* 3236 */, /*11234*/{990380032u,923u,65537u,102793307u,32u,1611137056u,1037948u,406958080u,67108864u}/* 3237 */, /*11235*/{990904320u,923u,65537u,102793307u,32u,1611137056u,958772u,406958080u,67108864u}/* 3238 */, /*11236*/{991428608u,923u,65537u,102793307u,32u,1611137056u,950956u,406958080u,67108864u}/* 3239 */, /*11237*/{991952896u,923u,65537u,102793307u,32u,1611137056u,962420u,406958080u,67108864u}/* 323A */, /*11238*/{992477184u,923u,65537u,102793307u,32u,1611137056u,976580u,406958080u,67108864u}/* 323B */, /*11239*/{993001472u,923u,65537u,102793307u,32u,1611137056u,1032876u,406958080u,67108864u}/* 323C */, /*11240*/{993525760u,923u,65537u,102793307u,32u,1611137056u,951196u,406958080u,67108864u}/* 323D */, /*11241*/{994050048u,923u,65537u,102793307u,32u,1611137056u,815572u,406958080u,67108864u}/* 323E */, /*11242*/{994574336u,923u,65537u,102793307u,32u,1611137056u,960052u,406958080u,67108864u}/* 323F */, /*11243*/{995098624u,923u,65537u,102793307u,32u,1611137056u,1038076u,406958080u,67108864u}/* 3240 */, /*11244*/{995622912u,923u,65537u,102793307u,32u,1611137056u,951324u,406958080u,67108864u}/* 3241 */, /*11245*/{996147200u,923u,65537u,102793307u,32u,1611137056u,793324u,406958080u,67108864u}/* 3242 */, /*11246*/{996671488u,923u,65537u,102793307u,32u,1611137056u,793396u,406958080u,67108864u}/* 3243 */, /*11247*/{997195776u,923u,65537u,103121211u,32u,1611137056u,951428u,138473472u,67108864u}/* 3244 */, /*11248*/{997720064u,923u,65537u,103121211u,32u,1611137056u,970220u,138473472u,67108864u}/* 3245 */, /*11249*/{998244352u,923u,65537u,103121211u,32u,1611137056u,984644u,138473472u,67108864u}/* 3246 */, /*11250*/{998768640u,923u,65537u,103121211u,32u,1611137056u,1029764u,138473472u,67108864u}/* 3247 */, /*11251*/{0,921u,822157313u,89489419u,8388650u,1610612768u,117317u,272742400u,0}/* 3248 */, /*11252*/{0,921u,989932545u,89489419u,8388650u,1610612768u,117325u,272742400u,0}/* 3249 */, /*11253*/{0,921u,1157709825u,89489419u,8388650u,1610612768u,117333u,272742400u,0}/* 324A */, /*11254*/{0,921u,1325487105u,89489419u,8388650u,1610612768u,117341u,272742400u,0}/* 324B */, /*11255*/{0,921u,1493264385u,89489419u,8388650u,1610612768u,117349u,272742400u,0}/* 324C */, /*11256*/{0,921u,1510042113u,89489419u,8388650u,1610612768u,117357u,272742400u,0}/* 324D */, /*11257*/{0,921u,1526819841u,89489419u,8388650u,1610612768u,117365u,272742400u,0}/* 324E */, /*11258*/{0,921u,1543597569u,89489419u,8388650u,1610612768u,117373u,272742400u,0}/* 324F */, /*11259*/{999292928u,923u,65537u,103000603u,32u,1611137056u,185332u,407572480u,67108864u}/* 3250 */, /*11260*/{999817216u,923u,1006710273u,102967595u,8388642u,1611137056u,117333u,272740352u,0}/* 3251 */, /*11261*/{1000341504u,923u,1023488001u,102967595u,8388642u,1611137056u,117341u,272740352u,0}/* 3252 */, /*11262*/{1000865792u,923u,1040265729u,102967595u,8388642u,1611137056u,117349u,272740352u,0}/* 3253 */, /*11263*/{1001390080u,923u,1057043457u,102967595u,8388642u,1611137056u,117357u,272740352u,0}/* 3254 */, /*11264*/{1001914368u,923u,1073821185u,102967595u,8388642u,1611137056u,117365u,272740352u,0}/* 3255 */, /*11265*/{1002438656u,923u,1090598913u,102967595u,8388642u,1611137056u,117373u,272740352u,0}/* 3256 */, /*11266*/{1002962944u,923u,1107376641u,102967595u,8388642u,1611137056u,117381u,272740352u,0}/* 3257 */, /*11267*/{1003487232u,923u,1124154369u,102967595u,8388642u,1611137056u,117389u,272740352u,0}/* 3258 */, /*11268*/{1004011520u,923u,1140932097u,102967595u,8388642u,1611137056u,117397u,272740352u,0}/* 3259 */, /*11269*/{1004535808u,923u,1157709825u,102967595u,8388642u,1611137056u,117333u,272740352u,0}/* 325A */, /*11270*/{1005060096u,923u,1174487553u,102967595u,8388642u,1611137056u,117341u,272740352u,0}/* 325B */, /*11271*/{1005584384u,923u,1191265281u,102967595u,8388642u,1611137056u,117349u,272740352u,0}/* 325C */, /*11272*/{1006108672u,923u,1208043009u,102967595u,8388642u,1611137056u,117357u,272740352u,0}/* 325D */, /*11273*/{1006632960u,923u,1224820737u,102967595u,8388642u,1611137056u,117365u,272740352u,0}/* 325E */, /*11274*/{1007157248u,923u,1241598465u,102967595u,8388642u,1611137056u,117373u,272740352u,0}/* 325F */, /*11275*/{1007681536u,923u,1638401u,102793531u,32u,1611137056u,125036u,138473472u,67108864u}/* 3260 */, /*11276*/{1008205824u,923u,1638401u,102793531u,32u,1611137056u,125052u,138473472u,67108864u}/* 3261 */, /*11277*/{1008730112u,923u,1638401u,102793531u,32u,1611137056u,125060u,138473472u,67108864u}/* 3262 */, /*11278*/{1009254400u,923u,1638401u,102793531u,32u,1611137056u,125076u,138473472u,67108864u}/* 3263 */, /*11279*/{1009778688u,923u,1638401u,102793531u,32u,1611137056u,125084u,138473472u,67108864u}/* 3264 */, /*11280*/{1010302976u,923u,1638401u,102793531u,32u,1611137056u,125092u,138473472u,67108864u}/* 3265 */, /*11281*/{1010827264u,923u,1638401u,102793531u,32u,1611137056u,125108u,138473472u,67108864u}/* 3266 */, /*11282*/{1011351552u,923u,1638401u,102793531u,32u,1611137056u,125124u,138473472u,67108864u}/* 3267 */, /*11283*/{1011875840u,923u,1638401u,102793531u,32u,1611137056u,125132u,138473472u,67108864u}/* 3268 */, /*11284*/{1012400128u,923u,1638401u,102793531u,32u,1611137056u,125148u,138473472u,67108864u}/* 3269 */, /*11285*/{1012924416u,923u,1638401u,102793531u,32u,1611137056u,125156u,138473472u,67108864u}/* 326A */, /*11286*/{1013448704u,923u,1638401u,102793531u,32u,1611137056u,125164u,138473472u,67108864u}/* 326B */, /*11287*/{1013972992u,923u,1638401u,102793531u,32u,1611137056u,125172u,138473472u,67108864u}/* 326C */, /*11288*/{1014497280u,923u,1638401u,102793531u,32u,1611137056u,125180u,138473472u,67108864u}/* 326D */, /*11289*/{1015021568u,923u,1638401u,102793531u,32u,1611137056u,251068u,272740352u,67108864u}/* 326E */, /*11290*/{1015545856u,923u,1638401u,102793531u,32u,1611137056u,251084u,272740352u,67108864u}/* 326F */, /*11291*/{1016070144u,923u,1638401u,102793531u,32u,1611137056u,251092u,272740352u,67108864u}/* 3270 */, /*11292*/{1016594432u,923u,1638401u,102793531u,32u,1611137056u,251108u,272740352u,67108864u}/* 3271 */, /*11293*/{1017118720u,923u,1638401u,102793531u,32u,1611137056u,251116u,272740352u,67108864u}/* 3272 */, /*11294*/{1017643008u,923u,1638401u,102793531u,32u,1611137056u,251124u,272740352u,67108864u}/* 3273 */, /*11295*/{1018167296u,923u,1638401u,102793531u,32u,1611137056u,251140u,272740352u,67108864u}/* 3274 */, /*11296*/{1018691584u,923u,1638401u,102793531u,32u,1611137056u,251156u,272740352u,67108864u}/* 3275 */, /*11297*/{1019215872u,923u,1638401u,102793531u,32u,1611137056u,251164u,272740352u,67108864u}/* 3276 */, /*11298*/{1019740160u,923u,1638401u,102793531u,32u,1611137056u,251180u,272740352u,67108864u}/* 3277 */, /*11299*/{1020264448u,923u,1638401u,102793531u,32u,1611137056u,251188u,272740352u,67108864u}/* 3278 */, /*11300*/{1020788736u,923u,1638401u,102793531u,32u,1611137056u,251196u,272740352u,67108864u}/* 3279 */, /*11301*/{1021313024u,923u,1638401u,102793531u,32u,1611137056u,251204u,272740352u,67108864u}/* 327A */, /*11302*/{1021837312u,923u,1638401u,102793531u,32u,1611137056u,251212u,272740352u,67108864u}/* 327B */, /*11303*/{1022361600u,923u,1638401u,103000379u,32u,1611137056u,629204u,675540992u,67108864u}/* 327C */, /*11304*/{1022885888u,923u,1638401u,103000379u,32u,1611137056u,502564u,541274112u,67108864u}/* 327D */, /*11305*/{1023410176u,923u,1638401u,103033147u,32u,1611137056u,251260u,272740352u,67108864u}/* 327E */, /*11306*/{0,923u,65537u,102793243u,40u,1610612768u,55244u,138442752u,67108864u}/* 327F */, /*11307*/{1023934464u,923u,536937985u,102793515u,8388642u,1611137056u,936461u,138473472u,0}/* 3280 */, /*11308*/{1024458752u,923u,570493441u,102793515u,8388642u,1611137056u,937581u,138473472u,0}/* 3281 */, /*11309*/{1024983040u,923u,604047361u,102793515u,8388642u,1611137056u,936533u,138473472u,0}/* 3282 */, /*11310*/{1025507328u,923u,637603841u,102793515u,8388642u,1611137056u,954597u,138473472u,0}/* 3283 */, /*11311*/{1026031616u,923u,671157249u,102793515u,8388642u,1611137056u,937645u,138473472u,0}/* 3284 */, /*11312*/{1026555904u,923u,704714241u,102793515u,8388642u,1611137056u,943477u,138473472u,0}/* 3285 */, /*11313*/{1027080192u,923u,738266625u,102793515u,8388642u,1611137056u,936485u,138473472u,0}/* 3286 */, /*11314*/{1027604480u,923u,771824641u,102793515u,8388642u,1611137056u,943461u,138473472u,0}/* 3287 */, /*11315*/{1028128768u,923u,805377025u,102793515u,8388642u,1611137056u,937205u,138473472u,0}/* 3288 */, /*11316*/{1028653056u,923u,822157313u,102793515u,8388642u,1611137056u,947221u,138473472u,0}/* 3289 */, /*11317*/{1029177344u,923u,65537u,102793531u,32u,1611137056u,987724u,138473472u,67108864u}/* 328A */, /*11318*/{1029701632u,923u,65537u,102793531u,32u,1611137056u,1006948u,138473472u,67108864u}/* 328B */, /*11319*/{1030225920u,923u,65537u,102793531u,32u,1611137056u,998316u,138473472u,67108864u}/* 328C */, /*11320*/{1030750208u,923u,65537u,102793531u,32u,1611137056u,987980u,138473472u,67108864u}/* 328D */, /*11321*/{1031274496u,923u,65537u,102793531u,32u,1611137056u,813212u,138473472u,67108864u}/* 328E */, /*11322*/{1031798784u,923u,65537u,102793531u,32u,1611137056u,955140u,138473472u,67108864u}/* 328F */, /*11323*/{1032323072u,923u,65537u,102793531u,32u,1611137056u,985396u,138473472u,67108864u}/* 3290 */, /*11324*/{1032847360u,923u,65537u,102793531u,32u,1611137056u,990044u,138473472u,67108864u}/* 3291 */, /*11325*/{1033371648u,923u,65537u,102793531u,32u,1611137056u,987732u,138473472u,67108864u}/* 3292 */, /*11326*/{1033895936u,923u,65537u,102793531u,32u,1611137056u,1025020u,138473472u,67108864u}/* 3293 */, /*11327*/{1034420224u,923u,65537u,102793531u,32u,1611137056u,948852u,138473472u,67108864u}/* 3294 */, /*11328*/{1034944512u,923u,65537u,102793531u,32u,1611137056u,1011156u,138473472u,67108864u}/* 3295 */, /*11329*/{1035468800u,923u,65537u,102793531u,32u,1611137056u,802588u,138473472u,67108864u}/* 3296 */, /*11330*/{1035993088u,923u,65537u,102793531u,0u,1611141152u,1025268u,138473472u,67108864u}/* 3297 */, /*11331*/{1036517376u,923u,65537u,102793531u,32u,1611137056u,946092u,138473472u,67108864u}/* 3298 */, /*11332*/{1037041664u,923u,65537u,102793531u,0u,1611141152u,1026252u,138473472u,67108864u}/* 3299 */, /*11333*/{1037565952u,923u,65537u,102793531u,32u,1611137056u,1016772u,138473472u,67108864u}/* 329A */, /*11334*/{1038090240u,923u,65537u,102793531u,32u,1611137056u,959908u,138473472u,67108864u}/* 329B */, /*11335*/{1038614528u,923u,65537u,102793531u,32u,1611137056u,810332u,138473472u,67108864u}/* 329C */, /*11336*/{1039138816u,923u,65537u,102793531u,32u,1611137056u,942940u,138473472u,67108864u}/* 329D */, /*11337*/{1039663104u,923u,65537u,102793531u,32u,1611137056u,947596u,138473472u,67108864u}/* 329E */, /*11338*/{1040187392u,923u,65537u,102793531u,32u,1611137056u,999756u,138473472u,67108864u}/* 329F */, /*11339*/{1040711680u,923u,65537u,102793531u,32u,1611137056u,825916u,138473472u,67108864u}/* 32A0 */, /*11340*/{1041235968u,923u,65537u,102793531u,32u,1611137056u,938644u,138473472u,67108864u}/* 32A1 */, /*11341*/{1041760256u,923u,65537u,102793531u,32u,1611137056u,943828u,138473472u,67108864u}/* 32A2 */, /*11342*/{1042284544u,923u,65537u,102793531u,32u,1611137056u,996644u,138473472u,67108864u}/* 32A3 */, /*11343*/{1042808832u,923u,65537u,102793531u,32u,1611137056u,936540u,138473472u,67108864u}/* 32A4 */, /*11344*/{1043333120u,923u,65537u,102793531u,32u,1611137056u,936820u,138473472u,67108864u}/* 32A5 */, /*11345*/{1043857408u,923u,65537u,102793531u,32u,1611137056u,936548u,138473472u,67108864u}/* 32A6 */, /*11346*/{1044381696u,923u,65537u,102793531u,32u,1611137056u,969020u,138473472u,67108864u}/* 32A7 */, /*11347*/{1044905984u,923u,65537u,102793531u,32u,1611137056u,948644u,138473472u,67108864u}/* 32A8 */, /*11348*/{1045430272u,923u,65537u,102793531u,32u,1611137056u,947172u,138473472u,67108864u}/* 32A9 */, /*11349*/{1045954560u,923u,65537u,102793531u,32u,1611137056u,964292u,138473472u,67108864u}/* 32AA */, /*11350*/{1046478848u,923u,65537u,102793531u,32u,1611137056u,963900u,138473472u,67108864u}/* 32AB */, /*11351*/{1047003136u,923u,65537u,102793531u,32u,1611137056u,1020196u,138473472u,67108864u}/* 32AC */, /*11352*/{1047527424u,923u,65537u,102793531u,32u,1611137056u,938516u,138473472u,67108864u}/* 32AD */, /*11353*/{1048051712u,923u,65537u,102793531u,32u,1611137056u,802892u,138473472u,67108864u}/* 32AE */, /*11354*/{1048576000u,923u,65537u,102793531u,32u,1611137056u,947372u,138473472u,67108864u}/* 32AF */, /*11355*/{1049100288u,923u,65537u,102793531u,32u,1611137056u,959212u,138473472u,67108864u}/* 32B0 */, /*11356*/{1049624576u,923u,1258376193u,102967595u,8388642u,1611137056u,117381u,272740352u,0}/* 32B1 */, /*11357*/{1050148864u,923u,1275153921u,102967595u,8388642u,1611137056u,117389u,272740352u,0}/* 32B2 */, /*11358*/{1050673152u,923u,1291931649u,102967595u,8388642u,1611137056u,117397u,272740352u,0}/* 32B3 */, /*11359*/{1051197440u,923u,1308709377u,102967595u,8388642u,1611137056u,117405u,272740352u,0}/* 32B4 */, /*11360*/{1051721728u,923u,1325487105u,102967595u,8388642u,1611137056u,117341u,272740352u,0}/* 32B5 */, /*11361*/{1052246016u,923u,1342264833u,102967595u,8388642u,1611137056u,117349u,272740352u,0}/* 32B6 */, /*11362*/{1052770304u,923u,1359042561u,102967595u,8388642u,1611137056u,117357u,272740352u,0}/* 32B7 */, /*11363*/{1053294592u,923u,1375820289u,102967595u,8388642u,1611137056u,117365u,272740352u,0}/* 32B8 */, /*11364*/{1053818880u,923u,1392598017u,102967595u,8388642u,1611137056u,117373u,272740352u,0}/* 32B9 */, /*11365*/{1054343168u,923u,1409375745u,102967595u,8388642u,1611137056u,117381u,272740352u,0}/* 32BA */, /*11366*/{1054867456u,923u,1426153473u,102967595u,8388642u,1611137056u,117389u,272740352u,0}/* 32BB */, /*11367*/{1055391744u,923u,1442931201u,102967595u,8388642u,1611137056u,117397u,272740352u,0}/* 32BC */, /*11368*/{1055916032u,923u,1459708929u,102967595u,8388642u,1611137056u,117405u,272740352u,0}/* 32BD */, /*11369*/{1056440320u,923u,1476486657u,102967595u,8388642u,1611137056u,117413u,272740352u,0}/* 32BE */, /*11370*/{1056964608u,923u,1493264385u,102967595u,8388642u,1611137056u,117349u,272740352u,0}/* 32BF */, /*11371*/{1057488896u,923u,65537u,102793307u,32u,1611137056u,1046380u,272707584u,67108864u}/* 32C0 */, /*11372*/{1058013184u,923u,65537u,102793307u,32u,1611137056u,1046388u,272707584u,67108864u}/* 32C1 */, /*11373*/{1058537472u,923u,65537u,102793307u,32u,1611137056u,1046396u,272707584u,67108864u}/* 32C2 */, /*11374*/{1059061760u,923u,65537u,102793307u,32u,1611137056u,1046404u,272707584u,67108864u}/* 32C3 */, /*11375*/{1059586048u,923u,65537u,102793307u,32u,1611137056u,1046412u,272707584u,67108864u}/* 32C4 */, /*11376*/{1060110336u,923u,65537u,102793307u,32u,1611137056u,1046420u,272707584u,67108864u}/* 32C5 */, /*11377*/{1060634624u,923u,65537u,102793307u,32u,1611137056u,1046428u,272707584u,67108864u}/* 32C6 */, /*11378*/{1061158912u,923u,65537u,102793307u,32u,1611137056u,1046436u,272707584u,67108864u}/* 32C7 */, /*11379*/{1061683200u,923u,65537u,102793307u,32u,1611137056u,1046444u,272707584u,67108864u}/* 32C8 */, /*11380*/{1062207488u,923u,65537u,102793307u,32u,1611137056u,1105028u,406958080u,67108864u}/* 32C9 */, /*11381*/{1062731776u,923u,65537u,102793307u,32u,1611137056u,1105036u,406958080u,67108864u}/* 32CA */, /*11382*/{1063256064u,923u,65537u,102793307u,32u,1611137056u,1105044u,406958080u,67108864u}/* 32CB */, /*11383*/{1063780352u,923u,65537u,103000603u,32u,1611137056u,120524u,273108992u,67108864u}/* 32CC */, /*11384*/{1064304640u,923u,65537u,103000603u,32u,1611137056u,182308u,407547904u,67108864u}/* 32CD */, /*11385*/{1064828928u,923u,65537u,103000603u,32u,1611137056u,123604u,273108992u,67108864u}/* 32CE */, /*11386*/{1065353216u,923u,65537u,103000603u,32u,1611137056u,183924u,407572480u,67108864u}/* 32CF */, /*11387*/{1065877504u,923u,2228225u,102793531u,1310752u,1611137056u,127892u,138579968u,67108864u}/* 32D0 */, /*11388*/{1066401792u,923u,2228225u,102793531u,1310752u,1611137056u,127900u,138579968u,67108864u}/* 32D1 */, /*11389*/{1066926080u,923u,2228225u,102793531u,1310752u,1611137056u,127908u,138579968u,67108864u}/* 32D2 */, /*11390*/{1067450368u,923u,2228225u,102793531u,1310752u,1611137056u,127924u,138579968u,67108864u}/* 32D3 */, /*11391*/{1067974656u,923u,2228225u,102793531u,1310752u,1611137056u,127932u,138579968u,67108864u}/* 32D4 */, /*11392*/{1068498944u,923u,2228225u,102793531u,1310752u,1611137056u,127940u,138579968u,67108864u}/* 32D5 */, /*11393*/{1069023232u,923u,2228225u,102793531u,1310752u,1611137056u,127948u,138579968u,67108864u}/* 32D6 */, /*11394*/{1069547520u,923u,2228225u,102793531u,1310752u,1611137056u,127956u,138579968u,67108864u}/* 32D7 */, /*11395*/{1070071808u,923u,2228225u,102793531u,1310752u,1611137056u,127964u,138579968u,67108864u}/* 32D8 */, /*11396*/{1070596096u,923u,2228225u,102793531u,1310752u,1611137056u,127972u,138579968u,67108864u}/* 32D9 */, /*11397*/{1071120384u,923u,2228225u,102793531u,1310752u,1611137056u,127980u,138579968u,67108864u}/* 32DA */, /*11398*/{1071644672u,923u,2228225u,102793531u,1310752u,1611137056u,127988u,138579968u,67108864u}/* 32DB */, /*11399*/{1072168960u,923u,2228225u,102793531u,1310752u,1611137056u,127996u,138579968u,67108864u}/* 32DC */, /*11400*/{1072693248u,923u,2228225u,102793531u,1310752u,1611137056u,128004u,138579968u,67108864u}/* 32DD */, /*11401*/{1073217536u,923u,2228225u,102793531u,1310752u,1611137056u,128012u,138579968u,67108864u}/* 32DE */, /*11402*/{1073741824u,923u,2228225u,102793531u,1310752u,1611137056u,128020u,138579968u,67108864u}/* 32DF */, /*11403*/{1074266112u,923u,2228225u,102793531u,1310752u,1611137056u,128028u,138579968u,67108864u}/* 32E0 */, /*11404*/{1074790400u,923u,2228225u,102793531u,1310752u,1611137056u,128036u,138579968u,67108864u}/* 32E1 */, /*11405*/{1075314688u,923u,2228225u,102793531u,1310752u,1611137056u,128044u,138579968u,67108864u}/* 32E2 */, /*11406*/{1075838976u,923u,2228225u,102793531u,1310752u,1611137056u,128052u,138579968u,67108864u}/* 32E3 */, /*11407*/{1076363264u,923u,2228225u,102793531u,1310752u,1611137056u,128060u,138579968u,67108864u}/* 32E4 */, /*11408*/{1076887552u,923u,2228225u,102793531u,1310752u,1611137056u,128068u,138579968u,67108864u}/* 32E5 */, /*11409*/{1077411840u,923u,2228225u,102793531u,1310752u,1611137056u,128076u,138579968u,67108864u}/* 32E6 */, /*11410*/{1077936128u,923u,2228225u,102793531u,1310752u,1611137056u,128084u,138579968u,67108864u}/* 32E7 */, /*11411*/{1078460416u,923u,2228225u,102793531u,1310752u,1611137056u,128092u,138579968u,67108864u}/* 32E8 */, /*11412*/{1078984704u,923u,2228225u,102793531u,1310752u,1611137056u,128100u,138579968u,67108864u}/* 32E9 */, /*11413*/{1079508992u,923u,2228225u,102793531u,1310752u,1611137056u,128108u,138579968u,67108864u}/* 32EA */, /*11414*/{1080033280u,923u,2228225u,102793531u,1310752u,1611137056u,128116u,138579968u,67108864u}/* 32EB */, /*11415*/{1080557568u,923u,2228225u,102793531u,1310752u,1611137056u,128124u,138579968u,67108864u}/* 32EC */, /*11416*/{1081081856u,923u,2228225u,102793531u,1310752u,1611137056u,128132u,138579968u,67108864u}/* 32ED */, /*11417*/{1081606144u,923u,2228225u,102793531u,1310752u,1611137056u,128140u,138579968u,67108864u}/* 32EE */, /*11418*/{1082130432u,923u,2228225u,102793531u,1310752u,1611137056u,128148u,138579968u,67108864u}/* 32EF */, /*11419*/{1082654720u,923u,2228225u,102793531u,1310752u,1611137056u,128156u,138579968u,67108864u}/* 32F0 */, /*11420*/{1083179008u,923u,2228225u,102793531u,1310752u,1611137056u,128164u,138579968u,67108864u}/* 32F1 */, /*11421*/{1083703296u,923u,2228225u,102793531u,1310752u,1611137056u,128172u,138579968u,67108864u}/* 32F2 */, /*11422*/{1084227584u,923u,2228225u,102793531u,1310752u,1611137056u,128180u,138579968u,67108864u}/* 32F3 */, /*11423*/{1084751872u,923u,2228225u,102793531u,1310752u,1611137056u,128188u,138579968u,67108864u}/* 32F4 */, /*11424*/{1085276160u,923u,2228225u,102793531u,1310752u,1611137056u,128196u,138579968u,67108864u}/* 32F5 */, /*11425*/{1085800448u,923u,2228225u,102793531u,1310752u,1611137056u,128204u,138579968u,67108864u}/* 32F6 */, /*11426*/{1086324736u,923u,2228225u,102793531u,1310752u,1611137056u,128212u,138579968u,67108864u}/* 32F7 */, /*11427*/{1086849024u,923u,2228225u,102793531u,1310752u,1611137056u,128220u,138579968u,67108864u}/* 32F8 */, /*11428*/{1087373312u,923u,2228225u,102793531u,1310752u,1611137056u,128228u,138579968u,67108864u}/* 32F9 */, /*11429*/{1087897600u,923u,2228225u,102793531u,1310752u,1611137056u,128236u,138579968u,67108864u}/* 32FA */, /*11430*/{1088421888u,923u,2228225u,102793531u,1310752u,1611137056u,128244u,138579968u,67108864u}/* 32FB */, /*11431*/{1088946176u,923u,2228225u,102793531u,1310752u,1611137056u,128252u,138579968u,67108864u}/* 32FC */, /*11432*/{1089470464u,923u,2228225u,102793531u,1310752u,1611137056u,128260u,138579968u,67108864u}/* 32FD */, /*11433*/{1089994752u,923u,2228225u,102793531u,1310752u,1611137056u,128268u,138579968u,67108864u}/* 32FE */, /*11434*/{1090519040u,931u,2228225u,102793755u,1310752u,1611137056u,442284u,777105408u,67108864u}/* 3300 */, /*11435*/{1091043328u,931u,2228225u,102793755u,1310752u,1611137056u,512084u,541995008u,67108864u}/* 3301 */, /*11436*/{1091567616u,931u,2228225u,102793755u,1310752u,1611137056u,512148u,777105408u,67108864u}/* 3302 */, /*11437*/{1092091904u,931u,2228225u,102793755u,1310752u,1611137056u,314364u,407547904u,67108864u}/* 3303 */, /*11438*/{1092616192u,931u,2228225u,102793755u,1310752u,1611137056u,512164u,772911104u,67108864u}/* 3304 */, /*11439*/{1093140480u,931u,2228225u,102793755u,1310752u,1611137056u,384180u,407547904u,67108864u}/* 3305 */, /*11440*/{1093664768u,931u,2228225u,102793755u,1310752u,1611137056u,384092u,407547904u,67108864u}/* 3306 */, /*11441*/{1094189056u,931u,2228225u,102793755u,1310752u,1611137056u,570156u,907358208u,67108864u}/* 3307 */, /*11442*/{1094713344u,931u,2228225u,102793755u,1310752u,1611137056u,372380u,541995008u,67108864u}/* 3308 */, /*11443*/{1095237632u,931u,2228225u,102793755u,1310752u,1611137056u,384180u,407547904u,67108864u}/* 3309 */, /*11444*/{1095761920u,931u,2228225u,102793755u,1310752u,1611137056u,314340u,407547904u,67108864u}/* 330A */, /*11445*/{1096286208u,931u,2228225u,102793755u,1310752u,1611137056u,384028u,407547904u,67108864u}/* 330B */, /*11446*/{1096810496u,931u,2228225u,102793755u,1310752u,1611137056u,512196u,541995008u,67108864u}/* 330C */, /*11447*/{1097334784u,931u,2228225u,102793755u,1310752u,1611137056u,442628u,541995008u,67108864u}/* 330D */, /*11448*/{1097859072u,931u,2228225u,102793755u,1310752u,1611137056u,384428u,638464000u,67108864u}/* 330E */, /*11449*/{1098383360u,931u,2228225u,102793755u,1310752u,1611137056u,384332u,638464000u,67108864u}/* 330F */, /*11450*/{1098907648u,931u,2228225u,102793755u,1310752u,1611137056u,255876u,734932992u,67108864u}/* 3310 */, /*11451*/{1099431936u,931u,2228225u,102793755u,1310752u,1611137056u,314268u,638464000u,67108864u}/* 3311 */, /*11452*/{1099956224u,931u,2228225u,102793755u,1310752u,1611137056u,442588u,541995008u,67108864u}/* 3312 */, /*11453*/{1100480512u,931u,2228225u,102793755u,1310752u,1611137056u,442428u,1003827200u,67108864u}/* 3313 */, /*11454*/{1101004800u,931u,2228225u,102793755u,1310752u,1611137056u,256172u,273100800u,67108864u}/* 3314 */, /*11455*/{1101529088u,931u,2228225u,102793755u,1310752u,1611137056u,640452u,907358208u,67108864u}/* 3315 */, /*11456*/{1102053376u,931u,2228225u,102793755u,1310752u,1611137056u,698836u,810889216u,67108864u}/* 3316 */, /*11457*/{1102577664u,931u,2228225u,102793755u,1310752u,1611137056u,640468u,676442112u,67108864u}/* 3317 */, /*11458*/{1103101952u,931u,2228225u,102793755u,1310752u,1611137056u,384292u,638464000u,67108864u}/* 3318 */, /*11459*/{1103626240u,931u,2228225u,102793755u,1310752u,1611137056u,640596u,907358208u,67108864u}/* 3319 */, /*11460*/{1104150528u,931u,2228225u,102793755u,1310752u,1611137056u,640268u,907358208u,67108864u}/* 331A */, /*11461*/{1104674816u,931u,2228225u,102793755u,1310752u,1611137056u,442516u,541995008u,67108864u}/* 331B */, /*11462*/{1105199104u,931u,2228225u,102793755u,1310752u,1611137056u,314212u,407547904u,67108864u}/* 331C */, /*11463*/{1105723392u,931u,2228225u,102793755u,1310752u,1611137056u,384228u,407547904u,67108864u}/* 331D */, /*11464*/{1106247680u,931u,2228225u,102793755u,1310752u,1611137056u,314356u,642658304u,67108864u}/* 331E */, /*11465*/{1106771968u,931u,2228225u,102793755u,1310752u,1611137056u,512020u,541995008u,67108864u}/* 331F */, /*11466*/{1107296256u,931u,2228225u,102793755u,1310752u,1611137056u,570668u,676442112u,67108864u}/* 3320 */, /*11467*/{1107820544u,931u,2228225u,102793755u,1310752u,1611137056u,512396u,772911104u,67108864u}/* 3321 */, /*11468*/{1108344832u,931u,2228225u,102793755u,1310752u,1611137056u,384284u,407547904u,67108864u}/* 3322 */, /*11469*/{1108869120u,931u,2228225u,102793755u,1310752u,1611137056u,384308u,407547904u,67108864u}/* 3323 */, /*11470*/{1109393408u,931u,2228225u,102793755u,1310752u,1611137056u,314268u,638464000u,67108864u}/* 3324 */, /*11471*/{1109917696u,931u,2228225u,102793755u,1310752u,1611137056u,256020u,504016896u,67108864u}/* 3325 */, /*11472*/{1110441984u,931u,2228225u,102793755u,1310752u,1611137056u,256260u,504016896u,67108864u}/* 3326 */, /*11473*/{1110966272u,931u,2228225u,102793755u,1310752u,1611137056u,256316u,273100800u,67108864u}/* 3327 */, /*11474*/{1111490560u,931u,2228225u,102793755u,1310752u,1611137056u,256140u,273100800u,67108864u}/* 3328 */, /*11475*/{1112014848u,931u,2228225u,102793755u,1310752u,1611137056u,384156u,407547904u,67108864u}/* 3329 */, /*11476*/{1112539136u,931u,2228225u,102793755u,1310752u,1611137056u,384012u,407547904u,67108864u}/* 332A */, /*11477*/{1113063424u,931u,2228225u,102793755u,1310752u,1611137056u,570660u,911552512u,67108864u}/* 332B */, /*11478*/{1113587712u,931u,2228225u,102793755u,1310752u,1611137056u,314388u,642658304u,67108864u}/* 332C */, /*11479*/{1114112000u,931u,2228225u,102793755u,1310752u,1611137056u,442788u,772911104u,67108864u}/* 332D */, /*11480*/{1114636288u,931u,2228225u,102793755u,1310752u,1611137056u,640220u,911552512u,67108864u}/* 332E */, /*11481*/{1115160576u,931u,2228225u,102793755u,1310752u,1611137056u,384260u,642658304u,67108864u}/* 332F */, /*11482*/{1115684864u,931u,2228225u,102793755u,1310752u,1611137056u,256068u,508211200u,67108864u}/* 3330 */, /*11483*/{1116209152u,931u,2228225u,102793755u,1310752u,1611137056u,256316u,504016896u,67108864u}/* 3331 */, /*11484*/{1116733440u,931u,2228225u,102793755u,1310752u,1611137056u,640252u,907358208u,67108864u}/* 3332 */, /*11485*/{1117257728u,931u,2228225u,102793755u,1310752u,1611137056u,442308u,541995008u,67108864u}/* 3333 */, /*11486*/{1117782016u,931u,2228225u,102793755u,1310752u,1611137056u,640236u,907358208u,67108864u}/* 3334 */, /*11487*/{1118306304u,931u,2228225u,102793755u,1310752u,1611137056u,384572u,407547904u,67108864u}/* 3335 */, /*11488*/{1118830592u,931u,2228225u,102793755u,1310752u,1611137056u,570548u,676442112u,67108864u}/* 3336 */, /*11489*/{1119354880u,931u,2228225u,102793755u,1310752u,1611137056u,256124u,508211200u,67108864u}/* 3337 */, /*11490*/{1119879168u,931u,2228225u,102793755u,1310752u,1611137056u,384276u,642658304u,67108864u}/* 3338 */, /*11491*/{1120403456u,931u,2228225u,102793755u,1310752u,1611137056u,384356u,407547904u,67108864u}/* 3339 */, /*11492*/{1120927744u,931u,2228225u,102793755u,1310752u,1611137056u,384372u,642658304u,67108864u}/* 333A */, /*11493*/{1121452032u,931u,2228225u,102793755u,1310752u,1611137056u,314364u,873574400u,67108864u}/* 333B */, /*11494*/{1121976320u,931u,2228225u,102793755u,1310752u,1611137056u,314396u,638464000u,67108864u}/* 333C */, /*11495*/{1122500608u,931u,2228225u,102793755u,1310752u,1611137056u,512324u,777105408u,67108864u}/* 333D */, /*11496*/{1123024896u,931u,2228225u,102793755u,1310752u,1611137056u,384380u,638464000u,67108864u}/* 333E */, /*11497*/{1123549184u,931u,2228225u,102793755u,1310752u,1611137056u,256396u,273100800u,67108864u}/* 333F */, /*11498*/{1124073472u,931u,2228225u,102793755u,1310752u,1611137056u,384436u,873574400u,67108864u}/* 3340 */, /*11499*/{1124597760u,931u,2228225u,102793755u,1310752u,1611137056u,314604u,407547904u,67108864u}/* 3341 */, /*11500*/{1125122048u,931u,2228225u,102793755u,1310752u,1611137056u,314660u,407547904u,67108864u}/* 3342 */, /*11501*/{1125646336u,931u,2228225u,102793755u,1310752u,1611137056u,512196u,541995008u,67108864u}/* 3343 */, /*11502*/{1126170624u,931u,2228225u,102793755u,1310752u,1611137056u,384236u,407547904u,67108864u}/* 3344 */, /*11503*/{1126694912u,931u,2228225u,102793755u,1310752u,1611137056u,384252u,407547904u,67108864u}/* 3345 */, /*11504*/{1127219200u,931u,2228225u,102793755u,1310752u,1611137056u,384292u,407547904u,67108864u}/* 3346 */, /*11505*/{1127743488u,931u,2228225u,102793755u,1310752u,1611137056u,640828u,676442112u,67108864u}/* 3347 */, /*11506*/{1128267776u,931u,2228225u,102793755u,1310752u,1611137056u,512580u,541995008u,67108864u}/* 3348 */, /*11507*/{1128792064u,931u,2228225u,102793755u,1310752u,1611137056u,256348u,273100800u,67108864u}/* 3349 */, /*11508*/{1129316352u,931u,2228225u,102793755u,1310752u,1611137056u,570908u,907358208u,67108864u}/* 334A */, /*11509*/{1129840640u,931u,2228225u,102793755u,1310752u,1611137056u,256092u,504016896u,67108864u}/* 334B */, /*11510*/{1130364928u,931u,2228225u,102793755u,1310752u,1611137056u,512396u,772911104u,67108864u}/* 334C */, /*11511*/{1130889216u,931u,2228225u,102793755u,1310752u,1611137056u,442676u,541995008u,67108864u}/* 334D */, /*11512*/{1131413504u,931u,2228225u,102793755u,1310752u,1611137056u,314484u,638464000u,67108864u}/* 334E */, /*11513*/{1131937792u,931u,2228225u,102793755u,1310752u,1611137056u,314652u,407547904u,67108864u}/* 334F */, /*11514*/{1132462080u,931u,2228225u,102793755u,1310752u,1611137056u,384332u,407547904u,67108864u}/* 3350 */, /*11515*/{1132986368u,931u,2228225u,102793755u,1310752u,1611137056u,512484u,541995008u,67108864u}/* 3351 */, /*11516*/{1133510656u,931u,2228225u,102793755u,1310752u,1611137056u,256404u,273100800u,67108864u}/* 3352 */, /*11517*/{1134034944u,931u,2228225u,102793755u,1310752u,1611137056u,314580u,642658304u,67108864u}/* 3353 */, /*11518*/{1134559232u,931u,2228225u,102793755u,1310752u,1611137056u,442796u,772911104u,67108864u}/* 3354 */, /*11519*/{1135083520u,931u,2228225u,102793755u,1310752u,1611137056u,256372u,273100800u,67108864u}/* 3355 */, /*11520*/{1135607808u,931u,2228225u,102793755u,1310752u,1611137056u,640748u,907358208u,67108864u}/* 3356 */, /*11521*/{1136132096u,931u,2228225u,102793755u,1310752u,1611137056u,384308u,407547904u,67108864u}/* 3357 */, /*11522*/{1136656384u,931u,65537u,102793307u,32u,1611137056u,1066220u,272707584u,67108864u}/* 3358 */, /*11523*/{1137180672u,931u,65537u,102793307u,32u,1611137056u,1066228u,272707584u,67108864u}/* 3359 */, /*11524*/{1137704960u,931u,65537u,102793307u,32u,1611137056u,1066236u,272707584u,67108864u}/* 335A */, /*11525*/{1138229248u,931u,65537u,102793307u,32u,1611137056u,1066244u,272707584u,67108864u}/* 335B */, /*11526*/{1138753536u,931u,65537u,102793307u,32u,1611137056u,1066252u,272707584u,67108864u}/* 335C */, /*11527*/{1139277824u,931u,65537u,102793307u,32u,1611137056u,1066260u,272707584u,67108864u}/* 335D */, /*11528*/{1139802112u,931u,65537u,102793307u,32u,1611137056u,1066268u,272707584u,67108864u}/* 335E */, /*11529*/{1140326400u,931u,65537u,102793307u,32u,1611137056u,1066276u,272707584u,67108864u}/* 335F */, /*11530*/{1140850688u,931u,65537u,102793307u,32u,1611137056u,1066284u,272707584u,67108864u}/* 3360 */, /*11531*/{1141374976u,931u,65537u,102793307u,32u,1611137056u,1066292u,272707584u,67108864u}/* 3361 */, /*11532*/{1141899264u,931u,65537u,102793307u,32u,1611137056u,1124876u,406958080u,67108864u}/* 3362 */, /*11533*/{1142423552u,931u,65537u,102793307u,32u,1611137056u,1124884u,406958080u,67108864u}/* 3363 */, /*11534*/{1142947840u,931u,65537u,102793307u,32u,1611137056u,1124892u,406958080u,67108864u}/* 3364 */, /*11535*/{1143472128u,931u,65537u,102793307u,32u,1611137056u,1124900u,406958080u,67108864u}/* 3365 */, /*11536*/{1143996416u,931u,65537u,102793307u,32u,1611137056u,1124908u,406958080u,67108864u}/* 3366 */, /*11537*/{1144520704u,931u,65537u,102793307u,32u,1611137056u,1124916u,406958080u,67108864u}/* 3367 */, /*11538*/{1145044992u,931u,65537u,102793307u,32u,1611137056u,1124924u,406958080u,67108864u}/* 3368 */, /*11539*/{1145569280u,931u,65537u,102793307u,32u,1611137056u,1124932u,406958080u,67108864u}/* 3369 */, /*11540*/{1146093568u,931u,65537u,102793307u,32u,1611137056u,1124940u,406958080u,67108864u}/* 336A */, /*11541*/{1146617856u,931u,65537u,102793307u,32u,1611137056u,1124948u,406958080u,67108864u}/* 336B */, /*11542*/{1147142144u,931u,65537u,102793307u,32u,1611137056u,1124884u,406958080u,67108864u}/* 336C */, /*11543*/{1147666432u,931u,65537u,102793307u,32u,1611137056u,1124892u,406958080u,67108864u}/* 336D */, /*11544*/{1148190720u,931u,65537u,102793307u,32u,1611137056u,1124900u,406958080u,67108864u}/* 336E */, /*11545*/{1148715008u,931u,65537u,102793307u,32u,1611137056u,1124908u,406958080u,67108864u}/* 336F */, /*11546*/{1149239296u,931u,65537u,102793307u,32u,1611137056u,1124916u,406958080u,67108864u}/* 3370 */, /*11547*/{1149763584u,931u,65537u,102793755u,32u,1611137056u,181492u,407556096u,67108864u}/* 3371 */, /*11548*/{1150287872u,931u,65537u,102793755u,32u,1611137056u,118044u,273100800u,67108864u}/* 3372 */, /*11549*/{1150812160u,931u,65537u,102793755u,32u,1611137056u,122444u,273117184u,67108864u}/* 3373 */, /*11550*/{1151336448u,931u,65537u,102793755u,32u,1611137056u,180332u,407547904u,67108864u}/* 3374 */, /*11551*/{1151860736u,931u,65537u,102793755u,32u,1611137056u,126060u,273108992u,67108864u}/* 3375 */, /*11552*/{1152385024u,931u,65537u,102793755u,32u,1611137056u,121500u,273100800u,67108864u}/* 3376 */, /*11553*/{1152909312u,931u,65537u,103000603u,32u,1611137056u,120884u,273100800u,67108864u}/* 3377 */, /*11554*/{1153433600u,931u,65537u,103000603u,32u,1611137056u,179548u,407547904u,67108864u}/* 3378 */, /*11555*/{1153957888u,931u,65537u,103000603u,32u,1611137056u,179556u,407547904u,67108864u}/* 3379 */, /*11556*/{1154482176u,931u,65537u,103000603u,32u,1611137056u,124324u,273117184u,67108864u}/* 337A */, /*11557*/{1155006464u,931u,65537u,102793755u,32u,1611137056u,1947684u,273100800u,67108864u}/* 337B */, /*11558*/{1155530752u,931u,65537u,102793755u,32u,1611137056u,1935828u,273100800u,67108864u}/* 337C */, /*11559*/{1156055040u,931u,65537u,102793755u,32u,1611137056u,1955932u,273100800u,67108864u}/* 337D */, /*11560*/{1156579328u,931u,65537u,102793755u,32u,1611137056u,1985108u,273100800u,67108864u}/* 337E */, /*11561*/{1157103616u,931u,65537u,102793755u,32u,1611137056u,3925140u,541995008u,67108864u}/* 337F */, /*11562*/{1157627904u,931u,65537u,102793755u,32u,1611137056u,121092u,273108992u,67108864u}/* 3380 */, /*11563*/{1158152192u,931u,65537u,102793755u,32u,1611137056u,120428u,273108992u,67108864u}/* 3381 */, /*11564*/{1158676480u,931u,65537u,102793755u,32u,1611137056u,124668u,273108992u,67108864u}/* 3382 */, /*11565*/{1159200768u,931u,65537u,102793755u,32u,1611137056u,120308u,273108992u,67108864u}/* 3383 */, /*11566*/{1159725056u,931u,65537u,102793755u,32u,1611137056u,119756u,273108992u,67108864u}/* 3384 */, /*11567*/{1160249344u,931u,65537u,102793755u,32u,1611137056u,119956u,273117184u,67108864u}/* 3385 */, /*11568*/{1160773632u,931u,65537u,102793755u,32u,1611137056u,120508u,273117184u,67108864u}/* 3386 */, /*11569*/{1161297920u,931u,65537u,102793755u,32u,1611137056u,119052u,273117184u,67108864u}/* 3387 */, /*11570*/{1161822208u,931u,65537u,102793755u,32u,1611137056u,179036u,407547904u,67108864u}/* 3388 */, /*11571*/{1162346496u,931u,65537u,102793755u,32u,1611137056u,240052u,541995008u,67108864u}/* 3389 */, /*11572*/{1162870784u,931u,65537u,102793755u,32u,1611137056u,122356u,273108992u,67108864u}/* 338A */, /*11573*/{1163395072u,931u,65537u,102793755u,32u,1611137056u,121692u,273108992u,67108864u}/* 338B */, /*11574*/{1163919360u,931u,65537u,102793755u,32u,1611137056u,125932u,273108992u,67108864u}/* 338C */, /*11575*/{1164443648u,931u,65537u,102793755u,32u,1611137056u,126052u,273100800u,67108864u}/* 338D */, /*11576*/{1164967936u,931u,65537u,102793755u,32u,1611137056u,121692u,273100800u,67108864u}/* 338E */, /*11577*/{1165492224u,931u,65537u,102793755u,32u,1611137056u,121140u,273100800u,67108864u}/* 338F */, /*11578*/{1166016512u,931u,65537u,102793755u,32u,1611137056u,124980u,273108992u,67108864u}/* 3390 */, /*11579*/{1166540800u,931u,65537u,102793755u,32u,1611137056u,185996u,407556096u,67108864u}/* 3391 */, /*11580*/{1167065088u,931u,65537u,102793755u,32u,1611137056u,186548u,407564288u,67108864u}/* 3392 */, /*11581*/{1167589376u,931u,65537u,102793755u,32u,1611137056u,185092u,407564288u,67108864u}/* 3393 */, /*11582*/{1168113664u,931u,65537u,102793755u,32u,1611137056u,188428u,407564288u,67108864u}/* 3394 */, /*11583*/{1168637952u,931u,65537u,102793755u,32u,1611137056u,127100u,273100800u,67108864u}/* 3395 */, /*11584*/{1169162240u,931u,65537u,102793755u,32u,1611137056u,122740u,273100800u,67108864u}/* 3396 */, /*11585*/{1169686528u,931u,65537u,102793755u,32u,1611137056u,120476u,273100800u,67108864u}/* 3397 */, /*11586*/{1170210816u,931u,65537u,102793755u,32u,1611137056u,122188u,273100800u,67108864u}/* 3398 */, /*11587*/{1170735104u,931u,65537u,102793755u,32u,1611137056u,121572u,273100800u,67108864u}/* 3399 */, /*11588*/{1171259392u,931u,65537u,102793755u,32u,1611137056u,123268u,273100800u,67108864u}/* 339A */, /*11589*/{1171783680u,931u,65537u,102793755u,32u,1611137056u,127508u,273100800u,67108864u}/* 339B */, /*11590*/{1172307968u,931u,65537u,102793755u,32u,1611137056u,123148u,273100800u,67108864u}/* 339C */, /*11591*/{1172832256u,931u,65537u,102793755u,32u,1611137056u,120716u,273100800u,67108864u}/* 339D */, /*11592*/{1173356544u,931u,65537u,102793755u,32u,1611137056u,122596u,273100800u,67108864u}/* 339E */, /*11593*/{1173880832u,931u,65537u,102793755u,32u,1611137056u,181812u,407547904u,67108864u}/* 339F */, /*11594*/{1174405120u,931u,65537u,102793755u,32u,1611137056u,179380u,407547904u,67108864u}/* 33A0 */, /*11595*/{1174929408u,931u,65537u,102793755u,32u,1611137056u,120244u,273100800u,67108864u}/* 33A1 */, /*11596*/{1175453696u,931u,65537u,102793755u,32u,1611137056u,181260u,407547904u,67108864u}/* 33A2 */, /*11597*/{1175977984u,931u,65537u,102793755u,32u,1611137056u,181820u,407547904u,67108864u}/* 33A3 */, /*11598*/{1176502272u,931u,65537u,102793755u,32u,1611137056u,179388u,407547904u,67108864u}/* 33A4 */, /*11599*/{1177026560u,931u,65537u,102793755u,32u,1611137056u,120252u,273100800u,67108864u}/* 33A5 */, /*11600*/{1177550848u,931u,65537u,102793755u,32u,1611137056u,181268u,407547904u,67108864u}/* 33A6 */, /*11601*/{1178075136u,931u,65537u,102793755u,32u,1611137056u,137500u,407547904u,67108864u}/* 33A7 */, /*11602*/{1178599424u,931u,65537u,102793755u,32u,1611137056u,196164u,541995008u,67108864u}/* 33A8 */, /*11603*/{1179123712u,931u,65537u,102793755u,32u,1611137056u,121092u,273108992u,67108864u}/* 33A9 */, /*11604*/{1179648000u,931u,65537u,102793755u,32u,1611137056u,182108u,407556096u,67108864u}/* 33AA */, /*11605*/{1180172288u,931u,65537u,102793755u,32u,1611137056u,182660u,407564288u,67108864u}/* 33AB */, /*11606*/{1180696576u,931u,65537u,102793755u,32u,1611137056u,181204u,407564288u,67108864u}/* 33AC */, /*11607*/{1181220864u,931u,65537u,102793755u,32u,1611137056u,180708u,407547904u,67108864u}/* 33AD */, /*11608*/{1181745152u,931u,65537u,102793755u,32u,1611137056u,256628u,676442112u,67108864u}/* 33AE */, /*11609*/{1182269440u,931u,65537u,102793755u,32u,1611137056u,315292u,810889216u,67108864u}/* 33AF */, /*11610*/{1182793728u,931u,65537u,102793755u,32u,1611137056u,125524u,273100800u,67108864u}/* 33B0 */, /*11611*/{1183318016u,931u,65537u,102793755u,32u,1611137056u,124860u,273100800u,67108864u}/* 33B1 */, /*11612*/{1183842304u,931u,65537u,102793755u,32u,1611137056u,129100u,273100800u,67108864u}/* 33B2 */, /*11613*/{1184366592u,931u,65537u,102793755u,32u,1611137056u,124740u,273100800u,67108864u}/* 33B3 */, /*11614*/{1184890880u,931u,65537u,102793755u,32u,1611137056u,126436u,273108992u,67108864u}/* 33B4 */, /*11615*/{1185415168u,931u,65537u,102793755u,32u,1611137056u,125772u,273108992u,67108864u}/* 33B5 */, /*11616*/{1185939456u,931u,65537u,102793755u,32u,1611137056u,130012u,273108992u,67108864u}/* 33B6 */, /*11617*/{1186463744u,931u,65537u,102793755u,32u,1611137056u,125652u,273108992u,67108864u}/* 33B7 */, /*11618*/{1186988032u,931u,65537u,102793755u,32u,1611137056u,125100u,273108992u,67108864u}/* 33B8 */, /*11619*/{1187512320u,931u,65537u,102793755u,32u,1611137056u,125652u,273117184u,67108864u}/* 33B9 */, /*11620*/{1188036608u,931u,65537u,102793755u,32u,1611137056u,126580u,273108992u,67108864u}/* 33BA */, /*11621*/{1188560896u,931u,65537u,102793755u,32u,1611137056u,125916u,273108992u,67108864u}/* 33BB */, /*11622*/{1189085184u,931u,65537u,102793755u,32u,1611137056u,130156u,273108992u,67108864u}/* 33BC */, /*11623*/{1189609472u,931u,65537u,102793755u,32u,1611137056u,125796u,273108992u,67108864u}/* 33BD */, /*11624*/{1190133760u,931u,65537u,102793755u,32u,1611137056u,125244u,273108992u,67108864u}/* 33BE */, /*11625*/{1190658048u,931u,65537u,102793755u,32u,1611137056u,125796u,273117184u,67108864u}/* 33BF */, /*11626*/{1191182336u,931u,65537u,102793755u,32u,1611137056u,127132u,273108992u,67108864u}/* 33C0 */, /*11627*/{1191706624u,931u,65537u,102793755u,32u,1611137056u,127684u,273117184u,67108864u}/* 33C1 */, /*11628*/{1192230912u,931u,65537u,102793755u,32u,1611137056u,130420u,541995008u,67108864u}/* 33C2 */, /*11629*/{1192755200u,931u,65537u,102793755u,32u,1611137056u,121460u,273108992u,67108864u}/* 33C3 */, /*11630*/{1193279488u,931u,65537u,102793755u,32u,1611137056u,118284u,273100800u,67108864u}/* 33C4 */, /*11631*/{1193803776u,931u,65537u,102793755u,32u,1611137056u,118452u,273100800u,67108864u}/* 33C5 */, /*11632*/{1194328064u,931u,65537u,102793755u,32u,1611137056u,193036u,542003200u,67108864u}/* 33C6 */, /*11633*/{1194852352u,931u,65537u,102793755u,32u,1611137056u,126180u,407556096u,67108864u}/* 33C7 */, /*11634*/{1195376640u,931u,65537u,102793755u,32u,1611137056u,118244u,273108992u,67108864u}/* 33C8 */, /*11635*/{1195900928u,931u,65537u,102793755u,32u,1611137056u,124516u,273108992u,67108864u}/* 33C9 */, /*11636*/{1196425216u,931u,65537u,102793755u,32u,1611137056u,119140u,273100800u,67108864u}/* 33CA */, /*11637*/{1196949504u,931u,65537u,102793755u,32u,1611137056u,122764u,273117184u,67108864u}/* 33CB */, /*11638*/{1197473792u,931u,65537u,102793755u,32u,1611137056u,122308u,273100800u,67108864u}/* 33CC */, /*11639*/{1197998080u,931u,65537u,102793755u,32u,1611137056u,122044u,273117184u,67108864u}/* 33CD */, /*11640*/{1198522368u,931u,65537u,102793755u,32u,1611137056u,122596u,273117184u,67108864u}/* 33CE */, /*11641*/{1199046656u,931u,65537u,102793755u,32u,1611137056u,124476u,273100800u,67108864u}/* 33CF */, /*11642*/{1199570944u,931u,65537u,102793755u,32u,1611137056u,122740u,273100800u,67108864u}/* 33D0 */, /*11643*/{1200095232u,931u,65537u,102793755u,32u,1611137056u,122860u,273100800u,67108864u}/* 33D1 */, /*11644*/{1200619520u,931u,65537u,102793755u,32u,1611137056u,183260u,407547904u,67108864u}/* 33D2 */, /*11645*/{1201143808u,931u,65537u,102793755u,32u,1611137056u,125468u,273100800u,67108864u}/* 33D3 */, /*11646*/{1201668096u,931u,65537u,102793755u,32u,1611137056u,120508u,273100800u,67108864u}/* 33D4 */, /*11647*/{1202192384u,931u,65537u,102793755u,32u,1611137056u,183348u,407547904u,67108864u}/* 33D5 */, /*11648*/{1202716672u,931u,65537u,102793755u,32u,1611137056u,184716u,407547904u,67108864u}/* 33D6 */, /*11649*/{1203240960u,931u,65537u,102793755u,32u,1611137056u,122764u,273117184u,67108864u}/* 33D7 */, /*11650*/{1203765248u,931u,65537u,102793755u,32u,1611137056u,134044u,541995008u,67108864u}/* 33D8 */, /*11651*/{1204289536u,931u,65537u,102793755u,32u,1611137056u,186284u,407572480u,67108864u}/* 33D9 */, /*11652*/{1204813824u,931u,65537u,102793755u,32u,1611137056u,125028u,273117184u,67108864u}/* 33DA */, /*11653*/{1205338112u,931u,65537u,102793755u,32u,1611137056u,125836u,273100800u,67108864u}/* 33DB */, /*11654*/{1205862400u,931u,65537u,102793755u,32u,1611137056u,127244u,273108992u,67108864u}/* 33DC */, /*11655*/{1206386688u,931u,65537u,102793755u,32u,1611137056u,123156u,273108992u,67108864u}/* 33DD */, /*11656*/{1206910976u,931u,65537u,103000603u,32u,1611137056u,138412u,407556096u,67108864u}/* 33DE */, /*11657*/{1207435264u,931u,65537u,103000603u,32u,1611137056u,133068u,407556096u,67108864u}/* 33DF */, /*11658*/{1207959552u,931u,65537u,102793307u,32u,1611137056u,1044052u,272707584u,67108864u}/* 33E0 */, /*11659*/{1208483840u,931u,65537u,102793307u,32u,1611137056u,1044060u,272707584u,67108864u}/* 33E1 */, /*11660*/{1209008128u,931u,65537u,102793307u,32u,1611137056u,1044068u,272707584u,67108864u}/* 33E2 */, /*11661*/{1209532416u,931u,65537u,102793307u,32u,1611137056u,1044076u,272707584u,67108864u}/* 33E3 */, /*11662*/{1210056704u,931u,65537u,102793307u,32u,1611137056u,1044084u,272707584u,67108864u}/* 33E4 */, /*11663*/{1210580992u,931u,65537u,102793307u,32u,1611137056u,1044092u,272707584u,67108864u}/* 33E5 */, /*11664*/{1211105280u,931u,65537u,102793307u,32u,1611137056u,1044100u,272707584u,67108864u}/* 33E6 */, /*11665*/{1211629568u,931u,65537u,102793307u,32u,1611137056u,1044108u,272707584u,67108864u}/* 33E7 */, /*11666*/{1212153856u,931u,65537u,102793307u,32u,1611137056u,1044116u,272707584u,67108864u}/* 33E8 */, /*11667*/{1212678144u,931u,65537u,102793307u,32u,1611137056u,1102700u,406958080u,67108864u}/* 33E9 */, /*11668*/{1213202432u,931u,65537u,102793307u,32u,1611137056u,1102708u,406958080u,67108864u}/* 33EA */, /*11669*/{1213726720u,931u,65537u,102793307u,32u,1611137056u,1102716u,406958080u,67108864u}/* 33EB */, /*11670*/{1214251008u,931u,65537u,102793307u,32u,1611137056u,1102724u,406958080u,67108864u}/* 33EC */, /*11671*/{1214775296u,931u,65537u,102793307u,32u,1611137056u,1102732u,406958080u,67108864u}/* 33ED */, /*11672*/{1215299584u,931u,65537u,102793307u,32u,1611137056u,1102740u,406958080u,67108864u}/* 33EE */, /*11673*/{1215823872u,931u,65537u,102793307u,32u,1611137056u,1102748u,406958080u,67108864u}/* 33EF */, /*11674*/{1216348160u,931u,65537u,102793307u,32u,1611137056u,1102756u,406958080u,67108864u}/* 33F0 */, /*11675*/{1216872448u,931u,65537u,102793307u,32u,1611137056u,1102764u,406958080u,67108864u}/* 33F1 */, /*11676*/{1217396736u,931u,65537u,102793307u,32u,1611137056u,1102772u,406958080u,67108864u}/* 33F2 */, /*11677*/{1217921024u,931u,65537u,102793307u,32u,1611137056u,1102708u,406958080u,67108864u}/* 33F3 */, /*11678*/{1218445312u,931u,65537u,102793307u,32u,1611137056u,1102716u,406958080u,67108864u}/* 33F4 */, /*11679*/{1218969600u,931u,65537u,102793307u,32u,1611137056u,1102724u,406958080u,67108864u}/* 33F5 */, /*11680*/{1219493888u,931u,65537u,102793307u,32u,1611137056u,1102732u,406958080u,67108864u}/* 33F6 */, /*11681*/{1220018176u,931u,65537u,102793307u,32u,1611137056u,1102740u,406958080u,67108864u}/* 33F7 */, /*11682*/{1220542464u,931u,65537u,102793307u,32u,1611137056u,1102748u,406958080u,67108864u}/* 33F8 */, /*11683*/{1221066752u,931u,65537u,102793307u,32u,1611137056u,1102756u,406958080u,67108864u}/* 33F9 */, /*11684*/{1221591040u,931u,65537u,102793307u,32u,1611137056u,1102764u,406958080u,67108864u}/* 33FA */, /*11685*/{1222115328u,931u,65537u,102793307u,32u,1611137056u,1102772u,406958080u,67108864u}/* 33FB */, /*11686*/{1222639616u,931u,65537u,102793307u,32u,1611137056u,1102780u,406958080u,67108864u}/* 33FC */, /*11687*/{1223163904u,931u,65537u,102793307u,32u,1611137056u,1102716u,406958080u,67108864u}/* 33FD */, /*11688*/{1223688192u,931u,65537u,102793307u,32u,1611137056u,1102724u,406958080u,67108864u}/* 33FE */, /*11689*/{1224212480u,931u,65537u,103000603u,32u,1611137056u,180012u,407547904u,67108864u}/* 33FF */, /*11690*/{0,939u,2359297u,102891525u,73768u,3758096416u,1946157060u,6144u,4587520u}/* 3400 */, /*11691*/{0,939u,673451009u,102891525u,8462378u,3758096416u,1946157060u,6144u,4587520u}/* 3405 */, /*11692*/{0,939u,572787201u,102891525u,8462378u,3758096416u,1946157060u,6144u,4587520u}/* 3483 */, /*11693*/{0,939u,740560385u,102891525u,8462378u,3758096416u,1946157060u,6144u,4587520u}/* 3B4D */, /*11694*/{0,944u,65537u,76785691u,40u,1610612768u,30236u,138442752u,67108864u}/* 4DC0 */, /*11695*/{0,944u,65537u,76785691u,40u,1610612768u,30244u,138442752u,67108864u}/* 4DC1 */, /*11696*/{0,944u,65537u,76785691u,40u,1610612768u,30252u,138442752u,67108864u}/* 4DC2 */, /*11697*/{0,944u,65537u,76785691u,40u,1610612768u,30260u,138442752u,67108864u}/* 4DC3 */, /*11698*/{0,944u,65537u,76785691u,40u,1610612768u,30268u,138442752u,67108864u}/* 4DC4 */, /*11699*/{0,944u,65537u,76785691u,40u,1610612768u,30276u,138442752u,67108864u}/* 4DC5 */, /*11700*/{0,944u,65537u,76785691u,40u,1610612768u,30284u,138442752u,67108864u}/* 4DC6 */, /*11701*/{0,944u,65537u,76785691u,40u,1610612768u,30292u,138442752u,67108864u}/* 4DC7 */, /*11702*/{0,944u,65537u,76785691u,40u,1610612768u,30300u,138442752u,67108864u}/* 4DC8 */, /*11703*/{0,944u,65537u,76785691u,40u,1610612768u,30308u,138442752u,67108864u}/* 4DC9 */, /*11704*/{0,944u,65537u,76785691u,40u,1610612768u,30316u,138442752u,67108864u}/* 4DCA */, /*11705*/{0,944u,65537u,76785691u,40u,1610612768u,30324u,138442752u,67108864u}/* 4DCB */, /*11706*/{0,944u,65537u,76785691u,40u,1610612768u,30332u,138442752u,67108864u}/* 4DCC */, /*11707*/{0,944u,65537u,76785691u,40u,1610612768u,30340u,138442752u,67108864u}/* 4DCD */, /*11708*/{0,944u,65537u,76785691u,40u,1610612768u,30348u,138442752u,67108864u}/* 4DCE */, /*11709*/{0,944u,65537u,76785691u,40u,1610612768u,30356u,138442752u,67108864u}/* 4DCF */, /*11710*/{0,944u,65537u,76785691u,40u,1610612768u,30364u,138442752u,67108864u}/* 4DD0 */, /*11711*/{0,944u,65537u,76785691u,40u,1610612768u,30372u,138442752u,67108864u}/* 4DD1 */, /*11712*/{0,944u,65537u,76785691u,40u,1610612768u,30380u,138442752u,67108864u}/* 4DD2 */, /*11713*/{0,944u,65537u,76785691u,40u,1610612768u,30388u,138442752u,67108864u}/* 4DD3 */, /*11714*/{0,944u,65537u,76785691u,40u,1610612768u,30396u,138442752u,67108864u}/* 4DD4 */, /*11715*/{0,944u,65537u,76785691u,40u,1610612768u,30404u,138442752u,67108864u}/* 4DD5 */, /*11716*/{0,944u,65537u,76785691u,40u,1610612768u,30412u,138442752u,67108864u}/* 4DD6 */, /*11717*/{0,944u,65537u,76785691u,40u,1610612768u,30420u,138442752u,67108864u}/* 4DD7 */, /*11718*/{0,944u,65537u,76785691u,40u,1610612768u,30428u,138442752u,67108864u}/* 4DD8 */, /*11719*/{0,944u,65537u,76785691u,40u,1610612768u,30436u,138442752u,67108864u}/* 4DD9 */, /*11720*/{0,944u,65537u,76785691u,40u,1610612768u,30444u,138442752u,67108864u}/* 4DDA */, /*11721*/{0,944u,65537u,76785691u,40u,1610612768u,30452u,138442752u,67108864u}/* 4DDB */, /*11722*/{0,944u,65537u,76785691u,40u,1610612768u,30460u,138442752u,67108864u}/* 4DDC */, /*11723*/{0,944u,65537u,76785691u,40u,1610612768u,30468u,138442752u,67108864u}/* 4DDD */, /*11724*/{0,944u,65537u,76785691u,40u,1610612768u,30476u,138442752u,67108864u}/* 4DDE */, /*11725*/{0,944u,65537u,76785691u,40u,1610612768u,30484u,138442752u,67108864u}/* 4DDF */, /*11726*/{0,944u,65537u,76785691u,40u,1610612768u,30492u,138442752u,67108864u}/* 4DE0 */, /*11727*/{0,944u,65537u,76785691u,40u,1610612768u,30500u,138442752u,67108864u}/* 4DE1 */, /*11728*/{0,944u,65537u,76785691u,40u,1610612768u,30508u,138442752u,67108864u}/* 4DE2 */, /*11729*/{0,944u,65537u,76785691u,40u,1610612768u,30516u,138442752u,67108864u}/* 4DE3 */, /*11730*/{0,944u,65537u,76785691u,40u,1610612768u,30524u,138442752u,67108864u}/* 4DE4 */, /*11731*/{0,944u,65537u,76785691u,40u,1610612768u,30532u,138442752u,67108864u}/* 4DE5 */, /*11732*/{0,944u,65537u,76785691u,40u,1610612768u,30540u,138442752u,67108864u}/* 4DE6 */, /*11733*/{0,944u,65537u,76785691u,40u,1610612768u,30548u,138442752u,67108864u}/* 4DE7 */, /*11734*/{0,944u,65537u,76785691u,40u,1610612768u,30556u,138442752u,67108864u}/* 4DE8 */, /*11735*/{0,944u,65537u,76785691u,40u,1610612768u,30564u,138442752u,67108864u}/* 4DE9 */, /*11736*/{0,944u,65537u,76785691u,40u,1610612768u,30572u,138442752u,67108864u}/* 4DEA */, /*11737*/{0,944u,65537u,76785691u,40u,1610612768u,30580u,138442752u,67108864u}/* 4DEB */, /*11738*/{0,944u,65537u,76785691u,40u,1610612768u,30588u,138442752u,67108864u}/* 4DEC */, /*11739*/{0,944u,65537u,76785691u,40u,1610612768u,30596u,138442752u,67108864u}/* 4DED */, /*11740*/{0,944u,65537u,76785691u,40u,1610612768u,30604u,138442752u,67108864u}/* 4DEE */, /*11741*/{0,944u,65537u,76785691u,40u,1610612768u,30612u,138442752u,67108864u}/* 4DEF */, /*11742*/{0,944u,65537u,76785691u,40u,1610612768u,30620u,138442752u,67108864u}/* 4DF0 */, /*11743*/{0,944u,65537u,76785691u,40u,1610612768u,30628u,138442752u,67108864u}/* 4DF1 */, /*11744*/{0,944u,65537u,76785691u,40u,1610612768u,30636u,138442752u,67108864u}/* 4DF2 */, /*11745*/{0,944u,65537u,76785691u,40u,1610612768u,30644u,138442752u,67108864u}/* 4DF3 */, /*11746*/{0,944u,65537u,76785691u,40u,1610612768u,30652u,138442752u,67108864u}/* 4DF4 */, /*11747*/{0,944u,65537u,76785691u,40u,1610612768u,30660u,138442752u,67108864u}/* 4DF5 */, /*11748*/{0,944u,65537u,76785691u,40u,1610612768u,30668u,138442752u,67108864u}/* 4DF6 */, /*11749*/{0,944u,65537u,76785691u,40u,1610612768u,30676u,138442752u,67108864u}/* 4DF7 */, /*11750*/{0,944u,65537u,76785691u,40u,1610612768u,30684u,138442752u,67108864u}/* 4DF8 */, /*11751*/{0,944u,65537u,76785691u,40u,1610612768u,30692u,138442752u,67108864u}/* 4DF9 */, /*11752*/{0,944u,65537u,76785691u,40u,1610612768u,30700u,138442752u,67108864u}/* 4DFA */, /*11753*/{0,944u,65537u,76785691u,40u,1610612768u,30708u,138442752u,67108864u}/* 4DFB */, /*11754*/{0,944u,65537u,76785691u,40u,1610612768u,30716u,138442752u,67108864u}/* 4DFC */, /*11755*/{0,944u,65537u,76785691u,40u,1610612768u,30724u,138442752u,67108864u}/* 4DFD */, /*11756*/{0,944u,65537u,76785691u,40u,1610612768u,30732u,138442752u,67108864u}/* 4DFE */, /*11757*/{0,944u,65537u,76785691u,40u,1610612768u,30740u,138442752u,67108864u}/* 4DFF */, /*11758*/{0,955u,539231745u,102793221u,8462378u,3758096416u,1946157060u,6144u,4587520u}/* 4E00 */, /*11759*/{0,955u,2359297u,102793221u,73768u,3758096416u,1946157060u,6144u,4587520u}/* 4E01 */, /*11760*/{0,955u,740560385u,102793221u,8462378u,3758096416u,1946157060u,6144u,4587520u}/* 4E03 */, /*11761*/{0,955u,1881445889u,102793221u,8462378u,3758096416u,1946157060u,6144u,4587520u}/* 4E07 */, /*11762*/{0,955u,606341121u,102793221u,8462378u,3758096416u,1946157060u,6144u,4587520u}/* 4E09 */, /*11763*/{0,955u,807670785u,102793221u,8462378u,3758096416u,1946157060u,6144u,4587520u}/* 4E5D */, /*11764*/{0,955u,572787201u,102793221u,8462378u,3758096416u,1946157060u,6144u,4587520u}/* 4E8C */, /*11765*/{0,955u,673451009u,102793221u,8462378u,3758096416u,1946157060u,6144u,4587520u}/* 4E94 */, /*11766*/{0,955u,639897601u,102793221u,8462378u,3758096416u,1946157060u,6144u,4587520u}/* 4E96 */, /*11767*/{0,955u,2233778177u,102793221u,8462378u,3758096416u,1946157060u,6144u,4587520u}/* 4EBF */, /*11768*/{0,955u,824451073u,102793221u,8462378u,3758096416u,1946157060u,6144u,4587520u}/* 4EC0 */, /*11769*/{0,955u,1730446337u,102793221u,8462378u,3758096416u,1946157060u,6144u,4587520u}/* 4EDF */, /*11770*/{0,955u,1579446785u,102793221u,8462378u,3758096416u,1946157060u,6144u,4587520u}/* 4F70 */, /*11771*/{0,955u,2267333633u,102793221u,8462378u,3758096416u,1946157060u,6144u,4587520u}/* 5146 */, /*11772*/{0,955u,774118401u,102793221u,8462378u,3758096416u,1946157060u,6144u,4587520u}/* 516B */, /*11773*/{0,955u,707008001u,102793221u,8462378u,3758096416u,1946157060u,6144u,4587520u}/* 516D */, /*11774*/{0,955u,992226305u,102793221u,8462378u,3758096416u,1946157060u,6144u,4587520u}/* 5344 */, /*11775*/{0,955u,1160003585u,102793221u,8462378u,3758096416u,1946157060u,6144u,4587520u}/* 5345 */, /*11776*/{0,955u,1327780865u,102793221u,8462378u,3758096416u,1946157060u,6144u,4587520u}/* 534C */, /*11777*/{0,955u,35914753u,102793221u,8462378u,3758096416u,1946157060u,6144u,4587520u}/* 96F6 */, /*11778*/{0,955u,2359297u,103022597u,73768u,3758096416u,1946157060u,6144u,4587520u}/* 9FA6 */, /*11779*/{0,955u,2359297u,103088133u,73768u,3758096416u,1946157060u,6144u,4587520u}/* 9FBC */, /*11780*/{0,955u,2359297u,103120901u,73768u,3758096416u,1946157060u,6144u,4587520u}/* 9FC4 */, /*11781*/{0,955u,2359297u,103186437u,73768u,3758096416u,1946157060u,6144u,4587520u}/* 9FCC */, /*11782*/{0,955u,2359297u,103317509u,73768u,3758096416u,1946157060u,6144u,4587520u}/* 9FCD */, /*11783*/{0,955u,2359297u,103383045u,73768u,3758096416u,1946157060u,6144u,4587520u}/* 9FD6 */, /*11784*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852580u,138442752u,393216u}/* A000 */, /*11785*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852588u,138442752u,393216u}/* A001 */, /*11786*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852596u,138442752u,393216u}/* A002 */, /*11787*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852604u,138442752u,393216u}/* A003 */, /*11788*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852612u,138442752u,393216u}/* A004 */, /*11789*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852620u,138442752u,393216u}/* A005 */, /*11790*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852628u,138442752u,393216u}/* A006 */, /*11791*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852636u,138442752u,393216u}/* A007 */, /*11792*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852644u,138442752u,393216u}/* A008 */, /*11793*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852652u,138442752u,393216u}/* A009 */, /*11794*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852660u,138442752u,393216u}/* A00A */, /*11795*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852668u,138442752u,393216u}/* A00B */, /*11796*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852676u,138442752u,393216u}/* A00C */, /*11797*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852684u,138442752u,393216u}/* A00D */, /*11798*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852692u,138442752u,393216u}/* A00E */, /*11799*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852700u,138442752u,393216u}/* A00F */, /*11800*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852708u,138442752u,393216u}/* A010 */, /*11801*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852716u,138442752u,393216u}/* A011 */, /*11802*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852724u,138442752u,393216u}/* A012 */, /*11803*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852732u,138442752u,393216u}/* A013 */, /*11804*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852740u,138442752u,393216u}/* A014 */, /*11805*/{0,963u,2424833u,96600068u,1515560u,3774873760u,1677852748u,138442752u,393216u}/* A015 */, /*11806*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852756u,138442752u,393216u}/* A016 */, /*11807*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852764u,138442752u,393216u}/* A017 */, /*11808*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852772u,138442752u,393216u}/* A018 */, /*11809*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852780u,138442752u,393216u}/* A019 */, /*11810*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852788u,138442752u,393216u}/* A01A */, /*11811*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852796u,138442752u,393216u}/* A01B */, /*11812*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852804u,138442752u,393216u}/* A01C */, /*11813*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852812u,138442752u,393216u}/* A01D */, /*11814*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852820u,138442752u,393216u}/* A01E */, /*11815*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852828u,138442752u,393216u}/* A01F */, /*11816*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852836u,138442752u,393216u}/* A020 */, /*11817*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852844u,138442752u,393216u}/* A021 */, /*11818*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852852u,138442752u,393216u}/* A022 */, /*11819*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852860u,138442752u,393216u}/* A023 */, /*11820*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852868u,138442752u,393216u}/* A024 */, /*11821*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852876u,138442752u,393216u}/* A025 */, /*11822*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852884u,138442752u,393216u}/* A026 */, /*11823*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852892u,138442752u,393216u}/* A027 */, /*11824*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852900u,138442752u,393216u}/* A028 */, /*11825*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852908u,138442752u,393216u}/* A029 */, /*11826*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852916u,138442752u,393216u}/* A02A */, /*11827*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852924u,138442752u,393216u}/* A02B */, /*11828*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852932u,138442752u,393216u}/* A02C */, /*11829*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852940u,138442752u,393216u}/* A02D */, /*11830*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852948u,138442752u,393216u}/* A02E */, /*11831*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852956u,138442752u,393216u}/* A02F */, /*11832*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852964u,138442752u,393216u}/* A030 */, /*11833*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852972u,138442752u,393216u}/* A031 */, /*11834*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852980u,138442752u,393216u}/* A032 */, /*11835*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852988u,138442752u,393216u}/* A033 */, /*11836*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677852996u,138442752u,393216u}/* A034 */, /*11837*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853004u,138442752u,393216u}/* A035 */, /*11838*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853012u,138442752u,393216u}/* A036 */, /*11839*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853020u,138442752u,393216u}/* A037 */, /*11840*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853028u,138442752u,393216u}/* A038 */, /*11841*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853036u,138442752u,393216u}/* A039 */, /*11842*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853044u,138442752u,393216u}/* A03A */, /*11843*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853052u,138442752u,393216u}/* A03B */, /*11844*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853060u,138442752u,393216u}/* A03C */, /*11845*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853068u,138442752u,393216u}/* A03D */, /*11846*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853076u,138442752u,393216u}/* A03E */, /*11847*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853084u,138442752u,393216u}/* A03F */, /*11848*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853092u,138442752u,393216u}/* A040 */, /*11849*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853100u,138442752u,393216u}/* A041 */, /*11850*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853108u,138442752u,393216u}/* A042 */, /*11851*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853116u,138442752u,393216u}/* A043 */, /*11852*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853124u,138442752u,393216u}/* A044 */, /*11853*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853132u,138442752u,393216u}/* A045 */, /*11854*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853140u,138442752u,393216u}/* A046 */, /*11855*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853148u,138442752u,393216u}/* A047 */, /*11856*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853156u,138442752u,393216u}/* A048 */, /*11857*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853164u,138442752u,393216u}/* A049 */, /*11858*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853172u,138442752u,393216u}/* A04A */, /*11859*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853180u,138442752u,393216u}/* A04B */, /*11860*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853188u,138442752u,393216u}/* A04C */, /*11861*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853196u,138442752u,393216u}/* A04D */, /*11862*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853204u,138442752u,393216u}/* A04E */, /*11863*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853212u,138442752u,393216u}/* A04F */, /*11864*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853220u,138442752u,393216u}/* A050 */, /*11865*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853228u,138442752u,393216u}/* A051 */, /*11866*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853236u,138442752u,393216u}/* A052 */, /*11867*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853244u,138442752u,393216u}/* A053 */, /*11868*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853252u,138442752u,393216u}/* A054 */, /*11869*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853260u,138442752u,393216u}/* A055 */, /*11870*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853268u,138442752u,393216u}/* A056 */, /*11871*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853276u,138442752u,393216u}/* A057 */, /*11872*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853284u,138442752u,393216u}/* A058 */, /*11873*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853292u,138442752u,393216u}/* A059 */, /*11874*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853300u,138442752u,393216u}/* A05A */, /*11875*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853308u,138442752u,393216u}/* A05B */, /*11876*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853316u,138442752u,393216u}/* A05C */, /*11877*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853324u,138442752u,393216u}/* A05D */, /*11878*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853332u,138442752u,393216u}/* A05E */, /*11879*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853340u,138442752u,393216u}/* A05F */, /*11880*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853348u,138442752u,393216u}/* A060 */, /*11881*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853356u,138442752u,393216u}/* A061 */, /*11882*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853364u,138442752u,393216u}/* A062 */, /*11883*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853372u,138442752u,393216u}/* A063 */, /*11884*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853380u,138442752u,393216u}/* A064 */, /*11885*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853388u,138442752u,393216u}/* A065 */, /*11886*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853396u,138442752u,393216u}/* A066 */, /*11887*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853404u,138442752u,393216u}/* A067 */, /*11888*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853412u,138442752u,393216u}/* A068 */, /*11889*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853420u,138442752u,393216u}/* A069 */, /*11890*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853428u,138442752u,393216u}/* A06A */, /*11891*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853436u,138442752u,393216u}/* A06B */, /*11892*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853444u,138442752u,393216u}/* A06C */, /*11893*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853452u,138442752u,393216u}/* A06D */, /*11894*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853460u,138442752u,393216u}/* A06E */, /*11895*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853468u,138442752u,393216u}/* A06F */, /*11896*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853476u,138442752u,393216u}/* A070 */, /*11897*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853484u,138442752u,393216u}/* A071 */, /*11898*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853492u,138442752u,393216u}/* A072 */, /*11899*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853500u,138442752u,393216u}/* A073 */, /*11900*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853508u,138442752u,393216u}/* A074 */, /*11901*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853516u,138442752u,393216u}/* A075 */, /*11902*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853524u,138442752u,393216u}/* A076 */, /*11903*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853532u,138442752u,393216u}/* A077 */, /*11904*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853540u,138442752u,393216u}/* A078 */, /*11905*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853548u,138442752u,393216u}/* A079 */, /*11906*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853556u,138442752u,393216u}/* A07A */, /*11907*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853564u,138442752u,393216u}/* A07B */, /*11908*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853572u,138442752u,393216u}/* A07C */, /*11909*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853580u,138442752u,393216u}/* A07D */, /*11910*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853588u,138442752u,393216u}/* A07E */, /*11911*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853596u,138442752u,393216u}/* A07F */, /*11912*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853604u,138442752u,393216u}/* A080 */, /*11913*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853612u,138442752u,393216u}/* A081 */, /*11914*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853620u,138442752u,393216u}/* A082 */, /*11915*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853628u,138442752u,393216u}/* A083 */, /*11916*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853636u,138442752u,393216u}/* A084 */, /*11917*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853644u,138442752u,393216u}/* A085 */, /*11918*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853652u,138442752u,393216u}/* A086 */, /*11919*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853660u,138442752u,393216u}/* A087 */, /*11920*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853668u,138442752u,393216u}/* A088 */, /*11921*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853676u,138442752u,393216u}/* A089 */, /*11922*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853684u,138442752u,393216u}/* A08A */, /*11923*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853692u,138442752u,393216u}/* A08B */, /*11924*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853700u,138442752u,393216u}/* A08C */, /*11925*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853708u,138442752u,393216u}/* A08D */, /*11926*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853716u,138442752u,393216u}/* A08E */, /*11927*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853724u,138442752u,393216u}/* A08F */, /*11928*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853732u,138442752u,393216u}/* A090 */, /*11929*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853740u,138442752u,393216u}/* A091 */, /*11930*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853748u,138442752u,393216u}/* A092 */, /*11931*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853756u,138442752u,393216u}/* A093 */, /*11932*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853764u,138442752u,393216u}/* A094 */, /*11933*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853772u,138442752u,393216u}/* A095 */, /*11934*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853780u,138442752u,393216u}/* A096 */, /*11935*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853788u,138442752u,393216u}/* A097 */, /*11936*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853796u,138442752u,393216u}/* A098 */, /*11937*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853804u,138442752u,393216u}/* A099 */, /*11938*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853812u,138442752u,393216u}/* A09A */, /*11939*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853820u,138442752u,393216u}/* A09B */, /*11940*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853828u,138442752u,393216u}/* A09C */, /*11941*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853836u,138442752u,393216u}/* A09D */, /*11942*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853844u,138442752u,393216u}/* A09E */, /*11943*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853852u,138442752u,393216u}/* A09F */, /*11944*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853860u,138442752u,393216u}/* A0A0 */, /*11945*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853868u,138442752u,393216u}/* A0A1 */, /*11946*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853876u,138442752u,393216u}/* A0A2 */, /*11947*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853884u,138442752u,393216u}/* A0A3 */, /*11948*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853892u,138442752u,393216u}/* A0A4 */, /*11949*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853900u,138442752u,393216u}/* A0A5 */, /*11950*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853908u,138442752u,393216u}/* A0A6 */, /*11951*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853916u,138442752u,393216u}/* A0A7 */, /*11952*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853924u,138442752u,393216u}/* A0A8 */, /*11953*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853932u,138442752u,393216u}/* A0A9 */, /*11954*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853940u,138442752u,393216u}/* A0AA */, /*11955*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853948u,138442752u,393216u}/* A0AB */, /*11956*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853956u,138442752u,393216u}/* A0AC */, /*11957*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853964u,138442752u,393216u}/* A0AD */, /*11958*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853972u,138442752u,393216u}/* A0AE */, /*11959*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853980u,138442752u,393216u}/* A0AF */, /*11960*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853988u,138442752u,393216u}/* A0B0 */, /*11961*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677853996u,138442752u,393216u}/* A0B1 */, /*11962*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854004u,138442752u,393216u}/* A0B2 */, /*11963*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854012u,138442752u,393216u}/* A0B3 */, /*11964*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854020u,138442752u,393216u}/* A0B4 */, /*11965*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854028u,138442752u,393216u}/* A0B5 */, /*11966*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854036u,138442752u,393216u}/* A0B6 */, /*11967*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854044u,138442752u,393216u}/* A0B7 */, /*11968*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854052u,138442752u,393216u}/* A0B8 */, /*11969*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854060u,138442752u,393216u}/* A0B9 */, /*11970*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854068u,138442752u,393216u}/* A0BA */, /*11971*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854076u,138442752u,393216u}/* A0BB */, /*11972*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854084u,138442752u,393216u}/* A0BC */, /*11973*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854092u,138442752u,393216u}/* A0BD */, /*11974*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854100u,138442752u,393216u}/* A0BE */, /*11975*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854108u,138442752u,393216u}/* A0BF */, /*11976*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854116u,138442752u,393216u}/* A0C0 */, /*11977*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854124u,138442752u,393216u}/* A0C1 */, /*11978*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854132u,138442752u,393216u}/* A0C2 */, /*11979*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854140u,138442752u,393216u}/* A0C3 */, /*11980*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854148u,138442752u,393216u}/* A0C4 */, /*11981*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854156u,138442752u,393216u}/* A0C5 */, /*11982*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854164u,138442752u,393216u}/* A0C6 */, /*11983*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854172u,138442752u,393216u}/* A0C7 */, /*11984*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854180u,138442752u,393216u}/* A0C8 */, /*11985*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854188u,138442752u,393216u}/* A0C9 */, /*11986*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854196u,138442752u,393216u}/* A0CA */, /*11987*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854204u,138442752u,393216u}/* A0CB */, /*11988*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854212u,138442752u,393216u}/* A0CC */, /*11989*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854220u,138442752u,393216u}/* A0CD */, /*11990*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854228u,138442752u,393216u}/* A0CE */, /*11991*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854236u,138442752u,393216u}/* A0CF */, /*11992*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854244u,138442752u,393216u}/* A0D0 */, /*11993*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854252u,138442752u,393216u}/* A0D1 */, /*11994*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854260u,138442752u,393216u}/* A0D2 */, /*11995*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854268u,138442752u,393216u}/* A0D3 */, /*11996*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854276u,138442752u,393216u}/* A0D4 */, /*11997*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854284u,138442752u,393216u}/* A0D5 */, /*11998*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854292u,138442752u,393216u}/* A0D6 */, /*11999*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854300u,138442752u,393216u}/* A0D7 */, /*12000*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854308u,138442752u,393216u}/* A0D8 */, /*12001*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854316u,138442752u,393216u}/* A0D9 */, /*12002*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854324u,138442752u,393216u}/* A0DA */, /*12003*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854332u,138442752u,393216u}/* A0DB */, /*12004*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854340u,138442752u,393216u}/* A0DC */, /*12005*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854348u,138442752u,393216u}/* A0DD */, /*12006*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854356u,138442752u,393216u}/* A0DE */, /*12007*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854364u,138442752u,393216u}/* A0DF */, /*12008*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854372u,138442752u,393216u}/* A0E0 */, /*12009*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854380u,138442752u,393216u}/* A0E1 */, /*12010*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854388u,138442752u,393216u}/* A0E2 */, /*12011*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854396u,138442752u,393216u}/* A0E3 */, /*12012*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854404u,138442752u,393216u}/* A0E4 */, /*12013*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854412u,138442752u,393216u}/* A0E5 */, /*12014*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854420u,138442752u,393216u}/* A0E6 */, /*12015*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854428u,138442752u,393216u}/* A0E7 */, /*12016*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854436u,138442752u,393216u}/* A0E8 */, /*12017*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854444u,138442752u,393216u}/* A0E9 */, /*12018*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854452u,138442752u,393216u}/* A0EA */, /*12019*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854460u,138442752u,393216u}/* A0EB */, /*12020*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854468u,138442752u,393216u}/* A0EC */, /*12021*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854476u,138442752u,393216u}/* A0ED */, /*12022*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854484u,138442752u,393216u}/* A0EE */, /*12023*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854492u,138442752u,393216u}/* A0EF */, /*12024*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854500u,138442752u,393216u}/* A0F0 */, /*12025*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854508u,138442752u,393216u}/* A0F1 */, /*12026*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854516u,138442752u,393216u}/* A0F2 */, /*12027*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854524u,138442752u,393216u}/* A0F3 */, /*12028*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854532u,138442752u,393216u}/* A0F4 */, /*12029*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854540u,138442752u,393216u}/* A0F5 */, /*12030*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854548u,138442752u,393216u}/* A0F6 */, /*12031*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854556u,138442752u,393216u}/* A0F7 */, /*12032*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854564u,138442752u,393216u}/* A0F8 */, /*12033*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854572u,138442752u,393216u}/* A0F9 */, /*12034*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854580u,138442752u,393216u}/* A0FA */, /*12035*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854588u,138442752u,393216u}/* A0FB */, /*12036*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854596u,138442752u,393216u}/* A0FC */, /*12037*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854604u,138442752u,393216u}/* A0FD */, /*12038*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854612u,138442752u,393216u}/* A0FE */, /*12039*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854620u,138442752u,393216u}/* A0FF */, /*12040*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854628u,138442752u,393216u}/* A100 */, /*12041*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854636u,138442752u,393216u}/* A101 */, /*12042*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854644u,138442752u,393216u}/* A102 */, /*12043*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854652u,138442752u,393216u}/* A103 */, /*12044*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854660u,138442752u,393216u}/* A104 */, /*12045*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854668u,138442752u,393216u}/* A105 */, /*12046*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854676u,138442752u,393216u}/* A106 */, /*12047*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854684u,138442752u,393216u}/* A107 */, /*12048*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854692u,138442752u,393216u}/* A108 */, /*12049*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854700u,138442752u,393216u}/* A109 */, /*12050*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854708u,138442752u,393216u}/* A10A */, /*12051*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854716u,138442752u,393216u}/* A10B */, /*12052*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854724u,138442752u,393216u}/* A10C */, /*12053*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854732u,138442752u,393216u}/* A10D */, /*12054*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854740u,138442752u,393216u}/* A10E */, /*12055*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854748u,138442752u,393216u}/* A10F */, /*12056*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854756u,138442752u,393216u}/* A110 */, /*12057*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854764u,138442752u,393216u}/* A111 */, /*12058*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854772u,138442752u,393216u}/* A112 */, /*12059*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854780u,138442752u,393216u}/* A113 */, /*12060*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854788u,138442752u,393216u}/* A114 */, /*12061*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854796u,138442752u,393216u}/* A115 */, /*12062*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854804u,138442752u,393216u}/* A116 */, /*12063*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854812u,138442752u,393216u}/* A117 */, /*12064*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854820u,138442752u,393216u}/* A118 */, /*12065*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854828u,138442752u,393216u}/* A119 */, /*12066*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854836u,138442752u,393216u}/* A11A */, /*12067*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854844u,138442752u,393216u}/* A11B */, /*12068*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854852u,138442752u,393216u}/* A11C */, /*12069*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854860u,138442752u,393216u}/* A11D */, /*12070*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854868u,138442752u,393216u}/* A11E */, /*12071*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854876u,138442752u,393216u}/* A11F */, /*12072*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854884u,138442752u,393216u}/* A120 */, /*12073*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854892u,138442752u,393216u}/* A121 */, /*12074*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854900u,138442752u,393216u}/* A122 */, /*12075*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854908u,138442752u,393216u}/* A123 */, /*12076*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854916u,138442752u,393216u}/* A124 */, /*12077*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854924u,138442752u,393216u}/* A125 */, /*12078*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854932u,138442752u,393216u}/* A126 */, /*12079*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854940u,138442752u,393216u}/* A127 */, /*12080*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854948u,138442752u,393216u}/* A128 */, /*12081*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854956u,138442752u,393216u}/* A129 */, /*12082*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854964u,138442752u,393216u}/* A12A */, /*12083*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854972u,138442752u,393216u}/* A12B */, /*12084*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854980u,138442752u,393216u}/* A12C */, /*12085*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854988u,138442752u,393216u}/* A12D */, /*12086*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677854996u,138442752u,393216u}/* A12E */, /*12087*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855004u,138442752u,393216u}/* A12F */, /*12088*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855012u,138442752u,393216u}/* A130 */, /*12089*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855020u,138442752u,393216u}/* A131 */, /*12090*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855028u,138442752u,393216u}/* A132 */, /*12091*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855036u,138442752u,393216u}/* A133 */, /*12092*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855044u,138442752u,393216u}/* A134 */, /*12093*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855052u,138442752u,393216u}/* A135 */, /*12094*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855060u,138442752u,393216u}/* A136 */, /*12095*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855068u,138442752u,393216u}/* A137 */, /*12096*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855076u,138442752u,393216u}/* A138 */, /*12097*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855084u,138442752u,393216u}/* A139 */, /*12098*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855092u,138442752u,393216u}/* A13A */, /*12099*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855100u,138442752u,393216u}/* A13B */, /*12100*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855108u,138442752u,393216u}/* A13C */, /*12101*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855116u,138442752u,393216u}/* A13D */, /*12102*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855124u,138442752u,393216u}/* A13E */, /*12103*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855132u,138442752u,393216u}/* A13F */, /*12104*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855140u,138442752u,393216u}/* A140 */, /*12105*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855148u,138442752u,393216u}/* A141 */, /*12106*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855156u,138442752u,393216u}/* A142 */, /*12107*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855164u,138442752u,393216u}/* A143 */, /*12108*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855172u,138442752u,393216u}/* A144 */, /*12109*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855180u,138442752u,393216u}/* A145 */, /*12110*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855188u,138442752u,393216u}/* A146 */, /*12111*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855196u,138442752u,393216u}/* A147 */, /*12112*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855204u,138442752u,393216u}/* A148 */, /*12113*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855212u,138442752u,393216u}/* A149 */, /*12114*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855220u,138442752u,393216u}/* A14A */, /*12115*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855228u,138442752u,393216u}/* A14B */, /*12116*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855236u,138442752u,393216u}/* A14C */, /*12117*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855244u,138442752u,393216u}/* A14D */, /*12118*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855252u,138442752u,393216u}/* A14E */, /*12119*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855260u,138442752u,393216u}/* A14F */, /*12120*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855268u,138442752u,393216u}/* A150 */, /*12121*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855276u,138442752u,393216u}/* A151 */, /*12122*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855284u,138442752u,393216u}/* A152 */, /*12123*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855292u,138442752u,393216u}/* A153 */, /*12124*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855300u,138442752u,393216u}/* A154 */, /*12125*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855308u,138442752u,393216u}/* A155 */, /*12126*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855316u,138442752u,393216u}/* A156 */, /*12127*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855324u,138442752u,393216u}/* A157 */, /*12128*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855332u,138442752u,393216u}/* A158 */, /*12129*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855340u,138442752u,393216u}/* A159 */, /*12130*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855348u,138442752u,393216u}/* A15A */, /*12131*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855356u,138442752u,393216u}/* A15B */, /*12132*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855364u,138442752u,393216u}/* A15C */, /*12133*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855372u,138442752u,393216u}/* A15D */, /*12134*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855380u,138442752u,393216u}/* A15E */, /*12135*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855388u,138442752u,393216u}/* A15F */, /*12136*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855396u,138442752u,393216u}/* A160 */, /*12137*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855404u,138442752u,393216u}/* A161 */, /*12138*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855412u,138442752u,393216u}/* A162 */, /*12139*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855420u,138442752u,393216u}/* A163 */, /*12140*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855428u,138442752u,393216u}/* A164 */, /*12141*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855436u,138442752u,393216u}/* A165 */, /*12142*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855444u,138442752u,393216u}/* A166 */, /*12143*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855452u,138442752u,393216u}/* A167 */, /*12144*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855460u,138442752u,393216u}/* A168 */, /*12145*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855468u,138442752u,393216u}/* A169 */, /*12146*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855476u,138442752u,393216u}/* A16A */, /*12147*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855484u,138442752u,393216u}/* A16B */, /*12148*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855492u,138442752u,393216u}/* A16C */, /*12149*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855500u,138442752u,393216u}/* A16D */, /*12150*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855508u,138442752u,393216u}/* A16E */, /*12151*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855516u,138442752u,393216u}/* A16F */, /*12152*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855524u,138442752u,393216u}/* A170 */, /*12153*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855532u,138442752u,393216u}/* A171 */, /*12154*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855540u,138442752u,393216u}/* A172 */, /*12155*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855548u,138442752u,393216u}/* A173 */, /*12156*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855556u,138442752u,393216u}/* A174 */, /*12157*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855564u,138442752u,393216u}/* A175 */, /*12158*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855572u,138442752u,393216u}/* A176 */, /*12159*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855580u,138442752u,393216u}/* A177 */, /*12160*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855588u,138442752u,393216u}/* A178 */, /*12161*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855596u,138442752u,393216u}/* A179 */, /*12162*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855604u,138442752u,393216u}/* A17A */, /*12163*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855612u,138442752u,393216u}/* A17B */, /*12164*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855620u,138442752u,393216u}/* A17C */, /*12165*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855628u,138442752u,393216u}/* A17D */, /*12166*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855636u,138442752u,393216u}/* A17E */, /*12167*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855644u,138442752u,393216u}/* A17F */, /*12168*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855652u,138442752u,393216u}/* A180 */, /*12169*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855660u,138442752u,393216u}/* A181 */, /*12170*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855668u,138442752u,393216u}/* A182 */, /*12171*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855676u,138442752u,393216u}/* A183 */, /*12172*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855684u,138442752u,393216u}/* A184 */, /*12173*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855692u,138442752u,393216u}/* A185 */, /*12174*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855700u,138442752u,393216u}/* A186 */, /*12175*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855708u,138442752u,393216u}/* A187 */, /*12176*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855716u,138442752u,393216u}/* A188 */, /*12177*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855724u,138442752u,393216u}/* A189 */, /*12178*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855732u,138442752u,393216u}/* A18A */, /*12179*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855740u,138442752u,393216u}/* A18B */, /*12180*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855748u,138442752u,393216u}/* A18C */, /*12181*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855756u,138442752u,393216u}/* A18D */, /*12182*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855764u,138442752u,393216u}/* A18E */, /*12183*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855772u,138442752u,393216u}/* A18F */, /*12184*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855780u,138442752u,393216u}/* A190 */, /*12185*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855788u,138442752u,393216u}/* A191 */, /*12186*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855796u,138442752u,393216u}/* A192 */, /*12187*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855804u,138442752u,393216u}/* A193 */, /*12188*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855812u,138442752u,393216u}/* A194 */, /*12189*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855820u,138442752u,393216u}/* A195 */, /*12190*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855828u,138442752u,393216u}/* A196 */, /*12191*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855836u,138442752u,393216u}/* A197 */, /*12192*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855844u,138442752u,393216u}/* A198 */, /*12193*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855852u,138442752u,393216u}/* A199 */, /*12194*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855860u,138442752u,393216u}/* A19A */, /*12195*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855868u,138442752u,393216u}/* A19B */, /*12196*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855876u,138442752u,393216u}/* A19C */, /*12197*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855884u,138442752u,393216u}/* A19D */, /*12198*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855892u,138442752u,393216u}/* A19E */, /*12199*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855900u,138442752u,393216u}/* A19F */, /*12200*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855908u,138442752u,393216u}/* A1A0 */, /*12201*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855916u,138442752u,393216u}/* A1A1 */, /*12202*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855924u,138442752u,393216u}/* A1A2 */, /*12203*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855932u,138442752u,393216u}/* A1A3 */, /*12204*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855940u,138442752u,393216u}/* A1A4 */, /*12205*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855948u,138442752u,393216u}/* A1A5 */, /*12206*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855956u,138442752u,393216u}/* A1A6 */, /*12207*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855964u,138442752u,393216u}/* A1A7 */, /*12208*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855972u,138442752u,393216u}/* A1A8 */, /*12209*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855980u,138442752u,393216u}/* A1A9 */, /*12210*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855988u,138442752u,393216u}/* A1AA */, /*12211*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677855996u,138442752u,393216u}/* A1AB */, /*12212*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856004u,138442752u,393216u}/* A1AC */, /*12213*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856012u,138442752u,393216u}/* A1AD */, /*12214*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856020u,138442752u,393216u}/* A1AE */, /*12215*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856028u,138442752u,393216u}/* A1AF */, /*12216*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856036u,138442752u,393216u}/* A1B0 */, /*12217*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856044u,138442752u,393216u}/* A1B1 */, /*12218*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856052u,138442752u,393216u}/* A1B2 */, /*12219*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856060u,138442752u,393216u}/* A1B3 */, /*12220*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856068u,138442752u,393216u}/* A1B4 */, /*12221*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856076u,138442752u,393216u}/* A1B5 */, /*12222*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856084u,138442752u,393216u}/* A1B6 */, /*12223*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856092u,138442752u,393216u}/* A1B7 */, /*12224*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856100u,138442752u,393216u}/* A1B8 */, /*12225*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856108u,138442752u,393216u}/* A1B9 */, /*12226*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856116u,138442752u,393216u}/* A1BA */, /*12227*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856124u,138442752u,393216u}/* A1BB */, /*12228*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856132u,138442752u,393216u}/* A1BC */, /*12229*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856140u,138442752u,393216u}/* A1BD */, /*12230*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856148u,138442752u,393216u}/* A1BE */, /*12231*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856156u,138442752u,393216u}/* A1BF */, /*12232*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856164u,138442752u,393216u}/* A1C0 */, /*12233*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856172u,138442752u,393216u}/* A1C1 */, /*12234*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856180u,138442752u,393216u}/* A1C2 */, /*12235*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856188u,138442752u,393216u}/* A1C3 */, /*12236*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856196u,138442752u,393216u}/* A1C4 */, /*12237*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856204u,138442752u,393216u}/* A1C5 */, /*12238*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856212u,138442752u,393216u}/* A1C6 */, /*12239*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856220u,138442752u,393216u}/* A1C7 */, /*12240*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856228u,138442752u,393216u}/* A1C8 */, /*12241*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856236u,138442752u,393216u}/* A1C9 */, /*12242*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856244u,138442752u,393216u}/* A1CA */, /*12243*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856252u,138442752u,393216u}/* A1CB */, /*12244*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856260u,138442752u,393216u}/* A1CC */, /*12245*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856268u,138442752u,393216u}/* A1CD */, /*12246*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856276u,138442752u,393216u}/* A1CE */, /*12247*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856284u,138442752u,393216u}/* A1CF */, /*12248*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856292u,138442752u,393216u}/* A1D0 */, /*12249*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856300u,138442752u,393216u}/* A1D1 */, /*12250*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856308u,138442752u,393216u}/* A1D2 */, /*12251*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856316u,138442752u,393216u}/* A1D3 */, /*12252*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856324u,138442752u,393216u}/* A1D4 */, /*12253*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856332u,138442752u,393216u}/* A1D5 */, /*12254*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856340u,138442752u,393216u}/* A1D6 */, /*12255*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856348u,138442752u,393216u}/* A1D7 */, /*12256*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856356u,138442752u,393216u}/* A1D8 */, /*12257*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856364u,138442752u,393216u}/* A1D9 */, /*12258*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856372u,138442752u,393216u}/* A1DA */, /*12259*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856380u,138442752u,393216u}/* A1DB */, /*12260*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856388u,138442752u,393216u}/* A1DC */, /*12261*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856396u,138442752u,393216u}/* A1DD */, /*12262*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856404u,138442752u,393216u}/* A1DE */, /*12263*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856412u,138442752u,393216u}/* A1DF */, /*12264*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856420u,138442752u,393216u}/* A1E0 */, /*12265*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856428u,138442752u,393216u}/* A1E1 */, /*12266*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856436u,138442752u,393216u}/* A1E2 */, /*12267*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856444u,138442752u,393216u}/* A1E3 */, /*12268*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856452u,138442752u,393216u}/* A1E4 */, /*12269*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856460u,138442752u,393216u}/* A1E5 */, /*12270*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856468u,138442752u,393216u}/* A1E6 */, /*12271*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856476u,138442752u,393216u}/* A1E7 */, /*12272*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856484u,138442752u,393216u}/* A1E8 */, /*12273*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856492u,138442752u,393216u}/* A1E9 */, /*12274*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856500u,138442752u,393216u}/* A1EA */, /*12275*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856508u,138442752u,393216u}/* A1EB */, /*12276*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856516u,138442752u,393216u}/* A1EC */, /*12277*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856524u,138442752u,393216u}/* A1ED */, /*12278*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856532u,138442752u,393216u}/* A1EE */, /*12279*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856540u,138442752u,393216u}/* A1EF */, /*12280*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856548u,138442752u,393216u}/* A1F0 */, /*12281*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856556u,138442752u,393216u}/* A1F1 */, /*12282*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856564u,138442752u,393216u}/* A1F2 */, /*12283*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856572u,138442752u,393216u}/* A1F3 */, /*12284*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856580u,138442752u,393216u}/* A1F4 */, /*12285*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856588u,138442752u,393216u}/* A1F5 */, /*12286*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856596u,138442752u,393216u}/* A1F6 */, /*12287*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856604u,138442752u,393216u}/* A1F7 */, /*12288*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856612u,138442752u,393216u}/* A1F8 */, /*12289*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856620u,138442752u,393216u}/* A1F9 */, /*12290*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856628u,138442752u,393216u}/* A1FA */, /*12291*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856636u,138442752u,393216u}/* A1FB */, /*12292*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856644u,138442752u,393216u}/* A1FC */, /*12293*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856652u,138442752u,393216u}/* A1FD */, /*12294*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856660u,138442752u,393216u}/* A1FE */, /*12295*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856668u,138442752u,393216u}/* A1FF */, /*12296*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856676u,138442752u,393216u}/* A200 */, /*12297*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856684u,138442752u,393216u}/* A201 */, /*12298*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856692u,138442752u,393216u}/* A202 */, /*12299*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856700u,138442752u,393216u}/* A203 */, /*12300*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856708u,138442752u,393216u}/* A204 */, /*12301*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856716u,138442752u,393216u}/* A205 */, /*12302*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856724u,138442752u,393216u}/* A206 */, /*12303*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856732u,138442752u,393216u}/* A207 */, /*12304*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856740u,138442752u,393216u}/* A208 */, /*12305*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856748u,138442752u,393216u}/* A209 */, /*12306*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856756u,138442752u,393216u}/* A20A */, /*12307*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856764u,138442752u,393216u}/* A20B */, /*12308*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856772u,138442752u,393216u}/* A20C */, /*12309*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856780u,138442752u,393216u}/* A20D */, /*12310*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856788u,138442752u,393216u}/* A20E */, /*12311*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856796u,138442752u,393216u}/* A20F */, /*12312*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856804u,138442752u,393216u}/* A210 */, /*12313*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856812u,138442752u,393216u}/* A211 */, /*12314*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856820u,138442752u,393216u}/* A212 */, /*12315*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856828u,138442752u,393216u}/* A213 */, /*12316*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856836u,138442752u,393216u}/* A214 */, /*12317*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856844u,138442752u,393216u}/* A215 */, /*12318*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856852u,138442752u,393216u}/* A216 */, /*12319*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856860u,138442752u,393216u}/* A217 */, /*12320*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856868u,138442752u,393216u}/* A218 */, /*12321*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856876u,138442752u,393216u}/* A219 */, /*12322*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856884u,138442752u,393216u}/* A21A */, /*12323*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856892u,138442752u,393216u}/* A21B */, /*12324*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856900u,138442752u,393216u}/* A21C */, /*12325*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856908u,138442752u,393216u}/* A21D */, /*12326*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856916u,138442752u,393216u}/* A21E */, /*12327*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856924u,138442752u,393216u}/* A21F */, /*12328*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856932u,138442752u,393216u}/* A220 */, /*12329*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856940u,138442752u,393216u}/* A221 */, /*12330*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856948u,138442752u,393216u}/* A222 */, /*12331*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856956u,138442752u,393216u}/* A223 */, /*12332*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856964u,138442752u,393216u}/* A224 */, /*12333*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856972u,138442752u,393216u}/* A225 */, /*12334*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856980u,138442752u,393216u}/* A226 */, /*12335*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856988u,138442752u,393216u}/* A227 */, /*12336*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677856996u,138442752u,393216u}/* A228 */, /*12337*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857004u,138442752u,393216u}/* A229 */, /*12338*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857012u,138442752u,393216u}/* A22A */, /*12339*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857020u,138442752u,393216u}/* A22B */, /*12340*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857028u,138442752u,393216u}/* A22C */, /*12341*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857036u,138442752u,393216u}/* A22D */, /*12342*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857044u,138442752u,393216u}/* A22E */, /*12343*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857052u,138442752u,393216u}/* A22F */, /*12344*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857060u,138442752u,393216u}/* A230 */, /*12345*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857068u,138442752u,393216u}/* A231 */, /*12346*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857076u,138442752u,393216u}/* A232 */, /*12347*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857084u,138442752u,393216u}/* A233 */, /*12348*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857092u,138442752u,393216u}/* A234 */, /*12349*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857100u,138442752u,393216u}/* A235 */, /*12350*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857108u,138442752u,393216u}/* A236 */, /*12351*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857116u,138442752u,393216u}/* A237 */, /*12352*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857124u,138442752u,393216u}/* A238 */, /*12353*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857132u,138442752u,393216u}/* A239 */, /*12354*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857140u,138442752u,393216u}/* A23A */, /*12355*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857148u,138442752u,393216u}/* A23B */, /*12356*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857156u,138442752u,393216u}/* A23C */, /*12357*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857164u,138442752u,393216u}/* A23D */, /*12358*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857172u,138442752u,393216u}/* A23E */, /*12359*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857180u,138442752u,393216u}/* A23F */, /*12360*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857188u,138442752u,393216u}/* A240 */, /*12361*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857196u,138442752u,393216u}/* A241 */, /*12362*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857204u,138442752u,393216u}/* A242 */, /*12363*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857212u,138442752u,393216u}/* A243 */, /*12364*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857220u,138442752u,393216u}/* A244 */, /*12365*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857228u,138442752u,393216u}/* A245 */, /*12366*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857236u,138442752u,393216u}/* A246 */, /*12367*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857244u,138442752u,393216u}/* A247 */, /*12368*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857252u,138442752u,393216u}/* A248 */, /*12369*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857260u,138442752u,393216u}/* A249 */, /*12370*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857268u,138442752u,393216u}/* A24A */, /*12371*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857276u,138442752u,393216u}/* A24B */, /*12372*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857284u,138442752u,393216u}/* A24C */, /*12373*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857292u,138442752u,393216u}/* A24D */, /*12374*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857300u,138442752u,393216u}/* A24E */, /*12375*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857308u,138442752u,393216u}/* A24F */, /*12376*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857316u,138442752u,393216u}/* A250 */, /*12377*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857324u,138442752u,393216u}/* A251 */, /*12378*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857332u,138442752u,393216u}/* A252 */, /*12379*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857340u,138442752u,393216u}/* A253 */, /*12380*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857348u,138442752u,393216u}/* A254 */, /*12381*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857356u,138442752u,393216u}/* A255 */, /*12382*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857364u,138442752u,393216u}/* A256 */, /*12383*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857372u,138442752u,393216u}/* A257 */, /*12384*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857380u,138442752u,393216u}/* A258 */, /*12385*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857388u,138442752u,393216u}/* A259 */, /*12386*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857396u,138442752u,393216u}/* A25A */, /*12387*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857404u,138442752u,393216u}/* A25B */, /*12388*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857412u,138442752u,393216u}/* A25C */, /*12389*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857420u,138442752u,393216u}/* A25D */, /*12390*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857428u,138442752u,393216u}/* A25E */, /*12391*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857436u,138442752u,393216u}/* A25F */, /*12392*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857444u,138442752u,393216u}/* A260 */, /*12393*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857452u,138442752u,393216u}/* A261 */, /*12394*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857460u,138442752u,393216u}/* A262 */, /*12395*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857468u,138442752u,393216u}/* A263 */, /*12396*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857476u,138442752u,393216u}/* A264 */, /*12397*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857484u,138442752u,393216u}/* A265 */, /*12398*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857492u,138442752u,393216u}/* A266 */, /*12399*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857500u,138442752u,393216u}/* A267 */, /*12400*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857508u,138442752u,393216u}/* A268 */, /*12401*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857516u,138442752u,393216u}/* A269 */, /*12402*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857524u,138442752u,393216u}/* A26A */, /*12403*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857532u,138442752u,393216u}/* A26B */, /*12404*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857540u,138442752u,393216u}/* A26C */, /*12405*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857548u,138442752u,393216u}/* A26D */, /*12406*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857556u,138442752u,393216u}/* A26E */, /*12407*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857564u,138442752u,393216u}/* A26F */, /*12408*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857572u,138442752u,393216u}/* A270 */, /*12409*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857580u,138442752u,393216u}/* A271 */, /*12410*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857588u,138442752u,393216u}/* A272 */, /*12411*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857596u,138442752u,393216u}/* A273 */, /*12412*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857604u,138442752u,393216u}/* A274 */, /*12413*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857612u,138442752u,393216u}/* A275 */, /*12414*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857620u,138442752u,393216u}/* A276 */, /*12415*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857628u,138442752u,393216u}/* A277 */, /*12416*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857636u,138442752u,393216u}/* A278 */, /*12417*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857644u,138442752u,393216u}/* A279 */, /*12418*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857652u,138442752u,393216u}/* A27A */, /*12419*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857660u,138442752u,393216u}/* A27B */, /*12420*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857668u,138442752u,393216u}/* A27C */, /*12421*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857676u,138442752u,393216u}/* A27D */, /*12422*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857684u,138442752u,393216u}/* A27E */, /*12423*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857692u,138442752u,393216u}/* A27F */, /*12424*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857700u,138442752u,393216u}/* A280 */, /*12425*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857708u,138442752u,393216u}/* A281 */, /*12426*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857716u,138442752u,393216u}/* A282 */, /*12427*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857724u,138442752u,393216u}/* A283 */, /*12428*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857732u,138442752u,393216u}/* A284 */, /*12429*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857740u,138442752u,393216u}/* A285 */, /*12430*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857748u,138442752u,393216u}/* A286 */, /*12431*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857756u,138442752u,393216u}/* A287 */, /*12432*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857764u,138442752u,393216u}/* A288 */, /*12433*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857772u,138442752u,393216u}/* A289 */, /*12434*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857780u,138442752u,393216u}/* A28A */, /*12435*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857788u,138442752u,393216u}/* A28B */, /*12436*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857796u,138442752u,393216u}/* A28C */, /*12437*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857804u,138442752u,393216u}/* A28D */, /*12438*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857812u,138442752u,393216u}/* A28E */, /*12439*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857820u,138442752u,393216u}/* A28F */, /*12440*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857828u,138442752u,393216u}/* A290 */, /*12441*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857836u,138442752u,393216u}/* A291 */, /*12442*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857844u,138442752u,393216u}/* A292 */, /*12443*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857852u,138442752u,393216u}/* A293 */, /*12444*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857860u,138442752u,393216u}/* A294 */, /*12445*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857868u,138442752u,393216u}/* A295 */, /*12446*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857876u,138442752u,393216u}/* A296 */, /*12447*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857884u,138442752u,393216u}/* A297 */, /*12448*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857892u,138442752u,393216u}/* A298 */, /*12449*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857900u,138442752u,393216u}/* A299 */, /*12450*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857908u,138442752u,393216u}/* A29A */, /*12451*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857916u,138442752u,393216u}/* A29B */, /*12452*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857924u,138442752u,393216u}/* A29C */, /*12453*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857932u,138442752u,393216u}/* A29D */, /*12454*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857940u,138442752u,393216u}/* A29E */, /*12455*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857948u,138442752u,393216u}/* A29F */, /*12456*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857956u,138442752u,393216u}/* A2A0 */, /*12457*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857964u,138442752u,393216u}/* A2A1 */, /*12458*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857972u,138442752u,393216u}/* A2A2 */, /*12459*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857980u,138442752u,393216u}/* A2A3 */, /*12460*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857988u,138442752u,393216u}/* A2A4 */, /*12461*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677857996u,138442752u,393216u}/* A2A5 */, /*12462*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858004u,138442752u,393216u}/* A2A6 */, /*12463*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858012u,138442752u,393216u}/* A2A7 */, /*12464*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858020u,138442752u,393216u}/* A2A8 */, /*12465*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858028u,138442752u,393216u}/* A2A9 */, /*12466*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858036u,138442752u,393216u}/* A2AA */, /*12467*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858044u,138442752u,393216u}/* A2AB */, /*12468*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858052u,138442752u,393216u}/* A2AC */, /*12469*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858060u,138442752u,393216u}/* A2AD */, /*12470*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858068u,138442752u,393216u}/* A2AE */, /*12471*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858076u,138442752u,393216u}/* A2AF */, /*12472*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858084u,138442752u,393216u}/* A2B0 */, /*12473*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858092u,138442752u,393216u}/* A2B1 */, /*12474*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858100u,138442752u,393216u}/* A2B2 */, /*12475*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858108u,138442752u,393216u}/* A2B3 */, /*12476*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858116u,138442752u,393216u}/* A2B4 */, /*12477*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858124u,138442752u,393216u}/* A2B5 */, /*12478*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858132u,138442752u,393216u}/* A2B6 */, /*12479*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858140u,138442752u,393216u}/* A2B7 */, /*12480*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858148u,138442752u,393216u}/* A2B8 */, /*12481*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858156u,138442752u,393216u}/* A2B9 */, /*12482*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858164u,138442752u,393216u}/* A2BA */, /*12483*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858172u,138442752u,393216u}/* A2BB */, /*12484*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858180u,138442752u,393216u}/* A2BC */, /*12485*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858188u,138442752u,393216u}/* A2BD */, /*12486*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858196u,138442752u,393216u}/* A2BE */, /*12487*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858204u,138442752u,393216u}/* A2BF */, /*12488*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858212u,138442752u,393216u}/* A2C0 */, /*12489*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858220u,138442752u,393216u}/* A2C1 */, /*12490*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858228u,138442752u,393216u}/* A2C2 */, /*12491*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858236u,138442752u,393216u}/* A2C3 */, /*12492*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858244u,138442752u,393216u}/* A2C4 */, /*12493*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858252u,138442752u,393216u}/* A2C5 */, /*12494*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858260u,138442752u,393216u}/* A2C6 */, /*12495*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858268u,138442752u,393216u}/* A2C7 */, /*12496*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858276u,138442752u,393216u}/* A2C8 */, /*12497*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858284u,138442752u,393216u}/* A2C9 */, /*12498*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858292u,138442752u,393216u}/* A2CA */, /*12499*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858300u,138442752u,393216u}/* A2CB */, /*12500*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858308u,138442752u,393216u}/* A2CC */, /*12501*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858316u,138442752u,393216u}/* A2CD */, /*12502*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858324u,138442752u,393216u}/* A2CE */, /*12503*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858332u,138442752u,393216u}/* A2CF */, /*12504*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858340u,138442752u,393216u}/* A2D0 */, /*12505*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858348u,138442752u,393216u}/* A2D1 */, /*12506*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858356u,138442752u,393216u}/* A2D2 */, /*12507*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858364u,138442752u,393216u}/* A2D3 */, /*12508*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858372u,138442752u,393216u}/* A2D4 */, /*12509*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858380u,138442752u,393216u}/* A2D5 */, /*12510*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858388u,138442752u,393216u}/* A2D6 */, /*12511*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858396u,138442752u,393216u}/* A2D7 */, /*12512*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858404u,138442752u,393216u}/* A2D8 */, /*12513*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858412u,138442752u,393216u}/* A2D9 */, /*12514*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858420u,138442752u,393216u}/* A2DA */, /*12515*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858428u,138442752u,393216u}/* A2DB */, /*12516*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858436u,138442752u,393216u}/* A2DC */, /*12517*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858444u,138442752u,393216u}/* A2DD */, /*12518*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858452u,138442752u,393216u}/* A2DE */, /*12519*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858460u,138442752u,393216u}/* A2DF */, /*12520*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858468u,138442752u,393216u}/* A2E0 */, /*12521*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858476u,138442752u,393216u}/* A2E1 */, /*12522*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858484u,138442752u,393216u}/* A2E2 */, /*12523*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858492u,138442752u,393216u}/* A2E3 */, /*12524*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858500u,138442752u,393216u}/* A2E4 */, /*12525*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858508u,138442752u,393216u}/* A2E5 */, /*12526*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858516u,138442752u,393216u}/* A2E6 */, /*12527*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858524u,138442752u,393216u}/* A2E7 */, /*12528*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858532u,138442752u,393216u}/* A2E8 */, /*12529*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858540u,138442752u,393216u}/* A2E9 */, /*12530*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858548u,138442752u,393216u}/* A2EA */, /*12531*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858556u,138442752u,393216u}/* A2EB */, /*12532*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858564u,138442752u,393216u}/* A2EC */, /*12533*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858572u,138442752u,393216u}/* A2ED */, /*12534*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858580u,138442752u,393216u}/* A2EE */, /*12535*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858588u,138442752u,393216u}/* A2EF */, /*12536*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858596u,138442752u,393216u}/* A2F0 */, /*12537*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858604u,138442752u,393216u}/* A2F1 */, /*12538*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858612u,138442752u,393216u}/* A2F2 */, /*12539*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858620u,138442752u,393216u}/* A2F3 */, /*12540*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858628u,138442752u,393216u}/* A2F4 */, /*12541*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858636u,138442752u,393216u}/* A2F5 */, /*12542*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858644u,138442752u,393216u}/* A2F6 */, /*12543*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858652u,138442752u,393216u}/* A2F7 */, /*12544*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858660u,138442752u,393216u}/* A2F8 */, /*12545*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858668u,138442752u,393216u}/* A2F9 */, /*12546*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858676u,138442752u,393216u}/* A2FA */, /*12547*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858684u,138442752u,393216u}/* A2FB */, /*12548*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858692u,138442752u,393216u}/* A2FC */, /*12549*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858700u,138442752u,393216u}/* A2FD */, /*12550*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858708u,138442752u,393216u}/* A2FE */, /*12551*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858716u,138442752u,393216u}/* A2FF */, /*12552*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858724u,138442752u,393216u}/* A300 */, /*12553*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858732u,138442752u,393216u}/* A301 */, /*12554*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858740u,138442752u,393216u}/* A302 */, /*12555*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858748u,138442752u,393216u}/* A303 */, /*12556*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858756u,138442752u,393216u}/* A304 */, /*12557*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858764u,138442752u,393216u}/* A305 */, /*12558*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858772u,138442752u,393216u}/* A306 */, /*12559*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858780u,138442752u,393216u}/* A307 */, /*12560*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858788u,138442752u,393216u}/* A308 */, /*12561*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858796u,138442752u,393216u}/* A309 */, /*12562*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858804u,138442752u,393216u}/* A30A */, /*12563*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858812u,138442752u,393216u}/* A30B */, /*12564*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858820u,138442752u,393216u}/* A30C */, /*12565*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858828u,138442752u,393216u}/* A30D */, /*12566*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858836u,138442752u,393216u}/* A30E */, /*12567*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858844u,138442752u,393216u}/* A30F */, /*12568*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858852u,138442752u,393216u}/* A310 */, /*12569*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858860u,138442752u,393216u}/* A311 */, /*12570*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858868u,138442752u,393216u}/* A312 */, /*12571*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858876u,138442752u,393216u}/* A313 */, /*12572*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858884u,138442752u,393216u}/* A314 */, /*12573*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858892u,138442752u,393216u}/* A315 */, /*12574*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858900u,138442752u,393216u}/* A316 */, /*12575*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858908u,138442752u,393216u}/* A317 */, /*12576*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858916u,138442752u,393216u}/* A318 */, /*12577*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858924u,138442752u,393216u}/* A319 */, /*12578*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858932u,138442752u,393216u}/* A31A */, /*12579*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858940u,138442752u,393216u}/* A31B */, /*12580*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858948u,138442752u,393216u}/* A31C */, /*12581*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858956u,138442752u,393216u}/* A31D */, /*12582*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858964u,138442752u,393216u}/* A31E */, /*12583*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858972u,138442752u,393216u}/* A31F */, /*12584*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858980u,138442752u,393216u}/* A320 */, /*12585*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858988u,138442752u,393216u}/* A321 */, /*12586*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677858996u,138442752u,393216u}/* A322 */, /*12587*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859004u,138442752u,393216u}/* A323 */, /*12588*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859012u,138442752u,393216u}/* A324 */, /*12589*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859020u,138442752u,393216u}/* A325 */, /*12590*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859028u,138442752u,393216u}/* A326 */, /*12591*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859036u,138442752u,393216u}/* A327 */, /*12592*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859044u,138442752u,393216u}/* A328 */, /*12593*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859052u,138442752u,393216u}/* A329 */, /*12594*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859060u,138442752u,393216u}/* A32A */, /*12595*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859068u,138442752u,393216u}/* A32B */, /*12596*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859076u,138442752u,393216u}/* A32C */, /*12597*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859084u,138442752u,393216u}/* A32D */, /*12598*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859092u,138442752u,393216u}/* A32E */, /*12599*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859100u,138442752u,393216u}/* A32F */, /*12600*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859108u,138442752u,393216u}/* A330 */, /*12601*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859116u,138442752u,393216u}/* A331 */, /*12602*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859124u,138442752u,393216u}/* A332 */, /*12603*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859132u,138442752u,393216u}/* A333 */, /*12604*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859140u,138442752u,393216u}/* A334 */, /*12605*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859148u,138442752u,393216u}/* A335 */, /*12606*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859156u,138442752u,393216u}/* A336 */, /*12607*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859164u,138442752u,393216u}/* A337 */, /*12608*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859172u,138442752u,393216u}/* A338 */, /*12609*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859180u,138442752u,393216u}/* A339 */, /*12610*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859188u,138442752u,393216u}/* A33A */, /*12611*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859196u,138442752u,393216u}/* A33B */, /*12612*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859204u,138442752u,393216u}/* A33C */, /*12613*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859212u,138442752u,393216u}/* A33D */, /*12614*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859220u,138442752u,393216u}/* A33E */, /*12615*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859228u,138442752u,393216u}/* A33F */, /*12616*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859236u,138442752u,393216u}/* A340 */, /*12617*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859244u,138442752u,393216u}/* A341 */, /*12618*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859252u,138442752u,393216u}/* A342 */, /*12619*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859260u,138442752u,393216u}/* A343 */, /*12620*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859268u,138442752u,393216u}/* A344 */, /*12621*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859276u,138442752u,393216u}/* A345 */, /*12622*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859284u,138442752u,393216u}/* A346 */, /*12623*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859292u,138442752u,393216u}/* A347 */, /*12624*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859300u,138442752u,393216u}/* A348 */, /*12625*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859308u,138442752u,393216u}/* A349 */, /*12626*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859316u,138442752u,393216u}/* A34A */, /*12627*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859324u,138442752u,393216u}/* A34B */, /*12628*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859332u,138442752u,393216u}/* A34C */, /*12629*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859340u,138442752u,393216u}/* A34D */, /*12630*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859348u,138442752u,393216u}/* A34E */, /*12631*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859356u,138442752u,393216u}/* A34F */, /*12632*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859364u,138442752u,393216u}/* A350 */, /*12633*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859372u,138442752u,393216u}/* A351 */, /*12634*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859380u,138442752u,393216u}/* A352 */, /*12635*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859388u,138442752u,393216u}/* A353 */, /*12636*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859396u,138442752u,393216u}/* A354 */, /*12637*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859404u,138442752u,393216u}/* A355 */, /*12638*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859412u,138442752u,393216u}/* A356 */, /*12639*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859420u,138442752u,393216u}/* A357 */, /*12640*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859428u,138442752u,393216u}/* A358 */, /*12641*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859436u,138442752u,393216u}/* A359 */, /*12642*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859444u,138442752u,393216u}/* A35A */, /*12643*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859452u,138442752u,393216u}/* A35B */, /*12644*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859460u,138442752u,393216u}/* A35C */, /*12645*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859468u,138442752u,393216u}/* A35D */, /*12646*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859476u,138442752u,393216u}/* A35E */, /*12647*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859484u,138442752u,393216u}/* A35F */, /*12648*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859492u,138442752u,393216u}/* A360 */, /*12649*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859500u,138442752u,393216u}/* A361 */, /*12650*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859508u,138442752u,393216u}/* A362 */, /*12651*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859516u,138442752u,393216u}/* A363 */, /*12652*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859524u,138442752u,393216u}/* A364 */, /*12653*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859532u,138442752u,393216u}/* A365 */, /*12654*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859540u,138442752u,393216u}/* A366 */, /*12655*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859548u,138442752u,393216u}/* A367 */, /*12656*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859556u,138442752u,393216u}/* A368 */, /*12657*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859564u,138442752u,393216u}/* A369 */, /*12658*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859572u,138442752u,393216u}/* A36A */, /*12659*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859580u,138442752u,393216u}/* A36B */, /*12660*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859588u,138442752u,393216u}/* A36C */, /*12661*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859596u,138442752u,393216u}/* A36D */, /*12662*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859604u,138442752u,393216u}/* A36E */, /*12663*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859612u,138442752u,393216u}/* A36F */, /*12664*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859620u,138442752u,393216u}/* A370 */, /*12665*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859628u,138442752u,393216u}/* A371 */, /*12666*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859636u,138442752u,393216u}/* A372 */, /*12667*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859644u,138442752u,393216u}/* A373 */, /*12668*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859652u,138442752u,393216u}/* A374 */, /*12669*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859660u,138442752u,393216u}/* A375 */, /*12670*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859668u,138442752u,393216u}/* A376 */, /*12671*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859676u,138442752u,393216u}/* A377 */, /*12672*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859684u,138442752u,393216u}/* A378 */, /*12673*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859692u,138442752u,393216u}/* A379 */, /*12674*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859700u,138442752u,393216u}/* A37A */, /*12675*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859708u,138442752u,393216u}/* A37B */, /*12676*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859716u,138442752u,393216u}/* A37C */, /*12677*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859724u,138442752u,393216u}/* A37D */, /*12678*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859732u,138442752u,393216u}/* A37E */, /*12679*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859740u,138442752u,393216u}/* A37F */, /*12680*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859748u,138442752u,393216u}/* A380 */, /*12681*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859756u,138442752u,393216u}/* A381 */, /*12682*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859764u,138442752u,393216u}/* A382 */, /*12683*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859772u,138442752u,393216u}/* A383 */, /*12684*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859780u,138442752u,393216u}/* A384 */, /*12685*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859788u,138442752u,393216u}/* A385 */, /*12686*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859796u,138442752u,393216u}/* A386 */, /*12687*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859804u,138442752u,393216u}/* A387 */, /*12688*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859812u,138442752u,393216u}/* A388 */, /*12689*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859820u,138442752u,393216u}/* A389 */, /*12690*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859828u,138442752u,393216u}/* A38A */, /*12691*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859836u,138442752u,393216u}/* A38B */, /*12692*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859844u,138442752u,393216u}/* A38C */, /*12693*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859852u,138442752u,393216u}/* A38D */, /*12694*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859860u,138442752u,393216u}/* A38E */, /*12695*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859868u,138442752u,393216u}/* A38F */, /*12696*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859876u,138442752u,393216u}/* A390 */, /*12697*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859884u,138442752u,393216u}/* A391 */, /*12698*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859892u,138442752u,393216u}/* A392 */, /*12699*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859900u,138442752u,393216u}/* A393 */, /*12700*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859908u,138442752u,393216u}/* A394 */, /*12701*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859916u,138442752u,393216u}/* A395 */, /*12702*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859924u,138442752u,393216u}/* A396 */, /*12703*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859932u,138442752u,393216u}/* A397 */, /*12704*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859940u,138442752u,393216u}/* A398 */, /*12705*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859948u,138442752u,393216u}/* A399 */, /*12706*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859956u,138442752u,393216u}/* A39A */, /*12707*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859964u,138442752u,393216u}/* A39B */, /*12708*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859972u,138442752u,393216u}/* A39C */, /*12709*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859980u,138442752u,393216u}/* A39D */, /*12710*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859988u,138442752u,393216u}/* A39E */, /*12711*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677859996u,138442752u,393216u}/* A39F */, /*12712*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860004u,138442752u,393216u}/* A3A0 */, /*12713*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860012u,138442752u,393216u}/* A3A1 */, /*12714*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860020u,138442752u,393216u}/* A3A2 */, /*12715*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860028u,138442752u,393216u}/* A3A3 */, /*12716*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860036u,138442752u,393216u}/* A3A4 */, /*12717*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860044u,138442752u,393216u}/* A3A5 */, /*12718*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860052u,138442752u,393216u}/* A3A6 */, /*12719*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860060u,138442752u,393216u}/* A3A7 */, /*12720*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860068u,138442752u,393216u}/* A3A8 */, /*12721*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860076u,138442752u,393216u}/* A3A9 */, /*12722*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860084u,138442752u,393216u}/* A3AA */, /*12723*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860092u,138442752u,393216u}/* A3AB */, /*12724*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860100u,138442752u,393216u}/* A3AC */, /*12725*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860108u,138442752u,393216u}/* A3AD */, /*12726*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860116u,138442752u,393216u}/* A3AE */, /*12727*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860124u,138442752u,393216u}/* A3AF */, /*12728*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860132u,138442752u,393216u}/* A3B0 */, /*12729*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860140u,138442752u,393216u}/* A3B1 */, /*12730*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860148u,138442752u,393216u}/* A3B2 */, /*12731*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860156u,138442752u,393216u}/* A3B3 */, /*12732*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860164u,138442752u,393216u}/* A3B4 */, /*12733*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860172u,138442752u,393216u}/* A3B5 */, /*12734*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860180u,138442752u,393216u}/* A3B6 */, /*12735*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860188u,138442752u,393216u}/* A3B7 */, /*12736*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860196u,138442752u,393216u}/* A3B8 */, /*12737*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860204u,138442752u,393216u}/* A3B9 */, /*12738*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860212u,138442752u,393216u}/* A3BA */, /*12739*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860220u,138442752u,393216u}/* A3BB */, /*12740*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860228u,138442752u,393216u}/* A3BC */, /*12741*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860236u,138442752u,393216u}/* A3BD */, /*12742*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860244u,138442752u,393216u}/* A3BE */, /*12743*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860252u,138442752u,393216u}/* A3BF */, /*12744*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860260u,138442752u,393216u}/* A3C0 */, /*12745*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860268u,138442752u,393216u}/* A3C1 */, /*12746*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860276u,138442752u,393216u}/* A3C2 */, /*12747*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860284u,138442752u,393216u}/* A3C3 */, /*12748*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860292u,138442752u,393216u}/* A3C4 */, /*12749*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860300u,138442752u,393216u}/* A3C5 */, /*12750*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860308u,138442752u,393216u}/* A3C6 */, /*12751*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860316u,138442752u,393216u}/* A3C7 */, /*12752*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860324u,138442752u,393216u}/* A3C8 */, /*12753*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860332u,138442752u,393216u}/* A3C9 */, /*12754*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860340u,138442752u,393216u}/* A3CA */, /*12755*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860348u,138442752u,393216u}/* A3CB */, /*12756*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860356u,138442752u,393216u}/* A3CC */, /*12757*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860364u,138442752u,393216u}/* A3CD */, /*12758*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860372u,138442752u,393216u}/* A3CE */, /*12759*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860380u,138442752u,393216u}/* A3CF */, /*12760*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860388u,138442752u,393216u}/* A3D0 */, /*12761*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860396u,138442752u,393216u}/* A3D1 */, /*12762*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860404u,138442752u,393216u}/* A3D2 */, /*12763*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860412u,138442752u,393216u}/* A3D3 */, /*12764*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860420u,138442752u,393216u}/* A3D4 */, /*12765*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860428u,138442752u,393216u}/* A3D5 */, /*12766*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860436u,138442752u,393216u}/* A3D6 */, /*12767*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860444u,138442752u,393216u}/* A3D7 */, /*12768*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860452u,138442752u,393216u}/* A3D8 */, /*12769*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860460u,138442752u,393216u}/* A3D9 */, /*12770*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860468u,138442752u,393216u}/* A3DA */, /*12771*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860476u,138442752u,393216u}/* A3DB */, /*12772*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860484u,138442752u,393216u}/* A3DC */, /*12773*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860492u,138442752u,393216u}/* A3DD */, /*12774*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860500u,138442752u,393216u}/* A3DE */, /*12775*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860508u,138442752u,393216u}/* A3DF */, /*12776*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860516u,138442752u,393216u}/* A3E0 */, /*12777*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860524u,138442752u,393216u}/* A3E1 */, /*12778*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860532u,138442752u,393216u}/* A3E2 */, /*12779*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860540u,138442752u,393216u}/* A3E3 */, /*12780*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860548u,138442752u,393216u}/* A3E4 */, /*12781*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860556u,138442752u,393216u}/* A3E5 */, /*12782*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860564u,138442752u,393216u}/* A3E6 */, /*12783*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860572u,138442752u,393216u}/* A3E7 */, /*12784*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860580u,138442752u,393216u}/* A3E8 */, /*12785*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860588u,138442752u,393216u}/* A3E9 */, /*12786*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860596u,138442752u,393216u}/* A3EA */, /*12787*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860604u,138442752u,393216u}/* A3EB */, /*12788*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860612u,138442752u,393216u}/* A3EC */, /*12789*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860620u,138442752u,393216u}/* A3ED */, /*12790*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860628u,138442752u,393216u}/* A3EE */, /*12791*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860636u,138442752u,393216u}/* A3EF */, /*12792*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860644u,138442752u,393216u}/* A3F0 */, /*12793*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860652u,138442752u,393216u}/* A3F1 */, /*12794*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860660u,138442752u,393216u}/* A3F2 */, /*12795*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860668u,138442752u,393216u}/* A3F3 */, /*12796*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860676u,138442752u,393216u}/* A3F4 */, /*12797*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860684u,138442752u,393216u}/* A3F5 */, /*12798*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860692u,138442752u,393216u}/* A3F6 */, /*12799*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860700u,138442752u,393216u}/* A3F7 */, /*12800*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860708u,138442752u,393216u}/* A3F8 */, /*12801*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860716u,138442752u,393216u}/* A3F9 */, /*12802*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860724u,138442752u,393216u}/* A3FA */, /*12803*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860732u,138442752u,393216u}/* A3FB */, /*12804*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860740u,138442752u,393216u}/* A3FC */, /*12805*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860748u,138442752u,393216u}/* A3FD */, /*12806*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860756u,138442752u,393216u}/* A3FE */, /*12807*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860764u,138442752u,393216u}/* A3FF */, /*12808*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860772u,138442752u,393216u}/* A400 */, /*12809*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860780u,138442752u,393216u}/* A401 */, /*12810*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860788u,138442752u,393216u}/* A402 */, /*12811*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860796u,138442752u,393216u}/* A403 */, /*12812*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860804u,138442752u,393216u}/* A404 */, /*12813*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860812u,138442752u,393216u}/* A405 */, /*12814*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860820u,138442752u,393216u}/* A406 */, /*12815*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860828u,138442752u,393216u}/* A407 */, /*12816*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860836u,138442752u,393216u}/* A408 */, /*12817*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860844u,138442752u,393216u}/* A409 */, /*12818*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860852u,138442752u,393216u}/* A40A */, /*12819*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860860u,138442752u,393216u}/* A40B */, /*12820*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860868u,138442752u,393216u}/* A40C */, /*12821*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860876u,138442752u,393216u}/* A40D */, /*12822*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860884u,138442752u,393216u}/* A40E */, /*12823*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860892u,138442752u,393216u}/* A40F */, /*12824*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860900u,138442752u,393216u}/* A410 */, /*12825*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860908u,138442752u,393216u}/* A411 */, /*12826*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860916u,138442752u,393216u}/* A412 */, /*12827*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860924u,138442752u,393216u}/* A413 */, /*12828*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860932u,138442752u,393216u}/* A414 */, /*12829*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860940u,138442752u,393216u}/* A415 */, /*12830*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860948u,138442752u,393216u}/* A416 */, /*12831*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860956u,138442752u,393216u}/* A417 */, /*12832*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860964u,138442752u,393216u}/* A418 */, /*12833*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860972u,138442752u,393216u}/* A419 */, /*12834*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860980u,138442752u,393216u}/* A41A */, /*12835*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860988u,138442752u,393216u}/* A41B */, /*12836*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677860996u,138442752u,393216u}/* A41C */, /*12837*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861004u,138442752u,393216u}/* A41D */, /*12838*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861012u,138442752u,393216u}/* A41E */, /*12839*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861020u,138442752u,393216u}/* A41F */, /*12840*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861028u,138442752u,393216u}/* A420 */, /*12841*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861036u,138442752u,393216u}/* A421 */, /*12842*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861044u,138442752u,393216u}/* A422 */, /*12843*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861052u,138442752u,393216u}/* A423 */, /*12844*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861060u,138442752u,393216u}/* A424 */, /*12845*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861068u,138442752u,393216u}/* A425 */, /*12846*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861076u,138442752u,393216u}/* A426 */, /*12847*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861084u,138442752u,393216u}/* A427 */, /*12848*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861092u,138442752u,393216u}/* A428 */, /*12849*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861100u,138442752u,393216u}/* A429 */, /*12850*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861108u,138442752u,393216u}/* A42A */, /*12851*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861116u,138442752u,393216u}/* A42B */, /*12852*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861124u,138442752u,393216u}/* A42C */, /*12853*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861132u,138442752u,393216u}/* A42D */, /*12854*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861140u,138442752u,393216u}/* A42E */, /*12855*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861148u,138442752u,393216u}/* A42F */, /*12856*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861156u,138442752u,393216u}/* A430 */, /*12857*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861164u,138442752u,393216u}/* A431 */, /*12858*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861172u,138442752u,393216u}/* A432 */, /*12859*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861180u,138442752u,393216u}/* A433 */, /*12860*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861188u,138442752u,393216u}/* A434 */, /*12861*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861196u,138442752u,393216u}/* A435 */, /*12862*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861204u,138442752u,393216u}/* A436 */, /*12863*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861212u,138442752u,393216u}/* A437 */, /*12864*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861220u,138442752u,393216u}/* A438 */, /*12865*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861228u,138442752u,393216u}/* A439 */, /*12866*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861236u,138442752u,393216u}/* A43A */, /*12867*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861244u,138442752u,393216u}/* A43B */, /*12868*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861252u,138442752u,393216u}/* A43C */, /*12869*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861260u,138442752u,393216u}/* A43D */, /*12870*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861268u,138442752u,393216u}/* A43E */, /*12871*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861276u,138442752u,393216u}/* A43F */, /*12872*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861284u,138442752u,393216u}/* A440 */, /*12873*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861292u,138442752u,393216u}/* A441 */, /*12874*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861300u,138442752u,393216u}/* A442 */, /*12875*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861308u,138442752u,393216u}/* A443 */, /*12876*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861316u,138442752u,393216u}/* A444 */, /*12877*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861324u,138442752u,393216u}/* A445 */, /*12878*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861332u,138442752u,393216u}/* A446 */, /*12879*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861340u,138442752u,393216u}/* A447 */, /*12880*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861348u,138442752u,393216u}/* A448 */, /*12881*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861356u,138442752u,393216u}/* A449 */, /*12882*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861364u,138442752u,393216u}/* A44A */, /*12883*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861372u,138442752u,393216u}/* A44B */, /*12884*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861380u,138442752u,393216u}/* A44C */, /*12885*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861388u,138442752u,393216u}/* A44D */, /*12886*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861396u,138442752u,393216u}/* A44E */, /*12887*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861404u,138442752u,393216u}/* A44F */, /*12888*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861412u,138442752u,393216u}/* A450 */, /*12889*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861420u,138442752u,393216u}/* A451 */, /*12890*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861428u,138442752u,393216u}/* A452 */, /*12891*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861436u,138442752u,393216u}/* A453 */, /*12892*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861444u,138442752u,393216u}/* A454 */, /*12893*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861452u,138442752u,393216u}/* A455 */, /*12894*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861460u,138442752u,393216u}/* A456 */, /*12895*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861468u,138442752u,393216u}/* A457 */, /*12896*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861476u,138442752u,393216u}/* A458 */, /*12897*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861484u,138442752u,393216u}/* A459 */, /*12898*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861492u,138442752u,393216u}/* A45A */, /*12899*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861500u,138442752u,393216u}/* A45B */, /*12900*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861508u,138442752u,393216u}/* A45C */, /*12901*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861516u,138442752u,393216u}/* A45D */, /*12902*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861524u,138442752u,393216u}/* A45E */, /*12903*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861532u,138442752u,393216u}/* A45F */, /*12904*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861540u,138442752u,393216u}/* A460 */, /*12905*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861548u,138442752u,393216u}/* A461 */, /*12906*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861556u,138442752u,393216u}/* A462 */, /*12907*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861564u,138442752u,393216u}/* A463 */, /*12908*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861572u,138442752u,393216u}/* A464 */, /*12909*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861580u,138442752u,393216u}/* A465 */, /*12910*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861588u,138442752u,393216u}/* A466 */, /*12911*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861596u,138442752u,393216u}/* A467 */, /*12912*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861604u,138442752u,393216u}/* A468 */, /*12913*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861612u,138442752u,393216u}/* A469 */, /*12914*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861620u,138442752u,393216u}/* A46A */, /*12915*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861628u,138442752u,393216u}/* A46B */, /*12916*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861636u,138442752u,393216u}/* A46C */, /*12917*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861644u,138442752u,393216u}/* A46D */, /*12918*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861652u,138442752u,393216u}/* A46E */, /*12919*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861660u,138442752u,393216u}/* A46F */, /*12920*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861668u,138442752u,393216u}/* A470 */, /*12921*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861676u,138442752u,393216u}/* A471 */, /*12922*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861684u,138442752u,393216u}/* A472 */, /*12923*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861692u,138442752u,393216u}/* A473 */, /*12924*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861700u,138442752u,393216u}/* A474 */, /*12925*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861708u,138442752u,393216u}/* A475 */, /*12926*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861716u,138442752u,393216u}/* A476 */, /*12927*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861724u,138442752u,393216u}/* A477 */, /*12928*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861732u,138442752u,393216u}/* A478 */, /*12929*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861740u,138442752u,393216u}/* A479 */, /*12930*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861748u,138442752u,393216u}/* A47A */, /*12931*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861756u,138442752u,393216u}/* A47B */, /*12932*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861764u,138442752u,393216u}/* A47C */, /*12933*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861772u,138442752u,393216u}/* A47D */, /*12934*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861780u,138442752u,393216u}/* A47E */, /*12935*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861788u,138442752u,393216u}/* A47F */, /*12936*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861796u,138442752u,393216u}/* A480 */, /*12937*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861804u,138442752u,393216u}/* A481 */, /*12938*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861812u,138442752u,393216u}/* A482 */, /*12939*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861820u,138442752u,393216u}/* A483 */, /*12940*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861828u,138442752u,393216u}/* A484 */, /*12941*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861836u,138442752u,393216u}/* A485 */, /*12942*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861844u,138442752u,393216u}/* A486 */, /*12943*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861852u,138442752u,393216u}/* A487 */, /*12944*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861860u,138442752u,393216u}/* A488 */, /*12945*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861868u,138442752u,393216u}/* A489 */, /*12946*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861876u,138442752u,393216u}/* A48A */, /*12947*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861884u,138442752u,393216u}/* A48B */, /*12948*/{0,963u,2424833u,102891525u,1515560u,3758096416u,1677861892u,138442752u,393216u}/* A48C */, /*12949*/{0,971u,2424833u,102901787u,40u,1610612768u,31444u,138442752u,67108864u}/* A490 */, /*12950*/{0,971u,2424833u,102901787u,40u,1610612768u,31452u,138442752u,67108864u}/* A491 */, /*12951*/{0,971u,2424833u,102901787u,40u,1610612768u,31460u,138442752u,67108864u}/* A492 */, /*12952*/{0,971u,2424833u,102901787u,40u,1610612768u,31468u,138442752u,67108864u}/* A493 */, /*12953*/{0,971u,2424833u,102901787u,40u,1610612768u,31476u,138442752u,67108864u}/* A494 */, /*12954*/{0,971u,2424833u,102901787u,40u,1610612768u,31484u,138442752u,67108864u}/* A495 */, /*12955*/{0,971u,2424833u,102901787u,40u,1610612768u,31492u,138442752u,67108864u}/* A496 */, /*12956*/{0,971u,2424833u,102901787u,40u,1610612768u,31500u,138442752u,67108864u}/* A497 */, /*12957*/{0,971u,2424833u,102901787u,40u,1610612768u,31508u,138442752u,67108864u}/* A498 */, /*12958*/{0,971u,2424833u,102901787u,40u,1610612768u,31516u,138442752u,67108864u}/* A499 */, /*12959*/{0,971u,2424833u,102901787u,40u,1610612768u,31524u,138442752u,67108864u}/* A49A */, /*12960*/{0,971u,2424833u,102901787u,40u,1610612768u,31532u,138442752u,67108864u}/* A49B */, /*12961*/{0,971u,2424833u,102901787u,40u,1610612768u,31540u,138442752u,67108864u}/* A49C */, /*12962*/{0,971u,2424833u,102901787u,40u,1610612768u,31548u,138442752u,67108864u}/* A49D */, /*12963*/{0,971u,2424833u,102901787u,40u,1610612768u,31556u,138442752u,67108864u}/* A49E */, /*12964*/{0,971u,2424833u,102901787u,40u,1610612768u,31564u,138442752u,67108864u}/* A49F */, /*12965*/{0,971u,2424833u,102901787u,40u,1610612768u,31572u,138442752u,67108864u}/* A4A0 */, /*12966*/{0,971u,2424833u,102901787u,40u,1610612768u,31580u,138442752u,67108864u}/* A4A1 */, /*12967*/{0,971u,2424833u,102967323u,40u,1610612768u,31588u,138442752u,67108864u}/* A4A2 */, /*12968*/{0,971u,2424833u,102967323u,40u,1610612768u,31596u,138442752u,67108864u}/* A4A3 */, /*12969*/{0,971u,2424833u,102901787u,40u,1610612768u,31604u,138442752u,67108864u}/* A4A4 */, /*12970*/{0,971u,2424833u,102901787u,40u,1610612768u,31612u,138442752u,67108864u}/* A4A5 */, /*12971*/{0,971u,2424833u,102901787u,40u,1610612768u,31620u,138442752u,67108864u}/* A4A6 */, /*12972*/{0,971u,2424833u,102901787u,40u,1610612768u,31628u,138442752u,67108864u}/* A4A7 */, /*12973*/{0,971u,2424833u,102901787u,40u,1610612768u,31636u,138442752u,67108864u}/* A4A8 */, /*12974*/{0,971u,2424833u,102901787u,40u,1610612768u,31644u,138442752u,67108864u}/* A4A9 */, /*12975*/{0,971u,2424833u,102901787u,40u,1610612768u,31652u,138442752u,67108864u}/* A4AA */, /*12976*/{0,971u,2424833u,102901787u,40u,1610612768u,31660u,138442752u,67108864u}/* A4AB */, /*12977*/{0,971u,2424833u,102901787u,40u,1610612768u,31668u,138442752u,67108864u}/* A4AC */, /*12978*/{0,971u,2424833u,102901787u,40u,1610612768u,31676u,138442752u,67108864u}/* A4AD */, /*12979*/{0,971u,2424833u,102901787u,40u,1610612768u,31684u,138442752u,67108864u}/* A4AE */, /*12980*/{0,971u,2424833u,102901787u,40u,1610612768u,31692u,138442752u,67108864u}/* A4AF */, /*12981*/{0,971u,2424833u,102901787u,40u,1610612768u,31700u,138442752u,67108864u}/* A4B0 */, /*12982*/{0,971u,2424833u,102901787u,40u,1610612768u,31708u,138442752u,67108864u}/* A4B1 */, /*12983*/{0,971u,2424833u,102901787u,40u,1610612768u,31716u,138442752u,67108864u}/* A4B2 */, /*12984*/{0,971u,2424833u,102901787u,40u,1610612768u,31724u,138442752u,67108864u}/* A4B3 */, /*12985*/{0,971u,2424833u,102967323u,40u,1610612768u,31732u,138442752u,67108864u}/* A4B4 */, /*12986*/{0,971u,2424833u,102901787u,40u,1610612768u,31740u,138442752u,67108864u}/* A4B5 */, /*12987*/{0,971u,2424833u,102901787u,40u,1610612768u,31748u,138442752u,67108864u}/* A4B6 */, /*12988*/{0,971u,2424833u,102901787u,40u,1610612768u,31756u,138442752u,67108864u}/* A4B7 */, /*12989*/{0,971u,2424833u,102901787u,40u,1610612768u,31764u,138442752u,67108864u}/* A4B8 */, /*12990*/{0,971u,2424833u,102901787u,40u,1610612768u,31772u,138442752u,67108864u}/* A4B9 */, /*12991*/{0,971u,2424833u,102901787u,40u,1610612768u,31780u,138442752u,67108864u}/* A4BA */, /*12992*/{0,971u,2424833u,102901787u,40u,1610612768u,31788u,138442752u,67108864u}/* A4BB */, /*12993*/{0,971u,2424833u,102901787u,40u,1610612768u,31796u,138442752u,67108864u}/* A4BC */, /*12994*/{0,971u,2424833u,102901787u,40u,1610612768u,31804u,138442752u,67108864u}/* A4BD */, /*12995*/{0,971u,2424833u,102901787u,40u,1610612768u,31812u,138442752u,67108864u}/* A4BE */, /*12996*/{0,971u,2424833u,102901787u,40u,1610612768u,31820u,138442752u,67108864u}/* A4BF */, /*12997*/{0,971u,2424833u,102901787u,40u,1610612768u,31828u,138442752u,67108864u}/* A4C0 */, /*12998*/{0,971u,2424833u,102967323u,40u,1610612768u,31836u,138442752u,67108864u}/* A4C1 */, /*12999*/{0,971u,2424833u,102901787u,40u,1610612768u,31844u,138442752u,67108864u}/* A4C2 */, /*13000*/{0,971u,2424833u,102901787u,40u,1610612768u,31852u,138442752u,67108864u}/* A4C3 */, /*13001*/{0,971u,2424833u,102901787u,40u,1610612768u,31860u,138442752u,67108864u}/* A4C4 */, /*13002*/{0,971u,2424833u,102967323u,40u,1610612768u,31868u,138442752u,67108864u}/* A4C5 */, /*13003*/{0,971u,2424833u,102901787u,40u,1610612768u,31876u,138442752u,67108864u}/* A4C6 */, /*13004*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677861948u,138442752u,393216u}/* A4D0 */, /*13005*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677861956u,138442752u,393216u}/* A4D1 */, /*13006*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677861964u,138442752u,393216u}/* A4D2 */, /*13007*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677861972u,138442752u,393216u}/* A4D3 */, /*13008*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677861980u,138442752u,393216u}/* A4D4 */, /*13009*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677861988u,138442752u,393216u}/* A4D5 */, /*13010*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677861996u,138442752u,393216u}/* A4D6 */, /*13011*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862004u,138442752u,393216u}/* A4D7 */, /*13012*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862012u,138442752u,393216u}/* A4D8 */, /*13013*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862020u,138442752u,393216u}/* A4D9 */, /*13014*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862028u,138442752u,393216u}/* A4DA */, /*13015*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862036u,138442752u,393216u}/* A4DB */, /*13016*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862044u,138442752u,393216u}/* A4DC */, /*13017*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862052u,138442752u,393216u}/* A4DD */, /*13018*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862060u,138442752u,393216u}/* A4DE */, /*13019*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862068u,138442752u,393216u}/* A4DF */, /*13020*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862076u,138442752u,393216u}/* A4E0 */, /*13021*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862084u,138442752u,393216u}/* A4E1 */, /*13022*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862092u,138442752u,393216u}/* A4E2 */, /*13023*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862100u,138442752u,393216u}/* A4E3 */, /*13024*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862108u,138442752u,393216u}/* A4E4 */, /*13025*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862116u,138442752u,393216u}/* A4E5 */, /*13026*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862124u,138442752u,393216u}/* A4E6 */, /*13027*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862132u,138442752u,393216u}/* A4E7 */, /*13028*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862140u,138442752u,393216u}/* A4E8 */, /*13029*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862148u,138442752u,393216u}/* A4E9 */, /*13030*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862172u,138442752u,393216u}/* A4EA */, /*13031*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862156u,138442752u,393216u}/* A4EB */, /*13032*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862180u,138442752u,393216u}/* A4EC */, /*13033*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862164u,138442752u,393216u}/* A4ED */, /*13034*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862188u,138442752u,393216u}/* A4EE */, /*13035*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862196u,138442752u,393216u}/* A4EF */, /*13036*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862204u,138442752u,393216u}/* A4F0 */, /*13037*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862212u,138442752u,393216u}/* A4F1 */, /*13038*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862220u,138442752u,393216u}/* A4F2 */, /*13039*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862228u,138442752u,393216u}/* A4F3 */, /*13040*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862236u,138442752u,393216u}/* A4F4 */, /*13041*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862244u,138442752u,393216u}/* A4F5 */, /*13042*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862252u,138442752u,393216u}/* A4F6 */, /*13043*/{0,976u,5439489u,76906501u,1515560u,3758096416u,1677862260u,138442752u,393216u}/* A4F7 */, /*13044*/{0,976u,5439489u,76906500u,1515560u,3774873632u,1677861900u,138442752u,393216u}/* A4F8 */, /*13045*/{0,976u,5439489u,76906500u,1515560u,3774873632u,1677861908u,138442752u,393216u}/* A4F9 */, /*13046*/{0,976u,5439489u,76906500u,1515560u,3774873632u,1677861916u,138442752u,393216u}/* A4FA */, /*13047*/{0,976u,5439489u,76906500u,1515560u,3774873632u,1677861924u,138442752u,393216u}/* A4FB */, /*13048*/{0,976u,5439489u,76906500u,1515560u,3774873632u,1677861940u,138442752u,393216u}/* A4FC */, /*13049*/{0,976u,5439489u,76906500u,1515560u,3774873632u,1677861932u,138442752u,393216u}/* A4FD */, /*13050*/{0,976u,5439489u,69566487u,40u,1610612768u,4476u,138442754u,8388608u}/* A4FE */, /*13051*/{0,976u,5439489u,69566487u,98344u,1610612768u,5180u,138442754u,41943040u}/* A4FF */, /*13052*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837204u,138442752u,393216u}/* A500 */, /*13053*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837212u,138442752u,393216u}/* A501 */, /*13054*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837220u,138442752u,393216u}/* A502 */, /*13055*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837228u,138442752u,393216u}/* A503 */, /*13056*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837236u,138442752u,393216u}/* A504 */, /*13057*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837244u,138442752u,393216u}/* A505 */, /*13058*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837252u,138442752u,393216u}/* A506 */, /*13059*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837260u,138442752u,393216u}/* A507 */, /*13060*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837268u,138442752u,393216u}/* A508 */, /*13061*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837276u,138442752u,393216u}/* A509 */, /*13062*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837284u,138442752u,393216u}/* A50A */, /*13063*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837292u,138442752u,393216u}/* A50B */, /*13064*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837300u,138442752u,393216u}/* A50C */, /*13065*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837308u,138442752u,393216u}/* A50D */, /*13066*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837316u,138442752u,393216u}/* A50E */, /*13067*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837324u,138442752u,393216u}/* A50F */, /*13068*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837332u,138442752u,393216u}/* A510 */, /*13069*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837340u,138442752u,393216u}/* A511 */, /*13070*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837348u,138442752u,393216u}/* A512 */, /*13071*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837356u,138442752u,393216u}/* A513 */, /*13072*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837364u,138442752u,393216u}/* A514 */, /*13073*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837372u,138442752u,393216u}/* A515 */, /*13074*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837380u,138442752u,393216u}/* A516 */, /*13075*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837388u,138442752u,393216u}/* A517 */, /*13076*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837396u,138442752u,393216u}/* A518 */, /*13077*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837404u,138442752u,393216u}/* A519 */, /*13078*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837412u,138442752u,393216u}/* A51A */, /*13079*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837420u,138442752u,393216u}/* A51B */, /*13080*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837428u,138442752u,393216u}/* A51C */, /*13081*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837436u,138442752u,393216u}/* A51D */, /*13082*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837444u,138442752u,393216u}/* A51E */, /*13083*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837452u,138442752u,393216u}/* A51F */, /*13084*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837460u,138442752u,393216u}/* A520 */, /*13085*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837468u,138442752u,393216u}/* A521 */, /*13086*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837476u,138442752u,393216u}/* A522 */, /*13087*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837484u,138442752u,393216u}/* A523 */, /*13088*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837492u,138442752u,393216u}/* A524 */, /*13089*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837500u,138442752u,393216u}/* A525 */, /*13090*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837508u,138442752u,393216u}/* A526 */, /*13091*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837516u,138442752u,393216u}/* A527 */, /*13092*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837524u,138442752u,393216u}/* A528 */, /*13093*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837532u,138442752u,393216u}/* A529 */, /*13094*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837540u,138442752u,393216u}/* A52A */, /*13095*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837548u,138442752u,393216u}/* A52B */, /*13096*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837556u,138442752u,393216u}/* A52C */, /*13097*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837564u,138442752u,393216u}/* A52D */, /*13098*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837572u,138442752u,393216u}/* A52E */, /*13099*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837580u,138442752u,393216u}/* A52F */, /*13100*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837588u,138442752u,393216u}/* A530 */, /*13101*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837596u,138442752u,393216u}/* A531 */, /*13102*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837604u,138442752u,393216u}/* A532 */, /*13103*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837612u,138442752u,393216u}/* A533 */, /*13104*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837620u,138442752u,393216u}/* A534 */, /*13105*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837628u,138442752u,393216u}/* A535 */, /*13106*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837636u,138442752u,393216u}/* A536 */, /*13107*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837644u,138442752u,393216u}/* A537 */, /*13108*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837652u,138442752u,393216u}/* A538 */, /*13109*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837660u,138442752u,393216u}/* A539 */, /*13110*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837668u,138442752u,393216u}/* A53A */, /*13111*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837676u,138442752u,393216u}/* A53B */, /*13112*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837684u,138442752u,393216u}/* A53C */, /*13113*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837692u,138442752u,393216u}/* A53D */, /*13114*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837700u,138442752u,393216u}/* A53E */, /*13115*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837708u,138442752u,393216u}/* A53F */, /*13116*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837716u,138442752u,393216u}/* A540 */, /*13117*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837724u,138442752u,393216u}/* A541 */, /*13118*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837732u,138442752u,393216u}/* A542 */, /*13119*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837740u,138442752u,393216u}/* A543 */, /*13120*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837748u,138442752u,393216u}/* A544 */, /*13121*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837756u,138442752u,393216u}/* A545 */, /*13122*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837764u,138442752u,393216u}/* A546 */, /*13123*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837772u,138442752u,393216u}/* A547 */, /*13124*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837780u,138442752u,393216u}/* A548 */, /*13125*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837788u,138442752u,393216u}/* A549 */, /*13126*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837796u,138442752u,393216u}/* A54A */, /*13127*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837804u,138442752u,393216u}/* A54B */, /*13128*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837812u,138442752u,393216u}/* A54C */, /*13129*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837820u,138442752u,393216u}/* A54D */, /*13130*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837828u,138442752u,393216u}/* A54E */, /*13131*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837836u,138442752u,393216u}/* A54F */, /*13132*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837844u,138442752u,393216u}/* A550 */, /*13133*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837852u,138442752u,393216u}/* A551 */, /*13134*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837860u,138442752u,393216u}/* A552 */, /*13135*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837868u,138442752u,393216u}/* A553 */, /*13136*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837876u,138442752u,393216u}/* A554 */, /*13137*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837884u,138442752u,393216u}/* A555 */, /*13138*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837892u,138442752u,393216u}/* A556 */, /*13139*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837900u,138442752u,393216u}/* A557 */, /*13140*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837908u,138442752u,393216u}/* A558 */, /*13141*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837916u,138442752u,393216u}/* A559 */, /*13142*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837924u,138442752u,393216u}/* A55A */, /*13143*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837932u,138442752u,393216u}/* A55B */, /*13144*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837940u,138442752u,393216u}/* A55C */, /*13145*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837948u,138442752u,393216u}/* A55D */, /*13146*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837956u,138442752u,393216u}/* A55E */, /*13147*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837964u,138442752u,393216u}/* A55F */, /*13148*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837972u,138442752u,393216u}/* A560 */, /*13149*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837980u,138442752u,393216u}/* A561 */, /*13150*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837988u,138442752u,393216u}/* A562 */, /*13151*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837996u,138442752u,393216u}/* A563 */, /*13152*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838004u,138442752u,393216u}/* A564 */, /*13153*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838012u,138442752u,393216u}/* A565 */, /*13154*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838020u,138442752u,393216u}/* A566 */, /*13155*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838028u,138442752u,393216u}/* A567 */, /*13156*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838036u,138442752u,393216u}/* A568 */, /*13157*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838044u,138442752u,393216u}/* A569 */, /*13158*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838052u,138442752u,393216u}/* A56A */, /*13159*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838060u,138442752u,393216u}/* A56B */, /*13160*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838068u,138442752u,393216u}/* A56C */, /*13161*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838076u,138442752u,393216u}/* A56D */, /*13162*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838084u,138442752u,393216u}/* A56E */, /*13163*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838092u,138442752u,393216u}/* A56F */, /*13164*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838100u,138442752u,393216u}/* A570 */, /*13165*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838108u,138442752u,393216u}/* A571 */, /*13166*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838116u,138442752u,393216u}/* A572 */, /*13167*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838124u,138442752u,393216u}/* A573 */, /*13168*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838132u,138442752u,393216u}/* A574 */, /*13169*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838140u,138442752u,393216u}/* A575 */, /*13170*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838148u,138442752u,393216u}/* A576 */, /*13171*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838156u,138442752u,393216u}/* A577 */, /*13172*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838164u,138442752u,393216u}/* A578 */, /*13173*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838172u,138442752u,393216u}/* A579 */, /*13174*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838180u,138442752u,393216u}/* A57A */, /*13175*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838188u,138442752u,393216u}/* A57B */, /*13176*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838196u,138442752u,393216u}/* A57C */, /*13177*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838204u,138442752u,393216u}/* A57D */, /*13178*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838212u,138442752u,393216u}/* A57E */, /*13179*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838220u,138442752u,393216u}/* A57F */, /*13180*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838228u,138442752u,393216u}/* A580 */, /*13181*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838236u,138442752u,393216u}/* A581 */, /*13182*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838244u,138442752u,393216u}/* A582 */, /*13183*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838252u,138442752u,393216u}/* A583 */, /*13184*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838260u,138442752u,393216u}/* A584 */, /*13185*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838268u,138442752u,393216u}/* A585 */, /*13186*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838276u,138442752u,393216u}/* A586 */, /*13187*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838284u,138442752u,393216u}/* A587 */, /*13188*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838292u,138442752u,393216u}/* A588 */, /*13189*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838300u,138442752u,393216u}/* A589 */, /*13190*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838308u,138442752u,393216u}/* A58A */, /*13191*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838316u,138442752u,393216u}/* A58B */, /*13192*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838324u,138442752u,393216u}/* A58C */, /*13193*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838332u,138442752u,393216u}/* A58D */, /*13194*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838340u,138442752u,393216u}/* A58E */, /*13195*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838348u,138442752u,393216u}/* A58F */, /*13196*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838356u,138442752u,393216u}/* A590 */, /*13197*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838364u,138442752u,393216u}/* A591 */, /*13198*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838372u,138442752u,393216u}/* A592 */, /*13199*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838380u,138442752u,393216u}/* A593 */, /*13200*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838388u,138442752u,393216u}/* A594 */, /*13201*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838396u,138442752u,393216u}/* A595 */, /*13202*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838404u,138442752u,393216u}/* A596 */, /*13203*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838412u,138442752u,393216u}/* A597 */, /*13204*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838420u,138442752u,393216u}/* A598 */, /*13205*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838428u,138442752u,393216u}/* A599 */, /*13206*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838436u,138442752u,393216u}/* A59A */, /*13207*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838444u,138442752u,393216u}/* A59B */, /*13208*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838452u,138442752u,393216u}/* A59C */, /*13209*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838460u,138442752u,393216u}/* A59D */, /*13210*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838468u,138442752u,393216u}/* A59E */, /*13211*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838476u,138442752u,393216u}/* A59F */, /*13212*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838484u,138442752u,393216u}/* A5A0 */, /*13213*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838492u,138442752u,393216u}/* A5A1 */, /*13214*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838500u,138442752u,393216u}/* A5A2 */, /*13215*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838508u,138442752u,393216u}/* A5A3 */, /*13216*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838516u,138442752u,393216u}/* A5A4 */, /*13217*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838524u,138442752u,393216u}/* A5A5 */, /*13218*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838532u,138442752u,393216u}/* A5A6 */, /*13219*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838540u,138442752u,393216u}/* A5A7 */, /*13220*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838548u,138442752u,393216u}/* A5A8 */, /*13221*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838556u,138442752u,393216u}/* A5A9 */, /*13222*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838564u,138442752u,393216u}/* A5AA */, /*13223*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838572u,138442752u,393216u}/* A5AB */, /*13224*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838580u,138442752u,393216u}/* A5AC */, /*13225*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838588u,138442752u,393216u}/* A5AD */, /*13226*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838596u,138442752u,393216u}/* A5AE */, /*13227*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838604u,138442752u,393216u}/* A5AF */, /*13228*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838612u,138442752u,393216u}/* A5B0 */, /*13229*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838620u,138442752u,393216u}/* A5B1 */, /*13230*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838628u,138442752u,393216u}/* A5B2 */, /*13231*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838636u,138442752u,393216u}/* A5B3 */, /*13232*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838644u,138442752u,393216u}/* A5B4 */, /*13233*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838652u,138442752u,393216u}/* A5B5 */, /*13234*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838660u,138442752u,393216u}/* A5B6 */, /*13235*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838668u,138442752u,393216u}/* A5B7 */, /*13236*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838676u,138442752u,393216u}/* A5B8 */, /*13237*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838684u,138442752u,393216u}/* A5B9 */, /*13238*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838692u,138442752u,393216u}/* A5BA */, /*13239*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838700u,138442752u,393216u}/* A5BB */, /*13240*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838708u,138442752u,393216u}/* A5BC */, /*13241*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838716u,138442752u,393216u}/* A5BD */, /*13242*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838724u,138442752u,393216u}/* A5BE */, /*13243*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838732u,138442752u,393216u}/* A5BF */, /*13244*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838740u,138442752u,393216u}/* A5C0 */, /*13245*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838748u,138442752u,393216u}/* A5C1 */, /*13246*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838756u,138442752u,393216u}/* A5C2 */, /*13247*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838764u,138442752u,393216u}/* A5C3 */, /*13248*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838772u,138442752u,393216u}/* A5C4 */, /*13249*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838780u,138442752u,393216u}/* A5C5 */, /*13250*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838788u,138442752u,393216u}/* A5C6 */, /*13251*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838796u,138442752u,393216u}/* A5C7 */, /*13252*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838804u,138442752u,393216u}/* A5C8 */, /*13253*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838812u,138442752u,393216u}/* A5C9 */, /*13254*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838820u,138442752u,393216u}/* A5CA */, /*13255*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838828u,138442752u,393216u}/* A5CB */, /*13256*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838836u,138442752u,393216u}/* A5CC */, /*13257*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838844u,138442752u,393216u}/* A5CD */, /*13258*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838852u,138442752u,393216u}/* A5CE */, /*13259*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838860u,138442752u,393216u}/* A5CF */, /*13260*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838868u,138442752u,393216u}/* A5D0 */, /*13261*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838876u,138442752u,393216u}/* A5D1 */, /*13262*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838884u,138442752u,393216u}/* A5D2 */, /*13263*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838892u,138442752u,393216u}/* A5D3 */, /*13264*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838900u,138442752u,393216u}/* A5D4 */, /*13265*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838908u,138442752u,393216u}/* A5D5 */, /*13266*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838916u,138442752u,393216u}/* A5D6 */, /*13267*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838924u,138442752u,393216u}/* A5D7 */, /*13268*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838932u,138442752u,393216u}/* A5D8 */, /*13269*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838940u,138442752u,393216u}/* A5D9 */, /*13270*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838948u,138442752u,393216u}/* A5DA */, /*13271*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838956u,138442752u,393216u}/* A5DB */, /*13272*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838964u,138442752u,393216u}/* A5DC */, /*13273*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838972u,138442752u,393216u}/* A5DD */, /*13274*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838980u,138442752u,393216u}/* A5DE */, /*13275*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838988u,138442752u,393216u}/* A5DF */, /*13276*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838996u,138442752u,393216u}/* A5E0 */, /*13277*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839004u,138442752u,393216u}/* A5E1 */, /*13278*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839012u,138442752u,393216u}/* A5E2 */, /*13279*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839020u,138442752u,393216u}/* A5E3 */, /*13280*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839028u,138442752u,393216u}/* A5E4 */, /*13281*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839036u,138442752u,393216u}/* A5E5 */, /*13282*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839044u,138442752u,393216u}/* A5E6 */, /*13283*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839052u,138442752u,393216u}/* A5E7 */, /*13284*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839060u,138442752u,393216u}/* A5E8 */, /*13285*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839068u,138442752u,393216u}/* A5E9 */, /*13286*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839076u,138442752u,393216u}/* A5EA */, /*13287*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839084u,138442752u,393216u}/* A5EB */, /*13288*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839092u,138442752u,393216u}/* A5EC */, /*13289*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839100u,138442752u,393216u}/* A5ED */, /*13290*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839108u,138442752u,393216u}/* A5EE */, /*13291*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839116u,138442752u,393216u}/* A5EF */, /*13292*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839124u,138442752u,393216u}/* A5F0 */, /*13293*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839132u,138442752u,393216u}/* A5F1 */, /*13294*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839140u,138442752u,393216u}/* A5F2 */, /*13295*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839148u,138442752u,393216u}/* A5F3 */, /*13296*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839156u,138442752u,393216u}/* A5F4 */, /*13297*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839164u,138442752u,393216u}/* A5F5 */, /*13298*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839172u,138442752u,393216u}/* A5F6 */, /*13299*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839180u,138442752u,393216u}/* A5F7 */, /*13300*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839188u,138442752u,393216u}/* A5F8 */, /*13301*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839196u,138442752u,393216u}/* A5F9 */, /*13302*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839204u,138442752u,393216u}/* A5FA */, /*13303*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839212u,138442752u,393216u}/* A5FB */, /*13304*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839220u,138442752u,393216u}/* A5FC */, /*13305*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839228u,138442752u,393216u}/* A5FD */, /*13306*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839236u,138442752u,393216u}/* A5FE */, /*13307*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839244u,138442752u,393216u}/* A5FF */, /*13308*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839252u,138442752u,393216u}/* A600 */, /*13309*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839260u,138442752u,393216u}/* A601 */, /*13310*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839268u,138442752u,393216u}/* A602 */, /*13311*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839276u,138442752u,393216u}/* A603 */, /*13312*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839284u,138442752u,393216u}/* A604 */, /*13313*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839292u,138442752u,393216u}/* A605 */, /*13314*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839300u,138442752u,393216u}/* A606 */, /*13315*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839308u,138442752u,393216u}/* A607 */, /*13316*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839316u,138442752u,393216u}/* A608 */, /*13317*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839324u,138442752u,393216u}/* A609 */, /*13318*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839332u,138442752u,393216u}/* A60A */, /*13319*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677839340u,138442752u,393216u}/* A60B */, /*13320*/{0,984u,4587521u,76873732u,1515560u,3774873760u,1677839348u,138442752u,393216u}/* A60C */, /*13321*/{0,984u,4587521u,69543959u,40u,1610612768u,4484u,138442754u,8388608u}/* A60D */, /*13322*/{0,984u,4587521u,74786839u,98344u,1610612768u,5188u,138442754u,41943040u}/* A60E */, /*13323*/{0,984u,4587521u,69543959u,98344u,1610612768u,5012u,138442754u,41943040u}/* A60F */, /*13324*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677837908u,138459136u,393216u}/* A610 */, /*13325*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838052u,138459136u,393216u}/* A611 */, /*13326*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838284u,138459136u,393216u}/* A612 */, /*13327*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677955028u,272709632u,393216u}/* A613 */, /*13328*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677955172u,272709632u,393216u}/* A614 */, /*13329*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677955340u,272709632u,393216u}/* A615 */, /*13330*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677955508u,272709632u,393216u}/* A616 */, /*13331*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677955588u,272709632u,393216u}/* A617 */, /*13332*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677955644u,272709632u,393216u}/* A618 */, /*13333*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677955660u,272709632u,393216u}/* A619 */, /*13334*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677955700u,272709632u,393216u}/* A61A */, /*13335*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677955996u,272709632u,393216u}/* A61B */, /*13336*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677956372u,272709632u,393216u}/* A61C */, /*13337*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677956556u,272709632u,393216u}/* A61D */, /*13338*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677956612u,272709632u,393216u}/* A61E */, /*13339*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677956660u,272709632u,393216u}/* A61F */, /*13340*/{0,984u,38142977u,85262345u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* A620 */, /*13341*/{0,984u,541459969u,85262345u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* A621 */, /*13342*/{0,984u,575015425u,85262345u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* A622 */, /*13343*/{0,984u,608569345u,85262345u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* A623 */, /*13344*/{0,984u,642125825u,85262345u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* A624 */, /*13345*/{0,984u,675679233u,85262345u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* A625 */, /*13346*/{0,984u,709236225u,85262345u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* A626 */, /*13347*/{0,984u,742788609u,85262345u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* A627 */, /*13348*/{0,984u,776346625u,85262345u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* A628 */, /*13349*/{0,984u,809899009u,85262345u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* A629 */, /*13350*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838084u,138459136u,393216u}/* A62A */, /*13351*/{0,984u,4587521u,76873733u,1515560u,3758096416u,1677838876u,138459136u,393216u}/* A62B */, /*13352*/{242944u,1868563424u,262145u,76873729u,1507368u,3807903776u,1711343292u,138491904u,2490368u}/* A640 */, /*13353*/{243072u,992u,262145u,76873730u,1499176u,3768975392u,1719731900u,138442752u,393216u}/* A641 */, /*13354*/{243200u,1870660576u,262145u,76873729u,1507368u,3807903776u,1711343316u,138491904u,2490368u}/* A642 */, /*13355*/{243328u,992u,262145u,76873730u,1499176u,3768975392u,1719731924u,138442752u,393216u}/* A643 */, /*13356*/{243456u,1872757728u,262145u,76873729u,1507368u,3807903776u,1711343356u,138491904u,2490368u}/* A644 */, /*13357*/{243584u,992u,262145u,76873730u,1499176u,3768975392u,1719731964u,138442752u,393216u}/* A645 */, /*13358*/{243712u,1874854880u,262145u,76873729u,1507368u,3807903776u,1711343516u,138491904u,2490368u}/* A646 */, /*13359*/{243840u,992u,262145u,76873730u,1499176u,3768975392u,1719732124u,138442752u,393216u}/* A647 */, /*13360*/{243968u,1876952032u,262145u,76873729u,1507368u,3807903776u,1711343588u,138491904u,2490368u}/* A648 */, /*13361*/{244096u,992u,262145u,76873730u,1499176u,3768975392u,1719732196u,138442752u,393216u}/* A649 */, /*13362*/{244224u,1879049184u,262145u,76873729u,1507368u,3807903776u,1711344772u,138491904u,2490368u}/* A64A */, /*13363*/{244352u,992u,262145u,76873730u,1499176u,3768975392u,1719733380u,138442752u,393216u}/* A64B */, /*13364*/{244480u,1881146336u,262145u,76873729u,1507368u,3807903776u,1711345084u,138491904u,2490368u}/* A64C */, /*13365*/{244608u,992u,262145u,76873730u,1499176u,3768975392u,1719733692u,138442752u,393216u}/* A64D */, /*13366*/{244736u,1883243488u,262145u,76873729u,1507368u,3807903776u,1711345564u,138491904u,2490368u}/* A64E */, /*13367*/{244864u,992u,262145u,76873730u,1499176u,3768975392u,1719734172u,138442752u,393216u}/* A64F */, /*13368*/{244992u,1885340640u,262145u,76873729u,1507368u,3807903776u,1711345620u,138491904u,2490368u}/* A650 */, /*13369*/{245120u,992u,262145u,76873730u,1499176u,3768975392u,1719734228u,138442752u,393216u}/* A651 */, /*13370*/{245248u,1887437792u,262145u,76873729u,1507368u,3807903776u,1711345756u,138491904u,2490368u}/* A652 */, /*13371*/{245376u,992u,262145u,76873730u,1499176u,3768975392u,1719734364u,138442752u,393216u}/* A653 */, /*13372*/{245504u,1889534944u,262145u,76873729u,1507368u,3807903776u,1711345828u,138491904u,2490368u}/* A654 */, /*13373*/{245632u,992u,262145u,76873730u,1499176u,3768975392u,1719734436u,138442752u,393216u}/* A655 */, /*13374*/{245760u,1891632096u,262145u,76873729u,1507368u,3807903776u,1711345836u,138491904u,2490368u}/* A656 */, /*13375*/{245888u,992u,262145u,76873730u,1499176u,3768975392u,1719734444u,138442752u,393216u}/* A657 */, /*13376*/{246016u,1893729248u,262145u,76873729u,1507368u,3807903776u,1711345948u,138491904u,2490368u}/* A658 */, /*13377*/{246144u,992u,262145u,76873730u,1499176u,3768975392u,1719734556u,138442752u,393216u}/* A659 */, /*13378*/{246272u,1895826400u,262145u,76873729u,1507368u,3807903776u,1711345988u,138491904u,2490368u}/* A65A */, /*13379*/{246400u,992u,262145u,76873730u,1499176u,3768975392u,1719734596u,138442752u,393216u}/* A65B */, /*13380*/{246528u,1897923552u,262145u,76873729u,1507368u,3807903776u,1711346028u,138491904u,2490368u}/* A65C */, /*13381*/{246656u,992u,262145u,76873730u,1499176u,3768975392u,1719734636u,138442752u,393216u}/* A65D */, /*13382*/{246784u,1900020704u,262145u,76873729u,1507368u,3807903776u,1711346196u,138491904u,2490368u}/* A65E */, /*13383*/{246912u,992u,262145u,76873730u,1499176u,3768975392u,1719734804u,138442752u,393216u}/* A65F */, /*13384*/{247040u,1902117856u,262145u,76939265u,1507368u,3807903776u,1711345188u,138491904u,2490368u}/* A660 */, /*13385*/{247168u,992u,262145u,76939266u,1499176u,3768975392u,1719733796u,138442752u,393216u}/* A661 */, /*13386*/{247296u,1904215008u,262145u,76873729u,1507368u,3807903776u,1711343068u,138491904u,2490368u}/* A662 */, /*13387*/{247424u,992u,262145u,76873730u,1499176u,3768975392u,1719731676u,138442752u,393216u}/* A663 */, /*13388*/{247552u,1906312160u,262145u,76873729u,1507368u,3807903776u,1711343932u,138491904u,2490368u}/* A664 */, /*13389*/{247680u,992u,262145u,76873730u,1499176u,3768975392u,1719732540u,138442752u,393216u}/* A665 */, /*13390*/{247808u,1908409312u,262145u,76873729u,1507368u,3807903776u,1711344020u,138491904u,2490368u}/* A666 */, /*13391*/{247936u,992u,262145u,76873730u,1499176u,3768975392u,1719732628u,138442752u,393216u}/* A667 */, /*13392*/{248064u,1910506464u,262145u,76873729u,1507368u,3807903776u,1711344244u,138508288u,2490368u}/* A668 */, /*13393*/{248192u,992u,262145u,76873730u,1499176u,3768975392u,1719732852u,138459136u,393216u}/* A669 */, /*13394*/{248320u,1912603616u,262145u,76873729u,1507368u,3807903776u,1711344244u,138508288u,2490368u}/* A66A */, /*13395*/{248448u,992u,262145u,76873730u,1499176u,3768975392u,1719732852u,138459136u,393216u}/* A66B */, /*13396*/{248576u,1914700768u,262145u,76873729u,1507368u,3807903776u,1711344244u,138508288u,2490368u}/* A66C */, /*13397*/{248704u,992u,262145u,76873730u,1499176u,3768975392u,1719732852u,138459136u,393216u}/* A66D */, /*13398*/{0,992u,262145u,76873733u,1515560u,3758096416u,1677789812u,138459136u,393216u}/* A66E */, /*13399*/{0,992u,262145u,3423940614u,672030728u,1627398160u,1077936140u,343963648u,262144u}/* A66F */, /*13400*/{0,992u,262145u,68497415u,672030728u,1627389968u,4194316u,4208640u,0}/* A670 */, /*13401*/{0,992u,262145u,76883991u,40u,1610612768u,7340u,138442754u,0}/* A673 */, /*13402*/{0,992u,262145u,3424038918u,672030728u,3774873616u,1078003244u,138459648u,262144u}/* A674 */, /*13403*/{0,992u,262145u,3424038918u,672030728u,3774873616u,1078003516u,138459648u,262144u}/* A675 */, /*13404*/{0,992u,262145u,3424038918u,672030728u,3774873616u,1078003580u,318847488u,262144u}/* A676 */, /*13405*/{0,992u,262145u,3424038918u,672030728u,3774873616u,1078004772u,138459648u,262144u}/* A677 */, /*13406*/{0,992u,262145u,3424038918u,672030728u,3774873616u,1078005684u,138459648u,262144u}/* A678 */, /*13407*/{0,992u,262145u,3424038918u,672030728u,3774873616u,1078005724u,138459648u,262144u}/* A679 */, /*13408*/{0,992u,262145u,3424038918u,672030728u,3774873616u,1078005756u,138459648u,262144u}/* A67A */, /*13409*/{0,992u,262145u,3424038918u,672030728u,3774873616u,1078005116u,138459648u,262144u}/* A67B */, /*13410*/{0,992u,262145u,3423940614u,672030728u,1627398160u,1077936140u,218134528u,262144u}/* A67C */, /*13411*/{0,992u,262145u,76883991u,40u,1610612768u,7812u,138442754u,0}/* A67E */, /*13412*/{0,992u,262145u,76883972u,1515560u,3774881824u,1677791148u,138442752u,393216u}/* A67F */, /*13413*/{248832u,1916797920u,262145u,76873729u,1507368u,3807903776u,1711343028u,138491904u,2490368u}/* A680 */, /*13414*/{248960u,992u,262145u,76873730u,1499176u,3768975392u,1719731636u,138442752u,393216u}/* A681 */, /*13415*/{249088u,1918895072u,262145u,76873729u,1507368u,3807903776u,1711343412u,138491904u,2490368u}/* A682 */, /*13416*/{249216u,992u,262145u,76873730u,1499176u,3768975392u,1719732020u,138442752u,393216u}/* A683 */, /*13417*/{249344u,1920992224u,262145u,76873729u,1507368u,3807903776u,1711343220u,138491904u,2490368u}/* A684 */, /*13418*/{249472u,992u,262145u,76873730u,1499176u,3768975392u,1719731828u,138442752u,393216u}/* A685 */, /*13419*/{249600u,1923089376u,262145u,76873729u,1507368u,3807903776u,1711345388u,138491904u,2490368u}/* A686 */, /*13420*/{249728u,992u,262145u,76873730u,1499176u,3768975392u,1719733996u,138442752u,393216u}/* A687 */, /*13421*/{249856u,1925186528u,262145u,76873729u,1507368u,3807903776u,1711343396u,138491904u,2490368u}/* A688 */, /*13422*/{249984u,992u,262145u,76873730u,1499176u,3768975392u,1719732004u,138442752u,393216u}/* A689 */, /*13423*/{250112u,1927283680u,262145u,76873729u,1507368u,3807903776u,1711344636u,138491904u,2490368u}/* A68A */, /*13424*/{250240u,992u,262145u,76873730u,1499176u,3768975392u,1719733244u,138442752u,393216u}/* A68B */, /*13425*/{250368u,1929380832u,262145u,76873729u,1507368u,3807903776u,1711344588u,138491904u,2490368u}/* A68C */, /*13426*/{250496u,992u,262145u,76873730u,1499176u,3768975392u,1719733196u,138442752u,393216u}/* A68D */, /*13427*/{250624u,1931477984u,262145u,76873729u,1507368u,3807903776u,1711345196u,138491904u,2490368u}/* A68E */, /*13428*/{250752u,992u,262145u,76873730u,1499176u,3768975392u,1719733804u,138442752u,393216u}/* A68F */, /*13429*/{250880u,1933575136u,262145u,76873729u,1507368u,3807903776u,1711345236u,138491904u,2490368u}/* A690 */, /*13430*/{251008u,992u,262145u,76873730u,1499176u,3768975392u,1719733844u,138442752u,393216u}/* A691 */, /*13431*/{251136u,1935672288u,262145u,76873729u,1507368u,3807903776u,1711345284u,138491904u,2490368u}/* A692 */, /*13432*/{251264u,992u,262145u,76873730u,1499176u,3768975392u,1719733892u,138442752u,393216u}/* A693 */, /*13433*/{251392u,1937769440u,262145u,76873729u,1507368u,3807903776u,1711345012u,138491904u,2490368u}/* A694 */, /*13434*/{251520u,992u,262145u,76873730u,1499176u,3768975392u,1719733620u,138442752u,393216u}/* A695 */, /*13435*/{251648u,1939866592u,262145u,76873729u,1507368u,3807903776u,1711345524u,138491904u,2490368u}/* A696 */, /*13436*/{251776u,992u,262145u,76873730u,1499176u,3768975392u,1719734132u,138442752u,393216u}/* A697 */, /*13437*/{251904u,1941963744u,262145u,77070337u,1507368u,3807903776u,1711344244u,138508288u,2490368u}/* A698 */, /*13438*/{252032u,992u,262145u,77070338u,1499176u,3768975392u,1719732852u,138459136u,393216u}/* A699 */, /*13439*/{252160u,1944060896u,262145u,77070337u,1507368u,3807903776u,1711344244u,138508288u,2490368u}/* A69A */, /*13440*/{252288u,992u,262145u,77070338u,1499176u,3768975392u,1719732852u,138459136u,393216u}/* A69B */, /*13441*/{1224736768u,992u,262145u,77070660u,1499168u,3783794720u,1686179764u,138588176u,393216u}/* A69C */, /*13442*/{1225261056u,992u,262145u,77070660u,1499168u,3783794720u,1686179836u,138588176u,393216u}/* A69D */, /*13443*/{0,992u,262145u,3424169990u,672030728u,3774873616u,1078004908u,138459648u,262144u}/* A69E */, /*13444*/{0,992u,262145u,3424038918u,672030728u,3774873616u,1078005980u,138459648u,262144u}/* A69F */, /*13445*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839356u,138442752u,393216u}/* A6A0 */, /*13446*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839364u,138442752u,393216u}/* A6A1 */, /*13447*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839372u,138442752u,393216u}/* A6A2 */, /*13448*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839380u,138442752u,393216u}/* A6A3 */, /*13449*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839388u,138442752u,393216u}/* A6A4 */, /*13450*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839396u,138442752u,393216u}/* A6A5 */, /*13451*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839404u,138442752u,393216u}/* A6A6 */, /*13452*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839412u,138442752u,393216u}/* A6A7 */, /*13453*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839420u,138442752u,393216u}/* A6A8 */, /*13454*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839428u,138442752u,393216u}/* A6A9 */, /*13455*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839436u,138442752u,393216u}/* A6AA */, /*13456*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839444u,138442752u,393216u}/* A6AB */, /*13457*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839452u,138442752u,393216u}/* A6AC */, /*13458*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839460u,138442752u,393216u}/* A6AD */, /*13459*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839468u,138442752u,393216u}/* A6AE */, /*13460*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839476u,138442752u,393216u}/* A6AF */, /*13461*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839484u,138442752u,393216u}/* A6B0 */, /*13462*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839492u,138442752u,393216u}/* A6B1 */, /*13463*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839500u,138442752u,393216u}/* A6B2 */, /*13464*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839508u,138442752u,393216u}/* A6B3 */, /*13465*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839516u,138442752u,393216u}/* A6B4 */, /*13466*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839524u,138442752u,393216u}/* A6B5 */, /*13467*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839532u,138442752u,393216u}/* A6B6 */, /*13468*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839540u,138442752u,393216u}/* A6B7 */, /*13469*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839548u,138442752u,393216u}/* A6B8 */, /*13470*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839556u,138442752u,393216u}/* A6B9 */, /*13471*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839564u,138442752u,393216u}/* A6BA */, /*13472*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839572u,138442752u,393216u}/* A6BB */, /*13473*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839580u,138442752u,393216u}/* A6BC */, /*13474*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839588u,138442752u,393216u}/* A6BD */, /*13475*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839596u,138442752u,393216u}/* A6BE */, /*13476*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839604u,138442752u,393216u}/* A6BF */, /*13477*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839612u,138442752u,393216u}/* A6C0 */, /*13478*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839620u,138442752u,393216u}/* A6C1 */, /*13479*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839628u,138442752u,393216u}/* A6C2 */, /*13480*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839636u,138442752u,393216u}/* A6C3 */, /*13481*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839644u,138442752u,393216u}/* A6C4 */, /*13482*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839652u,138442752u,393216u}/* A6C5 */, /*13483*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839660u,138442752u,393216u}/* A6C6 */, /*13484*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839668u,138442752u,393216u}/* A6C7 */, /*13485*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839676u,138442752u,393216u}/* A6C8 */, /*13486*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839684u,138442752u,393216u}/* A6C9 */, /*13487*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839692u,138442752u,393216u}/* A6CA */, /*13488*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839700u,138442752u,393216u}/* A6CB */, /*13489*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839708u,138442752u,393216u}/* A6CC */, /*13490*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839716u,138442752u,393216u}/* A6CD */, /*13491*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839724u,138442752u,393216u}/* A6CE */, /*13492*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839732u,138442752u,393216u}/* A6CF */, /*13493*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839740u,138442752u,393216u}/* A6D0 */, /*13494*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839748u,138442752u,393216u}/* A6D1 */, /*13495*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839756u,138442752u,393216u}/* A6D2 */, /*13496*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839764u,138442752u,393216u}/* A6D3 */, /*13497*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839772u,138442752u,393216u}/* A6D4 */, /*13498*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839780u,138442752u,393216u}/* A6D5 */, /*13499*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839788u,138442752u,393216u}/* A6D6 */, /*13500*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839796u,138442752u,393216u}/* A6D7 */, /*13501*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839804u,138442752u,393216u}/* A6D8 */, /*13502*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839812u,138442752u,393216u}/* A6D9 */, /*13503*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839820u,138442752u,393216u}/* A6DA */, /*13504*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839828u,138442752u,393216u}/* A6DB */, /*13505*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839836u,138442752u,393216u}/* A6DC */, /*13506*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839844u,138442752u,393216u}/* A6DD */, /*13507*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839852u,138442752u,393216u}/* A6DE */, /*13508*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839860u,138442752u,393216u}/* A6DF */, /*13509*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839868u,138442752u,393216u}/* A6E0 */, /*13510*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839876u,138442752u,393216u}/* A6E1 */, /*13511*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839884u,138442752u,393216u}/* A6E2 */, /*13512*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839892u,138442752u,393216u}/* A6E3 */, /*13513*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839900u,138442752u,393216u}/* A6E4 */, /*13514*/{0,1000u,5505025u,76906501u,1515560u,3758096416u,1677839908u,138442752u,393216u}/* A6E5 */, /*13515*/{0,1000u,542377473u,76906506u,9904170u,3758096416u,1610731053u,138442752u,393216u}/* A6E6 */, /*13516*/{0,1000u,575932929u,76906506u,9904170u,3758096416u,1610731061u,138442752u,393216u}/* A6E7 */, /*13517*/{0,1000u,609486849u,76906506u,9904170u,3758096416u,1610731069u,138442752u,393216u}/* A6E8 */, /*13518*/{0,1000u,643043329u,76906506u,9904170u,3758096416u,1610731077u,138442752u,393216u}/* A6E9 */, /*13519*/{0,1000u,676596737u,76906506u,9904170u,3758096416u,1610731085u,138442752u,393216u}/* A6EA */, /*13520*/{0,1000u,710153729u,76906506u,9904170u,3758096416u,1610731093u,138442752u,393216u}/* A6EB */, /*13521*/{0,1000u,743706113u,76906506u,9904170u,3758096416u,1610731101u,138442752u,393216u}/* A6EC */, /*13522*/{0,1000u,777264129u,76906506u,9904170u,3758096416u,1610731109u,138442752u,393216u}/* A6ED */, /*13523*/{0,1000u,810816513u,76906506u,9904170u,3758096416u,1610731117u,138442752u,393216u}/* A6EE */, /*13524*/{0,1000u,39060481u,76906506u,9904170u,3758096416u,1610731125u,138442752u,393216u}/* A6EF */, /*13525*/{0,1000u,5505025u,3423973382u,672030728u,1627398160u,1077936140u,767588352u,262144u}/* A6F0 */, /*13526*/{0,1000u,5505025u,3423973382u,672030728u,1627398160u,1077936140u,771782656u,262144u}/* A6F1 */, /*13527*/{0,1000u,5505025u,76906519u,40u,1610612768u,5836u,138442754u,0}/* A6F2 */, /*13528*/{0,1000u,5505025u,69566487u,98344u,1610612768u,5196u,138442754u,41943040u}/* A6F3 */, /*13529*/{0,1000u,5505025u,69566487u,40u,1610612768u,4876u,138442754u,8388608u}/* A6F4 */, /*13530*/{0,1000u,5505025u,69566487u,40u,1610612768u,4492u,138442754u,8388608u}/* A6F5 */, /*13531*/{0,1000u,5505025u,69566487u,40u,1610612768u,4556u,138442754u,8388608u}/* A6F6 */, /*13532*/{0,1000u,5505025u,69566487u,98344u,1610612768u,5020u,138442754u,41943040u}/* A6F7 */, /*13533*/{0,1008u,65537u,76818458u,40u,1627389984u,10044u,138442752u,67108864u}/* A700 */, /*13534*/{0,1008u,65537u,76818458u,40u,1627389984u,10052u,138442752u,67108864u}/* A701 */, /*13535*/{0,1008u,65537u,76818458u,40u,1627389984u,10060u,138442752u,67108864u}/* A702 */, /*13536*/{0,1008u,65537u,76818458u,40u,1627389984u,10068u,138442752u,67108864u}/* A703 */, /*13537*/{0,1008u,65537u,76818458u,40u,1627389984u,10076u,138442752u,67108864u}/* A704 */, /*13538*/{0,1008u,65537u,76818458u,40u,1627389984u,10084u,138442752u,67108864u}/* A705 */, /*13539*/{0,1008u,65537u,76818458u,40u,1627389984u,10092u,138442752u,67108864u}/* A706 */, /*13540*/{0,1008u,65537u,76818458u,40u,1627389984u,10100u,138442752u,67108864u}/* A707 */, /*13541*/{0,1008u,65537u,76818458u,40u,1627389984u,10108u,138442752u,67108864u}/* A708 */, /*13542*/{0,1008u,65537u,76818458u,40u,1627389984u,10116u,138442752u,67108864u}/* A709 */, /*13543*/{0,1008u,65537u,76818458u,40u,1627389984u,10124u,138442752u,67108864u}/* A70A */, /*13544*/{0,1008u,65537u,76818458u,40u,1627389984u,10132u,138442752u,67108864u}/* A70B */, /*13545*/{0,1008u,65537u,76818458u,40u,1627389984u,10140u,138442752u,67108864u}/* A70C */, /*13546*/{0,1008u,65537u,76818458u,40u,1627389984u,10148u,138442752u,67108864u}/* A70D */, /*13547*/{0,1008u,65537u,76818458u,40u,1627389984u,10156u,138442752u,67108864u}/* A70E */, /*13548*/{0,1008u,65537u,76818458u,40u,1627389984u,10164u,138442752u,67108864u}/* A70F */, /*13549*/{0,1008u,65537u,76818458u,40u,1627389984u,10172u,138442752u,67108864u}/* A710 */, /*13550*/{0,1008u,65537u,76818458u,40u,1627389984u,10180u,138442752u,67108864u}/* A711 */, /*13551*/{0,1008u,65537u,76818458u,40u,1627389984u,10188u,138442752u,67108864u}/* A712 */, /*13552*/{0,1008u,65537u,76818458u,40u,1627389984u,10196u,138442752u,67108864u}/* A713 */, /*13553*/{0,1008u,65537u,76818458u,40u,1627389984u,10204u,138442752u,67108864u}/* A714 */, /*13554*/{0,1008u,65537u,76818458u,40u,1627389984u,10212u,138442752u,67108864u}/* A715 */, /*13555*/{0,1008u,65537u,76818458u,40u,1627389984u,10220u,138442752u,67108864u}/* A716 */, /*13556*/{0,1008u,65537u,76851204u,1515560u,3774881824u,1677731828u,138442752u,393216u}/* A717 */, /*13557*/{0,1008u,65537u,76851204u,1515560u,3774881824u,1677731836u,138442752u,393216u}/* A718 */, /*13558*/{0,1008u,65537u,76851204u,1515560u,3774881824u,1677731844u,138442752u,393216u}/* A719 */, /*13559*/{0,1008u,65537u,76851204u,1515560u,3774881824u,1677731852u,138442752u,393216u}/* A71A */, /*13560*/{0,1008u,65537u,76883972u,1515560u,3774881824u,1677731860u,138442752u,393216u}/* A71B */, /*13561*/{0,1008u,65537u,76883972u,1515560u,3774881824u,1677731868u,138442752u,393216u}/* A71C */, /*13562*/{0,1008u,65537u,76883972u,1515560u,3774881824u,1677731876u,138442752u,393216u}/* A71D */, /*13563*/{0,1008u,65537u,76883972u,1515560u,3774881824u,1677731884u,138442752u,393216u}/* A71E */, /*13564*/{0,1008u,65537u,76883972u,1515560u,3774881824u,1677731892u,138442752u,393216u}/* A71F */, /*13565*/{0,1016u,65537u,76851226u,1441832u,1627398176u,10300u,138442752u,67108864u}/* A720 */, /*13566*/{0,1016u,65537u,76851226u,1441832u,1627398176u,10308u,138442752u,67108864u}/* A721 */, /*13567*/{252416u,1946158072u,131073u,76873729u,1507368u,3807903776u,1711341380u,138491904u,2490368u}/* A722 */, /*13568*/{252544u,1016u,131073u,76873730u,1499176u,3768975392u,1719729988u,138442752u,393216u}/* A723 */, /*13569*/{252672u,1948255224u,131073u,76873729u,1507368u,3807903776u,1711341468u,138491904u,2490368u}/* A724 */, /*13570*/{252800u,1016u,131073u,76873730u,1499176u,3768975392u,1719730076u,138442752u,393216u}/* A725 */, /*13571*/{252928u,1950352376u,131073u,76873729u,1507368u,3807903776u,1711336596u,138491904u,2490368u}/* A726 */, /*13572*/{253056u,1016u,131073u,76873730u,1499176u,3768975392u,1719725204u,138442752u,393216u}/* A727 */, /*13573*/{253184u,1952449528u,131073u,76873729u,1507368u,3807903776u,1711404060u,272758784u,2490368u}/* A728 */, /*13574*/{253312u,1016u,131073u,76873730u,1499176u,3768975392u,1719792668u,272709632u,393216u}/* A729 */, /*13575*/{253440u,1954546680u,131073u,76873729u,1507368u,3807903776u,1711341164u,138491904u,2490368u}/* A72A */, /*13576*/{253568u,1016u,131073u,76873730u,1499176u,3768975392u,1719729772u,138442752u,393216u}/* A72B */, /*13577*/{253696u,1956643832u,131073u,76873729u,1507368u,3807903776u,1711341172u,138491904u,2490368u}/* A72C */, /*13578*/{253824u,1016u,131073u,76873730u,1499176u,3768975392u,1719729780u,138442752u,393216u}/* A72D */, /*13579*/{253952u,1958740984u,131073u,76873729u,1507368u,3807903776u,1711341180u,138491904u,2490368u}/* A72E */, /*13580*/{254080u,1016u,131073u,76873730u,1499176u,3768975392u,1719729788u,138442752u,393216u}/* A72F */, /*13581*/{0,1016u,131073u,76873730u,1499176u,3766485024u,1719724676u,138442752u,393216u}/* A730 */, /*13582*/{0,1016u,131073u,76873730u,1499176u,3766485024u,1719727844u,138442752u,393216u}/* A731 */, /*13583*/{254208u,1960838136u,131073u,76873729u,1507368u,3807903776u,1711393500u,272807936u,2490368u}/* A732 */, /*13584*/{254336u,1016u,131073u,76873730u,1499176u,3768975392u,1719782108u,272709632u,393216u}/* A733 */, /*13585*/{254464u,1962935288u,131073u,76873729u,1507368u,3807903776u,1711396748u,272807936u,2490368u}/* A734 */, /*13586*/{254592u,1016u,131073u,76873730u,1499176u,3768975392u,1719785356u,272709632u,393216u}/* A735 */, /*13587*/{254720u,1965032440u,131073u,76873729u,1507368u,3807903776u,1711398476u,272807936u,2490368u}/* A736 */, /*13588*/{254848u,1016u,131073u,76873730u,1499176u,3768975392u,1719787084u,272709632u,393216u}/* A737 */, /*13589*/{254976u,1967129592u,131073u,76873729u,1507368u,3807903776u,1711398844u,272807936u,2490368u}/* A738 */, /*13590*/{255104u,1016u,131073u,76873730u,1499176u,3768975392u,1719787452u,272709632u,393216u}/* A739 */, /*13591*/{255232u,1969226744u,131073u,76873729u,1507368u,3807903776u,1711398844u,1417885696u,2490368u}/* A73A */, /*13592*/{255360u,1016u,131073u,76873730u,1499176u,3768975392u,1719787452u,1417787392u,393216u}/* A73B */, /*13593*/{255488u,1971323896u,131073u,76873729u,1507368u,3807903776u,1711399164u,272807936u,2490368u}/* A73C */, /*13594*/{255616u,1016u,131073u,76873730u,1499176u,3768975392u,1719787772u,272709632u,393216u}/* A73D */, /*13595*/{255744u,1973421048u,131073u,76873729u,1507368u,3807903776u,1711335340u,138491904u,2490368u}/* A73E */, /*13596*/{255872u,1016u,131073u,76873730u,1499176u,3768975392u,1719723948u,138442752u,393216u}/* A73F */, /*13597*/{256000u,1975518200u,131073u,76873729u,1507368u,3807903776u,1711337148u,138491904u,2490368u}/* A740 */, /*13598*/{256128u,1016u,131073u,76873730u,1499176u,3768975392u,1719725756u,138442752u,393216u}/* A741 */, /*13599*/{256256u,1977615352u,131073u,76873729u,1507368u,3807903776u,1711337156u,138491904u,2490368u}/* A742 */, /*13600*/{256384u,1016u,131073u,76873730u,1499176u,3768975392u,1719725764u,138442752u,393216u}/* A743 */, /*13601*/{256512u,1979712504u,131073u,76873729u,1507368u,3807903776u,1711337164u,138491904u,2490368u}/* A744 */, /*13602*/{256640u,1016u,131073u,76873730u,1499176u,3768975392u,1719725772u,138442752u,393216u}/* A745 */, /*13603*/{256768u,1981809656u,131073u,76873729u,1507368u,3807903776u,1711337268u,138491904u,2490368u}/* A746 */, /*13604*/{256896u,1016u,131073u,76873730u,1499176u,3768975392u,1719725876u,138442752u,393216u}/* A747 */, /*13605*/{257024u,1983906808u,131073u,76873729u,1507368u,3807903776u,1711337284u,138491904u,2490368u}/* A748 */, /*13606*/{257152u,1016u,131073u,76873730u,1499176u,3768975392u,1719725892u,138442752u,393216u}/* A749 */, /*13607*/{257280u,1986003960u,131073u,76873729u,1507368u,3807903776u,1711338308u,138491904u,2490368u}/* A74A */, /*13608*/{257408u,1016u,131073u,76873730u,1499176u,3768975392u,1719726916u,138442752u,393216u}/* A74B */, /*13609*/{257536u,1988101112u,131073u,76873729u,1507368u,3807903776u,1711338244u,138491904u,2490368u}/* A74C */, /*13610*/{257664u,1016u,131073u,76873730u,1499176u,3768975392u,1719726852u,138442752u,393216u}/* A74D */, /*13611*/{257792u,1990198264u,131073u,76873729u,1507368u,3807903776u,1711399996u,272807936u,2490368u}/* A74E */, /*13612*/{257920u,1016u,131073u,76873730u,1499176u,3768975392u,1719788604u,272709632u,393216u}/* A74F */, /*13613*/{258048u,1992295416u,131073u,76873729u,1507368u,3807903776u,1711338444u,138491904u,2490368u}/* A750 */, /*13614*/{258176u,1016u,131073u,76873730u,1499176u,3768975392u,1719727052u,138442752u,393216u}/* A751 */, /*13615*/{258304u,1994392568u,131073u,76873729u,1507368u,3807903776u,1711338500u,138491904u,2490368u}/* A752 */, /*13616*/{258432u,1016u,131073u,76873730u,1499176u,3768975392u,1719727108u,138442752u,393216u}/* A753 */, /*13617*/{258560u,1996489720u,131073u,76873729u,1507368u,3807903776u,1711338508u,138491904u,2490368u}/* A754 */, /*13618*/{258688u,1016u,131073u,76873730u,1499176u,3768975392u,1719727116u,138442752u,393216u}/* A755 */, /*13619*/{258816u,1998586872u,131073u,76873729u,1507368u,3807903776u,1711338596u,138491904u,2490368u}/* A756 */, /*13620*/{258944u,1016u,131073u,76873730u,1499176u,3768975392u,1719727204u,138442752u,393216u}/* A757 */, /*13621*/{259072u,2000684024u,131073u,76873729u,1507368u,3807903776u,1711338604u,138491904u,2490368u}/* A758 */, /*13622*/{259200u,1016u,131073u,76873730u,1499176u,3768975392u,1719727212u,138442752u,393216u}/* A759 */, /*13623*/{259328u,2002781176u,131073u,76873729u,1507368u,3807903776u,1711338788u,138491904u,2490368u}/* A75A */, /*13624*/{259456u,1016u,131073u,76873730u,1499176u,3768975392u,1719727396u,138442752u,393216u}/* A75B */, /*13625*/{259584u,2004878328u,131073u,76873729u,1507368u,3807903776u,1711339196u,138491904u,2490368u}/* A75C */, /*13626*/{259712u,1016u,131073u,76873730u,1499176u,3768975392u,1719727804u,138442752u,393216u}/* A75D */, /*13627*/{259840u,2006975480u,131073u,76873729u,1507368u,3807903776u,1711340156u,138491904u,2490368u}/* A75E */, /*13628*/{259968u,1016u,131073u,76873730u,1499176u,3768975392u,1719728764u,138442752u,393216u}/* A75F */, /*13629*/{260096u,2009072632u,131073u,76873729u,1507368u,3807903776u,1711404508u,272807936u,2490368u}/* A760 */, /*13630*/{260224u,1016u,131073u,76873730u,1499176u,3768975392u,1719793116u,272709632u,393216u}/* A761 */, /*13631*/{260352u,2011169784u,131073u,76873729u,1507368u,3807903776u,1711340836u,138491904u,2490368u}/* A762 */, /*13632*/{260480u,1016u,131073u,76873730u,1499176u,3768975392u,1719729444u,138442752u,393216u}/* A763 */, /*13633*/{260608u,2013266936u,131073u,76873729u,1507368u,3807903776u,1711341020u,138491904u,2490368u}/* A764 */, /*13634*/{260736u,1016u,131073u,76873730u,1499176u,3768975392u,1719729628u,138442752u,393216u}/* A765 */, /*13635*/{260864u,2015364088u,131073u,76873729u,1507368u,3807903776u,1711341028u,138491904u,2490368u}/* A766 */, /*13636*/{260992u,1016u,131073u,76873730u,1499176u,3768975392u,1719729636u,138442752u,393216u}/* A767 */, /*13637*/{261120u,2017461240u,131073u,76873729u,1507368u,3807903776u,1711341068u,138491904u,2490368u}/* A768 */, /*13638*/{261248u,1016u,131073u,76873730u,1499176u,3768975392u,1719729676u,138442752u,393216u}/* A769 */, /*13639*/{261376u,2019558392u,131073u,76873729u,1507368u,3807903776u,1711341100u,138491904u,2490368u}/* A76A */, /*13640*/{261504u,1016u,131073u,76873730u,1499176u,3768975392u,1719729708u,138442752u,393216u}/* A76B */, /*13641*/{261632u,2021655544u,131073u,76873729u,1507368u,3807903776u,1711341108u,138491904u,2490368u}/* A76C */, /*13642*/{261760u,1016u,131073u,76873730u,1499176u,3768975392u,1719729716u,138442752u,393216u}/* A76D */, /*13643*/{261888u,2023752696u,131073u,76873729u,1507368u,3807903776u,1711341116u,138491904u,2490368u}/* A76E */, /*13644*/{262016u,1016u,131073u,76873730u,1499176u,3768975392u,1719729724u,138442752u,393216u}/* A76F */, /*13645*/{1225785344u,1016u,131073u,76874052u,1499168u,3783786528u,1686175292u,138588176u,393216u}/* A770 */, /*13646*/{0,1016u,131073u,76873730u,1499176u,3766485024u,1719724156u,138442752u,393216u}/* A771 */, /*13647*/{0,1016u,131073u,76873730u,1499176u,3766485024u,1719726108u,138442752u,393216u}/* A772 */, /*13648*/{0,1016u,131073u,76873730u,1499176u,3766485024u,1719726332u,138442752u,393216u}/* A773 */, /*13649*/{0,1016u,131073u,76873730u,1499176u,3766485024u,1719726580u,138442752u,393216u}/* A774 */, /*13650*/{0,1016u,131073u,76873730u,1499176u,3766485024u,1719727788u,138442752u,393216u}/* A775 */, /*13651*/{0,1016u,131073u,76873730u,1499176u,3766485024u,1719727796u,138442752u,393216u}/* A776 */, /*13652*/{0,1016u,131073u,76873730u,1499176u,3766485024u,1719728316u,138442752u,393216u}/* A777 */, /*13653*/{0,1016u,131073u,76873730u,1499176u,3766485024u,1719729732u,138442752u,393216u}/* A778 */, /*13654*/{262144u,2025849848u,131073u,76873729u,1507368u,3807903776u,1711335348u,1287780352u,2490368u}/* A779 */, /*13655*/{262272u,1016u,131073u,76873730u,1499176u,3768975392u,1719723956u,1287731200u,393216u}/* A77A */, /*13656*/{262400u,2027947000u,131073u,76873729u,1507368u,3807903776u,1711336036u,1287780352u,2490368u}/* A77B */, /*13657*/{262528u,1016u,131073u,76873730u,1499176u,3768975392u,1719724644u,1287731200u,393216u}/* A77C */, /*13658*/{262656u,2030044152u,131073u,76873729u,1507368u,3807903776u,1711336156u,1287780352u,2490368u}/* A77D */, /*13659*/{262784u,2032141304u,131073u,76873729u,1507368u,3807903776u,1711336372u,138491904u,2490368u}/* A77E */, /*13660*/{262912u,1016u,131073u,76873730u,1499176u,3768975392u,1719724980u,138442752u,393216u}/* A77F */, /*13661*/{263040u,2034238456u,131073u,76873729u,1507368u,3807903776u,1711337540u,138491904u,2490368u}/* A780 */, /*13662*/{263168u,1016u,131073u,76873730u,1499176u,3768975392u,1719726148u,138442752u,393216u}/* A781 */, /*13663*/{263296u,2036335608u,131073u,76873729u,1507368u,3807903776u,1711338708u,1287780352u,2490368u}/* A782 */, /*13664*/{263424u,1016u,131073u,76873730u,1499176u,3768975392u,1719727316u,1287731200u,393216u}/* A783 */, /*13665*/{263552u,2038432760u,131073u,76873729u,1507368u,3807903776u,1711339204u,1287780352u,2490368u}/* A784 */, /*13666*/{263680u,1016u,131073u,76873730u,1499176u,3768975392u,1719727812u,1287731200u,393216u}/* A785 */, /*13667*/{263808u,2040529912u,131073u,76873729u,1507368u,3807903776u,1711339492u,1287780352u,2490368u}/* A786 */, /*13668*/{263936u,1016u,131073u,76873730u,1499176u,3768975392u,1719728100u,1287731200u,393216u}/* A787 */, /*13669*/{0,1016u,65537u,76883972u,1515560u,3774881824u,1677731916u,138442752u,393216u}/* A788 */, /*13670*/{0,1016u,65537u,76873754u,1441832u,1627389984u,10324u,138442752u,67108864u}/* A789 */, /*13671*/{0,1016u,65537u,76873754u,1441832u,1627389984u,10332u,138442752u,67108864u}/* A78A */, /*13672*/{264064u,2042627064u,131073u,76873729u,1507368u,3807903776u,1711341388u,138491904u,2490368u}/* A78B */, /*13673*/{264192u,1016u,131073u,76873730u,1499176u,3768975392u,1719729996u,138442752u,393216u}/* A78C */, /*13674*/{264320u,2044724216u,131073u,76939265u,1507368u,3807903776u,1711339900u,138491904u,2490368u}/* A78D */, /*13675*/{0,1016u,131073u,76939266u,1499176u,3766485024u,1719726068u,138442752u,393216u}/* A78E */, /*13676*/{0,1016u,131073u,77103109u,1515560u,3758096416u,1677786964u,138442752u,393216u}/* A78F */, /*13677*/{264448u,2046821368u,131073u,76939265u,1507368u,3807903776u,1711337884u,138491904u,2490368u}/* A790 */, /*13678*/{264576u,1016u,131073u,76939266u,1499176u,3768975392u,1719726492u,138442752u,393216u}/* A791 */, /*13679*/{264704u,2048918520u,131073u,76972033u,1507368u,3807903776u,1711335252u,138491904u,2490368u}/* A792 */, /*13680*/{264832u,1016u,131073u,76972034u,1499176u,3768975392u,1719723860u,138442752u,393216u}/* A793 */, /*13681*/{0,1016u,131073u,77070338u,1499176u,3766485024u,1719723868u,138442752u,393216u}/* A794 */, /*13682*/{0,1016u,131073u,77070338u,1499176u,3766485024u,1719725148u,138442752u,393216u}/* A795 */, /*13683*/{264960u,2051015672u,131073u,77070337u,1507368u,3807903776u,1711335092u,138491904u,2490368u}/* A796 */, /*13684*/{265088u,1016u,131073u,77070338u,1499176u,3768975392u,1719723700u,138442752u,393216u}/* A797 */, /*13685*/{265216u,2053112824u,131073u,77070337u,1507368u,3807903776u,1711336084u,138491904u,2490368u}/* A798 */, /*13686*/{265344u,1016u,131073u,77070338u,1499176u,3768975392u,1719724692u,138442752u,393216u}/* A799 */, /*13687*/{265472u,2055209976u,131073u,77070337u,1507368u,3807903776u,1711334772u,318896128u,2490368u}/* A79A */, /*13688*/{265600u,1016u,131073u,77070338u,1499176u,3768975392u,1719723380u,318846976u,393216u}/* A79B */, /*13689*/{265728u,2057307128u,131073u,77070337u,1507368u,3807903776u,1711338020u,318896128u,2490368u}/* A79C */, /*13690*/{265856u,1016u,131073u,77070338u,1499176u,3768975392u,1719726628u,318846976u,393216u}/* A79D */, /*13691*/{265984u,2059404280u,131073u,77070337u,1507368u,3807903776u,1711339748u,318896128u,2490368u}/* A79E */, /*13692*/{266112u,1016u,131073u,77070338u,1499176u,3768975392u,1719728356u,318846976u,393216u}/* A79F */, /*13693*/{266240u,2061501432u,131073u,76939265u,1507368u,3807903776u,1711336156u,360839168u,2490368u}/* A7A0 */, /*13694*/{266368u,1016u,131073u,76939266u,1499176u,3768975392u,1719724764u,360790016u,393216u}/* A7A1 */, /*13695*/{266496u,2063598584u,131073u,76939265u,1507368u,3807903776u,1711337060u,360839168u,2490368u}/* A7A2 */, /*13696*/{266624u,1016u,131073u,76939266u,1499176u,3768975392u,1719725668u,360790016u,393216u}/* A7A3 */, /*13697*/{266752u,2065695736u,131073u,76939265u,1507368u,3807903776u,1711337732u,360839168u,2490368u}/* A7A4 */, /*13698*/{266880u,1016u,131073u,76939266u,1499176u,3768975392u,1719726340u,360790016u,393216u}/* A7A5 */, /*13699*/{267008u,2067792888u,131073u,76939265u,1507368u,3807903776u,1711338708u,360839168u,2490368u}/* A7A6 */, /*13700*/{267136u,1016u,131073u,76939266u,1499176u,3768975392u,1719727316u,360790016u,393216u}/* A7A7 */, /*13701*/{267264u,2069890040u,131073u,76939265u,1507368u,3807903776u,1711339204u,360839168u,2490368u}/* A7A8 */, /*13702*/{267392u,1016u,131073u,76939266u,1499176u,3768975392u,1719727812u,360790016u,393216u}/* A7A9 */, /*13703*/{267520u,2071987192u,131073u,76972033u,1507368u,3807903776u,1711336548u,138491904u,2490368u}/* A7AA */, /*13704*/{267648u,2074084344u,131073u,77070337u,1507368u,3807903776u,1711335860u,138491904u,2490368u}/* A7AB */, /*13705*/{267776u,2076181496u,131073u,77070337u,1507368u,3807903776u,1711336188u,138491904u,2490368u}/* A7AC */, /*13706*/{267904u,2078278648u,131073u,77070337u,1507368u,3807903776u,1711337380u,138491904u,2490368u}/* A7AD */, /*13707*/{268032u,2080375800u,131073u,77135873u,1507368u,3807903776u,1711336716u,138491904u,2490368u}/* A7AE */, /*13708*/{268160u,2082472952u,131073u,77070337u,1507368u,3807903776u,1711337172u,138491904u,2490368u}/* A7B0 */, /*13709*/{268288u,2084570104u,131073u,77070337u,1507368u,3807903776u,1711339716u,138491904u,2490368u}/* A7B1 */, /*13710*/{268416u,2086667256u,131073u,77103105u,1507368u,3807903776u,1711336964u,138491904u,2490368u}/* A7B2 */, /*13711*/{268544u,2088764408u,131073u,77103105u,1507368u,3807903776u,1711340412u,138491904u,2490368u}/* A7B3 */, /*13712*/{268672u,2090861560u,131073u,77103105u,1507368u,3807903776u,1711335172u,138491904u,2490368u}/* A7B4 */, /*13713*/{268800u,1016u,131073u,77103106u,1499176u,3768975392u,1719723780u,138442752u,393216u}/* A7B5 */, /*13714*/{268928u,2092958712u,131073u,77103105u,1507368u,3807903776u,1711338348u,138491904u,2490368u}/* A7B6 */, /*13715*/{269056u,1016u,131073u,77103106u,1499176u,3768975392u,1719726956u,138442752u,393216u}/* A7B7 */, /*13716*/{0,1016u,131073u,77070341u,1515560u,3758096416u,1677782324u,138442752u,393216u}/* A7F7 */, /*13717*/{1226309632u,1016u,131073u,76972356u,1499168u,3783794720u,1686170620u,377827344u,393216u}/* A7F8 */, /*13718*/{1226833920u,1016u,131073u,76972356u,1499168u,3783794720u,1686231716u,1418178576u,393216u}/* A7F9 */, /*13719*/{0,1016u,131073u,76939266u,1499176u,3766485024u,1719728636u,138442752u,393216u}/* A7FA */, /*13720*/{0,1016u,131073u,76873733u,1515560u,3758096416u,1677781716u,138442752u,393216u}/* A7FB */, /*13721*/{0,1016u,131073u,76873733u,1515560u,3758096416u,1677784084u,138442752u,393216u}/* A7FC */, /*13722*/{0,1016u,131073u,76873733u,1515560u,3758096416u,1677783276u,138442752u,393216u}/* A7FD */, /*13723*/{0,1016u,131073u,76873733u,1515560u,3758096416u,1677782316u,138442752u,393216u}/* A7FE */, /*13724*/{0,1016u,131073u,76873733u,1515560u,3758096416u,1677783284u,138442752u,393216u}/* A7FF */, /*13725*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807228u,138442752u,393216u}/* A800 */, /*13726*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807236u,138442752u,393216u}/* A801 */, /*13727*/{0,1024u,3866625u,68431878u,672030728u,1627389968u,1078021772u,138442752u,262144u}/* A802 */, /*13728*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807252u,138442752u,393216u}/* A803 */, /*13729*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807260u,138442752u,393216u}/* A804 */, /*13730*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807268u,138442752u,393216u}/* A805 */, /*13731*/{0,1024u,3866625u,336867334u,672030728u,1627389976u,1078021804u,138442752u,262144u}/* A806 */, /*13732*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807284u,138442752u,393216u}/* A807 */, /*13733*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807292u,138442752u,393216u}/* A808 */, /*13734*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807300u,138442752u,393216u}/* A809 */, /*13735*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807308u,138442752u,393216u}/* A80A */, /*13736*/{0,1024u,3866625u,68431878u,672030728u,1627389968u,1077936140u,826308608u,262144u}/* A80B */, /*13737*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807316u,138442752u,393216u}/* A80C */, /*13738*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807324u,138442752u,393216u}/* A80D */, /*13739*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807332u,138442752u,393216u}/* A80E */, /*13740*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807340u,138442752u,393216u}/* A80F */, /*13741*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807348u,138442752u,393216u}/* A810 */, /*13742*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807356u,138442752u,393216u}/* A811 */, /*13743*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807364u,138442752u,393216u}/* A812 */, /*13744*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807372u,138442752u,393216u}/* A813 */, /*13745*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807380u,138442752u,393216u}/* A814 */, /*13746*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807388u,138442752u,393216u}/* A815 */, /*13747*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807396u,138442752u,393216u}/* A816 */, /*13748*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807404u,138442752u,393216u}/* A817 */, /*13749*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807412u,138442752u,393216u}/* A818 */, /*13750*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807420u,138442752u,393216u}/* A819 */, /*13751*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807428u,138442752u,393216u}/* A81A */, /*13752*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807436u,138442752u,393216u}/* A81B */, /*13753*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807444u,138442752u,393216u}/* A81C */, /*13754*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807452u,138442752u,393216u}/* A81D */, /*13755*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807460u,138442752u,393216u}/* A81E */, /*13756*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807468u,138442752u,393216u}/* A81F */, /*13757*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807476u,138442752u,393216u}/* A820 */, /*13758*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807484u,138442752u,393216u}/* A821 */, /*13759*/{0,1024u,3866625u,76808197u,1515560u,3758096416u,1677807492u,138442752u,393216u}/* A822 */, /*13760*/{0,1024u,3866625u,68419592u,940466184u,3758096416u,1078022028u,138443264u,262144u}/* A823 */, /*13761*/{0,1024u,3866625u,68419592u,940466184u,3758096416u,1078022036u,138443264u,262144u}/* A824 */, /*13762*/{0,1024u,3866625u,68431878u,672030728u,3774873616u,1078022044u,138443264u,262144u}/* A825 */, /*13763*/{0,1024u,3866625u,68431878u,672030728u,3774873616u,1078022052u,138443264u,262144u}/* A826 */, /*13764*/{0,1024u,3866625u,68419592u,940466184u,3758096416u,1078022060u,138443264u,262144u}/* A827 */, /*13765*/{0,1024u,3866625u,76818459u,40u,1610612768u,10676u,138442752u,67108864u}/* A828 */, /*13766*/{0,1024u,3866625u,76818459u,40u,1610612768u,10684u,138442752u,67108864u}/* A829 */, /*13767*/{0,1024u,3866625u,76818459u,40u,1610612768u,10692u,138442752u,67108864u}/* A82A */, /*13768*/{0,1024u,3866625u,76818459u,40u,1610612768u,10700u,138442752u,67108864u}/* A82B */, /*13769*/{0,1032u,285279745u,76906507u,62914602u,1610612768u,55357u,138442752u,0}/* A830 */, /*13770*/{0,1032u,369165825u,76906507u,4194346u,1610612768u,55365u,138442752u,0}/* A831 */, /*13771*/{0,1032u,453052417u,76906507u,62914602u,1610612768u,55373u,138442752u,0}/* A832 */, /*13772*/{0,1032u,117507585u,76906507u,29360170u,1610612768u,55381u,138442752u,0}/* A833 */, /*13773*/{0,1032u,184616449u,76906507u,46137386u,1610612768u,55389u,138442752u,0}/* A834 */, /*13774*/{0,1032u,251725825u,76906507u,29360170u,1610612768u,55397u,138442752u,0}/* A835 */, /*13775*/{0,1032u,65537u,76906523u,40u,1610612768u,10708u,138442752u,67108864u}/* A836 */, /*13776*/{0,1032u,65537u,76906523u,40u,1610612768u,10716u,138442752u,67108864u}/* A837 */, /*13777*/{0,1032u,65537u,79007769u,40u,1610612768u,58380u,138442752u,67108864u}/* A838 */, /*13778*/{0,1032u,65537u,76910619u,40u,1610612768u,10724u,138442752u,67108864u}/* A839 */, /*13779*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820100u,138442752u,393216u}/* A840 */, /*13780*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820108u,138442752u,393216u}/* A841 */, /*13781*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820116u,138442752u,393216u}/* A842 */, /*13782*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820124u,138442752u,393216u}/* A843 */, /*13783*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820132u,138442752u,393216u}/* A844 */, /*13784*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820140u,138442752u,393216u}/* A845 */, /*13785*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820148u,138442752u,393216u}/* A846 */, /*13786*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820156u,138442752u,393216u}/* A847 */, /*13787*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820196u,138442752u,393216u}/* A848 */, /*13788*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820204u,138442752u,393216u}/* A849 */, /*13789*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820212u,138442752u,393216u}/* A84A */, /*13790*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820220u,138442752u,393216u}/* A84B */, /*13791*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820228u,138442752u,393216u}/* A84C */, /*13792*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820236u,138442752u,393216u}/* A84D */, /*13793*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820244u,138442752u,393216u}/* A84E */, /*13794*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820252u,138442752u,393216u}/* A84F */, /*13795*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820260u,138442752u,393216u}/* A850 */, /*13796*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820268u,138442752u,393216u}/* A851 */, /*13797*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820276u,138442752u,393216u}/* A852 */, /*13798*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820284u,138442752u,393216u}/* A853 */, /*13799*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820300u,138442752u,393216u}/* A854 */, /*13800*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820308u,138442752u,393216u}/* A855 */, /*13801*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820316u,138442752u,393216u}/* A856 */, /*13802*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820324u,138442752u,393216u}/* A857 */, /*13803*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820348u,138442752u,393216u}/* A858 */, /*13804*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820372u,138442752u,393216u}/* A859 */, /*13805*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820380u,138442752u,393216u}/* A85A */, /*13806*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820396u,138442752u,393216u}/* A85B */, /*13807*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820404u,138442752u,393216u}/* A85C */, /*13808*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820428u,138442752u,393216u}/* A85D */, /*13809*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820468u,138442752u,393216u}/* A85E */, /*13810*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820476u,138442752u,393216u}/* A85F */, /*13811*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820484u,138442752u,393216u}/* A860 */, /*13812*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820492u,138442752u,393216u}/* A861 */, /*13813*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820436u,138442752u,393216u}/* A862 */, /*13814*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820444u,138442752u,393216u}/* A863 */, /*13815*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820452u,138442752u,393216u}/* A864 */, /*13816*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820460u,138442752u,393216u}/* A865 */, /*13817*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820500u,138442752u,393216u}/* A866 */, /*13818*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820292u,138442752u,393216u}/* A867 */, /*13819*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820332u,138442752u,393216u}/* A868 */, /*13820*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820164u,138442752u,393216u}/* A869 */, /*13821*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820172u,138442752u,393216u}/* A86A */, /*13822*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820180u,138442752u,393216u}/* A86B */, /*13823*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820188u,138442752u,393216u}/* A86C */, /*13824*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820340u,138442752u,393216u}/* A86D */, /*13825*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820388u,138442752u,393216u}/* A86E */, /*13826*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820412u,138442752u,393216u}/* A86F */, /*13827*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820420u,138442752u,393216u}/* A870 */, /*13828*/{0u,1040u,4259841u,76840965u,1515688u,3758096416u,1677820356u,138442752u,393216u}/* A871 */, /*13829*/{0u,1040u,4259841u,76840965u,1516200u,3758096416u,1677820364u,138442752u,393216u}/* A872 */, /*13830*/{0u,1040u,4259841u,76840965u,1515560u,3758096416u,1677820508u,138442752u,393216u}/* A873 */, /*13831*/{0,1040u,4259841u,90482711u,40u,1610612768u,8700u,138442754u,0}/* A874 */, /*13832*/{0,1040u,4259841u,90482711u,40u,1610612768u,8708u,138442754u,0}/* A875 */, /*13833*/{0,1040u,4259841u,74754071u,98344u,1610612768u,5300u,138442754u,41943040u}/* A876 */, /*13834*/{0,1040u,4259841u,74754071u,98344u,1610612768u,5308u,138442754u,41943040u}/* A877 */, /*13835*/{0,1048u,4653057u,68485128u,940466184u,3758096416u,1077936140u,826309120u,262144u}/* A880 */, /*13836*/{0,1048u,4653057u,68485128u,940466184u,3758096416u,1077936140u,830503424u,262144u}/* A881 */, /*13837*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807540u,138442752u,393216u}/* A882 */, /*13838*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807548u,138442752u,393216u}/* A883 */, /*13839*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807556u,138442752u,393216u}/* A884 */, /*13840*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807564u,138442752u,393216u}/* A885 */, /*13841*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807572u,138442752u,393216u}/* A886 */, /*13842*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807580u,138442752u,393216u}/* A887 */, /*13843*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807588u,138442752u,393216u}/* A888 */, /*13844*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807596u,138442752u,393216u}/* A889 */, /*13845*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807604u,138442752u,393216u}/* A88A */, /*13846*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807612u,138442752u,393216u}/* A88B */, /*13847*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807620u,138442752u,393216u}/* A88C */, /*13848*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807628u,138442752u,393216u}/* A88D */, /*13849*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807636u,138442752u,393216u}/* A88E */, /*13850*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807644u,138442752u,393216u}/* A88F */, /*13851*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807652u,138442752u,393216u}/* A890 */, /*13852*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807660u,138442752u,393216u}/* A891 */, /*13853*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807668u,138442752u,393216u}/* A892 */, /*13854*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807676u,138442752u,393216u}/* A893 */, /*13855*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807684u,138442752u,393216u}/* A894 */, /*13856*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807692u,138442752u,393216u}/* A895 */, /*13857*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807700u,138442752u,393216u}/* A896 */, /*13858*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807708u,138442752u,393216u}/* A897 */, /*13859*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807716u,138442752u,393216u}/* A898 */, /*13860*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807724u,138442752u,393216u}/* A899 */, /*13861*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807732u,138442752u,393216u}/* A89A */, /*13862*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807740u,138442752u,393216u}/* A89B */, /*13863*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807748u,138442752u,393216u}/* A89C */, /*13864*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807756u,138442752u,393216u}/* A89D */, /*13865*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807764u,138442752u,393216u}/* A89E */, /*13866*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807772u,138442752u,393216u}/* A89F */, /*13867*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807780u,138442752u,393216u}/* A8A0 */, /*13868*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807788u,138442752u,393216u}/* A8A1 */, /*13869*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807796u,138442752u,393216u}/* A8A2 */, /*13870*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807804u,138442752u,393216u}/* A8A3 */, /*13871*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807812u,138442752u,393216u}/* A8A4 */, /*13872*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807820u,138442752u,393216u}/* A8A5 */, /*13873*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807828u,138442752u,393216u}/* A8A6 */, /*13874*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807836u,138442752u,393216u}/* A8A7 */, /*13875*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807844u,138442752u,393216u}/* A8A8 */, /*13876*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807852u,138442752u,393216u}/* A8A9 */, /*13877*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807860u,138442752u,393216u}/* A8AA */, /*13878*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807868u,138442752u,393216u}/* A8AB */, /*13879*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807876u,138442752u,393216u}/* A8AC */, /*13880*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807884u,138442752u,393216u}/* A8AD */, /*13881*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807892u,138442752u,393216u}/* A8AE */, /*13882*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807900u,138442752u,393216u}/* A8AF */, /*13883*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807908u,138442752u,393216u}/* A8B0 */, /*13884*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807916u,138442752u,393216u}/* A8B1 */, /*13885*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807924u,138442752u,393216u}/* A8B2 */, /*13886*/{0,1048u,4653057u,76873733u,1515560u,3758096416u,1677807932u,138442752u,393216u}/* A8B3 */, /*13887*/{0,1048u,4653057u,68485128u,940466184u,3758096416u,1078022468u,138443264u,262144u}/* A8B4 */, /*13888*/{0,1048u,4653057u,68485128u,940466184u,3758096416u,1078022476u,138443264u,262144u}/* A8B5 */, /*13889*/{0,1048u,4653057u,68485128u,940466184u,3758096416u,1078022484u,138443264u,262144u}/* A8B6 */, /*13890*/{0,1048u,4653057u,68485128u,940466184u,3758096416u,1078022492u,138443264u,262144u}/* A8B7 */, /*13891*/{0,1048u,4653057u,68485128u,940466184u,3758096416u,1078022500u,138443264u,262144u}/* A8B8 */, /*13892*/{0,1048u,4653057u,68485128u,940466184u,3758096416u,1078022508u,138443264u,262144u}/* A8B9 */, /*13893*/{0,1048u,4653057u,68485128u,940466184u,3758096416u,1078022516u,138443264u,262144u}/* A8BA */, /*13894*/{0,1048u,4653057u,68485128u,940466184u,3758096416u,1078022524u,138443264u,262144u}/* A8BB */, /*13895*/{0,1048u,4653057u,68485128u,940466184u,3758096416u,1078022532u,138443264u,262144u}/* A8BC */, /*13896*/{0,1048u,4653057u,68485128u,940466184u,3758096416u,1078022540u,138443264u,262144u}/* A8BD */, /*13897*/{0,1048u,4653057u,68485128u,940466184u,3758096416u,1078022548u,138443264u,262144u}/* A8BE */, /*13898*/{0,1048u,4653057u,68485128u,940466184u,3758096416u,1078022556u,138443264u,262144u}/* A8BF */, /*13899*/{0,1048u,4653057u,68485128u,940466184u,3758096416u,1078022564u,138443264u,262144u}/* A8C0 */, /*13900*/{0,1048u,4653057u,68485128u,940466184u,3758096416u,1078022572u,138443264u,262144u}/* A8C1 */, /*13901*/{0,1048u,4653057u,68485128u,940466184u,3758096416u,1078022580u,138443264u,262144u}/* A8C2 */, /*13902*/{0,1048u,4653057u,68485128u,940466184u,3758096416u,1078022588u,138443264u,262144u}/* A8C3 */, /*13903*/{0,1048u,4653057u,336932870u,672030728u,1627398168u,1078022596u,138442752u,262144u}/* A8C4 */, /*13904*/{0,1048u,4653057u,68759558u,672030728u,3774873616u,1077936140u,822114816u,262144u}/* A8C5 */, /*13905*/{0,1048u,4653057u,69533719u,98344u,1610612768u,5268u,138442754u,41943040u}/* A8CE */, /*13906*/{0,1048u,4653057u,69533719u,98344u,1610612768u,5276u,138442754u,41943040u}/* A8CF */, /*13907*/{0,1048u,38208513u,85262345u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* A8D0 */, /*13908*/{0,1048u,541525505u,85262345u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* A8D1 */, /*13909*/{0,1048u,575080961u,85262345u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* A8D2 */, /*13910*/{0,1048u,608634881u,85262345u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* A8D3 */, /*13911*/{0,1048u,642191361u,85262345u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* A8D4 */, /*13912*/{0,1048u,675744769u,85262345u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* A8D5 */, /*13913*/{0,1048u,709301761u,85262345u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* A8D6 */, /*13914*/{0,1048u,742854145u,85262345u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* A8D7 */, /*13915*/{0,1048u,776412161u,85262345u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* A8D8 */, /*13916*/{0,1048u,809964545u,85262345u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* A8D9 */, /*13917*/{0,1056u,655361u,3423973382u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* A8E0 */, /*13918*/{0,1056u,655361u,76906501u,1515560u,3758096416u,1677801652u,138442752u,393216u}/* A8F2 */, /*13919*/{0,1056u,655361u,76906501u,1515560u,3758096416u,1677801652u,138459136u,393216u}/* A8F3 */, /*13920*/{0,1056u,655361u,76906519u,40u,1610612768u,8052u,138442754u,0}/* A8F8 */, /*13921*/{0,1056u,655361u,76906519u,40u,1610612768u,8060u,138442754u,0}/* A8F9 */, /*13922*/{0,1056u,655361u,76906519u,40u,1610612768u,8068u,138442754u,0}/* A8FA */, /*13923*/{0,1056u,655361u,76906501u,1515560u,3758096416u,1677801660u,138442752u,393216u}/* A8FB */, /*13924*/{0,1056u,655361u,90734615u,40u,1610612768u,8076u,138442754u,0}/* A8FC */, /*13925*/{0,1056u,655361u,77103109u,1515560u,3758096416u,1677801076u,138442752u,393216u}/* A8FD */, /*13926*/{0,1064u,38274049u,85262345u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* A900 */, /*13927*/{0,1064u,541591041u,85262345u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* A901 */, /*13928*/{0,1064u,575146497u,85262345u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* A902 */, /*13929*/{0,1064u,608700417u,85262345u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* A903 */, /*13930*/{0,1064u,642256897u,85262345u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* A904 */, /*13931*/{0,1064u,675810305u,85262345u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* A905 */, /*13932*/{0,1064u,709367297u,85262345u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* A906 */, /*13933*/{0,1064u,742919681u,85262345u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* A907 */, /*13934*/{0,1064u,776477697u,85262345u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* A908 */, /*13935*/{0,1064u,810030081u,85262345u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* A909 */, /*13936*/{0,1064u,4718593u,76873733u,1515560u,3758096416u,1677822308u,138442752u,393216u}/* A90A */, /*13937*/{0,1064u,4718593u,76873733u,1515560u,3758096416u,1677822316u,138442752u,393216u}/* A90B */, /*13938*/{0,1064u,4718593u,76873733u,1515560u,3758096416u,1677822324u,138442752u,393216u}/* A90C */, /*13939*/{0,1064u,4718593u,76873733u,1515560u,3758096416u,1677822332u,138442752u,393216u}/* A90D */, /*13940*/{0,1064u,4718593u,76873733u,1515560u,3758096416u,1677822340u,138442752u,393216u}/* A90E */, /*13941*/{0,1064u,4718593u,76873733u,1515560u,3758096416u,1677822348u,138442752u,393216u}/* A90F */, /*13942*/{0,1064u,4718593u,76873733u,1515560u,3758096416u,1677822356u,138442752u,393216u}/* A910 */, /*13943*/{0,1064u,4718593u,76873733u,1515560u,3758096416u,1677822364u,138442752u,393216u}/* A911 */, /*13944*/{0,1064u,4718593u,76873733u,1515560u,3758096416u,1677822372u,138442752u,393216u}/* A912 */, /*13945*/{0,1064u,4718593u,76873733u,1515560u,3758096416u,1677822380u,138442752u,393216u}/* A913 */, /*13946*/{0,1064u,4718593u,76873733u,1515560u,3758096416u,1677822388u,138442752u,393216u}/* A914 */, /*13947*/{0,1064u,4718593u,76873733u,1515560u,3758096416u,1677822396u,138442752u,393216u}/* A915 */, /*13948*/{0,1064u,4718593u,76873733u,1515560u,3758096416u,1677822404u,138442752u,393216u}/* A916 */, /*13949*/{0,1064u,4718593u,76873733u,1515560u,3758096416u,1677822412u,138442752u,393216u}/* A917 */, /*13950*/{0,1064u,4718593u,76873733u,1515560u,3758096416u,1677822420u,138442752u,393216u}/* A918 */, /*13951*/{0,1064u,4718593u,76873733u,1515560u,3758096416u,1677822428u,138442752u,393216u}/* A919 */, /*13952*/{0,1064u,4718593u,76873733u,1515560u,3758096416u,1677822436u,138442752u,393216u}/* A91A */, /*13953*/{0,1064u,4718593u,76873733u,1515560u,3758096416u,1677822444u,138442752u,393216u}/* A91B */, /*13954*/{0,1064u,4718593u,76873733u,1515560u,3758096416u,1677822452u,138442752u,393216u}/* A91C */, /*13955*/{0,1064u,4718593u,76873733u,1515560u,3758096416u,1677822460u,138442752u,393216u}/* A91D */, /*13956*/{0,1064u,4718593u,76873733u,1515560u,3758096416u,1677822468u,138442752u,393216u}/* A91E */, /*13957*/{0,1064u,4718593u,76873733u,1515560u,3758096416u,1677822476u,138442752u,393216u}/* A91F */, /*13958*/{0,1064u,4718593u,76873733u,1515560u,3758096416u,1677822484u,138442752u,393216u}/* A920 */, /*13959*/{0,1064u,4718593u,76873733u,1515560u,3758096416u,1677822492u,138442752u,393216u}/* A921 */, /*13960*/{0,1064u,4718593u,76873733u,1515560u,3758096416u,1677822500u,138442752u,393216u}/* A922 */, /*13961*/{0,1064u,4718593u,76873733u,1515560u,3758096416u,1677822508u,138442752u,393216u}/* A923 */, /*13962*/{0,1064u,4718593u,76873733u,1515560u,3758096416u,1677822516u,138442752u,393216u}/* A924 */, /*13963*/{0,1064u,4718593u,76873733u,1515560u,3758096416u,1677822524u,138442752u,393216u}/* A925 */, /*13964*/{0,1064u,4718593u,68497414u,672030728u,3774873616u,1078037060u,138443264u,262144u}/* A926 */, /*13965*/{0,1064u,4718593u,68497414u,672030728u,3774873616u,1078037068u,138443264u,262144u}/* A927 */, /*13966*/{0,1064u,4718593u,68497414u,672030728u,3774873616u,1078037076u,138443264u,262144u}/* A928 */, /*13967*/{0,1064u,4718593u,68497414u,672030728u,3774873616u,1078037084u,138443264u,262144u}/* A929 */, /*13968*/{0,1064u,4718593u,68497414u,672030728u,3774873616u,1078037092u,138443264u,262144u}/* A92A */, /*13969*/{0,1064u,4718593u,3088396294u,672030728u,1627398160u,1077936140u,956332032u,262144u}/* A92B */, /*13970*/{0,1064u,4718593u,3088396294u,672030728u,1627398160u,1077936140u,960526336u,262144u}/* A92C */, /*13971*/{0,1064u,4718593u,3088396294u,672030728u,1627398160u,1077936140u,964720640u,262144u}/* A92D */, /*13972*/{0,1064u,65537u,69533719u,40u,1610620960u,8748u,138442754u,0}/* A92E */, /*13973*/{0,1064u,4718593u,69533719u,98344u,1610612768u,5332u,138442754u,41943040u}/* A92F */, /*13974*/{0,1072u,4784129u,76873733u,1515560u,3758096416u,1677822020u,138442752u,393216u}/* A930 */, /*13975*/{0,1072u,4784129u,76873733u,1515560u,3758096416u,1677822028u,138442752u,393216u}/* A931 */, /*13976*/{0,1072u,4784129u,76873733u,1515560u,3758096416u,1677822036u,138442752u,393216u}/* A932 */, /*13977*/{0,1072u,4784129u,76873733u,1515560u,3758096416u,1677822044u,138442752u,393216u}/* A933 */, /*13978*/{0,1072u,4784129u,76873733u,1515560u,3758096416u,1677822052u,138442752u,393216u}/* A934 */, /*13979*/{0,1072u,4784129u,76873733u,1515560u,3758096416u,1677822060u,138442752u,393216u}/* A935 */, /*13980*/{0,1072u,4784129u,76873733u,1515560u,3758096416u,1677822068u,138442752u,393216u}/* A936 */, /*13981*/{0,1072u,4784129u,76873733u,1515560u,3758096416u,1677822076u,138442752u,393216u}/* A937 */, /*13982*/{0,1072u,4784129u,76873733u,1515560u,3758096416u,1677822084u,138442752u,393216u}/* A938 */, /*13983*/{0,1072u,4784129u,76873733u,1515560u,3758096416u,1677822092u,138442752u,393216u}/* A939 */, /*13984*/{0,1072u,4784129u,76873733u,1515560u,3758096416u,1677822100u,138442752u,393216u}/* A93A */, /*13985*/{0,1072u,4784129u,76873733u,1515560u,3758096416u,1677822108u,138442752u,393216u}/* A93B */, /*13986*/{0,1072u,4784129u,76873733u,1515560u,3758096416u,1677822116u,138442752u,393216u}/* A93C */, /*13987*/{0,1072u,4784129u,76873733u,1515560u,3758096416u,1677822124u,138442752u,393216u}/* A93D */, /*13988*/{0,1072u,4784129u,76873733u,1515560u,3758096416u,1677822132u,138442752u,393216u}/* A93E */, /*13989*/{0,1072u,4784129u,76873733u,1515560u,3758096416u,1677822140u,138442752u,393216u}/* A93F */, /*13990*/{0,1072u,4784129u,76873733u,1515560u,3758096416u,1677822148u,138442752u,393216u}/* A940 */, /*13991*/{0,1072u,4784129u,76873733u,1515560u,3758096416u,1677822156u,138442752u,393216u}/* A941 */, /*13992*/{0,1072u,4784129u,76873733u,1515560u,3758096416u,1677822164u,138442752u,393216u}/* A942 */, /*13993*/{0,1072u,4784129u,76873733u,1515560u,3758096416u,1677822172u,138442752u,393216u}/* A943 */, /*13994*/{0,1072u,4784129u,76873733u,1515560u,3758096416u,1677822180u,138442752u,393216u}/* A944 */, /*13995*/{0,1072u,4784129u,76873733u,1515560u,3758096416u,1677822188u,138442752u,393216u}/* A945 */, /*13996*/{0,1072u,4784129u,76873733u,1515560u,3758096416u,1677822196u,138442752u,393216u}/* A946 */, /*13997*/{0,1072u,4784129u,68497414u,672030728u,3774873616u,1078036732u,138443264u,262144u}/* A947 */, /*13998*/{0,1072u,4784129u,68497414u,672030728u,3774873616u,1078036740u,138443264u,262144u}/* A948 */, /*13999*/{0,1072u,4784129u,68497414u,672030728u,3774873616u,1078036748u,138443264u,262144u}/* A949 */, /*14000*/{0,1072u,4784129u,68497414u,672030728u,3774873616u,1078036756u,138443264u,262144u}/* A94A */, /*14001*/{0,1072u,4784129u,68497414u,672030728u,3774873616u,1078036764u,138443264u,262144u}/* A94B */, /*14002*/{0,1072u,4784129u,68497414u,672030728u,3774873616u,1078036772u,138443264u,262144u}/* A94C */, /*14003*/{0,1072u,4784129u,68497414u,672030728u,3774873616u,1078036780u,138443264u,262144u}/* A94D */, /*14004*/{0,1072u,4784129u,68497414u,672030728u,3774873616u,1078036788u,138443264u,262144u}/* A94E */, /*14005*/{0,1072u,4784129u,68497414u,672030728u,3774873616u,1078036796u,138443264u,262144u}/* A94F */, /*14006*/{0,1072u,4784129u,68497414u,672030728u,3774873616u,1078036804u,138443264u,262144u}/* A950 */, /*14007*/{0,1072u,4784129u,68497414u,672030728u,3774873616u,1078036812u,138443264u,262144u}/* A951 */, /*14008*/{0,1072u,4784129u,68485128u,940466184u,3758096416u,1078036820u,138443264u,262144u}/* A952 */, /*14009*/{0,1072u,4784129u,336920584u,940466184u,1610620968u,1078036828u,138442752u,262144u}/* A953 */, /*14010*/{0,1072u,4784129u,76873751u,40u,1610612768u,5844u,138442754u,0}/* A95F */, /*14011*/{0,1083u,1638401u,93683717u,1075258376u,3758096416u,1677847396u,138442752u,393216u}/* A960 */, /*14012*/{0,1083u,1638401u,93683717u,1075258376u,3758096416u,1677847404u,138442752u,393216u}/* A961 */, /*14013*/{0,1083u,1638401u,93683717u,1075258376u,3758096416u,1677847412u,138442752u,393216u}/* A962 */, /*14014*/{0,1083u,1638401u,93683717u,1075258376u,3758096416u,1677847420u,138442752u,393216u}/* A963 */, /*14015*/{0,1083u,1638401u,93683717u,1075258376u,3758096416u,1677847428u,138442752u,393216u}/* A964 */, /*14016*/{0,1083u,1638401u,93683717u,1075258376u,3758096416u,1677847436u,138442752u,393216u}/* A965 */, /*14017*/{0,1083u,1638401u,93683717u,1075258376u,3758096416u,1677847444u,138442752u,393216u}/* A966 */, /*14018*/{0,1083u,1638401u,93683717u,1075258376u,3758096416u,1677847452u,138442752u,393216u}/* A967 */, /*14019*/{0,1083u,1638401u,93683717u,1075258376u,3758096416u,1677847460u,138442752u,393216u}/* A968 */, /*14020*/{0,1083u,1638401u,93683717u,1075258376u,3758096416u,1677847468u,138442752u,393216u}/* A969 */, /*14021*/{0,1083u,1638401u,93683717u,1075258376u,3758096416u,1677847476u,138442752u,393216u}/* A96A */, /*14022*/{0,1083u,1638401u,93683717u,1075258376u,3758096416u,1677847484u,138442752u,393216u}/* A96B */, /*14023*/{0,1083u,1638401u,93683717u,1075258376u,3758096416u,1677847492u,138442752u,393216u}/* A96C */, /*14024*/{0,1083u,1638401u,93683717u,1075258376u,3758096416u,1677847500u,138442752u,393216u}/* A96D */, /*14025*/{0,1083u,1638401u,93683717u,1075258376u,3758096416u,1677847508u,138442752u,393216u}/* A96E */, /*14026*/{0,1083u,1638401u,93683717u,1075258376u,3758096416u,1677847516u,138442752u,393216u}/* A96F */, /*14027*/{0,1083u,1638401u,93683717u,1075258376u,3758096416u,1677847524u,138442752u,393216u}/* A970 */, /*14028*/{0,1083u,1638401u,93683717u,1075258376u,3758096416u,1677847532u,138442752u,393216u}/* A971 */, /*14029*/{0,1083u,1638401u,93683717u,1075258376u,3758096416u,1677847540u,138442752u,393216u}/* A972 */, /*14030*/{0,1083u,1638401u,93683717u,1075258376u,3758096416u,1677847548u,138442752u,393216u}/* A973 */, /*14031*/{0,1083u,1638401u,93683717u,1075258376u,3758096416u,1677847556u,138442752u,393216u}/* A974 */, /*14032*/{0,1083u,1638401u,93683717u,1075258376u,3758096416u,1677847564u,138442752u,393216u}/* A975 */, /*14033*/{0,1083u,1638401u,93683717u,1075258376u,3758096416u,1677847572u,138442752u,393216u}/* A976 */, /*14034*/{0,1083u,1638401u,93683717u,1075258376u,3758096416u,1677847580u,138442752u,393216u}/* A977 */, /*14035*/{0,1083u,1638401u,93683717u,1075258376u,3758096416u,1677847588u,138442752u,393216u}/* A978 */, /*14036*/{0,1083u,1638401u,93683717u,1075258376u,3758096416u,1677847596u,138442752u,393216u}/* A979 */, /*14037*/{0,1083u,1638401u,93683717u,1075258376u,3758096416u,1677847604u,138442752u,393216u}/* A97A */, /*14038*/{0,1083u,1638401u,93683717u,1075258376u,3758096416u,1677847612u,138442752u,393216u}/* A97B */, /*14039*/{0,1083u,1638401u,93683717u,1075258376u,3758096416u,1677847620u,138442752u,393216u}/* A97C */, /*14040*/{0,1088u,5570561u,68530182u,672030728u,3774873616u,1077936140u,822114816u,262144u}/* A980 */, /*14041*/{0,1088u,5570561u,68530182u,672030728u,3774873616u,1077936140u,826309120u,262144u}/* A981 */, /*14042*/{0,1088u,5570561u,68530182u,672030728u,3774873616u,1077936140u,847280640u,262144u}/* A982 */, /*14043*/{0,1088u,5570561u,68517896u,940466184u,3758096416u,1077936140u,830503424u,262144u}/* A983 */, /*14044*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827500u,138442752u,393216u}/* A984 */, /*14045*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827508u,138442752u,393216u}/* A985 */, /*14046*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827516u,138442752u,393216u}/* A986 */, /*14047*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827524u,138442752u,393216u}/* A987 */, /*14048*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827532u,138442752u,393216u}/* A988 */, /*14049*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827540u,138442752u,393216u}/* A989 */, /*14050*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827548u,138442752u,393216u}/* A98A */, /*14051*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827556u,138442752u,393216u}/* A98B */, /*14052*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827564u,138442752u,393216u}/* A98C */, /*14053*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827572u,138442752u,393216u}/* A98D */, /*14054*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827580u,138442752u,393216u}/* A98E */, /*14055*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827588u,138442752u,393216u}/* A98F */, /*14056*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827596u,138442752u,393216u}/* A990 */, /*14057*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827604u,138442752u,393216u}/* A991 */, /*14058*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827612u,138442752u,393216u}/* A992 */, /*14059*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827620u,138442752u,393216u}/* A993 */, /*14060*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827628u,138442752u,393216u}/* A994 */, /*14061*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827636u,138442752u,393216u}/* A995 */, /*14062*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827644u,138442752u,393216u}/* A996 */, /*14063*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827652u,138442752u,393216u}/* A997 */, /*14064*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827660u,138442752u,393216u}/* A998 */, /*14065*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827668u,138442752u,393216u}/* A999 */, /*14066*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827676u,138442752u,393216u}/* A99A */, /*14067*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827684u,138442752u,393216u}/* A99B */, /*14068*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827692u,138442752u,393216u}/* A99C */, /*14069*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827700u,138442752u,393216u}/* A99D */, /*14070*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827708u,138442752u,393216u}/* A99E */, /*14071*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827716u,138442752u,393216u}/* A99F */, /*14072*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827724u,138442752u,393216u}/* A9A0 */, /*14073*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827732u,138442752u,393216u}/* A9A1 */, /*14074*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827740u,138442752u,393216u}/* A9A2 */, /*14075*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827748u,138442752u,393216u}/* A9A3 */, /*14076*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827756u,138442752u,393216u}/* A9A4 */, /*14077*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827764u,138442752u,393216u}/* A9A5 */, /*14078*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827772u,138442752u,393216u}/* A9A6 */, /*14079*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827780u,138442752u,393216u}/* A9A7 */, /*14080*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827788u,138442752u,393216u}/* A9A8 */, /*14081*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827796u,138442752u,393216u}/* A9A9 */, /*14082*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827804u,138442752u,393216u}/* A9AA */, /*14083*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827820u,138442752u,393216u}/* A9AB */, /*14084*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827820u,138459136u,393216u}/* A9AC */, /*14085*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827836u,138442752u,393216u}/* A9AD */, /*14086*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827844u,138442752u,393216u}/* A9AE */, /*14087*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827852u,138442752u,393216u}/* A9AF */, /*14088*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827860u,138442752u,393216u}/* A9B0 */, /*14089*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827868u,138442752u,393216u}/* A9B1 */, /*14090*/{0,1088u,5570561u,76906501u,1515560u,3758096416u,1677827876u,138442752u,393216u}/* A9B2 */, /*14091*/{0,1088u,5570561u,202747910u,672030728u,1627398160u,1077936140u,817920000u,262144u}/* A9B3 */, /*14092*/{0,1088u,5570561u,68517896u,940466184u,3758096416u,1078042412u,138443264u,262144u}/* A9B4 */, /*14093*/{0,1088u,5570561u,68517896u,940466184u,3758096416u,1078042484u,138443264u,262144u}/* A9B5 */, /*14094*/{0,1088u,5570561u,68530182u,672030728u,3774873616u,1078042428u,138443264u,262144u}/* A9B6 */, /*14095*/{0,1088u,5570561u,68530182u,672030728u,3774873616u,1078042436u,138443264u,262144u}/* A9B7 */, /*14096*/{0,1088u,5570561u,68530182u,672030728u,3774873616u,1078042444u,138443264u,262144u}/* A9B8 */, /*14097*/{0,1088u,5570561u,68530182u,672030728u,3774873616u,1078042452u,138443264u,262144u}/* A9B9 */, /*14098*/{0,1088u,5570561u,68517896u,940466184u,3758096416u,1078042468u,138443264u,262144u}/* A9BA */, /*14099*/{0,1088u,5570561u,68517896u,940466184u,3758096416u,1078042476u,138443264u,262144u}/* A9BB */, /*14100*/{0,1088u,5570561u,68530182u,672030728u,3774873616u,1078042420u,138443264u,262144u}/* A9BC */, /*14101*/{0,1088u,5570561u,68517896u,940466184u,3758096416u,1078042460u,138443264u,262144u}/* A9BD */, /*14102*/{0,1088u,5570561u,68517896u,940466184u,3758096416u,1078042340u,138443264u,262144u}/* A9BE */, /*14103*/{0,1088u,5570561u,68517896u,940466184u,3758096416u,1078042356u,138443264u,262144u}/* A9BF */, /*14104*/{0,1088u,5570561u,336953352u,940466184u,1610620968u,1078042492u,138442752u,262144u}/* A9C0 */, /*14105*/{0,1088u,5570561u,76906519u,40u,1610612768u,5756u,138442754u,0}/* A9C1 */, /*14106*/{0,1088u,5570561u,76906519u,40u,1610612768u,5764u,138442754u,0}/* A9C2 */, /*14107*/{0,1088u,5570561u,76906519u,40u,1610612768u,5772u,138442754u,0}/* A9C3 */, /*14108*/{0,1088u,5570561u,76906519u,40u,1610612768u,5780u,138442754u,0}/* A9C4 */, /*14109*/{0,1088u,5570561u,76906519u,40u,1610612768u,5788u,138442754u,0}/* A9C5 */, /*14110*/{0,1088u,5570561u,76906519u,40u,1610612768u,5796u,138442754u,0}/* A9C6 */, /*14111*/{0,1088u,5570561u,69566487u,40u,1610612768u,4844u,138442754u,8388608u}/* A9C7 */, /*14112*/{0,1088u,5570561u,69566487u,98344u,1610612768u,5420u,138442754u,41943040u}/* A9C8 */, /*14113*/{0,1088u,5570561u,69566487u,98344u,1610612768u,5428u,138442754u,41943040u}/* A9C9 */, /*14114*/{0,1088u,5570561u,76906519u,40u,1610612768u,5804u,138442754u,0}/* A9CA */, /*14115*/{0,1088u,5570561u,76906519u,40u,1610612768u,5812u,138442754u,0}/* A9CB */, /*14116*/{0,1088u,5570561u,76906519u,40u,1610612768u,5820u,138442754u,0}/* A9CC */, /*14117*/{0,1088u,5570561u,76906519u,40u,1610612768u,5828u,138442754u,0}/* A9CD */, /*14118*/{0,1088u,65537u,76906500u,1515560u,3774873760u,1677779748u,138442752u,393216u}/* A9CF */, /*14119*/{0,1088u,39126017u,85295113u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* A9D0 */, /*14120*/{0,1088u,542443009u,85295113u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* A9D1 */, /*14121*/{0,1088u,575998465u,85295113u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* A9D2 */, /*14122*/{0,1088u,609552385u,85295113u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* A9D3 */, /*14123*/{0,1088u,643108865u,85295113u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* A9D4 */, /*14124*/{0,1088u,676662273u,85295113u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* A9D5 */, /*14125*/{0,1088u,710219265u,85295113u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* A9D6 */, /*14126*/{0,1088u,743771649u,85295113u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* A9D7 */, /*14127*/{0,1088u,777329665u,85295113u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* A9D8 */, /*14128*/{0,1088u,810882049u,85295113u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* A9D9 */, /*14129*/{0,1088u,5570561u,76906519u,40u,1610612768u,8756u,138442754u,0}/* A9DE */, /*14130*/{0,1088u,5570561u,76906519u,40u,1610612768u,8764u,138442754u,0}/* A9DF */, /*14131*/{0,1096u,1507329u,92798981u,73768u,3758096416u,1677822644u,138442752u,393216u}/* A9E0 */, /*14132*/{0,1096u,1507329u,92798981u,73768u,3758096416u,1677822708u,138442752u,393216u}/* A9E1 */, /*14133*/{0,1096u,1507329u,92798981u,73768u,3758096416u,1677822788u,138442752u,393216u}/* A9E2 */, /*14134*/{0,1096u,1507329u,92798981u,73768u,3758096416u,1677822964u,138442752u,393216u}/* A9E3 */, /*14135*/{0,1096u,1507329u,92798981u,73768u,3758096416u,1677823164u,138442752u,393216u}/* A9E4 */, /*14136*/{0,1096u,1507329u,92811270u,672030728u,1627398160u,1078038284u,138442752u,262144u}/* A9E5 */, /*14137*/{0,1096u,1507329u,92798980u,73768u,3774873760u,1677779756u,138442752u,393216u}/* A9E6 */, /*14138*/{0,1096u,1507329u,92798981u,73768u,3758096416u,1677822852u,138442752u,393216u}/* A9E7 */, /*14139*/{0,1096u,1507329u,92798981u,73768u,3758096416u,1677823124u,138442752u,393216u}/* A9E8 */, /*14140*/{0,1096u,1507329u,92798981u,73768u,3758096416u,1677822628u,138442752u,393216u}/* A9E9 */, /*14141*/{0,1096u,1507329u,92798981u,73768u,3758096416u,1677822652u,138442752u,393216u}/* A9EA */, /*14142*/{0,1096u,1507329u,92798981u,73768u,3758096416u,1677822748u,138442752u,393216u}/* A9EB */, /*14143*/{0,1096u,1507329u,92798981u,73768u,3758096416u,1677822804u,138442752u,393216u}/* A9EC */, /*14144*/{0,1096u,1507329u,92798981u,73768u,3758096416u,1677822916u,138442752u,393216u}/* A9ED */, /*14145*/{0,1096u,1507329u,92798981u,73768u,3758096416u,1677822940u,138442752u,393216u}/* A9EE */, /*14146*/{0,1096u,1507329u,92798981u,73768u,3758096416u,1677822972u,138442752u,393216u}/* A9EF */, /*14147*/{0,1096u,35062785u,85458953u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* A9F0 */, /*14148*/{0,1096u,538379777u,85458953u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* A9F1 */, /*14149*/{0,1096u,571935233u,85458953u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* A9F2 */, /*14150*/{0,1096u,605489153u,85458953u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* A9F3 */, /*14151*/{0,1096u,639045633u,85458953u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* A9F4 */, /*14152*/{0,1096u,672599041u,85458953u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* A9F5 */, /*14153*/{0,1096u,706156033u,85458953u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* A9F6 */, /*14154*/{0,1096u,739708417u,85458953u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* A9F7 */, /*14155*/{0,1096u,773266433u,85458953u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* A9F8 */, /*14156*/{0,1096u,806818817u,85458953u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* A9F9 */, /*14157*/{0,1096u,1507329u,92798981u,73768u,3758096416u,1677823388u,138442752u,393216u}/* A9FA */, /*14158*/{0,1096u,1507329u,92798981u,73768u,3758096416u,1677823012u,138442752u,393216u}/* A9FB */, /*14159*/{0,1096u,1507329u,92798981u,73768u,3758096416u,1677823036u,138442752u,393216u}/* A9FC */, /*14160*/{0,1096u,1507329u,92798981u,73768u,3758096416u,1677823148u,138442752u,393216u}/* A9FD */, /*14161*/{0,1096u,1507329u,92798981u,73768u,3758096416u,1677823172u,138442752u,393216u}/* A9FE */, /*14162*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826388u,138442752u,393216u}/* AA00 */, /*14163*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826396u,138442752u,393216u}/* AA01 */, /*14164*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826404u,138442752u,393216u}/* AA02 */, /*14165*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826412u,138442752u,393216u}/* AA03 */, /*14166*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826420u,138442752u,393216u}/* AA04 */, /*14167*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826428u,138442752u,393216u}/* AA05 */, /*14168*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826436u,138442752u,393216u}/* AA06 */, /*14169*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826444u,138442752u,393216u}/* AA07 */, /*14170*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826452u,138442752u,393216u}/* AA08 */, /*14171*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826460u,138442752u,393216u}/* AA09 */, /*14172*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826468u,138442752u,393216u}/* AA0A */, /*14173*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826476u,138442752u,393216u}/* AA0B */, /*14174*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826484u,138442752u,393216u}/* AA0C */, /*14175*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826492u,138442752u,393216u}/* AA0D */, /*14176*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826500u,138442752u,393216u}/* AA0E */, /*14177*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826508u,138442752u,393216u}/* AA0F */, /*14178*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826516u,138442752u,393216u}/* AA10 */, /*14179*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826524u,138442752u,393216u}/* AA11 */, /*14180*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826532u,138442752u,393216u}/* AA12 */, /*14181*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826540u,138442752u,393216u}/* AA13 */, /*14182*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826548u,138442752u,393216u}/* AA14 */, /*14183*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826556u,138442752u,393216u}/* AA15 */, /*14184*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826564u,138442752u,393216u}/* AA16 */, /*14185*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826572u,138442752u,393216u}/* AA17 */, /*14186*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826580u,138442752u,393216u}/* AA18 */, /*14187*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826588u,138442752u,393216u}/* AA19 */, /*14188*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826596u,138442752u,393216u}/* AA1A */, /*14189*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826604u,138442752u,393216u}/* AA1B */, /*14190*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826612u,138442752u,393216u}/* AA1C */, /*14191*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826620u,138442752u,393216u}/* AA1D */, /*14192*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826628u,138442752u,393216u}/* AA1E */, /*14193*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826636u,138442752u,393216u}/* AA1F */, /*14194*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826644u,138442752u,393216u}/* AA20 */, /*14195*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826652u,138442752u,393216u}/* AA21 */, /*14196*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826660u,138442752u,393216u}/* AA22 */, /*14197*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826668u,138442752u,393216u}/* AA23 */, /*14198*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826676u,138442752u,393216u}/* AA24 */, /*14199*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826684u,138442752u,393216u}/* AA25 */, /*14200*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826692u,138442752u,393216u}/* AA26 */, /*14201*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826700u,138442752u,393216u}/* AA27 */, /*14202*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826708u,138442752u,393216u}/* AA28 */, /*14203*/{0,1104u,5046273u,68497414u,672030728u,3774873616u,1078041276u,138443264u,262144u}/* AA29 */, /*14204*/{0,1104u,5046273u,68497414u,672030728u,3774873616u,1078041284u,138443264u,262144u}/* AA2A */, /*14205*/{0,1104u,5046273u,68497414u,672030728u,3774873616u,1078041292u,138443264u,262144u}/* AA2B */, /*14206*/{0,1104u,5046273u,68497414u,672030728u,3774873616u,1078041300u,138443264u,262144u}/* AA2C */, /*14207*/{0,1104u,5046273u,68497414u,672030728u,3774873616u,1078041308u,138443264u,262144u}/* AA2D */, /*14208*/{0,1104u,5046273u,68497414u,672030728u,3774873616u,1078041316u,138443264u,262144u}/* AA2E */, /*14209*/{0,1104u,5046273u,68485128u,940466184u,3758096416u,1078041324u,138443264u,262144u}/* AA2F */, /*14210*/{0,1104u,5046273u,68485128u,940466184u,3758096416u,1078041332u,138443264u,262144u}/* AA30 */, /*14211*/{0,1104u,5046273u,68497414u,672030728u,3774873616u,1078041340u,138443264u,262144u}/* AA31 */, /*14212*/{0,1104u,5046273u,68497414u,672030728u,3774873616u,1078041348u,138443264u,262144u}/* AA32 */, /*14213*/{0,1104u,5046273u,68485128u,940466184u,3758096416u,1078041244u,138443264u,262144u}/* AA33 */, /*14214*/{0,1104u,5046273u,68485128u,940466184u,3758096416u,1078041252u,138443264u,262144u}/* AA34 */, /*14215*/{0,1104u,5046273u,68497414u,672030728u,3774873616u,1078041260u,138443264u,262144u}/* AA35 */, /*14216*/{0,1104u,5046273u,68497414u,672030728u,3774873616u,1078041268u,138443264u,262144u}/* AA36 */, /*14217*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826828u,138442752u,393216u}/* AA40 */, /*14218*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826836u,138442752u,393216u}/* AA41 */, /*14219*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826844u,138442752u,393216u}/* AA42 */, /*14220*/{0,1104u,5046273u,68497414u,672030728u,3774873616u,1078041380u,138443264u,262144u}/* AA43 */, /*14221*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826860u,138442752u,393216u}/* AA44 */, /*14222*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826868u,138442752u,393216u}/* AA45 */, /*14223*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826876u,138442752u,393216u}/* AA46 */, /*14224*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826884u,138442752u,393216u}/* AA47 */, /*14225*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826892u,138442752u,393216u}/* AA48 */, /*14226*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826900u,138442752u,393216u}/* AA49 */, /*14227*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826908u,138442752u,393216u}/* AA4A */, /*14228*/{0,1104u,5046273u,76873733u,1515560u,3758096416u,1677826916u,138442752u,393216u}/* AA4B */, /*14229*/{0,1104u,5046273u,68497414u,672030728u,3774873616u,1078041452u,138443264u,262144u}/* AA4C */, /*14230*/{0,1104u,5046273u,68485128u,940466184u,3758096416u,1078041460u,138443264u,262144u}/* AA4D */, /*14231*/{0,1104u,38601729u,85262345u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* AA50 */, /*14232*/{0,1104u,541918721u,85262345u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* AA51 */, /*14233*/{0,1104u,575474177u,85262345u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* AA52 */, /*14234*/{0,1104u,609028097u,85262345u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* AA53 */, /*14235*/{0,1104u,642584577u,85262345u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* AA54 */, /*14236*/{0,1104u,676137985u,85262345u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* AA55 */, /*14237*/{0,1104u,709694977u,85262345u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* AA56 */, /*14238*/{0,1104u,743247361u,85262345u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* AA57 */, /*14239*/{0,1104u,776805377u,85262345u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* AA58 */, /*14240*/{0,1104u,810357761u,85262345u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* AA59 */, /*14241*/{0,1104u,5046273u,76873751u,40u,1610612768u,8772u,138442754u,0}/* AA5C */, /*14242*/{0,1104u,5046273u,69533719u,98344u,1610612768u,5436u,138442754u,41943040u}/* AA5D */, /*14243*/{0,1104u,5046273u,69533719u,98344u,1610612768u,5444u,138442754u,41943040u}/* AA5E */, /*14244*/{0,1104u,5046273u,69533719u,98344u,1610612768u,5452u,138442754u,41943040u}/* AA5F */, /*14245*/{0,1112u,1507329u,92635141u,73768u,3758096416u,1677822620u,138442752u,393216u}/* AA60 */, /*14246*/{0,1112u,1507329u,92635141u,73768u,3758096416u,1677822692u,138442752u,393216u}/* AA61 */, /*14247*/{0,1112u,1507329u,92635141u,73768u,3758096416u,1677822716u,138442752u,393216u}/* AA62 */, /*14248*/{0,1112u,1507329u,92635141u,73768u,3758096416u,1677822740u,138442752u,393216u}/* AA63 */, /*14249*/{0,1112u,1507329u,92635141u,73768u,3758096416u,1677822796u,138442752u,393216u}/* AA64 */, /*14250*/{0,1112u,1507329u,92635141u,73768u,3758096416u,1677822844u,138442752u,393216u}/* AA65 */, /*14251*/{0,1112u,1507329u,92635141u,73768u,3758096416u,1677822876u,138442752u,393216u}/* AA66 */, /*14252*/{0,1112u,1507329u,92635141u,73768u,3758096416u,1677822892u,138442752u,393216u}/* AA67 */, /*14253*/{0,1112u,1507329u,92635141u,73768u,3758096416u,1677822908u,138442752u,393216u}/* AA68 */, /*14254*/{0,1112u,1507329u,92635141u,73768u,3758096416u,1677822932u,138442752u,393216u}/* AA69 */, /*14255*/{0,1112u,1507329u,92635141u,73768u,3758096416u,1677823028u,138442752u,393216u}/* AA6A */, /*14256*/{0,1112u,1507329u,92635141u,73768u,3758096416u,1677823060u,138442752u,393216u}/* AA6B */, /*14257*/{0,1112u,1507329u,92635141u,73768u,3758096416u,1677823324u,138442752u,393216u}/* AA6C */, /*14258*/{0,1112u,1507329u,92635141u,73768u,3758096416u,1677823348u,138442752u,393216u}/* AA6D */, /*14259*/{0,1112u,1507329u,92635141u,73768u,3758096416u,1677823364u,138442752u,393216u}/* AA6E */, /*14260*/{0,1112u,1507329u,92635141u,73768u,3758096416u,1677823108u,138442752u,393216u}/* AA6F */, /*14261*/{0,1112u,1507329u,92635140u,73768u,3774873760u,1677779764u,138442752u,393216u}/* AA70 */, /*14262*/{0,1112u,1507329u,92635141u,73768u,3758096416u,1677823372u,138442752u,393216u}/* AA71 */, /*14263*/{0,1112u,1507329u,92635141u,73768u,3758096416u,1677822764u,138442752u,393216u}/* AA72 */, /*14264*/{0,1112u,1507329u,92635141u,73768u,3758096416u,1677823220u,138442752u,393216u}/* AA73 */, /*14265*/{0,1112u,1507329u,92635141u,73768u,3758096416u,1677823948u,138442752u,393216u}/* AA74 */, /*14266*/{0,1112u,1507329u,92635141u,73768u,3758096416u,1677823956u,138442752u,393216u}/* AA75 */, /*14267*/{0,1112u,1507329u,92635141u,73768u,3758096416u,1677823964u,138442752u,393216u}/* AA76 */, /*14268*/{0,1112u,1507329u,92635163u,40u,1610612768u,11044u,138442752u,67108864u}/* AA77 */, /*14269*/{0,1112u,1507329u,92635163u,40u,1610612768u,11052u,138442752u,67108864u}/* AA78 */, /*14270*/{0,1112u,1507329u,92635163u,40u,1610612768u,11060u,138442752u,67108864u}/* AA79 */, /*14271*/{0,1112u,1507329u,92635141u,73768u,3758096416u,1677823228u,138442752u,393216u}/* AA7A */, /*14272*/{0,1112u,1507329u,92635144u,942088u,1610620960u,1078038452u,138442752u,262144u}/* AA7B */, /*14273*/{0,1112u,1507329u,92811270u,672030728u,1627398160u,1078038460u,138442752u,262144u}/* AA7C */, /*14274*/{0,1112u,1507329u,92798984u,942088u,1610620960u,1078038468u,138442752u,262144u}/* AA7D */, /*14275*/{0,1112u,1507329u,92798981u,73768u,3758096416u,1677822724u,138442752u,393216u}/* AA7E */, /*14276*/{0,1112u,1507329u,92798981u,73768u,3758096416u,1677822820u,138442752u,393216u}/* AA7F */, /*14277*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677816972u,138442752u,393216u}/* AA80 */, /*14278*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677816980u,138442752u,393216u}/* AA81 */, /*14279*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677816988u,138442752u,393216u}/* AA82 */, /*14280*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677816996u,138442752u,393216u}/* AA83 */, /*14281*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817004u,138442752u,393216u}/* AA84 */, /*14282*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817012u,138442752u,393216u}/* AA85 */, /*14283*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817020u,138442752u,393216u}/* AA86 */, /*14284*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817028u,138442752u,393216u}/* AA87 */, /*14285*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817036u,138442752u,393216u}/* AA88 */, /*14286*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817044u,138442752u,393216u}/* AA89 */, /*14287*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817052u,138442752u,393216u}/* AA8A */, /*14288*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817060u,138442752u,393216u}/* AA8B */, /*14289*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817068u,138442752u,393216u}/* AA8C */, /*14290*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817076u,138442752u,393216u}/* AA8D */, /*14291*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817084u,138442752u,393216u}/* AA8E */, /*14292*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817092u,138442752u,393216u}/* AA8F */, /*14293*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817100u,138442752u,393216u}/* AA90 */, /*14294*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817108u,138442752u,393216u}/* AA91 */, /*14295*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817116u,138442752u,393216u}/* AA92 */, /*14296*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817124u,138442752u,393216u}/* AA93 */, /*14297*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817132u,138442752u,393216u}/* AA94 */, /*14298*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817140u,138442752u,393216u}/* AA95 */, /*14299*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817148u,138442752u,393216u}/* AA96 */, /*14300*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817156u,138442752u,393216u}/* AA97 */, /*14301*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817164u,138442752u,393216u}/* AA98 */, /*14302*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817172u,138442752u,393216u}/* AA99 */, /*14303*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817180u,138442752u,393216u}/* AA9A */, /*14304*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817188u,138442752u,393216u}/* AA9B */, /*14305*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817196u,138442752u,393216u}/* AA9C */, /*14306*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817204u,138442752u,393216u}/* AA9D */, /*14307*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817212u,138442752u,393216u}/* AA9E */, /*14308*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817220u,138442752u,393216u}/* AA9F */, /*14309*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817228u,138442752u,393216u}/* AAA0 */, /*14310*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817236u,138442752u,393216u}/* AAA1 */, /*14311*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817244u,138442752u,393216u}/* AAA2 */, /*14312*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817252u,138442752u,393216u}/* AAA3 */, /*14313*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817260u,138442752u,393216u}/* AAA4 */, /*14314*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817268u,138442752u,393216u}/* AAA5 */, /*14315*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817276u,138442752u,393216u}/* AAA6 */, /*14316*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817284u,138442752u,393216u}/* AAA7 */, /*14317*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817292u,138442752u,393216u}/* AAA8 */, /*14318*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817300u,138442752u,393216u}/* AAA9 */, /*14319*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817308u,138442752u,393216u}/* AAAA */, /*14320*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817316u,138442752u,393216u}/* AAAB */, /*14321*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817324u,138442752u,393216u}/* AAAC */, /*14322*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817332u,138442752u,393216u}/* AAAD */, /*14323*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817340u,138442752u,393216u}/* AAAE */, /*14324*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817348u,138442752u,393216u}/* AAAF */, /*14325*/{0,1120u,5177345u,3448090630u,672030728u,3774873616u,1078031884u,138443264u,262144u}/* AAB0 */, /*14326*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817364u,138442752u,393216u}/* AAB1 */, /*14327*/{0,1120u,5177345u,3448090630u,672030728u,3774873616u,1078031900u,138443264u,262144u}/* AAB2 */, /*14328*/{0,1120u,5177345u,3448090630u,672030728u,3774873616u,1078031908u,138443264u,262144u}/* AAB3 */, /*14329*/{0,1120u,5177345u,3112546310u,672030728u,3774873616u,1078031916u,138443264u,262144u}/* AAB4 */, /*14330*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1694594608u,138442752u,393216u}/* AAB5 */, /*14331*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1694594616u,138442752u,393216u}/* AAB6 */, /*14332*/{0,1120u,5177345u,3448090630u,672030728u,3774873616u,1078031940u,138443264u,262144u}/* AAB7 */, /*14333*/{0,1120u,5177345u,3448090630u,672030728u,3774873616u,1078031948u,138443264u,262144u}/* AAB8 */, /*14334*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1694594640u,138442752u,393216u}/* AAB9 */, /*14335*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817436u,138442752u,393216u}/* AABA */, /*14336*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1694594656u,138442752u,393216u}/* AABB */, /*14337*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1694594664u,138442752u,393216u}/* AABC */, /*14338*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817460u,138442752u,393216u}/* AABD */, /*14339*/{0,1120u,5177345u,3448090630u,672030728u,3774873616u,1078031996u,138443264u,262144u}/* AABE */, /*14340*/{0,1120u,5177345u,3448090630u,672030728u,1627398160u,1077936140u,943749120u,262144u}/* AABF */, /*14341*/{0,1120u,5177345u,92635141u,73768u,3758104608u,1677817476u,138442752u,393216u}/* AAC0 */, /*14342*/{0,1120u,5177345u,3448090630u,672030728u,1627398160u,1077936140u,947943424u,262144u}/* AAC1 */, /*14343*/{0,1120u,5177345u,92635141u,73768u,3758104608u,1677817484u,138442752u,393216u}/* AAC2 */, /*14344*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817492u,138442752u,393216u}/* AADB */, /*14345*/{0,1120u,5177345u,92635141u,73768u,3758096416u,1677817500u,138442752u,393216u}/* AADC */, /*14346*/{0,1120u,5177345u,92635140u,73768u,3774873760u,1677779772u,138442752u,393216u}/* AADD */, /*14347*/{0,1120u,5177345u,92635159u,40u,1610612768u,8132u,138442754u,0}/* AADE */, /*14348*/{0,1120u,5177345u,92635159u,40u,1610612768u,8140u,138442754u,8388608u}/* AADF */, /*14349*/{0,1128u,5636097u,76972037u,1515560u,3758096416u,1677806948u,138442752u,393216u}/* AAE0 */, /*14350*/{0,1128u,5636097u,76972037u,1515560u,3758096416u,1677806956u,138442752u,393216u}/* AAE1 */, /*14351*/{0,1128u,5636097u,76972037u,1515560u,3758096416u,1677806964u,138442752u,393216u}/* AAE2 */, /*14352*/{0,1128u,5636097u,76972037u,1515560u,3758096416u,1677806972u,138442752u,393216u}/* AAE3 */, /*14353*/{0,1128u,5636097u,76972037u,1515560u,3758096416u,1677806980u,138442752u,393216u}/* AAE4 */, /*14354*/{0,1128u,5636097u,76972037u,1515560u,3758096416u,1677806988u,138442752u,393216u}/* AAE5 */, /*14355*/{0,1128u,5636097u,76972037u,1515560u,3758096416u,1677806996u,138442752u,393216u}/* AAE6 */, /*14356*/{0,1128u,5636097u,76972037u,1515560u,3758096416u,1677807004u,138442752u,393216u}/* AAE7 */, /*14357*/{0,1128u,5636097u,76972037u,1515560u,3758096416u,1677807012u,138442752u,393216u}/* AAE8 */, /*14358*/{0,1128u,5636097u,76972037u,1515560u,3758096416u,1677807020u,138442752u,393216u}/* AAE9 */, /*14359*/{0,1128u,5636097u,76972037u,1515560u,3758096416u,1677807028u,138442752u,393216u}/* AAEA */, /*14360*/{0,1128u,5636097u,68583432u,940466184u,3758096416u,1078021628u,138443264u,262144u}/* AAEB */, /*14361*/{0,1128u,5636097u,68595718u,672030728u,3774873616u,1078021636u,138443264u,262144u}/* AAEC */, /*14362*/{0,1128u,5636097u,68595718u,672030728u,3774873616u,1078021644u,138443264u,262144u}/* AAED */, /*14363*/{0,1128u,5636097u,68583432u,940466184u,3758096416u,1078021652u,138443264u,262144u}/* AAEE */, /*14364*/{0,1128u,5636097u,68583432u,940466184u,3758096416u,1078021660u,138443264u,262144u}/* AAEF */, /*14365*/{0,1128u,5636097u,69632023u,98344u,1610612768u,5460u,138442754u,41943040u}/* AAF0 */, /*14366*/{0,1128u,5636097u,69632023u,98344u,1610612768u,5028u,138442754u,41943040u}/* AAF1 */, /*14367*/{0,1128u,5636097u,76972037u,1515560u,3758096416u,1677806724u,138442752u,393216u}/* AAF2 */, /*14368*/{0,1128u,5636097u,76972036u,1515560u,3774873760u,1677779780u,138442752u,393216u}/* AAF3 */, /*14369*/{0,1128u,5636097u,76972036u,1515560u,3774873760u,1677779788u,138442752u,393216u}/* AAF4 */, /*14370*/{0,1128u,5636097u,68583432u,940466184u,3758096416u,1078021668u,138443264u,262144u}/* AAF5 */, /*14371*/{0,1128u,5636097u,337031174u,672030728u,1627398168u,1078021748u,138442752u,262144u}/* AAF6 */, /*14372*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677797956u,138442752u,393216u}/* AB01 */, /*14373*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677797964u,138442752u,393216u}/* AB02 */, /*14374*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677797972u,138442752u,393216u}/* AB03 */, /*14375*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677797980u,138442752u,393216u}/* AB04 */, /*14376*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677797988u,138442752u,393216u}/* AB05 */, /*14377*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677797996u,138442752u,393216u}/* AB06 */, /*14378*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677799548u,138442752u,393216u}/* AB09 */, /*14379*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677799556u,138442752u,393216u}/* AB0A */, /*14380*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677799564u,138442752u,393216u}/* AB0B */, /*14381*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677799572u,138442752u,393216u}/* AB0C */, /*14382*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677799580u,138442752u,393216u}/* AB0D */, /*14383*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677799588u,138442752u,393216u}/* AB0E */, /*14384*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677799300u,138442752u,393216u}/* AB11 */, /*14385*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677799308u,138442752u,393216u}/* AB12 */, /*14386*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677799316u,138442752u,393216u}/* AB13 */, /*14387*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677799324u,138442752u,393216u}/* AB14 */, /*14388*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677799332u,138442752u,393216u}/* AB15 */, /*14389*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677799340u,138442752u,393216u}/* AB16 */, /*14390*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677800084u,138442752u,393216u}/* AB20 */, /*14391*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677800092u,138442752u,393216u}/* AB21 */, /*14392*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677800100u,138442752u,393216u}/* AB22 */, /*14393*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677800108u,138442752u,393216u}/* AB23 */, /*14394*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677800116u,138442752u,393216u}/* AB24 */, /*14395*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677800124u,138442752u,393216u}/* AB25 */, /*14396*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677800132u,138442752u,393216u}/* AB26 */, /*14397*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677800276u,138442752u,393216u}/* AB28 */, /*14398*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677800284u,138442752u,393216u}/* AB29 */, /*14399*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677800292u,138442752u,393216u}/* AB2A */, /*14400*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677800300u,138442752u,393216u}/* AB2B */, /*14401*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677800308u,138442752u,393216u}/* AB2C */, /*14402*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677800316u,138442752u,393216u}/* AB2D */, /*14403*/{0,1136u,1703937u,76939269u,1515560u,3758096416u,1677800324u,138442752u,393216u}/* AB2E */, /*14404*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719723524u,138442752u,393216u}/* AB30 */, /*14405*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719723452u,138442752u,393216u}/* AB31 */, /*14406*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719724212u,138442752u,393216u}/* AB32 */, /*14407*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719724220u,138442752u,393216u}/* AB33 */, /*14408*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719724268u,138442752u,393216u}/* AB34 */, /*14409*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719724684u,138442752u,393216u}/* AB35 */, /*14410*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719724828u,138442752u,393216u}/* AB36 */, /*14411*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719726020u,138442752u,393216u}/* AB37 */, /*14412*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719725972u,138442752u,393216u}/* AB38 */, /*14413*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719725980u,138442752u,393216u}/* AB39 */, /*14414*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719726308u,138442752u,393216u}/* AB3A */, /*14415*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719726572u,138442752u,393216u}/* AB3B */, /*14416*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719726620u,138442752u,393216u}/* AB3C */, /*14417*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719726676u,138442752u,393216u}/* AB3D */, /*14418*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719726772u,138442752u,393216u}/* AB3E */, /*14419*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719726828u,138442752u,393216u}/* AB3F */, /*14420*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719726740u,138442752u,393216u}/* AB40 */, /*14421*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719726724u,138442752u,393216u}/* AB41 */, /*14422*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719726732u,138442752u,393216u}/* AB42 */, /*14423*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719726748u,138442752u,393216u}/* AB43 */, /*14424*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719726756u,138442752u,393216u}/* AB44 */, /*14425*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719727348u,138442752u,393216u}/* AB45 */, /*14426*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719727388u,138442752u,393216u}/* AB46 */, /*14427*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719727716u,138442752u,393216u}/* AB47 */, /*14428*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719727724u,138442752u,393216u}/* AB48 */, /*14429*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719727636u,138442752u,393216u}/* AB49 */, /*14430*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719727732u,138442752u,393216u}/* AB4A */, /*14431*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719727740u,138442752u,393216u}/* AB4B */, /*14432*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719727748u,138442752u,393216u}/* AB4C */, /*14433*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719727980u,138442752u,393216u}/* AB4D */, /*14434*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719728396u,138442752u,393216u}/* AB4E */, /*14435*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719728476u,138442752u,393216u}/* AB4F */, /*14436*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719728428u,138442752u,393216u}/* AB50 */, /*14437*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719728436u,138442752u,393216u}/* AB51 */, /*14438*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719728500u,138442752u,393216u}/* AB52 */, /*14439*/{269184u,1144u,131073u,77070338u,1499176u,3768975392u,1719729020u,138442752u,393216u}/* AB53 */, /*14440*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719729028u,138442752u,393216u}/* AB54 */, /*14441*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719729036u,138442752u,393216u}/* AB55 */, /*14442*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719728988u,138442752u,393216u}/* AB56 */, /*14443*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719728996u,138442752u,393216u}/* AB57 */, /*14444*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719729004u,138442752u,393216u}/* AB58 */, /*14445*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719729012u,138442752u,393216u}/* AB59 */, /*14446*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719729180u,138442752u,393216u}/* AB5A */, /*14447*/{0,1144u,65537u,77070362u,1441832u,1627398176u,10340u,138442752u,67108864u}/* AB5B */, /*14448*/{1227358208u,1144u,131073u,77070660u,1499168u,3783794720u,1686170772u,138588176u,393216u}/* AB5C */, /*14449*/{1227882496u,1144u,131073u,77070660u,1499168u,3783794720u,1686171588u,138588176u,393216u}/* AB5D */, /*14450*/{1228406784u,1144u,131073u,77070660u,1499168u,3783794720u,1686171508u,138588176u,393216u}/* AB5E */, /*14451*/{1228931072u,1144u,131073u,77070660u,1499168u,3783794720u,1686174068u,138588176u,393216u}/* AB5F */, /*14452*/{0,1144u,131073u,77103106u,1499176u,3766485024u,1719729684u,138442752u,393216u}/* AB60 */, /*14453*/{0,1144u,131073u,77103106u,1499176u,3766485024u,1719729692u,138442752u,393216u}/* AB61 */, /*14454*/{0,1144u,131073u,77103106u,1499176u,3766485024u,1719726844u,138442752u,393216u}/* AB62 */, /*14455*/{0,1144u,131073u,77103106u,1499176u,3766485024u,1719729700u,138442752u,393216u}/* AB63 */, /*14456*/{0,1144u,131073u,77070338u,1499176u,3766485024u,1719723572u,138442752u,393216u}/* AB64 */, /*14457*/{0,1144u,196609u,77070338u,1499176u,3766485024u,1719730764u,138442752u,393216u}/* AB65 */, /*14458*/{269312u,2095056000u,1769473u,77103106u,1499176u,3807248416u,1719772348u,138442752u,393216u}/* AB70 */, /*14459*/{269440u,2097153152u,1769473u,77103106u,1499176u,3807248416u,1719772356u,138442752u,393216u}/* AB71 */, /*14460*/{269568u,2099250304u,1769473u,77103106u,1499176u,3807248416u,1719772364u,138442752u,393216u}/* AB72 */, /*14461*/{269696u,2101347456u,1769473u,77103106u,1499176u,3807248416u,1719772372u,138442752u,393216u}/* AB73 */, /*14462*/{269824u,2103444608u,1769473u,77103106u,1499176u,3807248416u,1719772380u,138442752u,393216u}/* AB74 */, /*14463*/{269952u,2105541760u,1769473u,77103106u,1499176u,3807248416u,1719772388u,138442752u,393216u}/* AB75 */, /*14464*/{270080u,2107638912u,1769473u,77103106u,1499176u,3807248416u,1719772396u,138442752u,393216u}/* AB76 */, /*14465*/{270208u,2109736064u,1769473u,77103106u,1499176u,3807248416u,1719772404u,138442752u,393216u}/* AB77 */, /*14466*/{270336u,2111833216u,1769473u,77103106u,1499176u,3807248416u,1719772412u,138442752u,393216u}/* AB78 */, /*14467*/{270464u,2113930368u,1769473u,77103106u,1499176u,3807248416u,1719772420u,138442752u,393216u}/* AB79 */, /*14468*/{270592u,2116027520u,1769473u,77103106u,1499176u,3807248416u,1719772428u,138442752u,393216u}/* AB7A */, /*14469*/{270720u,2118124672u,1769473u,77103106u,1499176u,3807248416u,1719772436u,138442752u,393216u}/* AB7B */, /*14470*/{270848u,2120221824u,1769473u,77103106u,1499176u,3807248416u,1719772444u,138442752u,393216u}/* AB7C */, /*14471*/{270976u,2122318976u,1769473u,77103106u,1499176u,3807248416u,1719772452u,138442752u,393216u}/* AB7D */, /*14472*/{271104u,2124416128u,1769473u,77103106u,1499176u,3807248416u,1719772460u,138442752u,393216u}/* AB7E */, /*14473*/{271232u,2126513280u,1769473u,77103106u,1499176u,3807248416u,1719772468u,138442752u,393216u}/* AB7F */, /*14474*/{271360u,2128610432u,1769473u,77103106u,1499176u,3807248416u,1719772476u,138442752u,393216u}/* AB80 */, /*14475*/{271488u,2130707584u,1769473u,77103106u,1499176u,3807248416u,1719772484u,138442752u,393216u}/* AB81 */, /*14476*/{271616u,2132804736u,1769473u,77103106u,1499176u,3807248416u,1719772492u,138442752u,393216u}/* AB82 */, /*14477*/{271744u,2134901888u,1769473u,77103106u,1499176u,3807248416u,1719772500u,138442752u,393216u}/* AB83 */, /*14478*/{271872u,2136999040u,1769473u,77103106u,1499176u,3807248416u,1719772508u,138442752u,393216u}/* AB84 */, /*14479*/{272000u,2139096192u,1769473u,77103106u,1499176u,3807248416u,1719772516u,138442752u,393216u}/* AB85 */, /*14480*/{272128u,2141193344u,1769473u,77103106u,1499176u,3807248416u,1719772524u,138442752u,393216u}/* AB86 */, /*14481*/{272256u,2143290496u,1769473u,77103106u,1499176u,3807248416u,1719772532u,138442752u,393216u}/* AB87 */, /*14482*/{272384u,2145387648u,1769473u,77103106u,1499176u,3807248416u,1719772540u,138442752u,393216u}/* AB88 */, /*14483*/{272512u,2147484800u,1769473u,77103106u,1499176u,3807248416u,1719772548u,138442752u,393216u}/* AB89 */, /*14484*/{272640u,2149581952u,1769473u,77103106u,1499176u,3807248416u,1719772556u,138442752u,393216u}/* AB8A */, /*14485*/{272768u,2151679104u,1769473u,77103106u,1499176u,3807248416u,1719772564u,138442752u,393216u}/* AB8B */, /*14486*/{272896u,2153776256u,1769473u,77103106u,1499176u,3807248416u,1719772572u,138442752u,393216u}/* AB8C */, /*14487*/{273024u,2155873408u,1769473u,77103106u,1499176u,3807248416u,1719772580u,138442752u,393216u}/* AB8D */, /*14488*/{273152u,2157970560u,1769473u,77103106u,1499176u,3807248416u,1719772588u,138442752u,393216u}/* AB8E */, /*14489*/{273280u,2160067712u,1769473u,77103106u,1499176u,3807248416u,1719772596u,138442752u,393216u}/* AB8F */, /*14490*/{273408u,2162164864u,1769473u,77103106u,1499176u,3807248416u,1719772604u,138442752u,393216u}/* AB90 */, /*14491*/{273536u,2164262016u,1769473u,77103106u,1499176u,3807248416u,1719772612u,138442752u,393216u}/* AB91 */, /*14492*/{273664u,2166359168u,1769473u,77103106u,1499176u,3807248416u,1719772620u,138442752u,393216u}/* AB92 */, /*14493*/{273792u,2168456320u,1769473u,77103106u,1499176u,3807248416u,1719772628u,138442752u,393216u}/* AB93 */, /*14494*/{273920u,2170553472u,1769473u,77103106u,1499176u,3807248416u,1719772636u,138442752u,393216u}/* AB94 */, /*14495*/{274048u,2172650624u,1769473u,77103106u,1499176u,3807248416u,1719772644u,138442752u,393216u}/* AB95 */, /*14496*/{274176u,2174747776u,1769473u,77103106u,1499176u,3807248416u,1719772652u,138442752u,393216u}/* AB96 */, /*14497*/{274304u,2176844928u,1769473u,77103106u,1499176u,3807248416u,1719772660u,138442752u,393216u}/* AB97 */, /*14498*/{274432u,2178942080u,1769473u,77103106u,1499176u,3807248416u,1719772668u,138442752u,393216u}/* AB98 */, /*14499*/{274560u,2181039232u,1769473u,77103106u,1499176u,3807248416u,1719772676u,138442752u,393216u}/* AB99 */, /*14500*/{274688u,2183136384u,1769473u,77103106u,1499176u,3807248416u,1719772684u,138442752u,393216u}/* AB9A */, /*14501*/{274816u,2185233536u,1769473u,77103106u,1499176u,3807248416u,1719772692u,138442752u,393216u}/* AB9B */, /*14502*/{274944u,2187330688u,1769473u,77103106u,1499176u,3807248416u,1719772700u,138442752u,393216u}/* AB9C */, /*14503*/{275072u,2189427840u,1769473u,77103106u,1499176u,3807248416u,1719772708u,138442752u,393216u}/* AB9D */, /*14504*/{275200u,2191524992u,1769473u,77103106u,1499176u,3807248416u,1719772716u,138442752u,393216u}/* AB9E */, /*14505*/{275328u,2193622144u,1769473u,77103106u,1499176u,3807248416u,1719772724u,138442752u,393216u}/* AB9F */, /*14506*/{275456u,2195719296u,1769473u,77103106u,1499176u,3807248416u,1719772732u,138442752u,393216u}/* ABA0 */, /*14507*/{275584u,2197816448u,1769473u,77103106u,1499176u,3807248416u,1719772740u,138442752u,393216u}/* ABA1 */, /*14508*/{275712u,2199913600u,1769473u,77103106u,1499176u,3807248416u,1719772748u,138442752u,393216u}/* ABA2 */, /*14509*/{275840u,2202010752u,1769473u,77103106u,1499176u,3807248416u,1719772756u,138442752u,393216u}/* ABA3 */, /*14510*/{275968u,2204107904u,1769473u,77103106u,1499176u,3807248416u,1719772764u,138442752u,393216u}/* ABA4 */, /*14511*/{276096u,2206205056u,1769473u,77103106u,1499176u,3807248416u,1719772772u,138442752u,393216u}/* ABA5 */, /*14512*/{276224u,2208302208u,1769473u,77103106u,1499176u,3807248416u,1719772780u,138442752u,393216u}/* ABA6 */, /*14513*/{276352u,2210399360u,1769473u,77103106u,1499176u,3807248416u,1719772788u,138442752u,393216u}/* ABA7 */, /*14514*/{276480u,2212496512u,1769473u,77103106u,1499176u,3807248416u,1719772796u,138442752u,393216u}/* ABA8 */, /*14515*/{276608u,2214593664u,1769473u,77103106u,1499176u,3807248416u,1719772804u,138442752u,393216u}/* ABA9 */, /*14516*/{276736u,2216690816u,1769473u,77103106u,1499176u,3807248416u,1719772812u,138442752u,393216u}/* ABAA */, /*14517*/{276864u,2218787968u,1769473u,77103106u,1499176u,3807248416u,1719772820u,138442752u,393216u}/* ABAB */, /*14518*/{276992u,2220885120u,1769473u,77103106u,1499176u,3807248416u,1719772828u,138442752u,393216u}/* ABAC */, /*14519*/{277120u,2222982272u,1769473u,77103106u,1499176u,3807248416u,1719772836u,138442752u,393216u}/* ABAD */, /*14520*/{277248u,2225079424u,1769473u,77103106u,1499176u,3807248416u,1719772844u,138442752u,393216u}/* ABAE */, /*14521*/{277376u,2227176576u,1769473u,77103106u,1499176u,3807248416u,1719772852u,138442752u,393216u}/* ABAF */, /*14522*/{277504u,2229273728u,1769473u,77103106u,1499176u,3807248416u,1719772860u,138442752u,393216u}/* ABB0 */, /*14523*/{277632u,2231370880u,1769473u,77103106u,1499176u,3807248416u,1719772868u,138442752u,393216u}/* ABB1 */, /*14524*/{277760u,2233468032u,1769473u,77103106u,1499176u,3807248416u,1719772876u,138442752u,393216u}/* ABB2 */, /*14525*/{277888u,2235565184u,1769473u,77103106u,1499176u,3807248416u,1719772884u,138442752u,393216u}/* ABB3 */, /*14526*/{278016u,2237662336u,1769473u,77103106u,1499176u,3807248416u,1719772892u,138442752u,393216u}/* ABB4 */, /*14527*/{278144u,2239759488u,1769473u,77103106u,1499176u,3807248416u,1719772900u,138442752u,393216u}/* ABB5 */, /*14528*/{278272u,2241856640u,1769473u,77103106u,1499176u,3807248416u,1719772908u,138442752u,393216u}/* ABB6 */, /*14529*/{278400u,2243953792u,1769473u,77103106u,1499176u,3807248416u,1719772916u,138442752u,393216u}/* ABB7 */, /*14530*/{278528u,2246050944u,1769473u,77103106u,1499176u,3807248416u,1719772924u,138442752u,393216u}/* ABB8 */, /*14531*/{278656u,2248148096u,1769473u,77103106u,1499176u,3807248416u,1719772932u,138442752u,393216u}/* ABB9 */, /*14532*/{278784u,2250245248u,1769473u,77103106u,1499176u,3807248416u,1719772940u,138442752u,393216u}/* ABBA */, /*14533*/{278912u,2252342400u,1769473u,77103106u,1499176u,3807248416u,1719772948u,138442752u,393216u}/* ABBB */, /*14534*/{279040u,2254439552u,1769473u,77103106u,1499176u,3807248416u,1719772956u,138442752u,393216u}/* ABBC */, /*14535*/{279168u,2256536704u,1769473u,77103106u,1499176u,3807248416u,1719772964u,138442752u,393216u}/* ABBD */, /*14536*/{279296u,2258633856u,1769473u,77103106u,1499176u,3807248416u,1719772972u,138442752u,393216u}/* ABBE */, /*14537*/{279424u,2260731008u,1769473u,77103106u,1499176u,3807248416u,1719772980u,138442752u,393216u}/* ABBF */, /*14538*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677806732u,138442752u,393216u}/* ABC0 */, /*14539*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677806740u,138442752u,393216u}/* ABC1 */, /*14540*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677806748u,138442752u,393216u}/* ABC2 */, /*14541*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677806756u,138442752u,393216u}/* ABC3 */, /*14542*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677806764u,138442752u,393216u}/* ABC4 */, /*14543*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677806772u,138442752u,393216u}/* ABC5 */, /*14544*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677806780u,138442752u,393216u}/* ABC6 */, /*14545*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677806788u,138442752u,393216u}/* ABC7 */, /*14546*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677806796u,138442752u,393216u}/* ABC8 */, /*14547*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677806804u,138442752u,393216u}/* ABC9 */, /*14548*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677806812u,138442752u,393216u}/* ABCA */, /*14549*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677806820u,138442752u,393216u}/* ABCB */, /*14550*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677806828u,138442752u,393216u}/* ABCC */, /*14551*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677806836u,138442752u,393216u}/* ABCD */, /*14552*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677806844u,138442752u,393216u}/* ABCE */, /*14553*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677806852u,138442752u,393216u}/* ABCF */, /*14554*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677806860u,138442752u,393216u}/* ABD0 */, /*14555*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677806868u,138442752u,393216u}/* ABD1 */, /*14556*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677806876u,138442752u,393216u}/* ABD2 */, /*14557*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677806884u,138442752u,393216u}/* ABD3 */, /*14558*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677806892u,138442752u,393216u}/* ABD4 */, /*14559*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677806900u,138442752u,393216u}/* ABD5 */, /*14560*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677806908u,138442752u,393216u}/* ABD6 */, /*14561*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677806916u,138442752u,393216u}/* ABD7 */, /*14562*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677806924u,138442752u,393216u}/* ABD8 */, /*14563*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677806932u,138442752u,393216u}/* ABD9 */, /*14564*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677806940u,138442752u,393216u}/* ABDA */, /*14565*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677807148u,138442752u,393216u}/* ABDB */, /*14566*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677807156u,138442752u,393216u}/* ABDC */, /*14567*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677807164u,138442752u,393216u}/* ABDD */, /*14568*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677807172u,138442752u,393216u}/* ABDE */, /*14569*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677807180u,138442752u,393216u}/* ABDF */, /*14570*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677807188u,138442752u,393216u}/* ABE0 */, /*14571*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677807196u,138442752u,393216u}/* ABE1 */, /*14572*/{0,1160u,5636097u,76906501u,1515560u,3758096416u,1677807204u,138442752u,393216u}/* ABE2 */, /*14573*/{0,1160u,5636097u,68517896u,940466184u,3758096416u,1078021564u,138443264u,262144u}/* ABE3 */, /*14574*/{0,1160u,5636097u,68517896u,940466184u,3758096416u,1078021572u,138443264u,262144u}/* ABE4 */, /*14575*/{0,1160u,5636097u,68530182u,672030728u,3774873616u,1078021580u,138443264u,262144u}/* ABE5 */, /*14576*/{0,1160u,5636097u,68517896u,940466184u,3758096416u,1078021588u,138443264u,262144u}/* ABE6 */, /*14577*/{0,1160u,5636097u,68517896u,940466184u,3758096416u,1078021596u,138443264u,262144u}/* ABE7 */, /*14578*/{0,1160u,5636097u,68530182u,672030728u,3774873616u,1078021604u,138443264u,262144u}/* ABE8 */, /*14579*/{0,1160u,5636097u,68517896u,940466184u,3758096416u,1078021612u,138443264u,262144u}/* ABE9 */, /*14580*/{0,1160u,5636097u,68517896u,940466184u,3758096416u,1078021620u,138443264u,262144u}/* ABEA */, /*14581*/{0,1160u,5636097u,69566487u,98344u,1610612768u,5468u,138442754u,41943040u}/* ABEB */, /*14582*/{0,1160u,5636097u,68517896u,940466184u,1610620960u,1077936140u,855668736u,262144u}/* ABEC */, /*14583*/{0,1160u,5636097u,336965638u,672030728u,1627398168u,1078021740u,138442752u,262144u}/* ABED */, /*14584*/{0,1160u,39191553u,85295113u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* ABF0 */, /*14585*/{0,1160u,542508545u,85295113u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* ABF1 */, /*14586*/{0,1160u,576064001u,85295113u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* ABF2 */, /*14587*/{0,1160u,609617921u,85295113u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* ABF3 */, /*14588*/{0,1160u,643174401u,85295113u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* ABF4 */, /*14589*/{0,1160u,676727809u,85295113u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* ABF5 */, /*14590*/{0,1160u,710284801u,85295113u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* ABF6 */, /*14591*/{0,1160u,743837185u,85295113u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* ABF7 */, /*14592*/{0,1160u,777395201u,85295113u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* ABF8 */, /*14593*/{0,1160u,810947585u,85295113u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* ABF9 */, /*14594*/{0,1171u,1638401u,105971749u,1477914632u,3758096416u,1677721604u,0,393216u}/* AC00 */, /*14595*/{0,1171u,1638401u,107020325u,1612133384u,3758096416u,1677721604u,0,393216u}/* AC01 */, /*14596*/{0,1176u,1638401u,94732293u,1209477128u,3758096416u,1677848212u,138442752u,393216u}/* D7B0 */, /*14597*/{0,1176u,1638401u,94732293u,1209477128u,3758096416u,1677848220u,138442752u,393216u}/* D7B1 */, /*14598*/{0,1176u,1638401u,94732293u,1209477128u,3758096416u,1677848228u,138442752u,393216u}/* D7B2 */, /*14599*/{0,1176u,1638401u,94732293u,1209477128u,3758096416u,1677848236u,138442752u,393216u}/* D7B3 */, /*14600*/{0,1176u,1638401u,94732293u,1209477128u,3758096416u,1677848244u,138442752u,393216u}/* D7B4 */, /*14601*/{0,1176u,1638401u,94732293u,1209477128u,3758096416u,1677848252u,138442752u,393216u}/* D7B5 */, /*14602*/{0,1176u,1638401u,94732293u,1209477128u,3758096416u,1677848260u,138442752u,393216u}/* D7B6 */, /*14603*/{0,1176u,1638401u,94732293u,1209477128u,3758096416u,1677848268u,138442752u,393216u}/* D7B7 */, /*14604*/{0,1176u,1638401u,94732293u,1209477128u,3758096416u,1677848276u,138442752u,393216u}/* D7B8 */, /*14605*/{0,1176u,1638401u,94732293u,1209477128u,3758096416u,1677848284u,138442752u,393216u}/* D7B9 */, /*14606*/{0,1176u,1638401u,94732293u,1209477128u,3758096416u,1677848292u,138442752u,393216u}/* D7BA */, /*14607*/{0,1176u,1638401u,94732293u,1209477128u,3758096416u,1677848300u,138442752u,393216u}/* D7BB */, /*14608*/{0,1176u,1638401u,94732293u,1209477128u,3758096416u,1677848308u,138442752u,393216u}/* D7BC */, /*14609*/{0,1176u,1638401u,94732293u,1209477128u,3758096416u,1677848316u,138442752u,393216u}/* D7BD */, /*14610*/{0,1176u,1638401u,94732293u,1209477128u,3758096416u,1677848324u,138442752u,393216u}/* D7BE */, /*14611*/{0,1176u,1638401u,94732293u,1209477128u,3758096416u,1677848332u,138442752u,393216u}/* D7BF */, /*14612*/{0,1176u,1638401u,94732293u,1209477128u,3758096416u,1677848340u,138442752u,393216u}/* D7C0 */, /*14613*/{0,1176u,1638401u,94732293u,1209477128u,3758096416u,1677848348u,138442752u,393216u}/* D7C1 */, /*14614*/{0,1176u,1638401u,94732293u,1209477128u,3758096416u,1677848356u,138442752u,393216u}/* D7C2 */, /*14615*/{0,1176u,1638401u,94732293u,1209477128u,3758096416u,1677848364u,138442752u,393216u}/* D7C3 */, /*14616*/{0,1176u,1638401u,94732293u,1209477128u,3758096416u,1677848372u,138442752u,393216u}/* D7C4 */, /*14617*/{0,1176u,1638401u,94732293u,1209477128u,3758096416u,1677848380u,138442752u,393216u}/* D7C5 */, /*14618*/{0,1176u,1638401u,94732293u,1209477128u,3758096416u,1677848388u,138442752u,393216u}/* D7C6 */, /*14619*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849100u,138442752u,393216u}/* D7CB */, /*14620*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849108u,138442752u,393216u}/* D7CC */, /*14621*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849116u,138442752u,393216u}/* D7CD */, /*14622*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849124u,138442752u,393216u}/* D7CE */, /*14623*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849132u,138442752u,393216u}/* D7CF */, /*14624*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849140u,138442752u,393216u}/* D7D0 */, /*14625*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849148u,138442752u,393216u}/* D7D1 */, /*14626*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849156u,138442752u,393216u}/* D7D2 */, /*14627*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849164u,138442752u,393216u}/* D7D3 */, /*14628*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849172u,138442752u,393216u}/* D7D4 */, /*14629*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849180u,138442752u,393216u}/* D7D5 */, /*14630*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849188u,138442752u,393216u}/* D7D6 */, /*14631*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849196u,138442752u,393216u}/* D7D7 */, /*14632*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849204u,138442752u,393216u}/* D7D8 */, /*14633*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849212u,138442752u,393216u}/* D7D9 */, /*14634*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849220u,138442752u,393216u}/* D7DA */, /*14635*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849228u,138442752u,393216u}/* D7DB */, /*14636*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849236u,138442752u,393216u}/* D7DC */, /*14637*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849244u,138442752u,393216u}/* D7DD */, /*14638*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849252u,138442752u,393216u}/* D7DE */, /*14639*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849260u,138442752u,393216u}/* D7DF */, /*14640*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849268u,138442752u,393216u}/* D7E0 */, /*14641*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849276u,138442752u,393216u}/* D7E1 */, /*14642*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849284u,138442752u,393216u}/* D7E2 */, /*14643*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849292u,138442752u,393216u}/* D7E3 */, /*14644*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849300u,138442752u,393216u}/* D7E4 */, /*14645*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849308u,138442752u,393216u}/* D7E5 */, /*14646*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849316u,138442752u,393216u}/* D7E6 */, /*14647*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849324u,138442752u,393216u}/* D7E7 */, /*14648*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849332u,138442752u,393216u}/* D7E8 */, /*14649*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849340u,138442752u,393216u}/* D7E9 */, /*14650*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849348u,138442752u,393216u}/* D7EA */, /*14651*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849356u,138442752u,393216u}/* D7EB */, /*14652*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849364u,138442752u,393216u}/* D7EC */, /*14653*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849372u,138442752u,393216u}/* D7ED */, /*14654*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849380u,138442752u,393216u}/* D7EE */, /*14655*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849388u,138442752u,393216u}/* D7EF */, /*14656*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849396u,138442752u,393216u}/* D7F0 */, /*14657*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849404u,138442752u,393216u}/* D7F1 */, /*14658*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849412u,138442752u,393216u}/* D7F2 */, /*14659*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849420u,138442752u,393216u}/* D7F3 */, /*14660*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849428u,138442752u,393216u}/* D7F4 */, /*14661*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849436u,138442752u,393216u}/* D7F5 */, /*14662*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849444u,138442752u,393216u}/* D7F6 */, /*14663*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849452u,138442752u,393216u}/* D7F7 */, /*14664*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849460u,138442752u,393216u}/* D7F8 */, /*14665*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849468u,138442752u,393216u}/* D7F9 */, /*14666*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849476u,138442752u,393216u}/* D7FA */, /*14667*/{0,1176u,1638401u,95780869u,1343695880u,3758096416u,1677849484u,138442752u,393216u}/* D7FB */, /*14668*/{0,1184u,1u,108068882u,536870920u,1677721600u,4u,6144u,0}/* D800 */, /*14669*/{0,1192u,1u,108068882u,536870920u,1677721600u,4u,6144u,0}/* DB80 */, /*14670*/{0,1200u,1u,108068882u,536870920u,1677721600u,4u,6144u,0}/* DC00 */, /*14671*/{0,1209u,1u,67141649u,40u,1677721600u,4u,6144u,0}/* E000 */, /*14672*/{1229455360u,1219u,2359296u,102793253u,73728u,3758620768u,1946958932u,138436608u,393216u}/* F900 */, /*14673*/{1229979648u,1219u,2359296u,102793253u,73728u,3758620768u,1947144620u,138436608u,393216u}/* F901 */, /*14674*/{1230503936u,1219u,2359296u,102793253u,73728u,3758620768u,1946964068u,138436608u,393216u}/* F902 */, /*14675*/{1231028224u,1219u,2359296u,102793253u,73728u,3758620768u,1946959956u,138436608u,393216u}/* F903 */, /*14676*/{1231552512u,1219u,2359296u,102793253u,73728u,3758620768u,1947160724u,138436608u,393216u}/* F904 */, /*14677*/{1232076800u,1219u,2359296u,102793253u,73728u,3758620768u,1947093916u,138436608u,393216u}/* F905 */, /*14678*/{1232601088u,1219u,2359296u,102793253u,73728u,3758620768u,1947105588u,138436608u,393216u}/* F906 */, /*14679*/{1233125376u,1219u,2359296u,102793253u,73728u,3758620768u,1946998516u,138436608u,393216u}/* F907 */, /*14680*/{1233649664u,1219u,2359296u,102793253u,73728u,3758620768u,1946998516u,138436608u,393216u}/* F908 */, /*14681*/{1234173952u,1219u,2359296u,102793253u,73728u,3758620768u,1947116692u,138436608u,393216u}/* F909 */, /*14682*/{1234698240u,1219u,2359296u,102793253u,73728u,3758620768u,1946970268u,138436608u,393216u}/* F90A */, /*14683*/{1235222528u,1219u,2359296u,102793253u,73728u,3758620768u,1947108932u,138436608u,393216u}/* F90B */, /*14684*/{1235746816u,1219u,2359296u,102793253u,73728u,3758620768u,1947116620u,138436608u,393216u}/* F90C */, /*14685*/{1236271104u,1219u,2359296u,102793253u,73728u,3758620768u,1947134396u,138436608u,393216u}/* F90D */, /*14686*/{1236795392u,1219u,2359296u,102793253u,73728u,3758620768u,1947176276u,138436608u,393216u}/* F90E */, /*14687*/{1237319680u,1219u,2359296u,102793253u,73728u,3758620768u,1947194932u,138436608u,393216u}/* F90F */, /*14688*/{1237843968u,1219u,2359296u,102793253u,73728u,3758620768u,1946946572u,138436608u,393216u}/* F910 */, /*14689*/{1238368256u,1219u,2359296u,102793253u,73728u,3758620768u,1946949604u,138436608u,393216u}/* F911 */, /*14690*/{1238892544u,1219u,2359296u,102793253u,73728u,3758620768u,1946952148u,138436608u,393216u}/* F912 */, /*14691*/{1239416832u,1219u,2359296u,102793253u,73728u,3758620768u,1946967692u,138436608u,393216u}/* F913 */, /*14692*/{1239941120u,1219u,2359296u,102793253u,73728u,3758620768u,1947150876u,138436608u,393216u}/* F914 */, /*14693*/{1240465408u,1219u,2359296u,102793253u,73728u,3758620768u,1947157220u,138436608u,393216u}/* F915 */, /*14694*/{1240989696u,1219u,2359296u,102793253u,73728u,3758620768u,1947164884u,138436608u,393216u}/* F916 */, /*14695*/{1241513984u,1219u,2359296u,102793253u,73728u,3758620768u,1947171068u,138436608u,393216u}/* F917 */, /*14696*/{1242038272u,1219u,2359296u,102793253u,73728u,3758620768u,1946942460u,138436608u,393216u}/* F918 */, /*14697*/{1242562560u,1219u,2359296u,102793253u,73728u,3758620768u,1946969444u,138436608u,393216u}/* F919 */, /*14698*/{1243086848u,1219u,2359296u,102793253u,73728u,3758620768u,1946986908u,138436608u,393216u}/* F91A */, /*14699*/{1243611136u,1219u,2359296u,102793253u,73728u,3758620768u,1947094556u,138436608u,393216u}/* F91B */, /*14700*/{1244135424u,1219u,2359296u,102793253u,73728u,3758620768u,1947104692u,138436608u,393216u}/* F91C */, /*14701*/{1244659712u,1219u,2359296u,102793253u,73728u,3758620768u,1947152940u,138436608u,393216u}/* F91D */, /*14702*/{1245184000u,1219u,2359296u,102793253u,73728u,3758620768u,1947167460u,138436608u,393216u}/* F91E */, /*14703*/{1245708288u,1219u,2359296u,102793253u,73728u,3758620768u,1946946428u,138436608u,393216u}/* F91F */, /*14704*/{1246232576u,1219u,2359296u,102793253u,73728u,3758620768u,1946995460u,138436608u,393216u}/* F920 */, /*14705*/{1246756864u,1219u,2359296u,102793253u,73728u,3758620768u,1947124876u,138436608u,393216u}/* F921 */, /*14706*/{1247281152u,1219u,2359296u,102793253u,73728u,3758620768u,1947162980u,138436608u,393216u}/* F922 */, /*14707*/{1247805440u,1219u,2359296u,102793253u,73728u,3758620768u,1946945660u,138436608u,393216u}/* F923 */, /*14708*/{1248329728u,1219u,2359296u,102793253u,73728u,3758620768u,1946953012u,138436608u,393216u}/* F924 */, /*14709*/{1248854016u,1219u,2359296u,102793253u,73728u,3758620768u,1947136084u,138436608u,393216u}/* F925 */, /*14710*/{1249378304u,1219u,2359296u,102793253u,73728u,3758620768u,1946937556u,138436608u,393216u}/* F926 */, /*14711*/{1249902592u,1219u,2359296u,102793253u,73728u,3758620768u,1946950412u,138436608u,393216u}/* F927 */, /*14712*/{1250426880u,1219u,2359296u,102793253u,73728u,3758620768u,1947127900u,138436608u,393216u}/* F928 */, /*14713*/{1250951168u,1219u,2359296u,102793253u,73728u,3758620768u,1947144900u,138436608u,393216u}/* F929 */, /*14714*/{1251475456u,1219u,2359296u,102793253u,73728u,3758620768u,1947157852u,138436608u,393216u}/* F92A */, /*14715*/{1251999744u,1219u,2359296u,102793253u,73728u,3758620768u,1947169260u,138436608u,393216u}/* F92B */, /*14716*/{1252524032u,1219u,2359296u,102793253u,73728u,3758620768u,1946968196u,138436608u,393216u}/* F92C */, /*14717*/{1253048320u,1219u,2359296u,102793253u,73728u,3758620768u,1947096636u,138436608u,393216u}/* F92D */, /*14718*/{1253572608u,1219u,2359296u,102793253u,73728u,3758620768u,1947101124u,138436608u,393216u}/* F92E */, /*14719*/{1254096896u,1219u,2359296u,102793253u,73728u,3758620768u,1947103484u,138436608u,393216u}/* F92F */, /*14720*/{1254621184u,1219u,2359296u,102793253u,73728u,3758620768u,1947140140u,138436608u,393216u}/* F930 */, /*14721*/{1255145472u,1219u,2359296u,102793253u,73728u,3758620768u,1947152548u,138436608u,393216u}/* F931 */, /*14722*/{1255669760u,1219u,2359296u,102793253u,73728u,3758620768u,1947167372u,138436608u,393216u}/* F932 */, /*14723*/{1256194048u,1219u,2359296u,102793253u,73728u,3758620768u,1947177284u,138436608u,393216u}/* F933 */, /*14724*/{1256718336u,1219u,2359296u,102793253u,73728u,3758620768u,1946933788u,138436608u,393216u}/* F934 */, /*14725*/{1257242624u,1219u,2359296u,102793253u,73728u,3758620768u,1946946116u,138436608u,393216u}/* F935 */, /*14726*/{1257766912u,1219u,2359296u,102793253u,73728u,3758620768u,1946946804u,138436608u,393216u}/* F936 */, /*14727*/{1258291200u,1219u,2359296u,102793253u,73728u,3758620768u,1946962316u,138436608u,393216u}/* F937 */, /*14728*/{1258815488u,1219u,2359296u,102793253u,73728u,3758620768u,1946981284u,138436608u,393216u}/* F938 */, /*14729*/{1259339776u,1219u,2359296u,102793253u,73728u,3758620768u,1946989964u,138436608u,393216u}/* F939 */, /*14730*/{1259864064u,1219u,2359296u,102793253u,73728u,3758620768u,1946995172u,138436608u,393216u}/* F93A */, /*14731*/{1260388352u,1219u,2359296u,102793253u,73728u,3758620768u,1947180652u,138436608u,393216u}/* F93B */, /*14732*/{1260912640u,1219u,2359296u,102793253u,73728u,3758620768u,1947182596u,138436608u,393216u}/* F93C */, /*14733*/{1261436928u,1219u,2359296u,102793253u,73728u,3758620768u,1947191052u,138436608u,393216u}/* F93D */, /*14734*/{1261961216u,1219u,2359296u,102793253u,73728u,3758620768u,1946941532u,138436608u,393216u}/* F93E */, /*14735*/{1262485504u,1219u,2359296u,102793253u,73728u,3758620768u,1946972724u,138436608u,393216u}/* F93F */, /*14736*/{1263009792u,1219u,2359296u,102793253u,73728u,3758620768u,1946996236u,138436608u,393216u}/* F940 */, /*14737*/{1263534080u,1219u,2359296u,102793253u,73728u,3758620768u,1946955972u,138436608u,393216u}/* F941 */, /*14738*/{1264058368u,1219u,2359296u,102793253u,73728u,3758620768u,1947115780u,138436608u,393216u}/* F942 */, /*14739*/{1264582656u,1219u,2359296u,102793253u,73728u,3758620768u,1947128364u,138436608u,393216u}/* F943 */, /*14740*/{1265106944u,1219u,2359296u,102793253u,73728u,3758620768u,1947188492u,138436608u,393216u}/* F944 */, /*14741*/{1265631232u,1219u,2359296u,102793253u,73728u,3758620768u,1946934788u,138436608u,393216u}/* F945 */, /*14742*/{1266155520u,1219u,2359296u,102793253u,73728u,3758620768u,1947168028u,138436608u,393216u}/* F946 */, /*14743*/{1266679808u,1219u,2359296u,102793253u,73728u,3758620768u,1947181148u,138436608u,393216u}/* F947 */, /*14744*/{1267204096u,1219u,2359296u,102793253u,73728u,3758620768u,1946959908u,138436608u,393216u}/* F948 */, /*14745*/{1267728384u,1219u,2359296u,102793253u,73728u,3758620768u,1946980812u,138436608u,393216u}/* F949 */, /*14746*/{1268252672u,1219u,2359296u,102793253u,73728u,3758620768u,1947115724u,138436608u,393216u}/* F94A */, /*14747*/{1268776960u,1219u,2359296u,102793253u,73728u,3758620768u,1947122972u,138436608u,393216u}/* F94B */, /*14748*/{1269301248u,1219u,2359296u,102793253u,73728u,3758620768u,1947151012u,138436608u,393216u}/* F94C */, /*14749*/{1269825536u,1219u,2359296u,102793253u,73728u,3758620768u,1947158748u,138436608u,393216u}/* F94D */, /*14750*/{1270349824u,1219u,2359296u,102793253u,73728u,3758620768u,1947161220u,138436608u,393216u}/* F94E */, /*14751*/{1270874112u,1219u,2359296u,102793253u,73728u,3758620768u,1947190148u,138436608u,393216u}/* F94F */, /*14752*/{1271398400u,1219u,2359296u,102793253u,73728u,3758620768u,1947192260u,138436608u,393216u}/* F950 */, /*14753*/{1271922688u,1219u,2359296u,102793253u,73728u,3758620768u,1946979436u,138436608u,393216u}/* F951 */, /*14754*/{1272446976u,1219u,2359296u,102793253u,73728u,3758620768u,1947103388u,138436608u,393216u}/* F952 */, /*14755*/{1272971264u,1219u,2359296u,102793253u,73728u,3758620768u,1946934892u,138436608u,393216u}/* F953 */, /*14756*/{1273495552u,1219u,2359296u,102793253u,73728u,3758620768u,1947101420u,138436608u,393216u}/* F954 */, /*14757*/{1274019840u,1219u,2359296u,102793253u,73728u,3758620768u,1947101292u,138436608u,393216u}/* F955 */, /*14758*/{1274544128u,1219u,2359296u,102793253u,73728u,3758620768u,1947183852u,138436608u,393216u}/* F956 */, /*14759*/{1275068416u,1219u,2359296u,102793253u,73728u,3758620768u,1947191292u,138436608u,393216u}/* F957 */, /*14760*/{1275592704u,1219u,2359296u,102793253u,73728u,3758620768u,1946941852u,138436608u,393216u}/* F958 */, /*14761*/{1276116992u,1219u,2359296u,102793253u,73728u,3758620768u,1946979772u,138436608u,393216u}/* F959 */, /*14762*/{1276641280u,1219u,2359296u,102793253u,73728u,3758620768u,1946957332u,138436608u,393216u}/* F95A */, /*14763*/{1277165568u,1219u,2359296u,102793253u,73728u,3758620768u,1947136132u,138436608u,393216u}/* F95B */, /*14764*/{1277689856u,1219u,2359296u,102793253u,73728u,3758620768u,1947150876u,138436608u,393216u}/* F95C */, /*14765*/{1278214144u,1219u,2359296u,102793253u,73728u,3758620768u,1946956292u,138436608u,393216u}/* F95D */, /*14766*/{1278738432u,1219u,2359296u,102793253u,73728u,3758620768u,1947093972u,138436608u,393216u}/* F95E */, /*14767*/{1279262720u,1219u,2359296u,102793253u,73728u,3758620768u,1947121988u,138436608u,393216u}/* F95F */, /*14768*/{1279787008u,1219u,2359296u,102793253u,73728u,3758620768u,1947130524u,138436608u,393216u}/* F960 */, /*14769*/{1280311296u,1219u,2359296u,102793253u,73728u,3758620768u,1947170372u,138436608u,393216u}/* F961 */, /*14770*/{1280835584u,1219u,2359296u,102793253u,73728u,3758620768u,1947174284u,138436608u,393216u}/* F962 */, /*14771*/{1281359872u,1219u,2359296u,102793253u,73728u,3758620768u,1947103940u,138436608u,393216u}/* F963 */, /*14772*/{1281884160u,1219u,2359296u,102793253u,73728u,3758620768u,1947181540u,138436608u,393216u}/* F964 */, /*14773*/{1282408448u,1219u,2359296u,102793253u,73728u,3758620768u,1947097092u,138436608u,393216u}/* F965 */, /*14774*/{1282932736u,1219u,2359296u,102793253u,73728u,3758620768u,1947129684u,138436608u,393216u}/* F966 */, /*14775*/{1283457024u,1219u,2359296u,102793253u,73728u,3758620768u,1947093620u,138436608u,393216u}/* F967 */, /*14776*/{1283981312u,1219u,2359296u,102793253u,73728u,3758620768u,1947156588u,138436608u,393216u}/* F968 */, /*14777*/{1284505600u,1219u,2359296u,102793253u,73728u,3758620768u,1947141580u,138436608u,393216u}/* F969 */, /*14778*/{1285029888u,1219u,2359296u,102793253u,73728u,3758620768u,1947190044u,138436608u,393216u}/* F96A */, /*14779*/{1285554176u,1219u,606341120u,102793253u,8462338u,3758620768u,1947105316u,138436608u,393216u}/* F96B */, /*14780*/{1286078464u,1219u,2359296u,102793253u,73728u,3758620768u,1947114748u,138436608u,393216u}/* F96C */, /*14781*/{1286602752u,1219u,2359296u,102793253u,73728u,3758620768u,1947177492u,138436608u,393216u}/* F96D */, /*14782*/{1287127040u,1219u,2359296u,102793253u,73728u,3758620768u,1946942556u,138436608u,393216u}/* F96E */, /*14783*/{1287651328u,1219u,2359296u,102793253u,73728u,3758620768u,1946955620u,138436608u,393216u}/* F96F */, /*14784*/{1288175616u,1219u,2359296u,102793253u,73728u,3758620768u,1947154396u,138436608u,393216u}/* F970 */, /*14785*/{1288699904u,1219u,2359296u,102793253u,73728u,3758620768u,1946965908u,138436608u,393216u}/* F971 */, /*14786*/{1289224192u,1219u,2359296u,102793253u,73728u,3758620768u,1947156044u,138436608u,393216u}/* F972 */, /*14787*/{1289748480u,1219u,824451072u,102793253u,8462338u,3758620768u,1947136508u,138436608u,393216u}/* F973 */, /*14788*/{1290272768u,1219u,2359296u,102793253u,73728u,3758620768u,1946939708u,138436608u,393216u}/* F974 */, /*14789*/{1290797056u,1219u,2359296u,102793253u,73728u,3758620768u,1947137804u,138436608u,393216u}/* F975 */, /*14790*/{1291321344u,1219u,2359296u,102793253u,73728u,3758620768u,1947174196u,138436608u,393216u}/* F976 */, /*14791*/{1291845632u,1219u,2359296u,102793253u,73728u,3758620768u,1947094908u,138436608u,393216u}/* F977 */, /*14792*/{1292369920u,1219u,572787200u,102793253u,8462338u,3758620768u,1947100500u,138436608u,393216u}/* F978 */, /*14793*/{1292894208u,1219u,2359296u,102793253u,73728u,3758620768u,1947101268u,138436608u,393216u}/* F979 */, /*14794*/{1293418496u,1219u,2359296u,102793253u,73728u,3758620768u,1947147796u,138436608u,393216u}/* F97A */, /*14795*/{1293942784u,1219u,2359296u,102793253u,73728u,3758620768u,1947189572u,138436608u,393216u}/* F97B */, /*14796*/{1294467072u,1219u,2359296u,102793253u,73728u,3758620768u,1946938764u,138436608u,393216u}/* F97C */, /*14797*/{1294991360u,1219u,2359296u,102793253u,73728u,3758620768u,1946955940u,138436608u,393216u}/* F97D */, /*14798*/{1295515648u,1219u,2359296u,102793253u,73728u,3758620768u,1946970252u,138436608u,393216u}/* F97E */, /*14799*/{1296039936u,1219u,2359296u,102793253u,73728u,3758620768u,1947103668u,138436608u,393216u}/* F97F */, /*14800*/{1296564224u,1219u,2359296u,102793253u,73728u,3758620768u,1947106332u,138436608u,393216u}/* F980 */, /*14801*/{1297088512u,1219u,2359296u,102793253u,73728u,3758620768u,1947116964u,138436608u,393216u}/* F981 */, /*14802*/{1297612800u,1219u,2359296u,102793253u,73728u,3758620768u,1947128172u,138436608u,393216u}/* F982 */, /*14803*/{1298137088u,1219u,2359296u,102793253u,73728u,3758620768u,1947142196u,138436608u,393216u}/* F983 */, /*14804*/{1298661376u,1219u,2359296u,102793253u,73728u,3758620768u,1947163132u,138436608u,393216u}/* F984 */, /*14805*/{1299185664u,1219u,2359296u,102793253u,73728u,3758620768u,1947181916u,138436608u,393216u}/* F985 */, /*14806*/{1299709952u,1219u,2359296u,102793253u,73728u,3758620768u,1946978172u,138436608u,393216u}/* F986 */, /*14807*/{1300234240u,1219u,2359296u,102793253u,73728u,3758620768u,1946987876u,138436608u,393216u}/* F987 */, /*14808*/{1300758528u,1219u,2359296u,102793253u,73728u,3758620768u,1946996428u,138436608u,393216u}/* F988 */, /*14809*/{1301282816u,1219u,2359296u,102793253u,73728u,3758620768u,1946996868u,138436608u,393216u}/* F989 */, /*14810*/{1301807104u,1219u,2359296u,102793253u,73728u,3758620768u,1947102948u,138436608u,393216u}/* F98A */, /*14811*/{1302331392u,1219u,2359296u,102793253u,73728u,3758620768u,1947144252u,138436608u,393216u}/* F98B */, /*14812*/{1302855680u,1219u,2359296u,102793253u,73728u,3758620768u,1947153860u,138436608u,393216u}/* F98C */, /*14813*/{1303379968u,1219u,2359296u,102793253u,73728u,3758620768u,1946965284u,138436608u,393216u}/* F98D */, /*14814*/{1303904256u,1219u,2359296u,102793253u,73728u,3758620768u,1947127212u,138436608u,393216u}/* F98E */, /*14815*/{1304428544u,1219u,2359296u,102793253u,73728u,3758620768u,1947133580u,138436608u,393216u}/* F98F */, /*14816*/{1304952832u,1219u,2359296u,102793253u,73728u,3758620768u,1947134476u,138436608u,393216u}/* F990 */, /*14817*/{1305477120u,1219u,2359296u,102793253u,73728u,3758620768u,1947139804u,138436608u,393216u}/* F991 */, /*14818*/{1306001408u,1219u,2359296u,102793253u,73728u,3758620768u,1947161380u,138436608u,393216u}/* F992 */, /*14819*/{1306525696u,1219u,2359296u,102793253u,73728u,3758620768u,1947165780u,138436608u,393216u}/* F993 */, /*14820*/{1307049984u,1219u,2359296u,102793253u,73728u,3758620768u,1947172436u,138436608u,393216u}/* F994 */, /*14821*/{1307574272u,1219u,2359296u,102793253u,73728u,3758620768u,1947183196u,138436608u,393216u}/* F995 */, /*14822*/{1308098560u,1219u,2359296u,102793253u,73728u,3758620768u,1947191724u,138436608u,393216u}/* F996 */, /*14823*/{1308622848u,1219u,2359296u,102793253u,73728u,3758620768u,1946934668u,138436608u,393216u}/* F997 */, /*14824*/{1309147136u,1219u,2359296u,102793253u,73728u,3758620768u,1946964804u,138436608u,393216u}/* F998 */, /*14825*/{1309671424u,1219u,2359296u,102793253u,73728u,3758620768u,1946943876u,138436608u,393216u}/* F999 */, /*14826*/{1310195712u,1219u,2359296u,102793253u,73728u,3758620768u,1946966828u,138436608u,393216u}/* F99A */, /*14827*/{1310720000u,1219u,2359296u,102793253u,73728u,3758620768u,1946973284u,138436608u,393216u}/* F99B */, /*14828*/{1311244288u,1219u,2359296u,102793253u,73728u,3758620768u,1947101892u,138436608u,393216u}/* F99C */, /*14829*/{1311768576u,1219u,2359296u,102793253u,73728u,3758620768u,1947103012u,138436608u,393216u}/* F99D */, /*14830*/{1312292864u,1219u,2359296u,102793253u,73728u,3758620768u,1947107316u,138436608u,393216u}/* F99E */, /*14831*/{1312817152u,1219u,2359296u,102793253u,73728u,3758620768u,1947164748u,138436608u,393216u}/* F99F */, /*14832*/{1313341440u,1219u,2359296u,102793253u,73728u,3758620768u,1946951716u,138436608u,393216u}/* F9A0 */, /*14833*/{1313865728u,1219u,2359296u,102793253u,73728u,3758620768u,1946955620u,138436608u,393216u}/* F9A1 */, /*14834*/{1314390016u,1219u,2359296u,102793253u,73728u,3758620768u,1947127892u,138436608u,393216u}/* F9A2 */, /*14835*/{1314914304u,1219u,2359296u,102793253u,73728u,3758620768u,1947130292u,138436608u,393216u}/* F9A3 */, /*14836*/{1315438592u,1219u,2359296u,102793253u,73728u,3758620768u,1947137508u,138436608u,393216u}/* F9A4 */, /*14837*/{1315962880u,1219u,2359296u,102793253u,73728u,3758620768u,1947154300u,138436608u,393216u}/* F9A5 */, /*14838*/{1316487168u,1219u,2359296u,102793253u,73728u,3758620768u,1947188220u,138436608u,393216u}/* F9A6 */, /*14839*/{1317011456u,1219u,2359296u,102793253u,73728u,3758620768u,1947170228u,138436608u,393216u}/* F9A7 */, /*14840*/{1317535744u,1219u,2359296u,102793253u,73728u,3758620768u,1947095340u,138436608u,393216u}/* F9A8 */, /*14841*/{1318060032u,1219u,2359296u,102793253u,73728u,3758620768u,1947111892u,138436608u,393216u}/* F9A9 */, /*14842*/{1318584320u,1219u,2359296u,102793253u,73728u,3758620768u,1947121988u,138436608u,393216u}/* F9AA */, /*14843*/{1319108608u,1219u,2359296u,102793253u,73728u,3758620768u,1947125724u,138436608u,393216u}/* F9AB */, /*14844*/{1319632896u,1219u,2359296u,102793253u,73728u,3758620768u,1947130604u,138436608u,393216u}/* F9AC */, /*14845*/{1320157184u,1219u,2359296u,102793253u,73728u,3758620768u,1947170716u,138436608u,393216u}/* F9AD */, /*14846*/{1320681472u,1219u,2359296u,102793253u,73728u,3758620768u,1947172180u,138436608u,393216u}/* F9AE */, /*14847*/{1321205760u,1219u,2359296u,102793253u,73728u,3758620768u,1947195100u,138436608u,393216u}/* F9AF */, /*14848*/{1321730048u,1219u,2359296u,102793253u,73728u,3758620768u,1946934340u,138436608u,393216u}/* F9B0 */, /*14849*/{1322254336u,1219u,2359296u,102793253u,73728u,3758620768u,1946971060u,138436608u,393216u}/* F9B1 */, /*14850*/{1322778624u,1219u,35914752u,102793253u,8462338u,3758620768u,1946980804u,138436608u,393216u}/* F9B2 */, /*14851*/{1323302912u,1219u,2359296u,102793253u,73728u,3758620768u,1946981460u,138436608u,393216u}/* F9B3 */, /*14852*/{1323827200u,1219u,2359296u,102793253u,73728u,3758620768u,1946983124u,138436608u,393216u}/* F9B4 */, /*14853*/{1324351488u,1219u,2359296u,102793253u,73728u,3758620768u,1947096676u,138436608u,393216u}/* F9B5 */, /*14854*/{1324875776u,1219u,2359296u,102793253u,73728u,3758620768u,1947182972u,138436608u,393216u}/* F9B6 */, /*14855*/{1325400064u,1219u,2359296u,102793253u,73728u,3758620768u,1946970036u,138436608u,393216u}/* F9B7 */, /*14856*/{1325924352u,1219u,2359296u,102793253u,73728u,3758620768u,1946980308u,138436608u,393216u}/* F9B8 */, /*14857*/{1326448640u,1219u,2359296u,102793253u,73728u,3758620768u,1947132180u,138436608u,393216u}/* F9B9 */, /*14858*/{1326972928u,1219u,2359296u,102793253u,73728u,3758620768u,1947094588u,138436608u,393216u}/* F9BA */, /*14859*/{1327497216u,1219u,2359296u,102793253u,73728u,3758620768u,1947099356u,138436608u,393216u}/* F9BB */, /*14860*/{1328021504u,1219u,2359296u,102793253u,73728u,3758620768u,1947122044u,138436608u,393216u}/* F9BC */, /*14861*/{1328545792u,1219u,2359296u,102793253u,73728u,3758620768u,1947122692u,138436608u,393216u}/* F9BD */, /*14862*/{1329070080u,1219u,2359296u,102793253u,73728u,3758620768u,1947141844u,138436608u,393216u}/* F9BE */, /*14863*/{1329594368u,1219u,2359296u,102793253u,73728u,3758620768u,1947150876u,138436608u,393216u}/* F9BF */, /*14864*/{1330118656u,1219u,2359296u,102793253u,73728u,3758620768u,1947166844u,138436608u,393216u}/* F9C0 */, /*14865*/{1330642944u,1219u,2359296u,102793253u,73728u,3758620768u,1947175964u,138436608u,393216u}/* F9C1 */, /*14866*/{1331167232u,1219u,2359296u,102793253u,73728u,3758620768u,1946943988u,138436608u,393216u}/* F9C2 */, /*14867*/{1331691520u,1219u,2359296u,102793253u,73728u,3758620768u,1946967540u,138436608u,393216u}/* F9C3 */, /*14868*/{1332215808u,1219u,2359296u,102793253u,73728u,3758620768u,1946998396u,138436608u,393216u}/* F9C4 */, /*14869*/{1332740096u,1219u,2359296u,102793253u,73728u,3758620768u,1947143756u,138436608u,393216u}/* F9C5 */, /*14870*/{1333264384u,1219u,2359296u,102793253u,73728u,3758620768u,1946979204u,138436608u,393216u}/* F9C6 */, /*14871*/{1333788672u,1219u,2359296u,102793253u,73728u,3758620768u,1947102804u,138436608u,393216u}/* F9C7 */, /*14872*/{1334312960u,1219u,2359296u,102793253u,73728u,3758620768u,1947145700u,138436608u,393216u}/* F9C8 */, /*14873*/{1334837248u,1219u,2359296u,102793253u,73728u,3758620768u,1947146660u,138436608u,393216u}/* F9C9 */, /*14874*/{1335361536u,1219u,2359296u,102793253u,73728u,3758620768u,1947157524u,138436608u,393216u}/* F9CA */, /*14875*/{1335885824u,1219u,2359296u,102793253u,73728u,3758620768u,1947160300u,138436608u,393216u}/* F9CB */, /*14876*/{1336410112u,1219u,2359296u,102793253u,73728u,3758620768u,1947171412u,138436608u,393216u}/* F9CC */, /*14877*/{1336934400u,1219u,2359296u,102793253u,73728u,3758620768u,1947174100u,138436608u,393216u}/* F9CD */, /*14878*/{1337458688u,1219u,2359296u,102793253u,73728u,3758620768u,1947180388u,138436608u,393216u}/* F9CE */, /*14879*/{1337982976u,1219u,2359296u,102793253u,73728u,3758620768u,1947189900u,138436608u,393216u}/* F9CF */, /*14880*/{1338507264u,1219u,2359296u,102793253u,73728u,3758620768u,1946983684u,138436608u,393216u}/* F9D0 */, /*14881*/{1339031552u,1219u,707008000u,102793253u,8462338u,3758620768u,1947100532u,138436608u,393216u}/* F9D1 */, /*14882*/{1339555840u,1219u,2359296u,102793253u,73728u,3758620768u,1947134844u,138436608u,393216u}/* F9D2 */, /*14883*/{1340080128u,1219u,707008000u,102793253u,8462338u,3758620768u,1946979796u,138436608u,393216u}/* F9D3 */, /*14884*/{1340604416u,1219u,2359296u,102793253u,73728u,3758620768u,1947097956u,138436608u,393216u}/* F9D4 */, /*14885*/{1341128704u,1219u,2359296u,102793253u,73728u,3758620768u,1947124436u,138436608u,393216u}/* F9D5 */, /*14886*/{1341652992u,1219u,2359296u,102793253u,73728u,3758620768u,1947158876u,138436608u,393216u}/* F9D6 */, /*14887*/{1342177280u,1219u,2359296u,102793253u,73728u,3758620768u,1946964836u,138436608u,393216u}/* F9D7 */, /*14888*/{1342701568u,1219u,2359296u,102793253u,73728u,3758620768u,1947129444u,138436608u,393216u}/* F9D8 */, /*14889*/{1343225856u,1219u,2359296u,102793253u,73728u,3758620768u,1947132972u,138436608u,393216u}/* F9D9 */, /*14890*/{1343750144u,1219u,2359296u,102793253u,73728u,3758620768u,1947146948u,138436608u,393216u}/* F9DA */, /*14891*/{1344274432u,1219u,2359296u,102793253u,73728u,3758620768u,1947170372u,138436608u,393216u}/* F9DB */, /*14892*/{1344798720u,1219u,2359296u,102793253u,73728u,3758620768u,1946979908u,138436608u,393216u}/* F9DC */, /*14893*/{1345323008u,1219u,2359296u,102793253u,73728u,3758620768u,1947102036u,138436608u,393216u}/* F9DD */, /*14894*/{1345847296u,1219u,2359296u,102793253u,73728u,3758620768u,1947105924u,138436608u,393216u}/* F9DE */, /*14895*/{1346371584u,1219u,2359296u,102793253u,73728u,3758620768u,1947122996u,138436608u,393216u}/* F9DF */, /*14896*/{1346895872u,1219u,2359296u,102793253u,73728u,3758620768u,1947142820u,138436608u,393216u}/* F9E0 */, /*14897*/{1347420160u,1219u,2359296u,102793253u,73728u,3758620768u,1947145340u,138436608u,393216u}/* F9E1 */, /*14898*/{1347944448u,1219u,2359296u,102793253u,73728u,3758620768u,1947148108u,138436608u,393216u}/* F9E2 */, /*14899*/{1348468736u,1219u,2359296u,102793253u,73728u,3758620768u,1947156788u,138436608u,393216u}/* F9E3 */, /*14900*/{1348993024u,1219u,2359296u,102793253u,73728u,3758620768u,1947171388u,138436608u,393216u}/* F9E4 */, /*14901*/{1349517312u,1219u,2359296u,102793253u,73728u,3758620768u,1947175196u,138436608u,393216u}/* F9E5 */, /*14902*/{1350041600u,1219u,2359296u,102793253u,73728u,3758620768u,1947194836u,138436608u,393216u}/* F9E6 */, /*14903*/{1350565888u,1219u,2359296u,102793253u,73728u,3758620768u,1946951820u,138436608u,393216u}/* F9E7 */, /*14904*/{1351090176u,1219u,2359296u,102793253u,73728u,3758620768u,1946951964u,138436608u,393216u}/* F9E8 */, /*14905*/{1351614464u,1219u,2359296u,102793253u,73728u,3758620768u,1946970228u,138436608u,393216u}/* F9E9 */, /*14906*/{1352138752u,1219u,2359296u,102793253u,73728u,3758620768u,1946980644u,138436608u,393216u}/* F9EA */, /*14907*/{1352663040u,1219u,2359296u,102793253u,73728u,3758620768u,1947104260u,138436608u,393216u}/* F9EB */, /*14908*/{1353187328u,1219u,2359296u,102793253u,73728u,3758620768u,1947160540u,138436608u,393216u}/* F9EC */, /*14909*/{1353711616u,1219u,2359296u,102793253u,73728u,3758620768u,1947106036u,138436608u,393216u}/* F9ED */, /*14910*/{1354235904u,1219u,2359296u,102793253u,73728u,3758620768u,1947166860u,138436608u,393216u}/* F9EE */, /*14911*/{1354760192u,1219u,2359296u,102793253u,73728u,3758620768u,1947172556u,138436608u,393216u}/* F9EF */, /*14912*/{1355284480u,1219u,2359296u,102793253u,73728u,3758620768u,1946946020u,138436608u,393216u}/* F9F0 */, /*14913*/{1355808768u,1219u,2359296u,102793253u,73728u,3758620768u,1946980140u,138436608u,393216u}/* F9F1 */, /*14914*/{1356333056u,1219u,2359296u,102793253u,73728u,3758620768u,1946991820u,138436608u,393216u}/* F9F2 */, /*14915*/{1356857344u,1219u,2359296u,102793253u,73728u,3758620768u,1946996492u,138436608u,393216u}/* F9F3 */, /*14916*/{1357381632u,1219u,2359296u,102793253u,73728u,3758620768u,1947145924u,138436608u,393216u}/* F9F4 */, /*14917*/{1357905920u,1219u,2359296u,102793253u,73728u,3758620768u,1947158628u,138436608u,393216u}/* F9F5 */, /*14918*/{1358430208u,1219u,2359296u,102793253u,73728u,3758620768u,1946937684u,138436608u,393216u}/* F9F6 */, /*14919*/{1358954496u,1219u,2359296u,102793253u,73728u,3758620768u,1947185252u,138436608u,393216u}/* F9F7 */, /*14920*/{1359478784u,1219u,2359296u,102793253u,73728u,3758620768u,1947185932u,138436608u,393216u}/* F9F8 */, /*14921*/{1360003072u,1219u,2359296u,102793253u,73728u,3758620768u,1947188892u,138436608u,393216u}/* F9F9 */, /*14922*/{1360527360u,1219u,2359296u,102793253u,73728u,3758620768u,1947168780u,138436608u,393216u}/* F9FA */, /*14923*/{1361051648u,1219u,2359296u,102793253u,73728u,3758620768u,1947164372u,138436608u,393216u}/* F9FB */, /*14924*/{1361575936u,1219u,2359296u,102793253u,73728u,3758620768u,1946957012u,138436608u,393216u}/* F9FC */, /*14925*/{1362100224u,1219u,824451072u,102793253u,8462338u,3758620768u,1947095052u,138436608u,393216u}/* F9FD */, /*14926*/{1362624512u,1219u,2359296u,102793253u,73728u,3758620768u,1946940356u,138436608u,393216u}/* F9FE */, /*14927*/{1363148800u,1219u,2359296u,102793253u,73728u,3758620768u,1947102172u,138436608u,393216u}/* F9FF */, /*14928*/{1363673088u,1219u,2359296u,102793253u,73728u,3758620768u,1947101764u,138436608u,393216u}/* FA00 */, /*14929*/{1364197376u,1219u,2359296u,102793253u,73728u,3758620768u,1947127612u,138436608u,393216u}/* FA01 */, /*14930*/{1364721664u,1219u,2359296u,102793253u,73728u,3758620768u,1947136164u,138436608u,393216u}/* FA02 */, /*14931*/{1365245952u,1219u,2359296u,102793253u,73728u,3758620768u,1947189436u,138436608u,393216u}/* FA03 */, /*14932*/{1365770240u,1219u,2359296u,102793253u,73728u,3758620768u,1947121204u,138436608u,393216u}/* FA04 */, /*14933*/{1366294528u,1219u,2359296u,102793253u,73728u,3758620768u,1947157244u,138436608u,393216u}/* FA05 */, /*14934*/{1366818816u,1219u,2359296u,102793253u,73728u,3758620768u,1947144108u,138436608u,393216u}/* FA06 */, /*14935*/{1367343104u,1219u,2359296u,102793253u,73728u,3758620768u,1946964972u,138436608u,393216u}/* FA07 */, /*14936*/{1367867392u,1219u,2359296u,102793253u,73728u,3758620768u,1946950772u,138436608u,393216u}/* FA08 */, /*14937*/{1368391680u,1219u,2359296u,102793253u,73728u,3758620768u,1946979452u,138436608u,393216u}/* FA09 */, /*14938*/{1368915968u,1219u,2359296u,102793253u,73728u,3758620768u,1946953324u,138436608u,393216u}/* FA0A */, /*14939*/{1369440256u,1219u,2359296u,102793253u,73728u,3758620768u,1947127972u,138436608u,393216u}/* FA0B */, /*14940*/{1369964544u,1219u,2359296u,102793253u,73728u,3758620768u,1947100172u,138436608u,393216u}/* FA0C */, /*14941*/{1370488832u,1219u,2359296u,102793253u,73728u,3758620768u,1947109388u,138436608u,393216u}/* FA0D */, /*14942*/{0,1219u,2359297u,102793221u,73768u,3758096416u,1947183748u,138442752u,4587520u}/* FA0E */, /*14943*/{0,1219u,2359297u,102793221u,73768u,3758096416u,1947183756u,138442752u,4587520u}/* FA0F */, /*14944*/{1371013120u,1219u,2359296u,102793253u,73728u,3758620768u,1947114716u,138436608u,393216u}/* FA10 */, /*14945*/{0,1219u,2359297u,102793221u,73768u,3758096416u,1947183772u,138442752u,4587520u}/* FA11 */, /*14946*/{1371537408u,1219u,2359296u,102793253u,73728u,3758620768u,1947143596u,138436608u,393216u}/* FA12 */, /*14947*/{0,1219u,2359297u,102793221u,73768u,3758096416u,1947183788u,138442752u,4587520u}/* FA13 */, /*14948*/{0,1219u,2359297u,102793221u,73768u,3758096416u,1947183796u,138442752u,4587520u}/* FA14 */, /*14949*/{1372061696u,1219u,2359296u,102793253u,73728u,3758620768u,1947101436u,138436608u,393216u}/* FA15 */, /*14950*/{1372585984u,1219u,2359296u,102793253u,73728u,3758620768u,1947169628u,138436608u,393216u}/* FA16 */, /*14951*/{1373110272u,1219u,2359296u,102793253u,73728u,3758620768u,1947177052u,138436608u,393216u}/* FA17 */, /*14952*/{1373634560u,1219u,2359296u,102793253u,73728u,3758620768u,1947182060u,138436608u,393216u}/* FA18 */, /*14953*/{1374158848u,1219u,2359296u,102793253u,73728u,3758620768u,1947182332u,138436608u,393216u}/* FA19 */, /*14954*/{1374683136u,1219u,2359296u,102793253u,73728u,3758620768u,1947182388u,138436608u,393216u}/* FA1A */, /*14955*/{1375207424u,1219u,2359296u,102793253u,73728u,3758620768u,1947182724u,138436608u,393216u}/* FA1B */, /*14956*/{1375731712u,1219u,2359296u,102793253u,73728u,3758620768u,1946981572u,138436608u,393216u}/* FA1C */, /*14957*/{1376256000u,1219u,2359296u,102793253u,73728u,3758620768u,1947189244u,138436608u,393216u}/* FA1D */, /*14958*/{1376780288u,1219u,2359296u,102793253u,73728u,3758620768u,1947195380u,138436608u,393216u}/* FA1E */, /*14959*/{0,1219u,2359297u,102793221u,73768u,3758096416u,1947183884u,138442752u,4587520u}/* FA1F */, /*14960*/{1377304576u,1219u,2359296u,102793253u,73728u,3758620768u,1946946212u,138436608u,393216u}/* FA20 */, /*14961*/{0,1219u,2359297u,102793221u,73768u,3758096416u,1947183900u,138442752u,4587520u}/* FA21 */, /*14962*/{1377828864u,1219u,2359296u,102793253u,73728u,3758620768u,1946956244u,138436608u,393216u}/* FA22 */, /*14963*/{0,1219u,2359297u,102793221u,73768u,3758096416u,1947183916u,138442752u,4587520u}/* FA23 */, /*14964*/{0,1219u,2359297u,102793221u,73768u,3758096416u,1947183924u,138442752u,4587520u}/* FA24 */, /*14965*/{1378353152u,1219u,2359296u,102793253u,73728u,3758620768u,1946966996u,138436608u,393216u}/* FA25 */, /*14966*/{1378877440u,1219u,2359296u,102793253u,73728u,3758620768u,1946968572u,138436608u,393216u}/* FA26 */, /*14967*/{0,1219u,2359297u,102793221u,73768u,3758096416u,1947183948u,138442752u,4587520u}/* FA27 */, /*14968*/{0,1219u,2359297u,102793221u,73768u,3758096416u,1947183956u,138442752u,4587520u}/* FA28 */, /*14969*/{0,1219u,2359297u,102793221u,73768u,3758096416u,1947183964u,138442752u,4587520u}/* FA29 */, /*14970*/{1379401728u,1219u,2359296u,102793253u,73728u,3758620768u,1946984844u,138436608u,393216u}/* FA2A */, /*14971*/{1379926016u,1219u,2359296u,102793253u,73728u,3758620768u,1946984948u,138436608u,393216u}/* FA2B */, /*14972*/{1380450304u,1219u,2359296u,102793253u,73728u,3758620768u,1946985300u,138436608u,393216u}/* FA2C */, /*14973*/{1380974592u,1219u,2359296u,102793253u,73728u,3758620768u,1946994612u,138436608u,393216u}/* FA2D */, /*14974*/{1381498880u,1219u,2359296u,103186469u,73728u,3758620768u,1946968324u,138436608u,393216u}/* FA2E */, /*14975*/{1382023168u,1219u,2359296u,103186469u,73728u,3758620768u,1946980300u,138436608u,393216u}/* FA2F */, /*14976*/{1382547456u,1219u,2359296u,102957093u,73728u,3758620768u,1947096956u,138436608u,393216u}/* FA30 */, /*14977*/{1383071744u,1219u,2359296u,102957093u,73728u,3758620768u,1947099460u,138436608u,393216u}/* FA31 */, /*14978*/{1383596032u,1219u,2359296u,102957093u,73728u,3758620768u,1947100276u,138436608u,393216u}/* FA32 */, /*14979*/{1384120320u,1219u,2359296u,102957093u,73728u,3758620768u,1947103316u,138436608u,393216u}/* FA33 */, /*14980*/{1384644608u,1219u,2359296u,102957093u,73728u,3758620768u,1947103532u,138436608u,393216u}/* FA34 */, /*14981*/{1385168896u,1219u,2359296u,102957093u,73728u,3758620768u,1947104404u,138436608u,393216u}/* FA35 */, /*14982*/{1385693184u,1219u,2359296u,102957093u,73728u,3758620768u,1947109108u,138436608u,393216u}/* FA36 */, /*14983*/{1386217472u,1219u,2359296u,102957093u,73728u,3758620768u,1947109948u,138436608u,393216u}/* FA37 */, /*14984*/{1386741760u,1219u,2359296u,102957093u,73728u,3758620768u,1947110732u,138436608u,393216u}/* FA38 */, /*14985*/{1387266048u,1219u,2359296u,102957093u,73728u,3758620768u,1947114508u,138436608u,393216u}/* FA39 */, /*14986*/{1387790336u,1219u,2359296u,102957093u,73728u,3758620768u,1947115340u,138436608u,393216u}/* FA3A */, /*14987*/{1388314624u,1219u,2359296u,102957093u,73728u,3758620768u,1947122988u,138436608u,393216u}/* FA3B */, /*14988*/{1388838912u,1219u,2359296u,102957093u,73728u,3758620768u,1947123068u,138436608u,393216u}/* FA3C */, /*14989*/{1389363200u,1219u,2359296u,102957093u,73728u,3758620768u,1947131564u,138436608u,393216u}/* FA3D */, /*14990*/{1389887488u,1219u,2359296u,102957093u,73728u,3758620768u,1947133260u,138436608u,393216u}/* FA3E */, /*14991*/{1390411776u,1219u,2359296u,102957093u,73728u,3758620768u,1947133564u,138436608u,393216u}/* FA3F */, /*14992*/{1390936064u,1219u,2359296u,102957093u,73728u,3758620768u,1947134364u,138436608u,393216u}/* FA40 */, /*14993*/{1391460352u,1219u,2359296u,102957093u,73728u,3758620768u,1947141252u,138436608u,393216u}/* FA41 */, /*14994*/{1391984640u,1219u,2359296u,102957093u,73728u,3758620768u,1947142428u,138436608u,393216u}/* FA42 */, /*14995*/{1392508928u,1219u,2359296u,102957093u,73728u,3758620768u,1947143828u,138436608u,393216u}/* FA43 */, /*14996*/{1393033216u,1219u,2359296u,102957093u,73728u,3758620768u,1947147828u,138436608u,393216u}/* FA44 */, /*14997*/{1393557504u,1219u,2359296u,102957093u,73728u,3758620768u,1947157956u,138436608u,393216u}/* FA45 */, /*14998*/{1394081792u,1219u,2359296u,102957093u,73728u,3758620768u,1947159260u,138436608u,393216u}/* FA46 */, /*14999*/{1394606080u,1219u,2359296u,102957093u,73728u,3758620768u,1947161372u,138436608u,393216u}/* FA47 */, /*15000*/{1395130368u,1219u,2359296u,102957093u,73728u,3758620768u,1947166076u,138436608u,393216u}/* FA48 */, /*15001*/{1395654656u,1219u,2359296u,102957093u,73728u,3758620768u,1947167588u,138436608u,393216u}/* FA49 */, /*15002*/{1396178944u,1219u,2359296u,102957093u,73728u,3758620768u,1947171612u,138436608u,393216u}/* FA4A */, /*15003*/{1396703232u,1219u,2359296u,102957093u,73728u,3758620768u,1947180692u,138436608u,393216u}/* FA4B */, /*15004*/{1397227520u,1219u,2359296u,102957093u,73728u,3758620768u,1947182076u,138436608u,393216u}/* FA4C */, /*15005*/{1397751808u,1219u,2359296u,102957093u,73728u,3758620768u,1947182164u,138436608u,393216u}/* FA4D */, /*15006*/{1398276096u,1219u,2359296u,102957093u,73728u,3758620768u,1947182156u,138436608u,393216u}/* FA4E */, /*15007*/{1398800384u,1219u,2359296u,102957093u,73728u,3758620768u,1947182220u,138436608u,393216u}/* FA4F */, /*15008*/{1399324672u,1219u,2359296u,102957093u,73728u,3758620768u,1947182268u,138436608u,393216u}/* FA50 */, /*15009*/{1399848960u,1219u,2359296u,102957093u,73728u,3758620768u,1947182324u,138436608u,393216u}/* FA51 */, /*15010*/{1400373248u,1219u,2359296u,102957093u,73728u,3758620768u,1947182708u,138436608u,393216u}/* FA52 */, /*15011*/{1400897536u,1219u,2359296u,102957093u,73728u,3758620768u,1947182716u,138436608u,393216u}/* FA53 */, /*15012*/{1401421824u,1219u,2359296u,102957093u,73728u,3758620768u,1947184140u,138436608u,393216u}/* FA54 */, /*15013*/{1401946112u,1219u,2359296u,102957093u,73728u,3758620768u,1947184660u,138436608u,393216u}/* FA55 */, /*15014*/{1402470400u,1219u,2359296u,102957093u,73728u,3758620768u,1947187212u,138436608u,393216u}/* FA56 */, /*15015*/{1402994688u,1219u,2359296u,102957093u,73728u,3758620768u,1947191724u,138436608u,393216u}/* FA57 */, /*15016*/{1403518976u,1219u,2359296u,102957093u,73728u,3758620768u,1947191892u,138436608u,393216u}/* FA58 */, /*15017*/{1404043264u,1219u,2359296u,102957093u,73728u,3758620768u,1947192340u,138436608u,393216u}/* FA59 */, /*15018*/{1404567552u,1219u,2359296u,102957093u,73728u,3758620768u,1947194780u,138436608u,393216u}/* FA5A */, /*15019*/{1405091840u,1219u,2359296u,102957093u,73728u,3758620768u,1946933820u,138436608u,393216u}/* FA5B */, /*15020*/{1405616128u,1219u,2359296u,102957093u,73728u,3758620768u,1946937724u,138436608u,393216u}/* FA5C */, /*15021*/{1406140416u,1219u,2359296u,102957093u,73728u,3758620768u,1946938844u,138436608u,393216u}/* FA5D */, /*15022*/{1406664704u,1219u,2359296u,102957093u,73728u,3758620768u,1946938844u,138436608u,393216u}/* FA5E */, /*15023*/{1407188992u,1219u,2359296u,102957093u,73728u,3758620768u,1946942668u,138436608u,393216u}/* FA5F */, /*15024*/{1407713280u,1219u,2359296u,102957093u,73728u,3758620768u,1946952340u,138436608u,393216u}/* FA60 */, /*15025*/{1408237568u,1219u,2359296u,102957093u,73728u,3758620768u,1946953412u,138436608u,393216u}/* FA61 */, /*15026*/{1408761856u,1219u,2359296u,102957093u,73728u,3758620768u,1946956316u,138436608u,393216u}/* FA62 */, /*15027*/{1409286144u,1219u,2359296u,102957093u,73728u,3758620768u,1946956764u,138436608u,393216u}/* FA63 */, /*15028*/{1409810432u,1219u,2359296u,102957093u,73728u,3758620768u,1946960044u,138436608u,393216u}/* FA64 */, /*15029*/{1410334720u,1219u,2359296u,102957093u,73728u,3758620768u,1946960468u,138436608u,393216u}/* FA65 */, /*15030*/{1410859008u,1219u,2359296u,102957093u,73728u,3758620768u,1946965956u,138436608u,393216u}/* FA66 */, /*15031*/{1411383296u,1219u,2359296u,102957093u,73728u,3758620768u,1946966996u,138436608u,393216u}/* FA67 */, /*15032*/{1411907584u,1219u,2359296u,102957093u,73728u,3758620768u,1946980652u,138436608u,393216u}/* FA68 */, /*15033*/{1412431872u,1219u,2359296u,102957093u,73728u,3758620768u,1946982924u,138436608u,393216u}/* FA69 */, /*15034*/{1412956160u,1219u,2359296u,102957093u,73728u,3758620768u,1946983404u,138436608u,393216u}/* FA6A */, /*15035*/{1413480448u,1219u,2359296u,103120933u,73728u,3758620768u,1947131316u,138436608u,393216u}/* FA6B */, /*15036*/{1414004736u,1219u,2359296u,103120933u,73728u,3758620768u,1947071388u,138436608u,393216u}/* FA6C */, /*15037*/{1414529024u,1219u,2359296u,103120933u,73728u,3758620768u,1946938068u,138436608u,393216u}/* FA6D */, /*15038*/{1415053312u,1219u,2359296u,103022629u,73728u,3758620768u,1947093820u,138436608u,393216u}/* FA70 */, /*15039*/{1415577600u,1219u,2359296u,103022629u,73728u,3758620768u,1947101108u,138436608u,393216u}/* FA71 */, /*15040*/{1416101888u,1219u,2359296u,103022629u,73728u,3758620768u,1947100492u,138436608u,393216u}/* FA72 */, /*15041*/{1416626176u,1219u,2359296u,103022629u,73728u,3758620768u,1947096588u,138436608u,393216u}/* FA73 */, /*15042*/{1417150464u,1219u,2359296u,103022629u,73728u,3758620768u,1947100212u,138436608u,393216u}/* FA74 */, /*15043*/{1417674752u,1219u,2359296u,103022629u,73728u,3758620768u,1947100684u,138436608u,393216u}/* FA75 */, /*15044*/{1418199040u,1219u,2359296u,103022629u,73728u,3758620768u,1947103300u,138436608u,393216u}/* FA76 */, /*15045*/{1418723328u,1219u,2359296u,103022629u,73728u,3758620768u,1947103708u,138436608u,393216u}/* FA77 */, /*15046*/{1419247616u,1219u,2359296u,103022629u,73728u,3758620768u,1947109108u,138436608u,393216u}/* FA78 */, /*15047*/{1419771904u,1219u,2359296u,103022629u,73728u,3758620768u,1947108532u,138436608u,393216u}/* FA79 */, /*15048*/{1420296192u,1219u,2359296u,103022629u,73728u,3758620768u,1947109076u,138436608u,393216u}/* FA7A */, /*15049*/{1420820480u,1219u,2359296u,103022629u,73728u,3758620768u,1947109660u,138436608u,393216u}/* FA7B */, /*15050*/{1421344768u,1219u,2359296u,103022629u,73728u,3758620768u,1947114716u,138436608u,393216u}/* FA7C */, /*15051*/{1421869056u,1219u,2359296u,103022629u,73728u,3758620768u,1947115428u,138436608u,393216u}/* FA7D */, /*15052*/{1422393344u,1219u,2359296u,103022629u,73728u,3758620768u,1947116588u,138436608u,393216u}/* FA7E */, /*15053*/{1422917632u,1219u,2359296u,103022629u,73728u,3758620768u,1947116716u,138436608u,393216u}/* FA7F */, /*15054*/{1423441920u,1219u,2359296u,103022629u,73728u,3758620768u,1947118876u,138436608u,393216u}/* FA80 */, /*15055*/{1423966208u,1219u,2359296u,103022629u,73728u,3758620768u,1947120460u,138436608u,393216u}/* FA81 */, /*15056*/{1424490496u,1219u,2359296u,103022629u,73728u,3758620768u,1947127964u,138436608u,393216u}/* FA82 */, /*15057*/{1425014784u,1219u,2359296u,103022629u,73728u,3758620768u,1947128020u,138436608u,393216u}/* FA83 */, /*15058*/{1425539072u,1219u,2359296u,103022629u,73728u,3758620768u,1947129172u,138436608u,393216u}/* FA84 */, /*15059*/{1426063360u,1219u,2359296u,103022629u,73728u,3758620768u,1947129716u,138436608u,393216u}/* FA85 */, /*15060*/{1426587648u,1219u,2359296u,103022629u,73728u,3758620768u,1947132108u,138436608u,393216u}/* FA86 */, /*15061*/{1427111936u,1219u,2359296u,103022629u,73728u,3758620768u,1947133052u,138436608u,393216u}/* FA87 */, /*15062*/{1427636224u,1219u,2359296u,103022629u,73728u,3758620768u,1947132492u,138436608u,393216u}/* FA88 */, /*15063*/{1428160512u,1219u,2359296u,103022629u,73728u,3758620768u,1947133564u,138436608u,393216u}/* FA89 */, /*15064*/{1428684800u,1219u,2359296u,103022629u,73728u,3758620768u,1947133196u,138436608u,393216u}/* FA8A */, /*15065*/{1429209088u,1219u,2359296u,103022629u,73728u,3758620768u,1947134364u,138436608u,393216u}/* FA8B */, /*15066*/{1429733376u,1219u,2359296u,103022629u,73728u,3758620768u,1947134892u,138436608u,393216u}/* FA8C */, /*15067*/{1430257664u,1219u,2359296u,103022629u,73728u,3758620768u,1947138092u,138436608u,393216u}/* FA8D */, /*15068*/{1430781952u,1219u,2359296u,103022629u,73728u,3758620768u,1947138796u,138436608u,393216u}/* FA8E */, /*15069*/{1431306240u,1219u,2359296u,103022629u,73728u,3758620768u,1947139228u,138436608u,393216u}/* FA8F */, /*15070*/{1431830528u,1219u,2359296u,103022629u,73728u,3758620768u,1947141308u,138436608u,393216u}/* FA90 */, /*15071*/{1432354816u,1219u,2359296u,103022629u,73728u,3758620768u,1947143596u,138436608u,393216u}/* FA91 */, /*15072*/{1432879104u,1219u,2359296u,103022629u,73728u,3758620768u,1947144900u,138436608u,393216u}/* FA92 */, /*15073*/{1433403392u,1219u,2359296u,103022629u,73728u,3758620768u,1947144932u,138436608u,393216u}/* FA93 */, /*15074*/{1433927680u,1219u,2359296u,103022629u,73728u,3758620768u,1947145404u,138436608u,393216u}/* FA94 */, /*15075*/{1434451968u,1219u,2359296u,103022629u,73728u,3758620768u,1947153876u,138436608u,393216u}/* FA95 */, /*15076*/{1434976256u,1219u,2359296u,103022629u,73728u,3758620768u,1947154396u,138436608u,393216u}/* FA96 */, /*15077*/{1435500544u,1219u,2359296u,103022629u,73728u,3758620768u,1947157524u,138436608u,393216u}/* FA97 */, /*15078*/{1436024832u,1219u,2359296u,103022629u,73728u,3758620768u,1947160804u,138436608u,393216u}/* FA98 */, /*15079*/{1436549120u,1219u,2359296u,103022629u,73728u,3758620768u,1947160676u,138436608u,393216u}/* FA99 */, /*15080*/{1437073408u,1219u,2359296u,103022629u,73728u,3758620768u,1947161372u,138436608u,393216u}/* FA9A */, /*15081*/{1437597696u,1219u,2359296u,103022629u,73728u,3758620768u,1947163388u,138436608u,393216u}/* FA9B */, /*15082*/{1438121984u,1219u,2359296u,103022629u,73728u,3758620768u,1947166076u,138436608u,393216u}/* FA9C */, /*15083*/{1438646272u,1219u,2359296u,103022629u,73728u,3758620768u,1947178820u,138436608u,393216u}/* FA9D */, /*15084*/{1439170560u,1219u,2359296u,103022629u,73728u,3758620768u,1947167668u,138436608u,393216u}/* FA9E */, /*15085*/{1439694848u,1219u,2359296u,103022629u,73728u,3758620768u,1947168644u,138436608u,393216u}/* FA9F */, /*15086*/{1440219136u,1219u,2359296u,103022629u,73728u,3758620768u,1947169628u,138436608u,393216u}/* FAA0 */, /*15087*/{1440743424u,1219u,2359296u,103022629u,73728u,3758620768u,1947172244u,138436608u,393216u}/* FAA1 */, /*15088*/{1441267712u,1219u,2359296u,103022629u,73728u,3758620768u,1947173436u,138436608u,393216u}/* FAA2 */, /*15089*/{1441792000u,1219u,2359296u,103022629u,73728u,3758620768u,1947173860u,138436608u,393216u}/* FAA3 */, /*15090*/{1442316288u,1219u,2359296u,103022629u,73728u,3758620768u,1947175668u,138436608u,393216u}/* FAA4 */, /*15091*/{1442840576u,1219u,2359296u,103022629u,73728u,3758620768u,1947175684u,138436608u,393216u}/* FAA5 */, /*15092*/{1443364864u,1219u,2359296u,103022629u,73728u,3758620768u,1947177052u,138436608u,393216u}/* FAA6 */, /*15093*/{1443889152u,1219u,2359296u,103022629u,73728u,3758620768u,1947177188u,138436608u,393216u}/* FAA7 */, /*15094*/{1444413440u,1219u,2359296u,103022629u,73728u,3758620768u,1947177388u,138436608u,393216u}/* FAA8 */, /*15095*/{1444937728u,1219u,2359296u,103022629u,73728u,3758620768u,1947178076u,138436608u,393216u}/* FAA9 */, /*15096*/{1445462016u,1219u,2359296u,103022629u,73728u,3758620768u,1947177996u,138436608u,393216u}/* FAAA */, /*15097*/{1445986304u,1219u,2359296u,103022629u,73728u,3758620768u,1947181164u,138436608u,393216u}/* FAAB */, /*15098*/{1446510592u,1219u,2359296u,103022629u,73728u,3758620768u,1947185044u,138436608u,393216u}/* FAAC */, /*15099*/{1447034880u,1219u,2359296u,103022629u,73728u,3758620768u,1947187212u,138436608u,393216u}/* FAAD */, /*15100*/{1447559168u,1219u,2359296u,103022629u,73728u,3758620768u,1947188708u,138436608u,393216u}/* FAAE */, /*15101*/{1448083456u,1219u,2359296u,103022629u,73728u,3758620768u,1947190500u,138436608u,393216u}/* FAAF */, /*15102*/{1448607744u,1219u,2359296u,103022629u,73728u,3758620768u,1947191724u,138436608u,393216u}/* FAB0 */, /*15103*/{1449132032u,1219u,2359296u,103022629u,73728u,3758620768u,1947194364u,138436608u,393216u}/* FAB1 */, /*15104*/{1449656320u,1219u,2359296u,103022629u,73728u,3758620768u,1946933820u,138436608u,393216u}/* FAB2 */, /*15105*/{1450180608u,1219u,2359296u,103022629u,73728u,3758620768u,1946940580u,138436608u,393216u}/* FAB3 */, /*15106*/{1450704896u,1219u,2359296u,103022629u,73728u,3758620768u,1946941836u,138436608u,393216u}/* FAB4 */, /*15107*/{1451229184u,1219u,2359296u,103022629u,73728u,3758620768u,1946949084u,138436608u,393216u}/* FAB5 */, /*15108*/{1451753472u,1219u,2359296u,103022629u,73728u,3758620768u,1946952732u,138436608u,393216u}/* FAB6 */, /*15109*/{1452277760u,1219u,2359296u,103022629u,73728u,3758620768u,1946953284u,138436608u,393216u}/* FAB7 */, /*15110*/{1452802048u,1219u,2359296u,103022629u,73728u,3758620768u,1946953412u,138436608u,393216u}/* FAB8 */, /*15111*/{1453326336u,1219u,2359296u,103022629u,73728u,3758620768u,1946955788u,138436608u,393216u}/* FAB9 */, /*15112*/{1453850624u,1219u,2359296u,103022629u,73728u,3758620768u,1946956244u,138436608u,393216u}/* FABA */, /*15113*/{1454374912u,1219u,2359296u,103022629u,73728u,3758620768u,1946955884u,138436608u,393216u}/* FABB */, /*15114*/{1454899200u,1219u,2359296u,103022629u,73728u,3758620768u,1946956316u,138436608u,393216u}/* FABC */, /*15115*/{1455423488u,1219u,2359296u,103022629u,73728u,3758620768u,1946956292u,138436608u,393216u}/* FABD */, /*15116*/{1455947776u,1219u,2359296u,103022629u,73728u,3758620768u,1946956156u,138436608u,393216u}/* FABE */, /*15117*/{1456472064u,1219u,2359296u,103022629u,73728u,3758620768u,1946956764u,138436608u,393216u}/* FABF */, /*15118*/{1456996352u,1219u,2359296u,103022629u,73728u,3758620768u,1946957412u,138436608u,393216u}/* FAC0 */, /*15119*/{1457520640u,1219u,2359296u,103022629u,73728u,3758620768u,1946960468u,138436608u,393216u}/* FAC1 */, /*15120*/{1458044928u,1219u,2359296u,103022629u,73728u,3758620768u,1946964948u,138436608u,393216u}/* FAC2 */, /*15121*/{1458569216u,1219u,2359296u,103022629u,73728u,3758620768u,1946967460u,138436608u,393216u}/* FAC3 */, /*15122*/{1459093504u,1219u,2359296u,103022629u,73728u,3758620768u,1946969820u,138436608u,393216u}/* FAC4 */, /*15123*/{1459617792u,1219u,2359296u,103022629u,73728u,3758620768u,1946971588u,138436608u,393216u}/* FAC5 */, /*15124*/{1460142080u,1219u,2359296u,103022629u,73728u,3758620768u,1946979828u,138436608u,393216u}/* FAC6 */, /*15125*/{1460666368u,1219u,2359296u,103022629u,73728u,3758620768u,1946980652u,138436608u,393216u}/* FAC7 */, /*15126*/{1461190656u,1219u,2359296u,103022629u,73728u,3758620768u,1946981572u,138436608u,393216u}/* FAC8 */, /*15127*/{1461714944u,1219u,2359296u,103022629u,73728u,3758620768u,1946982636u,138436608u,393216u}/* FAC9 */, /*15128*/{1462239232u,1219u,2359296u,103022629u,73728u,3758620768u,1946982924u,138436608u,393216u}/* FACA */, /*15129*/{1462763520u,1219u,2359296u,103022629u,73728u,3758620768u,1946983020u,138436608u,393216u}/* FACB */, /*15130*/{1463287808u,1219u,2359296u,103022629u,73728u,3758620768u,1946983404u,138436608u,393216u}/* FACC */, /*15131*/{1463812096u,1219u,2359296u,103022629u,73728u,3758620768u,1946989220u,138436608u,393216u}/* FACD */, /*15132*/{1464336384u,1219u,2359296u,103022629u,73728u,3758620768u,1946998516u,138436608u,393216u}/* FACE */, /*15133*/{1464860672u,1219u,2359296u,103022629u,73728u,3758620768u,1947016828u,138436608u,393216u}/* FACF */, /*15134*/{1465384960u,1219u,2359296u,103022629u,73728u,3758620768u,1947016780u,138436608u,393216u}/* FAD0 */, /*15135*/{1465909248u,1219u,2359296u,103022629u,73728u,3758620768u,1947040468u,138436608u,393216u}/* FAD1 */, /*15136*/{1466433536u,1219u,2359296u,103022629u,73728u,3758620768u,1947056372u,138436608u,393216u}/* FAD2 */, /*15137*/{1466957824u,1219u,2359296u,103022629u,73728u,3758620768u,1947065548u,138436608u,393216u}/* FAD3 */, /*15138*/{1467482112u,1219u,2359296u,103022629u,73728u,3758620768u,1947065812u,138436608u,393216u}/* FAD4 */, /*15139*/{1468006400u,1219u,2359296u,103022629u,73728u,3758620768u,1947102836u,138436608u,393216u}/* FAD5 */, /*15140*/{1468530688u,1219u,2359296u,103022629u,73728u,3758620768u,1947124396u,138436608u,393216u}/* FAD6 */, /*15141*/{1469054976u,1219u,2359296u,103022629u,73728u,3758620768u,1947194052u,138436608u,393216u}/* FAD7 */, /*15142*/{1469579264u,1219u,2359296u,103022629u,73728u,3758620768u,1946997804u,138436608u,393216u}/* FAD8 */, /*15143*/{1470103552u,1219u,2359296u,103022629u,73728u,3758620768u,1946998404u,138436608u,393216u}/* FAD9 */, /*15144*/{1470627840u,195036360u,131085u,76578882u,1499168u,3773693984u,1719784636u,272707584u,393216u}/* FB00 */, /*15145*/{1471152128u,197133512u,131089u,76578882u,1499168u,3773693984u,1719785252u,272707584u,393216u}/* FB01 */, /*15146*/{1471676416u,199230664u,131093u,76578882u,1499168u,3773693984u,1719785804u,272707584u,393216u}/* FB02 */, /*15147*/{1472200704u,201327816u,131097u,76578882u,1499168u,3773693984u,1719845244u,406958080u,393216u}/* FB03 */, /*15148*/{1472724992u,203424968u,131101u,76578882u,1499168u,3773693984u,1719845796u,406958080u,393216u}/* FB04 */, /*15149*/{1473249280u,205522120u,131105u,76578882u,1499168u,3773693984u,1719791260u,1421979648u,393216u}/* FB05 */, /*15150*/{1473773568u,207619272u,131109u,76578882u,1499168u,3773693984u,1719791260u,272707584u,393216u}/* FB06 */, /*15151*/{1474297856u,209716424u,327725u,76578882u,1499168u,3773693984u,1719808172u,272707584u,393216u}/* FB13 */, /*15152*/{1474822144u,211813576u,327729u,76578882u,1499168u,3773693984u,1719808036u,272707584u,393216u}/* FB14 */, /*15153*/{1475346432u,213910728u,327733u,76578882u,1499168u,3773693984u,1719808084u,272707584u,393216u}/* FB15 */, /*15154*/{1475870720u,216007880u,327737u,76578882u,1499168u,3773693984u,1719808252u,272707584u,393216u}/* FB16 */, /*15155*/{1476395008u,218105032u,327741u,76578882u,1499168u,3773693984u,1719808100u,272707584u,393216u}/* FB17 */, /*15156*/{1476919296u,1224u,393216u,91358245u,466944u,3758620768u,1677793596u,499163136u,393216u}/* FB1D */, /*15157*/{0,1224u,393217u,1477488646u,672030728u,3774881808u,1077936140u,411073024u,262144u}/* FB1E */, /*15158*/{1477443584u,1224u,393216u,91259941u,466944u,3758620768u,1677865580u,646012928u,393216u}/* FB1F */, /*15159*/{1477967872u,1224u,393217u,91260005u,466976u,3758620704u,1677793644u,138465280u,393216u}/* FB20 */, /*15160*/{1478492160u,1224u,393217u,91260005u,466976u,3758620704u,1677793524u,138465280u,393216u}/* FB21 */, /*15161*/{1479016448u,1224u,393217u,91260005u,466976u,3758620704u,1677793548u,138465280u,393216u}/* FB22 */, /*15162*/{1479540736u,1224u,393217u,91260005u,466976u,3758620704u,1677793556u,138465280u,393216u}/* FB23 */, /*15163*/{1480065024u,1224u,393217u,91260005u,466976u,3758620704u,1677793604u,138465280u,393216u}/* FB24 */, /*15164*/{1480589312u,1224u,393217u,91260005u,466976u,3758620704u,1677793612u,138465280u,393216u}/* FB25 */, /*15165*/{1481113600u,1224u,393217u,91260005u,466976u,3758620704u,1677793620u,138465280u,393216u}/* FB26 */, /*15166*/{1481637888u,1224u,393217u,91260005u,466976u,3758620704u,1677793676u,138465280u,393216u}/* FB27 */, /*15167*/{1482162176u,1224u,393217u,91260005u,466976u,3758620704u,1677793692u,138465280u,393216u}/* FB28 */, /*15168*/{1482686464u,1224u,393217u,76582008u,32u,1611137056u,12654u,138465280u,67108864u}/* FB29 */, /*15169*/{1483210752u,1224u,393216u,91259941u,466944u,3758620768u,1677793684u,532717568u,393216u}/* FB2A */, /*15170*/{1483735040u,1224u,393216u,91259941u,466944u,3758620768u,1677793684u,528523264u,393216u}/* FB2B */, /*15171*/{1484259328u,1224u,393216u,91259941u,466944u,3758620768u,1677793684u,931192832u,393216u}/* FB2C */, /*15172*/{1484783616u,1224u,393216u,91259941u,466944u,3758620768u,1677793684u,926998528u,393216u}/* FB2D */, /*15173*/{1485307904u,1224u,393216u,91259941u,466944u,3758620768u,1677793524u,511746048u,393216u}/* FB2E */, /*15174*/{1485832192u,1224u,393216u,91259941u,466944u,3758620768u,1677793524u,515940352u,393216u}/* FB2F */, /*15175*/{1486356480u,1224u,393216u,91259941u,466944u,3758620768u,1677793524u,536911872u,393216u}/* FB30 */, /*15176*/{1486880768u,1224u,393216u,91259941u,466944u,3758620768u,1677793532u,536911872u,393216u}/* FB31 */, /*15177*/{1487405056u,1224u,393216u,91259941u,466944u,3758620768u,1677793540u,536911872u,393216u}/* FB32 */, /*15178*/{1487929344u,1224u,393216u,91259941u,466944u,3758620768u,1677793548u,536911872u,393216u}/* FB33 */, /*15179*/{1488453632u,1224u,393216u,91259941u,466944u,3758620768u,1677793556u,536911872u,393216u}/* FB34 */, /*15180*/{1488977920u,1224u,393216u,91259941u,466944u,3758620768u,1677793564u,536911872u,393216u}/* FB35 */, /*15181*/{1489502208u,1224u,393216u,91259941u,466944u,3758620768u,1677793572u,536911872u,393216u}/* FB36 */, /*15182*/{1490026496u,1224u,393216u,91259941u,466944u,3758620768u,1677793588u,536911872u,393216u}/* FB38 */, /*15183*/{1490550784u,1224u,393216u,91259941u,466944u,3758620768u,1677793596u,536911872u,393216u}/* FB39 */, /*15184*/{1491075072u,1224u,393216u,91259941u,466944u,3758620768u,1677793604u,537100288u,393216u}/* FB3A */, /*15185*/{1491599360u,1224u,393216u,91259941u,466944u,3758620768u,1677793604u,536911872u,393216u}/* FB3B */, /*15186*/{1492123648u,1224u,393216u,91259941u,466944u,3758620768u,1677793612u,536911872u,393216u}/* FB3C */, /*15187*/{1492647936u,1224u,393216u,91259941u,466944u,3758620768u,1677793620u,536911872u,393216u}/* FB3E */, /*15188*/{1493172224u,1224u,393216u,91259941u,466944u,3758620768u,1677793628u,536911872u,393216u}/* FB40 */, /*15189*/{1493696512u,1224u,393216u,91259941u,466944u,3758620768u,1677793636u,536911872u,393216u}/* FB41 */, /*15190*/{1494220800u,1224u,393216u,91259941u,466944u,3758620768u,1677793652u,537100288u,393216u}/* FB43 */, /*15191*/{1494745088u,1224u,393216u,91259941u,466944u,3758620768u,1677793652u,536911872u,393216u}/* FB44 */, /*15192*/{1495269376u,1224u,393216u,91259941u,466944u,3758620768u,1677793660u,536911872u,393216u}/* FB46 */, /*15193*/{1495793664u,1224u,393216u,91259941u,466944u,3758620768u,1677793668u,536911872u,393216u}/* FB47 */, /*15194*/{1496317952u,1224u,393216u,91259941u,466944u,3758620768u,1677793676u,536911872u,393216u}/* FB48 */, /*15195*/{1496842240u,1224u,393216u,91259941u,466944u,3758620768u,1677793684u,536911872u,393216u}/* FB49 */, /*15196*/{1497366528u,1224u,393216u,91259941u,466944u,3758620768u,1677793692u,536911872u,393216u}/* FB4A */, /*15197*/{1497890816u,1224u,393216u,91259941u,466944u,3758620768u,1677793564u,520134656u,393216u}/* FB4B */, /*15198*/{1498415104u,1224u,393216u,91259941u,466944u,3758620768u,1677793532u,541106176u,393216u}/* FB4C */, /*15199*/{1498939392u,1224u,393216u,91259941u,466944u,3758620768u,1677793604u,541106176u,393216u}/* FB4D */, /*15200*/{1499463680u,1224u,393216u,91259941u,466944u,3758620768u,1677793652u,541106176u,393216u}/* FB4E */, /*15201*/{1499987968u,1224u,393217u,91259973u,466976u,3758620704u,1677865524u,272707584u,393216u}/* FB4F */, /*15202*/{1500512256u,1232u,458753u,76592389u,1515552u,3758620704u,1677794116u,138637312u,393216u}/* FB50 */, /*15203*/{1501036544u,1232u,458753u,76592357u,1515552u,3758620704u,1677794116u,138629120u,393216u}/* FB51 */, /*15204*/{1501560832u,1232u,458753u,76592389u,1515552u,3758620704u,1677794220u,138637312u,393216u}/* FB52 */, /*15205*/{1502085120u,1232u,458753u,76592357u,1515552u,3758620704u,1677794220u,138629120u,393216u}/* FB53 */, /*15206*/{1502609408u,1232u,458753u,76592293u,1515552u,3758620704u,1677794220u,138612736u,393216u}/* FB54 */, /*15207*/{1503133696u,1232u,458753u,76592325u,1515552u,3758620704u,1677794220u,138620928u,393216u}/* FB55 */, /*15208*/{1503657984u,1232u,458753u,76592389u,1515552u,3758620704u,1677794228u,138637312u,393216u}/* FB56 */, /*15209*/{1504182272u,1232u,458753u,76592357u,1515552u,3758620704u,1677794228u,138629120u,393216u}/* FB57 */, /*15210*/{1504706560u,1232u,458753u,76592293u,1515552u,3758620704u,1677794228u,138612736u,393216u}/* FB58 */, /*15211*/{1505230848u,1232u,458753u,76592325u,1515552u,3758620704u,1677794228u,138620928u,393216u}/* FB59 */, /*15212*/{1505755136u,1232u,458753u,76592389u,1515552u,3758620704u,1677794236u,138637312u,393216u}/* FB5A */, /*15213*/{1506279424u,1232u,458753u,76592357u,1515552u,3758620704u,1677794236u,138629120u,393216u}/* FB5B */, /*15214*/{1506803712u,1232u,458753u,76592293u,1515552u,3758620704u,1677794236u,138612736u,393216u}/* FB5C */, /*15215*/{1507328000u,1232u,458753u,76592325u,1515552u,3758620704u,1677794236u,138620928u,393216u}/* FB5D */, /*15216*/{1507852288u,1232u,458753u,76592389u,1515552u,3758620704u,1677794364u,138637312u,393216u}/* FB5E */, /*15217*/{1508376576u,1232u,458753u,76592357u,1515552u,3758620704u,1677794364u,138629120u,393216u}/* FB5F */, /*15218*/{1508900864u,1232u,458753u,76592293u,1515552u,3758620704u,1677794364u,138612736u,393216u}/* FB60 */, /*15219*/{1509425152u,1232u,458753u,76592325u,1515552u,3758620704u,1677794364u,138620928u,393216u}/* FB61 */, /*15220*/{1509949440u,1232u,458753u,76592389u,1515552u,3758620704u,1677794388u,138637312u,393216u}/* FB62 */, /*15221*/{1510473728u,1232u,458753u,76592357u,1515552u,3758620704u,1677794388u,138629120u,393216u}/* FB63 */, /*15222*/{1510998016u,1232u,458753u,76592293u,1515552u,3758620704u,1677794388u,138612736u,393216u}/* FB64 */, /*15223*/{1511522304u,1232u,458753u,76592325u,1515552u,3758620704u,1677794388u,138620928u,393216u}/* FB65 */, /*15224*/{1512046592u,1232u,458753u,76592389u,1515552u,3758620704u,1677794356u,138637312u,393216u}/* FB66 */, /*15225*/{1512570880u,1232u,458753u,76592357u,1515552u,3758620704u,1677794356u,138629120u,393216u}/* FB67 */, /*15226*/{1513095168u,1232u,458753u,76592293u,1515552u,3758620704u,1677794356u,138612736u,393216u}/* FB68 */, /*15227*/{1513619456u,1232u,458753u,76592325u,1515552u,3758620704u,1677794356u,138620928u,393216u}/* FB69 */, /*15228*/{1514143744u,1232u,458753u,76592389u,1515552u,3758620704u,1677795092u,138637312u,393216u}/* FB6A */, /*15229*/{1514668032u,1232u,458753u,76592357u,1515552u,3758620704u,1677795092u,138629120u,393216u}/* FB6B */, /*15230*/{1515192320u,1232u,458753u,76592293u,1515552u,3758620704u,1677795092u,138612736u,393216u}/* FB6C */, /*15231*/{1515716608u,1232u,458753u,76592325u,1515552u,3758620704u,1677795092u,138620928u,393216u}/* FB6D */, /*15232*/{1516240896u,1232u,458753u,76592389u,1515552u,3758620704u,1677795116u,138637312u,393216u}/* FB6E */, /*15233*/{1516765184u,1232u,458753u,76592357u,1515552u,3758620704u,1677795116u,138629120u,393216u}/* FB6F */, /*15234*/{1517289472u,1232u,458753u,76592293u,1515552u,3758620704u,1677795116u,138612736u,393216u}/* FB70 */, /*15235*/{1517813760u,1232u,458753u,76592325u,1515552u,3758620704u,1677795116u,138620928u,393216u}/* FB71 */, /*15236*/{1518338048u,1232u,458753u,76592389u,1515552u,3758620704u,1677794420u,138637312u,393216u}/* FB72 */, /*15237*/{1518862336u,1232u,458753u,76592357u,1515552u,3758620704u,1677794420u,138629120u,393216u}/* FB73 */, /*15238*/{1519386624u,1232u,458753u,76592293u,1515552u,3758620704u,1677794420u,138612736u,393216u}/* FB74 */, /*15239*/{1519910912u,1232u,458753u,76592325u,1515552u,3758620704u,1677794420u,138620928u,393216u}/* FB75 */, /*15240*/{1520435200u,1232u,458753u,76592389u,1515552u,3758620704u,1677794412u,138637312u,393216u}/* FB76 */, /*15241*/{1520959488u,1232u,458753u,76592357u,1515552u,3758620704u,1677794412u,138629120u,393216u}/* FB77 */, /*15242*/{1521483776u,1232u,458753u,76592293u,1515552u,3758620704u,1677794412u,138612736u,393216u}/* FB78 */, /*15243*/{1522008064u,1232u,458753u,76592325u,1515552u,3758620704u,1677794412u,138620928u,393216u}/* FB79 */, /*15244*/{1522532352u,1232u,458753u,76592389u,1515552u,3758620704u,1677794428u,138637312u,393216u}/* FB7A */, /*15245*/{1523056640u,1232u,458753u,76592357u,1515552u,3758620704u,1677794428u,138629120u,393216u}/* FB7B */, /*15246*/{1523580928u,1232u,458753u,76592293u,1515552u,3758620704u,1677794428u,138612736u,393216u}/* FB7C */, /*15247*/{1524105216u,1232u,458753u,76592325u,1515552u,3758620704u,1677794428u,138620928u,393216u}/* FB7D */, /*15248*/{1524629504u,1232u,458753u,76592389u,1515552u,3758620704u,1677794444u,138637312u,393216u}/* FB7E */, /*15249*/{1525153792u,1232u,458753u,76592357u,1515552u,3758620704u,1677794444u,138629120u,393216u}/* FB7F */, /*15250*/{1525678080u,1232u,458753u,76592293u,1515552u,3758620704u,1677794444u,138612736u,393216u}/* FB80 */, /*15251*/{1526202368u,1232u,458753u,76592325u,1515552u,3758620704u,1677794444u,138620928u,393216u}/* FB81 */, /*15252*/{1526726656u,1232u,458753u,76592389u,1515552u,3758620704u,1677794604u,138637312u,393216u}/* FB82 */, /*15253*/{1527250944u,1232u,458753u,76592357u,1515552u,3758620704u,1677794604u,138629120u,393216u}/* FB83 */, /*15254*/{1527775232u,1232u,458753u,76592389u,1515552u,3758620704u,1677794596u,138637312u,393216u}/* FB84 */, /*15255*/{1528299520u,1232u,458753u,76592357u,1515552u,3758620704u,1677794596u,138629120u,393216u}/* FB85 */, /*15256*/{1528823808u,1232u,458753u,76592389u,1515552u,3758620704u,1677794620u,138637312u,393216u}/* FB86 */, /*15257*/{1529348096u,1232u,458753u,76592357u,1515552u,3758620704u,1677794620u,138629120u,393216u}/* FB87 */, /*15258*/{1529872384u,1232u,458753u,76592389u,1515552u,3758620704u,1677794564u,138637312u,393216u}/* FB88 */, /*15259*/{1530396672u,1232u,458753u,76592357u,1515552u,3758620704u,1677794564u,138629120u,393216u}/* FB89 */, /*15260*/{1530920960u,1232u,458753u,76592389u,1515552u,3758620704u,1677794740u,138637312u,393216u}/* FB8A */, /*15261*/{1531445248u,1232u,458753u,76592357u,1515552u,3758620704u,1677794740u,138629120u,393216u}/* FB8B */, /*15262*/{1531969536u,1232u,458753u,76592389u,1515552u,3758620704u,1677794684u,138637312u,393216u}/* FB8C */, /*15263*/{1532493824u,1232u,458753u,76592357u,1515552u,3758620704u,1677794684u,138629120u,393216u}/* FB8D */, /*15264*/{1533018112u,1232u,458753u,76592389u,1515552u,3758620704u,1677795196u,138637312u,393216u}/* FB8E */, /*15265*/{1533542400u,1232u,458753u,76592357u,1515552u,3758620704u,1677795196u,138629120u,393216u}/* FB8F */, /*15266*/{1534066688u,1232u,458753u,76592293u,1515552u,3758620704u,1677795196u,138612736u,393216u}/* FB90 */, /*15267*/{1534590976u,1232u,458753u,76592325u,1515552u,3758620704u,1677795196u,138620928u,393216u}/* FB91 */, /*15268*/{1535115264u,1232u,458753u,76592389u,1515552u,3758620704u,1677795260u,138637312u,393216u}/* FB92 */, /*15269*/{1535639552u,1232u,458753u,76592357u,1515552u,3758620704u,1677795260u,138629120u,393216u}/* FB93 */, /*15270*/{1536163840u,1232u,458753u,76592293u,1515552u,3758620704u,1677795260u,138612736u,393216u}/* FB94 */, /*15271*/{1536688128u,1232u,458753u,76592325u,1515552u,3758620704u,1677795260u,138620928u,393216u}/* FB95 */, /*15272*/{1537212416u,1232u,458753u,76592389u,1515552u,3758620704u,1677795300u,138637312u,393216u}/* FB96 */, /*15273*/{1537736704u,1232u,458753u,76592357u,1515552u,3758620704u,1677795300u,138629120u,393216u}/* FB97 */, /*15274*/{1538260992u,1232u,458753u,76592293u,1515552u,3758620704u,1677795300u,138612736u,393216u}/* FB98 */, /*15275*/{1538785280u,1232u,458753u,76592325u,1515552u,3758620704u,1677795300u,138620928u,393216u}/* FB99 */, /*15276*/{1539309568u,1232u,458753u,76592389u,1515552u,3758620704u,1677795284u,138637312u,393216u}/* FB9A */, /*15277*/{1539833856u,1232u,458753u,76592357u,1515552u,3758620704u,1677795284u,138629120u,393216u}/* FB9B */, /*15278*/{1540358144u,1232u,458753u,76592293u,1515552u,3758620704u,1677795284u,138612736u,393216u}/* FB9C */, /*15279*/{1540882432u,1232u,458753u,76592325u,1515552u,3758620704u,1677795284u,138620928u,393216u}/* FB9D */, /*15280*/{1541406720u,1232u,458753u,76592389u,1515552u,3758620704u,1677795452u,138637312u,393216u}/* FB9E */, /*15281*/{1541931008u,1232u,458753u,76592357u,1515552u,3758620704u,1677795452u,138629120u,393216u}/* FB9F */, /*15282*/{1542455296u,1232u,458753u,76592389u,1515552u,3758620704u,1677795468u,138637312u,393216u}/* FBA0 */, /*15283*/{1542979584u,1232u,458753u,76592357u,1515552u,3758620704u,1677795468u,138629120u,393216u}/* FBA1 */, /*15284*/{1543503872u,1232u,458753u,76592293u,1515552u,3758620704u,1677795468u,138612736u,393216u}/* FBA2 */, /*15285*/{1544028160u,1232u,458753u,76592325u,1515552u,3758620704u,1677795468u,138620928u,393216u}/* FBA3 */, /*15286*/{1544552448u,1232u,458753u,76592389u,1515552u,3758620704u,1677795564u,688304128u,393216u}/* FBA4 */, /*15287*/{1545076736u,1232u,458753u,76592357u,1515552u,3758620704u,1677795564u,688287744u,393216u}/* FBA5 */, /*15288*/{1545601024u,1232u,458753u,76592389u,1515552u,3758620704u,1677795540u,138637312u,393216u}/* FBA6 */, /*15289*/{1546125312u,1232u,458753u,76592357u,1515552u,3758620704u,1677795540u,138629120u,393216u}/* FBA7 */, /*15290*/{1546649600u,1232u,458753u,76592293u,1515552u,3758620704u,1677795540u,138612736u,393216u}/* FBA8 */, /*15291*/{1547173888u,1232u,458753u,76592325u,1515552u,3758620704u,1677795540u,138620928u,393216u}/* FBA9 */, /*15292*/{1547698176u,1232u,458753u,76592389u,1515552u,3758620704u,1677795532u,138637312u,393216u}/* FBAA */, /*15293*/{1548222464u,1232u,458753u,76592357u,1515552u,3758620704u,1677795532u,138629120u,393216u}/* FBAB */, /*15294*/{1548746752u,1232u,458753u,76592293u,1515552u,3758620704u,1677795532u,138612736u,393216u}/* FBAC */, /*15295*/{1549271040u,1232u,458753u,76592325u,1515552u,3758620704u,1677795532u,138620928u,393216u}/* FBAD */, /*15296*/{1549795328u,1232u,458753u,76592389u,1515552u,3758620704u,1677795804u,138637312u,393216u}/* FBAE */, /*15297*/{1550319616u,1232u,458753u,76592357u,1515552u,3758620704u,1677795804u,138629120u,393216u}/* FBAF */, /*15298*/{1550843904u,1232u,458753u,76592389u,1515552u,3758620704u,1677795804u,688304128u,393216u}/* FBB0 */, /*15299*/{1551368192u,1232u,458753u,76592357u,1515552u,3758620704u,1677795804u,688287744u,393216u}/* FBB1 */, /*15300*/{0,1232u,458753u,76952602u,40u,1627389984u,10444u,138442752u,67108864u}/* FBB2 */, /*15301*/{0,1232u,458753u,76952602u,40u,1627389984u,10452u,138442752u,67108864u}/* FBB3 */, /*15302*/{0,1232u,458753u,76952602u,40u,1627389984u,10460u,138442752u,67108864u}/* FBB4 */, /*15303*/{0,1232u,458753u,76952602u,40u,1627389984u,10468u,138442752u,67108864u}/* FBB5 */, /*15304*/{0,1232u,458753u,76952602u,40u,1627389984u,10476u,138442752u,67108864u}/* FBB6 */, /*15305*/{0,1232u,458753u,76952602u,40u,1627389984u,10484u,138442752u,67108864u}/* FBB7 */, /*15306*/{0,1232u,458753u,76952602u,40u,1627389984u,10492u,138442752u,67108864u}/* FBB8 */, /*15307*/{0,1232u,458753u,76952602u,40u,1627389984u,10500u,138442752u,67108864u}/* FBB9 */, /*15308*/{0,1232u,458753u,76952602u,40u,1627389984u,10508u,138442752u,67108864u}/* FBBA */, /*15309*/{0,1232u,458753u,76952602u,40u,1627389984u,10516u,138442752u,67108864u}/* FBBB */, /*15310*/{0,1232u,458753u,76952602u,40u,1627389984u,10524u,138442752u,67108864u}/* FBBC */, /*15311*/{0,1232u,458753u,76952602u,40u,1627389984u,10532u,138442752u,67108864u}/* FBBD */, /*15312*/{0,1232u,458753u,76952602u,40u,1627389984u,10540u,138442752u,67108864u}/* FBBE */, /*15313*/{0,1232u,458753u,76952602u,40u,1627389984u,10548u,138442752u,67108864u}/* FBBF */, /*15314*/{0,1232u,458753u,76952602u,40u,1627389984u,10556u,138442752u,67108864u}/* FBC0 */, /*15315*/{0,1232u,458753u,76952602u,40u,1627389984u,10564u,138442752u,67108864u}/* FBC1 */, /*15316*/{1551892480u,1232u,458753u,76592389u,1515552u,3758620704u,1677795236u,138637312u,393216u}/* FBD3 */, /*15317*/{1552416768u,1232u,458753u,76592357u,1515552u,3758620704u,1677795236u,138629120u,393216u}/* FBD4 */, /*15318*/{1552941056u,1232u,458753u,76592293u,1515552u,3758620704u,1677795236u,138612736u,393216u}/* FBD5 */, /*15319*/{1553465344u,1232u,458753u,76592325u,1515552u,3758620704u,1677795236u,138620928u,393216u}/* FBD6 */, /*15320*/{1553989632u,1232u,458753u,76592389u,1515552u,3758620704u,1677795604u,138637312u,393216u}/* FBD7 */, /*15321*/{1554513920u,1232u,458753u,76592357u,1515552u,3758620704u,1677795604u,138629120u,393216u}/* FBD8 */, /*15322*/{1555038208u,1232u,458753u,76592389u,1515552u,3758620704u,1677795596u,138637312u,393216u}/* FBD9 */, /*15323*/{1555562496u,1232u,458753u,76592357u,1515552u,3758620704u,1677795596u,138629120u,393216u}/* FBDA */, /*15324*/{1556086784u,1232u,458753u,76592389u,1515552u,3758620704u,1677795612u,138637312u,393216u}/* FBDB */, /*15325*/{1556611072u,1232u,458753u,76592357u,1515552u,3758620704u,1677795612u,138629120u,393216u}/* FBDC */, /*15326*/{1557135360u,1232u,458753u,76592389u,1515552u,3758620704u,1677868076u,273068032u,393216u}/* FBDD */, /*15327*/{1557659648u,1232u,458753u,76592389u,1515552u,3758620704u,1677795636u,138637312u,393216u}/* FBDE */, /*15328*/{1558183936u,1232u,458753u,76592357u,1515552u,3758620704u,1677795636u,138629120u,393216u}/* FBDF */, /*15329*/{1558708224u,1232u,458753u,76592389u,1515552u,3758620704u,1677795588u,138637312u,393216u}/* FBE0 */, /*15330*/{1559232512u,1232u,458753u,76592357u,1515552u,3758620704u,1677795588u,138629120u,393216u}/* FBE1 */, /*15331*/{1559756800u,1232u,458753u,76592389u,1515552u,3758620704u,1677795620u,138637312u,393216u}/* FBE2 */, /*15332*/{1560281088u,1232u,458753u,76592357u,1515552u,3758620704u,1677795620u,138629120u,393216u}/* FBE3 */, /*15333*/{1560805376u,1232u,458753u,76592389u,1515552u,3758620704u,1677795724u,138637312u,393216u}/* FBE4 */, /*15334*/{1561329664u,1232u,458753u,76592357u,1515552u,3758620704u,1677795724u,138629120u,393216u}/* FBE5 */, /*15335*/{1561853952u,1232u,458753u,76592293u,1515552u,3758620704u,1677795724u,138612736u,393216u}/* FBE6 */, /*15336*/{1562378240u,1232u,458753u,76592325u,1515552u,3758620704u,1677795724u,138620928u,393216u}/* FBE7 */, /*15337*/{1562902528u,1232u,458753u,76592293u,1515552u,3758620704u,1677795684u,138612736u,393216u}/* FBE8 */, /*15338*/{1563426816u,1232u,458753u,76592325u,1515552u,3758620704u,1677795684u,138620928u,393216u}/* FBE9 */, /*15339*/{1563951104u,1232u,458753u,76592389u,1515552u,3758620704u,1677866748u,273068032u,393216u}/* FBEA */, /*15340*/{1564475392u,1232u,458753u,76592357u,1515552u,3758620704u,1677866748u,273051648u,393216u}/* FBEB */, /*15341*/{1564999680u,1232u,458753u,76592389u,1515552u,3758620704u,1677868116u,273068032u,393216u}/* FBEC */, /*15342*/{1565523968u,1232u,458753u,76592357u,1515552u,3758620704u,1677868116u,273051648u,393216u}/* FBED */, /*15343*/{1566048256u,1232u,458753u,76592389u,1515552u,3758620704u,1677868124u,273068032u,393216u}/* FBEE */, /*15344*/{1566572544u,1232u,458753u,76592357u,1515552u,3758620704u,1677868124u,273051648u,393216u}/* FBEF */, /*15345*/{1567096832u,1232u,458753u,76592389u,1515552u,3758620704u,1677868156u,273068032u,393216u}/* FBF0 */, /*15346*/{1567621120u,1232u,458753u,76592357u,1515552u,3758620704u,1677868156u,273051648u,393216u}/* FBF1 */, /*15347*/{1568145408u,1232u,458753u,76592389u,1515552u,3758620704u,1677868148u,273068032u,393216u}/* FBF2 */, /*15348*/{1568669696u,1232u,458753u,76592357u,1515552u,3758620704u,1677868148u,273051648u,393216u}/* FBF3 */, /*15349*/{1569193984u,1232u,458753u,76592389u,1515552u,3758620704u,1677868164u,273068032u,393216u}/* FBF4 */, /*15350*/{1569718272u,1232u,458753u,76592357u,1515552u,3758620704u,1677868164u,273051648u,393216u}/* FBF5 */, /*15351*/{1570242560u,1232u,458753u,76592389u,1515552u,3758620704u,1677868276u,273068032u,393216u}/* FBF6 */, /*15352*/{1570766848u,1232u,458753u,76592357u,1515552u,3758620704u,1677868276u,273051648u,393216u}/* FBF7 */, /*15353*/{1571291136u,1232u,458753u,76592293u,1515552u,3758620704u,1677868276u,273018880u,393216u}/* FBF8 */, /*15354*/{1571815424u,1232u,458753u,76592389u,1515552u,3758620704u,1677868236u,273068032u,393216u}/* FBF9 */, /*15355*/{1572339712u,1232u,458753u,76592357u,1515552u,3758620704u,1677868236u,273051648u,393216u}/* FBFA */, /*15356*/{1572864000u,1232u,458753u,76592293u,1515552u,3758620704u,1677868236u,273018880u,393216u}/* FBFB */, /*15357*/{1573388288u,1232u,458753u,76592389u,1515552u,3758620704u,1677795700u,138637312u,393216u}/* FBFC */, /*15358*/{1573912576u,1232u,458753u,76592357u,1515552u,3758620704u,1677795700u,138629120u,393216u}/* FBFD */, /*15359*/{1574436864u,1232u,458753u,76592293u,1515552u,3758620704u,1677795700u,138612736u,393216u}/* FBFE */, /*15360*/{1574961152u,1232u,458753u,76592325u,1515552u,3758620704u,1677795700u,138620928u,393216u}/* FBFF */, /*15361*/{1575485440u,1232u,458753u,76592389u,1515552u,3758620704u,1677866956u,273068032u,393216u}/* FC00 */, /*15362*/{1576009728u,1232u,458753u,76592389u,1515552u,3758620704u,1677867012u,273068032u,393216u}/* FC01 */, /*15363*/{1576534016u,1232u,458753u,76592389u,1515552u,3758620704u,1677867964u,273068032u,393216u}/* FC02 */, /*15364*/{1577058304u,1232u,458753u,76592389u,1515552u,3758620704u,1677868236u,273068032u,393216u}/* FC03 */, /*15365*/{1577582592u,1232u,458753u,76592389u,1515552u,3758620704u,1677868244u,273068032u,393216u}/* FC04 */, /*15366*/{1578106880u,1232u,458753u,76592389u,1515552u,3758620704u,1677867004u,273068032u,393216u}/* FC05 */, /*15367*/{1578631168u,1232u,458753u,76592389u,1515552u,3758620704u,1677867060u,273068032u,393216u}/* FC06 */, /*15368*/{1579155456u,1232u,458753u,76592389u,1515552u,3758620704u,1677867068u,273068032u,393216u}/* FC07 */, /*15369*/{1579679744u,1232u,458753u,76592389u,1515552u,3758620704u,1677868012u,273068032u,393216u}/* FC08 */, /*15370*/{1580204032u,1232u,458753u,76592389u,1515552u,3758620704u,1677868284u,273068032u,393216u}/* FC09 */, /*15371*/{1580728320u,1232u,458753u,76592389u,1515552u,3758620704u,1677868292u,273068032u,393216u}/* FC0A */, /*15372*/{1581252608u,1232u,458753u,76592389u,1515552u,3758620704u,1677867132u,273068032u,393216u}/* FC0B */, /*15373*/{1581776896u,1232u,458753u,76592389u,1515552u,3758620704u,1677867188u,273068032u,393216u}/* FC0C */, /*15374*/{1582301184u,1232u,458753u,76592389u,1515552u,3758620704u,1677867196u,273068032u,393216u}/* FC0D */, /*15375*/{1582825472u,1232u,458753u,76592389u,1515552u,3758620704u,1677868140u,273068032u,393216u}/* FC0E */, /*15376*/{1583349760u,1232u,458753u,76592389u,1515552u,3758620704u,1677868412u,273068032u,393216u}/* FC0F */, /*15377*/{1583874048u,1232u,458753u,76592389u,1515552u,3758620704u,1677868420u,273068032u,393216u}/* FC10 */, /*15378*/{1584398336u,1232u,458753u,76592389u,1515552u,3758620704u,1677867140u,273068032u,393216u}/* FC11 */, /*15379*/{1584922624u,1232u,458753u,76592389u,1515552u,3758620704u,1677868148u,273068032u,393216u}/* FC12 */, /*15380*/{1585446912u,1232u,458753u,76592389u,1515552u,3758620704u,1677868420u,273068032u,393216u}/* FC13 */, /*15381*/{1585971200u,1232u,458753u,76592389u,1515552u,3758620704u,1677868428u,273068032u,393216u}/* FC14 */, /*15382*/{1586495488u,1232u,458753u,76592389u,1515552u,3758620704u,1677867252u,273068032u,393216u}/* FC15 */, /*15383*/{1587019776u,1232u,458753u,76592389u,1515552u,3758620704u,1677868204u,273068032u,393216u}/* FC16 */, /*15384*/{1587544064u,1232u,458753u,76592389u,1515552u,3758620704u,1677867252u,273068032u,393216u}/* FC17 */, /*15385*/{1588068352u,1232u,458753u,76592389u,1515552u,3758620704u,1677868260u,273068032u,393216u}/* FC18 */, /*15386*/{1588592640u,1232u,458753u,76592389u,1515552u,3758620704u,1677867260u,273068032u,393216u}/* FC19 */, /*15387*/{1589116928u,1232u,458753u,76592389u,1515552u,3758620704u,1677867316u,273068032u,393216u}/* FC1A */, /*15388*/{1589641216u,1232u,458753u,76592389u,1515552u,3758620704u,1677868268u,273068032u,393216u}/* FC1B */, /*15389*/{1590165504u,1232u,458753u,76592389u,1515552u,3758620704u,1677867612u,273068032u,393216u}/* FC1C */, /*15390*/{1590689792u,1232u,458753u,76592389u,1515552u,3758620704u,1677867668u,273068032u,393216u}/* FC1D */, /*15391*/{1591214080u,1232u,458753u,76592389u,1515552u,3758620704u,1677867676u,273068032u,393216u}/* FC1E */, /*15392*/{1591738368u,1232u,458753u,76592389u,1515552u,3758620704u,1677868620u,273068032u,393216u}/* FC1F */, /*15393*/{1592262656u,1232u,458753u,76592389u,1515552u,3758620704u,1677867756u,273068032u,393216u}/* FC20 */, /*15394*/{1592786944u,1232u,458753u,76592389u,1515552u,3758620704u,1677868708u,273068032u,393216u}/* FC21 */, /*15395*/{1593311232u,1232u,458753u,76592389u,1515552u,3758620704u,1677867708u,273068032u,393216u}/* FC22 */, /*15396*/{1593835520u,1232u,458753u,76592389u,1515552u,3758620704u,1677867764u,273068032u,393216u}/* FC23 */, /*15397*/{1594359808u,1232u,458753u,76592389u,1515552u,3758620704u,1677867772u,273068032u,393216u}/* FC24 */, /*15398*/{1594884096u,1232u,458753u,76592389u,1515552u,3758620704u,1677868716u,273068032u,393216u}/* FC25 */, /*15399*/{1595408384u,1232u,458753u,76592389u,1515552u,3758620704u,1677867804u,273068032u,393216u}/* FC26 */, /*15400*/{1595932672u,1232u,458753u,76592389u,1515552u,3758620704u,1677868756u,273068032u,393216u}/* FC27 */, /*15401*/{1596456960u,1232u,458753u,76592389u,1515552u,3758620704u,1677868764u,273068032u,393216u}/* FC28 */, /*15402*/{1596981248u,1232u,458753u,76592389u,1515552u,3758620704u,1677867780u,273068032u,393216u}/* FC29 */, /*15403*/{1597505536u,1232u,458753u,76592389u,1515552u,3758620704u,1677868788u,273068032u,393216u}/* FC2A */, /*15404*/{1598029824u,1232u,458753u,76592389u,1515552u,3758620704u,1677867788u,273068032u,393216u}/* FC2B */, /*15405*/{1598554112u,1232u,458753u,76592389u,1515552u,3758620704u,1677868796u,273068032u,393216u}/* FC2C */, /*15406*/{1599078400u,1232u,458753u,76592389u,1515552u,3758620704u,1677867844u,273068032u,393216u}/* FC2D */, /*15407*/{1599602688u,1232u,458753u,76592389u,1515552u,3758620704u,1677867900u,273068032u,393216u}/* FC2E */, /*15408*/{1600126976u,1232u,458753u,76592389u,1515552u,3758620704u,1677867908u,273068032u,393216u}/* FC2F */, /*15409*/{1600651264u,1232u,458753u,76592389u,1515552u,3758620704u,1677868852u,273068032u,393216u}/* FC30 */, /*15410*/{1601175552u,1232u,458753u,76592389u,1515552u,3758620704u,1677869124u,273068032u,393216u}/* FC31 */, /*15411*/{1601699840u,1232u,458753u,76592389u,1515552u,3758620704u,1677869132u,273068032u,393216u}/* FC32 */, /*15412*/{1602224128u,1232u,458753u,76592389u,1515552u,3758620704u,1677867996u,273068032u,393216u}/* FC33 */, /*15413*/{1602748416u,1232u,458753u,76592389u,1515552u,3758620704u,1677868948u,273068032u,393216u}/* FC34 */, /*15414*/{1603272704u,1232u,458753u,76592389u,1515552u,3758620704u,1677869220u,273068032u,393216u}/* FC35 */, /*15415*/{1603796992u,1232u,458753u,76592389u,1515552u,3758620704u,1677869228u,273068032u,393216u}/* FC36 */, /*15416*/{1604321280u,1232u,458753u,76592389u,1515552u,3758620704u,1677867772u,273068032u,393216u}/* FC37 */, /*15417*/{1604845568u,1232u,458753u,76592389u,1515552u,3758620704u,1677867980u,273068032u,393216u}/* FC38 */, /*15418*/{1605369856u,1232u,458753u,76592389u,1515552u,3758620704u,1677868036u,273068032u,393216u}/* FC39 */, /*15419*/{1605894144u,1232u,458753u,76592389u,1515552u,3758620704u,1677868044u,273068032u,393216u}/* FC3A */, /*15420*/{1606418432u,1232u,458753u,76592389u,1515552u,3758620704u,1677868932u,273068032u,393216u}/* FC3B */, /*15421*/{1606942720u,1232u,458753u,76592389u,1515552u,3758620704u,1677868988u,273068032u,393216u}/* FC3C */, /*15422*/{1607467008u,1232u,458753u,76592389u,1515552u,3758620704u,1677869260u,273068032u,393216u}/* FC3D */, /*15423*/{1607991296u,1232u,458753u,76592389u,1515552u,3758620704u,1677869268u,273068032u,393216u}/* FC3E */, /*15424*/{1608515584u,1232u,458753u,76592389u,1515552u,3758620704u,1677868148u,273068032u,393216u}/* FC3F */, /*15425*/{1609039872u,1232u,458753u,76592389u,1515552u,3758620704u,1677868204u,273068032u,393216u}/* FC40 */, /*15426*/{1609564160u,1232u,458753u,76592389u,1515552u,3758620704u,1677868212u,273068032u,393216u}/* FC41 */, /*15427*/{1610088448u,1232u,458753u,76592389u,1515552u,3758620704u,1677869156u,273068032u,393216u}/* FC42 */, /*15428*/{1610612736u,1232u,458753u,76592389u,1515552u,3758620704u,1677869428u,273068032u,393216u}/* FC43 */, /*15429*/{1611137024u,1232u,458753u,76592389u,1515552u,3758620704u,1677869436u,273068032u,393216u}/* FC44 */, /*15430*/{1611661312u,1232u,458753u,76592389u,1515552u,3758620704u,1677868204u,273068032u,393216u}/* FC45 */, /*15431*/{1612185600u,1232u,458753u,76592389u,1515552u,3758620704u,1677868260u,273068032u,393216u}/* FC46 */, /*15432*/{1612709888u,1232u,458753u,76592389u,1515552u,3758620704u,1677868268u,273068032u,393216u}/* FC47 */, /*15433*/{1613234176u,1232u,458753u,76592389u,1515552u,3758620704u,1677869212u,273068032u,393216u}/* FC48 */, /*15434*/{1613758464u,1232u,458753u,76592389u,1515552u,3758620704u,1677869484u,273068032u,393216u}/* FC49 */, /*15435*/{1614282752u,1232u,458753u,76592389u,1515552u,3758620704u,1677869492u,273068032u,393216u}/* FC4A */, /*15436*/{1614807040u,1232u,458753u,76592389u,1515552u,3758620704u,1677868236u,273068032u,393216u}/* FC4B */, /*15437*/{1615331328u,1232u,458753u,76592389u,1515552u,3758620704u,1677868292u,273068032u,393216u}/* FC4C */, /*15438*/{1615855616u,1232u,458753u,76592389u,1515552u,3758620704u,1677868300u,273068032u,393216u}/* FC4D */, /*15439*/{1616379904u,1232u,458753u,76592389u,1515552u,3758620704u,1677869244u,273068032u,393216u}/* FC4E */, /*15440*/{1616904192u,1232u,458753u,76592389u,1515552u,3758620704u,1677869516u,273068032u,393216u}/* FC4F */, /*15441*/{1617428480u,1232u,458753u,76592389u,1515552u,3758620704u,1677869524u,273068032u,393216u}/* FC50 */, /*15442*/{1617952768u,1232u,458753u,76592389u,1515552u,3758620704u,1677868316u,273068032u,393216u}/* FC51 */, /*15443*/{1618477056u,1232u,458753u,76592389u,1515552u,3758620704u,1677869324u,273068032u,393216u}/* FC52 */, /*15444*/{1619001344u,1232u,458753u,76592389u,1515552u,3758620704u,1677869596u,273068032u,393216u}/* FC53 */, /*15445*/{1619525632u,1232u,458753u,76592389u,1515552u,3758620704u,1677869604u,273068032u,393216u}/* FC54 */, /*15446*/{1620049920u,1232u,458753u,76592389u,1515552u,3758620704u,1677868484u,273068032u,393216u}/* FC55 */, /*15447*/{1620574208u,1232u,458753u,76592389u,1515552u,3758620704u,1677868540u,273068032u,393216u}/* FC56 */, /*15448*/{1621098496u,1232u,458753u,76592389u,1515552u,3758620704u,1677868548u,273068032u,393216u}/* FC57 */, /*15449*/{1621622784u,1232u,458753u,76592389u,1515552u,3758620704u,1677869492u,273068032u,393216u}/* FC58 */, /*15450*/{1622147072u,1232u,458753u,76592389u,1515552u,3758620704u,1677869764u,273068032u,393216u}/* FC59 */, /*15451*/{1622671360u,1232u,458753u,76592389u,1515552u,3758620704u,1677869772u,273068032u,393216u}/* FC5A */, /*15452*/{1623195648u,1232u,458753u,76592389u,1515552u,3758620704u,1677794556u,776384512u,393216u}/* FC5B */, /*15453*/{1623719936u,1232u,458753u,76592389u,1515552u,3758620704u,1677794668u,776384512u,393216u}/* FC5C */, /*15454*/{1624244224u,1232u,458753u,76592389u,1515552u,3758620704u,1677795684u,776384512u,393216u}/* FC5D */, /*15455*/{1624768512u,1232u,458753u,76592389u,1515552u,3758620704u,1677721612u,1011265536u,0}/* FC5E */, /*15456*/{1625292800u,1232u,458753u,76592389u,1515552u,3758620704u,1677721612u,1023848448u,0}/* FC5F */, /*15457*/{1625817088u,1232u,458753u,76592389u,1515552u,3758620704u,1677721612u,1036431360u,0}/* FC60 */, /*15458*/{1626341376u,1232u,458753u,76592389u,1515552u,3758620704u,1677721612u,1053208576u,0}/* FC61 */, /*15459*/{1626865664u,1232u,458753u,76592389u,1515552u,3758620704u,1677721612u,1065791488u,0}/* FC62 */, /*15460*/{1627389952u,1232u,458753u,76592389u,1515552u,3758620704u,1677721612u,1179037696u,0}/* FC63 */, /*15461*/{1627914240u,1232u,458753u,76592357u,1515552u,3758620704u,1677867220u,273051648u,393216u}/* FC64 */, /*15462*/{1628438528u,1232u,458753u,76592357u,1515552u,3758620704u,1677867228u,273051648u,393216u}/* FC65 */, /*15463*/{1628962816u,1232u,458753u,76592357u,1515552u,3758620704u,1677867964u,273051648u,393216u}/* FC66 */, /*15464*/{1629487104u,1232u,458753u,76592357u,1515552u,3758620704u,1677867996u,273051648u,393216u}/* FC67 */, /*15465*/{1630011392u,1232u,458753u,76592357u,1515552u,3758620704u,1677868236u,273051648u,393216u}/* FC68 */, /*15466*/{1630535680u,1232u,458753u,76592357u,1515552u,3758620704u,1677868244u,273051648u,393216u}/* FC69 */, /*15467*/{1631059968u,1232u,458753u,76592357u,1515552u,3758620704u,1677867268u,273051648u,393216u}/* FC6A */, /*15468*/{1631584256u,1232u,458753u,76592357u,1515552u,3758620704u,1677867276u,273051648u,393216u}/* FC6B */, /*15469*/{1632108544u,1232u,458753u,76592357u,1515552u,3758620704u,1677868012u,273051648u,393216u}/* FC6C */, /*15470*/{1632632832u,1232u,458753u,76592357u,1515552u,3758620704u,1677868044u,273051648u,393216u}/* FC6D */, /*15471*/{1633157120u,1232u,458753u,76592357u,1515552u,3758620704u,1677868284u,273051648u,393216u}/* FC6E */, /*15472*/{1633681408u,1232u,458753u,76592357u,1515552u,3758620704u,1677868292u,273051648u,393216u}/* FC6F */, /*15473*/{1634205696u,1232u,458753u,76592357u,1515552u,3758620704u,1677867396u,273051648u,393216u}/* FC70 */, /*15474*/{1634729984u,1232u,458753u,76592357u,1515552u,3758620704u,1677867404u,273051648u,393216u}/* FC71 */, /*15475*/{1635254272u,1232u,458753u,76592357u,1515552u,3758620704u,1677868140u,273051648u,393216u}/* FC72 */, /*15476*/{1635778560u,1232u,458753u,76592357u,1515552u,3758620704u,1677868172u,273051648u,393216u}/* FC73 */, /*15477*/{1636302848u,1232u,458753u,76592357u,1515552u,3758620704u,1677868412u,273051648u,393216u}/* FC74 */, /*15478*/{1636827136u,1232u,458753u,76592357u,1515552u,3758620704u,1677868420u,273051648u,393216u}/* FC75 */, /*15479*/{1637351424u,1232u,458753u,76592357u,1515552u,3758620704u,1677867404u,273051648u,393216u}/* FC76 */, /*15480*/{1637875712u,1232u,458753u,76592357u,1515552u,3758620704u,1677867412u,273051648u,393216u}/* FC77 */, /*15481*/{1638400000u,1232u,458753u,76592357u,1515552u,3758620704u,1677868148u,273051648u,393216u}/* FC78 */, /*15482*/{1638924288u,1232u,458753u,76592357u,1515552u,3758620704u,1677868180u,273051648u,393216u}/* FC79 */, /*15483*/{1639448576u,1232u,458753u,76592357u,1515552u,3758620704u,1677868420u,273051648u,393216u}/* FC7A */, /*15484*/{1639972864u,1232u,458753u,76592357u,1515552u,3758620704u,1677868428u,273051648u,393216u}/* FC7B */, /*15485*/{1640497152u,1232u,458753u,76592357u,1515552u,3758620704u,1677869124u,273051648u,393216u}/* FC7C */, /*15486*/{1641021440u,1232u,458753u,76592357u,1515552u,3758620704u,1677869132u,273051648u,393216u}/* FC7D */, /*15487*/{1641545728u,1232u,458753u,76592357u,1515552u,3758620704u,1677869220u,273051648u,393216u}/* FC7E */, /*15488*/{1642070016u,1232u,458753u,76592357u,1515552u,3758620704u,1677869228u,273051648u,393216u}/* FC7F */, /*15489*/{1642594304u,1232u,458753u,76592357u,1515552u,3758620704u,1677867772u,273051648u,393216u}/* FC80 */, /*15490*/{1643118592u,1232u,458753u,76592357u,1515552u,3758620704u,1677868932u,273051648u,393216u}/* FC81 */, /*15491*/{1643642880u,1232u,458753u,76592357u,1515552u,3758620704u,1677868988u,273051648u,393216u}/* FC82 */, /*15492*/{1644167168u,1232u,458753u,76592357u,1515552u,3758620704u,1677869260u,273051648u,393216u}/* FC83 */, /*15493*/{1644691456u,1232u,458753u,76592357u,1515552u,3758620704u,1677869268u,273051648u,393216u}/* FC84 */, /*15494*/{1645215744u,1232u,458753u,76592357u,1515552u,3758620704u,1677869156u,273051648u,393216u}/* FC85 */, /*15495*/{1645740032u,1232u,458753u,76592357u,1515552u,3758620704u,1677869428u,273051648u,393216u}/* FC86 */, /*15496*/{1646264320u,1232u,458753u,76592357u,1515552u,3758620704u,1677869436u,273051648u,393216u}/* FC87 */, /*15497*/{1646788608u,1232u,458753u,76592357u,1515552u,3758620704u,1677867996u,273051648u,393216u}/* FC88 */, /*15498*/{1647312896u,1232u,458753u,76592357u,1515552u,3758620704u,1677869212u,273051648u,393216u}/* FC89 */, /*15499*/{1647837184u,1232u,458753u,76592357u,1515552u,3758620704u,1677868500u,273051648u,393216u}/* FC8A */, /*15500*/{1648361472u,1232u,458753u,76592357u,1515552u,3758620704u,1677868508u,273051648u,393216u}/* FC8B */, /*15501*/{1648885760u,1232u,458753u,76592357u,1515552u,3758620704u,1677869244u,273051648u,393216u}/* FC8C */, /*15502*/{1649410048u,1232u,458753u,76592357u,1515552u,3758620704u,1677869276u,273051648u,393216u}/* FC8D */, /*15503*/{1649934336u,1232u,458753u,76592357u,1515552u,3758620704u,1677869516u,273051648u,393216u}/* FC8E */, /*15504*/{1650458624u,1232u,458753u,76592357u,1515552u,3758620704u,1677869524u,273051648u,393216u}/* FC8F */, /*15505*/{1650982912u,1232u,458753u,76592357u,1515552u,3758620704u,1677795684u,776368128u,393216u}/* FC90 */, /*15506*/{1651507200u,1232u,458753u,76592357u,1515552u,3758620704u,1677868748u,273051648u,393216u}/* FC91 */, /*15507*/{1652031488u,1232u,458753u,76592357u,1515552u,3758620704u,1677868756u,273051648u,393216u}/* FC92 */, /*15508*/{1652555776u,1232u,458753u,76592357u,1515552u,3758620704u,1677869492u,273051648u,393216u}/* FC93 */, /*15509*/{1653080064u,1232u,458753u,76592357u,1515552u,3758620704u,1677869524u,273051648u,393216u}/* FC94 */, /*15510*/{1653604352u,1232u,458753u,76592357u,1515552u,3758620704u,1677869764u,273051648u,393216u}/* FC95 */, /*15511*/{1654128640u,1232u,458753u,76592357u,1515552u,3758620704u,1677869772u,273051648u,393216u}/* FC96 */, /*15512*/{1654652928u,1232u,458753u,76592293u,1515552u,3758620704u,1677866956u,273018880u,393216u}/* FC97 */, /*15513*/{1655177216u,1232u,458753u,76592293u,1515552u,3758620704u,1677867012u,273018880u,393216u}/* FC98 */, /*15514*/{1655701504u,1232u,458753u,76592293u,1515552u,3758620704u,1677867020u,273018880u,393216u}/* FC99 */, /*15515*/{1656225792u,1232u,458753u,76592293u,1515552u,3758620704u,1677867964u,273018880u,393216u}/* FC9A */, /*15516*/{1656750080u,1232u,458753u,76592293u,1515552u,3758620704u,1677868076u,273018880u,393216u}/* FC9B */, /*15517*/{1657274368u,1232u,458753u,76592293u,1515552u,3758620704u,1677867004u,273018880u,393216u}/* FC9C */, /*15518*/{1657798656u,1232u,458753u,76592293u,1515552u,3758620704u,1677867060u,273018880u,393216u}/* FC9D */, /*15519*/{1658322944u,1232u,458753u,76592293u,1515552u,3758620704u,1677867068u,273018880u,393216u}/* FC9E */, /*15520*/{1658847232u,1232u,458753u,76592293u,1515552u,3758620704u,1677868012u,273018880u,393216u}/* FC9F */, /*15521*/{1659371520u,1232u,458753u,76592293u,1515552u,3758620704u,1677868124u,273018880u,393216u}/* FCA0 */, /*15522*/{1659895808u,1232u,458753u,76592293u,1515552u,3758620704u,1677867132u,273018880u,393216u}/* FCA1 */, /*15523*/{1660420096u,1232u,458753u,76592293u,1515552u,3758620704u,1677867188u,273018880u,393216u}/* FCA2 */, /*15524*/{1660944384u,1232u,458753u,76592293u,1515552u,3758620704u,1677867196u,273018880u,393216u}/* FCA3 */, /*15525*/{1661468672u,1232u,458753u,76592293u,1515552u,3758620704u,1677868140u,273018880u,393216u}/* FCA4 */, /*15526*/{1661992960u,1232u,458753u,76592293u,1515552u,3758620704u,1677868252u,273018880u,393216u}/* FCA5 */, /*15527*/{1662517248u,1232u,458753u,76592293u,1515552u,3758620704u,1677868148u,273018880u,393216u}/* FCA6 */, /*15528*/{1663041536u,1232u,458753u,76592293u,1515552u,3758620704u,1677867252u,273018880u,393216u}/* FCA7 */, /*15529*/{1663565824u,1232u,458753u,76592293u,1515552u,3758620704u,1677868204u,273018880u,393216u}/* FCA8 */, /*15530*/{1664090112u,1232u,458753u,76592293u,1515552u,3758620704u,1677867252u,273018880u,393216u}/* FCA9 */, /*15531*/{1664614400u,1232u,458753u,76592293u,1515552u,3758620704u,1677868260u,273018880u,393216u}/* FCAA */, /*15532*/{1665138688u,1232u,458753u,76592293u,1515552u,3758620704u,1677867260u,273018880u,393216u}/* FCAB */, /*15533*/{1665662976u,1232u,458753u,76592293u,1515552u,3758620704u,1677868268u,273018880u,393216u}/* FCAC */, /*15534*/{1666187264u,1232u,458753u,76592293u,1515552u,3758620704u,1677867612u,273018880u,393216u}/* FCAD */, /*15535*/{1666711552u,1232u,458753u,76592293u,1515552u,3758620704u,1677867668u,273018880u,393216u}/* FCAE */, /*15536*/{1667235840u,1232u,458753u,76592293u,1515552u,3758620704u,1677867676u,273018880u,393216u}/* FCAF */, /*15537*/{1667760128u,1232u,458753u,76592293u,1515552u,3758620704u,1677868620u,273018880u,393216u}/* FCB0 */, /*15538*/{1668284416u,1232u,458753u,76592293u,1515552u,3758620704u,1677867756u,273018880u,393216u}/* FCB1 */, /*15539*/{1668808704u,1232u,458753u,76592293u,1515552u,3758620704u,1677867764u,273018880u,393216u}/* FCB2 */, /*15540*/{1669332992u,1232u,458753u,76592293u,1515552u,3758620704u,1677868708u,273018880u,393216u}/* FCB3 */, /*15541*/{1669857280u,1232u,458753u,76592293u,1515552u,3758620704u,1677867708u,273018880u,393216u}/* FCB4 */, /*15542*/{1670381568u,1232u,458753u,76592293u,1515552u,3758620704u,1677867764u,273018880u,393216u}/* FCB5 */, /*15543*/{1670905856u,1232u,458753u,76592293u,1515552u,3758620704u,1677867772u,273018880u,393216u}/* FCB6 */, /*15544*/{1671430144u,1232u,458753u,76592293u,1515552u,3758620704u,1677868716u,273018880u,393216u}/* FCB7 */, /*15545*/{1671954432u,1232u,458753u,76592293u,1515552u,3758620704u,1677867804u,273018880u,393216u}/* FCB8 */, /*15546*/{1672478720u,1232u,458753u,76592293u,1515552u,3758620704u,1677868764u,273018880u,393216u}/* FCB9 */, /*15547*/{1673003008u,1232u,458753u,76592293u,1515552u,3758620704u,1677867780u,273018880u,393216u}/* FCBA */, /*15548*/{1673527296u,1232u,458753u,76592293u,1515552u,3758620704u,1677868788u,273018880u,393216u}/* FCBB */, /*15549*/{1674051584u,1232u,458753u,76592293u,1515552u,3758620704u,1677867788u,273018880u,393216u}/* FCBC */, /*15550*/{1674575872u,1232u,458753u,76592293u,1515552u,3758620704u,1677868796u,273018880u,393216u}/* FCBD */, /*15551*/{1675100160u,1232u,458753u,76592293u,1515552u,3758620704u,1677867844u,273018880u,393216u}/* FCBE */, /*15552*/{1675624448u,1232u,458753u,76592293u,1515552u,3758620704u,1677867900u,273018880u,393216u}/* FCBF */, /*15553*/{1676148736u,1232u,458753u,76592293u,1515552u,3758620704u,1677867908u,273018880u,393216u}/* FCC0 */, /*15554*/{1676673024u,1232u,458753u,76592293u,1515552u,3758620704u,1677868852u,273018880u,393216u}/* FCC1 */, /*15555*/{1677197312u,1232u,458753u,76592293u,1515552u,3758620704u,1677867996u,273018880u,393216u}/* FCC2 */, /*15556*/{1677721600u,1232u,458753u,76592293u,1515552u,3758620704u,1677868948u,273018880u,393216u}/* FCC3 */, /*15557*/{1678245888u,1232u,458753u,76592293u,1515552u,3758620704u,1677867980u,273018880u,393216u}/* FCC4 */, /*15558*/{1678770176u,1232u,458753u,76592293u,1515552u,3758620704u,1677868036u,273018880u,393216u}/* FCC5 */, /*15559*/{1679294464u,1232u,458753u,76592293u,1515552u,3758620704u,1677868044u,273018880u,393216u}/* FCC6 */, /*15560*/{1679818752u,1232u,458753u,76592293u,1515552u,3758620704u,1677868932u,273018880u,393216u}/* FCC7 */, /*15561*/{1680343040u,1232u,458753u,76592293u,1515552u,3758620704u,1677868988u,273018880u,393216u}/* FCC8 */, /*15562*/{1680867328u,1232u,458753u,76592293u,1515552u,3758620704u,1677868148u,273018880u,393216u}/* FCC9 */, /*15563*/{1681391616u,1232u,458753u,76592293u,1515552u,3758620704u,1677868204u,273018880u,393216u}/* FCCA */, /*15564*/{1681915904u,1232u,458753u,76592293u,1515552u,3758620704u,1677868212u,273018880u,393216u}/* FCCB */, /*15565*/{1682440192u,1232u,458753u,76592293u,1515552u,3758620704u,1677869156u,273018880u,393216u}/* FCCC */, /*15566*/{1682964480u,1232u,458753u,76592293u,1515552u,3758620704u,1677869268u,273018880u,393216u}/* FCCD */, /*15567*/{1683488768u,1232u,458753u,76592293u,1515552u,3758620704u,1677868204u,273018880u,393216u}/* FCCE */, /*15568*/{1684013056u,1232u,458753u,76592293u,1515552u,3758620704u,1677868260u,273018880u,393216u}/* FCCF */, /*15569*/{1684537344u,1232u,458753u,76592293u,1515552u,3758620704u,1677868268u,273018880u,393216u}/* FCD0 */, /*15570*/{1685061632u,1232u,458753u,76592293u,1515552u,3758620704u,1677869212u,273018880u,393216u}/* FCD1 */, /*15571*/{1685585920u,1232u,458753u,76592293u,1515552u,3758620704u,1677868236u,273018880u,393216u}/* FCD2 */, /*15572*/{1686110208u,1232u,458753u,76592293u,1515552u,3758620704u,1677868292u,273018880u,393216u}/* FCD3 */, /*15573*/{1686634496u,1232u,458753u,76592293u,1515552u,3758620704u,1677868300u,273018880u,393216u}/* FCD4 */, /*15574*/{1687158784u,1232u,458753u,76592293u,1515552u,3758620704u,1677869244u,273018880u,393216u}/* FCD5 */, /*15575*/{1687683072u,1232u,458753u,76592293u,1515552u,3758620704u,1677869356u,273018880u,393216u}/* FCD6 */, /*15576*/{1688207360u,1232u,458753u,76592293u,1515552u,3758620704u,1677868316u,273018880u,393216u}/* FCD7 */, /*15577*/{1688731648u,1232u,458753u,76592293u,1515552u,3758620704u,1677869324u,273018880u,393216u}/* FCD8 */, /*15578*/{1689255936u,1232u,458753u,76592293u,1515552u,3758620704u,1677795524u,776335360u,393216u}/* FCD9 */, /*15579*/{1689780224u,1232u,458753u,76592293u,1515552u,3758620704u,1677868484u,273018880u,393216u}/* FCDA */, /*15580*/{1690304512u,1232u,458753u,76592293u,1515552u,3758620704u,1677868540u,273018880u,393216u}/* FCDB */, /*15581*/{1690828800u,1232u,458753u,76592293u,1515552u,3758620704u,1677868548u,273018880u,393216u}/* FCDC */, /*15582*/{1691353088u,1232u,458753u,76592293u,1515552u,3758620704u,1677869492u,273018880u,393216u}/* FCDD */, /*15583*/{1691877376u,1232u,458753u,76592293u,1515552u,3758620704u,1677869604u,273018880u,393216u}/* FCDE */, /*15584*/{1692401664u,1232u,458753u,76592325u,1515552u,3758620704u,1677867964u,273035264u,393216u}/* FCDF */, /*15585*/{1692925952u,1232u,458753u,76592325u,1515552u,3758620704u,1677868076u,273035264u,393216u}/* FCE0 */, /*15586*/{1693450240u,1232u,458753u,76592325u,1515552u,3758620704u,1677868012u,273035264u,393216u}/* FCE1 */, /*15587*/{1693974528u,1232u,458753u,76592325u,1515552u,3758620704u,1677868124u,273035264u,393216u}/* FCE2 */, /*15588*/{1694498816u,1232u,458753u,76592325u,1515552u,3758620704u,1677868140u,273035264u,393216u}/* FCE3 */, /*15589*/{1695023104u,1232u,458753u,76592325u,1515552u,3758620704u,1677868252u,273035264u,393216u}/* FCE4 */, /*15590*/{1695547392u,1232u,458753u,76592325u,1515552u,3758620704u,1677868148u,273035264u,393216u}/* FCE5 */, /*15591*/{1696071680u,1232u,458753u,76592325u,1515552u,3758620704u,1677868260u,273035264u,393216u}/* FCE6 */, /*15592*/{1696595968u,1232u,458753u,76592325u,1515552u,3758620704u,1677868620u,273035264u,393216u}/* FCE7 */, /*15593*/{1697120256u,1232u,458753u,76592325u,1515552u,3758620704u,1677868732u,273035264u,393216u}/* FCE8 */, /*15594*/{1697644544u,1232u,458753u,76592325u,1515552u,3758620704u,1677868628u,273035264u,393216u}/* FCE9 */, /*15595*/{1698168832u,1232u,458753u,76592325u,1515552u,3758620704u,1677868740u,273035264u,393216u}/* FCEA */, /*15596*/{1698693120u,1232u,458753u,76592325u,1515552u,3758620704u,1677868932u,273035264u,393216u}/* FCEB */, /*15597*/{1699217408u,1232u,458753u,76592325u,1515552u,3758620704u,1677868988u,273035264u,393216u}/* FCEC */, /*15598*/{1699741696u,1232u,458753u,76592325u,1515552u,3758620704u,1677869156u,273035264u,393216u}/* FCED */, /*15599*/{1700265984u,1232u,458753u,76592325u,1515552u,3758620704u,1677869244u,273035264u,393216u}/* FCEE */, /*15600*/{1700790272u,1232u,458753u,76592325u,1515552u,3758620704u,1677869356u,273035264u,393216u}/* FCEF */, /*15601*/{1701314560u,1232u,458753u,76592325u,1515552u,3758620704u,1677869492u,273035264u,393216u}/* FCF0 */, /*15602*/{1701838848u,1232u,458753u,76592325u,1515552u,3758620704u,1677869604u,273035264u,393216u}/* FCF1 */, /*15603*/{1702363136u,1232u,458753u,76592325u,1515552u,3758620704u,1677721612u,1036398592u,393216u}/* FCF2 */, /*15604*/{1702887424u,1232u,458753u,76592325u,1515552u,3758620704u,1677721612u,1053175808u,393216u}/* FCF3 */, /*15605*/{1703411712u,1232u,458753u,76592325u,1515552u,3758620704u,1677721612u,1065758720u,393216u}/* FCF4 */, /*15606*/{1703936000u,1232u,458753u,76592389u,1515552u,3758620704u,1677869028u,273068032u,393216u}/* FCF5 */, /*15607*/{1704460288u,1232u,458753u,76592389u,1515552u,3758620704u,1677869036u,273068032u,393216u}/* FCF6 */, /*15608*/{1704984576u,1232u,458753u,76592389u,1515552u,3758620704u,1677869060u,273068032u,393216u}/* FCF7 */, /*15609*/{1705508864u,1232u,458753u,76592389u,1515552u,3758620704u,1677869068u,273068032u,393216u}/* FCF8 */, /*15610*/{1706033152u,1232u,458753u,76592389u,1515552u,3758620704u,1677869068u,273068032u,393216u}/* FCF9 */, /*15611*/{1706557440u,1232u,458753u,76592389u,1515552u,3758620704u,1677869076u,273068032u,393216u}/* FCFA */, /*15612*/{1707081728u,1232u,458753u,76592389u,1515552u,3758620704u,1677868892u,273068032u,393216u}/* FCFB */, /*15613*/{1707606016u,1232u,458753u,76592389u,1515552u,3758620704u,1677868900u,273068032u,393216u}/* FCFC */, /*15614*/{1708130304u,1232u,458753u,76592389u,1515552u,3758620704u,1677868900u,273068032u,393216u}/* FCFD */, /*15615*/{1708654592u,1232u,458753u,76592389u,1515552u,3758620704u,1677868908u,273068032u,393216u}/* FCFE */, /*15616*/{1709178880u,1232u,458753u,76592389u,1515552u,3758620704u,1677868532u,273068032u,393216u}/* FCFF */, /*15617*/{1709703168u,1232u,458753u,76592389u,1515552u,3758620704u,1677868540u,273068032u,393216u}/* FD00 */, /*15618*/{1710227456u,1232u,458753u,76592389u,1515552u,3758620704u,1677868476u,273068032u,393216u}/* FD01 */, /*15619*/{1710751744u,1232u,458753u,76592389u,1515552u,3758620704u,1677868484u,273068032u,393216u}/* FD02 */, /*15620*/{1711276032u,1232u,458753u,76592389u,1515552u,3758620704u,1677868540u,273068032u,393216u}/* FD03 */, /*15621*/{1711800320u,1232u,458753u,76592389u,1515552u,3758620704u,1677868548u,273068032u,393216u}/* FD04 */, /*15622*/{1712324608u,1232u,458753u,76592389u,1515552u,3758620704u,1677868980u,273068032u,393216u}/* FD05 */, /*15623*/{1712848896u,1232u,458753u,76592389u,1515552u,3758620704u,1677868988u,273068032u,393216u}/* FD06 */, /*15624*/{1713373184u,1232u,458753u,76592389u,1515552u,3758620704u,1677868988u,273068032u,393216u}/* FD07 */, /*15625*/{1713897472u,1232u,458753u,76592389u,1515552u,3758620704u,1677868996u,273068032u,393216u}/* FD08 */, /*15626*/{1714421760u,1232u,458753u,76592389u,1515552u,3758620704u,1677867620u,273068032u,393216u}/* FD09 */, /*15627*/{1714946048u,1232u,458753u,76592389u,1515552u,3758620704u,1677867676u,273068032u,393216u}/* FD0A */, /*15628*/{1715470336u,1232u,458753u,76592389u,1515552u,3758620704u,1677867684u,273068032u,393216u}/* FD0B */, /*15629*/{1715994624u,1232u,458753u,76592389u,1515552u,3758620704u,1677868628u,273068032u,393216u}/* FD0C */, /*15630*/{1716518912u,1232u,458753u,76592389u,1515552u,3758620704u,1677867884u,273068032u,393216u}/* FD0D */, /*15631*/{1717043200u,1232u,458753u,76592389u,1515552u,3758620704u,1677867876u,273068032u,393216u}/* FD0E */, /*15632*/{1717567488u,1232u,458753u,76592389u,1515552u,3758620704u,1677867964u,273068032u,393216u}/* FD0F */, /*15633*/{1718091776u,1232u,458753u,76592389u,1515552u,3758620704u,1677867972u,273068032u,393216u}/* FD10 */, /*15634*/{1718616064u,1232u,458753u,76592357u,1515552u,3758620704u,1677869028u,273051648u,393216u}/* FD11 */, /*15635*/{1719140352u,1232u,458753u,76592357u,1515552u,3758620704u,1677869036u,273051648u,393216u}/* FD12 */, /*15636*/{1719664640u,1232u,458753u,76592357u,1515552u,3758620704u,1677869060u,273051648u,393216u}/* FD13 */, /*15637*/{1720188928u,1232u,458753u,76592357u,1515552u,3758620704u,1677869068u,273051648u,393216u}/* FD14 */, /*15638*/{1720713216u,1232u,458753u,76592357u,1515552u,3758620704u,1677869068u,273051648u,393216u}/* FD15 */, /*15639*/{1721237504u,1232u,458753u,76592357u,1515552u,3758620704u,1677869076u,273051648u,393216u}/* FD16 */, /*15640*/{1721761792u,1232u,458753u,76592357u,1515552u,3758620704u,1677868892u,273051648u,393216u}/* FD17 */, /*15641*/{1722286080u,1232u,458753u,76592357u,1515552u,3758620704u,1677868900u,273051648u,393216u}/* FD18 */, /*15642*/{1722810368u,1232u,458753u,76592357u,1515552u,3758620704u,1677868900u,273051648u,393216u}/* FD19 */, /*15643*/{1723334656u,1232u,458753u,76592357u,1515552u,3758620704u,1677868908u,273051648u,393216u}/* FD1A */, /*15644*/{1723858944u,1232u,458753u,76592357u,1515552u,3758620704u,1677868532u,273051648u,393216u}/* FD1B */, /*15645*/{1724383232u,1232u,458753u,76592357u,1515552u,3758620704u,1677868540u,273051648u,393216u}/* FD1C */, /*15646*/{1724907520u,1232u,458753u,76592357u,1515552u,3758620704u,1677868476u,273051648u,393216u}/* FD1D */, /*15647*/{1725431808u,1232u,458753u,76592357u,1515552u,3758620704u,1677868484u,273051648u,393216u}/* FD1E */, /*15648*/{1725956096u,1232u,458753u,76592357u,1515552u,3758620704u,1677868540u,273051648u,393216u}/* FD1F */, /*15649*/{1726480384u,1232u,458753u,76592357u,1515552u,3758620704u,1677868548u,273051648u,393216u}/* FD20 */, /*15650*/{1727004672u,1232u,458753u,76592357u,1515552u,3758620704u,1677868980u,273051648u,393216u}/* FD21 */, /*15651*/{1727528960u,1232u,458753u,76592357u,1515552u,3758620704u,1677868988u,273051648u,393216u}/* FD22 */, /*15652*/{1728053248u,1232u,458753u,76592357u,1515552u,3758620704u,1677868988u,273051648u,393216u}/* FD23 */, /*15653*/{1728577536u,1232u,458753u,76592357u,1515552u,3758620704u,1677868996u,273051648u,393216u}/* FD24 */, /*15654*/{1729101824u,1232u,458753u,76592357u,1515552u,3758620704u,1677867620u,273051648u,393216u}/* FD25 */, /*15655*/{1729626112u,1232u,458753u,76592357u,1515552u,3758620704u,1677867676u,273051648u,393216u}/* FD26 */, /*15656*/{1730150400u,1232u,458753u,76592357u,1515552u,3758620704u,1677867684u,273051648u,393216u}/* FD27 */, /*15657*/{1730674688u,1232u,458753u,76592357u,1515552u,3758620704u,1677868628u,273051648u,393216u}/* FD28 */, /*15658*/{1731198976u,1232u,458753u,76592357u,1515552u,3758620704u,1677867884u,273051648u,393216u}/* FD29 */, /*15659*/{1731723264u,1232u,458753u,76592357u,1515552u,3758620704u,1677867876u,273051648u,393216u}/* FD2A */, /*15660*/{1732247552u,1232u,458753u,76592357u,1515552u,3758620704u,1677867964u,273051648u,393216u}/* FD2B */, /*15661*/{1732771840u,1232u,458753u,76592357u,1515552u,3758620704u,1677867972u,273051648u,393216u}/* FD2C */, /*15662*/{1733296128u,1232u,458753u,76592293u,1515552u,3758620704u,1677867620u,273018880u,393216u}/* FD2D */, /*15663*/{1733820416u,1232u,458753u,76592293u,1515552u,3758620704u,1677867676u,273018880u,393216u}/* FD2E */, /*15664*/{1734344704u,1232u,458753u,76592293u,1515552u,3758620704u,1677867684u,273018880u,393216u}/* FD2F */, /*15665*/{1734868992u,1232u,458753u,76592293u,1515552u,3758620704u,1677868628u,273018880u,393216u}/* FD30 */, /*15666*/{1735393280u,1232u,458753u,76592293u,1515552u,3758620704u,1677868732u,273018880u,393216u}/* FD31 */, /*15667*/{1735917568u,1232u,458753u,76592293u,1515552u,3758620704u,1677868740u,273018880u,393216u}/* FD32 */, /*15668*/{1736441856u,1232u,458753u,76592293u,1515552u,3758620704u,1677868756u,273018880u,393216u}/* FD33 */, /*15669*/{1736966144u,1232u,458753u,76592325u,1515552u,3758620704u,1677867612u,273035264u,393216u}/* FD34 */, /*15670*/{1737490432u,1232u,458753u,76592325u,1515552u,3758620704u,1677867668u,273035264u,393216u}/* FD35 */, /*15671*/{1738014720u,1232u,458753u,76592325u,1515552u,3758620704u,1677867676u,273035264u,393216u}/* FD36 */, /*15672*/{1738539008u,1232u,458753u,76592325u,1515552u,3758620704u,1677867620u,273035264u,393216u}/* FD37 */, /*15673*/{1739063296u,1232u,458753u,76592325u,1515552u,3758620704u,1677867676u,273035264u,393216u}/* FD38 */, /*15674*/{1739587584u,1232u,458753u,76592325u,1515552u,3758620704u,1677867684u,273035264u,393216u}/* FD39 */, /*15675*/{1740111872u,1232u,458753u,76592325u,1515552u,3758620704u,1677868756u,273035264u,393216u}/* FD3A */, /*15676*/{1740636160u,1232u,458753u,76592325u,1515552u,3758620704u,1677868764u,273035264u,393216u}/* FD3B */, /*15677*/{1741160448u,1232u,458753u,76592357u,1515552u,3758620704u,1677794196u,596013056u,393216u}/* FD3C */, /*15678*/{1741684736u,1232u,458753u,76592389u,1515552u,3758620704u,1677794196u,596029440u,393216u}/* FD3D */, /*15679*/{0,1232u,65537u,86026261u,106536u,1610612768u,7196u,138442755u,0}/* FD3E */, /*15680*/{0,1232u,65537u,79734804u,106536u,1610612768u,7204u,138442755u,0}/* FD3F */, /*15681*/{1742209024u,1232u,458753u,76592293u,1515552u,3758620704u,1677940932u,407425024u,393216u}/* FD50 */, /*15682*/{1742733312u,1232u,458753u,76592357u,1515552u,3758620704u,1677939980u,407474176u,393216u}/* FD51 */, /*15683*/{1743257600u,1232u,458753u,76592293u,1515552u,3758620704u,1677939980u,407425024u,393216u}/* FD52 */, /*15684*/{1743781888u,1232u,458753u,76592293u,1515552u,3758620704u,1677940988u,407425024u,393216u}/* FD53 */, /*15685*/{1744306176u,1232u,458753u,76592293u,1515552u,3758620704u,1677940996u,407425024u,393216u}/* FD54 */, /*15686*/{1744830464u,1232u,458753u,76592293u,1515552u,3758620704u,1677940932u,407425024u,393216u}/* FD55 */, /*15687*/{1745354752u,1232u,458753u,76592293u,1515552u,3758620704u,1677940988u,407425024u,393216u}/* FD56 */, /*15688*/{1745879040u,1232u,458753u,76592293u,1515552u,3758620704u,1677940996u,407425024u,393216u}/* FD57 */, /*15689*/{1746403328u,1232u,458753u,76592357u,1515552u,3758620704u,1677941052u,407474176u,393216u}/* FD58 */, /*15690*/{1746927616u,1232u,458753u,76592293u,1515552u,3758620704u,1677941052u,407425024u,393216u}/* FD59 */, /*15691*/{1747451904u,1232u,458753u,76592357u,1515552u,3758620704u,1677942340u,407474176u,393216u}/* FD5A */, /*15692*/{1747976192u,1232u,458753u,76592357u,1515552u,3758620704u,1677942332u,407474176u,393216u}/* FD5B */, /*15693*/{1748500480u,1232u,458753u,76592293u,1515552u,3758620704u,1677940460u,407425024u,393216u}/* FD5C */, /*15694*/{1749024768u,1232u,458753u,76592293u,1515552u,3758620704u,1677940460u,407425024u,393216u}/* FD5D */, /*15695*/{1749549056u,1232u,458753u,76592357u,1515552u,3758620704u,1677941684u,407474176u,393216u}/* FD5E */, /*15696*/{1750073344u,1232u,458753u,76592357u,1515552u,3758620704u,1677941468u,407474176u,393216u}/* FD5F */, /*15697*/{1750597632u,1232u,458753u,76592293u,1515552u,3758620704u,1677941468u,407425024u,393216u}/* FD60 */, /*15698*/{1751121920u,1232u,458753u,76592293u,1515552u,3758620704u,1677941412u,407425024u,393216u}/* FD61 */, /*15699*/{1751646208u,1232u,458753u,76592357u,1515552u,3758620704u,1677942420u,407474176u,393216u}/* FD62 */, /*15700*/{1752170496u,1232u,458753u,76592293u,1515552u,3758620704u,1677942420u,407425024u,393216u}/* FD63 */, /*15701*/{1752694784u,1232u,458753u,76592357u,1515552u,3758620704u,1677940604u,407474176u,393216u}/* FD64 */, /*15702*/{1753219072u,1232u,458753u,76592293u,1515552u,3758620704u,1677940604u,407425024u,393216u}/* FD65 */, /*15703*/{1753743360u,1232u,458753u,76592357u,1515552u,3758620704u,1677942508u,407474176u,393216u}/* FD66 */, /*15704*/{1754267648u,1232u,458753u,76592357u,1515552u,3758620704u,1677941476u,407474176u,393216u}/* FD67 */, /*15705*/{1754791936u,1232u,458753u,76592293u,1515552u,3758620704u,1677941476u,407425024u,393216u}/* FD68 */, /*15706*/{1755316224u,1232u,458753u,76592357u,1515552u,3758620704u,1677941700u,407474176u,393216u}/* FD69 */, /*15707*/{1755840512u,1232u,458753u,76592357u,1515552u,3758620704u,1677941484u,407474176u,393216u}/* FD6A */, /*15708*/{1756364800u,1232u,458753u,76592293u,1515552u,3758620704u,1677941484u,407425024u,393216u}/* FD6B */, /*15709*/{1756889088u,1232u,458753u,76592357u,1515552u,3758620704u,1677942428u,407474176u,393216u}/* FD6C */, /*15710*/{1757413376u,1232u,458753u,76592293u,1515552u,3758620704u,1677942428u,407425024u,393216u}/* FD6D */, /*15711*/{1757937664u,1232u,458753u,76592357u,1515552u,3758620704u,1677941836u,407474176u,393216u}/* FD6E */, /*15712*/{1758461952u,1232u,458753u,76592357u,1515552u,3758620704u,1677941572u,407474176u,393216u}/* FD6F */, /*15713*/{1758986240u,1232u,458753u,76592293u,1515552u,3758620704u,1677941572u,407425024u,393216u}/* FD70 */, /*15714*/{1759510528u,1232u,458753u,76592357u,1515552u,3758620704u,1677941604u,407474176u,393216u}/* FD71 */, /*15715*/{1760034816u,1232u,458753u,76592293u,1515552u,3758620704u,1677941604u,407425024u,393216u}/* FD72 */, /*15716*/{1760559104u,1232u,458753u,76592293u,1515552u,3758620704u,1677942556u,407425024u,393216u}/* FD73 */, /*15717*/{1761083392u,1232u,458753u,76592357u,1515552u,3758620704u,1677942836u,407474176u,393216u}/* FD74 */, /*15718*/{1761607680u,1232u,458753u,76592357u,1515552u,3758620704u,1677941580u,407474176u,393216u}/* FD75 */, /*15719*/{1762131968u,1232u,458753u,76592357u,1515552u,3758620704u,1677942588u,407474176u,393216u}/* FD76 */, /*15720*/{1762656256u,1232u,458753u,76592293u,1515552u,3758620704u,1677942588u,407425024u,393216u}/* FD77 */, /*15721*/{1763180544u,1232u,458753u,76592357u,1515552u,3758620704u,1677942860u,407474176u,393216u}/* FD78 */, /*15722*/{1763704832u,1232u,458753u,76592357u,1515552u,3758620704u,1677942596u,407474176u,393216u}/* FD79 */, /*15723*/{1764229120u,1232u,458753u,76592357u,1515552u,3758620704u,1677942876u,407474176u,393216u}/* FD7A */, /*15724*/{1764753408u,1232u,458753u,76592357u,1515552u,3758620704u,1677942868u,407474176u,393216u}/* FD7B */, /*15725*/{1765277696u,1232u,458753u,76592357u,1515552u,3758620704u,1677941708u,407474176u,393216u}/* FD7C */, /*15726*/{1765801984u,1232u,458753u,76592293u,1515552u,3758620704u,1677941708u,407425024u,393216u}/* FD7D */, /*15727*/{1766326272u,1232u,458753u,76592357u,1515552u,3758620704u,1677941796u,407474176u,393216u}/* FD7E */, /*15728*/{1766850560u,1232u,458753u,76592357u,1515552u,3758620704u,1677942748u,407474176u,393216u}/* FD7F */, /*15729*/{1767374848u,1232u,458753u,76592357u,1515552u,3758620704u,1677942004u,407474176u,393216u}/* FD80 */, /*15730*/{1767899136u,1232u,458753u,76592357u,1515552u,3758620704u,1677942284u,407474176u,393216u}/* FD81 */, /*15731*/{1768423424u,1232u,458753u,76592357u,1515552u,3758620704u,1677942276u,407474176u,393216u}/* FD82 */, /*15732*/{1768947712u,1232u,458753u,76592293u,1515552u,3758620704u,1677940940u,407425024u,393216u}/* FD83 */, /*15733*/{1769472000u,1232u,458753u,76592357u,1515552u,3758620704u,1677940940u,407474176u,393216u}/* FD84 */, /*15734*/{1769996288u,1232u,458753u,76592357u,1515552u,3758620704u,1677942012u,407474176u,393216u}/* FD85 */, /*15735*/{1770520576u,1232u,458753u,76592293u,1515552u,3758620704u,1677942012u,407425024u,393216u}/* FD86 */, /*15736*/{1771044864u,1232u,458753u,76592357u,1515552u,3758620704u,1677942004u,407474176u,393216u}/* FD87 */, /*15737*/{1771569152u,1232u,458753u,76592293u,1515552u,3758620704u,1677942004u,407425024u,393216u}/* FD88 */, /*15738*/{1772093440u,1232u,458753u,76592293u,1515552u,3758620704u,1677941052u,407425024u,393216u}/* FD89 */, /*15739*/{1772617728u,1232u,458753u,76592293u,1515552u,3758620704u,1677942060u,407425024u,393216u}/* FD8A */, /*15740*/{1773142016u,1232u,458753u,76592357u,1515552u,3758620704u,1677942340u,407474176u,393216u}/* FD8B */, /*15741*/{1773666304u,1232u,458753u,76592293u,1515552u,3758620704u,1677941052u,407425024u,393216u}/* FD8C */, /*15742*/{1774190592u,1232u,458753u,76592293u,1515552u,3758620704u,1677942004u,407425024u,393216u}/* FD8D */, /*15743*/{1774714880u,1232u,458753u,76592293u,1515552u,3758620704u,1677941060u,407425024u,393216u}/* FD8E */, /*15744*/{1775239168u,1232u,458753u,76592293u,1515552u,3758620704u,1677942068u,407425024u,393216u}/* FD8F */, /*15745*/{1775763456u,1232u,458753u,76592293u,1515552u,3758620704u,1677941060u,407425024u,393216u}/* FD92 */, /*15746*/{1776287744u,1232u,458753u,76592293u,1515552u,3758620704u,1677942116u,407425024u,393216u}/* FD93 */, /*15747*/{1776812032u,1232u,458753u,76592293u,1515552u,3758620704u,1677943124u,407425024u,393216u}/* FD94 */, /*15748*/{1777336320u,1232u,458753u,76592293u,1515552u,3758620704u,1677942092u,407425024u,393216u}/* FD95 */, /*15749*/{1777860608u,1232u,458753u,76592357u,1515552u,3758620704u,1677942364u,407474176u,393216u}/* FD96 */, /*15750*/{1778384896u,1232u,458753u,76592357u,1515552u,3758620704u,1677942036u,407474176u,393216u}/* FD97 */, /*15751*/{1778909184u,1232u,458753u,76592293u,1515552u,3758620704u,1677942036u,407425024u,393216u}/* FD98 */, /*15752*/{1779433472u,1232u,458753u,76592357u,1515552u,3758620704u,1677942308u,407474176u,393216u}/* FD99 */, /*15753*/{1779957760u,1232u,458753u,76592357u,1515552u,3758620704u,1677943324u,407474176u,393216u}/* FD9A */, /*15754*/{1780482048u,1232u,458753u,76592357u,1515552u,3758620704u,1677943316u,407474176u,393216u}/* FD9B */, /*15755*/{1781006336u,1232u,458753u,76592357u,1515552u,3758620704u,1677943292u,407474176u,393216u}/* FD9C */, /*15756*/{1781530624u,1232u,458753u,76592293u,1515552u,3758620704u,1677943292u,407425024u,393216u}/* FD9D */, /*15757*/{1782054912u,1232u,458753u,76592357u,1515552u,3758620704u,1677941148u,407474176u,393216u}/* FD9E */, /*15758*/{1782579200u,1232u,458753u,76592357u,1515552u,3758620704u,1677941212u,407474176u,393216u}/* FD9F */, /*15759*/{1783103488u,1232u,458753u,76592357u,1515552u,3758620704u,1677941204u,407474176u,393216u}/* FDA0 */, /*15760*/{1783627776u,1232u,458753u,76592357u,1515552u,3758620704u,1677941276u,407474176u,393216u}/* FDA1 */, /*15761*/{1784152064u,1232u,458753u,76592357u,1515552u,3758620704u,1677941268u,407474176u,393216u}/* FDA2 */, /*15762*/{1784676352u,1232u,458753u,76592357u,1515552u,3758620704u,1677942220u,407474176u,393216u}/* FDA3 */, /*15763*/{1785200640u,1232u,458753u,76592357u,1515552u,3758620704u,1677942212u,407474176u,393216u}/* FDA4 */, /*15764*/{1785724928u,1232u,458753u,76592357u,1515552u,3758620704u,1677942284u,407474176u,393216u}/* FDA5 */, /*15765*/{1786249216u,1232u,458753u,76592357u,1515552u,3758620704u,1677941324u,407474176u,393216u}/* FDA6 */, /*15766*/{1786773504u,1232u,458753u,76592357u,1515552u,3758620704u,1677942276u,407474176u,393216u}/* FDA7 */, /*15767*/{1787297792u,1232u,458753u,76592357u,1515552u,3758620704u,1677941748u,407474176u,393216u}/* FDA8 */, /*15768*/{1787822080u,1232u,458753u,76592357u,1515552u,3758620704u,1677941836u,407474176u,393216u}/* FDA9 */, /*15769*/{1788346368u,1232u,458753u,76592357u,1515552u,3758620704u,1677941756u,407474176u,393216u}/* FDAA */, /*15770*/{1788870656u,1232u,458753u,76592357u,1515552u,3758620704u,1677941844u,407474176u,393216u}/* FDAB */, /*15771*/{1789394944u,1232u,458753u,76592357u,1515552u,3758620704u,1677942228u,407474176u,393216u}/* FDAC */, /*15772*/{1789919232u,1232u,458753u,76592357u,1515552u,3758620704u,1677943236u,407474176u,393216u}/* FDAD */, /*15773*/{1790443520u,1232u,458753u,76592357u,1515552u,3758620704u,1677942620u,407474176u,393216u}/* FDAE */, /*15774*/{1790967808u,1232u,458753u,76592357u,1515552u,3758620704u,1677942564u,407474176u,393216u}/* FDAF */, /*15775*/{1791492096u,1232u,458753u,76592357u,1515552u,3758620704u,1677943572u,407474176u,393216u}/* FDB0 */, /*15776*/{1792016384u,1232u,458753u,76592357u,1515552u,3758620704u,1677943292u,407474176u,393216u}/* FDB1 */, /*15777*/{1792540672u,1232u,458753u,76592357u,1515552u,3758620704u,1677943028u,407474176u,393216u}/* FDB2 */, /*15778*/{1793064960u,1232u,458753u,76592357u,1515552u,3758620704u,1677942372u,407474176u,393216u}/* FDB3 */, /*15779*/{1793589248u,1232u,458753u,76592293u,1515552u,3758620704u,1677941796u,407425024u,393216u}/* FDB4 */, /*15780*/{1794113536u,1232u,458753u,76592293u,1515552u,3758620704u,1677942004u,407425024u,393216u}/* FDB5 */, /*15781*/{1794637824u,1232u,458753u,76592357u,1515552u,3758620704u,1677942868u,407474176u,393216u}/* FDB6 */, /*15782*/{1795162112u,1232u,458753u,76592357u,1515552u,3758620704u,1677943068u,407474176u,393216u}/* FDB7 */, /*15783*/{1795686400u,1232u,458753u,76592293u,1515552u,3758620704u,1677941084u,407425024u,393216u}/* FDB8 */, /*15784*/{1796210688u,1232u,458753u,76592357u,1515552u,3758620704u,1677942348u,407474176u,393216u}/* FDB9 */, /*15785*/{1796734976u,1232u,458753u,76592293u,1515552u,3758620704u,1677941948u,407425024u,393216u}/* FDBA */, /*15786*/{1797259264u,1232u,458753u,76592357u,1515552u,3758620704u,1677942788u,407474176u,393216u}/* FDBB */, /*15787*/{1797783552u,1232u,458753u,76592357u,1515552u,3758620704u,1677941948u,407474176u,393216u}/* FDBC */, /*15788*/{1798307840u,1232u,458753u,76592357u,1515552u,3758620704u,1677941084u,407474176u,393216u}/* FDBD */, /*15789*/{1798832128u,1232u,458753u,76592357u,1515552u,3758620704u,1677941332u,407474176u,393216u}/* FDBE */, /*15790*/{1799356416u,1232u,458753u,76592357u,1515552u,3758620704u,1677941332u,407474176u,393216u}/* FDBF */, /*15791*/{1799880704u,1232u,458753u,76592357u,1515552u,3758620704u,1677942284u,407474176u,393216u}/* FDC0 */, /*15792*/{1800404992u,1232u,458753u,76592357u,1515552u,3758620704u,1677942932u,407474176u,393216u}/* FDC1 */, /*15793*/{1800929280u,1232u,458753u,76592357u,1515552u,3758620704u,1677941140u,407474176u,393216u}/* FDC2 */, /*15794*/{1801453568u,1232u,458753u,76592293u,1515552u,3758620704u,1677942788u,407425024u,393216u}/* FDC3 */, /*15795*/{1801977856u,1232u,458753u,76592293u,1515552u,3758620704u,1677941580u,407425024u,393216u}/* FDC4 */, /*15796*/{1802502144u,1232u,458753u,76592293u,1515552u,3758620704u,1677942508u,407425024u,393216u}/* FDC5 */, /*15797*/{1803026432u,1232u,458753u,76592357u,1515552u,3758620704u,1677941756u,407474176u,393216u}/* FDC6 */, /*15798*/{1803550720u,1232u,458753u,76592357u,1515552u,3758620704u,1677942316u,407474176u,393216u}/* FDC7 */, /*15799*/{1804075008u,1232u,458753u,76592389u,1515552u,3758620704u,1677942844u,407498752u,393216u}/* FDF0 */, /*15800*/{1804599296u,1232u,458753u,76592389u,1515552u,3758620704u,1677943084u,407498752u,393216u}/* FDF1 */, /*15801*/{1805123584u,1232u,458753u,76592389u,1515552u,3758620704u,1678015596u,541929472u,393216u}/* FDF2 */, /*15802*/{1805647872u,1232u,458753u,76592389u,1515552u,3758620704u,1678013428u,541929472u,393216u}/* FDF3 */, /*15803*/{1806172160u,1232u,458753u,76592389u,1515552u,3758620704u,1678014996u,541929472u,393216u}/* FDF4 */, /*15804*/{1806696448u,1232u,458753u,76592389u,1515552u,3758620704u,1678015828u,541929472u,393216u}/* FDF5 */, /*15805*/{1807220736u,1232u,458753u,76592389u,1515552u,3758620704u,1678015580u,541929472u,393216u}/* FDF6 */, /*15806*/{1807745024u,1232u,458753u,76592389u,1515552u,3758620704u,1678016724u,541929472u,393216u}/* FDF7 */, /*15807*/{1808269312u,1232u,458753u,76592389u,1515552u,3758620704u,1678016324u,541929472u,393216u}/* FDF8 */, /*15808*/{1808793600u,1232u,458753u,76592389u,1515552u,3758620704u,1677942724u,407498752u,393216u}/* FDF9 */, /*15809*/{1809317888u,1232u,458753u,76592389u,1515552u,3758620704u,1678839036u,2423959552u,0}/* FDFA */, /*15810*/{1809842176u,1232u,458753u,76592389u,1515552u,3758620704u,1678239092u,1079652352u,0}/* FDFB */, /*15811*/{1810366464u,1232u,458753u,78853401u,32u,1611137056u,293484u,541929472u,67108864u}/* FDFC */, /*15812*/{0,1232u,458753u,76785691u,40u,1610612768u,10436u,138442752u,67108864u}/* FDFD */, /*15813*/{0,1241u,2686977u,68366342u,672030728u,1627947024u,1077936140u,4208640u,1310720u}/* FE00 */, /*15814*/{1810890752u,1251u,65537u,82061719u,1818656u,1611137056u,4380u,138604546u,0}/* FE10 */, /*15815*/{1811415040u,1251u,65537u,86256023u,114720u,1611137056u,4500u,138604546u,0}/* FE11 */, /*15816*/{1811939328u,1251u,65537u,86256023u,32u,1611137056u,5220u,138604546u,0}/* FE12 */, /*15817*/{1812463616u,1251u,65537u,82061719u,1687584u,1627914272u,4572u,138604546u,0}/* FE13 */, /*15818*/{1812987904u,1251u,65537u,82061719u,1703968u,1611137056u,4524u,138604546u,0}/* FE14 */, /*15819*/{1813512192u,1251u,65537u,74721687u,32u,1611137056u,4884u,138604546u,0}/* FE15 */, /*15820*/{1814036480u,1251u,65537u,74721687u,32u,1611137056u,4932u,138604546u,0}/* FE16 */, /*15821*/{1814560768u,1251u,65537u,79964564u,106528u,1611137056u,7148u,138604546u,0}/* FE17 */, /*15822*/{1815085056u,1251u,65537u,86256021u,106528u,1611137056u,7156u,138604546u,0}/* FE18 */, /*15823*/{1815609344u,1251u,65537u,100936087u,32u,1611137056u,15180u,407400450u,0}/* FE19 */, /*15824*/{0,1256u,2686977u,3423645702u,672030728u,1627398160u,1077936140u,335575040u,262144u}/* FE20 */, /*15825*/{0,1256u,2686977u,3423645702u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* FE21 */, /*15826*/{0,1256u,2686977u,3423645702u,672030728u,1627398160u,1077936140u,331380736u,262144u}/* FE22 */, /*15827*/{0,1256u,2686977u,3423940614u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* FE24 */, /*15828*/{0,1256u,2686977u,3088592902u,672030728u,1627398160u,1077936140u,222328832u,262144u}/* FE27 */, /*15829*/{0,1256u,2686977u,3088592902u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* FE28 */, /*15830*/{0,1256u,2686977u,3088592902u,672030728u,1627398160u,1077936140u,331380736u,262144u}/* FE29 */, /*15831*/{0,1256u,262145u,3424169990u,672030728u,1627398160u,1077936140u,339769344u,262144u}/* FE2E */, /*15832*/{0,1256u,262145u,3424169990u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* FE2F */, /*15833*/{1816133632u,1267u,65537u,102803863u,32u,1611137056u,10124u,273002498u,0}/* FE30 */, /*15834*/{1816657920u,1267u,65537u,102803859u,114720u,1611202592u,4284u,138604546u,0}/* FE31 */, /*15835*/{1817182208u,1267u,65537u,102803859u,114720u,1611202592u,4276u,138604546u,0}/* FE32 */, /*15836*/{1817706496u,1267u,65537u,102803862u,2097184u,1611137056u,1073746020u,138604546u,262144u}/* FE33 */, /*15837*/{1818230784u,1267u,65537u,102803862u,2097184u,1611137056u,1073746020u,138604546u,262144u}/* FE34 */, /*15838*/{1818755072u,1267u,65537u,79735188u,106528u,1611137056u,6348u,138604546u,0}/* FE35 */, /*15839*/{1819279360u,1267u,65537u,86026645u,106528u,1611137056u,6356u,138604546u,0}/* FE36 */, /*15840*/{1819803648u,1267u,65537u,79735188u,106528u,1611137056u,6380u,138604546u,0}/* FE37 */, /*15841*/{1820327936u,1267u,65537u,86026645u,106528u,1611137056u,6388u,138604546u,0}/* FE38 */, /*15842*/{1820852224u,1267u,65537u,79735188u,106528u,1611137056u,7132u,138604546u,0}/* FE39 */, /*15843*/{1821376512u,1267u,65537u,86026645u,106528u,1611137056u,7140u,138604546u,0}/* FE3A */, /*15844*/{1821900800u,1267u,65537u,79735188u,106528u,1611137056u,7116u,138604546u,0}/* FE3B */, /*15845*/{1822425088u,1267u,65537u,86026645u,106528u,1611137056u,7124u,138604546u,0}/* FE3C */, /*15846*/{1822949376u,1267u,65537u,79735188u,106528u,1611137056u,7068u,138604546u,0}/* FE3D */, /*15847*/{1823473664u,1267u,65537u,86026645u,106528u,1611137056u,7076u,138604546u,0}/* FE3E */, /*15848*/{1823997952u,1267u,65537u,79735188u,106528u,1611137056u,7052u,138604546u,0}/* FE3F */, /*15849*/{1824522240u,1267u,65537u,86026645u,106528u,1611137056u,7060u,138604546u,0}/* FE40 */, /*15850*/{1825046528u,1267u,65537u,79735188u,106528u,1611137056u,7084u,138604546u,536870912u}/* FE41 */, /*15851*/{1825570816u,1267u,65537u,86026645u,106528u,1611137056u,7092u,138604546u,536870912u}/* FE42 */, /*15852*/{1826095104u,1267u,65537u,79735188u,106528u,1611137056u,7100u,138604546u,536870912u}/* FE43 */, /*15853*/{1826619392u,1267u,65537u,86026645u,106528u,1611137056u,7108u,138604546u,536870912u}/* FE44 */, /*15854*/{0,1267u,65537u,102967319u,40u,1610612768u,4508u,138442755u,0}/* FE45 */, /*15855*/{0,1267u,65537u,102967319u,40u,1610612768u,4516u,138442755u,0}/* FE46 */, /*15856*/{1827143680u,1267u,65537u,79931796u,106528u,1611137056u,6364u,138604546u,0}/* FE47 */, /*15857*/{1827667968u,1267u,65537u,86223253u,106528u,1611137056u,6372u,138604546u,0}/* FE48 */, /*15858*/{1828192256u,1267u,65537u,102803543u,32u,1611137056u,4188u,138457090u,0}/* FE49 */, /*15859*/{1828716544u,1267u,65537u,102803543u,32u,1611137056u,4188u,138457090u,0}/* FE4A */, /*15860*/{1829240832u,1267u,65537u,102803543u,32u,1611137056u,4188u,138457090u,0}/* FE4B */, /*15861*/{1829765120u,1267u,65537u,102803543u,32u,1611137056u,4188u,138457090u,0}/* FE4C */, /*15862*/{1830289408u,1267u,65537u,102803542u,2097184u,1611137056u,1073746020u,138457090u,262144u}/* FE4D */, /*15863*/{1830813696u,1267u,65537u,102803542u,2097184u,1611137056u,1073746020u,138457090u,262144u}/* FE4E */, /*15864*/{1831337984u,1267u,65537u,102803542u,2097184u,1611137056u,1073746020u,138457090u,262144u}/* FE4F */, /*15865*/{1831862272u,1275u,65537u,86022647u,1818656u,1611137056u,4380u,138547202u,8388608u}/* FE50 */, /*15866*/{1832386560u,1275u,65537u,102803959u,114720u,1611137056u,4500u,138547202u,8388608u}/* FE51 */, /*15867*/{1832910848u,1275u,65537u,86022647u,1925152u,1627914272u,5068u,138547202u,41943040u}/* FE52 */, /*15868*/{1833435136u,1275u,65537u,96512503u,1703968u,1611137056u,4524u,138547202u,8388608u}/* FE54 */, /*15869*/{1833959424u,1275u,65537u,96508407u,1687584u,1627914272u,4572u,138547202u,8388608u}/* FE55 */, /*15870*/{1834483712u,1275u,65537u,74492407u,98336u,1611137056u,4932u,138547202u,41943040u}/* FE56 */, /*15871*/{1835008000u,1275u,65537u,74492407u,98336u,1611137056u,4884u,138547202u,41943040u}/* FE57 */, /*15872*/{1835532288u,1275u,65537u,102803955u,114720u,1611202592u,4284u,138547202u,0}/* FE58 */, /*15873*/{1836056576u,1414395u,65537u,79735284u,106528u,1745354784u,6348u,138547202u,0}/* FE59 */, /*15874*/{1836580864u,1418491u,65537u,86026741u,106528u,1745354784u,6356u,138547202u,0}/* FE5A */, /*15875*/{1837105152u,1422587u,65537u,79735284u,106528u,1745354784u,6380u,138547202u,0}/* FE5B */, /*15876*/{1837629440u,1426683u,65537u,86026741u,106528u,1745354784u,6388u,138547202u,0}/* FE5C */, /*15877*/{1838153728u,1430779u,65537u,79735284u,106528u,1745354784u,7132u,138547202u,0}/* FE5D */, /*15878*/{1838678016u,1434875u,65537u,86026741u,106528u,1745354784u,7140u,138547202u,0}/* FE5E */, /*15879*/{1839202304u,1275u,65537u,102797815u,32u,1611137056u,7380u,138547202u,0}/* FE5F */, /*15880*/{1839726592u,1275u,65537u,102803959u,32u,1611137056u,7364u,138547202u,0}/* FE60 */, /*15881*/{1840250880u,1275u,65537u,102803959u,32u,1611137056u,7310u,138547210u,0}/* FE61 */, /*15882*/{1840775168u,1275u,65537u,102796792u,32u,1611137056u,12654u,138547200u,67108864u}/* FE62 */, /*15883*/{1841299456u,1275u,65537u,102796787u,114720u,1611202594u,4214u,138547210u,0}/* FE63 */, /*15884*/{1841823744u,1438971u,65537u,102803960u,32u,1745354784u,12686u,138547200u,67108864u}/* FE64 */, /*15885*/{1842348032u,1443067u,65537u,102803960u,32u,1745354784u,12702u,138547200u,67108864u}/* FE65 */, /*15886*/{1842872320u,1275u,65537u,102803960u,32u,1611137056u,12694u,138547200u,67108864u}/* FE66 */, /*15887*/{1843396608u,1275u,65537u,102803959u,32u,1611137056u,7358u,138547210u,0}/* FE68 */, /*15888*/{1843920896u,1275u,65537u,77631993u,32u,1611137056u,58308u,138547200u,67108864u}/* FE69 */, /*15889*/{1844445184u,1275u,65537u,78680567u,32u,1611137056u,7388u,138547202u,0}/* FE6A */, /*15890*/{1844969472u,1275u,65537u,102803959u,32u,1611137056u,7300u,138547202u,0}/* FE6B */, /*15891*/{1845493760u,1280u,458753u,76592389u,1515552u,3758620704u,1677721612u,461598720u,0}/* FE70 */, /*15892*/{1846018048u,1280u,458753u,76592325u,1515552u,3758620704u,1677721612u,461582336u,393216u}/* FE71 */, /*15893*/{1846542336u,1280u,458753u,76592389u,1515552u,3758620704u,1677721612u,474181632u,0}/* FE72 */, /*15894*/{0,1280u,458753u,76755973u,1515560u,3758096416u,1677721612u,4208640u,393216u}/* FE73 */, /*15895*/{1847066624u,1280u,458753u,76592389u,1515552u,3758620704u,1677721612u,486764544u,0}/* FE74 */, /*15896*/{1847590912u,1280u,458753u,76592389u,1515552u,3758620704u,1677721612u,499347456u,0}/* FE76 */, /*15897*/{1848115200u,1280u,458753u,76592325u,1515552u,3758620704u,1677721612u,499331072u,393216u}/* FE77 */, /*15898*/{1848639488u,1280u,458753u,76592389u,1515552u,3758620704u,1677721612u,516124672u,0}/* FE78 */, /*15899*/{1849163776u,1280u,458753u,76592325u,1515552u,3758620704u,1677721612u,516108288u,393216u}/* FE79 */, /*15900*/{1849688064u,1280u,458753u,76592389u,1515552u,3758620704u,1677721612u,528707584u,0}/* FE7A */, /*15901*/{1850212352u,1280u,458753u,76592325u,1515552u,3758620704u,1677721612u,528691200u,393216u}/* FE7B */, /*15902*/{1850736640u,1280u,458753u,76592389u,1515552u,3758620704u,1677721612u,541290496u,0}/* FE7C */, /*15903*/{1851260928u,1280u,458753u,76592325u,1515552u,3758620704u,1677721612u,541274112u,393216u}/* FE7D */, /*15904*/{1851785216u,1280u,458753u,76592389u,1515552u,3758620704u,1677721612u,545484800u,0}/* FE7E */, /*15905*/{1852309504u,1280u,458753u,76592325u,1515552u,3758620704u,1677721612u,545468416u,393216u}/* FE7F */, /*15906*/{1852833792u,1280u,458753u,76592389u,1515552u,3758620704u,1677794084u,138637312u,393216u}/* FE80 */, /*15907*/{1853358080u,1280u,458753u,76592389u,1515552u,3758620704u,1677794092u,138637312u,393216u}/* FE81 */, /*15908*/{1853882368u,1280u,458753u,76592357u,1515552u,3758620704u,1677794092u,138629120u,393216u}/* FE82 */, /*15909*/{1854406656u,1280u,458753u,76592389u,1515552u,3758620704u,1677794100u,138637312u,393216u}/* FE83 */, /*15910*/{1854930944u,1280u,458753u,76592357u,1515552u,3758620704u,1677794100u,138629120u,393216u}/* FE84 */, /*15911*/{1855455232u,1280u,458753u,76592389u,1515552u,3758620704u,1677794124u,138637312u,393216u}/* FE85 */, /*15912*/{1855979520u,1280u,458753u,76592357u,1515552u,3758620704u,1677794124u,138629120u,393216u}/* FE86 */, /*15913*/{1856503808u,1280u,458753u,76592389u,1515552u,3758620704u,1677794132u,138637312u,393216u}/* FE87 */, /*15914*/{1857028096u,1280u,458753u,76592357u,1515552u,3758620704u,1677794132u,138629120u,393216u}/* FE88 */, /*15915*/{1857552384u,1280u,458753u,76592389u,1515552u,3758620704u,1677794164u,138637312u,393216u}/* FE89 */, /*15916*/{1858076672u,1280u,458753u,76592357u,1515552u,3758620704u,1677794164u,138629120u,393216u}/* FE8A */, /*15917*/{1858600960u,1280u,458753u,76592293u,1515552u,3758620704u,1677794164u,138612736u,393216u}/* FE8B */, /*15918*/{1859125248u,1280u,458753u,76592325u,1515552u,3758620704u,1677794164u,138620928u,393216u}/* FE8C */, /*15919*/{1859649536u,1280u,458753u,76592389u,1515552u,3758620704u,1677794196u,138637312u,393216u}/* FE8D */, /*15920*/{1860173824u,1280u,458753u,76592357u,1515552u,3758620704u,1677794196u,138629120u,393216u}/* FE8E */, /*15921*/{1860698112u,1280u,458753u,76592389u,1515552u,3758620704u,1677794212u,138637312u,393216u}/* FE8F */, /*15922*/{1861222400u,1280u,458753u,76592357u,1515552u,3758620704u,1677794212u,138629120u,393216u}/* FE90 */, /*15923*/{1861746688u,1280u,458753u,76592293u,1515552u,3758620704u,1677794212u,138612736u,393216u}/* FE91 */, /*15924*/{1862270976u,1280u,458753u,76592325u,1515552u,3758620704u,1677794212u,138620928u,393216u}/* FE92 */, /*15925*/{1862795264u,1280u,458753u,76592389u,1515552u,3758620704u,1677794332u,138637312u,393216u}/* FE93 */, /*15926*/{1863319552u,1280u,458753u,76592357u,1515552u,3758620704u,1677794332u,138629120u,393216u}/* FE94 */, /*15927*/{1863843840u,1280u,458753u,76592389u,1515552u,3758620704u,1677794340u,138637312u,393216u}/* FE95 */, /*15928*/{1864368128u,1280u,458753u,76592357u,1515552u,3758620704u,1677794340u,138629120u,393216u}/* FE96 */, /*15929*/{1864892416u,1280u,458753u,76592293u,1515552u,3758620704u,1677794340u,138612736u,393216u}/* FE97 */, /*15930*/{1865416704u,1280u,458753u,76592325u,1515552u,3758620704u,1677794340u,138620928u,393216u}/* FE98 */, /*15931*/{1865940992u,1280u,458753u,76592389u,1515552u,3758620704u,1677794348u,138637312u,393216u}/* FE99 */, /*15932*/{1866465280u,1280u,458753u,76592357u,1515552u,3758620704u,1677794348u,138629120u,393216u}/* FE9A */, /*15933*/{1866989568u,1280u,458753u,76592293u,1515552u,3758620704u,1677794348u,138612736u,393216u}/* FE9B */, /*15934*/{1867513856u,1280u,458753u,76592325u,1515552u,3758620704u,1677794348u,138620928u,393216u}/* FE9C */, /*15935*/{1868038144u,1280u,458753u,76592389u,1515552u,3758620704u,1677794404u,138637312u,393216u}/* FE9D */, /*15936*/{1868562432u,1280u,458753u,76592357u,1515552u,3758620704u,1677794404u,138629120u,393216u}/* FE9E */, /*15937*/{1869086720u,1280u,458753u,76592293u,1515552u,3758620704u,1677794404u,138612736u,393216u}/* FE9F */, /*15938*/{1869611008u,1280u,458753u,76592325u,1515552u,3758620704u,1677794404u,138620928u,393216u}/* FEA0 */, /*15939*/{1870135296u,1280u,458753u,76592389u,1515552u,3758620704u,1677794460u,138637312u,393216u}/* FEA1 */, /*15940*/{1870659584u,1280u,458753u,76592357u,1515552u,3758620704u,1677794460u,138629120u,393216u}/* FEA2 */, /*15941*/{1871183872u,1280u,458753u,76592293u,1515552u,3758620704u,1677794460u,138612736u,393216u}/* FEA3 */, /*15942*/{1871708160u,1280u,458753u,76592325u,1515552u,3758620704u,1677794460u,138620928u,393216u}/* FEA4 */, /*15943*/{1872232448u,1280u,458753u,76592389u,1515552u,3758620704u,1677794468u,138637312u,393216u}/* FEA5 */, /*15944*/{1872756736u,1280u,458753u,76592357u,1515552u,3758620704u,1677794468u,138629120u,393216u}/* FEA6 */, /*15945*/{1873281024u,1280u,458753u,76592293u,1515552u,3758620704u,1677794468u,138612736u,393216u}/* FEA7 */, /*15946*/{1873805312u,1280u,458753u,76592325u,1515552u,3758620704u,1677794468u,138620928u,393216u}/* FEA8 */, /*15947*/{1874329600u,1280u,458753u,76592389u,1515552u,3758620704u,1677794548u,138637312u,393216u}/* FEA9 */, /*15948*/{1874853888u,1280u,458753u,76592357u,1515552u,3758620704u,1677794548u,138629120u,393216u}/* FEAA */, /*15949*/{1875378176u,1280u,458753u,76592389u,1515552u,3758620704u,1677794556u,138637312u,393216u}/* FEAB */, /*15950*/{1875902464u,1280u,458753u,76592357u,1515552u,3758620704u,1677794556u,138629120u,393216u}/* FEAC */, /*15951*/{1876426752u,1280u,458753u,76592389u,1515552u,3758620704u,1677794668u,138637312u,393216u}/* FEAD */, /*15952*/{1876951040u,1280u,458753u,76592357u,1515552u,3758620704u,1677794668u,138629120u,393216u}/* FEAE */, /*15953*/{1877475328u,1280u,458753u,76592389u,1515552u,3758620704u,1677794676u,138637312u,393216u}/* FEAF */, /*15954*/{1877999616u,1280u,458753u,76592357u,1515552u,3758620704u,1677794676u,138629120u,393216u}/* FEB0 */, /*15955*/{1878523904u,1280u,458753u,76592389u,1515552u,3758620704u,1677794820u,138637312u,393216u}/* FEB1 */, /*15956*/{1879048192u,1280u,458753u,76592357u,1515552u,3758620704u,1677794820u,138629120u,393216u}/* FEB2 */, /*15957*/{1879572480u,1280u,458753u,76592293u,1515552u,3758620704u,1677794820u,138612736u,393216u}/* FEB3 */, /*15958*/{1880096768u,1280u,458753u,76592325u,1515552u,3758620704u,1677794820u,138620928u,393216u}/* FEB4 */, /*15959*/{1880621056u,1280u,458753u,76592389u,1515552u,3758620704u,1677794828u,138637312u,393216u}/* FEB5 */, /*15960*/{1881145344u,1280u,458753u,76592357u,1515552u,3758620704u,1677794828u,138629120u,393216u}/* FEB6 */, /*15961*/{1881669632u,1280u,458753u,76592293u,1515552u,3758620704u,1677794828u,138612736u,393216u}/* FEB7 */, /*15962*/{1882193920u,1280u,458753u,76592325u,1515552u,3758620704u,1677794828u,138620928u,393216u}/* FEB8 */, /*15963*/{1882718208u,1280u,458753u,76592389u,1515552u,3758620704u,1677794908u,138637312u,393216u}/* FEB9 */, /*15964*/{1883242496u,1280u,458753u,76592357u,1515552u,3758620704u,1677794908u,138629120u,393216u}/* FEBA */, /*15965*/{1883766784u,1280u,458753u,76592293u,1515552u,3758620704u,1677794908u,138612736u,393216u}/* FEBB */, /*15966*/{1884291072u,1280u,458753u,76592325u,1515552u,3758620704u,1677794908u,138620928u,393216u}/* FEBC */, /*15967*/{1884815360u,1280u,458753u,76592389u,1515552u,3758620704u,1677794916u,138637312u,393216u}/* FEBD */, /*15968*/{1885339648u,1280u,458753u,76592357u,1515552u,3758620704u,1677794916u,138629120u,393216u}/* FEBE */, /*15969*/{1885863936u,1280u,458753u,76592293u,1515552u,3758620704u,1677794916u,138612736u,393216u}/* FEBF */, /*15970*/{1886388224u,1280u,458753u,76592325u,1515552u,3758620704u,1677794916u,138620928u,393216u}/* FEC0 */, /*15971*/{1886912512u,1280u,458753u,76592389u,1515552u,3758620704u,1677794956u,138637312u,393216u}/* FEC1 */, /*15972*/{1887436800u,1280u,458753u,76592357u,1515552u,3758620704u,1677794956u,138629120u,393216u}/* FEC2 */, /*15973*/{1887961088u,1280u,458753u,76592293u,1515552u,3758620704u,1677794956u,138612736u,393216u}/* FEC3 */, /*15974*/{1888485376u,1280u,458753u,76592325u,1515552u,3758620704u,1677794956u,138620928u,393216u}/* FEC4 */, /*15975*/{1889009664u,1280u,458753u,76592389u,1515552u,3758620704u,1677794964u,138637312u,393216u}/* FEC5 */, /*15976*/{1889533952u,1280u,458753u,76592357u,1515552u,3758620704u,1677794964u,138629120u,393216u}/* FEC6 */, /*15977*/{1890058240u,1280u,458753u,76592293u,1515552u,3758620704u,1677794964u,138612736u,393216u}/* FEC7 */, /*15978*/{1890582528u,1280u,458753u,76592325u,1515552u,3758620704u,1677794964u,138620928u,393216u}/* FEC8 */, /*15979*/{1891106816u,1280u,458753u,76592389u,1515552u,3758620704u,1677794988u,138637312u,393216u}/* FEC9 */, /*15980*/{1891631104u,1280u,458753u,76592357u,1515552u,3758620704u,1677794988u,138629120u,393216u}/* FECA */, /*15981*/{1892155392u,1280u,458753u,76592293u,1515552u,3758620704u,1677794988u,138612736u,393216u}/* FECB */, /*15982*/{1892679680u,1280u,458753u,76592325u,1515552u,3758620704u,1677794988u,138620928u,393216u}/* FECC */, /*15983*/{1893203968u,1280u,458753u,76592389u,1515552u,3758620704u,1677794996u,138637312u,393216u}/* FECD */, /*15984*/{1893728256u,1280u,458753u,76592357u,1515552u,3758620704u,1677794996u,138629120u,393216u}/* FECE */, /*15985*/{1894252544u,1280u,458753u,76592293u,1515552u,3758620704u,1677794996u,138612736u,393216u}/* FECF */, /*15986*/{1894776832u,1280u,458753u,76592325u,1515552u,3758620704u,1677794996u,138620928u,393216u}/* FED0 */, /*15987*/{1895301120u,1280u,458753u,76592389u,1515552u,3758620704u,1677795052u,138637312u,393216u}/* FED1 */, /*15988*/{1895825408u,1280u,458753u,76592357u,1515552u,3758620704u,1677795052u,138629120u,393216u}/* FED2 */, /*15989*/{1896349696u,1280u,458753u,76592293u,1515552u,3758620704u,1677795052u,138612736u,393216u}/* FED3 */, /*15990*/{1896873984u,1280u,458753u,76592325u,1515552u,3758620704u,1677795052u,138620928u,393216u}/* FED4 */, /*15991*/{1897398272u,1280u,458753u,76592389u,1515552u,3758620704u,1677795148u,138637312u,393216u}/* FED5 */, /*15992*/{1897922560u,1280u,458753u,76592357u,1515552u,3758620704u,1677795148u,138629120u,393216u}/* FED6 */, /*15993*/{1898446848u,1280u,458753u,76592293u,1515552u,3758620704u,1677795148u,138612736u,393216u}/* FED7 */, /*15994*/{1898971136u,1280u,458753u,76592325u,1515552u,3758620704u,1677795148u,138620928u,393216u}/* FED8 */, /*15995*/{1899495424u,1280u,458753u,76592389u,1515552u,3758620704u,1677795188u,138637312u,393216u}/* FED9 */, /*15996*/{1900019712u,1280u,458753u,76592357u,1515552u,3758620704u,1677795188u,138629120u,393216u}/* FEDA */, /*15997*/{1900544000u,1280u,458753u,76592293u,1515552u,3758620704u,1677795188u,138612736u,393216u}/* FEDB */, /*15998*/{1901068288u,1280u,458753u,76592325u,1515552u,3758620704u,1677795188u,138620928u,393216u}/* FEDC */, /*15999*/{1901592576u,1280u,458753u,76592389u,1515552u,3758620704u,1677795356u,138637312u,393216u}/* FEDD */, /*16000*/{1902116864u,1280u,458753u,76592357u,1515552u,3758620704u,1677795356u,138629120u,393216u}/* FEDE */, /*16001*/{1902641152u,1280u,458753u,76592293u,1515552u,3758620704u,1677795356u,138612736u,393216u}/* FEDF */, /*16002*/{1903165440u,1280u,458753u,76592325u,1515552u,3758620704u,1677795356u,138620928u,393216u}/* FEE0 */, /*16003*/{1903689728u,1280u,458753u,76592389u,1515552u,3758620704u,1677795412u,138637312u,393216u}/* FEE1 */, /*16004*/{1904214016u,1280u,458753u,76592357u,1515552u,3758620704u,1677795412u,138629120u,393216u}/* FEE2 */, /*16005*/{1904738304u,1280u,458753u,76592293u,1515552u,3758620704u,1677795412u,138612736u,393216u}/* FEE3 */, /*16006*/{1905262592u,1280u,458753u,76592325u,1515552u,3758620704u,1677795412u,138620928u,393216u}/* FEE4 */, /*16007*/{1905786880u,1280u,458753u,76592389u,1515552u,3758620704u,1677795444u,138637312u,393216u}/* FEE5 */, /*16008*/{1906311168u,1280u,458753u,76592357u,1515552u,3758620704u,1677795444u,138629120u,393216u}/* FEE6 */, /*16009*/{1906835456u,1280u,458753u,76592293u,1515552u,3758620704u,1677795444u,138612736u,393216u}/* FEE7 */, /*16010*/{1907359744u,1280u,458753u,76592325u,1515552u,3758620704u,1677795444u,138620928u,393216u}/* FEE8 */, /*16011*/{1907884032u,1280u,458753u,76592389u,1515552u,3758620704u,1677795524u,138637312u,393216u}/* FEE9 */, /*16012*/{1908408320u,1280u,458753u,76592357u,1515552u,3758620704u,1677795524u,138629120u,393216u}/* FEEA */, /*16013*/{1908932608u,1280u,458753u,76592293u,1515552u,3758620704u,1677795524u,138612736u,393216u}/* FEEB */, /*16014*/{1909456896u,1280u,458753u,76592325u,1515552u,3758620704u,1677795524u,138620928u,393216u}/* FEEC */, /*16015*/{1909981184u,1280u,458753u,76592389u,1515552u,3758620704u,1677795572u,138637312u,393216u}/* FEED */, /*16016*/{1910505472u,1280u,458753u,76592357u,1515552u,3758620704u,1677795572u,138629120u,393216u}/* FEEE */, /*16017*/{1911029760u,1280u,458753u,76592389u,1515552u,3758620704u,1677795684u,138637312u,393216u}/* FEEF */, /*16018*/{1911554048u,1280u,458753u,76592357u,1515552u,3758620704u,1677795684u,138629120u,393216u}/* FEF0 */, /*16019*/{1912078336u,1280u,458753u,76592389u,1515552u,3758620704u,1677795692u,138637312u,393216u}/* FEF1 */, /*16020*/{1912602624u,1280u,458753u,76592357u,1515552u,3758620704u,1677795692u,138629120u,393216u}/* FEF2 */, /*16021*/{1913126912u,1280u,458753u,76592293u,1515552u,3758620704u,1677795692u,138612736u,393216u}/* FEF3 */, /*16022*/{1913651200u,1280u,458753u,76592325u,1515552u,3758620704u,1677795692u,138620928u,393216u}/* FEF4 */, /*16023*/{1914175488u,1280u,458753u,76592389u,1515552u,3758620704u,1677867836u,273068032u,393216u}/* FEF5 */, /*16024*/{1914699776u,1280u,458753u,76592357u,1515552u,3758620704u,1677867836u,273051648u,393216u}/* FEF6 */, /*16025*/{1915224064u,1280u,458753u,76592389u,1515552u,3758620704u,1677867844u,273068032u,393216u}/* FEF7 */, /*16026*/{1915748352u,1280u,458753u,76592357u,1515552u,3758620704u,1677867844u,273051648u,393216u}/* FEF8 */, /*16027*/{1916272640u,1280u,458753u,76592389u,1515552u,3758620704u,1677867876u,273068032u,393216u}/* FEF9 */, /*16028*/{1916796928u,1280u,458753u,76592357u,1515552u,3758620704u,1677867876u,273051648u,393216u}/* FEFA */, /*16029*/{1917321216u,1280u,458753u,76592389u,1515552u,3758620704u,1677867940u,273068032u,393216u}/* FEFB */, /*16030*/{1917845504u,1280u,458753u,76592357u,1515552u,3758620704u,1677867940u,273051648u,393216u}/* FEFC */, /*16031*/{0,1280u,65537u,101755920u,538091528u,1695055872u,12u,4208640u,0}/* FEFF */, /*16032*/{1918369792u,1292u,65537u,74492343u,98336u,1611137056u,4884u,138448898u,41943040u}/* FF01 */, /*16033*/{1918894080u,1292u,65537u,102803895u,32u,1611137056u,6260u,138448898u,536870912u}/* FF02 */, /*16034*/{1919418368u,1292u,65537u,102797751u,32u,1611137056u,7380u,138448898u,0}/* FF03 */, /*16035*/{1919942656u,1292u,65537u,77631929u,32u,1611137056u,58308u,138448896u,67108864u}/* FF04 */, /*16036*/{1920466944u,1292u,65537u,78680503u,32u,1611137056u,7388u,138448898u,0}/* FF05 */, /*16037*/{1920991232u,1292u,65537u,102803895u,32u,1611137056u,7364u,138448898u,0}/* FF06 */, /*16038*/{1921515520u,1292u,65537u,102803895u,1835040u,1627914272u,6204u,138448898u,536870912u}/* FF07 */, /*16039*/{1922039808u,1447180u,65537u,79735220u,106528u,1745354784u,6348u,138448898u,0}/* FF08 */, /*16040*/{1922564096u,1451276u,65537u,86026677u,106528u,1745354784u,6356u,138448898u,0}/* FF09 */, /*16041*/{1923088384u,1292u,65537u,102803895u,32u,1611137056u,7308u,138448898u,0}/* FF0A */, /*16042*/{1923612672u,1292u,65537u,102796728u,32u,1611137056u,12654u,138448896u,67108864u}/* FF0B */, /*16043*/{1924136960u,1292u,65537u,86022583u,1818656u,1611137056u,4380u,138448898u,8388608u}/* FF0C */, /*16044*/{1924661248u,1292u,65537u,102796723u,114720u,1611202594u,4212u,138448898u,0}/* FF0D */, /*16045*/{1925185536u,1292u,65537u,86022583u,1925152u,1627914272u,5068u,138448898u,41943040u}/* FF0E */, /*16046*/{1925709824u,1292u,65537u,102799799u,32u,1611137056u,7348u,138448898u,0}/* FF0F */, /*16047*/{1926234112u,1292u,33620993u,102795689u,8388646u,1611137060u,1073800485u,138448896u,262144u}/* FF10 */, /*16048*/{1926758400u,1292u,536937985u,102795689u,8388646u,1611137060u,1073800493u,138448896u,262144u}/* FF11 */, /*16049*/{1927282688u,1292u,570493441u,102795689u,8388646u,1611137060u,1073800501u,138448896u,262144u}/* FF12 */, /*16050*/{1927806976u,1292u,604047361u,102795689u,8388646u,1611137060u,1073800509u,138448896u,262144u}/* FF13 */, /*16051*/{1928331264u,1292u,637603841u,102795689u,8388646u,1611137060u,1073800517u,138448896u,262144u}/* FF14 */, /*16052*/{1928855552u,1292u,671157249u,102795689u,8388646u,1611137060u,1073800525u,138448896u,262144u}/* FF15 */, /*16053*/{1929379840u,1292u,704714241u,102795689u,8388646u,1611137060u,1073800533u,138448896u,262144u}/* FF16 */, /*16054*/{1929904128u,1292u,738266625u,102795689u,8388646u,1611137060u,1073800541u,138448896u,262144u}/* FF17 */, /*16055*/{1930428416u,1292u,771824641u,102795689u,8388646u,1611137060u,1073800549u,138448896u,262144u}/* FF18 */, /*16056*/{1930952704u,1292u,805377025u,102795689u,8388646u,1611137060u,1073800557u,138448896u,262144u}/* FF19 */, /*16057*/{1931476992u,1292u,65537u,96508343u,1687584u,1627914272u,4572u,138448898u,8388608u}/* FF1A */, /*16058*/{1932001280u,1292u,65537u,96512439u,1703968u,1611137056u,4524u,138448898u,8388608u}/* FF1B */, /*16059*/{1932525568u,1455372u,65537u,102803896u,32u,1745354784u,12686u,138448896u,67108864u}/* FF1C */, /*16060*/{1933049856u,1292u,65537u,102803896u,32u,1611137056u,12694u,138448896u,67108864u}/* FF1D */, /*16061*/{1933574144u,1459468u,65537u,102803896u,32u,1745354784u,12702u,138448896u,67108864u}/* FF1E */, /*16062*/{1934098432u,1292u,65537u,74492343u,98336u,1611137056u,4932u,138448898u,41943040u}/* FF1F */, /*16063*/{1934622720u,1292u,65537u,102803895u,32u,1611137056u,7300u,138448898u,0}/* FF20 */, /*16064*/{1935426560u,2262828300u,131073u,102793633u,1507360u,3807903780u,1711334772u,138498048u,2490368u}/* FF21 */, /*16065*/{1935950976u,2264925452u,131073u,102793633u,1507360u,3807903780u,1711334972u,138498048u,2490368u}/* FF22 */, /*16066*/{1936475392u,2267022604u,131073u,102793633u,1507360u,3807903780u,1711335180u,138498048u,2490368u}/* FF23 */, /*16067*/{1936999808u,2269119756u,131073u,102793633u,1507360u,3807903780u,1711335348u,138498048u,2490368u}/* FF24 */, /*16068*/{1937524224u,2271216908u,131073u,102793633u,1507360u,3807903780u,1711335564u,138498048u,2490368u}/* FF25 */, /*16069*/{1938048640u,2273314060u,131073u,102793633u,1507360u,3807903780u,1711336036u,138498048u,2490368u}/* FF26 */, /*16070*/{1938573056u,2275411212u,131073u,102793633u,1507360u,3807903776u,1711336156u,138498048u,2490368u}/* FF27 */, /*16071*/{1939097472u,2277508364u,131073u,102793633u,1507360u,3807903776u,1711336444u,138498048u,2490368u}/* FF28 */, /*16072*/{1939621888u,2279605516u,131073u,102793633u,1507360u,3807903776u,1711336652u,138498048u,2490368u}/* FF29 */, /*16073*/{1940146304u,2281702668u,131073u,102793633u,1507360u,3807903776u,1711336860u,138498048u,2490368u}/* FF2A */, /*16074*/{1940670720u,2283799820u,131073u,102793633u,1507360u,3807903776u,1711337060u,138498048u,2490368u}/* FF2B */, /*16075*/{1941195136u,2285896972u,131073u,102793633u,1507360u,3807903776u,1711337204u,138498048u,2490368u}/* FF2C */, /*16076*/{1941719552u,2287994124u,131073u,102793633u,1507360u,3807903776u,1711337612u,138498048u,2490368u}/* FF2D */, /*16077*/{1942243968u,2290091276u,131073u,102793633u,1507360u,3807903776u,1711337732u,138498048u,2490368u}/* FF2E */, /*16078*/{1942768384u,2292188428u,131073u,102793633u,1507360u,3807903776u,1711338020u,138498048u,2490368u}/* FF2F */, /*16079*/{1943292800u,2294285580u,131073u,102793633u,1507360u,3807903776u,1711338396u,138498048u,2490368u}/* FF30 */, /*16080*/{1943817216u,2296382732u,131073u,102793633u,1507360u,3807903776u,1711338564u,138498048u,2490368u}/* FF31 */, /*16081*/{1944341632u,2298479884u,131073u,102793633u,1507360u,3807903776u,1711338708u,138498048u,2490368u}/* FF32 */, /*16082*/{1944866048u,2300577036u,131073u,102793633u,1507360u,3807903776u,1711339204u,138498048u,2490368u}/* FF33 */, /*16083*/{1945390464u,2302674188u,131073u,102793633u,1507360u,3807903776u,1711339492u,138498048u,2490368u}/* FF34 */, /*16084*/{1945914880u,2304771340u,131073u,102793633u,1507360u,3807903776u,1711339748u,138498048u,2490368u}/* FF35 */, /*16085*/{1946439296u,2306868492u,131073u,102793633u,1507360u,3807903776u,1711340116u,138498048u,2490368u}/* FF36 */, /*16086*/{1946963712u,2308965644u,131073u,102793633u,1507360u,3807903776u,1711340260u,138498048u,2490368u}/* FF37 */, /*16087*/{1947488128u,2311062796u,131073u,102793633u,1507360u,3807903776u,1711340340u,138498048u,2490368u}/* FF38 */, /*16088*/{1948012544u,2313159948u,131073u,102793633u,1507360u,3807903776u,1711340436u,138498048u,2490368u}/* FF39 */, /*16089*/{1948536960u,2315257100u,131073u,102793633u,1507360u,3807903776u,1711340612u,138498048u,2490368u}/* FF3A */, /*16090*/{1948778496u,1463564u,65537u,79735220u,106528u,1745354784u,6364u,138448898u,0}/* FF3B */, /*16091*/{1949302784u,1292u,65537u,102803895u,32u,1611137056u,7358u,138448906u,0}/* FF3C */, /*16092*/{1949827072u,1467660u,65537u,86026677u,106528u,1745354784u,6372u,138448898u,0}/* FF3D */, /*16093*/{1950351360u,1292u,65537u,102803898u,32u,1627922464u,9446u,138448904u,67108864u}/* FF3E */, /*16094*/{1950875648u,1292u,65537u,102803894u,2097184u,1611137056u,1073746020u,138448898u,262144u}/* FF3F */, /*16095*/{1951399936u,1292u,65537u,102803898u,32u,1627922464u,9420u,138448896u,67108864u}/* FF40 */, /*16096*/{1952207104u,1292u,131073u,102793634u,1499168u,3769499684u,1719723380u,138448896u,393216u}/* FF41 */, /*16097*/{1952731520u,1292u,131073u,102793634u,1499168u,3769499684u,1719723580u,138448896u,393216u}/* FF42 */, /*16098*/{1953255936u,1292u,131073u,102793634u,1499168u,3769499684u,1719723788u,138448896u,393216u}/* FF43 */, /*16099*/{1953780352u,1292u,131073u,102793634u,1499168u,3769499684u,1719723956u,138448896u,393216u}/* FF44 */, /*16100*/{1954304768u,1292u,131073u,102793634u,1499168u,3769499684u,1719724172u,138448896u,393216u}/* FF45 */, /*16101*/{1954829184u,1292u,131073u,102793634u,1499168u,3769499684u,1719724644u,138448896u,393216u}/* FF46 */, /*16102*/{1955353600u,1292u,131073u,102793634u,1499168u,3769499680u,1719724764u,138448896u,393216u}/* FF47 */, /*16103*/{1955878016u,1292u,131073u,102793634u,1499168u,3769499680u,1719725052u,138448896u,393216u}/* FF48 */, /*16104*/{1956402432u,1292u,131073u,102793634u,1499168u,3769499680u,1719725260u,138448896u,393216u}/* FF49 */, /*16105*/{1956926848u,1292u,131073u,102793634u,1499168u,3769499680u,1719725468u,138448896u,393216u}/* FF4A */, /*16106*/{1957451264u,1292u,131073u,102793634u,1499168u,3769499680u,1719725668u,138448896u,393216u}/* FF4B */, /*16107*/{1957975680u,1292u,131073u,102793634u,1499168u,3769499680u,1719725812u,138448896u,393216u}/* FF4C */, /*16108*/{1958500096u,1292u,131073u,102793634u,1499168u,3769499680u,1719726220u,138448896u,393216u}/* FF4D */, /*16109*/{1959024512u,1292u,131073u,102793634u,1499168u,3769499680u,1719726340u,138448896u,393216u}/* FF4E */, /*16110*/{1959548928u,1292u,131073u,102793634u,1499168u,3769499680u,1719726628u,138448896u,393216u}/* FF4F */, /*16111*/{1960073344u,1292u,131073u,102793634u,1499168u,3769499680u,1719727004u,138448896u,393216u}/* FF50 */, /*16112*/{1960597760u,1292u,131073u,102793634u,1499168u,3769499680u,1719727172u,138448896u,393216u}/* FF51 */, /*16113*/{1961122176u,1292u,131073u,102793634u,1499168u,3769499680u,1719727316u,138448896u,393216u}/* FF52 */, /*16114*/{1961646592u,1292u,131073u,102793634u,1499168u,3769499680u,1719727812u,138448896u,393216u}/* FF53 */, /*16115*/{1962171008u,1292u,131073u,102793634u,1499168u,3769499680u,1719728100u,138448896u,393216u}/* FF54 */, /*16116*/{1962695424u,1292u,131073u,102793634u,1499168u,3769499680u,1719728356u,138448896u,393216u}/* FF55 */, /*16117*/{1963219840u,1292u,131073u,102793634u,1499168u,3769499680u,1719728724u,138448896u,393216u}/* FF56 */, /*16118*/{1963744256u,1292u,131073u,102793634u,1499168u,3769499680u,1719728868u,138448896u,393216u}/* FF57 */, /*16119*/{1964268672u,1292u,131073u,102793634u,1499168u,3769499680u,1719728948u,138448896u,393216u}/* FF58 */, /*16120*/{1964793088u,1292u,131073u,102793634u,1499168u,3769499680u,1719729044u,138448896u,393216u}/* FF59 */, /*16121*/{1965317504u,1292u,131073u,102793634u,1499168u,3769499680u,1719729220u,138448896u,393216u}/* FF5A */, /*16122*/{1965555712u,1471756u,65537u,79735220u,106528u,1745354784u,6380u,138448898u,0}/* FF5B */, /*16123*/{1966080000u,1292u,65537u,102803896u,32u,1611137056u,12718u,138448896u,67108864u}/* FF5C */, /*16124*/{1966604288u,1475852u,65537u,86026677u,106528u,1745354784u,6388u,138448898u,0}/* FF5D */, /*16125*/{1967128576u,1292u,65537u,102803896u,32u,1611137056u,12734u,138448896u,67108864u}/* FF5E */, /*16126*/{1967652864u,1479948u,65537u,79899060u,106528u,1745354784u,6524u,138448898u,0}/* FF5F */, /*16127*/{1968177152u,1484044u,65537u,86190517u,106528u,1745354784u,6532u,138448898u,0}/* FF60 */, /*16128*/{1968701440u,1290u,65537u,86026711u,98336u,1611137056u,5220u,138571778u,41943040u}/* FF61 */, /*16129*/{1969225728u,1488138u,65537u,79735252u,106528u,1745354784u,7084u,138571778u,536870912u}/* FF62 */, /*16130*/{1969750016u,1492234u,65537u,86026709u,106528u,1745354784u,7092u,138571778u,536870912u}/* FF63 */, /*16131*/{1970274304u,1290u,65537u,86026711u,114720u,1611137056u,4500u,138571778u,8388608u}/* FF64 */, /*16132*/{1970798592u,1290u,65537u,96512471u,32u,1611137058u,4372u,138571778u,0}/* FF65 */, /*16133*/{1971322880u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849868u,138571776u,393216u}/* FF66 */, /*16134*/{1971847168u,1290u,2228225u,104890821u,1384480u,3758620704u,1677849492u,138555392u,393216u}/* FF67 */, /*16135*/{1972371456u,1290u,2228225u,104890821u,1384480u,3758620704u,1677849500u,138555392u,393216u}/* FF68 */, /*16136*/{1972895744u,1290u,2228225u,104890821u,1384480u,3758620704u,1677849508u,138555392u,393216u}/* FF69 */, /*16137*/{1973420032u,1290u,2228225u,104890821u,1384480u,3758620704u,1677849524u,138555392u,393216u}/* FF6A */, /*16138*/{1973944320u,1290u,2228225u,104890821u,1384480u,3758620704u,1677849532u,138555392u,393216u}/* FF6B */, /*16139*/{1974468608u,1290u,2228225u,104890821u,1384480u,3758620704u,1677849780u,138555392u,393216u}/* FF6C */, /*16140*/{1974992896u,1290u,2228225u,104890821u,1384480u,3758620704u,1677849788u,138555392u,393216u}/* FF6D */, /*16141*/{1975517184u,1290u,2228225u,104890821u,1384480u,3758620704u,1677849796u,138555392u,393216u}/* FF6E */, /*16142*/{1976041472u,1290u,2228225u,104890821u,1384480u,3758620704u,1677849636u,138555392u,393216u}/* FF6F */, /*16143*/{1976565760u,1290u,65537u,104890820u,1384480u,3775406240u,1677779876u,138571776u,393216u}/* FF70 */, /*16144*/{1977090048u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849492u,138571776u,393216u}/* FF71 */, /*16145*/{1977614336u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849500u,138571776u,393216u}/* FF72 */, /*16146*/{1978138624u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849508u,138571776u,393216u}/* FF73 */, /*16147*/{1978662912u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849524u,138571776u,393216u}/* FF74 */, /*16148*/{1979187200u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849532u,138571776u,393216u}/* FF75 */, /*16149*/{1979711488u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849540u,138571776u,393216u}/* FF76 */, /*16150*/{1980235776u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849548u,138571776u,393216u}/* FF77 */, /*16151*/{1980760064u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849556u,138571776u,393216u}/* FF78 */, /*16152*/{1981284352u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849564u,138571776u,393216u}/* FF79 */, /*16153*/{1981808640u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849572u,138571776u,393216u}/* FF7A */, /*16154*/{1982332928u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849580u,138571776u,393216u}/* FF7B */, /*16155*/{1982857216u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849588u,138571776u,393216u}/* FF7C */, /*16156*/{1983381504u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849596u,138571776u,393216u}/* FF7D */, /*16157*/{1983905792u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849604u,138571776u,393216u}/* FF7E */, /*16158*/{1984430080u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849612u,138571776u,393216u}/* FF7F */, /*16159*/{1984954368u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849620u,138571776u,393216u}/* FF80 */, /*16160*/{1985478656u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849628u,138571776u,393216u}/* FF81 */, /*16161*/{1986002944u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849636u,138571776u,393216u}/* FF82 */, /*16162*/{1986527232u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849644u,138571776u,393216u}/* FF83 */, /*16163*/{1987051520u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849652u,138571776u,393216u}/* FF84 */, /*16164*/{1987575808u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849660u,138571776u,393216u}/* FF85 */, /*16165*/{1988100096u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849668u,138571776u,393216u}/* FF86 */, /*16166*/{1988624384u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849676u,138571776u,393216u}/* FF87 */, /*16167*/{1989148672u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849684u,138571776u,393216u}/* FF88 */, /*16168*/{1989672960u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849692u,138571776u,393216u}/* FF89 */, /*16169*/{1990197248u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849700u,138571776u,393216u}/* FF8A */, /*16170*/{1990721536u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849708u,138571776u,393216u}/* FF8B */, /*16171*/{1991245824u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849716u,138571776u,393216u}/* FF8C */, /*16172*/{1991770112u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849724u,138571776u,393216u}/* FF8D */, /*16173*/{1992294400u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849732u,138571776u,393216u}/* FF8E */, /*16174*/{1992818688u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849740u,138571776u,393216u}/* FF8F */, /*16175*/{1993342976u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849748u,138571776u,393216u}/* FF90 */, /*16176*/{1993867264u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849756u,138571776u,393216u}/* FF91 */, /*16177*/{1994391552u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849764u,138571776u,393216u}/* FF92 */, /*16178*/{1994915840u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849772u,138571776u,393216u}/* FF93 */, /*16179*/{1995440128u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849780u,138571776u,393216u}/* FF94 */, /*16180*/{1995964416u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849788u,138571776u,393216u}/* FF95 */, /*16181*/{1996488704u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849796u,138571776u,393216u}/* FF96 */, /*16182*/{1997012992u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849804u,138571776u,393216u}/* FF97 */, /*16183*/{1997537280u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849812u,138571776u,393216u}/* FF98 */, /*16184*/{1998061568u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849820u,138571776u,393216u}/* FF99 */, /*16185*/{1998585856u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849828u,138571776u,393216u}/* FF9A */, /*16186*/{1999110144u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849836u,138571776u,393216u}/* FF9B */, /*16187*/{1999634432u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849844u,138571776u,393216u}/* FF9C */, /*16188*/{2000158720u,1290u,2228225u,102793669u,1384480u,3758620704u,1677849876u,138571776u,393216u}/* FF9D */, /*16189*/{2000683008u,1290u,65537u,96502212u,672030720u,3775406096u,1677721612u,235040896u,262144u}/* FF9E */, /*16190*/{2001207296u,1290u,65537u,96502212u,672030720u,3775406096u,1677721612u,239235200u,262144u}/* FF9F */, /*16191*/{2001731584u,1290u,1638401u,102793669u,1515552u,3758653472u,1677847636u,138572032u,393216u}/* FFA0 */, /*16192*/{2002255872u,1290u,1638401u,102793669u,1515552u,3758620704u,1677846636u,138571776u,393216u}/* FFA1 */, /*16193*/{2002780160u,1290u,1638401u,102793669u,1515552u,3758620704u,1677846644u,138571776u,393216u}/* FFA2 */, /*16194*/{2003304448u,1290u,1638401u,102793669u,1515552u,3758620704u,1677848412u,138571776u,393216u}/* FFA3 */, /*16195*/{2003828736u,1290u,1638401u,102793669u,1515552u,3758620704u,1677846652u,138571776u,393216u}/* FFA4 */, /*16196*/{2004353024u,1290u,1638401u,102793669u,1515552u,3758620704u,1677848428u,138571776u,393216u}/* FFA5 */, /*16197*/{2004877312u,1290u,1638401u,102793669u,1515552u,3758620704u,1677848436u,138571776u,393216u}/* FFA6 */, /*16198*/{2005401600u,1290u,1638401u,102793669u,1515552u,3758620704u,1677846660u,138571776u,393216u}/* FFA7 */, /*16199*/{2005925888u,1290u,1638401u,102793669u,1515552u,3758620704u,1677846668u,138571776u,393216u}/* FFA8 */, /*16200*/{2006450176u,1290u,1638401u,102793669u,1515552u,3758620704u,1677846676u,138571776u,393216u}/* FFA9 */, /*16201*/{2006974464u,1290u,1638401u,102793669u,1515552u,3758620704u,1677848460u,138571776u,393216u}/* FFAA */, /*16202*/{2007498752u,1290u,1638401u,102793669u,1515552u,3758620704u,1677848468u,138571776u,393216u}/* FFAB */, /*16203*/{2008023040u,1290u,1638401u,102793669u,1515552u,3758620704u,1677848476u,138571776u,393216u}/* FFAC */, /*16204*/{2008547328u,1290u,1638401u,102793669u,1515552u,3758620704u,1677848484u,138571776u,393216u}/* FFAD */, /*16205*/{2009071616u,1290u,1638401u,102793669u,1515552u,3758620704u,1677848492u,138571776u,393216u}/* FFAE */, /*16206*/{2009595904u,1290u,1638401u,102793669u,1515552u,3758620704u,1677848500u,138571776u,393216u}/* FFAF */, /*16207*/{2010120192u,1290u,1638401u,102793669u,1515552u,3758620704u,1677846844u,138571776u,393216u}/* FFB0 */, /*16208*/{2010644480u,1290u,1638401u,102793669u,1515552u,3758620704u,1677846684u,138571776u,393216u}/* FFB1 */, /*16209*/{2011168768u,1290u,1638401u,102793669u,1515552u,3758620704u,1677846692u,138571776u,393216u}/* FFB2 */, /*16210*/{2011693056u,1290u,1638401u,102793669u,1515552u,3758620704u,1677846700u,138571776u,393216u}/* FFB3 */, /*16211*/{2012217344u,1290u,1638401u,102793669u,1515552u,3758620704u,1677846900u,138571776u,393216u}/* FFB4 */, /*16212*/{2012741632u,1290u,1638401u,102793669u,1515552u,3758620704u,1677846708u,138571776u,393216u}/* FFB5 */, /*16213*/{2013265920u,1290u,1638401u,102793669u,1515552u,3758620704u,1677846716u,138571776u,393216u}/* FFB6 */, /*16214*/{2013790208u,1290u,1638401u,102793669u,1515552u,3758620704u,1677846724u,138571776u,393216u}/* FFB7 */, /*16215*/{2014314496u,1290u,1638401u,102793669u,1515552u,3758620704u,1677846732u,138571776u,393216u}/* FFB8 */, /*16216*/{2014838784u,1290u,1638401u,102793669u,1515552u,3758620704u,1677846740u,138571776u,393216u}/* FFB9 */, /*16217*/{2015363072u,1290u,1638401u,102793669u,1515552u,3758620704u,1677846748u,138571776u,393216u}/* FFBA */, /*16218*/{2015887360u,1290u,1638401u,102793669u,1515552u,3758620704u,1677846756u,138571776u,393216u}/* FFBB */, /*16219*/{2016411648u,1290u,1638401u,102793669u,1515552u,3758620704u,1677846764u,138571776u,393216u}/* FFBC */, /*16220*/{2016935936u,1290u,1638401u,102793669u,1515552u,3758620704u,1677846772u,138571776u,393216u}/* FFBD */, /*16221*/{2017460224u,1290u,1638401u,102793669u,1515552u,3758620704u,1677846780u,138571776u,393216u}/* FFBE */, /*16222*/{2017984512u,1290u,1638401u,102793669u,1515552u,3758620704u,1677847644u,138571776u,393216u}/* FFC2 */, /*16223*/{2018508800u,1290u,1638401u,102793669u,1515552u,3758620704u,1677847652u,138571776u,393216u}/* FFC3 */, /*16224*/{2019033088u,1290u,1638401u,102793669u,1515552u,3758620704u,1677847660u,138571776u,393216u}/* FFC4 */, /*16225*/{2019557376u,1290u,1638401u,102793669u,1515552u,3758620704u,1677847668u,138571776u,393216u}/* FFC5 */, /*16226*/{2020081664u,1290u,1638401u,102793669u,1515552u,3758620704u,1677847676u,138571776u,393216u}/* FFC6 */, /*16227*/{2020605952u,1290u,1638401u,102793669u,1515552u,3758620704u,1677847684u,138571776u,393216u}/* FFC7 */, /*16228*/{2021130240u,1290u,1638401u,102793669u,1515552u,3758620704u,1677847692u,138571776u,393216u}/* FFCA */, /*16229*/{2021654528u,1290u,1638401u,102793669u,1515552u,3758620704u,1677847700u,138571776u,393216u}/* FFCB */, /*16230*/{2022178816u,1290u,1638401u,102793669u,1515552u,3758620704u,1677847708u,138571776u,393216u}/* FFCC */, /*16231*/{2022703104u,1290u,1638401u,102793669u,1515552u,3758620704u,1677847716u,138571776u,393216u}/* FFCD */, /*16232*/{2023227392u,1290u,1638401u,102793669u,1515552u,3758620704u,1677847724u,138571776u,393216u}/* FFCE */, /*16233*/{2023751680u,1290u,1638401u,102793669u,1515552u,3758620704u,1677847732u,138571776u,393216u}/* FFCF */, /*16234*/{2024275968u,1290u,1638401u,102793669u,1515552u,3758620704u,1677847740u,138571776u,393216u}/* FFD2 */, /*16235*/{2024800256u,1290u,1638401u,102793669u,1515552u,3758620704u,1677847748u,138571776u,393216u}/* FFD3 */, /*16236*/{2025324544u,1290u,1638401u,102793669u,1515552u,3758620704u,1677847756u,138571776u,393216u}/* FFD4 */, /*16237*/{2025848832u,1290u,1638401u,102793669u,1515552u,3758620704u,1677847764u,138571776u,393216u}/* FFD5 */, /*16238*/{2026373120u,1290u,1638401u,102793669u,1515552u,3758620704u,1677847772u,138571776u,393216u}/* FFD6 */, /*16239*/{2026897408u,1290u,1638401u,102793669u,1515552u,3758620704u,1677847780u,138571776u,393216u}/* FFD7 */, /*16240*/{2027421696u,1290u,1638401u,102793669u,1515552u,3758620704u,1677847788u,138571776u,393216u}/* FFDA */, /*16241*/{2027945984u,1290u,1638401u,102793669u,1515552u,3758620704u,1677847796u,138571776u,393216u}/* FFDB */, /*16242*/{2028470272u,1290u,1638401u,102793669u,1515552u,3758620704u,1677847804u,138571776u,393216u}/* FFDC */, /*16243*/{2028994560u,1292u,65537u,78680505u,32u,1611137056u,58300u,138448896u,67108864u}/* FFE0 */, /*16244*/{2029518848u,1292u,65537u,77631929u,32u,1611137056u,58316u,138448896u,67108864u}/* FFE1 */, /*16245*/{2030043136u,1292u,65537u,102803896u,32u,1611137056u,12710u,138448896u,67108864u}/* FFE2 */, /*16246*/{2030567424u,1292u,65537u,102803898u,32u,1627922464u,9452u,138448896u,67108864u}/* FFE3 */, /*16247*/{2031091712u,1292u,65537u,102803899u,32u,1611137056u,12724u,138448896u,67108864u}/* FFE4 */, /*16248*/{2031616000u,1292u,65537u,77631929u,32u,1611137056u,58324u,138448896u,67108864u}/* FFE5 */, /*16249*/{2032140288u,1292u,65537u,77631929u,32u,1611137056u,58476u,138448896u,67108864u}/* FFE6 */, /*16250*/{2032664576u,1290u,65537u,76589531u,32u,1611137056u,16788u,138571776u,67108864u}/* FFE8 */, /*16251*/{2033188864u,1290u,65537u,76589528u,32u,1611137056u,11678u,138571776u,67108864u}/* FFE9 */, /*16252*/{2033713152u,1290u,65537u,76589528u,32u,1611137056u,11694u,138571776u,67108864u}/* FFEA */, /*16253*/{2034237440u,1290u,65537u,76589528u,32u,1611137056u,11686u,138571776u,67108864u}/* FFEB */, /*16254*/{2034761728u,1290u,65537u,76589528u,32u,1611137056u,11702u,138571776u,67108864u}/* FFEC */, /*16255*/{2035286016u,1290u,65537u,76589531u,32u,1611137056u,18052u,138571776u,67108864u}/* FFED */, /*16256*/{2035810304u,1290u,65537u,76589531u,32u,1611137056u,18396u,138571776u,67108864u}/* FFEE */, /*16257*/{0,1296u,65537u,68298768u,538091528u,1694498816u,12u,4208640u,0}/* FFF9 */, /*16258*/{0,1296u,65537u,109160475u,40u,1610612768u,55252u,138442752u,67108864u}/* FFFC */, /*16259*/{0,1297u,65537u,89171995u,40u,1610612768u,524276u,138442752u,67108864u}/* FFFD */, /*16260*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869308u,138442752u,393216u}/* 10000 */, /*16261*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869316u,138442752u,393216u}/* 10001 */, /*16262*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869324u,138442752u,393216u}/* 10002 */, /*16263*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869332u,138442752u,393216u}/* 10003 */, /*16264*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869340u,138442752u,393216u}/* 10004 */, /*16265*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869348u,138442752u,393216u}/* 10005 */, /*16266*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869356u,138442752u,393216u}/* 10006 */, /*16267*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869364u,138442752u,393216u}/* 10007 */, /*16268*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869372u,138442752u,393216u}/* 10008 */, /*16269*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869380u,138442752u,393216u}/* 10009 */, /*16270*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869388u,138442752u,393216u}/* 1000A */, /*16271*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869396u,138442752u,393216u}/* 1000B */, /*16272*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869404u,138442752u,393216u}/* 1000D */, /*16273*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869412u,138442752u,393216u}/* 1000E */, /*16274*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869420u,138442752u,393216u}/* 1000F */, /*16275*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869428u,138442752u,393216u}/* 10010 */, /*16276*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869436u,138442752u,393216u}/* 10011 */, /*16277*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869444u,138442752u,393216u}/* 10012 */, /*16278*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869452u,138442752u,393216u}/* 10013 */, /*16279*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869460u,138442752u,393216u}/* 10014 */, /*16280*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869468u,138442752u,393216u}/* 10015 */, /*16281*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869476u,138442752u,393216u}/* 10016 */, /*16282*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869484u,138442752u,393216u}/* 10017 */, /*16283*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869492u,138442752u,393216u}/* 10018 */, /*16284*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869500u,138442752u,393216u}/* 10019 */, /*16285*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869508u,138442752u,393216u}/* 1001A */, /*16286*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869516u,138442752u,393216u}/* 1001B */, /*16287*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869524u,138442752u,393216u}/* 1001C */, /*16288*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869532u,138442752u,393216u}/* 1001D */, /*16289*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869540u,138442752u,393216u}/* 1001E */, /*16290*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869548u,138442752u,393216u}/* 1001F */, /*16291*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869556u,138442752u,393216u}/* 10020 */, /*16292*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869564u,138442752u,393216u}/* 10021 */, /*16293*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869572u,138442752u,393216u}/* 10022 */, /*16294*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869580u,138442752u,393216u}/* 10023 */, /*16295*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869588u,138442752u,393216u}/* 10024 */, /*16296*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869596u,138442752u,393216u}/* 10025 */, /*16297*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869604u,138442752u,393216u}/* 10026 */, /*16298*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869612u,138442752u,393216u}/* 10028 */, /*16299*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869620u,138442752u,393216u}/* 10029 */, /*16300*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869628u,138442752u,393216u}/* 1002A */, /*16301*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869636u,138442752u,393216u}/* 1002B */, /*16302*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869644u,138442752u,393216u}/* 1002C */, /*16303*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869652u,138442752u,393216u}/* 1002D */, /*16304*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869660u,138442752u,393216u}/* 1002E */, /*16305*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869668u,138442752u,393216u}/* 1002F */, /*16306*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869676u,138442752u,393216u}/* 10030 */, /*16307*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869684u,138442752u,393216u}/* 10031 */, /*16308*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869692u,138442752u,393216u}/* 10032 */, /*16309*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869700u,138442752u,393216u}/* 10033 */, /*16310*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869708u,138442752u,393216u}/* 10034 */, /*16311*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869716u,138442752u,393216u}/* 10035 */, /*16312*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869724u,138442752u,393216u}/* 10036 */, /*16313*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869732u,138442752u,393216u}/* 10037 */, /*16314*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869740u,138442752u,393216u}/* 10038 */, /*16315*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869748u,138442752u,393216u}/* 10039 */, /*16316*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869756u,138442752u,393216u}/* 1003A */, /*16317*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869764u,138442752u,393216u}/* 1003C */, /*16318*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869772u,138442752u,393216u}/* 1003D */, /*16319*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869780u,138442752u,393216u}/* 1003F */, /*16320*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869788u,138442752u,393216u}/* 10040 */, /*16321*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869796u,138442752u,393216u}/* 10041 */, /*16322*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869804u,138442752u,393216u}/* 10042 */, /*16323*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869812u,138442752u,393216u}/* 10043 */, /*16324*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869820u,138442752u,393216u}/* 10044 */, /*16325*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869828u,138442752u,393216u}/* 10045 */, /*16326*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869836u,138442752u,393216u}/* 10046 */, /*16327*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869844u,138442752u,393216u}/* 10047 */, /*16328*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869852u,138442752u,393216u}/* 10048 */, /*16329*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869860u,138442752u,393216u}/* 10049 */, /*16330*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869868u,138442752u,393216u}/* 1004A */, /*16331*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869876u,138442752u,393216u}/* 1004B */, /*16332*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869884u,138442752u,393216u}/* 1004C */, /*16333*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869892u,138442752u,393216u}/* 1004D */, /*16334*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869900u,138442752u,393216u}/* 10050 */, /*16335*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869908u,138442752u,393216u}/* 10051 */, /*16336*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869916u,138442752u,393216u}/* 10052 */, /*16337*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869924u,138442752u,393216u}/* 10053 */, /*16338*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869932u,138442752u,393216u}/* 10054 */, /*16339*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869940u,138442752u,393216u}/* 10055 */, /*16340*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869948u,138442752u,393216u}/* 10056 */, /*16341*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869956u,138442752u,393216u}/* 10057 */, /*16342*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869964u,138442752u,393216u}/* 10058 */, /*16343*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869972u,138442752u,393216u}/* 10059 */, /*16344*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869980u,138442752u,393216u}/* 1005A */, /*16345*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869988u,138442752u,393216u}/* 1005B */, /*16346*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677869996u,138442752u,393216u}/* 1005C */, /*16347*/{0,1304u,3145729u,76775429u,1515560u,3758096416u,1677870004u,138442752u,393216u}/* 1005D */, /*16348*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870012u,138442752u,393216u}/* 10080 */, /*16349*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870020u,138442752u,393216u}/* 10081 */, /*16350*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870028u,138442752u,393216u}/* 10082 */, /*16351*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870036u,138442752u,393216u}/* 10083 */, /*16352*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870044u,138442752u,393216u}/* 10084 */, /*16353*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870052u,138442752u,393216u}/* 10085 */, /*16354*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870060u,138442752u,393216u}/* 10086 */, /*16355*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870068u,138442752u,393216u}/* 10087 */, /*16356*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870076u,138442752u,393216u}/* 10088 */, /*16357*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870084u,138442752u,393216u}/* 10089 */, /*16358*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870092u,138442752u,393216u}/* 1008A */, /*16359*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870100u,138442752u,393216u}/* 1008B */, /*16360*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870108u,138442752u,393216u}/* 1008C */, /*16361*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870116u,138442752u,393216u}/* 1008D */, /*16362*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870124u,138442752u,393216u}/* 1008E */, /*16363*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870132u,138442752u,393216u}/* 1008F */, /*16364*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870140u,138442752u,393216u}/* 10090 */, /*16365*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870148u,138442752u,393216u}/* 10091 */, /*16366*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870156u,138442752u,393216u}/* 10092 */, /*16367*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870164u,138442752u,393216u}/* 10093 */, /*16368*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870172u,138442752u,393216u}/* 10094 */, /*16369*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870180u,138442752u,393216u}/* 10095 */, /*16370*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870188u,138442752u,393216u}/* 10096 */, /*16371*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870196u,138442752u,393216u}/* 10097 */, /*16372*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870204u,138442752u,393216u}/* 10098 */, /*16373*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870212u,138442752u,393216u}/* 10099 */, /*16374*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870220u,138442752u,393216u}/* 1009A */, /*16375*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870228u,138442752u,393216u}/* 1009B */, /*16376*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870236u,138442752u,393216u}/* 1009C */, /*16377*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870244u,138442752u,393216u}/* 1009D */, /*16378*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870252u,138442752u,393216u}/* 1009E */, /*16379*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870260u,138442752u,393216u}/* 1009F */, /*16380*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870268u,138442752u,393216u}/* 100A0 */, /*16381*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870276u,138442752u,393216u}/* 100A1 */, /*16382*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870284u,138442752u,393216u}/* 100A2 */, /*16383*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870292u,138442752u,393216u}/* 100A3 */, /*16384*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870300u,138442752u,393216u}/* 100A4 */, /*16385*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870308u,138442752u,393216u}/* 100A5 */, /*16386*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870316u,138442752u,393216u}/* 100A6 */, /*16387*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870324u,138442752u,393216u}/* 100A7 */, /*16388*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870332u,138442752u,393216u}/* 100A8 */, /*16389*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870340u,138442752u,393216u}/* 100A9 */, /*16390*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870348u,138442752u,393216u}/* 100AA */, /*16391*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870356u,138442752u,393216u}/* 100AB */, /*16392*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870364u,138442752u,393216u}/* 100AC */, /*16393*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870372u,138442752u,393216u}/* 100AD */, /*16394*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870380u,138442752u,393216u}/* 100AE */, /*16395*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870388u,138442752u,393216u}/* 100AF */, /*16396*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870396u,138442752u,393216u}/* 100B0 */, /*16397*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870404u,138442752u,393216u}/* 100B1 */, /*16398*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870412u,138442752u,393216u}/* 100B2 */, /*16399*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870420u,138442752u,393216u}/* 100B3 */, /*16400*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870428u,138442752u,393216u}/* 100B4 */, /*16401*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870436u,138442752u,393216u}/* 100B5 */, /*16402*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870444u,138442752u,393216u}/* 100B6 */, /*16403*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870452u,138442752u,393216u}/* 100B7 */, /*16404*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870460u,138442752u,393216u}/* 100B8 */, /*16405*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870468u,138442752u,393216u}/* 100B9 */, /*16406*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870476u,138442752u,393216u}/* 100BA */, /*16407*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870484u,138442752u,393216u}/* 100BB */, /*16408*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870492u,138442752u,393216u}/* 100BC */, /*16409*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870500u,138442752u,393216u}/* 100BD */, /*16410*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870508u,138442752u,393216u}/* 100BE */, /*16411*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870516u,138442752u,393216u}/* 100BF */, /*16412*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870524u,138442752u,393216u}/* 100C0 */, /*16413*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870532u,138442752u,393216u}/* 100C1 */, /*16414*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870540u,138442752u,393216u}/* 100C2 */, /*16415*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870548u,138442752u,393216u}/* 100C3 */, /*16416*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870556u,138442752u,393216u}/* 100C4 */, /*16417*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870564u,138442752u,393216u}/* 100C5 */, /*16418*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870572u,138442752u,393216u}/* 100C6 */, /*16419*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870580u,138442752u,393216u}/* 100C7 */, /*16420*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870588u,138442752u,393216u}/* 100C8 */, /*16421*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870596u,138442752u,393216u}/* 100C9 */, /*16422*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870604u,138442752u,393216u}/* 100CA */, /*16423*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870612u,138442752u,393216u}/* 100CB */, /*16424*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870620u,138442752u,393216u}/* 100CC */, /*16425*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870628u,138442752u,393216u}/* 100CD */, /*16426*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870636u,138442752u,393216u}/* 100CE */, /*16427*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870644u,138442752u,393216u}/* 100CF */, /*16428*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870652u,138442752u,393216u}/* 100D0 */, /*16429*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870660u,138442752u,393216u}/* 100D1 */, /*16430*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870668u,138442752u,393216u}/* 100D2 */, /*16431*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870676u,138442752u,393216u}/* 100D3 */, /*16432*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870684u,138442752u,393216u}/* 100D4 */, /*16433*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870692u,138442752u,393216u}/* 100D5 */, /*16434*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870700u,138442752u,393216u}/* 100D6 */, /*16435*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870708u,138442752u,393216u}/* 100D7 */, /*16436*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870716u,138442752u,393216u}/* 100D8 */, /*16437*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870724u,138442752u,393216u}/* 100D9 */, /*16438*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870732u,138442752u,393216u}/* 100DA */, /*16439*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870740u,138442752u,393216u}/* 100DB */, /*16440*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870748u,138442752u,393216u}/* 100DC */, /*16441*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870756u,138442752u,393216u}/* 100DD */, /*16442*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870764u,138442752u,393216u}/* 100DE */, /*16443*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870772u,138442752u,393216u}/* 100DF */, /*16444*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870780u,138442752u,393216u}/* 100E0 */, /*16445*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870788u,138442752u,393216u}/* 100E1 */, /*16446*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870796u,138442752u,393216u}/* 100E2 */, /*16447*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870804u,138442752u,393216u}/* 100E3 */, /*16448*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870812u,138442752u,393216u}/* 100E4 */, /*16449*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870820u,138442752u,393216u}/* 100E5 */, /*16450*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870828u,138442752u,393216u}/* 100E6 */, /*16451*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870836u,138442752u,393216u}/* 100E7 */, /*16452*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870844u,138442752u,393216u}/* 100E8 */, /*16453*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870852u,138442752u,393216u}/* 100E9 */, /*16454*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870860u,138442752u,393216u}/* 100EA */, /*16455*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870868u,138442752u,393216u}/* 100EB */, /*16456*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870876u,138442752u,393216u}/* 100EC */, /*16457*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870884u,138442752u,393216u}/* 100ED */, /*16458*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870892u,138442752u,393216u}/* 100EE */, /*16459*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870900u,138442752u,393216u}/* 100EF */, /*16460*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870908u,138442752u,393216u}/* 100F0 */, /*16461*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870916u,138442752u,393216u}/* 100F1 */, /*16462*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870924u,138442752u,393216u}/* 100F2 */, /*16463*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870932u,138442752u,393216u}/* 100F3 */, /*16464*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870940u,138442752u,393216u}/* 100F4 */, /*16465*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870948u,138442752u,393216u}/* 100F5 */, /*16466*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870956u,138442752u,393216u}/* 100F6 */, /*16467*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870964u,138442752u,393216u}/* 100F7 */, /*16468*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870972u,138442752u,393216u}/* 100F8 */, /*16469*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870980u,138442752u,393216u}/* 100F9 */, /*16470*/{0,1312u,3145729u,76775429u,1515560u,3758096416u,1677870988u,138442752u,393216u}/* 100FA */, /*16471*/{0,1320u,65537u,69435415u,40u,1610612768u,6116u,138442754u,0}/* 10100 */, /*16472*/{0,1320u,65537u,69445655u,40u,1610612768u,6124u,138442754u,0}/* 10101 */, /*16473*/{0,1320u,65537u,69435415u,40u,1610612768u,6132u,138442754u,0}/* 10102 */, /*16474*/{0,1320u,536937985u,76775435u,8388650u,1610612768u,58669u,138442752u,0}/* 10107 */, /*16475*/{0,1320u,570493441u,76775435u,8388650u,1610612768u,58677u,138442752u,0}/* 10108 */, /*16476*/{0,1320u,604047361u,76775435u,8388650u,1610612768u,58685u,138442752u,0}/* 10109 */, /*16477*/{0,1320u,637603841u,76775435u,8388650u,1610612768u,58693u,138442752u,0}/* 1010A */, /*16478*/{0,1320u,671157249u,76775435u,8388650u,1610612768u,58701u,138442752u,0}/* 1010B */, /*16479*/{0,1320u,704714241u,76775435u,8388650u,1610612768u,58709u,138442752u,0}/* 1010C */, /*16480*/{0,1320u,738266625u,76775435u,8388650u,1610612768u,58717u,138442752u,0}/* 1010D */, /*16481*/{0,1320u,771824641u,76775435u,8388650u,1610612768u,58725u,138442752u,0}/* 1010E */, /*16482*/{0,1320u,805377025u,76775435u,8388650u,1610612768u,58733u,138442752u,0}/* 1010F */, /*16483*/{0,1320u,822157313u,76775435u,8388650u,1610612768u,55925u,138442752u,0}/* 10110 */, /*16484*/{0,1320u,989932545u,76775435u,8388650u,1610612768u,55933u,138442752u,0}/* 10111 */, /*16485*/{0,1320u,1157709825u,76775435u,8388650u,1610612768u,55941u,138442752u,0}/* 10112 */, /*16486*/{0,1320u,1325487105u,76775435u,8388650u,1610612768u,55949u,138442752u,0}/* 10113 */, /*16487*/{0,1320u,1493264385u,76775435u,8388650u,1610612768u,55957u,138442752u,0}/* 10114 */, /*16488*/{0,1320u,1510042113u,76775435u,8388650u,1610612768u,55965u,138442752u,0}/* 10115 */, /*16489*/{0,1320u,1526819841u,76775435u,8388650u,1610612768u,55973u,138442752u,0}/* 10116 */, /*16490*/{0,1320u,1543597569u,76775435u,8388650u,1610612768u,55981u,138442752u,0}/* 10117 */, /*16491*/{0,1320u,1560375297u,76775435u,8388650u,1610612768u,55989u,138442752u,0}/* 10118 */, /*16492*/{0,1320u,1577153025u,76775435u,8388650u,1610612768u,55997u,138442752u,0}/* 10119 */, /*16493*/{0,1320u,1593930753u,76775435u,8388650u,1610612768u,56005u,138442752u,0}/* 1011A */, /*16494*/{0,1320u,1610708481u,76775435u,8388650u,1610612768u,56013u,138442752u,0}/* 1011B */, /*16495*/{0,1320u,1627486209u,76775435u,8388650u,1610612768u,56021u,138442752u,0}/* 1011C */, /*16496*/{0,1320u,1644263937u,76775435u,8388650u,1610612768u,56029u,138442752u,0}/* 1011D */, /*16497*/{0,1320u,1661041665u,76775435u,8388650u,1610612768u,56037u,138442752u,0}/* 1011E */, /*16498*/{0,1320u,1677819393u,76775435u,8388650u,1610612768u,56045u,138442752u,0}/* 1011F */, /*16499*/{0,1320u,1694597121u,76775435u,8388650u,1610612768u,56053u,138442752u,0}/* 10120 */, /*16500*/{0,1320u,1711374849u,76775435u,8388650u,1610612768u,56061u,138442752u,0}/* 10121 */, /*16501*/{0,1320u,1728152577u,76775435u,8388650u,1610612768u,56069u,138442752u,0}/* 10122 */, /*16502*/{0,1320u,1744930305u,76775435u,8388650u,1610612768u,56077u,138442752u,0}/* 10123 */, /*16503*/{0,1320u,1761708033u,76775435u,8388650u,1610612768u,56085u,138442752u,0}/* 10124 */, /*16504*/{0,1320u,1778485761u,76775435u,8388650u,1610612768u,56093u,138442752u,0}/* 10125 */, /*16505*/{0,1320u,1795263489u,76775435u,8388650u,1610612768u,56101u,138442752u,0}/* 10126 */, /*16506*/{0,1320u,1812041217u,76775435u,8388650u,1610612768u,56109u,138442752u,0}/* 10127 */, /*16507*/{0,1320u,1828818945u,76775435u,8388650u,1610612768u,56117u,138442752u,0}/* 10128 */, /*16508*/{0,1320u,1845596673u,76775435u,8388650u,1610612768u,56125u,138442752u,0}/* 10129 */, /*16509*/{0,1320u,1862374401u,76775435u,8388650u,1610612768u,56133u,138442752u,0}/* 1012A */, /*16510*/{0,1320u,1879152129u,76775435u,8388650u,1610612768u,56141u,138442752u,0}/* 1012B */, /*16511*/{0,1320u,1895929857u,76775435u,8388650u,1610612768u,56149u,138442752u,0}/* 1012C */, /*16512*/{0,1320u,1912707585u,76775435u,8388650u,1610612768u,56157u,138442752u,0}/* 1012D */, /*16513*/{0,1320u,1929485313u,76775435u,8388650u,1610612768u,56165u,138442752u,0}/* 1012E */, /*16514*/{0,1320u,1946263041u,76775435u,8388650u,1610612768u,56173u,138442752u,0}/* 1012F */, /*16515*/{0,1320u,1963040769u,76775435u,8388650u,1610612768u,56181u,138442752u,0}/* 10130 */, /*16516*/{0,1320u,1979818497u,76775435u,8388650u,1610612768u,56189u,138442752u,0}/* 10131 */, /*16517*/{0,1320u,1996596225u,76775435u,8388650u,1610612768u,56197u,138442752u,0}/* 10132 */, /*16518*/{0,1320u,2013373953u,76775435u,8388650u,1610612768u,56205u,138442752u,0}/* 10133 */, /*16519*/{0,1320u,65537u,76775451u,40u,1610612768u,31884u,138442752u,67108864u}/* 10137 */, /*16520*/{0,1320u,65537u,76775451u,40u,1610612768u,31892u,138442752u,67108864u}/* 10138 */, /*16521*/{0,1320u,65537u,76775451u,40u,1610612768u,31900u,138442752u,67108864u}/* 10139 */, /*16522*/{0,1320u,65537u,76775451u,40u,1610612768u,31908u,138442752u,67108864u}/* 1013A */, /*16523*/{0,1320u,65537u,76775451u,40u,1610612768u,31916u,138442752u,67108864u}/* 1013B */, /*16524*/{0,1320u,65537u,76775451u,40u,1610612768u,31924u,138442752u,67108864u}/* 1013C */, /*16525*/{0,1320u,65537u,76775451u,40u,1610612768u,31932u,138442752u,67108864u}/* 1013D */, /*16526*/{0,1320u,65537u,76775451u,40u,1610612768u,31940u,138442752u,67108864u}/* 1013E */, /*16527*/{0,1320u,65537u,76775451u,40u,1610612768u,31948u,138442752u,67108864u}/* 1013F */, /*16528*/{0,1328u,285410817u,76818442u,64430122u,3758096416u,1610668949u,138442752u,393216u}/* 10140 */, /*16529*/{0,1328u,369296897u,76818442u,5709866u,3758096416u,1610668957u,138442752u,393216u}/* 10141 */, /*16530*/{0,1328u,537069057u,76818442u,9904170u,3758096416u,1610671405u,138442752u,393216u}/* 10142 */, /*16531*/{0,1328u,671288321u,76818442u,9904170u,3758096416u,1610671437u,138442752u,393216u}/* 10143 */, /*16532*/{0,1328u,1493395457u,76818442u,9904170u,3758096416u,1610668965u,138442752u,393216u}/* 10144 */, /*16533*/{0,1328u,1644395009u,76818442u,9904170u,3758096416u,1610668973u,138442752u,393216u}/* 10145 */, /*16534*/{0,1328u,1795394561u,76818442u,9904170u,3758096416u,1610668981u,138442752u,393216u}/* 10146 */, /*16535*/{0,1328u,1946394113u,76818442u,9904170u,3758096416u,1610668989u,138442752u,393216u}/* 10147 */, /*16536*/{0,1328u,822288385u,76818442u,9904170u,3758096416u,1610668997u,138442752u,393216u}/* 10149 */, /*16537*/{0,1328u,1493395457u,76818442u,9904170u,3758096416u,1610669005u,138442752u,393216u}/* 1014A */, /*16538*/{0,1328u,1577284097u,76818442u,9904170u,3758096416u,1610669013u,138442752u,393216u}/* 1014B */, /*16539*/{0,1328u,1644395009u,76818442u,9904170u,3758096416u,1610669021u,138442752u,393216u}/* 1014C */, /*16540*/{0,1328u,1728283649u,76818442u,9904170u,3758096416u,1610669029u,138442752u,393216u}/* 1014D */, /*16541*/{0,1328u,1795394561u,76818442u,9904170u,3758096416u,1610669037u,138442752u,393216u}/* 1014E */, /*16542*/{0,1328u,822288385u,76818442u,9904170u,3758096416u,1610669045u,138442752u,393216u}/* 10150 */, /*16543*/{0,1328u,1493395457u,76818442u,9904170u,3758096416u,1610669053u,138442752u,393216u}/* 10151 */, /*16544*/{0,1328u,1577284097u,76818442u,9904170u,3758096416u,1610669061u,138442752u,393216u}/* 10152 */, /*16545*/{0,1328u,1644395009u,76818442u,9904170u,3758096416u,1610669069u,138442752u,393216u}/* 10153 */, /*16546*/{0,1328u,1728283649u,76818442u,9904170u,3758096416u,1610669077u,138442752u,393216u}/* 10154 */, /*16547*/{0,1328u,1879283201u,76818442u,9904170u,3758096416u,1610669085u,138442752u,393216u}/* 10155 */, /*16548*/{0,1328u,1946394113u,76818442u,9904170u,3758096416u,1610669093u,138442752u,393216u}/* 10156 */, /*16549*/{0,1328u,822288385u,76818442u,9904170u,3758096416u,1610669101u,138442752u,393216u}/* 10157 */, /*16550*/{0,1328u,570624513u,76818442u,9904170u,3758096416u,1610671413u,138442752u,393216u}/* 1015B */, /*16551*/{0,1328u,822288385u,76818442u,9904170u,3758096416u,1610669109u,138442752u,393216u}/* 10160 */, /*16552*/{0,1328u,822288385u,76818442u,9904170u,3758096416u,1610669117u,138442752u,393216u}/* 10161 */, /*16553*/{0,1328u,822288385u,76818442u,9904170u,3758096416u,1610669125u,138442752u,393216u}/* 10162 */, /*16554*/{0,1328u,822288385u,76818442u,9904170u,3758096416u,1610669133u,138442752u,393216u}/* 10163 */, /*16555*/{0,1328u,822288385u,76818442u,9904170u,3758096416u,1610669141u,138442752u,393216u}/* 10164 */, /*16556*/{0,1328u,1157840897u,76818442u,9904170u,3758096416u,1610669149u,138442752u,393216u}/* 10165 */, /*16557*/{0,1328u,1493395457u,76818442u,9904170u,3758096416u,1610669157u,138442752u,393216u}/* 10166 */, /*16558*/{0,1328u,1493395457u,76818442u,9904170u,3758096416u,1610669165u,138442752u,393216u}/* 10167 */, /*16559*/{0,1328u,1493395457u,76818442u,9904170u,3758096416u,1610669173u,138442752u,393216u}/* 10168 */, /*16560*/{0,1328u,1493395457u,76818442u,9904170u,3758096416u,1610669181u,138442752u,393216u}/* 10169 */, /*16561*/{0,1328u,1577284097u,76818442u,9904170u,3758096416u,1610669189u,138442752u,393216u}/* 1016A */, /*16562*/{0,1328u,1610839553u,76818442u,9904170u,3758096416u,1610669197u,138442752u,393216u}/* 1016B */, /*16563*/{0,1328u,1644395009u,76818442u,9904170u,3758096416u,1610669205u,138442752u,393216u}/* 1016C */, /*16564*/{0,1328u,1644395009u,76818442u,9904170u,3758096416u,1610669213u,138442752u,393216u}/* 1016D */, /*16565*/{0,1328u,1644395009u,76818442u,9904170u,3758096416u,1610669221u,138442752u,393216u}/* 1016E */, /*16566*/{0,1328u,1644395009u,76818442u,9904170u,3758096416u,1610669229u,138442752u,393216u}/* 1016F */, /*16567*/{0,1328u,1644395009u,76818442u,9904170u,3758096416u,1610669237u,138442752u,393216u}/* 10170 */, /*16568*/{0,1328u,1728283649u,76818442u,9904170u,3758096416u,1610669245u,138442752u,393216u}/* 10171 */, /*16569*/{0,1328u,1795394561u,76818442u,9904170u,3758096416u,1610669253u,138442752u,393216u}/* 10172 */, /*16570*/{0,1328u,1493395457u,76818442u,9904170u,3758096416u,1610669261u,138442752u,393216u}/* 10174 */, /*16571*/{0,1328u,369296897u,76818443u,4194346u,1610612768u,56533u,138442752u,0}/* 10175 */, /*16572*/{0,1328u,369296897u,76818443u,4194346u,1610612768u,56541u,138442752u,0}/* 10176 */, /*16573*/{0,1328u,436406785u,76818443u,67108906u,1610612768u,56549u,138442752u,0}/* 10177 */, /*16574*/{0,1328u,453183489u,76818443u,62914602u,1610612768u,56557u,138442752u,0}/* 10178 */, /*16575*/{0,1328u,196609u,76818459u,40u,1610612768u,31956u,138442752u,67108864u}/* 10179 */, /*16576*/{0,1328u,196609u,76818459u,40u,1610612768u,31964u,138442752u,67108864u}/* 1017A */, /*16577*/{0,1328u,196609u,76818459u,40u,1610612768u,31972u,138442752u,67108864u}/* 1017B */, /*16578*/{0,1328u,196609u,76818459u,40u,1610612768u,31980u,138442752u,67108864u}/* 1017C */, /*16579*/{0,1328u,196609u,76818459u,40u,1610612768u,31988u,138442752u,67108864u}/* 1017D */, /*16580*/{0,1328u,196609u,76818459u,40u,1610612768u,31996u,138442752u,67108864u}/* 1017E */, /*16581*/{0,1328u,196609u,76818459u,40u,1610612768u,32004u,138442752u,67108864u}/* 1017F */, /*16582*/{0,1328u,196609u,76818459u,40u,1610612768u,32012u,138442752u,67108864u}/* 10180 */, /*16583*/{0,1328u,196609u,76818459u,40u,1610612768u,32020u,138442752u,67108864u}/* 10181 */, /*16584*/{0,1328u,196609u,76818459u,40u,1610612768u,32028u,138442752u,67108864u}/* 10182 */, /*16585*/{0,1328u,196609u,76818459u,40u,1610612768u,32036u,138442752u,67108864u}/* 10183 */, /*16586*/{0,1328u,196609u,76818459u,40u,1610612768u,32044u,138442752u,67108864u}/* 10184 */, /*16587*/{0,1328u,196609u,76818459u,40u,1610612768u,32052u,138442752u,67108864u}/* 10185 */, /*16588*/{0,1328u,196609u,76818459u,40u,1610612768u,32060u,138442752u,67108864u}/* 10186 */, /*16589*/{0,1328u,196609u,76818459u,40u,1610612768u,32068u,138442752u,67108864u}/* 10187 */, /*16590*/{0,1328u,196609u,76818459u,40u,1610612768u,32076u,138442752u,67108864u}/* 10188 */, /*16591*/{0,1328u,196609u,76818459u,40u,1610612768u,32084u,138442752u,67108864u}/* 10189 */, /*16592*/{0,1328u,33752065u,76818443u,8388650u,1610612768u,58661u,138442752u,0}/* 1018A */, /*16593*/{0,1328u,285410817u,77080587u,62914602u,1610612768u,56565u,138442752u,0}/* 1018B */, /*16594*/{0,1328u,196609u,77080603u,40u,1610612768u,32092u,138442752u,67108864u}/* 1018C */, /*16595*/{0,1328u,196609u,77135899u,40u,1610612768u,32100u,138442752u,67108864u}/* 1018D */, /*16596*/{0,1328u,196609u,77135899u,40u,1610612768u,32108u,138442752u,67108864u}/* 1018E */, /*16597*/{0,1336u,65537u,76883995u,40u,1610612768u,32116u,138442752u,67108864u}/* 10190 */, /*16598*/{0,1336u,65537u,76883995u,40u,1610612768u,32124u,138442752u,67108864u}/* 10191 */, /*16599*/{0,1336u,65537u,76883995u,40u,1610612768u,32132u,138442752u,67108864u}/* 10192 */, /*16600*/{0,1336u,65537u,76883995u,40u,1610612768u,32140u,138442752u,67108864u}/* 10193 */, /*16601*/{0,1336u,65537u,76883995u,40u,1610612768u,32148u,138442752u,67108864u}/* 10194 */, /*16602*/{0,1336u,65537u,76883995u,40u,1610612768u,32156u,138442752u,67108864u}/* 10195 */, /*16603*/{0,1336u,65537u,76883995u,40u,1610612768u,32164u,138442752u,67108864u}/* 10196 */, /*16604*/{0,1336u,65537u,76883995u,40u,1610612768u,32172u,138442752u,67108864u}/* 10197 */, /*16605*/{0,1336u,65537u,76883995u,40u,1610612768u,32180u,138442752u,67108864u}/* 10198 */, /*16606*/{0,1336u,65537u,76883995u,40u,1610612768u,32188u,138442752u,67108864u}/* 10199 */, /*16607*/{0,1336u,65537u,76883995u,40u,1610612768u,32196u,138442752u,67108864u}/* 1019A */, /*16608*/{0,1336u,65537u,76883995u,40u,1610612768u,32204u,138442752u,67108864u}/* 1019B */, /*16609*/{0,1336u,196609u,77080603u,40u,1610612768u,32212u,138442752u,67108864u}/* 101A0 */, /*16610*/{0,1344u,65537u,76873755u,40u,1610612768u,32220u,138442752u,67108864u}/* 101D0 */, /*16611*/{0,1344u,65537u,76873755u,40u,1610612768u,32228u,138442752u,67108864u}/* 101D1 */, /*16612*/{0,1344u,65537u,76873755u,40u,1610612768u,32236u,138442752u,67108864u}/* 101D2 */, /*16613*/{0,1344u,65537u,76873755u,40u,1610612768u,32244u,138442752u,67108864u}/* 101D3 */, /*16614*/{0,1344u,65537u,76873755u,40u,1610612768u,32252u,138442752u,67108864u}/* 101D4 */, /*16615*/{0,1344u,65537u,76873755u,40u,1610612768u,32260u,138442752u,67108864u}/* 101D5 */, /*16616*/{0,1344u,65537u,76873755u,40u,1610612768u,32268u,138442752u,67108864u}/* 101D6 */, /*16617*/{0,1344u,65537u,76873755u,40u,1610612768u,32276u,138442752u,67108864u}/* 101D7 */, /*16618*/{0,1344u,65537u,76873755u,40u,1610612768u,32284u,138442752u,67108864u}/* 101D8 */, /*16619*/{0,1344u,65537u,76873755u,40u,1610612768u,32292u,138442752u,67108864u}/* 101D9 */, /*16620*/{0,1344u,65537u,76873755u,40u,1610612768u,32300u,138442752u,67108864u}/* 101DA */, /*16621*/{0,1344u,65537u,76873755u,40u,1610612768u,32308u,138442752u,67108864u}/* 101DB */, /*16622*/{0,1344u,65537u,76873755u,40u,1610612768u,32316u,138442752u,67108864u}/* 101DC */, /*16623*/{0,1344u,65537u,76873755u,40u,1610612768u,32324u,138442752u,67108864u}/* 101DD */, /*16624*/{0,1344u,65537u,76873755u,40u,1610612768u,32332u,138442752u,67108864u}/* 101DE */, /*16625*/{0,1344u,65537u,76873755u,40u,1610612768u,32340u,138442752u,67108864u}/* 101DF */, /*16626*/{0,1344u,65537u,76873755u,40u,1610612768u,32348u,138442752u,67108864u}/* 101E0 */, /*16627*/{0,1344u,65537u,76873755u,40u,1610612768u,32356u,138442752u,67108864u}/* 101E1 */, /*16628*/{0,1344u,65537u,76873755u,40u,1610612768u,32364u,138442752u,67108864u}/* 101E2 */, /*16629*/{0,1344u,65537u,76873755u,40u,1610612768u,32372u,138442752u,67108864u}/* 101E3 */, /*16630*/{0,1344u,65537u,76873755u,40u,1610612768u,32380u,138442752u,67108864u}/* 101E4 */, /*16631*/{0,1344u,65537u,76873755u,40u,1610612768u,32388u,138442752u,67108864u}/* 101E5 */, /*16632*/{0,1344u,65537u,76873755u,40u,1610612768u,32396u,138442752u,67108864u}/* 101E6 */, /*16633*/{0,1344u,65537u,76873755u,40u,1610612768u,32404u,138442752u,67108864u}/* 101E7 */, /*16634*/{0,1344u,65537u,76873755u,40u,1610612768u,32412u,138442752u,67108864u}/* 101E8 */, /*16635*/{0,1344u,65537u,76873755u,40u,1610612768u,32420u,138442752u,67108864u}/* 101E9 */, /*16636*/{0,1344u,65537u,76873755u,40u,1610612768u,32428u,138442752u,67108864u}/* 101EA */, /*16637*/{0,1344u,65537u,76873755u,40u,1610612768u,32436u,138442752u,67108864u}/* 101EB */, /*16638*/{0,1344u,65537u,76873755u,40u,1610612768u,32444u,138442752u,67108864u}/* 101EC */, /*16639*/{0,1344u,65537u,76873755u,40u,1610612768u,32452u,138442752u,67108864u}/* 101ED */, /*16640*/{0,1344u,65537u,76873755u,40u,1610612768u,32460u,138442752u,67108864u}/* 101EE */, /*16641*/{0,1344u,65537u,76873755u,40u,1610612768u,32468u,138442752u,67108864u}/* 101EF */, /*16642*/{0,1344u,65537u,76873755u,40u,1610612768u,32476u,138442752u,67108864u}/* 101F0 */, /*16643*/{0,1344u,65537u,76873755u,40u,1610612768u,32484u,138442752u,67108864u}/* 101F1 */, /*16644*/{0,1344u,65537u,76873755u,40u,1610612768u,32492u,138442752u,67108864u}/* 101F2 */, /*16645*/{0,1344u,65537u,76873755u,40u,1610612768u,32500u,138442752u,67108864u}/* 101F3 */, /*16646*/{0,1344u,65537u,76873755u,40u,1610612768u,32508u,138442752u,67108864u}/* 101F4 */, /*16647*/{0,1344u,65537u,76873755u,40u,1610612768u,32516u,138442752u,67108864u}/* 101F5 */, /*16648*/{0,1344u,65537u,76873755u,40u,1610612768u,32524u,138442752u,67108864u}/* 101F6 */, /*16649*/{0,1344u,65537u,76873755u,40u,1610612768u,32532u,138442752u,67108864u}/* 101F7 */, /*16650*/{0,1344u,65537u,76873755u,40u,1610612768u,32540u,138442752u,67108864u}/* 101F8 */, /*16651*/{0,1344u,65537u,76873755u,40u,1610612768u,32548u,138442752u,67108864u}/* 101F9 */, /*16652*/{0,1344u,65537u,76873755u,40u,1610612768u,32556u,138442752u,67108864u}/* 101FA */, /*16653*/{0,1344u,65537u,76873755u,40u,1610612768u,32564u,138442752u,67108864u}/* 101FB */, /*16654*/{0,1344u,65537u,76873755u,40u,1610612768u,32572u,138442752u,67108864u}/* 101FC */, /*16655*/{0,1344u,2686977u,3088396294u,672030728u,1627389968u,1077936140u,1145075712u,262144u}/* 101FD */, /*16656*/{0,1352u,4849665u,76873733u,1515560u,3758096416u,1677864740u,138442752u,393216u}/* 10280 */, /*16657*/{0,1352u,4849665u,76873733u,1515560u,3758096416u,1677864748u,138442752u,393216u}/* 10281 */, /*16658*/{0,1352u,4849665u,76873733u,1515560u,3758096416u,1677864756u,138442752u,393216u}/* 10282 */, /*16659*/{0,1352u,4849665u,76873733u,1515560u,3758096416u,1677864764u,138442752u,393216u}/* 10283 */, /*16660*/{0,1352u,4849665u,76873733u,1515560u,3758096416u,1677864772u,138442752u,393216u}/* 10284 */, /*16661*/{0,1352u,4849665u,76873733u,1515560u,3758096416u,1677864780u,138442752u,393216u}/* 10285 */, /*16662*/{0,1352u,4849665u,76873733u,1515560u,3758096416u,1677864788u,138442752u,393216u}/* 10286 */, /*16663*/{0,1352u,4849665u,76873733u,1515560u,3758096416u,1677864796u,138442752u,393216u}/* 10287 */, /*16664*/{0,1352u,4849665u,76873733u,1515560u,3758096416u,1677864804u,138442752u,393216u}/* 10288 */, /*16665*/{0,1352u,4849665u,76873733u,1515560u,3758096416u,1677864812u,138442752u,393216u}/* 10289 */, /*16666*/{0,1352u,4849665u,76873733u,1515560u,3758096416u,1677864820u,138442752u,393216u}/* 1028A */, /*16667*/{0,1352u,4849665u,76873733u,1515560u,3758096416u,1677864828u,138442752u,393216u}/* 1028B */, /*16668*/{0,1352u,4849665u,76873733u,1515560u,3758096416u,1677864836u,138442752u,393216u}/* 1028C */, /*16669*/{0,1352u,4849665u,76873733u,1515560u,3758096416u,1677864844u,138442752u,393216u}/* 1028D */, /*16670*/{0,1352u,4849665u,76873733u,1515560u,3758096416u,1677864852u,138442752u,393216u}/* 1028E */, /*16671*/{0,1352u,4849665u,76873733u,1515560u,3758096416u,1677864860u,138442752u,393216u}/* 1028F */, /*16672*/{0,1352u,4849665u,76873733u,1515560u,3758096416u,1677864868u,138442752u,393216u}/* 10290 */, /*16673*/{0,1352u,4849665u,76873733u,1515560u,3758096416u,1677864876u,138442752u,393216u}/* 10291 */, /*16674*/{0,1352u,4849665u,76873733u,1515560u,3758096416u,1677864884u,138442752u,393216u}/* 10292 */, /*16675*/{0,1352u,4849665u,76873733u,1515560u,3758096416u,1677864892u,138442752u,393216u}/* 10293 */, /*16676*/{0,1352u,4849665u,76873733u,1515560u,3758096416u,1677864900u,138442752u,393216u}/* 10294 */, /*16677*/{0,1352u,4849665u,76873733u,1515560u,3758096416u,1677864908u,138442752u,393216u}/* 10295 */, /*16678*/{0,1352u,4849665u,76873733u,1515560u,3758096416u,1677864916u,138442752u,393216u}/* 10296 */, /*16679*/{0,1352u,4849665u,76873733u,1515560u,3758096416u,1677864924u,138442752u,393216u}/* 10297 */, /*16680*/{0,1352u,4849665u,76873733u,1515560u,3758096416u,1677864932u,138442752u,393216u}/* 10298 */, /*16681*/{0,1352u,4849665u,76873733u,1515560u,3758096416u,1677864940u,138442752u,393216u}/* 10299 */, /*16682*/{0,1352u,4849665u,76873733u,1515560u,3758096416u,1677864948u,138442752u,393216u}/* 1029A */, /*16683*/{0,1352u,4849665u,76873733u,1515560u,3758096416u,1677864956u,138442752u,393216u}/* 1029B */, /*16684*/{0,1352u,4849665u,76873733u,1515560u,3758096416u,1677864964u,138442752u,393216u}/* 1029C */, /*16685*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677864972u,138442752u,393216u}/* 102A0 */, /*16686*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677864980u,138442752u,393216u}/* 102A1 */, /*16687*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677864988u,138442752u,393216u}/* 102A2 */, /*16688*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677864996u,138442752u,393216u}/* 102A3 */, /*16689*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865004u,138442752u,393216u}/* 102A4 */, /*16690*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865012u,138442752u,393216u}/* 102A5 */, /*16691*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865020u,138442752u,393216u}/* 102A6 */, /*16692*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865028u,138442752u,393216u}/* 102A7 */, /*16693*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865036u,138442752u,393216u}/* 102A8 */, /*16694*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865044u,138442752u,393216u}/* 102A9 */, /*16695*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865052u,138442752u,393216u}/* 102AA */, /*16696*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865060u,138442752u,393216u}/* 102AB */, /*16697*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865068u,138442752u,393216u}/* 102AC */, /*16698*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865076u,138442752u,393216u}/* 102AD */, /*16699*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865084u,138442752u,393216u}/* 102AE */, /*16700*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865092u,138442752u,393216u}/* 102AF */, /*16701*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865100u,138442752u,393216u}/* 102B0 */, /*16702*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865108u,138442752u,393216u}/* 102B1 */, /*16703*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865116u,138442752u,393216u}/* 102B2 */, /*16704*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865124u,138442752u,393216u}/* 102B3 */, /*16705*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865132u,138442752u,393216u}/* 102B4 */, /*16706*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865140u,138442752u,393216u}/* 102B5 */, /*16707*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865148u,138442752u,393216u}/* 102B6 */, /*16708*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865156u,138442752u,393216u}/* 102B7 */, /*16709*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865164u,138442752u,393216u}/* 102B8 */, /*16710*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865172u,138442752u,393216u}/* 102B9 */, /*16711*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865180u,138442752u,393216u}/* 102BA */, /*16712*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865188u,138442752u,393216u}/* 102BB */, /*16713*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865196u,138442752u,393216u}/* 102BC */, /*16714*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865204u,138442752u,393216u}/* 102BD */, /*16715*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865212u,138442752u,393216u}/* 102BE */, /*16716*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865220u,138442752u,393216u}/* 102BF */, /*16717*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865228u,138442752u,393216u}/* 102C0 */, /*16718*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865236u,138442752u,393216u}/* 102C1 */, /*16719*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865244u,138442752u,393216u}/* 102C2 */, /*16720*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865252u,138442752u,393216u}/* 102C3 */, /*16721*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865260u,138442752u,393216u}/* 102C4 */, /*16722*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865268u,138442752u,393216u}/* 102C5 */, /*16723*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865276u,138442752u,393216u}/* 102C6 */, /*16724*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865284u,138442752u,393216u}/* 102C7 */, /*16725*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865292u,138442752u,393216u}/* 102C8 */, /*16726*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865300u,138442752u,393216u}/* 102C9 */, /*16727*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865308u,138442752u,393216u}/* 102CA */, /*16728*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865316u,138442752u,393216u}/* 102CB */, /*16729*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865324u,138442752u,393216u}/* 102CC */, /*16730*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865332u,138442752u,393216u}/* 102CD */, /*16731*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865340u,138442752u,393216u}/* 102CE */, /*16732*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865348u,138442752u,393216u}/* 102CF */, /*16733*/{0,1360u,4915201u,76873733u,1515560u,3758096416u,1677865356u,138442752u,393216u}/* 102D0 */, /*16734*/{0,1368u,2686977u,3088592902u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* 102E0 */, /*16735*/{0,1368u,536937985u,77072395u,8388650u,1610612768u,58669u,138442752u,0}/* 102E1 */, /*16736*/{0,1368u,570493441u,77072395u,8388650u,1610612768u,58677u,138442752u,0}/* 102E2 */, /*16737*/{0,1368u,604047361u,77072395u,8388650u,1610612768u,58685u,138442752u,0}/* 102E3 */, /*16738*/{0,1368u,637603841u,77072395u,8388650u,1610612768u,58693u,138442752u,0}/* 102E4 */, /*16739*/{0,1368u,671157249u,77072395u,8388650u,1610612768u,58701u,138442752u,0}/* 102E5 */, /*16740*/{0,1368u,704714241u,77072395u,8388650u,1610612768u,58709u,138442752u,0}/* 102E6 */, /*16741*/{0,1368u,738266625u,77072395u,8388650u,1610612768u,58717u,138442752u,0}/* 102E7 */, /*16742*/{0,1368u,771824641u,77072395u,8388650u,1610612768u,58725u,138442752u,0}/* 102E8 */, /*16743*/{0,1368u,805377025u,77072395u,8388650u,1610612768u,58733u,138442752u,0}/* 102E9 */, /*16744*/{0,1368u,822157313u,77072395u,8388650u,1610612768u,56573u,138442752u,0}/* 102EA */, /*16745*/{0,1368u,989932545u,77072395u,8388650u,1610612768u,56581u,138442752u,0}/* 102EB */, /*16746*/{0,1368u,1157709825u,77072395u,8388650u,1610612768u,56589u,138442752u,0}/* 102EC */, /*16747*/{0,1368u,1325487105u,77072395u,8388650u,1610612768u,56597u,138442752u,0}/* 102ED */, /*16748*/{0,1368u,1493264385u,77072395u,8388650u,1610612768u,56605u,138442752u,0}/* 102EE */, /*16749*/{0,1368u,1510042113u,77072395u,8388650u,1610612768u,56613u,138442752u,0}/* 102EF */, /*16750*/{0,1368u,1526819841u,77072395u,8388650u,1610612768u,56621u,138442752u,0}/* 102F0 */, /*16751*/{0,1368u,1543597569u,77072395u,8388650u,1610612768u,56629u,138442752u,0}/* 102F1 */, /*16752*/{0,1368u,1560375297u,77072395u,8388650u,1610612768u,56637u,138442752u,0}/* 102F2 */, /*16753*/{0,1368u,1577153025u,77072395u,8388650u,1610612768u,56645u,138442752u,0}/* 102F3 */, /*16754*/{0,1368u,1593930753u,77072395u,8388650u,1610612768u,56653u,138442752u,0}/* 102F4 */, /*16755*/{0,1368u,1610708481u,77072395u,8388650u,1610612768u,56661u,138442752u,0}/* 102F5 */, /*16756*/{0,1368u,1627486209u,77072395u,8388650u,1610612768u,56669u,138442752u,0}/* 102F6 */, /*16757*/{0,1368u,1644263937u,77072395u,8388650u,1610612768u,56677u,138442752u,0}/* 102F7 */, /*16758*/{0,1368u,1661041665u,77072395u,8388650u,1610612768u,56685u,138442752u,0}/* 102F8 */, /*16759*/{0,1368u,1677819393u,77072395u,8388650u,1610612768u,56693u,138442752u,0}/* 102F9 */, /*16760*/{0,1368u,1694597121u,77072395u,8388650u,1610612768u,56701u,138442752u,0}/* 102FA */, /*16761*/{0,1368u,1711374849u,77072395u,8388650u,1610612768u,56709u,138442752u,0}/* 102FB */, /*16762*/{0,1376u,2490369u,76709893u,1515560u,3758096416u,1677865572u,138442752u,393216u}/* 10300 */, /*16763*/{0,1376u,2490369u,76709893u,1515560u,3758096416u,1677865580u,138442752u,393216u}/* 10301 */, /*16764*/{0,1376u,2490369u,76709893u,1515560u,3758096416u,1677865588u,138442752u,393216u}/* 10302 */, /*16765*/{0,1376u,2490369u,76709893u,1515560u,3758096416u,1677865596u,138442752u,393216u}/* 10303 */, /*16766*/{0,1376u,2490369u,76709893u,1515560u,3758096416u,1677865604u,138442752u,393216u}/* 10304 */, /*16767*/{0,1376u,2490369u,76709893u,1515560u,3758096416u,1677865612u,138442752u,393216u}/* 10305 */, /*16768*/{0,1376u,2490369u,76709893u,1515560u,3758096416u,1677865620u,138442752u,393216u}/* 10306 */, /*16769*/{0,1376u,2490369u,76709893u,1515560u,3758096416u,1677865628u,138442752u,393216u}/* 10307 */, /*16770*/{0,1376u,2490369u,76709893u,1515560u,3758096416u,1677865636u,138442752u,393216u}/* 10308 */, /*16771*/{0,1376u,2490369u,76709893u,1515560u,3758096416u,1677865644u,138442752u,393216u}/* 10309 */, /*16772*/{0,1376u,2490369u,76709893u,1515560u,3758096416u,1677865652u,138442752u,393216u}/* 1030A */, /*16773*/{0,1376u,2490369u,76709893u,1515560u,3758096416u,1677865660u,138442752u,393216u}/* 1030B */, /*16774*/{0,1376u,2490369u,76709893u,1515560u,3758096416u,1677865668u,138442752u,393216u}/* 1030C */, /*16775*/{0,1376u,2490369u,76709893u,1515560u,3758096416u,1677865676u,138442752u,393216u}/* 1030D */, /*16776*/{0,1376u,2490369u,76709893u,1515560u,3758096416u,1677865684u,138442752u,393216u}/* 1030E */, /*16777*/{0,1376u,2490369u,76709893u,1515560u,3758096416u,1677865700u,138442752u,393216u}/* 1030F */, /*16778*/{0,1376u,2490369u,76709893u,1515560u,3758096416u,1677865708u,138442752u,393216u}/* 10310 */, /*16779*/{0,1376u,2490369u,76709893u,1515560u,3758096416u,1677865716u,138442752u,393216u}/* 10311 */, /*16780*/{0,1376u,2490369u,76709893u,1515560u,3758096416u,1677865724u,138442752u,393216u}/* 10312 */, /*16781*/{0,1376u,2490369u,76709893u,1515560u,3758096416u,1677865732u,138442752u,393216u}/* 10313 */, /*16782*/{0,1376u,2490369u,76709893u,1515560u,3758096416u,1677865740u,138442752u,393216u}/* 10314 */, /*16783*/{0,1376u,2490369u,76709893u,1515560u,3758096416u,1677865748u,138442752u,393216u}/* 10315 */, /*16784*/{0,1376u,2490369u,76709893u,1515560u,3758096416u,1677865756u,138442752u,393216u}/* 10316 */, /*16785*/{0,1376u,2490369u,76709893u,1515560u,3758096416u,1677865764u,138442752u,393216u}/* 10317 */, /*16786*/{0,1376u,2490369u,76709893u,1515560u,3758096416u,1677865772u,138442752u,393216u}/* 10318 */, /*16787*/{0,1376u,2490369u,76709893u,1515560u,3758096416u,1677865780u,138442752u,393216u}/* 10319 */, /*16788*/{0,1376u,2490369u,76709893u,1515560u,3758096416u,1677865788u,138442752u,393216u}/* 1031A */, /*16789*/{0,1376u,2490369u,76709893u,1515560u,3758096416u,1677865796u,138442752u,393216u}/* 1031B */, /*16790*/{0,1376u,2490369u,76709893u,1515560u,3758096416u,1677865804u,138442752u,393216u}/* 1031C */, /*16791*/{0,1376u,2490369u,76709893u,1515560u,3758096416u,1677865812u,138442752u,393216u}/* 1031D */, /*16792*/{0,1376u,2490369u,76709893u,1515560u,3758096416u,1677865820u,138442752u,393216u}/* 1031E */, /*16793*/{0,1376u,2490369u,77070341u,1515560u,3758096416u,1677865692u,138442752u,393216u}/* 1031F */, /*16794*/{0,1376u,539362817u,76709899u,8388650u,1610612768u,58669u,138442752u,0}/* 10320 */, /*16795*/{0,1376u,673582081u,76709899u,8388650u,1610612768u,58701u,138442752u,0}/* 10321 */, /*16796*/{0,1376u,824582145u,76709899u,8388650u,1610612768u,55877u,138442752u,0}/* 10322 */, /*16797*/{0,1376u,1495689217u,76709899u,8388650u,1610612768u,55885u,138442752u,0}/* 10323 */, /*16798*/{0,1376u,2490369u,77168645u,1515560u,3758096416u,1677865828u,138442752u,393216u}/* 1032D */, /*16799*/{0,1376u,2490369u,77168645u,1515560u,3758096416u,1677865836u,138442752u,393216u}/* 1032E */, /*16800*/{0,1376u,2490369u,77168645u,1515560u,3758096416u,1677865844u,138442752u,393216u}/* 1032F */, /*16801*/{0,1384u,2555905u,76709893u,1515560u,3758096416u,1677865852u,138442752u,393216u}/* 10330 */, /*16802*/{0,1384u,2555905u,76709893u,1515560u,3758096416u,1677865860u,138442752u,393216u}/* 10331 */, /*16803*/{0,1384u,2555905u,76709893u,1515560u,3758096416u,1677865868u,138442752u,393216u}/* 10332 */, /*16804*/{0,1384u,2555905u,76709893u,1515560u,3758096416u,1677865876u,138442752u,393216u}/* 10333 */, /*16805*/{0,1384u,2555905u,76709893u,1515560u,3758096416u,1677865884u,138442752u,393216u}/* 10334 */, /*16806*/{0,1384u,2555905u,76709893u,1515560u,3758096416u,1677865892u,138442752u,393216u}/* 10335 */, /*16807*/{0,1384u,2555905u,76709893u,1515560u,3758096416u,1677865900u,138442752u,393216u}/* 10336 */, /*16808*/{0,1384u,2555905u,76709893u,1515560u,3758096416u,1677865908u,138442752u,393216u}/* 10337 */, /*16809*/{0,1384u,2555905u,76709893u,1515560u,3758096416u,1677865916u,138442752u,393216u}/* 10338 */, /*16810*/{0,1384u,2555905u,76709893u,1515560u,3758096416u,1677865924u,138442752u,393216u}/* 10339 */, /*16811*/{0,1384u,2555905u,76709893u,1515560u,3758096416u,1677865932u,138442752u,393216u}/* 1033A */, /*16812*/{0,1384u,2555905u,76709893u,1515560u,3758096416u,1677865940u,138442752u,393216u}/* 1033B */, /*16813*/{0,1384u,2555905u,76709893u,1515560u,3758096416u,1677865948u,138442752u,393216u}/* 1033C */, /*16814*/{0,1384u,2555905u,76709893u,1515560u,3758096416u,1677865956u,138442752u,393216u}/* 1033D */, /*16815*/{0,1384u,2555905u,76709893u,1515560u,3758096416u,1677865964u,138442752u,393216u}/* 1033E */, /*16816*/{0,1384u,2555905u,76709893u,1515560u,3758096416u,1677865972u,138442752u,393216u}/* 1033F */, /*16817*/{0,1384u,2555905u,76709893u,1515560u,3758096416u,1677865980u,138442752u,393216u}/* 10340 */, /*16818*/{0,1384u,1562865665u,76709898u,9904170u,3758096416u,1610757125u,138442752u,393216u}/* 10341 */, /*16819*/{0,1384u,2555905u,76709893u,1515560u,3758096416u,1677865996u,138442752u,393216u}/* 10342 */, /*16820*/{0,1384u,2555905u,76709893u,1515560u,3758096416u,1677866004u,138442752u,393216u}/* 10343 */, /*16821*/{0,1384u,2555905u,76709893u,1515560u,3758096416u,1677866012u,138442752u,393216u}/* 10344 */, /*16822*/{0,1384u,2555905u,76709893u,1515560u,3758096416u,1677866020u,138442752u,393216u}/* 10345 */, /*16823*/{0,1384u,2555905u,76709893u,1515560u,3758096416u,1677866028u,138442752u,393216u}/* 10346 */, /*16824*/{0,1384u,2555905u,76709893u,1515560u,3758096416u,1677866036u,138442752u,393216u}/* 10347 */, /*16825*/{0,1384u,2555905u,76709893u,1515560u,3758096416u,1677866044u,138442752u,393216u}/* 10348 */, /*16826*/{0,1384u,2555905u,76709893u,1515560u,3758096416u,1677866052u,138442752u,393216u}/* 10349 */, /*16827*/{0,1384u,1713865217u,76709898u,9904170u,3758096416u,1610757197u,138442752u,393216u}/* 1034A */, /*16828*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792220u,138442752u,393216u}/* 10350 */, /*16829*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792228u,138442752u,393216u}/* 10351 */, /*16830*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792236u,138442752u,393216u}/* 10352 */, /*16831*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792244u,138442752u,393216u}/* 10353 */, /*16832*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792252u,138442752u,393216u}/* 10354 */, /*16833*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792260u,138442752u,393216u}/* 10355 */, /*16834*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792268u,138442752u,393216u}/* 10356 */, /*16835*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792276u,138442752u,393216u}/* 10357 */, /*16836*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792284u,138442752u,393216u}/* 10358 */, /*16837*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792292u,138442752u,393216u}/* 10359 */, /*16838*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792300u,138442752u,393216u}/* 1035A */, /*16839*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792308u,138442752u,393216u}/* 1035B */, /*16840*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792316u,138442752u,393216u}/* 1035C */, /*16841*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792324u,138442752u,393216u}/* 1035D */, /*16842*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792332u,138442752u,393216u}/* 1035E */, /*16843*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792340u,138442752u,393216u}/* 1035F */, /*16844*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792348u,138442752u,393216u}/* 10360 */, /*16845*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792356u,138442752u,393216u}/* 10361 */, /*16846*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792364u,138442752u,393216u}/* 10362 */, /*16847*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792372u,138442752u,393216u}/* 10363 */, /*16848*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792380u,138442752u,393216u}/* 10364 */, /*16849*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792388u,138442752u,393216u}/* 10365 */, /*16850*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792396u,138442752u,393216u}/* 10366 */, /*16851*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792404u,138442752u,393216u}/* 10367 */, /*16852*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792412u,138442752u,393216u}/* 10368 */, /*16853*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792420u,138442752u,393216u}/* 10369 */, /*16854*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792428u,138442752u,393216u}/* 1036A */, /*16855*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792436u,138442752u,393216u}/* 1036B */, /*16856*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792444u,138442752u,393216u}/* 1036C */, /*16857*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792452u,138442752u,393216u}/* 1036D */, /*16858*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792460u,138442752u,393216u}/* 1036E */, /*16859*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792468u,138442752u,393216u}/* 1036F */, /*16860*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792476u,138442752u,393216u}/* 10370 */, /*16861*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792484u,138442752u,393216u}/* 10371 */, /*16862*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792492u,138442752u,393216u}/* 10372 */, /*16863*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792500u,138442752u,393216u}/* 10373 */, /*16864*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792508u,138442752u,393216u}/* 10374 */, /*16865*/{0,1392u,7864321u,77070341u,1515560u,3758096416u,1677792516u,138442752u,393216u}/* 10375 */, /*16866*/{0,1392u,7864321u,3424137222u,672030728u,3774873616u,1078006748u,138459648u,262144u}/* 10376 */, /*16867*/{0,1392u,7864321u,3424137222u,672030728u,3774873616u,1078006772u,138459648u,262144u}/* 10377 */, /*16868*/{0,1392u,7864321u,3424137222u,672030728u,3774873616u,1078006804u,138459648u,262144u}/* 10378 */, /*16869*/{0,1392u,7864321u,3424137222u,672030728u,3774873616u,1078006852u,138459648u,262144u}/* 10379 */, /*16870*/{0,1392u,7864321u,3424137222u,672030728u,3774873616u,1078006884u,138459648u,262144u}/* 1037A */, /*16871*/{0,1400u,3211265u,76775429u,1515560u,3758096416u,1677876508u,138442752u,393216u}/* 10380 */, /*16872*/{0,1400u,3211265u,76775429u,1515560u,3758096416u,1677876516u,138442752u,393216u}/* 10381 */, /*16873*/{0,1400u,3211265u,76775429u,1515560u,3758096416u,1677876524u,138442752u,393216u}/* 10382 */, /*16874*/{0,1400u,3211265u,76775429u,1515560u,3758096416u,1677876532u,138442752u,393216u}/* 10383 */, /*16875*/{0,1400u,3211265u,76775429u,1515560u,3758096416u,1677876540u,138442752u,393216u}/* 10384 */, /*16876*/{0,1400u,3211265u,76775429u,1515560u,3758096416u,1677876548u,138442752u,393216u}/* 10385 */, /*16877*/{0,1400u,3211265u,76775429u,1515560u,3758096416u,1677876556u,138442752u,393216u}/* 10386 */, /*16878*/{0,1400u,3211265u,76775429u,1515560u,3758096416u,1677876564u,138442752u,393216u}/* 10387 */, /*16879*/{0,1400u,3211265u,76775429u,1515560u,3758096416u,1677876572u,138442752u,393216u}/* 10388 */, /*16880*/{0,1400u,3211265u,76775429u,1515560u,3758096416u,1677876580u,138442752u,393216u}/* 10389 */, /*16881*/{0,1400u,3211265u,76775429u,1515560u,3758096416u,1677876588u,138442752u,393216u}/* 1038A */, /*16882*/{0,1400u,3211265u,76775429u,1515560u,3758096416u,1677876596u,138442752u,393216u}/* 1038B */, /*16883*/{0,1400u,3211265u,76775429u,1515560u,3758096416u,1677876604u,138442752u,393216u}/* 1038C */, /*16884*/{0,1400u,3211265u,76775429u,1515560u,3758096416u,1677876612u,138442752u,393216u}/* 1038D */, /*16885*/{0,1400u,3211265u,76775429u,1515560u,3758096416u,1677876620u,138442752u,393216u}/* 1038E */, /*16886*/{0,1400u,3211265u,76775429u,1515560u,3758096416u,1677876628u,138442752u,393216u}/* 1038F */, /*16887*/{0,1400u,3211265u,76775429u,1515560u,3758096416u,1677876636u,138442752u,393216u}/* 10390 */, /*16888*/{0,1400u,3211265u,76775429u,1515560u,3758096416u,1677876644u,138442752u,393216u}/* 10391 */, /*16889*/{0,1400u,3211265u,76775429u,1515560u,3758096416u,1677876652u,138442752u,393216u}/* 10392 */, /*16890*/{0,1400u,3211265u,76775429u,1515560u,3758096416u,1677876660u,138442752u,393216u}/* 10393 */, /*16891*/{0,1400u,3211265u,76775429u,1515560u,3758096416u,1677876668u,138442752u,393216u}/* 10394 */, /*16892*/{0,1400u,3211265u,76775429u,1515560u,3758096416u,1677876676u,138442752u,393216u}/* 10395 */, /*16893*/{0,1400u,3211265u,76775429u,1515560u,3758096416u,1677876684u,138442752u,393216u}/* 10396 */, /*16894*/{0,1400u,3211265u,76775429u,1515560u,3758096416u,1677876692u,138442752u,393216u}/* 10397 */, /*16895*/{0,1400u,3211265u,76775429u,1515560u,3758096416u,1677876700u,138442752u,393216u}/* 10398 */, /*16896*/{0,1400u,3211265u,76775429u,1515560u,3758096416u,1677876708u,138442752u,393216u}/* 10399 */, /*16897*/{0,1400u,3211265u,76775429u,1515560u,3758096416u,1677876716u,138442752u,393216u}/* 1039A */, /*16898*/{0,1400u,3211265u,76775429u,1515560u,3758096416u,1677876724u,138442752u,393216u}/* 1039B */, /*16899*/{0,1400u,3211265u,76775429u,1515560u,3758096416u,1677876732u,138442752u,393216u}/* 1039C */, /*16900*/{0,1400u,3211265u,76775429u,1515560u,3758096416u,1677876740u,138442752u,393216u}/* 1039D */, /*16901*/{0,1400u,3211265u,69435415u,40u,1610612768u,6140u,138442754u,8388608u}/* 1039F */, /*16902*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876748u,138442752u,393216u}/* 103A0 */, /*16903*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876756u,138442752u,393216u}/* 103A1 */, /*16904*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876764u,138442752u,393216u}/* 103A2 */, /*16905*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876772u,138442752u,393216u}/* 103A3 */, /*16906*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876780u,138442752u,393216u}/* 103A4 */, /*16907*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876788u,138442752u,393216u}/* 103A5 */, /*16908*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876796u,138442752u,393216u}/* 103A6 */, /*16909*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876804u,138442752u,393216u}/* 103A7 */, /*16910*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876812u,138442752u,393216u}/* 103A8 */, /*16911*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876820u,138442752u,393216u}/* 103A9 */, /*16912*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876828u,138442752u,393216u}/* 103AA */, /*16913*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876836u,138442752u,393216u}/* 103AB */, /*16914*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876844u,138442752u,393216u}/* 103AC */, /*16915*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876852u,138442752u,393216u}/* 103AD */, /*16916*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876860u,138442752u,393216u}/* 103AE */, /*16917*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876868u,138442752u,393216u}/* 103AF */, /*16918*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876876u,138442752u,393216u}/* 103B0 */, /*16919*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876884u,138442752u,393216u}/* 103B1 */, /*16920*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876892u,138442752u,393216u}/* 103B2 */, /*16921*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876900u,138442752u,393216u}/* 103B3 */, /*16922*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876908u,138442752u,393216u}/* 103B4 */, /*16923*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876916u,138442752u,393216u}/* 103B5 */, /*16924*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876924u,138442752u,393216u}/* 103B6 */, /*16925*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876932u,138442752u,393216u}/* 103B7 */, /*16926*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876940u,138442752u,393216u}/* 103B8 */, /*16927*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876948u,138442752u,393216u}/* 103B9 */, /*16928*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876956u,138442752u,393216u}/* 103BA */, /*16929*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876964u,138442752u,393216u}/* 103BB */, /*16930*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876972u,138442752u,393216u}/* 103BC */, /*16931*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876980u,138442752u,393216u}/* 103BD */, /*16932*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876988u,138442752u,393216u}/* 103BE */, /*16933*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677876996u,138442752u,393216u}/* 103BF */, /*16934*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677877004u,138442752u,393216u}/* 103C0 */, /*16935*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677877012u,138442752u,393216u}/* 103C1 */, /*16936*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677877020u,138442752u,393216u}/* 103C2 */, /*16937*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677877028u,138442752u,393216u}/* 103C3 */, /*16938*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677877036u,138442752u,393216u}/* 103C8 */, /*16939*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677877044u,138442752u,393216u}/* 103C9 */, /*16940*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677877052u,138442752u,393216u}/* 103CA */, /*16941*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677877060u,138442752u,393216u}/* 103CB */, /*16942*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677877068u,138442752u,393216u}/* 103CC */, /*16943*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677877076u,138442752u,393216u}/* 103CD */, /*16944*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677877084u,138442752u,393216u}/* 103CE */, /*16945*/{0,1408u,3932161u,76808197u,1515560u,3758096416u,1677877092u,138442752u,393216u}/* 103CF */, /*16946*/{0,1408u,3932161u,69468183u,40u,1610612768u,6148u,138442754u,8388608u}/* 103D0 */, /*16947*/{0,1408u,540804609u,76808202u,9904170u,3758096416u,1610671405u,138442752u,393216u}/* 103D1 */, /*16948*/{0,1408u,574360065u,76808202u,9904170u,3758096416u,1610671413u,138442752u,393216u}/* 103D2 */, /*16949*/{0,1408u,826023937u,76808202u,9904170u,3758096416u,1610669453u,138442752u,393216u}/* 103D3 */, /*16950*/{0,1408u,993799169u,76808202u,9904170u,3758096416u,1610669461u,138442752u,393216u}/* 103D4 */, /*16951*/{0,1408u,1581019649u,76808202u,9904170u,3758096416u,1610669469u,138442752u,393216u}/* 103D5 */, /*16952*/{286208u,2317354376u,2621441u,76709889u,1507368u,3807903776u,1711420500u,138491904u,2490368u}/* 10400 */, /*16953*/{286336u,2319451528u,2621441u,76709889u,1507368u,3807903776u,1711420508u,138491904u,2490368u}/* 10401 */, /*16954*/{286464u,2321548680u,2621441u,76709889u,1507368u,3807903776u,1711420516u,138491904u,2490368u}/* 10402 */, /*16955*/{286592u,2323645832u,2621441u,76709889u,1507368u,3807903776u,1711420524u,138491904u,2490368u}/* 10403 */, /*16956*/{286720u,2325742984u,2621441u,76709889u,1507368u,3807903776u,1711420532u,138491904u,2490368u}/* 10404 */, /*16957*/{286848u,2327840136u,2621441u,76709889u,1507368u,3807903776u,1711420540u,138491904u,2490368u}/* 10405 */, /*16958*/{286976u,2329937288u,2621441u,76709889u,1507368u,3807903776u,1711420548u,138491904u,2490368u}/* 10406 */, /*16959*/{287104u,2332034440u,2621441u,76709889u,1507368u,3807903776u,1711420556u,138491904u,2490368u}/* 10407 */, /*16960*/{287232u,2334131592u,2621441u,76709889u,1507368u,3807903776u,1711420564u,138491904u,2490368u}/* 10408 */, /*16961*/{287360u,2336228744u,2621441u,76709889u,1507368u,3807903776u,1711420572u,138491904u,2490368u}/* 10409 */, /*16962*/{287488u,2338325896u,2621441u,76709889u,1507368u,3807903776u,1711420580u,138491904u,2490368u}/* 1040A */, /*16963*/{287616u,2340423048u,2621441u,76709889u,1507368u,3807903776u,1711420588u,138491904u,2490368u}/* 1040B */, /*16964*/{287744u,2342520200u,2621441u,76709889u,1507368u,3807903776u,1711420596u,138491904u,2490368u}/* 1040C */, /*16965*/{287872u,2344617352u,2621441u,76709889u,1507368u,3807903776u,1711420604u,138491904u,2490368u}/* 1040D */, /*16966*/{288000u,2346714504u,2621441u,76709889u,1507368u,3807903776u,1711420612u,138491904u,2490368u}/* 1040E */, /*16967*/{288128u,2348811656u,2621441u,76709889u,1507368u,3807903776u,1711420620u,138491904u,2490368u}/* 1040F */, /*16968*/{288256u,2350908808u,2621441u,76709889u,1507368u,3807903776u,1711420628u,138491904u,2490368u}/* 10410 */, /*16969*/{288384u,2353005960u,2621441u,76709889u,1507368u,3807903776u,1711420636u,138491904u,2490368u}/* 10411 */, /*16970*/{288512u,2355103112u,2621441u,76709889u,1507368u,3807903776u,1711420644u,138491904u,2490368u}/* 10412 */, /*16971*/{288640u,2357200264u,2621441u,76709889u,1507368u,3807903776u,1711420652u,138491904u,2490368u}/* 10413 */, /*16972*/{288768u,2359297416u,2621441u,76709889u,1507368u,3807903776u,1711420660u,138491904u,2490368u}/* 10414 */, /*16973*/{288896u,2361394568u,2621441u,76709889u,1507368u,3807903776u,1711420668u,138491904u,2490368u}/* 10415 */, /*16974*/{289024u,2363491720u,2621441u,76709889u,1507368u,3807903776u,1711420676u,138491904u,2490368u}/* 10416 */, /*16975*/{289152u,2365588872u,2621441u,76709889u,1507368u,3807903776u,1711420684u,138491904u,2490368u}/* 10417 */, /*16976*/{289280u,2367686024u,2621441u,76709889u,1507368u,3807903776u,1711420692u,138491904u,2490368u}/* 10418 */, /*16977*/{289408u,2369783176u,2621441u,76709889u,1507368u,3807903776u,1711420700u,138491904u,2490368u}/* 10419 */, /*16978*/{289536u,2371880328u,2621441u,76709889u,1507368u,3807903776u,1711420708u,138491904u,2490368u}/* 1041A */, /*16979*/{289664u,2373977480u,2621441u,76709889u,1507368u,3807903776u,1711420716u,138491904u,2490368u}/* 1041B */, /*16980*/{289792u,2376074632u,2621441u,76709889u,1507368u,3807903776u,1711420724u,138491904u,2490368u}/* 1041C */, /*16981*/{289920u,2378171784u,2621441u,76709889u,1507368u,3807903776u,1711420732u,138491904u,2490368u}/* 1041D */, /*16982*/{290048u,2380268936u,2621441u,76709889u,1507368u,3807903776u,1711420740u,138491904u,2490368u}/* 1041E */, /*16983*/{290176u,2382366088u,2621441u,76709889u,1507368u,3807903776u,1711420748u,138491904u,2490368u}/* 1041F */, /*16984*/{290304u,2384463240u,2621441u,76709889u,1507368u,3807903776u,1711420756u,138491904u,2490368u}/* 10420 */, /*16985*/{290432u,2386560392u,2621441u,76709889u,1507368u,3807903776u,1711420764u,138491904u,2490368u}/* 10421 */, /*16986*/{290560u,2388657544u,2621441u,76709889u,1507368u,3807903776u,1711420772u,138491904u,2490368u}/* 10422 */, /*16987*/{290688u,2390754696u,2621441u,76709889u,1507368u,3807903776u,1711420780u,138491904u,2490368u}/* 10423 */, /*16988*/{290816u,2392851848u,2621441u,76709889u,1507368u,3807903776u,1711420788u,138491904u,2490368u}/* 10424 */, /*16989*/{290944u,2394949000u,2621441u,76709889u,1507368u,3807903776u,1711420796u,138491904u,2490368u}/* 10425 */, /*16990*/{291072u,2397046152u,2621441u,76775425u,1507368u,3807903776u,1711420804u,138491904u,2490368u}/* 10426 */, /*16991*/{291200u,2399143304u,2621441u,76775425u,1507368u,3807903776u,1711420812u,138491904u,2490368u}/* 10427 */, /*16992*/{291328u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809108u,138442752u,393216u}/* 10428 */, /*16993*/{291456u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809116u,138442752u,393216u}/* 10429 */, /*16994*/{291584u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809124u,138442752u,393216u}/* 1042A */, /*16995*/{291712u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809132u,138442752u,393216u}/* 1042B */, /*16996*/{291840u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809140u,138442752u,393216u}/* 1042C */, /*16997*/{291968u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809148u,138442752u,393216u}/* 1042D */, /*16998*/{292096u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809156u,138442752u,393216u}/* 1042E */, /*16999*/{292224u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809164u,138442752u,393216u}/* 1042F */, /*17000*/{292352u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809172u,138442752u,393216u}/* 10430 */, /*17001*/{292480u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809180u,138442752u,393216u}/* 10431 */, /*17002*/{292608u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809188u,138442752u,393216u}/* 10432 */, /*17003*/{292736u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809196u,138442752u,393216u}/* 10433 */, /*17004*/{292864u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809204u,138442752u,393216u}/* 10434 */, /*17005*/{292992u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809212u,138442752u,393216u}/* 10435 */, /*17006*/{293120u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809220u,138442752u,393216u}/* 10436 */, /*17007*/{293248u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809228u,138442752u,393216u}/* 10437 */, /*17008*/{293376u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809236u,138442752u,393216u}/* 10438 */, /*17009*/{293504u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809244u,138442752u,393216u}/* 10439 */, /*17010*/{293632u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809252u,138442752u,393216u}/* 1043A */, /*17011*/{293760u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809260u,138442752u,393216u}/* 1043B */, /*17012*/{293888u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809268u,138442752u,393216u}/* 1043C */, /*17013*/{294016u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809276u,138442752u,393216u}/* 1043D */, /*17014*/{294144u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809284u,138442752u,393216u}/* 1043E */, /*17015*/{294272u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809292u,138442752u,393216u}/* 1043F */, /*17016*/{294400u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809300u,138442752u,393216u}/* 10440 */, /*17017*/{294528u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809308u,138442752u,393216u}/* 10441 */, /*17018*/{294656u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809316u,138442752u,393216u}/* 10442 */, /*17019*/{294784u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809324u,138442752u,393216u}/* 10443 */, /*17020*/{294912u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809332u,138442752u,393216u}/* 10444 */, /*17021*/{295040u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809340u,138442752u,393216u}/* 10445 */, /*17022*/{295168u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809348u,138442752u,393216u}/* 10446 */, /*17023*/{295296u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809356u,138442752u,393216u}/* 10447 */, /*17024*/{295424u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809364u,138442752u,393216u}/* 10448 */, /*17025*/{295552u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809372u,138442752u,393216u}/* 10449 */, /*17026*/{295680u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809380u,138442752u,393216u}/* 1044A */, /*17027*/{295808u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809388u,138442752u,393216u}/* 1044B */, /*17028*/{295936u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809396u,138442752u,393216u}/* 1044C */, /*17029*/{296064u,1416u,2621441u,76709890u,1499176u,3768975392u,1719809404u,138442752u,393216u}/* 1044D */, /*17030*/{296192u,1416u,2621441u,76775426u,1499176u,3768975392u,1719809412u,138442752u,393216u}/* 1044E */, /*17031*/{296320u,1416u,2621441u,76775426u,1499176u,3768975392u,1719809420u,138442752u,393216u}/* 1044F */, /*17032*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866388u,138442752u,393216u}/* 10450 */, /*17033*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866396u,138442752u,393216u}/* 10451 */, /*17034*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866404u,138442752u,393216u}/* 10452 */, /*17035*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866412u,138442752u,393216u}/* 10453 */, /*17036*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866420u,138442752u,393216u}/* 10454 */, /*17037*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866428u,138442752u,393216u}/* 10455 */, /*17038*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866436u,138442752u,393216u}/* 10456 */, /*17039*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866444u,138442752u,393216u}/* 10457 */, /*17040*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866452u,138442752u,393216u}/* 10458 */, /*17041*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866460u,138442752u,393216u}/* 10459 */, /*17042*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866468u,138442752u,393216u}/* 1045A */, /*17043*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866476u,138442752u,393216u}/* 1045B */, /*17044*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866484u,138442752u,393216u}/* 1045C */, /*17045*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866492u,138442752u,393216u}/* 1045D */, /*17046*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866500u,138442752u,393216u}/* 1045E */, /*17047*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866508u,138442752u,393216u}/* 1045F */, /*17048*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866516u,138442752u,393216u}/* 10460 */, /*17049*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866524u,138442752u,393216u}/* 10461 */, /*17050*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866532u,138442752u,393216u}/* 10462 */, /*17051*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866540u,138442752u,393216u}/* 10463 */, /*17052*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866548u,138442752u,393216u}/* 10464 */, /*17053*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866556u,138442752u,393216u}/* 10465 */, /*17054*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866564u,138442752u,393216u}/* 10466 */, /*17055*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866572u,138442752u,393216u}/* 10467 */, /*17056*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866580u,138442752u,393216u}/* 10468 */, /*17057*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866588u,138442752u,393216u}/* 10469 */, /*17058*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866596u,138442752u,393216u}/* 1046A */, /*17059*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866604u,138442752u,393216u}/* 1046B */, /*17060*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866612u,138442752u,393216u}/* 1046C */, /*17061*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866620u,138442752u,393216u}/* 1046D */, /*17062*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866628u,138442752u,393216u}/* 1046E */, /*17063*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866636u,138442752u,393216u}/* 1046F */, /*17064*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866644u,138442752u,393216u}/* 10470 */, /*17065*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866652u,138442752u,393216u}/* 10471 */, /*17066*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866660u,138442752u,393216u}/* 10472 */, /*17067*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866668u,138442752u,393216u}/* 10473 */, /*17068*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866676u,138442752u,393216u}/* 10474 */, /*17069*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866684u,138442752u,393216u}/* 10475 */, /*17070*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866692u,138442752u,393216u}/* 10476 */, /*17071*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866700u,138442752u,393216u}/* 10477 */, /*17072*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866708u,138442752u,393216u}/* 10478 */, /*17073*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866716u,138442752u,393216u}/* 10479 */, /*17074*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866724u,138442752u,393216u}/* 1047A */, /*17075*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866732u,138442752u,393216u}/* 1047B */, /*17076*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866740u,138442752u,393216u}/* 1047C */, /*17077*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866748u,138442752u,393216u}/* 1047D */, /*17078*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866756u,138442752u,393216u}/* 1047E */, /*17079*/{0,1424u,3276801u,76775429u,1515560u,3758096416u,1677866764u,138442752u,393216u}/* 1047F */, /*17080*/{0,1432u,3342337u,76775429u,1515560u,3758096416u,1677867884u,138442752u,393216u}/* 10480 */, /*17081*/{0,1432u,3342337u,76775429u,1515560u,3758096416u,1677867892u,138442752u,393216u}/* 10481 */, /*17082*/{0,1432u,3342337u,76775429u,1515560u,3758096416u,1677867900u,138442752u,393216u}/* 10482 */, /*17083*/{0,1432u,3342337u,76775429u,1515560u,3758096416u,1677867908u,138442752u,393216u}/* 10483 */, /*17084*/{0,1432u,3342337u,76775429u,1515560u,3758096416u,1677867916u,138442752u,393216u}/* 10484 */, /*17085*/{0,1432u,3342337u,76775429u,1515560u,3758096416u,1677867924u,138442752u,393216u}/* 10485 */, /*17086*/{0,1432u,3342337u,76775429u,1515560u,3758096416u,1677867932u,138442752u,393216u}/* 10486 */, /*17087*/{0,1432u,3342337u,76775429u,1515560u,3758096416u,1677867940u,138442752u,393216u}/* 10487 */, /*17088*/{0,1432u,3342337u,76775429u,1515560u,3758096416u,1677867948u,138442752u,393216u}/* 10488 */, /*17089*/{0,1432u,3342337u,76775429u,1515560u,3758096416u,1677867956u,138442752u,393216u}/* 10489 */, /*17090*/{0,1432u,3342337u,76775429u,1515560u,3758096416u,1677867964u,138442752u,393216u}/* 1048A */, /*17091*/{0,1432u,3342337u,76775429u,1515560u,3758096416u,1677867972u,138442752u,393216u}/* 1048B */, /*17092*/{0,1432u,3342337u,76775429u,1515560u,3758096416u,1677867980u,138442752u,393216u}/* 1048C */, /*17093*/{0,1432u,3342337u,76775429u,1515560u,3758096416u,1677867988u,138442752u,393216u}/* 1048D */, /*17094*/{0,1432u,3342337u,76775429u,1515560u,3758096416u,1677867996u,138442752u,393216u}/* 1048E */, /*17095*/{0,1432u,3342337u,76775429u,1515560u,3758096416u,1677868004u,138442752u,393216u}/* 1048F */, /*17096*/{0,1432u,3342337u,76775429u,1515560u,3758096416u,1677868012u,138442752u,393216u}/* 10490 */, /*17097*/{0,1432u,3342337u,76775429u,1515560u,3758096416u,1677868020u,138442752u,393216u}/* 10491 */, /*17098*/{0,1432u,3342337u,76775429u,1515560u,3758096416u,1677868028u,138442752u,393216u}/* 10492 */, /*17099*/{0,1432u,3342337u,76775429u,1515560u,3758096416u,1677868036u,138442752u,393216u}/* 10493 */, /*17100*/{0,1432u,3342337u,76775429u,1515560u,3758096416u,1677868044u,138442752u,393216u}/* 10494 */, /*17101*/{0,1432u,3342337u,76775429u,1515560u,3758096416u,1677868052u,138442752u,393216u}/* 10495 */, /*17102*/{0,1432u,3342337u,76775429u,1515560u,3758096416u,1677868060u,138442752u,393216u}/* 10496 */, /*17103*/{0,1432u,3342337u,76775429u,1515560u,3758096416u,1677868068u,138442752u,393216u}/* 10497 */, /*17104*/{0,1432u,3342337u,76775429u,1515560u,3758096416u,1677868076u,138442752u,393216u}/* 10498 */, /*17105*/{0,1432u,3342337u,76775429u,1515560u,3758096416u,1677868084u,138442752u,393216u}/* 10499 */, /*17106*/{0,1432u,3342337u,76775429u,1515560u,3758096416u,1677868092u,138442752u,393216u}/* 1049A */, /*17107*/{0,1432u,3342337u,76775429u,1515560u,3758096416u,1677868100u,138442752u,393216u}/* 1049B */, /*17108*/{0,1432u,3342337u,76775429u,1515560u,3758096416u,1677868108u,138442752u,393216u}/* 1049C */, /*17109*/{0,1432u,3342337u,76775429u,1515560u,3758096416u,1677868116u,138442752u,393216u}/* 1049D */, /*17110*/{0,1432u,36897793u,85164041u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 104A0 */, /*17111*/{0,1432u,540214785u,85164041u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 104A1 */, /*17112*/{0,1432u,573770241u,85164041u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 104A2 */, /*17113*/{0,1432u,607324161u,85164041u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 104A3 */, /*17114*/{0,1432u,640880641u,85164041u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 104A4 */, /*17115*/{0,1432u,674434049u,85164041u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 104A5 */, /*17116*/{0,1432u,707991041u,85164041u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 104A6 */, /*17117*/{0,1432u,741543425u,85164041u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 104A7 */, /*17118*/{0,1432u,775101441u,85164041u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 104A8 */, /*17119*/{0,1432u,808653825u,85164041u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 104A9 */, /*17120*/{296448u,2401240480u,8912897u,77135873u,1507368u,3807903776u,1711384428u,138491904u,2490368u}/* 104B0 */, /*17121*/{296576u,2403337632u,8912897u,77135873u,1507368u,3807903776u,1711384436u,138491904u,2490368u}/* 104B1 */, /*17122*/{296704u,2405434784u,8912897u,77135873u,1507368u,3807903776u,1711384444u,138491904u,2490368u}/* 104B2 */, /*17123*/{296832u,2407531936u,8912897u,77135873u,1507368u,3807903776u,1711384452u,138491904u,2490368u}/* 104B3 */, /*17124*/{296960u,2409629088u,8912897u,77135873u,1507368u,3807903776u,1711384460u,138491904u,2490368u}/* 104B4 */, /*17125*/{297088u,2411726240u,8912897u,77135873u,1507368u,3807903776u,1711384468u,138491904u,2490368u}/* 104B5 */, /*17126*/{297216u,2413823392u,8912897u,77135873u,1507368u,3807903776u,1711384476u,138491904u,2490368u}/* 104B6 */, /*17127*/{297344u,2415920544u,8912897u,77135873u,1507368u,3807903776u,1711384484u,138491904u,2490368u}/* 104B7 */, /*17128*/{297472u,2418017696u,8912897u,77135873u,1507368u,3807903776u,1711384492u,138491904u,2490368u}/* 104B8 */, /*17129*/{297600u,2420114848u,8912897u,77135873u,1507368u,3807903776u,1711384500u,138491904u,2490368u}/* 104B9 */, /*17130*/{297728u,2422212000u,8912897u,77135873u,1507368u,3807903776u,1711384508u,138491904u,2490368u}/* 104BA */, /*17131*/{297856u,2424309152u,8912897u,77135873u,1507368u,3807903776u,1711384516u,138491904u,2490368u}/* 104BB */, /*17132*/{297984u,2426406304u,8912897u,77135873u,1507368u,3807903776u,1711384524u,138491904u,2490368u}/* 104BC */, /*17133*/{298112u,2428503456u,8912897u,77135873u,1507368u,3807903776u,1711384532u,138491904u,2490368u}/* 104BD */, /*17134*/{298240u,2430600608u,8912897u,77135873u,1507368u,3807903776u,1711384540u,138491904u,2490368u}/* 104BE */, /*17135*/{298368u,2432697760u,8912897u,77135873u,1507368u,3807903776u,1711384548u,138491904u,2490368u}/* 104BF */, /*17136*/{298496u,2434794912u,8912897u,77135873u,1507368u,3807903776u,1711384556u,138491904u,2490368u}/* 104C0 */, /*17137*/{298624u,2436892064u,8912897u,77135873u,1507368u,3807903776u,1711384564u,138491904u,2490368u}/* 104C1 */, /*17138*/{298752u,2438989216u,8912897u,77135873u,1507368u,3807903776u,1711384572u,138491904u,2490368u}/* 104C2 */, /*17139*/{298880u,2441086368u,8912897u,77135873u,1507368u,3807903776u,1711384580u,138491904u,2490368u}/* 104C3 */, /*17140*/{299008u,2443183520u,8912897u,77135873u,1507368u,3807903776u,1711384588u,138491904u,2490368u}/* 104C4 */, /*17141*/{299136u,2445280672u,8912897u,77135873u,1507368u,3807903776u,1711384596u,138491904u,2490368u}/* 104C5 */, /*17142*/{299264u,2447377824u,8912897u,77135873u,1507368u,3807903776u,1711384604u,138491904u,2490368u}/* 104C6 */, /*17143*/{299392u,2449474976u,8912897u,77135873u,1507368u,3807903776u,1711384612u,138491904u,2490368u}/* 104C7 */, /*17144*/{299520u,2451572128u,8912897u,77135873u,1507368u,3807903776u,1711384620u,138491904u,2490368u}/* 104C8 */, /*17145*/{299648u,2453669280u,8912897u,77135873u,1507368u,3807903776u,1711384628u,138491904u,2490368u}/* 104C9 */, /*17146*/{299776u,2455766432u,8912897u,77135873u,1507368u,3807903776u,1711384636u,138491904u,2490368u}/* 104CA */, /*17147*/{299904u,2457863584u,8912897u,77135873u,1507368u,3807903776u,1711384644u,138491904u,2490368u}/* 104CB */, /*17148*/{300032u,2459960736u,8912897u,77135873u,1507368u,3807903776u,1711384652u,138491904u,2490368u}/* 104CC */, /*17149*/{300160u,2462057888u,8912897u,77135873u,1507368u,3807903776u,1711384660u,138491904u,2490368u}/* 104CD */, /*17150*/{300288u,2464155040u,8912897u,77135873u,1507368u,3807903776u,1711384668u,138491904u,2490368u}/* 104CE */, /*17151*/{300416u,2466252192u,8912897u,77135873u,1507368u,3807903776u,1711384676u,138491904u,2490368u}/* 104CF */, /*17152*/{300544u,2468349344u,8912897u,77135873u,1507368u,3807903776u,1711384684u,138491904u,2490368u}/* 104D0 */, /*17153*/{300672u,2470446496u,8912897u,77135873u,1507368u,3807903776u,1711384692u,138491904u,2490368u}/* 104D1 */, /*17154*/{300800u,2472543648u,8912897u,77135873u,1507368u,3807903776u,1711384700u,138491904u,2490368u}/* 104D2 */, /*17155*/{300928u,2474640800u,8912897u,77135873u,1507368u,3807903776u,1711384708u,138491904u,2490368u}/* 104D3 */, /*17156*/{301056u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773036u,138442752u,393216u}/* 104D8 */, /*17157*/{301184u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773044u,138442752u,393216u}/* 104D9 */, /*17158*/{301312u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773052u,138442752u,393216u}/* 104DA */, /*17159*/{301440u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773060u,138442752u,393216u}/* 104DB */, /*17160*/{301568u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773068u,138442752u,393216u}/* 104DC */, /*17161*/{301696u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773076u,138442752u,393216u}/* 104DD */, /*17162*/{301824u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773084u,138442752u,393216u}/* 104DE */, /*17163*/{301952u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773092u,138442752u,393216u}/* 104DF */, /*17164*/{302080u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773100u,138442752u,393216u}/* 104E0 */, /*17165*/{302208u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773108u,138442752u,393216u}/* 104E1 */, /*17166*/{302336u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773116u,138442752u,393216u}/* 104E2 */, /*17167*/{302464u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773124u,138442752u,393216u}/* 104E3 */, /*17168*/{302592u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773132u,138442752u,393216u}/* 104E4 */, /*17169*/{302720u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773140u,138442752u,393216u}/* 104E5 */, /*17170*/{302848u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773148u,138442752u,393216u}/* 104E6 */, /*17171*/{302976u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773156u,138442752u,393216u}/* 104E7 */, /*17172*/{303104u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773164u,138442752u,393216u}/* 104E8 */, /*17173*/{303232u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773172u,138442752u,393216u}/* 104E9 */, /*17174*/{303360u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773180u,138442752u,393216u}/* 104EA */, /*17175*/{303488u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773188u,138442752u,393216u}/* 104EB */, /*17176*/{303616u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773196u,138442752u,393216u}/* 104EC */, /*17177*/{303744u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773204u,138442752u,393216u}/* 104ED */, /*17178*/{303872u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773212u,138442752u,393216u}/* 104EE */, /*17179*/{304000u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773220u,138442752u,393216u}/* 104EF */, /*17180*/{304128u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773228u,138442752u,393216u}/* 104F0 */, /*17181*/{304256u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773236u,138442752u,393216u}/* 104F1 */, /*17182*/{304384u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773244u,138442752u,393216u}/* 104F2 */, /*17183*/{304512u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773252u,138442752u,393216u}/* 104F3 */, /*17184*/{304640u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773260u,138442752u,393216u}/* 104F4 */, /*17185*/{304768u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773268u,138442752u,393216u}/* 104F5 */, /*17186*/{304896u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773276u,138442752u,393216u}/* 104F6 */, /*17187*/{305024u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773284u,138442752u,393216u}/* 104F7 */, /*17188*/{305152u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773292u,138442752u,393216u}/* 104F8 */, /*17189*/{305280u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773300u,138442752u,393216u}/* 104F9 */, /*17190*/{305408u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773308u,138442752u,393216u}/* 104FA */, /*17191*/{305536u,1440u,8912897u,77135874u,1499176u,3768975392u,1719773316u,138442752u,393216u}/* 104FB */, /*17192*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868124u,138442752u,393216u}/* 10500 */, /*17193*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868132u,138442752u,393216u}/* 10501 */, /*17194*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868140u,138442752u,393216u}/* 10502 */, /*17195*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868148u,138442752u,393216u}/* 10503 */, /*17196*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868156u,138442752u,393216u}/* 10504 */, /*17197*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868164u,138442752u,393216u}/* 10505 */, /*17198*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868172u,138442752u,393216u}/* 10506 */, /*17199*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868180u,138442752u,393216u}/* 10507 */, /*17200*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868188u,138442752u,393216u}/* 10508 */, /*17201*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868196u,138442752u,393216u}/* 10509 */, /*17202*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868204u,138442752u,393216u}/* 1050A */, /*17203*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868212u,138442752u,393216u}/* 1050B */, /*17204*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868220u,138442752u,393216u}/* 1050C */, /*17205*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868228u,138442752u,393216u}/* 1050D */, /*17206*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868236u,138442752u,393216u}/* 1050E */, /*17207*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868244u,138442752u,393216u}/* 1050F */, /*17208*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868252u,138442752u,393216u}/* 10510 */, /*17209*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868260u,138442752u,393216u}/* 10511 */, /*17210*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868268u,138442752u,393216u}/* 10512 */, /*17211*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868276u,138442752u,393216u}/* 10513 */, /*17212*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868284u,138442752u,393216u}/* 10514 */, /*17213*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868292u,138442752u,393216u}/* 10515 */, /*17214*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868300u,138442752u,393216u}/* 10516 */, /*17215*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868308u,138442752u,393216u}/* 10517 */, /*17216*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868316u,138442752u,393216u}/* 10518 */, /*17217*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868324u,138442752u,393216u}/* 10519 */, /*17218*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868332u,138442752u,393216u}/* 1051A */, /*17219*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868340u,138442752u,393216u}/* 1051B */, /*17220*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868348u,138442752u,393216u}/* 1051C */, /*17221*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868356u,138442752u,393216u}/* 1051D */, /*17222*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868364u,138442752u,393216u}/* 1051E */, /*17223*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868372u,138442752u,393216u}/* 1051F */, /*17224*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868380u,138442752u,393216u}/* 10520 */, /*17225*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868388u,138442752u,393216u}/* 10521 */, /*17226*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868396u,138442752u,393216u}/* 10522 */, /*17227*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868404u,138442752u,393216u}/* 10523 */, /*17228*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868412u,138442752u,393216u}/* 10524 */, /*17229*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868420u,138442752u,393216u}/* 10525 */, /*17230*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868428u,138442752u,393216u}/* 10526 */, /*17231*/{0,1448u,6946817u,77070341u,1515560u,3758096416u,1677868436u,138442752u,393216u}/* 10527 */, /*17232*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868444u,138442752u,393216u}/* 10530 */, /*17233*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868452u,138442752u,393216u}/* 10531 */, /*17234*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868460u,138442752u,393216u}/* 10532 */, /*17235*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868468u,138442752u,393216u}/* 10533 */, /*17236*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868476u,138442752u,393216u}/* 10534 */, /*17237*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868484u,138442752u,393216u}/* 10535 */, /*17238*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868492u,138442752u,393216u}/* 10536 */, /*17239*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868500u,138442752u,393216u}/* 10537 */, /*17240*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868508u,138442752u,393216u}/* 10538 */, /*17241*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868516u,138442752u,393216u}/* 10539 */, /*17242*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868524u,138442752u,393216u}/* 1053A */, /*17243*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868532u,138442752u,393216u}/* 1053B */, /*17244*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868540u,138442752u,393216u}/* 1053C */, /*17245*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868548u,138442752u,393216u}/* 1053D */, /*17246*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868556u,138442752u,393216u}/* 1053E */, /*17247*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868564u,138442752u,393216u}/* 1053F */, /*17248*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868572u,138442752u,393216u}/* 10540 */, /*17249*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868580u,138442752u,393216u}/* 10541 */, /*17250*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868588u,138442752u,393216u}/* 10542 */, /*17251*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868596u,138442752u,393216u}/* 10543 */, /*17252*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868604u,138442752u,393216u}/* 10544 */, /*17253*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868612u,138442752u,393216u}/* 10545 */, /*17254*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868620u,138442752u,393216u}/* 10546 */, /*17255*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868628u,138442752u,393216u}/* 10547 */, /*17256*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868636u,138442752u,393216u}/* 10548 */, /*17257*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868644u,138442752u,393216u}/* 10549 */, /*17258*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868652u,138442752u,393216u}/* 1054A */, /*17259*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868660u,138442752u,393216u}/* 1054B */, /*17260*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868668u,138442752u,393216u}/* 1054C */, /*17261*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868676u,138442752u,393216u}/* 1054D */, /*17262*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868684u,138442752u,393216u}/* 1054E */, /*17263*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868692u,138442752u,393216u}/* 1054F */, /*17264*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868700u,138442752u,393216u}/* 10550 */, /*17265*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868708u,138442752u,393216u}/* 10551 */, /*17266*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868716u,138442752u,393216u}/* 10552 */, /*17267*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868724u,138442752u,393216u}/* 10553 */, /*17268*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868732u,138442752u,393216u}/* 10554 */, /*17269*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868740u,138442752u,393216u}/* 10555 */, /*17270*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868748u,138442752u,393216u}/* 10556 */, /*17271*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868756u,138442752u,393216u}/* 10557 */, /*17272*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868764u,138442752u,393216u}/* 10558 */, /*17273*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868772u,138442752u,393216u}/* 10559 */, /*17274*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868780u,138442752u,393216u}/* 1055A */, /*17275*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868788u,138442752u,393216u}/* 1055B */, /*17276*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868796u,138442752u,393216u}/* 1055C */, /*17277*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868804u,138442752u,393216u}/* 1055D */, /*17278*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868812u,138442752u,393216u}/* 1055E */, /*17279*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868820u,138442752u,393216u}/* 1055F */, /*17280*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868828u,138442752u,393216u}/* 10560 */, /*17281*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868836u,138442752u,393216u}/* 10561 */, /*17282*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868844u,138442752u,393216u}/* 10562 */, /*17283*/{0,1456u,6750209u,77070341u,1515560u,3758096416u,1677868852u,138442752u,393216u}/* 10563 */, /*17284*/{0,1456u,6750209u,77070359u,40u,1610612768u,8780u,138442754u,0}/* 1056F */, /*17285*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677870996u,138442752u,393216u}/* 10600 */, /*17286*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871004u,138442752u,393216u}/* 10601 */, /*17287*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871012u,138442752u,393216u}/* 10602 */, /*17288*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871020u,138442752u,393216u}/* 10603 */, /*17289*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871028u,138442752u,393216u}/* 10604 */, /*17290*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871036u,138442752u,393216u}/* 10605 */, /*17291*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871044u,138442752u,393216u}/* 10606 */, /*17292*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871052u,138442752u,393216u}/* 10607 */, /*17293*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871060u,138442752u,393216u}/* 10608 */, /*17294*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871068u,138442752u,393216u}/* 10609 */, /*17295*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871076u,138442752u,393216u}/* 1060A */, /*17296*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871084u,138442752u,393216u}/* 1060B */, /*17297*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871092u,138442752u,393216u}/* 1060C */, /*17298*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871100u,138442752u,393216u}/* 1060D */, /*17299*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871108u,138442752u,393216u}/* 1060E */, /*17300*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871116u,138442752u,393216u}/* 1060F */, /*17301*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871124u,138442752u,393216u}/* 10610 */, /*17302*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871132u,138442752u,393216u}/* 10611 */, /*17303*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871140u,138442752u,393216u}/* 10612 */, /*17304*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871148u,138442752u,393216u}/* 10613 */, /*17305*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871156u,138442752u,393216u}/* 10614 */, /*17306*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871164u,138442752u,393216u}/* 10615 */, /*17307*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871172u,138442752u,393216u}/* 10616 */, /*17308*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871180u,138442752u,393216u}/* 10617 */, /*17309*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871188u,138442752u,393216u}/* 10618 */, /*17310*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871196u,138442752u,393216u}/* 10619 */, /*17311*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871204u,138442752u,393216u}/* 1061A */, /*17312*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871212u,138442752u,393216u}/* 1061B */, /*17313*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871220u,138442752u,393216u}/* 1061C */, /*17314*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871228u,138442752u,393216u}/* 1061D */, /*17315*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871236u,138442752u,393216u}/* 1061E */, /*17316*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871244u,138442752u,393216u}/* 1061F */, /*17317*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871252u,138442752u,393216u}/* 10620 */, /*17318*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871260u,138442752u,393216u}/* 10621 */, /*17319*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871268u,138442752u,393216u}/* 10622 */, /*17320*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871276u,138442752u,393216u}/* 10623 */, /*17321*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871284u,138442752u,393216u}/* 10624 */, /*17322*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871292u,138442752u,393216u}/* 10625 */, /*17323*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871300u,138442752u,393216u}/* 10626 */, /*17324*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871308u,138442752u,393216u}/* 10627 */, /*17325*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871316u,138442752u,393216u}/* 10628 */, /*17326*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871324u,138442752u,393216u}/* 10629 */, /*17327*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871332u,138442752u,393216u}/* 1062A */, /*17328*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871340u,138442752u,393216u}/* 1062B */, /*17329*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871348u,138442752u,393216u}/* 1062C */, /*17330*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871356u,138442752u,393216u}/* 1062D */, /*17331*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871364u,138442752u,393216u}/* 1062E */, /*17332*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871372u,138442752u,393216u}/* 1062F */, /*17333*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871380u,138442752u,393216u}/* 10630 */, /*17334*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871388u,138442752u,393216u}/* 10631 */, /*17335*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871396u,138442752u,393216u}/* 10632 */, /*17336*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871404u,138442752u,393216u}/* 10633 */, /*17337*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871412u,138442752u,393216u}/* 10634 */, /*17338*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871420u,138442752u,393216u}/* 10635 */, /*17339*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871428u,138442752u,393216u}/* 10636 */, /*17340*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871436u,138442752u,393216u}/* 10637 */, /*17341*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871444u,138442752u,393216u}/* 10638 */, /*17342*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871452u,138442752u,393216u}/* 10639 */, /*17343*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871460u,138442752u,393216u}/* 1063A */, /*17344*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871468u,138442752u,393216u}/* 1063B */, /*17345*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871476u,138442752u,393216u}/* 1063C */, /*17346*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871484u,138442752u,393216u}/* 1063D */, /*17347*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871492u,138442752u,393216u}/* 1063E */, /*17348*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871500u,138442752u,393216u}/* 1063F */, /*17349*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871508u,138442752u,393216u}/* 10640 */, /*17350*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871516u,138442752u,393216u}/* 10641 */, /*17351*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871524u,138442752u,393216u}/* 10642 */, /*17352*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871532u,138442752u,393216u}/* 10643 */, /*17353*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871540u,138442752u,393216u}/* 10644 */, /*17354*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871548u,138442752u,393216u}/* 10645 */, /*17355*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871556u,138442752u,393216u}/* 10646 */, /*17356*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871564u,138442752u,393216u}/* 10647 */, /*17357*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871572u,138442752u,393216u}/* 10648 */, /*17358*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871580u,138442752u,393216u}/* 10649 */, /*17359*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871588u,138442752u,393216u}/* 1064A */, /*17360*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871596u,138442752u,393216u}/* 1064B */, /*17361*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871604u,138442752u,393216u}/* 1064C */, /*17362*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871612u,138442752u,393216u}/* 1064D */, /*17363*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871620u,138442752u,393216u}/* 1064E */, /*17364*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871628u,138442752u,393216u}/* 1064F */, /*17365*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871636u,138442752u,393216u}/* 10650 */, /*17366*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871644u,138442752u,393216u}/* 10651 */, /*17367*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871652u,138442752u,393216u}/* 10652 */, /*17368*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871660u,138442752u,393216u}/* 10653 */, /*17369*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871668u,138442752u,393216u}/* 10654 */, /*17370*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871676u,138442752u,393216u}/* 10655 */, /*17371*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871684u,138442752u,393216u}/* 10656 */, /*17372*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871692u,138442752u,393216u}/* 10657 */, /*17373*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871700u,138442752u,393216u}/* 10658 */, /*17374*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871708u,138442752u,393216u}/* 10659 */, /*17375*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871716u,138442752u,393216u}/* 1065A */, /*17376*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871724u,138442752u,393216u}/* 1065B */, /*17377*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871732u,138442752u,393216u}/* 1065C */, /*17378*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871740u,138442752u,393216u}/* 1065D */, /*17379*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871748u,138442752u,393216u}/* 1065E */, /*17380*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871756u,138442752u,393216u}/* 1065F */, /*17381*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871764u,138442752u,393216u}/* 10660 */, /*17382*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871772u,138442752u,393216u}/* 10661 */, /*17383*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871780u,138442752u,393216u}/* 10662 */, /*17384*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871788u,138442752u,393216u}/* 10663 */, /*17385*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871796u,138442752u,393216u}/* 10664 */, /*17386*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871804u,138442752u,393216u}/* 10665 */, /*17387*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871812u,138442752u,393216u}/* 10666 */, /*17388*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871820u,138442752u,393216u}/* 10667 */, /*17389*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871828u,138442752u,393216u}/* 10668 */, /*17390*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871836u,138442752u,393216u}/* 10669 */, /*17391*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871844u,138442752u,393216u}/* 1066A */, /*17392*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871852u,138442752u,393216u}/* 1066B */, /*17393*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871860u,138442752u,393216u}/* 1066C */, /*17394*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871868u,138442752u,393216u}/* 1066D */, /*17395*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871876u,138442752u,393216u}/* 1066E */, /*17396*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871884u,138442752u,393216u}/* 1066F */, /*17397*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871892u,138442752u,393216u}/* 10670 */, /*17398*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871900u,138442752u,393216u}/* 10671 */, /*17399*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871908u,138442752u,393216u}/* 10672 */, /*17400*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871916u,138442752u,393216u}/* 10673 */, /*17401*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871924u,138442752u,393216u}/* 10674 */, /*17402*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871932u,138442752u,393216u}/* 10675 */, /*17403*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871940u,138442752u,393216u}/* 10676 */, /*17404*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871948u,138442752u,393216u}/* 10677 */, /*17405*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871956u,138442752u,393216u}/* 10678 */, /*17406*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871964u,138442752u,393216u}/* 10679 */, /*17407*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871972u,138442752u,393216u}/* 1067A */, /*17408*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871980u,138442752u,393216u}/* 1067B */, /*17409*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871988u,138442752u,393216u}/* 1067C */, /*17410*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677871996u,138442752u,393216u}/* 1067D */, /*17411*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872004u,138442752u,393216u}/* 1067E */, /*17412*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872012u,138442752u,393216u}/* 1067F */, /*17413*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872020u,138442752u,393216u}/* 10680 */, /*17414*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872028u,138442752u,393216u}/* 10681 */, /*17415*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872036u,138442752u,393216u}/* 10682 */, /*17416*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872044u,138442752u,393216u}/* 10683 */, /*17417*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872052u,138442752u,393216u}/* 10684 */, /*17418*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872060u,138442752u,393216u}/* 10685 */, /*17419*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872068u,138442752u,393216u}/* 10686 */, /*17420*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872076u,138442752u,393216u}/* 10687 */, /*17421*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872084u,138442752u,393216u}/* 10688 */, /*17422*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872092u,138442752u,393216u}/* 10689 */, /*17423*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872100u,138442752u,393216u}/* 1068A */, /*17424*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872108u,138442752u,393216u}/* 1068B */, /*17425*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872116u,138442752u,393216u}/* 1068C */, /*17426*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872124u,138442752u,393216u}/* 1068D */, /*17427*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872132u,138442752u,393216u}/* 1068E */, /*17428*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872140u,138442752u,393216u}/* 1068F */, /*17429*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872148u,138442752u,393216u}/* 10690 */, /*17430*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872156u,138442752u,393216u}/* 10691 */, /*17431*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872164u,138442752u,393216u}/* 10692 */, /*17432*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872172u,138442752u,393216u}/* 10693 */, /*17433*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872180u,138442752u,393216u}/* 10694 */, /*17434*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872188u,138442752u,393216u}/* 10695 */, /*17435*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872196u,138442752u,393216u}/* 10696 */, /*17436*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872204u,138442752u,393216u}/* 10697 */, /*17437*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872212u,138442752u,393216u}/* 10698 */, /*17438*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872220u,138442752u,393216u}/* 10699 */, /*17439*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872228u,138442752u,393216u}/* 1069A */, /*17440*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872236u,138442752u,393216u}/* 1069B */, /*17441*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872244u,138442752u,393216u}/* 1069C */, /*17442*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872252u,138442752u,393216u}/* 1069D */, /*17443*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872260u,138442752u,393216u}/* 1069E */, /*17444*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872268u,138442752u,393216u}/* 1069F */, /*17445*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872276u,138442752u,393216u}/* 106A0 */, /*17446*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872284u,138442752u,393216u}/* 106A1 */, /*17447*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872292u,138442752u,393216u}/* 106A2 */, /*17448*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872300u,138442752u,393216u}/* 106A3 */, /*17449*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872308u,138442752u,393216u}/* 106A4 */, /*17450*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872316u,138442752u,393216u}/* 106A5 */, /*17451*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872324u,138442752u,393216u}/* 106A6 */, /*17452*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872332u,138442752u,393216u}/* 106A7 */, /*17453*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872340u,138442752u,393216u}/* 106A8 */, /*17454*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872348u,138442752u,393216u}/* 106A9 */, /*17455*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872356u,138442752u,393216u}/* 106AA */, /*17456*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872364u,138442752u,393216u}/* 106AB */, /*17457*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872372u,138442752u,393216u}/* 106AC */, /*17458*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872380u,138442752u,393216u}/* 106AD */, /*17459*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872388u,138442752u,393216u}/* 106AE */, /*17460*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872396u,138442752u,393216u}/* 106AF */, /*17461*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872404u,138442752u,393216u}/* 106B0 */, /*17462*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872412u,138442752u,393216u}/* 106B1 */, /*17463*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872420u,138442752u,393216u}/* 106B2 */, /*17464*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872428u,138442752u,393216u}/* 106B3 */, /*17465*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872436u,138442752u,393216u}/* 106B4 */, /*17466*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872444u,138442752u,393216u}/* 106B5 */, /*17467*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872452u,138442752u,393216u}/* 106B6 */, /*17468*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872460u,138442752u,393216u}/* 106B7 */, /*17469*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872468u,138442752u,393216u}/* 106B8 */, /*17470*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872476u,138442752u,393216u}/* 106B9 */, /*17471*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872484u,138442752u,393216u}/* 106BA */, /*17472*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872492u,138442752u,393216u}/* 106BB */, /*17473*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872500u,138442752u,393216u}/* 106BC */, /*17474*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872508u,138442752u,393216u}/* 106BD */, /*17475*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872516u,138442752u,393216u}/* 106BE */, /*17476*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872524u,138442752u,393216u}/* 106BF */, /*17477*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872532u,138442752u,393216u}/* 106C0 */, /*17478*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872540u,138442752u,393216u}/* 106C1 */, /*17479*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872548u,138442752u,393216u}/* 106C2 */, /*17480*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872556u,138442752u,393216u}/* 106C3 */, /*17481*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872564u,138442752u,393216u}/* 106C4 */, /*17482*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872572u,138442752u,393216u}/* 106C5 */, /*17483*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872580u,138442752u,393216u}/* 106C6 */, /*17484*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872588u,138442752u,393216u}/* 106C7 */, /*17485*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872596u,138442752u,393216u}/* 106C8 */, /*17486*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872604u,138442752u,393216u}/* 106C9 */, /*17487*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872612u,138442752u,393216u}/* 106CA */, /*17488*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872620u,138442752u,393216u}/* 106CB */, /*17489*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872628u,138442752u,393216u}/* 106CC */, /*17490*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872636u,138442752u,393216u}/* 106CD */, /*17491*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872644u,138442752u,393216u}/* 106CE */, /*17492*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872652u,138442752u,393216u}/* 106CF */, /*17493*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872660u,138442752u,393216u}/* 106D0 */, /*17494*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872668u,138442752u,393216u}/* 106D1 */, /*17495*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872676u,138442752u,393216u}/* 106D2 */, /*17496*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872684u,138442752u,393216u}/* 106D3 */, /*17497*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872692u,138442752u,393216u}/* 106D4 */, /*17498*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872700u,138442752u,393216u}/* 106D5 */, /*17499*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872708u,138442752u,393216u}/* 106D6 */, /*17500*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872716u,138442752u,393216u}/* 106D7 */, /*17501*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872724u,138442752u,393216u}/* 106D8 */, /*17502*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872732u,138442752u,393216u}/* 106D9 */, /*17503*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872740u,138442752u,393216u}/* 106DA */, /*17504*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872748u,138442752u,393216u}/* 106DB */, /*17505*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872756u,138442752u,393216u}/* 106DC */, /*17506*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872764u,138442752u,393216u}/* 106DD */, /*17507*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872772u,138442752u,393216u}/* 106DE */, /*17508*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872780u,138442752u,393216u}/* 106DF */, /*17509*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872788u,138442752u,393216u}/* 106E0 */, /*17510*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872796u,138442752u,393216u}/* 106E1 */, /*17511*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872804u,138442752u,393216u}/* 106E2 */, /*17512*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872812u,138442752u,393216u}/* 106E3 */, /*17513*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872820u,138442752u,393216u}/* 106E4 */, /*17514*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872828u,138442752u,393216u}/* 106E5 */, /*17515*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872836u,138442752u,393216u}/* 106E6 */, /*17516*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872844u,138442752u,393216u}/* 106E7 */, /*17517*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872852u,138442752u,393216u}/* 106E8 */, /*17518*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872860u,138442752u,393216u}/* 106E9 */, /*17519*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872868u,138442752u,393216u}/* 106EA */, /*17520*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872876u,138442752u,393216u}/* 106EB */, /*17521*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872884u,138442752u,393216u}/* 106EC */, /*17522*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872892u,138442752u,393216u}/* 106ED */, /*17523*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872900u,138442752u,393216u}/* 106EE */, /*17524*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872908u,138442752u,393216u}/* 106EF */, /*17525*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872916u,138442752u,393216u}/* 106F0 */, /*17526*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872924u,138442752u,393216u}/* 106F1 */, /*17527*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872932u,138442752u,393216u}/* 106F2 */, /*17528*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872940u,138442752u,393216u}/* 106F3 */, /*17529*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872948u,138442752u,393216u}/* 106F4 */, /*17530*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872956u,138442752u,393216u}/* 106F5 */, /*17531*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872964u,138442752u,393216u}/* 106F6 */, /*17532*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872972u,138442752u,393216u}/* 106F7 */, /*17533*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872980u,138442752u,393216u}/* 106F8 */, /*17534*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872988u,138442752u,393216u}/* 106F9 */, /*17535*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677872996u,138442752u,393216u}/* 106FA */, /*17536*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873004u,138442752u,393216u}/* 106FB */, /*17537*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873012u,138442752u,393216u}/* 106FC */, /*17538*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873020u,138442752u,393216u}/* 106FD */, /*17539*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873028u,138442752u,393216u}/* 106FE */, /*17540*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873036u,138442752u,393216u}/* 106FF */, /*17541*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873044u,138442752u,393216u}/* 10700 */, /*17542*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873052u,138442752u,393216u}/* 10701 */, /*17543*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873060u,138442752u,393216u}/* 10702 */, /*17544*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873068u,138442752u,393216u}/* 10703 */, /*17545*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873076u,138442752u,393216u}/* 10704 */, /*17546*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873084u,138442752u,393216u}/* 10705 */, /*17547*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873092u,138442752u,393216u}/* 10706 */, /*17548*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873100u,138442752u,393216u}/* 10707 */, /*17549*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873108u,138442752u,393216u}/* 10708 */, /*17550*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873116u,138442752u,393216u}/* 10709 */, /*17551*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873124u,138442752u,393216u}/* 1070A */, /*17552*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873132u,138442752u,393216u}/* 1070B */, /*17553*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873140u,138442752u,393216u}/* 1070C */, /*17554*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873148u,138442752u,393216u}/* 1070D */, /*17555*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873156u,138442752u,393216u}/* 1070E */, /*17556*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873164u,138442752u,393216u}/* 1070F */, /*17557*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873172u,138442752u,393216u}/* 10710 */, /*17558*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873180u,138442752u,393216u}/* 10711 */, /*17559*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873188u,138442752u,393216u}/* 10712 */, /*17560*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873196u,138442752u,393216u}/* 10713 */, /*17561*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873204u,138442752u,393216u}/* 10714 */, /*17562*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873212u,138442752u,393216u}/* 10715 */, /*17563*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873220u,138442752u,393216u}/* 10716 */, /*17564*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873228u,138442752u,393216u}/* 10717 */, /*17565*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873236u,138442752u,393216u}/* 10718 */, /*17566*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873244u,138442752u,393216u}/* 10719 */, /*17567*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873252u,138442752u,393216u}/* 1071A */, /*17568*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873260u,138442752u,393216u}/* 1071B */, /*17569*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873268u,138442752u,393216u}/* 1071C */, /*17570*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873276u,138442752u,393216u}/* 1071D */, /*17571*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873284u,138442752u,393216u}/* 1071E */, /*17572*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873292u,138442752u,393216u}/* 1071F */, /*17573*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873300u,138442752u,393216u}/* 10720 */, /*17574*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873308u,138442752u,393216u}/* 10721 */, /*17575*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873316u,138442752u,393216u}/* 10722 */, /*17576*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873324u,138442752u,393216u}/* 10723 */, /*17577*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873332u,138442752u,393216u}/* 10724 */, /*17578*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873340u,138442752u,393216u}/* 10725 */, /*17579*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873348u,138442752u,393216u}/* 10726 */, /*17580*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873356u,138442752u,393216u}/* 10727 */, /*17581*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873364u,138442752u,393216u}/* 10728 */, /*17582*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873372u,138442752u,393216u}/* 10729 */, /*17583*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873380u,138442752u,393216u}/* 1072A */, /*17584*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873388u,138442752u,393216u}/* 1072B */, /*17585*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873396u,138442752u,393216u}/* 1072C */, /*17586*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873404u,138442752u,393216u}/* 1072D */, /*17587*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873412u,138442752u,393216u}/* 1072E */, /*17588*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873420u,138442752u,393216u}/* 1072F */, /*17589*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873428u,138442752u,393216u}/* 10730 */, /*17590*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873436u,138442752u,393216u}/* 10731 */, /*17591*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873444u,138442752u,393216u}/* 10732 */, /*17592*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873452u,138442752u,393216u}/* 10733 */, /*17593*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873460u,138442752u,393216u}/* 10734 */, /*17594*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873468u,138442752u,393216u}/* 10735 */, /*17595*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873476u,138442752u,393216u}/* 10736 */, /*17596*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873484u,138442752u,393216u}/* 10740 */, /*17597*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873492u,138442752u,393216u}/* 10741 */, /*17598*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873500u,138442752u,393216u}/* 10742 */, /*17599*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873508u,138442752u,393216u}/* 10743 */, /*17600*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873516u,138442752u,393216u}/* 10744 */, /*17601*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873524u,138442752u,393216u}/* 10745 */, /*17602*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873532u,138442752u,393216u}/* 10746 */, /*17603*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873540u,138442752u,393216u}/* 10747 */, /*17604*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873548u,138442752u,393216u}/* 10748 */, /*17605*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873556u,138442752u,393216u}/* 10749 */, /*17606*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873564u,138442752u,393216u}/* 1074A */, /*17607*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873572u,138442752u,393216u}/* 1074B */, /*17608*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873580u,138442752u,393216u}/* 1074C */, /*17609*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873588u,138442752u,393216u}/* 1074D */, /*17610*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873596u,138442752u,393216u}/* 1074E */, /*17611*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873604u,138442752u,393216u}/* 1074F */, /*17612*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873612u,138442752u,393216u}/* 10750 */, /*17613*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873620u,138442752u,393216u}/* 10751 */, /*17614*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873628u,138442752u,393216u}/* 10752 */, /*17615*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873636u,138442752u,393216u}/* 10753 */, /*17616*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873644u,138442752u,393216u}/* 10754 */, /*17617*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873652u,138442752u,393216u}/* 10755 */, /*17618*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873660u,138442752u,393216u}/* 10760 */, /*17619*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873668u,138442752u,393216u}/* 10761 */, /*17620*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873676u,138442752u,393216u}/* 10762 */, /*17621*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873684u,138442752u,393216u}/* 10763 */, /*17622*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873692u,138442752u,393216u}/* 10764 */, /*17623*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873700u,138442752u,393216u}/* 10765 */, /*17624*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873708u,138442752u,393216u}/* 10766 */, /*17625*/{0,1464u,7208961u,77070341u,1515560u,3758096416u,1677873716u,138442752u,393216u}/* 10767 */, /*17626*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873724u,138442752u,393216u}/* 10800 */, /*17627*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873732u,138442752u,393216u}/* 10801 */, /*17628*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873740u,138442752u,393216u}/* 10802 */, /*17629*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873748u,138442752u,393216u}/* 10803 */, /*17630*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873756u,138442752u,393216u}/* 10804 */, /*17631*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873764u,138442752u,393216u}/* 10805 */, /*17632*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873772u,138442752u,393216u}/* 10808 */, /*17633*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873780u,138442752u,393216u}/* 1080A */, /*17634*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873788u,138442752u,393216u}/* 1080B */, /*17635*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873796u,138442752u,393216u}/* 1080C */, /*17636*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873804u,138442752u,393216u}/* 1080D */, /*17637*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873812u,138442752u,393216u}/* 1080E */, /*17638*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873820u,138442752u,393216u}/* 1080F */, /*17639*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873828u,138442752u,393216u}/* 10810 */, /*17640*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873836u,138442752u,393216u}/* 10811 */, /*17641*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873844u,138442752u,393216u}/* 10812 */, /*17642*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873852u,138442752u,393216u}/* 10813 */, /*17643*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873860u,138442752u,393216u}/* 10814 */, /*17644*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873868u,138442752u,393216u}/* 10815 */, /*17645*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873876u,138442752u,393216u}/* 10816 */, /*17646*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873884u,138442752u,393216u}/* 10817 */, /*17647*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873892u,138442752u,393216u}/* 10818 */, /*17648*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873900u,138442752u,393216u}/* 10819 */, /*17649*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873908u,138442752u,393216u}/* 1081A */, /*17650*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873916u,138442752u,393216u}/* 1081B */, /*17651*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873924u,138442752u,393216u}/* 1081C */, /*17652*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873932u,138442752u,393216u}/* 1081D */, /*17653*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873940u,138442752u,393216u}/* 1081E */, /*17654*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873948u,138442752u,393216u}/* 1081F */, /*17655*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873956u,138442752u,393216u}/* 10820 */, /*17656*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873964u,138442752u,393216u}/* 10821 */, /*17657*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873972u,138442752u,393216u}/* 10822 */, /*17658*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873980u,138442752u,393216u}/* 10823 */, /*17659*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873988u,138442752u,393216u}/* 10824 */, /*17660*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677873996u,138442752u,393216u}/* 10825 */, /*17661*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677874004u,138442752u,393216u}/* 10826 */, /*17662*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677874012u,138442752u,393216u}/* 10827 */, /*17663*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677874020u,138442752u,393216u}/* 10828 */, /*17664*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677874028u,138442752u,393216u}/* 10829 */, /*17665*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677874036u,138442752u,393216u}/* 1082A */, /*17666*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677874044u,138442752u,393216u}/* 1082B */, /*17667*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677874052u,138442752u,393216u}/* 1082C */, /*17668*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677874060u,138442752u,393216u}/* 1082D */, /*17669*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677874068u,138442752u,393216u}/* 1082E */, /*17670*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677874076u,138442752u,393216u}/* 1082F */, /*17671*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677874084u,138442752u,393216u}/* 10830 */, /*17672*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677874092u,138442752u,393216u}/* 10831 */, /*17673*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677874100u,138442752u,393216u}/* 10832 */, /*17674*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677874108u,138442752u,393216u}/* 10833 */, /*17675*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677874116u,138442752u,393216u}/* 10834 */, /*17676*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677874124u,138442752u,393216u}/* 10835 */, /*17677*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677874132u,138442752u,393216u}/* 10837 */, /*17678*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677874140u,138442752u,393216u}/* 10838 */, /*17679*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677874148u,138442752u,393216u}/* 1083C */, /*17680*/{0,1472u,3407873u,76776453u,1515560u,3758096416u,1677874156u,138442752u,393216u}/* 1083F */, /*17681*/{0,1480u,5701633u,76907525u,1515560u,3758096416u,1677875572u,138442752u,393216u}/* 10840 */, /*17682*/{0,1480u,5701633u,76907525u,1515560u,3758096416u,1677875580u,138442752u,393216u}/* 10841 */, /*17683*/{0,1480u,5701633u,76907525u,1515560u,3758096416u,1677875588u,138442752u,393216u}/* 10842 */, /*17684*/{0,1480u,5701633u,76907525u,1515560u,3758096416u,1677875596u,138442752u,393216u}/* 10843 */, /*17685*/{0,1480u,5701633u,76907525u,1515560u,3758096416u,1677875604u,138442752u,393216u}/* 10844 */, /*17686*/{0,1480u,5701633u,76907525u,1515560u,3758096416u,1677875612u,138442752u,393216u}/* 10845 */, /*17687*/{0,1480u,5701633u,76907525u,1515560u,3758096416u,1677875620u,138442752u,393216u}/* 10846 */, /*17688*/{0,1480u,5701633u,76907525u,1515560u,3758096416u,1677875628u,138442752u,393216u}/* 10847 */, /*17689*/{0,1480u,5701633u,76907525u,1515560u,3758096416u,1677875636u,138442752u,393216u}/* 10848 */, /*17690*/{0,1480u,5701633u,76907525u,1515560u,3758096416u,1677875644u,138442752u,393216u}/* 10849 */, /*17691*/{0,1480u,5701633u,76907525u,1515560u,3758096416u,1677875652u,138442752u,393216u}/* 1084A */, /*17692*/{0,1480u,5701633u,76907525u,1515560u,3758096416u,1677875660u,138442752u,393216u}/* 1084B */, /*17693*/{0,1480u,5701633u,76907525u,1515560u,3758096416u,1677875668u,138442752u,393216u}/* 1084C */, /*17694*/{0,1480u,5701633u,76907525u,1515560u,3758096416u,1677875676u,138442752u,393216u}/* 1084D */, /*17695*/{0,1480u,5701633u,76907525u,1515560u,3758096416u,1677875684u,138442752u,393216u}/* 1084E */, /*17696*/{0,1480u,5701633u,76907525u,1515560u,3758096416u,1677875692u,138442752u,393216u}/* 1084F */, /*17697*/{0,1480u,5701633u,76907525u,1515560u,3758096416u,1677875700u,138442752u,393216u}/* 10850 */, /*17698*/{0,1480u,5701633u,76907525u,1515560u,3758096416u,1677875708u,138442752u,393216u}/* 10851 */, /*17699*/{0,1480u,5701633u,76907525u,1515560u,3758096416u,1677875716u,138442752u,393216u}/* 10852 */, /*17700*/{0,1480u,5701633u,76907525u,1515560u,3758096416u,1677875724u,138442752u,393216u}/* 10853 */, /*17701*/{0,1480u,5701633u,76907525u,1515560u,3758096416u,1677875732u,138442752u,393216u}/* 10854 */, /*17702*/{0,1480u,5701633u,76907525u,1515560u,3758096416u,1677875740u,138442752u,393216u}/* 10855 */, /*17703*/{0,1480u,5701633u,69567511u,40u,1610612768u,5852u,138442754u,8388608u}/* 10857 */, /*17704*/{0,1480u,542574081u,76907531u,8388650u,1610612768u,58669u,138442752u,0}/* 10858 */, /*17705*/{0,1480u,576129537u,76907531u,8388650u,1610612768u,58677u,138442752u,0}/* 10859 */, /*17706*/{0,1480u,609683457u,76907531u,8388650u,1610612768u,58685u,138442752u,0}/* 1085A */, /*17707*/{0,1480u,827793409u,76907531u,8388650u,1610612768u,56861u,138442752u,0}/* 1085B */, /*17708*/{0,1480u,995568641u,76907531u,8388650u,1610612768u,56869u,138442752u,0}/* 1085C */, /*17709*/{0,1480u,1582789121u,76907531u,8388650u,1610612768u,56877u,138442752u,0}/* 1085D */, /*17710*/{0,1480u,1733788673u,76907531u,8388650u,1610612768u,56885u,138442752u,0}/* 1085E */, /*17711*/{0,1480u,1884788225u,76907531u,8388650u,1610612768u,56893u,138442752u,0}/* 1085F */, /*17712*/{0,1488u,7733249u,77071365u,1515560u,3758096416u,1677875052u,138442752u,393216u}/* 10860 */, /*17713*/{0,1488u,7733249u,77071365u,1515560u,3758096416u,1677875060u,138442752u,393216u}/* 10861 */, /*17714*/{0,1488u,7733249u,77071365u,1515560u,3758096416u,1677875068u,138442752u,393216u}/* 10862 */, /*17715*/{0,1488u,7733249u,77071365u,1515560u,3758096416u,1677875076u,138442752u,393216u}/* 10863 */, /*17716*/{0,1488u,7733249u,77071365u,1515560u,3758096416u,1677875084u,138442752u,393216u}/* 10864 */, /*17717*/{0,1488u,7733249u,77071365u,1515560u,3758096416u,1677875092u,138442752u,393216u}/* 10865 */, /*17718*/{0,1488u,7733249u,77071365u,1515560u,3758096416u,1677875100u,138442752u,393216u}/* 10866 */, /*17719*/{0,1488u,7733249u,77071365u,1515560u,3758096416u,1677875108u,138442752u,393216u}/* 10867 */, /*17720*/{0,1488u,7733249u,77071365u,1515560u,3758096416u,1677875116u,138442752u,393216u}/* 10868 */, /*17721*/{0,1488u,7733249u,77071365u,1515560u,3758096416u,1677875124u,138442752u,393216u}/* 10869 */, /*17722*/{0,1488u,7733249u,77071365u,1515560u,3758096416u,1677875132u,138442752u,393216u}/* 1086A */, /*17723*/{0,1488u,7733249u,77071365u,1515560u,3758096416u,1677875140u,138442752u,393216u}/* 1086B */, /*17724*/{0,1488u,7733249u,77071365u,1515560u,3758096416u,1677875148u,138442752u,393216u}/* 1086C */, /*17725*/{0,1488u,7733249u,77071365u,1515560u,3758096416u,1677875156u,138631168u,393216u}/* 1086D */, /*17726*/{0,1488u,7733249u,77071365u,1515560u,3758096416u,1677875156u,138442752u,393216u}/* 1086E */, /*17727*/{0,1488u,7733249u,77071365u,1515560u,3758096416u,1677875164u,138442752u,393216u}/* 1086F */, /*17728*/{0,1488u,7733249u,77071365u,1515560u,3758096416u,1677875172u,138442752u,393216u}/* 10870 */, /*17729*/{0,1488u,7733249u,77071365u,1515560u,3758096416u,1677875180u,138442752u,393216u}/* 10871 */, /*17730*/{0,1488u,7733249u,77071365u,1515560u,3758096416u,1677875188u,138442752u,393216u}/* 10872 */, /*17731*/{0,1488u,7733249u,77071365u,1515560u,3758096416u,1677875196u,138442752u,393216u}/* 10873 */, /*17732*/{0,1488u,7733249u,77071365u,1515560u,3758096416u,1677875204u,138442752u,393216u}/* 10874 */, /*17733*/{0,1488u,7733249u,77071365u,1515560u,3758096416u,1677875212u,138442752u,393216u}/* 10875 */, /*17734*/{0,1488u,7733249u,77071365u,1515560u,3758096416u,1677875220u,138442752u,393216u}/* 10876 */, /*17735*/{0,1488u,7733249u,77071387u,40u,1610612768u,32580u,138442752u,67108864u}/* 10877 */, /*17736*/{0,1488u,7733249u,77071387u,40u,1610612768u,32588u,138442752u,67108864u}/* 10878 */, /*17737*/{0,1488u,544605697u,77071371u,8388650u,1610612768u,58669u,138442752u,0}/* 10879 */, /*17738*/{0,1488u,578161153u,77071371u,8388650u,1610612768u,58677u,138442752u,0}/* 1087A */, /*17739*/{0,1488u,611715073u,77071371u,8388650u,1610612768u,58685u,138442752u,0}/* 1087B */, /*17740*/{0,1488u,645271553u,77071371u,8388650u,1610612768u,58693u,138442752u,0}/* 1087C */, /*17741*/{0,1488u,678824961u,77071371u,8388650u,1610612768u,58701u,138442752u,0}/* 1087D */, /*17742*/{0,1488u,829825025u,77071371u,8388650u,1610612768u,56741u,138442752u,0}/* 1087E */, /*17743*/{0,1488u,997600257u,77071371u,8388650u,1610612768u,56749u,138442752u,0}/* 1087F */, /*17744*/{0,1496u,7667713u,77071365u,1515560u,3758096416u,1677875228u,138631168u,393216u}/* 10880 */, /*17745*/{0,1496u,7667713u,77071365u,1515560u,3758096416u,1677875228u,138442752u,393216u}/* 10881 */, /*17746*/{0,1496u,7667713u,77071365u,1515560u,3758096416u,1677875236u,138631168u,393216u}/* 10882 */, /*17747*/{0,1496u,7667713u,77071365u,1515560u,3758096416u,1677875236u,138442752u,393216u}/* 10883 */, /*17748*/{0,1496u,7667713u,77071365u,1515560u,3758096416u,1677875244u,138442752u,393216u}/* 10884 */, /*17749*/{0,1496u,7667713u,77071365u,1515560u,3758096416u,1677875252u,138442752u,393216u}/* 10885 */, /*17750*/{0,1496u,7667713u,77071365u,1515560u,3758096416u,1677875260u,138631168u,393216u}/* 10886 */, /*17751*/{0,1496u,7667713u,77071365u,1515560u,3758096416u,1677875260u,138442752u,393216u}/* 10887 */, /*17752*/{0,1496u,7667713u,77071365u,1515560u,3758096416u,1677875268u,138442752u,393216u}/* 10888 */, /*17753*/{0,1496u,7667713u,77071365u,1515560u,3758096416u,1677875276u,138442752u,393216u}/* 10889 */, /*17754*/{0,1496u,7667713u,77071365u,1515560u,3758096416u,1677875284u,138442752u,393216u}/* 1088A */, /*17755*/{0,1496u,7667713u,77071365u,1515560u,3758096416u,1677875292u,138442752u,393216u}/* 1088B */, /*17756*/{0,1496u,7667713u,77071365u,1515560u,3758096416u,1677875300u,138631168u,393216u}/* 1088C */, /*17757*/{0,1496u,7667713u,77071365u,1515560u,3758096416u,1677875300u,138442752u,393216u}/* 1088D */, /*17758*/{0,1496u,7667713u,77071365u,1515560u,3758096416u,1677875308u,138631168u,393216u}/* 1088E */, /*17759*/{0,1496u,7667713u,77071365u,1515560u,3758096416u,1677875308u,138442752u,393216u}/* 1088F */, /*17760*/{0,1496u,7667713u,77071365u,1515560u,3758096416u,1677875316u,138631168u,393216u}/* 10890 */, /*17761*/{0,1496u,7667713u,77071365u,1515560u,3758096416u,1677875316u,138442752u,393216u}/* 10891 */, /*17762*/{0,1496u,7667713u,77071365u,1515560u,3758096416u,1677875324u,138631168u,393216u}/* 10892 */, /*17763*/{0,1496u,7667713u,77071365u,1515560u,3758096416u,1677875324u,138442752u,393216u}/* 10893 */, /*17764*/{0,1496u,7667713u,77071365u,1515560u,3758096416u,1677875332u,138631168u,393216u}/* 10894 */, /*17765*/{0,1496u,7667713u,77071365u,1515560u,3758096416u,1677875332u,138442752u,393216u}/* 10895 */, /*17766*/{0,1496u,7667713u,77071365u,1515560u,3758096416u,1677875340u,138442752u,393216u}/* 10896 */, /*17767*/{0,1496u,7667713u,77071365u,1515560u,3758096416u,1677875348u,138442752u,393216u}/* 10897 */, /*17768*/{0,1496u,7667713u,77071365u,1515560u,3758096416u,1677875356u,138442752u,393216u}/* 10898 */, /*17769*/{0,1496u,7667713u,77071365u,1515560u,3758096416u,1677875364u,138442752u,393216u}/* 10899 */, /*17770*/{0,1496u,7667713u,77071365u,1515560u,3758096416u,1677875372u,138442752u,393216u}/* 1089A */, /*17771*/{0,1496u,7667713u,77071365u,1515560u,3758096416u,1677875380u,138442752u,393216u}/* 1089B */, /*17772*/{0,1496u,7667713u,77071365u,1515560u,3758096416u,1677875388u,138631168u,393216u}/* 1089C */, /*17773*/{0,1496u,7667713u,77071365u,1515560u,3758096416u,1677875388u,138442752u,393216u}/* 1089D */, /*17774*/{0,1496u,7667713u,77071365u,1515560u,3758096416u,1677875396u,138442752u,393216u}/* 1089E */, /*17775*/{0,1496u,544540161u,77071371u,8388650u,1610612768u,58669u,138442752u,0}/* 108A7 */, /*17776*/{0,1496u,578095617u,77071371u,8388650u,1610612768u,58677u,138442752u,0}/* 108A8 */, /*17777*/{0,1496u,611649537u,77071371u,8388650u,1610612768u,58685u,138442752u,0}/* 108A9 */, /*17778*/{0,1496u,645206017u,77071371u,8388650u,1610612768u,58693u,138442752u,0}/* 108AA */, /*17779*/{0,1496u,678759425u,77071371u,8388650u,1610612768u,58701u,138442752u,0}/* 108AC */, /*17780*/{0,1496u,829759489u,77071371u,8388650u,1610612768u,56757u,138442752u,0}/* 108AD */, /*17781*/{0,1496u,997534721u,77071371u,8388650u,1610612768u,56765u,138442752u,0}/* 108AE */, /*17782*/{0,1496u,1584755201u,77071371u,8388650u,1610612768u,56773u,138442752u,0}/* 108AF */, /*17783*/{0,1504u,8388609u,77104133u,1515560u,3758096416u,1677875404u,138442752u,393216u}/* 108E0 */, /*17784*/{0,1504u,8388609u,77104133u,1515560u,3758096416u,1677875412u,138442752u,393216u}/* 108E1 */, /*17785*/{0,1504u,8388609u,77104133u,1515560u,3758096416u,1677875420u,138442752u,393216u}/* 108E2 */, /*17786*/{0,1504u,8388609u,77104133u,1515560u,3758096416u,1677875428u,138442752u,393216u}/* 108E3 */, /*17787*/{0,1504u,8388609u,77104133u,1515560u,3758096416u,1677875436u,138442752u,393216u}/* 108E4 */, /*17788*/{0,1504u,8388609u,77104133u,1515560u,3758096416u,1677875444u,138442752u,393216u}/* 108E5 */, /*17789*/{0,1504u,8388609u,77104133u,1515560u,3758096416u,1677875452u,138442752u,393216u}/* 108E6 */, /*17790*/{0,1504u,8388609u,77104133u,1515560u,3758096416u,1677875460u,138442752u,393216u}/* 108E7 */, /*17791*/{0,1504u,8388609u,77104133u,1515560u,3758096416u,1677875468u,138442752u,393216u}/* 108E8 */, /*17792*/{0,1504u,8388609u,77104133u,1515560u,3758096416u,1677875476u,138442752u,393216u}/* 108E9 */, /*17793*/{0,1504u,8388609u,77104133u,1515560u,3758096416u,1677875484u,138442752u,393216u}/* 108EA */, /*17794*/{0,1504u,8388609u,77104133u,1515560u,3758096416u,1677875492u,138442752u,393216u}/* 108EB */, /*17795*/{0,1504u,8388609u,77104133u,1515560u,3758096416u,1677875500u,138442752u,393216u}/* 108EC */, /*17796*/{0,1504u,8388609u,77104133u,1515560u,3758096416u,1677875508u,138442752u,393216u}/* 108ED */, /*17797*/{0,1504u,8388609u,77104133u,1515560u,3758096416u,1677875516u,138442752u,393216u}/* 108EE */, /*17798*/{0,1504u,8388609u,77104133u,1515560u,3758096416u,1677875524u,138442752u,393216u}/* 108EF */, /*17799*/{0,1504u,8388609u,77104133u,1515560u,3758096416u,1677875532u,138442752u,393216u}/* 108F0 */, /*17800*/{0,1504u,8388609u,77104133u,1515560u,3758096416u,1677875540u,138442752u,393216u}/* 108F1 */, /*17801*/{0,1504u,8388609u,77104133u,1515560u,3758096416u,1677875548u,138442752u,393216u}/* 108F2 */, /*17802*/{0,1504u,8388609u,77104133u,1515560u,3758096416u,1677875556u,138442752u,393216u}/* 108F4 */, /*17803*/{0,1504u,8388609u,77104133u,1515560u,3758096416u,1677875564u,138442752u,393216u}/* 108F5 */, /*17804*/{0,1504u,545261057u,77104139u,8388650u,1610612768u,58669u,138442752u,0}/* 108FB */, /*17805*/{0,1504u,679480321u,77104139u,8388650u,1610612768u,58701u,138442752u,0}/* 108FC */, /*17806*/{0,1504u,830480385u,77104139u,8388650u,1610612768u,56781u,138442752u,0}/* 108FD */, /*17807*/{0,1504u,998255617u,77104139u,8388650u,1610612768u,56789u,138442752u,0}/* 108FE */, /*17808*/{0,1504u,1585476097u,77104139u,8388650u,1610612768u,56797u,138442752u,0}/* 108FF */, /*17809*/{0,1512u,4194305u,76841989u,1515560u,3758096416u,1677793700u,138442752u,393216u}/* 10900 */, /*17810*/{0,1512u,4194305u,76841989u,1515560u,3758096416u,1677793708u,138442752u,393216u}/* 10901 */, /*17811*/{0,1512u,4194305u,76841989u,1515560u,3758096416u,1677793716u,138442752u,393216u}/* 10902 */, /*17812*/{0,1512u,4194305u,76841989u,1515560u,3758096416u,1677793724u,138442752u,393216u}/* 10903 */, /*17813*/{0,1512u,4194305u,76841989u,1515560u,3758096416u,1677793732u,138442752u,393216u}/* 10904 */, /*17814*/{0,1512u,4194305u,76841989u,1515560u,3758096416u,1677793740u,138442752u,393216u}/* 10905 */, /*17815*/{0,1512u,4194305u,76841989u,1515560u,3758096416u,1677793748u,138442752u,393216u}/* 10906 */, /*17816*/{0,1512u,4194305u,76841989u,1515560u,3758096416u,1677793756u,138442752u,393216u}/* 10907 */, /*17817*/{0,1512u,4194305u,76841989u,1515560u,3758096416u,1677793764u,138442752u,393216u}/* 10908 */, /*17818*/{0,1512u,4194305u,76841989u,1515560u,3758096416u,1677793772u,138442752u,393216u}/* 10909 */, /*17819*/{0,1512u,4194305u,76841989u,1515560u,3758096416u,1677793780u,138442752u,393216u}/* 1090A */, /*17820*/{0,1512u,4194305u,76841989u,1515560u,3758096416u,1677793788u,138442752u,393216u}/* 1090B */, /*17821*/{0,1512u,4194305u,76841989u,1515560u,3758096416u,1677793796u,138442752u,393216u}/* 1090C */, /*17822*/{0,1512u,4194305u,76841989u,1515560u,3758096416u,1677793804u,138442752u,393216u}/* 1090D */, /*17823*/{0,1512u,4194305u,76841989u,1515560u,3758096416u,1677793812u,138442752u,393216u}/* 1090E */, /*17824*/{0,1512u,4194305u,76841989u,1515560u,3758096416u,1677793820u,138442752u,393216u}/* 1090F */, /*17825*/{0,1512u,4194305u,76841989u,1515560u,3758096416u,1677793828u,138442752u,393216u}/* 10910 */, /*17826*/{0,1512u,4194305u,76841989u,1515560u,3758096416u,1677793836u,138442752u,393216u}/* 10911 */, /*17827*/{0,1512u,4194305u,76841989u,1515560u,3758096416u,1677793844u,138442752u,393216u}/* 10912 */, /*17828*/{0,1512u,4194305u,76841989u,1515560u,3758096416u,1677793852u,138442752u,393216u}/* 10913 */, /*17829*/{0,1512u,4194305u,76841989u,1515560u,3758096416u,1677793860u,138442752u,393216u}/* 10914 */, /*17830*/{0,1512u,4194305u,76841989u,1515560u,3758096416u,1677793868u,138442752u,393216u}/* 10915 */, /*17831*/{0,1512u,541066753u,76841995u,8388650u,1610612768u,58669u,138442752u,0}/* 10916 */, /*17832*/{0,1512u,826286081u,76841995u,8388650u,1610612768u,56837u,138442752u,0}/* 10917 */, /*17833*/{0,1512u,994061313u,76841995u,8388650u,1610612768u,56845u,138442752u,0}/* 10918 */, /*17834*/{0,1512u,1581281793u,76841995u,8388650u,1610612768u,56853u,138442752u,0}/* 10919 */, /*17835*/{0,1512u,574622209u,76907531u,8388650u,1610612768u,58677u,138442752u,0}/* 1091A */, /*17836*/{0,1512u,608176129u,76907531u,8388650u,1610612768u,58685u,138442752u,0}/* 1091B */, /*17837*/{0,1512u,4194305u,69511191u,40u,1610612768u,6156u,138442754u,8388608u}/* 1091F */, /*17838*/{0,1520u,4980737u,76874757u,1515560u,3758096416u,1677865364u,138442752u,393216u}/* 10920 */, /*17839*/{0,1520u,4980737u,76874757u,1515560u,3758096416u,1677865372u,138442752u,393216u}/* 10921 */, /*17840*/{0,1520u,4980737u,76874757u,1515560u,3758096416u,1677865380u,138442752u,393216u}/* 10922 */, /*17841*/{0,1520u,4980737u,76874757u,1515560u,3758096416u,1677865388u,138442752u,393216u}/* 10923 */, /*17842*/{0,1520u,4980737u,76874757u,1515560u,3758096416u,1677865396u,138442752u,393216u}/* 10924 */, /*17843*/{0,1520u,4980737u,76874757u,1515560u,3758096416u,1677865404u,138442752u,393216u}/* 10925 */, /*17844*/{0,1520u,4980737u,76874757u,1515560u,3758096416u,1677865412u,138442752u,393216u}/* 10926 */, /*17845*/{0,1520u,4980737u,76874757u,1515560u,3758096416u,1677865420u,138442752u,393216u}/* 10927 */, /*17846*/{0,1520u,4980737u,76874757u,1515560u,3758096416u,1677865428u,138442752u,393216u}/* 10928 */, /*17847*/{0,1520u,4980737u,76874757u,1515560u,3758096416u,1677865436u,138442752u,393216u}/* 10929 */, /*17848*/{0,1520u,4980737u,76874757u,1515560u,3758096416u,1677865444u,138442752u,393216u}/* 1092A */, /*17849*/{0,1520u,4980737u,76874757u,1515560u,3758096416u,1677865452u,138442752u,393216u}/* 1092B */, /*17850*/{0,1520u,4980737u,76874757u,1515560u,3758096416u,1677865460u,138442752u,393216u}/* 1092C */, /*17851*/{0,1520u,4980737u,76874757u,1515560u,3758096416u,1677865468u,138442752u,393216u}/* 1092D */, /*17852*/{0,1520u,4980737u,76874757u,1515560u,3758096416u,1677865476u,138442752u,393216u}/* 1092E */, /*17853*/{0,1520u,4980737u,76874757u,1515560u,3758096416u,1677865484u,138442752u,393216u}/* 1092F */, /*17854*/{0,1520u,4980737u,76874757u,1515560u,3758096416u,1677865492u,138442752u,393216u}/* 10930 */, /*17855*/{0,1520u,4980737u,76874757u,1515560u,3758096416u,1677865500u,138442752u,393216u}/* 10931 */, /*17856*/{0,1520u,4980737u,76874757u,1515560u,3758096416u,1677865508u,138442752u,393216u}/* 10932 */, /*17857*/{0,1520u,4980737u,76874757u,1515560u,3758096416u,1677865516u,138442752u,393216u}/* 10933 */, /*17858*/{0,1520u,4980737u,76874757u,1515560u,3758096416u,1677865524u,138442752u,393216u}/* 10934 */, /*17859*/{0,1520u,4980737u,76874757u,1515560u,3758096416u,1677865532u,138442752u,393216u}/* 10935 */, /*17860*/{0,1520u,4980737u,76874757u,1515560u,3758096416u,1677865540u,138442752u,393216u}/* 10936 */, /*17861*/{0,1520u,4980737u,76874757u,1515560u,3758096416u,1677865548u,138442752u,393216u}/* 10937 */, /*17862*/{0,1520u,4980737u,76874757u,1515560u,3758096416u,1677865556u,138442752u,393216u}/* 10938 */, /*17863*/{0,1520u,4980737u,76874757u,1515560u,3758096416u,1677865564u,138442752u,393216u}/* 10939 */, /*17864*/{0,1520u,4980737u,76874775u,40u,1610612768u,6108u,138442754u,0}/* 1093F */, /*17865*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894612u,1283536896u,393216u}/* 10980 */, /*17866*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894620u,1283536896u,393216u}/* 10981 */, /*17867*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894628u,1283536896u,393216u}/* 10982 */, /*17868*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894636u,1283536896u,393216u}/* 10983 */, /*17869*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894644u,1283536896u,393216u}/* 10984 */, /*17870*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894652u,1283536896u,393216u}/* 10985 */, /*17871*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894660u,1283536896u,393216u}/* 10986 */, /*17872*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894660u,1287731200u,393216u}/* 10987 */, /*17873*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894668u,1283536896u,393216u}/* 10988 */, /*17874*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894676u,1283536896u,393216u}/* 10989 */, /*17875*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894684u,1283536896u,393216u}/* 1098A */, /*17876*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894684u,1287731200u,393216u}/* 1098B */, /*17877*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894692u,1283536896u,393216u}/* 1098C */, /*17878*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894692u,1287731200u,393216u}/* 1098D */, /*17879*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894700u,1283536896u,393216u}/* 1098E */, /*17880*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894700u,1287731200u,393216u}/* 1098F */, /*17881*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894708u,1283536896u,393216u}/* 10990 */, /*17882*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894716u,1283536896u,393216u}/* 10991 */, /*17883*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894724u,1283536896u,393216u}/* 10992 */, /*17884*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894732u,1287731200u,393216u}/* 10993 */, /*17885*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894732u,1291925504u,393216u}/* 10994 */, /*17886*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894740u,1283536896u,393216u}/* 10995 */, /*17887*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894748u,1283536896u,393216u}/* 10996 */, /*17888*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894756u,1283536896u,393216u}/* 10997 */, /*17889*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894764u,1283536896u,393216u}/* 10998 */, /*17890*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894764u,1287731200u,393216u}/* 10999 */, /*17891*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894772u,1283536896u,393216u}/* 1099A */, /*17892*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894772u,1287731200u,393216u}/* 1099B */, /*17893*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894780u,1283536896u,393216u}/* 1099C */, /*17894*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894788u,1283536896u,393216u}/* 1099D */, /*17895*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894812u,138442752u,393216u}/* 1099E */, /*17896*/{0,1528u,6422529u,76973061u,1515560u,3758096416u,1677894820u,138442752u,393216u}/* 1099F */, /*17897*/{0,1536u,6356993u,76973061u,1515560u,3758096416u,1677894612u,138442752u,393216u}/* 109A0 */, /*17898*/{0,1536u,6356993u,76973061u,1515560u,3758096416u,1677894620u,138442752u,393216u}/* 109A1 */, /*17899*/{0,1536u,6356993u,76973061u,1515560u,3758096416u,1677894628u,138442752u,393216u}/* 109A2 */, /*17900*/{0,1536u,6356993u,76973061u,1515560u,3758096416u,1677894636u,138442752u,393216u}/* 109A3 */, /*17901*/{0,1536u,6356993u,76973061u,1515560u,3758096416u,1677894644u,138442752u,393216u}/* 109A4 */, /*17902*/{0,1536u,6356993u,76973061u,1515560u,3758096416u,1677894652u,138442752u,393216u}/* 109A5 */, /*17903*/{0,1536u,6356993u,76973061u,1515560u,3758096416u,1677894660u,138442752u,393216u}/* 109A6 */, /*17904*/{0,1536u,6356993u,76973061u,1515560u,3758096416u,1677894668u,138442752u,393216u}/* 109A7 */, /*17905*/{0,1536u,6356993u,76973061u,1515560u,3758096416u,1677894676u,138442752u,393216u}/* 109A8 */, /*17906*/{0,1536u,6356993u,76973061u,1515560u,3758096416u,1677894684u,138442752u,393216u}/* 109A9 */, /*17907*/{0,1536u,6356993u,76973061u,1515560u,3758096416u,1677894692u,138442752u,393216u}/* 109AA */, /*17908*/{0,1536u,6356993u,76973061u,1515560u,3758096416u,1677894700u,138442752u,393216u}/* 109AB */, /*17909*/{0,1536u,6356993u,76973061u,1515560u,3758096416u,1677894708u,138442752u,393216u}/* 109AC */, /*17910*/{0,1536u,6356993u,76973061u,1515560u,3758096416u,1677894716u,138442752u,393216u}/* 109AD */, /*17911*/{0,1536u,6356993u,76973061u,1515560u,3758096416u,1677894724u,138442752u,393216u}/* 109AE */, /*17912*/{0,1536u,6356993u,76973061u,1515560u,3758096416u,1677894732u,138442752u,393216u}/* 109AF */, /*17913*/{0,1536u,6356993u,76973061u,1515560u,3758096416u,1677894732u,1283536896u,393216u}/* 109B0 */, /*17914*/{0,1536u,6356993u,76973061u,1515560u,3758096416u,1677894740u,138442752u,393216u}/* 109B1 */, /*17915*/{0,1536u,6356993u,76973061u,1515560u,3758096416u,1677894748u,138442752u,393216u}/* 109B2 */, /*17916*/{0,1536u,6356993u,76973061u,1515560u,3758096416u,1677894756u,138442752u,393216u}/* 109B3 */, /*17917*/{0,1536u,6356993u,76973061u,1515560u,3758096416u,1677894764u,138442752u,393216u}/* 109B4 */, /*17918*/{0,1536u,6356993u,76973061u,1515560u,3758096416u,1677894772u,138442752u,393216u}/* 109B5 */, /*17919*/{0,1536u,6356993u,76973061u,1515560u,3758096416u,1677894780u,138442752u,393216u}/* 109B6 */, /*17920*/{0,1536u,6356993u,76973061u,1515560u,3758096416u,1677894788u,138442752u,393216u}/* 109B7 */, /*17921*/{0,1536u,526455297u,77104139u,33554474u,1610612768u,57877u,138442752u,0}/* 109BC */, /*17922*/{0,1536u,375457281u,77104139u,4194346u,1610612768u,57789u,138442752u,0}/* 109BD */, /*17923*/{0,1536u,6356993u,76973061u,1515560u,3758096416u,1677894796u,138442752u,393216u}/* 109BE */, /*17924*/{0,1536u,6356993u,76973061u,1515560u,3758096416u,1677894804u,138442752u,393216u}/* 109BF */, /*17925*/{0,1536u,543229441u,77104139u,8388650u,1610612768u,58669u,138442752u,0}/* 109C0 */, /*17926*/{0,1536u,576784897u,77104139u,8388650u,1610612768u,58677u,138442752u,0}/* 109C1 */, /*17927*/{0,1536u,610338817u,77104139u,8388650u,1610612768u,58685u,138442752u,0}/* 109C2 */, /*17928*/{0,1536u,643895297u,77104139u,8388650u,1610612768u,58693u,138442752u,0}/* 109C3 */, /*17929*/{0,1536u,677448705u,77104139u,8388650u,1610612768u,58701u,138442752u,0}/* 109C4 */, /*17930*/{0,1536u,711005697u,77104139u,8388650u,1610612768u,58709u,138442752u,0}/* 109C5 */, /*17931*/{0,1536u,744558081u,77104139u,8388650u,1610612768u,58717u,138442752u,0}/* 109C6 */, /*17932*/{0,1536u,778116097u,77104139u,8388650u,1610612768u,58725u,138442752u,0}/* 109C7 */, /*17933*/{0,1536u,811668481u,77104139u,8388650u,1610612768u,58733u,138442752u,0}/* 109C8 */, /*17934*/{0,1536u,828448769u,77104139u,8388650u,1610612768u,57445u,138442752u,0}/* 109C9 */, /*17935*/{0,1536u,996224001u,77104139u,8388650u,1610612768u,57453u,138442752u,0}/* 109CA */, /*17936*/{0,1536u,1164001281u,77104139u,8388650u,1610612768u,57461u,138442752u,0}/* 109CB */, /*17937*/{0,1536u,1331778561u,77104139u,8388650u,1610612768u,57469u,138442752u,0}/* 109CC */, /*17938*/{0,1536u,1499555841u,77104139u,8388650u,1610612768u,57477u,138442752u,0}/* 109CD */, /*17939*/{0,1536u,1516333569u,77104139u,8388650u,1610612768u,57485u,138442752u,0}/* 109CE */, /*17940*/{0,1536u,1533111297u,77104139u,8388650u,1610612768u,57493u,138442752u,0}/* 109CF */, /*17941*/{0,1536u,1583444481u,77104139u,8388650u,1610612768u,57501u,138442752u,0}/* 109D2 */, /*17942*/{0,1536u,1600222209u,77104139u,8388650u,1610612768u,57509u,138442752u,0}/* 109D3 */, /*17943*/{0,1536u,1616999937u,77104139u,8388650u,1610612768u,57517u,138442752u,0}/* 109D4 */, /*17944*/{0,1536u,1633777665u,77104139u,8388650u,1610612768u,57525u,138442752u,0}/* 109D5 */, /*17945*/{0,1536u,1650555393u,77104139u,8388650u,1610612768u,57533u,138442752u,0}/* 109D6 */, /*17946*/{0,1536u,1667333121u,77104139u,8388650u,1610612768u,57541u,138442752u,0}/* 109D7 */, /*17947*/{0,1536u,1684110849u,77104139u,8388650u,1610612768u,57549u,138442752u,0}/* 109D8 */, /*17948*/{0,1536u,1700888577u,77104139u,8388650u,1610612768u,57557u,138442752u,0}/* 109D9 */, /*17949*/{0,1536u,1717666305u,77104139u,8388650u,1610612768u,57565u,138442752u,0}/* 109DA */, /*17950*/{0,1536u,1734444033u,77104139u,8388650u,1610612768u,57573u,138442752u,0}/* 109DB */, /*17951*/{0,1536u,1751221761u,77104139u,8388650u,1610612768u,57581u,138442752u,0}/* 109DC */, /*17952*/{0,1536u,1767999489u,77104139u,8388650u,1610612768u,57589u,138442752u,0}/* 109DD */, /*17953*/{0,1536u,1784777217u,77104139u,8388650u,1610612768u,57597u,138442752u,0}/* 109DE */, /*17954*/{0,1536u,1801554945u,77104139u,8388650u,1610612768u,57605u,138442752u,0}/* 109DF */, /*17955*/{0,1536u,1818332673u,77104139u,8388650u,1610612768u,57613u,138442752u,0}/* 109E0 */, /*17956*/{0,1536u,1835110401u,77104139u,8388650u,1610612768u,57621u,138442752u,0}/* 109E1 */, /*17957*/{0,1536u,1851888129u,77104139u,8388650u,1610612768u,57629u,138442752u,0}/* 109E2 */, /*17958*/{0,1536u,1868665857u,77104139u,8388650u,1610612768u,57637u,138442752u,0}/* 109E3 */, /*17959*/{0,1536u,1885443585u,77104139u,8388650u,1610612768u,57645u,138442752u,0}/* 109E4 */, /*17960*/{0,1536u,1902221313u,77104139u,8388650u,1610612768u,57653u,138442752u,0}/* 109E5 */, /*17961*/{0,1536u,1918999041u,77104139u,8388650u,1610612768u,57661u,138442752u,0}/* 109E6 */, /*17962*/{0,1536u,1935776769u,77104139u,8388650u,1610612768u,57669u,138442752u,0}/* 109E7 */, /*17963*/{0,1536u,1952554497u,77104139u,8388650u,1610612768u,57677u,138442752u,0}/* 109E8 */, /*17964*/{0,1536u,1969332225u,77104139u,8388650u,1610612768u,57685u,138442752u,0}/* 109E9 */, /*17965*/{0,1536u,1986109953u,77104139u,8388650u,1610612768u,57693u,138442752u,0}/* 109EA */, /*17966*/{0,1536u,2002887681u,77104139u,8388650u,1610612768u,57701u,138442752u,0}/* 109EB */, /*17967*/{0,1536u,2019665409u,77104139u,8388650u,1610612768u,57709u,138442752u,0}/* 109EC */, /*17968*/{0,1536u,2036443137u,77104139u,8388650u,1610612768u,57717u,138442752u,0}/* 109ED */, /*17969*/{0,1536u,2053220865u,77104139u,8388650u,1610612768u,57725u,138442752u,0}/* 109EE */, /*17970*/{0,1536u,2086776321u,77104139u,8388650u,1610612768u,57733u,138442752u,0}/* 109EF */, /*17971*/{0,1536u,2103554049u,77104139u,8388650u,1610612768u,57741u,138442752u,0}/* 109F0 */, /*17972*/{0,1536u,2137109505u,77104139u,8388650u,1610612768u,57749u,138442752u,0}/* 109F1 */, /*17973*/{0,1536u,2153887233u,77104139u,8388650u,1610612768u,57757u,138442752u,0}/* 109F2 */, /*17974*/{0,1536u,2170664961u,77104139u,8388650u,1610612768u,57765u,138442752u,0}/* 109F3 */, /*17975*/{0,1536u,2187442689u,77104139u,8388650u,1610612768u,57773u,138442752u,0}/* 109F4 */, /*17976*/{0,1536u,2204220417u,77104139u,8388650u,1610612768u,57781u,138442752u,0}/* 109F5 */, /*17977*/{0,1536u,140576257u,77104139u,33554474u,1610612768u,57797u,138442752u,0}/* 109F6 */, /*17978*/{0,1536u,241239553u,77104139u,54525994u,1610612768u,57805u,138442752u,0}/* 109F7 */, /*17979*/{0,1536u,291571201u,77104139u,62914602u,1610612768u,57813u,138442752u,0}/* 109F8 */, /*17980*/{0,1536u,308348417u,77104139u,67108906u,1610612768u,57821u,138442752u,0}/* 109F9 */, /*17981*/{0,1536u,358681601u,77104139u,33554474u,1610612768u,57829u,138442752u,0}/* 109FA */, /*17982*/{0,1536u,375457281u,77104139u,4194346u,1610612768u,57837u,138442752u,0}/* 109FB */, /*17983*/{0,1536u,392236545u,77104139u,33554474u,1610612768u,57845u,138442752u,0}/* 109FC */, /*17984*/{0,1536u,442567169u,77104139u,67108906u,1610612768u,57853u,138442752u,0}/* 109FD */, /*17985*/{0,1536u,459343873u,77104139u,62914602u,1610612768u,57861u,138442752u,0}/* 109FE */, /*17986*/{0,1536u,492899329u,77104139u,54525994u,1610612768u,57869u,138442752u,0}/* 109FF */, /*17987*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815260u,138442752u,393216u}/* 10A00 */, /*17988*/{0,1544u,3997697u,68431878u,672030728u,3774873616u,1078029796u,138443264u,262144u}/* 10A01 */, /*17989*/{0,1544u,3997697u,68431878u,672030728u,3774873616u,1078029804u,138443264u,262144u}/* 10A02 */, /*17990*/{0,1544u,3997697u,68431878u,672030728u,3774873616u,1078029812u,138443264u,262144u}/* 10A03 */, /*17991*/{0,1544u,3997697u,68431878u,672030728u,3774873616u,1078029820u,138443264u,262144u}/* 10A05 */, /*17992*/{0,1544u,3997697u,68431878u,672030728u,3774873616u,1078029828u,138443264u,262144u}/* 10A06 */, /*17993*/{0,1544u,3997697u,68431878u,672030728u,3774873616u,1078029836u,138443264u,262144u}/* 10A0C */, /*17994*/{0,1544u,3997697u,3088330758u,672030728u,3774873616u,1077936140u,222329344u,262144u}/* 10A0D */, /*17995*/{0,1544u,3997697u,68431878u,672030728u,3774873616u,1077936140u,826309120u,262144u}/* 10A0E */, /*17996*/{0,1544u,3997697u,3423875078u,672030728u,3774873616u,1077936140u,830503424u,262144u}/* 10A0F */, /*17997*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815316u,138442752u,393216u}/* 10A10 */, /*17998*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815324u,138442752u,393216u}/* 10A11 */, /*17999*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815332u,138442752u,393216u}/* 10A12 */, /*18000*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815340u,138442752u,393216u}/* 10A13 */, /*18001*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815348u,138442752u,393216u}/* 10A15 */, /*18002*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815356u,138442752u,393216u}/* 10A16 */, /*18003*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815364u,138442752u,393216u}/* 10A17 */, /*18004*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815372u,138442752u,393216u}/* 10A19 */, /*18005*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815380u,138442752u,393216u}/* 10A1A */, /*18006*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815388u,138442752u,393216u}/* 10A1B */, /*18007*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815396u,138442752u,393216u}/* 10A1C */, /*18008*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815404u,138442752u,393216u}/* 10A1D */, /*18009*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815412u,138442752u,393216u}/* 10A1E */, /*18010*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815420u,138442752u,393216u}/* 10A1F */, /*18011*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815428u,138442752u,393216u}/* 10A20 */, /*18012*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815436u,138442752u,393216u}/* 10A21 */, /*18013*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815444u,138442752u,393216u}/* 10A22 */, /*18014*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815452u,138442752u,393216u}/* 10A23 */, /*18015*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815460u,138442752u,393216u}/* 10A24 */, /*18016*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815468u,138442752u,393216u}/* 10A25 */, /*18017*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815476u,138442752u,393216u}/* 10A26 */, /*18018*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815484u,138442752u,393216u}/* 10A27 */, /*18019*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815492u,138442752u,393216u}/* 10A28 */, /*18020*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815500u,138442752u,393216u}/* 10A29 */, /*18021*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815508u,138442752u,393216u}/* 10A2A */, /*18022*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815516u,138442752u,393216u}/* 10A2B */, /*18023*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815524u,138442752u,393216u}/* 10A2C */, /*18024*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815532u,138442752u,393216u}/* 10A2D */, /*18025*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815540u,138442752u,393216u}/* 10A2E */, /*18026*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815548u,138442752u,393216u}/* 10A2F */, /*18027*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815556u,138442752u,393216u}/* 10A30 */, /*18028*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815564u,138442752u,393216u}/* 10A31 */, /*18029*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815572u,138442752u,393216u}/* 10A32 */, /*18030*/{0,1544u,3997697u,76809221u,1515560u,3758096416u,1677815580u,138442752u,393216u}/* 10A33 */, /*18031*/{0,1544u,3997697u,3423875078u,672030728u,1627389968u,1077936140u,859863040u,262144u}/* 10A38 */, /*18032*/{0,1544u,3997697u,135540742u,672030728u,1627389968u,1077936140u,864057344u,262144u}/* 10A39 */, /*18033*/{0,1544u,3997697u,3088330758u,672030728u,1627389968u,1077936140u,868251648u,262144u}/* 10A3A */, /*18034*/{0,1544u,3997697u,336867334u,672030728u,1627389976u,1078030116u,138442752u,262144u}/* 10A3F */, /*18035*/{0,1544u,540870145u,76809227u,8388652u,1610612768u,58669u,138442752u,0}/* 10A40 */, /*18036*/{0,1544u,574425601u,76809227u,8388652u,1610612768u,58677u,138442752u,0}/* 10A41 */, /*18037*/{0,1544u,607979521u,76809227u,8388652u,1610612768u,58685u,138442752u,0}/* 10A42 */, /*18038*/{0,1544u,641536001u,76809227u,8388652u,1610612768u,58693u,138442752u,0}/* 10A43 */, /*18039*/{0,1544u,826089473u,76809227u,8388650u,1610612768u,57117u,138442752u,0}/* 10A44 */, /*18040*/{0,1544u,993864705u,76809227u,8388650u,1610612768u,57125u,138442752u,0}/* 10A45 */, /*18041*/{0,1544u,1581085185u,76809227u,8388650u,1610612768u,57133u,138442752u,0}/* 10A46 */, /*18042*/{0,1544u,1732084737u,76809227u,8388650u,1610612768u,57141u,138442752u,0}/* 10A47 */, /*18043*/{0,1544u,3997697u,69469207u,40u,1610612768u,8828u,138442754u,0}/* 10A50 */, /*18044*/{0,1544u,3997697u,69469207u,40u,1610612768u,8836u,138442754u,0}/* 10A51 */, /*18045*/{0,1544u,3997697u,69469207u,40u,1610612768u,8844u,138442754u,0}/* 10A52 */, /*18046*/{0,1544u,3997697u,69469207u,40u,1610612768u,8852u,138442754u,0}/* 10A53 */, /*18047*/{0,1544u,3997697u,69469207u,40u,1610612768u,8860u,138442754u,0}/* 10A54 */, /*18048*/{0,1544u,3997697u,69469207u,40u,1610612768u,8868u,138442754u,0}/* 10A55 */, /*18049*/{0,1544u,3997697u,69469207u,98344u,1610612768u,5476u,138442754u,41943040u}/* 10A56 */, /*18050*/{0,1544u,3997697u,69469207u,98344u,1610612768u,5484u,138442754u,41943040u}/* 10A57 */, /*18051*/{0,1544u,3997697u,76809239u,40u,1610612768u,8876u,138442754u,0}/* 10A58 */, /*18052*/{0,1552u,5767169u,76907525u,1515560u,3758096416u,1677874164u,138442752u,393216u}/* 10A60 */, /*18053*/{0,1552u,5767169u,76907525u,1515560u,3758096416u,1677874172u,138442752u,393216u}/* 10A61 */, /*18054*/{0,1552u,5767169u,76907525u,1515560u,3758096416u,1677874180u,138442752u,393216u}/* 10A62 */, /*18055*/{0,1552u,5767169u,76907525u,1515560u,3758096416u,1677874188u,138442752u,393216u}/* 10A63 */, /*18056*/{0,1552u,5767169u,76907525u,1515560u,3758096416u,1677874196u,138442752u,393216u}/* 10A64 */, /*18057*/{0,1552u,5767169u,76907525u,1515560u,3758096416u,1677874204u,138442752u,393216u}/* 10A65 */, /*18058*/{0,1552u,5767169u,76907525u,1515560u,3758096416u,1677874212u,138442752u,393216u}/* 10A66 */, /*18059*/{0,1552u,5767169u,76907525u,1515560u,3758096416u,1677874220u,138442752u,393216u}/* 10A67 */, /*18060*/{0,1552u,5767169u,76907525u,1515560u,3758096416u,1677874228u,138442752u,393216u}/* 10A68 */, /*18061*/{0,1552u,5767169u,76907525u,1515560u,3758096416u,1677874236u,138442752u,393216u}/* 10A69 */, /*18062*/{0,1552u,5767169u,76907525u,1515560u,3758096416u,1677874244u,138442752u,393216u}/* 10A6A */, /*18063*/{0,1552u,5767169u,76907525u,1515560u,3758096416u,1677874252u,138442752u,393216u}/* 10A6B */, /*18064*/{0,1552u,5767169u,76907525u,1515560u,3758096416u,1677874260u,138442752u,393216u}/* 10A6C */, /*18065*/{0,1552u,5767169u,76907525u,1515560u,3758096416u,1677874268u,138442752u,393216u}/* 10A6D */, /*18066*/{0,1552u,5767169u,76907525u,1515560u,3758096416u,1677874276u,138442752u,393216u}/* 10A6E */, /*18067*/{0,1552u,5767169u,76907525u,1515560u,3758096416u,1677874284u,138442752u,393216u}/* 10A6F */, /*18068*/{0,1552u,5767169u,76907525u,1515560u,3758096416u,1677874292u,138442752u,393216u}/* 10A70 */, /*18069*/{0,1552u,5767169u,76907525u,1515560u,3758096416u,1677874300u,138442752u,393216u}/* 10A71 */, /*18070*/{0,1552u,5767169u,76907525u,1515560u,3758096416u,1677874308u,138442752u,393216u}/* 10A72 */, /*18071*/{0,1552u,5767169u,76907525u,1515560u,3758096416u,1677874316u,138442752u,393216u}/* 10A73 */, /*18072*/{0,1552u,5767169u,76907525u,1515560u,3758096416u,1677874324u,138442752u,393216u}/* 10A74 */, /*18073*/{0,1552u,5767169u,76907525u,1515560u,3758096416u,1677874332u,138442752u,393216u}/* 10A75 */, /*18074*/{0,1552u,5767169u,76907525u,1515560u,3758096416u,1677874340u,138442752u,393216u}/* 10A76 */, /*18075*/{0,1552u,5767169u,76907525u,1515560u,3758096416u,1677874348u,138442752u,393216u}/* 10A77 */, /*18076*/{0,1552u,5767169u,76907525u,1515560u,3758096416u,1677874356u,138442752u,393216u}/* 10A78 */, /*18077*/{0,1552u,5767169u,76907525u,1515560u,3758096416u,1677874364u,138442752u,393216u}/* 10A79 */, /*18078*/{0,1552u,5767169u,76907525u,1515560u,3758096416u,1677874372u,138442752u,393216u}/* 10A7A */, /*18079*/{0,1552u,5767169u,76907525u,1515560u,3758096416u,1677874380u,138442752u,393216u}/* 10A7B */, /*18080*/{0,1552u,5767169u,76907525u,1515560u,3758096416u,1677874388u,138442752u,393216u}/* 10A7C */, /*18081*/{0,1552u,542639617u,76907531u,8388650u,1610612768u,58669u,138442752u,0}/* 10A7D */, /*18082*/{0,1552u,1498966017u,76907531u,8388650u,1610612768u,56805u,138442752u,0}/* 10A7E */, /*18083*/{0,1552u,5767169u,76907543u,40u,1610612768u,56812u,138442754u,0}/* 10A7F */, /*18084*/{0,1560u,7602177u,77071365u,1515560u,3758096416u,1677874396u,138442752u,393216u}/* 10A80 */, /*18085*/{0,1560u,7602177u,77071365u,1515560u,3758096416u,1677874404u,138442752u,393216u}/* 10A81 */, /*18086*/{0,1560u,7602177u,77071365u,1515560u,3758096416u,1677874412u,138442752u,393216u}/* 10A82 */, /*18087*/{0,1560u,7602177u,77071365u,1515560u,3758096416u,1677874420u,138442752u,393216u}/* 10A83 */, /*18088*/{0,1560u,7602177u,77071365u,1515560u,3758096416u,1677874428u,138442752u,393216u}/* 10A84 */, /*18089*/{0,1560u,7602177u,77071365u,1515560u,3758096416u,1677874436u,138442752u,393216u}/* 10A85 */, /*18090*/{0,1560u,7602177u,77071365u,1515560u,3758096416u,1677874444u,138442752u,393216u}/* 10A86 */, /*18091*/{0,1560u,7602177u,77071365u,1515560u,3758096416u,1677874452u,138442752u,393216u}/* 10A87 */, /*18092*/{0,1560u,7602177u,77071365u,1515560u,3758096416u,1677874460u,138442752u,393216u}/* 10A88 */, /*18093*/{0,1560u,7602177u,77071365u,1515560u,3758096416u,1677874468u,138442752u,393216u}/* 10A89 */, /*18094*/{0,1560u,7602177u,77071365u,1515560u,3758096416u,1677874476u,138442752u,393216u}/* 10A8A */, /*18095*/{0,1560u,7602177u,77071365u,1515560u,3758096416u,1677874484u,138442752u,393216u}/* 10A8B */, /*18096*/{0,1560u,7602177u,77071365u,1515560u,3758096416u,1677874492u,138442752u,393216u}/* 10A8C */, /*18097*/{0,1560u,7602177u,77071365u,1515560u,3758096416u,1677874500u,138442752u,393216u}/* 10A8D */, /*18098*/{0,1560u,7602177u,77071365u,1515560u,3758096416u,1677874508u,138442752u,393216u}/* 10A8E */, /*18099*/{0,1560u,7602177u,77071365u,1515560u,3758096416u,1677874516u,138442752u,393216u}/* 10A8F */, /*18100*/{0,1560u,7602177u,77071365u,1515560u,3758096416u,1677874524u,138442752u,393216u}/* 10A90 */, /*18101*/{0,1560u,7602177u,77071365u,1515560u,3758096416u,1677874532u,138442752u,393216u}/* 10A91 */, /*18102*/{0,1560u,7602177u,77071365u,1515560u,3758096416u,1677874540u,138442752u,393216u}/* 10A92 */, /*18103*/{0,1560u,7602177u,77071365u,1515560u,3758096416u,1677874548u,138442752u,393216u}/* 10A93 */, /*18104*/{0,1560u,7602177u,77071365u,1515560u,3758096416u,1677874556u,138442752u,393216u}/* 10A94 */, /*18105*/{0,1560u,7602177u,77071365u,1515560u,3758096416u,1677874564u,138442752u,393216u}/* 10A95 */, /*18106*/{0,1560u,7602177u,77071365u,1515560u,3758096416u,1677874572u,138442752u,393216u}/* 10A96 */, /*18107*/{0,1560u,7602177u,77071365u,1515560u,3758096416u,1677874580u,138442752u,393216u}/* 10A97 */, /*18108*/{0,1560u,7602177u,77071365u,1515560u,3758096416u,1677874588u,138442752u,393216u}/* 10A98 */, /*18109*/{0,1560u,7602177u,77071365u,1515560u,3758096416u,1677874596u,138442752u,393216u}/* 10A99 */, /*18110*/{0,1560u,7602177u,77071365u,1515560u,3758096416u,1677874604u,138442752u,393216u}/* 10A9A */, /*18111*/{0,1560u,7602177u,77071365u,1515560u,3758096416u,1677874612u,138442752u,393216u}/* 10A9B */, /*18112*/{0,1560u,7602177u,77071365u,1515560u,3758096416u,1677874620u,138442752u,393216u}/* 10A9C */, /*18113*/{0,1560u,544474625u,77071371u,8388650u,1610612768u,58669u,138442752u,0}/* 10A9D */, /*18114*/{0,1560u,829693953u,77071371u,8388650u,1610612768u,56821u,138442752u,0}/* 10A9E */, /*18115*/{0,1560u,997469185u,77071371u,8388650u,1610612768u,56829u,138442752u,0}/* 10A9F */, /*18116*/{73u,1568u,7340033u,77071365u,1515688u,3758096416u,1677876220u,138442752u,393216u}/* 10AC0 */, /*18117*/{74u,1568u,7340033u,77071365u,1515688u,3758096416u,1677876228u,138442752u,393216u}/* 10AC1 */, /*18118*/{74u,1568u,7340033u,77071365u,1515688u,3758096416u,1677876236u,138442752u,393216u}/* 10AC2 */, /*18119*/{75u,1568u,7340033u,77071365u,1515688u,3758096416u,1677876244u,138442752u,393216u}/* 10AC3 */, /*18120*/{75u,1568u,7340033u,77071365u,1515688u,3758096416u,1677876252u,138442752u,393216u}/* 10AC4 */, /*18121*/{76u,1568u,7340033u,77071365u,1515816u,3758096416u,1677876260u,138442752u,393216u}/* 10AC5 */, /*18122*/{0u,1568u,7340033u,77071365u,1515560u,3758096416u,1677876268u,138442752u,393216u}/* 10AC6 */, /*18123*/{77u,1568u,7340033u,77071365u,1515816u,3758096416u,1677876276u,138442752u,393216u}/* 10AC7 */, /*18124*/{0u,1568u,7340033u,77071387u,40u,1610612768u,154676u,1287731200u,67108864u}/* 10AC8 */, /*18125*/{78u,1568u,7340033u,77071365u,1515816u,3758096416u,1677876284u,138442752u,393216u}/* 10AC9 */, /*18126*/{78u,1568u,7340033u,77071365u,1515816u,3758096416u,1677876292u,138442752u,393216u}/* 10ACA */, /*18127*/{0u,1568u,7340033u,77071365u,1515560u,3758096416u,1677876300u,138442752u,393216u}/* 10ACB */, /*18128*/{0u,1568u,7340033u,77071365u,1515560u,3758096416u,1677876308u,138442752u,393216u}/* 10ACC */, /*18129*/{79u,1568u,7340033u,77071365u,1516200u,3758096416u,1677876316u,138442752u,393216u}/* 10ACD */, /*18130*/{80u,1568u,7340033u,77071365u,1515816u,3758096416u,1677876324u,138442752u,393216u}/* 10ACE */, /*18131*/{81u,1568u,7340033u,77071365u,1515816u,3758096416u,1677876332u,138442752u,393216u}/* 10ACF */, /*18132*/{82u,1568u,7340033u,77071365u,1515816u,3758096416u,1677876340u,138442752u,393216u}/* 10AD0 */, /*18133*/{82u,1568u,7340033u,77071365u,1515816u,3758096416u,1677876348u,138442752u,393216u}/* 10AD1 */, /*18134*/{82u,1568u,7340033u,77071365u,1515816u,3758096416u,1677876356u,138442752u,393216u}/* 10AD2 */, /*18135*/{83u,1568u,7340033u,77071365u,1515688u,3758096416u,1677876364u,138442752u,393216u}/* 10AD3 */, /*18136*/{84u,1568u,7340033u,77071365u,1515688u,3758096416u,1677876372u,138442752u,393216u}/* 10AD4 */, /*18137*/{85u,1568u,7340033u,77071365u,1515688u,3758096416u,1677876380u,138442752u,393216u}/* 10AD5 */, /*18138*/{86u,1568u,7340033u,77071365u,1515688u,3758096416u,1677876388u,138442752u,393216u}/* 10AD6 */, /*18139*/{87u,1568u,7340033u,77071365u,1516200u,3758096416u,1677876396u,138442752u,393216u}/* 10AD7 */, /*18140*/{88u,1568u,7340033u,77071365u,1515688u,3758096416u,1677876404u,138442752u,393216u}/* 10AD8 */, /*18141*/{89u,1568u,7340033u,77071365u,1515688u,3758096416u,1677876412u,138442752u,393216u}/* 10AD9 */, /*18142*/{89u,1568u,7340033u,77071365u,1515688u,3758096416u,1677876420u,138442752u,393216u}/* 10ADA */, /*18143*/{90u,1568u,7340033u,77071365u,1515688u,3758096416u,1677876428u,138442752u,393216u}/* 10ADB */, /*18144*/{90u,1568u,7340033u,77071365u,1515688u,3758096416u,1677876436u,138442752u,393216u}/* 10ADC */, /*18145*/{91u,1568u,7340033u,77071365u,1515816u,3758096416u,1677876444u,138442752u,393216u}/* 10ADD */, /*18146*/{92u,1568u,7340033u,77071365u,1515688u,3758096416u,1677876452u,138442752u,393216u}/* 10ADE */, /*18147*/{92u,1568u,7340033u,77071365u,1515688u,3758096416u,1677876460u,138442752u,393216u}/* 10ADF */, /*18148*/{92u,1568u,7340033u,77071365u,1515688u,3758096416u,1677876468u,138442752u,393216u}/* 10AE0 */, /*18149*/{93u,1568u,7340033u,77071365u,1515816u,3758096416u,1677876476u,138442752u,393216u}/* 10AE1 */, /*18150*/{0u,1568u,7340033u,77071365u,1515560u,3758096416u,1677876484u,138442752u,393216u}/* 10AE2 */, /*18151*/{0u,1568u,7340033u,77071365u,1515560u,3758096416u,1677876492u,138442752u,393216u}/* 10AE3 */, /*18152*/{94u,1568u,7340033u,77071365u,1515816u,3758096416u,1677876500u,138442752u,393216u}/* 10AE4 */, /*18153*/{0,1568u,7340033u,3424137222u,672030728u,1627398160u,1077936140u,218134528u,262144u}/* 10AE5 */, /*18154*/{0,1568u,7340033u,3088592902u,672030728u,1627398160u,1077936140u,222328832u,262144u}/* 10AE6 */, /*18155*/{95u,1568u,544212481u,77071371u,8388778u,1610612768u,58669u,138442752u,0}/* 10AEB */, /*18156*/{96u,1568u,678431745u,77071371u,8388778u,1610612768u,58701u,138442752u,0}/* 10AEC */, /*18157*/{97u,1568u,829431809u,77071371u,8388778u,1610612768u,56901u,138442752u,0}/* 10AED */, /*18158*/{98u,1568u,997207041u,77071371u,8388778u,1610612768u,56909u,138442752u,0}/* 10AEE */, /*18159*/{99u,1568u,1584427521u,77071371u,8388906u,1610612768u,56917u,138442752u,0}/* 10AEF */, /*18160*/{0,1568u,7340033u,69731351u,40u,1610612768u,8916u,138442754u,8388608u}/* 10AF0 */, /*18161*/{0,1568u,7340033u,69731351u,40u,1610612768u,8924u,138442754u,8388608u}/* 10AF1 */, /*18162*/{0,1568u,7340033u,69731351u,40u,1610612768u,8932u,138442754u,8388608u}/* 10AF2 */, /*18163*/{0,1568u,7340033u,69731351u,40u,1610612768u,8940u,138442754u,8388608u}/* 10AF3 */, /*18164*/{0,1568u,7340033u,69731351u,40u,1610612768u,8948u,138442754u,8388608u}/* 10AF4 */, /*18165*/{0,1568u,7340033u,69731351u,40u,1610612768u,8956u,138442754u,8388608u}/* 10AF5 */, /*18166*/{0,1568u,7340033u,101188631u,40u,1610612768u,8964u,138442754u,0}/* 10AF6 */, /*18167*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874628u,138442752u,393216u}/* 10B00 */, /*18168*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874636u,138442752u,393216u}/* 10B01 */, /*18169*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874644u,138442752u,393216u}/* 10B02 */, /*18170*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874652u,138442752u,393216u}/* 10B03 */, /*18171*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874660u,138442752u,393216u}/* 10B04 */, /*18172*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874668u,138442752u,393216u}/* 10B05 */, /*18173*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874676u,138442752u,393216u}/* 10B06 */, /*18174*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874684u,138442752u,393216u}/* 10B07 */, /*18175*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874692u,138442752u,393216u}/* 10B08 */, /*18176*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874700u,138442752u,393216u}/* 10B09 */, /*18177*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874708u,138442752u,393216u}/* 10B0A */, /*18178*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874716u,138442752u,393216u}/* 10B0B */, /*18179*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874724u,138442752u,393216u}/* 10B0C */, /*18180*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874732u,138442752u,393216u}/* 10B0D */, /*18181*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874740u,138442752u,393216u}/* 10B0E */, /*18182*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874748u,138442752u,393216u}/* 10B0F */, /*18183*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874756u,138442752u,393216u}/* 10B10 */, /*18184*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874764u,138442752u,393216u}/* 10B11 */, /*18185*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874772u,138442752u,393216u}/* 10B12 */, /*18186*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874780u,138442752u,393216u}/* 10B13 */, /*18187*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874788u,138442752u,393216u}/* 10B14 */, /*18188*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874796u,138442752u,393216u}/* 10B15 */, /*18189*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874804u,138442752u,393216u}/* 10B16 */, /*18190*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874812u,138442752u,393216u}/* 10B17 */, /*18191*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874820u,138442752u,393216u}/* 10B18 */, /*18192*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874828u,138442752u,393216u}/* 10B19 */, /*18193*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874836u,138442752u,393216u}/* 10B1A */, /*18194*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874844u,138442752u,393216u}/* 10B1B */, /*18195*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874852u,138442752u,393216u}/* 10B1C */, /*18196*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874860u,138442752u,393216u}/* 10B1D */, /*18197*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874868u,138442752u,393216u}/* 10B1E */, /*18198*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874876u,138442752u,393216u}/* 10B1F */, /*18199*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874884u,138442752u,393216u}/* 10B20 */, /*18200*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874892u,138442752u,393216u}/* 10B21 */, /*18201*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874900u,138442752u,393216u}/* 10B22 */, /*18202*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874908u,138442752u,393216u}/* 10B23 */, /*18203*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874916u,138442752u,393216u}/* 10B24 */, /*18204*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874924u,138442752u,393216u}/* 10B25 */, /*18205*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874932u,138442752u,393216u}/* 10B26 */, /*18206*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874940u,138442752u,393216u}/* 10B27 */, /*18207*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874948u,138442752u,393216u}/* 10B28 */, /*18208*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874956u,138442752u,393216u}/* 10B29 */, /*18209*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874964u,138442752u,393216u}/* 10B2A */, /*18210*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874972u,138442752u,393216u}/* 10B2B */, /*18211*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874980u,138442752u,393216u}/* 10B2C */, /*18212*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874988u,138442752u,393216u}/* 10B2D */, /*18213*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874988u,1283536896u,393216u}/* 10B2E */, /*18214*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677874996u,138442752u,393216u}/* 10B2F */, /*18215*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677875004u,138442752u,393216u}/* 10B30 */, /*18216*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677875012u,138442752u,393216u}/* 10B31 */, /*18217*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677875020u,138442752u,393216u}/* 10B32 */, /*18218*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677875028u,138442752u,393216u}/* 10B33 */, /*18219*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677875036u,138442752u,393216u}/* 10B34 */, /*18220*/{0,1576u,5242881u,76907525u,1515560u,3758096416u,1677875044u,138442752u,393216u}/* 10B35 */, /*18221*/{0,1576u,5242881u,69576727u,40u,1610612768u,8908u,138442754u,0}/* 10B39 */, /*18222*/{0,1576u,5242881u,69576727u,40u,1610612768u,5860u,138442754u,8388608u}/* 10B3A */, /*18223*/{0,1576u,5242881u,69576727u,40u,1610612768u,5868u,138442754u,8388608u}/* 10B3B */, /*18224*/{0,1576u,5242881u,69576727u,40u,1610612768u,5876u,138442754u,8388608u}/* 10B3C */, /*18225*/{0,1576u,5242881u,69576727u,40u,1610612768u,5884u,138442754u,8388608u}/* 10B3D */, /*18226*/{0,1576u,5242881u,69576727u,40u,1610612768u,5892u,138442754u,8388608u}/* 10B3E */, /*18227*/{0,1576u,5242881u,69576727u,40u,1610612768u,5900u,138442754u,8388608u}/* 10B3F */, /*18228*/{0,1584u,5832705u,76907525u,1515560u,3758096416u,1677875748u,138442752u,393216u}/* 10B40 */, /*18229*/{0,1584u,5832705u,76907525u,1515560u,3758096416u,1677875756u,138442752u,393216u}/* 10B41 */, /*18230*/{0,1584u,5832705u,76907525u,1515560u,3758096416u,1677875764u,138442752u,393216u}/* 10B42 */, /*18231*/{0,1584u,5832705u,76907525u,1515560u,3758096416u,1677875772u,138442752u,393216u}/* 10B43 */, /*18232*/{0,1584u,5832705u,76907525u,1515560u,3758096416u,1677875780u,138442752u,393216u}/* 10B44 */, /*18233*/{0,1584u,5832705u,76907525u,1515560u,3758096416u,1677875788u,138442752u,393216u}/* 10B45 */, /*18234*/{0,1584u,5832705u,76907525u,1515560u,3758096416u,1677875796u,138442752u,393216u}/* 10B46 */, /*18235*/{0,1584u,5832705u,76907525u,1515560u,3758096416u,1677875804u,138442752u,393216u}/* 10B47 */, /*18236*/{0,1584u,5832705u,76907525u,1515560u,3758096416u,1677875812u,138442752u,393216u}/* 10B48 */, /*18237*/{0,1584u,5832705u,76907525u,1515560u,3758096416u,1677875820u,138442752u,393216u}/* 10B49 */, /*18238*/{0,1584u,5832705u,76907525u,1515560u,3758096416u,1677875828u,138442752u,393216u}/* 10B4A */, /*18239*/{0,1584u,5832705u,76907525u,1515560u,3758096416u,1677875836u,138442752u,393216u}/* 10B4B */, /*18240*/{0,1584u,5832705u,76907525u,1515560u,3758096416u,1677875844u,138442752u,393216u}/* 10B4C */, /*18241*/{0,1584u,5832705u,76907525u,1515560u,3758096416u,1677875852u,138442752u,393216u}/* 10B4D */, /*18242*/{0,1584u,5832705u,76907525u,1515560u,3758096416u,1677875860u,138442752u,393216u}/* 10B4E */, /*18243*/{0,1584u,5832705u,76907525u,1515560u,3758096416u,1677875868u,138442752u,393216u}/* 10B4F */, /*18244*/{0,1584u,5832705u,76907525u,1515560u,3758096416u,1677875876u,138442752u,393216u}/* 10B50 */, /*18245*/{0,1584u,5832705u,76907525u,1515560u,3758096416u,1677875884u,138442752u,393216u}/* 10B51 */, /*18246*/{0,1584u,5832705u,76907525u,1515560u,3758096416u,1677875892u,138442752u,393216u}/* 10B52 */, /*18247*/{0,1584u,5832705u,76907525u,1515560u,3758096416u,1677875900u,138442752u,393216u}/* 10B53 */, /*18248*/{0,1584u,5832705u,76907525u,1515560u,3758096416u,1677875908u,138442752u,393216u}/* 10B54 */, /*18249*/{0,1584u,5832705u,76907525u,1515560u,3758096416u,1677875916u,138442752u,393216u}/* 10B55 */, /*18250*/{0,1584u,542705153u,76907531u,8388650u,1610612768u,58669u,138442752u,0}/* 10B58 */, /*18251*/{0,1584u,576260609u,76907531u,8388650u,1610612768u,58677u,138442752u,0}/* 10B59 */, /*18252*/{0,1584u,609814529u,76907531u,8388650u,1610612768u,58685u,138442752u,0}/* 10B5A */, /*18253*/{0,1584u,643371009u,76907531u,8388650u,1610612768u,58693u,138442752u,0}/* 10B5B */, /*18254*/{0,1584u,827924481u,76907531u,8388650u,1610612768u,56925u,138442752u,0}/* 10B5C */, /*18255*/{0,1584u,995699713u,76907531u,8388650u,1610612768u,56933u,138442752u,0}/* 10B5D */, /*18256*/{0,1584u,1582920193u,76907531u,8388650u,1610612768u,56941u,138442752u,0}/* 10B5E */, /*18257*/{0,1584u,1733919745u,76907531u,8388650u,1610612768u,56949u,138442752u,0}/* 10B5F */, /*18258*/{0,1592u,5898241u,76907525u,1515560u,3758096416u,1677875924u,138442752u,393216u}/* 10B60 */, /*18259*/{0,1592u,5898241u,76907525u,1515560u,3758096416u,1677875932u,138442752u,393216u}/* 10B61 */, /*18260*/{0,1592u,5898241u,76907525u,1515560u,3758096416u,1677875940u,138442752u,393216u}/* 10B62 */, /*18261*/{0,1592u,5898241u,76907525u,1515560u,3758096416u,1677875948u,138442752u,393216u}/* 10B63 */, /*18262*/{0,1592u,5898241u,76907525u,1515560u,3758096416u,1677875956u,138442752u,393216u}/* 10B64 */, /*18263*/{0,1592u,5898241u,76907525u,1515560u,3758096416u,1677875964u,138442752u,393216u}/* 10B65 */, /*18264*/{0,1592u,5898241u,76907525u,1515560u,3758096416u,1677875972u,138442752u,393216u}/* 10B66 */, /*18265*/{0,1592u,5898241u,76907525u,1515560u,3758096416u,1677875980u,138442752u,393216u}/* 10B67 */, /*18266*/{0,1592u,5898241u,76907525u,1515560u,3758096416u,1677875988u,138442752u,393216u}/* 10B68 */, /*18267*/{0,1592u,5898241u,76907525u,1515560u,3758096416u,1677875996u,138442752u,393216u}/* 10B69 */, /*18268*/{0,1592u,5898241u,76907525u,1515560u,3758096416u,1677876004u,138442752u,393216u}/* 10B6A */, /*18269*/{0,1592u,5898241u,76907525u,1515560u,3758096416u,1677876012u,138442752u,393216u}/* 10B6B */, /*18270*/{0,1592u,5898241u,76907525u,1515560u,3758096416u,1677876020u,138442752u,393216u}/* 10B6C */, /*18271*/{0,1592u,5898241u,76907525u,1515560u,3758096416u,1677876028u,138442752u,393216u}/* 10B6D */, /*18272*/{0,1592u,5898241u,76907525u,1515560u,3758096416u,1677876036u,138442752u,393216u}/* 10B6E */, /*18273*/{0,1592u,5898241u,76907525u,1515560u,3758096416u,1677876044u,138442752u,393216u}/* 10B6F */, /*18274*/{0,1592u,5898241u,76907525u,1515560u,3758096416u,1677876052u,138442752u,393216u}/* 10B70 */, /*18275*/{0,1592u,5898241u,76907525u,1515560u,3758096416u,1677876060u,138442752u,393216u}/* 10B71 */, /*18276*/{0,1592u,5898241u,76907525u,1515560u,3758096416u,1677876068u,138442752u,393216u}/* 10B72 */, /*18277*/{0,1592u,542770689u,76907531u,8388650u,1610612768u,58669u,138442752u,0}/* 10B78 */, /*18278*/{0,1592u,576326145u,76907531u,8388650u,1610612768u,58677u,138442752u,0}/* 10B79 */, /*18279*/{0,1592u,609880065u,76907531u,8388650u,1610612768u,58685u,138442752u,0}/* 10B7A */, /*18280*/{0,1592u,643436545u,76907531u,8388650u,1610612768u,58693u,138442752u,0}/* 10B7B */, /*18281*/{0,1592u,827990017u,76907531u,8388650u,1610612768u,56957u,138442752u,0}/* 10B7C */, /*18282*/{0,1592u,995765249u,76907531u,8388650u,1610612768u,56965u,138442752u,0}/* 10B7D */, /*18283*/{0,1592u,1582985729u,76907531u,8388650u,1610612768u,56973u,138442752u,0}/* 10B7E */, /*18284*/{0,1592u,1733985281u,76907531u,8388650u,1610612768u,56981u,138442752u,0}/* 10B7F */, /*18285*/{0u,1600u,7929857u,77071365u,1515688u,3758096416u,1677876076u,138442752u,393216u}/* 10B80 */, /*18286*/{0u,1600u,7929857u,77071365u,1515816u,3758096416u,1677876084u,138442752u,393216u}/* 10B81 */, /*18287*/{0u,1600u,7929857u,77071365u,1515688u,3758096416u,1677876092u,138442752u,393216u}/* 10B82 */, /*18288*/{0u,1600u,7929857u,77071365u,1515816u,3758096416u,1677876100u,138442752u,393216u}/* 10B83 */, /*18289*/{0u,1600u,7929857u,77071365u,1515816u,3758096416u,1677876108u,138442752u,393216u}/* 10B84 */, /*18290*/{0u,1600u,7929857u,77071365u,1515816u,3758096416u,1677876116u,138442752u,393216u}/* 10B85 */, /*18291*/{0u,1600u,7929857u,77071365u,1515688u,3758096416u,1677876124u,138442752u,393216u}/* 10B86 */, /*18292*/{0u,1600u,7929857u,77071365u,1515688u,3758096416u,1677876132u,138442752u,393216u}/* 10B87 */, /*18293*/{0u,1600u,7929857u,77071365u,1515688u,3758096416u,1677876140u,138442752u,393216u}/* 10B88 */, /*18294*/{0u,1600u,7929857u,77071365u,1515816u,3758096416u,1677876148u,138442752u,393216u}/* 10B89 */, /*18295*/{0u,1600u,7929857u,77071365u,1515688u,3758096416u,1677876156u,138442752u,393216u}/* 10B8A */, /*18296*/{0u,1600u,7929857u,77071365u,1515688u,3758096416u,1677876164u,138442752u,393216u}/* 10B8B */, /*18297*/{0u,1600u,7929857u,77071365u,1515816u,3758096416u,1677876172u,138442752u,393216u}/* 10B8C */, /*18298*/{0u,1600u,7929857u,77071365u,1515688u,3758096416u,1677876180u,138442752u,393216u}/* 10B8D */, /*18299*/{0u,1600u,7929857u,77071365u,1515816u,3758096416u,1677876188u,138442752u,393216u}/* 10B8E */, /*18300*/{0u,1600u,7929857u,77071365u,1515816u,3758096416u,1677876196u,138442752u,393216u}/* 10B8F */, /*18301*/{0u,1600u,7929857u,77071365u,1515688u,3758096416u,1677876204u,138442752u,393216u}/* 10B90 */, /*18302*/{0u,1600u,7929857u,77071365u,1515816u,3758096416u,1677876212u,138442752u,393216u}/* 10B91 */, /*18303*/{0,1600u,7929857u,77071383u,40u,1610612768u,8972u,138442754u,8388608u}/* 10B99 */, /*18304*/{0,1600u,7929857u,77071383u,40u,1610612768u,8980u,138442754u,8388608u}/* 10B9A */, /*18305*/{0,1600u,7929857u,77071383u,40u,1610612768u,8988u,138442754u,8388608u}/* 10B9B */, /*18306*/{0,1600u,7929857u,77071383u,40u,1610612768u,8996u,138442754u,8388608u}/* 10B9C */, /*18307*/{0u,1600u,544802305u,77071371u,8388906u,1610612768u,58669u,138442752u,0}/* 10BA9 */, /*18308*/{0u,1600u,578357761u,77071371u,8388906u,1610612768u,58677u,138442752u,0}/* 10BAA */, /*18309*/{0u,1600u,611911681u,77071371u,8388906u,1610612768u,58685u,138442752u,0}/* 10BAB */, /*18310*/{0u,1600u,645468161u,77071371u,8388906u,1610612768u,58693u,138442752u,0}/* 10BAC */, /*18311*/{0u,1600u,830021633u,77071371u,8388778u,1610612768u,56989u,138442752u,0}/* 10BAD */, /*18312*/{0u,1600u,997796865u,77071371u,8388778u,1610612768u,56997u,138442752u,0}/* 10BAE */, /*18313*/{0u,1600u,1585017345u,77071371u,8388650u,1610612768u,57005u,138442752u,0}/* 10BAF */, /*18314*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836844u,138442752u,393216u}/* 10C00 */, /*18315*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836844u,1283536896u,393216u}/* 10C01 */, /*18316*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836852u,138442752u,393216u}/* 10C02 */, /*18317*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836860u,138442752u,393216u}/* 10C03 */, /*18318*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836860u,1283536896u,393216u}/* 10C04 */, /*18319*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836868u,138442752u,393216u}/* 10C05 */, /*18320*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836876u,138442752u,393216u}/* 10C06 */, /*18321*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836884u,138442752u,393216u}/* 10C07 */, /*18322*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836884u,1283536896u,393216u}/* 10C08 */, /*18323*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836892u,138442752u,393216u}/* 10C09 */, /*18324*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836892u,1283536896u,393216u}/* 10C0A */, /*18325*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836900u,138442752u,393216u}/* 10C0B */, /*18326*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836900u,1283536896u,393216u}/* 10C0C */, /*18327*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836908u,138442752u,393216u}/* 10C0D */, /*18328*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836908u,1283536896u,393216u}/* 10C0E */, /*18329*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836916u,138442752u,393216u}/* 10C0F */, /*18330*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836916u,1283536896u,393216u}/* 10C10 */, /*18331*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836924u,138442752u,393216u}/* 10C11 */, /*18332*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836924u,1283536896u,393216u}/* 10C12 */, /*18333*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836932u,138442752u,393216u}/* 10C13 */, /*18334*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836940u,138442752u,393216u}/* 10C14 */, /*18335*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836940u,1283536896u,393216u}/* 10C15 */, /*18336*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836948u,138442752u,393216u}/* 10C16 */, /*18337*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836948u,1283536896u,393216u}/* 10C17 */, /*18338*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836956u,138442752u,393216u}/* 10C18 */, /*18339*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836956u,1283536896u,393216u}/* 10C19 */, /*18340*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836964u,138442752u,393216u}/* 10C1A */, /*18341*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836964u,1283536896u,393216u}/* 10C1B */, /*18342*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836972u,138442752u,393216u}/* 10C1C */, /*18343*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836972u,1283536896u,393216u}/* 10C1D */, /*18344*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836980u,138442752u,393216u}/* 10C1E */, /*18345*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836980u,1283536896u,393216u}/* 10C1F */, /*18346*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836988u,138442752u,393216u}/* 10C20 */, /*18347*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677836996u,138442752u,393216u}/* 10C21 */, /*18348*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837004u,138442752u,393216u}/* 10C22 */, /*18349*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837012u,138442752u,393216u}/* 10C23 */, /*18350*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837020u,138442752u,393216u}/* 10C24 */, /*18351*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837020u,1283536896u,393216u}/* 10C25 */, /*18352*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837028u,138442752u,393216u}/* 10C26 */, /*18353*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837028u,1283536896u,393216u}/* 10C27 */, /*18354*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837036u,138442752u,393216u}/* 10C28 */, /*18355*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837036u,1283536896u,393216u}/* 10C29 */, /*18356*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837044u,138442752u,393216u}/* 10C2A */, /*18357*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837044u,1283536896u,393216u}/* 10C2B */, /*18358*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837052u,138442752u,393216u}/* 10C2C */, /*18359*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837060u,138442752u,393216u}/* 10C2D */, /*18360*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837060u,1283536896u,393216u}/* 10C2E */, /*18361*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837068u,138442752u,393216u}/* 10C2F */, /*18362*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837076u,138442752u,393216u}/* 10C30 */, /*18363*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837084u,138442752u,393216u}/* 10C31 */, /*18364*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837092u,138442752u,393216u}/* 10C32 */, /*18365*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837092u,1283536896u,393216u}/* 10C33 */, /*18366*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837100u,138442752u,393216u}/* 10C34 */, /*18367*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837100u,1283536896u,393216u}/* 10C35 */, /*18368*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837108u,138442752u,393216u}/* 10C36 */, /*18369*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837108u,1283536896u,393216u}/* 10C37 */, /*18370*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837116u,138442752u,393216u}/* 10C38 */, /*18371*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837116u,1283536896u,393216u}/* 10C39 */, /*18372*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837124u,138442752u,393216u}/* 10C3A */, /*18373*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837124u,1283536896u,393216u}/* 10C3B */, /*18374*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837132u,138442752u,393216u}/* 10C3C */, /*18375*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837140u,138442752u,393216u}/* 10C3D */, /*18376*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837148u,138442752u,393216u}/* 10C3E */, /*18377*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837156u,138442752u,393216u}/* 10C3F */, /*18378*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837156u,1283536896u,393216u}/* 10C40 */, /*18379*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837164u,138442752u,393216u}/* 10C41 */, /*18380*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837164u,1283536896u,393216u}/* 10C42 */, /*18381*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837172u,138442752u,393216u}/* 10C43 */, /*18382*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837172u,1283536896u,393216u}/* 10C44 */, /*18383*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837180u,138442752u,393216u}/* 10C45 */, /*18384*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837180u,1283536896u,393216u}/* 10C46 */, /*18385*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837188u,138442752u,393216u}/* 10C47 */, /*18386*/{0,1608u,5963777u,76907525u,1515560u,3758096416u,1677837196u,138442752u,393216u}/* 10C48 */, /*18387*/{305664u,2476738128u,8519681u,77104129u,1507368u,3807903776u,1711390948u,138491904u,2490368u}/* 10C80 */, /*18388*/{305792u,2478835280u,8519681u,77104129u,1507368u,3807903776u,1711390948u,1283586048u,2490368u}/* 10C81 */, /*18389*/{305920u,2480932432u,8519681u,77104129u,1507368u,3807903776u,1711390956u,138491904u,2490368u}/* 10C82 */, /*18390*/{306048u,2483029584u,8519681u,77104129u,1507368u,3807903776u,1711390964u,138491904u,2490368u}/* 10C83 */, /*18391*/{306176u,2485126736u,8519681u,77104129u,1507368u,3807903776u,1711390972u,138491904u,2490368u}/* 10C84 */, /*18392*/{306304u,2487223888u,8519681u,77104129u,1507368u,3807903776u,1711390980u,138491904u,2490368u}/* 10C85 */, /*18393*/{306432u,2489321040u,8519681u,77104129u,1507368u,3807903776u,1711390988u,138491904u,2490368u}/* 10C86 */, /*18394*/{306560u,2491418192u,8519681u,77104129u,1507368u,3807903776u,1711390996u,138491904u,2490368u}/* 10C87 */, /*18395*/{306688u,2493515344u,8519681u,77104129u,1507368u,3807903776u,1711391004u,138491904u,2490368u}/* 10C88 */, /*18396*/{306816u,2495612496u,8519681u,77104129u,1507368u,3807903776u,1711391012u,138491904u,2490368u}/* 10C89 */, /*18397*/{306944u,2497709648u,8519681u,77104129u,1507368u,3807903776u,1711391012u,1283586048u,2490368u}/* 10C8A */, /*18398*/{307072u,2499806800u,8519681u,77104129u,1507368u,3807903776u,1711391012u,1287780352u,2490368u}/* 10C8B */, /*18399*/{307200u,2501903952u,8519681u,77104129u,1507368u,3807903776u,1711391020u,138491904u,2490368u}/* 10C8C */, /*18400*/{307328u,2504001104u,8519681u,77104129u,1507368u,3807903776u,1711391028u,138491904u,2490368u}/* 10C8D */, /*18401*/{307456u,2506098256u,8519681u,77104129u,1507368u,3807903776u,1711391036u,138491904u,2490368u}/* 10C8E */, /*18402*/{307584u,2508195408u,8519681u,77104129u,1507368u,3807903776u,1711391044u,138491904u,2490368u}/* 10C8F */, /*18403*/{307712u,2510292560u,8519681u,77104129u,1507368u,3807903776u,1711391052u,138491904u,2490368u}/* 10C90 */, /*18404*/{307840u,2512389712u,8519681u,77104129u,1507368u,3807903776u,1711391052u,1283586048u,2490368u}/* 10C91 */, /*18405*/{307968u,2514486864u,8519681u,77104129u,1507368u,3807903776u,1711391060u,138491904u,2490368u}/* 10C92 */, /*18406*/{308096u,2516584016u,8519681u,77104129u,1507368u,3807903776u,1711391068u,138491904u,2490368u}/* 10C93 */, /*18407*/{308224u,2518681168u,8519681u,77104129u,1507368u,3807903776u,1711391076u,138491904u,2490368u}/* 10C94 */, /*18408*/{308352u,2520778320u,8519681u,77104129u,1507368u,3807903776u,1711391084u,138491904u,2490368u}/* 10C95 */, /*18409*/{308480u,2522875472u,8519681u,77104129u,1507368u,3807903776u,1711391092u,138491904u,2490368u}/* 10C96 */, /*18410*/{308608u,2524972624u,8519681u,77104129u,1507368u,3807903776u,1711391100u,138491904u,2490368u}/* 10C97 */, /*18411*/{308736u,2527069776u,8519681u,77104129u,1507368u,3807903776u,1711391108u,138491904u,2490368u}/* 10C98 */, /*18412*/{308864u,2529166928u,8519681u,77104129u,1507368u,3807903776u,1711391116u,138491904u,2490368u}/* 10C99 */, /*18413*/{308992u,2531264080u,8519681u,77104129u,1507368u,3807903776u,1711391124u,138491904u,2490368u}/* 10C9A */, /*18414*/{309120u,2533361232u,8519681u,77104129u,1507368u,3807903776u,1711391132u,138491904u,2490368u}/* 10C9B */, /*18415*/{309248u,2535458384u,8519681u,77104129u,1507368u,3807903776u,1711391132u,1283586048u,2490368u}/* 10C9C */, /*18416*/{309376u,2537555536u,8519681u,77104129u,1507368u,3807903776u,1711391140u,138491904u,2490368u}/* 10C9D */, /*18417*/{309504u,2539652688u,8519681u,77104129u,1507368u,3807903776u,1711391140u,1283586048u,2490368u}/* 10C9E */, /*18418*/{309632u,2541749840u,8519681u,77104129u,1507368u,3807903776u,1711391140u,1287780352u,2490368u}/* 10C9F */, /*18419*/{309760u,2543846992u,8519681u,77104129u,1507368u,3807903776u,1711391148u,138491904u,2490368u}/* 10CA0 */, /*18420*/{309888u,2545944144u,8519681u,77104129u,1507368u,3807903776u,1711391156u,138491904u,2490368u}/* 10CA1 */, /*18421*/{310016u,2548041296u,8519681u,77104129u,1507368u,3807903776u,1711391164u,138491904u,2490368u}/* 10CA2 */, /*18422*/{310144u,2550138448u,8519681u,77104129u,1507368u,3807903776u,1711391164u,1283586048u,2490368u}/* 10CA3 */, /*18423*/{310272u,2552235600u,8519681u,77104129u,1507368u,3807903776u,1711391172u,138491904u,2490368u}/* 10CA4 */, /*18424*/{310400u,2554332752u,8519681u,77104129u,1507368u,3807903776u,1711391180u,138491904u,2490368u}/* 10CA5 */, /*18425*/{310528u,2556429904u,8519681u,77104129u,1507368u,3807903776u,1711391188u,138491904u,2490368u}/* 10CA6 */, /*18426*/{310656u,2558527056u,8519681u,77104129u,1507368u,3807903776u,1711391196u,138491904u,2490368u}/* 10CA7 */, /*18427*/{310784u,2560624208u,8519681u,77104129u,1507368u,3807903776u,1711391204u,138491904u,2490368u}/* 10CA8 */, /*18428*/{310912u,2562721360u,8519681u,77104129u,1507368u,3807903776u,1711391212u,138491904u,2490368u}/* 10CA9 */, /*18429*/{311040u,2564818512u,8519681u,77104129u,1507368u,3807903776u,1711391220u,138491904u,2490368u}/* 10CAA */, /*18430*/{311168u,2566915664u,8519681u,77104129u,1507368u,3807903776u,1711391220u,1283586048u,2490368u}/* 10CAB */, /*18431*/{311296u,2569012816u,8519681u,77104129u,1507368u,3807903776u,1711391228u,138491904u,2490368u}/* 10CAC */, /*18432*/{311424u,2571109968u,8519681u,77104129u,1507368u,3807903776u,1711391228u,1283586048u,2490368u}/* 10CAD */, /*18433*/{311552u,2573207120u,8519681u,77104129u,1507368u,3807903776u,1711391236u,138491904u,2490368u}/* 10CAE */, /*18434*/{311680u,2575304272u,8519681u,77104129u,1507368u,3807903776u,1711391244u,138491904u,2490368u}/* 10CAF */, /*18435*/{311808u,2577401424u,8519681u,77104129u,1507368u,3807903776u,1711391252u,138491904u,2490368u}/* 10CB0 */, /*18436*/{311936u,2579498576u,8519681u,77104129u,1507368u,3807903776u,1711391260u,138491904u,2490368u}/* 10CB1 */, /*18437*/{312064u,2581595728u,8519681u,77104129u,1507368u,3807903776u,1711391268u,138491904u,2490368u}/* 10CB2 */, /*18438*/{312192u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779556u,138442752u,393216u}/* 10CC0 */, /*18439*/{312320u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779556u,1283536896u,393216u}/* 10CC1 */, /*18440*/{312448u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779564u,138442752u,393216u}/* 10CC2 */, /*18441*/{312576u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779572u,138442752u,393216u}/* 10CC3 */, /*18442*/{312704u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779580u,138442752u,393216u}/* 10CC4 */, /*18443*/{312832u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779588u,138442752u,393216u}/* 10CC5 */, /*18444*/{312960u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779596u,138442752u,393216u}/* 10CC6 */, /*18445*/{313088u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779604u,138442752u,393216u}/* 10CC7 */, /*18446*/{313216u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779612u,138442752u,393216u}/* 10CC8 */, /*18447*/{313344u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779620u,138442752u,393216u}/* 10CC9 */, /*18448*/{313472u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779620u,1283536896u,393216u}/* 10CCA */, /*18449*/{313600u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779620u,1287731200u,393216u}/* 10CCB */, /*18450*/{313728u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779628u,138442752u,393216u}/* 10CCC */, /*18451*/{313856u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779636u,138442752u,393216u}/* 10CCD */, /*18452*/{313984u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779644u,138442752u,393216u}/* 10CCE */, /*18453*/{314112u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779652u,138442752u,393216u}/* 10CCF */, /*18454*/{314240u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779660u,138442752u,393216u}/* 10CD0 */, /*18455*/{314368u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779660u,1283536896u,393216u}/* 10CD1 */, /*18456*/{314496u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779668u,138442752u,393216u}/* 10CD2 */, /*18457*/{314624u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779676u,138442752u,393216u}/* 10CD3 */, /*18458*/{314752u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779684u,138442752u,393216u}/* 10CD4 */, /*18459*/{314880u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779692u,138442752u,393216u}/* 10CD5 */, /*18460*/{315008u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779700u,138442752u,393216u}/* 10CD6 */, /*18461*/{315136u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779708u,138442752u,393216u}/* 10CD7 */, /*18462*/{315264u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779716u,138442752u,393216u}/* 10CD8 */, /*18463*/{315392u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779724u,138442752u,393216u}/* 10CD9 */, /*18464*/{315520u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779732u,138442752u,393216u}/* 10CDA */, /*18465*/{315648u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779740u,138442752u,393216u}/* 10CDB */, /*18466*/{315776u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779740u,1283536896u,393216u}/* 10CDC */, /*18467*/{315904u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779748u,138442752u,393216u}/* 10CDD */, /*18468*/{316032u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779748u,1283536896u,393216u}/* 10CDE */, /*18469*/{316160u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779748u,1287731200u,393216u}/* 10CDF */, /*18470*/{316288u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779756u,138442752u,393216u}/* 10CE0 */, /*18471*/{316416u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779764u,138442752u,393216u}/* 10CE1 */, /*18472*/{316544u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779772u,138442752u,393216u}/* 10CE2 */, /*18473*/{316672u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779772u,1283536896u,393216u}/* 10CE3 */, /*18474*/{316800u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779780u,138442752u,393216u}/* 10CE4 */, /*18475*/{316928u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779788u,138442752u,393216u}/* 10CE5 */, /*18476*/{317056u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779796u,138442752u,393216u}/* 10CE6 */, /*18477*/{317184u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779804u,138442752u,393216u}/* 10CE7 */, /*18478*/{317312u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779812u,138442752u,393216u}/* 10CE8 */, /*18479*/{317440u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779820u,138442752u,393216u}/* 10CE9 */, /*18480*/{317568u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779828u,138442752u,393216u}/* 10CEA */, /*18481*/{317696u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779828u,1283536896u,393216u}/* 10CEB */, /*18482*/{317824u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779836u,138442752u,393216u}/* 10CEC */, /*18483*/{317952u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779836u,1283536896u,393216u}/* 10CED */, /*18484*/{318080u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779844u,138442752u,393216u}/* 10CEE */, /*18485*/{318208u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779852u,138442752u,393216u}/* 10CEF */, /*18486*/{318336u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779860u,138442752u,393216u}/* 10CF0 */, /*18487*/{318464u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779868u,138442752u,393216u}/* 10CF1 */, /*18488*/{318592u,1616u,8519681u,77104130u,1499176u,3768975392u,1719779876u,138442752u,393216u}/* 10CF2 */, /*18489*/{0,1616u,545392129u,77104139u,8388650u,1610612768u,58669u,138442752u,0}/* 10CFA */, /*18490*/{0,1616u,679611393u,77104139u,8388650u,1610612768u,58701u,138442752u,0}/* 10CFB */, /*18491*/{0,1616u,830611457u,77104139u,8388650u,1610612768u,55893u,138442752u,0}/* 10CFC */, /*18492*/{0,1616u,1501718529u,77104139u,8388650u,1610612768u,55901u,138442752u,0}/* 10CFD */, /*18493*/{0,1616u,1585607169u,77104139u,8388650u,1610612768u,55909u,138442752u,0}/* 10CFE */, /*18494*/{0,1616u,1736606721u,77104139u,8388650u,1610612768u,55917u,138442752u,0}/* 10CFF */, /*18495*/{0,1624u,537331201u,76911627u,8388652u,1610612768u,58669u,138442752u,0}/* 10E60 */, /*18496*/{0,1624u,570886657u,76911627u,8388652u,1610612768u,58677u,138442752u,0}/* 10E61 */, /*18497*/{0,1624u,604440577u,76911627u,8388652u,1610612768u,58685u,138442752u,0}/* 10E62 */, /*18498*/{0,1624u,637997057u,76911627u,8388652u,1610612768u,58693u,138442752u,0}/* 10E63 */, /*18499*/{0,1624u,671550465u,76911627u,8388652u,1610612768u,58701u,138442752u,0}/* 10E64 */, /*18500*/{0,1624u,705107457u,76911627u,8388652u,1610612768u,58709u,138442752u,0}/* 10E65 */, /*18501*/{0,1624u,738659841u,76911627u,8388652u,1610612768u,58717u,138442752u,0}/* 10E66 */, /*18502*/{0,1624u,772217857u,76911627u,8388652u,1610612768u,58725u,138442752u,0}/* 10E67 */, /*18503*/{0,1624u,805770241u,76911627u,8388652u,1610612768u,58733u,138442752u,0}/* 10E68 */, /*18504*/{0,1624u,822550529u,76911627u,8388650u,1610612768u,55693u,138442752u,0}/* 10E69 */, /*18505*/{0,1624u,990325761u,76911627u,8388650u,1610612768u,55701u,138442752u,0}/* 10E6A */, /*18506*/{0,1624u,1158103041u,76911627u,8388650u,1610612768u,55709u,138442752u,0}/* 10E6B */, /*18507*/{0,1624u,1325880321u,76911627u,8388650u,1610612768u,55717u,138442752u,0}/* 10E6C */, /*18508*/{0,1624u,1493657601u,76911627u,8388650u,1610612768u,55725u,138442752u,0}/* 10E6D */, /*18509*/{0,1624u,1510435329u,76911627u,8388650u,1610612768u,55733u,138442752u,0}/* 10E6E */, /*18510*/{0,1624u,1527213057u,76911627u,8388650u,1610612768u,55741u,138442752u,0}/* 10E6F */, /*18511*/{0,1624u,1543990785u,76911627u,8388650u,1610612768u,55749u,138442752u,0}/* 10E70 */, /*18512*/{0,1624u,1560768513u,76911627u,8388650u,1610612768u,55757u,138442752u,0}/* 10E71 */, /*18513*/{0,1624u,1577546241u,76911627u,8388650u,1610612768u,55765u,138442752u,0}/* 10E72 */, /*18514*/{0,1624u,1594323969u,76911627u,8388650u,1610612768u,55773u,138442752u,0}/* 10E73 */, /*18515*/{0,1624u,1611101697u,76911627u,8388650u,1610612768u,55781u,138442752u,0}/* 10E74 */, /*18516*/{0,1624u,1627879425u,76911627u,8388650u,1610612768u,55789u,138442752u,0}/* 10E75 */, /*18517*/{0,1624u,1644657153u,76911627u,8388650u,1610612768u,55797u,138442752u,0}/* 10E76 */, /*18518*/{0,1624u,1661434881u,76911627u,8388650u,1610612768u,55805u,138442752u,0}/* 10E77 */, /*18519*/{0,1624u,1678212609u,76911627u,8388650u,1610612768u,55813u,138442752u,0}/* 10E78 */, /*18520*/{0,1624u,1694990337u,76911627u,8388650u,1610612768u,55821u,138442752u,0}/* 10E79 */, /*18521*/{0,1624u,1711768065u,76911627u,8388650u,1610612768u,55829u,138442752u,0}/* 10E7A */, /*18522*/{0,1624u,369559041u,76911627u,4194346u,1610612768u,55837u,138442752u,0}/* 10E7B */, /*18523*/{0,1624u,285672961u,76911627u,62914602u,1610612768u,55845u,138442752u,0}/* 10E7C */, /*18524*/{0,1624u,302450177u,76911627u,67108906u,1610612768u,55853u,138442752u,0}/* 10E7D */, /*18525*/{0,1624u,436668929u,76911627u,67108906u,1610612768u,55861u,138442752u,0}/* 10E7E */, /*18526*/{0,1632u,6160385u,68550664u,940466184u,3758096416u,1077936140u,822114816u,262144u}/* 11000 */, /*18527*/{0,1632u,6160385u,68562950u,672030728u,3774873616u,1077936140u,826309120u,262144u}/* 11001 */, /*18528*/{0,1632u,6160385u,68550664u,940466184u,3758096416u,1077936140u,830503424u,262144u}/* 11002 */, /*18529*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677815084u,138442752u,393216u}/* 11003 */, /*18530*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677815092u,138442752u,393216u}/* 11004 */, /*18531*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814708u,138442752u,393216u}/* 11005 */, /*18532*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814716u,138442752u,393216u}/* 11006 */, /*18533*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814724u,138442752u,393216u}/* 11007 */, /*18534*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814732u,138442752u,393216u}/* 11008 */, /*18535*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814740u,138442752u,393216u}/* 11009 */, /*18536*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814748u,138442752u,393216u}/* 1100A */, /*18537*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814756u,138442752u,393216u}/* 1100B */, /*18538*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814764u,138442752u,393216u}/* 1100C */, /*18539*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814772u,138442752u,393216u}/* 1100D */, /*18540*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814780u,138442752u,393216u}/* 1100E */, /*18541*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814788u,138442752u,393216u}/* 1100F */, /*18542*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814796u,138442752u,393216u}/* 11010 */, /*18543*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814804u,138442752u,393216u}/* 11011 */, /*18544*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814812u,138442752u,393216u}/* 11012 */, /*18545*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814820u,138442752u,393216u}/* 11013 */, /*18546*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814828u,138442752u,393216u}/* 11014 */, /*18547*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814836u,138442752u,393216u}/* 11015 */, /*18548*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814844u,138442752u,393216u}/* 11016 */, /*18549*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814852u,138442752u,393216u}/* 11017 */, /*18550*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814860u,138442752u,393216u}/* 11018 */, /*18551*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814868u,138442752u,393216u}/* 11019 */, /*18552*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814876u,138442752u,393216u}/* 1101A */, /*18553*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814884u,138442752u,393216u}/* 1101B */, /*18554*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814892u,138442752u,393216u}/* 1101C */, /*18555*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814900u,138442752u,393216u}/* 1101D */, /*18556*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814908u,138442752u,393216u}/* 1101E */, /*18557*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814916u,138442752u,393216u}/* 1101F */, /*18558*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814924u,138442752u,393216u}/* 11020 */, /*18559*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814932u,138442752u,393216u}/* 11021 */, /*18560*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814940u,138442752u,393216u}/* 11022 */, /*18561*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814948u,138442752u,393216u}/* 11023 */, /*18562*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814956u,138442752u,393216u}/* 11024 */, /*18563*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814964u,138442752u,393216u}/* 11025 */, /*18564*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814972u,138442752u,393216u}/* 11026 */, /*18565*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814980u,138442752u,393216u}/* 11027 */, /*18566*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814988u,138442752u,393216u}/* 11028 */, /*18567*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677814996u,138442752u,393216u}/* 11029 */, /*18568*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677815004u,138442752u,393216u}/* 1102A */, /*18569*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677815012u,138442752u,393216u}/* 1102B */, /*18570*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677815020u,138442752u,393216u}/* 1102C */, /*18571*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677815028u,138442752u,393216u}/* 1102D */, /*18572*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677815036u,138442752u,393216u}/* 1102E */, /*18573*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677815044u,138442752u,393216u}/* 1102F */, /*18574*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677815052u,138442752u,393216u}/* 11030 */, /*18575*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677815060u,138442752u,393216u}/* 11031 */, /*18576*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677815068u,138442752u,393216u}/* 11032 */, /*18577*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677815076u,138442752u,393216u}/* 11033 */, /*18578*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677815100u,138442752u,393216u}/* 11034 */, /*18579*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677815108u,138442752u,393216u}/* 11035 */, /*18580*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677815116u,138442752u,393216u}/* 11036 */, /*18581*/{0,1632u,6160385u,76939269u,1515560u,3758096416u,1677815124u,138442752u,393216u}/* 11037 */, /*18582*/{0,1632u,6160385u,68562950u,672030728u,3774873616u,1078029660u,138443264u,262144u}/* 11038 */, /*18583*/{0,1632u,6160385u,68562950u,672030728u,3774873616u,1078029668u,138443264u,262144u}/* 11039 */, /*18584*/{0,1632u,6160385u,68562950u,672030728u,3774873616u,1078029676u,138443264u,262144u}/* 1103A */, /*18585*/{0,1632u,6160385u,68562950u,672030728u,3774873616u,1078029684u,138443264u,262144u}/* 1103B */, /*18586*/{0,1632u,6160385u,68562950u,672030728u,3774873616u,1078029692u,138443264u,262144u}/* 1103C */, /*18587*/{0,1632u,6160385u,68562950u,672030728u,3774873616u,1078029700u,138443264u,262144u}/* 1103D */, /*18588*/{0,1632u,6160385u,68562950u,672030728u,3774873616u,1078029708u,138443264u,262144u}/* 1103E */, /*18589*/{0,1632u,6160385u,68562950u,672030728u,3774873616u,1078029716u,138443264u,262144u}/* 1103F */, /*18590*/{0,1632u,6160385u,68562950u,672030728u,3774873616u,1078029724u,138443264u,262144u}/* 11040 */, /*18591*/{0,1632u,6160385u,68562950u,672030728u,3774873616u,1078029732u,138443264u,262144u}/* 11041 */, /*18592*/{0,1632u,6160385u,68562950u,672030728u,3774873616u,1078029740u,138443264u,262144u}/* 11042 */, /*18593*/{0,1632u,6160385u,68562950u,672030728u,3774873616u,1078029748u,138443264u,262144u}/* 11043 */, /*18594*/{0,1632u,6160385u,68562950u,672030728u,3774873616u,1078029756u,138443264u,262144u}/* 11044 */, /*18595*/{0,1632u,6160385u,68562950u,672030728u,3774873616u,1078029764u,138443264u,262144u}/* 11045 */, /*18596*/{0,1632u,6160385u,336998406u,672030728u,1627389976u,1078029772u,138442752u,262144u}/* 11046 */, /*18597*/{0,1632u,6160385u,69599255u,98344u,1610612768u,5492u,138442754u,41943040u}/* 11047 */, /*18598*/{0,1632u,6160385u,69599255u,98344u,1610612768u,5500u,138442754u,41943040u}/* 11048 */, /*18599*/{0,1632u,6160385u,76939287u,40u,1610612768u,8788u,138442754u,8388608u}/* 11049 */, /*18600*/{0,1632u,6160385u,76939287u,40u,1610612768u,8796u,138442754u,8388608u}/* 1104A */, /*18601*/{0,1632u,6160385u,76939287u,40u,1610612768u,8804u,138442754u,8388608u}/* 1104B */, /*18602*/{0,1632u,6160385u,76939287u,40u,1610612768u,8812u,138442754u,8388608u}/* 1104C */, /*18603*/{0,1632u,6160385u,76939287u,40u,1610612768u,8820u,138442754u,8388608u}/* 1104D */, /*18604*/{0,1632u,543032833u,76949515u,8388652u,1610612768u,58669u,138442752u,0}/* 11052 */, /*18605*/{0,1632u,576588289u,76949515u,8388652u,1610612768u,58677u,138442752u,0}/* 11053 */, /*18606*/{0,1632u,610142209u,76949515u,8388652u,1610612768u,58685u,138442752u,0}/* 11054 */, /*18607*/{0,1632u,643698689u,76949515u,8388652u,1610612768u,58693u,138442752u,0}/* 11055 */, /*18608*/{0,1632u,677252097u,76949515u,8388652u,1610612768u,58701u,138442752u,0}/* 11056 */, /*18609*/{0,1632u,710809089u,76949515u,8388652u,1610612768u,58709u,138442752u,0}/* 11057 */, /*18610*/{0,1632u,744361473u,76949515u,8388652u,1610612768u,58717u,138442752u,0}/* 11058 */, /*18611*/{0,1632u,777919489u,76949515u,8388652u,1610612768u,58725u,138442752u,0}/* 11059 */, /*18612*/{0,1632u,811471873u,76949515u,8388652u,1610612768u,58733u,138442752u,0}/* 1105A */, /*18613*/{0,1632u,828252161u,76949515u,8388650u,1610612768u,57029u,138442752u,0}/* 1105B */, /*18614*/{0,1632u,996027393u,76949515u,8388650u,1610612768u,57037u,138442752u,0}/* 1105C */, /*18615*/{0,1632u,1163804673u,76949515u,8388650u,1610612768u,57045u,138442752u,0}/* 1105D */, /*18616*/{0,1632u,1331581953u,76949515u,8388650u,1610612768u,57053u,138442752u,0}/* 1105E */, /*18617*/{0,1632u,1499359233u,76949515u,8388650u,1610612768u,57061u,138442752u,0}/* 1105F */, /*18618*/{0,1632u,1516136961u,76949515u,8388650u,1610612768u,57069u,138442752u,0}/* 11060 */, /*18619*/{0,1632u,1532914689u,76949515u,8388650u,1610612768u,57077u,138442752u,0}/* 11061 */, /*18620*/{0,1632u,1549692417u,76949515u,8388650u,1610612768u,57085u,138442752u,0}/* 11062 */, /*18621*/{0,1632u,1566470145u,76949515u,8388650u,1610612768u,57093u,138442752u,0}/* 11063 */, /*18622*/{0,1632u,1583247873u,76949515u,8388650u,1610612768u,57101u,138442752u,0}/* 11064 */, /*18623*/{0,1632u,1734247425u,76949515u,8388650u,1610612768u,57109u,138442752u,0}/* 11065 */, /*18624*/{0,1632u,39715841u,85327881u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 11066 */, /*18625*/{0,1632u,543032833u,85327881u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 11067 */, /*18626*/{0,1632u,576588289u,85327881u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 11068 */, /*18627*/{0,1632u,610142209u,85327881u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 11069 */, /*18628*/{0,1632u,643698689u,85327881u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 1106A */, /*18629*/{0,1632u,677252097u,85327881u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 1106B */, /*18630*/{0,1632u,710809089u,85327881u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 1106C */, /*18631*/{0,1632u,744361473u,85327881u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 1106D */, /*18632*/{0,1632u,777919489u,85327881u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 1106E */, /*18633*/{0,1632u,811471873u,85327881u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 1106F */, /*18634*/{0,1632u,6160385u,337129478u,672030728u,1627389976u,1078029780u,138442752u,262144u}/* 1107F */, /*18635*/{0,1640u,6029313u,68530182u,672030728u,1627389968u,1077936140u,822114304u,262144u}/* 11080 */, /*18636*/{0,1640u,6029313u,68530182u,672030728u,1627389968u,1077936140u,826308608u,262144u}/* 11081 */, /*18637*/{0,1640u,6029313u,68517896u,940466184u,3758096416u,1077936140u,830503424u,262144u}/* 11082 */, /*18638*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808076u,138442752u,393216u}/* 11083 */, /*18639*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808084u,138442752u,393216u}/* 11084 */, /*18640*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808092u,138442752u,393216u}/* 11085 */, /*18641*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808100u,138442752u,393216u}/* 11086 */, /*18642*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808108u,138442752u,393216u}/* 11087 */, /*18643*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808116u,138442752u,393216u}/* 11088 */, /*18644*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808124u,138442752u,393216u}/* 11089 */, /*18645*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808132u,138442752u,393216u}/* 1108A */, /*18646*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808140u,138442752u,393216u}/* 1108B */, /*18647*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808148u,138442752u,393216u}/* 1108C */, /*18648*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808156u,138442752u,393216u}/* 1108D */, /*18649*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808164u,138442752u,393216u}/* 1108E */, /*18650*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808172u,138442752u,393216u}/* 1108F */, /*18651*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808180u,138442752u,393216u}/* 11090 */, /*18652*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808188u,138442752u,393216u}/* 11091 */, /*18653*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808196u,138442752u,393216u}/* 11092 */, /*18654*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808204u,138442752u,393216u}/* 11093 */, /*18655*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808212u,138442752u,393216u}/* 11094 */, /*18656*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808220u,138442752u,393216u}/* 11095 */, /*18657*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808228u,138442752u,393216u}/* 11096 */, /*18658*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808236u,138442752u,393216u}/* 11097 */, /*18659*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808244u,138442752u,393216u}/* 11098 */, /*18660*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808252u,138442752u,393216u}/* 11099 */, /*18661*/{2036334592u,1640u,6029313u,76906533u,1515560u,3758096416u,1677808252u,952147968u,393216u}/* 1109A */, /*18662*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808260u,138442752u,393216u}/* 1109B */, /*18663*/{2036858880u,1640u,6029313u,76906533u,1515560u,3758096416u,1677808260u,952147968u,393216u}/* 1109C */, /*18664*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808268u,138442752u,393216u}/* 1109D */, /*18665*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808276u,138442752u,393216u}/* 1109E */, /*18666*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808284u,138442752u,393216u}/* 1109F */, /*18667*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808292u,138442752u,393216u}/* 110A0 */, /*18668*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808300u,138442752u,393216u}/* 110A1 */, /*18669*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808308u,138442752u,393216u}/* 110A2 */, /*18670*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808316u,138442752u,393216u}/* 110A3 */, /*18671*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808324u,138442752u,393216u}/* 110A4 */, /*18672*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808332u,138442752u,393216u}/* 110A5 */, /*18673*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808340u,138442752u,393216u}/* 110A6 */, /*18674*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808348u,138442752u,393216u}/* 110A7 */, /*18675*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808356u,138442752u,393216u}/* 110A8 */, /*18676*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808364u,138442752u,393216u}/* 110A9 */, /*18677*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808372u,138442752u,393216u}/* 110AA */, /*18678*/{2037383168u,1640u,6029313u,76906533u,1515560u,3758096416u,1677808332u,952147968u,393216u}/* 110AB */, /*18679*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808380u,138442752u,393216u}/* 110AC */, /*18680*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808388u,138442752u,393216u}/* 110AD */, /*18681*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808396u,138442752u,393216u}/* 110AE */, /*18682*/{0,1640u,6029313u,76906501u,1515560u,3758096416u,1677808404u,138442752u,393216u}/* 110AF */, /*18683*/{0,1640u,6029313u,68517896u,940466184u,3758096416u,1078022940u,138443264u,262144u}/* 110B0 */, /*18684*/{0,1640u,6029313u,68517896u,940466184u,3758096416u,1078022948u,138443264u,262144u}/* 110B1 */, /*18685*/{0,1640u,6029313u,68517896u,940466184u,3758096416u,1078022956u,138443264u,262144u}/* 110B2 */, /*18686*/{0,1640u,6029313u,68530182u,672030728u,3774873616u,1078022964u,138443264u,262144u}/* 110B3 */, /*18687*/{0,1640u,6029313u,68530182u,672030728u,3774873616u,1078022972u,138443264u,262144u}/* 110B4 */, /*18688*/{0,1640u,6029313u,68530182u,672030728u,3774873616u,1078022980u,138443264u,262144u}/* 110B5 */, /*18689*/{0,1640u,6029313u,68530182u,672030728u,3774873616u,1078022988u,138443264u,262144u}/* 110B6 */, /*18690*/{0,1640u,6029313u,68517896u,940466184u,3758096416u,1078022996u,138443264u,262144u}/* 110B7 */, /*18691*/{0,1640u,6029313u,68517896u,940466184u,3758096416u,1078023004u,138443264u,262144u}/* 110B8 */, /*18692*/{0,1640u,6029313u,336965638u,672030728u,1627398168u,1078023012u,138442752u,262144u}/* 110B9 */, /*18693*/{0,1640u,6029314u,202747910u,672030736u,1627398160u,1077936140u,817920000u,262144u}/* 110BA */, /*18694*/{0,1640u,6029313u,76906519u,40u,1610612768u,9004u,138442754u,0}/* 110BB */, /*18695*/{0,1640u,6029313u,76906519u,40u,1610612768u,9012u,138442754u,0}/* 110BC */, /*18696*/{0,1640u,6029313u,76906512u,135438344u,1694498816u,12u,4208640u,1073741824u}/* 110BD */, /*18697*/{0,1640u,6029313u,69566487u,98344u,1610612768u,5908u,138442754u,41943040u}/* 110BE */, /*18698*/{0,1640u,6029313u,69566487u,98344u,1610612768u,5916u,138442754u,41943040u}/* 110BF */, /*18699*/{0,1640u,6029313u,69566487u,98344u,1610612768u,5508u,138442754u,41943040u}/* 110C0 */, /*18700*/{0,1640u,6029313u,69566487u,98344u,1610612768u,5516u,138442754u,41943040u}/* 110C1 */, /*18701*/{0,1648u,6619137u,76972037u,1515560u,3758096416u,1677868860u,138442752u,393216u}/* 110D0 */, /*18702*/{0,1648u,6619137u,76972037u,1515560u,3758096416u,1677868868u,138442752u,393216u}/* 110D1 */, /*18703*/{0,1648u,6619137u,76972037u,1515560u,3758096416u,1677868876u,138442752u,393216u}/* 110D2 */, /*18704*/{0,1648u,6619137u,76972037u,1515560u,3758096416u,1677868884u,138442752u,393216u}/* 110D3 */, /*18705*/{0,1648u,6619137u,76972037u,1515560u,3758096416u,1677868892u,138442752u,393216u}/* 110D4 */, /*18706*/{0,1648u,6619137u,76972037u,1515560u,3758096416u,1677868900u,138442752u,393216u}/* 110D5 */, /*18707*/{0,1648u,6619137u,76972037u,1515560u,3758096416u,1677868908u,138442752u,393216u}/* 110D6 */, /*18708*/{0,1648u,6619137u,76972037u,1515560u,3758096416u,1677868916u,138442752u,393216u}/* 110D7 */, /*18709*/{0,1648u,6619137u,76972037u,1515560u,3758096416u,1677868924u,138442752u,393216u}/* 110D8 */, /*18710*/{0,1648u,6619137u,76972037u,1515560u,3758096416u,1677868932u,138442752u,393216u}/* 110D9 */, /*18711*/{0,1648u,6619137u,76972037u,1515560u,3758096416u,1677868940u,138442752u,393216u}/* 110DA */, /*18712*/{0,1648u,6619137u,76972037u,1515560u,3758096416u,1677868948u,138442752u,393216u}/* 110DB */, /*18713*/{0,1648u,6619137u,76972037u,1515560u,3758096416u,1677868956u,138442752u,393216u}/* 110DC */, /*18714*/{0,1648u,6619137u,76972037u,1515560u,3758096416u,1677868964u,138442752u,393216u}/* 110DD */, /*18715*/{0,1648u,6619137u,76972037u,1515560u,3758096416u,1677868972u,138442752u,393216u}/* 110DE */, /*18716*/{0,1648u,6619137u,76972037u,1515560u,3758096416u,1677868980u,138442752u,393216u}/* 110DF */, /*18717*/{0,1648u,6619137u,76972037u,1515560u,3758096416u,1677868988u,138442752u,393216u}/* 110E0 */, /*18718*/{0,1648u,6619137u,76972037u,1515560u,3758096416u,1677868996u,138442752u,393216u}/* 110E1 */, /*18719*/{0,1648u,6619137u,76972037u,1515560u,3758096416u,1677869004u,138442752u,393216u}/* 110E2 */, /*18720*/{0,1648u,6619137u,76972037u,1515560u,3758096416u,1677869012u,138442752u,393216u}/* 110E3 */, /*18721*/{0,1648u,6619137u,76972037u,1515560u,3758096416u,1677869020u,138442752u,393216u}/* 110E4 */, /*18722*/{0,1648u,6619137u,76972037u,1515560u,3758096416u,1677869028u,138442752u,393216u}/* 110E5 */, /*18723*/{0,1648u,6619137u,76972037u,1515560u,3758096416u,1677869036u,138442752u,393216u}/* 110E6 */, /*18724*/{0,1648u,6619137u,76972037u,1515560u,3758096416u,1677869044u,138442752u,393216u}/* 110E7 */, /*18725*/{0,1648u,6619137u,76972037u,1515560u,3758096416u,1677869052u,138442752u,393216u}/* 110E8 */, /*18726*/{0,1648u,40174593u,85360649u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 110F0 */, /*18727*/{0,1648u,543491585u,85360649u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 110F1 */, /*18728*/{0,1648u,577047041u,85360649u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 110F2 */, /*18729*/{0,1648u,610600961u,85360649u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 110F3 */, /*18730*/{0,1648u,644157441u,85360649u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 110F4 */, /*18731*/{0,1648u,677710849u,85360649u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 110F5 */, /*18732*/{0,1648u,711267841u,85360649u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 110F6 */, /*18733*/{0,1648u,744820225u,85360649u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 110F7 */, /*18734*/{0,1648u,778378241u,85360649u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 110F8 */, /*18735*/{0,1648u,811930625u,85360649u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 110F9 */, /*18736*/{0,1656u,6291457u,3424038918u,672030728u,3774873616u,1077936140u,822114816u,262144u}/* 11100 */, /*18737*/{0,1656u,6291457u,3424038918u,672030728u,3774873616u,1077936140u,826309120u,262144u}/* 11101 */, /*18738*/{0,1656u,6291457u,3424038918u,672030728u,3774873616u,1077936140u,830503424u,262144u}/* 11102 */, /*18739*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677823972u,138442752u,393216u}/* 11103 */, /*18740*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677823980u,138442752u,393216u}/* 11104 */, /*18741*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677823988u,138442752u,393216u}/* 11105 */, /*18742*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677823996u,138442752u,393216u}/* 11106 */, /*18743*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824004u,138442752u,393216u}/* 11107 */, /*18744*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824012u,138442752u,393216u}/* 11108 */, /*18745*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824020u,138442752u,393216u}/* 11109 */, /*18746*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824028u,138442752u,393216u}/* 1110A */, /*18747*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824036u,138442752u,393216u}/* 1110B */, /*18748*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824044u,138442752u,393216u}/* 1110C */, /*18749*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824052u,138442752u,393216u}/* 1110D */, /*18750*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824060u,138442752u,393216u}/* 1110E */, /*18751*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824068u,138442752u,393216u}/* 1110F */, /*18752*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824076u,138442752u,393216u}/* 11110 */, /*18753*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824084u,138442752u,393216u}/* 11111 */, /*18754*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824092u,138442752u,393216u}/* 11112 */, /*18755*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824100u,138442752u,393216u}/* 11113 */, /*18756*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824108u,138442752u,393216u}/* 11114 */, /*18757*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824116u,138442752u,393216u}/* 11115 */, /*18758*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824124u,138442752u,393216u}/* 11116 */, /*18759*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824132u,138442752u,393216u}/* 11117 */, /*18760*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824140u,138442752u,393216u}/* 11118 */, /*18761*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824148u,138442752u,393216u}/* 11119 */, /*18762*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824156u,138442752u,393216u}/* 1111A */, /*18763*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824164u,138442752u,393216u}/* 1111B */, /*18764*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824172u,138442752u,393216u}/* 1111C */, /*18765*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824180u,138442752u,393216u}/* 1111D */, /*18766*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824188u,138442752u,393216u}/* 1111E */, /*18767*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824196u,138442752u,393216u}/* 1111F */, /*18768*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824204u,138442752u,393216u}/* 11120 */, /*18769*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824212u,138442752u,393216u}/* 11121 */, /*18770*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824220u,138442752u,393216u}/* 11122 */, /*18771*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824228u,138442752u,393216u}/* 11123 */, /*18772*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824236u,138442752u,393216u}/* 11124 */, /*18773*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824244u,138442752u,393216u}/* 11125 */, /*18774*/{0,1656u,6291457u,76972037u,1515560u,3758096416u,1677824252u,138442752u,393216u}/* 11126 */, /*18775*/{0,1656u,6291458u,68595718u,672030736u,3774873616u,1078038788u,138443264u,262144u}/* 11127 */, /*18776*/{0,1656u,6291457u,68595718u,672030728u,3774873616u,1078038796u,138443264u,262144u}/* 11128 */, /*18777*/{0,1656u,6291457u,68595718u,672030728u,3774873616u,1078038804u,138443264u,262144u}/* 11129 */, /*18778*/{0,1656u,6291457u,68595718u,672030728u,3774873616u,1078038812u,138443264u,262144u}/* 1112A */, /*18779*/{0,1656u,6291457u,68595718u,672030728u,3774873616u,1078038820u,138443264u,262144u}/* 1112B */, /*18780*/{0,1656u,6291457u,68583432u,940466184u,3758096416u,1078038828u,138443264u,262144u}/* 1112C */, /*18781*/{0,1656u,6291457u,68595718u,672030728u,3774873616u,1078038836u,138443264u,262144u}/* 1112D */, /*18782*/{2037907456u,1656u,6291457u,68595750u,672030728u,3774873616u,1078038844u,138437120u,262144u}/* 1112E */, /*18783*/{2038431744u,1656u,6291457u,68595750u,672030728u,3774873616u,1078038852u,138437120u,262144u}/* 1112F */, /*18784*/{0,1656u,6291457u,68595718u,672030728u,3774873616u,1078038860u,138443264u,262144u}/* 11130 */, /*18785*/{0,1656u,6291457u,68595718u,672030728u,3774873616u,1078038864u,138443264u,262144u}/* 11131 */, /*18786*/{0,1656u,6291457u,68595718u,672030728u,3774873616u,1078038872u,138443264u,262144u}/* 11132 */, /*18787*/{0,1656u,6291457u,337031174u,672030728u,1627398168u,1078038884u,138442752u,262144u}/* 11133 */, /*18788*/{0,1656u,6291457u,337031174u,672030728u,1627398168u,1078038892u,138442752u,262144u}/* 11134 */, /*18789*/{0,1656u,39846913u,85360649u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 11136 */, /*18790*/{0,1656u,543163905u,85360649u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 11137 */, /*18791*/{0,1656u,576719361u,85360649u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 11138 */, /*18792*/{0,1656u,610273281u,85360649u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 11139 */, /*18793*/{0,1656u,643829761u,85360649u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 1113A */, /*18794*/{0,1656u,677383169u,85360649u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 1113B */, /*18795*/{0,1656u,710940161u,85360649u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 1113C */, /*18796*/{0,1656u,744492545u,85360649u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 1113D */, /*18797*/{0,1656u,778050561u,85360649u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 1113E */, /*18798*/{0,1656u,811602945u,85360649u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 1113F */, /*18799*/{0,1656u,6291457u,69632023u,40u,1610612768u,5924u,138442754u,0}/* 11140 */, /*18800*/{0,1656u,6291457u,69632023u,98344u,1610612768u,5524u,138442754u,41943040u}/* 11141 */, /*18801*/{0,1656u,6291457u,69632023u,98344u,1610612768u,5532u,138442754u,41943040u}/* 11142 */, /*18802*/{0,1656u,6291457u,69632023u,98344u,1610612768u,5036u,138442754u,41943040u}/* 11143 */, /*18803*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808492u,138442752u,393216u}/* 11150 */, /*18804*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808500u,138442752u,393216u}/* 11151 */, /*18805*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808508u,138442752u,393216u}/* 11152 */, /*18806*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808516u,138442752u,393216u}/* 11153 */, /*18807*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808524u,138442752u,393216u}/* 11154 */, /*18808*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808532u,138442752u,393216u}/* 11155 */, /*18809*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808540u,138442752u,393216u}/* 11156 */, /*18810*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808548u,138442752u,393216u}/* 11157 */, /*18811*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808556u,138442752u,393216u}/* 11158 */, /*18812*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808564u,138442752u,393216u}/* 11159 */, /*18813*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808572u,138442752u,393216u}/* 1115A */, /*18814*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808580u,138442752u,393216u}/* 1115B */, /*18815*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808588u,138442752u,393216u}/* 1115C */, /*18816*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808596u,138442752u,393216u}/* 1115D */, /*18817*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808604u,138442752u,393216u}/* 1115E */, /*18818*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808612u,138442752u,393216u}/* 1115F */, /*18819*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808620u,138442752u,393216u}/* 11160 */, /*18820*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808628u,138442752u,393216u}/* 11161 */, /*18821*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808636u,138442752u,393216u}/* 11162 */, /*18822*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808644u,138442752u,393216u}/* 11163 */, /*18823*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808652u,138442752u,393216u}/* 11164 */, /*18824*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808660u,138442752u,393216u}/* 11165 */, /*18825*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808668u,138442752u,393216u}/* 11166 */, /*18826*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808676u,138442752u,393216u}/* 11167 */, /*18827*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808684u,138442752u,393216u}/* 11168 */, /*18828*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808692u,138442752u,393216u}/* 11169 */, /*18829*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808700u,138442752u,393216u}/* 1116A */, /*18830*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808708u,138442752u,393216u}/* 1116B */, /*18831*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808716u,138442752u,393216u}/* 1116C */, /*18832*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808724u,138442752u,393216u}/* 1116D */, /*18833*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808732u,138442752u,393216u}/* 1116E */, /*18834*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808740u,138442752u,393216u}/* 1116F */, /*18835*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808756u,138442752u,393216u}/* 11170 */, /*18836*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808764u,138442752u,393216u}/* 11171 */, /*18837*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808772u,138442752u,393216u}/* 11172 */, /*18838*/{0,1664u,7274497u,202911750u,672030728u,1627398160u,1077936140u,817920000u,262144u}/* 11173 */, /*18839*/{0,1664u,7274497u,77070359u,40u,1610612768u,9020u,138442754u,0}/* 11174 */, /*18840*/{0,1664u,7274497u,90701847u,40u,1610612768u,9028u,138442754u,0}/* 11175 */, /*18841*/{0,1664u,7274497u,77070341u,1515560u,3758096416u,1677808748u,138442752u,393216u}/* 11176 */, /*18842*/{0,1672u,6553601u,68595718u,672030728u,3774873616u,1077936140u,822114816u,262144u}/* 11180 */, /*18843*/{0,1672u,6553601u,68595718u,672030728u,3774873616u,1077936140u,826309120u,262144u}/* 11181 */, /*18844*/{0,1672u,6553601u,68583432u,940466184u,3758096416u,1077936140u,830503424u,262144u}/* 11182 */, /*18845*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677808796u,138442752u,393216u}/* 11183 */, /*18846*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677808804u,138442752u,393216u}/* 11184 */, /*18847*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677808812u,138442752u,393216u}/* 11185 */, /*18848*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677808820u,138442752u,393216u}/* 11186 */, /*18849*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677808828u,138442752u,393216u}/* 11187 */, /*18850*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677808836u,138442752u,393216u}/* 11188 */, /*18851*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677808844u,138442752u,393216u}/* 11189 */, /*18852*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677808852u,138442752u,393216u}/* 1118A */, /*18853*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677808860u,138442752u,393216u}/* 1118B */, /*18854*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677808868u,138442752u,393216u}/* 1118C */, /*18855*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677808876u,138442752u,393216u}/* 1118D */, /*18856*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677808884u,138442752u,393216u}/* 1118E */, /*18857*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677808892u,138442752u,393216u}/* 1118F */, /*18858*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677808900u,138442752u,393216u}/* 11190 */, /*18859*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677808908u,138442752u,393216u}/* 11191 */, /*18860*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677808916u,138442752u,393216u}/* 11192 */, /*18861*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677808924u,138442752u,393216u}/* 11193 */, /*18862*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677808932u,138442752u,393216u}/* 11194 */, /*18863*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677808940u,138442752u,393216u}/* 11195 */, /*18864*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677808948u,138442752u,393216u}/* 11196 */, /*18865*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677808956u,138442752u,393216u}/* 11197 */, /*18866*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677808964u,138442752u,393216u}/* 11198 */, /*18867*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677808972u,138442752u,393216u}/* 11199 */, /*18868*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677808980u,138442752u,393216u}/* 1119A */, /*18869*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677808988u,138442752u,393216u}/* 1119B */, /*18870*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677808996u,138442752u,393216u}/* 1119C */, /*18871*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677809004u,138442752u,393216u}/* 1119D */, /*18872*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677809012u,138442752u,393216u}/* 1119E */, /*18873*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677809020u,138442752u,393216u}/* 1119F */, /*18874*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677809028u,138442752u,393216u}/* 111A0 */, /*18875*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677809036u,138442752u,393216u}/* 111A1 */, /*18876*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677809044u,138442752u,393216u}/* 111A2 */, /*18877*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677809052u,138442752u,393216u}/* 111A3 */, /*18878*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677809060u,138442752u,393216u}/* 111A4 */, /*18879*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677809068u,138442752u,393216u}/* 111A5 */, /*18880*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677809076u,138442752u,393216u}/* 111A6 */, /*18881*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677809084u,138442752u,393216u}/* 111A7 */, /*18882*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677809092u,138442752u,393216u}/* 111A8 */, /*18883*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677809100u,138442752u,393216u}/* 111A9 */, /*18884*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677809108u,138442752u,393216u}/* 111AA */, /*18885*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677809116u,138442752u,393216u}/* 111AB */, /*18886*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677809124u,138442752u,393216u}/* 111AC */, /*18887*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677809132u,138442752u,393216u}/* 111AD */, /*18888*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677809140u,138442752u,393216u}/* 111AE */, /*18889*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677809148u,138442752u,393216u}/* 111AF */, /*18890*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677809156u,138442752u,393216u}/* 111B0 */, /*18891*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677809164u,138442752u,393216u}/* 111B1 */, /*18892*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677809172u,138442752u,393216u}/* 111B2 */, /*18893*/{0,1672u,6553601u,68583432u,940466184u,3758096416u,1078023740u,138443264u,262144u}/* 111B3 */, /*18894*/{0,1672u,6553601u,68583432u,940466184u,3758096416u,1078023748u,138443264u,262144u}/* 111B4 */, /*18895*/{0,1672u,6553601u,68583432u,940466184u,3758096416u,1078023756u,138443264u,262144u}/* 111B5 */, /*18896*/{0,1672u,6553601u,68595718u,672030728u,3774873616u,1078023764u,138443264u,262144u}/* 111B6 */, /*18897*/{0,1672u,6553601u,68595718u,672030728u,3774873616u,1078023772u,138443264u,262144u}/* 111B7 */, /*18898*/{0,1672u,6553601u,68595718u,672030728u,3774873616u,1078023780u,138443264u,262144u}/* 111B8 */, /*18899*/{0,1672u,6553601u,68595718u,672030728u,3774873616u,1078023788u,138443264u,262144u}/* 111B9 */, /*18900*/{0,1672u,6553601u,68595718u,672030728u,3774873616u,1078023796u,138443264u,262144u}/* 111BA */, /*18901*/{0,1672u,6553601u,68595718u,672030728u,3774873616u,1078023804u,138443264u,262144u}/* 111BB */, /*18902*/{0,1672u,6553601u,68595718u,672030728u,3774873616u,1078023812u,138443264u,262144u}/* 111BC */, /*18903*/{0,1672u,6553601u,68595718u,672030728u,3774873616u,1078023820u,138443264u,262144u}/* 111BD */, /*18904*/{0,1672u,6553601u,68595718u,672030728u,3774873616u,1078023828u,138443264u,262144u}/* 111BE */, /*18905*/{0,1672u,6553601u,68583432u,940466184u,3758096416u,1078023836u,138443264u,262144u}/* 111BF */, /*18906*/{0,1672u,6553601u,337018888u,940466184u,1610620968u,1078023844u,138442752u,262144u}/* 111C0 */, /*18907*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677809180u,138442752u,393216u}/* 111C1 */, /*18908*/{0,1672u,6553601u,76972037u,135733256u,3758096416u,1677809188u,138442752u,393216u}/* 111C2 */, /*18909*/{0,1672u,6553601u,76972037u,135733256u,3758096416u,1677809196u,138442752u,393216u}/* 111C3 */, /*18910*/{0,1672u,6553601u,76972037u,1515560u,3758096416u,1677808780u,138442752u,393216u}/* 111C4 */, /*18911*/{0,1672u,6553601u,69632023u,98344u,1610612768u,5540u,138442754u,41943040u}/* 111C5 */, /*18912*/{0,1672u,6553601u,69632023u,98344u,1610612768u,5548u,138442754u,41943040u}/* 111C6 */, /*18913*/{0,1672u,6553601u,76972055u,40u,1610612768u,9044u,138442754u,0}/* 111C7 */, /*18914*/{0,1672u,6553601u,69632023u,40u,1610612768u,5932u,138442754u,0}/* 111C8 */, /*18915*/{0,1672u,6553601u,77103127u,40u,1610612768u,9052u,138442754u,0}/* 111C9 */, /*18916*/{0,1672u,6553601u,202944518u,672030728u,1627398160u,1077936140u,817920000u,262144u}/* 111CA */, /*18917*/{0,1672u,6553601u,68726790u,672030728u,1627398160u,1077936140u,872445952u,262144u}/* 111CB */, /*18918*/{0,1672u,6553601u,68726790u,672030728u,1627398160u,1077936140u,876640256u,262144u}/* 111CC */, /*18919*/{0,1672u,6553601u,77070359u,98344u,1610612768u,9036u,138442754u,41943040u}/* 111CD */, /*18920*/{0,1672u,40109057u,85360649u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 111D0 */, /*18921*/{0,1672u,543426049u,85360649u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 111D1 */, /*18922*/{0,1672u,576981505u,85360649u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 111D2 */, /*18923*/{0,1672u,610535425u,85360649u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 111D3 */, /*18924*/{0,1672u,644091905u,85360649u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 111D4 */, /*18925*/{0,1672u,677645313u,85360649u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 111D5 */, /*18926*/{0,1672u,711202305u,85360649u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 111D6 */, /*18927*/{0,1672u,744754689u,85360649u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 111D7 */, /*18928*/{0,1672u,778312705u,85360649u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 111D8 */, /*18929*/{0,1672u,811865089u,85360649u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 111D9 */, /*18930*/{0,1672u,6553601u,77070341u,1515560u,3758096416u,1677808788u,138442752u,393216u}/* 111DA */, /*18931*/{0,1672u,6553601u,90734615u,40u,1610612768u,9060u,138442754u,0}/* 111DB */, /*18932*/{0,1672u,6553601u,77103109u,1515560u,3758096416u,1677809204u,138442752u,393216u}/* 111DC */, /*18933*/{0,1672u,6553601u,69763095u,40u,1610612768u,9068u,138442754u,0}/* 111DD */, /*18934*/{0,1672u,6553601u,69763095u,98344u,1610612768u,5940u,138442754u,41943040u}/* 111DE */, /*18935*/{0,1672u,6553601u,69763095u,98344u,1610612768u,5948u,138442754u,41943040u}/* 111DF */, /*18936*/{0,1680u,538117633u,77070347u,8388650u,1610612768u,58669u,138442752u,0}/* 111E1 */, /*18937*/{0,1680u,571673089u,77070347u,8388650u,1610612768u,58677u,138442752u,0}/* 111E2 */, /*18938*/{0,1680u,605227009u,77070347u,8388650u,1610612768u,58685u,138442752u,0}/* 111E3 */, /*18939*/{0,1680u,638783489u,77070347u,8388650u,1610612768u,58693u,138442752u,0}/* 111E4 */, /*18940*/{0,1680u,672336897u,77070347u,8388650u,1610612768u,58701u,138442752u,0}/* 111E5 */, /*18941*/{0,1680u,705893889u,77070347u,8388650u,1610612768u,58709u,138442752u,0}/* 111E6 */, /*18942*/{0,1680u,739446273u,77070347u,8388650u,1610612768u,58717u,138442752u,0}/* 111E7 */, /*18943*/{0,1680u,773004289u,77070347u,8388650u,1610612768u,58725u,138442752u,0}/* 111E8 */, /*18944*/{0,1680u,806556673u,77070347u,8388650u,1610612768u,58733u,138442752u,0}/* 111E9 */, /*18945*/{0,1680u,823336961u,77070347u,8388650u,1610612768u,57229u,138442752u,0}/* 111EA */, /*18946*/{0,1680u,991112193u,77070347u,8388650u,1610612768u,57237u,138442752u,0}/* 111EB */, /*18947*/{0,1680u,1158889473u,77070347u,8388650u,1610612768u,57245u,138442752u,0}/* 111EC */, /*18948*/{0,1680u,1326666753u,77070347u,8388650u,1610612768u,57253u,138442752u,0}/* 111ED */, /*18949*/{0,1680u,1494444033u,77070347u,8388650u,1610612768u,57261u,138442752u,0}/* 111EE */, /*18950*/{0,1680u,1511221761u,77070347u,8388650u,1610612768u,57269u,138442752u,0}/* 111EF */, /*18951*/{0,1680u,1527999489u,77070347u,8388650u,1610612768u,57277u,138442752u,0}/* 111F0 */, /*18952*/{0,1680u,1544777217u,77070347u,8388650u,1610612768u,57285u,138442752u,0}/* 111F1 */, /*18953*/{0,1680u,1561554945u,77070347u,8388650u,1610612768u,57293u,138442752u,0}/* 111F2 */, /*18954*/{0,1680u,1578332673u,77070347u,8388650u,1610612768u,57301u,138442752u,0}/* 111F3 */, /*18955*/{0,1680u,1729332225u,77070347u,8388650u,1610612768u,57309u,138442752u,0}/* 111F4 */, /*18956*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809324u,138442752u,393216u}/* 11200 */, /*18957*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809332u,138442752u,393216u}/* 11201 */, /*18958*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809340u,138442752u,393216u}/* 11202 */, /*18959*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809348u,138442752u,393216u}/* 11203 */, /*18960*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809356u,138442752u,393216u}/* 11204 */, /*18961*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809364u,138442752u,393216u}/* 11205 */, /*18962*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809372u,138442752u,393216u}/* 11206 */, /*18963*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809380u,138442752u,393216u}/* 11207 */, /*18964*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809388u,138442752u,393216u}/* 11208 */, /*18965*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809396u,138442752u,393216u}/* 11209 */, /*18966*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809404u,138442752u,393216u}/* 1120A */, /*18967*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809412u,138442752u,393216u}/* 1120B */, /*18968*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809420u,138442752u,393216u}/* 1120C */, /*18969*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809428u,138442752u,393216u}/* 1120D */, /*18970*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809436u,138442752u,393216u}/* 1120E */, /*18971*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809444u,138442752u,393216u}/* 1120F */, /*18972*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809452u,138442752u,393216u}/* 11210 */, /*18973*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809460u,138442752u,393216u}/* 11211 */, /*18974*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809468u,138442752u,393216u}/* 11213 */, /*18975*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809476u,138442752u,393216u}/* 11214 */, /*18976*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809484u,138442752u,393216u}/* 11215 */, /*18977*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809492u,138442752u,393216u}/* 11216 */, /*18978*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809500u,138442752u,393216u}/* 11217 */, /*18979*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809508u,138442752u,393216u}/* 11218 */, /*18980*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809516u,138442752u,393216u}/* 11219 */, /*18981*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809524u,138442752u,393216u}/* 1121A */, /*18982*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809532u,138442752u,393216u}/* 1121B */, /*18983*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809540u,138442752u,393216u}/* 1121C */, /*18984*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809548u,138442752u,393216u}/* 1121D */, /*18985*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809556u,138442752u,393216u}/* 1121E */, /*18986*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809564u,138442752u,393216u}/* 1121F */, /*18987*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809572u,138442752u,393216u}/* 11220 */, /*18988*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809580u,138442752u,393216u}/* 11221 */, /*18989*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809588u,138442752u,393216u}/* 11222 */, /*18990*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809596u,138442752u,393216u}/* 11223 */, /*18991*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809604u,138442752u,393216u}/* 11224 */, /*18992*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809612u,138442752u,393216u}/* 11225 */, /*18993*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809620u,138442752u,393216u}/* 11226 */, /*18994*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809628u,138442752u,393216u}/* 11227 */, /*18995*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809636u,138442752u,393216u}/* 11228 */, /*18996*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809644u,138442752u,393216u}/* 11229 */, /*18997*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809652u,138442752u,393216u}/* 1122A */, /*18998*/{0,1688u,7143425u,77070341u,1515560u,3758096416u,1677809660u,138442752u,393216u}/* 1122B */, /*18999*/{0,1688u,7143425u,68681736u,940466184u,3758096416u,1078024196u,138443264u,262144u}/* 1122C */, /*19000*/{0,1688u,7143425u,68681736u,940466184u,3758096416u,1078024204u,138443264u,262144u}/* 1122D */, /*19001*/{0,1688u,7143425u,68681736u,940466184u,3758096416u,1078024212u,138443264u,262144u}/* 1122E */, /*19002*/{0,1688u,7143425u,68694022u,672030728u,3774873616u,1078024220u,138443264u,262144u}/* 1122F */, /*19003*/{0,1688u,7143425u,68694022u,672030728u,3774873616u,1078024228u,138443264u,262144u}/* 11230 */, /*19004*/{0,1688u,7143425u,68694022u,672030728u,3774873616u,1078024236u,138443264u,262144u}/* 11231 */, /*19005*/{0,1688u,7143425u,68681736u,940466184u,3758096416u,1078024244u,138443264u,262144u}/* 11232 */, /*19006*/{0,1688u,7143425u,68681736u,940466184u,3758096416u,1078024252u,138443264u,262144u}/* 11233 */, /*19007*/{0,1688u,7143425u,68694022u,672030728u,3774873616u,1077936140u,826309120u,262144u}/* 11234 */, /*19008*/{0,1688u,7143425u,337117192u,940466184u,1610620968u,1078024260u,138442752u,262144u}/* 11235 */, /*19009*/{0,1688u,7143425u,202911750u,672030728u,1627398160u,1077936140u,817920000u,262144u}/* 11236 */, /*19010*/{0,1688u,7143425u,68694022u,672030728u,3774873616u,1077936140u,541096448u,262144u}/* 11237 */, /*19011*/{0,1688u,7143425u,69730327u,98344u,1610612768u,5556u,138442754u,41943040u}/* 11238 */, /*19012*/{0,1688u,7143425u,69730327u,98344u,1610612768u,5564u,138442754u,41943040u}/* 11239 */, /*19013*/{0,1688u,7143425u,77070359u,40u,1610612768u,9076u,138442754u,8388608u}/* 1123A */, /*19014*/{0,1688u,7143425u,69730327u,98344u,1610612768u,9084u,138442754u,41943040u}/* 1123B */, /*19015*/{0,1688u,7143425u,69730327u,98344u,1610612768u,9092u,138442754u,41943040u}/* 1123C */, /*19016*/{0,1688u,7143425u,77070359u,40u,1610612768u,9100u,138442754u,0}/* 1123D */, /*19017*/{0,1688u,7143425u,68759558u,672030728u,3774873616u,1077936140u,545290752u,262144u}/* 1123E */, /*19018*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810196u,138442752u,393216u}/* 11280 */, /*19019*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810204u,138442752u,393216u}/* 11281 */, /*19020*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810212u,138442752u,393216u}/* 11282 */, /*19021*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810220u,138442752u,393216u}/* 11283 */, /*19022*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810244u,138442752u,393216u}/* 11284 */, /*19023*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810252u,138442752u,393216u}/* 11285 */, /*19024*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810260u,138442752u,393216u}/* 11286 */, /*19025*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810268u,138442752u,393216u}/* 11288 */, /*19026*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810276u,138442752u,393216u}/* 1128A */, /*19027*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810284u,138442752u,393216u}/* 1128B */, /*19028*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810292u,138442752u,393216u}/* 1128C */, /*19029*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810300u,138442752u,393216u}/* 1128D */, /*19030*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810308u,138442752u,393216u}/* 1128F */, /*19031*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810316u,138442752u,393216u}/* 11290 */, /*19032*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810324u,138442752u,393216u}/* 11291 */, /*19033*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810332u,138442752u,393216u}/* 11292 */, /*19034*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810340u,138442752u,393216u}/* 11293 */, /*19035*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810348u,138442752u,393216u}/* 11294 */, /*19036*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810356u,138442752u,393216u}/* 11295 */, /*19037*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810364u,138442752u,393216u}/* 11296 */, /*19038*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810372u,138442752u,393216u}/* 11297 */, /*19039*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810380u,138442752u,393216u}/* 11298 */, /*19040*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810388u,138442752u,393216u}/* 11299 */, /*19041*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810396u,138442752u,393216u}/* 1129A */, /*19042*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810404u,138442752u,393216u}/* 1129B */, /*19043*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810412u,138442752u,393216u}/* 1129C */, /*19044*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810420u,138442752u,393216u}/* 1129D */, /*19045*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810428u,138442752u,393216u}/* 1129F */, /*19046*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810436u,138442752u,393216u}/* 112A0 */, /*19047*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810444u,138442752u,393216u}/* 112A1 */, /*19048*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810452u,138442752u,393216u}/* 112A2 */, /*19049*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810460u,138442752u,393216u}/* 112A3 */, /*19050*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810468u,138442752u,393216u}/* 112A4 */, /*19051*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810228u,138442752u,393216u}/* 112A5 */, /*19052*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810236u,138442752u,393216u}/* 112A6 */, /*19053*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810476u,138442752u,393216u}/* 112A7 */, /*19054*/{0,1696u,8454145u,77103109u,1515560u,3758096416u,1677810484u,138442752u,393216u}/* 112A8 */, /*19055*/{0,1696u,8454145u,69763095u,98344u,1610612768u,5956u,138442754u,41943040u}/* 112A9 */, /*19056*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809740u,138442752u,393216u}/* 112B0 */, /*19057*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809748u,138442752u,393216u}/* 112B1 */, /*19058*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809756u,138442752u,393216u}/* 112B2 */, /*19059*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809764u,138442752u,393216u}/* 112B3 */, /*19060*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809772u,138442752u,393216u}/* 112B4 */, /*19061*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809780u,138442752u,393216u}/* 112B5 */, /*19062*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809788u,138442752u,393216u}/* 112B6 */, /*19063*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809796u,138442752u,393216u}/* 112B7 */, /*19064*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809804u,138442752u,393216u}/* 112B8 */, /*19065*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809812u,138442752u,393216u}/* 112B9 */, /*19066*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809820u,138442752u,393216u}/* 112BA */, /*19067*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809828u,138442752u,393216u}/* 112BB */, /*19068*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809836u,138442752u,393216u}/* 112BC */, /*19069*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809844u,138442752u,393216u}/* 112BD */, /*19070*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809852u,138442752u,393216u}/* 112BE */, /*19071*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809860u,138442752u,393216u}/* 112BF */, /*19072*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809868u,138442752u,393216u}/* 112C0 */, /*19073*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809876u,138442752u,393216u}/* 112C1 */, /*19074*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809884u,138442752u,393216u}/* 112C2 */, /*19075*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809892u,138442752u,393216u}/* 112C3 */, /*19076*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809900u,138442752u,393216u}/* 112C4 */, /*19077*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809908u,138442752u,393216u}/* 112C5 */, /*19078*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809916u,138442752u,393216u}/* 112C6 */, /*19079*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809924u,138442752u,393216u}/* 112C7 */, /*19080*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809932u,138442752u,393216u}/* 112C8 */, /*19081*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809940u,138442752u,393216u}/* 112C9 */, /*19082*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809948u,138442752u,393216u}/* 112CA */, /*19083*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809956u,138442752u,393216u}/* 112CB */, /*19084*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809964u,138442752u,393216u}/* 112CC */, /*19085*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809972u,138442752u,393216u}/* 112CD */, /*19086*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809980u,138442752u,393216u}/* 112CE */, /*19087*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809988u,138442752u,393216u}/* 112CF */, /*19088*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677809996u,138442752u,393216u}/* 112D0 */, /*19089*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677810004u,138442752u,393216u}/* 112D1 */, /*19090*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677810012u,138442752u,393216u}/* 112D2 */, /*19091*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677810020u,138442752u,393216u}/* 112D3 */, /*19092*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677810028u,138442752u,393216u}/* 112D4 */, /*19093*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677810036u,138442752u,393216u}/* 112D5 */, /*19094*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677810044u,138442752u,393216u}/* 112D6 */, /*19095*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677810052u,138442752u,393216u}/* 112D7 */, /*19096*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677810060u,138442752u,393216u}/* 112D8 */, /*19097*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677810068u,138442752u,393216u}/* 112D9 */, /*19098*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677810076u,138442752u,393216u}/* 112DA */, /*19099*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677810084u,138442752u,393216u}/* 112DB */, /*19100*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677810092u,138442752u,393216u}/* 112DC */, /*19101*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677810100u,138442752u,393216u}/* 112DD */, /*19102*/{0,1704u,8060929u,77070341u,1515560u,3758096416u,1677810108u,138442752u,393216u}/* 112DE */, /*19103*/{0,1704u,8060929u,68694022u,672030728u,3774873616u,1077936140u,826309120u,262144u}/* 112DF */, /*19104*/{0,1704u,8060929u,68681736u,940466184u,3758096416u,1078024644u,138443264u,262144u}/* 112E0 */, /*19105*/{0,1704u,8060929u,68681736u,940466184u,3758096416u,1078024652u,138443264u,262144u}/* 112E1 */, /*19106*/{0,1704u,8060929u,68681736u,940466184u,3758096416u,1078024660u,138443264u,262144u}/* 112E2 */, /*19107*/{0,1704u,8060929u,68694022u,672030728u,3774873616u,1078024668u,138443264u,262144u}/* 112E3 */, /*19108*/{0,1704u,8060929u,68694022u,672030728u,3774873616u,1078024676u,138443264u,262144u}/* 112E4 */, /*19109*/{0,1704u,8060929u,68694022u,672030728u,3774873616u,1078024684u,138443264u,262144u}/* 112E5 */, /*19110*/{0,1704u,8060929u,68694022u,672030728u,3774873616u,1078024692u,138443264u,262144u}/* 112E6 */, /*19111*/{0,1704u,8060929u,68694022u,672030728u,3774873616u,1078024700u,138443264u,262144u}/* 112E7 */, /*19112*/{0,1704u,8060929u,68694022u,672030728u,3774873616u,1078024708u,138443264u,262144u}/* 112E8 */, /*19113*/{0,1704u,8060929u,202911750u,672030728u,1627398160u,1077936140u,817920000u,262144u}/* 112E9 */, /*19114*/{0,1704u,8060929u,337129478u,672030728u,1627398168u,1078024716u,138442752u,262144u}/* 112EA */, /*19115*/{0,1704u,41616385u,85458953u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 112F0 */, /*19116*/{0,1704u,544933377u,85458953u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 112F1 */, /*19117*/{0,1704u,578488833u,85458953u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 112F2 */, /*19118*/{0,1704u,612042753u,85458953u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 112F3 */, /*19119*/{0,1704u,645599233u,85458953u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 112F4 */, /*19120*/{0,1704u,679152641u,85458953u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 112F5 */, /*19121*/{0,1704u,712709633u,85458953u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 112F6 */, /*19122*/{0,1704u,746262017u,85458953u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 112F7 */, /*19123*/{0,1704u,779820033u,85458953u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 112F8 */, /*19124*/{0,1704u,813372417u,85458953u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 112F9 */, /*19125*/{0,1712u,7012353u,68726790u,672030728u,3774873616u,1077936140u,826309120u,262144u}/* 11300 */, /*19126*/{0,1712u,7012353u,68694022u,672030728u,3774873616u,1077936140u,822114816u,262144u}/* 11301 */, /*19127*/{0,1712u,7012353u,68681736u,940466184u,3758096416u,1077936140u,826309120u,262144u}/* 11302 */, /*19128*/{0,1712u,7012353u,68681736u,940466184u,3758096416u,1077936140u,830503424u,262144u}/* 11303 */, /*19129*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810500u,138442752u,393216u}/* 11305 */, /*19130*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810508u,138442752u,393216u}/* 11306 */, /*19131*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810516u,138442752u,393216u}/* 11307 */, /*19132*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810524u,138442752u,393216u}/* 11308 */, /*19133*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810532u,138442752u,393216u}/* 11309 */, /*19134*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810540u,138442752u,393216u}/* 1130A */, /*19135*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810548u,138442752u,393216u}/* 1130B */, /*19136*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810564u,138442752u,393216u}/* 1130C */, /*19137*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810580u,138442752u,393216u}/* 1130F */, /*19138*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810588u,138442752u,393216u}/* 11310 */, /*19139*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810596u,138442752u,393216u}/* 11313 */, /*19140*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810604u,138442752u,393216u}/* 11314 */, /*19141*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810612u,138442752u,393216u}/* 11315 */, /*19142*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810620u,138442752u,393216u}/* 11316 */, /*19143*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810628u,138442752u,393216u}/* 11317 */, /*19144*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810636u,138442752u,393216u}/* 11318 */, /*19145*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810644u,138442752u,393216u}/* 11319 */, /*19146*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810652u,138442752u,393216u}/* 1131A */, /*19147*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810660u,138442752u,393216u}/* 1131B */, /*19148*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810668u,138442752u,393216u}/* 1131C */, /*19149*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810676u,138442752u,393216u}/* 1131D */, /*19150*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810684u,138442752u,393216u}/* 1131E */, /*19151*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810692u,138442752u,393216u}/* 1131F */, /*19152*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810700u,138442752u,393216u}/* 11320 */, /*19153*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810708u,138442752u,393216u}/* 11321 */, /*19154*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810716u,138442752u,393216u}/* 11322 */, /*19155*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810724u,138442752u,393216u}/* 11323 */, /*19156*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810732u,138442752u,393216u}/* 11324 */, /*19157*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810740u,138442752u,393216u}/* 11325 */, /*19158*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810748u,138442752u,393216u}/* 11326 */, /*19159*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810756u,138442752u,393216u}/* 11327 */, /*19160*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810764u,138442752u,393216u}/* 11328 */, /*19161*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810772u,138442752u,393216u}/* 1132A */, /*19162*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810780u,138442752u,393216u}/* 1132B */, /*19163*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810788u,138442752u,393216u}/* 1132C */, /*19164*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810796u,138442752u,393216u}/* 1132D */, /*19165*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810804u,138442752u,393216u}/* 1132E */, /*19166*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810812u,138442752u,393216u}/* 1132F */, /*19167*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810820u,138442752u,393216u}/* 11330 */, /*19168*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810828u,138442752u,393216u}/* 11332 */, /*19169*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810836u,138442752u,393216u}/* 11333 */, /*19170*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810844u,138442752u,393216u}/* 11335 */, /*19171*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810852u,138442752u,393216u}/* 11336 */, /*19172*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810860u,138442752u,393216u}/* 11337 */, /*19173*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810868u,138442752u,393216u}/* 11338 */, /*19174*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810876u,138442752u,393216u}/* 11339 */, /*19175*/{0,1712u,7012353u,202911750u,672030728u,1627398160u,1077936140u,817920000u,262144u}/* 1133C */, /*19176*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810884u,138442752u,393216u}/* 1133D */, /*19177*/{0,1712u,7012354u,68681736u,672030736u,3758096400u,1078025436u,138443392u,262144u}/* 1133E */, /*19178*/{0,1712u,7012353u,68681736u,940466184u,3758096416u,1078025444u,138443264u,262144u}/* 1133F */, /*19179*/{0,1712u,7012353u,68694022u,672030728u,3774873616u,1078025452u,138443264u,262144u}/* 11340 */, /*19180*/{0,1712u,7012353u,68681736u,940466184u,3758096416u,1078025460u,138443264u,262144u}/* 11341 */, /*19181*/{0,1712u,7012353u,68681736u,940466184u,3758096416u,1078025468u,138443264u,262144u}/* 11342 */, /*19182*/{0,1712u,7012353u,68681736u,940466184u,3758096416u,1078025476u,138443264u,262144u}/* 11343 */, /*19183*/{0,1712u,7012353u,68681736u,940466184u,3758096416u,1078025484u,138443264u,262144u}/* 11344 */, /*19184*/{0,1712u,7012353u,68681736u,940466184u,3758096416u,1078025504u,138443264u,262144u}/* 11347 */, /*19185*/{0,1712u,7012353u,68681736u,940466184u,3758096416u,1078025516u,138443264u,262144u}/* 11348 */, /*19186*/{2038956032u,1712u,7012353u,68681768u,940466184u,3758096416u,1078025524u,138437120u,262144u}/* 1134B */, /*19187*/{2039480320u,1712u,7012353u,68681768u,940466184u,3758096416u,1078025532u,138437120u,262144u}/* 1134C */, /*19188*/{0,1712u,7012353u,337117192u,940466184u,1610620968u,1078025540u,138442752u,262144u}/* 1134D */, /*19189*/{0,1712u,7012353u,77103109u,1515560u,3758096416u,1677810492u,138442752u,393216u}/* 11350 */, /*19190*/{0,1712u,7012354u,68681736u,672030736u,3758096400u,1078025548u,138443392u,262144u}/* 11357 */, /*19191*/{0,1712u,7012353u,77070341u,1515560u,3758096544u,1677811028u,138442752u,393216u}/* 1135D */, /*19192*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810892u,138442752u,393216u}/* 1135E */, /*19193*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810900u,138442752u,393216u}/* 1135F */, /*19194*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810556u,138442752u,393216u}/* 11360 */, /*19195*/{0,1712u,7012353u,77070341u,1515560u,3758096416u,1677810572u,138442752u,393216u}/* 11361 */, /*19196*/{0,1712u,7012353u,68681736u,940466184u,3758096416u,1078025492u,138443264u,262144u}/* 11362 */, /*19197*/{0,1712u,7012353u,68681736u,940466184u,3758096416u,1078025500u,138443264u,262144u}/* 11363 */, /*19198*/{0,1712u,7012353u,3424137222u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* 11366 */, /*19199*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811052u,138442752u,393216u}/* 11400 */, /*19200*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811060u,138442752u,393216u}/* 11401 */, /*19201*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811068u,138442752u,393216u}/* 11402 */, /*19202*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811076u,138442752u,393216u}/* 11403 */, /*19203*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811084u,138442752u,393216u}/* 11404 */, /*19204*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811092u,138442752u,393216u}/* 11405 */, /*19205*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811100u,138442752u,393216u}/* 11406 */, /*19206*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811108u,138442752u,393216u}/* 11407 */, /*19207*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811116u,138442752u,393216u}/* 11408 */, /*19208*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811124u,138442752u,393216u}/* 11409 */, /*19209*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811132u,138442752u,393216u}/* 1140A */, /*19210*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811140u,138442752u,393216u}/* 1140B */, /*19211*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811148u,138442752u,393216u}/* 1140C */, /*19212*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811156u,138442752u,393216u}/* 1140D */, /*19213*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811164u,138442752u,393216u}/* 1140E */, /*19214*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811172u,138442752u,393216u}/* 1140F */, /*19215*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811180u,138442752u,393216u}/* 11410 */, /*19216*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811188u,138442752u,393216u}/* 11411 */, /*19217*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811196u,138442752u,393216u}/* 11412 */, /*19218*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811204u,138442752u,393216u}/* 11413 */, /*19219*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811212u,138442752u,393216u}/* 11414 */, /*19220*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811220u,138442752u,393216u}/* 11415 */, /*19221*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811228u,138442752u,393216u}/* 11416 */, /*19222*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811236u,138442752u,393216u}/* 11417 */, /*19223*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811244u,138442752u,393216u}/* 11418 */, /*19224*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811252u,138442752u,393216u}/* 11419 */, /*19225*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811260u,138442752u,393216u}/* 1141A */, /*19226*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811268u,138442752u,393216u}/* 1141B */, /*19227*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811276u,138442752u,393216u}/* 1141C */, /*19228*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811284u,138442752u,393216u}/* 1141D */, /*19229*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811292u,138442752u,393216u}/* 1141E */, /*19230*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811300u,138442752u,393216u}/* 1141F */, /*19231*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811308u,138442752u,393216u}/* 11420 */, /*19232*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811316u,138442752u,393216u}/* 11421 */, /*19233*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811324u,138442752u,393216u}/* 11422 */, /*19234*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811332u,138442752u,393216u}/* 11423 */, /*19235*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811340u,138442752u,393216u}/* 11424 */, /*19236*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811348u,138442752u,393216u}/* 11425 */, /*19237*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811356u,138442752u,393216u}/* 11426 */, /*19238*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811364u,138442752u,393216u}/* 11427 */, /*19239*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811372u,138442752u,393216u}/* 11428 */, /*19240*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811380u,138442752u,393216u}/* 11429 */, /*19241*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811388u,138442752u,393216u}/* 1142A */, /*19242*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811396u,138442752u,393216u}/* 1142B */, /*19243*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811404u,138442752u,393216u}/* 1142C */, /*19244*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811412u,138442752u,393216u}/* 1142D */, /*19245*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811420u,138442752u,393216u}/* 1142E */, /*19246*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811428u,138442752u,393216u}/* 1142F */, /*19247*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811436u,138442752u,393216u}/* 11430 */, /*19248*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811444u,138442752u,393216u}/* 11431 */, /*19249*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811452u,138442752u,393216u}/* 11432 */, /*19250*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811460u,138442752u,393216u}/* 11433 */, /*19251*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811468u,138442752u,393216u}/* 11434 */, /*19252*/{0,1720u,8847361u,68747272u,940466184u,3758096416u,1078026020u,138443264u,262144u}/* 11435 */, /*19253*/{0,1720u,8847361u,68747272u,940466184u,3758096416u,1078026028u,138443264u,262144u}/* 11436 */, /*19254*/{0,1720u,8847361u,68747272u,940466184u,3758096416u,1078026036u,138443264u,262144u}/* 11437 */, /*19255*/{0,1720u,8847361u,68759558u,672030728u,3774873616u,1078026044u,138443264u,262144u}/* 11438 */, /*19256*/{0,1720u,8847361u,68759558u,672030728u,3774873616u,1078026052u,138443264u,262144u}/* 11439 */, /*19257*/{0,1720u,8847361u,68759558u,672030728u,3774873616u,1078026060u,138443264u,262144u}/* 1143A */, /*19258*/{0,1720u,8847361u,68759558u,672030728u,3774873616u,1078026068u,138443264u,262144u}/* 1143B */, /*19259*/{0,1720u,8847361u,68759558u,672030728u,3774873616u,1078026076u,138443264u,262144u}/* 1143C */, /*19260*/{0,1720u,8847361u,68759558u,672030728u,3774873616u,1078026084u,138443264u,262144u}/* 1143D */, /*19261*/{0,1720u,8847361u,68759558u,672030728u,3774873616u,1078026092u,138443264u,262144u}/* 1143E */, /*19262*/{0,1720u,8847361u,68759558u,672030728u,3774873616u,1078026100u,138443264u,262144u}/* 1143F */, /*19263*/{0,1720u,8847361u,68747272u,940466184u,3758096416u,1078026108u,138443264u,262144u}/* 11440 */, /*19264*/{0,1720u,8847361u,68747272u,940466184u,3758096416u,1078026116u,138443264u,262144u}/* 11441 */, /*19265*/{0,1720u,8847361u,337195014u,672030728u,1627398168u,1078026124u,138442752u,262144u}/* 11442 */, /*19266*/{0,1720u,8847361u,68759558u,672030728u,3774873616u,1077936140u,822114816u,262144u}/* 11443 */, /*19267*/{0,1720u,8847361u,68759558u,672030728u,3774873616u,1077936140u,826309120u,262144u}/* 11444 */, /*19268*/{0,1720u,8847361u,68747272u,940466184u,3758096416u,1077936140u,830503424u,262144u}/* 11445 */, /*19269*/{0,1720u,8847361u,202977286u,672030728u,1627398160u,1077936140u,817920000u,262144u}/* 11446 */, /*19270*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811476u,138442752u,393216u}/* 11447 */, /*19271*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811484u,138442752u,393216u}/* 11448 */, /*19272*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811036u,138442752u,393216u}/* 11449 */, /*19273*/{0,1720u,8847361u,77135877u,1515560u,3758096416u,1677811044u,138442752u,393216u}/* 1144A */, /*19274*/{0,1720u,8847361u,69795863u,98344u,1610612768u,5572u,138442754u,41943040u}/* 1144B */, /*19275*/{0,1720u,8847361u,69795863u,98344u,1610612768u,5580u,138442754u,41943040u}/* 1144C */, /*19276*/{0,1720u,8847361u,69795863u,40u,1610612768u,9108u,138442754u,8388608u}/* 1144D */, /*19277*/{0,1720u,8847361u,69795863u,40u,1610612768u,9116u,138442754u,0}/* 1144E */, /*19278*/{0,1720u,8847361u,77135895u,40u,1610612768u,9124u,138442754u,0}/* 1144F */, /*19279*/{0,1720u,42402817u,85524489u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 11450 */, /*19280*/{0,1720u,545719809u,85524489u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 11451 */, /*19281*/{0,1720u,579275265u,85524489u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 11452 */, /*19282*/{0,1720u,612829185u,85524489u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 11453 */, /*19283*/{0,1720u,646385665u,85524489u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 11454 */, /*19284*/{0,1720u,679939073u,85524489u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 11455 */, /*19285*/{0,1720u,713496065u,85524489u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 11456 */, /*19286*/{0,1720u,747048449u,85524489u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 11457 */, /*19287*/{0,1720u,780606465u,85524489u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 11458 */, /*19288*/{0,1720u,814158849u,85524489u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 11459 */, /*19289*/{0,1720u,8847361u,69795863u,40u,1610612768u,9132u,138442754u,8388608u}/* 1145B */, /*19290*/{0,1720u,8847361u,77135895u,40u,1610612768u,9140u,138442754u,0}/* 1145D */, /*19291*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811612u,138442752u,393216u}/* 11480 */, /*19292*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811620u,138442752u,393216u}/* 11481 */, /*19293*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811628u,138442752u,393216u}/* 11482 */, /*19294*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811636u,138442752u,393216u}/* 11483 */, /*19295*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811644u,138442752u,393216u}/* 11484 */, /*19296*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811652u,138442752u,393216u}/* 11485 */, /*19297*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811660u,138442752u,393216u}/* 11486 */, /*19298*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811668u,138442752u,393216u}/* 11487 */, /*19299*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811676u,138442752u,393216u}/* 11488 */, /*19300*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811684u,138442752u,393216u}/* 11489 */, /*19301*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811692u,138442752u,393216u}/* 1148A */, /*19302*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811700u,138442752u,393216u}/* 1148B */, /*19303*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811708u,138442752u,393216u}/* 1148C */, /*19304*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811716u,138442752u,393216u}/* 1148D */, /*19305*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811724u,138442752u,393216u}/* 1148E */, /*19306*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811732u,138442752u,393216u}/* 1148F */, /*19307*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811740u,138442752u,393216u}/* 11490 */, /*19308*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811748u,138442752u,393216u}/* 11491 */, /*19309*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811756u,138442752u,393216u}/* 11492 */, /*19310*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811764u,138442752u,393216u}/* 11493 */, /*19311*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811772u,138442752u,393216u}/* 11494 */, /*19312*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811780u,138442752u,393216u}/* 11495 */, /*19313*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811788u,138442752u,393216u}/* 11496 */, /*19314*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811796u,138442752u,393216u}/* 11497 */, /*19315*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811804u,138442752u,393216u}/* 11498 */, /*19316*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811812u,138442752u,393216u}/* 11499 */, /*19317*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811820u,138442752u,393216u}/* 1149A */, /*19318*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811828u,138442752u,393216u}/* 1149B */, /*19319*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811836u,138442752u,393216u}/* 1149C */, /*19320*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811844u,138442752u,393216u}/* 1149D */, /*19321*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811852u,138442752u,393216u}/* 1149E */, /*19322*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811860u,138442752u,393216u}/* 1149F */, /*19323*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811868u,138442752u,393216u}/* 114A0 */, /*19324*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811876u,138442752u,393216u}/* 114A1 */, /*19325*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811884u,138442752u,393216u}/* 114A2 */, /*19326*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811892u,138442752u,393216u}/* 114A3 */, /*19327*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811900u,138442752u,393216u}/* 114A4 */, /*19328*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811908u,138442752u,393216u}/* 114A5 */, /*19329*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811916u,138442752u,393216u}/* 114A6 */, /*19330*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811924u,138442752u,393216u}/* 114A7 */, /*19331*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811932u,138442752u,393216u}/* 114A8 */, /*19332*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811940u,138442752u,393216u}/* 114A9 */, /*19333*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811948u,138442752u,393216u}/* 114AA */, /*19334*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811956u,138442752u,393216u}/* 114AB */, /*19335*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811964u,138442752u,393216u}/* 114AC */, /*19336*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811972u,138442752u,393216u}/* 114AD */, /*19337*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811980u,138442752u,393216u}/* 114AE */, /*19338*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811988u,138442752u,393216u}/* 114AF */, /*19339*/{0,1728u,8126466u,68681736u,672030736u,3758096400u,1078026540u,138443392u,262144u}/* 114B0 */, /*19340*/{0,1728u,8126465u,68681736u,940466184u,3758096416u,1078026548u,138443264u,262144u}/* 114B1 */, /*19341*/{0,1728u,8126465u,68681736u,940466184u,3758096416u,1078026556u,138443264u,262144u}/* 114B2 */, /*19342*/{0,1728u,8126465u,68694022u,672030728u,3774873616u,1078026564u,138443264u,262144u}/* 114B3 */, /*19343*/{0,1728u,8126465u,68694022u,672030728u,3774873616u,1078026572u,138443264u,262144u}/* 114B4 */, /*19344*/{0,1728u,8126465u,68694022u,672030728u,3774873616u,1078026580u,138443264u,262144u}/* 114B5 */, /*19345*/{0,1728u,8126465u,68694022u,672030728u,3774873616u,1078026588u,138443264u,262144u}/* 114B6 */, /*19346*/{0,1728u,8126465u,68694022u,672030728u,3774873616u,1078026596u,138443264u,262144u}/* 114B7 */, /*19347*/{0,1728u,8126465u,68694022u,672030728u,3774873616u,1078026604u,138443264u,262144u}/* 114B8 */, /*19348*/{0,1728u,8126465u,68681736u,940466184u,3758096416u,1078026608u,138443264u,262144u}/* 114B9 */, /*19349*/{0,1728u,8126466u,68694022u,672030736u,3774873616u,1078026620u,138443264u,262144u}/* 114BA */, /*19350*/{2040004608u,1728u,8126465u,68681768u,940466184u,3758096416u,1078026628u,138437120u,262144u}/* 114BB */, /*19351*/{2040528896u,1728u,8126465u,68681768u,940466184u,3758096416u,1078026636u,138437120u,262144u}/* 114BC */, /*19352*/{0,1728u,8126466u,68681736u,672030736u,3758096400u,1078026644u,138443392u,262144u}/* 114BD */, /*19353*/{2041053184u,1728u,8126465u,68681768u,940466184u,3758096416u,1078026652u,138437120u,262144u}/* 114BE */, /*19354*/{0,1728u,8126465u,68694022u,672030728u,3774873616u,1077936140u,822114816u,262144u}/* 114BF */, /*19355*/{0,1728u,8126465u,68694022u,672030728u,3774873616u,1077936140u,826309120u,262144u}/* 114C0 */, /*19356*/{0,1728u,8126465u,68681736u,940466184u,3758096416u,1077936140u,830503424u,262144u}/* 114C1 */, /*19357*/{0,1728u,8126465u,337129478u,672030728u,1627398168u,1078026660u,138442752u,262144u}/* 114C2 */, /*19358*/{0,1728u,8126465u,202911750u,672030728u,1627398160u,1077936140u,817920000u,262144u}/* 114C3 */, /*19359*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811996u,138442752u,393216u}/* 114C4 */, /*19360*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677812004u,138442752u,393216u}/* 114C5 */, /*19361*/{0,1728u,8126465u,77070359u,40u,1610612768u,9148u,138442754u,0}/* 114C6 */, /*19362*/{0,1728u,8126465u,77070341u,1515560u,3758096416u,1677811604u,138442752u,393216u}/* 114C7 */, /*19363*/{0,1728u,41681921u,85458953u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 114D0 */, /*19364*/{0,1728u,544998913u,85458953u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 114D1 */, /*19365*/{0,1728u,578554369u,85458953u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 114D2 */, /*19366*/{0,1728u,612108289u,85458953u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 114D3 */, /*19367*/{0,1728u,645664769u,85458953u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 114D4 */, /*19368*/{0,1728u,679218177u,85458953u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 114D5 */, /*19369*/{0,1728u,712775169u,85458953u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 114D6 */, /*19370*/{0,1728u,746327553u,85458953u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 114D7 */, /*19371*/{0,1728u,779885569u,85458953u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 114D8 */, /*19372*/{0,1728u,813437953u,85458953u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 114D9 */, /*19373*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812140u,138442752u,393216u}/* 11580 */, /*19374*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812148u,138442752u,393216u}/* 11581 */, /*19375*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812156u,138442752u,393216u}/* 11582 */, /*19376*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812164u,138442752u,393216u}/* 11583 */, /*19377*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812172u,138442752u,393216u}/* 11584 */, /*19378*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812180u,138442752u,393216u}/* 11585 */, /*19379*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812188u,138442752u,393216u}/* 11586 */, /*19380*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812196u,138442752u,393216u}/* 11587 */, /*19381*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812204u,138442752u,393216u}/* 11588 */, /*19382*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812212u,138442752u,393216u}/* 11589 */, /*19383*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812220u,138442752u,393216u}/* 1158A */, /*19384*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812228u,138442752u,393216u}/* 1158B */, /*19385*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812236u,138442752u,393216u}/* 1158C */, /*19386*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812244u,138442752u,393216u}/* 1158D */, /*19387*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812252u,138442752u,393216u}/* 1158E */, /*19388*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812260u,138442752u,393216u}/* 1158F */, /*19389*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812268u,138442752u,393216u}/* 11590 */, /*19390*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812276u,138442752u,393216u}/* 11591 */, /*19391*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812284u,138442752u,393216u}/* 11592 */, /*19392*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812292u,138442752u,393216u}/* 11593 */, /*19393*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812300u,138442752u,393216u}/* 11594 */, /*19394*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812308u,138442752u,393216u}/* 11595 */, /*19395*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812316u,138442752u,393216u}/* 11596 */, /*19396*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812324u,138442752u,393216u}/* 11597 */, /*19397*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812332u,138442752u,393216u}/* 11598 */, /*19398*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812340u,138442752u,393216u}/* 11599 */, /*19399*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812348u,138442752u,393216u}/* 1159A */, /*19400*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812356u,138442752u,393216u}/* 1159B */, /*19401*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812364u,138442752u,393216u}/* 1159C */, /*19402*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812372u,138442752u,393216u}/* 1159D */, /*19403*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812380u,138442752u,393216u}/* 1159E */, /*19404*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812388u,138442752u,393216u}/* 1159F */, /*19405*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812396u,138442752u,393216u}/* 115A0 */, /*19406*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812404u,138442752u,393216u}/* 115A1 */, /*19407*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812412u,138442752u,393216u}/* 115A2 */, /*19408*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812420u,138442752u,393216u}/* 115A3 */, /*19409*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812428u,138442752u,393216u}/* 115A4 */, /*19410*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812436u,138442752u,393216u}/* 115A5 */, /*19411*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812444u,138442752u,393216u}/* 115A6 */, /*19412*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812452u,138442752u,393216u}/* 115A7 */, /*19413*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812460u,138442752u,393216u}/* 115A8 */, /*19414*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812468u,138442752u,393216u}/* 115A9 */, /*19415*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812476u,138442752u,393216u}/* 115AA */, /*19416*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812484u,138442752u,393216u}/* 115AB */, /*19417*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812492u,138442752u,393216u}/* 115AC */, /*19418*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812500u,138442752u,393216u}/* 115AD */, /*19419*/{0,1736u,7995393u,77070341u,1515560u,3758096416u,1677812508u,138442752u,393216u}/* 115AE */, /*19420*/{0,1736u,7995394u,68681736u,672030736u,3758096400u,1078027044u,138443392u,262144u}/* 115AF */, /*19421*/{0,1736u,7995393u,68681736u,940466184u,3758096416u,1078027052u,138443264u,262144u}/* 115B0 */, /*19422*/{0,1736u,7995393u,68681736u,940466184u,3758096416u,1078027060u,138443264u,262144u}/* 115B1 */, /*19423*/{0,1736u,7995393u,68694022u,672030728u,3774873616u,1078027068u,138443264u,262144u}/* 115B2 */, /*19424*/{0,1736u,7995393u,68694022u,672030728u,3774873616u,1078027076u,138443264u,262144u}/* 115B3 */, /*19425*/{0,1736u,7995393u,68694022u,672030728u,3774873616u,1078027084u,138443264u,262144u}/* 115B4 */, /*19426*/{0,1736u,7995393u,68694022u,672030728u,3774873616u,1078027092u,138443264u,262144u}/* 115B5 */, /*19427*/{0,1736u,7995393u,68681736u,940466184u,3758096416u,1078027096u,138443264u,262144u}/* 115B8 */, /*19428*/{0,1736u,7995393u,68681736u,940466184u,3758096416u,1078027104u,138443264u,262144u}/* 115B9 */, /*19429*/{2041577472u,1736u,7995393u,68681768u,940466184u,3758096416u,1078027116u,138437120u,262144u}/* 115BA */, /*19430*/{2042101760u,1736u,7995393u,68681768u,940466184u,3758096416u,1078027124u,138437120u,262144u}/* 115BB */, /*19431*/{0,1736u,7995393u,68694022u,672030728u,3774873616u,1077936140u,822114816u,262144u}/* 115BC */, /*19432*/{0,1736u,7995393u,68694022u,672030728u,3774873616u,1077936140u,826309120u,262144u}/* 115BD */, /*19433*/{0,1736u,7995393u,68681736u,940466184u,3758096416u,1077936140u,830503424u,262144u}/* 115BE */, /*19434*/{0,1736u,7995393u,337129478u,672030728u,1627398168u,1078027132u,138442752u,262144u}/* 115BF */, /*19435*/{0,1736u,7995393u,202911750u,672030728u,1627398160u,1077936140u,817920000u,262144u}/* 115C0 */, /*19436*/{0,1736u,7995393u,90701847u,40u,1610612768u,9156u,138442754u,0}/* 115C1 */, /*19437*/{0,1736u,7995393u,69730327u,98344u,1610612768u,5588u,138442754u,41943040u}/* 115C2 */, /*19438*/{0,1736u,7995393u,69730327u,98344u,1610612768u,5596u,138442754u,41943040u}/* 115C3 */, /*19439*/{0,1736u,7995393u,74973207u,40u,1610612768u,9164u,138442754u,8388608u}/* 115C4 */, /*19440*/{0,1736u,7995393u,74973207u,40u,1610612768u,9172u,138442754u,8388608u}/* 115C5 */, /*19441*/{0,1736u,7995393u,77070359u,40u,1610612896u,9180u,138442754u,0}/* 115C6 */, /*19442*/{0,1736u,7995393u,77070359u,40u,1610612896u,9188u,138442754u,0}/* 115C7 */, /*19443*/{0,1736u,7995393u,77070359u,40u,1610612896u,9196u,138442754u,0}/* 115C8 */, /*19444*/{0,1736u,7995393u,69730327u,98344u,1610612768u,9204u,138442754u,41943040u}/* 115C9 */, /*19445*/{0,1736u,7995393u,69763095u,98344u,1610612768u,9212u,138442754u,41943040u}/* 115CA */, /*19446*/{0,1736u,7995393u,69763095u,98344u,1610612768u,9220u,138442754u,41943040u}/* 115CB */, /*19447*/{0,1736u,7995393u,69763095u,98344u,1610612768u,9228u,138442754u,41943040u}/* 115CC */, /*19448*/{0,1736u,7995393u,69763095u,98344u,1610612768u,9236u,138442754u,41943040u}/* 115CD */, /*19449*/{0,1736u,7995393u,69763095u,98344u,1610612768u,9244u,138442754u,41943040u}/* 115CE */, /*19450*/{0,1736u,7995393u,69763095u,98344u,1610612768u,9252u,138442754u,41943040u}/* 115CF */, /*19451*/{0,1736u,7995393u,69763095u,98344u,1610612768u,9260u,138442754u,41943040u}/* 115D0 */, /*19452*/{0,1736u,7995393u,69763095u,98344u,1610612768u,9268u,138442754u,41943040u}/* 115D1 */, /*19453*/{0,1736u,7995393u,69763095u,98344u,1610612768u,9276u,138442754u,41943040u}/* 115D2 */, /*19454*/{0,1736u,7995393u,69763095u,98344u,1610612768u,9284u,138442754u,41943040u}/* 115D3 */, /*19455*/{0,1736u,7995393u,69763095u,98344u,1610612768u,9292u,138442754u,41943040u}/* 115D4 */, /*19456*/{0,1736u,7995393u,69763095u,98344u,1610612768u,9300u,138442754u,41943040u}/* 115D5 */, /*19457*/{0,1736u,7995393u,69763095u,98344u,1610612768u,9308u,138442754u,41943040u}/* 115D6 */, /*19458*/{0,1736u,7995393u,69763095u,98344u,1610612768u,9316u,138442754u,41943040u}/* 115D7 */, /*19459*/{0,1736u,7995393u,77103109u,1515560u,3758096416u,1677812156u,1283536896u,393216u}/* 115D8 */, /*19460*/{0,1736u,7995393u,77103109u,1515560u,3758096416u,1677812156u,1287731200u,393216u}/* 115D9 */, /*19461*/{0,1736u,7995393u,77103109u,1515560u,3758096416u,1677812164u,1283536896u,393216u}/* 115DA */, /*19462*/{0,1736u,7995393u,77103109u,1515560u,3758096416u,1677812172u,1283536896u,393216u}/* 115DB */, /*19463*/{0,1736u,7995393u,68726790u,672030728u,3774873616u,1078027068u,1283537408u,262144u}/* 115DC */, /*19464*/{0,1736u,7995393u,68726790u,672030728u,3774873616u,1078027076u,1283537408u,262144u}/* 115DD */, /*19465*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812612u,138442752u,393216u}/* 11600 */, /*19466*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812620u,138442752u,393216u}/* 11601 */, /*19467*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812628u,138442752u,393216u}/* 11602 */, /*19468*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812636u,138442752u,393216u}/* 11603 */, /*19469*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812644u,138442752u,393216u}/* 11604 */, /*19470*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812652u,138442752u,393216u}/* 11605 */, /*19471*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812660u,138442752u,393216u}/* 11606 */, /*19472*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812668u,138442752u,393216u}/* 11607 */, /*19473*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812676u,138442752u,393216u}/* 11608 */, /*19474*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812684u,138442752u,393216u}/* 11609 */, /*19475*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812692u,138442752u,393216u}/* 1160A */, /*19476*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812700u,138442752u,393216u}/* 1160B */, /*19477*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812708u,138442752u,393216u}/* 1160C */, /*19478*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812716u,138442752u,393216u}/* 1160D */, /*19479*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812724u,138442752u,393216u}/* 1160E */, /*19480*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812732u,138442752u,393216u}/* 1160F */, /*19481*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812740u,138442752u,393216u}/* 11610 */, /*19482*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812748u,138442752u,393216u}/* 11611 */, /*19483*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812756u,138442752u,393216u}/* 11612 */, /*19484*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812764u,138442752u,393216u}/* 11613 */, /*19485*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812772u,138442752u,393216u}/* 11614 */, /*19486*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812780u,138442752u,393216u}/* 11615 */, /*19487*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812788u,138442752u,393216u}/* 11616 */, /*19488*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812796u,138442752u,393216u}/* 11617 */, /*19489*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812804u,138442752u,393216u}/* 11618 */, /*19490*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812812u,138442752u,393216u}/* 11619 */, /*19491*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812820u,138442752u,393216u}/* 1161A */, /*19492*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812828u,138442752u,393216u}/* 1161B */, /*19493*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812836u,138442752u,393216u}/* 1161C */, /*19494*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812844u,138442752u,393216u}/* 1161D */, /*19495*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812852u,138442752u,393216u}/* 1161E */, /*19496*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812860u,138442752u,393216u}/* 1161F */, /*19497*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812868u,138442752u,393216u}/* 11620 */, /*19498*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812876u,138442752u,393216u}/* 11621 */, /*19499*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812884u,138442752u,393216u}/* 11622 */, /*19500*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812892u,138442752u,393216u}/* 11623 */, /*19501*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812900u,138442752u,393216u}/* 11624 */, /*19502*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812908u,138442752u,393216u}/* 11625 */, /*19503*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812916u,138442752u,393216u}/* 11626 */, /*19504*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812924u,138442752u,393216u}/* 11627 */, /*19505*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812932u,138442752u,393216u}/* 11628 */, /*19506*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812940u,138442752u,393216u}/* 11629 */, /*19507*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812948u,138442752u,393216u}/* 1162A */, /*19508*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812956u,138442752u,393216u}/* 1162B */, /*19509*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812964u,138442752u,393216u}/* 1162C */, /*19510*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812972u,138442752u,393216u}/* 1162D */, /*19511*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812980u,138442752u,393216u}/* 1162E */, /*19512*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677812988u,138442752u,393216u}/* 1162F */, /*19513*/{0,1744u,7471105u,68681736u,940466184u,3758096416u,1078027524u,138443264u,262144u}/* 11630 */, /*19514*/{0,1744u,7471105u,68681736u,940466184u,3758096416u,1078027532u,138443264u,262144u}/* 11631 */, /*19515*/{0,1744u,7471105u,68681736u,940466184u,3758096416u,1078027540u,138443264u,262144u}/* 11632 */, /*19516*/{0,1744u,7471105u,68694022u,672030728u,3774873616u,1078027548u,138443264u,262144u}/* 11633 */, /*19517*/{0,1744u,7471105u,68694022u,672030728u,3774873616u,1078027556u,138443264u,262144u}/* 11634 */, /*19518*/{0,1744u,7471105u,68694022u,672030728u,3774873616u,1078027564u,138443264u,262144u}/* 11635 */, /*19519*/{0,1744u,7471105u,68694022u,672030728u,3774873616u,1078027572u,138443264u,262144u}/* 11636 */, /*19520*/{0,1744u,7471105u,68694022u,672030728u,3774873616u,1078027580u,138443264u,262144u}/* 11637 */, /*19521*/{0,1744u,7471105u,68694022u,672030728u,3774873616u,1078027588u,138443264u,262144u}/* 11638 */, /*19522*/{0,1744u,7471105u,68694022u,672030728u,3774873616u,1078027596u,138443264u,262144u}/* 11639 */, /*19523*/{0,1744u,7471105u,68694022u,672030728u,3774873616u,1078027604u,138443264u,262144u}/* 1163A */, /*19524*/{0,1744u,7471105u,68681736u,940466184u,3758096416u,1078027612u,138443264u,262144u}/* 1163B */, /*19525*/{0,1744u,7471105u,68681736u,940466184u,3758096416u,1078027620u,138443264u,262144u}/* 1163C */, /*19526*/{0,1744u,7471105u,68694022u,672030728u,3774873616u,1077936140u,826309120u,262144u}/* 1163D */, /*19527*/{0,1744u,7471105u,68681736u,940466184u,3758096416u,1077936140u,830503424u,262144u}/* 1163E */, /*19528*/{0,1744u,7471105u,337129478u,672030728u,1627398168u,1078027628u,138442752u,262144u}/* 1163F */, /*19529*/{0,1744u,7471105u,68694022u,672030728u,3774873616u,1077936140u,822114816u,262144u}/* 11640 */, /*19530*/{0,1744u,7471105u,69730327u,98344u,1610612768u,5604u,138442754u,41943040u}/* 11641 */, /*19531*/{0,1744u,7471105u,69730327u,98344u,1610612768u,5612u,138442754u,41943040u}/* 11642 */, /*19532*/{0,1744u,7471105u,77070359u,40u,1610612768u,9324u,138442754u,0}/* 11643 */, /*19533*/{0,1744u,7471105u,77070341u,1515560u,3758096416u,1677813108u,138442752u,393216u}/* 11644 */, /*19534*/{0,1744u,41026561u,85458953u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 11650 */, /*19535*/{0,1744u,544343553u,85458953u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 11651 */, /*19536*/{0,1744u,577899009u,85458953u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 11652 */, /*19537*/{0,1744u,611452929u,85458953u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 11653 */, /*19538*/{0,1744u,645009409u,85458953u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 11654 */, /*19539*/{0,1744u,678562817u,85458953u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 11655 */, /*19540*/{0,1744u,712119809u,85458953u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 11656 */, /*19541*/{0,1744u,745672193u,85458953u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 11657 */, /*19542*/{0,1744u,779230209u,85458953u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 11658 */, /*19543*/{0,1744u,812782593u,85458953u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 11659 */, /*19544*/{0,1752u,2097153u,90777623u,40u,1610612768u,7940u,138442754u,0}/* 11660 */, /*19545*/{0,1752u,2097153u,90777623u,40u,1610612768u,7948u,138442754u,0}/* 11661 */, /*19546*/{0,1752u,2097153u,90777623u,40u,1610612768u,7956u,138442754u,0}/* 11662 */, /*19547*/{0,1752u,2097153u,90777623u,40u,1610612768u,7964u,138442754u,0}/* 11663 */, /*19548*/{0,1752u,2097153u,90777623u,40u,1610612768u,7972u,138442754u,0}/* 11664 */, /*19549*/{0,1752u,2097153u,90777623u,40u,1610612768u,7980u,138442754u,0}/* 11665 */, /*19550*/{0,1752u,2097153u,90777623u,40u,1610612768u,7988u,138442754u,0}/* 11666 */, /*19551*/{0,1752u,2097153u,90777623u,40u,1610612768u,7996u,138442754u,0}/* 11667 */, /*19552*/{0,1752u,2097153u,90777623u,40u,1610612768u,8004u,138442754u,0}/* 11668 */, /*19553*/{0,1752u,2097153u,90777623u,40u,1610612768u,8012u,138442754u,0}/* 11669 */, /*19554*/{0,1752u,2097153u,90777623u,40u,1610612768u,8020u,138442754u,0}/* 1166A */, /*19555*/{0,1752u,2097153u,90777623u,40u,1610612768u,8028u,138442754u,0}/* 1166B */, /*19556*/{0,1752u,2097153u,90777623u,40u,1610612768u,8036u,138442754u,0}/* 1166C */, /*19557*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813116u,138442752u,393216u}/* 11680 */, /*19558*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813124u,138442752u,393216u}/* 11681 */, /*19559*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813132u,138442752u,393216u}/* 11682 */, /*19560*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813140u,138442752u,393216u}/* 11683 */, /*19561*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813148u,138442752u,393216u}/* 11684 */, /*19562*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813156u,138442752u,393216u}/* 11685 */, /*19563*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813164u,138442752u,393216u}/* 11686 */, /*19564*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813172u,138442752u,393216u}/* 11687 */, /*19565*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813180u,138442752u,393216u}/* 11688 */, /*19566*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813188u,138442752u,393216u}/* 11689 */, /*19567*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813220u,138442752u,393216u}/* 1168A */, /*19568*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813228u,138442752u,393216u}/* 1168B */, /*19569*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813236u,138442752u,393216u}/* 1168C */, /*19570*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813244u,138442752u,393216u}/* 1168D */, /*19571*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813252u,138442752u,393216u}/* 1168E */, /*19572*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813260u,138442752u,393216u}/* 1168F */, /*19573*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813268u,138442752u,393216u}/* 11690 */, /*19574*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813276u,138442752u,393216u}/* 11691 */, /*19575*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813284u,138442752u,393216u}/* 11692 */, /*19576*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813292u,138442752u,393216u}/* 11693 */, /*19577*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813300u,138442752u,393216u}/* 11694 */, /*19578*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813308u,138442752u,393216u}/* 11695 */, /*19579*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813316u,138442752u,393216u}/* 11696 */, /*19580*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813324u,138442752u,393216u}/* 11697 */, /*19581*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813332u,138442752u,393216u}/* 11698 */, /*19582*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813340u,138442752u,393216u}/* 11699 */, /*19583*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813348u,138442752u,393216u}/* 1169A */, /*19584*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813356u,138442752u,393216u}/* 1169B */, /*19585*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813364u,138442752u,393216u}/* 1169C */, /*19586*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813372u,138442752u,393216u}/* 1169D */, /*19587*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813380u,138442752u,393216u}/* 1169E */, /*19588*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813388u,138442752u,393216u}/* 1169F */, /*19589*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813396u,138442752u,393216u}/* 116A0 */, /*19590*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813404u,138442752u,393216u}/* 116A1 */, /*19591*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813412u,138442752u,393216u}/* 116A2 */, /*19592*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813420u,138442752u,393216u}/* 116A3 */, /*19593*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813428u,138442752u,393216u}/* 116A4 */, /*19594*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813436u,138442752u,393216u}/* 116A5 */, /*19595*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813444u,138442752u,393216u}/* 116A6 */, /*19596*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813204u,138442752u,393216u}/* 116A7 */, /*19597*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813196u,138442752u,393216u}/* 116A8 */, /*19598*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813212u,138442752u,393216u}/* 116A9 */, /*19599*/{0,1760u,6684673u,76972037u,1515560u,3758096416u,1677813452u,138442752u,393216u}/* 116AA */, /*19600*/{0,1760u,6684673u,68595718u,672030728u,3774873616u,1077936140u,826309120u,262144u}/* 116AB */, /*19601*/{0,1760u,6684673u,68583432u,940466184u,3758096416u,1077936140u,830503424u,262144u}/* 116AC */, /*19602*/{0,1760u,6684673u,68595718u,672030728u,3774873616u,1078027988u,138443264u,262144u}/* 116AD */, /*19603*/{0,1760u,6684673u,68583432u,940466184u,3758096416u,1078027996u,138443264u,262144u}/* 116AE */, /*19604*/{0,1760u,6684673u,68583432u,940466184u,3758096416u,1078028004u,138443264u,262144u}/* 116AF */, /*19605*/{0,1760u,6684673u,68595718u,672030728u,3774873616u,1078028012u,138443264u,262144u}/* 116B0 */, /*19606*/{0,1760u,6684673u,68595718u,672030728u,3774873616u,1078028020u,138443264u,262144u}/* 116B1 */, /*19607*/{0,1760u,6684673u,68595718u,672030728u,3774873616u,1078028028u,138443264u,262144u}/* 116B2 */, /*19608*/{0,1760u,6684673u,68595718u,672030728u,3774873616u,1078028036u,138443264u,262144u}/* 116B3 */, /*19609*/{0,1760u,6684673u,68595718u,672030728u,3774873616u,1078028044u,138443264u,262144u}/* 116B4 */, /*19610*/{0,1760u,6684673u,68595718u,672030728u,3774873616u,1078028052u,138443264u,262144u}/* 116B5 */, /*19611*/{0,1760u,6684673u,337018888u,940466184u,1610620968u,1078028060u,138442752u,262144u}/* 116B6 */, /*19612*/{0,1760u,6684673u,202813446u,672030728u,1627398160u,1077936140u,817920000u,262144u}/* 116B7 */, /*19613*/{0,1760u,40240129u,85360649u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 116C0 */, /*19614*/{0,1760u,543557121u,85360649u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 116C1 */, /*19615*/{0,1760u,577112577u,85360649u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 116C2 */, /*19616*/{0,1760u,610666497u,85360649u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 116C3 */, /*19617*/{0,1760u,644222977u,85360649u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 116C4 */, /*19618*/{0,1760u,677776385u,85360649u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 116C5 */, /*19619*/{0,1760u,711333377u,85360649u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 116C6 */, /*19620*/{0,1760u,744885761u,85360649u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 116C7 */, /*19621*/{0,1760u,778443777u,85360649u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 116C8 */, /*19622*/{0,1760u,811996161u,85360649u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 116C9 */, /*19623*/{0,1768u,8257537u,92831749u,73768u,3758096416u,1677813540u,138442752u,393216u}/* 11700 */, /*19624*/{0,1768u,8257537u,92831749u,73768u,3758096416u,1677813548u,138442752u,393216u}/* 11701 */, /*19625*/{0,1768u,8257537u,92831749u,73768u,3758096416u,1677813556u,138442752u,393216u}/* 11702 */, /*19626*/{0,1768u,8257537u,92831749u,73768u,3758096416u,1677813564u,138442752u,393216u}/* 11703 */, /*19627*/{0,1768u,8257537u,92831749u,73768u,3758096416u,1677813572u,138442752u,393216u}/* 11704 */, /*19628*/{0,1768u,8257537u,92831749u,73768u,3758096416u,1677813572u,1283536896u,393216u}/* 11705 */, /*19629*/{0,1768u,8257537u,92831749u,73768u,3758096416u,1677813580u,138442752u,393216u}/* 11706 */, /*19630*/{0,1768u,8257537u,92831749u,73768u,3758096416u,1677813588u,138442752u,393216u}/* 11707 */, /*19631*/{0,1768u,8257537u,92831749u,73768u,3758096416u,1677813596u,138442752u,393216u}/* 11708 */, /*19632*/{0,1768u,8257537u,92831749u,73768u,3758096416u,1677813604u,138442752u,393216u}/* 11709 */, /*19633*/{0,1768u,8257537u,92831749u,73768u,3758096416u,1677813612u,138442752u,393216u}/* 1170A */, /*19634*/{0,1768u,8257537u,92831749u,73768u,3758096416u,1677813620u,138442752u,393216u}/* 1170B */, /*19635*/{0,1768u,8257537u,92831749u,73768u,3758096416u,1677813628u,138442752u,393216u}/* 1170C */, /*19636*/{0,1768u,8257537u,92831749u,73768u,3758096416u,1677813636u,138442752u,393216u}/* 1170D */, /*19637*/{0,1768u,8257537u,92831749u,73768u,3758096416u,1677813644u,138442752u,393216u}/* 1170E */, /*19638*/{0,1768u,8257537u,92831749u,73768u,3758096416u,1677813652u,138442752u,393216u}/* 1170F */, /*19639*/{0,1768u,8257537u,92831749u,73768u,3758096416u,1677813660u,138442752u,393216u}/* 11710 */, /*19640*/{0,1768u,8257537u,92831749u,73768u,3758096416u,1677813668u,138442752u,393216u}/* 11711 */, /*19641*/{0,1768u,8257537u,92831749u,73768u,3758096416u,1677813676u,138442752u,393216u}/* 11712 */, /*19642*/{0,1768u,8257537u,92831749u,73768u,3758096416u,1677813684u,138442752u,393216u}/* 11713 */, /*19643*/{0,1768u,8257537u,92831749u,73768u,3758096416u,1677813692u,138442752u,393216u}/* 11714 */, /*19644*/{0,1768u,8257537u,92831749u,73768u,3758096416u,1677813700u,138442752u,393216u}/* 11715 */, /*19645*/{0,1768u,8257537u,92831749u,73768u,3758096416u,1677813700u,1283536896u,393216u}/* 11716 */, /*19646*/{0,1768u,8257537u,92831749u,73768u,3758096416u,1677813708u,138442752u,393216u}/* 11717 */, /*19647*/{0,1768u,8257537u,92831749u,73768u,3758096416u,1677813716u,138442752u,393216u}/* 11718 */, /*19648*/{0,1768u,8257537u,92831749u,73768u,3758096416u,1677813724u,138442752u,393216u}/* 11719 */, /*19649*/{0,1768u,8257537u,92844038u,672030728u,3774873616u,1078028356u,138443264u,262144u}/* 1171D */, /*19650*/{0,1768u,8257537u,92844038u,672030728u,3774873616u,1078028364u,138443264u,262144u}/* 1171E */, /*19651*/{0,1768u,8257537u,92844038u,672030728u,3774873616u,1078028372u,138443264u,262144u}/* 1171F */, /*19652*/{0,1768u,8257537u,92831752u,940466184u,3758096416u,1078028260u,138443264u,262144u}/* 11720 */, /*19653*/{0,1768u,8257537u,92831752u,940466184u,3758096416u,1078028268u,138443264u,262144u}/* 11721 */, /*19654*/{0,1768u,8257537u,92844038u,672030728u,3774873616u,1078028276u,138443264u,262144u}/* 11722 */, /*19655*/{0,1768u,8257537u,92844038u,672030728u,3774873616u,1078028284u,138443264u,262144u}/* 11723 */, /*19656*/{0,1768u,8257537u,92844038u,672030728u,3774873616u,1078028292u,138443264u,262144u}/* 11724 */, /*19657*/{0,1768u,8257537u,92844038u,672030728u,3774873616u,1078028300u,138443264u,262144u}/* 11725 */, /*19658*/{0,1768u,8257537u,92831752u,940466184u,3758096416u,1078028308u,138443264u,262144u}/* 11726 */, /*19659*/{0,1768u,8257537u,92844038u,672030728u,3774873616u,1078028316u,138443264u,262144u}/* 11727 */, /*19660*/{0,1768u,8257537u,92844038u,672030728u,3774873616u,1078028324u,138443264u,262144u}/* 11728 */, /*19661*/{0,1768u,8257537u,92844038u,672030728u,3774873616u,1078028332u,138443264u,262144u}/* 11729 */, /*19662*/{0,1768u,8257537u,92844038u,672030728u,3774873616u,1078028340u,138443264u,262144u}/* 1172A */, /*19663*/{0,1768u,8257537u,361279494u,672030728u,1627398168u,1078028348u,138442752u,262144u}/* 1172B */, /*19664*/{0,1768u,41812993u,85491721u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 11730 */, /*19665*/{0,1768u,545129985u,85491721u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 11731 */, /*19666*/{0,1768u,578685441u,85491721u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 11732 */, /*19667*/{0,1768u,612239361u,85491721u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 11733 */, /*19668*/{0,1768u,645795841u,85491721u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 11734 */, /*19669*/{0,1768u,679349249u,85491721u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 11735 */, /*19670*/{0,1768u,712906241u,85491721u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 11736 */, /*19671*/{0,1768u,746458625u,85491721u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 11737 */, /*19672*/{0,1768u,780016641u,85491721u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 11738 */, /*19673*/{0,1768u,813569025u,85491721u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 11739 */, /*19674*/{0,1768u,830349313u,92831755u,8388650u,1610612768u,57013u,138442752u,0}/* 1173A */, /*19675*/{0,1768u,998124545u,92831755u,8388650u,1610612768u,57021u,138442752u,0}/* 1173B */, /*19676*/{0,1768u,8257537u,69763095u,98344u,1610612768u,5620u,138442754u,41943040u}/* 1173C */, /*19677*/{0,1768u,8257537u,69763095u,98344u,1610612768u,5628u,138442754u,41943040u}/* 1173D */, /*19678*/{0,1768u,8257537u,69763095u,98344u,1610612768u,5964u,138442754u,41943040u}/* 1173E */, /*19679*/{0,1768u,8257537u,92831771u,40u,1610612768u,11068u,138442752u,67108864u}/* 1173F */, /*19680*/{318720u,2583693040u,8192001u,77070337u,1507368u,3807903776u,1711417740u,138491904u,2490368u}/* 118A0 */, /*19681*/{318848u,2585790192u,8192001u,77070337u,1507368u,3807903776u,1711417748u,138491904u,2490368u}/* 118A1 */, /*19682*/{318976u,2587887344u,8192001u,77070337u,1507368u,3807903776u,1711417756u,138491904u,2490368u}/* 118A2 */, /*19683*/{319104u,2589984496u,8192001u,77070337u,1507368u,3807903776u,1711417764u,138491904u,2490368u}/* 118A3 */, /*19684*/{319232u,2592081648u,8192001u,77070337u,1507368u,3807903776u,1711417772u,138491904u,2490368u}/* 118A4 */, /*19685*/{319360u,2594178800u,8192001u,77070337u,1507368u,3807903776u,1711417780u,138491904u,2490368u}/* 118A5 */, /*19686*/{319488u,2596275952u,8192001u,77070337u,1507368u,3807903776u,1711417788u,138491904u,2490368u}/* 118A6 */, /*19687*/{319616u,2598373104u,8192001u,77070337u,1507368u,3807903776u,1711417796u,138491904u,2490368u}/* 118A7 */, /*19688*/{319744u,2600470256u,8192001u,77070337u,1507368u,3807903776u,1711417804u,138491904u,2490368u}/* 118A8 */, /*19689*/{319872u,2602567408u,8192001u,77070337u,1507368u,3807903776u,1711417812u,138491904u,2490368u}/* 118A9 */, /*19690*/{320000u,2604664560u,8192001u,77070337u,1507368u,3807903776u,1711417820u,138491904u,2490368u}/* 118AA */, /*19691*/{320128u,2606761712u,8192001u,77070337u,1507368u,3807903776u,1711417828u,138491904u,2490368u}/* 118AB */, /*19692*/{320256u,2608858864u,8192001u,77070337u,1507368u,3807903776u,1711417836u,138491904u,2490368u}/* 118AC */, /*19693*/{320384u,2610956016u,8192001u,77070337u,1507368u,3807903776u,1711417844u,138491904u,2490368u}/* 118AD */, /*19694*/{320512u,2613053168u,8192001u,77070337u,1507368u,3807903776u,1711417852u,138491904u,2490368u}/* 118AE */, /*19695*/{320640u,2615150320u,8192001u,77070337u,1507368u,3807903776u,1711417860u,138491904u,2490368u}/* 118AF */, /*19696*/{320768u,2617247472u,8192001u,77070337u,1507368u,3807903776u,1711417868u,138491904u,2490368u}/* 118B0 */, /*19697*/{320896u,2619344624u,8192001u,77070337u,1507368u,3807903776u,1711417876u,138491904u,2490368u}/* 118B1 */, /*19698*/{321024u,2621441776u,8192001u,77070337u,1507368u,3807903776u,1711417884u,138491904u,2490368u}/* 118B2 */, /*19699*/{321152u,2623538928u,8192001u,77070337u,1507368u,3807903776u,1711417892u,138491904u,2490368u}/* 118B3 */, /*19700*/{321280u,2625636080u,8192001u,77070337u,1507368u,3807903776u,1711417900u,138491904u,2490368u}/* 118B4 */, /*19701*/{321408u,2627733232u,8192001u,77070337u,1507368u,3807903776u,1711417908u,138491904u,2490368u}/* 118B5 */, /*19702*/{321536u,2629830384u,8192001u,77070337u,1507368u,3807903776u,1711417916u,138491904u,2490368u}/* 118B6 */, /*19703*/{321664u,2631927536u,8192001u,77070337u,1507368u,3807903776u,1711417924u,138491904u,2490368u}/* 118B7 */, /*19704*/{321792u,2634024688u,8192001u,77070337u,1507368u,3807903776u,1711417932u,138491904u,2490368u}/* 118B8 */, /*19705*/{321920u,2636121840u,8192001u,77070337u,1507368u,3807903776u,1711417940u,138491904u,2490368u}/* 118B9 */, /*19706*/{322048u,2638218992u,8192001u,77070337u,1507368u,3807903776u,1711417948u,138491904u,2490368u}/* 118BA */, /*19707*/{322176u,2640316144u,8192001u,77070337u,1507368u,3807903776u,1711417956u,138491904u,2490368u}/* 118BB */, /*19708*/{322304u,2642413296u,8192001u,77070337u,1507368u,3807903776u,1711417964u,138491904u,2490368u}/* 118BC */, /*19709*/{322432u,2644510448u,8192001u,77070337u,1507368u,3807903776u,1711417972u,138491904u,2490368u}/* 118BD */, /*19710*/{322560u,2646607600u,8192001u,77070337u,1507368u,3807903776u,1711417980u,138491904u,2490368u}/* 118BE */, /*19711*/{322688u,2648704752u,8192001u,77070337u,1507368u,3807903776u,1711417988u,138491904u,2490368u}/* 118BF */, /*19712*/{322816u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806348u,138442752u,393216u}/* 118C0 */, /*19713*/{322944u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806356u,138442752u,393216u}/* 118C1 */, /*19714*/{323072u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806364u,138442752u,393216u}/* 118C2 */, /*19715*/{323200u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806372u,138442752u,393216u}/* 118C3 */, /*19716*/{323328u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806380u,138442752u,393216u}/* 118C4 */, /*19717*/{323456u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806388u,138442752u,393216u}/* 118C5 */, /*19718*/{323584u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806396u,138442752u,393216u}/* 118C6 */, /*19719*/{323712u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806404u,138442752u,393216u}/* 118C7 */, /*19720*/{323840u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806412u,138442752u,393216u}/* 118C8 */, /*19721*/{323968u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806420u,138442752u,393216u}/* 118C9 */, /*19722*/{324096u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806428u,138442752u,393216u}/* 118CA */, /*19723*/{324224u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806436u,138442752u,393216u}/* 118CB */, /*19724*/{324352u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806444u,138442752u,393216u}/* 118CC */, /*19725*/{324480u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806452u,138442752u,393216u}/* 118CD */, /*19726*/{324608u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806460u,138442752u,393216u}/* 118CE */, /*19727*/{324736u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806468u,138442752u,393216u}/* 118CF */, /*19728*/{324864u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806476u,138442752u,393216u}/* 118D0 */, /*19729*/{324992u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806484u,138442752u,393216u}/* 118D1 */, /*19730*/{325120u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806492u,138442752u,393216u}/* 118D2 */, /*19731*/{325248u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806500u,138442752u,393216u}/* 118D3 */, /*19732*/{325376u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806508u,138442752u,393216u}/* 118D4 */, /*19733*/{325504u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806516u,138442752u,393216u}/* 118D5 */, /*19734*/{325632u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806524u,138442752u,393216u}/* 118D6 */, /*19735*/{325760u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806532u,138442752u,393216u}/* 118D7 */, /*19736*/{325888u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806540u,138442752u,393216u}/* 118D8 */, /*19737*/{326016u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806548u,138442752u,393216u}/* 118D9 */, /*19738*/{326144u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806556u,138442752u,393216u}/* 118DA */, /*19739*/{326272u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806564u,138442752u,393216u}/* 118DB */, /*19740*/{326400u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806572u,138442752u,393216u}/* 118DC */, /*19741*/{326528u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806580u,138442752u,393216u}/* 118DD */, /*19742*/{326656u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806588u,138442752u,393216u}/* 118DE */, /*19743*/{326784u,1776u,8192001u,77070338u,1499176u,3768975392u,1719806596u,138442752u,393216u}/* 118DF */, /*19744*/{0,1776u,41747457u,85458953u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 118E0 */, /*19745*/{0,1776u,545064449u,85458953u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 118E1 */, /*19746*/{0,1776u,578619905u,85458953u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 118E2 */, /*19747*/{0,1776u,612173825u,85458953u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 118E3 */, /*19748*/{0,1776u,645730305u,85458953u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 118E4 */, /*19749*/{0,1776u,679283713u,85458953u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 118E5 */, /*19750*/{0,1776u,712840705u,85458953u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 118E6 */, /*19751*/{0,1776u,746393089u,85458953u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 118E7 */, /*19752*/{0,1776u,779951105u,85458953u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 118E8 */, /*19753*/{0,1776u,813503489u,85458953u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 118E9 */, /*19754*/{0,1776u,830283777u,77070347u,8388650u,1610612768u,57317u,138442752u,0}/* 118EA */, /*19755*/{0,1776u,998059009u,77070347u,8388650u,1610612768u,57325u,138442752u,0}/* 118EB */, /*19756*/{0,1776u,1165836289u,77070347u,8388650u,1610612768u,57333u,138442752u,0}/* 118EC */, /*19757*/{0,1776u,1333613569u,77070347u,8388650u,1610612768u,57341u,138442752u,0}/* 118ED */, /*19758*/{0,1776u,1501390849u,77070347u,8388650u,1610612768u,57349u,138442752u,0}/* 118EE */, /*19759*/{0,1776u,1518168577u,77070347u,8388650u,1610612768u,57357u,138442752u,0}/* 118EF */, /*19760*/{0,1776u,1534946305u,77070347u,8388650u,1610612768u,57365u,138442752u,0}/* 118F0 */, /*19761*/{0,1776u,1551724033u,77070347u,8388650u,1610612768u,57373u,138442752u,0}/* 118F1 */, /*19762*/{0,1776u,1568501761u,77070347u,8388650u,1610612768u,57381u,138442752u,0}/* 118F2 */, /*19763*/{0,1776u,8192001u,77070341u,1515560u,3758096416u,1677863300u,138442752u,393216u}/* 118FF */, /*19764*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818596u,138442752u,393216u}/* 11A00 */, /*19765*/{0,1784u,9240577u,68792326u,672030728u,3774873616u,1078033132u,138443264u,262144u}/* 11A01 */, /*19766*/{0,1784u,9240577u,68792326u,672030728u,3774873616u,1078033140u,138443264u,262144u}/* 11A02 */, /*19767*/{0,1784u,9240577u,68792326u,672030728u,3774873616u,1078033148u,138443264u,262144u}/* 11A03 */, /*19768*/{0,1784u,9240577u,68792326u,672030728u,3774873616u,1078033156u,138443264u,262144u}/* 11A04 */, /*19769*/{0,1784u,9240577u,68792326u,672030728u,3774873616u,1078033164u,138443264u,262144u}/* 11A05 */, /*19770*/{0,1784u,9240577u,68792326u,672030728u,3774873616u,1078033172u,138443264u,262144u}/* 11A06 */, /*19771*/{0,1784u,9240577u,68780040u,940466184u,3758096416u,1078033180u,138443264u,262144u}/* 11A07 */, /*19772*/{0,1784u,9240577u,68780040u,940466184u,3758096416u,1078033188u,138443264u,262144u}/* 11A08 */, /*19773*/{0,1784u,9240577u,68792326u,672030728u,3774873616u,1078033196u,138443264u,262144u}/* 11A09 */, /*19774*/{0,1784u,9240577u,68792326u,672030728u,3774873616u,1078033204u,138443264u,262144u}/* 11A0A */, /*19775*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818276u,138442752u,393216u}/* 11A0B */, /*19776*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818292u,138442752u,393216u}/* 11A0C */, /*19777*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818300u,138442752u,393216u}/* 11A0D */, /*19778*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818308u,138442752u,393216u}/* 11A0E */, /*19779*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818316u,138442752u,393216u}/* 11A0F */, /*19780*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818324u,138442752u,393216u}/* 11A10 */, /*19781*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818332u,138442752u,393216u}/* 11A11 */, /*19782*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818340u,138442752u,393216u}/* 11A12 */, /*19783*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818348u,138442752u,393216u}/* 11A13 */, /*19784*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818356u,138442752u,393216u}/* 11A14 */, /*19785*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818364u,138442752u,393216u}/* 11A15 */, /*19786*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818372u,138442752u,393216u}/* 11A16 */, /*19787*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818380u,138442752u,393216u}/* 11A17 */, /*19788*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818388u,138442752u,393216u}/* 11A18 */, /*19789*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818396u,138442752u,393216u}/* 11A19 */, /*19790*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818404u,138442752u,393216u}/* 11A1A */, /*19791*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818412u,138442752u,393216u}/* 11A1B */, /*19792*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818420u,138442752u,393216u}/* 11A1C */, /*19793*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818428u,138442752u,393216u}/* 11A1D */, /*19794*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818436u,138442752u,393216u}/* 11A1E */, /*19795*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818444u,138442752u,393216u}/* 11A1F */, /*19796*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818452u,138442752u,393216u}/* 11A20 */, /*19797*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818460u,138442752u,393216u}/* 11A21 */, /*19798*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818468u,138442752u,393216u}/* 11A22 */, /*19799*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818476u,138442752u,393216u}/* 11A23 */, /*19800*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818484u,138442752u,393216u}/* 11A24 */, /*19801*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818492u,138442752u,393216u}/* 11A25 */, /*19802*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818500u,138442752u,393216u}/* 11A26 */, /*19803*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818508u,138442752u,393216u}/* 11A27 */, /*19804*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818516u,138442752u,393216u}/* 11A28 */, /*19805*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818524u,138442752u,393216u}/* 11A29 */, /*19806*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818532u,138442752u,393216u}/* 11A2A */, /*19807*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818540u,138442752u,393216u}/* 11A2B */, /*19808*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818548u,138442752u,393216u}/* 11A2C */, /*19809*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818556u,138442752u,393216u}/* 11A2D */, /*19810*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818564u,138442752u,393216u}/* 11A2E */, /*19811*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818572u,138442752u,393216u}/* 11A2F */, /*19812*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818580u,138442752u,393216u}/* 11A30 */, /*19813*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818588u,138442752u,393216u}/* 11A31 */, /*19814*/{0,1784u,9240577u,77168645u,1515560u,3758096416u,1677818284u,138442752u,393216u}/* 11A32 */, /*19815*/{0,1784u,9240577u,68792326u,672030728u,1627389968u,1077936140u,817920000u,262144u}/* 11A33 */, /*19816*/{0,1784u,9240577u,337227782u,672030728u,1627398168u,1078033212u,138442752u,262144u}/* 11A34 */, /*19817*/{0,1784u,9240577u,68792326u,672030728u,3774873616u,1077936140u,822114816u,262144u}/* 11A35 */, /*19818*/{0,1784u,9240577u,68792326u,672030728u,3774873616u,1077936140u,826309120u,262144u}/* 11A38 */, /*19819*/{0,1784u,9240577u,68780040u,940466184u,3758096416u,1077936140u,830503424u,262144u}/* 11A39 */, /*19820*/{0,1784u,9240577u,77168645u,135733256u,3758096416u,1677818540u,138614784u,393216u}/* 11A3A */, /*19821*/{0,1784u,9240577u,68792326u,672030728u,3774873616u,1078033060u,138631680u,262144u}/* 11A3B */, /*19822*/{0,1784u,9240577u,68792326u,672030728u,3774873616u,1078033068u,138631680u,262144u}/* 11A3C */, /*19823*/{0,1784u,9240577u,68792326u,672030728u,3774873616u,1078033076u,138631680u,262144u}/* 11A3D */, /*19824*/{0,1784u,9240577u,68792326u,672030728u,3774873616u,1078033084u,138631680u,262144u}/* 11A3E */, /*19825*/{0,1784u,9240577u,90800151u,40u,1610612768u,8324u,138442754u,0}/* 11A3F */, /*19826*/{0,1784u,9240577u,77168663u,40u,1610612768u,8332u,138442754u,0}/* 11A40 */, /*19827*/{0,1784u,9240577u,69828631u,40u,1610612768u,8340u,138442754u,0}/* 11A41 */, /*19828*/{0,1784u,9240577u,69828631u,98344u,1610612768u,8348u,138442754u,41943040u}/* 11A42 */, /*19829*/{0,1784u,9240577u,69828631u,98344u,1610612768u,8356u,138442754u,41943040u}/* 11A43 */, /*19830*/{0,1784u,9240577u,69828631u,40u,1610612768u,8364u,138442754u,0}/* 11A44 */, /*19831*/{0,1784u,9240577u,90800151u,40u,1610612768u,8372u,138442754u,0}/* 11A45 */, /*19832*/{0,1784u,9240577u,77168663u,40u,1610612768u,8380u,138442754u,0}/* 11A46 */, /*19833*/{0,1784u,9240577u,337227782u,672030728u,1627398168u,1078033220u,138442752u,262144u}/* 11A47 */, /*19834*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677818700u,138442752u,393216u}/* 11A50 */, /*19835*/{0,1792u,9175041u,68792326u,672030728u,3774873616u,1078033236u,138443264u,262144u}/* 11A51 */, /*19836*/{0,1792u,9175041u,68792326u,672030728u,3774873616u,1078033244u,138443264u,262144u}/* 11A52 */, /*19837*/{0,1792u,9175041u,68792326u,672030728u,3774873616u,1078033252u,138443264u,262144u}/* 11A53 */, /*19838*/{0,1792u,9175041u,68792326u,672030728u,3774873616u,1078033276u,138443264u,262144u}/* 11A54 */, /*19839*/{0,1792u,9175041u,68792326u,672030728u,3774873616u,1078033292u,138443264u,262144u}/* 11A55 */, /*19840*/{0,1792u,9175041u,68792326u,672030728u,3774873616u,1078033284u,138443264u,262144u}/* 11A56 */, /*19841*/{0,1792u,9175041u,68780040u,940466184u,3758096416u,1078033300u,138443264u,262144u}/* 11A57 */, /*19842*/{0,1792u,9175041u,68780040u,940466184u,3758096416u,1078033308u,138443264u,262144u}/* 11A58 */, /*19843*/{0,1792u,9175041u,68792326u,672030728u,3774873616u,1078033260u,138443264u,262144u}/* 11A59 */, /*19844*/{0,1792u,9175041u,68792326u,672030728u,3774873616u,1078033268u,138443264u,262144u}/* 11A5A */, /*19845*/{0,1792u,9175041u,68792326u,672030728u,3774873616u,1078033316u,138443264u,262144u}/* 11A5B */, /*19846*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677818796u,138442752u,393216u}/* 11A5C */, /*19847*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677818812u,138442752u,393216u}/* 11A5D */, /*19848*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677818820u,138442752u,393216u}/* 11A5E */, /*19849*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677818828u,138442752u,393216u}/* 11A5F */, /*19850*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677818836u,138442752u,393216u}/* 11A60 */, /*19851*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677818844u,138442752u,393216u}/* 11A61 */, /*19852*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677818852u,138442752u,393216u}/* 11A62 */, /*19853*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677818860u,138442752u,393216u}/* 11A63 */, /*19854*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677818868u,138442752u,393216u}/* 11A64 */, /*19855*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677818876u,138442752u,393216u}/* 11A65 */, /*19856*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677818884u,138442752u,393216u}/* 11A66 */, /*19857*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677818892u,138442752u,393216u}/* 11A67 */, /*19858*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677818900u,138442752u,393216u}/* 11A68 */, /*19859*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677818908u,138442752u,393216u}/* 11A69 */, /*19860*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677818916u,138442752u,393216u}/* 11A6A */, /*19861*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677818924u,138442752u,393216u}/* 11A6B */, /*19862*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677818932u,138442752u,393216u}/* 11A6C */, /*19863*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677818940u,138442752u,393216u}/* 11A6D */, /*19864*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677818948u,138442752u,393216u}/* 11A6E */, /*19865*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677818956u,138442752u,393216u}/* 11A6F */, /*19866*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677818964u,138442752u,393216u}/* 11A70 */, /*19867*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677818972u,138442752u,393216u}/* 11A71 */, /*19868*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677818980u,138442752u,393216u}/* 11A72 */, /*19869*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677818988u,138442752u,393216u}/* 11A73 */, /*19870*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677818996u,138442752u,393216u}/* 11A74 */, /*19871*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677819004u,138442752u,393216u}/* 11A75 */, /*19872*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677819012u,138442752u,393216u}/* 11A76 */, /*19873*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677819020u,138442752u,393216u}/* 11A77 */, /*19874*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677819028u,138442752u,393216u}/* 11A78 */, /*19875*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677819036u,138442752u,393216u}/* 11A79 */, /*19876*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677819044u,138442752u,393216u}/* 11A7A */, /*19877*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677819052u,138442752u,393216u}/* 11A7B */, /*19878*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677819060u,138442752u,393216u}/* 11A7C */, /*19879*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677819068u,138442752u,393216u}/* 11A7D */, /*19880*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677819076u,138442752u,393216u}/* 11A7E */, /*19881*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677819084u,138442752u,393216u}/* 11A7F */, /*19882*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677819092u,138442752u,393216u}/* 11A80 */, /*19883*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677819100u,138442752u,393216u}/* 11A81 */, /*19884*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677819108u,138442752u,393216u}/* 11A82 */, /*19885*/{0,1792u,9175041u,77168645u,1515560u,3758096416u,1677818804u,138442752u,393216u}/* 11A83 */, /*19886*/{0,1792u,9175041u,77168645u,135733256u,3758096416u,1677819060u,138614784u,393216u}/* 11A86 */, /*19887*/{0,1792u,9175041u,77168645u,135733256u,3758096416u,1677819068u,138614784u,393216u}/* 11A87 */, /*19888*/{0,1792u,9175041u,77168645u,135733256u,3758096416u,1677819084u,138614784u,393216u}/* 11A88 */, /*19889*/{0,1792u,9175041u,77168645u,135733256u,3758096416u,1677819100u,138614784u,393216u}/* 11A89 */, /*19890*/{0,1792u,9175041u,68792326u,672030728u,3774873616u,1078033324u,138631680u,262144u}/* 11A8A */, /*19891*/{0,1792u,9175041u,68792326u,672030728u,3774873616u,1078033340u,138631680u,262144u}/* 11A8B */, /*19892*/{0,1792u,9175041u,68792326u,672030728u,3774873616u,1078033364u,138631680u,262144u}/* 11A8C */, /*19893*/{0,1792u,9175041u,68792326u,672030728u,3774873616u,1078033452u,138631680u,262144u}/* 11A8D */, /*19894*/{0,1792u,9175041u,68792326u,672030728u,3774873616u,1078033484u,138631680u,262144u}/* 11A8E */, /*19895*/{0,1792u,9175041u,68792326u,672030728u,3774873616u,1078033492u,138631680u,262144u}/* 11A8F */, /*19896*/{0,1792u,9175041u,68792326u,672030728u,3774873616u,1078033524u,138631680u,262144u}/* 11A90 */, /*19897*/{0,1792u,9175041u,68792326u,672030728u,3774873616u,1078033588u,138631680u,262144u}/* 11A91 */, /*19898*/{0,1792u,9175041u,68792326u,672030728u,3774873616u,1078033596u,138631680u,262144u}/* 11A92 */, /*19899*/{0,1792u,9175041u,68792326u,672030728u,3774873616u,1078033612u,138631680u,262144u}/* 11A93 */, /*19900*/{0,1792u,9175041u,68792326u,672030728u,3774873616u,1078033628u,138631680u,262144u}/* 11A94 */, /*19901*/{0,1792u,9175041u,68792326u,672030728u,3774873616u,1078033572u,138631680u,262144u}/* 11A95 */, /*19902*/{0,1792u,9175041u,68792326u,672030728u,3774873616u,1077936140u,826309120u,262144u}/* 11A96 */, /*19903*/{0,1792u,9175041u,68780040u,940466184u,3758096416u,1077936140u,830503424u,262144u}/* 11A97 */, /*19904*/{0,1792u,9175041u,68792326u,672030728u,1627390096u,1077936140u,880834560u,262144u}/* 11A98 */, /*19905*/{0,1792u,9175041u,337227782u,672030728u,1627398168u,1078033644u,138442752u,262144u}/* 11A99 */, /*19906*/{0,1792u,9175041u,69828631u,40u,1610612768u,8388u,138442754u,0}/* 11A9A */, /*19907*/{0,1792u,9175041u,69828631u,98344u,1610612768u,8396u,138442754u,41943040u}/* 11A9B */, /*19908*/{0,1792u,9175041u,69828631u,98344u,1610612768u,8404u,138442754u,41943040u}/* 11A9C */, /*19909*/{0,1792u,9175041u,90800151u,40u,1610612768u,8412u,138442754u,0}/* 11A9E */, /*19910*/{0,1792u,9175041u,90800151u,40u,1610612768u,8420u,138442754u,0}/* 11A9F */, /*19911*/{0,1792u,9175041u,90800151u,40u,1610612768u,8428u,138442754u,0}/* 11AA0 */, /*19912*/{0,1792u,9175041u,69828631u,40u,1610612768u,8436u,138442754u,8388608u}/* 11AA1 */, /*19913*/{0,1792u,9175041u,69828631u,40u,1610612768u,8444u,138442754u,8388608u}/* 11AA2 */, /*19914*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863620u,138442752u,393216u}/* 11AC0 */, /*19915*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863628u,138442752u,393216u}/* 11AC1 */, /*19916*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863636u,138442752u,393216u}/* 11AC2 */, /*19917*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863644u,138442752u,393216u}/* 11AC3 */, /*19918*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863652u,138442752u,393216u}/* 11AC4 */, /*19919*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863660u,138442752u,393216u}/* 11AC5 */, /*19920*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863668u,138442752u,393216u}/* 11AC6 */, /*19921*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863676u,138442752u,393216u}/* 11AC7 */, /*19922*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863684u,138442752u,393216u}/* 11AC8 */, /*19923*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863692u,138442752u,393216u}/* 11AC9 */, /*19924*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863700u,138442752u,393216u}/* 11ACA */, /*19925*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863708u,138442752u,393216u}/* 11ACB */, /*19926*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863716u,138442752u,393216u}/* 11ACC */, /*19927*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863724u,138442752u,393216u}/* 11ACD */, /*19928*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863732u,138442752u,393216u}/* 11ACE */, /*19929*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863740u,138442752u,393216u}/* 11ACF */, /*19930*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863748u,138442752u,393216u}/* 11AD0 */, /*19931*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863756u,138442752u,393216u}/* 11AD1 */, /*19932*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863764u,138442752u,393216u}/* 11AD2 */, /*19933*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863772u,138442752u,393216u}/* 11AD3 */, /*19934*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863780u,138442752u,393216u}/* 11AD4 */, /*19935*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863564u,138442752u,393216u}/* 11AD5 */, /*19936*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863572u,138442752u,393216u}/* 11AD6 */, /*19937*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863580u,138442752u,393216u}/* 11AD7 */, /*19938*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863588u,138442752u,393216u}/* 11AD8 */, /*19939*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863596u,138442752u,393216u}/* 11AD9 */, /*19940*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863604u,138442752u,393216u}/* 11ADA */, /*19941*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863612u,138442752u,393216u}/* 11ADB */, /*19942*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863788u,138442752u,393216u}/* 11ADC */, /*19943*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863796u,138442752u,393216u}/* 11ADD */, /*19944*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863844u,138442752u,393216u}/* 11ADE */, /*19945*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863804u,138442752u,393216u}/* 11ADF */, /*19946*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863812u,138442752u,393216u}/* 11AE0 */, /*19947*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863820u,138442752u,393216u}/* 11AE1 */, /*19948*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863828u,138442752u,393216u}/* 11AE2 */, /*19949*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863836u,138442752u,393216u}/* 11AE3 */, /*19950*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863852u,138442752u,393216u}/* 11AE4 */, /*19951*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863900u,138442752u,393216u}/* 11AE5 */, /*19952*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863884u,138442752u,393216u}/* 11AE6 */, /*19953*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863996u,138442752u,393216u}/* 11AE7 */, /*19954*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863908u,138442752u,393216u}/* 11AE8 */, /*19955*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863892u,138442752u,393216u}/* 11AE9 */, /*19956*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677864004u,138442752u,393216u}/* 11AEA */, /*19957*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863964u,138442752u,393216u}/* 11AEB */, /*19958*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863948u,138442752u,393216u}/* 11AEC */, /*19959*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863972u,138442752u,393216u}/* 11AED */, /*19960*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863956u,138442752u,393216u}/* 11AEE */, /*19961*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863860u,138442752u,393216u}/* 11AEF */, /*19962*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677864012u,138442752u,393216u}/* 11AF0 */, /*19963*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863876u,138442752u,393216u}/* 11AF1 */, /*19964*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863868u,138442752u,393216u}/* 11AF2 */, /*19965*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863932u,138442752u,393216u}/* 11AF3 */, /*19966*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863916u,138442752u,393216u}/* 11AF4 */, /*19967*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863980u,138442752u,393216u}/* 11AF5 */, /*19968*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863940u,138442752u,393216u}/* 11AF6 */, /*19969*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863924u,138442752u,393216u}/* 11AF7 */, /*19970*/{0,1800u,7798785u,77070341u,1515560u,3758096416u,1677863988u,138442752u,393216u}/* 11AF8 */, /*19971*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815596u,138442752u,393216u}/* 11C00 */, /*19972*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815604u,138442752u,393216u}/* 11C01 */, /*19973*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815612u,138442752u,393216u}/* 11C02 */, /*19974*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815620u,138442752u,393216u}/* 11C03 */, /*19975*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815628u,138442752u,393216u}/* 11C04 */, /*19976*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815636u,138442752u,393216u}/* 11C05 */, /*19977*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815644u,138442752u,393216u}/* 11C06 */, /*19978*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815652u,138442752u,393216u}/* 11C07 */, /*19979*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815660u,138442752u,393216u}/* 11C08 */, /*19980*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815668u,138442752u,393216u}/* 11C0A */, /*19981*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815676u,138442752u,393216u}/* 11C0B */, /*19982*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815684u,138442752u,393216u}/* 11C0C */, /*19983*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815692u,138442752u,393216u}/* 11C0D */, /*19984*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815700u,138442752u,393216u}/* 11C0E */, /*19985*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815708u,138442752u,393216u}/* 11C0F */, /*19986*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815716u,138442752u,393216u}/* 11C10 */, /*19987*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815724u,138442752u,393216u}/* 11C11 */, /*19988*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815732u,138442752u,393216u}/* 11C12 */, /*19989*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815740u,138442752u,393216u}/* 11C13 */, /*19990*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815748u,138442752u,393216u}/* 11C14 */, /*19991*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815756u,138442752u,393216u}/* 11C15 */, /*19992*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815764u,138442752u,393216u}/* 11C16 */, /*19993*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815772u,138442752u,393216u}/* 11C17 */, /*19994*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815780u,138442752u,393216u}/* 11C18 */, /*19995*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815788u,138442752u,393216u}/* 11C19 */, /*19996*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815796u,138442752u,393216u}/* 11C1A */, /*19997*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815804u,138442752u,393216u}/* 11C1B */, /*19998*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815812u,138442752u,393216u}/* 11C1C */, /*19999*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815820u,138442752u,393216u}/* 11C1D */, /*20000*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815828u,138442752u,393216u}/* 11C1E */, /*20001*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815836u,138442752u,393216u}/* 11C1F */, /*20002*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815844u,138442752u,393216u}/* 11C20 */, /*20003*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815852u,138442752u,393216u}/* 11C21 */, /*20004*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815860u,138442752u,393216u}/* 11C22 */, /*20005*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815868u,138442752u,393216u}/* 11C23 */, /*20006*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815876u,138442752u,393216u}/* 11C24 */, /*20007*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815884u,138442752u,393216u}/* 11C25 */, /*20008*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815892u,138442752u,393216u}/* 11C26 */, /*20009*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815900u,138442752u,393216u}/* 11C27 */, /*20010*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815908u,138442752u,393216u}/* 11C28 */, /*20011*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815916u,138442752u,393216u}/* 11C29 */, /*20012*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815924u,138442752u,393216u}/* 11C2A */, /*20013*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815932u,138442752u,393216u}/* 11C2B */, /*20014*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815940u,138442752u,393216u}/* 11C2C */, /*20015*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815948u,138442752u,393216u}/* 11C2D */, /*20016*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815956u,138442752u,393216u}/* 11C2E */, /*20017*/{0,1808u,8716289u,68747272u,940466184u,3758096416u,1078030500u,138443264u,262144u}/* 11C2F */, /*20018*/{0,1808u,8716289u,68759558u,672030728u,3774873616u,1078030508u,138443264u,262144u}/* 11C30 */, /*20019*/{0,1808u,8716289u,68759558u,672030728u,3774873616u,1078030516u,138443264u,262144u}/* 11C31 */, /*20020*/{0,1808u,8716289u,68759558u,672030728u,3774873616u,1078030524u,138443264u,262144u}/* 11C32 */, /*20021*/{0,1808u,8716289u,68759558u,672030728u,3774873616u,1078030532u,138443264u,262144u}/* 11C33 */, /*20022*/{0,1808u,8716289u,68759558u,672030728u,3774873616u,1078030540u,138443264u,262144u}/* 11C34 */, /*20023*/{0,1808u,8716289u,68759558u,672030728u,3774873616u,1078030548u,138443264u,262144u}/* 11C35 */, /*20024*/{0,1808u,8716289u,68759558u,672030728u,3774873616u,1078030556u,138443264u,262144u}/* 11C36 */, /*20025*/{0,1808u,8716289u,68759558u,672030728u,3774873616u,1078030564u,138443264u,262144u}/* 11C38 */, /*20026*/{0,1808u,8716289u,68759558u,672030728u,3774873616u,1078030572u,138443264u,262144u}/* 11C39 */, /*20027*/{0,1808u,8716289u,68759558u,672030728u,3774873616u,1078030580u,138443264u,262144u}/* 11C3A */, /*20028*/{0,1808u,8716289u,68759558u,672030728u,3774873616u,1078030588u,138443264u,262144u}/* 11C3B */, /*20029*/{0,1808u,8716289u,68759558u,672030728u,3774873616u,1077936140u,822114816u,262144u}/* 11C3C */, /*20030*/{0,1808u,8716289u,68759558u,672030728u,3774873616u,1077936140u,826309120u,262144u}/* 11C3D */, /*20031*/{0,1808u,8716289u,68747272u,940466184u,3758096416u,1077936140u,830503424u,262144u}/* 11C3E */, /*20032*/{0,1808u,8716289u,337182726u,672030728u,1627398168u,1078030596u,138442752u,262144u}/* 11C3F */, /*20033*/{0,1808u,8716289u,77135877u,1515560u,3758096416u,1677815964u,138442752u,393216u}/* 11C40 */, /*20034*/{0,1808u,8716289u,69795863u,98344u,1610612768u,5636u,138442754u,41943040u}/* 11C41 */, /*20035*/{0,1808u,8716289u,69795863u,98344u,1610612768u,5644u,138442754u,41943040u}/* 11C42 */, /*20036*/{0,1808u,8716289u,69795863u,40u,1610612768u,8884u,138442754u,8388608u}/* 11C43 */, /*20037*/{0,1808u,8716289u,69795863u,40u,1610612768u,8892u,138442754u,0}/* 11C44 */, /*20038*/{0,1808u,8716289u,69795863u,40u,1610612768u,8900u,138442754u,0}/* 11C45 */, /*20039*/{0,1808u,42271745u,85524489u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 11C50 */, /*20040*/{0,1808u,545588737u,85524489u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 11C51 */, /*20041*/{0,1808u,579144193u,85524489u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 11C52 */, /*20042*/{0,1808u,612698113u,85524489u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 11C53 */, /*20043*/{0,1808u,646254593u,85524489u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 11C54 */, /*20044*/{0,1808u,679808001u,85524489u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 11C55 */, /*20045*/{0,1808u,713364993u,85524489u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 11C56 */, /*20046*/{0,1808u,746917377u,85524489u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 11C57 */, /*20047*/{0,1808u,780475393u,85524489u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 11C58 */, /*20048*/{0,1808u,814027777u,85524489u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 11C59 */, /*20049*/{0,1808u,545588737u,77135883u,8388650u,1610612768u,58669u,138442752u,0}/* 11C5A */, /*20050*/{0,1808u,579144193u,77135883u,8388650u,1610612768u,58677u,138442752u,0}/* 11C5B */, /*20051*/{0,1808u,612698113u,77135883u,8388650u,1610612768u,58685u,138442752u,0}/* 11C5C */, /*20052*/{0,1808u,646254593u,77135883u,8388650u,1610612768u,58693u,138442752u,0}/* 11C5D */, /*20053*/{0,1808u,679808001u,77135883u,8388650u,1610612768u,58701u,138442752u,0}/* 11C5E */, /*20054*/{0,1808u,713364993u,77135883u,8388650u,1610612768u,58709u,138442752u,0}/* 11C5F */, /*20055*/{0,1808u,746917377u,77135883u,8388650u,1610612768u,58717u,138442752u,0}/* 11C60 */, /*20056*/{0,1808u,780475393u,77135883u,8388650u,1610612768u,58725u,138442752u,0}/* 11C61 */, /*20057*/{0,1808u,814027777u,77135883u,8388650u,1610612768u,58733u,138442752u,0}/* 11C62 */, /*20058*/{0,1808u,830808065u,77135883u,8388650u,1610612768u,57149u,138442752u,0}/* 11C63 */, /*20059*/{0,1808u,998583297u,77135883u,8388650u,1610612768u,57157u,138442752u,0}/* 11C64 */, /*20060*/{0,1808u,1166360577u,77135883u,8388650u,1610612768u,57165u,138442752u,0}/* 11C65 */, /*20061*/{0,1808u,1334137857u,77135883u,8388650u,1610612768u,57173u,138442752u,0}/* 11C66 */, /*20062*/{0,1808u,1501915137u,77135883u,8388650u,1610612768u,57181u,138442752u,0}/* 11C67 */, /*20063*/{0,1808u,1518692865u,77135883u,8388650u,1610612768u,57189u,138442752u,0}/* 11C68 */, /*20064*/{0,1808u,1535470593u,77135883u,8388650u,1610612768u,57197u,138442752u,0}/* 11C69 */, /*20065*/{0,1808u,1552248321u,77135883u,8388650u,1610612768u,57205u,138442752u,0}/* 11C6A */, /*20066*/{0,1808u,1569026049u,77135883u,8388650u,1610612768u,57213u,138442752u,0}/* 11C6B */, /*20067*/{0,1808u,1585803777u,77135883u,8388650u,1610612768u,57221u,138442752u,0}/* 11C6C */, /*20068*/{0,1816u,8781825u,90767383u,40u,1610612768u,8452u,138442754u,0}/* 11C70 */, /*20069*/{0,1816u,8781825u,75038743u,40u,1610612768u,8460u,138442754u,8388608u}/* 11C71 */, /*20070*/{0,1816u,8781825u,77135877u,1515560u,3758096416u,1677819124u,138442752u,393216u}/* 11C72 */, /*20071*/{0,1816u,8781825u,77135877u,1515560u,3758096416u,1677819140u,138442752u,393216u}/* 11C73 */, /*20072*/{0,1816u,8781825u,77135877u,1515560u,3758096416u,1677819156u,138442752u,393216u}/* 11C74 */, /*20073*/{0,1816u,8781825u,77135877u,1515560u,3758096416u,1677819172u,138442752u,393216u}/* 11C75 */, /*20074*/{0,1816u,8781825u,77135877u,1515560u,3758096416u,1677819188u,138442752u,393216u}/* 11C76 */, /*20075*/{0,1816u,8781825u,77135877u,1515560u,3758096416u,1677819204u,138442752u,393216u}/* 11C77 */, /*20076*/{0,1816u,8781825u,77135877u,1515560u,3758096416u,1677819220u,138442752u,393216u}/* 11C78 */, /*20077*/{0,1816u,8781825u,77135877u,1515560u,3758096416u,1677819236u,138442752u,393216u}/* 11C79 */, /*20078*/{0,1816u,8781825u,77135877u,1515560u,3758096416u,1677819252u,138442752u,393216u}/* 11C7A */, /*20079*/{0,1816u,8781825u,77135877u,1515560u,3758096416u,1677819268u,138442752u,393216u}/* 11C7B */, /*20080*/{0,1816u,8781825u,77135877u,1515560u,3758096416u,1677819284u,138442752u,393216u}/* 11C7C */, /*20081*/{0,1816u,8781825u,77135877u,1515560u,3758096416u,1677819300u,138442752u,393216u}/* 11C7D */, /*20082*/{0,1816u,8781825u,77135877u,1515560u,3758096416u,1677819316u,138442752u,393216u}/* 11C7E */, /*20083*/{0,1816u,8781825u,77135877u,1515560u,3758096416u,1677819332u,138442752u,393216u}/* 11C7F */, /*20084*/{0,1816u,8781825u,77135877u,1515560u,3758096416u,1677819348u,138442752u,393216u}/* 11C80 */, /*20085*/{0,1816u,8781825u,77135877u,1515560u,3758096416u,1677819364u,138442752u,393216u}/* 11C81 */, /*20086*/{0,1816u,8781825u,77135877u,1515560u,3758096416u,1677819380u,138442752u,393216u}/* 11C82 */, /*20087*/{0,1816u,8781825u,77135877u,1515560u,3758096416u,1677819396u,138442752u,393216u}/* 11C83 */, /*20088*/{0,1816u,8781825u,77135877u,1515560u,3758096416u,1677819412u,138442752u,393216u}/* 11C84 */, /*20089*/{0,1816u,8781825u,77135877u,1515560u,3758096416u,1677819428u,138442752u,393216u}/* 11C85 */, /*20090*/{0,1816u,8781825u,77135877u,1515560u,3758096416u,1677819444u,138442752u,393216u}/* 11C86 */, /*20091*/{0,1816u,8781825u,77135877u,1515560u,3758096416u,1677819460u,138442752u,393216u}/* 11C87 */, /*20092*/{0,1816u,8781825u,77135877u,1515560u,3758096416u,1677819476u,138442752u,393216u}/* 11C88 */, /*20093*/{0,1816u,8781825u,77135877u,1515560u,3758096416u,1677819484u,138442752u,393216u}/* 11C89 */, /*20094*/{0,1816u,8781825u,77135877u,1515560u,3758096416u,1677819500u,138442752u,393216u}/* 11C8A */, /*20095*/{0,1816u,8781825u,77135877u,1515560u,3758096416u,1677819516u,138442752u,393216u}/* 11C8B */, /*20096*/{0,1816u,8781825u,77135877u,1515560u,3758096416u,1677819532u,138442752u,393216u}/* 11C8C */, /*20097*/{0,1816u,8781825u,77135877u,1515560u,3758096416u,1677819548u,138442752u,393216u}/* 11C8D */, /*20098*/{0,1816u,8781825u,77135877u,1515560u,3758096416u,1677819564u,138442752u,393216u}/* 11C8E */, /*20099*/{0,1816u,8781825u,77135877u,1515560u,3758096416u,1677819580u,138442752u,393216u}/* 11C8F */, /*20100*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1078033660u,138443264u,262144u}/* 11C92 */, /*20101*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1078033676u,138443264u,262144u}/* 11C93 */, /*20102*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1078033692u,138443264u,262144u}/* 11C94 */, /*20103*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1078033708u,138443264u,262144u}/* 11C95 */, /*20104*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1078033724u,138443264u,262144u}/* 11C96 */, /*20105*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1078033740u,138443264u,262144u}/* 11C97 */, /*20106*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1078033756u,138443264u,262144u}/* 11C98 */, /*20107*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1078033772u,138443264u,262144u}/* 11C99 */, /*20108*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1078033788u,138443264u,262144u}/* 11C9A */, /*20109*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1078033804u,138443264u,262144u}/* 11C9B */, /*20110*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1078033820u,138443264u,262144u}/* 11C9C */, /*20111*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1078033836u,138443264u,262144u}/* 11C9D */, /*20112*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1078033852u,138443264u,262144u}/* 11C9E */, /*20113*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1078033868u,138443264u,262144u}/* 11C9F */, /*20114*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1078033884u,138443264u,262144u}/* 11CA0 */, /*20115*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1078033900u,138443264u,262144u}/* 11CA1 */, /*20116*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1078033916u,138443264u,262144u}/* 11CA2 */, /*20117*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1078033932u,138443264u,262144u}/* 11CA3 */, /*20118*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1078033948u,138443264u,262144u}/* 11CA4 */, /*20119*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1078033964u,138443264u,262144u}/* 11CA5 */, /*20120*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1078033980u,138443264u,262144u}/* 11CA6 */, /*20121*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1078033996u,138443264u,262144u}/* 11CA7 */, /*20122*/{0,1816u,8781825u,68747272u,940466184u,3758096416u,1078034020u,138443264u,262144u}/* 11CA9 */, /*20123*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1078034036u,138443264u,262144u}/* 11CAA */, /*20124*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1078034052u,138443264u,262144u}/* 11CAB */, /*20125*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1078034068u,138443264u,262144u}/* 11CAC */, /*20126*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1078034084u,138443264u,262144u}/* 11CAD */, /*20127*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1078034100u,138443264u,262144u}/* 11CAE */, /*20128*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1078034116u,138443264u,262144u}/* 11CAF */, /*20129*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1078034124u,138443264u,262144u}/* 11CB0 */, /*20130*/{0,1816u,8781825u,68747272u,940466184u,3758096416u,1078034132u,138443264u,262144u}/* 11CB1 */, /*20131*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1078034140u,138443264u,262144u}/* 11CB2 */, /*20132*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1078034148u,138443264u,262144u}/* 11CB3 */, /*20133*/{0,1816u,8781825u,68747272u,940466184u,3758096416u,1078034156u,138443264u,262144u}/* 11CB4 */, /*20134*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1077936140u,826309120u,262144u}/* 11CB5 */, /*20135*/{0,1816u,8781825u,68759558u,672030728u,3774873616u,1077936140u,822114816u,262144u}/* 11CB6 */, /*20136*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677813852u,138442752u,393216u}/* 11D00 */, /*20137*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677813860u,138442752u,393216u}/* 11D01 */, /*20138*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677813868u,138442752u,393216u}/* 11D02 */, /*20139*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677813876u,138442752u,393216u}/* 11D03 */, /*20140*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677813884u,138442752u,393216u}/* 11D04 */, /*20141*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677813892u,138442752u,393216u}/* 11D05 */, /*20142*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677813900u,138442752u,393216u}/* 11D06 */, /*20143*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677813908u,138442752u,393216u}/* 11D08 */, /*20144*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677813916u,138442752u,393216u}/* 11D09 */, /*20145*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677813924u,138442752u,393216u}/* 11D0B */, /*20146*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677813932u,138442752u,393216u}/* 11D0C */, /*20147*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677813940u,138442752u,393216u}/* 11D0D */, /*20148*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677813948u,138442752u,393216u}/* 11D0E */, /*20149*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677813956u,138442752u,393216u}/* 11D0F */, /*20150*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677813964u,138442752u,393216u}/* 11D10 */, /*20151*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677813972u,138442752u,393216u}/* 11D11 */, /*20152*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677813980u,138442752u,393216u}/* 11D12 */, /*20153*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677813988u,138442752u,393216u}/* 11D13 */, /*20154*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677813996u,138442752u,393216u}/* 11D14 */, /*20155*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677814004u,138442752u,393216u}/* 11D15 */, /*20156*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677814012u,138442752u,393216u}/* 11D16 */, /*20157*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677814020u,138442752u,393216u}/* 11D17 */, /*20158*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677814028u,138442752u,393216u}/* 11D18 */, /*20159*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677814036u,138442752u,393216u}/* 11D19 */, /*20160*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677814044u,138442752u,393216u}/* 11D1A */, /*20161*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677814052u,138442752u,393216u}/* 11D1B */, /*20162*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677814060u,138442752u,393216u}/* 11D1C */, /*20163*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677814068u,138442752u,393216u}/* 11D1D */, /*20164*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677814076u,138442752u,393216u}/* 11D1E */, /*20165*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677814084u,138442752u,393216u}/* 11D1F */, /*20166*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677814092u,138442752u,393216u}/* 11D20 */, /*20167*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677814100u,138442752u,393216u}/* 11D21 */, /*20168*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677814108u,138442752u,393216u}/* 11D22 */, /*20169*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677814116u,138442752u,393216u}/* 11D23 */, /*20170*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677814124u,138442752u,393216u}/* 11D24 */, /*20171*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677814132u,138442752u,393216u}/* 11D25 */, /*20172*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677814140u,138442752u,393216u}/* 11D26 */, /*20173*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677814148u,138442752u,393216u}/* 11D27 */, /*20174*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677814156u,138442752u,393216u}/* 11D28 */, /*20175*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677814164u,138442752u,393216u}/* 11D29 */, /*20176*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677814172u,138442752u,393216u}/* 11D2A */, /*20177*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677814180u,138442752u,393216u}/* 11D2B */, /*20178*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677814188u,138442752u,393216u}/* 11D2C */, /*20179*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677814196u,138442752u,393216u}/* 11D2D */, /*20180*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677814204u,138442752u,393216u}/* 11D2E */, /*20181*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677814212u,138442752u,393216u}/* 11D2F */, /*20182*/{0,1824u,9043969u,77168645u,1515560u,3758096416u,1677814220u,138442752u,393216u}/* 11D30 */, /*20183*/{0,1824u,9043969u,68792326u,672030728u,3774873616u,1078028756u,138443264u,262144u}/* 11D31 */, /*20184*/{0,1824u,9043969u,68792326u,672030728u,3774873616u,1078028764u,138443264u,262144u}/* 11D32 */, /*20185*/{0,1824u,9043969u,68792326u,672030728u,3774873616u,1078028772u,138443264u,262144u}/* 11D33 */, /*20186*/{0,1824u,9043969u,68792326u,672030728u,3774873616u,1078028780u,138443264u,262144u}/* 11D34 */, /*20187*/{0,1824u,9043969u,68792326u,672030728u,3774873616u,1078028788u,138443264u,262144u}/* 11D35 */, /*20188*/{0,1824u,9043969u,68792326u,672030728u,3774873616u,1078028796u,138443264u,262144u}/* 11D36 */, /*20189*/{0,1824u,9043969u,68792326u,672030728u,3774873616u,1078028804u,138443264u,262144u}/* 11D3A */, /*20190*/{0,1824u,9043969u,68792326u,672030728u,3774873616u,1078028812u,138443264u,262144u}/* 11D3C */, /*20191*/{0,1824u,9043969u,68792326u,672030728u,3774873616u,1078028820u,138443264u,262144u}/* 11D3D */, /*20192*/{0,1824u,9043969u,68792326u,672030728u,3774873616u,1078028828u,138443264u,262144u}/* 11D3F */, /*20193*/{0,1824u,9043969u,68792326u,672030728u,3774873616u,1077936140u,826309120u,262144u}/* 11D40 */, /*20194*/{0,1824u,9043969u,68792326u,672030728u,3774873616u,1077936140u,830503424u,262144u}/* 11D41 */, /*20195*/{0,1824u,9043969u,203010054u,672030728u,1627398160u,1077936140u,817920000u,262144u}/* 11D42 */, /*20196*/{0,1824u,9043969u,68792326u,672030728u,3774873616u,1077936140u,822114816u,262144u}/* 11D43 */, /*20197*/{0,1824u,9043969u,337227782u,672030728u,1627398168u,1078028836u,138442752u,262144u}/* 11D44 */, /*20198*/{0,1824u,9043969u,337227782u,672030728u,1627398168u,1078028844u,138442752u,262144u}/* 11D45 */, /*20199*/{0,1824u,9043969u,77168645u,135733256u,3758096416u,1677814140u,138614784u,393216u}/* 11D46 */, /*20200*/{0,1824u,9043969u,68792326u,672030728u,3774873616u,1078028668u,138631680u,262144u}/* 11D47 */, /*20201*/{0,1824u,42599425u,85557257u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 11D50 */, /*20202*/{0,1824u,545916417u,85557257u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 11D51 */, /*20203*/{0,1824u,579471873u,85557257u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 11D52 */, /*20204*/{0,1824u,613025793u,85557257u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 11D53 */, /*20205*/{0,1824u,646582273u,85557257u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 11D54 */, /*20206*/{0,1824u,680135681u,85557257u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 11D55 */, /*20207*/{0,1824u,713692673u,85557257u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 11D56 */, /*20208*/{0,1824u,747245057u,85557257u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 11D57 */, /*20209*/{0,1824u,780803073u,85557257u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 11D58 */, /*20210*/{0,1824u,814355457u,85557257u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 11D59 */, /*20211*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877100u,138442752u,393216u}/* 12000 */, /*20212*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877108u,138442752u,393216u}/* 12001 */, /*20213*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877116u,138442752u,393216u}/* 12002 */, /*20214*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877124u,138442752u,393216u}/* 12003 */, /*20215*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877132u,138442752u,393216u}/* 12004 */, /*20216*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877140u,138442752u,393216u}/* 12005 */, /*20217*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877148u,138442752u,393216u}/* 12006 */, /*20218*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877156u,138442752u,393216u}/* 12007 */, /*20219*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877164u,138442752u,393216u}/* 12008 */, /*20220*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877172u,138442752u,393216u}/* 12009 */, /*20221*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877180u,138442752u,393216u}/* 1200A */, /*20222*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877188u,138442752u,393216u}/* 1200B */, /*20223*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877196u,138442752u,393216u}/* 1200C */, /*20224*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877204u,138442752u,393216u}/* 1200D */, /*20225*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877212u,138442752u,393216u}/* 1200E */, /*20226*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877220u,138442752u,393216u}/* 1200F */, /*20227*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877228u,138442752u,393216u}/* 12010 */, /*20228*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877236u,138442752u,393216u}/* 12011 */, /*20229*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877244u,138442752u,393216u}/* 12012 */, /*20230*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877252u,138442752u,393216u}/* 12013 */, /*20231*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877260u,138442752u,393216u}/* 12014 */, /*20232*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877268u,138442752u,393216u}/* 12015 */, /*20233*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877276u,138442752u,393216u}/* 12016 */, /*20234*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877284u,138442752u,393216u}/* 12017 */, /*20235*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877292u,138442752u,393216u}/* 12018 */, /*20236*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877300u,138442752u,393216u}/* 12019 */, /*20237*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877308u,138442752u,393216u}/* 1201A */, /*20238*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877316u,138442752u,393216u}/* 1201B */, /*20239*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877324u,138442752u,393216u}/* 1201C */, /*20240*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877332u,138442752u,393216u}/* 1201D */, /*20241*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877340u,138442752u,393216u}/* 1201E */, /*20242*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877348u,138442752u,393216u}/* 1201F */, /*20243*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877356u,138442752u,393216u}/* 12020 */, /*20244*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877364u,138442752u,393216u}/* 12021 */, /*20245*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877372u,138442752u,393216u}/* 12022 */, /*20246*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877380u,138442752u,393216u}/* 12023 */, /*20247*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877388u,138442752u,393216u}/* 12024 */, /*20248*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877396u,138442752u,393216u}/* 12025 */, /*20249*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877404u,138442752u,393216u}/* 12026 */, /*20250*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877412u,138442752u,393216u}/* 12027 */, /*20251*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877420u,138442752u,393216u}/* 12028 */, /*20252*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877428u,138442752u,393216u}/* 12029 */, /*20253*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877436u,138442752u,393216u}/* 1202A */, /*20254*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877444u,138442752u,393216u}/* 1202B */, /*20255*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877452u,138442752u,393216u}/* 1202C */, /*20256*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877460u,138442752u,393216u}/* 1202D */, /*20257*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877468u,138442752u,393216u}/* 1202E */, /*20258*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877476u,138442752u,393216u}/* 1202F */, /*20259*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877484u,138442752u,393216u}/* 12030 */, /*20260*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877492u,138442752u,393216u}/* 12031 */, /*20261*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877500u,138442752u,393216u}/* 12032 */, /*20262*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877508u,138442752u,393216u}/* 12033 */, /*20263*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877516u,138442752u,393216u}/* 12034 */, /*20264*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877524u,138442752u,393216u}/* 12035 */, /*20265*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877532u,138442752u,393216u}/* 12036 */, /*20266*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877540u,138442752u,393216u}/* 12037 */, /*20267*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877548u,138442752u,393216u}/* 12038 */, /*20268*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877556u,138442752u,393216u}/* 12039 */, /*20269*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877564u,138442752u,393216u}/* 1203A */, /*20270*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877572u,138442752u,393216u}/* 1203B */, /*20271*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877580u,138442752u,393216u}/* 1203C */, /*20272*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877588u,138442752u,393216u}/* 1203D */, /*20273*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877596u,138442752u,393216u}/* 1203E */, /*20274*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877604u,138442752u,393216u}/* 1203F */, /*20275*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877612u,138442752u,393216u}/* 12040 */, /*20276*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877620u,138442752u,393216u}/* 12041 */, /*20277*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877628u,138442752u,393216u}/* 12042 */, /*20278*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877636u,138442752u,393216u}/* 12043 */, /*20279*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877644u,138442752u,393216u}/* 12044 */, /*20280*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877652u,138442752u,393216u}/* 12045 */, /*20281*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877660u,138442752u,393216u}/* 12046 */, /*20282*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877668u,138442752u,393216u}/* 12047 */, /*20283*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877676u,138442752u,393216u}/* 12048 */, /*20284*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877684u,138442752u,393216u}/* 12049 */, /*20285*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877692u,138442752u,393216u}/* 1204A */, /*20286*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877700u,138442752u,393216u}/* 1204B */, /*20287*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877708u,138442752u,393216u}/* 1204C */, /*20288*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877716u,138442752u,393216u}/* 1204D */, /*20289*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877724u,138442752u,393216u}/* 1204E */, /*20290*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877732u,138442752u,393216u}/* 1204F */, /*20291*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877740u,138442752u,393216u}/* 12050 */, /*20292*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877748u,138442752u,393216u}/* 12051 */, /*20293*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877756u,138442752u,393216u}/* 12052 */, /*20294*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877764u,138442752u,393216u}/* 12053 */, /*20295*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877772u,138442752u,393216u}/* 12054 */, /*20296*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877780u,138442752u,393216u}/* 12055 */, /*20297*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877788u,138442752u,393216u}/* 12056 */, /*20298*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877796u,138442752u,393216u}/* 12057 */, /*20299*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877804u,138442752u,393216u}/* 12058 */, /*20300*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877812u,138442752u,393216u}/* 12059 */, /*20301*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877820u,138442752u,393216u}/* 1205A */, /*20302*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877828u,138442752u,393216u}/* 1205B */, /*20303*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877836u,138442752u,393216u}/* 1205C */, /*20304*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877844u,138442752u,393216u}/* 1205D */, /*20305*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877852u,138442752u,393216u}/* 1205E */, /*20306*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877860u,138442752u,393216u}/* 1205F */, /*20307*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877868u,138442752u,393216u}/* 12060 */, /*20308*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877876u,138442752u,393216u}/* 12061 */, /*20309*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877884u,138442752u,393216u}/* 12062 */, /*20310*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877892u,138442752u,393216u}/* 12063 */, /*20311*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877900u,138442752u,393216u}/* 12064 */, /*20312*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877908u,138442752u,393216u}/* 12065 */, /*20313*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877916u,138442752u,393216u}/* 12066 */, /*20314*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877924u,138442752u,393216u}/* 12067 */, /*20315*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877932u,138442752u,393216u}/* 12068 */, /*20316*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877940u,138442752u,393216u}/* 12069 */, /*20317*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877948u,138442752u,393216u}/* 1206A */, /*20318*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877956u,138442752u,393216u}/* 1206B */, /*20319*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877964u,138442752u,393216u}/* 1206C */, /*20320*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877972u,138442752u,393216u}/* 1206D */, /*20321*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877980u,138442752u,393216u}/* 1206E */, /*20322*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877988u,138442752u,393216u}/* 1206F */, /*20323*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677877996u,138442752u,393216u}/* 12070 */, /*20324*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878004u,138442752u,393216u}/* 12071 */, /*20325*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878012u,138442752u,393216u}/* 12072 */, /*20326*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878020u,138442752u,393216u}/* 12073 */, /*20327*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878028u,138442752u,393216u}/* 12074 */, /*20328*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878036u,138442752u,393216u}/* 12075 */, /*20329*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878044u,138442752u,393216u}/* 12076 */, /*20330*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878052u,138442752u,393216u}/* 12077 */, /*20331*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878060u,138442752u,393216u}/* 12078 */, /*20332*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878068u,138442752u,393216u}/* 12079 */, /*20333*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878076u,138442752u,393216u}/* 1207A */, /*20334*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878084u,138442752u,393216u}/* 1207B */, /*20335*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878092u,138442752u,393216u}/* 1207C */, /*20336*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878100u,138442752u,393216u}/* 1207D */, /*20337*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878108u,138442752u,393216u}/* 1207E */, /*20338*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878116u,138442752u,393216u}/* 1207F */, /*20339*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878124u,138442752u,393216u}/* 12080 */, /*20340*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878132u,138442752u,393216u}/* 12081 */, /*20341*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878140u,138442752u,393216u}/* 12082 */, /*20342*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878148u,138442752u,393216u}/* 12083 */, /*20343*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878156u,138442752u,393216u}/* 12084 */, /*20344*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878164u,138442752u,393216u}/* 12085 */, /*20345*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878172u,138442752u,393216u}/* 12086 */, /*20346*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878180u,138442752u,393216u}/* 12087 */, /*20347*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878188u,138442752u,393216u}/* 12088 */, /*20348*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878196u,138442752u,393216u}/* 12089 */, /*20349*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878204u,138442752u,393216u}/* 1208A */, /*20350*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878212u,138442752u,393216u}/* 1208B */, /*20351*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878220u,138442752u,393216u}/* 1208C */, /*20352*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878228u,138442752u,393216u}/* 1208D */, /*20353*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878236u,138442752u,393216u}/* 1208E */, /*20354*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878244u,138442752u,393216u}/* 1208F */, /*20355*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878252u,138442752u,393216u}/* 12090 */, /*20356*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878260u,138442752u,393216u}/* 12091 */, /*20357*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878268u,138442752u,393216u}/* 12092 */, /*20358*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878276u,138442752u,393216u}/* 12093 */, /*20359*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878284u,138442752u,393216u}/* 12094 */, /*20360*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878292u,138442752u,393216u}/* 12095 */, /*20361*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878300u,138442752u,393216u}/* 12096 */, /*20362*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878308u,138442752u,393216u}/* 12097 */, /*20363*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878316u,138442752u,393216u}/* 12098 */, /*20364*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878324u,138442752u,393216u}/* 12099 */, /*20365*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878332u,138442752u,393216u}/* 1209A */, /*20366*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878340u,138442752u,393216u}/* 1209B */, /*20367*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878348u,138442752u,393216u}/* 1209C */, /*20368*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878356u,138442752u,393216u}/* 1209D */, /*20369*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878364u,138442752u,393216u}/* 1209E */, /*20370*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878372u,138442752u,393216u}/* 1209F */, /*20371*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878380u,138442752u,393216u}/* 120A0 */, /*20372*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878388u,138442752u,393216u}/* 120A1 */, /*20373*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878396u,138442752u,393216u}/* 120A2 */, /*20374*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878404u,138442752u,393216u}/* 120A3 */, /*20375*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878412u,138442752u,393216u}/* 120A4 */, /*20376*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878420u,138442752u,393216u}/* 120A5 */, /*20377*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878428u,138442752u,393216u}/* 120A6 */, /*20378*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878436u,138442752u,393216u}/* 120A7 */, /*20379*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878444u,138442752u,393216u}/* 120A8 */, /*20380*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878452u,138442752u,393216u}/* 120A9 */, /*20381*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878460u,138442752u,393216u}/* 120AA */, /*20382*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878468u,138442752u,393216u}/* 120AB */, /*20383*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878476u,138442752u,393216u}/* 120AC */, /*20384*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878484u,138442752u,393216u}/* 120AD */, /*20385*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878492u,138442752u,393216u}/* 120AE */, /*20386*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878500u,138442752u,393216u}/* 120AF */, /*20387*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878508u,138442752u,393216u}/* 120B0 */, /*20388*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878516u,138442752u,393216u}/* 120B1 */, /*20389*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878524u,138442752u,393216u}/* 120B2 */, /*20390*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878532u,138442752u,393216u}/* 120B3 */, /*20391*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878540u,138442752u,393216u}/* 120B4 */, /*20392*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878548u,138442752u,393216u}/* 120B5 */, /*20393*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878556u,138442752u,393216u}/* 120B6 */, /*20394*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878564u,138442752u,393216u}/* 120B7 */, /*20395*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878572u,138442752u,393216u}/* 120B8 */, /*20396*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878580u,138442752u,393216u}/* 120B9 */, /*20397*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878588u,138442752u,393216u}/* 120BA */, /*20398*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878596u,138442752u,393216u}/* 120BB */, /*20399*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878604u,138442752u,393216u}/* 120BC */, /*20400*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878612u,138442752u,393216u}/* 120BD */, /*20401*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878620u,138442752u,393216u}/* 120BE */, /*20402*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878628u,138442752u,393216u}/* 120BF */, /*20403*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878636u,138442752u,393216u}/* 120C0 */, /*20404*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878644u,138442752u,393216u}/* 120C1 */, /*20405*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878652u,138442752u,393216u}/* 120C2 */, /*20406*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878660u,138442752u,393216u}/* 120C3 */, /*20407*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878668u,138442752u,393216u}/* 120C4 */, /*20408*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878676u,138442752u,393216u}/* 120C5 */, /*20409*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878684u,138442752u,393216u}/* 120C6 */, /*20410*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878692u,138442752u,393216u}/* 120C7 */, /*20411*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878700u,138442752u,393216u}/* 120C8 */, /*20412*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878708u,138442752u,393216u}/* 120C9 */, /*20413*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878716u,138442752u,393216u}/* 120CA */, /*20414*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878724u,138442752u,393216u}/* 120CB */, /*20415*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878732u,138442752u,393216u}/* 120CC */, /*20416*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878740u,138442752u,393216u}/* 120CD */, /*20417*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878748u,138442752u,393216u}/* 120CE */, /*20418*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878756u,138442752u,393216u}/* 120CF */, /*20419*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878764u,138442752u,393216u}/* 120D0 */, /*20420*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878772u,138442752u,393216u}/* 120D1 */, /*20421*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878780u,138442752u,393216u}/* 120D2 */, /*20422*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878788u,138442752u,393216u}/* 120D3 */, /*20423*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878796u,138442752u,393216u}/* 120D4 */, /*20424*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878804u,138442752u,393216u}/* 120D5 */, /*20425*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878812u,138442752u,393216u}/* 120D6 */, /*20426*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878820u,138442752u,393216u}/* 120D7 */, /*20427*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878828u,138442752u,393216u}/* 120D8 */, /*20428*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878836u,138442752u,393216u}/* 120D9 */, /*20429*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878844u,138442752u,393216u}/* 120DA */, /*20430*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878852u,138442752u,393216u}/* 120DB */, /*20431*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878860u,138442752u,393216u}/* 120DC */, /*20432*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878868u,138442752u,393216u}/* 120DD */, /*20433*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878876u,138442752u,393216u}/* 120DE */, /*20434*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878884u,138442752u,393216u}/* 120DF */, /*20435*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878892u,138442752u,393216u}/* 120E0 */, /*20436*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878900u,138442752u,393216u}/* 120E1 */, /*20437*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878908u,138442752u,393216u}/* 120E2 */, /*20438*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878916u,138442752u,393216u}/* 120E3 */, /*20439*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878924u,138442752u,393216u}/* 120E4 */, /*20440*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878932u,138442752u,393216u}/* 120E5 */, /*20441*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878940u,138442752u,393216u}/* 120E6 */, /*20442*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878948u,138442752u,393216u}/* 120E7 */, /*20443*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878956u,138442752u,393216u}/* 120E8 */, /*20444*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878964u,138442752u,393216u}/* 120E9 */, /*20445*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878972u,138442752u,393216u}/* 120EA */, /*20446*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878980u,138442752u,393216u}/* 120EB */, /*20447*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878988u,138442752u,393216u}/* 120EC */, /*20448*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677878996u,138442752u,393216u}/* 120ED */, /*20449*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879004u,138442752u,393216u}/* 120EE */, /*20450*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879012u,138442752u,393216u}/* 120EF */, /*20451*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879020u,138442752u,393216u}/* 120F0 */, /*20452*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879028u,138442752u,393216u}/* 120F1 */, /*20453*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879036u,138442752u,393216u}/* 120F2 */, /*20454*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879044u,138442752u,393216u}/* 120F3 */, /*20455*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879052u,138442752u,393216u}/* 120F4 */, /*20456*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879060u,138442752u,393216u}/* 120F5 */, /*20457*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879068u,138442752u,393216u}/* 120F6 */, /*20458*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879076u,138442752u,393216u}/* 120F7 */, /*20459*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879084u,138442752u,393216u}/* 120F8 */, /*20460*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879092u,138442752u,393216u}/* 120F9 */, /*20461*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879100u,138442752u,393216u}/* 120FA */, /*20462*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879108u,138442752u,393216u}/* 120FB */, /*20463*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879116u,138442752u,393216u}/* 120FC */, /*20464*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879124u,138442752u,393216u}/* 120FD */, /*20465*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879132u,138442752u,393216u}/* 120FE */, /*20466*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879140u,138442752u,393216u}/* 120FF */, /*20467*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879148u,138442752u,393216u}/* 12100 */, /*20468*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879156u,138442752u,393216u}/* 12101 */, /*20469*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879164u,138442752u,393216u}/* 12102 */, /*20470*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879172u,138442752u,393216u}/* 12103 */, /*20471*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879180u,138442752u,393216u}/* 12104 */, /*20472*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879188u,138442752u,393216u}/* 12105 */, /*20473*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879196u,138442752u,393216u}/* 12106 */, /*20474*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879204u,138442752u,393216u}/* 12107 */, /*20475*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879212u,138442752u,393216u}/* 12108 */, /*20476*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879220u,138442752u,393216u}/* 12109 */, /*20477*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879228u,138442752u,393216u}/* 1210A */, /*20478*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879236u,138442752u,393216u}/* 1210B */, /*20479*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879244u,138442752u,393216u}/* 1210C */, /*20480*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879252u,138442752u,393216u}/* 1210D */, /*20481*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879260u,138442752u,393216u}/* 1210E */, /*20482*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879268u,138442752u,393216u}/* 1210F */, /*20483*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879276u,138442752u,393216u}/* 12110 */, /*20484*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879284u,138442752u,393216u}/* 12111 */, /*20485*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879292u,138442752u,393216u}/* 12112 */, /*20486*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879300u,138442752u,393216u}/* 12113 */, /*20487*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879308u,138442752u,393216u}/* 12114 */, /*20488*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879316u,138442752u,393216u}/* 12115 */, /*20489*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879324u,138442752u,393216u}/* 12116 */, /*20490*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879332u,138442752u,393216u}/* 12117 */, /*20491*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879340u,138442752u,393216u}/* 12118 */, /*20492*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879348u,138442752u,393216u}/* 12119 */, /*20493*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879356u,138442752u,393216u}/* 1211A */, /*20494*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879364u,138442752u,393216u}/* 1211B */, /*20495*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879372u,138442752u,393216u}/* 1211C */, /*20496*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879380u,138442752u,393216u}/* 1211D */, /*20497*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879388u,138442752u,393216u}/* 1211E */, /*20498*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879396u,138442752u,393216u}/* 1211F */, /*20499*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879404u,138442752u,393216u}/* 12120 */, /*20500*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879412u,138442752u,393216u}/* 12121 */, /*20501*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879420u,138442752u,393216u}/* 12122 */, /*20502*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879428u,138442752u,393216u}/* 12123 */, /*20503*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879436u,138442752u,393216u}/* 12124 */, /*20504*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879444u,138442752u,393216u}/* 12125 */, /*20505*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879452u,138442752u,393216u}/* 12126 */, /*20506*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879460u,138442752u,393216u}/* 12127 */, /*20507*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879468u,138442752u,393216u}/* 12128 */, /*20508*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879476u,138442752u,393216u}/* 12129 */, /*20509*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879484u,138442752u,393216u}/* 1212A */, /*20510*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879492u,138442752u,393216u}/* 1212B */, /*20511*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879500u,138442752u,393216u}/* 1212C */, /*20512*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879508u,138442752u,393216u}/* 1212D */, /*20513*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879516u,138442752u,393216u}/* 1212E */, /*20514*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879524u,138442752u,393216u}/* 1212F */, /*20515*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879532u,138442752u,393216u}/* 12130 */, /*20516*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879540u,138442752u,393216u}/* 12131 */, /*20517*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879548u,138442752u,393216u}/* 12132 */, /*20518*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879556u,138442752u,393216u}/* 12133 */, /*20519*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879564u,138442752u,393216u}/* 12134 */, /*20520*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879572u,138442752u,393216u}/* 12135 */, /*20521*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879580u,138442752u,393216u}/* 12136 */, /*20522*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879588u,138442752u,393216u}/* 12137 */, /*20523*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879596u,138442752u,393216u}/* 12138 */, /*20524*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879604u,138442752u,393216u}/* 12139 */, /*20525*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879612u,138442752u,393216u}/* 1213A */, /*20526*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879620u,138442752u,393216u}/* 1213B */, /*20527*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879628u,138442752u,393216u}/* 1213C */, /*20528*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879636u,138442752u,393216u}/* 1213D */, /*20529*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879644u,138442752u,393216u}/* 1213E */, /*20530*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879652u,138442752u,393216u}/* 1213F */, /*20531*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879660u,138442752u,393216u}/* 12140 */, /*20532*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879668u,138442752u,393216u}/* 12141 */, /*20533*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879676u,138442752u,393216u}/* 12142 */, /*20534*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879684u,138442752u,393216u}/* 12143 */, /*20535*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879692u,138442752u,393216u}/* 12144 */, /*20536*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879700u,138442752u,393216u}/* 12145 */, /*20537*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879708u,138442752u,393216u}/* 12146 */, /*20538*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879716u,138442752u,393216u}/* 12147 */, /*20539*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879724u,138442752u,393216u}/* 12148 */, /*20540*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879732u,138442752u,393216u}/* 12149 */, /*20541*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879740u,138442752u,393216u}/* 1214A */, /*20542*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879748u,138442752u,393216u}/* 1214B */, /*20543*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879756u,138442752u,393216u}/* 1214C */, /*20544*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879764u,138442752u,393216u}/* 1214D */, /*20545*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879772u,138442752u,393216u}/* 1214E */, /*20546*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879780u,138442752u,393216u}/* 1214F */, /*20547*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879788u,138442752u,393216u}/* 12150 */, /*20548*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879796u,138442752u,393216u}/* 12151 */, /*20549*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879804u,138442752u,393216u}/* 12152 */, /*20550*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879812u,138442752u,393216u}/* 12153 */, /*20551*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879820u,138442752u,393216u}/* 12154 */, /*20552*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879828u,138442752u,393216u}/* 12155 */, /*20553*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879836u,138442752u,393216u}/* 12156 */, /*20554*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879844u,138442752u,393216u}/* 12157 */, /*20555*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879852u,138442752u,393216u}/* 12158 */, /*20556*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879860u,138442752u,393216u}/* 12159 */, /*20557*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879868u,138442752u,393216u}/* 1215A */, /*20558*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879876u,138442752u,393216u}/* 1215B */, /*20559*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879884u,138442752u,393216u}/* 1215C */, /*20560*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879892u,138442752u,393216u}/* 1215D */, /*20561*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879900u,138442752u,393216u}/* 1215E */, /*20562*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879908u,138442752u,393216u}/* 1215F */, /*20563*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879916u,138442752u,393216u}/* 12160 */, /*20564*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879924u,138442752u,393216u}/* 12161 */, /*20565*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879932u,138442752u,393216u}/* 12162 */, /*20566*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879940u,138442752u,393216u}/* 12163 */, /*20567*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879948u,138442752u,393216u}/* 12164 */, /*20568*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879956u,138442752u,393216u}/* 12165 */, /*20569*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879964u,138442752u,393216u}/* 12166 */, /*20570*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879972u,138442752u,393216u}/* 12167 */, /*20571*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879980u,138442752u,393216u}/* 12168 */, /*20572*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879988u,138442752u,393216u}/* 12169 */, /*20573*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677879996u,138442752u,393216u}/* 1216A */, /*20574*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880004u,138442752u,393216u}/* 1216B */, /*20575*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880012u,138442752u,393216u}/* 1216C */, /*20576*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880020u,138442752u,393216u}/* 1216D */, /*20577*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880028u,138442752u,393216u}/* 1216E */, /*20578*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880036u,138442752u,393216u}/* 1216F */, /*20579*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880044u,138442752u,393216u}/* 12170 */, /*20580*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880052u,138442752u,393216u}/* 12171 */, /*20581*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880060u,138442752u,393216u}/* 12172 */, /*20582*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880068u,138442752u,393216u}/* 12173 */, /*20583*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880076u,138442752u,393216u}/* 12174 */, /*20584*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880084u,138442752u,393216u}/* 12175 */, /*20585*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880092u,138442752u,393216u}/* 12176 */, /*20586*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880100u,138442752u,393216u}/* 12177 */, /*20587*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880108u,138442752u,393216u}/* 12178 */, /*20588*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880116u,138442752u,393216u}/* 12179 */, /*20589*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880124u,138442752u,393216u}/* 1217A */, /*20590*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880132u,138442752u,393216u}/* 1217B */, /*20591*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880140u,138442752u,393216u}/* 1217C */, /*20592*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880148u,138442752u,393216u}/* 1217D */, /*20593*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880156u,138442752u,393216u}/* 1217E */, /*20594*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880164u,138442752u,393216u}/* 1217F */, /*20595*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880172u,138442752u,393216u}/* 12180 */, /*20596*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880180u,138442752u,393216u}/* 12181 */, /*20597*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880188u,138442752u,393216u}/* 12182 */, /*20598*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880196u,138442752u,393216u}/* 12183 */, /*20599*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880204u,138442752u,393216u}/* 12184 */, /*20600*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880212u,138442752u,393216u}/* 12185 */, /*20601*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880220u,138442752u,393216u}/* 12186 */, /*20602*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880228u,138442752u,393216u}/* 12187 */, /*20603*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880236u,138442752u,393216u}/* 12188 */, /*20604*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880244u,138442752u,393216u}/* 12189 */, /*20605*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880252u,138442752u,393216u}/* 1218A */, /*20606*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880260u,138442752u,393216u}/* 1218B */, /*20607*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880268u,138442752u,393216u}/* 1218C */, /*20608*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880276u,138442752u,393216u}/* 1218D */, /*20609*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880284u,138442752u,393216u}/* 1218E */, /*20610*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880292u,138442752u,393216u}/* 1218F */, /*20611*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880300u,138442752u,393216u}/* 12190 */, /*20612*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880308u,138442752u,393216u}/* 12191 */, /*20613*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880316u,138442752u,393216u}/* 12192 */, /*20614*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880324u,138442752u,393216u}/* 12193 */, /*20615*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880332u,138442752u,393216u}/* 12194 */, /*20616*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880340u,138442752u,393216u}/* 12195 */, /*20617*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880348u,138442752u,393216u}/* 12196 */, /*20618*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880356u,138442752u,393216u}/* 12197 */, /*20619*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880364u,138442752u,393216u}/* 12198 */, /*20620*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880372u,138442752u,393216u}/* 12199 */, /*20621*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880380u,138442752u,393216u}/* 1219A */, /*20622*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880388u,138442752u,393216u}/* 1219B */, /*20623*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880396u,138442752u,393216u}/* 1219C */, /*20624*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880404u,138442752u,393216u}/* 1219D */, /*20625*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880412u,138442752u,393216u}/* 1219E */, /*20626*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880420u,138442752u,393216u}/* 1219F */, /*20627*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880428u,138442752u,393216u}/* 121A0 */, /*20628*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880436u,138442752u,393216u}/* 121A1 */, /*20629*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880444u,138442752u,393216u}/* 121A2 */, /*20630*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880452u,138442752u,393216u}/* 121A3 */, /*20631*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880460u,138442752u,393216u}/* 121A4 */, /*20632*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880468u,138442752u,393216u}/* 121A5 */, /*20633*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880476u,138442752u,393216u}/* 121A6 */, /*20634*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880484u,138442752u,393216u}/* 121A7 */, /*20635*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880492u,138442752u,393216u}/* 121A8 */, /*20636*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880500u,138442752u,393216u}/* 121A9 */, /*20637*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880508u,138442752u,393216u}/* 121AA */, /*20638*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880516u,138442752u,393216u}/* 121AB */, /*20639*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880524u,138442752u,393216u}/* 121AC */, /*20640*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880532u,138442752u,393216u}/* 121AD */, /*20641*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880540u,138442752u,393216u}/* 121AE */, /*20642*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880548u,138442752u,393216u}/* 121AF */, /*20643*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880556u,138442752u,393216u}/* 121B0 */, /*20644*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880564u,138442752u,393216u}/* 121B1 */, /*20645*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880572u,138442752u,393216u}/* 121B2 */, /*20646*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880580u,138442752u,393216u}/* 121B3 */, /*20647*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880588u,138442752u,393216u}/* 121B4 */, /*20648*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880596u,138442752u,393216u}/* 121B5 */, /*20649*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880604u,138442752u,393216u}/* 121B6 */, /*20650*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880612u,138442752u,393216u}/* 121B7 */, /*20651*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880620u,138442752u,393216u}/* 121B8 */, /*20652*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880628u,138442752u,393216u}/* 121B9 */, /*20653*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880636u,138442752u,393216u}/* 121BA */, /*20654*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880644u,138442752u,393216u}/* 121BB */, /*20655*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880652u,138442752u,393216u}/* 121BC */, /*20656*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880660u,138442752u,393216u}/* 121BD */, /*20657*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880668u,138442752u,393216u}/* 121BE */, /*20658*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880676u,138442752u,393216u}/* 121BF */, /*20659*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880684u,138442752u,393216u}/* 121C0 */, /*20660*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880692u,138442752u,393216u}/* 121C1 */, /*20661*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880700u,138442752u,393216u}/* 121C2 */, /*20662*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880708u,138442752u,393216u}/* 121C3 */, /*20663*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880716u,138442752u,393216u}/* 121C4 */, /*20664*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880724u,138442752u,393216u}/* 121C5 */, /*20665*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880732u,138442752u,393216u}/* 121C6 */, /*20666*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880740u,138442752u,393216u}/* 121C7 */, /*20667*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880748u,138442752u,393216u}/* 121C8 */, /*20668*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880756u,138442752u,393216u}/* 121C9 */, /*20669*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880764u,138442752u,393216u}/* 121CA */, /*20670*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880772u,138442752u,393216u}/* 121CB */, /*20671*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880780u,138442752u,393216u}/* 121CC */, /*20672*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880788u,138442752u,393216u}/* 121CD */, /*20673*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880796u,138442752u,393216u}/* 121CE */, /*20674*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880804u,138442752u,393216u}/* 121CF */, /*20675*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880812u,138442752u,393216u}/* 121D0 */, /*20676*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880820u,138442752u,393216u}/* 121D1 */, /*20677*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880828u,138442752u,393216u}/* 121D2 */, /*20678*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880836u,138442752u,393216u}/* 121D3 */, /*20679*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880844u,138442752u,393216u}/* 121D4 */, /*20680*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880852u,138442752u,393216u}/* 121D5 */, /*20681*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880860u,138442752u,393216u}/* 121D6 */, /*20682*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880868u,138442752u,393216u}/* 121D7 */, /*20683*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880876u,138442752u,393216u}/* 121D8 */, /*20684*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880884u,138442752u,393216u}/* 121D9 */, /*20685*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880892u,138442752u,393216u}/* 121DA */, /*20686*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880900u,138442752u,393216u}/* 121DB */, /*20687*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880908u,138442752u,393216u}/* 121DC */, /*20688*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880916u,138442752u,393216u}/* 121DD */, /*20689*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880924u,138442752u,393216u}/* 121DE */, /*20690*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880932u,138442752u,393216u}/* 121DF */, /*20691*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880940u,138442752u,393216u}/* 121E0 */, /*20692*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880948u,138442752u,393216u}/* 121E1 */, /*20693*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880956u,138442752u,393216u}/* 121E2 */, /*20694*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880964u,138442752u,393216u}/* 121E3 */, /*20695*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880972u,138442752u,393216u}/* 121E4 */, /*20696*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880980u,138442752u,393216u}/* 121E5 */, /*20697*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880988u,138442752u,393216u}/* 121E6 */, /*20698*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677880996u,138442752u,393216u}/* 121E7 */, /*20699*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881004u,138442752u,393216u}/* 121E8 */, /*20700*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881012u,138442752u,393216u}/* 121E9 */, /*20701*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881020u,138442752u,393216u}/* 121EA */, /*20702*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881028u,138442752u,393216u}/* 121EB */, /*20703*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881036u,138442752u,393216u}/* 121EC */, /*20704*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881044u,138442752u,393216u}/* 121ED */, /*20705*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881052u,138442752u,393216u}/* 121EE */, /*20706*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881060u,138442752u,393216u}/* 121EF */, /*20707*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881068u,138442752u,393216u}/* 121F0 */, /*20708*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881076u,138442752u,393216u}/* 121F1 */, /*20709*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881084u,138442752u,393216u}/* 121F2 */, /*20710*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881092u,138442752u,393216u}/* 121F3 */, /*20711*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881100u,138442752u,393216u}/* 121F4 */, /*20712*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881108u,138442752u,393216u}/* 121F5 */, /*20713*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881116u,138442752u,393216u}/* 121F6 */, /*20714*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881124u,138442752u,393216u}/* 121F7 */, /*20715*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881132u,138442752u,393216u}/* 121F8 */, /*20716*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881140u,138442752u,393216u}/* 121F9 */, /*20717*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881148u,138442752u,393216u}/* 121FA */, /*20718*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881156u,138442752u,393216u}/* 121FB */, /*20719*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881164u,138442752u,393216u}/* 121FC */, /*20720*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881172u,138442752u,393216u}/* 121FD */, /*20721*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881180u,138442752u,393216u}/* 121FE */, /*20722*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881188u,138442752u,393216u}/* 121FF */, /*20723*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881196u,138442752u,393216u}/* 12200 */, /*20724*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881204u,138442752u,393216u}/* 12201 */, /*20725*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881212u,138442752u,393216u}/* 12202 */, /*20726*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881220u,138442752u,393216u}/* 12203 */, /*20727*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881228u,138442752u,393216u}/* 12204 */, /*20728*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881236u,138442752u,393216u}/* 12205 */, /*20729*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881244u,138442752u,393216u}/* 12206 */, /*20730*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881252u,138442752u,393216u}/* 12207 */, /*20731*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881260u,138442752u,393216u}/* 12208 */, /*20732*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881268u,138442752u,393216u}/* 12209 */, /*20733*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881276u,138442752u,393216u}/* 1220A */, /*20734*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881284u,138442752u,393216u}/* 1220B */, /*20735*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881292u,138442752u,393216u}/* 1220C */, /*20736*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881300u,138442752u,393216u}/* 1220D */, /*20737*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881308u,138442752u,393216u}/* 1220E */, /*20738*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881316u,138442752u,393216u}/* 1220F */, /*20739*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881324u,138442752u,393216u}/* 12210 */, /*20740*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881332u,138442752u,393216u}/* 12211 */, /*20741*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881340u,138442752u,393216u}/* 12212 */, /*20742*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881348u,138442752u,393216u}/* 12213 */, /*20743*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881356u,138442752u,393216u}/* 12214 */, /*20744*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881364u,138442752u,393216u}/* 12215 */, /*20745*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881372u,138442752u,393216u}/* 12216 */, /*20746*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881380u,138442752u,393216u}/* 12217 */, /*20747*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881388u,138442752u,393216u}/* 12218 */, /*20748*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881396u,138442752u,393216u}/* 12219 */, /*20749*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881404u,138442752u,393216u}/* 1221A */, /*20750*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881412u,138442752u,393216u}/* 1221B */, /*20751*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881420u,138442752u,393216u}/* 1221C */, /*20752*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881428u,138442752u,393216u}/* 1221D */, /*20753*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881436u,138442752u,393216u}/* 1221E */, /*20754*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881444u,138442752u,393216u}/* 1221F */, /*20755*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881452u,138442752u,393216u}/* 12220 */, /*20756*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881460u,138442752u,393216u}/* 12221 */, /*20757*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881468u,138442752u,393216u}/* 12222 */, /*20758*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881476u,138442752u,393216u}/* 12223 */, /*20759*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881484u,138442752u,393216u}/* 12224 */, /*20760*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881492u,138442752u,393216u}/* 12225 */, /*20761*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881500u,138442752u,393216u}/* 12226 */, /*20762*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881508u,138442752u,393216u}/* 12227 */, /*20763*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881516u,138442752u,393216u}/* 12228 */, /*20764*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881524u,138442752u,393216u}/* 12229 */, /*20765*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881532u,138442752u,393216u}/* 1222A */, /*20766*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881540u,138442752u,393216u}/* 1222B */, /*20767*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881548u,138442752u,393216u}/* 1222C */, /*20768*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881556u,138442752u,393216u}/* 1222D */, /*20769*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881564u,138442752u,393216u}/* 1222E */, /*20770*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881572u,138442752u,393216u}/* 1222F */, /*20771*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881580u,138442752u,393216u}/* 12230 */, /*20772*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881588u,138442752u,393216u}/* 12231 */, /*20773*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881596u,138442752u,393216u}/* 12232 */, /*20774*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881604u,138442752u,393216u}/* 12233 */, /*20775*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881612u,138442752u,393216u}/* 12234 */, /*20776*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881620u,138442752u,393216u}/* 12235 */, /*20777*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881628u,138442752u,393216u}/* 12236 */, /*20778*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881636u,138442752u,393216u}/* 12237 */, /*20779*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881644u,138442752u,393216u}/* 12238 */, /*20780*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881652u,138442752u,393216u}/* 12239 */, /*20781*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881660u,138442752u,393216u}/* 1223A */, /*20782*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881668u,138442752u,393216u}/* 1223B */, /*20783*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881676u,138442752u,393216u}/* 1223C */, /*20784*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881684u,138442752u,393216u}/* 1223D */, /*20785*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881692u,138442752u,393216u}/* 1223E */, /*20786*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881700u,138442752u,393216u}/* 1223F */, /*20787*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881708u,138442752u,393216u}/* 12240 */, /*20788*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881716u,138442752u,393216u}/* 12241 */, /*20789*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881724u,138442752u,393216u}/* 12242 */, /*20790*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881732u,138442752u,393216u}/* 12243 */, /*20791*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881740u,138442752u,393216u}/* 12244 */, /*20792*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881748u,138442752u,393216u}/* 12245 */, /*20793*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881756u,138442752u,393216u}/* 12246 */, /*20794*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881764u,138442752u,393216u}/* 12247 */, /*20795*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881772u,138442752u,393216u}/* 12248 */, /*20796*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881780u,138442752u,393216u}/* 12249 */, /*20797*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881788u,138442752u,393216u}/* 1224A */, /*20798*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881796u,138442752u,393216u}/* 1224B */, /*20799*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881804u,138442752u,393216u}/* 1224C */, /*20800*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881812u,138442752u,393216u}/* 1224D */, /*20801*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881820u,138442752u,393216u}/* 1224E */, /*20802*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881828u,138442752u,393216u}/* 1224F */, /*20803*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881836u,138442752u,393216u}/* 12250 */, /*20804*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881844u,138442752u,393216u}/* 12251 */, /*20805*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881852u,138442752u,393216u}/* 12252 */, /*20806*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881860u,138442752u,393216u}/* 12253 */, /*20807*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881868u,138442752u,393216u}/* 12254 */, /*20808*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881876u,138442752u,393216u}/* 12255 */, /*20809*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881884u,138442752u,393216u}/* 12256 */, /*20810*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881892u,138442752u,393216u}/* 12257 */, /*20811*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881900u,138442752u,393216u}/* 12258 */, /*20812*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881908u,138442752u,393216u}/* 12259 */, /*20813*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881916u,138442752u,393216u}/* 1225A */, /*20814*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881924u,138442752u,393216u}/* 1225B */, /*20815*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881932u,138442752u,393216u}/* 1225C */, /*20816*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881940u,138442752u,393216u}/* 1225D */, /*20817*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881948u,138442752u,393216u}/* 1225E */, /*20818*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881956u,138442752u,393216u}/* 1225F */, /*20819*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881964u,138442752u,393216u}/* 12260 */, /*20820*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881972u,138442752u,393216u}/* 12261 */, /*20821*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881980u,138442752u,393216u}/* 12262 */, /*20822*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882004u,138442752u,393216u}/* 12263 */, /*20823*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882012u,138442752u,393216u}/* 12264 */, /*20824*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882020u,138442752u,393216u}/* 12265 */, /*20825*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882028u,138442752u,393216u}/* 12266 */, /*20826*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882036u,138442752u,393216u}/* 12267 */, /*20827*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882044u,138442752u,393216u}/* 12268 */, /*20828*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882052u,138442752u,393216u}/* 12269 */, /*20829*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882060u,138442752u,393216u}/* 1226A */, /*20830*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882068u,138442752u,393216u}/* 1226B */, /*20831*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882076u,138442752u,393216u}/* 1226C */, /*20832*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882084u,138442752u,393216u}/* 1226D */, /*20833*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882092u,138442752u,393216u}/* 1226E */, /*20834*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882100u,138442752u,393216u}/* 1226F */, /*20835*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882108u,138442752u,393216u}/* 12270 */, /*20836*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882116u,138442752u,393216u}/* 12271 */, /*20837*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882124u,138442752u,393216u}/* 12272 */, /*20838*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882132u,138442752u,393216u}/* 12273 */, /*20839*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882140u,138442752u,393216u}/* 12274 */, /*20840*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882148u,138442752u,393216u}/* 12275 */, /*20841*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882156u,138442752u,393216u}/* 12276 */, /*20842*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882164u,138442752u,393216u}/* 12277 */, /*20843*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882172u,138442752u,393216u}/* 12278 */, /*20844*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882180u,138442752u,393216u}/* 12279 */, /*20845*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882188u,138442752u,393216u}/* 1227A */, /*20846*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882196u,138442752u,393216u}/* 1227B */, /*20847*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882204u,138442752u,393216u}/* 1227C */, /*20848*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882212u,138442752u,393216u}/* 1227D */, /*20849*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882220u,138442752u,393216u}/* 1227E */, /*20850*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882228u,138442752u,393216u}/* 1227F */, /*20851*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882236u,138442752u,393216u}/* 12280 */, /*20852*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882244u,138442752u,393216u}/* 12281 */, /*20853*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882252u,138442752u,393216u}/* 12282 */, /*20854*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882260u,138442752u,393216u}/* 12283 */, /*20855*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882268u,138442752u,393216u}/* 12284 */, /*20856*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882276u,138442752u,393216u}/* 12285 */, /*20857*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882284u,138442752u,393216u}/* 12286 */, /*20858*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882292u,138442752u,393216u}/* 12287 */, /*20859*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882300u,138442752u,393216u}/* 12288 */, /*20860*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882308u,138442752u,393216u}/* 12289 */, /*20861*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882316u,138442752u,393216u}/* 1228A */, /*20862*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882324u,138442752u,393216u}/* 1228B */, /*20863*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882332u,138442752u,393216u}/* 1228C */, /*20864*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882340u,138442752u,393216u}/* 1228D */, /*20865*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882348u,138442752u,393216u}/* 1228E */, /*20866*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882356u,138442752u,393216u}/* 1228F */, /*20867*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882364u,138442752u,393216u}/* 12290 */, /*20868*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882372u,138442752u,393216u}/* 12291 */, /*20869*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882380u,138442752u,393216u}/* 12292 */, /*20870*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882388u,138442752u,393216u}/* 12293 */, /*20871*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882396u,138442752u,393216u}/* 12294 */, /*20872*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882404u,138442752u,393216u}/* 12295 */, /*20873*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882412u,138442752u,393216u}/* 12296 */, /*20874*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882420u,138442752u,393216u}/* 12297 */, /*20875*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882428u,138442752u,393216u}/* 12298 */, /*20876*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882436u,138442752u,393216u}/* 12299 */, /*20877*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882444u,138442752u,393216u}/* 1229A */, /*20878*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882452u,138442752u,393216u}/* 1229B */, /*20879*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882460u,138442752u,393216u}/* 1229C */, /*20880*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882468u,138442752u,393216u}/* 1229D */, /*20881*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882476u,138442752u,393216u}/* 1229E */, /*20882*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882484u,138442752u,393216u}/* 1229F */, /*20883*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882492u,138442752u,393216u}/* 122A0 */, /*20884*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882500u,138442752u,393216u}/* 122A1 */, /*20885*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882508u,138442752u,393216u}/* 122A2 */, /*20886*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882516u,138442752u,393216u}/* 122A3 */, /*20887*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882524u,138442752u,393216u}/* 122A4 */, /*20888*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882532u,138442752u,393216u}/* 122A5 */, /*20889*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882540u,138442752u,393216u}/* 122A6 */, /*20890*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882548u,138442752u,393216u}/* 122A7 */, /*20891*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882556u,138442752u,393216u}/* 122A8 */, /*20892*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882564u,138442752u,393216u}/* 122A9 */, /*20893*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882572u,138442752u,393216u}/* 122AA */, /*20894*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882580u,138442752u,393216u}/* 122AB */, /*20895*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882588u,138442752u,393216u}/* 122AC */, /*20896*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882596u,138442752u,393216u}/* 122AD */, /*20897*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882604u,138442752u,393216u}/* 122AE */, /*20898*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882612u,138442752u,393216u}/* 122AF */, /*20899*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882620u,138442752u,393216u}/* 122B0 */, /*20900*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882628u,138442752u,393216u}/* 122B1 */, /*20901*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882636u,138442752u,393216u}/* 122B2 */, /*20902*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882644u,138442752u,393216u}/* 122B3 */, /*20903*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882652u,138442752u,393216u}/* 122B4 */, /*20904*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882660u,138442752u,393216u}/* 122B5 */, /*20905*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882668u,138442752u,393216u}/* 122B6 */, /*20906*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882676u,138442752u,393216u}/* 122B7 */, /*20907*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882684u,138442752u,393216u}/* 122B8 */, /*20908*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882692u,138442752u,393216u}/* 122B9 */, /*20909*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882700u,138442752u,393216u}/* 122BA */, /*20910*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882708u,138442752u,393216u}/* 122BB */, /*20911*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882716u,138442752u,393216u}/* 122BC */, /*20912*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882724u,138442752u,393216u}/* 122BD */, /*20913*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882732u,138442752u,393216u}/* 122BE */, /*20914*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882740u,138442752u,393216u}/* 122BF */, /*20915*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882748u,138442752u,393216u}/* 122C0 */, /*20916*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882756u,138442752u,393216u}/* 122C1 */, /*20917*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882764u,138442752u,393216u}/* 122C2 */, /*20918*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882772u,138442752u,393216u}/* 122C3 */, /*20919*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882780u,138442752u,393216u}/* 122C4 */, /*20920*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882788u,138442752u,393216u}/* 122C5 */, /*20921*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882796u,138442752u,393216u}/* 122C6 */, /*20922*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882804u,138442752u,393216u}/* 122C7 */, /*20923*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882812u,138442752u,393216u}/* 122C8 */, /*20924*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882820u,138442752u,393216u}/* 122C9 */, /*20925*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882828u,138442752u,393216u}/* 122CA */, /*20926*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882836u,138442752u,393216u}/* 122CB */, /*20927*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882844u,138442752u,393216u}/* 122CC */, /*20928*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882852u,138442752u,393216u}/* 122CD */, /*20929*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882860u,138442752u,393216u}/* 122CE */, /*20930*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882868u,138442752u,393216u}/* 122CF */, /*20931*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882876u,138442752u,393216u}/* 122D0 */, /*20932*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882884u,138442752u,393216u}/* 122D1 */, /*20933*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882892u,138442752u,393216u}/* 122D2 */, /*20934*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882900u,138442752u,393216u}/* 122D3 */, /*20935*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881988u,138442752u,393216u}/* 122D4 */, /*20936*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677881996u,138442752u,393216u}/* 122D5 */, /*20937*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882908u,138442752u,393216u}/* 122D6 */, /*20938*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882916u,138442752u,393216u}/* 122D7 */, /*20939*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882924u,138442752u,393216u}/* 122D8 */, /*20940*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882932u,138442752u,393216u}/* 122D9 */, /*20941*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882940u,138442752u,393216u}/* 122DA */, /*20942*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882948u,138442752u,393216u}/* 122DB */, /*20943*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882956u,138442752u,393216u}/* 122DC */, /*20944*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882964u,138442752u,393216u}/* 122DD */, /*20945*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882972u,138442752u,393216u}/* 122DE */, /*20946*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882980u,138442752u,393216u}/* 122DF */, /*20947*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882988u,138442752u,393216u}/* 122E0 */, /*20948*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677882996u,138442752u,393216u}/* 122E1 */, /*20949*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883004u,138442752u,393216u}/* 122E2 */, /*20950*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883012u,138442752u,393216u}/* 122E3 */, /*20951*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883020u,138442752u,393216u}/* 122E4 */, /*20952*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883028u,138442752u,393216u}/* 122E5 */, /*20953*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883036u,138442752u,393216u}/* 122E6 */, /*20954*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883044u,138442752u,393216u}/* 122E7 */, /*20955*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883052u,138442752u,393216u}/* 122E8 */, /*20956*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883060u,138442752u,393216u}/* 122E9 */, /*20957*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883068u,138442752u,393216u}/* 122EA */, /*20958*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883076u,138442752u,393216u}/* 122EB */, /*20959*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883084u,138442752u,393216u}/* 122EC */, /*20960*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883092u,138442752u,393216u}/* 122ED */, /*20961*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883100u,138442752u,393216u}/* 122EE */, /*20962*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883108u,138442752u,393216u}/* 122EF */, /*20963*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883116u,138442752u,393216u}/* 122F0 */, /*20964*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883124u,138442752u,393216u}/* 122F1 */, /*20965*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883132u,138442752u,393216u}/* 122F2 */, /*20966*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883140u,138442752u,393216u}/* 122F3 */, /*20967*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883148u,138442752u,393216u}/* 122F4 */, /*20968*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883156u,138442752u,393216u}/* 122F5 */, /*20969*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883164u,138442752u,393216u}/* 122F6 */, /*20970*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883172u,138442752u,393216u}/* 122F7 */, /*20971*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883180u,138442752u,393216u}/* 122F8 */, /*20972*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883188u,138442752u,393216u}/* 122F9 */, /*20973*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883196u,138442752u,393216u}/* 122FA */, /*20974*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883204u,138442752u,393216u}/* 122FB */, /*20975*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883212u,138442752u,393216u}/* 122FC */, /*20976*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883220u,138442752u,393216u}/* 122FD */, /*20977*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883228u,138442752u,393216u}/* 122FE */, /*20978*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883236u,138442752u,393216u}/* 122FF */, /*20979*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883244u,138442752u,393216u}/* 12300 */, /*20980*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883252u,138442752u,393216u}/* 12301 */, /*20981*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883260u,138442752u,393216u}/* 12302 */, /*20982*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883268u,138442752u,393216u}/* 12303 */, /*20983*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883276u,138442752u,393216u}/* 12304 */, /*20984*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883284u,138442752u,393216u}/* 12305 */, /*20985*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883292u,138442752u,393216u}/* 12306 */, /*20986*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883300u,138442752u,393216u}/* 12307 */, /*20987*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883308u,138442752u,393216u}/* 12308 */, /*20988*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883316u,138442752u,393216u}/* 12309 */, /*20989*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883324u,138442752u,393216u}/* 1230A */, /*20990*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883332u,138442752u,393216u}/* 1230B */, /*20991*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883340u,138442752u,393216u}/* 1230C */, /*20992*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883348u,138442752u,393216u}/* 1230D */, /*20993*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883356u,138442752u,393216u}/* 1230E */, /*20994*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883364u,138442752u,393216u}/* 1230F */, /*20995*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883372u,138442752u,393216u}/* 12310 */, /*20996*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883380u,138442752u,393216u}/* 12311 */, /*20997*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883388u,138442752u,393216u}/* 12312 */, /*20998*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883396u,138442752u,393216u}/* 12313 */, /*20999*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883404u,138442752u,393216u}/* 12314 */, /*21000*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883412u,138442752u,393216u}/* 12315 */, /*21001*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883420u,138442752u,393216u}/* 12316 */, /*21002*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883428u,138442752u,393216u}/* 12317 */, /*21003*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883436u,138442752u,393216u}/* 12318 */, /*21004*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883444u,138442752u,393216u}/* 12319 */, /*21005*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883452u,138442752u,393216u}/* 1231A */, /*21006*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883460u,138442752u,393216u}/* 1231B */, /*21007*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883468u,138442752u,393216u}/* 1231C */, /*21008*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883476u,138442752u,393216u}/* 1231D */, /*21009*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883484u,138442752u,393216u}/* 1231E */, /*21010*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883492u,138442752u,393216u}/* 1231F */, /*21011*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883500u,138442752u,393216u}/* 12320 */, /*21012*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883508u,138442752u,393216u}/* 12321 */, /*21013*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883516u,138442752u,393216u}/* 12322 */, /*21014*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883524u,138442752u,393216u}/* 12323 */, /*21015*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883532u,138442752u,393216u}/* 12324 */, /*21016*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883540u,138442752u,393216u}/* 12325 */, /*21017*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883548u,138442752u,393216u}/* 12326 */, /*21018*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883556u,138442752u,393216u}/* 12327 */, /*21019*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883564u,138442752u,393216u}/* 12328 */, /*21020*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883572u,138442752u,393216u}/* 12329 */, /*21021*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883580u,138442752u,393216u}/* 1232A */, /*21022*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883588u,138442752u,393216u}/* 1232B */, /*21023*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883596u,138442752u,393216u}/* 1232C */, /*21024*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883604u,138442752u,393216u}/* 1232D */, /*21025*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883612u,138442752u,393216u}/* 1232E */, /*21026*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883620u,138442752u,393216u}/* 1232F */, /*21027*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883628u,138442752u,393216u}/* 12330 */, /*21028*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883636u,138442752u,393216u}/* 12331 */, /*21029*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883644u,138442752u,393216u}/* 12332 */, /*21030*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883652u,138442752u,393216u}/* 12333 */, /*21031*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883660u,138442752u,393216u}/* 12334 */, /*21032*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883668u,138442752u,393216u}/* 12335 */, /*21033*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883676u,138442752u,393216u}/* 12336 */, /*21034*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883684u,138442752u,393216u}/* 12337 */, /*21035*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883692u,138442752u,393216u}/* 12338 */, /*21036*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883700u,138442752u,393216u}/* 12339 */, /*21037*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883708u,138442752u,393216u}/* 1233A */, /*21038*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883716u,138442752u,393216u}/* 1233B */, /*21039*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883724u,138442752u,393216u}/* 1233C */, /*21040*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883732u,138442752u,393216u}/* 1233D */, /*21041*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883740u,138442752u,393216u}/* 1233E */, /*21042*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883748u,138442752u,393216u}/* 1233F */, /*21043*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883756u,138442752u,393216u}/* 12340 */, /*21044*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883764u,138442752u,393216u}/* 12341 */, /*21045*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883772u,138442752u,393216u}/* 12342 */, /*21046*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883780u,138442752u,393216u}/* 12343 */, /*21047*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883788u,138442752u,393216u}/* 12344 */, /*21048*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883796u,138442752u,393216u}/* 12345 */, /*21049*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883804u,138442752u,393216u}/* 12346 */, /*21050*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883812u,138442752u,393216u}/* 12347 */, /*21051*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883820u,138442752u,393216u}/* 12348 */, /*21052*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883828u,138442752u,393216u}/* 12349 */, /*21053*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883836u,138442752u,393216u}/* 1234A */, /*21054*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883844u,138442752u,393216u}/* 1234B */, /*21055*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883852u,138442752u,393216u}/* 1234C */, /*21056*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883860u,138442752u,393216u}/* 1234D */, /*21057*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883868u,138442752u,393216u}/* 1234E */, /*21058*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883876u,138442752u,393216u}/* 1234F */, /*21059*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883884u,138442752u,393216u}/* 12350 */, /*21060*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883892u,138442752u,393216u}/* 12351 */, /*21061*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883900u,138442752u,393216u}/* 12352 */, /*21062*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883908u,138442752u,393216u}/* 12353 */, /*21063*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883916u,138442752u,393216u}/* 12354 */, /*21064*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883924u,138442752u,393216u}/* 12355 */, /*21065*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883932u,138442752u,393216u}/* 12356 */, /*21066*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883940u,138442752u,393216u}/* 12357 */, /*21067*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883948u,138442752u,393216u}/* 12358 */, /*21068*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883956u,138442752u,393216u}/* 12359 */, /*21069*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883964u,138442752u,393216u}/* 1235A */, /*21070*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883972u,138442752u,393216u}/* 1235B */, /*21071*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883980u,138442752u,393216u}/* 1235C */, /*21072*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883988u,138442752u,393216u}/* 1235D */, /*21073*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677883996u,138442752u,393216u}/* 1235E */, /*21074*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677884004u,138442752u,393216u}/* 1235F */, /*21075*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677884012u,138442752u,393216u}/* 12360 */, /*21076*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677884020u,138442752u,393216u}/* 12361 */, /*21077*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677884028u,138442752u,393216u}/* 12362 */, /*21078*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677884036u,138442752u,393216u}/* 12363 */, /*21079*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677884044u,138442752u,393216u}/* 12364 */, /*21080*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677884052u,138442752u,393216u}/* 12365 */, /*21081*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677884060u,138442752u,393216u}/* 12366 */, /*21082*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677884068u,138442752u,393216u}/* 12367 */, /*21083*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677884076u,138442752u,393216u}/* 12368 */, /*21084*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677884084u,138442752u,393216u}/* 12369 */, /*21085*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677884092u,138442752u,393216u}/* 1236A */, /*21086*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677884100u,138442752u,393216u}/* 1236B */, /*21087*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677884108u,138442752u,393216u}/* 1236C */, /*21088*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677884116u,138442752u,393216u}/* 1236D */, /*21089*/{0,1832u,4128769u,76840965u,1515560u,3758096416u,1677884124u,138442752u,393216u}/* 1236E */, /*21090*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884132u,138442752u,393216u}/* 1236F */, /*21091*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884140u,138442752u,393216u}/* 12370 */, /*21092*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884148u,138442752u,393216u}/* 12371 */, /*21093*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884156u,138442752u,393216u}/* 12372 */, /*21094*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884164u,138442752u,393216u}/* 12373 */, /*21095*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884172u,138442752u,393216u}/* 12374 */, /*21096*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884180u,138442752u,393216u}/* 12375 */, /*21097*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884188u,138442752u,393216u}/* 12376 */, /*21098*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884196u,138442752u,393216u}/* 12377 */, /*21099*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884204u,138442752u,393216u}/* 12378 */, /*21100*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884212u,138442752u,393216u}/* 12379 */, /*21101*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884220u,138442752u,393216u}/* 1237A */, /*21102*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884228u,138442752u,393216u}/* 1237B */, /*21103*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884236u,138442752u,393216u}/* 1237C */, /*21104*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884244u,138442752u,393216u}/* 1237D */, /*21105*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884252u,138442752u,393216u}/* 1237E */, /*21106*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884260u,138442752u,393216u}/* 1237F */, /*21107*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884268u,138442752u,393216u}/* 12380 */, /*21108*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884276u,138442752u,393216u}/* 12381 */, /*21109*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884284u,138442752u,393216u}/* 12382 */, /*21110*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884292u,138442752u,393216u}/* 12383 */, /*21111*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884300u,138442752u,393216u}/* 12384 */, /*21112*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884308u,138442752u,393216u}/* 12385 */, /*21113*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884316u,138442752u,393216u}/* 12386 */, /*21114*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884324u,138442752u,393216u}/* 12387 */, /*21115*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884332u,138442752u,393216u}/* 12388 */, /*21116*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884340u,138442752u,393216u}/* 12389 */, /*21117*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884348u,138442752u,393216u}/* 1238A */, /*21118*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884356u,138442752u,393216u}/* 1238B */, /*21119*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884364u,138442752u,393216u}/* 1238C */, /*21120*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884372u,138442752u,393216u}/* 1238D */, /*21121*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884380u,138442752u,393216u}/* 1238E */, /*21122*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884388u,138442752u,393216u}/* 1238F */, /*21123*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884396u,138442752u,393216u}/* 12390 */, /*21124*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884404u,138442752u,393216u}/* 12391 */, /*21125*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884412u,138442752u,393216u}/* 12392 */, /*21126*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884420u,138442752u,393216u}/* 12393 */, /*21127*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884428u,138442752u,393216u}/* 12394 */, /*21128*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884436u,138442752u,393216u}/* 12395 */, /*21129*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884444u,138442752u,393216u}/* 12396 */, /*21130*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884452u,138442752u,393216u}/* 12397 */, /*21131*/{0,1832u,4128769u,77070341u,1515560u,3758096416u,1677884460u,138442752u,393216u}/* 12398 */, /*21132*/{0,1832u,4128769u,77103109u,1515560u,3758096416u,1677884468u,138442752u,393216u}/* 12399 */, /*21133*/{0,1840u,574556673u,76840970u,9904170u,3758096416u,1610671413u,138442752u,393216u}/* 12400 */, /*21134*/{0,1840u,608110593u,76840970u,9904170u,3758096416u,1610671421u,138442752u,393216u}/* 12401 */, /*21135*/{0,1840u,641667073u,76840970u,9904170u,3758096416u,1610671429u,138442752u,393216u}/* 12402 */, /*21136*/{0,1840u,675220481u,76840970u,9904170u,3758096416u,1610671437u,138442752u,393216u}/* 12403 */, /*21137*/{0,1840u,708777473u,76840970u,9904170u,3758096416u,1610671445u,138442752u,393216u}/* 12404 */, /*21138*/{0,1840u,742329857u,76840970u,9904170u,3758096416u,1610671453u,138442752u,393216u}/* 12405 */, /*21139*/{0,1840u,775887873u,76840970u,9904170u,3758096416u,1610671461u,138442752u,393216u}/* 12406 */, /*21140*/{0,1840u,809440257u,76840970u,9904170u,3758096416u,1610671469u,138442752u,393216u}/* 12407 */, /*21141*/{0,1840u,541001217u,76840970u,9904170u,3758096416u,1610671405u,138442752u,393216u}/* 12415 */, /*21142*/{0,1840u,2067770369u,76840970u,9904170u,3758096416u,1610670621u,138442752u,393216u}/* 12432 */, /*21143*/{0,1840u,2118103553u,76840970u,9904170u,3758096416u,1610670629u,138442752u,393216u}/* 12433 */, /*21144*/{0,1840u,306120193u,76840970u,68624426u,3758096416u,1610670637u,138442752u,393216u}/* 1245A */, /*21145*/{0,1840u,440338945u,76840970u,68624426u,3758096416u,1610670645u,138442752u,393216u}/* 1245B */, /*21146*/{0,1840u,490671105u,76840970u,56041514u,3758096416u,1610670653u,138442752u,393216u}/* 1245C */, /*21147*/{0,1840u,306120193u,76840970u,68624426u,3758096416u,1610670661u,138442752u,393216u}/* 1245D */, /*21148*/{0,1840u,440338945u,76840970u,68624426u,3758096416u,1610670669u,138442752u,393216u}/* 1245E */, /*21149*/{0,1840u,188679681u,76840970u,47652906u,3758096416u,1610670677u,138442752u,393216u}/* 1245F */, /*21150*/{0,1840u,289342977u,76840970u,64430122u,3758096416u,1610670685u,138442752u,393216u}/* 12460 */, /*21151*/{0,1840u,239011329u,76840970u,56041514u,3758096416u,1610670693u,138442752u,393216u}/* 12461 */, /*21152*/{0,1840u,289342977u,76840970u,64430122u,3758096416u,1610670701u,138442752u,393216u}/* 12462 */, /*21153*/{0,1840u,289342977u,77070346u,64430122u,3758096416u,1610670709u,138442752u,393216u}/* 12463 */, /*21154*/{0,1840u,373229057u,77070346u,5709866u,3758096416u,1610670717u,138442752u,393216u}/* 12464 */, /*21155*/{0,1840u,306120193u,77070346u,68624426u,3758096416u,1610670725u,138442752u,393216u}/* 12465 */, /*21156*/{0,1840u,440338945u,77070346u,68624426u,3758096416u,1610670733u,138442752u,393216u}/* 12466 */, /*21157*/{0,1840u,1329550337u,77070346u,9904170u,3758096416u,1610670741u,138442752u,393216u}/* 12467 */, /*21158*/{0,1840u,1497327617u,77070346u,9904170u,3758096416u,1610670749u,138442752u,393216u}/* 12468 */, /*21159*/{0,1840u,641667073u,77070346u,9904170u,3758096416u,1610671429u,138442752u,393216u}/* 12469 */, /*21160*/{0,1840u,675220481u,77070346u,9904170u,3758096416u,1610671437u,138442752u,393216u}/* 1246A */, /*21161*/{0,1840u,708777473u,77070346u,9904170u,3758096416u,1610671445u,138442752u,393216u}/* 1246B */, /*21162*/{0,1840u,742329857u,77070346u,9904170u,3758096416u,1610671453u,138442752u,393216u}/* 1246C */, /*21163*/{0,1840u,775887873u,77070346u,9904170u,3758096416u,1610671461u,138442752u,393216u}/* 1246D */, /*21164*/{0,1840u,809440257u,77070346u,9904170u,3758096416u,1610671469u,138442752u,393216u}/* 1246E */, /*21165*/{0,1840u,4128769u,69500951u,40u,1610612768u,6164u,138442754u,8388608u}/* 12470 */, /*21166*/{0,1840u,4128769u,69500951u,40u,1610612768u,6172u,138442754u,8388608u}/* 12471 */, /*21167*/{0,1840u,4128769u,69500951u,40u,1610612768u,6180u,138442754u,8388608u}/* 12472 */, /*21168*/{0,1840u,4128769u,69500951u,40u,1610612768u,6188u,138442754u,8388608u}/* 12473 */, /*21169*/{0,1840u,4128769u,69730327u,40u,1610612768u,6196u,138442754u,8388608u}/* 12474 */, /*21170*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884476u,138442752u,393216u}/* 12480 */, /*21171*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884484u,138442752u,393216u}/* 12481 */, /*21172*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884492u,138442752u,393216u}/* 12482 */, /*21173*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884500u,138442752u,393216u}/* 12483 */, /*21174*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884508u,138442752u,393216u}/* 12484 */, /*21175*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884516u,138442752u,393216u}/* 12485 */, /*21176*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884524u,138442752u,393216u}/* 12486 */, /*21177*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884532u,138442752u,393216u}/* 12487 */, /*21178*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884540u,138442752u,393216u}/* 12488 */, /*21179*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884548u,138442752u,393216u}/* 12489 */, /*21180*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884556u,138442752u,393216u}/* 1248A */, /*21181*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884564u,138442752u,393216u}/* 1248B */, /*21182*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884572u,138442752u,393216u}/* 1248C */, /*21183*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884580u,138442752u,393216u}/* 1248D */, /*21184*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884588u,138442752u,393216u}/* 1248E */, /*21185*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884596u,138442752u,393216u}/* 1248F */, /*21186*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884604u,138442752u,393216u}/* 12490 */, /*21187*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884612u,138442752u,393216u}/* 12491 */, /*21188*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884620u,138442752u,393216u}/* 12492 */, /*21189*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884628u,138442752u,393216u}/* 12493 */, /*21190*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884636u,138442752u,393216u}/* 12494 */, /*21191*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884644u,138442752u,393216u}/* 12495 */, /*21192*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884652u,138442752u,393216u}/* 12496 */, /*21193*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884660u,138442752u,393216u}/* 12497 */, /*21194*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884668u,138442752u,393216u}/* 12498 */, /*21195*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884676u,138442752u,393216u}/* 12499 */, /*21196*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884684u,138442752u,393216u}/* 1249A */, /*21197*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884692u,138442752u,393216u}/* 1249B */, /*21198*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884700u,138442752u,393216u}/* 1249C */, /*21199*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884708u,138442752u,393216u}/* 1249D */, /*21200*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884716u,138442752u,393216u}/* 1249E */, /*21201*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884724u,138442752u,393216u}/* 1249F */, /*21202*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884732u,138442752u,393216u}/* 124A0 */, /*21203*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884740u,138442752u,393216u}/* 124A1 */, /*21204*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884748u,138442752u,393216u}/* 124A2 */, /*21205*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884756u,138442752u,393216u}/* 124A3 */, /*21206*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884764u,138442752u,393216u}/* 124A4 */, /*21207*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884772u,138442752u,393216u}/* 124A5 */, /*21208*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884780u,138442752u,393216u}/* 124A6 */, /*21209*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884788u,138442752u,393216u}/* 124A7 */, /*21210*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884796u,138442752u,393216u}/* 124A8 */, /*21211*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884804u,138442752u,393216u}/* 124A9 */, /*21212*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884812u,138442752u,393216u}/* 124AA */, /*21213*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884820u,138442752u,393216u}/* 124AB */, /*21214*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884828u,138442752u,393216u}/* 124AC */, /*21215*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884836u,138442752u,393216u}/* 124AD */, /*21216*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884844u,138442752u,393216u}/* 124AE */, /*21217*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884852u,138442752u,393216u}/* 124AF */, /*21218*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884860u,138442752u,393216u}/* 124B0 */, /*21219*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884868u,138442752u,393216u}/* 124B1 */, /*21220*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884876u,138442752u,393216u}/* 124B2 */, /*21221*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884884u,138442752u,393216u}/* 124B3 */, /*21222*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884892u,138442752u,393216u}/* 124B4 */, /*21223*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884900u,138442752u,393216u}/* 124B5 */, /*21224*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884908u,138442752u,393216u}/* 124B6 */, /*21225*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884916u,138442752u,393216u}/* 124B7 */, /*21226*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884924u,138442752u,393216u}/* 124B8 */, /*21227*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884932u,138442752u,393216u}/* 124B9 */, /*21228*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884940u,138442752u,393216u}/* 124BA */, /*21229*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884948u,138442752u,393216u}/* 124BB */, /*21230*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884956u,138442752u,393216u}/* 124BC */, /*21231*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884964u,138442752u,393216u}/* 124BD */, /*21232*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884972u,138442752u,393216u}/* 124BE */, /*21233*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884980u,138442752u,393216u}/* 124BF */, /*21234*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884988u,138442752u,393216u}/* 124C0 */, /*21235*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677884996u,138442752u,393216u}/* 124C1 */, /*21236*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885004u,138442752u,393216u}/* 124C2 */, /*21237*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885012u,138442752u,393216u}/* 124C3 */, /*21238*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885020u,138442752u,393216u}/* 124C4 */, /*21239*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885028u,138442752u,393216u}/* 124C5 */, /*21240*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885036u,138442752u,393216u}/* 124C6 */, /*21241*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885044u,138442752u,393216u}/* 124C7 */, /*21242*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885052u,138442752u,393216u}/* 124C8 */, /*21243*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885060u,138442752u,393216u}/* 124C9 */, /*21244*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885068u,138442752u,393216u}/* 124CA */, /*21245*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885076u,138442752u,393216u}/* 124CB */, /*21246*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885084u,138442752u,393216u}/* 124CC */, /*21247*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885092u,138442752u,393216u}/* 124CD */, /*21248*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885100u,138442752u,393216u}/* 124CE */, /*21249*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885108u,138442752u,393216u}/* 124CF */, /*21250*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885116u,138442752u,393216u}/* 124D0 */, /*21251*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885124u,138442752u,393216u}/* 124D1 */, /*21252*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885132u,138442752u,393216u}/* 124D2 */, /*21253*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885140u,138442752u,393216u}/* 124D3 */, /*21254*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885148u,138442752u,393216u}/* 124D4 */, /*21255*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885156u,138442752u,393216u}/* 124D5 */, /*21256*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885164u,138442752u,393216u}/* 124D6 */, /*21257*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885172u,138442752u,393216u}/* 124D7 */, /*21258*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885180u,138442752u,393216u}/* 124D8 */, /*21259*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885188u,138442752u,393216u}/* 124D9 */, /*21260*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885196u,138442752u,393216u}/* 124DA */, /*21261*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885204u,138442752u,393216u}/* 124DB */, /*21262*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885212u,138442752u,393216u}/* 124DC */, /*21263*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885220u,138442752u,393216u}/* 124DD */, /*21264*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885228u,138442752u,393216u}/* 124DE */, /*21265*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885236u,138442752u,393216u}/* 124DF */, /*21266*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885244u,138442752u,393216u}/* 124E0 */, /*21267*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885252u,138442752u,393216u}/* 124E1 */, /*21268*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885260u,138442752u,393216u}/* 124E2 */, /*21269*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885268u,138442752u,393216u}/* 124E3 */, /*21270*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885276u,138442752u,393216u}/* 124E4 */, /*21271*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885284u,138442752u,393216u}/* 124E5 */, /*21272*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885292u,138442752u,393216u}/* 124E6 */, /*21273*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885300u,138442752u,393216u}/* 124E7 */, /*21274*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885308u,138442752u,393216u}/* 124E8 */, /*21275*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885316u,138442752u,393216u}/* 124E9 */, /*21276*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885324u,138442752u,393216u}/* 124EA */, /*21277*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885332u,138442752u,393216u}/* 124EB */, /*21278*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885340u,138442752u,393216u}/* 124EC */, /*21279*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885348u,138442752u,393216u}/* 124ED */, /*21280*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885356u,138442752u,393216u}/* 124EE */, /*21281*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885364u,138442752u,393216u}/* 124EF */, /*21282*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885372u,138442752u,393216u}/* 124F0 */, /*21283*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885380u,138442752u,393216u}/* 124F1 */, /*21284*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885388u,138442752u,393216u}/* 124F2 */, /*21285*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885396u,138442752u,393216u}/* 124F3 */, /*21286*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885404u,138442752u,393216u}/* 124F4 */, /*21287*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885412u,138442752u,393216u}/* 124F5 */, /*21288*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885420u,138442752u,393216u}/* 124F6 */, /*21289*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885428u,138442752u,393216u}/* 124F7 */, /*21290*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885436u,138442752u,393216u}/* 124F8 */, /*21291*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885444u,138442752u,393216u}/* 124F9 */, /*21292*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885452u,138442752u,393216u}/* 124FA */, /*21293*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885460u,138442752u,393216u}/* 124FB */, /*21294*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885468u,138442752u,393216u}/* 124FC */, /*21295*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885476u,138442752u,393216u}/* 124FD */, /*21296*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885484u,138442752u,393216u}/* 124FE */, /*21297*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885492u,138442752u,393216u}/* 124FF */, /*21298*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885500u,138442752u,393216u}/* 12500 */, /*21299*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885508u,138442752u,393216u}/* 12501 */, /*21300*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885516u,138442752u,393216u}/* 12502 */, /*21301*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885524u,138442752u,393216u}/* 12503 */, /*21302*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885532u,138442752u,393216u}/* 12504 */, /*21303*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885540u,138442752u,393216u}/* 12505 */, /*21304*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885548u,138442752u,393216u}/* 12506 */, /*21305*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885556u,138442752u,393216u}/* 12507 */, /*21306*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885564u,138442752u,393216u}/* 12508 */, /*21307*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885572u,138442752u,393216u}/* 12509 */, /*21308*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885580u,138442752u,393216u}/* 1250A */, /*21309*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885588u,138442752u,393216u}/* 1250B */, /*21310*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885596u,138442752u,393216u}/* 1250C */, /*21311*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885604u,138442752u,393216u}/* 1250D */, /*21312*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885612u,138442752u,393216u}/* 1250E */, /*21313*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885620u,138442752u,393216u}/* 1250F */, /*21314*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885628u,138442752u,393216u}/* 12510 */, /*21315*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885636u,138442752u,393216u}/* 12511 */, /*21316*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885644u,138442752u,393216u}/* 12512 */, /*21317*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885652u,138442752u,393216u}/* 12513 */, /*21318*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885660u,138442752u,393216u}/* 12514 */, /*21319*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885668u,138442752u,393216u}/* 12515 */, /*21320*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885676u,138442752u,393216u}/* 12516 */, /*21321*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885684u,138442752u,393216u}/* 12517 */, /*21322*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885692u,138442752u,393216u}/* 12518 */, /*21323*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885700u,138442752u,393216u}/* 12519 */, /*21324*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885708u,138442752u,393216u}/* 1251A */, /*21325*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885716u,138442752u,393216u}/* 1251B */, /*21326*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885724u,138442752u,393216u}/* 1251C */, /*21327*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885732u,138442752u,393216u}/* 1251D */, /*21328*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885740u,138442752u,393216u}/* 1251E */, /*21329*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885748u,138442752u,393216u}/* 1251F */, /*21330*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885756u,138442752u,393216u}/* 12520 */, /*21331*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885764u,138442752u,393216u}/* 12521 */, /*21332*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885772u,138442752u,393216u}/* 12522 */, /*21333*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885780u,138442752u,393216u}/* 12523 */, /*21334*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885788u,138442752u,393216u}/* 12524 */, /*21335*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885796u,138442752u,393216u}/* 12525 */, /*21336*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885804u,138442752u,393216u}/* 12526 */, /*21337*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885812u,138442752u,393216u}/* 12527 */, /*21338*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885820u,138442752u,393216u}/* 12528 */, /*21339*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885828u,138442752u,393216u}/* 12529 */, /*21340*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885836u,138442752u,393216u}/* 1252A */, /*21341*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885844u,138442752u,393216u}/* 1252B */, /*21342*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885852u,138442752u,393216u}/* 1252C */, /*21343*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885860u,138442752u,393216u}/* 1252D */, /*21344*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885868u,138442752u,393216u}/* 1252E */, /*21345*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885876u,138442752u,393216u}/* 1252F */, /*21346*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885884u,138442752u,393216u}/* 12530 */, /*21347*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885892u,138442752u,393216u}/* 12531 */, /*21348*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885900u,138442752u,393216u}/* 12532 */, /*21349*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885908u,138442752u,393216u}/* 12533 */, /*21350*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885916u,138442752u,393216u}/* 12534 */, /*21351*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885924u,138442752u,393216u}/* 12535 */, /*21352*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885932u,138442752u,393216u}/* 12536 */, /*21353*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885940u,138442752u,393216u}/* 12537 */, /*21354*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885948u,138442752u,393216u}/* 12538 */, /*21355*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885956u,138442752u,393216u}/* 12539 */, /*21356*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885964u,138442752u,393216u}/* 1253A */, /*21357*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885972u,138442752u,393216u}/* 1253B */, /*21358*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885980u,138442752u,393216u}/* 1253C */, /*21359*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885988u,138442752u,393216u}/* 1253D */, /*21360*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677885996u,138442752u,393216u}/* 1253E */, /*21361*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677886004u,138442752u,393216u}/* 1253F */, /*21362*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677886012u,138442752u,393216u}/* 12540 */, /*21363*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677886020u,138442752u,393216u}/* 12541 */, /*21364*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677886028u,138442752u,393216u}/* 12542 */, /*21365*/{0,1848u,4128769u,77103109u,1515560u,3758096416u,1677886036u,138442752u,393216u}/* 12543 */, /*21366*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886044u,138442752u,393216u}/* 13000 */, /*21367*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886052u,138442752u,393216u}/* 13001 */, /*21368*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886060u,138442752u,393216u}/* 13002 */, /*21369*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886068u,138442752u,393216u}/* 13003 */, /*21370*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886076u,138442752u,393216u}/* 13004 */, /*21371*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886084u,138442752u,393216u}/* 13005 */, /*21372*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886092u,138442752u,393216u}/* 13006 */, /*21373*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886100u,138442752u,393216u}/* 13007 */, /*21374*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886108u,138442752u,393216u}/* 13008 */, /*21375*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886116u,138442752u,393216u}/* 13009 */, /*21376*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886124u,138442752u,393216u}/* 1300A */, /*21377*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886132u,138442752u,393216u}/* 1300B */, /*21378*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886140u,138442752u,393216u}/* 1300C */, /*21379*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886148u,138442752u,393216u}/* 1300D */, /*21380*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886156u,138442752u,393216u}/* 1300E */, /*21381*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886164u,138442752u,393216u}/* 1300F */, /*21382*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886172u,138442752u,393216u}/* 13010 */, /*21383*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886180u,138442752u,393216u}/* 13011 */, /*21384*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886188u,138442752u,393216u}/* 13012 */, /*21385*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886196u,138442752u,393216u}/* 13013 */, /*21386*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886204u,138442752u,393216u}/* 13014 */, /*21387*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886212u,138442752u,393216u}/* 13015 */, /*21388*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886220u,138442752u,393216u}/* 13016 */, /*21389*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886228u,138442752u,393216u}/* 13017 */, /*21390*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886236u,138442752u,393216u}/* 13018 */, /*21391*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886244u,138442752u,393216u}/* 13019 */, /*21392*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886252u,138442752u,393216u}/* 1301A */, /*21393*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886260u,138442752u,393216u}/* 1301B */, /*21394*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886268u,138442752u,393216u}/* 1301C */, /*21395*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886276u,138442752u,393216u}/* 1301D */, /*21396*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886284u,138442752u,393216u}/* 1301E */, /*21397*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886292u,138442752u,393216u}/* 1301F */, /*21398*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886300u,138442752u,393216u}/* 13020 */, /*21399*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886308u,138442752u,393216u}/* 13021 */, /*21400*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886316u,138442752u,393216u}/* 13022 */, /*21401*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886324u,138442752u,393216u}/* 13023 */, /*21402*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886332u,138442752u,393216u}/* 13024 */, /*21403*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886340u,138442752u,393216u}/* 13025 */, /*21404*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886348u,138442752u,393216u}/* 13026 */, /*21405*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886356u,138442752u,393216u}/* 13027 */, /*21406*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886364u,138442752u,393216u}/* 13028 */, /*21407*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886372u,138442752u,393216u}/* 13029 */, /*21408*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886380u,138442752u,393216u}/* 1302A */, /*21409*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886388u,138442752u,393216u}/* 1302B */, /*21410*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886396u,138442752u,393216u}/* 1302C */, /*21411*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886404u,138442752u,393216u}/* 1302D */, /*21412*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886412u,138442752u,393216u}/* 1302E */, /*21413*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886420u,138442752u,393216u}/* 1302F */, /*21414*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886428u,138442752u,393216u}/* 13030 */, /*21415*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886436u,138442752u,393216u}/* 13031 */, /*21416*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886444u,138442752u,393216u}/* 13032 */, /*21417*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886452u,138442752u,393216u}/* 13033 */, /*21418*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886460u,138442752u,393216u}/* 13034 */, /*21419*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886468u,138442752u,393216u}/* 13035 */, /*21420*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886476u,138442752u,393216u}/* 13036 */, /*21421*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886484u,138442752u,393216u}/* 13037 */, /*21422*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886492u,138442752u,393216u}/* 13038 */, /*21423*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886500u,138442752u,393216u}/* 13039 */, /*21424*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886508u,138442752u,393216u}/* 1303A */, /*21425*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886516u,138442752u,393216u}/* 1303B */, /*21426*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886524u,138442752u,393216u}/* 1303C */, /*21427*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886532u,138442752u,393216u}/* 1303D */, /*21428*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886540u,138442752u,393216u}/* 1303E */, /*21429*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886548u,138442752u,393216u}/* 1303F */, /*21430*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886556u,138442752u,393216u}/* 13040 */, /*21431*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886564u,138442752u,393216u}/* 13041 */, /*21432*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886572u,138442752u,393216u}/* 13042 */, /*21433*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886580u,138442752u,393216u}/* 13043 */, /*21434*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886588u,138442752u,393216u}/* 13044 */, /*21435*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886596u,138442752u,393216u}/* 13045 */, /*21436*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886604u,138442752u,393216u}/* 13046 */, /*21437*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886612u,138442752u,393216u}/* 13047 */, /*21438*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886620u,138442752u,393216u}/* 13048 */, /*21439*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886628u,138442752u,393216u}/* 13049 */, /*21440*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886636u,138442752u,393216u}/* 1304A */, /*21441*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886644u,138442752u,393216u}/* 1304B */, /*21442*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886652u,138442752u,393216u}/* 1304C */, /*21443*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886660u,138442752u,393216u}/* 1304D */, /*21444*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886668u,138442752u,393216u}/* 1304E */, /*21445*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886676u,138442752u,393216u}/* 1304F */, /*21446*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886684u,138442752u,393216u}/* 13050 */, /*21447*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886692u,138442752u,393216u}/* 13051 */, /*21448*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886700u,138442752u,393216u}/* 13052 */, /*21449*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886708u,138442752u,393216u}/* 13053 */, /*21450*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886716u,138442752u,393216u}/* 13054 */, /*21451*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886724u,138442752u,393216u}/* 13055 */, /*21452*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886732u,138442752u,393216u}/* 13056 */, /*21453*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886740u,138442752u,393216u}/* 13057 */, /*21454*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886748u,138442752u,393216u}/* 13058 */, /*21455*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886756u,138442752u,393216u}/* 13059 */, /*21456*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886764u,138442752u,393216u}/* 1305A */, /*21457*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886772u,138442752u,393216u}/* 1305B */, /*21458*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886780u,138442752u,393216u}/* 1305C */, /*21459*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886788u,138442752u,393216u}/* 1305D */, /*21460*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886796u,138442752u,393216u}/* 1305E */, /*21461*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886804u,138442752u,393216u}/* 1305F */, /*21462*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886812u,138442752u,393216u}/* 13060 */, /*21463*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886820u,138442752u,393216u}/* 13061 */, /*21464*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886828u,138442752u,393216u}/* 13062 */, /*21465*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886836u,138442752u,393216u}/* 13063 */, /*21466*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886844u,138442752u,393216u}/* 13064 */, /*21467*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886852u,138442752u,393216u}/* 13065 */, /*21468*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886860u,138442752u,393216u}/* 13066 */, /*21469*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886868u,138442752u,393216u}/* 13067 */, /*21470*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886876u,138442752u,393216u}/* 13068 */, /*21471*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886884u,138442752u,393216u}/* 13069 */, /*21472*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886892u,138442752u,393216u}/* 1306A */, /*21473*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886900u,138442752u,393216u}/* 1306B */, /*21474*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886908u,138442752u,393216u}/* 1306C */, /*21475*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886916u,138442752u,393216u}/* 1306D */, /*21476*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886924u,138442752u,393216u}/* 1306E */, /*21477*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886932u,138442752u,393216u}/* 1306F */, /*21478*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886940u,138442752u,393216u}/* 13070 */, /*21479*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886948u,138442752u,393216u}/* 13071 */, /*21480*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886956u,138442752u,393216u}/* 13072 */, /*21481*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886964u,138442752u,393216u}/* 13073 */, /*21482*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886972u,138442752u,393216u}/* 13074 */, /*21483*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886980u,138442752u,393216u}/* 13075 */, /*21484*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886988u,138442752u,393216u}/* 13076 */, /*21485*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677886996u,138442752u,393216u}/* 13077 */, /*21486*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887004u,138442752u,393216u}/* 13078 */, /*21487*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887012u,138442752u,393216u}/* 13079 */, /*21488*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887020u,138442752u,393216u}/* 1307A */, /*21489*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887028u,138442752u,393216u}/* 1307B */, /*21490*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887036u,138442752u,393216u}/* 1307C */, /*21491*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887044u,138442752u,393216u}/* 1307D */, /*21492*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887052u,138442752u,393216u}/* 1307E */, /*21493*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887060u,138442752u,393216u}/* 1307F */, /*21494*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887068u,138442752u,393216u}/* 13080 */, /*21495*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887076u,138442752u,393216u}/* 13081 */, /*21496*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887084u,138442752u,393216u}/* 13082 */, /*21497*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887092u,138442752u,393216u}/* 13083 */, /*21498*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887100u,138442752u,393216u}/* 13084 */, /*21499*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887108u,138442752u,393216u}/* 13085 */, /*21500*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887116u,138442752u,393216u}/* 13086 */, /*21501*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887124u,138442752u,393216u}/* 13087 */, /*21502*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887132u,138442752u,393216u}/* 13088 */, /*21503*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887140u,138442752u,393216u}/* 13089 */, /*21504*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887148u,138442752u,393216u}/* 1308A */, /*21505*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887156u,138442752u,393216u}/* 1308B */, /*21506*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887164u,138442752u,393216u}/* 1308C */, /*21507*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887172u,138442752u,393216u}/* 1308D */, /*21508*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887180u,138442752u,393216u}/* 1308E */, /*21509*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887188u,138442752u,393216u}/* 1308F */, /*21510*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887196u,138442752u,393216u}/* 13090 */, /*21511*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887204u,138442752u,393216u}/* 13091 */, /*21512*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887212u,138442752u,393216u}/* 13092 */, /*21513*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887220u,138442752u,393216u}/* 13093 */, /*21514*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887228u,138442752u,393216u}/* 13094 */, /*21515*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887236u,138442752u,393216u}/* 13095 */, /*21516*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887244u,138442752u,393216u}/* 13096 */, /*21517*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887252u,138442752u,393216u}/* 13097 */, /*21518*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887260u,138442752u,393216u}/* 13098 */, /*21519*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887268u,138442752u,393216u}/* 13099 */, /*21520*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887276u,138442752u,393216u}/* 1309A */, /*21521*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887284u,138442752u,393216u}/* 1309B */, /*21522*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887292u,138442752u,393216u}/* 1309C */, /*21523*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887300u,138442752u,393216u}/* 1309D */, /*21524*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887308u,138442752u,393216u}/* 1309E */, /*21525*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887316u,138442752u,393216u}/* 1309F */, /*21526*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887324u,138442752u,393216u}/* 130A0 */, /*21527*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887332u,138442752u,393216u}/* 130A1 */, /*21528*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887340u,138442752u,393216u}/* 130A2 */, /*21529*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887348u,138442752u,393216u}/* 130A3 */, /*21530*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887356u,138442752u,393216u}/* 130A4 */, /*21531*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887364u,138442752u,393216u}/* 130A5 */, /*21532*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887372u,138442752u,393216u}/* 130A6 */, /*21533*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887380u,138442752u,393216u}/* 130A7 */, /*21534*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887388u,138442752u,393216u}/* 130A8 */, /*21535*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887396u,138442752u,393216u}/* 130A9 */, /*21536*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887404u,138442752u,393216u}/* 130AA */, /*21537*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887412u,138442752u,393216u}/* 130AB */, /*21538*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887420u,138442752u,393216u}/* 130AC */, /*21539*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887428u,138442752u,393216u}/* 130AD */, /*21540*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887436u,138442752u,393216u}/* 130AE */, /*21541*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887444u,138442752u,393216u}/* 130AF */, /*21542*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887452u,138442752u,393216u}/* 130B0 */, /*21543*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887460u,138442752u,393216u}/* 130B1 */, /*21544*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887468u,138442752u,393216u}/* 130B2 */, /*21545*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887476u,138442752u,393216u}/* 130B3 */, /*21546*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887484u,138442752u,393216u}/* 130B4 */, /*21547*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887492u,138442752u,393216u}/* 130B5 */, /*21548*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887500u,138442752u,393216u}/* 130B6 */, /*21549*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887508u,138442752u,393216u}/* 130B7 */, /*21550*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887516u,138442752u,393216u}/* 130B8 */, /*21551*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887524u,138442752u,393216u}/* 130B9 */, /*21552*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887532u,138442752u,393216u}/* 130BA */, /*21553*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887540u,138442752u,393216u}/* 130BB */, /*21554*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887548u,138442752u,393216u}/* 130BC */, /*21555*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887556u,138442752u,393216u}/* 130BD */, /*21556*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887564u,138442752u,393216u}/* 130BE */, /*21557*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887572u,138442752u,393216u}/* 130BF */, /*21558*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887580u,138442752u,393216u}/* 130C0 */, /*21559*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887588u,138442752u,393216u}/* 130C1 */, /*21560*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887596u,138442752u,393216u}/* 130C2 */, /*21561*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887604u,138442752u,393216u}/* 130C3 */, /*21562*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887612u,138442752u,393216u}/* 130C4 */, /*21563*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887620u,138442752u,393216u}/* 130C5 */, /*21564*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887628u,138442752u,393216u}/* 130C6 */, /*21565*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887636u,138442752u,393216u}/* 130C7 */, /*21566*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887644u,138442752u,393216u}/* 130C8 */, /*21567*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887652u,138442752u,393216u}/* 130C9 */, /*21568*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887660u,138442752u,393216u}/* 130CA */, /*21569*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887668u,138442752u,393216u}/* 130CB */, /*21570*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887676u,138442752u,393216u}/* 130CC */, /*21571*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887684u,138442752u,393216u}/* 130CD */, /*21572*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887692u,138442752u,393216u}/* 130CE */, /*21573*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887700u,138442752u,393216u}/* 130CF */, /*21574*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887708u,138442752u,393216u}/* 130D0 */, /*21575*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887716u,138442752u,393216u}/* 130D1 */, /*21576*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887724u,138442752u,393216u}/* 130D2 */, /*21577*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887732u,138442752u,393216u}/* 130D3 */, /*21578*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887740u,138442752u,393216u}/* 130D4 */, /*21579*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887748u,138442752u,393216u}/* 130D5 */, /*21580*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887756u,138442752u,393216u}/* 130D6 */, /*21581*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887764u,138442752u,393216u}/* 130D7 */, /*21582*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887772u,138442752u,393216u}/* 130D8 */, /*21583*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887780u,138442752u,393216u}/* 130D9 */, /*21584*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887788u,138442752u,393216u}/* 130DA */, /*21585*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887796u,138442752u,393216u}/* 130DB */, /*21586*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887804u,138442752u,393216u}/* 130DC */, /*21587*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887812u,138442752u,393216u}/* 130DD */, /*21588*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887820u,138442752u,393216u}/* 130DE */, /*21589*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887828u,138442752u,393216u}/* 130DF */, /*21590*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887836u,138442752u,393216u}/* 130E0 */, /*21591*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887844u,138442752u,393216u}/* 130E1 */, /*21592*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887852u,138442752u,393216u}/* 130E2 */, /*21593*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887860u,138442752u,393216u}/* 130E3 */, /*21594*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887868u,138442752u,393216u}/* 130E4 */, /*21595*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887876u,138442752u,393216u}/* 130E5 */, /*21596*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887884u,138442752u,393216u}/* 130E6 */, /*21597*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887892u,138442752u,393216u}/* 130E7 */, /*21598*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887900u,138442752u,393216u}/* 130E8 */, /*21599*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887908u,138442752u,393216u}/* 130E9 */, /*21600*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887916u,138442752u,393216u}/* 130EA */, /*21601*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887924u,138442752u,393216u}/* 130EB */, /*21602*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887932u,138442752u,393216u}/* 130EC */, /*21603*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887940u,138442752u,393216u}/* 130ED */, /*21604*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887948u,138442752u,393216u}/* 130EE */, /*21605*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887956u,138442752u,393216u}/* 130EF */, /*21606*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887964u,138442752u,393216u}/* 130F0 */, /*21607*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887972u,138442752u,393216u}/* 130F1 */, /*21608*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887980u,138442752u,393216u}/* 130F2 */, /*21609*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887988u,138442752u,393216u}/* 130F3 */, /*21610*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677887996u,138442752u,393216u}/* 130F4 */, /*21611*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888004u,138442752u,393216u}/* 130F5 */, /*21612*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888012u,138442752u,393216u}/* 130F6 */, /*21613*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888020u,138442752u,393216u}/* 130F7 */, /*21614*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888028u,138442752u,393216u}/* 130F8 */, /*21615*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888036u,138442752u,393216u}/* 130F9 */, /*21616*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888044u,138442752u,393216u}/* 130FA */, /*21617*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888052u,138442752u,393216u}/* 130FB */, /*21618*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888060u,138442752u,393216u}/* 130FC */, /*21619*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888068u,138442752u,393216u}/* 130FD */, /*21620*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888076u,138442752u,393216u}/* 130FE */, /*21621*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888084u,138442752u,393216u}/* 130FF */, /*21622*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888092u,138442752u,393216u}/* 13100 */, /*21623*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888100u,138442752u,393216u}/* 13101 */, /*21624*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888108u,138442752u,393216u}/* 13102 */, /*21625*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888116u,138442752u,393216u}/* 13103 */, /*21626*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888124u,138442752u,393216u}/* 13104 */, /*21627*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888132u,138442752u,393216u}/* 13105 */, /*21628*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888140u,138442752u,393216u}/* 13106 */, /*21629*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888148u,138442752u,393216u}/* 13107 */, /*21630*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888156u,138442752u,393216u}/* 13108 */, /*21631*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888164u,138442752u,393216u}/* 13109 */, /*21632*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888172u,138442752u,393216u}/* 1310A */, /*21633*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888180u,138442752u,393216u}/* 1310B */, /*21634*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888188u,138442752u,393216u}/* 1310C */, /*21635*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888196u,138442752u,393216u}/* 1310D */, /*21636*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888204u,138442752u,393216u}/* 1310E */, /*21637*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888212u,138442752u,393216u}/* 1310F */, /*21638*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888220u,138442752u,393216u}/* 13110 */, /*21639*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888228u,138442752u,393216u}/* 13111 */, /*21640*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888236u,138442752u,393216u}/* 13112 */, /*21641*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888244u,138442752u,393216u}/* 13113 */, /*21642*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888252u,138442752u,393216u}/* 13114 */, /*21643*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888260u,138442752u,393216u}/* 13115 */, /*21644*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888268u,138442752u,393216u}/* 13116 */, /*21645*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888276u,138442752u,393216u}/* 13117 */, /*21646*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888284u,138442752u,393216u}/* 13118 */, /*21647*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888292u,138442752u,393216u}/* 13119 */, /*21648*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888300u,138442752u,393216u}/* 1311A */, /*21649*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888308u,138442752u,393216u}/* 1311B */, /*21650*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888316u,138442752u,393216u}/* 1311C */, /*21651*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888324u,138442752u,393216u}/* 1311D */, /*21652*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888332u,138442752u,393216u}/* 1311E */, /*21653*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888340u,138442752u,393216u}/* 1311F */, /*21654*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888348u,138442752u,393216u}/* 13120 */, /*21655*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888356u,138442752u,393216u}/* 13121 */, /*21656*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888364u,138442752u,393216u}/* 13122 */, /*21657*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888372u,138442752u,393216u}/* 13123 */, /*21658*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888380u,138442752u,393216u}/* 13124 */, /*21659*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888388u,138442752u,393216u}/* 13125 */, /*21660*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888396u,138442752u,393216u}/* 13126 */, /*21661*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888404u,138442752u,393216u}/* 13127 */, /*21662*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888412u,138442752u,393216u}/* 13128 */, /*21663*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888420u,138442752u,393216u}/* 13129 */, /*21664*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888428u,138442752u,393216u}/* 1312A */, /*21665*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888436u,138442752u,393216u}/* 1312B */, /*21666*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888444u,138442752u,393216u}/* 1312C */, /*21667*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888452u,138442752u,393216u}/* 1312D */, /*21668*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888460u,138442752u,393216u}/* 1312E */, /*21669*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888468u,138442752u,393216u}/* 1312F */, /*21670*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888476u,138442752u,393216u}/* 13130 */, /*21671*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888484u,138442752u,393216u}/* 13131 */, /*21672*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888492u,138442752u,393216u}/* 13132 */, /*21673*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888500u,138442752u,393216u}/* 13133 */, /*21674*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888508u,138442752u,393216u}/* 13134 */, /*21675*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888516u,138442752u,393216u}/* 13135 */, /*21676*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888524u,138442752u,393216u}/* 13136 */, /*21677*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888532u,138442752u,393216u}/* 13137 */, /*21678*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888540u,138442752u,393216u}/* 13138 */, /*21679*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888548u,138442752u,393216u}/* 13139 */, /*21680*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888556u,138442752u,393216u}/* 1313A */, /*21681*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888564u,138442752u,393216u}/* 1313B */, /*21682*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888572u,138442752u,393216u}/* 1313C */, /*21683*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888580u,138442752u,393216u}/* 1313D */, /*21684*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888588u,138442752u,393216u}/* 1313E */, /*21685*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888596u,138442752u,393216u}/* 1313F */, /*21686*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888604u,138442752u,393216u}/* 13140 */, /*21687*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888612u,138442752u,393216u}/* 13141 */, /*21688*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888620u,138442752u,393216u}/* 13142 */, /*21689*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888628u,138442752u,393216u}/* 13143 */, /*21690*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888636u,138442752u,393216u}/* 13144 */, /*21691*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888644u,138442752u,393216u}/* 13145 */, /*21692*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888652u,138442752u,393216u}/* 13146 */, /*21693*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888660u,138442752u,393216u}/* 13147 */, /*21694*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888668u,138442752u,393216u}/* 13148 */, /*21695*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888676u,138442752u,393216u}/* 13149 */, /*21696*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888684u,138442752u,393216u}/* 1314A */, /*21697*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888692u,138442752u,393216u}/* 1314B */, /*21698*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888700u,138442752u,393216u}/* 1314C */, /*21699*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888708u,138442752u,393216u}/* 1314D */, /*21700*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888716u,138442752u,393216u}/* 1314E */, /*21701*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888724u,138442752u,393216u}/* 1314F */, /*21702*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888732u,138442752u,393216u}/* 13150 */, /*21703*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888740u,138442752u,393216u}/* 13151 */, /*21704*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888748u,138442752u,393216u}/* 13152 */, /*21705*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888756u,138442752u,393216u}/* 13153 */, /*21706*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888764u,138442752u,393216u}/* 13154 */, /*21707*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888772u,138442752u,393216u}/* 13155 */, /*21708*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888780u,138442752u,393216u}/* 13156 */, /*21709*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888788u,138442752u,393216u}/* 13157 */, /*21710*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888796u,138442752u,393216u}/* 13158 */, /*21711*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888804u,138442752u,393216u}/* 13159 */, /*21712*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888812u,138442752u,393216u}/* 1315A */, /*21713*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888820u,138442752u,393216u}/* 1315B */, /*21714*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888828u,138442752u,393216u}/* 1315C */, /*21715*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888836u,138442752u,393216u}/* 1315D */, /*21716*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888844u,138442752u,393216u}/* 1315E */, /*21717*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888852u,138442752u,393216u}/* 1315F */, /*21718*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888860u,138442752u,393216u}/* 13160 */, /*21719*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888868u,138442752u,393216u}/* 13161 */, /*21720*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888876u,138442752u,393216u}/* 13162 */, /*21721*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888884u,138442752u,393216u}/* 13163 */, /*21722*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888892u,138442752u,393216u}/* 13164 */, /*21723*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888900u,138442752u,393216u}/* 13165 */, /*21724*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888908u,138442752u,393216u}/* 13166 */, /*21725*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888916u,138442752u,393216u}/* 13167 */, /*21726*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888924u,138442752u,393216u}/* 13168 */, /*21727*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888932u,138442752u,393216u}/* 13169 */, /*21728*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888940u,138442752u,393216u}/* 1316A */, /*21729*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888948u,138442752u,393216u}/* 1316B */, /*21730*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888956u,138442752u,393216u}/* 1316C */, /*21731*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888964u,138442752u,393216u}/* 1316D */, /*21732*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888972u,138442752u,393216u}/* 1316E */, /*21733*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888980u,138442752u,393216u}/* 1316F */, /*21734*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888988u,138442752u,393216u}/* 13170 */, /*21735*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677888996u,138442752u,393216u}/* 13171 */, /*21736*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889004u,138442752u,393216u}/* 13172 */, /*21737*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889012u,138442752u,393216u}/* 13173 */, /*21738*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889020u,138442752u,393216u}/* 13174 */, /*21739*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889028u,138442752u,393216u}/* 13175 */, /*21740*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889036u,138442752u,393216u}/* 13176 */, /*21741*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889044u,138442752u,393216u}/* 13177 */, /*21742*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889052u,138442752u,393216u}/* 13178 */, /*21743*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889060u,138442752u,393216u}/* 13179 */, /*21744*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889068u,138442752u,393216u}/* 1317A */, /*21745*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889076u,138442752u,393216u}/* 1317B */, /*21746*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889084u,138442752u,393216u}/* 1317C */, /*21747*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889092u,138442752u,393216u}/* 1317D */, /*21748*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889100u,138442752u,393216u}/* 1317E */, /*21749*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889108u,138442752u,393216u}/* 1317F */, /*21750*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889116u,138442752u,393216u}/* 13180 */, /*21751*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889124u,138442752u,393216u}/* 13181 */, /*21752*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889132u,138442752u,393216u}/* 13182 */, /*21753*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889140u,138442752u,393216u}/* 13183 */, /*21754*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889148u,138442752u,393216u}/* 13184 */, /*21755*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889156u,138442752u,393216u}/* 13185 */, /*21756*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889164u,138442752u,393216u}/* 13186 */, /*21757*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889172u,138442752u,393216u}/* 13187 */, /*21758*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889180u,138442752u,393216u}/* 13188 */, /*21759*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889188u,138442752u,393216u}/* 13189 */, /*21760*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889196u,138442752u,393216u}/* 1318A */, /*21761*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889204u,138442752u,393216u}/* 1318B */, /*21762*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889212u,138442752u,393216u}/* 1318C */, /*21763*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889220u,138442752u,393216u}/* 1318D */, /*21764*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889228u,138442752u,393216u}/* 1318E */, /*21765*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889236u,138442752u,393216u}/* 1318F */, /*21766*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889244u,138442752u,393216u}/* 13190 */, /*21767*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889252u,138442752u,393216u}/* 13191 */, /*21768*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889260u,138442752u,393216u}/* 13192 */, /*21769*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889268u,138442752u,393216u}/* 13193 */, /*21770*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889276u,138442752u,393216u}/* 13194 */, /*21771*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889284u,138442752u,393216u}/* 13195 */, /*21772*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889292u,138442752u,393216u}/* 13196 */, /*21773*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889300u,138442752u,393216u}/* 13197 */, /*21774*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889308u,138442752u,393216u}/* 13198 */, /*21775*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889316u,138442752u,393216u}/* 13199 */, /*21776*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889324u,138442752u,393216u}/* 1319A */, /*21777*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889332u,138442752u,393216u}/* 1319B */, /*21778*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889340u,138442752u,393216u}/* 1319C */, /*21779*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889348u,138442752u,393216u}/* 1319D */, /*21780*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889356u,138442752u,393216u}/* 1319E */, /*21781*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889364u,138442752u,393216u}/* 1319F */, /*21782*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889372u,138442752u,393216u}/* 131A0 */, /*21783*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889380u,138442752u,393216u}/* 131A1 */, /*21784*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889388u,138442752u,393216u}/* 131A2 */, /*21785*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889396u,138442752u,393216u}/* 131A3 */, /*21786*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889404u,138442752u,393216u}/* 131A4 */, /*21787*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889412u,138442752u,393216u}/* 131A5 */, /*21788*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889420u,138442752u,393216u}/* 131A6 */, /*21789*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889428u,138442752u,393216u}/* 131A7 */, /*21790*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889436u,138442752u,393216u}/* 131A8 */, /*21791*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889444u,138442752u,393216u}/* 131A9 */, /*21792*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889452u,138442752u,393216u}/* 131AA */, /*21793*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889460u,138442752u,393216u}/* 131AB */, /*21794*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889468u,138442752u,393216u}/* 131AC */, /*21795*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889476u,138442752u,393216u}/* 131AD */, /*21796*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889484u,138442752u,393216u}/* 131AE */, /*21797*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889492u,138442752u,393216u}/* 131AF */, /*21798*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889500u,138442752u,393216u}/* 131B0 */, /*21799*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889508u,138442752u,393216u}/* 131B1 */, /*21800*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889516u,138442752u,393216u}/* 131B2 */, /*21801*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889524u,138442752u,393216u}/* 131B3 */, /*21802*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889532u,138442752u,393216u}/* 131B4 */, /*21803*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889540u,138442752u,393216u}/* 131B5 */, /*21804*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889548u,138442752u,393216u}/* 131B6 */, /*21805*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889556u,138442752u,393216u}/* 131B7 */, /*21806*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889564u,138442752u,393216u}/* 131B8 */, /*21807*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889572u,138442752u,393216u}/* 131B9 */, /*21808*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889580u,138442752u,393216u}/* 131BA */, /*21809*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889588u,138442752u,393216u}/* 131BB */, /*21810*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889596u,138442752u,393216u}/* 131BC */, /*21811*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889604u,138442752u,393216u}/* 131BD */, /*21812*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889612u,138442752u,393216u}/* 131BE */, /*21813*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889620u,138442752u,393216u}/* 131BF */, /*21814*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889628u,138442752u,393216u}/* 131C0 */, /*21815*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889636u,138442752u,393216u}/* 131C1 */, /*21816*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889644u,138442752u,393216u}/* 131C2 */, /*21817*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889652u,138442752u,393216u}/* 131C3 */, /*21818*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889660u,138442752u,393216u}/* 131C4 */, /*21819*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889668u,138442752u,393216u}/* 131C5 */, /*21820*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889676u,138442752u,393216u}/* 131C6 */, /*21821*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889684u,138442752u,393216u}/* 131C7 */, /*21822*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889692u,138442752u,393216u}/* 131C8 */, /*21823*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889700u,138442752u,393216u}/* 131C9 */, /*21824*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889708u,138442752u,393216u}/* 131CA */, /*21825*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889716u,138442752u,393216u}/* 131CB */, /*21826*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889724u,138442752u,393216u}/* 131CC */, /*21827*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889732u,138442752u,393216u}/* 131CD */, /*21828*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889740u,138442752u,393216u}/* 131CE */, /*21829*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889748u,138442752u,393216u}/* 131CF */, /*21830*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889756u,138442752u,393216u}/* 131D0 */, /*21831*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889764u,138442752u,393216u}/* 131D1 */, /*21832*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889772u,138442752u,393216u}/* 131D2 */, /*21833*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889780u,138442752u,393216u}/* 131D3 */, /*21834*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889788u,138442752u,393216u}/* 131D4 */, /*21835*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889796u,138442752u,393216u}/* 131D5 */, /*21836*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889804u,138442752u,393216u}/* 131D6 */, /*21837*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889812u,138442752u,393216u}/* 131D7 */, /*21838*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889820u,138442752u,393216u}/* 131D8 */, /*21839*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889828u,138442752u,393216u}/* 131D9 */, /*21840*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889836u,138442752u,393216u}/* 131DA */, /*21841*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889844u,138442752u,393216u}/* 131DB */, /*21842*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889852u,138442752u,393216u}/* 131DC */, /*21843*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889860u,138442752u,393216u}/* 131DD */, /*21844*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889868u,138442752u,393216u}/* 131DE */, /*21845*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889876u,138442752u,393216u}/* 131DF */, /*21846*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889884u,138442752u,393216u}/* 131E0 */, /*21847*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889892u,138442752u,393216u}/* 131E1 */, /*21848*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889900u,138442752u,393216u}/* 131E2 */, /*21849*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889908u,138442752u,393216u}/* 131E3 */, /*21850*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889916u,138442752u,393216u}/* 131E4 */, /*21851*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889924u,138442752u,393216u}/* 131E5 */, /*21852*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889932u,138442752u,393216u}/* 131E6 */, /*21853*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889940u,138442752u,393216u}/* 131E7 */, /*21854*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889948u,138442752u,393216u}/* 131E8 */, /*21855*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889956u,138442752u,393216u}/* 131E9 */, /*21856*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889964u,138442752u,393216u}/* 131EA */, /*21857*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889972u,138442752u,393216u}/* 131EB */, /*21858*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889980u,138442752u,393216u}/* 131EC */, /*21859*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889988u,138442752u,393216u}/* 131ED */, /*21860*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677889996u,138442752u,393216u}/* 131EE */, /*21861*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890004u,138442752u,393216u}/* 131EF */, /*21862*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890012u,138442752u,393216u}/* 131F0 */, /*21863*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890020u,138442752u,393216u}/* 131F1 */, /*21864*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890028u,138442752u,393216u}/* 131F2 */, /*21865*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890036u,138442752u,393216u}/* 131F3 */, /*21866*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890044u,138442752u,393216u}/* 131F4 */, /*21867*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890052u,138442752u,393216u}/* 131F5 */, /*21868*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890060u,138442752u,393216u}/* 131F6 */, /*21869*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890068u,138442752u,393216u}/* 131F7 */, /*21870*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890076u,138442752u,393216u}/* 131F8 */, /*21871*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890084u,138442752u,393216u}/* 131F9 */, /*21872*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890092u,138442752u,393216u}/* 131FA */, /*21873*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890100u,138442752u,393216u}/* 131FB */, /*21874*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890108u,138442752u,393216u}/* 131FC */, /*21875*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890116u,138442752u,393216u}/* 131FD */, /*21876*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890124u,138442752u,393216u}/* 131FE */, /*21877*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890132u,138442752u,393216u}/* 131FF */, /*21878*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890140u,138442752u,393216u}/* 13200 */, /*21879*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890148u,138442752u,393216u}/* 13201 */, /*21880*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890156u,138442752u,393216u}/* 13202 */, /*21881*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890164u,138442752u,393216u}/* 13203 */, /*21882*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890172u,138442752u,393216u}/* 13204 */, /*21883*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890180u,138442752u,393216u}/* 13205 */, /*21884*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890188u,138442752u,393216u}/* 13206 */, /*21885*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890196u,138442752u,393216u}/* 13207 */, /*21886*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890204u,138442752u,393216u}/* 13208 */, /*21887*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890212u,138442752u,393216u}/* 13209 */, /*21888*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890220u,138442752u,393216u}/* 1320A */, /*21889*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890228u,138442752u,393216u}/* 1320B */, /*21890*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890236u,138442752u,393216u}/* 1320C */, /*21891*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890244u,138442752u,393216u}/* 1320D */, /*21892*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890252u,138442752u,393216u}/* 1320E */, /*21893*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890260u,138442752u,393216u}/* 1320F */, /*21894*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890268u,138442752u,393216u}/* 13210 */, /*21895*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890276u,138442752u,393216u}/* 13211 */, /*21896*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890284u,138442752u,393216u}/* 13212 */, /*21897*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890292u,138442752u,393216u}/* 13213 */, /*21898*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890300u,138442752u,393216u}/* 13214 */, /*21899*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890308u,138442752u,393216u}/* 13215 */, /*21900*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890316u,138442752u,393216u}/* 13216 */, /*21901*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890324u,138442752u,393216u}/* 13217 */, /*21902*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890332u,138442752u,393216u}/* 13218 */, /*21903*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890340u,138442752u,393216u}/* 13219 */, /*21904*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890348u,138442752u,393216u}/* 1321A */, /*21905*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890356u,138442752u,393216u}/* 1321B */, /*21906*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890364u,138442752u,393216u}/* 1321C */, /*21907*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890372u,138442752u,393216u}/* 1321D */, /*21908*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890380u,138442752u,393216u}/* 1321E */, /*21909*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890388u,138442752u,393216u}/* 1321F */, /*21910*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890396u,138442752u,393216u}/* 13220 */, /*21911*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890404u,138442752u,393216u}/* 13221 */, /*21912*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890412u,138442752u,393216u}/* 13222 */, /*21913*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890420u,138442752u,393216u}/* 13223 */, /*21914*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890428u,138442752u,393216u}/* 13224 */, /*21915*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890436u,138442752u,393216u}/* 13225 */, /*21916*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890444u,138442752u,393216u}/* 13226 */, /*21917*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890452u,138442752u,393216u}/* 13227 */, /*21918*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890460u,138442752u,393216u}/* 13228 */, /*21919*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890468u,138442752u,393216u}/* 13229 */, /*21920*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890476u,138442752u,393216u}/* 1322A */, /*21921*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890484u,138442752u,393216u}/* 1322B */, /*21922*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890492u,138442752u,393216u}/* 1322C */, /*21923*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890500u,138442752u,393216u}/* 1322D */, /*21924*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890508u,138442752u,393216u}/* 1322E */, /*21925*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890516u,138442752u,393216u}/* 1322F */, /*21926*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890524u,138442752u,393216u}/* 13230 */, /*21927*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890532u,138442752u,393216u}/* 13231 */, /*21928*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890540u,138442752u,393216u}/* 13232 */, /*21929*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890548u,138442752u,393216u}/* 13233 */, /*21930*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890556u,138442752u,393216u}/* 13234 */, /*21931*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890564u,138442752u,393216u}/* 13235 */, /*21932*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890572u,138442752u,393216u}/* 13236 */, /*21933*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890580u,138442752u,393216u}/* 13237 */, /*21934*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890588u,138442752u,393216u}/* 13238 */, /*21935*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890596u,138442752u,393216u}/* 13239 */, /*21936*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890604u,138442752u,393216u}/* 1323A */, /*21937*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890612u,138442752u,393216u}/* 1323B */, /*21938*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890620u,138442752u,393216u}/* 1323C */, /*21939*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890628u,138442752u,393216u}/* 1323D */, /*21940*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890636u,138442752u,393216u}/* 1323E */, /*21941*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890644u,138442752u,393216u}/* 1323F */, /*21942*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890652u,138442752u,393216u}/* 13240 */, /*21943*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890660u,138442752u,393216u}/* 13241 */, /*21944*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890668u,138442752u,393216u}/* 13242 */, /*21945*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890676u,138442752u,393216u}/* 13243 */, /*21946*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890684u,138442752u,393216u}/* 13244 */, /*21947*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890692u,138442752u,393216u}/* 13245 */, /*21948*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890700u,138442752u,393216u}/* 13246 */, /*21949*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890708u,138442752u,393216u}/* 13247 */, /*21950*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890716u,138442752u,393216u}/* 13248 */, /*21951*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890724u,138442752u,393216u}/* 13249 */, /*21952*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890732u,138442752u,393216u}/* 1324A */, /*21953*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890740u,138442752u,393216u}/* 1324B */, /*21954*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890748u,138442752u,393216u}/* 1324C */, /*21955*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890756u,138442752u,393216u}/* 1324D */, /*21956*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890764u,138442752u,393216u}/* 1324E */, /*21957*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890772u,138442752u,393216u}/* 1324F */, /*21958*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890780u,138442752u,393216u}/* 13250 */, /*21959*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890788u,138442752u,393216u}/* 13251 */, /*21960*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890796u,138442752u,393216u}/* 13252 */, /*21961*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890804u,138442752u,393216u}/* 13253 */, /*21962*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890812u,138442752u,393216u}/* 13254 */, /*21963*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890820u,138442752u,393216u}/* 13255 */, /*21964*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890828u,138442752u,393216u}/* 13256 */, /*21965*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890836u,138442752u,393216u}/* 13257 */, /*21966*/{0,1856u,5308417u,80052229u,1515560u,3758096416u,1677890844u,138442752u,393216u}/* 13258 */, /*21967*/{0,1856u,5308417u,80052229u,1515560u,3758096416u,1677890852u,138442752u,393216u}/* 13259 */, /*21968*/{0,1856u,5308417u,80052229u,1515560u,3758096416u,1677890860u,138442752u,393216u}/* 1325A */, /*21969*/{0,1856u,5308417u,86343685u,1515560u,3758096416u,1677890868u,138442752u,393216u}/* 1325B */, /*21970*/{0,1856u,5308417u,86343685u,1515560u,3758096416u,1677890876u,138442752u,393216u}/* 1325C */, /*21971*/{0,1856u,5308417u,86343685u,1515560u,3758096416u,1677890884u,138442752u,393216u}/* 1325D */, /*21972*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890892u,138442752u,393216u}/* 1325E */, /*21973*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890900u,138442752u,393216u}/* 1325F */, /*21974*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890908u,138442752u,393216u}/* 13260 */, /*21975*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890916u,138442752u,393216u}/* 13261 */, /*21976*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890924u,138442752u,393216u}/* 13262 */, /*21977*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890932u,138442752u,393216u}/* 13263 */, /*21978*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890940u,138442752u,393216u}/* 13264 */, /*21979*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890948u,138442752u,393216u}/* 13265 */, /*21980*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890956u,138442752u,393216u}/* 13266 */, /*21981*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890964u,138442752u,393216u}/* 13267 */, /*21982*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890972u,138442752u,393216u}/* 13268 */, /*21983*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890980u,138442752u,393216u}/* 13269 */, /*21984*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890988u,138442752u,393216u}/* 1326A */, /*21985*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677890996u,138442752u,393216u}/* 1326B */, /*21986*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891004u,138442752u,393216u}/* 1326C */, /*21987*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891012u,138442752u,393216u}/* 1326D */, /*21988*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891020u,138442752u,393216u}/* 1326E */, /*21989*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891028u,138442752u,393216u}/* 1326F */, /*21990*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891036u,138442752u,393216u}/* 13270 */, /*21991*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891044u,138442752u,393216u}/* 13271 */, /*21992*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891052u,138442752u,393216u}/* 13272 */, /*21993*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891060u,138442752u,393216u}/* 13273 */, /*21994*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891068u,138442752u,393216u}/* 13274 */, /*21995*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891076u,138442752u,393216u}/* 13275 */, /*21996*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891084u,138442752u,393216u}/* 13276 */, /*21997*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891092u,138442752u,393216u}/* 13277 */, /*21998*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891100u,138442752u,393216u}/* 13278 */, /*21999*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891108u,138442752u,393216u}/* 13279 */, /*22000*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891116u,138442752u,393216u}/* 1327A */, /*22001*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891124u,138442752u,393216u}/* 1327B */, /*22002*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891132u,138442752u,393216u}/* 1327C */, /*22003*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891140u,138442752u,393216u}/* 1327D */, /*22004*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891148u,138442752u,393216u}/* 1327E */, /*22005*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891156u,138442752u,393216u}/* 1327F */, /*22006*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891164u,138442752u,393216u}/* 13280 */, /*22007*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891172u,138442752u,393216u}/* 13281 */, /*22008*/{0,1856u,5308417u,86343685u,1515560u,3758096416u,1677891180u,138442752u,393216u}/* 13282 */, /*22009*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891188u,138442752u,393216u}/* 13283 */, /*22010*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891196u,138442752u,393216u}/* 13284 */, /*22011*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891204u,138442752u,393216u}/* 13285 */, /*22012*/{0,1856u,5308417u,80052229u,1515560u,3758096416u,1677891212u,138442752u,393216u}/* 13286 */, /*22013*/{0,1856u,5308417u,86343685u,1515560u,3758096416u,1677891220u,138442752u,393216u}/* 13287 */, /*22014*/{0,1856u,5308417u,80052229u,1515560u,3758096416u,1677891228u,138442752u,393216u}/* 13288 */, /*22015*/{0,1856u,5308417u,86343685u,1515560u,3758096416u,1677891236u,138442752u,393216u}/* 13289 */, /*22016*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891244u,138442752u,393216u}/* 1328A */, /*22017*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891252u,138442752u,393216u}/* 1328B */, /*22018*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891260u,138442752u,393216u}/* 1328C */, /*22019*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891268u,138442752u,393216u}/* 1328D */, /*22020*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891276u,138442752u,393216u}/* 1328E */, /*22021*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891284u,138442752u,393216u}/* 1328F */, /*22022*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891292u,138442752u,393216u}/* 13290 */, /*22023*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891300u,138442752u,393216u}/* 13291 */, /*22024*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891308u,138442752u,393216u}/* 13292 */, /*22025*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891316u,138442752u,393216u}/* 13293 */, /*22026*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891324u,138442752u,393216u}/* 13294 */, /*22027*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891332u,138442752u,393216u}/* 13295 */, /*22028*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891340u,138442752u,393216u}/* 13296 */, /*22029*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891348u,138442752u,393216u}/* 13297 */, /*22030*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891356u,138442752u,393216u}/* 13298 */, /*22031*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891364u,138442752u,393216u}/* 13299 */, /*22032*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891372u,138442752u,393216u}/* 1329A */, /*22033*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891380u,138442752u,393216u}/* 1329B */, /*22034*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891388u,138442752u,393216u}/* 1329C */, /*22035*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891396u,138442752u,393216u}/* 1329D */, /*22036*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891404u,138442752u,393216u}/* 1329E */, /*22037*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891412u,138442752u,393216u}/* 1329F */, /*22038*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891420u,138442752u,393216u}/* 132A0 */, /*22039*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891428u,138442752u,393216u}/* 132A1 */, /*22040*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891436u,138442752u,393216u}/* 132A2 */, /*22041*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891444u,138442752u,393216u}/* 132A3 */, /*22042*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891452u,138442752u,393216u}/* 132A4 */, /*22043*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891460u,138442752u,393216u}/* 132A5 */, /*22044*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891468u,138442752u,393216u}/* 132A6 */, /*22045*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891476u,138442752u,393216u}/* 132A7 */, /*22046*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891484u,138442752u,393216u}/* 132A8 */, /*22047*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891492u,138442752u,393216u}/* 132A9 */, /*22048*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891500u,138442752u,393216u}/* 132AA */, /*22049*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891508u,138442752u,393216u}/* 132AB */, /*22050*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891516u,138442752u,393216u}/* 132AC */, /*22051*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891524u,138442752u,393216u}/* 132AD */, /*22052*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891532u,138442752u,393216u}/* 132AE */, /*22053*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891540u,138442752u,393216u}/* 132AF */, /*22054*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891548u,138442752u,393216u}/* 132B0 */, /*22055*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891556u,138442752u,393216u}/* 132B1 */, /*22056*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891564u,138442752u,393216u}/* 132B2 */, /*22057*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891572u,138442752u,393216u}/* 132B3 */, /*22058*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891580u,138442752u,393216u}/* 132B4 */, /*22059*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891588u,138442752u,393216u}/* 132B5 */, /*22060*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891596u,138442752u,393216u}/* 132B6 */, /*22061*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891604u,138442752u,393216u}/* 132B7 */, /*22062*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891612u,138442752u,393216u}/* 132B8 */, /*22063*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891620u,138442752u,393216u}/* 132B9 */, /*22064*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891628u,138442752u,393216u}/* 132BA */, /*22065*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891636u,138442752u,393216u}/* 132BB */, /*22066*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891644u,138442752u,393216u}/* 132BC */, /*22067*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891652u,138442752u,393216u}/* 132BD */, /*22068*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891660u,138442752u,393216u}/* 132BE */, /*22069*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891668u,138442752u,393216u}/* 132BF */, /*22070*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891676u,138442752u,393216u}/* 132C0 */, /*22071*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891684u,138442752u,393216u}/* 132C1 */, /*22072*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891692u,138442752u,393216u}/* 132C2 */, /*22073*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891700u,138442752u,393216u}/* 132C3 */, /*22074*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891708u,138442752u,393216u}/* 132C4 */, /*22075*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891716u,138442752u,393216u}/* 132C5 */, /*22076*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891724u,138442752u,393216u}/* 132C6 */, /*22077*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891732u,138442752u,393216u}/* 132C7 */, /*22078*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891740u,138442752u,393216u}/* 132C8 */, /*22079*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891748u,138442752u,393216u}/* 132C9 */, /*22080*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891756u,138442752u,393216u}/* 132CA */, /*22081*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891764u,138442752u,393216u}/* 132CB */, /*22082*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891772u,138442752u,393216u}/* 132CC */, /*22083*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891780u,138442752u,393216u}/* 132CD */, /*22084*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891788u,138442752u,393216u}/* 132CE */, /*22085*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891796u,138442752u,393216u}/* 132CF */, /*22086*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891804u,138442752u,393216u}/* 132D0 */, /*22087*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891812u,138442752u,393216u}/* 132D1 */, /*22088*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891820u,138442752u,393216u}/* 132D2 */, /*22089*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891828u,138442752u,393216u}/* 132D3 */, /*22090*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891836u,138442752u,393216u}/* 132D4 */, /*22091*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891844u,138442752u,393216u}/* 132D5 */, /*22092*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891852u,138442752u,393216u}/* 132D6 */, /*22093*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891860u,138442752u,393216u}/* 132D7 */, /*22094*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891868u,138442752u,393216u}/* 132D8 */, /*22095*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891876u,138442752u,393216u}/* 132D9 */, /*22096*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891884u,138442752u,393216u}/* 132DA */, /*22097*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891892u,138442752u,393216u}/* 132DB */, /*22098*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891900u,138442752u,393216u}/* 132DC */, /*22099*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891908u,138442752u,393216u}/* 132DD */, /*22100*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891916u,138442752u,393216u}/* 132DE */, /*22101*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891924u,138442752u,393216u}/* 132DF */, /*22102*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891932u,138442752u,393216u}/* 132E0 */, /*22103*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891940u,138442752u,393216u}/* 132E1 */, /*22104*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891948u,138442752u,393216u}/* 132E2 */, /*22105*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891956u,138442752u,393216u}/* 132E3 */, /*22106*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891964u,138442752u,393216u}/* 132E4 */, /*22107*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891972u,138442752u,393216u}/* 132E5 */, /*22108*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891980u,138442752u,393216u}/* 132E6 */, /*22109*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891988u,138442752u,393216u}/* 132E7 */, /*22110*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677891996u,138442752u,393216u}/* 132E8 */, /*22111*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892004u,138442752u,393216u}/* 132E9 */, /*22112*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892012u,138442752u,393216u}/* 132EA */, /*22113*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892020u,138442752u,393216u}/* 132EB */, /*22114*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892028u,138442752u,393216u}/* 132EC */, /*22115*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892036u,138442752u,393216u}/* 132ED */, /*22116*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892044u,138442752u,393216u}/* 132EE */, /*22117*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892052u,138442752u,393216u}/* 132EF */, /*22118*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892060u,138442752u,393216u}/* 132F0 */, /*22119*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892068u,138442752u,393216u}/* 132F1 */, /*22120*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892076u,138442752u,393216u}/* 132F2 */, /*22121*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892084u,138442752u,393216u}/* 132F3 */, /*22122*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892092u,138442752u,393216u}/* 132F4 */, /*22123*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892100u,138442752u,393216u}/* 132F5 */, /*22124*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892108u,138442752u,393216u}/* 132F6 */, /*22125*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892116u,138442752u,393216u}/* 132F7 */, /*22126*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892124u,138442752u,393216u}/* 132F8 */, /*22127*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892132u,138442752u,393216u}/* 132F9 */, /*22128*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892140u,138442752u,393216u}/* 132FA */, /*22129*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892148u,138442752u,393216u}/* 132FB */, /*22130*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892156u,138442752u,393216u}/* 132FC */, /*22131*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892164u,138442752u,393216u}/* 132FD */, /*22132*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892172u,138442752u,393216u}/* 132FE */, /*22133*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892180u,138442752u,393216u}/* 132FF */, /*22134*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892188u,138442752u,393216u}/* 13300 */, /*22135*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892196u,138442752u,393216u}/* 13301 */, /*22136*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892204u,138442752u,393216u}/* 13302 */, /*22137*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892212u,138442752u,393216u}/* 13303 */, /*22138*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892220u,138442752u,393216u}/* 13304 */, /*22139*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892228u,138442752u,393216u}/* 13305 */, /*22140*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892236u,138442752u,393216u}/* 13306 */, /*22141*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892244u,138442752u,393216u}/* 13307 */, /*22142*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892252u,138442752u,393216u}/* 13308 */, /*22143*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892260u,138442752u,393216u}/* 13309 */, /*22144*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892268u,138442752u,393216u}/* 1330A */, /*22145*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892276u,138442752u,393216u}/* 1330B */, /*22146*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892284u,138442752u,393216u}/* 1330C */, /*22147*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892292u,138442752u,393216u}/* 1330D */, /*22148*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892300u,138442752u,393216u}/* 1330E */, /*22149*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892308u,138442752u,393216u}/* 1330F */, /*22150*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892316u,138442752u,393216u}/* 13310 */, /*22151*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892324u,138442752u,393216u}/* 13311 */, /*22152*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892332u,138442752u,393216u}/* 13312 */, /*22153*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892340u,138442752u,393216u}/* 13313 */, /*22154*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892348u,138442752u,393216u}/* 13314 */, /*22155*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892356u,138442752u,393216u}/* 13315 */, /*22156*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892364u,138442752u,393216u}/* 13316 */, /*22157*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892372u,138442752u,393216u}/* 13317 */, /*22158*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892380u,138442752u,393216u}/* 13318 */, /*22159*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892388u,138442752u,393216u}/* 13319 */, /*22160*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892396u,138442752u,393216u}/* 1331A */, /*22161*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892404u,138442752u,393216u}/* 1331B */, /*22162*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892412u,138442752u,393216u}/* 1331C */, /*22163*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892420u,138442752u,393216u}/* 1331D */, /*22164*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892428u,138442752u,393216u}/* 1331E */, /*22165*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892436u,138442752u,393216u}/* 1331F */, /*22166*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892444u,138442752u,393216u}/* 13320 */, /*22167*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892452u,138442752u,393216u}/* 13321 */, /*22168*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892460u,138442752u,393216u}/* 13322 */, /*22169*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892468u,138442752u,393216u}/* 13323 */, /*22170*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892476u,138442752u,393216u}/* 13324 */, /*22171*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892484u,138442752u,393216u}/* 13325 */, /*22172*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892492u,138442752u,393216u}/* 13326 */, /*22173*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892500u,138442752u,393216u}/* 13327 */, /*22174*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892508u,138442752u,393216u}/* 13328 */, /*22175*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892516u,138442752u,393216u}/* 13329 */, /*22176*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892524u,138442752u,393216u}/* 1332A */, /*22177*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892532u,138442752u,393216u}/* 1332B */, /*22178*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892540u,138442752u,393216u}/* 1332C */, /*22179*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892548u,138442752u,393216u}/* 1332D */, /*22180*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892556u,138442752u,393216u}/* 1332E */, /*22181*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892564u,138442752u,393216u}/* 1332F */, /*22182*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892572u,138442752u,393216u}/* 13330 */, /*22183*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892580u,138442752u,393216u}/* 13331 */, /*22184*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892588u,138442752u,393216u}/* 13332 */, /*22185*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892596u,138442752u,393216u}/* 13333 */, /*22186*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892604u,138442752u,393216u}/* 13334 */, /*22187*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892612u,138442752u,393216u}/* 13335 */, /*22188*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892620u,138442752u,393216u}/* 13336 */, /*22189*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892628u,138442752u,393216u}/* 13337 */, /*22190*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892636u,138442752u,393216u}/* 13338 */, /*22191*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892644u,138442752u,393216u}/* 13339 */, /*22192*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892652u,138442752u,393216u}/* 1333A */, /*22193*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892660u,138442752u,393216u}/* 1333B */, /*22194*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892668u,138442752u,393216u}/* 1333C */, /*22195*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892676u,138442752u,393216u}/* 1333D */, /*22196*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892684u,138442752u,393216u}/* 1333E */, /*22197*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892692u,138442752u,393216u}/* 1333F */, /*22198*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892700u,138442752u,393216u}/* 13340 */, /*22199*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892708u,138442752u,393216u}/* 13341 */, /*22200*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892716u,138442752u,393216u}/* 13342 */, /*22201*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892724u,138442752u,393216u}/* 13343 */, /*22202*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892732u,138442752u,393216u}/* 13344 */, /*22203*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892740u,138442752u,393216u}/* 13345 */, /*22204*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892748u,138442752u,393216u}/* 13346 */, /*22205*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892756u,138442752u,393216u}/* 13347 */, /*22206*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892764u,138442752u,393216u}/* 13348 */, /*22207*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892772u,138442752u,393216u}/* 13349 */, /*22208*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892780u,138442752u,393216u}/* 1334A */, /*22209*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892788u,138442752u,393216u}/* 1334B */, /*22210*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892796u,138442752u,393216u}/* 1334C */, /*22211*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892804u,138442752u,393216u}/* 1334D */, /*22212*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892812u,138442752u,393216u}/* 1334E */, /*22213*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892820u,138442752u,393216u}/* 1334F */, /*22214*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892828u,138442752u,393216u}/* 13350 */, /*22215*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892836u,138442752u,393216u}/* 13351 */, /*22216*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892844u,138442752u,393216u}/* 13352 */, /*22217*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892852u,138442752u,393216u}/* 13353 */, /*22218*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892860u,138442752u,393216u}/* 13354 */, /*22219*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892868u,138442752u,393216u}/* 13355 */, /*22220*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892876u,138442752u,393216u}/* 13356 */, /*22221*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892884u,138442752u,393216u}/* 13357 */, /*22222*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892892u,138442752u,393216u}/* 13358 */, /*22223*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892900u,138442752u,393216u}/* 13359 */, /*22224*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892908u,138442752u,393216u}/* 1335A */, /*22225*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892916u,138442752u,393216u}/* 1335B */, /*22226*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892924u,138442752u,393216u}/* 1335C */, /*22227*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892932u,138442752u,393216u}/* 1335D */, /*22228*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892940u,138442752u,393216u}/* 1335E */, /*22229*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892948u,138442752u,393216u}/* 1335F */, /*22230*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892956u,138442752u,393216u}/* 13360 */, /*22231*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892964u,138442752u,393216u}/* 13361 */, /*22232*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892972u,138442752u,393216u}/* 13362 */, /*22233*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892980u,138442752u,393216u}/* 13363 */, /*22234*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892988u,138442752u,393216u}/* 13364 */, /*22235*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677892996u,138442752u,393216u}/* 13365 */, /*22236*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893004u,138442752u,393216u}/* 13366 */, /*22237*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893012u,138442752u,393216u}/* 13367 */, /*22238*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893020u,138442752u,393216u}/* 13368 */, /*22239*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893028u,138442752u,393216u}/* 13369 */, /*22240*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893036u,138442752u,393216u}/* 1336A */, /*22241*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893044u,138442752u,393216u}/* 1336B */, /*22242*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893052u,138442752u,393216u}/* 1336C */, /*22243*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893060u,138442752u,393216u}/* 1336D */, /*22244*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893068u,138442752u,393216u}/* 1336E */, /*22245*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893076u,138442752u,393216u}/* 1336F */, /*22246*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893084u,138442752u,393216u}/* 13370 */, /*22247*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893092u,138442752u,393216u}/* 13371 */, /*22248*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893100u,138442752u,393216u}/* 13372 */, /*22249*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893108u,138442752u,393216u}/* 13373 */, /*22250*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893116u,138442752u,393216u}/* 13374 */, /*22251*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893124u,138442752u,393216u}/* 13375 */, /*22252*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893132u,138442752u,393216u}/* 13376 */, /*22253*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893140u,138442752u,393216u}/* 13377 */, /*22254*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893148u,138442752u,393216u}/* 13378 */, /*22255*/{0,1856u,5308417u,80052229u,1515560u,3758096416u,1677893156u,138442752u,393216u}/* 13379 */, /*22256*/{0,1856u,5308417u,86343685u,1515560u,3758096416u,1677893164u,138442752u,393216u}/* 1337A */, /*22257*/{0,1856u,5308417u,86343685u,1515560u,3758096416u,1677893172u,138442752u,393216u}/* 1337B */, /*22258*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893180u,138442752u,393216u}/* 1337C */, /*22259*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893188u,138442752u,393216u}/* 1337D */, /*22260*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893196u,138442752u,393216u}/* 1337E */, /*22261*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893204u,138442752u,393216u}/* 1337F */, /*22262*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893212u,138442752u,393216u}/* 13380 */, /*22263*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893220u,138442752u,393216u}/* 13381 */, /*22264*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893228u,138442752u,393216u}/* 13382 */, /*22265*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893236u,138442752u,393216u}/* 13383 */, /*22266*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893244u,138442752u,393216u}/* 13384 */, /*22267*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893252u,138442752u,393216u}/* 13385 */, /*22268*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893260u,138442752u,393216u}/* 13386 */, /*22269*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893268u,138442752u,393216u}/* 13387 */, /*22270*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893276u,138442752u,393216u}/* 13388 */, /*22271*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893284u,138442752u,393216u}/* 13389 */, /*22272*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893292u,138442752u,393216u}/* 1338A */, /*22273*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893300u,138442752u,393216u}/* 1338B */, /*22274*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893308u,138442752u,393216u}/* 1338C */, /*22275*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893316u,138442752u,393216u}/* 1338D */, /*22276*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893324u,138442752u,393216u}/* 1338E */, /*22277*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893332u,138442752u,393216u}/* 1338F */, /*22278*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893340u,138442752u,393216u}/* 13390 */, /*22279*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893348u,138442752u,393216u}/* 13391 */, /*22280*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893356u,138442752u,393216u}/* 13392 */, /*22281*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893364u,138442752u,393216u}/* 13393 */, /*22282*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893372u,138442752u,393216u}/* 13394 */, /*22283*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893380u,138442752u,393216u}/* 13395 */, /*22284*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893388u,138442752u,393216u}/* 13396 */, /*22285*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893396u,138442752u,393216u}/* 13397 */, /*22286*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893404u,138442752u,393216u}/* 13398 */, /*22287*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893412u,138442752u,393216u}/* 13399 */, /*22288*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893420u,138442752u,393216u}/* 1339A */, /*22289*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893428u,138442752u,393216u}/* 1339B */, /*22290*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893436u,138442752u,393216u}/* 1339C */, /*22291*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893444u,138442752u,393216u}/* 1339D */, /*22292*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893452u,138442752u,393216u}/* 1339E */, /*22293*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893460u,138442752u,393216u}/* 1339F */, /*22294*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893468u,138442752u,393216u}/* 133A0 */, /*22295*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893476u,138442752u,393216u}/* 133A1 */, /*22296*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893484u,138442752u,393216u}/* 133A2 */, /*22297*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893492u,138442752u,393216u}/* 133A3 */, /*22298*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893500u,138442752u,393216u}/* 133A4 */, /*22299*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893508u,138442752u,393216u}/* 133A5 */, /*22300*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893516u,138442752u,393216u}/* 133A6 */, /*22301*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893524u,138442752u,393216u}/* 133A7 */, /*22302*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893532u,138442752u,393216u}/* 133A8 */, /*22303*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893540u,138442752u,393216u}/* 133A9 */, /*22304*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893548u,138442752u,393216u}/* 133AA */, /*22305*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893556u,138442752u,393216u}/* 133AB */, /*22306*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893564u,138442752u,393216u}/* 133AC */, /*22307*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893572u,138442752u,393216u}/* 133AD */, /*22308*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893580u,138442752u,393216u}/* 133AE */, /*22309*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893588u,138442752u,393216u}/* 133AF */, /*22310*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893596u,138442752u,393216u}/* 133B0 */, /*22311*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893604u,138442752u,393216u}/* 133B1 */, /*22312*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893612u,138442752u,393216u}/* 133B2 */, /*22313*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893620u,138442752u,393216u}/* 133B3 */, /*22314*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893628u,138442752u,393216u}/* 133B4 */, /*22315*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893636u,138442752u,393216u}/* 133B5 */, /*22316*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893644u,138442752u,393216u}/* 133B6 */, /*22317*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893652u,138442752u,393216u}/* 133B7 */, /*22318*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893660u,138442752u,393216u}/* 133B8 */, /*22319*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893668u,138442752u,393216u}/* 133B9 */, /*22320*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893676u,138442752u,393216u}/* 133BA */, /*22321*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893684u,138442752u,393216u}/* 133BB */, /*22322*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893692u,138442752u,393216u}/* 133BC */, /*22323*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893700u,138442752u,393216u}/* 133BD */, /*22324*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893708u,138442752u,393216u}/* 133BE */, /*22325*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893716u,138442752u,393216u}/* 133BF */, /*22326*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893724u,138442752u,393216u}/* 133C0 */, /*22327*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893732u,138442752u,393216u}/* 133C1 */, /*22328*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893740u,138442752u,393216u}/* 133C2 */, /*22329*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893748u,138442752u,393216u}/* 133C3 */, /*22330*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893756u,138442752u,393216u}/* 133C4 */, /*22331*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893764u,138442752u,393216u}/* 133C5 */, /*22332*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893772u,138442752u,393216u}/* 133C6 */, /*22333*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893780u,138442752u,393216u}/* 133C7 */, /*22334*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893788u,138442752u,393216u}/* 133C8 */, /*22335*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893796u,138442752u,393216u}/* 133C9 */, /*22336*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893804u,138442752u,393216u}/* 133CA */, /*22337*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893812u,138442752u,393216u}/* 133CB */, /*22338*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893820u,138442752u,393216u}/* 133CC */, /*22339*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893828u,138442752u,393216u}/* 133CD */, /*22340*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893836u,138442752u,393216u}/* 133CE */, /*22341*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893844u,138442752u,393216u}/* 133CF */, /*22342*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893852u,138442752u,393216u}/* 133D0 */, /*22343*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893860u,138442752u,393216u}/* 133D1 */, /*22344*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893868u,138442752u,393216u}/* 133D2 */, /*22345*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893876u,138442752u,393216u}/* 133D3 */, /*22346*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893884u,138442752u,393216u}/* 133D4 */, /*22347*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893892u,138442752u,393216u}/* 133D5 */, /*22348*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893900u,138442752u,393216u}/* 133D6 */, /*22349*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893908u,138442752u,393216u}/* 133D7 */, /*22350*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893916u,138442752u,393216u}/* 133D8 */, /*22351*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893924u,138442752u,393216u}/* 133D9 */, /*22352*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893932u,138442752u,393216u}/* 133DA */, /*22353*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893940u,138442752u,393216u}/* 133DB */, /*22354*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893948u,138442752u,393216u}/* 133DC */, /*22355*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893956u,138442752u,393216u}/* 133DD */, /*22356*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893964u,138442752u,393216u}/* 133DE */, /*22357*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893972u,138442752u,393216u}/* 133DF */, /*22358*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893980u,138442752u,393216u}/* 133E0 */, /*22359*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893988u,138442752u,393216u}/* 133E1 */, /*22360*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677893996u,138442752u,393216u}/* 133E2 */, /*22361*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894004u,138442752u,393216u}/* 133E3 */, /*22362*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894012u,138442752u,393216u}/* 133E4 */, /*22363*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894020u,138442752u,393216u}/* 133E5 */, /*22364*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894028u,138442752u,393216u}/* 133E6 */, /*22365*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894036u,138442752u,393216u}/* 133E7 */, /*22366*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894044u,138442752u,393216u}/* 133E8 */, /*22367*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894052u,138442752u,393216u}/* 133E9 */, /*22368*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894060u,138442752u,393216u}/* 133EA */, /*22369*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894068u,138442752u,393216u}/* 133EB */, /*22370*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894076u,138442752u,393216u}/* 133EC */, /*22371*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894084u,138442752u,393216u}/* 133ED */, /*22372*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894092u,138442752u,393216u}/* 133EE */, /*22373*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894100u,138442752u,393216u}/* 133EF */, /*22374*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894108u,138442752u,393216u}/* 133F0 */, /*22375*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894116u,138442752u,393216u}/* 133F1 */, /*22376*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894124u,138442752u,393216u}/* 133F2 */, /*22377*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894132u,138442752u,393216u}/* 133F3 */, /*22378*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894140u,138442752u,393216u}/* 133F4 */, /*22379*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894148u,138442752u,393216u}/* 133F5 */, /*22380*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894156u,138442752u,393216u}/* 133F6 */, /*22381*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894164u,138442752u,393216u}/* 133F7 */, /*22382*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894172u,138442752u,393216u}/* 133F8 */, /*22383*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894180u,138442752u,393216u}/* 133F9 */, /*22384*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894188u,138442752u,393216u}/* 133FA */, /*22385*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894196u,138442752u,393216u}/* 133FB */, /*22386*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894204u,138442752u,393216u}/* 133FC */, /*22387*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894212u,138442752u,393216u}/* 133FD */, /*22388*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894220u,138442752u,393216u}/* 133FE */, /*22389*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894228u,138442752u,393216u}/* 133FF */, /*22390*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894236u,138442752u,393216u}/* 13400 */, /*22391*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894244u,138442752u,393216u}/* 13401 */, /*22392*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894252u,138442752u,393216u}/* 13402 */, /*22393*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894260u,138442752u,393216u}/* 13403 */, /*22394*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894268u,138442752u,393216u}/* 13404 */, /*22395*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894276u,138442752u,393216u}/* 13405 */, /*22396*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894284u,138442752u,393216u}/* 13406 */, /*22397*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894292u,138442752u,393216u}/* 13407 */, /*22398*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894300u,138442752u,393216u}/* 13408 */, /*22399*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894308u,138442752u,393216u}/* 13409 */, /*22400*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894316u,138442752u,393216u}/* 1340A */, /*22401*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894324u,138442752u,393216u}/* 1340B */, /*22402*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894332u,138442752u,393216u}/* 1340C */, /*22403*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894340u,138442752u,393216u}/* 1340D */, /*22404*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894348u,138442752u,393216u}/* 1340E */, /*22405*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894356u,138442752u,393216u}/* 1340F */, /*22406*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894364u,138442752u,393216u}/* 13410 */, /*22407*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894372u,138442752u,393216u}/* 13411 */, /*22408*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894380u,138442752u,393216u}/* 13412 */, /*22409*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894388u,138442752u,393216u}/* 13413 */, /*22410*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894396u,138442752u,393216u}/* 13414 */, /*22411*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894404u,138442752u,393216u}/* 13415 */, /*22412*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894412u,138442752u,393216u}/* 13416 */, /*22413*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894420u,138442752u,393216u}/* 13417 */, /*22414*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894428u,138442752u,393216u}/* 13418 */, /*22415*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894436u,138442752u,393216u}/* 13419 */, /*22416*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894444u,138442752u,393216u}/* 1341A */, /*22417*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894452u,138442752u,393216u}/* 1341B */, /*22418*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894460u,138442752u,393216u}/* 1341C */, /*22419*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894468u,138442752u,393216u}/* 1341D */, /*22420*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894476u,138442752u,393216u}/* 1341E */, /*22421*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894484u,138442752u,393216u}/* 1341F */, /*22422*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894492u,138442752u,393216u}/* 13420 */, /*22423*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894500u,138442752u,393216u}/* 13421 */, /*22424*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894508u,138442752u,393216u}/* 13422 */, /*22425*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894516u,138442752u,393216u}/* 13423 */, /*22426*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894524u,138442752u,393216u}/* 13424 */, /*22427*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894532u,138442752u,393216u}/* 13425 */, /*22428*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894540u,138442752u,393216u}/* 13426 */, /*22429*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894548u,138442752u,393216u}/* 13427 */, /*22430*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894556u,138442752u,393216u}/* 13428 */, /*22431*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894564u,138442752u,393216u}/* 13429 */, /*22432*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894572u,138442752u,393216u}/* 1342A */, /*22433*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894580u,138442752u,393216u}/* 1342B */, /*22434*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894588u,138442752u,393216u}/* 1342C */, /*22435*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894596u,138442752u,393216u}/* 1342D */, /*22436*/{0,1856u,5308417u,76906501u,1515560u,3758096416u,1677894604u,138442752u,393216u}/* 1342E */, /*22437*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677894828u,138442752u,393216u}/* 14400 */, /*22438*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677894836u,138442752u,393216u}/* 14401 */, /*22439*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677894844u,138442752u,393216u}/* 14402 */, /*22440*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677894852u,138442752u,393216u}/* 14403 */, /*22441*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677894860u,138442752u,393216u}/* 14404 */, /*22442*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677894868u,138442752u,393216u}/* 14405 */, /*22443*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677894876u,138442752u,393216u}/* 14406 */, /*22444*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677894884u,138442752u,393216u}/* 14407 */, /*22445*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677894892u,138442752u,393216u}/* 14408 */, /*22446*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677894900u,138442752u,393216u}/* 14409 */, /*22447*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677894908u,138442752u,393216u}/* 1440A */, /*22448*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677894916u,138442752u,393216u}/* 1440B */, /*22449*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677894924u,138442752u,393216u}/* 1440C */, /*22450*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677894932u,138442752u,393216u}/* 1440D */, /*22451*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677894940u,138442752u,393216u}/* 1440E */, /*22452*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677894948u,138442752u,393216u}/* 1440F */, /*22453*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677894956u,138442752u,393216u}/* 14410 */, /*22454*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677894964u,138442752u,393216u}/* 14411 */, /*22455*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677894972u,138442752u,393216u}/* 14412 */, /*22456*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677894980u,138442752u,393216u}/* 14413 */, /*22457*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677894988u,138442752u,393216u}/* 14414 */, /*22458*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677894996u,138442752u,393216u}/* 14415 */, /*22459*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895004u,138442752u,393216u}/* 14416 */, /*22460*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895012u,138442752u,393216u}/* 14417 */, /*22461*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895020u,138442752u,393216u}/* 14418 */, /*22462*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895028u,138442752u,393216u}/* 14419 */, /*22463*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895036u,138442752u,393216u}/* 1441A */, /*22464*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895044u,138442752u,393216u}/* 1441B */, /*22465*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895052u,138442752u,393216u}/* 1441C */, /*22466*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895060u,138442752u,393216u}/* 1441D */, /*22467*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895068u,138442752u,393216u}/* 1441E */, /*22468*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895076u,138442752u,393216u}/* 1441F */, /*22469*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895084u,138442752u,393216u}/* 14420 */, /*22470*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895092u,138442752u,393216u}/* 14421 */, /*22471*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895100u,138442752u,393216u}/* 14422 */, /*22472*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895108u,138442752u,393216u}/* 14423 */, /*22473*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895116u,138442752u,393216u}/* 14424 */, /*22474*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895124u,138442752u,393216u}/* 14425 */, /*22475*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895132u,138442752u,393216u}/* 14426 */, /*22476*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895140u,138442752u,393216u}/* 14427 */, /*22477*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895148u,138442752u,393216u}/* 14428 */, /*22478*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895156u,138442752u,393216u}/* 14429 */, /*22479*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895164u,138442752u,393216u}/* 1442A */, /*22480*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895172u,138442752u,393216u}/* 1442B */, /*22481*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895180u,138442752u,393216u}/* 1442C */, /*22482*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895188u,138442752u,393216u}/* 1442D */, /*22483*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895196u,138442752u,393216u}/* 1442E */, /*22484*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895204u,138442752u,393216u}/* 1442F */, /*22485*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895212u,138442752u,393216u}/* 14430 */, /*22486*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895220u,138442752u,393216u}/* 14431 */, /*22487*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895228u,138442752u,393216u}/* 14432 */, /*22488*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895236u,138442752u,393216u}/* 14433 */, /*22489*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895244u,138442752u,393216u}/* 14434 */, /*22490*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895252u,138442752u,393216u}/* 14435 */, /*22491*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895260u,138442752u,393216u}/* 14436 */, /*22492*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895268u,138442752u,393216u}/* 14437 */, /*22493*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895276u,138442752u,393216u}/* 14438 */, /*22494*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895284u,138442752u,393216u}/* 14439 */, /*22495*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895292u,138442752u,393216u}/* 1443A */, /*22496*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895300u,138442752u,393216u}/* 1443B */, /*22497*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895308u,138442752u,393216u}/* 1443C */, /*22498*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895316u,138442752u,393216u}/* 1443D */, /*22499*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895324u,138442752u,393216u}/* 1443E */, /*22500*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895332u,138442752u,393216u}/* 1443F */, /*22501*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895340u,138442752u,393216u}/* 14440 */, /*22502*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895348u,138442752u,393216u}/* 14441 */, /*22503*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895356u,138442752u,393216u}/* 14442 */, /*22504*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895364u,138442752u,393216u}/* 14443 */, /*22505*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895372u,138442752u,393216u}/* 14444 */, /*22506*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895380u,138442752u,393216u}/* 14445 */, /*22507*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895388u,138442752u,393216u}/* 14446 */, /*22508*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895396u,138442752u,393216u}/* 14447 */, /*22509*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895404u,138442752u,393216u}/* 14448 */, /*22510*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895412u,138442752u,393216u}/* 14449 */, /*22511*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895420u,138442752u,393216u}/* 1444A */, /*22512*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895428u,138442752u,393216u}/* 1444B */, /*22513*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895436u,138442752u,393216u}/* 1444C */, /*22514*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895444u,138442752u,393216u}/* 1444D */, /*22515*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895452u,138442752u,393216u}/* 1444E */, /*22516*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895460u,138442752u,393216u}/* 1444F */, /*22517*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895468u,138442752u,393216u}/* 14450 */, /*22518*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895476u,138442752u,393216u}/* 14451 */, /*22519*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895484u,138442752u,393216u}/* 14452 */, /*22520*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895492u,138442752u,393216u}/* 14453 */, /*22521*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895500u,138442752u,393216u}/* 14454 */, /*22522*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895508u,138442752u,393216u}/* 14455 */, /*22523*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895516u,138442752u,393216u}/* 14456 */, /*22524*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895524u,138442752u,393216u}/* 14457 */, /*22525*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895532u,138442752u,393216u}/* 14458 */, /*22526*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895540u,138442752u,393216u}/* 14459 */, /*22527*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895548u,138442752u,393216u}/* 1445A */, /*22528*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895556u,138442752u,393216u}/* 1445B */, /*22529*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895564u,138442752u,393216u}/* 1445C */, /*22530*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895572u,138442752u,393216u}/* 1445D */, /*22531*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895580u,138442752u,393216u}/* 1445E */, /*22532*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895588u,138442752u,393216u}/* 1445F */, /*22533*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895596u,138442752u,393216u}/* 14460 */, /*22534*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895604u,138442752u,393216u}/* 14461 */, /*22535*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895612u,138442752u,393216u}/* 14462 */, /*22536*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895620u,138442752u,393216u}/* 14463 */, /*22537*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895628u,138442752u,393216u}/* 14464 */, /*22538*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895636u,138442752u,393216u}/* 14465 */, /*22539*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895644u,138442752u,393216u}/* 14466 */, /*22540*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895652u,138442752u,393216u}/* 14467 */, /*22541*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895660u,138442752u,393216u}/* 14468 */, /*22542*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895668u,138442752u,393216u}/* 14469 */, /*22543*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895676u,138442752u,393216u}/* 1446A */, /*22544*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895684u,138442752u,393216u}/* 1446B */, /*22545*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895692u,138442752u,393216u}/* 1446C */, /*22546*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895700u,138442752u,393216u}/* 1446D */, /*22547*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895708u,138442752u,393216u}/* 1446E */, /*22548*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895716u,138442752u,393216u}/* 1446F */, /*22549*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895724u,138442752u,393216u}/* 14470 */, /*22550*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895732u,138442752u,393216u}/* 14471 */, /*22551*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895740u,138442752u,393216u}/* 14472 */, /*22552*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895748u,138442752u,393216u}/* 14473 */, /*22553*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895756u,138442752u,393216u}/* 14474 */, /*22554*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895764u,138442752u,393216u}/* 14475 */, /*22555*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895772u,138442752u,393216u}/* 14476 */, /*22556*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895780u,138442752u,393216u}/* 14477 */, /*22557*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895788u,138442752u,393216u}/* 14478 */, /*22558*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895796u,138442752u,393216u}/* 14479 */, /*22559*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895804u,138442752u,393216u}/* 1447A */, /*22560*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895812u,138442752u,393216u}/* 1447B */, /*22561*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895820u,138442752u,393216u}/* 1447C */, /*22562*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895828u,138442752u,393216u}/* 1447D */, /*22563*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895836u,138442752u,393216u}/* 1447E */, /*22564*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895844u,138442752u,393216u}/* 1447F */, /*22565*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895852u,138442752u,393216u}/* 14480 */, /*22566*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895860u,138442752u,393216u}/* 14481 */, /*22567*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895868u,138442752u,393216u}/* 14482 */, /*22568*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895876u,138442752u,393216u}/* 14483 */, /*22569*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895884u,138442752u,393216u}/* 14484 */, /*22570*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895892u,138442752u,393216u}/* 14485 */, /*22571*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895900u,138442752u,393216u}/* 14486 */, /*22572*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895908u,138442752u,393216u}/* 14487 */, /*22573*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895916u,138442752u,393216u}/* 14488 */, /*22574*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895924u,138442752u,393216u}/* 14489 */, /*22575*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895932u,138442752u,393216u}/* 1448A */, /*22576*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895940u,138442752u,393216u}/* 1448B */, /*22577*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895948u,138442752u,393216u}/* 1448C */, /*22578*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895956u,138442752u,393216u}/* 1448D */, /*22579*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895964u,138442752u,393216u}/* 1448E */, /*22580*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895972u,138442752u,393216u}/* 1448F */, /*22581*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895980u,138442752u,393216u}/* 14490 */, /*22582*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895988u,138442752u,393216u}/* 14491 */, /*22583*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677895996u,138442752u,393216u}/* 14492 */, /*22584*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896004u,138442752u,393216u}/* 14493 */, /*22585*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896012u,138442752u,393216u}/* 14494 */, /*22586*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896020u,138442752u,393216u}/* 14495 */, /*22587*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896028u,138442752u,393216u}/* 14496 */, /*22588*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896036u,138442752u,393216u}/* 14497 */, /*22589*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896044u,138442752u,393216u}/* 14498 */, /*22590*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896052u,138442752u,393216u}/* 14499 */, /*22591*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896060u,138442752u,393216u}/* 1449A */, /*22592*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896068u,138442752u,393216u}/* 1449B */, /*22593*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896076u,138442752u,393216u}/* 1449C */, /*22594*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896084u,138442752u,393216u}/* 1449D */, /*22595*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896092u,138442752u,393216u}/* 1449E */, /*22596*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896100u,138442752u,393216u}/* 1449F */, /*22597*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896108u,138442752u,393216u}/* 144A0 */, /*22598*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896116u,138442752u,393216u}/* 144A1 */, /*22599*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896124u,138442752u,393216u}/* 144A2 */, /*22600*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896132u,138442752u,393216u}/* 144A3 */, /*22601*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896140u,138442752u,393216u}/* 144A4 */, /*22602*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896148u,138442752u,393216u}/* 144A5 */, /*22603*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896156u,138442752u,393216u}/* 144A6 */, /*22604*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896164u,138442752u,393216u}/* 144A7 */, /*22605*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896172u,138442752u,393216u}/* 144A8 */, /*22606*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896180u,138442752u,393216u}/* 144A9 */, /*22607*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896188u,138442752u,393216u}/* 144AA */, /*22608*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896196u,138442752u,393216u}/* 144AB */, /*22609*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896204u,138442752u,393216u}/* 144AC */, /*22610*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896212u,138442752u,393216u}/* 144AD */, /*22611*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896220u,138442752u,393216u}/* 144AE */, /*22612*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896228u,138442752u,393216u}/* 144AF */, /*22613*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896236u,138442752u,393216u}/* 144B0 */, /*22614*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896244u,138442752u,393216u}/* 144B1 */, /*22615*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896252u,138442752u,393216u}/* 144B2 */, /*22616*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896260u,138442752u,393216u}/* 144B3 */, /*22617*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896268u,138442752u,393216u}/* 144B4 */, /*22618*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896276u,138442752u,393216u}/* 144B5 */, /*22619*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896284u,138442752u,393216u}/* 144B6 */, /*22620*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896292u,138442752u,393216u}/* 144B7 */, /*22621*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896300u,138442752u,393216u}/* 144B8 */, /*22622*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896308u,138442752u,393216u}/* 144B9 */, /*22623*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896316u,138442752u,393216u}/* 144BA */, /*22624*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896324u,138442752u,393216u}/* 144BB */, /*22625*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896332u,138442752u,393216u}/* 144BC */, /*22626*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896340u,138442752u,393216u}/* 144BD */, /*22627*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896348u,138442752u,393216u}/* 144BE */, /*22628*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896356u,138442752u,393216u}/* 144BF */, /*22629*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896364u,138442752u,393216u}/* 144C0 */, /*22630*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896372u,138442752u,393216u}/* 144C1 */, /*22631*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896380u,138442752u,393216u}/* 144C2 */, /*22632*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896388u,138442752u,393216u}/* 144C3 */, /*22633*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896396u,138442752u,393216u}/* 144C4 */, /*22634*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896404u,138442752u,393216u}/* 144C5 */, /*22635*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896412u,138442752u,393216u}/* 144C6 */, /*22636*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896420u,138442752u,393216u}/* 144C7 */, /*22637*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896428u,138442752u,393216u}/* 144C8 */, /*22638*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896436u,138442752u,393216u}/* 144C9 */, /*22639*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896444u,138442752u,393216u}/* 144CA */, /*22640*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896452u,138442752u,393216u}/* 144CB */, /*22641*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896460u,138442752u,393216u}/* 144CC */, /*22642*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896468u,138442752u,393216u}/* 144CD */, /*22643*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896476u,138442752u,393216u}/* 144CE */, /*22644*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896484u,138442752u,393216u}/* 144CF */, /*22645*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896492u,138442752u,393216u}/* 144D0 */, /*22646*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896500u,138442752u,393216u}/* 144D1 */, /*22647*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896508u,138442752u,393216u}/* 144D2 */, /*22648*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896516u,138442752u,393216u}/* 144D3 */, /*22649*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896524u,138442752u,393216u}/* 144D4 */, /*22650*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896532u,138442752u,393216u}/* 144D5 */, /*22651*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896540u,138442752u,393216u}/* 144D6 */, /*22652*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896548u,138442752u,393216u}/* 144D7 */, /*22653*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896556u,138442752u,393216u}/* 144D8 */, /*22654*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896564u,138442752u,393216u}/* 144D9 */, /*22655*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896572u,138442752u,393216u}/* 144DA */, /*22656*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896580u,138442752u,393216u}/* 144DB */, /*22657*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896588u,138442752u,393216u}/* 144DC */, /*22658*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896596u,138442752u,393216u}/* 144DD */, /*22659*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896604u,138442752u,393216u}/* 144DE */, /*22660*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896612u,138442752u,393216u}/* 144DF */, /*22661*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896620u,138442752u,393216u}/* 144E0 */, /*22662*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896628u,138442752u,393216u}/* 144E1 */, /*22663*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896636u,138442752u,393216u}/* 144E2 */, /*22664*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896644u,138442752u,393216u}/* 144E3 */, /*22665*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896652u,138442752u,393216u}/* 144E4 */, /*22666*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896660u,138442752u,393216u}/* 144E5 */, /*22667*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896668u,138442752u,393216u}/* 144E6 */, /*22668*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896676u,138442752u,393216u}/* 144E7 */, /*22669*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896684u,138442752u,393216u}/* 144E8 */, /*22670*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896692u,138442752u,393216u}/* 144E9 */, /*22671*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896700u,138442752u,393216u}/* 144EA */, /*22672*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896708u,138442752u,393216u}/* 144EB */, /*22673*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896716u,138442752u,393216u}/* 144EC */, /*22674*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896724u,138442752u,393216u}/* 144ED */, /*22675*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896732u,138442752u,393216u}/* 144EE */, /*22676*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896740u,138442752u,393216u}/* 144EF */, /*22677*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896748u,138442752u,393216u}/* 144F0 */, /*22678*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896756u,138442752u,393216u}/* 144F1 */, /*22679*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896764u,138442752u,393216u}/* 144F2 */, /*22680*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896772u,138442752u,393216u}/* 144F3 */, /*22681*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896780u,138442752u,393216u}/* 144F4 */, /*22682*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896788u,138442752u,393216u}/* 144F5 */, /*22683*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896796u,138442752u,393216u}/* 144F6 */, /*22684*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896804u,138442752u,393216u}/* 144F7 */, /*22685*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896812u,138442752u,393216u}/* 144F8 */, /*22686*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896820u,138442752u,393216u}/* 144F9 */, /*22687*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896828u,138442752u,393216u}/* 144FA */, /*22688*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896836u,138442752u,393216u}/* 144FB */, /*22689*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896844u,138442752u,393216u}/* 144FC */, /*22690*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896852u,138442752u,393216u}/* 144FD */, /*22691*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896860u,138442752u,393216u}/* 144FE */, /*22692*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896868u,138442752u,393216u}/* 144FF */, /*22693*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896876u,138442752u,393216u}/* 14500 */, /*22694*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896884u,138442752u,393216u}/* 14501 */, /*22695*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896892u,138442752u,393216u}/* 14502 */, /*22696*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896900u,138442752u,393216u}/* 14503 */, /*22697*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896908u,138442752u,393216u}/* 14504 */, /*22698*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896916u,138442752u,393216u}/* 14505 */, /*22699*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896924u,138442752u,393216u}/* 14506 */, /*22700*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896932u,138442752u,393216u}/* 14507 */, /*22701*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896940u,138442752u,393216u}/* 14508 */, /*22702*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896948u,138442752u,393216u}/* 14509 */, /*22703*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896956u,138442752u,393216u}/* 1450A */, /*22704*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896964u,138442752u,393216u}/* 1450B */, /*22705*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896972u,138442752u,393216u}/* 1450C */, /*22706*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896980u,138442752u,393216u}/* 1450D */, /*22707*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896988u,138442752u,393216u}/* 1450E */, /*22708*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677896996u,138442752u,393216u}/* 1450F */, /*22709*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897004u,138442752u,393216u}/* 14510 */, /*22710*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897012u,138442752u,393216u}/* 14511 */, /*22711*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897020u,138442752u,393216u}/* 14512 */, /*22712*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897028u,138442752u,393216u}/* 14513 */, /*22713*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897036u,138442752u,393216u}/* 14514 */, /*22714*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897044u,138442752u,393216u}/* 14515 */, /*22715*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897052u,138442752u,393216u}/* 14516 */, /*22716*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897060u,138442752u,393216u}/* 14517 */, /*22717*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897068u,138442752u,393216u}/* 14518 */, /*22718*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897076u,138442752u,393216u}/* 14519 */, /*22719*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897084u,138442752u,393216u}/* 1451A */, /*22720*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897092u,138442752u,393216u}/* 1451B */, /*22721*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897100u,138442752u,393216u}/* 1451C */, /*22722*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897108u,138442752u,393216u}/* 1451D */, /*22723*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897116u,138442752u,393216u}/* 1451E */, /*22724*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897124u,138442752u,393216u}/* 1451F */, /*22725*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897132u,138442752u,393216u}/* 14520 */, /*22726*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897140u,138442752u,393216u}/* 14521 */, /*22727*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897148u,138442752u,393216u}/* 14522 */, /*22728*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897156u,138442752u,393216u}/* 14523 */, /*22729*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897164u,138442752u,393216u}/* 14524 */, /*22730*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897172u,138442752u,393216u}/* 14525 */, /*22731*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897180u,138442752u,393216u}/* 14526 */, /*22732*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897188u,138442752u,393216u}/* 14527 */, /*22733*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897196u,138442752u,393216u}/* 14528 */, /*22734*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897204u,138442752u,393216u}/* 14529 */, /*22735*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897212u,138442752u,393216u}/* 1452A */, /*22736*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897220u,138442752u,393216u}/* 1452B */, /*22737*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897228u,138442752u,393216u}/* 1452C */, /*22738*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897236u,138442752u,393216u}/* 1452D */, /*22739*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897244u,138442752u,393216u}/* 1452E */, /*22740*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897252u,138442752u,393216u}/* 1452F */, /*22741*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897260u,138442752u,393216u}/* 14530 */, /*22742*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897268u,138442752u,393216u}/* 14531 */, /*22743*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897276u,138442752u,393216u}/* 14532 */, /*22744*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897284u,138442752u,393216u}/* 14533 */, /*22745*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897292u,138442752u,393216u}/* 14534 */, /*22746*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897300u,138442752u,393216u}/* 14535 */, /*22747*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897308u,138442752u,393216u}/* 14536 */, /*22748*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897316u,138442752u,393216u}/* 14537 */, /*22749*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897324u,138442752u,393216u}/* 14538 */, /*22750*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897332u,138442752u,393216u}/* 14539 */, /*22751*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897340u,138442752u,393216u}/* 1453A */, /*22752*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897348u,138442752u,393216u}/* 1453B */, /*22753*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897356u,138442752u,393216u}/* 1453C */, /*22754*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897364u,138442752u,393216u}/* 1453D */, /*22755*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897372u,138442752u,393216u}/* 1453E */, /*22756*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897380u,138442752u,393216u}/* 1453F */, /*22757*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897388u,138442752u,393216u}/* 14540 */, /*22758*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897396u,138442752u,393216u}/* 14541 */, /*22759*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897404u,138442752u,393216u}/* 14542 */, /*22760*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897412u,138442752u,393216u}/* 14543 */, /*22761*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897420u,138442752u,393216u}/* 14544 */, /*22762*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897428u,138442752u,393216u}/* 14545 */, /*22763*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897436u,138442752u,393216u}/* 14546 */, /*22764*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897444u,138442752u,393216u}/* 14547 */, /*22765*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897452u,138442752u,393216u}/* 14548 */, /*22766*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897460u,138442752u,393216u}/* 14549 */, /*22767*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897468u,138442752u,393216u}/* 1454A */, /*22768*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897476u,138442752u,393216u}/* 1454B */, /*22769*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897484u,138442752u,393216u}/* 1454C */, /*22770*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897492u,138442752u,393216u}/* 1454D */, /*22771*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897500u,138442752u,393216u}/* 1454E */, /*22772*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897508u,138442752u,393216u}/* 1454F */, /*22773*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897516u,138442752u,393216u}/* 14550 */, /*22774*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897524u,138442752u,393216u}/* 14551 */, /*22775*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897532u,138442752u,393216u}/* 14552 */, /*22776*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897540u,138442752u,393216u}/* 14553 */, /*22777*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897548u,138442752u,393216u}/* 14554 */, /*22778*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897556u,138442752u,393216u}/* 14555 */, /*22779*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897564u,138442752u,393216u}/* 14556 */, /*22780*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897572u,138442752u,393216u}/* 14557 */, /*22781*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897580u,138442752u,393216u}/* 14558 */, /*22782*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897588u,138442752u,393216u}/* 14559 */, /*22783*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897596u,138442752u,393216u}/* 1455A */, /*22784*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897604u,138442752u,393216u}/* 1455B */, /*22785*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897612u,138442752u,393216u}/* 1455C */, /*22786*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897620u,138442752u,393216u}/* 1455D */, /*22787*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897628u,138442752u,393216u}/* 1455E */, /*22788*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897636u,138442752u,393216u}/* 1455F */, /*22789*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897644u,138442752u,393216u}/* 14560 */, /*22790*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897652u,138442752u,393216u}/* 14561 */, /*22791*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897660u,138442752u,393216u}/* 14562 */, /*22792*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897668u,138442752u,393216u}/* 14563 */, /*22793*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897676u,138442752u,393216u}/* 14564 */, /*22794*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897684u,138442752u,393216u}/* 14565 */, /*22795*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897692u,138442752u,393216u}/* 14566 */, /*22796*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897700u,138442752u,393216u}/* 14567 */, /*22797*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897708u,138442752u,393216u}/* 14568 */, /*22798*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897716u,138442752u,393216u}/* 14569 */, /*22799*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897724u,138442752u,393216u}/* 1456A */, /*22800*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897732u,138442752u,393216u}/* 1456B */, /*22801*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897740u,138442752u,393216u}/* 1456C */, /*22802*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897748u,138442752u,393216u}/* 1456D */, /*22803*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897756u,138442752u,393216u}/* 1456E */, /*22804*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897764u,138442752u,393216u}/* 1456F */, /*22805*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897772u,138442752u,393216u}/* 14570 */, /*22806*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897780u,138442752u,393216u}/* 14571 */, /*22807*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897788u,138442752u,393216u}/* 14572 */, /*22808*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897796u,138442752u,393216u}/* 14573 */, /*22809*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897804u,138442752u,393216u}/* 14574 */, /*22810*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897812u,138442752u,393216u}/* 14575 */, /*22811*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897820u,138442752u,393216u}/* 14576 */, /*22812*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897828u,138442752u,393216u}/* 14577 */, /*22813*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897836u,138442752u,393216u}/* 14578 */, /*22814*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897844u,138442752u,393216u}/* 14579 */, /*22815*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897852u,138442752u,393216u}/* 1457A */, /*22816*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897860u,138442752u,393216u}/* 1457B */, /*22817*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897868u,138442752u,393216u}/* 1457C */, /*22818*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897876u,138442752u,393216u}/* 1457D */, /*22819*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897884u,138442752u,393216u}/* 1457E */, /*22820*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897892u,138442752u,393216u}/* 1457F */, /*22821*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897900u,138442752u,393216u}/* 14580 */, /*22822*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897908u,138442752u,393216u}/* 14581 */, /*22823*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897916u,138442752u,393216u}/* 14582 */, /*22824*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897924u,138442752u,393216u}/* 14583 */, /*22825*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897932u,138442752u,393216u}/* 14584 */, /*22826*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897940u,138442752u,393216u}/* 14585 */, /*22827*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897948u,138442752u,393216u}/* 14586 */, /*22828*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897956u,138442752u,393216u}/* 14587 */, /*22829*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897964u,138442752u,393216u}/* 14588 */, /*22830*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897972u,138442752u,393216u}/* 14589 */, /*22831*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897980u,138442752u,393216u}/* 1458A */, /*22832*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897988u,138442752u,393216u}/* 1458B */, /*22833*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677897996u,138442752u,393216u}/* 1458C */, /*22834*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898004u,138442752u,393216u}/* 1458D */, /*22835*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898012u,138442752u,393216u}/* 1458E */, /*22836*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898020u,138442752u,393216u}/* 1458F */, /*22837*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898028u,138442752u,393216u}/* 14590 */, /*22838*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898036u,138442752u,393216u}/* 14591 */, /*22839*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898044u,138442752u,393216u}/* 14592 */, /*22840*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898052u,138442752u,393216u}/* 14593 */, /*22841*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898060u,138442752u,393216u}/* 14594 */, /*22842*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898068u,138442752u,393216u}/* 14595 */, /*22843*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898076u,138442752u,393216u}/* 14596 */, /*22844*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898084u,138442752u,393216u}/* 14597 */, /*22845*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898092u,138442752u,393216u}/* 14598 */, /*22846*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898100u,138442752u,393216u}/* 14599 */, /*22847*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898108u,138442752u,393216u}/* 1459A */, /*22848*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898116u,138442752u,393216u}/* 1459B */, /*22849*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898124u,138442752u,393216u}/* 1459C */, /*22850*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898132u,138442752u,393216u}/* 1459D */, /*22851*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898140u,138442752u,393216u}/* 1459E */, /*22852*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898148u,138442752u,393216u}/* 1459F */, /*22853*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898156u,138442752u,393216u}/* 145A0 */, /*22854*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898164u,138442752u,393216u}/* 145A1 */, /*22855*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898172u,138442752u,393216u}/* 145A2 */, /*22856*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898180u,138442752u,393216u}/* 145A3 */, /*22857*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898188u,138442752u,393216u}/* 145A4 */, /*22858*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898196u,138442752u,393216u}/* 145A5 */, /*22859*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898204u,138442752u,393216u}/* 145A6 */, /*22860*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898212u,138442752u,393216u}/* 145A7 */, /*22861*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898220u,138442752u,393216u}/* 145A8 */, /*22862*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898228u,138442752u,393216u}/* 145A9 */, /*22863*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898236u,138442752u,393216u}/* 145AA */, /*22864*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898244u,138442752u,393216u}/* 145AB */, /*22865*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898252u,138442752u,393216u}/* 145AC */, /*22866*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898260u,138442752u,393216u}/* 145AD */, /*22867*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898268u,138442752u,393216u}/* 145AE */, /*22868*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898276u,138442752u,393216u}/* 145AF */, /*22869*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898284u,138442752u,393216u}/* 145B0 */, /*22870*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898292u,138442752u,393216u}/* 145B1 */, /*22871*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898300u,138442752u,393216u}/* 145B2 */, /*22872*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898308u,138442752u,393216u}/* 145B3 */, /*22873*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898316u,138442752u,393216u}/* 145B4 */, /*22874*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898324u,138442752u,393216u}/* 145B5 */, /*22875*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898332u,138442752u,393216u}/* 145B6 */, /*22876*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898340u,138442752u,393216u}/* 145B7 */, /*22877*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898348u,138442752u,393216u}/* 145B8 */, /*22878*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898356u,138442752u,393216u}/* 145B9 */, /*22879*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898364u,138442752u,393216u}/* 145BA */, /*22880*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898372u,138442752u,393216u}/* 145BB */, /*22881*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898380u,138442752u,393216u}/* 145BC */, /*22882*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898388u,138442752u,393216u}/* 145BD */, /*22883*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898396u,138442752u,393216u}/* 145BE */, /*22884*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898404u,138442752u,393216u}/* 145BF */, /*22885*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898412u,138442752u,393216u}/* 145C0 */, /*22886*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898420u,138442752u,393216u}/* 145C1 */, /*22887*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898428u,138442752u,393216u}/* 145C2 */, /*22888*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898436u,138442752u,393216u}/* 145C3 */, /*22889*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898444u,138442752u,393216u}/* 145C4 */, /*22890*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898452u,138442752u,393216u}/* 145C5 */, /*22891*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898460u,138442752u,393216u}/* 145C6 */, /*22892*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898468u,138442752u,393216u}/* 145C7 */, /*22893*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898476u,138442752u,393216u}/* 145C8 */, /*22894*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898484u,138442752u,393216u}/* 145C9 */, /*22895*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898492u,138442752u,393216u}/* 145CA */, /*22896*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898500u,138442752u,393216u}/* 145CB */, /*22897*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898508u,138442752u,393216u}/* 145CC */, /*22898*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898516u,138442752u,393216u}/* 145CD */, /*22899*/{0,1864u,8323073u,80248837u,1515560u,3758096416u,1677898524u,138442752u,393216u}/* 145CE */, /*22900*/{0,1864u,8323073u,86540293u,1515560u,3758096416u,1677898532u,138442752u,393216u}/* 145CF */, /*22901*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898540u,138442752u,393216u}/* 145D0 */, /*22902*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898548u,138442752u,393216u}/* 145D1 */, /*22903*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898556u,138442752u,393216u}/* 145D2 */, /*22904*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898564u,138442752u,393216u}/* 145D3 */, /*22905*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898572u,138442752u,393216u}/* 145D4 */, /*22906*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898580u,138442752u,393216u}/* 145D5 */, /*22907*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898588u,138442752u,393216u}/* 145D6 */, /*22908*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898596u,138442752u,393216u}/* 145D7 */, /*22909*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898604u,138442752u,393216u}/* 145D8 */, /*22910*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898612u,138442752u,393216u}/* 145D9 */, /*22911*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898620u,138442752u,393216u}/* 145DA */, /*22912*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898628u,138442752u,393216u}/* 145DB */, /*22913*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898636u,138442752u,393216u}/* 145DC */, /*22914*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898644u,138442752u,393216u}/* 145DD */, /*22915*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898652u,138442752u,393216u}/* 145DE */, /*22916*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898660u,138442752u,393216u}/* 145DF */, /*22917*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898668u,138442752u,393216u}/* 145E0 */, /*22918*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898676u,138442752u,393216u}/* 145E1 */, /*22919*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898684u,138442752u,393216u}/* 145E2 */, /*22920*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898692u,138442752u,393216u}/* 145E3 */, /*22921*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898700u,138442752u,393216u}/* 145E4 */, /*22922*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898708u,138442752u,393216u}/* 145E5 */, /*22923*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898716u,138442752u,393216u}/* 145E6 */, /*22924*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898724u,138442752u,393216u}/* 145E7 */, /*22925*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898732u,138442752u,393216u}/* 145E8 */, /*22926*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898740u,138442752u,393216u}/* 145E9 */, /*22927*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898748u,138442752u,393216u}/* 145EA */, /*22928*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898756u,138442752u,393216u}/* 145EB */, /*22929*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898764u,138442752u,393216u}/* 145EC */, /*22930*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898772u,138442752u,393216u}/* 145ED */, /*22931*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898780u,138442752u,393216u}/* 145EE */, /*22932*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898788u,138442752u,393216u}/* 145EF */, /*22933*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898796u,138442752u,393216u}/* 145F0 */, /*22934*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898804u,138442752u,393216u}/* 145F1 */, /*22935*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898812u,138442752u,393216u}/* 145F2 */, /*22936*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898820u,138442752u,393216u}/* 145F3 */, /*22937*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898828u,138442752u,393216u}/* 145F4 */, /*22938*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898836u,138442752u,393216u}/* 145F5 */, /*22939*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898844u,138442752u,393216u}/* 145F6 */, /*22940*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898852u,138442752u,393216u}/* 145F7 */, /*22941*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898860u,138442752u,393216u}/* 145F8 */, /*22942*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898868u,138442752u,393216u}/* 145F9 */, /*22943*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898876u,138442752u,393216u}/* 145FA */, /*22944*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898884u,138442752u,393216u}/* 145FB */, /*22945*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898892u,138442752u,393216u}/* 145FC */, /*22946*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898900u,138442752u,393216u}/* 145FD */, /*22947*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898908u,138442752u,393216u}/* 145FE */, /*22948*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898916u,138442752u,393216u}/* 145FF */, /*22949*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898924u,138442752u,393216u}/* 14600 */, /*22950*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898932u,138442752u,393216u}/* 14601 */, /*22951*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898940u,138442752u,393216u}/* 14602 */, /*22952*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898948u,138442752u,393216u}/* 14603 */, /*22953*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898956u,138442752u,393216u}/* 14604 */, /*22954*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898964u,138442752u,393216u}/* 14605 */, /*22955*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898972u,138442752u,393216u}/* 14606 */, /*22956*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898980u,138442752u,393216u}/* 14607 */, /*22957*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898988u,138442752u,393216u}/* 14608 */, /*22958*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677898996u,138442752u,393216u}/* 14609 */, /*22959*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899004u,138442752u,393216u}/* 1460A */, /*22960*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899012u,138442752u,393216u}/* 1460B */, /*22961*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899020u,138442752u,393216u}/* 1460C */, /*22962*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899028u,138442752u,393216u}/* 1460D */, /*22963*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899036u,138442752u,393216u}/* 1460E */, /*22964*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899044u,138442752u,393216u}/* 1460F */, /*22965*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899052u,138442752u,393216u}/* 14610 */, /*22966*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899060u,138442752u,393216u}/* 14611 */, /*22967*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899068u,138442752u,393216u}/* 14612 */, /*22968*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899076u,138442752u,393216u}/* 14613 */, /*22969*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899084u,138442752u,393216u}/* 14614 */, /*22970*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899092u,138442752u,393216u}/* 14615 */, /*22971*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899100u,138442752u,393216u}/* 14616 */, /*22972*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899108u,138442752u,393216u}/* 14617 */, /*22973*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899116u,138442752u,393216u}/* 14618 */, /*22974*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899124u,138442752u,393216u}/* 14619 */, /*22975*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899132u,138442752u,393216u}/* 1461A */, /*22976*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899140u,138442752u,393216u}/* 1461B */, /*22977*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899148u,138442752u,393216u}/* 1461C */, /*22978*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899156u,138442752u,393216u}/* 1461D */, /*22979*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899164u,138442752u,393216u}/* 1461E */, /*22980*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899172u,138442752u,393216u}/* 1461F */, /*22981*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899180u,138442752u,393216u}/* 14620 */, /*22982*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899188u,138442752u,393216u}/* 14621 */, /*22983*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899196u,138442752u,393216u}/* 14622 */, /*22984*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899204u,138442752u,393216u}/* 14623 */, /*22985*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899212u,138442752u,393216u}/* 14624 */, /*22986*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899220u,138442752u,393216u}/* 14625 */, /*22987*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899228u,138442752u,393216u}/* 14626 */, /*22988*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899236u,138442752u,393216u}/* 14627 */, /*22989*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899244u,138442752u,393216u}/* 14628 */, /*22990*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899252u,138442752u,393216u}/* 14629 */, /*22991*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899260u,138442752u,393216u}/* 1462A */, /*22992*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899268u,138442752u,393216u}/* 1462B */, /*22993*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899276u,138442752u,393216u}/* 1462C */, /*22994*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899284u,138442752u,393216u}/* 1462D */, /*22995*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899292u,138442752u,393216u}/* 1462E */, /*22996*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899300u,138442752u,393216u}/* 1462F */, /*22997*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899308u,138442752u,393216u}/* 14630 */, /*22998*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899316u,138442752u,393216u}/* 14631 */, /*22999*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899324u,138442752u,393216u}/* 14632 */, /*23000*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899332u,138442752u,393216u}/* 14633 */, /*23001*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899340u,138442752u,393216u}/* 14634 */, /*23002*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899348u,138442752u,393216u}/* 14635 */, /*23003*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899356u,138442752u,393216u}/* 14636 */, /*23004*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899364u,138442752u,393216u}/* 14637 */, /*23005*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899372u,138442752u,393216u}/* 14638 */, /*23006*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899380u,138442752u,393216u}/* 14639 */, /*23007*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899388u,138442752u,393216u}/* 1463A */, /*23008*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899396u,138442752u,393216u}/* 1463B */, /*23009*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899404u,138442752u,393216u}/* 1463C */, /*23010*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899412u,138442752u,393216u}/* 1463D */, /*23011*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899420u,138442752u,393216u}/* 1463E */, /*23012*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899428u,138442752u,393216u}/* 1463F */, /*23013*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899436u,138442752u,393216u}/* 14640 */, /*23014*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899444u,138442752u,393216u}/* 14641 */, /*23015*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899452u,138442752u,393216u}/* 14642 */, /*23016*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899460u,138442752u,393216u}/* 14643 */, /*23017*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899468u,138442752u,393216u}/* 14644 */, /*23018*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899476u,138442752u,393216u}/* 14645 */, /*23019*/{0,1864u,8323073u,77103109u,1515560u,3758096416u,1677899484u,138442752u,393216u}/* 14646 */, /*23020*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677839996u,138442752u,393216u}/* 16800 */, /*23021*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840004u,138442752u,393216u}/* 16801 */, /*23022*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840012u,138442752u,393216u}/* 16802 */, /*23023*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840020u,138442752u,393216u}/* 16803 */, /*23024*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840028u,138442752u,393216u}/* 16804 */, /*23025*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840036u,138442752u,393216u}/* 16805 */, /*23026*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840044u,138442752u,393216u}/* 16806 */, /*23027*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840052u,138442752u,393216u}/* 16807 */, /*23028*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840060u,138442752u,393216u}/* 16808 */, /*23029*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840068u,138442752u,393216u}/* 16809 */, /*23030*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840076u,138442752u,393216u}/* 1680A */, /*23031*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840084u,138442752u,393216u}/* 1680B */, /*23032*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840092u,138442752u,393216u}/* 1680C */, /*23033*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840100u,138442752u,393216u}/* 1680D */, /*23034*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840108u,138442752u,393216u}/* 1680E */, /*23035*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840116u,138442752u,393216u}/* 1680F */, /*23036*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840124u,138442752u,393216u}/* 16810 */, /*23037*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840132u,138442752u,393216u}/* 16811 */, /*23038*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840140u,138442752u,393216u}/* 16812 */, /*23039*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840148u,138442752u,393216u}/* 16813 */, /*23040*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840156u,138442752u,393216u}/* 16814 */, /*23041*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840164u,138442752u,393216u}/* 16815 */, /*23042*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840172u,138442752u,393216u}/* 16816 */, /*23043*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840180u,138442752u,393216u}/* 16817 */, /*23044*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840188u,138442752u,393216u}/* 16818 */, /*23045*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840196u,138442752u,393216u}/* 16819 */, /*23046*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840204u,138442752u,393216u}/* 1681A */, /*23047*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840212u,138442752u,393216u}/* 1681B */, /*23048*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840220u,138442752u,393216u}/* 1681C */, /*23049*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840228u,138442752u,393216u}/* 1681D */, /*23050*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840236u,138442752u,393216u}/* 1681E */, /*23051*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840244u,138442752u,393216u}/* 1681F */, /*23052*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840252u,138442752u,393216u}/* 16820 */, /*23053*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840260u,138442752u,393216u}/* 16821 */, /*23054*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840268u,138442752u,393216u}/* 16822 */, /*23055*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840276u,138442752u,393216u}/* 16823 */, /*23056*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840284u,138442752u,393216u}/* 16824 */, /*23057*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840292u,138442752u,393216u}/* 16825 */, /*23058*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840300u,138442752u,393216u}/* 16826 */, /*23059*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840308u,138442752u,393216u}/* 16827 */, /*23060*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840316u,138442752u,393216u}/* 16828 */, /*23061*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840324u,138442752u,393216u}/* 16829 */, /*23062*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840332u,138442752u,393216u}/* 1682A */, /*23063*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840340u,138442752u,393216u}/* 1682B */, /*23064*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840348u,138442752u,393216u}/* 1682C */, /*23065*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840356u,138442752u,393216u}/* 1682D */, /*23066*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840364u,138442752u,393216u}/* 1682E */, /*23067*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840372u,138442752u,393216u}/* 1682F */, /*23068*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840380u,138442752u,393216u}/* 16830 */, /*23069*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840388u,138442752u,393216u}/* 16831 */, /*23070*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840396u,138442752u,393216u}/* 16832 */, /*23071*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840404u,138442752u,393216u}/* 16833 */, /*23072*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840412u,138442752u,393216u}/* 16834 */, /*23073*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840420u,138442752u,393216u}/* 16835 */, /*23074*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840428u,138442752u,393216u}/* 16836 */, /*23075*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840436u,138442752u,393216u}/* 16837 */, /*23076*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840444u,138442752u,393216u}/* 16838 */, /*23077*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840452u,138442752u,393216u}/* 16839 */, /*23078*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840460u,138442752u,393216u}/* 1683A */, /*23079*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840468u,138442752u,393216u}/* 1683B */, /*23080*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840476u,138442752u,393216u}/* 1683C */, /*23081*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840484u,138442752u,393216u}/* 1683D */, /*23082*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840492u,138442752u,393216u}/* 1683E */, /*23083*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840500u,138442752u,393216u}/* 1683F */, /*23084*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840508u,138442752u,393216u}/* 16840 */, /*23085*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840516u,138442752u,393216u}/* 16841 */, /*23086*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840524u,138442752u,393216u}/* 16842 */, /*23087*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840532u,138442752u,393216u}/* 16843 */, /*23088*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840540u,138442752u,393216u}/* 16844 */, /*23089*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840548u,138442752u,393216u}/* 16845 */, /*23090*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840556u,138442752u,393216u}/* 16846 */, /*23091*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840564u,138442752u,393216u}/* 16847 */, /*23092*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840572u,138442752u,393216u}/* 16848 */, /*23093*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840580u,138442752u,393216u}/* 16849 */, /*23094*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840588u,138442752u,393216u}/* 1684A */, /*23095*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840596u,138442752u,393216u}/* 1684B */, /*23096*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840604u,138442752u,393216u}/* 1684C */, /*23097*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840612u,138442752u,393216u}/* 1684D */, /*23098*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840620u,138442752u,393216u}/* 1684E */, /*23099*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840628u,138442752u,393216u}/* 1684F */, /*23100*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840636u,138442752u,393216u}/* 16850 */, /*23101*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840644u,138442752u,393216u}/* 16851 */, /*23102*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840652u,138442752u,393216u}/* 16852 */, /*23103*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840660u,138442752u,393216u}/* 16853 */, /*23104*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840668u,138442752u,393216u}/* 16854 */, /*23105*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840676u,138442752u,393216u}/* 16855 */, /*23106*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840684u,138442752u,393216u}/* 16856 */, /*23107*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840692u,138442752u,393216u}/* 16857 */, /*23108*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840700u,138442752u,393216u}/* 16858 */, /*23109*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840708u,138442752u,393216u}/* 16859 */, /*23110*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840716u,138442752u,393216u}/* 1685A */, /*23111*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840724u,138442752u,393216u}/* 1685B */, /*23112*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840732u,138442752u,393216u}/* 1685C */, /*23113*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840740u,138442752u,393216u}/* 1685D */, /*23114*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840748u,138442752u,393216u}/* 1685E */, /*23115*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840756u,138442752u,393216u}/* 1685F */, /*23116*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840764u,138442752u,393216u}/* 16860 */, /*23117*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840772u,138442752u,393216u}/* 16861 */, /*23118*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840780u,138442752u,393216u}/* 16862 */, /*23119*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840788u,138442752u,393216u}/* 16863 */, /*23120*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840796u,138442752u,393216u}/* 16864 */, /*23121*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840804u,138442752u,393216u}/* 16865 */, /*23122*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840812u,138442752u,393216u}/* 16866 */, /*23123*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840820u,138442752u,393216u}/* 16867 */, /*23124*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840828u,138442752u,393216u}/* 16868 */, /*23125*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840836u,138442752u,393216u}/* 16869 */, /*23126*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840844u,138442752u,393216u}/* 1686A */, /*23127*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840852u,138442752u,393216u}/* 1686B */, /*23128*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840860u,138442752u,393216u}/* 1686C */, /*23129*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840868u,138442752u,393216u}/* 1686D */, /*23130*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840876u,138442752u,393216u}/* 1686E */, /*23131*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840884u,138442752u,393216u}/* 1686F */, /*23132*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840892u,138442752u,393216u}/* 16870 */, /*23133*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840900u,138442752u,393216u}/* 16871 */, /*23134*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840908u,138442752u,393216u}/* 16872 */, /*23135*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840916u,138442752u,393216u}/* 16873 */, /*23136*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840924u,138442752u,393216u}/* 16874 */, /*23137*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840932u,138442752u,393216u}/* 16875 */, /*23138*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840940u,138442752u,393216u}/* 16876 */, /*23139*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840948u,138442752u,393216u}/* 16877 */, /*23140*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840956u,138442752u,393216u}/* 16878 */, /*23141*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840964u,138442752u,393216u}/* 16879 */, /*23142*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840972u,138442752u,393216u}/* 1687A */, /*23143*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840980u,138442752u,393216u}/* 1687B */, /*23144*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840988u,138442752u,393216u}/* 1687C */, /*23145*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677840996u,138442752u,393216u}/* 1687D */, /*23146*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841004u,138442752u,393216u}/* 1687E */, /*23147*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841012u,138442752u,393216u}/* 1687F */, /*23148*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841020u,138442752u,393216u}/* 16880 */, /*23149*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841028u,138442752u,393216u}/* 16881 */, /*23150*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841036u,138442752u,393216u}/* 16882 */, /*23151*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841044u,138442752u,393216u}/* 16883 */, /*23152*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841052u,138442752u,393216u}/* 16884 */, /*23153*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841060u,138442752u,393216u}/* 16885 */, /*23154*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841068u,138442752u,393216u}/* 16886 */, /*23155*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841076u,138442752u,393216u}/* 16887 */, /*23156*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841084u,138442752u,393216u}/* 16888 */, /*23157*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841092u,138442752u,393216u}/* 16889 */, /*23158*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841100u,138442752u,393216u}/* 1688A */, /*23159*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841108u,138442752u,393216u}/* 1688B */, /*23160*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841116u,138442752u,393216u}/* 1688C */, /*23161*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841124u,138442752u,393216u}/* 1688D */, /*23162*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841132u,138442752u,393216u}/* 1688E */, /*23163*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841140u,138442752u,393216u}/* 1688F */, /*23164*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841148u,138442752u,393216u}/* 16890 */, /*23165*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841156u,138442752u,393216u}/* 16891 */, /*23166*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841164u,138442752u,393216u}/* 16892 */, /*23167*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841172u,138442752u,393216u}/* 16893 */, /*23168*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841180u,138442752u,393216u}/* 16894 */, /*23169*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841188u,138442752u,393216u}/* 16895 */, /*23170*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841196u,138442752u,393216u}/* 16896 */, /*23171*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841204u,138442752u,393216u}/* 16897 */, /*23172*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841212u,138442752u,393216u}/* 16898 */, /*23173*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841220u,138442752u,393216u}/* 16899 */, /*23174*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841228u,138442752u,393216u}/* 1689A */, /*23175*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841236u,138442752u,393216u}/* 1689B */, /*23176*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841244u,138442752u,393216u}/* 1689C */, /*23177*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841252u,138442752u,393216u}/* 1689D */, /*23178*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841260u,138442752u,393216u}/* 1689E */, /*23179*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841268u,138442752u,393216u}/* 1689F */, /*23180*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841276u,138442752u,393216u}/* 168A0 */, /*23181*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841284u,138442752u,393216u}/* 168A1 */, /*23182*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841292u,138442752u,393216u}/* 168A2 */, /*23183*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841300u,138442752u,393216u}/* 168A3 */, /*23184*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841308u,138442752u,393216u}/* 168A4 */, /*23185*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841316u,138442752u,393216u}/* 168A5 */, /*23186*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841324u,138442752u,393216u}/* 168A6 */, /*23187*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841332u,138442752u,393216u}/* 168A7 */, /*23188*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841340u,138442752u,393216u}/* 168A8 */, /*23189*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841348u,138442752u,393216u}/* 168A9 */, /*23190*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841356u,138442752u,393216u}/* 168AA */, /*23191*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841364u,138442752u,393216u}/* 168AB */, /*23192*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841372u,138442752u,393216u}/* 168AC */, /*23193*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841380u,138442752u,393216u}/* 168AD */, /*23194*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841388u,138442752u,393216u}/* 168AE */, /*23195*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841396u,138442752u,393216u}/* 168AF */, /*23196*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841404u,138442752u,393216u}/* 168B0 */, /*23197*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841412u,138442752u,393216u}/* 168B1 */, /*23198*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841420u,138442752u,393216u}/* 168B2 */, /*23199*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841428u,138442752u,393216u}/* 168B3 */, /*23200*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841436u,138442752u,393216u}/* 168B4 */, /*23201*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841444u,138442752u,393216u}/* 168B5 */, /*23202*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841452u,138442752u,393216u}/* 168B6 */, /*23203*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841460u,138442752u,393216u}/* 168B7 */, /*23204*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841468u,138442752u,393216u}/* 168B8 */, /*23205*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841476u,138442752u,393216u}/* 168B9 */, /*23206*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841484u,138442752u,393216u}/* 168BA */, /*23207*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841492u,138442752u,393216u}/* 168BB */, /*23208*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841500u,138442752u,393216u}/* 168BC */, /*23209*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841508u,138442752u,393216u}/* 168BD */, /*23210*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841516u,138442752u,393216u}/* 168BE */, /*23211*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841524u,138442752u,393216u}/* 168BF */, /*23212*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841532u,138442752u,393216u}/* 168C0 */, /*23213*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841540u,138442752u,393216u}/* 168C1 */, /*23214*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841548u,138442752u,393216u}/* 168C2 */, /*23215*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841556u,138442752u,393216u}/* 168C3 */, /*23216*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841564u,138442752u,393216u}/* 168C4 */, /*23217*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841572u,138442752u,393216u}/* 168C5 */, /*23218*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841580u,138442752u,393216u}/* 168C6 */, /*23219*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841588u,138442752u,393216u}/* 168C7 */, /*23220*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841596u,138442752u,393216u}/* 168C8 */, /*23221*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841604u,138442752u,393216u}/* 168C9 */, /*23222*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841612u,138442752u,393216u}/* 168CA */, /*23223*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841620u,138442752u,393216u}/* 168CB */, /*23224*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841628u,138442752u,393216u}/* 168CC */, /*23225*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841636u,138442752u,393216u}/* 168CD */, /*23226*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841644u,138442752u,393216u}/* 168CE */, /*23227*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841652u,138442752u,393216u}/* 168CF */, /*23228*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841660u,138442752u,393216u}/* 168D0 */, /*23229*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841668u,138442752u,393216u}/* 168D1 */, /*23230*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841676u,138442752u,393216u}/* 168D2 */, /*23231*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841684u,138442752u,393216u}/* 168D3 */, /*23232*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841692u,138442752u,393216u}/* 168D4 */, /*23233*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841700u,138442752u,393216u}/* 168D5 */, /*23234*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841708u,138442752u,393216u}/* 168D6 */, /*23235*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841716u,138442752u,393216u}/* 168D7 */, /*23236*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841724u,138442752u,393216u}/* 168D8 */, /*23237*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841732u,138442752u,393216u}/* 168D9 */, /*23238*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841740u,138442752u,393216u}/* 168DA */, /*23239*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841748u,138442752u,393216u}/* 168DB */, /*23240*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841756u,138442752u,393216u}/* 168DC */, /*23241*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841764u,138442752u,393216u}/* 168DD */, /*23242*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841772u,138442752u,393216u}/* 168DE */, /*23243*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841780u,138442752u,393216u}/* 168DF */, /*23244*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841788u,138442752u,393216u}/* 168E0 */, /*23245*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841796u,138442752u,393216u}/* 168E1 */, /*23246*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841804u,138442752u,393216u}/* 168E2 */, /*23247*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841812u,138442752u,393216u}/* 168E3 */, /*23248*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841820u,138442752u,393216u}/* 168E4 */, /*23249*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841828u,138442752u,393216u}/* 168E5 */, /*23250*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841836u,138442752u,393216u}/* 168E6 */, /*23251*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841844u,138442752u,393216u}/* 168E7 */, /*23252*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841852u,138442752u,393216u}/* 168E8 */, /*23253*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841860u,138442752u,393216u}/* 168E9 */, /*23254*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841868u,138442752u,393216u}/* 168EA */, /*23255*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841876u,138442752u,393216u}/* 168EB */, /*23256*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841884u,138442752u,393216u}/* 168EC */, /*23257*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841892u,138442752u,393216u}/* 168ED */, /*23258*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841900u,138442752u,393216u}/* 168EE */, /*23259*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841908u,138442752u,393216u}/* 168EF */, /*23260*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841916u,138442752u,393216u}/* 168F0 */, /*23261*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841924u,138442752u,393216u}/* 168F1 */, /*23262*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841932u,138442752u,393216u}/* 168F2 */, /*23263*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841940u,138442752u,393216u}/* 168F3 */, /*23264*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841948u,138442752u,393216u}/* 168F4 */, /*23265*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841956u,138442752u,393216u}/* 168F5 */, /*23266*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841964u,138442752u,393216u}/* 168F6 */, /*23267*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841972u,138442752u,393216u}/* 168F7 */, /*23268*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841980u,138442752u,393216u}/* 168F8 */, /*23269*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841988u,138442752u,393216u}/* 168F9 */, /*23270*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677841996u,138442752u,393216u}/* 168FA */, /*23271*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842004u,138442752u,393216u}/* 168FB */, /*23272*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842012u,138442752u,393216u}/* 168FC */, /*23273*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842020u,138442752u,393216u}/* 168FD */, /*23274*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842028u,138442752u,393216u}/* 168FE */, /*23275*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842036u,138442752u,393216u}/* 168FF */, /*23276*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842044u,138442752u,393216u}/* 16900 */, /*23277*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842052u,138442752u,393216u}/* 16901 */, /*23278*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842060u,138442752u,393216u}/* 16902 */, /*23279*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842068u,138442752u,393216u}/* 16903 */, /*23280*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842076u,138442752u,393216u}/* 16904 */, /*23281*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842084u,138442752u,393216u}/* 16905 */, /*23282*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842092u,138442752u,393216u}/* 16906 */, /*23283*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842100u,138442752u,393216u}/* 16907 */, /*23284*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842108u,138442752u,393216u}/* 16908 */, /*23285*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842116u,138442752u,393216u}/* 16909 */, /*23286*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842124u,138442752u,393216u}/* 1690A */, /*23287*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842132u,138442752u,393216u}/* 1690B */, /*23288*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842140u,138442752u,393216u}/* 1690C */, /*23289*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842148u,138442752u,393216u}/* 1690D */, /*23290*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842156u,138442752u,393216u}/* 1690E */, /*23291*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842164u,138442752u,393216u}/* 1690F */, /*23292*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842172u,138442752u,393216u}/* 16910 */, /*23293*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842180u,138442752u,393216u}/* 16911 */, /*23294*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842188u,138442752u,393216u}/* 16912 */, /*23295*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842196u,138442752u,393216u}/* 16913 */, /*23296*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842204u,138442752u,393216u}/* 16914 */, /*23297*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842212u,138442752u,393216u}/* 16915 */, /*23298*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842220u,138442752u,393216u}/* 16916 */, /*23299*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842228u,138442752u,393216u}/* 16917 */, /*23300*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842236u,138442752u,393216u}/* 16918 */, /*23301*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842244u,138442752u,393216u}/* 16919 */, /*23302*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842252u,138442752u,393216u}/* 1691A */, /*23303*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842260u,138442752u,393216u}/* 1691B */, /*23304*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842268u,138442752u,393216u}/* 1691C */, /*23305*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842276u,138442752u,393216u}/* 1691D */, /*23306*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842284u,138442752u,393216u}/* 1691E */, /*23307*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842292u,138442752u,393216u}/* 1691F */, /*23308*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842300u,138442752u,393216u}/* 16920 */, /*23309*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842308u,138442752u,393216u}/* 16921 */, /*23310*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842316u,138442752u,393216u}/* 16922 */, /*23311*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842324u,138442752u,393216u}/* 16923 */, /*23312*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842332u,138442752u,393216u}/* 16924 */, /*23313*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842340u,138442752u,393216u}/* 16925 */, /*23314*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842348u,138442752u,393216u}/* 16926 */, /*23315*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842356u,138442752u,393216u}/* 16927 */, /*23316*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842364u,138442752u,393216u}/* 16928 */, /*23317*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842372u,138442752u,393216u}/* 16929 */, /*23318*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842380u,138442752u,393216u}/* 1692A */, /*23319*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842388u,138442752u,393216u}/* 1692B */, /*23320*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842396u,138442752u,393216u}/* 1692C */, /*23321*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842404u,138442752u,393216u}/* 1692D */, /*23322*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842412u,138442752u,393216u}/* 1692E */, /*23323*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842420u,138442752u,393216u}/* 1692F */, /*23324*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842428u,138442752u,393216u}/* 16930 */, /*23325*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842436u,138442752u,393216u}/* 16931 */, /*23326*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842444u,138442752u,393216u}/* 16932 */, /*23327*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842452u,138442752u,393216u}/* 16933 */, /*23328*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842460u,138442752u,393216u}/* 16934 */, /*23329*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842468u,138442752u,393216u}/* 16935 */, /*23330*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842476u,138442752u,393216u}/* 16936 */, /*23331*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842484u,138442752u,393216u}/* 16937 */, /*23332*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842492u,138442752u,393216u}/* 16938 */, /*23333*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842500u,138442752u,393216u}/* 16939 */, /*23334*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842508u,138442752u,393216u}/* 1693A */, /*23335*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842516u,138442752u,393216u}/* 1693B */, /*23336*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842524u,138442752u,393216u}/* 1693C */, /*23337*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842532u,138442752u,393216u}/* 1693D */, /*23338*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842540u,138442752u,393216u}/* 1693E */, /*23339*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842548u,138442752u,393216u}/* 1693F */, /*23340*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842556u,138442752u,393216u}/* 16940 */, /*23341*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842564u,138442752u,393216u}/* 16941 */, /*23342*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842572u,138442752u,393216u}/* 16942 */, /*23343*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842580u,138442752u,393216u}/* 16943 */, /*23344*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842588u,138442752u,393216u}/* 16944 */, /*23345*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842596u,138442752u,393216u}/* 16945 */, /*23346*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842604u,138442752u,393216u}/* 16946 */, /*23347*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842612u,138442752u,393216u}/* 16947 */, /*23348*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842620u,138442752u,393216u}/* 16948 */, /*23349*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842628u,138442752u,393216u}/* 16949 */, /*23350*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842636u,138442752u,393216u}/* 1694A */, /*23351*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842644u,138442752u,393216u}/* 1694B */, /*23352*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842652u,138442752u,393216u}/* 1694C */, /*23353*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842660u,138442752u,393216u}/* 1694D */, /*23354*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842668u,138442752u,393216u}/* 1694E */, /*23355*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842676u,138442752u,393216u}/* 1694F */, /*23356*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842684u,138442752u,393216u}/* 16950 */, /*23357*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842692u,138442752u,393216u}/* 16951 */, /*23358*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842700u,138442752u,393216u}/* 16952 */, /*23359*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842708u,138442752u,393216u}/* 16953 */, /*23360*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842716u,138442752u,393216u}/* 16954 */, /*23361*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842724u,138442752u,393216u}/* 16955 */, /*23362*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842732u,138442752u,393216u}/* 16956 */, /*23363*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842740u,138442752u,393216u}/* 16957 */, /*23364*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842748u,138442752u,393216u}/* 16958 */, /*23365*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842756u,138442752u,393216u}/* 16959 */, /*23366*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842764u,138442752u,393216u}/* 1695A */, /*23367*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842772u,138442752u,393216u}/* 1695B */, /*23368*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842780u,138442752u,393216u}/* 1695C */, /*23369*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842788u,138442752u,393216u}/* 1695D */, /*23370*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842796u,138442752u,393216u}/* 1695E */, /*23371*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842804u,138442752u,393216u}/* 1695F */, /*23372*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842812u,138442752u,393216u}/* 16960 */, /*23373*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842820u,138442752u,393216u}/* 16961 */, /*23374*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842828u,138442752u,393216u}/* 16962 */, /*23375*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842836u,138442752u,393216u}/* 16963 */, /*23376*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842844u,138442752u,393216u}/* 16964 */, /*23377*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842852u,138442752u,393216u}/* 16965 */, /*23378*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842860u,138442752u,393216u}/* 16966 */, /*23379*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842868u,138442752u,393216u}/* 16967 */, /*23380*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842876u,138442752u,393216u}/* 16968 */, /*23381*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842884u,138442752u,393216u}/* 16969 */, /*23382*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842892u,138442752u,393216u}/* 1696A */, /*23383*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842900u,138442752u,393216u}/* 1696B */, /*23384*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842908u,138442752u,393216u}/* 1696C */, /*23385*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842916u,138442752u,393216u}/* 1696D */, /*23386*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842924u,138442752u,393216u}/* 1696E */, /*23387*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842932u,138442752u,393216u}/* 1696F */, /*23388*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842940u,138442752u,393216u}/* 16970 */, /*23389*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842948u,138442752u,393216u}/* 16971 */, /*23390*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842956u,138442752u,393216u}/* 16972 */, /*23391*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842964u,138442752u,393216u}/* 16973 */, /*23392*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842972u,138442752u,393216u}/* 16974 */, /*23393*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842980u,138442752u,393216u}/* 16975 */, /*23394*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842988u,138442752u,393216u}/* 16976 */, /*23395*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677842996u,138442752u,393216u}/* 16977 */, /*23396*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843004u,138442752u,393216u}/* 16978 */, /*23397*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843012u,138442752u,393216u}/* 16979 */, /*23398*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843020u,138442752u,393216u}/* 1697A */, /*23399*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843028u,138442752u,393216u}/* 1697B */, /*23400*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843036u,138442752u,393216u}/* 1697C */, /*23401*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843044u,138442752u,393216u}/* 1697D */, /*23402*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843052u,138442752u,393216u}/* 1697E */, /*23403*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843060u,138442752u,393216u}/* 1697F */, /*23404*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843068u,138442752u,393216u}/* 16980 */, /*23405*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843076u,138442752u,393216u}/* 16981 */, /*23406*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843084u,138442752u,393216u}/* 16982 */, /*23407*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843092u,138442752u,393216u}/* 16983 */, /*23408*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843100u,138442752u,393216u}/* 16984 */, /*23409*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843108u,138442752u,393216u}/* 16985 */, /*23410*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843116u,138442752u,393216u}/* 16986 */, /*23411*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843124u,138442752u,393216u}/* 16987 */, /*23412*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843132u,138442752u,393216u}/* 16988 */, /*23413*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843140u,138442752u,393216u}/* 16989 */, /*23414*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843148u,138442752u,393216u}/* 1698A */, /*23415*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843156u,138442752u,393216u}/* 1698B */, /*23416*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843164u,138442752u,393216u}/* 1698C */, /*23417*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843172u,138442752u,393216u}/* 1698D */, /*23418*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843180u,138442752u,393216u}/* 1698E */, /*23419*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843188u,138442752u,393216u}/* 1698F */, /*23420*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843196u,138442752u,393216u}/* 16990 */, /*23421*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843204u,138442752u,393216u}/* 16991 */, /*23422*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843212u,138442752u,393216u}/* 16992 */, /*23423*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843220u,138442752u,393216u}/* 16993 */, /*23424*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843228u,138442752u,393216u}/* 16994 */, /*23425*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843236u,138442752u,393216u}/* 16995 */, /*23426*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843244u,138442752u,393216u}/* 16996 */, /*23427*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843252u,138442752u,393216u}/* 16997 */, /*23428*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843260u,138442752u,393216u}/* 16998 */, /*23429*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843268u,138442752u,393216u}/* 16999 */, /*23430*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843276u,138442752u,393216u}/* 1699A */, /*23431*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843284u,138442752u,393216u}/* 1699B */, /*23432*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843292u,138442752u,393216u}/* 1699C */, /*23433*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843300u,138442752u,393216u}/* 1699D */, /*23434*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843308u,138442752u,393216u}/* 1699E */, /*23435*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843316u,138442752u,393216u}/* 1699F */, /*23436*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843324u,138442752u,393216u}/* 169A0 */, /*23437*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843332u,138442752u,393216u}/* 169A1 */, /*23438*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843340u,138442752u,393216u}/* 169A2 */, /*23439*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843348u,138442752u,393216u}/* 169A3 */, /*23440*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843356u,138442752u,393216u}/* 169A4 */, /*23441*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843364u,138442752u,393216u}/* 169A5 */, /*23442*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843372u,138442752u,393216u}/* 169A6 */, /*23443*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843380u,138442752u,393216u}/* 169A7 */, /*23444*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843388u,138442752u,393216u}/* 169A8 */, /*23445*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843396u,138442752u,393216u}/* 169A9 */, /*23446*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843404u,138442752u,393216u}/* 169AA */, /*23447*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843412u,138442752u,393216u}/* 169AB */, /*23448*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843420u,138442752u,393216u}/* 169AC */, /*23449*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843428u,138442752u,393216u}/* 169AD */, /*23450*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843436u,138442752u,393216u}/* 169AE */, /*23451*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843444u,138442752u,393216u}/* 169AF */, /*23452*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843452u,138442752u,393216u}/* 169B0 */, /*23453*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843460u,138442752u,393216u}/* 169B1 */, /*23454*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843468u,138442752u,393216u}/* 169B2 */, /*23455*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843476u,138442752u,393216u}/* 169B3 */, /*23456*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843484u,138442752u,393216u}/* 169B4 */, /*23457*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843492u,138442752u,393216u}/* 169B5 */, /*23458*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843500u,138442752u,393216u}/* 169B6 */, /*23459*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843508u,138442752u,393216u}/* 169B7 */, /*23460*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843516u,138442752u,393216u}/* 169B8 */, /*23461*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843524u,138442752u,393216u}/* 169B9 */, /*23462*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843532u,138442752u,393216u}/* 169BA */, /*23463*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843540u,138442752u,393216u}/* 169BB */, /*23464*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843548u,138442752u,393216u}/* 169BC */, /*23465*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843556u,138442752u,393216u}/* 169BD */, /*23466*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843564u,138442752u,393216u}/* 169BE */, /*23467*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843572u,138442752u,393216u}/* 169BF */, /*23468*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843580u,138442752u,393216u}/* 169C0 */, /*23469*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843588u,138442752u,393216u}/* 169C1 */, /*23470*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843596u,138442752u,393216u}/* 169C2 */, /*23471*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843604u,138442752u,393216u}/* 169C3 */, /*23472*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843612u,138442752u,393216u}/* 169C4 */, /*23473*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843620u,138442752u,393216u}/* 169C5 */, /*23474*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843628u,138442752u,393216u}/* 169C6 */, /*23475*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843636u,138442752u,393216u}/* 169C7 */, /*23476*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843644u,138442752u,393216u}/* 169C8 */, /*23477*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843652u,138442752u,393216u}/* 169C9 */, /*23478*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843660u,138442752u,393216u}/* 169CA */, /*23479*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843668u,138442752u,393216u}/* 169CB */, /*23480*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843676u,138442752u,393216u}/* 169CC */, /*23481*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843684u,138442752u,393216u}/* 169CD */, /*23482*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843692u,138442752u,393216u}/* 169CE */, /*23483*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843700u,138442752u,393216u}/* 169CF */, /*23484*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843708u,138442752u,393216u}/* 169D0 */, /*23485*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843716u,138442752u,393216u}/* 169D1 */, /*23486*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843724u,138442752u,393216u}/* 169D2 */, /*23487*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843732u,138442752u,393216u}/* 169D3 */, /*23488*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843740u,138442752u,393216u}/* 169D4 */, /*23489*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843748u,138442752u,393216u}/* 169D5 */, /*23490*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843756u,138442752u,393216u}/* 169D6 */, /*23491*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843764u,138442752u,393216u}/* 169D7 */, /*23492*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843772u,138442752u,393216u}/* 169D8 */, /*23493*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843780u,138442752u,393216u}/* 169D9 */, /*23494*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843788u,138442752u,393216u}/* 169DA */, /*23495*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843796u,138442752u,393216u}/* 169DB */, /*23496*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843804u,138442752u,393216u}/* 169DC */, /*23497*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843812u,138442752u,393216u}/* 169DD */, /*23498*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843820u,138442752u,393216u}/* 169DE */, /*23499*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843828u,138442752u,393216u}/* 169DF */, /*23500*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843836u,138442752u,393216u}/* 169E0 */, /*23501*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843844u,138442752u,393216u}/* 169E1 */, /*23502*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843852u,138442752u,393216u}/* 169E2 */, /*23503*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843860u,138442752u,393216u}/* 169E3 */, /*23504*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843868u,138442752u,393216u}/* 169E4 */, /*23505*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843876u,138442752u,393216u}/* 169E5 */, /*23506*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843884u,138442752u,393216u}/* 169E6 */, /*23507*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843892u,138442752u,393216u}/* 169E7 */, /*23508*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843900u,138442752u,393216u}/* 169E8 */, /*23509*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843908u,138442752u,393216u}/* 169E9 */, /*23510*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843916u,138442752u,393216u}/* 169EA */, /*23511*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843924u,138442752u,393216u}/* 169EB */, /*23512*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843932u,138442752u,393216u}/* 169EC */, /*23513*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843940u,138442752u,393216u}/* 169ED */, /*23514*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843948u,138442752u,393216u}/* 169EE */, /*23515*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843956u,138442752u,393216u}/* 169EF */, /*23516*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843964u,138442752u,393216u}/* 169F0 */, /*23517*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843972u,138442752u,393216u}/* 169F1 */, /*23518*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843980u,138442752u,393216u}/* 169F2 */, /*23519*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843988u,138442752u,393216u}/* 169F3 */, /*23520*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677843996u,138442752u,393216u}/* 169F4 */, /*23521*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844004u,138442752u,393216u}/* 169F5 */, /*23522*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844012u,138442752u,393216u}/* 169F6 */, /*23523*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844020u,138442752u,393216u}/* 169F7 */, /*23524*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844028u,138442752u,393216u}/* 169F8 */, /*23525*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844036u,138442752u,393216u}/* 169F9 */, /*23526*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844044u,138442752u,393216u}/* 169FA */, /*23527*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844052u,138442752u,393216u}/* 169FB */, /*23528*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844060u,138442752u,393216u}/* 169FC */, /*23529*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844068u,138442752u,393216u}/* 169FD */, /*23530*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844076u,138442752u,393216u}/* 169FE */, /*23531*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844084u,138442752u,393216u}/* 169FF */, /*23532*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844092u,138442752u,393216u}/* 16A00 */, /*23533*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844100u,138442752u,393216u}/* 16A01 */, /*23534*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844108u,138442752u,393216u}/* 16A02 */, /*23535*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844116u,138442752u,393216u}/* 16A03 */, /*23536*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844124u,138442752u,393216u}/* 16A04 */, /*23537*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844132u,138442752u,393216u}/* 16A05 */, /*23538*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844140u,138442752u,393216u}/* 16A06 */, /*23539*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844148u,138442752u,393216u}/* 16A07 */, /*23540*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844156u,138442752u,393216u}/* 16A08 */, /*23541*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844164u,138442752u,393216u}/* 16A09 */, /*23542*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844172u,138442752u,393216u}/* 16A0A */, /*23543*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844180u,138442752u,393216u}/* 16A0B */, /*23544*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844188u,138442752u,393216u}/* 16A0C */, /*23545*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844196u,138442752u,393216u}/* 16A0D */, /*23546*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844204u,138442752u,393216u}/* 16A0E */, /*23547*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844212u,138442752u,393216u}/* 16A0F */, /*23548*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844220u,138442752u,393216u}/* 16A10 */, /*23549*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844228u,138442752u,393216u}/* 16A11 */, /*23550*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844236u,138442752u,393216u}/* 16A12 */, /*23551*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844244u,138442752u,393216u}/* 16A13 */, /*23552*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844252u,138442752u,393216u}/* 16A14 */, /*23553*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844260u,138442752u,393216u}/* 16A15 */, /*23554*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844268u,138442752u,393216u}/* 16A16 */, /*23555*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844276u,138442752u,393216u}/* 16A17 */, /*23556*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844284u,138442752u,393216u}/* 16A18 */, /*23557*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844292u,138442752u,393216u}/* 16A19 */, /*23558*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844300u,138442752u,393216u}/* 16A1A */, /*23559*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844308u,138442752u,393216u}/* 16A1B */, /*23560*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844316u,138442752u,393216u}/* 16A1C */, /*23561*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844324u,138442752u,393216u}/* 16A1D */, /*23562*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844332u,138442752u,393216u}/* 16A1E */, /*23563*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844340u,138442752u,393216u}/* 16A1F */, /*23564*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844348u,138442752u,393216u}/* 16A20 */, /*23565*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844356u,138442752u,393216u}/* 16A21 */, /*23566*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844364u,138442752u,393216u}/* 16A22 */, /*23567*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844372u,138442752u,393216u}/* 16A23 */, /*23568*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844380u,138442752u,393216u}/* 16A24 */, /*23569*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844388u,138442752u,393216u}/* 16A25 */, /*23570*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844396u,138442752u,393216u}/* 16A26 */, /*23571*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844404u,138442752u,393216u}/* 16A27 */, /*23572*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844412u,138442752u,393216u}/* 16A28 */, /*23573*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844420u,138442752u,393216u}/* 16A29 */, /*23574*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844428u,138442752u,393216u}/* 16A2A */, /*23575*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844436u,138442752u,393216u}/* 16A2B */, /*23576*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844444u,138442752u,393216u}/* 16A2C */, /*23577*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844452u,138442752u,393216u}/* 16A2D */, /*23578*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844460u,138442752u,393216u}/* 16A2E */, /*23579*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844468u,138442752u,393216u}/* 16A2F */, /*23580*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844476u,138442752u,393216u}/* 16A30 */, /*23581*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844484u,138442752u,393216u}/* 16A31 */, /*23582*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844492u,138442752u,393216u}/* 16A32 */, /*23583*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844500u,138442752u,393216u}/* 16A33 */, /*23584*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844508u,138442752u,393216u}/* 16A34 */, /*23585*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844516u,138442752u,393216u}/* 16A35 */, /*23586*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844524u,138442752u,393216u}/* 16A36 */, /*23587*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844532u,138442752u,393216u}/* 16A37 */, /*23588*/{0,1872u,5505025u,76939269u,1515560u,3758096416u,1677844540u,138442752u,393216u}/* 16A38 */, /*23589*/{0,1880u,7536641u,77070341u,1515560u,3758096416u,1677869060u,138442752u,393216u}/* 16A40 */, /*23590*/{0,1880u,7536641u,77070341u,1515560u,3758096416u,1677869068u,138442752u,393216u}/* 16A41 */, /*23591*/{0,1880u,7536641u,77070341u,1515560u,3758096416u,1677869076u,138442752u,393216u}/* 16A42 */, /*23592*/{0,1880u,7536641u,77070341u,1515560u,3758096416u,1677869084u,138442752u,393216u}/* 16A43 */, /*23593*/{0,1880u,7536641u,77070341u,1515560u,3758096416u,1677869092u,138442752u,393216u}/* 16A44 */, /*23594*/{0,1880u,7536641u,77070341u,1515560u,3758096416u,1677869100u,138442752u,393216u}/* 16A45 */, /*23595*/{0,1880u,7536641u,77070341u,1515560u,3758096416u,1677869108u,138442752u,393216u}/* 16A46 */, /*23596*/{0,1880u,7536641u,77070341u,1515560u,3758096416u,1677869116u,138442752u,393216u}/* 16A47 */, /*23597*/{0,1880u,7536641u,77070341u,1515560u,3758096416u,1677869124u,138442752u,393216u}/* 16A48 */, /*23598*/{0,1880u,7536641u,77070341u,1515560u,3758096416u,1677869132u,138442752u,393216u}/* 16A49 */, /*23599*/{0,1880u,7536641u,77070341u,1515560u,3758096416u,1677869140u,138442752u,393216u}/* 16A4A */, /*23600*/{0,1880u,7536641u,77070341u,1515560u,3758096416u,1677869148u,138442752u,393216u}/* 16A4B */, /*23601*/{0,1880u,7536641u,77070341u,1515560u,3758096416u,1677869156u,138442752u,393216u}/* 16A4C */, /*23602*/{0,1880u,7536641u,77070341u,1515560u,3758096416u,1677869164u,138442752u,393216u}/* 16A4D */, /*23603*/{0,1880u,7536641u,77070341u,1515560u,3758096416u,1677869172u,138442752u,393216u}/* 16A4E */, /*23604*/{0,1880u,7536641u,77070341u,1515560u,3758096416u,1677869180u,138442752u,393216u}/* 16A4F */, /*23605*/{0,1880u,7536641u,77070341u,1515560u,3758096416u,1677869188u,138442752u,393216u}/* 16A50 */, /*23606*/{0,1880u,7536641u,77070341u,1515560u,3758096416u,1677869196u,138442752u,393216u}/* 16A51 */, /*23607*/{0,1880u,7536641u,77070341u,1515560u,3758096416u,1677869204u,138442752u,393216u}/* 16A52 */, /*23608*/{0,1880u,7536641u,77070341u,1515560u,3758096416u,1677869212u,138442752u,393216u}/* 16A53 */, /*23609*/{0,1880u,7536641u,77070341u,1515560u,3758096416u,1677869220u,138442752u,393216u}/* 16A54 */, /*23610*/{0,1880u,7536641u,77070341u,1515560u,3758096416u,1677869228u,138442752u,393216u}/* 16A55 */, /*23611*/{0,1880u,7536641u,77070341u,1515560u,3758096416u,1677869236u,138442752u,393216u}/* 16A56 */, /*23612*/{0,1880u,7536641u,77070341u,1515560u,3758096416u,1677869244u,138442752u,393216u}/* 16A57 */, /*23613*/{0,1880u,7536641u,77070341u,1515560u,3758096416u,1677869252u,138442752u,393216u}/* 16A58 */, /*23614*/{0,1880u,7536641u,77070341u,1515560u,3758096416u,1677869260u,138442752u,393216u}/* 16A59 */, /*23615*/{0,1880u,7536641u,77070341u,1515560u,3758096416u,1677869268u,138442752u,393216u}/* 16A5A */, /*23616*/{0,1880u,7536641u,77070341u,1515560u,3758096416u,1677869276u,138442752u,393216u}/* 16A5B */, /*23617*/{0,1880u,7536641u,77070341u,1515560u,3758096416u,1677869284u,138442752u,393216u}/* 16A5C */, /*23618*/{0,1880u,7536641u,77070341u,1515560u,3758096416u,1677869292u,138442752u,393216u}/* 16A5D */, /*23619*/{0,1880u,7536641u,77070341u,1515560u,3758096416u,1677869300u,138442752u,393216u}/* 16A5E */, /*23620*/{0,1880u,41092097u,85458953u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 16A60 */, /*23621*/{0,1880u,544409089u,85458953u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 16A61 */, /*23622*/{0,1880u,577964545u,85458953u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 16A62 */, /*23623*/{0,1880u,611518465u,85458953u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 16A63 */, /*23624*/{0,1880u,645074945u,85458953u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 16A64 */, /*23625*/{0,1880u,678628353u,85458953u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 16A65 */, /*23626*/{0,1880u,712185345u,85458953u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 16A66 */, /*23627*/{0,1880u,745737729u,85458953u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 16A67 */, /*23628*/{0,1880u,779295745u,85458953u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 16A68 */, /*23629*/{0,1880u,812848129u,85458953u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 16A69 */, /*23630*/{0,1880u,7536641u,69730327u,98344u,1610612768u,5652u,138442754u,41943040u}/* 16A6E */, /*23631*/{0,1880u,7536641u,69730327u,98344u,1610612768u,5660u,138442754u,41943040u}/* 16A6F */, /*23632*/{0,1888u,6815745u,77070341u,1515560u,3758096416u,1677844548u,138442752u,393216u}/* 16AD0 */, /*23633*/{0,1888u,6815745u,77070341u,1515560u,3758096416u,1677844556u,138442752u,393216u}/* 16AD1 */, /*23634*/{0,1888u,6815745u,77070341u,1515560u,3758096416u,1677844564u,138442752u,393216u}/* 16AD2 */, /*23635*/{0,1888u,6815745u,77070341u,1515560u,3758096416u,1677844572u,138442752u,393216u}/* 16AD3 */, /*23636*/{0,1888u,6815745u,77070341u,1515560u,3758096416u,1677844580u,138442752u,393216u}/* 16AD4 */, /*23637*/{0,1888u,6815745u,77070341u,1515560u,3758096416u,1677844588u,138442752u,393216u}/* 16AD5 */, /*23638*/{0,1888u,6815745u,77070341u,1515560u,3758096416u,1677844596u,138442752u,393216u}/* 16AD6 */, /*23639*/{0,1888u,6815745u,77070341u,1515560u,3758096416u,1677844604u,138442752u,393216u}/* 16AD7 */, /*23640*/{0,1888u,6815745u,77070341u,1515560u,3758096416u,1677844612u,138442752u,393216u}/* 16AD8 */, /*23641*/{0,1888u,6815745u,77070341u,1515560u,3758096416u,1677844620u,138442752u,393216u}/* 16AD9 */, /*23642*/{0,1888u,6815745u,77070341u,1515560u,3758096416u,1677844628u,138442752u,393216u}/* 16ADA */, /*23643*/{0,1888u,6815745u,77070341u,1515560u,3758096416u,1677844636u,138442752u,393216u}/* 16ADB */, /*23644*/{0,1888u,6815745u,77070341u,1515560u,3758096416u,1677844644u,138442752u,393216u}/* 16ADC */, /*23645*/{0,1888u,6815745u,77070341u,1515560u,3758096416u,1677844652u,138442752u,393216u}/* 16ADD */, /*23646*/{0,1888u,6815745u,77070341u,1515560u,3758096416u,1677844660u,138442752u,393216u}/* 16ADE */, /*23647*/{0,1888u,6815745u,77070341u,1515560u,3758096416u,1677844668u,138442752u,393216u}/* 16ADF */, /*23648*/{0,1888u,6815745u,77070341u,1515560u,3758096416u,1677844676u,138442752u,393216u}/* 16AE0 */, /*23649*/{0,1888u,6815745u,77070341u,1515560u,3758096416u,1677844684u,138442752u,393216u}/* 16AE1 */, /*23650*/{0,1888u,6815745u,77070341u,1515560u,3758096416u,1677844692u,138442752u,393216u}/* 16AE2 */, /*23651*/{0,1888u,6815745u,77070341u,1515560u,3758096416u,1677844700u,138442752u,393216u}/* 16AE3 */, /*23652*/{0,1888u,6815745u,77070341u,1515560u,3758096416u,1677844708u,138442752u,393216u}/* 16AE4 */, /*23653*/{0,1888u,6815745u,77070341u,1515560u,3758096416u,1677844716u,138442752u,393216u}/* 16AE5 */, /*23654*/{0,1888u,6815745u,77070341u,1515560u,3758096416u,1677844724u,138442752u,393216u}/* 16AE6 */, /*23655*/{0,1888u,6815745u,77070341u,1515560u,3758096416u,1677844732u,138442752u,393216u}/* 16AE7 */, /*23656*/{0,1888u,6815745u,77070341u,1515560u,3758096416u,1677844740u,138442752u,393216u}/* 16AE8 */, /*23657*/{0,1888u,6815745u,77070341u,1515560u,3758096416u,1677844748u,138442752u,393216u}/* 16AE9 */, /*23658*/{0,1888u,6815745u,77070341u,1515560u,3758096416u,1677844756u,138442752u,393216u}/* 16AEA */, /*23659*/{0,1888u,6815745u,77070341u,1515560u,3758096416u,1677844764u,138442752u,393216u}/* 16AEB */, /*23660*/{0,1888u,6815745u,77070341u,1515560u,3758096416u,1677844772u,138442752u,393216u}/* 16AEC */, /*23661*/{0,1888u,6815745u,77070341u,1515560u,3758096416u,1677844780u,138442752u,393216u}/* 16AED */, /*23662*/{0,1888u,6815745u,135802886u,672030728u,1627398160u,1077936140u,775976960u,262144u}/* 16AF0 */, /*23663*/{0,1888u,6815745u,135802886u,672030728u,1627398160u,1077936140u,780171264u,262144u}/* 16AF1 */, /*23664*/{0,1888u,6815745u,135802886u,672030728u,1627398160u,1077936140u,784365568u,262144u}/* 16AF2 */, /*23665*/{0,1888u,6815745u,135802886u,672030728u,1627398160u,1077936140u,788559872u,262144u}/* 16AF3 */, /*23666*/{0,1888u,6815745u,135802886u,672030728u,1627398160u,1077936140u,792754176u,262144u}/* 16AF4 */, /*23667*/{0,1888u,6815745u,69730327u,98344u,1610612768u,5204u,138442754u,41943040u}/* 16AF5 */, /*23668*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864020u,138442752u,393216u}/* 16B00 */, /*23669*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864028u,138442752u,393216u}/* 16B01 */, /*23670*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864036u,138442752u,393216u}/* 16B02 */, /*23671*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864044u,138442752u,393216u}/* 16B03 */, /*23672*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864052u,138442752u,393216u}/* 16B04 */, /*23673*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864060u,138442752u,393216u}/* 16B05 */, /*23674*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864068u,138442752u,393216u}/* 16B06 */, /*23675*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864076u,138442752u,393216u}/* 16B07 */, /*23676*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864084u,138442752u,393216u}/* 16B08 */, /*23677*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864092u,138442752u,393216u}/* 16B09 */, /*23678*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864100u,138442752u,393216u}/* 16B0A */, /*23679*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864108u,138442752u,393216u}/* 16B0B */, /*23680*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864116u,138442752u,393216u}/* 16B0C */, /*23681*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864124u,138442752u,393216u}/* 16B0D */, /*23682*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864132u,138442752u,393216u}/* 16B0E */, /*23683*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864140u,138442752u,393216u}/* 16B0F */, /*23684*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864148u,138442752u,393216u}/* 16B10 */, /*23685*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864156u,138442752u,393216u}/* 16B11 */, /*23686*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864164u,138442752u,393216u}/* 16B12 */, /*23687*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864172u,138442752u,393216u}/* 16B13 */, /*23688*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864180u,138442752u,393216u}/* 16B14 */, /*23689*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864188u,138442752u,393216u}/* 16B15 */, /*23690*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864196u,138442752u,393216u}/* 16B16 */, /*23691*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864204u,138442752u,393216u}/* 16B17 */, /*23692*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864212u,138442752u,393216u}/* 16B18 */, /*23693*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864220u,138442752u,393216u}/* 16B19 */, /*23694*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864228u,138442752u,393216u}/* 16B1A */, /*23695*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864236u,138442752u,393216u}/* 16B1B */, /*23696*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864244u,138442752u,393216u}/* 16B1C */, /*23697*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864252u,138442752u,393216u}/* 16B1D */, /*23698*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864260u,138442752u,393216u}/* 16B1E */, /*23699*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864268u,138442752u,393216u}/* 16B1F */, /*23700*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864276u,138442752u,393216u}/* 16B20 */, /*23701*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864284u,138442752u,393216u}/* 16B21 */, /*23702*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864292u,138442752u,393216u}/* 16B22 */, /*23703*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864300u,138442752u,393216u}/* 16B23 */, /*23704*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864308u,138442752u,393216u}/* 16B24 */, /*23705*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864316u,138442752u,393216u}/* 16B25 */, /*23706*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864324u,138442752u,393216u}/* 16B26 */, /*23707*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864332u,138442752u,393216u}/* 16B27 */, /*23708*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864340u,138442752u,393216u}/* 16B28 */, /*23709*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864348u,138442752u,393216u}/* 16B29 */, /*23710*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864356u,138442752u,393216u}/* 16B2A */, /*23711*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864364u,138442752u,393216u}/* 16B2B */, /*23712*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864372u,138442752u,393216u}/* 16B2C */, /*23713*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864380u,138442752u,393216u}/* 16B2D */, /*23714*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864388u,138442752u,393216u}/* 16B2E */, /*23715*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864396u,138442752u,393216u}/* 16B2F */, /*23716*/{0,1896u,7077889u,3424137222u,672030728u,3774873616u,1077936140u,1031830016u,262144u}/* 16B30 */, /*23717*/{0,1896u,7077889u,3424137222u,672030728u,3774873616u,1077936140u,1036024320u,262144u}/* 16B31 */, /*23718*/{0,1896u,7077889u,3424137222u,672030728u,3774873616u,1077936140u,1040218624u,262144u}/* 16B32 */, /*23719*/{0,1896u,7077889u,3424137222u,672030728u,3774873616u,1077936140u,1044412928u,262144u}/* 16B33 */, /*23720*/{0,1896u,7077889u,3424137222u,672030728u,3774873616u,1077936140u,1048607232u,262144u}/* 16B34 */, /*23721*/{0,1896u,7077889u,3424137222u,672030728u,3774873616u,1077936140u,1052801536u,262144u}/* 16B35 */, /*23722*/{0,1896u,7077889u,3424137222u,672030728u,3774873616u,1077936140u,1056995840u,262144u}/* 16B36 */, /*23723*/{0,1896u,7077889u,69730327u,98344u,1610612768u,9332u,138442754u,41943040u}/* 16B37 */, /*23724*/{0,1896u,7077889u,69730327u,98344u,1610612768u,9340u,138442754u,41943040u}/* 16B38 */, /*23725*/{0,1896u,7077889u,69730327u,40u,1610612768u,9348u,138442754u,8388608u}/* 16B39 */, /*23726*/{0,1896u,7077889u,77070359u,40u,1610612768u,9356u,138442754u,0}/* 16B3A */, /*23727*/{0,1896u,7077889u,77070359u,40u,1610612768u,9364u,138442754u,0}/* 16B3B */, /*23728*/{0,1896u,7077889u,77070363u,40u,1610612768u,32596u,138442752u,67108864u}/* 16B3C */, /*23729*/{0,1896u,7077889u,77070363u,40u,1610612768u,32604u,138442752u,67108864u}/* 16B3D */, /*23730*/{0,1896u,7077889u,77070363u,40u,1610612768u,32612u,138442752u,67108864u}/* 16B3E */, /*23731*/{0,1896u,7077889u,77070363u,40u,1610612768u,32620u,138442752u,67108864u}/* 16B3F */, /*23732*/{0,1896u,7077889u,77070340u,1515560u,3774873632u,1677864404u,138442752u,393216u}/* 16B40 */, /*23733*/{0,1896u,7077889u,77070340u,1515560u,3774873632u,1677864412u,138442752u,393216u}/* 16B41 */, /*23734*/{0,1896u,7077889u,77070340u,1515560u,3774873760u,1677779796u,138442752u,393216u}/* 16B42 */, /*23735*/{0,1896u,7077889u,77070340u,1515560u,3774873760u,1677779804u,138442752u,393216u}/* 16B43 */, /*23736*/{0,1896u,7077889u,69730327u,98344u,1610612768u,9372u,138442754u,41943040u}/* 16B44 */, /*23737*/{0,1896u,7077889u,77070363u,40u,1610612768u,32628u,138442752u,67108864u}/* 16B45 */, /*23738*/{0,1896u,40633345u,85458953u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 16B50 */, /*23739*/{0,1896u,543950337u,85458953u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 16B51 */, /*23740*/{0,1896u,577505793u,85458953u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 16B52 */, /*23741*/{0,1896u,611059713u,85458953u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 16B53 */, /*23742*/{0,1896u,644616193u,85458953u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 16B54 */, /*23743*/{0,1896u,678169601u,85458953u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 16B55 */, /*23744*/{0,1896u,711726593u,85458953u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 16B56 */, /*23745*/{0,1896u,745278977u,85458953u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 16B57 */, /*23746*/{0,1896u,778836993u,85458953u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 16B58 */, /*23747*/{0,1896u,812389377u,85458953u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 16B59 */, /*23748*/{0,1896u,829169665u,77070347u,8388650u,1610612768u,57389u,138442752u,0}/* 16B5B */, /*23749*/{0,1896u,1584165377u,77070347u,8388650u,1610612768u,57397u,138442752u,0}/* 16B5C */, /*23750*/{0,1896u,1886164481u,77070347u,8388650u,1610612768u,57405u,138442752u,0}/* 16B5D */, /*23751*/{0,1896u,2221719041u,77070347u,8388650u,1610612768u,57413u,138442752u,0}/* 16B5E */, /*23752*/{0,1896u,2238496769u,77070347u,8388650u,1610612768u,57421u,138442752u,0}/* 16B5F */, /*23753*/{0,1896u,2255274497u,77070347u,8388650u,1610612768u,57429u,138442752u,0}/* 16B60 */, /*23754*/{0,1896u,2272052225u,77070347u,8388650u,1610612768u,57437u,138442752u,0}/* 16B61 */, /*23755*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864420u,138442752u,393216u}/* 16B63 */, /*23756*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864428u,138442752u,393216u}/* 16B64 */, /*23757*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864436u,138442752u,393216u}/* 16B65 */, /*23758*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864444u,138442752u,393216u}/* 16B66 */, /*23759*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864452u,138442752u,393216u}/* 16B67 */, /*23760*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864460u,138442752u,393216u}/* 16B68 */, /*23761*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864468u,138442752u,393216u}/* 16B69 */, /*23762*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864476u,138442752u,393216u}/* 16B6A */, /*23763*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864484u,138442752u,393216u}/* 16B6B */, /*23764*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864492u,138442752u,393216u}/* 16B6C */, /*23765*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864500u,138442752u,393216u}/* 16B6D */, /*23766*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864508u,138442752u,393216u}/* 16B6E */, /*23767*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864516u,138442752u,393216u}/* 16B6F */, /*23768*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864524u,138442752u,393216u}/* 16B70 */, /*23769*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864532u,138442752u,393216u}/* 16B71 */, /*23770*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864540u,138442752u,393216u}/* 16B72 */, /*23771*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864548u,138442752u,393216u}/* 16B73 */, /*23772*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864556u,138442752u,393216u}/* 16B74 */, /*23773*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864564u,138442752u,393216u}/* 16B75 */, /*23774*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864572u,138442752u,393216u}/* 16B76 */, /*23775*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864580u,138442752u,393216u}/* 16B77 */, /*23776*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864588u,138442752u,393216u}/* 16B7D */, /*23777*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864596u,138442752u,393216u}/* 16B7E */, /*23778*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864604u,138442752u,393216u}/* 16B7F */, /*23779*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864612u,138442752u,393216u}/* 16B80 */, /*23780*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864620u,138442752u,393216u}/* 16B81 */, /*23781*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864628u,138442752u,393216u}/* 16B82 */, /*23782*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864636u,138442752u,393216u}/* 16B83 */, /*23783*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864644u,138442752u,393216u}/* 16B84 */, /*23784*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864652u,138442752u,393216u}/* 16B85 */, /*23785*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864660u,138442752u,393216u}/* 16B86 */, /*23786*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864668u,138442752u,393216u}/* 16B87 */, /*23787*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864676u,138442752u,393216u}/* 16B88 */, /*23788*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864684u,138442752u,393216u}/* 16B89 */, /*23789*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864692u,138442752u,393216u}/* 16B8A */, /*23790*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864700u,138442752u,393216u}/* 16B8B */, /*23791*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864708u,138442752u,393216u}/* 16B8C */, /*23792*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864716u,138442752u,393216u}/* 16B8D */, /*23793*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864724u,138442752u,393216u}/* 16B8E */, /*23794*/{0,1896u,7077889u,77070341u,1515560u,3758096416u,1677864732u,138442752u,393216u}/* 16B8F */, /*23795*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862268u,138442752u,393216u}/* 16F00 */, /*23796*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862276u,138442752u,393216u}/* 16F01 */, /*23797*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862284u,138442752u,393216u}/* 16F02 */, /*23798*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862292u,138442752u,393216u}/* 16F03 */, /*23799*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862300u,138442752u,393216u}/* 16F04 */, /*23800*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862308u,138442752u,393216u}/* 16F05 */, /*23801*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862300u,138459136u,393216u}/* 16F06 */, /*23802*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862316u,138442752u,393216u}/* 16F07 */, /*23803*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862324u,138442752u,393216u}/* 16F08 */, /*23804*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862332u,138442752u,393216u}/* 16F09 */, /*23805*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862340u,138442752u,393216u}/* 16F0A */, /*23806*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862348u,138442752u,393216u}/* 16F0B */, /*23807*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862356u,138442752u,393216u}/* 16F0C */, /*23808*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862364u,138442752u,393216u}/* 16F0D */, /*23809*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862372u,138442752u,393216u}/* 16F0E */, /*23810*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862380u,138442752u,393216u}/* 16F0F */, /*23811*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862388u,138442752u,393216u}/* 16F10 */, /*23812*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862396u,138442752u,393216u}/* 16F11 */, /*23813*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862404u,138442752u,393216u}/* 16F12 */, /*23814*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862388u,138459136u,393216u}/* 16F13 */, /*23815*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862412u,138442752u,393216u}/* 16F14 */, /*23816*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862420u,138442752u,393216u}/* 16F15 */, /*23817*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862428u,138442752u,393216u}/* 16F16 */, /*23818*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862436u,138442752u,393216u}/* 16F17 */, /*23819*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862444u,138442752u,393216u}/* 16F18 */, /*23820*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862452u,138442752u,393216u}/* 16F19 */, /*23821*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862460u,138442752u,393216u}/* 16F1A */, /*23822*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862468u,138442752u,393216u}/* 16F1B */, /*23823*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862476u,138442752u,393216u}/* 16F1C */, /*23824*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862484u,138442752u,393216u}/* 16F1D */, /*23825*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862492u,138442752u,393216u}/* 16F1E */, /*23826*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862500u,138442752u,393216u}/* 16F1F */, /*23827*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862508u,138442752u,393216u}/* 16F20 */, /*23828*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862516u,138442752u,393216u}/* 16F21 */, /*23829*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862524u,138442752u,393216u}/* 16F22 */, /*23830*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862532u,138442752u,393216u}/* 16F23 */, /*23831*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862540u,138442752u,393216u}/* 16F24 */, /*23832*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862532u,138459136u,393216u}/* 16F25 */, /*23833*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862548u,138442752u,393216u}/* 16F26 */, /*23834*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862556u,138442752u,393216u}/* 16F27 */, /*23835*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862564u,138442752u,393216u}/* 16F28 */, /*23836*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862572u,138442752u,393216u}/* 16F29 */, /*23837*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862580u,138442752u,393216u}/* 16F2A */, /*23838*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862588u,138442752u,393216u}/* 16F2B */, /*23839*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862596u,138442752u,393216u}/* 16F2C */, /*23840*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862604u,138442752u,393216u}/* 16F2D */, /*23841*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862612u,138442752u,393216u}/* 16F2E */, /*23842*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862620u,138442752u,393216u}/* 16F2F */, /*23843*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862628u,138442752u,393216u}/* 16F30 */, /*23844*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862636u,138442752u,393216u}/* 16F31 */, /*23845*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862644u,138442752u,393216u}/* 16F32 */, /*23846*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862652u,138442752u,393216u}/* 16F33 */, /*23847*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862660u,138442752u,393216u}/* 16F34 */, /*23848*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862668u,138442752u,393216u}/* 16F35 */, /*23849*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862676u,138442752u,393216u}/* 16F36 */, /*23850*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862684u,138442752u,393216u}/* 16F37 */, /*23851*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862692u,138442752u,393216u}/* 16F38 */, /*23852*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862700u,138442752u,393216u}/* 16F39 */, /*23853*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862708u,138442752u,393216u}/* 16F3A */, /*23854*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862716u,138442752u,393216u}/* 16F3B */, /*23855*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862724u,138442752u,393216u}/* 16F3C */, /*23856*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862732u,138442752u,393216u}/* 16F3D */, /*23857*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862740u,138442752u,393216u}/* 16F3E */, /*23858*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862732u,138459136u,393216u}/* 16F3F */, /*23859*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862748u,138442752u,393216u}/* 16F40 */, /*23860*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862756u,138442752u,393216u}/* 16F41 */, /*23861*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862764u,138442752u,393216u}/* 16F42 */, /*23862*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862772u,138442752u,393216u}/* 16F43 */, /*23863*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862780u,138442752u,393216u}/* 16F44 */, /*23864*/{0,1904u,6488065u,76972037u,1515560u,3758096416u,1677862788u,138442752u,393216u}/* 16F50 */, /*23865*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077324u,138443264u,262144u}/* 16F51 */, /*23866*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077332u,138443264u,262144u}/* 16F52 */, /*23867*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077340u,138443264u,262144u}/* 16F53 */, /*23868*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077348u,138443264u,262144u}/* 16F54 */, /*23869*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077356u,138443264u,262144u}/* 16F55 */, /*23870*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077364u,138443264u,262144u}/* 16F56 */, /*23871*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077372u,138443264u,262144u}/* 16F57 */, /*23872*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077380u,138443264u,262144u}/* 16F58 */, /*23873*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077388u,138443264u,262144u}/* 16F59 */, /*23874*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077396u,138443264u,262144u}/* 16F5A */, /*23875*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077404u,138443264u,262144u}/* 16F5B */, /*23876*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077412u,138443264u,262144u}/* 16F5C */, /*23877*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077420u,138443264u,262144u}/* 16F5D */, /*23878*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077428u,138443264u,262144u}/* 16F5E */, /*23879*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077436u,138443264u,262144u}/* 16F5F */, /*23880*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077444u,138443264u,262144u}/* 16F60 */, /*23881*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077452u,138443264u,262144u}/* 16F61 */, /*23882*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077460u,138443264u,262144u}/* 16F62 */, /*23883*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077468u,138443264u,262144u}/* 16F63 */, /*23884*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077476u,138443264u,262144u}/* 16F64 */, /*23885*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077484u,138443264u,262144u}/* 16F65 */, /*23886*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077492u,138443264u,262144u}/* 16F66 */, /*23887*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077500u,138443264u,262144u}/* 16F67 */, /*23888*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077508u,138443264u,262144u}/* 16F68 */, /*23889*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077516u,138443264u,262144u}/* 16F69 */, /*23890*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077524u,138443264u,262144u}/* 16F6A */, /*23891*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077532u,138443264u,262144u}/* 16F6B */, /*23892*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077540u,138443264u,262144u}/* 16F6C */, /*23893*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077548u,138443264u,262144u}/* 16F6D */, /*23894*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077556u,138443264u,262144u}/* 16F6E */, /*23895*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077564u,138443264u,262144u}/* 16F6F */, /*23896*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077572u,138443264u,262144u}/* 16F70 */, /*23897*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077580u,138443264u,262144u}/* 16F71 */, /*23898*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077588u,138443264u,262144u}/* 16F72 */, /*23899*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077596u,138443264u,262144u}/* 16F73 */, /*23900*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077604u,138443264u,262144u}/* 16F74 */, /*23901*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077612u,138443264u,262144u}/* 16F75 */, /*23902*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077620u,138443264u,262144u}/* 16F76 */, /*23903*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077628u,138443264u,262144u}/* 16F77 */, /*23904*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077636u,138443264u,262144u}/* 16F78 */, /*23905*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077644u,138443264u,262144u}/* 16F79 */, /*23906*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077652u,138443264u,262144u}/* 16F7A */, /*23907*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077660u,138443264u,262144u}/* 16F7B */, /*23908*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077668u,138443264u,262144u}/* 16F7C */, /*23909*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077676u,138443264u,262144u}/* 16F7D */, /*23910*/{0,1904u,6488065u,68583432u,940466184u,3758096416u,1078077684u,138443264u,262144u}/* 16F7E */, /*23911*/{0,1904u,6488065u,68595718u,672030728u,1627398160u,1078077692u,138442752u,262144u}/* 16F8F */, /*23912*/{0,1904u,6488065u,68595718u,672030728u,1627398160u,1078077700u,138442752u,262144u}/* 16F90 */, /*23913*/{0,1904u,6488065u,68595718u,672030728u,1627398160u,1078077708u,138442752u,262144u}/* 16F91 */, /*23914*/{0,1904u,6488065u,68595718u,672030728u,1627398160u,1078077716u,138442752u,262144u}/* 16F92 */, /*23915*/{0,1904u,6488065u,76972036u,1515560u,3774881824u,1677863196u,138442752u,393216u}/* 16F93 */, /*23916*/{0,1904u,6488065u,76972036u,1515560u,3774881824u,1677863204u,138442752u,393216u}/* 16F94 */, /*23917*/{0,1904u,6488065u,76972036u,1515560u,3774881824u,1677863212u,138442752u,393216u}/* 16F95 */, /*23918*/{0,1904u,6488065u,76972036u,1515560u,3774881824u,1677863220u,138442752u,393216u}/* 16F96 */, /*23919*/{0,1904u,6488065u,76972036u,1515560u,3774881824u,1677863228u,138442752u,393216u}/* 16F97 */, /*23920*/{0,1904u,6488065u,76972036u,1515560u,3774881824u,1677863236u,138442752u,393216u}/* 16F98 */, /*23921*/{0,1904u,6488065u,76972036u,1515560u,3774881824u,1677863244u,138442752u,393216u}/* 16F99 */, /*23922*/{0,1904u,6488065u,76972036u,1515560u,3774881824u,1677863252u,138442752u,393216u}/* 16F9A */, /*23923*/{0,1904u,6488065u,76972036u,1515560u,3774881824u,1677863260u,138442752u,393216u}/* 16F9B */, /*23924*/{0,1904u,6488065u,76972036u,1515560u,3774881824u,1677863268u,138442752u,393216u}/* 16F9C */, /*23925*/{0,1904u,6488065u,76972036u,1515560u,3774881824u,1677863276u,138442752u,393216u}/* 16F9D */, /*23926*/{0,1904u,6488065u,76972036u,1515560u,3774881824u,1677863284u,138442752u,393216u}/* 16F9E */, /*23927*/{0,1904u,6488065u,76972036u,1515560u,3774881824u,1677863292u,138442752u,393216u}/* 16F9F */, /*23928*/{0,1915u,8978433u,97058820u,1515560u,3774873760u,1677779828u,138442752u,393216u}/* 16FE0 */, /*23929*/{0,1915u,9109505u,97091588u,1515560u,3774873760u,1677779836u,138442752u,393216u}/* 16FE1 */, /*23930*/{0,1923u,8978433u,103350277u,73768u,3758096416u,1946157060u,6144u,393216u}/* 17000 */, /*23931*/{0,1931u,8978433u,103350277u,73768u,3758096416u,1946157060u,6144u,393216u}/* 18800 */, /*23932*/{0,1939u,2228225u,103153669u,1384488u,3758096416u,1677849516u,138565632u,393216u}/* 1B000 */, /*23933*/{0,1939u,2162689u,103153669u,73768u,3758096416u,1677849988u,138442752u,393216u}/* 1B001 */, /*23934*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677849884u,138442752u,393216u}/* 1B002 */, /*23935*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677849892u,138442752u,393216u}/* 1B003 */, /*23936*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677849900u,138442752u,393216u}/* 1B004 */, /*23937*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677849908u,138442752u,393216u}/* 1B005 */, /*23938*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677849916u,138442752u,393216u}/* 1B006 */, /*23939*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677849924u,138442752u,393216u}/* 1B007 */, /*23940*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677849932u,138442752u,393216u}/* 1B008 */, /*23941*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677849940u,138442752u,393216u}/* 1B009 */, /*23942*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677849948u,138442752u,393216u}/* 1B00A */, /*23943*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677849956u,138442752u,393216u}/* 1B00B */, /*23944*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677849964u,138442752u,393216u}/* 1B00C */, /*23945*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677849972u,138442752u,393216u}/* 1B00D */, /*23946*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677849980u,138442752u,393216u}/* 1B00E */, /*23947*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677849996u,138442752u,393216u}/* 1B00F */, /*23948*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850004u,138442752u,393216u}/* 1B010 */, /*23949*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850012u,138442752u,393216u}/* 1B011 */, /*23950*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850020u,138442752u,393216u}/* 1B012 */, /*23951*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850028u,138442752u,393216u}/* 1B013 */, /*23952*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850036u,138442752u,393216u}/* 1B014 */, /*23953*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850044u,138442752u,393216u}/* 1B015 */, /*23954*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850052u,138442752u,393216u}/* 1B016 */, /*23955*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850060u,138442752u,393216u}/* 1B017 */, /*23956*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850068u,138442752u,393216u}/* 1B018 */, /*23957*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850076u,138442752u,393216u}/* 1B019 */, /*23958*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850084u,138442752u,393216u}/* 1B01A */, /*23959*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850092u,138442752u,393216u}/* 1B01B */, /*23960*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850100u,138442752u,393216u}/* 1B01C */, /*23961*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850108u,138442752u,393216u}/* 1B01D */, /*23962*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850116u,138442752u,393216u}/* 1B01E */, /*23963*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850124u,138442752u,393216u}/* 1B01F */, /*23964*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850132u,138442752u,393216u}/* 1B020 */, /*23965*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850140u,138442752u,393216u}/* 1B021 */, /*23966*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850148u,138442752u,393216u}/* 1B022 */, /*23967*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850156u,138442752u,393216u}/* 1B023 */, /*23968*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850164u,138442752u,393216u}/* 1B024 */, /*23969*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850172u,138442752u,393216u}/* 1B025 */, /*23970*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850180u,138442752u,393216u}/* 1B026 */, /*23971*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850188u,138442752u,393216u}/* 1B027 */, /*23972*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850196u,138442752u,393216u}/* 1B028 */, /*23973*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850204u,138442752u,393216u}/* 1B029 */, /*23974*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850212u,138442752u,393216u}/* 1B02A */, /*23975*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850220u,138442752u,393216u}/* 1B02B */, /*23976*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850228u,138442752u,393216u}/* 1B02C */, /*23977*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850236u,138442752u,393216u}/* 1B02D */, /*23978*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850244u,138442752u,393216u}/* 1B02E */, /*23979*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850252u,138442752u,393216u}/* 1B02F */, /*23980*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850260u,138442752u,393216u}/* 1B030 */, /*23981*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850268u,138442752u,393216u}/* 1B031 */, /*23982*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850276u,138442752u,393216u}/* 1B032 */, /*23983*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850284u,138442752u,393216u}/* 1B033 */, /*23984*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850292u,138442752u,393216u}/* 1B034 */, /*23985*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850300u,138442752u,393216u}/* 1B035 */, /*23986*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850308u,138442752u,393216u}/* 1B036 */, /*23987*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850316u,138442752u,393216u}/* 1B037 */, /*23988*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850324u,138442752u,393216u}/* 1B038 */, /*23989*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850332u,138442752u,393216u}/* 1B039 */, /*23990*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850340u,138442752u,393216u}/* 1B03A */, /*23991*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850348u,138442752u,393216u}/* 1B03B */, /*23992*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850356u,138442752u,393216u}/* 1B03C */, /*23993*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850364u,138442752u,393216u}/* 1B03D */, /*23994*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850372u,138442752u,393216u}/* 1B03E */, /*23995*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850380u,138442752u,393216u}/* 1B03F */, /*23996*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850388u,138442752u,393216u}/* 1B040 */, /*23997*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850396u,138442752u,393216u}/* 1B041 */, /*23998*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850404u,138442752u,393216u}/* 1B042 */, /*23999*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850412u,138442752u,393216u}/* 1B043 */, /*24000*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850420u,138442752u,393216u}/* 1B044 */, /*24001*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850428u,138442752u,393216u}/* 1B045 */, /*24002*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850436u,138442752u,393216u}/* 1B046 */, /*24003*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850444u,138442752u,393216u}/* 1B047 */, /*24004*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850452u,138442752u,393216u}/* 1B048 */, /*24005*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850460u,138442752u,393216u}/* 1B049 */, /*24006*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850468u,138442752u,393216u}/* 1B04A */, /*24007*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850476u,138442752u,393216u}/* 1B04B */, /*24008*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850484u,138442752u,393216u}/* 1B04C */, /*24009*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850492u,138442752u,393216u}/* 1B04D */, /*24010*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850500u,138442752u,393216u}/* 1B04E */, /*24011*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850508u,138442752u,393216u}/* 1B04F */, /*24012*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850516u,138442752u,393216u}/* 1B050 */, /*24013*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850524u,138442752u,393216u}/* 1B051 */, /*24014*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850532u,138442752u,393216u}/* 1B052 */, /*24015*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850540u,138442752u,393216u}/* 1B053 */, /*24016*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850548u,138442752u,393216u}/* 1B054 */, /*24017*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850556u,138442752u,393216u}/* 1B055 */, /*24018*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850564u,138442752u,393216u}/* 1B056 */, /*24019*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850572u,138442752u,393216u}/* 1B057 */, /*24020*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850580u,138442752u,393216u}/* 1B058 */, /*24021*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850588u,138442752u,393216u}/* 1B059 */, /*24022*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850596u,138442752u,393216u}/* 1B05A */, /*24023*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850604u,138442752u,393216u}/* 1B05B */, /*24024*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850612u,138442752u,393216u}/* 1B05C */, /*24025*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850620u,138442752u,393216u}/* 1B05D */, /*24026*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850628u,138442752u,393216u}/* 1B05E */, /*24027*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850636u,138442752u,393216u}/* 1B05F */, /*24028*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850644u,138442752u,393216u}/* 1B060 */, /*24029*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850652u,138442752u,393216u}/* 1B061 */, /*24030*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850660u,138442752u,393216u}/* 1B062 */, /*24031*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850668u,138442752u,393216u}/* 1B063 */, /*24032*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850676u,138442752u,393216u}/* 1B064 */, /*24033*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850684u,138442752u,393216u}/* 1B065 */, /*24034*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850692u,138442752u,393216u}/* 1B066 */, /*24035*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850700u,138442752u,393216u}/* 1B067 */, /*24036*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850708u,138442752u,393216u}/* 1B068 */, /*24037*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850716u,138442752u,393216u}/* 1B069 */, /*24038*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850724u,138442752u,393216u}/* 1B06A */, /*24039*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850732u,138442752u,393216u}/* 1B06B */, /*24040*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850740u,138442752u,393216u}/* 1B06C */, /*24041*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850748u,138442752u,393216u}/* 1B06D */, /*24042*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850756u,138442752u,393216u}/* 1B06E */, /*24043*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850764u,138442752u,393216u}/* 1B06F */, /*24044*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850772u,138442752u,393216u}/* 1B070 */, /*24045*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850780u,138442752u,393216u}/* 1B071 */, /*24046*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850788u,138442752u,393216u}/* 1B072 */, /*24047*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850796u,138442752u,393216u}/* 1B073 */, /*24048*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850804u,138442752u,393216u}/* 1B074 */, /*24049*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850812u,138442752u,393216u}/* 1B075 */, /*24050*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850820u,138442752u,393216u}/* 1B076 */, /*24051*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850828u,138442752u,393216u}/* 1B077 */, /*24052*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850836u,138442752u,393216u}/* 1B078 */, /*24053*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850844u,138442752u,393216u}/* 1B079 */, /*24054*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850852u,138442752u,393216u}/* 1B07A */, /*24055*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850860u,138442752u,393216u}/* 1B07B */, /*24056*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850868u,138442752u,393216u}/* 1B07C */, /*24057*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850876u,138442752u,393216u}/* 1B07D */, /*24058*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850884u,138442752u,393216u}/* 1B07E */, /*24059*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850892u,138442752u,393216u}/* 1B07F */, /*24060*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850900u,138442752u,393216u}/* 1B080 */, /*24061*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850908u,138442752u,393216u}/* 1B081 */, /*24062*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850916u,138442752u,393216u}/* 1B082 */, /*24063*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850924u,138442752u,393216u}/* 1B083 */, /*24064*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850932u,138442752u,393216u}/* 1B084 */, /*24065*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850940u,138442752u,393216u}/* 1B085 */, /*24066*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850948u,138442752u,393216u}/* 1B086 */, /*24067*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850956u,138442752u,393216u}/* 1B087 */, /*24068*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850964u,138442752u,393216u}/* 1B088 */, /*24069*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850972u,138442752u,393216u}/* 1B089 */, /*24070*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850980u,138442752u,393216u}/* 1B08A */, /*24071*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850988u,138442752u,393216u}/* 1B08B */, /*24072*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677850996u,138442752u,393216u}/* 1B08C */, /*24073*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851004u,138442752u,393216u}/* 1B08D */, /*24074*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851012u,138442752u,393216u}/* 1B08E */, /*24075*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851020u,138442752u,393216u}/* 1B08F */, /*24076*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851028u,138442752u,393216u}/* 1B090 */, /*24077*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851036u,138442752u,393216u}/* 1B091 */, /*24078*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851044u,138442752u,393216u}/* 1B092 */, /*24079*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851052u,138442752u,393216u}/* 1B093 */, /*24080*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851060u,138442752u,393216u}/* 1B094 */, /*24081*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851068u,138442752u,393216u}/* 1B095 */, /*24082*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851076u,138442752u,393216u}/* 1B096 */, /*24083*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851084u,138442752u,393216u}/* 1B097 */, /*24084*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851092u,138442752u,393216u}/* 1B098 */, /*24085*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851100u,138442752u,393216u}/* 1B099 */, /*24086*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851108u,138442752u,393216u}/* 1B09A */, /*24087*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851116u,138442752u,393216u}/* 1B09B */, /*24088*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851124u,138442752u,393216u}/* 1B09C */, /*24089*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851132u,138442752u,393216u}/* 1B09D */, /*24090*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851140u,138442752u,393216u}/* 1B09E */, /*24091*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851148u,138442752u,393216u}/* 1B09F */, /*24092*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851156u,138442752u,393216u}/* 1B0A0 */, /*24093*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851164u,138442752u,393216u}/* 1B0A1 */, /*24094*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851172u,138442752u,393216u}/* 1B0A2 */, /*24095*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851180u,138442752u,393216u}/* 1B0A3 */, /*24096*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851188u,138442752u,393216u}/* 1B0A4 */, /*24097*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851196u,138442752u,393216u}/* 1B0A5 */, /*24098*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851204u,138442752u,393216u}/* 1B0A6 */, /*24099*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851212u,138442752u,393216u}/* 1B0A7 */, /*24100*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851220u,138442752u,393216u}/* 1B0A8 */, /*24101*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851228u,138442752u,393216u}/* 1B0A9 */, /*24102*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851236u,138442752u,393216u}/* 1B0AA */, /*24103*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851244u,138442752u,393216u}/* 1B0AB */, /*24104*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851252u,138442752u,393216u}/* 1B0AC */, /*24105*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851260u,138442752u,393216u}/* 1B0AD */, /*24106*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851268u,138442752u,393216u}/* 1B0AE */, /*24107*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851276u,138442752u,393216u}/* 1B0AF */, /*24108*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851284u,138442752u,393216u}/* 1B0B0 */, /*24109*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851292u,138442752u,393216u}/* 1B0B1 */, /*24110*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851300u,138442752u,393216u}/* 1B0B2 */, /*24111*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851308u,138442752u,393216u}/* 1B0B3 */, /*24112*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851316u,138442752u,393216u}/* 1B0B4 */, /*24113*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851324u,138442752u,393216u}/* 1B0B5 */, /*24114*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851332u,138442752u,393216u}/* 1B0B6 */, /*24115*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851340u,138442752u,393216u}/* 1B0B7 */, /*24116*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851348u,138442752u,393216u}/* 1B0B8 */, /*24117*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851356u,138442752u,393216u}/* 1B0B9 */, /*24118*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851364u,138442752u,393216u}/* 1B0BA */, /*24119*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851372u,138442752u,393216u}/* 1B0BB */, /*24120*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851380u,138442752u,393216u}/* 1B0BC */, /*24121*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851388u,138442752u,393216u}/* 1B0BD */, /*24122*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851396u,138442752u,393216u}/* 1B0BE */, /*24123*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851404u,138442752u,393216u}/* 1B0BF */, /*24124*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851412u,138442752u,393216u}/* 1B0C0 */, /*24125*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851420u,138442752u,393216u}/* 1B0C1 */, /*24126*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851428u,138442752u,393216u}/* 1B0C2 */, /*24127*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851436u,138442752u,393216u}/* 1B0C3 */, /*24128*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851444u,138442752u,393216u}/* 1B0C4 */, /*24129*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851452u,138442752u,393216u}/* 1B0C5 */, /*24130*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851460u,138442752u,393216u}/* 1B0C6 */, /*24131*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851468u,138442752u,393216u}/* 1B0C7 */, /*24132*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851476u,138442752u,393216u}/* 1B0C8 */, /*24133*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851484u,138442752u,393216u}/* 1B0C9 */, /*24134*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851492u,138442752u,393216u}/* 1B0CA */, /*24135*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851500u,138442752u,393216u}/* 1B0CB */, /*24136*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851508u,138442752u,393216u}/* 1B0CC */, /*24137*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851516u,138442752u,393216u}/* 1B0CD */, /*24138*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851524u,138442752u,393216u}/* 1B0CE */, /*24139*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851532u,138442752u,393216u}/* 1B0CF */, /*24140*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851540u,138442752u,393216u}/* 1B0D0 */, /*24141*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851548u,138442752u,393216u}/* 1B0D1 */, /*24142*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851556u,138442752u,393216u}/* 1B0D2 */, /*24143*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851564u,138442752u,393216u}/* 1B0D3 */, /*24144*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851572u,138442752u,393216u}/* 1B0D4 */, /*24145*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851580u,138442752u,393216u}/* 1B0D5 */, /*24146*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851588u,138442752u,393216u}/* 1B0D6 */, /*24147*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851596u,138442752u,393216u}/* 1B0D7 */, /*24148*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851604u,138442752u,393216u}/* 1B0D8 */, /*24149*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851612u,138442752u,393216u}/* 1B0D9 */, /*24150*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851620u,138442752u,393216u}/* 1B0DA */, /*24151*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851628u,138442752u,393216u}/* 1B0DB */, /*24152*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851636u,138442752u,393216u}/* 1B0DC */, /*24153*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851644u,138442752u,393216u}/* 1B0DD */, /*24154*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851652u,138442752u,393216u}/* 1B0DE */, /*24155*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851660u,138442752u,393216u}/* 1B0DF */, /*24156*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851668u,138442752u,393216u}/* 1B0E0 */, /*24157*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851676u,138442752u,393216u}/* 1B0E1 */, /*24158*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851684u,138442752u,393216u}/* 1B0E2 */, /*24159*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851692u,138442752u,393216u}/* 1B0E3 */, /*24160*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851700u,138442752u,393216u}/* 1B0E4 */, /*24161*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851708u,138442752u,393216u}/* 1B0E5 */, /*24162*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851716u,138442752u,393216u}/* 1B0E6 */, /*24163*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851724u,138442752u,393216u}/* 1B0E7 */, /*24164*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851732u,138442752u,393216u}/* 1B0E8 */, /*24165*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851740u,138442752u,393216u}/* 1B0E9 */, /*24166*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851748u,138442752u,393216u}/* 1B0EA */, /*24167*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851756u,138442752u,393216u}/* 1B0EB */, /*24168*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851764u,138442752u,393216u}/* 1B0EC */, /*24169*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851772u,138442752u,393216u}/* 1B0ED */, /*24170*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851780u,138442752u,393216u}/* 1B0EE */, /*24171*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851788u,138442752u,393216u}/* 1B0EF */, /*24172*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851796u,138442752u,393216u}/* 1B0F0 */, /*24173*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851804u,138442752u,393216u}/* 1B0F1 */, /*24174*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851812u,138442752u,393216u}/* 1B0F2 */, /*24175*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851820u,138442752u,393216u}/* 1B0F3 */, /*24176*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851828u,138442752u,393216u}/* 1B0F4 */, /*24177*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851836u,138442752u,393216u}/* 1B0F5 */, /*24178*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851844u,138442752u,393216u}/* 1B0F6 */, /*24179*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851852u,138442752u,393216u}/* 1B0F7 */, /*24180*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851860u,138442752u,393216u}/* 1B0F8 */, /*24181*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851868u,138442752u,393216u}/* 1B0F9 */, /*24182*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851876u,138442752u,393216u}/* 1B0FA */, /*24183*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851884u,138442752u,393216u}/* 1B0FB */, /*24184*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851892u,138442752u,393216u}/* 1B0FC */, /*24185*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851900u,138442752u,393216u}/* 1B0FD */, /*24186*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851908u,138442752u,393216u}/* 1B0FE */, /*24187*/{0,1939u,2162689u,103383045u,73768u,3758096416u,1677851916u,138442752u,393216u}/* 1B0FF */, /*24188*/{0,1947u,2162689u,103383045u,73768u,3758096416u,1677851924u,138442752u,393216u}/* 1B100 */, /*24189*/{0,1947u,2162689u,103383045u,73768u,3758096416u,1677851932u,138442752u,393216u}/* 1B101 */, /*24190*/{0,1947u,2162689u,103383045u,73768u,3758096416u,1677851940u,138442752u,393216u}/* 1B102 */, /*24191*/{0,1947u,2162689u,103383045u,73768u,3758096416u,1677851948u,138442752u,393216u}/* 1B103 */, /*24192*/{0,1947u,2162689u,103383045u,73768u,3758096416u,1677851956u,138442752u,393216u}/* 1B104 */, /*24193*/{0,1947u,2162689u,103383045u,73768u,3758096416u,1677851964u,138442752u,393216u}/* 1B105 */, /*24194*/{0,1947u,2162689u,103383045u,73768u,3758096416u,1677851972u,138442752u,393216u}/* 1B106 */, /*24195*/{0,1947u,2162689u,103383045u,73768u,3758096416u,1677851980u,138442752u,393216u}/* 1B107 */, /*24196*/{0,1947u,2162689u,103383045u,73768u,3758096416u,1677851988u,138442752u,393216u}/* 1B108 */, /*24197*/{0,1947u,2162689u,103383045u,73768u,3758096416u,1677851996u,138442752u,393216u}/* 1B109 */, /*24198*/{0,1947u,2162689u,103383045u,73768u,3758096416u,1677852004u,138442752u,393216u}/* 1B10A */, /*24199*/{0,1947u,2162689u,103383045u,73768u,3758096416u,1677852012u,138442752u,393216u}/* 1B10B */, /*24200*/{0,1947u,2162689u,103383045u,73768u,3758096416u,1677852020u,138442752u,393216u}/* 1B10C */, /*24201*/{0,1947u,2162689u,103383045u,73768u,3758096416u,1677852028u,138442752u,393216u}/* 1B10D */, /*24202*/{0,1947u,2162689u,103383045u,73768u,3758096416u,1677852036u,138442752u,393216u}/* 1B10E */, /*24203*/{0,1947u,2162689u,103383045u,73768u,3758096416u,1677852044u,138442752u,393216u}/* 1B10F */, /*24204*/{0,1947u,2162689u,103383045u,73768u,3758096416u,1677852052u,138442752u,393216u}/* 1B110 */, /*24205*/{0,1947u,2162689u,103383045u,73768u,3758096416u,1677852060u,138442752u,393216u}/* 1B111 */, /*24206*/{0,1947u,2162689u,103383045u,73768u,3758096416u,1677852068u,138442752u,393216u}/* 1B112 */, /*24207*/{0,1947u,2162689u,103383045u,73768u,3758096416u,1677852076u,138442752u,393216u}/* 1B113 */, /*24208*/{0,1947u,2162689u,103383045u,73768u,3758096416u,1677852084u,138442752u,393216u}/* 1B114 */, /*24209*/{0,1947u,2162689u,103383045u,73768u,3758096416u,1677852092u,138442752u,393216u}/* 1B115 */, /*24210*/{0,1947u,2162689u,103383045u,73768u,3758096416u,1677852100u,138442752u,393216u}/* 1B116 */, /*24211*/{0,1947u,2162689u,103383045u,73768u,3758096416u,1677852108u,138442752u,393216u}/* 1B117 */, /*24212*/{0,1947u,2162689u,103383045u,73768u,3758096416u,1677852116u,138442752u,393216u}/* 1B118 */, /*24213*/{0,1947u,2162689u,103383045u,73768u,3758096416u,1677852124u,138442752u,393216u}/* 1B119 */, /*24214*/{0,1947u,2162689u,103383045u,73768u,3758096416u,1677852132u,138442752u,393216u}/* 1B11A */, /*24215*/{0,1947u,2162689u,103383045u,73768u,3758096416u,1677852140u,138442752u,393216u}/* 1B11B */, /*24216*/{0,1947u,2162689u,103383045u,73768u,3758096416u,1677852148u,138442752u,393216u}/* 1B11C */, /*24217*/{0,1947u,2162689u,103383045u,73768u,3758096416u,1677852156u,138442752u,393216u}/* 1B11D */, /*24218*/{0,1947u,2162689u,103383045u,73768u,3758096416u,1677852164u,138442752u,393216u}/* 1B11E */, /*24219*/{0,1955u,9109505u,103383045u,73768u,3758096416u,1946157060u,6144u,393216u}/* 1B170 */, /*24220*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677866772u,138442752u,393216u}/* 1BC00 */, /*24221*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677866780u,138442752u,393216u}/* 1BC01 */, /*24222*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677866788u,138442752u,393216u}/* 1BC02 */, /*24223*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677866796u,138442752u,393216u}/* 1BC03 */, /*24224*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677866804u,138442752u,393216u}/* 1BC04 */, /*24225*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677866812u,138442752u,393216u}/* 1BC05 */, /*24226*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677866820u,138442752u,393216u}/* 1BC06 */, /*24227*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677866828u,138442752u,393216u}/* 1BC07 */, /*24228*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677866836u,138442752u,393216u}/* 1BC08 */, /*24229*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677866844u,138442752u,393216u}/* 1BC09 */, /*24230*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677866852u,138442752u,393216u}/* 1BC0A */, /*24231*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677866860u,138442752u,393216u}/* 1BC0B */, /*24232*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677866868u,138442752u,393216u}/* 1BC0C */, /*24233*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677866876u,138442752u,393216u}/* 1BC0D */, /*24234*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677866884u,138442752u,393216u}/* 1BC0E */, /*24235*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677866892u,138442752u,393216u}/* 1BC0F */, /*24236*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677866900u,138442752u,393216u}/* 1BC10 */, /*24237*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677866908u,138442752u,393216u}/* 1BC11 */, /*24238*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677866916u,138442752u,393216u}/* 1BC12 */, /*24239*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677866924u,138442752u,393216u}/* 1BC13 */, /*24240*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677866932u,138442752u,393216u}/* 1BC14 */, /*24241*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677866940u,138442752u,393216u}/* 1BC15 */, /*24242*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677866948u,138442752u,393216u}/* 1BC16 */, /*24243*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677866956u,138442752u,393216u}/* 1BC17 */, /*24244*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677866964u,138442752u,393216u}/* 1BC18 */, /*24245*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677866972u,138442752u,393216u}/* 1BC19 */, /*24246*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677866980u,138442752u,393216u}/* 1BC1A */, /*24247*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677866988u,138442752u,393216u}/* 1BC1B */, /*24248*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677866996u,138442752u,393216u}/* 1BC1C */, /*24249*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867004u,138442752u,393216u}/* 1BC1D */, /*24250*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867012u,138442752u,393216u}/* 1BC1E */, /*24251*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867020u,138442752u,393216u}/* 1BC1F */, /*24252*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867028u,138442752u,393216u}/* 1BC20 */, /*24253*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867036u,138442752u,393216u}/* 1BC21 */, /*24254*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867044u,138442752u,393216u}/* 1BC22 */, /*24255*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867052u,138442752u,393216u}/* 1BC23 */, /*24256*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867060u,138442752u,393216u}/* 1BC24 */, /*24257*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867068u,138442752u,393216u}/* 1BC25 */, /*24258*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867076u,138442752u,393216u}/* 1BC26 */, /*24259*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867084u,138442752u,393216u}/* 1BC27 */, /*24260*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867092u,138442752u,393216u}/* 1BC28 */, /*24261*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867100u,138442752u,393216u}/* 1BC29 */, /*24262*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867108u,138442752u,393216u}/* 1BC2A */, /*24263*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867116u,138442752u,393216u}/* 1BC2B */, /*24264*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867124u,138442752u,393216u}/* 1BC2C */, /*24265*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867132u,138442752u,393216u}/* 1BC2D */, /*24266*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867140u,138442752u,393216u}/* 1BC2E */, /*24267*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867148u,138442752u,393216u}/* 1BC2F */, /*24268*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867156u,138442752u,393216u}/* 1BC30 */, /*24269*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867164u,138442752u,393216u}/* 1BC31 */, /*24270*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867172u,138442752u,393216u}/* 1BC32 */, /*24271*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867180u,138442752u,393216u}/* 1BC33 */, /*24272*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867188u,138442752u,393216u}/* 1BC34 */, /*24273*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867196u,138442752u,393216u}/* 1BC35 */, /*24274*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867204u,138442752u,393216u}/* 1BC36 */, /*24275*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867212u,138442752u,393216u}/* 1BC37 */, /*24276*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867220u,138442752u,393216u}/* 1BC38 */, /*24277*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867228u,138442752u,393216u}/* 1BC39 */, /*24278*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867236u,138442752u,393216u}/* 1BC3A */, /*24279*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867244u,138442752u,393216u}/* 1BC3B */, /*24280*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867252u,138442752u,393216u}/* 1BC3C */, /*24281*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867260u,138442752u,393216u}/* 1BC3D */, /*24282*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867268u,138442752u,393216u}/* 1BC3E */, /*24283*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867276u,138442752u,393216u}/* 1BC3F */, /*24284*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867284u,138442752u,393216u}/* 1BC40 */, /*24285*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867292u,138442752u,393216u}/* 1BC41 */, /*24286*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867300u,138442752u,393216u}/* 1BC42 */, /*24287*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867308u,138442752u,393216u}/* 1BC43 */, /*24288*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867316u,138442752u,393216u}/* 1BC44 */, /*24289*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867324u,138442752u,393216u}/* 1BC45 */, /*24290*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867332u,138442752u,393216u}/* 1BC46 */, /*24291*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867340u,138442752u,393216u}/* 1BC47 */, /*24292*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867348u,138442752u,393216u}/* 1BC48 */, /*24293*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867356u,138442752u,393216u}/* 1BC49 */, /*24294*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867364u,138442752u,393216u}/* 1BC4A */, /*24295*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867372u,138442752u,393216u}/* 1BC4B */, /*24296*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867380u,138442752u,393216u}/* 1BC4C */, /*24297*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867388u,138442752u,393216u}/* 1BC4D */, /*24298*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867396u,138442752u,393216u}/* 1BC4E */, /*24299*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867404u,138442752u,393216u}/* 1BC4F */, /*24300*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867412u,138442752u,393216u}/* 1BC50 */, /*24301*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867420u,138442752u,393216u}/* 1BC51 */, /*24302*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867428u,138442752u,393216u}/* 1BC52 */, /*24303*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867436u,138442752u,393216u}/* 1BC53 */, /*24304*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867444u,138442752u,393216u}/* 1BC54 */, /*24305*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867452u,138442752u,393216u}/* 1BC55 */, /*24306*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867460u,138442752u,393216u}/* 1BC56 */, /*24307*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867468u,138442752u,393216u}/* 1BC57 */, /*24308*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867476u,138442752u,393216u}/* 1BC58 */, /*24309*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867484u,138442752u,393216u}/* 1BC59 */, /*24310*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867492u,138442752u,393216u}/* 1BC5A */, /*24311*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867500u,138442752u,393216u}/* 1BC5B */, /*24312*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867508u,138442752u,393216u}/* 1BC5C */, /*24313*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867516u,138442752u,393216u}/* 1BC5D */, /*24314*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867524u,138442752u,393216u}/* 1BC5E */, /*24315*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867532u,138442752u,393216u}/* 1BC5F */, /*24316*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867540u,138442752u,393216u}/* 1BC60 */, /*24317*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867548u,138442752u,393216u}/* 1BC61 */, /*24318*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867556u,138442752u,393216u}/* 1BC62 */, /*24319*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867564u,138442752u,393216u}/* 1BC63 */, /*24320*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867572u,138442752u,393216u}/* 1BC64 */, /*24321*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867580u,138442752u,393216u}/* 1BC65 */, /*24322*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867588u,138442752u,393216u}/* 1BC66 */, /*24323*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867596u,138442752u,393216u}/* 1BC67 */, /*24324*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867604u,138442752u,393216u}/* 1BC68 */, /*24325*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867612u,138442752u,393216u}/* 1BC69 */, /*24326*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867620u,138442752u,393216u}/* 1BC6A */, /*24327*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867628u,138442752u,393216u}/* 1BC70 */, /*24328*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867636u,138442752u,393216u}/* 1BC71 */, /*24329*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867644u,138442752u,393216u}/* 1BC72 */, /*24330*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867652u,138442752u,393216u}/* 1BC73 */, /*24331*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867660u,138442752u,393216u}/* 1BC74 */, /*24332*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867668u,138442752u,393216u}/* 1BC75 */, /*24333*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867676u,138442752u,393216u}/* 1BC76 */, /*24334*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867684u,138442752u,393216u}/* 1BC77 */, /*24335*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867692u,138442752u,393216u}/* 1BC78 */, /*24336*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867700u,138442752u,393216u}/* 1BC79 */, /*24337*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867708u,138442752u,393216u}/* 1BC7A */, /*24338*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867716u,138442752u,393216u}/* 1BC7B */, /*24339*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867724u,138442752u,393216u}/* 1BC7C */, /*24340*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867732u,138442752u,393216u}/* 1BC80 */, /*24341*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867740u,138442752u,393216u}/* 1BC81 */, /*24342*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867748u,138442752u,393216u}/* 1BC82 */, /*24343*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867756u,138442752u,393216u}/* 1BC83 */, /*24344*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867764u,138442752u,393216u}/* 1BC84 */, /*24345*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867772u,138442752u,393216u}/* 1BC85 */, /*24346*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867780u,138442752u,393216u}/* 1BC86 */, /*24347*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867788u,138442752u,393216u}/* 1BC87 */, /*24348*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867796u,138442752u,393216u}/* 1BC88 */, /*24349*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867804u,138442752u,393216u}/* 1BC90 */, /*24350*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867812u,138442752u,393216u}/* 1BC91 */, /*24351*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867820u,138442752u,393216u}/* 1BC92 */, /*24352*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867828u,138442752u,393216u}/* 1BC93 */, /*24353*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867836u,138442752u,393216u}/* 1BC94 */, /*24354*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867844u,138442752u,393216u}/* 1BC95 */, /*24355*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867852u,138442752u,393216u}/* 1BC96 */, /*24356*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867860u,138442752u,393216u}/* 1BC97 */, /*24357*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867868u,138442752u,393216u}/* 1BC98 */, /*24358*/{0,1960u,6881281u,77070341u,1515560u,3758096416u,1677867876u,138442752u,393216u}/* 1BC99 */, /*24359*/{0,1960u,6881281u,77070363u,40u,1610612768u,36604u,138442752u,67108864u}/* 1BC9C */, /*24360*/{0,1960u,6881281u,68694022u,672030728u,1627389968u,1077936140u,218134528u,262144u}/* 1BC9D */, /*24361*/{0,1960u,6881281u,135802886u,672030728u,3774873616u,1077936140u,226523648u,262144u}/* 1BC9E */, /*24362*/{0,1960u,6881281u,69730327u,98344u,1610612768u,5212u,138442754u,41943040u}/* 1BC9F */, /*24363*/{0,1968u,65537u,68693008u,538091528u,1695055872u,12u,4208640u,0}/* 1BCA0 */, /*24364*/{0,1976u,65537u,76709915u,40u,1610612768u,32636u,138442752u,67108864u}/* 1D000 */, /*24365*/{0,1976u,65537u,76709915u,40u,1610612768u,32644u,138442752u,67108864u}/* 1D001 */, /*24366*/{0,1976u,65537u,76709915u,40u,1610612768u,32652u,138442752u,67108864u}/* 1D002 */, /*24367*/{0,1976u,65537u,76709915u,40u,1610612768u,32660u,138442752u,67108864u}/* 1D003 */, /*24368*/{0,1976u,65537u,76709915u,40u,1610612768u,32668u,138442752u,67108864u}/* 1D004 */, /*24369*/{0,1976u,65537u,76709915u,40u,1610612768u,32676u,138442752u,67108864u}/* 1D005 */, /*24370*/{0,1976u,65537u,76709915u,40u,1610612768u,32684u,138442752u,67108864u}/* 1D006 */, /*24371*/{0,1976u,65537u,76709915u,40u,1610612768u,32692u,138442752u,67108864u}/* 1D007 */, /*24372*/{0,1976u,65537u,76709915u,40u,1610612768u,32700u,138442752u,67108864u}/* 1D008 */, /*24373*/{0,1976u,65537u,76709915u,40u,1610612768u,32708u,138442752u,67108864u}/* 1D009 */, /*24374*/{0,1976u,65537u,76709915u,40u,1610612768u,32716u,138442752u,67108864u}/* 1D00A */, /*24375*/{0,1976u,65537u,76709915u,40u,1610612768u,32724u,138442752u,67108864u}/* 1D00B */, /*24376*/{0,1976u,65537u,76709915u,40u,1610612768u,32732u,138442752u,67108864u}/* 1D00C */, /*24377*/{0,1976u,65537u,76709915u,40u,1610612768u,32740u,138442752u,67108864u}/* 1D00D */, /*24378*/{0,1976u,65537u,76709915u,40u,1610612768u,32748u,138442752u,67108864u}/* 1D00E */, /*24379*/{0,1976u,65537u,76709915u,40u,1610612768u,32756u,138442752u,67108864u}/* 1D00F */, /*24380*/{0,1976u,65537u,76709915u,40u,1610612768u,32764u,138442752u,67108864u}/* 1D010 */, /*24381*/{0,1976u,65537u,76709915u,40u,1610612768u,32772u,138442752u,67108864u}/* 1D011 */, /*24382*/{0,1976u,65537u,76709915u,40u,1610612768u,32780u,138442752u,67108864u}/* 1D012 */, /*24383*/{0,1976u,65537u,76709915u,40u,1610612768u,32788u,138442752u,67108864u}/* 1D013 */, /*24384*/{0,1976u,65537u,76709915u,40u,1610612768u,32796u,138442752u,67108864u}/* 1D014 */, /*24385*/{0,1976u,65537u,76709915u,40u,1610612768u,32804u,138442752u,67108864u}/* 1D015 */, /*24386*/{0,1976u,65537u,76709915u,40u,1610612768u,32812u,138442752u,67108864u}/* 1D016 */, /*24387*/{0,1976u,65537u,76709915u,40u,1610612768u,32820u,138442752u,67108864u}/* 1D017 */, /*24388*/{0,1976u,65537u,76709915u,40u,1610612768u,32828u,138442752u,67108864u}/* 1D018 */, /*24389*/{0,1976u,65537u,76709915u,40u,1610612768u,32836u,138442752u,67108864u}/* 1D019 */, /*24390*/{0,1976u,65537u,76709915u,40u,1610612768u,32844u,138442752u,67108864u}/* 1D01A */, /*24391*/{0,1976u,65537u,76709915u,40u,1610612768u,32852u,138442752u,67108864u}/* 1D01B */, /*24392*/{0,1976u,65537u,76709915u,40u,1610612768u,32860u,138442752u,67108864u}/* 1D01C */, /*24393*/{0,1976u,65537u,76709915u,40u,1610612768u,32868u,138442752u,67108864u}/* 1D01D */, /*24394*/{0,1976u,65537u,76709915u,40u,1610612768u,32876u,138442752u,67108864u}/* 1D01E */, /*24395*/{0,1976u,65537u,76709915u,40u,1610612768u,32884u,138442752u,67108864u}/* 1D01F */, /*24396*/{0,1976u,65537u,76709915u,40u,1610612768u,32892u,138442752u,67108864u}/* 1D020 */, /*24397*/{0,1976u,65537u,76709915u,40u,1610612768u,32900u,138442752u,67108864u}/* 1D021 */, /*24398*/{0,1976u,65537u,76709915u,40u,1610612768u,32908u,138442752u,67108864u}/* 1D022 */, /*24399*/{0,1976u,65537u,76709915u,40u,1610612768u,32916u,138442752u,67108864u}/* 1D023 */, /*24400*/{0,1976u,65537u,76709915u,40u,1610612768u,32924u,138442752u,67108864u}/* 1D024 */, /*24401*/{0,1976u,65537u,76709915u,40u,1610612768u,32932u,138442752u,67108864u}/* 1D025 */, /*24402*/{0,1976u,65537u,76709915u,40u,1610612768u,32940u,138442752u,67108864u}/* 1D026 */, /*24403*/{0,1976u,65537u,76709915u,40u,1610612768u,32948u,138442752u,67108864u}/* 1D027 */, /*24404*/{0,1976u,65537u,76709915u,40u,1610612768u,32956u,138442752u,67108864u}/* 1D028 */, /*24405*/{0,1976u,65537u,76709915u,40u,1610612768u,32964u,138442752u,67108864u}/* 1D029 */, /*24406*/{0,1976u,65537u,76709915u,40u,1610612768u,32972u,138442752u,67108864u}/* 1D02A */, /*24407*/{0,1976u,65537u,76709915u,40u,1610612768u,32980u,138442752u,67108864u}/* 1D02B */, /*24408*/{0,1976u,65537u,76709915u,40u,1610612768u,32988u,138442752u,67108864u}/* 1D02C */, /*24409*/{0,1976u,65537u,76709915u,40u,1610612768u,32996u,138442752u,67108864u}/* 1D02D */, /*24410*/{0,1976u,65537u,76709915u,40u,1610612768u,33004u,138442752u,67108864u}/* 1D02E */, /*24411*/{0,1976u,65537u,76709915u,40u,1610612768u,33012u,138442752u,67108864u}/* 1D02F */, /*24412*/{0,1976u,65537u,76709915u,40u,1610612768u,33020u,138442752u,67108864u}/* 1D030 */, /*24413*/{0,1976u,65537u,76709915u,40u,1610612768u,33028u,138442752u,67108864u}/* 1D031 */, /*24414*/{0,1976u,65537u,76709915u,40u,1610612768u,33036u,138442752u,67108864u}/* 1D032 */, /*24415*/{0,1976u,65537u,76709915u,40u,1610612768u,33044u,138442752u,67108864u}/* 1D033 */, /*24416*/{0,1976u,65537u,76709915u,40u,1610612768u,33052u,138442752u,67108864u}/* 1D034 */, /*24417*/{0,1976u,65537u,76709915u,40u,1610612768u,33060u,138442752u,67108864u}/* 1D035 */, /*24418*/{0,1976u,65537u,76709915u,40u,1610612768u,33068u,138442752u,67108864u}/* 1D036 */, /*24419*/{0,1976u,65537u,76709915u,40u,1610612768u,33076u,138442752u,67108864u}/* 1D037 */, /*24420*/{0,1976u,65537u,76709915u,40u,1610612768u,33084u,138442752u,67108864u}/* 1D038 */, /*24421*/{0,1976u,65537u,76709915u,40u,1610612768u,33092u,138442752u,67108864u}/* 1D039 */, /*24422*/{0,1976u,65537u,76709915u,40u,1610612768u,33100u,138442752u,67108864u}/* 1D03A */, /*24423*/{0,1976u,65537u,76709915u,40u,1610612768u,33108u,138442752u,67108864u}/* 1D03B */, /*24424*/{0,1976u,65537u,76709915u,40u,1610612768u,33116u,138442752u,67108864u}/* 1D03C */, /*24425*/{0,1976u,65537u,76709915u,40u,1610612768u,33124u,138442752u,67108864u}/* 1D03D */, /*24426*/{0,1976u,65537u,76709915u,40u,1610612768u,33132u,138442752u,67108864u}/* 1D03E */, /*24427*/{0,1976u,65537u,76709915u,40u,1610612768u,33140u,138442752u,67108864u}/* 1D03F */, /*24428*/{0,1976u,65537u,76709915u,40u,1610612768u,33148u,138442752u,67108864u}/* 1D040 */, /*24429*/{0,1976u,65537u,76709915u,40u,1610612768u,33156u,138442752u,67108864u}/* 1D041 */, /*24430*/{0,1976u,65537u,76709915u,40u,1610612768u,33164u,138442752u,67108864u}/* 1D042 */, /*24431*/{0,1976u,65537u,76709915u,40u,1610612768u,33172u,138442752u,67108864u}/* 1D043 */, /*24432*/{0,1976u,65537u,76709915u,40u,1610612768u,33180u,138442752u,67108864u}/* 1D044 */, /*24433*/{0,1976u,65537u,76709915u,40u,1610612768u,33188u,138442752u,67108864u}/* 1D045 */, /*24434*/{0,1976u,65537u,76709915u,40u,1610612768u,33196u,138442752u,67108864u}/* 1D046 */, /*24435*/{0,1976u,65537u,76709915u,40u,1610612768u,33204u,138442752u,67108864u}/* 1D047 */, /*24436*/{0,1976u,65537u,76709915u,40u,1610612768u,33212u,138442752u,67108864u}/* 1D048 */, /*24437*/{0,1976u,65537u,76709915u,40u,1610612768u,33220u,138442752u,67108864u}/* 1D049 */, /*24438*/{0,1976u,65537u,76709915u,40u,1610612768u,33228u,138442752u,67108864u}/* 1D04A */, /*24439*/{0,1976u,65537u,76709915u,40u,1610612768u,33236u,138442752u,67108864u}/* 1D04B */, /*24440*/{0,1976u,65537u,76709915u,40u,1610612768u,33244u,138442752u,67108864u}/* 1D04C */, /*24441*/{0,1976u,65537u,76709915u,40u,1610612768u,33252u,138442752u,67108864u}/* 1D04D */, /*24442*/{0,1976u,65537u,76709915u,40u,1610612768u,33260u,138442752u,67108864u}/* 1D04E */, /*24443*/{0,1976u,65537u,76709915u,40u,1610612768u,33268u,138442752u,67108864u}/* 1D04F */, /*24444*/{0,1976u,65537u,76709915u,40u,1610612768u,33276u,138442752u,67108864u}/* 1D050 */, /*24445*/{0,1976u,65537u,76709915u,40u,1610612768u,33284u,138442752u,67108864u}/* 1D051 */, /*24446*/{0,1976u,65537u,76709915u,40u,1610612768u,33292u,138442752u,67108864u}/* 1D052 */, /*24447*/{0,1976u,65537u,76709915u,40u,1610612768u,33300u,138442752u,67108864u}/* 1D053 */, /*24448*/{0,1976u,65537u,76709915u,40u,1610612768u,33308u,138442752u,67108864u}/* 1D054 */, /*24449*/{0,1976u,65537u,76709915u,40u,1610612768u,33316u,138442752u,67108864u}/* 1D055 */, /*24450*/{0,1976u,65537u,76709915u,40u,1610612768u,33324u,138442752u,67108864u}/* 1D056 */, /*24451*/{0,1976u,65537u,76709915u,40u,1610612768u,33332u,138442752u,67108864u}/* 1D057 */, /*24452*/{0,1976u,65537u,76709915u,40u,1610612768u,33340u,138442752u,67108864u}/* 1D058 */, /*24453*/{0,1976u,65537u,76709915u,40u,1610612768u,33348u,138442752u,67108864u}/* 1D059 */, /*24454*/{0,1976u,65537u,76709915u,40u,1610612768u,33356u,138442752u,67108864u}/* 1D05A */, /*24455*/{0,1976u,65537u,76709915u,40u,1610612768u,33364u,138442752u,67108864u}/* 1D05B */, /*24456*/{0,1976u,65537u,76709915u,40u,1610612768u,33372u,138442752u,67108864u}/* 1D05C */, /*24457*/{0,1976u,65537u,76709915u,40u,1610612768u,33380u,138442752u,67108864u}/* 1D05D */, /*24458*/{0,1976u,65537u,76709915u,40u,1610612768u,33388u,138442752u,67108864u}/* 1D05E */, /*24459*/{0,1976u,65537u,76709915u,40u,1610612768u,33396u,138442752u,67108864u}/* 1D05F */, /*24460*/{0,1976u,65537u,76709915u,40u,1610612768u,33404u,138442752u,67108864u}/* 1D060 */, /*24461*/{0,1976u,65537u,76709915u,40u,1610612768u,33412u,138442752u,67108864u}/* 1D061 */, /*24462*/{0,1976u,65537u,76709915u,40u,1610612768u,33420u,138442752u,67108864u}/* 1D062 */, /*24463*/{0,1976u,65537u,76709915u,40u,1610612768u,33428u,138442752u,67108864u}/* 1D063 */, /*24464*/{0,1976u,65537u,76709915u,40u,1610612768u,33436u,138442752u,67108864u}/* 1D064 */, /*24465*/{0,1976u,65537u,76709915u,40u,1610612768u,33444u,138442752u,67108864u}/* 1D065 */, /*24466*/{0,1976u,65537u,76709915u,40u,1610612768u,33452u,138442752u,67108864u}/* 1D066 */, /*24467*/{0,1976u,65537u,76709915u,40u,1610612768u,33460u,138442752u,67108864u}/* 1D067 */, /*24468*/{0,1976u,65537u,76709915u,40u,1610612768u,33468u,138442752u,67108864u}/* 1D068 */, /*24469*/{0,1976u,65537u,76709915u,40u,1610612768u,33476u,138442752u,67108864u}/* 1D069 */, /*24470*/{0,1976u,65537u,76709915u,40u,1610612768u,33484u,138442752u,67108864u}/* 1D06A */, /*24471*/{0,1976u,65537u,76709915u,40u,1610612768u,33492u,138442752u,67108864u}/* 1D06B */, /*24472*/{0,1976u,65537u,76709915u,40u,1610612768u,33500u,138442752u,67108864u}/* 1D06C */, /*24473*/{0,1976u,65537u,76709915u,40u,1610612768u,33508u,138442752u,67108864u}/* 1D06D */, /*24474*/{0,1976u,65537u,76709915u,40u,1610612768u,33516u,138442752u,67108864u}/* 1D06E */, /*24475*/{0,1976u,65537u,76709915u,40u,1610612768u,33524u,138442752u,67108864u}/* 1D06F */, /*24476*/{0,1976u,65537u,76709915u,40u,1610612768u,33532u,138442752u,67108864u}/* 1D070 */, /*24477*/{0,1976u,65537u,76709915u,40u,1610612768u,33540u,138442752u,67108864u}/* 1D071 */, /*24478*/{0,1976u,65537u,76709915u,40u,1610612768u,33548u,138442752u,67108864u}/* 1D072 */, /*24479*/{0,1976u,65537u,76709915u,40u,1610612768u,33556u,138442752u,67108864u}/* 1D073 */, /*24480*/{0,1976u,65537u,76709915u,40u,1610612768u,33564u,138442752u,67108864u}/* 1D074 */, /*24481*/{0,1976u,65537u,76709915u,40u,1610612768u,33572u,138442752u,67108864u}/* 1D075 */, /*24482*/{0,1976u,65537u,76709915u,40u,1610612768u,33580u,138442752u,67108864u}/* 1D076 */, /*24483*/{0,1976u,65537u,76709915u,40u,1610612768u,33588u,138442752u,67108864u}/* 1D077 */, /*24484*/{0,1976u,65537u,76709915u,40u,1610612768u,33596u,138442752u,67108864u}/* 1D078 */, /*24485*/{0,1976u,65537u,76709915u,40u,1610612768u,33604u,138442752u,67108864u}/* 1D079 */, /*24486*/{0,1976u,65537u,76709915u,40u,1610612768u,33612u,138442752u,67108864u}/* 1D07A */, /*24487*/{0,1976u,65537u,76709915u,40u,1610612768u,33620u,138442752u,67108864u}/* 1D07B */, /*24488*/{0,1976u,65537u,76709915u,40u,1610612768u,33628u,138442752u,67108864u}/* 1D07C */, /*24489*/{0,1976u,65537u,76709915u,40u,1610612768u,33636u,138442752u,67108864u}/* 1D07D */, /*24490*/{0,1976u,65537u,76709915u,40u,1610612768u,33644u,138442752u,67108864u}/* 1D07E */, /*24491*/{0,1976u,65537u,76709915u,40u,1610612768u,33652u,138442752u,67108864u}/* 1D07F */, /*24492*/{0,1976u,65537u,76709915u,40u,1610612768u,33660u,138442752u,67108864u}/* 1D080 */, /*24493*/{0,1976u,65537u,76709915u,40u,1610612768u,33668u,138442752u,67108864u}/* 1D081 */, /*24494*/{0,1976u,65537u,76709915u,40u,1610612768u,33676u,138442752u,67108864u}/* 1D082 */, /*24495*/{0,1976u,65537u,76709915u,40u,1610612768u,33684u,138442752u,67108864u}/* 1D083 */, /*24496*/{0,1976u,65537u,76709915u,40u,1610612768u,33692u,138442752u,67108864u}/* 1D084 */, /*24497*/{0,1976u,65537u,76709915u,40u,1610612768u,33700u,138442752u,67108864u}/* 1D085 */, /*24498*/{0,1976u,65537u,76709915u,40u,1610612768u,33708u,138442752u,67108864u}/* 1D086 */, /*24499*/{0,1976u,65537u,76709915u,40u,1610612768u,33716u,138442752u,67108864u}/* 1D087 */, /*24500*/{0,1976u,65537u,76709915u,40u,1610612768u,33724u,138442752u,67108864u}/* 1D088 */, /*24501*/{0,1976u,65537u,76709915u,40u,1610612768u,33732u,138442752u,67108864u}/* 1D089 */, /*24502*/{0,1976u,65537u,76709915u,40u,1610612768u,33740u,138442752u,67108864u}/* 1D08A */, /*24503*/{0,1976u,65537u,76709915u,40u,1610612768u,33748u,138442752u,67108864u}/* 1D08B */, /*24504*/{0,1976u,65537u,76709915u,40u,1610612768u,33756u,138442752u,67108864u}/* 1D08C */, /*24505*/{0,1976u,65537u,76709915u,40u,1610612768u,33764u,138442752u,67108864u}/* 1D08D */, /*24506*/{0,1976u,65537u,76709915u,40u,1610612768u,33772u,138442752u,67108864u}/* 1D08E */, /*24507*/{0,1976u,65537u,76709915u,40u,1610612768u,33780u,138442752u,67108864u}/* 1D08F */, /*24508*/{0,1976u,65537u,76709915u,40u,1610612768u,33788u,138442752u,67108864u}/* 1D090 */, /*24509*/{0,1976u,65537u,76709915u,40u,1610612768u,33796u,138442752u,67108864u}/* 1D091 */, /*24510*/{0,1976u,65537u,76709915u,40u,1610612768u,33804u,138442752u,67108864u}/* 1D092 */, /*24511*/{0,1976u,65537u,76709915u,40u,1610612768u,33812u,138442752u,67108864u}/* 1D093 */, /*24512*/{0,1976u,65537u,76709915u,40u,1610612768u,33820u,138442752u,67108864u}/* 1D094 */, /*24513*/{0,1976u,65537u,76709915u,40u,1610612768u,33828u,138442752u,67108864u}/* 1D095 */, /*24514*/{0,1976u,65537u,76709915u,40u,1610612768u,33836u,138442752u,67108864u}/* 1D096 */, /*24515*/{0,1976u,65537u,76709915u,40u,1610612768u,33844u,138442752u,67108864u}/* 1D097 */, /*24516*/{0,1976u,65537u,76709915u,40u,1610612768u,33852u,138442752u,67108864u}/* 1D098 */, /*24517*/{0,1976u,65537u,76709915u,40u,1610612768u,33860u,138442752u,67108864u}/* 1D099 */, /*24518*/{0,1976u,65537u,76709915u,40u,1610612768u,33868u,138442752u,67108864u}/* 1D09A */, /*24519*/{0,1976u,65537u,76709915u,40u,1610612768u,33876u,138442752u,67108864u}/* 1D09B */, /*24520*/{0,1976u,65537u,76709915u,40u,1610612768u,33884u,138442752u,67108864u}/* 1D09C */, /*24521*/{0,1976u,65537u,76709915u,40u,1610612768u,33892u,138442752u,67108864u}/* 1D09D */, /*24522*/{0,1976u,65537u,76709915u,40u,1610612768u,33900u,138442752u,67108864u}/* 1D09E */, /*24523*/{0,1976u,65537u,76709915u,40u,1610612768u,33908u,138442752u,67108864u}/* 1D09F */, /*24524*/{0,1976u,65537u,76709915u,40u,1610612768u,33916u,138442752u,67108864u}/* 1D0A0 */, /*24525*/{0,1976u,65537u,76709915u,40u,1610612768u,33924u,138442752u,67108864u}/* 1D0A1 */, /*24526*/{0,1976u,65537u,76709915u,40u,1610612768u,33932u,138442752u,67108864u}/* 1D0A2 */, /*24527*/{0,1976u,65537u,76709915u,40u,1610612768u,33940u,138442752u,67108864u}/* 1D0A3 */, /*24528*/{0,1976u,65537u,76709915u,40u,1610612768u,33948u,138442752u,67108864u}/* 1D0A4 */, /*24529*/{0,1976u,65537u,76709915u,40u,1610612768u,33956u,138442752u,67108864u}/* 1D0A5 */, /*24530*/{0,1976u,65537u,76709915u,40u,1610612768u,33964u,138442752u,67108864u}/* 1D0A6 */, /*24531*/{0,1976u,65537u,76709915u,40u,1610612768u,33972u,138442752u,67108864u}/* 1D0A7 */, /*24532*/{0,1976u,65537u,76709915u,40u,1610612768u,33980u,138442752u,67108864u}/* 1D0A8 */, /*24533*/{0,1976u,65537u,76709915u,40u,1610612768u,33988u,138442752u,67108864u}/* 1D0A9 */, /*24534*/{0,1976u,65537u,76709915u,40u,1610612768u,33996u,138442752u,67108864u}/* 1D0AA */, /*24535*/{0,1976u,65537u,76709915u,40u,1610612768u,34004u,138442752u,67108864u}/* 1D0AB */, /*24536*/{0,1976u,65537u,76709915u,40u,1610612768u,34012u,138442752u,67108864u}/* 1D0AC */, /*24537*/{0,1976u,65537u,76709915u,40u,1610612768u,34020u,138442752u,67108864u}/* 1D0AD */, /*24538*/{0,1976u,65537u,76709915u,40u,1610612768u,34028u,138442752u,67108864u}/* 1D0AE */, /*24539*/{0,1976u,65537u,76709915u,40u,1610612768u,34036u,138442752u,67108864u}/* 1D0AF */, /*24540*/{0,1976u,65537u,76709915u,40u,1610612768u,34044u,138442752u,67108864u}/* 1D0B0 */, /*24541*/{0,1976u,65537u,76709915u,40u,1610612768u,34052u,138442752u,67108864u}/* 1D0B1 */, /*24542*/{0,1976u,65537u,76709915u,40u,1610612768u,34060u,138442752u,67108864u}/* 1D0B2 */, /*24543*/{0,1976u,65537u,76709915u,40u,1610612768u,34068u,138442752u,67108864u}/* 1D0B3 */, /*24544*/{0,1976u,65537u,76709915u,40u,1610612768u,34076u,138442752u,67108864u}/* 1D0B4 */, /*24545*/{0,1976u,65537u,76709915u,40u,1610612768u,34084u,138442752u,67108864u}/* 1D0B5 */, /*24546*/{0,1976u,65537u,76709915u,40u,1610612768u,34092u,138442752u,67108864u}/* 1D0B6 */, /*24547*/{0,1976u,65537u,76709915u,40u,1610612768u,34100u,138442752u,67108864u}/* 1D0B7 */, /*24548*/{0,1976u,65537u,76709915u,40u,1610612768u,34108u,138442752u,67108864u}/* 1D0B8 */, /*24549*/{0,1976u,65537u,76709915u,40u,1610612768u,34116u,138442752u,67108864u}/* 1D0B9 */, /*24550*/{0,1976u,65537u,76709915u,40u,1610612768u,34124u,138442752u,67108864u}/* 1D0BA */, /*24551*/{0,1976u,65537u,76709915u,40u,1610612768u,34132u,138442752u,67108864u}/* 1D0BB */, /*24552*/{0,1976u,65537u,76709915u,40u,1610612768u,34140u,138442752u,67108864u}/* 1D0BC */, /*24553*/{0,1976u,65537u,76709915u,40u,1610612768u,34148u,138442752u,67108864u}/* 1D0BD */, /*24554*/{0,1976u,65537u,76709915u,40u,1610612768u,34156u,138442752u,67108864u}/* 1D0BE */, /*24555*/{0,1976u,65537u,76709915u,40u,1610612768u,34164u,138442752u,67108864u}/* 1D0BF */, /*24556*/{0,1976u,65537u,76709915u,40u,1610612768u,34172u,138442752u,67108864u}/* 1D0C0 */, /*24557*/{0,1976u,65537u,76709915u,40u,1610612768u,34180u,138442752u,67108864u}/* 1D0C1 */, /*24558*/{0,1976u,65537u,76709915u,40u,1610612768u,34188u,138442752u,67108864u}/* 1D0C2 */, /*24559*/{0,1976u,65537u,76709915u,40u,1610612768u,34196u,138442752u,67108864u}/* 1D0C3 */, /*24560*/{0,1976u,65537u,76709915u,40u,1610612768u,34204u,138442752u,67108864u}/* 1D0C4 */, /*24561*/{0,1976u,65537u,76709915u,40u,1610612768u,34212u,138442752u,67108864u}/* 1D0C5 */, /*24562*/{0,1976u,65537u,76709915u,40u,1610612768u,34220u,138442752u,67108864u}/* 1D0C6 */, /*24563*/{0,1976u,65537u,76709915u,40u,1610612768u,34228u,138442752u,67108864u}/* 1D0C7 */, /*24564*/{0,1976u,65537u,76709915u,40u,1610612768u,34236u,138442752u,67108864u}/* 1D0C8 */, /*24565*/{0,1976u,65537u,76709915u,40u,1610612768u,34244u,138442752u,67108864u}/* 1D0C9 */, /*24566*/{0,1976u,65537u,76709915u,40u,1610612768u,34252u,138442752u,67108864u}/* 1D0CA */, /*24567*/{0,1976u,65537u,76709915u,40u,1610612768u,34260u,138442752u,67108864u}/* 1D0CB */, /*24568*/{0,1976u,65537u,76709915u,40u,1610612768u,34268u,138442752u,67108864u}/* 1D0CC */, /*24569*/{0,1976u,65537u,76709915u,40u,1610612768u,34276u,138442752u,67108864u}/* 1D0CD */, /*24570*/{0,1976u,65537u,76709915u,40u,1610612768u,34284u,138442752u,67108864u}/* 1D0CE */, /*24571*/{0,1976u,65537u,76709915u,40u,1610612768u,34292u,138442752u,67108864u}/* 1D0CF */, /*24572*/{0,1976u,65537u,76709915u,40u,1610612768u,34300u,138442752u,67108864u}/* 1D0D0 */, /*24573*/{0,1976u,65537u,76709915u,40u,1610612768u,34308u,138442752u,67108864u}/* 1D0D1 */, /*24574*/{0,1976u,65537u,76709915u,40u,1610612768u,34316u,138442752u,67108864u}/* 1D0D2 */, /*24575*/{0,1976u,65537u,76709915u,40u,1610612768u,34324u,138442752u,67108864u}/* 1D0D3 */, /*24576*/{0,1976u,65537u,76709915u,40u,1610612768u,34332u,138442752u,67108864u}/* 1D0D4 */, /*24577*/{0,1976u,65537u,76709915u,40u,1610612768u,34340u,138442752u,67108864u}/* 1D0D5 */, /*24578*/{0,1976u,65537u,76709915u,40u,1610612768u,34348u,138442752u,67108864u}/* 1D0D6 */, /*24579*/{0,1976u,65537u,76709915u,40u,1610612768u,34356u,138442752u,67108864u}/* 1D0D7 */, /*24580*/{0,1976u,65537u,76709915u,40u,1610612768u,34364u,138442752u,67108864u}/* 1D0D8 */, /*24581*/{0,1976u,65537u,76709915u,40u,1610612768u,34372u,138442752u,67108864u}/* 1D0D9 */, /*24582*/{0,1976u,65537u,76709915u,40u,1610612768u,34380u,138442752u,67108864u}/* 1D0DA */, /*24583*/{0,1976u,65537u,76709915u,40u,1610612768u,34388u,138442752u,67108864u}/* 1D0DB */, /*24584*/{0,1976u,65537u,76709915u,40u,1610612768u,34396u,138442752u,67108864u}/* 1D0DC */, /*24585*/{0,1976u,65537u,76709915u,40u,1610612768u,34404u,138442752u,67108864u}/* 1D0DD */, /*24586*/{0,1976u,65537u,76709915u,40u,1610612768u,34412u,138442752u,67108864u}/* 1D0DE */, /*24587*/{0,1976u,65537u,76709915u,40u,1610612768u,34420u,138442752u,67108864u}/* 1D0DF */, /*24588*/{0,1976u,65537u,76709915u,40u,1610612768u,34428u,138442752u,67108864u}/* 1D0E0 */, /*24589*/{0,1976u,65537u,76709915u,40u,1610612768u,34436u,138442752u,67108864u}/* 1D0E1 */, /*24590*/{0,1976u,65537u,76709915u,40u,1610612768u,34444u,138442752u,67108864u}/* 1D0E2 */, /*24591*/{0,1976u,65537u,76709915u,40u,1610612768u,34452u,138442752u,67108864u}/* 1D0E3 */, /*24592*/{0,1976u,65537u,76709915u,40u,1610612768u,34460u,138442752u,67108864u}/* 1D0E4 */, /*24593*/{0,1976u,65537u,76709915u,40u,1610612768u,34468u,138442752u,67108864u}/* 1D0E5 */, /*24594*/{0,1976u,65537u,76709915u,40u,1610612768u,34476u,138442752u,67108864u}/* 1D0E6 */, /*24595*/{0,1976u,65537u,76709915u,40u,1610612768u,34484u,138442752u,67108864u}/* 1D0E7 */, /*24596*/{0,1976u,65537u,76709915u,40u,1610612768u,34492u,138442752u,67108864u}/* 1D0E8 */, /*24597*/{0,1976u,65537u,76709915u,40u,1610612768u,34500u,138442752u,67108864u}/* 1D0E9 */, /*24598*/{0,1976u,65537u,76709915u,40u,1610612768u,34508u,138442752u,67108864u}/* 1D0EA */, /*24599*/{0,1976u,65537u,76709915u,40u,1610612768u,34516u,138442752u,67108864u}/* 1D0EB */, /*24600*/{0,1976u,65537u,76709915u,40u,1610612768u,34524u,138442752u,67108864u}/* 1D0EC */, /*24601*/{0,1976u,65537u,76709915u,40u,1610612768u,34532u,138442752u,67108864u}/* 1D0ED */, /*24602*/{0,1976u,65537u,76709915u,40u,1610612768u,34540u,138442752u,67108864u}/* 1D0EE */, /*24603*/{0,1976u,65537u,76709915u,40u,1610612768u,34548u,138442752u,67108864u}/* 1D0EF */, /*24604*/{0,1976u,65537u,76709915u,40u,1610612768u,34556u,138442752u,67108864u}/* 1D0F0 */, /*24605*/{0,1976u,65537u,76709915u,40u,1610612768u,34564u,138442752u,67108864u}/* 1D0F1 */, /*24606*/{0,1976u,65537u,76709915u,40u,1610612768u,34572u,138442752u,67108864u}/* 1D0F2 */, /*24607*/{0,1976u,65537u,76709915u,40u,1610612768u,34580u,138442752u,67108864u}/* 1D0F3 */, /*24608*/{0,1976u,65537u,76709915u,40u,1610612768u,34588u,138442752u,67108864u}/* 1D0F4 */, /*24609*/{0,1976u,65537u,76709915u,40u,1610612768u,34596u,138442752u,67108864u}/* 1D0F5 */, /*24610*/{0,1984u,65537u,76709915u,40u,1610612768u,34604u,138442752u,67108864u}/* 1D100 */, /*24611*/{0,1984u,65537u,76709915u,40u,1610612768u,34612u,138442752u,67108864u}/* 1D101 */, /*24612*/{0,1984u,65537u,76709915u,40u,1610612768u,34620u,138442752u,67108864u}/* 1D102 */, /*24613*/{0,1984u,65537u,76709915u,40u,1610612768u,34628u,138442752u,67108864u}/* 1D103 */, /*24614*/{0,1984u,65537u,76709915u,40u,1610612768u,34636u,138442752u,67108864u}/* 1D104 */, /*24615*/{0,1984u,65537u,76709915u,40u,1610612768u,34644u,138442752u,67108864u}/* 1D105 */, /*24616*/{0,1984u,65537u,76709915u,40u,1610612768u,34652u,138442752u,67108864u}/* 1D106 */, /*24617*/{0,1984u,65537u,76709915u,40u,1610612768u,34660u,138442752u,67108864u}/* 1D107 */, /*24618*/{0,1984u,65537u,76709915u,40u,1610612768u,34668u,138442752u,67108864u}/* 1D108 */, /*24619*/{0,1984u,65537u,76709915u,40u,1610612768u,34676u,138442752u,67108864u}/* 1D109 */, /*24620*/{0,1984u,65537u,76709915u,40u,1610612768u,34684u,138442752u,67108864u}/* 1D10A */, /*24621*/{0,1984u,65537u,76709915u,40u,1610612768u,34692u,138442752u,67108864u}/* 1D10B */, /*24622*/{0,1984u,65537u,76709915u,40u,1610612768u,34700u,138442752u,67108864u}/* 1D10C */, /*24623*/{0,1984u,65537u,76709915u,40u,1610612768u,34708u,138442752u,67108864u}/* 1D10D */, /*24624*/{0,1984u,65537u,76709915u,40u,1610612768u,34716u,138442752u,67108864u}/* 1D10E */, /*24625*/{0,1984u,65537u,76709915u,40u,1610612768u,34724u,138442752u,67108864u}/* 1D10F */, /*24626*/{0,1984u,65537u,76709915u,40u,1610612768u,34732u,138442752u,67108864u}/* 1D110 */, /*24627*/{0,1984u,65537u,76709915u,40u,1610612768u,34740u,138442752u,67108864u}/* 1D111 */, /*24628*/{0,1984u,65537u,76709915u,40u,1610612768u,34748u,138442752u,67108864u}/* 1D112 */, /*24629*/{0,1984u,65537u,76709915u,40u,1610612768u,34756u,138442752u,67108864u}/* 1D113 */, /*24630*/{0,1984u,65537u,76709915u,40u,1610612768u,34764u,138442752u,67108864u}/* 1D114 */, /*24631*/{0,1984u,65537u,76709915u,40u,1610612768u,34772u,138442752u,67108864u}/* 1D115 */, /*24632*/{0,1984u,65537u,76709915u,40u,1610612768u,34780u,138442752u,67108864u}/* 1D116 */, /*24633*/{0,1984u,65537u,76709915u,40u,1610612768u,34788u,138442752u,67108864u}/* 1D117 */, /*24634*/{0,1984u,65537u,76709915u,40u,1610612768u,34796u,138442752u,67108864u}/* 1D118 */, /*24635*/{0,1984u,65537u,76709915u,40u,1610612768u,34804u,138442752u,67108864u}/* 1D119 */, /*24636*/{0,1984u,65537u,76709915u,40u,1610612768u,34812u,138442752u,67108864u}/* 1D11A */, /*24637*/{0,1984u,65537u,76709915u,40u,1610612768u,34820u,138442752u,67108864u}/* 1D11B */, /*24638*/{0,1984u,65537u,76709915u,40u,1610612768u,34828u,138442752u,67108864u}/* 1D11C */, /*24639*/{0,1984u,65537u,76709915u,40u,1610612768u,34836u,138442752u,67108864u}/* 1D11D */, /*24640*/{0,1984u,65537u,76709915u,40u,1610612768u,34844u,138442752u,67108864u}/* 1D11E */, /*24641*/{0,1984u,65537u,76709915u,40u,1610612768u,34852u,138442752u,67108864u}/* 1D11F */, /*24642*/{0,1984u,65537u,76709915u,40u,1610612768u,34860u,138442752u,67108864u}/* 1D120 */, /*24643*/{0,1984u,65537u,76709915u,40u,1610612768u,34868u,138442752u,67108864u}/* 1D121 */, /*24644*/{0,1984u,65537u,76709915u,40u,1610612768u,34876u,138442752u,67108864u}/* 1D122 */, /*24645*/{0,1984u,65537u,76709915u,40u,1610612768u,34884u,138442752u,67108864u}/* 1D123 */, /*24646*/{0,1984u,65537u,76709915u,40u,1610612768u,34892u,138442752u,67108864u}/* 1D124 */, /*24647*/{0,1984u,65537u,76709915u,40u,1610612768u,34900u,138442752u,67108864u}/* 1D125 */, /*24648*/{0,1984u,65537u,76709915u,40u,1610612768u,34908u,138442752u,67108864u}/* 1D126 */, /*24649*/{0,1984u,65537u,76873755u,40u,1610612768u,35068u,138442752u,67108864u}/* 1D129 */, /*24650*/{0,1984u,65537u,76709915u,40u,1610612768u,34940u,138442752u,67108864u}/* 1D12A */, /*24651*/{0,1984u,65537u,76709915u,40u,1610612768u,34948u,138442752u,67108864u}/* 1D12B */, /*24652*/{0,1984u,65537u,76709915u,40u,1610612768u,34956u,138442752u,67108864u}/* 1D12C */, /*24653*/{0,1984u,65537u,76709915u,40u,1610612768u,34964u,138442752u,67108864u}/* 1D12D */, /*24654*/{0,1984u,65537u,76709915u,40u,1610612768u,34972u,138442752u,67108864u}/* 1D12E */, /*24655*/{0,1984u,65537u,76709915u,40u,1610612768u,34980u,138442752u,67108864u}/* 1D12F */, /*24656*/{0,1984u,65537u,76709915u,40u,1610612768u,34988u,138442752u,67108864u}/* 1D130 */, /*24657*/{0,1984u,65537u,76709915u,40u,1610612768u,34996u,138442752u,67108864u}/* 1D131 */, /*24658*/{0,1984u,65537u,76709915u,40u,1610612768u,35004u,138442752u,67108864u}/* 1D132 */, /*24659*/{0,1984u,65537u,76709915u,40u,1610612768u,35012u,138442752u,67108864u}/* 1D133 */, /*24660*/{0,1984u,65537u,76709915u,40u,1610612768u,35020u,138442752u,67108864u}/* 1D134 */, /*24661*/{0,1984u,65537u,76709915u,40u,1610612768u,35028u,138442752u,67108864u}/* 1D135 */, /*24662*/{0,1984u,65537u,76709915u,40u,1610612768u,35036u,138442752u,67108864u}/* 1D136 */, /*24663*/{0,1984u,65537u,76709915u,40u,1610612768u,35044u,138442752u,67108864u}/* 1D137 */, /*24664*/{0,1984u,65537u,76709915u,40u,1610612768u,35052u,138442752u,67108864u}/* 1D138 */, /*24665*/{0,1984u,65537u,76709915u,40u,1610612768u,35060u,138442752u,67108864u}/* 1D139 */, /*24666*/{0,1984u,65537u,76709915u,40u,1610612768u,35076u,138442752u,67108864u}/* 1D13A */, /*24667*/{0,1984u,65537u,76709915u,40u,1610612768u,35084u,138442752u,67108864u}/* 1D13B */, /*24668*/{0,1984u,65537u,76709915u,40u,1610612768u,35092u,138442752u,67108864u}/* 1D13C */, /*24669*/{0,1984u,65537u,76709915u,40u,1610612768u,35100u,138442752u,67108864u}/* 1D13D */, /*24670*/{0,1984u,65537u,76709915u,40u,1610612768u,35108u,138442752u,67108864u}/* 1D13E */, /*24671*/{0,1984u,65537u,76709915u,40u,1610612768u,35116u,138442752u,67108864u}/* 1D13F */, /*24672*/{0,1984u,65537u,76709915u,40u,1610612768u,35124u,138442752u,67108864u}/* 1D140 */, /*24673*/{0,1984u,65537u,76709915u,40u,1610612768u,35132u,138442752u,67108864u}/* 1D141 */, /*24674*/{0,1984u,65537u,76709915u,40u,1610612768u,35140u,138442752u,67108864u}/* 1D142 */, /*24675*/{0,1984u,65537u,76709915u,40u,1610612768u,35148u,138442752u,67108864u}/* 1D143 */, /*24676*/{0,1984u,65537u,76709915u,40u,1610612768u,35156u,138442752u,67108864u}/* 1D144 */, /*24677*/{0,1984u,65537u,76709915u,40u,1610612768u,35164u,138442752u,67108864u}/* 1D145 */, /*24678*/{0,1984u,65537u,76709915u,40u,1610612768u,35172u,138442752u,67108864u}/* 1D146 */, /*24679*/{0,1984u,65537u,76709915u,40u,1610612768u,35180u,138442752u,67108864u}/* 1D147 */, /*24680*/{0,1984u,65537u,76709915u,40u,1610612768u,35188u,138442752u,67108864u}/* 1D148 */, /*24681*/{0,1984u,65537u,76709915u,40u,1610612768u,35196u,138442752u,67108864u}/* 1D149 */, /*24682*/{0,1984u,65537u,76709915u,40u,1610612768u,35204u,138442752u,67108864u}/* 1D14A */, /*24683*/{0,1984u,65537u,76709915u,40u,1610612768u,35212u,138442752u,67108864u}/* 1D14B */, /*24684*/{0,1984u,65537u,76709915u,40u,1610612768u,35220u,138442752u,67108864u}/* 1D14C */, /*24685*/{0,1984u,65537u,76709915u,40u,1610612768u,35228u,138442752u,67108864u}/* 1D14D */, /*24686*/{0,1984u,65537u,76709915u,40u,1610612768u,35236u,138442752u,67108864u}/* 1D14E */, /*24687*/{0,1984u,65537u,76709915u,40u,1610612768u,35244u,138442752u,67108864u}/* 1D14F */, /*24688*/{0,1984u,65537u,76709915u,40u,1610612768u,35252u,138442752u,67108864u}/* 1D150 */, /*24689*/{0,1984u,65537u,76709915u,40u,1610612768u,35260u,138442752u,67108864u}/* 1D151 */, /*24690*/{0,1984u,65537u,76709915u,40u,1610612768u,35268u,138442752u,67108864u}/* 1D152 */, /*24691*/{0,1984u,65537u,76709915u,40u,1610612768u,35276u,138442752u,67108864u}/* 1D153 */, /*24692*/{0,1984u,65537u,76709915u,40u,1610612768u,35284u,138442752u,67108864u}/* 1D154 */, /*24693*/{0,1984u,65537u,76709915u,40u,1610612768u,35292u,138442752u,67108864u}/* 1D155 */, /*24694*/{0,1984u,65537u,76709915u,40u,1610612768u,35300u,138442752u,67108864u}/* 1D156 */, /*24695*/{0,1984u,65537u,76709915u,40u,1610612768u,35308u,138442752u,67108864u}/* 1D157 */, /*24696*/{0,1984u,65537u,76709915u,40u,1610612768u,35316u,138442752u,67108864u}/* 1D158 */, /*24697*/{0,1984u,65537u,76709915u,40u,1610612768u,35324u,138442752u,67108864u}/* 1D159 */, /*24698*/{0,1984u,65537u,76709915u,40u,1610612768u,35332u,138442752u,67108864u}/* 1D15A */, /*24699*/{0,1984u,65537u,76709915u,40u,1610612768u,35340u,138442752u,67108864u}/* 1D15B */, /*24700*/{0,1984u,65537u,76709915u,40u,1610612768u,35348u,138442752u,67108864u}/* 1D15C */, /*24701*/{0,1984u,65537u,76709915u,40u,1610612768u,35356u,138442752u,67108864u}/* 1D15D */, /*24702*/{2042626048u,1984u,65536u,76709947u,0u,1611137120u,35308u,138436608u,67108864u}/* 1D15E */, /*24703*/{2043150336u,1984u,65536u,76709947u,0u,1611137120u,35316u,138436608u,67108864u}/* 1D15F */, /*24704*/{2043674624u,1984u,65536u,76709947u,0u,1611137120u,35316u,138436608u,67108864u}/* 1D160 */, /*24705*/{2044198912u,1984u,65536u,76709947u,0u,1611137120u,35316u,138436608u,67108864u}/* 1D161 */, /*24706*/{2044723200u,1984u,65536u,76709947u,0u,1611137120u,35316u,138436608u,67108864u}/* 1D162 */, /*24707*/{2045247488u,1984u,65536u,76709947u,0u,1611137120u,35316u,138436608u,67108864u}/* 1D163 */, /*24708*/{2045771776u,1984u,65536u,76709947u,0u,1611137120u,35316u,138436608u,67108864u}/* 1D164 */, /*24709*/{0,1984u,65537u,2954002440u,672030728u,1610612752u,1077936140u,4208768u,262144u}/* 1D165 */, /*24710*/{0,1984u,65537u,2954002440u,940466184u,1610612768u,1077936140u,4208640u,262144u}/* 1D166 */, /*24711*/{0,1984u,2686977u,135442438u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* 1D167 */, /*24712*/{0,1984u,65537u,76709915u,40u,1610612768u,35364u,138442752u,67108864u}/* 1D16A */, /*24713*/{0,1984u,65537u,76709915u,40u,1610612768u,35372u,138442752u,67108864u}/* 1D16B */, /*24714*/{0,1984u,65537u,76709915u,40u,1610612768u,35380u,138442752u,67108864u}/* 1D16C */, /*24715*/{0,1984u,65537u,3289546760u,940466184u,1610620960u,1077936140u,4208640u,262144u}/* 1D16D */, /*24716*/{0,1984u,65537u,2954002440u,672030728u,1610620944u,1077936140u,4208768u,262144u}/* 1D16E */, /*24717*/{0,1984u,65537u,68332560u,538091528u,1695055872u,12u,4208640u,0}/* 1D173 */, /*24718*/{0,1984u,2686977u,3088232454u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* 1D17B */, /*24719*/{0,1984u,65537u,76709915u,40u,1610612768u,35388u,138442752u,67108864u}/* 1D183 */, /*24720*/{0,1984u,65537u,76709915u,40u,1610612768u,35396u,138442752u,67108864u}/* 1D184 */, /*24721*/{0,1984u,2686977u,3423776774u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* 1D185 */, /*24722*/{0,1984u,65537u,76709915u,40u,1610612768u,35404u,138442752u,67108864u}/* 1D18C */, /*24723*/{0,1984u,65537u,76709915u,40u,1610612768u,35412u,138442752u,67108864u}/* 1D18D */, /*24724*/{0,1984u,65537u,76709915u,40u,1610612768u,35420u,138442752u,67108864u}/* 1D18E */, /*24725*/{0,1984u,65537u,76709915u,40u,1610612768u,35428u,138442752u,67108864u}/* 1D18F */, /*24726*/{0,1984u,65537u,76709915u,40u,1610612768u,35436u,138442752u,67108864u}/* 1D190 */, /*24727*/{0,1984u,65537u,76709915u,40u,1610612768u,35444u,138442752u,67108864u}/* 1D191 */, /*24728*/{0,1984u,65537u,76709915u,40u,1610612768u,35452u,138442752u,67108864u}/* 1D192 */, /*24729*/{0,1984u,65537u,76709915u,40u,1610612768u,35460u,138442752u,67108864u}/* 1D193 */, /*24730*/{0,1984u,65537u,76709915u,40u,1610612768u,35468u,138442752u,67108864u}/* 1D194 */, /*24731*/{0,1984u,65537u,76709915u,40u,1610612768u,35476u,138442752u,67108864u}/* 1D195 */, /*24732*/{0,1984u,65537u,76709915u,40u,1610612768u,35484u,138442752u,67108864u}/* 1D196 */, /*24733*/{0,1984u,65537u,76709915u,40u,1610612768u,35492u,138442752u,67108864u}/* 1D197 */, /*24734*/{0,1984u,65537u,76709915u,40u,1610612768u,35500u,138442752u,67108864u}/* 1D198 */, /*24735*/{0,1984u,65537u,76709915u,40u,1610612768u,35508u,138442752u,67108864u}/* 1D199 */, /*24736*/{0,1984u,65537u,76709915u,40u,1610612768u,35516u,138442752u,67108864u}/* 1D19A */, /*24737*/{0,1984u,65537u,76709915u,40u,1610612768u,35524u,138442752u,67108864u}/* 1D19B */, /*24738*/{0,1984u,65537u,76709915u,40u,1610612768u,35532u,138442752u,67108864u}/* 1D19C */, /*24739*/{0,1984u,65537u,76709915u,40u,1610612768u,35540u,138442752u,67108864u}/* 1D19D */, /*24740*/{0,1984u,65537u,76709915u,40u,1610612768u,35548u,138442752u,67108864u}/* 1D19E */, /*24741*/{0,1984u,65537u,76709915u,40u,1610612768u,35556u,138442752u,67108864u}/* 1D19F */, /*24742*/{0,1984u,65537u,76709915u,40u,1610612768u,35564u,138442752u,67108864u}/* 1D1A0 */, /*24743*/{0,1984u,65537u,76709915u,40u,1610612768u,35572u,138442752u,67108864u}/* 1D1A1 */, /*24744*/{0,1984u,65537u,76709915u,40u,1610612768u,35580u,138442752u,67108864u}/* 1D1A2 */, /*24745*/{0,1984u,65537u,76709915u,40u,1610612768u,35588u,138442752u,67108864u}/* 1D1A3 */, /*24746*/{0,1984u,65537u,76709915u,40u,1610612768u,35596u,138442752u,67108864u}/* 1D1A4 */, /*24747*/{0,1984u,65537u,76709915u,40u,1610612768u,35604u,138442752u,67108864u}/* 1D1A5 */, /*24748*/{0,1984u,65537u,76709915u,40u,1610612768u,35612u,138442752u,67108864u}/* 1D1A6 */, /*24749*/{0,1984u,65537u,76709915u,40u,1610612768u,35620u,138442752u,67108864u}/* 1D1A7 */, /*24750*/{0,1984u,65537u,76709915u,40u,1610612768u,35628u,138442752u,67108864u}/* 1D1A8 */, /*24751*/{0,1984u,65537u,76709915u,40u,1610612768u,35636u,138442752u,67108864u}/* 1D1A9 */, /*24752*/{0,1984u,65537u,76709915u,40u,1610612768u,35644u,138442752u,67108864u}/* 1D1AE */, /*24753*/{0,1984u,65537u,76709915u,40u,1610612768u,35652u,138442752u,67108864u}/* 1D1AF */, /*24754*/{0,1984u,65537u,76709915u,40u,1610612768u,35660u,138442752u,67108864u}/* 1D1B0 */, /*24755*/{0,1984u,65537u,76709915u,40u,1610612768u,35668u,138442752u,67108864u}/* 1D1B1 */, /*24756*/{0,1984u,65537u,76709915u,40u,1610612768u,35676u,138442752u,67108864u}/* 1D1B2 */, /*24757*/{0,1984u,65537u,76709915u,40u,1610612768u,35684u,138442752u,67108864u}/* 1D1B3 */, /*24758*/{0,1984u,65537u,76709915u,40u,1610612768u,35692u,138442752u,67108864u}/* 1D1B4 */, /*24759*/{0,1984u,65537u,76709915u,40u,1610612768u,35700u,138442752u,67108864u}/* 1D1B5 */, /*24760*/{0,1984u,65537u,76709915u,40u,1610612768u,35708u,138442752u,67108864u}/* 1D1B6 */, /*24761*/{0,1984u,65537u,76709915u,40u,1610612768u,35716u,138442752u,67108864u}/* 1D1B7 */, /*24762*/{0,1984u,65537u,76709915u,40u,1610612768u,35724u,138442752u,67108864u}/* 1D1B8 */, /*24763*/{0,1984u,65537u,76709915u,40u,1610612768u,35732u,138442752u,67108864u}/* 1D1B9 */, /*24764*/{0,1984u,65537u,76709915u,40u,1610612768u,35740u,138442752u,67108864u}/* 1D1BA */, /*24765*/{2046296064u,1984u,65536u,76709947u,0u,1611137120u,35732u,138436608u,67108864u}/* 1D1BB */, /*24766*/{2046820352u,1984u,65536u,76709947u,0u,1611137120u,35740u,138436608u,67108864u}/* 1D1BC */, /*24767*/{2047344640u,1984u,65536u,76709947u,0u,1611137120u,35732u,138436608u,67108864u}/* 1D1BD */, /*24768*/{2047868928u,1984u,65536u,76709947u,0u,1611137120u,35740u,138436608u,67108864u}/* 1D1BE */, /*24769*/{2048393216u,1984u,65536u,76709947u,0u,1611137120u,35732u,138436608u,67108864u}/* 1D1BF */, /*24770*/{2048917504u,1984u,65536u,76709947u,0u,1611137120u,35740u,138436608u,67108864u}/* 1D1C0 */, /*24771*/{0,1984u,65537u,76709915u,40u,1610612768u,35748u,138442752u,67108864u}/* 1D1C1 */, /*24772*/{0,1984u,65537u,76709915u,40u,1610612768u,35756u,138442752u,67108864u}/* 1D1C2 */, /*24773*/{0,1984u,65537u,76709915u,40u,1610612768u,35764u,138442752u,67108864u}/* 1D1C3 */, /*24774*/{0,1984u,65537u,76709915u,40u,1610612768u,35772u,138442752u,67108864u}/* 1D1C4 */, /*24775*/{0,1984u,65537u,76709915u,40u,1610612768u,35780u,138442752u,67108864u}/* 1D1C5 */, /*24776*/{0,1984u,65537u,76709915u,40u,1610612768u,35788u,138442752u,67108864u}/* 1D1C6 */, /*24777*/{0,1984u,65537u,76709915u,40u,1610612768u,35796u,138442752u,67108864u}/* 1D1C7 */, /*24778*/{0,1984u,65537u,76709915u,40u,1610612768u,35804u,138442752u,67108864u}/* 1D1C8 */, /*24779*/{0,1984u,65537u,76709915u,40u,1610612768u,35812u,138442752u,67108864u}/* 1D1C9 */, /*24780*/{0,1984u,65537u,76709915u,40u,1610612768u,35820u,138442752u,67108864u}/* 1D1CA */, /*24781*/{0,1984u,65537u,76709915u,40u,1610612768u,35828u,138442752u,67108864u}/* 1D1CB */, /*24782*/{0,1984u,65537u,76709915u,40u,1610612768u,35836u,138442752u,67108864u}/* 1D1CC */, /*24783*/{0,1984u,65537u,76709915u,40u,1610612768u,35844u,138442752u,67108864u}/* 1D1CD */, /*24784*/{0,1984u,65537u,76709915u,40u,1610612768u,35852u,138442752u,67108864u}/* 1D1CE */, /*24785*/{0,1984u,65537u,76709915u,40u,1610612768u,35860u,138442752u,67108864u}/* 1D1CF */, /*24786*/{0,1984u,65537u,76709915u,40u,1610612768u,35868u,138442752u,67108864u}/* 1D1D0 */, /*24787*/{0,1984u,65537u,76709915u,40u,1610612768u,35876u,138442752u,67108864u}/* 1D1D1 */, /*24788*/{0,1984u,65537u,76709915u,40u,1610612768u,35884u,138442752u,67108864u}/* 1D1D2 */, /*24789*/{0,1984u,65537u,76709915u,40u,1610612768u,35892u,138442752u,67108864u}/* 1D1D3 */, /*24790*/{0,1984u,65537u,76709915u,40u,1610612768u,35900u,138442752u,67108864u}/* 1D1D4 */, /*24791*/{0,1984u,65537u,76709915u,40u,1610612768u,35908u,138442752u,67108864u}/* 1D1D5 */, /*24792*/{0,1984u,65537u,76709915u,40u,1610612768u,35916u,138442752u,67108864u}/* 1D1D6 */, /*24793*/{0,1984u,65537u,76709915u,40u,1610612768u,35924u,138442752u,67108864u}/* 1D1D7 */, /*24794*/{0,1984u,65537u,76709915u,40u,1610612768u,35932u,138442752u,67108864u}/* 1D1D8 */, /*24795*/{0,1984u,65537u,76709915u,40u,1610612768u,35940u,138442752u,67108864u}/* 1D1D9 */, /*24796*/{0,1984u,65537u,76709915u,40u,1610612768u,35948u,138442752u,67108864u}/* 1D1DA */, /*24797*/{0,1984u,65537u,76709915u,40u,1610612768u,35956u,138442752u,67108864u}/* 1D1DB */, /*24798*/{0,1984u,65537u,76709915u,40u,1610612768u,35964u,138442752u,67108864u}/* 1D1DC */, /*24799*/{0,1984u,65537u,76709915u,40u,1610612768u,35972u,138442752u,67108864u}/* 1D1DD */, /*24800*/{0,1984u,65537u,77103131u,40u,1610612768u,35980u,138442752u,67108864u}/* 1D1DE */, /*24801*/{0,1984u,65537u,77103131u,40u,1610612768u,35988u,138442752u,67108864u}/* 1D1DF */, /*24802*/{0,1984u,65537u,77103131u,40u,1610612768u,35996u,138442752u,67108864u}/* 1D1E0 */, /*24803*/{0,1984u,65537u,77103131u,40u,1610612768u,36004u,138442752u,67108864u}/* 1D1E1 */, /*24804*/{0,1984u,65537u,77103131u,40u,1610612768u,36012u,138442752u,67108864u}/* 1D1E2 */, /*24805*/{0,1984u,65537u,77103131u,40u,1610612768u,36020u,138442752u,67108864u}/* 1D1E3 */, /*24806*/{0,1984u,65537u,77103131u,40u,1610612768u,36028u,138442752u,67108864u}/* 1D1E4 */, /*24807*/{0,1984u,65537u,77103131u,40u,1610612768u,36036u,138442752u,67108864u}/* 1D1E5 */, /*24808*/{0,1984u,65537u,77103131u,40u,1610612768u,36044u,138442752u,67108864u}/* 1D1E6 */, /*24809*/{0,1984u,65537u,77103131u,40u,1610612768u,36052u,138442752u,67108864u}/* 1D1E7 */, /*24810*/{0,1984u,65537u,77103131u,40u,1610612768u,36060u,138442752u,67108864u}/* 1D1E8 */, /*24811*/{0,1992u,196609u,76818459u,40u,1610612768u,36068u,138442752u,67108864u}/* 1D200 */, /*24812*/{0,1992u,196609u,76818459u,40u,1610612768u,36076u,138442752u,67108864u}/* 1D201 */, /*24813*/{0,1992u,196609u,76818459u,40u,1610612768u,36084u,138442752u,67108864u}/* 1D202 */, /*24814*/{0,1992u,196609u,76818459u,40u,1610612768u,36092u,138442752u,67108864u}/* 1D203 */, /*24815*/{0,1992u,196609u,76818459u,40u,1610612768u,36100u,138442752u,67108864u}/* 1D204 */, /*24816*/{0,1992u,196609u,76818459u,40u,1610612768u,36108u,138442752u,67108864u}/* 1D205 */, /*24817*/{0,1992u,196609u,76818459u,40u,1610612768u,36116u,138442752u,67108864u}/* 1D206 */, /*24818*/{0,1992u,196609u,76818459u,40u,1610612768u,36124u,138442752u,67108864u}/* 1D207 */, /*24819*/{0,1992u,196609u,76818459u,40u,1610612768u,36132u,138442752u,67108864u}/* 1D208 */, /*24820*/{0,1992u,196609u,76818459u,40u,1610612768u,36140u,138442752u,67108864u}/* 1D209 */, /*24821*/{0,1992u,196609u,76818459u,40u,1610612768u,36148u,138442752u,67108864u}/* 1D20A */, /*24822*/{0,1992u,196609u,76818459u,40u,1610612768u,36156u,138442752u,67108864u}/* 1D20B */, /*24823*/{0,1992u,196609u,76818459u,40u,1610612768u,36164u,138442752u,67108864u}/* 1D20C */, /*24824*/{0,1992u,196609u,76818459u,40u,1610612768u,36172u,138442752u,67108864u}/* 1D20D */, /*24825*/{0,1992u,196609u,76818459u,40u,1610612768u,36180u,138442752u,67108864u}/* 1D20E */, /*24826*/{0,1992u,196609u,76818459u,40u,1610612768u,36188u,138442752u,67108864u}/* 1D20F */, /*24827*/{0,1992u,196609u,76818459u,40u,1610612768u,36196u,138442752u,67108864u}/* 1D210 */, /*24828*/{0,1992u,196609u,76818459u,40u,1610612768u,36204u,138442752u,67108864u}/* 1D211 */, /*24829*/{0,1992u,196609u,76818459u,40u,1610612768u,36212u,138442752u,67108864u}/* 1D212 */, /*24830*/{0,1992u,196609u,76818459u,40u,1610612768u,36220u,138442752u,67108864u}/* 1D213 */, /*24831*/{0,1992u,196609u,76818459u,40u,1610612768u,36228u,138442752u,67108864u}/* 1D214 */, /*24832*/{0,1992u,196609u,76818459u,40u,1610612768u,36236u,138442752u,67108864u}/* 1D215 */, /*24833*/{0,1992u,196609u,76818459u,40u,1610612768u,36244u,138442752u,67108864u}/* 1D216 */, /*24834*/{0,1992u,196609u,76818459u,40u,1610612768u,36252u,138442752u,67108864u}/* 1D217 */, /*24835*/{0,1992u,196609u,76818459u,40u,1610612768u,36260u,138442752u,67108864u}/* 1D218 */, /*24836*/{0,1992u,196609u,76818459u,40u,1610612768u,36268u,138442752u,67108864u}/* 1D219 */, /*24837*/{0,1992u,196609u,76818459u,40u,1610612768u,36276u,138442752u,67108864u}/* 1D21A */, /*24838*/{0,1992u,196609u,76818459u,40u,1610612768u,36284u,138442752u,67108864u}/* 1D21B */, /*24839*/{0,1992u,196609u,76818459u,40u,1610612768u,36292u,138442752u,67108864u}/* 1D21C */, /*24840*/{0,1992u,196609u,76818459u,40u,1610612768u,36300u,138442752u,67108864u}/* 1D21D */, /*24841*/{0,1992u,196609u,76818459u,40u,1610612768u,36308u,138442752u,67108864u}/* 1D21E */, /*24842*/{0,1992u,196609u,76818459u,40u,1610612768u,36316u,138442752u,67108864u}/* 1D21F */, /*24843*/{0,1992u,196609u,76818459u,40u,1610612768u,36324u,138442752u,67108864u}/* 1D220 */, /*24844*/{0,1992u,196609u,76818459u,40u,1610612768u,36332u,138442752u,67108864u}/* 1D221 */, /*24845*/{0,1992u,196609u,76818459u,40u,1610612768u,36340u,138442752u,67108864u}/* 1D222 */, /*24846*/{0,1992u,196609u,76818459u,40u,1610612768u,36348u,138442752u,67108864u}/* 1D223 */, /*24847*/{0,1992u,196609u,76818459u,40u,1610612768u,36356u,138442752u,67108864u}/* 1D224 */, /*24848*/{0,1992u,196609u,76818459u,40u,1610612768u,36364u,138442752u,67108864u}/* 1D225 */, /*24849*/{0,1992u,196609u,76818459u,40u,1610612768u,36372u,138442752u,67108864u}/* 1D226 */, /*24850*/{0,1992u,196609u,76818459u,40u,1610612768u,36380u,138442752u,67108864u}/* 1D227 */, /*24851*/{0,1992u,196609u,76818459u,40u,1610612768u,36388u,138442752u,67108864u}/* 1D228 */, /*24852*/{0,1992u,196609u,76818459u,40u,1610612768u,36396u,138442752u,67108864u}/* 1D229 */, /*24853*/{0,1992u,196609u,76818459u,40u,1610612768u,36404u,138442752u,67108864u}/* 1D22A */, /*24854*/{0,1992u,196609u,76818459u,40u,1610612768u,36412u,138442752u,67108864u}/* 1D22B */, /*24855*/{0,1992u,196609u,76818459u,40u,1610612768u,36420u,138442752u,67108864u}/* 1D22C */, /*24856*/{0,1992u,196609u,76818459u,40u,1610612768u,36428u,138442752u,67108864u}/* 1D22D */, /*24857*/{0,1992u,196609u,76818459u,40u,1610612768u,36436u,138442752u,67108864u}/* 1D22E */, /*24858*/{0,1992u,196609u,76818459u,40u,1610612768u,36444u,138442752u,67108864u}/* 1D22F */, /*24859*/{0,1992u,196609u,76818459u,40u,1610612768u,36452u,138442752u,67108864u}/* 1D230 */, /*24860*/{0,1992u,196609u,76818459u,40u,1610612768u,36460u,138442752u,67108864u}/* 1D231 */, /*24861*/{0,1992u,196609u,76818459u,40u,1610612768u,36468u,138442752u,67108864u}/* 1D232 */, /*24862*/{0,1992u,196609u,76818459u,40u,1610612768u,36476u,138442752u,67108864u}/* 1D233 */, /*24863*/{0,1992u,196609u,76818459u,40u,1610612768u,36484u,138442752u,67108864u}/* 1D234 */, /*24864*/{0,1992u,196609u,76818459u,40u,1610612768u,36492u,138442752u,67108864u}/* 1D235 */, /*24865*/{0,1992u,196609u,76818459u,40u,1610612768u,36500u,138442752u,67108864u}/* 1D236 */, /*24866*/{0,1992u,196609u,76818459u,40u,1610612768u,36508u,138442752u,67108864u}/* 1D237 */, /*24867*/{0,1992u,196609u,76818459u,40u,1610612768u,36516u,138442752u,67108864u}/* 1D238 */, /*24868*/{0,1992u,196609u,76818459u,40u,1610612768u,36524u,138442752u,67108864u}/* 1D239 */, /*24869*/{0,1992u,196609u,76818459u,40u,1610612768u,36532u,138442752u,67108864u}/* 1D23A */, /*24870*/{0,1992u,196609u,76818459u,40u,1610612768u,36540u,138442752u,67108864u}/* 1D23B */, /*24871*/{0,1992u,196609u,76818459u,40u,1610612768u,36548u,138442752u,67108864u}/* 1D23C */, /*24872*/{0,1992u,196609u,76818459u,40u,1610612768u,36556u,138442752u,67108864u}/* 1D23D */, /*24873*/{0,1992u,196609u,76818459u,40u,1610612768u,36564u,138442752u,67108864u}/* 1D23E */, /*24874*/{0,1992u,196609u,76818459u,40u,1610612768u,36572u,138442752u,67108864u}/* 1D23F */, /*24875*/{0,1992u,196609u,76818459u,40u,1610612768u,36580u,138442752u,67108864u}/* 1D240 */, /*24876*/{0,1992u,196609u,76818459u,40u,1610612768u,36588u,138442752u,67108864u}/* 1D241 */, /*24877*/{0,1992u,196609u,3423875078u,672030728u,1627389968u,1077936140u,4208640u,262144u}/* 1D242 */, /*24878*/{0,1992u,196609u,76818459u,40u,1610612768u,36596u,138442752u,67108864u}/* 1D245 */, /*24879*/{0,2000u,65537u,76785691u,40u,1610612768u,30748u,138442752u,67108864u}/* 1D300 */, /*24880*/{0,2000u,65537u,76785691u,40u,1610612768u,30756u,138442752u,67108864u}/* 1D301 */, /*24881*/{0,2000u,65537u,76785691u,40u,1610612768u,30764u,138442752u,67108864u}/* 1D302 */, /*24882*/{0,2000u,65537u,76785691u,40u,1610612768u,30772u,138442752u,67108864u}/* 1D303 */, /*24883*/{0,2000u,65537u,76785691u,40u,1610612768u,30780u,138442752u,67108864u}/* 1D304 */, /*24884*/{0,2000u,65537u,76785691u,40u,1610612768u,30788u,138442752u,67108864u}/* 1D305 */, /*24885*/{0,2000u,65537u,76785691u,40u,1610612768u,30796u,138442752u,67108864u}/* 1D306 */, /*24886*/{0,2000u,65537u,76785691u,40u,1610612768u,30804u,138442752u,67108864u}/* 1D307 */, /*24887*/{0,2000u,65537u,76785691u,40u,1610612768u,30812u,138442752u,67108864u}/* 1D308 */, /*24888*/{0,2000u,65537u,76785691u,40u,1610612768u,30820u,138442752u,67108864u}/* 1D309 */, /*24889*/{0,2000u,65537u,76785691u,40u,1610612768u,30828u,138442752u,67108864u}/* 1D30A */, /*24890*/{0,2000u,65537u,76785691u,40u,1610612768u,30836u,138442752u,67108864u}/* 1D30B */, /*24891*/{0,2000u,65537u,76785691u,40u,1610612768u,30844u,138442752u,67108864u}/* 1D30C */, /*24892*/{0,2000u,65537u,76785691u,40u,1610612768u,30852u,138442752u,67108864u}/* 1D30D */, /*24893*/{0,2000u,65537u,76785691u,40u,1610612768u,30860u,138442752u,67108864u}/* 1D30E */, /*24894*/{0,2000u,65537u,76785691u,40u,1610612768u,30868u,138442752u,67108864u}/* 1D30F */, /*24895*/{0,2000u,65537u,76785691u,40u,1610612768u,30876u,138442752u,67108864u}/* 1D310 */, /*24896*/{0,2000u,65537u,76785691u,40u,1610612768u,30884u,138442752u,67108864u}/* 1D311 */, /*24897*/{0,2000u,65537u,76785691u,40u,1610612768u,30892u,138442752u,67108864u}/* 1D312 */, /*24898*/{0,2000u,65537u,76785691u,40u,1610612768u,30900u,138442752u,67108864u}/* 1D313 */, /*24899*/{0,2000u,65537u,76785691u,40u,1610612768u,30908u,138442752u,67108864u}/* 1D314 */, /*24900*/{0,2000u,65537u,76785691u,40u,1610612768u,30916u,138442752u,67108864u}/* 1D315 */, /*24901*/{0,2000u,65537u,76785691u,40u,1610612768u,30924u,138442752u,67108864u}/* 1D316 */, /*24902*/{0,2000u,65537u,76785691u,40u,1610612768u,30932u,138442752u,67108864u}/* 1D317 */, /*24903*/{0,2000u,65537u,76785691u,40u,1610612768u,30940u,138442752u,67108864u}/* 1D318 */, /*24904*/{0,2000u,65537u,76785691u,40u,1610612768u,30948u,138442752u,67108864u}/* 1D319 */, /*24905*/{0,2000u,65537u,76785691u,40u,1610612768u,30956u,138442752u,67108864u}/* 1D31A */, /*24906*/{0,2000u,65537u,76785691u,40u,1610612768u,30964u,138442752u,67108864u}/* 1D31B */, /*24907*/{0,2000u,65537u,76785691u,40u,1610612768u,30972u,138442752u,67108864u}/* 1D31C */, /*24908*/{0,2000u,65537u,76785691u,40u,1610612768u,30980u,138442752u,67108864u}/* 1D31D */, /*24909*/{0,2000u,65537u,76785691u,40u,1610612768u,30988u,138442752u,67108864u}/* 1D31E */, /*24910*/{0,2000u,65537u,76785691u,40u,1610612768u,30996u,138442752u,67108864u}/* 1D31F */, /*24911*/{0,2000u,65537u,76785691u,40u,1610612768u,31004u,138442752u,67108864u}/* 1D320 */, /*24912*/{0,2000u,65537u,76785691u,40u,1610612768u,31012u,138442752u,67108864u}/* 1D321 */, /*24913*/{0,2000u,65537u,76785691u,40u,1610612768u,31020u,138442752u,67108864u}/* 1D322 */, /*24914*/{0,2000u,65537u,76785691u,40u,1610612768u,31028u,138442752u,67108864u}/* 1D323 */, /*24915*/{0,2000u,65537u,76785691u,40u,1610612768u,31036u,138442752u,67108864u}/* 1D324 */, /*24916*/{0,2000u,65537u,76785691u,40u,1610612768u,31044u,138442752u,67108864u}/* 1D325 */, /*24917*/{0,2000u,65537u,76785691u,40u,1610612768u,31052u,138442752u,67108864u}/* 1D326 */, /*24918*/{0,2000u,65537u,76785691u,40u,1610612768u,31060u,138442752u,67108864u}/* 1D327 */, /*24919*/{0,2000u,65537u,76785691u,40u,1610612768u,31068u,138442752u,67108864u}/* 1D328 */, /*24920*/{0,2000u,65537u,76785691u,40u,1610612768u,31076u,138442752u,67108864u}/* 1D329 */, /*24921*/{0,2000u,65537u,76785691u,40u,1610612768u,31084u,138442752u,67108864u}/* 1D32A */, /*24922*/{0,2000u,65537u,76785691u,40u,1610612768u,31092u,138442752u,67108864u}/* 1D32B */, /*24923*/{0,2000u,65537u,76785691u,40u,1610612768u,31100u,138442752u,67108864u}/* 1D32C */, /*24924*/{0,2000u,65537u,76785691u,40u,1610612768u,31108u,138442752u,67108864u}/* 1D32D */, /*24925*/{0,2000u,65537u,76785691u,40u,1610612768u,31116u,138442752u,67108864u}/* 1D32E */, /*24926*/{0,2000u,65537u,76785691u,40u,1610612768u,31124u,138442752u,67108864u}/* 1D32F */, /*24927*/{0,2000u,65537u,76785691u,40u,1610612768u,31132u,138442752u,67108864u}/* 1D330 */, /*24928*/{0,2000u,65537u,76785691u,40u,1610612768u,31140u,138442752u,67108864u}/* 1D331 */, /*24929*/{0,2000u,65537u,76785691u,40u,1610612768u,31148u,138442752u,67108864u}/* 1D332 */, /*24930*/{0,2000u,65537u,76785691u,40u,1610612768u,31156u,138442752u,67108864u}/* 1D333 */, /*24931*/{0,2000u,65537u,76785691u,40u,1610612768u,31164u,138442752u,67108864u}/* 1D334 */, /*24932*/{0,2000u,65537u,76785691u,40u,1610612768u,31172u,138442752u,67108864u}/* 1D335 */, /*24933*/{0,2000u,65537u,76785691u,40u,1610612768u,31180u,138442752u,67108864u}/* 1D336 */, /*24934*/{0,2000u,65537u,76785691u,40u,1610612768u,31188u,138442752u,67108864u}/* 1D337 */, /*24935*/{0,2000u,65537u,76785691u,40u,1610612768u,31196u,138442752u,67108864u}/* 1D338 */, /*24936*/{0,2000u,65537u,76785691u,40u,1610612768u,31204u,138442752u,67108864u}/* 1D339 */, /*24937*/{0,2000u,65537u,76785691u,40u,1610612768u,31212u,138442752u,67108864u}/* 1D33A */, /*24938*/{0,2000u,65537u,76785691u,40u,1610612768u,31220u,138442752u,67108864u}/* 1D33B */, /*24939*/{0,2000u,65537u,76785691u,40u,1610612768u,31228u,138442752u,67108864u}/* 1D33C */, /*24940*/{0,2000u,65537u,76785691u,40u,1610612768u,31236u,138442752u,67108864u}/* 1D33D */, /*24941*/{0,2000u,65537u,76785691u,40u,1610612768u,31244u,138442752u,67108864u}/* 1D33E */, /*24942*/{0,2000u,65537u,76785691u,40u,1610612768u,31252u,138442752u,67108864u}/* 1D33F */, /*24943*/{0,2000u,65537u,76785691u,40u,1610612768u,31260u,138442752u,67108864u}/* 1D340 */, /*24944*/{0,2000u,65537u,76785691u,40u,1610612768u,31268u,138442752u,67108864u}/* 1D341 */, /*24945*/{0,2000u,65537u,76785691u,40u,1610612768u,31276u,138442752u,67108864u}/* 1D342 */, /*24946*/{0,2000u,65537u,76785691u,40u,1610612768u,31284u,138442752u,67108864u}/* 1D343 */, /*24947*/{0,2000u,65537u,76785691u,40u,1610612768u,31292u,138442752u,67108864u}/* 1D344 */, /*24948*/{0,2000u,65537u,76785691u,40u,1610612768u,31300u,138442752u,67108864u}/* 1D345 */, /*24949*/{0,2000u,65537u,76785691u,40u,1610612768u,31308u,138442752u,67108864u}/* 1D346 */, /*24950*/{0,2000u,65537u,76785691u,40u,1610612768u,31316u,138442752u,67108864u}/* 1D347 */, /*24951*/{0,2000u,65537u,76785691u,40u,1610612768u,31324u,138442752u,67108864u}/* 1D348 */, /*24952*/{0,2000u,65537u,76785691u,40u,1610612768u,31332u,138442752u,67108864u}/* 1D349 */, /*24953*/{0,2000u,65537u,76785691u,40u,1610612768u,31340u,138442752u,67108864u}/* 1D34A */, /*24954*/{0,2000u,65537u,76785691u,40u,1610612768u,31348u,138442752u,67108864u}/* 1D34B */, /*24955*/{0,2000u,65537u,76785691u,40u,1610612768u,31356u,138442752u,67108864u}/* 1D34C */, /*24956*/{0,2000u,65537u,76785691u,40u,1610612768u,31364u,138442752u,67108864u}/* 1D34D */, /*24957*/{0,2000u,65537u,76785691u,40u,1610612768u,31372u,138442752u,67108864u}/* 1D34E */, /*24958*/{0,2000u,65537u,76785691u,40u,1610612768u,31380u,138442752u,67108864u}/* 1D34F */, /*24959*/{0,2000u,65537u,76785691u,40u,1610612768u,31388u,138442752u,67108864u}/* 1D350 */, /*24960*/{0,2000u,65537u,76785691u,40u,1610612768u,31396u,138442752u,67108864u}/* 1D351 */, /*24961*/{0,2000u,65537u,76785691u,40u,1610612768u,31404u,138442752u,67108864u}/* 1D352 */, /*24962*/{0,2000u,65537u,76785691u,40u,1610612768u,31412u,138442752u,67108864u}/* 1D353 */, /*24963*/{0,2000u,65537u,76785691u,40u,1610612768u,31420u,138442752u,67108864u}/* 1D354 */, /*24964*/{0,2000u,65537u,76785691u,40u,1610612768u,31428u,138442752u,67108864u}/* 1D355 */, /*24965*/{0,2000u,65537u,76785691u,40u,1610612768u,31436u,138442752u,67108864u}/* 1D356 */, /*24966*/{0,2008u,536937985u,76840971u,8388650u,1610612768u,58669u,138442752u,0}/* 1D360 */, /*24967*/{0,2008u,570493441u,76840971u,8388650u,1610612768u,58677u,138442752u,0}/* 1D361 */, /*24968*/{0,2008u,604047361u,76840971u,8388650u,1610612768u,58685u,138442752u,0}/* 1D362 */, /*24969*/{0,2008u,637603841u,76840971u,8388650u,1610612768u,58693u,138442752u,0}/* 1D363 */, /*24970*/{0,2008u,671157249u,76840971u,8388650u,1610612768u,58701u,138442752u,0}/* 1D364 */, /*24971*/{0,2008u,704714241u,76840971u,8388650u,1610612768u,58709u,138442752u,0}/* 1D365 */, /*24972*/{0,2008u,738266625u,76840971u,8388650u,1610612768u,58717u,138442752u,0}/* 1D366 */, /*24973*/{0,2008u,771824641u,76840971u,8388650u,1610612768u,58725u,138442752u,0}/* 1D367 */, /*24974*/{0,2008u,805377025u,76840971u,8388650u,1610612768u,58733u,138442752u,0}/* 1D368 */, /*24975*/{0,2008u,822157313u,76840971u,8388650u,1610612768u,58021u,138442752u,0}/* 1D369 */, /*24976*/{0,2008u,989932545u,76840971u,8388650u,1610612768u,58029u,138442752u,0}/* 1D36A */, /*24977*/{0,2008u,1157709825u,76840971u,8388650u,1610612768u,58037u,138442752u,0}/* 1D36B */, /*24978*/{0,2008u,1325487105u,76840971u,8388650u,1610612768u,58045u,138442752u,0}/* 1D36C */, /*24979*/{0,2008u,1493264385u,76840971u,8388650u,1610612768u,58053u,138442752u,0}/* 1D36D */, /*24980*/{0,2008u,1510042113u,76840971u,8388650u,1610612768u,58061u,138442752u,0}/* 1D36E */, /*24981*/{0,2008u,1526819841u,76840971u,8388650u,1610612768u,58069u,138442752u,0}/* 1D36F */, /*24982*/{0,2008u,1543597569u,76840971u,8388650u,1610612768u,58077u,138442752u,0}/* 1D370 */, /*24983*/{0,2008u,1560375297u,76840971u,8388650u,1610612768u,58085u,138442752u,0}/* 1D371 */, /*24984*/{2049441792u,2016u,65537u,76709985u,1507360u,3767009312u,1711334774u,138514440u,2490368u}/* 1D400 */, /*24985*/{2049966080u,2016u,65537u,76709985u,1507360u,3767009312u,1711334974u,138514440u,2490368u}/* 1D401 */, /*24986*/{2050490368u,2016u,65537u,76709985u,1507360u,3767009312u,1711335182u,138514440u,2490368u}/* 1D402 */, /*24987*/{2051014656u,2016u,65537u,76709985u,1507360u,3767009312u,1711335350u,138514440u,2490368u}/* 1D403 */, /*24988*/{2051538944u,2016u,65537u,76709985u,1507360u,3767009312u,1711335566u,138514440u,2490368u}/* 1D404 */, /*24989*/{2052063232u,2016u,65537u,76709985u,1507360u,3767009312u,1711336038u,138514440u,2490368u}/* 1D405 */, /*24990*/{2052587520u,2016u,65537u,76709985u,1507360u,3767009312u,1711336158u,138514440u,2490368u}/* 1D406 */, /*24991*/{2053111808u,2016u,65537u,76709985u,1507360u,3767009312u,1711336446u,138514440u,2490368u}/* 1D407 */, /*24992*/{2053636096u,2016u,65537u,76709985u,1507360u,3767009312u,1711336654u,138514440u,2490368u}/* 1D408 */, /*24993*/{2054160384u,2016u,65537u,76709985u,1507360u,3767009312u,1711336862u,138514440u,2490368u}/* 1D409 */, /*24994*/{2054684672u,2016u,65537u,76709985u,1507360u,3767009312u,1711337062u,138514440u,2490368u}/* 1D40A */, /*24995*/{2055208960u,2016u,65537u,76709985u,1507360u,3767009312u,1711337206u,138514440u,2490368u}/* 1D40B */, /*24996*/{2055733248u,2016u,65537u,76709985u,1507360u,3767009312u,1711337614u,138514440u,2490368u}/* 1D40C */, /*24997*/{2056257536u,2016u,65537u,76709985u,1507360u,3767009312u,1711337734u,138514440u,2490368u}/* 1D40D */, /*24998*/{2056781824u,2016u,65537u,76709985u,1507360u,3767009312u,1711338022u,138514440u,2490368u}/* 1D40E */, /*24999*/{2057306112u,2016u,65537u,76709985u,1507360u,3767009312u,1711338398u,138514440u,2490368u}/* 1D40F */, /*25000*/{2057830400u,2016u,65537u,76709985u,1507360u,3767009312u,1711338566u,138514440u,2490368u}/* 1D410 */, /*25001*/{2058354688u,2016u,65537u,76709985u,1507360u,3767009312u,1711338710u,138514440u,2490368u}/* 1D411 */, /*25002*/{2058878976u,2016u,65537u,76709985u,1507360u,3767009312u,1711339206u,138514440u,2490368u}/* 1D412 */, /*25003*/{2059403264u,2016u,65537u,76709985u,1507360u,3767009312u,1711339494u,138514440u,2490368u}/* 1D413 */, /*25004*/{2059927552u,2016u,65537u,76709985u,1507360u,3767009312u,1711339750u,138514440u,2490368u}/* 1D414 */, /*25005*/{2060451840u,2016u,65537u,76709985u,1507360u,3767009312u,1711340118u,138514440u,2490368u}/* 1D415 */, /*25006*/{2060976128u,2016u,65537u,76709985u,1507360u,3767009312u,1711340262u,138514440u,2490368u}/* 1D416 */, /*25007*/{2061500416u,2016u,65537u,76709985u,1507360u,3767009312u,1711340342u,138514440u,2490368u}/* 1D417 */, /*25008*/{2062024704u,2016u,65537u,76709985u,1507360u,3767009312u,1711340438u,138514440u,2490368u}/* 1D418 */, /*25009*/{2062548992u,2016u,65537u,76709985u,1507360u,3767009312u,1711340614u,138514440u,2490368u}/* 1D419 */, /*25010*/{2063073280u,2016u,65537u,76709986u,1499168u,3767009312u,1719723382u,138465288u,393216u}/* 1D41A */, /*25011*/{2063597568u,2016u,65537u,76709986u,1499168u,3767009312u,1719723582u,138465288u,393216u}/* 1D41B */, /*25012*/{2064121856u,2016u,65537u,76709986u,1499168u,3767009312u,1719723790u,138465288u,393216u}/* 1D41C */, /*25013*/{2064646144u,2016u,65537u,76709986u,1499168u,3767009312u,1719723958u,138465288u,393216u}/* 1D41D */, /*25014*/{2065170432u,2016u,65537u,76709986u,1499168u,3767009312u,1719724174u,138465288u,393216u}/* 1D41E */, /*25015*/{2065694720u,2016u,65537u,76709986u,1499168u,3767009312u,1719724646u,138465288u,393216u}/* 1D41F */, /*25016*/{2066219008u,2016u,65537u,76709986u,1499168u,3767009312u,1719724766u,138465288u,393216u}/* 1D420 */, /*25017*/{2066743296u,2016u,65537u,76709986u,1499168u,3767009312u,1719725054u,138465288u,393216u}/* 1D421 */, /*25018*/{2067267584u,2016u,65537u,76709986u,1499168u,3767009312u,1719725262u,138465288u,17170432u}/* 1D422 */, /*25019*/{2067791872u,2016u,65537u,76709986u,1499168u,3767009312u,1719725470u,138465288u,17170432u}/* 1D423 */, /*25020*/{2068316160u,2016u,65537u,76709986u,1499168u,3767009312u,1719725670u,138465288u,393216u}/* 1D424 */, /*25021*/{2068840448u,2016u,65537u,76709986u,1499168u,3767009312u,1719725814u,138465288u,393216u}/* 1D425 */, /*25022*/{2069364736u,2016u,65537u,76709986u,1499168u,3767009312u,1719726222u,138465288u,393216u}/* 1D426 */, /*25023*/{2069889024u,2016u,65537u,76709986u,1499168u,3767009312u,1719726342u,138465288u,393216u}/* 1D427 */, /*25024*/{2070413312u,2016u,65537u,76709986u,1499168u,3767009312u,1719726630u,138465288u,393216u}/* 1D428 */, /*25025*/{2070937600u,2016u,65537u,76709986u,1499168u,3767009312u,1719727006u,138465288u,393216u}/* 1D429 */, /*25026*/{2071461888u,2016u,65537u,76709986u,1499168u,3767009312u,1719727174u,138465288u,393216u}/* 1D42A */, /*25027*/{2071986176u,2016u,65537u,76709986u,1499168u,3767009312u,1719727318u,138465288u,393216u}/* 1D42B */, /*25028*/{2072510464u,2016u,65537u,76709986u,1499168u,3767009312u,1719727814u,138465288u,393216u}/* 1D42C */, /*25029*/{2073034752u,2016u,65537u,76709986u,1499168u,3767009312u,1719728102u,138465288u,393216u}/* 1D42D */, /*25030*/{2073559040u,2016u,65537u,76709986u,1499168u,3767009312u,1719728358u,138465288u,393216u}/* 1D42E */, /*25031*/{2074083328u,2016u,65537u,76709986u,1499168u,3767009312u,1719728726u,138465288u,393216u}/* 1D42F */, /*25032*/{2074607616u,2016u,65537u,76709986u,1499168u,3767009312u,1719728870u,138465288u,393216u}/* 1D430 */, /*25033*/{2075131904u,2016u,65537u,76709986u,1499168u,3767009312u,1719728950u,138465288u,393216u}/* 1D431 */, /*25034*/{2075656192u,2016u,65537u,76709986u,1499168u,3767009312u,1719729046u,138465288u,393216u}/* 1D432 */, /*25035*/{2076180480u,2016u,65537u,76709986u,1499168u,3767009312u,1719729222u,138465288u,393216u}/* 1D433 */, /*25036*/{2076704768u,2016u,65537u,76709985u,1507360u,3767009312u,1711334774u,138514440u,2490368u}/* 1D434 */, /*25037*/{2077229056u,2016u,65537u,76709985u,1507360u,3767009312u,1711334974u,138514440u,2490368u}/* 1D435 */, /*25038*/{2077753344u,2016u,65537u,76709985u,1507360u,3767009312u,1711335182u,138514440u,2490368u}/* 1D436 */, /*25039*/{2078277632u,2016u,65537u,76709985u,1507360u,3767009312u,1711335350u,138514440u,2490368u}/* 1D437 */, /*25040*/{2078801920u,2016u,65537u,76709985u,1507360u,3767009312u,1711335566u,138514440u,2490368u}/* 1D438 */, /*25041*/{2079326208u,2016u,65537u,76709985u,1507360u,3767009312u,1711336038u,138514440u,2490368u}/* 1D439 */, /*25042*/{2079850496u,2016u,65537u,76709985u,1507360u,3767009312u,1711336158u,138514440u,2490368u}/* 1D43A */, /*25043*/{2080374784u,2016u,65537u,76709985u,1507360u,3767009312u,1711336446u,138514440u,2490368u}/* 1D43B */, /*25044*/{2080899072u,2016u,65537u,76709985u,1507360u,3767009312u,1711336654u,138514440u,2490368u}/* 1D43C */, /*25045*/{2081423360u,2016u,65537u,76709985u,1507360u,3767009312u,1711336862u,138514440u,2490368u}/* 1D43D */, /*25046*/{2081947648u,2016u,65537u,76709985u,1507360u,3767009312u,1711337062u,138514440u,2490368u}/* 1D43E */, /*25047*/{2082471936u,2016u,65537u,76709985u,1507360u,3767009312u,1711337206u,138514440u,2490368u}/* 1D43F */, /*25048*/{2082996224u,2016u,65537u,76709985u,1507360u,3767009312u,1711337614u,138514440u,2490368u}/* 1D440 */, /*25049*/{2083520512u,2016u,65537u,76709985u,1507360u,3767009312u,1711337734u,138514440u,2490368u}/* 1D441 */, /*25050*/{2084044800u,2016u,65537u,76709985u,1507360u,3767009312u,1711338022u,138514440u,2490368u}/* 1D442 */, /*25051*/{2084569088u,2016u,65537u,76709985u,1507360u,3767009312u,1711338398u,138514440u,2490368u}/* 1D443 */, /*25052*/{2085093376u,2016u,65537u,76709985u,1507360u,3767009312u,1711338566u,138514440u,2490368u}/* 1D444 */, /*25053*/{2085617664u,2016u,65537u,76709985u,1507360u,3767009312u,1711338710u,138514440u,2490368u}/* 1D445 */, /*25054*/{2086141952u,2016u,65537u,76709985u,1507360u,3767009312u,1711339206u,138514440u,2490368u}/* 1D446 */, /*25055*/{2086666240u,2016u,65537u,76709985u,1507360u,3767009312u,1711339494u,138514440u,2490368u}/* 1D447 */, /*25056*/{2087190528u,2016u,65537u,76709985u,1507360u,3767009312u,1711339750u,138514440u,2490368u}/* 1D448 */, /*25057*/{2087714816u,2016u,65537u,76709985u,1507360u,3767009312u,1711340118u,138514440u,2490368u}/* 1D449 */, /*25058*/{2088239104u,2016u,65537u,76709985u,1507360u,3767009312u,1711340262u,138514440u,2490368u}/* 1D44A */, /*25059*/{2088763392u,2016u,65537u,76709985u,1507360u,3767009312u,1711340342u,138514440u,2490368u}/* 1D44B */, /*25060*/{2089287680u,2016u,65537u,76709985u,1507360u,3767009312u,1711340438u,138514440u,2490368u}/* 1D44C */, /*25061*/{2089811968u,2016u,65537u,76709985u,1507360u,3767009312u,1711340614u,138514440u,2490368u}/* 1D44D */, /*25062*/{2090336256u,2016u,65537u,76709986u,1499168u,3767009312u,1719723382u,138465288u,393216u}/* 1D44E */, /*25063*/{2090860544u,2016u,65537u,76709986u,1499168u,3767009312u,1719723582u,138465288u,393216u}/* 1D44F */, /*25064*/{2091384832u,2016u,65537u,76709986u,1499168u,3767009312u,1719723790u,138465288u,393216u}/* 1D450 */, /*25065*/{2091909120u,2016u,65537u,76709986u,1499168u,3767009312u,1719723958u,138465288u,393216u}/* 1D451 */, /*25066*/{2092433408u,2016u,65537u,76709986u,1499168u,3767009312u,1719724174u,138465288u,393216u}/* 1D452 */, /*25067*/{2092957696u,2016u,65537u,76709986u,1499168u,3767009312u,1719724646u,138465288u,393216u}/* 1D453 */, /*25068*/{2093481984u,2016u,65537u,76709986u,1499168u,3767009312u,1719724766u,138465288u,393216u}/* 1D454 */, /*25069*/{2094006272u,2016u,65537u,76709986u,1499168u,3767009312u,1719725262u,138465288u,17170432u}/* 1D456 */, /*25070*/{2094530560u,2016u,65537u,76709986u,1499168u,3767009312u,1719725470u,138465288u,17170432u}/* 1D457 */, /*25071*/{2095054848u,2016u,65537u,76709986u,1499168u,3767009312u,1719725670u,138465288u,393216u}/* 1D458 */, /*25072*/{2095579136u,2016u,65537u,76709986u,1499168u,3767009312u,1719725814u,138465288u,393216u}/* 1D459 */, /*25073*/{2096103424u,2016u,65537u,76709986u,1499168u,3767009312u,1719726222u,138465288u,393216u}/* 1D45A */, /*25074*/{2096627712u,2016u,65537u,76709986u,1499168u,3767009312u,1719726342u,138465288u,393216u}/* 1D45B */, /*25075*/{2097152000u,2016u,65537u,76709986u,1499168u,3767009312u,1719726630u,138465288u,393216u}/* 1D45C */, /*25076*/{2097676288u,2016u,65537u,76709986u,1499168u,3767009312u,1719727006u,138465288u,393216u}/* 1D45D */, /*25077*/{2098200576u,2016u,65537u,76709986u,1499168u,3767009312u,1719727174u,138465288u,393216u}/* 1D45E */, /*25078*/{2098724864u,2016u,65537u,76709986u,1499168u,3767009312u,1719727318u,138465288u,393216u}/* 1D45F */, /*25079*/{2099249152u,2016u,65537u,76709986u,1499168u,3767009312u,1719727814u,138465288u,393216u}/* 1D460 */, /*25080*/{2099773440u,2016u,65537u,76709986u,1499168u,3767009312u,1719728102u,138465288u,393216u}/* 1D461 */, /*25081*/{2100297728u,2016u,65537u,76709986u,1499168u,3767009312u,1719728358u,138465288u,393216u}/* 1D462 */, /*25082*/{2100822016u,2016u,65537u,76709986u,1499168u,3767009312u,1719728726u,138465288u,393216u}/* 1D463 */, /*25083*/{2101346304u,2016u,65537u,76709986u,1499168u,3767009312u,1719728870u,138465288u,393216u}/* 1D464 */, /*25084*/{2101870592u,2016u,65537u,76709986u,1499168u,3767009312u,1719728950u,138465288u,393216u}/* 1D465 */, /*25085*/{2102394880u,2016u,65537u,76709986u,1499168u,3767009312u,1719729046u,138465288u,393216u}/* 1D466 */, /*25086*/{2102919168u,2016u,65537u,76709986u,1499168u,3767009312u,1719729222u,138465288u,393216u}/* 1D467 */, /*25087*/{2103443456u,2016u,65537u,76709985u,1507360u,3767009312u,1711334774u,138514440u,2490368u}/* 1D468 */, /*25088*/{2103967744u,2016u,65537u,76709985u,1507360u,3767009312u,1711334974u,138514440u,2490368u}/* 1D469 */, /*25089*/{2104492032u,2016u,65537u,76709985u,1507360u,3767009312u,1711335182u,138514440u,2490368u}/* 1D46A */, /*25090*/{2105016320u,2016u,65537u,76709985u,1507360u,3767009312u,1711335350u,138514440u,2490368u}/* 1D46B */, /*25091*/{2105540608u,2016u,65537u,76709985u,1507360u,3767009312u,1711335566u,138514440u,2490368u}/* 1D46C */, /*25092*/{2106064896u,2016u,65537u,76709985u,1507360u,3767009312u,1711336038u,138514440u,2490368u}/* 1D46D */, /*25093*/{2106589184u,2016u,65537u,76709985u,1507360u,3767009312u,1711336158u,138514440u,2490368u}/* 1D46E */, /*25094*/{2107113472u,2016u,65537u,76709985u,1507360u,3767009312u,1711336446u,138514440u,2490368u}/* 1D46F */, /*25095*/{2107637760u,2016u,65537u,76709985u,1507360u,3767009312u,1711336654u,138514440u,2490368u}/* 1D470 */, /*25096*/{2108162048u,2016u,65537u,76709985u,1507360u,3767009312u,1711336862u,138514440u,2490368u}/* 1D471 */, /*25097*/{2108686336u,2016u,65537u,76709985u,1507360u,3767009312u,1711337062u,138514440u,2490368u}/* 1D472 */, /*25098*/{2109210624u,2016u,65537u,76709985u,1507360u,3767009312u,1711337206u,138514440u,2490368u}/* 1D473 */, /*25099*/{2109734912u,2016u,65537u,76709985u,1507360u,3767009312u,1711337614u,138514440u,2490368u}/* 1D474 */, /*25100*/{2110259200u,2016u,65537u,76709985u,1507360u,3767009312u,1711337734u,138514440u,2490368u}/* 1D475 */, /*25101*/{2110783488u,2016u,65537u,76709985u,1507360u,3767009312u,1711338022u,138514440u,2490368u}/* 1D476 */, /*25102*/{2111307776u,2016u,65537u,76709985u,1507360u,3767009312u,1711338398u,138514440u,2490368u}/* 1D477 */, /*25103*/{2111832064u,2016u,65537u,76709985u,1507360u,3767009312u,1711338566u,138514440u,2490368u}/* 1D478 */, /*25104*/{2112356352u,2016u,65537u,76709985u,1507360u,3767009312u,1711338710u,138514440u,2490368u}/* 1D479 */, /*25105*/{2112880640u,2016u,65537u,76709985u,1507360u,3767009312u,1711339206u,138514440u,2490368u}/* 1D47A */, /*25106*/{2113404928u,2016u,65537u,76709985u,1507360u,3767009312u,1711339494u,138514440u,2490368u}/* 1D47B */, /*25107*/{2113929216u,2016u,65537u,76709985u,1507360u,3767009312u,1711339750u,138514440u,2490368u}/* 1D47C */, /*25108*/{2114453504u,2016u,65537u,76709985u,1507360u,3767009312u,1711340118u,138514440u,2490368u}/* 1D47D */, /*25109*/{2114977792u,2016u,65537u,76709985u,1507360u,3767009312u,1711340262u,138514440u,2490368u}/* 1D47E */, /*25110*/{2115502080u,2016u,65537u,76709985u,1507360u,3767009312u,1711340342u,138514440u,2490368u}/* 1D47F */, /*25111*/{2116026368u,2016u,65537u,76709985u,1507360u,3767009312u,1711340438u,138514440u,2490368u}/* 1D480 */, /*25112*/{2116550656u,2016u,65537u,76709985u,1507360u,3767009312u,1711340614u,138514440u,2490368u}/* 1D481 */, /*25113*/{2117074944u,2016u,65537u,76709986u,1499168u,3767009312u,1719723382u,138465288u,393216u}/* 1D482 */, /*25114*/{2117599232u,2016u,65537u,76709986u,1499168u,3767009312u,1719723582u,138465288u,393216u}/* 1D483 */, /*25115*/{2118123520u,2016u,65537u,76709986u,1499168u,3767009312u,1719723790u,138465288u,393216u}/* 1D484 */, /*25116*/{2118647808u,2016u,65537u,76709986u,1499168u,3767009312u,1719723958u,138465288u,393216u}/* 1D485 */, /*25117*/{2119172096u,2016u,65537u,76709986u,1499168u,3767009312u,1719724174u,138465288u,393216u}/* 1D486 */, /*25118*/{2119696384u,2016u,65537u,76709986u,1499168u,3767009312u,1719724646u,138465288u,393216u}/* 1D487 */, /*25119*/{2120220672u,2016u,65537u,76709986u,1499168u,3767009312u,1719724766u,138465288u,393216u}/* 1D488 */, /*25120*/{2120744960u,2016u,65537u,76709986u,1499168u,3767009312u,1719725054u,138465288u,393216u}/* 1D489 */, /*25121*/{2121269248u,2016u,65537u,76709986u,1499168u,3767009312u,1719725262u,138465288u,17170432u}/* 1D48A */, /*25122*/{2121793536u,2016u,65537u,76709986u,1499168u,3767009312u,1719725470u,138465288u,17170432u}/* 1D48B */, /*25123*/{2122317824u,2016u,65537u,76709986u,1499168u,3767009312u,1719725670u,138465288u,393216u}/* 1D48C */, /*25124*/{2122842112u,2016u,65537u,76709986u,1499168u,3767009312u,1719725814u,138465288u,393216u}/* 1D48D */, /*25125*/{2123366400u,2016u,65537u,76709986u,1499168u,3767009312u,1719726222u,138465288u,393216u}/* 1D48E */, /*25126*/{2123890688u,2016u,65537u,76709986u,1499168u,3767009312u,1719726342u,138465288u,393216u}/* 1D48F */, /*25127*/{2124414976u,2016u,65537u,76709986u,1499168u,3767009312u,1719726630u,138465288u,393216u}/* 1D490 */, /*25128*/{2124939264u,2016u,65537u,76709986u,1499168u,3767009312u,1719727006u,138465288u,393216u}/* 1D491 */, /*25129*/{2125463552u,2016u,65537u,76709986u,1499168u,3767009312u,1719727174u,138465288u,393216u}/* 1D492 */, /*25130*/{2125987840u,2016u,65537u,76709986u,1499168u,3767009312u,1719727318u,138465288u,393216u}/* 1D493 */, /*25131*/{2126512128u,2016u,65537u,76709986u,1499168u,3767009312u,1719727814u,138465288u,393216u}/* 1D494 */, /*25132*/{2127036416u,2016u,65537u,76709986u,1499168u,3767009312u,1719728102u,138465288u,393216u}/* 1D495 */, /*25133*/{2127560704u,2016u,65537u,76709986u,1499168u,3767009312u,1719728358u,138465288u,393216u}/* 1D496 */, /*25134*/{2128084992u,2016u,65537u,76709986u,1499168u,3767009312u,1719728726u,138465288u,393216u}/* 1D497 */, /*25135*/{2128609280u,2016u,65537u,76709986u,1499168u,3767009312u,1719728870u,138465288u,393216u}/* 1D498 */, /*25136*/{2129133568u,2016u,65537u,76709986u,1499168u,3767009312u,1719728950u,138465288u,393216u}/* 1D499 */, /*25137*/{2129657856u,2016u,65537u,76709986u,1499168u,3767009312u,1719729046u,138465288u,393216u}/* 1D49A */, /*25138*/{2130182144u,2016u,65537u,76709986u,1499168u,3767009312u,1719729222u,138465288u,393216u}/* 1D49B */, /*25139*/{2130706432u,2016u,65537u,76709985u,1507360u,3767009312u,1711334774u,138514440u,2490368u}/* 1D49C */, /*25140*/{2131230720u,2016u,65537u,76709985u,1507360u,3767009312u,1711335182u,138514440u,2490368u}/* 1D49E */, /*25141*/{2131755008u,2016u,65537u,76709985u,1507360u,3767009312u,1711335350u,138514440u,2490368u}/* 1D49F */, /*25142*/{2132279296u,2016u,65537u,76709985u,1507360u,3767009312u,1711336158u,138514440u,2490368u}/* 1D4A2 */, /*25143*/{2132803584u,2016u,65537u,76709985u,1507360u,3767009312u,1711336862u,138514440u,2490368u}/* 1D4A5 */, /*25144*/{2133327872u,2016u,65537u,76709985u,1507360u,3767009312u,1711337062u,138514440u,2490368u}/* 1D4A6 */, /*25145*/{2133852160u,2016u,65537u,76709985u,1507360u,3767009312u,1711337734u,138514440u,2490368u}/* 1D4A9 */, /*25146*/{2134376448u,2016u,65537u,76709985u,1507360u,3767009312u,1711338022u,138514440u,2490368u}/* 1D4AA */, /*25147*/{2134900736u,2016u,65537u,76709985u,1507360u,3767009312u,1711338398u,138514440u,2490368u}/* 1D4AB */, /*25148*/{2135425024u,2016u,65537u,76709985u,1507360u,3767009312u,1711338566u,138514440u,2490368u}/* 1D4AC */, /*25149*/{2135949312u,2016u,65537u,76709985u,1507360u,3767009312u,1711339206u,138514440u,2490368u}/* 1D4AE */, /*25150*/{2136473600u,2016u,65537u,76709985u,1507360u,3767009312u,1711339494u,138514440u,2490368u}/* 1D4AF */, /*25151*/{2136997888u,2016u,65537u,76709985u,1507360u,3767009312u,1711339750u,138514440u,2490368u}/* 1D4B0 */, /*25152*/{2137522176u,2016u,65537u,76709985u,1507360u,3767009312u,1711340118u,138514440u,2490368u}/* 1D4B1 */, /*25153*/{2138046464u,2016u,65537u,76709985u,1507360u,3767009312u,1711340262u,138514440u,2490368u}/* 1D4B2 */, /*25154*/{2138570752u,2016u,65537u,76709985u,1507360u,3767009312u,1711340342u,138514440u,2490368u}/* 1D4B3 */, /*25155*/{2139095040u,2016u,65537u,76709985u,1507360u,3767009312u,1711340438u,138514440u,2490368u}/* 1D4B4 */, /*25156*/{2139619328u,2016u,65537u,76709985u,1507360u,3767009312u,1711340614u,138514440u,2490368u}/* 1D4B5 */, /*25157*/{2140143616u,2016u,65537u,76709986u,1499168u,3767009312u,1719723382u,138465288u,393216u}/* 1D4B6 */, /*25158*/{2140667904u,2016u,65537u,76709986u,1499168u,3767009312u,1719723582u,138465288u,393216u}/* 1D4B7 */, /*25159*/{2141192192u,2016u,65537u,76709986u,1499168u,3767009312u,1719723790u,138465288u,393216u}/* 1D4B8 */, /*25160*/{2141716480u,2016u,65537u,76709986u,1499168u,3767009312u,1719723958u,138465288u,393216u}/* 1D4B9 */, /*25161*/{2142240768u,2016u,65537u,76709986u,1499168u,3767009312u,1719724646u,138465288u,393216u}/* 1D4BB */, /*25162*/{2142765056u,2016u,65537u,76709986u,1499168u,3767009312u,1719725054u,138465288u,393216u}/* 1D4BD */, /*25163*/{2143289344u,2016u,65537u,76709986u,1499168u,3767009312u,1719725262u,138465288u,17170432u}/* 1D4BE */, /*25164*/{2143813632u,2016u,65537u,76709986u,1499168u,3767009312u,1719725470u,138465288u,17170432u}/* 1D4BF */, /*25165*/{2144337920u,2016u,65537u,76709986u,1499168u,3767009312u,1719725670u,138465288u,393216u}/* 1D4C0 */, /*25166*/{2144862208u,2016u,65537u,76775522u,1499168u,3767009312u,1719725814u,138465288u,393216u}/* 1D4C1 */, /*25167*/{2145386496u,2016u,65537u,76709986u,1499168u,3767009312u,1719726222u,138465288u,393216u}/* 1D4C2 */, /*25168*/{2145910784u,2016u,65537u,76709986u,1499168u,3767009312u,1719726342u,138465288u,393216u}/* 1D4C3 */, /*25169*/{2146435072u,2016u,65537u,76709986u,1499168u,3767009312u,1719727006u,138465288u,393216u}/* 1D4C5 */, /*25170*/{2146959360u,2016u,65537u,76709986u,1499168u,3767009312u,1719727174u,138465288u,393216u}/* 1D4C6 */, /*25171*/{2147483648u,2016u,65537u,76709986u,1499168u,3767009312u,1719727318u,138465288u,393216u}/* 1D4C7 */, /*25172*/{2148007936u,2016u,65537u,76709986u,1499168u,3767009312u,1719727814u,138465288u,393216u}/* 1D4C8 */, /*25173*/{2148532224u,2016u,65537u,76709986u,1499168u,3767009312u,1719728102u,138465288u,393216u}/* 1D4C9 */, /*25174*/{2149056512u,2016u,65537u,76709986u,1499168u,3767009312u,1719728358u,138465288u,393216u}/* 1D4CA */, /*25175*/{2149580800u,2016u,65537u,76709986u,1499168u,3767009312u,1719728726u,138465288u,393216u}/* 1D4CB */, /*25176*/{2150105088u,2016u,65537u,76709986u,1499168u,3767009312u,1719728870u,138465288u,393216u}/* 1D4CC */, /*25177*/{2150629376u,2016u,65537u,76709986u,1499168u,3767009312u,1719728950u,138465288u,393216u}/* 1D4CD */, /*25178*/{2151153664u,2016u,65537u,76709986u,1499168u,3767009312u,1719729046u,138465288u,393216u}/* 1D4CE */, /*25179*/{2151677952u,2016u,65537u,76709986u,1499168u,3767009312u,1719729222u,138465288u,393216u}/* 1D4CF */, /*25180*/{2152202240u,2016u,65537u,76709985u,1507360u,3767009312u,1711334774u,138514440u,2490368u}/* 1D4D0 */, /*25181*/{2152726528u,2016u,65537u,76709985u,1507360u,3767009312u,1711334974u,138514440u,2490368u}/* 1D4D1 */, /*25182*/{2153250816u,2016u,65537u,76709985u,1507360u,3767009312u,1711335182u,138514440u,2490368u}/* 1D4D2 */, /*25183*/{2153775104u,2016u,65537u,76709985u,1507360u,3767009312u,1711335350u,138514440u,2490368u}/* 1D4D3 */, /*25184*/{2154299392u,2016u,65537u,76709985u,1507360u,3767009312u,1711335566u,138514440u,2490368u}/* 1D4D4 */, /*25185*/{2154823680u,2016u,65537u,76709985u,1507360u,3767009312u,1711336038u,138514440u,2490368u}/* 1D4D5 */, /*25186*/{2155347968u,2016u,65537u,76709985u,1507360u,3767009312u,1711336158u,138514440u,2490368u}/* 1D4D6 */, /*25187*/{2155872256u,2016u,65537u,76709985u,1507360u,3767009312u,1711336446u,138514440u,2490368u}/* 1D4D7 */, /*25188*/{2156396544u,2016u,65537u,76709985u,1507360u,3767009312u,1711336654u,138514440u,2490368u}/* 1D4D8 */, /*25189*/{2156920832u,2016u,65537u,76709985u,1507360u,3767009312u,1711336862u,138514440u,2490368u}/* 1D4D9 */, /*25190*/{2157445120u,2016u,65537u,76709985u,1507360u,3767009312u,1711337062u,138514440u,2490368u}/* 1D4DA */, /*25191*/{2157969408u,2016u,65537u,76709985u,1507360u,3767009312u,1711337206u,138514440u,2490368u}/* 1D4DB */, /*25192*/{2158493696u,2016u,65537u,76709985u,1507360u,3767009312u,1711337614u,138514440u,2490368u}/* 1D4DC */, /*25193*/{2159017984u,2016u,65537u,76709985u,1507360u,3767009312u,1711337734u,138514440u,2490368u}/* 1D4DD */, /*25194*/{2159542272u,2016u,65537u,76709985u,1507360u,3767009312u,1711338022u,138514440u,2490368u}/* 1D4DE */, /*25195*/{2160066560u,2016u,65537u,76709985u,1507360u,3767009312u,1711338398u,138514440u,2490368u}/* 1D4DF */, /*25196*/{2160590848u,2016u,65537u,76709985u,1507360u,3767009312u,1711338566u,138514440u,2490368u}/* 1D4E0 */, /*25197*/{2161115136u,2016u,65537u,76709985u,1507360u,3767009312u,1711338710u,138514440u,2490368u}/* 1D4E1 */, /*25198*/{2161639424u,2016u,65537u,76709985u,1507360u,3767009312u,1711339206u,138514440u,2490368u}/* 1D4E2 */, /*25199*/{2162163712u,2016u,65537u,76709985u,1507360u,3767009312u,1711339494u,138514440u,2490368u}/* 1D4E3 */, /*25200*/{2162688000u,2016u,65537u,76709985u,1507360u,3767009312u,1711339750u,138514440u,2490368u}/* 1D4E4 */, /*25201*/{2163212288u,2016u,65537u,76709985u,1507360u,3767009312u,1711340118u,138514440u,2490368u}/* 1D4E5 */, /*25202*/{2163736576u,2016u,65537u,76709985u,1507360u,3767009312u,1711340262u,138514440u,2490368u}/* 1D4E6 */, /*25203*/{2164260864u,2016u,65537u,76709985u,1507360u,3767009312u,1711340342u,138514440u,2490368u}/* 1D4E7 */, /*25204*/{2164785152u,2016u,65537u,76709985u,1507360u,3767009312u,1711340438u,138514440u,2490368u}/* 1D4E8 */, /*25205*/{2165309440u,2016u,65537u,76709985u,1507360u,3767009312u,1711340614u,138514440u,2490368u}/* 1D4E9 */, /*25206*/{2165833728u,2016u,65537u,76709986u,1499168u,3767009312u,1719723382u,138465288u,393216u}/* 1D4EA */, /*25207*/{2166358016u,2016u,65537u,76709986u,1499168u,3767009312u,1719723582u,138465288u,393216u}/* 1D4EB */, /*25208*/{2166882304u,2016u,65537u,76709986u,1499168u,3767009312u,1719723790u,138465288u,393216u}/* 1D4EC */, /*25209*/{2167406592u,2016u,65537u,76709986u,1499168u,3767009312u,1719723958u,138465288u,393216u}/* 1D4ED */, /*25210*/{2167930880u,2016u,65537u,76709986u,1499168u,3767009312u,1719724174u,138465288u,393216u}/* 1D4EE */, /*25211*/{2168455168u,2016u,65537u,76709986u,1499168u,3767009312u,1719724646u,138465288u,393216u}/* 1D4EF */, /*25212*/{2168979456u,2016u,65537u,76709986u,1499168u,3767009312u,1719724766u,138465288u,393216u}/* 1D4F0 */, /*25213*/{2169503744u,2016u,65537u,76709986u,1499168u,3767009312u,1719725054u,138465288u,393216u}/* 1D4F1 */, /*25214*/{2170028032u,2016u,65537u,76709986u,1499168u,3767009312u,1719725262u,138465288u,17170432u}/* 1D4F2 */, /*25215*/{2170552320u,2016u,65537u,76709986u,1499168u,3767009312u,1719725470u,138465288u,17170432u}/* 1D4F3 */, /*25216*/{2171076608u,2016u,65537u,76709986u,1499168u,3767009312u,1719725670u,138465288u,393216u}/* 1D4F4 */, /*25217*/{2171600896u,2016u,65537u,76709986u,1499168u,3767009312u,1719725814u,138465288u,393216u}/* 1D4F5 */, /*25218*/{2172125184u,2016u,65537u,76709986u,1499168u,3767009312u,1719726222u,138465288u,393216u}/* 1D4F6 */, /*25219*/{2172649472u,2016u,65537u,76709986u,1499168u,3767009312u,1719726342u,138465288u,393216u}/* 1D4F7 */, /*25220*/{2173173760u,2016u,65537u,76709986u,1499168u,3767009312u,1719726630u,138465288u,393216u}/* 1D4F8 */, /*25221*/{2173698048u,2016u,65537u,76709986u,1499168u,3767009312u,1719727006u,138465288u,393216u}/* 1D4F9 */, /*25222*/{2174222336u,2016u,65537u,76709986u,1499168u,3767009312u,1719727174u,138465288u,393216u}/* 1D4FA */, /*25223*/{2174746624u,2016u,65537u,76709986u,1499168u,3767009312u,1719727318u,138465288u,393216u}/* 1D4FB */, /*25224*/{2175270912u,2016u,65537u,76709986u,1499168u,3767009312u,1719727814u,138465288u,393216u}/* 1D4FC */, /*25225*/{2175795200u,2016u,65537u,76709986u,1499168u,3767009312u,1719728102u,138465288u,393216u}/* 1D4FD */, /*25226*/{2176319488u,2016u,65537u,76709986u,1499168u,3767009312u,1719728358u,138465288u,393216u}/* 1D4FE */, /*25227*/{2176843776u,2016u,65537u,76709986u,1499168u,3767009312u,1719728726u,138465288u,393216u}/* 1D4FF */, /*25228*/{2177368064u,2016u,65537u,76709986u,1499168u,3767009312u,1719728870u,138465288u,393216u}/* 1D500 */, /*25229*/{2177892352u,2016u,65537u,76709986u,1499168u,3767009312u,1719728950u,138465288u,393216u}/* 1D501 */, /*25230*/{2178416640u,2016u,65537u,76709986u,1499168u,3767009312u,1719729046u,138465288u,393216u}/* 1D502 */, /*25231*/{2178940928u,2016u,65537u,76709986u,1499168u,3767009312u,1719729222u,138465288u,393216u}/* 1D503 */, /*25232*/{2179465216u,2016u,65537u,76709985u,1507360u,3767009312u,1711334774u,138514440u,2490368u}/* 1D504 */, /*25233*/{2179989504u,2016u,65537u,76709985u,1507360u,3767009312u,1711334974u,138514440u,2490368u}/* 1D505 */, /*25234*/{2180513792u,2016u,65537u,76709985u,1507360u,3767009312u,1711335350u,138514440u,2490368u}/* 1D507 */, /*25235*/{2181038080u,2016u,65537u,76709985u,1507360u,3767009312u,1711335566u,138514440u,2490368u}/* 1D508 */, /*25236*/{2181562368u,2016u,65537u,76709985u,1507360u,3767009312u,1711336038u,138514440u,2490368u}/* 1D509 */, /*25237*/{2182086656u,2016u,65537u,76709985u,1507360u,3767009312u,1711336158u,138514440u,2490368u}/* 1D50A */, /*25238*/{2182610944u,2016u,65537u,76709985u,1507360u,3767009312u,1711336862u,138514440u,2490368u}/* 1D50D */, /*25239*/{2183135232u,2016u,65537u,76709985u,1507360u,3767009312u,1711337062u,138514440u,2490368u}/* 1D50E */, /*25240*/{2183659520u,2016u,65537u,76709985u,1507360u,3767009312u,1711337206u,138514440u,2490368u}/* 1D50F */, /*25241*/{2184183808u,2016u,65537u,76709985u,1507360u,3767009312u,1711337614u,138514440u,2490368u}/* 1D510 */, /*25242*/{2184708096u,2016u,65537u,76709985u,1507360u,3767009312u,1711337734u,138514440u,2490368u}/* 1D511 */, /*25243*/{2185232384u,2016u,65537u,76709985u,1507360u,3767009312u,1711338022u,138514440u,2490368u}/* 1D512 */, /*25244*/{2185756672u,2016u,65537u,76709985u,1507360u,3767009312u,1711338398u,138514440u,2490368u}/* 1D513 */, /*25245*/{2186280960u,2016u,65537u,76709985u,1507360u,3767009312u,1711338566u,138514440u,2490368u}/* 1D514 */, /*25246*/{2186805248u,2016u,65537u,76709985u,1507360u,3767009312u,1711339206u,138514440u,2490368u}/* 1D516 */, /*25247*/{2187329536u,2016u,65537u,76709985u,1507360u,3767009312u,1711339494u,138514440u,2490368u}/* 1D517 */, /*25248*/{2187853824u,2016u,65537u,76709985u,1507360u,3767009312u,1711339750u,138514440u,2490368u}/* 1D518 */, /*25249*/{2188378112u,2016u,65537u,76709985u,1507360u,3767009312u,1711340118u,138514440u,2490368u}/* 1D519 */, /*25250*/{2188902400u,2016u,65537u,76709985u,1507360u,3767009312u,1711340262u,138514440u,2490368u}/* 1D51A */, /*25251*/{2189426688u,2016u,65537u,76709985u,1507360u,3767009312u,1711340342u,138514440u,2490368u}/* 1D51B */, /*25252*/{2189950976u,2016u,65537u,76709985u,1507360u,3767009312u,1711340438u,138514440u,2490368u}/* 1D51C */, /*25253*/{2190475264u,2016u,65537u,76709986u,1499168u,3767009312u,1719723382u,138465288u,393216u}/* 1D51E */, /*25254*/{2190999552u,2016u,65537u,76709986u,1499168u,3767009312u,1719723582u,138465288u,393216u}/* 1D51F */, /*25255*/{2191523840u,2016u,65537u,76709986u,1499168u,3767009312u,1719723790u,138465288u,393216u}/* 1D520 */, /*25256*/{2192048128u,2016u,65537u,76709986u,1499168u,3767009312u,1719723958u,138465288u,393216u}/* 1D521 */, /*25257*/{2192572416u,2016u,65537u,76709986u,1499168u,3767009312u,1719724174u,138465288u,393216u}/* 1D522 */, /*25258*/{2193096704u,2016u,65537u,76709986u,1499168u,3767009312u,1719724646u,138465288u,393216u}/* 1D523 */, /*25259*/{2193620992u,2016u,65537u,76709986u,1499168u,3767009312u,1719724766u,138465288u,393216u}/* 1D524 */, /*25260*/{2194145280u,2016u,65537u,76709986u,1499168u,3767009312u,1719725054u,138465288u,393216u}/* 1D525 */, /*25261*/{2194669568u,2016u,65537u,76709986u,1499168u,3767009312u,1719725262u,138465288u,17170432u}/* 1D526 */, /*25262*/{2195193856u,2016u,65537u,76709986u,1499168u,3767009312u,1719725470u,138465288u,17170432u}/* 1D527 */, /*25263*/{2195718144u,2016u,65537u,76709986u,1499168u,3767009312u,1719725670u,138465288u,393216u}/* 1D528 */, /*25264*/{2196242432u,2016u,65537u,76709986u,1499168u,3767009312u,1719725814u,138465288u,393216u}/* 1D529 */, /*25265*/{2196766720u,2016u,65537u,76709986u,1499168u,3767009312u,1719726222u,138465288u,393216u}/* 1D52A */, /*25266*/{2197291008u,2016u,65537u,76709986u,1499168u,3767009312u,1719726342u,138465288u,393216u}/* 1D52B */, /*25267*/{2197815296u,2016u,65537u,76709986u,1499168u,3767009312u,1719726630u,138465288u,393216u}/* 1D52C */, /*25268*/{2198339584u,2016u,65537u,76709986u,1499168u,3767009312u,1719727006u,138465288u,393216u}/* 1D52D */, /*25269*/{2198863872u,2016u,65537u,76709986u,1499168u,3767009312u,1719727174u,138465288u,393216u}/* 1D52E */, /*25270*/{2199388160u,2016u,65537u,76709986u,1499168u,3767009312u,1719727318u,138465288u,393216u}/* 1D52F */, /*25271*/{2199912448u,2016u,65537u,76709986u,1499168u,3767009312u,1719727814u,138465288u,393216u}/* 1D530 */, /*25272*/{2200436736u,2016u,65537u,76709986u,1499168u,3767009312u,1719728102u,138465288u,393216u}/* 1D531 */, /*25273*/{2200961024u,2016u,65537u,76709986u,1499168u,3767009312u,1719728358u,138465288u,393216u}/* 1D532 */, /*25274*/{2201485312u,2016u,65537u,76709986u,1499168u,3767009312u,1719728726u,138465288u,393216u}/* 1D533 */, /*25275*/{2202009600u,2016u,65537u,76709986u,1499168u,3767009312u,1719728870u,138465288u,393216u}/* 1D534 */, /*25276*/{2202533888u,2016u,65537u,76709986u,1499168u,3767009312u,1719728950u,138465288u,393216u}/* 1D535 */, /*25277*/{2203058176u,2016u,65537u,76709986u,1499168u,3767009312u,1719729046u,138465288u,393216u}/* 1D536 */, /*25278*/{2203582464u,2016u,65537u,76709986u,1499168u,3767009312u,1719729222u,138465288u,393216u}/* 1D537 */, /*25279*/{2204106752u,2016u,65537u,76709985u,1507360u,3767009312u,1711334774u,138514440u,2490368u}/* 1D538 */, /*25280*/{2204631040u,2016u,65537u,76709985u,1507360u,3767009312u,1711334974u,138514440u,2490368u}/* 1D539 */, /*25281*/{2205155328u,2016u,65537u,76709985u,1507360u,3767009312u,1711335350u,138514440u,2490368u}/* 1D53B */, /*25282*/{2205679616u,2016u,65537u,76709985u,1507360u,3767009312u,1711335566u,138514440u,2490368u}/* 1D53C */, /*25283*/{2206203904u,2016u,65537u,76709985u,1507360u,3767009312u,1711336038u,138514440u,2490368u}/* 1D53D */, /*25284*/{2206728192u,2016u,65537u,76709985u,1507360u,3767009312u,1711336158u,138514440u,2490368u}/* 1D53E */, /*25285*/{2207252480u,2016u,65537u,76709985u,1507360u,3767009312u,1711336654u,138514440u,2490368u}/* 1D540 */, /*25286*/{2207776768u,2016u,65537u,76709985u,1507360u,3767009312u,1711336862u,138514440u,2490368u}/* 1D541 */, /*25287*/{2208301056u,2016u,65537u,76709985u,1507360u,3767009312u,1711337062u,138514440u,2490368u}/* 1D542 */, /*25288*/{2208825344u,2016u,65537u,76709985u,1507360u,3767009312u,1711337206u,138514440u,2490368u}/* 1D543 */, /*25289*/{2209349632u,2016u,65537u,76709985u,1507360u,3767009312u,1711337614u,138514440u,2490368u}/* 1D544 */, /*25290*/{2209873920u,2016u,65537u,76709985u,1507360u,3767009312u,1711338022u,138514440u,2490368u}/* 1D546 */, /*25291*/{2210398208u,2016u,65537u,76709985u,1507360u,3767009312u,1711339206u,138514440u,2490368u}/* 1D54A */, /*25292*/{2210922496u,2016u,65537u,76709985u,1507360u,3767009312u,1711339494u,138514440u,2490368u}/* 1D54B */, /*25293*/{2211446784u,2016u,65537u,76709985u,1507360u,3767009312u,1711339750u,138514440u,2490368u}/* 1D54C */, /*25294*/{2211971072u,2016u,65537u,76709985u,1507360u,3767009312u,1711340118u,138514440u,2490368u}/* 1D54D */, /*25295*/{2212495360u,2016u,65537u,76709985u,1507360u,3767009312u,1711340262u,138514440u,2490368u}/* 1D54E */, /*25296*/{2213019648u,2016u,65537u,76709985u,1507360u,3767009312u,1711340342u,138514440u,2490368u}/* 1D54F */, /*25297*/{2213543936u,2016u,65537u,76709985u,1507360u,3767009312u,1711340438u,138514440u,2490368u}/* 1D550 */, /*25298*/{2214068224u,2016u,65537u,76709986u,1499168u,3767009312u,1719723382u,138465288u,393216u}/* 1D552 */, /*25299*/{2214592512u,2016u,65537u,76709986u,1499168u,3767009312u,1719723582u,138465288u,393216u}/* 1D553 */, /*25300*/{2215116800u,2016u,65537u,76709986u,1499168u,3767009312u,1719723790u,138465288u,393216u}/* 1D554 */, /*25301*/{2215641088u,2016u,65537u,76709986u,1499168u,3767009312u,1719723958u,138465288u,393216u}/* 1D555 */, /*25302*/{2216165376u,2016u,65537u,76709986u,1499168u,3767009312u,1719724174u,138465288u,393216u}/* 1D556 */, /*25303*/{2216689664u,2016u,65537u,76709986u,1499168u,3767009312u,1719724646u,138465288u,393216u}/* 1D557 */, /*25304*/{2217213952u,2016u,65537u,76709986u,1499168u,3767009312u,1719724766u,138465288u,393216u}/* 1D558 */, /*25305*/{2217738240u,2016u,65537u,76709986u,1499168u,3767009312u,1719725054u,138465288u,393216u}/* 1D559 */, /*25306*/{2218262528u,2016u,65537u,76709986u,1499168u,3767009312u,1719725262u,138465288u,17170432u}/* 1D55A */, /*25307*/{2218786816u,2016u,65537u,76709986u,1499168u,3767009312u,1719725470u,138465288u,17170432u}/* 1D55B */, /*25308*/{2219311104u,2016u,65537u,76709986u,1499168u,3767009312u,1719725670u,138465288u,393216u}/* 1D55C */, /*25309*/{2219835392u,2016u,65537u,76709986u,1499168u,3767009312u,1719725814u,138465288u,393216u}/* 1D55D */, /*25310*/{2220359680u,2016u,65537u,76709986u,1499168u,3767009312u,1719726222u,138465288u,393216u}/* 1D55E */, /*25311*/{2220883968u,2016u,65537u,76709986u,1499168u,3767009312u,1719726342u,138465288u,393216u}/* 1D55F */, /*25312*/{2221408256u,2016u,65537u,76709986u,1499168u,3767009312u,1719726630u,138465288u,393216u}/* 1D560 */, /*25313*/{2221932544u,2016u,65537u,76709986u,1499168u,3767009312u,1719727006u,138465288u,393216u}/* 1D561 */, /*25314*/{2222456832u,2016u,65537u,76709986u,1499168u,3767009312u,1719727174u,138465288u,393216u}/* 1D562 */, /*25315*/{2222981120u,2016u,65537u,76709986u,1499168u,3767009312u,1719727318u,138465288u,393216u}/* 1D563 */, /*25316*/{2223505408u,2016u,65537u,76709986u,1499168u,3767009312u,1719727814u,138465288u,393216u}/* 1D564 */, /*25317*/{2224029696u,2016u,65537u,76709986u,1499168u,3767009312u,1719728102u,138465288u,393216u}/* 1D565 */, /*25318*/{2224553984u,2016u,65537u,76709986u,1499168u,3767009312u,1719728358u,138465288u,393216u}/* 1D566 */, /*25319*/{2225078272u,2016u,65537u,76709986u,1499168u,3767009312u,1719728726u,138465288u,393216u}/* 1D567 */, /*25320*/{2225602560u,2016u,65537u,76709986u,1499168u,3767009312u,1719728870u,138465288u,393216u}/* 1D568 */, /*25321*/{2226126848u,2016u,65537u,76709986u,1499168u,3767009312u,1719728950u,138465288u,393216u}/* 1D569 */, /*25322*/{2226651136u,2016u,65537u,76709986u,1499168u,3767009312u,1719729046u,138465288u,393216u}/* 1D56A */, /*25323*/{2227175424u,2016u,65537u,76709986u,1499168u,3767009312u,1719729222u,138465288u,393216u}/* 1D56B */, /*25324*/{2227699712u,2016u,65537u,76709985u,1507360u,3767009312u,1711334774u,138514440u,2490368u}/* 1D56C */, /*25325*/{2228224000u,2016u,65537u,76709985u,1507360u,3767009312u,1711334974u,138514440u,2490368u}/* 1D56D */, /*25326*/{2228748288u,2016u,65537u,76709985u,1507360u,3767009312u,1711335182u,138514440u,2490368u}/* 1D56E */, /*25327*/{2229272576u,2016u,65537u,76709985u,1507360u,3767009312u,1711335350u,138514440u,2490368u}/* 1D56F */, /*25328*/{2229796864u,2016u,65537u,76709985u,1507360u,3767009312u,1711335566u,138514440u,2490368u}/* 1D570 */, /*25329*/{2230321152u,2016u,65537u,76709985u,1507360u,3767009312u,1711336038u,138514440u,2490368u}/* 1D571 */, /*25330*/{2230845440u,2016u,65537u,76709985u,1507360u,3767009312u,1711336158u,138514440u,2490368u}/* 1D572 */, /*25331*/{2231369728u,2016u,65537u,76709985u,1507360u,3767009312u,1711336446u,138514440u,2490368u}/* 1D573 */, /*25332*/{2231894016u,2016u,65537u,76709985u,1507360u,3767009312u,1711336654u,138514440u,2490368u}/* 1D574 */, /*25333*/{2232418304u,2016u,65537u,76709985u,1507360u,3767009312u,1711336862u,138514440u,2490368u}/* 1D575 */, /*25334*/{2232942592u,2016u,65537u,76709985u,1507360u,3767009312u,1711337062u,138514440u,2490368u}/* 1D576 */, /*25335*/{2233466880u,2016u,65537u,76709985u,1507360u,3767009312u,1711337206u,138514440u,2490368u}/* 1D577 */, /*25336*/{2233991168u,2016u,65537u,76709985u,1507360u,3767009312u,1711337614u,138514440u,2490368u}/* 1D578 */, /*25337*/{2234515456u,2016u,65537u,76709985u,1507360u,3767009312u,1711337734u,138514440u,2490368u}/* 1D579 */, /*25338*/{2235039744u,2016u,65537u,76709985u,1507360u,3767009312u,1711338022u,138514440u,2490368u}/* 1D57A */, /*25339*/{2235564032u,2016u,65537u,76709985u,1507360u,3767009312u,1711338398u,138514440u,2490368u}/* 1D57B */, /*25340*/{2236088320u,2016u,65537u,76709985u,1507360u,3767009312u,1711338566u,138514440u,2490368u}/* 1D57C */, /*25341*/{2236612608u,2016u,65537u,76709985u,1507360u,3767009312u,1711338710u,138514440u,2490368u}/* 1D57D */, /*25342*/{2237136896u,2016u,65537u,76709985u,1507360u,3767009312u,1711339206u,138514440u,2490368u}/* 1D57E */, /*25343*/{2237661184u,2016u,65537u,76709985u,1507360u,3767009312u,1711339494u,138514440u,2490368u}/* 1D57F */, /*25344*/{2238185472u,2016u,65537u,76709985u,1507360u,3767009312u,1711339750u,138514440u,2490368u}/* 1D580 */, /*25345*/{2238709760u,2016u,65537u,76709985u,1507360u,3767009312u,1711340118u,138514440u,2490368u}/* 1D581 */, /*25346*/{2239234048u,2016u,65537u,76709985u,1507360u,3767009312u,1711340262u,138514440u,2490368u}/* 1D582 */, /*25347*/{2239758336u,2016u,65537u,76709985u,1507360u,3767009312u,1711340342u,138514440u,2490368u}/* 1D583 */, /*25348*/{2240282624u,2016u,65537u,76709985u,1507360u,3767009312u,1711340438u,138514440u,2490368u}/* 1D584 */, /*25349*/{2240806912u,2016u,65537u,76709985u,1507360u,3767009312u,1711340614u,138514440u,2490368u}/* 1D585 */, /*25350*/{2241331200u,2016u,65537u,76709986u,1499168u,3767009312u,1719723382u,138465288u,393216u}/* 1D586 */, /*25351*/{2241855488u,2016u,65537u,76709986u,1499168u,3767009312u,1719723582u,138465288u,393216u}/* 1D587 */, /*25352*/{2242379776u,2016u,65537u,76709986u,1499168u,3767009312u,1719723790u,138465288u,393216u}/* 1D588 */, /*25353*/{2242904064u,2016u,65537u,76709986u,1499168u,3767009312u,1719723958u,138465288u,393216u}/* 1D589 */, /*25354*/{2243428352u,2016u,65537u,76709986u,1499168u,3767009312u,1719724174u,138465288u,393216u}/* 1D58A */, /*25355*/{2243952640u,2016u,65537u,76709986u,1499168u,3767009312u,1719724646u,138465288u,393216u}/* 1D58B */, /*25356*/{2244476928u,2016u,65537u,76709986u,1499168u,3767009312u,1719724766u,138465288u,393216u}/* 1D58C */, /*25357*/{2245001216u,2016u,65537u,76709986u,1499168u,3767009312u,1719725054u,138465288u,393216u}/* 1D58D */, /*25358*/{2245525504u,2016u,65537u,76709986u,1499168u,3767009312u,1719725262u,138465288u,17170432u}/* 1D58E */, /*25359*/{2246049792u,2016u,65537u,76709986u,1499168u,3767009312u,1719725470u,138465288u,17170432u}/* 1D58F */, /*25360*/{2246574080u,2016u,65537u,76709986u,1499168u,3767009312u,1719725670u,138465288u,393216u}/* 1D590 */, /*25361*/{2247098368u,2016u,65537u,76709986u,1499168u,3767009312u,1719725814u,138465288u,393216u}/* 1D591 */, /*25362*/{2247622656u,2016u,65537u,76709986u,1499168u,3767009312u,1719726222u,138465288u,393216u}/* 1D592 */, /*25363*/{2248146944u,2016u,65537u,76709986u,1499168u,3767009312u,1719726342u,138465288u,393216u}/* 1D593 */, /*25364*/{2248671232u,2016u,65537u,76709986u,1499168u,3767009312u,1719726630u,138465288u,393216u}/* 1D594 */, /*25365*/{2249195520u,2016u,65537u,76709986u,1499168u,3767009312u,1719727006u,138465288u,393216u}/* 1D595 */, /*25366*/{2249719808u,2016u,65537u,76709986u,1499168u,3767009312u,1719727174u,138465288u,393216u}/* 1D596 */, /*25367*/{2250244096u,2016u,65537u,76709986u,1499168u,3767009312u,1719727318u,138465288u,393216u}/* 1D597 */, /*25368*/{2250768384u,2016u,65537u,76709986u,1499168u,3767009312u,1719727814u,138465288u,393216u}/* 1D598 */, /*25369*/{2251292672u,2016u,65537u,76709986u,1499168u,3767009312u,1719728102u,138465288u,393216u}/* 1D599 */, /*25370*/{2251816960u,2016u,65537u,76709986u,1499168u,3767009312u,1719728358u,138465288u,393216u}/* 1D59A */, /*25371*/{2252341248u,2016u,65537u,76709986u,1499168u,3767009312u,1719728726u,138465288u,393216u}/* 1D59B */, /*25372*/{2252865536u,2016u,65537u,76709986u,1499168u,3767009312u,1719728870u,138465288u,393216u}/* 1D59C */, /*25373*/{2253389824u,2016u,65537u,76709986u,1499168u,3767009312u,1719728950u,138465288u,393216u}/* 1D59D */, /*25374*/{2253914112u,2016u,65537u,76709986u,1499168u,3767009312u,1719729046u,138465288u,393216u}/* 1D59E */, /*25375*/{2254438400u,2016u,65537u,76709986u,1499168u,3767009312u,1719729222u,138465288u,393216u}/* 1D59F */, /*25376*/{2254962688u,2016u,65537u,76709985u,1507360u,3767009312u,1711334774u,138514440u,2490368u}/* 1D5A0 */, /*25377*/{2255486976u,2016u,65537u,76709985u,1507360u,3767009312u,1711334974u,138514440u,2490368u}/* 1D5A1 */, /*25378*/{2256011264u,2016u,65537u,76709985u,1507360u,3767009312u,1711335182u,138514440u,2490368u}/* 1D5A2 */, /*25379*/{2256535552u,2016u,65537u,76709985u,1507360u,3767009312u,1711335350u,138514440u,2490368u}/* 1D5A3 */, /*25380*/{2257059840u,2016u,65537u,76709985u,1507360u,3767009312u,1711335566u,138514440u,2490368u}/* 1D5A4 */, /*25381*/{2257584128u,2016u,65537u,76709985u,1507360u,3767009312u,1711336038u,138514440u,2490368u}/* 1D5A5 */, /*25382*/{2258108416u,2016u,65537u,76709985u,1507360u,3767009312u,1711336158u,138514440u,2490368u}/* 1D5A6 */, /*25383*/{2258632704u,2016u,65537u,76709985u,1507360u,3767009312u,1711336446u,138514440u,2490368u}/* 1D5A7 */, /*25384*/{2259156992u,2016u,65537u,76709985u,1507360u,3767009312u,1711336654u,138514440u,2490368u}/* 1D5A8 */, /*25385*/{2259681280u,2016u,65537u,76709985u,1507360u,3767009312u,1711336862u,138514440u,2490368u}/* 1D5A9 */, /*25386*/{2260205568u,2016u,65537u,76709985u,1507360u,3767009312u,1711337062u,138514440u,2490368u}/* 1D5AA */, /*25387*/{2260729856u,2016u,65537u,76709985u,1507360u,3767009312u,1711337206u,138514440u,2490368u}/* 1D5AB */, /*25388*/{2261254144u,2016u,65537u,76709985u,1507360u,3767009312u,1711337614u,138514440u,2490368u}/* 1D5AC */, /*25389*/{2261778432u,2016u,65537u,76709985u,1507360u,3767009312u,1711337734u,138514440u,2490368u}/* 1D5AD */, /*25390*/{2262302720u,2016u,65537u,76709985u,1507360u,3767009312u,1711338022u,138514440u,2490368u}/* 1D5AE */, /*25391*/{2262827008u,2016u,65537u,76709985u,1507360u,3767009312u,1711338398u,138514440u,2490368u}/* 1D5AF */, /*25392*/{2263351296u,2016u,65537u,76709985u,1507360u,3767009312u,1711338566u,138514440u,2490368u}/* 1D5B0 */, /*25393*/{2263875584u,2016u,65537u,76709985u,1507360u,3767009312u,1711338710u,138514440u,2490368u}/* 1D5B1 */, /*25394*/{2264399872u,2016u,65537u,76709985u,1507360u,3767009312u,1711339206u,138514440u,2490368u}/* 1D5B2 */, /*25395*/{2264924160u,2016u,65537u,76709985u,1507360u,3767009312u,1711339494u,138514440u,2490368u}/* 1D5B3 */, /*25396*/{2265448448u,2016u,65537u,76709985u,1507360u,3767009312u,1711339750u,138514440u,2490368u}/* 1D5B4 */, /*25397*/{2265972736u,2016u,65537u,76709985u,1507360u,3767009312u,1711340118u,138514440u,2490368u}/* 1D5B5 */, /*25398*/{2266497024u,2016u,65537u,76709985u,1507360u,3767009312u,1711340262u,138514440u,2490368u}/* 1D5B6 */, /*25399*/{2267021312u,2016u,65537u,76709985u,1507360u,3767009312u,1711340342u,138514440u,2490368u}/* 1D5B7 */, /*25400*/{2267545600u,2016u,65537u,76709985u,1507360u,3767009312u,1711340438u,138514440u,2490368u}/* 1D5B8 */, /*25401*/{2268069888u,2016u,65537u,76709985u,1507360u,3767009312u,1711340614u,138514440u,2490368u}/* 1D5B9 */, /*25402*/{2268594176u,2016u,65537u,76709986u,1499168u,3767009312u,1719723382u,138465288u,393216u}/* 1D5BA */, /*25403*/{2269118464u,2016u,65537u,76709986u,1499168u,3767009312u,1719723582u,138465288u,393216u}/* 1D5BB */, /*25404*/{2269642752u,2016u,65537u,76709986u,1499168u,3767009312u,1719723790u,138465288u,393216u}/* 1D5BC */, /*25405*/{2270167040u,2016u,65537u,76709986u,1499168u,3767009312u,1719723958u,138465288u,393216u}/* 1D5BD */, /*25406*/{2270691328u,2016u,65537u,76709986u,1499168u,3767009312u,1719724174u,138465288u,393216u}/* 1D5BE */, /*25407*/{2271215616u,2016u,65537u,76709986u,1499168u,3767009312u,1719724646u,138465288u,393216u}/* 1D5BF */, /*25408*/{2271739904u,2016u,65537u,76709986u,1499168u,3767009312u,1719724766u,138465288u,393216u}/* 1D5C0 */, /*25409*/{2272264192u,2016u,65537u,76709986u,1499168u,3767009312u,1719725054u,138465288u,393216u}/* 1D5C1 */, /*25410*/{2272788480u,2016u,65537u,76709986u,1499168u,3767009312u,1719725262u,138465288u,17170432u}/* 1D5C2 */, /*25411*/{2273312768u,2016u,65537u,76709986u,1499168u,3767009312u,1719725470u,138465288u,17170432u}/* 1D5C3 */, /*25412*/{2273837056u,2016u,65537u,76709986u,1499168u,3767009312u,1719725670u,138465288u,393216u}/* 1D5C4 */, /*25413*/{2274361344u,2016u,65537u,76709986u,1499168u,3767009312u,1719725814u,138465288u,393216u}/* 1D5C5 */, /*25414*/{2274885632u,2016u,65537u,76709986u,1499168u,3767009312u,1719726222u,138465288u,393216u}/* 1D5C6 */, /*25415*/{2275409920u,2016u,65537u,76709986u,1499168u,3767009312u,1719726342u,138465288u,393216u}/* 1D5C7 */, /*25416*/{2275934208u,2016u,65537u,76709986u,1499168u,3767009312u,1719726630u,138465288u,393216u}/* 1D5C8 */, /*25417*/{2276458496u,2016u,65537u,76709986u,1499168u,3767009312u,1719727006u,138465288u,393216u}/* 1D5C9 */, /*25418*/{2276982784u,2016u,65537u,76709986u,1499168u,3767009312u,1719727174u,138465288u,393216u}/* 1D5CA */, /*25419*/{2277507072u,2016u,65537u,76709986u,1499168u,3767009312u,1719727318u,138465288u,393216u}/* 1D5CB */, /*25420*/{2278031360u,2016u,65537u,76709986u,1499168u,3767009312u,1719727814u,138465288u,393216u}/* 1D5CC */, /*25421*/{2278555648u,2016u,65537u,76709986u,1499168u,3767009312u,1719728102u,138465288u,393216u}/* 1D5CD */, /*25422*/{2279079936u,2016u,65537u,76709986u,1499168u,3767009312u,1719728358u,138465288u,393216u}/* 1D5CE */, /*25423*/{2279604224u,2016u,65537u,76709986u,1499168u,3767009312u,1719728726u,138465288u,393216u}/* 1D5CF */, /*25424*/{2280128512u,2016u,65537u,76709986u,1499168u,3767009312u,1719728870u,138465288u,393216u}/* 1D5D0 */, /*25425*/{2280652800u,2016u,65537u,76709986u,1499168u,3767009312u,1719728950u,138465288u,393216u}/* 1D5D1 */, /*25426*/{2281177088u,2016u,65537u,76709986u,1499168u,3767009312u,1719729046u,138465288u,393216u}/* 1D5D2 */, /*25427*/{2281701376u,2016u,65537u,76709986u,1499168u,3767009312u,1719729222u,138465288u,393216u}/* 1D5D3 */, /*25428*/{2282225664u,2016u,65537u,76709985u,1507360u,3767009312u,1711334774u,138514440u,2490368u}/* 1D5D4 */, /*25429*/{2282749952u,2016u,65537u,76709985u,1507360u,3767009312u,1711334974u,138514440u,2490368u}/* 1D5D5 */, /*25430*/{2283274240u,2016u,65537u,76709985u,1507360u,3767009312u,1711335182u,138514440u,2490368u}/* 1D5D6 */, /*25431*/{2283798528u,2016u,65537u,76709985u,1507360u,3767009312u,1711335350u,138514440u,2490368u}/* 1D5D7 */, /*25432*/{2284322816u,2016u,65537u,76709985u,1507360u,3767009312u,1711335566u,138514440u,2490368u}/* 1D5D8 */, /*25433*/{2284847104u,2016u,65537u,76709985u,1507360u,3767009312u,1711336038u,138514440u,2490368u}/* 1D5D9 */, /*25434*/{2285371392u,2016u,65537u,76709985u,1507360u,3767009312u,1711336158u,138514440u,2490368u}/* 1D5DA */, /*25435*/{2285895680u,2016u,65537u,76709985u,1507360u,3767009312u,1711336446u,138514440u,2490368u}/* 1D5DB */, /*25436*/{2286419968u,2016u,65537u,76709985u,1507360u,3767009312u,1711336654u,138514440u,2490368u}/* 1D5DC */, /*25437*/{2286944256u,2016u,65537u,76709985u,1507360u,3767009312u,1711336862u,138514440u,2490368u}/* 1D5DD */, /*25438*/{2287468544u,2016u,65537u,76709985u,1507360u,3767009312u,1711337062u,138514440u,2490368u}/* 1D5DE */, /*25439*/{2287992832u,2016u,65537u,76709985u,1507360u,3767009312u,1711337206u,138514440u,2490368u}/* 1D5DF */, /*25440*/{2288517120u,2016u,65537u,76709985u,1507360u,3767009312u,1711337614u,138514440u,2490368u}/* 1D5E0 */, /*25441*/{2289041408u,2016u,65537u,76709985u,1507360u,3767009312u,1711337734u,138514440u,2490368u}/* 1D5E1 */, /*25442*/{2289565696u,2016u,65537u,76709985u,1507360u,3767009312u,1711338022u,138514440u,2490368u}/* 1D5E2 */, /*25443*/{2290089984u,2016u,65537u,76709985u,1507360u,3767009312u,1711338398u,138514440u,2490368u}/* 1D5E3 */, /*25444*/{2290614272u,2016u,65537u,76709985u,1507360u,3767009312u,1711338566u,138514440u,2490368u}/* 1D5E4 */, /*25445*/{2291138560u,2016u,65537u,76709985u,1507360u,3767009312u,1711338710u,138514440u,2490368u}/* 1D5E5 */, /*25446*/{2291662848u,2016u,65537u,76709985u,1507360u,3767009312u,1711339206u,138514440u,2490368u}/* 1D5E6 */, /*25447*/{2292187136u,2016u,65537u,76709985u,1507360u,3767009312u,1711339494u,138514440u,2490368u}/* 1D5E7 */, /*25448*/{2292711424u,2016u,65537u,76709985u,1507360u,3767009312u,1711339750u,138514440u,2490368u}/* 1D5E8 */, /*25449*/{2293235712u,2016u,65537u,76709985u,1507360u,3767009312u,1711340118u,138514440u,2490368u}/* 1D5E9 */, /*25450*/{2293760000u,2016u,65537u,76709985u,1507360u,3767009312u,1711340262u,138514440u,2490368u}/* 1D5EA */, /*25451*/{2294284288u,2016u,65537u,76709985u,1507360u,3767009312u,1711340342u,138514440u,2490368u}/* 1D5EB */, /*25452*/{2294808576u,2016u,65537u,76709985u,1507360u,3767009312u,1711340438u,138514440u,2490368u}/* 1D5EC */, /*25453*/{2295332864u,2016u,65537u,76709985u,1507360u,3767009312u,1711340614u,138514440u,2490368u}/* 1D5ED */, /*25454*/{2295857152u,2016u,65537u,76709986u,1499168u,3767009312u,1719723382u,138465288u,393216u}/* 1D5EE */, /*25455*/{2296381440u,2016u,65537u,76709986u,1499168u,3767009312u,1719723582u,138465288u,393216u}/* 1D5EF */, /*25456*/{2296905728u,2016u,65537u,76709986u,1499168u,3767009312u,1719723790u,138465288u,393216u}/* 1D5F0 */, /*25457*/{2297430016u,2016u,65537u,76709986u,1499168u,3767009312u,1719723958u,138465288u,393216u}/* 1D5F1 */, /*25458*/{2297954304u,2016u,65537u,76709986u,1499168u,3767009312u,1719724174u,138465288u,393216u}/* 1D5F2 */, /*25459*/{2298478592u,2016u,65537u,76709986u,1499168u,3767009312u,1719724646u,138465288u,393216u}/* 1D5F3 */, /*25460*/{2299002880u,2016u,65537u,76709986u,1499168u,3767009312u,1719724766u,138465288u,393216u}/* 1D5F4 */, /*25461*/{2299527168u,2016u,65537u,76709986u,1499168u,3767009312u,1719725054u,138465288u,393216u}/* 1D5F5 */, /*25462*/{2300051456u,2016u,65537u,76709986u,1499168u,3767009312u,1719725262u,138465288u,17170432u}/* 1D5F6 */, /*25463*/{2300575744u,2016u,65537u,76709986u,1499168u,3767009312u,1719725470u,138465288u,17170432u}/* 1D5F7 */, /*25464*/{2301100032u,2016u,65537u,76709986u,1499168u,3767009312u,1719725670u,138465288u,393216u}/* 1D5F8 */, /*25465*/{2301624320u,2016u,65537u,76709986u,1499168u,3767009312u,1719725814u,138465288u,393216u}/* 1D5F9 */, /*25466*/{2302148608u,2016u,65537u,76709986u,1499168u,3767009312u,1719726222u,138465288u,393216u}/* 1D5FA */, /*25467*/{2302672896u,2016u,65537u,76709986u,1499168u,3767009312u,1719726342u,138465288u,393216u}/* 1D5FB */, /*25468*/{2303197184u,2016u,65537u,76709986u,1499168u,3767009312u,1719726630u,138465288u,393216u}/* 1D5FC */, /*25469*/{2303721472u,2016u,65537u,76709986u,1499168u,3767009312u,1719727006u,138465288u,393216u}/* 1D5FD */, /*25470*/{2304245760u,2016u,65537u,76709986u,1499168u,3767009312u,1719727174u,138465288u,393216u}/* 1D5FE */, /*25471*/{2304770048u,2016u,65537u,76709986u,1499168u,3767009312u,1719727318u,138465288u,393216u}/* 1D5FF */, /*25472*/{2305294336u,2016u,65537u,76709986u,1499168u,3767009312u,1719727814u,138465288u,393216u}/* 1D600 */, /*25473*/{2305818624u,2016u,65537u,76709986u,1499168u,3767009312u,1719728102u,138465288u,393216u}/* 1D601 */, /*25474*/{2306342912u,2016u,65537u,76709986u,1499168u,3767009312u,1719728358u,138465288u,393216u}/* 1D602 */, /*25475*/{2306867200u,2016u,65537u,76709986u,1499168u,3767009312u,1719728726u,138465288u,393216u}/* 1D603 */, /*25476*/{2307391488u,2016u,65537u,76709986u,1499168u,3767009312u,1719728870u,138465288u,393216u}/* 1D604 */, /*25477*/{2307915776u,2016u,65537u,76709986u,1499168u,3767009312u,1719728950u,138465288u,393216u}/* 1D605 */, /*25478*/{2308440064u,2016u,65537u,76709986u,1499168u,3767009312u,1719729046u,138465288u,393216u}/* 1D606 */, /*25479*/{2308964352u,2016u,65537u,76709986u,1499168u,3767009312u,1719729222u,138465288u,393216u}/* 1D607 */, /*25480*/{2309488640u,2016u,65537u,76709985u,1507360u,3767009312u,1711334774u,138514440u,2490368u}/* 1D608 */, /*25481*/{2310012928u,2016u,65537u,76709985u,1507360u,3767009312u,1711334974u,138514440u,2490368u}/* 1D609 */, /*25482*/{2310537216u,2016u,65537u,76709985u,1507360u,3767009312u,1711335182u,138514440u,2490368u}/* 1D60A */, /*25483*/{2311061504u,2016u,65537u,76709985u,1507360u,3767009312u,1711335350u,138514440u,2490368u}/* 1D60B */, /*25484*/{2311585792u,2016u,65537u,76709985u,1507360u,3767009312u,1711335566u,138514440u,2490368u}/* 1D60C */, /*25485*/{2312110080u,2016u,65537u,76709985u,1507360u,3767009312u,1711336038u,138514440u,2490368u}/* 1D60D */, /*25486*/{2312634368u,2016u,65537u,76709985u,1507360u,3767009312u,1711336158u,138514440u,2490368u}/* 1D60E */, /*25487*/{2313158656u,2016u,65537u,76709985u,1507360u,3767009312u,1711336446u,138514440u,2490368u}/* 1D60F */, /*25488*/{2313682944u,2016u,65537u,76709985u,1507360u,3767009312u,1711336654u,138514440u,2490368u}/* 1D610 */, /*25489*/{2314207232u,2016u,65537u,76709985u,1507360u,3767009312u,1711336862u,138514440u,2490368u}/* 1D611 */, /*25490*/{2314731520u,2016u,65537u,76709985u,1507360u,3767009312u,1711337062u,138514440u,2490368u}/* 1D612 */, /*25491*/{2315255808u,2016u,65537u,76709985u,1507360u,3767009312u,1711337206u,138514440u,2490368u}/* 1D613 */, /*25492*/{2315780096u,2016u,65537u,76709985u,1507360u,3767009312u,1711337614u,138514440u,2490368u}/* 1D614 */, /*25493*/{2316304384u,2016u,65537u,76709985u,1507360u,3767009312u,1711337734u,138514440u,2490368u}/* 1D615 */, /*25494*/{2316828672u,2016u,65537u,76709985u,1507360u,3767009312u,1711338022u,138514440u,2490368u}/* 1D616 */, /*25495*/{2317352960u,2016u,65537u,76709985u,1507360u,3767009312u,1711338398u,138514440u,2490368u}/* 1D617 */, /*25496*/{2317877248u,2016u,65537u,76709985u,1507360u,3767009312u,1711338566u,138514440u,2490368u}/* 1D618 */, /*25497*/{2318401536u,2016u,65537u,76709985u,1507360u,3767009312u,1711338710u,138514440u,2490368u}/* 1D619 */, /*25498*/{2318925824u,2016u,65537u,76709985u,1507360u,3767009312u,1711339206u,138514440u,2490368u}/* 1D61A */, /*25499*/{2319450112u,2016u,65537u,76709985u,1507360u,3767009312u,1711339494u,138514440u,2490368u}/* 1D61B */, /*25500*/{2319974400u,2016u,65537u,76709985u,1507360u,3767009312u,1711339750u,138514440u,2490368u}/* 1D61C */, /*25501*/{2320498688u,2016u,65537u,76709985u,1507360u,3767009312u,1711340118u,138514440u,2490368u}/* 1D61D */, /*25502*/{2321022976u,2016u,65537u,76709985u,1507360u,3767009312u,1711340262u,138514440u,2490368u}/* 1D61E */, /*25503*/{2321547264u,2016u,65537u,76709985u,1507360u,3767009312u,1711340342u,138514440u,2490368u}/* 1D61F */, /*25504*/{2322071552u,2016u,65537u,76709985u,1507360u,3767009312u,1711340438u,138514440u,2490368u}/* 1D620 */, /*25505*/{2322595840u,2016u,65537u,76709985u,1507360u,3767009312u,1711340614u,138514440u,2490368u}/* 1D621 */, /*25506*/{2323120128u,2016u,65537u,76709986u,1499168u,3767009312u,1719723382u,138465288u,393216u}/* 1D622 */, /*25507*/{2323644416u,2016u,65537u,76709986u,1499168u,3767009312u,1719723582u,138465288u,393216u}/* 1D623 */, /*25508*/{2324168704u,2016u,65537u,76709986u,1499168u,3767009312u,1719723790u,138465288u,393216u}/* 1D624 */, /*25509*/{2324692992u,2016u,65537u,76709986u,1499168u,3767009312u,1719723958u,138465288u,393216u}/* 1D625 */, /*25510*/{2325217280u,2016u,65537u,76709986u,1499168u,3767009312u,1719724174u,138465288u,393216u}/* 1D626 */, /*25511*/{2325741568u,2016u,65537u,76709986u,1499168u,3767009312u,1719724646u,138465288u,393216u}/* 1D627 */, /*25512*/{2326265856u,2016u,65537u,76709986u,1499168u,3767009312u,1719724766u,138465288u,393216u}/* 1D628 */, /*25513*/{2326790144u,2016u,65537u,76709986u,1499168u,3767009312u,1719725054u,138465288u,393216u}/* 1D629 */, /*25514*/{2327314432u,2016u,65537u,76709986u,1499168u,3767009312u,1719725262u,138465288u,17170432u}/* 1D62A */, /*25515*/{2327838720u,2016u,65537u,76709986u,1499168u,3767009312u,1719725470u,138465288u,17170432u}/* 1D62B */, /*25516*/{2328363008u,2016u,65537u,76709986u,1499168u,3767009312u,1719725670u,138465288u,393216u}/* 1D62C */, /*25517*/{2328887296u,2016u,65537u,76709986u,1499168u,3767009312u,1719725814u,138465288u,393216u}/* 1D62D */, /*25518*/{2329411584u,2016u,65537u,76709986u,1499168u,3767009312u,1719726222u,138465288u,393216u}/* 1D62E */, /*25519*/{2329935872u,2016u,65537u,76709986u,1499168u,3767009312u,1719726342u,138465288u,393216u}/* 1D62F */, /*25520*/{2330460160u,2016u,65537u,76709986u,1499168u,3767009312u,1719726630u,138465288u,393216u}/* 1D630 */, /*25521*/{2330984448u,2016u,65537u,76709986u,1499168u,3767009312u,1719727006u,138465288u,393216u}/* 1D631 */, /*25522*/{2331508736u,2016u,65537u,76709986u,1499168u,3767009312u,1719727174u,138465288u,393216u}/* 1D632 */, /*25523*/{2332033024u,2016u,65537u,76709986u,1499168u,3767009312u,1719727318u,138465288u,393216u}/* 1D633 */, /*25524*/{2332557312u,2016u,65537u,76709986u,1499168u,3767009312u,1719727814u,138465288u,393216u}/* 1D634 */, /*25525*/{2333081600u,2016u,65537u,76709986u,1499168u,3767009312u,1719728102u,138465288u,393216u}/* 1D635 */, /*25526*/{2333605888u,2016u,65537u,76709986u,1499168u,3767009312u,1719728358u,138465288u,393216u}/* 1D636 */, /*25527*/{2334130176u,2016u,65537u,76709986u,1499168u,3767009312u,1719728726u,138465288u,393216u}/* 1D637 */, /*25528*/{2334654464u,2016u,65537u,76709986u,1499168u,3767009312u,1719728870u,138465288u,393216u}/* 1D638 */, /*25529*/{2335178752u,2016u,65537u,76709986u,1499168u,3767009312u,1719728950u,138465288u,393216u}/* 1D639 */, /*25530*/{2335703040u,2016u,65537u,76709986u,1499168u,3767009312u,1719729046u,138465288u,393216u}/* 1D63A */, /*25531*/{2336227328u,2016u,65537u,76709986u,1499168u,3767009312u,1719729222u,138465288u,393216u}/* 1D63B */, /*25532*/{2336751616u,2016u,65537u,76709985u,1507360u,3767009312u,1711334774u,138514440u,2490368u}/* 1D63C */, /*25533*/{2337275904u,2016u,65537u,76709985u,1507360u,3767009312u,1711334974u,138514440u,2490368u}/* 1D63D */, /*25534*/{2337800192u,2016u,65537u,76709985u,1507360u,3767009312u,1711335182u,138514440u,2490368u}/* 1D63E */, /*25535*/{2338324480u,2016u,65537u,76709985u,1507360u,3767009312u,1711335350u,138514440u,2490368u}/* 1D63F */, /*25536*/{2338848768u,2016u,65537u,76709985u,1507360u,3767009312u,1711335566u,138514440u,2490368u}/* 1D640 */, /*25537*/{2339373056u,2016u,65537u,76709985u,1507360u,3767009312u,1711336038u,138514440u,2490368u}/* 1D641 */, /*25538*/{2339897344u,2016u,65537u,76709985u,1507360u,3767009312u,1711336158u,138514440u,2490368u}/* 1D642 */, /*25539*/{2340421632u,2016u,65537u,76709985u,1507360u,3767009312u,1711336446u,138514440u,2490368u}/* 1D643 */, /*25540*/{2340945920u,2016u,65537u,76709985u,1507360u,3767009312u,1711336654u,138514440u,2490368u}/* 1D644 */, /*25541*/{2341470208u,2016u,65537u,76709985u,1507360u,3767009312u,1711336862u,138514440u,2490368u}/* 1D645 */, /*25542*/{2341994496u,2016u,65537u,76709985u,1507360u,3767009312u,1711337062u,138514440u,2490368u}/* 1D646 */, /*25543*/{2342518784u,2016u,65537u,76709985u,1507360u,3767009312u,1711337206u,138514440u,2490368u}/* 1D647 */, /*25544*/{2343043072u,2016u,65537u,76709985u,1507360u,3767009312u,1711337614u,138514440u,2490368u}/* 1D648 */, /*25545*/{2343567360u,2016u,65537u,76709985u,1507360u,3767009312u,1711337734u,138514440u,2490368u}/* 1D649 */, /*25546*/{2344091648u,2016u,65537u,76709985u,1507360u,3767009312u,1711338022u,138514440u,2490368u}/* 1D64A */, /*25547*/{2344615936u,2016u,65537u,76709985u,1507360u,3767009312u,1711338398u,138514440u,2490368u}/* 1D64B */, /*25548*/{2345140224u,2016u,65537u,76709985u,1507360u,3767009312u,1711338566u,138514440u,2490368u}/* 1D64C */, /*25549*/{2345664512u,2016u,65537u,76709985u,1507360u,3767009312u,1711338710u,138514440u,2490368u}/* 1D64D */, /*25550*/{2346188800u,2016u,65537u,76709985u,1507360u,3767009312u,1711339206u,138514440u,2490368u}/* 1D64E */, /*25551*/{2346713088u,2016u,65537u,76709985u,1507360u,3767009312u,1711339494u,138514440u,2490368u}/* 1D64F */, /*25552*/{2347237376u,2016u,65537u,76709985u,1507360u,3767009312u,1711339750u,138514440u,2490368u}/* 1D650 */, /*25553*/{2347761664u,2016u,65537u,76709985u,1507360u,3767009312u,1711340118u,138514440u,2490368u}/* 1D651 */, /*25554*/{2348285952u,2016u,65537u,76709985u,1507360u,3767009312u,1711340262u,138514440u,2490368u}/* 1D652 */, /*25555*/{2348810240u,2016u,65537u,76709985u,1507360u,3767009312u,1711340342u,138514440u,2490368u}/* 1D653 */, /*25556*/{2349334528u,2016u,65537u,76709985u,1507360u,3767009312u,1711340438u,138514440u,2490368u}/* 1D654 */, /*25557*/{2349858816u,2016u,65537u,76709985u,1507360u,3767009312u,1711340614u,138514440u,2490368u}/* 1D655 */, /*25558*/{2350383104u,2016u,65537u,76709986u,1499168u,3767009312u,1719723382u,138465288u,393216u}/* 1D656 */, /*25559*/{2350907392u,2016u,65537u,76709986u,1499168u,3767009312u,1719723582u,138465288u,393216u}/* 1D657 */, /*25560*/{2351431680u,2016u,65537u,76709986u,1499168u,3767009312u,1719723790u,138465288u,393216u}/* 1D658 */, /*25561*/{2351955968u,2016u,65537u,76709986u,1499168u,3767009312u,1719723958u,138465288u,393216u}/* 1D659 */, /*25562*/{2352480256u,2016u,65537u,76709986u,1499168u,3767009312u,1719724174u,138465288u,393216u}/* 1D65A */, /*25563*/{2353004544u,2016u,65537u,76709986u,1499168u,3767009312u,1719724646u,138465288u,393216u}/* 1D65B */, /*25564*/{2353528832u,2016u,65537u,76709986u,1499168u,3767009312u,1719724766u,138465288u,393216u}/* 1D65C */, /*25565*/{2354053120u,2016u,65537u,76709986u,1499168u,3767009312u,1719725054u,138465288u,393216u}/* 1D65D */, /*25566*/{2354577408u,2016u,65537u,76709986u,1499168u,3767009312u,1719725262u,138465288u,17170432u}/* 1D65E */, /*25567*/{2355101696u,2016u,65537u,76709986u,1499168u,3767009312u,1719725470u,138465288u,17170432u}/* 1D65F */, /*25568*/{2355625984u,2016u,65537u,76709986u,1499168u,3767009312u,1719725670u,138465288u,393216u}/* 1D660 */, /*25569*/{2356150272u,2016u,65537u,76709986u,1499168u,3767009312u,1719725814u,138465288u,393216u}/* 1D661 */, /*25570*/{2356674560u,2016u,65537u,76709986u,1499168u,3767009312u,1719726222u,138465288u,393216u}/* 1D662 */, /*25571*/{2357198848u,2016u,65537u,76709986u,1499168u,3767009312u,1719726342u,138465288u,393216u}/* 1D663 */, /*25572*/{2357723136u,2016u,65537u,76709986u,1499168u,3767009312u,1719726630u,138465288u,393216u}/* 1D664 */, /*25573*/{2358247424u,2016u,65537u,76709986u,1499168u,3767009312u,1719727006u,138465288u,393216u}/* 1D665 */, /*25574*/{2358771712u,2016u,65537u,76709986u,1499168u,3767009312u,1719727174u,138465288u,393216u}/* 1D666 */, /*25575*/{2359296000u,2016u,65537u,76709986u,1499168u,3767009312u,1719727318u,138465288u,393216u}/* 1D667 */, /*25576*/{2359820288u,2016u,65537u,76709986u,1499168u,3767009312u,1719727814u,138465288u,393216u}/* 1D668 */, /*25577*/{2360344576u,2016u,65537u,76709986u,1499168u,3767009312u,1719728102u,138465288u,393216u}/* 1D669 */, /*25578*/{2360868864u,2016u,65537u,76709986u,1499168u,3767009312u,1719728358u,138465288u,393216u}/* 1D66A */, /*25579*/{2361393152u,2016u,65537u,76709986u,1499168u,3767009312u,1719728726u,138465288u,393216u}/* 1D66B */, /*25580*/{2361917440u,2016u,65537u,76709986u,1499168u,3767009312u,1719728870u,138465288u,393216u}/* 1D66C */, /*25581*/{2362441728u,2016u,65537u,76709986u,1499168u,3767009312u,1719728950u,138465288u,393216u}/* 1D66D */, /*25582*/{2362966016u,2016u,65537u,76709986u,1499168u,3767009312u,1719729046u,138465288u,393216u}/* 1D66E */, /*25583*/{2363490304u,2016u,65537u,76709986u,1499168u,3767009312u,1719729222u,138465288u,393216u}/* 1D66F */, /*25584*/{2364014592u,2016u,65537u,76709985u,1507360u,3767009312u,1711334774u,138514440u,2490368u}/* 1D670 */, /*25585*/{2364538880u,2016u,65537u,76709985u,1507360u,3767009312u,1711334974u,138514440u,2490368u}/* 1D671 */, /*25586*/{2365063168u,2016u,65537u,76709985u,1507360u,3767009312u,1711335182u,138514440u,2490368u}/* 1D672 */, /*25587*/{2365587456u,2016u,65537u,76709985u,1507360u,3767009312u,1711335350u,138514440u,2490368u}/* 1D673 */, /*25588*/{2366111744u,2016u,65537u,76709985u,1507360u,3767009312u,1711335566u,138514440u,2490368u}/* 1D674 */, /*25589*/{2366636032u,2016u,65537u,76709985u,1507360u,3767009312u,1711336038u,138514440u,2490368u}/* 1D675 */, /*25590*/{2367160320u,2016u,65537u,76709985u,1507360u,3767009312u,1711336158u,138514440u,2490368u}/* 1D676 */, /*25591*/{2367684608u,2016u,65537u,76709985u,1507360u,3767009312u,1711336446u,138514440u,2490368u}/* 1D677 */, /*25592*/{2368208896u,2016u,65537u,76709985u,1507360u,3767009312u,1711336654u,138514440u,2490368u}/* 1D678 */, /*25593*/{2368733184u,2016u,65537u,76709985u,1507360u,3767009312u,1711336862u,138514440u,2490368u}/* 1D679 */, /*25594*/{2369257472u,2016u,65537u,76709985u,1507360u,3767009312u,1711337062u,138514440u,2490368u}/* 1D67A */, /*25595*/{2369781760u,2016u,65537u,76709985u,1507360u,3767009312u,1711337206u,138514440u,2490368u}/* 1D67B */, /*25596*/{2370306048u,2016u,65537u,76709985u,1507360u,3767009312u,1711337614u,138514440u,2490368u}/* 1D67C */, /*25597*/{2370830336u,2016u,65537u,76709985u,1507360u,3767009312u,1711337734u,138514440u,2490368u}/* 1D67D */, /*25598*/{2371354624u,2016u,65537u,76709985u,1507360u,3767009312u,1711338022u,138514440u,2490368u}/* 1D67E */, /*25599*/{2371878912u,2016u,65537u,76709985u,1507360u,3767009312u,1711338398u,138514440u,2490368u}/* 1D67F */, /*25600*/{2372403200u,2016u,65537u,76709985u,1507360u,3767009312u,1711338566u,138514440u,2490368u}/* 1D680 */, /*25601*/{2372927488u,2016u,65537u,76709985u,1507360u,3767009312u,1711338710u,138514440u,2490368u}/* 1D681 */, /*25602*/{2373451776u,2016u,65537u,76709985u,1507360u,3767009312u,1711339206u,138514440u,2490368u}/* 1D682 */, /*25603*/{2373976064u,2016u,65537u,76709985u,1507360u,3767009312u,1711339494u,138514440u,2490368u}/* 1D683 */, /*25604*/{2374500352u,2016u,65537u,76709985u,1507360u,3767009312u,1711339750u,138514440u,2490368u}/* 1D684 */, /*25605*/{2375024640u,2016u,65537u,76709985u,1507360u,3767009312u,1711340118u,138514440u,2490368u}/* 1D685 */, /*25606*/{2375548928u,2016u,65537u,76709985u,1507360u,3767009312u,1711340262u,138514440u,2490368u}/* 1D686 */, /*25607*/{2376073216u,2016u,65537u,76709985u,1507360u,3767009312u,1711340342u,138514440u,2490368u}/* 1D687 */, /*25608*/{2376597504u,2016u,65537u,76709985u,1507360u,3767009312u,1711340438u,138514440u,2490368u}/* 1D688 */, /*25609*/{2377121792u,2016u,65537u,76709985u,1507360u,3767009312u,1711340614u,138514440u,2490368u}/* 1D689 */, /*25610*/{2377646080u,2016u,65537u,76709986u,1499168u,3767009312u,1719723382u,138465288u,393216u}/* 1D68A */, /*25611*/{2378170368u,2016u,65537u,76709986u,1499168u,3767009312u,1719723582u,138465288u,393216u}/* 1D68B */, /*25612*/{2378694656u,2016u,65537u,76709986u,1499168u,3767009312u,1719723790u,138465288u,393216u}/* 1D68C */, /*25613*/{2379218944u,2016u,65537u,76709986u,1499168u,3767009312u,1719723958u,138465288u,393216u}/* 1D68D */, /*25614*/{2379743232u,2016u,65537u,76709986u,1499168u,3767009312u,1719724174u,138465288u,393216u}/* 1D68E */, /*25615*/{2380267520u,2016u,65537u,76709986u,1499168u,3767009312u,1719724646u,138465288u,393216u}/* 1D68F */, /*25616*/{2380791808u,2016u,65537u,76709986u,1499168u,3767009312u,1719724766u,138465288u,393216u}/* 1D690 */, /*25617*/{2381316096u,2016u,65537u,76709986u,1499168u,3767009312u,1719725054u,138465288u,393216u}/* 1D691 */, /*25618*/{2381840384u,2016u,65537u,76709986u,1499168u,3767009312u,1719725262u,138465288u,17170432u}/* 1D692 */, /*25619*/{2382364672u,2016u,65537u,76709986u,1499168u,3767009312u,1719725470u,138465288u,17170432u}/* 1D693 */, /*25620*/{2382888960u,2016u,65537u,76709986u,1499168u,3767009312u,1719725670u,138465288u,393216u}/* 1D694 */, /*25621*/{2383413248u,2016u,65537u,76709986u,1499168u,3767009312u,1719725814u,138465288u,393216u}/* 1D695 */, /*25622*/{2383937536u,2016u,65537u,76709986u,1499168u,3767009312u,1719726222u,138465288u,393216u}/* 1D696 */, /*25623*/{2384461824u,2016u,65537u,76709986u,1499168u,3767009312u,1719726342u,138465288u,393216u}/* 1D697 */, /*25624*/{2384986112u,2016u,65537u,76709986u,1499168u,3767009312u,1719726630u,138465288u,393216u}/* 1D698 */, /*25625*/{2385510400u,2016u,65537u,76709986u,1499168u,3767009312u,1719727006u,138465288u,393216u}/* 1D699 */, /*25626*/{2386034688u,2016u,65537u,76709986u,1499168u,3767009312u,1719727174u,138465288u,393216u}/* 1D69A */, /*25627*/{2386558976u,2016u,65537u,76709986u,1499168u,3767009312u,1719727318u,138465288u,393216u}/* 1D69B */, /*25628*/{2387083264u,2016u,65537u,76709986u,1499168u,3767009312u,1719727814u,138465288u,393216u}/* 1D69C */, /*25629*/{2387607552u,2016u,65537u,76709986u,1499168u,3767009312u,1719728102u,138465288u,393216u}/* 1D69D */, /*25630*/{2388131840u,2016u,65537u,76709986u,1499168u,3767009312u,1719728358u,138465288u,393216u}/* 1D69E */, /*25631*/{2388656128u,2016u,65537u,76709986u,1499168u,3767009312u,1719728726u,138465288u,393216u}/* 1D69F */, /*25632*/{2389180416u,2016u,65537u,76709986u,1499168u,3767009312u,1719728870u,138465288u,393216u}/* 1D6A0 */, /*25633*/{2389704704u,2016u,65537u,76709986u,1499168u,3767009312u,1719728950u,138465288u,393216u}/* 1D6A1 */, /*25634*/{2390228992u,2016u,65537u,76709986u,1499168u,3767009312u,1719729046u,138465288u,393216u}/* 1D6A2 */, /*25635*/{2390753280u,2016u,65537u,76709986u,1499168u,3767009312u,1719729222u,138465288u,393216u}/* 1D6A3 */, /*25636*/{2391277568u,2016u,65537u,76808290u,1499168u,3767009312u,1719725294u,138465288u,393216u}/* 1D6A4 */, /*25637*/{2391801856u,2016u,65537u,76808290u,1499168u,3767009312u,1719725502u,138465288u,393216u}/* 1D6A5 */, /*25638*/{2392326144u,2016u,65537u,76709985u,1507360u,3767009312u,1711341830u,138514440u,2490368u}/* 1D6A8 */, /*25639*/{2392850432u,2016u,65537u,76709985u,1507360u,3767009312u,1711341838u,138514440u,2490368u}/* 1D6A9 */, /*25640*/{2393374720u,2016u,65537u,76709985u,1507360u,3767009312u,1711341846u,138514440u,2490368u}/* 1D6AA */, /*25641*/{2393899008u,2016u,65537u,76709985u,1507360u,3767009312u,1711341862u,138514440u,2490368u}/* 1D6AB */, /*25642*/{2394423296u,2016u,65537u,76709985u,1507360u,3767009312u,1711341870u,138514440u,2490368u}/* 1D6AC */, /*25643*/{2394947584u,2016u,65537u,76709985u,1507360u,3767009312u,1711341902u,138514440u,2490368u}/* 1D6AD */, /*25644*/{2395471872u,2016u,65537u,76709985u,1507360u,3767009312u,1711341918u,138514440u,2490368u}/* 1D6AE */, /*25645*/{2395996160u,2016u,65537u,76709985u,1507360u,3767009312u,1711341926u,138514440u,2490368u}/* 1D6AF */, /*25646*/{2396520448u,2016u,65537u,76709985u,1507360u,3767009312u,1711341934u,138514440u,2490368u}/* 1D6B0 */, /*25647*/{2397044736u,2016u,65537u,76709985u,1507360u,3767009312u,1711341950u,138514440u,2490368u}/* 1D6B1 */, /*25648*/{2397569024u,2016u,65537u,76709985u,1507360u,3767009312u,1711341958u,138514440u,2490368u}/* 1D6B2 */, /*25649*/{2398093312u,2016u,65537u,76709985u,1507360u,3767009312u,1711341974u,138514440u,2490368u}/* 1D6B3 */, /*25650*/{2398617600u,2016u,65537u,76709985u,1507360u,3767009312u,1711341982u,138514440u,2490368u}/* 1D6B4 */, /*25651*/{2399141888u,2016u,65537u,76709985u,1507360u,3767009312u,1711341990u,138514440u,2490368u}/* 1D6B5 */, /*25652*/{2399666176u,2016u,65537u,76709985u,1507360u,3767009312u,1711341998u,138514440u,2490368u}/* 1D6B6 */, /*25653*/{2400190464u,2016u,65537u,76709985u,1507360u,3767009312u,1711342006u,138514440u,2490368u}/* 1D6B7 */, /*25654*/{2400714752u,2016u,65537u,76709985u,1507360u,3767009312u,1711342046u,138514440u,2490368u}/* 1D6B8 */, /*25655*/{2401239040u,2016u,65537u,76709985u,1507360u,3767009312u,1711341926u,138514440u,2490368u}/* 1D6B9 */, /*25656*/{2401763328u,2016u,65537u,76709985u,1507360u,3767009312u,1711342070u,138514440u,2490368u}/* 1D6BA */, /*25657*/{2402287616u,2016u,65537u,76709985u,1507360u,3767009312u,1711342102u,138514440u,2490368u}/* 1D6BB */, /*25658*/{2402811904u,2016u,65537u,76709985u,1507360u,3767009312u,1711342110u,138514440u,2490368u}/* 1D6BC */, /*25659*/{2403336192u,2016u,65537u,76709985u,1507360u,3767009312u,1711342118u,138514440u,2490368u}/* 1D6BD */, /*25660*/{2403860480u,2016u,65537u,76709985u,1507360u,3767009312u,1711342126u,138514440u,2490368u}/* 1D6BE */, /*25661*/{2404384768u,2016u,65537u,76709985u,1507360u,3767009312u,1711342134u,138514440u,2490368u}/* 1D6BF */, /*25662*/{2404909056u,2016u,65537u,76709985u,1507360u,3767009312u,1711342150u,138514440u,2490368u}/* 1D6C0 */, /*25663*/{2405433344u,2016u,65537u,76710008u,32u,1611137056u,12574u,138465280u,67108864u}/* 1D6C1 */, /*25664*/{2405957632u,2016u,65537u,76709986u,1499168u,3767009312u,1719730438u,138465288u,393216u}/* 1D6C2 */, /*25665*/{2406481920u,2016u,65537u,76709986u,1499168u,3767009312u,1719730446u,138465288u,393216u}/* 1D6C3 */, /*25666*/{2407006208u,2016u,65537u,76709986u,1499168u,3767009312u,1719730454u,138465288u,393216u}/* 1D6C4 */, /*25667*/{2407530496u,2016u,65537u,76709986u,1499168u,3767009312u,1719730470u,138465288u,393216u}/* 1D6C5 */, /*25668*/{2408054784u,2016u,65537u,76709986u,1499168u,3767009312u,1719730478u,138465288u,393216u}/* 1D6C6 */, /*25669*/{2408579072u,2016u,65537u,76709986u,1499168u,3767009312u,1719730510u,138465288u,393216u}/* 1D6C7 */, /*25670*/{2409103360u,2016u,65537u,76709986u,1499168u,3767009312u,1719730526u,138465288u,393216u}/* 1D6C8 */, /*25671*/{2409627648u,2016u,65537u,76709986u,1499168u,3767009312u,1719730534u,138465288u,393216u}/* 1D6C9 */, /*25672*/{2410151936u,2016u,65537u,76709986u,1499168u,3767009312u,1719730542u,138465288u,393216u}/* 1D6CA */, /*25673*/{2410676224u,2016u,65537u,76709986u,1499168u,3767009312u,1719730558u,138465288u,393216u}/* 1D6CB */, /*25674*/{2411200512u,2016u,65537u,76709986u,1499168u,3767009312u,1719730566u,138465288u,393216u}/* 1D6CC */, /*25675*/{2411724800u,2016u,65537u,76709986u,1499168u,3767009312u,1719730582u,138465288u,393216u}/* 1D6CD */, /*25676*/{2412249088u,2016u,65537u,76709986u,1499168u,3767009312u,1719730590u,138465288u,393216u}/* 1D6CE */, /*25677*/{2412773376u,2016u,65537u,76709986u,1499168u,3767009312u,1719730598u,138465288u,393216u}/* 1D6CF */, /*25678*/{2413297664u,2016u,65537u,76709986u,1499168u,3767009312u,1719730606u,138465288u,393216u}/* 1D6D0 */, /*25679*/{2413821952u,2016u,65537u,76709986u,1499168u,3767009312u,1719730614u,138465288u,393216u}/* 1D6D1 */, /*25680*/{2414346240u,2016u,65537u,76709986u,1499168u,3767009312u,1719730654u,138465288u,393216u}/* 1D6D2 */, /*25681*/{2414870528u,2016u,65537u,76709986u,1499168u,3767009312u,1719730678u,138465288u,393216u}/* 1D6D3 */, /*25682*/{2415394816u,2016u,65537u,76709986u,1499168u,3767009312u,1719730678u,138465288u,393216u}/* 1D6D4 */, /*25683*/{2415919104u,2016u,65537u,76709986u,1499168u,3767009312u,1719730710u,138465288u,393216u}/* 1D6D5 */, /*25684*/{2416443392u,2016u,65537u,76709986u,1499168u,3767009312u,1719730718u,138465288u,393216u}/* 1D6D6 */, /*25685*/{2416967680u,2016u,65537u,76709986u,1499168u,3767009312u,1719730726u,138465288u,393216u}/* 1D6D7 */, /*25686*/{2417491968u,2016u,65537u,76709986u,1499168u,3767009312u,1719730734u,138465288u,393216u}/* 1D6D8 */, /*25687*/{2418016256u,2016u,65537u,76709986u,1499168u,3767009312u,1719730742u,138465288u,393216u}/* 1D6D9 */, /*25688*/{2418540544u,2016u,65537u,76709986u,1499168u,3767009312u,1719730758u,138465288u,393216u}/* 1D6DA */, /*25689*/{2419064832u,2016u,65537u,76720248u,32u,1745354784u,12542u,138465280u,67108864u}/* 1D6DB */, /*25690*/{2419589120u,2016u,65537u,76709986u,1499168u,3767009312u,1719730478u,138465288u,393216u}/* 1D6DC */, /*25691*/{2420113408u,2016u,65537u,76709986u,1499168u,3767009312u,1719730534u,138465288u,393216u}/* 1D6DD */, /*25692*/{2420637696u,2016u,65537u,76709986u,1499168u,3767009312u,1719730558u,138465288u,393216u}/* 1D6DE */, /*25693*/{2421161984u,2016u,65537u,76709986u,1499168u,3767009312u,1719730726u,138465288u,393216u}/* 1D6DF */, /*25694*/{2421686272u,2016u,65537u,76709986u,1499168u,3767009312u,1719730654u,138465288u,393216u}/* 1D6E0 */, /*25695*/{2422210560u,2016u,65537u,76709986u,1499168u,3767009312u,1719730614u,138465288u,393216u}/* 1D6E1 */, /*25696*/{2422734848u,2016u,65537u,76709985u,1507360u,3767009312u,1711341830u,138514440u,2490368u}/* 1D6E2 */, /*25697*/{2423259136u,2016u,65537u,76709985u,1507360u,3767009312u,1711341838u,138514440u,2490368u}/* 1D6E3 */, /*25698*/{2423783424u,2016u,65537u,76709985u,1507360u,3767009312u,1711341846u,138514440u,2490368u}/* 1D6E4 */, /*25699*/{2424307712u,2016u,65537u,76709985u,1507360u,3767009312u,1711341862u,138514440u,2490368u}/* 1D6E5 */, /*25700*/{2424832000u,2016u,65537u,76709985u,1507360u,3767009312u,1711341870u,138514440u,2490368u}/* 1D6E6 */, /*25701*/{2425356288u,2016u,65537u,76709985u,1507360u,3767009312u,1711341902u,138514440u,2490368u}/* 1D6E7 */, /*25702*/{2425880576u,2016u,65537u,76709985u,1507360u,3767009312u,1711341918u,138514440u,2490368u}/* 1D6E8 */, /*25703*/{2426404864u,2016u,65537u,76709985u,1507360u,3767009312u,1711341926u,138514440u,2490368u}/* 1D6E9 */, /*25704*/{2426929152u,2016u,65537u,76709985u,1507360u,3767009312u,1711341934u,138514440u,2490368u}/* 1D6EA */, /*25705*/{2427453440u,2016u,65537u,76709985u,1507360u,3767009312u,1711341950u,138514440u,2490368u}/* 1D6EB */, /*25706*/{2427977728u,2016u,65537u,76709985u,1507360u,3767009312u,1711341958u,138514440u,2490368u}/* 1D6EC */, /*25707*/{2428502016u,2016u,65537u,76709985u,1507360u,3767009312u,1711341974u,138514440u,2490368u}/* 1D6ED */, /*25708*/{2429026304u,2016u,65537u,76709985u,1507360u,3767009312u,1711341982u,138514440u,2490368u}/* 1D6EE */, /*25709*/{2429550592u,2016u,65537u,76709985u,1507360u,3767009312u,1711341990u,138514440u,2490368u}/* 1D6EF */, /*25710*/{2430074880u,2016u,65537u,76709985u,1507360u,3767009312u,1711341998u,138514440u,2490368u}/* 1D6F0 */, /*25711*/{2430599168u,2016u,65537u,76709985u,1507360u,3767009312u,1711342006u,138514440u,2490368u}/* 1D6F1 */, /*25712*/{2431123456u,2016u,65537u,76709985u,1507360u,3767009312u,1711342046u,138514440u,2490368u}/* 1D6F2 */, /*25713*/{2431647744u,2016u,65537u,76709985u,1507360u,3767009312u,1711341926u,138514440u,2490368u}/* 1D6F3 */, /*25714*/{2432172032u,2016u,65537u,76709985u,1507360u,3767009312u,1711342070u,138514440u,2490368u}/* 1D6F4 */, /*25715*/{2432696320u,2016u,65537u,76709985u,1507360u,3767009312u,1711342102u,138514440u,2490368u}/* 1D6F5 */, /*25716*/{2433220608u,2016u,65537u,76709985u,1507360u,3767009312u,1711342110u,138514440u,2490368u}/* 1D6F6 */, /*25717*/{2433744896u,2016u,65537u,76709985u,1507360u,3767009312u,1711342118u,138514440u,2490368u}/* 1D6F7 */, /*25718*/{2434269184u,2016u,65537u,76709985u,1507360u,3767009312u,1711342126u,138514440u,2490368u}/* 1D6F8 */, /*25719*/{2434793472u,2016u,65537u,76709985u,1507360u,3767009312u,1711342134u,138514440u,2490368u}/* 1D6F9 */, /*25720*/{2435317760u,2016u,65537u,76709985u,1507360u,3767009312u,1711342150u,138514440u,2490368u}/* 1D6FA */, /*25721*/{2435842048u,2016u,65537u,76710008u,32u,1611137056u,12574u,138465280u,67108864u}/* 1D6FB */, /*25722*/{2436366336u,2016u,65537u,76709986u,1499168u,3767009312u,1719730438u,138465288u,393216u}/* 1D6FC */, /*25723*/{2436890624u,2016u,65537u,76709986u,1499168u,3767009312u,1719730446u,138465288u,393216u}/* 1D6FD */, /*25724*/{2437414912u,2016u,65537u,76709986u,1499168u,3767009312u,1719730454u,138465288u,393216u}/* 1D6FE */, /*25725*/{2437939200u,2016u,65537u,76709986u,1499168u,3767009312u,1719730470u,138465288u,393216u}/* 1D6FF */, /*25726*/{2438463488u,2016u,65537u,76709986u,1499168u,3767009312u,1719730478u,138465288u,393216u}/* 1D700 */, /*25727*/{2438987776u,2016u,65537u,76709986u,1499168u,3767009312u,1719730510u,138465288u,393216u}/* 1D701 */, /*25728*/{2439512064u,2016u,65537u,76709986u,1499168u,3767009312u,1719730526u,138465288u,393216u}/* 1D702 */, /*25729*/{2440036352u,2016u,65537u,76709986u,1499168u,3767009312u,1719730534u,138465288u,393216u}/* 1D703 */, /*25730*/{2440560640u,2016u,65537u,76709986u,1499168u,3767009312u,1719730542u,138465288u,393216u}/* 1D704 */, /*25731*/{2441084928u,2016u,65537u,76709986u,1499168u,3767009312u,1719730558u,138465288u,393216u}/* 1D705 */, /*25732*/{2441609216u,2016u,65537u,76709986u,1499168u,3767009312u,1719730566u,138465288u,393216u}/* 1D706 */, /*25733*/{2442133504u,2016u,65537u,76709986u,1499168u,3767009312u,1719730582u,138465288u,393216u}/* 1D707 */, /*25734*/{2442657792u,2016u,65537u,76709986u,1499168u,3767009312u,1719730590u,138465288u,393216u}/* 1D708 */, /*25735*/{2443182080u,2016u,65537u,76709986u,1499168u,3767009312u,1719730598u,138465288u,393216u}/* 1D709 */, /*25736*/{2443706368u,2016u,65537u,76709986u,1499168u,3767009312u,1719730606u,138465288u,393216u}/* 1D70A */, /*25737*/{2444230656u,2016u,65537u,76709986u,1499168u,3767009312u,1719730614u,138465288u,393216u}/* 1D70B */, /*25738*/{2444754944u,2016u,65537u,76709986u,1499168u,3767009312u,1719730654u,138465288u,393216u}/* 1D70C */, /*25739*/{2445279232u,2016u,65537u,76709986u,1499168u,3767009312u,1719730678u,138465288u,393216u}/* 1D70D */, /*25740*/{2445803520u,2016u,65537u,76709986u,1499168u,3767009312u,1719730678u,138465288u,393216u}/* 1D70E */, /*25741*/{2446327808u,2016u,65537u,76709986u,1499168u,3767009312u,1719730710u,138465288u,393216u}/* 1D70F */, /*25742*/{2446852096u,2016u,65537u,76709986u,1499168u,3767009312u,1719730718u,138465288u,393216u}/* 1D710 */, /*25743*/{2447376384u,2016u,65537u,76709986u,1499168u,3767009312u,1719730726u,138465288u,393216u}/* 1D711 */, /*25744*/{2447900672u,2016u,65537u,76709986u,1499168u,3767009312u,1719730734u,138465288u,393216u}/* 1D712 */, /*25745*/{2448424960u,2016u,65537u,76709986u,1499168u,3767009312u,1719730742u,138465288u,393216u}/* 1D713 */, /*25746*/{2448949248u,2016u,65537u,76709986u,1499168u,3767009312u,1719730758u,138465288u,393216u}/* 1D714 */, /*25747*/{2449473536u,2016u,65537u,76720248u,32u,1745354784u,12542u,138465280u,67108864u}/* 1D715 */, /*25748*/{2449997824u,2016u,65537u,76709986u,1499168u,3767009312u,1719730478u,138465288u,393216u}/* 1D716 */, /*25749*/{2450522112u,2016u,65537u,76709986u,1499168u,3767009312u,1719730534u,138465288u,393216u}/* 1D717 */, /*25750*/{2451046400u,2016u,65537u,76709986u,1499168u,3767009312u,1719730558u,138465288u,393216u}/* 1D718 */, /*25751*/{2451570688u,2016u,65537u,76709986u,1499168u,3767009312u,1719730726u,138465288u,393216u}/* 1D719 */, /*25752*/{2452094976u,2016u,65537u,76709986u,1499168u,3767009312u,1719730654u,138465288u,393216u}/* 1D71A */, /*25753*/{2452619264u,2016u,65537u,76709986u,1499168u,3767009312u,1719730614u,138465288u,393216u}/* 1D71B */, /*25754*/{2453143552u,2016u,65537u,76709985u,1507360u,3767009312u,1711341830u,138514440u,2490368u}/* 1D71C */, /*25755*/{2453667840u,2016u,65537u,76709985u,1507360u,3767009312u,1711341838u,138514440u,2490368u}/* 1D71D */, /*25756*/{2454192128u,2016u,65537u,76709985u,1507360u,3767009312u,1711341846u,138514440u,2490368u}/* 1D71E */, /*25757*/{2454716416u,2016u,65537u,76709985u,1507360u,3767009312u,1711341862u,138514440u,2490368u}/* 1D71F */, /*25758*/{2455240704u,2016u,65537u,76709985u,1507360u,3767009312u,1711341870u,138514440u,2490368u}/* 1D720 */, /*25759*/{2455764992u,2016u,65537u,76709985u,1507360u,3767009312u,1711341902u,138514440u,2490368u}/* 1D721 */, /*25760*/{2456289280u,2016u,65537u,76709985u,1507360u,3767009312u,1711341918u,138514440u,2490368u}/* 1D722 */, /*25761*/{2456813568u,2016u,65537u,76709985u,1507360u,3767009312u,1711341926u,138514440u,2490368u}/* 1D723 */, /*25762*/{2457337856u,2016u,65537u,76709985u,1507360u,3767009312u,1711341934u,138514440u,2490368u}/* 1D724 */, /*25763*/{2457862144u,2016u,65537u,76709985u,1507360u,3767009312u,1711341950u,138514440u,2490368u}/* 1D725 */, /*25764*/{2458386432u,2016u,65537u,76709985u,1507360u,3767009312u,1711341958u,138514440u,2490368u}/* 1D726 */, /*25765*/{2458910720u,2016u,65537u,76709985u,1507360u,3767009312u,1711341974u,138514440u,2490368u}/* 1D727 */, /*25766*/{2459435008u,2016u,65537u,76709985u,1507360u,3767009312u,1711341982u,138514440u,2490368u}/* 1D728 */, /*25767*/{2459959296u,2016u,65537u,76709985u,1507360u,3767009312u,1711341990u,138514440u,2490368u}/* 1D729 */, /*25768*/{2460483584u,2016u,65537u,76709985u,1507360u,3767009312u,1711341998u,138514440u,2490368u}/* 1D72A */, /*25769*/{2461007872u,2016u,65537u,76709985u,1507360u,3767009312u,1711342006u,138514440u,2490368u}/* 1D72B */, /*25770*/{2461532160u,2016u,65537u,76709985u,1507360u,3767009312u,1711342046u,138514440u,2490368u}/* 1D72C */, /*25771*/{2462056448u,2016u,65537u,76709985u,1507360u,3767009312u,1711341926u,138514440u,2490368u}/* 1D72D */, /*25772*/{2462580736u,2016u,65537u,76709985u,1507360u,3767009312u,1711342070u,138514440u,2490368u}/* 1D72E */, /*25773*/{2463105024u,2016u,65537u,76709985u,1507360u,3767009312u,1711342102u,138514440u,2490368u}/* 1D72F */, /*25774*/{2463629312u,2016u,65537u,76709985u,1507360u,3767009312u,1711342110u,138514440u,2490368u}/* 1D730 */, /*25775*/{2464153600u,2016u,65537u,76709985u,1507360u,3767009312u,1711342118u,138514440u,2490368u}/* 1D731 */, /*25776*/{2464677888u,2016u,65537u,76709985u,1507360u,3767009312u,1711342126u,138514440u,2490368u}/* 1D732 */, /*25777*/{2465202176u,2016u,65537u,76709985u,1507360u,3767009312u,1711342134u,138514440u,2490368u}/* 1D733 */, /*25778*/{2465726464u,2016u,65537u,76709985u,1507360u,3767009312u,1711342150u,138514440u,2490368u}/* 1D734 */, /*25779*/{2466250752u,2016u,65537u,76710008u,32u,1611137056u,12574u,138465280u,67108864u}/* 1D735 */, /*25780*/{2466775040u,2016u,65537u,76709986u,1499168u,3767009312u,1719730438u,138465288u,393216u}/* 1D736 */, /*25781*/{2467299328u,2016u,65537u,76709986u,1499168u,3767009312u,1719730446u,138465288u,393216u}/* 1D737 */, /*25782*/{2467823616u,2016u,65537u,76709986u,1499168u,3767009312u,1719730454u,138465288u,393216u}/* 1D738 */, /*25783*/{2468347904u,2016u,65537u,76709986u,1499168u,3767009312u,1719730470u,138465288u,393216u}/* 1D739 */, /*25784*/{2468872192u,2016u,65537u,76709986u,1499168u,3767009312u,1719730478u,138465288u,393216u}/* 1D73A */, /*25785*/{2469396480u,2016u,65537u,76709986u,1499168u,3767009312u,1719730510u,138465288u,393216u}/* 1D73B */, /*25786*/{2469920768u,2016u,65537u,76709986u,1499168u,3767009312u,1719730526u,138465288u,393216u}/* 1D73C */, /*25787*/{2470445056u,2016u,65537u,76709986u,1499168u,3767009312u,1719730534u,138465288u,393216u}/* 1D73D */, /*25788*/{2470969344u,2016u,65537u,76709986u,1499168u,3767009312u,1719730542u,138465288u,393216u}/* 1D73E */, /*25789*/{2471493632u,2016u,65537u,76709986u,1499168u,3767009312u,1719730558u,138465288u,393216u}/* 1D73F */, /*25790*/{2472017920u,2016u,65537u,76709986u,1499168u,3767009312u,1719730566u,138465288u,393216u}/* 1D740 */, /*25791*/{2472542208u,2016u,65537u,76709986u,1499168u,3767009312u,1719730582u,138465288u,393216u}/* 1D741 */, /*25792*/{2473066496u,2016u,65537u,76709986u,1499168u,3767009312u,1719730590u,138465288u,393216u}/* 1D742 */, /*25793*/{2473590784u,2016u,65537u,76709986u,1499168u,3767009312u,1719730598u,138465288u,393216u}/* 1D743 */, /*25794*/{2474115072u,2016u,65537u,76709986u,1499168u,3767009312u,1719730606u,138465288u,393216u}/* 1D744 */, /*25795*/{2474639360u,2016u,65537u,76709986u,1499168u,3767009312u,1719730614u,138465288u,393216u}/* 1D745 */, /*25796*/{2475163648u,2016u,65537u,76709986u,1499168u,3767009312u,1719730654u,138465288u,393216u}/* 1D746 */, /*25797*/{2475687936u,2016u,65537u,76709986u,1499168u,3767009312u,1719730678u,138465288u,393216u}/* 1D747 */, /*25798*/{2476212224u,2016u,65537u,76709986u,1499168u,3767009312u,1719730678u,138465288u,393216u}/* 1D748 */, /*25799*/{2476736512u,2016u,65537u,76709986u,1499168u,3767009312u,1719730710u,138465288u,393216u}/* 1D749 */, /*25800*/{2477260800u,2016u,65537u,76709986u,1499168u,3767009312u,1719730718u,138465288u,393216u}/* 1D74A */, /*25801*/{2477785088u,2016u,65537u,76709986u,1499168u,3767009312u,1719730726u,138465288u,393216u}/* 1D74B */, /*25802*/{2478309376u,2016u,65537u,76709986u,1499168u,3767009312u,1719730734u,138465288u,393216u}/* 1D74C */, /*25803*/{2478833664u,2016u,65537u,76709986u,1499168u,3767009312u,1719730742u,138465288u,393216u}/* 1D74D */, /*25804*/{2479357952u,2016u,65537u,76709986u,1499168u,3767009312u,1719730758u,138465288u,393216u}/* 1D74E */, /*25805*/{2479882240u,2016u,65537u,76720248u,32u,1745354784u,12542u,138465280u,67108864u}/* 1D74F */, /*25806*/{2480406528u,2016u,65537u,76709986u,1499168u,3767009312u,1719730478u,138465288u,393216u}/* 1D750 */, /*25807*/{2480930816u,2016u,65537u,76709986u,1499168u,3767009312u,1719730534u,138465288u,393216u}/* 1D751 */, /*25808*/{2481455104u,2016u,65537u,76709986u,1499168u,3767009312u,1719730558u,138465288u,393216u}/* 1D752 */, /*25809*/{2481979392u,2016u,65537u,76709986u,1499168u,3767009312u,1719730726u,138465288u,393216u}/* 1D753 */, /*25810*/{2482503680u,2016u,65537u,76709986u,1499168u,3767009312u,1719730654u,138465288u,393216u}/* 1D754 */, /*25811*/{2483027968u,2016u,65537u,76709986u,1499168u,3767009312u,1719730614u,138465288u,393216u}/* 1D755 */, /*25812*/{2483552256u,2016u,65537u,76709985u,1507360u,3767009312u,1711341830u,138514440u,2490368u}/* 1D756 */, /*25813*/{2484076544u,2016u,65537u,76709985u,1507360u,3767009312u,1711341838u,138514440u,2490368u}/* 1D757 */, /*25814*/{2484600832u,2016u,65537u,76709985u,1507360u,3767009312u,1711341846u,138514440u,2490368u}/* 1D758 */, /*25815*/{2485125120u,2016u,65537u,76709985u,1507360u,3767009312u,1711341862u,138514440u,2490368u}/* 1D759 */, /*25816*/{2485649408u,2016u,65537u,76709985u,1507360u,3767009312u,1711341870u,138514440u,2490368u}/* 1D75A */, /*25817*/{2486173696u,2016u,65537u,76709985u,1507360u,3767009312u,1711341902u,138514440u,2490368u}/* 1D75B */, /*25818*/{2486697984u,2016u,65537u,76709985u,1507360u,3767009312u,1711341918u,138514440u,2490368u}/* 1D75C */, /*25819*/{2487222272u,2016u,65537u,76709985u,1507360u,3767009312u,1711341926u,138514440u,2490368u}/* 1D75D */, /*25820*/{2487746560u,2016u,65537u,76709985u,1507360u,3767009312u,1711341934u,138514440u,2490368u}/* 1D75E */, /*25821*/{2488270848u,2016u,65537u,76709985u,1507360u,3767009312u,1711341950u,138514440u,2490368u}/* 1D75F */, /*25822*/{2488795136u,2016u,65537u,76709985u,1507360u,3767009312u,1711341958u,138514440u,2490368u}/* 1D760 */, /*25823*/{2489319424u,2016u,65537u,76709985u,1507360u,3767009312u,1711341974u,138514440u,2490368u}/* 1D761 */, /*25824*/{2489843712u,2016u,65537u,76709985u,1507360u,3767009312u,1711341982u,138514440u,2490368u}/* 1D762 */, /*25825*/{2490368000u,2016u,65537u,76709985u,1507360u,3767009312u,1711341990u,138514440u,2490368u}/* 1D763 */, /*25826*/{2490892288u,2016u,65537u,76709985u,1507360u,3767009312u,1711341998u,138514440u,2490368u}/* 1D764 */, /*25827*/{2491416576u,2016u,65537u,76709985u,1507360u,3767009312u,1711342006u,138514440u,2490368u}/* 1D765 */, /*25828*/{2491940864u,2016u,65537u,76709985u,1507360u,3767009312u,1711342046u,138514440u,2490368u}/* 1D766 */, /*25829*/{2492465152u,2016u,65537u,76709985u,1507360u,3767009312u,1711341926u,138514440u,2490368u}/* 1D767 */, /*25830*/{2492989440u,2016u,65537u,76709985u,1507360u,3767009312u,1711342070u,138514440u,2490368u}/* 1D768 */, /*25831*/{2493513728u,2016u,65537u,76709985u,1507360u,3767009312u,1711342102u,138514440u,2490368u}/* 1D769 */, /*25832*/{2494038016u,2016u,65537u,76709985u,1507360u,3767009312u,1711342110u,138514440u,2490368u}/* 1D76A */, /*25833*/{2494562304u,2016u,65537u,76709985u,1507360u,3767009312u,1711342118u,138514440u,2490368u}/* 1D76B */, /*25834*/{2495086592u,2016u,65537u,76709985u,1507360u,3767009312u,1711342126u,138514440u,2490368u}/* 1D76C */, /*25835*/{2495610880u,2016u,65537u,76709985u,1507360u,3767009312u,1711342134u,138514440u,2490368u}/* 1D76D */, /*25836*/{2496135168u,2016u,65537u,76709985u,1507360u,3767009312u,1711342150u,138514440u,2490368u}/* 1D76E */, /*25837*/{2496659456u,2016u,65537u,76710008u,32u,1611137056u,12574u,138465280u,67108864u}/* 1D76F */, /*25838*/{2497183744u,2016u,65537u,76709986u,1499168u,3767009312u,1719730438u,138465288u,393216u}/* 1D770 */, /*25839*/{2497708032u,2016u,65537u,76709986u,1499168u,3767009312u,1719730446u,138465288u,393216u}/* 1D771 */, /*25840*/{2498232320u,2016u,65537u,76709986u,1499168u,3767009312u,1719730454u,138465288u,393216u}/* 1D772 */, /*25841*/{2498756608u,2016u,65537u,76709986u,1499168u,3767009312u,1719730470u,138465288u,393216u}/* 1D773 */, /*25842*/{2499280896u,2016u,65537u,76709986u,1499168u,3767009312u,1719730478u,138465288u,393216u}/* 1D774 */, /*25843*/{2499805184u,2016u,65537u,76709986u,1499168u,3767009312u,1719730510u,138465288u,393216u}/* 1D775 */, /*25844*/{2500329472u,2016u,65537u,76709986u,1499168u,3767009312u,1719730526u,138465288u,393216u}/* 1D776 */, /*25845*/{2500853760u,2016u,65537u,76709986u,1499168u,3767009312u,1719730534u,138465288u,393216u}/* 1D777 */, /*25846*/{2501378048u,2016u,65537u,76709986u,1499168u,3767009312u,1719730542u,138465288u,393216u}/* 1D778 */, /*25847*/{2501902336u,2016u,65537u,76709986u,1499168u,3767009312u,1719730558u,138465288u,393216u}/* 1D779 */, /*25848*/{2502426624u,2016u,65537u,76709986u,1499168u,3767009312u,1719730566u,138465288u,393216u}/* 1D77A */, /*25849*/{2502950912u,2016u,65537u,76709986u,1499168u,3767009312u,1719730582u,138465288u,393216u}/* 1D77B */, /*25850*/{2503475200u,2016u,65537u,76709986u,1499168u,3767009312u,1719730590u,138465288u,393216u}/* 1D77C */, /*25851*/{2503999488u,2016u,65537u,76709986u,1499168u,3767009312u,1719730598u,138465288u,393216u}/* 1D77D */, /*25852*/{2504523776u,2016u,65537u,76709986u,1499168u,3767009312u,1719730606u,138465288u,393216u}/* 1D77E */, /*25853*/{2505048064u,2016u,65537u,76709986u,1499168u,3767009312u,1719730614u,138465288u,393216u}/* 1D77F */, /*25854*/{2505572352u,2016u,65537u,76709986u,1499168u,3767009312u,1719730654u,138465288u,393216u}/* 1D780 */, /*25855*/{2506096640u,2016u,65537u,76709986u,1499168u,3767009312u,1719730678u,138465288u,393216u}/* 1D781 */, /*25856*/{2506620928u,2016u,65537u,76709986u,1499168u,3767009312u,1719730678u,138465288u,393216u}/* 1D782 */, /*25857*/{2507145216u,2016u,65537u,76709986u,1499168u,3767009312u,1719730710u,138465288u,393216u}/* 1D783 */, /*25858*/{2507669504u,2016u,65537u,76709986u,1499168u,3767009312u,1719730718u,138465288u,393216u}/* 1D784 */, /*25859*/{2508193792u,2016u,65537u,76709986u,1499168u,3767009312u,1719730726u,138465288u,393216u}/* 1D785 */, /*25860*/{2508718080u,2016u,65537u,76709986u,1499168u,3767009312u,1719730734u,138465288u,393216u}/* 1D786 */, /*25861*/{2509242368u,2016u,65537u,76709986u,1499168u,3767009312u,1719730742u,138465288u,393216u}/* 1D787 */, /*25862*/{2509766656u,2016u,65537u,76709986u,1499168u,3767009312u,1719730758u,138465288u,393216u}/* 1D788 */, /*25863*/{2510290944u,2016u,65537u,76720248u,32u,1745354784u,12542u,138465280u,67108864u}/* 1D789 */, /*25864*/{2510815232u,2016u,65537u,76709986u,1499168u,3767009312u,1719730478u,138465288u,393216u}/* 1D78A */, /*25865*/{2511339520u,2016u,65537u,76709986u,1499168u,3767009312u,1719730534u,138465288u,393216u}/* 1D78B */, /*25866*/{2511863808u,2016u,65537u,76709986u,1499168u,3767009312u,1719730558u,138465288u,393216u}/* 1D78C */, /*25867*/{2512388096u,2016u,65537u,76709986u,1499168u,3767009312u,1719730726u,138465288u,393216u}/* 1D78D */, /*25868*/{2512912384u,2016u,65537u,76709986u,1499168u,3767009312u,1719730654u,138465288u,393216u}/* 1D78E */, /*25869*/{2513436672u,2016u,65537u,76709986u,1499168u,3767009312u,1719730614u,138465288u,393216u}/* 1D78F */, /*25870*/{2513960960u,2016u,65537u,76709985u,1507360u,3767009312u,1711341830u,138514440u,2490368u}/* 1D790 */, /*25871*/{2514485248u,2016u,65537u,76709985u,1507360u,3767009312u,1711341838u,138514440u,2490368u}/* 1D791 */, /*25872*/{2515009536u,2016u,65537u,76709985u,1507360u,3767009312u,1711341846u,138514440u,2490368u}/* 1D792 */, /*25873*/{2515533824u,2016u,65537u,76709985u,1507360u,3767009312u,1711341862u,138514440u,2490368u}/* 1D793 */, /*25874*/{2516058112u,2016u,65537u,76709985u,1507360u,3767009312u,1711341870u,138514440u,2490368u}/* 1D794 */, /*25875*/{2516582400u,2016u,65537u,76709985u,1507360u,3767009312u,1711341902u,138514440u,2490368u}/* 1D795 */, /*25876*/{2517106688u,2016u,65537u,76709985u,1507360u,3767009312u,1711341918u,138514440u,2490368u}/* 1D796 */, /*25877*/{2517630976u,2016u,65537u,76709985u,1507360u,3767009312u,1711341926u,138514440u,2490368u}/* 1D797 */, /*25878*/{2518155264u,2016u,65537u,76709985u,1507360u,3767009312u,1711341934u,138514440u,2490368u}/* 1D798 */, /*25879*/{2518679552u,2016u,65537u,76709985u,1507360u,3767009312u,1711341950u,138514440u,2490368u}/* 1D799 */, /*25880*/{2519203840u,2016u,65537u,76709985u,1507360u,3767009312u,1711341958u,138514440u,2490368u}/* 1D79A */, /*25881*/{2519728128u,2016u,65537u,76709985u,1507360u,3767009312u,1711341974u,138514440u,2490368u}/* 1D79B */, /*25882*/{2520252416u,2016u,65537u,76709985u,1507360u,3767009312u,1711341982u,138514440u,2490368u}/* 1D79C */, /*25883*/{2520776704u,2016u,65537u,76709985u,1507360u,3767009312u,1711341990u,138514440u,2490368u}/* 1D79D */, /*25884*/{2521300992u,2016u,65537u,76709985u,1507360u,3767009312u,1711341998u,138514440u,2490368u}/* 1D79E */, /*25885*/{2521825280u,2016u,65537u,76709985u,1507360u,3767009312u,1711342006u,138514440u,2490368u}/* 1D79F */, /*25886*/{2522349568u,2016u,65537u,76709985u,1507360u,3767009312u,1711342046u,138514440u,2490368u}/* 1D7A0 */, /*25887*/{2522873856u,2016u,65537u,76709985u,1507360u,3767009312u,1711341926u,138514440u,2490368u}/* 1D7A1 */, /*25888*/{2523398144u,2016u,65537u,76709985u,1507360u,3767009312u,1711342070u,138514440u,2490368u}/* 1D7A2 */, /*25889*/{2523922432u,2016u,65537u,76709985u,1507360u,3767009312u,1711342102u,138514440u,2490368u}/* 1D7A3 */, /*25890*/{2524446720u,2016u,65537u,76709985u,1507360u,3767009312u,1711342110u,138514440u,2490368u}/* 1D7A4 */, /*25891*/{2524971008u,2016u,65537u,76709985u,1507360u,3767009312u,1711342118u,138514440u,2490368u}/* 1D7A5 */, /*25892*/{2525495296u,2016u,65537u,76709985u,1507360u,3767009312u,1711342126u,138514440u,2490368u}/* 1D7A6 */, /*25893*/{2526019584u,2016u,65537u,76709985u,1507360u,3767009312u,1711342134u,138514440u,2490368u}/* 1D7A7 */, /*25894*/{2526543872u,2016u,65537u,76709985u,1507360u,3767009312u,1711342150u,138514440u,2490368u}/* 1D7A8 */, /*25895*/{2527068160u,2016u,65537u,76710008u,32u,1611137056u,12574u,138465280u,67108864u}/* 1D7A9 */, /*25896*/{2527592448u,2016u,65537u,76709986u,1499168u,3767009312u,1719730438u,138465288u,393216u}/* 1D7AA */, /*25897*/{2528116736u,2016u,65537u,76709986u,1499168u,3767009312u,1719730446u,138465288u,393216u}/* 1D7AB */, /*25898*/{2528641024u,2016u,65537u,76709986u,1499168u,3767009312u,1719730454u,138465288u,393216u}/* 1D7AC */, /*25899*/{2529165312u,2016u,65537u,76709986u,1499168u,3767009312u,1719730470u,138465288u,393216u}/* 1D7AD */, /*25900*/{2529689600u,2016u,65537u,76709986u,1499168u,3767009312u,1719730478u,138465288u,393216u}/* 1D7AE */, /*25901*/{2530213888u,2016u,65537u,76709986u,1499168u,3767009312u,1719730510u,138465288u,393216u}/* 1D7AF */, /*25902*/{2530738176u,2016u,65537u,76709986u,1499168u,3767009312u,1719730526u,138465288u,393216u}/* 1D7B0 */, /*25903*/{2531262464u,2016u,65537u,76709986u,1499168u,3767009312u,1719730534u,138465288u,393216u}/* 1D7B1 */, /*25904*/{2531786752u,2016u,65537u,76709986u,1499168u,3767009312u,1719730542u,138465288u,393216u}/* 1D7B2 */, /*25905*/{2532311040u,2016u,65537u,76709986u,1499168u,3767009312u,1719730558u,138465288u,393216u}/* 1D7B3 */, /*25906*/{2532835328u,2016u,65537u,76709986u,1499168u,3767009312u,1719730566u,138465288u,393216u}/* 1D7B4 */, /*25907*/{2533359616u,2016u,65537u,76709986u,1499168u,3767009312u,1719730582u,138465288u,393216u}/* 1D7B5 */, /*25908*/{2533883904u,2016u,65537u,76709986u,1499168u,3767009312u,1719730590u,138465288u,393216u}/* 1D7B6 */, /*25909*/{2534408192u,2016u,65537u,76709986u,1499168u,3767009312u,1719730598u,138465288u,393216u}/* 1D7B7 */, /*25910*/{2534932480u,2016u,65537u,76709986u,1499168u,3767009312u,1719730606u,138465288u,393216u}/* 1D7B8 */, /*25911*/{2535456768u,2016u,65537u,76709986u,1499168u,3767009312u,1719730614u,138465288u,393216u}/* 1D7B9 */, /*25912*/{2535981056u,2016u,65537u,76709986u,1499168u,3767009312u,1719730654u,138465288u,393216u}/* 1D7BA */, /*25913*/{2536505344u,2016u,65537u,76709986u,1499168u,3767009312u,1719730678u,138465288u,393216u}/* 1D7BB */, /*25914*/{2537029632u,2016u,65537u,76709986u,1499168u,3767009312u,1719730678u,138465288u,393216u}/* 1D7BC */, /*25915*/{2537553920u,2016u,65537u,76709986u,1499168u,3767009312u,1719730710u,138465288u,393216u}/* 1D7BD */, /*25916*/{2538078208u,2016u,65537u,76709986u,1499168u,3767009312u,1719730718u,138465288u,393216u}/* 1D7BE */, /*25917*/{2538602496u,2016u,65537u,76709986u,1499168u,3767009312u,1719730726u,138465288u,393216u}/* 1D7BF */, /*25918*/{2539126784u,2016u,65537u,76709986u,1499168u,3767009312u,1719730734u,138465288u,393216u}/* 1D7C0 */, /*25919*/{2539651072u,2016u,65537u,76709986u,1499168u,3767009312u,1719730742u,138465288u,393216u}/* 1D7C1 */, /*25920*/{2540175360u,2016u,65537u,76709986u,1499168u,3767009312u,1719730758u,138465288u,393216u}/* 1D7C2 */, /*25921*/{2540699648u,2016u,65537u,76720248u,32u,1745354784u,12542u,138465280u,67108864u}/* 1D7C3 */, /*25922*/{2541223936u,2016u,65537u,76709986u,1499168u,3767009312u,1719730478u,138465288u,393216u}/* 1D7C4 */, /*25923*/{2541748224u,2016u,65537u,76709986u,1499168u,3767009312u,1719730534u,138465288u,393216u}/* 1D7C5 */, /*25924*/{2542272512u,2016u,65537u,76709986u,1499168u,3767009312u,1719730558u,138465288u,393216u}/* 1D7C6 */, /*25925*/{2542796800u,2016u,65537u,76709986u,1499168u,3767009312u,1719730726u,138465288u,393216u}/* 1D7C7 */, /*25926*/{2543321088u,2016u,65537u,76709986u,1499168u,3767009312u,1719730654u,138465288u,393216u}/* 1D7C8 */, /*25927*/{2543845376u,2016u,65537u,76709986u,1499168u,3767009312u,1719730614u,138465288u,393216u}/* 1D7C9 */, /*25928*/{2544369664u,2016u,65537u,76841057u,1507360u,3767009312u,1711341878u,138514440u,2490368u}/* 1D7CA */, /*25929*/{2544893952u,2016u,65537u,76841058u,1499168u,3767009312u,1719730486u,138465288u,393216u}/* 1D7CB */, /*25930*/{2545418240u,2016u,33620993u,85100649u,10436646u,1611137056u,1073800487u,138465288u,262144u}/* 1D7CE */, /*25931*/{2545942528u,2016u,536937985u,85100649u,10436646u,1611137056u,1073800495u,138465288u,262144u}/* 1D7CF */, /*25932*/{2546466816u,2016u,570493441u,85100649u,10436646u,1611137056u,1073800503u,138465288u,262144u}/* 1D7D0 */, /*25933*/{2546991104u,2016u,604047361u,85100649u,10436646u,1611137056u,1073800511u,138465288u,262144u}/* 1D7D1 */, /*25934*/{2547515392u,2016u,637603841u,85100649u,10436646u,1611137056u,1073800519u,138465288u,262144u}/* 1D7D2 */, /*25935*/{2548039680u,2016u,671157249u,85100649u,10436646u,1611137056u,1073800527u,138465288u,262144u}/* 1D7D3 */, /*25936*/{2548563968u,2016u,704714241u,85100649u,10436646u,1611137056u,1073800535u,138465288u,262144u}/* 1D7D4 */, /*25937*/{2549088256u,2016u,738266625u,85100649u,10436646u,1611137056u,1073800543u,138465288u,262144u}/* 1D7D5 */, /*25938*/{2549612544u,2016u,771824641u,85100649u,10436646u,1611137056u,1073800551u,138465288u,262144u}/* 1D7D6 */, /*25939*/{2550136832u,2016u,805377025u,85100649u,10436646u,1611137056u,1073800559u,138465288u,262144u}/* 1D7D7 */, /*25940*/{2550661120u,2016u,33620993u,85100649u,10436646u,1611137056u,1073800487u,138465288u,262144u}/* 1D7D8 */, /*25941*/{2551185408u,2016u,536937985u,85100649u,10436646u,1611137056u,1073800495u,138465288u,262144u}/* 1D7D9 */, /*25942*/{2551709696u,2016u,570493441u,85100649u,10436646u,1611137056u,1073800503u,138465288u,262144u}/* 1D7DA */, /*25943*/{2552233984u,2016u,604047361u,85100649u,10436646u,1611137056u,1073800511u,138465288u,262144u}/* 1D7DB */, /*25944*/{2552758272u,2016u,637603841u,85100649u,10436646u,1611137056u,1073800519u,138465288u,262144u}/* 1D7DC */, /*25945*/{2553282560u,2016u,671157249u,85100649u,10436646u,1611137056u,1073800527u,138465288u,262144u}/* 1D7DD */, /*25946*/{2553806848u,2016u,704714241u,85100649u,10436646u,1611137056u,1073800535u,138465288u,262144u}/* 1D7DE */, /*25947*/{2554331136u,2016u,738266625u,85100649u,10436646u,1611137056u,1073800543u,138465288u,262144u}/* 1D7DF */, /*25948*/{2554855424u,2016u,771824641u,85100649u,10436646u,1611137056u,1073800551u,138465288u,262144u}/* 1D7E0 */, /*25949*/{2555379712u,2016u,805377025u,85100649u,10436646u,1611137056u,1073800559u,138465288u,262144u}/* 1D7E1 */, /*25950*/{2555904000u,2016u,33620993u,85100649u,10436646u,1611137056u,1073800487u,138465288u,262144u}/* 1D7E2 */, /*25951*/{2556428288u,2016u,536937985u,85100649u,10436646u,1611137056u,1073800495u,138465288u,262144u}/* 1D7E3 */, /*25952*/{2556952576u,2016u,570493441u,85100649u,10436646u,1611137056u,1073800503u,138465288u,262144u}/* 1D7E4 */, /*25953*/{2557476864u,2016u,604047361u,85100649u,10436646u,1611137056u,1073800511u,138465288u,262144u}/* 1D7E5 */, /*25954*/{2558001152u,2016u,637603841u,85100649u,10436646u,1611137056u,1073800519u,138465288u,262144u}/* 1D7E6 */, /*25955*/{2558525440u,2016u,671157249u,85100649u,10436646u,1611137056u,1073800527u,138465288u,262144u}/* 1D7E7 */, /*25956*/{2559049728u,2016u,704714241u,85100649u,10436646u,1611137056u,1073800535u,138465288u,262144u}/* 1D7E8 */, /*25957*/{2559574016u,2016u,738266625u,85100649u,10436646u,1611137056u,1073800543u,138465288u,262144u}/* 1D7E9 */, /*25958*/{2560098304u,2016u,771824641u,85100649u,10436646u,1611137056u,1073800551u,138465288u,262144u}/* 1D7EA */, /*25959*/{2560622592u,2016u,805377025u,85100649u,10436646u,1611137056u,1073800559u,138465288u,262144u}/* 1D7EB */, /*25960*/{2561146880u,2016u,33620993u,85100649u,10436646u,1611137056u,1073800487u,138465288u,262144u}/* 1D7EC */, /*25961*/{2561671168u,2016u,536937985u,85100649u,10436646u,1611137056u,1073800495u,138465288u,262144u}/* 1D7ED */, /*25962*/{2562195456u,2016u,570493441u,85100649u,10436646u,1611137056u,1073800503u,138465288u,262144u}/* 1D7EE */, /*25963*/{2562719744u,2016u,604047361u,85100649u,10436646u,1611137056u,1073800511u,138465288u,262144u}/* 1D7EF */, /*25964*/{2563244032u,2016u,637603841u,85100649u,10436646u,1611137056u,1073800519u,138465288u,262144u}/* 1D7F0 */, /*25965*/{2563768320u,2016u,671157249u,85100649u,10436646u,1611137056u,1073800527u,138465288u,262144u}/* 1D7F1 */, /*25966*/{2564292608u,2016u,704714241u,85100649u,10436646u,1611137056u,1073800535u,138465288u,262144u}/* 1D7F2 */, /*25967*/{2564816896u,2016u,738266625u,85100649u,10436646u,1611137056u,1073800543u,138465288u,262144u}/* 1D7F3 */, /*25968*/{2565341184u,2016u,771824641u,85100649u,10436646u,1611137056u,1073800551u,138465288u,262144u}/* 1D7F4 */, /*25969*/{2565865472u,2016u,805377025u,85100649u,10436646u,1611137056u,1073800559u,138465288u,262144u}/* 1D7F5 */, /*25970*/{2566389760u,2016u,33620993u,85100649u,10436646u,1611137056u,1073800487u,138465288u,262144u}/* 1D7F6 */, /*25971*/{2566914048u,2016u,536937985u,85100649u,10436646u,1611137056u,1073800495u,138465288u,262144u}/* 1D7F7 */, /*25972*/{2567438336u,2016u,570493441u,85100649u,10436646u,1611137056u,1073800503u,138465288u,262144u}/* 1D7F8 */, /*25973*/{2567962624u,2016u,604047361u,85100649u,10436646u,1611137056u,1073800511u,138465288u,262144u}/* 1D7F9 */, /*25974*/{2568486912u,2016u,637603841u,85100649u,10436646u,1611137056u,1073800519u,138465288u,262144u}/* 1D7FA */, /*25975*/{2569011200u,2016u,671157249u,85100649u,10436646u,1611137056u,1073800527u,138465288u,262144u}/* 1D7FB */, /*25976*/{2569535488u,2016u,704714241u,85100649u,10436646u,1611137056u,1073800535u,138465288u,262144u}/* 1D7FC */, /*25977*/{2570059776u,2016u,738266625u,85100649u,10436646u,1611137056u,1073800543u,138465288u,262144u}/* 1D7FD */, /*25978*/{2570584064u,2016u,771824641u,85100649u,10436646u,1611137056u,1073800551u,138465288u,262144u}/* 1D7FE */, /*25979*/{2571108352u,2016u,805377025u,85100649u,10436646u,1611137056u,1073800559u,138465288u,262144u}/* 1D7FF */, /*25980*/{0,2024u,8585217u,77103131u,40u,1610612768u,50468u,138442752u,67108864u}/* 1D800 */, /*25981*/{0,2024u,8585217u,77103131u,40u,1610612768u,50476u,138442752u,67108864u}/* 1D801 */, /*25982*/{0,2024u,8585217u,77103131u,40u,1610612768u,50484u,138442752u,67108864u}/* 1D802 */, /*25983*/{0,2024u,8585217u,77103131u,40u,1610612768u,50492u,138442752u,67108864u}/* 1D803 */, /*25984*/{0,2024u,8585217u,77103131u,40u,1610612768u,50500u,138442752u,67108864u}/* 1D804 */, /*25985*/{0,2024u,8585217u,77103131u,40u,1610612768u,50508u,138442752u,67108864u}/* 1D805 */, /*25986*/{0,2024u,8585217u,77103131u,40u,1610612768u,50516u,138442752u,67108864u}/* 1D806 */, /*25987*/{0,2024u,8585217u,77103131u,40u,1610612768u,50524u,138442752u,67108864u}/* 1D807 */, /*25988*/{0,2024u,8585217u,77103131u,40u,1610612768u,50532u,138442752u,67108864u}/* 1D808 */, /*25989*/{0,2024u,8585217u,77103131u,40u,1610612768u,50540u,138442752u,67108864u}/* 1D809 */, /*25990*/{0,2024u,8585217u,77103131u,40u,1610612768u,50548u,138442752u,67108864u}/* 1D80A */, /*25991*/{0,2024u,8585217u,77103131u,40u,1610612768u,50556u,138442752u,67108864u}/* 1D80B */, /*25992*/{0,2024u,8585217u,77103131u,40u,1610612768u,50564u,138442752u,67108864u}/* 1D80C */, /*25993*/{0,2024u,8585217u,77103131u,40u,1610612768u,50572u,138442752u,67108864u}/* 1D80D */, /*25994*/{0,2024u,8585217u,77103131u,40u,1610612768u,50580u,138442752u,67108864u}/* 1D80E */, /*25995*/{0,2024u,8585217u,77103131u,40u,1610612768u,50588u,138442752u,67108864u}/* 1D80F */, /*25996*/{0,2024u,8585217u,77103131u,40u,1610612768u,50596u,138442752u,67108864u}/* 1D810 */, /*25997*/{0,2024u,8585217u,77103131u,40u,1610612768u,50604u,138442752u,67108864u}/* 1D811 */, /*25998*/{0,2024u,8585217u,77103131u,40u,1610612768u,50612u,138442752u,67108864u}/* 1D812 */, /*25999*/{0,2024u,8585217u,77103131u,40u,1610612768u,50620u,138442752u,67108864u}/* 1D813 */, /*26000*/{0,2024u,8585217u,77103131u,40u,1610612768u,50628u,138442752u,67108864u}/* 1D814 */, /*26001*/{0,2024u,8585217u,77103131u,40u,1610612768u,50636u,138442752u,67108864u}/* 1D815 */, /*26002*/{0,2024u,8585217u,77103131u,40u,1610612768u,50644u,138442752u,67108864u}/* 1D816 */, /*26003*/{0,2024u,8585217u,77103131u,40u,1610612768u,50652u,138442752u,67108864u}/* 1D817 */, /*26004*/{0,2024u,8585217u,77103131u,40u,1610612768u,50660u,138442752u,67108864u}/* 1D818 */, /*26005*/{0,2024u,8585217u,77103131u,40u,1610612768u,50668u,138442752u,67108864u}/* 1D819 */, /*26006*/{0,2024u,8585217u,77103131u,40u,1610612768u,50676u,138442752u,67108864u}/* 1D81A */, /*26007*/{0,2024u,8585217u,77103131u,40u,1610612768u,50684u,138442752u,67108864u}/* 1D81B */, /*26008*/{0,2024u,8585217u,77103131u,40u,1610612768u,50692u,138442752u,67108864u}/* 1D81C */, /*26009*/{0,2024u,8585217u,77103131u,40u,1610612768u,50700u,138442752u,67108864u}/* 1D81D */, /*26010*/{0,2024u,8585217u,77103131u,40u,1610612768u,50708u,138442752u,67108864u}/* 1D81E */, /*26011*/{0,2024u,8585217u,77103131u,40u,1610612768u,50716u,138442752u,67108864u}/* 1D81F */, /*26012*/{0,2024u,8585217u,77103131u,40u,1610612768u,50724u,138442752u,67108864u}/* 1D820 */, /*26013*/{0,2024u,8585217u,77103131u,40u,1610612768u,50732u,138442752u,67108864u}/* 1D821 */, /*26014*/{0,2024u,8585217u,77103131u,40u,1610612768u,50740u,138442752u,67108864u}/* 1D822 */, /*26015*/{0,2024u,8585217u,77103131u,40u,1610612768u,50748u,138442752u,67108864u}/* 1D823 */, /*26016*/{0,2024u,8585217u,77103131u,40u,1610612768u,50756u,138442752u,67108864u}/* 1D824 */, /*26017*/{0,2024u,8585217u,77103131u,40u,1610612768u,50764u,138442752u,67108864u}/* 1D825 */, /*26018*/{0,2024u,8585217u,77103131u,40u,1610612768u,50772u,138442752u,67108864u}/* 1D826 */, /*26019*/{0,2024u,8585217u,77103131u,40u,1610612768u,50780u,138442752u,67108864u}/* 1D827 */, /*26020*/{0,2024u,8585217u,77103131u,40u,1610612768u,50788u,138442752u,67108864u}/* 1D828 */, /*26021*/{0,2024u,8585217u,77103131u,40u,1610612768u,50796u,138442752u,67108864u}/* 1D829 */, /*26022*/{0,2024u,8585217u,77103131u,40u,1610612768u,50804u,138442752u,67108864u}/* 1D82A */, /*26023*/{0,2024u,8585217u,77103131u,40u,1610612768u,50812u,138442752u,67108864u}/* 1D82B */, /*26024*/{0,2024u,8585217u,77103131u,40u,1610612768u,50820u,138442752u,67108864u}/* 1D82C */, /*26025*/{0,2024u,8585217u,77103131u,40u,1610612768u,50828u,138442752u,67108864u}/* 1D82D */, /*26026*/{0,2024u,8585217u,77103131u,40u,1610612768u,50836u,138442752u,67108864u}/* 1D82E */, /*26027*/{0,2024u,8585217u,77103131u,40u,1610612768u,50844u,138442752u,67108864u}/* 1D82F */, /*26028*/{0,2024u,8585217u,77103131u,40u,1610612768u,50852u,138442752u,67108864u}/* 1D830 */, /*26029*/{0,2024u,8585217u,77103131u,40u,1610612768u,50860u,138442752u,67108864u}/* 1D831 */, /*26030*/{0,2024u,8585217u,77103131u,40u,1610612768u,50868u,138442752u,67108864u}/* 1D832 */, /*26031*/{0,2024u,8585217u,77103131u,40u,1610612768u,50876u,138442752u,67108864u}/* 1D833 */, /*26032*/{0,2024u,8585217u,77103131u,40u,1610612768u,50884u,138442752u,67108864u}/* 1D834 */, /*26033*/{0,2024u,8585217u,77103131u,40u,1610612768u,50892u,138442752u,67108864u}/* 1D835 */, /*26034*/{0,2024u,8585217u,77103131u,40u,1610612768u,50900u,138442752u,67108864u}/* 1D836 */, /*26035*/{0,2024u,8585217u,77103131u,40u,1610612768u,50908u,138442752u,67108864u}/* 1D837 */, /*26036*/{0,2024u,8585217u,77103131u,40u,1610612768u,50916u,138442752u,67108864u}/* 1D838 */, /*26037*/{0,2024u,8585217u,77103131u,40u,1610612768u,50924u,138442752u,67108864u}/* 1D839 */, /*26038*/{0,2024u,8585217u,77103131u,40u,1610612768u,50932u,138442752u,67108864u}/* 1D83A */, /*26039*/{0,2024u,8585217u,77103131u,40u,1610612768u,50940u,138442752u,67108864u}/* 1D83B */, /*26040*/{0,2024u,8585217u,77103131u,40u,1610612768u,50948u,138442752u,67108864u}/* 1D83C */, /*26041*/{0,2024u,8585217u,77103131u,40u,1610612768u,50956u,138442752u,67108864u}/* 1D83D */, /*26042*/{0,2024u,8585217u,77103131u,40u,1610612768u,50964u,138442752u,67108864u}/* 1D83E */, /*26043*/{0,2024u,8585217u,77103131u,40u,1610612768u,50972u,138442752u,67108864u}/* 1D83F */, /*26044*/{0,2024u,8585217u,77103131u,40u,1610612768u,50980u,138442752u,67108864u}/* 1D840 */, /*26045*/{0,2024u,8585217u,77103131u,40u,1610612768u,50988u,138442752u,67108864u}/* 1D841 */, /*26046*/{0,2024u,8585217u,77103131u,40u,1610612768u,50996u,138442752u,67108864u}/* 1D842 */, /*26047*/{0,2024u,8585217u,77103131u,40u,1610612768u,51004u,138442752u,67108864u}/* 1D843 */, /*26048*/{0,2024u,8585217u,77103131u,40u,1610612768u,51012u,138442752u,67108864u}/* 1D844 */, /*26049*/{0,2024u,8585217u,77103131u,40u,1610612768u,51020u,138442752u,67108864u}/* 1D845 */, /*26050*/{0,2024u,8585217u,77103131u,40u,1610612768u,51028u,138442752u,67108864u}/* 1D846 */, /*26051*/{0,2024u,8585217u,77103131u,40u,1610612768u,51036u,138442752u,67108864u}/* 1D847 */, /*26052*/{0,2024u,8585217u,77103131u,40u,1610612768u,51044u,138442752u,67108864u}/* 1D848 */, /*26053*/{0,2024u,8585217u,77103131u,40u,1610612768u,51052u,138442752u,67108864u}/* 1D849 */, /*26054*/{0,2024u,8585217u,77103131u,40u,1610612768u,51060u,138442752u,67108864u}/* 1D84A */, /*26055*/{0,2024u,8585217u,77103131u,40u,1610612768u,51068u,138442752u,67108864u}/* 1D84B */, /*26056*/{0,2024u,8585217u,77103131u,40u,1610612768u,51076u,138442752u,67108864u}/* 1D84C */, /*26057*/{0,2024u,8585217u,77103131u,40u,1610612768u,51084u,138442752u,67108864u}/* 1D84D */, /*26058*/{0,2024u,8585217u,77103131u,40u,1610612768u,51092u,138442752u,67108864u}/* 1D84E */, /*26059*/{0,2024u,8585217u,77103131u,40u,1610612768u,51100u,138442752u,67108864u}/* 1D84F */, /*26060*/{0,2024u,8585217u,77103131u,40u,1610612768u,51108u,138442752u,67108864u}/* 1D850 */, /*26061*/{0,2024u,8585217u,77103131u,40u,1610612768u,51116u,138442752u,67108864u}/* 1D851 */, /*26062*/{0,2024u,8585217u,77103131u,40u,1610612768u,51124u,138442752u,67108864u}/* 1D852 */, /*26063*/{0,2024u,8585217u,77103131u,40u,1610612768u,51132u,138442752u,67108864u}/* 1D853 */, /*26064*/{0,2024u,8585217u,77103131u,40u,1610612768u,51140u,138442752u,67108864u}/* 1D854 */, /*26065*/{0,2024u,8585217u,77103131u,40u,1610612768u,51148u,138442752u,67108864u}/* 1D855 */, /*26066*/{0,2024u,8585217u,77103131u,40u,1610612768u,51156u,138442752u,67108864u}/* 1D856 */, /*26067*/{0,2024u,8585217u,77103131u,40u,1610612768u,51164u,138442752u,67108864u}/* 1D857 */, /*26068*/{0,2024u,8585217u,77103131u,40u,1610612768u,51172u,138442752u,67108864u}/* 1D858 */, /*26069*/{0,2024u,8585217u,77103131u,40u,1610612768u,51180u,138442752u,67108864u}/* 1D859 */, /*26070*/{0,2024u,8585217u,77103131u,40u,1610612768u,51188u,138442752u,67108864u}/* 1D85A */, /*26071*/{0,2024u,8585217u,77103131u,40u,1610612768u,51196u,138442752u,67108864u}/* 1D85B */, /*26072*/{0,2024u,8585217u,77103131u,40u,1610612768u,51204u,138442752u,67108864u}/* 1D85C */, /*26073*/{0,2024u,8585217u,77103131u,40u,1610612768u,51212u,138442752u,67108864u}/* 1D85D */, /*26074*/{0,2024u,8585217u,77103131u,40u,1610612768u,51220u,138442752u,67108864u}/* 1D85E */, /*26075*/{0,2024u,8585217u,77103131u,40u,1610612768u,51228u,138442752u,67108864u}/* 1D85F */, /*26076*/{0,2024u,8585217u,77103131u,40u,1610612768u,51236u,138442752u,67108864u}/* 1D860 */, /*26077*/{0,2024u,8585217u,77103131u,40u,1610612768u,51244u,138442752u,67108864u}/* 1D861 */, /*26078*/{0,2024u,8585217u,77103131u,40u,1610612768u,51252u,138442752u,67108864u}/* 1D862 */, /*26079*/{0,2024u,8585217u,77103131u,40u,1610612768u,51260u,138442752u,67108864u}/* 1D863 */, /*26080*/{0,2024u,8585217u,77103131u,40u,1610612768u,51268u,138442752u,67108864u}/* 1D864 */, /*26081*/{0,2024u,8585217u,77103131u,40u,1610612768u,51276u,138442752u,67108864u}/* 1D865 */, /*26082*/{0,2024u,8585217u,77103131u,40u,1610612768u,51284u,138442752u,67108864u}/* 1D866 */, /*26083*/{0,2024u,8585217u,77103131u,40u,1610612768u,51292u,138442752u,67108864u}/* 1D867 */, /*26084*/{0,2024u,8585217u,77103131u,40u,1610612768u,51300u,138442752u,67108864u}/* 1D868 */, /*26085*/{0,2024u,8585217u,77103131u,40u,1610612768u,51308u,138442752u,67108864u}/* 1D869 */, /*26086*/{0,2024u,8585217u,77103131u,40u,1610612768u,51316u,138442752u,67108864u}/* 1D86A */, /*26087*/{0,2024u,8585217u,77103131u,40u,1610612768u,51324u,138442752u,67108864u}/* 1D86B */, /*26088*/{0,2024u,8585217u,77103131u,40u,1610612768u,51332u,138442752u,67108864u}/* 1D86C */, /*26089*/{0,2024u,8585217u,77103131u,40u,1610612768u,51340u,138442752u,67108864u}/* 1D86D */, /*26090*/{0,2024u,8585217u,77103131u,40u,1610612768u,51348u,138442752u,67108864u}/* 1D86E */, /*26091*/{0,2024u,8585217u,77103131u,40u,1610612768u,51356u,138442752u,67108864u}/* 1D86F */, /*26092*/{0,2024u,8585217u,77103131u,40u,1610612768u,51364u,138442752u,67108864u}/* 1D870 */, /*26093*/{0,2024u,8585217u,77103131u,40u,1610612768u,51372u,138442752u,67108864u}/* 1D871 */, /*26094*/{0,2024u,8585217u,77103131u,40u,1610612768u,51380u,138442752u,67108864u}/* 1D872 */, /*26095*/{0,2024u,8585217u,77103131u,40u,1610612768u,51388u,138442752u,67108864u}/* 1D873 */, /*26096*/{0,2024u,8585217u,77103131u,40u,1610612768u,51396u,138442752u,67108864u}/* 1D874 */, /*26097*/{0,2024u,8585217u,77103131u,40u,1610612768u,51404u,138442752u,67108864u}/* 1D875 */, /*26098*/{0,2024u,8585217u,77103131u,40u,1610612768u,51412u,138442752u,67108864u}/* 1D876 */, /*26099*/{0,2024u,8585217u,77103131u,40u,1610612768u,51420u,138442752u,67108864u}/* 1D877 */, /*26100*/{0,2024u,8585217u,77103131u,40u,1610612768u,51428u,138442752u,67108864u}/* 1D878 */, /*26101*/{0,2024u,8585217u,77103131u,40u,1610612768u,51436u,138442752u,67108864u}/* 1D879 */, /*26102*/{0,2024u,8585217u,77103131u,40u,1610612768u,51444u,138442752u,67108864u}/* 1D87A */, /*26103*/{0,2024u,8585217u,77103131u,40u,1610612768u,51452u,138442752u,67108864u}/* 1D87B */, /*26104*/{0,2024u,8585217u,77103131u,40u,1610612768u,51460u,138442752u,67108864u}/* 1D87C */, /*26105*/{0,2024u,8585217u,77103131u,40u,1610612768u,51468u,138442752u,67108864u}/* 1D87D */, /*26106*/{0,2024u,8585217u,77103131u,40u,1610612768u,51476u,138442752u,67108864u}/* 1D87E */, /*26107*/{0,2024u,8585217u,77103131u,40u,1610612768u,51484u,138442752u,67108864u}/* 1D87F */, /*26108*/{0,2024u,8585217u,77103131u,40u,1610612768u,51492u,138442752u,67108864u}/* 1D880 */, /*26109*/{0,2024u,8585217u,77103131u,40u,1610612768u,51500u,138442752u,67108864u}/* 1D881 */, /*26110*/{0,2024u,8585217u,77103131u,40u,1610612768u,51508u,138442752u,67108864u}/* 1D882 */, /*26111*/{0,2024u,8585217u,77103131u,40u,1610612768u,51516u,138442752u,67108864u}/* 1D883 */, /*26112*/{0,2024u,8585217u,77103131u,40u,1610612768u,51524u,138442752u,67108864u}/* 1D884 */, /*26113*/{0,2024u,8585217u,77103131u,40u,1610612768u,51532u,138442752u,67108864u}/* 1D885 */, /*26114*/{0,2024u,8585217u,77103131u,40u,1610612768u,51540u,138442752u,67108864u}/* 1D886 */, /*26115*/{0,2024u,8585217u,77103131u,40u,1610612768u,51548u,138442752u,67108864u}/* 1D887 */, /*26116*/{0,2024u,8585217u,77103131u,40u,1610612768u,51556u,138442752u,67108864u}/* 1D888 */, /*26117*/{0,2024u,8585217u,77103131u,40u,1610612768u,51564u,138442752u,67108864u}/* 1D889 */, /*26118*/{0,2024u,8585217u,77103131u,40u,1610612768u,51572u,138442752u,67108864u}/* 1D88A */, /*26119*/{0,2024u,8585217u,77103131u,40u,1610612768u,51580u,138442752u,67108864u}/* 1D88B */, /*26120*/{0,2024u,8585217u,77103131u,40u,1610612768u,51588u,138442752u,67108864u}/* 1D88C */, /*26121*/{0,2024u,8585217u,77103131u,40u,1610612768u,51596u,138442752u,67108864u}/* 1D88D */, /*26122*/{0,2024u,8585217u,77103131u,40u,1610612768u,51604u,138442752u,67108864u}/* 1D88E */, /*26123*/{0,2024u,8585217u,77103131u,40u,1610612768u,51612u,138442752u,67108864u}/* 1D88F */, /*26124*/{0,2024u,8585217u,77103131u,40u,1610612768u,51620u,138442752u,67108864u}/* 1D890 */, /*26125*/{0,2024u,8585217u,77103131u,40u,1610612768u,51628u,138442752u,67108864u}/* 1D891 */, /*26126*/{0,2024u,8585217u,77103131u,40u,1610612768u,51636u,138442752u,67108864u}/* 1D892 */, /*26127*/{0,2024u,8585217u,77103131u,40u,1610612768u,51644u,138442752u,67108864u}/* 1D893 */, /*26128*/{0,2024u,8585217u,77103131u,40u,1610612768u,51652u,138442752u,67108864u}/* 1D894 */, /*26129*/{0,2024u,8585217u,77103131u,40u,1610612768u,51660u,138442752u,67108864u}/* 1D895 */, /*26130*/{0,2024u,8585217u,77103131u,40u,1610612768u,51668u,138442752u,67108864u}/* 1D896 */, /*26131*/{0,2024u,8585217u,77103131u,40u,1610612768u,51676u,138442752u,67108864u}/* 1D897 */, /*26132*/{0,2024u,8585217u,77103131u,40u,1610612768u,51684u,138442752u,67108864u}/* 1D898 */, /*26133*/{0,2024u,8585217u,77103131u,40u,1610612768u,51692u,138442752u,67108864u}/* 1D899 */, /*26134*/{0,2024u,8585217u,77103131u,40u,1610612768u,51700u,138442752u,67108864u}/* 1D89A */, /*26135*/{0,2024u,8585217u,77103131u,40u,1610612768u,51708u,138442752u,67108864u}/* 1D89B */, /*26136*/{0,2024u,8585217u,77103131u,40u,1610612768u,51716u,138442752u,67108864u}/* 1D89C */, /*26137*/{0,2024u,8585217u,77103131u,40u,1610612768u,51724u,138442752u,67108864u}/* 1D89D */, /*26138*/{0,2024u,8585217u,77103131u,40u,1610612768u,51732u,138442752u,67108864u}/* 1D89E */, /*26139*/{0,2024u,8585217u,77103131u,40u,1610612768u,51740u,138442752u,67108864u}/* 1D89F */, /*26140*/{0,2024u,8585217u,77103131u,40u,1610612768u,51748u,138442752u,67108864u}/* 1D8A0 */, /*26141*/{0,2024u,8585217u,77103131u,40u,1610612768u,51756u,138442752u,67108864u}/* 1D8A1 */, /*26142*/{0,2024u,8585217u,77103131u,40u,1610612768u,51764u,138442752u,67108864u}/* 1D8A2 */, /*26143*/{0,2024u,8585217u,77103131u,40u,1610612768u,51772u,138442752u,67108864u}/* 1D8A3 */, /*26144*/{0,2024u,8585217u,77103131u,40u,1610612768u,51780u,138442752u,67108864u}/* 1D8A4 */, /*26145*/{0,2024u,8585217u,77103131u,40u,1610612768u,51788u,138442752u,67108864u}/* 1D8A5 */, /*26146*/{0,2024u,8585217u,77103131u,40u,1610612768u,51796u,138442752u,67108864u}/* 1D8A6 */, /*26147*/{0,2024u,8585217u,77103131u,40u,1610612768u,51804u,138442752u,67108864u}/* 1D8A7 */, /*26148*/{0,2024u,8585217u,77103131u,40u,1610612768u,51812u,138442752u,67108864u}/* 1D8A8 */, /*26149*/{0,2024u,8585217u,77103131u,40u,1610612768u,51820u,138442752u,67108864u}/* 1D8A9 */, /*26150*/{0,2024u,8585217u,77103131u,40u,1610612768u,51828u,138442752u,67108864u}/* 1D8AA */, /*26151*/{0,2024u,8585217u,77103131u,40u,1610612768u,51836u,138442752u,67108864u}/* 1D8AB */, /*26152*/{0,2024u,8585217u,77103131u,40u,1610612768u,51844u,138442752u,67108864u}/* 1D8AC */, /*26153*/{0,2024u,8585217u,77103131u,40u,1610612768u,51852u,138442752u,67108864u}/* 1D8AD */, /*26154*/{0,2024u,8585217u,77103131u,40u,1610612768u,51860u,138442752u,67108864u}/* 1D8AE */, /*26155*/{0,2024u,8585217u,77103131u,40u,1610612768u,51868u,138442752u,67108864u}/* 1D8AF */, /*26156*/{0,2024u,8585217u,77103131u,40u,1610612768u,51876u,138442752u,67108864u}/* 1D8B0 */, /*26157*/{0,2024u,8585217u,77103131u,40u,1610612768u,51884u,138442752u,67108864u}/* 1D8B1 */, /*26158*/{0,2024u,8585217u,77103131u,40u,1610612768u,51892u,138442752u,67108864u}/* 1D8B2 */, /*26159*/{0,2024u,8585217u,77103131u,40u,1610612768u,51900u,138442752u,67108864u}/* 1D8B3 */, /*26160*/{0,2024u,8585217u,77103131u,40u,1610612768u,51908u,138442752u,67108864u}/* 1D8B4 */, /*26161*/{0,2024u,8585217u,77103131u,40u,1610612768u,51916u,138442752u,67108864u}/* 1D8B5 */, /*26162*/{0,2024u,8585217u,77103131u,40u,1610612768u,51924u,138442752u,67108864u}/* 1D8B6 */, /*26163*/{0,2024u,8585217u,77103131u,40u,1610612768u,51932u,138442752u,67108864u}/* 1D8B7 */, /*26164*/{0,2024u,8585217u,77103131u,40u,1610612768u,51940u,138442752u,67108864u}/* 1D8B8 */, /*26165*/{0,2024u,8585217u,77103131u,40u,1610612768u,51948u,138442752u,67108864u}/* 1D8B9 */, /*26166*/{0,2024u,8585217u,77103131u,40u,1610612768u,51956u,138442752u,67108864u}/* 1D8BA */, /*26167*/{0,2024u,8585217u,77103131u,40u,1610612768u,51964u,138442752u,67108864u}/* 1D8BB */, /*26168*/{0,2024u,8585217u,77103131u,40u,1610612768u,51972u,138442752u,67108864u}/* 1D8BC */, /*26169*/{0,2024u,8585217u,77103131u,40u,1610612768u,51980u,138442752u,67108864u}/* 1D8BD */, /*26170*/{0,2024u,8585217u,77103131u,40u,1610612768u,51988u,138442752u,67108864u}/* 1D8BE */, /*26171*/{0,2024u,8585217u,77103131u,40u,1610612768u,51996u,138442752u,67108864u}/* 1D8BF */, /*26172*/{0,2024u,8585217u,77103131u,40u,1610612768u,52004u,138442752u,67108864u}/* 1D8C0 */, /*26173*/{0,2024u,8585217u,77103131u,40u,1610612768u,52012u,138442752u,67108864u}/* 1D8C1 */, /*26174*/{0,2024u,8585217u,77103131u,40u,1610612768u,52020u,138442752u,67108864u}/* 1D8C2 */, /*26175*/{0,2024u,8585217u,77103131u,40u,1610612768u,52028u,138442752u,67108864u}/* 1D8C3 */, /*26176*/{0,2024u,8585217u,77103131u,40u,1610612768u,52036u,138442752u,67108864u}/* 1D8C4 */, /*26177*/{0,2024u,8585217u,77103131u,40u,1610612768u,52044u,138442752u,67108864u}/* 1D8C5 */, /*26178*/{0,2024u,8585217u,77103131u,40u,1610612768u,52052u,138442752u,67108864u}/* 1D8C6 */, /*26179*/{0,2024u,8585217u,77103131u,40u,1610612768u,52060u,138442752u,67108864u}/* 1D8C7 */, /*26180*/{0,2024u,8585217u,77103131u,40u,1610612768u,52068u,138442752u,67108864u}/* 1D8C8 */, /*26181*/{0,2024u,8585217u,77103131u,40u,1610612768u,52076u,138442752u,67108864u}/* 1D8C9 */, /*26182*/{0,2024u,8585217u,77103131u,40u,1610612768u,52084u,138442752u,67108864u}/* 1D8CA */, /*26183*/{0,2024u,8585217u,77103131u,40u,1610612768u,52092u,138442752u,67108864u}/* 1D8CB */, /*26184*/{0,2024u,8585217u,77103131u,40u,1610612768u,52100u,138442752u,67108864u}/* 1D8CC */, /*26185*/{0,2024u,8585217u,77103131u,40u,1610612768u,52108u,138442752u,67108864u}/* 1D8CD */, /*26186*/{0,2024u,8585217u,77103131u,40u,1610612768u,52116u,138442752u,67108864u}/* 1D8CE */, /*26187*/{0,2024u,8585217u,77103131u,40u,1610612768u,52124u,138442752u,67108864u}/* 1D8CF */, /*26188*/{0,2024u,8585217u,77103131u,40u,1610612768u,52132u,138442752u,67108864u}/* 1D8D0 */, /*26189*/{0,2024u,8585217u,77103131u,40u,1610612768u,52140u,138442752u,67108864u}/* 1D8D1 */, /*26190*/{0,2024u,8585217u,77103131u,40u,1610612768u,52148u,138442752u,67108864u}/* 1D8D2 */, /*26191*/{0,2024u,8585217u,77103131u,40u,1610612768u,52156u,138442752u,67108864u}/* 1D8D3 */, /*26192*/{0,2024u,8585217u,77103131u,40u,1610612768u,52164u,138442752u,67108864u}/* 1D8D4 */, /*26193*/{0,2024u,8585217u,77103131u,40u,1610612768u,52172u,138442752u,67108864u}/* 1D8D5 */, /*26194*/{0,2024u,8585217u,77103131u,40u,1610612768u,52180u,138442752u,67108864u}/* 1D8D6 */, /*26195*/{0,2024u,8585217u,77103131u,40u,1610612768u,52188u,138442752u,67108864u}/* 1D8D7 */, /*26196*/{0,2024u,8585217u,77103131u,40u,1610612768u,52196u,138442752u,67108864u}/* 1D8D8 */, /*26197*/{0,2024u,8585217u,77103131u,40u,1610612768u,52204u,138442752u,67108864u}/* 1D8D9 */, /*26198*/{0,2024u,8585217u,77103131u,40u,1610612768u,52212u,138442752u,67108864u}/* 1D8DA */, /*26199*/{0,2024u,8585217u,77103131u,40u,1610612768u,52220u,138442752u,67108864u}/* 1D8DB */, /*26200*/{0,2024u,8585217u,77103131u,40u,1610612768u,52228u,138442752u,67108864u}/* 1D8DC */, /*26201*/{0,2024u,8585217u,77103131u,40u,1610612768u,52236u,138442752u,67108864u}/* 1D8DD */, /*26202*/{0,2024u,8585217u,77103131u,40u,1610612768u,52244u,138442752u,67108864u}/* 1D8DE */, /*26203*/{0,2024u,8585217u,77103131u,40u,1610612768u,52252u,138442752u,67108864u}/* 1D8DF */, /*26204*/{0,2024u,8585217u,77103131u,40u,1610612768u,52260u,138442752u,67108864u}/* 1D8E0 */, /*26205*/{0,2024u,8585217u,77103131u,40u,1610612768u,52268u,138442752u,67108864u}/* 1D8E1 */, /*26206*/{0,2024u,8585217u,77103131u,40u,1610612768u,52276u,138442752u,67108864u}/* 1D8E2 */, /*26207*/{0,2024u,8585217u,77103131u,40u,1610612768u,52284u,138442752u,67108864u}/* 1D8E3 */, /*26208*/{0,2024u,8585217u,77103131u,40u,1610612768u,52292u,138442752u,67108864u}/* 1D8E4 */, /*26209*/{0,2024u,8585217u,77103131u,40u,1610612768u,52300u,138442752u,67108864u}/* 1D8E5 */, /*26210*/{0,2024u,8585217u,77103131u,40u,1610612768u,52308u,138442752u,67108864u}/* 1D8E6 */, /*26211*/{0,2024u,8585217u,77103131u,40u,1610612768u,52316u,138442752u,67108864u}/* 1D8E7 */, /*26212*/{0,2024u,8585217u,77103131u,40u,1610612768u,52324u,138442752u,67108864u}/* 1D8E8 */, /*26213*/{0,2024u,8585217u,77103131u,40u,1610612768u,52332u,138442752u,67108864u}/* 1D8E9 */, /*26214*/{0,2024u,8585217u,77103131u,40u,1610612768u,52340u,138442752u,67108864u}/* 1D8EA */, /*26215*/{0,2024u,8585217u,77103131u,40u,1610612768u,52348u,138442752u,67108864u}/* 1D8EB */, /*26216*/{0,2024u,8585217u,77103131u,40u,1610612768u,52356u,138442752u,67108864u}/* 1D8EC */, /*26217*/{0,2024u,8585217u,77103131u,40u,1610612768u,52364u,138442752u,67108864u}/* 1D8ED */, /*26218*/{0,2024u,8585217u,77103131u,40u,1610612768u,52372u,138442752u,67108864u}/* 1D8EE */, /*26219*/{0,2024u,8585217u,77103131u,40u,1610612768u,52380u,138442752u,67108864u}/* 1D8EF */, /*26220*/{0,2024u,8585217u,77103131u,40u,1610612768u,52388u,138442752u,67108864u}/* 1D8F0 */, /*26221*/{0,2024u,8585217u,77103131u,40u,1610612768u,52396u,138442752u,67108864u}/* 1D8F1 */, /*26222*/{0,2024u,8585217u,77103131u,40u,1610612768u,52404u,138442752u,67108864u}/* 1D8F2 */, /*26223*/{0,2024u,8585217u,77103131u,40u,1610612768u,52412u,138442752u,67108864u}/* 1D8F3 */, /*26224*/{0,2024u,8585217u,77103131u,40u,1610612768u,52420u,138442752u,67108864u}/* 1D8F4 */, /*26225*/{0,2024u,8585217u,77103131u,40u,1610612768u,52428u,138442752u,67108864u}/* 1D8F5 */, /*26226*/{0,2024u,8585217u,77103131u,40u,1610612768u,52436u,138442752u,67108864u}/* 1D8F6 */, /*26227*/{0,2024u,8585217u,77103131u,40u,1610612768u,52444u,138442752u,67108864u}/* 1D8F7 */, /*26228*/{0,2024u,8585217u,77103131u,40u,1610612768u,52452u,138442752u,67108864u}/* 1D8F8 */, /*26229*/{0,2024u,8585217u,77103131u,40u,1610612768u,52460u,138442752u,67108864u}/* 1D8F9 */, /*26230*/{0,2024u,8585217u,77103131u,40u,1610612768u,52468u,138442752u,67108864u}/* 1D8FA */, /*26231*/{0,2024u,8585217u,77103131u,40u,1610612768u,52476u,138442752u,67108864u}/* 1D8FB */, /*26232*/{0,2024u,8585217u,77103131u,40u,1610612768u,52484u,138442752u,67108864u}/* 1D8FC */, /*26233*/{0,2024u,8585217u,77103131u,40u,1610612768u,52492u,138442752u,67108864u}/* 1D8FD */, /*26234*/{0,2024u,8585217u,77103131u,40u,1610612768u,52500u,138442752u,67108864u}/* 1D8FE */, /*26235*/{0,2024u,8585217u,77103131u,40u,1610612768u,52508u,138442752u,67108864u}/* 1D8FF */, /*26236*/{0,2024u,8585217u,77103131u,40u,1610612768u,52516u,138442752u,67108864u}/* 1D900 */, /*26237*/{0,2024u,8585217u,77103131u,40u,1610612768u,52524u,138442752u,67108864u}/* 1D901 */, /*26238*/{0,2024u,8585217u,77103131u,40u,1610612768u,52532u,138442752u,67108864u}/* 1D902 */, /*26239*/{0,2024u,8585217u,77103131u,40u,1610612768u,52540u,138442752u,67108864u}/* 1D903 */, /*26240*/{0,2024u,8585217u,77103131u,40u,1610612768u,52548u,138442752u,67108864u}/* 1D904 */, /*26241*/{0,2024u,8585217u,77103131u,40u,1610612768u,52556u,138442752u,67108864u}/* 1D905 */, /*26242*/{0,2024u,8585217u,77103131u,40u,1610612768u,52564u,138442752u,67108864u}/* 1D906 */, /*26243*/{0,2024u,8585217u,77103131u,40u,1610612768u,52572u,138442752u,67108864u}/* 1D907 */, /*26244*/{0,2024u,8585217u,77103131u,40u,1610612768u,52580u,138442752u,67108864u}/* 1D908 */, /*26245*/{0,2024u,8585217u,77103131u,40u,1610612768u,52588u,138442752u,67108864u}/* 1D909 */, /*26246*/{0,2024u,8585217u,77103131u,40u,1610612768u,52596u,138442752u,67108864u}/* 1D90A */, /*26247*/{0,2024u,8585217u,77103131u,40u,1610612768u,52604u,138442752u,67108864u}/* 1D90B */, /*26248*/{0,2024u,8585217u,77103131u,40u,1610612768u,52612u,138442752u,67108864u}/* 1D90C */, /*26249*/{0,2024u,8585217u,77103131u,40u,1610612768u,52620u,138442752u,67108864u}/* 1D90D */, /*26250*/{0,2024u,8585217u,77103131u,40u,1610612768u,52628u,138442752u,67108864u}/* 1D90E */, /*26251*/{0,2024u,8585217u,77103131u,40u,1610612768u,52636u,138442752u,67108864u}/* 1D90F */, /*26252*/{0,2024u,8585217u,77103131u,40u,1610612768u,52644u,138442752u,67108864u}/* 1D910 */, /*26253*/{0,2024u,8585217u,77103131u,40u,1610612768u,52652u,138442752u,67108864u}/* 1D911 */, /*26254*/{0,2024u,8585217u,77103131u,40u,1610612768u,52660u,138442752u,67108864u}/* 1D912 */, /*26255*/{0,2024u,8585217u,77103131u,40u,1610612768u,52668u,138442752u,67108864u}/* 1D913 */, /*26256*/{0,2024u,8585217u,77103131u,40u,1610612768u,52676u,138442752u,67108864u}/* 1D914 */, /*26257*/{0,2024u,8585217u,77103131u,40u,1610612768u,52684u,138442752u,67108864u}/* 1D915 */, /*26258*/{0,2024u,8585217u,77103131u,40u,1610612768u,52692u,138442752u,67108864u}/* 1D916 */, /*26259*/{0,2024u,8585217u,77103131u,40u,1610612768u,52700u,138442752u,67108864u}/* 1D917 */, /*26260*/{0,2024u,8585217u,77103131u,40u,1610612768u,52708u,138442752u,67108864u}/* 1D918 */, /*26261*/{0,2024u,8585217u,77103131u,40u,1610612768u,52716u,138442752u,67108864u}/* 1D919 */, /*26262*/{0,2024u,8585217u,77103131u,40u,1610612768u,52724u,138442752u,67108864u}/* 1D91A */, /*26263*/{0,2024u,8585217u,77103131u,40u,1610612768u,52732u,138442752u,67108864u}/* 1D91B */, /*26264*/{0,2024u,8585217u,77103131u,40u,1610612768u,52740u,138442752u,67108864u}/* 1D91C */, /*26265*/{0,2024u,8585217u,77103131u,40u,1610612768u,52748u,138442752u,67108864u}/* 1D91D */, /*26266*/{0,2024u,8585217u,77103131u,40u,1610612768u,52756u,138442752u,67108864u}/* 1D91E */, /*26267*/{0,2024u,8585217u,77103131u,40u,1610612768u,52764u,138442752u,67108864u}/* 1D91F */, /*26268*/{0,2024u,8585217u,77103131u,40u,1610612768u,52772u,138442752u,67108864u}/* 1D920 */, /*26269*/{0,2024u,8585217u,77103131u,40u,1610612768u,52780u,138442752u,67108864u}/* 1D921 */, /*26270*/{0,2024u,8585217u,77103131u,40u,1610612768u,52788u,138442752u,67108864u}/* 1D922 */, /*26271*/{0,2024u,8585217u,77103131u,40u,1610612768u,52796u,138442752u,67108864u}/* 1D923 */, /*26272*/{0,2024u,8585217u,77103131u,40u,1610612768u,52804u,138442752u,67108864u}/* 1D924 */, /*26273*/{0,2024u,8585217u,77103131u,40u,1610612768u,52812u,138442752u,67108864u}/* 1D925 */, /*26274*/{0,2024u,8585217u,77103131u,40u,1610612768u,52820u,138442752u,67108864u}/* 1D926 */, /*26275*/{0,2024u,8585217u,77103131u,40u,1610612768u,52828u,138442752u,67108864u}/* 1D927 */, /*26276*/{0,2024u,8585217u,77103131u,40u,1610612768u,52836u,138442752u,67108864u}/* 1D928 */, /*26277*/{0,2024u,8585217u,77103131u,40u,1610612768u,52844u,138442752u,67108864u}/* 1D929 */, /*26278*/{0,2024u,8585217u,77103131u,40u,1610612768u,52852u,138442752u,67108864u}/* 1D92A */, /*26279*/{0,2024u,8585217u,77103131u,40u,1610612768u,52860u,138442752u,67108864u}/* 1D92B */, /*26280*/{0,2024u,8585217u,77103131u,40u,1610612768u,52868u,138442752u,67108864u}/* 1D92C */, /*26281*/{0,2024u,8585217u,77103131u,40u,1610612768u,52876u,138442752u,67108864u}/* 1D92D */, /*26282*/{0,2024u,8585217u,77103131u,40u,1610612768u,52884u,138442752u,67108864u}/* 1D92E */, /*26283*/{0,2024u,8585217u,77103131u,40u,1610612768u,52892u,138442752u,67108864u}/* 1D92F */, /*26284*/{0,2024u,8585217u,77103131u,40u,1610612768u,52900u,138442752u,67108864u}/* 1D930 */, /*26285*/{0,2024u,8585217u,77103131u,40u,1610612768u,52908u,138442752u,67108864u}/* 1D931 */, /*26286*/{0,2024u,8585217u,77103131u,40u,1610612768u,52916u,138442752u,67108864u}/* 1D932 */, /*26287*/{0,2024u,8585217u,77103131u,40u,1610612768u,52924u,138442752u,67108864u}/* 1D933 */, /*26288*/{0,2024u,8585217u,77103131u,40u,1610612768u,52932u,138442752u,67108864u}/* 1D934 */, /*26289*/{0,2024u,8585217u,77103131u,40u,1610612768u,52940u,138442752u,67108864u}/* 1D935 */, /*26290*/{0,2024u,8585217u,77103131u,40u,1610612768u,52948u,138442752u,67108864u}/* 1D936 */, /*26291*/{0,2024u,8585217u,77103131u,40u,1610612768u,52956u,138442752u,67108864u}/* 1D937 */, /*26292*/{0,2024u,8585217u,77103131u,40u,1610612768u,52964u,138442752u,67108864u}/* 1D938 */, /*26293*/{0,2024u,8585217u,77103131u,40u,1610612768u,52972u,138442752u,67108864u}/* 1D939 */, /*26294*/{0,2024u,8585217u,77103131u,40u,1610612768u,52980u,138442752u,67108864u}/* 1D93A */, /*26295*/{0,2024u,8585217u,77103131u,40u,1610612768u,52988u,138442752u,67108864u}/* 1D93B */, /*26296*/{0,2024u,8585217u,77103131u,40u,1610612768u,52996u,138442752u,67108864u}/* 1D93C */, /*26297*/{0,2024u,8585217u,77103131u,40u,1610612768u,53004u,138442752u,67108864u}/* 1D93D */, /*26298*/{0,2024u,8585217u,77103131u,40u,1610612768u,53012u,138442752u,67108864u}/* 1D93E */, /*26299*/{0,2024u,8585217u,77103131u,40u,1610612768u,53020u,138442752u,67108864u}/* 1D93F */, /*26300*/{0,2024u,8585217u,77103131u,40u,1610612768u,53028u,138442752u,67108864u}/* 1D940 */, /*26301*/{0,2024u,8585217u,77103131u,40u,1610612768u,53036u,138442752u,67108864u}/* 1D941 */, /*26302*/{0,2024u,8585217u,77103131u,40u,1610612768u,53044u,138442752u,67108864u}/* 1D942 */, /*26303*/{0,2024u,8585217u,77103131u,40u,1610612768u,53052u,138442752u,67108864u}/* 1D943 */, /*26304*/{0,2024u,8585217u,77103131u,40u,1610612768u,53060u,138442752u,67108864u}/* 1D944 */, /*26305*/{0,2024u,8585217u,77103131u,40u,1610612768u,53068u,138442752u,67108864u}/* 1D945 */, /*26306*/{0,2024u,8585217u,77103131u,40u,1610612768u,53076u,138442752u,67108864u}/* 1D946 */, /*26307*/{0,2024u,8585217u,77103131u,40u,1610612768u,53084u,138442752u,67108864u}/* 1D947 */, /*26308*/{0,2024u,8585217u,77103131u,40u,1610612768u,53092u,138442752u,67108864u}/* 1D948 */, /*26309*/{0,2024u,8585217u,77103131u,40u,1610612768u,53100u,138442752u,67108864u}/* 1D949 */, /*26310*/{0,2024u,8585217u,77103131u,40u,1610612768u,53108u,138442752u,67108864u}/* 1D94A */, /*26311*/{0,2024u,8585217u,77103131u,40u,1610612768u,53116u,138442752u,67108864u}/* 1D94B */, /*26312*/{0,2024u,8585217u,77103131u,40u,1610612768u,53124u,138442752u,67108864u}/* 1D94C */, /*26313*/{0,2024u,8585217u,77103131u,40u,1610612768u,53132u,138442752u,67108864u}/* 1D94D */, /*26314*/{0,2024u,8585217u,77103131u,40u,1610612768u,53140u,138442752u,67108864u}/* 1D94E */, /*26315*/{0,2024u,8585217u,77103131u,40u,1610612768u,53148u,138442752u,67108864u}/* 1D94F */, /*26316*/{0,2024u,8585217u,77103131u,40u,1610612768u,53156u,138442752u,67108864u}/* 1D950 */, /*26317*/{0,2024u,8585217u,77103131u,40u,1610612768u,53164u,138442752u,67108864u}/* 1D951 */, /*26318*/{0,2024u,8585217u,77103131u,40u,1610612768u,53172u,138442752u,67108864u}/* 1D952 */, /*26319*/{0,2024u,8585217u,77103131u,40u,1610612768u,53180u,138442752u,67108864u}/* 1D953 */, /*26320*/{0,2024u,8585217u,77103131u,40u,1610612768u,53188u,138442752u,67108864u}/* 1D954 */, /*26321*/{0,2024u,8585217u,77103131u,40u,1610612768u,53196u,138442752u,67108864u}/* 1D955 */, /*26322*/{0,2024u,8585217u,77103131u,40u,1610612768u,53204u,138442752u,67108864u}/* 1D956 */, /*26323*/{0,2024u,8585217u,77103131u,40u,1610612768u,53212u,138442752u,67108864u}/* 1D957 */, /*26324*/{0,2024u,8585217u,77103131u,40u,1610612768u,53220u,138442752u,67108864u}/* 1D958 */, /*26325*/{0,2024u,8585217u,77103131u,40u,1610612768u,53228u,138442752u,67108864u}/* 1D959 */, /*26326*/{0,2024u,8585217u,77103131u,40u,1610612768u,53236u,138442752u,67108864u}/* 1D95A */, /*26327*/{0,2024u,8585217u,77103131u,40u,1610612768u,53244u,138442752u,67108864u}/* 1D95B */, /*26328*/{0,2024u,8585217u,77103131u,40u,1610612768u,53252u,138442752u,67108864u}/* 1D95C */, /*26329*/{0,2024u,8585217u,77103131u,40u,1610612768u,53260u,138442752u,67108864u}/* 1D95D */, /*26330*/{0,2024u,8585217u,77103131u,40u,1610612768u,53268u,138442752u,67108864u}/* 1D95E */, /*26331*/{0,2024u,8585217u,77103131u,40u,1610612768u,53276u,138442752u,67108864u}/* 1D95F */, /*26332*/{0,2024u,8585217u,77103131u,40u,1610612768u,53284u,138442752u,67108864u}/* 1D960 */, /*26333*/{0,2024u,8585217u,77103131u,40u,1610612768u,53292u,138442752u,67108864u}/* 1D961 */, /*26334*/{0,2024u,8585217u,77103131u,40u,1610612768u,53300u,138442752u,67108864u}/* 1D962 */, /*26335*/{0,2024u,8585217u,77103131u,40u,1610612768u,53308u,138442752u,67108864u}/* 1D963 */, /*26336*/{0,2024u,8585217u,77103131u,40u,1610612768u,53316u,138442752u,67108864u}/* 1D964 */, /*26337*/{0,2024u,8585217u,77103131u,40u,1610612768u,53324u,138442752u,67108864u}/* 1D965 */, /*26338*/{0,2024u,8585217u,77103131u,40u,1610612768u,53332u,138442752u,67108864u}/* 1D966 */, /*26339*/{0,2024u,8585217u,77103131u,40u,1610612768u,53340u,138442752u,67108864u}/* 1D967 */, /*26340*/{0,2024u,8585217u,77103131u,40u,1610612768u,53348u,138442752u,67108864u}/* 1D968 */, /*26341*/{0,2024u,8585217u,77103131u,40u,1610612768u,53356u,138442752u,67108864u}/* 1D969 */, /*26342*/{0,2024u,8585217u,77103131u,40u,1610612768u,53364u,138442752u,67108864u}/* 1D96A */, /*26343*/{0,2024u,8585217u,77103131u,40u,1610612768u,53372u,138442752u,67108864u}/* 1D96B */, /*26344*/{0,2024u,8585217u,77103131u,40u,1610612768u,53380u,138442752u,67108864u}/* 1D96C */, /*26345*/{0,2024u,8585217u,77103131u,40u,1610612768u,53388u,138442752u,67108864u}/* 1D96D */, /*26346*/{0,2024u,8585217u,77103131u,40u,1610612768u,53396u,138442752u,67108864u}/* 1D96E */, /*26347*/{0,2024u,8585217u,77103131u,40u,1610612768u,53404u,138442752u,67108864u}/* 1D96F */, /*26348*/{0,2024u,8585217u,77103131u,40u,1610612768u,53412u,138442752u,67108864u}/* 1D970 */, /*26349*/{0,2024u,8585217u,77103131u,40u,1610612768u,53420u,138442752u,67108864u}/* 1D971 */, /*26350*/{0,2024u,8585217u,77103131u,40u,1610612768u,53428u,138442752u,67108864u}/* 1D972 */, /*26351*/{0,2024u,8585217u,77103131u,40u,1610612768u,53436u,138442752u,67108864u}/* 1D973 */, /*26352*/{0,2024u,8585217u,77103131u,40u,1610612768u,53444u,138442752u,67108864u}/* 1D974 */, /*26353*/{0,2024u,8585217u,77103131u,40u,1610612768u,53452u,138442752u,67108864u}/* 1D975 */, /*26354*/{0,2024u,8585217u,77103131u,40u,1610612768u,53460u,138442752u,67108864u}/* 1D976 */, /*26355*/{0,2024u,8585217u,77103131u,40u,1610612768u,53468u,138442752u,67108864u}/* 1D977 */, /*26356*/{0,2024u,8585217u,77103131u,40u,1610612768u,53476u,138442752u,67108864u}/* 1D978 */, /*26357*/{0,2024u,8585217u,77103131u,40u,1610612768u,53484u,138442752u,67108864u}/* 1D979 */, /*26358*/{0,2024u,8585217u,77103131u,40u,1610612768u,53492u,138442752u,67108864u}/* 1D97A */, /*26359*/{0,2024u,8585217u,77103131u,40u,1610612768u,53500u,138442752u,67108864u}/* 1D97B */, /*26360*/{0,2024u,8585217u,77103131u,40u,1610612768u,53508u,138442752u,67108864u}/* 1D97C */, /*26361*/{0,2024u,8585217u,77103131u,40u,1610612768u,53516u,138442752u,67108864u}/* 1D97D */, /*26362*/{0,2024u,8585217u,77103131u,40u,1610612768u,53524u,138442752u,67108864u}/* 1D97E */, /*26363*/{0,2024u,8585217u,77103131u,40u,1610612768u,53532u,138442752u,67108864u}/* 1D97F */, /*26364*/{0,2024u,8585217u,77103131u,40u,1610612768u,53540u,138442752u,67108864u}/* 1D980 */, /*26365*/{0,2024u,8585217u,77103131u,40u,1610612768u,53548u,138442752u,67108864u}/* 1D981 */, /*26366*/{0,2024u,8585217u,77103131u,40u,1610612768u,53556u,138442752u,67108864u}/* 1D982 */, /*26367*/{0,2024u,8585217u,77103131u,40u,1610612768u,53564u,138442752u,67108864u}/* 1D983 */, /*26368*/{0,2024u,8585217u,77103131u,40u,1610612768u,53572u,138442752u,67108864u}/* 1D984 */, /*26369*/{0,2024u,8585217u,77103131u,40u,1610612768u,53580u,138442752u,67108864u}/* 1D985 */, /*26370*/{0,2024u,8585217u,77103131u,40u,1610612768u,53588u,138442752u,67108864u}/* 1D986 */, /*26371*/{0,2024u,8585217u,77103131u,40u,1610612768u,53596u,138442752u,67108864u}/* 1D987 */, /*26372*/{0,2024u,8585217u,77103131u,40u,1610612768u,53604u,138442752u,67108864u}/* 1D988 */, /*26373*/{0,2024u,8585217u,77103131u,40u,1610612768u,53612u,138442752u,67108864u}/* 1D989 */, /*26374*/{0,2024u,8585217u,77103131u,40u,1610612768u,53620u,138442752u,67108864u}/* 1D98A */, /*26375*/{0,2024u,8585217u,77103131u,40u,1610612768u,53628u,138442752u,67108864u}/* 1D98B */, /*26376*/{0,2024u,8585217u,77103131u,40u,1610612768u,53636u,138442752u,67108864u}/* 1D98C */, /*26377*/{0,2024u,8585217u,77103131u,40u,1610612768u,53644u,138442752u,67108864u}/* 1D98D */, /*26378*/{0,2024u,8585217u,77103131u,40u,1610612768u,53652u,138442752u,67108864u}/* 1D98E */, /*26379*/{0,2024u,8585217u,77103131u,40u,1610612768u,53660u,138442752u,67108864u}/* 1D98F */, /*26380*/{0,2024u,8585217u,77103131u,40u,1610612768u,53668u,138442752u,67108864u}/* 1D990 */, /*26381*/{0,2024u,8585217u,77103131u,40u,1610612768u,53676u,138442752u,67108864u}/* 1D991 */, /*26382*/{0,2024u,8585217u,77103131u,40u,1610612768u,53684u,138442752u,67108864u}/* 1D992 */, /*26383*/{0,2024u,8585217u,77103131u,40u,1610612768u,53692u,138442752u,67108864u}/* 1D993 */, /*26384*/{0,2024u,8585217u,77103131u,40u,1610612768u,53700u,138442752u,67108864u}/* 1D994 */, /*26385*/{0,2024u,8585217u,77103131u,40u,1610612768u,53708u,138442752u,67108864u}/* 1D995 */, /*26386*/{0,2024u,8585217u,77103131u,40u,1610612768u,53716u,138442752u,67108864u}/* 1D996 */, /*26387*/{0,2024u,8585217u,77103131u,40u,1610612768u,53724u,138442752u,67108864u}/* 1D997 */, /*26388*/{0,2024u,8585217u,77103131u,40u,1610612768u,53732u,138442752u,67108864u}/* 1D998 */, /*26389*/{0,2024u,8585217u,77103131u,40u,1610612768u,53740u,138442752u,67108864u}/* 1D999 */, /*26390*/{0,2024u,8585217u,77103131u,40u,1610612768u,53748u,138442752u,67108864u}/* 1D99A */, /*26391*/{0,2024u,8585217u,77103131u,40u,1610612768u,53756u,138442752u,67108864u}/* 1D99B */, /*26392*/{0,2024u,8585217u,77103131u,40u,1610612768u,53764u,138442752u,67108864u}/* 1D99C */, /*26393*/{0,2024u,8585217u,77103131u,40u,1610612768u,53772u,138442752u,67108864u}/* 1D99D */, /*26394*/{0,2024u,8585217u,77103131u,40u,1610612768u,53780u,138442752u,67108864u}/* 1D99E */, /*26395*/{0,2024u,8585217u,77103131u,40u,1610612768u,53788u,138442752u,67108864u}/* 1D99F */, /*26396*/{0,2024u,8585217u,77103131u,40u,1610612768u,53796u,138442752u,67108864u}/* 1D9A0 */, /*26397*/{0,2024u,8585217u,77103131u,40u,1610612768u,53804u,138442752u,67108864u}/* 1D9A1 */, /*26398*/{0,2024u,8585217u,77103131u,40u,1610612768u,53812u,138442752u,67108864u}/* 1D9A2 */, /*26399*/{0,2024u,8585217u,77103131u,40u,1610612768u,53820u,138442752u,67108864u}/* 1D9A3 */, /*26400*/{0,2024u,8585217u,77103131u,40u,1610612768u,53828u,138442752u,67108864u}/* 1D9A4 */, /*26401*/{0,2024u,8585217u,77103131u,40u,1610612768u,53836u,138442752u,67108864u}/* 1D9A5 */, /*26402*/{0,2024u,8585217u,77103131u,40u,1610612768u,53844u,138442752u,67108864u}/* 1D9A6 */, /*26403*/{0,2024u,8585217u,77103131u,40u,1610612768u,53852u,138442752u,67108864u}/* 1D9A7 */, /*26404*/{0,2024u,8585217u,77103131u,40u,1610612768u,53860u,138442752u,67108864u}/* 1D9A8 */, /*26405*/{0,2024u,8585217u,77103131u,40u,1610612768u,53868u,138442752u,67108864u}/* 1D9A9 */, /*26406*/{0,2024u,8585217u,77103131u,40u,1610612768u,53876u,138442752u,67108864u}/* 1D9AA */, /*26407*/{0,2024u,8585217u,77103131u,40u,1610612768u,53884u,138442752u,67108864u}/* 1D9AB */, /*26408*/{0,2024u,8585217u,77103131u,40u,1610612768u,53892u,138442752u,67108864u}/* 1D9AC */, /*26409*/{0,2024u,8585217u,77103131u,40u,1610612768u,53900u,138442752u,67108864u}/* 1D9AD */, /*26410*/{0,2024u,8585217u,77103131u,40u,1610612768u,53908u,138442752u,67108864u}/* 1D9AE */, /*26411*/{0,2024u,8585217u,77103131u,40u,1610612768u,53916u,138442752u,67108864u}/* 1D9AF */, /*26412*/{0,2024u,8585217u,77103131u,40u,1610612768u,53924u,138442752u,67108864u}/* 1D9B0 */, /*26413*/{0,2024u,8585217u,77103131u,40u,1610612768u,53932u,138442752u,67108864u}/* 1D9B1 */, /*26414*/{0,2024u,8585217u,77103131u,40u,1610612768u,53940u,138442752u,67108864u}/* 1D9B2 */, /*26415*/{0,2024u,8585217u,77103131u,40u,1610612768u,53948u,138442752u,67108864u}/* 1D9B3 */, /*26416*/{0,2024u,8585217u,77103131u,40u,1610612768u,53956u,138442752u,67108864u}/* 1D9B4 */, /*26417*/{0,2024u,8585217u,77103131u,40u,1610612768u,53964u,138442752u,67108864u}/* 1D9B5 */, /*26418*/{0,2024u,8585217u,77103131u,40u,1610612768u,53972u,138442752u,67108864u}/* 1D9B6 */, /*26419*/{0,2024u,8585217u,77103131u,40u,1610612768u,53980u,138442752u,67108864u}/* 1D9B7 */, /*26420*/{0,2024u,8585217u,77103131u,40u,1610612768u,53988u,138442752u,67108864u}/* 1D9B8 */, /*26421*/{0,2024u,8585217u,77103131u,40u,1610612768u,53996u,138442752u,67108864u}/* 1D9B9 */, /*26422*/{0,2024u,8585217u,77103131u,40u,1610612768u,54004u,138442752u,67108864u}/* 1D9BA */, /*26423*/{0,2024u,8585217u,77103131u,40u,1610612768u,54012u,138442752u,67108864u}/* 1D9BB */, /*26424*/{0,2024u,8585217u,77103131u,40u,1610612768u,54020u,138442752u,67108864u}/* 1D9BC */, /*26425*/{0,2024u,8585217u,77103131u,40u,1610612768u,54028u,138442752u,67108864u}/* 1D9BD */, /*26426*/{0,2024u,8585217u,77103131u,40u,1610612768u,54036u,138442752u,67108864u}/* 1D9BE */, /*26427*/{0,2024u,8585217u,77103131u,40u,1610612768u,54044u,138442752u,67108864u}/* 1D9BF */, /*26428*/{0,2024u,8585217u,77103131u,40u,1610612768u,54052u,138442752u,67108864u}/* 1D9C0 */, /*26429*/{0,2024u,8585217u,77103131u,40u,1610612768u,54060u,138442752u,67108864u}/* 1D9C1 */, /*26430*/{0,2024u,8585217u,77103131u,40u,1610612768u,54068u,138442752u,67108864u}/* 1D9C2 */, /*26431*/{0,2024u,8585217u,77103131u,40u,1610612768u,54076u,138442752u,67108864u}/* 1D9C3 */, /*26432*/{0,2024u,8585217u,77103131u,40u,1610612768u,54084u,138442752u,67108864u}/* 1D9C4 */, /*26433*/{0,2024u,8585217u,77103131u,40u,1610612768u,54092u,138442752u,67108864u}/* 1D9C5 */, /*26434*/{0,2024u,8585217u,77103131u,40u,1610612768u,54100u,138442752u,67108864u}/* 1D9C6 */, /*26435*/{0,2024u,8585217u,77103131u,40u,1610612768u,54108u,138442752u,67108864u}/* 1D9C7 */, /*26436*/{0,2024u,8585217u,77103131u,40u,1610612768u,54116u,138442752u,67108864u}/* 1D9C8 */, /*26437*/{0,2024u,8585217u,77103131u,40u,1610612768u,54124u,138442752u,67108864u}/* 1D9C9 */, /*26438*/{0,2024u,8585217u,77103131u,40u,1610612768u,54132u,138442752u,67108864u}/* 1D9CA */, /*26439*/{0,2024u,8585217u,77103131u,40u,1610612768u,54140u,138442752u,67108864u}/* 1D9CB */, /*26440*/{0,2024u,8585217u,77103131u,40u,1610612768u,54148u,138442752u,67108864u}/* 1D9CC */, /*26441*/{0,2024u,8585217u,77103131u,40u,1610612768u,54156u,138442752u,67108864u}/* 1D9CD */, /*26442*/{0,2024u,8585217u,77103131u,40u,1610612768u,54164u,138442752u,67108864u}/* 1D9CE */, /*26443*/{0,2024u,8585217u,77103131u,40u,1610612768u,54172u,138442752u,67108864u}/* 1D9CF */, /*26444*/{0,2024u,8585217u,77103131u,40u,1610612768u,54180u,138442752u,67108864u}/* 1D9D0 */, /*26445*/{0,2024u,8585217u,77103131u,40u,1610612768u,54188u,138442752u,67108864u}/* 1D9D1 */, /*26446*/{0,2024u,8585217u,77103131u,40u,1610612768u,54196u,138442752u,67108864u}/* 1D9D2 */, /*26447*/{0,2024u,8585217u,77103131u,40u,1610612768u,54204u,138442752u,67108864u}/* 1D9D3 */, /*26448*/{0,2024u,8585217u,77103131u,40u,1610612768u,54212u,138442752u,67108864u}/* 1D9D4 */, /*26449*/{0,2024u,8585217u,77103131u,40u,1610612768u,54220u,138442752u,67108864u}/* 1D9D5 */, /*26450*/{0,2024u,8585217u,77103131u,40u,1610612768u,54228u,138442752u,67108864u}/* 1D9D6 */, /*26451*/{0,2024u,8585217u,77103131u,40u,1610612768u,54236u,138442752u,67108864u}/* 1D9D7 */, /*26452*/{0,2024u,8585217u,77103131u,40u,1610612768u,54244u,138442752u,67108864u}/* 1D9D8 */, /*26453*/{0,2024u,8585217u,77103131u,40u,1610612768u,54252u,138442752u,67108864u}/* 1D9D9 */, /*26454*/{0,2024u,8585217u,77103131u,40u,1610612768u,54260u,138442752u,67108864u}/* 1D9DA */, /*26455*/{0,2024u,8585217u,77103131u,40u,1610612768u,54268u,138442752u,67108864u}/* 1D9DB */, /*26456*/{0,2024u,8585217u,77103131u,40u,1610612768u,54276u,138442752u,67108864u}/* 1D9DC */, /*26457*/{0,2024u,8585217u,77103131u,40u,1610612768u,54284u,138442752u,67108864u}/* 1D9DD */, /*26458*/{0,2024u,8585217u,77103131u,40u,1610612768u,54292u,138442752u,67108864u}/* 1D9DE */, /*26459*/{0,2024u,8585217u,77103131u,40u,1610612768u,54300u,138442752u,67108864u}/* 1D9DF */, /*26460*/{0,2024u,8585217u,77103131u,40u,1610612768u,54308u,138442752u,67108864u}/* 1D9E0 */, /*26461*/{0,2024u,8585217u,77103131u,40u,1610612768u,54316u,138442752u,67108864u}/* 1D9E1 */, /*26462*/{0,2024u,8585217u,77103131u,40u,1610612768u,54324u,138442752u,67108864u}/* 1D9E2 */, /*26463*/{0,2024u,8585217u,77103131u,40u,1610612768u,54332u,138442752u,67108864u}/* 1D9E3 */, /*26464*/{0,2024u,8585217u,77103131u,40u,1610612768u,54340u,138442752u,67108864u}/* 1D9E4 */, /*26465*/{0,2024u,8585217u,77103131u,40u,1610612768u,54348u,138442752u,67108864u}/* 1D9E5 */, /*26466*/{0,2024u,8585217u,77103131u,40u,1610612768u,54356u,138442752u,67108864u}/* 1D9E6 */, /*26467*/{0,2024u,8585217u,77103131u,40u,1610612768u,54364u,138442752u,67108864u}/* 1D9E7 */, /*26468*/{0,2024u,8585217u,77103131u,40u,1610612768u,54372u,138442752u,67108864u}/* 1D9E8 */, /*26469*/{0,2024u,8585217u,77103131u,40u,1610612768u,54380u,138442752u,67108864u}/* 1D9E9 */, /*26470*/{0,2024u,8585217u,77103131u,40u,1610612768u,54388u,138442752u,67108864u}/* 1D9EA */, /*26471*/{0,2024u,8585217u,77103131u,40u,1610612768u,54396u,138442752u,67108864u}/* 1D9EB */, /*26472*/{0,2024u,8585217u,77103131u,40u,1610612768u,54404u,138442752u,67108864u}/* 1D9EC */, /*26473*/{0,2024u,8585217u,77103131u,40u,1610612768u,54412u,138442752u,67108864u}/* 1D9ED */, /*26474*/{0,2024u,8585217u,77103131u,40u,1610612768u,54420u,138442752u,67108864u}/* 1D9EE */, /*26475*/{0,2024u,8585217u,77103131u,40u,1610612768u,54428u,138442752u,67108864u}/* 1D9EF */, /*26476*/{0,2024u,8585217u,77103131u,40u,1610612768u,54436u,138442752u,67108864u}/* 1D9F0 */, /*26477*/{0,2024u,8585217u,77103131u,40u,1610612768u,54444u,138442752u,67108864u}/* 1D9F1 */, /*26478*/{0,2024u,8585217u,77103131u,40u,1610612768u,54452u,138442752u,67108864u}/* 1D9F2 */, /*26479*/{0,2024u,8585217u,77103131u,40u,1610612768u,54460u,138442752u,67108864u}/* 1D9F3 */, /*26480*/{0,2024u,8585217u,77103131u,40u,1610612768u,54468u,138442752u,67108864u}/* 1D9F4 */, /*26481*/{0,2024u,8585217u,77103131u,40u,1610612768u,54476u,138442752u,67108864u}/* 1D9F5 */, /*26482*/{0,2024u,8585217u,77103131u,40u,1610612768u,54484u,138442752u,67108864u}/* 1D9F6 */, /*26483*/{0,2024u,8585217u,77103131u,40u,1610612768u,54492u,138442752u,67108864u}/* 1D9F7 */, /*26484*/{0,2024u,8585217u,77103131u,40u,1610612768u,54500u,138442752u,67108864u}/* 1D9F8 */, /*26485*/{0,2024u,8585217u,77103131u,40u,1610612768u,54508u,138442752u,67108864u}/* 1D9F9 */, /*26486*/{0,2024u,8585217u,77103131u,40u,1610612768u,54516u,138442752u,67108864u}/* 1D9FA */, /*26487*/{0,2024u,8585217u,77103131u,40u,1610612768u,54524u,138442752u,67108864u}/* 1D9FB */, /*26488*/{0,2024u,8585217u,77103131u,40u,1610612768u,54532u,138442752u,67108864u}/* 1D9FC */, /*26489*/{0,2024u,8585217u,77103131u,40u,1610612768u,54540u,138442752u,67108864u}/* 1D9FD */, /*26490*/{0,2024u,8585217u,77103131u,40u,1610612768u,54548u,138442752u,67108864u}/* 1D9FE */, /*26491*/{0,2024u,8585217u,77103131u,40u,1610612768u,54556u,138442752u,67108864u}/* 1D9FF */, /*26492*/{0,2024u,8585217u,68726790u,672030728u,1627389968u,1077936140u,4208640u,262144u}/* 1DA00 */, /*26493*/{0,2024u,8585217u,77103131u,40u,1610612768u,54564u,138442752u,67108864u}/* 1DA37 */, /*26494*/{0,2024u,8585217u,77103131u,40u,1610612768u,54572u,138442752u,67108864u}/* 1DA38 */, /*26495*/{0,2024u,8585217u,77103131u,40u,1610612768u,54580u,138442752u,67108864u}/* 1DA39 */, /*26496*/{0,2024u,8585217u,77103131u,40u,1610612768u,54588u,138442752u,67108864u}/* 1DA3A */, /*26497*/{0,2024u,8585217u,77103131u,40u,1610612768u,54596u,138442752u,67108864u}/* 1DA6D */, /*26498*/{0,2024u,8585217u,77103131u,40u,1610612768u,54604u,138442752u,67108864u}/* 1DA6E */, /*26499*/{0,2024u,8585217u,77103131u,40u,1610612768u,54612u,138442752u,67108864u}/* 1DA6F */, /*26500*/{0,2024u,8585217u,77103131u,40u,1610612768u,54620u,138442752u,67108864u}/* 1DA70 */, /*26501*/{0,2024u,8585217u,77103131u,40u,1610612768u,54628u,138442752u,67108864u}/* 1DA71 */, /*26502*/{0,2024u,8585217u,77103131u,40u,1610612768u,54636u,138442752u,67108864u}/* 1DA72 */, /*26503*/{0,2024u,8585217u,77103131u,40u,1610612768u,54644u,138442752u,67108864u}/* 1DA73 */, /*26504*/{0,2024u,8585217u,77103131u,40u,1610612768u,54652u,138442752u,67108864u}/* 1DA74 */, /*26505*/{0,2024u,8585217u,77103131u,40u,1610612768u,54660u,138442752u,67108864u}/* 1DA76 */, /*26506*/{0,2024u,8585217u,77103131u,40u,1610612768u,54668u,138442752u,67108864u}/* 1DA77 */, /*26507*/{0,2024u,8585217u,77103131u,40u,1610612768u,54676u,138442752u,67108864u}/* 1DA78 */, /*26508*/{0,2024u,8585217u,77103131u,40u,1610612768u,54684u,138442752u,67108864u}/* 1DA79 */, /*26509*/{0,2024u,8585217u,77103131u,40u,1610612768u,54692u,138442752u,67108864u}/* 1DA7A */, /*26510*/{0,2024u,8585217u,77103131u,40u,1610612768u,54700u,138442752u,67108864u}/* 1DA7B */, /*26511*/{0,2024u,8585217u,77103131u,40u,1610612768u,54708u,138442752u,67108864u}/* 1DA7C */, /*26512*/{0,2024u,8585217u,77103131u,40u,1610612768u,54716u,138442752u,67108864u}/* 1DA7D */, /*26513*/{0,2024u,8585217u,77103131u,40u,1610612768u,54724u,138442752u,67108864u}/* 1DA7E */, /*26514*/{0,2024u,8585217u,77103131u,40u,1610612768u,54732u,138442752u,67108864u}/* 1DA7F */, /*26515*/{0,2024u,8585217u,77103131u,40u,1610612768u,54740u,138442752u,67108864u}/* 1DA80 */, /*26516*/{0,2024u,8585217u,77103131u,40u,1610612768u,54748u,138442752u,67108864u}/* 1DA81 */, /*26517*/{0,2024u,8585217u,77103131u,40u,1610612768u,54756u,138442752u,67108864u}/* 1DA82 */, /*26518*/{0,2024u,8585217u,77103131u,40u,1610612768u,54764u,138442752u,67108864u}/* 1DA83 */, /*26519*/{0,2024u,8585217u,77103131u,40u,1610612768u,54772u,138442752u,67108864u}/* 1DA85 */, /*26520*/{0,2024u,8585217u,77103131u,40u,1610612768u,54780u,138442752u,67108864u}/* 1DA86 */, /*26521*/{0,2024u,8585217u,69763095u,40u,1610612768u,9380u,138442754u,8388608u}/* 1DA87 */, /*26522*/{0,2024u,8585217u,69763095u,98344u,1610612768u,9388u,138442754u,41943040u}/* 1DA88 */, /*26523*/{0,2024u,8585217u,69763095u,40u,1610612768u,9396u,138442754u,8388608u}/* 1DA89 */, /*26524*/{0,2024u,8585217u,69763095u,40u,1610612768u,9404u,138442754u,8388608u}/* 1DA8A */, /*26525*/{0,2024u,8585217u,77103127u,40u,1610612768u,9412u,138442754u,0}/* 1DA8B */, /*26526*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006372u,138459648u,262144u}/* 1E000 */, /*26527*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006380u,138459648u,262144u}/* 1E001 */, /*26528*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006388u,138459648u,262144u}/* 1E002 */, /*26529*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006396u,138459648u,262144u}/* 1E003 */, /*26530*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006404u,138459648u,262144u}/* 1E004 */, /*26531*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006412u,138459648u,262144u}/* 1E005 */, /*26532*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006420u,138459648u,262144u}/* 1E006 */, /*26533*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006436u,138459648u,262144u}/* 1E008 */, /*26534*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006444u,138459648u,262144u}/* 1E009 */, /*26535*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006452u,138459648u,262144u}/* 1E00A */, /*26536*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006460u,138459648u,262144u}/* 1E00B */, /*26537*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006468u,138459648u,262144u}/* 1E00C */, /*26538*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006476u,138459648u,262144u}/* 1E00D */, /*26539*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006484u,138459648u,262144u}/* 1E00E */, /*26540*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006492u,138459648u,262144u}/* 1E00F */, /*26541*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006500u,138459648u,262144u}/* 1E010 */, /*26542*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006508u,138459648u,262144u}/* 1E011 */, /*26543*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006516u,138459648u,262144u}/* 1E012 */, /*26544*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006524u,138459648u,262144u}/* 1E013 */, /*26545*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006532u,138459648u,262144u}/* 1E014 */, /*26546*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006540u,138459648u,262144u}/* 1E015 */, /*26547*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006548u,138459648u,262144u}/* 1E016 */, /*26548*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006556u,138459648u,262144u}/* 1E017 */, /*26549*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006564u,138459648u,262144u}/* 1E018 */, /*26550*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006588u,138459648u,262144u}/* 1E01B */, /*26551*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006596u,138459648u,262144u}/* 1E01C */, /*26552*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006604u,138459648u,262144u}/* 1E01D */, /*26553*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006612u,138459648u,262144u}/* 1E01E */, /*26554*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006620u,138459648u,262144u}/* 1E01F */, /*26555*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006628u,138459648u,262144u}/* 1E020 */, /*26556*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006636u,138459648u,262144u}/* 1E021 */, /*26557*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006652u,138459648u,262144u}/* 1E023 */, /*26558*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006660u,138459648u,262144u}/* 1E024 */, /*26559*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006676u,138459648u,262144u}/* 1E026 */, /*26560*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006684u,138459648u,262144u}/* 1E027 */, /*26561*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006692u,138459648u,262144u}/* 1E028 */, /*26562*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006700u,138459648u,262144u}/* 1E029 */, /*26563*/{0,2032u,3735553u,3424202758u,672030728u,3774873616u,1078006708u,138459648u,262144u}/* 1E02A */, /*26564*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677844788u,138442752u,393216u}/* 1E800 */, /*26565*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677844796u,138442752u,393216u}/* 1E801 */, /*26566*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677844804u,138442752u,393216u}/* 1E802 */, /*26567*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677844812u,138442752u,393216u}/* 1E803 */, /*26568*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677844820u,138442752u,393216u}/* 1E804 */, /*26569*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677844828u,138442752u,393216u}/* 1E805 */, /*26570*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677844836u,138442752u,393216u}/* 1E806 */, /*26571*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677844844u,138442752u,393216u}/* 1E807 */, /*26572*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677844852u,138442752u,393216u}/* 1E808 */, /*26573*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677844860u,138442752u,393216u}/* 1E809 */, /*26574*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677844868u,138442752u,393216u}/* 1E80A */, /*26575*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677844876u,138442752u,393216u}/* 1E80B */, /*26576*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677844884u,138442752u,393216u}/* 1E80C */, /*26577*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677844892u,138442752u,393216u}/* 1E80D */, /*26578*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677844900u,138442752u,393216u}/* 1E80E */, /*26579*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677844908u,138442752u,393216u}/* 1E80F */, /*26580*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677844916u,138442752u,393216u}/* 1E810 */, /*26581*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677844924u,138442752u,393216u}/* 1E811 */, /*26582*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677844932u,138442752u,393216u}/* 1E812 */, /*26583*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677844940u,138442752u,393216u}/* 1E813 */, /*26584*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677844948u,138442752u,393216u}/* 1E814 */, /*26585*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677844956u,138442752u,393216u}/* 1E815 */, /*26586*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677844964u,138442752u,393216u}/* 1E816 */, /*26587*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677844972u,138442752u,393216u}/* 1E817 */, /*26588*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677844980u,138442752u,393216u}/* 1E818 */, /*26589*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677844988u,138442752u,393216u}/* 1E819 */, /*26590*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677844996u,138442752u,393216u}/* 1E81A */, /*26591*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845004u,138442752u,393216u}/* 1E81B */, /*26592*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845012u,138442752u,393216u}/* 1E81C */, /*26593*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845020u,138442752u,393216u}/* 1E81D */, /*26594*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845028u,138442752u,393216u}/* 1E81E */, /*26595*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845036u,138442752u,393216u}/* 1E81F */, /*26596*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845044u,138442752u,393216u}/* 1E820 */, /*26597*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845052u,138442752u,393216u}/* 1E821 */, /*26598*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845060u,138442752u,393216u}/* 1E822 */, /*26599*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845068u,138442752u,393216u}/* 1E823 */, /*26600*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845076u,138442752u,393216u}/* 1E824 */, /*26601*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845084u,138442752u,393216u}/* 1E825 */, /*26602*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845092u,138442752u,393216u}/* 1E826 */, /*26603*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845100u,138442752u,393216u}/* 1E827 */, /*26604*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845108u,138442752u,393216u}/* 1E828 */, /*26605*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845116u,138442752u,393216u}/* 1E829 */, /*26606*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845124u,138442752u,393216u}/* 1E82A */, /*26607*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845132u,138442752u,393216u}/* 1E82B */, /*26608*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845140u,138442752u,393216u}/* 1E82C */, /*26609*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845148u,138442752u,393216u}/* 1E82D */, /*26610*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845156u,138442752u,393216u}/* 1E82E */, /*26611*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845164u,138442752u,393216u}/* 1E82F */, /*26612*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845172u,138442752u,393216u}/* 1E830 */, /*26613*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845180u,138442752u,393216u}/* 1E831 */, /*26614*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845188u,138442752u,393216u}/* 1E832 */, /*26615*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845196u,138442752u,393216u}/* 1E833 */, /*26616*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845204u,138442752u,393216u}/* 1E834 */, /*26617*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845212u,138442752u,393216u}/* 1E835 */, /*26618*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845220u,138442752u,393216u}/* 1E836 */, /*26619*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845228u,138442752u,393216u}/* 1E837 */, /*26620*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845236u,138442752u,393216u}/* 1E838 */, /*26621*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845244u,138442752u,393216u}/* 1E839 */, /*26622*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845252u,138442752u,393216u}/* 1E83A */, /*26623*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845260u,138442752u,393216u}/* 1E83B */, /*26624*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845268u,138442752u,393216u}/* 1E83C */, /*26625*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845276u,138442752u,393216u}/* 1E83D */, /*26626*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845284u,138442752u,393216u}/* 1E83E */, /*26627*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845292u,138442752u,393216u}/* 1E83F */, /*26628*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845300u,138442752u,393216u}/* 1E840 */, /*26629*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845308u,138442752u,393216u}/* 1E841 */, /*26630*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845316u,138442752u,393216u}/* 1E842 */, /*26631*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845324u,138442752u,393216u}/* 1E843 */, /*26632*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845332u,138442752u,393216u}/* 1E844 */, /*26633*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845340u,138442752u,393216u}/* 1E845 */, /*26634*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845348u,138442752u,393216u}/* 1E846 */, /*26635*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845356u,138442752u,393216u}/* 1E847 */, /*26636*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845364u,138442752u,393216u}/* 1E848 */, /*26637*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845372u,138442752u,393216u}/* 1E849 */, /*26638*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845380u,138442752u,393216u}/* 1E84A */, /*26639*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845388u,138442752u,393216u}/* 1E84B */, /*26640*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845396u,138442752u,393216u}/* 1E84C */, /*26641*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845404u,138442752u,393216u}/* 1E84D */, /*26642*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845412u,138442752u,393216u}/* 1E84E */, /*26643*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845420u,138442752u,393216u}/* 1E84F */, /*26644*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845428u,138442752u,393216u}/* 1E850 */, /*26645*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845436u,138442752u,393216u}/* 1E851 */, /*26646*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845444u,138442752u,393216u}/* 1E852 */, /*26647*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845452u,138442752u,393216u}/* 1E853 */, /*26648*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845460u,138442752u,393216u}/* 1E854 */, /*26649*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845468u,138442752u,393216u}/* 1E855 */, /*26650*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845476u,138442752u,393216u}/* 1E856 */, /*26651*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845484u,138442752u,393216u}/* 1E857 */, /*26652*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845492u,138442752u,393216u}/* 1E858 */, /*26653*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845500u,138442752u,393216u}/* 1E859 */, /*26654*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845508u,138442752u,393216u}/* 1E85A */, /*26655*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845516u,138442752u,393216u}/* 1E85B */, /*26656*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845524u,138442752u,393216u}/* 1E85C */, /*26657*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845532u,138442752u,393216u}/* 1E85D */, /*26658*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845540u,138442752u,393216u}/* 1E85E */, /*26659*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845548u,138442752u,393216u}/* 1E85F */, /*26660*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845556u,138442752u,393216u}/* 1E860 */, /*26661*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845564u,138442752u,393216u}/* 1E861 */, /*26662*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845572u,138442752u,393216u}/* 1E862 */, /*26663*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845580u,138442752u,393216u}/* 1E863 */, /*26664*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845588u,138442752u,393216u}/* 1E864 */, /*26665*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845596u,138442752u,393216u}/* 1E865 */, /*26666*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845604u,138442752u,393216u}/* 1E866 */, /*26667*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845612u,138442752u,393216u}/* 1E867 */, /*26668*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845620u,138442752u,393216u}/* 1E868 */, /*26669*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845628u,138442752u,393216u}/* 1E869 */, /*26670*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845636u,138442752u,393216u}/* 1E86A */, /*26671*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845644u,138442752u,393216u}/* 1E86B */, /*26672*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845652u,138442752u,393216u}/* 1E86C */, /*26673*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845660u,138442752u,393216u}/* 1E86D */, /*26674*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845668u,138442752u,393216u}/* 1E86E */, /*26675*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845676u,138442752u,393216u}/* 1E86F */, /*26676*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845684u,138442752u,393216u}/* 1E870 */, /*26677*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845692u,138442752u,393216u}/* 1E871 */, /*26678*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845700u,138442752u,393216u}/* 1E872 */, /*26679*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845708u,138442752u,393216u}/* 1E873 */, /*26680*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845716u,138442752u,393216u}/* 1E874 */, /*26681*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845724u,138442752u,393216u}/* 1E875 */, /*26682*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845732u,138442752u,393216u}/* 1E876 */, /*26683*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845740u,138442752u,393216u}/* 1E877 */, /*26684*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845748u,138442752u,393216u}/* 1E878 */, /*26685*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845756u,138442752u,393216u}/* 1E879 */, /*26686*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845764u,138442752u,393216u}/* 1E87A */, /*26687*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845772u,138442752u,393216u}/* 1E87B */, /*26688*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845780u,138442752u,393216u}/* 1E87C */, /*26689*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845788u,138442752u,393216u}/* 1E87D */, /*26690*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845796u,138442752u,393216u}/* 1E87E */, /*26691*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845804u,138442752u,393216u}/* 1E87F */, /*26692*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845812u,138442752u,393216u}/* 1E880 */, /*26693*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845820u,138442752u,393216u}/* 1E881 */, /*26694*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845828u,138442752u,393216u}/* 1E882 */, /*26695*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845836u,138442752u,393216u}/* 1E883 */, /*26696*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845844u,138442752u,393216u}/* 1E884 */, /*26697*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845852u,138442752u,393216u}/* 1E885 */, /*26698*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845860u,138442752u,393216u}/* 1E886 */, /*26699*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845868u,138442752u,393216u}/* 1E887 */, /*26700*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845876u,138442752u,393216u}/* 1E888 */, /*26701*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845884u,138442752u,393216u}/* 1E889 */, /*26702*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845892u,138442752u,393216u}/* 1E88A */, /*26703*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845900u,138442752u,393216u}/* 1E88B */, /*26704*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845908u,138442752u,393216u}/* 1E88C */, /*26705*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845916u,138442752u,393216u}/* 1E88D */, /*26706*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845924u,138442752u,393216u}/* 1E88E */, /*26707*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845932u,138442752u,393216u}/* 1E88F */, /*26708*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845940u,138442752u,393216u}/* 1E890 */, /*26709*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845948u,138442752u,393216u}/* 1E891 */, /*26710*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845956u,138442752u,393216u}/* 1E892 */, /*26711*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845964u,138442752u,393216u}/* 1E893 */, /*26712*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845972u,138442752u,393216u}/* 1E894 */, /*26713*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845980u,138442752u,393216u}/* 1E895 */, /*26714*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845988u,138442752u,393216u}/* 1E896 */, /*26715*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677845996u,138442752u,393216u}/* 1E897 */, /*26716*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846004u,138442752u,393216u}/* 1E898 */, /*26717*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846012u,138442752u,393216u}/* 1E899 */, /*26718*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846020u,138442752u,393216u}/* 1E89A */, /*26719*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846028u,138442752u,393216u}/* 1E89B */, /*26720*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846036u,138442752u,393216u}/* 1E89C */, /*26721*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846044u,138442752u,393216u}/* 1E89D */, /*26722*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846052u,138442752u,393216u}/* 1E89E */, /*26723*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846060u,138442752u,393216u}/* 1E89F */, /*26724*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846068u,138442752u,393216u}/* 1E8A0 */, /*26725*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846076u,138442752u,393216u}/* 1E8A1 */, /*26726*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846084u,138442752u,393216u}/* 1E8A2 */, /*26727*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846092u,138442752u,393216u}/* 1E8A3 */, /*26728*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846100u,138442752u,393216u}/* 1E8A4 */, /*26729*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846108u,138442752u,393216u}/* 1E8A5 */, /*26730*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846116u,138442752u,393216u}/* 1E8A6 */, /*26731*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846124u,138442752u,393216u}/* 1E8A7 */, /*26732*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846132u,138442752u,393216u}/* 1E8A8 */, /*26733*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846140u,138442752u,393216u}/* 1E8A9 */, /*26734*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846148u,138442752u,393216u}/* 1E8AA */, /*26735*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846156u,138442752u,393216u}/* 1E8AB */, /*26736*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846164u,138442752u,393216u}/* 1E8AC */, /*26737*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846172u,138442752u,393216u}/* 1E8AD */, /*26738*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846180u,138442752u,393216u}/* 1E8AE */, /*26739*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846188u,138442752u,393216u}/* 1E8AF */, /*26740*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846196u,138442752u,393216u}/* 1E8B0 */, /*26741*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846204u,138442752u,393216u}/* 1E8B1 */, /*26742*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846212u,138442752u,393216u}/* 1E8B2 */, /*26743*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846220u,138442752u,393216u}/* 1E8B3 */, /*26744*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846228u,138442752u,393216u}/* 1E8B4 */, /*26745*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846236u,138442752u,393216u}/* 1E8B5 */, /*26746*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846244u,138442752u,393216u}/* 1E8B6 */, /*26747*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846252u,138442752u,393216u}/* 1E8B7 */, /*26748*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846260u,138442752u,393216u}/* 1E8B8 */, /*26749*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846268u,138442752u,393216u}/* 1E8B9 */, /*26750*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846276u,138442752u,393216u}/* 1E8BA */, /*26751*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846284u,138442752u,393216u}/* 1E8BB */, /*26752*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846292u,138442752u,393216u}/* 1E8BC */, /*26753*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846300u,138442752u,393216u}/* 1E8BD */, /*26754*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846308u,138442752u,393216u}/* 1E8BE */, /*26755*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846316u,138442752u,393216u}/* 1E8BF */, /*26756*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846324u,138442752u,393216u}/* 1E8C0 */, /*26757*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846332u,138442752u,393216u}/* 1E8C1 */, /*26758*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846340u,138442752u,393216u}/* 1E8C2 */, /*26759*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846348u,138442752u,393216u}/* 1E8C3 */, /*26760*/{0,2040u,7405569u,77071365u,1515560u,3758096416u,1677846356u,138442752u,393216u}/* 1E8C4 */, /*26761*/{0,2040u,544278017u,77071371u,8388650u,1610612768u,58669u,138442752u,0}/* 1E8C7 */, /*26762*/{0,2040u,577833473u,77071371u,8388650u,1610612768u,58677u,138442752u,0}/* 1E8C8 */, /*26763*/{0,2040u,611387393u,77071371u,8388650u,1610612768u,58685u,138442752u,0}/* 1E8C9 */, /*26764*/{0,2040u,644943873u,77071371u,8388650u,1610612768u,58693u,138442752u,0}/* 1E8CA */, /*26765*/{0,2040u,678497281u,77071371u,8388650u,1610612768u,58701u,138442752u,0}/* 1E8CB */, /*26766*/{0,2040u,712054273u,77071371u,8388650u,1610612768u,58709u,138442752u,0}/* 1E8CC */, /*26767*/{0,2040u,745606657u,77071371u,8388650u,1610612768u,58717u,138442752u,0}/* 1E8CD */, /*26768*/{0,2040u,779164673u,77071371u,8388650u,1610612768u,58725u,138442752u,0}/* 1E8CE */, /*26769*/{0,2040u,812717057u,77071371u,8388650u,1610612768u,58733u,138442752u,0}/* 1E8CF */, /*26770*/{0,2040u,7405569u,3088592902u,672030728u,1627398160u,1077936140u,4208640u,262144u}/* 1E8D0 */, /*26771*/{326912u,2650802176u,8650753u,77136897u,1507496u,3807903776u,1711400796u,138491904u,2490368u}/* 1E900 */, /*26772*/{327040u,2652899328u,8650753u,77136897u,1507496u,3807903776u,1711400804u,138491904u,2490368u}/* 1E901 */, /*26773*/{327168u,2654996480u,8650753u,77136897u,1507496u,3807903776u,1711400812u,138491904u,2490368u}/* 1E902 */, /*26774*/{327296u,2657093632u,8650753u,77136897u,1507496u,3807903776u,1711400820u,138491904u,2490368u}/* 1E903 */, /*26775*/{327424u,2659190784u,8650753u,77136897u,1507496u,3807903776u,1711400828u,138491904u,2490368u}/* 1E904 */, /*26776*/{327552u,2661287936u,8650753u,77136897u,1507496u,3807903776u,1711400836u,138491904u,2490368u}/* 1E905 */, /*26777*/{327680u,2663385088u,8650753u,77136897u,1507496u,3807903776u,1711400844u,138491904u,2490368u}/* 1E906 */, /*26778*/{327808u,2665482240u,8650753u,77136897u,1507496u,3807903776u,1711400852u,138491904u,2490368u}/* 1E907 */, /*26779*/{327936u,2667579392u,8650753u,77136897u,1507496u,3807903776u,1711400860u,138491904u,2490368u}/* 1E908 */, /*26780*/{328064u,2669676544u,8650753u,77136897u,1507496u,3807903776u,1711400868u,138491904u,2490368u}/* 1E909 */, /*26781*/{328192u,2671773696u,8650753u,77136897u,1507496u,3807903776u,1711400876u,138491904u,2490368u}/* 1E90A */, /*26782*/{328320u,2673870848u,8650753u,77136897u,1507496u,3807903776u,1711400884u,138491904u,2490368u}/* 1E90B */, /*26783*/{328448u,2675968000u,8650753u,77136897u,1507496u,3807903776u,1711400892u,138491904u,2490368u}/* 1E90C */, /*26784*/{328576u,2678065152u,8650753u,77136897u,1507496u,3807903776u,1711400900u,138491904u,2490368u}/* 1E90D */, /*26785*/{328704u,2680162304u,8650753u,77136897u,1507496u,3807903776u,1711400908u,138491904u,2490368u}/* 1E90E */, /*26786*/{328832u,2682259456u,8650753u,77136897u,1507496u,3807903776u,1711400916u,138491904u,2490368u}/* 1E90F */, /*26787*/{328960u,2684356608u,8650753u,77136897u,1507496u,3807903776u,1711400924u,138491904u,2490368u}/* 1E910 */, /*26788*/{329088u,2686453760u,8650753u,77136897u,1507496u,3807903776u,1711400932u,138491904u,2490368u}/* 1E911 */, /*26789*/{329216u,2688550912u,8650753u,77136897u,1507496u,3807903776u,1711400940u,138491904u,2490368u}/* 1E912 */, /*26790*/{329344u,2690648064u,8650753u,77136897u,1507496u,3807903776u,1711400948u,138491904u,2490368u}/* 1E913 */, /*26791*/{329472u,2692745216u,8650753u,77136897u,1507496u,3807903776u,1711400956u,138491904u,2490368u}/* 1E914 */, /*26792*/{329600u,2694842368u,8650753u,77136897u,1507496u,3807903776u,1711400964u,138491904u,2490368u}/* 1E915 */, /*26793*/{329728u,2696939520u,8650753u,77136897u,1507496u,3807903776u,1711400972u,138491904u,2490368u}/* 1E916 */, /*26794*/{329856u,2699036672u,8650753u,77136897u,1507496u,3807903776u,1711400980u,138491904u,2490368u}/* 1E917 */, /*26795*/{329984u,2701133824u,8650753u,77136897u,1507496u,3807903776u,1711400988u,138491904u,2490368u}/* 1E918 */, /*26796*/{330112u,2703230976u,8650753u,77136897u,1507496u,3807903776u,1711400996u,138491904u,2490368u}/* 1E919 */, /*26797*/{330240u,2705328128u,8650753u,77136897u,1507496u,3807903776u,1711401004u,138491904u,2490368u}/* 1E91A */, /*26798*/{330368u,2707425280u,8650753u,77136897u,1507496u,3807903776u,1711401012u,138491904u,2490368u}/* 1E91B */, /*26799*/{330496u,2709522432u,8650753u,77136897u,1507496u,3807903776u,1711401020u,138491904u,2490368u}/* 1E91C */, /*26800*/{330624u,2711619584u,8650753u,77136897u,1507496u,3807903776u,1711401028u,138491904u,2490368u}/* 1E91D */, /*26801*/{330752u,2713716736u,8650753u,77136897u,1507496u,3807903776u,1711401036u,138491904u,2490368u}/* 1E91E */, /*26802*/{330880u,2715813888u,8650753u,77136897u,1507496u,3807903776u,1711401044u,138491904u,2490368u}/* 1E91F */, /*26803*/{331008u,2717911040u,8650753u,77136897u,1507496u,3807903776u,1711401052u,138491904u,2490368u}/* 1E920 */, /*26804*/{331136u,2720008192u,8650753u,77136897u,1507496u,3807903776u,1711401060u,138491904u,2490368u}/* 1E921 */, /*26805*/{331264u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789404u,138442752u,393216u}/* 1E922 */, /*26806*/{331392u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789412u,138442752u,393216u}/* 1E923 */, /*26807*/{331520u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789420u,138442752u,393216u}/* 1E924 */, /*26808*/{331648u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789428u,138442752u,393216u}/* 1E925 */, /*26809*/{331776u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789436u,138442752u,393216u}/* 1E926 */, /*26810*/{331904u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789444u,138442752u,393216u}/* 1E927 */, /*26811*/{332032u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789452u,138442752u,393216u}/* 1E928 */, /*26812*/{332160u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789460u,138442752u,393216u}/* 1E929 */, /*26813*/{332288u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789468u,138442752u,393216u}/* 1E92A */, /*26814*/{332416u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789476u,138442752u,393216u}/* 1E92B */, /*26815*/{332544u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789484u,138442752u,393216u}/* 1E92C */, /*26816*/{332672u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789492u,138442752u,393216u}/* 1E92D */, /*26817*/{332800u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789500u,138442752u,393216u}/* 1E92E */, /*26818*/{332928u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789508u,138442752u,393216u}/* 1E92F */, /*26819*/{333056u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789516u,138442752u,393216u}/* 1E930 */, /*26820*/{333184u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789524u,138442752u,393216u}/* 1E931 */, /*26821*/{333312u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789532u,138442752u,393216u}/* 1E932 */, /*26822*/{333440u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789540u,138442752u,393216u}/* 1E933 */, /*26823*/{333568u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789548u,138442752u,393216u}/* 1E934 */, /*26824*/{333696u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789556u,138442752u,393216u}/* 1E935 */, /*26825*/{333824u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789564u,138442752u,393216u}/* 1E936 */, /*26826*/{333952u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789572u,138442752u,393216u}/* 1E937 */, /*26827*/{334080u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789580u,138442752u,393216u}/* 1E938 */, /*26828*/{334208u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789588u,138442752u,393216u}/* 1E939 */, /*26829*/{334336u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789596u,138442752u,393216u}/* 1E93A */, /*26830*/{334464u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789604u,138442752u,393216u}/* 1E93B */, /*26831*/{334592u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789612u,138442752u,393216u}/* 1E93C */, /*26832*/{334720u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789620u,138442752u,393216u}/* 1E93D */, /*26833*/{334848u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789628u,138442752u,393216u}/* 1E93E */, /*26834*/{334976u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789636u,138442752u,393216u}/* 1E93F */, /*26835*/{335104u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789644u,138442752u,393216u}/* 1E940 */, /*26836*/{335232u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789652u,138442752u,393216u}/* 1E941 */, /*26837*/{335360u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789660u,138442752u,393216u}/* 1E942 */, /*26838*/{335488u,2048u,8650753u,77136898u,1499304u,3768975392u,1719789668u,138442752u,393216u}/* 1E943 */, /*26839*/{0,2048u,8650753u,3424202758u,672030728u,1627398288u,1077936140u,796948480u,262144u}/* 1E944 */, /*26840*/{0,2048u,8650753u,3424202758u,672030728u,3774873616u,1077936140u,805337600u,262144u}/* 1E947 */, /*26841*/{0,2048u,8650753u,3424202758u,672030728u,1627398160u,1077936140u,809531392u,262144u}/* 1E948 */, /*26842*/{0,2048u,8650753u,3424202758u,672030728u,1627398160u,1077936140u,813725696u,262144u}/* 1E949 */, /*26843*/{0,2048u,8650753u,202977286u,672030728u,1627398160u,1077936140u,801142784u,262144u}/* 1E94A */, /*26844*/{0,2048u,42206209u,85525513u,10436654u,1610612768u,1073800485u,138442752u,262144u}/* 1E950 */, /*26845*/{0,2048u,545523201u,85525513u,10436654u,1610612768u,1073800493u,138442752u,262144u}/* 1E951 */, /*26846*/{0,2048u,579078657u,85525513u,10436654u,1610612768u,1073800501u,138442752u,262144u}/* 1E952 */, /*26847*/{0,2048u,612632577u,85525513u,10436654u,1610612768u,1073800509u,138442752u,262144u}/* 1E953 */, /*26848*/{0,2048u,646189057u,85525513u,10436654u,1610612768u,1073800517u,138442752u,262144u}/* 1E954 */, /*26849*/{0,2048u,679742465u,85525513u,10436654u,1610612768u,1073800525u,138442752u,262144u}/* 1E955 */, /*26850*/{0,2048u,713299457u,85525513u,10436654u,1610612768u,1073800533u,138442752u,262144u}/* 1E956 */, /*26851*/{0,2048u,746851841u,85525513u,10436654u,1610612768u,1073800541u,138442752u,262144u}/* 1E957 */, /*26852*/{0,2048u,780409857u,85525513u,10436654u,1610612768u,1073800549u,138442752u,262144u}/* 1E958 */, /*26853*/{0,2048u,813962241u,85525513u,10436654u,1610612768u,1073800557u,138442752u,262144u}/* 1E959 */, /*26854*/{0,2048u,8650753u,80282647u,40u,1610612768u,4924u,138442754u,0}/* 1E95E */, /*26855*/{0,2048u,8650753u,80282647u,40u,1610612768u,5044u,138442754u,0}/* 1E95F */, /*26856*/{2571632640u,2056u,458753u,76985445u,1515552u,3758620704u,1677794198u,138465288u,393216u}/* 1EE00 */, /*26857*/{2572156928u,2056u,458753u,76985445u,1515552u,3758620704u,1677794214u,138465288u,393216u}/* 1EE01 */, /*26858*/{2572681216u,2056u,458753u,76985445u,1515552u,3758620704u,1677794406u,138465288u,393216u}/* 1EE02 */, /*26859*/{2573205504u,2056u,458753u,76985445u,1515552u,3758620704u,1677794550u,138465288u,393216u}/* 1EE03 */, /*26860*/{2573729792u,2056u,458753u,76985445u,1515552u,3758620704u,1677795574u,138465288u,393216u}/* 1EE05 */, /*26861*/{2574254080u,2056u,458753u,76985445u,1515552u,3758620704u,1677794678u,138465288u,393216u}/* 1EE06 */, /*26862*/{2574778368u,2056u,458753u,76985445u,1515552u,3758620704u,1677794462u,138465288u,393216u}/* 1EE07 */, /*26863*/{2575302656u,2056u,458753u,76985445u,1515552u,3758620704u,1677794958u,138465288u,393216u}/* 1EE08 */, /*26864*/{2575826944u,2056u,458753u,76985445u,1515552u,3758620704u,1677795694u,138465288u,393216u}/* 1EE09 */, /*26865*/{2576351232u,2056u,458753u,76985445u,1515552u,3758620704u,1677795190u,138465288u,393216u}/* 1EE0A */, /*26866*/{2576875520u,2056u,458753u,76985445u,1515552u,3758620704u,1677795358u,138465288u,393216u}/* 1EE0B */, /*26867*/{2577399808u,2056u,458753u,76985445u,1515552u,3758620704u,1677795414u,138465288u,393216u}/* 1EE0C */, /*26868*/{2577924096u,2056u,458753u,76985445u,1515552u,3758620704u,1677795446u,138465288u,393216u}/* 1EE0D */, /*26869*/{2578448384u,2056u,458753u,76985445u,1515552u,3758620704u,1677794822u,138465288u,393216u}/* 1EE0E */, /*26870*/{2578972672u,2056u,458753u,76985445u,1515552u,3758620704u,1677794990u,138465288u,393216u}/* 1EE0F */, /*26871*/{2579496960u,2056u,458753u,76985445u,1515552u,3758620704u,1677795054u,138465288u,393216u}/* 1EE10 */, /*26872*/{2580021248u,2056u,458753u,76985445u,1515552u,3758620704u,1677794910u,138465288u,393216u}/* 1EE11 */, /*26873*/{2580545536u,2056u,458753u,76985445u,1515552u,3758620704u,1677795150u,138465288u,393216u}/* 1EE12 */, /*26874*/{2581069824u,2056u,458753u,76985445u,1515552u,3758620704u,1677794670u,138465288u,393216u}/* 1EE13 */, /*26875*/{2581594112u,2056u,458753u,76985445u,1515552u,3758620704u,1677794830u,138465288u,393216u}/* 1EE14 */, /*26876*/{2582118400u,2056u,458753u,76985445u,1515552u,3758620704u,1677794342u,138465288u,393216u}/* 1EE15 */, /*26877*/{2582642688u,2056u,458753u,76985445u,1515552u,3758620704u,1677794350u,138465288u,393216u}/* 1EE16 */, /*26878*/{2583166976u,2056u,458753u,76985445u,1515552u,3758620704u,1677794470u,138465288u,393216u}/* 1EE17 */, /*26879*/{2583691264u,2056u,458753u,76985445u,1515552u,3758620704u,1677794558u,138465288u,393216u}/* 1EE18 */, /*26880*/{2584215552u,2056u,458753u,76985445u,1515552u,3758620704u,1677794918u,138465288u,393216u}/* 1EE19 */, /*26881*/{2584739840u,2056u,458753u,76985445u,1515552u,3758620704u,1677794966u,138465288u,393216u}/* 1EE1A */, /*26882*/{2585264128u,2056u,458753u,76985445u,1515552u,3758620704u,1677794998u,138465288u,393216u}/* 1EE1B */, /*26883*/{2585788416u,2056u,458753u,76985445u,1515552u,3758620704u,1677794206u,138465288u,393216u}/* 1EE1C */, /*26884*/{2586312704u,2056u,458753u,76985445u,1515552u,3758620704u,1677795454u,138465288u,393216u}/* 1EE1D */, /*26885*/{2586836992u,2056u,458753u,76985445u,1515552u,3758620704u,1677795062u,138465288u,393216u}/* 1EE1E */, /*26886*/{2587361280u,2056u,458753u,76985445u,1515552u,3758620704u,1677795142u,138465288u,393216u}/* 1EE1F */, /*26887*/{2587885568u,2056u,458753u,76985445u,1515552u,3758620704u,1677794214u,138465288u,393216u}/* 1EE21 */, /*26888*/{2588409856u,2056u,458753u,76985445u,1515552u,3758620704u,1677794406u,138465288u,393216u}/* 1EE22 */, /*26889*/{2588934144u,2056u,458753u,76985445u,1515552u,3758620704u,1677795526u,138465288u,393216u}/* 1EE24 */, /*26890*/{2589458432u,2056u,458753u,76985445u,1515552u,3758620704u,1677794462u,138465288u,393216u}/* 1EE27 */, /*26891*/{2589982720u,2056u,458753u,76985445u,1515552u,3758620704u,1677795694u,138465288u,393216u}/* 1EE29 */, /*26892*/{2590507008u,2056u,458753u,76985445u,1515552u,3758620704u,1677795190u,138465288u,393216u}/* 1EE2A */, /*26893*/{2591031296u,2056u,458753u,76985445u,1515552u,3758620704u,1677795358u,138465288u,393216u}/* 1EE2B */, /*26894*/{2591555584u,2056u,458753u,76985445u,1515552u,3758620704u,1677795414u,138465288u,393216u}/* 1EE2C */, /*26895*/{2592079872u,2056u,458753u,76985445u,1515552u,3758620704u,1677795446u,138465288u,393216u}/* 1EE2D */, /*26896*/{2592604160u,2056u,458753u,76985445u,1515552u,3758620704u,1677794822u,138465288u,393216u}/* 1EE2E */, /*26897*/{2593128448u,2056u,458753u,76985445u,1515552u,3758620704u,1677794990u,138465288u,393216u}/* 1EE2F */, /*26898*/{2593652736u,2056u,458753u,76985445u,1515552u,3758620704u,1677795054u,138465288u,393216u}/* 1EE30 */, /*26899*/{2594177024u,2056u,458753u,76985445u,1515552u,3758620704u,1677794910u,138465288u,393216u}/* 1EE31 */, /*26900*/{2594701312u,2056u,458753u,76985445u,1515552u,3758620704u,1677795150u,138465288u,393216u}/* 1EE32 */, /*26901*/{2595225600u,2056u,458753u,76985445u,1515552u,3758620704u,1677794830u,138465288u,393216u}/* 1EE34 */, /*26902*/{2595749888u,2056u,458753u,76985445u,1515552u,3758620704u,1677794342u,138465288u,393216u}/* 1EE35 */, /*26903*/{2596274176u,2056u,458753u,76985445u,1515552u,3758620704u,1677794350u,138465288u,393216u}/* 1EE36 */, /*26904*/{2596798464u,2056u,458753u,76985445u,1515552u,3758620704u,1677794470u,138465288u,393216u}/* 1EE37 */, /*26905*/{2597322752u,2056u,458753u,76985445u,1515552u,3758620704u,1677794918u,138465288u,393216u}/* 1EE39 */, /*26906*/{2597847040u,2056u,458753u,76985445u,1515552u,3758620704u,1677794998u,138465288u,393216u}/* 1EE3B */, /*26907*/{2598371328u,2056u,458753u,76985445u,1515552u,3758620704u,1677794406u,138465288u,393216u}/* 1EE42 */, /*26908*/{2598895616u,2056u,458753u,76985445u,1515552u,3758620704u,1677794462u,138465288u,393216u}/* 1EE47 */, /*26909*/{2599419904u,2056u,458753u,76985445u,1515552u,3758620704u,1677795694u,138465288u,393216u}/* 1EE49 */, /*26910*/{2599944192u,2056u,458753u,76985445u,1515552u,3758620704u,1677795358u,138465288u,393216u}/* 1EE4B */, /*26911*/{2600468480u,2056u,458753u,76985445u,1515552u,3758620704u,1677795446u,138465288u,393216u}/* 1EE4D */, /*26912*/{2600992768u,2056u,458753u,76985445u,1515552u,3758620704u,1677794822u,138465288u,393216u}/* 1EE4E */, /*26913*/{2601517056u,2056u,458753u,76985445u,1515552u,3758620704u,1677794990u,138465288u,393216u}/* 1EE4F */, /*26914*/{2602041344u,2056u,458753u,76985445u,1515552u,3758620704u,1677794910u,138465288u,393216u}/* 1EE51 */, /*26915*/{2602565632u,2056u,458753u,76985445u,1515552u,3758620704u,1677795150u,138465288u,393216u}/* 1EE52 */, /*26916*/{2603089920u,2056u,458753u,76985445u,1515552u,3758620704u,1677794830u,138465288u,393216u}/* 1EE54 */, /*26917*/{2603614208u,2056u,458753u,76985445u,1515552u,3758620704u,1677794470u,138465288u,393216u}/* 1EE57 */, /*26918*/{2604138496u,2056u,458753u,76985445u,1515552u,3758620704u,1677794918u,138465288u,393216u}/* 1EE59 */, /*26919*/{2604662784u,2056u,458753u,76985445u,1515552u,3758620704u,1677794998u,138465288u,393216u}/* 1EE5B */, /*26920*/{2605187072u,2056u,458753u,76985445u,1515552u,3758620704u,1677795454u,138465288u,393216u}/* 1EE5D */, /*26921*/{2605711360u,2056u,458753u,76985445u,1515552u,3758620704u,1677795142u,138465288u,393216u}/* 1EE5F */, /*26922*/{2606235648u,2056u,458753u,76985445u,1515552u,3758620704u,1677794214u,138465288u,393216u}/* 1EE61 */, /*26923*/{2606759936u,2056u,458753u,76985445u,1515552u,3758620704u,1677794406u,138465288u,393216u}/* 1EE62 */, /*26924*/{2607284224u,2056u,458753u,76985445u,1515552u,3758620704u,1677795526u,138465288u,393216u}/* 1EE64 */, /*26925*/{2607808512u,2056u,458753u,76985445u,1515552u,3758620704u,1677794462u,138465288u,393216u}/* 1EE67 */, /*26926*/{2608332800u,2056u,458753u,76985445u,1515552u,3758620704u,1677794958u,138465288u,393216u}/* 1EE68 */, /*26927*/{2608857088u,2056u,458753u,76985445u,1515552u,3758620704u,1677795694u,138465288u,393216u}/* 1EE69 */, /*26928*/{2609381376u,2056u,458753u,76985445u,1515552u,3758620704u,1677795190u,138465288u,393216u}/* 1EE6A */, /*26929*/{2609905664u,2056u,458753u,76985445u,1515552u,3758620704u,1677795414u,138465288u,393216u}/* 1EE6C */, /*26930*/{2610429952u,2056u,458753u,76985445u,1515552u,3758620704u,1677795446u,138465288u,393216u}/* 1EE6D */, /*26931*/{2610954240u,2056u,458753u,76985445u,1515552u,3758620704u,1677794822u,138465288u,393216u}/* 1EE6E */, /*26932*/{2611478528u,2056u,458753u,76985445u,1515552u,3758620704u,1677794990u,138465288u,393216u}/* 1EE6F */, /*26933*/{2612002816u,2056u,458753u,76985445u,1515552u,3758620704u,1677795054u,138465288u,393216u}/* 1EE70 */, /*26934*/{2612527104u,2056u,458753u,76985445u,1515552u,3758620704u,1677794910u,138465288u,393216u}/* 1EE71 */, /*26935*/{2613051392u,2056u,458753u,76985445u,1515552u,3758620704u,1677795150u,138465288u,393216u}/* 1EE72 */, /*26936*/{2613575680u,2056u,458753u,76985445u,1515552u,3758620704u,1677794830u,138465288u,393216u}/* 1EE74 */, /*26937*/{2614099968u,2056u,458753u,76985445u,1515552u,3758620704u,1677794342u,138465288u,393216u}/* 1EE75 */, /*26938*/{2614624256u,2056u,458753u,76985445u,1515552u,3758620704u,1677794350u,138465288u,393216u}/* 1EE76 */, /*26939*/{2615148544u,2056u,458753u,76985445u,1515552u,3758620704u,1677794470u,138465288u,393216u}/* 1EE77 */, /*26940*/{2615672832u,2056u,458753u,76985445u,1515552u,3758620704u,1677794918u,138465288u,393216u}/* 1EE79 */, /*26941*/{2616197120u,2056u,458753u,76985445u,1515552u,3758620704u,1677794966u,138465288u,393216u}/* 1EE7A */, /*26942*/{2616721408u,2056u,458753u,76985445u,1515552u,3758620704u,1677794998u,138465288u,393216u}/* 1EE7B */, /*26943*/{2617245696u,2056u,458753u,76985445u,1515552u,3758620704u,1677794206u,138465288u,393216u}/* 1EE7C */, /*26944*/{2617769984u,2056u,458753u,76985445u,1515552u,3758620704u,1677795062u,138465288u,393216u}/* 1EE7E */, /*26945*/{2618294272u,2056u,458753u,76985445u,1515552u,3758620704u,1677794198u,138465288u,393216u}/* 1EE80 */, /*26946*/{2618818560u,2056u,458753u,76985445u,1515552u,3758620704u,1677794214u,138465288u,393216u}/* 1EE81 */, /*26947*/{2619342848u,2056u,458753u,76985445u,1515552u,3758620704u,1677794406u,138465288u,393216u}/* 1EE82 */, /*26948*/{2619867136u,2056u,458753u,76985445u,1515552u,3758620704u,1677794550u,138465288u,393216u}/* 1EE83 */, /*26949*/{2620391424u,2056u,458753u,76985445u,1515552u,3758620704u,1677795526u,138465288u,393216u}/* 1EE84 */, /*26950*/{2620915712u,2056u,458753u,76985445u,1515552u,3758620704u,1677795574u,138465288u,393216u}/* 1EE85 */, /*26951*/{2621440000u,2056u,458753u,76985445u,1515552u,3758620704u,1677794678u,138465288u,393216u}/* 1EE86 */, /*26952*/{2621964288u,2056u,458753u,76985445u,1515552u,3758620704u,1677794462u,138465288u,393216u}/* 1EE87 */, /*26953*/{2622488576u,2056u,458753u,76985445u,1515552u,3758620704u,1677794958u,138465288u,393216u}/* 1EE88 */, /*26954*/{2623012864u,2056u,458753u,76985445u,1515552u,3758620704u,1677795694u,138465288u,393216u}/* 1EE89 */, /*26955*/{2623537152u,2056u,458753u,76985445u,1515552u,3758620704u,1677795358u,138465288u,393216u}/* 1EE8B */, /*26956*/{2624061440u,2056u,458753u,76985445u,1515552u,3758620704u,1677795414u,138465288u,393216u}/* 1EE8C */, /*26957*/{2624585728u,2056u,458753u,76985445u,1515552u,3758620704u,1677795446u,138465288u,393216u}/* 1EE8D */, /*26958*/{2625110016u,2056u,458753u,76985445u,1515552u,3758620704u,1677794822u,138465288u,393216u}/* 1EE8E */, /*26959*/{2625634304u,2056u,458753u,76985445u,1515552u,3758620704u,1677794990u,138465288u,393216u}/* 1EE8F */, /*26960*/{2626158592u,2056u,458753u,76985445u,1515552u,3758620704u,1677795054u,138465288u,393216u}/* 1EE90 */, /*26961*/{2626682880u,2056u,458753u,76985445u,1515552u,3758620704u,1677794910u,138465288u,393216u}/* 1EE91 */, /*26962*/{2627207168u,2056u,458753u,76985445u,1515552u,3758620704u,1677795150u,138465288u,393216u}/* 1EE92 */, /*26963*/{2627731456u,2056u,458753u,76985445u,1515552u,3758620704u,1677794670u,138465288u,393216u}/* 1EE93 */, /*26964*/{2628255744u,2056u,458753u,76985445u,1515552u,3758620704u,1677794830u,138465288u,393216u}/* 1EE94 */, /*26965*/{2628780032u,2056u,458753u,76985445u,1515552u,3758620704u,1677794342u,138465288u,393216u}/* 1EE95 */, /*26966*/{2629304320u,2056u,458753u,76985445u,1515552u,3758620704u,1677794350u,138465288u,393216u}/* 1EE96 */, /*26967*/{2629828608u,2056u,458753u,76985445u,1515552u,3758620704u,1677794470u,138465288u,393216u}/* 1EE97 */, /*26968*/{2630352896u,2056u,458753u,76985445u,1515552u,3758620704u,1677794558u,138465288u,393216u}/* 1EE98 */, /*26969*/{2630877184u,2056u,458753u,76985445u,1515552u,3758620704u,1677794918u,138465288u,393216u}/* 1EE99 */, /*26970*/{2631401472u,2056u,458753u,76985445u,1515552u,3758620704u,1677794966u,138465288u,393216u}/* 1EE9A */, /*26971*/{2631925760u,2056u,458753u,76985445u,1515552u,3758620704u,1677794998u,138465288u,393216u}/* 1EE9B */, /*26972*/{2632450048u,2056u,458753u,76985445u,1515552u,3758620704u,1677794214u,138465288u,393216u}/* 1EEA1 */, /*26973*/{2632974336u,2056u,458753u,76985445u,1515552u,3758620704u,1677794406u,138465288u,393216u}/* 1EEA2 */, /*26974*/{2633498624u,2056u,458753u,76985445u,1515552u,3758620704u,1677794550u,138465288u,393216u}/* 1EEA3 */, /*26975*/{2634022912u,2056u,458753u,76985445u,1515552u,3758620704u,1677795574u,138465288u,393216u}/* 1EEA5 */, /*26976*/{2634547200u,2056u,458753u,76985445u,1515552u,3758620704u,1677794678u,138465288u,393216u}/* 1EEA6 */, /*26977*/{2635071488u,2056u,458753u,76985445u,1515552u,3758620704u,1677794462u,138465288u,393216u}/* 1EEA7 */, /*26978*/{2635595776u,2056u,458753u,76985445u,1515552u,3758620704u,1677794958u,138465288u,393216u}/* 1EEA8 */, /*26979*/{2636120064u,2056u,458753u,76985445u,1515552u,3758620704u,1677795694u,138465288u,393216u}/* 1EEA9 */, /*26980*/{2636644352u,2056u,458753u,76985445u,1515552u,3758620704u,1677795358u,138465288u,393216u}/* 1EEAB */, /*26981*/{2637168640u,2056u,458753u,76985445u,1515552u,3758620704u,1677795414u,138465288u,393216u}/* 1EEAC */, /*26982*/{2637692928u,2056u,458753u,76985445u,1515552u,3758620704u,1677795446u,138465288u,393216u}/* 1EEAD */, /*26983*/{2638217216u,2056u,458753u,76985445u,1515552u,3758620704u,1677794822u,138465288u,393216u}/* 1EEAE */, /*26984*/{2638741504u,2056u,458753u,76985445u,1515552u,3758620704u,1677794990u,138465288u,393216u}/* 1EEAF */, /*26985*/{2639265792u,2056u,458753u,76985445u,1515552u,3758620704u,1677795054u,138465288u,393216u}/* 1EEB0 */, /*26986*/{2639790080u,2056u,458753u,76985445u,1515552u,3758620704u,1677794910u,138465288u,393216u}/* 1EEB1 */, /*26987*/{2640314368u,2056u,458753u,76985445u,1515552u,3758620704u,1677795150u,138465288u,393216u}/* 1EEB2 */, /*26988*/{2640838656u,2056u,458753u,76985445u,1515552u,3758620704u,1677794670u,138465288u,393216u}/* 1EEB3 */, /*26989*/{2641362944u,2056u,458753u,76985445u,1515552u,3758620704u,1677794830u,138465288u,393216u}/* 1EEB4 */, /*26990*/{2641887232u,2056u,458753u,76985445u,1515552u,3758620704u,1677794342u,138465288u,393216u}/* 1EEB5 */, /*26991*/{2642411520u,2056u,458753u,76985445u,1515552u,3758620704u,1677794350u,138465288u,393216u}/* 1EEB6 */, /*26992*/{2642935808u,2056u,458753u,76985445u,1515552u,3758620704u,1677794470u,138465288u,393216u}/* 1EEB7 */, /*26993*/{2643460096u,2056u,458753u,76985445u,1515552u,3758620704u,1677794558u,138465288u,393216u}/* 1EEB8 */, /*26994*/{2643984384u,2056u,458753u,76985445u,1515552u,3758620704u,1677794918u,138465288u,393216u}/* 1EEB9 */, /*26995*/{2644508672u,2056u,458753u,76985445u,1515552u,3758620704u,1677794966u,138465288u,393216u}/* 1EEBA */, /*26996*/{2645032960u,2056u,458753u,76985445u,1515552u,3758620704u,1677794998u,138465288u,393216u}/* 1EEBB */, /*26997*/{0,2056u,458753u,76982296u,40u,1610612768u,10390u,138442752u,67108864u}/* 1EEF0 */, /*26998*/{0,2056u,458753u,76982296u,40u,1610612768u,10398u,138442752u,67108864u}/* 1EEF1 */, /*26999*/{0,2064u,65537u,103098395u,40u,1610612768u,36612u,138442752u,67108864u}/* 1F000 */, /*27000*/{0,2064u,65537u,103098395u,40u,1610612768u,36620u,138442752u,67108864u}/* 1F001 */, /*27001*/{0,2064u,65537u,103098395u,40u,1610612768u,36628u,138442752u,67108864u}/* 1F002 */, /*27002*/{0,2064u,65537u,103098395u,40u,1610612768u,36636u,138442752u,67108864u}/* 1F003 */, /*27003*/{0,2067u,65537u,103098395u,8u,1610617120u,36644u,138442752u,67108864u}/* 1F004 */, /*27004*/{0,2064u,65537u,103098395u,40u,1610612768u,36652u,138442752u,67108864u}/* 1F005 */, /*27005*/{0,2064u,65537u,103098395u,40u,1610612768u,36660u,138442752u,67108864u}/* 1F006 */, /*27006*/{0,2064u,65537u,103098395u,40u,1610612768u,36668u,138442752u,67108864u}/* 1F007 */, /*27007*/{0,2064u,65537u,103098395u,40u,1610612768u,36676u,138442752u,67108864u}/* 1F008 */, /*27008*/{0,2064u,65537u,103098395u,40u,1610612768u,36684u,138442752u,67108864u}/* 1F009 */, /*27009*/{0,2064u,65537u,103098395u,40u,1610612768u,36692u,138442752u,67108864u}/* 1F00A */, /*27010*/{0,2064u,65537u,103098395u,40u,1610612768u,36700u,138442752u,67108864u}/* 1F00B */, /*27011*/{0,2064u,65537u,103098395u,40u,1610612768u,36708u,138442752u,67108864u}/* 1F00C */, /*27012*/{0,2064u,65537u,103098395u,40u,1610612768u,36716u,138442752u,67108864u}/* 1F00D */, /*27013*/{0,2064u,65537u,103098395u,40u,1610612768u,36724u,138442752u,67108864u}/* 1F00E */, /*27014*/{0,2064u,65537u,103098395u,40u,1610612768u,36732u,138442752u,67108864u}/* 1F00F */, /*27015*/{0,2064u,65537u,103098395u,40u,1610612768u,36740u,138442752u,67108864u}/* 1F010 */, /*27016*/{0,2064u,65537u,103098395u,40u,1610612768u,36748u,138442752u,67108864u}/* 1F011 */, /*27017*/{0,2064u,65537u,103098395u,40u,1610612768u,36756u,138442752u,67108864u}/* 1F012 */, /*27018*/{0,2064u,65537u,103098395u,40u,1610612768u,36764u,138442752u,67108864u}/* 1F013 */, /*27019*/{0,2064u,65537u,103098395u,40u,1610612768u,36772u,138442752u,67108864u}/* 1F014 */, /*27020*/{0,2064u,65537u,103098395u,40u,1610612768u,36780u,138442752u,67108864u}/* 1F015 */, /*27021*/{0,2064u,65537u,103098395u,40u,1610612768u,36788u,138442752u,67108864u}/* 1F016 */, /*27022*/{0,2064u,65537u,103098395u,40u,1610612768u,36796u,138442752u,67108864u}/* 1F017 */, /*27023*/{0,2064u,65537u,103098395u,40u,1610612768u,36804u,138442752u,67108864u}/* 1F018 */, /*27024*/{0,2064u,65537u,103098395u,40u,1610612768u,36812u,138442752u,67108864u}/* 1F019 */, /*27025*/{0,2064u,65537u,103098395u,40u,1610612768u,36820u,138442752u,67108864u}/* 1F01A */, /*27026*/{0,2064u,65537u,103098395u,40u,1610612768u,36828u,138442752u,67108864u}/* 1F01B */, /*27027*/{0,2064u,65537u,103098395u,40u,1610612768u,36836u,138442752u,67108864u}/* 1F01C */, /*27028*/{0,2064u,65537u,103098395u,40u,1610612768u,36844u,138442752u,67108864u}/* 1F01D */, /*27029*/{0,2064u,65537u,103098395u,40u,1610612768u,36852u,138442752u,67108864u}/* 1F01E */, /*27030*/{0,2064u,65537u,103098395u,40u,1610612768u,36860u,138442752u,67108864u}/* 1F01F */, /*27031*/{0,2064u,65537u,103098395u,40u,1610612768u,36868u,138442752u,67108864u}/* 1F020 */, /*27032*/{0,2064u,65537u,103098395u,40u,1610612768u,36876u,138442752u,67108864u}/* 1F021 */, /*27033*/{0,2064u,65537u,103098395u,40u,1610612768u,36884u,138442752u,67108864u}/* 1F022 */, /*27034*/{0,2064u,65537u,103098395u,40u,1610612768u,36892u,138442752u,67108864u}/* 1F023 */, /*27035*/{0,2064u,65537u,103098395u,40u,1610612768u,36900u,138442752u,67108864u}/* 1F024 */, /*27036*/{0,2064u,65537u,103098395u,40u,1610612768u,36908u,138442752u,67108864u}/* 1F025 */, /*27037*/{0,2064u,65537u,103098395u,40u,1610612768u,36916u,138442752u,67108864u}/* 1F026 */, /*27038*/{0,2064u,65537u,103098395u,40u,1610612768u,36924u,138442752u,67108864u}/* 1F027 */, /*27039*/{0,2064u,65537u,103098395u,40u,1610612768u,36932u,138442752u,67108864u}/* 1F028 */, /*27040*/{0,2064u,65537u,103098395u,40u,1610612768u,36940u,138442752u,67108864u}/* 1F029 */, /*27041*/{0,2064u,65537u,103098395u,40u,1610612768u,36948u,138442752u,67108864u}/* 1F02A */, /*27042*/{0,2064u,65537u,103098395u,40u,1610612768u,36956u,138442752u,67108864u}/* 1F02B */, /*27043*/{0,2072u,65537u,103098395u,40u,1610612768u,36964u,138442752u,67108864u}/* 1F030 */, /*27044*/{0,2072u,65537u,103098395u,40u,1610612768u,36972u,138442752u,67108864u}/* 1F031 */, /*27045*/{0,2072u,65537u,103098395u,40u,1610612768u,36980u,138442752u,67108864u}/* 1F032 */, /*27046*/{0,2072u,65537u,103098395u,40u,1610612768u,36988u,138442752u,67108864u}/* 1F033 */, /*27047*/{0,2072u,65537u,103098395u,40u,1610612768u,36996u,138442752u,67108864u}/* 1F034 */, /*27048*/{0,2072u,65537u,103098395u,40u,1610612768u,37004u,138442752u,67108864u}/* 1F035 */, /*27049*/{0,2072u,65537u,103098395u,40u,1610612768u,37012u,138442752u,67108864u}/* 1F036 */, /*27050*/{0,2072u,65537u,103098395u,40u,1610612768u,37020u,138442752u,67108864u}/* 1F037 */, /*27051*/{0,2072u,65537u,103098395u,40u,1610612768u,37028u,138442752u,67108864u}/* 1F038 */, /*27052*/{0,2072u,65537u,103098395u,40u,1610612768u,37036u,138442752u,67108864u}/* 1F039 */, /*27053*/{0,2072u,65537u,103098395u,40u,1610612768u,37044u,138442752u,67108864u}/* 1F03A */, /*27054*/{0,2072u,65537u,103098395u,40u,1610612768u,37052u,138442752u,67108864u}/* 1F03B */, /*27055*/{0,2072u,65537u,103098395u,40u,1610612768u,37060u,138442752u,67108864u}/* 1F03C */, /*27056*/{0,2072u,65537u,103098395u,40u,1610612768u,37068u,138442752u,67108864u}/* 1F03D */, /*27057*/{0,2072u,65537u,103098395u,40u,1610612768u,37076u,138442752u,67108864u}/* 1F03E */, /*27058*/{0,2072u,65537u,103098395u,40u,1610612768u,37084u,138442752u,67108864u}/* 1F03F */, /*27059*/{0,2072u,65537u,103098395u,40u,1610612768u,37092u,138442752u,67108864u}/* 1F040 */, /*27060*/{0,2072u,65537u,103098395u,40u,1610612768u,37100u,138442752u,67108864u}/* 1F041 */, /*27061*/{0,2072u,65537u,103098395u,40u,1610612768u,37108u,138442752u,67108864u}/* 1F042 */, /*27062*/{0,2072u,65537u,103098395u,40u,1610612768u,37116u,138442752u,67108864u}/* 1F043 */, /*27063*/{0,2072u,65537u,103098395u,40u,1610612768u,37124u,138442752u,67108864u}/* 1F044 */, /*27064*/{0,2072u,65537u,103098395u,40u,1610612768u,37132u,138442752u,67108864u}/* 1F045 */, /*27065*/{0,2072u,65537u,103098395u,40u,1610612768u,37140u,138442752u,67108864u}/* 1F046 */, /*27066*/{0,2072u,65537u,103098395u,40u,1610612768u,37148u,138442752u,67108864u}/* 1F047 */, /*27067*/{0,2072u,65537u,103098395u,40u,1610612768u,37156u,138442752u,67108864u}/* 1F048 */, /*27068*/{0,2072u,65537u,103098395u,40u,1610612768u,37164u,138442752u,67108864u}/* 1F049 */, /*27069*/{0,2072u,65537u,103098395u,40u,1610612768u,37172u,138442752u,67108864u}/* 1F04A */, /*27070*/{0,2072u,65537u,103098395u,40u,1610612768u,37180u,138442752u,67108864u}/* 1F04B */, /*27071*/{0,2072u,65537u,103098395u,40u,1610612768u,37188u,138442752u,67108864u}/* 1F04C */, /*27072*/{0,2072u,65537u,103098395u,40u,1610612768u,37196u,138442752u,67108864u}/* 1F04D */, /*27073*/{0,2072u,65537u,103098395u,40u,1610612768u,37204u,138442752u,67108864u}/* 1F04E */, /*27074*/{0,2072u,65537u,103098395u,40u,1610612768u,37212u,138442752u,67108864u}/* 1F04F */, /*27075*/{0,2072u,65537u,103098395u,40u,1610612768u,37220u,138442752u,67108864u}/* 1F050 */, /*27076*/{0,2072u,65537u,103098395u,40u,1610612768u,37228u,138442752u,67108864u}/* 1F051 */, /*27077*/{0,2072u,65537u,103098395u,40u,1610612768u,37236u,138442752u,67108864u}/* 1F052 */, /*27078*/{0,2072u,65537u,103098395u,40u,1610612768u,37244u,138442752u,67108864u}/* 1F053 */, /*27079*/{0,2072u,65537u,103098395u,40u,1610612768u,37252u,138442752u,67108864u}/* 1F054 */, /*27080*/{0,2072u,65537u,103098395u,40u,1610612768u,37260u,138442752u,67108864u}/* 1F055 */, /*27081*/{0,2072u,65537u,103098395u,40u,1610612768u,37268u,138442752u,67108864u}/* 1F056 */, /*27082*/{0,2072u,65537u,103098395u,40u,1610612768u,37276u,138442752u,67108864u}/* 1F057 */, /*27083*/{0,2072u,65537u,103098395u,40u,1610612768u,37284u,138442752u,67108864u}/* 1F058 */, /*27084*/{0,2072u,65537u,103098395u,40u,1610612768u,37292u,138442752u,67108864u}/* 1F059 */, /*27085*/{0,2072u,65537u,103098395u,40u,1610612768u,37300u,138442752u,67108864u}/* 1F05A */, /*27086*/{0,2072u,65537u,103098395u,40u,1610612768u,37308u,138442752u,67108864u}/* 1F05B */, /*27087*/{0,2072u,65537u,103098395u,40u,1610612768u,37316u,138442752u,67108864u}/* 1F05C */, /*27088*/{0,2072u,65537u,103098395u,40u,1610612768u,37324u,138442752u,67108864u}/* 1F05D */, /*27089*/{0,2072u,65537u,103098395u,40u,1610612768u,37332u,138442752u,67108864u}/* 1F05E */, /*27090*/{0,2072u,65537u,103098395u,40u,1610612768u,37340u,138442752u,67108864u}/* 1F05F */, /*27091*/{0,2072u,65537u,103098395u,40u,1610612768u,37348u,138442752u,67108864u}/* 1F060 */, /*27092*/{0,2072u,65537u,103098395u,40u,1610612768u,37356u,138442752u,67108864u}/* 1F061 */, /*27093*/{0,2072u,65537u,103098395u,40u,1610612768u,37364u,138442752u,67108864u}/* 1F062 */, /*27094*/{0,2072u,65537u,103098395u,40u,1610612768u,37372u,138442752u,67108864u}/* 1F063 */, /*27095*/{0,2072u,65537u,103098395u,40u,1610612768u,37380u,138442752u,67108864u}/* 1F064 */, /*27096*/{0,2072u,65537u,103098395u,40u,1610612768u,37388u,138442752u,67108864u}/* 1F065 */, /*27097*/{0,2072u,65537u,103098395u,40u,1610612768u,37396u,138442752u,67108864u}/* 1F066 */, /*27098*/{0,2072u,65537u,103098395u,40u,1610612768u,37404u,138442752u,67108864u}/* 1F067 */, /*27099*/{0,2072u,65537u,103098395u,40u,1610612768u,37412u,138442752u,67108864u}/* 1F068 */, /*27100*/{0,2072u,65537u,103098395u,40u,1610612768u,37420u,138442752u,67108864u}/* 1F069 */, /*27101*/{0,2072u,65537u,103098395u,40u,1610612768u,37428u,138442752u,67108864u}/* 1F06A */, /*27102*/{0,2072u,65537u,103098395u,40u,1610612768u,37436u,138442752u,67108864u}/* 1F06B */, /*27103*/{0,2072u,65537u,103098395u,40u,1610612768u,37444u,138442752u,67108864u}/* 1F06C */, /*27104*/{0,2072u,65537u,103098395u,40u,1610612768u,37452u,138442752u,67108864u}/* 1F06D */, /*27105*/{0,2072u,65537u,103098395u,40u,1610612768u,37460u,138442752u,67108864u}/* 1F06E */, /*27106*/{0,2072u,65537u,103098395u,40u,1610612768u,37468u,138442752u,67108864u}/* 1F06F */, /*27107*/{0,2072u,65537u,103098395u,40u,1610612768u,37476u,138442752u,67108864u}/* 1F070 */, /*27108*/{0,2072u,65537u,103098395u,40u,1610612768u,37484u,138442752u,67108864u}/* 1F071 */, /*27109*/{0,2072u,65537u,103098395u,40u,1610612768u,37492u,138442752u,67108864u}/* 1F072 */, /*27110*/{0,2072u,65537u,103098395u,40u,1610612768u,37500u,138442752u,67108864u}/* 1F073 */, /*27111*/{0,2072u,65537u,103098395u,40u,1610612768u,37508u,138442752u,67108864u}/* 1F074 */, /*27112*/{0,2072u,65537u,103098395u,40u,1610612768u,37516u,138442752u,67108864u}/* 1F075 */, /*27113*/{0,2072u,65537u,103098395u,40u,1610612768u,37524u,138442752u,67108864u}/* 1F076 */, /*27114*/{0,2072u,65537u,103098395u,40u,1610612768u,37532u,138442752u,67108864u}/* 1F077 */, /*27115*/{0,2072u,65537u,103098395u,40u,1610612768u,37540u,138442752u,67108864u}/* 1F078 */, /*27116*/{0,2072u,65537u,103098395u,40u,1610612768u,37548u,138442752u,67108864u}/* 1F079 */, /*27117*/{0,2072u,65537u,103098395u,40u,1610612768u,37556u,138442752u,67108864u}/* 1F07A */, /*27118*/{0,2072u,65537u,103098395u,40u,1610612768u,37564u,138442752u,67108864u}/* 1F07B */, /*27119*/{0,2072u,65537u,103098395u,40u,1610612768u,37572u,138442752u,67108864u}/* 1F07C */, /*27120*/{0,2072u,65537u,103098395u,40u,1610612768u,37580u,138442752u,67108864u}/* 1F07D */, /*27121*/{0,2072u,65537u,103098395u,40u,1610612768u,37588u,138442752u,67108864u}/* 1F07E */, /*27122*/{0,2072u,65537u,103098395u,40u,1610612768u,37596u,138442752u,67108864u}/* 1F07F */, /*27123*/{0,2072u,65537u,103098395u,40u,1610612768u,37604u,138442752u,67108864u}/* 1F080 */, /*27124*/{0,2072u,65537u,103098395u,40u,1610612768u,37612u,138442752u,67108864u}/* 1F081 */, /*27125*/{0,2072u,65537u,103098395u,40u,1610612768u,37620u,138442752u,67108864u}/* 1F082 */, /*27126*/{0,2072u,65537u,103098395u,40u,1610612768u,37628u,138442752u,67108864u}/* 1F083 */, /*27127*/{0,2072u,65537u,103098395u,40u,1610612768u,37636u,138442752u,67108864u}/* 1F084 */, /*27128*/{0,2072u,65537u,103098395u,40u,1610612768u,37644u,138442752u,67108864u}/* 1F085 */, /*27129*/{0,2072u,65537u,103098395u,40u,1610612768u,37652u,138442752u,67108864u}/* 1F086 */, /*27130*/{0,2072u,65537u,103098395u,40u,1610612768u,37660u,138442752u,67108864u}/* 1F087 */, /*27131*/{0,2072u,65537u,103098395u,40u,1610612768u,37668u,138442752u,67108864u}/* 1F088 */, /*27132*/{0,2072u,65537u,103098395u,40u,1610612768u,37676u,138442752u,67108864u}/* 1F089 */, /*27133*/{0,2072u,65537u,103098395u,40u,1610612768u,37684u,138442752u,67108864u}/* 1F08A */, /*27134*/{0,2072u,65537u,103098395u,40u,1610612768u,37692u,138442752u,67108864u}/* 1F08B */, /*27135*/{0,2072u,65537u,103098395u,40u,1610612768u,37700u,138442752u,67108864u}/* 1F08C */, /*27136*/{0,2072u,65537u,103098395u,40u,1610612768u,37708u,138442752u,67108864u}/* 1F08D */, /*27137*/{0,2072u,65537u,103098395u,40u,1610612768u,37716u,138442752u,67108864u}/* 1F08E */, /*27138*/{0,2072u,65537u,103098395u,40u,1610612768u,37724u,138442752u,67108864u}/* 1F08F */, /*27139*/{0,2072u,65537u,103098395u,40u,1610612768u,37732u,138442752u,67108864u}/* 1F090 */, /*27140*/{0,2072u,65537u,103098395u,40u,1610612768u,37740u,138442752u,67108864u}/* 1F091 */, /*27141*/{0,2072u,65537u,103098395u,40u,1610612768u,37748u,138442752u,67108864u}/* 1F092 */, /*27142*/{0,2072u,65537u,103098395u,40u,1610612768u,37756u,138442752u,67108864u}/* 1F093 */, /*27143*/{0,2080u,65537u,103163931u,40u,1610612768u,37764u,138442752u,67108864u}/* 1F0A0 */, /*27144*/{0,2080u,65537u,103163931u,40u,1610612768u,37772u,138442752u,67108864u}/* 1F0A1 */, /*27145*/{0,2080u,65537u,103163931u,40u,1610612768u,37780u,138442752u,67108864u}/* 1F0A2 */, /*27146*/{0,2080u,65537u,103163931u,40u,1610612768u,37788u,138442752u,67108864u}/* 1F0A3 */, /*27147*/{0,2080u,65537u,103163931u,40u,1610612768u,37796u,138442752u,67108864u}/* 1F0A4 */, /*27148*/{0,2080u,65537u,103163931u,40u,1610612768u,37804u,138442752u,67108864u}/* 1F0A5 */, /*27149*/{0,2080u,65537u,103163931u,40u,1610612768u,37812u,138442752u,67108864u}/* 1F0A6 */, /*27150*/{0,2080u,65537u,103163931u,40u,1610612768u,37820u,138442752u,67108864u}/* 1F0A7 */, /*27151*/{0,2080u,65537u,103163931u,40u,1610612768u,37828u,138442752u,67108864u}/* 1F0A8 */, /*27152*/{0,2080u,65537u,103163931u,40u,1610612768u,37836u,138442752u,67108864u}/* 1F0A9 */, /*27153*/{0,2080u,65537u,103163931u,40u,1610612768u,37844u,138442752u,67108864u}/* 1F0AA */, /*27154*/{0,2080u,65537u,103163931u,40u,1610612768u,37852u,138442752u,67108864u}/* 1F0AB */, /*27155*/{0,2080u,65537u,103163931u,40u,1610612768u,37860u,138442752u,67108864u}/* 1F0AC */, /*27156*/{0,2080u,65537u,103163931u,40u,1610612768u,37868u,138442752u,67108864u}/* 1F0AD */, /*27157*/{0,2080u,65537u,103163931u,40u,1610612768u,37876u,138442752u,67108864u}/* 1F0AE */, /*27158*/{0,2080u,65537u,103163931u,40u,1610612768u,37884u,138442752u,67108864u}/* 1F0B1 */, /*27159*/{0,2080u,65537u,103163931u,40u,1610612768u,37892u,138442752u,67108864u}/* 1F0B2 */, /*27160*/{0,2080u,65537u,103163931u,40u,1610612768u,37900u,138442752u,67108864u}/* 1F0B3 */, /*27161*/{0,2080u,65537u,103163931u,40u,1610612768u,37908u,138442752u,67108864u}/* 1F0B4 */, /*27162*/{0,2080u,65537u,103163931u,40u,1610612768u,37916u,138442752u,67108864u}/* 1F0B5 */, /*27163*/{0,2080u,65537u,103163931u,40u,1610612768u,37924u,138442752u,67108864u}/* 1F0B6 */, /*27164*/{0,2080u,65537u,103163931u,40u,1610612768u,37932u,138442752u,67108864u}/* 1F0B7 */, /*27165*/{0,2080u,65537u,103163931u,40u,1610612768u,37940u,138442752u,67108864u}/* 1F0B8 */, /*27166*/{0,2080u,65537u,103163931u,40u,1610612768u,37948u,138442752u,67108864u}/* 1F0B9 */, /*27167*/{0,2080u,65537u,103163931u,40u,1610612768u,37956u,138442752u,67108864u}/* 1F0BA */, /*27168*/{0,2080u,65537u,103163931u,40u,1610612768u,37964u,138442752u,67108864u}/* 1F0BB */, /*27169*/{0,2080u,65537u,103163931u,40u,1610612768u,37972u,138442752u,67108864u}/* 1F0BC */, /*27170*/{0,2080u,65537u,103163931u,40u,1610612768u,37980u,138442752u,67108864u}/* 1F0BD */, /*27171*/{0,2080u,65537u,103163931u,40u,1610612768u,37988u,138442752u,67108864u}/* 1F0BE */, /*27172*/{0,2080u,65537u,103295003u,40u,1610612768u,37996u,138442752u,67108864u}/* 1F0BF */, /*27173*/{0,2080u,65537u,103163931u,40u,1610612768u,38004u,138442752u,67108864u}/* 1F0C1 */, /*27174*/{0,2080u,65537u,103163931u,40u,1610612768u,38012u,138442752u,67108864u}/* 1F0C2 */, /*27175*/{0,2080u,65537u,103163931u,40u,1610612768u,38020u,138442752u,67108864u}/* 1F0C3 */, /*27176*/{0,2080u,65537u,103163931u,40u,1610612768u,38028u,138442752u,67108864u}/* 1F0C4 */, /*27177*/{0,2080u,65537u,103163931u,40u,1610612768u,38036u,138442752u,67108864u}/* 1F0C5 */, /*27178*/{0,2080u,65537u,103163931u,40u,1610612768u,38044u,138442752u,67108864u}/* 1F0C6 */, /*27179*/{0,2080u,65537u,103163931u,40u,1610612768u,38052u,138442752u,67108864u}/* 1F0C7 */, /*27180*/{0,2080u,65537u,103163931u,40u,1610612768u,38060u,138442752u,67108864u}/* 1F0C8 */, /*27181*/{0,2080u,65537u,103163931u,40u,1610612768u,38068u,138442752u,67108864u}/* 1F0C9 */, /*27182*/{0,2080u,65537u,103163931u,40u,1610612768u,38076u,138442752u,67108864u}/* 1F0CA */, /*27183*/{0,2080u,65537u,103163931u,40u,1610612768u,38084u,138442752u,67108864u}/* 1F0CB */, /*27184*/{0,2080u,65537u,103163931u,40u,1610612768u,38092u,138442752u,67108864u}/* 1F0CC */, /*27185*/{0,2080u,65537u,103163931u,40u,1610612768u,38100u,138442752u,67108864u}/* 1F0CD */, /*27186*/{0,2080u,65537u,103163931u,40u,1610612768u,38108u,138442752u,67108864u}/* 1F0CE */, /*27187*/{0,2083u,65537u,103163931u,8u,1610617120u,38116u,138442752u,67108864u}/* 1F0CF */, /*27188*/{0,2080u,65537u,103163931u,40u,1610612768u,38124u,138442752u,67108864u}/* 1F0D1 */, /*27189*/{0,2080u,65537u,103163931u,40u,1610612768u,38132u,138442752u,67108864u}/* 1F0D2 */, /*27190*/{0,2080u,65537u,103163931u,40u,1610612768u,38140u,138442752u,67108864u}/* 1F0D3 */, /*27191*/{0,2080u,65537u,103163931u,40u,1610612768u,38148u,138442752u,67108864u}/* 1F0D4 */, /*27192*/{0,2080u,65537u,103163931u,40u,1610612768u,38156u,138442752u,67108864u}/* 1F0D5 */, /*27193*/{0,2080u,65537u,103163931u,40u,1610612768u,38164u,138442752u,67108864u}/* 1F0D6 */, /*27194*/{0,2080u,65537u,103163931u,40u,1610612768u,38172u,138442752u,67108864u}/* 1F0D7 */, /*27195*/{0,2080u,65537u,103163931u,40u,1610612768u,38180u,138442752u,67108864u}/* 1F0D8 */, /*27196*/{0,2080u,65537u,103163931u,40u,1610612768u,38188u,138442752u,67108864u}/* 1F0D9 */, /*27197*/{0,2080u,65537u,103163931u,40u,1610612768u,38196u,138442752u,67108864u}/* 1F0DA */, /*27198*/{0,2080u,65537u,103163931u,40u,1610612768u,38204u,138442752u,67108864u}/* 1F0DB */, /*27199*/{0,2080u,65537u,103163931u,40u,1610612768u,38212u,138442752u,67108864u}/* 1F0DC */, /*27200*/{0,2080u,65537u,103163931u,40u,1610612768u,38220u,138442752u,67108864u}/* 1F0DD */, /*27201*/{0,2080u,65537u,103163931u,40u,1610612768u,38228u,138442752u,67108864u}/* 1F0DE */, /*27202*/{0,2080u,65537u,103163931u,40u,1610612768u,38236u,138442752u,67108864u}/* 1F0DF */, /*27203*/{0,2080u,65537u,103295003u,40u,1610612768u,38244u,138442752u,67108864u}/* 1F0E0 */, /*27204*/{0,2080u,65537u,103295003u,40u,1610612768u,38252u,138442752u,67108864u}/* 1F0E1 */, /*27205*/{0,2080u,65537u,103295003u,40u,1610612768u,38260u,138442752u,67108864u}/* 1F0E2 */, /*27206*/{0,2080u,65537u,103295003u,40u,1610612768u,38268u,138442752u,67108864u}/* 1F0E3 */, /*27207*/{0,2080u,65537u,103295003u,40u,1610612768u,38276u,138442752u,67108864u}/* 1F0E4 */, /*27208*/{0,2080u,65537u,103295003u,40u,1610612768u,38284u,138442752u,67108864u}/* 1F0E5 */, /*27209*/{0,2080u,65537u,103295003u,40u,1610612768u,38292u,138442752u,67108864u}/* 1F0E6 */, /*27210*/{0,2080u,65537u,103295003u,40u,1610612768u,38300u,138442752u,67108864u}/* 1F0E7 */, /*27211*/{0,2080u,65537u,103295003u,40u,1610612768u,38308u,138442752u,67108864u}/* 1F0E8 */, /*27212*/{0,2080u,65537u,103295003u,40u,1610612768u,38316u,138442752u,67108864u}/* 1F0E9 */, /*27213*/{0,2080u,65537u,103295003u,40u,1610612768u,38324u,138442752u,67108864u}/* 1F0EA */, /*27214*/{0,2080u,65537u,103295003u,40u,1610612768u,38332u,138442752u,67108864u}/* 1F0EB */, /*27215*/{0,2080u,65537u,103295003u,40u,1610612768u,38340u,138442752u,67108864u}/* 1F0EC */, /*27216*/{0,2080u,65537u,103295003u,40u,1610612768u,38348u,138442752u,67108864u}/* 1F0ED */, /*27217*/{0,2080u,65537u,103295003u,40u,1610612768u,38356u,138442752u,67108864u}/* 1F0EE */, /*27218*/{0,2080u,65537u,103295003u,40u,1610612768u,38364u,138442752u,67108864u}/* 1F0EF */, /*27219*/{0,2080u,65537u,103295003u,40u,1610612768u,38372u,138442752u,67108864u}/* 1F0F0 */, /*27220*/{0,2080u,65537u,103295003u,40u,1610612768u,38380u,138442752u,67108864u}/* 1F0F1 */, /*27221*/{0,2080u,65537u,103295003u,40u,1610612768u,38388u,138442752u,67108864u}/* 1F0F2 */, /*27222*/{0,2080u,65537u,103295003u,40u,1610612768u,38396u,138442752u,67108864u}/* 1F0F3 */, /*27223*/{0,2080u,65537u,103295003u,40u,1610612768u,38404u,138442752u,67108864u}/* 1F0F4 */, /*27224*/{0,2080u,65537u,103295003u,40u,1610612768u,38412u,138442752u,67108864u}/* 1F0F5 */, /*27225*/{2645557248u,2089u,33620993u,89491531u,8388644u,1611137056u,63717u,272707584u,0}/* 1F100 */, /*27226*/{2646081536u,2089u,33620993u,89491531u,8388644u,1611137056u,63029u,272707584u,0}/* 1F101 */, /*27227*/{2646605824u,2089u,536937985u,89491531u,8388644u,1611137056u,63037u,272707584u,0}/* 1F102 */, /*27228*/{2647130112u,2089u,570493441u,89491531u,8388644u,1611137056u,63045u,272707584u,0}/* 1F103 */, /*27229*/{2647654400u,2089u,604047361u,89491531u,8388644u,1611137056u,63053u,272707584u,0}/* 1F104 */, /*27230*/{2648178688u,2089u,637603841u,89491531u,8388644u,1611137056u,63061u,272707584u,0}/* 1F105 */, /*27231*/{2648702976u,2089u,671157249u,89491531u,8388644u,1611137056u,63069u,272707584u,0}/* 1F106 */, /*27232*/{2649227264u,2089u,704714241u,89491531u,8388644u,1611137056u,63077u,272707584u,0}/* 1F107 */, /*27233*/{2649751552u,2089u,738266625u,89491531u,8388644u,1611137056u,63085u,272707584u,0}/* 1F108 */, /*27234*/{2650275840u,2089u,771824641u,89491531u,8388644u,1611137056u,63093u,272707584u,0}/* 1F109 */, /*27235*/{2650800128u,2089u,805377025u,89491531u,8388644u,1611137056u,63101u,272707584u,0}/* 1F10A */, /*27236*/{0,2088u,33620993u,89663499u,8388650u,1610612768u,58661u,138475520u,0}/* 1F10B */, /*27237*/{2651324416u,2089u,65537u,89489499u,32u,1611137056u,71420u,407007232u,67108864u}/* 1F110 */, /*27238*/{2651848704u,2089u,65537u,89489499u,32u,1611137056u,71620u,407007232u,67108864u}/* 1F111 */, /*27239*/{2652372992u,2089u,65537u,89489499u,32u,1611137056u,71828u,407007232u,67108864u}/* 1F112 */, /*27240*/{2652897280u,2089u,65537u,89489499u,32u,1611137056u,71996u,407007232u,67108864u}/* 1F113 */, /*27241*/{2653421568u,2089u,65537u,89489499u,32u,1611137056u,72212u,407007232u,67108864u}/* 1F114 */, /*27242*/{2653945856u,2089u,65537u,89489499u,32u,1611137056u,72684u,407007232u,67108864u}/* 1F115 */, /*27243*/{2654470144u,2089u,65537u,89489499u,32u,1611137056u,72804u,407007232u,67108864u}/* 1F116 */, /*27244*/{2654994432u,2089u,65537u,89489499u,32u,1611137056u,73092u,407007232u,67108864u}/* 1F117 */, /*27245*/{2655518720u,2089u,65537u,89489499u,32u,1611137056u,73300u,407007232u,67108864u}/* 1F118 */, /*27246*/{2656043008u,2089u,65537u,89489499u,32u,1611137056u,73508u,407007232u,67108864u}/* 1F119 */, /*27247*/{2656567296u,2089u,65537u,89489499u,32u,1611137056u,73708u,407007232u,67108864u}/* 1F11A */, /*27248*/{2657091584u,2089u,65537u,89489499u,32u,1611137056u,73852u,407007232u,67108864u}/* 1F11B */, /*27249*/{2657615872u,2089u,65537u,89489499u,32u,1611137056u,74260u,407007232u,67108864u}/* 1F11C */, /*27250*/{2658140160u,2089u,65537u,89489499u,32u,1611137056u,74380u,407007232u,67108864u}/* 1F11D */, /*27251*/{2658664448u,2089u,65537u,89489499u,32u,1611137056u,74668u,407007232u,67108864u}/* 1F11E */, /*27252*/{2659188736u,2089u,65537u,89489499u,32u,1611137056u,75044u,407007232u,67108864u}/* 1F11F */, /*27253*/{2659713024u,2089u,65537u,89489499u,32u,1611137056u,75212u,407007232u,67108864u}/* 1F120 */, /*27254*/{2660237312u,2089u,65537u,89489499u,32u,1611137056u,75356u,407007232u,67108864u}/* 1F121 */, /*27255*/{2660761600u,2089u,65537u,89489499u,32u,1611137056u,75852u,407007232u,67108864u}/* 1F122 */, /*27256*/{2661285888u,2089u,65537u,89489499u,32u,1611137056u,76140u,407007232u,67108864u}/* 1F123 */, /*27257*/{2661810176u,2089u,65537u,89489499u,32u,1611137056u,76396u,407007232u,67108864u}/* 1F124 */, /*27258*/{2662334464u,2089u,65537u,89489499u,32u,1611137056u,76764u,407007232u,67108864u}/* 1F125 */, /*27259*/{2662858752u,2089u,65537u,89489499u,32u,1611137056u,76908u,407007232u,67108864u}/* 1F126 */, /*27260*/{2663383040u,2089u,65537u,89489499u,32u,1611137056u,76988u,407007232u,67108864u}/* 1F127 */, /*27261*/{2663907328u,2089u,65537u,89489499u,32u,1611137056u,77084u,407007232u,67108864u}/* 1F128 */, /*27262*/{2664431616u,2089u,65537u,89489499u,32u,1611137056u,77260u,407007232u,67108864u}/* 1F129 */, /*27263*/{2664955904u,2089u,65537u,89489499u,32u,1611137056u,77420u,407007232u,67108864u}/* 1F12A */, /*27264*/{2665480192u,2089u,65537u,89489723u,32u,1611137056u,59148u,138522624u,67108864u}/* 1F12B */, /*27265*/{2666004480u,2089u,65537u,89489723u,32u,1611137056u,62676u,138522624u,67108864u}/* 1F12C */, /*27266*/{2666528768u,2089u,65537u,89489723u,32u,1611137056u,118452u,272838656u,67108864u}/* 1F12D */, /*27267*/{2667053056u,2088u,65537u,76906811u,32u,1611137056u,128796u,272838656u,67108864u}/* 1F12E */, /*27268*/{2667577344u,2089u,65537u,89522715u,1507360u,3767009312u,58740u,138662404u,69206016u}/* 1F130 */, /*27269*/{2668101632u,2089u,65537u,89489947u,1507360u,3767009312u,58940u,138662404u,69206016u}/* 1F131 */, /*27270*/{2668625920u,2089u,65537u,89522715u,1507360u,3767009312u,59148u,138662404u,69206016u}/* 1F132 */, /*27271*/{2669150208u,2089u,65537u,89522715u,1507360u,3767009312u,59316u,138662404u,69206016u}/* 1F133 */, /*27272*/{2669674496u,2089u,65537u,89522715u,1507360u,3767009312u,59532u,138662404u,69206016u}/* 1F134 */, /*27273*/{2670198784u,2089u,65537u,89522715u,1507360u,3767009312u,60004u,138662404u,69206016u}/* 1F135 */, /*27274*/{2670723072u,2089u,65537u,89522715u,1507360u,3767009312u,60124u,138662404u,69206016u}/* 1F136 */, /*27275*/{2671247360u,2089u,65537u,89522715u,1507360u,3767009312u,60412u,138662404u,69206016u}/* 1F137 */, /*27276*/{2671771648u,2089u,65537u,89522715u,1507360u,3767009312u,60620u,138662404u,69206016u}/* 1F138 */, /*27277*/{2672295936u,2089u,65537u,89522715u,1507360u,3767009312u,60828u,138662404u,69206016u}/* 1F139 */, /*27278*/{2672820224u,2089u,65537u,89522715u,1507360u,3767009312u,61028u,138662404u,69206016u}/* 1F13A */, /*27279*/{2673344512u,2089u,65537u,89522715u,1507360u,3767009312u,61172u,138662404u,69206016u}/* 1F13B */, /*27280*/{2673868800u,2089u,65537u,89522715u,1507360u,3767009312u,61580u,138662404u,69206016u}/* 1F13C */, /*27281*/{2674393088u,2089u,65537u,89489947u,1507360u,3767009312u,61700u,138662404u,69206016u}/* 1F13D */, /*27282*/{2674917376u,2089u,65537u,89522715u,1507360u,3767009312u,61988u,138662404u,69206016u}/* 1F13E */, /*27283*/{2675441664u,2089u,65537u,89489947u,1507360u,3767009312u,62364u,138662404u,69206016u}/* 1F13F */, /*27284*/{2675965952u,2089u,65537u,89522715u,1507360u,3767009312u,62532u,138662404u,69206016u}/* 1F140 */, /*27285*/{2676490240u,2089u,65537u,89522715u,1507360u,3767009312u,62676u,138662404u,69206016u}/* 1F141 */, /*27286*/{2677014528u,2089u,65537u,89489947u,1507360u,3767009312u,63172u,138662404u,69206016u}/* 1F142 */, /*27287*/{2677538816u,2089u,65537u,89522715u,1507360u,3767009312u,63460u,138662404u,69206016u}/* 1F143 */, /*27288*/{2678063104u,2089u,65537u,89522715u,1507360u,3767009312u,63716u,138662404u,69206016u}/* 1F144 */, /*27289*/{2678587392u,2089u,65537u,89522715u,1507360u,3767009312u,64084u,138662404u,69206016u}/* 1F145 */, /*27290*/{2679111680u,2089u,65537u,89489947u,1507360u,3767009312u,64228u,138662404u,69206016u}/* 1F146 */, /*27291*/{2679635968u,2089u,65537u,89522715u,1507360u,3767009312u,64308u,138662404u,69206016u}/* 1F147 */, /*27292*/{2680160256u,2089u,65537u,89522715u,1507360u,3767009312u,64404u,138662404u,69206016u}/* 1F148 */, /*27293*/{2680684544u,2089u,65537u,89522715u,1507360u,3767009312u,64580u,138662404u,69206016u}/* 1F149 */, /*27294*/{2681208832u,2089u,65537u,89489947u,32u,1611137056u,124484u,273117184u,67108864u}/* 1F14A */, /*27295*/{2681733120u,2089u,65537u,89489947u,32u,1611137056u,125652u,273117184u,67108864u}/* 1F14B */, /*27296*/{2682257408u,2089u,65537u,89489947u,32u,1611137056u,122476u,273117184u,67108864u}/* 1F14C */, /*27297*/{2682781696u,2089u,65537u,89489947u,32u,1611137056u,126332u,273117184u,67108864u}/* 1F14D */, /*27298*/{2683305984u,2089u,65537u,89489947u,32u,1611137056u,188788u,407572480u,67108864u}/* 1F14E */, /*27299*/{2683830272u,2089u,65537u,89522715u,32u,1611137056u,123364u,273117184u,67108864u}/* 1F14F */, /*27300*/{0,2089u,65537u,89522203u,1507368u,3766485024u,58740u,138525188u,69206016u}/* 1F150 */, /*27301*/{0,2089u,65537u,89522203u,1507368u,3766485024u,58940u,138525188u,69206016u}/* 1F151 */, /*27302*/{0,2089u,65537u,89522203u,1507368u,3766485024u,59148u,138525188u,69206016u}/* 1F152 */, /*27303*/{0,2089u,65537u,89522203u,1507368u,3766485024u,59316u,138525188u,69206016u}/* 1F153 */, /*27304*/{0,2089u,65537u,89522203u,1507368u,3766485024u,59532u,138525188u,69206016u}/* 1F154 */, /*27305*/{0,2089u,65537u,89522203u,1507368u,3766485024u,60004u,138525188u,69206016u}/* 1F155 */, /*27306*/{0,2089u,65537u,89522203u,1507368u,3766485024u,60124u,138525188u,69206016u}/* 1F156 */, /*27307*/{0,2089u,65537u,89489435u,1507368u,3766485024u,60412u,138525188u,69206016u}/* 1F157 */, /*27308*/{0,2089u,65537u,89522203u,1507368u,3766485024u,60620u,138525188u,69206016u}/* 1F158 */, /*27309*/{0,2089u,65537u,89522203u,1507368u,3766485024u,60828u,138525188u,69206016u}/* 1F159 */, /*27310*/{0,2089u,65537u,89522203u,1507368u,3766485024u,61028u,138525188u,69206016u}/* 1F15A */, /*27311*/{0,2089u,65537u,89522203u,1507368u,3766485024u,61172u,138525188u,69206016u}/* 1F15B */, /*27312*/{0,2089u,65537u,89522203u,1507368u,3766485024u,61580u,138525188u,69206016u}/* 1F15C */, /*27313*/{0,2089u,65537u,89522203u,1507368u,3766485024u,61700u,138525188u,69206016u}/* 1F15D */, /*27314*/{0,2089u,65537u,89522203u,1507368u,3766485024u,61988u,138525188u,69206016u}/* 1F15E */, /*27315*/{0,2089u,65537u,89489435u,1507368u,3766485024u,62364u,138525188u,69206016u}/* 1F15F */, /*27316*/{0,2089u,65537u,89522203u,1507368u,3766485024u,62532u,138525188u,69206016u}/* 1F160 */, /*27317*/{0,2089u,65537u,89522203u,1507368u,3766485024u,62676u,138525188u,69206016u}/* 1F161 */, /*27318*/{0,2089u,65537u,89522203u,1507368u,3766485024u,63172u,138525188u,69206016u}/* 1F162 */, /*27319*/{0,2089u,65537u,89522203u,1507368u,3766485024u,63460u,138525188u,69206016u}/* 1F163 */, /*27320*/{0,2089u,65537u,89522203u,1507368u,3766485024u,63716u,138525188u,69206016u}/* 1F164 */, /*27321*/{0,2089u,65537u,89522203u,1507368u,3766485024u,64084u,138525188u,69206016u}/* 1F165 */, /*27322*/{0,2089u,65537u,89522203u,1507368u,3766485024u,64228u,138525188u,69206016u}/* 1F166 */, /*27323*/{0,2089u,65537u,89522203u,1507368u,3766485024u,64308u,138525188u,69206016u}/* 1F167 */, /*27324*/{0,2089u,65537u,89522203u,1507368u,3766485024u,64404u,138525188u,69206016u}/* 1F168 */, /*27325*/{0,2089u,65537u,89522203u,1507368u,3766485024u,64580u,138525188u,69206016u}/* 1F169 */, /*27326*/{2684354560u,2088u,65537u,76982619u,32u,1611137056u,120716u,272969728u,67108864u}/* 1F16A */, /*27327*/{2684878848u,2088u,65537u,76982619u,32u,1611137056u,120884u,272969728u,67108864u}/* 1F16B */, /*27328*/{0,2089u,65537u,89522203u,1507336u,3766489120u,58740u,138664452u,69206016u}/* 1F170 */, /*27329*/{0,2089u,65537u,89522203u,1507336u,3766489120u,58940u,138664452u,69206016u}/* 1F171 */, /*27330*/{0,2089u,65537u,89522203u,1507368u,3766485024u,59148u,138664452u,69206016u}/* 1F172 */, /*27331*/{0,2089u,65537u,89522203u,1507368u,3766485024u,59316u,138664452u,69206016u}/* 1F173 */, /*27332*/{0,2089u,65537u,89522203u,1507368u,3766485024u,59532u,138664452u,69206016u}/* 1F174 */, /*27333*/{0,2089u,65537u,89522203u,1507368u,3766485024u,60004u,138664452u,69206016u}/* 1F175 */, /*27334*/{0,2089u,65537u,89522203u,1507368u,3766485024u,60124u,138664452u,69206016u}/* 1F176 */, /*27335*/{0,2089u,65537u,89522203u,1507368u,3766485024u,60412u,138664452u,69206016u}/* 1F177 */, /*27336*/{0,2089u,65537u,89522203u,1507368u,3766485024u,60620u,138664452u,69206016u}/* 1F178 */, /*27337*/{0,2089u,65537u,89489435u,1507368u,3766485024u,60828u,138664452u,69206016u}/* 1F179 */, /*27338*/{0,2089u,65537u,89522203u,1507368u,3766485024u,61028u,138664452u,69206016u}/* 1F17A */, /*27339*/{0,2089u,65537u,89489435u,1507368u,3766485024u,61172u,138664452u,69206016u}/* 1F17B */, /*27340*/{0,2089u,65537u,89489435u,1507368u,3766485024u,61580u,138664452u,69206016u}/* 1F17C */, /*27341*/{0,2089u,65537u,89522203u,1507368u,3766485024u,61700u,138664452u,69206016u}/* 1F17D */, /*27342*/{0,2089u,65537u,89522203u,1507336u,3766489120u,61988u,138664452u,69206016u}/* 1F17E */, /*27343*/{0,2089u,65537u,89489435u,1507336u,3766489120u,62364u,138664452u,69206016u}/* 1F17F */, /*27344*/{0,2089u,65537u,89522203u,1507368u,3766485024u,62532u,138664452u,69206016u}/* 1F180 */, /*27345*/{0,2089u,65537u,89522203u,1507368u,3766485024u,62676u,138664452u,69206016u}/* 1F181 */, /*27346*/{0,2089u,65537u,89522203u,1507368u,3766485024u,63172u,138664452u,69206016u}/* 1F182 */, /*27347*/{0,2089u,65537u,89522203u,1507368u,3766485024u,63460u,138664452u,69206016u}/* 1F183 */, /*27348*/{0,2089u,65537u,89522203u,1507368u,3766485024u,63716u,138664452u,69206016u}/* 1F184 */, /*27349*/{0,2089u,65537u,89522203u,1507368u,3766485024u,64084u,138664452u,69206016u}/* 1F185 */, /*27350*/{0,2089u,65537u,89522203u,1507368u,3766485024u,64228u,138664452u,69206016u}/* 1F186 */, /*27351*/{0,2089u,65537u,89522203u,1507368u,3766485024u,64308u,138664452u,69206016u}/* 1F187 */, /*27352*/{0,2089u,65537u,89522203u,1507368u,3766485024u,64404u,138664452u,69206016u}/* 1F188 */, /*27353*/{0,2089u,65537u,89522203u,1507368u,3766485024u,64580u,138664452u,69206016u}/* 1F189 */, /*27354*/{0,2089u,65537u,89489435u,40u,1610612768u,62364u,138663936u,67108864u}/* 1F18A */, /*27355*/{0,2089u,65537u,89489435u,40u,1610612768u,119756u,273119232u,67108864u}/* 1F18B */, /*27356*/{0,2089u,65537u,89489435u,40u,1610612768u,121092u,273119232u,67108864u}/* 1F18C */, /*27357*/{0,2089u,65537u,89489435u,40u,1610612768u,121900u,273119232u,67108864u}/* 1F18D */, /*27358*/{0,2091u,65537u,89522203u,8u,1610617120u,117668u,273119232u,67108864u}/* 1F18E */, /*27359*/{0,2089u,65537u,89522203u,40u,1610612768u,123364u,273119232u,67108864u}/* 1F18F */, /*27360*/{2685403136u,2089u,65537u,89489947u,32u,1611137056u,120132u,273117184u,67108864u}/* 1F190 */, /*27361*/{0,2091u,65537u,89522203u,8u,1610617120u,120308u,273119232u,67108864u}/* 1F191 */, /*27362*/{0,2091u,65537u,89522203u,8u,1610617120u,244260u,542029824u,67108864u}/* 1F192 */, /*27363*/{0,2091u,65537u,89522203u,8u,1610617120u,241708u,542029824u,67108864u}/* 1F193 */, /*27364*/{0,2091u,65537u,89522203u,8u,1610617120u,119924u,273119232u,67108864u}/* 1F194 */, /*27365*/{0,2091u,65537u,89522203u,8u,1610617120u,185436u,407574528u,67108864u}/* 1F195 */, /*27366*/{0,2091u,65537u,89522203u,8u,1610617120u,121812u,273119232u,67108864u}/* 1F196 */, /*27367*/{0,2091u,65537u,89522203u,8u,1610617120u,123004u,273119232u,67108864u}/* 1F197 */, /*27368*/{0,2091u,65537u,89522203u,8u,1610617120u,188308u,407574528u,67108864u}/* 1F198 */, /*27369*/{0,2091u,65537u,89522203u,8u,1610617120u,130940u,407566336u,67108864u}/* 1F199 */, /*27370*/{0,2091u,65537u,89522203u,8u,1610617120u,127244u,273119232u,67108864u}/* 1F19A */, /*27371*/{0,2089u,65537u,89718811u,40u,1610612768u,117988u,273111040u,67108864u}/* 1F19B */, /*27372*/{0,2089u,65537u,89718811u,40u,1610612768u,368796u,945346560u,67108864u}/* 1F19C */, /*27373*/{0,2089u,65537u,89718811u,40u,1610612768u,119692u,273111040u,67108864u}/* 1F19D */, /*27374*/{0,2089u,65537u,89718811u,40u,1610612768u,119708u,273111040u,67108864u}/* 1F19E */, /*27375*/{0,2089u,65537u,89718811u,40u,1610612768u,119740u,273111040u,67108864u}/* 1F19F */, /*27376*/{0,2089u,65537u,89718811u,40u,1610612768u,122412u,407549952u,67108864u}/* 1F1A0 */, /*27377*/{0,2089u,65537u,89718811u,40u,1610612768u,122428u,407549952u,67108864u}/* 1F1A1 */, /*27378*/{0,2089u,65537u,89718811u,40u,1610612768u,181060u,541997056u,67108864u}/* 1F1A2 */, /*27379*/{0,2089u,65537u,89718811u,40u,1610612768u,179708u,407558144u,67108864u}/* 1F1A3 */, /*27380*/{0,2089u,65537u,89718811u,40u,1610612768u,238332u,542005248u,67108864u}/* 1F1A4 */, /*27381*/{0,2089u,65537u,89718811u,40u,1610612768u,59316u,138655744u,67108864u}/* 1F1A5 */, /*27382*/{0,2089u,65537u,89718811u,40u,1610612768u,119548u,273111040u,67108864u}/* 1F1A6 */, /*27383*/{0,2089u,65537u,89718811u,40u,1610612768u,182380u,407566336u,67108864u}/* 1F1A7 */, /*27384*/{0,2089u,65537u,89718811u,40u,1610612768u,310532u,810907648u,67108864u}/* 1F1A8 */, /*27385*/{0,2089u,65537u,89718811u,40u,1610612768u,496468u,1079793664u,67108864u}/* 1F1A9 */, /*27386*/{0,2089u,65537u,89718811u,40u,1610612768u,187644u,407574528u,67108864u}/* 1F1AA */, /*27387*/{0,2089u,65537u,89718811u,40u,1610612768u,183420u,407574528u,67108864u}/* 1F1AB */, /*27388*/{0,2089u,65537u,89718811u,40u,1610612768u,185364u,407574528u,67108864u}/* 1F1AC */, /*27389*/{0,2088u,65537u,110493723u,806354952u,1610619168u,20732u,138442752u,201326592u}/* 1F1E6 */, /*27390*/{0,2088u,65537u,110493723u,806354952u,1610619168u,20740u,138442752u,201326592u}/* 1F1E7 */, /*27391*/{0,2088u,65537u,110493723u,806354952u,1610619168u,20748u,138442752u,201326592u}/* 1F1E8 */, /*27392*/{0,2088u,65537u,110493723u,806354952u,1610619168u,20756u,138442752u,201326592u}/* 1F1E9 */, /*27393*/{0,2088u,65537u,110493723u,806354952u,1610619168u,20764u,138442752u,201326592u}/* 1F1EA */, /*27394*/{0,2088u,65537u,110493723u,806354952u,1610619168u,20772u,138442752u,201326592u}/* 1F1EB */, /*27395*/{0,2088u,65537u,110493723u,806354952u,1610619168u,20780u,138442752u,201326592u}/* 1F1EC */, /*27396*/{0,2088u,65537u,110493723u,806354952u,1610619168u,20788u,138442752u,201326592u}/* 1F1ED */, /*27397*/{0,2088u,65537u,110493723u,806354952u,1610619168u,20796u,138442752u,201326592u}/* 1F1EE */, /*27398*/{0,2088u,65537u,110493723u,806354952u,1610619168u,20804u,138442752u,201326592u}/* 1F1EF */, /*27399*/{0,2088u,65537u,110493723u,806354952u,1610619168u,20812u,138442752u,201326592u}/* 1F1F0 */, /*27400*/{0,2088u,65537u,110493723u,806354952u,1610619168u,20820u,138442752u,201326592u}/* 1F1F1 */, /*27401*/{0,2088u,65537u,110493723u,806354952u,1610619168u,20828u,138442752u,201326592u}/* 1F1F2 */, /*27402*/{0,2088u,65537u,110493723u,806354952u,1610619168u,20836u,138442752u,201326592u}/* 1F1F3 */, /*27403*/{0,2088u,65537u,110493723u,806354952u,1610619168u,20844u,138442752u,201326592u}/* 1F1F4 */, /*27404*/{0,2088u,65537u,110493723u,806354952u,1610619168u,20852u,138442752u,201326592u}/* 1F1F5 */, /*27405*/{0,2088u,65537u,110493723u,806354952u,1610619168u,20860u,138442752u,201326592u}/* 1F1F6 */, /*27406*/{0,2088u,65537u,110493723u,806354952u,1610619168u,20868u,138442752u,201326592u}/* 1F1F7 */, /*27407*/{0,2088u,65537u,110493723u,806354952u,1610619168u,20876u,138442752u,201326592u}/* 1F1F8 */, /*27408*/{0,2088u,65537u,110493723u,806354952u,1610619168u,20884u,138442752u,201326592u}/* 1F1F9 */, /*27409*/{0,2088u,65537u,110493723u,806354952u,1610619168u,20892u,138442752u,201326592u}/* 1F1FA */, /*27410*/{0,2088u,65537u,110493723u,806354952u,1610619168u,20900u,138442752u,201326592u}/* 1F1FB */, /*27411*/{0,2088u,65537u,110493723u,806354952u,1610619168u,20908u,138442752u,201326592u}/* 1F1FC */, /*27412*/{0,2088u,65537u,110493723u,806354952u,1610619168u,20916u,138442752u,201326592u}/* 1F1FD */, /*27413*/{0,2088u,65537u,110493723u,806354952u,1610619168u,20924u,138442752u,201326592u}/* 1F1FE */, /*27414*/{0,2088u,65537u,110493723u,806354952u,1610619168u,20932u,138442752u,201326592u}/* 1F1FF */, /*27415*/{2685927424u,2099u,2162689u,103121435u,32u,1611137056u,256060u,273100800u,67108864u}/* 1F200 */, /*27416*/{2686451712u,2099u,65537u,103154203u,0u,1611141408u,255932u,273100800u,67108864u}/* 1F201 */, /*27417*/{2686976000u,2099u,65537u,103154203u,0u,1611141152u,127980u,138653696u,67108864u}/* 1F202 */, /*27418*/{2687500288u,2099u,65537u,103121435u,32u,1611137056u,978020u,138653696u,67108864u}/* 1F210 */, /*27419*/{2688024576u,2099u,65537u,103121435u,32u,1611137056u,963780u,138653696u,67108864u}/* 1F211 */, /*27420*/{2688548864u,2099u,65537u,103121435u,32u,1611137056u,948332u,138653696u,67108864u}/* 1F212 */, /*27421*/{2689073152u,2099u,65537u,103121435u,32u,1611137056u,128044u,369569792u,67108864u}/* 1F213 */, /*27422*/{2689597440u,2099u,65537u,103121435u,32u,1611137056u,937580u,138653696u,67108864u}/* 1F214 */, /*27423*/{2690121728u,2099u,65537u,103121435u,32u,1611137056u,959196u,138653696u,67108864u}/* 1F215 */, /*27424*/{2690646016u,2099u,65537u,103121435u,32u,1611137056u,796972u,138653696u,67108864u}/* 1F216 */, /*27425*/{2691170304u,2099u,65537u,103121435u,32u,1611137056u,959316u,138653696u,67108864u}/* 1F217 */, /*27426*/{2691694592u,2099u,65537u,103121435u,32u,1611137056u,937772u,138653696u,67108864u}/* 1F218 */, /*27427*/{2692218880u,2099u,65537u,103121435u,32u,1611137056u,985868u,138653696u,67108864u}/* 1F219 */, /*27428*/{2692743168u,2099u,65537u,103121435u,0u,1611141408u,1008404u,138653696u,67108864u}/* 1F21A */, /*27429*/{2693267456u,2099u,65537u,103121435u,32u,1611137056u,984788u,138653696u,67108864u}/* 1F21B */, /*27430*/{2693791744u,2099u,65537u,103121435u,32u,1611137056u,945268u,138653696u,67108864u}/* 1F21C */, /*27431*/{2694316032u,2099u,65537u,103121435u,32u,1611137056u,972396u,138653696u,67108864u}/* 1F21D */, /*27432*/{2694840320u,2099u,65537u,103121435u,32u,1611137056u,943732u,138653696u,67108864u}/* 1F21E */, /*27433*/{2695364608u,2099u,65537u,103121435u,32u,1611137056u,984972u,138653696u,67108864u}/* 1F21F */, /*27434*/{2695888896u,2099u,65537u,103121435u,32u,1611137056u,944884u,138653696u,67108864u}/* 1F220 */, /*27435*/{2696413184u,2099u,65537u,103121435u,32u,1611137056u,1033244u,138653696u,67108864u}/* 1F221 */, /*27436*/{2696937472u,2099u,65537u,103121435u,32u,1611137056u,1016580u,138653696u,67108864u}/* 1F222 */, /*27437*/{2697461760u,2099u,65537u,103121435u,32u,1611137056u,802652u,138653696u,67108864u}/* 1F223 */, /*27438*/{2697986048u,2099u,65537u,103121435u,32u,1611137056u,958860u,138653696u,67108864u}/* 1F224 */, /*27439*/{2698510336u,2099u,65537u,103121435u,32u,1611137056u,949204u,138653696u,67108864u}/* 1F225 */, /*27440*/{2699034624u,2099u,65537u,103121435u,32u,1611137056u,1004204u,138653696u,67108864u}/* 1F226 */, /*27441*/{2699558912u,2099u,65537u,103121435u,32u,1611137056u,978612u,138653696u,67108864u}/* 1F227 */, /*27442*/{2700083200u,2099u,65537u,103121435u,32u,1611137056u,980148u,138653696u,67108864u}/* 1F228 */, /*27443*/{2700607488u,2099u,65537u,103121435u,32u,1611137056u,936460u,138653696u,67108864u}/* 1F229 */, /*27444*/{2701131776u,2099u,65537u,103121435u,32u,1611137056u,936532u,138653696u,67108864u}/* 1F22A */, /*27445*/{2701656064u,2099u,65537u,103121435u,32u,1611137056u,810084u,138653696u,67108864u}/* 1F22B */, /*27446*/{2702180352u,2099u,65537u,103121435u,32u,1611137056u,969020u,138653696u,67108864u}/* 1F22C */, /*27447*/{2702704640u,2099u,65537u,103121435u,32u,1611137056u,936820u,138653696u,67108864u}/* 1F22D */, /*27448*/{2703228928u,2099u,65537u,103121435u,32u,1611137056u,948644u,138653696u,67108864u}/* 1F22E */, /*27449*/{2703753216u,2099u,65537u,103121435u,0u,1611141408u,979524u,138653696u,67108864u}/* 1F22F */, /*27450*/{2704277504u,2099u,65537u,103121435u,32u,1611137056u,804244u,138653696u,67108864u}/* 1F230 */, /*27451*/{2704801792u,2099u,65537u,103121435u,32u,1611137056u,978084u,138653696u,67108864u}/* 1F231 */, /*27452*/{2705326080u,2099u,65537u,103154203u,0u,1611141408u,1025556u,138653696u,67108864u}/* 1F232 */, /*27453*/{2705850368u,2099u,65537u,103154203u,0u,1611141408u,1027548u,138653696u,67108864u}/* 1F233 */, /*27454*/{2706374656u,2099u,65537u,103154203u,0u,1611141408u,948812u,138653696u,67108864u}/* 1F234 */, /*27455*/{2706898944u,2099u,65537u,103154203u,0u,1611141408u,1003020u,138653696u,67108864u}/* 1F235 */, /*27456*/{2707423232u,2099u,65537u,103154203u,0u,1611141408u,987732u,138653696u,67108864u}/* 1F236 */, /*27457*/{2707947520u,2099u,65537u,103154203u,0u,1611141152u,987724u,138653696u,67108864u}/* 1F237 */, /*27458*/{2708471808u,2099u,65537u,103154203u,0u,1611141408u,1016740u,138653696u,67108864u}/* 1F238 */, /*27459*/{2708996096u,2099u,65537u,103154203u,0u,1611141408u,945564u,138653696u,67108864u}/* 1F239 */, /*27460*/{2709520384u,2099u,65537u,103154203u,0u,1611141408u,952252u,138653696u,67108864u}/* 1F23A */, /*27461*/{2710044672u,2099u,65537u,103350811u,32u,1611137056u,812156u,138653696u,67108864u}/* 1F23B */, /*27462*/{2710568960u,2099u,65537u,103120987u,32u,1611137056u,1002260u,406958080u,67108864u}/* 1F240 */, /*27463*/{2711093248u,2099u,65537u,103120987u,32u,1611137056u,950780u,406958080u,67108864u}/* 1F241 */, /*27464*/{2711617536u,2099u,65537u,103120987u,32u,1611137056u,951828u,406958080u,67108864u}/* 1F242 */, /*27465*/{2712141824u,2099u,65537u,103120987u,32u,1611137056u,978428u,406958080u,67108864u}/* 1F243 */, /*27466*/{2712666112u,2099u,65537u,103120987u,32u,1611137056u,1021820u,406958080u,67108864u}/* 1F244 */, /*27467*/{2713190400u,2099u,65537u,103120987u,32u,1611137056u,992332u,406958080u,67108864u}/* 1F245 */, /*27468*/{2713714688u,2099u,65537u,103120987u,32u,1611137056u,1034348u,406958080u,67108864u}/* 1F246 */, /*27469*/{2714238976u,2099u,65537u,103120987u,32u,1611137056u,960668u,406958080u,67108864u}/* 1F247 */, /*27470*/{2714763264u,2099u,65537u,103120987u,32u,1611137056u,998508u,406958080u,67108864u}/* 1F248 */, /*27471*/{2715287552u,2099u,65537u,103153979u,0u,1611141408u,972484u,138473472u,67108864u}/* 1F250 */, /*27472*/{2715811840u,2099u,65537u,103153979u,0u,1611141408u,948612u,138473472u,67108864u}/* 1F251 */, /*27473*/{0,2099u,65537u,103393307u,40u,1610612768u,38420u,138442752u,67108864u}/* 1F260 */, /*27474*/{0,2099u,65537u,103393307u,40u,1610612768u,38428u,138442752u,67108864u}/* 1F261 */, /*27475*/{0,2099u,65537u,103393307u,40u,1610612768u,38436u,138442752u,67108864u}/* 1F262 */, /*27476*/{0,2099u,65537u,103393307u,40u,1610612768u,38444u,138442752u,67108864u}/* 1F263 */, /*27477*/{0,2099u,65537u,103393307u,40u,1610612768u,38452u,138442752u,67108864u}/* 1F264 */, /*27478*/{0,2099u,65537u,103393307u,40u,1610612768u,38460u,138442752u,67108864u}/* 1F265 */, /*27479*/{0,2107u,65537u,103163931u,8u,1610617120u,38468u,138442752u,67108864u}/* 1F300 */, /*27480*/{0,2107u,65537u,103163931u,8u,1610617120u,38476u,138442752u,67108864u}/* 1F301 */, /*27481*/{0,2107u,65537u,103163931u,8u,1610617120u,38484u,138442752u,67108864u}/* 1F302 */, /*27482*/{0,2107u,65537u,103163931u,8u,1610617120u,38492u,138442752u,67108864u}/* 1F303 */, /*27483*/{0,2107u,65537u,103163931u,8u,1610617120u,38500u,138442752u,67108864u}/* 1F304 */, /*27484*/{0,2107u,65537u,103163931u,8u,1610617120u,38508u,138442752u,67108864u}/* 1F305 */, /*27485*/{0,2107u,65537u,103163931u,8u,1610617120u,38516u,138442752u,67108864u}/* 1F306 */, /*27486*/{0,2107u,65537u,103163931u,8u,1610617120u,38524u,138442752u,67108864u}/* 1F307 */, /*27487*/{0,2107u,65537u,103163931u,2150105096u,1610617120u,38532u,138442752u,67108864u}/* 1F308 */, /*27488*/{0,2107u,65537u,103163931u,8u,1610617120u,38540u,138442752u,67108864u}/* 1F309 */, /*27489*/{0,2107u,65537u,103163931u,8u,1610617120u,38548u,138442752u,67108864u}/* 1F30A */, /*27490*/{0,2107u,65537u,103163931u,8u,1610617120u,38556u,138442752u,67108864u}/* 1F30B */, /*27491*/{0,2107u,65537u,103163931u,8u,1610617120u,38564u,138442752u,67108864u}/* 1F30C */, /*27492*/{0,2107u,65537u,103163931u,8u,1610617120u,38572u,138442752u,67108864u}/* 1F30D */, /*27493*/{0,2107u,65537u,103163931u,8u,1610617120u,38580u,138442752u,67108864u}/* 1F30E */, /*27494*/{0,2107u,65537u,103163931u,8u,1610617120u,38588u,138442752u,67108864u}/* 1F30F */, /*27495*/{0,2107u,65537u,103163931u,8u,1610617120u,38596u,138442752u,67108864u}/* 1F310 */, /*27496*/{0,2107u,65537u,103163931u,8u,1610617120u,38604u,138442752u,67108864u}/* 1F311 */, /*27497*/{0,2107u,65537u,103163931u,8u,1610617120u,38612u,138442752u,67108864u}/* 1F312 */, /*27498*/{0,2107u,65537u,103163931u,8u,1610617120u,38620u,138442752u,67108864u}/* 1F313 */, /*27499*/{0,2107u,65537u,103163931u,8u,1610617120u,38628u,138442752u,67108864u}/* 1F314 */, /*27500*/{0,2107u,65537u,103163931u,8u,1610617120u,38636u,138442752u,67108864u}/* 1F315 */, /*27501*/{0,2107u,65537u,103163931u,8u,1610617120u,38644u,138442752u,67108864u}/* 1F316 */, /*27502*/{0,2107u,65537u,103163931u,8u,1610617120u,38652u,138442752u,67108864u}/* 1F317 */, /*27503*/{0,2107u,65537u,103163931u,8u,1610617120u,38660u,138442752u,67108864u}/* 1F318 */, /*27504*/{0,2107u,65537u,103163931u,8u,1610617120u,38668u,138442752u,67108864u}/* 1F319 */, /*27505*/{0,2107u,65537u,103163931u,8u,1610617120u,38676u,138442752u,67108864u}/* 1F31A */, /*27506*/{0,2107u,65537u,103163931u,8u,1610617120u,38684u,138442752u,67108864u}/* 1F31B */, /*27507*/{0,2107u,65537u,103163931u,8u,1610617120u,38692u,138442752u,67108864u}/* 1F31C */, /*27508*/{0,2107u,65537u,103163931u,8u,1610617120u,38700u,138442752u,67108864u}/* 1F31D */, /*27509*/{0,2107u,65537u,103163931u,8u,1610617120u,38708u,138442752u,67108864u}/* 1F31E */, /*27510*/{0,2107u,65537u,103163931u,8u,1610617120u,38716u,138442752u,67108864u}/* 1F31F */, /*27511*/{0,2107u,65537u,103163931u,8u,1610617120u,38724u,138442752u,67108864u}/* 1F320 */, /*27512*/{0,2104u,65537u,103295003u,8u,1610616864u,38732u,138442752u,67108864u}/* 1F321 */, /*27513*/{0,2104u,65537u,103295003u,40u,1610612768u,38740u,138442752u,67108864u}/* 1F322 */, /*27514*/{0,2104u,65537u,103295003u,40u,1610612768u,38748u,138442752u,67108864u}/* 1F323 */, /*27515*/{0,2104u,65537u,103295003u,8u,1610616864u,38756u,138442752u,67108864u}/* 1F324 */, /*27516*/{0,2104u,65537u,103295003u,8u,1610616864u,38764u,138442752u,67108864u}/* 1F325 */, /*27517*/{0,2104u,65537u,103295003u,8u,1610616864u,38772u,138442752u,67108864u}/* 1F326 */, /*27518*/{0,2104u,65537u,103295003u,8u,1610616864u,38780u,138442752u,67108864u}/* 1F327 */, /*27519*/{0,2104u,65537u,103295003u,8u,1610616864u,38788u,138442752u,67108864u}/* 1F328 */, /*27520*/{0,2104u,65537u,103295003u,8u,1610616864u,38796u,138442752u,67108864u}/* 1F329 */, /*27521*/{0,2104u,65537u,103295003u,8u,1610616864u,38804u,138442752u,67108864u}/* 1F32A */, /*27522*/{0,2104u,65537u,103295003u,8u,1610616864u,38812u,138442752u,67108864u}/* 1F32B */, /*27523*/{0,2104u,65537u,103295003u,8u,1610616864u,38820u,138442752u,67108864u}/* 1F32C */, /*27524*/{0,2107u,65537u,103327771u,8u,1610617120u,38828u,138442752u,67108864u}/* 1F32D */, /*27525*/{0,2107u,65537u,103327771u,8u,1610617120u,38836u,138442752u,67108864u}/* 1F32E */, /*27526*/{0,2107u,65537u,103327771u,8u,1610617120u,38844u,138442752u,67108864u}/* 1F32F */, /*27527*/{0,2107u,65537u,103163931u,8u,1610617120u,38852u,138442752u,67108864u}/* 1F330 */, /*27528*/{0,2107u,65537u,103163931u,8u,1610617120u,38860u,138442752u,67108864u}/* 1F331 */, /*27529*/{0,2107u,65537u,103163931u,8u,1610617120u,38868u,138442752u,67108864u}/* 1F332 */, /*27530*/{0,2107u,65537u,103163931u,8u,1610617120u,38876u,138442752u,67108864u}/* 1F333 */, /*27531*/{0,2107u,65537u,103163931u,8u,1610617120u,38884u,138442752u,67108864u}/* 1F334 */, /*27532*/{0,2107u,65537u,103163931u,8u,1610617120u,38892u,138442752u,67108864u}/* 1F335 */, /*27533*/{0,2104u,65537u,103295003u,8u,1610616864u,38900u,138442752u,67108864u}/* 1F336 */, /*27534*/{0,2107u,65537u,103163931u,8u,1610617120u,38908u,138442752u,67108864u}/* 1F337 */, /*27535*/{0,2107u,65537u,103163931u,8u,1610617120u,38916u,138442752u,67108864u}/* 1F338 */, /*27536*/{0,2107u,65537u,103163931u,8u,1610617120u,38924u,138442752u,67108864u}/* 1F339 */, /*27537*/{0,2107u,65537u,103163931u,8u,1610617120u,38932u,138442752u,67108864u}/* 1F33A */, /*27538*/{0,2107u,65537u,103163931u,8u,1610617120u,38940u,138442752u,67108864u}/* 1F33B */, /*27539*/{0,2107u,65537u,103163931u,8u,1610617120u,38948u,138442752u,67108864u}/* 1F33C */, /*27540*/{0,2107u,65537u,103163931u,8u,1610617120u,38956u,138442752u,67108864u}/* 1F33D */, /*27541*/{0,2107u,65537u,103163931u,2150105096u,1610617120u,38964u,138442752u,67108864u}/* 1F33E */, /*27542*/{0,2107u,65537u,103163931u,8u,1610617120u,38972u,138442752u,67108864u}/* 1F33F */, /*27543*/{0,2107u,65537u,103163931u,8u,1610617120u,38980u,138442752u,67108864u}/* 1F340 */, /*27544*/{0,2107u,65537u,103163931u,8u,1610617120u,38988u,138442752u,67108864u}/* 1F341 */, /*27545*/{0,2107u,65537u,103163931u,8u,1610617120u,38996u,138442752u,67108864u}/* 1F342 */, /*27546*/{0,2107u,65537u,103163931u,8u,1610617120u,39004u,138442752u,67108864u}/* 1F343 */, /*27547*/{0,2107u,65537u,103163931u,8u,1610617120u,39012u,138442752u,67108864u}/* 1F344 */, /*27548*/{0,2107u,65537u,103163931u,8u,1610617120u,39020u,138442752u,67108864u}/* 1F345 */, /*27549*/{0,2107u,65537u,103163931u,8u,1610617120u,39028u,138442752u,67108864u}/* 1F346 */, /*27550*/{0,2107u,65537u,103163931u,8u,1610617120u,39036u,138442752u,67108864u}/* 1F347 */, /*27551*/{0,2107u,65537u,103163931u,8u,1610617120u,39044u,138442752u,67108864u}/* 1F348 */, /*27552*/{0,2107u,65537u,103163931u,8u,1610617120u,39052u,138442752u,67108864u}/* 1F349 */, /*27553*/{0,2107u,65537u,103163931u,8u,1610617120u,39060u,138442752u,67108864u}/* 1F34A */, /*27554*/{0,2107u,65537u,103163931u,8u,1610617120u,39068u,138442752u,67108864u}/* 1F34B */, /*27555*/{0,2107u,65537u,103163931u,8u,1610617120u,39076u,138442752u,67108864u}/* 1F34C */, /*27556*/{0,2107u,65537u,103163931u,8u,1610617120u,39084u,138442752u,67108864u}/* 1F34D */, /*27557*/{0,2107u,65537u,103163931u,8u,1610617120u,39092u,138442752u,67108864u}/* 1F34E */, /*27558*/{0,2107u,65537u,103163931u,8u,1610617120u,39100u,138442752u,67108864u}/* 1F34F */, /*27559*/{0,2107u,65537u,103163931u,8u,1610617120u,39108u,138442752u,67108864u}/* 1F350 */, /*27560*/{0,2107u,65537u,103163931u,8u,1610617120u,39116u,138442752u,67108864u}/* 1F351 */, /*27561*/{0,2107u,65537u,103163931u,8u,1610617120u,39124u,138442752u,67108864u}/* 1F352 */, /*27562*/{0,2107u,65537u,103163931u,8u,1610617120u,39132u,138442752u,67108864u}/* 1F353 */, /*27563*/{0,2107u,65537u,103163931u,8u,1610617120u,39140u,138442752u,67108864u}/* 1F354 */, /*27564*/{0,2107u,65537u,103163931u,8u,1610617120u,39148u,138442752u,67108864u}/* 1F355 */, /*27565*/{0,2107u,65537u,103163931u,8u,1610617120u,39156u,138442752u,67108864u}/* 1F356 */, /*27566*/{0,2107u,65537u,103163931u,8u,1610617120u,39164u,138442752u,67108864u}/* 1F357 */, /*27567*/{0,2107u,65537u,103163931u,8u,1610617120u,39172u,138442752u,67108864u}/* 1F358 */, /*27568*/{0,2107u,65537u,103163931u,8u,1610617120u,39180u,138442752u,67108864u}/* 1F359 */, /*27569*/{0,2107u,65537u,103163931u,8u,1610617120u,39188u,138442752u,67108864u}/* 1F35A */, /*27570*/{0,2107u,65537u,103163931u,8u,1610617120u,39196u,138442752u,67108864u}/* 1F35B */, /*27571*/{0,2107u,65537u,103163931u,8u,1610617120u,39204u,138442752u,67108864u}/* 1F35C */, /*27572*/{0,2107u,65537u,103163931u,8u,1610617120u,39212u,138442752u,67108864u}/* 1F35D */, /*27573*/{0,2107u,65537u,103163931u,8u,1610617120u,39220u,138442752u,67108864u}/* 1F35E */, /*27574*/{0,2107u,65537u,103163931u,8u,1610617120u,39228u,138442752u,67108864u}/* 1F35F */, /*27575*/{0,2107u,65537u,103163931u,8u,1610617120u,39236u,138442752u,67108864u}/* 1F360 */, /*27576*/{0,2107u,65537u,103163931u,8u,1610617120u,39244u,138442752u,67108864u}/* 1F361 */, /*27577*/{0,2107u,65537u,103163931u,8u,1610617120u,39252u,138442752u,67108864u}/* 1F362 */, /*27578*/{0,2107u,65537u,103163931u,8u,1610617120u,39260u,138442752u,67108864u}/* 1F363 */, /*27579*/{0,2107u,65537u,103163931u,8u,1610617120u,39268u,138442752u,67108864u}/* 1F364 */, /*27580*/{0,2107u,65537u,103163931u,8u,1610617120u,39276u,138442752u,67108864u}/* 1F365 */, /*27581*/{0,2107u,65537u,103163931u,8u,1610617120u,39284u,138442752u,67108864u}/* 1F366 */, /*27582*/{0,2107u,65537u,103163931u,8u,1610617120u,39292u,138442752u,67108864u}/* 1F367 */, /*27583*/{0,2107u,65537u,103163931u,8u,1610617120u,39300u,138442752u,67108864u}/* 1F368 */, /*27584*/{0,2107u,65537u,103163931u,8u,1610617120u,39308u,138442752u,67108864u}/* 1F369 */, /*27585*/{0,2107u,65537u,103163931u,8u,1610617120u,39316u,138442752u,67108864u}/* 1F36A */, /*27586*/{0,2107u,65537u,103163931u,8u,1610617120u,39324u,138442752u,67108864u}/* 1F36B */, /*27587*/{0,2107u,65537u,103163931u,8u,1610617120u,39332u,138442752u,67108864u}/* 1F36C */, /*27588*/{0,2107u,65537u,103163931u,8u,1610617120u,39340u,138442752u,67108864u}/* 1F36D */, /*27589*/{0,2107u,65537u,103163931u,8u,1610617120u,39348u,138442752u,67108864u}/* 1F36E */, /*27590*/{0,2107u,65537u,103163931u,8u,1610617120u,39356u,138442752u,67108864u}/* 1F36F */, /*27591*/{0,2107u,65537u,103163931u,8u,1610617120u,39364u,138442752u,67108864u}/* 1F370 */, /*27592*/{0,2107u,65537u,103163931u,8u,1610617120u,39372u,138442752u,67108864u}/* 1F371 */, /*27593*/{0,2107u,65537u,103163931u,8u,1610617120u,39380u,138442752u,67108864u}/* 1F372 */, /*27594*/{0,2107u,65537u,103163931u,2150105096u,1610617120u,39388u,138442752u,67108864u}/* 1F373 */, /*27595*/{0,2107u,65537u,103163931u,8u,1610617120u,39396u,138442752u,67108864u}/* 1F374 */, /*27596*/{0,2107u,65537u,103163931u,8u,1610617120u,39404u,138442752u,67108864u}/* 1F375 */, /*27597*/{0,2107u,65537u,103163931u,8u,1610617120u,39412u,138442752u,67108864u}/* 1F376 */, /*27598*/{0,2107u,65537u,103163931u,8u,1610617120u,39420u,138442752u,67108864u}/* 1F377 */, /*27599*/{0,2107u,65537u,103163931u,8u,1610617120u,39428u,138442752u,67108864u}/* 1F378 */, /*27600*/{0,2107u,65537u,103163931u,8u,1610617120u,39436u,138442752u,67108864u}/* 1F379 */, /*27601*/{0,2107u,65537u,103163931u,8u,1610617120u,39444u,138442752u,67108864u}/* 1F37A */, /*27602*/{0,2107u,65537u,103163931u,8u,1610617120u,39452u,138442752u,67108864u}/* 1F37B */, /*27603*/{0,2107u,65537u,103163931u,8u,1610617120u,39460u,138442752u,67108864u}/* 1F37C */, /*27604*/{0,2104u,65537u,103295003u,8u,1610616864u,39468u,138442752u,67108864u}/* 1F37D */, /*27605*/{0,2107u,65537u,103327771u,8u,1610617120u,39476u,138442752u,67108864u}/* 1F37E */, /*27606*/{0,2107u,65537u,103327771u,8u,1610617120u,39484u,138442752u,67108864u}/* 1F37F */, /*27607*/{0,2107u,65537u,103163931u,8u,1610617120u,39492u,138442752u,67108864u}/* 1F380 */, /*27608*/{0,2107u,65537u,103163931u,8u,1610617120u,39500u,138442752u,67108864u}/* 1F381 */, /*27609*/{0,2107u,65537u,103163931u,8u,1610617120u,39508u,138442752u,67108864u}/* 1F382 */, /*27610*/{0,2107u,65537u,103163931u,8u,1610617120u,39516u,138442752u,67108864u}/* 1F383 */, /*27611*/{0,2107u,65537u,103163931u,8u,1610617120u,39524u,138442752u,67108864u}/* 1F384 */, /*27612*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,39532u,138442752u,67108864u}/* 1F385 */, /*27613*/{0,2107u,65537u,103163931u,8u,1610617120u,39540u,138442752u,67108864u}/* 1F386 */, /*27614*/{0,2107u,65537u,103163931u,8u,1610617120u,39548u,138442752u,67108864u}/* 1F387 */, /*27615*/{0,2107u,65537u,103163931u,8u,1610617120u,39556u,138442752u,67108864u}/* 1F388 */, /*27616*/{0,2107u,65537u,103163931u,8u,1610617120u,39564u,138442752u,67108864u}/* 1F389 */, /*27617*/{0,2107u,65537u,103163931u,8u,1610617120u,39572u,138442752u,67108864u}/* 1F38A */, /*27618*/{0,2107u,65537u,103163931u,8u,1610617120u,39580u,138442752u,67108864u}/* 1F38B */, /*27619*/{0,2107u,65537u,103163931u,8u,1610617120u,39588u,138442752u,67108864u}/* 1F38C */, /*27620*/{0,2107u,65537u,103163931u,8u,1610617120u,39596u,138442752u,67108864u}/* 1F38D */, /*27621*/{0,2107u,65537u,103163931u,8u,1610617120u,39604u,138442752u,67108864u}/* 1F38E */, /*27622*/{0,2107u,65537u,103163931u,8u,1610617120u,39612u,138442752u,67108864u}/* 1F38F */, /*27623*/{0,2107u,65537u,103163931u,8u,1610617120u,39620u,138442752u,67108864u}/* 1F390 */, /*27624*/{0,2107u,65537u,103163931u,8u,1610617120u,39628u,138442752u,67108864u}/* 1F391 */, /*27625*/{0,2107u,65537u,103163931u,8u,1610617120u,39636u,138442752u,67108864u}/* 1F392 */, /*27626*/{0,2107u,65537u,103163931u,2150105096u,1610617120u,39644u,138442752u,67108864u}/* 1F393 */, /*27627*/{0,2104u,65537u,103295003u,40u,1610612768u,39652u,138442752u,67108864u}/* 1F394 */, /*27628*/{0,2104u,65537u,103295003u,40u,1610612768u,39660u,138442752u,67108864u}/* 1F395 */, /*27629*/{0,2104u,65537u,103295003u,8u,1610616864u,39668u,138442752u,67108864u}/* 1F396 */, /*27630*/{0,2104u,65537u,103295003u,8u,1610616864u,39676u,138442752u,67108864u}/* 1F397 */, /*27631*/{0,2104u,65537u,103295003u,40u,1610612768u,39684u,138442752u,67108864u}/* 1F398 */, /*27632*/{0,2104u,65537u,103295003u,8u,1610616864u,39692u,138442752u,67108864u}/* 1F399 */, /*27633*/{0,2104u,65537u,103295003u,8u,1610616864u,39700u,138442752u,67108864u}/* 1F39A */, /*27634*/{0,2104u,65537u,103295003u,8u,1610616864u,39708u,138442752u,67108864u}/* 1F39B */, /*27635*/{0,2104u,65537u,77080603u,40u,1610612768u,39716u,138442752u,67108864u}/* 1F39C */, /*27636*/{0,2104u,65537u,77080603u,40u,1610612768u,39724u,138442752u,67108864u}/* 1F39D */, /*27637*/{0,2104u,65537u,103295003u,8u,1610616864u,39732u,138442752u,67108864u}/* 1F39E */, /*27638*/{0,2104u,65537u,103295003u,8u,1610616864u,39740u,138442752u,67108864u}/* 1F39F */, /*27639*/{0,2107u,65537u,103163931u,8u,1610617120u,39748u,138442752u,67108864u}/* 1F3A0 */, /*27640*/{0,2107u,65537u,103163931u,8u,1610617120u,39756u,138442752u,67108864u}/* 1F3A1 */, /*27641*/{0,2107u,65537u,103163931u,8u,1610617120u,39764u,138442752u,67108864u}/* 1F3A2 */, /*27642*/{0,2107u,65537u,103163931u,8u,1610617120u,39772u,138442752u,67108864u}/* 1F3A3 */, /*27643*/{0,2107u,65537u,103163931u,2150105096u,1610617120u,39780u,138442752u,67108864u}/* 1F3A4 */, /*27644*/{0,2107u,65537u,103163931u,8u,1610617120u,39788u,138442752u,67108864u}/* 1F3A5 */, /*27645*/{0,2107u,65537u,103163931u,8u,1610617120u,39796u,138442752u,67108864u}/* 1F3A6 */, /*27646*/{0,2107u,65537u,103163931u,8u,1610617120u,39804u,138442752u,67108864u}/* 1F3A7 */, /*27647*/{0,2107u,65537u,103163931u,2150105096u,1610617120u,39812u,138442752u,67108864u}/* 1F3A8 */, /*27648*/{0,2107u,65537u,103163931u,8u,1610617120u,39820u,138442752u,67108864u}/* 1F3A9 */, /*27649*/{0,2107u,65537u,103163931u,8u,1610617120u,39828u,138442752u,67108864u}/* 1F3AA */, /*27650*/{0,2107u,65537u,103163931u,8u,1610617120u,39836u,138442752u,67108864u}/* 1F3AB */, /*27651*/{0,2107u,65537u,103163931u,8u,1610617120u,39844u,138442752u,67108864u}/* 1F3AC */, /*27652*/{0,2107u,65537u,103163931u,8u,1610617120u,39852u,138442752u,67108864u}/* 1F3AD */, /*27653*/{0,2107u,65537u,103163931u,8u,1610617120u,39860u,138442752u,67108864u}/* 1F3AE */, /*27654*/{0,2107u,65537u,103163931u,8u,1610617120u,39868u,138442752u,67108864u}/* 1F3AF */, /*27655*/{0,2107u,65537u,103163931u,8u,1610617120u,39876u,138442752u,67108864u}/* 1F3B0 */, /*27656*/{0,2107u,65537u,103163931u,8u,1610617120u,39884u,138442752u,67108864u}/* 1F3B1 */, /*27657*/{0,2107u,65537u,103163931u,8u,1610617120u,39892u,138442752u,67108864u}/* 1F3B2 */, /*27658*/{0,2107u,65537u,103163931u,8u,1610617120u,39900u,138442752u,67108864u}/* 1F3B3 */, /*27659*/{0,2107u,65537u,103163931u,8u,1610617120u,39908u,138442752u,67108864u}/* 1F3B4 */, /*27660*/{0,2107u,65537u,76949531u,8u,1610617120u,39916u,138442752u,67108864u}/* 1F3B5 */, /*27661*/{0,2107u,65537u,76949531u,8u,1610617120u,39924u,138442752u,67108864u}/* 1F3B6 */, /*27662*/{0,2107u,65537u,103163931u,8u,1610617120u,39932u,138442752u,67108864u}/* 1F3B7 */, /*27663*/{0,2107u,65537u,103163931u,8u,1610617120u,39940u,138442752u,67108864u}/* 1F3B8 */, /*27664*/{0,2107u,65537u,103163931u,8u,1610617120u,39948u,138442752u,67108864u}/* 1F3B9 */, /*27665*/{0,2107u,65537u,103163931u,8u,1610617120u,39956u,138442752u,67108864u}/* 1F3BA */, /*27666*/{0,2107u,65537u,103163931u,8u,1610617120u,39964u,138442752u,67108864u}/* 1F3BB */, /*27667*/{0,2107u,65537u,76949531u,8u,1610617120u,39972u,138442752u,67108864u}/* 1F3BC */, /*27668*/{0,2107u,65537u,103163931u,8u,1610617120u,39980u,138442752u,67108864u}/* 1F3BD */, /*27669*/{0,2107u,65537u,103163931u,8u,1610617120u,39988u,138442752u,67108864u}/* 1F3BE */, /*27670*/{0,2107u,65537u,103163931u,8u,1610617120u,39996u,138442752u,67108864u}/* 1F3BF */, /*27671*/{0,2107u,65537u,103163931u,8u,1610617120u,40004u,138442752u,67108864u}/* 1F3C0 */, /*27672*/{0,2107u,65537u,103163931u,8u,1610617120u,40012u,138442752u,67108864u}/* 1F3C1 */, /*27673*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,40020u,138442752u,67108864u}/* 1F3C2 */, /*27674*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,40028u,138442752u,67108864u}/* 1F3C3 */, /*27675*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,40036u,138442752u,67108864u}/* 1F3C4 */, /*27676*/{0,2107u,65537u,103295003u,8u,1610617120u,40044u,138442752u,67108864u}/* 1F3C5 */, /*27677*/{0,2107u,65537u,103163931u,8u,1610617120u,40052u,138442752u,67108864u}/* 1F3C6 */, /*27678*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,40060u,138442752u,67108864u}/* 1F3C7 */, /*27679*/{0,2107u,65537u,103163931u,8u,1610617120u,40068u,138442752u,67108864u}/* 1F3C8 */, /*27680*/{0,2107u,65537u,103163931u,8u,1610617120u,40076u,138442752u,67108864u}/* 1F3C9 */, /*27681*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,40084u,138442752u,67108864u}/* 1F3CA */, /*27682*/{0,2104u,65537u,104343579u,1747058696u,1610617376u,40092u,138442752u,67108864u}/* 1F3CB */, /*27683*/{0,2104u,65537u,104343579u,1747058696u,1610617376u,40100u,138442752u,67108864u}/* 1F3CC */, /*27684*/{0,2104u,65537u,103295003u,8u,1610616864u,40108u,138442752u,67108864u}/* 1F3CD */, /*27685*/{0,2104u,65537u,103295003u,8u,1610616864u,40116u,138442752u,67108864u}/* 1F3CE */, /*27686*/{0,2107u,65537u,103327771u,8u,1610617120u,40124u,138442752u,67108864u}/* 1F3CF */, /*27687*/{0,2107u,65537u,103327771u,8u,1610617120u,40132u,138442752u,67108864u}/* 1F3D0 */, /*27688*/{0,2107u,65537u,103327771u,8u,1610617120u,40140u,138442752u,67108864u}/* 1F3D1 */, /*27689*/{0,2107u,65537u,103327771u,8u,1610617120u,40148u,138442752u,67108864u}/* 1F3D2 */, /*27690*/{0,2107u,65537u,103327771u,8u,1610617120u,40156u,138442752u,67108864u}/* 1F3D3 */, /*27691*/{0,2104u,65537u,103295003u,8u,1610616864u,40164u,138442752u,67108864u}/* 1F3D4 */, /*27692*/{0,2104u,65537u,103295003u,8u,1610616864u,40172u,138442752u,67108864u}/* 1F3D5 */, /*27693*/{0,2104u,65537u,103295003u,8u,1610616864u,40180u,138442752u,67108864u}/* 1F3D6 */, /*27694*/{0,2104u,65537u,103295003u,8u,1610616864u,40188u,138442752u,67108864u}/* 1F3D7 */, /*27695*/{0,2104u,65537u,103295003u,8u,1610616864u,40196u,138442752u,67108864u}/* 1F3D8 */, /*27696*/{0,2104u,65537u,103295003u,8u,1610616864u,40204u,138442752u,67108864u}/* 1F3D9 */, /*27697*/{0,2104u,65537u,103295003u,8u,1610616864u,40212u,138442752u,67108864u}/* 1F3DA */, /*27698*/{0,2104u,65537u,103295003u,8u,1610616864u,40220u,138442752u,67108864u}/* 1F3DB */, /*27699*/{0,2104u,65537u,103295003u,8u,1610616864u,40228u,138442752u,67108864u}/* 1F3DC */, /*27700*/{0,2104u,65537u,103295003u,8u,1610616864u,40236u,138442752u,67108864u}/* 1F3DD */, /*27701*/{0,2104u,65537u,103295003u,8u,1610616864u,40244u,138442752u,67108864u}/* 1F3DE */, /*27702*/{0,2104u,65537u,103295003u,8u,1610616864u,40252u,138442752u,67108864u}/* 1F3DF */, /*27703*/{0,2107u,65537u,103163931u,8u,1610617120u,40260u,138442752u,67108864u}/* 1F3E0 */, /*27704*/{0,2107u,65537u,103163931u,8u,1610617120u,40268u,138442752u,67108864u}/* 1F3E1 */, /*27705*/{0,2107u,65537u,103163931u,8u,1610617120u,40276u,138442752u,67108864u}/* 1F3E2 */, /*27706*/{0,2107u,65537u,103163931u,8u,1610617120u,40284u,138442752u,67108864u}/* 1F3E3 */, /*27707*/{0,2107u,65537u,103163931u,8u,1610617120u,40292u,138442752u,67108864u}/* 1F3E4 */, /*27708*/{0,2107u,65537u,103163931u,8u,1610617120u,40300u,138442752u,67108864u}/* 1F3E5 */, /*27709*/{0,2107u,65537u,103163931u,8u,1610617120u,40308u,138442752u,67108864u}/* 1F3E6 */, /*27710*/{0,2107u,65537u,103163931u,8u,1610617120u,40316u,138442752u,67108864u}/* 1F3E7 */, /*27711*/{0,2107u,65537u,103163931u,8u,1610617120u,40324u,138442752u,67108864u}/* 1F3E8 */, /*27712*/{0,2107u,65537u,103163931u,8u,1610617120u,40332u,138442752u,67108864u}/* 1F3E9 */, /*27713*/{0,2107u,65537u,103163931u,8u,1610617120u,40340u,138442752u,67108864u}/* 1F3EA */, /*27714*/{0,2107u,65537u,103163931u,2150105096u,1610617120u,40348u,138442752u,67108864u}/* 1F3EB */, /*27715*/{0,2107u,65537u,103163931u,8u,1610617120u,40356u,138442752u,67108864u}/* 1F3EC */, /*27716*/{0,2107u,65537u,103163931u,2150105096u,1610617120u,40364u,138442752u,67108864u}/* 1F3ED */, /*27717*/{0,2107u,65537u,103163931u,8u,1610617120u,40372u,138442752u,67108864u}/* 1F3EE */, /*27718*/{0,2107u,65537u,103163931u,8u,1610617120u,40380u,138442752u,67108864u}/* 1F3EF */, /*27719*/{0,2107u,65537u,103163931u,8u,1610617120u,40388u,138442752u,67108864u}/* 1F3F0 */, /*27720*/{0,2104u,65537u,103295003u,40u,1610612768u,40396u,138442752u,67108864u}/* 1F3F1 */, /*27721*/{0,2104u,65537u,103295003u,40u,1610612768u,40404u,138442752u,67108864u}/* 1F3F2 */, /*27722*/{0,2104u,65537u,103295003u,8u,1610616864u,40412u,138442752u,67108864u}/* 1F3F3 */, /*27723*/{0,2107u,65537u,103295003u,8u,1610617120u,40420u,138442752u,67108864u}/* 1F3F4 */, /*27724*/{0,2104u,65537u,103295003u,8u,1610616864u,40428u,138442752u,67108864u}/* 1F3F5 */, /*27725*/{0,2104u,65537u,103295003u,40u,1610612768u,40436u,138442752u,67108864u}/* 1F3F6 */, /*27726*/{0,2104u,65537u,103295003u,8u,1610616864u,40444u,138442752u,67108864u}/* 1F3F7 */, /*27727*/{0,2107u,65537u,103327771u,8u,1610617120u,40452u,138442752u,67108864u}/* 1F3F8 */, /*27728*/{0,2107u,65537u,103327771u,8u,1610617120u,40460u,138442752u,67108864u}/* 1F3F9 */, /*27729*/{0,2107u,65537u,103327771u,8u,1610617120u,40468u,138442752u,67108864u}/* 1F3FA */, /*27730*/{0,2107u,65537u,111716378u,1881407496u,1627397408u,40476u,138442752u,67108864u}/* 1F3FB */, /*27731*/{0,2107u,65537u,111716378u,1881407496u,1627397408u,40484u,138442752u,67108864u}/* 1F3FC */, /*27732*/{0,2107u,65537u,111716378u,1881407496u,1627397408u,40492u,138442752u,67108864u}/* 1F3FD */, /*27733*/{0,2107u,65537u,111716378u,1881407496u,1627397408u,40500u,138442752u,67108864u}/* 1F3FE */, /*27734*/{0,2107u,65537u,111716378u,1881407496u,1627397408u,40508u,138442752u,67108864u}/* 1F3FF */, /*27735*/{0,2107u,65537u,103163931u,8u,1610617120u,40516u,138442752u,67108864u}/* 1F400 */, /*27736*/{0,2107u,65537u,103163931u,8u,1610617120u,40524u,138442752u,67108864u}/* 1F401 */, /*27737*/{0,2107u,65537u,103163931u,8u,1610617120u,40532u,138442752u,67108864u}/* 1F402 */, /*27738*/{0,2107u,65537u,103163931u,8u,1610617120u,40540u,138442752u,67108864u}/* 1F403 */, /*27739*/{0,2107u,65537u,103163931u,8u,1610617120u,40548u,138442752u,67108864u}/* 1F404 */, /*27740*/{0,2107u,65537u,103163931u,8u,1610617120u,40556u,138442752u,67108864u}/* 1F405 */, /*27741*/{0,2107u,65537u,103163931u,8u,1610617120u,40564u,138442752u,67108864u}/* 1F406 */, /*27742*/{0,2107u,65537u,103163931u,8u,1610617120u,40572u,138442752u,67108864u}/* 1F407 */, /*27743*/{0,2107u,65537u,103163931u,8u,1610617120u,40580u,138442752u,67108864u}/* 1F408 */, /*27744*/{0,2107u,65537u,103163931u,8u,1610617120u,40588u,138442752u,67108864u}/* 1F409 */, /*27745*/{0,2107u,65537u,103163931u,8u,1610617120u,40596u,138442752u,67108864u}/* 1F40A */, /*27746*/{0,2107u,65537u,103163931u,8u,1610617120u,40604u,138442752u,67108864u}/* 1F40B */, /*27747*/{0,2107u,65537u,103163931u,8u,1610617120u,40612u,138442752u,67108864u}/* 1F40C */, /*27748*/{0,2107u,65537u,103163931u,8u,1610617120u,40620u,138442752u,67108864u}/* 1F40D */, /*27749*/{0,2107u,65537u,103163931u,8u,1610617120u,40628u,138442752u,67108864u}/* 1F40E */, /*27750*/{0,2107u,65537u,103163931u,8u,1610617120u,40636u,138442752u,67108864u}/* 1F40F */, /*27751*/{0,2107u,65537u,103163931u,8u,1610617120u,40644u,138442752u,67108864u}/* 1F410 */, /*27752*/{0,2107u,65537u,103163931u,8u,1610617120u,40652u,138442752u,67108864u}/* 1F411 */, /*27753*/{0,2107u,65537u,103163931u,8u,1610617120u,40660u,138442752u,67108864u}/* 1F412 */, /*27754*/{0,2107u,65537u,103163931u,8u,1610617120u,40668u,138442752u,67108864u}/* 1F413 */, /*27755*/{0,2107u,65537u,103163931u,8u,1610617120u,40676u,138442752u,67108864u}/* 1F414 */, /*27756*/{0,2107u,65537u,103163931u,8u,1610617120u,40684u,138442752u,67108864u}/* 1F415 */, /*27757*/{0,2107u,65537u,103163931u,8u,1610617120u,40692u,138442752u,67108864u}/* 1F416 */, /*27758*/{0,2107u,65537u,103163931u,8u,1610617120u,40700u,138442752u,67108864u}/* 1F417 */, /*27759*/{0,2107u,65537u,103163931u,8u,1610617120u,40708u,138442752u,67108864u}/* 1F418 */, /*27760*/{0,2107u,65537u,103163931u,8u,1610617120u,40716u,138442752u,67108864u}/* 1F419 */, /*27761*/{0,2107u,65537u,103163931u,8u,1610617120u,40724u,138442752u,67108864u}/* 1F41A */, /*27762*/{0,2107u,65537u,103163931u,8u,1610617120u,40732u,138442752u,67108864u}/* 1F41B */, /*27763*/{0,2107u,65537u,103163931u,8u,1610617120u,40740u,138442752u,67108864u}/* 1F41C */, /*27764*/{0,2107u,65537u,103163931u,8u,1610617120u,40748u,138442752u,67108864u}/* 1F41D */, /*27765*/{0,2107u,65537u,103163931u,8u,1610617120u,40756u,138442752u,67108864u}/* 1F41E */, /*27766*/{0,2107u,65537u,103163931u,8u,1610617120u,40764u,138442752u,67108864u}/* 1F41F */, /*27767*/{0,2107u,65537u,103163931u,8u,1610617120u,40772u,138442752u,67108864u}/* 1F420 */, /*27768*/{0,2107u,65537u,103163931u,8u,1610617120u,40780u,138442752u,67108864u}/* 1F421 */, /*27769*/{0,2107u,65537u,103163931u,8u,1610617120u,40788u,138442752u,67108864u}/* 1F422 */, /*27770*/{0,2107u,65537u,103163931u,8u,1610617120u,40796u,138442752u,67108864u}/* 1F423 */, /*27771*/{0,2107u,65537u,103163931u,8u,1610617120u,40804u,138442752u,67108864u}/* 1F424 */, /*27772*/{0,2107u,65537u,103163931u,8u,1610617120u,40812u,138442752u,67108864u}/* 1F425 */, /*27773*/{0,2107u,65537u,103163931u,8u,1610617120u,40820u,138442752u,67108864u}/* 1F426 */, /*27774*/{0,2107u,65537u,103163931u,8u,1610617120u,40828u,138442752u,67108864u}/* 1F427 */, /*27775*/{0,2107u,65537u,103163931u,8u,1610617120u,40836u,138442752u,67108864u}/* 1F428 */, /*27776*/{0,2107u,65537u,103163931u,8u,1610617120u,40844u,138442752u,67108864u}/* 1F429 */, /*27777*/{0,2107u,65537u,103163931u,8u,1610617120u,40852u,138442752u,67108864u}/* 1F42A */, /*27778*/{0,2107u,65537u,103163931u,8u,1610617120u,40860u,138442752u,67108864u}/* 1F42B */, /*27779*/{0,2107u,65537u,103163931u,8u,1610617120u,40868u,138442752u,67108864u}/* 1F42C */, /*27780*/{0,2107u,65537u,103163931u,8u,1610617120u,40876u,138442752u,67108864u}/* 1F42D */, /*27781*/{0,2107u,65537u,103163931u,8u,1610617120u,40884u,138442752u,67108864u}/* 1F42E */, /*27782*/{0,2107u,65537u,103163931u,8u,1610617120u,40892u,138442752u,67108864u}/* 1F42F */, /*27783*/{0,2107u,65537u,103163931u,8u,1610617120u,40900u,138442752u,67108864u}/* 1F430 */, /*27784*/{0,2107u,65537u,103163931u,8u,1610617120u,40908u,138442752u,67108864u}/* 1F431 */, /*27785*/{0,2107u,65537u,103163931u,8u,1610617120u,40916u,138442752u,67108864u}/* 1F432 */, /*27786*/{0,2107u,65537u,103163931u,8u,1610617120u,40924u,138442752u,67108864u}/* 1F433 */, /*27787*/{0,2107u,65537u,103163931u,8u,1610617120u,40932u,138442752u,67108864u}/* 1F434 */, /*27788*/{0,2107u,65537u,103163931u,8u,1610617120u,40940u,138442752u,67108864u}/* 1F435 */, /*27789*/{0,2107u,65537u,103163931u,8u,1610617120u,40948u,138442752u,67108864u}/* 1F436 */, /*27790*/{0,2107u,65537u,103163931u,8u,1610617120u,40956u,138442752u,67108864u}/* 1F437 */, /*27791*/{0,2107u,65537u,103163931u,8u,1610617120u,40964u,138442752u,67108864u}/* 1F438 */, /*27792*/{0,2107u,65537u,103163931u,8u,1610617120u,40972u,138442752u,67108864u}/* 1F439 */, /*27793*/{0,2107u,65537u,103163931u,8u,1610617120u,40980u,138442752u,67108864u}/* 1F43A */, /*27794*/{0,2107u,65537u,103163931u,8u,1610617120u,40988u,138442752u,67108864u}/* 1F43B */, /*27795*/{0,2107u,65537u,103163931u,8u,1610617120u,40996u,138442752u,67108864u}/* 1F43C */, /*27796*/{0,2107u,65537u,103163931u,8u,1610617120u,41004u,138442752u,67108864u}/* 1F43D */, /*27797*/{0,2107u,65537u,103163931u,8u,1610617120u,41012u,138442752u,67108864u}/* 1F43E */, /*27798*/{0,2104u,65537u,103295003u,8u,1610616864u,41020u,138442752u,67108864u}/* 1F43F */, /*27799*/{0,2107u,65537u,103163931u,8u,1610617120u,41028u,138442752u,67108864u}/* 1F440 */, /*27800*/{0,2104u,65537u,103295003u,8u,1610616864u,41036u,138442752u,67108864u}/* 1F441 */, /*27801*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,41044u,138442752u,67108864u}/* 1F442 */, /*27802*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,41052u,138442752u,67108864u}/* 1F443 */, /*27803*/{0,2107u,65537u,103163931u,8u,1610617120u,41060u,138442752u,67108864u}/* 1F444 */, /*27804*/{0,2107u,65537u,103163931u,8u,1610617120u,41068u,138442752u,67108864u}/* 1F445 */, /*27805*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,41076u,138442752u,67108864u}/* 1F446 */, /*27806*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,41084u,138442752u,67108864u}/* 1F447 */, /*27807*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,41092u,138442752u,67108864u}/* 1F448 */, /*27808*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,41100u,138442752u,67108864u}/* 1F449 */, /*27809*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,41108u,138442752u,67108864u}/* 1F44A */, /*27810*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,41116u,138442752u,67108864u}/* 1F44B */, /*27811*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,41124u,138442752u,67108864u}/* 1F44C */, /*27812*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,41132u,138442752u,67108864u}/* 1F44D */, /*27813*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,41140u,138442752u,67108864u}/* 1F44E */, /*27814*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,41148u,138442752u,67108864u}/* 1F44F */, /*27815*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,41156u,138442752u,67108864u}/* 1F450 */, /*27816*/{0,2107u,65537u,103163931u,8u,1610617120u,41164u,138442752u,67108864u}/* 1F451 */, /*27817*/{0,2107u,65537u,103163931u,8u,1610617120u,41172u,138442752u,67108864u}/* 1F452 */, /*27818*/{0,2107u,65537u,103163931u,8u,1610617120u,41180u,138442752u,67108864u}/* 1F453 */, /*27819*/{0,2107u,65537u,103163931u,8u,1610617120u,41188u,138442752u,67108864u}/* 1F454 */, /*27820*/{0,2107u,65537u,103163931u,8u,1610617120u,41196u,138442752u,67108864u}/* 1F455 */, /*27821*/{0,2107u,65537u,103163931u,8u,1610617120u,41204u,138442752u,67108864u}/* 1F456 */, /*27822*/{0,2107u,65537u,103163931u,8u,1610617120u,41212u,138442752u,67108864u}/* 1F457 */, /*27823*/{0,2107u,65537u,103163931u,8u,1610617120u,41220u,138442752u,67108864u}/* 1F458 */, /*27824*/{0,2107u,65537u,103163931u,8u,1610617120u,41228u,138442752u,67108864u}/* 1F459 */, /*27825*/{0,2107u,65537u,103163931u,8u,1610617120u,41236u,138442752u,67108864u}/* 1F45A */, /*27826*/{0,2107u,65537u,103163931u,8u,1610617120u,41244u,138442752u,67108864u}/* 1F45B */, /*27827*/{0,2107u,65537u,103163931u,8u,1610617120u,41252u,138442752u,67108864u}/* 1F45C */, /*27828*/{0,2107u,65537u,103163931u,8u,1610617120u,41260u,138442752u,67108864u}/* 1F45D */, /*27829*/{0,2107u,65537u,103163931u,8u,1610617120u,41268u,138442752u,67108864u}/* 1F45E */, /*27830*/{0,2107u,65537u,103163931u,8u,1610617120u,41276u,138442752u,67108864u}/* 1F45F */, /*27831*/{0,2107u,65537u,103163931u,8u,1610617120u,41284u,138442752u,67108864u}/* 1F460 */, /*27832*/{0,2107u,65537u,103163931u,8u,1610617120u,41292u,138442752u,67108864u}/* 1F461 */, /*27833*/{0,2107u,65537u,103163931u,8u,1610617120u,41300u,138442752u,67108864u}/* 1F462 */, /*27834*/{0,2107u,65537u,103163931u,8u,1610617120u,41308u,138442752u,67108864u}/* 1F463 */, /*27835*/{0,2107u,65537u,103163931u,8u,1610617120u,41316u,138442752u,67108864u}/* 1F464 */, /*27836*/{0,2107u,65537u,103163931u,8u,1610617120u,41324u,138442752u,67108864u}/* 1F465 */, /*27837*/{0,2107u,65537u,104212507u,2284453896u,1610617632u,41332u,138442752u,67108864u}/* 1F466 */, /*27838*/{0,2107u,65537u,104212507u,2284453896u,1610617632u,41340u,138442752u,67108864u}/* 1F467 */, /*27839*/{0,2107u,65537u,104212507u,2284453896u,1610617632u,41348u,138442752u,67108864u}/* 1F468 */, /*27840*/{0,2107u,65537u,104212507u,2284453896u,1610617632u,41356u,138442752u,67108864u}/* 1F469 */, /*27841*/{0,2107u,65537u,103163931u,8u,1610617120u,41364u,138442752u,67108864u}/* 1F46A */, /*27842*/{0,2107u,65537u,103163931u,8u,1610617120u,41372u,138442752u,67108864u}/* 1F46B */, /*27843*/{0,2107u,65537u,103163931u,8u,1610617120u,41380u,138442752u,67108864u}/* 1F46C */, /*27844*/{0,2107u,65537u,103163931u,8u,1610617120u,41388u,138442752u,67108864u}/* 1F46D */, /*27845*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,41396u,138442752u,67108864u}/* 1F46E */, /*27846*/{0,2107u,65537u,103163931u,8u,1610617120u,41404u,138442752u,67108864u}/* 1F46F */, /*27847*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,41412u,138442752u,67108864u}/* 1F470 */, /*27848*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,41420u,138442752u,67108864u}/* 1F471 */, /*27849*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,41428u,138442752u,67108864u}/* 1F472 */, /*27850*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,41436u,138442752u,67108864u}/* 1F473 */, /*27851*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,41444u,138442752u,67108864u}/* 1F474 */, /*27852*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,41452u,138442752u,67108864u}/* 1F475 */, /*27853*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,41460u,138442752u,67108864u}/* 1F476 */, /*27854*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,41468u,138442752u,67108864u}/* 1F477 */, /*27855*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,41476u,138442752u,67108864u}/* 1F478 */, /*27856*/{0,2107u,65537u,103163931u,8u,1610617120u,41484u,138442752u,67108864u}/* 1F479 */, /*27857*/{0,2107u,65537u,103163931u,8u,1610617120u,41492u,138442752u,67108864u}/* 1F47A */, /*27858*/{0,2107u,65537u,103163931u,8u,1610617120u,41500u,138442752u,67108864u}/* 1F47B */, /*27859*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,41508u,138442752u,67108864u}/* 1F47C */, /*27860*/{0,2107u,65537u,103163931u,8u,1610617120u,41516u,138442752u,67108864u}/* 1F47D */, /*27861*/{0,2107u,65537u,103163931u,8u,1610617120u,41524u,138442752u,67108864u}/* 1F47E */, /*27862*/{0,2107u,65537u,103163931u,8u,1610617120u,41532u,138442752u,67108864u}/* 1F47F */, /*27863*/{0,2107u,65537u,103163931u,8u,1610617120u,41540u,138442752u,67108864u}/* 1F480 */, /*27864*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,41548u,138442752u,67108864u}/* 1F481 */, /*27865*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,41556u,138442752u,67108864u}/* 1F482 */, /*27866*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,41564u,138442752u,67108864u}/* 1F483 */, /*27867*/{0,2107u,65537u,103163931u,8u,1610617120u,41572u,138442752u,67108864u}/* 1F484 */, /*27868*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,41580u,138442752u,67108864u}/* 1F485 */, /*27869*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,41588u,138442752u,67108864u}/* 1F486 */, /*27870*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,41596u,138442752u,67108864u}/* 1F487 */, /*27871*/{0,2107u,65537u,103163931u,8u,1610617120u,41604u,138442752u,67108864u}/* 1F488 */, /*27872*/{0,2107u,65537u,103163931u,8u,1610617120u,41612u,138442752u,67108864u}/* 1F489 */, /*27873*/{0,2107u,65537u,103163931u,8u,1610617120u,41620u,138442752u,67108864u}/* 1F48A */, /*27874*/{0,2107u,65537u,103163931u,2150105096u,1610617120u,41628u,138442752u,67108864u}/* 1F48B */, /*27875*/{0,2107u,65537u,103163931u,8u,1610617120u,41636u,138442752u,67108864u}/* 1F48C */, /*27876*/{0,2107u,65537u,103163931u,8u,1610617120u,41644u,138442752u,67108864u}/* 1F48D */, /*27877*/{0,2107u,65537u,103163931u,8u,1610617120u,41652u,138442752u,67108864u}/* 1F48E */, /*27878*/{0,2107u,65537u,103163931u,8u,1610617120u,41660u,138442752u,67108864u}/* 1F48F */, /*27879*/{0,2107u,65537u,103163931u,8u,1610617120u,41668u,138442752u,67108864u}/* 1F490 */, /*27880*/{0,2107u,65537u,103163931u,8u,1610617120u,41676u,138442752u,67108864u}/* 1F491 */, /*27881*/{0,2107u,65537u,103163931u,8u,1610617120u,41684u,138442752u,67108864u}/* 1F492 */, /*27882*/{0,2107u,65537u,103163931u,8u,1610617120u,41692u,138442752u,67108864u}/* 1F493 */, /*27883*/{0,2107u,65537u,103163931u,8u,1610617120u,41700u,138442752u,67108864u}/* 1F494 */, /*27884*/{0,2107u,65537u,103163931u,8u,1610617120u,41708u,138442752u,67108864u}/* 1F495 */, /*27885*/{0,2107u,65537u,103163931u,8u,1610617120u,41716u,138442752u,67108864u}/* 1F496 */, /*27886*/{0,2107u,65537u,103163931u,8u,1610617120u,41724u,138442752u,67108864u}/* 1F497 */, /*27887*/{0,2107u,65537u,103163931u,8u,1610617120u,41732u,138442752u,67108864u}/* 1F498 */, /*27888*/{0,2107u,65537u,103163931u,8u,1610617120u,41740u,138442752u,67108864u}/* 1F499 */, /*27889*/{0,2107u,65537u,103163931u,8u,1610617120u,41748u,138442752u,67108864u}/* 1F49A */, /*27890*/{0,2107u,65537u,103163931u,8u,1610617120u,41756u,138442752u,67108864u}/* 1F49B */, /*27891*/{0,2107u,65537u,103163931u,8u,1610617120u,41764u,138442752u,67108864u}/* 1F49C */, /*27892*/{0,2107u,65537u,103163931u,8u,1610617120u,41772u,138442752u,67108864u}/* 1F49D */, /*27893*/{0,2107u,65537u,103163931u,8u,1610617120u,41780u,138442752u,67108864u}/* 1F49E */, /*27894*/{0,2107u,65537u,103163931u,8u,1610617120u,41788u,138442752u,67108864u}/* 1F49F */, /*27895*/{0,2107u,65537u,76949531u,8u,1610617120u,41796u,138442752u,67108864u}/* 1F4A0 */, /*27896*/{0,2107u,65537u,103163931u,8u,1610617120u,41804u,138442752u,67108864u}/* 1F4A1 */, /*27897*/{0,2107u,65537u,76949531u,8u,1610617120u,41812u,138442752u,67108864u}/* 1F4A2 */, /*27898*/{0,2107u,65537u,103163931u,8u,1610617120u,41820u,138442752u,67108864u}/* 1F4A3 */, /*27899*/{0,2107u,65537u,76949531u,8u,1610617120u,41828u,138442752u,67108864u}/* 1F4A4 */, /*27900*/{0,2107u,65537u,103163931u,8u,1610617120u,41836u,138442752u,67108864u}/* 1F4A5 */, /*27901*/{0,2107u,65537u,103163931u,8u,1610617120u,41844u,138442752u,67108864u}/* 1F4A6 */, /*27902*/{0,2107u,65537u,103163931u,8u,1610617120u,41852u,138442752u,67108864u}/* 1F4A7 */, /*27903*/{0,2107u,65537u,103163931u,8u,1610617120u,41860u,138442752u,67108864u}/* 1F4A8 */, /*27904*/{0,2107u,65537u,103163931u,8u,1610617120u,41868u,138442752u,67108864u}/* 1F4A9 */, /*27905*/{0,2107u,65537u,104212507u,1747058696u,1610617632u,41876u,138442752u,67108864u}/* 1F4AA */, /*27906*/{0,2107u,65537u,103163931u,8u,1610617120u,41884u,138442752u,67108864u}/* 1F4AB */, /*27907*/{0,2107u,65537u,103163931u,8u,1610617120u,41892u,138442752u,67108864u}/* 1F4AC */, /*27908*/{0,2107u,65537u,103163931u,8u,1610617120u,41900u,138442752u,67108864u}/* 1F4AD */, /*27909*/{0,2107u,65537u,103163931u,8u,1610617120u,41908u,138442752u,67108864u}/* 1F4AE */, /*27910*/{0,2107u,65537u,76949531u,8u,1610617120u,41916u,138442752u,67108864u}/* 1F4AF */, /*27911*/{0,2107u,65537u,103163931u,8u,1610617120u,41924u,138442752u,67108864u}/* 1F4B0 */, /*27912*/{0,2107u,65537u,76949531u,8u,1610617120u,41932u,138442752u,67108864u}/* 1F4B1 */, /*27913*/{0,2107u,65537u,76949531u,8u,1610617120u,41940u,138442752u,67108864u}/* 1F4B2 */, /*27914*/{0,2107u,65537u,103163931u,8u,1610617120u,41948u,138442752u,67108864u}/* 1F4B3 */, /*27915*/{0,2107u,65537u,103163931u,8u,1610617120u,41956u,138442752u,67108864u}/* 1F4B4 */, /*27916*/{0,2107u,65537u,103163931u,8u,1610617120u,41964u,138442752u,67108864u}/* 1F4B5 */, /*27917*/{0,2107u,65537u,103163931u,8u,1610617120u,41972u,138442752u,67108864u}/* 1F4B6 */, /*27918*/{0,2107u,65537u,103163931u,8u,1610617120u,41980u,138442752u,67108864u}/* 1F4B7 */, /*27919*/{0,2107u,65537u,103163931u,8u,1610617120u,41988u,138442752u,67108864u}/* 1F4B8 */, /*27920*/{0,2107u,65537u,103163931u,8u,1610617120u,41996u,138442752u,67108864u}/* 1F4B9 */, /*27921*/{0,2107u,65537u,103163931u,8u,1610617120u,42004u,138442752u,67108864u}/* 1F4BA */, /*27922*/{0,2107u,65537u,103163931u,2150105096u,1610617120u,42012u,138442752u,67108864u}/* 1F4BB */, /*27923*/{0,2107u,65537u,103163931u,2150105096u,1610617120u,42020u,138442752u,67108864u}/* 1F4BC */, /*27924*/{0,2107u,65537u,103163931u,8u,1610617120u,42028u,138442752u,67108864u}/* 1F4BD */, /*27925*/{0,2107u,65537u,103163931u,8u,1610617120u,42036u,138442752u,67108864u}/* 1F4BE */, /*27926*/{0,2107u,65537u,103163931u,8u,1610617120u,42044u,138442752u,67108864u}/* 1F4BF */, /*27927*/{0,2107u,65537u,103163931u,8u,1610617120u,42052u,138442752u,67108864u}/* 1F4C0 */, /*27928*/{0,2107u,65537u,103163931u,8u,1610617120u,42060u,138442752u,67108864u}/* 1F4C1 */, /*27929*/{0,2107u,65537u,103163931u,8u,1610617120u,42068u,138442752u,67108864u}/* 1F4C2 */, /*27930*/{0,2107u,65537u,103163931u,8u,1610617120u,42076u,138442752u,67108864u}/* 1F4C3 */, /*27931*/{0,2107u,65537u,103163931u,8u,1610617120u,42084u,138442752u,67108864u}/* 1F4C4 */, /*27932*/{0,2107u,65537u,103163931u,8u,1610617120u,42092u,138442752u,67108864u}/* 1F4C5 */, /*27933*/{0,2107u,65537u,103163931u,8u,1610617120u,42100u,138442752u,67108864u}/* 1F4C6 */, /*27934*/{0,2107u,65537u,103163931u,8u,1610617120u,42108u,138442752u,67108864u}/* 1F4C7 */, /*27935*/{0,2107u,65537u,103163931u,8u,1610617120u,42116u,138442752u,67108864u}/* 1F4C8 */, /*27936*/{0,2107u,65537u,103163931u,8u,1610617120u,42124u,138442752u,67108864u}/* 1F4C9 */, /*27937*/{0,2107u,65537u,103163931u,8u,1610617120u,42132u,138442752u,67108864u}/* 1F4CA */, /*27938*/{0,2107u,65537u,103163931u,8u,1610617120u,42140u,138442752u,67108864u}/* 1F4CB */, /*27939*/{0,2107u,65537u,103163931u,8u,1610617120u,42148u,138442752u,67108864u}/* 1F4CC */, /*27940*/{0,2107u,65537u,103163931u,8u,1610617120u,42156u,138442752u,67108864u}/* 1F4CD */, /*27941*/{0,2107u,65537u,103163931u,8u,1610617120u,42164u,138442752u,67108864u}/* 1F4CE */, /*27942*/{0,2107u,65537u,103163931u,8u,1610617120u,42172u,138442752u,67108864u}/* 1F4CF */, /*27943*/{0,2107u,65537u,103163931u,8u,1610617120u,42180u,138442752u,67108864u}/* 1F4D0 */, /*27944*/{0,2107u,65537u,103163931u,8u,1610617120u,42188u,138442752u,67108864u}/* 1F4D1 */, /*27945*/{0,2107u,65537u,103163931u,8u,1610617120u,42196u,138442752u,67108864u}/* 1F4D2 */, /*27946*/{0,2107u,65537u,103163931u,8u,1610617120u,42204u,138442752u,67108864u}/* 1F4D3 */, /*27947*/{0,2107u,65537u,103163931u,8u,1610617120u,42212u,138442752u,67108864u}/* 1F4D4 */, /*27948*/{0,2107u,65537u,103163931u,8u,1610617120u,42220u,138442752u,67108864u}/* 1F4D5 */, /*27949*/{0,2107u,65537u,103163931u,8u,1610617120u,42228u,138442752u,67108864u}/* 1F4D6 */, /*27950*/{0,2107u,65537u,103163931u,8u,1610617120u,42236u,138442752u,67108864u}/* 1F4D7 */, /*27951*/{0,2107u,65537u,103163931u,8u,1610617120u,42244u,138442752u,67108864u}/* 1F4D8 */, /*27952*/{0,2107u,65537u,103163931u,8u,1610617120u,42252u,138442752u,67108864u}/* 1F4D9 */, /*27953*/{0,2107u,65537u,103163931u,8u,1610617120u,42260u,138442752u,67108864u}/* 1F4DA */, /*27954*/{0,2107u,65537u,103163931u,8u,1610617120u,42268u,138442752u,67108864u}/* 1F4DB */, /*27955*/{0,2107u,65537u,103163931u,8u,1610617120u,42276u,138442752u,67108864u}/* 1F4DC */, /*27956*/{0,2107u,65537u,103163931u,8u,1610617120u,42284u,138442752u,67108864u}/* 1F4DD */, /*27957*/{0,2107u,65537u,103163931u,8u,1610617120u,42292u,138442752u,67108864u}/* 1F4DE */, /*27958*/{0,2107u,65537u,103163931u,8u,1610617120u,42300u,138442752u,67108864u}/* 1F4DF */, /*27959*/{0,2107u,65537u,103163931u,8u,1610617120u,42308u,138442752u,67108864u}/* 1F4E0 */, /*27960*/{0,2107u,65537u,103163931u,8u,1610617120u,42316u,138442752u,67108864u}/* 1F4E1 */, /*27961*/{0,2107u,65537u,103163931u,8u,1610617120u,42324u,138442752u,67108864u}/* 1F4E2 */, /*27962*/{0,2107u,65537u,103163931u,8u,1610617120u,42332u,138442752u,67108864u}/* 1F4E3 */, /*27963*/{0,2107u,65537u,103163931u,8u,1610617120u,42340u,138442752u,67108864u}/* 1F4E4 */, /*27964*/{0,2107u,65537u,103163931u,8u,1610617120u,42348u,138442752u,67108864u}/* 1F4E5 */, /*27965*/{0,2107u,65537u,103163931u,8u,1610617120u,42356u,138442752u,67108864u}/* 1F4E6 */, /*27966*/{0,2107u,65537u,103163931u,8u,1610617120u,42364u,138442752u,67108864u}/* 1F4E7 */, /*27967*/{0,2107u,65537u,103163931u,8u,1610617120u,42372u,138442752u,67108864u}/* 1F4E8 */, /*27968*/{0,2107u,65537u,103163931u,8u,1610617120u,42380u,138442752u,67108864u}/* 1F4E9 */, /*27969*/{0,2107u,65537u,103163931u,8u,1610617120u,42388u,138442752u,67108864u}/* 1F4EA */, /*27970*/{0,2107u,65537u,103163931u,8u,1610617120u,42396u,138442752u,67108864u}/* 1F4EB */, /*27971*/{0,2107u,65537u,103163931u,8u,1610617120u,42404u,138442752u,67108864u}/* 1F4EC */, /*27972*/{0,2107u,65537u,103163931u,8u,1610617120u,42412u,138442752u,67108864u}/* 1F4ED */, /*27973*/{0,2107u,65537u,103163931u,8u,1610617120u,42420u,138442752u,67108864u}/* 1F4EE */, /*27974*/{0,2107u,65537u,103163931u,8u,1610617120u,42428u,138442752u,67108864u}/* 1F4EF */, /*27975*/{0,2107u,65537u,103163931u,8u,1610617120u,42436u,138442752u,67108864u}/* 1F4F0 */, /*27976*/{0,2107u,65537u,103163931u,8u,1610617120u,42444u,138442752u,67108864u}/* 1F4F1 */, /*27977*/{0,2107u,65537u,103163931u,8u,1610617120u,42452u,138442752u,67108864u}/* 1F4F2 */, /*27978*/{0,2107u,65537u,103163931u,8u,1610617120u,42460u,138442752u,67108864u}/* 1F4F3 */, /*27979*/{0,2107u,65537u,103163931u,8u,1610617120u,42468u,138442752u,67108864u}/* 1F4F4 */, /*27980*/{0,2107u,65537u,103163931u,8u,1610617120u,42476u,138442752u,67108864u}/* 1F4F5 */, /*27981*/{0,2107u,65537u,103163931u,8u,1610617120u,42484u,138442752u,67108864u}/* 1F4F6 */, /*27982*/{0,2107u,65537u,103163931u,8u,1610617120u,42492u,138442752u,67108864u}/* 1F4F7 */, /*27983*/{0,2107u,65537u,103295003u,8u,1610617120u,42500u,138442752u,67108864u}/* 1F4F8 */, /*27984*/{0,2107u,65537u,103163931u,8u,1610617120u,42508u,138442752u,67108864u}/* 1F4F9 */, /*27985*/{0,2107u,65537u,103163931u,8u,1610617120u,42516u,138442752u,67108864u}/* 1F4FA */, /*27986*/{0,2107u,65537u,103163931u,8u,1610617120u,42524u,138442752u,67108864u}/* 1F4FB */, /*27987*/{0,2107u,65537u,103163931u,8u,1610617120u,42532u,138442752u,67108864u}/* 1F4FC */, /*27988*/{0,2104u,65537u,103295003u,8u,1610616864u,42540u,138442752u,67108864u}/* 1F4FD */, /*27989*/{0,2104u,65537u,103295003u,40u,1610612768u,42548u,138442752u,67108864u}/* 1F4FE */, /*27990*/{0,2107u,65537u,103327771u,8u,1610617120u,42556u,138442752u,67108864u}/* 1F4FF */, /*27991*/{0,2107u,65537u,76949531u,8u,1610617120u,42564u,138442752u,67108864u}/* 1F500 */, /*27992*/{0,2107u,65537u,76949531u,8u,1610617120u,42572u,138442752u,67108864u}/* 1F501 */, /*27993*/{0,2107u,65537u,76949531u,8u,1610617120u,42580u,138442752u,67108864u}/* 1F502 */, /*27994*/{0,2107u,65537u,76949531u,8u,1610617120u,42588u,138442752u,67108864u}/* 1F503 */, /*27995*/{0,2107u,65537u,76949531u,8u,1610617120u,42596u,138442752u,67108864u}/* 1F504 */, /*27996*/{0,2107u,65537u,76949531u,8u,1610617120u,42604u,138442752u,67108864u}/* 1F505 */, /*27997*/{0,2107u,65537u,76949531u,8u,1610617120u,42612u,138442752u,67108864u}/* 1F506 */, /*27998*/{0,2107u,65537u,103163931u,8u,1610617120u,42620u,138442752u,67108864u}/* 1F507 */, /*27999*/{0,2107u,65537u,103163931u,8u,1610617120u,42628u,138442752u,67108864u}/* 1F508 */, /*28000*/{0,2107u,65537u,103163931u,8u,1610617120u,42636u,138442752u,67108864u}/* 1F509 */, /*28001*/{0,2107u,65537u,103163931u,8u,1610617120u,42644u,138442752u,67108864u}/* 1F50A */, /*28002*/{0,2107u,65537u,103163931u,8u,1610617120u,42652u,138442752u,67108864u}/* 1F50B */, /*28003*/{0,2107u,65537u,103163931u,8u,1610617120u,42660u,138442752u,67108864u}/* 1F50C */, /*28004*/{0,2107u,65537u,103163931u,8u,1610617120u,42668u,138442752u,67108864u}/* 1F50D */, /*28005*/{0,2107u,65537u,103163931u,8u,1610617120u,42676u,138442752u,67108864u}/* 1F50E */, /*28006*/{0,2107u,65537u,103163931u,8u,1610617120u,42684u,138442752u,67108864u}/* 1F50F */, /*28007*/{0,2107u,65537u,103163931u,8u,1610617120u,42692u,138442752u,67108864u}/* 1F510 */, /*28008*/{0,2107u,65537u,103163931u,8u,1610617120u,42700u,138442752u,67108864u}/* 1F511 */, /*28009*/{0,2107u,65537u,103163931u,8u,1610617120u,42708u,138442752u,67108864u}/* 1F512 */, /*28010*/{0,2107u,65537u,103163931u,8u,1610617120u,42716u,138442752u,67108864u}/* 1F513 */, /*28011*/{0,2107u,65537u,103163931u,8u,1610617120u,42724u,138442752u,67108864u}/* 1F514 */, /*28012*/{0,2107u,65537u,103163931u,8u,1610617120u,42732u,138442752u,67108864u}/* 1F515 */, /*28013*/{0,2107u,65537u,103163931u,8u,1610617120u,42740u,138442752u,67108864u}/* 1F516 */, /*28014*/{0,2107u,65537u,76949531u,8u,1610617120u,42748u,138442752u,67108864u}/* 1F517 */, /*28015*/{0,2107u,65537u,76949531u,8u,1610617120u,42756u,138442752u,67108864u}/* 1F518 */, /*28016*/{0,2107u,65537u,76949531u,8u,1610617120u,42764u,138442752u,67108864u}/* 1F519 */, /*28017*/{0,2107u,65537u,76949531u,8u,1610617120u,42772u,138442752u,67108864u}/* 1F51A */, /*28018*/{0,2107u,65537u,76949531u,8u,1610617120u,42780u,138442752u,67108864u}/* 1F51B */, /*28019*/{0,2107u,65537u,76949531u,8u,1610617120u,42788u,138442752u,67108864u}/* 1F51C */, /*28020*/{0,2107u,65537u,76949531u,8u,1610617120u,42796u,138442752u,67108864u}/* 1F51D */, /*28021*/{0,2107u,65537u,76949531u,8u,1610617120u,42804u,138442752u,67108864u}/* 1F51E */, /*28022*/{0,2107u,65537u,76949531u,8u,1610617120u,42812u,138442752u,67108864u}/* 1F51F */, /*28023*/{0,2107u,65537u,76949531u,8u,1610617120u,42820u,138442752u,67108864u}/* 1F520 */, /*28024*/{0,2107u,65537u,76949531u,8u,1610617120u,42828u,138442752u,67108864u}/* 1F521 */, /*28025*/{0,2107u,65537u,76949531u,8u,1610617120u,42836u,138442752u,67108864u}/* 1F522 */, /*28026*/{0,2107u,65537u,76949531u,8u,1610617120u,42844u,138442752u,67108864u}/* 1F523 */, /*28027*/{0,2107u,65537u,76949531u,8u,1610617120u,42852u,138442752u,67108864u}/* 1F524 */, /*28028*/{0,2107u,65537u,103163931u,8u,1610617120u,42860u,138442752u,67108864u}/* 1F525 */, /*28029*/{0,2107u,65537u,103163931u,8u,1610617120u,42868u,138442752u,67108864u}/* 1F526 */, /*28030*/{0,2107u,65537u,103163931u,2150105096u,1610617120u,42876u,138442752u,67108864u}/* 1F527 */, /*28031*/{0,2107u,65537u,103163931u,8u,1610617120u,42884u,138442752u,67108864u}/* 1F528 */, /*28032*/{0,2107u,65537u,103163931u,8u,1610617120u,42892u,138442752u,67108864u}/* 1F529 */, /*28033*/{0,2107u,65537u,103163931u,8u,1610617120u,42900u,138442752u,67108864u}/* 1F52A */, /*28034*/{0,2107u,65537u,103163931u,8u,1610617120u,42908u,138442752u,67108864u}/* 1F52B */, /*28035*/{0,2107u,65537u,103163931u,2150105096u,1610617120u,42916u,138442752u,67108864u}/* 1F52C */, /*28036*/{0,2107u,65537u,103163931u,8u,1610617120u,42924u,138442752u,67108864u}/* 1F52D */, /*28037*/{0,2107u,65537u,103163931u,8u,1610617120u,42932u,138442752u,67108864u}/* 1F52E */, /*28038*/{0,2107u,65537u,103163931u,8u,1610617120u,42940u,138442752u,67108864u}/* 1F52F */, /*28039*/{0,2107u,65537u,103163931u,8u,1610617120u,42948u,138442752u,67108864u}/* 1F530 */, /*28040*/{0,2107u,65537u,103163931u,8u,1610617120u,42956u,138442752u,67108864u}/* 1F531 */, /*28041*/{0,2107u,65537u,76949531u,8u,1610617120u,42964u,138442752u,67108864u}/* 1F532 */, /*28042*/{0,2107u,65537u,76949531u,8u,1610617120u,42972u,138442752u,67108864u}/* 1F533 */, /*28043*/{0,2107u,65537u,76949531u,8u,1610617120u,42980u,138442752u,67108864u}/* 1F534 */, /*28044*/{0,2107u,65537u,76949531u,8u,1610617120u,42988u,138442752u,67108864u}/* 1F535 */, /*28045*/{0,2107u,65537u,76949531u,8u,1610617120u,42996u,138442752u,67108864u}/* 1F536 */, /*28046*/{0,2107u,65537u,76949531u,8u,1610617120u,43004u,138442752u,67108864u}/* 1F537 */, /*28047*/{0,2107u,65537u,76949531u,8u,1610617120u,43012u,138442752u,67108864u}/* 1F538 */, /*28048*/{0,2107u,65537u,76949531u,8u,1610617120u,43020u,138442752u,67108864u}/* 1F539 */, /*28049*/{0,2107u,65537u,76949531u,8u,1610617120u,43028u,138442752u,67108864u}/* 1F53A */, /*28050*/{0,2107u,65537u,76949531u,8u,1610617120u,43036u,138442752u,67108864u}/* 1F53B */, /*28051*/{0,2107u,65537u,76949531u,8u,1610617120u,43044u,138442752u,67108864u}/* 1F53C */, /*28052*/{0,2107u,65537u,76949531u,8u,1610617120u,43052u,138442752u,67108864u}/* 1F53D */, /*28053*/{0,2104u,65537u,77080603u,40u,1610612768u,43060u,138442752u,67108864u}/* 1F53E */, /*28054*/{0,2104u,65537u,77080603u,40u,1610612768u,43068u,138442752u,67108864u}/* 1F53F */, /*28055*/{0,2104u,65537u,76982299u,40u,1610612768u,43076u,138442752u,67108864u}/* 1F540 */, /*28056*/{0,2104u,65537u,76982299u,40u,1610612768u,43084u,138442752u,67108864u}/* 1F541 */, /*28057*/{0,2104u,65537u,76982299u,40u,1610612768u,43092u,138442752u,67108864u}/* 1F542 */, /*28058*/{0,2104u,65537u,76982299u,40u,1610612768u,43100u,138442752u,67108864u}/* 1F543 */, /*28059*/{0,2104u,65537u,77080603u,40u,1610612768u,43108u,138442752u,67108864u}/* 1F544 */, /*28060*/{0,2104u,65537u,77080603u,40u,1610612768u,43116u,138442752u,67108864u}/* 1F545 */, /*28061*/{0,2104u,65537u,77080603u,40u,1610612768u,43124u,138442752u,67108864u}/* 1F546 */, /*28062*/{0,2104u,65537u,77080603u,40u,1610612768u,43132u,138442752u,67108864u}/* 1F547 */, /*28063*/{0,2104u,65537u,77080603u,40u,1610612768u,43140u,138442752u,67108864u}/* 1F548 */, /*28064*/{0,2104u,65537u,77080603u,8u,1610616864u,43148u,138442752u,67108864u}/* 1F549 */, /*28065*/{0,2104u,65537u,103295003u,8u,1610616864u,43156u,138442752u,67108864u}/* 1F54A */, /*28066*/{0,2107u,65537u,103327771u,8u,1610617120u,43164u,138442752u,67108864u}/* 1F54B */, /*28067*/{0,2107u,65537u,103327771u,8u,1610617120u,43172u,138442752u,67108864u}/* 1F54C */, /*28068*/{0,2107u,65537u,103327771u,8u,1610617120u,43180u,138442752u,67108864u}/* 1F54D */, /*28069*/{0,2107u,65537u,103327771u,8u,1610617120u,43188u,138442752u,67108864u}/* 1F54E */, /*28070*/{0,2104u,65537u,103327771u,40u,1610612768u,43196u,138442752u,67108864u}/* 1F54F */, /*28071*/{0,2107u,65537u,103163931u,8u,1610617120u,43204u,138442752u,67108864u}/* 1F550 */, /*28072*/{0,2107u,65537u,103163931u,8u,1610617120u,43212u,138442752u,67108864u}/* 1F551 */, /*28073*/{0,2107u,65537u,103163931u,8u,1610617120u,43220u,138442752u,67108864u}/* 1F552 */, /*28074*/{0,2107u,65537u,103163931u,8u,1610617120u,43228u,138442752u,67108864u}/* 1F553 */, /*28075*/{0,2107u,65537u,103163931u,8u,1610617120u,43236u,138442752u,67108864u}/* 1F554 */, /*28076*/{0,2107u,65537u,103163931u,8u,1610617120u,43244u,138442752u,67108864u}/* 1F555 */, /*28077*/{0,2107u,65537u,103163931u,8u,1610617120u,43252u,138442752u,67108864u}/* 1F556 */, /*28078*/{0,2107u,65537u,103163931u,8u,1610617120u,43260u,138442752u,67108864u}/* 1F557 */, /*28079*/{0,2107u,65537u,103163931u,8u,1610617120u,43268u,138442752u,67108864u}/* 1F558 */, /*28080*/{0,2107u,65537u,103163931u,8u,1610617120u,43276u,138442752u,67108864u}/* 1F559 */, /*28081*/{0,2107u,65537u,103163931u,8u,1610617120u,43284u,138442752u,67108864u}/* 1F55A */, /*28082*/{0,2107u,65537u,103163931u,8u,1610617120u,43292u,138442752u,67108864u}/* 1F55B */, /*28083*/{0,2107u,65537u,103163931u,8u,1610617120u,43300u,138442752u,67108864u}/* 1F55C */, /*28084*/{0,2107u,65537u,103163931u,8u,1610617120u,43308u,138442752u,67108864u}/* 1F55D */, /*28085*/{0,2107u,65537u,103163931u,8u,1610617120u,43316u,138442752u,67108864u}/* 1F55E */, /*28086*/{0,2107u,65537u,103163931u,8u,1610617120u,43324u,138442752u,67108864u}/* 1F55F */, /*28087*/{0,2107u,65537u,103163931u,8u,1610617120u,43332u,138442752u,67108864u}/* 1F560 */, /*28088*/{0,2107u,65537u,103163931u,8u,1610617120u,43340u,138442752u,67108864u}/* 1F561 */, /*28089*/{0,2107u,65537u,103163931u,8u,1610617120u,43348u,138442752u,67108864u}/* 1F562 */, /*28090*/{0,2107u,65537u,103163931u,8u,1610617120u,43356u,138442752u,67108864u}/* 1F563 */, /*28091*/{0,2107u,65537u,103163931u,8u,1610617120u,43364u,138442752u,67108864u}/* 1F564 */, /*28092*/{0,2107u,65537u,103163931u,8u,1610617120u,43372u,138442752u,67108864u}/* 1F565 */, /*28093*/{0,2107u,65537u,103163931u,8u,1610617120u,43380u,138442752u,67108864u}/* 1F566 */, /*28094*/{0,2107u,65537u,103163931u,8u,1610617120u,43388u,138442752u,67108864u}/* 1F567 */, /*28095*/{0,2104u,65537u,103295003u,40u,1610612768u,43396u,138442752u,67108864u}/* 1F568 */, /*28096*/{0,2104u,65537u,103295003u,40u,1610612768u,43404u,138442752u,67108864u}/* 1F569 */, /*28097*/{0,2104u,65537u,103295003u,40u,1610612768u,43412u,138442752u,67108864u}/* 1F56A */, /*28098*/{0,2104u,65537u,103295003u,40u,1610612768u,43420u,138442752u,67108864u}/* 1F56B */, /*28099*/{0,2104u,65537u,103295003u,40u,1610612768u,43428u,138442752u,67108864u}/* 1F56C */, /*28100*/{0,2104u,65537u,103295003u,40u,1610612768u,43436u,138442752u,67108864u}/* 1F56D */, /*28101*/{0,2104u,65537u,103295003u,40u,1610612768u,43444u,138442752u,67108864u}/* 1F56E */, /*28102*/{0,2104u,65537u,103295003u,8u,1610616864u,43452u,138442752u,67108864u}/* 1F56F */, /*28103*/{0,2104u,65537u,103295003u,8u,1610616864u,43460u,138442752u,67108864u}/* 1F570 */, /*28104*/{0,2104u,65537u,103295003u,40u,1610612768u,43468u,138442752u,67108864u}/* 1F571 */, /*28105*/{0,2104u,65537u,103295003u,40u,1610612768u,43476u,138442752u,67108864u}/* 1F572 */, /*28106*/{0,2104u,65537u,103295003u,8u,1610616864u,43484u,138442752u,67108864u}/* 1F573 */, /*28107*/{0,2104u,65537u,104343579u,1747058696u,1610617376u,43492u,138442752u,67108864u}/* 1F574 */, /*28108*/{0,2104u,65537u,104343579u,1747058696u,1610617376u,43500u,138442752u,67108864u}/* 1F575 */, /*28109*/{0,2104u,65537u,103295003u,8u,1610616864u,43508u,138442752u,67108864u}/* 1F576 */, /*28110*/{0,2104u,65537u,103295003u,8u,1610616864u,43516u,138442752u,67108864u}/* 1F577 */, /*28111*/{0,2104u,65537u,103295003u,8u,1610616864u,43524u,138442752u,67108864u}/* 1F578 */, /*28112*/{0,2104u,65537u,103295003u,8u,1610616864u,43532u,138442752u,67108864u}/* 1F579 */, /*28113*/{0,2107u,65537u,104409115u,1747058696u,1610617632u,43540u,138442752u,67108864u}/* 1F57A */, /*28114*/{0,2104u,65537u,103295003u,40u,1610612768u,43548u,138442752u,67108864u}/* 1F57B */, /*28115*/{0,2104u,65537u,103295003u,40u,1610612768u,43556u,138442752u,67108864u}/* 1F57C */, /*28116*/{0,2104u,65537u,103295003u,40u,1610612768u,43564u,138442752u,67108864u}/* 1F57D */, /*28117*/{0,2104u,65537u,103295003u,40u,1610612768u,43572u,138442752u,67108864u}/* 1F57E */, /*28118*/{0,2104u,65537u,103295003u,40u,1610612768u,43580u,138442752u,67108864u}/* 1F57F */, /*28119*/{0,2104u,65537u,103295003u,40u,1610612768u,43588u,138442752u,67108864u}/* 1F580 */, /*28120*/{0,2104u,65537u,103295003u,40u,1610612768u,43596u,138442752u,67108864u}/* 1F581 */, /*28121*/{0,2104u,65537u,103295003u,40u,1610612768u,43604u,138442752u,67108864u}/* 1F582 */, /*28122*/{0,2104u,65537u,103295003u,40u,1610612768u,43612u,138442752u,67108864u}/* 1F583 */, /*28123*/{0,2104u,65537u,103295003u,40u,1610612768u,43620u,138442752u,67108864u}/* 1F584 */, /*28124*/{0,2104u,65537u,103295003u,40u,1610612768u,43628u,138442752u,67108864u}/* 1F585 */, /*28125*/{0,2104u,65537u,103295003u,40u,1610612768u,43636u,138442752u,67108864u}/* 1F586 */, /*28126*/{0,2104u,65537u,103295003u,8u,1610616864u,43644u,138442752u,67108864u}/* 1F587 */, /*28127*/{0,2104u,65537u,103295003u,40u,1610612768u,43652u,138442752u,67108864u}/* 1F588 */, /*28128*/{0,2104u,65537u,103295003u,40u,1610612768u,43660u,138442752u,67108864u}/* 1F589 */, /*28129*/{0,2104u,65537u,103295003u,8u,1610616864u,43668u,138442752u,67108864u}/* 1F58A */, /*28130*/{0,2104u,65537u,103295003u,8u,1610616864u,43676u,138442752u,67108864u}/* 1F58B */, /*28131*/{0,2104u,65537u,103295003u,8u,1610616864u,43684u,138442752u,67108864u}/* 1F58C */, /*28132*/{0,2104u,65537u,103295003u,8u,1610616864u,43692u,138442752u,67108864u}/* 1F58D */, /*28133*/{0,2104u,65537u,103295003u,40u,1610612768u,43700u,138442752u,67108864u}/* 1F58E */, /*28134*/{0,2104u,65537u,103295003u,40u,1610612768u,43708u,138442752u,67108864u}/* 1F58F */, /*28135*/{0,2104u,65537u,104343579u,1747058696u,1610617376u,43716u,138442752u,67108864u}/* 1F590 */, /*28136*/{0,2104u,65537u,103295003u,40u,1610612768u,43724u,138442752u,67108864u}/* 1F591 */, /*28137*/{0,2104u,65537u,103295003u,40u,1610612768u,43732u,138442752u,67108864u}/* 1F592 */, /*28138*/{0,2104u,65537u,103295003u,40u,1610612768u,43740u,138442752u,67108864u}/* 1F593 */, /*28139*/{0,2104u,65537u,103295003u,40u,1610612768u,43748u,138442752u,67108864u}/* 1F594 */, /*28140*/{0,2107u,65537u,104343579u,1747058696u,1610617632u,43756u,138442752u,67108864u}/* 1F595 */, /*28141*/{0,2107u,65537u,104343579u,1747058696u,1610617632u,43764u,138442752u,67108864u}/* 1F596 */, /*28142*/{0,2104u,65537u,103295003u,40u,1610612768u,43772u,138442752u,67108864u}/* 1F597 */, /*28143*/{0,2104u,65537u,103295003u,40u,1610612768u,43780u,138442752u,67108864u}/* 1F598 */, /*28144*/{0,2104u,65537u,103295003u,40u,1610612768u,43788u,138442752u,67108864u}/* 1F599 */, /*28145*/{0,2104u,65537u,103295003u,40u,1610612768u,43796u,138442752u,67108864u}/* 1F59A */, /*28146*/{0,2104u,65537u,103295003u,40u,1610612768u,43804u,138442752u,67108864u}/* 1F59B */, /*28147*/{0,2104u,65537u,103295003u,40u,1610612768u,43812u,138442752u,67108864u}/* 1F59C */, /*28148*/{0,2104u,65537u,103295003u,40u,1610612768u,43820u,138442752u,67108864u}/* 1F59D */, /*28149*/{0,2104u,65537u,103295003u,40u,1610612768u,43828u,138442752u,67108864u}/* 1F59E */, /*28150*/{0,2104u,65537u,103295003u,40u,1610612768u,43836u,138442752u,67108864u}/* 1F59F */, /*28151*/{0,2104u,65537u,103295003u,40u,1610612768u,43844u,138442752u,67108864u}/* 1F5A0 */, /*28152*/{0,2104u,65537u,103295003u,40u,1610612768u,43852u,138442752u,67108864u}/* 1F5A1 */, /*28153*/{0,2104u,65537u,103295003u,40u,1610612768u,43860u,138442752u,67108864u}/* 1F5A2 */, /*28154*/{0,2104u,65537u,103295003u,40u,1610612768u,43868u,138442752u,67108864u}/* 1F5A3 */, /*28155*/{0,2107u,65537u,103360539u,8u,1610617120u,43876u,138442752u,67108864u}/* 1F5A4 */, /*28156*/{0,2104u,65537u,103295003u,8u,1610616864u,43884u,138442752u,67108864u}/* 1F5A5 */, /*28157*/{0,2104u,65537u,103295003u,40u,1610612768u,43892u,138442752u,67108864u}/* 1F5A6 */, /*28158*/{0,2104u,65537u,103295003u,40u,1610612768u,43900u,138442752u,67108864u}/* 1F5A7 */, /*28159*/{0,2104u,65537u,103295003u,8u,1610616864u,43908u,138442752u,67108864u}/* 1F5A8 */, /*28160*/{0,2104u,65537u,103295003u,40u,1610612768u,43916u,138442752u,67108864u}/* 1F5A9 */, /*28161*/{0,2104u,65537u,103295003u,40u,1610612768u,43924u,138442752u,67108864u}/* 1F5AA */, /*28162*/{0,2104u,65537u,103295003u,40u,1610612768u,43932u,138442752u,67108864u}/* 1F5AB */, /*28163*/{0,2104u,65537u,103295003u,40u,1610612768u,43940u,138442752u,67108864u}/* 1F5AC */, /*28164*/{0,2104u,65537u,103295003u,40u,1610612768u,43948u,138442752u,67108864u}/* 1F5AD */, /*28165*/{0,2104u,65537u,103295003u,40u,1610612768u,43956u,138442752u,67108864u}/* 1F5AE */, /*28166*/{0,2104u,65537u,103295003u,40u,1610612768u,43964u,138442752u,67108864u}/* 1F5AF */, /*28167*/{0,2104u,65537u,103295003u,40u,1610612768u,43972u,138442752u,67108864u}/* 1F5B0 */, /*28168*/{0,2104u,65537u,103295003u,8u,1610616864u,43980u,138442752u,67108864u}/* 1F5B1 */, /*28169*/{0,2104u,65537u,103295003u,8u,1610616864u,43988u,138442752u,67108864u}/* 1F5B2 */, /*28170*/{0,2104u,65537u,103295003u,40u,1610612768u,43996u,138442752u,67108864u}/* 1F5B3 */, /*28171*/{0,2104u,65537u,103295003u,40u,1610612768u,44004u,138442752u,67108864u}/* 1F5B4 */, /*28172*/{0,2104u,65537u,103295003u,40u,1610612768u,44012u,138442752u,67108864u}/* 1F5B5 */, /*28173*/{0,2104u,65537u,103295003u,40u,1610612768u,44020u,138442752u,67108864u}/* 1F5B6 */, /*28174*/{0,2104u,65537u,103295003u,40u,1610612768u,44028u,138442752u,67108864u}/* 1F5B7 */, /*28175*/{0,2104u,65537u,103295003u,40u,1610612768u,44036u,138442752u,67108864u}/* 1F5B8 */, /*28176*/{0,2104u,65537u,103295003u,40u,1610612768u,44044u,138442752u,67108864u}/* 1F5B9 */, /*28177*/{0,2104u,65537u,103295003u,40u,1610612768u,44052u,138442752u,67108864u}/* 1F5BA */, /*28178*/{0,2104u,65537u,103295003u,40u,1610612768u,44060u,138442752u,67108864u}/* 1F5BB */, /*28179*/{0,2104u,65537u,103295003u,8u,1610616864u,44068u,138442752u,67108864u}/* 1F5BC */, /*28180*/{0,2104u,65537u,103295003u,40u,1610612768u,44076u,138442752u,67108864u}/* 1F5BD */, /*28181*/{0,2104u,65537u,103295003u,40u,1610612768u,44084u,138442752u,67108864u}/* 1F5BE */, /*28182*/{0,2104u,65537u,103295003u,40u,1610612768u,44092u,138442752u,67108864u}/* 1F5BF */, /*28183*/{0,2104u,65537u,103295003u,40u,1610612768u,44100u,138442752u,67108864u}/* 1F5C0 */, /*28184*/{0,2104u,65537u,103295003u,40u,1610612768u,44108u,138442752u,67108864u}/* 1F5C1 */, /*28185*/{0,2104u,65537u,103295003u,8u,1610616864u,44116u,138442752u,67108864u}/* 1F5C2 */, /*28186*/{0,2104u,65537u,103295003u,8u,1610616864u,44124u,138442752u,67108864u}/* 1F5C3 */, /*28187*/{0,2104u,65537u,103295003u,8u,1610616864u,44132u,138442752u,67108864u}/* 1F5C4 */, /*28188*/{0,2104u,65537u,103295003u,40u,1610612768u,44140u,138442752u,67108864u}/* 1F5C5 */, /*28189*/{0,2104u,65537u,103295003u,40u,1610612768u,44148u,138442752u,67108864u}/* 1F5C6 */, /*28190*/{0,2104u,65537u,103295003u,40u,1610612768u,44156u,138442752u,67108864u}/* 1F5C7 */, /*28191*/{0,2104u,65537u,103295003u,40u,1610612768u,44164u,138442752u,67108864u}/* 1F5C8 */, /*28192*/{0,2104u,65537u,103295003u,40u,1610612768u,44172u,138442752u,67108864u}/* 1F5C9 */, /*28193*/{0,2104u,65537u,103295003u,40u,1610612768u,44180u,138442752u,67108864u}/* 1F5CA */, /*28194*/{0,2104u,65537u,103295003u,40u,1610612768u,44188u,138442752u,67108864u}/* 1F5CB */, /*28195*/{0,2104u,65537u,103295003u,40u,1610612768u,44196u,138442752u,67108864u}/* 1F5CC */, /*28196*/{0,2104u,65537u,103295003u,40u,1610612768u,44204u,138442752u,67108864u}/* 1F5CD */, /*28197*/{0,2104u,65537u,103295003u,40u,1610612768u,44212u,138442752u,67108864u}/* 1F5CE */, /*28198*/{0,2104u,65537u,103295003u,40u,1610612768u,44220u,138442752u,67108864u}/* 1F5CF */, /*28199*/{0,2104u,65537u,103295003u,40u,1610612768u,44228u,138442752u,67108864u}/* 1F5D0 */, /*28200*/{0,2104u,65537u,103295003u,8u,1610616864u,44236u,138442752u,67108864u}/* 1F5D1 */, /*28201*/{0,2104u,65537u,103295003u,8u,1610616864u,44244u,138442752u,67108864u}/* 1F5D2 */, /*28202*/{0,2104u,65537u,103295003u,8u,1610616864u,44252u,138442752u,67108864u}/* 1F5D3 */, /*28203*/{0,2104u,65537u,77080603u,40u,1610612768u,44260u,138442752u,67108864u}/* 1F5D4 */, /*28204*/{0,2104u,65537u,77080603u,40u,1610612768u,44268u,138442752u,67108864u}/* 1F5D5 */, /*28205*/{0,2104u,65537u,77080603u,40u,1610612768u,44276u,138442752u,67108864u}/* 1F5D6 */, /*28206*/{0,2104u,65537u,77080603u,40u,1610612768u,44284u,138442752u,67108864u}/* 1F5D7 */, /*28207*/{0,2104u,65537u,77080603u,40u,1610612768u,44292u,138442752u,67108864u}/* 1F5D8 */, /*28208*/{0,2104u,65537u,77080603u,40u,1610612768u,44300u,138442752u,67108864u}/* 1F5D9 */, /*28209*/{0,2104u,65537u,77080603u,40u,1610612768u,44308u,138442752u,67108864u}/* 1F5DA */, /*28210*/{0,2104u,65537u,77080603u,40u,1610612768u,44316u,138442752u,67108864u}/* 1F5DB */, /*28211*/{0,2104u,65537u,103295003u,8u,1610616864u,44324u,138442752u,67108864u}/* 1F5DC */, /*28212*/{0,2104u,65537u,103295003u,8u,1610616864u,44332u,138442752u,67108864u}/* 1F5DD */, /*28213*/{0,2104u,65537u,103295003u,8u,1610616864u,44340u,138442752u,67108864u}/* 1F5DE */, /*28214*/{0,2104u,65537u,103295003u,40u,1610612768u,44348u,138442752u,67108864u}/* 1F5DF */, /*28215*/{0,2104u,65537u,103295003u,40u,1610612768u,44356u,138442752u,67108864u}/* 1F5E0 */, /*28216*/{0,2104u,65537u,103295003u,8u,1610616864u,44364u,138442752u,67108864u}/* 1F5E1 */, /*28217*/{0,2104u,65537u,103295003u,40u,1610612768u,44372u,138442752u,67108864u}/* 1F5E2 */, /*28218*/{0,2104u,65537u,103295003u,8u,1610616864u,44380u,138442752u,67108864u}/* 1F5E3 */, /*28219*/{0,2104u,65537u,103295003u,40u,1610612768u,44388u,138442752u,67108864u}/* 1F5E4 */, /*28220*/{0,2104u,65537u,103295003u,40u,1610612768u,44396u,138442752u,67108864u}/* 1F5E5 */, /*28221*/{0,2104u,65537u,103295003u,40u,1610612768u,44404u,138442752u,67108864u}/* 1F5E6 */, /*28222*/{0,2104u,65537u,103295003u,40u,1610612768u,44412u,138442752u,67108864u}/* 1F5E7 */, /*28223*/{0,2104u,65537u,103295003u,2150105096u,1610616864u,44420u,138442752u,67108864u}/* 1F5E8 */, /*28224*/{0,2104u,65537u,103295003u,40u,1610612768u,44428u,138442752u,67108864u}/* 1F5E9 */, /*28225*/{0,2104u,65537u,103295003u,40u,1610612768u,44436u,138442752u,67108864u}/* 1F5EA */, /*28226*/{0,2104u,65537u,103295003u,40u,1610612768u,44444u,138442752u,67108864u}/* 1F5EB */, /*28227*/{0,2104u,65537u,103295003u,40u,1610612768u,44452u,138442752u,67108864u}/* 1F5EC */, /*28228*/{0,2104u,65537u,103295003u,40u,1610612768u,44460u,138442752u,67108864u}/* 1F5ED */, /*28229*/{0,2104u,65537u,103295003u,40u,1610612768u,44468u,138442752u,67108864u}/* 1F5EE */, /*28230*/{0,2104u,65537u,103295003u,8u,1610616864u,44476u,138442752u,67108864u}/* 1F5EF */, /*28231*/{0,2104u,65537u,103295003u,40u,1610612768u,44484u,138442752u,67108864u}/* 1F5F0 */, /*28232*/{0,2104u,65537u,103295003u,40u,1610612768u,44492u,138442752u,67108864u}/* 1F5F1 */, /*28233*/{0,2104u,65537u,103295003u,40u,1610612768u,44500u,138442752u,67108864u}/* 1F5F2 */, /*28234*/{0,2104u,65537u,103295003u,8u,1610616864u,44508u,138442752u,67108864u}/* 1F5F3 */, /*28235*/{0,2104u,65537u,77080603u,40u,1610612768u,44516u,138442752u,67108864u}/* 1F5F4 */, /*28236*/{0,2104u,65537u,77080603u,40u,1610612768u,44524u,138442752u,67108864u}/* 1F5F5 */, /*28237*/{0,2104u,65537u,77080603u,40u,1610612768u,44532u,138442752u,67108864u}/* 1F5F6 */, /*28238*/{0,2104u,65537u,77080603u,40u,1610612768u,44540u,138442752u,67108864u}/* 1F5F7 */, /*28239*/{0,2104u,65537u,77080603u,40u,1610612768u,44548u,138442752u,67108864u}/* 1F5F8 */, /*28240*/{0,2104u,65537u,77080603u,40u,1610612768u,44556u,138442752u,67108864u}/* 1F5F9 */, /*28241*/{0,2104u,65537u,103295003u,8u,1610616864u,44564u,138442752u,67108864u}/* 1F5FA */, /*28242*/{0,2107u,65537u,103163931u,8u,1610617120u,44572u,138442752u,67108864u}/* 1F5FB */, /*28243*/{0,2107u,65537u,103163931u,8u,1610617120u,44580u,138442752u,67108864u}/* 1F5FC */, /*28244*/{0,2107u,65537u,103163931u,8u,1610617120u,44588u,138442752u,67108864u}/* 1F5FD */, /*28245*/{0,2107u,65537u,103163931u,8u,1610617120u,44596u,138442752u,67108864u}/* 1F5FE */, /*28246*/{0,2107u,65537u,103163931u,8u,1610617120u,44604u,138442752u,67108864u}/* 1F5FF */, /*28247*/{0,2115u,65537u,103196699u,8u,1610617120u,45796u,138442752u,67108864u}/* 1F600 */, /*28248*/{0,2115u,65537u,103163931u,8u,1610617120u,45804u,138442752u,67108864u}/* 1F601 */, /*28249*/{0,2115u,65537u,103163931u,8u,1610617120u,45812u,138442752u,67108864u}/* 1F602 */, /*28250*/{0,2115u,65537u,103163931u,8u,1610617120u,45820u,138442752u,67108864u}/* 1F603 */, /*28251*/{0,2115u,65537u,103163931u,8u,1610617120u,45828u,138442752u,67108864u}/* 1F604 */, /*28252*/{0,2115u,65537u,103163931u,8u,1610617120u,45836u,138442752u,67108864u}/* 1F605 */, /*28253*/{0,2115u,65537u,103163931u,8u,1610617120u,45844u,138442752u,67108864u}/* 1F606 */, /*28254*/{0,2115u,65537u,103163931u,8u,1610617120u,45852u,138442752u,67108864u}/* 1F607 */, /*28255*/{0,2115u,65537u,103163931u,8u,1610617120u,45860u,138442752u,67108864u}/* 1F608 */, /*28256*/{0,2115u,65537u,103163931u,8u,1610617120u,45868u,138442752u,67108864u}/* 1F609 */, /*28257*/{0,2115u,65537u,103163931u,8u,1610617120u,45876u,138442752u,67108864u}/* 1F60A */, /*28258*/{0,2115u,65537u,103163931u,8u,1610617120u,45884u,138442752u,67108864u}/* 1F60B */, /*28259*/{0,2115u,65537u,103163931u,8u,1610617120u,45892u,138442752u,67108864u}/* 1F60C */, /*28260*/{0,2115u,65537u,103163931u,8u,1610617120u,45900u,138442752u,67108864u}/* 1F60D */, /*28261*/{0,2115u,65537u,103163931u,8u,1610617120u,45908u,138442752u,67108864u}/* 1F60E */, /*28262*/{0,2115u,65537u,103163931u,8u,1610617120u,45916u,138442752u,67108864u}/* 1F60F */, /*28263*/{0,2115u,65537u,103163931u,8u,1610617120u,45924u,138442752u,67108864u}/* 1F610 */, /*28264*/{0,2115u,65537u,103196699u,8u,1610617120u,45932u,138442752u,67108864u}/* 1F611 */, /*28265*/{0,2115u,65537u,103163931u,8u,1610617120u,45940u,138442752u,67108864u}/* 1F612 */, /*28266*/{0,2115u,65537u,103163931u,8u,1610617120u,45948u,138442752u,67108864u}/* 1F613 */, /*28267*/{0,2115u,65537u,103163931u,8u,1610617120u,45956u,138442752u,67108864u}/* 1F614 */, /*28268*/{0,2115u,65537u,103196699u,8u,1610617120u,45964u,138442752u,67108864u}/* 1F615 */, /*28269*/{0,2115u,65537u,103163931u,8u,1610617120u,45972u,138442752u,67108864u}/* 1F616 */, /*28270*/{0,2115u,65537u,103196699u,8u,1610617120u,45980u,138442752u,67108864u}/* 1F617 */, /*28271*/{0,2115u,65537u,103163931u,8u,1610617120u,45988u,138442752u,67108864u}/* 1F618 */, /*28272*/{0,2115u,65537u,103196699u,8u,1610617120u,45996u,138442752u,67108864u}/* 1F619 */, /*28273*/{0,2115u,65537u,103163931u,8u,1610617120u,46004u,138442752u,67108864u}/* 1F61A */, /*28274*/{0,2115u,65537u,103196699u,8u,1610617120u,46012u,138442752u,67108864u}/* 1F61B */, /*28275*/{0,2115u,65537u,103163931u,8u,1610617120u,46020u,138442752u,67108864u}/* 1F61C */, /*28276*/{0,2115u,65537u,103163931u,8u,1610617120u,46028u,138442752u,67108864u}/* 1F61D */, /*28277*/{0,2115u,65537u,103163931u,8u,1610617120u,46036u,138442752u,67108864u}/* 1F61E */, /*28278*/{0,2115u,65537u,103196699u,8u,1610617120u,46044u,138442752u,67108864u}/* 1F61F */, /*28279*/{0,2115u,65537u,103163931u,8u,1610617120u,46052u,138442752u,67108864u}/* 1F620 */, /*28280*/{0,2115u,65537u,103163931u,8u,1610617120u,46060u,138442752u,67108864u}/* 1F621 */, /*28281*/{0,2115u,65537u,103163931u,8u,1610617120u,46068u,138442752u,67108864u}/* 1F622 */, /*28282*/{0,2115u,65537u,103163931u,8u,1610617120u,46076u,138442752u,67108864u}/* 1F623 */, /*28283*/{0,2115u,65537u,103163931u,8u,1610617120u,46084u,138442752u,67108864u}/* 1F624 */, /*28284*/{0,2115u,65537u,103163931u,8u,1610617120u,46092u,138442752u,67108864u}/* 1F625 */, /*28285*/{0,2115u,65537u,103196699u,8u,1610617120u,46100u,138442752u,67108864u}/* 1F626 */, /*28286*/{0,2115u,65537u,103196699u,8u,1610617120u,46108u,138442752u,67108864u}/* 1F627 */, /*28287*/{0,2115u,65537u,103163931u,8u,1610617120u,46116u,138442752u,67108864u}/* 1F628 */, /*28288*/{0,2115u,65537u,103163931u,8u,1610617120u,46124u,138442752u,67108864u}/* 1F629 */, /*28289*/{0,2115u,65537u,103163931u,8u,1610617120u,46132u,138442752u,67108864u}/* 1F62A */, /*28290*/{0,2115u,65537u,103163931u,8u,1610617120u,46140u,138442752u,67108864u}/* 1F62B */, /*28291*/{0,2115u,65537u,103196699u,8u,1610617120u,46148u,138442752u,67108864u}/* 1F62C */, /*28292*/{0,2115u,65537u,103163931u,8u,1610617120u,46156u,138442752u,67108864u}/* 1F62D */, /*28293*/{0,2115u,65537u,103196699u,8u,1610617120u,46164u,138442752u,67108864u}/* 1F62E */, /*28294*/{0,2115u,65537u,103196699u,8u,1610617120u,46172u,138442752u,67108864u}/* 1F62F */, /*28295*/{0,2115u,65537u,103163931u,8u,1610617120u,46180u,138442752u,67108864u}/* 1F630 */, /*28296*/{0,2115u,65537u,103163931u,8u,1610617120u,46188u,138442752u,67108864u}/* 1F631 */, /*28297*/{0,2115u,65537u,103163931u,8u,1610617120u,46196u,138442752u,67108864u}/* 1F632 */, /*28298*/{0,2115u,65537u,103163931u,8u,1610617120u,46204u,138442752u,67108864u}/* 1F633 */, /*28299*/{0,2115u,65537u,103196699u,8u,1610617120u,46212u,138442752u,67108864u}/* 1F634 */, /*28300*/{0,2115u,65537u,103163931u,8u,1610617120u,46220u,138442752u,67108864u}/* 1F635 */, /*28301*/{0,2115u,65537u,103163931u,8u,1610617120u,46228u,138442752u,67108864u}/* 1F636 */, /*28302*/{0,2115u,65537u,103163931u,8u,1610617120u,46236u,138442752u,67108864u}/* 1F637 */, /*28303*/{0,2115u,65537u,103163931u,8u,1610617120u,46244u,138442752u,67108864u}/* 1F638 */, /*28304*/{0,2115u,65537u,103163931u,8u,1610617120u,46252u,138442752u,67108864u}/* 1F639 */, /*28305*/{0,2115u,65537u,103163931u,8u,1610617120u,46260u,138442752u,67108864u}/* 1F63A */, /*28306*/{0,2115u,65537u,103163931u,8u,1610617120u,46268u,138442752u,67108864u}/* 1F63B */, /*28307*/{0,2115u,65537u,103163931u,8u,1610617120u,46276u,138442752u,67108864u}/* 1F63C */, /*28308*/{0,2115u,65537u,103163931u,8u,1610617120u,46284u,138442752u,67108864u}/* 1F63D */, /*28309*/{0,2115u,65537u,103163931u,8u,1610617120u,46292u,138442752u,67108864u}/* 1F63E */, /*28310*/{0,2115u,65537u,103163931u,8u,1610617120u,46300u,138442752u,67108864u}/* 1F63F */, /*28311*/{0,2115u,65537u,103163931u,8u,1610617120u,46308u,138442752u,67108864u}/* 1F640 */, /*28312*/{0,2115u,65537u,103295003u,8u,1610617120u,46316u,138442752u,67108864u}/* 1F641 */, /*28313*/{0,2115u,65537u,103295003u,8u,1610617120u,46324u,138442752u,67108864u}/* 1F642 */, /*28314*/{0,2115u,65537u,103327771u,8u,1610617120u,46332u,138442752u,67108864u}/* 1F643 */, /*28315*/{0,2115u,65537u,103327771u,8u,1610617120u,46340u,138442752u,67108864u}/* 1F644 */, /*28316*/{0,2115u,65537u,104212507u,1747058696u,1610617632u,46348u,138442752u,67108864u}/* 1F645 */, /*28317*/{0,2115u,65537u,104212507u,1747058696u,1610617632u,46356u,138442752u,67108864u}/* 1F646 */, /*28318*/{0,2115u,65537u,104212507u,1747058696u,1610617632u,46364u,138442752u,67108864u}/* 1F647 */, /*28319*/{0,2115u,65537u,103163931u,8u,1610617120u,46372u,138442752u,67108864u}/* 1F648 */, /*28320*/{0,2115u,65537u,103163931u,8u,1610617120u,46380u,138442752u,67108864u}/* 1F649 */, /*28321*/{0,2115u,65537u,103163931u,8u,1610617120u,46388u,138442752u,67108864u}/* 1F64A */, /*28322*/{0,2115u,65537u,104212507u,1747058696u,1610617632u,46396u,138442752u,67108864u}/* 1F64B */, /*28323*/{0,2115u,65537u,104212507u,1747058696u,1610617632u,46404u,138442752u,67108864u}/* 1F64C */, /*28324*/{0,2115u,65537u,104212507u,1747058696u,1610617632u,46412u,138442752u,67108864u}/* 1F64D */, /*28325*/{0,2115u,65537u,104212507u,1747058696u,1610617632u,46420u,138442752u,67108864u}/* 1F64E */, /*28326*/{0,2115u,65537u,104212507u,1747058696u,1610617632u,46428u,138442752u,67108864u}/* 1F64F */, /*28327*/{0,2120u,65537u,77080603u,40u,1610612768u,46436u,138442752u,67108864u}/* 1F650 */, /*28328*/{0,2120u,65537u,77080603u,40u,1610612768u,46444u,138442752u,67108864u}/* 1F651 */, /*28329*/{0,2120u,65537u,77080603u,40u,1610612768u,46452u,138442752u,67108864u}/* 1F652 */, /*28330*/{0,2120u,65537u,77080603u,40u,1610612768u,46460u,138442752u,67108864u}/* 1F653 */, /*28331*/{0,2120u,65537u,77080603u,40u,1610612768u,46468u,138442752u,67108864u}/* 1F654 */, /*28332*/{0,2120u,65537u,77080603u,40u,1610612768u,46476u,138442752u,67108864u}/* 1F655 */, /*28333*/{0,2120u,65537u,77080603u,40u,1610612768u,46484u,138442752u,67108864u}/* 1F656 */, /*28334*/{0,2120u,65537u,77080603u,40u,1610612768u,46492u,138442752u,67108864u}/* 1F657 */, /*28335*/{0,2120u,65537u,77080603u,40u,1610612768u,46500u,138442752u,67108864u}/* 1F658 */, /*28336*/{0,2120u,65537u,77080603u,40u,1610612768u,46508u,138442752u,67108864u}/* 1F659 */, /*28337*/{0,2120u,65537u,77080603u,40u,1610612768u,46516u,138442752u,67108864u}/* 1F65A */, /*28338*/{0,2120u,65537u,77080603u,40u,1610612768u,46524u,138442752u,67108864u}/* 1F65B */, /*28339*/{0,2120u,65537u,77080603u,40u,1610612768u,46532u,138442752u,67108864u}/* 1F65C */, /*28340*/{0,2120u,65537u,77080603u,40u,1610612768u,46540u,138442752u,67108864u}/* 1F65D */, /*28341*/{0,2120u,65537u,77080603u,40u,1610612768u,46548u,138442752u,67108864u}/* 1F65E */, /*28342*/{0,2120u,65537u,77080603u,40u,1610612768u,46556u,138442752u,67108864u}/* 1F65F */, /*28343*/{0,2120u,65537u,77080603u,40u,1610612768u,46564u,138442752u,67108864u}/* 1F660 */, /*28344*/{0,2120u,65537u,77080603u,40u,1610612768u,46572u,138442752u,67108864u}/* 1F661 */, /*28345*/{0,2120u,65537u,77080603u,40u,1610612768u,46580u,138442752u,67108864u}/* 1F662 */, /*28346*/{0,2120u,65537u,77080603u,40u,1610612768u,46588u,138442752u,67108864u}/* 1F663 */, /*28347*/{0,2120u,65537u,77080603u,40u,1610612768u,46596u,138442752u,67108864u}/* 1F664 */, /*28348*/{0,2120u,65537u,77080603u,40u,1610612768u,46604u,138442752u,67108864u}/* 1F665 */, /*28349*/{0,2120u,65537u,77080603u,40u,1610612768u,46612u,138442752u,67108864u}/* 1F666 */, /*28350*/{0,2120u,65537u,77080603u,40u,1610612768u,46620u,138442752u,67108864u}/* 1F667 */, /*28351*/{0,2120u,65537u,77080603u,40u,1610612768u,46628u,138442752u,67108864u}/* 1F668 */, /*28352*/{0,2120u,65537u,77080603u,40u,1610612768u,46636u,138442752u,67108864u}/* 1F669 */, /*28353*/{0,2120u,65537u,77080603u,40u,1610612768u,46644u,138442752u,67108864u}/* 1F66A */, /*28354*/{0,2120u,65537u,77080603u,40u,1610612768u,46652u,138442752u,67108864u}/* 1F66B */, /*28355*/{0,2120u,65537u,77080603u,40u,1610612768u,46660u,138442752u,67108864u}/* 1F66C */, /*28356*/{0,2120u,65537u,77080603u,40u,1610612768u,46668u,138442752u,67108864u}/* 1F66D */, /*28357*/{0,2120u,65537u,77080603u,40u,1610612768u,46676u,138442752u,67108864u}/* 1F66E */, /*28358*/{0,2120u,65537u,77080603u,40u,1610612768u,46684u,138442752u,67108864u}/* 1F66F */, /*28359*/{0,2120u,65537u,77080603u,40u,1610612768u,46692u,138442752u,67108864u}/* 1F670 */, /*28360*/{0,2120u,65537u,77080603u,40u,1610612768u,46700u,138442752u,67108864u}/* 1F671 */, /*28361*/{0,2120u,65537u,77080603u,40u,1610612768u,46708u,138442752u,67108864u}/* 1F672 */, /*28362*/{0,2120u,65537u,77080603u,40u,1610612768u,46716u,138442752u,67108864u}/* 1F673 */, /*28363*/{0,2120u,65537u,77080603u,40u,1610612768u,46724u,138442752u,67108864u}/* 1F674 */, /*28364*/{0,2120u,65537u,77080603u,40u,1610612768u,46732u,138442752u,67108864u}/* 1F675 */, /*28365*/{0,2120u,65537u,76032027u,106536u,1610612768u,46740u,138442752u,67108864u}/* 1F676 */, /*28366*/{0,2120u,65537u,76032027u,106536u,1610612768u,46748u,138442752u,67108864u}/* 1F677 */, /*28367*/{0,2120u,65537u,76032027u,106536u,1610612768u,46756u,138442752u,67108864u}/* 1F678 */, /*28368*/{0,2120u,65537u,97003547u,40u,1610612768u,46764u,138442752u,67108864u}/* 1F679 */, /*28369*/{0,2120u,65537u,97003547u,40u,1610612768u,46772u,138442752u,67108864u}/* 1F67A */, /*28370*/{0,2120u,65537u,97003547u,40u,1610612768u,46780u,138442752u,67108864u}/* 1F67B */, /*28371*/{0,2120u,65537u,77080603u,40u,1610612768u,46788u,138442752u,67108864u}/* 1F67C */, /*28372*/{0,2120u,65537u,77080603u,40u,1610612768u,46796u,138442752u,67108864u}/* 1F67D */, /*28373*/{0,2120u,65537u,77080603u,40u,1610612768u,46804u,138442752u,67108864u}/* 1F67E */, /*28374*/{0,2120u,65537u,77080603u,40u,1610612768u,46812u,138442752u,67108864u}/* 1F67F */, /*28375*/{0,2131u,65537u,103163931u,2150105096u,1610617120u,46820u,138442752u,67108864u}/* 1F680 */, /*28376*/{0,2131u,65537u,103163931u,8u,1610617120u,46828u,138442752u,67108864u}/* 1F681 */, /*28377*/{0,2131u,65537u,103163931u,8u,1610617120u,46836u,138442752u,67108864u}/* 1F682 */, /*28378*/{0,2131u,65537u,103163931u,8u,1610617120u,46844u,138442752u,67108864u}/* 1F683 */, /*28379*/{0,2131u,65537u,103163931u,8u,1610617120u,46852u,138442752u,67108864u}/* 1F684 */, /*28380*/{0,2131u,65537u,103163931u,8u,1610617120u,46860u,138442752u,67108864u}/* 1F685 */, /*28381*/{0,2131u,65537u,103163931u,8u,1610617120u,46868u,138442752u,67108864u}/* 1F686 */, /*28382*/{0,2131u,65537u,103163931u,8u,1610617120u,46876u,138442752u,67108864u}/* 1F687 */, /*28383*/{0,2131u,65537u,103163931u,8u,1610617120u,46884u,138442752u,67108864u}/* 1F688 */, /*28384*/{0,2131u,65537u,103163931u,8u,1610617120u,46892u,138442752u,67108864u}/* 1F689 */, /*28385*/{0,2131u,65537u,103163931u,8u,1610617120u,46900u,138442752u,67108864u}/* 1F68A */, /*28386*/{0,2131u,65537u,103163931u,8u,1610617120u,46908u,138442752u,67108864u}/* 1F68B */, /*28387*/{0,2131u,65537u,103163931u,8u,1610617120u,46916u,138442752u,67108864u}/* 1F68C */, /*28388*/{0,2131u,65537u,103163931u,8u,1610617120u,46924u,138442752u,67108864u}/* 1F68D */, /*28389*/{0,2131u,65537u,103163931u,8u,1610617120u,46932u,138442752u,67108864u}/* 1F68E */, /*28390*/{0,2131u,65537u,103163931u,8u,1610617120u,46940u,138442752u,67108864u}/* 1F68F */, /*28391*/{0,2131u,65537u,103163931u,8u,1610617120u,46948u,138442752u,67108864u}/* 1F690 */, /*28392*/{0,2131u,65537u,103163931u,8u,1610617120u,46956u,138442752u,67108864u}/* 1F691 */, /*28393*/{0,2131u,65537u,103163931u,2150105096u,1610617120u,46964u,138442752u,67108864u}/* 1F692 */, /*28394*/{0,2131u,65537u,103163931u,8u,1610617120u,46972u,138442752u,67108864u}/* 1F693 */, /*28395*/{0,2131u,65537u,103163931u,8u,1610617120u,46980u,138442752u,67108864u}/* 1F694 */, /*28396*/{0,2131u,65537u,103163931u,8u,1610617120u,46988u,138442752u,67108864u}/* 1F695 */, /*28397*/{0,2131u,65537u,103163931u,8u,1610617120u,46996u,138442752u,67108864u}/* 1F696 */, /*28398*/{0,2131u,65537u,103163931u,8u,1610617120u,47004u,138442752u,67108864u}/* 1F697 */, /*28399*/{0,2131u,65537u,103163931u,8u,1610617120u,47012u,138442752u,67108864u}/* 1F698 */, /*28400*/{0,2131u,65537u,103163931u,8u,1610617120u,47020u,138442752u,67108864u}/* 1F699 */, /*28401*/{0,2131u,65537u,103163931u,8u,1610617120u,47028u,138442752u,67108864u}/* 1F69A */, /*28402*/{0,2131u,65537u,103163931u,8u,1610617120u,47036u,138442752u,67108864u}/* 1F69B */, /*28403*/{0,2131u,65537u,103163931u,8u,1610617120u,47044u,138442752u,67108864u}/* 1F69C */, /*28404*/{0,2131u,65537u,103163931u,8u,1610617120u,47052u,138442752u,67108864u}/* 1F69D */, /*28405*/{0,2131u,65537u,103163931u,8u,1610617120u,47060u,138442752u,67108864u}/* 1F69E */, /*28406*/{0,2131u,65537u,103163931u,8u,1610617120u,47068u,138442752u,67108864u}/* 1F69F */, /*28407*/{0,2131u,65537u,103163931u,8u,1610617120u,47076u,138442752u,67108864u}/* 1F6A0 */, /*28408*/{0,2131u,65537u,103163931u,8u,1610617120u,47084u,138442752u,67108864u}/* 1F6A1 */, /*28409*/{0,2131u,65537u,103163931u,8u,1610617120u,47092u,138442752u,67108864u}/* 1F6A2 */, /*28410*/{0,2131u,65537u,104212507u,1747058696u,1610617632u,47100u,138442752u,67108864u}/* 1F6A3 */, /*28411*/{0,2131u,65537u,103163931u,8u,1610617120u,47108u,138442752u,67108864u}/* 1F6A4 */, /*28412*/{0,2131u,65537u,103163931u,8u,1610617120u,47116u,138442752u,67108864u}/* 1F6A5 */, /*28413*/{0,2131u,65537u,103163931u,8u,1610617120u,47124u,138442752u,67108864u}/* 1F6A6 */, /*28414*/{0,2131u,65537u,103163931u,8u,1610617120u,47132u,138442752u,67108864u}/* 1F6A7 */, /*28415*/{0,2131u,65537u,103163931u,8u,1610617120u,47140u,138442752u,67108864u}/* 1F6A8 */, /*28416*/{0,2131u,65537u,103163931u,8u,1610617120u,47148u,138442752u,67108864u}/* 1F6A9 */, /*28417*/{0,2131u,65537u,103163931u,8u,1610617120u,47156u,138442752u,67108864u}/* 1F6AA */, /*28418*/{0,2131u,65537u,103163931u,8u,1610617120u,47164u,138442752u,67108864u}/* 1F6AB */, /*28419*/{0,2131u,65537u,103163931u,8u,1610617120u,47172u,138442752u,67108864u}/* 1F6AC */, /*28420*/{0,2131u,65537u,103163931u,8u,1610617120u,47180u,138442752u,67108864u}/* 1F6AD */, /*28421*/{0,2131u,65537u,103163931u,8u,1610617120u,47188u,138442752u,67108864u}/* 1F6AE */, /*28422*/{0,2131u,65537u,103163931u,8u,1610617120u,47196u,138442752u,67108864u}/* 1F6AF */, /*28423*/{0,2131u,65537u,103163931u,8u,1610617120u,47204u,138442752u,67108864u}/* 1F6B0 */, /*28424*/{0,2131u,65537u,103163931u,8u,1610617120u,47212u,138442752u,67108864u}/* 1F6B1 */, /*28425*/{0,2131u,65537u,103163931u,8u,1610617120u,47220u,138442752u,67108864u}/* 1F6B2 */, /*28426*/{0,2131u,65537u,103163931u,8u,1610617120u,47228u,138442752u,67108864u}/* 1F6B3 */, /*28427*/{0,2131u,65537u,104212507u,1747058696u,1610617632u,47236u,138442752u,67108864u}/* 1F6B4 */, /*28428*/{0,2131u,65537u,104212507u,1747058696u,1610617632u,47244u,138442752u,67108864u}/* 1F6B5 */, /*28429*/{0,2131u,65537u,104212507u,1747058696u,1610617632u,47252u,138442752u,67108864u}/* 1F6B6 */, /*28430*/{0,2131u,65537u,103163931u,8u,1610617120u,47260u,138442752u,67108864u}/* 1F6B7 */, /*28431*/{0,2131u,65537u,103163931u,8u,1610617120u,47268u,138442752u,67108864u}/* 1F6B8 */, /*28432*/{0,2131u,65537u,103163931u,8u,1610617120u,47276u,138442752u,67108864u}/* 1F6B9 */, /*28433*/{0,2131u,65537u,103163931u,8u,1610617120u,47284u,138442752u,67108864u}/* 1F6BA */, /*28434*/{0,2131u,65537u,103163931u,8u,1610617120u,47292u,138442752u,67108864u}/* 1F6BB */, /*28435*/{0,2131u,65537u,103163931u,8u,1610617120u,47300u,138442752u,67108864u}/* 1F6BC */, /*28436*/{0,2131u,65537u,103163931u,8u,1610617120u,47308u,138442752u,67108864u}/* 1F6BD */, /*28437*/{0,2131u,65537u,103163931u,8u,1610617120u,47316u,138442752u,67108864u}/* 1F6BE */, /*28438*/{0,2131u,65537u,103163931u,8u,1610617120u,47324u,138442752u,67108864u}/* 1F6BF */, /*28439*/{0,2131u,65537u,104212507u,1747058696u,1610617632u,47332u,138442752u,67108864u}/* 1F6C0 */, /*28440*/{0,2131u,65537u,103163931u,8u,1610617120u,47340u,138442752u,67108864u}/* 1F6C1 */, /*28441*/{0,2131u,65537u,103163931u,8u,1610617120u,47348u,138442752u,67108864u}/* 1F6C2 */, /*28442*/{0,2131u,65537u,103163931u,8u,1610617120u,47356u,138442752u,67108864u}/* 1F6C3 */, /*28443*/{0,2131u,65537u,103163931u,8u,1610617120u,47364u,138442752u,67108864u}/* 1F6C4 */, /*28444*/{0,2131u,65537u,103163931u,8u,1610617120u,47372u,138442752u,67108864u}/* 1F6C5 */, /*28445*/{0,2128u,65537u,103295003u,40u,1610612768u,47380u,138442752u,67108864u}/* 1F6C6 */, /*28446*/{0,2128u,65537u,103295003u,40u,1610612768u,47388u,138442752u,67108864u}/* 1F6C7 */, /*28447*/{0,2128u,65537u,103295003u,40u,1610612768u,47396u,138442752u,67108864u}/* 1F6C8 */, /*28448*/{0,2128u,65537u,103295003u,40u,1610612768u,47404u,138442752u,67108864u}/* 1F6C9 */, /*28449*/{0,2128u,65537u,103295003u,40u,1610612768u,47412u,138442752u,67108864u}/* 1F6CA */, /*28450*/{0,2128u,65537u,103295003u,8u,1610616864u,47420u,138442752u,67108864u}/* 1F6CB */, /*28451*/{0,2131u,65537u,104343579u,1747058696u,1610617632u,47428u,138442752u,67108864u}/* 1F6CC */, /*28452*/{0,2128u,65537u,103295003u,8u,1610616864u,47436u,138442752u,67108864u}/* 1F6CD */, /*28453*/{0,2128u,65537u,103295003u,8u,1610616864u,47444u,138442752u,67108864u}/* 1F6CE */, /*28454*/{0,2128u,65537u,103295003u,8u,1610616864u,47452u,138442752u,67108864u}/* 1F6CF */, /*28455*/{0,2131u,65537u,103327771u,8u,1610617120u,47460u,138442752u,67108864u}/* 1F6D0 */, /*28456*/{0,2131u,65537u,103360539u,8u,1610617120u,47468u,138442752u,67108864u}/* 1F6D1 */, /*28457*/{0,2131u,65537u,103360539u,8u,1610617120u,47476u,138442752u,67108864u}/* 1F6D2 */, /*28458*/{0,2128u,65537u,103393307u,40u,1610612768u,47484u,138442752u,67108864u}/* 1F6D3 */, /*28459*/{0,2128u,65537u,103393307u,40u,1610612768u,47492u,138442752u,67108864u}/* 1F6D4 */, /*28460*/{0,2128u,65537u,103295003u,8u,1610616864u,47500u,138442752u,67108864u}/* 1F6E0 */, /*28461*/{0,2128u,65537u,103295003u,8u,1610616864u,47508u,138442752u,67108864u}/* 1F6E1 */, /*28462*/{0,2128u,65537u,103295003u,8u,1610616864u,47516u,138442752u,67108864u}/* 1F6E2 */, /*28463*/{0,2128u,65537u,103295003u,8u,1610616864u,47524u,138442752u,67108864u}/* 1F6E3 */, /*28464*/{0,2128u,65537u,103295003u,8u,1610616864u,47532u,138442752u,67108864u}/* 1F6E4 */, /*28465*/{0,2128u,65537u,103295003u,8u,1610616864u,47540u,138442752u,67108864u}/* 1F6E5 */, /*28466*/{0,2128u,65537u,103295003u,40u,1610612768u,47548u,138442752u,67108864u}/* 1F6E6 */, /*28467*/{0,2128u,65537u,103295003u,40u,1610612768u,47556u,138442752u,67108864u}/* 1F6E7 */, /*28468*/{0,2128u,65537u,103295003u,40u,1610612768u,47564u,138442752u,67108864u}/* 1F6E8 */, /*28469*/{0,2128u,65537u,103295003u,8u,1610616864u,47572u,138442752u,67108864u}/* 1F6E9 */, /*28470*/{0,2128u,65537u,103295003u,40u,1610612768u,47580u,138442752u,67108864u}/* 1F6EA */, /*28471*/{0,2131u,65537u,103295003u,8u,1610617120u,47588u,138442752u,67108864u}/* 1F6EB */, /*28472*/{0,2131u,65537u,103295003u,8u,1610617120u,47596u,138442752u,67108864u}/* 1F6EC */, /*28473*/{0,2128u,65537u,103295003u,8u,1610616864u,47604u,138442752u,67108864u}/* 1F6F0 */, /*28474*/{0,2128u,65537u,103295003u,40u,1610612768u,47612u,138442752u,67108864u}/* 1F6F1 */, /*28475*/{0,2128u,65537u,103295003u,40u,1610612768u,47620u,138442752u,67108864u}/* 1F6F2 */, /*28476*/{0,2128u,65537u,103295003u,8u,1610616864u,47628u,138442752u,67108864u}/* 1F6F3 */, /*28477*/{0,2131u,65537u,103360539u,8u,1610617120u,47636u,138442752u,67108864u}/* 1F6F4 */, /*28478*/{0,2131u,65537u,103360539u,8u,1610617120u,47644u,138442752u,67108864u}/* 1F6F5 */, /*28479*/{0,2131u,65537u,103360539u,8u,1610617120u,47652u,138442752u,67108864u}/* 1F6F6 */, /*28480*/{0,2131u,65537u,103393307u,8u,1610617120u,47660u,138442752u,67108864u}/* 1F6F7 */, /*28481*/{0,2131u,65537u,103393307u,8u,1610617120u,47668u,138442752u,67108864u}/* 1F6F8 */, /*28482*/{0,2136u,65537u,76949531u,40u,1610612768u,47676u,138442752u,67108864u}/* 1F700 */, /*28483*/{0,2136u,65537u,76949531u,40u,1610612768u,47684u,138442752u,67108864u}/* 1F701 */, /*28484*/{0,2136u,65537u,76949531u,40u,1610612768u,47692u,138442752u,67108864u}/* 1F702 */, /*28485*/{0,2136u,65537u,76949531u,40u,1610612768u,47700u,138442752u,67108864u}/* 1F703 */, /*28486*/{0,2136u,65537u,76949531u,40u,1610612768u,47708u,138442752u,67108864u}/* 1F704 */, /*28487*/{0,2136u,65537u,76949531u,40u,1610612768u,47716u,138442752u,67108864u}/* 1F705 */, /*28488*/{0,2136u,65537u,76949531u,40u,1610612768u,47724u,138442752u,67108864u}/* 1F706 */, /*28489*/{0,2136u,65537u,76949531u,40u,1610612768u,47732u,138442752u,67108864u}/* 1F707 */, /*28490*/{0,2136u,65537u,76949531u,40u,1610612768u,47740u,138442752u,67108864u}/* 1F708 */, /*28491*/{0,2136u,65537u,76949531u,40u,1610612768u,47748u,138442752u,67108864u}/* 1F709 */, /*28492*/{0,2136u,65537u,76949531u,40u,1610612768u,47756u,138442752u,67108864u}/* 1F70A */, /*28493*/{0,2136u,65537u,76949531u,40u,1610612768u,47764u,138442752u,67108864u}/* 1F70B */, /*28494*/{0,2136u,65537u,76949531u,40u,1610612768u,47772u,138442752u,67108864u}/* 1F70C */, /*28495*/{0,2136u,65537u,76949531u,40u,1610612768u,47780u,138442752u,67108864u}/* 1F70D */, /*28496*/{0,2136u,65537u,76949531u,40u,1610612768u,47788u,138442752u,67108864u}/* 1F70E */, /*28497*/{0,2136u,65537u,76949531u,40u,1610612768u,47796u,138442752u,67108864u}/* 1F70F */, /*28498*/{0,2136u,65537u,76949531u,40u,1610612768u,47804u,138442752u,67108864u}/* 1F710 */, /*28499*/{0,2136u,65537u,76949531u,40u,1610612768u,47812u,138442752u,67108864u}/* 1F711 */, /*28500*/{0,2136u,65537u,76949531u,40u,1610612768u,47820u,138442752u,67108864u}/* 1F712 */, /*28501*/{0,2136u,65537u,76949531u,40u,1610612768u,47828u,138442752u,67108864u}/* 1F713 */, /*28502*/{0,2136u,65537u,76949531u,40u,1610612768u,47836u,138442752u,67108864u}/* 1F714 */, /*28503*/{0,2136u,65537u,76949531u,40u,1610612768u,47844u,138442752u,67108864u}/* 1F715 */, /*28504*/{0,2136u,65537u,76949531u,40u,1610612768u,47852u,138442752u,67108864u}/* 1F716 */, /*28505*/{0,2136u,65537u,76949531u,40u,1610612768u,47860u,138442752u,67108864u}/* 1F717 */, /*28506*/{0,2136u,65537u,76949531u,40u,1610612768u,47868u,138442752u,67108864u}/* 1F718 */, /*28507*/{0,2136u,65537u,76949531u,40u,1610612768u,47876u,138442752u,67108864u}/* 1F719 */, /*28508*/{0,2136u,65537u,76949531u,40u,1610612768u,47884u,138442752u,67108864u}/* 1F71A */, /*28509*/{0,2136u,65537u,76949531u,40u,1610612768u,47892u,138442752u,67108864u}/* 1F71B */, /*28510*/{0,2136u,65537u,76949531u,40u,1610612768u,47900u,138442752u,67108864u}/* 1F71C */, /*28511*/{0,2136u,65537u,76949531u,40u,1610612768u,47908u,138442752u,67108864u}/* 1F71D */, /*28512*/{0,2136u,65537u,76949531u,40u,1610612768u,47916u,138442752u,67108864u}/* 1F71E */, /*28513*/{0,2136u,65537u,76949531u,40u,1610612768u,47924u,138442752u,67108864u}/* 1F71F */, /*28514*/{0,2136u,65537u,76949531u,40u,1610612768u,47932u,138442752u,67108864u}/* 1F720 */, /*28515*/{0,2136u,65537u,76949531u,40u,1610612768u,47940u,138442752u,67108864u}/* 1F721 */, /*28516*/{0,2136u,65537u,76949531u,40u,1610612768u,47948u,138442752u,67108864u}/* 1F722 */, /*28517*/{0,2136u,65537u,76949531u,40u,1610612768u,47956u,138442752u,67108864u}/* 1F723 */, /*28518*/{0,2136u,65537u,76949531u,40u,1610612768u,47964u,138442752u,67108864u}/* 1F724 */, /*28519*/{0,2136u,65537u,76949531u,40u,1610612768u,47972u,138442752u,67108864u}/* 1F725 */, /*28520*/{0,2136u,65537u,76949531u,40u,1610612768u,47980u,138442752u,67108864u}/* 1F726 */, /*28521*/{0,2136u,65537u,76949531u,40u,1610612768u,47988u,138442752u,67108864u}/* 1F727 */, /*28522*/{0,2136u,65537u,76949531u,40u,1610612768u,47996u,138442752u,67108864u}/* 1F728 */, /*28523*/{0,2136u,65537u,76949531u,40u,1610612768u,48004u,138442752u,67108864u}/* 1F729 */, /*28524*/{0,2136u,65537u,76949531u,40u,1610612768u,48012u,138442752u,67108864u}/* 1F72A */, /*28525*/{0,2136u,65537u,76949531u,40u,1610612768u,48020u,138442752u,67108864u}/* 1F72B */, /*28526*/{0,2136u,65537u,76949531u,40u,1610612768u,48028u,138442752u,67108864u}/* 1F72C */, /*28527*/{0,2136u,65537u,76949531u,40u,1610612768u,48036u,138442752u,67108864u}/* 1F72D */, /*28528*/{0,2136u,65537u,76949531u,40u,1610612768u,48044u,138442752u,67108864u}/* 1F72E */, /*28529*/{0,2136u,65537u,76949531u,40u,1610612768u,48052u,138442752u,67108864u}/* 1F72F */, /*28530*/{0,2136u,65537u,76949531u,40u,1610612768u,48060u,138442752u,67108864u}/* 1F730 */, /*28531*/{0,2136u,65537u,76949531u,40u,1610612768u,48068u,138442752u,67108864u}/* 1F731 */, /*28532*/{0,2136u,65537u,76949531u,40u,1610612768u,48076u,138442752u,67108864u}/* 1F732 */, /*28533*/{0,2136u,65537u,76949531u,40u,1610612768u,48084u,138442752u,67108864u}/* 1F733 */, /*28534*/{0,2136u,65537u,76949531u,40u,1610612768u,48092u,138442752u,67108864u}/* 1F734 */, /*28535*/{0,2136u,65537u,76949531u,40u,1610612768u,48100u,138442752u,67108864u}/* 1F735 */, /*28536*/{0,2136u,65537u,76949531u,40u,1610612768u,48108u,138442752u,67108864u}/* 1F736 */, /*28537*/{0,2136u,65537u,76949531u,40u,1610612768u,48116u,138442752u,67108864u}/* 1F737 */, /*28538*/{0,2136u,65537u,76949531u,40u,1610612768u,48124u,138442752u,67108864u}/* 1F738 */, /*28539*/{0,2136u,65537u,76949531u,40u,1610612768u,48132u,138442752u,67108864u}/* 1F739 */, /*28540*/{0,2136u,65537u,76949531u,40u,1610612768u,48140u,138442752u,67108864u}/* 1F73A */, /*28541*/{0,2136u,65537u,76949531u,40u,1610612768u,48148u,138442752u,67108864u}/* 1F73B */, /*28542*/{0,2136u,65537u,76949531u,40u,1610612768u,48156u,138442752u,67108864u}/* 1F73C */, /*28543*/{0,2136u,65537u,76949531u,40u,1610612768u,48164u,138442752u,67108864u}/* 1F73D */, /*28544*/{0,2136u,65537u,76949531u,40u,1610612768u,48172u,138442752u,67108864u}/* 1F73E */, /*28545*/{0,2136u,65537u,76949531u,40u,1610612768u,48180u,138442752u,67108864u}/* 1F73F */, /*28546*/{0,2136u,65537u,76949531u,40u,1610612768u,48188u,138442752u,67108864u}/* 1F740 */, /*28547*/{0,2136u,65537u,76949531u,40u,1610612768u,48196u,138442752u,67108864u}/* 1F741 */, /*28548*/{0,2136u,65537u,76949531u,40u,1610612768u,48204u,138442752u,67108864u}/* 1F742 */, /*28549*/{0,2136u,65537u,76949531u,40u,1610612768u,48212u,138442752u,67108864u}/* 1F743 */, /*28550*/{0,2136u,65537u,76949531u,40u,1610612768u,48220u,138442752u,67108864u}/* 1F744 */, /*28551*/{0,2136u,65537u,76949531u,40u,1610612768u,48228u,138442752u,67108864u}/* 1F745 */, /*28552*/{0,2136u,65537u,76949531u,40u,1610612768u,48236u,138442752u,67108864u}/* 1F746 */, /*28553*/{0,2136u,65537u,76949531u,40u,1610612768u,48244u,138442752u,67108864u}/* 1F747 */, /*28554*/{0,2136u,65537u,76949531u,40u,1610612768u,48252u,138442752u,67108864u}/* 1F748 */, /*28555*/{0,2136u,65537u,76949531u,40u,1610612768u,48260u,138442752u,67108864u}/* 1F749 */, /*28556*/{0,2136u,65537u,76949531u,40u,1610612768u,48268u,138442752u,67108864u}/* 1F74A */, /*28557*/{0,2136u,65537u,76949531u,40u,1610612768u,48276u,138442752u,67108864u}/* 1F74B */, /*28558*/{0,2136u,65537u,76949531u,40u,1610612768u,48284u,138442752u,67108864u}/* 1F74C */, /*28559*/{0,2136u,65537u,76949531u,40u,1610612768u,48292u,138442752u,67108864u}/* 1F74D */, /*28560*/{0,2136u,65537u,76949531u,40u,1610612768u,48300u,138442752u,67108864u}/* 1F74E */, /*28561*/{0,2136u,65537u,76949531u,40u,1610612768u,48308u,138442752u,67108864u}/* 1F74F */, /*28562*/{0,2136u,65537u,76949531u,40u,1610612768u,48316u,138442752u,67108864u}/* 1F750 */, /*28563*/{0,2136u,65537u,76949531u,40u,1610612768u,48324u,138442752u,67108864u}/* 1F751 */, /*28564*/{0,2136u,65537u,76949531u,40u,1610612768u,48332u,138442752u,67108864u}/* 1F752 */, /*28565*/{0,2136u,65537u,76949531u,40u,1610612768u,48340u,138442752u,67108864u}/* 1F753 */, /*28566*/{0,2136u,65537u,76949531u,40u,1610612768u,48348u,138442752u,67108864u}/* 1F754 */, /*28567*/{0,2136u,65537u,76949531u,40u,1610612768u,48356u,138442752u,67108864u}/* 1F755 */, /*28568*/{0,2136u,65537u,76949531u,40u,1610612768u,48364u,138442752u,67108864u}/* 1F756 */, /*28569*/{0,2136u,65537u,76949531u,40u,1610612768u,48372u,138442752u,67108864u}/* 1F757 */, /*28570*/{0,2136u,65537u,76949531u,40u,1610612768u,48380u,138442752u,67108864u}/* 1F758 */, /*28571*/{0,2136u,65537u,76949531u,40u,1610612768u,48388u,138442752u,67108864u}/* 1F759 */, /*28572*/{0,2136u,65537u,76949531u,40u,1610612768u,48396u,138442752u,67108864u}/* 1F75A */, /*28573*/{0,2136u,65537u,76949531u,40u,1610612768u,48404u,138442752u,67108864u}/* 1F75B */, /*28574*/{0,2136u,65537u,76949531u,40u,1610612768u,48412u,138442752u,67108864u}/* 1F75C */, /*28575*/{0,2136u,65537u,76949531u,40u,1610612768u,48420u,138442752u,67108864u}/* 1F75D */, /*28576*/{0,2136u,65537u,76949531u,40u,1610612768u,48428u,138442752u,67108864u}/* 1F75E */, /*28577*/{0,2136u,65537u,76949531u,40u,1610612768u,48436u,138442752u,67108864u}/* 1F75F */, /*28578*/{0,2136u,65537u,76949531u,40u,1610612768u,48444u,138442752u,67108864u}/* 1F760 */, /*28579*/{0,2136u,65537u,76949531u,40u,1610612768u,48452u,138442752u,67108864u}/* 1F761 */, /*28580*/{0,2136u,65537u,76949531u,40u,1610612768u,48460u,138442752u,67108864u}/* 1F762 */, /*28581*/{0,2136u,65537u,76949531u,40u,1610612768u,48468u,138442752u,67108864u}/* 1F763 */, /*28582*/{0,2136u,65537u,76949531u,40u,1610612768u,48476u,138442752u,67108864u}/* 1F764 */, /*28583*/{0,2136u,65537u,76949531u,40u,1610612768u,48484u,138442752u,67108864u}/* 1F765 */, /*28584*/{0,2136u,65537u,76949531u,40u,1610612768u,48492u,138442752u,67108864u}/* 1F766 */, /*28585*/{0,2136u,65537u,76949531u,40u,1610612768u,48500u,138442752u,67108864u}/* 1F767 */, /*28586*/{0,2136u,65537u,76949531u,40u,1610612768u,48508u,138442752u,67108864u}/* 1F768 */, /*28587*/{0,2136u,65537u,76949531u,40u,1610612768u,48516u,138442752u,67108864u}/* 1F769 */, /*28588*/{0,2136u,65537u,76949531u,40u,1610612768u,48524u,138442752u,67108864u}/* 1F76A */, /*28589*/{0,2136u,65537u,76949531u,40u,1610612768u,48532u,138442752u,67108864u}/* 1F76B */, /*28590*/{0,2136u,65537u,76949531u,40u,1610612768u,48540u,138442752u,67108864u}/* 1F76C */, /*28591*/{0,2136u,65537u,76949531u,40u,1610612768u,48548u,138442752u,67108864u}/* 1F76D */, /*28592*/{0,2136u,65537u,76949531u,40u,1610612768u,48556u,138442752u,67108864u}/* 1F76E */, /*28593*/{0,2136u,65537u,76949531u,40u,1610612768u,48564u,138442752u,67108864u}/* 1F76F */, /*28594*/{0,2136u,65537u,76949531u,40u,1610612768u,48572u,138442752u,67108864u}/* 1F770 */, /*28595*/{0,2136u,65537u,76949531u,40u,1610612768u,48580u,138442752u,67108864u}/* 1F771 */, /*28596*/{0,2136u,65537u,76949531u,40u,1610612768u,48588u,138442752u,67108864u}/* 1F772 */, /*28597*/{0,2136u,65537u,76949531u,40u,1610612768u,48596u,138442752u,67108864u}/* 1F773 */, /*28598*/{0,2144u,65537u,77080603u,40u,1610612768u,48604u,138442752u,67108864u}/* 1F780 */, /*28599*/{0,2144u,65537u,77080603u,40u,1610612768u,48612u,138442752u,67108864u}/* 1F781 */, /*28600*/{0,2144u,65537u,77080603u,40u,1610612768u,48620u,138442752u,67108864u}/* 1F782 */, /*28601*/{0,2144u,65537u,77080603u,40u,1610612768u,48628u,138442752u,67108864u}/* 1F783 */, /*28602*/{0,2144u,65537u,77080603u,40u,1610612768u,48636u,138442752u,67108864u}/* 1F784 */, /*28603*/{0,2144u,65537u,77080603u,40u,1610612768u,48644u,138442752u,67108864u}/* 1F785 */, /*28604*/{0,2144u,65537u,77080603u,40u,1610612768u,48652u,138442752u,67108864u}/* 1F786 */, /*28605*/{0,2144u,65537u,77080603u,40u,1610612768u,48660u,138442752u,67108864u}/* 1F787 */, /*28606*/{0,2144u,65537u,77080603u,40u,1610612768u,48668u,138442752u,67108864u}/* 1F788 */, /*28607*/{0,2144u,65537u,77080603u,40u,1610612768u,48676u,138442752u,67108864u}/* 1F789 */, /*28608*/{0,2144u,65537u,77080603u,40u,1610612768u,48684u,138442752u,67108864u}/* 1F78A */, /*28609*/{0,2144u,65537u,77080603u,40u,1610612768u,48692u,138442752u,67108864u}/* 1F78B */, /*28610*/{0,2144u,65537u,77080603u,40u,1610612768u,48700u,138442752u,67108864u}/* 1F78C */, /*28611*/{0,2144u,65537u,77080603u,40u,1610612768u,48708u,138442752u,67108864u}/* 1F78D */, /*28612*/{0,2144u,65537u,77080603u,40u,1610612768u,48716u,138442752u,67108864u}/* 1F78E */, /*28613*/{0,2144u,65537u,77080603u,40u,1610612768u,48724u,138442752u,67108864u}/* 1F78F */, /*28614*/{0,2144u,65537u,77080603u,40u,1610612768u,48732u,138442752u,67108864u}/* 1F790 */, /*28615*/{0,2144u,65537u,77080603u,40u,1610612768u,48740u,138442752u,67108864u}/* 1F791 */, /*28616*/{0,2144u,65537u,77080603u,40u,1610612768u,48748u,138442752u,67108864u}/* 1F792 */, /*28617*/{0,2144u,65537u,77080603u,40u,1610612768u,48756u,138442752u,67108864u}/* 1F793 */, /*28618*/{0,2144u,65537u,77080603u,40u,1610612768u,48764u,138442752u,67108864u}/* 1F794 */, /*28619*/{0,2144u,65537u,77080603u,40u,1610612768u,48772u,138442752u,67108864u}/* 1F795 */, /*28620*/{0,2144u,65537u,77080603u,40u,1610612768u,48780u,138442752u,67108864u}/* 1F796 */, /*28621*/{0,2144u,65537u,77080603u,40u,1610612768u,48788u,138442752u,67108864u}/* 1F797 */, /*28622*/{0,2144u,65537u,77080603u,40u,1610612768u,48796u,138442752u,67108864u}/* 1F798 */, /*28623*/{0,2144u,65537u,77080603u,40u,1610612768u,48804u,138442752u,67108864u}/* 1F799 */, /*28624*/{0,2144u,65537u,77080603u,40u,1610612768u,48812u,138442752u,67108864u}/* 1F79A */, /*28625*/{0,2144u,65537u,77080603u,40u,1610612768u,48820u,138442752u,67108864u}/* 1F79B */, /*28626*/{0,2144u,65537u,77080603u,40u,1610612768u,48828u,138442752u,67108864u}/* 1F79C */, /*28627*/{0,2144u,65537u,77080603u,40u,1610612768u,48836u,138442752u,67108864u}/* 1F79D */, /*28628*/{0,2144u,65537u,77080603u,40u,1610612768u,48844u,138442752u,67108864u}/* 1F79E */, /*28629*/{0,2144u,65537u,77080603u,40u,1610612768u,48852u,138442752u,67108864u}/* 1F79F */, /*28630*/{0,2144u,65537u,77080603u,40u,1610612768u,48860u,138442752u,67108864u}/* 1F7A0 */, /*28631*/{0,2144u,65537u,77080603u,40u,1610612768u,48868u,138442752u,67108864u}/* 1F7A1 */, /*28632*/{0,2144u,65537u,77080603u,40u,1610612768u,48876u,138442752u,67108864u}/* 1F7A2 */, /*28633*/{0,2144u,65537u,77080603u,40u,1610612768u,48884u,138442752u,67108864u}/* 1F7A3 */, /*28634*/{0,2144u,65537u,77080603u,40u,1610612768u,48892u,138442752u,67108864u}/* 1F7A4 */, /*28635*/{0,2144u,65537u,77080603u,40u,1610612768u,48900u,138442752u,67108864u}/* 1F7A5 */, /*28636*/{0,2144u,65537u,77080603u,40u,1610612768u,48908u,138442752u,67108864u}/* 1F7A6 */, /*28637*/{0,2144u,65537u,77080603u,40u,1610612768u,48916u,138442752u,67108864u}/* 1F7A7 */, /*28638*/{0,2144u,65537u,77080603u,40u,1610612768u,48924u,138442752u,67108864u}/* 1F7A8 */, /*28639*/{0,2144u,65537u,77080603u,40u,1610612768u,48932u,138442752u,67108864u}/* 1F7A9 */, /*28640*/{0,2144u,65537u,77080603u,40u,1610612768u,48940u,138442752u,67108864u}/* 1F7AA */, /*28641*/{0,2144u,65537u,77080603u,40u,1610612768u,48948u,138442752u,67108864u}/* 1F7AB */, /*28642*/{0,2144u,65537u,77080603u,40u,1610612768u,48956u,138442752u,67108864u}/* 1F7AC */, /*28643*/{0,2144u,65537u,77080603u,40u,1610612768u,48964u,138442752u,67108864u}/* 1F7AD */, /*28644*/{0,2144u,65537u,77080603u,40u,1610612768u,48972u,138442752u,67108864u}/* 1F7AE */, /*28645*/{0,2144u,65537u,77080603u,40u,1610612768u,48980u,138442752u,67108864u}/* 1F7AF */, /*28646*/{0,2144u,65537u,77080603u,40u,1610612768u,48988u,138442752u,67108864u}/* 1F7B0 */, /*28647*/{0,2144u,65537u,77080603u,40u,1610612768u,48996u,138442752u,67108864u}/* 1F7B1 */, /*28648*/{0,2144u,65537u,77080603u,40u,1610612768u,49004u,138442752u,67108864u}/* 1F7B2 */, /*28649*/{0,2144u,65537u,77080603u,40u,1610612768u,49012u,138442752u,67108864u}/* 1F7B3 */, /*28650*/{0,2144u,65537u,77080603u,40u,1610612768u,49020u,138442752u,67108864u}/* 1F7B4 */, /*28651*/{0,2144u,65537u,77080603u,40u,1610612768u,49028u,138442752u,67108864u}/* 1F7B5 */, /*28652*/{0,2144u,65537u,77080603u,40u,1610612768u,49036u,138442752u,67108864u}/* 1F7B6 */, /*28653*/{0,2144u,65537u,77080603u,40u,1610612768u,49044u,138442752u,67108864u}/* 1F7B7 */, /*28654*/{0,2144u,65537u,77080603u,40u,1610612768u,49052u,138442752u,67108864u}/* 1F7B8 */, /*28655*/{0,2144u,65537u,77080603u,40u,1610612768u,49060u,138442752u,67108864u}/* 1F7B9 */, /*28656*/{0,2144u,65537u,77080603u,40u,1610612768u,49068u,138442752u,67108864u}/* 1F7BA */, /*28657*/{0,2144u,65537u,77080603u,40u,1610612768u,49076u,138442752u,67108864u}/* 1F7BB */, /*28658*/{0,2144u,65537u,77080603u,40u,1610612768u,49084u,138442752u,67108864u}/* 1F7BC */, /*28659*/{0,2144u,65537u,77080603u,40u,1610612768u,49092u,138442752u,67108864u}/* 1F7BD */, /*28660*/{0,2144u,65537u,77080603u,40u,1610612768u,49100u,138442752u,67108864u}/* 1F7BE */, /*28661*/{0,2144u,65537u,77080603u,40u,1610612768u,49108u,138442752u,67108864u}/* 1F7BF */, /*28662*/{0,2144u,65537u,77080603u,40u,1610612768u,49116u,138442752u,67108864u}/* 1F7C0 */, /*28663*/{0,2144u,65537u,77080603u,40u,1610612768u,49124u,138442752u,67108864u}/* 1F7C1 */, /*28664*/{0,2144u,65537u,77080603u,40u,1610612768u,49132u,138442752u,67108864u}/* 1F7C2 */, /*28665*/{0,2144u,65537u,77080603u,40u,1610612768u,49140u,138442752u,67108864u}/* 1F7C3 */, /*28666*/{0,2144u,65537u,77080603u,40u,1610612768u,49148u,138442752u,67108864u}/* 1F7C4 */, /*28667*/{0,2144u,65537u,77080603u,40u,1610612768u,49156u,138442752u,67108864u}/* 1F7C5 */, /*28668*/{0,2144u,65537u,77080603u,40u,1610612768u,49164u,138442752u,67108864u}/* 1F7C6 */, /*28669*/{0,2144u,65537u,77080603u,40u,1610612768u,49172u,138442752u,67108864u}/* 1F7C7 */, /*28670*/{0,2144u,65537u,77080603u,40u,1610612768u,49180u,138442752u,67108864u}/* 1F7C8 */, /*28671*/{0,2144u,65537u,77080603u,40u,1610612768u,49188u,138442752u,67108864u}/* 1F7C9 */, /*28672*/{0,2144u,65537u,77080603u,40u,1610612768u,49196u,138442752u,67108864u}/* 1F7CA */, /*28673*/{0,2144u,65537u,77080603u,40u,1610612768u,49204u,138442752u,67108864u}/* 1F7CB */, /*28674*/{0,2144u,65537u,77080603u,40u,1610612768u,49212u,138442752u,67108864u}/* 1F7CC */, /*28675*/{0,2144u,65537u,77080603u,40u,1610612768u,49220u,138442752u,67108864u}/* 1F7CD */, /*28676*/{0,2144u,65537u,77080603u,40u,1610612768u,49228u,138442752u,67108864u}/* 1F7CE */, /*28677*/{0,2144u,65537u,77080603u,40u,1610612768u,49236u,138442752u,67108864u}/* 1F7CF */, /*28678*/{0,2144u,65537u,77080603u,40u,1610612768u,49244u,138442752u,67108864u}/* 1F7D0 */, /*28679*/{0,2144u,65537u,77080603u,40u,1610612768u,49252u,138442752u,67108864u}/* 1F7D1 */, /*28680*/{0,2144u,65537u,77080603u,40u,1610612768u,49260u,138442752u,67108864u}/* 1F7D2 */, /*28681*/{0,2144u,65537u,77080603u,40u,1610612768u,49268u,138442752u,67108864u}/* 1F7D3 */, /*28682*/{0,2144u,65537u,77080603u,40u,1610612768u,49276u,138442752u,67108864u}/* 1F7D4 */, /*28683*/{0,2152u,65537u,77080603u,40u,1610612768u,49284u,138442752u,67108864u}/* 1F800 */, /*28684*/{0,2152u,65537u,77080603u,40u,1610612768u,49292u,138442752u,67108864u}/* 1F801 */, /*28685*/{0,2152u,65537u,77080603u,40u,1610612768u,49300u,138442752u,67108864u}/* 1F802 */, /*28686*/{0,2152u,65537u,77080603u,40u,1610612768u,49308u,138442752u,67108864u}/* 1F803 */, /*28687*/{0,2152u,65537u,77080603u,40u,1610612768u,49316u,138442752u,67108864u}/* 1F804 */, /*28688*/{0,2152u,65537u,77080603u,40u,1610612768u,49324u,138442752u,67108864u}/* 1F805 */, /*28689*/{0,2152u,65537u,77080603u,40u,1610612768u,49332u,138442752u,67108864u}/* 1F806 */, /*28690*/{0,2152u,65537u,77080603u,40u,1610612768u,49340u,138442752u,67108864u}/* 1F807 */, /*28691*/{0,2152u,65537u,77080603u,40u,1610612768u,49348u,138442752u,67108864u}/* 1F808 */, /*28692*/{0,2152u,65537u,77080603u,40u,1610612768u,49356u,138442752u,67108864u}/* 1F809 */, /*28693*/{0,2152u,65537u,77080603u,40u,1610612768u,49364u,138442752u,67108864u}/* 1F80A */, /*28694*/{0,2152u,65537u,77080603u,40u,1610612768u,49372u,138442752u,67108864u}/* 1F80B */, /*28695*/{0,2152u,65537u,77080603u,40u,1610612768u,49380u,138442752u,67108864u}/* 1F810 */, /*28696*/{0,2152u,65537u,77080603u,40u,1610612768u,49388u,138442752u,67108864u}/* 1F811 */, /*28697*/{0,2152u,65537u,77080603u,40u,1610612768u,49396u,138442752u,67108864u}/* 1F812 */, /*28698*/{0,2152u,65537u,77080603u,40u,1610612768u,49404u,138442752u,67108864u}/* 1F813 */, /*28699*/{0,2152u,65537u,77080603u,40u,1610612768u,49412u,138442752u,67108864u}/* 1F814 */, /*28700*/{0,2152u,65537u,77080603u,40u,1610612768u,49420u,138442752u,67108864u}/* 1F815 */, /*28701*/{0,2152u,65537u,77080603u,40u,1610612768u,49428u,138442752u,67108864u}/* 1F816 */, /*28702*/{0,2152u,65537u,77080603u,40u,1610612768u,49436u,138442752u,67108864u}/* 1F817 */, /*28703*/{0,2152u,65537u,77080603u,40u,1610612768u,49444u,138442752u,67108864u}/* 1F818 */, /*28704*/{0,2152u,65537u,77080603u,40u,1610612768u,49452u,138442752u,67108864u}/* 1F819 */, /*28705*/{0,2152u,65537u,77080603u,40u,1610612768u,49460u,138442752u,67108864u}/* 1F81A */, /*28706*/{0,2152u,65537u,77080603u,40u,1610612768u,49468u,138442752u,67108864u}/* 1F81B */, /*28707*/{0,2152u,65537u,77080603u,40u,1610612768u,49476u,138442752u,67108864u}/* 1F81C */, /*28708*/{0,2152u,65537u,77080603u,40u,1610612768u,49484u,138442752u,67108864u}/* 1F81D */, /*28709*/{0,2152u,65537u,77080603u,40u,1610612768u,49492u,138442752u,67108864u}/* 1F81E */, /*28710*/{0,2152u,65537u,77080603u,40u,1610612768u,49500u,138442752u,67108864u}/* 1F81F */, /*28711*/{0,2152u,65537u,77080603u,40u,1610612768u,49508u,138442752u,67108864u}/* 1F820 */, /*28712*/{0,2152u,65537u,77080603u,40u,1610612768u,49516u,138442752u,67108864u}/* 1F821 */, /*28713*/{0,2152u,65537u,77080603u,40u,1610612768u,49524u,138442752u,67108864u}/* 1F822 */, /*28714*/{0,2152u,65537u,77080603u,40u,1610612768u,49532u,138442752u,67108864u}/* 1F823 */, /*28715*/{0,2152u,65537u,77080603u,40u,1610612768u,49540u,138442752u,67108864u}/* 1F824 */, /*28716*/{0,2152u,65537u,77080603u,40u,1610612768u,49548u,138442752u,67108864u}/* 1F825 */, /*28717*/{0,2152u,65537u,77080603u,40u,1610612768u,49556u,138442752u,67108864u}/* 1F826 */, /*28718*/{0,2152u,65537u,77080603u,40u,1610612768u,49564u,138442752u,67108864u}/* 1F827 */, /*28719*/{0,2152u,65537u,77080603u,40u,1610612768u,49572u,138442752u,67108864u}/* 1F828 */, /*28720*/{0,2152u,65537u,77080603u,40u,1610612768u,49580u,138442752u,67108864u}/* 1F829 */, /*28721*/{0,2152u,65537u,77080603u,40u,1610612768u,49588u,138442752u,67108864u}/* 1F82A */, /*28722*/{0,2152u,65537u,77080603u,40u,1610612768u,49596u,138442752u,67108864u}/* 1F82B */, /*28723*/{0,2152u,65537u,77080603u,40u,1610612768u,49604u,138442752u,67108864u}/* 1F82C */, /*28724*/{0,2152u,65537u,77080603u,40u,1610612768u,49612u,138442752u,67108864u}/* 1F82D */, /*28725*/{0,2152u,65537u,77080603u,40u,1610612768u,49620u,138442752u,67108864u}/* 1F82E */, /*28726*/{0,2152u,65537u,77080603u,40u,1610612768u,49628u,138442752u,67108864u}/* 1F82F */, /*28727*/{0,2152u,65537u,77080603u,40u,1610612768u,49636u,138442752u,67108864u}/* 1F830 */, /*28728*/{0,2152u,65537u,77080603u,40u,1610612768u,49644u,138442752u,67108864u}/* 1F831 */, /*28729*/{0,2152u,65537u,77080603u,40u,1610612768u,49652u,138442752u,67108864u}/* 1F832 */, /*28730*/{0,2152u,65537u,77080603u,40u,1610612768u,49660u,138442752u,67108864u}/* 1F833 */, /*28731*/{0,2152u,65537u,77080603u,40u,1610612768u,49668u,138442752u,67108864u}/* 1F834 */, /*28732*/{0,2152u,65537u,77080603u,40u,1610612768u,49676u,138442752u,67108864u}/* 1F835 */, /*28733*/{0,2152u,65537u,77080603u,40u,1610612768u,49684u,138442752u,67108864u}/* 1F836 */, /*28734*/{0,2152u,65537u,77080603u,40u,1610612768u,49692u,138442752u,67108864u}/* 1F837 */, /*28735*/{0,2152u,65537u,77080603u,40u,1610612768u,49700u,138442752u,67108864u}/* 1F838 */, /*28736*/{0,2152u,65537u,77080603u,40u,1610612768u,49708u,138442752u,67108864u}/* 1F839 */, /*28737*/{0,2152u,65537u,77080603u,40u,1610612768u,49716u,138442752u,67108864u}/* 1F83A */, /*28738*/{0,2152u,65537u,77080603u,40u,1610612768u,49724u,138442752u,67108864u}/* 1F83B */, /*28739*/{0,2152u,65537u,77080603u,40u,1610612768u,49732u,138442752u,67108864u}/* 1F83C */, /*28740*/{0,2152u,65537u,77080603u,40u,1610612768u,49740u,138442752u,67108864u}/* 1F83D */, /*28741*/{0,2152u,65537u,77080603u,40u,1610612768u,49748u,138442752u,67108864u}/* 1F83E */, /*28742*/{0,2152u,65537u,77080603u,40u,1610612768u,49756u,138442752u,67108864u}/* 1F83F */, /*28743*/{0,2152u,65537u,77080603u,40u,1610612768u,49764u,138442752u,67108864u}/* 1F840 */, /*28744*/{0,2152u,65537u,77080603u,40u,1610612768u,49772u,138442752u,67108864u}/* 1F841 */, /*28745*/{0,2152u,65537u,77080603u,40u,1610612768u,49780u,138442752u,67108864u}/* 1F842 */, /*28746*/{0,2152u,65537u,77080603u,40u,1610612768u,49788u,138442752u,67108864u}/* 1F843 */, /*28747*/{0,2152u,65537u,77080603u,40u,1610612768u,49796u,138442752u,67108864u}/* 1F844 */, /*28748*/{0,2152u,65537u,77080603u,40u,1610612768u,49804u,138442752u,67108864u}/* 1F845 */, /*28749*/{0,2152u,65537u,77080603u,40u,1610612768u,49812u,138442752u,67108864u}/* 1F846 */, /*28750*/{0,2152u,65537u,77080603u,40u,1610612768u,49820u,138442752u,67108864u}/* 1F847 */, /*28751*/{0,2152u,65537u,77080603u,40u,1610612768u,49828u,138442752u,67108864u}/* 1F850 */, /*28752*/{0,2152u,65537u,77080603u,40u,1610612768u,49836u,138442752u,67108864u}/* 1F851 */, /*28753*/{0,2152u,65537u,77080603u,40u,1610612768u,49844u,138442752u,67108864u}/* 1F852 */, /*28754*/{0,2152u,65537u,77080603u,40u,1610612768u,49852u,138442752u,67108864u}/* 1F853 */, /*28755*/{0,2152u,65537u,77080603u,40u,1610612768u,49860u,138442752u,67108864u}/* 1F854 */, /*28756*/{0,2152u,65537u,77080603u,40u,1610612768u,49868u,138442752u,67108864u}/* 1F855 */, /*28757*/{0,2152u,65537u,77080603u,40u,1610612768u,49876u,138442752u,67108864u}/* 1F856 */, /*28758*/{0,2152u,65537u,77080603u,40u,1610612768u,49884u,138442752u,67108864u}/* 1F857 */, /*28759*/{0,2152u,65537u,77080603u,40u,1610612768u,49892u,138442752u,67108864u}/* 1F858 */, /*28760*/{0,2152u,65537u,77080603u,40u,1610612768u,49900u,138442752u,67108864u}/* 1F859 */, /*28761*/{0,2152u,65537u,77080603u,40u,1610612768u,49908u,138442752u,67108864u}/* 1F860 */, /*28762*/{0,2152u,65537u,77080603u,40u,1610612768u,49916u,138442752u,67108864u}/* 1F861 */, /*28763*/{0,2152u,65537u,77080603u,40u,1610612768u,49924u,138442752u,67108864u}/* 1F862 */, /*28764*/{0,2152u,65537u,77080603u,40u,1610612768u,49932u,138442752u,67108864u}/* 1F863 */, /*28765*/{0,2152u,65537u,77080603u,40u,1610612768u,49940u,138442752u,67108864u}/* 1F864 */, /*28766*/{0,2152u,65537u,77080603u,40u,1610612768u,49948u,138442752u,67108864u}/* 1F865 */, /*28767*/{0,2152u,65537u,77080603u,40u,1610612768u,49956u,138442752u,67108864u}/* 1F866 */, /*28768*/{0,2152u,65537u,77080603u,40u,1610612768u,49964u,138442752u,67108864u}/* 1F867 */, /*28769*/{0,2152u,65537u,77080603u,40u,1610612768u,49972u,138442752u,67108864u}/* 1F868 */, /*28770*/{0,2152u,65537u,77080603u,40u,1610612768u,49980u,138442752u,67108864u}/* 1F869 */, /*28771*/{0,2152u,65537u,77080603u,40u,1610612768u,49988u,138442752u,67108864u}/* 1F86A */, /*28772*/{0,2152u,65537u,77080603u,40u,1610612768u,49996u,138442752u,67108864u}/* 1F86B */, /*28773*/{0,2152u,65537u,77080603u,40u,1610612768u,50004u,138442752u,67108864u}/* 1F86C */, /*28774*/{0,2152u,65537u,77080603u,40u,1610612768u,50012u,138442752u,67108864u}/* 1F86D */, /*28775*/{0,2152u,65537u,77080603u,40u,1610612768u,50020u,138442752u,67108864u}/* 1F86E */, /*28776*/{0,2152u,65537u,77080603u,40u,1610612768u,50028u,138442752u,67108864u}/* 1F86F */, /*28777*/{0,2152u,65537u,77080603u,40u,1610612768u,50036u,138442752u,67108864u}/* 1F870 */, /*28778*/{0,2152u,65537u,77080603u,40u,1610612768u,50044u,138442752u,67108864u}/* 1F871 */, /*28779*/{0,2152u,65537u,77080603u,40u,1610612768u,50052u,138442752u,67108864u}/* 1F872 */, /*28780*/{0,2152u,65537u,77080603u,40u,1610612768u,50060u,138442752u,67108864u}/* 1F873 */, /*28781*/{0,2152u,65537u,77080603u,40u,1610612768u,50068u,138442752u,67108864u}/* 1F874 */, /*28782*/{0,2152u,65537u,77080603u,40u,1610612768u,50076u,138442752u,67108864u}/* 1F875 */, /*28783*/{0,2152u,65537u,77080603u,40u,1610612768u,50084u,138442752u,67108864u}/* 1F876 */, /*28784*/{0,2152u,65537u,77080603u,40u,1610612768u,50092u,138442752u,67108864u}/* 1F877 */, /*28785*/{0,2152u,65537u,77080603u,40u,1610612768u,50100u,138442752u,67108864u}/* 1F878 */, /*28786*/{0,2152u,65537u,77080603u,40u,1610612768u,50108u,138442752u,67108864u}/* 1F879 */, /*28787*/{0,2152u,65537u,77080603u,40u,1610612768u,50116u,138442752u,67108864u}/* 1F87A */, /*28788*/{0,2152u,65537u,77080603u,40u,1610612768u,50124u,138442752u,67108864u}/* 1F87B */, /*28789*/{0,2152u,65537u,77080603u,40u,1610612768u,50132u,138442752u,67108864u}/* 1F87C */, /*28790*/{0,2152u,65537u,77080603u,40u,1610612768u,50140u,138442752u,67108864u}/* 1F87D */, /*28791*/{0,2152u,65537u,77080603u,40u,1610612768u,50148u,138442752u,67108864u}/* 1F87E */, /*28792*/{0,2152u,65537u,77080603u,40u,1610612768u,50156u,138442752u,67108864u}/* 1F87F */, /*28793*/{0,2152u,65537u,77080603u,40u,1610612768u,50164u,138442752u,67108864u}/* 1F880 */, /*28794*/{0,2152u,65537u,77080603u,40u,1610612768u,50172u,138442752u,67108864u}/* 1F881 */, /*28795*/{0,2152u,65537u,77080603u,40u,1610612768u,50180u,138442752u,67108864u}/* 1F882 */, /*28796*/{0,2152u,65537u,77080603u,40u,1610612768u,50188u,138442752u,67108864u}/* 1F883 */, /*28797*/{0,2152u,65537u,77080603u,40u,1610612768u,50196u,138442752u,67108864u}/* 1F884 */, /*28798*/{0,2152u,65537u,77080603u,40u,1610612768u,50204u,138442752u,67108864u}/* 1F885 */, /*28799*/{0,2152u,65537u,77080603u,40u,1610612768u,50212u,138442752u,67108864u}/* 1F886 */, /*28800*/{0,2152u,65537u,77080603u,40u,1610612768u,50220u,138442752u,67108864u}/* 1F887 */, /*28801*/{0,2152u,65537u,77080603u,40u,1610612768u,50228u,138442752u,67108864u}/* 1F890 */, /*28802*/{0,2152u,65537u,77080603u,40u,1610612768u,50236u,138442752u,67108864u}/* 1F891 */, /*28803*/{0,2152u,65537u,77080603u,40u,1610612768u,50244u,138442752u,67108864u}/* 1F892 */, /*28804*/{0,2152u,65537u,77080603u,40u,1610612768u,50252u,138442752u,67108864u}/* 1F893 */, /*28805*/{0,2152u,65537u,77080603u,40u,1610612768u,50260u,138442752u,67108864u}/* 1F894 */, /*28806*/{0,2152u,65537u,77080603u,40u,1610612768u,50268u,138442752u,67108864u}/* 1F895 */, /*28807*/{0,2152u,65537u,77080603u,40u,1610612768u,50276u,138442752u,67108864u}/* 1F896 */, /*28808*/{0,2152u,65537u,77080603u,40u,1610612768u,50284u,138442752u,67108864u}/* 1F897 */, /*28809*/{0,2152u,65537u,77080603u,40u,1610612768u,50292u,138442752u,67108864u}/* 1F898 */, /*28810*/{0,2152u,65537u,77080603u,40u,1610612768u,50300u,138442752u,67108864u}/* 1F899 */, /*28811*/{0,2152u,65537u,77080603u,40u,1610612768u,50308u,138442752u,67108864u}/* 1F89A */, /*28812*/{0,2152u,65537u,77080603u,40u,1610612768u,50316u,138442752u,67108864u}/* 1F89B */, /*28813*/{0,2152u,65537u,77080603u,40u,1610612768u,50324u,138442752u,67108864u}/* 1F89C */, /*28814*/{0,2152u,65537u,77080603u,40u,1610612768u,50332u,138442752u,67108864u}/* 1F89D */, /*28815*/{0,2152u,65537u,77080603u,40u,1610612768u,50340u,138442752u,67108864u}/* 1F89E */, /*28816*/{0,2152u,65537u,77080603u,40u,1610612768u,50348u,138442752u,67108864u}/* 1F89F */, /*28817*/{0,2152u,65537u,77080603u,40u,1610612768u,50356u,138442752u,67108864u}/* 1F8A0 */, /*28818*/{0,2152u,65537u,77080603u,40u,1610612768u,50364u,138442752u,67108864u}/* 1F8A1 */, /*28819*/{0,2152u,65537u,77080603u,40u,1610612768u,50372u,138442752u,67108864u}/* 1F8A2 */, /*28820*/{0,2152u,65537u,77080603u,40u,1610612768u,50380u,138442752u,67108864u}/* 1F8A3 */, /*28821*/{0,2152u,65537u,77080603u,40u,1610612768u,50388u,138442752u,67108864u}/* 1F8A4 */, /*28822*/{0,2152u,65537u,77080603u,40u,1610612768u,50396u,138442752u,67108864u}/* 1F8A5 */, /*28823*/{0,2152u,65537u,77080603u,40u,1610612768u,50404u,138442752u,67108864u}/* 1F8A6 */, /*28824*/{0,2152u,65537u,77080603u,40u,1610612768u,50412u,138442752u,67108864u}/* 1F8A7 */, /*28825*/{0,2152u,65537u,77080603u,40u,1610612768u,50420u,138442752u,67108864u}/* 1F8A8 */, /*28826*/{0,2152u,65537u,77080603u,40u,1610612768u,50428u,138442752u,67108864u}/* 1F8A9 */, /*28827*/{0,2152u,65537u,77080603u,40u,1610612768u,50436u,138442752u,67108864u}/* 1F8AA */, /*28828*/{0,2152u,65537u,77080603u,40u,1610612768u,50444u,138442752u,67108864u}/* 1F8AB */, /*28829*/{0,2152u,65537u,77080603u,40u,1610612768u,50452u,138442752u,67108864u}/* 1F8AC */, /*28830*/{0,2152u,65537u,77080603u,40u,1610612768u,50460u,138442752u,67108864u}/* 1F8AD */, /*28831*/{0,2160u,65537u,77178907u,40u,1610612768u,44612u,138442752u,67108864u}/* 1F900 */, /*28832*/{0,2160u,65537u,77178907u,40u,1610612768u,44620u,138442752u,67108864u}/* 1F901 */, /*28833*/{0,2160u,65537u,77178907u,40u,1610612768u,44628u,138442752u,67108864u}/* 1F902 */, /*28834*/{0,2160u,65537u,77178907u,40u,1610612768u,44636u,138442752u,67108864u}/* 1F903 */, /*28835*/{0,2160u,65537u,77178907u,40u,1610612768u,44644u,138442752u,67108864u}/* 1F904 */, /*28836*/{0,2160u,65537u,77178907u,40u,1610612768u,44652u,138442752u,67108864u}/* 1F905 */, /*28837*/{0,2160u,65537u,77178907u,40u,1610612768u,44660u,138442752u,67108864u}/* 1F906 */, /*28838*/{0,2160u,65537u,77178907u,40u,1610612768u,44668u,138442752u,67108864u}/* 1F907 */, /*28839*/{0,2160u,65537u,77178907u,40u,1610612768u,44676u,138442752u,67108864u}/* 1F908 */, /*28840*/{0,2160u,65537u,77178907u,40u,1610612768u,44684u,138442752u,67108864u}/* 1F909 */, /*28841*/{0,2160u,65537u,77178907u,40u,1610612768u,44692u,138442752u,67108864u}/* 1F90A */, /*28842*/{0,2160u,65537u,77178907u,40u,1610612768u,44700u,138442752u,67108864u}/* 1F90B */, /*28843*/{0,2163u,65537u,103327771u,8u,1610617120u,44708u,138442752u,67108864u}/* 1F910 */, /*28844*/{0,2163u,65537u,103327771u,8u,1610617120u,44716u,138442752u,67108864u}/* 1F911 */, /*28845*/{0,2163u,65537u,103327771u,8u,1610617120u,44724u,138442752u,67108864u}/* 1F912 */, /*28846*/{0,2163u,65537u,103327771u,8u,1610617120u,44732u,138442752u,67108864u}/* 1F913 */, /*28847*/{0,2163u,65537u,103327771u,8u,1610617120u,44740u,138442752u,67108864u}/* 1F914 */, /*28848*/{0,2163u,65537u,103327771u,8u,1610617120u,44748u,138442752u,67108864u}/* 1F915 */, /*28849*/{0,2163u,65537u,103327771u,8u,1610617120u,44756u,138442752u,67108864u}/* 1F916 */, /*28850*/{0,2163u,65537u,103327771u,8u,1610617120u,44764u,138442752u,67108864u}/* 1F917 */, /*28851*/{0,2163u,65537u,104376347u,1747058696u,1610617632u,44772u,138442752u,67108864u}/* 1F918 */, /*28852*/{0,2163u,65537u,104409115u,1747058696u,1610617632u,44780u,138442752u,67108864u}/* 1F919 */, /*28853*/{0,2163u,65537u,104409115u,1747058696u,1610617632u,44788u,138442752u,67108864u}/* 1F91A */, /*28854*/{0,2163u,65537u,104409115u,1747058696u,1610617632u,44796u,138442752u,67108864u}/* 1F91B */, /*28855*/{0,2163u,65537u,104409115u,1747058696u,1610617632u,44804u,138442752u,67108864u}/* 1F91C */, /*28856*/{0,2163u,65537u,103360539u,8u,1610617120u,44812u,138442752u,67108864u}/* 1F91D */, /*28857*/{0,2163u,65537u,104409115u,1747058696u,1610617632u,44820u,138442752u,67108864u}/* 1F91E */, /*28858*/{0,2163u,65537u,104441883u,1747058696u,1610617632u,44828u,138442752u,67108864u}/* 1F91F */, /*28859*/{0,2163u,65537u,103360539u,8u,1610617120u,44836u,138442752u,67108864u}/* 1F920 */, /*28860*/{0,2163u,65537u,103360539u,8u,1610617120u,44844u,138442752u,67108864u}/* 1F921 */, /*28861*/{0,2163u,65537u,103360539u,8u,1610617120u,44852u,138442752u,67108864u}/* 1F922 */, /*28862*/{0,2163u,65537u,103360539u,8u,1610617120u,44860u,138442752u,67108864u}/* 1F923 */, /*28863*/{0,2163u,65537u,103360539u,8u,1610617120u,44868u,138442752u,67108864u}/* 1F924 */, /*28864*/{0,2163u,65537u,103360539u,8u,1610617120u,44876u,138442752u,67108864u}/* 1F925 */, /*28865*/{0,2163u,65537u,104409115u,1747058696u,1610617632u,44884u,138442752u,67108864u}/* 1F926 */, /*28866*/{0,2163u,65537u,103360539u,8u,1610617120u,44892u,138442752u,67108864u}/* 1F927 */, /*28867*/{0,2163u,65537u,103393307u,8u,1610617120u,44900u,138442752u,67108864u}/* 1F928 */, /*28868*/{0,2163u,65537u,103393307u,8u,1610617120u,44908u,138442752u,67108864u}/* 1F929 */, /*28869*/{0,2163u,65537u,103393307u,8u,1610617120u,44916u,138442752u,67108864u}/* 1F92A */, /*28870*/{0,2163u,65537u,103393307u,8u,1610617120u,44924u,138442752u,67108864u}/* 1F92B */, /*28871*/{0,2163u,65537u,103393307u,8u,1610617120u,44932u,138442752u,67108864u}/* 1F92C */, /*28872*/{0,2163u,65537u,103393307u,8u,1610617120u,44940u,138442752u,67108864u}/* 1F92D */, /*28873*/{0,2163u,65537u,103393307u,8u,1610617120u,44948u,138442752u,67108864u}/* 1F92E */, /*28874*/{0,2163u,65537u,103393307u,8u,1610617120u,44956u,138442752u,67108864u}/* 1F92F */, /*28875*/{0,2163u,65537u,104409115u,1747058696u,1610617632u,44964u,138442752u,67108864u}/* 1F930 */, /*28876*/{0,2163u,65537u,104441883u,1747058696u,1610617632u,44972u,138442752u,67108864u}/* 1F931 */, /*28877*/{0,2163u,65537u,104441883u,1747058696u,1610617632u,44980u,138442752u,67108864u}/* 1F932 */, /*28878*/{0,2163u,65537u,104409115u,1747058696u,1610617632u,44988u,138442752u,67108864u}/* 1F933 */, /*28879*/{0,2163u,65537u,104409115u,1747058696u,1610617632u,44996u,138442752u,67108864u}/* 1F934 */, /*28880*/{0,2163u,65537u,104409115u,1747058696u,1610617632u,45004u,138442752u,67108864u}/* 1F935 */, /*28881*/{0,2163u,65537u,104409115u,1747058696u,1610617632u,45012u,138442752u,67108864u}/* 1F936 */, /*28882*/{0,2163u,65537u,104409115u,1747058696u,1610617632u,45020u,138442752u,67108864u}/* 1F937 */, /*28883*/{0,2163u,65537u,104409115u,1747058696u,1610617632u,45028u,138442752u,67108864u}/* 1F938 */, /*28884*/{0,2163u,65537u,104409115u,1747058696u,1610617632u,45036u,138442752u,67108864u}/* 1F939 */, /*28885*/{0,2163u,65537u,103360539u,8u,1610617120u,45044u,138442752u,67108864u}/* 1F93A */, /*28886*/{0,2163u,65537u,103360539u,40u,1610612768u,45052u,138442752u,67108864u}/* 1F93B */, /*28887*/{0,2163u,65537u,103360539u,8u,1610617120u,45060u,138442752u,67108864u}/* 1F93C */, /*28888*/{0,2163u,65537u,104409115u,1747058696u,1610617632u,45068u,138442752u,67108864u}/* 1F93D */, /*28889*/{0,2163u,65537u,104409115u,1747058696u,1610617632u,45076u,138442752u,67108864u}/* 1F93E */, /*28890*/{0,2163u,65537u,103360539u,8u,1610617120u,45084u,138442752u,67108864u}/* 1F940 */, /*28891*/{0,2163u,65537u,103360539u,8u,1610617120u,45092u,138442752u,67108864u}/* 1F941 */, /*28892*/{0,2163u,65537u,103360539u,8u,1610617120u,45100u,138442752u,67108864u}/* 1F942 */, /*28893*/{0,2163u,65537u,103360539u,8u,1610617120u,45108u,138442752u,67108864u}/* 1F943 */, /*28894*/{0,2163u,65537u,103360539u,8u,1610617120u,45116u,138442752u,67108864u}/* 1F944 */, /*28895*/{0,2163u,65537u,103360539u,8u,1610617120u,45124u,138442752u,67108864u}/* 1F945 */, /*28896*/{0,2163u,65537u,103360539u,40u,1610612768u,45132u,138442752u,67108864u}/* 1F946 */, /*28897*/{0,2163u,65537u,103360539u,8u,1610617120u,45140u,138442752u,67108864u}/* 1F947 */, /*28898*/{0,2163u,65537u,103360539u,8u,1610617120u,45148u,138442752u,67108864u}/* 1F948 */, /*28899*/{0,2163u,65537u,103360539u,8u,1610617120u,45156u,138442752u,67108864u}/* 1F949 */, /*28900*/{0,2163u,65537u,103360539u,8u,1610617120u,45164u,138442752u,67108864u}/* 1F94A */, /*28901*/{0,2163u,65537u,103360539u,8u,1610617120u,45172u,138442752u,67108864u}/* 1F94B */, /*28902*/{0,2163u,65537u,103393307u,8u,1610617120u,45180u,138442752u,67108864u}/* 1F94C */, /*28903*/{0,2163u,65537u,103360539u,8u,1610617120u,45188u,138442752u,67108864u}/* 1F950 */, /*28904*/{0,2163u,65537u,103360539u,8u,1610617120u,45196u,138442752u,67108864u}/* 1F951 */, /*28905*/{0,2163u,65537u,103360539u,8u,1610617120u,45204u,138442752u,67108864u}/* 1F952 */, /*28906*/{0,2163u,65537u,103360539u,8u,1610617120u,45212u,138442752u,67108864u}/* 1F953 */, /*28907*/{0,2163u,65537u,103360539u,8u,1610617120u,45220u,138442752u,67108864u}/* 1F954 */, /*28908*/{0,2163u,65537u,103360539u,8u,1610617120u,45228u,138442752u,67108864u}/* 1F955 */, /*28909*/{0,2163u,65537u,103360539u,8u,1610617120u,45236u,138442752u,67108864u}/* 1F956 */, /*28910*/{0,2163u,65537u,103360539u,8u,1610617120u,45244u,138442752u,67108864u}/* 1F957 */, /*28911*/{0,2163u,65537u,103360539u,8u,1610617120u,45252u,138442752u,67108864u}/* 1F958 */, /*28912*/{0,2163u,65537u,103360539u,8u,1610617120u,45260u,138442752u,67108864u}/* 1F959 */, /*28913*/{0,2163u,65537u,103360539u,8u,1610617120u,45268u,138442752u,67108864u}/* 1F95A */, /*28914*/{0,2163u,65537u,103360539u,8u,1610617120u,45276u,138442752u,67108864u}/* 1F95B */, /*28915*/{0,2163u,65537u,103360539u,8u,1610617120u,45284u,138442752u,67108864u}/* 1F95C */, /*28916*/{0,2163u,65537u,103360539u,8u,1610617120u,45292u,138442752u,67108864u}/* 1F95D */, /*28917*/{0,2163u,65537u,103360539u,8u,1610617120u,45300u,138442752u,67108864u}/* 1F95E */, /*28918*/{0,2163u,65537u,103393307u,8u,1610617120u,45308u,138442752u,67108864u}/* 1F95F */, /*28919*/{0,2163u,65537u,103393307u,8u,1610617120u,45316u,138442752u,67108864u}/* 1F960 */, /*28920*/{0,2163u,65537u,103393307u,8u,1610617120u,45324u,138442752u,67108864u}/* 1F961 */, /*28921*/{0,2163u,65537u,103393307u,8u,1610617120u,45332u,138442752u,67108864u}/* 1F962 */, /*28922*/{0,2163u,65537u,103393307u,8u,1610617120u,45340u,138442752u,67108864u}/* 1F963 */, /*28923*/{0,2163u,65537u,103393307u,8u,1610617120u,45348u,138442752u,67108864u}/* 1F964 */, /*28924*/{0,2163u,65537u,103393307u,8u,1610617120u,45356u,138442752u,67108864u}/* 1F965 */, /*28925*/{0,2163u,65537u,103393307u,8u,1610617120u,45364u,138442752u,67108864u}/* 1F966 */, /*28926*/{0,2163u,65537u,103393307u,8u,1610617120u,45372u,138442752u,67108864u}/* 1F967 */, /*28927*/{0,2163u,65537u,103393307u,8u,1610617120u,45380u,138442752u,67108864u}/* 1F968 */, /*28928*/{0,2163u,65537u,103393307u,8u,1610617120u,45388u,138442752u,67108864u}/* 1F969 */, /*28929*/{0,2163u,65537u,103393307u,8u,1610617120u,45396u,138442752u,67108864u}/* 1F96A */, /*28930*/{0,2163u,65537u,103393307u,8u,1610617120u,45404u,138442752u,67108864u}/* 1F96B */, /*28931*/{0,2163u,65537u,103327771u,8u,1610617120u,45412u,138442752u,67108864u}/* 1F980 */, /*28932*/{0,2163u,65537u,103327771u,8u,1610617120u,45420u,138442752u,67108864u}/* 1F981 */, /*28933*/{0,2163u,65537u,103327771u,8u,1610617120u,45428u,138442752u,67108864u}/* 1F982 */, /*28934*/{0,2163u,65537u,103327771u,8u,1610617120u,45436u,138442752u,67108864u}/* 1F983 */, /*28935*/{0,2163u,65537u,103327771u,8u,1610617120u,45444u,138442752u,67108864u}/* 1F984 */, /*28936*/{0,2163u,65537u,103360539u,8u,1610617120u,45452u,138442752u,67108864u}/* 1F985 */, /*28937*/{0,2163u,65537u,103360539u,8u,1610617120u,45460u,138442752u,67108864u}/* 1F986 */, /*28938*/{0,2163u,65537u,103360539u,8u,1610617120u,45468u,138442752u,67108864u}/* 1F987 */, /*28939*/{0,2163u,65537u,103360539u,8u,1610617120u,45476u,138442752u,67108864u}/* 1F988 */, /*28940*/{0,2163u,65537u,103360539u,8u,1610617120u,45484u,138442752u,67108864u}/* 1F989 */, /*28941*/{0,2163u,65537u,103360539u,8u,1610617120u,45492u,138442752u,67108864u}/* 1F98A */, /*28942*/{0,2163u,65537u,103360539u,8u,1610617120u,45500u,138442752u,67108864u}/* 1F98B */, /*28943*/{0,2163u,65537u,103360539u,8u,1610617120u,45508u,138442752u,67108864u}/* 1F98C */, /*28944*/{0,2163u,65537u,103360539u,8u,1610617120u,45516u,138442752u,67108864u}/* 1F98D */, /*28945*/{0,2163u,65537u,103360539u,8u,1610617120u,45524u,138442752u,67108864u}/* 1F98E */, /*28946*/{0,2163u,65537u,103360539u,8u,1610617120u,45532u,138442752u,67108864u}/* 1F98F */, /*28947*/{0,2163u,65537u,103360539u,8u,1610617120u,45540u,138442752u,67108864u}/* 1F990 */, /*28948*/{0,2163u,65537u,103360539u,8u,1610617120u,45548u,138442752u,67108864u}/* 1F991 */, /*28949*/{0,2163u,65537u,103393307u,8u,1610617120u,45556u,138442752u,67108864u}/* 1F992 */, /*28950*/{0,2163u,65537u,103393307u,8u,1610617120u,45564u,138442752u,67108864u}/* 1F993 */, /*28951*/{0,2163u,65537u,103393307u,8u,1610617120u,45572u,138442752u,67108864u}/* 1F994 */, /*28952*/{0,2163u,65537u,103393307u,8u,1610617120u,45580u,138442752u,67108864u}/* 1F995 */, /*28953*/{0,2163u,65537u,103393307u,8u,1610617120u,45588u,138442752u,67108864u}/* 1F996 */, /*28954*/{0,2163u,65537u,103393307u,8u,1610617120u,45596u,138442752u,67108864u}/* 1F997 */, /*28955*/{0,2163u,65537u,103327771u,8u,1610617120u,45604u,138442752u,67108864u}/* 1F9C0 */, /*28956*/{0,2163u,65537u,103393307u,8u,1610617120u,45612u,138442752u,67108864u}/* 1F9D0 */, /*28957*/{0,2163u,65537u,104441883u,1747058696u,1610617632u,45620u,138442752u,67108864u}/* 1F9D1 */, /*28958*/{0,2163u,65537u,104441883u,1747058696u,1610617632u,45628u,138442752u,67108864u}/* 1F9D2 */, /*28959*/{0,2163u,65537u,104441883u,1747058696u,1610617632u,45636u,138442752u,67108864u}/* 1F9D3 */, /*28960*/{0,2163u,65537u,104441883u,1747058696u,1610617632u,45644u,138442752u,67108864u}/* 1F9D4 */, /*28961*/{0,2163u,65537u,104441883u,1747058696u,1610617632u,45652u,138442752u,67108864u}/* 1F9D5 */, /*28962*/{0,2163u,65537u,104441883u,1747058696u,1610617632u,45660u,138442752u,67108864u}/* 1F9D6 */, /*28963*/{0,2163u,65537u,104441883u,1747058696u,1610617632u,45668u,138442752u,67108864u}/* 1F9D7 */, /*28964*/{0,2163u,65537u,104441883u,1747058696u,1610617632u,45676u,138442752u,67108864u}/* 1F9D8 */, /*28965*/{0,2163u,65537u,104441883u,1747058696u,1610617632u,45684u,138442752u,67108864u}/* 1F9D9 */, /*28966*/{0,2163u,65537u,104441883u,1747058696u,1610617632u,45692u,138442752u,67108864u}/* 1F9DA */, /*28967*/{0,2163u,65537u,104441883u,1747058696u,1610617632u,45700u,138442752u,67108864u}/* 1F9DB */, /*28968*/{0,2163u,65537u,104441883u,1747058696u,1610617632u,45708u,138442752u,67108864u}/* 1F9DC */, /*28969*/{0,2163u,65537u,104441883u,1747058696u,1610617632u,45716u,138442752u,67108864u}/* 1F9DD */, /*28970*/{0,2163u,65537u,103393307u,8u,1610617120u,45724u,138442752u,67108864u}/* 1F9DE */, /*28971*/{0,2163u,65537u,103393307u,8u,1610617120u,45732u,138442752u,67108864u}/* 1F9DF */, /*28972*/{0,2163u,65537u,103393307u,8u,1610617120u,45740u,138442752u,67108864u}/* 1F9E0 */, /*28973*/{0,2163u,65537u,103393307u,8u,1610617120u,45748u,138442752u,67108864u}/* 1F9E1 */, /*28974*/{0,2163u,65537u,103393307u,8u,1610617120u,45756u,138442752u,67108864u}/* 1F9E2 */, /*28975*/{0,2163u,65537u,103393307u,8u,1610617120u,45764u,138442752u,67108864u}/* 1F9E3 */, /*28976*/{0,2163u,65537u,103393307u,8u,1610617120u,45772u,138442752u,67108864u}/* 1F9E4 */, /*28977*/{0,2163u,65537u,103393307u,8u,1610617120u,45780u,138442752u,67108864u}/* 1F9E5 */, /*28978*/{0,2163u,65537u,103393307u,8u,1610617120u,45788u,138442752u,67108864u}/* 1F9E6 */, /*28979*/{0,2171u,2359297u,102924293u,73768u,3758096416u,1946157060u,6144u,4587520u}/* 20000 */, /*28980*/{0,2171u,740560385u,102924293u,8462378u,3758096416u,1946157060u,6144u,4587520u}/* 20001 */, /*28981*/{0,2171u,639897601u,102924293u,8462378u,3758096416u,1946157060u,6144u,4587520u}/* 20064 */, /*28982*/{0,2171u,673451009u,102924293u,8462378u,3758096416u,1946157060u,6144u,4587520u}/* 20121 */, /*28983*/{0,2171u,539231745u,102924293u,8462378u,3758096416u,1946157060u,6144u,4587520u}/* 2092A */, /*28984*/{0,2171u,1160003585u,102924293u,8462378u,3758096416u,1946157060u,6144u,4587520u}/* 20983 */, /*28985*/{0,2171u,1327780865u,102924293u,8462378u,3758096416u,1946157060u,6144u,4587520u}/* 2098C */, /*28986*/{0,2171u,707008001u,102924293u,8462378u,3758096416u,1946157060u,6144u,4587520u}/* 20AEA */, /*28987*/{0,2171u,606341121u,102924293u,8462378u,3758096416u,1946157060u,6144u,4587520u}/* 20AFD */, /*28988*/{0,2171u,572787201u,102924293u,8462378u,3758096416u,1946157060u,6144u,4587520u}/* 22390 */, /*28989*/{0,2179u,2359297u,103120901u,73768u,3758096416u,1946157060u,6144u,4587520u}/* 2A700 */, /*28990*/{0,2187u,2359297u,103153669u,73768u,3758096416u,1946157060u,6144u,4587520u}/* 2B740 */, /*28991*/{0,2195u,2359297u,103317509u,73768u,3758096416u,1946157060u,6144u,4587520u}/* 2B820 */, /*28992*/{0,2203u,2359297u,103383045u,73768u,3758096416u,1946157060u,6144u,4587520u}/* 2CEB0 */, /*28993*/{2716336128u,2211u,2359296u,102924325u,73728u,3758620768u,1947094004u,138436608u,393216u}/* 2F800 */, /*28994*/{2716860416u,2211u,2359296u,102924325u,73728u,3758620768u,1947093964u,138436608u,393216u}/* 2F801 */, /*28995*/{2717384704u,2211u,2359296u,102924325u,73728u,3758620768u,1947094036u,138436608u,393216u}/* 2F802 */, /*28996*/{2717908992u,2211u,2359296u,102924325u,73728u,3758620768u,1946936636u,138436608u,393216u}/* 2F803 */, /*28997*/{2718433280u,2211u,2359296u,102924325u,73728u,3758620768u,1947096332u,138436608u,393216u}/* 2F804 */, /*28998*/{2718957568u,2211u,2359296u,102924325u,73728u,3758620768u,1947096956u,138436608u,393216u}/* 2F805 */, /*28999*/{2719481856u,2211u,2359296u,102924325u,73728u,3758620768u,1947097060u,138436608u,393216u}/* 2F806 */, /*29000*/{2720006144u,2211u,2359296u,102924325u,73728u,3758620768u,1947097628u,138436608u,393216u}/* 2F807 */, /*29001*/{2720530432u,2211u,2359296u,102924325u,73728u,3758620768u,1947098588u,138436608u,393216u}/* 2F808 */, /*29002*/{2721054720u,2211u,2359296u,102924325u,73728u,3758620768u,1947098836u,138436608u,393216u}/* 2F809 */, /*29003*/{2721579008u,2211u,2359296u,102924325u,73728u,3758620768u,1947099460u,138436608u,393216u}/* 2F80A */, /*29004*/{2722103296u,2211u,2359296u,102924325u,73728u,3758620768u,1947099268u,138436608u,393216u}/* 2F80B */, /*29005*/{2722627584u,2211u,2359296u,102924325u,73728u,3758620768u,1947042044u,138436608u,393216u}/* 2F80C */, /*29006*/{2723151872u,2211u,2359296u,102924325u,73728u,3758620768u,1946947068u,138436608u,393216u}/* 2F80D */, /*29007*/{2723676160u,2211u,2359296u,102924325u,73728u,3758620768u,1947100276u,138436608u,393216u}/* 2F80E */, /*29008*/{2724200448u,2211u,2359296u,102924325u,73728u,3758620768u,1947100332u,138436608u,393216u}/* 2F80F */, /*29009*/{2724724736u,2211u,2359296u,102924325u,73728u,3758620768u,1947100460u,138436608u,393216u}/* 2F810 */, /*29010*/{2725249024u,2211u,2359296u,102924325u,73728u,3758620768u,1947100612u,138436608u,393216u}/* 2F811 */, /*29011*/{2725773312u,2211u,2359296u,102924325u,73728u,3758620768u,1946944780u,138436608u,393216u}/* 2F812 */, /*29012*/{2726297600u,2211u,2359296u,102924325u,73728u,3758620768u,1947042260u,138436608u,393216u}/* 2F813 */, /*29013*/{2726821888u,2211u,2359296u,102924325u,73728u,3758620768u,1947100484u,138436608u,393216u}/* 2F814 */, /*29014*/{2727346176u,2211u,2359296u,102924325u,73728u,3758620768u,1947100788u,138436608u,393216u}/* 2F815 */, /*29015*/{2727870464u,2211u,2359296u,102924325u,73728u,3758620768u,1946945156u,138436608u,393216u}/* 2F816 */, /*29016*/{2728394752u,2211u,2359296u,102924325u,73728u,3758620768u,1947100868u,138436608u,393216u}/* 2F817 */, /*29017*/{2728919040u,2211u,2359296u,102924325u,73728u,3758620768u,1947100972u,138436608u,393216u}/* 2F818 */, /*29018*/{2729443328u,2211u,2359296u,102924325u,73728u,3758620768u,1947095148u,138436608u,393216u}/* 2F819 */, /*29019*/{2729967616u,2211u,2359296u,102924325u,73728u,3758620768u,1947101036u,138436608u,393216u}/* 2F81A */, /*29020*/{2730491904u,2211u,2359296u,102924325u,73728u,3758620768u,1947101108u,138436608u,393216u}/* 2F81B */, /*29021*/{2731016192u,2211u,2359296u,102924325u,73728u,3758620768u,1946970924u,138436608u,393216u}/* 2F81C */, /*29022*/{2731540480u,2211u,2359296u,102924325u,73728u,3758620768u,1947101620u,138436608u,393216u}/* 2F81D */, /*29023*/{2732064768u,2211u,2359296u,102924325u,73728u,3758620768u,1947101732u,138436608u,393216u}/* 2F81E */, /*29024*/{2732589056u,2211u,2359296u,102924325u,73728u,3758620768u,1947042564u,138436608u,393216u}/* 2F81F */, /*29025*/{2733113344u,2211u,2359296u,102924325u,73728u,3758620768u,1947102180u,138436608u,393216u}/* 2F820 */, /*29026*/{2733637632u,2211u,2359296u,102924325u,73728u,3758620768u,1947102268u,138436608u,393216u}/* 2F821 */, /*29027*/{2734161920u,2211u,2359296u,102924325u,73728u,3758620768u,1947102620u,138436608u,393216u}/* 2F822 */, /*29028*/{2734686208u,2211u,2359296u,102924325u,73728u,3758620768u,1947102660u,138436608u,393216u}/* 2F823 */, /*29029*/{2735210496u,2211u,2359296u,102924325u,73728u,3758620768u,1947042996u,138436608u,393216u}/* 2F824 */, /*29030*/{2735734784u,2211u,2359296u,102924325u,73728u,3758620768u,1947103300u,138436608u,393216u}/* 2F825 */, /*29031*/{2736259072u,2211u,2359296u,102924325u,73728u,3758620768u,1947103316u,138436608u,393216u}/* 2F826 */, /*29032*/{2736783360u,2211u,2359296u,102924325u,73728u,3758620768u,1947103532u,138436608u,393216u}/* 2F827 */, /*29033*/{2737307648u,2211u,2359296u,102924325u,73728u,3758620768u,1947103708u,138436608u,393216u}/* 2F828 */, /*29034*/{2737831936u,2211u,2359296u,102924325u,73728u,3758620768u,1947103796u,138436608u,393216u}/* 2F829 */, /*29035*/{2738356224u,2211u,2359296u,102924325u,73728u,3758620768u,1947103804u,138436608u,393216u}/* 2F82A */, /*29036*/{2738880512u,2211u,2359296u,102924325u,73728u,3758620768u,1947103940u,138436608u,393216u}/* 2F82B */, /*29037*/{2739404800u,2211u,2359296u,102924325u,73728u,3758620768u,1947104340u,138436608u,393216u}/* 2F82C */, /*29038*/{2739929088u,2211u,2359296u,102924325u,73728u,3758620768u,1947104404u,138436608u,393216u}/* 2F82D */, /*29039*/{2740453376u,2211u,2359296u,102924325u,73728u,3758620768u,1947104476u,138436608u,393216u}/* 2F82E */, /*29040*/{2740977664u,2211u,2359296u,102924325u,73728u,3758620768u,1947104676u,138436608u,393216u}/* 2F82F */, /*29041*/{2741501952u,2211u,2359296u,102924325u,73728u,3758620768u,1947104756u,138436608u,393216u}/* 2F830 */, /*29042*/{2742026240u,2211u,2359296u,102924325u,73728u,3758620768u,1947104772u,138436608u,393216u}/* 2F831 */, /*29043*/{2742550528u,2211u,2359296u,102924325u,73728u,3758620768u,1947104772u,138436608u,393216u}/* 2F832 */, /*29044*/{2743074816u,2211u,2359296u,102924325u,73728u,3758620768u,1947104772u,138436608u,393216u}/* 2F833 */, /*29045*/{2743599104u,2211u,2359296u,102924325u,73728u,3758620768u,1946955148u,138436608u,393216u}/* 2F834 */, /*29046*/{2744123392u,2211u,2359296u,102924325u,73728u,3758620768u,1947164044u,138436608u,393216u}/* 2F835 */, /*29047*/{2744647680u,2211u,2359296u,102924325u,73728u,3758620768u,1947105372u,138436608u,393216u}/* 2F836 */, /*29048*/{2745171968u,2211u,2359296u,102924325u,73728u,3758620768u,1947105540u,138436608u,393216u}/* 2F837 */, /*29049*/{2745696256u,2211u,2359296u,102924325u,73728u,3758620768u,1946957636u,138436608u,393216u}/* 2F838 */, /*29050*/{2746220544u,2211u,2359296u,102924325u,73728u,3758620768u,1947105636u,138436608u,393216u}/* 2F839 */, /*29051*/{2746744832u,2211u,2359296u,102924325u,73728u,3758620768u,1947105684u,138436608u,393216u}/* 2F83A */, /*29052*/{2747269120u,2211u,2359296u,102924325u,73728u,3758620768u,1947105852u,138436608u,393216u}/* 2F83B */, /*29053*/{2747793408u,2211u,2359296u,102924325u,73728u,3758620768u,1947107068u,138436608u,393216u}/* 2F83C */, /*29054*/{2748317696u,2211u,2359296u,102924325u,73728u,3758620768u,1947106252u,138436608u,393216u}/* 2F83D */, /*29055*/{2748841984u,2211u,2359296u,102924325u,73728u,3758620768u,1947106380u,138436608u,393216u}/* 2F83E */, /*29056*/{2749366272u,2211u,2359296u,102924325u,73728u,3758620768u,1947106636u,138436608u,393216u}/* 2F83F */, /*29057*/{2749890560u,2211u,2359296u,102924325u,73728u,3758620768u,1947107100u,138436608u,393216u}/* 2F840 */, /*29058*/{2750414848u,2211u,2359296u,102924325u,73728u,3758620768u,1947107772u,138436608u,393216u}/* 2F841 */, /*29059*/{2750939136u,2211u,2359296u,102924325u,73728u,3758620768u,1947107980u,138436608u,393216u}/* 2F842 */, /*29060*/{2751463424u,2211u,2359296u,102924325u,73728u,3758620768u,1947108516u,138436608u,393216u}/* 2F843 */, /*29061*/{2751987712u,2211u,2359296u,102924325u,73728u,3758620768u,1947108644u,138436608u,393216u}/* 2F844 */, /*29062*/{2752512000u,2211u,2359296u,102924325u,73728u,3758620768u,1947108908u,138436608u,393216u}/* 2F845 */, /*29063*/{2753036288u,2211u,2359296u,102924325u,73728u,3758620768u,1947108908u,138436608u,393216u}/* 2F846 */, /*29064*/{2753560576u,2211u,2359296u,102924325u,73728u,3758620768u,1947109076u,138436608u,393216u}/* 2F847 */, /*29065*/{2754084864u,2211u,2359296u,102924325u,73728u,3758620768u,1947109220u,138436608u,393216u}/* 2F848 */, /*29066*/{2754609152u,2211u,2359296u,102924325u,73728u,3758620768u,1947109284u,138436608u,393216u}/* 2F849 */, /*29067*/{2755133440u,2211u,2359296u,102924325u,73728u,3758620768u,1947109404u,138436608u,393216u}/* 2F84A */, /*29068*/{2755657728u,2211u,2359296u,102924325u,73728u,3758620768u,1947112124u,138436608u,393216u}/* 2F84B */, /*29069*/{2756182016u,2211u,2359296u,102924325u,73728u,3758620768u,1947109948u,138436608u,393216u}/* 2F84C */, /*29070*/{2756706304u,2211u,2359296u,102924325u,73728u,3758620768u,1947112132u,138436608u,393216u}/* 2F84D */, /*29071*/{2757230592u,2211u,2359296u,102924325u,73728u,3758620768u,1947110548u,138436608u,393216u}/* 2F84E */, /*29072*/{2757754880u,2211u,2359296u,102924325u,73728u,3758620768u,1947110828u,138436608u,393216u}/* 2F84F */, /*29073*/{2758279168u,2211u,2359296u,102924325u,73728u,3758620768u,1947101764u,138436608u,393216u}/* 2F850 */, /*29074*/{2758803456u,2211u,2359296u,102924325u,73728u,3758620768u,1947115900u,138436608u,393216u}/* 2F851 */, /*29075*/{2759327744u,2211u,2359296u,102924325u,73728u,3758620768u,1947113596u,138436608u,393216u}/* 2F852 */, /*29076*/{2759852032u,2211u,2359296u,102924325u,73728u,3758620768u,1947113900u,138436608u,393216u}/* 2F853 */, /*29077*/{2760376320u,2211u,2359296u,102924325u,73728u,3758620768u,1947114100u,138436608u,393216u}/* 2F854 */, /*29078*/{2760900608u,2211u,2359296u,102924325u,73728u,3758620768u,1947113060u,138436608u,393216u}/* 2F855 */, /*29079*/{2761424896u,2211u,2359296u,102924325u,73728u,3758620768u,1947114396u,138436608u,393216u}/* 2F856 */, /*29080*/{2761949184u,2211u,2359296u,102924325u,73728u,3758620768u,1947114388u,138436608u,393216u}/* 2F857 */, /*29081*/{2762473472u,2211u,2359296u,102924325u,73728u,3758620768u,1947115372u,138436608u,393216u}/* 2F858 */, /*29082*/{2762997760u,2211u,2359296u,102924325u,73728u,3758620768u,1946977100u,138436608u,393216u}/* 2F859 */, /*29083*/{2763522048u,2211u,2359296u,102924325u,73728u,3758620768u,1947115932u,138436608u,393216u}/* 2F85A */, /*29084*/{2764046336u,2211u,2359296u,102924325u,73728u,3758620768u,1947115972u,138436608u,393216u}/* 2F85B */, /*29085*/{2764570624u,2211u,2359296u,102924325u,73728u,3758620768u,1947116092u,138436608u,393216u}/* 2F85C */, /*29086*/{2765094912u,2211u,2359296u,102924325u,73728u,3758620768u,1947116252u,138436608u,393216u}/* 2F85D */, /*29087*/{2765619200u,2211u,2359296u,102924325u,73728u,3758620768u,1947116316u,138436608u,393216u}/* 2F85E */, /*29088*/{2766143488u,2211u,2359296u,102924325u,73728u,3758620768u,1947116828u,138436608u,393216u}/* 2F85F */, /*29089*/{2766667776u,2211u,2359296u,102924325u,73728u,3758620768u,1946980716u,138436608u,393216u}/* 2F860 */, /*29090*/{2767192064u,2211u,2359296u,102924325u,73728u,3758620768u,1946981244u,138436608u,393216u}/* 2F861 */, /*29091*/{2767716352u,2211u,2359296u,102924325u,73728u,3758620768u,1947117932u,138436608u,393216u}/* 2F862 */, /*29092*/{2768240640u,2211u,2359296u,102924325u,73728u,3758620768u,1947118308u,138436608u,393216u}/* 2F863 */, /*29093*/{2768764928u,2211u,2359296u,102924325u,73728u,3758620768u,1947118404u,138436608u,393216u}/* 2F864 */, /*29094*/{2769289216u,2211u,2359296u,102924325u,73728u,3758620768u,1947117772u,138436608u,393216u}/* 2F865 */, /*29095*/{2769813504u,2211u,2359296u,102924325u,73728u,3758620768u,1947118908u,138436608u,393216u}/* 2F866 */, /*29096*/{2770337792u,2211u,2359296u,102924325u,73728u,3758620768u,1947046780u,138436608u,393216u}/* 2F867 */, /*29097*/{2770862080u,2211u,2359296u,102924325u,73728u,3758620768u,1947046892u,138436608u,393216u}/* 2F868 */, /*29098*/{2771386368u,2211u,2359296u,102924325u,73728u,3758620768u,1947120204u,138436608u,393216u}/* 2F869 */, /*29099*/{2771910656u,2211u,2359296u,102924325u,73728u,3758620768u,1947120636u,138436608u,393216u}/* 2F86A */, /*29100*/{2772434944u,2211u,2359296u,102924325u,73728u,3758620768u,1947120636u,138436608u,393216u}/* 2F86B */, /*29101*/{2772959232u,2211u,2359296u,102924325u,73728u,3758620768u,1946987116u,138436608u,393216u}/* 2F86C */, /*29102*/{2773483520u,2211u,2359296u,102924325u,73728u,3758620768u,1947121700u,138436608u,393216u}/* 2F86D */, /*29103*/{2774007808u,2211u,2359296u,102924325u,73728u,3758620768u,1947121868u,138436608u,393216u}/* 2F86E */, /*29104*/{2774532096u,2211u,2359296u,102924325u,73728u,3758620768u,1947121988u,138436608u,393216u}/* 2F86F */, /*29105*/{2775056384u,2211u,2359296u,102924325u,73728u,3758620768u,1947122084u,138436608u,393216u}/* 2F870 */, /*29106*/{2775580672u,2211u,2359296u,102924325u,73728u,3758620768u,1946989804u,138436608u,393216u}/* 2F871 */, /*29107*/{2776104960u,2211u,2359296u,102924325u,73728u,3758620768u,1947122180u,138436608u,393216u}/* 2F872 */, /*29108*/{2776629248u,2211u,2359296u,102924325u,73728u,3758620768u,1947122236u,138436608u,393216u}/* 2F873 */, /*29109*/{2777153536u,2211u,2359296u,102924325u,73728u,3758620768u,1947128996u,138436608u,393216u}/* 2F874 */, /*29110*/{2777677824u,2211u,2359296u,102924325u,73728u,3758620768u,1947122460u,138436608u,393216u}/* 2F875 */, /*29111*/{2778202112u,2211u,2359296u,102924325u,73728u,3758620768u,1947047956u,138436608u,393216u}/* 2F876 */, /*29112*/{2778726400u,2211u,2359296u,102924325u,73728u,3758620768u,1947122956u,138436608u,393216u}/* 2F877 */, /*29113*/{2779250688u,2211u,2359296u,102924325u,73728u,3758620768u,1947123068u,138436608u,393216u}/* 2F878 */, /*29114*/{2779774976u,2211u,2359296u,102924325u,73728u,3758620768u,1947123724u,138436608u,393216u}/* 2F879 */, /*29115*/{2780299264u,2211u,2359296u,102924325u,73728u,3758620768u,1947123316u,138436608u,393216u}/* 2F87A */, /*29116*/{2780823552u,2211u,2359296u,102924325u,73728u,3758620768u,1946995532u,138436608u,393216u}/* 2F87B */, /*29117*/{2781347840u,2211u,2359296u,102924325u,73728u,3758620768u,1947124772u,138436608u,393216u}/* 2F87C */, /*29118*/{2781872128u,2211u,2359296u,102924325u,73728u,3758620768u,1946995548u,138436608u,393216u}/* 2F87D */, /*29119*/{2782396416u,2211u,2359296u,102924325u,73728u,3758620768u,1947125116u,138436608u,393216u}/* 2F87E */, /*29120*/{2782920704u,2211u,2359296u,102924325u,73728u,3758620768u,1947125092u,138436608u,393216u}/* 2F87F */, /*29121*/{2783444992u,2211u,2359296u,102924325u,73728u,3758620768u,1947125228u,138436608u,393216u}/* 2F880 */, /*29122*/{2783969280u,2211u,2359296u,102924325u,73728u,3758620768u,1947126036u,138436608u,393216u}/* 2F881 */, /*29123*/{2784493568u,2211u,2359296u,102924325u,73728u,3758620768u,1947126044u,138436608u,393216u}/* 2F882 */, /*29124*/{2785017856u,2211u,2359296u,102924325u,73728u,3758620768u,1947049348u,138436608u,393216u}/* 2F883 */, /*29125*/{2785542144u,2211u,2359296u,102924325u,73728u,3758620768u,1947126260u,138436608u,393216u}/* 2F884 */, /*29126*/{2786066432u,2211u,2359296u,102924325u,73728u,3758620768u,1947126604u,138436608u,393216u}/* 2F885 */, /*29127*/{2786590720u,2211u,2359296u,102924325u,73728u,3758620768u,1947126772u,138436608u,393216u}/* 2F886 */, /*29128*/{2787115008u,2211u,2359296u,102924325u,73728u,3758620768u,1947127124u,138436608u,393216u}/* 2F887 */, /*29129*/{2787639296u,2211u,2359296u,102924325u,73728u,3758620768u,1947049756u,138436608u,393216u}/* 2F888 */, /*29130*/{2788163584u,2211u,2359296u,102924325u,73728u,3758620768u,1947002948u,138436608u,393216u}/* 2F889 */, /*29131*/{2788687872u,2211u,2359296u,102924325u,73728u,3758620768u,1947049964u,138436608u,393216u}/* 2F88A */, /*29132*/{2789212160u,2211u,2359296u,102924325u,73728u,3758620768u,1947127692u,138436608u,393216u}/* 2F88B */, /*29133*/{2789736448u,2211u,2359296u,102924325u,73728u,3758620768u,1947127716u,138436608u,393216u}/* 2F88C */, /*29134*/{2790260736u,2211u,2359296u,102924325u,73728u,3758620768u,1947127740u,138436608u,393216u}/* 2F88D */, /*29135*/{2790785024u,2211u,2359296u,102924325u,73728u,3758620768u,1947127900u,138436608u,393216u}/* 2F88E */, /*29136*/{2791309312u,2211u,2359296u,102924325u,73728u,3758620768u,1947007172u,138436608u,393216u}/* 2F88F */, /*29137*/{2791833600u,2211u,807670784u,102924325u,8462338u,3758620768u,1947128316u,138436608u,393216u}/* 2F890 */, /*29138*/{2792357888u,2211u,2359296u,102924325u,73728u,3758620768u,1947006388u,138436608u,393216u}/* 2F891 */, /*29139*/{2792882176u,2211u,2359296u,102924325u,73728u,3758620768u,1947006388u,138436608u,393216u}/* 2F892 */, /*29140*/{2793406464u,2211u,2359296u,102924325u,73728u,3758620768u,1946937884u,138436608u,393216u}/* 2F893 */, /*29141*/{2793930752u,2211u,2359296u,102924325u,73728u,3758620768u,1947128604u,138436608u,393216u}/* 2F894 */, /*29142*/{2794455040u,2211u,2359296u,102924325u,73728u,3758620768u,1947128604u,138436608u,393216u}/* 2F895 */, /*29143*/{2794979328u,2211u,2359296u,102924325u,73728u,3758620768u,1947050564u,138436608u,393216u}/* 2F896 */, /*29144*/{2795503616u,2211u,2359296u,102924325u,73728u,3758620768u,1947038188u,138436608u,393216u}/* 2F897 */, /*29145*/{2796027904u,2211u,2359296u,102924325u,73728u,3758620768u,1947134716u,138436608u,393216u}/* 2F898 */, /*29146*/{2796552192u,2211u,2359296u,102924325u,73728u,3758620768u,1947129116u,138436608u,393216u}/* 2F899 */, /*29147*/{2797076480u,2211u,2359296u,102924325u,73728u,3758620768u,1947129188u,138436608u,393216u}/* 2F89A */, /*29148*/{2797600768u,2211u,2359296u,102924325u,73728u,3758620768u,1947050788u,138436608u,393216u}/* 2F89B */, /*29149*/{2798125056u,2211u,2359296u,102924325u,73728u,3758620768u,1947129564u,138436608u,393216u}/* 2F89C */, /*29150*/{2798649344u,2211u,2359296u,102924325u,73728u,3758620768u,1947129972u,138436608u,393216u}/* 2F89D */, /*29151*/{2799173632u,2211u,2359296u,102924325u,73728u,3758620768u,1947130052u,138436608u,393216u}/* 2F89E */, /*29152*/{2799697920u,2211u,2359296u,102924325u,73728u,3758620768u,1947130324u,138436608u,393216u}/* 2F89F */, /*29153*/{2800222208u,2211u,2359296u,102924325u,73728u,3758620768u,1947131412u,138436608u,393216u}/* 2F8A0 */, /*29154*/{2800746496u,2211u,2359296u,102924325u,73728u,3758620768u,1947051484u,138436608u,393216u}/* 2F8A1 */, /*29155*/{2801270784u,2211u,2359296u,102924325u,73728u,3758620768u,1947051244u,138436608u,393216u}/* 2F8A2 */, /*29156*/{2801795072u,2211u,2359296u,102924325u,73728u,3758620768u,1947131564u,138436608u,393216u}/* 2F8A3 */, /*29157*/{2802319360u,2211u,2359296u,102924325u,73728u,3758620768u,1947013836u,138436608u,393216u}/* 2F8A4 */, /*29158*/{2802843648u,2211u,2359296u,102924325u,73728u,3758620768u,1947131972u,138436608u,393216u}/* 2F8A5 */, /*29159*/{2803367936u,2211u,2359296u,102924325u,73728u,3758620768u,1947133004u,138436608u,393216u}/* 2F8A6 */, /*29160*/{2803892224u,2211u,2359296u,102924325u,73728u,3758620768u,1947133036u,138436608u,393216u}/* 2F8A7 */, /*29161*/{2804416512u,2211u,2359296u,102924325u,73728u,3758620768u,1947133052u,138436608u,393216u}/* 2F8A8 */, /*29162*/{2804940800u,2211u,2359296u,102924325u,73728u,3758620768u,1947133036u,138436608u,393216u}/* 2F8A9 */, /*29163*/{2805465088u,2211u,2359296u,102924325u,73728u,3758620768u,1947133404u,138436608u,393216u}/* 2F8AA */, /*29164*/{2805989376u,2211u,2359296u,102924325u,73728u,3758620768u,1947133564u,138436608u,393216u}/* 2F8AB */, /*29165*/{2806513664u,2211u,2359296u,102924325u,73728u,3758620768u,1947133852u,138436608u,393216u}/* 2F8AC */, /*29166*/{2807037952u,2211u,2359296u,102924325u,73728u,3758620768u,1947133740u,138436608u,393216u}/* 2F8AD */, /*29167*/{2807562240u,2211u,2359296u,102924325u,73728u,3758620768u,1947133828u,138436608u,393216u}/* 2F8AE */, /*29168*/{2808086528u,2211u,2359296u,102924325u,73728u,3758620768u,1947134204u,138436608u,393216u}/* 2F8AF */, /*29169*/{2808610816u,2211u,2359296u,102924325u,73728u,3758620768u,1947134364u,138436608u,393216u}/* 2F8B0 */, /*29170*/{2809135104u,2211u,2359296u,102924325u,73728u,3758620768u,1947134396u,138436608u,393216u}/* 2F8B1 */, /*29171*/{2809659392u,2211u,2359296u,102924325u,73728u,3758620768u,1947134604u,138436608u,393216u}/* 2F8B2 */, /*29172*/{2810183680u,2211u,2359296u,102924325u,73728u,3758620768u,1947134692u,138436608u,393216u}/* 2F8B3 */, /*29173*/{2810707968u,2211u,2359296u,102924325u,73728u,3758620768u,1947135220u,138436608u,393216u}/* 2F8B4 */, /*29174*/{2811232256u,2211u,2359296u,102924325u,73728u,3758620768u,1947135892u,138436608u,393216u}/* 2F8B5 */, /*29175*/{2811756544u,2211u,2359296u,102924325u,73728u,3758620768u,1947136172u,138436608u,393216u}/* 2F8B6 */, /*29176*/{2812280832u,2211u,2359296u,102924325u,73728u,3758620768u,1947137164u,138436608u,393216u}/* 2F8B7 */, /*29177*/{2812805120u,2211u,2359296u,102924325u,73728u,3758620768u,1947022476u,138436608u,393216u}/* 2F8B8 */, /*29178*/{2813329408u,2211u,2359296u,102924325u,73728u,3758620768u,1947137012u,138436608u,393216u}/* 2F8B9 */, /*29179*/{2813853696u,2211u,2359296u,102924325u,73728u,3758620768u,1947136492u,138436608u,393216u}/* 2F8BA */, /*29180*/{2814377984u,2211u,2359296u,102924325u,73728u,3758620768u,1947137356u,138436608u,393216u}/* 2F8BB */, /*29181*/{2814902272u,2211u,2359296u,102924325u,73728u,3758620768u,1947137572u,138436608u,393216u}/* 2F8BC */, /*29182*/{2815426560u,2211u,2359296u,102924325u,73728u,3758620768u,1947138348u,138436608u,393216u}/* 2F8BD */, /*29183*/{2815950848u,2211u,2359296u,102924325u,73728u,3758620768u,1947024308u,138436608u,393216u}/* 2F8BE */, /*29184*/{2816475136u,2211u,2359296u,102924325u,73728u,3758620768u,1947138844u,138436608u,393216u}/* 2F8BF */, /*29185*/{2816999424u,2211u,2359296u,102924325u,73728u,3758620768u,1947138100u,138436608u,393216u}/* 2F8C0 */, /*29186*/{2817523712u,2211u,2359296u,102924325u,73728u,3758620768u,1947137876u,138436608u,393216u}/* 2F8C1 */, /*29187*/{2818048000u,2211u,2359296u,102924325u,73728u,3758620768u,1947053436u,138436608u,393216u}/* 2F8C2 */, /*29188*/{2818572288u,2211u,2359296u,102924325u,73728u,3758620768u,1947139412u,138436608u,393216u}/* 2F8C3 */, /*29189*/{2819096576u,2211u,2359296u,102924325u,73728u,3758620768u,1947139580u,138436608u,393216u}/* 2F8C4 */, /*29190*/{2819620864u,2211u,2359296u,102924325u,73728u,3758620768u,1947139828u,138436608u,393216u}/* 2F8C5 */, /*29191*/{2820145152u,2211u,2359296u,102924325u,73728u,3758620768u,1947139524u,138436608u,393216u}/* 2F8C6 */, /*29192*/{2820669440u,2211u,2359296u,102924325u,73728u,3758620768u,1947053932u,138436608u,393216u}/* 2F8C7 */, /*29193*/{2821193728u,2211u,2359296u,102924325u,73728u,3758620768u,1947141252u,138436608u,393216u}/* 2F8C8 */, /*29194*/{2821718016u,2211u,2359296u,102924325u,73728u,3758620768u,1947141484u,138436608u,393216u}/* 2F8C9 */, /*29195*/{2822242304u,2211u,2359296u,102924325u,73728u,3758620768u,1947032700u,138436608u,393216u}/* 2F8CA */, /*29196*/{2822766592u,2211u,2359296u,102924325u,73728u,3758620768u,1947142436u,138436608u,393216u}/* 2F8CB */, /*29197*/{2823290880u,2211u,2359296u,102924325u,73728u,3758620768u,1947144652u,138436608u,393216u}/* 2F8CC */, /*29198*/{2823815168u,2211u,2359296u,102924325u,73728u,3758620768u,1947143252u,138436608u,393216u}/* 2F8CD */, /*29199*/{2824339456u,2211u,2359296u,102924325u,73728u,3758620768u,1947055316u,138436608u,393216u}/* 2F8CE */, /*29200*/{2824863744u,2211u,2359296u,102924325u,73728u,3758620768u,1947143828u,138436608u,393216u}/* 2F8CF */, /*29201*/{2825388032u,2211u,2359296u,102924325u,73728u,3758620768u,1947055180u,138436608u,393216u}/* 2F8D0 */, /*29202*/{2825912320u,2211u,2359296u,102924325u,73728u,3758620768u,1947054892u,138436608u,393216u}/* 2F8D1 */, /*29203*/{2826436608u,2211u,2359296u,102924325u,73728u,3758620768u,1947100828u,138436608u,393216u}/* 2F8D2 */, /*29204*/{2826960896u,2211u,2359296u,102924325u,73728u,3758620768u,1947100852u,138436608u,393216u}/* 2F8D3 */, /*29205*/{2827485184u,2211u,2359296u,102924325u,73728u,3758620768u,1947144716u,138436608u,393216u}/* 2F8D4 */, /*29206*/{2828009472u,2211u,2359296u,102924325u,73728u,3758620768u,1947143916u,138436608u,393216u}/* 2F8D5 */, /*29207*/{2828533760u,2211u,2359296u,102924325u,73728u,3758620768u,1946935164u,138436608u,393216u}/* 2F8D6 */, /*29208*/{2829058048u,2211u,2359296u,102924325u,73728u,3758620768u,1947073236u,138436608u,393216u}/* 2F8D7 */, /*29209*/{2829582336u,2211u,2359296u,102924325u,73728u,3758620768u,1947144900u,138436608u,393216u}/* 2F8D8 */, /*29210*/{2830106624u,2211u,2359296u,102924325u,73728u,3758620768u,1947144932u,138436608u,393216u}/* 2F8D9 */, /*29211*/{2830630912u,2211u,2359296u,102924325u,73728u,3758620768u,1947144980u,138436608u,393216u}/* 2F8DA */, /*29212*/{2831155200u,2211u,2359296u,102924325u,73728u,3758620768u,1947145468u,138436608u,393216u}/* 2F8DB */, /*29213*/{2831679488u,2211u,2359296u,102924325u,73728u,3758620768u,1947145380u,138436608u,393216u}/* 2F8DC */, /*29214*/{2832203776u,2211u,2359296u,102924325u,73728u,3758620768u,1947040324u,138436608u,393216u}/* 2F8DD */, /*29215*/{2832728064u,2211u,2359296u,102924325u,73728u,3758620768u,1947055700u,138436608u,393216u}/* 2F8DE */, /*29216*/{2833252352u,2211u,2359296u,102924325u,73728u,3758620768u,1947146716u,138436608u,393216u}/* 2F8DF */, /*29217*/{2833776640u,2211u,2359296u,102924325u,73728u,3758620768u,1947145780u,138436608u,393216u}/* 2F8E0 */, /*29218*/{2834300928u,2211u,2359296u,102924325u,73728u,3758620768u,1947147420u,138436608u,393216u}/* 2F8E1 */, /*29219*/{2834825216u,2211u,2359296u,102924325u,73728u,3758620768u,1947147828u,138436608u,393216u}/* 2F8E2 */, /*29220*/{2835349504u,2211u,2359296u,102924325u,73728u,3758620768u,1947041684u,138436608u,393216u}/* 2F8E3 */, /*29221*/{2835873792u,2211u,2359296u,102924325u,73728u,3758620768u,1947147900u,138436608u,393216u}/* 2F8E4 */, /*29222*/{2836398080u,2211u,2359296u,102924325u,73728u,3758620768u,1947147012u,138436608u,393216u}/* 2F8E5 */, /*29223*/{2836922368u,2211u,2359296u,102924325u,73728u,3758620768u,1947148972u,138436608u,393216u}/* 2F8E6 */, /*29224*/{2837446656u,2211u,2359296u,102924325u,73728u,3758620768u,1947056372u,138436608u,393216u}/* 2F8E7 */, /*29225*/{2837970944u,2211u,2359296u,102924325u,73728u,3758620768u,1947149340u,138436608u,393216u}/* 2F8E8 */, /*29226*/{2838495232u,2211u,2359296u,102924325u,73728u,3758620768u,1947150116u,138436608u,393216u}/* 2F8E9 */, /*29227*/{2839019520u,2211u,2359296u,102924325u,73728u,3758620768u,1947150684u,138436608u,393216u}/* 2F8EA */, /*29228*/{2839543808u,2211u,2359296u,102924325u,73728u,3758620768u,1947152204u,138436608u,393216u}/* 2F8EB */, /*29229*/{2840068096u,2211u,2359296u,102924325u,73728u,3758620768u,1947046212u,138436608u,393216u}/* 2F8EC */, /*29230*/{2840592384u,2211u,2359296u,102924325u,73728u,3758620768u,1947152612u,138436608u,393216u}/* 2F8ED */, /*29231*/{2841116672u,2211u,2359296u,102924325u,73728u,3758620768u,1947057356u,138436608u,393216u}/* 2F8EE */, /*29232*/{2841640960u,2211u,2359296u,102924325u,73728u,3758620768u,1947153172u,138436608u,393216u}/* 2F8EF */, /*29233*/{2842165248u,2211u,2359296u,102924325u,73728u,3758620768u,1947050340u,138436608u,393216u}/* 2F8F0 */, /*29234*/{2842689536u,2211u,2359296u,102924325u,73728u,3758620768u,1947153580u,138436608u,393216u}/* 2F8F1 */, /*29235*/{2843213824u,2211u,2359296u,102924325u,73728u,3758620768u,1947057788u,138436608u,393216u}/* 2F8F2 */, /*29236*/{2843738112u,2211u,2359296u,102924325u,73728u,3758620768u,1947153820u,138436608u,393216u}/* 2F8F3 */, /*29237*/{2844262400u,2211u,2359296u,102924325u,73728u,3758620768u,1947154180u,138436608u,393216u}/* 2F8F4 */, /*29238*/{2844786688u,2211u,2359296u,102924325u,73728u,3758620768u,1947154396u,138436608u,393216u}/* 2F8F5 */, /*29239*/{2845310976u,2211u,2359296u,102924325u,73728u,3758620768u,1947154404u,138436608u,393216u}/* 2F8F6 */, /*29240*/{2845835264u,2211u,2359296u,102924325u,73728u,3758620768u,1947054228u,138436608u,393216u}/* 2F8F7 */, /*29241*/{2846359552u,2211u,2359296u,102924325u,73728u,3758620768u,1946993796u,138436608u,393216u}/* 2F8F8 */, /*29242*/{2846883840u,2211u,2359296u,102924325u,73728u,3758620768u,1947055100u,138436608u,393216u}/* 2F8F9 */, /*29243*/{2847408128u,2211u,2359296u,102924325u,73728u,3758620768u,1947155580u,138436608u,393216u}/* 2F8FA */, /*29244*/{2847932416u,2211u,2359296u,102924325u,73728u,3758620768u,1947058700u,138436608u,393216u}/* 2F8FB */, /*29245*/{2848456704u,2211u,2359296u,102924325u,73728u,3758620768u,1947156484u,138436608u,393216u}/* 2F8FC */, /*29246*/{2848980992u,2211u,2359296u,102924325u,73728u,3758620768u,1947156596u,138436608u,393216u}/* 2F8FD */, /*29247*/{2849505280u,2211u,2359296u,102924325u,73728u,3758620768u,1947155780u,138436608u,393216u}/* 2F8FE */, /*29248*/{2850029568u,2211u,2359296u,102924325u,73728u,3758620768u,1947157180u,138436608u,393216u}/* 2F8FF */, /*29249*/{2850553856u,2211u,2359296u,102924325u,73728u,3758620768u,1947157500u,138436608u,393216u}/* 2F900 */, /*29250*/{2851078144u,2211u,2359296u,102924325u,73728u,3758620768u,1947157956u,138436608u,393216u}/* 2F901 */, /*29251*/{2851602432u,2211u,2359296u,102924325u,73728u,3758620768u,1947157524u,138436608u,393216u}/* 2F902 */, /*29252*/{2852126720u,2211u,2359296u,102924325u,73728u,3758620768u,1947157844u,138436608u,393216u}/* 2F903 */, /*29253*/{2852651008u,2211u,2359296u,102924325u,73728u,3758620768u,1947157964u,138436608u,393216u}/* 2F904 */, /*29254*/{2853175296u,2211u,2359296u,102924325u,73728u,3758620768u,1947158068u,138436608u,393216u}/* 2F905 */, /*29255*/{2853699584u,2211u,2359296u,102924325u,73728u,3758620768u,1947059484u,138436608u,393216u}/* 2F906 */, /*29256*/{2854223872u,2211u,2359296u,102924325u,73728u,3758620768u,1947157420u,138436608u,393216u}/* 2F907 */, /*29257*/{2854748160u,2211u,2359296u,102924325u,73728u,3758620768u,1947159428u,138436608u,393216u}/* 2F908 */, /*29258*/{2855272448u,2211u,2359296u,102924325u,73728u,3758620768u,1947159932u,138436608u,393216u}/* 2F909 */, /*29259*/{2855796736u,2211u,2359296u,102924325u,73728u,3758620768u,1947059620u,138436608u,393216u}/* 2F90A */, /*29260*/{2856321024u,2211u,2359296u,102924325u,73728u,3758620768u,1947160676u,138436608u,393216u}/* 2F90B */, /*29261*/{2856845312u,2211u,2359296u,102924325u,73728u,3758620768u,1947160644u,138436608u,393216u}/* 2F90C */, /*29262*/{2857369600u,2211u,2359296u,102924325u,73728u,3758620768u,1947062964u,138436608u,393216u}/* 2F90D */, /*29263*/{2857893888u,2211u,2359296u,102924325u,73728u,3758620768u,1947158996u,138436608u,393216u}/* 2F90E */, /*29264*/{2858418176u,2211u,2359296u,102924325u,73728u,3758620768u,1947161980u,138436608u,393216u}/* 2F90F */, /*29265*/{2858942464u,2211u,2359296u,102924325u,73728u,3758620768u,1947064092u,138436608u,393216u}/* 2F910 */, /*29266*/{2859466752u,2211u,2359296u,102924325u,73728u,3758620768u,1947064476u,138436608u,393216u}/* 2F911 */, /*29267*/{2859991040u,2211u,2359296u,102924325u,73728u,3758620768u,1947162684u,138436608u,393216u}/* 2F912 */, /*29268*/{2860515328u,2211u,2359296u,102924325u,73728u,3758620768u,1947163604u,138436608u,393216u}/* 2F913 */, /*29269*/{2861039616u,2211u,2359296u,102924325u,73728u,3758620768u,1947163388u,138436608u,393216u}/* 2F914 */, /*29270*/{2861563904u,2211u,2359296u,102924325u,73728u,3758620768u,1947163364u,138436608u,393216u}/* 2F915 */, /*29271*/{2862088192u,2211u,2359296u,102924325u,73728u,3758620768u,1947060412u,138436608u,393216u}/* 2F916 */, /*29272*/{2862612480u,2211u,2359296u,102924325u,73728u,3758620768u,1947163740u,138436608u,393216u}/* 2F917 */, /*29273*/{2863136768u,2211u,2359296u,102924325u,73728u,3758620768u,1947164148u,138436608u,393216u}/* 2F918 */, /*29274*/{2863661056u,2211u,2359296u,102924325u,73728u,3758620768u,1947164100u,138436608u,393216u}/* 2F919 */, /*29275*/{2864185344u,2211u,2359296u,102924325u,73728u,3758620768u,1947164532u,138436608u,393216u}/* 2F91A */, /*29276*/{2864709632u,2211u,2359296u,102924325u,73728u,3758620768u,1946944852u,138436608u,393216u}/* 2F91B */, /*29277*/{2865233920u,2211u,2359296u,102924325u,73728u,3758620768u,1947165748u,138436608u,393216u}/* 2F91C */, /*29278*/{2865758208u,2211u,2359296u,102924325u,73728u,3758620768u,1947070276u,138436608u,393216u}/* 2F91D */, /*29279*/{2866282496u,2211u,2359296u,102924325u,73728u,3758620768u,1947166444u,138436608u,393216u}/* 2F91E */, /*29280*/{2866806784u,2211u,2359296u,102924325u,73728u,3758620768u,1947072900u,138436608u,393216u}/* 2F91F */, /*29281*/{2867331072u,2211u,2359296u,102924325u,73728u,3758620768u,1947167564u,138436608u,393216u}/* 2F920 */, /*29282*/{2867855360u,2211u,2359296u,102924325u,73728u,3758620768u,1947167668u,138436608u,393216u}/* 2F921 */, /*29283*/{2868379648u,2211u,2359296u,102924325u,73728u,3758620768u,1947167884u,138436608u,393216u}/* 2F922 */, /*29284*/{2868903936u,2211u,2359296u,102924325u,73728u,3758620768u,1947077740u,138436608u,393216u}/* 2F923 */, /*29285*/{2869428224u,2211u,2359296u,102924325u,73728u,3758620768u,1947168268u,138436608u,393216u}/* 2F924 */, /*29286*/{2869952512u,2211u,2359296u,102924325u,73728u,3758620768u,1947168436u,138436608u,393216u}/* 2F925 */, /*29287*/{2870476800u,2211u,2359296u,102924325u,73728u,3758620768u,1947080148u,138436608u,393216u}/* 2F926 */, /*29288*/{2871001088u,2211u,2359296u,102924325u,73728u,3758620768u,1947081932u,138436608u,393216u}/* 2F927 */, /*29289*/{2871525376u,2211u,2359296u,102924325u,73728u,3758620768u,1947170268u,138436608u,393216u}/* 2F928 */, /*29290*/{2872049664u,2211u,2359296u,102924325u,73728u,3758620768u,1947170404u,138436608u,393216u}/* 2F929 */, /*29291*/{2872573952u,2211u,2359296u,102924325u,73728u,3758620768u,1947062636u,138436608u,393216u}/* 2F92A */, /*29292*/{2873098240u,2211u,2359296u,102924325u,73728u,3758620768u,1947170612u,138436608u,393216u}/* 2F92B */, /*29293*/{2873622528u,2211u,2359296u,102924325u,73728u,3758620768u,1947062732u,138436608u,393216u}/* 2F92C */, /*29294*/{2874146816u,2211u,2359296u,102924325u,73728u,3758620768u,1947062732u,138436608u,393216u}/* 2F92D */, /*29295*/{2874671104u,2211u,2359296u,102924325u,73728u,3758620768u,1947171908u,138436608u,393216u}/* 2F92E */, /*29296*/{2875195392u,2211u,2359296u,102924325u,73728u,3758620768u,1947172076u,138436608u,393216u}/* 2F92F */, /*29297*/{2875719680u,2211u,2359296u,102924325u,73728u,3758620768u,1947172244u,138436608u,393216u}/* 2F930 */, /*29298*/{2876243968u,2211u,2359296u,102924325u,73728u,3758620768u,1947172404u,138436608u,393216u}/* 2F931 */, /*29299*/{2876768256u,2211u,2359296u,102924325u,73728u,3758620768u,1947172956u,138436608u,393216u}/* 2F932 */, /*29300*/{2877292544u,2211u,2359296u,102924325u,73728u,3758620768u,1947063524u,138436608u,393216u}/* 2F933 */, /*29301*/{2877816832u,2211u,2359296u,102924325u,73728u,3758620768u,1947173676u,138436608u,393216u}/* 2F934 */, /*29302*/{2878341120u,2211u,2359296u,102924325u,73728u,3758620768u,1947090396u,138436608u,393216u}/* 2F935 */, /*29303*/{2878865408u,2211u,2359296u,102924325u,73728u,3758620768u,1947173884u,138436608u,393216u}/* 2F936 */, /*29304*/{2879389696u,2211u,2359296u,102924325u,73728u,3758620768u,1947091132u,138436608u,393216u}/* 2F937 */, /*29305*/{2879913984u,2211u,2359296u,102924325u,73728u,3758620768u,1947174284u,138436608u,393216u}/* 2F938 */, /*29306*/{2880438272u,2211u,2359296u,102924325u,73728u,3758620768u,1947003172u,138436608u,393216u}/* 2F939 */, /*29307*/{2880962560u,2211u,2359296u,102924325u,73728u,3758620768u,1947175564u,138436608u,393216u}/* 2F93A */, /*29308*/{2881486848u,2211u,2359296u,102924325u,73728u,3758620768u,1947097396u,138436608u,393216u}/* 2F93B */, /*29309*/{2882011136u,2211u,2359296u,102924325u,73728u,3758620768u,1947097580u,138436608u,393216u}/* 2F93C */, /*29310*/{2882535424u,2211u,2359296u,102924325u,73728u,3758620768u,1947098700u,138436608u,393216u}/* 2F93D */, /*29311*/{2883059712u,2211u,2359296u,102924325u,73728u,3758620768u,1947065324u,138436608u,393216u}/* 2F93E */, /*29312*/{2883584000u,2211u,2359296u,102924325u,73728u,3758620768u,1947065420u,138436608u,393216u}/* 2F93F */, /*29313*/{2884108288u,2211u,2359296u,102924325u,73728u,3758620768u,1947177388u,138436608u,393216u}/* 2F940 */, /*29314*/{2884632576u,2211u,2359296u,102924325u,73728u,3758620768u,1947100100u,138436608u,393216u}/* 2F941 */, /*29315*/{2885156864u,2211u,2359296u,102924325u,73728u,3758620768u,1947100092u,138436608u,393216u}/* 2F942 */, /*29316*/{2885681152u,2211u,2359296u,102924325u,73728u,3758620768u,1947100404u,138436608u,393216u}/* 2F943 */, /*29317*/{2886205440u,2211u,2359296u,102924325u,73728u,3758620768u,1947100612u,138436608u,393216u}/* 2F944 */, /*29318*/{2886729728u,2211u,2359296u,102924325u,73728u,3758620768u,1947177724u,138436608u,393216u}/* 2F945 */, /*29319*/{2887254016u,2211u,2359296u,102924325u,73728u,3758620768u,1947177732u,138436608u,393216u}/* 2F946 */, /*29320*/{2887778304u,2211u,2359296u,102924325u,73728u,3758620768u,1947177732u,138436608u,393216u}/* 2F947 */, /*29321*/{2888302592u,2211u,2359296u,102924325u,73728u,3758620768u,1947178076u,138436608u,393216u}/* 2F948 */, /*29322*/{2888826880u,2211u,2359296u,102924325u,73728u,3758620768u,1947065812u,138436608u,393216u}/* 2F949 */, /*29323*/{2889351168u,2211u,2359296u,102924325u,73728u,3758620768u,1947178596u,138436608u,393216u}/* 2F94A */, /*29324*/{2889875456u,2211u,2359296u,102924325u,73728u,3758620768u,1947065916u,138436608u,393216u}/* 2F94B */, /*29325*/{2890399744u,2211u,2359296u,102924325u,73728u,3758620768u,1947066556u,138436608u,393216u}/* 2F94C */, /*29326*/{2890924032u,2211u,2359296u,102924325u,73728u,3758620768u,1947106580u,138436608u,393216u}/* 2F94D */, /*29327*/{2891448320u,2211u,2359296u,102924325u,73728u,3758620768u,1947180156u,138436608u,393216u}/* 2F94E */, /*29328*/{2891972608u,2211u,2359296u,102924325u,73728u,3758620768u,1947180652u,138436608u,393216u}/* 2F94F */, /*29329*/{2892496896u,2211u,2359296u,102924325u,73728u,3758620768u,1947181164u,138436608u,393216u}/* 2F950 */, /*29330*/{2893021184u,2211u,2359296u,102924325u,73728u,3758620768u,1947067172u,138436608u,393216u}/* 2F951 */, /*29331*/{2893545472u,2211u,2359296u,102924325u,73728u,3758620768u,1947110748u,138436608u,393216u}/* 2F952 */, /*29332*/{2894069760u,2211u,2359296u,102924325u,73728u,3758620768u,1947182268u,138436608u,393216u}/* 2F953 */, /*29333*/{2894594048u,2211u,2359296u,102924325u,73728u,3758620768u,1947111676u,138436608u,393216u}/* 2F954 */, /*29334*/{2895118336u,2211u,2359296u,102924325u,73728u,3758620768u,1947112020u,138436608u,393216u}/* 2F955 */, /*29335*/{2895642624u,2211u,2359296u,102924325u,73728u,3758620768u,1947182724u,138436608u,393216u}/* 2F956 */, /*29336*/{2896166912u,2211u,2359296u,102924325u,73728u,3758620768u,1947183460u,138436608u,393216u}/* 2F957 */, /*29337*/{2896691200u,2211u,2359296u,102924325u,73728u,3758620768u,1947067780u,138436608u,393216u}/* 2F958 */, /*29338*/{2897215488u,2211u,2359296u,102924325u,73728u,3758620768u,1947184140u,138436608u,393216u}/* 2F959 */, /*29339*/{2897739776u,2211u,2359296u,102924325u,73728u,3758620768u,1947184220u,138436608u,393216u}/* 2F95A */, /*29340*/{2898264064u,2211u,2359296u,102924325u,73728u,3758620768u,1947184260u,138436608u,393216u}/* 2F95B */, /*29341*/{2898788352u,2211u,2359296u,102924325u,73728u,3758620768u,1947117580u,138436608u,393216u}/* 2F95C */, /*29342*/{2899312640u,2211u,2359296u,102924325u,73728u,3758620768u,1947119972u,138436608u,393216u}/* 2F95D */, /*29343*/{2899836928u,2211u,2359296u,102924325u,73728u,3758620768u,1947119972u,138436608u,393216u}/* 2F95E */, /*29344*/{2900361216u,2211u,2359296u,102924325u,73728u,3758620768u,1947185532u,138436608u,393216u}/* 2F95F */, /*29345*/{2900885504u,2211u,2359296u,102924325u,73728u,3758620768u,1947069468u,138436608u,393216u}/* 2F960 */, /*29346*/{2901409792u,2211u,2359296u,102924325u,73728u,3758620768u,1947122052u,138436608u,393216u}/* 2F961 */, /*29347*/{2901934080u,2211u,2359296u,102924325u,73728u,3758620768u,1947187260u,138436608u,393216u}/* 2F962 */, /*29348*/{2902458368u,2211u,2359296u,102924325u,73728u,3758620768u,1947187284u,138436608u,393216u}/* 2F963 */, /*29349*/{2902982656u,2211u,2359296u,102924325u,73728u,3758620768u,1947069764u,138436608u,393216u}/* 2F964 */, /*29350*/{2903506944u,2211u,2359296u,102924325u,73728u,3758620768u,1947123756u,138436608u,393216u}/* 2F965 */, /*29351*/{2904031232u,2211u,2359296u,102924325u,73728u,3758620768u,1947189404u,138436608u,393216u}/* 2F966 */, /*29352*/{2904555520u,2211u,2359296u,102924325u,73728u,3758620768u,1947070732u,138436608u,393216u}/* 2F967 */, /*29353*/{2905079808u,2211u,2359296u,102924325u,73728u,3758620768u,1947189580u,138436608u,393216u}/* 2F968 */, /*29354*/{2905604096u,2211u,2359296u,102924325u,73728u,3758620768u,1947189540u,138436608u,393216u}/* 2F969 */, /*29355*/{2906128384u,2211u,2359296u,102924325u,73728u,3758620768u,1947189772u,138436608u,393216u}/* 2F96A */, /*29356*/{2906652672u,2211u,2359296u,102924325u,73728u,3758620768u,1947129948u,138436608u,393216u}/* 2F96B */, /*29357*/{2907176960u,2211u,2359296u,102924325u,73728u,3758620768u,1947190564u,138436608u,393216u}/* 2F96C */, /*29358*/{2907701248u,2211u,2359296u,102924325u,73728u,3758620768u,1947071508u,138436608u,393216u}/* 2F96D */, /*29359*/{2908225536u,2211u,2359296u,102924325u,73728u,3758620768u,1947191364u,138436608u,393216u}/* 2F96E */, /*29360*/{2908749824u,2211u,2359296u,102924325u,73728u,3758620768u,1947191836u,138436608u,393216u}/* 2F96F */, /*29361*/{2909274112u,2211u,2359296u,102924325u,73728u,3758620768u,1947192372u,138436608u,393216u}/* 2F970 */, /*29362*/{2909798400u,2211u,2359296u,102924325u,73728u,3758620768u,1947071916u,138436608u,393216u}/* 2F971 */, /*29363*/{2910322688u,2211u,2359296u,102924325u,73728u,3758620768u,1947135340u,138436608u,393216u}/* 2F972 */, /*29364*/{2910846976u,2211u,2359296u,102924325u,73728u,3758620768u,1947135588u,138436608u,393216u}/* 2F973 */, /*29365*/{2911371264u,2211u,2359296u,102924325u,73728u,3758620768u,1947072212u,138436608u,393216u}/* 2F974 */, /*29366*/{2911895552u,2211u,2359296u,102924325u,73728u,3758620768u,1947136756u,138436608u,393216u}/* 2F975 */, /*29367*/{2912419840u,2211u,2359296u,102924325u,73728u,3758620768u,1947194844u,138436608u,393216u}/* 2F976 */, /*29368*/{2912944128u,2211u,2359296u,102924325u,73728u,3758620768u,1947137564u,138436608u,393216u}/* 2F977 */, /*29369*/{2913468416u,2211u,2359296u,102924325u,73728u,3758620768u,1947195060u,138436608u,393216u}/* 2F978 */, /*29370*/{2913992704u,2211u,2359296u,102924325u,73728u,3758620768u,1947195868u,138436608u,393216u}/* 2F979 */, /*29371*/{2914516992u,2211u,2359296u,102924325u,73728u,3758620768u,1946933820u,138436608u,393216u}/* 2F97A */, /*29372*/{2915041280u,2211u,2359296u,102924325u,73728u,3758620768u,1947140860u,138436608u,393216u}/* 2F97B */, /*29373*/{2915565568u,2211u,2359296u,102924325u,73728u,3758620768u,1947141444u,138436608u,393216u}/* 2F97C */, /*29374*/{2916089856u,2211u,2359296u,102924325u,73728u,3758620768u,1946934548u,138436608u,393216u}/* 2F97D */, /*29375*/{2916614144u,2211u,2359296u,102924325u,73728u,3758620768u,1947142508u,138436608u,393216u}/* 2F97E */, /*29376*/{2917138432u,2211u,2359296u,102924325u,73728u,3758620768u,1946934676u,138436608u,393216u}/* 2F97F */, /*29377*/{2917662720u,2211u,2359296u,102924325u,73728u,3758620768u,1947039524u,138436608u,393216u}/* 2F980 */, /*29378*/{2918187008u,2211u,2359296u,102924325u,73728u,3758620768u,1947073204u,138436608u,393216u}/* 2F981 */, /*29379*/{2918711296u,2211u,2359296u,102924325u,73728u,3758620768u,1946935204u,138436608u,393216u}/* 2F982 */, /*29380*/{2919235584u,2211u,2359296u,102924325u,73728u,3758620768u,1946935852u,138436608u,393216u}/* 2F983 */, /*29381*/{2919759872u,2211u,2359296u,102924325u,73728u,3758620768u,1947073636u,138436608u,393216u}/* 2F984 */, /*29382*/{2920284160u,2211u,2359296u,102924325u,73728u,3758620768u,1946936324u,138436608u,393216u}/* 2F985 */, /*29383*/{2920808448u,2211u,2359296u,102924325u,73728u,3758620768u,1947119540u,138436608u,393216u}/* 2F986 */, /*29384*/{2921332736u,2211u,2359296u,102924325u,73728u,3758620768u,1947146596u,138436608u,393216u}/* 2F987 */, /*29385*/{2921857024u,2211u,2359296u,102924325u,73728u,3758620768u,1947146708u,138436608u,393216u}/* 2F988 */, /*29386*/{2922381312u,2211u,2359296u,102924325u,73728u,3758620768u,1947039940u,138436608u,393216u}/* 2F989 */, /*29387*/{2922905600u,2211u,2359296u,102924325u,73728u,3758620768u,1947040012u,138436608u,393216u}/* 2F98A */, /*29388*/{2923429888u,2211u,2359296u,102924325u,73728u,3758620768u,1946937884u,138436608u,393216u}/* 2F98B */, /*29389*/{2923954176u,2211u,2359296u,102924325u,73728u,3758620768u,1946937908u,138436608u,393216u}/* 2F98C */, /*29390*/{2924478464u,2211u,2359296u,102924325u,73728u,3758620768u,1946965764u,138436608u,393216u}/* 2F98D */, /*29391*/{2925002752u,2211u,2359296u,102924325u,73728u,3758620768u,1947074404u,138436608u,393216u}/* 2F98E */, /*29392*/{2925527040u,2211u,2359296u,102924325u,73728u,3758620768u,1946939036u,138436608u,393216u}/* 2F98F */, /*29393*/{2926051328u,2211u,2359296u,102924325u,73728u,3758620768u,1946938988u,138436608u,393216u}/* 2F990 */, /*29394*/{2926575616u,2211u,2359296u,102924325u,73728u,3758620768u,1946939132u,138436608u,393216u}/* 2F991 */, /*29395*/{2927099904u,2211u,2359296u,102924325u,73728u,3758620768u,1947103140u,138436608u,393216u}/* 2F992 */, /*29396*/{2927624192u,2211u,2359296u,102924325u,73728u,3758620768u,1946939292u,138436608u,393216u}/* 2F993 */, /*29397*/{2928148480u,2211u,2359296u,102924325u,73728u,3758620768u,1946939308u,138436608u,393216u}/* 2F994 */, /*29398*/{2928672768u,2211u,2359296u,102924325u,73728u,3758620768u,1946939388u,138436608u,393216u}/* 2F995 */, /*29399*/{2929197056u,2211u,2359296u,102924325u,73728u,3758620768u,1946939716u,138436608u,393216u}/* 2F996 */, /*29400*/{2929721344u,2211u,2359296u,102924325u,73728u,3758620768u,1947153932u,138436608u,393216u}/* 2F997 */, /*29401*/{2930245632u,2211u,2359296u,102924325u,73728u,3758620768u,1946939708u,138436608u,393216u}/* 2F998 */, /*29402*/{2930769920u,2211u,2359296u,102924325u,73728u,3758620768u,1946940156u,138436608u,393216u}/* 2F999 */, /*29403*/{2931294208u,2211u,2359296u,102924325u,73728u,3758620768u,1946940716u,138436608u,393216u}/* 2F99A */, /*29404*/{2931818496u,2211u,2359296u,102924325u,73728u,3758620768u,1946941308u,138436608u,393216u}/* 2F99B */, /*29405*/{2932342784u,2211u,2359296u,102924325u,73728u,3758620768u,1946940204u,138436608u,393216u}/* 2F99C */, /*29406*/{2932867072u,2211u,2359296u,102924325u,73728u,3758620768u,1946941436u,138436608u,393216u}/* 2F99D */, /*29407*/{2933391360u,2211u,2359296u,102924325u,73728u,3758620768u,1946941772u,138436608u,393216u}/* 2F99E */, /*29408*/{2933915648u,2211u,2359296u,102924325u,73728u,3758620768u,1946942668u,138436608u,393216u}/* 2F99F */, /*29409*/{2934439936u,2211u,2359296u,102924325u,73728u,3758620768u,1946940588u,138436608u,393216u}/* 2F9A0 */, /*29410*/{2934964224u,2211u,2359296u,102924325u,73728u,3758620768u,1946941540u,138436608u,393216u}/* 2F9A1 */, /*29411*/{2935488512u,2211u,2359296u,102924325u,73728u,3758620768u,1946941556u,138436608u,393216u}/* 2F9A2 */, /*29412*/{2936012800u,2211u,2359296u,102924325u,73728u,3758620768u,1946941684u,138436608u,393216u}/* 2F9A3 */, /*29413*/{2936537088u,2211u,2359296u,102924325u,73728u,3758620768u,1947155932u,138436608u,393216u}/* 2F9A4 */, /*29414*/{2937061376u,2211u,2359296u,102924325u,73728u,3758620768u,1947158404u,138436608u,393216u}/* 2F9A5 */, /*29415*/{2937585664u,2211u,2359296u,102924325u,73728u,3758620768u,1947157204u,138436608u,393216u}/* 2F9A6 */, /*29416*/{2938109952u,2211u,2359296u,102924325u,73728u,3758620768u,1947075940u,138436608u,393216u}/* 2F9A7 */, /*29417*/{2938634240u,2211u,2359296u,102924325u,73728u,3758620768u,1946943900u,138436608u,393216u}/* 2F9A8 */, /*29418*/{2939158528u,2211u,2359296u,102924325u,73728u,3758620768u,1946943916u,138436608u,393216u}/* 2F9A9 */, /*29419*/{2939682816u,2211u,2359296u,102924325u,73728u,3758620768u,1946944196u,138436608u,393216u}/* 2F9AA */, /*29420*/{2940207104u,2211u,2359296u,102924325u,73728u,3758620768u,1947171452u,138436608u,393216u}/* 2F9AB */, /*29421*/{2940731392u,2211u,2359296u,102924325u,73728u,3758620768u,1946944820u,138436608u,393216u}/* 2F9AC */, /*29422*/{2941255680u,2211u,2359296u,102924325u,73728u,3758620768u,1947161996u,138436608u,393216u}/* 2F9AD */, /*29423*/{2941779968u,2211u,2359296u,102924325u,73728u,3758620768u,1947076340u,138436608u,393216u}/* 2F9AE */, /*29424*/{2942304256u,2211u,2359296u,102924325u,73728u,3758620768u,1947076372u,138436608u,393216u}/* 2F9AF */, /*29425*/{2942828544u,2211u,2359296u,102924325u,73728u,3758620768u,1947163060u,138436608u,393216u}/* 2F9B0 */, /*29426*/{2943352832u,2211u,2359296u,102924325u,73728u,3758620768u,1947165372u,138436608u,393216u}/* 2F9B1 */, /*29427*/{2943877120u,2211u,2359296u,102924325u,73728u,3758620768u,1947076452u,138436608u,393216u}/* 2F9B2 */, /*29428*/{2944401408u,2211u,2359296u,102924325u,73728u,3758620768u,1946946708u,138436608u,393216u}/* 2F9B3 */, /*29429*/{2944925696u,2211u,2359296u,102924325u,73728u,3758620768u,1946946804u,138436608u,393216u}/* 2F9B4 */, /*29430*/{2945449984u,2211u,2359296u,102924325u,73728u,3758620768u,1946946892u,138436608u,393216u}/* 2F9B5 */, /*29431*/{2945974272u,2211u,2359296u,102924325u,73728u,3758620768u,1946946908u,138436608u,393216u}/* 2F9B6 */, /*29432*/{2946498560u,2211u,2359296u,102924325u,73728u,3758620768u,1946947420u,138436608u,393216u}/* 2F9B7 */, /*29433*/{2947022848u,2211u,2359296u,102924325u,73728u,3758620768u,1946947156u,138436608u,393216u}/* 2F9B8 */, /*29434*/{2947547136u,2211u,2359296u,102924325u,73728u,3758620768u,1946948228u,138436608u,393216u}/* 2F9B9 */, /*29435*/{2948071424u,2211u,2359296u,102924325u,73728u,3758620768u,1946947876u,138436608u,393216u}/* 2F9BA */, /*29436*/{2948595712u,2211u,2359296u,102924325u,73728u,3758620768u,1946949084u,138436608u,393216u}/* 2F9BB */, /*29437*/{2949120000u,2211u,2359296u,102924325u,73728u,3758620768u,1946948436u,138436608u,393216u}/* 2F9BC */, /*29438*/{2949644288u,2211u,2359296u,102924325u,73728u,3758620768u,1946948972u,138436608u,393216u}/* 2F9BD */, /*29439*/{2950168576u,2211u,2359296u,102924325u,73728u,3758620768u,1946949188u,138436608u,393216u}/* 2F9BE */, /*29440*/{2950692864u,2211u,2359296u,102924325u,73728u,3758620768u,1947077316u,138436608u,393216u}/* 2F9BF */, /*29441*/{2951217152u,2211u,2359296u,102924325u,73728u,3758620768u,1946949916u,138436608u,393216u}/* 2F9C0 */, /*29442*/{2951741440u,2211u,2359296u,102924325u,73728u,3758620768u,1946950172u,138436608u,393216u}/* 2F9C1 */, /*29443*/{2952265728u,2211u,2359296u,102924325u,73728u,3758620768u,1947077588u,138436608u,393216u}/* 2F9C2 */, /*29444*/{2952790016u,2211u,2359296u,102924325u,73728u,3758620768u,1946950932u,138436608u,393216u}/* 2F9C3 */, /*29445*/{2953314304u,2211u,2359296u,102924325u,73728u,3758620768u,1946950956u,138436608u,393216u}/* 2F9C4 */, /*29446*/{2953838592u,2211u,2359296u,102924325u,73728u,3758620768u,1947176804u,138436608u,393216u}/* 2F9C5 */, /*29447*/{2954362880u,2211u,2359296u,102924325u,73728u,3758620768u,1946951884u,138436608u,393216u}/* 2F9C6 */, /*29448*/{2954887168u,2211u,2359296u,102924325u,73728u,3758620768u,1946951940u,138436608u,393216u}/* 2F9C7 */, /*29449*/{2955411456u,2211u,2359296u,102924325u,73728u,3758620768u,1947078068u,138436608u,393216u}/* 2F9C8 */, /*29450*/{2955935744u,2211u,2359296u,102924325u,73728u,3758620768u,1946952164u,138436608u,393216u}/* 2F9C9 */, /*29451*/{2956460032u,2211u,2359296u,102924325u,73728u,3758620768u,1947042276u,138436608u,393216u}/* 2F9CA */, /*29452*/{2956984320u,2211u,2359296u,102924325u,73728u,3758620768u,1947181468u,138436608u,393216u}/* 2F9CB */, /*29453*/{2957508608u,2211u,2359296u,102924325u,73728u,3758620768u,1947182940u,138436608u,393216u}/* 2F9CC */, /*29454*/{2958032896u,2211u,2359296u,102924325u,73728u,3758620768u,1947079164u,138436608u,393216u}/* 2F9CD */, /*29455*/{2958557184u,2211u,2359296u,102924325u,73728u,3758620768u,1947079236u,138436608u,393216u}/* 2F9CE */, /*29456*/{2959081472u,2211u,2359296u,102924325u,73728u,3758620768u,1946955540u,138436608u,393216u}/* 2F9CF */, /*29457*/{2959605760u,2211u,2359296u,102924325u,73728u,3758620768u,1946956156u,138436608u,393216u}/* 2F9D0 */, /*29458*/{2960130048u,2211u,2359296u,102924325u,73728u,3758620768u,1946957412u,138436608u,393216u}/* 2F9D1 */, /*29459*/{2960654336u,2211u,2359296u,102924325u,73728u,3758620768u,1946959036u,138436608u,393216u}/* 2F9D2 */, /*29460*/{2961178624u,2211u,2359296u,102924325u,73728u,3758620768u,1947189612u,138436608u,393216u}/* 2F9D3 */, /*29461*/{2961702912u,2211u,2359296u,102924325u,73728u,3758620768u,1946959724u,138436608u,393216u}/* 2F9D4 */, /*29462*/{2962227200u,2211u,2359296u,102924325u,73728u,3758620768u,1946959900u,138436608u,393216u}/* 2F9D5 */, /*29463*/{2962751488u,2211u,2359296u,102924325u,73728u,3758620768u,1946960620u,138436608u,393216u}/* 2F9D6 */, /*29464*/{2963275776u,2211u,2359296u,102924325u,73728u,3758620768u,1946961356u,138436608u,393216u}/* 2F9D7 */, /*29465*/{2963800064u,2211u,2359296u,102924325u,73728u,3758620768u,1947194788u,138436608u,393216u}/* 2F9D8 */, /*29466*/{2964324352u,2211u,2359296u,102924325u,73728u,3758620768u,1946950732u,138436608u,393216u}/* 2F9D9 */, /*29467*/{2964848640u,2211u,2359296u,102924325u,73728u,3758620768u,1946962028u,138436608u,393216u}/* 2F9DA */, /*29468*/{2965372928u,2211u,2359296u,102924325u,73728u,3758620768u,1946961908u,138436608u,393216u}/* 2F9DB */, /*29469*/{2965897216u,2211u,2359296u,102924325u,73728u,3758620768u,1946962324u,138436608u,393216u}/* 2F9DC */, /*29470*/{2966421504u,2211u,2359296u,102924325u,73728u,3758620768u,1946952476u,138436608u,393216u}/* 2F9DD */, /*29471*/{2966945792u,2211u,2359296u,102924325u,73728u,3758620768u,1946964148u,138436608u,393216u}/* 2F9DE */, /*29472*/{2967470080u,2211u,2359296u,102924325u,73728u,3758620768u,1946964948u,138436608u,393216u}/* 2F9DF */, /*29473*/{2967994368u,2211u,2359296u,102924325u,73728u,3758620768u,1946946244u,138436608u,393216u}/* 2F9E0 */, /*29474*/{2968518656u,2211u,2359296u,102924325u,73728u,3758620768u,1946946460u,138436608u,393216u}/* 2F9E1 */, /*29475*/{2969042944u,2211u,2359296u,102924325u,73728u,3758620768u,1946967732u,138436608u,393216u}/* 2F9E2 */, /*29476*/{2969567232u,2211u,2359296u,102924325u,73728u,3758620768u,1946968476u,138436608u,393216u}/* 2F9E3 */, /*29477*/{2970091520u,2211u,2359296u,102924325u,73728u,3758620768u,1946968732u,138436608u,393216u}/* 2F9E4 */, /*29478*/{2970615808u,2211u,2359296u,102924325u,73728u,3758620768u,1946949028u,138436608u,393216u}/* 2F9E5 */, /*29479*/{2971140096u,2211u,2359296u,102924325u,73728u,3758620768u,1946968812u,138436608u,393216u}/* 2F9E6 */, /*29480*/{2971664384u,2211u,2359296u,102924325u,73728u,3758620768u,1946971092u,138436608u,393216u}/* 2F9E7 */, /*29481*/{2972188672u,2211u,2359296u,102924325u,73728u,3758620768u,1946972364u,138436608u,393216u}/* 2F9E8 */, /*29482*/{2972712960u,2211u,2359296u,102924325u,73728u,3758620768u,1946972372u,138436608u,393216u}/* 2F9E9 */, /*29483*/{2973237248u,2211u,2359296u,102924325u,73728u,3758620768u,1946971636u,138436608u,393216u}/* 2F9EA */, /*29484*/{2973761536u,2211u,2359296u,102924325u,73728u,3758620768u,1946974684u,138436608u,393216u}/* 2F9EB */, /*29485*/{2974285824u,2211u,2359296u,102924325u,73728u,3758620768u,1946974908u,138436608u,393216u}/* 2F9EC */, /*29486*/{2974810112u,2211u,2359296u,102924325u,73728u,3758620768u,1946958852u,138436608u,393216u}/* 2F9ED */, /*29487*/{2975334400u,2211u,2359296u,102924325u,73728u,3758620768u,1946977900u,138436608u,393216u}/* 2F9EE */, /*29488*/{2975858688u,2211u,2359296u,102924325u,73728u,3758620768u,1947084980u,138436608u,393216u}/* 2F9EF */, /*29489*/{2976382976u,2211u,2359296u,102924325u,73728u,3758620768u,1946978252u,138436608u,393216u}/* 2F9F0 */, /*29490*/{2976907264u,2211u,2359296u,102924325u,73728u,3758620768u,1946961900u,138436608u,393216u}/* 2F9F1 */, /*29491*/{2977431552u,2211u,2359296u,102924325u,73728u,3758620768u,1947085628u,138436608u,393216u}/* 2F9F2 */, /*29492*/{2977955840u,2211u,2359296u,102924325u,73728u,3758620768u,1946980396u,138436608u,393216u}/* 2F9F3 */, /*29493*/{2978480128u,2211u,2359296u,102924325u,73728u,3758620768u,1947125660u,138436608u,393216u}/* 2F9F4 */, /*29494*/{2979004416u,2211u,2359296u,102924325u,73728u,3758620768u,1946981164u,138436608u,393216u}/* 2F9F5 */, /*29495*/{2979528704u,2211u,2359296u,102924325u,73728u,3758620768u,1946969692u,138436608u,393216u}/* 2F9F6 */, /*29496*/{2980052992u,2211u,2359296u,102924325u,73728u,3758620768u,1946971396u,138436608u,393216u}/* 2F9F7 */, /*29497*/{2980577280u,2211u,2359296u,102924325u,73728u,3758620768u,1947086716u,138436608u,393216u}/* 2F9F8 */, /*29498*/{2981101568u,2211u,2359296u,102924325u,73728u,3758620768u,1947086780u,138436608u,393216u}/* 2F9F9 */, /*29499*/{2981625856u,2211u,2359296u,102924325u,73728u,3758620768u,1946982676u,138436608u,393216u}/* 2F9FA */, /*29500*/{2982150144u,2211u,2359296u,102924325u,73728u,3758620768u,1946975364u,138436608u,393216u}/* 2F9FB */, /*29501*/{2982674432u,2211u,2359296u,102924325u,73728u,3758620768u,1947087260u,138436608u,393216u}/* 2F9FC */, /*29502*/{2983198720u,2211u,2359296u,102924325u,73728u,3758620768u,1946976484u,138436608u,393216u}/* 2F9FD */, /*29503*/{2983723008u,2211u,2359296u,102924325u,73728u,3758620768u,1946983020u,138436608u,393216u}/* 2F9FE */, /*29504*/{2984247296u,2211u,2359296u,102924325u,73728u,3758620768u,1946983020u,138436608u,393216u}/* 2F9FF */, /*29505*/{2984771584u,2211u,2359296u,102924325u,73728u,3758620768u,1946983260u,138436608u,393216u}/* 2FA00 */, /*29506*/{2985295872u,2211u,2359296u,102924325u,73728u,3758620768u,1946978788u,138436608u,393216u}/* 2FA01 */, /*29507*/{2985820160u,2211u,2359296u,102924325u,73728u,3758620768u,1946984740u,138436608u,393216u}/* 2FA02 */, /*29508*/{2986344448u,2211u,2359296u,102924325u,73728u,3758620768u,1947088292u,138436608u,393216u}/* 2FA03 */, /*29509*/{2986868736u,2211u,2359296u,102924325u,73728u,3758620768u,1946985308u,138436608u,393216u}/* 2FA04 */, /*29510*/{2987393024u,2211u,2359296u,102924325u,73728u,3758620768u,1946986316u,138436608u,393216u}/* 2FA05 */, /*29511*/{2987917312u,2211u,2359296u,102924325u,73728u,3758620768u,1946986532u,138436608u,393216u}/* 2FA06 */, /*29512*/{2988441600u,2211u,2359296u,102924325u,73728u,3758620768u,1946987012u,138436608u,393216u}/* 2FA07 */, /*29513*/{2988965888u,2211u,2359296u,102924325u,73728u,3758620768u,1947089532u,138436608u,393216u}/* 2FA08 */, /*29514*/{2989490176u,2211u,2359296u,102924325u,73728u,3758620768u,1946990004u,138436608u,393216u}/* 2FA09 */, /*29515*/{2990014464u,2211u,2359296u,102924325u,73728u,3758620768u,1946989220u,138436608u,393216u}/* 2FA0A */, /*29516*/{2990538752u,2211u,2359296u,102924325u,73728u,3758620768u,1946991636u,138436608u,393216u}/* 2FA0B */, /*29517*/{2991063040u,2211u,2359296u,102924325u,73728u,3758620768u,1946993148u,138436608u,393216u}/* 2FA0C */, /*29518*/{2991587328u,2211u,2359296u,102924325u,73728u,3758620768u,1947091580u,138436608u,393216u}/* 2FA0D */, /*29519*/{2992111616u,2211u,2359296u,102924325u,73728u,3758620768u,1947091828u,138436608u,393216u}/* 2FA0E */, /*29520*/{2992635904u,2211u,2359296u,102924325u,73728u,3758620768u,1946993996u,138436608u,393216u}/* 2FA0F */, /*29521*/{2993160192u,2211u,2359296u,102924325u,73728u,3758620768u,1947001508u,138436608u,393216u}/* 2FA10 */, /*29522*/{2993684480u,2211u,2359296u,102924325u,73728u,3758620768u,1947091916u,138436608u,393216u}/* 2FA11 */, /*29523*/{2994208768u,2211u,2359296u,102924325u,73728u,3758620768u,1947001948u,138436608u,393216u}/* 2FA12 */, /*29524*/{2994733056u,2211u,2359296u,102924325u,73728u,3758620768u,1947004068u,138436608u,393216u}/* 2FA13 */, /*29525*/{2995257344u,2211u,2359296u,102924325u,73728u,3758620768u,1947005116u,138436608u,393216u}/* 2FA14 */, /*29526*/{2995781632u,2211u,2359296u,102924325u,73728u,3758620768u,1946996716u,138436608u,393216u}/* 2FA15 */, /*29527*/{2996305920u,2211u,2359296u,102924325u,73728u,3758620768u,1947092668u,138436608u,393216u}/* 2FA16 */, /*29528*/{2996830208u,2211u,2359296u,102924325u,73728u,3758620768u,1946997212u,138436608u,393216u}/* 2FA17 */, /*29529*/{2997354496u,2211u,2359296u,102924325u,73728u,3758620768u,1946997252u,138436608u,393216u}/* 2FA18 */, /*29530*/{2997878784u,2211u,2359296u,102924325u,73728u,3758620768u,1946997308u,138436608u,393216u}/* 2FA19 */, /*29531*/{2998403072u,2211u,2359296u,102924325u,73728u,3758620768u,1946997388u,138436608u,393216u}/* 2FA1A */, /*29532*/{2998927360u,2211u,2359296u,102924325u,73728u,3758620768u,1946997444u,138436608u,393216u}/* 2FA1B */, /*29533*/{2999451648u,2211u,2359296u,102924325u,73728u,3758620768u,1946997740u,138436608u,393216u}/* 2FA1C */, /*29534*/{2999975936u,2211u,2359296u,102924325u,73728u,3758620768u,1947012148u,138436608u,393216u}/* 2FA1D */, /*29535*/{0,2216u,65537u,68332560u,538091528u,1695072256u,12u,4208640u,0}/* E0001 */, /*29536*/{0,2216u,65537u,68332560u,672030728u,1695055888u,12u,4208768u,0}/* E0020 */, /*29537*/{0,2225u,2686977u,68399110u,672030728u,1627947024u,1077936140u,4208640u,1310720u}/* E0100 */, /*29538*/{0,2233u,1u,67174417u,40u,1677721600u,4u,6144u,0}/* F0000 */, /*29539*/{0,2241u,1u,67174417u,40u,1677721600u,4u,6144u,0}/* 100000 */, /*29540*/{0,0,1u,67108864u,40u,1677721600u,4u,6144u,0}/* 110000 */ }; static const MVMUnicodeNamedValue unicode_property_keypairs[3548] = { {"0",13},{"1",13},{"1.1",15},{"10",13},{"10.0",15},{"103",13},{"107",13},{"11",13},{"118",13},{"12",13},{"122",13}, {"129",13},{"13",13},{"130",13},{"132",13},{"133",13},{"14",13},{"15",13},{"16",13},{"17",13},{"18",13},{"19",13}, {"2.0",15},{"2.1",15},{"20",13},{"200",13},{"202",13},{"21",13},{"214",13},{"216",13},{"218",13},{"22",13},{"220",13}, {"222",13},{"224",13},{"226",13},{"228",13},{"23",13},{"230",13},{"232",13},{"233",13},{"234",13},{"24",13},{"240",13}, {"25",13},{"26",13},{"27",13},{"28",13},{"29",13},{"3.0",15},{"3.1",15},{"3.2",15},{"30",13},{"31",13},{"32",13}, {"33",13},{"34",13},{"35",13},{"36",13},{"4.0",15},{"4.1",15},{"5.0",15},{"5.1",15},{"5.2",15},{"6.0",15},{"6.1",15}, {"6.2",15},{"6.3",15},{"7",13},{"7.0",15},{"8",13},{"8.0",15},{"84",13},{"9",13},{"9.0",15},{"91",13},{"A",13}, {"AHex",28},{"AI",14},{"AL",16},{"ALetter",21},{"AN",16},{"AR",13},{"ASCII",6},{"ASCIIHexDigit",28}, {"ASCII_Hex_Digit",28},{"AT",22},{"ATA",13},{"ATAR",13},{"ATB",13},{"ATBL",13},{"ATerm",22},{"Above",13}, {"AboveLeft",13},{"AboveRight",13},{"Above_Left",13},{"Above_Right",13},{"Adlam",9},{"Adlm",9},{"AegeanNumbers",6}, {"Aegean_Numbers",6},{"AfricanFeh",3},{"AfricanNoon",3},{"AfricanQaf",3},{"African_Feh",3},{"African_Noon",3}, {"African_Qaf",3},{"Age",15},{"Aghb",9},{"Ahom",9},{"Ain",3},{"Alaph",3},{"Alchemical",6},{"AlchemicalSymbols",6}, {"Alchemical_Symbols",6},{"Alef",3},{"Alpha",29},{"Alphabetic",29},{"AlphabeticPF",6},{"AlphabeticPresentationForms",6}, {"Alphabetic_PF",6},{"Alphabetic_Presentation_Forms",6},{"Ambiguous",7},{"AnatolianHieroglyphs",9}, {"Anatolian_Hieroglyphs",9},{"AncientGreekMusic",6},{"AncientGreekMusicalNotation",6},{"AncientGreekNumbers",6}, {"AncientSymbols",6},{"Ancient_Greek_Music",6},{"Ancient_Greek_Musical_Notation",6},{"Ancient_Greek_Numbers",6}, {"Ancient_Symbols",6},{"Any",30},{"Arab",9},{"Arabic",9},{"ArabicExtA",6},{"ArabicExtendedA",6},{"ArabicLetter",16}, {"ArabicMath",6},{"ArabicMathematicalAlphabeticSymbols",6},{"ArabicNumber",16},{"ArabicPFA",6},{"ArabicPFB",6}, {"ArabicPresentationForms-A",6},{"ArabicPresentationFormsA",6},{"ArabicPresentationFormsB",6},{"ArabicSup",6}, {"ArabicSupplement",6},{"Arabic_Ext_A",6},{"Arabic_Extended_A",6},{"Arabic_Letter",16},{"Arabic_Math",6}, {"Arabic_Mathematical_Alphabetic_Symbols",6},{"Arabic_Number",16},{"Arabic_PF_A",6},{"Arabic_PF_B",6}, {"Arabic_Presentation_Forms-A",6},{"Arabic_Presentation_Forms_A",6},{"Arabic_Presentation_Forms_B",6},{"Arabic_Sup",6}, {"Arabic_Supplement",6},{"Armenian",9},{"Armi",9},{"Armn",9},{"Arrows",6},{"Assigned",31},{"AttachedAbove",13}, {"AttachedAboveRight",13},{"AttachedBelow",13},{"AttachedBelowLeft",13},{"Attached_Above",13}, {"Attached_Above_Right",13},{"Attached_Below",13},{"Attached_Below_Left",13},{"Avestan",9},{"Avst",9},{"B",16},{"B2",14}, {"BA",14},{"BB",14},{"BK",14},{"BL",13},{"BN",16},{"BR",13},{"Bali",9},{"Balinese",9},{"Bamu",9},{"Bamum",9}, {"BamumSup",6},{"BamumSupplement",6},{"Bamum_Sup",6},{"Bamum_Supplement",6},{"BasicLatin",6},{"Basic_Latin",6}, {"Bass",9},{"BassaVah",9},{"Bassa_Vah",9},{"Batak",9},{"Batk",9},{"Beh",3},{"Below",13},{"BelowLeft",13}, {"BelowRight",13},{"Below_Left",13},{"Below_Right",13},{"Beng",9},{"Bengali",9},{"Beth",3},{"Bhaiksuki",9},{"Bhks",9}, {"BidiC",32},{"BidiClass",16},{"BidiControl",32},{"BidiM",33},{"BidiMirrored",33},{"BidiMirroringGlyph",5},{"Bidi_C",32}, {"Bidi_Class",16},{"Bidi_Control",32},{"Bidi_M",33},{"Bidi_Mirrored",33},{"Bidi_Mirroring_Glyph",5},{"Block",6}, {"BlockElements",6},{"Block_Elements",6},{"Bopo",9},{"Bopomofo",9},{"BopomofoExt",6},{"BopomofoExtended",6}, {"Bopomofo_Ext",6},{"Bopomofo_Extended",6},{"BoundaryNeutral",16},{"Boundary_Neutral",16},{"BoxDrawing",6}, {"Box_Drawing",6},{"Brah",9},{"Brahmi",9},{"Brai",9},{"Braille",9},{"BraillePatterns",6},{"Braille_Patterns",6}, {"BreakAfter",14},{"BreakBefore",14},{"BreakBoth",14},{"BreakSymbols",14},{"Break_After",14},{"Break_Before",14}, {"Break_Both",14},{"Break_Symbols",14},{"Bugi",9},{"Buginese",9},{"Buhd",9},{"Buhid",9},{"BurushaskiYehBarree",3}, {"Burushaski_Yeh_Barree",3},{"ByzantineMusic",6},{"ByzantineMusicalSymbols",6},{"Byzantine_Music",6}, {"Byzantine_Musical_Symbols",6},{"C",34},{"CB",14},{"CCC10",13},{"CCC103",13},{"CCC107",13},{"CCC11",13},{"CCC118",13}, {"CCC12",13},{"CCC122",13},{"CCC129",13},{"CCC13",13},{"CCC130",13},{"CCC132",13},{"CCC133",13},{"CCC14",13}, {"CCC15",13},{"CCC16",13},{"CCC17",13},{"CCC18",13},{"CCC19",13},{"CCC20",13},{"CCC21",13},{"CCC22",13},{"CCC23",13}, {"CCC24",13},{"CCC25",13},{"CCC26",13},{"CCC27",13},{"CCC28",13},{"CCC29",13},{"CCC30",13},{"CCC31",13},{"CCC32",13}, {"CCC33",13},{"CCC34",13},{"CCC35",13},{"CCC36",13},{"CCC84",13},{"CCC91",13},{"CI",36},{"CJ",14},{"CJK",6}, {"CJKCompat",6},{"CJKCompatForms",6},{"CJKCompatIdeographs",6},{"CJKCompatIdeographsSup",6},{"CJKCompatibility",6}, {"CJKCompatibilityForms",6},{"CJKCompatibilityIdeographs",6},{"CJKCompatibilityIdeographsSupplement",6},{"CJKExtA",6}, {"CJKExtB",6},{"CJKExtC",6},{"CJKExtD",6},{"CJKExtE",6},{"CJKExtF",6},{"CJKRadicalsSup",6},{"CJKRadicalsSupplement",6}, {"CJKStrokes",6},{"CJKSymbols",6},{"CJKSymbolsAndPunctuation",6},{"CJKUnifiedIdeographs",6}, {"CJKUnifiedIdeographsExtensionA",6},{"CJKUnifiedIdeographsExtensionB",6},{"CJKUnifiedIdeographsExtensionC",6}, {"CJKUnifiedIdeographsExtensionD",6},{"CJKUnifiedIdeographsExtensionE",6},{"CJKUnifiedIdeographsExtensionF",6}, {"CJK_Compat",6},{"CJK_Compat_Forms",6},{"CJK_Compat_Ideographs",6},{"CJK_Compat_Ideographs_Sup",6}, {"CJK_Compatibility",6},{"CJK_Compatibility_Forms",6},{"CJK_Compatibility_Ideographs",6}, {"CJK_Compatibility_Ideographs_Supplement",6},{"CJK_Ext_A",6},{"CJK_Ext_B",6},{"CJK_Ext_C",6},{"CJK_Ext_D",6}, {"CJK_Ext_E",6},{"CJK_Ext_F",6},{"CJK_Radicals_Sup",6},{"CJK_Radicals_Supplement",6},{"CJK_Strokes",6},{"CJK_Symbols",6}, {"CJK_Symbols_And_Punctuation",6},{"CJK_Unified_Ideographs",6},{"CJK_Unified_Ideographs_Extension_A",6}, {"CJK_Unified_Ideographs_Extension_B",6},{"CJK_Unified_Ideographs_Extension_C",6}, {"CJK_Unified_Ideographs_Extension_D",6},{"CJK_Unified_Ideographs_Extension_E",6}, {"CJK_Unified_Ideographs_Extension_F",6},{"CL",22},{"CM",14},{"CN",19},{"CP",14},{"CR",19},{"CS",16},{"CWCF",38}, {"CWCM",39},{"CWKCF",41},{"CWL",40},{"CWT",42},{"CWU",43},{"Cakm",9},{"Can",17},{"CanadianAboriginal",9}, {"CanadianSyllabics",6},{"Canadian_Aboriginal",9},{"Canadian_Syllabics",6},{"Canonical",17}, {"CanonicalCombiningClass",13},{"Canonical_Combining_Class",13},{"Cans",9},{"Cari",9},{"Carian",9},{"CarriageReturn",14}, {"Carriage_Return",14},{"CaseChangeIndex",2},{"CaseFolding",4},{"CaseFoldingsimple",35},{"CaseIgnorable",36}, {"Case_Change_Index",2},{"Case_Folding",4},{"Case_Folding_simple",35},{"Case_Ignorable",36},{"Cased",37}, {"CasedLetter",67},{"Cased_Letter",67},{"CaucasianAlbanian",9},{"Caucasian_Albanian",9},{"Cc",18},{"Cf",18},{"Chakma",9}, {"Cham",9},{"ChangesWhenCasefolded",38},{"ChangesWhenCasemapped",39},{"ChangesWhenLowercased",40}, {"ChangesWhenNFKCCasefolded",41},{"ChangesWhenTitlecased",42},{"ChangesWhenUppercased",43}, {"Changes_When_Casefolded",38},{"Changes_When_Casemapped",39},{"Changes_When_Lowercased",40}, {"Changes_When_NFKC_Casefolded",41},{"Changes_When_Titlecased",42},{"Changes_When_Uppercased",43},{"Cher",9}, {"Cherokee",9},{"CherokeeSup",6},{"CherokeeSupplement",6},{"Cherokee_Sup",6},{"Cherokee_Supplement",6},{"Circle",17}, {"Close",22},{"CloseParenthesis",14},{"ClosePunctuation",18},{"Close_Parenthesis",14},{"Close_Punctuation",18},{"Cn",18}, {"Co",18},{"Com",17},{"CombiningDiacriticalMarks",6},{"CombiningDiacriticalMarksExtended",6}, {"CombiningDiacriticalMarksForSymbols",6},{"CombiningDiacriticalMarksSupplement",6},{"CombiningHalfMarks",6}, {"CombiningMark",70},{"CombiningMarksForSymbols",6},{"Combining_Diacritical_Marks",6}, {"Combining_Diacritical_Marks_Extended",6},{"Combining_Diacritical_Marks_For_Symbols",6}, {"Combining_Diacritical_Marks_Supplement",6},{"Combining_Half_Marks",6},{"Combining_Mark",70}, {"Combining_Marks_For_Symbols",6},{"Common",9},{"CommonIndicNumberForms",6},{"CommonSeparator",16}, {"Common_Indic_Number_Forms",6},{"Common_Separator",16},{"CompEx",54},{"Comp_Ex",54},{"Compat",17},{"CompatJamo",6}, {"Compat_Jamo",6},{"ComplexContext",14},{"Complex_Context",14},{"ConditionalJapaneseStarter",14}, {"Conditional_Japanese_Starter",14},{"ConnectorPunctuation",18},{"Connector_Punctuation",18},{"ContingentBreak",14}, {"Contingent_Break",14},{"Control",18},{"ControlPictures",6},{"Control_Pictures",6},{"Copt",9},{"Coptic",9}, {"CopticEpactNumbers",6},{"Coptic_Epact_Numbers",6},{"CountingRod",6},{"CountingRodNumerals",6},{"Counting_Rod",6}, {"Counting_Rod_Numerals",6},{"Cprt",9},{"Cs",18},{"Cuneiform",9},{"CuneiformNumbers",6}, {"CuneiformNumbersAndPunctuation",6},{"Cuneiform_Numbers",6},{"Cuneiform_Numbers_And_Punctuation",6}, {"CurrencySymbol",18},{"CurrencySymbols",6},{"Currency_Symbol",18},{"Currency_Symbols",6},{"Cypriot",9}, {"CypriotSyllabary",6},{"Cypriot_Syllabary",6},{"Cyrillic",9},{"CyrillicExtA",6},{"CyrillicExtB",6},{"CyrillicExtC",6}, {"CyrillicExtendedA",6},{"CyrillicExtendedB",6},{"CyrillicExtendedC",6},{"CyrillicSup",6},{"CyrillicSupplement",6}, {"CyrillicSupplementary",6},{"Cyrillic_Ext_A",6},{"Cyrillic_Ext_B",6},{"Cyrillic_Ext_C",6},{"Cyrillic_Extended_A",6}, {"Cyrillic_Extended_B",6},{"Cyrillic_Extended_C",6},{"Cyrillic_Sup",6},{"Cyrillic_Supplement",6}, {"Cyrillic_Supplementary",6},{"Cyrl",9},{"D",24},{"DA",13},{"DB",13},{"DI",45},{"DQ",21},{"Dal",3},{"DalathRish",3}, {"Dalath_Rish",3},{"Dash",44},{"DashPunctuation",18},{"Dash_Punctuation",18},{"De",27},{"Decimal",27}, {"DecimalNumber",18},{"Decimal_Number",18},{"DecompSpec",1},{"Decomp_Spec",1},{"DecompositionType",17}, {"Decomposition_Type",17},{"DefaultIgnorableCodePoint",45},{"Default_Ignorable_Code_Point",45},{"Dep",46}, {"Deprecated",46},{"Deseret",9},{"Deva",9},{"Devanagari",9},{"DevanagariExt",6},{"DevanagariExtended",6}, {"Devanagari_Ext",6},{"Devanagari_Extended",6},{"Di",27},{"Dia",47},{"Diacritic",47},{"Diacriticals",6}, {"DiacriticalsExt",6},{"DiacriticalsForSymbols",6},{"DiacriticalsSup",6},{"Diacriticals_Ext",6}, {"Diacriticals_For_Symbols",6},{"Diacriticals_Sup",6},{"Digit",27},{"Dingbats",6},{"Domino",6},{"DominoTiles",6}, {"Domino_Tiles",6},{"DoubleAbove",13},{"DoubleBelow",13},{"DoubleQuote",21},{"Double_Above",13},{"Double_Below",13}, {"Double_Quote",21},{"Dsrt",9},{"DualJoining",24},{"Dual_Joining",24},{"Dupl",9},{"Duployan",9},{"E",3},{"EB",19}, {"EBG",19},{"EBase",19},{"EBaseGAZ",19},{"EM",19},{"EModifier",19},{"EN",16},{"ES",16},{"ET",16},{"EX",19},{"E_Base",19}, {"E_Base_GAZ",19},{"E_Modifier",19},{"EarlyDynasticCuneiform",6},{"Early_Dynastic_Cuneiform",6},{"EastAsianWidth",7}, {"East_Asian_Width",7},{"Egyp",9},{"EgyptianHieroglyphs",9},{"Egyptian_Hieroglyphs",9},{"Elba",9},{"Elbasan",9}, {"Emoji",48},{"EmojiComponent",49},{"EmojiModifier",50},{"EmojiModifierBase",51},{"EmojiPresentation",52}, {"Emoji_Component",49},{"Emoji_Modifier",50},{"Emoji_Modifier_Base",51},{"Emoji_Presentation",52},{"Emoticons",6}, {"Enc",17},{"EnclosedAlphanum",6},{"EnclosedAlphanumSup",6},{"EnclosedAlphanumericSupplement",6}, {"EnclosedAlphanumerics",6},{"EnclosedCJK",6},{"EnclosedCJKLettersAndMonths",6},{"EnclosedIdeographicSup",6}, {"EnclosedIdeographicSupplement",6},{"Enclosed_Alphanum",6},{"Enclosed_Alphanum_Sup",6}, {"Enclosed_Alphanumeric_Supplement",6},{"Enclosed_Alphanumerics",6},{"Enclosed_CJK",6}, {"Enclosed_CJK_Letters_And_Months",6},{"Enclosed_Ideographic_Sup",6},{"Enclosed_Ideographic_Supplement",6}, {"EnclosingMark",18},{"Enclosing_Mark",18},{"Ethi",9},{"Ethiopic",9},{"EthiopicExt",6},{"EthiopicExtA",6}, {"EthiopicExtended",6},{"EthiopicExtendedA",6},{"EthiopicSup",6},{"EthiopicSupplement",6},{"Ethiopic_Ext",6}, {"Ethiopic_Ext_A",6},{"Ethiopic_Extended",6},{"Ethiopic_Extended_A",6},{"Ethiopic_Sup",6},{"Ethiopic_Supplement",6}, {"EuropeanNumber",16},{"EuropeanSeparator",16},{"EuropeanTerminator",16},{"European_Number",16}, {"European_Separator",16},{"European_Terminator",16},{"Exclamation",14},{"Ext",53},{"Extend",19},{"ExtendNumLet",21}, {"Extender",53},{"F",7},{"FO",22},{"FSI",16},{"FarsiYeh",3},{"Farsi_Yeh",3},{"Fe",3},{"Feh",3},{"Fin",17},{"Final",17}, {"FinalPunctuation",18},{"FinalSemkath",3},{"Final_Punctuation",18},{"Final_Semkath",3},{"FirstStrongIsolate",16}, {"First_Strong_Isolate",16},{"Font",17},{"Format",18},{"Fra",17},{"Fraction",17},{"FullCompositionExclusion",54}, {"Full_Composition_Exclusion",54},{"Fullwidth",7},{"GAZ",19},{"GCB",19},{"GL",14},{"Gaf",3},{"Gamal",3}, {"GeneralCategory",18},{"GeneralPunctuation",6},{"General_Category",18},{"General_Punctuation",6},{"GeometricShapes",6}, {"GeometricShapesExt",6},{"GeometricShapesExtended",6},{"Geometric_Shapes",6},{"Geometric_Shapes_Ext",6}, {"Geometric_Shapes_Extended",6},{"Geor",9},{"Georgian",9},{"GeorgianSup",6},{"GeorgianSupplement",6},{"Georgian_Sup",6}, {"Georgian_Supplement",6},{"Glag",9},{"Glagolitic",9},{"GlagoliticSup",6},{"GlagoliticSupplement",6}, {"Glagolitic_Sup",6},{"Glagolitic_Supplement",6},{"Glue",14},{"GlueAfterZwj",19},{"Glue_After_Zwj",19},{"Gonm",9}, {"Goth",9},{"Gothic",9},{"GrBase",55},{"GrExt",56},{"GrLink",57},{"Gr_Base",55},{"Gr_Ext",56},{"Gr_Link",57},{"Gran",9}, {"Grantha",9},{"GraphemeBase",55},{"GraphemeClusterBreak",19},{"GraphemeExtend",56},{"GraphemeLink",57}, {"Grapheme_Base",55},{"Grapheme_Cluster_Break",19},{"Grapheme_Extend",56},{"Grapheme_Link",57},{"Greek",9}, {"GreekAndCoptic",6},{"GreekExt",6},{"GreekExtended",6},{"Greek_And_Coptic",6},{"Greek_Ext",6},{"Greek_Extended",6}, {"Grek",9},{"Gujarati",9},{"Gujr",9},{"Gurmukhi",9},{"Guru",9},{"H",7},{"H2",14},{"H3",14},{"HL",21},{"HY",14},{"Hah",3}, {"HalfAndFullForms",6},{"HalfMarks",6},{"Half_And_Full_Forms",6},{"Half_Marks",6},{"Halfwidth",7}, {"HalfwidthAndFullwidthForms",6},{"Halfwidth_And_Fullwidth_Forms",6},{"HamzaOnHehGoal",3},{"Hamza_On_Heh_Goal",3}, {"Han",9},{"Hang",9},{"Hangul",9},{"HangulCompatibilityJamo",6},{"HangulJamo",6},{"HangulJamoExtendedA",6}, {"HangulJamoExtendedB",6},{"HangulSyllableType",23},{"HangulSyllables",6},{"Hangul_Compatibility_Jamo",6}, {"Hangul_Jamo",6},{"Hangul_Jamo_Extended_A",6},{"Hangul_Jamo_Extended_B",6},{"Hangul_Syllable_Type",23}, {"Hangul_Syllables",6},{"Hani",9},{"Hano",9},{"Hanunoo",9},{"Hatr",9},{"Hatran",9},{"He",3},{"Hebr",9},{"Hebrew",9}, {"HebrewLetter",21},{"Hebrew_Letter",21},{"Heh",3},{"HehGoal",3},{"Heh_Goal",3},{"Heth",3},{"Hex",58},{"HexDigit",58}, {"Hex_Digit",58},{"HighPUSurrogates",6},{"HighPrivateUseSurrogates",6},{"HighSurrogates",6},{"High_PU_Surrogates",6}, {"High_Private_Use_Surrogates",6},{"High_Surrogates",6},{"Hira",9},{"Hiragana",9},{"Hluw",9},{"Hmng",9},{"Hrkt",9}, {"Hung",9},{"Hyphen",59},{"ID",14},{"IDC",62},{"IDContinue",62},{"IDS",63},{"IDSB",60},{"IDSBinaryOperator",60}, {"IDST",61},{"IDSTrinaryOperator",61},{"IDS_Binary_Operator",60},{"IDS_Trinary_Operator",61},{"IDStart",63}, {"ID_Continue",62},{"ID_Start",63},{"IN",14},{"IPAExt",6},{"IPAExtensions",6},{"IPA_Ext",6},{"IPA_Extensions",6}, {"IS",13},{"Ideo",64},{"Ideographic",64},{"IdeographicDescriptionCharacters",6},{"IdeographicSymbols",6}, {"IdeographicSymbolsAndPunctuation",6},{"Ideographic_Description_Characters",6},{"Ideographic_Symbols",6}, {"Ideographic_Symbols_And_Punctuation",6},{"ImperialAramaic",9},{"Imperial_Aramaic",9},{"IndicNumberForms",6}, {"Indic_Number_Forms",6},{"InfixNumeric",14},{"Infix_Numeric",14},{"Inherited",9},{"Init",17},{"Initial",17}, {"InitialPunctuation",18},{"Initial_Punctuation",18},{"InscriptionalPahlavi",9},{"InscriptionalParthian",9}, {"Inscriptional_Pahlavi",9},{"Inscriptional_Parthian",9},{"Inseparable",14},{"Inseperable",14},{"IotaSubscript",13}, {"Iota_Subscript",13},{"Iso",17},{"Isolated",17},{"Ital",9},{"JL",14},{"JT",14},{"JV",14},{"Jamo",6},{"JamoExtA",6}, {"JamoExtB",6},{"Jamo_Ext_A",6},{"Jamo_Ext_B",6},{"Java",9},{"Javanese",9},{"JoinC",65},{"JoinCausing",24}, {"JoinControl",65},{"Join_C",65},{"Join_Causing",24},{"Join_Control",65},{"JoiningGroup",3},{"JoiningType",24}, {"Joining_Group",3},{"Joining_Type",24},{"KA",21},{"KV",13},{"Kaf",3},{"Kaithi",9},{"Kali",9},{"Kana",9},{"KanaExtA",6}, {"KanaExtendedA",6},{"KanaSup",6},{"KanaSupplement",6},{"KanaVoicing",13},{"Kana_Ext_A",6},{"Kana_Extended_A",6}, {"Kana_Sup",6},{"Kana_Supplement",6},{"Kana_Voicing",13},{"Kanbun",6},{"Kangxi",6},{"KangxiRadicals",6}, {"Kangxi_Radicals",6},{"Kannada",9},{"Kaph",3},{"Katakana",9},{"KatakanaExt",6},{"KatakanaOrHiragana",9}, {"KatakanaPhoneticExtensions",6},{"Katakana_Ext",6},{"Katakana_Or_Hiragana",9},{"Katakana_Phonetic_Extensions",6}, {"KayahLi",9},{"Kayah_Li",9},{"Khaph",3},{"Khar",9},{"Kharoshthi",9},{"Khmer",9},{"KhmerSymbols",6},{"Khmer_Symbols",6}, {"Khmr",9},{"Khoj",9},{"Khojki",9},{"Khudawadi",9},{"Knda",9},{"KnottedHeh",3},{"Knotted_Heh",3},{"Kthi",9},{"L",66}, {"LC",67},{"LE",22},{"LF",19},{"LO",22},{"LOE",68},{"LRE",16},{"LRI",16},{"LRO",16},{"LV",19},{"LVSyllable",23}, {"LVT",19},{"LVTSyllable",23},{"LVT_Syllable",23},{"LV_Syllable",23},{"Lam",3},{"Lamadh",3},{"Lana",9},{"Lao",9}, {"Laoo",9},{"Latin",9},{"Latin1",6},{"Latin1Sup",6},{"Latin1Supplement",6},{"LatinExtA",6},{"LatinExtAdditional",6}, {"LatinExtB",6},{"LatinExtC",6},{"LatinExtD",6},{"LatinExtE",6},{"LatinExtendedA",6},{"LatinExtendedAdditional",6}, {"LatinExtendedB",6},{"LatinExtendedC",6},{"LatinExtendedD",6},{"LatinExtendedE",6},{"Latin_1",6},{"Latin_1_Sup",6}, {"Latin_1_Supplement",6},{"Latin_Ext_A",6},{"Latin_Ext_Additional",6},{"Latin_Ext_B",6},{"Latin_Ext_C",6}, {"Latin_Ext_D",6},{"Latin_Ext_E",6},{"Latin_Extended_A",6},{"Latin_Extended_Additional",6},{"Latin_Extended_B",6}, {"Latin_Extended_C",6},{"Latin_Extended_D",6},{"Latin_Extended_E",6},{"Latn",9},{"LeadingJamo",23},{"Leading_Jamo",23}, {"Left",13},{"LeftJoining",24},{"LeftToRight",16},{"LeftToRightEmbedding",16},{"LeftToRightIsolate",16}, {"LeftToRightOverride",16},{"Left_Joining",24},{"Left_To_Right",16},{"Left_To_Right_Embedding",16}, {"Left_To_Right_Isolate",16},{"Left_To_Right_Override",16},{"Lepc",9},{"Lepcha",9},{"Letter",66},{"LetterNumber",18}, {"Letter_Number",18},{"LetterlikeSymbols",6},{"Letterlike_Symbols",6},{"Limb",9},{"Limbu",9},{"Lina",9},{"Linb",9}, {"LineBreak",14},{"LineFeed",14},{"LineSeparator",18},{"Line_Break",14},{"Line_Feed",14},{"Line_Separator",18}, {"LinearA",9},{"LinearB",9},{"LinearBIdeograms",6},{"LinearBSyllabary",6},{"Linear_A",9},{"Linear_B",9}, {"Linear_B_Ideograms",6},{"Linear_B_Syllabary",6},{"Lisu",9},{"Ll",18},{"Lm",18},{"Lo",18},{"LogicalOrderException",68}, {"Logical_Order_Exception",68},{"LowSurrogates",6},{"Low_Surrogates",6},{"Lower",69},{"Lowercase",69}, {"LowercaseLetter",18},{"Lowercase_Letter",18},{"Lt",18},{"Lu",18},{"Lyci",9},{"Lycian",9},{"Lydi",9},{"Lydian",9}, {"M",70},{"MB",21},{"ML",21},{"MN",21},{"MVMCOLLATIONPRIMARY",71},{"MVMCOLLATIONQC",72},{"MVMCOLLATIONSECONDARY",75}, {"MVMCOLLATIONTERTIARY",76},{"MVM_COLLATION_PRIMARY",71},{"MVM_COLLATION_QC",72},{"MVM_COLLATION_SECONDARY",75}, {"MVM_COLLATION_TERTIARY",76},{"Mahajani",9},{"Mahj",9},{"Mahjong",6},{"MahjongTiles",6},{"Mahjong_Tiles",6}, {"Malayalam",9},{"MalayalamBha",3},{"MalayalamJa",3},{"MalayalamLla",3},{"MalayalamLlla",3},{"MalayalamNga",3}, {"MalayalamNna",3},{"MalayalamNnna",3},{"MalayalamNya",3},{"MalayalamRa",3},{"MalayalamSsa",3},{"MalayalamTta",3}, {"Malayalam_Bha",3},{"Malayalam_Ja",3},{"Malayalam_Lla",3},{"Malayalam_Llla",3},{"Malayalam_Nga",3},{"Malayalam_Nna",3}, {"Malayalam_Nnna",3},{"Malayalam_Nya",3},{"Malayalam_Ra",3},{"Malayalam_Ssa",3},{"Malayalam_Tta",3},{"Mand",9}, {"Mandaic",9},{"MandatoryBreak",14},{"Mandatory_Break",14},{"Mani",9},{"Manichaean",9},{"ManichaeanAleph",3}, {"ManichaeanAyin",3},{"ManichaeanBeth",3},{"ManichaeanDaleth",3},{"ManichaeanDhamedh",3},{"ManichaeanFive",3}, {"ManichaeanGimel",3},{"ManichaeanHeth",3},{"ManichaeanHundred",3},{"ManichaeanKaph",3},{"ManichaeanLamedh",3}, {"ManichaeanMem",3},{"ManichaeanNun",3},{"ManichaeanOne",3},{"ManichaeanPe",3},{"ManichaeanQoph",3},{"ManichaeanResh",3}, {"ManichaeanSadhe",3},{"ManichaeanSamekh",3},{"ManichaeanTaw",3},{"ManichaeanTen",3},{"ManichaeanTeth",3}, {"ManichaeanThamedh",3},{"ManichaeanTwenty",3},{"ManichaeanWaw",3},{"ManichaeanYodh",3},{"ManichaeanZayin",3}, {"Manichaean_Aleph",3},{"Manichaean_Ayin",3},{"Manichaean_Beth",3},{"Manichaean_Daleth",3},{"Manichaean_Dhamedh",3}, {"Manichaean_Five",3},{"Manichaean_Gimel",3},{"Manichaean_Heth",3},{"Manichaean_Hundred",3},{"Manichaean_Kaph",3}, {"Manichaean_Lamedh",3},{"Manichaean_Mem",3},{"Manichaean_Nun",3},{"Manichaean_One",3},{"Manichaean_Pe",3}, {"Manichaean_Qoph",3},{"Manichaean_Resh",3},{"Manichaean_Sadhe",3},{"Manichaean_Samekh",3},{"Manichaean_Taw",3}, {"Manichaean_Ten",3},{"Manichaean_Teth",3},{"Manichaean_Thamedh",3},{"Manichaean_Twenty",3},{"Manichaean_Waw",3}, {"Manichaean_Yodh",3},{"Manichaean_Zayin",3},{"Marc",9},{"Marchen",9},{"Mark",70},{"MasaramGondi",9},{"Masaram_Gondi",9}, {"Math",73},{"MathAlphanum",6},{"MathOperators",6},{"MathSymbol",18},{"Math_Alphanum",6},{"Math_Operators",6}, {"Math_Symbol",18},{"MathematicalAlphanumericSymbols",6},{"MathematicalOperators",6}, {"Mathematical_Alphanumeric_Symbols",6},{"Mathematical_Operators",6},{"Maybe",12},{"Mc",18},{"Me",18},{"Med",17}, {"Medial",17},{"Meem",3},{"MeeteiMayek",9},{"MeeteiMayekExt",6},{"MeeteiMayekExtensions",6},{"Meetei_Mayek",9}, {"Meetei_Mayek_Ext",6},{"Meetei_Mayek_Extensions",6},{"Mend",9},{"MendeKikakui",9},{"Mende_Kikakui",9},{"Merc",9}, {"Mero",9},{"MeroiticCursive",9},{"MeroiticHieroglyphs",9},{"Meroitic_Cursive",9},{"Meroitic_Hieroglyphs",9},{"Miao",9}, {"MidLetter",21},{"MidNum",21},{"MidNumLet",21},{"Mim",3},{"MiscArrows",6},{"MiscMathSymbolsA",6},{"MiscMathSymbolsB",6}, {"MiscPictographs",6},{"MiscSymbols",6},{"MiscTechnical",6},{"Misc_Arrows",6},{"Misc_Math_Symbols_A",6}, {"Misc_Math_Symbols_B",6},{"Misc_Pictographs",6},{"Misc_Symbols",6},{"Misc_Technical",6}, {"MiscellaneousMathematicalSymbolsA",6},{"MiscellaneousMathematicalSymbolsB",6},{"MiscellaneousSymbols",6}, {"MiscellaneousSymbolsAndArrows",6},{"MiscellaneousSymbolsAndPictographs",6},{"MiscellaneousTechnical",6}, {"Miscellaneous_Mathematical_Symbols_A",6},{"Miscellaneous_Mathematical_Symbols_B",6},{"Miscellaneous_Symbols",6}, {"Miscellaneous_Symbols_And_Arrows",6},{"Miscellaneous_Symbols_And_Pictographs",6},{"Miscellaneous_Technical",6}, {"Mlym",9},{"Mn",18},{"Modi",9},{"ModifierLetter",18},{"ModifierLetters",6},{"ModifierSymbol",18}, {"ModifierToneLetters",6},{"Modifier_Letter",18},{"Modifier_Letters",6},{"Modifier_Symbol",18}, {"Modifier_Tone_Letters",6},{"Mong",9},{"Mongolian",9},{"MongolianSup",6},{"MongolianSupplement",6},{"Mongolian_Sup",6}, {"Mongolian_Supplement",6},{"Mro",9},{"Mroo",9},{"Mtei",9},{"Mult",9},{"Multani",9},{"Music",6},{"MusicalSymbols",6}, {"Musical_Symbols",6},{"Myanmar",9},{"MyanmarExtA",6},{"MyanmarExtB",6},{"MyanmarExtendedA",6},{"MyanmarExtendedB",6}, {"Myanmar_Ext_A",6},{"Myanmar_Ext_B",6},{"Myanmar_Extended_A",6},{"Myanmar_Extended_B",6},{"Mymr",9},{"N",74},{"NA",15}, {"NB",6},{"NChar",79},{"NFCQC",12},{"NFCQuickCheck",12},{"NFC_QC",12},{"NFC_Quick_Check",12},{"NFDQC",77}, {"NFDQuickCheck",77},{"NFD_QC",77},{"NFD_Quick_Check",77},{"NFGQC",25},{"NFG_QC",25},{"NFKCQC",26},{"NFKCQuickCheck",26}, {"NFKC_QC",26},{"NFKC_Quick_Check",26},{"NFKDQC",78},{"NFKDQuickCheck",78},{"NFKD_QC",78},{"NFKD_Quick_Check",78}, {"NK",13},{"NKo",6},{"NL",21},{"NR",13},{"NS",14},{"NSM",16},{"NU",22},{"Na",7},{"Nabataean",9},{"Nar",17},{"Narb",9}, {"Narrow",17},{"Nb",17},{"Nbat",9},{"Nd",18},{"Neutral",7},{"NewTaiLue",9},{"New_Tai_Lue",9},{"Newa",9},{"Newline",21}, {"NextLine",14},{"Next_Line",14},{"Nko",9},{"Nkoo",9},{"Nl",18},{"No",18},{"NoBlock",6},{"NoJoiningGroup",3}, {"No_Block",6},{"No_Joining_Group",3},{"Nobreak",17},{"NonJoining",24},{"Non_Joining",24},{"NoncharacterCodePoint",79}, {"Noncharacter_Code_Point",79},{"None",17},{"NonspacingMark",18},{"Nonspacing_Mark",18},{"Nonstarter",14},{"Noon",3}, {"NotApplicable",23},{"NotReordered",13},{"Not_Applicable",23},{"Not_Reordered",13},{"Nshu",9},{"Nu",27},{"Nukta",13}, {"Number",74},{"NumberForms",6},{"Number_Forms",6},{"Numeric",22},{"NumericType",27},{"NumericValue",8}, {"NumericValueDenominator",20},{"NumericValueNumerator",10},{"Numeric_Type",27},{"Numeric_Value",8}, {"Numeric_Value_Denominator",20},{"Numeric_Value_Numerator",10},{"Nun",3},{"Nushu",9},{"Nya",3},{"OAlpha",80},{"OCR",6}, {"ODI",81},{"OGrExt",82},{"OGr_Ext",82},{"OIDC",83},{"OIDS",84},{"OLetter",22},{"OLower",85},{"OMath",86},{"ON",16}, {"OP",14},{"OUpper",87},{"OV",13},{"Ogam",9},{"Ogham",9},{"OlChiki",9},{"Ol_Chiki",9},{"Olck",9},{"OldHungarian",9}, {"OldItalic",9},{"OldNorthArabian",9},{"OldPermic",9},{"OldPersian",9},{"OldSouthArabian",9},{"OldTurkic",9}, {"Old_Hungarian",9},{"Old_Italic",9},{"Old_North_Arabian",9},{"Old_Permic",9},{"Old_Persian",9},{"Old_South_Arabian",9}, {"Old_Turkic",9},{"OpenPunctuation",18},{"Open_Punctuation",18},{"OpticalCharacterRecognition",6}, {"Optical_Character_Recognition",6},{"Oriya",9},{"Orkh",9},{"OrnamentalDingbats",6},{"Ornamental_Dingbats",6},{"Orya",9}, {"Osage",9},{"Osge",9},{"Osma",9},{"Osmanya",9},{"Other",34},{"OtherAlphabetic",80}, {"OtherDefaultIgnorableCodePoint",81},{"OtherGraphemeExtend",82},{"OtherIDContinue",83},{"OtherIDStart",84}, {"OtherLetter",18},{"OtherLowercase",85},{"OtherMath",86},{"OtherNeutral",16},{"OtherNumber",18},{"OtherPunctuation",18}, {"OtherSymbol",18},{"OtherUppercase",87},{"Other_Alphabetic",80},{"Other_Default_Ignorable_Code_Point",81}, {"Other_Grapheme_Extend",82},{"Other_ID_Continue",83},{"Other_ID_Start",84},{"Other_Letter",18},{"Other_Lowercase",85}, {"Other_Math",86},{"Other_Neutral",16},{"Other_Number",18},{"Other_Punctuation",18},{"Other_Symbol",18}, {"Other_Uppercase",87},{"Overlay",13},{"P",88},{"PCM",91},{"PDF",16},{"PDI",16},{"PO",14},{"PP",19},{"PR",14},{"PUA",6}, {"PahawhHmong",9},{"Pahawh_Hmong",9},{"Palm",9},{"Palmyrene",9},{"ParagraphSeparator",18},{"Paragraph_Separator",18}, {"PatSyn",89},{"PatWS",90},{"Pat_Syn",89},{"Pat_WS",90},{"PatternSyntax",89},{"PatternWhiteSpace",90}, {"Pattern_Syntax",89},{"Pattern_White_Space",90},{"PauCinHau",9},{"Pau_Cin_Hau",9},{"Pauc",9},{"Pc",18},{"Pd",18}, {"Pe",18},{"Perm",9},{"Pf",18},{"Phag",9},{"PhagsPa",9},{"Phags_Pa",9},{"Phaistos",6},{"PhaistosDisc",6}, {"Phaistos_Disc",6},{"Phli",9},{"Phlp",9},{"Phnx",9},{"Phoenician",9},{"PhoneticExt",6},{"PhoneticExtSup",6}, {"PhoneticExtensions",6},{"PhoneticExtensionsSupplement",6},{"Phonetic_Ext",6},{"Phonetic_Ext_Sup",6}, {"Phonetic_Extensions",6},{"Phonetic_Extensions_Supplement",6},{"Pi",18},{"PlayingCards",6},{"Playing_Cards",6}, {"Plrd",9},{"Po",18},{"PopDirectionalFormat",16},{"PopDirectionalIsolate",16},{"Pop_Directional_Format",16}, {"Pop_Directional_Isolate",16},{"PostfixNumeric",14},{"Postfix_Numeric",14},{"PrefixNumeric",14},{"Prefix_Numeric",14}, {"Prepend",19},{"PrependedConcatenationMark",91},{"Prepended_Concatenation_Mark",91},{"PrivateUse",18}, {"PrivateUseArea",6},{"Private_Use",18},{"Private_Use_Area",6},{"Prti",9},{"Ps",18},{"PsalterPahlavi",9}, {"Psalter_Pahlavi",9},{"Punctuation",88},{"QMark",92},{"QU",14},{"Qaac",9},{"Qaai",9},{"Qaf",3},{"Qaph",3}, {"Quotation",14},{"QuotationMark",92},{"Quotation_Mark",92},{"R",16},{"RESERVED",13},{"RI",94},{"RLE",16},{"RLI",16}, {"RLO",16},{"Radical",93},{"RegionalIndicator",94},{"Regional_Indicator",94},{"Reh",3},{"Rejang",9},{"ReversedPe",3}, {"Reversed_Pe",3},{"Right",13},{"RightJoining",24},{"RightToLeft",16},{"RightToLeftEmbedding",16}, {"RightToLeftIsolate",16},{"RightToLeftOverride",16},{"Right_Joining",24},{"Right_To_Left",16}, {"Right_To_Left_Embedding",16},{"Right_To_Left_Isolate",16},{"Right_To_Left_Override",16},{"Rjng",9},{"RohingyaYeh",3}, {"Rohingya_Yeh",3},{"Rumi",6},{"RumiNumeralSymbols",6},{"Rumi_Numeral_Symbols",6},{"Runic",9},{"Runr",9},{"S",95}, {"SA",14},{"SB",22},{"SC",22},{"SContinue",22},{"SD",97},{"SE",22},{"SG",14},{"SM",19},{"SP",22},{"SQ",21},{"ST",22}, {"STerm",96},{"SY",14},{"Sad",3},{"Sadhe",3},{"Samaritan",9},{"Samr",9},{"Sarb",9},{"Saur",9},{"Saurashtra",9},{"Sc",18}, {"Script",9},{"Seen",3},{"SegmentSeparator",16},{"Segment_Separator",16},{"Semkath",3},{"SentenceBreak",22}, {"SentenceTerminal",96},{"Sentence_Break",22},{"Sentence_Terminal",96},{"Sep",22},{"Separator",105},{"Sgnw",9}, {"Sharada",9},{"Shavian",9},{"Shaw",9},{"Shin",3},{"ShorthandFormatControls",6},{"Shorthand_Format_Controls",6}, {"Shrd",9},{"Sidd",9},{"Siddham",9},{"SignWriting",9},{"Sind",9},{"SingleQuote",21},{"Single_Quote",21},{"Sinh",9}, {"Sinhala",9},{"SinhalaArchaicNumbers",6},{"Sinhala_Archaic_Numbers",6},{"Sk",18},{"Sm",18},{"Small",17}, {"SmallFormVariants",6},{"SmallForms",6},{"Small_Form_Variants",6},{"Small_Forms",6},{"Sml",17},{"So",18}, {"SoftDotted",97},{"Soft_Dotted",97},{"Sora",9},{"SoraSompeng",9},{"Sora_Sompeng",9},{"Soyo",9},{"Soyombo",9},{"Sp",22}, {"Space",14},{"SpaceSeparator",18},{"Space_Separator",18},{"SpacingMark",19},{"SpacingModifierLetters",6}, {"Spacing_Mark",18},{"Spacing_Modifier_Letters",6},{"SpecialCasing",11},{"Special_Casing",11},{"Specials",6},{"Sqr",17}, {"Square",17},{"StraightWaw",3},{"Straight_Waw",3},{"Sub",17},{"Sund",9},{"Sundanese",9},{"SundaneseSup",6}, {"SundaneseSupplement",6},{"Sundanese_Sup",6},{"Sundanese_Supplement",6},{"Sup",17},{"SupArrowsA",6},{"SupArrowsB",6}, {"SupArrowsC",6},{"SupMathOperators",6},{"SupPUAA",6},{"SupPUAB",6},{"SupPunctuation",6},{"SupSymbolsAndPictographs",6}, {"Sup_Arrows_A",6},{"Sup_Arrows_B",6},{"Sup_Arrows_C",6},{"Sup_Math_Operators",6},{"Sup_PUA_A",6},{"Sup_PUA_B",6}, {"Sup_Punctuation",6},{"Sup_Symbols_And_Pictographs",6},{"Super",17},{"SuperAndSub",6},{"Super_And_Sub",6}, {"SuperscriptsAndSubscripts",6},{"Superscripts_And_Subscripts",6},{"SupplementalArrowsA",6},{"SupplementalArrowsB",6}, {"SupplementalArrowsC",6},{"SupplementalMathematicalOperators",6},{"SupplementalPunctuation",6}, {"SupplementalSymbolsAndPictographs",6},{"Supplemental_Arrows_A",6},{"Supplemental_Arrows_B",6}, {"Supplemental_Arrows_C",6},{"Supplemental_Mathematical_Operators",6},{"Supplemental_Punctuation",6}, {"Supplemental_Symbols_And_Pictographs",6},{"SupplementaryPrivateUseAreaA",6},{"SupplementaryPrivateUseAreaB",6}, {"Supplementary_Private_Use_Area_A",6},{"Supplementary_Private_Use_Area_B",6},{"Surrogate",18},{"SuttonSignWriting",6}, {"Sutton_SignWriting",6},{"SwashKaf",3},{"Swash_Kaf",3},{"Sylo",9},{"SylotiNagri",9},{"Syloti_Nagri",9},{"Symbol",95}, {"Syrc",9},{"Syriac",9},{"SyriacSup",6},{"SyriacSupplement",6},{"SyriacWaw",3},{"Syriac_Sup",6},{"Syriac_Supplement",6}, {"Syriac_Waw",3},{"T",19},{"Tagalog",9},{"Tagb",9},{"Tagbanwa",9},{"Tags",6},{"Tah",3},{"TaiLe",9},{"TaiTham",9}, {"TaiViet",9},{"TaiXuanJing",6},{"TaiXuanJingSymbols",6},{"Tai_Le",9},{"Tai_Tham",9},{"Tai_Viet",9},{"Tai_Xuan_Jing",6}, {"Tai_Xuan_Jing_Symbols",6},{"Takr",9},{"Takri",9},{"Tale",9},{"Talu",9},{"Tamil",9},{"Taml",9},{"Tang",9},{"Tangut",9}, {"TangutComponents",6},{"Tangut_Components",6},{"Tavt",9},{"Taw",3},{"TehMarbuta",3},{"TehMarbutaGoal",3}, {"Teh_Marbuta",3},{"Teh_Marbuta_Goal",3},{"Telu",9},{"Telugu",9},{"Term",98},{"TerminalPunctuation",98}, {"Terminal_Punctuation",98},{"Teth",3},{"Tfng",9},{"Tglg",9},{"Thaa",9},{"Thaana",9},{"Thai",9},{"Tibetan",9},{"Tibt",9}, {"Tifinagh",9},{"Tirh",9},{"Tirhuta",9},{"TitlecaseLetter",18},{"Titlecase_Letter",18},{"TrailingJamo",23}, {"Trailing_Jamo",23},{"Transparent",24},{"TransportAndMap",6},{"TransportAndMapSymbols",6},{"Transport_And_Map",6}, {"Transport_And_Map_Symbols",6},{"U",24},{"UCAS",6},{"UCASExt",6},{"UCAS_Ext",6},{"UIdeo",99},{"UP",22},{"Ugar",9}, {"Ugaritic",9},{"Unassigned",18},{"UnifiedCanadianAboriginalSyllabics",6}, {"UnifiedCanadianAboriginalSyllabicsExtended",6},{"UnifiedIdeograph",99},{"Unified_Canadian_Aboriginal_Syllabics",6}, {"Unified_Canadian_Aboriginal_Syllabics_Extended",6},{"Unified_Ideograph",99},{"Unknown",9},{"Upper",100}, {"Uppercase",100},{"UppercaseLetter",18},{"Uppercase_Letter",18},{"V",19},{"V100",15},{"V10_0",15},{"V11",15}, {"V1_1",15},{"V20",15},{"V21",15},{"V2_0",15},{"V2_1",15},{"V30",15},{"V31",15},{"V32",15},{"V3_0",15},{"V3_1",15}, {"V3_2",15},{"V40",15},{"V41",15},{"V4_0",15},{"V4_1",15},{"V50",15},{"V51",15},{"V52",15},{"V5_0",15},{"V5_1",15}, {"V5_2",15},{"V60",15},{"V61",15},{"V62",15},{"V63",15},{"V6_0",15},{"V6_1",15},{"V6_2",15},{"V6_3",15},{"V70",15}, {"V7_0",15},{"V80",15},{"V8_0",15},{"V90",15},{"V9_0",15},{"VR",13},{"VS",101},{"VSSup",6},{"VS_Sup",6},{"Vai",9}, {"Vaii",9},{"VariationSelector",101},{"VariationSelectors",6},{"VariationSelectorsSupplement",6}, {"Variation_Selector",101},{"Variation_Selectors",6},{"Variation_Selectors_Supplement",6},{"VedicExt",6}, {"VedicExtensions",6},{"Vedic_Ext",6},{"Vedic_Extensions",6},{"Vert",17},{"Vertical",17},{"VerticalForms",6}, {"Vertical_Forms",6},{"Virama",13},{"VowelJamo",23},{"Vowel_Jamo",23},{"W",7},{"WB",21},{"WJ",14},{"WS",16}, {"WSpace",102},{"Wara",9},{"WarangCiti",9},{"Warang_Citi",9},{"Waw",3},{"WhiteSpace",102},{"White_Space",102}, {"Wide",17},{"WordBreak",21},{"WordJoiner",14},{"Word_Break",21},{"Word_Joiner",14},{"XIDC",103},{"XIDContinue",103}, {"XIDS",104},{"XIDStart",104},{"XID_Continue",103},{"XID_Start",104},{"XX",19},{"Xpeo",9},{"Xsux",9},{"Yeh",3}, {"YehBarree",3},{"YehWithTail",3},{"Yeh_Barree",3},{"Yeh_With_Tail",3},{"Yi",9},{"YiRadicals",6},{"YiSyllables",6}, {"Yi_Radicals",6},{"Yi_Syllables",6},{"Yiii",9},{"Yijing",6},{"YijingHexagramSymbols",6},{"Yijing_Hexagram_Symbols",6}, {"Yudh",3},{"YudhHe",3},{"Yudh_He",3},{"Z",105},{"ZW",14},{"ZWJ",19},{"ZWSpace",14},{"Zain",3},{"ZanabazarSquare",9}, {"Zanabazar_Square",9},{"Zanb",9},{"Zhain",3},{"Zinh",9},{"Zl",18},{"Zp",18},{"Zs",18},{"Zyyy",9},{"Zzzz",9},{"a",13}, {"above",13},{"above_left",13},{"above_right",13},{"aboveleft",13},{"aboveright",13},{"adlam",9},{"adlm",9}, {"aegean_numbers",6},{"aegeannumbers",6},{"african_feh",3},{"african_noon",3},{"african_qaf",3},{"africanfeh",3}, {"africannoon",3},{"africanqaf",3},{"age",15},{"aghb",9},{"ahex",28},{"ahom",9},{"ai",14},{"ain",3},{"al",16}, {"alaph",3},{"alchemical",6},{"alchemical_symbols",6},{"alchemicalsymbols",6},{"alef",3},{"aletter",21},{"alpha",29}, {"alphabetic",29},{"alphabetic_pf",6},{"alphabetic_presentation_forms",6},{"alphabeticpf",6}, {"alphabeticpresentationforms",6},{"ambiguous",7},{"an",16},{"anatolian_hieroglyphs",9},{"anatolianhieroglyphs",9}, {"ancient_greek_music",6},{"ancient_greek_musical_notation",6},{"ancient_greek_numbers",6},{"ancient_symbols",6}, {"ancientgreekmusic",6},{"ancientgreekmusicalnotation",6},{"ancientgreeknumbers",6},{"ancientsymbols",6},{"any",30}, {"ar",13},{"arab",9},{"arabic",9},{"arabic_ext_a",6},{"arabic_extended_a",6},{"arabic_letter",16},{"arabic_math",6}, {"arabic_mathematical_alphabetic_symbols",6},{"arabic_number",16},{"arabic_pf_a",6},{"arabic_pf_b",6}, {"arabic_presentation_forms-a",6},{"arabic_presentation_forms_a",6},{"arabic_presentation_forms_b",6},{"arabic_sup",6}, {"arabic_supplement",6},{"arabicexta",6},{"arabicextendeda",6},{"arabicletter",16},{"arabicmath",6}, {"arabicmathematicalalphabeticsymbols",6},{"arabicnumber",16},{"arabicpfa",6},{"arabicpfb",6}, {"arabicpresentationforms-a",6},{"arabicpresentationformsa",6},{"arabicpresentationformsb",6},{"arabicsup",6}, {"arabicsupplement",6},{"armenian",9},{"armi",9},{"armn",9},{"arrows",6},{"ascii",6},{"ascii_hex_digit",28}, {"asciihexdigit",28},{"assigned",31},{"at",22},{"ata",13},{"atar",13},{"atb",13},{"atbl",13},{"aterm",22}, {"attached_above",13},{"attached_above_right",13},{"attached_below",13},{"attached_below_left",13},{"attachedabove",13}, {"attachedaboveright",13},{"attachedbelow",13},{"attachedbelowleft",13},{"avestan",9},{"avst",9},{"b",16},{"b2",14}, {"ba",14},{"bali",9},{"balinese",9},{"bamu",9},{"bamum",9},{"bamum_sup",6},{"bamum_supplement",6},{"bamumsup",6}, {"bamumsupplement",6},{"basic_latin",6},{"basiclatin",6},{"bass",9},{"bassa_vah",9},{"bassavah",9},{"batak",9}, {"batk",9},{"bb",14},{"bc",16},{"beh",3},{"below",13},{"below_left",13},{"below_right",13},{"belowleft",13}, {"belowright",13},{"beng",9},{"bengali",9},{"beth",3},{"bhaiksuki",9},{"bhks",9},{"bidi_c",32},{"bidi_class",16}, {"bidi_control",32},{"bidi_m",33},{"bidi_mirrored",33},{"bidi_mirroring_glyph",5},{"bidic",32},{"bidiclass",16}, {"bidicontrol",32},{"bidim",33},{"bidimirrored",33},{"bidimirroringglyph",5},{"bk",14},{"bl",13},{"blk",6},{"block",6}, {"block_elements",6},{"blockelements",6},{"bmg",5},{"bn",16},{"bopo",9},{"bopomofo",9},{"bopomofo_ext",6}, {"bopomofo_extended",6},{"bopomofoext",6},{"bopomofoextended",6},{"boundary_neutral",16},{"boundaryneutral",16}, {"box_drawing",6},{"boxdrawing",6},{"br",13},{"brah",9},{"brahmi",9},{"brai",9},{"braille",9},{"braille_patterns",6}, {"braillepatterns",6},{"break_after",14},{"break_before",14},{"break_both",14},{"break_symbols",14},{"breakafter",14}, {"breakbefore",14},{"breakboth",14},{"breaksymbols",14},{"bugi",9},{"buginese",9},{"buhd",9},{"buhid",9}, {"burushaski_yeh_barree",3},{"burushaskiyehbarree",3},{"byzantine_music",6},{"byzantine_musical_symbols",6}, {"byzantinemusic",6},{"byzantinemusicalsymbols",6},{"c",34},{"cakm",9},{"can",17},{"canadian_aboriginal",9}, {"canadian_syllabics",6},{"canadianaboriginal",9},{"canadiansyllabics",6},{"canonical",17}, {"canonical_combining_class",13},{"canonicalcombiningclass",13},{"cans",9},{"cari",9},{"carian",9}, {"carriage_return",14},{"carriagereturn",14},{"case_change_index",2},{"case_folding",4},{"case_folding_simple",35}, {"case_ignorable",36},{"casechangeindex",2},{"cased",37},{"cased_letter",67},{"casedletter",67},{"casefolding",4}, {"casefoldingsimple",35},{"caseignorable",36},{"caucasian_albanian",9},{"caucasianalbanian",9},{"cb",14},{"cc",18}, {"ccc",13},{"ccc10",13},{"ccc103",13},{"ccc107",13},{"ccc11",13},{"ccc118",13},{"ccc12",13},{"ccc122",13},{"ccc129",13}, {"ccc13",13},{"ccc130",13},{"ccc132",13},{"ccc133",13},{"ccc14",13},{"ccc15",13},{"ccc16",13},{"ccc17",13},{"ccc18",13}, {"ccc19",13},{"ccc20",13},{"ccc21",13},{"ccc22",13},{"ccc23",13},{"ccc24",13},{"ccc25",13},{"ccc26",13},{"ccc27",13}, {"ccc28",13},{"ccc29",13},{"ccc30",13},{"ccc31",13},{"ccc32",13},{"ccc33",13},{"ccc34",13},{"ccc35",13},{"ccc36",13}, {"ccc84",13},{"ccc91",13},{"cf",4},{"chakma",9},{"cham",9},{"changes_when_casefolded",38},{"changes_when_casemapped",39}, {"changes_when_lowercased",40},{"changes_when_nfkc_casefolded",41},{"changes_when_titlecased",42}, {"changes_when_uppercased",43},{"changeswhencasefolded",38},{"changeswhencasemapped",39},{"changeswhenlowercased",40}, {"changeswhennfkccasefolded",41},{"changeswhentitlecased",42},{"changeswhenuppercased",43},{"cher",9},{"cherokee",9}, {"cherokee_sup",6},{"cherokee_supplement",6},{"cherokeesup",6},{"cherokeesupplement",6},{"ci",36},{"circle",17}, {"cj",14},{"cjk",6},{"cjk_compat",6},{"cjk_compat_forms",6},{"cjk_compat_ideographs",6},{"cjk_compat_ideographs_sup",6}, {"cjk_compatibility",6},{"cjk_compatibility_forms",6},{"cjk_compatibility_ideographs",6}, {"cjk_compatibility_ideographs_supplement",6},{"cjk_ext_a",6},{"cjk_ext_b",6},{"cjk_ext_c",6},{"cjk_ext_d",6}, {"cjk_ext_e",6},{"cjk_ext_f",6},{"cjk_radicals_sup",6},{"cjk_radicals_supplement",6},{"cjk_strokes",6},{"cjk_symbols",6}, {"cjk_symbols_and_punctuation",6},{"cjk_unified_ideographs",6},{"cjk_unified_ideographs_extension_a",6}, {"cjk_unified_ideographs_extension_b",6},{"cjk_unified_ideographs_extension_c",6}, {"cjk_unified_ideographs_extension_d",6},{"cjk_unified_ideographs_extension_e",6}, {"cjk_unified_ideographs_extension_f",6},{"cjkcompat",6},{"cjkcompatforms",6},{"cjkcompatibility",6}, {"cjkcompatibilityforms",6},{"cjkcompatibilityideographs",6},{"cjkcompatibilityideographssupplement",6}, {"cjkcompatideographs",6},{"cjkcompatideographssup",6},{"cjkexta",6},{"cjkextb",6},{"cjkextc",6},{"cjkextd",6}, {"cjkexte",6},{"cjkextf",6},{"cjkradicalssup",6},{"cjkradicalssupplement",6},{"cjkstrokes",6},{"cjksymbols",6}, {"cjksymbolsandpunctuation",6},{"cjkunifiedideographs",6},{"cjkunifiedideographsextensiona",6}, {"cjkunifiedideographsextensionb",6},{"cjkunifiedideographsextensionc",6},{"cjkunifiedideographsextensiond",6}, {"cjkunifiedideographsextensione",6},{"cjkunifiedideographsextensionf",6},{"cl",22},{"close",22}, {"close_parenthesis",14},{"close_punctuation",18},{"closeparenthesis",14},{"closepunctuation",18},{"cm",14},{"cn",18}, {"cntrl",18},{"co",18},{"com",17},{"combining_diacritical_marks",6},{"combining_diacritical_marks_extended",6}, {"combining_diacritical_marks_for_symbols",6},{"combining_diacritical_marks_supplement",6},{"combining_half_marks",6}, {"combining_mark",70},{"combining_marks_for_symbols",6},{"combiningdiacriticalmarks",6}, {"combiningdiacriticalmarksextended",6},{"combiningdiacriticalmarksforsymbols",6}, {"combiningdiacriticalmarkssupplement",6},{"combininghalfmarks",6},{"combiningmark",70},{"combiningmarksforsymbols",6}, {"common",9},{"common_indic_number_forms",6},{"common_separator",16},{"commonindicnumberforms",6},{"commonseparator",16}, {"comp_ex",54},{"compat",17},{"compat_jamo",6},{"compatjamo",6},{"compex",54},{"complex_context",14}, {"complexcontext",14},{"conditional_japanese_starter",14},{"conditionaljapanesestarter",14},{"connector_punctuation",18}, {"connectorpunctuation",18},{"contingent_break",14},{"contingentbreak",14},{"control",18},{"control_pictures",6}, {"controlpictures",6},{"copt",9},{"coptic",9},{"coptic_epact_numbers",6},{"copticepactnumbers",6},{"counting_rod",6}, {"counting_rod_numerals",6},{"countingrod",6},{"countingrodnumerals",6},{"cp",14},{"cprt",9},{"cr",19},{"cs",18}, {"cuneiform",9},{"cuneiform_numbers",6},{"cuneiform_numbers_and_punctuation",6},{"cuneiformnumbers",6}, {"cuneiformnumbersandpunctuation",6},{"currency_symbol",18},{"currency_symbols",6},{"currencysymbol",18}, {"currencysymbols",6},{"cwcf",38},{"cwcm",39},{"cwkcf",41},{"cwl",40},{"cwt",42},{"cwu",43},{"cypriot",9}, {"cypriot_syllabary",6},{"cypriotsyllabary",6},{"cyrillic",9},{"cyrillic_ext_a",6},{"cyrillic_ext_b",6}, {"cyrillic_ext_c",6},{"cyrillic_extended_a",6},{"cyrillic_extended_b",6},{"cyrillic_extended_c",6},{"cyrillic_sup",6}, {"cyrillic_supplement",6},{"cyrillic_supplementary",6},{"cyrillicexta",6},{"cyrillicextb",6},{"cyrillicextc",6}, {"cyrillicextendeda",6},{"cyrillicextendedb",6},{"cyrillicextendedc",6},{"cyrillicsup",6},{"cyrillicsupplement",6}, {"cyrillicsupplementary",6},{"cyrl",9},{"d",24},{"da",13},{"dal",3},{"dalath_rish",3},{"dalathrish",3},{"dash",44}, {"dash_punctuation",18},{"dashpunctuation",18},{"db",13},{"de",27},{"decimal",27},{"decimal_number",18}, {"decimalnumber",18},{"decomp_spec",1},{"decomposition_type",17},{"decompositiontype",17},{"decompspec",1}, {"default_ignorable_code_point",45},{"defaultignorablecodepoint",45},{"dep",46},{"deprecated",46},{"deseret",9}, {"deva",9},{"devanagari",9},{"devanagari_ext",6},{"devanagari_extended",6},{"devanagariext",6},{"devanagariextended",6}, {"di",45},{"dia",47},{"diacritic",47},{"diacriticals",6},{"diacriticals_ext",6},{"diacriticals_for_symbols",6}, {"diacriticals_sup",6},{"diacriticalsext",6},{"diacriticalsforsymbols",6},{"diacriticalssup",6},{"digit",18}, {"dingbats",6},{"domino",6},{"domino_tiles",6},{"dominotiles",6},{"double_above",13},{"double_below",13}, {"double_quote",21},{"doubleabove",13},{"doublebelow",13},{"doublequote",21},{"dq",21},{"dsrt",9},{"dt",17}, {"dual_joining",24},{"dualjoining",24},{"dupl",9},{"duployan",9},{"e",3},{"e_base",19},{"e_base_gaz",19}, {"e_modifier",19},{"ea",7},{"early_dynastic_cuneiform",6},{"earlydynasticcuneiform",6},{"east_asian_width",7}, {"eastasianwidth",7},{"eb",19},{"ebase",19},{"ebasegaz",19},{"ebg",19},{"egyp",9},{"egyptian_hieroglyphs",9}, {"egyptianhieroglyphs",9},{"elba",9},{"elbasan",9},{"em",19},{"emodifier",19},{"emoji",48},{"emoji_component",49}, {"emoji_modifier",50},{"emoji_modifier_base",51},{"emoji_presentation",52},{"emojicomponent",49},{"emojimodifier",50}, {"emojimodifierbase",51},{"emojipresentation",52},{"emoticons",6},{"en",16},{"enc",17},{"enclosed_alphanum",6}, {"enclosed_alphanum_sup",6},{"enclosed_alphanumeric_supplement",6},{"enclosed_alphanumerics",6},{"enclosed_cjk",6}, {"enclosed_cjk_letters_and_months",6},{"enclosed_ideographic_sup",6},{"enclosed_ideographic_supplement",6}, {"enclosedalphanum",6},{"enclosedalphanumerics",6},{"enclosedalphanumericsupplement",6},{"enclosedalphanumsup",6}, {"enclosedcjk",6},{"enclosedcjklettersandmonths",6},{"enclosedideographicsup",6},{"enclosedideographicsupplement",6}, {"enclosing_mark",18},{"enclosingmark",18},{"es",16},{"et",16},{"ethi",9},{"ethiopic",9},{"ethiopic_ext",6}, {"ethiopic_ext_a",6},{"ethiopic_extended",6},{"ethiopic_extended_a",6},{"ethiopic_sup",6},{"ethiopic_supplement",6}, {"ethiopicext",6},{"ethiopicexta",6},{"ethiopicextended",6},{"ethiopicextendeda",6},{"ethiopicsup",6}, {"ethiopicsupplement",6},{"european_number",16},{"european_separator",16},{"european_terminator",16}, {"europeannumber",16},{"europeanseparator",16},{"europeanterminator",16},{"ex",19},{"exclamation",14},{"ext",53}, {"extend",19},{"extender",53},{"extendnumlet",21},{"f",7},{"farsi_yeh",3},{"farsiyeh",3},{"fe",3},{"feh",3},{"fin",17}, {"final",17},{"final_punctuation",18},{"final_semkath",3},{"finalpunctuation",18},{"finalsemkath",3}, {"first_strong_isolate",16},{"firststrongisolate",16},{"fo",22},{"font",17},{"format",18},{"fra",17},{"fraction",17}, {"fsi",16},{"full_composition_exclusion",54},{"fullcompositionexclusion",54},{"fullwidth",7},{"gaf",3},{"gamal",3}, {"gaz",19},{"gc",18},{"gcb",19},{"general_category",18},{"general_punctuation",6},{"generalcategory",18}, {"generalpunctuation",6},{"geometric_shapes",6},{"geometric_shapes_ext",6},{"geometric_shapes_extended",6}, {"geometricshapes",6},{"geometricshapesext",6},{"geometricshapesextended",6},{"geor",9},{"georgian",9}, {"georgian_sup",6},{"georgian_supplement",6},{"georgiansup",6},{"georgiansupplement",6},{"gl",14},{"glag",9}, {"glagolitic",9},{"glagolitic_sup",6},{"glagolitic_supplement",6},{"glagoliticsup",6},{"glagoliticsupplement",6}, {"glue",14},{"glue_after_zwj",19},{"glueafterzwj",19},{"gonm",9},{"goth",9},{"gothic",9},{"gr_base",55},{"gr_ext",56}, {"gr_link",57},{"gran",9},{"grantha",9},{"grapheme_base",55},{"grapheme_cluster_break",19},{"grapheme_extend",56}, {"grapheme_link",57},{"graphemebase",55},{"graphemeclusterbreak",19},{"graphemeextend",56},{"graphemelink",57}, {"grbase",55},{"greek",9},{"greek_and_coptic",6},{"greek_ext",6},{"greek_extended",6},{"greekandcoptic",6}, {"greekext",6},{"greekextended",6},{"grek",9},{"grext",56},{"grlink",57},{"gujarati",9},{"gujr",9},{"gurmukhi",9}, {"guru",9},{"h",7},{"h2",14},{"h3",14},{"hah",3},{"half_and_full_forms",6},{"half_marks",6},{"halfandfullforms",6}, {"halfmarks",6},{"halfwidth",7},{"halfwidth_and_fullwidth_forms",6},{"halfwidthandfullwidthforms",6}, {"hamza_on_heh_goal",3},{"hamzaonhehgoal",3},{"han",9},{"hang",9},{"hangul",9},{"hangul_compatibility_jamo",6}, {"hangul_jamo",6},{"hangul_jamo_extended_a",6},{"hangul_jamo_extended_b",6},{"hangul_syllable_type",23}, {"hangul_syllables",6},{"hangulcompatibilityjamo",6},{"hanguljamo",6},{"hanguljamoextendeda",6}, {"hanguljamoextendedb",6},{"hangulsyllables",6},{"hangulsyllabletype",23},{"hani",9},{"hano",9},{"hanunoo",9},{"hatr",9}, {"hatran",9},{"he",3},{"hebr",9},{"hebrew",9},{"hebrew_letter",21},{"hebrewletter",21},{"heh",3},{"heh_goal",3}, {"hehgoal",3},{"heth",3},{"hex",58},{"hex_digit",58},{"hexdigit",58},{"high_private_use_surrogates",6}, {"high_pu_surrogates",6},{"high_surrogates",6},{"highprivateusesurrogates",6},{"highpusurrogates",6}, {"highsurrogates",6},{"hira",9},{"hiragana",9},{"hl",21},{"hluw",9},{"hmng",9},{"hrkt",9},{"hst",23},{"hung",9}, {"hy",14},{"hyphen",59},{"id",14},{"id_continue",62},{"id_start",63},{"idc",62},{"idcontinue",62},{"ideo",64}, {"ideographic",64},{"ideographic_description_characters",6},{"ideographic_symbols",6}, {"ideographic_symbols_and_punctuation",6},{"ideographicdescriptioncharacters",6},{"ideographicsymbols",6}, {"ideographicsymbolsandpunctuation",6},{"ids",63},{"ids_binary_operator",60},{"ids_trinary_operator",61},{"idsb",60}, {"idsbinaryoperator",60},{"idst",61},{"idstart",63},{"idstrinaryoperator",61},{"imperial_aramaic",9}, {"imperialaramaic",9},{"in",14},{"indic_number_forms",6},{"indicnumberforms",6},{"infix_numeric",14},{"infixnumeric",14}, {"inherited",9},{"init",17},{"initial",17},{"initial_punctuation",18},{"initialpunctuation",18}, {"inscriptional_pahlavi",9},{"inscriptional_parthian",9},{"inscriptionalpahlavi",9},{"inscriptionalparthian",9}, {"inseparable",14},{"inseperable",14},{"iota_subscript",13},{"iotasubscript",13},{"ipa_ext",6},{"ipa_extensions",6}, {"ipaext",6},{"ipaextensions",6},{"is",13},{"iso",17},{"isolated",17},{"ital",9},{"jamo",6},{"jamo_ext_a",6}, {"jamo_ext_b",6},{"jamoexta",6},{"jamoextb",6},{"java",9},{"javanese",9},{"jg",3},{"jl",14},{"join_c",65}, {"join_causing",24},{"join_control",65},{"joinc",65},{"joincausing",24},{"joincontrol",65},{"joining_group",3}, {"joining_type",24},{"joininggroup",3},{"joiningtype",24},{"jt",24},{"jv",14},{"ka",21},{"kaf",3},{"kaithi",9}, {"kali",9},{"kana",9},{"kana_ext_a",6},{"kana_extended_a",6},{"kana_sup",6},{"kana_supplement",6},{"kana_voicing",13}, {"kanaexta",6},{"kanaextendeda",6},{"kanasup",6},{"kanasupplement",6},{"kanavoicing",13},{"kanbun",6},{"kangxi",6}, {"kangxi_radicals",6},{"kangxiradicals",6},{"kannada",9},{"kaph",3},{"katakana",9},{"katakana_ext",6}, {"katakana_or_hiragana",9},{"katakana_phonetic_extensions",6},{"katakanaext",6},{"katakanaorhiragana",9}, {"katakanaphoneticextensions",6},{"kayah_li",9},{"kayahli",9},{"khaph",3},{"khar",9},{"kharoshthi",9},{"khmer",9}, {"khmer_symbols",6},{"khmersymbols",6},{"khmr",9},{"khoj",9},{"khojki",9},{"khudawadi",9},{"knda",9},{"knotted_heh",3}, {"knottedheh",3},{"kthi",9},{"kv",13},{"l",66},{"lam",3},{"lamadh",3},{"lana",9},{"lao",9},{"laoo",9},{"latin",9}, {"latin1",6},{"latin1sup",6},{"latin1supplement",6},{"latin_1",6},{"latin_1_sup",6},{"latin_1_supplement",6}, {"latin_ext_a",6},{"latin_ext_additional",6},{"latin_ext_b",6},{"latin_ext_c",6},{"latin_ext_d",6},{"latin_ext_e",6}, {"latin_extended_a",6},{"latin_extended_additional",6},{"latin_extended_b",6},{"latin_extended_c",6}, {"latin_extended_d",6},{"latin_extended_e",6},{"latinexta",6},{"latinextadditional",6},{"latinextb",6},{"latinextc",6}, {"latinextd",6},{"latinexte",6},{"latinextendeda",6},{"latinextendedadditional",6},{"latinextendedb",6}, {"latinextendedc",6},{"latinextendedd",6},{"latinextendede",6},{"latn",9},{"lb",14},{"lc",67},{"le",22}, {"leading_jamo",23},{"leadingjamo",23},{"left",13},{"left_joining",24},{"left_to_right",16}, {"left_to_right_embedding",16},{"left_to_right_isolate",16},{"left_to_right_override",16},{"leftjoining",24}, {"lefttoright",16},{"lefttorightembedding",16},{"lefttorightisolate",16},{"lefttorightoverride",16},{"lepc",9}, {"lepcha",9},{"letter",66},{"letter_number",18},{"letterlike_symbols",6},{"letterlikesymbols",6},{"letternumber",18}, {"lf",19},{"limb",9},{"limbu",9},{"lina",9},{"linb",9},{"line_break",14},{"line_feed",14},{"line_separator",18}, {"linear_a",9},{"linear_b",9},{"linear_b_ideograms",6},{"linear_b_syllabary",6},{"lineara",9},{"linearb",9}, {"linearbideograms",6},{"linearbsyllabary",6},{"linebreak",14},{"linefeed",14},{"lineseparator",18},{"lisu",9},{"ll",18}, {"lm",18},{"lo",18},{"loe",68},{"logical_order_exception",68},{"logicalorderexception",68},{"low_surrogates",6}, {"lower",69},{"lowercase",69},{"lowercase_letter",18},{"lowercaseletter",18},{"lowsurrogates",6},{"lre",16},{"lri",16}, {"lro",16},{"lt",18},{"lu",18},{"lv",19},{"lv_syllable",23},{"lvsyllable",23},{"lvt",19},{"lvt_syllable",23}, {"lvtsyllable",23},{"lyci",9},{"lycian",9},{"lydi",9},{"lydian",9},{"m",70},{"mahajani",9},{"mahj",9},{"mahjong",6}, {"mahjong_tiles",6},{"mahjongtiles",6},{"malayalam",9},{"malayalam_bha",3},{"malayalam_ja",3},{"malayalam_lla",3}, {"malayalam_llla",3},{"malayalam_nga",3},{"malayalam_nna",3},{"malayalam_nnna",3},{"malayalam_nya",3},{"malayalam_ra",3}, {"malayalam_ssa",3},{"malayalam_tta",3},{"malayalambha",3},{"malayalamja",3},{"malayalamlla",3},{"malayalamllla",3}, {"malayalamnga",3},{"malayalamnna",3},{"malayalamnnna",3},{"malayalamnya",3},{"malayalamra",3},{"malayalamssa",3}, {"malayalamtta",3},{"mand",9},{"mandaic",9},{"mandatory_break",14},{"mandatorybreak",14},{"mani",9},{"manichaean",9}, {"manichaean_aleph",3},{"manichaean_ayin",3},{"manichaean_beth",3},{"manichaean_daleth",3},{"manichaean_dhamedh",3}, {"manichaean_five",3},{"manichaean_gimel",3},{"manichaean_heth",3},{"manichaean_hundred",3},{"manichaean_kaph",3}, {"manichaean_lamedh",3},{"manichaean_mem",3},{"manichaean_nun",3},{"manichaean_one",3},{"manichaean_pe",3}, {"manichaean_qoph",3},{"manichaean_resh",3},{"manichaean_sadhe",3},{"manichaean_samekh",3},{"manichaean_taw",3}, {"manichaean_ten",3},{"manichaean_teth",3},{"manichaean_thamedh",3},{"manichaean_twenty",3},{"manichaean_waw",3}, {"manichaean_yodh",3},{"manichaean_zayin",3},{"manichaeanaleph",3},{"manichaeanayin",3},{"manichaeanbeth",3}, {"manichaeandaleth",3},{"manichaeandhamedh",3},{"manichaeanfive",3},{"manichaeangimel",3},{"manichaeanheth",3}, {"manichaeanhundred",3},{"manichaeankaph",3},{"manichaeanlamedh",3},{"manichaeanmem",3},{"manichaeannun",3}, {"manichaeanone",3},{"manichaeanpe",3},{"manichaeanqoph",3},{"manichaeanresh",3},{"manichaeansadhe",3}, {"manichaeansamekh",3},{"manichaeantaw",3},{"manichaeanten",3},{"manichaeanteth",3},{"manichaeanthamedh",3}, {"manichaeantwenty",3},{"manichaeanwaw",3},{"manichaeanyodh",3},{"manichaeanzayin",3},{"marc",9},{"marchen",9}, {"mark",70},{"masaram_gondi",9},{"masaramgondi",9},{"math",73},{"math_alphanum",6},{"math_operators",6}, {"math_symbol",18},{"mathalphanum",6},{"mathematical_alphanumeric_symbols",6},{"mathematical_operators",6}, {"mathematicalalphanumericsymbols",6},{"mathematicaloperators",6},{"mathoperators",6},{"mathsymbol",18},{"maybe",12}, {"mb",21},{"mc",18},{"me",18},{"med",17},{"medial",17},{"meem",3},{"meetei_mayek",9},{"meetei_mayek_ext",6}, {"meetei_mayek_extensions",6},{"meeteimayek",9},{"meeteimayekext",6},{"meeteimayekextensions",6},{"mend",9}, {"mende_kikakui",9},{"mendekikakui",9},{"merc",9},{"mero",9},{"meroitic_cursive",9},{"meroitic_hieroglyphs",9}, {"meroiticcursive",9},{"meroitichieroglyphs",9},{"miao",9},{"midletter",21},{"midnum",21},{"midnumlet",21},{"mim",3}, {"misc_arrows",6},{"misc_math_symbols_a",6},{"misc_math_symbols_b",6},{"misc_pictographs",6},{"misc_symbols",6}, {"misc_technical",6},{"miscarrows",6},{"miscellaneous_mathematical_symbols_a",6}, {"miscellaneous_mathematical_symbols_b",6},{"miscellaneous_symbols",6},{"miscellaneous_symbols_and_arrows",6}, {"miscellaneous_symbols_and_pictographs",6},{"miscellaneous_technical",6},{"miscellaneousmathematicalsymbolsa",6}, {"miscellaneousmathematicalsymbolsb",6},{"miscellaneoussymbols",6},{"miscellaneoussymbolsandarrows",6}, {"miscellaneoussymbolsandpictographs",6},{"miscellaneoustechnical",6},{"miscmathsymbolsa",6},{"miscmathsymbolsb",6}, {"miscpictographs",6},{"miscsymbols",6},{"misctechnical",6},{"ml",21},{"mlym",9},{"mn",18},{"modi",9}, {"modifier_letter",18},{"modifier_letters",6},{"modifier_symbol",18},{"modifier_tone_letters",6},{"modifierletter",18}, {"modifierletters",6},{"modifiersymbol",18},{"modifiertoneletters",6},{"mong",9},{"mongolian",9},{"mongolian_sup",6}, {"mongolian_supplement",6},{"mongoliansup",6},{"mongoliansupplement",6},{"mro",9},{"mroo",9},{"mtei",9},{"mult",9}, {"multani",9},{"music",6},{"musical_symbols",6},{"musicalsymbols",6},{"mvm_collation_primary",71}, {"mvm_collation_qc",72},{"mvm_collation_secondary",75},{"mvm_collation_tertiary",76},{"mvmcollationprimary",71}, {"mvmcollationqc",72},{"mvmcollationsecondary",75},{"mvmcollationtertiary",76},{"myanmar",9},{"myanmar_ext_a",6}, {"myanmar_ext_b",6},{"myanmar_extended_a",6},{"myanmar_extended_b",6},{"myanmarexta",6},{"myanmarextb",6}, {"myanmarextendeda",6},{"myanmarextendedb",6},{"mymr",9},{"n",74},{"na",15},{"nabataean",9},{"nar",17},{"narb",9}, {"narrow",17},{"nb",17},{"nbat",9},{"nchar",79},{"nd",18},{"neutral",7},{"new_tai_lue",9},{"newa",9},{"newline",21}, {"newtailue",9},{"next_line",14},{"nextline",14},{"nfc_qc",12},{"nfc_quick_check",12},{"nfcqc",12},{"nfcquickcheck",12}, {"nfd_qc",77},{"nfd_quick_check",77},{"nfdqc",77},{"nfdquickcheck",77},{"nfg_qc",25},{"nfgqc",25},{"nfkc_qc",26}, {"nfkc_quick_check",26},{"nfkcqc",26},{"nfkcquickcheck",26},{"nfkd_qc",78},{"nfkd_quick_check",78},{"nfkdqc",78}, {"nfkdquickcheck",78},{"nk",13},{"nko",9},{"nkoo",9},{"nl",18},{"no",18},{"no_block",6},{"no_joining_group",3}, {"noblock",6},{"nobreak",17},{"nojoininggroup",3},{"non_joining",24},{"noncharacter_code_point",79}, {"noncharactercodepoint",79},{"none",17},{"nonjoining",24},{"nonspacing_mark",18},{"nonspacingmark",18}, {"nonstarter",14},{"noon",3},{"not_applicable",23},{"not_reordered",13},{"notapplicable",23},{"notreordered",13}, {"nr",13},{"ns",14},{"nshu",9},{"nsm",16},{"nt",27},{"nu",22},{"nukta",13},{"number",74},{"number_forms",6}, {"numberforms",6},{"numeric",22},{"numeric_type",27},{"numeric_value",8},{"numeric_value_denominator",20}, {"numeric_value_numerator",10},{"numerictype",27},{"numericvalue",8},{"numericvaluedenominator",20}, {"numericvaluenumerator",10},{"nun",3},{"nushu",9},{"nv",8},{"nya",3},{"oalpha",80},{"ocr",6},{"odi",81},{"ogam",9}, {"ogham",9},{"ogr_ext",82},{"ogrext",82},{"oidc",83},{"oids",84},{"ol_chiki",9},{"olchiki",9},{"olck",9}, {"old_hungarian",9},{"old_italic",9},{"old_north_arabian",9},{"old_permic",9},{"old_persian",9},{"old_south_arabian",9}, {"old_turkic",9},{"oldhungarian",9},{"olditalic",9},{"oldnortharabian",9},{"oldpermic",9},{"oldpersian",9}, {"oldsoutharabian",9},{"oldturkic",9},{"oletter",22},{"olower",85},{"omath",86},{"on",16},{"op",14}, {"open_punctuation",18},{"openpunctuation",18},{"optical_character_recognition",6},{"opticalcharacterrecognition",6}, {"oriya",9},{"orkh",9},{"ornamental_dingbats",6},{"ornamentaldingbats",6},{"orya",9},{"osage",9},{"osge",9},{"osma",9}, {"osmanya",9},{"other",34},{"other_alphabetic",80},{"other_default_ignorable_code_point",81}, {"other_grapheme_extend",82},{"other_id_continue",83},{"other_id_start",84},{"other_letter",18},{"other_lowercase",85}, {"other_math",86},{"other_neutral",16},{"other_number",18},{"other_punctuation",18},{"other_symbol",18}, {"other_uppercase",87},{"otheralphabetic",80},{"otherdefaultignorablecodepoint",81},{"othergraphemeextend",82}, {"otheridcontinue",83},{"otheridstart",84},{"otherletter",18},{"otherlowercase",85},{"othermath",86},{"otherneutral",16}, {"othernumber",18},{"otherpunctuation",18},{"othersymbol",18},{"otheruppercase",87},{"oupper",87},{"ov",13}, {"overlay",13},{"p",88},{"pahawh_hmong",9},{"pahawhhmong",9},{"palm",9},{"palmyrene",9},{"paragraph_separator",18}, {"paragraphseparator",18},{"pat_syn",89},{"pat_ws",90},{"patsyn",89},{"pattern_syntax",89},{"pattern_white_space",90}, {"patternsyntax",89},{"patternwhitespace",90},{"patws",90},{"pau_cin_hau",9},{"pauc",9},{"paucinhau",9},{"pc",18}, {"pcm",91},{"pd",18},{"pdf",16},{"pdi",16},{"pe",18},{"perm",9},{"pf",18},{"phag",9},{"phags_pa",9},{"phagspa",9}, {"phaistos",6},{"phaistos_disc",6},{"phaistosdisc",6},{"phli",9},{"phlp",9},{"phnx",9},{"phoenician",9}, {"phonetic_ext",6},{"phonetic_ext_sup",6},{"phonetic_extensions",6},{"phonetic_extensions_supplement",6}, {"phoneticext",6},{"phoneticextensions",6},{"phoneticextensionssupplement",6},{"phoneticextsup",6},{"pi",18}, {"playing_cards",6},{"playingcards",6},{"plrd",9},{"po",18},{"pop_directional_format",16},{"pop_directional_isolate",16}, {"popdirectionalformat",16},{"popdirectionalisolate",16},{"postfix_numeric",14},{"postfixnumeric",14},{"pp",19}, {"pr",14},{"prefix_numeric",14},{"prefixnumeric",14},{"prepend",19},{"prepended_concatenation_mark",91}, {"prependedconcatenationmark",91},{"private_use",18},{"private_use_area",6},{"privateuse",18},{"privateusearea",6}, {"prti",9},{"ps",18},{"psalter_pahlavi",9},{"psalterpahlavi",9},{"pua",6},{"punct",88},{"punctuation",88},{"qaac",9}, {"qaai",9},{"qaf",3},{"qaph",3},{"qmark",92},{"qu",14},{"quotation",14},{"quotation_mark",92},{"quotationmark",92}, {"r",16},{"radical",93},{"regional_indicator",94},{"regionalindicator",94},{"reh",3},{"rejang",9},{"reserved",13}, {"reversed_pe",3},{"reversedpe",3},{"ri",94},{"right",13},{"right_joining",24},{"right_to_left",16}, {"right_to_left_embedding",16},{"right_to_left_isolate",16},{"right_to_left_override",16},{"rightjoining",24}, {"righttoleft",16},{"righttoleftembedding",16},{"righttoleftisolate",16},{"righttoleftoverride",16},{"rjng",9}, {"rle",16},{"rli",16},{"rlo",16},{"rohingya_yeh",3},{"rohingyayeh",3},{"rumi",6},{"rumi_numeral_symbols",6}, {"ruminumeralsymbols",6},{"runic",9},{"runr",9},{"s",95},{"sa",14},{"sad",3},{"sadhe",3},{"samaritan",9},{"samr",9}, {"sarb",9},{"saur",9},{"saurashtra",9},{"sb",22},{"sc",9},{"scontinue",22},{"script",9},{"sd",97},{"se",22},{"seen",3}, {"segment_separator",16},{"segmentseparator",16},{"semkath",3},{"sentence_break",22},{"sentence_terminal",96}, {"sentencebreak",22},{"sentenceterminal",96},{"sep",22},{"separator",105},{"sg",14},{"sgnw",9},{"sharada",9}, {"shavian",9},{"shaw",9},{"shin",3},{"shorthand_format_controls",6},{"shorthandformatcontrols",6},{"shrd",9},{"sidd",9}, {"siddham",9},{"signwriting",9},{"sind",9},{"single_quote",21},{"singlequote",21},{"sinh",9},{"sinhala",9}, {"sinhala_archaic_numbers",6},{"sinhalaarchaicnumbers",6},{"sk",18},{"sm",18},{"small",17},{"small_form_variants",6}, {"small_forms",6},{"smallforms",6},{"smallformvariants",6},{"sml",17},{"so",18},{"soft_dotted",97},{"softdotted",97}, {"sora",9},{"sora_sompeng",9},{"sorasompeng",9},{"soyo",9},{"soyombo",9},{"sp",22},{"space",102},{"space_separator",18}, {"spaceseparator",18},{"spacing_mark",18},{"spacing_modifier_letters",6},{"spacingmark",18},{"spacingmodifierletters",6}, {"special_casing",11},{"specialcasing",11},{"specials",6},{"sq",21},{"sqr",17},{"square",17},{"st",22},{"sterm",96}, {"straight_waw",3},{"straightwaw",3},{"sub",17},{"sund",9},{"sundanese",9},{"sundanese_sup",6}, {"sundanese_supplement",6},{"sundanesesup",6},{"sundanesesupplement",6},{"sup",17},{"sup_arrows_a",6},{"sup_arrows_b",6}, {"sup_arrows_c",6},{"sup_math_operators",6},{"sup_pua_a",6},{"sup_pua_b",6},{"sup_punctuation",6}, {"sup_symbols_and_pictographs",6},{"suparrowsa",6},{"suparrowsb",6},{"suparrowsc",6},{"super",17},{"super_and_sub",6}, {"superandsub",6},{"superscripts_and_subscripts",6},{"superscriptsandsubscripts",6},{"supmathoperators",6}, {"supplemental_arrows_a",6},{"supplemental_arrows_b",6},{"supplemental_arrows_c",6}, {"supplemental_mathematical_operators",6},{"supplemental_punctuation",6},{"supplemental_symbols_and_pictographs",6}, {"supplementalarrowsa",6},{"supplementalarrowsb",6},{"supplementalarrowsc",6},{"supplementalmathematicaloperators",6}, {"supplementalpunctuation",6},{"supplementalsymbolsandpictographs",6},{"supplementary_private_use_area_a",6}, {"supplementary_private_use_area_b",6},{"supplementaryprivateuseareaa",6},{"supplementaryprivateuseareab",6}, {"suppuaa",6},{"suppuab",6},{"suppunctuation",6},{"supsymbolsandpictographs",6},{"surrogate",18}, {"sutton_signwriting",6},{"suttonsignwriting",6},{"swash_kaf",3},{"swashkaf",3},{"sy",14},{"sylo",9},{"syloti_nagri",9}, {"sylotinagri",9},{"symbol",95},{"syrc",9},{"syriac",9},{"syriac_sup",6},{"syriac_supplement",6},{"syriac_waw",3}, {"syriacsup",6},{"syriacsupplement",6},{"syriacwaw",3},{"t",19},{"tagalog",9},{"tagb",9},{"tagbanwa",9},{"tags",6}, {"tah",3},{"tai_le",9},{"tai_tham",9},{"tai_viet",9},{"tai_xuan_jing",6},{"tai_xuan_jing_symbols",6},{"taile",9}, {"taitham",9},{"taiviet",9},{"taixuanjing",6},{"taixuanjingsymbols",6},{"takr",9},{"takri",9},{"tale",9},{"talu",9}, {"tamil",9},{"taml",9},{"tang",9},{"tangut",9},{"tangut_components",6},{"tangutcomponents",6},{"tavt",9},{"taw",3}, {"teh_marbuta",3},{"teh_marbuta_goal",3},{"tehmarbuta",3},{"tehmarbutagoal",3},{"telu",9},{"telugu",9},{"term",98}, {"terminal_punctuation",98},{"terminalpunctuation",98},{"teth",3},{"tfng",9},{"tglg",9},{"thaa",9},{"thaana",9}, {"thai",9},{"tibetan",9},{"tibt",9},{"tifinagh",9},{"tirh",9},{"tirhuta",9},{"titlecase_letter",18}, {"titlecaseletter",18},{"trailing_jamo",23},{"trailingjamo",23},{"transparent",24},{"transport_and_map",6}, {"transport_and_map_symbols",6},{"transportandmap",6},{"transportandmapsymbols",6},{"u",24},{"ucas",6},{"ucas_ext",6}, {"ucasext",6},{"ugar",9},{"ugaritic",9},{"uideo",99},{"unassigned",18},{"unified_canadian_aboriginal_syllabics",6}, {"unified_canadian_aboriginal_syllabics_extended",6},{"unified_ideograph",99},{"unifiedcanadianaboriginalsyllabics",6}, {"unifiedcanadianaboriginalsyllabicsextended",6},{"unifiedideograph",99},{"unknown",9},{"up",22},{"upper",100}, {"uppercase",100},{"uppercase_letter",18},{"uppercaseletter",18},{"v",19},{"v100",15},{"v10_0",15},{"v11",15}, {"v1_1",15},{"v20",15},{"v21",15},{"v2_0",15},{"v2_1",15},{"v30",15},{"v31",15},{"v32",15},{"v3_0",15},{"v3_1",15}, {"v3_2",15},{"v40",15},{"v41",15},{"v4_0",15},{"v4_1",15},{"v50",15},{"v51",15},{"v52",15},{"v5_0",15},{"v5_1",15}, {"v5_2",15},{"v60",15},{"v61",15},{"v62",15},{"v63",15},{"v6_0",15},{"v6_1",15},{"v6_2",15},{"v6_3",15},{"v70",15}, {"v7_0",15},{"v80",15},{"v8_0",15},{"v90",15},{"v9_0",15},{"vai",9},{"vaii",9},{"variation_selector",101}, {"variation_selectors",6},{"variation_selectors_supplement",6},{"variationselector",101},{"variationselectors",6}, {"variationselectorssupplement",6},{"vedic_ext",6},{"vedic_extensions",6},{"vedicext",6},{"vedicextensions",6}, {"vert",17},{"vertical",17},{"vertical_forms",6},{"verticalforms",6},{"virama",13},{"vowel_jamo",23},{"voweljamo",23}, {"vr",13},{"vs",101},{"vs_sup",6},{"vssup",6},{"w",7},{"wara",9},{"warang_citi",9},{"warangciti",9},{"waw",3},{"wb",21}, {"white_space",102},{"whitespace",102},{"wide",17},{"wj",14},{"word_break",21},{"word_joiner",14},{"wordbreak",21}, {"wordjoiner",14},{"ws",16},{"wspace",102},{"xid_continue",103},{"xid_start",104},{"xidc",103},{"xidcontinue",103}, {"xids",104},{"xidstart",104},{"xpeo",9},{"xsux",9},{"xx",19},{"yeh",3},{"yeh_barree",3},{"yeh_with_tail",3}, {"yehbarree",3},{"yehwithtail",3},{"yi",9},{"yi_radicals",6},{"yi_syllables",6},{"yiii",9},{"yijing",6}, {"yijing_hexagram_symbols",6},{"yijinghexagramsymbols",6},{"yiradicals",6},{"yisyllables",6},{"yudh",3},{"yudh_he",3}, {"yudhhe",3},{"z",105},{"zain",3},{"zanabazar_square",9},{"zanabazarsquare",9},{"zanb",9},{"zhain",3},{"zinh",9}, {"zl",18},{"zp",18},{"zs",18},{"zw",14},{"zwj",19},{"zwspace",14},{"zyyy",9},{"zzzz",9} }; static MVMUnicodeNameRegistry **unicode_property_values_hashes; static const MVMUnicodeNamedValue unicode_property_value_keypairs[4246] = { {"18-C",570425345},{"18-c",570425345},{"18-c",570425345},{"18-Other",570425345},{"18-other",570425345}, {"18-other",570425345},{"18-L",1107296257},{"18-l",1107296257},{"18-l",1107296257},{"18-Letter",1107296257}, {"18-letter",1107296257},{"18-letter",1107296257},{"18-LC",1124073473},{"18-lc",1124073473},{"18-lc",1124073473}, {"18-Cased_Letter",1124073473},{"18-CasedLetter",1124073473},{"18-casedletter",1124073473}, {"18-cased_letter",1124073473},{"18-M",1174405121},{"18-m",1174405121},{"18-m",1174405121},{"18-Mark",1174405121}, {"18-mark",1174405121},{"18-mark",1174405121},{"18-Combining_Mark",1174405121},{"18-CombiningMark",1174405121}, {"18-combiningmark",1174405121},{"18-combining_mark",1174405121},{"18-N",1241513985},{"18-n",1241513985}, {"18-n",1241513985},{"18-Number",1241513985},{"18-number",1241513985},{"18-number",1241513985},{"18-P",1476395009}, {"18-p",1476395009},{"18-p",1476395009},{"18-Punctuation",1476395009},{"18-punctuation",1476395009}, {"18-punctuation",1476395009},{"18-punct",1476395009},{"18-S",1593835521},{"18-s",1593835521},{"18-s",1593835521}, {"18-Symbol",1593835521},{"18-symbol",1593835521},{"18-symbol",1593835521},{"18-Z",1761607681},{"18-z",1761607681}, {"18-z",1761607681},{"18-Separator",1761607681},{"18-separator",1761607681},{"18-separator",1761607681}, {"28-ASCIIHexDigit",469762049},{"28-ASCII_Hex_Digit",469762049},{"29-Alphabetic",486539265},{"30-Any",503316481}, {"31-Assigned",520093697},{"32-BidiControl",536870913},{"33-BidiMirrored",553648129},{"32-Bidi_Control",536870913}, {"33-Bidi_Mirrored",553648129},{"34-C",570425345},{"35-CaseFoldingsimple",587202561},{"36-CaseIgnorable",603979777}, {"35-Case_Folding_simple",587202561},{"36-Case_Ignorable",603979777},{"37-Cased",620756993}, {"38-ChangesWhenCasefolded",637534209},{"39-ChangesWhenCasemapped",654311425},{"40-ChangesWhenLowercased",671088641}, {"41-ChangesWhenNFKCCasefolded",687865857},{"42-ChangesWhenTitlecased",704643073},{"43-ChangesWhenUppercased",721420289}, {"38-Changes_When_Casefolded",637534209},{"39-Changes_When_Casemapped",654311425}, {"40-Changes_When_Lowercased",671088641},{"41-Changes_When_NFKC_Casefolded",687865857}, {"42-Changes_When_Titlecased",704643073},{"43-Changes_When_Uppercased",721420289},{"70-CombiningMark",1174405121}, {"70-Combining_Mark",1174405121},{"44-Dash",738197505},{"45-DefaultIgnorableCodePoint",754974721}, {"45-Default_Ignorable_Code_Point",754974721},{"46-Deprecated",771751937},{"47-Diacritic",788529153}, {"48-Emoji",805306369},{"49-EmojiComponent",822083585},{"50-EmojiModifier",838860801},{"51-EmojiModifierBase",855638017}, {"52-EmojiPresentation",872415233},{"49-Emoji_Component",822083585},{"50-Emoji_Modifier",838860801}, {"51-Emoji_Modifier_Base",855638017},{"52-Emoji_Presentation",872415233},{"53-Extender",889192449}, {"54-FullCompositionExclusion",905969665},{"54-Full_Composition_Exclusion",905969665},{"55-GraphemeBase",922746881}, {"56-GraphemeExtend",939524097},{"57-GraphemeLink",956301313},{"55-Grapheme_Base",922746881}, {"56-Grapheme_Extend",939524097},{"57-Grapheme_Link",956301313},{"58-HexDigit",973078529},{"58-Hex_Digit",973078529}, {"59-Hyphen",989855745},{"62-IDContinue",1040187393},{"60-IDSBinaryOperator",1006632961}, {"61-IDSTrinaryOperator",1023410177},{"60-IDS_Binary_Operator",1006632961},{"61-IDS_Trinary_Operator",1023410177}, {"63-IDStart",1056964609},{"62-ID_Continue",1040187393},{"63-ID_Start",1056964609},{"64-Ideographic",1073741825}, {"65-JoinControl",1090519041},{"65-Join_Control",1090519041},{"66-L",1107296257},{"67-LC",1124073473}, {"66-Letter",1107296257},{"68-LogicalOrderException",1140850689},{"68-Logical_Order_Exception",1140850689}, {"69-Lowercase",1157627905},{"70-M",1174405121},{"71-MVMCOLLATIONPRIMARY",1191182337},{"72-MVMCOLLATIONQC",1207959553}, {"75-MVMCOLLATIONSECONDARY",1258291201},{"76-MVMCOLLATIONTERTIARY",1275068417},{"71-MVM_COLLATION_PRIMARY",1191182337}, {"72-MVM_COLLATION_QC",1207959553},{"75-MVM_COLLATION_SECONDARY",1258291201},{"76-MVM_COLLATION_TERTIARY",1275068417}, {"70-Mark",1174405121},{"73-Math",1224736769},{"74-N",1241513985},{"77-NFDQC",1291845633},{"77-NFD_QC",1291845633}, {"78-NFKDQC",1308622849},{"78-NFKD_QC",1308622849},{"79-NoncharacterCodePoint",1325400065}, {"79-Noncharacter_Code_Point",1325400065},{"74-Number",1241513985},{"34-Other",570425345}, {"80-OtherAlphabetic",1342177281},{"81-OtherDefaultIgnorableCodePoint",1358954497},{"82-OtherGraphemeExtend",1375731713}, {"83-OtherIDContinue",1392508929},{"84-OtherIDStart",1409286145},{"85-OtherLowercase",1426063361}, {"86-OtherMath",1442840577},{"87-OtherUppercase",1459617793},{"80-Other_Alphabetic",1342177281}, {"81-Other_Default_Ignorable_Code_Point",1358954497},{"82-Other_Grapheme_Extend",1375731713}, {"83-Other_ID_Continue",1392508929},{"84-Other_ID_Start",1409286145},{"85-Other_Lowercase",1426063361}, {"86-Other_Math",1442840577},{"87-Other_Uppercase",1459617793},{"88-P",1476395009},{"89-PatternSyntax",1493172225}, {"90-PatternWhiteSpace",1509949441},{"89-Pattern_Syntax",1493172225},{"90-Pattern_White_Space",1509949441}, {"91-PrependedConcatenationMark",1526726657},{"91-Prepended_Concatenation_Mark",1526726657}, {"88-Punctuation",1476395009},{"92-QuotationMark",1543503873},{"92-Quotation_Mark",1543503873},{"93-Radical",1560281089}, {"94-RegionalIndicator",1577058305},{"94-Regional_Indicator",1577058305},{"95-S",1593835521}, {"96-SentenceTerminal",1610612737},{"96-Sentence_Terminal",1610612737},{"105-Separator",1761607681}, {"97-SoftDotted",1627389953},{"97-Soft_Dotted",1627389953},{"95-Symbol",1593835521}, {"98-TerminalPunctuation",1644167169},{"98-Terminal_Punctuation",1644167169},{"99-UnifiedIdeograph",1660944385}, {"99-Unified_Ideograph",1660944385},{"100-Uppercase",1677721601},{"101-VariationSelector",1694498817}, {"101-Variation_Selector",1694498817},{"102-WhiteSpace",1711276033},{"102-White_Space",1711276033}, {"103-XIDContinue",1728053249},{"104-XIDStart",1744830465},{"103-XID_Continue",1728053249},{"104-XID_Start",1744830465}, {"105-Z",1761607681},{"29-alphabetic",486539265},{"30-any",503316481},{"28-ascii_hex_digit",469762049}, {"28-asciihexdigit",469762049},{"31-assigned",520093697},{"32-bidi_control",536870913},{"33-bidi_mirrored",553648129}, {"32-bidicontrol",536870913},{"33-bidimirrored",553648129},{"34-c",570425345},{"35-case_folding_simple",587202561}, {"36-case_ignorable",603979777},{"37-cased",620756993},{"35-casefoldingsimple",587202561},{"36-caseignorable",603979777}, {"38-changes_when_casefolded",637534209},{"39-changes_when_casemapped",654311425}, {"40-changes_when_lowercased",671088641},{"41-changes_when_nfkc_casefolded",687865857}, {"42-changes_when_titlecased",704643073},{"43-changes_when_uppercased",721420289},{"38-changeswhencasefolded",637534209}, {"39-changeswhencasemapped",654311425},{"40-changeswhenlowercased",671088641},{"41-changeswhennfkccasefolded",687865857}, {"42-changeswhentitlecased",704643073},{"43-changeswhenuppercased",721420289},{"70-combining_mark",1174405121}, {"70-combiningmark",1174405121},{"44-dash",738197505},{"45-default_ignorable_code_point",754974721}, {"45-defaultignorablecodepoint",754974721},{"46-deprecated",771751937},{"47-diacritic",788529153},{"48-emoji",805306369}, {"49-emoji_component",822083585},{"50-emoji_modifier",838860801},{"51-emoji_modifier_base",855638017}, {"52-emoji_presentation",872415233},{"49-emojicomponent",822083585},{"50-emojimodifier",838860801}, {"51-emojimodifierbase",855638017},{"52-emojipresentation",872415233},{"53-extender",889192449}, {"54-full_composition_exclusion",905969665},{"54-fullcompositionexclusion",905969665},{"55-grapheme_base",922746881}, {"56-grapheme_extend",939524097},{"57-grapheme_link",956301313},{"55-graphemebase",922746881}, {"56-graphemeextend",939524097},{"57-graphemelink",956301313},{"58-hex_digit",973078529},{"58-hexdigit",973078529}, {"59-hyphen",989855745},{"62-id_continue",1040187393},{"63-id_start",1056964609},{"62-idcontinue",1040187393}, {"64-ideographic",1073741825},{"60-ids_binary_operator",1006632961},{"61-ids_trinary_operator",1023410177}, {"60-idsbinaryoperator",1006632961},{"63-idstart",1056964609},{"61-idstrinaryoperator",1023410177}, {"65-join_control",1090519041},{"65-joincontrol",1090519041},{"66-l",1107296257},{"67-lc",1124073473}, {"66-letter",1107296257},{"68-logical_order_exception",1140850689},{"68-logicalorderexception",1140850689}, {"69-lowercase",1157627905},{"70-m",1174405121},{"70-mark",1174405121},{"73-math",1224736769}, {"71-mvm_collation_primary",1191182337},{"72-mvm_collation_qc",1207959553},{"75-mvm_collation_secondary",1258291201}, {"76-mvm_collation_tertiary",1275068417},{"71-mvmcollationprimary",1191182337},{"72-mvmcollationqc",1207959553}, {"75-mvmcollationsecondary",1258291201},{"76-mvmcollationtertiary",1275068417},{"74-n",1241513985}, {"77-nfd_qc",1291845633},{"77-nfdqc",1291845633},{"78-nfkd_qc",1308622849},{"78-nfkdqc",1308622849}, {"79-noncharacter_code_point",1325400065},{"79-noncharactercodepoint",1325400065},{"74-number",1241513985}, {"34-other",570425345},{"80-other_alphabetic",1342177281},{"81-other_default_ignorable_code_point",1358954497}, {"82-other_grapheme_extend",1375731713},{"83-other_id_continue",1392508929},{"84-other_id_start",1409286145}, {"85-other_lowercase",1426063361},{"86-other_math",1442840577},{"87-other_uppercase",1459617793}, {"80-otheralphabetic",1342177281},{"81-otherdefaultignorablecodepoint",1358954497},{"82-othergraphemeextend",1375731713}, {"83-otheridcontinue",1392508929},{"84-otheridstart",1409286145},{"85-otherlowercase",1426063361}, {"86-othermath",1442840577},{"87-otheruppercase",1459617793},{"88-p",1476395009},{"89-pattern_syntax",1493172225}, {"90-pattern_white_space",1509949441},{"89-patternsyntax",1493172225},{"90-patternwhitespace",1509949441}, {"91-prepended_concatenation_mark",1526726657},{"91-prependedconcatenationmark",1526726657},{"88-punct",1476395009}, {"88-punctuation",1476395009},{"92-quotation_mark",1543503873},{"92-quotationmark",1543503873},{"93-radical",1560281089}, {"94-regional_indicator",1577058305},{"94-regionalindicator",1577058305},{"95-s",1593835521}, {"96-sentence_terminal",1610612737},{"96-sentenceterminal",1610612737},{"105-separator",1761607681}, {"97-soft_dotted",1627389953},{"97-softdotted",1627389953},{"102-space",1711276033},{"95-symbol",1593835521}, {"98-terminal_punctuation",1644167169},{"98-terminalpunctuation",1644167169},{"99-unified_ideograph",1660944385}, {"99-unifiedideograph",1660944385},{"100-uppercase",1677721601},{"101-variation_selector",1694498817}, {"101-variationselector",1694498817},{"102-white_space",1711276033},{"102-whitespace",1711276033}, {"103-xid_continue",1728053249},{"104-xid_start",1744830465},{"103-xidcontinue",1728053249},{"104-xidstart",1744830465}, {"105-z",1761607681},{"18-Cc",301989903},{"18-Cf",301989904},{"18-ClosePunctuation",301989909}, {"18-Close_Punctuation",301989909},{"18-Cn",301989888},{"18-Co",301989905},{"18-ConnectorPunctuation",301989910}, {"18-Connector_Punctuation",301989910},{"18-Control",301989903},{"18-Cs",301989906},{"18-CurrencySymbol",301989913}, {"18-Currency_Symbol",301989913},{"18-DashPunctuation",301989907},{"18-Dash_Punctuation",301989907}, {"18-DecimalNumber",301989897},{"18-Decimal_Number",301989897},{"18-EnclosingMark",301989895}, {"18-Enclosing_Mark",301989895},{"18-FinalPunctuation",301989917},{"18-Final_Punctuation",301989917}, {"18-Format",301989904},{"18-InitialPunctuation",301989916},{"18-Initial_Punctuation",301989916}, {"18-LetterNumber",301989898},{"18-Letter_Number",301989898},{"18-LineSeparator",301989901}, {"18-Line_Separator",301989901},{"18-Ll",301989890},{"18-Lm",301989892},{"18-Lo",301989893}, {"18-LowercaseLetter",301989890},{"18-Lowercase_Letter",301989890},{"18-Lt",301989891},{"18-Lu",301989889}, {"18-MathSymbol",301989912},{"18-Math_Symbol",301989912},{"18-Mc",301989896},{"18-Me",301989895},{"18-Mn",301989894}, {"18-ModifierLetter",301989892},{"18-ModifierSymbol",301989914},{"18-Modifier_Letter",301989892}, {"18-Modifier_Symbol",301989914},{"18-Nd",301989897},{"18-Nl",301989898},{"18-No",301989899}, {"18-NonspacingMark",301989894},{"18-Nonspacing_Mark",301989894},{"18-OpenPunctuation",301989908}, {"18-Open_Punctuation",301989908},{"18-OtherLetter",301989893},{"18-OtherNumber",301989899}, {"18-OtherPunctuation",301989911},{"18-OtherSymbol",301989915},{"18-Other_Letter",301989893}, {"18-Other_Number",301989899},{"18-Other_Punctuation",301989911},{"18-Other_Symbol",301989915}, {"18-ParagraphSeparator",301989902},{"18-Paragraph_Separator",301989902},{"18-Pc",301989910},{"18-Pd",301989907}, {"18-Pe",301989909},{"18-Pf",301989917},{"18-Pi",301989916},{"18-Po",301989911},{"18-PrivateUse",301989905}, {"18-Private_Use",301989905},{"18-Ps",301989908},{"18-Sc",301989913},{"18-Sk",301989914},{"18-Sm",301989912}, {"18-So",301989915},{"18-SpaceSeparator",301989900},{"18-Space_Separator",301989900},{"18-SpacingMark",301989896}, {"18-Spacing_Mark",301989896},{"18-Surrogate",301989906},{"18-TitlecaseLetter",301989891}, {"18-Titlecase_Letter",301989891},{"18-Unassigned",301989888},{"18-UppercaseLetter",301989889}, {"18-Uppercase_Letter",301989889},{"18-Zl",301989901},{"18-Zp",301989902},{"18-Zs",301989900},{"18-cc",301989903}, {"18-cf",301989904},{"18-close_punctuation",301989909},{"18-closepunctuation",301989909},{"18-cn",301989888}, {"18-cntrl",301989903},{"18-co",301989905},{"18-connector_punctuation",301989910},{"18-connectorpunctuation",301989910}, {"18-control",301989903},{"18-cs",301989906},{"18-currency_symbol",301989913},{"18-currencysymbol",301989913}, {"18-dash_punctuation",301989907},{"18-dashpunctuation",301989907},{"18-decimal_number",301989897}, {"18-decimalnumber",301989897},{"18-digit",301989897},{"18-enclosing_mark",301989895},{"18-enclosingmark",301989895}, {"18-final_punctuation",301989917},{"18-finalpunctuation",301989917},{"18-format",301989904}, {"18-initial_punctuation",301989916},{"18-initialpunctuation",301989916},{"18-letter_number",301989898}, {"18-letternumber",301989898},{"18-line_separator",301989901},{"18-lineseparator",301989901},{"18-ll",301989890}, {"18-lm",301989892},{"18-lo",301989893},{"18-lowercase_letter",301989890},{"18-lowercaseletter",301989890}, {"18-lt",301989891},{"18-lu",301989889},{"18-math_symbol",301989912},{"18-mathsymbol",301989912},{"18-mc",301989896}, {"18-me",301989895},{"18-mn",301989894},{"18-modifier_letter",301989892},{"18-modifier_symbol",301989914}, {"18-modifierletter",301989892},{"18-modifiersymbol",301989914},{"18-nd",301989897},{"18-nl",301989898}, {"18-no",301989899},{"18-nonspacing_mark",301989894},{"18-nonspacingmark",301989894},{"18-open_punctuation",301989908}, {"18-openpunctuation",301989908},{"18-other_letter",301989893},{"18-other_number",301989899}, {"18-other_punctuation",301989911},{"18-other_symbol",301989915},{"18-otherletter",301989893}, {"18-othernumber",301989899},{"18-otherpunctuation",301989911},{"18-othersymbol",301989915}, {"18-paragraph_separator",301989902},{"18-paragraphseparator",301989902},{"18-pc",301989910},{"18-pd",301989907}, {"18-pe",301989909},{"18-pf",301989917},{"18-pi",301989916},{"18-po",301989911},{"18-private_use",301989905}, {"18-privateuse",301989905},{"18-ps",301989908},{"18-sc",301989913},{"18-sk",301989914},{"18-sm",301989912}, {"18-so",301989915},{"18-space_separator",301989900},{"18-spaceseparator",301989900},{"18-spacing_mark",301989896}, {"18-spacingmark",301989896},{"18-surrogate",301989906},{"18-titlecase_letter",301989891}, {"18-titlecaseletter",301989891},{"18-unassigned",301989888},{"18-uppercase_letter",301989889}, {"18-uppercaseletter",301989889},{"18-zl",301989901},{"18-zp",301989902},{"18-zs",301989900},{"9-Adlam",150995076}, {"9-Adlm",150995076},{"9-Aghb",150995047},{"9-Ahom",150995070},{"9-AnatolianHieroglyphs",150995071}, {"9-Anatolian_Hieroglyphs",150995071},{"9-Arab",150994951},{"9-Arabic",150994951},{"9-Armenian",150994949}, {"9-Armi",150995031},{"9-Armn",150994949},{"9-Avestan",150995024},{"9-Avst",150995024},{"9-Bali",150995006}, {"9-Balinese",150995006},{"9-Bamu",150995028},{"9-Bamum",150995028},{"9-Bass",150995048},{"9-BassaVah",150995048}, {"9-Bassa_Vah",150995048},{"9-Batak",150995037},{"9-Batk",150995037},{"9-Beng",150994955},{"9-Bengali",150994955}, {"9-Bhaiksuki",150995077},{"9-Bhks",150995077},{"9-Bopo",150994979},{"9-Bopomofo",150994979},{"9-Brah",150995038}, {"9-Brahmi",150995038},{"9-Brai",150994997},{"9-Braille",150994997},{"9-Bugi",150994998},{"9-Buginese",150994998}, {"9-Buhd",150994988},{"9-Buhid",150994988},{"9-Cakm",150995040},{"9-CanadianAboriginal",150994972}, {"9-Canadian_Aboriginal",150994972},{"9-Cans",150994972},{"9-Cari",150995019},{"9-Carian",150995019}, {"9-CaucasianAlbanian",150995047},{"9-Caucasian_Albanian",150995047},{"9-Chakma",150995040},{"9-Cham",150995021}, {"9-Cher",150994971},{"9-Cherokee",150994971},{"9-Common",150994945},{"9-Copt",150994999},{"9-Coptic",150994999}, {"9-Cprt",150994996},{"9-Cuneiform",150995007},{"9-Cypriot",150994996},{"9-Cyrillic",150994948},{"9-Cyrl",150994948}, {"9-Deseret",150994984},{"9-Deva",150994954},{"9-Devanagari",150994954},{"9-Dsrt",150994984},{"9-Dupl",150995049}, {"9-Duployan",150995049},{"9-Egyp",150995025},{"9-EgyptianHieroglyphs",150995025},{"9-Egyptian_Hieroglyphs",150995025}, {"9-Elba",150995050},{"9-Elbasan",150995050},{"9-Ethi",150994970},{"9-Ethiopic",150994970},{"9-Geor",150994968}, {"9-Georgian",150994968},{"9-Glag",150995001},{"9-Glagolitic",150995001},{"9-Gonm",150995082},{"9-Goth",150994983}, {"9-Gothic",150994983},{"9-Gran",150995051},{"9-Grantha",150995051},{"9-Greek",150994947},{"9-Grek",150994947}, {"9-Gujarati",150994957},{"9-Gujr",150994957},{"9-Gurmukhi",150994956},{"9-Guru",150994956},{"9-Han",150994980}, {"9-Hang",150994969},{"9-Hangul",150994969},{"9-Hani",150994980},{"9-Hano",150994987},{"9-Hanunoo",150994987}, {"9-Hatr",150995072},{"9-Hatran",150995072},{"9-Hebr",150994950},{"9-Hebrew",150994950},{"9-Hira",150994977}, {"9-Hiragana",150994977},{"9-Hluw",150995071},{"9-Hmng",150995052},{"9-Hung",150995074},{"9-ImperialAramaic",150995031}, {"9-Imperial_Aramaic",150995031},{"9-Inherited",150994985},{"9-InscriptionalPahlavi",150995034}, {"9-InscriptionalParthian",150995033},{"9-Inscriptional_Pahlavi",150995034},{"9-Inscriptional_Parthian",150995033}, {"9-Ital",150994982},{"9-Java",150995029},{"9-Javanese",150995029},{"9-Kaithi",150995036},{"9-Kali",150995016}, {"9-Kana",150994978},{"9-Kannada",150994961},{"9-Katakana",150994978},{"9-KayahLi",150995016},{"9-Kayah_Li",150995016}, {"9-Khar",150995005},{"9-Kharoshthi",150995005},{"9-Khmer",150994975},{"9-Khmr",150994975},{"9-Khoj",150995053}, {"9-Khojki",150995053},{"9-Khudawadi",150995067},{"9-Knda",150994961},{"9-Kthi",150995036},{"9-Lana",150995022}, {"9-Lao",150994965},{"9-Laoo",150994965},{"9-Latin",150994946},{"9-Latn",150994946},{"9-Lepc",150995012}, {"9-Lepcha",150995012},{"9-Limb",150994990},{"9-Limbu",150994990},{"9-Lina",150995054},{"9-Linb",150994992}, {"9-LinearA",150995054},{"9-LinearB",150994992},{"9-Linear_A",150995054},{"9-Linear_B",150994992},{"9-Lisu",150995027}, {"9-Lyci",150995018},{"9-Lycian",150995018},{"9-Lydi",150995020},{"9-Lydian",150995020},{"9-Mahajani",150995055}, {"9-Mahj",150995055},{"9-Malayalam",150994962},{"9-Mand",150995039},{"9-Mandaic",150995039},{"9-Mani",150995056}, {"9-Manichaean",150995056},{"9-Marc",150995078},{"9-Marchen",150995078},{"9-MasaramGondi",150995082}, {"9-Masaram_Gondi",150995082},{"9-MeeteiMayek",150995030},{"9-Meetei_Mayek",150995030},{"9-Mend",150995057}, {"9-MendeKikakui",150995057},{"9-Mende_Kikakui",150995057},{"9-Merc",150995041},{"9-Mero",150995042}, {"9-MeroiticCursive",150995041},{"9-MeroiticHieroglyphs",150995042},{"9-Meroitic_Cursive",150995041}, {"9-Meroitic_Hieroglyphs",150995042},{"9-Miao",150995043},{"9-Mlym",150994962},{"9-Modi",150995058},{"9-Mong",150994976}, {"9-Mongolian",150994976},{"9-Mro",150995059},{"9-Mroo",150995059},{"9-Mtei",150995030},{"9-Mult",150995073}, {"9-Multani",150995073},{"9-Myanmar",150994967},{"9-Mymr",150994967},{"9-Nabataean",150995061},{"9-Narb",150995060}, {"9-Nbat",150995061},{"9-NewTaiLue",150995000},{"9-New_Tai_Lue",150995000},{"9-Newa",150995079},{"9-Nko",150995010}, {"9-Nkoo",150995010},{"9-Nshu",150995083},{"9-Nushu",150995083},{"9-Ogam",150994973},{"9-Ogham",150994973}, {"9-OlChiki",150995013},{"9-Ol_Chiki",150995013},{"9-Olck",150995013},{"9-OldHungarian",150995074}, {"9-OldItalic",150994982},{"9-OldNorthArabian",150995060},{"9-OldPermic",150995064},{"9-OldPersian",150995004}, {"9-OldSouthArabian",150995032},{"9-OldTurkic",150995035},{"9-Old_Hungarian",150995074},{"9-Old_Italic",150994982}, {"9-Old_North_Arabian",150995060},{"9-Old_Permic",150995064},{"9-Old_Persian",150995004}, {"9-Old_South_Arabian",150995032},{"9-Old_Turkic",150995035},{"9-Oriya",150994958},{"9-Orkh",150995035}, {"9-Orya",150994958},{"9-Osage",150995080},{"9-Osge",150995080},{"9-Osma",150994995},{"9-Osmanya",150994995}, {"9-PahawhHmong",150995052},{"9-Pahawh_Hmong",150995052},{"9-Palm",150995062},{"9-Palmyrene",150995062}, {"9-PauCinHau",150995063},{"9-Pau_Cin_Hau",150995063},{"9-Pauc",150995063},{"9-Perm",150995064},{"9-Phag",150995009}, {"9-PhagsPa",150995009},{"9-Phags_Pa",150995009},{"9-Phli",150995034},{"9-Phlp",150995065},{"9-Phnx",150995008}, {"9-Phoenician",150995008},{"9-Plrd",150995043},{"9-Prti",150995033},{"9-PsalterPahlavi",150995065}, {"9-Psalter_Pahlavi",150995065},{"9-Qaac",150994999},{"9-Qaai",150994985},{"9-Rejang",150995017},{"9-Rjng",150995017}, {"9-Runic",150994974},{"9-Runr",150994974},{"9-Samaritan",150995026},{"9-Samr",150995026},{"9-Sarb",150995032}, {"9-Saur",150995015},{"9-Saurashtra",150995015},{"9-Sgnw",150995075},{"9-Sharada",150995044},{"9-Shavian",150994994}, {"9-Shaw",150994994},{"9-Shrd",150995044},{"9-Sidd",150995066},{"9-Siddham",150995066},{"9-SignWriting",150995075}, {"9-Sind",150995067},{"9-Sinh",150994963},{"9-Sinhala",150994963},{"9-Sora",150995045},{"9-SoraSompeng",150995045}, {"9-Sora_Sompeng",150995045},{"9-Soyo",150995084},{"9-Soyombo",150995084},{"9-Sund",150995011},{"9-Sundanese",150995011}, {"9-Sylo",150995003},{"9-SylotiNagri",150995003},{"9-Syloti_Nagri",150995003},{"9-Syrc",150994952}, {"9-Syriac",150994952},{"9-Tagalog",150994986},{"9-Tagb",150994989},{"9-Tagbanwa",150994989},{"9-TaiLe",150994991}, {"9-TaiTham",150995022},{"9-TaiViet",150995023},{"9-Tai_Le",150994991},{"9-Tai_Tham",150995022},{"9-Tai_Viet",150995023}, {"9-Takr",150995046},{"9-Takri",150995046},{"9-Tale",150994991},{"9-Talu",150995000},{"9-Tamil",150994959}, {"9-Taml",150994959},{"9-Tang",150995081},{"9-Tangut",150995081},{"9-Tavt",150995023},{"9-Telu",150994960}, {"9-Telugu",150994960},{"9-Tfng",150995002},{"9-Tglg",150994986},{"9-Thaa",150994953},{"9-Thaana",150994953}, {"9-Thai",150994964},{"9-Tibetan",150994966},{"9-Tibt",150994966},{"9-Tifinagh",150995002},{"9-Tirh",150995068}, {"9-Tirhuta",150995068},{"9-Ugar",150994993},{"9-Ugaritic",150994993},{"9-Unknown",150994944},{"9-Vai",150995014}, {"9-Vaii",150995014},{"9-Wara",150995069},{"9-WarangCiti",150995069},{"9-Warang_Citi",150995069},{"9-Xpeo",150995004}, {"9-Xsux",150995007},{"9-Yi",150994981},{"9-Yiii",150994981},{"9-ZanabazarSquare",150995085}, {"9-Zanabazar_Square",150995085},{"9-Zanb",150995085},{"9-Zinh",150994985},{"9-Zyyy",150994945},{"9-Zzzz",150994944}, {"9-adlam",150995076},{"9-adlm",150995076},{"9-aghb",150995047},{"9-ahom",150995070}, {"9-anatolian_hieroglyphs",150995071},{"9-anatolianhieroglyphs",150995071},{"9-arab",150994951},{"9-arabic",150994951}, {"9-armenian",150994949},{"9-armi",150995031},{"9-armn",150994949},{"9-avestan",150995024},{"9-avst",150995024}, {"9-bali",150995006},{"9-balinese",150995006},{"9-bamu",150995028},{"9-bamum",150995028},{"9-bass",150995048}, {"9-bassa_vah",150995048},{"9-bassavah",150995048},{"9-batak",150995037},{"9-batk",150995037},{"9-beng",150994955}, {"9-bengali",150994955},{"9-bhaiksuki",150995077},{"9-bhks",150995077},{"9-bopo",150994979},{"9-bopomofo",150994979}, {"9-brah",150995038},{"9-brahmi",150995038},{"9-brai",150994997},{"9-braille",150994997},{"9-bugi",150994998}, {"9-buginese",150994998},{"9-buhd",150994988},{"9-buhid",150994988},{"9-cakm",150995040}, {"9-canadian_aboriginal",150994972},{"9-canadianaboriginal",150994972},{"9-cans",150994972},{"9-cari",150995019}, {"9-carian",150995019},{"9-caucasian_albanian",150995047},{"9-caucasianalbanian",150995047},{"9-chakma",150995040}, {"9-cham",150995021},{"9-cher",150994971},{"9-cherokee",150994971},{"9-common",150994945},{"9-copt",150994999}, {"9-coptic",150994999},{"9-cprt",150994996},{"9-cuneiform",150995007},{"9-cypriot",150994996},{"9-cyrillic",150994948}, {"9-cyrl",150994948},{"9-deseret",150994984},{"9-deva",150994954},{"9-devanagari",150994954},{"9-dsrt",150994984}, {"9-dupl",150995049},{"9-duployan",150995049},{"9-egyp",150995025},{"9-egyptian_hieroglyphs",150995025}, {"9-egyptianhieroglyphs",150995025},{"9-elba",150995050},{"9-elbasan",150995050},{"9-ethi",150994970}, {"9-ethiopic",150994970},{"9-geor",150994968},{"9-georgian",150994968},{"9-glag",150995001},{"9-glagolitic",150995001}, {"9-gonm",150995082},{"9-goth",150994983},{"9-gothic",150994983},{"9-gran",150995051},{"9-grantha",150995051}, {"9-greek",150994947},{"9-grek",150994947},{"9-gujarati",150994957},{"9-gujr",150994957},{"9-gurmukhi",150994956}, {"9-guru",150994956},{"9-han",150994980},{"9-hang",150994969},{"9-hangul",150994969},{"9-hani",150994980}, {"9-hano",150994987},{"9-hanunoo",150994987},{"9-hatr",150995072},{"9-hatran",150995072},{"9-hebr",150994950}, {"9-hebrew",150994950},{"9-hira",150994977},{"9-hiragana",150994977},{"9-hluw",150995071},{"9-hmng",150995052}, {"9-hung",150995074},{"9-imperial_aramaic",150995031},{"9-imperialaramaic",150995031},{"9-inherited",150994985}, {"9-inscriptional_pahlavi",150995034},{"9-inscriptional_parthian",150995033},{"9-inscriptionalpahlavi",150995034}, {"9-inscriptionalparthian",150995033},{"9-ital",150994982},{"9-java",150995029},{"9-javanese",150995029}, {"9-kaithi",150995036},{"9-kali",150995016},{"9-kana",150994978},{"9-kannada",150994961},{"9-katakana",150994978}, {"9-kayah_li",150995016},{"9-kayahli",150995016},{"9-khar",150995005},{"9-kharoshthi",150995005},{"9-khmer",150994975}, {"9-khmr",150994975},{"9-khoj",150995053},{"9-khojki",150995053},{"9-khudawadi",150995067},{"9-knda",150994961}, {"9-kthi",150995036},{"9-lana",150995022},{"9-lao",150994965},{"9-laoo",150994965},{"9-latin",150994946}, {"9-latn",150994946},{"9-lepc",150995012},{"9-lepcha",150995012},{"9-limb",150994990},{"9-limbu",150994990}, {"9-lina",150995054},{"9-linb",150994992},{"9-linear_a",150995054},{"9-linear_b",150994992},{"9-lineara",150995054}, {"9-linearb",150994992},{"9-lisu",150995027},{"9-lyci",150995018},{"9-lycian",150995018},{"9-lydi",150995020}, {"9-lydian",150995020},{"9-mahajani",150995055},{"9-mahj",150995055},{"9-malayalam",150994962},{"9-mand",150995039}, {"9-mandaic",150995039},{"9-mani",150995056},{"9-manichaean",150995056},{"9-marc",150995078},{"9-marchen",150995078}, {"9-masaram_gondi",150995082},{"9-masaramgondi",150995082},{"9-meetei_mayek",150995030},{"9-meeteimayek",150995030}, {"9-mend",150995057},{"9-mende_kikakui",150995057},{"9-mendekikakui",150995057},{"9-merc",150995041}, {"9-mero",150995042},{"9-meroitic_cursive",150995041},{"9-meroitic_hieroglyphs",150995042}, {"9-meroiticcursive",150995041},{"9-meroitichieroglyphs",150995042},{"9-miao",150995043},{"9-mlym",150994962}, {"9-modi",150995058},{"9-mong",150994976},{"9-mongolian",150994976},{"9-mro",150995059},{"9-mroo",150995059}, {"9-mtei",150995030},{"9-mult",150995073},{"9-multani",150995073},{"9-myanmar",150994967},{"9-mymr",150994967}, {"9-nabataean",150995061},{"9-narb",150995060},{"9-nbat",150995061},{"9-new_tai_lue",150995000},{"9-newa",150995079}, {"9-newtailue",150995000},{"9-nko",150995010},{"9-nkoo",150995010},{"9-nshu",150995083},{"9-nushu",150995083}, {"9-ogam",150994973},{"9-ogham",150994973},{"9-ol_chiki",150995013},{"9-olchiki",150995013},{"9-olck",150995013}, {"9-old_hungarian",150995074},{"9-old_italic",150994982},{"9-old_north_arabian",150995060},{"9-old_permic",150995064}, {"9-old_persian",150995004},{"9-old_south_arabian",150995032},{"9-old_turkic",150995035},{"9-oldhungarian",150995074}, {"9-olditalic",150994982},{"9-oldnortharabian",150995060},{"9-oldpermic",150995064},{"9-oldpersian",150995004}, {"9-oldsoutharabian",150995032},{"9-oldturkic",150995035},{"9-oriya",150994958},{"9-orkh",150995035}, {"9-orya",150994958},{"9-osage",150995080},{"9-osge",150995080},{"9-osma",150994995},{"9-osmanya",150994995}, {"9-pahawh_hmong",150995052},{"9-pahawhhmong",150995052},{"9-palm",150995062},{"9-palmyrene",150995062}, {"9-pau_cin_hau",150995063},{"9-pauc",150995063},{"9-paucinhau",150995063},{"9-perm",150995064},{"9-phag",150995009}, {"9-phags_pa",150995009},{"9-phagspa",150995009},{"9-phli",150995034},{"9-phlp",150995065},{"9-phnx",150995008}, {"9-phoenician",150995008},{"9-plrd",150995043},{"9-prti",150995033},{"9-psalter_pahlavi",150995065}, {"9-psalterpahlavi",150995065},{"9-qaac",150994999},{"9-qaai",150994985},{"9-rejang",150995017},{"9-rjng",150995017}, {"9-runic",150994974},{"9-runr",150994974},{"9-samaritan",150995026},{"9-samr",150995026},{"9-sarb",150995032}, {"9-saur",150995015},{"9-saurashtra",150995015},{"9-sgnw",150995075},{"9-sharada",150995044},{"9-shavian",150994994}, {"9-shaw",150994994},{"9-shrd",150995044},{"9-sidd",150995066},{"9-siddham",150995066},{"9-signwriting",150995075}, {"9-sind",150995067},{"9-sinh",150994963},{"9-sinhala",150994963},{"9-sora",150995045},{"9-sora_sompeng",150995045}, {"9-sorasompeng",150995045},{"9-soyo",150995084},{"9-soyombo",150995084},{"9-sund",150995011},{"9-sundanese",150995011}, {"9-sylo",150995003},{"9-syloti_nagri",150995003},{"9-sylotinagri",150995003},{"9-syrc",150994952}, {"9-syriac",150994952},{"9-tagalog",150994986},{"9-tagb",150994989},{"9-tagbanwa",150994989},{"9-tai_le",150994991}, {"9-tai_tham",150995022},{"9-tai_viet",150995023},{"9-taile",150994991},{"9-taitham",150995022},{"9-taiviet",150995023}, {"9-takr",150995046},{"9-takri",150995046},{"9-tale",150994991},{"9-talu",150995000},{"9-tamil",150994959}, {"9-taml",150994959},{"9-tang",150995081},{"9-tangut",150995081},{"9-tavt",150995023},{"9-telu",150994960}, {"9-telugu",150994960},{"9-tfng",150995002},{"9-tglg",150994986},{"9-thaa",150994953},{"9-thaana",150994953}, {"9-thai",150994964},{"9-tibetan",150994966},{"9-tibt",150994966},{"9-tifinagh",150995002},{"9-tirh",150995068}, {"9-tirhuta",150995068},{"9-ugar",150994993},{"9-ugaritic",150994993},{"9-unknown",150994944},{"9-vai",150995014}, {"9-vaii",150995014},{"9-wara",150995069},{"9-warang_citi",150995069},{"9-warangciti",150995069},{"9-xpeo",150995004}, {"9-xsux",150995007},{"9-yi",150994981},{"9-yiii",150994981},{"9-zanabazar_square",150995085}, {"9-zanabazarsquare",150995085},{"9-zanb",150995085},{"9-zinh",150994985},{"9-zyyy",150994945},{"9-zzzz",150994944}, {"28-AHex",469762049},{"28-ahex",469762049},{"29-Alpha",486539265},{"29-alpha",486539265},{"32-BidiC",536870913}, {"32-Bidi_C",536870913},{"32-bidi_c",536870913},{"32-bidic",536870913},{"33-BidiM",553648129},{"33-Bidi_M",553648129}, {"33-bidi_m",553648129},{"33-bidim",553648129},{"36-CI",603979777},{"36-ci",603979777},{"38-CWCF",637534209}, {"38-cwcf",637534209},{"39-CWCM",654311425},{"39-cwcm",654311425},{"41-CWKCF",687865857},{"41-cwkcf",687865857}, {"40-CWL",671088641},{"40-cwl",671088641},{"42-CWT",704643073},{"42-cwt",704643073},{"43-CWU",721420289}, {"43-cwu",721420289},{"37-Cased",620756993},{"37-cased",620756993},{"54-CompEx",905969665},{"54-Comp_Ex",905969665}, {"54-comp_ex",905969665},{"54-compex",905969665},{"45-DI",754974721},{"45-di",754974721},{"44-Dash",738197505}, {"44-dash",738197505},{"46-Dep",771751937},{"46-dep",771751937},{"47-Dia",788529153},{"47-dia",788529153}, {"53-Ext",889192449},{"53-ext",889192449},{"19-CN",318767108},{"19-CR",318767106},{"19-Control",318767108}, {"19-EB",318767117},{"19-EBG",318767121},{"19-EBase",318767117},{"19-EBaseGAZ",318767121},{"19-EM",318767118}, {"19-EModifier",318767118},{"19-EX",318767109},{"19-E_Base",318767117},{"19-E_Base_GAZ",318767121}, {"19-E_Modifier",318767118},{"19-Extend",318767109},{"19-GAZ",318767120},{"19-GlueAfterZwj",318767120}, {"19-Glue_After_Zwj",318767120},{"19-L",318767112},{"19-LF",318767107},{"19-LV",318767115},{"19-LVT",318767116}, {"19-Other",318767104},{"19-PP",318767105},{"19-Prepend",318767105},{"19-RI",318767110}, {"19-RegionalIndicator",318767110},{"19-Regional_Indicator",318767110},{"19-SM",318767111},{"19-SpacingMark",318767111}, {"19-T",318767114},{"19-V",318767113},{"19-XX",318767104},{"19-ZWJ",318767119},{"19-cn",318767108}, {"19-control",318767108},{"19-cr",318767106},{"19-e_base",318767117},{"19-e_base_gaz",318767121}, {"19-e_modifier",318767118},{"19-eb",318767117},{"19-ebase",318767117},{"19-ebasegaz",318767121},{"19-ebg",318767121}, {"19-em",318767118},{"19-emodifier",318767118},{"19-ex",318767109},{"19-extend",318767109},{"19-gaz",318767120}, {"19-glue_after_zwj",318767120},{"19-glueafterzwj",318767120},{"19-l",318767112},{"19-lf",318767107},{"19-lv",318767115}, {"19-lvt",318767116},{"19-other",318767104},{"19-pp",318767105},{"19-prepend",318767105}, {"19-regional_indicator",318767110},{"19-regionalindicator",318767110},{"19-ri",318767110},{"19-sm",318767111}, {"19-spacingmark",318767111},{"19-t",318767114},{"19-v",318767113},{"19-xx",318767104},{"19-zwj",318767119}, {"55-GrBase",922746881},{"55-Gr_Base",922746881},{"55-gr_base",922746881},{"55-grbase",922746881},{"56-GrExt",939524097}, {"56-Gr_Ext",939524097},{"56-gr_ext",939524097},{"56-grext",939524097},{"57-GrLink",956301313},{"57-Gr_Link",956301313}, {"57-gr_link",956301313},{"57-grlink",956301313},{"58-Hex",973078529},{"58-hex",973078529},{"59-Hyphen",989855745}, {"59-hyphen",989855745},{"62-IDC",1040187393},{"62-idc",1040187393},{"63-IDS",1056964609},{"63-ids",1056964609}, {"60-IDSB",1006632961},{"60-idsb",1006632961},{"61-IDST",1023410177},{"61-idst",1023410177},{"64-Ideo",1073741825}, {"64-ideo",1073741825},{"65-JoinC",1090519041},{"65-Join_C",1090519041},{"65-join_c",1090519041},{"65-joinc",1090519041}, {"68-LOE",1140850689},{"68-loe",1140850689},{"69-Lower",1157627905},{"69-lower",1157627905},{"73-Math",1224736769}, {"73-math",1224736769},{"79-NChar",1325400065},{"79-nchar",1325400065},{"12-M",201326594},{"12-Maybe",201326594}, {"12-NFCQC",201326593},{"12-NFC_QC",201326593},{"12-m",201326594},{"12-maybe",201326594},{"12-nfc_qc",201326593}, {"12-nfcqc",201326593},{"77-NFDQC",1291845633},{"77-NFD_QC",1291845633},{"77-nfd_qc",1291845633},{"77-nfdqc",1291845633}, {"26-M",436207618},{"26-Maybe",436207618},{"26-NFKCQC",436207617},{"26-NFKC_QC",436207617},{"26-m",436207618}, {"26-maybe",436207618},{"26-nfkc_qc",436207617},{"26-nfkcqc",436207617},{"78-NFKDQC",1308622849}, {"78-NFKD_QC",1308622849},{"78-nfkd_qc",1308622849},{"78-nfkdqc",1308622849},{"80-OAlpha",1342177281}, {"80-oalpha",1342177281},{"81-ODI",1358954497},{"81-odi",1358954497},{"82-OGrExt",1375731713},{"82-OGr_Ext",1375731713}, {"82-ogr_ext",1375731713},{"82-ogrext",1375731713},{"83-OIDC",1392508929},{"83-oidc",1392508929},{"84-OIDS",1409286145}, {"84-oids",1409286145},{"85-OLower",1426063361},{"85-olower",1426063361},{"86-OMath",1442840577},{"86-omath",1442840577}, {"87-OUpper",1459617793},{"87-oupper",1459617793},{"91-PCM",1526726657},{"91-pcm",1526726657},{"89-PatSyn",1493172225}, {"89-Pat_Syn",1493172225},{"89-pat_syn",1493172225},{"89-patsyn",1493172225},{"90-PatWS",1509949441}, {"90-Pat_WS",1509949441},{"90-pat_ws",1509949441},{"90-patws",1509949441},{"92-QMark",1543503873}, {"92-qmark",1543503873},{"94-RI",1577058305},{"94-ri",1577058305},{"93-Radical",1560281089},{"93-radical",1560281089}, {"22-AT",369098763},{"22-ATerm",369098763},{"22-CL",369098765},{"22-CR",369098753},{"22-Close",369098765}, {"22-EX",369098755},{"22-Extend",369098755},{"22-FO",369098757},{"22-Format",369098757},{"22-LE",369098761}, {"22-LF",369098754},{"22-LO",369098759},{"22-Lower",369098759},{"22-NU",369098762},{"22-Numeric",369098762}, {"22-OLetter",369098761},{"22-Other",369098752},{"22-SC",369098766},{"22-SContinue",369098766},{"22-SE",369098756}, {"22-SP",369098758},{"22-ST",369098764},{"22-STerm",369098764},{"22-Sep",369098756},{"22-Sp",369098758}, {"22-UP",369098760},{"22-Upper",369098760},{"22-XX",369098752},{"22-at",369098763},{"22-aterm",369098763}, {"22-cl",369098765},{"22-close",369098765},{"22-cr",369098753},{"22-ex",369098755},{"22-extend",369098755}, {"22-fo",369098757},{"22-format",369098757},{"22-le",369098761},{"22-lf",369098754},{"22-lo",369098759}, {"22-lower",369098759},{"22-nu",369098762},{"22-numeric",369098762},{"22-oletter",369098761},{"22-other",369098752}, {"22-sc",369098766},{"22-scontinue",369098766},{"22-se",369098756},{"22-sep",369098756},{"22-sp",369098758}, {"22-st",369098764},{"22-sterm",369098764},{"22-up",369098760},{"22-upper",369098760},{"22-xx",369098752}, {"97-SD",1627389953},{"97-sd",1627389953},{"96-STerm",1610612737},{"96-sterm",1610612737},{"98-Term",1644167169}, {"98-term",1644167169},{"99-UIdeo",1660944385},{"99-uideo",1660944385},{"100-Upper",1677721601},{"100-upper",1677721601}, {"101-VS",1694498817},{"101-vs",1694498817},{"21-ALetter",352321547},{"21-CR",352321540},{"21-DQ",352321537}, {"21-DoubleQuote",352321537},{"21-Double_Quote",352321537},{"21-EB",352321553},{"21-EBG",352321557}, {"21-EBase",352321553},{"21-EBaseGAZ",352321557},{"21-EM",352321554},{"21-EModifier",352321554},{"21-EX",352321552}, {"21-E_Base",352321553},{"21-E_Base_GAZ",352321557},{"21-E_Modifier",352321554},{"21-Extend",352321543}, {"21-ExtendNumLet",352321552},{"21-FO",352321545},{"21-Format",352321545},{"21-GAZ",352321556}, {"21-GlueAfterZwj",352321556},{"21-Glue_After_Zwj",352321556},{"21-HL",352321539},{"21-HebrewLetter",352321539}, {"21-Hebrew_Letter",352321539},{"21-KA",352321546},{"21-Katakana",352321546},{"21-LE",352321547},{"21-LF",352321541}, {"21-MB",352321550},{"21-ML",352321548},{"21-MN",352321549},{"21-MidLetter",352321548},{"21-MidNum",352321549}, {"21-MidNumLet",352321550},{"21-NL",352321542},{"21-NU",352321551},{"21-Newline",352321542},{"21-Numeric",352321551}, {"21-Other",352321536},{"21-RI",352321544},{"21-RegionalIndicator",352321544},{"21-Regional_Indicator",352321544}, {"21-SQ",352321538},{"21-SingleQuote",352321538},{"21-Single_Quote",352321538},{"21-XX",352321536},{"21-ZWJ",352321555}, {"21-aletter",352321547},{"21-cr",352321540},{"21-double_quote",352321537},{"21-doublequote",352321537}, {"21-dq",352321537},{"21-e_base",352321553},{"21-e_base_gaz",352321557},{"21-e_modifier",352321554},{"21-eb",352321553}, {"21-ebase",352321553},{"21-ebasegaz",352321557},{"21-ebg",352321557},{"21-em",352321554},{"21-emodifier",352321554}, {"21-ex",352321552},{"21-extend",352321543},{"21-extendnumlet",352321552},{"21-fo",352321545},{"21-format",352321545}, {"21-gaz",352321556},{"21-glue_after_zwj",352321556},{"21-glueafterzwj",352321556},{"21-hebrew_letter",352321539}, {"21-hebrewletter",352321539},{"21-hl",352321539},{"21-ka",352321546},{"21-katakana",352321546},{"21-le",352321547}, {"21-lf",352321541},{"21-mb",352321550},{"21-midletter",352321548},{"21-midnum",352321549},{"21-midnumlet",352321550}, {"21-ml",352321548},{"21-mn",352321549},{"21-newline",352321542},{"21-nl",352321542},{"21-nu",352321551}, {"21-numeric",352321551},{"21-other",352321536},{"21-regional_indicator",352321544},{"21-regionalindicator",352321544}, {"21-ri",352321544},{"21-single_quote",352321538},{"21-singlequote",352321538},{"21-sq",352321538},{"21-xx",352321536}, {"21-zwj",352321555},{"102-WSpace",1711276033},{"102-wspace",1711276033},{"103-XIDC",1728053249},{"103-xidc",1728053249}, {"104-XIDS",1744830465},{"104-xids",1744830465},{"15-NA",251658240},{"15-Unassigned",251658240},{"15-V100",251658259}, {"15-V10_0",251658259},{"15-V11",251658241},{"15-V1_1",251658241},{"15-V20",251658242},{"15-V21",251658243}, {"15-V2_0",251658242},{"15-V2_1",251658243},{"15-V30",251658244},{"15-V31",251658245},{"15-V32",251658246}, {"15-V3_0",251658244},{"15-V3_1",251658245},{"15-V3_2",251658246},{"15-V40",251658247},{"15-V41",251658248}, {"15-V4_0",251658247},{"15-V4_1",251658248},{"15-V50",251658249},{"15-V51",251658250},{"15-V52",251658251}, {"15-V5_0",251658249},{"15-V5_1",251658250},{"15-V5_2",251658251},{"15-V60",251658252},{"15-V61",251658253}, {"15-V62",251658254},{"15-V63",251658255},{"15-V6_0",251658252},{"15-V6_1",251658253},{"15-V6_2",251658254}, {"15-V6_3",251658255},{"15-V70",251658256},{"15-V7_0",251658256},{"15-V80",251658257},{"15-V8_0",251658257}, {"15-V90",251658258},{"15-V9_0",251658258},{"15-na",251658240},{"15-unassigned",251658240},{"15-v100",251658259}, {"15-v10_0",251658259},{"15-v11",251658241},{"15-v1_1",251658241},{"15-v20",251658242},{"15-v21",251658243}, {"15-v2_0",251658242},{"15-v2_1",251658243},{"15-v30",251658244},{"15-v31",251658245},{"15-v32",251658246}, {"15-v3_0",251658244},{"15-v3_1",251658245},{"15-v3_2",251658246},{"15-v40",251658247},{"15-v41",251658248}, {"15-v4_0",251658247},{"15-v4_1",251658248},{"15-v50",251658249},{"15-v51",251658250},{"15-v52",251658251}, {"15-v5_0",251658249},{"15-v5_1",251658250},{"15-v5_2",251658251},{"15-v60",251658252},{"15-v61",251658253}, {"15-v62",251658254},{"15-v63",251658255},{"15-v6_0",251658252},{"15-v6_1",251658253},{"15-v6_2",251658254}, {"15-v6_3",251658255},{"15-v70",251658256},{"15-v7_0",251658256},{"15-v80",251658257},{"15-v8_0",251658257}, {"15-v90",251658258},{"15-v9_0",251658258},{"28-ASCIIHexDigit",469762049},{"28-ASCII_Hex_Digit",469762049}, {"28-ascii_hex_digit",469762049},{"28-asciihexdigit",469762049},{"29-Alphabetic",486539265},{"29-alphabetic",486539265}, {"16-AL",268435469},{"16-AN",268435461},{"16-ArabicLetter",268435469},{"16-ArabicNumber",268435461}, {"16-Arabic_Letter",268435469},{"16-Arabic_Number",268435461},{"16-B",268435463},{"16-BN",268435467}, {"16-BoundaryNeutral",268435467},{"16-Boundary_Neutral",268435467},{"16-CS",268435462},{"16-CommonSeparator",268435462}, {"16-Common_Separator",268435462},{"16-EN",268435458},{"16-ES",268435459},{"16-ET",268435460}, {"16-EuropeanNumber",268435458},{"16-EuropeanSeparator",268435459},{"16-EuropeanTerminator",268435460}, {"16-European_Number",268435458},{"16-European_Separator",268435459},{"16-European_Terminator",268435460}, {"16-FSI",268435477},{"16-FirstStrongIsolate",268435477},{"16-First_Strong_Isolate",268435477},{"16-L",268435456}, {"16-LRE",268435472},{"16-LRI",268435475},{"16-LRO",268435470},{"16-LeftToRight",268435456}, {"16-LeftToRightEmbedding",268435472},{"16-LeftToRightIsolate",268435475},{"16-LeftToRightOverride",268435470}, {"16-Left_To_Right",268435456},{"16-Left_To_Right_Embedding",268435472},{"16-Left_To_Right_Isolate",268435475}, {"16-Left_To_Right_Override",268435470},{"16-NSM",268435468},{"16-NonspacingMark",268435468}, {"16-Nonspacing_Mark",268435468},{"16-ON",268435466},{"16-OtherNeutral",268435466},{"16-Other_Neutral",268435466}, {"16-PDF",268435474},{"16-PDI",268435478},{"16-ParagraphSeparator",268435463},{"16-Paragraph_Separator",268435463}, {"16-PopDirectionalFormat",268435474},{"16-PopDirectionalIsolate",268435478},{"16-Pop_Directional_Format",268435474}, {"16-Pop_Directional_Isolate",268435478},{"16-R",268435457},{"16-RLE",268435473},{"16-RLI",268435476}, {"16-RLO",268435471},{"16-RightToLeft",268435457},{"16-RightToLeftEmbedding",268435473}, {"16-RightToLeftIsolate",268435476},{"16-RightToLeftOverride",268435471},{"16-Right_To_Left",268435457}, {"16-Right_To_Left_Embedding",268435473},{"16-Right_To_Left_Isolate",268435476},{"16-Right_To_Left_Override",268435471}, {"16-S",268435464},{"16-SegmentSeparator",268435464},{"16-Segment_Separator",268435464},{"16-WS",268435465}, {"16-WhiteSpace",268435465},{"16-White_Space",268435465},{"16-al",268435469},{"16-an",268435461}, {"16-arabic_letter",268435469},{"16-arabic_number",268435461},{"16-arabicletter",268435469}, {"16-arabicnumber",268435461},{"16-b",268435463},{"16-bn",268435467},{"16-boundary_neutral",268435467}, {"16-boundaryneutral",268435467},{"16-common_separator",268435462},{"16-commonseparator",268435462},{"16-cs",268435462}, {"16-en",268435458},{"16-es",268435459},{"16-et",268435460},{"16-european_number",268435458}, {"16-european_separator",268435459},{"16-european_terminator",268435460},{"16-europeannumber",268435458}, {"16-europeanseparator",268435459},{"16-europeanterminator",268435460},{"16-first_strong_isolate",268435477}, {"16-firststrongisolate",268435477},{"16-fsi",268435477},{"16-l",268435456},{"16-left_to_right",268435456}, {"16-left_to_right_embedding",268435472},{"16-left_to_right_isolate",268435475},{"16-left_to_right_override",268435470}, {"16-lefttoright",268435456},{"16-lefttorightembedding",268435472},{"16-lefttorightisolate",268435475}, {"16-lefttorightoverride",268435470},{"16-lre",268435472},{"16-lri",268435475},{"16-lro",268435470}, {"16-nonspacing_mark",268435468},{"16-nonspacingmark",268435468},{"16-nsm",268435468},{"16-on",268435466}, {"16-other_neutral",268435466},{"16-otherneutral",268435466},{"16-paragraph_separator",268435463}, {"16-paragraphseparator",268435463},{"16-pdf",268435474},{"16-pdi",268435478},{"16-pop_directional_format",268435474}, {"16-pop_directional_isolate",268435478},{"16-popdirectionalformat",268435474},{"16-popdirectionalisolate",268435478}, {"16-r",268435457},{"16-right_to_left",268435457},{"16-right_to_left_embedding",268435473}, {"16-right_to_left_isolate",268435476},{"16-right_to_left_override",268435471},{"16-righttoleft",268435457}, {"16-righttoleftembedding",268435473},{"16-righttoleftisolate",268435476},{"16-righttoleftoverride",268435471}, {"16-rle",268435473},{"16-rli",268435476},{"16-rlo",268435471},{"16-s",268435464},{"16-segment_separator",268435464}, {"16-segmentseparator",268435464},{"16-white_space",268435465},{"16-whitespace",268435465},{"16-ws",268435465}, {"32-BidiControl",536870913},{"32-Bidi_Control",536870913},{"32-bidi_control",536870913},{"32-bidicontrol",536870913}, {"33-BidiMirrored",553648129},{"33-Bidi_Mirrored",553648129},{"33-bidi_mirrored",553648129}, {"33-bidimirrored",553648129},{"6-ASCII",100663297},{"6-Adlam",100663552},{"6-AegeanNumbers",100663461}, {"6-Aegean_Numbers",100663461},{"6-Ahom",100663517},{"6-Alchemical",100663563},{"6-AlchemicalSymbols",100663563}, {"6-Alchemical_Symbols",100663563},{"6-AlphabeticPF",100663449},{"6-AlphabeticPresentationForms",100663449}, {"6-Alphabetic_PF",100663449},{"6-Alphabetic_Presentation_Forms",100663449},{"6-AnatolianHieroglyphs",100663529}, {"6-Anatolian_Hieroglyphs",100663529},{"6-AncientGreekMusic",100663545},{"6-AncientGreekMusicalNotation",100663545}, {"6-AncientGreekNumbers",100663462},{"6-AncientSymbols",100663463},{"6-Ancient_Greek_Music",100663545}, {"6-Ancient_Greek_Musical_Notation",100663545},{"6-Ancient_Greek_Numbers",100663462},{"6-Ancient_Symbols",100663463}, {"6-Arabic",100663309},{"6-ArabicExtA",100663317},{"6-ArabicExtendedA",100663317},{"6-ArabicMath",100663553}, {"6-ArabicMathematicalAlphabeticSymbols",100663553},{"6-ArabicPFA",100663450},{"6-ArabicPFB",100663456}, {"6-ArabicPresentationFormsA",100663450},{"6-ArabicPresentationFormsB",100663456},{"6-ArabicSup",100663311}, {"6-ArabicSupplement",100663311},{"6-Arabic_Ext_A",100663317},{"6-Arabic_Extended_A",100663317}, {"6-Arabic_Math",100663553},{"6-Arabic_Mathematical_Alphabetic_Symbols",100663553},{"6-Arabic_PF_A",100663450}, {"6-Arabic_PF_B",100663456},{"6-Arabic_Presentation_Forms_A",100663450},{"6-Arabic_Presentation_Forms_B",100663456}, {"6-Arabic_Sup",100663311},{"6-Arabic_Supplement",100663311},{"6-Armenian",100663307},{"6-Arrows",100663373}, {"6-Avestan",100663493},{"6-Balinese",100663354},{"6-Bamum",100663421},{"6-BamumSup",100663530}, {"6-BamumSupplement",100663530},{"6-Bamum_Sup",100663530},{"6-Bamum_Supplement",100663530},{"6-BasicLatin",100663297}, {"6-Basic_Latin",100663297},{"6-BassaVah",100663532},{"6-Bassa_Vah",100663532},{"6-Batak",100663356}, {"6-Bengali",100663319},{"6-Bhaiksuki",100663522},{"6-BlockElements",100663380},{"6-Block_Elements",100663380}, {"6-Bopomofo",100663405},{"6-BopomofoExt",100663408},{"6-BopomofoExtended",100663408},{"6-Bopomofo_Ext",100663408}, {"6-Bopomofo_Extended",100663408},{"6-BoxDrawing",100663379},{"6-Box_Drawing",100663379},{"6-Brahmi",100663500}, {"6-Braille",100663386},{"6-BraillePatterns",100663386},{"6-Braille_Patterns",100663386},{"6-Buginese",100663351}, {"6-Buhid",100663342},{"6-ByzantineMusic",100663543},{"6-ByzantineMusicalSymbols",100663543}, {"6-Byzantine_Music",100663543},{"6-Byzantine_Musical_Symbols",100663543},{"6-CJK",100663415},{"6-CJKCompat",100663412}, {"6-CJKCompatForms",100663454},{"6-CJKCompatIdeographs",100663448},{"6-CJKCompatIdeographsSup",100663572}, {"6-CJKCompatibility",100663412},{"6-CJKCompatibilityForms",100663454},{"6-CJKCompatibilityIdeographs",100663448}, {"6-CJKCompatibilityIdeographsSupplement",100663572},{"6-CJKExtA",100663413},{"6-CJKExtB",100663567}, {"6-CJKExtC",100663568},{"6-CJKExtD",100663569},{"6-CJKExtE",100663570},{"6-CJKExtF",100663571}, {"6-CJKRadicalsSup",100663399},{"6-CJKRadicalsSupplement",100663399},{"6-CJKStrokes",100663409}, {"6-CJKSymbols",100663402},{"6-CJKSymbolsAndPunctuation",100663402},{"6-CJKUnifiedIdeographs",100663415}, {"6-CJKUnifiedIdeographsExtensionA",100663413},{"6-CJKUnifiedIdeographsExtensionB",100663567}, {"6-CJKUnifiedIdeographsExtensionC",100663568},{"6-CJKUnifiedIdeographsExtensionD",100663569}, {"6-CJKUnifiedIdeographsExtensionE",100663570},{"6-CJKUnifiedIdeographsExtensionF",100663571},{"6-CJK_Compat",100663412}, {"6-CJK_Compat_Forms",100663454},{"6-CJK_Compat_Ideographs",100663448},{"6-CJK_Compat_Ideographs_Sup",100663572}, {"6-CJK_Compatibility",100663412},{"6-CJK_Compatibility_Forms",100663454},{"6-CJK_Compatibility_Ideographs",100663448}, {"6-CJK_Compatibility_Ideographs_Supplement",100663572},{"6-CJK_Ext_A",100663413},{"6-CJK_Ext_B",100663567}, {"6-CJK_Ext_C",100663568},{"6-CJK_Ext_D",100663569},{"6-CJK_Ext_E",100663570},{"6-CJK_Ext_F",100663571}, {"6-CJK_Radicals_Sup",100663399},{"6-CJK_Radicals_Supplement",100663399},{"6-CJK_Strokes",100663409}, {"6-CJK_Symbols",100663402},{"6-CJK_Symbols_And_Punctuation",100663402},{"6-CJK_Unified_Ideographs",100663415}, {"6-CJK_Unified_Ideographs_Extension_A",100663413},{"6-CJK_Unified_Ideographs_Extension_B",100663567}, {"6-CJK_Unified_Ideographs_Extension_C",100663568},{"6-CJK_Unified_Ideographs_Extension_D",100663569}, {"6-CJK_Unified_Ideographs_Extension_E",100663570},{"6-CJK_Unified_Ideographs_Extension_F",100663571}, {"6-CanadianSyllabics",100663337},{"6-Canadian_Syllabics",100663337},{"6-Carian",100663466}, {"6-CaucasianAlbanian",100663478},{"6-Caucasian_Albanian",100663478},{"6-Chakma",100663503},{"6-Cham",100663434}, {"6-Cherokee",100663336},{"6-CherokeeSup",100663440},{"6-CherokeeSupplement",100663440},{"6-Cherokee_Sup",100663440}, {"6-Cherokee_Supplement",100663440},{"6-CombiningDiacriticalMarks",100663303}, {"6-CombiningDiacriticalMarksExtended",100663353},{"6-CombiningDiacriticalMarksForSymbols",100663370}, {"6-CombiningDiacriticalMarksSupplement",100663364},{"6-CombiningHalfMarks",100663453}, {"6-CombiningMarksForSymbols",100663370},{"6-Combining_Diacritical_Marks",100663303}, {"6-Combining_Diacritical_Marks_Extended",100663353},{"6-Combining_Diacritical_Marks_For_Symbols",100663370}, {"6-Combining_Diacritical_Marks_Supplement",100663364},{"6-Combining_Half_Marks",100663453}, {"6-Combining_Marks_For_Symbols",100663370},{"6-CommonIndicNumberForms",100663425}, {"6-Common_Indic_Number_Forms",100663425},{"6-CompatJamo",100663406},{"6-Compat_Jamo",100663406}, {"6-ControlPictures",100663376},{"6-Control_Pictures",100663376},{"6-Coptic",100663393}, {"6-CopticEpactNumbers",100663467},{"6-Coptic_Epact_Numbers",100663467},{"6-CountingRod",100663547}, {"6-CountingRodNumerals",100663547},{"6-Counting_Rod",100663547},{"6-Counting_Rod_Numerals",100663547}, {"6-Cuneiform",100663525},{"6-CuneiformNumbers",100663526},{"6-CuneiformNumbersAndPunctuation",100663526}, {"6-Cuneiform_Numbers",100663526},{"6-Cuneiform_Numbers_And_Punctuation",100663526},{"6-CurrencySymbols",100663369}, {"6-Currency_Symbols",100663369},{"6-CypriotSyllabary",100663480},{"6-Cypriot_Syllabary",100663480}, {"6-Cyrillic",100663305},{"6-CyrillicExtA",100663397},{"6-CyrillicExtB",100663420},{"6-CyrillicExtC",100663359}, {"6-CyrillicExtendedA",100663397},{"6-CyrillicExtendedB",100663420},{"6-CyrillicExtendedC",100663359}, {"6-CyrillicSup",100663306},{"6-CyrillicSupplement",100663306},{"6-CyrillicSupplementary",100663306}, {"6-Cyrillic_Ext_A",100663397},{"6-Cyrillic_Ext_B",100663420},{"6-Cyrillic_Ext_C",100663359}, {"6-Cyrillic_Extended_A",100663397},{"6-Cyrillic_Extended_B",100663420},{"6-Cyrillic_Extended_C",100663359}, {"6-Cyrillic_Sup",100663306},{"6-Cyrillic_Supplement",100663306},{"6-Cyrillic_Supplementary",100663306}, {"6-Deseret",100663473},{"6-Devanagari",100663318},{"6-DevanagariExt",100663428},{"6-DevanagariExtended",100663428}, {"6-Devanagari_Ext",100663428},{"6-Devanagari_Extended",100663428},{"6-Diacriticals",100663303}, {"6-DiacriticalsExt",100663353},{"6-DiacriticalsForSymbols",100663370},{"6-DiacriticalsSup",100663364}, {"6-Diacriticals_Ext",100663353},{"6-Diacriticals_For_Symbols",100663370},{"6-Diacriticals_Sup",100663364}, {"6-Dingbats",100663383},{"6-Domino",100663555},{"6-DominoTiles",100663555},{"6-Domino_Tiles",100663555}, {"6-Duployan",100663541},{"6-EarlyDynasticCuneiform",100663527},{"6-Early_Dynastic_Cuneiform",100663527}, {"6-EgyptianHieroglyphs",100663528},{"6-Egyptian_Hieroglyphs",100663528},{"6-Elbasan",100663477}, {"6-Emoticons",100663560},{"6-EnclosedAlphanum",100663378},{"6-EnclosedAlphanumSup",100663557}, {"6-EnclosedAlphanumericSupplement",100663557},{"6-EnclosedAlphanumerics",100663378},{"6-EnclosedCJK",100663411}, {"6-EnclosedCJKLettersAndMonths",100663411},{"6-EnclosedIdeographicSup",100663558}, {"6-EnclosedIdeographicSupplement",100663558},{"6-Enclosed_Alphanum",100663378},{"6-Enclosed_Alphanum_Sup",100663557}, {"6-Enclosed_Alphanumeric_Supplement",100663557},{"6-Enclosed_Alphanumerics",100663378},{"6-Enclosed_CJK",100663411}, {"6-Enclosed_CJK_Letters_And_Months",100663411},{"6-Enclosed_Ideographic_Sup",100663558}, {"6-Enclosed_Ideographic_Supplement",100663558},{"6-Ethiopic",100663334},{"6-EthiopicExt",100663396}, {"6-EthiopicExtA",100663438},{"6-EthiopicExtended",100663396},{"6-EthiopicExtendedA",100663438}, {"6-EthiopicSup",100663335},{"6-EthiopicSupplement",100663335},{"6-Ethiopic_Ext",100663396}, {"6-Ethiopic_Ext_A",100663438},{"6-Ethiopic_Extended",100663396},{"6-Ethiopic_Extended_A",100663438}, {"6-Ethiopic_Sup",100663335},{"6-Ethiopic_Supplement",100663335},{"6-GeneralPunctuation",100663367}, {"6-General_Punctuation",100663367},{"6-GeometricShapes",100663381},{"6-GeometricShapesExt",100663564}, {"6-GeometricShapesExtended",100663564},{"6-Geometric_Shapes",100663381},{"6-Geometric_Shapes_Ext",100663564}, {"6-Geometric_Shapes_Extended",100663564},{"6-Georgian",100663332},{"6-GeorgianSup",100663394}, {"6-GeorgianSupplement",100663394},{"6-Georgian_Sup",100663394},{"6-Georgian_Supplement",100663394}, {"6-Glagolitic",100663391},{"6-GlagoliticSup",100663550},{"6-GlagoliticSupplement",100663550}, {"6-Glagolitic_Sup",100663550},{"6-Glagolitic_Supplement",100663550},{"6-Gothic",100663469},{"6-Grantha",100663510}, {"6-Greek",100663304},{"6-GreekAndCoptic",100663304},{"6-GreekExt",100663366},{"6-GreekExtended",100663366}, {"6-Greek_And_Coptic",100663304},{"6-Greek_Ext",100663366},{"6-Greek_Extended",100663366},{"6-Gujarati",100663321}, {"6-Gurmukhi",100663320},{"6-HalfAndFullForms",100663457},{"6-HalfMarks",100663453},{"6-Half_And_Full_Forms",100663457}, {"6-Half_Marks",100663453},{"6-HalfwidthAndFullwidthForms",100663457},{"6-Halfwidth_And_Fullwidth_Forms",100663457}, {"6-Hangul",100663442},{"6-HangulCompatibilityJamo",100663406},{"6-HangulJamo",100663333}, {"6-HangulJamoExtendedA",100663431},{"6-HangulJamoExtendedB",100663443},{"6-HangulSyllables",100663442}, {"6-Hangul_Compatibility_Jamo",100663406},{"6-Hangul_Jamo",100663333},{"6-Hangul_Jamo_Extended_A",100663431}, {"6-Hangul_Jamo_Extended_B",100663443},{"6-Hangul_Syllables",100663442},{"6-Hanunoo",100663341},{"6-Hatran",100663484}, {"6-Hebrew",100663308},{"6-HighPUSurrogates",100663445},{"6-HighPrivateUseSurrogates",100663445}, {"6-HighSurrogates",100663444},{"6-High_PU_Surrogates",100663445},{"6-High_Private_Use_Surrogates",100663445}, {"6-High_Surrogates",100663444},{"6-Hiragana",100663403},{"6-IDC",100663401},{"6-IPAExt",100663301}, {"6-IPAExtensions",100663301},{"6-IPA_Ext",100663301},{"6-IPA_Extensions",100663301}, {"6-IdeographicDescriptionCharacters",100663401},{"6-IdeographicSymbols",100663535}, {"6-IdeographicSymbolsAndPunctuation",100663535},{"6-Ideographic_Description_Characters",100663401}, {"6-Ideographic_Symbols",100663535},{"6-Ideographic_Symbols_And_Punctuation",100663535},{"6-ImperialAramaic",100663481}, {"6-Imperial_Aramaic",100663481},{"6-IndicNumberForms",100663425},{"6-Indic_Number_Forms",100663425}, {"6-InscriptionalPahlavi",100663495},{"6-InscriptionalParthian",100663494},{"6-Inscriptional_Pahlavi",100663495}, {"6-Inscriptional_Parthian",100663494},{"6-Jamo",100663333},{"6-JamoExtA",100663431},{"6-JamoExtB",100663443}, {"6-Jamo_Ext_A",100663431},{"6-Jamo_Ext_B",100663443},{"6-Javanese",100663432},{"6-Kaithi",100663501}, {"6-KanaExtA",100663539},{"6-KanaExtendedA",100663539},{"6-KanaSup",100663538},{"6-KanaSupplement",100663538}, {"6-Kana_Ext_A",100663539},{"6-Kana_Extended_A",100663539},{"6-Kana_Sup",100663538},{"6-Kana_Supplement",100663538}, {"6-Kanbun",100663407},{"6-Kangxi",100663400},{"6-KangxiRadicals",100663400},{"6-Kangxi_Radicals",100663400}, {"6-Kannada",100663325},{"6-Katakana",100663404},{"6-KatakanaExt",100663410},{"6-KatakanaPhoneticExtensions",100663410}, {"6-Katakana_Ext",100663410},{"6-Katakana_Phonetic_Extensions",100663410},{"6-KayahLi",100663429}, {"6-Kayah_Li",100663429},{"6-Kharoshthi",100663489},{"6-Khmer",100663344},{"6-KhmerSymbols",100663350}, {"6-Khmer_Symbols",100663350},{"6-Khojki",100663507},{"6-Khudawadi",100663509},{"6-Lao",100663329}, {"6-Latin1",100663298},{"6-Latin1Sup",100663298},{"6-Latin1Supplement",100663298},{"6-LatinExtA",100663299}, {"6-LatinExtAdditional",100663365},{"6-LatinExtB",100663300},{"6-LatinExtC",100663392},{"6-LatinExtD",100663423}, {"6-LatinExtE",100663439},{"6-LatinExtendedA",100663299},{"6-LatinExtendedAdditional",100663365}, {"6-LatinExtendedB",100663300},{"6-LatinExtendedC",100663392},{"6-LatinExtendedD",100663423}, {"6-LatinExtendedE",100663439},{"6-Latin_1",100663298},{"6-Latin_1_Sup",100663298},{"6-Latin_1_Supplement",100663298}, {"6-Latin_Ext_A",100663299},{"6-Latin_Ext_Additional",100663365},{"6-Latin_Ext_B",100663300},{"6-Latin_Ext_C",100663392}, {"6-Latin_Ext_D",100663423},{"6-Latin_Ext_E",100663439},{"6-Latin_Extended_A",100663299}, {"6-Latin_Extended_Additional",100663365},{"6-Latin_Extended_B",100663300},{"6-Latin_Extended_C",100663392}, {"6-Latin_Extended_D",100663423},{"6-Latin_Extended_E",100663439},{"6-Lepcha",100663357}, {"6-LetterlikeSymbols",100663371},{"6-Letterlike_Symbols",100663371},{"6-Limbu",100663347},{"6-LinearA",100663479}, {"6-LinearBIdeograms",100663460},{"6-LinearBSyllabary",100663459},{"6-Linear_A",100663479}, {"6-Linear_B_Ideograms",100663460},{"6-Linear_B_Syllabary",100663459},{"6-Lisu",100663418},{"6-LowSurrogates",100663446}, {"6-Low_Surrogates",100663446},{"6-Lycian",100663465},{"6-Lydian",100663486},{"6-Mahajani",100663504}, {"6-Mahjong",100663554},{"6-MahjongTiles",100663554},{"6-Mahjong_Tiles",100663554},{"6-Malayalam",100663326}, {"6-Mandaic",100663315},{"6-Manichaean",100663492},{"6-Marchen",100663523},{"6-MasaramGondi",100663524}, {"6-Masaram_Gondi",100663524},{"6-MathAlphanum",100663548},{"6-MathOperators",100663374},{"6-Math_Alphanum",100663548}, {"6-Math_Operators",100663374},{"6-MathematicalAlphanumericSymbols",100663548},{"6-MathematicalOperators",100663374}, {"6-Mathematical_Alphanumeric_Symbols",100663548},{"6-Mathematical_Operators",100663374},{"6-MeeteiMayek",100663441}, {"6-MeeteiMayekExt",100663437},{"6-MeeteiMayekExtensions",100663437},{"6-Meetei_Mayek",100663441}, {"6-Meetei_Mayek_Ext",100663437},{"6-Meetei_Mayek_Extensions",100663437},{"6-MendeKikakui",100663551}, {"6-Mende_Kikakui",100663551},{"6-MeroiticCursive",100663488},{"6-MeroiticHieroglyphs",100663487}, {"6-Meroitic_Cursive",100663488},{"6-Meroitic_Hieroglyphs",100663487},{"6-Miao",100663534},{"6-MiscArrows",100663390}, {"6-MiscMathSymbolsA",100663384},{"6-MiscMathSymbolsB",100663388},{"6-MiscPictographs",100663559}, {"6-MiscSymbols",100663382},{"6-MiscTechnical",100663375},{"6-Misc_Arrows",100663390}, {"6-Misc_Math_Symbols_A",100663384},{"6-Misc_Math_Symbols_B",100663388},{"6-Misc_Pictographs",100663559}, {"6-Misc_Symbols",100663382},{"6-Misc_Technical",100663375},{"6-MiscellaneousMathematicalSymbolsA",100663384}, {"6-MiscellaneousMathematicalSymbolsB",100663388},{"6-MiscellaneousSymbols",100663382}, {"6-MiscellaneousSymbolsAndArrows",100663390},{"6-MiscellaneousSymbolsAndPictographs",100663559}, {"6-MiscellaneousTechnical",100663375},{"6-Miscellaneous_Mathematical_Symbols_A",100663384}, {"6-Miscellaneous_Mathematical_Symbols_B",100663388},{"6-Miscellaneous_Symbols",100663382}, {"6-Miscellaneous_Symbols_And_Arrows",100663390},{"6-Miscellaneous_Symbols_And_Pictographs",100663559}, {"6-Miscellaneous_Technical",100663375},{"6-Modi",100663514},{"6-ModifierLetters",100663302}, {"6-ModifierToneLetters",100663422},{"6-Modifier_Letters",100663302},{"6-Modifier_Tone_Letters",100663422}, {"6-Mongolian",100663345},{"6-MongolianSup",100663515},{"6-MongolianSupplement",100663515},{"6-Mongolian_Sup",100663515}, {"6-Mongolian_Supplement",100663515},{"6-Mro",100663531},{"6-Multani",100663508},{"6-Music",100663544}, {"6-MusicalSymbols",100663544},{"6-Musical_Symbols",100663544},{"6-Myanmar",100663331},{"6-MyanmarExtA",100663435}, {"6-MyanmarExtB",100663433},{"6-MyanmarExtendedA",100663435},{"6-MyanmarExtendedB",100663433}, {"6-Myanmar_Ext_A",100663435},{"6-Myanmar_Ext_B",100663433},{"6-Myanmar_Extended_A",100663435}, {"6-Myanmar_Extended_B",100663433},{"6-NB",100663296},{"6-NKo",100663313},{"6-Nabataean",100663483}, {"6-NewTaiLue",100663349},{"6-New_Tai_Lue",100663349},{"6-Newa",100663511},{"6-NoBlock",100663296}, {"6-No_Block",100663296},{"6-NumberForms",100663372},{"6-Number_Forms",100663372},{"6-Nushu",100663540}, {"6-OCR",100663377},{"6-Ogham",100663338},{"6-OlChiki",100663358},{"6-Ol_Chiki",100663358},{"6-OldHungarian",100663498}, {"6-OldItalic",100663468},{"6-OldNorthArabian",100663491},{"6-OldPermic",100663470},{"6-OldPersian",100663472}, {"6-OldSouthArabian",100663490},{"6-OldTurkic",100663497},{"6-Old_Hungarian",100663498},{"6-Old_Italic",100663468}, {"6-Old_North_Arabian",100663491},{"6-Old_Permic",100663470},{"6-Old_Persian",100663472}, {"6-Old_South_Arabian",100663490},{"6-Old_Turkic",100663497},{"6-OpticalCharacterRecognition",100663377}, {"6-Optical_Character_Recognition",100663377},{"6-Oriya",100663322},{"6-OrnamentalDingbats",100663561}, {"6-Ornamental_Dingbats",100663561},{"6-Osage",100663476},{"6-Osmanya",100663475},{"6-PUA",100663447}, {"6-PahawhHmong",100663533},{"6-Pahawh_Hmong",100663533},{"6-Palmyrene",100663482},{"6-PauCinHau",100663521}, {"6-Pau_Cin_Hau",100663521},{"6-PhagsPa",100663426},{"6-Phags_Pa",100663426},{"6-Phaistos",100663464}, {"6-PhaistosDisc",100663464},{"6-Phaistos_Disc",100663464},{"6-Phoenician",100663485},{"6-PhoneticExt",100663362}, {"6-PhoneticExtSup",100663363},{"6-PhoneticExtensions",100663362},{"6-PhoneticExtensionsSupplement",100663363}, {"6-Phonetic_Ext",100663362},{"6-Phonetic_Ext_Sup",100663363},{"6-Phonetic_Extensions",100663362}, {"6-Phonetic_Extensions_Supplement",100663363},{"6-PlayingCards",100663556},{"6-Playing_Cards",100663556}, {"6-PrivateUse",100663447},{"6-PrivateUseArea",100663447},{"6-Private_Use",100663447},{"6-Private_Use_Area",100663447}, {"6-PsalterPahlavi",100663496},{"6-Psalter_Pahlavi",100663496},{"6-Punctuation",100663367},{"6-Rejang",100663430}, {"6-Rumi",100663499},{"6-RumiNumeralSymbols",100663499},{"6-Rumi_Numeral_Symbols",100663499},{"6-Runic",100663339}, {"6-Samaritan",100663314},{"6-Saurashtra",100663427},{"6-Sharada",100663505},{"6-Shavian",100663474}, {"6-ShorthandFormatControls",100663542},{"6-Shorthand_Format_Controls",100663542},{"6-Siddham",100663513}, {"6-Sinhala",100663327},{"6-SinhalaArchaicNumbers",100663506},{"6-Sinhala_Archaic_Numbers",100663506}, {"6-SmallFormVariants",100663455},{"6-SmallForms",100663455},{"6-Small_Form_Variants",100663455}, {"6-Small_Forms",100663455},{"6-SoraSompeng",100663502},{"6-Sora_Sompeng",100663502},{"6-Soyombo",100663520}, {"6-SpacingModifierLetters",100663302},{"6-Spacing_Modifier_Letters",100663302},{"6-Specials",100663458}, {"6-Sundanese",100663355},{"6-SundaneseSup",100663360},{"6-SundaneseSupplement",100663360},{"6-Sundanese_Sup",100663360}, {"6-Sundanese_Supplement",100663360},{"6-SupArrowsA",100663385},{"6-SupArrowsB",100663387},{"6-SupArrowsC",100663565}, {"6-SupMathOperators",100663389},{"6-SupPUAA",100663575},{"6-SupPUAB",100663576},{"6-SupPunctuation",100663398}, {"6-SupSymbolsAndPictographs",100663566},{"6-Sup_Arrows_A",100663385},{"6-Sup_Arrows_B",100663387}, {"6-Sup_Arrows_C",100663565},{"6-Sup_Math_Operators",100663389},{"6-Sup_PUA_A",100663575},{"6-Sup_PUA_B",100663576}, {"6-Sup_Punctuation",100663398},{"6-Sup_Symbols_And_Pictographs",100663566},{"6-SuperAndSub",100663368}, {"6-Super_And_Sub",100663368},{"6-SuperscriptsAndSubscripts",100663368},{"6-Superscripts_And_Subscripts",100663368}, {"6-SupplementalArrowsA",100663385},{"6-SupplementalArrowsB",100663387},{"6-SupplementalArrowsC",100663565}, {"6-SupplementalMathematicalOperators",100663389},{"6-SupplementalPunctuation",100663398}, {"6-SupplementalSymbolsAndPictographs",100663566},{"6-Supplemental_Arrows_A",100663385}, {"6-Supplemental_Arrows_B",100663387},{"6-Supplemental_Arrows_C",100663565}, {"6-Supplemental_Mathematical_Operators",100663389},{"6-Supplemental_Punctuation",100663398}, {"6-Supplemental_Symbols_And_Pictographs",100663566},{"6-SupplementaryPrivateUseAreaA",100663575}, {"6-SupplementaryPrivateUseAreaB",100663576},{"6-Supplementary_Private_Use_Area_A",100663575}, {"6-Supplementary_Private_Use_Area_B",100663576},{"6-SuttonSignWriting",100663549},{"6-Sutton_SignWriting",100663549}, {"6-SylotiNagri",100663424},{"6-Syloti_Nagri",100663424},{"6-Syriac",100663310},{"6-SyriacSup",100663316}, {"6-SyriacSupplement",100663316},{"6-Syriac_Sup",100663316},{"6-Syriac_Supplement",100663316},{"6-Tagalog",100663340}, {"6-Tagbanwa",100663343},{"6-Tags",100663573},{"6-TaiLe",100663348},{"6-TaiTham",100663352},{"6-TaiViet",100663436}, {"6-TaiXuanJing",100663546},{"6-TaiXuanJingSymbols",100663546},{"6-Tai_Le",100663348},{"6-Tai_Tham",100663352}, {"6-Tai_Viet",100663436},{"6-Tai_Xuan_Jing",100663546},{"6-Tai_Xuan_Jing_Symbols",100663546},{"6-Takri",100663516}, {"6-Tamil",100663323},{"6-Tangut",100663536},{"6-TangutComponents",100663537},{"6-Tangut_Components",100663537}, {"6-Telugu",100663324},{"6-Thaana",100663312},{"6-Thai",100663328},{"6-Tibetan",100663330},{"6-Tifinagh",100663395}, {"6-Tirhuta",100663512},{"6-TransportAndMap",100663562},{"6-TransportAndMapSymbols",100663562}, {"6-Transport_And_Map",100663562},{"6-Transport_And_Map_Symbols",100663562},{"6-UCAS",100663337},{"6-UCASExt",100663346}, {"6-UCAS_Ext",100663346},{"6-Ugaritic",100663471},{"6-UnifiedCanadianAboriginalSyllabics",100663337}, {"6-UnifiedCanadianAboriginalSyllabicsExtended",100663346},{"6-Unified_Canadian_Aboriginal_Syllabics",100663337}, {"6-Unified_Canadian_Aboriginal_Syllabics_Extended",100663346},{"6-VS",100663451},{"6-VSSup",100663574}, {"6-VS_Sup",100663574},{"6-Vai",100663419},{"6-VariationSelectors",100663451}, {"6-VariationSelectorsSupplement",100663574},{"6-Variation_Selectors",100663451}, {"6-Variation_Selectors_Supplement",100663574},{"6-VedicExt",100663361},{"6-VedicExtensions",100663361}, {"6-Vedic_Ext",100663361},{"6-Vedic_Extensions",100663361},{"6-VerticalForms",100663452},{"6-Vertical_Forms",100663452}, {"6-WarangCiti",100663518},{"6-Warang_Citi",100663518},{"6-YiRadicals",100663417},{"6-YiSyllables",100663416}, {"6-Yi_Radicals",100663417},{"6-Yi_Syllables",100663416},{"6-Yijing",100663414},{"6-YijingHexagramSymbols",100663414}, {"6-Yijing_Hexagram_Symbols",100663414},{"6-ZanabazarSquare",100663519},{"6-Zanabazar_Square",100663519}, {"6-adlam",100663552},{"6-aegean_numbers",100663461},{"6-aegeannumbers",100663461},{"6-ahom",100663517}, {"6-alchemical",100663563},{"6-alchemical_symbols",100663563},{"6-alchemicalsymbols",100663563}, {"6-alphabetic_pf",100663449},{"6-alphabetic_presentation_forms",100663449},{"6-alphabeticpf",100663449}, {"6-alphabeticpresentationforms",100663449},{"6-anatolian_hieroglyphs",100663529},{"6-anatolianhieroglyphs",100663529}, {"6-ancient_greek_music",100663545},{"6-ancient_greek_musical_notation",100663545},{"6-ancient_greek_numbers",100663462}, {"6-ancient_symbols",100663463},{"6-ancientgreekmusic",100663545},{"6-ancientgreekmusicalnotation",100663545}, {"6-ancientgreeknumbers",100663462},{"6-ancientsymbols",100663463},{"6-arabic",100663309},{"6-arabic_ext_a",100663317}, {"6-arabic_extended_a",100663317},{"6-arabic_math",100663553},{"6-arabic_mathematical_alphabetic_symbols",100663553}, {"6-arabic_pf_a",100663450},{"6-arabic_pf_b",100663456},{"6-arabic_presentation_forms_a",100663450}, {"6-arabic_presentation_forms_b",100663456},{"6-arabic_sup",100663311},{"6-arabic_supplement",100663311}, {"6-arabicexta",100663317},{"6-arabicextendeda",100663317},{"6-arabicmath",100663553}, {"6-arabicmathematicalalphabeticsymbols",100663553},{"6-arabicpfa",100663450},{"6-arabicpfb",100663456}, {"6-arabicpresentationformsa",100663450},{"6-arabicpresentationformsb",100663456},{"6-arabicsup",100663311}, {"6-arabicsupplement",100663311},{"6-armenian",100663307},{"6-arrows",100663373},{"6-ascii",100663297}, {"6-avestan",100663493},{"6-balinese",100663354},{"6-bamum",100663421},{"6-bamum_sup",100663530}, {"6-bamum_supplement",100663530},{"6-bamumsup",100663530},{"6-bamumsupplement",100663530},{"6-basic_latin",100663297}, {"6-basiclatin",100663297},{"6-bassa_vah",100663532},{"6-bassavah",100663532},{"6-batak",100663356}, {"6-bengali",100663319},{"6-bhaiksuki",100663522},{"6-block_elements",100663380},{"6-blockelements",100663380}, {"6-bopomofo",100663405},{"6-bopomofo_ext",100663408},{"6-bopomofo_extended",100663408},{"6-bopomofoext",100663408}, {"6-bopomofoextended",100663408},{"6-box_drawing",100663379},{"6-boxdrawing",100663379},{"6-brahmi",100663500}, {"6-braille",100663386},{"6-braille_patterns",100663386},{"6-braillepatterns",100663386},{"6-buginese",100663351}, {"6-buhid",100663342},{"6-byzantine_music",100663543},{"6-byzantine_musical_symbols",100663543}, {"6-byzantinemusic",100663543},{"6-byzantinemusicalsymbols",100663543},{"6-canadian_syllabics",100663337}, {"6-canadiansyllabics",100663337},{"6-carian",100663466},{"6-caucasian_albanian",100663478}, {"6-caucasianalbanian",100663478},{"6-chakma",100663503},{"6-cham",100663434},{"6-cherokee",100663336}, {"6-cherokee_sup",100663440},{"6-cherokee_supplement",100663440},{"6-cherokeesup",100663440}, {"6-cherokeesupplement",100663440},{"6-cjk",100663415},{"6-cjk_compat",100663412},{"6-cjk_compat_forms",100663454}, {"6-cjk_compat_ideographs",100663448},{"6-cjk_compat_ideographs_sup",100663572},{"6-cjk_compatibility",100663412}, {"6-cjk_compatibility_forms",100663454},{"6-cjk_compatibility_ideographs",100663448}, {"6-cjk_compatibility_ideographs_supplement",100663572},{"6-cjk_ext_a",100663413},{"6-cjk_ext_b",100663567}, {"6-cjk_ext_c",100663568},{"6-cjk_ext_d",100663569},{"6-cjk_ext_e",100663570},{"6-cjk_ext_f",100663571}, {"6-cjk_radicals_sup",100663399},{"6-cjk_radicals_supplement",100663399},{"6-cjk_strokes",100663409}, {"6-cjk_symbols",100663402},{"6-cjk_symbols_and_punctuation",100663402},{"6-cjk_unified_ideographs",100663415}, {"6-cjk_unified_ideographs_extension_a",100663413},{"6-cjk_unified_ideographs_extension_b",100663567}, {"6-cjk_unified_ideographs_extension_c",100663568},{"6-cjk_unified_ideographs_extension_d",100663569}, {"6-cjk_unified_ideographs_extension_e",100663570},{"6-cjk_unified_ideographs_extension_f",100663571}, {"6-cjkcompat",100663412},{"6-cjkcompatforms",100663454},{"6-cjkcompatibility",100663412}, {"6-cjkcompatibilityforms",100663454},{"6-cjkcompatibilityideographs",100663448}, {"6-cjkcompatibilityideographssupplement",100663572},{"6-cjkcompatideographs",100663448}, {"6-cjkcompatideographssup",100663572},{"6-cjkexta",100663413},{"6-cjkextb",100663567},{"6-cjkextc",100663568}, {"6-cjkextd",100663569},{"6-cjkexte",100663570},{"6-cjkextf",100663571},{"6-cjkradicalssup",100663399}, {"6-cjkradicalssupplement",100663399},{"6-cjkstrokes",100663409},{"6-cjksymbols",100663402}, {"6-cjksymbolsandpunctuation",100663402},{"6-cjkunifiedideographs",100663415}, {"6-cjkunifiedideographsextensiona",100663413},{"6-cjkunifiedideographsextensionb",100663567}, {"6-cjkunifiedideographsextensionc",100663568},{"6-cjkunifiedideographsextensiond",100663569}, {"6-cjkunifiedideographsextensione",100663570},{"6-cjkunifiedideographsextensionf",100663571}, {"6-combining_diacritical_marks",100663303},{"6-combining_diacritical_marks_extended",100663353}, {"6-combining_diacritical_marks_for_symbols",100663370},{"6-combining_diacritical_marks_supplement",100663364}, {"6-combining_half_marks",100663453},{"6-combining_marks_for_symbols",100663370}, {"6-combiningdiacriticalmarks",100663303},{"6-combiningdiacriticalmarksextended",100663353}, {"6-combiningdiacriticalmarksforsymbols",100663370},{"6-combiningdiacriticalmarkssupplement",100663364}, {"6-combininghalfmarks",100663453},{"6-combiningmarksforsymbols",100663370},{"6-common_indic_number_forms",100663425}, {"6-commonindicnumberforms",100663425},{"6-compat_jamo",100663406},{"6-compatjamo",100663406}, {"6-control_pictures",100663376},{"6-controlpictures",100663376},{"6-coptic",100663393}, {"6-coptic_epact_numbers",100663467},{"6-copticepactnumbers",100663467},{"6-counting_rod",100663547}, {"6-counting_rod_numerals",100663547},{"6-countingrod",100663547},{"6-countingrodnumerals",100663547}, {"6-cuneiform",100663525},{"6-cuneiform_numbers",100663526},{"6-cuneiform_numbers_and_punctuation",100663526}, {"6-cuneiformnumbers",100663526},{"6-cuneiformnumbersandpunctuation",100663526},{"6-currency_symbols",100663369}, {"6-currencysymbols",100663369},{"6-cypriot_syllabary",100663480},{"6-cypriotsyllabary",100663480}, {"6-cyrillic",100663305},{"6-cyrillic_ext_a",100663397},{"6-cyrillic_ext_b",100663420},{"6-cyrillic_ext_c",100663359}, {"6-cyrillic_extended_a",100663397},{"6-cyrillic_extended_b",100663420},{"6-cyrillic_extended_c",100663359}, {"6-cyrillic_sup",100663306},{"6-cyrillic_supplement",100663306},{"6-cyrillic_supplementary",100663306}, {"6-cyrillicexta",100663397},{"6-cyrillicextb",100663420},{"6-cyrillicextc",100663359},{"6-cyrillicextendeda",100663397}, {"6-cyrillicextendedb",100663420},{"6-cyrillicextendedc",100663359},{"6-cyrillicsup",100663306}, {"6-cyrillicsupplement",100663306},{"6-cyrillicsupplementary",100663306},{"6-deseret",100663473}, {"6-devanagari",100663318},{"6-devanagari_ext",100663428},{"6-devanagari_extended",100663428}, {"6-devanagariext",100663428},{"6-devanagariextended",100663428},{"6-diacriticals",100663303}, {"6-diacriticals_ext",100663353},{"6-diacriticals_for_symbols",100663370},{"6-diacriticals_sup",100663364}, {"6-diacriticalsext",100663353},{"6-diacriticalsforsymbols",100663370},{"6-diacriticalssup",100663364}, {"6-dingbats",100663383},{"6-domino",100663555},{"6-domino_tiles",100663555},{"6-dominotiles",100663555}, {"6-duployan",100663541},{"6-early_dynastic_cuneiform",100663527},{"6-earlydynasticcuneiform",100663527}, {"6-egyptian_hieroglyphs",100663528},{"6-egyptianhieroglyphs",100663528},{"6-elbasan",100663477}, {"6-emoticons",100663560},{"6-enclosed_alphanum",100663378},{"6-enclosed_alphanum_sup",100663557}, {"6-enclosed_alphanumeric_supplement",100663557},{"6-enclosed_alphanumerics",100663378},{"6-enclosed_cjk",100663411}, {"6-enclosed_cjk_letters_and_months",100663411},{"6-enclosed_ideographic_sup",100663558}, {"6-enclosed_ideographic_supplement",100663558},{"6-enclosedalphanum",100663378},{"6-enclosedalphanumerics",100663378}, {"6-enclosedalphanumericsupplement",100663557},{"6-enclosedalphanumsup",100663557},{"6-enclosedcjk",100663411}, {"6-enclosedcjklettersandmonths",100663411},{"6-enclosedideographicsup",100663558}, {"6-enclosedideographicsupplement",100663558},{"6-ethiopic",100663334},{"6-ethiopic_ext",100663396}, {"6-ethiopic_ext_a",100663438},{"6-ethiopic_extended",100663396},{"6-ethiopic_extended_a",100663438}, {"6-ethiopic_sup",100663335},{"6-ethiopic_supplement",100663335},{"6-ethiopicext",100663396}, {"6-ethiopicexta",100663438},{"6-ethiopicextended",100663396},{"6-ethiopicextendeda",100663438}, {"6-ethiopicsup",100663335},{"6-ethiopicsupplement",100663335},{"6-general_punctuation",100663367}, {"6-generalpunctuation",100663367},{"6-geometric_shapes",100663381},{"6-geometric_shapes_ext",100663564}, {"6-geometric_shapes_extended",100663564},{"6-geometricshapes",100663381},{"6-geometricshapesext",100663564}, {"6-geometricshapesextended",100663564},{"6-georgian",100663332},{"6-georgian_sup",100663394}, {"6-georgian_supplement",100663394},{"6-georgiansup",100663394},{"6-georgiansupplement",100663394}, {"6-glagolitic",100663391},{"6-glagolitic_sup",100663550},{"6-glagolitic_supplement",100663550}, {"6-glagoliticsup",100663550},{"6-glagoliticsupplement",100663550},{"6-gothic",100663469},{"6-grantha",100663510}, {"6-greek",100663304},{"6-greek_and_coptic",100663304},{"6-greek_ext",100663366},{"6-greek_extended",100663366}, {"6-greekandcoptic",100663304},{"6-greekext",100663366},{"6-greekextended",100663366},{"6-gujarati",100663321}, {"6-gurmukhi",100663320},{"6-half_and_full_forms",100663457},{"6-half_marks",100663453},{"6-halfandfullforms",100663457}, {"6-halfmarks",100663453},{"6-halfwidth_and_fullwidth_forms",100663457},{"6-halfwidthandfullwidthforms",100663457}, {"6-hangul",100663442},{"6-hangul_compatibility_jamo",100663406},{"6-hangul_jamo",100663333}, {"6-hangul_jamo_extended_a",100663431},{"6-hangul_jamo_extended_b",100663443},{"6-hangul_syllables",100663442}, {"6-hangulcompatibilityjamo",100663406},{"6-hanguljamo",100663333},{"6-hanguljamoextendeda",100663431}, {"6-hanguljamoextendedb",100663443},{"6-hangulsyllables",100663442},{"6-hanunoo",100663341},{"6-hatran",100663484}, {"6-hebrew",100663308},{"6-high_private_use_surrogates",100663445},{"6-high_pu_surrogates",100663445}, {"6-high_surrogates",100663444},{"6-highprivateusesurrogates",100663445},{"6-highpusurrogates",100663445}, {"6-highsurrogates",100663444},{"6-hiragana",100663403},{"6-idc",100663401}, {"6-ideographic_description_characters",100663401},{"6-ideographic_symbols",100663535}, {"6-ideographic_symbols_and_punctuation",100663535},{"6-ideographicdescriptioncharacters",100663401}, {"6-ideographicsymbols",100663535},{"6-ideographicsymbolsandpunctuation",100663535},{"6-imperial_aramaic",100663481}, {"6-imperialaramaic",100663481},{"6-indic_number_forms",100663425},{"6-indicnumberforms",100663425}, {"6-inscriptional_pahlavi",100663495},{"6-inscriptional_parthian",100663494},{"6-inscriptionalpahlavi",100663495}, {"6-inscriptionalparthian",100663494},{"6-ipa_ext",100663301},{"6-ipa_extensions",100663301},{"6-ipaext",100663301}, {"6-ipaextensions",100663301},{"6-jamo",100663333},{"6-jamo_ext_a",100663431},{"6-jamo_ext_b",100663443}, {"6-jamoexta",100663431},{"6-jamoextb",100663443},{"6-javanese",100663432},{"6-kaithi",100663501}, {"6-kana_ext_a",100663539},{"6-kana_extended_a",100663539},{"6-kana_sup",100663538},{"6-kana_supplement",100663538}, {"6-kanaexta",100663539},{"6-kanaextendeda",100663539},{"6-kanasup",100663538},{"6-kanasupplement",100663538}, {"6-kanbun",100663407},{"6-kangxi",100663400},{"6-kangxi_radicals",100663400},{"6-kangxiradicals",100663400}, {"6-kannada",100663325},{"6-katakana",100663404},{"6-katakana_ext",100663410}, {"6-katakana_phonetic_extensions",100663410},{"6-katakanaext",100663410},{"6-katakanaphoneticextensions",100663410}, {"6-kayah_li",100663429},{"6-kayahli",100663429},{"6-kharoshthi",100663489},{"6-khmer",100663344}, {"6-khmer_symbols",100663350},{"6-khmersymbols",100663350},{"6-khojki",100663507},{"6-khudawadi",100663509}, {"6-lao",100663329},{"6-latin1",100663298},{"6-latin1sup",100663298},{"6-latin1supplement",100663298}, {"6-latin_1",100663298},{"6-latin_1_sup",100663298},{"6-latin_1_supplement",100663298},{"6-latin_ext_a",100663299}, {"6-latin_ext_additional",100663365},{"6-latin_ext_b",100663300},{"6-latin_ext_c",100663392},{"6-latin_ext_d",100663423}, {"6-latin_ext_e",100663439},{"6-latin_extended_a",100663299},{"6-latin_extended_additional",100663365}, {"6-latin_extended_b",100663300},{"6-latin_extended_c",100663392},{"6-latin_extended_d",100663423}, {"6-latin_extended_e",100663439},{"6-latinexta",100663299},{"6-latinextadditional",100663365},{"6-latinextb",100663300}, {"6-latinextc",100663392},{"6-latinextd",100663423},{"6-latinexte",100663439},{"6-latinextendeda",100663299}, {"6-latinextendedadditional",100663365},{"6-latinextendedb",100663300},{"6-latinextendedc",100663392}, {"6-latinextendedd",100663423},{"6-latinextendede",100663439},{"6-lepcha",100663357},{"6-letterlike_symbols",100663371}, {"6-letterlikesymbols",100663371},{"6-limbu",100663347},{"6-linear_a",100663479},{"6-linear_b_ideograms",100663460}, {"6-linear_b_syllabary",100663459},{"6-lineara",100663479},{"6-linearbideograms",100663460}, {"6-linearbsyllabary",100663459},{"6-lisu",100663418},{"6-low_surrogates",100663446},{"6-lowsurrogates",100663446}, {"6-lycian",100663465},{"6-lydian",100663486},{"6-mahajani",100663504},{"6-mahjong",100663554}, {"6-mahjong_tiles",100663554},{"6-mahjongtiles",100663554},{"6-malayalam",100663326},{"6-mandaic",100663315}, {"6-manichaean",100663492},{"6-marchen",100663523},{"6-masaram_gondi",100663524},{"6-masaramgondi",100663524}, {"6-math_alphanum",100663548},{"6-math_operators",100663374},{"6-mathalphanum",100663548}, {"6-mathematical_alphanumeric_symbols",100663548},{"6-mathematical_operators",100663374}, {"6-mathematicalalphanumericsymbols",100663548},{"6-mathematicaloperators",100663374},{"6-mathoperators",100663374}, {"6-meetei_mayek",100663441},{"6-meetei_mayek_ext",100663437},{"6-meetei_mayek_extensions",100663437}, {"6-meeteimayek",100663441},{"6-meeteimayekext",100663437},{"6-meeteimayekextensions",100663437}, {"6-mende_kikakui",100663551},{"6-mendekikakui",100663551},{"6-meroitic_cursive",100663488}, {"6-meroitic_hieroglyphs",100663487},{"6-meroiticcursive",100663488},{"6-meroitichieroglyphs",100663487}, {"6-miao",100663534},{"6-misc_arrows",100663390},{"6-misc_math_symbols_a",100663384},{"6-misc_math_symbols_b",100663388}, {"6-misc_pictographs",100663559},{"6-misc_symbols",100663382},{"6-misc_technical",100663375},{"6-miscarrows",100663390}, {"6-miscellaneous_mathematical_symbols_a",100663384},{"6-miscellaneous_mathematical_symbols_b",100663388}, {"6-miscellaneous_symbols",100663382},{"6-miscellaneous_symbols_and_arrows",100663390}, {"6-miscellaneous_symbols_and_pictographs",100663559},{"6-miscellaneous_technical",100663375}, {"6-miscellaneousmathematicalsymbolsa",100663384},{"6-miscellaneousmathematicalsymbolsb",100663388}, {"6-miscellaneoussymbols",100663382},{"6-miscellaneoussymbolsandarrows",100663390}, {"6-miscellaneoussymbolsandpictographs",100663559},{"6-miscellaneoustechnical",100663375}, {"6-miscmathsymbolsa",100663384},{"6-miscmathsymbolsb",100663388},{"6-miscpictographs",100663559}, {"6-miscsymbols",100663382},{"6-misctechnical",100663375},{"6-modi",100663514},{"6-modifier_letters",100663302}, {"6-modifier_tone_letters",100663422},{"6-modifierletters",100663302},{"6-modifiertoneletters",100663422}, {"6-mongolian",100663345},{"6-mongolian_sup",100663515},{"6-mongolian_supplement",100663515}, {"6-mongoliansup",100663515},{"6-mongoliansupplement",100663515},{"6-mro",100663531},{"6-multani",100663508}, {"6-music",100663544},{"6-musical_symbols",100663544},{"6-musicalsymbols",100663544},{"6-myanmar",100663331}, {"6-myanmar_ext_a",100663435},{"6-myanmar_ext_b",100663433},{"6-myanmar_extended_a",100663435}, {"6-myanmar_extended_b",100663433},{"6-myanmarexta",100663435},{"6-myanmarextb",100663433}, {"6-myanmarextendeda",100663435},{"6-myanmarextendedb",100663433},{"6-nabataean",100663483},{"6-nb",100663296}, {"6-new_tai_lue",100663349},{"6-newa",100663511},{"6-newtailue",100663349},{"6-nko",100663313},{"6-no_block",100663296}, {"6-noblock",100663296},{"6-number_forms",100663372},{"6-numberforms",100663372},{"6-nushu",100663540}, {"6-ocr",100663377},{"6-ogham",100663338},{"6-ol_chiki",100663358},{"6-olchiki",100663358},{"6-old_hungarian",100663498}, {"6-old_italic",100663468},{"6-old_north_arabian",100663491},{"6-old_permic",100663470},{"6-old_persian",100663472}, {"6-old_south_arabian",100663490},{"6-old_turkic",100663497},{"6-oldhungarian",100663498},{"6-olditalic",100663468}, {"6-oldnortharabian",100663491},{"6-oldpermic",100663470},{"6-oldpersian",100663472},{"6-oldsoutharabian",100663490}, {"6-oldturkic",100663497},{"6-optical_character_recognition",100663377},{"6-opticalcharacterrecognition",100663377}, {"6-oriya",100663322},{"6-ornamental_dingbats",100663561},{"6-ornamentaldingbats",100663561},{"6-osage",100663476}, {"6-osmanya",100663475},{"6-pahawh_hmong",100663533},{"6-pahawhhmong",100663533},{"6-palmyrene",100663482}, {"6-pau_cin_hau",100663521},{"6-paucinhau",100663521},{"6-phags_pa",100663426},{"6-phagspa",100663426}, {"6-phaistos",100663464},{"6-phaistos_disc",100663464},{"6-phaistosdisc",100663464},{"6-phoenician",100663485}, {"6-phonetic_ext",100663362},{"6-phonetic_ext_sup",100663363},{"6-phonetic_extensions",100663362}, {"6-phonetic_extensions_supplement",100663363},{"6-phoneticext",100663362},{"6-phoneticextensions",100663362}, {"6-phoneticextensionssupplement",100663363},{"6-phoneticextsup",100663363},{"6-playing_cards",100663556}, {"6-playingcards",100663556},{"6-private_use",100663447},{"6-private_use_area",100663447},{"6-privateuse",100663447}, {"6-privateusearea",100663447},{"6-psalter_pahlavi",100663496},{"6-psalterpahlavi",100663496},{"6-pua",100663447}, {"6-punctuation",100663367},{"6-rejang",100663430},{"6-rumi",100663499},{"6-rumi_numeral_symbols",100663499}, {"6-ruminumeralsymbols",100663499},{"6-runic",100663339},{"6-samaritan",100663314},{"6-saurashtra",100663427}, {"6-sharada",100663505},{"6-shavian",100663474},{"6-shorthand_format_controls",100663542}, {"6-shorthandformatcontrols",100663542},{"6-siddham",100663513},{"6-sinhala",100663327}, {"6-sinhala_archaic_numbers",100663506},{"6-sinhalaarchaicnumbers",100663506},{"6-small_form_variants",100663455}, {"6-small_forms",100663455},{"6-smallforms",100663455},{"6-smallformvariants",100663455},{"6-sora_sompeng",100663502}, {"6-sorasompeng",100663502},{"6-soyombo",100663520},{"6-spacing_modifier_letters",100663302}, {"6-spacingmodifierletters",100663302},{"6-specials",100663458},{"6-sundanese",100663355},{"6-sundanese_sup",100663360}, {"6-sundanese_supplement",100663360},{"6-sundanesesup",100663360},{"6-sundanesesupplement",100663360}, {"6-sup_arrows_a",100663385},{"6-sup_arrows_b",100663387},{"6-sup_arrows_c",100663565}, {"6-sup_math_operators",100663389},{"6-sup_pua_a",100663575},{"6-sup_pua_b",100663576},{"6-sup_punctuation",100663398}, {"6-sup_symbols_and_pictographs",100663566},{"6-suparrowsa",100663385},{"6-suparrowsb",100663387}, {"6-suparrowsc",100663565},{"6-super_and_sub",100663368},{"6-superandsub",100663368}, {"6-superscripts_and_subscripts",100663368},{"6-superscriptsandsubscripts",100663368},{"6-supmathoperators",100663389}, {"6-supplemental_arrows_a",100663385},{"6-supplemental_arrows_b",100663387},{"6-supplemental_arrows_c",100663565}, {"6-supplemental_mathematical_operators",100663389},{"6-supplemental_punctuation",100663398}, {"6-supplemental_symbols_and_pictographs",100663566},{"6-supplementalarrowsa",100663385}, {"6-supplementalarrowsb",100663387},{"6-supplementalarrowsc",100663565}, {"6-supplementalmathematicaloperators",100663389},{"6-supplementalpunctuation",100663398}, {"6-supplementalsymbolsandpictographs",100663566},{"6-supplementary_private_use_area_a",100663575}, {"6-supplementary_private_use_area_b",100663576},{"6-supplementaryprivateuseareaa",100663575}, {"6-supplementaryprivateuseareab",100663576},{"6-suppuaa",100663575},{"6-suppuab",100663576}, {"6-suppunctuation",100663398},{"6-supsymbolsandpictographs",100663566},{"6-sutton_signwriting",100663549}, {"6-suttonsignwriting",100663549},{"6-syloti_nagri",100663424},{"6-sylotinagri",100663424},{"6-syriac",100663310}, {"6-syriac_sup",100663316},{"6-syriac_supplement",100663316},{"6-syriacsup",100663316},{"6-syriacsupplement",100663316}, {"6-tagalog",100663340},{"6-tagbanwa",100663343},{"6-tags",100663573},{"6-tai_le",100663348},{"6-tai_tham",100663352}, {"6-tai_viet",100663436},{"6-tai_xuan_jing",100663546},{"6-tai_xuan_jing_symbols",100663546},{"6-taile",100663348}, {"6-taitham",100663352},{"6-taiviet",100663436},{"6-taixuanjing",100663546},{"6-taixuanjingsymbols",100663546}, {"6-takri",100663516},{"6-tamil",100663323},{"6-tangut",100663536},{"6-tangut_components",100663537}, {"6-tangutcomponents",100663537},{"6-telugu",100663324},{"6-thaana",100663312},{"6-thai",100663328}, {"6-tibetan",100663330},{"6-tifinagh",100663395},{"6-tirhuta",100663512},{"6-transport_and_map",100663562}, {"6-transport_and_map_symbols",100663562},{"6-transportandmap",100663562},{"6-transportandmapsymbols",100663562}, {"6-ucas",100663337},{"6-ucas_ext",100663346},{"6-ucasext",100663346},{"6-ugaritic",100663471}, {"6-unified_canadian_aboriginal_syllabics",100663337},{"6-unified_canadian_aboriginal_syllabics_extended",100663346}, {"6-unifiedcanadianaboriginalsyllabics",100663337},{"6-unifiedcanadianaboriginalsyllabicsextended",100663346}, {"6-vai",100663419},{"6-variation_selectors",100663451},{"6-variation_selectors_supplement",100663574}, {"6-variationselectors",100663451},{"6-variationselectorssupplement",100663574},{"6-vedic_ext",100663361}, {"6-vedic_extensions",100663361},{"6-vedicext",100663361},{"6-vedicextensions",100663361},{"6-vertical_forms",100663452}, {"6-verticalforms",100663452},{"6-vs",100663451},{"6-vs_sup",100663574},{"6-vssup",100663574}, {"6-warang_citi",100663518},{"6-warangciti",100663518},{"6-yi_radicals",100663417},{"6-yi_syllables",100663416}, {"6-yijing",100663414},{"6-yijing_hexagram_symbols",100663414},{"6-yijinghexagramsymbols",100663414}, {"6-yiradicals",100663417},{"6-yisyllables",100663416},{"6-zanabazar_square",100663519},{"6-zanabazarsquare",100663519}, {"37-Cased",620756993},{"37-cased",620756993},{"13-0",218103809},{"13-1",218103810},{"13-10",218103814}, {"13-103",218103843},{"13-107",218103844},{"13-11",218103815},{"13-118",218103845},{"13-12",218103816}, {"13-122",218103846},{"13-129",218103847},{"13-13",218103817},{"13-130",218103848},{"13-132",218103849}, {"13-14",218103818},{"13-15",218103819},{"13-16",218103820},{"13-17",218103821},{"13-18",218103822},{"13-19",218103823}, {"13-20",218103824},{"13-202",218103850},{"13-21",218103825},{"13-214",218103851},{"13-216",218103852}, {"13-218",218103853},{"13-22",218103826},{"13-220",218103854},{"13-222",218103855},{"13-224",218103856}, {"13-226",218103857},{"13-228",218103858},{"13-23",218103827},{"13-230",218103859},{"13-232",218103860}, {"13-233",218103861},{"13-234",218103862},{"13-24",218103828},{"13-240",218103863},{"13-25",218103829}, {"13-26",218103830},{"13-27",218103831},{"13-28",218103832},{"13-29",218103833},{"13-30",218103834},{"13-31",218103835}, {"13-32",218103836},{"13-33",218103837},{"13-34",218103838},{"13-35",218103839},{"13-36",218103840},{"13-7",218103811}, {"13-8",218103812},{"13-84",218103841},{"13-9",218103813},{"13-91",218103842},{"13-A",218103859},{"13-AL",218103858}, {"13-AR",218103860},{"13-ATA",218103851},{"13-ATAR",218103852},{"13-ATB",218103850},{"13-Above",218103859}, {"13-AboveLeft",218103858},{"13-AboveRight",218103860},{"13-Above_Left",218103858},{"13-Above_Right",218103860}, {"13-AttachedAbove",218103851},{"13-AttachedAboveRight",218103852},{"13-AttachedBelow",218103850}, {"13-Attached_Above",218103851},{"13-Attached_Above_Right",218103852},{"13-Attached_Below",218103850},{"13-B",218103854}, {"13-BL",218103853},{"13-BR",218103855},{"13-Below",218103854},{"13-BelowLeft",218103853},{"13-BelowRight",218103855}, {"13-Below_Left",218103853},{"13-Below_Right",218103855},{"13-CCC10",218103814},{"13-CCC103",218103843}, {"13-CCC107",218103844},{"13-CCC11",218103815},{"13-CCC118",218103845},{"13-CCC12",218103816},{"13-CCC122",218103846}, {"13-CCC129",218103847},{"13-CCC13",218103817},{"13-CCC130",218103848},{"13-CCC132",218103849},{"13-CCC14",218103818}, {"13-CCC15",218103819},{"13-CCC16",218103820},{"13-CCC17",218103821},{"13-CCC18",218103822},{"13-CCC19",218103823}, {"13-CCC20",218103824},{"13-CCC21",218103825},{"13-CCC22",218103826},{"13-CCC23",218103827},{"13-CCC24",218103828}, {"13-CCC25",218103829},{"13-CCC26",218103830},{"13-CCC27",218103831},{"13-CCC28",218103832},{"13-CCC29",218103833}, {"13-CCC30",218103834},{"13-CCC31",218103835},{"13-CCC32",218103836},{"13-CCC33",218103837},{"13-CCC34",218103838}, {"13-CCC35",218103839},{"13-CCC36",218103840},{"13-CCC84",218103841},{"13-CCC91",218103842},{"13-DA",218103862}, {"13-DB",218103861},{"13-DoubleAbove",218103862},{"13-DoubleBelow",218103861},{"13-Double_Above",218103862}, {"13-Double_Below",218103861},{"13-IS",218103863},{"13-IotaSubscript",218103863},{"13-Iota_Subscript",218103863}, {"13-KV",218103812},{"13-KanaVoicing",218103812},{"13-Kana_Voicing",218103812},{"13-L",218103856},{"13-Left",218103856}, {"13-NK",218103811},{"13-NR",218103809},{"13-NotReordered",218103809},{"13-Not_Reordered",218103809}, {"13-Nukta",218103811},{"13-OV",218103810},{"13-Overlay",218103810},{"13-R",218103857},{"13-Right",218103857}, {"13-VR",218103813},{"13-Virama",218103813},{"13-a",218103859},{"13-above",218103859},{"13-above_left",218103858}, {"13-above_right",218103860},{"13-aboveleft",218103858},{"13-aboveright",218103860},{"13-al",218103858}, {"13-ar",218103860},{"13-ata",218103851},{"13-atar",218103852},{"13-atb",218103850},{"13-attached_above",218103851}, {"13-attached_above_right",218103852},{"13-attached_below",218103850},{"13-attachedabove",218103851}, {"13-attachedaboveright",218103852},{"13-attachedbelow",218103850},{"13-b",218103854},{"13-below",218103854}, {"13-below_left",218103853},{"13-below_right",218103855},{"13-belowleft",218103853},{"13-belowright",218103855}, {"13-bl",218103853},{"13-br",218103855},{"13-ccc10",218103814},{"13-ccc103",218103843},{"13-ccc107",218103844}, {"13-ccc11",218103815},{"13-ccc118",218103845},{"13-ccc12",218103816},{"13-ccc122",218103846},{"13-ccc129",218103847}, {"13-ccc13",218103817},{"13-ccc130",218103848},{"13-ccc132",218103849},{"13-ccc14",218103818},{"13-ccc15",218103819}, {"13-ccc16",218103820},{"13-ccc17",218103821},{"13-ccc18",218103822},{"13-ccc19",218103823},{"13-ccc20",218103824}, {"13-ccc21",218103825},{"13-ccc22",218103826},{"13-ccc23",218103827},{"13-ccc24",218103828},{"13-ccc25",218103829}, {"13-ccc26",218103830},{"13-ccc27",218103831},{"13-ccc28",218103832},{"13-ccc29",218103833},{"13-ccc30",218103834}, {"13-ccc31",218103835},{"13-ccc32",218103836},{"13-ccc33",218103837},{"13-ccc34",218103838},{"13-ccc35",218103839}, {"13-ccc36",218103840},{"13-ccc84",218103841},{"13-ccc91",218103842},{"13-da",218103862},{"13-db",218103861}, {"13-double_above",218103862},{"13-double_below",218103861},{"13-doubleabove",218103862},{"13-doublebelow",218103861}, {"13-iota_subscript",218103863},{"13-iotasubscript",218103863},{"13-is",218103863},{"13-kana_voicing",218103812}, {"13-kanavoicing",218103812},{"13-kv",218103812},{"13-l",218103856},{"13-left",218103856},{"13-nk",218103811}, {"13-not_reordered",218103809},{"13-notreordered",218103809},{"13-nr",218103809},{"13-nukta",218103811}, {"13-ov",218103810},{"13-overlay",218103810},{"13-r",218103857},{"13-right",218103857},{"13-virama",218103813}, {"13-vr",218103813},{"36-CaseIgnorable",603979777},{"36-Case_Ignorable",603979777},{"36-case_ignorable",603979777}, {"36-caseignorable",603979777},{"54-FullCompositionExclusion",905969665},{"54-Full_Composition_Exclusion",905969665}, {"54-full_composition_exclusion",905969665},{"54-fullcompositionexclusion",905969665}, {"38-ChangesWhenCasefolded",637534209},{"38-Changes_When_Casefolded",637534209},{"38-changes_when_casefolded",637534209}, {"38-changeswhencasefolded",637534209},{"39-ChangesWhenCasemapped",654311425},{"39-Changes_When_Casemapped",654311425}, {"39-changes_when_casemapped",654311425},{"39-changeswhencasemapped",654311425}, {"41-ChangesWhenNFKCCasefolded",687865857},{"41-Changes_When_NFKC_Casefolded",687865857}, {"41-changes_when_nfkc_casefolded",687865857},{"41-changeswhennfkccasefolded",687865857}, {"40-ChangesWhenLowercased",671088641},{"40-Changes_When_Lowercased",671088641},{"40-changes_when_lowercased",671088641}, {"40-changeswhenlowercased",671088641},{"42-ChangesWhenTitlecased",704643073},{"42-Changes_When_Titlecased",704643073}, {"42-changes_when_titlecased",704643073},{"42-changeswhentitlecased",704643073},{"43-ChangesWhenUppercased",721420289}, {"43-Changes_When_Uppercased",721420289},{"43-changes_when_uppercased",721420289},{"43-changeswhenuppercased",721420289}, {"44-Dash",738197505},{"44-dash",738197505},{"46-Deprecated",771751937},{"46-deprecated",771751937}, {"45-DefaultIgnorableCodePoint",754974721},{"45-Default_Ignorable_Code_Point",754974721}, {"45-default_ignorable_code_point",754974721},{"45-defaultignorablecodepoint",754974721},{"47-Diacritic",788529153}, {"47-diacritic",788529153},{"17-Can",285212673},{"17-Canonical",285212673},{"17-Circle",285212681},{"17-Com",285212674}, {"17-Compat",285212674},{"17-Enc",285212681},{"17-Fin",285212679},{"17-Final",285212679},{"17-Font",285212675}, {"17-Fra",285212689},{"17-Fraction",285212689},{"17-Init",285212677},{"17-Initial",285212677},{"17-Iso",285212680}, {"17-Isolated",285212680},{"17-Med",285212678},{"17-Medial",285212678},{"17-Nar",285212686},{"17-Narrow",285212686}, {"17-Nb",285212676},{"17-Nobreak",285212676},{"17-None",285212672},{"17-Small",285212687},{"17-Sml",285212687}, {"17-Sqr",285212688},{"17-Square",285212688},{"17-Sub",285212683},{"17-Sup",285212682},{"17-Super",285212682}, {"17-Vert",285212684},{"17-Vertical",285212684},{"17-Wide",285212685},{"17-can",285212673},{"17-canonical",285212673}, {"17-circle",285212681},{"17-com",285212674},{"17-compat",285212674},{"17-enc",285212681},{"17-fin",285212679}, {"17-final",285212679},{"17-font",285212675},{"17-fra",285212689},{"17-fraction",285212689},{"17-init",285212677}, {"17-initial",285212677},{"17-iso",285212680},{"17-isolated",285212680},{"17-med",285212678},{"17-medial",285212678}, {"17-nar",285212686},{"17-narrow",285212686},{"17-nb",285212676},{"17-nobreak",285212676},{"17-none",285212672}, {"17-small",285212687},{"17-sml",285212687},{"17-sqr",285212688},{"17-square",285212688},{"17-sub",285212683}, {"17-sup",285212682},{"17-super",285212682},{"17-vert",285212684},{"17-vertical",285212684},{"17-wide",285212685}, {"7-A",117440513},{"7-Ambiguous",117440513},{"7-F",117440516},{"7-Fullwidth",117440516},{"7-H",117440514}, {"7-Halfwidth",117440514},{"7-N",117440512},{"7-Na",117440517},{"7-Narrow",117440517},{"7-Neutral",117440512}, {"7-W",117440515},{"7-Wide",117440515},{"7-a",117440513},{"7-ambiguous",117440513},{"7-f",117440516}, {"7-fullwidth",117440516},{"7-h",117440514},{"7-halfwidth",117440514},{"7-n",117440512},{"7-na",117440517}, {"7-narrow",117440517},{"7-neutral",117440512},{"7-w",117440515},{"7-wide",117440515},{"53-Extender",889192449}, {"53-extender",889192449},{"55-GraphemeBase",922746881},{"55-Grapheme_Base",922746881},{"55-grapheme_base",922746881}, {"55-graphemebase",922746881},{"56-GraphemeExtend",939524097},{"56-Grapheme_Extend",939524097}, {"56-grapheme_extend",939524097},{"56-graphemeextend",939524097},{"57-GraphemeLink",956301313}, {"57-Grapheme_Link",956301313},{"57-grapheme_link",956301313},{"57-graphemelink",956301313},{"58-HexDigit",973078529}, {"58-Hex_Digit",973078529},{"58-hex_digit",973078529},{"58-hexdigit",973078529},{"23-L",385875969},{"23-LV",385875972}, {"23-LVSyllable",385875972},{"23-LVT",385875973},{"23-LVTSyllable",385875973},{"23-LVT_Syllable",385875973}, {"23-LV_Syllable",385875972},{"23-LeadingJamo",385875969},{"23-Leading_Jamo",385875969},{"23-NA",385875968}, {"23-NotApplicable",385875968},{"23-Not_Applicable",385875968},{"23-T",385875971},{"23-TrailingJamo",385875971}, {"23-Trailing_Jamo",385875971},{"23-V",385875970},{"23-VowelJamo",385875970},{"23-Vowel_Jamo",385875970}, {"23-l",385875969},{"23-leading_jamo",385875969},{"23-leadingjamo",385875969},{"23-lv",385875972}, {"23-lv_syllable",385875972},{"23-lvsyllable",385875972},{"23-lvt",385875973},{"23-lvt_syllable",385875973}, {"23-lvtsyllable",385875973},{"23-na",385875968},{"23-not_applicable",385875968},{"23-notapplicable",385875968}, {"23-t",385875971},{"23-trailing_jamo",385875971},{"23-trailingjamo",385875971},{"23-v",385875970}, {"23-vowel_jamo",385875970},{"23-voweljamo",385875970},{"59-Hyphen",989855745},{"59-hyphen",989855745}, {"62-IDContinue",1040187393},{"62-ID_Continue",1040187393},{"62-id_continue",1040187393},{"62-idcontinue",1040187393}, {"64-Ideographic",1073741825},{"64-ideographic",1073741825},{"63-IDStart",1056964609},{"63-ID_Start",1056964609}, {"63-id_start",1056964609},{"63-idstart",1056964609},{"60-IDSBinaryOperator",1006632961}, {"60-IDS_Binary_Operator",1006632961},{"60-ids_binary_operator",1006632961},{"60-idsbinaryoperator",1006632961}, {"61-IDSTrinaryOperator",1023410177},{"61-IDS_Trinary_Operator",1023410177},{"61-ids_trinary_operator",1023410177}, {"61-idstrinaryoperator",1023410177},{"3-AfricanFeh",50331718},{"3-AfricanNoon",50331720},{"3-AfricanQaf",50331719}, {"3-African_Feh",50331718},{"3-African_Noon",50331720},{"3-African_Qaf",50331719},{"3-Ain",50331660}, {"3-Alaph",50331677},{"3-Alef",50331650},{"3-Beh",50331652},{"3-Beth",50331678},{"3-BurushaskiYehBarree",50331704}, {"3-Burushaski_Yeh_Barree",50331704},{"3-Dal",50331655},{"3-DalathRish",50331680},{"3-Dalath_Rish",50331680}, {"3-E",50331694},{"3-FarsiYeh",50331662},{"3-Farsi_Yeh",50331662},{"3-Fe",50331703},{"3-Feh",50331663}, {"3-FinalSemkath",50331693},{"3-Final_Semkath",50331693},{"3-Gaf",50331661},{"3-Gamal",50331679},{"3-Hah",50331654}, {"3-HamzaOnHehGoal",50331674},{"3-Hamza_On_Heh_Goal",50331674},{"3-He",50331681},{"3-Heh",50331669}, {"3-HehGoal",50331673},{"3-Heh_Goal",50331673},{"3-Heth",50331684},{"3-Kaf",50331665},{"3-Kaph",50331688}, {"3-Khaph",50331702},{"3-KnottedHeh",50331672},{"3-Knotted_Heh",50331672},{"3-Lam",50331666},{"3-Lamadh",50331689}, {"3-MalayalamBha",50331711},{"3-MalayalamJa",50331706},{"3-MalayalamLla",50331713},{"3-MalayalamLlla",50331714}, {"3-MalayalamNga",50331705},{"3-MalayalamNna",50331709},{"3-MalayalamNnna",50331710},{"3-MalayalamNya",50331707}, {"3-MalayalamRa",50331712},{"3-MalayalamSsa",50331715},{"3-MalayalamTta",50331708},{"3-Malayalam_Bha",50331711}, {"3-Malayalam_Ja",50331706},{"3-Malayalam_Lla",50331713},{"3-Malayalam_Llla",50331714},{"3-Malayalam_Nga",50331705}, {"3-Malayalam_Nna",50331709},{"3-Malayalam_Nnna",50331710},{"3-Malayalam_Nya",50331707},{"3-Malayalam_Ra",50331712}, {"3-Malayalam_Ssa",50331715},{"3-Malayalam_Tta",50331708},{"3-ManichaeanAleph",50331721},{"3-ManichaeanAyin",50331737}, {"3-ManichaeanBeth",50331722},{"3-ManichaeanDaleth",50331724},{"3-ManichaeanDhamedh",50331732}, {"3-ManichaeanFive",50331744},{"3-ManichaeanGimel",50331723},{"3-ManichaeanHeth",50331727}, {"3-ManichaeanHundred",50331747},{"3-ManichaeanKaph",50331730},{"3-ManichaeanLamedh",50331731}, {"3-ManichaeanMem",50331734},{"3-ManichaeanNun",50331735},{"3-ManichaeanOne",50331743},{"3-ManichaeanPe",50331738}, {"3-ManichaeanQoph",50331740},{"3-ManichaeanResh",50331741},{"3-ManichaeanSadhe",50331739}, {"3-ManichaeanSamekh",50331736},{"3-ManichaeanTaw",50331742},{"3-ManichaeanTen",50331745},{"3-ManichaeanTeth",50331728}, {"3-ManichaeanThamedh",50331733},{"3-ManichaeanTwenty",50331746},{"3-ManichaeanWaw",50331725}, {"3-ManichaeanYodh",50331729},{"3-ManichaeanZayin",50331726},{"3-Manichaean_Aleph",50331721}, {"3-Manichaean_Ayin",50331737},{"3-Manichaean_Beth",50331722},{"3-Manichaean_Daleth",50331724}, {"3-Manichaean_Dhamedh",50331732},{"3-Manichaean_Five",50331744},{"3-Manichaean_Gimel",50331723}, {"3-Manichaean_Heth",50331727},{"3-Manichaean_Hundred",50331747},{"3-Manichaean_Kaph",50331730}, {"3-Manichaean_Lamedh",50331731},{"3-Manichaean_Mem",50331734},{"3-Manichaean_Nun",50331735}, {"3-Manichaean_One",50331743},{"3-Manichaean_Pe",50331738},{"3-Manichaean_Qoph",50331740},{"3-Manichaean_Resh",50331741}, {"3-Manichaean_Sadhe",50331739},{"3-Manichaean_Samekh",50331736},{"3-Manichaean_Taw",50331742}, {"3-Manichaean_Ten",50331745},{"3-Manichaean_Teth",50331728},{"3-Manichaean_Thamedh",50331733}, {"3-Manichaean_Twenty",50331746},{"3-Manichaean_Waw",50331725},{"3-Manichaean_Yodh",50331729}, {"3-Manichaean_Zayin",50331726},{"3-Meem",50331667},{"3-Mim",50331690},{"3-NoJoiningGroup",50331648}, {"3-No_Joining_Group",50331648},{"3-Noon",50331668},{"3-Nun",50331691},{"3-Nya",50331671},{"3-Pe",50331695}, {"3-Qaf",50331664},{"3-Qaph",50331698},{"3-Reh",50331656},{"3-ReversedPe",50331696},{"3-Reversed_Pe",50331696}, {"3-RohingyaYeh",50331716},{"3-Rohingya_Yeh",50331716},{"3-Sad",50331658},{"3-Sadhe",50331697},{"3-Seen",50331657}, {"3-Semkath",50331692},{"3-Shin",50331699},{"3-StraightWaw",50331717},{"3-Straight_Waw",50331717}, {"3-SwashKaf",50331670},{"3-Swash_Kaf",50331670},{"3-SyriacWaw",50331682},{"3-Syriac_Waw",50331682},{"3-Tah",50331659}, {"3-Taw",50331700},{"3-TehMarbuta",50331653},{"3-TehMarbutaGoal",50331674},{"3-Teh_Marbuta",50331653}, {"3-Teh_Marbuta_Goal",50331674},{"3-Teth",50331685},{"3-Waw",50331651},{"3-Yeh",50331649},{"3-YehBarree",50331676}, {"3-YehWithTail",50331675},{"3-Yeh_Barree",50331676},{"3-Yeh_With_Tail",50331675},{"3-Yudh",50331686}, {"3-YudhHe",50331687},{"3-Yudh_He",50331687},{"3-Zain",50331683},{"3-Zhain",50331701},{"3-african_feh",50331718}, {"3-african_noon",50331720},{"3-african_qaf",50331719},{"3-africanfeh",50331718},{"3-africannoon",50331720}, {"3-africanqaf",50331719},{"3-ain",50331660},{"3-alaph",50331677},{"3-alef",50331650},{"3-beh",50331652}, {"3-beth",50331678},{"3-burushaski_yeh_barree",50331704},{"3-burushaskiyehbarree",50331704},{"3-dal",50331655}, {"3-dalath_rish",50331680},{"3-dalathrish",50331680},{"3-e",50331694},{"3-farsi_yeh",50331662},{"3-farsiyeh",50331662}, {"3-fe",50331703},{"3-feh",50331663},{"3-final_semkath",50331693},{"3-finalsemkath",50331693},{"3-gaf",50331661}, {"3-gamal",50331679},{"3-hah",50331654},{"3-hamza_on_heh_goal",50331674},{"3-hamzaonhehgoal",50331674},{"3-he",50331681}, {"3-heh",50331669},{"3-heh_goal",50331673},{"3-hehgoal",50331673},{"3-heth",50331684},{"3-kaf",50331665}, {"3-kaph",50331688},{"3-khaph",50331702},{"3-knotted_heh",50331672},{"3-knottedheh",50331672},{"3-lam",50331666}, {"3-lamadh",50331689},{"3-malayalam_bha",50331711},{"3-malayalam_ja",50331706},{"3-malayalam_lla",50331713}, {"3-malayalam_llla",50331714},{"3-malayalam_nga",50331705},{"3-malayalam_nna",50331709},{"3-malayalam_nnna",50331710}, {"3-malayalam_nya",50331707},{"3-malayalam_ra",50331712},{"3-malayalam_ssa",50331715},{"3-malayalam_tta",50331708}, {"3-malayalambha",50331711},{"3-malayalamja",50331706},{"3-malayalamlla",50331713},{"3-malayalamllla",50331714}, {"3-malayalamnga",50331705},{"3-malayalamnna",50331709},{"3-malayalamnnna",50331710},{"3-malayalamnya",50331707}, {"3-malayalamra",50331712},{"3-malayalamssa",50331715},{"3-malayalamtta",50331708},{"3-manichaean_aleph",50331721}, {"3-manichaean_ayin",50331737},{"3-manichaean_beth",50331722},{"3-manichaean_daleth",50331724}, {"3-manichaean_dhamedh",50331732},{"3-manichaean_five",50331744},{"3-manichaean_gimel",50331723}, {"3-manichaean_heth",50331727},{"3-manichaean_hundred",50331747},{"3-manichaean_kaph",50331730}, {"3-manichaean_lamedh",50331731},{"3-manichaean_mem",50331734},{"3-manichaean_nun",50331735}, {"3-manichaean_one",50331743},{"3-manichaean_pe",50331738},{"3-manichaean_qoph",50331740},{"3-manichaean_resh",50331741}, {"3-manichaean_sadhe",50331739},{"3-manichaean_samekh",50331736},{"3-manichaean_taw",50331742}, {"3-manichaean_ten",50331745},{"3-manichaean_teth",50331728},{"3-manichaean_thamedh",50331733}, {"3-manichaean_twenty",50331746},{"3-manichaean_waw",50331725},{"3-manichaean_yodh",50331729}, {"3-manichaean_zayin",50331726},{"3-manichaeanaleph",50331721},{"3-manichaeanayin",50331737}, {"3-manichaeanbeth",50331722},{"3-manichaeandaleth",50331724},{"3-manichaeandhamedh",50331732}, {"3-manichaeanfive",50331744},{"3-manichaeangimel",50331723},{"3-manichaeanheth",50331727}, {"3-manichaeanhundred",50331747},{"3-manichaeankaph",50331730},{"3-manichaeanlamedh",50331731}, {"3-manichaeanmem",50331734},{"3-manichaeannun",50331735},{"3-manichaeanone",50331743},{"3-manichaeanpe",50331738}, {"3-manichaeanqoph",50331740},{"3-manichaeanresh",50331741},{"3-manichaeansadhe",50331739}, {"3-manichaeansamekh",50331736},{"3-manichaeantaw",50331742},{"3-manichaeanten",50331745},{"3-manichaeanteth",50331728}, {"3-manichaeanthamedh",50331733},{"3-manichaeantwenty",50331746},{"3-manichaeanwaw",50331725}, {"3-manichaeanyodh",50331729},{"3-manichaeanzayin",50331726},{"3-meem",50331667},{"3-mim",50331690}, {"3-no_joining_group",50331648},{"3-nojoininggroup",50331648},{"3-noon",50331668},{"3-nun",50331691},{"3-nya",50331671}, {"3-pe",50331695},{"3-qaf",50331664},{"3-qaph",50331698},{"3-reh",50331656},{"3-reversed_pe",50331696}, {"3-reversedpe",50331696},{"3-rohingya_yeh",50331716},{"3-rohingyayeh",50331716},{"3-sad",50331658},{"3-sadhe",50331697}, {"3-seen",50331657},{"3-semkath",50331692},{"3-shin",50331699},{"3-straight_waw",50331717},{"3-straightwaw",50331717}, {"3-swash_kaf",50331670},{"3-swashkaf",50331670},{"3-syriac_waw",50331682},{"3-syriacwaw",50331682},{"3-tah",50331659}, {"3-taw",50331700},{"3-teh_marbuta",50331653},{"3-teh_marbuta_goal",50331674},{"3-tehmarbuta",50331653}, {"3-tehmarbutagoal",50331674},{"3-teth",50331685},{"3-waw",50331651},{"3-yeh",50331649},{"3-yeh_barree",50331676}, {"3-yeh_with_tail",50331675},{"3-yehbarree",50331676},{"3-yehwithtail",50331675},{"3-yudh",50331686}, {"3-yudh_he",50331687},{"3-yudhhe",50331687},{"3-zain",50331683},{"3-zhain",50331701},{"65-JoinControl",1090519041}, {"65-Join_Control",1090519041},{"65-join_control",1090519041},{"65-joincontrol",1090519041},{"24-C",402653187}, {"24-D",402653185},{"24-DualJoining",402653185},{"24-Dual_Joining",402653185},{"24-JoinCausing",402653187}, {"24-Join_Causing",402653187},{"24-L",402653189},{"24-LeftJoining",402653189},{"24-Left_Joining",402653189}, {"24-NonJoining",402653184},{"24-Non_Joining",402653184},{"24-R",402653186},{"24-RightJoining",402653186}, {"24-Right_Joining",402653186},{"24-T",402653188},{"24-Transparent",402653188},{"24-U",402653184},{"24-c",402653187}, {"24-d",402653185},{"24-dual_joining",402653185},{"24-dualjoining",402653185},{"24-join_causing",402653187}, {"24-joincausing",402653187},{"24-l",402653189},{"24-left_joining",402653189},{"24-leftjoining",402653189}, {"24-non_joining",402653184},{"24-nonjoining",402653184},{"24-r",402653186},{"24-right_joining",402653186}, {"24-rightjoining",402653186},{"24-t",402653188},{"24-transparent",402653188},{"24-u",402653184},{"14-AI",234881045}, {"14-AL",234881033},{"14-Alphabetic",234881033},{"14-Ambiguous",234881045},{"14-B2",234881055},{"14-BA",234881026}, {"14-BB",234881046},{"14-BK",234881028},{"14-BreakAfter",234881026},{"14-BreakBefore",234881046}, {"14-BreakBoth",234881055},{"14-BreakSymbols",234881040},{"14-Break_After",234881026},{"14-Break_Before",234881046}, {"14-Break_Both",234881055},{"14-Break_Symbols",234881040},{"14-CB",234881064},{"14-CJ",234881060},{"14-CL",234881042}, {"14-CM",234881025},{"14-CP",234881037},{"14-CR",234881029},{"14-CarriageReturn",234881029}, {"14-Carriage_Return",234881029},{"14-CloseParenthesis",234881037},{"14-ClosePunctuation",234881042}, {"14-Close_Parenthesis",234881037},{"14-Close_Punctuation",234881042},{"14-CombiningMark",234881025}, {"14-Combining_Mark",234881025},{"14-ComplexContext",234881048},{"14-Complex_Context",234881048}, {"14-ConditionalJapaneseStarter",234881060},{"14-Conditional_Japanese_Starter",234881060}, {"14-ContingentBreak",234881064},{"14-Contingent_Break",234881064},{"14-EB",234881059},{"14-EBase",234881059}, {"14-EM",234881066},{"14-EModifier",234881066},{"14-EX",234881031},{"14-E_Base",234881059},{"14-E_Modifier",234881066}, {"14-Exclamation",234881031},{"14-GL",234881044},{"14-Glue",234881044},{"14-H2",234881061},{"14-H3",234881062}, {"14-HL",234881047},{"14-HY",234881039},{"14-HebrewLetter",234881047},{"14-Hebrew_Letter",234881047}, {"14-Hyphen",234881039},{"14-ID",234881058},{"14-IN",234881056},{"14-IS",234881038},{"14-Ideographic",234881058}, {"14-InfixNumeric",234881038},{"14-Infix_Numeric",234881038},{"14-Inseparable",234881056},{"14-Inseperable",234881056}, {"14-JL",234881049},{"14-JT",234881051},{"14-JV",234881050},{"14-LF",234881027},{"14-LineFeed",234881027}, {"14-Line_Feed",234881027},{"14-MandatoryBreak",234881028},{"14-Mandatory_Break",234881028},{"14-NL",234881043}, {"14-NS",234881052},{"14-NU",234881041},{"14-NextLine",234881043},{"14-Next_Line",234881043},{"14-Nonstarter",234881052}, {"14-Numeric",234881041},{"14-OP",234881036},{"14-OpenPunctuation",234881036},{"14-Open_Punctuation",234881036}, {"14-PO",234881035},{"14-PR",234881034},{"14-PostfixNumeric",234881035},{"14-Postfix_Numeric",234881035}, {"14-PrefixNumeric",234881034},{"14-Prefix_Numeric",234881034},{"14-QU",234881032},{"14-Quotation",234881032}, {"14-RI",234881065},{"14-RegionalIndicator",234881065},{"14-Regional_Indicator",234881065},{"14-SA",234881048}, {"14-SG",234881063},{"14-SP",234881030},{"14-SY",234881040},{"14-Space",234881030},{"14-Surrogate",234881063}, {"14-Unknown",234881024},{"14-WJ",234881057},{"14-WordJoiner",234881057},{"14-Word_Joiner",234881057}, {"14-XX",234881024},{"14-ZW",234881053},{"14-ZWJ",234881054},{"14-ZWSpace",234881053},{"14-ai",234881045}, {"14-al",234881033},{"14-alphabetic",234881033},{"14-ambiguous",234881045},{"14-b2",234881055},{"14-ba",234881026}, {"14-bb",234881046},{"14-bk",234881028},{"14-break_after",234881026},{"14-break_before",234881046}, {"14-break_both",234881055},{"14-break_symbols",234881040},{"14-breakafter",234881026},{"14-breakbefore",234881046}, {"14-breakboth",234881055},{"14-breaksymbols",234881040},{"14-carriage_return",234881029}, {"14-carriagereturn",234881029},{"14-cb",234881064},{"14-cj",234881060},{"14-cl",234881042}, {"14-close_parenthesis",234881037},{"14-close_punctuation",234881042},{"14-closeparenthesis",234881037}, {"14-closepunctuation",234881042},{"14-cm",234881025},{"14-combining_mark",234881025},{"14-combiningmark",234881025}, {"14-complex_context",234881048},{"14-complexcontext",234881048},{"14-conditional_japanese_starter",234881060}, {"14-conditionaljapanesestarter",234881060},{"14-contingent_break",234881064},{"14-contingentbreak",234881064}, {"14-cp",234881037},{"14-cr",234881029},{"14-e_base",234881059},{"14-e_modifier",234881066},{"14-eb",234881059}, {"14-ebase",234881059},{"14-em",234881066},{"14-emodifier",234881066},{"14-ex",234881031},{"14-exclamation",234881031}, {"14-gl",234881044},{"14-glue",234881044},{"14-h2",234881061},{"14-h3",234881062},{"14-hebrew_letter",234881047}, {"14-hebrewletter",234881047},{"14-hl",234881047},{"14-hy",234881039},{"14-hyphen",234881039},{"14-id",234881058}, {"14-ideographic",234881058},{"14-in",234881056},{"14-infix_numeric",234881038},{"14-infixnumeric",234881038}, {"14-inseparable",234881056},{"14-inseperable",234881056},{"14-is",234881038},{"14-jl",234881049},{"14-jt",234881051}, {"14-jv",234881050},{"14-lf",234881027},{"14-line_feed",234881027},{"14-linefeed",234881027}, {"14-mandatory_break",234881028},{"14-mandatorybreak",234881028},{"14-next_line",234881043},{"14-nextline",234881043}, {"14-nl",234881043},{"14-nonstarter",234881052},{"14-ns",234881052},{"14-nu",234881041},{"14-numeric",234881041}, {"14-op",234881036},{"14-open_punctuation",234881036},{"14-openpunctuation",234881036},{"14-po",234881035}, {"14-postfix_numeric",234881035},{"14-postfixnumeric",234881035},{"14-pr",234881034},{"14-prefix_numeric",234881034}, {"14-prefixnumeric",234881034},{"14-qu",234881032},{"14-quotation",234881032},{"14-regional_indicator",234881065}, {"14-regionalindicator",234881065},{"14-ri",234881065},{"14-sa",234881048},{"14-sg",234881063},{"14-sp",234881030}, {"14-space",234881030},{"14-surrogate",234881063},{"14-sy",234881040},{"14-unknown",234881024},{"14-wj",234881057}, {"14-word_joiner",234881057},{"14-wordjoiner",234881057},{"14-xx",234881024},{"14-zw",234881053},{"14-zwj",234881054}, {"14-zwspace",234881053},{"68-LogicalOrderException",1140850689},{"68-Logical_Order_Exception",1140850689}, {"68-logical_order_exception",1140850689},{"68-logicalorderexception",1140850689},{"69-Lowercase",1157627905}, {"69-lowercase",1157627905},{"73-Math",1224736769},{"73-math",1224736769},{"79-NoncharacterCodePoint",1325400065}, {"79-Noncharacter_Code_Point",1325400065},{"79-noncharacter_code_point",1325400065}, {"79-noncharactercodepoint",1325400065},{"12-NFCQuickCheck",201326593},{"12-NFC_Quick_Check",201326593}, {"12-nfc_quick_check",201326593},{"12-nfcquickcheck",201326593},{"77-NFDQuickCheck",1291845633}, {"77-NFD_Quick_Check",1291845633},{"77-nfd_quick_check",1291845633},{"77-nfdquickcheck",1291845633}, {"26-NFKCQuickCheck",436207617},{"26-NFKC_Quick_Check",436207617},{"26-nfkc_quick_check",436207617}, {"26-nfkcquickcheck",436207617},{"78-NFKDQuickCheck",1308622849},{"78-NFKD_Quick_Check",1308622849}, {"78-nfkd_quick_check",1308622849},{"78-nfkdquickcheck",1308622849},{"27-De",452984835},{"27-Decimal",452984835}, {"27-Di",452984834},{"27-Digit",452984834},{"27-None",452984832},{"27-Nu",452984833},{"27-Numeric",452984833}, {"27-de",452984835},{"27-decimal",452984835},{"27-di",452984834},{"27-digit",452984834},{"27-none",452984832}, {"27-nu",452984833},{"27-numeric",452984833},{"80-OtherAlphabetic",1342177281},{"80-Other_Alphabetic",1342177281}, {"80-other_alphabetic",1342177281},{"80-otheralphabetic",1342177281},{"81-OtherDefaultIgnorableCodePoint",1358954497}, {"81-Other_Default_Ignorable_Code_Point",1358954497},{"81-other_default_ignorable_code_point",1358954497}, {"81-otherdefaultignorablecodepoint",1358954497},{"82-OtherGraphemeExtend",1375731713}, {"82-Other_Grapheme_Extend",1375731713},{"82-other_grapheme_extend",1375731713},{"82-othergraphemeextend",1375731713}, {"83-OtherIDContinue",1392508929},{"83-Other_ID_Continue",1392508929},{"83-other_id_continue",1392508929}, {"83-otheridcontinue",1392508929},{"84-OtherIDStart",1409286145},{"84-Other_ID_Start",1409286145}, {"84-other_id_start",1409286145},{"84-otheridstart",1409286145},{"85-OtherLowercase",1426063361}, {"85-Other_Lowercase",1426063361},{"85-other_lowercase",1426063361},{"85-otherlowercase",1426063361}, {"86-OtherMath",1442840577},{"86-Other_Math",1442840577},{"86-other_math",1442840577},{"86-othermath",1442840577}, {"87-OtherUppercase",1459617793},{"87-Other_Uppercase",1459617793},{"87-other_uppercase",1459617793}, {"87-otheruppercase",1459617793},{"89-PatternSyntax",1493172225},{"89-Pattern_Syntax",1493172225}, {"89-pattern_syntax",1493172225},{"89-patternsyntax",1493172225},{"90-PatternWhiteSpace",1509949441}, {"90-Pattern_White_Space",1509949441},{"90-pattern_white_space",1509949441},{"90-patternwhitespace",1509949441}, {"91-PrependedConcatenationMark",1526726657},{"91-Prepended_Concatenation_Mark",1526726657}, {"91-prepended_concatenation_mark",1526726657},{"91-prependedconcatenationmark",1526726657}, {"92-QuotationMark",1543503873},{"92-Quotation_Mark",1543503873},{"92-quotation_mark",1543503873}, {"92-quotationmark",1543503873},{"93-Radical",1560281089},{"93-radical",1560281089},{"94-RegionalIndicator",1577058305}, {"94-Regional_Indicator",1577058305},{"94-regional_indicator",1577058305},{"94-regionalindicator",1577058305}, {"97-SoftDotted",1627389953},{"97-Soft_Dotted",1627389953},{"97-soft_dotted",1627389953},{"97-softdotted",1627389953}, {"96-SentenceTerminal",1610612737},{"96-Sentence_Terminal",1610612737},{"96-sentence_terminal",1610612737}, {"96-sentenceterminal",1610612737},{"98-TerminalPunctuation",1644167169},{"98-Terminal_Punctuation",1644167169}, {"98-terminal_punctuation",1644167169},{"98-terminalpunctuation",1644167169},{"99-UnifiedIdeograph",1660944385}, {"99-Unified_Ideograph",1660944385},{"99-unified_ideograph",1660944385},{"99-unifiedideograph",1660944385}, {"100-Uppercase",1677721601},{"100-uppercase",1677721601},{"101-VariationSelector",1694498817}, {"101-Variation_Selector",1694498817},{"101-variation_selector",1694498817},{"101-variationselector",1694498817}, {"102-WhiteSpace",1711276033},{"102-White_Space",1711276033},{"102-white_space",1711276033}, {"102-whitespace",1711276033},{"103-XIDContinue",1728053249},{"103-XID_Continue",1728053249}, {"103-xid_continue",1728053249},{"103-xidcontinue",1728053249},{"104-XIDStart",1744830465},{"104-XID_Start",1744830465}, {"104-xid_start",1744830465},{"104-xidstart",1744830465} }; static const char *Decomp_Spec_enums[5723] = { "", "0020", "0020 0308", "0061", "0020 0304", "0032", "0033", "0020 0301", "03BC", "0020 0327", "0031", "006F", "0031 2044 0034", "0031 2044 0032", "0033 2044 0034", "0041 0300", "0041 0301", "0041 0302", "0041 0303", "0041 0308", "0041 030A", "0043 0327", "0045 0300", "0045 0301", "0045 0302", "0045 0308", "0049 0300", "0049 0301", "0049 0302", "0049 0308", "004E 0303", "004F 0300", "004F 0301", "004F 0302", "004F 0303", "004F 0308", "0055 0300", "0055 0301", "0055 0302", "0055 0308", "0059 0301", "0061 0300", "0061 0301", "0061 0302", "0061 0303", "0061 0308", "0061 030A", "0063 0327", "0065 0300", "0065 0301", "0065 0302", "0065 0308", "0069 0300", "0069 0301", "0069 0302", "0069 0308", "006E 0303", "006F 0300", "006F 0301", "006F 0302", "006F 0303", "006F 0308", "0075 0300", "0075 0301", "0075 0302", "0075 0308", "0079 0301", "0079 0308", "0041 0304", "0061 0304", "0041 0306", "0061 0306", "0041 0328", "0061 0328", "0043 0301", "0063 0301", "0043 0302", "0063 0302", "0043 0307", "0063 0307", "0043 030C", "0063 030C", "0044 030C", "0064 030C", "0045 0304", "0065 0304", "0045 0306", "0065 0306", "0045 0307", "0065 0307", "0045 0328", "0065 0328", "0045 030C", "0065 030C", "0047 0302", "0067 0302", "0047 0306", "0067 0306", "0047 0307", "0067 0307", "0047 0327", "0067 0327", "0048 0302", "0068 0302", "0049 0303", "0069 0303", "0049 0304", "0069 0304", "0049 0306", "0069 0306", "0049 0328", "0069 0328", "0049 0307", "0049 004A", "0069 006A", "004A 0302", "006A 0302", "004B 0327", "006B 0327", "004C 0301", "006C 0301", "004C 0327", "006C 0327", "004C 030C", "006C 030C", "004C 00B7", "006C 00B7", "004E 0301", "006E 0301", "004E 0327", "006E 0327", "004E 030C", "006E 030C", "02BC 006E", "004F 0304", "006F 0304", "004F 0306", "006F 0306", "004F 030B", "006F 030B", "0052 0301", "0072 0301", "0052 0327", "0072 0327", "0052 030C", "0072 030C", "0053 0301", "0073 0301", "0053 0302", "0073 0302", "0053 0327", "0073 0327", "0053 030C", "0073 030C", "0054 0327", "0074 0327", "0054 030C", "0074 030C", "0055 0303", "0075 0303", "0055 0304", "0075 0304", "0055 0306", "0075 0306", "0055 030A", "0075 030A", "0055 030B", "0075 030B", "0055 0328", "0075 0328", "0057 0302", "0077 0302", "0059 0302", "0079 0302", "0059 0308", "005A 0301", "007A 0301", "005A 0307", "007A 0307", "005A 030C", "007A 030C", "0073", "004F 031B", "006F 031B", "0055 031B", "0075 031B", "0044 017D", "0044 017E", "0064 017E", "004C 004A", "004C 006A", "006C 006A", "004E 004A", "004E 006A", "006E 006A", "0041 030C", "0061 030C", "0049 030C", "0069 030C", "004F 030C", "006F 030C", "0055 030C", "0075 030C", "00DC 0304", "00FC 0304", "00DC 0301", "00FC 0301", "00DC 030C", "00FC 030C", "00DC 0300", "00FC 0300", "00C4 0304", "00E4 0304", "0226 0304", "0227 0304", "00C6 0304", "00E6 0304", "0047 030C", "0067 030C", "004B 030C", "006B 030C", "004F 0328", "006F 0328", "01EA 0304", "01EB 0304", "01B7 030C", "0292 030C", "006A 030C", "0044 005A", "0044 007A", "0064 007A", "0047 0301", "0067 0301", "004E 0300", "006E 0300", "00C5 0301", "00E5 0301", "00C6 0301", "00E6 0301", "00D8 0301", "00F8 0301", "0041 030F", "0061 030F", "0041 0311", "0061 0311", "0045 030F", "0065 030F", "0045 0311", "0065 0311", "0049 030F", "0069 030F", "0049 0311", "0069 0311", "004F 030F", "006F 030F", "004F 0311", "006F 0311", "0052 030F", "0072 030F", "0052 0311", "0072 0311", "0055 030F", "0075 030F", "0055 0311", "0075 0311", "0053 0326", "0073 0326", "0054 0326", "0074 0326", "0048 030C", "0068 030C", "0041 0307", "0061 0307", "0045 0327", "0065 0327", "00D6 0304", "00F6 0304", "00D5 0304", "00F5 0304", "004F 0307", "006F 0307", "022E 0304", "022F 0304", "0059 0304", "0079 0304", "0068", "0266", "006A", "0072", "0279", "027B", "0281", "0077", "0079", "0020 0306", "0020 0307", "0020 030A", "0020 0328", "0020 0303", "0020 030B", "0263", "006C", "0073", "0078", "0295", "0300", "0301", "0313", "0308 0301", "02B9", "0020 0345", "003B", "0020 0301", "00A8 0301", "0391 0301", "00B7", "0395 0301", "0397 0301", "0399 0301", "039F 0301", "03A5 0301", "03A9 0301", "03CA 0301", "0399 0308", "03A5 0308", "03B1 0301", "03B5 0301", "03B7 0301", "03B9 0301", "03CB 0301", "03B9 0308", "03C5 0308", "03BF 0301", "03C5 0301", "03C9 0301", "03B2", "03B8", "03A5", "03D2 0301", "03D2 0308", "03C6", "03C0", "03BA", "03C1", "03C2", "0398", "03B5", "03A3", "0415 0300", "0415 0308", "0413 0301", "0406 0308", "041A 0301", "0418 0300", "0423 0306", "0418 0306", "0438 0306", "0435 0300", "0435 0308", "0433 0301", "0456 0308", "043A 0301", "0438 0300", "0443 0306", "0474 030F", "0475 030F", "0416 0306", "0436 0306", "0410 0306", "0430 0306", "0410 0308", "0430 0308", "0415 0306", "0435 0306", "04D8 0308", "04D9 0308", "0416 0308", "0436 0308", "0417 0308", "0437 0308", "0418 0304", "0438 0304", "0418 0308", "0438 0308", "041E 0308", "043E 0308", "04E8 0308", "04E9 0308", "042D 0308", "044D 0308", "0423 0304", "0443 0304", "0423 0308", "0443 0308", "0423 030B", "0443 030B", "0427 0308", "0447 0308", "042B 0308", "044B 0308", "0565 0582", "0627 0653", "0627 0654", "0648 0654", "0627 0655", "064A 0654", "0627 0674", "0648 0674", "06C7 0674", "064A 0674", "06D5 0654", "06C1 0654", "06D2 0654", "0928 093C", "0930 093C", "0933 093C", "0915 093C", "0916 093C", "0917 093C", "091C 093C", "0921 093C", "0922 093C", "092B 093C", "092F 093C", "09C7 09BE", "09C7 09D7", "09A1 09BC", "09A2 09BC", "09AF 09BC", "0A32 0A3C", "0A38 0A3C", "0A16 0A3C", "0A17 0A3C", "0A1C 0A3C", "0A2B 0A3C", "0B47 0B56", "0B47 0B3E", "0B47 0B57", "0B21 0B3C", "0B22 0B3C", "0B92 0BD7", "0BC6 0BBE", "0BC7 0BBE", "0BC6 0BD7", "0C46 0C56", "0CBF 0CD5", "0CC6 0CD5", "0CC6 0CD6", "0CC6 0CC2", "0CCA 0CD5", "0D46 0D3E", "0D47 0D3E", "0D46 0D57", "0DD9 0DCA", "0DD9 0DCF", "0DDC 0DCA", "0DD9 0DDF", "0E4D 0E32", "0ECD 0EB2", "0EAB 0E99", "0EAB 0EA1", "0F0B", "0F42 0FB7", "0F4C 0FB7", "0F51 0FB7", "0F56 0FB7", "0F5B 0FB7", "0F40 0FB5", "0F71 0F72", "0F71 0F74", "0FB2 0F80", "0FB2 0F81", "0FB3 0F80", "0FB3 0F81", "0F71 0F80", "0F92 0FB7", "0F9C 0FB7", "0FA1 0FB7", "0FA6 0FB7", "0FAB 0FB7", "0F90 0FB5", "1025 102E", "10DC", "1B05 1B35", "1B07 1B35", "1B09 1B35", "1B0B 1B35", "1B0D 1B35", "1B11 1B35", "1B3A 1B35", "1B3C 1B35", "1B3E 1B35", "1B3F 1B35", "1B42 1B35", "0041", "00C6", "0042", "0044", "0045", "018E", "0047", "0048", "0049", "004A", "004B", "004C", "004D", "004E", "004F", "0222", "0050", "0052", "0054", "0055", "0057", "0061", "0250", "0251", "1D02", "0062", "0064", "0065", "0259", "025B", "025C", "0067", "006B", "006D", "014B", "006F", "0254", "1D16", "1D17", "0070", "0074", "0075", "1D1D", "026F", "0076", "1D25", "03B2", "03B3", "03B4", "03C6", "03C7", "0069", "0072", "0075", "0076", "03B2", "03B3", "03C1", "03C6", "03C7", "043D", "0252", "0063", "0255", "00F0", "025C", "0066", "025F", "0261", "0265", "0268", "0269", "026A", "1D7B", "029D", "026D", "1D85", "029F", "0271", "0270", "0272", "0273", "0274", "0275", "0278", "0282", "0283", "01AB", "0289", "028A", "1D1C", "028B", "028C", "007A", "0290", "0291", "0292", "03B8", "0041 0325", "0061 0325", "0042 0307", "0062 0307", "0042 0323", "0062 0323", "0042 0331", "0062 0331", "00C7 0301", "00E7 0301", "0044 0307", "0064 0307", "0044 0323", "0064 0323", "0044 0331", "0064 0331", "0044 0327", "0064 0327", "0044 032D", "0064 032D", "0112 0300", "0113 0300", "0112 0301", "0113 0301", "0045 032D", "0065 032D", "0045 0330", "0065 0330", "0228 0306", "0229 0306", "0046 0307", "0066 0307", "0047 0304", "0067 0304", "0048 0307", "0068 0307", "0048 0323", "0068 0323", "0048 0308", "0068 0308", "0048 0327", "0068 0327", "0048 032E", "0068 032E", "0049 0330", "0069 0330", "00CF 0301", "00EF 0301", "004B 0301", "006B 0301", "004B 0323", "006B 0323", "004B 0331", "006B 0331", "004C 0323", "006C 0323", "1E36 0304", "1E37 0304", "004C 0331", "006C 0331", "004C 032D", "006C 032D", "004D 0301", "006D 0301", "004D 0307", "006D 0307", "004D 0323", "006D 0323", "004E 0307", "006E 0307", "004E 0323", "006E 0323", "004E 0331", "006E 0331", "004E 032D", "006E 032D", "00D5 0301", "00F5 0301", "00D5 0308", "00F5 0308", "014C 0300", "014D 0300", "014C 0301", "014D 0301", "0050 0301", "0070 0301", "0050 0307", "0070 0307", "0052 0307", "0072 0307", "0052 0323", "0072 0323", "1E5A 0304", "1E5B 0304", "0052 0331", "0072 0331", "0053 0307", "0073 0307", "0053 0323", "0073 0323", "015A 0307", "015B 0307", "0160 0307", "0161 0307", "1E62 0307", "1E63 0307", "0054 0307", "0074 0307", "0054 0323", "0074 0323", "0054 0331", "0074 0331", "0054 032D", "0074 032D", "0055 0324", "0075 0324", "0055 0330", "0075 0330", "0055 032D", "0075 032D", "0168 0301", "0169 0301", "016A 0308", "016B 0308", "0056 0303", "0076 0303", "0056 0323", "0076 0323", "0057 0300", "0077 0300", "0057 0301", "0077 0301", "0057 0308", "0077 0308", "0057 0307", "0077 0307", "0057 0323", "0077 0323", "0058 0307", "0078 0307", "0058 0308", "0078 0308", "0059 0307", "0079 0307", "005A 0302", "007A 0302", "005A 0323", "007A 0323", "005A 0331", "007A 0331", "0068 0331", "0074 0308", "0077 030A", "0079 030A", "0061 02BE", "017F 0307", "0041 0323", "0061 0323", "0041 0309", "0061 0309", "00C2 0301", "00E2 0301", "00C2 0300", "00E2 0300", "00C2 0309", "00E2 0309", "00C2 0303", "00E2 0303", "1EA0 0302", "1EA1 0302", "0102 0301", "0103 0301", "0102 0300", "0103 0300", "0102 0309", "0103 0309", "0102 0303", "0103 0303", "1EA0 0306", "1EA1 0306", "0045 0323", "0065 0323", "0045 0309", "0065 0309", "0045 0303", "0065 0303", "00CA 0301", "00EA 0301", "00CA 0300", "00EA 0300", "00CA 0309", "00EA 0309", "00CA 0303", "00EA 0303", "1EB8 0302", "1EB9 0302", "0049 0309", "0069 0309", "0049 0323", "0069 0323", "004F 0323", "006F 0323", "004F 0309", "006F 0309", "00D4 0301", "00F4 0301", "00D4 0300", "00F4 0300", "00D4 0309", "00F4 0309", "00D4 0303", "00F4 0303", "1ECC 0302", "1ECD 0302", "01A0 0301", "01A1 0301", "01A0 0300", "01A1 0300", "01A0 0309", "01A1 0309", "01A0 0303", "01A1 0303", "01A0 0323", "01A1 0323", "0055 0323", "0075 0323", "0055 0309", "0075 0309", "01AF 0301", "01B0 0301", "01AF 0300", "01B0 0300", "01AF 0309", "01B0 0309", "01AF 0303", "01B0 0303", "01AF 0323", "01B0 0323", "0059 0300", "0079 0300", "0059 0323", "0079 0323", "0059 0309", "0079 0309", "0059 0303", "0079 0303", "03B1 0313", "03B1 0314", "1F00 0300", "1F01 0300", "1F00 0301", "1F01 0301", "1F00 0342", "1F01 0342", "0391 0313", "0391 0314", "1F08 0300", "1F09 0300", "1F08 0301", "1F09 0301", "1F08 0342", "1F09 0342", "03B5 0313", "03B5 0314", "1F10 0300", "1F11 0300", "1F10 0301", "1F11 0301", "0395 0313", "0395 0314", "1F18 0300", "1F19 0300", "1F18 0301", "1F19 0301", "03B7 0313", "03B7 0314", "1F20 0300", "1F21 0300", "1F20 0301", "1F21 0301", "1F20 0342", "1F21 0342", "0397 0313", "0397 0314", "1F28 0300", "1F29 0300", "1F28 0301", "1F29 0301", "1F28 0342", "1F29 0342", "03B9 0313", "03B9 0314", "1F30 0300", "1F31 0300", "1F30 0301", "1F31 0301", "1F30 0342", "1F31 0342", "0399 0313", "0399 0314", "1F38 0300", "1F39 0300", "1F38 0301", "1F39 0301", "1F38 0342", "1F39 0342", "03BF 0313", "03BF 0314", "1F40 0300", "1F41 0300", "1F40 0301", "1F41 0301", "039F 0313", "039F 0314", "1F48 0300", "1F49 0300", "1F48 0301", "1F49 0301", "03C5 0313", "03C5 0314", "1F50 0300", "1F51 0300", "1F50 0301", "1F51 0301", "1F50 0342", "1F51 0342", "03A5 0314", "1F59 0300", "1F59 0301", "1F59 0342", "03C9 0313", "03C9 0314", "1F60 0300", "1F61 0300", "1F60 0301", "1F61 0301", "1F60 0342", "1F61 0342", "03A9 0313", "03A9 0314", "1F68 0300", "1F69 0300", "1F68 0301", "1F69 0301", "1F68 0342", "1F69 0342", "03B1 0300", "03AC", "03B5 0300", "03AD", "03B7 0300", "03AE", "03B9 0300", "03AF", "03BF 0300", "03CC", "03C5 0300", "03CD", "03C9 0300", "03CE", "1F00 0345", "1F01 0345", "1F02 0345", "1F03 0345", "1F04 0345", "1F05 0345", "1F06 0345", "1F07 0345", "1F08 0345", "1F09 0345", "1F0A 0345", "1F0B 0345", "1F0C 0345", "1F0D 0345", "1F0E 0345", "1F0F 0345", "1F20 0345", "1F21 0345", "1F22 0345", "1F23 0345", "1F24 0345", "1F25 0345", "1F26 0345", "1F27 0345", "1F28 0345", "1F29 0345", "1F2A 0345", "1F2B 0345", "1F2C 0345", "1F2D 0345", "1F2E 0345", "1F2F 0345", "1F60 0345", "1F61 0345", "1F62 0345", "1F63 0345", "1F64 0345", "1F65 0345", "1F66 0345", "1F67 0345", "1F68 0345", "1F69 0345", "1F6A 0345", "1F6B 0345", "1F6C 0345", "1F6D 0345", "1F6E 0345", "1F6F 0345", "03B1 0306", "03B1 0304", "1F70 0345", "03B1 0345", "03AC 0345", "03B1 0342", "1FB6 0345", "0391 0306", "0391 0304", "0391 0300", "0386", "0391 0345", "0020 0313", "03B9", "0020 0313", "0020 0342", "00A8 0342", "1F74 0345", "03B7 0345", "03AE 0345", "03B7 0342", "1FC6 0345", "0395 0300", "0388", "0397 0300", "0389", "0397 0345", "1FBF 0300", "1FBF 0301", "1FBF 0342", "03B9 0306", "03B9 0304", "03CA 0300", "0390", "03B9 0342", "03CA 0342", "0399 0306", "0399 0304", "0399 0300", "038A", "1FFE 0300", "1FFE 0301", "1FFE 0342", "03C5 0306", "03C5 0304", "03CB 0300", "03B0", "03C1 0313", "03C1 0314", "03C5 0342", "03CB 0342", "03A5 0306", "03A5 0304", "03A5 0300", "038E", "03A1 0314", "00A8 0300", "0385", "0060", "1F7C 0345", "03C9 0345", "03CE 0345", "03C9 0342", "1FF6 0345", "039F 0300", "038C", "03A9 0300", "038F", "03A9 0345", "00B4", "0020 0314", "2002", "2003", "0020", "0020", "0020", "0020", "0020", "0020", "0020", "0020", "0020", "2010", "0020 0333", "002E", "002E 002E", "002E 002E 002E", "0020", "2032 2032", "2032 2032 2032", "2035 2035", "2035 2035 2035", "0021 0021", "0020 0305", "003F 003F", "003F 0021", "0021 003F", "2032 2032 2032 2032", "0020", "0030", "0069", "0034", "0035", "0036", "0037", "0038", "0039", "002B", "2212", "003D", "0028", "0029", "006E", "0030", "0031", "0032", "0033", "0034", "0035", "0036", "0037", "0038", "0039", "002B", "2212", "003D", "0028", "0029", "0061", "0065", "006F", "0078", "0259", "0068", "006B", "006C", "006D", "006E", "0070", "0073", "0074", "0052 0073", "0061 002F 0063", "0061 002F 0073", "0043", "00B0 0043", "0063 002F 006F", "0063 002F 0075", "0190", "00B0 0046", "0067", "0048", "0048", "0048", "0068", "0127", "0049", "0049", "004C", "006C", "004E", "004E 006F", "0050", "0051", "0052", "0052", "0052", "0053 004D", "0054 0045 004C", "0054 004D", "005A", "03A9", "005A", "004B", "00C5", "0042", "0043", "0065", "0045", "0046", "004D", "006F", "05D0", "05D1", "05D2", "05D3", "0069", "0046 0041 0058", "03C0", "03B3", "0393", "03A0", "2211", "0044", "0064", "0065", "0069", "006A", "0031 2044 0037", "0031 2044 0039", "0031 2044 0031 0030", "0031 2044 0033", "0032 2044 0033", "0031 2044 0035", "0032 2044 0035", "0033 2044 0035", "0034 2044 0035", "0031 2044 0036", "0035 2044 0036", "0031 2044 0038", "0033 2044 0038", "0035 2044 0038", "0037 2044 0038", "0031 2044", "0049", "0049 0049", "0049 0049 0049", "0049 0056", "0056", "0056 0049", "0056 0049 0049", "0056 0049 0049 0049", "0049 0058", "0058", "0058 0049", "0058 0049 0049", "004C", "0043", "0044", "004D", "0069", "0069 0069", "0069 0069 0069", "0069 0076", "0076", "0076 0069", "0076 0069 0069", "0076 0069 0069 0069", "0069 0078", "0078", "0078 0069", "0078 0069 0069", "006C", "0063", "0064", "006D", "0030 2044 0033", "2190 0338", "2192 0338", "2194 0338", "21D0 0338", "21D4 0338", "21D2 0338", "2203 0338", "2208 0338", "220B 0338", "2223 0338", "2225 0338", "222B 222B", "222B 222B 222B", "222E 222E", "222E 222E 222E", "223C 0338", "2243 0338", "2245 0338", "2248 0338", "003D 0338", "2261 0338", "224D 0338", "003C 0338", "003E 0338", "2264 0338", "2265 0338", "2272 0338", "2273 0338", "2276 0338", "2277 0338", "227A 0338", "227B 0338", "2282 0338", "2283 0338", "2286 0338", "2287 0338", "22A2 0338", "22A8 0338", "22A9 0338", "22AB 0338", "227C 0338", "227D 0338", "2291 0338", "2292 0338", "22B2 0338", "22B3 0338", "22B4 0338", "22B5 0338", "3008", "3009", "0031", "0032", "0033", "0034", "0035", "0036", "0037", "0038", "0039", "0031 0030", "0031 0031", "0031 0032", "0031 0033", "0031 0034", "0031 0035", "0031 0036", "0031 0037", "0031 0038", "0031 0039", "0032 0030", "0028 0031 0029", "0028 0032 0029", "0028 0033 0029", "0028 0034 0029", "0028 0035 0029", "0028 0036 0029", "0028 0037 0029", "0028 0038 0029", "0028 0039 0029", "0028 0031 0030 0029", "0028 0031 0031 0029", "0028 0031 0032 0029", "0028 0031 0033 0029", "0028 0031 0034 0029", "0028 0031 0035 0029", "0028 0031 0036 0029", "0028 0031 0037 0029", "0028 0031 0038 0029", "0028 0031 0039 0029", "0028 0032 0030 0029", "0031 002E", "0032 002E", "0033 002E", "0034 002E", "0035 002E", "0036 002E", "0037 002E", "0038 002E", "0039 002E", "0031 0030 002E", "0031 0031 002E", "0031 0032 002E", "0031 0033 002E", "0031 0034 002E", "0031 0035 002E", "0031 0036 002E", "0031 0037 002E", "0031 0038 002E", "0031 0039 002E", "0032 0030 002E", "0028 0061 0029", "0028 0062 0029", "0028 0063 0029", "0028 0064 0029", "0028 0065 0029", "0028 0066 0029", "0028 0067 0029", "0028 0068 0029", "0028 0069 0029", "0028 006A 0029", "0028 006B 0029", "0028 006C 0029", "0028 006D 0029", "0028 006E 0029", "0028 006F 0029", "0028 0070 0029", "0028 0071 0029", "0028 0072 0029", "0028 0073 0029", "0028 0074 0029", "0028 0075 0029", "0028 0076 0029", "0028 0077 0029", "0028 0078 0029", "0028 0079 0029", "0028 007A 0029", "0041", "0042", "0043", "0044", "0045", "0046", "0047", "0048", "0049", "004A", "004B", "004C", "004D", "004E", "004F", "0050", "0051", "0052", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "005A", "0061", "0062", "0063", "0064", "0065", "0066", "0067", "0068", "0069", "006A", "006B", "006C", "006D", "006E", "006F", "0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0079", "007A", "0030", "222B 222B 222B 222B", "003A 003A 003D", "003D 003D", "003D 003D 003D", "2ADD 0338", "006A", "0056", "2D61", "6BCD", "9F9F", "4E00", "4E28", "4E36", "4E3F", "4E59", "4E85", "4E8C", "4EA0", "4EBA", "513F", "5165", "516B", "5182", "5196", "51AB", "51E0", "51F5", "5200", "529B", "52F9", "5315", "531A", "5338", "5341", "535C", "5369", "5382", "53B6", "53C8", "53E3", "56D7", "571F", "58EB", "5902", "590A", "5915", "5927", "5973", "5B50", "5B80", "5BF8", "5C0F", "5C22", "5C38", "5C6E", "5C71", "5DDB", "5DE5", "5DF1", "5DFE", "5E72", "5E7A", "5E7F", "5EF4", "5EFE", "5F0B", "5F13", "5F50", "5F61", "5F73", "5FC3", "6208", "6236", "624B", "652F", "6534", "6587", "6597", "65A4", "65B9", "65E0", "65E5", "66F0", "6708", "6728", "6B20", "6B62", "6B79", "6BB3", "6BCB", "6BD4", "6BDB", "6C0F", "6C14", "6C34", "706B", "722A", "7236", "723B", "723F", "7247", "7259", "725B", "72AC", "7384", "7389", "74DC", "74E6", "7518", "751F", "7528", "7530", "758B", "7592", "7676", "767D", "76AE", "76BF", "76EE", "77DB", "77E2", "77F3", "793A", "79B8", "79BE", "7A74", "7ACB", "7AF9", "7C73", "7CF8", "7F36", "7F51", "7F8A", "7FBD", "8001", "800C", "8012", "8033", "807F", "8089", "81E3", "81EA", "81F3", "81FC", "820C", "821B", "821F", "826E", "8272", "8278", "864D", "866B", "8840", "884C", "8863", "897E", "898B", "89D2", "8A00", "8C37", "8C46", "8C55", "8C78", "8C9D", "8D64", "8D70", "8DB3", "8EAB", "8ECA", "8F9B", "8FB0", "8FB5", "9091", "9149", "91C6", "91CC", "91D1", "9577", "9580", "961C", "96B6", "96B9", "96E8", "9751", "975E", "9762", "9769", "97CB", "97ED", "97F3", "9801", "98A8", "98DB", "98DF", "9996", "9999", "99AC", "9AA8", "9AD8", "9ADF", "9B25", "9B2F", "9B32", "9B3C", "9B5A", "9CE5", "9E75", "9E7F", "9EA5", "9EBB", "9EC3", "9ECD", "9ED1", "9EF9", "9EFD", "9F0E", "9F13", "9F20", "9F3B", "9F4A", "9F52", "9F8D", "9F9C", "9FA0", "0020", "3012", "5341", "5344", "5345", "304B 3099", "304D 3099", "304F 3099", "3051 3099", "3053 3099", "3055 3099", "3057 3099", "3059 3099", "305B 3099", "305D 3099", "305F 3099", "3061 3099", "3064 3099", "3066 3099", "3068 3099", "306F 3099", "306F 309A", "3072 3099", "3072 309A", "3075 3099", "3075 309A", "3078 3099", "3078 309A", "307B 3099", "307B 309A", "3046 3099", "0020 3099", "0020 309A", "309D 3099", "3088 308A", "30AB 3099", "30AD 3099", "30AF 3099", "30B1 3099", "30B3 3099", "30B5 3099", "30B7 3099", "30B9 3099", "30BB 3099", "30BD 3099", "30BF 3099", "30C1 3099", "30C4 3099", "30C6 3099", "30C8 3099", "30CF 3099", "30CF 309A", "30D2 3099", "30D2 309A", "30D5 3099", "30D5 309A", "30D8 3099", "30D8 309A", "30DB 3099", "30DB 309A", "30A6 3099", "30EF 3099", "30F0 3099", "30F1 3099", "30F2 3099", "30FD 3099", "30B3 30C8", "1100", "1101", "11AA", "1102", "11AC", "11AD", "1103", "1104", "1105", "11B0", "11B1", "11B2", "11B3", "11B4", "11B5", "111A", "1106", "1107", "1108", "1121", "1109", "110A", "110B", "110C", "110D", "110E", "110F", "1110", "1111", "1112", "1161", "1162", "1163", "1164", "1165", "1166", "1167", "1168", "1169", "116A", "116B", "116C", "116D", "116E", "116F", "1170", "1171", "1172", "1173", "1174", "1175", "1160", "1114", "1115", "11C7", "11C8", "11CC", "11CE", "11D3", "11D7", "11D9", "111C", "11DD", "11DF", "111D", "111E", "1120", "1122", "1123", "1127", "1129", "112B", "112C", "112D", "112E", "112F", "1132", "1136", "1140", "1147", "114C", "11F1", "11F2", "1157", "1158", "1159", "1184", "1185", "1188", "1191", "1192", "1194", "119E", "11A1", "4E00", "4E8C", "4E09", "56DB", "4E0A", "4E2D", "4E0B", "7532", "4E59", "4E19", "4E01", "5929", "5730", "4EBA", "0028 1100 0029", "0028 1102 0029", "0028 1103 0029", "0028 1105 0029", "0028 1106 0029", "0028 1107 0029", "0028 1109 0029", "0028 110B 0029", "0028 110C 0029", "0028 110E 0029", "0028 110F 0029", "0028 1110 0029", "0028 1111 0029", "0028 1112 0029", "0028 1100 1161 0029", "0028 1102 1161 0029", "0028 1103 1161 0029", "0028 1105 1161 0029", "0028 1106 1161 0029", "0028 1107 1161 0029", "0028 1109 1161 0029", "0028 110B 1161 0029", "0028 110C 1161 0029", "0028 110E 1161 0029", "0028 110F 1161 0029", "0028 1110 1161 0029", "0028 1111 1161 0029", "0028 1112 1161 0029", "0028 110C 116E 0029", "0028 110B 1169 110C 1165 11AB 0029", "0028 110B 1169 1112 116E 0029", "0028 4E00 0029", "0028 4E8C 0029", "0028 4E09 0029", "0028 56DB 0029", "0028 4E94 0029", "0028 516D 0029", "0028 4E03 0029", "0028 516B 0029", "0028 4E5D 0029", "0028 5341 0029", "0028 6708 0029", "0028 706B 0029", "0028 6C34 0029", "0028 6728 0029", "0028 91D1 0029", "0028 571F 0029", "0028 65E5 0029", "0028 682A 0029", "0028 6709 0029", "0028 793E 0029", "0028 540D 0029", "0028 7279 0029", "0028 8CA1 0029", "0028 795D 0029", "0028 52B4 0029", "0028 4EE3 0029", "0028 547C 0029", "0028 5B66 0029", "0028 76E3 0029", "0028 4F01 0029", "0028 8CC7 0029", "0028 5354 0029", "0028 796D 0029", "0028 4F11 0029", "0028 81EA 0029", "0028 81F3 0029", "554F", "5E7C", "6587", "7B8F", "0050 0054 0045", "0032 0031", "0032 0032", "0032 0033", "0032 0034", "0032 0035", "0032 0036", "0032 0037", "0032 0038", "0032 0039", "0033 0030", "0033 0031", "0033 0032", "0033 0033", "0033 0034", "0033 0035", "1100", "1102", "1103", "1105", "1106", "1107", "1109", "110B", "110C", "110E", "110F", "1110", "1111", "1112", "1100 1161", "1102 1161", "1103 1161", "1105 1161", "1106 1161", "1107 1161", "1109 1161", "110B 1161", "110C 1161", "110E 1161", "110F 1161", "1110 1161", "1111 1161", "1112 1161", "110E 1161 11B7 1100 1169", "110C 116E 110B 1174", "110B 116E", "4E00", "4E8C", "4E09", "56DB", "4E94", "516D", "4E03", "516B", "4E5D", "5341", "6708", "706B", "6C34", "6728", "91D1", "571F", "65E5", "682A", "6709", "793E", "540D", "7279", "8CA1", "795D", "52B4", "79D8", "7537", "5973", "9069", "512A", "5370", "6CE8", "9805", "4F11", "5199", "6B63", "4E0A", "4E2D", "4E0B", "5DE6", "53F3", "533B", "5B97", "5B66", "76E3", "4F01", "8CC7", "5354", "591C", "0033 0036", "0033 0037", "0033 0038", "0033 0039", "0034 0030", "0034 0031", "0034 0032", "0034 0033", "0034 0034", "0034 0035", "0034 0036", "0034 0037", "0034 0038", "0034 0039", "0035 0030", "0031 6708", "0032 6708", "0033 6708", "0034 6708", "0035 6708", "0036 6708", "0037 6708", "0038 6708", "0039 6708", "0031 0030 6708", "0031 0031 6708", "0031 0032 6708", "0048 0067", "0065 0072 0067", "0065 0056", "004C 0054 0044", "30A2", "30A4", "30A6", "30A8", "30AA", "30AB", "30AD", "30AF", "30B1", "30B3", "30B5", "30B7", "30B9", "30BB", "30BD", "30BF", "30C1", "30C4", "30C6", "30C8", "30CA", "30CB", "30CC", "30CD", "30CE", "30CF", "30D2", "30D5", "30D8", "30DB", "30DE", "30DF", "30E0", "30E1", "30E2", "30E4", "30E6", "30E8", "30E9", "30EA", "30EB", "30EC", "30ED", "30EF", "30F0", "30F1", "30F2", "30A2 30D1 30FC 30C8", "30A2 30EB 30D5 30A1", "30A2 30F3 30DA 30A2", "30A2 30FC 30EB", "30A4 30CB 30F3 30B0", "30A4 30F3 30C1", "30A6 30A9 30F3", "30A8 30B9 30AF 30FC 30C9", "30A8 30FC 30AB 30FC", "30AA 30F3 30B9", "30AA 30FC 30E0", "30AB 30A4 30EA", "30AB 30E9 30C3 30C8", "30AB 30ED 30EA 30FC", "30AC 30ED 30F3", "30AC 30F3 30DE", "30AE 30AC", "30AE 30CB 30FC", "30AD 30E5 30EA 30FC", "30AE 30EB 30C0 30FC", "30AD 30ED", "30AD 30ED 30B0 30E9 30E0", "30AD 30ED 30E1 30FC 30C8 30EB", "30AD 30ED 30EF 30C3 30C8", "30B0 30E9 30E0", "30B0 30E9 30E0 30C8 30F3", "30AF 30EB 30BC 30A4 30ED", "30AF 30ED 30FC 30CD", "30B1 30FC 30B9", "30B3 30EB 30CA", "30B3 30FC 30DD", "30B5 30A4 30AF 30EB", "30B5 30F3 30C1 30FC 30E0", "30B7 30EA 30F3 30B0", "30BB 30F3 30C1", "30BB 30F3 30C8", "30C0 30FC 30B9", "30C7 30B7", "30C9 30EB", "30C8 30F3", "30CA 30CE", "30CE 30C3 30C8", "30CF 30A4 30C4", "30D1 30FC 30BB 30F3 30C8", "30D1 30FC 30C4", "30D0 30FC 30EC 30EB", "30D4 30A2 30B9 30C8 30EB", "30D4 30AF 30EB", "30D4 30B3", "30D3 30EB", "30D5 30A1 30E9 30C3 30C9", "30D5 30A3 30FC 30C8", "30D6 30C3 30B7 30A7 30EB", "30D5 30E9 30F3", "30D8 30AF 30BF 30FC 30EB", "30DA 30BD", "30DA 30CB 30D2", "30D8 30EB 30C4", "30DA 30F3 30B9", "30DA 30FC 30B8", "30D9 30FC 30BF", "30DD 30A4 30F3 30C8", "30DC 30EB 30C8", "30DB 30F3", "30DD 30F3 30C9", "30DB 30FC 30EB", "30DB 30FC 30F3", "30DE 30A4 30AF 30ED", "30DE 30A4 30EB", "30DE 30C3 30CF", "30DE 30EB 30AF", "30DE 30F3 30B7 30E7 30F3", "30DF 30AF 30ED 30F3", "30DF 30EA", "30DF 30EA 30D0 30FC 30EB", "30E1 30AC", "30E1 30AC 30C8 30F3", "30E1 30FC 30C8 30EB", "30E4 30FC 30C9", "30E4 30FC 30EB", "30E6 30A2 30F3", "30EA 30C3 30C8 30EB", "30EA 30E9", "30EB 30D4 30FC", "30EB 30FC 30D6 30EB", "30EC 30E0", "30EC 30F3 30C8 30B2 30F3", "30EF 30C3 30C8", "0030 70B9", "0031 70B9", "0032 70B9", "0033 70B9", "0034 70B9", "0035 70B9", "0036 70B9", "0037 70B9", "0038 70B9", "0039 70B9", "0031 0030 70B9", "0031 0031 70B9", "0031 0032 70B9", "0031 0033 70B9", "0031 0034 70B9", "0031 0035 70B9", "0031 0036 70B9", "0031 0037 70B9", "0031 0038 70B9", "0031 0039 70B9", "0032 0030 70B9", "0032 0031 70B9", "0032 0032 70B9", "0032 0033 70B9", "0032 0034 70B9", "0068 0050 0061", "0064 0061", "0041 0055", "0062 0061 0072", "006F 0056", "0070 0063", "0064 006D", "0064 006D 00B2", "0064 006D 00B3", "0049 0055", "5E73 6210", "662D 548C", "5927 6B63", "660E 6CBB", "682A 5F0F 4F1A 793E", "0070 0041", "006E 0041", "03BC 0041", "006D 0041", "006B 0041", "004B 0042", "004D 0042", "0047 0042", "0063 0061 006C", "006B 0063 0061 006C", "0070 0046", "006E 0046", "03BC 0046", "03BC 0067", "006D 0067", "006B 0067", "0048 007A", "006B 0048 007A", "004D 0048 007A", "0047 0048 007A", "0054 0048 007A", "03BC 2113", "006D 2113", "0064 2113", "006B 2113", "0066 006D", "006E 006D", "03BC 006D", "006D 006D", "0063 006D", "006B 006D", "006D 006D 00B2", "0063 006D 00B2", "006D 00B2", "006B 006D 00B2", "006D 006D 00B3", "0063 006D 00B3", "006D 00B3", "006B 006D 00B3", "006D 2215 0073", "006D 2215 0073 00B2", "0050 0061", "006B 0050 0061", "004D 0050 0061", "0047 0050 0061", "0072 0061 0064", "0072 0061 0064 2215 0073", "0072 0061 0064 2215 0073 00B2", "0070 0073", "006E 0073", "03BC 0073", "006D 0073", "0070 0056", "006E 0056", "03BC 0056", "006D 0056", "006B 0056", "004D 0056", "0070 0057", "006E 0057", "03BC 0057", "006D 0057", "006B 0057", "004D 0057", "006B 03A9", "004D 03A9", "0061 002E 006D 002E", "0042 0071", "0063 0063", "0063 0064", "0043 2215 006B 0067", "0043 006F 002E", "0064 0042", "0047 0079", "0068 0061", "0048 0050", "0069 006E", "004B 004B", "004B 004D", "006B 0074", "006C 006D", "006C 006E", "006C 006F 0067", "006C 0078", "006D 0062", "006D 0069 006C", "006D 006F 006C", "0050 0048", "0070 002E 006D 002E", "0050 0050 004D", "0050 0052", "0073 0072", "0053 0076", "0057 0062", "0056 2215 006D", "0041 2215 006D", "0031 65E5", "0032 65E5", "0033 65E5", "0034 65E5", "0035 65E5", "0036 65E5", "0037 65E5", "0038 65E5", "0039 65E5", "0031 0030 65E5", "0031 0031 65E5", "0031 0032 65E5", "0031 0033 65E5", "0031 0034 65E5", "0031 0035 65E5", "0031 0036 65E5", "0031 0037 65E5", "0031 0038 65E5", "0031 0039 65E5", "0032 0030 65E5", "0032 0031 65E5", "0032 0032 65E5", "0032 0033 65E5", "0032 0034 65E5", "0032 0035 65E5", "0032 0036 65E5", "0032 0037 65E5", "0032 0038 65E5", "0032 0039 65E5", "0033 0030 65E5", "0033 0031 65E5", "0067 0061 006C", "044A", "044C", "A76F", "0126", "0153", "A727", "AB37", "026B", "AB52", "8C48", "66F4", "8ECA", "8CC8", "6ED1", "4E32", "53E5", "9F9C", "9F9C", "5951", "91D1", "5587", "5948", "61F6", "7669", "7F85", "863F", "87BA", "88F8", "908F", "6A02", "6D1B", "70D9", "73DE", "843D", "916A", "99F1", "4E82", "5375", "6B04", "721B", "862D", "9E1E", "5D50", "6FEB", "85CD", "8964", "62C9", "81D8", "881F", "5ECA", "6717", "6D6A", "72FC", "90CE", "4F86", "51B7", "52DE", "64C4", "6AD3", "7210", "76E7", "8001", "8606", "865C", "8DEF", "9732", "9B6F", "9DFA", "788C", "797F", "7DA0", "83C9", "9304", "9E7F", "8AD6", "58DF", "5F04", "7C60", "807E", "7262", "78CA", "8CC2", "96F7", "58D8", "5C62", "6A13", "6DDA", "6F0F", "7D2F", "7E37", "964B", "52D2", "808B", "51DC", "51CC", "7A1C", "7DBE", "83F1", "9675", "8B80", "62CF", "6A02", "8AFE", "4E39", "5BE7", "6012", "7387", "7570", "5317", "78FB", "4FBF", "5FA9", "4E0D", "6CCC", "6578", "7D22", "53C3", "585E", "7701", "8449", "8AAA", "6BBA", "8FB0", "6C88", "62FE", "82E5", "63A0", "7565", "4EAE", "5169", "51C9", "6881", "7CE7", "826F", "8AD2", "91CF", "52F5", "5442", "5973", "5EEC", "65C5", "6FFE", "792A", "95AD", "9A6A", "9E97", "9ECE", "529B", "66C6", "6B77", "8F62", "5E74", "6190", "6200", "649A", "6F23", "7149", "7489", "79CA", "7DF4", "806F", "8F26", "84EE", "9023", "934A", "5217", "52A3", "54BD", "70C8", "88C2", "8AAA", "5EC9", "5FF5", "637B", "6BAE", "7C3E", "7375", "4EE4", "56F9", "5BE7", "5DBA", "601C", "73B2", "7469", "7F9A", "8046", "9234", "96F6", "9748", "9818", "4F8B", "79AE", "91B4", "96B8", "60E1", "4E86", "50DA", "5BEE", "5C3F", "6599", "6A02", "71CE", "7642", "84FC", "907C", "9F8D", "6688", "962E", "5289", "677B", "67F3", "6D41", "6E9C", "7409", "7559", "786B", "7D10", "985E", "516D", "622E", "9678", "502B", "5D19", "6DEA", "8F2A", "5F8B", "6144", "6817", "7387", "9686", "5229", "540F", "5C65", "6613", "674E", "68A8", "6CE5", "7406", "75E2", "7F79", "88CF", "88E1", "91CC", "96E2", "533F", "6EBA", "541D", "71D0", "7498", "85FA", "96A3", "9C57", "9E9F", "6797", "6DCB", "81E8", "7ACB", "7B20", "7C92", "72C0", "7099", "8B58", "4EC0", "8336", "523A", "5207", "5EA6", "62D3", "7CD6", "5B85", "6D1E", "66B4", "8F3B", "884C", "964D", "898B", "5ED3", "5140", "55C0", "585A", "6674", "51DE", "732A", "76CA", "793C", "795E", "7965", "798F", "9756", "7CBE", "7FBD", "8612", "8AF8", "9038", "90FD", "98EF", "98FC", "9928", "9DB4", "90DE", "96B7", "4FAE", "50E7", "514D", "52C9", "52E4", "5351", "559D", "5606", "5668", "5840", "58A8", "5C64", "5C6E", "6094", "6168", "618E", "61F2", "654F", "65E2", "6691", "6885", "6D77", "6E1A", "6F22", "716E", "722B", "7422", "7891", "793E", "7949", "7948", "7950", "7956", "795D", "798D", "798E", "7A40", "7A81", "7BC0", "7DF4", "7E09", "7E41", "7F72", "8005", "81ED", "8279", "8279", "8457", "8910", "8996", "8B01", "8B39", "8CD3", "8D08", "8FB6", "9038", "96E3", "97FF", "983B", "6075", "242EE", "8218", "4E26", "51B5", "5168", "4F80", "5145", "5180", "52C7", "52FA", "559D", "5555", "5599", "55E2", "585A", "58B3", "5944", "5954", "5A62", "5B28", "5ED2", "5ED9", "5F69", "5FAD", "60D8", "614E", "6108", "618E", "6160", "61F2", "6234", "63C4", "641C", "6452", "6556", "6674", "6717", "671B", "6756", "6B79", "6BBA", "6D41", "6EDB", "6ECB", "6F22", "701E", "716E", "77A7", "7235", "72AF", "732A", "7471", "7506", "753B", "761D", "761F", "76CA", "76DB", "76F4", "774A", "7740", "78CC", "7AB1", "7BC0", "7C7B", "7D5B", "7DF4", "7F3E", "8005", "8352", "83EF", "8779", "8941", "8986", "8996", "8ABF", "8AF8", "8ACB", "8B01", "8AFE", "8AED", "8B39", "8B8A", "8D08", "8F38", "9072", "9199", "9276", "967C", "96E3", "9756", "97DB", "97FF", "980B", "983B", "9B12", "9F9C", "2284A", "22844", "233D5", "3B9D", "4018", "4039", "25249", "25CD0", "27ED3", "9F43", "9F8E", "0066 0066", "0066 0069", "0066 006C", "0066 0066 0069", "0066 0066 006C", "017F 0074", "0073 0074", "0574 0576", "0574 0565", "0574 056B", "057E 0576", "0574 056D", "05D9 05B4", "05F2 05B7", "05E2", "05D0", "05D3", "05D4", "05DB", "05DC", "05DD", "05E8", "05EA", "002B", "05E9 05C1", "05E9 05C2", "FB49 05C1", "FB49 05C2", "05D0 05B7", "05D0 05B8", "05D0 05BC", "05D1 05BC", "05D2 05BC", "05D3 05BC", "05D4 05BC", "05D5 05BC", "05D6 05BC", "05D8 05BC", "05D9 05BC", "05DA 05BC", "05DB 05BC", "05DC 05BC", "05DE 05BC", "05E0 05BC", "05E1 05BC", "05E3 05BC", "05E4 05BC", "05E6 05BC", "05E7 05BC", "05E8 05BC", "05E9 05BC", "05EA 05BC", "05D5 05B9", "05D1 05BF", "05DB 05BF", "05E4 05BF", "05D0 05DC", "0671", "0671", "067B", "067B", "067B", "067B", "067E", "067E", "067E", "067E", "0680", "0680", "0680", "0680", "067A", "067A", "067A", "067A", "067F", "067F", "067F", "067F", "0679", "0679", "0679", "0679", "06A4", "06A4", "06A4", "06A4", "06A6", "06A6", "06A6", "06A6", "0684", "0684", "0684", "0684", "0683", "0683", "0683", "0683", "0686", "0686", "0686", "0686", "0687", "0687", "0687", "0687", "068D", "068D", "068C", "068C", "068E", "068E", "0688", "0688", "0698", "0698", "0691", "0691", "06A9", "06A9", "06A9", "06A9", "06AF", "06AF", "06AF", "06AF", "06B3", "06B3", "06B3", "06B3", "06B1", "06B1", "06B1", "06B1", "06BA", "06BA", "06BB", "06BB", "06BB", "06BB", "06C0", "06C0", "06C1", "06C1", "06C1", "06C1", "06BE", "06BE", "06BE", "06BE", "06D2", "06D2", "06D3", "06D3", "06AD", "06AD", "06AD", "06AD", "06C7", "06C7", "06C6", "06C6", "06C8", "06C8", "0677", "06CB", "06CB", "06C5", "06C5", "06C9", "06C9", "06D0", "06D0", "06D0", "06D0", "0649", "0649", "0626 0627", "0626 0627", "0626 06D5", "0626 06D5", "0626 0648", "0626 0648", "0626 06C7", "0626 06C7", "0626 06C6", "0626 06C6", "0626 06C8", "0626 06C8", "0626 06D0", "0626 06D0", "0626 06D0", "0626 0649", "0626 0649", "0626 0649", "06CC", "06CC", "06CC", "06CC", "0626 062C", "0626 062D", "0626 0645", "0626 0649", "0626 064A", "0628 062C", "0628 062D", "0628 062E", "0628 0645", "0628 0649", "0628 064A", "062A 062C", "062A 062D", "062A 062E", "062A 0645", "062A 0649", "062A 064A", "062B 062C", "062B 0645", "062B 0649", "062B 064A", "062C 062D", "062C 0645", "062D 062C", "062D 0645", "062E 062C", "062E 062D", "062E 0645", "0633 062C", "0633 062D", "0633 062E", "0633 0645", "0635 062D", "0635 0645", "0636 062C", "0636 062D", "0636 062E", "0636 0645", "0637 062D", "0637 0645", "0638 0645", "0639 062C", "0639 0645", "063A 062C", "063A 0645", "0641 062C", "0641 062D", "0641 062E", "0641 0645", "0641 0649", "0641 064A", "0642 062D", "0642 0645", "0642 0649", "0642 064A", "0643 0627", "0643 062C", "0643 062D", "0643 062E", "0643 0644", "0643 0645", "0643 0649", "0643 064A", "0644 062C", "0644 062D", "0644 062E", "0644 0645", "0644 0649", "0644 064A", "0645 062C", "0645 062D", "0645 062E", "0645 0645", "0645 0649", "0645 064A", "0646 062C", "0646 062D", "0646 062E", "0646 0645", "0646 0649", "0646 064A", "0647 062C", "0647 0645", "0647 0649", "0647 064A", "064A 062C", "064A 062D", "064A 062E", "064A 0645", "064A 0649", "064A 064A", "0630 0670", "0631 0670", "0649 0670", "0020 064C 0651", "0020 064D 0651", "0020 064E 0651", "0020 064F 0651", "0020 0650 0651", "0020 0651 0670", "0626 0631", "0626 0632", "0626 0645", "0626 0646", "0626 0649", "0626 064A", "0628 0631", "0628 0632", "0628 0645", "0628 0646", "0628 0649", "0628 064A", "062A 0631", "062A 0632", "062A 0645", "062A 0646", "062A 0649", "062A 064A", "062B 0631", "062B 0632", "062B 0645", "062B 0646", "062B 0649", "062B 064A", "0641 0649", "0641 064A", "0642 0649", "0642 064A", "0643 0627", "0643 0644", "0643 0645", "0643 0649", "0643 064A", "0644 0645", "0644 0649", "0644 064A", "0645 0627", "0645 0645", "0646 0631", "0646 0632", "0646 0645", "0646 0646", "0646 0649", "0646 064A", "0649 0670", "064A 0631", "064A 0632", "064A 0645", "064A 0646", "064A 0649", "064A 064A", "0626 062C", "0626 062D", "0626 062E", "0626 0645", "0626 0647", "0628 062C", "0628 062D", "0628 062E", "0628 0645", "0628 0647", "062A 062C", "062A 062D", "062A 062E", "062A 0645", "062A 0647", "062B 0645", "062C 062D", "062C 0645", "062D 062C", "062D 0645", "062E 062C", "062E 0645", "0633 062C", "0633 062D", "0633 062E", "0633 0645", "0635 062D", "0635 062E", "0635 0645", "0636 062C", "0636 062D", "0636 062E", "0636 0645", "0637 062D", "0638 0645", "0639 062C", "0639 0645", "063A 062C", "063A 0645", "0641 062C", "0641 062D", "0641 062E", "0641 0645", "0642 062D", "0642 0645", "0643 062C", "0643 062D", "0643 062E", "0643 0644", "0643 0645", "0644 062C", "0644 062D", "0644 062E", "0644 0645", "0644 0647", "0645 062C", "0645 062D", "0645 062E", "0645 0645", "0646 062C", "0646 062D", "0646 062E", "0646 0645", "0646 0647", "0647 062C", "0647 0645", "0647 0670", "064A 062C", "064A 062D", "064A 062E", "064A 0645", "064A 0647", "0626 0645", "0626 0647", "0628 0645", "0628 0647", "062A 0645", "062A 0647", "062B 0645", "062B 0647", "0633 0645", "0633 0647", "0634 0645", "0634 0647", "0643 0644", "0643 0645", "0644 0645", "0646 0645", "0646 0647", "064A 0645", "064A 0647", "0640 064E 0651", "0640 064F 0651", "0640 0650 0651", "0637 0649", "0637 064A", "0639 0649", "0639 064A", "063A 0649", "063A 064A", "0633 0649", "0633 064A", "0634 0649", "0634 064A", "062D 0649", "062D 064A", "062C 0649", "062C 064A", "062E 0649", "062E 064A", "0635 0649", "0635 064A", "0636 0649", "0636 064A", "0634 062C", "0634 062D", "0634 062E", "0634 0645", "0634 0631", "0633 0631", "0635 0631", "0636 0631", "0637 0649", "0637 064A", "0639 0649", "0639 064A", "063A 0649", "063A 064A", "0633 0649", "0633 064A", "0634 0649", "0634 064A", "062D 0649", "062D 064A", "062C 0649", "062C 064A", "062E 0649", "062E 064A", "0635 0649", "0635 064A", "0636 0649", "0636 064A", "0634 062C", "0634 062D", "0634 062E", "0634 0645", "0634 0631", "0633 0631", "0635 0631", "0636 0631", "0634 062C", "0634 062D", "0634 062E", "0634 0645", "0633 0647", "0634 0647", "0637 0645", "0633 062C", "0633 062D", "0633 062E", "0634 062C", "0634 062D", "0634 062E", "0637 0645", "0638 0645", "0627 064B", "0627 064B", "062A 062C 0645", "062A 062D 062C", "062A 062D 062C", "062A 062D 0645", "062A 062E 0645", "062A 0645 062C", "062A 0645 062D", "062A 0645 062E", "062C 0645 062D", "062C 0645 062D", "062D 0645 064A", "062D 0645 0649", "0633 062D 062C", "0633 062C 062D", "0633 062C 0649", "0633 0645 062D", "0633 0645 062D", "0633 0645 062C", "0633 0645 0645", "0633 0645 0645", "0635 062D 062D", "0635 062D 062D", "0635 0645 0645", "0634 062D 0645", "0634 062D 0645", "0634 062C 064A", "0634 0645 062E", "0634 0645 062E", "0634 0645 0645", "0634 0645 0645", "0636 062D 0649", "0636 062E 0645", "0636 062E 0645", "0637 0645 062D", "0637 0645 062D", "0637 0645 0645", "0637 0645 064A", "0639 062C 0645", "0639 0645 0645", "0639 0645 0645", "0639 0645 0649", "063A 0645 0645", "063A 0645 064A", "063A 0645 0649", "0641 062E 0645", "0641 062E 0645", "0642 0645 062D", "0642 0645 0645", "0644 062D 0645", "0644 062D 064A", "0644 062D 0649", "0644 062C 062C", "0644 062C 062C", "0644 062E 0645", "0644 062E 0645", "0644 0645 062D", "0644 0645 062D", "0645 062D 062C", "0645 062D 0645", "0645 062D 064A", "0645 062C 062D", "0645 062C 0645", "0645 062E 062C", "0645 062E 0645", "0645 062C 062E", "0647 0645 062C", "0647 0645 0645", "0646 062D 0645", "0646 062D 0649", "0646 062C 0645", "0646 062C 0645", "0646 062C 0649", "0646 0645 064A", "0646 0645 0649", "064A 0645 0645", "064A 0645 0645", "0628 062E 064A", "062A 062C 064A", "062A 062C 0649", "062A 062E 064A", "062A 062E 0649", "062A 0645 064A", "062A 0645 0649", "062C 0645 064A", "062C 062D 0649", "062C 0645 0649", "0633 062E 0649", "0635 062D 064A", "0634 062D 064A", "0636 062D 064A", "0644 062C 064A", "0644 0645 064A", "064A 062D 064A", "064A 062C 064A", "064A 0645 064A", "0645 0645 064A", "0642 0645 064A", "0646 062D 064A", "0642 0645 062D", "0644 062D 0645", "0639 0645 064A", "0643 0645 064A", "0646 062C 062D", "0645 062E 064A", "0644 062C 0645", "0643 0645 0645", "0644 062C 0645", "0646 062C 062D", "062C 062D 064A", "062D 062C 064A", "0645 062C 064A", "0641 0645 064A", "0628 062D 064A", "0643 0645 0645", "0639 062C 0645", "0635 0645 0645", "0633 062E 064A", "0646 062C 064A", "0635 0644 06D2", "0642 0644 06D2", "0627 0644 0644 0647", "0627 0643 0628 0631", "0645 062D 0645 062F", "0635 0644 0639 0645", "0631 0633 0648 0644", "0639 0644 064A 0647", "0648 0633 0644 0645", "0635 0644 0649", "0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645", "062C 0644 0020 062C 0644 0627 0644 0647", "0631 06CC 0627 0644", "002C", "3001", "3002", "003A", "003B", "0021", "003F", "3016", "3017", "2026", "2025", "2014", "2013", "005F", "005F", "0028", "0029", "007B", "007D", "3014", "3015", "3010", "3011", "300A", "300B", "3008", "3009", "300C", "300D", "300E", "300F", "005B", "005D", "203E", "203E", "203E", "203E", "005F", "005F", "005F", "002C", "3001", "002E", "003B", "003A", "003F", "0021", "2014", "0028", "0029", "007B", "007D", "3014", "3015", "0023", "0026", "002A", "002B", "002D", "003C", "003E", "003D", "005C", "0024", "0025", "0040", "0020 064B", "0640 064B", "0020 064C", "0020 064D", "0020 064E", "0640 064E", "0020 064F", "0640 064F", "0020 0650", "0640 0650", "0020 0651", "0640 0651", "0020 0652", "0640 0652", "0621", "0622", "0622", "0623", "0623", "0624", "0624", "0625", "0625", "0626", "0626", "0626", "0626", "0627", "0627", "0628", "0628", "0628", "0628", "0629", "0629", "062A", "062A", "062A", "062A", "062B", "062B", "062B", "062B", "062C", "062C", "062C", "062C", "062D", "062D", "062D", "062D", "062E", "062E", "062E", "062E", "062F", "062F", "0630", "0630", "0631", "0631", "0632", "0632", "0633", "0633", "0633", "0633", "0634", "0634", "0634", "0634", "0635", "0635", "0635", "0635", "0636", "0636", "0636", "0636", "0637", "0637", "0637", "0637", "0638", "0638", "0638", "0638", "0639", "0639", "0639", "0639", "063A", "063A", "063A", "063A", "0641", "0641", "0641", "0641", "0642", "0642", "0642", "0642", "0643", "0643", "0643", "0643", "0644", "0644", "0644", "0644", "0645", "0645", "0645", "0645", "0646", "0646", "0646", "0646", "0647", "0647", "0647", "0647", "0648", "0648", "0649", "0649", "064A", "064A", "064A", "064A", "0644 0622", "0644 0622", "0644 0623", "0644 0623", "0644 0625", "0644 0625", "0644 0627", "0644 0627", "0021", "0022", "0023", "0024", "0025", "0026", "0027", "0028", "0029", "002A", "002B", "002C", "002D", "002E", "002F", "0030", "0031", "0032", "0033", "0034", "0035", "0036", "0037", "0038", "0039", "003A", "003B", "003C", "003D", "003E", "003F", "0040", "0041", "0042", "0043", "0044", "0045", "0046", "0047", "0048", "0049", "004A", "004B", "004C", "004D", "004E", "004F", "0050", "0051", "0052", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "005A", "005B", "005C", "005D", "005E", "005F", "0060", "0061", "0062", "0063", "0064", "0065", "0066", "0067", "0068", "0069", "006A", "006B", "006C", "006D", "006E", "006F", "0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0079", "007A", "007B", "007C", "007D", "007E", "2985", "2986", "3002", "300C", "300D", "3001", "30FB", "30F2", "30A1", "30A3", "30A5", "30A7", "30A9", "30E3", "30E5", "30E7", "30C3", "30FC", "30A2", "30A4", "30A6", "30A8", "30AA", "30AB", "30AD", "30AF", "30B1", "30B3", "30B5", "30B7", "30B9", "30BB", "30BD", "30BF", "30C1", "30C4", "30C6", "30C8", "30CA", "30CB", "30CC", "30CD", "30CE", "30CF", "30D2", "30D5", "30D8", "30DB", "30DE", "30DF", "30E0", "30E1", "30E2", "30E4", "30E6", "30E8", "30E9", "30EA", "30EB", "30EC", "30ED", "30EF", "30F3", "3099", "309A", "3164", "3131", "3132", "3133", "3134", "3135", "3136", "3137", "3138", "3139", "313A", "313B", "313C", "313D", "313E", "313F", "3140", "3141", "3142", "3143", "3144", "3145", "3146", "3147", "3148", "3149", "314A", "314B", "314C", "314D", "314E", "314F", "3150", "3151", "3152", "3153", "3154", "3155", "3156", "3157", "3158", "3159", "315A", "315B", "315C", "315D", "315E", "315F", "3160", "3161", "3162", "3163", "00A2", "00A3", "00AC", "00AF", "00A6", "00A5", "20A9", "2502", "2190", "2191", "2192", "2193", "25A0", "25CB", "11099 110BA", "1109B 110BA", "110A5 110BA", "11131 11127", "11132 11127", "11347 1133E", "11347 11357", "114B9 114BA", "114B9 114B0", "114B9 114BD", "115B8 115AF", "115B9 115AF", "1D157 1D165", "1D158 1D165", "1D15F 1D16E", "1D15F 1D16F", "1D15F 1D170", "1D15F 1D171", "1D15F 1D172", "1D1B9 1D165", "1D1BA 1D165", "1D1BB 1D16E", "1D1BC 1D16E", "1D1BB 1D16F", "1D1BC 1D16F", "0041", "0042", "0043", "0044", "0045", "0046", "0047", "0048", "0049", "004A", "004B", "004C", "004D", "004E", "004F", "0050", "0051", "0052", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "005A", "0061", "0062", "0063", "0064", "0065", "0066", "0067", "0068", "0069", "006A", "006B", "006C", "006D", "006E", "006F", "0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0079", "007A", "0041", "0042", "0043", "0044", "0045", "0046", "0047", "0048", "0049", "004A", "004B", "004C", "004D", "004E", "004F", "0050", "0051", "0052", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "005A", "0061", "0062", "0063", "0064", "0065", "0066", "0067", "0069", "006A", "006B", "006C", "006D", "006E", "006F", "0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0079", "007A", "0041", "0042", "0043", "0044", "0045", "0046", "0047", "0048", "0049", "004A", "004B", "004C", "004D", "004E", "004F", "0050", "0051", "0052", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "005A", "0061", "0062", "0063", "0064", "0065", "0066", "0067", "0068", "0069", "006A", "006B", "006C", "006D", "006E", "006F", "0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0079", "007A", "0041", "0043", "0044", "0047", "004A", "004B", "004E", "004F", "0050", "0051", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "005A", "0061", "0062", "0063", "0064", "0066", "0068", "0069", "006A", "006B", "006C", "006D", "006E", "0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0079", "007A", "0041", "0042", "0043", "0044", "0045", "0046", "0047", "0048", "0049", "004A", "004B", "004C", "004D", "004E", "004F", "0050", "0051", "0052", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "005A", "0061", "0062", "0063", "0064", "0065", "0066", "0067", "0068", "0069", "006A", "006B", "006C", "006D", "006E", "006F", "0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0079", "007A", "0041", "0042", "0044", "0045", "0046", "0047", "004A", "004B", "004C", "004D", "004E", "004F", "0050", "0051", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "0061", "0062", "0063", "0064", "0065", "0066", "0067", "0068", "0069", "006A", "006B", "006C", "006D", "006E", "006F", "0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0079", "007A", "0041", "0042", "0044", "0045", "0046", "0047", "0049", "004A", "004B", "004C", "004D", "004F", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "0061", "0062", "0063", "0064", "0065", "0066", "0067", "0068", "0069", "006A", "006B", "006C", "006D", "006E", "006F", "0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0079", "007A", "0041", "0042", "0043", "0044", "0045", "0046", "0047", "0048", "0049", "004A", "004B", "004C", "004D", "004E", "004F", "0050", "0051", "0052", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "005A", "0061", "0062", "0063", "0064", "0065", "0066", "0067", "0068", "0069", "006A", "006B", "006C", "006D", "006E", "006F", "0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0079", "007A", "0041", "0042", "0043", "0044", "0045", "0046", "0047", "0048", "0049", "004A", "004B", "004C", "004D", "004E", "004F", "0050", "0051", "0052", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "005A", "0061", "0062", "0063", "0064", "0065", "0066", "0067", "0068", "0069", "006A", "006B", "006C", "006D", "006E", "006F", "0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0079", "007A", "0041", "0042", "0043", "0044", "0045", "0046", "0047", "0048", "0049", "004A", "004B", "004C", "004D", "004E", "004F", "0050", "0051", "0052", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "005A", "0061", "0062", "0063", "0064", "0065", "0066", "0067", "0068", "0069", "006A", "006B", "006C", "006D", "006E", "006F", "0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0079", "007A", "0041", "0042", "0043", "0044", "0045", "0046", "0047", "0048", "0049", "004A", "004B", "004C", "004D", "004E", "004F", "0050", "0051", "0052", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "005A", "0061", "0062", "0063", "0064", "0065", "0066", "0067", "0068", "0069", "006A", "006B", "006C", "006D", "006E", "006F", "0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0079", "007A", "0041", "0042", "0043", "0044", "0045", "0046", "0047", "0048", "0049", "004A", "004B", "004C", "004D", "004E", "004F", "0050", "0051", "0052", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "005A", "0061", "0062", "0063", "0064", "0065", "0066", "0067", "0068", "0069", "006A", "006B", "006C", "006D", "006E", "006F", "0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0079", "007A", "0041", "0042", "0043", "0044", "0045", "0046", "0047", "0048", "0049", "004A", "004B", "004C", "004D", "004E", "004F", "0050", "0051", "0052", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "005A", "0061", "0062", "0063", "0064", "0065", "0066", "0067", "0068", "0069", "006A", "006B", "006C", "006D", "006E", "006F", "0070", "0071", "0072", "0073", "0074", "0075", "0076", "0077", "0078", "0079", "007A", "0131", "0237", "0391", "0392", "0393", "0394", "0395", "0396", "0397", "0398", "0399", "039A", "039B", "039C", "039D", "039E", "039F", "03A0", "03A1", "03F4", "03A3", "03A4", "03A5", "03A6", "03A7", "03A8", "03A9", "2207", "03B1", "03B2", "03B3", "03B4", "03B5", "03B6", "03B7", "03B8", "03B9", "03BA", "03BB", "03BC", "03BD", "03BE", "03BF", "03C0", "03C1", "03C2", "03C3", "03C4", "03C5", "03C6", "03C7", "03C8", "03C9", "2202", "03F5", "03D1", "03F0", "03D5", "03F1", "03D6", "0391", "0392", "0393", "0394", "0395", "0396", "0397", "0398", "0399", "039A", "039B", "039C", "039D", "039E", "039F", "03A0", "03A1", "03F4", "03A3", "03A4", "03A5", "03A6", "03A7", "03A8", "03A9", "2207", "03B1", "03B2", "03B3", "03B4", "03B5", "03B6", "03B7", "03B8", "03B9", "03BA", "03BB", "03BC", "03BD", "03BE", "03BF", "03C0", "03C1", "03C2", "03C3", "03C4", "03C5", "03C6", "03C7", "03C8", "03C9", "2202", "03F5", "03D1", "03F0", "03D5", "03F1", "03D6", "0391", "0392", "0393", "0394", "0395", "0396", "0397", "0398", "0399", "039A", "039B", "039C", "039D", "039E", "039F", "03A0", "03A1", "03F4", "03A3", "03A4", "03A5", "03A6", "03A7", "03A8", "03A9", "2207", "03B1", "03B2", "03B3", "03B4", "03B5", "03B6", "03B7", "03B8", "03B9", "03BA", "03BB", "03BC", "03BD", "03BE", "03BF", "03C0", "03C1", "03C2", "03C3", "03C4", "03C5", "03C6", "03C7", "03C8", "03C9", "2202", "03F5", "03D1", "03F0", "03D5", "03F1", "03D6", "0391", "0392", "0393", "0394", "0395", "0396", "0397", "0398", "0399", "039A", "039B", "039C", "039D", "039E", "039F", "03A0", "03A1", "03F4", "03A3", "03A4", "03A5", "03A6", "03A7", "03A8", "03A9", "2207", "03B1", "03B2", "03B3", "03B4", "03B5", "03B6", "03B7", "03B8", "03B9", "03BA", "03BB", "03BC", "03BD", "03BE", "03BF", "03C0", "03C1", "03C2", "03C3", "03C4", "03C5", "03C6", "03C7", "03C8", "03C9", "2202", "03F5", "03D1", "03F0", "03D5", "03F1", "03D6", "0391", "0392", "0393", "0394", "0395", "0396", "0397", "0398", "0399", "039A", "039B", "039C", "039D", "039E", "039F", "03A0", "03A1", "03F4", "03A3", "03A4", "03A5", "03A6", "03A7", "03A8", "03A9", "2207", "03B1", "03B2", "03B3", "03B4", "03B5", "03B6", "03B7", "03B8", "03B9", "03BA", "03BB", "03BC", "03BD", "03BE", "03BF", "03C0", "03C1", "03C2", "03C3", "03C4", "03C5", "03C6", "03C7", "03C8", "03C9", "2202", "03F5", "03D1", "03F0", "03D5", "03F1", "03D6", "03DC", "03DD", "0030", "0031", "0032", "0033", "0034", "0035", "0036", "0037", "0038", "0039", "0030", "0031", "0032", "0033", "0034", "0035", "0036", "0037", "0038", "0039", "0030", "0031", "0032", "0033", "0034", "0035", "0036", "0037", "0038", "0039", "0030", "0031", "0032", "0033", "0034", "0035", "0036", "0037", "0038", "0039", "0030", "0031", "0032", "0033", "0034", "0035", "0036", "0037", "0038", "0039", "0627", "0628", "062C", "062F", "0648", "0632", "062D", "0637", "064A", "0643", "0644", "0645", "0646", "0633", "0639", "0641", "0635", "0642", "0631", "0634", "062A", "062B", "062E", "0630", "0636", "0638", "063A", "066E", "06BA", "06A1", "066F", "0628", "062C", "0647", "062D", "064A", "0643", "0644", "0645", "0646", "0633", "0639", "0641", "0635", "0642", "0634", "062A", "062B", "062E", "0636", "063A", "062C", "062D", "064A", "0644", "0646", "0633", "0639", "0635", "0642", "0634", "062E", "0636", "063A", "06BA", "066F", "0628", "062C", "0647", "062D", "0637", "064A", "0643", "0645", "0646", "0633", "0639", "0641", "0635", "0642", "0634", "062A", "062B", "062E", "0636", "0638", "063A", "066E", "06A1", "0627", "0628", "062C", "062F", "0647", "0648", "0632", "062D", "0637", "064A", "0644", "0645", "0646", "0633", "0639", "0641", "0635", "0642", "0631", "0634", "062A", "062B", "062E", "0630", "0636", "0638", "063A", "0628", "062C", "062F", "0648", "0632", "062D", "0637", "064A", "0644", "0645", "0646", "0633", "0639", "0641", "0635", "0642", "0631", "0634", "062A", "062B", "062E", "0630", "0636", "0638", "063A", "0030 002E", "0030 002C", "0031 002C", "0032 002C", "0033 002C", "0034 002C", "0035 002C", "0036 002C", "0037 002C", "0038 002C", "0039 002C", "0028 0041 0029", "0028 0042 0029", "0028 0043 0029", "0028 0044 0029", "0028 0045 0029", "0028 0046 0029", "0028 0047 0029", "0028 0048 0029", "0028 0049 0029", "0028 004A 0029", "0028 004B 0029", "0028 004C 0029", "0028 004D 0029", "0028 004E 0029", "0028 004F 0029", "0028 0050 0029", "0028 0051 0029", "0028 0052 0029", "0028 0053 0029", "0028 0054 0029", "0028 0055 0029", "0028 0056 0029", "0028 0057 0029", "0028 0058 0029", "0028 0059 0029", "0028 005A 0029", "3014 0053 3015", "0043", "0052", "0043 0044", "0057 005A", "0041", "0042", "0043", "0044", "0045", "0046", "0047", "0048", "0049", "004A", "004B", "004C", "004D", "004E", "004F", "0050", "0051", "0052", "0053", "0054", "0055", "0056", "0057", "0058", "0059", "005A", "0048 0056", "004D 0056", "0053 0044", "0053 0053", "0050 0050 0056", "0057 0043", "004D 0043", "004D 0044", "0044 004A", "307B 304B", "30B3 30B3", "30B5", "624B", "5B57", "53CC", "30C7", "4E8C", "591A", "89E3", "5929", "4EA4", "6620", "7121", "6599", "524D", "5F8C", "518D", "65B0", "521D", "7D42", "751F", "8CA9", "58F0", "5439", "6F14", "6295", "6355", "4E00", "4E09", "904A", "5DE6", "4E2D", "53F3", "6307", "8D70", "6253", "7981", "7A7A", "5408", "6E80", "6709", "6708", "7533", "5272", "55B6", "914D", "3014 672C 3015", "3014 4E09 3015", "3014 4E8C 3015", "3014 5B89 3015", "3014 70B9 3015", "3014 6253 3015", "3014 76D7 3015", "3014 52DD 3015", "3014 6557 3015", "5F97", "53EF", "4E3D", "4E38", "4E41", "20122", "4F60", "4FAE", "4FBB", "5002", "507A", "5099", "50E7", "50CF", "349E", "2063A", "514D", "5154", "5164", "5177", "2051C", "34B9", "5167", "518D", "2054B", "5197", "51A4", "4ECC", "51AC", "51B5", "291DF", "51F5", "5203", "34DF", "523B", "5246", "5272", "5277", "3515", "52C7", "52C9", "52E4", "52FA", "5305", "5306", "5317", "5349", "5351", "535A", "5373", "537D", "537F", "537F", "537F", "20A2C", "7070", "53CA", "53DF", "20B63", "53EB", "53F1", "5406", "549E", "5438", "5448", "5468", "54A2", "54F6", "5510", "5553", "5563", "5584", "5584", "5599", "55AB", "55B3", "55C2", "5716", "5606", "5717", "5651", "5674", "5207", "58EE", "57CE", "57F4", "580D", "578B", "5832", "5831", "58AC", "214E4", "58F2", "58F7", "5906", "591A", "5922", "5962", "216A8", "216EA", "59EC", "5A1B", "5A27", "59D8", "5A66", "36EE", "36FC", "5B08", "5B3E", "5B3E", "219C8", "5BC3", "5BD8", "5BE7", "5BF3", "21B18", "5BFF", "5C06", "5F53", "5C22", "3781", "5C60", "5C6E", "5CC0", "5C8D", "21DE4", "5D43", "21DE6", "5D6E", "5D6B", "5D7C", "5DE1", "5DE2", "382F", "5DFD", "5E28", "5E3D", "5E69", "3862", "22183", "387C", "5EB0", "5EB3", "5EB6", "5ECA", "2A392", "5EFE", "22331", "22331", "8201", "5F22", "5F22", "38C7", "232B8", "261DA", "5F62", "5F6B", "38E3", "5F9A", "5FCD", "5FD7", "5FF9", "6081", "393A", "391C", "6094", "226D4", "60C7", "6148", "614C", "614E", "614C", "617A", "618E", "61B2", "61A4", "61AF", "61DE", "61F2", "61F6", "6210", "621B", "625D", "62B1", "62D4", "6350", "22B0C", "633D", "62FC", "6368", "6383", "63E4", "22BF1", "6422", "63C5", "63A9", "3A2E", "6469", "647E", "649D", "6477", "3A6C", "654F", "656C", "2300A", "65E3", "66F8", "6649", "3B19", "6691", "3B08", "3AE4", "5192", "5195", "6700", "669C", "80AD", "43D9", "6717", "671B", "6721", "675E", "6753", "233C3", "3B49", "67FA", "6785", "6852", "6885", "2346D", "688E", "681F", "6914", "3B9D", "6942", "69A3", "69EA", "6AA8", "236A3", "6ADB", "3C18", "6B21", "238A7", "6B54", "3C4E", "6B72", "6B9F", "6BBA", "6BBB", "23A8D", "21D0B", "23AFA", "6C4E", "23CBC", "6CBF", "6CCD", "6C67", "6D16", "6D3E", "6D77", "6D41", "6D69", "6D78", "6D85", "23D1E", "6D34", "6E2F", "6E6E", "3D33", "6ECB", "6EC7", "23ED1", "6DF9", "6F6E", "23F5E", "23F8E", "6FC6", "7039", "701E", "701B", "3D96", "704A", "707D", "7077", "70AD", "20525", "7145", "24263", "719C", "243AB", "7228", "7235", "7250", "24608", "7280", "7295", "24735", "24814", "737A", "738B", "3EAC", "73A5", "3EB8", "3EB8", "7447", "745C", "7471", "7485", "74CA", "3F1B", "7524", "24C36", "753E", "24C92", "7570", "2219F", "7610", "24FA1", "24FB8", "25044", "3FFC", "4008", "76F4", "250F3", "250F2", "25119", "25133", "771E", "771F", "771F", "774A", "4039", "778B", "4046", "4096", "2541D", "784E", "788C", "78CC", "40E3", "25626", "7956", "2569A", "256C5", "798F", "79EB", "412F", "7A40", "7A4A", "7A4F", "2597C", "25AA7", "25AA7", "7AEE", "4202", "25BAB", "7BC6", "7BC9", "4227", "25C80", "7CD2", "42A0", "7CE8", "7CE3", "7D00", "25F86", "7D63", "4301", "7DC7", "7E02", "7E45", "4334", "26228", "26247", "4359", "262D9", "7F7A", "2633E", "7F95", "7FFA", "8005", "264DA", "26523", "8060", "265A8", "8070", "2335F", "43D5", "80B2", "8103", "440B", "813E", "5AB5", "267A7", "267B5", "23393", "2339C", "8201", "8204", "8F9E", "446B", "8291", "828B", "829D", "52B3", "82B1", "82B3", "82BD", "82E6", "26B3C", "82E5", "831D", "8363", "83AD", "8323", "83BD", "83E7", "8457", "8353", "83CA", "83CC", "83DC", "26C36", "26D6B", "26CD5", "452B", "84F1", "84F3", "8516", "273CA", "8564", "26F2C", "455D", "4561", "26FB1", "270D2", "456B", "8650", "865C", "8667", "8669", "86A9", "8688", "870E", "86E2", "8779", "8728", "876B", "8786", "45D7", "87E1", "8801", "45F9", "8860", "8863", "27667", "88D7", "88DE", "4635", "88FA", "34BB", "278AE", "27966", "46BE", "46C7", "8AA0", "8AED", "8B8A", "8C55", "27CA8", "8CAB", "8CC1", "8D1B", "8D77", "27F2F", "20804", "8DCB", "8DBC", "8DF0", "208DE", "8ED4", "8F38", "285D2", "285ED", "9094", "90F1", "9111", "2872E", "911B", "9238", "92D7", "92D8", "927C", "93F9", "9415", "28BFA", "958B", "4995", "95B7", "28D77", "49E6", "96C3", "5DB2", "9723", "29145", "2921A", "4A6E", "4A76", "97E0", "2940A", "4AB2", "29496", "980B", "980B", "9829", "295B6", "98E2", "4B33", "9929", "99A7", "99C2", "99FE", "4BCE", "29B30", "9B12", "9C40", "9CFD", "4CCE", "4CED", "9D67", "2A0CE", "4CF8", "2A105", "2A20E", "2A291", "9EBB", "4D56", "9EF9", "9EFE", "9F05", "9F0F", "9F16", "9F3B", "2A600", }; static const char *Joining_Group_enums[100] = { "No_Joining_Group", "YEH", "ALEF", "WAW", "BEH", "TEH MARBUTA", "HAH", "DAL", "REH", "SEEN", "SAD", "TAH", "AIN", "GAF", "FARSI YEH", "FEH", "QAF", "KAF", "LAM", "MEEM", "NOON", "HEH", "SWASH KAF", "NYA", "KNOTTED HEH", "HEH GOAL", "TEH MARBUTA GOAL", "YEH WITH TAIL", "YEH BARREE", "ALAPH", "BETH", "GAMAL", "DALATH RISH", "HE", "SYRIAC WAW", "ZAIN", "HETH", "TETH", "YUDH", "YUDH HE", "KAPH", "LAMADH", "MIM", "NUN", "SEMKATH", "FINAL SEMKATH", "E", "PE", "REVERSED PE", "SADHE", "QAPH", "SHIN", "TAW", "ZHAIN", "KHAPH", "FE", "BURUSHASKI YEH BARREE", "MALAYALAM NGA", "MALAYALAM JA", "MALAYALAM NYA", "MALAYALAM TTA", "MALAYALAM NNA", "MALAYALAM NNNA", "MALAYALAM BHA", "MALAYALAM RA", "MALAYALAM LLA", "MALAYALAM LLLA", "MALAYALAM SSA", "ROHINGYA YEH", "STRAIGHT WAW", "AFRICAN FEH", "AFRICAN QAF", "AFRICAN NOON", "MANICHAEAN ALEPH", "MANICHAEAN BETH", "MANICHAEAN GIMEL", "MANICHAEAN DALETH", "MANICHAEAN WAW", "MANICHAEAN ZAYIN", "MANICHAEAN HETH", "MANICHAEAN TETH", "MANICHAEAN YODH", "MANICHAEAN KAPH", "MANICHAEAN LAMEDH", "MANICHAEAN DHAMEDH", "MANICHAEAN THAMEDH", "MANICHAEAN MEM", "MANICHAEAN NUN", "MANICHAEAN SAMEKH", "MANICHAEAN AYIN", "MANICHAEAN PE", "MANICHAEAN SADHE", "MANICHAEAN QOPH", "MANICHAEAN RESH", "MANICHAEAN TAW", "MANICHAEAN ONE", "MANICHAEAN FIVE", "MANICHAEAN TEN", "MANICHAEAN TWENTY", "MANICHAEAN HUNDRED", }; static const int Bidi_Mirroring_Glyph_enums[365] = { 0, 41, 40, 62, 60, 93, 91, 125, 123, 187, 171, 3899, 3898, 3901, 3900, 5788, 5787, 8250, 8249, 8262, 8261, 8318, 8317, 8334, 8333, 8715, 8716, 8717, 8712, 8713, 8714, 10741, 8765, 8764, 8909, 8787, 8786, 8789, 8788, 8805, 8804, 8807, 8806, 8809, 8808, 8811, 8810, 8815, 8814, 8817, 8816, 8819, 8818, 8821, 8820, 8823, 8822, 8825, 8824, 8827, 8826, 8829, 8828, 8831, 8830, 8833, 8832, 8835, 8834, 8837, 8836, 8839, 8838, 8841, 8840, 8843, 8842, 8848, 8847, 8850, 8849, 10680, 8867, 8866, 10974, 10980, 10979, 10981, 8881, 8880, 8883, 8882, 8885, 8884, 8887, 8886, 8906, 8905, 8908, 8907, 8771, 8913, 8912, 8919, 8918, 8921, 8920, 8923, 8922, 8925, 8924, 8927, 8926, 8929, 8928, 8931, 8930, 8933, 8932, 8935, 8934, 8937, 8936, 8939, 8938, 8941, 8940, 8945, 8944, 8954, 8955, 8956, 8957, 8958, 8946, 8947, 8948, 8950, 8951, 8969, 8968, 8971, 8970, 9002, 9001, 10089, 10088, 10091, 10090, 10093, 10092, 10095, 10094, 10097, 10096, 10099, 10098, 10101, 10100, 10180, 10179, 10182, 10181, 10185, 10184, 10189, 10187, 10198, 10197, 10206, 10205, 10211, 10210, 10213, 10212, 10215, 10214, 10217, 10216, 10219, 10218, 10221, 10220, 10223, 10222, 10628, 10627, 10630, 10629, 10632, 10631, 10634, 10633, 10636, 10635, 10640, 10639, 10638, 10637, 10642, 10641, 10644, 10643, 10646, 10645, 10648, 10647, 8856, 10689, 10688, 10693, 10692, 10704, 10703, 10706, 10705, 10709, 10708, 10713, 10712, 10715, 10714, 8725, 10745, 10744, 10749, 10748, 10796, 10795, 10798, 10797, 10805, 10804, 10813, 10812, 10853, 10852, 10874, 10873, 10878, 10877, 10880, 10879, 10882, 10881, 10884, 10883, 10892, 10891, 10898, 10897, 10900, 10899, 10902, 10901, 10904, 10903, 10906, 10905, 10908, 10907, 10914, 10913, 10919, 10918, 10921, 10920, 10923, 10922, 10925, 10924, 10928, 10927, 10932, 10931, 10940, 10939, 10942, 10941, 10944, 10943, 10946, 10945, 10948, 10947, 10950, 10949, 10958, 10957, 10960, 10959, 10962, 10961, 10964, 10963, 10966, 10965, 8870, 8873, 8872, 8875, 10989, 10988, 11000, 10999, 11002, 11001, 11779, 11778, 11781, 11780, 11786, 11785, 11789, 11788, 11805, 11804, 11809, 11808, 11811, 11810, 11813, 11812, 11815, 11814, 11817, 11816, 12297, 12296, 12299, 12298, 12301, 12300, 12303, 12302, 12305, 12304, 12309, 12308, 12311, 12310, 12313, 12312, 12315, 12314, 65114, 65113, 65116, 65115, 65118, 65117, 65125, 65124, 65289, 65288, 65310, 65308, 65341, 65339, 65373, 65371, 65376, 65375, 65379, 65378, }; static const char *Block_enums[281] = { "No_Block", "Basic Latin", "Latin-1 Supplement", "Latin Extended-A", "Latin Extended-B", "IPA Extensions", "Spacing Modifier Letters", "Combining Diacritical Marks", "Greek and Coptic", "Cyrillic", "Cyrillic Supplement", "Armenian", "Hebrew", "Arabic", "Syriac", "Arabic Supplement", "Thaana", "NKo", "Samaritan", "Mandaic", "Syriac Supplement", "Arabic Extended-A", "Devanagari", "Bengali", "Gurmukhi", "Gujarati", "Oriya", "Tamil", "Telugu", "Kannada", "Malayalam", "Sinhala", "Thai", "Lao", "Tibetan", "Myanmar", "Georgian", "Hangul Jamo", "Ethiopic", "Ethiopic Supplement", "Cherokee", "Unified Canadian Aboriginal Syllabics", "Ogham", "Runic", "Tagalog", "Hanunoo", "Buhid", "Tagbanwa", "Khmer", "Mongolian", "Unified Canadian Aboriginal Syllabics Extended", "Limbu", "Tai Le", "New Tai Lue", "Khmer Symbols", "Buginese", "Tai Tham", "Combining Diacritical Marks Extended", "Balinese", "Sundanese", "Batak", "Lepcha", "Ol Chiki", "Cyrillic Extended-C", "Sundanese Supplement", "Vedic Extensions", "Phonetic Extensions", "Phonetic Extensions Supplement", "Combining Diacritical Marks Supplement", "Latin Extended Additional", "Greek Extended", "General Punctuation", "Superscripts and Subscripts", "Currency Symbols", "Combining Diacritical Marks for Symbols", "Letterlike Symbols", "Number Forms", "Arrows", "Mathematical Operators", "Miscellaneous Technical", "Control Pictures", "Optical Character Recognition", "Enclosed Alphanumerics", "Box Drawing", "Block Elements", "Geometric Shapes", "Miscellaneous Symbols", "Dingbats", "Miscellaneous Mathematical Symbols-A", "Supplemental Arrows-A", "Braille Patterns", "Supplemental Arrows-B", "Miscellaneous Mathematical Symbols-B", "Supplemental Mathematical Operators", "Miscellaneous Symbols and Arrows", "Glagolitic", "Latin Extended-C", "Coptic", "Georgian Supplement", "Tifinagh", "Ethiopic Extended", "Cyrillic Extended-A", "Supplemental Punctuation", "CJK Radicals Supplement", "Kangxi Radicals", "Ideographic Description Characters", "CJK Symbols and Punctuation", "Hiragana", "Katakana", "Bopomofo", "Hangul Compatibility Jamo", "Kanbun", "Bopomofo Extended", "CJK Strokes", "Katakana Phonetic Extensions", "Enclosed CJK Letters and Months", "CJK Compatibility", "CJK Unified Ideographs Extension A", "Yijing Hexagram Symbols", "CJK Unified Ideographs", "Yi Syllables", "Yi Radicals", "Lisu", "Vai", "Cyrillic Extended-B", "Bamum", "Modifier Tone Letters", "Latin Extended-D", "Syloti Nagri", "Common Indic Number Forms", "Phags-pa", "Saurashtra", "Devanagari Extended", "Kayah Li", "Rejang", "Hangul Jamo Extended-A", "Javanese", "Myanmar Extended-B", "Cham", "Myanmar Extended-A", "Tai Viet", "Meetei Mayek Extensions", "Ethiopic Extended-A", "Latin Extended-E", "Cherokee Supplement", "Meetei Mayek", "Hangul Syllables", "Hangul Jamo Extended-B", "High Surrogates", "High Private Use Surrogates", "Low Surrogates", "Private Use Area", "CJK Compatibility Ideographs", "Alphabetic Presentation Forms", "Arabic Presentation Forms-A", "Variation Selectors", "Vertical Forms", "Combining Half Marks", "CJK Compatibility Forms", "Small Form Variants", "Arabic Presentation Forms-B", "Halfwidth and Fullwidth Forms", "Specials", "Linear B Syllabary", "Linear B Ideograms", "Aegean Numbers", "Ancient Greek Numbers", "Ancient Symbols", "Phaistos Disc", "Lycian", "Carian", "Coptic Epact Numbers", "Old Italic", "Gothic", "Old Permic", "Ugaritic", "Old Persian", "Deseret", "Shavian", "Osmanya", "Osage", "Elbasan", "Caucasian Albanian", "Linear A", "Cypriot Syllabary", "Imperial Aramaic", "Palmyrene", "Nabataean", "Hatran", "Phoenician", "Lydian", "Meroitic Hieroglyphs", "Meroitic Cursive", "Kharoshthi", "Old South Arabian", "Old North Arabian", "Manichaean", "Avestan", "Inscriptional Parthian", "Inscriptional Pahlavi", "Psalter Pahlavi", "Old Turkic", "Old Hungarian", "Rumi Numeral Symbols", "Brahmi", "Kaithi", "Sora Sompeng", "Chakma", "Mahajani", "Sharada", "Sinhala Archaic Numbers", "Khojki", "Multani", "Khudawadi", "Grantha", "Newa", "Tirhuta", "Siddham", "Modi", "Mongolian Supplement", "Takri", "Ahom", "Warang Citi", "Zanabazar Square", "Soyombo", "Pau Cin Hau", "Bhaiksuki", "Marchen", "Masaram Gondi", "Cuneiform", "Cuneiform Numbers and Punctuation", "Early Dynastic Cuneiform", "Egyptian Hieroglyphs", "Anatolian Hieroglyphs", "Bamum Supplement", "Mro", "Bassa Vah", "Pahawh Hmong", "Miao", "Ideographic Symbols and Punctuation", "Tangut", "Tangut Components", "Kana Supplement", "Kana Extended-A", "Nushu", "Duployan", "Shorthand Format Controls", "Byzantine Musical Symbols", "Musical Symbols", "Ancient Greek Musical Notation", "Tai Xuan Jing Symbols", "Counting Rod Numerals", "Mathematical Alphanumeric Symbols", "Sutton SignWriting", "Glagolitic Supplement", "Mende Kikakui", "Adlam", "Arabic Mathematical Alphabetic Symbols", "Mahjong Tiles", "Domino Tiles", "Playing Cards", "Enclosed Alphanumeric Supplement", "Enclosed Ideographic Supplement", "Miscellaneous Symbols and Pictographs", "Emoticons", "Ornamental Dingbats", "Transport and Map Symbols", "Alchemical Symbols", "Geometric Shapes Extended", "Supplemental Arrows-C", "Supplemental Symbols and Pictographs", "CJK Unified Ideographs Extension B", "CJK Unified Ideographs Extension C", "CJK Unified Ideographs Extension D", "CJK Unified Ideographs Extension E", "CJK Unified Ideographs Extension F", "CJK Compatibility Ideographs Supplement", "Tags", "Variation Selectors Supplement", "Supplementary Private Use Area-A", "Supplementary Private Use Area-B", }; static const char *East_Asian_Width_enums[6] = { "N", "A", "H", "W", "F", "Na", }; static const char *Numeric_Value_enums[136] = { "NaN", "-0.5", "0.0", "0.00625", "0.025", "0.0375", "0.05", "0.0625", "0.08333333", "0.1", "0.11111111", "0.125", "0.14285714", "0.15", "0.16666667", "0.1875", "0.2", "0.25", "0.33333333", "0.375", "0.4", "0.41666667", "0.5", "0.58333333", "0.6", "0.625", "0.66666667", "0.75", "0.8", "0.83333333", "0.875", "0.91666667", "1.0", "1.5", "2.0", "2.5", "3.0", "3.5", "4.0", "4.5", "5.0", "5.5", "6.0", "6.5", "7.0", "7.5", "8.0", "8.5", "9.0", "10.0", "11.0", "12.0", "13.0", "14.0", "15.0", "16.0", "17.0", "18.0", "19.0", "20.0", "21.0", "22.0", "23.0", "24.0", "25.0", "26.0", "27.0", "28.0", "29.0", "30.0", "31.0", "32.0", "33.0", "34.0", "35.0", "36.0", "37.0", "38.0", "39.0", "40.0", "41.0", "42.0", "43.0", "44.0", "45.0", "46.0", "47.0", "48.0", "49.0", "50.0", "60.0", "70.0", "80.0", "90.0", "100.0", "200.0", "300.0", "400.0", "500.0", "600.0", "700.0", "800.0", "900.0", "1000.0", "2000.0", "3000.0", "4000.0", "5000.0", "6000.0", "7000.0", "8000.0", "9000.0", "10000.0", "20000.0", "30000.0", "40000.0", "50000.0", "60000.0", "70000.0", "80000.0", "90000.0", "100000.0", "200000.0", "216000.0", "300000.0", "400000.0", "432000.0", "500000.0", "600000.0", "700000.0", "800000.0", "900000.0", "1000000.0", "100000000.0", "10000000000.0", "1000000000000.0", }; static const char *Script_enums[142] = { "Unknown", "Common", "Latin", "Greek", "Cyrillic", "Armenian", "Hebrew", "Arabic", "Syriac", "Thaana", "Devanagari", "Bengali", "Gurmukhi", "Gujarati", "Oriya", "Tamil", "Telugu", "Kannada", "Malayalam", "Sinhala", "Thai", "Lao", "Tibetan", "Myanmar", "Georgian", "Hangul", "Ethiopic", "Cherokee", "Canadian_Aboriginal", "Ogham", "Runic", "Khmer", "Mongolian", "Hiragana", "Katakana", "Bopomofo", "Han", "Yi", "Old_Italic", "Gothic", "Deseret", "Inherited", "Tagalog", "Hanunoo", "Buhid", "Tagbanwa", "Limbu", "Tai_Le", "Linear_B", "Ugaritic", "Shavian", "Osmanya", "Cypriot", "Braille", "Buginese", "Coptic", "New_Tai_Lue", "Glagolitic", "Tifinagh", "Syloti_Nagri", "Old_Persian", "Kharoshthi", "Balinese", "Cuneiform", "Phoenician", "Phags_Pa", "Nko", "Sundanese", "Lepcha", "Ol_Chiki", "Vai", "Saurashtra", "Kayah_Li", "Rejang", "Lycian", "Carian", "Lydian", "Cham", "Tai_Tham", "Tai_Viet", "Avestan", "Egyptian_Hieroglyphs", "Samaritan", "Lisu", "Bamum", "Javanese", "Meetei_Mayek", "Imperial_Aramaic", "Old_South_Arabian", "Inscriptional_Parthian", "Inscriptional_Pahlavi", "Old_Turkic", "Kaithi", "Batak", "Brahmi", "Mandaic", "Chakma", "Meroitic_Cursive", "Meroitic_Hieroglyphs", "Miao", "Sharada", "Sora_Sompeng", "Takri", "Caucasian_Albanian", "Bassa_Vah", "Duployan", "Elbasan", "Grantha", "Pahawh_Hmong", "Khojki", "Linear_A", "Mahajani", "Manichaean", "Mende_Kikakui", "Modi", "Mro", "Old_North_Arabian", "Nabataean", "Palmyrene", "Pau_Cin_Hau", "Old_Permic", "Psalter_Pahlavi", "Siddham", "Khudawadi", "Tirhuta", "Warang_Citi", "Ahom", "Anatolian_Hieroglyphs", "Hatran", "Multani", "Old_Hungarian", "SignWriting", "Adlam", "Bhaiksuki", "Marchen", "Newa", "Osage", "Tangut", "Masaram_Gondi", "Nushu", "Soyombo", "Zanabazar_Square", }; static const char *Numeric_Value_Numerator_enums[99] = { "NaN", "-1", "0", "1", "3", "2", "5", "7", "4", "11", "9", "6", "13", "15", "8", "17", "10", "12", "14", "16", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "60", "70", "80", "90", "100", "200", "300", "400", "500", "600", "700", "800", "900", "1000", "2000", "3000", "4000", "5000", "6000", "7000", "8000", "9000", "10000", "20000", "30000", "40000", "50000", "60000", "70000", "80000", "90000", "100000", "200000", "216000", "300000", "400000", "432000", "500000", "600000", "700000", "800000", "900000", "1000000", "100000000", "10000000000", "1000000000000", }; static const char *NFC_QC_enums[3] = { "N", "Y", "M", }; static const char *Canonical_Combining_Class_enums[56] = { "Not_Reordered", "0", "1", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "84", "91", "103", "107", "118", "122", "129", "130", "132", "202", "214", "216", "218", "220", "222", "224", "226", "228", "230", "232", "233", "234", "240", }; static const char *Line_Break_enums[43] = { "XX", "CM", "BA", "LF", "BK", "CR", "SP", "EX", "QU", "AL", "PR", "PO", "OP", "CP", "IS", "HY", "SY", "NU", "CL", "NL", "GL", "AI", "BB", "HL", "SA", "JL", "JV", "JT", "NS", "ZW", "ZWJ", "B2", "IN", "WJ", "ID", "EB", "CJ", "H2", "H3", "SG", "CB", "RI", "EM", }; static const char *Age_enums[20] = { "Unassigned", "1.1", "2.0", "2.1", "3.0", "3.1", "3.2", "4.0", "4.1", "5.0", "5.1", "5.2", "6.0", "6.1", "6.2", "6.3", "7.0", "8.0", "9.0", "10.0", }; static const char *Bidi_Class_enums[23] = { "L", "R", "EN", "ES", "ET", "AN", "CS", "B", "S", "WS", "ON", "BN", "NSM", "AL", "LRO", "RLO", "LRE", "RLE", "PDF", "LRI", "RLI", "FSI", "PDI", }; static const char *Decomposition_Type_enums[18] = { "None", "Canonical", "Compat", "Font", "Nobreak", "Initial", "Medial", "Final", "Isolated", "Circle", "Super", "Sub", "Vertical", "Wide", "Narrow", "Small", "Square", "Fraction", }; static const char *General_Category_enums[30] = { "Cn", "Lu", "Ll", "Lt", "Lm", "Lo", "Mn", "Me", "Mc", "Nd", "Nl", "No", "Zs", "Zl", "Zp", "Cc", "Cf", "Co", "Cs", "Pd", "Ps", "Pe", "Pc", "Po", "Sm", "Sc", "Sk", "So", "Pi", "Pf", }; static const char *Grapheme_Cluster_Break_enums[18] = { "Other", "Prepend", "CR", "LF", "Control", "Extend", "Regional_Indicator", "SpacingMark", "L", "V", "T", "LV", "LVT", "E_Base", "E_Modifier", "ZWJ", "Glue_After_Zwj", "E_Base_GAZ", }; static const char *Numeric_Value_Denominator_enums[17] = { "NaN", "2", "1", "160", "40", "80", "20", "16", "12", "10", "9", "8", "7", "6", "5", "4", "3", }; static const char *Word_Break_enums[22] = { "Other", "Double_Quote", "Single_Quote", "Hebrew_Letter", "CR", "LF", "Newline", "Extend", "Regional_Indicator", "Format", "Katakana", "ALetter", "MidLetter", "MidNum", "MidNumLet", "Numeric", "ExtendNumLet", "E_Base", "E_Modifier", "ZWJ", "Glue_After_Zwj", "E_Base_GAZ", }; static const char *Sentence_Break_enums[15] = { "Other", "CR", "LF", "Extend", "Sep", "Format", "Sp", "Lower", "Upper", "OLetter", "Numeric", "ATerm", "STerm", "Close", "SContinue", }; static const char *Hangul_Syllable_Type_enums[6] = { "Not_Applicable", "L", "V", "T", "LV", "LVT", }; static const char *Joining_Type_enums[6] = { "U", "D", "R", "C", "T", "L", }; static const char *NFG_QC_enums[3] = { "N", "Y", "M", }; static const char *NFKC_QC_enums[3] = { "N", "Y", "M", }; static const char *Numeric_Type_enums[4] = { "None", "Numeric", "Digit", "Decimal", }; static MVMint32 MVM_codepoint_to_row_index(MVMThreadContext *tc, MVMint64 codepoint); static const char *bogus = ""; /* only for table too short; return null string for no mapping */ static const char* MVM_unicode_get_property_str(MVMThreadContext *tc, MVMint64 codepoint, MVMint64 property_code) { MVMuint32 switch_val = (MVMuint32)property_code; MVMint32 result_val = 0; /* we'll never have negatives, but so */ MVMuint32 codepoint_row = MVM_codepoint_to_row_index(tc, codepoint); MVMuint16 bitfield_row = 0; if (codepoint_row == -1) { /* non-existent codepoint; XXX should throw? */ if (0x10FFFF < codepoint) return ""; result_val = -1; } else { bitfield_row = codepoint_bitfield_indexes[codepoint_row]; } switch (switch_val) { case 0: return ""; case MVM_UNICODE_PROPERTY_DECOMP_SPEC: /* Decomp_Spec bits:13 offset:0 */ result_val |= ((props_bitfield[bitfield_row][0] & 0xfff80000) >> 19); /* mask: 11111111111110000000000000000000 */ return result_val < 5723 ? (result_val == -1 ? Decomp_Spec_enums[0] : Decomp_Spec_enums[result_val]) : bogus; case MVM_UNICODE_PROPERTY_JOINING_GROUP: /* Joining_Group bits:7 offset:25 */ result_val |= ((props_bitfield[bitfield_row][0] & 0x7f) >> 0); /* mask: 00000000000000000000000001111111 */ return result_val < 100 ? (result_val == -1 ? Joining_Group_enums[0] : Joining_Group_enums[result_val]) : bogus; case MVM_UNICODE_PROPERTY_BLOCK: /* Block bits:9 offset:20 */ result_val |= ((props_bitfield[bitfield_row][1] & 0xff8) >> 3); /* mask: 00000000000000000000111111111000 */ return result_val < 281 ? (result_val == -1 ? Block_enums[0] : Block_enums[result_val]) : bogus; case MVM_UNICODE_PROPERTY_EAST_ASIAN_WIDTH: /* East_Asian_Width bits:3 offset:29 */ result_val |= ((props_bitfield[bitfield_row][1] & 0x7) >> 0); /* mask: 00000000000000000000000000000111 */ return result_val < 6 ? (result_val == -1 ? East_Asian_Width_enums[0] : East_Asian_Width_enums[result_val]) : bogus; case MVM_UNICODE_PROPERTY_NUMERIC_VALUE: /* Numeric_Value bits:8 offset:0 */ result_val |= ((props_bitfield[bitfield_row][2] & 0xff000000) >> 24); /* mask: 11111111000000000000000000000000 */ return result_val < 136 ? (result_val == -1 ? Numeric_Value_enums[0] : Numeric_Value_enums[result_val]) : bogus; case MVM_UNICODE_PROPERTY_SCRIPT: /* Script bits:8 offset:8 */ result_val |= ((props_bitfield[bitfield_row][2] & 0xff0000) >> 16); /* mask: 00000000111111110000000000000000 */ return result_val < 142 ? (result_val == -1 ? Script_enums[0] : Script_enums[result_val]) : bogus; case MVM_UNICODE_PROPERTY_NUMERIC_VALUE_NUMERATOR: /* Numeric_Value_Numerator bits:7 offset:16 */ result_val |= ((props_bitfield[bitfield_row][2] & 0xfe00) >> 9); /* mask: 00000000000000001111111000000000 */ return result_val < 99 ? (result_val == -1 ? Numeric_Value_Numerator_enums[0] : Numeric_Value_Numerator_enums[result_val]) : bogus; case MVM_UNICODE_PROPERTY_NFC_QC: /* NFC_QC bits:2 offset:30 */ result_val |= ((props_bitfield[bitfield_row][2] & 0x3) >> 0); /* mask: 00000000000000000000000000000011 */ return result_val < 3 ? (result_val == -1 ? NFC_QC_enums[0] : NFC_QC_enums[result_val]) : bogus; case MVM_UNICODE_PROPERTY_CANONICAL_COMBINING_CLASS: /* Canonical_Combining_Class bits:6 offset:0 */ result_val |= ((props_bitfield[bitfield_row][3] & 0xfc000000) >> 26); /* mask: 11111100000000000000000000000000 */ return result_val < 56 ? (result_val == -1 ? Canonical_Combining_Class_enums[0] : Canonical_Combining_Class_enums[result_val]) : bogus; case MVM_UNICODE_PROPERTY_LINE_BREAK: /* Line_Break bits:6 offset:6 */ result_val |= ((props_bitfield[bitfield_row][3] & 0x3f00000) >> 20); /* mask: 00000011111100000000000000000000 */ return result_val < 43 ? (result_val == -1 ? Line_Break_enums[0] : Line_Break_enums[result_val]) : bogus; case MVM_UNICODE_PROPERTY_AGE: /* Age bits:5 offset:12 */ result_val |= ((props_bitfield[bitfield_row][3] & 0xf8000) >> 15); /* mask: 00000000000011111000000000000000 */ return result_val < 20 ? (result_val == -1 ? Age_enums[0] : Age_enums[result_val]) : bogus; case MVM_UNICODE_PROPERTY_BIDI_CLASS: /* Bidi_Class bits:5 offset:17 */ result_val |= ((props_bitfield[bitfield_row][3] & 0x7c00) >> 10); /* mask: 00000000000000000111110000000000 */ return result_val < 23 ? (result_val == -1 ? Bidi_Class_enums[0] : Bidi_Class_enums[result_val]) : bogus; case MVM_UNICODE_PROPERTY_DECOMPOSITION_TYPE: /* Decomposition_Type bits:5 offset:22 */ result_val |= ((props_bitfield[bitfield_row][3] & 0x3e0) >> 5); /* mask: 00000000000000000000001111100000 */ return result_val < 18 ? (result_val == -1 ? Decomposition_Type_enums[0] : Decomposition_Type_enums[result_val]) : bogus; case MVM_UNICODE_PROPERTY_GENERAL_CATEGORY: /* General_Category bits:5 offset:27 */ result_val |= ((props_bitfield[bitfield_row][3] & 0x1f) >> 0); /* mask: 00000000000000000000000000011111 */ return result_val < 30 ? (result_val == -1 ? General_Category_enums[0] : General_Category_enums[result_val]) : bogus; case MVM_UNICODE_PROPERTY_GRAPHEME_CLUSTER_BREAK: /* Grapheme_Cluster_Break bits:5 offset:0 */ result_val |= ((props_bitfield[bitfield_row][4] & 0xf8000000) >> 27); /* mask: 11111000000000000000000000000000 */ return result_val < 18 ? (result_val == -1 ? Grapheme_Cluster_Break_enums[0] : Grapheme_Cluster_Break_enums[result_val]) : bogus; case MVM_UNICODE_PROPERTY_NUMERIC_VALUE_DENOMINATOR: /* Numeric_Value_Denominator bits:5 offset:5 */ result_val |= ((props_bitfield[bitfield_row][4] & 0x7c00000) >> 22); /* mask: 00000111110000000000000000000000 */ return result_val < 17 ? (result_val == -1 ? Numeric_Value_Denominator_enums[0] : Numeric_Value_Denominator_enums[result_val]) : bogus; case MVM_UNICODE_PROPERTY_WORD_BREAK: /* Word_Break bits:5 offset:10 */ result_val |= ((props_bitfield[bitfield_row][4] & 0x3e0000) >> 17); /* mask: 00000000001111100000000000000000 */ return result_val < 22 ? (result_val == -1 ? Word_Break_enums[0] : Word_Break_enums[result_val]) : bogus; case MVM_UNICODE_PROPERTY_SENTENCE_BREAK: /* Sentence_Break bits:4 offset:15 */ result_val |= ((props_bitfield[bitfield_row][4] & 0x1e000) >> 13); /* mask: 00000000000000011110000000000000 */ return result_val < 15 ? (result_val == -1 ? Sentence_Break_enums[0] : Sentence_Break_enums[result_val]) : bogus; case MVM_UNICODE_PROPERTY_HANGUL_SYLLABLE_TYPE: /* Hangul_Syllable_Type bits:3 offset:19 */ result_val |= ((props_bitfield[bitfield_row][4] & 0x1c00) >> 10); /* mask: 00000000000000000001110000000000 */ return result_val < 6 ? (result_val == -1 ? Hangul_Syllable_Type_enums[0] : Hangul_Syllable_Type_enums[result_val]) : bogus; case MVM_UNICODE_PROPERTY_JOINING_TYPE: /* Joining_Type bits:3 offset:22 */ result_val |= ((props_bitfield[bitfield_row][4] & 0x380) >> 7); /* mask: 00000000000000000000001110000000 */ return result_val < 6 ? (result_val == -1 ? Joining_Type_enums[0] : Joining_Type_enums[result_val]) : bogus; case MVM_UNICODE_PROPERTY_NFG_QC: /* NFG_QC bits:2 offset:25 */ result_val |= ((props_bitfield[bitfield_row][4] & 0x60) >> 5); /* mask: 00000000000000000000000001100000 */ return result_val < 3 ? (result_val == -1 ? NFG_QC_enums[0] : NFG_QC_enums[result_val]) : bogus; case MVM_UNICODE_PROPERTY_NFKC_QC: /* NFKC_QC bits:2 offset:27 */ result_val |= ((props_bitfield[bitfield_row][4] & 0x18) >> 3); /* mask: 00000000000000000000000000011000 */ return result_val < 3 ? (result_val == -1 ? NFKC_QC_enums[0] : NFKC_QC_enums[result_val]) : bogus; case MVM_UNICODE_PROPERTY_NUMERIC_TYPE: /* Numeric_Type bits:2 offset:29 */ result_val |= ((props_bitfield[bitfield_row][4] & 0x6) >> 1); /* mask: 00000000000000000000000000000110 */ return result_val < 4 ? (result_val == -1 ? Numeric_Type_enums[0] : Numeric_Type_enums[result_val]) : bogus; default: return ""; } } static MVMint32 MVM_unicode_get_property_int(MVMThreadContext *tc, MVMint64 codepoint, MVMint64 property_code) { MVMuint32 switch_val = (MVMuint32)property_code; MVMint32 result_val = 0; /* we'll never have negatives, but so */ MVMuint32 codepoint_row = MVM_codepoint_to_row_index(tc, codepoint); MVMuint16 bitfield_row; /* If codepoint is not found in bitfield rows */ if (codepoint_row == -1) { /* Unassigned codepoints have General Category Cn. Since this returns 0 * for unknowns, unless we return 1 for property C then these unknows * won't match with <:C> */ if (property_code == MVM_UNICODE_PROPERTY_C) return 1; return 0; } bitfield_row = codepoint_bitfield_indexes[codepoint_row]; switch (switch_val) { case 0: return 0; case MVM_UNICODE_PROPERTY_DECOMP_SPEC: /* Decomp_Spec bits:13 offset:0 */ return ((props_bitfield[bitfield_row][0] & 0xfff80000) >> 19); /* mask: 11111111111110000000000000000000 */ case MVM_UNICODE_PROPERTY_CASE_CHANGE_INDEX: /* Case_Change_Index bits:12 offset:13 */ return ((props_bitfield[bitfield_row][0] & 0x7ff80) >> 7); /* mask: 00000000000001111111111110000000 */ case MVM_UNICODE_PROPERTY_JOINING_GROUP: /* Joining_Group bits:7 offset:25 */ return ((props_bitfield[bitfield_row][0] & 0x7f) >> 0); /* mask: 00000000000000000000000001111111 */ case MVM_UNICODE_PROPERTY_CASE_FOLDING: /* Case_Folding bits:11 offset:0 */ return ((props_bitfield[bitfield_row][1] & 0xffe00000) >> 21); /* mask: 11111111111000000000000000000000 */ case MVM_UNICODE_PROPERTY_BIDI_MIRRORING_GLYPH: /* Bidi_Mirroring_Glyph bits:9 offset:11 */ result_val = ((props_bitfield[bitfield_row][1] & 0x1ff000) >> 12); /* mask: 00000000000111111111000000000000 */ return result_val < 365 ? (result_val == -1 ? Bidi_Mirroring_Glyph_enums[0] : Bidi_Mirroring_Glyph_enums[result_val]) : 0; case MVM_UNICODE_PROPERTY_BLOCK: /* Block bits:9 offset:20 */ return ((props_bitfield[bitfield_row][1] & 0xff8) >> 3); /* mask: 00000000000000000000111111111000 */ case MVM_UNICODE_PROPERTY_EAST_ASIAN_WIDTH: /* East_Asian_Width bits:3 offset:29 */ return ((props_bitfield[bitfield_row][1] & 0x7) >> 0); /* mask: 00000000000000000000000000000111 */ case MVM_UNICODE_PROPERTY_NUMERIC_VALUE: /* Numeric_Value bits:8 offset:0 */ return ((props_bitfield[bitfield_row][2] & 0xff000000) >> 24); /* mask: 11111111000000000000000000000000 */ case MVM_UNICODE_PROPERTY_SCRIPT: /* Script bits:8 offset:8 */ return ((props_bitfield[bitfield_row][2] & 0xff0000) >> 16); /* mask: 00000000111111110000000000000000 */ case MVM_UNICODE_PROPERTY_NUMERIC_VALUE_NUMERATOR: /* Numeric_Value_Numerator bits:7 offset:16 */ return ((props_bitfield[bitfield_row][2] & 0xfe00) >> 9); /* mask: 00000000000000001111111000000000 */ case MVM_UNICODE_PROPERTY_SPECIAL_CASING: /* Special_Casing bits:7 offset:23 */ return ((props_bitfield[bitfield_row][2] & 0x1fc) >> 2); /* mask: 00000000000000000000000111111100 */ case MVM_UNICODE_PROPERTY_NFC_QC: /* NFC_QC bits:2 offset:30 */ return ((props_bitfield[bitfield_row][2] & 0x3) >> 0); /* mask: 00000000000000000000000000000011 */ case MVM_UNICODE_PROPERTY_CANONICAL_COMBINING_CLASS: /* Canonical_Combining_Class bits:6 offset:0 */ return ((props_bitfield[bitfield_row][3] & 0xfc000000) >> 26); /* mask: 11111100000000000000000000000000 */ case MVM_UNICODE_PROPERTY_LINE_BREAK: /* Line_Break bits:6 offset:6 */ return ((props_bitfield[bitfield_row][3] & 0x3f00000) >> 20); /* mask: 00000011111100000000000000000000 */ case MVM_UNICODE_PROPERTY_AGE: /* Age bits:5 offset:12 */ return ((props_bitfield[bitfield_row][3] & 0xf8000) >> 15); /* mask: 00000000000011111000000000000000 */ case MVM_UNICODE_PROPERTY_BIDI_CLASS: /* Bidi_Class bits:5 offset:17 */ return ((props_bitfield[bitfield_row][3] & 0x7c00) >> 10); /* mask: 00000000000000000111110000000000 */ case MVM_UNICODE_PROPERTY_DECOMPOSITION_TYPE: /* Decomposition_Type bits:5 offset:22 */ return ((props_bitfield[bitfield_row][3] & 0x3e0) >> 5); /* mask: 00000000000000000000001111100000 */ case MVM_UNICODE_PROPERTY_GENERAL_CATEGORY: /* General_Category bits:5 offset:27 */ return ((props_bitfield[bitfield_row][3] & 0x1f) >> 0); /* mask: 00000000000000000000000000011111 */ case MVM_UNICODE_PROPERTY_GRAPHEME_CLUSTER_BREAK: /* Grapheme_Cluster_Break bits:5 offset:0 */ return ((props_bitfield[bitfield_row][4] & 0xf8000000) >> 27); /* mask: 11111000000000000000000000000000 */ case MVM_UNICODE_PROPERTY_NUMERIC_VALUE_DENOMINATOR: /* Numeric_Value_Denominator bits:5 offset:5 */ return ((props_bitfield[bitfield_row][4] & 0x7c00000) >> 22); /* mask: 00000111110000000000000000000000 */ case MVM_UNICODE_PROPERTY_WORD_BREAK: /* Word_Break bits:5 offset:10 */ return ((props_bitfield[bitfield_row][4] & 0x3e0000) >> 17); /* mask: 00000000001111100000000000000000 */ case MVM_UNICODE_PROPERTY_SENTENCE_BREAK: /* Sentence_Break bits:4 offset:15 */ return ((props_bitfield[bitfield_row][4] & 0x1e000) >> 13); /* mask: 00000000000000011110000000000000 */ case MVM_UNICODE_PROPERTY_HANGUL_SYLLABLE_TYPE: /* Hangul_Syllable_Type bits:3 offset:19 */ return ((props_bitfield[bitfield_row][4] & 0x1c00) >> 10); /* mask: 00000000000000000001110000000000 */ case MVM_UNICODE_PROPERTY_JOINING_TYPE: /* Joining_Type bits:3 offset:22 */ return ((props_bitfield[bitfield_row][4] & 0x380) >> 7); /* mask: 00000000000000000000001110000000 */ case MVM_UNICODE_PROPERTY_NFG_QC: /* NFG_QC bits:2 offset:25 */ return ((props_bitfield[bitfield_row][4] & 0x60) >> 5); /* mask: 00000000000000000000000001100000 */ case MVM_UNICODE_PROPERTY_NFKC_QC: /* NFKC_QC bits:2 offset:27 */ return ((props_bitfield[bitfield_row][4] & 0x18) >> 3); /* mask: 00000000000000000000000000011000 */ case MVM_UNICODE_PROPERTY_NUMERIC_TYPE: /* Numeric_Type bits:2 offset:29 */ return ((props_bitfield[bitfield_row][4] & 0x6) >> 1); /* mask: 00000000000000000000000000000110 */ case MVM_UNICODE_PROPERTY_ASCII_HEX_DIGIT: /* ASCII_Hex_Digit bits:1 offset:31 */ return ((props_bitfield[bitfield_row][4] & 0x1) >> 0); /* mask: 00000000000000000000000000000001 */ case MVM_UNICODE_PROPERTY_ALPHABETIC: /* Alphabetic bits:1 offset:0 */ return ((props_bitfield[bitfield_row][5] & 0x80000000) >> 31); /* mask: 10000000000000000000000000000000 */ case MVM_UNICODE_PROPERTY_ANY: /* Any bits:1 offset:1 */ return ((props_bitfield[bitfield_row][5] & 0x40000000) >> 30); /* mask: 01000000000000000000000000000000 */ case MVM_UNICODE_PROPERTY_ASSIGNED: /* Assigned bits:1 offset:2 */ return ((props_bitfield[bitfield_row][5] & 0x20000000) >> 29); /* mask: 00100000000000000000000000000000 */ case MVM_UNICODE_PROPERTY_BIDI_CONTROL: /* Bidi_Control bits:1 offset:3 */ return ((props_bitfield[bitfield_row][5] & 0x10000000) >> 28); /* mask: 00010000000000000000000000000000 */ case MVM_UNICODE_PROPERTY_BIDI_MIRRORED: /* Bidi_Mirrored bits:1 offset:4 */ return ((props_bitfield[bitfield_row][5] & 0x8000000) >> 27); /* mask: 00001000000000000000000000000000 */ case MVM_UNICODE_PROPERTY_C: /* C bits:1 offset:5 */ return ((props_bitfield[bitfield_row][5] & 0x4000000) >> 26); /* mask: 00000100000000000000000000000000 */ case MVM_UNICODE_PROPERTY_CASE_FOLDING_SIMPLE: /* Case_Folding_simple bits:1 offset:6 */ return ((props_bitfield[bitfield_row][5] & 0x2000000) >> 25); /* mask: 00000010000000000000000000000000 */ case MVM_UNICODE_PROPERTY_CASE_IGNORABLE: /* Case_Ignorable bits:1 offset:7 */ return ((props_bitfield[bitfield_row][5] & 0x1000000) >> 24); /* mask: 00000001000000000000000000000000 */ case MVM_UNICODE_PROPERTY_CASED: /* Cased bits:1 offset:8 */ return ((props_bitfield[bitfield_row][5] & 0x800000) >> 23); /* mask: 00000000100000000000000000000000 */ case MVM_UNICODE_PROPERTY_CHANGES_WHEN_CASEFOLDED: /* Changes_When_Casefolded bits:1 offset:9 */ return ((props_bitfield[bitfield_row][5] & 0x400000) >> 22); /* mask: 00000000010000000000000000000000 */ case MVM_UNICODE_PROPERTY_CHANGES_WHEN_CASEMAPPED: /* Changes_When_Casemapped bits:1 offset:10 */ return ((props_bitfield[bitfield_row][5] & 0x200000) >> 21); /* mask: 00000000001000000000000000000000 */ case MVM_UNICODE_PROPERTY_CHANGES_WHEN_LOWERCASED: /* Changes_When_Lowercased bits:1 offset:11 */ return ((props_bitfield[bitfield_row][5] & 0x100000) >> 20); /* mask: 00000000000100000000000000000000 */ case MVM_UNICODE_PROPERTY_CHANGES_WHEN_NFKC_CASEFOLDED: /* Changes_When_NFKC_Casefolded bits:1 offset:12 */ return ((props_bitfield[bitfield_row][5] & 0x80000) >> 19); /* mask: 00000000000010000000000000000000 */ case MVM_UNICODE_PROPERTY_CHANGES_WHEN_TITLECASED: /* Changes_When_Titlecased bits:1 offset:13 */ return ((props_bitfield[bitfield_row][5] & 0x40000) >> 18); /* mask: 00000000000001000000000000000000 */ case MVM_UNICODE_PROPERTY_CHANGES_WHEN_UPPERCASED: /* Changes_When_Uppercased bits:1 offset:14 */ return ((props_bitfield[bitfield_row][5] & 0x20000) >> 17); /* mask: 00000000000000100000000000000000 */ case MVM_UNICODE_PROPERTY_DASH: /* Dash bits:1 offset:15 */ return ((props_bitfield[bitfield_row][5] & 0x10000) >> 16); /* mask: 00000000000000010000000000000000 */ case MVM_UNICODE_PROPERTY_DEFAULT_IGNORABLE_CODE_POINT: /* Default_Ignorable_Code_Point bits:1 offset:16 */ return ((props_bitfield[bitfield_row][5] & 0x8000) >> 15); /* mask: 00000000000000001000000000000000 */ case MVM_UNICODE_PROPERTY_DEPRECATED: /* Deprecated bits:1 offset:17 */ return ((props_bitfield[bitfield_row][5] & 0x4000) >> 14); /* mask: 00000000000000000100000000000000 */ case MVM_UNICODE_PROPERTY_DIACRITIC: /* Diacritic bits:1 offset:18 */ return ((props_bitfield[bitfield_row][5] & 0x2000) >> 13); /* mask: 00000000000000000010000000000000 */ case MVM_UNICODE_PROPERTY_EMOJI: /* Emoji bits:1 offset:19 */ return ((props_bitfield[bitfield_row][5] & 0x1000) >> 12); /* mask: 00000000000000000001000000000000 */ case MVM_UNICODE_PROPERTY_EMOJI_COMPONENT: /* Emoji_Component bits:1 offset:20 */ return ((props_bitfield[bitfield_row][5] & 0x800) >> 11); /* mask: 00000000000000000000100000000000 */ case MVM_UNICODE_PROPERTY_EMOJI_MODIFIER: /* Emoji_Modifier bits:1 offset:21 */ return ((props_bitfield[bitfield_row][5] & 0x400) >> 10); /* mask: 00000000000000000000010000000000 */ case MVM_UNICODE_PROPERTY_EMOJI_MODIFIER_BASE: /* Emoji_Modifier_Base bits:1 offset:22 */ return ((props_bitfield[bitfield_row][5] & 0x200) >> 9); /* mask: 00000000000000000000001000000000 */ case MVM_UNICODE_PROPERTY_EMOJI_PRESENTATION: /* Emoji_Presentation bits:1 offset:23 */ return ((props_bitfield[bitfield_row][5] & 0x100) >> 8); /* mask: 00000000000000000000000100000000 */ case MVM_UNICODE_PROPERTY_EXTENDER: /* Extender bits:1 offset:24 */ return ((props_bitfield[bitfield_row][5] & 0x80) >> 7); /* mask: 00000000000000000000000010000000 */ case MVM_UNICODE_PROPERTY_FULL_COMPOSITION_EXCLUSION: /* Full_Composition_Exclusion bits:1 offset:25 */ return ((props_bitfield[bitfield_row][5] & 0x40) >> 6); /* mask: 00000000000000000000000001000000 */ case MVM_UNICODE_PROPERTY_GRAPHEME_BASE: /* Grapheme_Base bits:1 offset:26 */ return ((props_bitfield[bitfield_row][5] & 0x20) >> 5); /* mask: 00000000000000000000000000100000 */ case MVM_UNICODE_PROPERTY_GRAPHEME_EXTEND: /* Grapheme_Extend bits:1 offset:27 */ return ((props_bitfield[bitfield_row][5] & 0x10) >> 4); /* mask: 00000000000000000000000000010000 */ case MVM_UNICODE_PROPERTY_GRAPHEME_LINK: /* Grapheme_Link bits:1 offset:28 */ return ((props_bitfield[bitfield_row][5] & 0x8) >> 3); /* mask: 00000000000000000000000000001000 */ case MVM_UNICODE_PROPERTY_HEX_DIGIT: /* Hex_Digit bits:1 offset:29 */ return ((props_bitfield[bitfield_row][5] & 0x4) >> 2); /* mask: 00000000000000000000000000000100 */ case MVM_UNICODE_PROPERTY_HYPHEN: /* Hyphen bits:1 offset:30 */ return ((props_bitfield[bitfield_row][5] & 0x2) >> 1); /* mask: 00000000000000000000000000000010 */ case MVM_UNICODE_PROPERTY_IDS_BINARY_OPERATOR: /* IDS_Binary_Operator bits:1 offset:31 */ return ((props_bitfield[bitfield_row][5] & 0x1) >> 0); /* mask: 00000000000000000000000000000001 */ case MVM_UNICODE_PROPERTY_IDS_TRINARY_OPERATOR: /* IDS_Trinary_Operator bits:1 offset:0 */ return ((props_bitfield[bitfield_row][6] & 0x80000000) >> 31); /* mask: 10000000000000000000000000000000 */ case MVM_UNICODE_PROPERTY_ID_CONTINUE: /* ID_Continue bits:1 offset:1 */ return ((props_bitfield[bitfield_row][6] & 0x40000000) >> 30); /* mask: 01000000000000000000000000000000 */ case MVM_UNICODE_PROPERTY_ID_START: /* ID_Start bits:1 offset:2 */ return ((props_bitfield[bitfield_row][6] & 0x20000000) >> 29); /* mask: 00100000000000000000000000000000 */ case MVM_UNICODE_PROPERTY_IDEOGRAPHIC: /* Ideographic bits:1 offset:3 */ return ((props_bitfield[bitfield_row][6] & 0x10000000) >> 28); /* mask: 00010000000000000000000000000000 */ case MVM_UNICODE_PROPERTY_JOIN_CONTROL: /* Join_Control bits:1 offset:4 */ return ((props_bitfield[bitfield_row][6] & 0x8000000) >> 27); /* mask: 00001000000000000000000000000000 */ case MVM_UNICODE_PROPERTY_L: /* L bits:1 offset:5 */ return ((props_bitfield[bitfield_row][6] & 0x4000000) >> 26); /* mask: 00000100000000000000000000000000 */ case MVM_UNICODE_PROPERTY_LC: /* LC bits:1 offset:6 */ return ((props_bitfield[bitfield_row][6] & 0x2000000) >> 25); /* mask: 00000010000000000000000000000000 */ case MVM_UNICODE_PROPERTY_LOGICAL_ORDER_EXCEPTION: /* Logical_Order_Exception bits:1 offset:7 */ return ((props_bitfield[bitfield_row][6] & 0x1000000) >> 24); /* mask: 00000001000000000000000000000000 */ case MVM_UNICODE_PROPERTY_LOWERCASE: /* Lowercase bits:1 offset:8 */ return ((props_bitfield[bitfield_row][6] & 0x800000) >> 23); /* mask: 00000000100000000000000000000000 */ case MVM_UNICODE_PROPERTY_M: /* M bits:1 offset:9 */ return ((props_bitfield[bitfield_row][6] & 0x400000) >> 22); /* mask: 00000000010000000000000000000000 */ case MVM_UNICODE_PROPERTY_MVM_COLLATION_PRIMARY: /* MVM_COLLATION_PRIMARY bits:19 offset:10 */ return ((props_bitfield[bitfield_row][6] & 0x3ffff8) >> 3); /* mask: 00000000001111111111111111111000 */ case MVM_UNICODE_PROPERTY_MVM_COLLATION_QC: /* MVM_COLLATION_QC bits:1 offset:29 */ return ((props_bitfield[bitfield_row][6] & 0x4) >> 2); /* mask: 00000000000000000000000000000100 */ case MVM_UNICODE_PROPERTY_MATH: /* Math bits:1 offset:30 */ return ((props_bitfield[bitfield_row][6] & 0x2) >> 1); /* mask: 00000000000000000000000000000010 */ case MVM_UNICODE_PROPERTY_N: /* N bits:1 offset:31 */ return ((props_bitfield[bitfield_row][6] & 0x1) >> 0); /* mask: 00000000000000000000000000000001 */ case MVM_UNICODE_PROPERTY_MVM_COLLATION_SECONDARY: /* MVM_COLLATION_SECONDARY bits:10 offset:0 */ return ((props_bitfield[bitfield_row][7] & 0xffc00000) >> 22); /* mask: 11111111110000000000000000000000 */ case MVM_UNICODE_PROPERTY_MVM_COLLATION_TERTIARY: /* MVM_COLLATION_TERTIARY bits:9 offset:10 */ return ((props_bitfield[bitfield_row][7] & 0x3fe000) >> 13); /* mask: 00000000001111111110000000000000 */ case MVM_UNICODE_PROPERTY_NFD_QC: /* NFD_QC bits:1 offset:19 */ return ((props_bitfield[bitfield_row][7] & 0x1000) >> 12); /* mask: 00000000000000000001000000000000 */ case MVM_UNICODE_PROPERTY_NFKD_QC: /* NFKD_QC bits:1 offset:20 */ return ((props_bitfield[bitfield_row][7] & 0x800) >> 11); /* mask: 00000000000000000000100000000000 */ case MVM_UNICODE_PROPERTY_NONCHARACTER_CODE_POINT: /* Noncharacter_Code_Point bits:1 offset:21 */ return ((props_bitfield[bitfield_row][7] & 0x400) >> 10); /* mask: 00000000000000000000010000000000 */ case MVM_UNICODE_PROPERTY_OTHER_ALPHABETIC: /* Other_Alphabetic bits:1 offset:22 */ return ((props_bitfield[bitfield_row][7] & 0x200) >> 9); /* mask: 00000000000000000000001000000000 */ case MVM_UNICODE_PROPERTY_OTHER_DEFAULT_IGNORABLE_CODE_POINT: /* Other_Default_Ignorable_Code_Point bits:1 offset:23 */ return ((props_bitfield[bitfield_row][7] & 0x100) >> 8); /* mask: 00000000000000000000000100000000 */ case MVM_UNICODE_PROPERTY_OTHER_GRAPHEME_EXTEND: /* Other_Grapheme_Extend bits:1 offset:24 */ return ((props_bitfield[bitfield_row][7] & 0x80) >> 7); /* mask: 00000000000000000000000010000000 */ case MVM_UNICODE_PROPERTY_OTHER_ID_CONTINUE: /* Other_ID_Continue bits:1 offset:25 */ return ((props_bitfield[bitfield_row][7] & 0x40) >> 6); /* mask: 00000000000000000000000001000000 */ case MVM_UNICODE_PROPERTY_OTHER_ID_START: /* Other_ID_Start bits:1 offset:26 */ return ((props_bitfield[bitfield_row][7] & 0x20) >> 5); /* mask: 00000000000000000000000000100000 */ case MVM_UNICODE_PROPERTY_OTHER_LOWERCASE: /* Other_Lowercase bits:1 offset:27 */ return ((props_bitfield[bitfield_row][7] & 0x10) >> 4); /* mask: 00000000000000000000000000010000 */ case MVM_UNICODE_PROPERTY_OTHER_MATH: /* Other_Math bits:1 offset:28 */ return ((props_bitfield[bitfield_row][7] & 0x8) >> 3); /* mask: 00000000000000000000000000001000 */ case MVM_UNICODE_PROPERTY_OTHER_UPPERCASE: /* Other_Uppercase bits:1 offset:29 */ return ((props_bitfield[bitfield_row][7] & 0x4) >> 2); /* mask: 00000000000000000000000000000100 */ case MVM_UNICODE_PROPERTY_P: /* P bits:1 offset:30 */ return ((props_bitfield[bitfield_row][7] & 0x2) >> 1); /* mask: 00000000000000000000000000000010 */ case MVM_UNICODE_PROPERTY_PATTERN_SYNTAX: /* Pattern_Syntax bits:1 offset:31 */ return ((props_bitfield[bitfield_row][7] & 0x1) >> 0); /* mask: 00000000000000000000000000000001 */ case MVM_UNICODE_PROPERTY_PATTERN_WHITE_SPACE: /* Pattern_White_Space bits:1 offset:0 */ return ((props_bitfield[bitfield_row][8] & 0x80000000) >> 31); /* mask: 10000000000000000000000000000000 */ case MVM_UNICODE_PROPERTY_PREPENDED_CONCATENATION_MARK: /* Prepended_Concatenation_Mark bits:1 offset:1 */ return ((props_bitfield[bitfield_row][8] & 0x40000000) >> 30); /* mask: 01000000000000000000000000000000 */ case MVM_UNICODE_PROPERTY_QUOTATION_MARK: /* Quotation_Mark bits:1 offset:2 */ return ((props_bitfield[bitfield_row][8] & 0x20000000) >> 29); /* mask: 00100000000000000000000000000000 */ case MVM_UNICODE_PROPERTY_RADICAL: /* Radical bits:1 offset:3 */ return ((props_bitfield[bitfield_row][8] & 0x10000000) >> 28); /* mask: 00010000000000000000000000000000 */ case MVM_UNICODE_PROPERTY_REGIONAL_INDICATOR: /* Regional_Indicator bits:1 offset:4 */ return ((props_bitfield[bitfield_row][8] & 0x8000000) >> 27); /* mask: 00001000000000000000000000000000 */ case MVM_UNICODE_PROPERTY_S: /* S bits:1 offset:5 */ return ((props_bitfield[bitfield_row][8] & 0x4000000) >> 26); /* mask: 00000100000000000000000000000000 */ case MVM_UNICODE_PROPERTY_SENTENCE_TERMINAL: /* Sentence_Terminal bits:1 offset:6 */ return ((props_bitfield[bitfield_row][8] & 0x2000000) >> 25); /* mask: 00000010000000000000000000000000 */ case MVM_UNICODE_PROPERTY_SOFT_DOTTED: /* Soft_Dotted bits:1 offset:7 */ return ((props_bitfield[bitfield_row][8] & 0x1000000) >> 24); /* mask: 00000001000000000000000000000000 */ case MVM_UNICODE_PROPERTY_TERMINAL_PUNCTUATION: /* Terminal_Punctuation bits:1 offset:8 */ return ((props_bitfield[bitfield_row][8] & 0x800000) >> 23); /* mask: 00000000100000000000000000000000 */ case MVM_UNICODE_PROPERTY_UNIFIED_IDEOGRAPH: /* Unified_Ideograph bits:1 offset:9 */ return ((props_bitfield[bitfield_row][8] & 0x400000) >> 22); /* mask: 00000000010000000000000000000000 */ case MVM_UNICODE_PROPERTY_UPPERCASE: /* Uppercase bits:1 offset:10 */ return ((props_bitfield[bitfield_row][8] & 0x200000) >> 21); /* mask: 00000000001000000000000000000000 */ case MVM_UNICODE_PROPERTY_VARIATION_SELECTOR: /* Variation_Selector bits:1 offset:11 */ return ((props_bitfield[bitfield_row][8] & 0x100000) >> 20); /* mask: 00000000000100000000000000000000 */ case MVM_UNICODE_PROPERTY_WHITE_SPACE: /* White_Space bits:1 offset:12 */ return ((props_bitfield[bitfield_row][8] & 0x80000) >> 19); /* mask: 00000000000010000000000000000000 */ case MVM_UNICODE_PROPERTY_XID_CONTINUE: /* XID_Continue bits:1 offset:13 */ return ((props_bitfield[bitfield_row][8] & 0x40000) >> 18); /* mask: 00000000000001000000000000000000 */ case MVM_UNICODE_PROPERTY_XID_START: /* XID_Start bits:1 offset:14 */ return ((props_bitfield[bitfield_row][8] & 0x20000) >> 17); /* mask: 00000000000000100000000000000000 */ case MVM_UNICODE_PROPERTY_Z: /* Z bits:1 offset:15 */ return ((props_bitfield[bitfield_row][8] & 0x10000) >> 16); /* mask: 00000000000000010000000000000000 */ default: return 0; } } struct UnicodeBlock { MVMGrapheme32 start; MVMGrapheme32 end; char *name; size_t name_len; char *alias; size_t alias_len; }; static struct UnicodeBlock unicode_blocks[] = { { 0x0000, 0x007F, "BasicLatin", 10, "basiclatin", 10 }, { 0x0080, 0x00FF, "Latin1Supplement", 16, "latin1supplement", 16 }, { 0x0100, 0x017F, "LatinExtendedA", 14, "latinextendeda", 14 }, { 0x0180, 0x024F, "LatinExtendedB", 14, "latinextendedb", 14 }, { 0x0250, 0x02AF, "IPAExtensions", 13, "ipaextensions", 13 }, { 0x02B0, 0x02FF, "SpacingModifierLetters", 22, "spacingmodifierletters", 22 }, { 0x0300, 0x036F, "CombiningDiacriticalMarks", 25, "combiningdiacriticalmarks", 25 }, { 0x0370, 0x03FF, "GreekandCoptic", 14, "greekandcoptic", 14 }, { 0x0400, 0x04FF, "Cyrillic", 8, "cyrillic", 8 }, { 0x0500, 0x052F, "CyrillicSupplement", 18, "cyrillicsupplement", 18 }, { 0x0530, 0x058F, "Armenian", 8, "armenian", 8 }, { 0x0590, 0x05FF, "Hebrew", 6, "hebrew", 6 }, { 0x0600, 0x06FF, "Arabic", 6, "arabic", 6 }, { 0x0700, 0x074F, "Syriac", 6, "syriac", 6 }, { 0x0750, 0x077F, "ArabicSupplement", 16, "arabicsupplement", 16 }, { 0x0780, 0x07BF, "Thaana", 6, "thaana", 6 }, { 0x07C0, 0x07FF, "NKo", 3, "nko", 3 }, { 0x0800, 0x083F, "Samaritan", 9, "samaritan", 9 }, { 0x0840, 0x085F, "Mandaic", 7, "mandaic", 7 }, { 0x0860, 0x086F, "SyriacSupplement", 16, "syriacsupplement", 16 }, { 0x08A0, 0x08FF, "ArabicExtendedA", 15, "arabicextendeda", 15 }, { 0x0900, 0x097F, "Devanagari", 10, "devanagari", 10 }, { 0x0980, 0x09FF, "Bengali", 7, "bengali", 7 }, { 0x0A00, 0x0A7F, "Gurmukhi", 8, "gurmukhi", 8 }, { 0x0A80, 0x0AFF, "Gujarati", 8, "gujarati", 8 }, { 0x0B00, 0x0B7F, "Oriya", 5, "oriya", 5 }, { 0x0B80, 0x0BFF, "Tamil", 5, "tamil", 5 }, { 0x0C00, 0x0C7F, "Telugu", 6, "telugu", 6 }, { 0x0C80, 0x0CFF, "Kannada", 7, "kannada", 7 }, { 0x0D00, 0x0D7F, "Malayalam", 9, "malayalam", 9 }, { 0x0D80, 0x0DFF, "Sinhala", 7, "sinhala", 7 }, { 0x0E00, 0x0E7F, "Thai", 4, "thai", 4 }, { 0x0E80, 0x0EFF, "Lao", 3, "lao", 3 }, { 0x0F00, 0x0FFF, "Tibetan", 7, "tibetan", 7 }, { 0x1000, 0x109F, "Myanmar", 7, "myanmar", 7 }, { 0x10A0, 0x10FF, "Georgian", 8, "georgian", 8 }, { 0x1100, 0x11FF, "HangulJamo", 10, "hanguljamo", 10 }, { 0x1200, 0x137F, "Ethiopic", 8, "ethiopic", 8 }, { 0x1380, 0x139F, "EthiopicSupplement", 18, "ethiopicsupplement", 18 }, { 0x13A0, 0x13FF, "Cherokee", 8, "cherokee", 8 }, { 0x1400, 0x167F, "UnifiedCanadianAboriginalSyllabics", 34, "unifiedcanadianaboriginalsyllabics", 34 }, { 0x1680, 0x169F, "Ogham", 5, "ogham", 5 }, { 0x16A0, 0x16FF, "Runic", 5, "runic", 5 }, { 0x1700, 0x171F, "Tagalog", 7, "tagalog", 7 }, { 0x1720, 0x173F, "Hanunoo", 7, "hanunoo", 7 }, { 0x1740, 0x175F, "Buhid", 5, "buhid", 5 }, { 0x1760, 0x177F, "Tagbanwa", 8, "tagbanwa", 8 }, { 0x1780, 0x17FF, "Khmer", 5, "khmer", 5 }, { 0x1800, 0x18AF, "Mongolian", 9, "mongolian", 9 }, { 0x18B0, 0x18FF, "UnifiedCanadianAboriginalSyllabicsExtended", 42, "unifiedcanadianaboriginalsyllabicsextended", 42 }, { 0x1900, 0x194F, "Limbu", 5, "limbu", 5 }, { 0x1950, 0x197F, "TaiLe", 5, "taile", 5 }, { 0x1980, 0x19DF, "NewTaiLue", 9, "newtailue", 9 }, { 0x19E0, 0x19FF, "KhmerSymbols", 12, "khmersymbols", 12 }, { 0x1A00, 0x1A1F, "Buginese", 8, "buginese", 8 }, { 0x1A20, 0x1AAF, "TaiTham", 7, "taitham", 7 }, { 0x1AB0, 0x1AFF, "CombiningDiacriticalMarksExtended", 33, "combiningdiacriticalmarksextended", 33 }, { 0x1B00, 0x1B7F, "Balinese", 8, "balinese", 8 }, { 0x1B80, 0x1BBF, "Sundanese", 9, "sundanese", 9 }, { 0x1BC0, 0x1BFF, "Batak", 5, "batak", 5 }, { 0x1C00, 0x1C4F, "Lepcha", 6, "lepcha", 6 }, { 0x1C50, 0x1C7F, "OlChiki", 7, "olchiki", 7 }, { 0x1C80, 0x1C8F, "CyrillicExtendedC", 17, "cyrillicextendedc", 17 }, { 0x1CC0, 0x1CCF, "SundaneseSupplement", 19, "sundanesesupplement", 19 }, { 0x1CD0, 0x1CFF, "VedicExtensions", 15, "vedicextensions", 15 }, { 0x1D00, 0x1D7F, "PhoneticExtensions", 18, "phoneticextensions", 18 }, { 0x1D80, 0x1DBF, "PhoneticExtensionsSupplement", 28, "phoneticextensionssupplement", 28 }, { 0x1DC0, 0x1DFF, "CombiningDiacriticalMarksSupplement", 35, "combiningdiacriticalmarkssupplement", 35 }, { 0x1E00, 0x1EFF, "LatinExtendedAdditional", 23, "latinextendedadditional", 23 }, { 0x1F00, 0x1FFF, "GreekExtended", 13, "greekextended", 13 }, { 0x2000, 0x206F, "GeneralPunctuation", 18, "generalpunctuation", 18 }, { 0x2070, 0x209F, "SuperscriptsandSubscripts", 25, "superscriptsandsubscripts", 25 }, { 0x20A0, 0x20CF, "CurrencySymbols", 15, "currencysymbols", 15 }, { 0x20D0, 0x20FF, "CombiningDiacriticalMarksforSymbols", 35, "combiningdiacriticalmarksforsymbols", 35 }, { 0x2100, 0x214F, "LetterlikeSymbols", 17, "letterlikesymbols", 17 }, { 0x2150, 0x218F, "NumberForms", 11, "numberforms", 11 }, { 0x2190, 0x21FF, "Arrows", 6, "arrows", 6 }, { 0x2200, 0x22FF, "MathematicalOperators", 21, "mathematicaloperators", 21 }, { 0x2300, 0x23FF, "MiscellaneousTechnical", 22, "miscellaneoustechnical", 22 }, { 0x2400, 0x243F, "ControlPictures", 15, "controlpictures", 15 }, { 0x2440, 0x245F, "OpticalCharacterRecognition", 27, "opticalcharacterrecognition", 27 }, { 0x2460, 0x24FF, "EnclosedAlphanumerics", 21, "enclosedalphanumerics", 21 }, { 0x2500, 0x257F, "BoxDrawing", 10, "boxdrawing", 10 }, { 0x2580, 0x259F, "BlockElements", 13, "blockelements", 13 }, { 0x25A0, 0x25FF, "GeometricShapes", 15, "geometricshapes", 15 }, { 0x2600, 0x26FF, "MiscellaneousSymbols", 20, "miscellaneoussymbols", 20 }, { 0x2700, 0x27BF, "Dingbats", 8, "dingbats", 8 }, { 0x27C0, 0x27EF, "MiscellaneousMathematicalSymbolsA", 33, "miscellaneousmathematicalsymbolsa", 33 }, { 0x27F0, 0x27FF, "SupplementalArrowsA", 19, "supplementalarrowsa", 19 }, { 0x2800, 0x28FF, "BraillePatterns", 15, "braillepatterns", 15 }, { 0x2900, 0x297F, "SupplementalArrowsB", 19, "supplementalarrowsb", 19 }, { 0x2980, 0x29FF, "MiscellaneousMathematicalSymbolsB", 33, "miscellaneousmathematicalsymbolsb", 33 }, { 0x2A00, 0x2AFF, "SupplementalMathematicalOperators", 33, "supplementalmathematicaloperators", 33 }, { 0x2B00, 0x2BFF, "MiscellaneousSymbolsandArrows", 29, "miscellaneoussymbolsandarrows", 29 }, { 0x2C00, 0x2C5F, "Glagolitic", 10, "glagolitic", 10 }, { 0x2C60, 0x2C7F, "LatinExtendedC", 14, "latinextendedc", 14 }, { 0x2C80, 0x2CFF, "Coptic", 6, "coptic", 6 }, { 0x2D00, 0x2D2F, "GeorgianSupplement", 18, "georgiansupplement", 18 }, { 0x2D30, 0x2D7F, "Tifinagh", 8, "tifinagh", 8 }, { 0x2D80, 0x2DDF, "EthiopicExtended", 16, "ethiopicextended", 16 }, { 0x2DE0, 0x2DFF, "CyrillicExtendedA", 17, "cyrillicextendeda", 17 }, { 0x2E00, 0x2E7F, "SupplementalPunctuation", 23, "supplementalpunctuation", 23 }, { 0x2E80, 0x2EFF, "CJKRadicalsSupplement", 21, "cjkradicalssupplement", 21 }, { 0x2F00, 0x2FDF, "KangxiRadicals", 14, "kangxiradicals", 14 }, { 0x2FF0, 0x2FFF, "IdeographicDescriptionCharacters", 32, "ideographicdescriptioncharacters", 32 }, { 0x3000, 0x303F, "CJKSymbolsandPunctuation", 24, "cjksymbolsandpunctuation", 24 }, { 0x3040, 0x309F, "Hiragana", 8, "hiragana", 8 }, { 0x30A0, 0x30FF, "Katakana", 8, "katakana", 8 }, { 0x3100, 0x312F, "Bopomofo", 8, "bopomofo", 8 }, { 0x3130, 0x318F, "HangulCompatibilityJamo", 23, "hangulcompatibilityjamo", 23 }, { 0x3190, 0x319F, "Kanbun", 6, "kanbun", 6 }, { 0x31A0, 0x31BF, "BopomofoExtended", 16, "bopomofoextended", 16 }, { 0x31C0, 0x31EF, "CJKStrokes", 10, "cjkstrokes", 10 }, { 0x31F0, 0x31FF, "KatakanaPhoneticExtensions", 26, "katakanaphoneticextensions", 26 }, { 0x3200, 0x32FF, "EnclosedCJKLettersandMonths", 27, "enclosedcjklettersandmonths", 27 }, { 0x3300, 0x33FF, "CJKCompatibility", 16, "cjkcompatibility", 16 }, { 0x3400, 0x4DBF, "CJKUnifiedIdeographsExtensionA", 30, "cjkunifiedideographsextensiona", 30 }, { 0x4DC0, 0x4DFF, "YijingHexagramSymbols", 21, "yijinghexagramsymbols", 21 }, { 0x4E00, 0x9FFF, "CJKUnifiedIdeographs", 20, "cjkunifiedideographs", 20 }, { 0xA000, 0xA48F, "YiSyllables", 11, "yisyllables", 11 }, { 0xA490, 0xA4CF, "YiRadicals", 10, "yiradicals", 10 }, { 0xA4D0, 0xA4FF, "Lisu", 4, "lisu", 4 }, { 0xA500, 0xA63F, "Vai", 3, "vai", 3 }, { 0xA640, 0xA69F, "CyrillicExtendedB", 17, "cyrillicextendedb", 17 }, { 0xA6A0, 0xA6FF, "Bamum", 5, "bamum", 5 }, { 0xA700, 0xA71F, "ModifierToneLetters", 19, "modifiertoneletters", 19 }, { 0xA720, 0xA7FF, "LatinExtendedD", 14, "latinextendedd", 14 }, { 0xA800, 0xA82F, "SylotiNagri", 11, "sylotinagri", 11 }, { 0xA830, 0xA83F, "CommonIndicNumberForms", 22, "commonindicnumberforms", 22 }, { 0xA840, 0xA87F, "Phagspa", 7, "phagspa", 7 }, { 0xA880, 0xA8DF, "Saurashtra", 10, "saurashtra", 10 }, { 0xA8E0, 0xA8FF, "DevanagariExtended", 18, "devanagariextended", 18 }, { 0xA900, 0xA92F, "KayahLi", 7, "kayahli", 7 }, { 0xA930, 0xA95F, "Rejang", 6, "rejang", 6 }, { 0xA960, 0xA97F, "HangulJamoExtendedA", 19, "hanguljamoextendeda", 19 }, { 0xA980, 0xA9DF, "Javanese", 8, "javanese", 8 }, { 0xA9E0, 0xA9FF, "MyanmarExtendedB", 16, "myanmarextendedb", 16 }, { 0xAA00, 0xAA5F, "Cham", 4, "cham", 4 }, { 0xAA60, 0xAA7F, "MyanmarExtendedA", 16, "myanmarextendeda", 16 }, { 0xAA80, 0xAADF, "TaiViet", 7, "taiviet", 7 }, { 0xAAE0, 0xAAFF, "MeeteiMayekExtensions", 21, "meeteimayekextensions", 21 }, { 0xAB00, 0xAB2F, "EthiopicExtendedA", 17, "ethiopicextendeda", 17 }, { 0xAB30, 0xAB6F, "LatinExtendedE", 14, "latinextendede", 14 }, { 0xAB70, 0xABBF, "CherokeeSupplement", 18, "cherokeesupplement", 18 }, { 0xABC0, 0xABFF, "MeeteiMayek", 11, "meeteimayek", 11 }, { 0xAC00, 0xD7AF, "HangulSyllables", 15, "hangulsyllables", 15 }, { 0xD7B0, 0xD7FF, "HangulJamoExtendedB", 19, "hanguljamoextendedb", 19 }, { 0xD800, 0xDB7F, "HighSurrogates", 14, "highsurrogates", 14 }, { 0xDB80, 0xDBFF, "HighPrivateUseSurrogates", 24, "highprivateusesurrogates", 24 }, { 0xDC00, 0xDFFF, "LowSurrogates", 13, "lowsurrogates", 13 }, { 0xE000, 0xF8FF, "PrivateUseArea", 14, "privateusearea", 14 }, { 0xF900, 0xFAFF, "CJKCompatibilityIdeographs", 26, "cjkcompatibilityideographs", 26 }, { 0xFB00, 0xFB4F, "AlphabeticPresentationForms", 27, "alphabeticpresentationforms", 27 }, { 0xFB50, 0xFDFF, "ArabicPresentationFormsA", 24, "arabicpresentationformsa", 24 }, { 0xFE00, 0xFE0F, "VariationSelectors", 18, "variationselectors", 18 }, { 0xFE10, 0xFE1F, "VerticalForms", 13, "verticalforms", 13 }, { 0xFE20, 0xFE2F, "CombiningHalfMarks", 18, "combininghalfmarks", 18 }, { 0xFE30, 0xFE4F, "CJKCompatibilityForms", 21, "cjkcompatibilityforms", 21 }, { 0xFE50, 0xFE6F, "SmallFormVariants", 17, "smallformvariants", 17 }, { 0xFE70, 0xFEFF, "ArabicPresentationFormsB", 24, "arabicpresentationformsb", 24 }, { 0xFF00, 0xFFEF, "HalfwidthandFullwidthForms", 26, "halfwidthandfullwidthforms", 26 }, { 0xFFF0, 0xFFFF, "Specials", 8, "specials", 8 }, { 0x10000, 0x1007F, "LinearBSyllabary", 16, "linearbsyllabary", 16 }, { 0x10080, 0x100FF, "LinearBIdeograms", 16, "linearbideograms", 16 }, { 0x10100, 0x1013F, "AegeanNumbers", 13, "aegeannumbers", 13 }, { 0x10140, 0x1018F, "AncientGreekNumbers", 19, "ancientgreeknumbers", 19 }, { 0x10190, 0x101CF, "AncientSymbols", 14, "ancientsymbols", 14 }, { 0x101D0, 0x101FF, "PhaistosDisc", 12, "phaistosdisc", 12 }, { 0x10280, 0x1029F, "Lycian", 6, "lycian", 6 }, { 0x102A0, 0x102DF, "Carian", 6, "carian", 6 }, { 0x102E0, 0x102FF, "CopticEpactNumbers", 18, "copticepactnumbers", 18 }, { 0x10300, 0x1032F, "OldItalic", 9, "olditalic", 9 }, { 0x10330, 0x1034F, "Gothic", 6, "gothic", 6 }, { 0x10350, 0x1037F, "OldPermic", 9, "oldpermic", 9 }, { 0x10380, 0x1039F, "Ugaritic", 8, "ugaritic", 8 }, { 0x103A0, 0x103DF, "OldPersian", 10, "oldpersian", 10 }, { 0x10400, 0x1044F, "Deseret", 7, "deseret", 7 }, { 0x10450, 0x1047F, "Shavian", 7, "shavian", 7 }, { 0x10480, 0x104AF, "Osmanya", 7, "osmanya", 7 }, { 0x104B0, 0x104FF, "Osage", 5, "osage", 5 }, { 0x10500, 0x1052F, "Elbasan", 7, "elbasan", 7 }, { 0x10530, 0x1056F, "CaucasianAlbanian", 17, "caucasianalbanian", 17 }, { 0x10600, 0x1077F, "LinearA", 7, "lineara", 7 }, { 0x10800, 0x1083F, "CypriotSyllabary", 16, "cypriotsyllabary", 16 }, { 0x10840, 0x1085F, "ImperialAramaic", 15, "imperialaramaic", 15 }, { 0x10860, 0x1087F, "Palmyrene", 9, "palmyrene", 9 }, { 0x10880, 0x108AF, "Nabataean", 9, "nabataean", 9 }, { 0x108E0, 0x108FF, "Hatran", 6, "hatran", 6 }, { 0x10900, 0x1091F, "Phoenician", 10, "phoenician", 10 }, { 0x10920, 0x1093F, "Lydian", 6, "lydian", 6 }, { 0x10980, 0x1099F, "MeroiticHieroglyphs", 19, "meroitichieroglyphs", 19 }, { 0x109A0, 0x109FF, "MeroiticCursive", 15, "meroiticcursive", 15 }, { 0x10A00, 0x10A5F, "Kharoshthi", 10, "kharoshthi", 10 }, { 0x10A60, 0x10A7F, "OldSouthArabian", 15, "oldsoutharabian", 15 }, { 0x10A80, 0x10A9F, "OldNorthArabian", 15, "oldnortharabian", 15 }, { 0x10AC0, 0x10AFF, "Manichaean", 10, "manichaean", 10 }, { 0x10B00, 0x10B3F, "Avestan", 7, "avestan", 7 }, { 0x10B40, 0x10B5F, "InscriptionalParthian", 21, "inscriptionalparthian", 21 }, { 0x10B60, 0x10B7F, "InscriptionalPahlavi", 20, "inscriptionalpahlavi", 20 }, { 0x10B80, 0x10BAF, "PsalterPahlavi", 14, "psalterpahlavi", 14 }, { 0x10C00, 0x10C4F, "OldTurkic", 9, "oldturkic", 9 }, { 0x10C80, 0x10CFF, "OldHungarian", 12, "oldhungarian", 12 }, { 0x10E60, 0x10E7F, "RumiNumeralSymbols", 18, "ruminumeralsymbols", 18 }, { 0x11000, 0x1107F, "Brahmi", 6, "brahmi", 6 }, { 0x11080, 0x110CF, "Kaithi", 6, "kaithi", 6 }, { 0x110D0, 0x110FF, "SoraSompeng", 11, "sorasompeng", 11 }, { 0x11100, 0x1114F, "Chakma", 6, "chakma", 6 }, { 0x11150, 0x1117F, "Mahajani", 8, "mahajani", 8 }, { 0x11180, 0x111DF, "Sharada", 7, "sharada", 7 }, { 0x111E0, 0x111FF, "SinhalaArchaicNumbers", 21, "sinhalaarchaicnumbers", 21 }, { 0x11200, 0x1124F, "Khojki", 6, "khojki", 6 }, { 0x11280, 0x112AF, "Multani", 7, "multani", 7 }, { 0x112B0, 0x112FF, "Khudawadi", 9, "khudawadi", 9 }, { 0x11300, 0x1137F, "Grantha", 7, "grantha", 7 }, { 0x11400, 0x1147F, "Newa", 4, "newa", 4 }, { 0x11480, 0x114DF, "Tirhuta", 7, "tirhuta", 7 }, { 0x11580, 0x115FF, "Siddham", 7, "siddham", 7 }, { 0x11600, 0x1165F, "Modi", 4, "modi", 4 }, { 0x11660, 0x1167F, "MongolianSupplement", 19, "mongoliansupplement", 19 }, { 0x11680, 0x116CF, "Takri", 5, "takri", 5 }, { 0x11700, 0x1173F, "Ahom", 4, "ahom", 4 }, { 0x118A0, 0x118FF, "WarangCiti", 10, "warangciti", 10 }, { 0x11A00, 0x11A4F, "ZanabazarSquare", 15, "zanabazarsquare", 15 }, { 0x11A50, 0x11AAF, "Soyombo", 7, "soyombo", 7 }, { 0x11AC0, 0x11AFF, "PauCinHau", 9, "paucinhau", 9 }, { 0x11C00, 0x11C6F, "Bhaiksuki", 9, "bhaiksuki", 9 }, { 0x11C70, 0x11CBF, "Marchen", 7, "marchen", 7 }, { 0x11D00, 0x11D5F, "MasaramGondi", 12, "masaramgondi", 12 }, { 0x12000, 0x123FF, "Cuneiform", 9, "cuneiform", 9 }, { 0x12400, 0x1247F, "CuneiformNumbersandPunctuation", 30, "cuneiformnumbersandpunctuation", 30 }, { 0x12480, 0x1254F, "EarlyDynasticCuneiform", 22, "earlydynasticcuneiform", 22 }, { 0x13000, 0x1342F, "EgyptianHieroglyphs", 19, "egyptianhieroglyphs", 19 }, { 0x14400, 0x1467F, "AnatolianHieroglyphs", 20, "anatolianhieroglyphs", 20 }, { 0x16800, 0x16A3F, "BamumSupplement", 15, "bamumsupplement", 15 }, { 0x16A40, 0x16A6F, "Mro", 3, "mro", 3 }, { 0x16AD0, 0x16AFF, "BassaVah", 8, "bassavah", 8 }, { 0x16B00, 0x16B8F, "PahawhHmong", 11, "pahawhhmong", 11 }, { 0x16F00, 0x16F9F, "Miao", 4, "miao", 4 }, { 0x16FE0, 0x16FFF, "IdeographicSymbolsandPunctuation", 32, "ideographicsymbolsandpunctuation", 32 }, { 0x17000, 0x187FF, "Tangut", 6, "tangut", 6 }, { 0x18800, 0x18AFF, "TangutComponents", 16, "tangutcomponents", 16 }, { 0x1B000, 0x1B0FF, "KanaSupplement", 14, "kanasupplement", 14 }, { 0x1B100, 0x1B12F, "KanaExtendedA", 13, "kanaextendeda", 13 }, { 0x1B170, 0x1B2FF, "Nushu", 5, "nushu", 5 }, { 0x1BC00, 0x1BC9F, "Duployan", 8, "duployan", 8 }, { 0x1BCA0, 0x1BCAF, "ShorthandFormatControls", 23, "shorthandformatcontrols", 23 }, { 0x1D000, 0x1D0FF, "ByzantineMusicalSymbols", 23, "byzantinemusicalsymbols", 23 }, { 0x1D100, 0x1D1FF, "MusicalSymbols", 14, "musicalsymbols", 14 }, { 0x1D200, 0x1D24F, "AncientGreekMusicalNotation", 27, "ancientgreekmusicalnotation", 27 }, { 0x1D300, 0x1D35F, "TaiXuanJingSymbols", 18, "taixuanjingsymbols", 18 }, { 0x1D360, 0x1D37F, "CountingRodNumerals", 19, "countingrodnumerals", 19 }, { 0x1D400, 0x1D7FF, "MathematicalAlphanumericSymbols", 31, "mathematicalalphanumericsymbols", 31 }, { 0x1D800, 0x1DAAF, "SuttonSignWriting", 17, "suttonsignwriting", 17 }, { 0x1E000, 0x1E02F, "GlagoliticSupplement", 20, "glagoliticsupplement", 20 }, { 0x1E800, 0x1E8DF, "MendeKikakui", 12, "mendekikakui", 12 }, { 0x1E900, 0x1E95F, "Adlam", 5, "adlam", 5 }, { 0x1EE00, 0x1EEFF, "ArabicMathematicalAlphabeticSymbols", 35, "arabicmathematicalalphabeticsymbols", 35 }, { 0x1F000, 0x1F02F, "MahjongTiles", 12, "mahjongtiles", 12 }, { 0x1F030, 0x1F09F, "DominoTiles", 11, "dominotiles", 11 }, { 0x1F0A0, 0x1F0FF, "PlayingCards", 12, "playingcards", 12 }, { 0x1F100, 0x1F1FF, "EnclosedAlphanumericSupplement", 30, "enclosedalphanumericsupplement", 30 }, { 0x1F200, 0x1F2FF, "EnclosedIdeographicSupplement", 29, "enclosedideographicsupplement", 29 }, { 0x1F300, 0x1F5FF, "MiscellaneousSymbolsandPictographs", 34, "miscellaneoussymbolsandpictographs", 34 }, { 0x1F600, 0x1F64F, "Emoticons", 9, "emoticons", 9 }, { 0x1F650, 0x1F67F, "OrnamentalDingbats", 18, "ornamentaldingbats", 18 }, { 0x1F680, 0x1F6FF, "TransportandMapSymbols", 22, "transportandmapsymbols", 22 }, { 0x1F700, 0x1F77F, "AlchemicalSymbols", 17, "alchemicalsymbols", 17 }, { 0x1F780, 0x1F7FF, "GeometricShapesExtended", 23, "geometricshapesextended", 23 }, { 0x1F800, 0x1F8FF, "SupplementalArrowsC", 19, "supplementalarrowsc", 19 }, { 0x1F900, 0x1F9FF, "SupplementalSymbolsandPictographs", 33, "supplementalsymbolsandpictographs", 33 }, { 0x20000, 0x2A6DF, "CJKUnifiedIdeographsExtensionB", 30, "cjkunifiedideographsextensionb", 30 }, { 0x2A700, 0x2B73F, "CJKUnifiedIdeographsExtensionC", 30, "cjkunifiedideographsextensionc", 30 }, { 0x2B740, 0x2B81F, "CJKUnifiedIdeographsExtensionD", 30, "cjkunifiedideographsextensiond", 30 }, { 0x2B820, 0x2CEAF, "CJKUnifiedIdeographsExtensionE", 30, "cjkunifiedideographsextensione", 30 }, { 0x2CEB0, 0x2EBEF, "CJKUnifiedIdeographsExtensionF", 30, "cjkunifiedideographsextensionf", 30 }, { 0x2F800, 0x2FA1F, "CJKCompatibilityIdeographsSupplement", 36, "cjkcompatibilityideographssupplement", 36 }, { 0xE0000, 0xE007F, "Tags", 4, "tags", 4 }, { 0xE0100, 0xE01EF, "VariationSelectorsSupplement", 28, "variationselectorssupplement", 28 }, { 0xF0000, 0xFFFFF, "SupplementaryPrivateUseAreaA", 28, "supplementaryprivateuseareaa", 28 }, { 0x100000, 0x10FFFF, "SupplementaryPrivateUseAreaB", 28, "supplementaryprivateuseareab", 28 } }; static int block_compare(const void *a, const void *b) { MVMGrapheme32 ord = *((MVMGrapheme32 *) a); struct UnicodeBlock *block = (struct UnicodeBlock *) b; if (ord < block->start) { return -1; } else if (ord > block->end) { return 1; } else { return 0; } } MVMint32 MVM_unicode_is_in_block(MVMThreadContext *tc, MVMString *str, MVMint64 pos, MVMString *block_name) { MVMGrapheme32 ord = MVM_string_get_grapheme_at_nocheck(tc, str, pos); MVMuint64 size; char *bname = MVM_string_ascii_encode(tc, block_name, &size, 0); MVMint32 in_block = 0; struct UnicodeBlock *block = bsearch(&ord, unicode_blocks, sizeof(unicode_blocks) / sizeof(struct UnicodeBlock), sizeof(struct UnicodeBlock), block_compare); if (block) { in_block = strncmp(block->name, bname, block->name_len) == 0 || strncmp(block->alias, bname, block->alias_len) == 0; } MVM_free(bname); return in_block; } static MVMint32 MVM_codepoint_to_row_index(MVMThreadContext *tc, MVMint64 codepoint) { MVMint32 plane = codepoint >> 16; if (codepoint < 0) { MVM_exception_throw_adhoc(tc, "Internal Error: MVM_codepoint_to_row_index call requested a synthetic codepoint that does not exist.\n" "Requested synthetic %"PRId64" when only %"PRId32" have been created.", -codepoint, tc->instance->nfg->num_synthetics); } if (plane == 0) { if (codepoint >= 0x3406) { /* */ if (codepoint >= 0x67D2) { /* */ if (codepoint >= 0x8CB4) { /* */ if (codepoint >= 0x96F7) { /* */ if (codepoint >= 0xDB80) { /* */ if (codepoint >= 0xE000) { /* */ if (codepoint >= 0xF900) { /* CJK COMPATIBILITY IDEOGRAPH-F900 */ if (codepoint >= 0xFFFE) { /* NULL */ return -1; } else { return codepoint - 35194; } } else { return 28549; /* F900 CJK COMPATIBILITY IDEOGRAPH-F900 */ } } else { if (codepoint >= 0xDC00) { /* */ return 28548; /* E000 */ } else { return 28547; /* DC00 */ } } } else { if (codepoint >= 0x9FA6) { /* */ if (codepoint >= 0xD800) { /* */ return 28546; /* DB80 */ } else { return codepoint - 26750; } } else { return 14119; /* 4E03 */ } } } else { if (codepoint >= 0x8D31) { /* */ if (codepoint >= 0x9621) { /* */ if (codepoint >= 0x9679) { /* */ if (codepoint >= 0x96F6) { /* */ return codepoint - 24528; } else { return 14117; /* 4E03 */ } } else { return codepoint - 24404; } } else { return 14028; /* 4E03 */ } } else { if (codepoint >= 0x8D30) { /* */ return codepoint - 22117; } else { return 14026; /* 4E03 */ } } } } else { if (codepoint >= 0x767E) { /* */ if (codepoint >= 0x8087) { /* */ if (codepoint >= 0x842C) { /* */ if (codepoint >= 0x842D) { /* */ if (codepoint >= 0x8CAE) { /* */ return codepoint - 21994; } else { return 14019; /* 4E03 */ } } else { return codepoint - 19818; } } else { return 14017; /* 4E03 */ } } else { if (codepoint >= 0x767F) { /* */ if (codepoint >= 0x8086) { /* */ return codepoint - 18886; } else { return 14015; /* 4E03 */ } } else { return codepoint - 16320; } } } else { if (codepoint >= 0x6F06) { /* */ if (codepoint >= 0x6F07) { /* */ if (codepoint >= 0x7396) { /* */ if (codepoint >= 0x7397) { /* */ return 14013; /* 4E03 */ } else { return codepoint - 15578; } } else { return 14011; /* 4E03 */ } } else { return codepoint - 14412; } } else { if (codepoint >= 0x67D3) { /* */ return 14009; /* 4E03 */ } else { return codepoint - 12570; } } } } } else { if (codepoint >= 0x534D) { /* */ if (codepoint >= 0x58FA) { /* */ if (codepoint >= 0x5EFE) { /* */ if (codepoint >= 0x5F11) { /* */ if (codepoint >= 0x62FE) { /* */ if (codepoint >= 0x634D) { /* */ return 14007; /* 4E03 */ } else { return codepoint - 11414; } } else { return 13927; /* 4E03 */ } } else { return codepoint - 10410; } } else { if (codepoint >= 0x5E7A) { /* */ if (codepoint >= 0x5E7B) { /* */ return 13907; /* 4E03 */ } else { return codepoint - 10280; } } else { return 13905; /* 4E03 */ } } } else { if (codepoint >= 0x53C5) { /* */ if (codepoint >= 0x56DB) { /* */ if (codepoint >= 0x56DC) { /* */ if (codepoint >= 0x58F1) { /* */ return codepoint - 8873; } else { return 13895; /* 4E03 */ } } else { return codepoint - 8341; } } else { return 13893; /* 4E03 */ } } else { if (codepoint >= 0x53C1) { /* */ return codepoint - 7552; } else { return 13888; /* 4E03 */ } } } } else { if (codepoint >= 0x3B4D) { /* */ if (codepoint >= 0x4F71) { /* */ if (codepoint >= 0x5104) { /* */ if (codepoint >= 0x516E) { /* */ if (codepoint >= 0x5341) { /* */ return codepoint - 7437; } else { return 13875; /* 4E03 */ } } else { return codepoint - 6971; } } else { return 13768; /* 4E03 */ } } else { if (codepoint >= 0x3B4E) { /* */ if (codepoint >= 0x4DC0) { /* HEXAGRAM FOR THE CREATIVE HEAVEN */ return codepoint - 6569; } else { return 13324; /* 3405 */ } } else { return codepoint - 1858; } } } else { if (codepoint >= 0x3484) { /* */ if (codepoint >= 0x382A) { /* */ if (codepoint >= 0x382B) { /* */ return 13322; /* 3405 */ } else { return codepoint - 1057; } } else { return 13320; /* 3405 */ } } else { if (codepoint >= 0x3483) { /* */ return codepoint - 124; } else { return 13318; /* 3405 */ } } } } } } else { return codepoint - 0; /* the fast path */ } } else { if (plane < 0 || plane > 16 || codepoint > 0x10FFFD) { return -1; } else { if (codepoint >= 0x20122) { /* */ if (codepoint >= 0x2A700) { /* */ if (codepoint >= 0x2FA1E) { /* NULL */ if (codepoint >= 0xF0000) { /* */ if (codepoint >= 0x100000) { /* */ if (codepoint >= 0x10FFFE) { /* NULL */ if (codepoint >= 0x110000) { /* Out of Range */ return codepoint - 1061198; } else { return -1; } } else { return 52913; /* 110000 Out of Range */ } } else { if (codepoint >= 0xFFFFE) { /* NULL */ return -1; } else { return 52912; /* 100000 */ } } } else { if (codepoint >= 0xE0001) { /* LANGUAGE TAG */ if (codepoint >= 0xE01F0) { /* NULL */ return -1; } else { return codepoint - 865088; } } else { return -1; } } } else { if (codepoint >= 0x2B820) { /* */ if (codepoint >= 0x2CEB0) { /* */ if (codepoint >= 0x2EBE1) { /* NULL */ if (codepoint >= 0x2F800) { /* CJK COMPATIBILITY IDEOGRAPH-2F800 */ return codepoint - 142685; } else { return -1; } } else { return 51874; /* 2F800 CJK COMPATIBILITY IDEOGRAPH-2F800 */ } } else { return 51859; /* 2CEB0 */ } } else { if (codepoint >= 0x2B740) { /* */ return 51856; /* 2B820 */ } else { return 51844; /* 2B740 */ } } } } else { if (codepoint >= 0x22391) { /* */ if (codepoint >= 0x23B1B) { /* */ if (codepoint >= 0x23B1C) { /* */ if (codepoint >= 0x2626D) { /* */ if (codepoint >= 0x2626E) { /* */ return 51802; /* 20001 */ } else { return codepoint - 104468; } } else { return 51800; /* 20001 */ } } else { return codepoint - 94404; } } else { if (codepoint >= 0x22998) { /* */ if (codepoint >= 0x22999) { /* */ return 51798; /* 20001 */ } else { return codepoint - 89923; } } else { return 51796; /* 20001 */ } } } else { if (codepoint >= 0x2099D) { /* */ if (codepoint >= 0x20AEA) { /* */ if (codepoint >= 0x20B1A) { /* */ if (codepoint >= 0x22390) { /* */ return codepoint - 88381; } else { return 51794; /* 20001 */ } } else { return codepoint - 82120; } } else { return 51745; /* 20001 */ } } else { if (codepoint >= 0x2092A) { /* */ return codepoint - 81788; } else { return 51629; /* 20001 */ } } } } } else { if (codepoint >= 0x1BC00) { /* DUPLOYAN LETTER H */ if (codepoint >= 0x1E800) { /* MENDE KIKAKUI SYLLABLE M001 KI */ if (codepoint >= 0x1F9E7) { /* NULL */ if (codepoint >= 0x20000) { /* */ if (codepoint >= 0x20065) { /* */ if (codepoint >= 0x200E2) { /* */ return codepoint - 79733; } else { return 51564; /* 20001 */ } } else { return codepoint - 79609; } } else { return -1; } } else { if (codepoint >= 0x1E960) { /* NULL */ if (codepoint >= 0x1EE00) { /* ARABIC MATHEMATICAL ALEF */ return codepoint - 78048; } else { return -1; } } else { return codepoint - 76864; } } } else { if (codepoint >= 0x1D000) { /* BYZANTINE MUSICAL SYMBOL PSILI */ if (codepoint >= 0x1DAB0) { /* NULL */ if (codepoint >= 0x1E000) { /* COMBINING GLAGOLITIC LETTER AZU */ if (codepoint >= 0x1E02B) { /* NULL */ return -1; } else { return codepoint - 74859; } } else { return -1; } } else { return codepoint - 73499; } } else { if (codepoint >= 0x1BCA4) { /* NULL */ return -1; } else { return codepoint - 68543; } } } } else { if (codepoint >= 0x14647) { /* NULL */ if (codepoint >= 0x18800) { /* TANGUT COMPONENT-001 */ if (codepoint >= 0x18AF3) { /* NULL */ if (codepoint >= 0x1B000) { /* KATAKANA LETTER ARCHAIC E */ if (codepoint >= 0x1B2FC) { /* NULL */ return -1; } else { return codepoint - 66235; } } else { return -1; } } else { return codepoint - 56750; } } else { if (codepoint >= 0x16800) { /* BAMUM LETTER PHASE-A NGKUE MFON */ if (codepoint >= 0x17000) { /* */ return 43582; /* 18800 TANGUT COMPONENT-001 */ } else { return codepoint - 50626; } } else { return -1; } } } else { if (codepoint >= 0x13000) { /* EGYPTIAN HIEROGLYPH A001 */ if (codepoint >= 0x1342F) { /* NULL */ if (codepoint >= 0x14400) { /* ANATOLIAN HIEROGLYPH A001 */ return codepoint - 41993; } else { return -1; } } else { return codepoint - 37944; } } else { if (codepoint >= 0x12544) { /* NULL */ return -1; } else { return codepoint - 35196; } } } } } } } } /* Canonical composition lookup tables. */ static const MVMint32 comp_entry_0[] = {2,824,8814}; static const MVMint32 comp_entry_1[] = {2,824,8800}; static const MVMint32 comp_entry_2[] = {2,824,8815}; static const MVMint32 comp_entry_3[] = {32,768,192,769,193,770,194,771,195,776,196,778,197,772,256,774,258,808,260,780,461,783,512,785,514,775,550,805,7680,803,7840,777,7842}; static const MVMint32 comp_entry_4[] = {6,775,7682,803,7684,817,7686}; static const MVMint32 comp_entry_5[] = {10,807,199,769,262,770,264,775,266,780,268}; static const MVMint32 comp_entry_6[] = {12,780,270,775,7690,803,7692,817,7694,807,7696,813,7698}; static const MVMint32 comp_entry_7[] = {34,768,200,769,201,770,202,776,203,772,274,774,276,775,278,808,280,780,282,783,516,785,518,807,552,813,7704,816,7706,803,7864,777,7866,771,7868}; static const MVMint32 comp_entry_8[] = {2,775,7710}; static const MVMint32 comp_entry_9[] = {14,770,284,774,286,775,288,807,290,780,486,769,500,772,7712}; static const MVMint32 comp_entry_10[] = {14,770,292,780,542,775,7714,803,7716,776,7718,807,7720,814,7722}; static const MVMint32 comp_entry_11[] = {30,768,204,769,205,770,206,776,207,771,296,772,298,774,300,808,302,775,304,780,463,783,520,785,522,816,7724,777,7880,803,7882}; static const MVMint32 comp_entry_12[] = {2,770,308}; static const MVMint32 comp_entry_13[] = {10,807,310,780,488,769,7728,803,7730,817,7732}; static const MVMint32 comp_entry_14[] = {12,769,313,807,315,780,317,803,7734,817,7738,813,7740}; static const MVMint32 comp_entry_15[] = {6,769,7742,775,7744,803,7746}; static const MVMint32 comp_entry_16[] = {18,771,209,769,323,807,325,780,327,768,504,775,7748,803,7750,817,7752,813,7754}; static const MVMint32 comp_entry_17[] = {32,768,210,769,211,770,212,771,213,776,214,772,332,774,334,779,336,795,416,780,465,808,490,783,524,785,526,775,558,803,7884,777,7886}; static const MVMint32 comp_entry_18[] = {4,769,7764,775,7766}; static const MVMint32 comp_entry_19[] = {16,769,340,807,342,780,344,783,528,785,530,775,7768,803,7770,817,7774}; static const MVMint32 comp_entry_20[] = {14,769,346,770,348,807,350,780,352,806,536,775,7776,803,7778}; static const MVMint32 comp_entry_21[] = {14,807,354,780,356,806,538,775,7786,803,7788,817,7790,813,7792}; static const MVMint32 comp_entry_22[] = {38,768,217,769,218,770,219,776,220,771,360,772,362,774,364,778,366,779,368,808,370,795,431,780,467,783,532,785,534,804,7794,816,7796,813,7798,803,7908,777,7910}; static const MVMint32 comp_entry_23[] = {4,771,7804,803,7806}; static const MVMint32 comp_entry_24[] = {12,770,372,768,7808,769,7810,776,7812,775,7814,803,7816}; static const MVMint32 comp_entry_25[] = {4,775,7818,776,7820}; static const MVMint32 comp_entry_26[] = {18,769,221,770,374,776,376,772,562,775,7822,768,7922,803,7924,777,7926,771,7928}; static const MVMint32 comp_entry_27[] = {12,769,377,775,379,780,381,770,7824,803,7826,817,7828}; static const MVMint32 comp_entry_28[] = {32,768,224,769,225,770,226,771,227,776,228,778,229,772,257,774,259,808,261,780,462,783,513,785,515,775,551,805,7681,803,7841,777,7843}; static const MVMint32 comp_entry_29[] = {6,775,7683,803,7685,817,7687}; static const MVMint32 comp_entry_30[] = {10,807,231,769,263,770,265,775,267,780,269}; static const MVMint32 comp_entry_31[] = {12,780,271,775,7691,803,7693,817,7695,807,7697,813,7699}; static const MVMint32 comp_entry_32[] = {34,768,232,769,233,770,234,776,235,772,275,774,277,775,279,808,281,780,283,783,517,785,519,807,553,813,7705,816,7707,803,7865,777,7867,771,7869}; static const MVMint32 comp_entry_33[] = {2,775,7711}; static const MVMint32 comp_entry_34[] = {14,770,285,774,287,775,289,807,291,780,487,769,501,772,7713}; static const MVMint32 comp_entry_35[] = {16,770,293,780,543,775,7715,803,7717,776,7719,807,7721,814,7723,817,7830}; static const MVMint32 comp_entry_36[] = {28,768,236,769,237,770,238,776,239,771,297,772,299,774,301,808,303,780,464,783,521,785,523,816,7725,777,7881,803,7883}; static const MVMint32 comp_entry_37[] = {4,770,309,780,496}; static const MVMint32 comp_entry_38[] = {10,807,311,780,489,769,7729,803,7731,817,7733}; static const MVMint32 comp_entry_39[] = {12,769,314,807,316,780,318,803,7735,817,7739,813,7741}; static const MVMint32 comp_entry_40[] = {6,769,7743,775,7745,803,7747}; static const MVMint32 comp_entry_41[] = {18,771,241,769,324,807,326,780,328,768,505,775,7749,803,7751,817,7753,813,7755}; static const MVMint32 comp_entry_42[] = {32,768,242,769,243,770,244,771,245,776,246,772,333,774,335,779,337,795,417,780,466,808,491,783,525,785,527,775,559,803,7885,777,7887}; static const MVMint32 comp_entry_43[] = {4,769,7765,775,7767}; static const MVMint32 comp_entry_44[] = {16,769,341,807,343,780,345,783,529,785,531,775,7769,803,7771,817,7775}; static const MVMint32 comp_entry_45[] = {14,769,347,770,349,807,351,780,353,806,537,775,7777,803,7779}; static const MVMint32 comp_entry_46[] = {16,807,355,780,357,806,539,775,7787,803,7789,817,7791,813,7793,776,7831}; static const MVMint32 comp_entry_47[] = {38,768,249,769,250,770,251,776,252,771,361,772,363,774,365,778,367,779,369,808,371,795,432,780,468,783,533,785,535,804,7795,816,7797,813,7799,803,7909,777,7911}; static const MVMint32 comp_entry_48[] = {4,771,7805,803,7807}; static const MVMint32 comp_entry_49[] = {14,770,373,768,7809,769,7811,776,7813,775,7815,803,7817,778,7832}; static const MVMint32 comp_entry_50[] = {4,775,7819,776,7821}; static const MVMint32 comp_entry_51[] = {20,769,253,776,255,770,375,772,563,775,7823,778,7833,768,7923,803,7925,777,7927,771,7929}; static const MVMint32 comp_entry_52[] = {12,769,378,775,380,780,382,770,7825,803,7827,817,7829}; static const MVMint32 comp_entry_53[] = {6,769,901,834,8129,768,8173}; static const MVMint32 comp_entry_54[] = {8,769,7844,768,7846,777,7848,771,7850}; static const MVMint32 comp_entry_55[] = {2,772,478}; static const MVMint32 comp_entry_56[] = {2,769,506}; static const MVMint32 comp_entry_57[] = {4,772,482,769,508}; static const MVMint32 comp_entry_58[] = {2,769,7688}; static const MVMint32 comp_entry_59[] = {8,769,7870,768,7872,777,7874,771,7876}; static const MVMint32 comp_entry_60[] = {2,769,7726}; static const MVMint32 comp_entry_61[] = {8,769,7888,768,7890,777,7892,771,7894}; static const MVMint32 comp_entry_62[] = {6,772,556,769,7756,776,7758}; static const MVMint32 comp_entry_63[] = {2,772,554}; static const MVMint32 comp_entry_64[] = {2,769,510}; static const MVMint32 comp_entry_65[] = {8,772,469,769,471,780,473,768,475}; static const MVMint32 comp_entry_66[] = {8,769,7845,768,7847,777,7849,771,7851}; static const MVMint32 comp_entry_67[] = {2,772,479}; static const MVMint32 comp_entry_68[] = {2,769,507}; static const MVMint32 comp_entry_69[] = {4,772,483,769,509}; static const MVMint32 comp_entry_70[] = {2,769,7689}; static const MVMint32 comp_entry_71[] = {8,769,7871,768,7873,777,7875,771,7877}; static const MVMint32 comp_entry_72[] = {2,769,7727}; static const MVMint32 comp_entry_73[] = {8,769,7889,768,7891,777,7893,771,7895}; static const MVMint32 comp_entry_74[] = {6,772,557,769,7757,776,7759}; static const MVMint32 comp_entry_75[] = {2,772,555}; static const MVMint32 comp_entry_76[] = {2,769,511}; static const MVMint32 comp_entry_77[] = {8,772,470,769,472,780,474,768,476}; static const MVMint32 comp_entry_78[] = {8,769,7854,768,7856,777,7858,771,7860}; static const MVMint32 comp_entry_79[] = {8,769,7855,768,7857,777,7859,771,7861}; static const MVMint32 comp_entry_80[] = {4,768,7700,769,7702}; static const MVMint32 comp_entry_81[] = {4,768,7701,769,7703}; static const MVMint32 comp_entry_82[] = {4,768,7760,769,7762}; static const MVMint32 comp_entry_83[] = {4,768,7761,769,7763}; static const MVMint32 comp_entry_84[] = {2,775,7780}; static const MVMint32 comp_entry_85[] = {2,775,7781}; static const MVMint32 comp_entry_86[] = {2,775,7782}; static const MVMint32 comp_entry_87[] = {2,775,7783}; static const MVMint32 comp_entry_88[] = {2,769,7800}; static const MVMint32 comp_entry_89[] = {2,769,7801}; static const MVMint32 comp_entry_90[] = {2,776,7802}; static const MVMint32 comp_entry_91[] = {2,776,7803}; static const MVMint32 comp_entry_92[] = {2,775,7835}; static const MVMint32 comp_entry_93[] = {10,769,7898,768,7900,777,7902,771,7904,803,7906}; static const MVMint32 comp_entry_94[] = {10,769,7899,768,7901,777,7903,771,7905,803,7907}; static const MVMint32 comp_entry_95[] = {10,769,7912,768,7914,777,7916,771,7918,803,7920}; static const MVMint32 comp_entry_96[] = {10,769,7913,768,7915,777,7917,771,7919,803,7921}; static const MVMint32 comp_entry_97[] = {2,780,494}; static const MVMint32 comp_entry_98[] = {2,772,492}; static const MVMint32 comp_entry_99[] = {2,772,493}; static const MVMint32 comp_entry_100[] = {2,772,480}; static const MVMint32 comp_entry_101[] = {2,772,481}; static const MVMint32 comp_entry_102[] = {2,774,7708}; static const MVMint32 comp_entry_103[] = {2,774,7709}; static const MVMint32 comp_entry_104[] = {2,772,560}; static const MVMint32 comp_entry_105[] = {2,772,561}; static const MVMint32 comp_entry_106[] = {2,780,495}; static const MVMint32 comp_entry_107[] = {14,769,902,787,7944,788,7945,774,8120,772,8121,768,8122,837,8124}; static const MVMint32 comp_entry_108[] = {8,769,904,787,7960,788,7961,768,8136}; static const MVMint32 comp_entry_109[] = {10,769,905,787,7976,788,7977,768,8138,837,8140}; static const MVMint32 comp_entry_110[] = {14,769,906,776,938,787,7992,788,7993,774,8152,772,8153,768,8154}; static const MVMint32 comp_entry_111[] = {8,769,908,787,8008,788,8009,768,8184}; static const MVMint32 comp_entry_112[] = {2,788,8172}; static const MVMint32 comp_entry_113[] = {12,769,910,776,939,788,8025,774,8168,772,8169,768,8170}; static const MVMint32 comp_entry_114[] = {10,769,911,787,8040,788,8041,768,8186,837,8188}; static const MVMint32 comp_entry_115[] = {2,837,8116}; static const MVMint32 comp_entry_116[] = {2,837,8132}; static const MVMint32 comp_entry_117[] = {16,769,940,787,7936,788,7937,768,8048,774,8112,772,8113,837,8115,834,8118}; static const MVMint32 comp_entry_118[] = {8,769,941,787,7952,788,7953,768,8050}; static const MVMint32 comp_entry_119[] = {12,769,942,787,7968,788,7969,768,8052,837,8131,834,8134}; static const MVMint32 comp_entry_120[] = {16,769,943,776,970,787,7984,788,7985,768,8054,774,8144,772,8145,834,8150}; static const MVMint32 comp_entry_121[] = {8,769,972,787,8000,788,8001,768,8056}; static const MVMint32 comp_entry_122[] = {4,787,8164,788,8165}; static const MVMint32 comp_entry_123[] = {16,776,971,769,973,787,8016,788,8017,768,8058,774,8160,772,8161,834,8166}; static const MVMint32 comp_entry_124[] = {12,769,974,787,8032,788,8033,768,8060,837,8179,834,8182}; static const MVMint32 comp_entry_125[] = {6,769,912,768,8146,834,8151}; static const MVMint32 comp_entry_126[] = {6,769,944,768,8162,834,8167}; static const MVMint32 comp_entry_127[] = {2,837,8180}; static const MVMint32 comp_entry_128[] = {4,769,979,776,980}; static const MVMint32 comp_entry_129[] = {2,776,1031}; static const MVMint32 comp_entry_130[] = {4,774,1232,776,1234}; static const MVMint32 comp_entry_131[] = {2,769,1027}; static const MVMint32 comp_entry_132[] = {6,768,1024,776,1025,774,1238}; static const MVMint32 comp_entry_133[] = {4,774,1217,776,1244}; static const MVMint32 comp_entry_134[] = {2,776,1246}; static const MVMint32 comp_entry_135[] = {8,768,1037,774,1049,772,1250,776,1252}; static const MVMint32 comp_entry_136[] = {2,769,1036}; static const MVMint32 comp_entry_137[] = {2,776,1254}; static const MVMint32 comp_entry_138[] = {8,774,1038,772,1262,776,1264,779,1266}; static const MVMint32 comp_entry_139[] = {2,776,1268}; static const MVMint32 comp_entry_140[] = {2,776,1272}; static const MVMint32 comp_entry_141[] = {2,776,1260}; static const MVMint32 comp_entry_142[] = {4,774,1233,776,1235}; static const MVMint32 comp_entry_143[] = {2,769,1107}; static const MVMint32 comp_entry_144[] = {6,768,1104,776,1105,774,1239}; static const MVMint32 comp_entry_145[] = {4,774,1218,776,1245}; static const MVMint32 comp_entry_146[] = {2,776,1247}; static const MVMint32 comp_entry_147[] = {8,774,1081,768,1117,772,1251,776,1253}; static const MVMint32 comp_entry_148[] = {2,769,1116}; static const MVMint32 comp_entry_149[] = {2,776,1255}; static const MVMint32 comp_entry_150[] = {8,774,1118,772,1263,776,1265,779,1267}; static const MVMint32 comp_entry_151[] = {2,776,1269}; static const MVMint32 comp_entry_152[] = {2,776,1273}; static const MVMint32 comp_entry_153[] = {2,776,1261}; static const MVMint32 comp_entry_154[] = {2,776,1111}; static const MVMint32 comp_entry_155[] = {2,783,1142}; static const MVMint32 comp_entry_156[] = {2,783,1143}; static const MVMint32 comp_entry_157[] = {2,776,1242}; static const MVMint32 comp_entry_158[] = {2,776,1243}; static const MVMint32 comp_entry_159[] = {2,776,1258}; static const MVMint32 comp_entry_160[] = {2,776,1259}; static const MVMint32 comp_entry_161[] = {6,1619,1570,1620,1571,1621,1573}; static const MVMint32 comp_entry_162[] = {2,1620,1572}; static const MVMint32 comp_entry_163[] = {2,1620,1574}; static const MVMint32 comp_entry_164[] = {2,1620,1730}; static const MVMint32 comp_entry_165[] = {2,1620,1747}; static const MVMint32 comp_entry_166[] = {2,1620,1728}; static const MVMint32 comp_entry_167[] = {2,2364,2345}; static const MVMint32 comp_entry_168[] = {2,2364,2353}; static const MVMint32 comp_entry_169[] = {2,2364,2356}; static const MVMint32 comp_entry_170[] = {4,2494,2507,2519,2508}; static const MVMint32 comp_entry_171[] = {6,2902,2888,2878,2891,2903,2892}; static const MVMint32 comp_entry_172[] = {2,3031,2964}; static const MVMint32 comp_entry_173[] = {4,3006,3018,3031,3020}; static const MVMint32 comp_entry_174[] = {2,3006,3019}; static const MVMint32 comp_entry_175[] = {2,3158,3144}; static const MVMint32 comp_entry_176[] = {2,3285,3264}; static const MVMint32 comp_entry_177[] = {6,3285,3271,3286,3272,3266,3274}; static const MVMint32 comp_entry_178[] = {2,3285,3275}; static const MVMint32 comp_entry_179[] = {4,3390,3402,3415,3404}; static const MVMint32 comp_entry_180[] = {2,3390,3403}; static const MVMint32 comp_entry_181[] = {6,3530,3546,3535,3548,3551,3550}; static const MVMint32 comp_entry_182[] = {2,3530,3549}; static const MVMint32 comp_entry_183[] = {2,4142,4134}; static const MVMint32 comp_entry_184[] = {2,6965,6918}; static const MVMint32 comp_entry_185[] = {2,6965,6920}; static const MVMint32 comp_entry_186[] = {2,6965,6922}; static const MVMint32 comp_entry_187[] = {2,6965,6924}; static const MVMint32 comp_entry_188[] = {2,6965,6926}; static const MVMint32 comp_entry_189[] = {2,6965,6930}; static const MVMint32 comp_entry_190[] = {2,6965,6971}; static const MVMint32 comp_entry_191[] = {2,6965,6973}; static const MVMint32 comp_entry_192[] = {2,6965,6976}; static const MVMint32 comp_entry_193[] = {2,6965,6977}; static const MVMint32 comp_entry_194[] = {2,6965,6979}; static const MVMint32 comp_entry_195[] = {2,772,7736}; static const MVMint32 comp_entry_196[] = {2,772,7737}; static const MVMint32 comp_entry_197[] = {2,772,7772}; static const MVMint32 comp_entry_198[] = {2,772,7773}; static const MVMint32 comp_entry_199[] = {2,775,7784}; static const MVMint32 comp_entry_200[] = {2,775,7785}; static const MVMint32 comp_entry_201[] = {4,770,7852,774,7862}; static const MVMint32 comp_entry_202[] = {4,770,7853,774,7863}; static const MVMint32 comp_entry_203[] = {2,770,7878}; static const MVMint32 comp_entry_204[] = {2,770,7879}; static const MVMint32 comp_entry_205[] = {2,770,7896}; static const MVMint32 comp_entry_206[] = {2,770,7897}; static const MVMint32 comp_entry_207[] = {8,768,7938,769,7940,834,7942,837,8064}; static const MVMint32 comp_entry_208[] = {8,768,7939,769,7941,834,7943,837,8065}; static const MVMint32 comp_entry_209[] = {2,837,8066}; static const MVMint32 comp_entry_210[] = {2,837,8067}; static const MVMint32 comp_entry_211[] = {2,837,8068}; static const MVMint32 comp_entry_212[] = {2,837,8069}; static const MVMint32 comp_entry_213[] = {2,837,8070}; static const MVMint32 comp_entry_214[] = {2,837,8071}; static const MVMint32 comp_entry_215[] = {8,768,7946,769,7948,834,7950,837,8072}; static const MVMint32 comp_entry_216[] = {8,768,7947,769,7949,834,7951,837,8073}; static const MVMint32 comp_entry_217[] = {2,837,8074}; static const MVMint32 comp_entry_218[] = {2,837,8075}; static const MVMint32 comp_entry_219[] = {2,837,8076}; static const MVMint32 comp_entry_220[] = {2,837,8077}; static const MVMint32 comp_entry_221[] = {2,837,8078}; static const MVMint32 comp_entry_222[] = {2,837,8079}; static const MVMint32 comp_entry_223[] = {4,768,7954,769,7956}; static const MVMint32 comp_entry_224[] = {4,768,7955,769,7957}; static const MVMint32 comp_entry_225[] = {4,768,7962,769,7964}; static const MVMint32 comp_entry_226[] = {4,768,7963,769,7965}; static const MVMint32 comp_entry_227[] = {8,768,7970,769,7972,834,7974,837,8080}; static const MVMint32 comp_entry_228[] = {8,768,7971,769,7973,834,7975,837,8081}; static const MVMint32 comp_entry_229[] = {2,837,8082}; static const MVMint32 comp_entry_230[] = {2,837,8083}; static const MVMint32 comp_entry_231[] = {2,837,8084}; static const MVMint32 comp_entry_232[] = {2,837,8085}; static const MVMint32 comp_entry_233[] = {2,837,8086}; static const MVMint32 comp_entry_234[] = {2,837,8087}; static const MVMint32 comp_entry_235[] = {8,768,7978,769,7980,834,7982,837,8088}; static const MVMint32 comp_entry_236[] = {8,768,7979,769,7981,834,7983,837,8089}; static const MVMint32 comp_entry_237[] = {2,837,8090}; static const MVMint32 comp_entry_238[] = {2,837,8091}; static const MVMint32 comp_entry_239[] = {2,837,8092}; static const MVMint32 comp_entry_240[] = {2,837,8093}; static const MVMint32 comp_entry_241[] = {2,837,8094}; static const MVMint32 comp_entry_242[] = {2,837,8095}; static const MVMint32 comp_entry_243[] = {6,768,7986,769,7988,834,7990}; static const MVMint32 comp_entry_244[] = {6,768,7987,769,7989,834,7991}; static const MVMint32 comp_entry_245[] = {6,768,7994,769,7996,834,7998}; static const MVMint32 comp_entry_246[] = {6,768,7995,769,7997,834,7999}; static const MVMint32 comp_entry_247[] = {4,768,8002,769,8004}; static const MVMint32 comp_entry_248[] = {4,768,8003,769,8005}; static const MVMint32 comp_entry_249[] = {4,768,8010,769,8012}; static const MVMint32 comp_entry_250[] = {4,768,8011,769,8013}; static const MVMint32 comp_entry_251[] = {6,768,8018,769,8020,834,8022}; static const MVMint32 comp_entry_252[] = {6,768,8019,769,8021,834,8023}; static const MVMint32 comp_entry_253[] = {6,768,8027,769,8029,834,8031}; static const MVMint32 comp_entry_254[] = {8,768,8034,769,8036,834,8038,837,8096}; static const MVMint32 comp_entry_255[] = {8,768,8035,769,8037,834,8039,837,8097}; static const MVMint32 comp_entry_256[] = {2,837,8098}; static const MVMint32 comp_entry_257[] = {2,837,8099}; static const MVMint32 comp_entry_258[] = {2,837,8100}; static const MVMint32 comp_entry_259[] = {2,837,8101}; static const MVMint32 comp_entry_260[] = {2,837,8102}; static const MVMint32 comp_entry_261[] = {2,837,8103}; static const MVMint32 comp_entry_262[] = {8,768,8042,769,8044,834,8046,837,8104}; static const MVMint32 comp_entry_263[] = {8,768,8043,769,8045,834,8047,837,8105}; static const MVMint32 comp_entry_264[] = {2,837,8106}; static const MVMint32 comp_entry_265[] = {2,837,8107}; static const MVMint32 comp_entry_266[] = {2,837,8108}; static const MVMint32 comp_entry_267[] = {2,837,8109}; static const MVMint32 comp_entry_268[] = {2,837,8110}; static const MVMint32 comp_entry_269[] = {2,837,8111}; static const MVMint32 comp_entry_270[] = {2,837,8114}; static const MVMint32 comp_entry_271[] = {2,837,8130}; static const MVMint32 comp_entry_272[] = {2,837,8178}; static const MVMint32 comp_entry_273[] = {2,837,8119}; static const MVMint32 comp_entry_274[] = {6,768,8141,769,8142,834,8143}; static const MVMint32 comp_entry_275[] = {2,837,8135}; static const MVMint32 comp_entry_276[] = {2,837,8183}; static const MVMint32 comp_entry_277[] = {6,768,8157,769,8158,834,8159}; static const MVMint32 comp_entry_278[] = {2,824,8602}; static const MVMint32 comp_entry_279[] = {2,824,8603}; static const MVMint32 comp_entry_280[] = {2,824,8622}; static const MVMint32 comp_entry_281[] = {2,824,8653}; static const MVMint32 comp_entry_282[] = {2,824,8655}; static const MVMint32 comp_entry_283[] = {2,824,8654}; static const MVMint32 comp_entry_284[] = {2,824,8708}; static const MVMint32 comp_entry_285[] = {2,824,8713}; static const MVMint32 comp_entry_286[] = {2,824,8716}; static const MVMint32 comp_entry_287[] = {2,824,8740}; static const MVMint32 comp_entry_288[] = {2,824,8742}; static const MVMint32 comp_entry_289[] = {2,824,8769}; static const MVMint32 comp_entry_290[] = {2,824,8772}; static const MVMint32 comp_entry_291[] = {2,824,8775}; static const MVMint32 comp_entry_292[] = {2,824,8777}; static const MVMint32 comp_entry_293[] = {2,824,8813}; static const MVMint32 comp_entry_294[] = {2,824,8802}; static const MVMint32 comp_entry_295[] = {2,824,8816}; static const MVMint32 comp_entry_296[] = {2,824,8817}; static const MVMint32 comp_entry_297[] = {2,824,8820}; static const MVMint32 comp_entry_298[] = {2,824,8821}; static const MVMint32 comp_entry_299[] = {2,824,8824}; static const MVMint32 comp_entry_300[] = {2,824,8825}; static const MVMint32 comp_entry_301[] = {2,824,8832}; static const MVMint32 comp_entry_302[] = {2,824,8833}; static const MVMint32 comp_entry_303[] = {2,824,8928}; static const MVMint32 comp_entry_304[] = {2,824,8929}; static const MVMint32 comp_entry_305[] = {2,824,8836}; static const MVMint32 comp_entry_306[] = {2,824,8837}; static const MVMint32 comp_entry_307[] = {2,824,8840}; static const MVMint32 comp_entry_308[] = {2,824,8841}; static const MVMint32 comp_entry_309[] = {2,824,8930}; static const MVMint32 comp_entry_310[] = {2,824,8931}; static const MVMint32 comp_entry_311[] = {2,824,8876}; static const MVMint32 comp_entry_312[] = {2,824,8877}; static const MVMint32 comp_entry_313[] = {2,824,8878}; static const MVMint32 comp_entry_314[] = {2,824,8879}; static const MVMint32 comp_entry_315[] = {2,824,8938}; static const MVMint32 comp_entry_316[] = {2,824,8939}; static const MVMint32 comp_entry_317[] = {2,824,8940}; static const MVMint32 comp_entry_318[] = {2,824,8941}; static const MVMint32 comp_entry_319[] = {2,12441,12436}; static const MVMint32 comp_entry_320[] = {2,12441,12364}; static const MVMint32 comp_entry_321[] = {2,12441,12366}; static const MVMint32 comp_entry_322[] = {2,12441,12368}; static const MVMint32 comp_entry_323[] = {2,12441,12370}; static const MVMint32 comp_entry_324[] = {2,12441,12372}; static const MVMint32 comp_entry_325[] = {2,12441,12374}; static const MVMint32 comp_entry_326[] = {2,12441,12376}; static const MVMint32 comp_entry_327[] = {2,12441,12378}; static const MVMint32 comp_entry_328[] = {2,12441,12380}; static const MVMint32 comp_entry_329[] = {2,12441,12382}; static const MVMint32 comp_entry_330[] = {2,12441,12384}; static const MVMint32 comp_entry_331[] = {2,12441,12386}; static const MVMint32 comp_entry_332[] = {2,12441,12389}; static const MVMint32 comp_entry_333[] = {2,12441,12391}; static const MVMint32 comp_entry_334[] = {2,12441,12393}; static const MVMint32 comp_entry_335[] = {4,12441,12400,12442,12401}; static const MVMint32 comp_entry_336[] = {4,12441,12403,12442,12404}; static const MVMint32 comp_entry_337[] = {4,12441,12406,12442,12407}; static const MVMint32 comp_entry_338[] = {4,12441,12409,12442,12410}; static const MVMint32 comp_entry_339[] = {4,12441,12412,12442,12413}; static const MVMint32 comp_entry_340[] = {2,12441,12446}; static const MVMint32 comp_entry_341[] = {2,12441,12532}; static const MVMint32 comp_entry_342[] = {2,12441,12460}; static const MVMint32 comp_entry_343[] = {2,12441,12462}; static const MVMint32 comp_entry_344[] = {2,12441,12464}; static const MVMint32 comp_entry_345[] = {2,12441,12466}; static const MVMint32 comp_entry_346[] = {2,12441,12468}; static const MVMint32 comp_entry_347[] = {2,12441,12470}; static const MVMint32 comp_entry_348[] = {2,12441,12472}; static const MVMint32 comp_entry_349[] = {2,12441,12474}; static const MVMint32 comp_entry_350[] = {2,12441,12476}; static const MVMint32 comp_entry_351[] = {2,12441,12478}; static const MVMint32 comp_entry_352[] = {2,12441,12480}; static const MVMint32 comp_entry_353[] = {2,12441,12482}; static const MVMint32 comp_entry_354[] = {2,12441,12485}; static const MVMint32 comp_entry_355[] = {2,12441,12487}; static const MVMint32 comp_entry_356[] = {2,12441,12489}; static const MVMint32 comp_entry_357[] = {4,12441,12496,12442,12497}; static const MVMint32 comp_entry_358[] = {4,12441,12499,12442,12500}; static const MVMint32 comp_entry_359[] = {4,12441,12502,12442,12503}; static const MVMint32 comp_entry_360[] = {4,12441,12505,12442,12506}; static const MVMint32 comp_entry_361[] = {4,12441,12508,12442,12509}; static const MVMint32 comp_entry_362[] = {2,12441,12535}; static const MVMint32 comp_entry_363[] = {2,12441,12536}; static const MVMint32 comp_entry_364[] = {2,12441,12537}; static const MVMint32 comp_entry_365[] = {2,12441,12538}; static const MVMint32 comp_entry_366[] = {2,12441,12542}; static const MVMint32 comp_entry_367[] = {2,69818,69786}; static const MVMint32 comp_entry_368[] = {2,69818,69788}; static const MVMint32 comp_entry_369[] = {2,69818,69803}; static const MVMint32 comp_entry_370[] = {2,69927,69934}; static const MVMint32 comp_entry_371[] = {2,69927,69935}; static const MVMint32 comp_entry_372[] = {4,70462,70475,70487,70476}; static const MVMint32 comp_entry_373[] = {6,70842,70843,70832,70844,70845,70846}; static const MVMint32 comp_entry_374[] = {2,71087,71098}; static const MVMint32 comp_entry_375[] = {2,71087,71099}; static const MVMint32 *comp_l_empty[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_0[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_0,comp_entry_1,comp_entry_2,NULL,NULL,comp_entry_3,comp_entry_4,comp_entry_5,comp_entry_6,comp_entry_7,comp_entry_8,comp_entry_9,comp_entry_10,comp_entry_11,comp_entry_12,comp_entry_13,comp_entry_14,comp_entry_15,comp_entry_16,comp_entry_17,comp_entry_18,NULL,comp_entry_19,comp_entry_20,comp_entry_21,comp_entry_22,comp_entry_23,comp_entry_24,comp_entry_25,comp_entry_26,comp_entry_27,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_28,comp_entry_29,comp_entry_30,comp_entry_31,comp_entry_32,comp_entry_33,comp_entry_34,comp_entry_35,comp_entry_36,comp_entry_37,comp_entry_38,comp_entry_39,comp_entry_40,comp_entry_41,comp_entry_42,comp_entry_43,NULL,comp_entry_44,comp_entry_45,comp_entry_46,comp_entry_47,comp_entry_48,comp_entry_49,comp_entry_50,comp_entry_51,comp_entry_52,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_53,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_54,NULL,comp_entry_55,comp_entry_56,comp_entry_57,comp_entry_58,NULL,NULL,comp_entry_59,NULL,NULL,NULL,NULL,comp_entry_60,NULL,NULL,NULL,NULL,comp_entry_61,comp_entry_62,comp_entry_63,NULL,comp_entry_64,NULL,NULL,NULL,comp_entry_65,NULL,NULL,NULL,NULL,NULL,comp_entry_66,NULL,comp_entry_67,comp_entry_68,comp_entry_69,comp_entry_70,NULL,NULL,comp_entry_71,NULL,NULL,NULL,NULL,comp_entry_72,NULL,NULL,NULL,NULL,comp_entry_73,comp_entry_74,comp_entry_75,NULL,comp_entry_76,NULL,NULL,NULL,comp_entry_77,NULL,NULL,NULL,}; static const MVMint32 *comp_l_1[] = {NULL,NULL,comp_entry_78,comp_entry_79,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_80,comp_entry_81,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_82,comp_entry_83,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_84,comp_entry_85,NULL,NULL,NULL,NULL,comp_entry_86,comp_entry_87,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_88,comp_entry_89,comp_entry_90,comp_entry_91,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_92,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_93,comp_entry_94,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_95,comp_entry_96,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_97,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_98,comp_entry_99,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_2[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_100,comp_entry_101,comp_entry_102,comp_entry_103,NULL,NULL,NULL,NULL,comp_entry_104,comp_entry_105,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_106,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_3[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_107,NULL,NULL,NULL,comp_entry_108,NULL,comp_entry_109,NULL,comp_entry_110,NULL,NULL,NULL,NULL,NULL,comp_entry_111,NULL,comp_entry_112,NULL,NULL,NULL,comp_entry_113,NULL,NULL,NULL,comp_entry_114,NULL,NULL,comp_entry_115,NULL,comp_entry_116,NULL,NULL,comp_entry_117,NULL,NULL,NULL,comp_entry_118,NULL,comp_entry_119,NULL,comp_entry_120,NULL,NULL,NULL,NULL,NULL,comp_entry_121,NULL,comp_entry_122,NULL,NULL,NULL,comp_entry_123,NULL,NULL,NULL,comp_entry_124,comp_entry_125,comp_entry_126,NULL,NULL,comp_entry_127,NULL,NULL,NULL,comp_entry_128,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_4[] = {NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_129,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_130,NULL,NULL,comp_entry_131,NULL,comp_entry_132,comp_entry_133,comp_entry_134,comp_entry_135,NULL,comp_entry_136,NULL,NULL,NULL,comp_entry_137,NULL,NULL,NULL,NULL,comp_entry_138,NULL,NULL,NULL,comp_entry_139,NULL,NULL,NULL,comp_entry_140,NULL,comp_entry_141,NULL,NULL,comp_entry_142,NULL,NULL,comp_entry_143,NULL,comp_entry_144,comp_entry_145,comp_entry_146,comp_entry_147,NULL,comp_entry_148,NULL,NULL,NULL,comp_entry_149,NULL,NULL,NULL,NULL,comp_entry_150,NULL,NULL,NULL,comp_entry_151,NULL,NULL,NULL,comp_entry_152,NULL,comp_entry_153,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_154,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_155,comp_entry_156,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_157,comp_entry_158,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_159,comp_entry_160,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_5[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_161,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_162,NULL,comp_entry_163,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_164,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_165,NULL,NULL,comp_entry_166,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_6[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_167,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_168,NULL,NULL,comp_entry_169,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_170,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_7[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_171,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_172,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_173,comp_entry_174,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_8[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_175,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_176,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_177,NULL,NULL,NULL,comp_entry_178,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_9[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_179,comp_entry_180,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_181,NULL,NULL,comp_entry_182,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_10[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_183,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_11[] = {NULL,NULL,NULL,NULL,NULL,comp_entry_184,NULL,comp_entry_185,NULL,comp_entry_186,NULL,comp_entry_187,NULL,comp_entry_188,NULL,NULL,NULL,comp_entry_189,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_190,NULL,comp_entry_191,NULL,comp_entry_192,comp_entry_193,NULL,NULL,comp_entry_194,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_12[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_195,comp_entry_196,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_197,comp_entry_198,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_199,comp_entry_200,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_201,comp_entry_202,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_203,comp_entry_204,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_205,comp_entry_206,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_13[] = {comp_entry_207,comp_entry_208,comp_entry_209,comp_entry_210,comp_entry_211,comp_entry_212,comp_entry_213,comp_entry_214,comp_entry_215,comp_entry_216,comp_entry_217,comp_entry_218,comp_entry_219,comp_entry_220,comp_entry_221,comp_entry_222,comp_entry_223,comp_entry_224,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_225,comp_entry_226,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_227,comp_entry_228,comp_entry_229,comp_entry_230,comp_entry_231,comp_entry_232,comp_entry_233,comp_entry_234,comp_entry_235,comp_entry_236,comp_entry_237,comp_entry_238,comp_entry_239,comp_entry_240,comp_entry_241,comp_entry_242,comp_entry_243,comp_entry_244,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_245,comp_entry_246,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_247,comp_entry_248,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_249,comp_entry_250,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_251,comp_entry_252,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_253,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_254,comp_entry_255,comp_entry_256,comp_entry_257,comp_entry_258,comp_entry_259,comp_entry_260,comp_entry_261,comp_entry_262,comp_entry_263,comp_entry_264,comp_entry_265,comp_entry_266,comp_entry_267,comp_entry_268,comp_entry_269,comp_entry_270,NULL,NULL,NULL,comp_entry_271,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_272,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_273,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_274,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_275,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_276,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_277,NULL,}; static const MVMint32 *comp_l_14[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_278,NULL,comp_entry_279,NULL,comp_entry_280,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_281,NULL,comp_entry_282,NULL,comp_entry_283,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_15[] = {NULL,NULL,NULL,comp_entry_284,NULL,NULL,NULL,NULL,comp_entry_285,NULL,NULL,comp_entry_286,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_287,NULL,comp_entry_288,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_289,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_290,NULL,comp_entry_291,NULL,NULL,comp_entry_292,NULL,NULL,NULL,NULL,comp_entry_293,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_294,NULL,NULL,comp_entry_295,comp_entry_296,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_297,comp_entry_298,NULL,NULL,comp_entry_299,comp_entry_300,NULL,NULL,comp_entry_301,comp_entry_302,comp_entry_303,comp_entry_304,NULL,NULL,NULL,NULL,comp_entry_305,comp_entry_306,NULL,NULL,comp_entry_307,comp_entry_308,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_309,comp_entry_310,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_311,NULL,NULL,NULL,NULL,NULL,comp_entry_312,comp_entry_313,NULL,comp_entry_314,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_315,comp_entry_316,comp_entry_317,comp_entry_318,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_16[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_319,NULL,NULL,NULL,NULL,comp_entry_320,NULL,comp_entry_321,NULL,comp_entry_322,NULL,comp_entry_323,NULL,comp_entry_324,NULL,comp_entry_325,NULL,comp_entry_326,NULL,comp_entry_327,NULL,comp_entry_328,NULL,comp_entry_329,NULL,comp_entry_330,NULL,comp_entry_331,NULL,NULL,comp_entry_332,NULL,comp_entry_333,NULL,comp_entry_334,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_335,NULL,NULL,comp_entry_336,NULL,NULL,comp_entry_337,NULL,NULL,comp_entry_338,NULL,NULL,comp_entry_339,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_340,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_341,NULL,NULL,NULL,NULL,comp_entry_342,NULL,comp_entry_343,NULL,comp_entry_344,NULL,comp_entry_345,NULL,comp_entry_346,NULL,comp_entry_347,NULL,comp_entry_348,NULL,comp_entry_349,NULL,comp_entry_350,NULL,comp_entry_351,NULL,comp_entry_352,NULL,comp_entry_353,NULL,NULL,comp_entry_354,NULL,comp_entry_355,NULL,comp_entry_356,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_357,NULL,NULL,comp_entry_358,NULL,NULL,comp_entry_359,NULL,NULL,comp_entry_360,NULL,NULL,comp_entry_361,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_362,comp_entry_363,comp_entry_364,comp_entry_365,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_366,NULL,NULL,}; static const MVMint32 *comp_l_17[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_367,NULL,comp_entry_368,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_369,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_18[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_370,comp_entry_371,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_19[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_372,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_20[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_373,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 *comp_l_21[] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,comp_entry_374,comp_entry_375,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,}; static const MVMint32 **comp_u_empty[] = {comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,}; static const MVMint32 **comp_u_0[] = {comp_l_0,comp_l_1,comp_l_2,comp_l_3,comp_l_4,comp_l_empty,comp_l_5,comp_l_empty,comp_l_empty,comp_l_6,comp_l_empty,comp_l_7,comp_l_8,comp_l_9,comp_l_empty,comp_l_empty,comp_l_10,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_11,comp_l_empty,comp_l_empty,comp_l_12,comp_l_13,comp_l_empty,comp_l_14,comp_l_15,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_16,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,}; static const MVMint32 **comp_u_1[] = {comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_17,comp_l_18,comp_l_empty,comp_l_19,comp_l_20,comp_l_21,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,comp_l_empty,}; static const MVMint32 ***comp_p[] = {comp_u_0,comp_u_1,comp_u_empty,comp_u_empty,comp_u_empty,comp_u_empty,comp_u_empty,comp_u_empty,comp_u_empty,comp_u_empty,comp_u_empty,comp_u_empty,comp_u_empty,comp_u_empty,comp_u_empty,comp_u_empty,comp_u_empty,}; static const MVMint32 codepoint_extents[106][3] = { {0x0000,0,0}, {0x3406,2,13318}, {0x3483,0,13319}, {0x3484,2,13320}, {0x382a,0,13321}, {0x382b,2,13322}, {0x3b4d,0,13323}, {0x3b4e,2,13324}, {0x4dc0,0,13335}, {0x4f71,2,13768}, {0x5104,0,13769}, {0x516e,2,13875}, {0x5341,0,13876}, {0x534d,2,13888}, {0x53c1,0,13889}, {0x53c5,2,13893}, {0x56db,0,13894}, {0x56dc,2,13895}, {0x58f1,0,13896}, {0x58fa,2,13905}, {0x5e7a,0,13906}, {0x5e7b,2,13907}, {0x5efe,0,13908}, {0x5f11,2,13927}, {0x62fe,0,13928}, {0x634d,2,14007}, {0x67d2,0,14008}, {0x67d3,2,14009}, {0x6f06,0,14010}, {0x6f07,2,14011}, {0x7396,0,14012}, {0x7397,2,14013}, {0x767e,0,14014}, {0x767f,2,14015}, {0x8086,0,14016}, {0x8087,2,14017}, {0x842c,0,14018}, {0x842d,2,14019}, {0x8cae,0,14020}, {0x8cb4,2,14026}, {0x8d30,0,14027}, {0x8d31,2,14028}, {0x9621,0,14029}, {0x9679,2,14117}, {0x96f6,0,14118}, {0x96f7,2,14119}, {0x9fa6,0,14120}, {0xd800,2,28546}, {0xdb80,2,28547}, {0xdc00,2,28548}, {0xe000,2,28549}, {0xf900,0,28550}, {0xfffe,1,0}, {0x10000,0,30340}, {0x12544,1,0}, {0x13000,0,39880}, {0x1342f,1,0}, {0x14400,0,40951}, {0x14647,1,0}, {0x16800,0,41534}, {0x17000,2,43582}, {0x18800,0,43602}, {0x18af3,1,0}, {0x1b000,0,44357}, {0x1b2fc,1,0}, {0x1bc00,0,45121}, {0x1bca4,1,0}, {0x1d000,0,45285}, {0x1dab0,1,0}, {0x1e000,0,48021}, {0x1e02b,1,0}, {0x1e800,0,48064}, {0x1e960,1,0}, {0x1ee00,0,48416}, {0x1f9e7,1,0}, {0x20000,0,51463}, {0x20065,2,51564}, {0x200e2,0,51565}, {0x20122,2,51629}, {0x2092a,0,51630}, {0x2099d,2,51745}, {0x20aea,0,51746}, {0x20b1a,2,51794}, {0x22390,0,51795}, {0x22391,2,51796}, {0x22998,0,51797}, {0x22999,2,51798}, {0x23b1b,0,51799}, {0x23b1c,2,51800}, {0x2626d,0,51801}, {0x2626e,2,51802}, {0x2a700,2,51844}, {0x2b740,2,51856}, {0x2b820,2,51859}, {0x2ceb0,2,51874}, {0x2ebe1,1,0}, {0x2f800,0,51875}, {0x2fa1e,1,0}, {0xe0001,0,52417}, {0xe01f0,1,0}, {0xf0000,2,52912}, {0xffffe,1,0}, {0x100000,2,52913}, {0x10fffe,1,0}, {0x110000,0,52914}, {0x10FFFE,0} }; /* Lazily constructed hashtable of Unicode names to codepoints. Okay not to be threadsafe since its value is deterministic and I don't care about the tiny potential for a memory leak in the event of a race condition. */ static MVMUnicodeNameRegistry *codepoints_by_name = NULL; static void generate_codepoints_by_name(MVMThreadContext *tc) { MVMint32 extent_index = 0; MVMint32 codepoint = 0; MVMint32 codepoint_table_index = 0; MVMint16 i = num_unicode_namealias_keypairs - 1; MVMUnicodeNameRegistry *entry; for (; extent_index < MVM_NUM_UNICODE_EXTENTS; extent_index++) { MVMint32 length; codepoint = codepoint_extents[extent_index][0]; length = codepoint_extents[extent_index + 1][0] - codepoint_extents[extent_index][0]; if (codepoint_table_index >= MVM_CODEPOINT_NAMES_COUNT) continue; switch (codepoint_extents[extent_index][1]) { case 0: { MVMint32 extent_span_index = 0; codepoint_table_index = codepoint_extents[extent_index][2]; for (; extent_span_index < length && codepoint_table_index < MVM_CODEPOINT_NAMES_COUNT; extent_span_index++) { const char *name = codepoint_names[codepoint_table_index]; if (name) { MVMUnicodeNameRegistry *entry = MVM_malloc(sizeof(MVMUnicodeNameRegistry)); entry->name = (char *)name; entry->codepoint = codepoint; HASH_ADD_KEYPTR(hash_handle, codepoints_by_name, name, strlen(name), entry); } codepoint++; codepoint_table_index++; } break; } case 1: codepoint += length; break; case 2: { const char *name = codepoint_names[codepoint_table_index]; if (name) { MVMUnicodeNameRegistry *entry = MVM_malloc(sizeof(MVMUnicodeNameRegistry)); entry->name = (char *)name; entry->codepoint = codepoint; HASH_ADD_KEYPTR(hash_handle, codepoints_by_name, name, strlen(name), entry); } codepoint += length; codepoint_table_index++; break; } } } for (; i >= 0; i--) { entry = MVM_malloc(sizeof(MVMUnicodeNameRegistry)); entry->name = uni_namealias_pairs[i].name; entry->codepoint = uni_namealias_pairs[i].codepoint; HASH_ADD_KEYPTR(hash_handle, codepoints_by_name, uni_namealias_pairs[i].name, uni_namealias_pairs[i].strlen, entry); } } static const MVMUnicodeNamedValue uni_seq_pairs[1939] = { {"ADULT: DARK SKIN TONE",0},{"ADULT: LIGHT SKIN TONE",1},{"ADULT: MEDIUM SKIN TONE",2}, {"ADULT: MEDIUM-DARK SKIN TONE",3},{"ADULT: MEDIUM-LIGHT SKIN TONE",4},{"AFGHANISTAN",5}, {"ALBANIA",6},{"ALGERIA",7},{"AMERICAN SAMOA",8},{"ANDORRA",9},{"ANGOLA",10},{"ANGUILLA",11}, {"ANTARCTICA",12},{"ANTIGUA & BARBUDA",13},{"ARABIC SEQUENCE NOON WITH KEHEH",14}, {"ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH AE",15},{"ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH ALEF",16}, {"ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA",17},{"ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH E",18}, {"ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH OE",19},{"ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH U",20}, {"ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH WAW",21},{"ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH YU",22}, {"ARGENTINA",23},{"ARMENIA",24},{"ARUBA",25},{"ASCENSION ISLAND",26},{"AUSTRALIA",27}, {"AUSTRIA",28},{"AZERBAIJAN",29},{"BABY ANGEL: DARK SKIN TONE",30},{"BABY ANGEL: LIGHT SKIN TONE",31}, {"BABY ANGEL: MEDIUM SKIN TONE",32},{"BABY ANGEL: MEDIUM-DARK SKIN TONE",33},{"BABY ANGEL: MEDIUM-LIGHT SKIN TONE",34}, {"BABY: DARK SKIN TONE",35},{"BABY: LIGHT SKIN TONE",36},{"BABY: MEDIUM SKIN TONE",37}, {"BABY: MEDIUM-DARK SKIN TONE",38},{"BABY: MEDIUM-LIGHT SKIN TONE",39},{"BACKHAND INDEX POINTING DOWN: DARK SKIN TONE",40}, {"BACKHAND INDEX POINTING DOWN: LIGHT SKIN TONE",41},{"BACKHAND INDEX POINTING DOWN: MEDIUM SKIN TONE",42}, {"BACKHAND INDEX POINTING DOWN: MEDIUM-DARK SKIN TONE",43},{"BACKHAND INDEX POINTING DOWN: MEDIUM-LIGHT SKIN TONE",44}, {"BACKHAND INDEX POINTING LEFT: DARK SKIN TONE",45},{"BACKHAND INDEX POINTING LEFT: LIGHT SKIN TONE",46}, {"BACKHAND INDEX POINTING LEFT: MEDIUM SKIN TONE",47},{"BACKHAND INDEX POINTING LEFT: MEDIUM-DARK SKIN TONE",48}, {"BACKHAND INDEX POINTING LEFT: MEDIUM-LIGHT SKIN TONE",49},{"BACKHAND INDEX POINTING RIGHT: DARK SKIN TONE",50}, {"BACKHAND INDEX POINTING RIGHT: LIGHT SKIN TONE",51},{"BACKHAND INDEX POINTING RIGHT: MEDIUM SKIN TONE",52}, {"BACKHAND INDEX POINTING RIGHT: MEDIUM-DARK SKIN TONE",53},{"BACKHAND INDEX POINTING RIGHT: MEDIUM-LIGHT SKIN TONE",54}, {"BACKHAND INDEX POINTING UP: DARK SKIN TONE",55},{"BACKHAND INDEX POINTING UP: LIGHT SKIN TONE",56}, {"BACKHAND INDEX POINTING UP: MEDIUM SKIN TONE",57},{"BACKHAND INDEX POINTING UP: MEDIUM-DARK SKIN TONE",58}, {"BACKHAND INDEX POINTING UP: MEDIUM-LIGHT SKIN TONE",59},{"BAHAMAS",60},{"BAHRAIN",61}, {"BANGLADESH",62},{"BARBADOS",63},{"BEARDED PERSON: DARK SKIN TONE",64},{"BEARDED PERSON: LIGHT SKIN TONE",65}, {"BEARDED PERSON: MEDIUM SKIN TONE",66},{"BEARDED PERSON: MEDIUM-DARK SKIN TONE",67}, {"BEARDED PERSON: MEDIUM-LIGHT SKIN TONE",68},{"BELARUS",69},{"BELGIUM",70},{"BELIZE",71}, {"BENGALI LETTER KHINYA",72},{"BENIN",73},{"BERMUDA",74},{"BHUTAN",75},{"BLOND-HAIRED MAN",76}, {"BLOND-HAIRED MAN: DARK SKIN TONE",77},{"BLOND-HAIRED MAN: LIGHT SKIN TONE",78}, {"BLOND-HAIRED MAN: MEDIUM SKIN TONE",79},{"BLOND-HAIRED MAN: MEDIUM-DARK SKIN TONE",80}, {"BLOND-HAIRED MAN: MEDIUM-LIGHT SKIN TONE",81},{"BLOND-HAIRED PERSON: DARK SKIN TONE",82}, {"BLOND-HAIRED PERSON: LIGHT SKIN TONE",83},{"BLOND-HAIRED PERSON: MEDIUM SKIN TONE",84}, {"BLOND-HAIRED PERSON: MEDIUM-DARK SKIN TONE",85},{"BLOND-HAIRED PERSON: MEDIUM-LIGHT SKIN TONE",86}, {"BLOND-HAIRED WOMAN",87},{"BLOND-HAIRED WOMAN: DARK SKIN TONE",88},{"BLOND-HAIRED WOMAN: LIGHT SKIN TONE",89}, {"BLOND-HAIRED WOMAN: MEDIUM SKIN TONE",90},{"BLOND-HAIRED WOMAN: MEDIUM-DARK SKIN TONE",91}, {"BLOND-HAIRED WOMAN: MEDIUM-LIGHT SKIN TONE",92},{"BOLIVIA",93},{"BOSNIA & HERZEGOVINA",94}, {"BOTSWANA",95},{"BOUVET ISLAND",96},{"BOY: DARK SKIN TONE",97},{"BOY: LIGHT SKIN TONE",98}, {"BOY: MEDIUM SKIN TONE",99},{"BOY: MEDIUM-DARK SKIN TONE",100},{"BOY: MEDIUM-LIGHT SKIN TONE",101}, {"BRAZIL",102},{"BREAST-FEEDING: DARK SKIN TONE",103},{"BREAST-FEEDING: LIGHT SKIN TONE",104}, {"BREAST-FEEDING: MEDIUM SKIN TONE",105},{"BREAST-FEEDING: MEDIUM-DARK SKIN TONE",106}, {"BREAST-FEEDING: MEDIUM-LIGHT SKIN TONE",107},{"BRIDE WITH VEIL: DARK SKIN TONE",108}, {"BRIDE WITH VEIL: LIGHT SKIN TONE",109},{"BRIDE WITH VEIL: MEDIUM SKIN TONE",110}, {"BRIDE WITH VEIL: MEDIUM-DARK SKIN TONE",111},{"BRIDE WITH VEIL: MEDIUM-LIGHT SKIN TONE",112}, {"BRITISH INDIAN OCEAN TERRITORY",113},{"BRITISH VIRGIN ISLANDS",114},{"BRUNEI",115}, {"BULGARIA",116},{"BURKINA FASO",117},{"BURUNDI",118},{"CALL ME HAND: DARK SKIN TONE",119}, {"CALL ME HAND: LIGHT SKIN TONE",120},{"CALL ME HAND: MEDIUM SKIN TONE",121},{"CALL ME HAND: MEDIUM-DARK SKIN TONE",122}, {"CALL ME HAND: MEDIUM-LIGHT SKIN TONE",123},{"CAMBODIA",124},{"CAMEROON",125},{"CANADA",126}, {"CANARY ISLANDS",127},{"CAPE VERDE",128},{"CARIBBEAN NETHERLANDS",129},{"CAYMAN ISLANDS",130}, {"CENTRAL AFRICAN REPUBLIC",131},{"CEUTA & MELILLA",132},{"CHAD",133},{"CHILD: DARK SKIN TONE",134}, {"CHILD: LIGHT SKIN TONE",135},{"CHILD: MEDIUM SKIN TONE",136},{"CHILD: MEDIUM-DARK SKIN TONE",137}, {"CHILD: MEDIUM-LIGHT SKIN TONE",138},{"CHILE",139},{"CHINA",140},{"CHRISTMAS ISLAND",141}, {"CLAPPING HANDS: DARK SKIN TONE",142},{"CLAPPING HANDS: LIGHT SKIN TONE",143},{"CLAPPING HANDS: MEDIUM SKIN TONE",144}, {"CLAPPING HANDS: MEDIUM-DARK SKIN TONE",145},{"CLAPPING HANDS: MEDIUM-LIGHT SKIN TONE",146}, {"CLIPPERTON ISLAND",147},{"COCOS (KEELING) ISLANDS",148},{"COLOMBIA",149},{"COMOROS",150}, {"CONGO - BRAZZAVILLE",151},{"CONGO - KINSHASA",152},{"CONSTRUCTION WORKER: DARK SKIN TONE",153}, {"CONSTRUCTION WORKER: LIGHT SKIN TONE",154},{"CONSTRUCTION WORKER: MEDIUM SKIN TONE",155}, {"CONSTRUCTION WORKER: MEDIUM-DARK SKIN TONE",156},{"CONSTRUCTION WORKER: MEDIUM-LIGHT SKIN TONE",157}, {"COOK ISLANDS",158},{"COSTA RICA",159},{"COUPLE WITH HEART: MAN MAN",160},{"COUPLE WITH HEART: WOMAN MAN",161}, {"COUPLE WITH HEART: WOMAN WOMAN",162},{"CROATIA",163},{"CROSSED FINGERS: DARK SKIN TONE",164}, {"CROSSED FINGERS: LIGHT SKIN TONE",165},{"CROSSED FINGERS: MEDIUM SKIN TONE",166}, {"CROSSED FINGERS: MEDIUM-DARK SKIN TONE",167},{"CROSSED FINGERS: MEDIUM-LIGHT SKIN TONE",168}, {"CUBA",169},{"CURAÇAO",170},{"CYPRUS",171},{"CZECH REPUBLIC",172},{"CZECHIA",173}, {"CÔTE D’IVOIRE",174},{"DENMARK",175},{"DETECTIVE: DARK SKIN TONE",176},{"DETECTIVE: LIGHT SKIN TONE",177}, {"DETECTIVE: MEDIUM SKIN TONE",178},{"DETECTIVE: MEDIUM-DARK SKIN TONE",179},{"DETECTIVE: MEDIUM-LIGHT SKIN TONE",180}, {"DIEGO GARCIA",181},{"DJIBOUTI",182},{"DOMINICA",183},{"DOMINICAN REPUBLIC",184}, {"EAR: DARK SKIN TONE",185},{"EAR: LIGHT SKIN TONE",186},{"EAR: MEDIUM SKIN TONE",187}, {"EAR: MEDIUM-DARK SKIN TONE",188},{"EAR: MEDIUM-LIGHT SKIN TONE",189},{"ECUADOR",190}, {"EGYPT",191},{"EL SALVADOR",192},{"ELF: DARK SKIN TONE",193},{"ELF: LIGHT SKIN TONE",194}, {"ELF: MEDIUM SKIN TONE",195},{"ELF: MEDIUM-DARK SKIN TONE",196},{"ELF: MEDIUM-LIGHT SKIN TONE",197}, {"ENGLAND",198},{"EQUATORIAL GUINEA",199},{"ERITREA",200},{"ESTONIA",201},{"ETHIOPIA",202}, {"EUROPEAN UNION",203},{"EYE IN SPEECH BUBBLE",204},{"FAIRY: DARK SKIN TONE",205}, {"FAIRY: LIGHT SKIN TONE",206},{"FAIRY: MEDIUM SKIN TONE",207},{"FAIRY: MEDIUM-DARK SKIN TONE",208}, {"FAIRY: MEDIUM-LIGHT SKIN TONE",209},{"FALKLAND ISLANDS",210},{"FAMILY: MAN BOY",211}, {"FAMILY: MAN BOY BOY",212},{"FAMILY: MAN GIRL",213},{"FAMILY: MAN GIRL BOY",214}, {"FAMILY: MAN GIRL GIRL",215},{"FAMILY: MAN MAN BOY",216},{"FAMILY: MAN MAN BOY BOY",217}, {"FAMILY: MAN MAN GIRL",218},{"FAMILY: MAN MAN GIRL BOY",219},{"FAMILY: MAN MAN GIRL GIRL",220}, {"FAMILY: MAN WOMAN BOY",221},{"FAMILY: MAN WOMAN BOY BOY",222},{"FAMILY: MAN WOMAN GIRL",223}, {"FAMILY: MAN WOMAN GIRL BOY",224},{"FAMILY: MAN WOMAN GIRL GIRL",225},{"FAMILY: WOMAN BOY",226}, {"FAMILY: WOMAN BOY BOY",227},{"FAMILY: WOMAN GIRL",228},{"FAMILY: WOMAN GIRL BOY",229}, {"FAMILY: WOMAN GIRL GIRL",230},{"FAMILY: WOMAN WOMAN BOY",231},{"FAMILY: WOMAN WOMAN BOY BOY",232}, {"FAMILY: WOMAN WOMAN GIRL",233},{"FAMILY: WOMAN WOMAN GIRL BOY",234},{"FAMILY: WOMAN WOMAN GIRL GIRL",235}, {"FAROE ISLANDS",236},{"FIJI",237},{"FINLAND",238},{"FLEXED BICEPS: DARK SKIN TONE",239}, {"FLEXED BICEPS: LIGHT SKIN TONE",240},{"FLEXED BICEPS: MEDIUM SKIN TONE",241},{"FLEXED BICEPS: MEDIUM-DARK SKIN TONE",242}, {"FLEXED BICEPS: MEDIUM-LIGHT SKIN TONE",243},{"FOLDED HANDS: DARK SKIN TONE",244}, {"FOLDED HANDS: LIGHT SKIN TONE",245},{"FOLDED HANDS: MEDIUM SKIN TONE",246},{"FOLDED HANDS: MEDIUM-DARK SKIN TONE",247}, {"FOLDED HANDS: MEDIUM-LIGHT SKIN TONE",248},{"FRANCE",249},{"FRENCH GUIANA",250}, {"FRENCH POLYNESIA",251},{"FRENCH SOUTHERN TERRITORIES",252},{"GABON",253},{"GAMBIA",254}, {"GEORGIA",255},{"GEORGIAN LETTER U-BRJGU",256},{"GERMANY",257},{"GHANA",258},{"GIBRALTAR",259}, {"GIRL: DARK SKIN TONE",260},{"GIRL: LIGHT SKIN TONE",261},{"GIRL: MEDIUM SKIN TONE",262}, {"GIRL: MEDIUM-DARK SKIN TONE",263},{"GIRL: MEDIUM-LIGHT SKIN TONE",264},{"GREECE",265}, {"GREENLAND",266},{"GRENADA",267},{"GUADELOUPE",268},{"GUAM",269},{"GUARD: DARK SKIN TONE",270}, {"GUARD: LIGHT SKIN TONE",271},{"GUARD: MEDIUM SKIN TONE",272},{"GUARD: MEDIUM-DARK SKIN TONE",273}, {"GUARD: MEDIUM-LIGHT SKIN TONE",274},{"GUATEMALA",275},{"GUERNSEY",276},{"GUINEA",277}, {"GUINEA-BISSAU",278},{"GUYANA",279},{"HAITI",280},{"HAND WITH FINGERS SPLAYED: DARK SKIN TONE",281}, {"HAND WITH FINGERS SPLAYED: LIGHT SKIN TONE",282},{"HAND WITH FINGERS SPLAYED: MEDIUM SKIN TONE",283}, {"HAND WITH FINGERS SPLAYED: MEDIUM-DARK SKIN TONE",284},{"HAND WITH FINGERS SPLAYED: MEDIUM-LIGHT SKIN TONE",285}, {"HEARD & MCDONALD ISLANDS",286},{"HIRAGANA LETTER BIDAKUON NGA",287},{"HIRAGANA LETTER BIDAKUON NGE",288}, {"HIRAGANA LETTER BIDAKUON NGI",289},{"HIRAGANA LETTER BIDAKUON NGO",290},{"HIRAGANA LETTER BIDAKUON NGU",291}, {"HONDURAS",292},{"HONG KONG SAR CHINA",293},{"HORSE RACING: DARK SKIN TONE",294}, {"HORSE RACING: LIGHT SKIN TONE",295},{"HORSE RACING: MEDIUM SKIN TONE",296},{"HORSE RACING: MEDIUM-DARK SKIN TONE",297}, {"HORSE RACING: MEDIUM-LIGHT SKIN TONE",298},{"HUNGARY",299},{"ICELAND",300},{"INDEX POINTING UP: DARK SKIN TONE",301}, {"INDEX POINTING UP: LIGHT SKIN TONE",302},{"INDEX POINTING UP: MEDIUM SKIN TONE",303}, {"INDEX POINTING UP: MEDIUM-DARK SKIN TONE",304},{"INDEX POINTING UP: MEDIUM-LIGHT SKIN TONE",305}, {"INDIA",306},{"INDONESIA",307},{"IRAN",308},{"IRAQ",309},{"IRELAND",310},{"ISLE OF MAN",311}, {"ISRAEL",312},{"ITALY",313},{"JAMAICA",314},{"JAPAN",315},{"JERSEY",316},{"JORDAN",317}, {"KATAKANA LETTER AINU CE",318},{"KATAKANA LETTER AINU P",319},{"KATAKANA LETTER AINU TO",320}, {"KATAKANA LETTER AINU TU",321},{"KATAKANA LETTER BIDAKUON NGA",322},{"KATAKANA LETTER BIDAKUON NGE",323}, {"KATAKANA LETTER BIDAKUON NGI",324},{"KATAKANA LETTER BIDAKUON NGO",325},{"KATAKANA LETTER BIDAKUON NGU",326}, {"KAZAKHSTAN",327},{"KENYA",328},{"KEYCAP ASTERISK",329},{"KEYCAP DIGIT EIGHT",330}, {"KEYCAP DIGIT FIVE",331},{"KEYCAP DIGIT FOUR",332},{"KEYCAP DIGIT NINE",333},{"KEYCAP DIGIT ONE",334}, {"KEYCAP DIGIT SEVEN",335},{"KEYCAP DIGIT SIX",336},{"KEYCAP DIGIT THREE",337},{"KEYCAP DIGIT TWO",338}, {"KEYCAP DIGIT ZERO",339},{"KEYCAP NUMBER SIGN",340},{"KEYCAP: #",341},{"KEYCAP: *",342}, {"KEYCAP: 0",343},{"KEYCAP: 1",344},{"KEYCAP: 2",345},{"KEYCAP: 3",346},{"KEYCAP: 4",347}, {"KEYCAP: 5",348},{"KEYCAP: 6",349},{"KEYCAP: 7",350},{"KEYCAP: 8",351},{"KEYCAP: 9",352}, {"KHMER CONSONANT SIGN COENG BA",353},{"KHMER CONSONANT SIGN COENG CA",354},{"KHMER CONSONANT SIGN COENG CHA",355}, {"KHMER CONSONANT SIGN COENG CHO",356},{"KHMER CONSONANT SIGN COENG CO",357},{"KHMER CONSONANT SIGN COENG DA",358}, {"KHMER CONSONANT SIGN COENG DO",359},{"KHMER CONSONANT SIGN COENG HA",360},{"KHMER CONSONANT SIGN COENG KA",361}, {"KHMER CONSONANT SIGN COENG KHA",362},{"KHMER CONSONANT SIGN COENG KHO",363},{"KHMER CONSONANT SIGN COENG KO",364}, {"KHMER CONSONANT SIGN COENG LA",365},{"KHMER CONSONANT SIGN COENG LO",366},{"KHMER CONSONANT SIGN COENG MO",367}, {"KHMER CONSONANT SIGN COENG NA",368},{"KHMER CONSONANT SIGN COENG NGO",369},{"KHMER CONSONANT SIGN COENG NO",370}, {"KHMER CONSONANT SIGN COENG NYO",371},{"KHMER CONSONANT SIGN COENG PHA",372},{"KHMER CONSONANT SIGN COENG PHO",373}, {"KHMER CONSONANT SIGN COENG PO",374},{"KHMER CONSONANT SIGN COENG RO",375},{"KHMER CONSONANT SIGN COENG SA",376}, {"KHMER CONSONANT SIGN COENG SHA",377},{"KHMER CONSONANT SIGN COENG SSA",378},{"KHMER CONSONANT SIGN COENG TA",379}, {"KHMER CONSONANT SIGN COENG THA",380},{"KHMER CONSONANT SIGN COENG THO",381},{"KHMER CONSONANT SIGN COENG TO",382}, {"KHMER CONSONANT SIGN COENG TTHA",383},{"KHMER CONSONANT SIGN COENG TTHO",384},{"KHMER CONSONANT SIGN COENG VO",385}, {"KHMER CONSONANT SIGN COENG YO",386},{"KHMER INDEPENDENT VOWEL SIGN COENG QE",387}, {"KHMER INDEPENDENT VOWEL SIGN COENG QU",388},{"KHMER INDEPENDENT VOWEL SIGN COENG RY",389}, {"KHMER INDEPENDENT VOWEL SIGN COENG RYY",390},{"KHMER VOWEL SIGN AAM",391},{"KHMER VOWEL SIGN COENG QA",392}, {"KHMER VOWEL SIGN OM",393},{"KIRIBATI",394},{"KISS: MAN MAN",395},{"KISS: WOMAN MAN",396}, {"KISS: WOMAN WOMAN",397},{"KOSOVO",398},{"KUWAIT",399},{"KYRGYZSTAN",400},{"LAOS",401}, {"LATIN CAPITAL LETTER A WITH MACRON AND GRAVE",402},{"LATIN CAPITAL LETTER A WITH OGONEK AND ACUTE",403}, {"LATIN CAPITAL LETTER A WITH OGONEK AND TILDE",404},{"LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND CARON",405}, {"LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND MACRON",406},{"LATIN CAPITAL LETTER E WITH DOT ABOVE AND ACUTE",407}, {"LATIN CAPITAL LETTER E WITH DOT ABOVE AND TILDE",408},{"LATIN CAPITAL LETTER E WITH OGONEK AND ACUTE",409}, {"LATIN CAPITAL LETTER E WITH OGONEK AND TILDE",410},{"LATIN CAPITAL LETTER E WITH VERTICAL LINE BELOW",411}, {"LATIN CAPITAL LETTER E WITH VERTICAL LINE BELOW AND ACUTE",412},{"LATIN CAPITAL LETTER E WITH VERTICAL LINE BELOW AND GRAVE",413}, {"LATIN CAPITAL LETTER I WITH MACRON AND GRAVE",414},{"LATIN CAPITAL LETTER I WITH OGONEK AND ACUTE",415}, {"LATIN CAPITAL LETTER I WITH OGONEK AND TILDE",416},{"LATIN CAPITAL LETTER J WITH TILDE",417}, {"LATIN CAPITAL LETTER L WITH TILDE",418},{"LATIN CAPITAL LETTER M WITH TILDE",419}, {"LATIN CAPITAL LETTER O WITH VERTICAL LINE BELOW",420},{"LATIN CAPITAL LETTER O WITH VERTICAL LINE BELOW AND ACUTE",421}, {"LATIN CAPITAL LETTER O WITH VERTICAL LINE BELOW AND GRAVE",422},{"LATIN CAPITAL LETTER R WITH TILDE",423}, {"LATIN CAPITAL LETTER S WITH VERTICAL LINE BELOW",424},{"LATIN CAPITAL LETTER U WITH MACRON AND ACUTE",425}, {"LATIN CAPITAL LETTER U WITH MACRON AND GRAVE",426},{"LATIN CAPITAL LETTER U WITH MACRON AND TILDE",427}, {"LATIN CAPITAL LETTER U WITH OGONEK AND ACUTE",428},{"LATIN CAPITAL LETTER U WITH OGONEK AND TILDE",429}, {"LATIN SMALL LETTER A WITH MACRON AND GRAVE",430},{"LATIN SMALL LETTER A WITH OGONEK AND ACUTE",431}, {"LATIN SMALL LETTER A WITH OGONEK AND TILDE",432},{"LATIN SMALL LETTER AE WITH GRAVE",433}, {"LATIN SMALL LETTER E WITH CIRCUMFLEX AND CARON",434},{"LATIN SMALL LETTER E WITH CIRCUMFLEX AND MACRON",435}, {"LATIN SMALL LETTER E WITH DOT ABOVE AND ACUTE",436},{"LATIN SMALL LETTER E WITH DOT ABOVE AND TILDE",437}, {"LATIN SMALL LETTER E WITH OGONEK AND ACUTE",438},{"LATIN SMALL LETTER E WITH OGONEK AND TILDE",439}, {"LATIN SMALL LETTER E WITH VERTICAL LINE BELOW",440},{"LATIN SMALL LETTER E WITH VERTICAL LINE BELOW AND ACUTE",441}, {"LATIN SMALL LETTER E WITH VERTICAL LINE BELOW AND GRAVE",442},{"LATIN SMALL LETTER HOOKED SCHWA WITH ACUTE",443}, {"LATIN SMALL LETTER HOOKED SCHWA WITH GRAVE",444},{"LATIN SMALL LETTER I WITH DOT ABOVE AND ACUTE",445}, {"LATIN SMALL LETTER I WITH DOT ABOVE AND GRAVE",446},{"LATIN SMALL LETTER I WITH DOT ABOVE AND TILDE",447}, {"LATIN SMALL LETTER I WITH MACRON AND GRAVE",448},{"LATIN SMALL LETTER I WITH OGONEK AND DOT ABOVE AND ACUTE",449}, {"LATIN SMALL LETTER I WITH OGONEK AND DOT ABOVE AND TILDE",450},{"LATIN SMALL LETTER J WITH DOT ABOVE AND TILDE",451}, {"LATIN SMALL LETTER L WITH TILDE",452},{"LATIN SMALL LETTER M WITH TILDE",453},{"LATIN SMALL LETTER NG WITH TILDE ABOVE",454}, {"LATIN SMALL LETTER O WITH VERTICAL LINE BELOW",455},{"LATIN SMALL LETTER O WITH VERTICAL LINE BELOW AND ACUTE",456}, {"LATIN SMALL LETTER O WITH VERTICAL LINE BELOW AND GRAVE",457},{"LATIN SMALL LETTER OPEN O WITH ACUTE",458}, {"LATIN SMALL LETTER OPEN O WITH GRAVE",459},{"LATIN SMALL LETTER R WITH TILDE",460}, {"LATIN SMALL LETTER S WITH VERTICAL LINE BELOW",461},{"LATIN SMALL LETTER SCHWA WITH ACUTE",462}, {"LATIN SMALL LETTER SCHWA WITH GRAVE",463},{"LATIN SMALL LETTER TURNED V WITH ACUTE",464}, {"LATIN SMALL LETTER TURNED V WITH GRAVE",465},{"LATIN SMALL LETTER U WITH MACRON AND ACUTE",466}, {"LATIN SMALL LETTER U WITH MACRON AND GRAVE",467},{"LATIN SMALL LETTER U WITH MACRON AND TILDE",468}, {"LATIN SMALL LETTER U WITH OGONEK AND ACUTE",469},{"LATIN SMALL LETTER U WITH OGONEK AND TILDE",470}, {"LATVIA",471},{"LEBANON",472},{"LEFT-FACING FIST: DARK SKIN TONE",473},{"LEFT-FACING FIST: LIGHT SKIN TONE",474}, {"LEFT-FACING FIST: MEDIUM SKIN TONE",475},{"LEFT-FACING FIST: MEDIUM-DARK SKIN TONE",476}, {"LEFT-FACING FIST: MEDIUM-LIGHT SKIN TONE",477},{"LESOTHO",478},{"LIBERIA",479}, {"LIBYA",480},{"LIECHTENSTEIN",481},{"LITHUANIA",482},{"LOVE-YOU GESTURE: DARK SKIN TONE",483}, {"LOVE-YOU GESTURE: LIGHT SKIN TONE",484},{"LOVE-YOU GESTURE: MEDIUM SKIN TONE",485}, {"LOVE-YOU GESTURE: MEDIUM-DARK SKIN TONE",486},{"LOVE-YOU GESTURE: MEDIUM-LIGHT SKIN TONE",487}, {"LUXEMBOURG",488},{"MACAU SAR CHINA",489},{"MACEDONIA",490},{"MADAGASCAR",491},{"MAGE: DARK SKIN TONE",492}, {"MAGE: LIGHT SKIN TONE",493},{"MAGE: MEDIUM SKIN TONE",494},{"MAGE: MEDIUM-DARK SKIN TONE",495}, {"MAGE: MEDIUM-LIGHT SKIN TONE",496},{"MALAWI",497},{"MALAYSIA",498},{"MALDIVES",499}, {"MALI",500},{"MALTA",501},{"MAN ARTIST",502},{"MAN ARTIST: DARK SKIN TONE",503}, {"MAN ARTIST: LIGHT SKIN TONE",504},{"MAN ARTIST: MEDIUM SKIN TONE",505},{"MAN ARTIST: MEDIUM-DARK SKIN TONE",506}, {"MAN ARTIST: MEDIUM-LIGHT SKIN TONE",507},{"MAN ASTRONAUT",508},{"MAN ASTRONAUT: DARK SKIN TONE",509}, {"MAN ASTRONAUT: LIGHT SKIN TONE",510},{"MAN ASTRONAUT: MEDIUM SKIN TONE",511},{"MAN ASTRONAUT: MEDIUM-DARK SKIN TONE",512}, {"MAN ASTRONAUT: MEDIUM-LIGHT SKIN TONE",513},{"MAN BIKING",514},{"MAN BIKING: DARK SKIN TONE",515}, {"MAN BIKING: LIGHT SKIN TONE",516},{"MAN BIKING: MEDIUM SKIN TONE",517},{"MAN BIKING: MEDIUM-DARK SKIN TONE",518}, {"MAN BIKING: MEDIUM-LIGHT SKIN TONE",519},{"MAN BOUNCING BALL",520},{"MAN BOUNCING BALL: DARK SKIN TONE",521}, {"MAN BOUNCING BALL: LIGHT SKIN TONE",522},{"MAN BOUNCING BALL: MEDIUM SKIN TONE",523}, {"MAN BOUNCING BALL: MEDIUM-DARK SKIN TONE",524},{"MAN BOUNCING BALL: MEDIUM-LIGHT SKIN TONE",525}, {"MAN BOWING",526},{"MAN BOWING: DARK SKIN TONE",527},{"MAN BOWING: LIGHT SKIN TONE",528}, {"MAN BOWING: MEDIUM SKIN TONE",529},{"MAN BOWING: MEDIUM-DARK SKIN TONE",530},{"MAN BOWING: MEDIUM-LIGHT SKIN TONE",531}, {"MAN CARTWHEELING",532},{"MAN CARTWHEELING: DARK SKIN TONE",533},{"MAN CARTWHEELING: LIGHT SKIN TONE",534}, {"MAN CARTWHEELING: MEDIUM SKIN TONE",535},{"MAN CARTWHEELING: MEDIUM-DARK SKIN TONE",536}, {"MAN CARTWHEELING: MEDIUM-LIGHT SKIN TONE",537},{"MAN CLIMBING",538},{"MAN CLIMBING: DARK SKIN TONE",539}, {"MAN CLIMBING: LIGHT SKIN TONE",540},{"MAN CLIMBING: MEDIUM SKIN TONE",541},{"MAN CLIMBING: MEDIUM-DARK SKIN TONE",542}, {"MAN CLIMBING: MEDIUM-LIGHT SKIN TONE",543},{"MAN CONSTRUCTION WORKER",544},{"MAN CONSTRUCTION WORKER: DARK SKIN TONE",545}, {"MAN CONSTRUCTION WORKER: LIGHT SKIN TONE",546},{"MAN CONSTRUCTION WORKER: MEDIUM SKIN TONE",547}, {"MAN CONSTRUCTION WORKER: MEDIUM-DARK SKIN TONE",548},{"MAN CONSTRUCTION WORKER: MEDIUM-LIGHT SKIN TONE",549}, {"MAN COOK",550},{"MAN COOK: DARK SKIN TONE",551},{"MAN COOK: LIGHT SKIN TONE",552}, {"MAN COOK: MEDIUM SKIN TONE",553},{"MAN COOK: MEDIUM-DARK SKIN TONE",554},{"MAN COOK: MEDIUM-LIGHT SKIN TONE",555}, {"MAN DANCING: DARK SKIN TONE",556},{"MAN DANCING: LIGHT SKIN TONE",557},{"MAN DANCING: MEDIUM SKIN TONE",558}, {"MAN DANCING: MEDIUM-DARK SKIN TONE",559},{"MAN DANCING: MEDIUM-LIGHT SKIN TONE",560}, {"MAN DETECTIVE",561},{"MAN DETECTIVE: DARK SKIN TONE",562},{"MAN DETECTIVE: LIGHT SKIN TONE",563}, {"MAN DETECTIVE: MEDIUM SKIN TONE",564},{"MAN DETECTIVE: MEDIUM-DARK SKIN TONE",565}, {"MAN DETECTIVE: MEDIUM-LIGHT SKIN TONE",566},{"MAN ELF",567},{"MAN ELF: DARK SKIN TONE",568}, {"MAN ELF: LIGHT SKIN TONE",569},{"MAN ELF: MEDIUM SKIN TONE",570},{"MAN ELF: MEDIUM-DARK SKIN TONE",571}, {"MAN ELF: MEDIUM-LIGHT SKIN TONE",572},{"MAN FACEPALMING",573},{"MAN FACEPALMING: DARK SKIN TONE",574}, {"MAN FACEPALMING: LIGHT SKIN TONE",575},{"MAN FACEPALMING: MEDIUM SKIN TONE",576}, {"MAN FACEPALMING: MEDIUM-DARK SKIN TONE",577},{"MAN FACEPALMING: MEDIUM-LIGHT SKIN TONE",578}, {"MAN FACTORY WORKER",579},{"MAN FACTORY WORKER: DARK SKIN TONE",580},{"MAN FACTORY WORKER: LIGHT SKIN TONE",581}, {"MAN FACTORY WORKER: MEDIUM SKIN TONE",582},{"MAN FACTORY WORKER: MEDIUM-DARK SKIN TONE",583}, {"MAN FACTORY WORKER: MEDIUM-LIGHT SKIN TONE",584},{"MAN FAIRY",585},{"MAN FAIRY: DARK SKIN TONE",586}, {"MAN FAIRY: LIGHT SKIN TONE",587},{"MAN FAIRY: MEDIUM SKIN TONE",588},{"MAN FAIRY: MEDIUM-DARK SKIN TONE",589}, {"MAN FAIRY: MEDIUM-LIGHT SKIN TONE",590},{"MAN FARMER",591},{"MAN FARMER: DARK SKIN TONE",592}, {"MAN FARMER: LIGHT SKIN TONE",593},{"MAN FARMER: MEDIUM SKIN TONE",594},{"MAN FARMER: MEDIUM-DARK SKIN TONE",595}, {"MAN FARMER: MEDIUM-LIGHT SKIN TONE",596},{"MAN FIREFIGHTER",597},{"MAN FIREFIGHTER: DARK SKIN TONE",598}, {"MAN FIREFIGHTER: LIGHT SKIN TONE",599},{"MAN FIREFIGHTER: MEDIUM SKIN TONE",600}, {"MAN FIREFIGHTER: MEDIUM-DARK SKIN TONE",601},{"MAN FIREFIGHTER: MEDIUM-LIGHT SKIN TONE",602}, {"MAN FROWNING",603},{"MAN FROWNING: DARK SKIN TONE",604},{"MAN FROWNING: LIGHT SKIN TONE",605}, {"MAN FROWNING: MEDIUM SKIN TONE",606},{"MAN FROWNING: MEDIUM-DARK SKIN TONE",607}, {"MAN FROWNING: MEDIUM-LIGHT SKIN TONE",608},{"MAN GENIE",609},{"MAN GESTURING NO",610}, {"MAN GESTURING NO: DARK SKIN TONE",611},{"MAN GESTURING NO: LIGHT SKIN TONE",612}, {"MAN GESTURING NO: MEDIUM SKIN TONE",613},{"MAN GESTURING NO: MEDIUM-DARK SKIN TONE",614}, {"MAN GESTURING NO: MEDIUM-LIGHT SKIN TONE",615},{"MAN GESTURING OK",616},{"MAN GESTURING OK: DARK SKIN TONE",617}, {"MAN GESTURING OK: LIGHT SKIN TONE",618},{"MAN GESTURING OK: MEDIUM SKIN TONE",619}, {"MAN GESTURING OK: MEDIUM-DARK SKIN TONE",620},{"MAN GESTURING OK: MEDIUM-LIGHT SKIN TONE",621}, {"MAN GETTING HAIRCUT",622},{"MAN GETTING HAIRCUT: DARK SKIN TONE",623},{"MAN GETTING HAIRCUT: LIGHT SKIN TONE",624}, {"MAN GETTING HAIRCUT: MEDIUM SKIN TONE",625},{"MAN GETTING HAIRCUT: MEDIUM-DARK SKIN TONE",626}, {"MAN GETTING HAIRCUT: MEDIUM-LIGHT SKIN TONE",627},{"MAN GETTING MASSAGE",628},{"MAN GETTING MASSAGE: DARK SKIN TONE",629}, {"MAN GETTING MASSAGE: LIGHT SKIN TONE",630},{"MAN GETTING MASSAGE: MEDIUM SKIN TONE",631}, {"MAN GETTING MASSAGE: MEDIUM-DARK SKIN TONE",632},{"MAN GETTING MASSAGE: MEDIUM-LIGHT SKIN TONE",633}, {"MAN GOLFING",634},{"MAN GOLFING: DARK SKIN TONE",635},{"MAN GOLFING: LIGHT SKIN TONE",636}, {"MAN GOLFING: MEDIUM SKIN TONE",637},{"MAN GOLFING: MEDIUM-DARK SKIN TONE",638}, {"MAN GOLFING: MEDIUM-LIGHT SKIN TONE",639},{"MAN GUARD",640},{"MAN GUARD: DARK SKIN TONE",641}, {"MAN GUARD: LIGHT SKIN TONE",642},{"MAN GUARD: MEDIUM SKIN TONE",643},{"MAN GUARD: MEDIUM-DARK SKIN TONE",644}, {"MAN GUARD: MEDIUM-LIGHT SKIN TONE",645},{"MAN HEALTH WORKER",646},{"MAN HEALTH WORKER: DARK SKIN TONE",647}, {"MAN HEALTH WORKER: LIGHT SKIN TONE",648},{"MAN HEALTH WORKER: MEDIUM SKIN TONE",649}, {"MAN HEALTH WORKER: MEDIUM-DARK SKIN TONE",650},{"MAN HEALTH WORKER: MEDIUM-LIGHT SKIN TONE",651}, {"MAN IN BUSINESS SUIT LEVITATING: DARK SKIN TONE",652},{"MAN IN BUSINESS SUIT LEVITATING: LIGHT SKIN TONE",653}, {"MAN IN BUSINESS SUIT LEVITATING: MEDIUM SKIN TONE",654},{"MAN IN BUSINESS SUIT LEVITATING: MEDIUM-DARK SKIN TONE",655}, {"MAN IN BUSINESS SUIT LEVITATING: MEDIUM-LIGHT SKIN TONE",656},{"MAN IN LOTUS POSITION",657}, {"MAN IN LOTUS POSITION: DARK SKIN TONE",658},{"MAN IN LOTUS POSITION: LIGHT SKIN TONE",659}, {"MAN IN LOTUS POSITION: MEDIUM SKIN TONE",660},{"MAN IN LOTUS POSITION: MEDIUM-DARK SKIN TONE",661}, {"MAN IN LOTUS POSITION: MEDIUM-LIGHT SKIN TONE",662},{"MAN IN STEAMY ROOM",663}, {"MAN IN STEAMY ROOM: DARK SKIN TONE",664},{"MAN IN STEAMY ROOM: LIGHT SKIN TONE",665}, {"MAN IN STEAMY ROOM: MEDIUM SKIN TONE",666},{"MAN IN STEAMY ROOM: MEDIUM-DARK SKIN TONE",667}, {"MAN IN STEAMY ROOM: MEDIUM-LIGHT SKIN TONE",668},{"MAN IN SUIT LEVITATING: DARK SKIN TONE",669}, {"MAN IN SUIT LEVITATING: LIGHT SKIN TONE",670},{"MAN IN SUIT LEVITATING: MEDIUM SKIN TONE",671}, {"MAN IN SUIT LEVITATING: MEDIUM-DARK SKIN TONE",672},{"MAN IN SUIT LEVITATING: MEDIUM-LIGHT SKIN TONE",673}, {"MAN IN TUXEDO: DARK SKIN TONE",674},{"MAN IN TUXEDO: LIGHT SKIN TONE",675},{"MAN IN TUXEDO: MEDIUM SKIN TONE",676}, {"MAN IN TUXEDO: MEDIUM-DARK SKIN TONE",677},{"MAN IN TUXEDO: MEDIUM-LIGHT SKIN TONE",678}, {"MAN JUDGE",679},{"MAN JUDGE: DARK SKIN TONE",680},{"MAN JUDGE: LIGHT SKIN TONE",681}, {"MAN JUDGE: MEDIUM SKIN TONE",682},{"MAN JUDGE: MEDIUM-DARK SKIN TONE",683},{"MAN JUDGE: MEDIUM-LIGHT SKIN TONE",684}, {"MAN JUGGLING",685},{"MAN JUGGLING: DARK SKIN TONE",686},{"MAN JUGGLING: LIGHT SKIN TONE",687}, {"MAN JUGGLING: MEDIUM SKIN TONE",688},{"MAN JUGGLING: MEDIUM-DARK SKIN TONE",689}, {"MAN JUGGLING: MEDIUM-LIGHT SKIN TONE",690},{"MAN LIFTING WEIGHTS",691},{"MAN LIFTING WEIGHTS: DARK SKIN TONE",692}, {"MAN LIFTING WEIGHTS: LIGHT SKIN TONE",693},{"MAN LIFTING WEIGHTS: MEDIUM SKIN TONE",694}, {"MAN LIFTING WEIGHTS: MEDIUM-DARK SKIN TONE",695},{"MAN LIFTING WEIGHTS: MEDIUM-LIGHT SKIN TONE",696}, {"MAN MAGE",697},{"MAN MAGE: DARK SKIN TONE",698},{"MAN MAGE: LIGHT SKIN TONE",699}, {"MAN MAGE: MEDIUM SKIN TONE",700},{"MAN MAGE: MEDIUM-DARK SKIN TONE",701},{"MAN MAGE: MEDIUM-LIGHT SKIN TONE",702}, {"MAN MECHANIC",703},{"MAN MECHANIC: DARK SKIN TONE",704},{"MAN MECHANIC: LIGHT SKIN TONE",705}, {"MAN MECHANIC: MEDIUM SKIN TONE",706},{"MAN MECHANIC: MEDIUM-DARK SKIN TONE",707}, {"MAN MECHANIC: MEDIUM-LIGHT SKIN TONE",708},{"MAN MOUNTAIN BIKING",709},{"MAN MOUNTAIN BIKING: DARK SKIN TONE",710}, {"MAN MOUNTAIN BIKING: LIGHT SKIN TONE",711},{"MAN MOUNTAIN BIKING: MEDIUM SKIN TONE",712}, {"MAN MOUNTAIN BIKING: MEDIUM-DARK SKIN TONE",713},{"MAN MOUNTAIN BIKING: MEDIUM-LIGHT SKIN TONE",714}, {"MAN OFFICE WORKER",715},{"MAN OFFICE WORKER: DARK SKIN TONE",716},{"MAN OFFICE WORKER: LIGHT SKIN TONE",717}, {"MAN OFFICE WORKER: MEDIUM SKIN TONE",718},{"MAN OFFICE WORKER: MEDIUM-DARK SKIN TONE",719}, {"MAN OFFICE WORKER: MEDIUM-LIGHT SKIN TONE",720},{"MAN PILOT",721},{"MAN PILOT: DARK SKIN TONE",722}, {"MAN PILOT: LIGHT SKIN TONE",723},{"MAN PILOT: MEDIUM SKIN TONE",724},{"MAN PILOT: MEDIUM-DARK SKIN TONE",725}, {"MAN PILOT: MEDIUM-LIGHT SKIN TONE",726},{"MAN PLAYING HANDBALL",727},{"MAN PLAYING HANDBALL: DARK SKIN TONE",728}, {"MAN PLAYING HANDBALL: LIGHT SKIN TONE",729},{"MAN PLAYING HANDBALL: MEDIUM SKIN TONE",730}, {"MAN PLAYING HANDBALL: MEDIUM-DARK SKIN TONE",731},{"MAN PLAYING HANDBALL: MEDIUM-LIGHT SKIN TONE",732}, {"MAN PLAYING WATER POLO",733},{"MAN PLAYING WATER POLO: DARK SKIN TONE",734},{"MAN PLAYING WATER POLO: LIGHT SKIN TONE",735}, {"MAN PLAYING WATER POLO: MEDIUM SKIN TONE",736},{"MAN PLAYING WATER POLO: MEDIUM-DARK SKIN TONE",737}, {"MAN PLAYING WATER POLO: MEDIUM-LIGHT SKIN TONE",738},{"MAN POLICE OFFICER",739}, {"MAN POLICE OFFICER: DARK SKIN TONE",740},{"MAN POLICE OFFICER: LIGHT SKIN TONE",741}, {"MAN POLICE OFFICER: MEDIUM SKIN TONE",742},{"MAN POLICE OFFICER: MEDIUM-DARK SKIN TONE",743}, {"MAN POLICE OFFICER: MEDIUM-LIGHT SKIN TONE",744},{"MAN POUTING",745},{"MAN POUTING: DARK SKIN TONE",746}, {"MAN POUTING: LIGHT SKIN TONE",747},{"MAN POUTING: MEDIUM SKIN TONE",748},{"MAN POUTING: MEDIUM-DARK SKIN TONE",749}, {"MAN POUTING: MEDIUM-LIGHT SKIN TONE",750},{"MAN RAISING HAND",751},{"MAN RAISING HAND: DARK SKIN TONE",752}, {"MAN RAISING HAND: LIGHT SKIN TONE",753},{"MAN RAISING HAND: MEDIUM SKIN TONE",754}, {"MAN RAISING HAND: MEDIUM-DARK SKIN TONE",755},{"MAN RAISING HAND: MEDIUM-LIGHT SKIN TONE",756}, {"MAN ROWING BOAT",757},{"MAN ROWING BOAT: DARK SKIN TONE",758},{"MAN ROWING BOAT: LIGHT SKIN TONE",759}, {"MAN ROWING BOAT: MEDIUM SKIN TONE",760},{"MAN ROWING BOAT: MEDIUM-DARK SKIN TONE",761}, {"MAN ROWING BOAT: MEDIUM-LIGHT SKIN TONE",762},{"MAN RUNNING",763},{"MAN RUNNING: DARK SKIN TONE",764}, {"MAN RUNNING: LIGHT SKIN TONE",765},{"MAN RUNNING: MEDIUM SKIN TONE",766},{"MAN RUNNING: MEDIUM-DARK SKIN TONE",767}, {"MAN RUNNING: MEDIUM-LIGHT SKIN TONE",768},{"MAN SCIENTIST",769},{"MAN SCIENTIST: DARK SKIN TONE",770}, {"MAN SCIENTIST: LIGHT SKIN TONE",771},{"MAN SCIENTIST: MEDIUM SKIN TONE",772},{"MAN SCIENTIST: MEDIUM-DARK SKIN TONE",773}, {"MAN SCIENTIST: MEDIUM-LIGHT SKIN TONE",774},{"MAN SHRUGGING",775},{"MAN SHRUGGING: DARK SKIN TONE",776}, {"MAN SHRUGGING: LIGHT SKIN TONE",777},{"MAN SHRUGGING: MEDIUM SKIN TONE",778},{"MAN SHRUGGING: MEDIUM-DARK SKIN TONE",779}, {"MAN SHRUGGING: MEDIUM-LIGHT SKIN TONE",780},{"MAN SINGER",781},{"MAN SINGER: DARK SKIN TONE",782}, {"MAN SINGER: LIGHT SKIN TONE",783},{"MAN SINGER: MEDIUM SKIN TONE",784},{"MAN SINGER: MEDIUM-DARK SKIN TONE",785}, {"MAN SINGER: MEDIUM-LIGHT SKIN TONE",786},{"MAN STUDENT",787},{"MAN STUDENT: DARK SKIN TONE",788}, {"MAN STUDENT: LIGHT SKIN TONE",789},{"MAN STUDENT: MEDIUM SKIN TONE",790},{"MAN STUDENT: MEDIUM-DARK SKIN TONE",791}, {"MAN STUDENT: MEDIUM-LIGHT SKIN TONE",792},{"MAN SURFING",793},{"MAN SURFING: DARK SKIN TONE",794}, {"MAN SURFING: LIGHT SKIN TONE",795},{"MAN SURFING: MEDIUM SKIN TONE",796},{"MAN SURFING: MEDIUM-DARK SKIN TONE",797}, {"MAN SURFING: MEDIUM-LIGHT SKIN TONE",798},{"MAN SWIMMING",799},{"MAN SWIMMING: DARK SKIN TONE",800}, {"MAN SWIMMING: LIGHT SKIN TONE",801},{"MAN SWIMMING: MEDIUM SKIN TONE",802},{"MAN SWIMMING: MEDIUM-DARK SKIN TONE",803}, {"MAN SWIMMING: MEDIUM-LIGHT SKIN TONE",804},{"MAN TEACHER",805},{"MAN TEACHER: DARK SKIN TONE",806}, {"MAN TEACHER: LIGHT SKIN TONE",807},{"MAN TEACHER: MEDIUM SKIN TONE",808},{"MAN TEACHER: MEDIUM-DARK SKIN TONE",809}, {"MAN TEACHER: MEDIUM-LIGHT SKIN TONE",810},{"MAN TECHNOLOGIST",811},{"MAN TECHNOLOGIST: DARK SKIN TONE",812}, {"MAN TECHNOLOGIST: LIGHT SKIN TONE",813},{"MAN TECHNOLOGIST: MEDIUM SKIN TONE",814}, {"MAN TECHNOLOGIST: MEDIUM-DARK SKIN TONE",815},{"MAN TECHNOLOGIST: MEDIUM-LIGHT SKIN TONE",816}, {"MAN TIPPING HAND",817},{"MAN TIPPING HAND: DARK SKIN TONE",818},{"MAN TIPPING HAND: LIGHT SKIN TONE",819}, {"MAN TIPPING HAND: MEDIUM SKIN TONE",820},{"MAN TIPPING HAND: MEDIUM-DARK SKIN TONE",821}, {"MAN TIPPING HAND: MEDIUM-LIGHT SKIN TONE",822},{"MAN VAMPIRE",823},{"MAN VAMPIRE: DARK SKIN TONE",824}, {"MAN VAMPIRE: LIGHT SKIN TONE",825},{"MAN VAMPIRE: MEDIUM SKIN TONE",826},{"MAN VAMPIRE: MEDIUM-DARK SKIN TONE",827}, {"MAN VAMPIRE: MEDIUM-LIGHT SKIN TONE",828},{"MAN WALKING",829},{"MAN WALKING: DARK SKIN TONE",830}, {"MAN WALKING: LIGHT SKIN TONE",831},{"MAN WALKING: MEDIUM SKIN TONE",832},{"MAN WALKING: MEDIUM-DARK SKIN TONE",833}, {"MAN WALKING: MEDIUM-LIGHT SKIN TONE",834},{"MAN WEARING TURBAN",835},{"MAN WEARING TURBAN: DARK SKIN TONE",836}, {"MAN WEARING TURBAN: LIGHT SKIN TONE",837},{"MAN WEARING TURBAN: MEDIUM SKIN TONE",838}, {"MAN WEARING TURBAN: MEDIUM-DARK SKIN TONE",839},{"MAN WEARING TURBAN: MEDIUM-LIGHT SKIN TONE",840}, {"MAN WITH CHINESE CAP: DARK SKIN TONE",841},{"MAN WITH CHINESE CAP: LIGHT SKIN TONE",842}, {"MAN WITH CHINESE CAP: MEDIUM SKIN TONE",843},{"MAN WITH CHINESE CAP: MEDIUM-DARK SKIN TONE",844}, {"MAN WITH CHINESE CAP: MEDIUM-LIGHT SKIN TONE",845},{"MAN ZOMBIE",846},{"MAN: DARK SKIN TONE",847}, {"MAN: LIGHT SKIN TONE",848},{"MAN: MEDIUM SKIN TONE",849},{"MAN: MEDIUM-DARK SKIN TONE",850}, {"MAN: MEDIUM-LIGHT SKIN TONE",851},{"MARSHALL ISLANDS",852},{"MARTINIQUE",853},{"MAURITANIA",854}, {"MAURITIUS",855},{"MAYOTTE",856},{"MEN WITH BUNNY EARS",857},{"MEN WITH BUNNY EARS PARTYING",858}, {"MEN WRESTLING",859},{"MERMAID",860},{"MERMAID: DARK SKIN TONE",861},{"MERMAID: LIGHT SKIN TONE",862}, {"MERMAID: MEDIUM SKIN TONE",863},{"MERMAID: MEDIUM-DARK SKIN TONE",864},{"MERMAID: MEDIUM-LIGHT SKIN TONE",865}, {"MERMAN",866},{"MERMAN: DARK SKIN TONE",867},{"MERMAN: LIGHT SKIN TONE",868},{"MERMAN: MEDIUM SKIN TONE",869}, {"MERMAN: MEDIUM-DARK SKIN TONE",870},{"MERMAN: MEDIUM-LIGHT SKIN TONE",871},{"MERPERSON: DARK SKIN TONE",872}, {"MERPERSON: LIGHT SKIN TONE",873},{"MERPERSON: MEDIUM SKIN TONE",874},{"MERPERSON: MEDIUM-DARK SKIN TONE",875}, {"MERPERSON: MEDIUM-LIGHT SKIN TONE",876},{"MEXICO",877},{"MICRONESIA",878},{"MIDDLE FINGER: DARK SKIN TONE",879}, {"MIDDLE FINGER: LIGHT SKIN TONE",880},{"MIDDLE FINGER: MEDIUM SKIN TONE",881},{"MIDDLE FINGER: MEDIUM-DARK SKIN TONE",882}, {"MIDDLE FINGER: MEDIUM-LIGHT SKIN TONE",883},{"MODIFIER LETTER EXTRA-HIGH EXTRA-LOW CONTOUR TONE BAR",884}, {"MODIFIER LETTER EXTRA-LOW EXTRA-HIGH CONTOUR TONE BAR",885},{"MOLDOVA",886},{"MONACO",887}, {"MONGOLIA",888},{"MONTENEGRO",889},{"MONTSERRAT",890},{"MOROCCO",891},{"MOZAMBIQUE",892}, {"MRS. CLAUS: DARK SKIN TONE",893},{"MRS. CLAUS: LIGHT SKIN TONE",894},{"MRS. CLAUS: MEDIUM SKIN TONE",895}, {"MRS. CLAUS: MEDIUM-DARK SKIN TONE",896},{"MRS. CLAUS: MEDIUM-LIGHT SKIN TONE",897}, {"MYANMAR (BURMA)",898},{"NAIL POLISH: DARK SKIN TONE",899},{"NAIL POLISH: LIGHT SKIN TONE",900}, {"NAIL POLISH: MEDIUM SKIN TONE",901},{"NAIL POLISH: MEDIUM-DARK SKIN TONE",902}, {"NAIL POLISH: MEDIUM-LIGHT SKIN TONE",903},{"NAMIBIA",904},{"NAURU",905},{"NEPAL",906}, {"NETHERLANDS",907},{"NEW CALEDONIA",908},{"NEW ZEALAND",909},{"NICARAGUA",910},{"NIGER",911}, {"NIGERIA",912},{"NIUE",913},{"NORFOLK ISLAND",914},{"NORTH KOREA",915},{"NORTHERN MARIANA ISLANDS",916}, {"NORWAY",917},{"NOSE: DARK SKIN TONE",918},{"NOSE: LIGHT SKIN TONE",919},{"NOSE: MEDIUM SKIN TONE",920}, {"NOSE: MEDIUM-DARK SKIN TONE",921},{"NOSE: MEDIUM-LIGHT SKIN TONE",922},{"OK HAND: DARK SKIN TONE",923}, {"OK HAND: LIGHT SKIN TONE",924},{"OK HAND: MEDIUM SKIN TONE",925},{"OK HAND: MEDIUM-DARK SKIN TONE",926}, {"OK HAND: MEDIUM-LIGHT SKIN TONE",927},{"OLD MAN: DARK SKIN TONE",928},{"OLD MAN: LIGHT SKIN TONE",929}, {"OLD MAN: MEDIUM SKIN TONE",930},{"OLD MAN: MEDIUM-DARK SKIN TONE",931},{"OLD MAN: MEDIUM-LIGHT SKIN TONE",932}, {"OLD WOMAN: DARK SKIN TONE",933},{"OLD WOMAN: LIGHT SKIN TONE",934},{"OLD WOMAN: MEDIUM SKIN TONE",935}, {"OLD WOMAN: MEDIUM-DARK SKIN TONE",936},{"OLD WOMAN: MEDIUM-LIGHT SKIN TONE",937}, {"OLDER ADULT: DARK SKIN TONE",938},{"OLDER ADULT: LIGHT SKIN TONE",939},{"OLDER ADULT: MEDIUM SKIN TONE",940}, {"OLDER ADULT: MEDIUM-DARK SKIN TONE",941},{"OLDER ADULT: MEDIUM-LIGHT SKIN TONE",942}, {"OMAN",943},{"ONCOMING FIST: DARK SKIN TONE",944},{"ONCOMING FIST: LIGHT SKIN TONE",945}, {"ONCOMING FIST: MEDIUM SKIN TONE",946},{"ONCOMING FIST: MEDIUM-DARK SKIN TONE",947}, {"ONCOMING FIST: MEDIUM-LIGHT SKIN TONE",948},{"OPEN HANDS: DARK SKIN TONE",949}, {"OPEN HANDS: LIGHT SKIN TONE",950},{"OPEN HANDS: MEDIUM SKIN TONE",951},{"OPEN HANDS: MEDIUM-DARK SKIN TONE",952}, {"OPEN HANDS: MEDIUM-LIGHT SKIN TONE",953},{"PAKISTAN",954},{"PALAU",955},{"PALESTINIAN TERRITORIES",956}, {"PALMS UP TOGETHER: DARK SKIN TONE",957},{"PALMS UP TOGETHER: LIGHT SKIN TONE",958}, {"PALMS UP TOGETHER: MEDIUM SKIN TONE",959},{"PALMS UP TOGETHER: MEDIUM-DARK SKIN TONE",960}, {"PALMS UP TOGETHER: MEDIUM-LIGHT SKIN TONE",961},{"PANAMA",962},{"PAPUA NEW GUINEA",963}, {"PARAGUAY",964},{"PERSON BIKING: DARK SKIN TONE",965},{"PERSON BIKING: LIGHT SKIN TONE",966}, {"PERSON BIKING: MEDIUM SKIN TONE",967},{"PERSON BIKING: MEDIUM-DARK SKIN TONE",968}, {"PERSON BIKING: MEDIUM-LIGHT SKIN TONE",969},{"PERSON BOUNCING BALL: DARK SKIN TONE",970}, {"PERSON BOUNCING BALL: LIGHT SKIN TONE",971},{"PERSON BOUNCING BALL: MEDIUM SKIN TONE",972}, {"PERSON BOUNCING BALL: MEDIUM-DARK SKIN TONE",973},{"PERSON BOUNCING BALL: MEDIUM-LIGHT SKIN TONE",974}, {"PERSON BOWING: DARK SKIN TONE",975},{"PERSON BOWING: LIGHT SKIN TONE",976},{"PERSON BOWING: MEDIUM SKIN TONE",977}, {"PERSON BOWING: MEDIUM-DARK SKIN TONE",978},{"PERSON BOWING: MEDIUM-LIGHT SKIN TONE",979}, {"PERSON CARTWHEELING: DARK SKIN TONE",980},{"PERSON CARTWHEELING: LIGHT SKIN TONE",981}, {"PERSON CARTWHEELING: MEDIUM SKIN TONE",982},{"PERSON CARTWHEELING: MEDIUM-DARK SKIN TONE",983}, {"PERSON CARTWHEELING: MEDIUM-LIGHT SKIN TONE",984},{"PERSON CLIMBING: DARK SKIN TONE",985}, {"PERSON CLIMBING: LIGHT SKIN TONE",986},{"PERSON CLIMBING: MEDIUM SKIN TONE",987}, {"PERSON CLIMBING: MEDIUM-DARK SKIN TONE",988},{"PERSON CLIMBING: MEDIUM-LIGHT SKIN TONE",989}, {"PERSON FACEPALMING: DARK SKIN TONE",990},{"PERSON FACEPALMING: LIGHT SKIN TONE",991}, {"PERSON FACEPALMING: MEDIUM SKIN TONE",992},{"PERSON FACEPALMING: MEDIUM-DARK SKIN TONE",993}, {"PERSON FACEPALMING: MEDIUM-LIGHT SKIN TONE",994},{"PERSON FROWNING: DARK SKIN TONE",995}, {"PERSON FROWNING: LIGHT SKIN TONE",996},{"PERSON FROWNING: MEDIUM SKIN TONE",997}, {"PERSON FROWNING: MEDIUM-DARK SKIN TONE",998},{"PERSON FROWNING: MEDIUM-LIGHT SKIN TONE",999}, {"PERSON GESTURING NO: DARK SKIN TONE",1000},{"PERSON GESTURING NO: LIGHT SKIN TONE",1001}, {"PERSON GESTURING NO: MEDIUM SKIN TONE",1002},{"PERSON GESTURING NO: MEDIUM-DARK SKIN TONE",1003}, {"PERSON GESTURING NO: MEDIUM-LIGHT SKIN TONE",1004},{"PERSON GESTURING OK: DARK SKIN TONE",1005}, {"PERSON GESTURING OK: LIGHT SKIN TONE",1006},{"PERSON GESTURING OK: MEDIUM SKIN TONE",1007}, {"PERSON GESTURING OK: MEDIUM-DARK SKIN TONE",1008},{"PERSON GESTURING OK: MEDIUM-LIGHT SKIN TONE",1009}, {"PERSON GETTING HAIRCUT: DARK SKIN TONE",1010},{"PERSON GETTING HAIRCUT: LIGHT SKIN TONE",1011}, {"PERSON GETTING HAIRCUT: MEDIUM SKIN TONE",1012},{"PERSON GETTING HAIRCUT: MEDIUM-DARK SKIN TONE",1013}, {"PERSON GETTING HAIRCUT: MEDIUM-LIGHT SKIN TONE",1014},{"PERSON GETTING MASSAGE: DARK SKIN TONE",1015}, {"PERSON GETTING MASSAGE: LIGHT SKIN TONE",1016},{"PERSON GETTING MASSAGE: MEDIUM SKIN TONE",1017}, {"PERSON GETTING MASSAGE: MEDIUM-DARK SKIN TONE",1018},{"PERSON GETTING MASSAGE: MEDIUM-LIGHT SKIN TONE",1019}, {"PERSON GOLFING: DARK SKIN TONE",1020},{"PERSON GOLFING: LIGHT SKIN TONE",1021}, {"PERSON GOLFING: MEDIUM SKIN TONE",1022},{"PERSON GOLFING: MEDIUM-DARK SKIN TONE",1023}, {"PERSON GOLFING: MEDIUM-LIGHT SKIN TONE",1024},{"PERSON IN BED: DARK SKIN TONE",1025}, {"PERSON IN BED: LIGHT SKIN TONE",1026},{"PERSON IN BED: MEDIUM SKIN TONE",1027}, {"PERSON IN BED: MEDIUM-DARK SKIN TONE",1028},{"PERSON IN BED: MEDIUM-LIGHT SKIN TONE",1029}, {"PERSON IN LOTUS POSITION: DARK SKIN TONE",1030},{"PERSON IN LOTUS POSITION: LIGHT SKIN TONE",1031}, {"PERSON IN LOTUS POSITION: MEDIUM SKIN TONE",1032},{"PERSON IN LOTUS POSITION: MEDIUM-DARK SKIN TONE",1033}, {"PERSON IN LOTUS POSITION: MEDIUM-LIGHT SKIN TONE",1034},{"PERSON IN STEAMY ROOM: DARK SKIN TONE",1035}, {"PERSON IN STEAMY ROOM: LIGHT SKIN TONE",1036},{"PERSON IN STEAMY ROOM: MEDIUM SKIN TONE",1037}, {"PERSON IN STEAMY ROOM: MEDIUM-DARK SKIN TONE",1038},{"PERSON IN STEAMY ROOM: MEDIUM-LIGHT SKIN TONE",1039}, {"PERSON JUGGLING: DARK SKIN TONE",1040},{"PERSON JUGGLING: LIGHT SKIN TONE",1041}, {"PERSON JUGGLING: MEDIUM SKIN TONE",1042},{"PERSON JUGGLING: MEDIUM-DARK SKIN TONE",1043}, {"PERSON JUGGLING: MEDIUM-LIGHT SKIN TONE",1044},{"PERSON LIFTING WEIGHTS: DARK SKIN TONE",1045}, {"PERSON LIFTING WEIGHTS: LIGHT SKIN TONE",1046},{"PERSON LIFTING WEIGHTS: MEDIUM SKIN TONE",1047}, {"PERSON LIFTING WEIGHTS: MEDIUM-DARK SKIN TONE",1048},{"PERSON LIFTING WEIGHTS: MEDIUM-LIGHT SKIN TONE",1049}, {"PERSON MOUNTAIN BIKING: DARK SKIN TONE",1050},{"PERSON MOUNTAIN BIKING: LIGHT SKIN TONE",1051}, {"PERSON MOUNTAIN BIKING: MEDIUM SKIN TONE",1052},{"PERSON MOUNTAIN BIKING: MEDIUM-DARK SKIN TONE",1053}, {"PERSON MOUNTAIN BIKING: MEDIUM-LIGHT SKIN TONE",1054},{"PERSON PLAYING HANDBALL: DARK SKIN TONE",1055}, {"PERSON PLAYING HANDBALL: LIGHT SKIN TONE",1056},{"PERSON PLAYING HANDBALL: MEDIUM SKIN TONE",1057}, {"PERSON PLAYING HANDBALL: MEDIUM-DARK SKIN TONE",1058},{"PERSON PLAYING HANDBALL: MEDIUM-LIGHT SKIN TONE",1059}, {"PERSON PLAYING WATER POLO: DARK SKIN TONE",1060},{"PERSON PLAYING WATER POLO: LIGHT SKIN TONE",1061}, {"PERSON PLAYING WATER POLO: MEDIUM SKIN TONE",1062},{"PERSON PLAYING WATER POLO: MEDIUM-DARK SKIN TONE",1063}, {"PERSON PLAYING WATER POLO: MEDIUM-LIGHT SKIN TONE",1064},{"PERSON POUTING: DARK SKIN TONE",1065}, {"PERSON POUTING: LIGHT SKIN TONE",1066},{"PERSON POUTING: MEDIUM SKIN TONE",1067}, {"PERSON POUTING: MEDIUM-DARK SKIN TONE",1068},{"PERSON POUTING: MEDIUM-LIGHT SKIN TONE",1069}, {"PERSON RAISING HAND: DARK SKIN TONE",1070},{"PERSON RAISING HAND: LIGHT SKIN TONE",1071}, {"PERSON RAISING HAND: MEDIUM SKIN TONE",1072},{"PERSON RAISING HAND: MEDIUM-DARK SKIN TONE",1073}, {"PERSON RAISING HAND: MEDIUM-LIGHT SKIN TONE",1074},{"PERSON ROWING BOAT: DARK SKIN TONE",1075}, {"PERSON ROWING BOAT: LIGHT SKIN TONE",1076},{"PERSON ROWING BOAT: MEDIUM SKIN TONE",1077}, {"PERSON ROWING BOAT: MEDIUM-DARK SKIN TONE",1078},{"PERSON ROWING BOAT: MEDIUM-LIGHT SKIN TONE",1079}, {"PERSON RUNNING: DARK SKIN TONE",1080},{"PERSON RUNNING: LIGHT SKIN TONE",1081}, {"PERSON RUNNING: MEDIUM SKIN TONE",1082},{"PERSON RUNNING: MEDIUM-DARK SKIN TONE",1083}, {"PERSON RUNNING: MEDIUM-LIGHT SKIN TONE",1084},{"PERSON SHRUGGING: DARK SKIN TONE",1085}, {"PERSON SHRUGGING: LIGHT SKIN TONE",1086},{"PERSON SHRUGGING: MEDIUM SKIN TONE",1087}, {"PERSON SHRUGGING: MEDIUM-DARK SKIN TONE",1088},{"PERSON SHRUGGING: MEDIUM-LIGHT SKIN TONE",1089}, {"PERSON SURFING: DARK SKIN TONE",1090},{"PERSON SURFING: LIGHT SKIN TONE",1091}, {"PERSON SURFING: MEDIUM SKIN TONE",1092},{"PERSON SURFING: MEDIUM-DARK SKIN TONE",1093}, {"PERSON SURFING: MEDIUM-LIGHT SKIN TONE",1094},{"PERSON SWIMMING: DARK SKIN TONE",1095}, {"PERSON SWIMMING: LIGHT SKIN TONE",1096},{"PERSON SWIMMING: MEDIUM SKIN TONE",1097}, {"PERSON SWIMMING: MEDIUM-DARK SKIN TONE",1098},{"PERSON SWIMMING: MEDIUM-LIGHT SKIN TONE",1099}, {"PERSON TAKING BATH: DARK SKIN TONE",1100},{"PERSON TAKING BATH: LIGHT SKIN TONE",1101}, {"PERSON TAKING BATH: MEDIUM SKIN TONE",1102},{"PERSON TAKING BATH: MEDIUM-DARK SKIN TONE",1103}, {"PERSON TAKING BATH: MEDIUM-LIGHT SKIN TONE",1104},{"PERSON TIPPING HAND: DARK SKIN TONE",1105}, {"PERSON TIPPING HAND: LIGHT SKIN TONE",1106},{"PERSON TIPPING HAND: MEDIUM SKIN TONE",1107}, {"PERSON TIPPING HAND: MEDIUM-DARK SKIN TONE",1108},{"PERSON TIPPING HAND: MEDIUM-LIGHT SKIN TONE",1109}, {"PERSON WALKING: DARK SKIN TONE",1110},{"PERSON WALKING: LIGHT SKIN TONE",1111}, {"PERSON WALKING: MEDIUM SKIN TONE",1112},{"PERSON WALKING: MEDIUM-DARK SKIN TONE",1113}, {"PERSON WALKING: MEDIUM-LIGHT SKIN TONE",1114},{"PERSON WEARING TURBAN: DARK SKIN TONE",1115}, {"PERSON WEARING TURBAN: LIGHT SKIN TONE",1116},{"PERSON WEARING TURBAN: MEDIUM SKIN TONE",1117}, {"PERSON WEARING TURBAN: MEDIUM-DARK SKIN TONE",1118},{"PERSON WEARING TURBAN: MEDIUM-LIGHT SKIN TONE",1119}, {"PERU",1120},{"PHILIPPINES",1121},{"PITCAIRN ISLANDS",1122},{"POLAND",1123},{"POLICE OFFICER: DARK SKIN TONE",1124}, {"POLICE OFFICER: LIGHT SKIN TONE",1125},{"POLICE OFFICER: MEDIUM SKIN TONE",1126}, {"POLICE OFFICER: MEDIUM-DARK SKIN TONE",1127},{"POLICE OFFICER: MEDIUM-LIGHT SKIN TONE",1128}, {"PORTUGAL",1129},{"PREGNANT WOMAN: DARK SKIN TONE",1130},{"PREGNANT WOMAN: LIGHT SKIN TONE",1131}, {"PREGNANT WOMAN: MEDIUM SKIN TONE",1132},{"PREGNANT WOMAN: MEDIUM-DARK SKIN TONE",1133}, {"PREGNANT WOMAN: MEDIUM-LIGHT SKIN TONE",1134},{"PRINCE: DARK SKIN TONE",1135},{"PRINCE: LIGHT SKIN TONE",1136}, {"PRINCE: MEDIUM SKIN TONE",1137},{"PRINCE: MEDIUM-DARK SKIN TONE",1138},{"PRINCE: MEDIUM-LIGHT SKIN TONE",1139}, {"PRINCESS: DARK SKIN TONE",1140},{"PRINCESS: LIGHT SKIN TONE",1141},{"PRINCESS: MEDIUM SKIN TONE",1142}, {"PRINCESS: MEDIUM-DARK SKIN TONE",1143},{"PRINCESS: MEDIUM-LIGHT SKIN TONE",1144}, {"PUERTO RICO",1145},{"QATAR",1146},{"RAINBOW FLAG",1147},{"RAISED BACK OF HAND: DARK SKIN TONE",1148}, {"RAISED BACK OF HAND: LIGHT SKIN TONE",1149},{"RAISED BACK OF HAND: MEDIUM SKIN TONE",1150}, {"RAISED BACK OF HAND: MEDIUM-DARK SKIN TONE",1151},{"RAISED BACK OF HAND: MEDIUM-LIGHT SKIN TONE",1152}, {"RAISED FIST: DARK SKIN TONE",1153},{"RAISED FIST: LIGHT SKIN TONE",1154},{"RAISED FIST: MEDIUM SKIN TONE",1155}, {"RAISED FIST: MEDIUM-DARK SKIN TONE",1156},{"RAISED FIST: MEDIUM-LIGHT SKIN TONE",1157}, {"RAISED HAND WITH FINGERS SPLAYED: DARK SKIN TONE",1158},{"RAISED HAND WITH FINGERS SPLAYED: LIGHT SKIN TONE",1159}, {"RAISED HAND WITH FINGERS SPLAYED: MEDIUM SKIN TONE",1160},{"RAISED HAND WITH FINGERS SPLAYED: MEDIUM-DARK SKIN TONE",1161}, {"RAISED HAND WITH FINGERS SPLAYED: MEDIUM-LIGHT SKIN TONE",1162},{"RAISED HAND: DARK SKIN TONE",1163}, {"RAISED HAND: LIGHT SKIN TONE",1164},{"RAISED HAND: MEDIUM SKIN TONE",1165},{"RAISED HAND: MEDIUM-DARK SKIN TONE",1166}, {"RAISED HAND: MEDIUM-LIGHT SKIN TONE",1167},{"RAISING HANDS: DARK SKIN TONE",1168}, {"RAISING HANDS: LIGHT SKIN TONE",1169},{"RAISING HANDS: MEDIUM SKIN TONE",1170}, {"RAISING HANDS: MEDIUM-DARK SKIN TONE",1171},{"RAISING HANDS: MEDIUM-LIGHT SKIN TONE",1172}, {"RIGHT-FACING FIST: DARK SKIN TONE",1173},{"RIGHT-FACING FIST: LIGHT SKIN TONE",1174}, {"RIGHT-FACING FIST: MEDIUM SKIN TONE",1175},{"RIGHT-FACING FIST: MEDIUM-DARK SKIN TONE",1176}, {"RIGHT-FACING FIST: MEDIUM-LIGHT SKIN TONE",1177},{"ROMANIA",1178},{"RUSSIA",1179}, {"RWANDA",1180},{"RÉUNION",1181},{"SAMOA",1182},{"SAN MARINO",1183},{"SANTA CLAUS: DARK SKIN TONE",1184}, {"SANTA CLAUS: LIGHT SKIN TONE",1185},{"SANTA CLAUS: MEDIUM SKIN TONE",1186},{"SANTA CLAUS: MEDIUM-DARK SKIN TONE",1187}, {"SANTA CLAUS: MEDIUM-LIGHT SKIN TONE",1188},{"SAUDI ARABIA",1189},{"SCOTLAND",1190}, {"SELFIE: DARK SKIN TONE",1191},{"SELFIE: LIGHT SKIN TONE",1192},{"SELFIE: MEDIUM SKIN TONE",1193}, {"SELFIE: MEDIUM-DARK SKIN TONE",1194},{"SELFIE: MEDIUM-LIGHT SKIN TONE",1195},{"SENEGAL",1196}, {"SERBIA",1197},{"SEYCHELLES",1198},{"SIERRA LEONE",1199},{"SIGN OF THE HORNS: DARK SKIN TONE",1200}, {"SIGN OF THE HORNS: LIGHT SKIN TONE",1201},{"SIGN OF THE HORNS: MEDIUM SKIN TONE",1202}, {"SIGN OF THE HORNS: MEDIUM-DARK SKIN TONE",1203},{"SIGN OF THE HORNS: MEDIUM-LIGHT SKIN TONE",1204}, {"SINGAPORE",1205},{"SINHALA CONSONANT SIGN RAKAARAANSAYA",1206},{"SINHALA CONSONANT SIGN REPAYA",1207}, {"SINHALA CONSONANT SIGN YANSAYA",1208},{"SINT MAARTEN",1209},{"SLOVAKIA",1210},{"SLOVENIA",1211}, {"SNOWBOARDER: DARK SKIN TONE",1212},{"SNOWBOARDER: LIGHT SKIN TONE",1213},{"SNOWBOARDER: MEDIUM SKIN TONE",1214}, {"SNOWBOARDER: MEDIUM-DARK SKIN TONE",1215},{"SNOWBOARDER: MEDIUM-LIGHT SKIN TONE",1216}, {"SOLOMON ISLANDS",1217},{"SOMALIA",1218},{"SOUTH AFRICA",1219},{"SOUTH GEORGIA & SOUTH SANDWICH ISLANDS",1220}, {"SOUTH KOREA",1221},{"SOUTH SUDAN",1222},{"SPAIN",1223},{"SRI LANKA",1224},{"ST. BARTHÉLEMY",1225}, {"ST. HELENA",1226},{"ST. KITTS & NEVIS",1227},{"ST. LUCIA",1228},{"ST. MARTIN",1229}, {"ST. PIERRE & MIQUELON",1230},{"ST. VINCENT & GRENADINES",1231},{"SUDAN",1232},{"SURINAME",1233}, {"SVALBARD & JAN MAYEN",1234},{"SWAZILAND",1235},{"SWEDEN",1236},{"SWITZERLAND",1237}, {"SYRIA",1238},{"SÃO TOMÉ & PRÃNCIPE",1239},{"TAIWAN",1240},{"TAJIKISTAN",1241},{"TAMIL CONSONANT C",1242}, {"TAMIL CONSONANT H",1243},{"TAMIL CONSONANT J",1244},{"TAMIL CONSONANT K",1245}, {"TAMIL CONSONANT KSS",1246},{"TAMIL CONSONANT L",1247},{"TAMIL CONSONANT LL",1248}, {"TAMIL CONSONANT LLL",1249},{"TAMIL CONSONANT M",1250},{"TAMIL CONSONANT N",1251}, {"TAMIL CONSONANT NG",1252},{"TAMIL CONSONANT NN",1253},{"TAMIL CONSONANT NNN",1254}, {"TAMIL CONSONANT NY",1255},{"TAMIL CONSONANT P",1256},{"TAMIL CONSONANT R",1257}, {"TAMIL CONSONANT RR",1258},{"TAMIL CONSONANT S",1259},{"TAMIL CONSONANT SH",1260}, {"TAMIL CONSONANT SS",1261},{"TAMIL CONSONANT T",1262},{"TAMIL CONSONANT TT",1263}, {"TAMIL CONSONANT V",1264},{"TAMIL CONSONANT Y",1265},{"TAMIL SYLLABLE CAA",1266}, {"TAMIL SYLLABLE CAI",1267},{"TAMIL SYLLABLE CAU",1268},{"TAMIL SYLLABLE CE",1269}, {"TAMIL SYLLABLE CEE",1270},{"TAMIL SYLLABLE CI",1271},{"TAMIL SYLLABLE CII",1272}, {"TAMIL SYLLABLE CO",1273},{"TAMIL SYLLABLE COO",1274},{"TAMIL SYLLABLE CU",1275}, {"TAMIL SYLLABLE CUU",1276},{"TAMIL SYLLABLE HAA",1277},{"TAMIL SYLLABLE HAI",1278}, {"TAMIL SYLLABLE HAU",1279},{"TAMIL SYLLABLE HE",1280},{"TAMIL SYLLABLE HEE",1281}, {"TAMIL SYLLABLE HI",1282},{"TAMIL SYLLABLE HII",1283},{"TAMIL SYLLABLE HO",1284}, {"TAMIL SYLLABLE HOO",1285},{"TAMIL SYLLABLE HU",1286},{"TAMIL SYLLABLE HUU",1287}, {"TAMIL SYLLABLE JAA",1288},{"TAMIL SYLLABLE JAI",1289},{"TAMIL SYLLABLE JAU",1290}, {"TAMIL SYLLABLE JE",1291},{"TAMIL SYLLABLE JEE",1292},{"TAMIL SYLLABLE JI",1293}, {"TAMIL SYLLABLE JII",1294},{"TAMIL SYLLABLE JO",1295},{"TAMIL SYLLABLE JOO",1296}, {"TAMIL SYLLABLE JU",1297},{"TAMIL SYLLABLE JUU",1298},{"TAMIL SYLLABLE KAA",1299}, {"TAMIL SYLLABLE KAI",1300},{"TAMIL SYLLABLE KAU",1301},{"TAMIL SYLLABLE KE",1302}, {"TAMIL SYLLABLE KEE",1303},{"TAMIL SYLLABLE KI",1304},{"TAMIL SYLLABLE KII",1305}, {"TAMIL SYLLABLE KO",1306},{"TAMIL SYLLABLE KOO",1307},{"TAMIL SYLLABLE KSSA",1308}, {"TAMIL SYLLABLE KSSAA",1309},{"TAMIL SYLLABLE KSSAI",1310},{"TAMIL SYLLABLE KSSAU",1311}, {"TAMIL SYLLABLE KSSE",1312},{"TAMIL SYLLABLE KSSEE",1313},{"TAMIL SYLLABLE KSSI",1314}, {"TAMIL SYLLABLE KSSII",1315},{"TAMIL SYLLABLE KSSO",1316},{"TAMIL SYLLABLE KSSOO",1317}, {"TAMIL SYLLABLE KSSU",1318},{"TAMIL SYLLABLE KSSUU",1319},{"TAMIL SYLLABLE KU",1320}, {"TAMIL SYLLABLE KUU",1321},{"TAMIL SYLLABLE LAA",1322},{"TAMIL SYLLABLE LAI",1323}, {"TAMIL SYLLABLE LAU",1324},{"TAMIL SYLLABLE LE",1325},{"TAMIL SYLLABLE LEE",1326}, {"TAMIL SYLLABLE LI",1327},{"TAMIL SYLLABLE LII",1328},{"TAMIL SYLLABLE LLAA",1329}, {"TAMIL SYLLABLE LLAI",1330},{"TAMIL SYLLABLE LLAU",1331},{"TAMIL SYLLABLE LLE",1332}, {"TAMIL SYLLABLE LLEE",1333},{"TAMIL SYLLABLE LLI",1334},{"TAMIL SYLLABLE LLII",1335}, {"TAMIL SYLLABLE LLLAA",1336},{"TAMIL SYLLABLE LLLAI",1337},{"TAMIL SYLLABLE LLLAU",1338}, {"TAMIL SYLLABLE LLLE",1339},{"TAMIL SYLLABLE LLLEE",1340},{"TAMIL SYLLABLE LLLI",1341}, {"TAMIL SYLLABLE LLLII",1342},{"TAMIL SYLLABLE LLLO",1343},{"TAMIL SYLLABLE LLLOO",1344}, {"TAMIL SYLLABLE LLLU",1345},{"TAMIL SYLLABLE LLLUU",1346},{"TAMIL SYLLABLE LLO",1347}, {"TAMIL SYLLABLE LLOO",1348},{"TAMIL SYLLABLE LLU",1349},{"TAMIL SYLLABLE LLUU",1350}, {"TAMIL SYLLABLE LO",1351},{"TAMIL SYLLABLE LOO",1352},{"TAMIL SYLLABLE LU",1353}, {"TAMIL SYLLABLE LUU",1354},{"TAMIL SYLLABLE MAA",1355},{"TAMIL SYLLABLE MAI",1356}, {"TAMIL SYLLABLE MAU",1357},{"TAMIL SYLLABLE ME",1358},{"TAMIL SYLLABLE MEE",1359}, {"TAMIL SYLLABLE MI",1360},{"TAMIL SYLLABLE MII",1361},{"TAMIL SYLLABLE MO",1362}, {"TAMIL SYLLABLE MOO",1363},{"TAMIL SYLLABLE MU",1364},{"TAMIL SYLLABLE MUU",1365}, {"TAMIL SYLLABLE NAA",1366},{"TAMIL SYLLABLE NAI",1367},{"TAMIL SYLLABLE NAU",1368}, {"TAMIL SYLLABLE NE",1369},{"TAMIL SYLLABLE NEE",1370},{"TAMIL SYLLABLE NGAA",1371}, {"TAMIL SYLLABLE NGAI",1372},{"TAMIL SYLLABLE NGAU",1373},{"TAMIL SYLLABLE NGE",1374}, {"TAMIL SYLLABLE NGEE",1375},{"TAMIL SYLLABLE NGI",1376},{"TAMIL SYLLABLE NGII",1377}, {"TAMIL SYLLABLE NGO",1378},{"TAMIL SYLLABLE NGOO",1379},{"TAMIL SYLLABLE NGU",1380}, {"TAMIL SYLLABLE NGUU",1381},{"TAMIL SYLLABLE NI",1382},{"TAMIL SYLLABLE NII",1383}, {"TAMIL SYLLABLE NNAA",1384},{"TAMIL SYLLABLE NNAI",1385},{"TAMIL SYLLABLE NNAU",1386}, {"TAMIL SYLLABLE NNE",1387},{"TAMIL SYLLABLE NNEE",1388},{"TAMIL SYLLABLE NNI",1389}, {"TAMIL SYLLABLE NNII",1390},{"TAMIL SYLLABLE NNNAA",1391},{"TAMIL SYLLABLE NNNAI",1392}, {"TAMIL SYLLABLE NNNAU",1393},{"TAMIL SYLLABLE NNNE",1394},{"TAMIL SYLLABLE NNNEE",1395}, {"TAMIL SYLLABLE NNNI",1396},{"TAMIL SYLLABLE NNNII",1397},{"TAMIL SYLLABLE NNNO",1398}, {"TAMIL SYLLABLE NNNOO",1399},{"TAMIL SYLLABLE NNNU",1400},{"TAMIL SYLLABLE NNNUU",1401}, {"TAMIL SYLLABLE NNO",1402},{"TAMIL SYLLABLE NNOO",1403},{"TAMIL SYLLABLE NNU",1404}, {"TAMIL SYLLABLE NNUU",1405},{"TAMIL SYLLABLE NO",1406},{"TAMIL SYLLABLE NOO",1407}, {"TAMIL SYLLABLE NU",1408},{"TAMIL SYLLABLE NUU",1409},{"TAMIL SYLLABLE NYAA",1410}, {"TAMIL SYLLABLE NYAI",1411},{"TAMIL SYLLABLE NYAU",1412},{"TAMIL SYLLABLE NYE",1413}, {"TAMIL SYLLABLE NYEE",1414},{"TAMIL SYLLABLE NYI",1415},{"TAMIL SYLLABLE NYII",1416}, {"TAMIL SYLLABLE NYO",1417},{"TAMIL SYLLABLE NYOO",1418},{"TAMIL SYLLABLE NYU",1419}, {"TAMIL SYLLABLE NYUU",1420},{"TAMIL SYLLABLE PAA",1421},{"TAMIL SYLLABLE PAI",1422}, {"TAMIL SYLLABLE PAU",1423},{"TAMIL SYLLABLE PE",1424},{"TAMIL SYLLABLE PEE",1425}, {"TAMIL SYLLABLE PI",1426},{"TAMIL SYLLABLE PII",1427},{"TAMIL SYLLABLE PO",1428}, {"TAMIL SYLLABLE POO",1429},{"TAMIL SYLLABLE PU",1430},{"TAMIL SYLLABLE PUU",1431}, {"TAMIL SYLLABLE RAA",1432},{"TAMIL SYLLABLE RAI",1433},{"TAMIL SYLLABLE RAU",1434}, {"TAMIL SYLLABLE RE",1435},{"TAMIL SYLLABLE REE",1436},{"TAMIL SYLLABLE RI",1437}, {"TAMIL SYLLABLE RII",1438},{"TAMIL SYLLABLE RO",1439},{"TAMIL SYLLABLE ROO",1440}, {"TAMIL SYLLABLE RRAA",1441},{"TAMIL SYLLABLE RRAI",1442},{"TAMIL SYLLABLE RRAU",1443}, {"TAMIL SYLLABLE RRE",1444},{"TAMIL SYLLABLE RREE",1445},{"TAMIL SYLLABLE RRI",1446}, {"TAMIL SYLLABLE RRII",1447},{"TAMIL SYLLABLE RRO",1448},{"TAMIL SYLLABLE RROO",1449}, {"TAMIL SYLLABLE RRU",1450},{"TAMIL SYLLABLE RRUU",1451},{"TAMIL SYLLABLE RU",1452}, {"TAMIL SYLLABLE RUU",1453},{"TAMIL SYLLABLE SAA",1454},{"TAMIL SYLLABLE SAI",1455}, {"TAMIL SYLLABLE SAU",1456},{"TAMIL SYLLABLE SE",1457},{"TAMIL SYLLABLE SEE",1458}, {"TAMIL SYLLABLE SHAA",1459},{"TAMIL SYLLABLE SHAI",1460},{"TAMIL SYLLABLE SHAU",1461}, {"TAMIL SYLLABLE SHE",1462},{"TAMIL SYLLABLE SHEE",1463},{"TAMIL SYLLABLE SHI",1464}, {"TAMIL SYLLABLE SHII",1465},{"TAMIL SYLLABLE SHO",1466},{"TAMIL SYLLABLE SHOO",1467}, {"TAMIL SYLLABLE SHRII",1468},{"TAMIL SYLLABLE SHU",1469},{"TAMIL SYLLABLE SHUU",1470}, {"TAMIL SYLLABLE SI",1471},{"TAMIL SYLLABLE SII",1472},{"TAMIL SYLLABLE SO",1473}, {"TAMIL SYLLABLE SOO",1474},{"TAMIL SYLLABLE SSAA",1475},{"TAMIL SYLLABLE SSAI",1476}, {"TAMIL SYLLABLE SSAU",1477},{"TAMIL SYLLABLE SSE",1478},{"TAMIL SYLLABLE SSEE",1479}, {"TAMIL SYLLABLE SSI",1480},{"TAMIL SYLLABLE SSII",1481},{"TAMIL SYLLABLE SSO",1482}, {"TAMIL SYLLABLE SSOO",1483},{"TAMIL SYLLABLE SSU",1484},{"TAMIL SYLLABLE SSUU",1485}, {"TAMIL SYLLABLE SU",1486},{"TAMIL SYLLABLE SUU",1487},{"TAMIL SYLLABLE TAA",1488}, {"TAMIL SYLLABLE TAI",1489},{"TAMIL SYLLABLE TAU",1490},{"TAMIL SYLLABLE TE",1491}, {"TAMIL SYLLABLE TEE",1492},{"TAMIL SYLLABLE TI",1493},{"TAMIL SYLLABLE TII",1494}, {"TAMIL SYLLABLE TO",1495},{"TAMIL SYLLABLE TOO",1496},{"TAMIL SYLLABLE TTAA",1497}, {"TAMIL SYLLABLE TTAI",1498},{"TAMIL SYLLABLE TTAU",1499},{"TAMIL SYLLABLE TTE",1500}, {"TAMIL SYLLABLE TTEE",1501},{"TAMIL SYLLABLE TTI",1502},{"TAMIL SYLLABLE TTII",1503}, {"TAMIL SYLLABLE TTO",1504},{"TAMIL SYLLABLE TTOO",1505},{"TAMIL SYLLABLE TTU",1506}, {"TAMIL SYLLABLE TTUU",1507},{"TAMIL SYLLABLE TU",1508},{"TAMIL SYLLABLE TUU",1509}, {"TAMIL SYLLABLE VAA",1510},{"TAMIL SYLLABLE VAI",1511},{"TAMIL SYLLABLE VAU",1512}, {"TAMIL SYLLABLE VE",1513},{"TAMIL SYLLABLE VEE",1514},{"TAMIL SYLLABLE VI",1515}, {"TAMIL SYLLABLE VII",1516},{"TAMIL SYLLABLE VO",1517},{"TAMIL SYLLABLE VOO",1518}, {"TAMIL SYLLABLE VU",1519},{"TAMIL SYLLABLE VUU",1520},{"TAMIL SYLLABLE YAA",1521}, {"TAMIL SYLLABLE YAI",1522},{"TAMIL SYLLABLE YAU",1523},{"TAMIL SYLLABLE YE",1524}, {"TAMIL SYLLABLE YEE",1525},{"TAMIL SYLLABLE YI",1526},{"TAMIL SYLLABLE YII",1527}, {"TAMIL SYLLABLE YO",1528},{"TAMIL SYLLABLE YOO",1529},{"TAMIL SYLLABLE YU",1530}, {"TAMIL SYLLABLE YUU",1531},{"TANZANIA",1532},{"THAILAND",1533},{"THUMBS DOWN: DARK SKIN TONE",1534}, {"THUMBS DOWN: LIGHT SKIN TONE",1535},{"THUMBS DOWN: MEDIUM SKIN TONE",1536},{"THUMBS DOWN: MEDIUM-DARK SKIN TONE",1537}, {"THUMBS DOWN: MEDIUM-LIGHT SKIN TONE",1538},{"THUMBS UP: DARK SKIN TONE",1539},{"THUMBS UP: LIGHT SKIN TONE",1540}, {"THUMBS UP: MEDIUM SKIN TONE",1541},{"THUMBS UP: MEDIUM-DARK SKIN TONE",1542},{"THUMBS UP: MEDIUM-LIGHT SKIN TONE",1543}, {"TIMOR-LESTE",1544},{"TOGO",1545},{"TOKELAU",1546},{"TONGA",1547},{"TRINIDAD & TOBAGO",1548}, {"TRISTAN DA CUNHA",1549},{"TUNISIA",1550},{"TURKEY",1551},{"TURKMENISTAN",1552}, {"TURKS & CAICOS ISLANDS",1553},{"TUVALU",1554},{"U.S. OUTLYING ISLANDS",1555},{"U.S. VIRGIN ISLANDS",1556}, {"UGANDA",1557},{"UKRAINE",1558},{"UNITED ARAB EMIRATES",1559},{"UNITED KINGDOM",1560}, {"UNITED NATIONS",1561},{"UNITED STATES",1562},{"URUGUAY",1563},{"UZBEKISTAN",1564}, {"VAMPIRE: DARK SKIN TONE",1565},{"VAMPIRE: LIGHT SKIN TONE",1566},{"VAMPIRE: MEDIUM SKIN TONE",1567}, {"VAMPIRE: MEDIUM-DARK SKIN TONE",1568},{"VAMPIRE: MEDIUM-LIGHT SKIN TONE",1569}, {"VANUATU",1570},{"VATICAN CITY",1571},{"VENEZUELA",1572},{"VICTORY HAND: DARK SKIN TONE",1573}, {"VICTORY HAND: LIGHT SKIN TONE",1574},{"VICTORY HAND: MEDIUM SKIN TONE",1575},{"VICTORY HAND: MEDIUM-DARK SKIN TONE",1576}, {"VICTORY HAND: MEDIUM-LIGHT SKIN TONE",1577},{"VIETNAM",1578},{"VULCAN SALUTE: DARK SKIN TONE",1579}, {"VULCAN SALUTE: LIGHT SKIN TONE",1580},{"VULCAN SALUTE: MEDIUM SKIN TONE",1581}, {"VULCAN SALUTE: MEDIUM-DARK SKIN TONE",1582},{"VULCAN SALUTE: MEDIUM-LIGHT SKIN TONE",1583}, {"WALES",1584},{"WALLIS & FUTUNA",1585},{"WAVING HAND: DARK SKIN TONE",1586},{"WAVING HAND: LIGHT SKIN TONE",1587}, {"WAVING HAND: MEDIUM SKIN TONE",1588},{"WAVING HAND: MEDIUM-DARK SKIN TONE",1589}, {"WAVING HAND: MEDIUM-LIGHT SKIN TONE",1590},{"WESTERN SAHARA",1591},{"WOMAN ARTIST",1592}, {"WOMAN ARTIST: DARK SKIN TONE",1593},{"WOMAN ARTIST: LIGHT SKIN TONE",1594},{"WOMAN ARTIST: MEDIUM SKIN TONE",1595}, {"WOMAN ARTIST: MEDIUM-DARK SKIN TONE",1596},{"WOMAN ARTIST: MEDIUM-LIGHT SKIN TONE",1597}, {"WOMAN ASTRONAUT",1598},{"WOMAN ASTRONAUT: DARK SKIN TONE",1599},{"WOMAN ASTRONAUT: LIGHT SKIN TONE",1600}, {"WOMAN ASTRONAUT: MEDIUM SKIN TONE",1601},{"WOMAN ASTRONAUT: MEDIUM-DARK SKIN TONE",1602}, {"WOMAN ASTRONAUT: MEDIUM-LIGHT SKIN TONE",1603},{"WOMAN BIKING",1604},{"WOMAN BIKING: DARK SKIN TONE",1605}, {"WOMAN BIKING: LIGHT SKIN TONE",1606},{"WOMAN BIKING: MEDIUM SKIN TONE",1607},{"WOMAN BIKING: MEDIUM-DARK SKIN TONE",1608}, {"WOMAN BIKING: MEDIUM-LIGHT SKIN TONE",1609},{"WOMAN BOUNCING BALL",1610},{"WOMAN BOUNCING BALL: DARK SKIN TONE",1611}, {"WOMAN BOUNCING BALL: LIGHT SKIN TONE",1612},{"WOMAN BOUNCING BALL: MEDIUM SKIN TONE",1613}, {"WOMAN BOUNCING BALL: MEDIUM-DARK SKIN TONE",1614},{"WOMAN BOUNCING BALL: MEDIUM-LIGHT SKIN TONE",1615}, {"WOMAN BOWING",1616},{"WOMAN BOWING: DARK SKIN TONE",1617},{"WOMAN BOWING: LIGHT SKIN TONE",1618}, {"WOMAN BOWING: MEDIUM SKIN TONE",1619},{"WOMAN BOWING: MEDIUM-DARK SKIN TONE",1620}, {"WOMAN BOWING: MEDIUM-LIGHT SKIN TONE",1621},{"WOMAN CARTWHEELING",1622},{"WOMAN CARTWHEELING: DARK SKIN TONE",1623}, {"WOMAN CARTWHEELING: LIGHT SKIN TONE",1624},{"WOMAN CARTWHEELING: MEDIUM SKIN TONE",1625}, {"WOMAN CARTWHEELING: MEDIUM-DARK SKIN TONE",1626},{"WOMAN CARTWHEELING: MEDIUM-LIGHT SKIN TONE",1627}, {"WOMAN CLIMBING",1628},{"WOMAN CLIMBING: DARK SKIN TONE",1629},{"WOMAN CLIMBING: LIGHT SKIN TONE",1630}, {"WOMAN CLIMBING: MEDIUM SKIN TONE",1631},{"WOMAN CLIMBING: MEDIUM-DARK SKIN TONE",1632}, {"WOMAN CLIMBING: MEDIUM-LIGHT SKIN TONE",1633},{"WOMAN CONSTRUCTION WORKER",1634}, {"WOMAN CONSTRUCTION WORKER: DARK SKIN TONE",1635},{"WOMAN CONSTRUCTION WORKER: LIGHT SKIN TONE",1636}, {"WOMAN CONSTRUCTION WORKER: MEDIUM SKIN TONE",1637},{"WOMAN CONSTRUCTION WORKER: MEDIUM-DARK SKIN TONE",1638}, {"WOMAN CONSTRUCTION WORKER: MEDIUM-LIGHT SKIN TONE",1639},{"WOMAN COOK",1640},{"WOMAN COOK: DARK SKIN TONE",1641}, {"WOMAN COOK: LIGHT SKIN TONE",1642},{"WOMAN COOK: MEDIUM SKIN TONE",1643},{"WOMAN COOK: MEDIUM-DARK SKIN TONE",1644}, {"WOMAN COOK: MEDIUM-LIGHT SKIN TONE",1645},{"WOMAN DANCING: DARK SKIN TONE",1646}, {"WOMAN DANCING: LIGHT SKIN TONE",1647},{"WOMAN DANCING: MEDIUM SKIN TONE",1648}, {"WOMAN DANCING: MEDIUM-DARK SKIN TONE",1649},{"WOMAN DANCING: MEDIUM-LIGHT SKIN TONE",1650}, {"WOMAN DETECTIVE",1651},{"WOMAN DETECTIVE: DARK SKIN TONE",1652},{"WOMAN DETECTIVE: LIGHT SKIN TONE",1653}, {"WOMAN DETECTIVE: MEDIUM SKIN TONE",1654},{"WOMAN DETECTIVE: MEDIUM-DARK SKIN TONE",1655}, {"WOMAN DETECTIVE: MEDIUM-LIGHT SKIN TONE",1656},{"WOMAN ELF",1657},{"WOMAN ELF: DARK SKIN TONE",1658}, {"WOMAN ELF: LIGHT SKIN TONE",1659},{"WOMAN ELF: MEDIUM SKIN TONE",1660},{"WOMAN ELF: MEDIUM-DARK SKIN TONE",1661}, {"WOMAN ELF: MEDIUM-LIGHT SKIN TONE",1662},{"WOMAN FACEPALMING",1663},{"WOMAN FACEPALMING: DARK SKIN TONE",1664}, {"WOMAN FACEPALMING: LIGHT SKIN TONE",1665},{"WOMAN FACEPALMING: MEDIUM SKIN TONE",1666}, {"WOMAN FACEPALMING: MEDIUM-DARK SKIN TONE",1667},{"WOMAN FACEPALMING: MEDIUM-LIGHT SKIN TONE",1668}, {"WOMAN FACTORY WORKER",1669},{"WOMAN FACTORY WORKER: DARK SKIN TONE",1670},{"WOMAN FACTORY WORKER: LIGHT SKIN TONE",1671}, {"WOMAN FACTORY WORKER: MEDIUM SKIN TONE",1672},{"WOMAN FACTORY WORKER: MEDIUM-DARK SKIN TONE",1673}, {"WOMAN FACTORY WORKER: MEDIUM-LIGHT SKIN TONE",1674},{"WOMAN FAIRY",1675},{"WOMAN FAIRY: DARK SKIN TONE",1676}, {"WOMAN FAIRY: LIGHT SKIN TONE",1677},{"WOMAN FAIRY: MEDIUM SKIN TONE",1678},{"WOMAN FAIRY: MEDIUM-DARK SKIN TONE",1679}, {"WOMAN FAIRY: MEDIUM-LIGHT SKIN TONE",1680},{"WOMAN FARMER",1681},{"WOMAN FARMER: DARK SKIN TONE",1682}, {"WOMAN FARMER: LIGHT SKIN TONE",1683},{"WOMAN FARMER: MEDIUM SKIN TONE",1684},{"WOMAN FARMER: MEDIUM-DARK SKIN TONE",1685}, {"WOMAN FARMER: MEDIUM-LIGHT SKIN TONE",1686},{"WOMAN FIREFIGHTER",1687},{"WOMAN FIREFIGHTER: DARK SKIN TONE",1688}, {"WOMAN FIREFIGHTER: LIGHT SKIN TONE",1689},{"WOMAN FIREFIGHTER: MEDIUM SKIN TONE",1690}, {"WOMAN FIREFIGHTER: MEDIUM-DARK SKIN TONE",1691},{"WOMAN FIREFIGHTER: MEDIUM-LIGHT SKIN TONE",1692}, {"WOMAN FROWNING",1693},{"WOMAN FROWNING: DARK SKIN TONE",1694},{"WOMAN FROWNING: LIGHT SKIN TONE",1695}, {"WOMAN FROWNING: MEDIUM SKIN TONE",1696},{"WOMAN FROWNING: MEDIUM-DARK SKIN TONE",1697}, {"WOMAN FROWNING: MEDIUM-LIGHT SKIN TONE",1698},{"WOMAN GENIE",1699},{"WOMAN GESTURING NO",1700}, {"WOMAN GESTURING NO: DARK SKIN TONE",1701},{"WOMAN GESTURING NO: LIGHT SKIN TONE",1702}, {"WOMAN GESTURING NO: MEDIUM SKIN TONE",1703},{"WOMAN GESTURING NO: MEDIUM-DARK SKIN TONE",1704}, {"WOMAN GESTURING NO: MEDIUM-LIGHT SKIN TONE",1705},{"WOMAN GESTURING OK",1706},{"WOMAN GESTURING OK: DARK SKIN TONE",1707}, {"WOMAN GESTURING OK: LIGHT SKIN TONE",1708},{"WOMAN GESTURING OK: MEDIUM SKIN TONE",1709}, {"WOMAN GESTURING OK: MEDIUM-DARK SKIN TONE",1710},{"WOMAN GESTURING OK: MEDIUM-LIGHT SKIN TONE",1711}, {"WOMAN GETTING HAIRCUT",1712},{"WOMAN GETTING HAIRCUT: DARK SKIN TONE",1713},{"WOMAN GETTING HAIRCUT: LIGHT SKIN TONE",1714}, {"WOMAN GETTING HAIRCUT: MEDIUM SKIN TONE",1715},{"WOMAN GETTING HAIRCUT: MEDIUM-DARK SKIN TONE",1716}, {"WOMAN GETTING HAIRCUT: MEDIUM-LIGHT SKIN TONE",1717},{"WOMAN GETTING MASSAGE",1718}, {"WOMAN GETTING MASSAGE: DARK SKIN TONE",1719},{"WOMAN GETTING MASSAGE: LIGHT SKIN TONE",1720}, {"WOMAN GETTING MASSAGE: MEDIUM SKIN TONE",1721},{"WOMAN GETTING MASSAGE: MEDIUM-DARK SKIN TONE",1722}, {"WOMAN GETTING MASSAGE: MEDIUM-LIGHT SKIN TONE",1723},{"WOMAN GOLFING",1724},{"WOMAN GOLFING: DARK SKIN TONE",1725}, {"WOMAN GOLFING: LIGHT SKIN TONE",1726},{"WOMAN GOLFING: MEDIUM SKIN TONE",1727}, {"WOMAN GOLFING: MEDIUM-DARK SKIN TONE",1728},{"WOMAN GOLFING: MEDIUM-LIGHT SKIN TONE",1729}, {"WOMAN GUARD",1730},{"WOMAN GUARD: DARK SKIN TONE",1731},{"WOMAN GUARD: LIGHT SKIN TONE",1732}, {"WOMAN GUARD: MEDIUM SKIN TONE",1733},{"WOMAN GUARD: MEDIUM-DARK SKIN TONE",1734}, {"WOMAN GUARD: MEDIUM-LIGHT SKIN TONE",1735},{"WOMAN HEALTH WORKER",1736},{"WOMAN HEALTH WORKER: DARK SKIN TONE",1737}, {"WOMAN HEALTH WORKER: LIGHT SKIN TONE",1738},{"WOMAN HEALTH WORKER: MEDIUM SKIN TONE",1739}, {"WOMAN HEALTH WORKER: MEDIUM-DARK SKIN TONE",1740},{"WOMAN HEALTH WORKER: MEDIUM-LIGHT SKIN TONE",1741}, {"WOMAN IN LOTUS POSITION",1742},{"WOMAN IN LOTUS POSITION: DARK SKIN TONE",1743}, {"WOMAN IN LOTUS POSITION: LIGHT SKIN TONE",1744},{"WOMAN IN LOTUS POSITION: MEDIUM SKIN TONE",1745}, {"WOMAN IN LOTUS POSITION: MEDIUM-DARK SKIN TONE",1746},{"WOMAN IN LOTUS POSITION: MEDIUM-LIGHT SKIN TONE",1747}, {"WOMAN IN STEAMY ROOM",1748},{"WOMAN IN STEAMY ROOM: DARK SKIN TONE",1749},{"WOMAN IN STEAMY ROOM: LIGHT SKIN TONE",1750}, {"WOMAN IN STEAMY ROOM: MEDIUM SKIN TONE",1751},{"WOMAN IN STEAMY ROOM: MEDIUM-DARK SKIN TONE",1752}, {"WOMAN IN STEAMY ROOM: MEDIUM-LIGHT SKIN TONE",1753},{"WOMAN JUDGE",1754},{"WOMAN JUDGE: DARK SKIN TONE",1755}, {"WOMAN JUDGE: LIGHT SKIN TONE",1756},{"WOMAN JUDGE: MEDIUM SKIN TONE",1757},{"WOMAN JUDGE: MEDIUM-DARK SKIN TONE",1758}, {"WOMAN JUDGE: MEDIUM-LIGHT SKIN TONE",1759},{"WOMAN JUGGLING",1760},{"WOMAN JUGGLING: DARK SKIN TONE",1761}, {"WOMAN JUGGLING: LIGHT SKIN TONE",1762},{"WOMAN JUGGLING: MEDIUM SKIN TONE",1763}, {"WOMAN JUGGLING: MEDIUM-DARK SKIN TONE",1764},{"WOMAN JUGGLING: MEDIUM-LIGHT SKIN TONE",1765}, {"WOMAN LIFTING WEIGHTS",1766},{"WOMAN LIFTING WEIGHTS: DARK SKIN TONE",1767},{"WOMAN LIFTING WEIGHTS: LIGHT SKIN TONE",1768}, {"WOMAN LIFTING WEIGHTS: MEDIUM SKIN TONE",1769},{"WOMAN LIFTING WEIGHTS: MEDIUM-DARK SKIN TONE",1770}, {"WOMAN LIFTING WEIGHTS: MEDIUM-LIGHT SKIN TONE",1771},{"WOMAN MAGE",1772},{"WOMAN MAGE: DARK SKIN TONE",1773}, {"WOMAN MAGE: LIGHT SKIN TONE",1774},{"WOMAN MAGE: MEDIUM SKIN TONE",1775},{"WOMAN MAGE: MEDIUM-DARK SKIN TONE",1776}, {"WOMAN MAGE: MEDIUM-LIGHT SKIN TONE",1777},{"WOMAN MECHANIC",1778},{"WOMAN MECHANIC: DARK SKIN TONE",1779}, {"WOMAN MECHANIC: LIGHT SKIN TONE",1780},{"WOMAN MECHANIC: MEDIUM SKIN TONE",1781}, {"WOMAN MECHANIC: MEDIUM-DARK SKIN TONE",1782},{"WOMAN MECHANIC: MEDIUM-LIGHT SKIN TONE",1783}, {"WOMAN MOUNTAIN BIKING",1784},{"WOMAN MOUNTAIN BIKING: DARK SKIN TONE",1785},{"WOMAN MOUNTAIN BIKING: LIGHT SKIN TONE",1786}, {"WOMAN MOUNTAIN BIKING: MEDIUM SKIN TONE",1787},{"WOMAN MOUNTAIN BIKING: MEDIUM-DARK SKIN TONE",1788}, {"WOMAN MOUNTAIN BIKING: MEDIUM-LIGHT SKIN TONE",1789},{"WOMAN OFFICE WORKER",1790}, {"WOMAN OFFICE WORKER: DARK SKIN TONE",1791},{"WOMAN OFFICE WORKER: LIGHT SKIN TONE",1792}, {"WOMAN OFFICE WORKER: MEDIUM SKIN TONE",1793},{"WOMAN OFFICE WORKER: MEDIUM-DARK SKIN TONE",1794}, {"WOMAN OFFICE WORKER: MEDIUM-LIGHT SKIN TONE",1795},{"WOMAN PILOT",1796},{"WOMAN PILOT: DARK SKIN TONE",1797}, {"WOMAN PILOT: LIGHT SKIN TONE",1798},{"WOMAN PILOT: MEDIUM SKIN TONE",1799},{"WOMAN PILOT: MEDIUM-DARK SKIN TONE",1800}, {"WOMAN PILOT: MEDIUM-LIGHT SKIN TONE",1801},{"WOMAN PLAYING HANDBALL",1802},{"WOMAN PLAYING HANDBALL: DARK SKIN TONE",1803}, {"WOMAN PLAYING HANDBALL: LIGHT SKIN TONE",1804},{"WOMAN PLAYING HANDBALL: MEDIUM SKIN TONE",1805}, {"WOMAN PLAYING HANDBALL: MEDIUM-DARK SKIN TONE",1806},{"WOMAN PLAYING HANDBALL: MEDIUM-LIGHT SKIN TONE",1807}, {"WOMAN PLAYING WATER POLO",1808},{"WOMAN PLAYING WATER POLO: DARK SKIN TONE",1809}, {"WOMAN PLAYING WATER POLO: LIGHT SKIN TONE",1810},{"WOMAN PLAYING WATER POLO: MEDIUM SKIN TONE",1811}, {"WOMAN PLAYING WATER POLO: MEDIUM-DARK SKIN TONE",1812},{"WOMAN PLAYING WATER POLO: MEDIUM-LIGHT SKIN TONE",1813}, {"WOMAN POLICE OFFICER",1814},{"WOMAN POLICE OFFICER: DARK SKIN TONE",1815},{"WOMAN POLICE OFFICER: LIGHT SKIN TONE",1816}, {"WOMAN POLICE OFFICER: MEDIUM SKIN TONE",1817},{"WOMAN POLICE OFFICER: MEDIUM-DARK SKIN TONE",1818}, {"WOMAN POLICE OFFICER: MEDIUM-LIGHT SKIN TONE",1819},{"WOMAN POUTING",1820},{"WOMAN POUTING: DARK SKIN TONE",1821}, {"WOMAN POUTING: LIGHT SKIN TONE",1822},{"WOMAN POUTING: MEDIUM SKIN TONE",1823}, {"WOMAN POUTING: MEDIUM-DARK SKIN TONE",1824},{"WOMAN POUTING: MEDIUM-LIGHT SKIN TONE",1825}, {"WOMAN RAISING HAND",1826},{"WOMAN RAISING HAND: DARK SKIN TONE",1827},{"WOMAN RAISING HAND: LIGHT SKIN TONE",1828}, {"WOMAN RAISING HAND: MEDIUM SKIN TONE",1829},{"WOMAN RAISING HAND: MEDIUM-DARK SKIN TONE",1830}, {"WOMAN RAISING HAND: MEDIUM-LIGHT SKIN TONE",1831},{"WOMAN ROWING BOAT",1832},{"WOMAN ROWING BOAT: DARK SKIN TONE",1833}, {"WOMAN ROWING BOAT: LIGHT SKIN TONE",1834},{"WOMAN ROWING BOAT: MEDIUM SKIN TONE",1835}, {"WOMAN ROWING BOAT: MEDIUM-DARK SKIN TONE",1836},{"WOMAN ROWING BOAT: MEDIUM-LIGHT SKIN TONE",1837}, {"WOMAN RUNNING",1838},{"WOMAN RUNNING: DARK SKIN TONE",1839},{"WOMAN RUNNING: LIGHT SKIN TONE",1840}, {"WOMAN RUNNING: MEDIUM SKIN TONE",1841},{"WOMAN RUNNING: MEDIUM-DARK SKIN TONE",1842}, {"WOMAN RUNNING: MEDIUM-LIGHT SKIN TONE",1843},{"WOMAN SCIENTIST",1844},{"WOMAN SCIENTIST: DARK SKIN TONE",1845}, {"WOMAN SCIENTIST: LIGHT SKIN TONE",1846},{"WOMAN SCIENTIST: MEDIUM SKIN TONE",1847}, {"WOMAN SCIENTIST: MEDIUM-DARK SKIN TONE",1848},{"WOMAN SCIENTIST: MEDIUM-LIGHT SKIN TONE",1849}, {"WOMAN SHRUGGING",1850},{"WOMAN SHRUGGING: DARK SKIN TONE",1851},{"WOMAN SHRUGGING: LIGHT SKIN TONE",1852}, {"WOMAN SHRUGGING: MEDIUM SKIN TONE",1853},{"WOMAN SHRUGGING: MEDIUM-DARK SKIN TONE",1854}, {"WOMAN SHRUGGING: MEDIUM-LIGHT SKIN TONE",1855},{"WOMAN SINGER",1856},{"WOMAN SINGER: DARK SKIN TONE",1857}, {"WOMAN SINGER: LIGHT SKIN TONE",1858},{"WOMAN SINGER: MEDIUM SKIN TONE",1859},{"WOMAN SINGER: MEDIUM-DARK SKIN TONE",1860}, {"WOMAN SINGER: MEDIUM-LIGHT SKIN TONE",1861},{"WOMAN STUDENT",1862},{"WOMAN STUDENT: DARK SKIN TONE",1863}, {"WOMAN STUDENT: LIGHT SKIN TONE",1864},{"WOMAN STUDENT: MEDIUM SKIN TONE",1865}, {"WOMAN STUDENT: MEDIUM-DARK SKIN TONE",1866},{"WOMAN STUDENT: MEDIUM-LIGHT SKIN TONE",1867}, {"WOMAN SURFING",1868},{"WOMAN SURFING: DARK SKIN TONE",1869},{"WOMAN SURFING: LIGHT SKIN TONE",1870}, {"WOMAN SURFING: MEDIUM SKIN TONE",1871},{"WOMAN SURFING: MEDIUM-DARK SKIN TONE",1872}, {"WOMAN SURFING: MEDIUM-LIGHT SKIN TONE",1873},{"WOMAN SWIMMING",1874},{"WOMAN SWIMMING: DARK SKIN TONE",1875}, {"WOMAN SWIMMING: LIGHT SKIN TONE",1876},{"WOMAN SWIMMING: MEDIUM SKIN TONE",1877}, {"WOMAN SWIMMING: MEDIUM-DARK SKIN TONE",1878},{"WOMAN SWIMMING: MEDIUM-LIGHT SKIN TONE",1879}, {"WOMAN TEACHER",1880},{"WOMAN TEACHER: DARK SKIN TONE",1881},{"WOMAN TEACHER: LIGHT SKIN TONE",1882}, {"WOMAN TEACHER: MEDIUM SKIN TONE",1883},{"WOMAN TEACHER: MEDIUM-DARK SKIN TONE",1884}, {"WOMAN TEACHER: MEDIUM-LIGHT SKIN TONE",1885},{"WOMAN TECHNOLOGIST",1886},{"WOMAN TECHNOLOGIST: DARK SKIN TONE",1887}, {"WOMAN TECHNOLOGIST: LIGHT SKIN TONE",1888},{"WOMAN TECHNOLOGIST: MEDIUM SKIN TONE",1889}, {"WOMAN TECHNOLOGIST: MEDIUM-DARK SKIN TONE",1890},{"WOMAN TECHNOLOGIST: MEDIUM-LIGHT SKIN TONE",1891}, {"WOMAN TIPPING HAND",1892},{"WOMAN TIPPING HAND: DARK SKIN TONE",1893},{"WOMAN TIPPING HAND: LIGHT SKIN TONE",1894}, {"WOMAN TIPPING HAND: MEDIUM SKIN TONE",1895},{"WOMAN TIPPING HAND: MEDIUM-DARK SKIN TONE",1896}, {"WOMAN TIPPING HAND: MEDIUM-LIGHT SKIN TONE",1897},{"WOMAN VAMPIRE",1898},{"WOMAN VAMPIRE: DARK SKIN TONE",1899}, {"WOMAN VAMPIRE: LIGHT SKIN TONE",1900},{"WOMAN VAMPIRE: MEDIUM SKIN TONE",1901}, {"WOMAN VAMPIRE: MEDIUM-DARK SKIN TONE",1902},{"WOMAN VAMPIRE: MEDIUM-LIGHT SKIN TONE",1903}, {"WOMAN WALKING",1904},{"WOMAN WALKING: DARK SKIN TONE",1905},{"WOMAN WALKING: LIGHT SKIN TONE",1906}, {"WOMAN WALKING: MEDIUM SKIN TONE",1907},{"WOMAN WALKING: MEDIUM-DARK SKIN TONE",1908}, {"WOMAN WALKING: MEDIUM-LIGHT SKIN TONE",1909},{"WOMAN WEARING TURBAN",1910},{"WOMAN WEARING TURBAN: DARK SKIN TONE",1911}, {"WOMAN WEARING TURBAN: LIGHT SKIN TONE",1912},{"WOMAN WEARING TURBAN: MEDIUM SKIN TONE",1913}, {"WOMAN WEARING TURBAN: MEDIUM-DARK SKIN TONE",1914},{"WOMAN WEARING TURBAN: MEDIUM-LIGHT SKIN TONE",1915}, {"WOMAN WITH HEADSCARF: DARK SKIN TONE",1916},{"WOMAN WITH HEADSCARF: LIGHT SKIN TONE",1917}, {"WOMAN WITH HEADSCARF: MEDIUM SKIN TONE",1918},{"WOMAN WITH HEADSCARF: MEDIUM-DARK SKIN TONE",1919}, {"WOMAN WITH HEADSCARF: MEDIUM-LIGHT SKIN TONE",1920},{"WOMAN ZOMBIE",1921},{"WOMAN: DARK SKIN TONE",1922}, {"WOMAN: LIGHT SKIN TONE",1923},{"WOMAN: MEDIUM SKIN TONE",1924},{"WOMAN: MEDIUM-DARK SKIN TONE",1925}, {"WOMAN: MEDIUM-LIGHT SKIN TONE",1926},{"WOMEN WITH BUNNY EARS",1927},{"WOMEN WITH BUNNY EARS PARTYING",1928}, {"WOMEN WRESTLING",1929},{"WRITING HAND: DARK SKIN TONE",1930},{"WRITING HAND: LIGHT SKIN TONE",1931}, {"WRITING HAND: MEDIUM SKIN TONE",1932},{"WRITING HAND: MEDIUM-DARK SKIN TONE",1933}, {"WRITING HAND: MEDIUM-LIGHT SKIN TONE",1934},{"YEMEN",1935},{"ZAMBIA",1936},{"ZIMBABWE",1937}, {"Ã…LAND ISLANDS",1938} };/* Unicode sequences such as Emoji sequences */ static const MVMint32 uni_seq_0[] = {2,0x1F9D1,0x1F3FF}; /* ADULT: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1[] = {2,0x1F9D1,0x1F3FB}; /* ADULT: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_2[] = {2,0x1F9D1,0x1F3FD}; /* ADULT: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_3[] = {2,0x1F9D1,0x1F3FE}; /* ADULT: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_4[] = {2,0x1F9D1,0x1F3FC}; /* ADULT: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_5[] = {2,0x1F1E6,0x1F1EB}; /* AFGHANISTAN */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_6[] = {2,0x1F1E6,0x1F1F1}; /* ALBANIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_7[] = {2,0x1F1E9,0x1F1FF}; /* ALGERIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_8[] = {2,0x1F1E6,0x1F1F8}; /* AMERICAN SAMOA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_9[] = {2,0x1F1E6,0x1F1E9}; /* ANDORRA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_10[] = {2,0x1F1E6,0x1F1F4}; /* ANGOLA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_11[] = {2,0x1F1E6,0x1F1EE}; /* ANGUILLA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_12[] = {2,0x1F1E6,0x1F1F6}; /* ANTARCTICA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_13[] = {2,0x1F1E6,0x1F1EC}; /* ANTIGUA & BARBUDA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_14[] = {2,0x646,0x6A9}; /* ARABIC SEQUENCE NOON WITH KEHEH */ /*NamedSequences */ static const MVMint32 uni_seq_15[] = {2,0x626,0x6D5}; /* ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH AE */ /*NamedSequences */ static const MVMint32 uni_seq_16[] = {2,0x626,0x627}; /* ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH ALEF */ /*NamedSequences */ static const MVMint32 uni_seq_17[] = {2,0x626,0x649}; /* ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA */ /*NamedSequences */ static const MVMint32 uni_seq_18[] = {2,0x626,0x6D0}; /* ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH E */ /*NamedSequences */ static const MVMint32 uni_seq_19[] = {2,0x626,0x6C6}; /* ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH OE */ /*NamedSequences */ static const MVMint32 uni_seq_20[] = {2,0x626,0x6C7}; /* ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH U */ /*NamedSequences */ static const MVMint32 uni_seq_21[] = {2,0x626,0x648}; /* ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH WAW */ /*NamedSequences */ static const MVMint32 uni_seq_22[] = {2,0x626,0x6C8}; /* ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH YU */ /*NamedSequences */ static const MVMint32 uni_seq_23[] = {2,0x1F1E6,0x1F1F7}; /* ARGENTINA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_24[] = {2,0x1F1E6,0x1F1F2}; /* ARMENIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_25[] = {2,0x1F1E6,0x1F1FC}; /* ARUBA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_26[] = {2,0x1F1E6,0x1F1E8}; /* ASCENSION ISLAND */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_27[] = {2,0x1F1E6,0x1F1FA}; /* AUSTRALIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_28[] = {2,0x1F1E6,0x1F1F9}; /* AUSTRIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_29[] = {2,0x1F1E6,0x1F1FF}; /* AZERBAIJAN */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_30[] = {2,0x1F47C,0x1F3FF}; /* BABY ANGEL: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_31[] = {2,0x1F47C,0x1F3FB}; /* BABY ANGEL: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_32[] = {2,0x1F47C,0x1F3FD}; /* BABY ANGEL: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_33[] = {2,0x1F47C,0x1F3FE}; /* BABY ANGEL: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_34[] = {2,0x1F47C,0x1F3FC}; /* BABY ANGEL: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_35[] = {2,0x1F476,0x1F3FF}; /* BABY: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_36[] = {2,0x1F476,0x1F3FB}; /* BABY: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_37[] = {2,0x1F476,0x1F3FD}; /* BABY: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_38[] = {2,0x1F476,0x1F3FE}; /* BABY: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_39[] = {2,0x1F476,0x1F3FC}; /* BABY: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_40[] = {2,0x1F447,0x1F3FF}; /* BACKHAND INDEX POINTING DOWN: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_41[] = {2,0x1F447,0x1F3FB}; /* BACKHAND INDEX POINTING DOWN: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_42[] = {2,0x1F447,0x1F3FD}; /* BACKHAND INDEX POINTING DOWN: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_43[] = {2,0x1F447,0x1F3FE}; /* BACKHAND INDEX POINTING DOWN: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_44[] = {2,0x1F447,0x1F3FC}; /* BACKHAND INDEX POINTING DOWN: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_45[] = {2,0x1F448,0x1F3FF}; /* BACKHAND INDEX POINTING LEFT: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_46[] = {2,0x1F448,0x1F3FB}; /* BACKHAND INDEX POINTING LEFT: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_47[] = {2,0x1F448,0x1F3FD}; /* BACKHAND INDEX POINTING LEFT: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_48[] = {2,0x1F448,0x1F3FE}; /* BACKHAND INDEX POINTING LEFT: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_49[] = {2,0x1F448,0x1F3FC}; /* BACKHAND INDEX POINTING LEFT: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_50[] = {2,0x1F449,0x1F3FF}; /* BACKHAND INDEX POINTING RIGHT: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_51[] = {2,0x1F449,0x1F3FB}; /* BACKHAND INDEX POINTING RIGHT: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_52[] = {2,0x1F449,0x1F3FD}; /* BACKHAND INDEX POINTING RIGHT: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_53[] = {2,0x1F449,0x1F3FE}; /* BACKHAND INDEX POINTING RIGHT: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_54[] = {2,0x1F449,0x1F3FC}; /* BACKHAND INDEX POINTING RIGHT: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_55[] = {2,0x1F446,0x1F3FF}; /* BACKHAND INDEX POINTING UP: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_56[] = {2,0x1F446,0x1F3FB}; /* BACKHAND INDEX POINTING UP: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_57[] = {2,0x1F446,0x1F3FD}; /* BACKHAND INDEX POINTING UP: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_58[] = {2,0x1F446,0x1F3FE}; /* BACKHAND INDEX POINTING UP: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_59[] = {2,0x1F446,0x1F3FC}; /* BACKHAND INDEX POINTING UP: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_60[] = {2,0x1F1E7,0x1F1F8}; /* BAHAMAS */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_61[] = {2,0x1F1E7,0x1F1ED}; /* BAHRAIN */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_62[] = {2,0x1F1E7,0x1F1E9}; /* BANGLADESH */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_63[] = {2,0x1F1E7,0x1F1E7}; /* BARBADOS */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_64[] = {2,0x1F9D4,0x1F3FF}; /* BEARDED PERSON: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_65[] = {2,0x1F9D4,0x1F3FB}; /* BEARDED PERSON: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_66[] = {2,0x1F9D4,0x1F3FD}; /* BEARDED PERSON: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_67[] = {2,0x1F9D4,0x1F3FE}; /* BEARDED PERSON: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_68[] = {2,0x1F9D4,0x1F3FC}; /* BEARDED PERSON: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_69[] = {2,0x1F1E7,0x1F1FE}; /* BELARUS */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_70[] = {2,0x1F1E7,0x1F1EA}; /* BELGIUM */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_71[] = {2,0x1F1E7,0x1F1FF}; /* BELIZE */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_72[] = {3,0x995,0x9CD,0x9B7}; /* BENGALI LETTER KHINYA */ /*NamedSequences */ static const MVMint32 uni_seq_73[] = {2,0x1F1E7,0x1F1EF}; /* BENIN */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_74[] = {2,0x1F1E7,0x1F1F2}; /* BERMUDA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_75[] = {2,0x1F1E7,0x1F1F9}; /* BHUTAN */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_76[] = {4,0x1F471,0x200D,0x2642,0xFE0F}; /* BLOND-HAIRED MAN */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_77[] = {5,0x1F471,0x1F3FF,0x200D,0x2642,0xFE0F}; /* BLOND-HAIRED MAN: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_78[] = {5,0x1F471,0x1F3FB,0x200D,0x2642,0xFE0F}; /* BLOND-HAIRED MAN: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_79[] = {5,0x1F471,0x1F3FD,0x200D,0x2642,0xFE0F}; /* BLOND-HAIRED MAN: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_80[] = {5,0x1F471,0x1F3FE,0x200D,0x2642,0xFE0F}; /* BLOND-HAIRED MAN: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_81[] = {5,0x1F471,0x1F3FC,0x200D,0x2642,0xFE0F}; /* BLOND-HAIRED MAN: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_82[] = {2,0x1F471,0x1F3FF}; /* BLOND-HAIRED PERSON: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_83[] = {2,0x1F471,0x1F3FB}; /* BLOND-HAIRED PERSON: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_84[] = {2,0x1F471,0x1F3FD}; /* BLOND-HAIRED PERSON: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_85[] = {2,0x1F471,0x1F3FE}; /* BLOND-HAIRED PERSON: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_86[] = {2,0x1F471,0x1F3FC}; /* BLOND-HAIRED PERSON: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_87[] = {4,0x1F471,0x200D,0x2640,0xFE0F}; /* BLOND-HAIRED WOMAN */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_88[] = {5,0x1F471,0x1F3FF,0x200D,0x2640,0xFE0F}; /* BLOND-HAIRED WOMAN: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_89[] = {5,0x1F471,0x1F3FB,0x200D,0x2640,0xFE0F}; /* BLOND-HAIRED WOMAN: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_90[] = {5,0x1F471,0x1F3FD,0x200D,0x2640,0xFE0F}; /* BLOND-HAIRED WOMAN: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_91[] = {5,0x1F471,0x1F3FE,0x200D,0x2640,0xFE0F}; /* BLOND-HAIRED WOMAN: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_92[] = {5,0x1F471,0x1F3FC,0x200D,0x2640,0xFE0F}; /* BLOND-HAIRED WOMAN: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_93[] = {2,0x1F1E7,0x1F1F4}; /* BOLIVIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_94[] = {2,0x1F1E7,0x1F1E6}; /* BOSNIA & HERZEGOVINA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_95[] = {2,0x1F1E7,0x1F1FC}; /* BOTSWANA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_96[] = {2,0x1F1E7,0x1F1FB}; /* BOUVET ISLAND */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_97[] = {2,0x1F466,0x1F3FF}; /* BOY: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_98[] = {2,0x1F466,0x1F3FB}; /* BOY: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_99[] = {2,0x1F466,0x1F3FD}; /* BOY: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_100[] = {2,0x1F466,0x1F3FE}; /* BOY: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_101[] = {2,0x1F466,0x1F3FC}; /* BOY: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_102[] = {2,0x1F1E7,0x1F1F7}; /* BRAZIL */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_103[] = {2,0x1F931,0x1F3FF}; /* BREAST-FEEDING: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_104[] = {2,0x1F931,0x1F3FB}; /* BREAST-FEEDING: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_105[] = {2,0x1F931,0x1F3FD}; /* BREAST-FEEDING: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_106[] = {2,0x1F931,0x1F3FE}; /* BREAST-FEEDING: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_107[] = {2,0x1F931,0x1F3FC}; /* BREAST-FEEDING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_108[] = {2,0x1F470,0x1F3FF}; /* BRIDE WITH VEIL: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_109[] = {2,0x1F470,0x1F3FB}; /* BRIDE WITH VEIL: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_110[] = {2,0x1F470,0x1F3FD}; /* BRIDE WITH VEIL: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_111[] = {2,0x1F470,0x1F3FE}; /* BRIDE WITH VEIL: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_112[] = {2,0x1F470,0x1F3FC}; /* BRIDE WITH VEIL: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_113[] = {2,0x1F1EE,0x1F1F4}; /* BRITISH INDIAN OCEAN TERRITORY */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_114[] = {2,0x1F1FB,0x1F1EC}; /* BRITISH VIRGIN ISLANDS */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_115[] = {2,0x1F1E7,0x1F1F3}; /* BRUNEI */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_116[] = {2,0x1F1E7,0x1F1EC}; /* BULGARIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_117[] = {2,0x1F1E7,0x1F1EB}; /* BURKINA FASO */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_118[] = {2,0x1F1E7,0x1F1EE}; /* BURUNDI */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_119[] = {2,0x1F919,0x1F3FF}; /* CALL ME HAND: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_120[] = {2,0x1F919,0x1F3FB}; /* CALL ME HAND: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_121[] = {2,0x1F919,0x1F3FD}; /* CALL ME HAND: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_122[] = {2,0x1F919,0x1F3FE}; /* CALL ME HAND: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_123[] = {2,0x1F919,0x1F3FC}; /* CALL ME HAND: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_124[] = {2,0x1F1F0,0x1F1ED}; /* CAMBODIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_125[] = {2,0x1F1E8,0x1F1F2}; /* CAMEROON */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_126[] = {2,0x1F1E8,0x1F1E6}; /* CANADA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_127[] = {2,0x1F1EE,0x1F1E8}; /* CANARY ISLANDS */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_128[] = {2,0x1F1E8,0x1F1FB}; /* CAPE VERDE */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_129[] = {2,0x1F1E7,0x1F1F6}; /* CARIBBEAN NETHERLANDS */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_130[] = {2,0x1F1F0,0x1F1FE}; /* CAYMAN ISLANDS */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_131[] = {2,0x1F1E8,0x1F1EB}; /* CENTRAL AFRICAN REPUBLIC */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_132[] = {2,0x1F1EA,0x1F1E6}; /* CEUTA & MELILLA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_133[] = {2,0x1F1F9,0x1F1E9}; /* CHAD */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_134[] = {2,0x1F9D2,0x1F3FF}; /* CHILD: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_135[] = {2,0x1F9D2,0x1F3FB}; /* CHILD: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_136[] = {2,0x1F9D2,0x1F3FD}; /* CHILD: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_137[] = {2,0x1F9D2,0x1F3FE}; /* CHILD: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_138[] = {2,0x1F9D2,0x1F3FC}; /* CHILD: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_139[] = {2,0x1F1E8,0x1F1F1}; /* CHILE */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_140[] = {2,0x1F1E8,0x1F1F3}; /* CHINA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_141[] = {2,0x1F1E8,0x1F1FD}; /* CHRISTMAS ISLAND */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_142[] = {2,0x1F44F,0x1F3FF}; /* CLAPPING HANDS: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_143[] = {2,0x1F44F,0x1F3FB}; /* CLAPPING HANDS: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_144[] = {2,0x1F44F,0x1F3FD}; /* CLAPPING HANDS: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_145[] = {2,0x1F44F,0x1F3FE}; /* CLAPPING HANDS: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_146[] = {2,0x1F44F,0x1F3FC}; /* CLAPPING HANDS: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_147[] = {2,0x1F1E8,0x1F1F5}; /* CLIPPERTON ISLAND */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_148[] = {2,0x1F1E8,0x1F1E8}; /* COCOS (KEELING) ISLANDS */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_149[] = {2,0x1F1E8,0x1F1F4}; /* COLOMBIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_150[] = {2,0x1F1F0,0x1F1F2}; /* COMOROS */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_151[] = {2,0x1F1E8,0x1F1EC}; /* CONGO - BRAZZAVILLE */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_152[] = {2,0x1F1E8,0x1F1E9}; /* CONGO - KINSHASA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_153[] = {2,0x1F477,0x1F3FF}; /* CONSTRUCTION WORKER: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_154[] = {2,0x1F477,0x1F3FB}; /* CONSTRUCTION WORKER: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_155[] = {2,0x1F477,0x1F3FD}; /* CONSTRUCTION WORKER: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_156[] = {2,0x1F477,0x1F3FE}; /* CONSTRUCTION WORKER: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_157[] = {2,0x1F477,0x1F3FC}; /* CONSTRUCTION WORKER: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_158[] = {2,0x1F1E8,0x1F1F0}; /* COOK ISLANDS */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_159[] = {2,0x1F1E8,0x1F1F7}; /* COSTA RICA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_160[] = {6,0x1F468,0x200D,0x2764,0xFE0F,0x200D,0x1F468}; /* COUPLE WITH HEART: MAN MAN */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_161[] = {6,0x1F469,0x200D,0x2764,0xFE0F,0x200D,0x1F468}; /* COUPLE WITH HEART: WOMAN MAN */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_162[] = {6,0x1F469,0x200D,0x2764,0xFE0F,0x200D,0x1F469}; /* COUPLE WITH HEART: WOMAN WOMAN */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_163[] = {2,0x1F1ED,0x1F1F7}; /* CROATIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_164[] = {2,0x1F91E,0x1F3FF}; /* CROSSED FINGERS: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_165[] = {2,0x1F91E,0x1F3FB}; /* CROSSED FINGERS: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_166[] = {2,0x1F91E,0x1F3FD}; /* CROSSED FINGERS: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_167[] = {2,0x1F91E,0x1F3FE}; /* CROSSED FINGERS: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_168[] = {2,0x1F91E,0x1F3FC}; /* CROSSED FINGERS: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_169[] = {2,0x1F1E8,0x1F1FA}; /* CUBA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_170[] = {2,0x1F1E8,0x1F1FC}; /* CURAÇAO */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_171[] = {2,0x1F1E8,0x1F1FE}; /* CYPRUS */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_172[] = {2,0x1F1E8,0x1F1FF}; /* CZECH REPUBLIC */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_173[] = {2,0x1F1E8,0x1F1FF}; /* CZECHIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_174[] = {2,0x1F1E8,0x1F1EE}; /* CÔTE D’IVOIRE */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_175[] = {2,0x1F1E9,0x1F1F0}; /* DENMARK */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_176[] = {2,0x1F575,0x1F3FF}; /* DETECTIVE: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_177[] = {2,0x1F575,0x1F3FB}; /* DETECTIVE: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_178[] = {2,0x1F575,0x1F3FD}; /* DETECTIVE: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_179[] = {2,0x1F575,0x1F3FE}; /* DETECTIVE: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_180[] = {2,0x1F575,0x1F3FC}; /* DETECTIVE: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_181[] = {2,0x1F1E9,0x1F1EC}; /* DIEGO GARCIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_182[] = {2,0x1F1E9,0x1F1EF}; /* DJIBOUTI */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_183[] = {2,0x1F1E9,0x1F1F2}; /* DOMINICA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_184[] = {2,0x1F1E9,0x1F1F4}; /* DOMINICAN REPUBLIC */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_185[] = {2,0x1F442,0x1F3FF}; /* EAR: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_186[] = {2,0x1F442,0x1F3FB}; /* EAR: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_187[] = {2,0x1F442,0x1F3FD}; /* EAR: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_188[] = {2,0x1F442,0x1F3FE}; /* EAR: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_189[] = {2,0x1F442,0x1F3FC}; /* EAR: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_190[] = {2,0x1F1EA,0x1F1E8}; /* ECUADOR */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_191[] = {2,0x1F1EA,0x1F1EC}; /* EGYPT */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_192[] = {2,0x1F1F8,0x1F1FB}; /* EL SALVADOR */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_193[] = {2,0x1F9DD,0x1F3FF}; /* ELF: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_194[] = {2,0x1F9DD,0x1F3FB}; /* ELF: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_195[] = {2,0x1F9DD,0x1F3FD}; /* ELF: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_196[] = {2,0x1F9DD,0x1F3FE}; /* ELF: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_197[] = {2,0x1F9DD,0x1F3FC}; /* ELF: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_198[] = {7,0x1F3F4,0xE0067,0xE0062,0xE0065,0xE006E,0xE0067,0xE007F}; /* ENGLAND */ /*Emoji_Tag_Sequence */ static const MVMint32 uni_seq_199[] = {2,0x1F1EC,0x1F1F6}; /* EQUATORIAL GUINEA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_200[] = {2,0x1F1EA,0x1F1F7}; /* ERITREA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_201[] = {2,0x1F1EA,0x1F1EA}; /* ESTONIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_202[] = {2,0x1F1EA,0x1F1F9}; /* ETHIOPIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_203[] = {2,0x1F1EA,0x1F1FA}; /* EUROPEAN UNION */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_204[] = {5,0x1F441,0xFE0F,0x200D,0x1F5E8,0xFE0F}; /* EYE IN SPEECH BUBBLE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_205[] = {2,0x1F9DA,0x1F3FF}; /* FAIRY: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_206[] = {2,0x1F9DA,0x1F3FB}; /* FAIRY: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_207[] = {2,0x1F9DA,0x1F3FD}; /* FAIRY: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_208[] = {2,0x1F9DA,0x1F3FE}; /* FAIRY: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_209[] = {2,0x1F9DA,0x1F3FC}; /* FAIRY: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_210[] = {2,0x1F1EB,0x1F1F0}; /* FALKLAND ISLANDS */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_211[] = {3,0x1F468,0x200D,0x1F466}; /* FAMILY: MAN BOY */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_212[] = {5,0x1F468,0x200D,0x1F466,0x200D,0x1F466}; /* FAMILY: MAN BOY BOY */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_213[] = {3,0x1F468,0x200D,0x1F467}; /* FAMILY: MAN GIRL */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_214[] = {5,0x1F468,0x200D,0x1F467,0x200D,0x1F466}; /* FAMILY: MAN GIRL BOY */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_215[] = {5,0x1F468,0x200D,0x1F467,0x200D,0x1F467}; /* FAMILY: MAN GIRL GIRL */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_216[] = {5,0x1F468,0x200D,0x1F468,0x200D,0x1F466}; /* FAMILY: MAN MAN BOY */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_217[] = {7,0x1F468,0x200D,0x1F468,0x200D,0x1F466,0x200D,0x1F466}; /* FAMILY: MAN MAN BOY BOY */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_218[] = {5,0x1F468,0x200D,0x1F468,0x200D,0x1F467}; /* FAMILY: MAN MAN GIRL */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_219[] = {7,0x1F468,0x200D,0x1F468,0x200D,0x1F467,0x200D,0x1F466}; /* FAMILY: MAN MAN GIRL BOY */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_220[] = {7,0x1F468,0x200D,0x1F468,0x200D,0x1F467,0x200D,0x1F467}; /* FAMILY: MAN MAN GIRL GIRL */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_221[] = {5,0x1F468,0x200D,0x1F469,0x200D,0x1F466}; /* FAMILY: MAN WOMAN BOY */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_222[] = {7,0x1F468,0x200D,0x1F469,0x200D,0x1F466,0x200D,0x1F466}; /* FAMILY: MAN WOMAN BOY BOY */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_223[] = {5,0x1F468,0x200D,0x1F469,0x200D,0x1F467}; /* FAMILY: MAN WOMAN GIRL */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_224[] = {7,0x1F468,0x200D,0x1F469,0x200D,0x1F467,0x200D,0x1F466}; /* FAMILY: MAN WOMAN GIRL BOY */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_225[] = {7,0x1F468,0x200D,0x1F469,0x200D,0x1F467,0x200D,0x1F467}; /* FAMILY: MAN WOMAN GIRL GIRL */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_226[] = {3,0x1F469,0x200D,0x1F466}; /* FAMILY: WOMAN BOY */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_227[] = {5,0x1F469,0x200D,0x1F466,0x200D,0x1F466}; /* FAMILY: WOMAN BOY BOY */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_228[] = {3,0x1F469,0x200D,0x1F467}; /* FAMILY: WOMAN GIRL */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_229[] = {5,0x1F469,0x200D,0x1F467,0x200D,0x1F466}; /* FAMILY: WOMAN GIRL BOY */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_230[] = {5,0x1F469,0x200D,0x1F467,0x200D,0x1F467}; /* FAMILY: WOMAN GIRL GIRL */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_231[] = {5,0x1F469,0x200D,0x1F469,0x200D,0x1F466}; /* FAMILY: WOMAN WOMAN BOY */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_232[] = {7,0x1F469,0x200D,0x1F469,0x200D,0x1F466,0x200D,0x1F466}; /* FAMILY: WOMAN WOMAN BOY BOY */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_233[] = {5,0x1F469,0x200D,0x1F469,0x200D,0x1F467}; /* FAMILY: WOMAN WOMAN GIRL */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_234[] = {7,0x1F469,0x200D,0x1F469,0x200D,0x1F467,0x200D,0x1F466}; /* FAMILY: WOMAN WOMAN GIRL BOY */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_235[] = {7,0x1F469,0x200D,0x1F469,0x200D,0x1F467,0x200D,0x1F467}; /* FAMILY: WOMAN WOMAN GIRL GIRL */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_236[] = {2,0x1F1EB,0x1F1F4}; /* FAROE ISLANDS */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_237[] = {2,0x1F1EB,0x1F1EF}; /* FIJI */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_238[] = {2,0x1F1EB,0x1F1EE}; /* FINLAND */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_239[] = {2,0x1F4AA,0x1F3FF}; /* FLEXED BICEPS: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_240[] = {2,0x1F4AA,0x1F3FB}; /* FLEXED BICEPS: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_241[] = {2,0x1F4AA,0x1F3FD}; /* FLEXED BICEPS: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_242[] = {2,0x1F4AA,0x1F3FE}; /* FLEXED BICEPS: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_243[] = {2,0x1F4AA,0x1F3FC}; /* FLEXED BICEPS: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_244[] = {2,0x1F64F,0x1F3FF}; /* FOLDED HANDS: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_245[] = {2,0x1F64F,0x1F3FB}; /* FOLDED HANDS: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_246[] = {2,0x1F64F,0x1F3FD}; /* FOLDED HANDS: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_247[] = {2,0x1F64F,0x1F3FE}; /* FOLDED HANDS: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_248[] = {2,0x1F64F,0x1F3FC}; /* FOLDED HANDS: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_249[] = {2,0x1F1EB,0x1F1F7}; /* FRANCE */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_250[] = {2,0x1F1EC,0x1F1EB}; /* FRENCH GUIANA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_251[] = {2,0x1F1F5,0x1F1EB}; /* FRENCH POLYNESIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_252[] = {2,0x1F1F9,0x1F1EB}; /* FRENCH SOUTHERN TERRITORIES */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_253[] = {2,0x1F1EC,0x1F1E6}; /* GABON */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_254[] = {2,0x1F1EC,0x1F1F2}; /* GAMBIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_255[] = {2,0x1F1EC,0x1F1EA}; /* GEORGIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_256[] = {2,0x10E3,0x302}; /* GEORGIAN LETTER U-BRJGU */ /*NamedSequences */ static const MVMint32 uni_seq_257[] = {2,0x1F1E9,0x1F1EA}; /* GERMANY */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_258[] = {2,0x1F1EC,0x1F1ED}; /* GHANA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_259[] = {2,0x1F1EC,0x1F1EE}; /* GIBRALTAR */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_260[] = {2,0x1F467,0x1F3FF}; /* GIRL: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_261[] = {2,0x1F467,0x1F3FB}; /* GIRL: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_262[] = {2,0x1F467,0x1F3FD}; /* GIRL: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_263[] = {2,0x1F467,0x1F3FE}; /* GIRL: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_264[] = {2,0x1F467,0x1F3FC}; /* GIRL: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_265[] = {2,0x1F1EC,0x1F1F7}; /* GREECE */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_266[] = {2,0x1F1EC,0x1F1F1}; /* GREENLAND */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_267[] = {2,0x1F1EC,0x1F1E9}; /* GRENADA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_268[] = {2,0x1F1EC,0x1F1F5}; /* GUADELOUPE */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_269[] = {2,0x1F1EC,0x1F1FA}; /* GUAM */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_270[] = {2,0x1F482,0x1F3FF}; /* GUARD: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_271[] = {2,0x1F482,0x1F3FB}; /* GUARD: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_272[] = {2,0x1F482,0x1F3FD}; /* GUARD: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_273[] = {2,0x1F482,0x1F3FE}; /* GUARD: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_274[] = {2,0x1F482,0x1F3FC}; /* GUARD: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_275[] = {2,0x1F1EC,0x1F1F9}; /* GUATEMALA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_276[] = {2,0x1F1EC,0x1F1EC}; /* GUERNSEY */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_277[] = {2,0x1F1EC,0x1F1F3}; /* GUINEA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_278[] = {2,0x1F1EC,0x1F1FC}; /* GUINEA-BISSAU */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_279[] = {2,0x1F1EC,0x1F1FE}; /* GUYANA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_280[] = {2,0x1F1ED,0x1F1F9}; /* HAITI */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_281[] = {2,0x1F590,0x1F3FF}; /* HAND WITH FINGERS SPLAYED: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_282[] = {2,0x1F590,0x1F3FB}; /* HAND WITH FINGERS SPLAYED: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_283[] = {2,0x1F590,0x1F3FD}; /* HAND WITH FINGERS SPLAYED: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_284[] = {2,0x1F590,0x1F3FE}; /* HAND WITH FINGERS SPLAYED: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_285[] = {2,0x1F590,0x1F3FC}; /* HAND WITH FINGERS SPLAYED: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_286[] = {2,0x1F1ED,0x1F1F2}; /* HEARD & MCDONALD ISLANDS */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_287[] = {2,0x304B,0x309A}; /* HIRAGANA LETTER BIDAKUON NGA */ /*NamedSequences */ static const MVMint32 uni_seq_288[] = {2,0x3051,0x309A}; /* HIRAGANA LETTER BIDAKUON NGE */ /*NamedSequences */ static const MVMint32 uni_seq_289[] = {2,0x304D,0x309A}; /* HIRAGANA LETTER BIDAKUON NGI */ /*NamedSequences */ static const MVMint32 uni_seq_290[] = {2,0x3053,0x309A}; /* HIRAGANA LETTER BIDAKUON NGO */ /*NamedSequences */ static const MVMint32 uni_seq_291[] = {2,0x304F,0x309A}; /* HIRAGANA LETTER BIDAKUON NGU */ /*NamedSequences */ static const MVMint32 uni_seq_292[] = {2,0x1F1ED,0x1F1F3}; /* HONDURAS */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_293[] = {2,0x1F1ED,0x1F1F0}; /* HONG KONG SAR CHINA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_294[] = {2,0x1F3C7,0x1F3FF}; /* HORSE RACING: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_295[] = {2,0x1F3C7,0x1F3FB}; /* HORSE RACING: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_296[] = {2,0x1F3C7,0x1F3FD}; /* HORSE RACING: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_297[] = {2,0x1F3C7,0x1F3FE}; /* HORSE RACING: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_298[] = {2,0x1F3C7,0x1F3FC}; /* HORSE RACING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_299[] = {2,0x1F1ED,0x1F1FA}; /* HUNGARY */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_300[] = {2,0x1F1EE,0x1F1F8}; /* ICELAND */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_301[] = {2,0x261D,0x1F3FF}; /* INDEX POINTING UP: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_302[] = {2,0x261D,0x1F3FB}; /* INDEX POINTING UP: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_303[] = {2,0x261D,0x1F3FD}; /* INDEX POINTING UP: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_304[] = {2,0x261D,0x1F3FE}; /* INDEX POINTING UP: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_305[] = {2,0x261D,0x1F3FC}; /* INDEX POINTING UP: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_306[] = {2,0x1F1EE,0x1F1F3}; /* INDIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_307[] = {2,0x1F1EE,0x1F1E9}; /* INDONESIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_308[] = {2,0x1F1EE,0x1F1F7}; /* IRAN */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_309[] = {2,0x1F1EE,0x1F1F6}; /* IRAQ */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_310[] = {2,0x1F1EE,0x1F1EA}; /* IRELAND */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_311[] = {2,0x1F1EE,0x1F1F2}; /* ISLE OF MAN */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_312[] = {2,0x1F1EE,0x1F1F1}; /* ISRAEL */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_313[] = {2,0x1F1EE,0x1F1F9}; /* ITALY */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_314[] = {2,0x1F1EF,0x1F1F2}; /* JAMAICA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_315[] = {2,0x1F1EF,0x1F1F5}; /* JAPAN */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_316[] = {2,0x1F1EF,0x1F1EA}; /* JERSEY */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_317[] = {2,0x1F1EF,0x1F1F4}; /* JORDAN */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_318[] = {2,0x30BB,0x309A}; /* KATAKANA LETTER AINU CE */ /*NamedSequences */ static const MVMint32 uni_seq_319[] = {2,0x31F7,0x309A}; /* KATAKANA LETTER AINU P */ /*NamedSequences */ static const MVMint32 uni_seq_320[] = {2,0x30C8,0x309A}; /* KATAKANA LETTER AINU TO */ /*NamedSequences */ static const MVMint32 uni_seq_321[] = {2,0x30C4,0x309A}; /* KATAKANA LETTER AINU TU */ /*NamedSequences */ static const MVMint32 uni_seq_322[] = {2,0x30AB,0x309A}; /* KATAKANA LETTER BIDAKUON NGA */ /*NamedSequences */ static const MVMint32 uni_seq_323[] = {2,0x30B1,0x309A}; /* KATAKANA LETTER BIDAKUON NGE */ /*NamedSequences */ static const MVMint32 uni_seq_324[] = {2,0x30AD,0x309A}; /* KATAKANA LETTER BIDAKUON NGI */ /*NamedSequences */ static const MVMint32 uni_seq_325[] = {2,0x30B3,0x309A}; /* KATAKANA LETTER BIDAKUON NGO */ /*NamedSequences */ static const MVMint32 uni_seq_326[] = {2,0x30AF,0x309A}; /* KATAKANA LETTER BIDAKUON NGU */ /*NamedSequences */ static const MVMint32 uni_seq_327[] = {2,0x1F1F0,0x1F1FF}; /* KAZAKHSTAN */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_328[] = {2,0x1F1F0,0x1F1EA}; /* KENYA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_329[] = {3,0x2A,0xFE0F,0x20E3}; /* KEYCAP ASTERISK */ /*NamedSequences */ static const MVMint32 uni_seq_330[] = {3,0x38,0xFE0F,0x20E3}; /* KEYCAP DIGIT EIGHT */ /*NamedSequences */ static const MVMint32 uni_seq_331[] = {3,0x35,0xFE0F,0x20E3}; /* KEYCAP DIGIT FIVE */ /*NamedSequences */ static const MVMint32 uni_seq_332[] = {3,0x34,0xFE0F,0x20E3}; /* KEYCAP DIGIT FOUR */ /*NamedSequences */ static const MVMint32 uni_seq_333[] = {3,0x39,0xFE0F,0x20E3}; /* KEYCAP DIGIT NINE */ /*NamedSequences */ static const MVMint32 uni_seq_334[] = {3,0x31,0xFE0F,0x20E3}; /* KEYCAP DIGIT ONE */ /*NamedSequences */ static const MVMint32 uni_seq_335[] = {3,0x37,0xFE0F,0x20E3}; /* KEYCAP DIGIT SEVEN */ /*NamedSequences */ static const MVMint32 uni_seq_336[] = {3,0x36,0xFE0F,0x20E3}; /* KEYCAP DIGIT SIX */ /*NamedSequences */ static const MVMint32 uni_seq_337[] = {3,0x33,0xFE0F,0x20E3}; /* KEYCAP DIGIT THREE */ /*NamedSequences */ static const MVMint32 uni_seq_338[] = {3,0x32,0xFE0F,0x20E3}; /* KEYCAP DIGIT TWO */ /*NamedSequences */ static const MVMint32 uni_seq_339[] = {3,0x30,0xFE0F,0x20E3}; /* KEYCAP DIGIT ZERO */ /*NamedSequences */ static const MVMint32 uni_seq_340[] = {3,0x23,0xFE0F,0x20E3}; /* KEYCAP NUMBER SIGN */ /*NamedSequences */ static const MVMint32 uni_seq_341[] = {3,0x23,0xFE0F,0x20E3}; /* KEYCAP: # */ /*Emoji_Combining_Sequence */ static const MVMint32 uni_seq_342[] = {3,0x2A,0xFE0F,0x20E3}; /* KEYCAP: * */ /*Emoji_Combining_Sequence */ static const MVMint32 uni_seq_343[] = {3,0x30,0xFE0F,0x20E3}; /* KEYCAP: 0 */ /*Emoji_Combining_Sequence */ static const MVMint32 uni_seq_344[] = {3,0x31,0xFE0F,0x20E3}; /* KEYCAP: 1 */ /*Emoji_Combining_Sequence */ static const MVMint32 uni_seq_345[] = {3,0x32,0xFE0F,0x20E3}; /* KEYCAP: 2 */ /*Emoji_Combining_Sequence */ static const MVMint32 uni_seq_346[] = {3,0x33,0xFE0F,0x20E3}; /* KEYCAP: 3 */ /*Emoji_Combining_Sequence */ static const MVMint32 uni_seq_347[] = {3,0x34,0xFE0F,0x20E3}; /* KEYCAP: 4 */ /*Emoji_Combining_Sequence */ static const MVMint32 uni_seq_348[] = {3,0x35,0xFE0F,0x20E3}; /* KEYCAP: 5 */ /*Emoji_Combining_Sequence */ static const MVMint32 uni_seq_349[] = {3,0x36,0xFE0F,0x20E3}; /* KEYCAP: 6 */ /*Emoji_Combining_Sequence */ static const MVMint32 uni_seq_350[] = {3,0x37,0xFE0F,0x20E3}; /* KEYCAP: 7 */ /*Emoji_Combining_Sequence */ static const MVMint32 uni_seq_351[] = {3,0x38,0xFE0F,0x20E3}; /* KEYCAP: 8 */ /*Emoji_Combining_Sequence */ static const MVMint32 uni_seq_352[] = {3,0x39,0xFE0F,0x20E3}; /* KEYCAP: 9 */ /*Emoji_Combining_Sequence */ static const MVMint32 uni_seq_353[] = {2,0x17D2,0x1794}; /* KHMER CONSONANT SIGN COENG BA */ /*NamedSequences */ static const MVMint32 uni_seq_354[] = {2,0x17D2,0x1785}; /* KHMER CONSONANT SIGN COENG CA */ /*NamedSequences */ static const MVMint32 uni_seq_355[] = {2,0x17D2,0x1786}; /* KHMER CONSONANT SIGN COENG CHA */ /*NamedSequences */ static const MVMint32 uni_seq_356[] = {2,0x17D2,0x1788}; /* KHMER CONSONANT SIGN COENG CHO */ /*NamedSequences */ static const MVMint32 uni_seq_357[] = {2,0x17D2,0x1787}; /* KHMER CONSONANT SIGN COENG CO */ /*NamedSequences */ static const MVMint32 uni_seq_358[] = {2,0x17D2,0x178A}; /* KHMER CONSONANT SIGN COENG DA */ /*NamedSequences */ static const MVMint32 uni_seq_359[] = {2,0x17D2,0x178C}; /* KHMER CONSONANT SIGN COENG DO */ /*NamedSequences */ static const MVMint32 uni_seq_360[] = {2,0x17D2,0x17A0}; /* KHMER CONSONANT SIGN COENG HA */ /*NamedSequences */ static const MVMint32 uni_seq_361[] = {2,0x17D2,0x1780}; /* KHMER CONSONANT SIGN COENG KA */ /*NamedSequences */ static const MVMint32 uni_seq_362[] = {2,0x17D2,0x1781}; /* KHMER CONSONANT SIGN COENG KHA */ /*NamedSequences */ static const MVMint32 uni_seq_363[] = {2,0x17D2,0x1783}; /* KHMER CONSONANT SIGN COENG KHO */ /*NamedSequences */ static const MVMint32 uni_seq_364[] = {2,0x17D2,0x1782}; /* KHMER CONSONANT SIGN COENG KO */ /*NamedSequences */ static const MVMint32 uni_seq_365[] = {2,0x17D2,0x17A1}; /* KHMER CONSONANT SIGN COENG LA */ /*NamedSequences */ static const MVMint32 uni_seq_366[] = {2,0x17D2,0x179B}; /* KHMER CONSONANT SIGN COENG LO */ /*NamedSequences */ static const MVMint32 uni_seq_367[] = {2,0x17D2,0x1798}; /* KHMER CONSONANT SIGN COENG MO */ /*NamedSequences */ static const MVMint32 uni_seq_368[] = {2,0x17D2,0x178E}; /* KHMER CONSONANT SIGN COENG NA */ /*NamedSequences */ static const MVMint32 uni_seq_369[] = {2,0x17D2,0x1784}; /* KHMER CONSONANT SIGN COENG NGO */ /*NamedSequences */ static const MVMint32 uni_seq_370[] = {2,0x17D2,0x1793}; /* KHMER CONSONANT SIGN COENG NO */ /*NamedSequences */ static const MVMint32 uni_seq_371[] = {2,0x17D2,0x1789}; /* KHMER CONSONANT SIGN COENG NYO */ /*NamedSequences */ static const MVMint32 uni_seq_372[] = {2,0x17D2,0x1795}; /* KHMER CONSONANT SIGN COENG PHA */ /*NamedSequences */ static const MVMint32 uni_seq_373[] = {2,0x17D2,0x1797}; /* KHMER CONSONANT SIGN COENG PHO */ /*NamedSequences */ static const MVMint32 uni_seq_374[] = {2,0x17D2,0x1796}; /* KHMER CONSONANT SIGN COENG PO */ /*NamedSequences */ static const MVMint32 uni_seq_375[] = {2,0x17D2,0x179A}; /* KHMER CONSONANT SIGN COENG RO */ /*NamedSequences */ static const MVMint32 uni_seq_376[] = {2,0x17D2,0x179F}; /* KHMER CONSONANT SIGN COENG SA */ /*NamedSequences */ static const MVMint32 uni_seq_377[] = {2,0x17D2,0x179D}; /* KHMER CONSONANT SIGN COENG SHA */ /*NamedSequences */ static const MVMint32 uni_seq_378[] = {2,0x17D2,0x179E}; /* KHMER CONSONANT SIGN COENG SSA */ /*NamedSequences */ static const MVMint32 uni_seq_379[] = {2,0x17D2,0x178F}; /* KHMER CONSONANT SIGN COENG TA */ /*NamedSequences */ static const MVMint32 uni_seq_380[] = {2,0x17D2,0x1790}; /* KHMER CONSONANT SIGN COENG THA */ /*NamedSequences */ static const MVMint32 uni_seq_381[] = {2,0x17D2,0x1792}; /* KHMER CONSONANT SIGN COENG THO */ /*NamedSequences */ static const MVMint32 uni_seq_382[] = {2,0x17D2,0x1791}; /* KHMER CONSONANT SIGN COENG TO */ /*NamedSequences */ static const MVMint32 uni_seq_383[] = {2,0x17D2,0x178B}; /* KHMER CONSONANT SIGN COENG TTHA */ /*NamedSequences */ static const MVMint32 uni_seq_384[] = {2,0x17D2,0x178D}; /* KHMER CONSONANT SIGN COENG TTHO */ /*NamedSequences */ static const MVMint32 uni_seq_385[] = {2,0x17D2,0x179C}; /* KHMER CONSONANT SIGN COENG VO */ /*NamedSequences */ static const MVMint32 uni_seq_386[] = {2,0x17D2,0x1799}; /* KHMER CONSONANT SIGN COENG YO */ /*NamedSequences */ static const MVMint32 uni_seq_387[] = {2,0x17D2,0x17AF}; /* KHMER INDEPENDENT VOWEL SIGN COENG QE */ /*NamedSequences */ static const MVMint32 uni_seq_388[] = {2,0x17D2,0x17A7}; /* KHMER INDEPENDENT VOWEL SIGN COENG QU */ /*NamedSequences */ static const MVMint32 uni_seq_389[] = {2,0x17D2,0x17AB}; /* KHMER INDEPENDENT VOWEL SIGN COENG RY */ /*NamedSequences */ static const MVMint32 uni_seq_390[] = {2,0x17D2,0x17AC}; /* KHMER INDEPENDENT VOWEL SIGN COENG RYY */ /*NamedSequences */ static const MVMint32 uni_seq_391[] = {2,0x17B6,0x17C6}; /* KHMER VOWEL SIGN AAM */ /*NamedSequences */ static const MVMint32 uni_seq_392[] = {2,0x17D2,0x17A2}; /* KHMER VOWEL SIGN COENG QA */ /*NamedSequences */ static const MVMint32 uni_seq_393[] = {2,0x17BB,0x17C6}; /* KHMER VOWEL SIGN OM */ /*NamedSequences */ static const MVMint32 uni_seq_394[] = {2,0x1F1F0,0x1F1EE}; /* KIRIBATI */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_395[] = {8,0x1F468,0x200D,0x2764,0xFE0F,0x200D,0x1F48B,0x200D,0x1F468}; /* KISS: MAN MAN */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_396[] = {8,0x1F469,0x200D,0x2764,0xFE0F,0x200D,0x1F48B,0x200D,0x1F468}; /* KISS: WOMAN MAN */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_397[] = {8,0x1F469,0x200D,0x2764,0xFE0F,0x200D,0x1F48B,0x200D,0x1F469}; /* KISS: WOMAN WOMAN */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_398[] = {2,0x1F1FD,0x1F1F0}; /* KOSOVO */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_399[] = {2,0x1F1F0,0x1F1FC}; /* KUWAIT */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_400[] = {2,0x1F1F0,0x1F1EC}; /* KYRGYZSTAN */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_401[] = {2,0x1F1F1,0x1F1E6}; /* LAOS */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_402[] = {2,0x100,0x300}; /* LATIN CAPITAL LETTER A WITH MACRON AND GRAVE */ /*NamedSequences */ static const MVMint32 uni_seq_403[] = {2,0x104,0x301}; /* LATIN CAPITAL LETTER A WITH OGONEK AND ACUTE */ /*NamedSequences */ static const MVMint32 uni_seq_404[] = {2,0x104,0x303}; /* LATIN CAPITAL LETTER A WITH OGONEK AND TILDE */ /*NamedSequences */ static const MVMint32 uni_seq_405[] = {2,0xCA,0x30C}; /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND CARON */ /*NamedSequences */ static const MVMint32 uni_seq_406[] = {2,0xCA,0x304}; /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND MACRON */ /*NamedSequences */ static const MVMint32 uni_seq_407[] = {2,0x116,0x301}; /* LATIN CAPITAL LETTER E WITH DOT ABOVE AND ACUTE */ /*NamedSequences */ static const MVMint32 uni_seq_408[] = {2,0x116,0x303}; /* LATIN CAPITAL LETTER E WITH DOT ABOVE AND TILDE */ /*NamedSequences */ static const MVMint32 uni_seq_409[] = {2,0x118,0x301}; /* LATIN CAPITAL LETTER E WITH OGONEK AND ACUTE */ /*NamedSequences */ static const MVMint32 uni_seq_410[] = {2,0x118,0x303}; /* LATIN CAPITAL LETTER E WITH OGONEK AND TILDE */ /*NamedSequences */ static const MVMint32 uni_seq_411[] = {2,0x45,0x329}; /* LATIN CAPITAL LETTER E WITH VERTICAL LINE BELOW */ /*NamedSequences */ static const MVMint32 uni_seq_412[] = {2,0xC9,0x329}; /* LATIN CAPITAL LETTER E WITH VERTICAL LINE BELOW AND ACUTE */ /*NamedSequences */ static const MVMint32 uni_seq_413[] = {2,0xC8,0x329}; /* LATIN CAPITAL LETTER E WITH VERTICAL LINE BELOW AND GRAVE */ /*NamedSequences */ static const MVMint32 uni_seq_414[] = {2,0x12A,0x300}; /* LATIN CAPITAL LETTER I WITH MACRON AND GRAVE */ /*NamedSequences */ static const MVMint32 uni_seq_415[] = {2,0x12E,0x301}; /* LATIN CAPITAL LETTER I WITH OGONEK AND ACUTE */ /*NamedSequences */ static const MVMint32 uni_seq_416[] = {2,0x12E,0x303}; /* LATIN CAPITAL LETTER I WITH OGONEK AND TILDE */ /*NamedSequences */ static const MVMint32 uni_seq_417[] = {2,0x4A,0x303}; /* LATIN CAPITAL LETTER J WITH TILDE */ /*NamedSequences */ static const MVMint32 uni_seq_418[] = {2,0x4C,0x303}; /* LATIN CAPITAL LETTER L WITH TILDE */ /*NamedSequences */ static const MVMint32 uni_seq_419[] = {2,0x4D,0x303}; /* LATIN CAPITAL LETTER M WITH TILDE */ /*NamedSequences */ static const MVMint32 uni_seq_420[] = {2,0x4F,0x329}; /* LATIN CAPITAL LETTER O WITH VERTICAL LINE BELOW */ /*NamedSequences */ static const MVMint32 uni_seq_421[] = {2,0xD3,0x329}; /* LATIN CAPITAL LETTER O WITH VERTICAL LINE BELOW AND ACUTE */ /*NamedSequences */ static const MVMint32 uni_seq_422[] = {2,0xD2,0x329}; /* LATIN CAPITAL LETTER O WITH VERTICAL LINE BELOW AND GRAVE */ /*NamedSequences */ static const MVMint32 uni_seq_423[] = {2,0x52,0x303}; /* LATIN CAPITAL LETTER R WITH TILDE */ /*NamedSequences */ static const MVMint32 uni_seq_424[] = {2,0x53,0x329}; /* LATIN CAPITAL LETTER S WITH VERTICAL LINE BELOW */ /*NamedSequences */ static const MVMint32 uni_seq_425[] = {2,0x16A,0x301}; /* LATIN CAPITAL LETTER U WITH MACRON AND ACUTE */ /*NamedSequences */ static const MVMint32 uni_seq_426[] = {2,0x16A,0x300}; /* LATIN CAPITAL LETTER U WITH MACRON AND GRAVE */ /*NamedSequences */ static const MVMint32 uni_seq_427[] = {2,0x16A,0x303}; /* LATIN CAPITAL LETTER U WITH MACRON AND TILDE */ /*NamedSequences */ static const MVMint32 uni_seq_428[] = {2,0x172,0x301}; /* LATIN CAPITAL LETTER U WITH OGONEK AND ACUTE */ /*NamedSequences */ static const MVMint32 uni_seq_429[] = {2,0x172,0x303}; /* LATIN CAPITAL LETTER U WITH OGONEK AND TILDE */ /*NamedSequences */ static const MVMint32 uni_seq_430[] = {2,0x101,0x300}; /* LATIN SMALL LETTER A WITH MACRON AND GRAVE */ /*NamedSequences */ static const MVMint32 uni_seq_431[] = {2,0x105,0x301}; /* LATIN SMALL LETTER A WITH OGONEK AND ACUTE */ /*NamedSequences */ static const MVMint32 uni_seq_432[] = {2,0x105,0x303}; /* LATIN SMALL LETTER A WITH OGONEK AND TILDE */ /*NamedSequences */ static const MVMint32 uni_seq_433[] = {2,0xE6,0x300}; /* LATIN SMALL LETTER AE WITH GRAVE */ /*NamedSequences */ static const MVMint32 uni_seq_434[] = {2,0xEA,0x30C}; /* LATIN SMALL LETTER E WITH CIRCUMFLEX AND CARON */ /*NamedSequences */ static const MVMint32 uni_seq_435[] = {2,0xEA,0x304}; /* LATIN SMALL LETTER E WITH CIRCUMFLEX AND MACRON */ /*NamedSequences */ static const MVMint32 uni_seq_436[] = {2,0x117,0x301}; /* LATIN SMALL LETTER E WITH DOT ABOVE AND ACUTE */ /*NamedSequences */ static const MVMint32 uni_seq_437[] = {2,0x117,0x303}; /* LATIN SMALL LETTER E WITH DOT ABOVE AND TILDE */ /*NamedSequences */ static const MVMint32 uni_seq_438[] = {2,0x119,0x301}; /* LATIN SMALL LETTER E WITH OGONEK AND ACUTE */ /*NamedSequences */ static const MVMint32 uni_seq_439[] = {2,0x119,0x303}; /* LATIN SMALL LETTER E WITH OGONEK AND TILDE */ /*NamedSequences */ static const MVMint32 uni_seq_440[] = {2,0x65,0x329}; /* LATIN SMALL LETTER E WITH VERTICAL LINE BELOW */ /*NamedSequences */ static const MVMint32 uni_seq_441[] = {2,0xE9,0x329}; /* LATIN SMALL LETTER E WITH VERTICAL LINE BELOW AND ACUTE */ /*NamedSequences */ static const MVMint32 uni_seq_442[] = {2,0xE8,0x329}; /* LATIN SMALL LETTER E WITH VERTICAL LINE BELOW AND GRAVE */ /*NamedSequences */ static const MVMint32 uni_seq_443[] = {2,0x25A,0x301}; /* LATIN SMALL LETTER HOOKED SCHWA WITH ACUTE */ /*NamedSequences */ static const MVMint32 uni_seq_444[] = {2,0x25A,0x300}; /* LATIN SMALL LETTER HOOKED SCHWA WITH GRAVE */ /*NamedSequences */ static const MVMint32 uni_seq_445[] = {3,0x69,0x307,0x301}; /* LATIN SMALL LETTER I WITH DOT ABOVE AND ACUTE */ /*NamedSequences */ static const MVMint32 uni_seq_446[] = {3,0x69,0x307,0x300}; /* LATIN SMALL LETTER I WITH DOT ABOVE AND GRAVE */ /*NamedSequences */ static const MVMint32 uni_seq_447[] = {3,0x69,0x307,0x303}; /* LATIN SMALL LETTER I WITH DOT ABOVE AND TILDE */ /*NamedSequences */ static const MVMint32 uni_seq_448[] = {2,0x12B,0x300}; /* LATIN SMALL LETTER I WITH MACRON AND GRAVE */ /*NamedSequences */ static const MVMint32 uni_seq_449[] = {3,0x12F,0x307,0x301}; /* LATIN SMALL LETTER I WITH OGONEK AND DOT ABOVE AND ACUTE */ /*NamedSequences */ static const MVMint32 uni_seq_450[] = {3,0x12F,0x307,0x303}; /* LATIN SMALL LETTER I WITH OGONEK AND DOT ABOVE AND TILDE */ /*NamedSequences */ static const MVMint32 uni_seq_451[] = {3,0x6A,0x307,0x303}; /* LATIN SMALL LETTER J WITH DOT ABOVE AND TILDE */ /*NamedSequences */ static const MVMint32 uni_seq_452[] = {2,0x6C,0x303}; /* LATIN SMALL LETTER L WITH TILDE */ /*NamedSequences */ static const MVMint32 uni_seq_453[] = {2,0x6D,0x303}; /* LATIN SMALL LETTER M WITH TILDE */ /*NamedSequences */ static const MVMint32 uni_seq_454[] = {3,0x6E,0x360,0x67}; /* LATIN SMALL LETTER NG WITH TILDE ABOVE */ /*NamedSequences */ static const MVMint32 uni_seq_455[] = {2,0x6F,0x329}; /* LATIN SMALL LETTER O WITH VERTICAL LINE BELOW */ /*NamedSequences */ static const MVMint32 uni_seq_456[] = {2,0xF3,0x329}; /* LATIN SMALL LETTER O WITH VERTICAL LINE BELOW AND ACUTE */ /*NamedSequences */ static const MVMint32 uni_seq_457[] = {2,0xF2,0x329}; /* LATIN SMALL LETTER O WITH VERTICAL LINE BELOW AND GRAVE */ /*NamedSequences */ static const MVMint32 uni_seq_458[] = {2,0x254,0x301}; /* LATIN SMALL LETTER OPEN O WITH ACUTE */ /*NamedSequences */ static const MVMint32 uni_seq_459[] = {2,0x254,0x300}; /* LATIN SMALL LETTER OPEN O WITH GRAVE */ /*NamedSequences */ static const MVMint32 uni_seq_460[] = {2,0x72,0x303}; /* LATIN SMALL LETTER R WITH TILDE */ /*NamedSequences */ static const MVMint32 uni_seq_461[] = {2,0x73,0x329}; /* LATIN SMALL LETTER S WITH VERTICAL LINE BELOW */ /*NamedSequences */ static const MVMint32 uni_seq_462[] = {2,0x259,0x301}; /* LATIN SMALL LETTER SCHWA WITH ACUTE */ /*NamedSequences */ static const MVMint32 uni_seq_463[] = {2,0x259,0x300}; /* LATIN SMALL LETTER SCHWA WITH GRAVE */ /*NamedSequences */ static const MVMint32 uni_seq_464[] = {2,0x28C,0x301}; /* LATIN SMALL LETTER TURNED V WITH ACUTE */ /*NamedSequences */ static const MVMint32 uni_seq_465[] = {2,0x28C,0x300}; /* LATIN SMALL LETTER TURNED V WITH GRAVE */ /*NamedSequences */ static const MVMint32 uni_seq_466[] = {2,0x16B,0x301}; /* LATIN SMALL LETTER U WITH MACRON AND ACUTE */ /*NamedSequences */ static const MVMint32 uni_seq_467[] = {2,0x16B,0x300}; /* LATIN SMALL LETTER U WITH MACRON AND GRAVE */ /*NamedSequences */ static const MVMint32 uni_seq_468[] = {2,0x16B,0x303}; /* LATIN SMALL LETTER U WITH MACRON AND TILDE */ /*NamedSequences */ static const MVMint32 uni_seq_469[] = {2,0x173,0x301}; /* LATIN SMALL LETTER U WITH OGONEK AND ACUTE */ /*NamedSequences */ static const MVMint32 uni_seq_470[] = {2,0x173,0x303}; /* LATIN SMALL LETTER U WITH OGONEK AND TILDE */ /*NamedSequences */ static const MVMint32 uni_seq_471[] = {2,0x1F1F1,0x1F1FB}; /* LATVIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_472[] = {2,0x1F1F1,0x1F1E7}; /* LEBANON */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_473[] = {2,0x1F91B,0x1F3FF}; /* LEFT-FACING FIST: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_474[] = {2,0x1F91B,0x1F3FB}; /* LEFT-FACING FIST: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_475[] = {2,0x1F91B,0x1F3FD}; /* LEFT-FACING FIST: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_476[] = {2,0x1F91B,0x1F3FE}; /* LEFT-FACING FIST: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_477[] = {2,0x1F91B,0x1F3FC}; /* LEFT-FACING FIST: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_478[] = {2,0x1F1F1,0x1F1F8}; /* LESOTHO */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_479[] = {2,0x1F1F1,0x1F1F7}; /* LIBERIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_480[] = {2,0x1F1F1,0x1F1FE}; /* LIBYA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_481[] = {2,0x1F1F1,0x1F1EE}; /* LIECHTENSTEIN */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_482[] = {2,0x1F1F1,0x1F1F9}; /* LITHUANIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_483[] = {2,0x1F91F,0x1F3FF}; /* LOVE-YOU GESTURE: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_484[] = {2,0x1F91F,0x1F3FB}; /* LOVE-YOU GESTURE: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_485[] = {2,0x1F91F,0x1F3FD}; /* LOVE-YOU GESTURE: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_486[] = {2,0x1F91F,0x1F3FE}; /* LOVE-YOU GESTURE: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_487[] = {2,0x1F91F,0x1F3FC}; /* LOVE-YOU GESTURE: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_488[] = {2,0x1F1F1,0x1F1FA}; /* LUXEMBOURG */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_489[] = {2,0x1F1F2,0x1F1F4}; /* MACAU SAR CHINA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_490[] = {2,0x1F1F2,0x1F1F0}; /* MACEDONIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_491[] = {2,0x1F1F2,0x1F1EC}; /* MADAGASCAR */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_492[] = {2,0x1F9D9,0x1F3FF}; /* MAGE: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_493[] = {2,0x1F9D9,0x1F3FB}; /* MAGE: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_494[] = {2,0x1F9D9,0x1F3FD}; /* MAGE: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_495[] = {2,0x1F9D9,0x1F3FE}; /* MAGE: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_496[] = {2,0x1F9D9,0x1F3FC}; /* MAGE: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_497[] = {2,0x1F1F2,0x1F1FC}; /* MALAWI */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_498[] = {2,0x1F1F2,0x1F1FE}; /* MALAYSIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_499[] = {2,0x1F1F2,0x1F1FB}; /* MALDIVES */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_500[] = {2,0x1F1F2,0x1F1F1}; /* MALI */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_501[] = {2,0x1F1F2,0x1F1F9}; /* MALTA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_502[] = {3,0x1F468,0x200D,0x1F3A8}; /* MAN ARTIST */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_503[] = {4,0x1F468,0x1F3FF,0x200D,0x1F3A8}; /* MAN ARTIST: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_504[] = {4,0x1F468,0x1F3FB,0x200D,0x1F3A8}; /* MAN ARTIST: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_505[] = {4,0x1F468,0x1F3FD,0x200D,0x1F3A8}; /* MAN ARTIST: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_506[] = {4,0x1F468,0x1F3FE,0x200D,0x1F3A8}; /* MAN ARTIST: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_507[] = {4,0x1F468,0x1F3FC,0x200D,0x1F3A8}; /* MAN ARTIST: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_508[] = {3,0x1F468,0x200D,0x1F680}; /* MAN ASTRONAUT */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_509[] = {4,0x1F468,0x1F3FF,0x200D,0x1F680}; /* MAN ASTRONAUT: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_510[] = {4,0x1F468,0x1F3FB,0x200D,0x1F680}; /* MAN ASTRONAUT: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_511[] = {4,0x1F468,0x1F3FD,0x200D,0x1F680}; /* MAN ASTRONAUT: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_512[] = {4,0x1F468,0x1F3FE,0x200D,0x1F680}; /* MAN ASTRONAUT: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_513[] = {4,0x1F468,0x1F3FC,0x200D,0x1F680}; /* MAN ASTRONAUT: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_514[] = {4,0x1F6B4,0x200D,0x2642,0xFE0F}; /* MAN BIKING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_515[] = {5,0x1F6B4,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN BIKING: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_516[] = {5,0x1F6B4,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN BIKING: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_517[] = {5,0x1F6B4,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN BIKING: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_518[] = {5,0x1F6B4,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN BIKING: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_519[] = {5,0x1F6B4,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN BIKING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_520[] = {5,0x26F9,0xFE0F,0x200D,0x2642,0xFE0F}; /* MAN BOUNCING BALL */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_521[] = {5,0x26F9,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN BOUNCING BALL: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_522[] = {5,0x26F9,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN BOUNCING BALL: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_523[] = {5,0x26F9,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN BOUNCING BALL: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_524[] = {5,0x26F9,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN BOUNCING BALL: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_525[] = {5,0x26F9,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN BOUNCING BALL: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_526[] = {4,0x1F647,0x200D,0x2642,0xFE0F}; /* MAN BOWING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_527[] = {5,0x1F647,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN BOWING: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_528[] = {5,0x1F647,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN BOWING: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_529[] = {5,0x1F647,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN BOWING: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_530[] = {5,0x1F647,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN BOWING: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_531[] = {5,0x1F647,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN BOWING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_532[] = {4,0x1F938,0x200D,0x2642,0xFE0F}; /* MAN CARTWHEELING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_533[] = {5,0x1F938,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN CARTWHEELING: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_534[] = {5,0x1F938,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN CARTWHEELING: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_535[] = {5,0x1F938,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN CARTWHEELING: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_536[] = {5,0x1F938,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN CARTWHEELING: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_537[] = {5,0x1F938,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN CARTWHEELING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_538[] = {4,0x1F9D7,0x200D,0x2642,0xFE0F}; /* MAN CLIMBING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_539[] = {5,0x1F9D7,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN CLIMBING: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_540[] = {5,0x1F9D7,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN CLIMBING: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_541[] = {5,0x1F9D7,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN CLIMBING: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_542[] = {5,0x1F9D7,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN CLIMBING: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_543[] = {5,0x1F9D7,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN CLIMBING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_544[] = {4,0x1F477,0x200D,0x2642,0xFE0F}; /* MAN CONSTRUCTION WORKER */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_545[] = {5,0x1F477,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN CONSTRUCTION WORKER: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_546[] = {5,0x1F477,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN CONSTRUCTION WORKER: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_547[] = {5,0x1F477,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN CONSTRUCTION WORKER: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_548[] = {5,0x1F477,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN CONSTRUCTION WORKER: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_549[] = {5,0x1F477,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN CONSTRUCTION WORKER: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_550[] = {3,0x1F468,0x200D,0x1F373}; /* MAN COOK */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_551[] = {4,0x1F468,0x1F3FF,0x200D,0x1F373}; /* MAN COOK: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_552[] = {4,0x1F468,0x1F3FB,0x200D,0x1F373}; /* MAN COOK: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_553[] = {4,0x1F468,0x1F3FD,0x200D,0x1F373}; /* MAN COOK: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_554[] = {4,0x1F468,0x1F3FE,0x200D,0x1F373}; /* MAN COOK: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_555[] = {4,0x1F468,0x1F3FC,0x200D,0x1F373}; /* MAN COOK: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_556[] = {2,0x1F57A,0x1F3FF}; /* MAN DANCING: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_557[] = {2,0x1F57A,0x1F3FB}; /* MAN DANCING: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_558[] = {2,0x1F57A,0x1F3FD}; /* MAN DANCING: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_559[] = {2,0x1F57A,0x1F3FE}; /* MAN DANCING: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_560[] = {2,0x1F57A,0x1F3FC}; /* MAN DANCING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_561[] = {5,0x1F575,0xFE0F,0x200D,0x2642,0xFE0F}; /* MAN DETECTIVE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_562[] = {5,0x1F575,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN DETECTIVE: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_563[] = {5,0x1F575,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN DETECTIVE: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_564[] = {5,0x1F575,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN DETECTIVE: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_565[] = {5,0x1F575,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN DETECTIVE: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_566[] = {5,0x1F575,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN DETECTIVE: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_567[] = {4,0x1F9DD,0x200D,0x2642,0xFE0F}; /* MAN ELF */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_568[] = {5,0x1F9DD,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN ELF: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_569[] = {5,0x1F9DD,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN ELF: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_570[] = {5,0x1F9DD,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN ELF: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_571[] = {5,0x1F9DD,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN ELF: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_572[] = {5,0x1F9DD,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN ELF: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_573[] = {4,0x1F926,0x200D,0x2642,0xFE0F}; /* MAN FACEPALMING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_574[] = {5,0x1F926,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN FACEPALMING: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_575[] = {5,0x1F926,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN FACEPALMING: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_576[] = {5,0x1F926,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN FACEPALMING: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_577[] = {5,0x1F926,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN FACEPALMING: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_578[] = {5,0x1F926,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN FACEPALMING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_579[] = {3,0x1F468,0x200D,0x1F3ED}; /* MAN FACTORY WORKER */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_580[] = {4,0x1F468,0x1F3FF,0x200D,0x1F3ED}; /* MAN FACTORY WORKER: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_581[] = {4,0x1F468,0x1F3FB,0x200D,0x1F3ED}; /* MAN FACTORY WORKER: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_582[] = {4,0x1F468,0x1F3FD,0x200D,0x1F3ED}; /* MAN FACTORY WORKER: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_583[] = {4,0x1F468,0x1F3FE,0x200D,0x1F3ED}; /* MAN FACTORY WORKER: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_584[] = {4,0x1F468,0x1F3FC,0x200D,0x1F3ED}; /* MAN FACTORY WORKER: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_585[] = {4,0x1F9DA,0x200D,0x2642,0xFE0F}; /* MAN FAIRY */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_586[] = {5,0x1F9DA,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN FAIRY: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_587[] = {5,0x1F9DA,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN FAIRY: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_588[] = {5,0x1F9DA,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN FAIRY: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_589[] = {5,0x1F9DA,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN FAIRY: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_590[] = {5,0x1F9DA,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN FAIRY: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_591[] = {3,0x1F468,0x200D,0x1F33E}; /* MAN FARMER */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_592[] = {4,0x1F468,0x1F3FF,0x200D,0x1F33E}; /* MAN FARMER: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_593[] = {4,0x1F468,0x1F3FB,0x200D,0x1F33E}; /* MAN FARMER: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_594[] = {4,0x1F468,0x1F3FD,0x200D,0x1F33E}; /* MAN FARMER: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_595[] = {4,0x1F468,0x1F3FE,0x200D,0x1F33E}; /* MAN FARMER: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_596[] = {4,0x1F468,0x1F3FC,0x200D,0x1F33E}; /* MAN FARMER: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_597[] = {3,0x1F468,0x200D,0x1F692}; /* MAN FIREFIGHTER */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_598[] = {4,0x1F468,0x1F3FF,0x200D,0x1F692}; /* MAN FIREFIGHTER: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_599[] = {4,0x1F468,0x1F3FB,0x200D,0x1F692}; /* MAN FIREFIGHTER: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_600[] = {4,0x1F468,0x1F3FD,0x200D,0x1F692}; /* MAN FIREFIGHTER: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_601[] = {4,0x1F468,0x1F3FE,0x200D,0x1F692}; /* MAN FIREFIGHTER: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_602[] = {4,0x1F468,0x1F3FC,0x200D,0x1F692}; /* MAN FIREFIGHTER: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_603[] = {4,0x1F64D,0x200D,0x2642,0xFE0F}; /* MAN FROWNING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_604[] = {5,0x1F64D,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN FROWNING: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_605[] = {5,0x1F64D,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN FROWNING: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_606[] = {5,0x1F64D,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN FROWNING: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_607[] = {5,0x1F64D,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN FROWNING: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_608[] = {5,0x1F64D,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN FROWNING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_609[] = {4,0x1F9DE,0x200D,0x2642,0xFE0F}; /* MAN GENIE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_610[] = {4,0x1F645,0x200D,0x2642,0xFE0F}; /* MAN GESTURING NO */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_611[] = {5,0x1F645,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN GESTURING NO: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_612[] = {5,0x1F645,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN GESTURING NO: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_613[] = {5,0x1F645,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN GESTURING NO: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_614[] = {5,0x1F645,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN GESTURING NO: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_615[] = {5,0x1F645,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN GESTURING NO: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_616[] = {4,0x1F646,0x200D,0x2642,0xFE0F}; /* MAN GESTURING OK */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_617[] = {5,0x1F646,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN GESTURING OK: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_618[] = {5,0x1F646,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN GESTURING OK: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_619[] = {5,0x1F646,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN GESTURING OK: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_620[] = {5,0x1F646,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN GESTURING OK: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_621[] = {5,0x1F646,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN GESTURING OK: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_622[] = {4,0x1F487,0x200D,0x2642,0xFE0F}; /* MAN GETTING HAIRCUT */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_623[] = {5,0x1F487,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN GETTING HAIRCUT: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_624[] = {5,0x1F487,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN GETTING HAIRCUT: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_625[] = {5,0x1F487,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN GETTING HAIRCUT: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_626[] = {5,0x1F487,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN GETTING HAIRCUT: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_627[] = {5,0x1F487,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN GETTING HAIRCUT: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_628[] = {4,0x1F486,0x200D,0x2642,0xFE0F}; /* MAN GETTING MASSAGE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_629[] = {5,0x1F486,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN GETTING MASSAGE: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_630[] = {5,0x1F486,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN GETTING MASSAGE: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_631[] = {5,0x1F486,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN GETTING MASSAGE: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_632[] = {5,0x1F486,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN GETTING MASSAGE: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_633[] = {5,0x1F486,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN GETTING MASSAGE: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_634[] = {5,0x1F3CC,0xFE0F,0x200D,0x2642,0xFE0F}; /* MAN GOLFING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_635[] = {5,0x1F3CC,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN GOLFING: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_636[] = {5,0x1F3CC,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN GOLFING: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_637[] = {5,0x1F3CC,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN GOLFING: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_638[] = {5,0x1F3CC,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN GOLFING: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_639[] = {5,0x1F3CC,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN GOLFING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_640[] = {4,0x1F482,0x200D,0x2642,0xFE0F}; /* MAN GUARD */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_641[] = {5,0x1F482,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN GUARD: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_642[] = {5,0x1F482,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN GUARD: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_643[] = {5,0x1F482,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN GUARD: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_644[] = {5,0x1F482,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN GUARD: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_645[] = {5,0x1F482,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN GUARD: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_646[] = {4,0x1F468,0x200D,0x2695,0xFE0F}; /* MAN HEALTH WORKER */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_647[] = {5,0x1F468,0x1F3FF,0x200D,0x2695,0xFE0F}; /* MAN HEALTH WORKER: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_648[] = {5,0x1F468,0x1F3FB,0x200D,0x2695,0xFE0F}; /* MAN HEALTH WORKER: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_649[] = {5,0x1F468,0x1F3FD,0x200D,0x2695,0xFE0F}; /* MAN HEALTH WORKER: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_650[] = {5,0x1F468,0x1F3FE,0x200D,0x2695,0xFE0F}; /* MAN HEALTH WORKER: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_651[] = {5,0x1F468,0x1F3FC,0x200D,0x2695,0xFE0F}; /* MAN HEALTH WORKER: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_652[] = {2,0x1F574,0x1F3FF}; /* MAN IN BUSINESS SUIT LEVITATING: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_653[] = {2,0x1F574,0x1F3FB}; /* MAN IN BUSINESS SUIT LEVITATING: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_654[] = {2,0x1F574,0x1F3FD}; /* MAN IN BUSINESS SUIT LEVITATING: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_655[] = {2,0x1F574,0x1F3FE}; /* MAN IN BUSINESS SUIT LEVITATING: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_656[] = {2,0x1F574,0x1F3FC}; /* MAN IN BUSINESS SUIT LEVITATING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_657[] = {4,0x1F9D8,0x200D,0x2642,0xFE0F}; /* MAN IN LOTUS POSITION */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_658[] = {5,0x1F9D8,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN IN LOTUS POSITION: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_659[] = {5,0x1F9D8,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN IN LOTUS POSITION: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_660[] = {5,0x1F9D8,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN IN LOTUS POSITION: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_661[] = {5,0x1F9D8,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN IN LOTUS POSITION: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_662[] = {5,0x1F9D8,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN IN LOTUS POSITION: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_663[] = {4,0x1F9D6,0x200D,0x2642,0xFE0F}; /* MAN IN STEAMY ROOM */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_664[] = {5,0x1F9D6,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN IN STEAMY ROOM: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_665[] = {5,0x1F9D6,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN IN STEAMY ROOM: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_666[] = {5,0x1F9D6,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN IN STEAMY ROOM: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_667[] = {5,0x1F9D6,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN IN STEAMY ROOM: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_668[] = {5,0x1F9D6,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN IN STEAMY ROOM: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_669[] = {2,0x1F574,0x1F3FF}; /* MAN IN SUIT LEVITATING: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_670[] = {2,0x1F574,0x1F3FB}; /* MAN IN SUIT LEVITATING: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_671[] = {2,0x1F574,0x1F3FD}; /* MAN IN SUIT LEVITATING: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_672[] = {2,0x1F574,0x1F3FE}; /* MAN IN SUIT LEVITATING: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_673[] = {2,0x1F574,0x1F3FC}; /* MAN IN SUIT LEVITATING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_674[] = {2,0x1F935,0x1F3FF}; /* MAN IN TUXEDO: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_675[] = {2,0x1F935,0x1F3FB}; /* MAN IN TUXEDO: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_676[] = {2,0x1F935,0x1F3FD}; /* MAN IN TUXEDO: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_677[] = {2,0x1F935,0x1F3FE}; /* MAN IN TUXEDO: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_678[] = {2,0x1F935,0x1F3FC}; /* MAN IN TUXEDO: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_679[] = {4,0x1F468,0x200D,0x2696,0xFE0F}; /* MAN JUDGE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_680[] = {5,0x1F468,0x1F3FF,0x200D,0x2696,0xFE0F}; /* MAN JUDGE: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_681[] = {5,0x1F468,0x1F3FB,0x200D,0x2696,0xFE0F}; /* MAN JUDGE: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_682[] = {5,0x1F468,0x1F3FD,0x200D,0x2696,0xFE0F}; /* MAN JUDGE: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_683[] = {5,0x1F468,0x1F3FE,0x200D,0x2696,0xFE0F}; /* MAN JUDGE: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_684[] = {5,0x1F468,0x1F3FC,0x200D,0x2696,0xFE0F}; /* MAN JUDGE: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_685[] = {4,0x1F939,0x200D,0x2642,0xFE0F}; /* MAN JUGGLING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_686[] = {5,0x1F939,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN JUGGLING: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_687[] = {5,0x1F939,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN JUGGLING: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_688[] = {5,0x1F939,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN JUGGLING: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_689[] = {5,0x1F939,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN JUGGLING: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_690[] = {5,0x1F939,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN JUGGLING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_691[] = {5,0x1F3CB,0xFE0F,0x200D,0x2642,0xFE0F}; /* MAN LIFTING WEIGHTS */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_692[] = {5,0x1F3CB,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN LIFTING WEIGHTS: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_693[] = {5,0x1F3CB,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN LIFTING WEIGHTS: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_694[] = {5,0x1F3CB,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN LIFTING WEIGHTS: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_695[] = {5,0x1F3CB,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN LIFTING WEIGHTS: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_696[] = {5,0x1F3CB,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN LIFTING WEIGHTS: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_697[] = {4,0x1F9D9,0x200D,0x2642,0xFE0F}; /* MAN MAGE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_698[] = {5,0x1F9D9,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN MAGE: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_699[] = {5,0x1F9D9,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN MAGE: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_700[] = {5,0x1F9D9,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN MAGE: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_701[] = {5,0x1F9D9,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN MAGE: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_702[] = {5,0x1F9D9,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN MAGE: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_703[] = {3,0x1F468,0x200D,0x1F527}; /* MAN MECHANIC */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_704[] = {4,0x1F468,0x1F3FF,0x200D,0x1F527}; /* MAN MECHANIC: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_705[] = {4,0x1F468,0x1F3FB,0x200D,0x1F527}; /* MAN MECHANIC: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_706[] = {4,0x1F468,0x1F3FD,0x200D,0x1F527}; /* MAN MECHANIC: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_707[] = {4,0x1F468,0x1F3FE,0x200D,0x1F527}; /* MAN MECHANIC: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_708[] = {4,0x1F468,0x1F3FC,0x200D,0x1F527}; /* MAN MECHANIC: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_709[] = {4,0x1F6B5,0x200D,0x2642,0xFE0F}; /* MAN MOUNTAIN BIKING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_710[] = {5,0x1F6B5,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN MOUNTAIN BIKING: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_711[] = {5,0x1F6B5,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN MOUNTAIN BIKING: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_712[] = {5,0x1F6B5,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN MOUNTAIN BIKING: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_713[] = {5,0x1F6B5,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN MOUNTAIN BIKING: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_714[] = {5,0x1F6B5,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN MOUNTAIN BIKING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_715[] = {3,0x1F468,0x200D,0x1F4BC}; /* MAN OFFICE WORKER */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_716[] = {4,0x1F468,0x1F3FF,0x200D,0x1F4BC}; /* MAN OFFICE WORKER: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_717[] = {4,0x1F468,0x1F3FB,0x200D,0x1F4BC}; /* MAN OFFICE WORKER: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_718[] = {4,0x1F468,0x1F3FD,0x200D,0x1F4BC}; /* MAN OFFICE WORKER: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_719[] = {4,0x1F468,0x1F3FE,0x200D,0x1F4BC}; /* MAN OFFICE WORKER: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_720[] = {4,0x1F468,0x1F3FC,0x200D,0x1F4BC}; /* MAN OFFICE WORKER: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_721[] = {4,0x1F468,0x200D,0x2708,0xFE0F}; /* MAN PILOT */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_722[] = {5,0x1F468,0x1F3FF,0x200D,0x2708,0xFE0F}; /* MAN PILOT: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_723[] = {5,0x1F468,0x1F3FB,0x200D,0x2708,0xFE0F}; /* MAN PILOT: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_724[] = {5,0x1F468,0x1F3FD,0x200D,0x2708,0xFE0F}; /* MAN PILOT: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_725[] = {5,0x1F468,0x1F3FE,0x200D,0x2708,0xFE0F}; /* MAN PILOT: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_726[] = {5,0x1F468,0x1F3FC,0x200D,0x2708,0xFE0F}; /* MAN PILOT: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_727[] = {4,0x1F93E,0x200D,0x2642,0xFE0F}; /* MAN PLAYING HANDBALL */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_728[] = {5,0x1F93E,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN PLAYING HANDBALL: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_729[] = {5,0x1F93E,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN PLAYING HANDBALL: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_730[] = {5,0x1F93E,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN PLAYING HANDBALL: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_731[] = {5,0x1F93E,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN PLAYING HANDBALL: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_732[] = {5,0x1F93E,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN PLAYING HANDBALL: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_733[] = {4,0x1F93D,0x200D,0x2642,0xFE0F}; /* MAN PLAYING WATER POLO */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_734[] = {5,0x1F93D,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN PLAYING WATER POLO: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_735[] = {5,0x1F93D,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN PLAYING WATER POLO: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_736[] = {5,0x1F93D,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN PLAYING WATER POLO: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_737[] = {5,0x1F93D,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN PLAYING WATER POLO: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_738[] = {5,0x1F93D,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN PLAYING WATER POLO: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_739[] = {4,0x1F46E,0x200D,0x2642,0xFE0F}; /* MAN POLICE OFFICER */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_740[] = {5,0x1F46E,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN POLICE OFFICER: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_741[] = {5,0x1F46E,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN POLICE OFFICER: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_742[] = {5,0x1F46E,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN POLICE OFFICER: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_743[] = {5,0x1F46E,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN POLICE OFFICER: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_744[] = {5,0x1F46E,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN POLICE OFFICER: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_745[] = {4,0x1F64E,0x200D,0x2642,0xFE0F}; /* MAN POUTING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_746[] = {5,0x1F64E,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN POUTING: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_747[] = {5,0x1F64E,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN POUTING: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_748[] = {5,0x1F64E,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN POUTING: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_749[] = {5,0x1F64E,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN POUTING: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_750[] = {5,0x1F64E,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN POUTING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_751[] = {4,0x1F64B,0x200D,0x2642,0xFE0F}; /* MAN RAISING HAND */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_752[] = {5,0x1F64B,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN RAISING HAND: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_753[] = {5,0x1F64B,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN RAISING HAND: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_754[] = {5,0x1F64B,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN RAISING HAND: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_755[] = {5,0x1F64B,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN RAISING HAND: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_756[] = {5,0x1F64B,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN RAISING HAND: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_757[] = {4,0x1F6A3,0x200D,0x2642,0xFE0F}; /* MAN ROWING BOAT */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_758[] = {5,0x1F6A3,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN ROWING BOAT: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_759[] = {5,0x1F6A3,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN ROWING BOAT: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_760[] = {5,0x1F6A3,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN ROWING BOAT: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_761[] = {5,0x1F6A3,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN ROWING BOAT: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_762[] = {5,0x1F6A3,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN ROWING BOAT: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_763[] = {4,0x1F3C3,0x200D,0x2642,0xFE0F}; /* MAN RUNNING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_764[] = {5,0x1F3C3,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN RUNNING: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_765[] = {5,0x1F3C3,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN RUNNING: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_766[] = {5,0x1F3C3,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN RUNNING: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_767[] = {5,0x1F3C3,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN RUNNING: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_768[] = {5,0x1F3C3,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN RUNNING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_769[] = {3,0x1F468,0x200D,0x1F52C}; /* MAN SCIENTIST */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_770[] = {4,0x1F468,0x1F3FF,0x200D,0x1F52C}; /* MAN SCIENTIST: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_771[] = {4,0x1F468,0x1F3FB,0x200D,0x1F52C}; /* MAN SCIENTIST: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_772[] = {4,0x1F468,0x1F3FD,0x200D,0x1F52C}; /* MAN SCIENTIST: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_773[] = {4,0x1F468,0x1F3FE,0x200D,0x1F52C}; /* MAN SCIENTIST: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_774[] = {4,0x1F468,0x1F3FC,0x200D,0x1F52C}; /* MAN SCIENTIST: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_775[] = {4,0x1F937,0x200D,0x2642,0xFE0F}; /* MAN SHRUGGING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_776[] = {5,0x1F937,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN SHRUGGING: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_777[] = {5,0x1F937,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN SHRUGGING: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_778[] = {5,0x1F937,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN SHRUGGING: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_779[] = {5,0x1F937,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN SHRUGGING: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_780[] = {5,0x1F937,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN SHRUGGING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_781[] = {3,0x1F468,0x200D,0x1F3A4}; /* MAN SINGER */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_782[] = {4,0x1F468,0x1F3FF,0x200D,0x1F3A4}; /* MAN SINGER: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_783[] = {4,0x1F468,0x1F3FB,0x200D,0x1F3A4}; /* MAN SINGER: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_784[] = {4,0x1F468,0x1F3FD,0x200D,0x1F3A4}; /* MAN SINGER: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_785[] = {4,0x1F468,0x1F3FE,0x200D,0x1F3A4}; /* MAN SINGER: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_786[] = {4,0x1F468,0x1F3FC,0x200D,0x1F3A4}; /* MAN SINGER: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_787[] = {3,0x1F468,0x200D,0x1F393}; /* MAN STUDENT */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_788[] = {4,0x1F468,0x1F3FF,0x200D,0x1F393}; /* MAN STUDENT: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_789[] = {4,0x1F468,0x1F3FB,0x200D,0x1F393}; /* MAN STUDENT: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_790[] = {4,0x1F468,0x1F3FD,0x200D,0x1F393}; /* MAN STUDENT: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_791[] = {4,0x1F468,0x1F3FE,0x200D,0x1F393}; /* MAN STUDENT: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_792[] = {4,0x1F468,0x1F3FC,0x200D,0x1F393}; /* MAN STUDENT: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_793[] = {4,0x1F3C4,0x200D,0x2642,0xFE0F}; /* MAN SURFING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_794[] = {5,0x1F3C4,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN SURFING: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_795[] = {5,0x1F3C4,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN SURFING: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_796[] = {5,0x1F3C4,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN SURFING: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_797[] = {5,0x1F3C4,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN SURFING: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_798[] = {5,0x1F3C4,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN SURFING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_799[] = {4,0x1F3CA,0x200D,0x2642,0xFE0F}; /* MAN SWIMMING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_800[] = {5,0x1F3CA,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN SWIMMING: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_801[] = {5,0x1F3CA,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN SWIMMING: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_802[] = {5,0x1F3CA,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN SWIMMING: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_803[] = {5,0x1F3CA,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN SWIMMING: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_804[] = {5,0x1F3CA,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN SWIMMING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_805[] = {3,0x1F468,0x200D,0x1F3EB}; /* MAN TEACHER */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_806[] = {4,0x1F468,0x1F3FF,0x200D,0x1F3EB}; /* MAN TEACHER: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_807[] = {4,0x1F468,0x1F3FB,0x200D,0x1F3EB}; /* MAN TEACHER: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_808[] = {4,0x1F468,0x1F3FD,0x200D,0x1F3EB}; /* MAN TEACHER: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_809[] = {4,0x1F468,0x1F3FE,0x200D,0x1F3EB}; /* MAN TEACHER: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_810[] = {4,0x1F468,0x1F3FC,0x200D,0x1F3EB}; /* MAN TEACHER: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_811[] = {3,0x1F468,0x200D,0x1F4BB}; /* MAN TECHNOLOGIST */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_812[] = {4,0x1F468,0x1F3FF,0x200D,0x1F4BB}; /* MAN TECHNOLOGIST: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_813[] = {4,0x1F468,0x1F3FB,0x200D,0x1F4BB}; /* MAN TECHNOLOGIST: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_814[] = {4,0x1F468,0x1F3FD,0x200D,0x1F4BB}; /* MAN TECHNOLOGIST: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_815[] = {4,0x1F468,0x1F3FE,0x200D,0x1F4BB}; /* MAN TECHNOLOGIST: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_816[] = {4,0x1F468,0x1F3FC,0x200D,0x1F4BB}; /* MAN TECHNOLOGIST: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_817[] = {4,0x1F481,0x200D,0x2642,0xFE0F}; /* MAN TIPPING HAND */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_818[] = {5,0x1F481,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN TIPPING HAND: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_819[] = {5,0x1F481,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN TIPPING HAND: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_820[] = {5,0x1F481,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN TIPPING HAND: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_821[] = {5,0x1F481,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN TIPPING HAND: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_822[] = {5,0x1F481,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN TIPPING HAND: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_823[] = {4,0x1F9DB,0x200D,0x2642,0xFE0F}; /* MAN VAMPIRE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_824[] = {5,0x1F9DB,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN VAMPIRE: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_825[] = {5,0x1F9DB,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN VAMPIRE: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_826[] = {5,0x1F9DB,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN VAMPIRE: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_827[] = {5,0x1F9DB,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN VAMPIRE: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_828[] = {5,0x1F9DB,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN VAMPIRE: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_829[] = {4,0x1F6B6,0x200D,0x2642,0xFE0F}; /* MAN WALKING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_830[] = {5,0x1F6B6,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN WALKING: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_831[] = {5,0x1F6B6,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN WALKING: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_832[] = {5,0x1F6B6,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN WALKING: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_833[] = {5,0x1F6B6,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN WALKING: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_834[] = {5,0x1F6B6,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN WALKING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_835[] = {4,0x1F473,0x200D,0x2642,0xFE0F}; /* MAN WEARING TURBAN */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_836[] = {5,0x1F473,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MAN WEARING TURBAN: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_837[] = {5,0x1F473,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MAN WEARING TURBAN: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_838[] = {5,0x1F473,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MAN WEARING TURBAN: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_839[] = {5,0x1F473,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MAN WEARING TURBAN: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_840[] = {5,0x1F473,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MAN WEARING TURBAN: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_841[] = {2,0x1F472,0x1F3FF}; /* MAN WITH CHINESE CAP: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_842[] = {2,0x1F472,0x1F3FB}; /* MAN WITH CHINESE CAP: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_843[] = {2,0x1F472,0x1F3FD}; /* MAN WITH CHINESE CAP: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_844[] = {2,0x1F472,0x1F3FE}; /* MAN WITH CHINESE CAP: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_845[] = {2,0x1F472,0x1F3FC}; /* MAN WITH CHINESE CAP: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_846[] = {4,0x1F9DF,0x200D,0x2642,0xFE0F}; /* MAN ZOMBIE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_847[] = {2,0x1F468,0x1F3FF}; /* MAN: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_848[] = {2,0x1F468,0x1F3FB}; /* MAN: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_849[] = {2,0x1F468,0x1F3FD}; /* MAN: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_850[] = {2,0x1F468,0x1F3FE}; /* MAN: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_851[] = {2,0x1F468,0x1F3FC}; /* MAN: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_852[] = {2,0x1F1F2,0x1F1ED}; /* MARSHALL ISLANDS */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_853[] = {2,0x1F1F2,0x1F1F6}; /* MARTINIQUE */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_854[] = {2,0x1F1F2,0x1F1F7}; /* MAURITANIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_855[] = {2,0x1F1F2,0x1F1FA}; /* MAURITIUS */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_856[] = {2,0x1F1FE,0x1F1F9}; /* MAYOTTE */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_857[] = {4,0x1F46F,0x200D,0x2642,0xFE0F}; /* MEN WITH BUNNY EARS */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_858[] = {4,0x1F46F,0x200D,0x2642,0xFE0F}; /* MEN WITH BUNNY EARS PARTYING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_859[] = {4,0x1F93C,0x200D,0x2642,0xFE0F}; /* MEN WRESTLING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_860[] = {4,0x1F9DC,0x200D,0x2640,0xFE0F}; /* MERMAID */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_861[] = {5,0x1F9DC,0x1F3FF,0x200D,0x2640,0xFE0F}; /* MERMAID: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_862[] = {5,0x1F9DC,0x1F3FB,0x200D,0x2640,0xFE0F}; /* MERMAID: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_863[] = {5,0x1F9DC,0x1F3FD,0x200D,0x2640,0xFE0F}; /* MERMAID: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_864[] = {5,0x1F9DC,0x1F3FE,0x200D,0x2640,0xFE0F}; /* MERMAID: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_865[] = {5,0x1F9DC,0x1F3FC,0x200D,0x2640,0xFE0F}; /* MERMAID: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_866[] = {4,0x1F9DC,0x200D,0x2642,0xFE0F}; /* MERMAN */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_867[] = {5,0x1F9DC,0x1F3FF,0x200D,0x2642,0xFE0F}; /* MERMAN: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_868[] = {5,0x1F9DC,0x1F3FB,0x200D,0x2642,0xFE0F}; /* MERMAN: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_869[] = {5,0x1F9DC,0x1F3FD,0x200D,0x2642,0xFE0F}; /* MERMAN: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_870[] = {5,0x1F9DC,0x1F3FE,0x200D,0x2642,0xFE0F}; /* MERMAN: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_871[] = {5,0x1F9DC,0x1F3FC,0x200D,0x2642,0xFE0F}; /* MERMAN: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_872[] = {2,0x1F9DC,0x1F3FF}; /* MERPERSON: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_873[] = {2,0x1F9DC,0x1F3FB}; /* MERPERSON: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_874[] = {2,0x1F9DC,0x1F3FD}; /* MERPERSON: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_875[] = {2,0x1F9DC,0x1F3FE}; /* MERPERSON: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_876[] = {2,0x1F9DC,0x1F3FC}; /* MERPERSON: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_877[] = {2,0x1F1F2,0x1F1FD}; /* MEXICO */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_878[] = {2,0x1F1EB,0x1F1F2}; /* MICRONESIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_879[] = {2,0x1F595,0x1F3FF}; /* MIDDLE FINGER: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_880[] = {2,0x1F595,0x1F3FB}; /* MIDDLE FINGER: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_881[] = {2,0x1F595,0x1F3FD}; /* MIDDLE FINGER: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_882[] = {2,0x1F595,0x1F3FE}; /* MIDDLE FINGER: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_883[] = {2,0x1F595,0x1F3FC}; /* MIDDLE FINGER: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_884[] = {2,0x2E5,0x2E9}; /* MODIFIER LETTER EXTRA-HIGH EXTRA-LOW CONTOUR TONE BAR */ /*NamedSequences */ static const MVMint32 uni_seq_885[] = {2,0x2E9,0x2E5}; /* MODIFIER LETTER EXTRA-LOW EXTRA-HIGH CONTOUR TONE BAR */ /*NamedSequences */ static const MVMint32 uni_seq_886[] = {2,0x1F1F2,0x1F1E9}; /* MOLDOVA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_887[] = {2,0x1F1F2,0x1F1E8}; /* MONACO */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_888[] = {2,0x1F1F2,0x1F1F3}; /* MONGOLIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_889[] = {2,0x1F1F2,0x1F1EA}; /* MONTENEGRO */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_890[] = {2,0x1F1F2,0x1F1F8}; /* MONTSERRAT */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_891[] = {2,0x1F1F2,0x1F1E6}; /* MOROCCO */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_892[] = {2,0x1F1F2,0x1F1FF}; /* MOZAMBIQUE */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_893[] = {2,0x1F936,0x1F3FF}; /* MRS. CLAUS: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_894[] = {2,0x1F936,0x1F3FB}; /* MRS. CLAUS: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_895[] = {2,0x1F936,0x1F3FD}; /* MRS. CLAUS: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_896[] = {2,0x1F936,0x1F3FE}; /* MRS. CLAUS: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_897[] = {2,0x1F936,0x1F3FC}; /* MRS. CLAUS: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_898[] = {2,0x1F1F2,0x1F1F2}; /* MYANMAR (BURMA) */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_899[] = {2,0x1F485,0x1F3FF}; /* NAIL POLISH: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_900[] = {2,0x1F485,0x1F3FB}; /* NAIL POLISH: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_901[] = {2,0x1F485,0x1F3FD}; /* NAIL POLISH: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_902[] = {2,0x1F485,0x1F3FE}; /* NAIL POLISH: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_903[] = {2,0x1F485,0x1F3FC}; /* NAIL POLISH: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_904[] = {2,0x1F1F3,0x1F1E6}; /* NAMIBIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_905[] = {2,0x1F1F3,0x1F1F7}; /* NAURU */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_906[] = {2,0x1F1F3,0x1F1F5}; /* NEPAL */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_907[] = {2,0x1F1F3,0x1F1F1}; /* NETHERLANDS */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_908[] = {2,0x1F1F3,0x1F1E8}; /* NEW CALEDONIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_909[] = {2,0x1F1F3,0x1F1FF}; /* NEW ZEALAND */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_910[] = {2,0x1F1F3,0x1F1EE}; /* NICARAGUA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_911[] = {2,0x1F1F3,0x1F1EA}; /* NIGER */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_912[] = {2,0x1F1F3,0x1F1EC}; /* NIGERIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_913[] = {2,0x1F1F3,0x1F1FA}; /* NIUE */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_914[] = {2,0x1F1F3,0x1F1EB}; /* NORFOLK ISLAND */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_915[] = {2,0x1F1F0,0x1F1F5}; /* NORTH KOREA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_916[] = {2,0x1F1F2,0x1F1F5}; /* NORTHERN MARIANA ISLANDS */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_917[] = {2,0x1F1F3,0x1F1F4}; /* NORWAY */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_918[] = {2,0x1F443,0x1F3FF}; /* NOSE: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_919[] = {2,0x1F443,0x1F3FB}; /* NOSE: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_920[] = {2,0x1F443,0x1F3FD}; /* NOSE: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_921[] = {2,0x1F443,0x1F3FE}; /* NOSE: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_922[] = {2,0x1F443,0x1F3FC}; /* NOSE: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_923[] = {2,0x1F44C,0x1F3FF}; /* OK HAND: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_924[] = {2,0x1F44C,0x1F3FB}; /* OK HAND: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_925[] = {2,0x1F44C,0x1F3FD}; /* OK HAND: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_926[] = {2,0x1F44C,0x1F3FE}; /* OK HAND: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_927[] = {2,0x1F44C,0x1F3FC}; /* OK HAND: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_928[] = {2,0x1F474,0x1F3FF}; /* OLD MAN: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_929[] = {2,0x1F474,0x1F3FB}; /* OLD MAN: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_930[] = {2,0x1F474,0x1F3FD}; /* OLD MAN: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_931[] = {2,0x1F474,0x1F3FE}; /* OLD MAN: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_932[] = {2,0x1F474,0x1F3FC}; /* OLD MAN: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_933[] = {2,0x1F475,0x1F3FF}; /* OLD WOMAN: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_934[] = {2,0x1F475,0x1F3FB}; /* OLD WOMAN: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_935[] = {2,0x1F475,0x1F3FD}; /* OLD WOMAN: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_936[] = {2,0x1F475,0x1F3FE}; /* OLD WOMAN: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_937[] = {2,0x1F475,0x1F3FC}; /* OLD WOMAN: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_938[] = {2,0x1F9D3,0x1F3FF}; /* OLDER ADULT: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_939[] = {2,0x1F9D3,0x1F3FB}; /* OLDER ADULT: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_940[] = {2,0x1F9D3,0x1F3FD}; /* OLDER ADULT: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_941[] = {2,0x1F9D3,0x1F3FE}; /* OLDER ADULT: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_942[] = {2,0x1F9D3,0x1F3FC}; /* OLDER ADULT: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_943[] = {2,0x1F1F4,0x1F1F2}; /* OMAN */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_944[] = {2,0x1F44A,0x1F3FF}; /* ONCOMING FIST: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_945[] = {2,0x1F44A,0x1F3FB}; /* ONCOMING FIST: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_946[] = {2,0x1F44A,0x1F3FD}; /* ONCOMING FIST: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_947[] = {2,0x1F44A,0x1F3FE}; /* ONCOMING FIST: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_948[] = {2,0x1F44A,0x1F3FC}; /* ONCOMING FIST: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_949[] = {2,0x1F450,0x1F3FF}; /* OPEN HANDS: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_950[] = {2,0x1F450,0x1F3FB}; /* OPEN HANDS: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_951[] = {2,0x1F450,0x1F3FD}; /* OPEN HANDS: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_952[] = {2,0x1F450,0x1F3FE}; /* OPEN HANDS: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_953[] = {2,0x1F450,0x1F3FC}; /* OPEN HANDS: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_954[] = {2,0x1F1F5,0x1F1F0}; /* PAKISTAN */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_955[] = {2,0x1F1F5,0x1F1FC}; /* PALAU */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_956[] = {2,0x1F1F5,0x1F1F8}; /* PALESTINIAN TERRITORIES */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_957[] = {2,0x1F932,0x1F3FF}; /* PALMS UP TOGETHER: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_958[] = {2,0x1F932,0x1F3FB}; /* PALMS UP TOGETHER: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_959[] = {2,0x1F932,0x1F3FD}; /* PALMS UP TOGETHER: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_960[] = {2,0x1F932,0x1F3FE}; /* PALMS UP TOGETHER: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_961[] = {2,0x1F932,0x1F3FC}; /* PALMS UP TOGETHER: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_962[] = {2,0x1F1F5,0x1F1E6}; /* PANAMA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_963[] = {2,0x1F1F5,0x1F1EC}; /* PAPUA NEW GUINEA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_964[] = {2,0x1F1F5,0x1F1FE}; /* PARAGUAY */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_965[] = {2,0x1F6B4,0x1F3FF}; /* PERSON BIKING: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_966[] = {2,0x1F6B4,0x1F3FB}; /* PERSON BIKING: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_967[] = {2,0x1F6B4,0x1F3FD}; /* PERSON BIKING: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_968[] = {2,0x1F6B4,0x1F3FE}; /* PERSON BIKING: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_969[] = {2,0x1F6B4,0x1F3FC}; /* PERSON BIKING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_970[] = {2,0x26F9,0x1F3FF}; /* PERSON BOUNCING BALL: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_971[] = {2,0x26F9,0x1F3FB}; /* PERSON BOUNCING BALL: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_972[] = {2,0x26F9,0x1F3FD}; /* PERSON BOUNCING BALL: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_973[] = {2,0x26F9,0x1F3FE}; /* PERSON BOUNCING BALL: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_974[] = {2,0x26F9,0x1F3FC}; /* PERSON BOUNCING BALL: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_975[] = {2,0x1F647,0x1F3FF}; /* PERSON BOWING: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_976[] = {2,0x1F647,0x1F3FB}; /* PERSON BOWING: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_977[] = {2,0x1F647,0x1F3FD}; /* PERSON BOWING: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_978[] = {2,0x1F647,0x1F3FE}; /* PERSON BOWING: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_979[] = {2,0x1F647,0x1F3FC}; /* PERSON BOWING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_980[] = {2,0x1F938,0x1F3FF}; /* PERSON CARTWHEELING: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_981[] = {2,0x1F938,0x1F3FB}; /* PERSON CARTWHEELING: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_982[] = {2,0x1F938,0x1F3FD}; /* PERSON CARTWHEELING: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_983[] = {2,0x1F938,0x1F3FE}; /* PERSON CARTWHEELING: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_984[] = {2,0x1F938,0x1F3FC}; /* PERSON CARTWHEELING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_985[] = {2,0x1F9D7,0x1F3FF}; /* PERSON CLIMBING: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_986[] = {2,0x1F9D7,0x1F3FB}; /* PERSON CLIMBING: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_987[] = {2,0x1F9D7,0x1F3FD}; /* PERSON CLIMBING: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_988[] = {2,0x1F9D7,0x1F3FE}; /* PERSON CLIMBING: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_989[] = {2,0x1F9D7,0x1F3FC}; /* PERSON CLIMBING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_990[] = {2,0x1F926,0x1F3FF}; /* PERSON FACEPALMING: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_991[] = {2,0x1F926,0x1F3FB}; /* PERSON FACEPALMING: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_992[] = {2,0x1F926,0x1F3FD}; /* PERSON FACEPALMING: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_993[] = {2,0x1F926,0x1F3FE}; /* PERSON FACEPALMING: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_994[] = {2,0x1F926,0x1F3FC}; /* PERSON FACEPALMING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_995[] = {2,0x1F64D,0x1F3FF}; /* PERSON FROWNING: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_996[] = {2,0x1F64D,0x1F3FB}; /* PERSON FROWNING: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_997[] = {2,0x1F64D,0x1F3FD}; /* PERSON FROWNING: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_998[] = {2,0x1F64D,0x1F3FE}; /* PERSON FROWNING: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_999[] = {2,0x1F64D,0x1F3FC}; /* PERSON FROWNING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1000[] = {2,0x1F645,0x1F3FF}; /* PERSON GESTURING NO: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1001[] = {2,0x1F645,0x1F3FB}; /* PERSON GESTURING NO: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1002[] = {2,0x1F645,0x1F3FD}; /* PERSON GESTURING NO: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1003[] = {2,0x1F645,0x1F3FE}; /* PERSON GESTURING NO: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1004[] = {2,0x1F645,0x1F3FC}; /* PERSON GESTURING NO: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1005[] = {2,0x1F646,0x1F3FF}; /* PERSON GESTURING OK: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1006[] = {2,0x1F646,0x1F3FB}; /* PERSON GESTURING OK: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1007[] = {2,0x1F646,0x1F3FD}; /* PERSON GESTURING OK: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1008[] = {2,0x1F646,0x1F3FE}; /* PERSON GESTURING OK: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1009[] = {2,0x1F646,0x1F3FC}; /* PERSON GESTURING OK: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1010[] = {2,0x1F487,0x1F3FF}; /* PERSON GETTING HAIRCUT: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1011[] = {2,0x1F487,0x1F3FB}; /* PERSON GETTING HAIRCUT: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1012[] = {2,0x1F487,0x1F3FD}; /* PERSON GETTING HAIRCUT: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1013[] = {2,0x1F487,0x1F3FE}; /* PERSON GETTING HAIRCUT: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1014[] = {2,0x1F487,0x1F3FC}; /* PERSON GETTING HAIRCUT: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1015[] = {2,0x1F486,0x1F3FF}; /* PERSON GETTING MASSAGE: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1016[] = {2,0x1F486,0x1F3FB}; /* PERSON GETTING MASSAGE: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1017[] = {2,0x1F486,0x1F3FD}; /* PERSON GETTING MASSAGE: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1018[] = {2,0x1F486,0x1F3FE}; /* PERSON GETTING MASSAGE: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1019[] = {2,0x1F486,0x1F3FC}; /* PERSON GETTING MASSAGE: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1020[] = {2,0x1F3CC,0x1F3FF}; /* PERSON GOLFING: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1021[] = {2,0x1F3CC,0x1F3FB}; /* PERSON GOLFING: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1022[] = {2,0x1F3CC,0x1F3FD}; /* PERSON GOLFING: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1023[] = {2,0x1F3CC,0x1F3FE}; /* PERSON GOLFING: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1024[] = {2,0x1F3CC,0x1F3FC}; /* PERSON GOLFING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1025[] = {2,0x1F6CC,0x1F3FF}; /* PERSON IN BED: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1026[] = {2,0x1F6CC,0x1F3FB}; /* PERSON IN BED: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1027[] = {2,0x1F6CC,0x1F3FD}; /* PERSON IN BED: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1028[] = {2,0x1F6CC,0x1F3FE}; /* PERSON IN BED: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1029[] = {2,0x1F6CC,0x1F3FC}; /* PERSON IN BED: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1030[] = {2,0x1F9D8,0x1F3FF}; /* PERSON IN LOTUS POSITION: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1031[] = {2,0x1F9D8,0x1F3FB}; /* PERSON IN LOTUS POSITION: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1032[] = {2,0x1F9D8,0x1F3FD}; /* PERSON IN LOTUS POSITION: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1033[] = {2,0x1F9D8,0x1F3FE}; /* PERSON IN LOTUS POSITION: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1034[] = {2,0x1F9D8,0x1F3FC}; /* PERSON IN LOTUS POSITION: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1035[] = {2,0x1F9D6,0x1F3FF}; /* PERSON IN STEAMY ROOM: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1036[] = {2,0x1F9D6,0x1F3FB}; /* PERSON IN STEAMY ROOM: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1037[] = {2,0x1F9D6,0x1F3FD}; /* PERSON IN STEAMY ROOM: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1038[] = {2,0x1F9D6,0x1F3FE}; /* PERSON IN STEAMY ROOM: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1039[] = {2,0x1F9D6,0x1F3FC}; /* PERSON IN STEAMY ROOM: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1040[] = {2,0x1F939,0x1F3FF}; /* PERSON JUGGLING: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1041[] = {2,0x1F939,0x1F3FB}; /* PERSON JUGGLING: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1042[] = {2,0x1F939,0x1F3FD}; /* PERSON JUGGLING: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1043[] = {2,0x1F939,0x1F3FE}; /* PERSON JUGGLING: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1044[] = {2,0x1F939,0x1F3FC}; /* PERSON JUGGLING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1045[] = {2,0x1F3CB,0x1F3FF}; /* PERSON LIFTING WEIGHTS: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1046[] = {2,0x1F3CB,0x1F3FB}; /* PERSON LIFTING WEIGHTS: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1047[] = {2,0x1F3CB,0x1F3FD}; /* PERSON LIFTING WEIGHTS: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1048[] = {2,0x1F3CB,0x1F3FE}; /* PERSON LIFTING WEIGHTS: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1049[] = {2,0x1F3CB,0x1F3FC}; /* PERSON LIFTING WEIGHTS: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1050[] = {2,0x1F6B5,0x1F3FF}; /* PERSON MOUNTAIN BIKING: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1051[] = {2,0x1F6B5,0x1F3FB}; /* PERSON MOUNTAIN BIKING: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1052[] = {2,0x1F6B5,0x1F3FD}; /* PERSON MOUNTAIN BIKING: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1053[] = {2,0x1F6B5,0x1F3FE}; /* PERSON MOUNTAIN BIKING: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1054[] = {2,0x1F6B5,0x1F3FC}; /* PERSON MOUNTAIN BIKING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1055[] = {2,0x1F93E,0x1F3FF}; /* PERSON PLAYING HANDBALL: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1056[] = {2,0x1F93E,0x1F3FB}; /* PERSON PLAYING HANDBALL: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1057[] = {2,0x1F93E,0x1F3FD}; /* PERSON PLAYING HANDBALL: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1058[] = {2,0x1F93E,0x1F3FE}; /* PERSON PLAYING HANDBALL: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1059[] = {2,0x1F93E,0x1F3FC}; /* PERSON PLAYING HANDBALL: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1060[] = {2,0x1F93D,0x1F3FF}; /* PERSON PLAYING WATER POLO: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1061[] = {2,0x1F93D,0x1F3FB}; /* PERSON PLAYING WATER POLO: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1062[] = {2,0x1F93D,0x1F3FD}; /* PERSON PLAYING WATER POLO: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1063[] = {2,0x1F93D,0x1F3FE}; /* PERSON PLAYING WATER POLO: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1064[] = {2,0x1F93D,0x1F3FC}; /* PERSON PLAYING WATER POLO: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1065[] = {2,0x1F64E,0x1F3FF}; /* PERSON POUTING: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1066[] = {2,0x1F64E,0x1F3FB}; /* PERSON POUTING: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1067[] = {2,0x1F64E,0x1F3FD}; /* PERSON POUTING: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1068[] = {2,0x1F64E,0x1F3FE}; /* PERSON POUTING: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1069[] = {2,0x1F64E,0x1F3FC}; /* PERSON POUTING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1070[] = {2,0x1F64B,0x1F3FF}; /* PERSON RAISING HAND: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1071[] = {2,0x1F64B,0x1F3FB}; /* PERSON RAISING HAND: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1072[] = {2,0x1F64B,0x1F3FD}; /* PERSON RAISING HAND: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1073[] = {2,0x1F64B,0x1F3FE}; /* PERSON RAISING HAND: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1074[] = {2,0x1F64B,0x1F3FC}; /* PERSON RAISING HAND: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1075[] = {2,0x1F6A3,0x1F3FF}; /* PERSON ROWING BOAT: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1076[] = {2,0x1F6A3,0x1F3FB}; /* PERSON ROWING BOAT: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1077[] = {2,0x1F6A3,0x1F3FD}; /* PERSON ROWING BOAT: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1078[] = {2,0x1F6A3,0x1F3FE}; /* PERSON ROWING BOAT: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1079[] = {2,0x1F6A3,0x1F3FC}; /* PERSON ROWING BOAT: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1080[] = {2,0x1F3C3,0x1F3FF}; /* PERSON RUNNING: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1081[] = {2,0x1F3C3,0x1F3FB}; /* PERSON RUNNING: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1082[] = {2,0x1F3C3,0x1F3FD}; /* PERSON RUNNING: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1083[] = {2,0x1F3C3,0x1F3FE}; /* PERSON RUNNING: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1084[] = {2,0x1F3C3,0x1F3FC}; /* PERSON RUNNING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1085[] = {2,0x1F937,0x1F3FF}; /* PERSON SHRUGGING: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1086[] = {2,0x1F937,0x1F3FB}; /* PERSON SHRUGGING: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1087[] = {2,0x1F937,0x1F3FD}; /* PERSON SHRUGGING: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1088[] = {2,0x1F937,0x1F3FE}; /* PERSON SHRUGGING: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1089[] = {2,0x1F937,0x1F3FC}; /* PERSON SHRUGGING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1090[] = {2,0x1F3C4,0x1F3FF}; /* PERSON SURFING: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1091[] = {2,0x1F3C4,0x1F3FB}; /* PERSON SURFING: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1092[] = {2,0x1F3C4,0x1F3FD}; /* PERSON SURFING: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1093[] = {2,0x1F3C4,0x1F3FE}; /* PERSON SURFING: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1094[] = {2,0x1F3C4,0x1F3FC}; /* PERSON SURFING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1095[] = {2,0x1F3CA,0x1F3FF}; /* PERSON SWIMMING: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1096[] = {2,0x1F3CA,0x1F3FB}; /* PERSON SWIMMING: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1097[] = {2,0x1F3CA,0x1F3FD}; /* PERSON SWIMMING: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1098[] = {2,0x1F3CA,0x1F3FE}; /* PERSON SWIMMING: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1099[] = {2,0x1F3CA,0x1F3FC}; /* PERSON SWIMMING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1100[] = {2,0x1F6C0,0x1F3FF}; /* PERSON TAKING BATH: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1101[] = {2,0x1F6C0,0x1F3FB}; /* PERSON TAKING BATH: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1102[] = {2,0x1F6C0,0x1F3FD}; /* PERSON TAKING BATH: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1103[] = {2,0x1F6C0,0x1F3FE}; /* PERSON TAKING BATH: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1104[] = {2,0x1F6C0,0x1F3FC}; /* PERSON TAKING BATH: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1105[] = {2,0x1F481,0x1F3FF}; /* PERSON TIPPING HAND: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1106[] = {2,0x1F481,0x1F3FB}; /* PERSON TIPPING HAND: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1107[] = {2,0x1F481,0x1F3FD}; /* PERSON TIPPING HAND: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1108[] = {2,0x1F481,0x1F3FE}; /* PERSON TIPPING HAND: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1109[] = {2,0x1F481,0x1F3FC}; /* PERSON TIPPING HAND: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1110[] = {2,0x1F6B6,0x1F3FF}; /* PERSON WALKING: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1111[] = {2,0x1F6B6,0x1F3FB}; /* PERSON WALKING: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1112[] = {2,0x1F6B6,0x1F3FD}; /* PERSON WALKING: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1113[] = {2,0x1F6B6,0x1F3FE}; /* PERSON WALKING: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1114[] = {2,0x1F6B6,0x1F3FC}; /* PERSON WALKING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1115[] = {2,0x1F473,0x1F3FF}; /* PERSON WEARING TURBAN: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1116[] = {2,0x1F473,0x1F3FB}; /* PERSON WEARING TURBAN: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1117[] = {2,0x1F473,0x1F3FD}; /* PERSON WEARING TURBAN: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1118[] = {2,0x1F473,0x1F3FE}; /* PERSON WEARING TURBAN: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1119[] = {2,0x1F473,0x1F3FC}; /* PERSON WEARING TURBAN: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1120[] = {2,0x1F1F5,0x1F1EA}; /* PERU */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1121[] = {2,0x1F1F5,0x1F1ED}; /* PHILIPPINES */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1122[] = {2,0x1F1F5,0x1F1F3}; /* PITCAIRN ISLANDS */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1123[] = {2,0x1F1F5,0x1F1F1}; /* POLAND */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1124[] = {2,0x1F46E,0x1F3FF}; /* POLICE OFFICER: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1125[] = {2,0x1F46E,0x1F3FB}; /* POLICE OFFICER: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1126[] = {2,0x1F46E,0x1F3FD}; /* POLICE OFFICER: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1127[] = {2,0x1F46E,0x1F3FE}; /* POLICE OFFICER: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1128[] = {2,0x1F46E,0x1F3FC}; /* POLICE OFFICER: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1129[] = {2,0x1F1F5,0x1F1F9}; /* PORTUGAL */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1130[] = {2,0x1F930,0x1F3FF}; /* PREGNANT WOMAN: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1131[] = {2,0x1F930,0x1F3FB}; /* PREGNANT WOMAN: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1132[] = {2,0x1F930,0x1F3FD}; /* PREGNANT WOMAN: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1133[] = {2,0x1F930,0x1F3FE}; /* PREGNANT WOMAN: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1134[] = {2,0x1F930,0x1F3FC}; /* PREGNANT WOMAN: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1135[] = {2,0x1F934,0x1F3FF}; /* PRINCE: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1136[] = {2,0x1F934,0x1F3FB}; /* PRINCE: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1137[] = {2,0x1F934,0x1F3FD}; /* PRINCE: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1138[] = {2,0x1F934,0x1F3FE}; /* PRINCE: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1139[] = {2,0x1F934,0x1F3FC}; /* PRINCE: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1140[] = {2,0x1F478,0x1F3FF}; /* PRINCESS: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1141[] = {2,0x1F478,0x1F3FB}; /* PRINCESS: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1142[] = {2,0x1F478,0x1F3FD}; /* PRINCESS: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1143[] = {2,0x1F478,0x1F3FE}; /* PRINCESS: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1144[] = {2,0x1F478,0x1F3FC}; /* PRINCESS: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1145[] = {2,0x1F1F5,0x1F1F7}; /* PUERTO RICO */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1146[] = {2,0x1F1F6,0x1F1E6}; /* QATAR */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1147[] = {4,0x1F3F3,0xFE0F,0x200D,0x1F308}; /* RAINBOW FLAG */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1148[] = {2,0x1F91A,0x1F3FF}; /* RAISED BACK OF HAND: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1149[] = {2,0x1F91A,0x1F3FB}; /* RAISED BACK OF HAND: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1150[] = {2,0x1F91A,0x1F3FD}; /* RAISED BACK OF HAND: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1151[] = {2,0x1F91A,0x1F3FE}; /* RAISED BACK OF HAND: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1152[] = {2,0x1F91A,0x1F3FC}; /* RAISED BACK OF HAND: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1153[] = {2,0x270A,0x1F3FF}; /* RAISED FIST: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1154[] = {2,0x270A,0x1F3FB}; /* RAISED FIST: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1155[] = {2,0x270A,0x1F3FD}; /* RAISED FIST: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1156[] = {2,0x270A,0x1F3FE}; /* RAISED FIST: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1157[] = {2,0x270A,0x1F3FC}; /* RAISED FIST: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1158[] = {2,0x1F590,0x1F3FF}; /* RAISED HAND WITH FINGERS SPLAYED: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1159[] = {2,0x1F590,0x1F3FB}; /* RAISED HAND WITH FINGERS SPLAYED: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1160[] = {2,0x1F590,0x1F3FD}; /* RAISED HAND WITH FINGERS SPLAYED: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1161[] = {2,0x1F590,0x1F3FE}; /* RAISED HAND WITH FINGERS SPLAYED: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1162[] = {2,0x1F590,0x1F3FC}; /* RAISED HAND WITH FINGERS SPLAYED: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1163[] = {2,0x270B,0x1F3FF}; /* RAISED HAND: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1164[] = {2,0x270B,0x1F3FB}; /* RAISED HAND: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1165[] = {2,0x270B,0x1F3FD}; /* RAISED HAND: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1166[] = {2,0x270B,0x1F3FE}; /* RAISED HAND: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1167[] = {2,0x270B,0x1F3FC}; /* RAISED HAND: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1168[] = {2,0x1F64C,0x1F3FF}; /* RAISING HANDS: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1169[] = {2,0x1F64C,0x1F3FB}; /* RAISING HANDS: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1170[] = {2,0x1F64C,0x1F3FD}; /* RAISING HANDS: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1171[] = {2,0x1F64C,0x1F3FE}; /* RAISING HANDS: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1172[] = {2,0x1F64C,0x1F3FC}; /* RAISING HANDS: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1173[] = {2,0x1F91C,0x1F3FF}; /* RIGHT-FACING FIST: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1174[] = {2,0x1F91C,0x1F3FB}; /* RIGHT-FACING FIST: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1175[] = {2,0x1F91C,0x1F3FD}; /* RIGHT-FACING FIST: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1176[] = {2,0x1F91C,0x1F3FE}; /* RIGHT-FACING FIST: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1177[] = {2,0x1F91C,0x1F3FC}; /* RIGHT-FACING FIST: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1178[] = {2,0x1F1F7,0x1F1F4}; /* ROMANIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1179[] = {2,0x1F1F7,0x1F1FA}; /* RUSSIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1180[] = {2,0x1F1F7,0x1F1FC}; /* RWANDA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1181[] = {2,0x1F1F7,0x1F1EA}; /* RÉUNION */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1182[] = {2,0x1F1FC,0x1F1F8}; /* SAMOA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1183[] = {2,0x1F1F8,0x1F1F2}; /* SAN MARINO */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1184[] = {2,0x1F385,0x1F3FF}; /* SANTA CLAUS: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1185[] = {2,0x1F385,0x1F3FB}; /* SANTA CLAUS: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1186[] = {2,0x1F385,0x1F3FD}; /* SANTA CLAUS: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1187[] = {2,0x1F385,0x1F3FE}; /* SANTA CLAUS: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1188[] = {2,0x1F385,0x1F3FC}; /* SANTA CLAUS: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1189[] = {2,0x1F1F8,0x1F1E6}; /* SAUDI ARABIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1190[] = {7,0x1F3F4,0xE0067,0xE0062,0xE0073,0xE0063,0xE0074,0xE007F}; /* SCOTLAND */ /*Emoji_Tag_Sequence */ static const MVMint32 uni_seq_1191[] = {2,0x1F933,0x1F3FF}; /* SELFIE: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1192[] = {2,0x1F933,0x1F3FB}; /* SELFIE: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1193[] = {2,0x1F933,0x1F3FD}; /* SELFIE: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1194[] = {2,0x1F933,0x1F3FE}; /* SELFIE: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1195[] = {2,0x1F933,0x1F3FC}; /* SELFIE: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1196[] = {2,0x1F1F8,0x1F1F3}; /* SENEGAL */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1197[] = {2,0x1F1F7,0x1F1F8}; /* SERBIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1198[] = {2,0x1F1F8,0x1F1E8}; /* SEYCHELLES */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1199[] = {2,0x1F1F8,0x1F1F1}; /* SIERRA LEONE */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1200[] = {2,0x1F918,0x1F3FF}; /* SIGN OF THE HORNS: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1201[] = {2,0x1F918,0x1F3FB}; /* SIGN OF THE HORNS: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1202[] = {2,0x1F918,0x1F3FD}; /* SIGN OF THE HORNS: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1203[] = {2,0x1F918,0x1F3FE}; /* SIGN OF THE HORNS: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1204[] = {2,0x1F918,0x1F3FC}; /* SIGN OF THE HORNS: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1205[] = {2,0x1F1F8,0x1F1EC}; /* SINGAPORE */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1206[] = {3,0xDCA,0x200D,0xDBB}; /* SINHALA CONSONANT SIGN RAKAARAANSAYA */ /*NamedSequences */ static const MVMint32 uni_seq_1207[] = {3,0xDBB,0xDCA,0x200D}; /* SINHALA CONSONANT SIGN REPAYA */ /*NamedSequences */ static const MVMint32 uni_seq_1208[] = {3,0xDCA,0x200D,0xDBA}; /* SINHALA CONSONANT SIGN YANSAYA */ /*NamedSequences */ static const MVMint32 uni_seq_1209[] = {2,0x1F1F8,0x1F1FD}; /* SINT MAARTEN */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1210[] = {2,0x1F1F8,0x1F1F0}; /* SLOVAKIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1211[] = {2,0x1F1F8,0x1F1EE}; /* SLOVENIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1212[] = {2,0x1F3C2,0x1F3FF}; /* SNOWBOARDER: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1213[] = {2,0x1F3C2,0x1F3FB}; /* SNOWBOARDER: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1214[] = {2,0x1F3C2,0x1F3FD}; /* SNOWBOARDER: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1215[] = {2,0x1F3C2,0x1F3FE}; /* SNOWBOARDER: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1216[] = {2,0x1F3C2,0x1F3FC}; /* SNOWBOARDER: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1217[] = {2,0x1F1F8,0x1F1E7}; /* SOLOMON ISLANDS */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1218[] = {2,0x1F1F8,0x1F1F4}; /* SOMALIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1219[] = {2,0x1F1FF,0x1F1E6}; /* SOUTH AFRICA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1220[] = {2,0x1F1EC,0x1F1F8}; /* SOUTH GEORGIA & SOUTH SANDWICH ISLANDS */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1221[] = {2,0x1F1F0,0x1F1F7}; /* SOUTH KOREA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1222[] = {2,0x1F1F8,0x1F1F8}; /* SOUTH SUDAN */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1223[] = {2,0x1F1EA,0x1F1F8}; /* SPAIN */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1224[] = {2,0x1F1F1,0x1F1F0}; /* SRI LANKA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1225[] = {2,0x1F1E7,0x1F1F1}; /* ST. BARTHÉLEMY */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1226[] = {2,0x1F1F8,0x1F1ED}; /* ST. HELENA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1227[] = {2,0x1F1F0,0x1F1F3}; /* ST. KITTS & NEVIS */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1228[] = {2,0x1F1F1,0x1F1E8}; /* ST. LUCIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1229[] = {2,0x1F1F2,0x1F1EB}; /* ST. MARTIN */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1230[] = {2,0x1F1F5,0x1F1F2}; /* ST. PIERRE & MIQUELON */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1231[] = {2,0x1F1FB,0x1F1E8}; /* ST. VINCENT & GRENADINES */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1232[] = {2,0x1F1F8,0x1F1E9}; /* SUDAN */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1233[] = {2,0x1F1F8,0x1F1F7}; /* SURINAME */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1234[] = {2,0x1F1F8,0x1F1EF}; /* SVALBARD & JAN MAYEN */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1235[] = {2,0x1F1F8,0x1F1FF}; /* SWAZILAND */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1236[] = {2,0x1F1F8,0x1F1EA}; /* SWEDEN */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1237[] = {2,0x1F1E8,0x1F1ED}; /* SWITZERLAND */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1238[] = {2,0x1F1F8,0x1F1FE}; /* SYRIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1239[] = {2,0x1F1F8,0x1F1F9}; /* SÃO TOMÉ & PRÃNCIPE */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1240[] = {2,0x1F1F9,0x1F1FC}; /* TAIWAN */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1241[] = {2,0x1F1F9,0x1F1EF}; /* TAJIKISTAN */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1242[] = {2,0xB9A,0xBCD}; /* TAMIL CONSONANT C */ /*NamedSequences */ static const MVMint32 uni_seq_1243[] = {2,0xBB9,0xBCD}; /* TAMIL CONSONANT H */ /*NamedSequences */ static const MVMint32 uni_seq_1244[] = {2,0xB9C,0xBCD}; /* TAMIL CONSONANT J */ /*NamedSequences */ static const MVMint32 uni_seq_1245[] = {2,0xB95,0xBCD}; /* TAMIL CONSONANT K */ /*NamedSequences */ static const MVMint32 uni_seq_1246[] = {4,0xB95,0xBCD,0xBB7,0xBCD}; /* TAMIL CONSONANT KSS */ /*NamedSequences */ static const MVMint32 uni_seq_1247[] = {2,0xBB2,0xBCD}; /* TAMIL CONSONANT L */ /*NamedSequences */ static const MVMint32 uni_seq_1248[] = {2,0xBB3,0xBCD}; /* TAMIL CONSONANT LL */ /*NamedSequences */ static const MVMint32 uni_seq_1249[] = {2,0xBB4,0xBCD}; /* TAMIL CONSONANT LLL */ /*NamedSequences */ static const MVMint32 uni_seq_1250[] = {2,0xBAE,0xBCD}; /* TAMIL CONSONANT M */ /*NamedSequences */ static const MVMint32 uni_seq_1251[] = {2,0xBA8,0xBCD}; /* TAMIL CONSONANT N */ /*NamedSequences */ static const MVMint32 uni_seq_1252[] = {2,0xB99,0xBCD}; /* TAMIL CONSONANT NG */ /*NamedSequences */ static const MVMint32 uni_seq_1253[] = {2,0xBA3,0xBCD}; /* TAMIL CONSONANT NN */ /*NamedSequences */ static const MVMint32 uni_seq_1254[] = {2,0xBA9,0xBCD}; /* TAMIL CONSONANT NNN */ /*NamedSequences */ static const MVMint32 uni_seq_1255[] = {2,0xB9E,0xBCD}; /* TAMIL CONSONANT NY */ /*NamedSequences */ static const MVMint32 uni_seq_1256[] = {2,0xBAA,0xBCD}; /* TAMIL CONSONANT P */ /*NamedSequences */ static const MVMint32 uni_seq_1257[] = {2,0xBB0,0xBCD}; /* TAMIL CONSONANT R */ /*NamedSequences */ static const MVMint32 uni_seq_1258[] = {2,0xBB1,0xBCD}; /* TAMIL CONSONANT RR */ /*NamedSequences */ static const MVMint32 uni_seq_1259[] = {2,0xBB8,0xBCD}; /* TAMIL CONSONANT S */ /*NamedSequences */ static const MVMint32 uni_seq_1260[] = {2,0xBB6,0xBCD}; /* TAMIL CONSONANT SH */ /*NamedSequences */ static const MVMint32 uni_seq_1261[] = {2,0xBB7,0xBCD}; /* TAMIL CONSONANT SS */ /*NamedSequences */ static const MVMint32 uni_seq_1262[] = {2,0xBA4,0xBCD}; /* TAMIL CONSONANT T */ /*NamedSequences */ static const MVMint32 uni_seq_1263[] = {2,0xB9F,0xBCD}; /* TAMIL CONSONANT TT */ /*NamedSequences */ static const MVMint32 uni_seq_1264[] = {2,0xBB5,0xBCD}; /* TAMIL CONSONANT V */ /*NamedSequences */ static const MVMint32 uni_seq_1265[] = {2,0xBAF,0xBCD}; /* TAMIL CONSONANT Y */ /*NamedSequences */ static const MVMint32 uni_seq_1266[] = {2,0xB9A,0xBBE}; /* TAMIL SYLLABLE CAA */ /*NamedSequences */ static const MVMint32 uni_seq_1267[] = {2,0xB9A,0xBC8}; /* TAMIL SYLLABLE CAI */ /*NamedSequences */ static const MVMint32 uni_seq_1268[] = {2,0xB9A,0xBCC}; /* TAMIL SYLLABLE CAU */ /*NamedSequences */ static const MVMint32 uni_seq_1269[] = {2,0xB9A,0xBC6}; /* TAMIL SYLLABLE CE */ /*NamedSequences */ static const MVMint32 uni_seq_1270[] = {2,0xB9A,0xBC7}; /* TAMIL SYLLABLE CEE */ /*NamedSequences */ static const MVMint32 uni_seq_1271[] = {2,0xB9A,0xBBF}; /* TAMIL SYLLABLE CI */ /*NamedSequences */ static const MVMint32 uni_seq_1272[] = {2,0xB9A,0xBC0}; /* TAMIL SYLLABLE CII */ /*NamedSequences */ static const MVMint32 uni_seq_1273[] = {2,0xB9A,0xBCA}; /* TAMIL SYLLABLE CO */ /*NamedSequences */ static const MVMint32 uni_seq_1274[] = {2,0xB9A,0xBCB}; /* TAMIL SYLLABLE COO */ /*NamedSequences */ static const MVMint32 uni_seq_1275[] = {2,0xB9A,0xBC1}; /* TAMIL SYLLABLE CU */ /*NamedSequences */ static const MVMint32 uni_seq_1276[] = {2,0xB9A,0xBC2}; /* TAMIL SYLLABLE CUU */ /*NamedSequences */ static const MVMint32 uni_seq_1277[] = {2,0xBB9,0xBBE}; /* TAMIL SYLLABLE HAA */ /*NamedSequences */ static const MVMint32 uni_seq_1278[] = {2,0xBB9,0xBC8}; /* TAMIL SYLLABLE HAI */ /*NamedSequences */ static const MVMint32 uni_seq_1279[] = {2,0xBB9,0xBCC}; /* TAMIL SYLLABLE HAU */ /*NamedSequences */ static const MVMint32 uni_seq_1280[] = {2,0xBB9,0xBC6}; /* TAMIL SYLLABLE HE */ /*NamedSequences */ static const MVMint32 uni_seq_1281[] = {2,0xBB9,0xBC7}; /* TAMIL SYLLABLE HEE */ /*NamedSequences */ static const MVMint32 uni_seq_1282[] = {2,0xBB9,0xBBF}; /* TAMIL SYLLABLE HI */ /*NamedSequences */ static const MVMint32 uni_seq_1283[] = {2,0xBB9,0xBC0}; /* TAMIL SYLLABLE HII */ /*NamedSequences */ static const MVMint32 uni_seq_1284[] = {2,0xBB9,0xBCA}; /* TAMIL SYLLABLE HO */ /*NamedSequences */ static const MVMint32 uni_seq_1285[] = {2,0xBB9,0xBCB}; /* TAMIL SYLLABLE HOO */ /*NamedSequences */ static const MVMint32 uni_seq_1286[] = {2,0xBB9,0xBC1}; /* TAMIL SYLLABLE HU */ /*NamedSequences */ static const MVMint32 uni_seq_1287[] = {2,0xBB9,0xBC2}; /* TAMIL SYLLABLE HUU */ /*NamedSequences */ static const MVMint32 uni_seq_1288[] = {2,0xB9C,0xBBE}; /* TAMIL SYLLABLE JAA */ /*NamedSequences */ static const MVMint32 uni_seq_1289[] = {2,0xB9C,0xBC8}; /* TAMIL SYLLABLE JAI */ /*NamedSequences */ static const MVMint32 uni_seq_1290[] = {2,0xB9C,0xBCC}; /* TAMIL SYLLABLE JAU */ /*NamedSequences */ static const MVMint32 uni_seq_1291[] = {2,0xB9C,0xBC6}; /* TAMIL SYLLABLE JE */ /*NamedSequences */ static const MVMint32 uni_seq_1292[] = {2,0xB9C,0xBC7}; /* TAMIL SYLLABLE JEE */ /*NamedSequences */ static const MVMint32 uni_seq_1293[] = {2,0xB9C,0xBBF}; /* TAMIL SYLLABLE JI */ /*NamedSequences */ static const MVMint32 uni_seq_1294[] = {2,0xB9C,0xBC0}; /* TAMIL SYLLABLE JII */ /*NamedSequences */ static const MVMint32 uni_seq_1295[] = {2,0xB9C,0xBCA}; /* TAMIL SYLLABLE JO */ /*NamedSequences */ static const MVMint32 uni_seq_1296[] = {2,0xB9C,0xBCB}; /* TAMIL SYLLABLE JOO */ /*NamedSequences */ static const MVMint32 uni_seq_1297[] = {2,0xB9C,0xBC1}; /* TAMIL SYLLABLE JU */ /*NamedSequences */ static const MVMint32 uni_seq_1298[] = {2,0xB9C,0xBC2}; /* TAMIL SYLLABLE JUU */ /*NamedSequences */ static const MVMint32 uni_seq_1299[] = {2,0xB95,0xBBE}; /* TAMIL SYLLABLE KAA */ /*NamedSequences */ static const MVMint32 uni_seq_1300[] = {2,0xB95,0xBC8}; /* TAMIL SYLLABLE KAI */ /*NamedSequences */ static const MVMint32 uni_seq_1301[] = {2,0xB95,0xBCC}; /* TAMIL SYLLABLE KAU */ /*NamedSequences */ static const MVMint32 uni_seq_1302[] = {2,0xB95,0xBC6}; /* TAMIL SYLLABLE KE */ /*NamedSequences */ static const MVMint32 uni_seq_1303[] = {2,0xB95,0xBC7}; /* TAMIL SYLLABLE KEE */ /*NamedSequences */ static const MVMint32 uni_seq_1304[] = {2,0xB95,0xBBF}; /* TAMIL SYLLABLE KI */ /*NamedSequences */ static const MVMint32 uni_seq_1305[] = {2,0xB95,0xBC0}; /* TAMIL SYLLABLE KII */ /*NamedSequences */ static const MVMint32 uni_seq_1306[] = {2,0xB95,0xBCA}; /* TAMIL SYLLABLE KO */ /*NamedSequences */ static const MVMint32 uni_seq_1307[] = {2,0xB95,0xBCB}; /* TAMIL SYLLABLE KOO */ /*NamedSequences */ static const MVMint32 uni_seq_1308[] = {3,0xB95,0xBCD,0xBB7}; /* TAMIL SYLLABLE KSSA */ /*NamedSequences */ static const MVMint32 uni_seq_1309[] = {4,0xB95,0xBCD,0xBB7,0xBBE}; /* TAMIL SYLLABLE KSSAA */ /*NamedSequences */ static const MVMint32 uni_seq_1310[] = {4,0xB95,0xBCD,0xBB7,0xBC8}; /* TAMIL SYLLABLE KSSAI */ /*NamedSequences */ static const MVMint32 uni_seq_1311[] = {4,0xB95,0xBCD,0xBB7,0xBCC}; /* TAMIL SYLLABLE KSSAU */ /*NamedSequences */ static const MVMint32 uni_seq_1312[] = {4,0xB95,0xBCD,0xBB7,0xBC6}; /* TAMIL SYLLABLE KSSE */ /*NamedSequences */ static const MVMint32 uni_seq_1313[] = {4,0xB95,0xBCD,0xBB7,0xBC7}; /* TAMIL SYLLABLE KSSEE */ /*NamedSequences */ static const MVMint32 uni_seq_1314[] = {4,0xB95,0xBCD,0xBB7,0xBBF}; /* TAMIL SYLLABLE KSSI */ /*NamedSequences */ static const MVMint32 uni_seq_1315[] = {4,0xB95,0xBCD,0xBB7,0xBC0}; /* TAMIL SYLLABLE KSSII */ /*NamedSequences */ static const MVMint32 uni_seq_1316[] = {4,0xB95,0xBCD,0xBB7,0xBCA}; /* TAMIL SYLLABLE KSSO */ /*NamedSequences */ static const MVMint32 uni_seq_1317[] = {4,0xB95,0xBCD,0xBB7,0xBCB}; /* TAMIL SYLLABLE KSSOO */ /*NamedSequences */ static const MVMint32 uni_seq_1318[] = {4,0xB95,0xBCD,0xBB7,0xBC1}; /* TAMIL SYLLABLE KSSU */ /*NamedSequences */ static const MVMint32 uni_seq_1319[] = {4,0xB95,0xBCD,0xBB7,0xBC2}; /* TAMIL SYLLABLE KSSUU */ /*NamedSequences */ static const MVMint32 uni_seq_1320[] = {2,0xB95,0xBC1}; /* TAMIL SYLLABLE KU */ /*NamedSequences */ static const MVMint32 uni_seq_1321[] = {2,0xB95,0xBC2}; /* TAMIL SYLLABLE KUU */ /*NamedSequences */ static const MVMint32 uni_seq_1322[] = {2,0xBB2,0xBBE}; /* TAMIL SYLLABLE LAA */ /*NamedSequences */ static const MVMint32 uni_seq_1323[] = {2,0xBB2,0xBC8}; /* TAMIL SYLLABLE LAI */ /*NamedSequences */ static const MVMint32 uni_seq_1324[] = {2,0xBB2,0xBCC}; /* TAMIL SYLLABLE LAU */ /*NamedSequences */ static const MVMint32 uni_seq_1325[] = {2,0xBB2,0xBC6}; /* TAMIL SYLLABLE LE */ /*NamedSequences */ static const MVMint32 uni_seq_1326[] = {2,0xBB2,0xBC7}; /* TAMIL SYLLABLE LEE */ /*NamedSequences */ static const MVMint32 uni_seq_1327[] = {2,0xBB2,0xBBF}; /* TAMIL SYLLABLE LI */ /*NamedSequences */ static const MVMint32 uni_seq_1328[] = {2,0xBB2,0xBC0}; /* TAMIL SYLLABLE LII */ /*NamedSequences */ static const MVMint32 uni_seq_1329[] = {2,0xBB3,0xBBE}; /* TAMIL SYLLABLE LLAA */ /*NamedSequences */ static const MVMint32 uni_seq_1330[] = {2,0xBB3,0xBC8}; /* TAMIL SYLLABLE LLAI */ /*NamedSequences */ static const MVMint32 uni_seq_1331[] = {2,0xBB3,0xBCC}; /* TAMIL SYLLABLE LLAU */ /*NamedSequences */ static const MVMint32 uni_seq_1332[] = {2,0xBB3,0xBC6}; /* TAMIL SYLLABLE LLE */ /*NamedSequences */ static const MVMint32 uni_seq_1333[] = {2,0xBB3,0xBC7}; /* TAMIL SYLLABLE LLEE */ /*NamedSequences */ static const MVMint32 uni_seq_1334[] = {2,0xBB3,0xBBF}; /* TAMIL SYLLABLE LLI */ /*NamedSequences */ static const MVMint32 uni_seq_1335[] = {2,0xBB3,0xBC0}; /* TAMIL SYLLABLE LLII */ /*NamedSequences */ static const MVMint32 uni_seq_1336[] = {2,0xBB4,0xBBE}; /* TAMIL SYLLABLE LLLAA */ /*NamedSequences */ static const MVMint32 uni_seq_1337[] = {2,0xBB4,0xBC8}; /* TAMIL SYLLABLE LLLAI */ /*NamedSequences */ static const MVMint32 uni_seq_1338[] = {2,0xBB4,0xBCC}; /* TAMIL SYLLABLE LLLAU */ /*NamedSequences */ static const MVMint32 uni_seq_1339[] = {2,0xBB4,0xBC6}; /* TAMIL SYLLABLE LLLE */ /*NamedSequences */ static const MVMint32 uni_seq_1340[] = {2,0xBB4,0xBC7}; /* TAMIL SYLLABLE LLLEE */ /*NamedSequences */ static const MVMint32 uni_seq_1341[] = {2,0xBB4,0xBBF}; /* TAMIL SYLLABLE LLLI */ /*NamedSequences */ static const MVMint32 uni_seq_1342[] = {2,0xBB4,0xBC0}; /* TAMIL SYLLABLE LLLII */ /*NamedSequences */ static const MVMint32 uni_seq_1343[] = {2,0xBB4,0xBCA}; /* TAMIL SYLLABLE LLLO */ /*NamedSequences */ static const MVMint32 uni_seq_1344[] = {2,0xBB4,0xBCB}; /* TAMIL SYLLABLE LLLOO */ /*NamedSequences */ static const MVMint32 uni_seq_1345[] = {2,0xBB4,0xBC1}; /* TAMIL SYLLABLE LLLU */ /*NamedSequences */ static const MVMint32 uni_seq_1346[] = {2,0xBB4,0xBC2}; /* TAMIL SYLLABLE LLLUU */ /*NamedSequences */ static const MVMint32 uni_seq_1347[] = {2,0xBB3,0xBCA}; /* TAMIL SYLLABLE LLO */ /*NamedSequences */ static const MVMint32 uni_seq_1348[] = {2,0xBB3,0xBCB}; /* TAMIL SYLLABLE LLOO */ /*NamedSequences */ static const MVMint32 uni_seq_1349[] = {2,0xBB3,0xBC1}; /* TAMIL SYLLABLE LLU */ /*NamedSequences */ static const MVMint32 uni_seq_1350[] = {2,0xBB3,0xBC2}; /* TAMIL SYLLABLE LLUU */ /*NamedSequences */ static const MVMint32 uni_seq_1351[] = {2,0xBB2,0xBCA}; /* TAMIL SYLLABLE LO */ /*NamedSequences */ static const MVMint32 uni_seq_1352[] = {2,0xBB2,0xBCB}; /* TAMIL SYLLABLE LOO */ /*NamedSequences */ static const MVMint32 uni_seq_1353[] = {2,0xBB2,0xBC1}; /* TAMIL SYLLABLE LU */ /*NamedSequences */ static const MVMint32 uni_seq_1354[] = {2,0xBB2,0xBC2}; /* TAMIL SYLLABLE LUU */ /*NamedSequences */ static const MVMint32 uni_seq_1355[] = {2,0xBAE,0xBBE}; /* TAMIL SYLLABLE MAA */ /*NamedSequences */ static const MVMint32 uni_seq_1356[] = {2,0xBAE,0xBC8}; /* TAMIL SYLLABLE MAI */ /*NamedSequences */ static const MVMint32 uni_seq_1357[] = {2,0xBAE,0xBCC}; /* TAMIL SYLLABLE MAU */ /*NamedSequences */ static const MVMint32 uni_seq_1358[] = {2,0xBAE,0xBC6}; /* TAMIL SYLLABLE ME */ /*NamedSequences */ static const MVMint32 uni_seq_1359[] = {2,0xBAE,0xBC7}; /* TAMIL SYLLABLE MEE */ /*NamedSequences */ static const MVMint32 uni_seq_1360[] = {2,0xBAE,0xBBF}; /* TAMIL SYLLABLE MI */ /*NamedSequences */ static const MVMint32 uni_seq_1361[] = {2,0xBAE,0xBC0}; /* TAMIL SYLLABLE MII */ /*NamedSequences */ static const MVMint32 uni_seq_1362[] = {2,0xBAE,0xBCA}; /* TAMIL SYLLABLE MO */ /*NamedSequences */ static const MVMint32 uni_seq_1363[] = {2,0xBAE,0xBCB}; /* TAMIL SYLLABLE MOO */ /*NamedSequences */ static const MVMint32 uni_seq_1364[] = {2,0xBAE,0xBC1}; /* TAMIL SYLLABLE MU */ /*NamedSequences */ static const MVMint32 uni_seq_1365[] = {2,0xBAE,0xBC2}; /* TAMIL SYLLABLE MUU */ /*NamedSequences */ static const MVMint32 uni_seq_1366[] = {2,0xBA8,0xBBE}; /* TAMIL SYLLABLE NAA */ /*NamedSequences */ static const MVMint32 uni_seq_1367[] = {2,0xBA8,0xBC8}; /* TAMIL SYLLABLE NAI */ /*NamedSequences */ static const MVMint32 uni_seq_1368[] = {2,0xBA8,0xBCC}; /* TAMIL SYLLABLE NAU */ /*NamedSequences */ static const MVMint32 uni_seq_1369[] = {2,0xBA8,0xBC6}; /* TAMIL SYLLABLE NE */ /*NamedSequences */ static const MVMint32 uni_seq_1370[] = {2,0xBA8,0xBC7}; /* TAMIL SYLLABLE NEE */ /*NamedSequences */ static const MVMint32 uni_seq_1371[] = {2,0xB99,0xBBE}; /* TAMIL SYLLABLE NGAA */ /*NamedSequences */ static const MVMint32 uni_seq_1372[] = {2,0xB99,0xBC8}; /* TAMIL SYLLABLE NGAI */ /*NamedSequences */ static const MVMint32 uni_seq_1373[] = {2,0xB99,0xBCC}; /* TAMIL SYLLABLE NGAU */ /*NamedSequences */ static const MVMint32 uni_seq_1374[] = {2,0xB99,0xBC6}; /* TAMIL SYLLABLE NGE */ /*NamedSequences */ static const MVMint32 uni_seq_1375[] = {2,0xB99,0xBC7}; /* TAMIL SYLLABLE NGEE */ /*NamedSequences */ static const MVMint32 uni_seq_1376[] = {2,0xB99,0xBBF}; /* TAMIL SYLLABLE NGI */ /*NamedSequences */ static const MVMint32 uni_seq_1377[] = {2,0xB99,0xBC0}; /* TAMIL SYLLABLE NGII */ /*NamedSequences */ static const MVMint32 uni_seq_1378[] = {2,0xB99,0xBCA}; /* TAMIL SYLLABLE NGO */ /*NamedSequences */ static const MVMint32 uni_seq_1379[] = {2,0xB99,0xBCB}; /* TAMIL SYLLABLE NGOO */ /*NamedSequences */ static const MVMint32 uni_seq_1380[] = {2,0xB99,0xBC1}; /* TAMIL SYLLABLE NGU */ /*NamedSequences */ static const MVMint32 uni_seq_1381[] = {2,0xB99,0xBC2}; /* TAMIL SYLLABLE NGUU */ /*NamedSequences */ static const MVMint32 uni_seq_1382[] = {2,0xBA8,0xBBF}; /* TAMIL SYLLABLE NI */ /*NamedSequences */ static const MVMint32 uni_seq_1383[] = {2,0xBA8,0xBC0}; /* TAMIL SYLLABLE NII */ /*NamedSequences */ static const MVMint32 uni_seq_1384[] = {2,0xBA3,0xBBE}; /* TAMIL SYLLABLE NNAA */ /*NamedSequences */ static const MVMint32 uni_seq_1385[] = {2,0xBA3,0xBC8}; /* TAMIL SYLLABLE NNAI */ /*NamedSequences */ static const MVMint32 uni_seq_1386[] = {2,0xBA3,0xBCC}; /* TAMIL SYLLABLE NNAU */ /*NamedSequences */ static const MVMint32 uni_seq_1387[] = {2,0xBA3,0xBC6}; /* TAMIL SYLLABLE NNE */ /*NamedSequences */ static const MVMint32 uni_seq_1388[] = {2,0xBA3,0xBC7}; /* TAMIL SYLLABLE NNEE */ /*NamedSequences */ static const MVMint32 uni_seq_1389[] = {2,0xBA3,0xBBF}; /* TAMIL SYLLABLE NNI */ /*NamedSequences */ static const MVMint32 uni_seq_1390[] = {2,0xBA3,0xBC0}; /* TAMIL SYLLABLE NNII */ /*NamedSequences */ static const MVMint32 uni_seq_1391[] = {2,0xBA9,0xBBE}; /* TAMIL SYLLABLE NNNAA */ /*NamedSequences */ static const MVMint32 uni_seq_1392[] = {2,0xBA9,0xBC8}; /* TAMIL SYLLABLE NNNAI */ /*NamedSequences */ static const MVMint32 uni_seq_1393[] = {2,0xBA9,0xBCC}; /* TAMIL SYLLABLE NNNAU */ /*NamedSequences */ static const MVMint32 uni_seq_1394[] = {2,0xBA9,0xBC6}; /* TAMIL SYLLABLE NNNE */ /*NamedSequences */ static const MVMint32 uni_seq_1395[] = {2,0xBA9,0xBC7}; /* TAMIL SYLLABLE NNNEE */ /*NamedSequences */ static const MVMint32 uni_seq_1396[] = {2,0xBA9,0xBBF}; /* TAMIL SYLLABLE NNNI */ /*NamedSequences */ static const MVMint32 uni_seq_1397[] = {2,0xBA9,0xBC0}; /* TAMIL SYLLABLE NNNII */ /*NamedSequences */ static const MVMint32 uni_seq_1398[] = {2,0xBA9,0xBCA}; /* TAMIL SYLLABLE NNNO */ /*NamedSequences */ static const MVMint32 uni_seq_1399[] = {2,0xBA9,0xBCB}; /* TAMIL SYLLABLE NNNOO */ /*NamedSequences */ static const MVMint32 uni_seq_1400[] = {2,0xBA9,0xBC1}; /* TAMIL SYLLABLE NNNU */ /*NamedSequences */ static const MVMint32 uni_seq_1401[] = {2,0xBA9,0xBC2}; /* TAMIL SYLLABLE NNNUU */ /*NamedSequences */ static const MVMint32 uni_seq_1402[] = {2,0xBA3,0xBCA}; /* TAMIL SYLLABLE NNO */ /*NamedSequences */ static const MVMint32 uni_seq_1403[] = {2,0xBA3,0xBCB}; /* TAMIL SYLLABLE NNOO */ /*NamedSequences */ static const MVMint32 uni_seq_1404[] = {2,0xBA3,0xBC1}; /* TAMIL SYLLABLE NNU */ /*NamedSequences */ static const MVMint32 uni_seq_1405[] = {2,0xBA3,0xBC2}; /* TAMIL SYLLABLE NNUU */ /*NamedSequences */ static const MVMint32 uni_seq_1406[] = {2,0xBA8,0xBCA}; /* TAMIL SYLLABLE NO */ /*NamedSequences */ static const MVMint32 uni_seq_1407[] = {2,0xBA8,0xBCB}; /* TAMIL SYLLABLE NOO */ /*NamedSequences */ static const MVMint32 uni_seq_1408[] = {2,0xBA8,0xBC1}; /* TAMIL SYLLABLE NU */ /*NamedSequences */ static const MVMint32 uni_seq_1409[] = {2,0xBA8,0xBC2}; /* TAMIL SYLLABLE NUU */ /*NamedSequences */ static const MVMint32 uni_seq_1410[] = {2,0xB9E,0xBBE}; /* TAMIL SYLLABLE NYAA */ /*NamedSequences */ static const MVMint32 uni_seq_1411[] = {2,0xB9E,0xBC8}; /* TAMIL SYLLABLE NYAI */ /*NamedSequences */ static const MVMint32 uni_seq_1412[] = {2,0xB9E,0xBCC}; /* TAMIL SYLLABLE NYAU */ /*NamedSequences */ static const MVMint32 uni_seq_1413[] = {2,0xB9E,0xBC6}; /* TAMIL SYLLABLE NYE */ /*NamedSequences */ static const MVMint32 uni_seq_1414[] = {2,0xB9E,0xBC7}; /* TAMIL SYLLABLE NYEE */ /*NamedSequences */ static const MVMint32 uni_seq_1415[] = {2,0xB9E,0xBBF}; /* TAMIL SYLLABLE NYI */ /*NamedSequences */ static const MVMint32 uni_seq_1416[] = {2,0xB9E,0xBC0}; /* TAMIL SYLLABLE NYII */ /*NamedSequences */ static const MVMint32 uni_seq_1417[] = {2,0xB9E,0xBCA}; /* TAMIL SYLLABLE NYO */ /*NamedSequences */ static const MVMint32 uni_seq_1418[] = {2,0xB9E,0xBCB}; /* TAMIL SYLLABLE NYOO */ /*NamedSequences */ static const MVMint32 uni_seq_1419[] = {2,0xB9E,0xBC1}; /* TAMIL SYLLABLE NYU */ /*NamedSequences */ static const MVMint32 uni_seq_1420[] = {2,0xB9E,0xBC2}; /* TAMIL SYLLABLE NYUU */ /*NamedSequences */ static const MVMint32 uni_seq_1421[] = {2,0xBAA,0xBBE}; /* TAMIL SYLLABLE PAA */ /*NamedSequences */ static const MVMint32 uni_seq_1422[] = {2,0xBAA,0xBC8}; /* TAMIL SYLLABLE PAI */ /*NamedSequences */ static const MVMint32 uni_seq_1423[] = {2,0xBAA,0xBCC}; /* TAMIL SYLLABLE PAU */ /*NamedSequences */ static const MVMint32 uni_seq_1424[] = {2,0xBAA,0xBC6}; /* TAMIL SYLLABLE PE */ /*NamedSequences */ static const MVMint32 uni_seq_1425[] = {2,0xBAA,0xBC7}; /* TAMIL SYLLABLE PEE */ /*NamedSequences */ static const MVMint32 uni_seq_1426[] = {2,0xBAA,0xBBF}; /* TAMIL SYLLABLE PI */ /*NamedSequences */ static const MVMint32 uni_seq_1427[] = {2,0xBAA,0xBC0}; /* TAMIL SYLLABLE PII */ /*NamedSequences */ static const MVMint32 uni_seq_1428[] = {2,0xBAA,0xBCA}; /* TAMIL SYLLABLE PO */ /*NamedSequences */ static const MVMint32 uni_seq_1429[] = {2,0xBAA,0xBCB}; /* TAMIL SYLLABLE POO */ /*NamedSequences */ static const MVMint32 uni_seq_1430[] = {2,0xBAA,0xBC1}; /* TAMIL SYLLABLE PU */ /*NamedSequences */ static const MVMint32 uni_seq_1431[] = {2,0xBAA,0xBC2}; /* TAMIL SYLLABLE PUU */ /*NamedSequences */ static const MVMint32 uni_seq_1432[] = {2,0xBB0,0xBBE}; /* TAMIL SYLLABLE RAA */ /*NamedSequences */ static const MVMint32 uni_seq_1433[] = {2,0xBB0,0xBC8}; /* TAMIL SYLLABLE RAI */ /*NamedSequences */ static const MVMint32 uni_seq_1434[] = {2,0xBB0,0xBCC}; /* TAMIL SYLLABLE RAU */ /*NamedSequences */ static const MVMint32 uni_seq_1435[] = {2,0xBB0,0xBC6}; /* TAMIL SYLLABLE RE */ /*NamedSequences */ static const MVMint32 uni_seq_1436[] = {2,0xBB0,0xBC7}; /* TAMIL SYLLABLE REE */ /*NamedSequences */ static const MVMint32 uni_seq_1437[] = {2,0xBB0,0xBBF}; /* TAMIL SYLLABLE RI */ /*NamedSequences */ static const MVMint32 uni_seq_1438[] = {2,0xBB0,0xBC0}; /* TAMIL SYLLABLE RII */ /*NamedSequences */ static const MVMint32 uni_seq_1439[] = {2,0xBB0,0xBCA}; /* TAMIL SYLLABLE RO */ /*NamedSequences */ static const MVMint32 uni_seq_1440[] = {2,0xBB0,0xBCB}; /* TAMIL SYLLABLE ROO */ /*NamedSequences */ static const MVMint32 uni_seq_1441[] = {2,0xBB1,0xBBE}; /* TAMIL SYLLABLE RRAA */ /*NamedSequences */ static const MVMint32 uni_seq_1442[] = {2,0xBB1,0xBC8}; /* TAMIL SYLLABLE RRAI */ /*NamedSequences */ static const MVMint32 uni_seq_1443[] = {2,0xBB1,0xBCC}; /* TAMIL SYLLABLE RRAU */ /*NamedSequences */ static const MVMint32 uni_seq_1444[] = {2,0xBB1,0xBC6}; /* TAMIL SYLLABLE RRE */ /*NamedSequences */ static const MVMint32 uni_seq_1445[] = {2,0xBB1,0xBC7}; /* TAMIL SYLLABLE RREE */ /*NamedSequences */ static const MVMint32 uni_seq_1446[] = {2,0xBB1,0xBBF}; /* TAMIL SYLLABLE RRI */ /*NamedSequences */ static const MVMint32 uni_seq_1447[] = {2,0xBB1,0xBC0}; /* TAMIL SYLLABLE RRII */ /*NamedSequences */ static const MVMint32 uni_seq_1448[] = {2,0xBB1,0xBCA}; /* TAMIL SYLLABLE RRO */ /*NamedSequences */ static const MVMint32 uni_seq_1449[] = {2,0xBB1,0xBCB}; /* TAMIL SYLLABLE RROO */ /*NamedSequences */ static const MVMint32 uni_seq_1450[] = {2,0xBB1,0xBC1}; /* TAMIL SYLLABLE RRU */ /*NamedSequences */ static const MVMint32 uni_seq_1451[] = {2,0xBB1,0xBC2}; /* TAMIL SYLLABLE RRUU */ /*NamedSequences */ static const MVMint32 uni_seq_1452[] = {2,0xBB0,0xBC1}; /* TAMIL SYLLABLE RU */ /*NamedSequences */ static const MVMint32 uni_seq_1453[] = {2,0xBB0,0xBC2}; /* TAMIL SYLLABLE RUU */ /*NamedSequences */ static const MVMint32 uni_seq_1454[] = {2,0xBB8,0xBBE}; /* TAMIL SYLLABLE SAA */ /*NamedSequences */ static const MVMint32 uni_seq_1455[] = {2,0xBB8,0xBC8}; /* TAMIL SYLLABLE SAI */ /*NamedSequences */ static const MVMint32 uni_seq_1456[] = {2,0xBB8,0xBCC}; /* TAMIL SYLLABLE SAU */ /*NamedSequences */ static const MVMint32 uni_seq_1457[] = {2,0xBB8,0xBC6}; /* TAMIL SYLLABLE SE */ /*NamedSequences */ static const MVMint32 uni_seq_1458[] = {2,0xBB8,0xBC7}; /* TAMIL SYLLABLE SEE */ /*NamedSequences */ static const MVMint32 uni_seq_1459[] = {2,0xBB6,0xBBE}; /* TAMIL SYLLABLE SHAA */ /*NamedSequences */ static const MVMint32 uni_seq_1460[] = {2,0xBB6,0xBC8}; /* TAMIL SYLLABLE SHAI */ /*NamedSequences */ static const MVMint32 uni_seq_1461[] = {2,0xBB6,0xBCC}; /* TAMIL SYLLABLE SHAU */ /*NamedSequences */ static const MVMint32 uni_seq_1462[] = {2,0xBB6,0xBC6}; /* TAMIL SYLLABLE SHE */ /*NamedSequences */ static const MVMint32 uni_seq_1463[] = {2,0xBB6,0xBC7}; /* TAMIL SYLLABLE SHEE */ /*NamedSequences */ static const MVMint32 uni_seq_1464[] = {2,0xBB6,0xBBF}; /* TAMIL SYLLABLE SHI */ /*NamedSequences */ static const MVMint32 uni_seq_1465[] = {2,0xBB6,0xBC0}; /* TAMIL SYLLABLE SHII */ /*NamedSequences */ static const MVMint32 uni_seq_1466[] = {2,0xBB6,0xBCA}; /* TAMIL SYLLABLE SHO */ /*NamedSequences */ static const MVMint32 uni_seq_1467[] = {2,0xBB6,0xBCB}; /* TAMIL SYLLABLE SHOO */ /*NamedSequences */ static const MVMint32 uni_seq_1468[] = {4,0xBB6,0xBCD,0xBB0,0xBC0}; /* TAMIL SYLLABLE SHRII */ /*NamedSequences */ static const MVMint32 uni_seq_1469[] = {2,0xBB6,0xBC1}; /* TAMIL SYLLABLE SHU */ /*NamedSequences */ static const MVMint32 uni_seq_1470[] = {2,0xBB6,0xBC2}; /* TAMIL SYLLABLE SHUU */ /*NamedSequences */ static const MVMint32 uni_seq_1471[] = {2,0xBB8,0xBBF}; /* TAMIL SYLLABLE SI */ /*NamedSequences */ static const MVMint32 uni_seq_1472[] = {2,0xBB8,0xBC0}; /* TAMIL SYLLABLE SII */ /*NamedSequences */ static const MVMint32 uni_seq_1473[] = {2,0xBB8,0xBCA}; /* TAMIL SYLLABLE SO */ /*NamedSequences */ static const MVMint32 uni_seq_1474[] = {2,0xBB8,0xBCB}; /* TAMIL SYLLABLE SOO */ /*NamedSequences */ static const MVMint32 uni_seq_1475[] = {2,0xBB7,0xBBE}; /* TAMIL SYLLABLE SSAA */ /*NamedSequences */ static const MVMint32 uni_seq_1476[] = {2,0xBB7,0xBC8}; /* TAMIL SYLLABLE SSAI */ /*NamedSequences */ static const MVMint32 uni_seq_1477[] = {2,0xBB7,0xBCC}; /* TAMIL SYLLABLE SSAU */ /*NamedSequences */ static const MVMint32 uni_seq_1478[] = {2,0xBB7,0xBC6}; /* TAMIL SYLLABLE SSE */ /*NamedSequences */ static const MVMint32 uni_seq_1479[] = {2,0xBB7,0xBC7}; /* TAMIL SYLLABLE SSEE */ /*NamedSequences */ static const MVMint32 uni_seq_1480[] = {2,0xBB7,0xBBF}; /* TAMIL SYLLABLE SSI */ /*NamedSequences */ static const MVMint32 uni_seq_1481[] = {2,0xBB7,0xBC0}; /* TAMIL SYLLABLE SSII */ /*NamedSequences */ static const MVMint32 uni_seq_1482[] = {2,0xBB7,0xBCA}; /* TAMIL SYLLABLE SSO */ /*NamedSequences */ static const MVMint32 uni_seq_1483[] = {2,0xBB7,0xBCB}; /* TAMIL SYLLABLE SSOO */ /*NamedSequences */ static const MVMint32 uni_seq_1484[] = {2,0xBB7,0xBC1}; /* TAMIL SYLLABLE SSU */ /*NamedSequences */ static const MVMint32 uni_seq_1485[] = {2,0xBB7,0xBC2}; /* TAMIL SYLLABLE SSUU */ /*NamedSequences */ static const MVMint32 uni_seq_1486[] = {2,0xBB8,0xBC1}; /* TAMIL SYLLABLE SU */ /*NamedSequences */ static const MVMint32 uni_seq_1487[] = {2,0xBB8,0xBC2}; /* TAMIL SYLLABLE SUU */ /*NamedSequences */ static const MVMint32 uni_seq_1488[] = {2,0xBA4,0xBBE}; /* TAMIL SYLLABLE TAA */ /*NamedSequences */ static const MVMint32 uni_seq_1489[] = {2,0xBA4,0xBC8}; /* TAMIL SYLLABLE TAI */ /*NamedSequences */ static const MVMint32 uni_seq_1490[] = {2,0xBA4,0xBCC}; /* TAMIL SYLLABLE TAU */ /*NamedSequences */ static const MVMint32 uni_seq_1491[] = {2,0xBA4,0xBC6}; /* TAMIL SYLLABLE TE */ /*NamedSequences */ static const MVMint32 uni_seq_1492[] = {2,0xBA4,0xBC7}; /* TAMIL SYLLABLE TEE */ /*NamedSequences */ static const MVMint32 uni_seq_1493[] = {2,0xBA4,0xBBF}; /* TAMIL SYLLABLE TI */ /*NamedSequences */ static const MVMint32 uni_seq_1494[] = {2,0xBA4,0xBC0}; /* TAMIL SYLLABLE TII */ /*NamedSequences */ static const MVMint32 uni_seq_1495[] = {2,0xBA4,0xBCA}; /* TAMIL SYLLABLE TO */ /*NamedSequences */ static const MVMint32 uni_seq_1496[] = {2,0xBA4,0xBCB}; /* TAMIL SYLLABLE TOO */ /*NamedSequences */ static const MVMint32 uni_seq_1497[] = {2,0xB9F,0xBBE}; /* TAMIL SYLLABLE TTAA */ /*NamedSequences */ static const MVMint32 uni_seq_1498[] = {2,0xB9F,0xBC8}; /* TAMIL SYLLABLE TTAI */ /*NamedSequences */ static const MVMint32 uni_seq_1499[] = {2,0xB9F,0xBCC}; /* TAMIL SYLLABLE TTAU */ /*NamedSequences */ static const MVMint32 uni_seq_1500[] = {2,0xB9F,0xBC6}; /* TAMIL SYLLABLE TTE */ /*NamedSequences */ static const MVMint32 uni_seq_1501[] = {2,0xB9F,0xBC7}; /* TAMIL SYLLABLE TTEE */ /*NamedSequences */ static const MVMint32 uni_seq_1502[] = {2,0xB9F,0xBBF}; /* TAMIL SYLLABLE TTI */ /*NamedSequences */ static const MVMint32 uni_seq_1503[] = {2,0xB9F,0xBC0}; /* TAMIL SYLLABLE TTII */ /*NamedSequences */ static const MVMint32 uni_seq_1504[] = {2,0xB9F,0xBCA}; /* TAMIL SYLLABLE TTO */ /*NamedSequences */ static const MVMint32 uni_seq_1505[] = {2,0xB9F,0xBCB}; /* TAMIL SYLLABLE TTOO */ /*NamedSequences */ static const MVMint32 uni_seq_1506[] = {2,0xB9F,0xBC1}; /* TAMIL SYLLABLE TTU */ /*NamedSequences */ static const MVMint32 uni_seq_1507[] = {2,0xB9F,0xBC2}; /* TAMIL SYLLABLE TTUU */ /*NamedSequences */ static const MVMint32 uni_seq_1508[] = {2,0xBA4,0xBC1}; /* TAMIL SYLLABLE TU */ /*NamedSequences */ static const MVMint32 uni_seq_1509[] = {2,0xBA4,0xBC2}; /* TAMIL SYLLABLE TUU */ /*NamedSequences */ static const MVMint32 uni_seq_1510[] = {2,0xBB5,0xBBE}; /* TAMIL SYLLABLE VAA */ /*NamedSequences */ static const MVMint32 uni_seq_1511[] = {2,0xBB5,0xBC8}; /* TAMIL SYLLABLE VAI */ /*NamedSequences */ static const MVMint32 uni_seq_1512[] = {2,0xBB5,0xBCC}; /* TAMIL SYLLABLE VAU */ /*NamedSequences */ static const MVMint32 uni_seq_1513[] = {2,0xBB5,0xBC6}; /* TAMIL SYLLABLE VE */ /*NamedSequences */ static const MVMint32 uni_seq_1514[] = {2,0xBB5,0xBC7}; /* TAMIL SYLLABLE VEE */ /*NamedSequences */ static const MVMint32 uni_seq_1515[] = {2,0xBB5,0xBBF}; /* TAMIL SYLLABLE VI */ /*NamedSequences */ static const MVMint32 uni_seq_1516[] = {2,0xBB5,0xBC0}; /* TAMIL SYLLABLE VII */ /*NamedSequences */ static const MVMint32 uni_seq_1517[] = {2,0xBB5,0xBCA}; /* TAMIL SYLLABLE VO */ /*NamedSequences */ static const MVMint32 uni_seq_1518[] = {2,0xBB5,0xBCB}; /* TAMIL SYLLABLE VOO */ /*NamedSequences */ static const MVMint32 uni_seq_1519[] = {2,0xBB5,0xBC1}; /* TAMIL SYLLABLE VU */ /*NamedSequences */ static const MVMint32 uni_seq_1520[] = {2,0xBB5,0xBC2}; /* TAMIL SYLLABLE VUU */ /*NamedSequences */ static const MVMint32 uni_seq_1521[] = {2,0xBAF,0xBBE}; /* TAMIL SYLLABLE YAA */ /*NamedSequences */ static const MVMint32 uni_seq_1522[] = {2,0xBAF,0xBC8}; /* TAMIL SYLLABLE YAI */ /*NamedSequences */ static const MVMint32 uni_seq_1523[] = {2,0xBAF,0xBCC}; /* TAMIL SYLLABLE YAU */ /*NamedSequences */ static const MVMint32 uni_seq_1524[] = {2,0xBAF,0xBC6}; /* TAMIL SYLLABLE YE */ /*NamedSequences */ static const MVMint32 uni_seq_1525[] = {2,0xBAF,0xBC7}; /* TAMIL SYLLABLE YEE */ /*NamedSequences */ static const MVMint32 uni_seq_1526[] = {2,0xBAF,0xBBF}; /* TAMIL SYLLABLE YI */ /*NamedSequences */ static const MVMint32 uni_seq_1527[] = {2,0xBAF,0xBC0}; /* TAMIL SYLLABLE YII */ /*NamedSequences */ static const MVMint32 uni_seq_1528[] = {2,0xBAF,0xBCA}; /* TAMIL SYLLABLE YO */ /*NamedSequences */ static const MVMint32 uni_seq_1529[] = {2,0xBAF,0xBCB}; /* TAMIL SYLLABLE YOO */ /*NamedSequences */ static const MVMint32 uni_seq_1530[] = {2,0xBAF,0xBC1}; /* TAMIL SYLLABLE YU */ /*NamedSequences */ static const MVMint32 uni_seq_1531[] = {2,0xBAF,0xBC2}; /* TAMIL SYLLABLE YUU */ /*NamedSequences */ static const MVMint32 uni_seq_1532[] = {2,0x1F1F9,0x1F1FF}; /* TANZANIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1533[] = {2,0x1F1F9,0x1F1ED}; /* THAILAND */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1534[] = {2,0x1F44E,0x1F3FF}; /* THUMBS DOWN: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1535[] = {2,0x1F44E,0x1F3FB}; /* THUMBS DOWN: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1536[] = {2,0x1F44E,0x1F3FD}; /* THUMBS DOWN: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1537[] = {2,0x1F44E,0x1F3FE}; /* THUMBS DOWN: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1538[] = {2,0x1F44E,0x1F3FC}; /* THUMBS DOWN: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1539[] = {2,0x1F44D,0x1F3FF}; /* THUMBS UP: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1540[] = {2,0x1F44D,0x1F3FB}; /* THUMBS UP: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1541[] = {2,0x1F44D,0x1F3FD}; /* THUMBS UP: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1542[] = {2,0x1F44D,0x1F3FE}; /* THUMBS UP: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1543[] = {2,0x1F44D,0x1F3FC}; /* THUMBS UP: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1544[] = {2,0x1F1F9,0x1F1F1}; /* TIMOR-LESTE */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1545[] = {2,0x1F1F9,0x1F1EC}; /* TOGO */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1546[] = {2,0x1F1F9,0x1F1F0}; /* TOKELAU */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1547[] = {2,0x1F1F9,0x1F1F4}; /* TONGA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1548[] = {2,0x1F1F9,0x1F1F9}; /* TRINIDAD & TOBAGO */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1549[] = {2,0x1F1F9,0x1F1E6}; /* TRISTAN DA CUNHA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1550[] = {2,0x1F1F9,0x1F1F3}; /* TUNISIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1551[] = {2,0x1F1F9,0x1F1F7}; /* TURKEY */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1552[] = {2,0x1F1F9,0x1F1F2}; /* TURKMENISTAN */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1553[] = {2,0x1F1F9,0x1F1E8}; /* TURKS & CAICOS ISLANDS */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1554[] = {2,0x1F1F9,0x1F1FB}; /* TUVALU */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1555[] = {2,0x1F1FA,0x1F1F2}; /* U.S. OUTLYING ISLANDS */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1556[] = {2,0x1F1FB,0x1F1EE}; /* U.S. VIRGIN ISLANDS */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1557[] = {2,0x1F1FA,0x1F1EC}; /* UGANDA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1558[] = {2,0x1F1FA,0x1F1E6}; /* UKRAINE */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1559[] = {2,0x1F1E6,0x1F1EA}; /* UNITED ARAB EMIRATES */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1560[] = {2,0x1F1EC,0x1F1E7}; /* UNITED KINGDOM */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1561[] = {2,0x1F1FA,0x1F1F3}; /* UNITED NATIONS */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1562[] = {2,0x1F1FA,0x1F1F8}; /* UNITED STATES */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1563[] = {2,0x1F1FA,0x1F1FE}; /* URUGUAY */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1564[] = {2,0x1F1FA,0x1F1FF}; /* UZBEKISTAN */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1565[] = {2,0x1F9DB,0x1F3FF}; /* VAMPIRE: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1566[] = {2,0x1F9DB,0x1F3FB}; /* VAMPIRE: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1567[] = {2,0x1F9DB,0x1F3FD}; /* VAMPIRE: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1568[] = {2,0x1F9DB,0x1F3FE}; /* VAMPIRE: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1569[] = {2,0x1F9DB,0x1F3FC}; /* VAMPIRE: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1570[] = {2,0x1F1FB,0x1F1FA}; /* VANUATU */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1571[] = {2,0x1F1FB,0x1F1E6}; /* VATICAN CITY */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1572[] = {2,0x1F1FB,0x1F1EA}; /* VENEZUELA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1573[] = {2,0x270C,0x1F3FF}; /* VICTORY HAND: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1574[] = {2,0x270C,0x1F3FB}; /* VICTORY HAND: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1575[] = {2,0x270C,0x1F3FD}; /* VICTORY HAND: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1576[] = {2,0x270C,0x1F3FE}; /* VICTORY HAND: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1577[] = {2,0x270C,0x1F3FC}; /* VICTORY HAND: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1578[] = {2,0x1F1FB,0x1F1F3}; /* VIETNAM */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1579[] = {2,0x1F596,0x1F3FF}; /* VULCAN SALUTE: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1580[] = {2,0x1F596,0x1F3FB}; /* VULCAN SALUTE: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1581[] = {2,0x1F596,0x1F3FD}; /* VULCAN SALUTE: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1582[] = {2,0x1F596,0x1F3FE}; /* VULCAN SALUTE: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1583[] = {2,0x1F596,0x1F3FC}; /* VULCAN SALUTE: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1584[] = {7,0x1F3F4,0xE0067,0xE0062,0xE0077,0xE006C,0xE0073,0xE007F}; /* WALES */ /*Emoji_Tag_Sequence */ static const MVMint32 uni_seq_1585[] = {2,0x1F1FC,0x1F1EB}; /* WALLIS & FUTUNA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1586[] = {2,0x1F44B,0x1F3FF}; /* WAVING HAND: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1587[] = {2,0x1F44B,0x1F3FB}; /* WAVING HAND: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1588[] = {2,0x1F44B,0x1F3FD}; /* WAVING HAND: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1589[] = {2,0x1F44B,0x1F3FE}; /* WAVING HAND: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1590[] = {2,0x1F44B,0x1F3FC}; /* WAVING HAND: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1591[] = {2,0x1F1EA,0x1F1ED}; /* WESTERN SAHARA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1592[] = {3,0x1F469,0x200D,0x1F3A8}; /* WOMAN ARTIST */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1593[] = {4,0x1F469,0x1F3FF,0x200D,0x1F3A8}; /* WOMAN ARTIST: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1594[] = {4,0x1F469,0x1F3FB,0x200D,0x1F3A8}; /* WOMAN ARTIST: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1595[] = {4,0x1F469,0x1F3FD,0x200D,0x1F3A8}; /* WOMAN ARTIST: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1596[] = {4,0x1F469,0x1F3FE,0x200D,0x1F3A8}; /* WOMAN ARTIST: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1597[] = {4,0x1F469,0x1F3FC,0x200D,0x1F3A8}; /* WOMAN ARTIST: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1598[] = {3,0x1F469,0x200D,0x1F680}; /* WOMAN ASTRONAUT */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1599[] = {4,0x1F469,0x1F3FF,0x200D,0x1F680}; /* WOMAN ASTRONAUT: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1600[] = {4,0x1F469,0x1F3FB,0x200D,0x1F680}; /* WOMAN ASTRONAUT: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1601[] = {4,0x1F469,0x1F3FD,0x200D,0x1F680}; /* WOMAN ASTRONAUT: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1602[] = {4,0x1F469,0x1F3FE,0x200D,0x1F680}; /* WOMAN ASTRONAUT: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1603[] = {4,0x1F469,0x1F3FC,0x200D,0x1F680}; /* WOMAN ASTRONAUT: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1604[] = {4,0x1F6B4,0x200D,0x2640,0xFE0F}; /* WOMAN BIKING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1605[] = {5,0x1F6B4,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN BIKING: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1606[] = {5,0x1F6B4,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN BIKING: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1607[] = {5,0x1F6B4,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN BIKING: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1608[] = {5,0x1F6B4,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN BIKING: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1609[] = {5,0x1F6B4,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN BIKING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1610[] = {5,0x26F9,0xFE0F,0x200D,0x2640,0xFE0F}; /* WOMAN BOUNCING BALL */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1611[] = {5,0x26F9,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN BOUNCING BALL: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1612[] = {5,0x26F9,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN BOUNCING BALL: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1613[] = {5,0x26F9,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN BOUNCING BALL: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1614[] = {5,0x26F9,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN BOUNCING BALL: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1615[] = {5,0x26F9,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN BOUNCING BALL: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1616[] = {4,0x1F647,0x200D,0x2640,0xFE0F}; /* WOMAN BOWING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1617[] = {5,0x1F647,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN BOWING: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1618[] = {5,0x1F647,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN BOWING: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1619[] = {5,0x1F647,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN BOWING: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1620[] = {5,0x1F647,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN BOWING: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1621[] = {5,0x1F647,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN BOWING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1622[] = {4,0x1F938,0x200D,0x2640,0xFE0F}; /* WOMAN CARTWHEELING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1623[] = {5,0x1F938,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN CARTWHEELING: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1624[] = {5,0x1F938,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN CARTWHEELING: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1625[] = {5,0x1F938,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN CARTWHEELING: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1626[] = {5,0x1F938,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN CARTWHEELING: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1627[] = {5,0x1F938,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN CARTWHEELING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1628[] = {4,0x1F9D7,0x200D,0x2640,0xFE0F}; /* WOMAN CLIMBING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1629[] = {5,0x1F9D7,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN CLIMBING: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1630[] = {5,0x1F9D7,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN CLIMBING: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1631[] = {5,0x1F9D7,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN CLIMBING: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1632[] = {5,0x1F9D7,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN CLIMBING: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1633[] = {5,0x1F9D7,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN CLIMBING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1634[] = {4,0x1F477,0x200D,0x2640,0xFE0F}; /* WOMAN CONSTRUCTION WORKER */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1635[] = {5,0x1F477,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN CONSTRUCTION WORKER: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1636[] = {5,0x1F477,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN CONSTRUCTION WORKER: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1637[] = {5,0x1F477,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN CONSTRUCTION WORKER: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1638[] = {5,0x1F477,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN CONSTRUCTION WORKER: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1639[] = {5,0x1F477,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN CONSTRUCTION WORKER: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1640[] = {3,0x1F469,0x200D,0x1F373}; /* WOMAN COOK */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1641[] = {4,0x1F469,0x1F3FF,0x200D,0x1F373}; /* WOMAN COOK: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1642[] = {4,0x1F469,0x1F3FB,0x200D,0x1F373}; /* WOMAN COOK: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1643[] = {4,0x1F469,0x1F3FD,0x200D,0x1F373}; /* WOMAN COOK: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1644[] = {4,0x1F469,0x1F3FE,0x200D,0x1F373}; /* WOMAN COOK: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1645[] = {4,0x1F469,0x1F3FC,0x200D,0x1F373}; /* WOMAN COOK: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1646[] = {2,0x1F483,0x1F3FF}; /* WOMAN DANCING: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1647[] = {2,0x1F483,0x1F3FB}; /* WOMAN DANCING: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1648[] = {2,0x1F483,0x1F3FD}; /* WOMAN DANCING: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1649[] = {2,0x1F483,0x1F3FE}; /* WOMAN DANCING: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1650[] = {2,0x1F483,0x1F3FC}; /* WOMAN DANCING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1651[] = {5,0x1F575,0xFE0F,0x200D,0x2640,0xFE0F}; /* WOMAN DETECTIVE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1652[] = {5,0x1F575,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN DETECTIVE: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1653[] = {5,0x1F575,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN DETECTIVE: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1654[] = {5,0x1F575,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN DETECTIVE: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1655[] = {5,0x1F575,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN DETECTIVE: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1656[] = {5,0x1F575,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN DETECTIVE: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1657[] = {4,0x1F9DD,0x200D,0x2640,0xFE0F}; /* WOMAN ELF */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1658[] = {5,0x1F9DD,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN ELF: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1659[] = {5,0x1F9DD,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN ELF: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1660[] = {5,0x1F9DD,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN ELF: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1661[] = {5,0x1F9DD,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN ELF: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1662[] = {5,0x1F9DD,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN ELF: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1663[] = {4,0x1F926,0x200D,0x2640,0xFE0F}; /* WOMAN FACEPALMING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1664[] = {5,0x1F926,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN FACEPALMING: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1665[] = {5,0x1F926,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN FACEPALMING: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1666[] = {5,0x1F926,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN FACEPALMING: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1667[] = {5,0x1F926,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN FACEPALMING: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1668[] = {5,0x1F926,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN FACEPALMING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1669[] = {3,0x1F469,0x200D,0x1F3ED}; /* WOMAN FACTORY WORKER */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1670[] = {4,0x1F469,0x1F3FF,0x200D,0x1F3ED}; /* WOMAN FACTORY WORKER: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1671[] = {4,0x1F469,0x1F3FB,0x200D,0x1F3ED}; /* WOMAN FACTORY WORKER: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1672[] = {4,0x1F469,0x1F3FD,0x200D,0x1F3ED}; /* WOMAN FACTORY WORKER: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1673[] = {4,0x1F469,0x1F3FE,0x200D,0x1F3ED}; /* WOMAN FACTORY WORKER: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1674[] = {4,0x1F469,0x1F3FC,0x200D,0x1F3ED}; /* WOMAN FACTORY WORKER: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1675[] = {4,0x1F9DA,0x200D,0x2640,0xFE0F}; /* WOMAN FAIRY */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1676[] = {5,0x1F9DA,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN FAIRY: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1677[] = {5,0x1F9DA,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN FAIRY: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1678[] = {5,0x1F9DA,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN FAIRY: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1679[] = {5,0x1F9DA,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN FAIRY: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1680[] = {5,0x1F9DA,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN FAIRY: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1681[] = {3,0x1F469,0x200D,0x1F33E}; /* WOMAN FARMER */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1682[] = {4,0x1F469,0x1F3FF,0x200D,0x1F33E}; /* WOMAN FARMER: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1683[] = {4,0x1F469,0x1F3FB,0x200D,0x1F33E}; /* WOMAN FARMER: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1684[] = {4,0x1F469,0x1F3FD,0x200D,0x1F33E}; /* WOMAN FARMER: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1685[] = {4,0x1F469,0x1F3FE,0x200D,0x1F33E}; /* WOMAN FARMER: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1686[] = {4,0x1F469,0x1F3FC,0x200D,0x1F33E}; /* WOMAN FARMER: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1687[] = {3,0x1F469,0x200D,0x1F692}; /* WOMAN FIREFIGHTER */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1688[] = {4,0x1F469,0x1F3FF,0x200D,0x1F692}; /* WOMAN FIREFIGHTER: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1689[] = {4,0x1F469,0x1F3FB,0x200D,0x1F692}; /* WOMAN FIREFIGHTER: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1690[] = {4,0x1F469,0x1F3FD,0x200D,0x1F692}; /* WOMAN FIREFIGHTER: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1691[] = {4,0x1F469,0x1F3FE,0x200D,0x1F692}; /* WOMAN FIREFIGHTER: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1692[] = {4,0x1F469,0x1F3FC,0x200D,0x1F692}; /* WOMAN FIREFIGHTER: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1693[] = {4,0x1F64D,0x200D,0x2640,0xFE0F}; /* WOMAN FROWNING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1694[] = {5,0x1F64D,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN FROWNING: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1695[] = {5,0x1F64D,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN FROWNING: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1696[] = {5,0x1F64D,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN FROWNING: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1697[] = {5,0x1F64D,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN FROWNING: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1698[] = {5,0x1F64D,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN FROWNING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1699[] = {4,0x1F9DE,0x200D,0x2640,0xFE0F}; /* WOMAN GENIE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1700[] = {4,0x1F645,0x200D,0x2640,0xFE0F}; /* WOMAN GESTURING NO */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1701[] = {5,0x1F645,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN GESTURING NO: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1702[] = {5,0x1F645,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN GESTURING NO: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1703[] = {5,0x1F645,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN GESTURING NO: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1704[] = {5,0x1F645,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN GESTURING NO: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1705[] = {5,0x1F645,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN GESTURING NO: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1706[] = {4,0x1F646,0x200D,0x2640,0xFE0F}; /* WOMAN GESTURING OK */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1707[] = {5,0x1F646,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN GESTURING OK: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1708[] = {5,0x1F646,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN GESTURING OK: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1709[] = {5,0x1F646,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN GESTURING OK: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1710[] = {5,0x1F646,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN GESTURING OK: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1711[] = {5,0x1F646,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN GESTURING OK: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1712[] = {4,0x1F487,0x200D,0x2640,0xFE0F}; /* WOMAN GETTING HAIRCUT */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1713[] = {5,0x1F487,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN GETTING HAIRCUT: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1714[] = {5,0x1F487,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN GETTING HAIRCUT: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1715[] = {5,0x1F487,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN GETTING HAIRCUT: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1716[] = {5,0x1F487,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN GETTING HAIRCUT: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1717[] = {5,0x1F487,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN GETTING HAIRCUT: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1718[] = {4,0x1F486,0x200D,0x2640,0xFE0F}; /* WOMAN GETTING MASSAGE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1719[] = {5,0x1F486,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN GETTING MASSAGE: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1720[] = {5,0x1F486,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN GETTING MASSAGE: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1721[] = {5,0x1F486,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN GETTING MASSAGE: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1722[] = {5,0x1F486,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN GETTING MASSAGE: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1723[] = {5,0x1F486,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN GETTING MASSAGE: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1724[] = {5,0x1F3CC,0xFE0F,0x200D,0x2640,0xFE0F}; /* WOMAN GOLFING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1725[] = {5,0x1F3CC,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN GOLFING: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1726[] = {5,0x1F3CC,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN GOLFING: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1727[] = {5,0x1F3CC,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN GOLFING: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1728[] = {5,0x1F3CC,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN GOLFING: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1729[] = {5,0x1F3CC,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN GOLFING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1730[] = {4,0x1F482,0x200D,0x2640,0xFE0F}; /* WOMAN GUARD */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1731[] = {5,0x1F482,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN GUARD: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1732[] = {5,0x1F482,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN GUARD: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1733[] = {5,0x1F482,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN GUARD: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1734[] = {5,0x1F482,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN GUARD: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1735[] = {5,0x1F482,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN GUARD: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1736[] = {4,0x1F469,0x200D,0x2695,0xFE0F}; /* WOMAN HEALTH WORKER */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1737[] = {5,0x1F469,0x1F3FF,0x200D,0x2695,0xFE0F}; /* WOMAN HEALTH WORKER: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1738[] = {5,0x1F469,0x1F3FB,0x200D,0x2695,0xFE0F}; /* WOMAN HEALTH WORKER: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1739[] = {5,0x1F469,0x1F3FD,0x200D,0x2695,0xFE0F}; /* WOMAN HEALTH WORKER: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1740[] = {5,0x1F469,0x1F3FE,0x200D,0x2695,0xFE0F}; /* WOMAN HEALTH WORKER: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1741[] = {5,0x1F469,0x1F3FC,0x200D,0x2695,0xFE0F}; /* WOMAN HEALTH WORKER: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1742[] = {4,0x1F9D8,0x200D,0x2640,0xFE0F}; /* WOMAN IN LOTUS POSITION */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1743[] = {5,0x1F9D8,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN IN LOTUS POSITION: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1744[] = {5,0x1F9D8,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN IN LOTUS POSITION: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1745[] = {5,0x1F9D8,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN IN LOTUS POSITION: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1746[] = {5,0x1F9D8,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN IN LOTUS POSITION: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1747[] = {5,0x1F9D8,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN IN LOTUS POSITION: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1748[] = {4,0x1F9D6,0x200D,0x2640,0xFE0F}; /* WOMAN IN STEAMY ROOM */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1749[] = {5,0x1F9D6,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN IN STEAMY ROOM: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1750[] = {5,0x1F9D6,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN IN STEAMY ROOM: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1751[] = {5,0x1F9D6,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN IN STEAMY ROOM: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1752[] = {5,0x1F9D6,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN IN STEAMY ROOM: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1753[] = {5,0x1F9D6,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN IN STEAMY ROOM: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1754[] = {4,0x1F469,0x200D,0x2696,0xFE0F}; /* WOMAN JUDGE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1755[] = {5,0x1F469,0x1F3FF,0x200D,0x2696,0xFE0F}; /* WOMAN JUDGE: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1756[] = {5,0x1F469,0x1F3FB,0x200D,0x2696,0xFE0F}; /* WOMAN JUDGE: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1757[] = {5,0x1F469,0x1F3FD,0x200D,0x2696,0xFE0F}; /* WOMAN JUDGE: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1758[] = {5,0x1F469,0x1F3FE,0x200D,0x2696,0xFE0F}; /* WOMAN JUDGE: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1759[] = {5,0x1F469,0x1F3FC,0x200D,0x2696,0xFE0F}; /* WOMAN JUDGE: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1760[] = {4,0x1F939,0x200D,0x2640,0xFE0F}; /* WOMAN JUGGLING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1761[] = {5,0x1F939,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN JUGGLING: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1762[] = {5,0x1F939,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN JUGGLING: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1763[] = {5,0x1F939,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN JUGGLING: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1764[] = {5,0x1F939,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN JUGGLING: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1765[] = {5,0x1F939,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN JUGGLING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1766[] = {5,0x1F3CB,0xFE0F,0x200D,0x2640,0xFE0F}; /* WOMAN LIFTING WEIGHTS */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1767[] = {5,0x1F3CB,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN LIFTING WEIGHTS: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1768[] = {5,0x1F3CB,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN LIFTING WEIGHTS: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1769[] = {5,0x1F3CB,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN LIFTING WEIGHTS: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1770[] = {5,0x1F3CB,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN LIFTING WEIGHTS: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1771[] = {5,0x1F3CB,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN LIFTING WEIGHTS: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1772[] = {4,0x1F9D9,0x200D,0x2640,0xFE0F}; /* WOMAN MAGE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1773[] = {5,0x1F9D9,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN MAGE: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1774[] = {5,0x1F9D9,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN MAGE: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1775[] = {5,0x1F9D9,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN MAGE: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1776[] = {5,0x1F9D9,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN MAGE: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1777[] = {5,0x1F9D9,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN MAGE: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1778[] = {3,0x1F469,0x200D,0x1F527}; /* WOMAN MECHANIC */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1779[] = {4,0x1F469,0x1F3FF,0x200D,0x1F527}; /* WOMAN MECHANIC: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1780[] = {4,0x1F469,0x1F3FB,0x200D,0x1F527}; /* WOMAN MECHANIC: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1781[] = {4,0x1F469,0x1F3FD,0x200D,0x1F527}; /* WOMAN MECHANIC: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1782[] = {4,0x1F469,0x1F3FE,0x200D,0x1F527}; /* WOMAN MECHANIC: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1783[] = {4,0x1F469,0x1F3FC,0x200D,0x1F527}; /* WOMAN MECHANIC: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1784[] = {4,0x1F6B5,0x200D,0x2640,0xFE0F}; /* WOMAN MOUNTAIN BIKING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1785[] = {5,0x1F6B5,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN MOUNTAIN BIKING: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1786[] = {5,0x1F6B5,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN MOUNTAIN BIKING: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1787[] = {5,0x1F6B5,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN MOUNTAIN BIKING: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1788[] = {5,0x1F6B5,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN MOUNTAIN BIKING: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1789[] = {5,0x1F6B5,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN MOUNTAIN BIKING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1790[] = {3,0x1F469,0x200D,0x1F4BC}; /* WOMAN OFFICE WORKER */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1791[] = {4,0x1F469,0x1F3FF,0x200D,0x1F4BC}; /* WOMAN OFFICE WORKER: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1792[] = {4,0x1F469,0x1F3FB,0x200D,0x1F4BC}; /* WOMAN OFFICE WORKER: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1793[] = {4,0x1F469,0x1F3FD,0x200D,0x1F4BC}; /* WOMAN OFFICE WORKER: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1794[] = {4,0x1F469,0x1F3FE,0x200D,0x1F4BC}; /* WOMAN OFFICE WORKER: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1795[] = {4,0x1F469,0x1F3FC,0x200D,0x1F4BC}; /* WOMAN OFFICE WORKER: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1796[] = {4,0x1F469,0x200D,0x2708,0xFE0F}; /* WOMAN PILOT */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1797[] = {5,0x1F469,0x1F3FF,0x200D,0x2708,0xFE0F}; /* WOMAN PILOT: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1798[] = {5,0x1F469,0x1F3FB,0x200D,0x2708,0xFE0F}; /* WOMAN PILOT: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1799[] = {5,0x1F469,0x1F3FD,0x200D,0x2708,0xFE0F}; /* WOMAN PILOT: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1800[] = {5,0x1F469,0x1F3FE,0x200D,0x2708,0xFE0F}; /* WOMAN PILOT: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1801[] = {5,0x1F469,0x1F3FC,0x200D,0x2708,0xFE0F}; /* WOMAN PILOT: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1802[] = {4,0x1F93E,0x200D,0x2640,0xFE0F}; /* WOMAN PLAYING HANDBALL */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1803[] = {5,0x1F93E,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN PLAYING HANDBALL: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1804[] = {5,0x1F93E,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN PLAYING HANDBALL: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1805[] = {5,0x1F93E,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN PLAYING HANDBALL: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1806[] = {5,0x1F93E,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN PLAYING HANDBALL: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1807[] = {5,0x1F93E,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN PLAYING HANDBALL: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1808[] = {4,0x1F93D,0x200D,0x2640,0xFE0F}; /* WOMAN PLAYING WATER POLO */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1809[] = {5,0x1F93D,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN PLAYING WATER POLO: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1810[] = {5,0x1F93D,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN PLAYING WATER POLO: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1811[] = {5,0x1F93D,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN PLAYING WATER POLO: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1812[] = {5,0x1F93D,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN PLAYING WATER POLO: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1813[] = {5,0x1F93D,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN PLAYING WATER POLO: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1814[] = {4,0x1F46E,0x200D,0x2640,0xFE0F}; /* WOMAN POLICE OFFICER */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1815[] = {5,0x1F46E,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN POLICE OFFICER: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1816[] = {5,0x1F46E,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN POLICE OFFICER: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1817[] = {5,0x1F46E,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN POLICE OFFICER: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1818[] = {5,0x1F46E,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN POLICE OFFICER: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1819[] = {5,0x1F46E,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN POLICE OFFICER: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1820[] = {4,0x1F64E,0x200D,0x2640,0xFE0F}; /* WOMAN POUTING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1821[] = {5,0x1F64E,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN POUTING: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1822[] = {5,0x1F64E,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN POUTING: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1823[] = {5,0x1F64E,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN POUTING: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1824[] = {5,0x1F64E,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN POUTING: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1825[] = {5,0x1F64E,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN POUTING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1826[] = {4,0x1F64B,0x200D,0x2640,0xFE0F}; /* WOMAN RAISING HAND */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1827[] = {5,0x1F64B,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN RAISING HAND: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1828[] = {5,0x1F64B,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN RAISING HAND: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1829[] = {5,0x1F64B,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN RAISING HAND: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1830[] = {5,0x1F64B,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN RAISING HAND: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1831[] = {5,0x1F64B,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN RAISING HAND: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1832[] = {4,0x1F6A3,0x200D,0x2640,0xFE0F}; /* WOMAN ROWING BOAT */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1833[] = {5,0x1F6A3,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN ROWING BOAT: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1834[] = {5,0x1F6A3,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN ROWING BOAT: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1835[] = {5,0x1F6A3,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN ROWING BOAT: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1836[] = {5,0x1F6A3,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN ROWING BOAT: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1837[] = {5,0x1F6A3,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN ROWING BOAT: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1838[] = {4,0x1F3C3,0x200D,0x2640,0xFE0F}; /* WOMAN RUNNING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1839[] = {5,0x1F3C3,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN RUNNING: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1840[] = {5,0x1F3C3,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN RUNNING: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1841[] = {5,0x1F3C3,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN RUNNING: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1842[] = {5,0x1F3C3,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN RUNNING: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1843[] = {5,0x1F3C3,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN RUNNING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1844[] = {3,0x1F469,0x200D,0x1F52C}; /* WOMAN SCIENTIST */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1845[] = {4,0x1F469,0x1F3FF,0x200D,0x1F52C}; /* WOMAN SCIENTIST: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1846[] = {4,0x1F469,0x1F3FB,0x200D,0x1F52C}; /* WOMAN SCIENTIST: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1847[] = {4,0x1F469,0x1F3FD,0x200D,0x1F52C}; /* WOMAN SCIENTIST: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1848[] = {4,0x1F469,0x1F3FE,0x200D,0x1F52C}; /* WOMAN SCIENTIST: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1849[] = {4,0x1F469,0x1F3FC,0x200D,0x1F52C}; /* WOMAN SCIENTIST: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1850[] = {4,0x1F937,0x200D,0x2640,0xFE0F}; /* WOMAN SHRUGGING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1851[] = {5,0x1F937,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN SHRUGGING: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1852[] = {5,0x1F937,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN SHRUGGING: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1853[] = {5,0x1F937,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN SHRUGGING: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1854[] = {5,0x1F937,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN SHRUGGING: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1855[] = {5,0x1F937,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN SHRUGGING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1856[] = {3,0x1F469,0x200D,0x1F3A4}; /* WOMAN SINGER */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1857[] = {4,0x1F469,0x1F3FF,0x200D,0x1F3A4}; /* WOMAN SINGER: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1858[] = {4,0x1F469,0x1F3FB,0x200D,0x1F3A4}; /* WOMAN SINGER: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1859[] = {4,0x1F469,0x1F3FD,0x200D,0x1F3A4}; /* WOMAN SINGER: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1860[] = {4,0x1F469,0x1F3FE,0x200D,0x1F3A4}; /* WOMAN SINGER: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1861[] = {4,0x1F469,0x1F3FC,0x200D,0x1F3A4}; /* WOMAN SINGER: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1862[] = {3,0x1F469,0x200D,0x1F393}; /* WOMAN STUDENT */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1863[] = {4,0x1F469,0x1F3FF,0x200D,0x1F393}; /* WOMAN STUDENT: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1864[] = {4,0x1F469,0x1F3FB,0x200D,0x1F393}; /* WOMAN STUDENT: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1865[] = {4,0x1F469,0x1F3FD,0x200D,0x1F393}; /* WOMAN STUDENT: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1866[] = {4,0x1F469,0x1F3FE,0x200D,0x1F393}; /* WOMAN STUDENT: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1867[] = {4,0x1F469,0x1F3FC,0x200D,0x1F393}; /* WOMAN STUDENT: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1868[] = {4,0x1F3C4,0x200D,0x2640,0xFE0F}; /* WOMAN SURFING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1869[] = {5,0x1F3C4,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN SURFING: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1870[] = {5,0x1F3C4,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN SURFING: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1871[] = {5,0x1F3C4,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN SURFING: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1872[] = {5,0x1F3C4,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN SURFING: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1873[] = {5,0x1F3C4,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN SURFING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1874[] = {4,0x1F3CA,0x200D,0x2640,0xFE0F}; /* WOMAN SWIMMING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1875[] = {5,0x1F3CA,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN SWIMMING: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1876[] = {5,0x1F3CA,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN SWIMMING: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1877[] = {5,0x1F3CA,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN SWIMMING: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1878[] = {5,0x1F3CA,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN SWIMMING: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1879[] = {5,0x1F3CA,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN SWIMMING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1880[] = {3,0x1F469,0x200D,0x1F3EB}; /* WOMAN TEACHER */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1881[] = {4,0x1F469,0x1F3FF,0x200D,0x1F3EB}; /* WOMAN TEACHER: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1882[] = {4,0x1F469,0x1F3FB,0x200D,0x1F3EB}; /* WOMAN TEACHER: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1883[] = {4,0x1F469,0x1F3FD,0x200D,0x1F3EB}; /* WOMAN TEACHER: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1884[] = {4,0x1F469,0x1F3FE,0x200D,0x1F3EB}; /* WOMAN TEACHER: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1885[] = {4,0x1F469,0x1F3FC,0x200D,0x1F3EB}; /* WOMAN TEACHER: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1886[] = {3,0x1F469,0x200D,0x1F4BB}; /* WOMAN TECHNOLOGIST */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1887[] = {4,0x1F469,0x1F3FF,0x200D,0x1F4BB}; /* WOMAN TECHNOLOGIST: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1888[] = {4,0x1F469,0x1F3FB,0x200D,0x1F4BB}; /* WOMAN TECHNOLOGIST: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1889[] = {4,0x1F469,0x1F3FD,0x200D,0x1F4BB}; /* WOMAN TECHNOLOGIST: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1890[] = {4,0x1F469,0x1F3FE,0x200D,0x1F4BB}; /* WOMAN TECHNOLOGIST: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1891[] = {4,0x1F469,0x1F3FC,0x200D,0x1F4BB}; /* WOMAN TECHNOLOGIST: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1892[] = {4,0x1F481,0x200D,0x2640,0xFE0F}; /* WOMAN TIPPING HAND */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1893[] = {5,0x1F481,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN TIPPING HAND: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1894[] = {5,0x1F481,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN TIPPING HAND: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1895[] = {5,0x1F481,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN TIPPING HAND: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1896[] = {5,0x1F481,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN TIPPING HAND: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1897[] = {5,0x1F481,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN TIPPING HAND: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1898[] = {4,0x1F9DB,0x200D,0x2640,0xFE0F}; /* WOMAN VAMPIRE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1899[] = {5,0x1F9DB,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN VAMPIRE: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1900[] = {5,0x1F9DB,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN VAMPIRE: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1901[] = {5,0x1F9DB,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN VAMPIRE: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1902[] = {5,0x1F9DB,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN VAMPIRE: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1903[] = {5,0x1F9DB,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN VAMPIRE: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1904[] = {4,0x1F6B6,0x200D,0x2640,0xFE0F}; /* WOMAN WALKING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1905[] = {5,0x1F6B6,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN WALKING: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1906[] = {5,0x1F6B6,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN WALKING: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1907[] = {5,0x1F6B6,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN WALKING: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1908[] = {5,0x1F6B6,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN WALKING: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1909[] = {5,0x1F6B6,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN WALKING: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1910[] = {4,0x1F473,0x200D,0x2640,0xFE0F}; /* WOMAN WEARING TURBAN */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1911[] = {5,0x1F473,0x1F3FF,0x200D,0x2640,0xFE0F}; /* WOMAN WEARING TURBAN: DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1912[] = {5,0x1F473,0x1F3FB,0x200D,0x2640,0xFE0F}; /* WOMAN WEARING TURBAN: LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1913[] = {5,0x1F473,0x1F3FD,0x200D,0x2640,0xFE0F}; /* WOMAN WEARING TURBAN: MEDIUM SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1914[] = {5,0x1F473,0x1F3FE,0x200D,0x2640,0xFE0F}; /* WOMAN WEARING TURBAN: MEDIUM-DARK SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1915[] = {5,0x1F473,0x1F3FC,0x200D,0x2640,0xFE0F}; /* WOMAN WEARING TURBAN: MEDIUM-LIGHT SKIN TONE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1916[] = {2,0x1F9D5,0x1F3FF}; /* WOMAN WITH HEADSCARF: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1917[] = {2,0x1F9D5,0x1F3FB}; /* WOMAN WITH HEADSCARF: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1918[] = {2,0x1F9D5,0x1F3FD}; /* WOMAN WITH HEADSCARF: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1919[] = {2,0x1F9D5,0x1F3FE}; /* WOMAN WITH HEADSCARF: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1920[] = {2,0x1F9D5,0x1F3FC}; /* WOMAN WITH HEADSCARF: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1921[] = {4,0x1F9DF,0x200D,0x2640,0xFE0F}; /* WOMAN ZOMBIE */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1922[] = {2,0x1F469,0x1F3FF}; /* WOMAN: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1923[] = {2,0x1F469,0x1F3FB}; /* WOMAN: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1924[] = {2,0x1F469,0x1F3FD}; /* WOMAN: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1925[] = {2,0x1F469,0x1F3FE}; /* WOMAN: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1926[] = {2,0x1F469,0x1F3FC}; /* WOMAN: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1927[] = {4,0x1F46F,0x200D,0x2640,0xFE0F}; /* WOMEN WITH BUNNY EARS */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1928[] = {4,0x1F46F,0x200D,0x2640,0xFE0F}; /* WOMEN WITH BUNNY EARS PARTYING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1929[] = {4,0x1F93C,0x200D,0x2640,0xFE0F}; /* WOMEN WRESTLING */ /*Emoji_ZWJ_Sequence */ static const MVMint32 uni_seq_1930[] = {2,0x270D,0x1F3FF}; /* WRITING HAND: DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1931[] = {2,0x270D,0x1F3FB}; /* WRITING HAND: LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1932[] = {2,0x270D,0x1F3FD}; /* WRITING HAND: MEDIUM SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1933[] = {2,0x270D,0x1F3FE}; /* WRITING HAND: MEDIUM-DARK SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1934[] = {2,0x270D,0x1F3FC}; /* WRITING HAND: MEDIUM-LIGHT SKIN TONE */ /*Emoji_Modifier_Sequence */ static const MVMint32 uni_seq_1935[] = {2,0x1F1FE,0x1F1EA}; /* YEMEN */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1936[] = {2,0x1F1FF,0x1F1F2}; /* ZAMBIA */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1937[] = {2,0x1F1FF,0x1F1FC}; /* ZIMBABWE */ /*Emoji_Flag_Sequence */ static const MVMint32 uni_seq_1938[] = {2,0x1F1E6,0x1F1FD}; /* Ã…LAND ISLANDS */ /*Emoji_Flag_Sequence */ static const MVMint32 * uni_seq_enum[1939] = { uni_seq_0, uni_seq_1, uni_seq_2, uni_seq_3, uni_seq_4, uni_seq_5, uni_seq_6, uni_seq_7, uni_seq_8, uni_seq_9, uni_seq_10, uni_seq_11, uni_seq_12, uni_seq_13, uni_seq_14, uni_seq_15, uni_seq_16, uni_seq_17, uni_seq_18, uni_seq_19, uni_seq_20, uni_seq_21, uni_seq_22, uni_seq_23, uni_seq_24, uni_seq_25, uni_seq_26, uni_seq_27, uni_seq_28, uni_seq_29, uni_seq_30, uni_seq_31, uni_seq_32, uni_seq_33, uni_seq_34, uni_seq_35, uni_seq_36, uni_seq_37, uni_seq_38, uni_seq_39, uni_seq_40, uni_seq_41, uni_seq_42, uni_seq_43, uni_seq_44, uni_seq_45, uni_seq_46, uni_seq_47, uni_seq_48, uni_seq_49, uni_seq_50, uni_seq_51, uni_seq_52, uni_seq_53, uni_seq_54, uni_seq_55, uni_seq_56, uni_seq_57, uni_seq_58, uni_seq_59, uni_seq_60, uni_seq_61, uni_seq_62, uni_seq_63, uni_seq_64, uni_seq_65, uni_seq_66, uni_seq_67, uni_seq_68, uni_seq_69, uni_seq_70, uni_seq_71, uni_seq_72, uni_seq_73, uni_seq_74, uni_seq_75, uni_seq_76, uni_seq_77, uni_seq_78, uni_seq_79, uni_seq_80, uni_seq_81, uni_seq_82, uni_seq_83, uni_seq_84, uni_seq_85, uni_seq_86, uni_seq_87, uni_seq_88, uni_seq_89, uni_seq_90, uni_seq_91, uni_seq_92, uni_seq_93, uni_seq_94, uni_seq_95, uni_seq_96, uni_seq_97, uni_seq_98, uni_seq_99, uni_seq_100, uni_seq_101, uni_seq_102, uni_seq_103, uni_seq_104, uni_seq_105, uni_seq_106, uni_seq_107, uni_seq_108, uni_seq_109, uni_seq_110, uni_seq_111, uni_seq_112, uni_seq_113, uni_seq_114, uni_seq_115, uni_seq_116, uni_seq_117, uni_seq_118, uni_seq_119, uni_seq_120, uni_seq_121, uni_seq_122, uni_seq_123, uni_seq_124, uni_seq_125, uni_seq_126, uni_seq_127, uni_seq_128, uni_seq_129, uni_seq_130, uni_seq_131, uni_seq_132, uni_seq_133, uni_seq_134, uni_seq_135, uni_seq_136, uni_seq_137, uni_seq_138, uni_seq_139, uni_seq_140, uni_seq_141, uni_seq_142, uni_seq_143, uni_seq_144, uni_seq_145, uni_seq_146, uni_seq_147, uni_seq_148, uni_seq_149, uni_seq_150, uni_seq_151, uni_seq_152, uni_seq_153, uni_seq_154, uni_seq_155, uni_seq_156, uni_seq_157, uni_seq_158, uni_seq_159, uni_seq_160, uni_seq_161, uni_seq_162, uni_seq_163, uni_seq_164, uni_seq_165, uni_seq_166, uni_seq_167, uni_seq_168, uni_seq_169, uni_seq_170, uni_seq_171, uni_seq_172, uni_seq_173, uni_seq_174, uni_seq_175, uni_seq_176, uni_seq_177, uni_seq_178, uni_seq_179, uni_seq_180, uni_seq_181, uni_seq_182, uni_seq_183, uni_seq_184, uni_seq_185, uni_seq_186, uni_seq_187, uni_seq_188, uni_seq_189, uni_seq_190, uni_seq_191, uni_seq_192, uni_seq_193, uni_seq_194, uni_seq_195, uni_seq_196, uni_seq_197, uni_seq_198, uni_seq_199, uni_seq_200, uni_seq_201, uni_seq_202, uni_seq_203, uni_seq_204, uni_seq_205, uni_seq_206, uni_seq_207, uni_seq_208, uni_seq_209, uni_seq_210, uni_seq_211, uni_seq_212, uni_seq_213, uni_seq_214, uni_seq_215, uni_seq_216, uni_seq_217, uni_seq_218, uni_seq_219, uni_seq_220, uni_seq_221, uni_seq_222, uni_seq_223, uni_seq_224, uni_seq_225, uni_seq_226, uni_seq_227, uni_seq_228, uni_seq_229, uni_seq_230, uni_seq_231, uni_seq_232, uni_seq_233, uni_seq_234, uni_seq_235, uni_seq_236, uni_seq_237, uni_seq_238, uni_seq_239, uni_seq_240, uni_seq_241, uni_seq_242, uni_seq_243, uni_seq_244, uni_seq_245, uni_seq_246, uni_seq_247, uni_seq_248, uni_seq_249, uni_seq_250, uni_seq_251, uni_seq_252, uni_seq_253, uni_seq_254, uni_seq_255, uni_seq_256, uni_seq_257, uni_seq_258, uni_seq_259, uni_seq_260, uni_seq_261, uni_seq_262, uni_seq_263, uni_seq_264, uni_seq_265, uni_seq_266, uni_seq_267, uni_seq_268, uni_seq_269, uni_seq_270, uni_seq_271, uni_seq_272, uni_seq_273, uni_seq_274, uni_seq_275, uni_seq_276, uni_seq_277, uni_seq_278, uni_seq_279, uni_seq_280, uni_seq_281, uni_seq_282, uni_seq_283, uni_seq_284, uni_seq_285, uni_seq_286, uni_seq_287, uni_seq_288, uni_seq_289, uni_seq_290, uni_seq_291, uni_seq_292, uni_seq_293, uni_seq_294, uni_seq_295, uni_seq_296, uni_seq_297, uni_seq_298, uni_seq_299, uni_seq_300, uni_seq_301, uni_seq_302, uni_seq_303, uni_seq_304, uni_seq_305, uni_seq_306, uni_seq_307, uni_seq_308, uni_seq_309, uni_seq_310, uni_seq_311, uni_seq_312, uni_seq_313, uni_seq_314, uni_seq_315, uni_seq_316, uni_seq_317, uni_seq_318, uni_seq_319, uni_seq_320, uni_seq_321, uni_seq_322, uni_seq_323, uni_seq_324, uni_seq_325, uni_seq_326, uni_seq_327, uni_seq_328, uni_seq_329, uni_seq_330, uni_seq_331, uni_seq_332, uni_seq_333, uni_seq_334, uni_seq_335, uni_seq_336, uni_seq_337, uni_seq_338, uni_seq_339, uni_seq_340, uni_seq_341, uni_seq_342, uni_seq_343, uni_seq_344, uni_seq_345, uni_seq_346, uni_seq_347, uni_seq_348, uni_seq_349, uni_seq_350, uni_seq_351, uni_seq_352, uni_seq_353, uni_seq_354, uni_seq_355, uni_seq_356, uni_seq_357, uni_seq_358, uni_seq_359, uni_seq_360, uni_seq_361, uni_seq_362, uni_seq_363, uni_seq_364, uni_seq_365, uni_seq_366, uni_seq_367, uni_seq_368, uni_seq_369, uni_seq_370, uni_seq_371, uni_seq_372, uni_seq_373, uni_seq_374, uni_seq_375, uni_seq_376, uni_seq_377, uni_seq_378, uni_seq_379, uni_seq_380, uni_seq_381, uni_seq_382, uni_seq_383, uni_seq_384, uni_seq_385, uni_seq_386, uni_seq_387, uni_seq_388, uni_seq_389, uni_seq_390, uni_seq_391, uni_seq_392, uni_seq_393, uni_seq_394, uni_seq_395, uni_seq_396, uni_seq_397, uni_seq_398, uni_seq_399, uni_seq_400, uni_seq_401, uni_seq_402, uni_seq_403, uni_seq_404, uni_seq_405, uni_seq_406, uni_seq_407, uni_seq_408, uni_seq_409, uni_seq_410, uni_seq_411, uni_seq_412, uni_seq_413, uni_seq_414, uni_seq_415, uni_seq_416, uni_seq_417, uni_seq_418, uni_seq_419, uni_seq_420, uni_seq_421, uni_seq_422, uni_seq_423, uni_seq_424, uni_seq_425, uni_seq_426, uni_seq_427, uni_seq_428, uni_seq_429, uni_seq_430, uni_seq_431, uni_seq_432, uni_seq_433, uni_seq_434, uni_seq_435, uni_seq_436, uni_seq_437, uni_seq_438, uni_seq_439, uni_seq_440, uni_seq_441, uni_seq_442, uni_seq_443, uni_seq_444, uni_seq_445, uni_seq_446, uni_seq_447, uni_seq_448, uni_seq_449, uni_seq_450, uni_seq_451, uni_seq_452, uni_seq_453, uni_seq_454, uni_seq_455, uni_seq_456, uni_seq_457, uni_seq_458, uni_seq_459, uni_seq_460, uni_seq_461, uni_seq_462, uni_seq_463, uni_seq_464, uni_seq_465, uni_seq_466, uni_seq_467, uni_seq_468, uni_seq_469, uni_seq_470, uni_seq_471, uni_seq_472, uni_seq_473, uni_seq_474, uni_seq_475, uni_seq_476, uni_seq_477, uni_seq_478, uni_seq_479, uni_seq_480, uni_seq_481, uni_seq_482, uni_seq_483, uni_seq_484, uni_seq_485, uni_seq_486, uni_seq_487, uni_seq_488, uni_seq_489, uni_seq_490, uni_seq_491, uni_seq_492, uni_seq_493, uni_seq_494, uni_seq_495, uni_seq_496, uni_seq_497, uni_seq_498, uni_seq_499, uni_seq_500, uni_seq_501, uni_seq_502, uni_seq_503, uni_seq_504, uni_seq_505, uni_seq_506, uni_seq_507, uni_seq_508, uni_seq_509, uni_seq_510, uni_seq_511, uni_seq_512, uni_seq_513, uni_seq_514, uni_seq_515, uni_seq_516, uni_seq_517, uni_seq_518, uni_seq_519, uni_seq_520, uni_seq_521, uni_seq_522, uni_seq_523, uni_seq_524, uni_seq_525, uni_seq_526, uni_seq_527, uni_seq_528, uni_seq_529, uni_seq_530, uni_seq_531, uni_seq_532, uni_seq_533, uni_seq_534, uni_seq_535, uni_seq_536, uni_seq_537, uni_seq_538, uni_seq_539, uni_seq_540, uni_seq_541, uni_seq_542, uni_seq_543, uni_seq_544, uni_seq_545, uni_seq_546, uni_seq_547, uni_seq_548, uni_seq_549, uni_seq_550, uni_seq_551, uni_seq_552, uni_seq_553, uni_seq_554, uni_seq_555, uni_seq_556, uni_seq_557, uni_seq_558, uni_seq_559, uni_seq_560, uni_seq_561, uni_seq_562, uni_seq_563, uni_seq_564, uni_seq_565, uni_seq_566, uni_seq_567, uni_seq_568, uni_seq_569, uni_seq_570, uni_seq_571, uni_seq_572, uni_seq_573, uni_seq_574, uni_seq_575, uni_seq_576, uni_seq_577, uni_seq_578, uni_seq_579, uni_seq_580, uni_seq_581, uni_seq_582, uni_seq_583, uni_seq_584, uni_seq_585, uni_seq_586, uni_seq_587, uni_seq_588, uni_seq_589, uni_seq_590, uni_seq_591, uni_seq_592, uni_seq_593, uni_seq_594, uni_seq_595, uni_seq_596, uni_seq_597, uni_seq_598, uni_seq_599, uni_seq_600, uni_seq_601, uni_seq_602, uni_seq_603, uni_seq_604, uni_seq_605, uni_seq_606, uni_seq_607, uni_seq_608, uni_seq_609, uni_seq_610, uni_seq_611, uni_seq_612, uni_seq_613, uni_seq_614, uni_seq_615, uni_seq_616, uni_seq_617, uni_seq_618, uni_seq_619, uni_seq_620, uni_seq_621, uni_seq_622, uni_seq_623, uni_seq_624, uni_seq_625, uni_seq_626, uni_seq_627, uni_seq_628, uni_seq_629, uni_seq_630, uni_seq_631, uni_seq_632, uni_seq_633, uni_seq_634, uni_seq_635, uni_seq_636, uni_seq_637, uni_seq_638, uni_seq_639, uni_seq_640, uni_seq_641, uni_seq_642, uni_seq_643, uni_seq_644, uni_seq_645, uni_seq_646, uni_seq_647, uni_seq_648, uni_seq_649, uni_seq_650, uni_seq_651, uni_seq_652, uni_seq_653, uni_seq_654, uni_seq_655, uni_seq_656, uni_seq_657, uni_seq_658, uni_seq_659, uni_seq_660, uni_seq_661, uni_seq_662, uni_seq_663, uni_seq_664, uni_seq_665, uni_seq_666, uni_seq_667, uni_seq_668, uni_seq_669, uni_seq_670, uni_seq_671, uni_seq_672, uni_seq_673, uni_seq_674, uni_seq_675, uni_seq_676, uni_seq_677, uni_seq_678, uni_seq_679, uni_seq_680, uni_seq_681, uni_seq_682, uni_seq_683, uni_seq_684, uni_seq_685, uni_seq_686, uni_seq_687, uni_seq_688, uni_seq_689, uni_seq_690, uni_seq_691, uni_seq_692, uni_seq_693, uni_seq_694, uni_seq_695, uni_seq_696, uni_seq_697, uni_seq_698, uni_seq_699, uni_seq_700, uni_seq_701, uni_seq_702, uni_seq_703, uni_seq_704, uni_seq_705, uni_seq_706, uni_seq_707, uni_seq_708, uni_seq_709, uni_seq_710, uni_seq_711, uni_seq_712, uni_seq_713, uni_seq_714, uni_seq_715, uni_seq_716, uni_seq_717, uni_seq_718, uni_seq_719, uni_seq_720, uni_seq_721, uni_seq_722, uni_seq_723, uni_seq_724, uni_seq_725, uni_seq_726, uni_seq_727, uni_seq_728, uni_seq_729, uni_seq_730, uni_seq_731, uni_seq_732, uni_seq_733, uni_seq_734, uni_seq_735, uni_seq_736, uni_seq_737, uni_seq_738, uni_seq_739, uni_seq_740, uni_seq_741, uni_seq_742, uni_seq_743, uni_seq_744, uni_seq_745, uni_seq_746, uni_seq_747, uni_seq_748, uni_seq_749, uni_seq_750, uni_seq_751, uni_seq_752, uni_seq_753, uni_seq_754, uni_seq_755, uni_seq_756, uni_seq_757, uni_seq_758, uni_seq_759, uni_seq_760, uni_seq_761, uni_seq_762, uni_seq_763, uni_seq_764, uni_seq_765, uni_seq_766, uni_seq_767, uni_seq_768, uni_seq_769, uni_seq_770, uni_seq_771, uni_seq_772, uni_seq_773, uni_seq_774, uni_seq_775, uni_seq_776, uni_seq_777, uni_seq_778, uni_seq_779, uni_seq_780, uni_seq_781, uni_seq_782, uni_seq_783, uni_seq_784, uni_seq_785, uni_seq_786, uni_seq_787, uni_seq_788, uni_seq_789, uni_seq_790, uni_seq_791, uni_seq_792, uni_seq_793, uni_seq_794, uni_seq_795, uni_seq_796, uni_seq_797, uni_seq_798, uni_seq_799, uni_seq_800, uni_seq_801, uni_seq_802, uni_seq_803, uni_seq_804, uni_seq_805, uni_seq_806, uni_seq_807, uni_seq_808, uni_seq_809, uni_seq_810, uni_seq_811, uni_seq_812, uni_seq_813, uni_seq_814, uni_seq_815, uni_seq_816, uni_seq_817, uni_seq_818, uni_seq_819, uni_seq_820, uni_seq_821, uni_seq_822, uni_seq_823, uni_seq_824, uni_seq_825, uni_seq_826, uni_seq_827, uni_seq_828, uni_seq_829, uni_seq_830, uni_seq_831, uni_seq_832, uni_seq_833, uni_seq_834, uni_seq_835, uni_seq_836, uni_seq_837, uni_seq_838, uni_seq_839, uni_seq_840, uni_seq_841, uni_seq_842, uni_seq_843, uni_seq_844, uni_seq_845, uni_seq_846, uni_seq_847, uni_seq_848, uni_seq_849, uni_seq_850, uni_seq_851, uni_seq_852, uni_seq_853, uni_seq_854, uni_seq_855, uni_seq_856, uni_seq_857, uni_seq_858, uni_seq_859, uni_seq_860, uni_seq_861, uni_seq_862, uni_seq_863, uni_seq_864, uni_seq_865, uni_seq_866, uni_seq_867, uni_seq_868, uni_seq_869, uni_seq_870, uni_seq_871, uni_seq_872, uni_seq_873, uni_seq_874, uni_seq_875, uni_seq_876, uni_seq_877, uni_seq_878, uni_seq_879, uni_seq_880, uni_seq_881, uni_seq_882, uni_seq_883, uni_seq_884, uni_seq_885, uni_seq_886, uni_seq_887, uni_seq_888, uni_seq_889, uni_seq_890, uni_seq_891, uni_seq_892, uni_seq_893, uni_seq_894, uni_seq_895, uni_seq_896, uni_seq_897, uni_seq_898, uni_seq_899, uni_seq_900, uni_seq_901, uni_seq_902, uni_seq_903, uni_seq_904, uni_seq_905, uni_seq_906, uni_seq_907, uni_seq_908, uni_seq_909, uni_seq_910, uni_seq_911, uni_seq_912, uni_seq_913, uni_seq_914, uni_seq_915, uni_seq_916, uni_seq_917, uni_seq_918, uni_seq_919, uni_seq_920, uni_seq_921, uni_seq_922, uni_seq_923, uni_seq_924, uni_seq_925, uni_seq_926, uni_seq_927, uni_seq_928, uni_seq_929, uni_seq_930, uni_seq_931, uni_seq_932, uni_seq_933, uni_seq_934, uni_seq_935, uni_seq_936, uni_seq_937, uni_seq_938, uni_seq_939, uni_seq_940, uni_seq_941, uni_seq_942, uni_seq_943, uni_seq_944, uni_seq_945, uni_seq_946, uni_seq_947, uni_seq_948, uni_seq_949, uni_seq_950, uni_seq_951, uni_seq_952, uni_seq_953, uni_seq_954, uni_seq_955, uni_seq_956, uni_seq_957, uni_seq_958, uni_seq_959, uni_seq_960, uni_seq_961, uni_seq_962, uni_seq_963, uni_seq_964, uni_seq_965, uni_seq_966, uni_seq_967, uni_seq_968, uni_seq_969, uni_seq_970, uni_seq_971, uni_seq_972, uni_seq_973, uni_seq_974, uni_seq_975, uni_seq_976, uni_seq_977, uni_seq_978, uni_seq_979, uni_seq_980, uni_seq_981, uni_seq_982, uni_seq_983, uni_seq_984, uni_seq_985, uni_seq_986, uni_seq_987, uni_seq_988, uni_seq_989, uni_seq_990, uni_seq_991, uni_seq_992, uni_seq_993, uni_seq_994, uni_seq_995, uni_seq_996, uni_seq_997, uni_seq_998, uni_seq_999, uni_seq_1000, uni_seq_1001, uni_seq_1002, uni_seq_1003, uni_seq_1004, uni_seq_1005, uni_seq_1006, uni_seq_1007, uni_seq_1008, uni_seq_1009, uni_seq_1010, uni_seq_1011, uni_seq_1012, uni_seq_1013, uni_seq_1014, uni_seq_1015, uni_seq_1016, uni_seq_1017, uni_seq_1018, uni_seq_1019, uni_seq_1020, uni_seq_1021, uni_seq_1022, uni_seq_1023, uni_seq_1024, uni_seq_1025, uni_seq_1026, uni_seq_1027, uni_seq_1028, uni_seq_1029, uni_seq_1030, uni_seq_1031, uni_seq_1032, uni_seq_1033, uni_seq_1034, uni_seq_1035, uni_seq_1036, uni_seq_1037, uni_seq_1038, uni_seq_1039, uni_seq_1040, uni_seq_1041, uni_seq_1042, uni_seq_1043, uni_seq_1044, uni_seq_1045, uni_seq_1046, uni_seq_1047, uni_seq_1048, uni_seq_1049, uni_seq_1050, uni_seq_1051, uni_seq_1052, uni_seq_1053, uni_seq_1054, uni_seq_1055, uni_seq_1056, uni_seq_1057, uni_seq_1058, uni_seq_1059, uni_seq_1060, uni_seq_1061, uni_seq_1062, uni_seq_1063, uni_seq_1064, uni_seq_1065, uni_seq_1066, uni_seq_1067, uni_seq_1068, uni_seq_1069, uni_seq_1070, uni_seq_1071, uni_seq_1072, uni_seq_1073, uni_seq_1074, uni_seq_1075, uni_seq_1076, uni_seq_1077, uni_seq_1078, uni_seq_1079, uni_seq_1080, uni_seq_1081, uni_seq_1082, uni_seq_1083, uni_seq_1084, uni_seq_1085, uni_seq_1086, uni_seq_1087, uni_seq_1088, uni_seq_1089, uni_seq_1090, uni_seq_1091, uni_seq_1092, uni_seq_1093, uni_seq_1094, uni_seq_1095, uni_seq_1096, uni_seq_1097, uni_seq_1098, uni_seq_1099, uni_seq_1100, uni_seq_1101, uni_seq_1102, uni_seq_1103, uni_seq_1104, uni_seq_1105, uni_seq_1106, uni_seq_1107, uni_seq_1108, uni_seq_1109, uni_seq_1110, uni_seq_1111, uni_seq_1112, uni_seq_1113, uni_seq_1114, uni_seq_1115, uni_seq_1116, uni_seq_1117, uni_seq_1118, uni_seq_1119, uni_seq_1120, uni_seq_1121, uni_seq_1122, uni_seq_1123, uni_seq_1124, uni_seq_1125, uni_seq_1126, uni_seq_1127, uni_seq_1128, uni_seq_1129, uni_seq_1130, uni_seq_1131, uni_seq_1132, uni_seq_1133, uni_seq_1134, uni_seq_1135, uni_seq_1136, uni_seq_1137, uni_seq_1138, uni_seq_1139, uni_seq_1140, uni_seq_1141, uni_seq_1142, uni_seq_1143, uni_seq_1144, uni_seq_1145, uni_seq_1146, uni_seq_1147, uni_seq_1148, uni_seq_1149, uni_seq_1150, uni_seq_1151, uni_seq_1152, uni_seq_1153, uni_seq_1154, uni_seq_1155, uni_seq_1156, uni_seq_1157, uni_seq_1158, uni_seq_1159, uni_seq_1160, uni_seq_1161, uni_seq_1162, uni_seq_1163, uni_seq_1164, uni_seq_1165, uni_seq_1166, uni_seq_1167, uni_seq_1168, uni_seq_1169, uni_seq_1170, uni_seq_1171, uni_seq_1172, uni_seq_1173, uni_seq_1174, uni_seq_1175, uni_seq_1176, uni_seq_1177, uni_seq_1178, uni_seq_1179, uni_seq_1180, uni_seq_1181, uni_seq_1182, uni_seq_1183, uni_seq_1184, uni_seq_1185, uni_seq_1186, uni_seq_1187, uni_seq_1188, uni_seq_1189, uni_seq_1190, uni_seq_1191, uni_seq_1192, uni_seq_1193, uni_seq_1194, uni_seq_1195, uni_seq_1196, uni_seq_1197, uni_seq_1198, uni_seq_1199, uni_seq_1200, uni_seq_1201, uni_seq_1202, uni_seq_1203, uni_seq_1204, uni_seq_1205, uni_seq_1206, uni_seq_1207, uni_seq_1208, uni_seq_1209, uni_seq_1210, uni_seq_1211, uni_seq_1212, uni_seq_1213, uni_seq_1214, uni_seq_1215, uni_seq_1216, uni_seq_1217, uni_seq_1218, uni_seq_1219, uni_seq_1220, uni_seq_1221, uni_seq_1222, uni_seq_1223, uni_seq_1224, uni_seq_1225, uni_seq_1226, uni_seq_1227, uni_seq_1228, uni_seq_1229, uni_seq_1230, uni_seq_1231, uni_seq_1232, uni_seq_1233, uni_seq_1234, uni_seq_1235, uni_seq_1236, uni_seq_1237, uni_seq_1238, uni_seq_1239, uni_seq_1240, uni_seq_1241, uni_seq_1242, uni_seq_1243, uni_seq_1244, uni_seq_1245, uni_seq_1246, uni_seq_1247, uni_seq_1248, uni_seq_1249, uni_seq_1250, uni_seq_1251, uni_seq_1252, uni_seq_1253, uni_seq_1254, uni_seq_1255, uni_seq_1256, uni_seq_1257, uni_seq_1258, uni_seq_1259, uni_seq_1260, uni_seq_1261, uni_seq_1262, uni_seq_1263, uni_seq_1264, uni_seq_1265, uni_seq_1266, uni_seq_1267, uni_seq_1268, uni_seq_1269, uni_seq_1270, uni_seq_1271, uni_seq_1272, uni_seq_1273, uni_seq_1274, uni_seq_1275, uni_seq_1276, uni_seq_1277, uni_seq_1278, uni_seq_1279, uni_seq_1280, uni_seq_1281, uni_seq_1282, uni_seq_1283, uni_seq_1284, uni_seq_1285, uni_seq_1286, uni_seq_1287, uni_seq_1288, uni_seq_1289, uni_seq_1290, uni_seq_1291, uni_seq_1292, uni_seq_1293, uni_seq_1294, uni_seq_1295, uni_seq_1296, uni_seq_1297, uni_seq_1298, uni_seq_1299, uni_seq_1300, uni_seq_1301, uni_seq_1302, uni_seq_1303, uni_seq_1304, uni_seq_1305, uni_seq_1306, uni_seq_1307, uni_seq_1308, uni_seq_1309, uni_seq_1310, uni_seq_1311, uni_seq_1312, uni_seq_1313, uni_seq_1314, uni_seq_1315, uni_seq_1316, uni_seq_1317, uni_seq_1318, uni_seq_1319, uni_seq_1320, uni_seq_1321, uni_seq_1322, uni_seq_1323, uni_seq_1324, uni_seq_1325, uni_seq_1326, uni_seq_1327, uni_seq_1328, uni_seq_1329, uni_seq_1330, uni_seq_1331, uni_seq_1332, uni_seq_1333, uni_seq_1334, uni_seq_1335, uni_seq_1336, uni_seq_1337, uni_seq_1338, uni_seq_1339, uni_seq_1340, uni_seq_1341, uni_seq_1342, uni_seq_1343, uni_seq_1344, uni_seq_1345, uni_seq_1346, uni_seq_1347, uni_seq_1348, uni_seq_1349, uni_seq_1350, uni_seq_1351, uni_seq_1352, uni_seq_1353, uni_seq_1354, uni_seq_1355, uni_seq_1356, uni_seq_1357, uni_seq_1358, uni_seq_1359, uni_seq_1360, uni_seq_1361, uni_seq_1362, uni_seq_1363, uni_seq_1364, uni_seq_1365, uni_seq_1366, uni_seq_1367, uni_seq_1368, uni_seq_1369, uni_seq_1370, uni_seq_1371, uni_seq_1372, uni_seq_1373, uni_seq_1374, uni_seq_1375, uni_seq_1376, uni_seq_1377, uni_seq_1378, uni_seq_1379, uni_seq_1380, uni_seq_1381, uni_seq_1382, uni_seq_1383, uni_seq_1384, uni_seq_1385, uni_seq_1386, uni_seq_1387, uni_seq_1388, uni_seq_1389, uni_seq_1390, uni_seq_1391, uni_seq_1392, uni_seq_1393, uni_seq_1394, uni_seq_1395, uni_seq_1396, uni_seq_1397, uni_seq_1398, uni_seq_1399, uni_seq_1400, uni_seq_1401, uni_seq_1402, uni_seq_1403, uni_seq_1404, uni_seq_1405, uni_seq_1406, uni_seq_1407, uni_seq_1408, uni_seq_1409, uni_seq_1410, uni_seq_1411, uni_seq_1412, uni_seq_1413, uni_seq_1414, uni_seq_1415, uni_seq_1416, uni_seq_1417, uni_seq_1418, uni_seq_1419, uni_seq_1420, uni_seq_1421, uni_seq_1422, uni_seq_1423, uni_seq_1424, uni_seq_1425, uni_seq_1426, uni_seq_1427, uni_seq_1428, uni_seq_1429, uni_seq_1430, uni_seq_1431, uni_seq_1432, uni_seq_1433, uni_seq_1434, uni_seq_1435, uni_seq_1436, uni_seq_1437, uni_seq_1438, uni_seq_1439, uni_seq_1440, uni_seq_1441, uni_seq_1442, uni_seq_1443, uni_seq_1444, uni_seq_1445, uni_seq_1446, uni_seq_1447, uni_seq_1448, uni_seq_1449, uni_seq_1450, uni_seq_1451, uni_seq_1452, uni_seq_1453, uni_seq_1454, uni_seq_1455, uni_seq_1456, uni_seq_1457, uni_seq_1458, uni_seq_1459, uni_seq_1460, uni_seq_1461, uni_seq_1462, uni_seq_1463, uni_seq_1464, uni_seq_1465, uni_seq_1466, uni_seq_1467, uni_seq_1468, uni_seq_1469, uni_seq_1470, uni_seq_1471, uni_seq_1472, uni_seq_1473, uni_seq_1474, uni_seq_1475, uni_seq_1476, uni_seq_1477, uni_seq_1478, uni_seq_1479, uni_seq_1480, uni_seq_1481, uni_seq_1482, uni_seq_1483, uni_seq_1484, uni_seq_1485, uni_seq_1486, uni_seq_1487, uni_seq_1488, uni_seq_1489, uni_seq_1490, uni_seq_1491, uni_seq_1492, uni_seq_1493, uni_seq_1494, uni_seq_1495, uni_seq_1496, uni_seq_1497, uni_seq_1498, uni_seq_1499, uni_seq_1500, uni_seq_1501, uni_seq_1502, uni_seq_1503, uni_seq_1504, uni_seq_1505, uni_seq_1506, uni_seq_1507, uni_seq_1508, uni_seq_1509, uni_seq_1510, uni_seq_1511, uni_seq_1512, uni_seq_1513, uni_seq_1514, uni_seq_1515, uni_seq_1516, uni_seq_1517, uni_seq_1518, uni_seq_1519, uni_seq_1520, uni_seq_1521, uni_seq_1522, uni_seq_1523, uni_seq_1524, uni_seq_1525, uni_seq_1526, uni_seq_1527, uni_seq_1528, uni_seq_1529, uni_seq_1530, uni_seq_1531, uni_seq_1532, uni_seq_1533, uni_seq_1534, uni_seq_1535, uni_seq_1536, uni_seq_1537, uni_seq_1538, uni_seq_1539, uni_seq_1540, uni_seq_1541, uni_seq_1542, uni_seq_1543, uni_seq_1544, uni_seq_1545, uni_seq_1546, uni_seq_1547, uni_seq_1548, uni_seq_1549, uni_seq_1550, uni_seq_1551, uni_seq_1552, uni_seq_1553, uni_seq_1554, uni_seq_1555, uni_seq_1556, uni_seq_1557, uni_seq_1558, uni_seq_1559, uni_seq_1560, uni_seq_1561, uni_seq_1562, uni_seq_1563, uni_seq_1564, uni_seq_1565, uni_seq_1566, uni_seq_1567, uni_seq_1568, uni_seq_1569, uni_seq_1570, uni_seq_1571, uni_seq_1572, uni_seq_1573, uni_seq_1574, uni_seq_1575, uni_seq_1576, uni_seq_1577, uni_seq_1578, uni_seq_1579, uni_seq_1580, uni_seq_1581, uni_seq_1582, uni_seq_1583, uni_seq_1584, uni_seq_1585, uni_seq_1586, uni_seq_1587, uni_seq_1588, uni_seq_1589, uni_seq_1590, uni_seq_1591, uni_seq_1592, uni_seq_1593, uni_seq_1594, uni_seq_1595, uni_seq_1596, uni_seq_1597, uni_seq_1598, uni_seq_1599, uni_seq_1600, uni_seq_1601, uni_seq_1602, uni_seq_1603, uni_seq_1604, uni_seq_1605, uni_seq_1606, uni_seq_1607, uni_seq_1608, uni_seq_1609, uni_seq_1610, uni_seq_1611, uni_seq_1612, uni_seq_1613, uni_seq_1614, uni_seq_1615, uni_seq_1616, uni_seq_1617, uni_seq_1618, uni_seq_1619, uni_seq_1620, uni_seq_1621, uni_seq_1622, uni_seq_1623, uni_seq_1624, uni_seq_1625, uni_seq_1626, uni_seq_1627, uni_seq_1628, uni_seq_1629, uni_seq_1630, uni_seq_1631, uni_seq_1632, uni_seq_1633, uni_seq_1634, uni_seq_1635, uni_seq_1636, uni_seq_1637, uni_seq_1638, uni_seq_1639, uni_seq_1640, uni_seq_1641, uni_seq_1642, uni_seq_1643, uni_seq_1644, uni_seq_1645, uni_seq_1646, uni_seq_1647, uni_seq_1648, uni_seq_1649, uni_seq_1650, uni_seq_1651, uni_seq_1652, uni_seq_1653, uni_seq_1654, uni_seq_1655, uni_seq_1656, uni_seq_1657, uni_seq_1658, uni_seq_1659, uni_seq_1660, uni_seq_1661, uni_seq_1662, uni_seq_1663, uni_seq_1664, uni_seq_1665, uni_seq_1666, uni_seq_1667, uni_seq_1668, uni_seq_1669, uni_seq_1670, uni_seq_1671, uni_seq_1672, uni_seq_1673, uni_seq_1674, uni_seq_1675, uni_seq_1676, uni_seq_1677, uni_seq_1678, uni_seq_1679, uni_seq_1680, uni_seq_1681, uni_seq_1682, uni_seq_1683, uni_seq_1684, uni_seq_1685, uni_seq_1686, uni_seq_1687, uni_seq_1688, uni_seq_1689, uni_seq_1690, uni_seq_1691, uni_seq_1692, uni_seq_1693, uni_seq_1694, uni_seq_1695, uni_seq_1696, uni_seq_1697, uni_seq_1698, uni_seq_1699, uni_seq_1700, uni_seq_1701, uni_seq_1702, uni_seq_1703, uni_seq_1704, uni_seq_1705, uni_seq_1706, uni_seq_1707, uni_seq_1708, uni_seq_1709, uni_seq_1710, uni_seq_1711, uni_seq_1712, uni_seq_1713, uni_seq_1714, uni_seq_1715, uni_seq_1716, uni_seq_1717, uni_seq_1718, uni_seq_1719, uni_seq_1720, uni_seq_1721, uni_seq_1722, uni_seq_1723, uni_seq_1724, uni_seq_1725, uni_seq_1726, uni_seq_1727, uni_seq_1728, uni_seq_1729, uni_seq_1730, uni_seq_1731, uni_seq_1732, uni_seq_1733, uni_seq_1734, uni_seq_1735, uni_seq_1736, uni_seq_1737, uni_seq_1738, uni_seq_1739, uni_seq_1740, uni_seq_1741, uni_seq_1742, uni_seq_1743, uni_seq_1744, uni_seq_1745, uni_seq_1746, uni_seq_1747, uni_seq_1748, uni_seq_1749, uni_seq_1750, uni_seq_1751, uni_seq_1752, uni_seq_1753, uni_seq_1754, uni_seq_1755, uni_seq_1756, uni_seq_1757, uni_seq_1758, uni_seq_1759, uni_seq_1760, uni_seq_1761, uni_seq_1762, uni_seq_1763, uni_seq_1764, uni_seq_1765, uni_seq_1766, uni_seq_1767, uni_seq_1768, uni_seq_1769, uni_seq_1770, uni_seq_1771, uni_seq_1772, uni_seq_1773, uni_seq_1774, uni_seq_1775, uni_seq_1776, uni_seq_1777, uni_seq_1778, uni_seq_1779, uni_seq_1780, uni_seq_1781, uni_seq_1782, uni_seq_1783, uni_seq_1784, uni_seq_1785, uni_seq_1786, uni_seq_1787, uni_seq_1788, uni_seq_1789, uni_seq_1790, uni_seq_1791, uni_seq_1792, uni_seq_1793, uni_seq_1794, uni_seq_1795, uni_seq_1796, uni_seq_1797, uni_seq_1798, uni_seq_1799, uni_seq_1800, uni_seq_1801, uni_seq_1802, uni_seq_1803, uni_seq_1804, uni_seq_1805, uni_seq_1806, uni_seq_1807, uni_seq_1808, uni_seq_1809, uni_seq_1810, uni_seq_1811, uni_seq_1812, uni_seq_1813, uni_seq_1814, uni_seq_1815, uni_seq_1816, uni_seq_1817, uni_seq_1818, uni_seq_1819, uni_seq_1820, uni_seq_1821, uni_seq_1822, uni_seq_1823, uni_seq_1824, uni_seq_1825, uni_seq_1826, uni_seq_1827, uni_seq_1828, uni_seq_1829, uni_seq_1830, uni_seq_1831, uni_seq_1832, uni_seq_1833, uni_seq_1834, uni_seq_1835, uni_seq_1836, uni_seq_1837, uni_seq_1838, uni_seq_1839, uni_seq_1840, uni_seq_1841, uni_seq_1842, uni_seq_1843, uni_seq_1844, uni_seq_1845, uni_seq_1846, uni_seq_1847, uni_seq_1848, uni_seq_1849, uni_seq_1850, uni_seq_1851, uni_seq_1852, uni_seq_1853, uni_seq_1854, uni_seq_1855, uni_seq_1856, uni_seq_1857, uni_seq_1858, uni_seq_1859, uni_seq_1860, uni_seq_1861, uni_seq_1862, uni_seq_1863, uni_seq_1864, uni_seq_1865, uni_seq_1866, uni_seq_1867, uni_seq_1868, uni_seq_1869, uni_seq_1870, uni_seq_1871, uni_seq_1872, uni_seq_1873, uni_seq_1874, uni_seq_1875, uni_seq_1876, uni_seq_1877, uni_seq_1878, uni_seq_1879, uni_seq_1880, uni_seq_1881, uni_seq_1882, uni_seq_1883, uni_seq_1884, uni_seq_1885, uni_seq_1886, uni_seq_1887, uni_seq_1888, uni_seq_1889, uni_seq_1890, uni_seq_1891, uni_seq_1892, uni_seq_1893, uni_seq_1894, uni_seq_1895, uni_seq_1896, uni_seq_1897, uni_seq_1898, uni_seq_1899, uni_seq_1900, uni_seq_1901, uni_seq_1902, uni_seq_1903, uni_seq_1904, uni_seq_1905, uni_seq_1906, uni_seq_1907, uni_seq_1908, uni_seq_1909, uni_seq_1910, uni_seq_1911, uni_seq_1912, uni_seq_1913, uni_seq_1914, uni_seq_1915, uni_seq_1916, uni_seq_1917, uni_seq_1918, uni_seq_1919, uni_seq_1920, uni_seq_1921, uni_seq_1922, uni_seq_1923, uni_seq_1924, uni_seq_1925, uni_seq_1926, uni_seq_1927, uni_seq_1928, uni_seq_1929, uni_seq_1930, uni_seq_1931, uni_seq_1932, uni_seq_1933, uni_seq_1934, uni_seq_1935, uni_seq_1936, uni_seq_1937, uni_seq_1938};MoarVM-2018.03/src/strings/unicode_gen.h0000644000175000017510000002440313242626641020124 0ustar samanthasamantha struct MVMUnicodeNamedValue { const char *name; MVMint32 value; }; #define num_unicode_property_keypairs 3548 #define MVM_NUM_UNICODE_EXTENTS 105 MVMint32 MVM_unicode_is_in_block(MVMThreadContext *tc, MVMString *str, MVMint64 pos, MVMString *block_name); #define MVM_CODEPOINT_NAMES_COUNT 52915 #define MVM_NUM_PROPERTY_CODES 106 #define num_unicode_seq_keypairs 1939 #define num_unicode_namealias_keypairs 464 struct MVMUnicodeNamedAlias { char *name; MVMGrapheme32 codepoint; MVMint16 strlen; }; typedef struct MVMUnicodeNamedAlias MVMUnicodeNamedAlias; /* MVM_UNICODE_PROPERTY_GENERAL_CATEGORY */ #define MVM_UNICODE_PVALUE_GC_CC 15 #define MVM_UNICODE_PVALUE_GC_CF 16 #define MVM_UNICODE_PVALUE_GC_CN 0 #define MVM_UNICODE_PVALUE_GC_CO 17 #define MVM_UNICODE_PVALUE_GC_CS 18 #define MVM_UNICODE_PVALUE_GC_LL 2 #define MVM_UNICODE_PVALUE_GC_LM 4 #define MVM_UNICODE_PVALUE_GC_LO 5 #define MVM_UNICODE_PVALUE_GC_LT 3 #define MVM_UNICODE_PVALUE_GC_LU 1 #define MVM_UNICODE_PVALUE_GC_MC 8 #define MVM_UNICODE_PVALUE_GC_ME 7 #define MVM_UNICODE_PVALUE_GC_MN 6 #define MVM_UNICODE_PVALUE_GC_ND 9 #define MVM_UNICODE_PVALUE_GC_NL 10 #define MVM_UNICODE_PVALUE_GC_NO 11 #define MVM_UNICODE_PVALUE_GC_PC 22 #define MVM_UNICODE_PVALUE_GC_PD 19 #define MVM_UNICODE_PVALUE_GC_PE 21 #define MVM_UNICODE_PVALUE_GC_PF 29 #define MVM_UNICODE_PVALUE_GC_PI 28 #define MVM_UNICODE_PVALUE_GC_PO 23 #define MVM_UNICODE_PVALUE_GC_PS 20 #define MVM_UNICODE_PVALUE_GC_SC 25 #define MVM_UNICODE_PVALUE_GC_SK 26 #define MVM_UNICODE_PVALUE_GC_SM 24 #define MVM_UNICODE_PVALUE_GC_SO 27 #define MVM_UNICODE_PVALUE_GC_ZL 13 #define MVM_UNICODE_PVALUE_GC_ZP 14 #define MVM_UNICODE_PVALUE_GC_ZS 12 /* MVM_UNICODE_PROPERTY_GRAPHEME_CLUSTER_BREAK */ #define MVM_UNICODE_PVALUE_GCB_CR 2 #define MVM_UNICODE_PVALUE_GCB_CONTROL 4 #define MVM_UNICODE_PVALUE_GCB_E_BASE 13 #define MVM_UNICODE_PVALUE_GCB_E_BASE_GAZ 17 #define MVM_UNICODE_PVALUE_GCB_E_MODIFIER 14 #define MVM_UNICODE_PVALUE_GCB_EXTEND 5 #define MVM_UNICODE_PVALUE_GCB_GLUE_AFTER_ZWJ 16 #define MVM_UNICODE_PVALUE_GCB_L 8 #define MVM_UNICODE_PVALUE_GCB_LF 3 #define MVM_UNICODE_PVALUE_GCB_LV 11 #define MVM_UNICODE_PVALUE_GCB_LVT 12 #define MVM_UNICODE_PVALUE_GCB_OTHER 0 #define MVM_UNICODE_PVALUE_GCB_PREPEND 1 #define MVM_UNICODE_PVALUE_GCB_REGIONAL_INDICATOR 6 #define MVM_UNICODE_PVALUE_GCB_SPACINGMARK 7 #define MVM_UNICODE_PVALUE_GCB_T 10 #define MVM_UNICODE_PVALUE_GCB_V 9 #define MVM_UNICODE_PVALUE_GCB_ZWJ 15 /* MVM_UNICODE_PROPERTY_DECOMPOSITION_TYPE */ #define MVM_UNICODE_PVALUE_DT_CANONICAL 1 #define MVM_UNICODE_PVALUE_DT_CIRCLE 9 #define MVM_UNICODE_PVALUE_DT_COMPAT 2 #define MVM_UNICODE_PVALUE_DT_FINAL 7 #define MVM_UNICODE_PVALUE_DT_FONT 3 #define MVM_UNICODE_PVALUE_DT_FRACTION 17 #define MVM_UNICODE_PVALUE_DT_INITIAL 5 #define MVM_UNICODE_PVALUE_DT_ISOLATED 8 #define MVM_UNICODE_PVALUE_DT_MEDIAL 6 #define MVM_UNICODE_PVALUE_DT_NARROW 14 #define MVM_UNICODE_PVALUE_DT_NOBREAK 4 #define MVM_UNICODE_PVALUE_DT_NONE 0 #define MVM_UNICODE_PVALUE_DT_SMALL 15 #define MVM_UNICODE_PVALUE_DT_SQUARE 16 #define MVM_UNICODE_PVALUE_DT_SUB 11 #define MVM_UNICODE_PVALUE_DT_SUPER 10 #define MVM_UNICODE_PVALUE_DT_VERTICAL 12 #define MVM_UNICODE_PVALUE_DT_WIDE 13 /* MVM_UNICODE_PROPERTY_CANONICAL_COMBINING_CLASS */ #define MVM_UNICODE_PVALUE_CCC_0 1 #define MVM_UNICODE_PVALUE_CCC_1 2 #define MVM_UNICODE_PVALUE_CCC_10 6 #define MVM_UNICODE_PVALUE_CCC_103 35 #define MVM_UNICODE_PVALUE_CCC_107 36 #define MVM_UNICODE_PVALUE_CCC_11 7 #define MVM_UNICODE_PVALUE_CCC_118 37 #define MVM_UNICODE_PVALUE_CCC_12 8 #define MVM_UNICODE_PVALUE_CCC_122 38 #define MVM_UNICODE_PVALUE_CCC_129 39 #define MVM_UNICODE_PVALUE_CCC_13 9 #define MVM_UNICODE_PVALUE_CCC_130 40 #define MVM_UNICODE_PVALUE_CCC_132 41 #define MVM_UNICODE_PVALUE_CCC_14 10 #define MVM_UNICODE_PVALUE_CCC_15 11 #define MVM_UNICODE_PVALUE_CCC_16 12 #define MVM_UNICODE_PVALUE_CCC_17 13 #define MVM_UNICODE_PVALUE_CCC_18 14 #define MVM_UNICODE_PVALUE_CCC_19 15 #define MVM_UNICODE_PVALUE_CCC_20 16 #define MVM_UNICODE_PVALUE_CCC_202 42 #define MVM_UNICODE_PVALUE_CCC_21 17 #define MVM_UNICODE_PVALUE_CCC_214 43 #define MVM_UNICODE_PVALUE_CCC_216 44 #define MVM_UNICODE_PVALUE_CCC_218 45 #define MVM_UNICODE_PVALUE_CCC_22 18 #define MVM_UNICODE_PVALUE_CCC_220 46 #define MVM_UNICODE_PVALUE_CCC_222 47 #define MVM_UNICODE_PVALUE_CCC_224 48 #define MVM_UNICODE_PVALUE_CCC_226 49 #define MVM_UNICODE_PVALUE_CCC_228 50 #define MVM_UNICODE_PVALUE_CCC_23 19 #define MVM_UNICODE_PVALUE_CCC_230 51 #define MVM_UNICODE_PVALUE_CCC_232 52 #define MVM_UNICODE_PVALUE_CCC_233 53 #define MVM_UNICODE_PVALUE_CCC_234 54 #define MVM_UNICODE_PVALUE_CCC_24 20 #define MVM_UNICODE_PVALUE_CCC_240 55 #define MVM_UNICODE_PVALUE_CCC_25 21 #define MVM_UNICODE_PVALUE_CCC_26 22 #define MVM_UNICODE_PVALUE_CCC_27 23 #define MVM_UNICODE_PVALUE_CCC_28 24 #define MVM_UNICODE_PVALUE_CCC_29 25 #define MVM_UNICODE_PVALUE_CCC_30 26 #define MVM_UNICODE_PVALUE_CCC_31 27 #define MVM_UNICODE_PVALUE_CCC_32 28 #define MVM_UNICODE_PVALUE_CCC_33 29 #define MVM_UNICODE_PVALUE_CCC_34 30 #define MVM_UNICODE_PVALUE_CCC_35 31 #define MVM_UNICODE_PVALUE_CCC_36 32 #define MVM_UNICODE_PVALUE_CCC_7 3 #define MVM_UNICODE_PVALUE_CCC_8 4 #define MVM_UNICODE_PVALUE_CCC_84 33 #define MVM_UNICODE_PVALUE_CCC_9 5 #define MVM_UNICODE_PVALUE_CCC_91 34 #define MVM_UNICODE_PVALUE_CCC_NOT_REORDERED 0 /* MVM_UNICODE_PROPERTY_NUMERIC_TYPE */ #define MVM_UNICODE_PVALUE_Numeric_Type_DECIMAL 3 #define MVM_UNICODE_PVALUE_Numeric_Type_DIGIT 2 #define MVM_UNICODE_PVALUE_Numeric_Type_NONE 0 #define MVM_UNICODE_PVALUE_Numeric_Type_NUMERIC 1 #define num_unicode_property_value_keypairs 4246 typedef enum { MVM_UNICODE_PROPERTY_DECOMP_SPEC = 1, MVM_UNICODE_PROPERTY_CASE_CHANGE_INDEX = 2, MVM_UNICODE_PROPERTY_JOINING_GROUP = 3, MVM_UNICODE_PROPERTY_CASE_FOLDING = 4, MVM_UNICODE_PROPERTY_BIDI_MIRRORING_GLYPH = 5, MVM_UNICODE_PROPERTY_BLOCK = 6, MVM_UNICODE_PROPERTY_EAST_ASIAN_WIDTH = 7, MVM_UNICODE_PROPERTY_NUMERIC_VALUE = 8, MVM_UNICODE_PROPERTY_SCRIPT = 9, MVM_UNICODE_PROPERTY_NUMERIC_VALUE_NUMERATOR = 10, MVM_UNICODE_PROPERTY_SPECIAL_CASING = 11, MVM_UNICODE_PROPERTY_NFC_QC = 12, MVM_UNICODE_PROPERTY_CANONICAL_COMBINING_CLASS = 13, MVM_UNICODE_PROPERTY_LINE_BREAK = 14, MVM_UNICODE_PROPERTY_AGE = 15, MVM_UNICODE_PROPERTY_BIDI_CLASS = 16, MVM_UNICODE_PROPERTY_DECOMPOSITION_TYPE = 17, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY = 18, MVM_UNICODE_PROPERTY_GRAPHEME_CLUSTER_BREAK = 19, MVM_UNICODE_PROPERTY_NUMERIC_VALUE_DENOMINATOR = 20, MVM_UNICODE_PROPERTY_WORD_BREAK = 21, MVM_UNICODE_PROPERTY_SENTENCE_BREAK = 22, MVM_UNICODE_PROPERTY_HANGUL_SYLLABLE_TYPE = 23, MVM_UNICODE_PROPERTY_JOINING_TYPE = 24, MVM_UNICODE_PROPERTY_NFG_QC = 25, MVM_UNICODE_PROPERTY_NFKC_QC = 26, MVM_UNICODE_PROPERTY_NUMERIC_TYPE = 27, MVM_UNICODE_PROPERTY_ASCII_HEX_DIGIT = 28, MVM_UNICODE_PROPERTY_ALPHABETIC = 29, MVM_UNICODE_PROPERTY_ANY = 30, MVM_UNICODE_PROPERTY_ASSIGNED = 31, MVM_UNICODE_PROPERTY_BIDI_CONTROL = 32, MVM_UNICODE_PROPERTY_BIDI_MIRRORED = 33, MVM_UNICODE_PROPERTY_C = 34, MVM_UNICODE_PROPERTY_CASE_FOLDING_SIMPLE = 35, MVM_UNICODE_PROPERTY_CASE_IGNORABLE = 36, MVM_UNICODE_PROPERTY_CASED = 37, MVM_UNICODE_PROPERTY_CHANGES_WHEN_CASEFOLDED = 38, MVM_UNICODE_PROPERTY_CHANGES_WHEN_CASEMAPPED = 39, MVM_UNICODE_PROPERTY_CHANGES_WHEN_LOWERCASED = 40, MVM_UNICODE_PROPERTY_CHANGES_WHEN_NFKC_CASEFOLDED = 41, MVM_UNICODE_PROPERTY_CHANGES_WHEN_TITLECASED = 42, MVM_UNICODE_PROPERTY_CHANGES_WHEN_UPPERCASED = 43, MVM_UNICODE_PROPERTY_DASH = 44, MVM_UNICODE_PROPERTY_DEFAULT_IGNORABLE_CODE_POINT = 45, MVM_UNICODE_PROPERTY_DEPRECATED = 46, MVM_UNICODE_PROPERTY_DIACRITIC = 47, MVM_UNICODE_PROPERTY_EMOJI = 48, MVM_UNICODE_PROPERTY_EMOJI_COMPONENT = 49, MVM_UNICODE_PROPERTY_EMOJI_MODIFIER = 50, MVM_UNICODE_PROPERTY_EMOJI_MODIFIER_BASE = 51, MVM_UNICODE_PROPERTY_EMOJI_PRESENTATION = 52, MVM_UNICODE_PROPERTY_EXTENDER = 53, MVM_UNICODE_PROPERTY_FULL_COMPOSITION_EXCLUSION = 54, MVM_UNICODE_PROPERTY_GRAPHEME_BASE = 55, MVM_UNICODE_PROPERTY_GRAPHEME_EXTEND = 56, MVM_UNICODE_PROPERTY_GRAPHEME_LINK = 57, MVM_UNICODE_PROPERTY_HEX_DIGIT = 58, MVM_UNICODE_PROPERTY_HYPHEN = 59, MVM_UNICODE_PROPERTY_IDS_BINARY_OPERATOR = 60, MVM_UNICODE_PROPERTY_IDS_TRINARY_OPERATOR = 61, MVM_UNICODE_PROPERTY_ID_CONTINUE = 62, MVM_UNICODE_PROPERTY_ID_START = 63, MVM_UNICODE_PROPERTY_IDEOGRAPHIC = 64, MVM_UNICODE_PROPERTY_JOIN_CONTROL = 65, MVM_UNICODE_PROPERTY_L = 66, MVM_UNICODE_PROPERTY_LC = 67, MVM_UNICODE_PROPERTY_LOGICAL_ORDER_EXCEPTION = 68, MVM_UNICODE_PROPERTY_LOWERCASE = 69, MVM_UNICODE_PROPERTY_M = 70, MVM_UNICODE_PROPERTY_MVM_COLLATION_PRIMARY = 71, MVM_UNICODE_PROPERTY_MVM_COLLATION_QC = 72, MVM_UNICODE_PROPERTY_MATH = 73, MVM_UNICODE_PROPERTY_N = 74, MVM_UNICODE_PROPERTY_MVM_COLLATION_SECONDARY = 75, MVM_UNICODE_PROPERTY_MVM_COLLATION_TERTIARY = 76, MVM_UNICODE_PROPERTY_NFD_QC = 77, MVM_UNICODE_PROPERTY_NFKD_QC = 78, MVM_UNICODE_PROPERTY_NONCHARACTER_CODE_POINT = 79, MVM_UNICODE_PROPERTY_OTHER_ALPHABETIC = 80, MVM_UNICODE_PROPERTY_OTHER_DEFAULT_IGNORABLE_CODE_POINT = 81, MVM_UNICODE_PROPERTY_OTHER_GRAPHEME_EXTEND = 82, MVM_UNICODE_PROPERTY_OTHER_ID_CONTINUE = 83, MVM_UNICODE_PROPERTY_OTHER_ID_START = 84, MVM_UNICODE_PROPERTY_OTHER_LOWERCASE = 85, MVM_UNICODE_PROPERTY_OTHER_MATH = 86, MVM_UNICODE_PROPERTY_OTHER_UPPERCASE = 87, MVM_UNICODE_PROPERTY_P = 88, MVM_UNICODE_PROPERTY_PATTERN_SYNTAX = 89, MVM_UNICODE_PROPERTY_PATTERN_WHITE_SPACE = 90, MVM_UNICODE_PROPERTY_PREPENDED_CONCATENATION_MARK = 91, MVM_UNICODE_PROPERTY_QUOTATION_MARK = 92, MVM_UNICODE_PROPERTY_RADICAL = 93, MVM_UNICODE_PROPERTY_REGIONAL_INDICATOR = 94, MVM_UNICODE_PROPERTY_S = 95, MVM_UNICODE_PROPERTY_SENTENCE_TERMINAL = 96, MVM_UNICODE_PROPERTY_SOFT_DOTTED = 97, MVM_UNICODE_PROPERTY_TERMINAL_PUNCTUATION = 98, MVM_UNICODE_PROPERTY_UNIFIED_IDEOGRAPH = 99, MVM_UNICODE_PROPERTY_UPPERCASE = 100, MVM_UNICODE_PROPERTY_VARIATION_SELECTOR = 101, MVM_UNICODE_PROPERTY_WHITE_SPACE = 102, MVM_UNICODE_PROPERTY_XID_CONTINUE = 103, MVM_UNICODE_PROPERTY_XID_START = 104, MVM_UNICODE_PROPERTY_Z = 105, } MVM_unicode_property_codes;MoarVM-2018.03/src/strings/unicode_ops.c0000644000175000017510000013655213251135513020151 0ustar samanthasamantha/* Compares two strings, using the Unicode Collation Algorithm * Return values: * 0 The strings are identical for the collation levels requested * -1/1 String a is less than string b/String a is greater than string b * * `collation_mode` acts like a bitmask. Each of primary, secondary and tertiary * collation levels can be either: disabled, enabled, reversed. * In the table below, where + designates sorting normal direction and * - indicates reversed sorting for that collation level. * * Collation level | bitmask value * Primary+ | 1 * Primary- | 2 * Secondary+ | 4 * Secondary- | 8 * Tertiary+ | 16 * Tertiary- | 32 * Quaternary+ | 64 * Quaternary- | 128 */ /* Finds the lowest codepoint of the next subnode. If there's no next subnode, * returns -1 */ #define MVM_COLLATION_PRIMARY_POSITIVE 1 #define MVM_COLLATION_PRIMARY_NEGATIVE 2 #define MVM_COLLATION_SECONDARY_POSITIVE 4 #define MVM_COLLATION_SECONDARY_NEGATIVE 8 #define MVM_COLLATION_TERTIARY_POSITIVE 16 #define MVM_COLLATION_TERTIARY_NEGATIVE 32 #define MVM_COLLATION_QUATERNARY_POSITIVE 64 #define MVM_COLLATION_QUATERNARY_NEGATIVE 128 MVM_STATIC_INLINE MVMint64 next_node_min (sub_node node) { return node.sub_node_elems ? main_nodes[node.sub_node_link].codepoint : -1; } /* Finds the highest codepoint of the next subnode. If there's no next subnode, * returns -1 */ MVM_STATIC_INLINE MVMint64 next_node_max (sub_node node) { return node.sub_node_elems ? main_nodes[node.sub_node_link + node.sub_node_elems - 1].codepoint : -1; } typedef union collation_key_u collation_key; struct collation_stack { collation_key *keys; MVMint64 stack_top; MVMint64 stack_size; }; typedef struct collation_stack collation_stack; struct collation_key_s { MVMuint32 primary, secondary, tertiary, index; }; union collation_key_u { struct collation_key_s s; MVMuint32 a[4]; }; struct level_eval_s2 { MVMint32 Less, Same, More; }; union level_eval_u2 { MVMint32 a2[4]; struct level_eval_s2 s2; }; struct level_eval_s { union level_eval_u2 primary, secondary, tertiary, quaternary; }; union level_eval_u { struct level_eval_s s; union level_eval_u2 a[3]; }; typedef union level_eval_u level_eval; #define initial_stack_size 100 #define collation_zero 1 struct ring_buffer { MVMCodepoint codes[codepoint_sequence_no_max]; MVMuint32 count; MVMint32 location; MVMCodepoint codes_out[codepoint_sequence_no_max]; MVMuint32 codes_out_count; }; typedef struct ring_buffer ring_buffer; #ifdef COLLATION_DEBUG static void print_sub_node (sub_node subnode) { MVMint64 min = next_node_min(subnode); char * min_sign = min < 0 ? "-" : ""; MVMint64 max = next_node_max(subnode); char * max_sign = max < 0 ? "-" : ""; max = max < 0 ? -max : max; min = min < 0 ? -min : min; fprintf(stderr, "{codepoint 0x%X, next_node_min %s0x%"PRIX64", next_node_max %s0x%"PRIX64", " "sub_node_elems %i, sub_node_link %i, " "collation_key_elems %i, collation_key_link %i}\n", subnode.codepoint, min_sign, min, max_sign, max, subnode.sub_node_elems, subnode.sub_node_link, subnode.collation_key_elems, subnode.collation_key_link); } static void print_stack (MVMThreadContext *tc, collation_stack *stack, char *name, char *details) { int i = 0; fprintf(stderr, "stack_%s “%s†print_stack() stack elems: %li\n", name, details, stack->stack_top + 1); for (i = 0; i < stack->stack_top + 1; i++) { fprintf(stderr, "stack_%s i: %i [%.4X.%.4X.%.4X]\n", name, i, stack->keys[i].s.primary, stack->keys[i].s.secondary, stack->keys[i].s.tertiary); if (30 < i) { fprintf(stderr, "Not printing any more of the stack. Too large\n"); break; } } } static void print_ring_buffer(MVMThreadContext *tc, ring_buffer *buffer) { MVMint64 i; fprintf(stderr, "Buffer: count: %"PRIu32" location %"PRIi32"\nBuffer contents: ", buffer->count, buffer->location); for (i = 0; i < buffer->count && i < codepoint_sequence_no_max; i++) { fprintf(stderr, "i: %"PRIi64": cp: 0x%X ", i, buffer->codes[i]); if (30 < i) { fprintf(stderr, "Not printing any more of the buffer. Too large\n"); break; } } fprintf(stderr, "\n"); } #define DEBUG_COLLATION_MODE_PRINT(level_eval_settings) {\ fprintf(stderr, "Setting collation_mode: %li\nSetting primary {%i,%i,%i}\n"\ "Setting secondary {%i,%i,%i}\nSetting tertiary {%i,%i,%i}\n", collation_mode,\ level_eval_settings.a[0].a2[0], level_eval_settings.a[0].a2[1], level_eval_settings.a[0].a2[2],\ level_eval_settings.a[1].a2[0], level_eval_settings.a[1].a2[1], level_eval_settings.a[1].a2[2],\ level_eval_settings.a[2].a2[0], level_eval_settings.a[2].a2[1], level_eval_settings.a[2].a2[2]);\ } #define DEBUG_PRINT_SPECIAL_PUSHED(what, name, cp) fprintf(stderr, "Special Pushed 0x%X %s onto stack_%s\n", cp, what, name); #define DEBUG_PRINT_SUB_NODE(subnode) print_sub_node(subnode); #define DEBUG_SPECIAL_PUSHED(block_pushed, name) block_pushed = name; #define DEBUG_PRINT_STACK(tc, stack, name, details) print_stack(tc, stack, name, details); #define DEBUG_PRINT_RING_BUFFER(tc, buffer) print_ring_buffer(tc, buffer); #define DEBUG_PRINT(...) fprintf (stderr, __VA_ARGS__) #else #define DEBUG_PRINT_SUB_NODE(subnode) #define DEBUG_PRINT_STACK(tc, stack, name, details) #define DEBUG_SPECIAL_PUSHED(block_pushed, name) #define DEBUG_PRINT_SPECIAL_PUSHED(what, name, cp) #define DEBUG_PRINT_RING_BUFFER(tc, buffer) #define DEBUG_COLLATION_MODE_PRINT(level_eval_settings) #define DEBUG_PRINT(...) #endif MVMint32 MVM_unicode_collation_primary (MVMThreadContext *tc, MVMint32 codepoint) { return MVM_unicode_codepoint_get_property_int(tc, codepoint, MVM_UNICODE_PROPERTY_MVM_COLLATION_PRIMARY); } MVMint32 MVM_unicode_collation_secondary (MVMThreadContext *tc, MVMint32 codepoint) { return MVM_unicode_codepoint_get_property_int(tc, codepoint, MVM_UNICODE_PROPERTY_MVM_COLLATION_SECONDARY); } MVMint32 MVM_unicode_collation_tertiary (MVMThreadContext *tc, MVMint32 codepoint) { return MVM_unicode_codepoint_get_property_int(tc, codepoint, MVM_UNICODE_PROPERTY_MVM_COLLATION_TERTIARY); } MVMint32 MVM_unicode_collation_quickcheck (MVMThreadContext *tc, MVMint32 codepoint) { return MVM_unicode_codepoint_get_property_int(tc, codepoint, MVM_UNICODE_PROPERTY_MVM_COLLATION_QC); } static MVMint64 collation_push_cp (MVMThreadContext *tc, collation_stack *stack, MVMCodepointIter *ci, int *cp_maybe, int cp_num, char *name); static void init_stack (MVMThreadContext *tc, collation_stack *stack) { stack->keys = MVM_malloc(sizeof(collation_key) * initial_stack_size); stack->stack_top = -1; stack->stack_size = initial_stack_size; } static void cleanup_stack (MVMThreadContext *tc, collation_stack *stack) { if (stack->keys != NULL) { MVM_free(stack->keys); stack->keys = NULL; } } static void push_key_to_stack(collation_stack *stack, MVMuint32 primary, MVMuint32 secondary, MVMuint32 tertiary) {\ stack->stack_top++; if (stack->stack_size <= stack->stack_top) { stack->keys = MVM_realloc(stack->keys, (stack->stack_size + initial_stack_size) * sizeof(collation_stack)); stack->stack_size += initial_stack_size; } stack->keys[stack->stack_top].s.primary = primary; stack->keys[stack->stack_top].s.secondary = secondary; stack->keys[stack->stack_top].s.tertiary = tertiary; } static MVMint64 collation_push_level_separator (MVMThreadContext *tc, collation_stack *stack, char *name) { push_key_to_stack(stack, 0, 0, 0); DEBUG_PRINT_STACK(tc, stack, name, "After collation_push_level_separator()"); return 1; } /* Pushes collation keys from a collation_key struct and adds 1 to each level. (This is for places where * we store the native DUCET values and we add one because values on the stack are one more) */ static MVMint64 push_onto_stack (MVMThreadContext *tc, collation_stack *stack, collation_key *keys, int keys_to_push, char *name) { int j; DEBUG_PRINT_STACK(tc, stack, name, "push_onto_stack() Before"); for (j = 0; j < keys_to_push; j++) push_key_to_stack(stack, keys[j].s.primary + 1, keys[j].s.secondary + 1, keys[j].s.tertiary + 1); DEBUG_PRINT_STACK(tc, stack, name, "push_onto_stack() After"); return 1; } /* TODO write a script to generate this code */ MVM_STATIC_INLINE MVMint32 compute_AAAA(MVMCodepoint cp, int offset) { return (offset + (cp >> 15)); } MVM_STATIC_INLINE MVMint32 compute_BBBB_offset(MVMCodepoint cp, int offset) { return ((cp - offset) | 0x8000); } MVM_STATIC_INLINE MVMint32 compute_BBBB_and(MVMCodepoint cp) { return ((cp & 0x7FFF) | 0x8000); } #define initial_collation_norm_buf_size 5 static MVMint32 NFD_and_push_collation_values (MVMThreadContext *tc, MVMCodepoint cp, collation_stack *stack, MVMCodepointIter *ci, char *name) { MVMNormalizer norm; MVMCodepoint cp_out; MVMint32 ready, result_pos = 0; MVMCodepoint *result = MVM_malloc(sizeof(MVMCodepoint) * initial_collation_norm_buf_size); MVMint32 result_size = initial_collation_norm_buf_size; MVMint64 rtrn = 0; MVM_unicode_normalizer_init(tc, &norm, MVM_NORMALIZE_NFD); ready = MVM_unicode_normalizer_process_codepoint(tc, &norm, cp, &cp_out); if (ready) { if (result_size <= result_pos + ready) result = MVM_realloc(result, sizeof(MVMCodepoint) * (result_size += initial_collation_norm_buf_size)); result[result_pos++] = cp_out; while (0 < --ready) result[result_pos++] = MVM_unicode_normalizer_get_codepoint(tc, &norm); } MVM_unicode_normalizer_eof(tc, &norm); ready = MVM_unicode_normalizer_available(tc, &norm); while (ready--) { if (result_size <= result_pos + ready + 1) result = MVM_realloc(result, sizeof(MVMCodepoint) * (result_size += initial_collation_norm_buf_size)); result[result_pos++] = MVM_unicode_normalizer_get_codepoint(tc, &norm); } /* If the codepoint changed or we now have more than before */ if (result[0] != cp || 1 < result_pos) rtrn = collation_push_cp(tc, stack, ci, result, result_pos, name); if (result) MVM_free(result); return rtrn; } /* Returns the number of collation elements pushed onto the stack */ static MVMint32 collation_push_MVM_values (MVMThreadContext *tc, MVMCodepoint cp, collation_stack *stack, MVMCodepointIter *ci, char *name) { collation_key MVM_coll_key = { MVM_unicode_collation_primary(tc, cp), MVM_unicode_collation_secondary(tc, cp), MVM_unicode_collation_tertiary(tc, cp), 0 }; /* For some reason some Tangut Block items return values, so test that too. * Eventually we might want to restructure this code here */ if (is_Block_Tangut(cp) || MVM_coll_key.s.primary <= 0 || MVM_coll_key.s.secondary <= 0 || MVM_coll_key.s.tertiary <= 0) { MVMuint32 AAAA, BBBB; char *block_pushed = NULL; collation_key calculated_key[2] = { {0, 0x20, 0x2, 0}, {0, 0x00, 0x0, 0} }; /* Block=Tangut+Block=Tangut_Components 0x17000..0x18AFF */ if (is_Block_Tangut(cp)) { AAAA = 0xFB00; BBBB = compute_BBBB_offset(cp, 0x17000); DEBUG_SPECIAL_PUSHED(block_pushed, "Block_Tangut_and_Tangut_Components"); } /* Assigned_Block=Nushu 0x1B170..1B2FF (*/ else if (is_Assigned_Block_Nushu(cp)) { AAAA = 0xFB01; BBBB = compute_BBBB_offset(cp, 0x1B170); DEBUG_SPECIAL_PUSHED(block_pushed, "Assigned_Block_Nushu"); } /* Unified_Ideograph=True */ else if (is_unified_ideograph(cp)) { if (is_Block_CJK_Unified_Ideographs_OR_CJK_Compatibility_Ideographs(cp)) { AAAA = compute_AAAA(cp, 0xFB40); BBBB = compute_BBBB_and(cp); DEBUG_SPECIAL_PUSHED(block_pushed, "Ideograph_CJK_Compatibility_OR_Unified"); } /* All other Unified_Ideograph's */ else { AAAA = compute_AAAA(cp, 0xFB80); BBBB = compute_BBBB_and(cp); DEBUG_SPECIAL_PUSHED(block_pushed, "Ideograph_NOT_CJK_Compatibility_OR_Unified"); } } else { MVMint32 NFD_rtrn = NFD_and_push_collation_values(tc, cp, stack, ci, name); if (NFD_rtrn) { return NFD_rtrn; } else { AAAA = compute_AAAA(cp, 0xFBC0); BBBB = compute_BBBB_and(cp); DEBUG_SPECIAL_PUSHED(block_pushed, "Unassigned"); } } calculated_key[0].s.primary = AAAA; calculated_key[1].s.primary = BBBB; DEBUG_PRINT_SPECIAL_PUSHED(block_pushed, name, cp); push_onto_stack(tc, stack, calculated_key, 2, name); return 2; } else { push_key_to_stack(stack, MVM_coll_key.s.primary, MVM_coll_key.s.secondary, MVM_coll_key.s.tertiary); return 1; } } /* This is passed the terminal node and it adds the collation elements linked from * that node to the collation stack * Returns: 1 collation elements from last_node were used 0 collation elements from the first node were used, or it fell back and used collation_push_MVM_values * Essentially the return value lets you know if it ended up pushing collation values for the last codepoint * in the sequence or if it only pushed collation values for fallback_cp */ MVMint64 collation_add_keys_from_node (MVMThreadContext *tc, sub_node *last_node, collation_stack *stack, MVMCodepointIter *ci, char *name, MVMCodepoint fallback_cp, sub_node *first_node) { MVMint64 j; MVMint64 rtrn = 0; sub_node *choosen_node = NULL; /* If there are any collation elements */ if (last_node && last_node->collation_key_elems) { choosen_node = last_node; rtrn = 1; } else if (first_node && first_node->collation_key_elems) { choosen_node = first_node; } if (choosen_node) { for (j = choosen_node->collation_key_link; j < choosen_node->collation_key_link + choosen_node->collation_key_elems; j++) { push_key_to_stack(stack, special_collation_keys[j].primary + 1, special_collation_keys[j].secondary + 1, special_collation_keys[j].tertiary + 1 ); } return rtrn; } /* Terminal node doesn't have any collation data. Fall back to using collation_push_MVM_values() */ collation_push_MVM_values(tc, fallback_cp, stack, ci, name); return rtrn; } MVMint64 find_next_node (MVMThreadContext *tc, sub_node node, MVMCodepoint next_cp) { MVMint64 next_min, next_max; MVMint64 i; /* There is nowhere else to go */ if (!node.sub_node_elems) return -1; next_min = next_node_min(node); next_max = next_node_max(node); /* It's not within bounds */ if (next_cp < next_min || next_max < next_cp) return -1; for (i = node.sub_node_link; i < node.sub_node_link + node.sub_node_elems; i++) { if (main_nodes[i].codepoint == next_cp) return i; } return -1; } MVMint64 get_main_node (MVMThreadContext *tc, int cp, int range_min, int range_max) { MVMint64 i; MVMint64 rtrn = -1; int counter = 0; /* Decrement range_min because binary search defaults to 1..* not 0..* */ range_min--; /* starter_main_nodes_elems are all the nodes which are the origin nodes * searches using binary search */ /* Start range_min at -1 since the lowest node we have to find is at 0, not * 1 (needed for binary search to work) */ for (range_min = -1, range_max = starter_main_nodes_elems; 1 < range_max - range_min;) { i = (range_min + range_max) / 2; if (cp <= main_nodes[i].codepoint) range_max = i; else range_min = i; } /* Final check is here. If we found it, it will match, otherwise not */ if (main_nodes[range_max].codepoint == cp) rtrn = range_max; return rtrn; } /* Returns the number of added collation keys */ static MVMint64 collation_push_cp (MVMThreadContext *tc, collation_stack *stack, MVMCodepointIter *ci, int *cp_maybe, int cp_num, char *name) { MVMint64 rtrn = 0; MVMCodepoint cps[10]; MVMint64 num_cps_processed = 0; int query = -1; int cp_num_orig = cp_num; /* If supplied -1 that means we need to grab it from the codepoint iterator. Otherwise * the value we were passed is the codepoint we should process */ if (cp_num == 0) { cps[0] = MVM_string_ci_get_codepoint(tc, ci); cp_num = 1; } else { MVMint32 i; for (i = 0; i < cp_num; i++) { cps[i] = cp_maybe[i]; } } query = get_main_node(tc, cps[0], 0, starter_main_nodes_elems); if (query != -1) { DEBUG_PRINT_SUB_NODE(main_nodes[query]); /* If there are no sub_node_elems that means we don't need to look at * the next codepoint, we are already at the correct node * If there's no more codepoints in the iterator we also are done here */ if (main_nodes[query].sub_node_elems < 1 || cp_num < 2 && !MVM_string_ci_has_more(tc, ci)) { collation_add_keys_from_node(tc, NULL, stack, ci, name, cps[0], &main_nodes[query]); num_cps_processed++; } /* Otherwise we need to check the next codepoint(s) (0 < sub_node_elems) */ else { MVMint64 last_good_i = 0, last_good_result = -1; MVMint64 i, result = query; DEBUG_PRINT_SUB_NODE(main_nodes[query]); for (i = 0; result != -1 && MVM_string_ci_has_more(tc, ci) && i < 10;) { i++; /* Only grab a codepoint if it doesn't already exist in the array */ if (cp_num <= i) { cps[i] = MVM_string_ci_get_codepoint(tc, ci); cp_num++; } result = find_next_node(tc, main_nodes[result], cps[i]); /* If we got something other than -1 and it has collation elements * store the value so we know how far is valid */ if (result != -1 && main_nodes[result].collation_key_elems != 0) { last_good_i = i; last_good_result = result; } if (result != -1) DEBUG_PRINT_SUB_NODE(main_nodes[result]); } /* If there is no last_good_result we should return a value from main_nodes */ DEBUG_PRINT_SUB_NODE( (last_good_result == -1 ? main_nodes[query] : main_nodes[last_good_result]) ); /* If the terminal_subnode can't be processed then that means it will push the starter codepoint ( cp[0] )'s value onto * the stack, and we must set last_good_i to 0 since it didn't work out */ if (!collation_add_keys_from_node(tc, (last_good_result == -1 ? NULL : &main_nodes[last_good_result]), stack, ci, name, cps[0], &main_nodes[query])) { /* If we get 0 from collation_add_keys_from_node then we only processed * a single codepoint so set last_good_i to 0 */ last_good_i = 0; } num_cps_processed = last_good_i + 1; } } else { /* Push the first codepoint onto the stack */ rtrn = collation_push_MVM_values(tc, cps[0], stack, ci, name); num_cps_processed = 1; } /* If there are any more codepoints remaining call collation_push_cp on the remaining */ if (num_cps_processed < cp_num) { return num_cps_processed + collation_push_cp(tc, stack, ci, cps + num_cps_processed, cp_num - num_cps_processed, name); } return num_cps_processed; } MVMint64 grab_from_stack(MVMThreadContext *tc, MVMCodepointIter *ci, collation_stack *stack, char *name) { if (!MVM_string_ci_has_more(tc, ci)) return 0; collation_push_cp(tc, stack, ci, NULL, 0, name); return 1; } static void init_ringbuffer (MVMThreadContext *tc, ring_buffer *buffer) { MVMint64 i; buffer->count = 0; buffer->location = -1; buffer->codes_out_count = 0; } static void add_to_ring_buffer(MVMThreadContext *tc, ring_buffer *buffer, MVMCodepoint cp) { buffer->location++; if (codepoint_sequence_no_max <= buffer->location) buffer->location = 0; buffer->codes[buffer->location] = cp; buffer->count++; } /* Takes the ring buffer and puts the codepoints in order */ static void ring_buffer_done(MVMThreadContext *tc, ring_buffer *buffer) { buffer->codes_out_count = codepoint_sequence_no_max < buffer->count ? codepoint_sequence_no_max : buffer->count; /* If the buffer hasn't been wraped yet or the last codepoint was pushed onto the last buffer element, * use memcpy to copy it to the out buffer */ if (buffer->count <= codepoint_sequence_no_max || buffer->location == codepoint_sequence_no_max - 1) { memcpy(buffer->codes_out, buffer->codes, sizeof(MVMCodepoint) * buffer->codes_out_count); } /* Otherwise we need to copy it manually */ else { /* Copy backwards from the last copied to the first copied codepoint in the ring buffer */ MVMint32 out_location = buffer->codes_out_count - 1; MVMint32 buf_location = buffer->location; for (; 0 <= out_location; out_location--) { buffer->codes_out[out_location] = buffer->codes[buf_location]; buf_location--; if (buf_location < 0) buf_location = codepoint_sequence_no_max - 1; } } } static MVMint64 collation_return_by_quaternary(MVMThreadContext *tc, level_eval *level_eval_settings, MVMStringIndex length_a, MVMStringIndex length_b, MVMint64 compare_by_cp_rtrn) { if (compare_by_cp_rtrn) { return compare_by_cp_rtrn == -1 ? level_eval_settings->s.quaternary.s2.Less : compare_by_cp_rtrn == 1 ? level_eval_settings->s.quaternary.s2.More : level_eval_settings->s.quaternary.s2.Same ; } else { return length_a < length_b ? level_eval_settings->s.quaternary.s2.Less : length_b < length_a ? level_eval_settings->s.quaternary.s2.More : level_eval_settings->s.quaternary.s2.Same ; } } /* MVM_unicode_string_compare implements the Unicode Collation Algorthm */ MVMint64 MVM_unicode_string_compare(MVMThreadContext *tc, MVMString *a, MVMString *b, MVMint64 collation_mode, MVMint64 lang_mode, MVMint64 country_mode) { MVMStringIndex alen, blen; /* Iteration variables */ MVMCodepointIter a_ci, b_ci; MVMGrapheme32 ai, bi; /* Set it all to 0 to start with. We alter this based on the collation_mode later on */ level_eval level_eval_settings = { { {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0} } }; /* The default level_eval settings, used between two non-equal levels */ union level_eval_u2 level_eval_default = { {-1, 0, 1} }; /* Collation stacks */ collation_stack stack_a; collation_stack stack_b; ring_buffer buf_a, buf_b; /* This value stores what the return value would be if the strings were compared * by codepoint. This is used to break collation value ties */ MVMint64 compare_by_cp_rtrn = 0; MVMint64 pos_a = 0, pos_b = 0, i = 0, rtrn = 0; MVMint16 grab_a_done = 0, grab_b_done = 0; /* From 0 to 2 for primary, secondary, tertiary levels */ MVMint16 level_a = 0, level_b = 0; MVMint64 skipped_a = 0, skipped_b = 0; /* This code sets up level_eval_settings based on the collation_mode */ #define setmodeup(mode, level, Less, Same, More) {\ if (collation_mode & mode) {\ level_eval_settings.a[level].a2[0] += Less;\ level_eval_settings.a[level].a2[1] += Same;\ level_eval_settings.a[level].a2[2] += More;\ }\ } /* Primary */ setmodeup(MVM_COLLATION_PRIMARY_POSITIVE, 0, -1, 0, 1); setmodeup(MVM_COLLATION_PRIMARY_NEGATIVE, 0, 1, 0, -1); /* Secondary */ setmodeup(MVM_COLLATION_SECONDARY_POSITIVE, 1, -1, 0, 1); setmodeup(MVM_COLLATION_SECONDARY_NEGATIVE, 1, 1, 0, -1); /* Tertiary */ setmodeup(MVM_COLLATION_TERTIARY_POSITIVE, 2, -1, 0, 1); setmodeup(MVM_COLLATION_TERTIARY_NEGATIVE, 2, 1, 0, -1); /* Quaternary */ setmodeup(MVM_COLLATION_QUATERNARY_POSITIVE, 3, -1, 0, 1); setmodeup(MVM_COLLATION_QUATERNARY_NEGATIVE, 3, 1, 0, -1); DEBUG_COLLATION_MODE_PRINT(level_eval_settings); init_stack(tc, &stack_a); init_stack(tc, &stack_b); MVM_string_check_arg(tc, a, "compare"); MVM_string_check_arg(tc, b, "compare"); /* Simple cases when one or both are zero length. */ alen = MVM_string_graphs_nocheck(tc, a); blen = MVM_string_graphs_nocheck(tc, b); if (alen == 0 || blen == 0) return collation_return_by_quaternary(tc, &level_eval_settings, alen, blen, 0); /* Initialize a codepoint iterator * For now we decompose utf8-c8 synthetics. Eventually we may want to pass * them back and choose some way to generate sorting info for them, similar * to how Unassigned codepoints are dealt with */ MVMROOT(tc, a_ci, { MVM_string_ci_init(tc, &a_ci, a, 0, 0); MVMROOT(tc, b_ci, { MVM_string_ci_init(tc, &b_ci, b, 0, 0); }); }); init_ringbuffer(tc, &buf_a); init_ringbuffer(tc, &buf_b); /* The ring buffers hold the exact number of codepoints which comprise the longest * sequence of codepoints which map to its own collation keys in the Unicode * Collation Algorithm. As of Unicode 9.0 this number was 3. The number is * generated by the script that generates the C data so we only need to retain * that many codepoints. TODO actually generate codepoint_sequence_no_max */ while (MVM_string_ci_has_more(tc, &a_ci) && MVM_string_ci_has_more(tc, &b_ci)) { MVMCodepoint cp_a = MVM_string_ci_get_codepoint(tc, &a_ci); MVMCodepoint cp_b = MVM_string_ci_get_codepoint(tc, &b_ci); add_to_ring_buffer(tc, &buf_a, cp_a); add_to_ring_buffer(tc, &buf_b, cp_b); if (cp_a != cp_b) { compare_by_cp_rtrn = cp_a < cp_b ? -1 : cp_b < cp_a ? 1 : 0 ; break; } } DEBUG_PRINT_RING_BUFFER(tc, &buf_a); DEBUG_PRINT_RING_BUFFER(tc, &buf_b); ring_buffer_done(tc, &buf_a); ring_buffer_done(tc, &buf_b); collation_push_cp(tc, &stack_b, &b_ci, buf_b.codes_out, buf_b.codes_out_count, "b"); DEBUG_PRINT_STACK(tc, &stack_b, "b", "After Initial grab b"); collation_push_cp(tc, &stack_a, &a_ci, buf_a.codes_out, buf_a.codes_out_count, "a"); DEBUG_PRINT_STACK(tc, &stack_a, "a", "After Initial grab a"); while (rtrn == 0) { while (pos_a <= stack_a.stack_top && pos_b <= stack_b.stack_top) { /* Collation values are set as 1 (collation_zero) higher than what Unicode designates. So a collation value of 1 is ignored as * a 0 in DUCET would be. Whereas a collation value of 0 cannot be skipped and is used only for the tertiary level * of a level separator so it is evaluated as the end of the string, causing the shorter string to win */ if (stack_a.keys[pos_a].a[level_a] == collation_zero) { pos_a++; skipped_a++; continue; } if (stack_b.keys[pos_b].a[level_b] == collation_zero) { pos_b++; skipped_b++; continue; } /* If collation values are not equal */ if (stack_a.keys[pos_a].a[level_a] != stack_b.keys[pos_b].a[level_b]) { union level_eval_u2 effective_level_eval = level_eval_default; /* Aside from ignored (collation_zero) levels, when all primary values * are greater than any secondary values. All secondary values are greater * than any tertiary values. Because of this, we only need to tailor effective_level_evals if the levels match */ if (level_a == level_b) effective_level_eval = level_eval_settings.a[level_a]; rtrn = stack_a.keys[pos_a].a[level_a] < stack_b.keys[pos_b].a[level_b] ? effective_level_eval.s2.Less : stack_a.keys[pos_a].a[level_a] > stack_b.keys[pos_b].a[level_b] ? effective_level_eval.s2.More : effective_level_eval.s2.Same ; DEBUG_PRINT_STACK(tc, &stack_a, "a", "Collation values found not equal"); DEBUG_PRINT_STACK(tc, &stack_b, "b", "Collation values found not equal"); } if (rtrn != 0) { cleanup_stack(tc, &stack_a); cleanup_stack(tc, &stack_b); return rtrn; } pos_a++; pos_b++; } #define if_grab_done(grab_done, stack, ci, pos, level, name) {\ /* If we haven't grabbed all the collation elements we should grab them */\ if (!grab_done) {\ if (!grab_from_stack(tc, &ci, &stack, name)) {\ collation_push_level_separator(tc, &stack, name);\ grab_done = 1;\ }\ }\ /* Here we check if we've already grabbed everything. If we have \ * grabbed we need to move to the next collation level for that \ * stack only TODO, right hand side of conditional needed or not? */ \ if (grab_done && stack.stack_top < pos) {\ /* Only if we're already not on the highest level */\ if (level < 2) {\ pos = 0;\ level++;\ DEBUG_PRINT("Setting level_%s to %"PRIi16" and pos_%s to %"PRIi64". %s_keys_pushed: %li\n",\ name, level, name, pos,name, stack.stack_top + 1);\ }\ else {\ /* TODO get the names of the strings can't wrap in the debug */ \ DEBUG_PRINT_STACK(tc, &stack_a, "a", "Can't wrap string anymore so breaking");\ DEBUG_PRINT_STACK(tc, &stack_b, "b", "Can't wrap string anymore so breaking");\ break;\ }\ }\ } /* Here we wrap to the next level of collation elements if needed */ if_grab_done(grab_b_done, stack_b, b_ci, pos_b, level_b, "b"); if_grab_done(grab_a_done, stack_a, a_ci, pos_a, level_a, "a"); } cleanup_stack(tc, &stack_a); cleanup_stack(tc, &stack_b); /* If we get here, they tied for all levels including the level separator * [0001.0001.0000] The primary and secondary of the level separator we push * get ignored, but the tertiary level value 0 is not ignored. No other values * have 0, so that means those levels must have matched up.*/ /* The tie must be broken by codepoint or length. Use the return value we computed at * the beginning of the function while we were pushing onto the ring buffers */ return collation_return_by_quaternary(tc, &level_eval_settings, alen, blen, compare_by_cp_rtrn); } /* Looks up a codepoint by name. Lazily constructs a hash. */ MVMGrapheme32 MVM_unicode_lookup_by_name(MVMThreadContext *tc, MVMString *name) { MVMuint64 size; char *cname = MVM_string_utf8_encode_C_string(tc, name); size_t cname_len = strlen((const char *) cname ); MVMUnicodeNameRegistry *result; if (!codepoints_by_name) { generate_codepoints_by_name(tc); } HASH_FIND(hash_handle, codepoints_by_name, cname, cname_len, result); MVM_free(cname); return result ? result->codepoint : -1; } /* Quickly determines the length of a number 6.5x faster than doing log10 after * compiler optimization */ MVM_STATIC_INLINE size_t length_of_num (size_t number) { if (number < 10) return 1; return 1 + length_of_num(number / 10); } MVM_STATIC_INLINE size_t length_of_num_16 (size_t number) { if (number < 16) return 1; return 1 + length_of_num_16(number / 16); } MVMString * MVM_unicode_get_name(MVMThreadContext *tc, MVMint64 codepoint) { const char *name = NULL; size_t name_len = 0; /* Catch out-of-bounds code points. */ if (codepoint < 0) { name = ""; } else if (0x10FFFF < codepoint) { name = ""; } if (name) name_len = strlen(name); /* Look up name. */ else { MVMuint32 codepoint_row = MVM_codepoint_to_row_index(tc, codepoint); if (codepoint_row != -1) { name = codepoint_names[codepoint_row]; if (!name) { while (codepoint_row && !codepoint_names[codepoint_row]) codepoint_row--; name = codepoint_names[codepoint_row]; if (name && name[0] != '<') name = NULL; } } if (!name) { /* U+FDD0..U+FDEF and the last two codepoints of each block * are noncharacters (U+FFFE U+FFFF U+1FFFE U+1FFFF U+2FFFE etc.) */ if ((0xFDD0 <= codepoint && codepoint <= 0xFDEF) || (0xFFFE & codepoint) == 0xFFFE) name = ""; else name = ""; } name_len = strlen(name); /* Turn non-unique codepoint names into unique ones by adding the * codepoint * i.e. → * The ASCII codepoints already have the hex code in them, so no need * to add it */ if (name && name[0] == '<' && 255 < codepoint) { size_t i, new_length, num_len = length_of_num_16(codepoint); char *new_name = NULL; /* We pad to 4 width, so make sure the number is accurate */ num_len = num_len < 4 ? 4 : num_len; new_length = name_len + 1 + num_len * sizeof(char); new_name = alloca(new_length); for (i = 0; i < name_len; i++) { if (name[i] == '>') { snprintf(new_name + i, new_length - i, "-%.4"PRIX32"", (MVMuint32)codepoint); /* snprintf adds a null terminator at the end. We don't need * this, so replace with a > instead of using snprintf to add * it. Note: new has no NULL terminator */ new_name[new_length - 1] = '>'; break; } new_name[i] = name[i]; } name = new_name; name_len = new_length; } } return MVM_string_ascii_decode(tc, tc->instance->VMString, name, name_len); } MVMString * MVM_unicode_codepoint_get_property_str(MVMThreadContext *tc, MVMint64 codepoint, MVMint64 property_code) { const char * const str = MVM_unicode_get_property_str(tc, codepoint, property_code); if (!str) return tc->instance->str_consts.empty; return MVM_string_ascii_decode(tc, tc->instance->VMString, str, strlen(str)); } const char * MVM_unicode_codepoint_get_property_cstr(MVMThreadContext *tc, MVMint64 codepoint, MVMint64 property_code) { return MVM_unicode_get_property_str(tc, codepoint, property_code); } MVMint64 MVM_unicode_codepoint_get_property_int(MVMThreadContext *tc, MVMint64 codepoint, MVMint64 property_code) { if (property_code == 0) return 0; return (MVMint64)MVM_unicode_get_property_int(tc, codepoint, property_code); } MVMint64 MVM_unicode_codepoint_get_property_bool(MVMThreadContext *tc, MVMint64 codepoint, MVMint64 property_code) { if (property_code == 0) return 0; return (MVMint64)MVM_unicode_get_property_int(tc, codepoint, property_code) != 0; } MVMint64 MVM_unicode_codepoint_has_property_value(MVMThreadContext *tc, MVMint64 codepoint, MVMint64 property_code, MVMint64 property_value_code) { if (property_code == 0) return 0; return (MVMint64)MVM_unicode_get_property_int(tc, codepoint, property_code) == property_value_code ? 1 : 0; } /* Looks if there is a case change for the provided codepoint. Since a case * change may produce multiple codepoints occasionally, then we return 0 if * the case change is a no-op, and otherwise the number of codepoints. The * codepoints argument will be set to a pointer to a buffer where those code * points can be read from. The caller must not mutate the buffer, nor free * it. */ MVMuint32 MVM_unicode_get_case_change(MVMThreadContext *tc, MVMCodepoint codepoint, MVMint32 case_, const MVMCodepoint **result) { if (case_ == MVM_unicode_case_change_type_fold) { MVMint32 folding_index = MVM_unicode_get_property_int(tc, codepoint, MVM_UNICODE_PROPERTY_CASE_FOLDING); if (folding_index) { MVMint32 is_simple = MVM_unicode_get_property_int(tc, codepoint, MVM_UNICODE_PROPERTY_CASE_FOLDING_SIMPLE); if (is_simple) { *result = &(CaseFolding_simple_table[folding_index]); return 1; } else { MVMint32 i = 3; while (0 < i && CaseFolding_grows_table[folding_index][i - 1] == 0) i--; *result = &(CaseFolding_grows_table[folding_index][0]); return i; } } } else { MVMint32 special_casing_index = MVM_unicode_get_property_int(tc, codepoint, MVM_UNICODE_PROPERTY_SPECIAL_CASING); if (special_casing_index) { MVMint32 i = 3; while (0 < i && SpecialCasing_table[special_casing_index][case_][i - 1] == 0) i--; *result = SpecialCasing_table[special_casing_index][case_]; return i; } else { MVMint32 changes_index = MVM_unicode_get_property_int(tc, codepoint, MVM_UNICODE_PROPERTY_CASE_CHANGE_INDEX); if (changes_index) { const MVMCodepoint *found = &(case_changes[changes_index][case_]); if (*found != 0) { *result = found; return 1; } } } } return 0; } /* XXX make all the statics members of the global MVM instance instead? */ static MVMUnicodeNameRegistry *property_codes_by_names_aliases; static MVMUnicodeGraphemeNameRegistry *property_codes_by_seq_names; static void generate_property_codes_by_names_aliases(MVMThreadContext *tc) { MVMuint32 num_names = num_unicode_property_keypairs; while (num_names--) { MVMUnicodeNameRegistry *entry = MVM_malloc(sizeof(MVMUnicodeNameRegistry)); entry->name = (char *)unicode_property_keypairs[num_names].name; entry->codepoint = unicode_property_keypairs[num_names].value; HASH_ADD_KEYPTR(hash_handle, property_codes_by_names_aliases, entry->name, strlen(entry->name), entry); } } static void generate_property_codes_by_seq_names(MVMThreadContext *tc) { MVMuint32 num_names = num_unicode_seq_keypairs; while (num_names--) { MVMUnicodeGraphemeNameRegistry *entry = MVM_malloc(sizeof(MVMUnicodeGraphemeNameRegistry)); entry->name = (char *)uni_seq_pairs[num_names].name; entry->structindex = uni_seq_pairs[num_names].value; HASH_ADD_KEYPTR(hash_handle, property_codes_by_seq_names, entry->name, strlen(entry->name), entry); } } MVMint32 MVM_unicode_name_to_property_code(MVMThreadContext *tc, MVMString *name) { MVMuint64 size; char *cname = MVM_string_ascii_encode(tc, name, &size, 0); MVMUnicodeNameRegistry *result; if (!property_codes_by_names_aliases) { generate_property_codes_by_names_aliases(tc); } HASH_FIND(hash_handle, property_codes_by_names_aliases, cname, strlen((const char *)cname), result); MVM_free(cname); /* not really codepoint, really just an index */ return result ? result->codepoint : 0; } static void generate_unicode_property_values_hashes(MVMThreadContext *tc) { MVMUnicodeNameRegistry **hash_array = MVM_calloc(MVM_NUM_PROPERTY_CODES, sizeof(MVMUnicodeNameRegistry *)); MVMuint32 index = 0; MVMUnicodeNameRegistry *entry = NULL, *binaries = NULL; for ( ; index < num_unicode_property_value_keypairs; index++) { MVMint32 property_code = unicode_property_value_keypairs[index].value >> 24; entry = MVM_malloc(sizeof(MVMUnicodeNameRegistry)); entry->name = (char *)unicode_property_value_keypairs[index].name; entry->codepoint = unicode_property_value_keypairs[index].value & 0xFFFFFF; HASH_ADD_KEYPTR(hash_handle, hash_array[property_code], entry->name, strlen(entry->name), entry); } for (index = 0; index < MVM_NUM_PROPERTY_CODES; index++) { if (!hash_array[index]) { if (!binaries) { MVMUnicodeNamedValue yes[8] = { {"T",1}, {"Y",1}, {"Yes",1}, {"yes",1}, {"True",1}, {"true",1}, {"t",1}, {"y",1} }; MVMUnicodeNamedValue no [8] = { {"F",0}, {"N",0}, {"No",0}, {"no",0}, {"False",0}, {"false",0}, {"f",0}, {"n",0} }; MVMuint8 i; for (i = 0; i < 8; i++) { entry = MVM_malloc(sizeof(MVMUnicodeNameRegistry)); entry->name = (char *)yes[i].name; entry->codepoint = yes[i].value; HASH_ADD_KEYPTR(hash_handle, binaries, yes[i].name, strlen(yes[i].name), entry); } for (i = 0; i < 8; i++) { entry = MVM_malloc(sizeof(MVMUnicodeNameRegistry)); entry->name = (char *)no[i].name; entry->codepoint = no[i].value; HASH_ADD_KEYPTR(hash_handle, binaries, no[i].name, strlen(no[i].name), entry); } } hash_array[index] = binaries; } } unicode_property_values_hashes = hash_array; } MVMint32 unicode_cname_to_property_value_code(MVMThreadContext *tc, MVMint64 property_code, const char *cname, MVMuint64 cname_length) { char *out_str = NULL; MVMUnicodeNameRegistry *result = NULL; /* number + dash + property_value + NULL */ MVMuint64 out_str_length = length_of_num(property_code) + 1 + cname_length + 1; if (1024 < out_str_length) MVM_exception_throw_adhoc(tc, "Property value or name queried is larger than allowed."); out_str = alloca(sizeof(char) * out_str_length); snprintf(out_str, out_str_length, "%"PRIi64"-%s", property_code, cname); HASH_FIND(hash_handle, unicode_property_values_hashes[property_code], out_str, out_str_length - 1, result); return result ? result->codepoint : 0; } MVMint32 MVM_unicode_name_to_property_value_code(MVMThreadContext *tc, MVMint64 property_code, MVMString *name) { if (property_code <= 0 || MVM_NUM_PROPERTY_CODES <= property_code) return 0; else { MVMuint64 cname_length; char *cname = MVM_string_ascii_encode(tc, name, &cname_length, 0); MVMint32 code = unicode_cname_to_property_value_code(tc, property_code, cname, cname_length); MVM_free(cname); return code; } } MVMint32 MVM_unicode_cname_to_property_value_code(MVMThreadContext *tc, MVMint64 property_code, const char *cname, size_t cname_length) { if (property_code <= 0 || MVM_NUM_PROPERTY_CODES <= property_code) return 0; else return unicode_cname_to_property_value_code(tc, property_code, cname, cname_length); } /* Look up the primary composite for a pair of codepoints, if it exists. * Returns 0 if not. */ MVMCodepoint MVM_unicode_find_primary_composite(MVMThreadContext *tc, MVMCodepoint l, MVMCodepoint c) { MVMint32 lower = l & 0xFF; MVMint32 upper = (l >> 8) & 0xFF; MVMint32 plane = (l >> 16) & 0xF; const MVMint32 *pcs = comp_p[plane][upper][lower]; if (pcs) { MVMint32 entries = pcs[0]; MVMint32 i; for (i = 1; i < entries; i += 2) if (pcs[i] == c) return pcs[i + 1]; } return 0; } static uv_mutex_t property_hash_count_mutex; static int property_hash_count = 0; static uv_once_t property_hash_count_guard = UV_ONCE_INIT; static void setup_property_mutex(void) { uv_mutex_init(&property_hash_count_mutex); } void MVM_unicode_init(MVMThreadContext *tc) { uv_once(&property_hash_count_guard, setup_property_mutex); uv_mutex_lock(&property_hash_count_mutex); if (property_hash_count == 0) { generate_unicode_property_values_hashes(tc); } property_hash_count++; uv_mutex_unlock(&property_hash_count_mutex); } void MVM_unicode_release(MVMThreadContext *tc) { uv_mutex_lock(&property_hash_count_mutex); property_hash_count--; if (property_hash_count == 0) { int i; for (i = 0; i < MVM_NUM_PROPERTY_CODES; i++) { MVMUnicodeNameRegistry *entry = NULL; MVMUnicodeNameRegistry *tmp = NULL; unsigned bucket_tmp; int j; if (!unicode_property_values_hashes[i]) { continue; } for(j = i + 1; j < MVM_NUM_PROPERTY_CODES; j++) { if (unicode_property_values_hashes[i] == unicode_property_values_hashes[j]) { unicode_property_values_hashes[j] = NULL; } } HASH_ITER(hash_handle, unicode_property_values_hashes[i], entry, tmp, bucket_tmp) { HASH_DELETE(hash_handle, unicode_property_values_hashes[i], entry); MVM_free(entry); } assert(!unicode_property_values_hashes[i]); } MVM_free(unicode_property_values_hashes); unicode_property_values_hashes = NULL; } uv_mutex_unlock(&property_hash_count_mutex); } /* Looks up a codepoint sequence or codepoint by name (case insensitive). First tries to look it up by codepoint with MVM_unicode_lookup_by_name and if not found as a named codepoint, lazily constructs a hash of the codepoint sequences and looks up the sequence name */ MVMString * MVM_unicode_string_from_name(MVMThreadContext *tc, MVMString *name) { MVMString * name_uc = MVM_string_uc(tc, name); char * cname = NULL; MVMUnicodeGraphemeNameRegistry *result; MVMGrapheme32 result_graph = MVM_unicode_lookup_by_name(tc, name_uc); /* If it's just a codepoint, return that */ if (0 <= result_graph) { return MVM_string_chr(tc, result_graph); } /* Otherwise look up the sequence */ else { const MVMint32 *uni_seq = NULL; cname = MVM_string_utf8_encode_C_string(tc, name_uc); if (!property_codes_by_seq_names) { generate_property_codes_by_seq_names(tc); } HASH_FIND(hash_handle, property_codes_by_seq_names, cname, strlen((const char *)cname), result); MVM_free(cname); /* If we can't find a result return an empty string */ if (!result) return tc->instance->str_consts.empty; uni_seq = uni_seq_enum[result->structindex]; /* The first element is the number of codepoints in the sequence */ return MVM_unicode_codepoints_c_array_to_nfg_string(tc, (MVMCodepoint *) uni_seq + 1, uni_seq[0]); } } MoarVM-2018.03/src/strings/unicode_ops.h0000644000175000017510000000036113237701240020142 0ustar samanthasamanthaMVMint64 MVM_unicode_string_compare(MVMThreadContext *tc, MVMString *a, MVMString *b, MVMint64 collation_mode, MVMint64 lang_mode, MVMint64 country_mode); MVMString * MVM_unicode_string_from_name(MVMThreadContext *tc, MVMString *name); MoarVM-2018.03/src/strings/unicode_uca.c0000644000175000017510000072623213237701240020120 0ustar samanthasamantha/* This file generated from tools/Generate-Collation-Data.p6 */ struct collation_key { MVMuint32 primary :16; MVMuint32 tertiary :5; MVMuint32 special :1; MVMuint32 secondary :9; }; struct sub_node { MVMuint32 codepoint :18; MVMuint32 collation_key_link :14; MVMuint32 sub_node_link :13; MVMuint32 sub_node_elems :13; MVMuint32 collation_key_elems :5; }; typedef struct sub_node sub_node; #define main_nodes_elems 4697 #define starter_main_nodes_elems 3803 #define codepoint_sequence_no_max 3 #define special_collation_keys_elems 10435 /* Data from PropList.txt */ MVM_STATIC_INLINE MVMuint32 is_unified_ideograph (MVMCodepoint cp) { return (0x3400 <= cp && cp <= 0x4DB5 ) /* 3400..4DB5 Unified_Ideograph # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 */ || (0x4E00 <= cp && cp <= 0x9FEA ) /* 4E00..9FEA Unified_Ideograph # Lo [20971] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FEA */ || (0xFA0E <= cp && cp <= 0xFA0F ) /* FA0E..FA0F Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA0E..CJK COMPATIBILITY IDEOGRAPH-FA0F */ || (0xFA11 == cp) /* FA11..FA11 Unified_Ideograph # Lo CJK COMPATIBILITY IDEOGRAPH-FA11 */ || (0xFA13 <= cp && cp <= 0xFA14 ) /* FA13..FA14 Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA13..CJK COMPATIBILITY IDEOGRAPH-FA14 */ || (0xFA1F == cp) /* FA1F..FA1F Unified_Ideograph # Lo CJK COMPATIBILITY IDEOGRAPH-FA1F */ || (0xFA21 == cp) /* FA21..FA21 Unified_Ideograph # Lo CJK COMPATIBILITY IDEOGRAPH-FA21 */ || (0xFA23 <= cp && cp <= 0xFA24 ) /* FA23..FA24 Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA23..CJK COMPATIBILITY IDEOGRAPH-FA24 */ || (0xFA27 <= cp && cp <= 0xFA29 ) /* FA27..FA29 Unified_Ideograph # Lo [3] CJK COMPATIBILITY IDEOGRAPH-FA27..CJK COMPATIBILITY IDEOGRAPH-FA29 */ || (0x20000 <= cp && cp <= 0x2A6D6) /* 20000..2A6D6 Unified_Ideograph # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 */ || (0x2A700 <= cp && cp <= 0x2B734) /* 2A700..2B734 Unified_Ideograph # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734 */ || (0x2B740 <= cp && cp <= 0x2B81D) /* 2B740..2B81D Unified_Ideograph # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D */ || (0x2B820 <= cp && cp <= 0x2CEA1) /* 2B820..2CEA1 Unified_Ideograph # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 */ || (0x2CEB0 <= cp && cp <= 0x2EBE0) /* 2CEB0..2EBE0 Unified_Ideograph # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 */ ; } /* Data from Blocks.txt */ MVM_STATIC_INLINE MVMuint32 is_Assigned_Block_Nushu (MVMCodepoint cp) { return (0x1B170 <= cp && cp <= 0x1B2FF) /* 1B170..1B2FF Nushu */ ; } /* Data from Blocks.txt */ MVM_STATIC_INLINE MVMuint32 is_Block_Tangut (MVMCodepoint cp) { return (0x17000 <= cp && cp <= 0x187FF) /* 17000..187FF Tangut */ || (0x18800 <= cp && cp <= 0x18AFF) /* 18800..18AFF Tangut Components */ ; } /* Data from Blocks.txt */ MVM_STATIC_INLINE MVMuint32 is_Block_CJK_Unified_Ideographs_OR_CJK_Compatibility_Ideographs (MVMCodepoint cp) { return (0x4E00 <= cp && cp <= 0x9FFF ) /* 4E00..9FFF CJK Unified Ideographs */ || (0xF900 <= cp && cp <= 0xFAFF ) /* F900..FAFF CJK Compatibility Ideographs */ ; } sub_node main_nodes[4697] = { {76,0,3803,1,0},{108,0,3804,1,0},{188,4,0,0,3},{189,7,0,0,3},{190,10,0,0,3}, {192,13,0,0,2},{193,15,0,0,2},{194,17,0,0,2},{195,19,0,0,2},{196,21,0,0,2},{197, 23,0,0,2},{198,25,0,0,3},{199,28,0,0,2},{200,30,0,0,2},{201,32,0,0,2},{202,34,0, 0,2},{203,36,0,0,2},{204,38,0,0,2},{205,40,0,0,2},{206,42,0,0,2},{207,44,0,0,2}, {208,46,0,0,2},{209,48,0,0,2},{210,50,0,0,2},{211,52,0,0,2},{212,54,0,0,2},{213, 56,0,0,2},{214,58,0,0,2},{216,60,0,0,2},{217,62,0,0,2},{218,64,0,0,2},{219,66,0, 0,2},{220,68,0,0,2},{221,70,0,0,2},{223,72,0,0,3},{224,75,0,0,2},{225,77,0,0,2}, {226,79,0,0,2},{227,81,0,0,2},{228,83,0,0,2},{229,85,0,0,2},{230,87,0,0,3},{231, 90,0,0,2},{232,92,0,0,2},{233,94,0,0,2},{234,96,0,0,2},{235,98,0,0,2},{236,100, 0,0,2},{237,102,0,0,2},{238,104,0,0,2},{239,106,0,0,2},{240,108,0,0,2},{241,110, 0,0,2},{242,112,0,0,2},{243,114,0,0,2},{244,116,0,0,2},{245,118,0,0,2},{246,120, 0,0,2},{248,122,0,0,2},{249,124,0,0,2},{250,126,0,0,2},{251,128,0,0,2},{252,130, 0,0,2},{253,132,0,0,2},{255,134,0,0,2},{256,136,0,0,2},{257,138,0,0,2},{258,140, 0,0,2},{259,142,0,0,2},{260,144,0,0,2},{261,146,0,0,2},{262,148,0,0,2},{263,150, 0,0,2},{264,152,0,0,2},{265,154,0,0,2},{266,156,0,0,2},{267,158,0,0,2},{268,160, 0,0,2},{269,162,0,0,2},{270,164,0,0,2},{271,166,0,0,2},{272,168,0,0,2},{273,170, 0,0,2},{274,172,0,0,2},{275,174,0,0,2},{276,176,0,0,2},{277,178,0,0,2},{278,180, 0,0,2},{279,182,0,0,2},{280,184,0,0,2},{281,186,0,0,2},{282,188,0,0,2},{283,190, 0,0,2},{284,192,0,0,2},{285,194,0,0,2},{286,196,0,0,2},{287,198,0,0,2},{288,200, 0,0,2},{289,202,0,0,2},{290,204,0,0,2},{291,206,0,0,2},{292,208,0,0,2},{293,210, 0,0,2},{294,212,0,0,2},{295,214,0,0,2},{296,216,0,0,2},{297,218,0,0,2},{298,220, 0,0,2},{299,222,0,0,2},{300,224,0,0,2},{301,226,0,0,2},{302,228,0,0,2},{303,230, 0,0,2},{304,232,0,0,2},{306,234,0,0,2},{307,236,0,0,2},{308,238,0,0,2},{309,240, 0,0,2},{310,242,0,0,2},{311,244,0,0,2},{313,246,0,0,2},{314,248,0,0,2},{315,250, 0,0,2},{316,252,0,0,2},{317,254,0,0,2},{318,256,0,0,2},{319,258,0,0,2},{320,260, 0,0,2},{321,262,0,0,2},{322,264,0,0,2},{323,266,0,0,2},{324,268,0,0,2},{325,270, 0,0,2},{326,272,0,0,2},{327,274,0,0,2},{328,276,0,0,2},{329,278,0,0,2},{332,280, 0,0,2},{333,282,0,0,2},{334,284,0,0,2},{335,286,0,0,2},{336,288,0,0,2},{337,290, 0,0,2},{338,292,0,0,3},{339,295,0,0,3},{340,298,0,0,2},{341,300,0,0,2},{342,302, 0,0,2},{343,304,0,0,2},{344,306,0,0,2},{345,308,0,0,2},{346,310,0,0,2},{347,312, 0,0,2},{348,314,0,0,2},{349,316,0,0,2},{350,318,0,0,2},{351,320,0,0,2},{352,322, 0,0,2},{353,324,0,0,2},{354,326,0,0,2},{355,328,0,0,2},{356,330,0,0,2},{357,332, 0,0,2},{360,334,0,0,2},{361,336,0,0,2},{362,338,0,0,2},{363,340,0,0,2},{364,342, 0,0,2},{365,344,0,0,2},{366,346,0,0,2},{367,348,0,0,2},{368,350,0,0,2},{369,352, 0,0,2},{370,354,0,0,2},{371,356,0,0,2},{372,358,0,0,2},{373,360,0,0,2},{374,362, 0,0,2},{375,364,0,0,2},{376,366,0,0,2},{377,368,0,0,2},{378,370,0,0,2},{379,372, 0,0,2},{380,374,0,0,2},{381,376,0,0,2},{382,378,0,0,2},{383,380,0,0,2},{397,382, 0,0,2},{416,384,0,0,2},{417,386,0,0,2},{431,388,0,0,2},{432,390,0,0,2},{446,392, 0,0,2},{452,394,0,0,3},{453,397,0,0,3},{454,400,0,0,3},{455,403,0,0,2},{456,405, 0,0,2},{457,407,0,0,2},{458,409,0,0,2},{459,411,0,0,2},{460,413,0,0,2},{461,415, 0,0,2},{462,417,0,0,2},{463,419,0,0,2},{464,421,0,0,2},{465,423,0,0,2},{466,425, 0,0,2},{467,427,0,0,2},{468,429,0,0,2},{469,431,0,0,3},{470,434,0,0,3},{471,437, 0,0,3},{472,440,0,0,3},{473,443,0,0,3},{474,446,0,0,3},{475,449,0,0,3},{476,452, 0,0,3},{478,455,0,0,3},{479,458,0,0,3},{480,461,0,0,3},{481,464,0,0,3},{482,467, 0,0,4},{483,471,0,0,4},{486,475,0,0,2},{487,477,0,0,2},{488,479,0,0,2},{489,481, 0,0,2},{490,483,0,0,2},{491,485,0,0,2},{492,487,0,0,3},{493,490,0,0,3},{494,493, 0,0,2},{495,495,0,0,2},{496,497,0,0,2},{497,499,0,0,2},{498,501,0,0,2},{499,503, 0,0,2},{500,505,0,0,2},{501,507,0,0,2},{504,509,0,0,2},{505,511,0,0,2},{506,513, 0,0,3},{507,516,0,0,3},{508,519,0,0,4},{509,523,0,0,4},{510,527,0,0,3},{511,530, 0,0,3},{512,533,0,0,2},{513,535,0,0,2},{514,537,0,0,2},{515,539,0,0,2},{516,541, 0,0,2},{517,543,0,0,2},{518,545,0,0,2},{519,547,0,0,2},{520,549,0,0,2},{521,551, 0,0,2},{522,553,0,0,2},{523,555,0,0,2},{524,557,0,0,2},{525,559,0,0,2},{526,561, 0,0,2},{527,563,0,0,2},{528,565,0,0,2},{529,567,0,0,2},{530,569,0,0,2},{531,571, 0,0,2},{532,573,0,0,2},{533,575,0,0,2},{534,577,0,0,2},{535,579,0,0,2},{536,581, 0,0,2},{537,583,0,0,2},{538,585,0,0,2},{539,587,0,0,2},{542,589,0,0,2},{543,591, 0,0,2},{550,593,0,0,2},{551,595,0,0,2},{552,597,0,0,2},{553,599,0,0,2},{554,601, 0,0,3},{555,604,0,0,3},{556,607,0,0,3},{557,610,0,0,3},{558,613,0,0,2},{559,615, 0,0,2},{560,617,0,0,3},{561,620,0,0,3},{562,623,0,0,2},{563,625,0,0,2},{568,627, 0,0,2},{569,629,0,0,2},{675,631,0,0,2},{676,633,0,0,2},{677,635,0,0,2},{678,637, 0,0,2},{679,639,0,0,2},{680,641,0,0,2},{681,643,0,0,2},{682,645,0,0,2},{683,647, 0,0,2},{776,0,3805,1,0},{901,651,0,0,2},{902,653,0,0,2},{904,655,0,0,2},{905, 657,0,0,2},{906,659,0,0,2},{908,661,0,0,2},{910,663,0,0,2},{911,665,0,0,2},{912, 667,0,0,3},{938,670,0,0,2},{939,672,0,0,2},{940,674,0,0,2},{941,676,0,0,2},{942, 678,0,0,2},{943,680,0,0,2},{944,682,0,0,3},{970,685,0,0,2},{971,687,0,0,2},{972, 689,0,0,2},{973,691,0,0,2},{974,693,0,0,2},{975,695,0,0,3},{979,698,0,0,2},{980, 700,0,0,2},{983,702,0,0,3},{1024,705,0,0,2},{1025,707,0,0,2},{1027,709,0,0,2}, {1031,711,0,0,2},{1036,713,0,0,2},{1037,715,0,0,2},{1038,717,0,0,2},{1104,719,0, 0,2},{1105,721,0,0,2},{1107,723,0,0,2},{1111,725,0,0,2},{1116,727,0,0,2},{1117, 729,0,0,2},{1118,731,0,0,2},{1142,733,0,0,2},{1143,735,0,0,2},{1168,737,0,0,2}, {1169,739,0,0,2},{1217,741,0,0,2},{1218,743,0,0,2},{1232,745,0,0,2},{1233,747,0, 0,2},{1234,749,0,0,2},{1235,751,0,0,2},{1238,753,0,0,2},{1239,755,0,0,2},{1242, 757,0,0,2},{1243,759,0,0,2},{1244,761,0,0,2},{1245,763,0,0,2},{1246,765,0,0,2}, {1247,767,0,0,2},{1250,769,0,0,2},{1251,771,0,0,2},{1252,773,0,0,2},{1253,775,0, 0,2},{1254,777,0,0,2},{1255,779,0,0,2},{1258,781,0,0,2},{1259,783,0,0,2},{1260, 785,0,0,2},{1261,787,0,0,2},{1262,789,0,0,2},{1263,791,0,0,2},{1264,793,0,0,2}, {1265,795,0,0,2},{1266,797,0,0,2},{1267,799,0,0,2},{1268,801,0,0,2},{1269,803,0, 0,2},{1272,805,0,0,2},{1273,807,0,0,2},{1415,809,0,0,2},{1488,0,3806,3,0},{1489, 0,3809,2,0},{1490,0,3811,1,0},{1491,0,3812,1,0},{1492,0,3813,1,0},{1493,0,3814, 2,0},{1494,0,3816,1,0},{1496,0,3817,1,0},{1497,0,3818,2,0},{1498,0,3820,1,0}, {1499,0,3821,2,0},{1500,0,3823,1,0},{1502,0,3824,1,0},{1504,0,3825,1,0},{1505,0, 3826,1,0},{1507,0,3827,1,0},{1508,0,3828,2,0},{1510,0,3830,1,0},{1511,0,3831,1, 0},{1512,0,3832,1,0},{1513,0,3833,3,0},{1514,0,3838,1,0},{1520,879,0,0,2},{1521, 881,0,0,2},{1522,883,3839,1,2},{1653,888,0,0,2},{1654,890,0,0,2},{1655,892,0,0, 2},{1656,894,0,0,2},{1728,896,0,0,2},{1730,898,0,0,2},{1747,900,0,0,2},{1789, 902,0,0,2},{1790,904,0,0,2},{1812,906,0,0,2},{1820,908,0,0,2},{1831,910,0,0,2}, {1837,912,0,0,2},{1838,914,0,0,2},{1839,916,0,0,2},{2024,918,0,0,2},{2025,920,0, 0,2},{2026,922,0,0,2},{2325,0,3840,1,0},{2326,0,3841,1,0},{2327,0,3842,1,0}, {2332,0,3843,1,0},{2337,0,3844,1,0},{2338,0,3845,1,0},{2345,936,0,0,2},{2347,0, 3846,1,0},{2351,0,3847,1,0},{2353,942,0,0,2},{2356,944,0,0,2},{2465,0,3848,1,0}, {2466,0,3849,1,0},{2479,0,3850,1,0},{2510,952,0,0,2},{2582,0,3851,1,0},{2583,0, 3852,1,0},{2588,0,3853,1,0},{2603,0,3854,1,0},{2610,0,3855,1,0},{2616,0,3856,1, 0},{2849,0,3857,1,0},{2850,0,3858,1,0},{3406,970,0,0,2},{3412,972,0,0,2},{3413, 974,0,0,2},{3414,976,0,0,2},{3450,978,0,0,2},{3451,980,0,0,2},{3452,982,0,0,2}, {3453,984,0,0,2},{3454,986,0,0,2},{3455,988,0,0,2},{3648,0,3859,46,0},{3649,0, 3905,46,0},{3650,0,3951,46,0},{3651,0,3997,46,0},{3652,0,4043,46,0},{3661,0, 4089,1,0},{3776,0,4090,31,0},{3777,0,4121,31,0},{3778,0,4152,31,0},{3779,0,4183, 31,0},{3780,0,4214,31,0},{3789,0,4245,1,0},{3804,1772,0,0,2},{3805,1774,0,0,2}, {3840,1776,0,0,3},{3904,0,4246,1,0},{3906,0,4247,1,0},{3916,0,4248,1,0},{3921,0, 4249,1,0},{3926,0,4250,1,0},{3931,0,4251,1,0},{3946,1791,0,0,2},{3953,0,4252,3, 0},{3984,0,4255,1,0},{3986,0,4256,1,0},{3996,0,4257,1,0},{4001,0,4258,1,0}, {4006,0,4259,1,0},{4011,0,4260,1,0},{4018,0,4261,2,0},{4019,0,4264,2,0},{4026, 1812,0,0,2},{4027,1814,0,0,2},{4028,1816,0,0,2},{4159,1818,0,0,3},{5793,1821,0, 0,2},{5796,1823,0,0,2},{5797,1825,0,0,2},{5799,1827,0,0,2},{5801,1829,0,0,2}, {5804,1831,0,0,2},{5805,1833,0,0,2},{5806,1835,0,0,2},{5811,1837,0,0,2},{5812, 1839,0,0,2},{5813,1841,0,0,2},{5814,1843,0,0,2},{5819,1845,0,0,2},{5820,1847,0, 0,2},{5821,1849,0,0,2},{5823,1851,0,0,2},{5824,1853,0,0,2},{5826,1855,0,0,2}, {5828,1857,0,0,2},{5830,1859,0,0,2},{5835,1861,0,0,2},{5836,1863,0,0,2},{5837, 1865,0,0,2},{5838,1867,0,0,2},{5840,1869,0,0,2},{5841,1871,0,0,2},{5843,1873,0, 0,2},{5844,1875,0,0,2},{5845,1877,0,0,2},{5848,1879,0,0,2},{5849,1881,0,0,2}, {5851,1883,0,0,2},{5853,1885,0,0,2},{5863,1887,0,0,2},{5864,1889,0,0,2},{5865, 1891,0,0,2},{5866,1893,0,0,2},{5870,1895,0,0,2},{5871,1897,0,0,4},{5872,1901,0, 0,2},{6429,1903,0,0,2},{6430,1905,0,0,2},{6581,0,4267,44,0},{6582,0,4311,44,0}, {6583,0,4355,44,0},{6586,0,4399,44,0},{6622,2259,0,0,2},{6623,2261,0,0,3},{6740, 2264,0,0,3},{7469,2267,0,0,3},{7545,2270,0,0,2},{7546,2272,0,0,3},{7582,2275,0, 0,2},{7635,2277,0,0,2},{7636,2279,0,0,3},{7637,2282,0,0,2},{7638,2284,0,0,2}, {7639,2286,0,0,2},{7640,2288,0,0,2},{7641,2290,0,0,2},{7653,2292,0,0,2},{7661, 2294,0,0,2},{7664,2296,0,0,2},{7666,2298,0,0,2},{7667,2300,0,0,2},{7668,2302,0, 0,2},{7680,2304,0,0,2},{7681,2306,0,0,2},{7682,2308,0,0,2},{7683,2310,0,0,2}, {7684,2312,0,0,2},{7685,2314,0,0,2},{7686,2316,0,0,2},{7687,2318,0,0,2},{7688, 2320,0,0,3},{7689,2323,0,0,3},{7690,2326,0,0,2},{7691,2328,0,0,2},{7692,2330,0, 0,2},{7693,2332,0,0,2},{7694,2334,0,0,2},{7695,2336,0,0,2},{7696,2338,0,0,2}, {7697,2340,0,0,2},{7698,2342,0,0,2},{7699,2344,0,0,2},{7700,2346,0,0,3},{7701, 2349,0,0,3},{7702,2352,0,0,3},{7703,2355,0,0,3},{7704,2358,0,0,2},{7705,2360,0, 0,2},{7706,2362,0,0,2},{7707,2364,0,0,2},{7708,2366,0,0,3},{7709,2369,0,0,3}, {7710,2372,0,0,2},{7711,2374,0,0,2},{7712,2376,0,0,2},{7713,2378,0,0,2},{7714, 2380,0,0,2},{7715,2382,0,0,2},{7716,2384,0,0,2},{7717,2386,0,0,2},{7718,2388,0, 0,2},{7719,2390,0,0,2},{7720,2392,0,0,2},{7721,2394,0,0,2},{7722,2396,0,0,2}, {7723,2398,0,0,2},{7724,2400,0,0,2},{7725,2402,0,0,2},{7726,2404,0,0,3},{7727, 2407,0,0,3},{7728,2410,0,0,2},{7729,2412,0,0,2},{7730,2414,0,0,2},{7731,2416,0, 0,2},{7732,2418,0,0,2},{7733,2420,0,0,2},{7734,2422,0,0,2},{7735,2424,0,0,2}, {7736,2426,0,0,3},{7737,2429,0,0,3},{7738,2432,0,0,2},{7739,2434,0,0,2},{7740, 2436,0,0,2},{7741,2438,0,0,2},{7742,2440,0,0,2},{7743,2442,0,0,2},{7744,2444,0, 0,2},{7745,2446,0,0,2},{7746,2448,0,0,2},{7747,2450,0,0,2},{7748,2452,0,0,2}, {7749,2454,0,0,2},{7750,2456,0,0,2},{7751,2458,0,0,2},{7752,2460,0,0,2},{7753, 2462,0,0,2},{7754,2464,0,0,2},{7755,2466,0,0,2},{7756,2468,0,0,3},{7757,2471,0, 0,3},{7758,2474,0,0,3},{7759,2477,0,0,3},{7760,2480,0,0,3},{7761,2483,0,0,3}, {7762,2486,0,0,3},{7763,2489,0,0,3},{7764,2492,0,0,2},{7765,2494,0,0,2},{7766, 2496,0,0,2},{7767,2498,0,0,2},{7768,2500,0,0,2},{7769,2502,0,0,2},{7770,2504,0, 0,2},{7771,2506,0,0,2},{7772,2508,0,0,3},{7773,2511,0,0,3},{7774,2514,0,0,2}, {7775,2516,0,0,2},{7776,2518,0,0,2},{7777,2520,0,0,2},{7778,2522,0,0,2},{7779, 2524,0,0,2},{7780,2526,0,0,3},{7781,2529,0,0,3},{7782,2532,0,0,3},{7783,2535,0, 0,3},{7784,2538,0,0,3},{7785,2541,0,0,3},{7786,2544,0,0,2},{7787,2546,0,0,2}, {7788,2548,0,0,2},{7789,2550,0,0,2},{7790,2552,0,0,2},{7791,2554,0,0,2},{7792, 2556,0,0,2},{7793,2558,0,0,2},{7794,2560,0,0,2},{7795,2562,0,0,2},{7796,2564,0, 0,2},{7797,2566,0,0,2},{7798,2568,0,0,2},{7799,2570,0,0,2},{7800,2572,0,0,3}, {7801,2575,0,0,3},{7802,2578,0,0,3},{7803,2581,0,0,3},{7804,2584,0,0,2},{7805, 2586,0,0,2},{7806,2588,0,0,2},{7807,2590,0,0,2},{7808,2592,0,0,2},{7809,2594,0, 0,2},{7810,2596,0,0,2},{7811,2598,0,0,2},{7812,2600,0,0,2},{7813,2602,0,0,2}, {7814,2604,0,0,2},{7815,2606,0,0,2},{7816,2608,0,0,2},{7817,2610,0,0,2},{7818, 2612,0,0,2},{7819,2614,0,0,2},{7820,2616,0,0,2},{7821,2618,0,0,2},{7822,2620,0, 0,2},{7823,2622,0,0,2},{7824,2624,0,0,2},{7825,2626,0,0,2},{7826,2628,0,0,2}, {7827,2630,0,0,2},{7828,2632,0,0,2},{7829,2634,0,0,2},{7830,2636,0,0,2},{7831, 2638,0,0,2},{7832,2640,0,0,2},{7833,2642,0,0,2},{7834,2644,0,0,2},{7835,2646,0, 0,3},{7838,2649,0,0,3},{7840,2652,0,0,2},{7841,2654,0,0,2},{7842,2656,0,0,2}, {7843,2658,0,0,2},{7844,2660,0,0,3},{7845,2663,0,0,3},{7846,2666,0,0,3},{7847, 2669,0,0,3},{7848,2672,0,0,3},{7849,2675,0,0,3},{7850,2678,0,0,3},{7851,2681,0, 0,3},{7852,2684,0,0,3},{7853,2687,0,0,3},{7854,2690,0,0,3},{7855,2693,0,0,3}, {7856,2696,0,0,3},{7857,2699,0,0,3},{7858,2702,0,0,3},{7859,2705,0,0,3},{7860, 2708,0,0,3},{7861,2711,0,0,3},{7862,2714,0,0,3},{7863,2717,0,0,3},{7864,2720,0, 0,2},{7865,2722,0,0,2},{7866,2724,0,0,2},{7867,2726,0,0,2},{7868,2728,0,0,2}, {7869,2730,0,0,2},{7870,2732,0,0,3},{7871,2735,0,0,3},{7872,2738,0,0,3},{7873, 2741,0,0,3},{7874,2744,0,0,3},{7875,2747,0,0,3},{7876,2750,0,0,3},{7877,2753,0, 0,3},{7878,2756,0,0,3},{7879,2759,0,0,3},{7880,2762,0,0,2},{7881,2764,0,0,2}, {7882,2766,0,0,2},{7883,2768,0,0,2},{7884,2770,0,0,2},{7885,2772,0,0,2},{7886, 2774,0,0,2},{7887,2776,0,0,2},{7888,2778,0,0,3},{7889,2781,0,0,3},{7890,2784,0, 0,3},{7891,2787,0,0,3},{7892,2790,0,0,3},{7893,2793,0,0,3},{7894,2796,0,0,3}, {7895,2799,0,0,3},{7896,2802,0,0,3},{7897,2805,0,0,3},{7898,2808,0,0,3},{7899, 2811,0,0,3},{7900,2814,0,0,3},{7901,2817,0,0,3},{7902,2820,0,0,3},{7903,2823,0, 0,3},{7904,2826,0,0,3},{7905,2829,0,0,3},{7906,2832,0,0,3},{7907,2835,0,0,3}, {7908,2838,0,0,2},{7909,2840,0,0,2},{7910,2842,0,0,2},{7911,2844,0,0,2},{7912, 2846,0,0,3},{7913,2849,0,0,3},{7914,2852,0,0,3},{7915,2855,0,0,3},{7916,2858,0, 0,3},{7917,2861,0,0,3},{7918,2864,0,0,3},{7919,2867,0,0,3},{7920,2870,0,0,3}, {7921,2873,0,0,3},{7922,2876,0,0,2},{7923,2878,0,0,2},{7924,2880,0,0,2},{7925, 2882,0,0,2},{7926,2884,0,0,2},{7927,2886,0,0,2},{7928,2888,0,0,2},{7929,2890,0, 0,2},{7930,2892,0,0,2},{7931,2894,0,0,2},{7936,2896,0,0,2},{7937,2898,0,0,2}, {7938,2900,0,0,3},{7939,2903,0,0,3},{7940,2906,0,0,3},{7941,2909,0,0,3},{7942, 2912,0,0,3},{7943,2915,0,0,3},{7944,2918,0,0,2},{7945,2920,0,0,2},{7946,2922,0, 0,3},{7947,2925,0,0,3},{7948,2928,0,0,3},{7949,2931,0,0,3},{7950,2934,0,0,3}, {7951,2937,0,0,3},{7952,2940,0,0,2},{7953,2942,0,0,2},{7954,2944,0,0,3},{7955, 2947,0,0,3},{7956,2950,0,0,3},{7957,2953,0,0,3},{7960,2956,0,0,2},{7961,2958,0, 0,2},{7962,2960,0,0,3},{7963,2963,0,0,3},{7964,2966,0,0,3},{7965,2969,0,0,3}, {7968,2972,0,0,2},{7969,2974,0,0,2},{7970,2976,0,0,3},{7971,2979,0,0,3},{7972, 2982,0,0,3},{7973,2985,0,0,3},{7974,2988,0,0,3},{7975,2991,0,0,3},{7976,2994,0, 0,2},{7977,2996,0,0,2},{7978,2998,0,0,3},{7979,3001,0,0,3},{7980,3004,0,0,3}, {7981,3007,0,0,3},{7982,3010,0,0,3},{7983,3013,0,0,3},{7984,3016,0,0,2},{7985, 3018,0,0,2},{7986,3020,0,0,3},{7987,3023,0,0,3},{7988,3026,0,0,3},{7989,3029,0, 0,3},{7990,3032,0,0,3},{7991,3035,0,0,3},{7992,3038,0,0,2},{7993,3040,0,0,2}, {7994,3042,0,0,3},{7995,3045,0,0,3},{7996,3048,0,0,3},{7997,3051,0,0,3},{7998, 3054,0,0,3},{7999,3057,0,0,3},{8000,3060,0,0,2},{8001,3062,0,0,2},{8002,3064,0, 0,3},{8003,3067,0,0,3},{8004,3070,0,0,3},{8005,3073,0,0,3},{8008,3076,0,0,2}, {8009,3078,0,0,2},{8010,3080,0,0,3},{8011,3083,0,0,3},{8012,3086,0,0,3},{8013, 3089,0,0,3},{8016,3092,0,0,2},{8017,3094,0,0,2},{8018,3096,0,0,3},{8019,3099,0, 0,3},{8020,3102,0,0,3},{8021,3105,0,0,3},{8022,3108,0,0,3},{8023,3111,0,0,3}, {8025,3114,0,0,2},{8027,3116,0,0,3},{8029,3119,0,0,3},{8031,3122,0,0,3},{8032, 3125,0,0,2},{8033,3127,0,0,2},{8034,3129,0,0,3},{8035,3132,0,0,3},{8036,3135,0, 0,3},{8037,3138,0,0,3},{8038,3141,0,0,3},{8039,3144,0,0,3},{8040,3147,0,0,2}, {8041,3149,0,0,2},{8042,3151,0,0,3},{8043,3154,0,0,3},{8044,3157,0,0,3},{8045, 3160,0,0,3},{8046,3163,0,0,3},{8047,3166,0,0,3},{8048,3169,0,0,2},{8050,3171,0, 0,2},{8052,3173,0,0,2},{8054,3175,0,0,2},{8056,3177,0,0,2},{8058,3179,0,0,2}, {8060,3181,0,0,2},{8064,3183,0,0,3},{8065,3186,0,0,3},{8066,3189,0,0,4},{8067, 3193,0,0,4},{8068,3197,0,0,4},{8069,3201,0,0,4},{8070,3205,0,0,4},{8071,3209,0, 0,4},{8072,3213,0,0,3},{8073,3216,0,0,3},{8074,3219,0,0,4},{8075,3223,0,0,4}, {8076,3227,0,0,4},{8077,3231,0,0,4},{8078,3235,0,0,4},{8079,3239,0,0,4},{8080, 3243,0,0,3},{8081,3246,0,0,3},{8082,3249,0,0,4},{8083,3253,0,0,4},{8084,3257,0, 0,4},{8085,3261,0,0,4},{8086,3265,0,0,4},{8087,3269,0,0,4},{8088,3273,0,0,3}, {8089,3276,0,0,3},{8090,3279,0,0,4},{8091,3283,0,0,4},{8092,3287,0,0,4},{8093, 3291,0,0,4},{8094,3295,0,0,4},{8095,3299,0,0,4},{8096,3303,0,0,3},{8097,3306,0, 0,3},{8098,3309,0,0,4},{8099,3313,0,0,4},{8100,3317,0,0,4},{8101,3321,0,0,4}, {8102,3325,0,0,4},{8103,3329,0,0,4},{8104,3333,0,0,3},{8105,3336,0,0,3},{8106, 3339,0,0,4},{8107,3343,0,0,4},{8108,3347,0,0,4},{8109,3351,0,0,4},{8110,3355,0, 0,4},{8111,3359,0,0,4},{8112,3363,0,0,2},{8113,3365,0,0,2},{8114,3367,0,0,3}, {8115,3370,0,0,2},{8116,3372,0,0,3},{8118,3375,0,0,2},{8119,3377,0,0,3},{8120, 3380,0,0,2},{8121,3382,0,0,2},{8122,3384,0,0,2},{8124,3386,0,0,2},{8129,3388,0, 0,2},{8130,3390,0,0,3},{8131,3393,0,0,2},{8132,3395,0,0,3},{8134,3398,0,0,2}, {8135,3400,0,0,3},{8136,3403,0,0,2},{8138,3405,0,0,2},{8140,3407,0,0,2},{8141, 3409,0,0,2},{8142,3411,0,0,2},{8143,3413,0,0,2},{8144,3415,0,0,2},{8145,3417,0, 0,2},{8146,3419,0,0,3},{8150,3422,0,0,2},{8151,3424,0,0,3},{8152,3427,0,0,2}, {8153,3429,0,0,2},{8154,3431,0,0,2},{8157,3433,0,0,2},{8158,3435,0,0,2},{8159, 3437,0,0,2},{8160,3439,0,0,2},{8161,3441,0,0,2},{8162,3443,0,0,3},{8164,3446,0, 0,2},{8165,3448,0,0,2},{8166,3450,0,0,2},{8167,3452,0,0,3},{8168,3455,0,0,2}, {8169,3457,0,0,2},{8170,3459,0,0,2},{8172,3461,0,0,2},{8173,3463,0,0,2},{8178, 3465,0,0,3},{8179,3468,0,0,2},{8180,3470,0,0,3},{8182,3473,0,0,2},{8183,3475,0, 0,3},{8184,3478,0,0,2},{8186,3480,0,0,2},{8188,3482,0,0,2},{8229,3484,0,0,2}, {8230,3486,0,0,3},{8243,3489,0,0,2},{8244,3491,0,0,3},{8246,3494,0,0,2},{8247, 3496,0,0,3},{8252,3499,0,0,2},{8263,3501,0,0,2},{8264,3503,0,0,2},{8265,3505,0, 0,2},{8279,3507,0,0,4},{8360,3511,0,0,2},{8448,3513,0,0,3},{8449,3516,0,0,3}, {8451,3519,0,0,2},{8453,3521,0,0,3},{8454,3524,0,0,3},{8457,3527,0,0,2},{8463, 3529,0,0,2},{8470,3531,0,0,2},{8480,3533,0,0,2},{8481,3535,0,0,3},{8482,3538,0, 0,2},{8507,3540,0,0,3},{8525,3543,0,0,3},{8528,3546,0,0,3},{8529,3549,0,0,3}, {8530,3552,0,0,4},{8531,3556,0,0,3},{8532,3559,0,0,3},{8533,3562,0,0,3},{8534, 3565,0,0,3},{8535,3568,0,0,3},{8536,3571,0,0,3},{8537,3574,0,0,3},{8538,3577,0, 0,3},{8539,3580,0,0,3},{8540,3583,0,0,3},{8541,3586,0,0,3},{8542,3589,0,0,3}, {8543,3592,0,0,2},{8545,3594,0,0,2},{8546,3596,0,0,3},{8547,3599,0,0,2},{8549, 3601,0,0,2},{8550,3603,0,0,3},{8551,3606,0,0,4},{8552,3610,0,0,2},{8554,3612,0, 0,2},{8555,3614,0,0,3},{8561,3617,0,0,2},{8562,3619,0,0,3},{8563,3622,0,0,2}, {8565,3624,0,0,2},{8566,3626,0,0,3},{8567,3629,0,0,4},{8568,3633,0,0,2},{8570, 3635,0,0,2},{8571,3637,0,0,3},{8585,3640,0,0,3},{8602,3643,0,0,2},{8603,3645,0, 0,2},{8622,3647,0,0,2},{8653,3649,0,0,2},{8654,3651,0,0,2},{8655,3653,0,0,2}, {8708,3655,0,0,2},{8713,3657,0,0,2},{8716,3659,0,0,2},{8740,3661,0,0,2},{8742, 3663,0,0,2},{8748,3665,0,0,2},{8749,3667,0,0,3},{8751,3670,0,0,2},{8752,3672,0, 0,3},{8769,3675,0,0,2},{8772,3677,0,0,2},{8775,3679,0,0,2},{8777,3681,0,0,2}, {8800,3683,0,0,2},{8802,3685,0,0,2},{8813,3687,0,0,2},{8814,3689,0,0,2},{8815, 3691,0,0,2},{8816,3693,0,0,2},{8817,3695,0,0,2},{8820,3697,0,0,2},{8821,3699,0, 0,2},{8824,3701,0,0,2},{8825,3703,0,0,2},{8832,3705,0,0,2},{8833,3707,0,0,2}, {8836,3709,0,0,2},{8837,3711,0,0,2},{8840,3713,0,0,2},{8841,3715,0,0,2},{8876, 3717,0,0,2},{8877,3719,0,0,2},{8878,3721,0,0,2},{8879,3723,0,0,2},{8928,3725,0, 0,2},{8929,3727,0,0,2},{8930,3729,0,0,2},{8931,3731,0,0,2},{8938,3733,0,0,2}, {8939,3735,0,0,2},{8940,3737,0,0,2},{8941,3739,0,0,2},{9321,3741,0,0,2},{9322, 3743,0,0,2},{9323,3745,0,0,2},{9324,3747,0,0,2},{9325,3749,0,0,2},{9326,3751,0, 0,2},{9327,3753,0,0,2},{9328,3755,0,0,2},{9329,3757,0,0,2},{9330,3759,0,0,2}, {9331,3761,0,0,2},{9332,3763,0,0,3},{9333,3766,0,0,3},{9334,3769,0,0,3},{9335, 3772,0,0,3},{9336,3775,0,0,3},{9337,3778,0,0,3},{9338,3781,0,0,3},{9339,3784,0, 0,3},{9340,3787,0,0,3},{9341,3790,0,0,4},{9342,3794,0,0,4},{9343,3798,0,0,4}, {9344,3802,0,0,4},{9345,3806,0,0,4},{9346,3810,0,0,4},{9347,3814,0,0,4},{9348, 3818,0,0,4},{9349,3822,0,0,4},{9350,3826,0,0,4},{9351,3830,0,0,4},{9352,3834,0, 0,2},{9353,3836,0,0,2},{9354,3838,0,0,2},{9355,3840,0,0,2},{9356,3842,0,0,2}, {9357,3844,0,0,2},{9358,3846,0,0,2},{9359,3848,0,0,2},{9360,3850,0,0,2},{9361, 3852,0,0,3},{9362,3855,0,0,3},{9363,3858,0,0,3},{9364,3861,0,0,3},{9365,3864,0, 0,3},{9366,3867,0,0,3},{9367,3870,0,0,3},{9368,3873,0,0,3},{9369,3876,0,0,3}, {9370,3879,0,0,3},{9371,3882,0,0,3},{9372,3885,0,0,3},{9373,3888,0,0,3},{9374, 3891,0,0,3},{9375,3894,0,0,3},{9376,3897,0,0,3},{9377,3900,0,0,3},{9378,3903,0, 0,3},{9379,3906,0,0,3},{9380,3909,0,0,3},{9381,3912,0,0,3},{9382,3915,0,0,3}, {9383,3918,0,0,3},{9384,3921,0,0,3},{9385,3924,0,0,3},{9386,3927,0,0,3},{9387, 3930,0,0,3},{9388,3933,0,0,3},{9389,3936,0,0,3},{9390,3939,0,0,3},{9391,3942,0, 0,3},{9392,3945,0,0,3},{9393,3948,0,0,3},{9394,3951,0,0,3},{9395,3954,0,0,3}, {9396,3957,0,0,3},{9397,3960,0,0,3},{9451,3963,0,0,2},{9452,3965,0,0,2},{9453, 3967,0,0,2},{9454,3969,0,0,2},{9455,3971,0,0,2},{9456,3973,0,0,2},{9457,3975,0, 0,2},{9458,3977,0,0,2},{9459,3979,0,0,2},{9460,3981,0,0,2},{9470,3983,0,0,2}, {10111,3985,0,0,2},{10121,3987,0,0,2},{10131,3989,0,0,2},{10764,3991,0,0,4}, {10868,3995,0,0,3},{10869,3998,0,0,2},{10870,4000,0,0,3},{10973,0,4443,1,0}, {11492,4005,0,0,3},{11765,4008,0,0,2},{11904,4010,0,0,3},{11905,4013,0,0,3}, {11906,4016,0,0,2},{11907,4018,0,0,2},{11908,4020,0,0,3},{11909,4023,0,0,2}, {11910,4025,0,0,3},{11911,4028,0,0,3},{11912,4031,0,0,3},{11913,4034,0,0,2}, {11914,4036,0,0,3},{11915,4039,0,0,3},{11916,4042,0,0,3},{11917,4045,0,0,3}, {11918,4048,0,0,3},{11919,4051,0,0,2},{11920,4053,0,0,2},{11921,4055,0,0,3}, {11922,4058,0,0,2},{11923,4060,0,0,2},{11924,4062,0,0,2},{11925,4064,0,0,3}, {11926,4067,0,0,2},{11927,4069,0,0,3},{11928,4072,0,0,2},{11929,4074,0,0,2}, {11931,4076,0,0,2},{11932,4078,0,0,3},{11933,4081,0,0,3},{11934,4084,0,0,3}, {11935,4087,0,0,2},{11936,4089,0,0,2},{11937,4091,0,0,2},{11938,4093,0,0,2}, {11939,4095,0,0,2},{11940,4097,0,0,2},{11941,4099,0,0,3},{11942,4102,0,0,2}, {11943,4104,0,0,3},{11944,4107,0,0,2},{11945,4109,0,0,3},{11946,4112,0,0,3}, {11947,4115,0,0,3},{11948,4118,0,0,3},{11949,4121,0,0,2},{11950,4123,0,0,3}, {11951,4126,0,0,2},{11952,4128,0,0,2},{11953,4130,0,0,2},{11954,4132,0,0,2}, {11955,4134,0,0,3},{11956,4137,0,0,3},{11957,4140,0,0,3},{11958,4143,0,0,3}, {11959,4146,0,0,3},{11960,4149,0,0,2},{11961,4151,0,0,2},{11962,4153,0,0,2}, {11963,4155,0,0,3},{11964,4158,0,0,3},{11965,4161,0,0,3},{11966,4164,0,0,2}, {11967,4166,0,0,3},{11968,4169,0,0,3},{11969,4172,0,0,2},{11970,4174,0,0,2}, {11971,4176,0,0,2},{11972,4178,0,0,2},{11973,4180,0,0,2},{11974,4182,0,0,2}, {11975,4184,0,0,3},{11976,4187,0,0,2},{11977,4189,0,0,2},{11978,4191,0,0,3}, {11979,4194,0,0,2},{11980,4196,0,0,2},{11981,4198,0,0,3},{11982,4201,0,0,3}, {11983,4204,0,0,3},{11984,4207,0,0,2},{11985,4209,0,0,2},{11986,4211,0,0,2}, {11987,4213,0,0,2},{11988,4215,0,0,2},{11989,4217,0,0,3},{11990,4220,0,0,2}, {11991,4222,0,0,3},{11992,4225,0,0,2},{11993,4227,0,0,2},{11994,4229,0,0,2}, {11995,4231,0,0,2},{11996,4233,0,0,2},{11997,4235,0,0,2},{11998,4237,0,0,3}, {11999,4240,0,0,2},{12000,4242,0,0,2},{12001,4244,0,0,3},{12002,4247,0,0,2}, {12003,4249,0,0,3},{12004,4252,0,0,3},{12005,4255,0,0,2},{12006,4257,0,0,2}, {12007,4259,0,0,3},{12008,4262,0,0,2},{12009,4264,0,0,2},{12010,4266,0,0,2}, {12011,4268,0,0,3},{12012,4271,0,0,2},{12013,4273,0,0,3},{12014,4276,0,0,2}, {12015,4278,0,0,3},{12016,4281,0,0,2},{12017,4283,0,0,3},{12018,4286,0,0,3}, {12019,4289,0,0,2},{12032,4291,0,0,2},{12033,4293,0,0,2},{12034,4295,0,0,2}, {12035,4297,0,0,2},{12036,4299,0,0,2},{12037,4301,0,0,2},{12038,4303,0,0,2}, {12039,4305,0,0,2},{12040,4307,0,0,2},{12041,4309,0,0,2},{12042,4311,0,0,2}, {12043,4313,0,0,2},{12044,4315,0,0,2},{12045,4317,0,0,2},{12046,4319,0,0,2}, {12047,4321,0,0,2},{12048,4323,0,0,2},{12049,4325,0,0,2},{12050,4327,0,0,2}, {12051,4329,0,0,2},{12052,4331,0,0,2},{12053,4333,0,0,2},{12054,4335,0,0,2}, {12055,4337,0,0,2},{12056,4339,0,0,2},{12057,4341,0,0,2},{12058,4343,0,0,2}, {12059,4345,0,0,2},{12060,4347,0,0,2},{12061,4349,0,0,2},{12062,4351,0,0,2}, {12063,4353,0,0,2},{12064,4355,0,0,2},{12065,4357,0,0,2},{12066,4359,0,0,2}, {12067,4361,0,0,2},{12068,4363,0,0,2},{12069,4365,0,0,2},{12070,4367,0,0,2}, {12071,4369,0,0,2},{12072,4371,0,0,2},{12073,4373,0,0,2},{12074,4375,0,0,2}, {12075,4377,0,0,2},{12076,4379,0,0,2},{12077,4381,0,0,2},{12078,4383,0,0,2}, {12079,4385,0,0,2},{12080,4387,0,0,2},{12081,4389,0,0,2},{12082,4391,0,0,2}, {12083,4393,0,0,2},{12084,4395,0,0,2},{12085,4397,0,0,2},{12086,4399,0,0,2}, {12087,4401,0,0,2},{12088,4403,0,0,2},{12089,4405,0,0,2},{12090,4407,0,0,2}, {12091,4409,0,0,2},{12092,4411,0,0,2},{12093,4413,0,0,2},{12094,4415,0,0,2}, {12095,4417,0,0,2},{12096,4419,0,0,2},{12097,4421,0,0,2},{12098,4423,0,0,2}, {12099,4425,0,0,2},{12100,4427,0,0,2},{12101,4429,0,0,2},{12102,4431,0,0,2}, {12103,4433,0,0,2},{12104,4435,0,0,2},{12105,4437,0,0,2},{12106,4439,0,0,2}, {12107,4441,0,0,2},{12108,4443,0,0,2},{12109,4445,0,0,2},{12110,4447,0,0,2}, {12111,4449,0,0,2},{12112,4451,0,0,2},{12113,4453,0,0,2},{12114,4455,0,0,2}, {12115,4457,0,0,2},{12116,4459,0,0,2},{12117,4461,0,0,2},{12118,4463,0,0,2}, {12119,4465,0,0,2},{12120,4467,0,0,2},{12121,4469,0,0,2},{12122,4471,0,0,2}, {12123,4473,0,0,2},{12124,4475,0,0,2},{12125,4477,0,0,2},{12126,4479,0,0,2}, {12127,4481,0,0,2},{12128,4483,0,0,2},{12129,4485,0,0,2},{12130,4487,0,0,2}, {12131,4489,0,0,2},{12132,4491,0,0,2},{12133,4493,0,0,2},{12134,4495,0,0,2}, {12135,4497,0,0,2},{12136,4499,0,0,2},{12137,4501,0,0,2},{12138,4503,0,0,2}, {12139,4505,0,0,2},{12140,4507,0,0,2},{12141,4509,0,0,2},{12142,4511,0,0,2}, {12143,4513,0,0,2},{12144,4515,0,0,2},{12145,4517,0,0,2},{12146,4519,0,0,2}, {12147,4521,0,0,2},{12148,4523,0,0,2},{12149,4525,0,0,2},{12150,4527,0,0,2}, {12151,4529,0,0,2},{12152,4531,0,0,2},{12153,4533,0,0,2},{12154,4535,0,0,2}, {12155,4537,0,0,2},{12156,4539,0,0,2},{12157,4541,0,0,2},{12158,4543,0,0,2}, {12159,4545,0,0,2},{12160,4547,0,0,2},{12161,4549,0,0,2},{12162,4551,0,0,2}, {12163,4553,0,0,2},{12164,4555,0,0,2},{12165,4557,0,0,2},{12166,4559,0,0,2}, {12167,4561,0,0,2},{12168,4563,0,0,2},{12169,4565,0,0,2},{12170,4567,0,0,2}, {12171,4569,0,0,2},{12172,4571,0,0,2},{12173,4573,0,0,2},{12174,4575,0,0,2}, {12175,4577,0,0,2},{12176,4579,0,0,2},{12177,4581,0,0,2},{12178,4583,0,0,2}, {12179,4585,0,0,2},{12180,4587,0,0,2},{12181,4589,0,0,2},{12182,4591,0,0,2}, {12183,4593,0,0,2},{12184,4595,0,0,2},{12185,4597,0,0,2},{12186,4599,0,0,2}, {12187,4601,0,0,2},{12188,4603,0,0,2},{12189,4605,0,0,2},{12190,4607,0,0,2}, {12191,4609,0,0,2},{12192,4611,0,0,2},{12193,4613,0,0,2},{12194,4615,0,0,2}, {12195,4617,0,0,2},{12196,4619,0,0,2},{12197,4621,0,0,2},{12198,4623,0,0,2}, {12199,4625,0,0,2},{12200,4627,0,0,2},{12201,4629,0,0,2},{12202,4631,0,0,2}, {12203,4633,0,0,2},{12204,4635,0,0,2},{12205,4637,0,0,2},{12206,4639,0,0,2}, {12207,4641,0,0,2},{12208,4643,0,0,2},{12209,4645,0,0,2},{12210,4647,0,0,2}, {12211,4649,0,0,2},{12212,4651,0,0,2},{12213,4653,0,0,2},{12214,4655,0,0,2}, {12215,4657,0,0,2},{12216,4659,0,0,2},{12217,4661,0,0,2},{12218,4663,0,0,2}, {12219,4665,0,0,2},{12220,4667,0,0,2},{12221,4669,0,0,2},{12222,4671,0,0,2}, {12223,4673,0,0,2},{12224,4675,0,0,2},{12225,4677,0,0,2},{12226,4679,0,0,2}, {12227,4681,0,0,2},{12228,4683,0,0,2},{12229,4685,0,0,2},{12230,4687,0,0,2}, {12231,4689,0,0,2},{12232,4691,0,0,2},{12233,4693,0,0,2},{12234,4695,0,0,2}, {12235,4697,0,0,2},{12236,4699,0,0,2},{12237,4701,0,0,2},{12238,4703,0,0,2}, {12239,4705,0,0,2},{12240,4707,0,0,2},{12241,4709,0,0,2},{12242,4711,0,0,2}, {12243,4713,0,0,2},{12244,4715,0,0,2},{12245,4717,0,0,2},{12294,4719,0,0,2}, {12338,4721,0,0,2},{12340,4723,0,0,2},{12344,4725,0,0,2},{12345,4727,0,0,2}, {12346,4729,0,0,2},{12348,4731,0,0,2},{12364,4733,0,0,2},{12366,4735,0,0,2}, {12368,4737,0,0,2},{12370,4739,0,0,2},{12372,4741,0,0,2},{12374,4743,0,0,2}, {12376,4745,0,0,2},{12378,4747,0,0,2},{12380,4749,0,0,2},{12382,4751,0,0,2}, {12384,4753,0,0,2},{12386,4755,0,0,2},{12389,4757,0,0,2},{12391,4759,0,0,2}, {12393,4761,0,0,2},{12400,4763,0,0,2},{12401,4765,0,0,2},{12403,4767,0,0,2}, {12404,4769,0,0,2},{12406,4771,0,0,2},{12407,4773,0,0,2},{12409,4775,0,0,2}, {12410,4777,0,0,2},{12412,4779,0,0,2},{12413,4781,0,0,2},{12436,4783,0,0,2}, {12446,4785,0,0,2},{12447,4787,0,0,2},{12460,4789,0,0,2},{12462,4791,0,0,2}, {12464,4793,0,0,2},{12466,4795,0,0,2},{12468,4797,0,0,2},{12470,4799,0,0,2}, {12472,4801,0,0,2},{12474,4803,0,0,2},{12476,4805,0,0,2},{12478,4807,0,0,2}, {12480,4809,0,0,2},{12482,4811,0,0,2},{12485,4813,0,0,2},{12487,4815,0,0,2}, {12489,4817,0,0,2},{12496,4819,0,0,2},{12497,4821,0,0,2},{12499,4823,0,0,2}, {12500,4825,0,0,2},{12502,4827,0,0,2},{12503,4829,0,0,2},{12505,4831,0,0,2}, {12506,4833,0,0,2},{12508,4835,0,0,2},{12509,4837,0,0,2},{12532,4839,0,0,2}, {12535,4841,0,0,2},{12536,4843,0,0,2},{12537,4845,0,0,2},{12538,4847,0,0,2}, {12542,4849,0,0,2},{12543,4851,0,0,2},{12690,4853,0,0,2},{12691,4855,0,0,2}, {12692,4857,0,0,2},{12693,4859,0,0,2},{12694,4861,0,0,2},{12695,4863,0,0,2}, {12696,4865,0,0,2},{12697,4867,0,0,2},{12698,4869,0,0,2},{12699,4871,0,0,2}, {12700,4873,0,0,2},{12701,4875,0,0,2},{12702,4877,0,0,2},{12703,4879,0,0,2}, {12704,4881,0,0,2},{12705,4883,0,0,2},{12706,4885,0,0,2},{12707,4887,0,0,2}, {12709,4889,0,0,2},{12711,4891,0,0,2},{12712,4893,0,0,2},{12713,4895,0,0,2}, {12714,4897,0,0,2},{12715,4899,0,0,2},{12718,4901,0,0,2},{12719,4903,0,0,2}, {12723,4905,0,0,2},{12800,4907,0,0,3},{12801,4910,0,0,3},{12802,4913,0,0,3}, {12803,4916,0,0,3},{12804,4919,0,0,3},{12805,4922,0,0,3},{12806,4925,0,0,3}, {12807,4928,0,0,3},{12808,4931,0,0,3},{12809,4934,0,0,3},{12810,4937,0,0,3}, {12811,4940,0,0,3},{12812,4943,0,0,3},{12813,4946,0,0,3},{12814,4949,0,0,4}, {12815,4953,0,0,4},{12816,4957,0,0,4},{12817,4961,0,0,4},{12818,4965,0,0,4}, {12819,4969,0,0,4},{12820,4973,0,0,4},{12821,4977,0,0,4},{12822,4981,0,0,4}, {12823,4985,0,0,4},{12824,4989,0,0,4},{12825,4993,0,0,4},{12826,4997,0,0,4}, {12827,5001,0,0,4},{12828,5005,0,0,4},{12829,5009,0,0,7},{12830,5016,0,0,6}, {12832,5022,0,0,4},{12833,5026,0,0,4},{12834,5030,0,0,4},{12835,5034,0,0,4}, {12836,5038,0,0,4},{12837,5042,0,0,4},{12838,5046,0,0,4},{12839,5050,0,0,4}, {12840,5054,0,0,4},{12841,5058,0,0,4},{12842,5062,0,0,4},{12843,5066,0,0,4}, {12844,5070,0,0,4},{12845,5074,0,0,4},{12846,5078,0,0,4},{12847,5082,0,0,4}, {12848,5086,0,0,4},{12849,5090,0,0,4},{12850,5094,0,0,4},{12851,5098,0,0,4}, {12852,5102,0,0,4},{12853,5106,0,0,4},{12854,5110,0,0,4},{12855,5114,0,0,4}, {12856,5118,0,0,4},{12857,5122,0,0,4},{12858,5126,0,0,4},{12859,5130,0,0,4}, {12860,5134,0,0,4},{12861,5138,0,0,4},{12862,5142,0,0,4},{12863,5146,0,0,4}, {12864,5150,0,0,4},{12865,5154,0,0,4},{12866,5158,0,0,4},{12867,5162,0,0,4}, {12868,5166,0,0,2},{12869,5168,0,0,2},{12870,5170,0,0,2},{12871,5172,0,0,2}, {12872,5174,0,0,2},{12873,5176,0,0,2},{12874,5178,0,0,2},{12875,5180,0,0,2}, {12876,5182,0,0,2},{12877,5184,0,0,2},{12878,5186,0,0,2},{12879,5188,0,0,2}, {12880,5190,0,0,3},{12881,5193,0,0,2},{12882,5195,0,0,2},{12883,5197,0,0,2}, {12884,5199,0,0,2},{12885,5201,0,0,2},{12886,5203,0,0,2},{12887,5205,0,0,2}, {12888,5207,0,0,2},{12889,5209,0,0,2},{12890,5211,0,0,2},{12891,5213,0,0,2}, {12892,5215,0,0,2},{12893,5217,0,0,2},{12894,5219,0,0,2},{12895,5221,0,0,2}, {12910,5223,0,0,2},{12911,5225,0,0,2},{12912,5227,0,0,2},{12913,5229,0,0,2}, {12914,5231,0,0,2},{12915,5233,0,0,2},{12916,5235,0,0,2},{12917,5237,0,0,2}, {12918,5239,0,0,2},{12919,5241,0,0,2},{12920,5243,0,0,2},{12921,5245,0,0,2}, {12922,5247,0,0,2},{12923,5249,0,0,2},{12924,5251,0,0,5},{12925,5256,0,0,4}, {12926,5260,0,0,2},{12928,5262,0,0,2},{12929,5264,0,0,2},{12930,5266,0,0,2}, {12931,5268,0,0,2},{12932,5270,0,0,2},{12933,5272,0,0,2},{12934,5274,0,0,2}, {12935,5276,0,0,2},{12936,5278,0,0,2},{12937,5280,0,0,2},{12938,5282,0,0,2}, {12939,5284,0,0,2},{12940,5286,0,0,2},{12941,5288,0,0,2},{12942,5290,0,0,2}, {12943,5292,0,0,2},{12944,5294,0,0,2},{12945,5296,0,0,2},{12946,5298,0,0,2}, {12947,5300,0,0,2},{12948,5302,0,0,2},{12949,5304,0,0,2},{12950,5306,0,0,2}, {12951,5308,0,0,2},{12952,5310,0,0,2},{12953,5312,0,0,2},{12954,5314,0,0,2}, {12955,5316,0,0,2},{12956,5318,0,0,2},{12957,5320,0,0,2},{12958,5322,0,0,2}, {12959,5324,0,0,2},{12960,5326,0,0,2},{12961,5328,0,0,2},{12962,5330,0,0,2}, {12963,5332,0,0,2},{12964,5334,0,0,2},{12965,5336,0,0,2},{12966,5338,0,0,2}, {12967,5340,0,0,2},{12968,5342,0,0,2},{12969,5344,0,0,2},{12970,5346,0,0,2}, {12971,5348,0,0,2},{12972,5350,0,0,2},{12973,5352,0,0,2},{12974,5354,0,0,2}, {12975,5356,0,0,2},{12976,5358,0,0,2},{12977,5360,0,0,2},{12978,5362,0,0,2}, {12979,5364,0,0,2},{12980,5366,0,0,2},{12981,5368,0,0,2},{12982,5370,0,0,2}, {12983,5372,0,0,2},{12984,5374,0,0,2},{12985,5376,0,0,2},{12986,5378,0,0,2}, {12987,5380,0,0,2},{12988,5382,0,0,2},{12989,5384,0,0,2},{12990,5386,0,0,2}, {12991,5388,0,0,2},{12992,5390,0,0,3},{12993,5393,0,0,3},{12994,5396,0,0,3}, {12995,5399,0,0,3},{12996,5402,0,0,3},{12997,5405,0,0,3},{12998,5408,0,0,3}, {12999,5411,0,0,3},{13000,5414,0,0,3},{13001,5417,0,0,4},{13002,5421,0,0,4}, {13003,5425,0,0,4},{13004,5429,0,0,2},{13005,5431,0,0,3},{13006,5434,0,0,2}, {13007,5436,0,0,3},{13056,5439,0,0,5},{13057,5444,0,0,4},{13058,5448,0,0,5}, {13059,5453,0,0,3},{13060,5456,0,0,5},{13061,5461,0,0,3},{13062,5464,0,0,3}, {13063,5467,0,0,6},{13064,5473,0,0,4},{13065,5477,0,0,3},{13066,5480,0,0,3}, {13067,5483,0,0,3},{13068,5486,0,0,4},{13069,5490,0,0,4},{13070,5494,0,0,4}, {13071,5498,0,0,4},{13072,5502,0,0,4},{13073,5506,0,0,4},{13074,5510,0,0,4}, {13075,5514,0,0,6},{13076,5520,0,0,2},{13077,5522,0,0,6},{13078,5528,0,0,6}, {13079,5534,0,0,5},{13080,5539,0,0,4},{13081,5543,0,0,6},{13082,5549,0,0,6}, {13083,5555,0,0,4},{13084,5559,0,0,3},{13085,5562,0,0,3},{13086,5565,0,0,4}, {13087,5569,0,0,4},{13088,5573,0,0,5},{13089,5578,0,0,5},{13090,5583,0,0,3}, {13091,5586,0,0,3},{13092,5589,0,0,4},{13093,5593,0,0,3},{13094,5596,0,0,3}, {13095,5599,0,0,2},{13096,5601,0,0,2},{13097,5603,0,0,3},{13098,5606,0,0,3}, {13099,5609,0,0,6},{13100,5615,0,0,4},{13101,5619,0,0,5},{13102,5624,0,0,6}, {13103,5630,0,0,4},{13104,5634,0,0,3},{13105,5637,0,0,3},{13106,5640,0,0,6}, {13107,5646,0,0,4},{13108,5650,0,0,6},{13109,5656,0,0,3},{13110,5659,0,0,5}, {13111,5664,0,0,3},{13112,5667,0,0,4},{13113,5671,0,0,3},{13114,5674,0,0,4}, {13115,5678,0,0,5},{13116,5683,0,0,4},{13117,5687,0,0,5},{13118,5692,0,0,4}, {13119,5696,0,0,2},{13120,5698,0,0,5},{13121,5703,0,0,3},{13122,5706,0,0,3}, {13123,5709,0,0,4},{13124,5713,0,0,3},{13125,5716,0,0,3},{13126,5719,0,0,3}, {13127,5722,0,0,5},{13128,5727,0,0,4},{13129,5731,0,0,2},{13130,5733,0,0,6}, {13131,5739,0,0,3},{13132,5742,0,0,5},{13133,5747,0,0,4},{13134,5751,0,0,4}, {13135,5755,0,0,3},{13136,5758,0,0,3},{13137,5761,0,0,4},{13138,5765,0,0,2}, {13139,5767,0,0,4},{13140,5771,0,0,5},{13141,5776,0,0,2},{13142,5778,0,0,6}, {13143,5784,0,0,3},{13144,5787,0,0,3},{13145,5790,0,0,3},{13146,5793,0,0,3}, {13147,5796,0,0,3},{13148,5799,0,0,3},{13149,5802,0,0,3},{13150,5805,0,0,3}, {13151,5808,0,0,3},{13152,5811,0,0,3},{13153,5814,0,0,3},{13154,5817,0,0,4}, {13155,5821,0,0,4},{13156,5825,0,0,4},{13157,5829,0,0,4},{13158,5833,0,0,4}, {13159,5837,0,0,4},{13160,5841,0,0,4},{13161,5845,0,0,4},{13162,5849,0,0,4}, {13163,5853,0,0,4},{13164,5857,0,0,4},{13165,5861,0,0,4},{13166,5865,0,0,4}, {13167,5869,0,0,4},{13168,5873,0,0,4},{13169,5877,0,0,3},{13170,5880,0,0,2}, {13171,5882,0,0,2},{13172,5884,0,0,3},{13173,5887,0,0,2},{13174,5889,0,0,2}, {13175,5891,0,0,2},{13176,5893,0,0,3},{13177,5896,0,0,3},{13178,5899,0,0,2}, {13179,5901,0,0,4},{13180,5905,0,0,4},{13181,5909,0,0,4},{13182,5913,0,0,4}, {13183,5917,0,0,8},{13184,5925,0,0,2},{13185,5927,0,0,2},{13186,5929,0,0,2}, {13187,5931,0,0,2},{13188,5933,0,0,2},{13189,5935,0,0,2},{13190,5937,0,0,2}, {13191,5939,0,0,2},{13192,5941,0,0,3},{13193,5944,0,0,4},{13194,5948,0,0,2}, {13195,5950,0,0,2},{13196,5952,0,0,2},{13197,5954,0,0,2},{13198,5956,0,0,2}, {13199,5958,0,0,2},{13200,5960,0,0,2},{13201,5962,0,0,3},{13202,5965,0,0,3}, {13203,5968,0,0,3},{13204,5971,0,0,3},{13205,5974,0,0,2},{13206,5976,0,0,2}, {13207,5978,0,0,2},{13208,5980,0,0,2},{13209,5982,0,0,2},{13210,5984,0,0,2}, {13211,5986,0,0,2},{13212,5988,0,0,2},{13213,5990,0,0,2},{13214,5992,0,0,2}, {13215,5994,0,0,3},{13216,5997,0,0,3},{13217,6000,0,0,2},{13218,6002,0,0,3}, {13219,6005,0,0,3},{13220,6008,0,0,3},{13221,6011,0,0,2},{13222,6013,0,0,3}, {13223,6016,0,0,3},{13224,6019,0,0,4},{13225,6023,0,0,2},{13226,6025,0,0,3}, {13227,6028,0,0,3},{13228,6031,0,0,3},{13229,6034,0,0,3},{13230,6037,0,0,5}, {13231,6042,0,0,6},{13232,6048,0,0,2},{13233,6050,0,0,2},{13234,6052,0,0,2}, {13235,6054,0,0,2},{13236,6056,0,0,2},{13237,6058,0,0,2},{13238,6060,0,0,2}, {13239,6062,0,0,2},{13240,6064,0,0,2},{13241,6066,0,0,2},{13242,6068,0,0,2}, {13243,6070,0,0,2},{13244,6072,0,0,2},{13245,6074,0,0,2},{13246,6076,0,0,2}, {13247,6078,0,0,2},{13248,6080,0,0,2},{13249,6082,0,0,2},{13250,6084,0,0,4}, {13251,6088,0,0,2},{13252,6090,0,0,2},{13253,6092,0,0,2},{13254,6094,0,0,4}, {13255,6098,0,0,3},{13256,6101,0,0,2},{13257,6103,0,0,2},{13258,6105,0,0,2}, {13259,6107,0,0,2},{13260,6109,0,0,2},{13261,6111,0,0,2},{13262,6113,0,0,2}, {13263,6115,0,0,2},{13264,6117,0,0,2},{13265,6119,0,0,2},{13266,6121,0,0,3}, {13267,6124,0,0,2},{13268,6126,0,0,2},{13269,6128,0,0,3},{13270,6131,0,0,3}, {13271,6134,0,0,2},{13272,6136,0,0,4},{13273,6140,0,0,3},{13274,6143,0,0,2}, {13275,6145,0,0,2},{13276,6147,0,0,2},{13277,6149,0,0,2},{13278,6151,0,0,3}, {13279,6154,0,0,3},{13280,6157,0,0,3},{13281,6160,0,0,3},{13282,6163,0,0,3}, {13283,6166,0,0,3},{13284,6169,0,0,3},{13285,6172,0,0,3},{13286,6175,0,0,3}, {13287,6178,0,0,3},{13288,6181,0,0,3},{13289,6184,0,0,4},{13290,6188,0,0,4}, {13291,6192,0,0,4},{13292,6196,0,0,4},{13293,6200,0,0,4},{13294,6204,0,0,4}, {13295,6208,0,0,4},{13296,6212,0,0,4},{13297,6216,0,0,4},{13298,6220,0,0,4}, {13299,6224,0,0,4},{13300,6228,0,0,4},{13301,6232,0,0,4},{13302,6236,0,0,4}, {13303,6240,0,0,4},{13304,6244,0,0,4},{13305,6248,0,0,4},{13306,6252,0,0,4}, {13307,6256,0,0,4},{13308,6260,0,0,4},{13309,6264,0,0,4},{13310,6268,0,0,4}, {13311,6272,0,0,3},{13470,6275,0,0,2},{13497,6277,0,0,2},{13499,6279,0,0,2}, {13535,6281,0,0,2},{13589,6283,0,0,2},{14062,6285,0,0,2},{14076,6287,0,0,2}, {14209,6289,0,0,2},{14383,6291,0,0,2},{14434,6293,0,0,2},{14460,6295,0,0,2}, {14535,6297,0,0,2},{14563,6299,0,0,2},{14620,6301,0,0,2},{14650,6303,0,0,2}, {14894,6305,0,0,2},{14956,6307,0,0,2},{15076,6309,0,0,2},{15112,6311,0,0,2}, {15129,6313,0,0,2},{15177,6315,0,0,2},{15261,6317,0,0,2},{15384,6319,0,0,2}, {15438,6321,0,0,2},{15667,6323,0,0,2},{15766,6325,0,0,2},{16044,6327,0,0,2}, {16056,6329,0,0,2},{16155,6331,0,0,2},{16380,6333,0,0,2},{16392,6335,0,0,2}, {16408,6337,0,0,2},{16441,6339,0,0,2},{16454,6341,0,0,2},{16534,6343,0,0,2}, {16611,6345,0,0,2},{16687,6347,0,0,2},{16898,6349,0,0,2},{16935,6351,0,0,2}, {17056,6353,0,0,2},{17153,6355,0,0,2},{17204,6357,0,0,2},{17241,6359,0,0,2}, {17365,6361,0,0,2},{17369,6363,0,0,2},{17419,6365,0,0,2},{17515,6367,0,0,2}, {17707,6369,0,0,2},{17757,6371,0,0,2},{17761,6373,0,0,2},{17771,6375,0,0,2}, {17879,6377,0,0,2},{17913,6379,0,0,2},{17973,6381,0,0,2},{18110,6383,0,0,2}, {18119,6385,0,0,2},{18837,6387,0,0,2},{18918,6389,0,0,2},{19054,6391,0,0,2}, {19062,6393,0,0,2},{19122,6395,0,0,2},{19251,6397,0,0,2},{19406,6399,0,0,2}, {19662,6401,0,0,2},{19693,6403,0,0,2},{19704,6405,0,0,2},{19798,6407,0,0,2}, {19981,6409,0,0,2},{20006,6411,0,0,2},{20018,6413,0,0,2},{20024,6415,0,0,2}, {20025,6417,0,0,2},{20029,6419,0,0,2},{20033,6421,0,0,2},{20098,6423,0,0,2}, {20102,6425,0,0,2},{20142,6427,0,0,2},{20160,6429,0,0,2},{20172,6431,0,0,2}, {20196,6433,0,0,2},{20320,6435,0,0,2},{20352,6437,0,0,2},{20358,6439,0,0,2}, {20363,6441,0,0,2},{20398,6443,0,0,2},{20411,6445,0,0,2},{20415,6447,0,0,2}, {20482,6449,0,0,2},{20523,6451,0,0,2},{20602,6453,0,0,2},{20633,6455,0,0,2}, {20687,6457,0,0,2},{20698,6459,0,0,2},{20711,6461,0,0,2},{20800,6463,0,0,2}, {20805,6465,0,0,2},{20813,6467,0,0,2},{20820,6469,0,0,2},{20836,6471,0,0,2}, {20839,6473,0,0,2},{20840,6475,0,0,2},{20841,6477,0,0,2},{20845,6479,0,0,2}, {20855,6481,0,0,2},{20864,6483,0,0,2},{20877,6485,0,0,2},{20882,6487,0,0,2}, {20885,6489,0,0,2},{20887,6491,0,0,2},{20900,6493,0,0,2},{20908,6495,0,0,2}, {20917,6497,0,0,2},{20919,6499,0,0,2},{20937,6501,0,0,2},{20940,6503,0,0,2}, {20956,6505,0,0,2},{20958,6507,0,0,2},{20981,6509,0,0,2},{20995,6511,0,0,2}, {20999,6513,0,0,2},{21015,6515,0,0,2},{21033,6517,0,0,2},{21050,6519,0,0,2}, {21051,6521,0,0,2},{21062,6523,0,0,2},{21106,6525,0,0,2},{21111,6527,0,0,2}, {21129,6529,0,0,2},{21147,6531,0,0,2},{21155,6533,0,0,2},{21171,6535,0,0,2}, {21191,6537,0,0,2},{21193,6539,0,0,2},{21202,6541,0,0,2},{21214,6543,0,0,2}, {21220,6545,0,0,2},{21237,6547,0,0,2},{21242,6549,0,0,2},{21253,6551,0,0,2}, {21254,6553,0,0,2},{21271,6555,0,0,2},{21311,6557,0,0,2},{21321,6559,0,0,2}, {21329,6561,0,0,2},{21338,6563,0,0,2},{21363,6565,0,0,2},{21365,6567,0,0,2}, {21373,6569,0,0,2},{21375,6571,0,0,2},{21443,6573,0,0,2},{21450,6575,0,0,2}, {21471,6577,0,0,2},{21477,6579,0,0,2},{21483,6581,0,0,2},{21489,6583,0,0,2}, {21510,6585,0,0,2},{21519,6587,0,0,2},{21533,6589,0,0,2},{21560,6591,0,0,2}, {21570,6593,0,0,2},{21576,6595,0,0,2},{21608,6597,0,0,2},{21662,6599,0,0,2}, {21666,6601,0,0,2},{21693,6603,0,0,2},{21750,6605,0,0,2},{21776,6607,0,0,2}, {21843,6609,0,0,2},{21845,6611,0,0,2},{21859,6613,0,0,2},{21892,6615,0,0,2}, {21895,6617,0,0,2},{21913,6619,0,0,2},{21917,6621,0,0,2},{21931,6623,0,0,2}, {21939,6625,0,0,2},{21952,6627,0,0,2},{21954,6629,0,0,2},{21986,6631,0,0,2}, {22022,6633,0,0,2},{22097,6635,0,0,2},{22120,6637,0,0,2},{22132,6639,0,0,2}, {22265,6641,0,0,2},{22294,6643,0,0,2},{22295,6645,0,0,2},{22411,6647,0,0,2}, {22478,6649,0,0,2},{22516,6651,0,0,2},{22541,6653,0,0,2},{22577,6655,0,0,2}, {22578,6657,0,0,2},{22592,6659,0,0,2},{22618,6661,0,0,2},{22622,6663,0,0,2}, {22696,6665,0,0,2},{22700,6667,0,0,2},{22707,6669,0,0,2},{22744,6671,0,0,2}, {22751,6673,0,0,2},{22766,6675,0,0,2},{22770,6677,0,0,2},{22775,6679,0,0,2}, {22790,6681,0,0,2},{22810,6683,0,0,2},{22818,6685,0,0,2},{22852,6687,0,0,2}, {22856,6689,0,0,2},{22865,6691,0,0,2},{22868,6693,0,0,2},{22882,6695,0,0,2}, {22899,6697,0,0,2},{23000,6699,0,0,2},{23020,6701,0,0,2},{23067,6703,0,0,2}, {23079,6705,0,0,2},{23138,6707,0,0,2},{23142,6709,0,0,2},{23221,6711,0,0,2}, {23304,6713,0,0,2},{23336,6715,0,0,2},{23358,6717,0,0,2},{23429,6719,0,0,2}, {23491,6721,0,0,2},{23512,6723,0,0,2},{23527,6725,0,0,2},{23534,6727,0,0,2}, {23539,6729,0,0,2},{23551,6731,0,0,2},{23558,6733,0,0,2},{23586,6735,0,0,2}, {23615,6737,0,0,2},{23648,6739,0,0,2},{23650,6741,0,0,2},{23652,6743,0,0,2}, {23653,6745,0,0,2},{23662,6747,0,0,2},{23693,6749,0,0,2},{23744,6751,0,0,2}, {23833,6753,0,0,2},{23875,6755,0,0,2},{23888,6757,0,0,2},{23915,6759,0,0,2}, {23918,6761,0,0,2},{23932,6763,0,0,2},{23986,6765,0,0,2},{23994,6767,0,0,2}, {24033,6769,0,0,2},{24034,6771,0,0,2},{24061,6773,0,0,2},{24104,6775,0,0,2}, {24125,6777,0,0,2},{24169,6779,0,0,2},{24180,6781,0,0,2},{24230,6783,0,0,2}, {24240,6785,0,0,2},{24243,6787,0,0,2},{24246,6789,0,0,2},{24265,6791,0,0,2}, {24266,6793,0,0,2},{24274,6795,0,0,2},{24275,6797,0,0,2},{24281,6799,0,0,2}, {24300,6801,0,0,2},{24318,6803,0,0,2},{24324,6805,0,0,2},{24354,6807,0,0,2}, {24403,6809,0,0,2},{24418,6811,0,0,2},{24425,6813,0,0,2},{24427,6815,0,0,2}, {24459,6817,0,0,2},{24474,6819,0,0,2},{24489,6821,0,0,2},{24493,6823,0,0,2}, {24525,6825,0,0,2},{24535,6827,0,0,2},{24565,6829,0,0,2},{24569,6831,0,0,2}, {24594,6833,0,0,2},{24604,6835,0,0,2},{24693,6837,0,0,2},{24705,6839,0,0,2}, {24724,6841,0,0,2},{24775,6843,0,0,2},{24792,6845,0,0,2},{24801,6847,0,0,2}, {24840,6849,0,0,2},{24900,6851,0,0,2},{24904,6853,0,0,2},{24908,6855,0,0,2}, {24910,6857,0,0,2},{24928,6859,0,0,2},{24936,6861,0,0,2},{24954,6863,0,0,2}, {24974,6865,0,0,2},{24976,6867,0,0,2},{24996,6869,0,0,2},{25007,6871,0,0,2}, {25010,6873,0,0,2},{25054,6875,0,0,2},{25074,6877,0,0,2},{25078,6879,0,0,2}, {25088,6881,0,0,2},{25104,6883,0,0,2},{25115,6885,0,0,2},{25134,6887,0,0,2}, {25140,6889,0,0,2},{25181,6891,0,0,2},{25265,6893,0,0,2},{25289,6895,0,0,2}, {25295,6897,0,0,2},{25299,6899,0,0,2},{25300,6901,0,0,2},{25340,6903,0,0,2}, {25342,6905,0,0,2},{25405,6907,0,0,2},{25424,6909,0,0,2},{25448,6911,0,0,2}, {25467,6913,0,0,2},{25475,6915,0,0,2},{25504,6917,0,0,2},{25513,6919,0,0,2}, {25540,6921,0,0,2},{25541,6923,0,0,2},{25572,6925,0,0,2},{25628,6927,0,0,2}, {25634,6929,0,0,2},{25682,6931,0,0,2},{25705,6933,0,0,2},{25719,6935,0,0,2}, {25726,6937,0,0,2},{25754,6939,0,0,2},{25757,6941,0,0,2},{25796,6943,0,0,2}, {25935,6945,0,0,2},{25942,6947,0,0,2},{25964,6949,0,0,2},{25976,6951,0,0,2}, {26009,6953,0,0,2},{26053,6955,0,0,2},{26082,6957,0,0,2},{26083,6959,0,0,2}, {26131,6961,0,0,2},{26185,6963,0,0,2},{26228,6965,0,0,2},{26248,6967,0,0,2}, {26257,6969,0,0,2},{26268,6971,0,0,2},{26292,6973,0,0,2},{26310,6975,0,0,2}, {26356,6977,0,0,2},{26360,6979,0,0,2},{26368,6981,0,0,2},{26391,6983,0,0,2}, {26395,6985,0,0,2},{26401,6987,0,0,2},{26446,6989,0,0,2},{26451,6991,0,0,2}, {26454,6993,0,0,2},{26462,6995,0,0,2},{26491,6997,0,0,2},{26501,6999,0,0,2}, {26519,7001,0,0,2},{26611,7003,0,0,2},{26618,7005,0,0,2},{26647,7007,0,0,2}, {26655,7009,0,0,2},{26706,7011,0,0,2},{26753,7013,0,0,2},{26757,7015,0,0,2}, {26766,7017,0,0,2},{26792,7019,0,0,2},{26900,7021,0,0,2},{26946,7023,0,0,2}, {27043,7025,0,0,2},{27114,7027,0,0,2},{27138,7029,0,0,2},{27155,7031,0,0,2}, {27304,7033,0,0,2},{27347,7035,0,0,2},{27355,7037,0,0,2},{27396,7039,0,0,2}, {27425,7041,0,0,2},{27476,7043,0,0,2},{27506,7045,0,0,2},{27511,7047,0,0,2}, {27513,7049,0,0,2},{27551,7051,0,0,2},{27566,7053,0,0,2},{27578,7055,0,0,2}, {27579,7057,0,0,2},{27726,7059,0,0,2},{27751,7061,0,0,2},{27784,7063,0,0,2}, {27839,7065,0,0,2},{27852,7067,0,0,2},{27853,7069,0,0,2},{27877,7071,0,0,2}, {27926,7073,0,0,2},{27931,7075,0,0,2},{27934,7077,0,0,2},{27956,7079,0,0,2}, {27966,7081,0,0,2},{27969,7083,0,0,2},{28009,7085,0,0,2},{28010,7087,0,0,2}, {28023,7089,0,0,2},{28024,7091,0,0,2},{28037,7093,0,0,2},{28107,7095,0,0,2}, {28122,7097,0,0,2},{28138,7099,0,0,2},{28153,7101,0,0,2},{28186,7103,0,0,2}, {28207,7105,0,0,2},{28270,7107,0,0,2},{28316,7109,0,0,2},{28346,7111,0,0,2}, {28359,7113,0,0,2},{28363,7115,0,0,2},{28369,7117,0,0,2},{28379,7119,0,0,2}, {28431,7121,0,0,2},{28450,7123,0,0,2},{28451,7125,0,0,2},{28526,7127,0,0,2}, {28614,7129,0,0,2},{28651,7131,0,0,2},{28670,7133,0,0,2},{28699,7135,0,0,2}, {28702,7137,0,0,2},{28729,7139,0,0,2},{28746,7141,0,0,2},{28784,7143,0,0,2}, {28791,7145,0,0,2},{28797,7147,0,0,2},{28825,7149,0,0,2},{28845,7151,0,0,2}, {28872,7153,0,0,2},{28889,7155,0,0,2},{28997,7157,0,0,2},{29001,7159,0,0,2}, {29038,7161,0,0,2},{29084,7163,0,0,2},{29134,7165,0,0,2},{29136,7167,0,0,2}, {29200,7169,0,0,2},{29211,7171,0,0,2},{29224,7173,0,0,2},{29227,7175,0,0,2}, {29237,7177,0,0,2},{29264,7179,0,0,2},{29282,7181,0,0,2},{29312,7183,0,0,2}, {29333,7185,0,0,2},{29359,7187,0,0,2},{29376,7189,0,0,2},{29436,7191,0,0,2}, {29482,7193,0,0,2},{29557,7195,0,0,2},{29562,7197,0,0,2},{29575,7199,0,0,2}, {29579,7201,0,0,2},{29605,7203,0,0,2},{29618,7205,0,0,2},{29662,7207,0,0,2}, {29702,7209,0,0,2},{29705,7211,0,0,2},{29730,7213,0,0,2},{29767,7215,0,0,2}, {29788,7217,0,0,2},{29801,7219,0,0,2},{29809,7221,0,0,2},{29829,7223,0,0,2}, {29833,7225,0,0,2},{29848,7227,0,0,2},{29898,7229,0,0,2},{29958,7231,0,0,2}, {29988,7233,0,0,2},{30011,7235,0,0,2},{30014,7237,0,0,2},{30041,7239,0,0,2}, {30053,7241,0,0,2},{30064,7243,0,0,2},{30178,7245,0,0,2},{30224,7247,0,0,2}, {30237,7249,0,0,2},{30239,7251,0,0,2},{30274,7253,0,0,2},{30313,7255,0,0,2}, {30410,7257,0,0,2},{30427,7259,0,0,2},{30439,7261,0,0,2},{30452,7263,0,0,2}, {30465,7265,0,0,2},{30494,7267,0,0,2},{30495,7269,0,0,2},{30528,7271,0,0,2}, {30538,7273,0,0,2},{30603,7275,0,0,2},{30631,7277,0,0,2},{30798,7279,0,0,2}, {30827,7281,0,0,2},{30860,7283,0,0,2},{30865,7285,0,0,2},{30922,7287,0,0,2}, {30924,7289,0,0,2},{30971,7291,0,0,2},{31018,7293,0,0,2},{31036,7295,0,0,2}, {31038,7297,0,0,2},{31048,7299,0,0,2},{31049,7301,0,0,2},{31056,7303,0,0,2}, {31062,7305,0,0,2},{31069,7307,0,0,2},{31070,7309,0,0,2},{31077,7311,0,0,2}, {31103,7313,0,0,2},{31117,7315,0,0,2},{31118,7317,0,0,2},{31119,7319,0,0,2}, {31150,7321,0,0,2},{31178,7323,0,0,2},{31211,7325,0,0,2},{31260,7327,0,0,2}, {31296,7329,0,0,2},{31306,7331,0,0,2},{31311,7333,0,0,2},{31361,7335,0,0,2}, {31409,7337,0,0,2},{31435,7339,0,0,2},{31470,7341,0,0,2},{31520,7343,0,0,2}, {31680,7345,0,0,2},{31686,7347,0,0,2},{31689,7349,0,0,2},{31806,7351,0,0,2}, {31840,7353,0,0,2},{31867,7355,0,0,2},{31890,7357,0,0,2},{31934,7359,0,0,2}, {31954,7361,0,0,2},{31958,7363,0,0,2},{31971,7365,0,0,2},{31975,7367,0,0,2}, {31976,7369,0,0,2},{32000,7371,0,0,2},{32016,7373,0,0,2},{32034,7375,0,0,2}, {32047,7377,0,0,2},{32091,7379,0,0,2},{32099,7381,0,0,2},{32160,7383,0,0,2}, {32190,7385,0,0,2},{32199,7387,0,0,2},{32244,7389,0,0,2},{32258,7391,0,0,2}, {32265,7393,0,0,2},{32311,7395,0,0,2},{32321,7397,0,0,2},{32325,7399,0,0,2}, {32574,7401,0,0,2},{32626,7403,0,0,2},{32633,7405,0,0,2},{32634,7407,0,0,2}, {32645,7409,0,0,2},{32661,7411,0,0,2},{32666,7413,0,0,2},{32701,7415,0,0,2}, {32762,7417,0,0,2},{32769,7419,0,0,2},{32773,7421,0,0,2},{32838,7423,0,0,2}, {32864,7425,0,0,2},{32879,7427,0,0,2},{32880,7429,0,0,2},{32894,7431,0,0,2}, {32907,7433,0,0,2},{32941,7435,0,0,2},{32946,7437,0,0,2},{33027,7439,0,0,2}, {33086,7441,0,0,2},{33240,7443,0,0,2},{33256,7445,0,0,2},{33261,7447,0,0,2}, {33281,7449,0,0,2},{33284,7451,0,0,2},{33304,7453,0,0,2},{33391,7455,0,0,2}, {33401,7457,0,0,2},{33419,7459,0,0,2},{33425,7461,0,0,2},{33437,7463,0,0,2}, {33457,7465,0,0,2},{33459,7467,0,0,2},{33469,7469,0,0,2},{33509,7471,0,0,2}, {33510,7473,0,0,2},{33565,7475,0,0,2},{33571,7477,0,0,2},{33590,7479,0,0,2}, {33618,7481,0,0,2},{33619,7483,0,0,2},{33635,7485,0,0,2},{33709,7487,0,0,2}, {33725,7489,0,0,2},{33737,7491,0,0,2},{33738,7493,0,0,2},{33740,7495,0,0,2}, {33756,7497,0,0,2},{33767,7499,0,0,2},{33775,7501,0,0,2},{33777,7503,0,0,2}, {33853,7505,0,0,2},{33865,7507,0,0,2},{33879,7509,0,0,2},{34030,7511,0,0,2}, {34033,7513,0,0,2},{34035,7515,0,0,2},{34044,7517,0,0,2},{34070,7519,0,0,2}, {34148,7521,0,0,2},{34253,7523,0,0,2},{34298,7525,0,0,2},{34310,7527,0,0,2}, {34322,7529,0,0,2},{34349,7531,0,0,2},{34367,7533,0,0,2},{34384,7535,0,0,2}, {34396,7537,0,0,2},{34407,7539,0,0,2},{34409,7541,0,0,2},{34440,7543,0,0,2}, {34473,7545,0,0,2},{34530,7547,0,0,2},{34574,7549,0,0,2},{34600,7551,0,0,2}, {34667,7553,0,0,2},{34681,7555,0,0,2},{34694,7557,0,0,2},{34746,7559,0,0,2}, {34785,7561,0,0,2},{34817,7563,0,0,2},{34847,7565,0,0,2},{34892,7567,0,0,2}, {34912,7569,0,0,2},{34915,7571,0,0,2},{35010,7573,0,0,2},{35023,7575,0,0,2}, {35031,7577,0,0,2},{35038,7579,0,0,2},{35041,7581,0,0,2},{35064,7583,0,0,2}, {35066,7585,0,0,2},{35088,7587,0,0,2},{35137,7589,0,0,2},{35172,7591,0,0,2}, {35206,7593,0,0,2},{35211,7595,0,0,2},{35222,7597,0,0,2},{35488,7599,0,0,2}, {35498,7601,0,0,2},{35519,7603,0,0,2},{35531,7605,0,0,2},{35538,7607,0,0,2}, {35542,7609,0,0,2},{35565,7611,0,0,2},{35576,7613,0,0,2},{35582,7615,0,0,2}, {35585,7617,0,0,2},{35641,7619,0,0,2},{35672,7621,0,0,2},{35712,7623,0,0,2}, {35722,7625,0,0,2},{35912,7627,0,0,2},{35925,7629,0,0,2},{36011,7631,0,0,2}, {36033,7633,0,0,2},{36034,7635,0,0,2},{36040,7637,0,0,2},{36051,7639,0,0,2}, {36104,7641,0,0,2},{36123,7643,0,0,2},{36215,7645,0,0,2},{36284,7647,0,0,2}, {36299,7649,0,0,2},{36335,7651,0,0,2},{36336,7653,0,0,2},{36554,7655,0,0,2}, {36564,7657,0,0,2},{36646,7659,0,0,2},{36650,7661,0,0,2},{36664,7663,0,0,2}, {36667,7665,0,0,2},{36706,7667,0,0,2},{36766,7669,0,0,2},{36784,7671,0,0,2}, {36790,7673,0,0,2},{36899,7675,0,0,2},{36920,7677,0,0,2},{36978,7679,0,0,2}, {36988,7681,0,0,2},{37007,7683,0,0,2},{37012,7685,0,0,2},{37070,7687,0,0,2}, {37086,7689,0,0,2},{37105,7691,0,0,2},{37117,7693,0,0,2},{37137,7695,0,0,2}, {37147,7697,0,0,2},{37226,7699,0,0,2},{37273,7701,0,0,2},{37300,7703,0,0,2}, {37324,7705,0,0,2},{37327,7707,0,0,2},{37329,7709,0,0,2},{37428,7711,0,0,2}, {37432,7713,0,0,2},{37494,7715,0,0,2},{37500,7717,0,0,2},{37591,7719,0,0,2}, {37592,7721,0,0,2},{37636,7723,0,0,2},{37706,7725,0,0,2},{37881,7727,0,0,2}, {37909,7729,0,0,2},{38283,7731,0,0,2},{38317,7733,0,0,2},{38327,7735,0,0,2}, {38446,7737,0,0,2},{38475,7739,0,0,2},{38477,7741,0,0,2},{38517,7743,0,0,2}, {38520,7745,0,0,2},{38524,7747,0,0,2},{38534,7749,0,0,2},{38563,7751,0,0,2}, {38583,7753,0,0,2},{38584,7755,0,0,2},{38595,7757,0,0,2},{38626,7759,0,0,2}, {38627,7761,0,0,2},{38646,7763,0,0,2},{38647,7765,0,0,2},{38691,7767,0,0,2}, {38706,7769,0,0,2},{38728,7771,0,0,2},{38742,7773,0,0,2},{38875,7775,0,0,2}, {38880,7777,0,0,2},{38911,7779,0,0,2},{38923,7781,0,0,2},{38936,7783,0,0,2}, {38953,7785,0,0,2},{38971,7787,0,0,2},{39006,7789,0,0,2},{39138,7791,0,0,2}, {39151,7793,0,0,2},{39164,7795,0,0,2},{39208,7797,0,0,2},{39209,7799,0,0,2}, {39335,7801,0,0,2},{39362,7803,0,0,2},{39409,7805,0,0,2},{39422,7807,0,0,2}, {39530,7809,0,0,2},{39698,7811,0,0,2},{39791,7813,0,0,2},{40000,7815,0,0,2}, {40023,7817,0,0,2},{40189,7819,0,0,2},{40295,7821,0,0,2},{40372,7823,0,0,2}, {40442,7825,0,0,2},{40478,7827,0,0,2},{40575,7829,0,0,2},{40599,7831,0,0,2}, {40607,7833,0,0,2},{40635,7835,0,0,2},{40654,7837,0,0,2},{40697,7839,0,0,2}, {40702,7841,0,0,2},{40709,7843,0,0,2},{40719,7845,0,0,2},{40726,7847,0,0,2}, {40763,7849,0,0,2},{40771,7851,0,0,2},{40845,7853,0,0,2},{40846,7855,0,0,2}, {40860,7857,0,0,2},{42515,7859,0,0,2},{42516,7861,0,0,2},{42517,7863,0,0,2}, {42518,7865,0,0,2},{42519,7867,0,0,2},{42520,7869,0,0,2},{42521,7871,0,0,2}, {42522,7873,0,0,2},{42523,7875,0,0,2},{42524,7877,0,0,2},{42525,7879,0,0,2}, {42526,7881,0,0,2},{42527,7883,0,0,2},{42614,7885,0,0,2},{42792,7887,0,0,2}, {42793,7889,0,0,2},{42802,7891,0,0,2},{42803,7893,0,0,2},{42804,7895,0,0,2}, {42805,7897,0,0,2},{42806,7899,0,0,2},{42807,7901,0,0,2},{42808,7903,0,0,2}, {42809,7905,0,0,2},{42810,7907,0,0,3},{42811,7910,0,0,3},{42812,7913,0,0,2}, {42813,7915,0,0,2},{42830,7917,0,0,2},{42831,7919,0,0,2},{42848,7921,0,0,2}, {42849,7923,0,0,2},{42873,7925,0,0,2},{42874,7927,0,0,2},{42875,7929,0,0,2}, {42876,7931,0,0,2},{42877,7933,0,0,2},{42882,7935,0,0,2},{42883,7937,0,0,2}, {42884,7939,0,0,2},{42885,7941,0,0,2},{42886,7943,0,0,2},{42887,7945,0,0,2}, {42906,7947,0,0,2},{42907,7949,0,0,2},{42908,7951,0,0,2},{42909,7953,0,0,2}, {42910,7955,0,0,2},{42911,7957,0,0,2},{42912,7959,0,0,2},{42913,7961,0,0,2}, {42914,7963,0,0,2},{42915,7965,0,0,2},{42916,7967,0,0,2},{42917,7969,0,0,2}, {42918,7971,0,0,2},{42919,7973,0,0,2},{42920,7975,0,0,2},{42921,7977,0,0,2}, {43000,7979,0,0,2},{43001,7981,0,0,3},{43701,0,4444,48,0},{43702,0,4492,48,0}, {43705,0,4540,48,0},{43707,0,4588,48,0},{43708,0,4636,48,0},{64014,8464,0,0,2}, {64015,8466,0,0,2},{64017,8468,0,0,2},{64019,8470,0,0,2},{64020,8472,0,0,2}, {64031,8474,0,0,2},{64033,8476,0,0,2},{64035,8478,0,0,2},{64036,8480,0,0,2}, {64039,8482,0,0,2},{64040,8484,0,0,2},{64041,8486,0,0,2},{64256,8488,0,0,2}, {64257,8490,0,0,2},{64258,8492,0,0,2},{64259,8494,0,0,3},{64260,8497,0,0,3}, {64261,8500,0,0,3},{64262,8503,0,0,2},{64275,8505,0,0,2},{64276,8507,0,0,2}, {64277,8509,0,0,2},{64278,8511,0,0,2},{64279,8513,0,0,2},{64335,8515,0,0,2}, {64420,8517,0,0,2},{64421,8519,0,0,2},{64432,8521,0,0,2},{64433,8523,0,0,2}, {64477,8525,0,0,2},{64490,8527,0,0,2},{64491,8529,0,0,2},{64492,8531,0,0,2}, {64493,8533,0,0,2},{64494,8535,0,0,2},{64495,8537,0,0,2},{64496,8539,0,0,2}, {64497,8541,0,0,2},{64498,8543,0,0,2},{64499,8545,0,0,2},{64500,8547,0,0,2}, {64501,8549,0,0,2},{64502,8551,0,0,2},{64503,8553,0,0,2},{64504,8555,0,0,2}, {64505,8557,0,0,2},{64506,8559,0,0,2},{64507,8561,0,0,2},{64512,8563,0,0,2}, {64513,8565,0,0,2},{64514,8567,0,0,2},{64515,8569,0,0,2},{64516,8571,0,0,2}, {64517,8573,0,0,2},{64518,8575,0,0,2},{64519,8577,0,0,2},{64520,8579,0,0,2}, {64521,8581,0,0,2},{64522,8583,0,0,2},{64523,8585,0,0,2},{64524,8587,0,0,2}, {64525,8589,0,0,2},{64526,8591,0,0,2},{64527,8593,0,0,2},{64528,8595,0,0,2}, {64529,8597,0,0,2},{64530,8599,0,0,2},{64531,8601,0,0,2},{64532,8603,0,0,2}, {64533,8605,0,0,2},{64534,8607,0,0,2},{64535,8609,0,0,2},{64536,8611,0,0,2}, {64537,8613,0,0,2},{64538,8615,0,0,2},{64539,8617,0,0,2},{64540,8619,0,0,2}, {64541,8621,0,0,2},{64542,8623,0,0,2},{64543,8625,0,0,2},{64544,8627,0,0,2}, {64545,8629,0,0,2},{64546,8631,0,0,2},{64547,8633,0,0,2},{64548,8635,0,0,2}, {64549,8637,0,0,2},{64550,8639,0,0,2},{64551,8641,0,0,2},{64552,8643,0,0,2}, {64553,8645,0,0,2},{64554,8647,0,0,2},{64555,8649,0,0,2},{64556,8651,0,0,2}, {64557,8653,0,0,2},{64558,8655,0,0,2},{64559,8657,0,0,2},{64560,8659,0,0,2}, {64561,8661,0,0,2},{64562,8663,0,0,2},{64563,8665,0,0,2},{64564,8667,0,0,2}, {64565,8669,0,0,2},{64566,8671,0,0,2},{64567,8673,0,0,2},{64568,8675,0,0,2}, {64569,8677,0,0,2},{64570,8679,0,0,2},{64571,8681,0,0,2},{64572,8683,0,0,2}, {64573,8685,0,0,2},{64574,8687,0,0,2},{64575,8689,0,0,2},{64576,8691,0,0,2}, {64577,8693,0,0,2},{64578,8695,0,0,2},{64579,8697,0,0,2},{64580,8699,0,0,2}, {64581,8701,0,0,2},{64582,8703,0,0,2},{64583,8705,0,0,2},{64584,8707,0,0,2}, {64585,8709,0,0,2},{64586,8711,0,0,2},{64587,8713,0,0,2},{64588,8715,0,0,2}, {64589,8717,0,0,2},{64590,8719,0,0,2},{64591,8721,0,0,2},{64592,8723,0,0,2}, {64593,8725,0,0,2},{64594,8727,0,0,2},{64595,8729,0,0,2},{64596,8731,0,0,2}, {64597,8733,0,0,2},{64598,8735,0,0,2},{64599,8737,0,0,2},{64600,8739,0,0,2}, {64601,8741,0,0,2},{64602,8743,0,0,2},{64603,8745,0,0,2},{64604,8747,0,0,2}, {64605,8749,0,0,2},{64606,8751,0,0,2},{64607,8753,0,0,2},{64608,8755,0,0,2}, {64609,8757,0,0,2},{64610,8759,0,0,2},{64611,8761,0,0,2},{64612,8763,0,0,2}, {64613,8765,0,0,2},{64614,8767,0,0,2},{64615,8769,0,0,2},{64616,8771,0,0,2}, {64617,8773,0,0,2},{64618,8775,0,0,2},{64619,8777,0,0,2},{64620,8779,0,0,2}, {64621,8781,0,0,2},{64622,8783,0,0,2},{64623,8785,0,0,2},{64624,8787,0,0,2}, {64625,8789,0,0,2},{64626,8791,0,0,2},{64627,8793,0,0,2},{64628,8795,0,0,2}, {64629,8797,0,0,2},{64630,8799,0,0,2},{64631,8801,0,0,2},{64632,8803,0,0,2}, {64633,8805,0,0,2},{64634,8807,0,0,2},{64635,8809,0,0,2},{64636,8811,0,0,2}, {64637,8813,0,0,2},{64638,8815,0,0,2},{64639,8817,0,0,2},{64640,8819,0,0,2}, {64641,8821,0,0,2},{64642,8823,0,0,2},{64643,8825,0,0,2},{64644,8827,0,0,2}, {64645,8829,0,0,2},{64646,8831,0,0,2},{64647,8833,0,0,2},{64648,8835,0,0,2}, {64649,8837,0,0,2},{64650,8839,0,0,2},{64651,8841,0,0,2},{64652,8843,0,0,2}, {64653,8845,0,0,2},{64654,8847,0,0,2},{64655,8849,0,0,2},{64656,8851,0,0,2}, {64657,8853,0,0,2},{64658,8855,0,0,2},{64659,8857,0,0,2},{64660,8859,0,0,2}, {64661,8861,0,0,2},{64662,8863,0,0,2},{64663,8865,0,0,2},{64664,8867,0,0,2}, {64665,8869,0,0,2},{64666,8871,0,0,2},{64667,8873,0,0,2},{64668,8875,0,0,2}, {64669,8877,0,0,2},{64670,8879,0,0,2},{64671,8881,0,0,2},{64672,8883,0,0,2}, {64673,8885,0,0,2},{64674,8887,0,0,2},{64675,8889,0,0,2},{64676,8891,0,0,2}, {64677,8893,0,0,2},{64678,8895,0,0,2},{64679,8897,0,0,2},{64680,8899,0,0,2}, {64681,8901,0,0,2},{64682,8903,0,0,2},{64683,8905,0,0,2},{64684,8907,0,0,2}, {64685,8909,0,0,2},{64686,8911,0,0,2},{64687,8913,0,0,2},{64688,8915,0,0,2}, {64689,8917,0,0,2},{64690,8919,0,0,2},{64691,8921,0,0,2},{64692,8923,0,0,2}, {64693,8925,0,0,2},{64694,8927,0,0,2},{64695,8929,0,0,2},{64696,8931,0,0,2}, {64697,8933,0,0,2},{64698,8935,0,0,2},{64699,8937,0,0,2},{64700,8939,0,0,2}, {64701,8941,0,0,2},{64702,8943,0,0,2},{64703,8945,0,0,2},{64704,8947,0,0,2}, {64705,8949,0,0,2},{64706,8951,0,0,2},{64707,8953,0,0,2},{64708,8955,0,0,2}, {64709,8957,0,0,2},{64710,8959,0,0,2},{64711,8961,0,0,2},{64712,8963,0,0,2}, {64713,8965,0,0,2},{64714,8967,0,0,2},{64715,8969,0,0,2},{64716,8971,0,0,2}, {64717,8973,0,0,2},{64718,8975,0,0,2},{64719,8977,0,0,2},{64720,8979,0,0,2}, {64721,8981,0,0,2},{64722,8983,0,0,2},{64723,8985,0,0,2},{64724,8987,0,0,2}, {64725,8989,0,0,2},{64726,8991,0,0,2},{64727,8993,0,0,2},{64728,8995,0,0,2}, {64729,8997,0,0,2},{64730,8999,0,0,2},{64731,9001,0,0,2},{64732,9003,0,0,2}, {64733,9005,0,0,2},{64734,9007,0,0,2},{64735,9009,0,0,2},{64736,9011,0,0,2}, {64737,9013,0,0,2},{64738,9015,0,0,2},{64739,9017,0,0,2},{64740,9019,0,0,2}, {64741,9021,0,0,2},{64742,9023,0,0,2},{64743,9025,0,0,2},{64744,9027,0,0,2}, {64745,9029,0,0,2},{64746,9031,0,0,2},{64747,9033,0,0,2},{64748,9035,0,0,2}, {64749,9037,0,0,2},{64750,9039,0,0,2},{64751,9041,0,0,2},{64752,9043,0,0,2}, {64753,9045,0,0,2},{64754,9047,0,0,2},{64755,9049,0,0,2},{64756,9051,0,0,2}, {64757,9053,0,0,2},{64758,9055,0,0,2},{64759,9057,0,0,2},{64760,9059,0,0,2}, {64761,9061,0,0,2},{64762,9063,0,0,2},{64763,9065,0,0,2},{64764,9067,0,0,2}, {64765,9069,0,0,2},{64766,9071,0,0,2},{64767,9073,0,0,2},{64768,9075,0,0,2}, {64769,9077,0,0,2},{64770,9079,0,0,2},{64771,9081,0,0,2},{64772,9083,0,0,2}, {64773,9085,0,0,2},{64774,9087,0,0,2},{64775,9089,0,0,2},{64776,9091,0,0,2}, {64777,9093,0,0,2},{64778,9095,0,0,2},{64779,9097,0,0,2},{64780,9099,0,0,2}, {64781,9101,0,0,2},{64782,9103,0,0,2},{64783,9105,0,0,2},{64784,9107,0,0,2}, {64785,9109,0,0,2},{64786,9111,0,0,2},{64787,9113,0,0,2},{64788,9115,0,0,2}, {64789,9117,0,0,2},{64790,9119,0,0,2},{64791,9121,0,0,2},{64792,9123,0,0,2}, {64793,9125,0,0,2},{64794,9127,0,0,2},{64795,9129,0,0,2},{64796,9131,0,0,2}, {64797,9133,0,0,2},{64798,9135,0,0,2},{64799,9137,0,0,2},{64800,9139,0,0,2}, {64801,9141,0,0,2},{64802,9143,0,0,2},{64803,9145,0,0,2},{64804,9147,0,0,2}, {64805,9149,0,0,2},{64806,9151,0,0,2},{64807,9153,0,0,2},{64808,9155,0,0,2}, {64809,9157,0,0,2},{64810,9159,0,0,2},{64811,9161,0,0,2},{64812,9163,0,0,2}, {64813,9165,0,0,2},{64814,9167,0,0,2},{64815,9169,0,0,2},{64816,9171,0,0,2}, {64817,9173,0,0,2},{64818,9175,0,0,2},{64819,9177,0,0,2},{64820,9179,0,0,2}, {64821,9181,0,0,2},{64822,9183,0,0,2},{64823,9185,0,0,2},{64824,9187,0,0,2}, {64825,9189,0,0,2},{64826,9191,0,0,2},{64827,9193,0,0,2},{64828,9195,0,0,2}, {64829,9197,0,0,2},{64848,9199,0,0,3},{64849,9202,0,0,3},{64850,9205,0,0,3}, {64851,9208,0,0,3},{64852,9211,0,0,3},{64853,9214,0,0,3},{64854,9217,0,0,3}, {64855,9220,0,0,3},{64856,9223,0,0,3},{64857,9226,0,0,3},{64858,9229,0,0,3}, {64859,9232,0,0,3},{64860,9235,0,0,3},{64861,9238,0,0,3},{64862,9241,0,0,3}, {64863,9244,0,0,3},{64864,9247,0,0,3},{64865,9250,0,0,3},{64866,9253,0,0,3}, {64867,9256,0,0,3},{64868,9259,0,0,3},{64869,9262,0,0,3},{64870,9265,0,0,3}, {64871,9268,0,0,3},{64872,9271,0,0,3},{64873,9274,0,0,3},{64874,9277,0,0,3}, {64875,9280,0,0,3},{64876,9283,0,0,3},{64877,9286,0,0,3},{64878,9289,0,0,3}, {64879,9292,0,0,3},{64880,9295,0,0,3},{64881,9298,0,0,3},{64882,9301,0,0,3}, {64883,9304,0,0,3},{64884,9307,0,0,3},{64885,9310,0,0,3},{64886,9313,0,0,3}, {64887,9316,0,0,3},{64888,9319,0,0,3},{64889,9322,0,0,3},{64890,9325,0,0,3}, {64891,9328,0,0,3},{64892,9331,0,0,3},{64893,9334,0,0,3},{64894,9337,0,0,3}, {64895,9340,0,0,3},{64896,9343,0,0,3},{64897,9346,0,0,3},{64898,9349,0,0,3}, {64899,9352,0,0,3},{64900,9355,0,0,3},{64901,9358,0,0,3},{64902,9361,0,0,3}, {64903,9364,0,0,3},{64904,9367,0,0,3},{64905,9370,0,0,3},{64906,9373,0,0,3}, {64907,9376,0,0,3},{64908,9379,0,0,3},{64909,9382,0,0,3},{64910,9385,0,0,3}, {64911,9388,0,0,3},{64914,9391,0,0,3},{64915,9394,0,0,3},{64916,9397,0,0,3}, {64917,9400,0,0,3},{64918,9403,0,0,3},{64919,9406,0,0,3},{64920,9409,0,0,3}, {64921,9412,0,0,3},{64922,9415,0,0,3},{64923,9418,0,0,3},{64924,9421,0,0,3}, {64925,9424,0,0,3},{64926,9427,0,0,3},{64927,9430,0,0,3},{64928,9433,0,0,3}, {64929,9436,0,0,3},{64930,9439,0,0,3},{64931,9442,0,0,3},{64932,9445,0,0,3}, {64933,9448,0,0,3},{64934,9451,0,0,3},{64935,9454,0,0,3},{64936,9457,0,0,3}, {64937,9460,0,0,3},{64938,9463,0,0,3},{64939,9466,0,0,3},{64940,9469,0,0,3}, {64941,9472,0,0,3},{64942,9475,0,0,3},{64943,9478,0,0,3},{64944,9481,0,0,3}, {64945,9484,0,0,3},{64946,9487,0,0,3},{64947,9490,0,0,3},{64948,9493,0,0,3}, {64949,9496,0,0,3},{64950,9499,0,0,3},{64951,9502,0,0,3},{64952,9505,0,0,3}, {64953,9508,0,0,3},{64954,9511,0,0,3},{64955,9514,0,0,3},{64956,9517,0,0,3}, {64957,9520,0,0,3},{64958,9523,0,0,3},{64959,9526,0,0,3},{64960,9529,0,0,3}, {64961,9532,0,0,3},{64962,9535,0,0,3},{64963,9538,0,0,3},{64964,9541,0,0,3}, {64965,9544,0,0,3},{64966,9547,0,0,3},{64967,9550,0,0,3},{65008,9553,0,0,3}, {65009,9556,0,0,3},{65010,9559,0,0,4},{65011,9563,0,0,4},{65012,9567,0,0,4}, {65013,9571,0,0,4},{65014,9575,0,0,4},{65015,9579,0,0,4},{65016,9583,0,0,4}, {65017,9587,0,0,3},{65018,9590,0,0,18},{65019,9608,0,0,8},{65020,9616,0,0,4}, {65049,9620,0,0,3},{65072,9623,0,0,2},{65269,9625,0,0,2},{65270,9627,0,0,2}, {65271,9629,0,0,2},{65272,9631,0,0,2},{65273,9633,0,0,2},{65274,9635,0,0,2}, {65275,9637,0,0,2},{65276,9639,0,0,2},{67968,9641,0,0,2},{67969,9643,0,0,2}, {67970,9645,0,0,2},{67971,9647,0,0,2},{67972,9649,0,0,2},{67973,9651,0,0,2}, {67974,9653,0,0,2},{67975,9655,0,0,2},{67976,9657,0,0,2},{67977,9659,0,0,2}, {67978,9661,0,0,2},{67979,9663,0,0,2},{67980,9665,0,0,2},{67981,9667,0,0,2}, {67982,9669,0,0,2},{67983,9671,0,0,2},{67984,9673,0,0,2},{67985,9675,0,0,2}, {67986,9677,0,0,2},{67987,9679,0,0,2},{67988,9681,0,0,2},{67989,9683,0,0,2}, {67990,9685,0,0,2},{67991,9687,0,0,2},{67992,9689,0,0,2},{67993,9691,0,0,2}, {67994,9693,0,0,2},{67995,9695,0,0,2},{67996,9697,0,0,2},{67997,9699,0,0,2}, {68016,9701,0,0,2},{68296,9703,0,0,2},{68398,9705,0,0,2},{68609,9707,0,0,2}, {68612,9709,0,0,2},{68616,9711,0,0,2},{68618,9713,0,0,2},{68620,9715,0,0,2}, {68622,9717,0,0,2},{68624,9719,0,0,2},{68626,9721,0,0,2},{68629,9723,0,0,2}, {68631,9725,0,0,2},{68633,9727,0,0,2},{68635,9729,0,0,2},{68637,9731,0,0,2}, {68639,9733,0,0,2},{68645,9735,0,0,2},{68647,9737,0,0,2},{68649,9739,0,0,2}, {68651,9741,0,0,2},{68654,9743,0,0,2},{68659,9745,0,0,2},{68661,9747,0,0,2}, {68663,9749,0,0,2},{68665,9751,0,0,2},{68667,9753,0,0,2},{68672,9755,0,0,2}, {68674,9757,0,0,2},{68676,9759,0,0,2},{68678,9761,0,0,2},{68737,9763,0,0,2}, {68746,9765,0,0,2},{68747,9767,0,0,2},{68753,9769,0,0,2},{68764,9771,0,0,2}, {68766,9773,0,0,2},{68767,9775,0,0,2},{68771,9777,0,0,2},{68779,9779,0,0,2}, {68781,9781,0,0,2},{68801,9783,0,0,2},{68810,9785,0,0,2},{68811,9787,0,0,2}, {68817,9789,0,0,2},{68828,9791,0,0,2},{68830,9793,0,0,2},{68831,9795,0,0,2}, {68835,9797,0,0,2},{68843,9799,0,0,2},{68845,9801,0,0,2},{69786,9803,0,0,2}, {69788,9805,0,0,2},{69803,9807,0,0,2},{71128,9809,0,0,2},{71129,9811,0,0,2}, {71130,9813,0,0,2},{71131,9815,0,0,2},{71132,9817,0,0,2},{71133,9819,0,0,2}, {71429,9821,0,0,2},{71446,9823,0,0,2},{119127,0,4684,1,0},{119128,0,4685,1,0}, {119225,0,4691,1,0},{119226,0,4694,1,0},{127232,9860,0,0,2},{127233,9862,0,0,2}, {127234,9864,0,0,2},{127235,9866,0,0,2},{127236,9868,0,0,2},{127237,9870,0,0,2}, {127238,9872,0,0,2},{127239,9874,0,0,2},{127240,9876,0,0,2},{127241,9878,0,0,2}, {127242,9880,0,0,2},{127248,9882,0,0,3},{127249,9885,0,0,3},{127250,9888,0,0,3}, {127251,9891,0,0,3},{127252,9894,0,0,3},{127253,9897,0,0,3},{127254,9900,0,0,3}, {127255,9903,0,0,3},{127256,9906,0,0,3},{127257,9909,0,0,3},{127258,9912,0,0,3}, {127259,9915,0,0,3},{127260,9918,0,0,3},{127261,9921,0,0,3},{127262,9924,0,0,3}, {127263,9927,0,0,3},{127264,9930,0,0,3},{127265,9933,0,0,3},{127266,9936,0,0,3}, {127267,9939,0,0,3},{127268,9942,0,0,3},{127269,9945,0,0,3},{127270,9948,0,0,3}, {127271,9951,0,0,3},{127272,9954,0,0,3},{127273,9957,0,0,3},{127274,9960,0,0,3}, {127277,9963,0,0,2},{127278,9965,0,0,2},{127306,9967,0,0,2},{127307,9969,0,0,2}, {127308,9971,0,0,2},{127309,9973,0,0,2},{127310,9975,0,0,3},{127311,9978,0,0,2}, {127338,9980,0,0,2},{127339,9982,0,0,2},{127371,9984,0,0,2},{127372,9986,0,0,2}, {127373,9988,0,0,2},{127374,9990,0,0,2},{127375,9992,0,0,2},{127376,9994,0,0,2}, {127377,9996,0,0,2},{127378,9998,0,0,4},{127379,10002,0,0,4},{127380,10006,0,0, 2},{127381,10008,0,0,3},{127382,10011,0,0,2},{127383,10013,0,0,2},{127384,10015, 0,0,3},{127385,10018,0,0,3},{127386,10021,0,0,2},{127387,10023,0,0,2},{127388, 10025,0,0,7},{127389,10032,0,0,2},{127390,10034,0,0,2},{127391,10036,0,0,2}, {127392,10038,0,0,3},{127393,10041,0,0,3},{127394,10044,0,0,4},{127395,10048,0, 0,3},{127396,10051,0,0,4},{127398,10055,0,0,2},{127399,10057,0,0,3},{127400, 10060,0,0,6},{127401,10066,0,0,8},{127402,10074,0,0,3},{127403,10077,0,0,3}, {127404,10080,0,0,3},{127488,10083,0,0,2},{127489,10085,0,0,2},{127504,10087,0, 0,2},{127505,10089,0,0,2},{127506,10091,0,0,2},{127507,10093,0,0,2},{127508, 10095,0,0,2},{127509,10097,0,0,2},{127510,10099,0,0,2},{127511,10101,0,0,2}, {127512,10103,0,0,2},{127513,10105,0,0,2},{127514,10107,0,0,2},{127515,10109,0, 0,2},{127516,10111,0,0,2},{127517,10113,0,0,2},{127518,10115,0,0,2},{127519, 10117,0,0,2},{127520,10119,0,0,2},{127521,10121,0,0,2},{127522,10123,0,0,2}, {127523,10125,0,0,2},{127524,10127,0,0,2},{127525,10129,0,0,2},{127526,10131,0, 0,2},{127527,10133,0,0,2},{127528,10135,0,0,2},{127529,10137,0,0,2},{127530, 10139,0,0,2},{127531,10141,0,0,2},{127532,10143,0,0,2},{127533,10145,0,0,2}, {127534,10147,0,0,2},{127535,10149,0,0,2},{127536,10151,0,0,2},{127537,10153,0, 0,2},{127538,10155,0,0,2},{127539,10157,0,0,2},{127540,10159,0,0,2},{127541, 10161,0,0,2},{127542,10163,0,0,2},{127543,10165,0,0,2},{127544,10167,0,0,2}, {127545,10169,0,0,2},{127546,10171,0,0,2},{127547,10173,0,0,2},{127552,10175,0, 0,4},{127553,10179,0,0,4},{127554,10183,0,0,4},{127555,10187,0,0,4},{127556, 10191,0,0,4},{127557,10195,0,0,4},{127558,10199,0,0,4},{127559,10203,0,0,4}, {127560,10207,0,0,4},{127568,10211,0,0,2},{127569,10213,0,0,2},{131362,10215,0, 0,2},{132380,10217,0,0,2},{132389,10219,0,0,2},{132427,10221,0,0,2},{132666, 10223,0,0,2},{133124,10225,0,0,2},{133342,10227,0,0,2},{133676,10229,0,0,2}, {133987,10231,0,0,2},{136420,10233,0,0,2},{136872,10235,0,0,2},{136938,10237,0, 0,2},{137672,10239,0,0,2},{138008,10241,0,0,2},{138507,10243,0,0,2},{138724, 10245,0,0,2},{138726,10247,0,0,2},{139651,10249,0,0,2},{139679,10251,0,0,2}, {140081,10253,0,0,2},{141012,10255,0,0,2},{141380,10257,0,0,2},{141386,10259,0, 0,2},{142092,10261,0,0,2},{142321,10263,0,0,2},{143370,10265,0,0,2},{144056, 10267,0,0,2},{144223,10269,0,0,2},{144275,10271,0,0,2},{144284,10273,0,0,2}, {144323,10275,0,0,2},{144341,10277,0,0,2},{144493,10279,0,0,2},{145059,10281,0, 0,2},{145575,10283,0,0,2},{146061,10285,0,0,2},{146170,10287,0,0,2},{146620, 10289,0,0,2},{146718,10291,0,0,2},{147153,10293,0,0,2},{147294,10295,0,0,2}, {147342,10297,0,0,2},{148067,10299,0,0,2},{148206,10301,0,0,2},{148395,10303,0, 0,2},{149000,10305,0,0,2},{149301,10307,0,0,2},{149524,10309,0,0,2},{150582, 10311,0,0,2},{150674,10313,0,0,2},{151457,10315,0,0,2},{151480,10317,0,0,2}, {151620,10319,0,0,2},{151794,10321,0,0,2},{151795,10323,0,0,2},{151833,10325,0, 0,2},{151859,10327,0,0,2},{152137,10329,0,0,2},{152605,10331,0,0,2},{153126, 10333,0,0,2},{153242,10335,0,0,2},{153285,10337,0,0,2},{153980,10339,0,0,2}, {154279,10341,0,0,2},{154539,10343,0,0,2},{154752,10345,0,0,2},{154832,10347,0, 0,2},{155526,10349,0,0,2},{156122,10351,0,0,2},{156200,10353,0,0,2},{156231, 10355,0,0,2},{156377,10357,0,0,2},{156478,10359,0,0,2},{156890,10361,0,0,2}, {156963,10363,0,0,2},{157096,10365,0,0,2},{157607,10367,0,0,2},{157621,10369,0, 0,2},{158524,10371,0,0,2},{158774,10373,0,0,2},{158933,10375,0,0,2},{159083, 10377,0,0,2},{159532,10379,0,0,2},{159665,10381,0,0,2},{159954,10383,0,0,2}, {160714,10385,0,0,2},{161383,10387,0,0,2},{161966,10389,0,0,2},{162150,10391,0, 0,2},{162984,10393,0,0,2},{163539,10395,0,0,2},{163631,10397,0,0,2},{165330, 10399,0,0,2},{165357,10401,0,0,2},{165678,10403,0,0,2},{166906,10405,0,0,2}, {167287,10407,0,0,2},{168261,10409,0,0,2},{168415,10411,0,0,2},{168474,10413,0, 0,2},{168970,10415,0,0,2},{169110,10417,0,0,2},{169398,10419,0,0,2},{170800, 10421,0,0,2},{172238,10423,0,0,2},{172293,10425,0,0,2},{172558,10427,0,0,2}, {172689,10429,0,0,2},{172946,10431,0,0,2},{173568,10433,0,0,2},{183,0,0,0,2}, {183,2,0,0,2},{769,649,0,0,2},{1463,811,0,0,2},{1464,813,0,0,2},{1468,815,0,0, 2},{1468,817,0,0,2},{1471,819,0,0,2},{1468,821,0,0,2},{1468,823,0,0,2},{1468, 825,0,0,2},{1465,827,0,0,2},{1468,829,0,0,2},{1468,831,0,0,2},{1468,833,0,0,2}, {1460,835,0,0,2},{1468,837,0,0,2},{1468,839,0,0,2},{1468,841,0,0,2},{1471,843,0, 0,2},{1468,845,0,0,2},{1468,847,0,0,2},{1468,849,0,0,2},{1468,851,0,0,2},{1468, 853,0,0,2},{1468,855,0,0,2},{1471,857,0,0,2},{1468,859,0,0,2},{1468,861,0,0,2}, {1468,863,0,0,2},{1468,865,3834,2,2},{1473,867,0,0,3},{1474,870,0,0,3},{1473, 873,0,0,2},{1474,875,0,0,2},{1468,877,0,0,2},{1463,885,0,0,3},{2364,924,0,0,2}, {2364,926,0,0,2},{2364,928,0,0,2},{2364,930,0,0,2},{2364,932,0,0,2},{2364,934,0, 0,2},{2364,938,0,0,2},{2364,940,0,0,2},{2492,946,0,0,2},{2492,948,0,0,2},{2492, 950,0,0,2},{2620,954,0,0,2},{2620,956,0,0,2},{2620,958,0,0,2},{2620,960,0,0,2}, {2620,962,0,0,2},{2620,964,0,0,2},{2876,966,0,0,2},{2876,968,0,0,2},{3585,990,0, 0,2},{3586,992,0,0,2},{3587,994,0,0,2},{3588,996,0,0,2},{3589,998,0,0,2},{3590, 1000,0,0,2},{3591,1002,0,0,2},{3592,1004,0,0,2},{3593,1006,0,0,2},{3594,1008,0, 0,2},{3595,1010,0,0,2},{3596,1012,0,0,2},{3597,1014,0,0,2},{3598,1016,0,0,2}, {3599,1018,0,0,2},{3600,1020,0,0,2},{3601,1022,0,0,2},{3602,1024,0,0,2},{3603, 1026,0,0,2},{3604,1028,0,0,2},{3605,1030,0,0,2},{3606,1032,0,0,2},{3607,1034,0, 0,2},{3608,1036,0,0,2},{3609,1038,0,0,2},{3610,1040,0,0,2},{3611,1042,0,0,2}, {3612,1044,0,0,2},{3613,1046,0,0,2},{3614,1048,0,0,2},{3615,1050,0,0,2},{3616, 1052,0,0,2},{3617,1054,0,0,2},{3618,1056,0,0,2},{3619,1058,0,0,2},{3620,1060,0, 0,2},{3621,1062,0,0,2},{3622,1064,0,0,2},{3623,1066,0,0,2},{3624,1068,0,0,2}, {3625,1070,0,0,2},{3626,1072,0,0,2},{3627,1074,0,0,2},{3628,1076,0,0,2},{3629, 1078,0,0,2},{3630,1080,0,0,2},{3585,1082,0,0,2},{3586,1084,0,0,2},{3587,1086,0, 0,2},{3588,1088,0,0,2},{3589,1090,0,0,2},{3590,1092,0,0,2},{3591,1094,0,0,2}, {3592,1096,0,0,2},{3593,1098,0,0,2},{3594,1100,0,0,2},{3595,1102,0,0,2},{3596, 1104,0,0,2},{3597,1106,0,0,2},{3598,1108,0,0,2},{3599,1110,0,0,2},{3600,1112,0, 0,2},{3601,1114,0,0,2},{3602,1116,0,0,2},{3603,1118,0,0,2},{3604,1120,0,0,2}, {3605,1122,0,0,2},{3606,1124,0,0,2},{3607,1126,0,0,2},{3608,1128,0,0,2},{3609, 1130,0,0,2},{3610,1132,0,0,2},{3611,1134,0,0,2},{3612,1136,0,0,2},{3613,1138,0, 0,2},{3614,1140,0,0,2},{3615,1142,0,0,2},{3616,1144,0,0,2},{3617,1146,0,0,2}, {3618,1148,0,0,2},{3619,1150,0,0,2},{3620,1152,0,0,2},{3621,1154,0,0,2},{3622, 1156,0,0,2},{3623,1158,0,0,2},{3624,1160,0,0,2},{3625,1162,0,0,2},{3626,1164,0, 0,2},{3627,1166,0,0,2},{3628,1168,0,0,2},{3629,1170,0,0,2},{3630,1172,0,0,2}, {3585,1174,0,0,2},{3586,1176,0,0,2},{3587,1178,0,0,2},{3588,1180,0,0,2},{3589, 1182,0,0,2},{3590,1184,0,0,2},{3591,1186,0,0,2},{3592,1188,0,0,2},{3593,1190,0, 0,2},{3594,1192,0,0,2},{3595,1194,0,0,2},{3596,1196,0,0,2},{3597,1198,0,0,2}, {3598,1200,0,0,2},{3599,1202,0,0,2},{3600,1204,0,0,2},{3601,1206,0,0,2},{3602, 1208,0,0,2},{3603,1210,0,0,2},{3604,1212,0,0,2},{3605,1214,0,0,2},{3606,1216,0, 0,2},{3607,1218,0,0,2},{3608,1220,0,0,2},{3609,1222,0,0,2},{3610,1224,0,0,2}, {3611,1226,0,0,2},{3612,1228,0,0,2},{3613,1230,0,0,2},{3614,1232,0,0,2},{3615, 1234,0,0,2},{3616,1236,0,0,2},{3617,1238,0,0,2},{3618,1240,0,0,2},{3619,1242,0, 0,2},{3620,1244,0,0,2},{3621,1246,0,0,2},{3622,1248,0,0,2},{3623,1250,0,0,2}, {3624,1252,0,0,2},{3625,1254,0,0,2},{3626,1256,0,0,2},{3627,1258,0,0,2},{3628, 1260,0,0,2},{3629,1262,0,0,2},{3630,1264,0,0,2},{3585,1266,0,0,2},{3586,1268,0, 0,2},{3587,1270,0,0,2},{3588,1272,0,0,2},{3589,1274,0,0,2},{3590,1276,0,0,2}, {3591,1278,0,0,2},{3592,1280,0,0,2},{3593,1282,0,0,2},{3594,1284,0,0,2},{3595, 1286,0,0,2},{3596,1288,0,0,2},{3597,1290,0,0,2},{3598,1292,0,0,2},{3599,1294,0, 0,2},{3600,1296,0,0,2},{3601,1298,0,0,2},{3602,1300,0,0,2},{3603,1302,0,0,2}, {3604,1304,0,0,2},{3605,1306,0,0,2},{3606,1308,0,0,2},{3607,1310,0,0,2},{3608, 1312,0,0,2},{3609,1314,0,0,2},{3610,1316,0,0,2},{3611,1318,0,0,2},{3612,1320,0, 0,2},{3613,1322,0,0,2},{3614,1324,0,0,2},{3615,1326,0,0,2},{3616,1328,0,0,2}, {3617,1330,0,0,2},{3618,1332,0,0,2},{3619,1334,0,0,2},{3620,1336,0,0,2},{3621, 1338,0,0,2},{3622,1340,0,0,2},{3623,1342,0,0,2},{3624,1344,0,0,2},{3625,1346,0, 0,2},{3626,1348,0,0,2},{3627,1350,0,0,2},{3628,1352,0,0,2},{3629,1354,0,0,2}, {3630,1356,0,0,2},{3585,1358,0,0,2},{3586,1360,0,0,2},{3587,1362,0,0,2},{3588, 1364,0,0,2},{3589,1366,0,0,2},{3590,1368,0,0,2},{3591,1370,0,0,2},{3592,1372,0, 0,2},{3593,1374,0,0,2},{3594,1376,0,0,2},{3595,1378,0,0,2},{3596,1380,0,0,2}, {3597,1382,0,0,2},{3598,1384,0,0,2},{3599,1386,0,0,2},{3600,1388,0,0,2},{3601, 1390,0,0,2},{3602,1392,0,0,2},{3603,1394,0,0,2},{3604,1396,0,0,2},{3605,1398,0, 0,2},{3606,1400,0,0,2},{3607,1402,0,0,2},{3608,1404,0,0,2},{3609,1406,0,0,2}, {3610,1408,0,0,2},{3611,1410,0,0,2},{3612,1412,0,0,2},{3613,1414,0,0,2},{3614, 1416,0,0,2},{3615,1418,0,0,2},{3616,1420,0,0,2},{3617,1422,0,0,2},{3618,1424,0, 0,2},{3619,1426,0,0,2},{3620,1428,0,0,2},{3621,1430,0,0,2},{3622,1432,0,0,2}, {3623,1434,0,0,2},{3624,1436,0,0,2},{3625,1438,0,0,2},{3626,1440,0,0,2},{3627, 1442,0,0,2},{3628,1444,0,0,2},{3629,1446,0,0,2},{3630,1448,0,0,2},{3634,1450,0, 0,1},{3713,1451,0,0,2},{3714,1453,0,0,2},{3716,1455,0,0,2},{3719,1457,0,0,2}, {3720,1459,0,0,2},{3722,1461,0,0,2},{3725,1463,0,0,2},{3732,1465,0,0,2},{3733, 1467,0,0,2},{3734,1469,0,0,2},{3735,1471,0,0,2},{3737,1473,0,0,2},{3738,1475,0, 0,2},{3739,1477,0,0,2},{3740,1479,0,0,2},{3741,1481,0,0,2},{3742,1483,0,0,2}, {3743,1485,0,0,2},{3745,1487,0,0,2},{3746,1489,0,0,2},{3747,1491,0,0,2},{3749, 1493,0,0,2},{3751,1495,0,0,2},{3754,1497,0,0,2},{3755,1499,0,0,2},{3757,1501,0, 0,2},{3758,1503,0,0,2},{3804,1505,0,0,3},{3805,1508,0,0,3},{3806,1511,0,0,2}, {3807,1513,0,0,2},{3713,1515,0,0,2},{3714,1517,0,0,2},{3716,1519,0,0,2},{3719, 1521,0,0,2},{3720,1523,0,0,2},{3722,1525,0,0,2},{3725,1527,0,0,2},{3732,1529,0, 0,2},{3733,1531,0,0,2},{3734,1533,0,0,2},{3735,1535,0,0,2},{3737,1537,0,0,2}, {3738,1539,0,0,2},{3739,1541,0,0,2},{3740,1543,0,0,2},{3741,1545,0,0,2},{3742, 1547,0,0,2},{3743,1549,0,0,2},{3745,1551,0,0,2},{3746,1553,0,0,2},{3747,1555,0, 0,2},{3749,1557,0,0,2},{3751,1559,0,0,2},{3754,1561,0,0,2},{3755,1563,0,0,2}, {3757,1565,0,0,2},{3758,1567,0,0,2},{3804,1569,0,0,3},{3805,1572,0,0,3},{3806, 1575,0,0,2},{3807,1577,0,0,2},{3713,1579,0,0,2},{3714,1581,0,0,2},{3716,1583,0, 0,2},{3719,1585,0,0,2},{3720,1587,0,0,2},{3722,1589,0,0,2},{3725,1591,0,0,2}, {3732,1593,0,0,2},{3733,1595,0,0,2},{3734,1597,0,0,2},{3735,1599,0,0,2},{3737, 1601,0,0,2},{3738,1603,0,0,2},{3739,1605,0,0,2},{3740,1607,0,0,2},{3741,1609,0, 0,2},{3742,1611,0,0,2},{3743,1613,0,0,2},{3745,1615,0,0,2},{3746,1617,0,0,2}, {3747,1619,0,0,2},{3749,1621,0,0,2},{3751,1623,0,0,2},{3754,1625,0,0,2},{3755, 1627,0,0,2},{3757,1629,0,0,2},{3758,1631,0,0,2},{3804,1633,0,0,3},{3805,1636,0, 0,3},{3806,1639,0,0,2},{3807,1641,0,0,2},{3713,1643,0,0,2},{3714,1645,0,0,2}, {3716,1647,0,0,2},{3719,1649,0,0,2},{3720,1651,0,0,2},{3722,1653,0,0,2},{3725, 1655,0,0,2},{3732,1657,0,0,2},{3733,1659,0,0,2},{3734,1661,0,0,2},{3735,1663,0, 0,2},{3737,1665,0,0,2},{3738,1667,0,0,2},{3739,1669,0,0,2},{3740,1671,0,0,2}, {3741,1673,0,0,2},{3742,1675,0,0,2},{3743,1677,0,0,2},{3745,1679,0,0,2},{3746, 1681,0,0,2},{3747,1683,0,0,2},{3749,1685,0,0,2},{3751,1687,0,0,2},{3754,1689,0, 0,2},{3755,1691,0,0,2},{3757,1693,0,0,2},{3758,1695,0,0,2},{3804,1697,0,0,3}, {3805,1700,0,0,3},{3806,1703,0,0,2},{3807,1705,0,0,2},{3713,1707,0,0,2},{3714, 1709,0,0,2},{3716,1711,0,0,2},{3719,1713,0,0,2},{3720,1715,0,0,2},{3722,1717,0, 0,2},{3725,1719,0,0,2},{3732,1721,0,0,2},{3733,1723,0,0,2},{3734,1725,0,0,2}, {3735,1727,0,0,2},{3737,1729,0,0,2},{3738,1731,0,0,2},{3739,1733,0,0,2},{3740, 1735,0,0,2},{3741,1737,0,0,2},{3742,1739,0,0,2},{3743,1741,0,0,2},{3745,1743,0, 0,2},{3746,1745,0,0,2},{3747,1747,0,0,2},{3749,1749,0,0,2},{3751,1751,0,0,2}, {3754,1753,0,0,2},{3755,1755,0,0,2},{3757,1757,0,0,2},{3758,1759,0,0,2},{3804, 1761,0,0,3},{3805,1764,0,0,3},{3806,1767,0,0,2},{3807,1769,0,0,2},{3762,1771,0, 0,1},{4021,1779,0,0,2},{4023,1781,0,0,2},{4023,1783,0,0,2},{4023,1785,0,0,2}, {4023,1787,0,0,2},{4023,1789,0,0,2},{3954,1793,0,0,1},{3956,1794,0,0,1},{3968, 1795,0,0,1},{4021,1796,0,0,2},{4023,1798,0,0,2},{4023,1800,0,0,2},{4023,1802,0, 0,2},{4023,1804,0,0,2},{4023,1806,0,0,2},{3953,0,4262,1,0},{3968,1808,0,0,1}, {3968,1809,0,0,1},{3953,0,4265,1,0},{3968,1810,0,0,1},{3968,1811,0,0,1},{6528, 1907,0,0,2},{6529,1909,0,0,2},{6530,1911,0,0,2},{6531,1913,0,0,2},{6532,1915,0, 0,2},{6533,1917,0,0,2},{6534,1919,0,0,2},{6535,1921,0,0,2},{6536,1923,0,0,2}, {6537,1925,0,0,2},{6538,1927,0,0,2},{6539,1929,0,0,2},{6540,1931,0,0,2},{6541, 1933,0,0,2},{6542,1935,0,0,2},{6543,1937,0,0,2},{6544,1939,0,0,2},{6545,1941,0, 0,2},{6546,1943,0,0,2},{6547,1945,0,0,2},{6548,1947,0,0,2},{6549,1949,0,0,2}, {6550,1951,0,0,2},{6551,1953,0,0,2},{6552,1955,0,0,2},{6553,1957,0,0,2},{6554, 1959,0,0,2},{6555,1961,0,0,2},{6556,1963,0,0,2},{6557,1965,0,0,2},{6558,1967,0, 0,2},{6559,1969,0,0,2},{6560,1971,0,0,2},{6561,1973,0,0,2},{6562,1975,0,0,2}, {6563,1977,0,0,2},{6564,1979,0,0,2},{6565,1981,0,0,2},{6566,1983,0,0,2},{6567, 1985,0,0,2},{6568,1987,0,0,2},{6569,1989,0,0,2},{6570,1991,0,0,2},{6571,1993,0, 0,2},{6528,1995,0,0,2},{6529,1997,0,0,2},{6530,1999,0,0,2},{6531,2001,0,0,2}, {6532,2003,0,0,2},{6533,2005,0,0,2},{6534,2007,0,0,2},{6535,2009,0,0,2},{6536, 2011,0,0,2},{6537,2013,0,0,2},{6538,2015,0,0,2},{6539,2017,0,0,2},{6540,2019,0, 0,2},{6541,2021,0,0,2},{6542,2023,0,0,2},{6543,2025,0,0,2},{6544,2027,0,0,2}, {6545,2029,0,0,2},{6546,2031,0,0,2},{6547,2033,0,0,2},{6548,2035,0,0,2},{6549, 2037,0,0,2},{6550,2039,0,0,2},{6551,2041,0,0,2},{6552,2043,0,0,2},{6553,2045,0, 0,2},{6554,2047,0,0,2},{6555,2049,0,0,2},{6556,2051,0,0,2},{6557,2053,0,0,2}, {6558,2055,0,0,2},{6559,2057,0,0,2},{6560,2059,0,0,2},{6561,2061,0,0,2},{6562, 2063,0,0,2},{6563,2065,0,0,2},{6564,2067,0,0,2},{6565,2069,0,0,2},{6566,2071,0, 0,2},{6567,2073,0,0,2},{6568,2075,0,0,2},{6569,2077,0,0,2},{6570,2079,0,0,2}, {6571,2081,0,0,2},{6528,2083,0,0,2},{6529,2085,0,0,2},{6530,2087,0,0,2},{6531, 2089,0,0,2},{6532,2091,0,0,2},{6533,2093,0,0,2},{6534,2095,0,0,2},{6535,2097,0, 0,2},{6536,2099,0,0,2},{6537,2101,0,0,2},{6538,2103,0,0,2},{6539,2105,0,0,2}, {6540,2107,0,0,2},{6541,2109,0,0,2},{6542,2111,0,0,2},{6543,2113,0,0,2},{6544, 2115,0,0,2},{6545,2117,0,0,2},{6546,2119,0,0,2},{6547,2121,0,0,2},{6548,2123,0, 0,2},{6549,2125,0,0,2},{6550,2127,0,0,2},{6551,2129,0,0,2},{6552,2131,0,0,2}, {6553,2133,0,0,2},{6554,2135,0,0,2},{6555,2137,0,0,2},{6556,2139,0,0,2},{6557, 2141,0,0,2},{6558,2143,0,0,2},{6559,2145,0,0,2},{6560,2147,0,0,2},{6561,2149,0, 0,2},{6562,2151,0,0,2},{6563,2153,0,0,2},{6564,2155,0,0,2},{6565,2157,0,0,2}, {6566,2159,0,0,2},{6567,2161,0,0,2},{6568,2163,0,0,2},{6569,2165,0,0,2},{6570, 2167,0,0,2},{6571,2169,0,0,2},{6528,2171,0,0,2},{6529,2173,0,0,2},{6530,2175,0, 0,2},{6531,2177,0,0,2},{6532,2179,0,0,2},{6533,2181,0,0,2},{6534,2183,0,0,2}, {6535,2185,0,0,2},{6536,2187,0,0,2},{6537,2189,0,0,2},{6538,2191,0,0,2},{6539, 2193,0,0,2},{6540,2195,0,0,2},{6541,2197,0,0,2},{6542,2199,0,0,2},{6543,2201,0, 0,2},{6544,2203,0,0,2},{6545,2205,0,0,2},{6546,2207,0,0,2},{6547,2209,0,0,2}, {6548,2211,0,0,2},{6549,2213,0,0,2},{6550,2215,0,0,2},{6551,2217,0,0,2},{6552, 2219,0,0,2},{6553,2221,0,0,2},{6554,2223,0,0,2},{6555,2225,0,0,2},{6556,2227,0, 0,2},{6557,2229,0,0,2},{6558,2231,0,0,2},{6559,2233,0,0,2},{6560,2235,0,0,2}, {6561,2237,0,0,2},{6562,2239,0,0,2},{6563,2241,0,0,2},{6564,2243,0,0,2},{6565, 2245,0,0,2},{6566,2247,0,0,2},{6567,2249,0,0,2},{6568,2251,0,0,2},{6569,2253,0, 0,2},{6570,2255,0,0,2},{6571,2257,0,0,2},{824,4003,0,0,2},{43648,7984,0,0,2}, {43649,7986,0,0,2},{43650,7988,0,0,2},{43651,7990,0,0,2},{43652,7992,0,0,2}, {43653,7994,0,0,2},{43654,7996,0,0,2},{43655,7998,0,0,2},{43656,8000,0,0,2}, {43657,8002,0,0,2},{43658,8004,0,0,2},{43659,8006,0,0,2},{43660,8008,0,0,2}, {43661,8010,0,0,2},{43662,8012,0,0,2},{43663,8014,0,0,2},{43664,8016,0,0,2}, {43665,8018,0,0,2},{43666,8020,0,0,2},{43667,8022,0,0,2},{43668,8024,0,0,2}, {43669,8026,0,0,2},{43670,8028,0,0,2},{43671,8030,0,0,2},{43672,8032,0,0,2}, {43673,8034,0,0,2},{43674,8036,0,0,2},{43675,8038,0,0,2},{43676,8040,0,0,2}, {43677,8042,0,0,2},{43678,8044,0,0,2},{43679,8046,0,0,2},{43680,8048,0,0,2}, {43681,8050,0,0,2},{43682,8052,0,0,2},{43683,8054,0,0,2},{43684,8056,0,0,2}, {43685,8058,0,0,2},{43686,8060,0,0,2},{43687,8062,0,0,2},{43688,8064,0,0,2}, {43689,8066,0,0,2},{43690,8068,0,0,2},{43691,8070,0,0,2},{43692,8072,0,0,2}, {43693,8074,0,0,2},{43694,8076,0,0,2},{43695,8078,0,0,2},{43648,8080,0,0,2}, {43649,8082,0,0,2},{43650,8084,0,0,2},{43651,8086,0,0,2},{43652,8088,0,0,2}, {43653,8090,0,0,2},{43654,8092,0,0,2},{43655,8094,0,0,2},{43656,8096,0,0,2}, {43657,8098,0,0,2},{43658,8100,0,0,2},{43659,8102,0,0,2},{43660,8104,0,0,2}, {43661,8106,0,0,2},{43662,8108,0,0,2},{43663,8110,0,0,2},{43664,8112,0,0,2}, {43665,8114,0,0,2},{43666,8116,0,0,2},{43667,8118,0,0,2},{43668,8120,0,0,2}, {43669,8122,0,0,2},{43670,8124,0,0,2},{43671,8126,0,0,2},{43672,8128,0,0,2}, {43673,8130,0,0,2},{43674,8132,0,0,2},{43675,8134,0,0,2},{43676,8136,0,0,2}, {43677,8138,0,0,2},{43678,8140,0,0,2},{43679,8142,0,0,2},{43680,8144,0,0,2}, {43681,8146,0,0,2},{43682,8148,0,0,2},{43683,8150,0,0,2},{43684,8152,0,0,2}, {43685,8154,0,0,2},{43686,8156,0,0,2},{43687,8158,0,0,2},{43688,8160,0,0,2}, {43689,8162,0,0,2},{43690,8164,0,0,2},{43691,8166,0,0,2},{43692,8168,0,0,2}, {43693,8170,0,0,2},{43694,8172,0,0,2},{43695,8174,0,0,2},{43648,8176,0,0,2}, {43649,8178,0,0,2},{43650,8180,0,0,2},{43651,8182,0,0,2},{43652,8184,0,0,2}, {43653,8186,0,0,2},{43654,8188,0,0,2},{43655,8190,0,0,2},{43656,8192,0,0,2}, {43657,8194,0,0,2},{43658,8196,0,0,2},{43659,8198,0,0,2},{43660,8200,0,0,2}, {43661,8202,0,0,2},{43662,8204,0,0,2},{43663,8206,0,0,2},{43664,8208,0,0,2}, {43665,8210,0,0,2},{43666,8212,0,0,2},{43667,8214,0,0,2},{43668,8216,0,0,2}, {43669,8218,0,0,2},{43670,8220,0,0,2},{43671,8222,0,0,2},{43672,8224,0,0,2}, {43673,8226,0,0,2},{43674,8228,0,0,2},{43675,8230,0,0,2},{43676,8232,0,0,2}, {43677,8234,0,0,2},{43678,8236,0,0,2},{43679,8238,0,0,2},{43680,8240,0,0,2}, {43681,8242,0,0,2},{43682,8244,0,0,2},{43683,8246,0,0,2},{43684,8248,0,0,2}, {43685,8250,0,0,2},{43686,8252,0,0,2},{43687,8254,0,0,2},{43688,8256,0,0,2}, {43689,8258,0,0,2},{43690,8260,0,0,2},{43691,8262,0,0,2},{43692,8264,0,0,2}, {43693,8266,0,0,2},{43694,8268,0,0,2},{43695,8270,0,0,2},{43648,8272,0,0,2}, {43649,8274,0,0,2},{43650,8276,0,0,2},{43651,8278,0,0,2},{43652,8280,0,0,2}, {43653,8282,0,0,2},{43654,8284,0,0,2},{43655,8286,0,0,2},{43656,8288,0,0,2}, {43657,8290,0,0,2},{43658,8292,0,0,2},{43659,8294,0,0,2},{43660,8296,0,0,2}, {43661,8298,0,0,2},{43662,8300,0,0,2},{43663,8302,0,0,2},{43664,8304,0,0,2}, {43665,8306,0,0,2},{43666,8308,0,0,2},{43667,8310,0,0,2},{43668,8312,0,0,2}, {43669,8314,0,0,2},{43670,8316,0,0,2},{43671,8318,0,0,2},{43672,8320,0,0,2}, {43673,8322,0,0,2},{43674,8324,0,0,2},{43675,8326,0,0,2},{43676,8328,0,0,2}, {43677,8330,0,0,2},{43678,8332,0,0,2},{43679,8334,0,0,2},{43680,8336,0,0,2}, {43681,8338,0,0,2},{43682,8340,0,0,2},{43683,8342,0,0,2},{43684,8344,0,0,2}, {43685,8346,0,0,2},{43686,8348,0,0,2},{43687,8350,0,0,2},{43688,8352,0,0,2}, {43689,8354,0,0,2},{43690,8356,0,0,2},{43691,8358,0,0,2},{43692,8360,0,0,2}, {43693,8362,0,0,2},{43694,8364,0,0,2},{43695,8366,0,0,2},{43648,8368,0,0,2}, {43649,8370,0,0,2},{43650,8372,0,0,2},{43651,8374,0,0,2},{43652,8376,0,0,2}, {43653,8378,0,0,2},{43654,8380,0,0,2},{43655,8382,0,0,2},{43656,8384,0,0,2}, {43657,8386,0,0,2},{43658,8388,0,0,2},{43659,8390,0,0,2},{43660,8392,0,0,2}, {43661,8394,0,0,2},{43662,8396,0,0,2},{43663,8398,0,0,2},{43664,8400,0,0,2}, {43665,8402,0,0,2},{43666,8404,0,0,2},{43667,8406,0,0,2},{43668,8408,0,0,2}, {43669,8410,0,0,2},{43670,8412,0,0,2},{43671,8414,0,0,2},{43672,8416,0,0,2}, {43673,8418,0,0,2},{43674,8420,0,0,2},{43675,8422,0,0,2},{43676,8424,0,0,2}, {43677,8426,0,0,2},{43678,8428,0,0,2},{43679,8430,0,0,2},{43680,8432,0,0,2}, {43681,8434,0,0,2},{43682,8436,0,0,2},{43683,8438,0,0,2},{43684,8440,0,0,2}, {43685,8442,0,0,2},{43686,8444,0,0,2},{43687,8446,0,0,2},{43688,8448,0,0,2}, {43689,8450,0,0,2},{43690,8452,0,0,2},{43691,8454,0,0,2},{43692,8456,0,0,2}, {43693,8458,0,0,2},{43694,8460,0,0,2},{43695,8462,0,0,2},{119141,9825,0,0,2}, {119141,9827,4686,5,2},{119150,9829,0,0,3},{119151,9832,0,0,3},{119152,9835,0,0, 3},{119153,9838,0,0,3},{119154,9841,0,0,3},{119141,9844,4692,2,2},{119150,9846, 0,0,3},{119151,9849,0,0,3},{119141,9852,4695,2,2},{119150,9854,0,0,3},{119151, 9857,0,0,3}}; struct collation_key special_collation_keys[10435] = { {7645,8,0,32},{0,2,0,273},{7645,2,0,32},{0,2,0,273},{7332,30,0,32},{1596,30,1, 32},{7335,30,0,32},{7332,30,0,32},{1596,30,1,32},{7333,30,0,32},{7334,30,0,32}, {1596,30,1,32},{7335,30,0,32},{7341,8,0,32},{0,2,0,37},{7341,8,0,32},{0,2,0,36}, {7341,8,0,32},{0,2,0,39},{7341,8,0,32},{0,2,0,45},{7341,8,0,32},{0,2,0,43}, {7341,8,0,32},{0,2,0,41},{7341,10,0,32},{0,4,0,273},{7440,10,0,32},{7392,8,0, 32},{0,2,0,48},{7440,8,0,32},{0,2,0,37},{7440,8,0,32},{0,2,0,36},{7440,8,0,32}, {0,2,0,39},{7440,8,0,32},{0,2,0,43},{7576,8,0,32},{0,2,0,37},{7576,8,0,32},{0,2, 0,36},{7576,8,0,32},{0,2,0,39},{7576,8,0,32},{0,2,0,43},{7413,10,0,32},{0,4,0, 273},{7711,8,0,32},{0,2,0,45},{7747,8,0,32},{0,2,0,37},{7747,8,0,32},{0,2,0,36}, {7747,8,0,32},{0,2,0,39},{7747,8,0,32},{0,2,0,45},{7747,8,0,32},{0,2,0,43}, {7747,8,0,32},{0,2,0,47},{7963,8,0,32},{0,2,0,37},{7963,8,0,32},{0,2,0,36}, {7963,8,0,32},{0,2,0,39},{7963,8,0,32},{0,2,0,43},{8049,8,0,32},{0,2,0,36}, {7895,4,0,32},{0,4,0,273},{7895,4,0,32},{7341,2,0,32},{0,2,0,37},{7341,2,0,32}, {0,2,0,36},{7341,2,0,32},{0,2,0,39},{7341,2,0,32},{0,2,0,45},{7341,2,0,32},{0,2, 0,43},{7341,2,0,32},{0,2,0,41},{7341,4,0,32},{0,4,0,273},{7440,4,0,32},{7392,2, 0,32},{0,2,0,48},{7440,2,0,32},{0,2,0,37},{7440,2,0,32},{0,2,0,36},{7440,2,0, 32},{0,2,0,39},{7440,2,0,32},{0,2,0,43},{7576,2,0,32},{0,2,0,37},{7576,2,0,32}, {0,2,0,36},{7576,2,0,32},{0,2,0,39},{7576,2,0,32},{0,2,0,43},{7413,4,0,32},{0,4, 0,273},{7711,2,0,32},{0,2,0,45},{7747,2,0,32},{0,2,0,37},{7747,2,0,32},{0,2,0, 36},{7747,2,0,32},{0,2,0,39},{7747,2,0,32},{0,2,0,45},{7747,2,0,32},{0,2,0,43}, {7747,2,0,32},{0,2,0,47},{7963,2,0,32},{0,2,0,37},{7963,2,0,32},{0,2,0,36}, {7963,2,0,32},{0,2,0,39},{7963,2,0,32},{0,2,0,43},{8049,2,0,32},{0,2,0,36}, {8049,2,0,32},{0,2,0,43},{7341,8,0,32},{0,2,0,50},{7341,2,0,32},{0,2,0,50}, {7341,8,0,32},{0,2,0,38},{7341,2,0,32},{0,2,0,38},{7341,8,0,32},{0,2,0,49}, {7341,2,0,32},{0,2,0,49},{7392,8,0,32},{0,2,0,36},{7392,2,0,32},{0,2,0,36}, {7392,8,0,32},{0,2,0,39},{7392,2,0,32},{0,2,0,39},{7392,8,0,32},{0,2,0,46}, {7392,2,0,32},{0,2,0,46},{7392,8,0,32},{0,2,0,40},{7392,2,0,32},{0,2,0,40}, {7413,8,0,32},{0,2,0,40},{7413,2,0,32},{0,2,0,40},{7413,8,0,32},{0,2,0,57}, {7413,2,0,32},{0,2,0,57},{7440,8,0,32},{0,2,0,50},{7440,2,0,32},{0,2,0,50}, {7440,8,0,32},{0,2,0,38},{7440,2,0,32},{0,2,0,38},{7440,8,0,32},{0,2,0,46}, {7440,2,0,32},{0,2,0,46},{7440,8,0,32},{0,2,0,49},{7440,2,0,32},{0,2,0,49}, {7440,8,0,32},{0,2,0,40},{7440,2,0,32},{0,2,0,40},{7514,8,0,32},{0,2,0,39}, {7514,2,0,32},{0,2,0,39},{7514,8,0,32},{0,2,0,38},{7514,2,0,32},{0,2,0,38}, {7514,8,0,32},{0,2,0,46},{7514,2,0,32},{0,2,0,46},{7514,8,0,32},{0,2,0,48}, {7514,2,0,32},{0,2,0,48},{7550,8,0,32},{0,2,0,39},{7550,2,0,32},{0,2,0,39}, {7550,8,0,32},{0,2,0,57},{7550,2,0,32},{0,2,0,57},{7576,8,0,32},{0,2,0,45}, {7576,2,0,32},{0,2,0,45},{7576,8,0,32},{0,2,0,50},{7576,2,0,32},{0,2,0,50}, {7576,8,0,32},{0,2,0,38},{7576,2,0,32},{0,2,0,38},{7576,8,0,32},{0,2,0,49}, {7576,2,0,32},{0,2,0,49},{7576,8,0,32},{0,2,0,46},{7576,10,0,32},{7602,10,0,32}, {7576,4,0,32},{7602,4,0,32},{7602,8,0,32},{0,2,0,39},{7602,2,0,32},{0,2,0,39}, {7627,8,0,32},{0,2,0,48},{7627,2,0,32},{0,2,0,48},{7645,8,0,32},{0,2,0,36}, {7645,2,0,32},{0,2,0,36},{7645,8,0,32},{0,2,0,48},{7645,2,0,32},{0,2,0,48}, {7645,8,0,32},{0,2,0,40},{7645,2,0,32},{0,2,0,40},{7645,8,0,32},{0,2,0,273}, {7645,2,0,32},{0,2,0,273},{7645,8,0,32},{0,2,0,57},{7645,2,0,32},{0,2,0,57}, {7711,8,0,32},{0,2,0,36},{7711,2,0,32},{0,2,0,36},{7711,8,0,32},{0,2,0,48}, {7711,2,0,32},{0,2,0,48},{7711,8,0,32},{0,2,0,40},{7711,2,0,32},{0,2,0,40}, {8164,4,0,32},{7711,4,0,32},{7747,8,0,32},{0,2,0,50},{7747,2,0,32},{0,2,0,50}, {7747,8,0,32},{0,2,0,38},{7747,2,0,32},{0,2,0,38},{7747,8,0,32},{0,2,0,44}, {7747,2,0,32},{0,2,0,44},{7747,10,0,32},{0,4,0,273},{7440,10,0,32},{7747,4,0, 32},{0,4,0,273},{7440,4,0,32},{7833,8,0,32},{0,2,0,36},{7833,2,0,32},{0,2,0,36}, {7833,8,0,32},{0,2,0,48},{7833,2,0,32},{0,2,0,48},{7833,8,0,32},{0,2,0,40}, {7833,2,0,32},{0,2,0,40},{7895,8,0,32},{0,2,0,36},{7895,2,0,32},{0,2,0,36}, {7895,8,0,32},{0,2,0,39},{7895,2,0,32},{0,2,0,39},{7895,8,0,32},{0,2,0,48}, {7895,2,0,32},{0,2,0,48},{7895,8,0,32},{0,2,0,40},{7895,2,0,32},{0,2,0,40}, {7931,8,0,32},{0,2,0,48},{7931,2,0,32},{0,2,0,48},{7931,8,0,32},{0,2,0,40}, {7931,2,0,32},{0,2,0,40},{7963,8,0,32},{0,2,0,45},{7963,2,0,32},{0,2,0,45}, {7963,8,0,32},{0,2,0,50},{7963,2,0,32},{0,2,0,50},{7963,8,0,32},{0,2,0,38}, {7963,2,0,32},{0,2,0,38},{7963,8,0,32},{0,2,0,41},{7963,2,0,32},{0,2,0,41}, {7963,8,0,32},{0,2,0,44},{7963,2,0,32},{0,2,0,44},{7963,8,0,32},{0,2,0,49}, {7963,2,0,32},{0,2,0,49},{8027,8,0,32},{0,2,0,39},{8027,2,0,32},{0,2,0,39}, {8049,8,0,32},{0,2,0,39},{8049,2,0,32},{0,2,0,39},{8049,8,0,32},{0,2,0,43}, {8071,8,0,32},{0,2,0,36},{8071,2,0,32},{0,2,0,36},{8071,8,0,32},{0,2,0,46}, {8071,2,0,32},{0,2,0,46},{8071,8,0,32},{0,2,0,40},{8071,2,0,32},{0,2,0,40}, {7895,4,0,32},{0,4,0,274},{8071,4,0,32},{8027,4,0,32},{7747,8,0,32},{0,2,0,63}, {7747,2,0,32},{0,2,0,63},{7963,8,0,32},{0,2,0,63},{7963,2,0,32},{0,2,0,63}, {7931,4,0,32},{7895,4,0,32},{7413,10,0,32},{8071,10,0,32},{0,4,0,40},{7413,10,0, 32},{8071,4,0,32},{0,4,0,40},{7413,4,0,32},{8071,4,0,32},{0,4,0,40},{7645,10,0, 32},{7602,10,0,32},{7645,10,0,32},{7602,4,0,32},{7645,4,0,32},{7602,4,0,32}, {7711,10,0,32},{7602,10,0,32},{7711,10,0,32},{7602,4,0,32},{7711,4,0,32},{7602, 4,0,32},{7341,8,0,32},{0,2,0,40},{7341,2,0,32},{0,2,0,40},{7576,8,0,32},{0,2,0, 40},{7576,2,0,32},{0,2,0,40},{7747,8,0,32},{0,2,0,40},{7747,2,0,32},{0,2,0,40}, {7963,8,0,32},{0,2,0,40},{7963,2,0,32},{0,2,0,40},{7963,8,0,32},{0,2,0,43},{0,2, 0,50},{7963,2,0,32},{0,2,0,43},{0,2,0,50},{7963,8,0,32},{0,2,0,43},{0,2,0,36}, {7963,2,0,32},{0,2,0,43},{0,2,0,36},{7963,8,0,32},{0,2,0,43},{0,2,0,40},{7963,2, 0,32},{0,2,0,43},{0,2,0,40},{7963,8,0,32},{0,2,0,43},{0,2,0,37},{7963,2,0,32}, {0,2,0,43},{0,2,0,37},{7341,8,0,32},{0,2,0,43},{0,2,0,50},{7341,2,0,32},{0,2,0, 43},{0,2,0,50},{7341,8,0,32},{0,2,0,46},{0,2,0,50},{7341,2,0,32},{0,2,0,46},{0, 2,0,50},{7341,10,0,32},{0,4,0,273},{7440,10,0,32},{0,2,0,50},{7341,4,0,32},{0,4, 0,273},{7440,4,0,32},{0,2,0,50},{7514,8,0,32},{0,2,0,40},{7514,2,0,32},{0,2,0, 40},{7627,8,0,32},{0,2,0,40},{7627,2,0,32},{0,2,0,40},{7747,8,0,32},{0,2,0,49}, {7747,2,0,32},{0,2,0,49},{7747,8,0,32},{0,2,0,49},{0,2,0,50},{7747,2,0,32},{0,2, 0,49},{0,2,0,50},{8100,8,0,32},{0,2,0,40},{8100,2,0,32},{0,2,0,40},{7602,2,0, 32},{0,2,0,40},{7413,10,0,32},{8071,10,0,32},{7413,10,0,32},{8071,4,0,32},{7413, 4,0,32},{8071,4,0,32},{7514,8,0,32},{0,2,0,36},{7514,2,0,32},{0,2,0,36},{7711,8, 0,32},{0,2,0,37},{7711,2,0,32},{0,2,0,37},{7341,8,0,32},{0,2,0,41},{0,2,0,36}, {7341,2,0,32},{0,2,0,41},{0,2,0,36},{7341,10,0,32},{0,4,0,273},{7440,10,0,32}, {0,2,0,36},{7341,4,0,32},{0,4,0,273},{7440,4,0,32},{0,2,0,36},{7747,8,0,32},{0, 2,0,47},{0,2,0,36},{7747,2,0,32},{0,2,0,47},{0,2,0,36},{7341,8,0,32},{0,2,0,60}, {7341,2,0,32},{0,2,0,60},{7341,8,0,32},{0,2,0,62},{7341,2,0,32},{0,2,0,62}, {7440,8,0,32},{0,2,0,60},{7440,2,0,32},{0,2,0,60},{7440,8,0,32},{0,2,0,62}, {7440,2,0,32},{0,2,0,62},{7576,8,0,32},{0,2,0,60},{7576,2,0,32},{0,2,0,60}, {7576,8,0,32},{0,2,0,62},{7576,2,0,32},{0,2,0,62},{7747,8,0,32},{0,2,0,60}, {7747,2,0,32},{0,2,0,60},{7747,8,0,32},{0,2,0,62},{7747,2,0,32},{0,2,0,62}, {7833,8,0,32},{0,2,0,60},{7833,2,0,32},{0,2,0,60},{7833,8,0,32},{0,2,0,62}, {7833,2,0,32},{0,2,0,62},{7963,8,0,32},{0,2,0,60},{7963,2,0,32},{0,2,0,60}, {7963,8,0,32},{0,2,0,62},{7963,2,0,32},{0,2,0,62},{7895,8,0,32},{0,2,0,69}, {7895,2,0,32},{0,2,0,69},{7931,8,0,32},{0,2,0,69},{7931,2,0,32},{0,2,0,69}, {7550,8,0,32},{0,2,0,40},{7550,2,0,32},{0,2,0,40},{7341,8,0,32},{0,2,0,46}, {7341,2,0,32},{0,2,0,46},{7440,8,0,32},{0,2,0,48},{7440,2,0,32},{0,2,0,48}, {7747,8,0,32},{0,2,0,43},{0,2,0,50},{7747,2,0,32},{0,2,0,43},{0,2,0,50},{7747,8, 0,32},{0,2,0,45},{0,2,0,50},{7747,2,0,32},{0,2,0,45},{0,2,0,50},{7747,8,0,32}, {0,2,0,46},{7747,2,0,32},{0,2,0,46},{7747,8,0,32},{0,2,0,46},{0,2,0,50},{7747,2, 0,32},{0,2,0,46},{0,2,0,50},{8049,8,0,32},{0,2,0,50},{8049,2,0,32},{0,2,0,50}, {7413,4,0,32},{7366,4,0,32},{7815,4,0,32},{7794,4,0,32},{7413,4,0,32},{8071,4,0, 32},{7413,4,0,32},{8100,4,0,32},{7413,4,0,32},{8090,4,0,32},{7931,4,0,32},{7895, 4,0,32},{7931,4,0,32},{7912,4,0,32},{7931,4,0,32},{7407,4,0,32},{7499,4,0,32}, {7742,4,0,32},{7645,4,0,32},{7895,4,0,32},{7645,4,0,32},{8071,4,0,32},{0,2,0, 43},{0,2,0,36},{1183,2,1,32},{0,2,0,36},{8223,8,0,32},{0,2,0,36},{8228,8,0,32}, {0,2,0,36},{8234,8,0,32},{0,2,0,36},{8236,8,0,32},{0,2,0,36},{8244,8,0,32},{0,2, 0,36},{8258,8,0,32},{0,2,0,36},{8263,8,0,32},{0,2,0,36},{8236,2,0,32},{0,2,0, 43},{0,2,0,36},{8236,8,0,32},{0,2,0,43},{8258,8,0,32},{0,2,0,43},{8223,2,0,32}, {0,2,0,36},{8228,2,0,32},{0,2,0,36},{8234,2,0,32},{0,2,0,36},{8236,2,0,32},{0,2, 0,36},{8258,2,0,32},{0,2,0,43},{0,2,0,36},{8236,2,0,32},{0,2,0,43},{8258,2,0, 32},{0,2,0,43},{8244,2,0,32},{0,2,0,36},{8258,2,0,32},{0,2,0,36},{8263,2,0,32}, {0,2,0,36},{8238,10,0,32},{8223,4,0,32},{8236,4,0,32},{8258,10,0,32},{0,2,0,36}, {8258,10,0,32},{0,2,0,43},{8238,4,0,32},{8223,4,0,32},{8236,4,0,32},{8384,8,0, 32},{0,2,0,37},{8384,8,0,32},{0,2,0,43},{8348,8,0,32},{0,2,0,36},{8430,8,0,32}, {0,2,0,43},{8444,8,0,32},{0,2,0,36},{8422,8,0,32},{0,2,0,37},{8579,8,0,32},{0,2, 0,38},{8384,2,0,32},{0,2,0,37},{8384,2,0,32},{0,2,0,43},{8348,2,0,32},{0,2,0, 36},{8430,2,0,32},{0,2,0,43},{8444,2,0,32},{0,2,0,36},{8422,2,0,32},{0,2,0,37}, {8579,2,0,32},{0,2,0,38},{8765,8,0,32},{0,2,0,60},{8765,2,0,32},{0,2,0,60}, {8348,10,0,32},{0,4,0,274},{8348,4,0,32},{0,4,0,274},{8392,8,0,32},{0,2,0,38}, {8392,2,0,32},{0,2,0,38},{8328,8,0,32},{0,2,0,38},{8328,2,0,32},{0,2,0,38}, {8328,8,0,32},{0,2,0,43},{8328,2,0,32},{0,2,0,43},{8384,8,0,32},{0,2,0,38}, {8384,2,0,32},{0,2,0,38},{8332,8,0,32},{0,2,0,43},{8332,2,0,32},{0,2,0,43}, {8392,8,0,32},{0,2,0,43},{8392,2,0,32},{0,2,0,43},{8402,8,0,32},{0,2,0,43}, {8402,2,0,32},{0,2,0,43},{8422,8,0,32},{0,2,0,50},{8422,2,0,32},{0,2,0,50}, {8422,8,0,32},{0,2,0,43},{8422,2,0,32},{0,2,0,43},{8525,8,0,32},{0,2,0,43}, {8525,2,0,32},{0,2,0,43},{8529,8,0,32},{0,2,0,43},{8529,2,0,32},{0,2,0,43}, {8715,8,0,32},{0,2,0,43},{8715,2,0,32},{0,2,0,43},{8579,8,0,32},{0,2,0,50}, {8579,2,0,32},{0,2,0,50},{8579,8,0,32},{0,2,0,43},{8579,2,0,32},{0,2,0,43}, {8579,8,0,32},{0,2,0,44},{8579,2,0,32},{0,2,0,44},{8650,8,0,32},{0,2,0,43}, {8650,2,0,32},{0,2,0,43},{8698,8,0,32},{0,2,0,43},{8698,2,0,32},{0,2,0,43}, {8954,4,0,32},{8983,4,0,32},{8989,2,0,32},{0,2,0,89},{8989,2,0,32},{0,2,0,90}, {8989,2,0,32},{0,2,0,95},{8990,2,0,32},{0,2,0,95},{8990,2,0,32},{0,2,0,96}, {8991,2,0,32},{0,2,0,95},{8992,2,0,32},{0,2,0,95},{8993,2,0,32},{0,2,0,95}, {8994,2,0,32},{0,2,0,91},{8994,2,0,32},{0,2,0,95},{8995,2,0,32},{0,2,0,95}, {8997,2,0,32},{0,2,0,95},{8998,2,0,32},{0,2,0,86},{8998,2,0,32},{0,2,0,95}, {8999,25,0,32},{0,2,0,95},{8999,2,0,32},{0,2,0,95},{8999,2,0,32},{0,2,0,96}, {9000,2,0,32},{0,2,0,95},{9001,2,0,32},{0,2,0,95},{9002,2,0,32},{0,2,0,95}, {9003,2,0,32},{0,2,0,95},{9005,25,0,32},{0,2,0,95},{9005,2,0,32},{0,2,0,95}, {9005,2,0,32},{0,2,0,96},{9006,2,0,32},{0,2,0,95},{9007,2,0,32},{0,2,0,95}, {9008,2,0,32},{0,2,0,95},{9009,2,0,32},{0,2,0,95},{9009,2,0,32},{0,2,0,95},{0,2, 0,94},{9009,2,0,32},{0,2,0,95},{0,2,0,93},{9009,2,0,32},{0,2,0,94},{9009,2,0, 32},{0,2,0,93},{9010,2,0,32},{0,2,0,95},{8994,4,0,32},{8994,4,0,32},{8994,4,0, 32},{8998,4,0,32},{8998,4,0,32},{8998,4,0,32},{8998,4,0,32},{8998,4,0,32},{0,2, 0,89},{9073,4,0,32},{9059,4,0,32},{9245,4,0,32},{9059,4,0,32},{9249,4,0,32}, {9059,4,0,32},{9260,4,0,32},{9059,4,0,32},{9244,2,0,32},{0,2,0,131},{9241,2,0, 32},{0,2,0,131},{9274,2,0,32},{0,2,0,131},{9059,4,0,32},{0,4,0,274},{9225,4,0, 32},{0,4,0,274},{9279,4,0,32},{0,4,0,274},{9287,4,0,32},{0,4,0,274},{9297,4,0, 32},{0,4,0,274},{9278,4,0,32},{0,4,0,275},{9279,4,0,32},{0,4,0,275},{9281,4,0, 32},{0,4,0,275},{9402,4,0,32},{0,4,0,273},{9403,4,0,32},{0,4,0,273},{9405,4,0, 32},{0,4,0,273},{9959,2,0,32},{0,2,0,194},{9960,2,0,32},{0,2,0,194},{9961,2,0, 32},{0,2,0,194},{9967,2,0,32},{0,2,0,194},{9975,2,0,32},{0,2,0,194},{9977,2,0, 32},{0,2,0,194},{9983,2,0,32},{0,2,0,194},{9985,2,0,32},{0,2,0,194},{9990,2,0, 32},{0,2,0,194},{9992,2,0,32},{0,2,0,194},{9994,2,0,32},{0,2,0,194},{10059,2,0, 32},{0,2,0,194},{10060,2,0,32},{0,2,0,194},{10072,2,0,32},{0,2,0,194},{10062,4, 0,32},{10095,4,0,32},{10115,2,0,32},{0,2,0,194},{10116,2,0,32},{0,2,0,194}, {10121,2,0,32},{0,2,0,194},{10135,2,0,32},{0,2,0,194},{10142,2,0,32},{0,2,0, 194},{10111,2,0,32},{0,2,0,194},{10250,2,0,32},{0,2,0,194},{10251,2,0,32},{0,2, 0,194},{10533,4,0,32},{10561,4,0,32},{10531,4,0,32},{10561,4,0,32},{10532,4,0, 32},{10561,4,0,32},{10541,4,0,32},{10561,4,0,32},{10520,4,0,32},{10561,4,0,32}, {10525,4,0,32},{10561,4,0,32},{10533,4,0,32},{10561,4,0,32},{10534,4,0,32}, {10561,4,0,32},{10540,4,0,32},{10561,4,0,32},{10506,4,0,32},{10561,4,0,32}, {11808,2,0,32},{11866,2,0,32},{11809,2,0,32},{11866,2,0,32},{11810,2,0,32}, {11866,2,0,32},{11811,2,0,32},{11866,2,0,32},{11812,2,0,32},{11866,2,0,32}, {11813,2,0,32},{11866,2,0,32},{11814,2,0,32},{11866,2,0,32},{11815,2,0,32}, {11866,2,0,32},{11816,2,0,32},{11866,2,0,32},{11817,2,0,32},{11866,2,0,32}, {11818,2,0,32},{11866,2,0,32},{11819,2,0,32},{11866,2,0,32},{11820,2,0,32}, {11866,2,0,32},{11821,2,0,32},{11866,2,0,32},{11822,2,0,32},{11866,2,0,32}, {11823,2,0,32},{11866,2,0,32},{11824,2,0,32},{11866,2,0,32},{11825,2,0,32}, {11866,2,0,32},{11826,2,0,32},{11866,2,0,32},{11827,2,0,32},{11866,2,0,32}, {11828,2,0,32},{11866,2,0,32},{11829,2,0,32},{11866,2,0,32},{11830,2,0,32}, {11866,2,0,32},{11831,2,0,32},{11866,2,0,32},{11832,2,0,32},{11866,2,0,32}, {11833,2,0,32},{11866,2,0,32},{11834,2,0,32},{11866,2,0,32},{11835,2,0,32}, {11866,2,0,32},{11836,2,0,32},{11866,2,0,32},{11837,2,0,32},{11866,2,0,32}, {11838,2,0,32},{11866,2,0,32},{11839,2,0,32},{11866,2,0,32},{11840,2,0,32}, {11866,2,0,32},{11841,2,0,32},{11866,2,0,32},{11842,2,0,32},{11866,2,0,32}, {11843,2,0,32},{11866,2,0,32},{11844,2,0,32},{11866,2,0,32},{11845,2,0,32}, {11866,2,0,32},{11846,2,0,32},{11866,2,0,32},{11847,2,0,32},{11866,2,0,32}, {11848,2,0,32},{11866,2,0,32},{11849,2,0,32},{11866,2,0,32},{11850,2,0,32}, {11866,2,0,32},{11851,2,0,32},{11866,2,0,32},{11852,2,0,32},{11866,2,0,32}, {11853,2,0,32},{11866,2,0,32},{11808,2,0,32},{11867,2,0,32},{11809,2,0,32}, {11867,2,0,32},{11810,2,0,32},{11867,2,0,32},{11811,2,0,32},{11867,2,0,32}, {11812,2,0,32},{11867,2,0,32},{11813,2,0,32},{11867,2,0,32},{11814,2,0,32}, {11867,2,0,32},{11815,2,0,32},{11867,2,0,32},{11816,2,0,32},{11867,2,0,32}, {11817,2,0,32},{11867,2,0,32},{11818,2,0,32},{11867,2,0,32},{11819,2,0,32}, {11867,2,0,32},{11820,2,0,32},{11867,2,0,32},{11821,2,0,32},{11867,2,0,32}, {11822,2,0,32},{11867,2,0,32},{11823,2,0,32},{11867,2,0,32},{11824,2,0,32}, {11867,2,0,32},{11825,2,0,32},{11867,2,0,32},{11826,2,0,32},{11867,2,0,32}, {11827,2,0,32},{11867,2,0,32},{11828,2,0,32},{11867,2,0,32},{11829,2,0,32}, {11867,2,0,32},{11830,2,0,32},{11867,2,0,32},{11831,2,0,32},{11867,2,0,32}, {11832,2,0,32},{11867,2,0,32},{11833,2,0,32},{11867,2,0,32},{11834,2,0,32}, {11867,2,0,32},{11835,2,0,32},{11867,2,0,32},{11836,2,0,32},{11867,2,0,32}, {11837,2,0,32},{11867,2,0,32},{11838,2,0,32},{11867,2,0,32},{11839,2,0,32}, {11867,2,0,32},{11840,2,0,32},{11867,2,0,32},{11841,2,0,32},{11867,2,0,32}, {11842,2,0,32},{11867,2,0,32},{11843,2,0,32},{11867,2,0,32},{11844,2,0,32}, {11867,2,0,32},{11845,2,0,32},{11867,2,0,32},{11846,2,0,32},{11867,2,0,32}, {11847,2,0,32},{11867,2,0,32},{11848,2,0,32},{11867,2,0,32},{11849,2,0,32}, {11867,2,0,32},{11850,2,0,32},{11867,2,0,32},{11851,2,0,32},{11867,2,0,32}, {11852,2,0,32},{11867,2,0,32},{11853,2,0,32},{11867,2,0,32},{11808,2,0,32}, {11868,2,0,32},{11809,2,0,32},{11868,2,0,32},{11810,2,0,32},{11868,2,0,32}, {11811,2,0,32},{11868,2,0,32},{11812,2,0,32},{11868,2,0,32},{11813,2,0,32}, {11868,2,0,32},{11814,2,0,32},{11868,2,0,32},{11815,2,0,32},{11868,2,0,32}, {11816,2,0,32},{11868,2,0,32},{11817,2,0,32},{11868,2,0,32},{11818,2,0,32}, {11868,2,0,32},{11819,2,0,32},{11868,2,0,32},{11820,2,0,32},{11868,2,0,32}, {11821,2,0,32},{11868,2,0,32},{11822,2,0,32},{11868,2,0,32},{11823,2,0,32}, {11868,2,0,32},{11824,2,0,32},{11868,2,0,32},{11825,2,0,32},{11868,2,0,32}, {11826,2,0,32},{11868,2,0,32},{11827,2,0,32},{11868,2,0,32},{11828,2,0,32}, {11868,2,0,32},{11829,2,0,32},{11868,2,0,32},{11830,2,0,32},{11868,2,0,32}, {11831,2,0,32},{11868,2,0,32},{11832,2,0,32},{11868,2,0,32},{11833,2,0,32}, {11868,2,0,32},{11834,2,0,32},{11868,2,0,32},{11835,2,0,32},{11868,2,0,32}, {11836,2,0,32},{11868,2,0,32},{11837,2,0,32},{11868,2,0,32},{11838,2,0,32}, {11868,2,0,32},{11839,2,0,32},{11868,2,0,32},{11840,2,0,32},{11868,2,0,32}, {11841,2,0,32},{11868,2,0,32},{11842,2,0,32},{11868,2,0,32},{11843,2,0,32}, {11868,2,0,32},{11844,2,0,32},{11868,2,0,32},{11845,2,0,32},{11868,2,0,32}, {11846,2,0,32},{11868,2,0,32},{11847,2,0,32},{11868,2,0,32},{11848,2,0,32}, {11868,2,0,32},{11849,2,0,32},{11868,2,0,32},{11850,2,0,32},{11868,2,0,32}, {11851,2,0,32},{11868,2,0,32},{11852,2,0,32},{11868,2,0,32},{11853,2,0,32}, {11868,2,0,32},{11808,2,0,32},{11869,2,0,32},{11809,2,0,32},{11869,2,0,32}, {11810,2,0,32},{11869,2,0,32},{11811,2,0,32},{11869,2,0,32},{11812,2,0,32}, {11869,2,0,32},{11813,2,0,32},{11869,2,0,32},{11814,2,0,32},{11869,2,0,32}, {11815,2,0,32},{11869,2,0,32},{11816,2,0,32},{11869,2,0,32},{11817,2,0,32}, {11869,2,0,32},{11818,2,0,32},{11869,2,0,32},{11819,2,0,32},{11869,2,0,32}, {11820,2,0,32},{11869,2,0,32},{11821,2,0,32},{11869,2,0,32},{11822,2,0,32}, {11869,2,0,32},{11823,2,0,32},{11869,2,0,32},{11824,2,0,32},{11869,2,0,32}, {11825,2,0,32},{11869,2,0,32},{11826,2,0,32},{11869,2,0,32},{11827,2,0,32}, {11869,2,0,32},{11828,2,0,32},{11869,2,0,32},{11829,2,0,32},{11869,2,0,32}, {11830,2,0,32},{11869,2,0,32},{11831,2,0,32},{11869,2,0,32},{11832,2,0,32}, {11869,2,0,32},{11833,2,0,32},{11869,2,0,32},{11834,2,0,32},{11869,2,0,32}, {11835,2,0,32},{11869,2,0,32},{11836,2,0,32},{11869,2,0,32},{11837,2,0,32}, {11869,2,0,32},{11838,2,0,32},{11869,2,0,32},{11839,2,0,32},{11869,2,0,32}, {11840,2,0,32},{11869,2,0,32},{11841,2,0,32},{11869,2,0,32},{11842,2,0,32}, {11869,2,0,32},{11843,2,0,32},{11869,2,0,32},{11844,2,0,32},{11869,2,0,32}, {11845,2,0,32},{11869,2,0,32},{11846,2,0,32},{11869,2,0,32},{11847,2,0,32}, {11869,2,0,32},{11848,2,0,32},{11869,2,0,32},{11849,2,0,32},{11869,2,0,32}, {11850,2,0,32},{11869,2,0,32},{11851,2,0,32},{11869,2,0,32},{11852,2,0,32}, {11869,2,0,32},{11853,2,0,32},{11869,2,0,32},{11808,2,0,32},{11870,2,0,32}, {11809,2,0,32},{11870,2,0,32},{11810,2,0,32},{11870,2,0,32},{11811,2,0,32}, {11870,2,0,32},{11812,2,0,32},{11870,2,0,32},{11813,2,0,32},{11870,2,0,32}, {11814,2,0,32},{11870,2,0,32},{11815,2,0,32},{11870,2,0,32},{11816,2,0,32}, {11870,2,0,32},{11817,2,0,32},{11870,2,0,32},{11818,2,0,32},{11870,2,0,32}, {11819,2,0,32},{11870,2,0,32},{11820,2,0,32},{11870,2,0,32},{11821,2,0,32}, {11870,2,0,32},{11822,2,0,32},{11870,2,0,32},{11823,2,0,32},{11870,2,0,32}, {11824,2,0,32},{11870,2,0,32},{11825,2,0,32},{11870,2,0,32},{11826,2,0,32}, {11870,2,0,32},{11827,2,0,32},{11870,2,0,32},{11828,2,0,32},{11870,2,0,32}, {11829,2,0,32},{11870,2,0,32},{11830,2,0,32},{11870,2,0,32},{11831,2,0,32}, {11870,2,0,32},{11832,2,0,32},{11870,2,0,32},{11833,2,0,32},{11870,2,0,32}, {11834,2,0,32},{11870,2,0,32},{11835,2,0,32},{11870,2,0,32},{11836,2,0,32}, {11870,2,0,32},{11837,2,0,32},{11870,2,0,32},{11838,2,0,32},{11870,2,0,32}, {11839,2,0,32},{11870,2,0,32},{11840,2,0,32},{11870,2,0,32},{11841,2,0,32}, {11870,2,0,32},{11842,2,0,32},{11870,2,0,32},{11843,2,0,32},{11870,2,0,32}, {11844,2,0,32},{11870,2,0,32},{11845,2,0,32},{11870,2,0,32},{11846,2,0,32}, {11870,2,0,32},{11847,2,0,32},{11870,2,0,32},{11848,2,0,32},{11870,2,0,32}, {11849,2,0,32},{11870,2,0,32},{11850,2,0,32},{11870,2,0,32},{11851,2,0,32}, {11870,2,0,32},{11852,2,0,32},{11870,2,0,32},{11853,2,0,32},{11870,2,0,32}, {11858,2,0,32},{11873,2,0,32},{11915,2,0,32},{11874,2,0,32},{11915,2,0,32}, {11875,2,0,32},{11915,2,0,32},{11876,2,0,32},{11915,2,0,32},{11877,2,0,32}, {11915,2,0,32},{11879,2,0,32},{11915,2,0,32},{11881,2,0,32},{11915,2,0,32}, {11882,2,0,32},{11915,2,0,32},{11883,2,0,32},{11915,2,0,32},{11884,2,0,32}, {11915,2,0,32},{11885,2,0,32},{11915,2,0,32},{11886,2,0,32},{11915,2,0,32}, {11887,2,0,32},{11915,2,0,32},{11888,2,0,32},{11915,2,0,32},{11889,2,0,32}, {11915,2,0,32},{11890,2,0,32},{11915,2,0,32},{11891,2,0,32},{11915,2,0,32}, {11892,2,0,32},{11915,2,0,32},{11893,2,0,32},{11915,2,0,32},{11894,2,0,32}, {11915,2,0,32},{11895,2,0,32},{11915,2,0,32},{11896,2,0,32},{11915,2,0,32}, {11897,2,0,32},{11915,2,0,32},{11878,2,0,32},{11915,2,0,32},{11898,2,0,32}, {11915,2,0,32},{11899,2,0,32},{11915,2,0,32},{11900,2,0,32},{11915,2,0,32}, {11898,4,0,32},{11886,4,0,32},{11915,2,0,32},{11898,4,0,32},{11893,4,0,32}, {11915,2,0,32},{11872,2,0,32},{11915,2,0,32},{11880,2,0,32},{11915,2,0,32}, {11873,2,0,32},{11916,2,0,32},{11874,2,0,32},{11916,2,0,32},{11875,2,0,32}, {11916,2,0,32},{11876,2,0,32},{11916,2,0,32},{11877,2,0,32},{11916,2,0,32}, {11879,2,0,32},{11916,2,0,32},{11881,2,0,32},{11916,2,0,32},{11882,2,0,32}, {11916,2,0,32},{11883,2,0,32},{11916,2,0,32},{11884,2,0,32},{11916,2,0,32}, {11885,2,0,32},{11916,2,0,32},{11886,2,0,32},{11916,2,0,32},{11887,2,0,32}, {11916,2,0,32},{11888,2,0,32},{11916,2,0,32},{11889,2,0,32},{11916,2,0,32}, {11890,2,0,32},{11916,2,0,32},{11891,2,0,32},{11916,2,0,32},{11892,2,0,32}, {11916,2,0,32},{11893,2,0,32},{11916,2,0,32},{11894,2,0,32},{11916,2,0,32}, {11895,2,0,32},{11916,2,0,32},{11896,2,0,32},{11916,2,0,32},{11897,2,0,32}, {11916,2,0,32},{11878,2,0,32},{11916,2,0,32},{11898,2,0,32},{11916,2,0,32}, {11899,2,0,32},{11916,2,0,32},{11900,2,0,32},{11916,2,0,32},{11898,4,0,32}, {11886,4,0,32},{11916,2,0,32},{11898,4,0,32},{11893,4,0,32},{11916,2,0,32}, {11872,2,0,32},{11916,2,0,32},{11880,2,0,32},{11916,2,0,32},{11873,2,0,32}, {11917,2,0,32},{11874,2,0,32},{11917,2,0,32},{11875,2,0,32},{11917,2,0,32}, {11876,2,0,32},{11917,2,0,32},{11877,2,0,32},{11917,2,0,32},{11879,2,0,32}, {11917,2,0,32},{11881,2,0,32},{11917,2,0,32},{11882,2,0,32},{11917,2,0,32}, {11883,2,0,32},{11917,2,0,32},{11884,2,0,32},{11917,2,0,32},{11885,2,0,32}, {11917,2,0,32},{11886,2,0,32},{11917,2,0,32},{11887,2,0,32},{11917,2,0,32}, {11888,2,0,32},{11917,2,0,32},{11889,2,0,32},{11917,2,0,32},{11890,2,0,32}, {11917,2,0,32},{11891,2,0,32},{11917,2,0,32},{11892,2,0,32},{11917,2,0,32}, {11893,2,0,32},{11917,2,0,32},{11894,2,0,32},{11917,2,0,32},{11895,2,0,32}, {11917,2,0,32},{11896,2,0,32},{11917,2,0,32},{11897,2,0,32},{11917,2,0,32}, {11878,2,0,32},{11917,2,0,32},{11898,2,0,32},{11917,2,0,32},{11899,2,0,32}, {11917,2,0,32},{11900,2,0,32},{11917,2,0,32},{11898,4,0,32},{11886,4,0,32}, {11917,2,0,32},{11898,4,0,32},{11893,4,0,32},{11917,2,0,32},{11872,2,0,32}, {11917,2,0,32},{11880,2,0,32},{11917,2,0,32},{11873,2,0,32},{11918,2,0,32}, {11874,2,0,32},{11918,2,0,32},{11875,2,0,32},{11918,2,0,32},{11876,2,0,32}, {11918,2,0,32},{11877,2,0,32},{11918,2,0,32},{11879,2,0,32},{11918,2,0,32}, {11881,2,0,32},{11918,2,0,32},{11882,2,0,32},{11918,2,0,32},{11883,2,0,32}, {11918,2,0,32},{11884,2,0,32},{11918,2,0,32},{11885,2,0,32},{11918,2,0,32}, {11886,2,0,32},{11918,2,0,32},{11887,2,0,32},{11918,2,0,32},{11888,2,0,32}, {11918,2,0,32},{11889,2,0,32},{11918,2,0,32},{11890,2,0,32},{11918,2,0,32}, {11891,2,0,32},{11918,2,0,32},{11892,2,0,32},{11918,2,0,32},{11893,2,0,32}, {11918,2,0,32},{11894,2,0,32},{11918,2,0,32},{11895,2,0,32},{11918,2,0,32}, {11896,2,0,32},{11918,2,0,32},{11897,2,0,32},{11918,2,0,32},{11878,2,0,32}, {11918,2,0,32},{11898,2,0,32},{11918,2,0,32},{11899,2,0,32},{11918,2,0,32}, {11900,2,0,32},{11918,2,0,32},{11898,4,0,32},{11886,4,0,32},{11918,2,0,32}, {11898,4,0,32},{11893,4,0,32},{11918,2,0,32},{11872,2,0,32},{11918,2,0,32}, {11880,2,0,32},{11918,2,0,32},{11873,2,0,32},{11919,2,0,32},{11874,2,0,32}, {11919,2,0,32},{11875,2,0,32},{11919,2,0,32},{11876,2,0,32},{11919,2,0,32}, {11877,2,0,32},{11919,2,0,32},{11879,2,0,32},{11919,2,0,32},{11881,2,0,32}, {11919,2,0,32},{11882,2,0,32},{11919,2,0,32},{11883,2,0,32},{11919,2,0,32}, {11884,2,0,32},{11919,2,0,32},{11885,2,0,32},{11919,2,0,32},{11886,2,0,32}, {11919,2,0,32},{11887,2,0,32},{11919,2,0,32},{11888,2,0,32},{11919,2,0,32}, {11889,2,0,32},{11919,2,0,32},{11890,2,0,32},{11919,2,0,32},{11891,2,0,32}, {11919,2,0,32},{11892,2,0,32},{11919,2,0,32},{11893,2,0,32},{11919,2,0,32}, {11894,2,0,32},{11919,2,0,32},{11895,2,0,32},{11919,2,0,32},{11896,2,0,32}, {11919,2,0,32},{11897,2,0,32},{11919,2,0,32},{11878,2,0,32},{11919,2,0,32}, {11898,2,0,32},{11919,2,0,32},{11899,2,0,32},{11919,2,0,32},{11900,2,0,32}, {11919,2,0,32},{11898,4,0,32},{11886,4,0,32},{11919,2,0,32},{11898,4,0,32}, {11893,4,0,32},{11919,2,0,32},{11872,2,0,32},{11919,2,0,32},{11880,2,0,32}, {11919,2,0,32},{11905,2,0,32},{11898,4,0,32},{11886,4,0,32},{11898,4,0,32}, {11893,4,0,32},{12057,4,0,32},{12080,4,0,32},{0,4,0,196},{11987,2,0,32},{12052, 2,0,32},{11992,2,0,32},{12056,2,0,32},{12008,2,0,32},{12056,2,0,32},{12016,2,0, 32},{12056,2,0,32},{12024,2,0,32},{12056,2,0,32},{12032,2,0,32},{12056,2,0,32}, {12044,4,0,32},{0,4,0,274},{12069,2,0,32},{12073,2,0,32},{12071,2,0,32},{11988, 2,0,32},{12052,2,0,32},{11993,2,0,32},{12056,2,0,32},{12009,2,0,32},{12056,2,0, 32},{12017,2,0,32},{12056,2,0,32},{12025,2,0,32},{12056,2,0,32},{12033,2,0,32}, {12056,2,0,32},{12075,2,0,32},{12074,2,0,32},{12077,2,0,32},{12076,2,0,32}, {12035,4,0,32},{0,4,0,274},{12043,4,0,32},{0,4,0,274},{12045,4,0,32},{0,4,0, 274},{12713,4,0,32},{12770,4,0,32},{12713,4,0,32},{14317,4,0,32},{0,4,0,273}, {14318,4,0,32},{0,4,0,273},{14318,4,0,32},{0,4,0,274},{14319,4,0,32},{0,4,0, 273},{14320,4,0,32},{0,4,0,273},{14320,4,0,32},{0,4,0,274},{14320,4,0,32},{0,4, 0,275},{14320,4,0,32},{0,4,0,276},{14325,4,0,32},{0,4,0,273},{14325,4,0,32},{0, 4,0,274},{14325,4,0,32},{0,4,0,275},{14325,4,0,32},{0,4,0,276},{14329,4,0,32}, {0,4,0,273},{14329,4,0,32},{0,4,0,274},{14329,4,0,32},{0,4,0,275},{14330,4,0, 32},{0,4,0,273},{14330,4,0,32},{0,4,0,274},{14331,4,0,32},{0,4,0,273},{14333,4, 0,32},{0,4,0,273},{14334,4,0,32},{0,4,0,273},{14338,4,0,32},{0,4,0,273},{14338, 4,0,32},{0,4,0,275},{14338,4,0,32},{0,4,0,276},{14338,4,0,32},{0,4,0,277}, {14340,4,0,32},{0,4,0,273},{14340,4,0,32},{0,4,0,274},{14341,4,0,32},{0,4,0, 273},{14341,4,0,32},{0,4,0,274},{14336,4,0,32},{0,4,0,273},{14344,4,0,32},{0,4, 0,273},{14344,4,0,32},{0,4,0,274},{14345,4,0,32},{0,4,0,273},{14346,4,0,32},{0, 4,0,273},{14362,4,0,32},{0,4,0,273},{14362,4,0,32},{0,4,0,274},{14328,4,0,32}, {0,4,0,273},{14338,4,0,32},{0,4,0,274},{14334,4,0,32},{14345,4,0,32},{14344,4,0, 32},{0,4,0,273},{14344,4,0,32},{0,4,0,273},{14319,4,0,32},{14319,4,0,32},{12371, 4,0,32},{12401,4,0,32},{12374,4,0,32},{12402,4,0,32},{12950,2,0,32},{12999,2,0, 32},{12951,2,0,32},{12999,2,0,32},{12952,2,0,32},{12999,2,0,32},{12953,2,0,32}, {12999,2,0,32},{12954,2,0,32},{12999,2,0,32},{12955,2,0,32},{12999,2,0,32}, {12956,2,0,32},{12999,2,0,32},{12957,2,0,32},{12999,2,0,32},{12958,2,0,32}, {12999,2,0,32},{12959,2,0,32},{12999,2,0,32},{12960,2,0,32},{12999,2,0,32}, {12961,2,0,32},{12999,2,0,32},{12962,2,0,32},{12999,2,0,32},{12963,2,0,32}, {12999,2,0,32},{12964,2,0,32},{12999,2,0,32},{12965,2,0,32},{12999,2,0,32}, {12966,2,0,32},{12999,2,0,32},{12967,2,0,32},{12999,2,0,32},{12968,2,0,32}, {12999,2,0,32},{12969,2,0,32},{12999,2,0,32},{12970,2,0,32},{12999,2,0,32}, {12971,2,0,32},{12999,2,0,32},{12972,2,0,32},{12999,2,0,32},{12973,2,0,32}, {12999,2,0,32},{12974,2,0,32},{12999,2,0,32},{12975,2,0,32},{12999,2,0,32}, {12976,2,0,32},{12999,2,0,32},{12977,2,0,32},{12999,2,0,32},{12978,2,0,32}, {12999,2,0,32},{12979,2,0,32},{12999,2,0,32},{12980,2,0,32},{12999,2,0,32}, {12981,2,0,32},{12999,2,0,32},{12982,2,0,32},{12999,2,0,32},{12983,2,0,32}, {12999,2,0,32},{12984,2,0,32},{12999,2,0,32},{12985,2,0,32},{12999,2,0,32}, {12986,2,0,32},{12999,2,0,32},{12987,2,0,32},{12999,2,0,32},{12988,2,0,32}, {12999,2,0,32},{12989,2,0,32},{12999,2,0,32},{12990,2,0,32},{12999,2,0,32}, {12991,2,0,32},{12999,2,0,32},{12992,2,0,32},{12999,2,0,32},{12993,2,0,32}, {12999,2,0,32},{12950,2,0,32},{13000,2,0,32},{12951,2,0,32},{13000,2,0,32}, {12952,2,0,32},{13000,2,0,32},{12953,2,0,32},{13000,2,0,32},{12954,2,0,32}, {13000,2,0,32},{12955,2,0,32},{13000,2,0,32},{12956,2,0,32},{13000,2,0,32}, {12957,2,0,32},{13000,2,0,32},{12958,2,0,32},{13000,2,0,32},{12959,2,0,32}, {13000,2,0,32},{12960,2,0,32},{13000,2,0,32},{12961,2,0,32},{13000,2,0,32}, {12962,2,0,32},{13000,2,0,32},{12963,2,0,32},{13000,2,0,32},{12964,2,0,32}, {13000,2,0,32},{12965,2,0,32},{13000,2,0,32},{12966,2,0,32},{13000,2,0,32}, {12967,2,0,32},{13000,2,0,32},{12968,2,0,32},{13000,2,0,32},{12969,2,0,32}, {13000,2,0,32},{12970,2,0,32},{13000,2,0,32},{12971,2,0,32},{13000,2,0,32}, {12972,2,0,32},{13000,2,0,32},{12973,2,0,32},{13000,2,0,32},{12974,2,0,32}, {13000,2,0,32},{12975,2,0,32},{13000,2,0,32},{12976,2,0,32},{13000,2,0,32}, {12977,2,0,32},{13000,2,0,32},{12978,2,0,32},{13000,2,0,32},{12979,2,0,32}, {13000,2,0,32},{12980,2,0,32},{13000,2,0,32},{12981,2,0,32},{13000,2,0,32}, {12982,2,0,32},{13000,2,0,32},{12983,2,0,32},{13000,2,0,32},{12984,2,0,32}, {13000,2,0,32},{12985,2,0,32},{13000,2,0,32},{12986,2,0,32},{13000,2,0,32}, {12987,2,0,32},{13000,2,0,32},{12988,2,0,32},{13000,2,0,32},{12989,2,0,32}, {13000,2,0,32},{12990,2,0,32},{13000,2,0,32},{12991,2,0,32},{13000,2,0,32}, {12992,2,0,32},{13000,2,0,32},{12993,2,0,32},{13000,2,0,32},{12950,2,0,32}, {13001,2,0,32},{12951,2,0,32},{13001,2,0,32},{12952,2,0,32},{13001,2,0,32}, {12953,2,0,32},{13001,2,0,32},{12954,2,0,32},{13001,2,0,32},{12955,2,0,32}, {13001,2,0,32},{12956,2,0,32},{13001,2,0,32},{12957,2,0,32},{13001,2,0,32}, {12958,2,0,32},{13001,2,0,32},{12959,2,0,32},{13001,2,0,32},{12960,2,0,32}, {13001,2,0,32},{12961,2,0,32},{13001,2,0,32},{12962,2,0,32},{13001,2,0,32}, {12963,2,0,32},{13001,2,0,32},{12964,2,0,32},{13001,2,0,32},{12965,2,0,32}, {13001,2,0,32},{12966,2,0,32},{13001,2,0,32},{12967,2,0,32},{13001,2,0,32}, {12968,2,0,32},{13001,2,0,32},{12969,2,0,32},{13001,2,0,32},{12970,2,0,32}, {13001,2,0,32},{12971,2,0,32},{13001,2,0,32},{12972,2,0,32},{13001,2,0,32}, {12973,2,0,32},{13001,2,0,32},{12974,2,0,32},{13001,2,0,32},{12975,2,0,32}, {13001,2,0,32},{12976,2,0,32},{13001,2,0,32},{12977,2,0,32},{13001,2,0,32}, {12978,2,0,32},{13001,2,0,32},{12979,2,0,32},{13001,2,0,32},{12980,2,0,32}, {13001,2,0,32},{12981,2,0,32},{13001,2,0,32},{12982,2,0,32},{13001,2,0,32}, {12983,2,0,32},{13001,2,0,32},{12984,2,0,32},{13001,2,0,32},{12985,2,0,32}, {13001,2,0,32},{12986,2,0,32},{13001,2,0,32},{12987,2,0,32},{13001,2,0,32}, {12988,2,0,32},{13001,2,0,32},{12989,2,0,32},{13001,2,0,32},{12990,2,0,32}, {13001,2,0,32},{12991,2,0,32},{13001,2,0,32},{12992,2,0,32},{13001,2,0,32}, {12993,2,0,32},{13001,2,0,32},{12950,2,0,32},{13004,2,0,32},{12951,2,0,32}, {13004,2,0,32},{12952,2,0,32},{13004,2,0,32},{12953,2,0,32},{13004,2,0,32}, {12954,2,0,32},{13004,2,0,32},{12955,2,0,32},{13004,2,0,32},{12956,2,0,32}, {13004,2,0,32},{12957,2,0,32},{13004,2,0,32},{12958,2,0,32},{13004,2,0,32}, {12959,2,0,32},{13004,2,0,32},{12960,2,0,32},{13004,2,0,32},{12961,2,0,32}, {13004,2,0,32},{12962,2,0,32},{13004,2,0,32},{12963,2,0,32},{13004,2,0,32}, {12964,2,0,32},{13004,2,0,32},{12965,2,0,32},{13004,2,0,32},{12966,2,0,32}, {13004,2,0,32},{12967,2,0,32},{13004,2,0,32},{12968,2,0,32},{13004,2,0,32}, {12969,2,0,32},{13004,2,0,32},{12970,2,0,32},{13004,2,0,32},{12971,2,0,32}, {13004,2,0,32},{12972,2,0,32},{13004,2,0,32},{12973,2,0,32},{13004,2,0,32}, {12974,2,0,32},{13004,2,0,32},{12975,2,0,32},{13004,2,0,32},{12976,2,0,32}, {13004,2,0,32},{12977,2,0,32},{13004,2,0,32},{12978,2,0,32},{13004,2,0,32}, {12979,2,0,32},{13004,2,0,32},{12980,2,0,32},{13004,2,0,32},{12981,2,0,32}, {13004,2,0,32},{12982,2,0,32},{13004,2,0,32},{12983,2,0,32},{13004,2,0,32}, {12984,2,0,32},{13004,2,0,32},{12985,2,0,32},{13004,2,0,32},{12986,2,0,32}, {13004,2,0,32},{12987,2,0,32},{13004,2,0,32},{12988,2,0,32},{13004,2,0,32}, {12989,2,0,32},{13004,2,0,32},{12990,2,0,32},{13004,2,0,32},{12991,2,0,32}, {13004,2,0,32},{12992,2,0,32},{13004,2,0,32},{12993,2,0,32},{13004,2,0,32}, {12978,4,0,32},{13000,4,0,32},{12978,4,0,32},{13000,4,0,32},{13011,4,0,32}, {13058,4,0,32},{13096,4,0,32},{13058,4,0,32},{7341,20,0,32},{0,20,0,273},{7440, 20,0,32},{7514,4,0,32},{0,4,0,274},{7931,4,0,32},{0,4,0,273},{7550,4,0,32}, {7413,20,0,32},{0,20,0,273},{7341,4,0,32},{0,4,0,273},{7341,4,0,32},{0,4,0,273}, {7440,4,0,32},{7341,4,0,32},{7747,4,0,32},{7341,4,0,32},{8009,4,0,32},{7392,4,0, 32},{0,4,0,48},{7413,4,0,32},{0,4,0,274},{7413,4,0,32},{0,4,0,273},{7895,4,0, 32},{0,4,0,274},{7747,4,0,32},{0,4,0,52},{7963,4,0,32},{0,4,0,52},{7341,4,0,32}, {0,4,0,43},{7747,4,0,32},{0,4,0,43},{7963,4,0,32},{0,4,0,43},{7341,8,0,32},{0,2, 0,68},{7341,2,0,32},{0,2,0,68},{7366,8,0,32},{0,2,0,46},{7366,2,0,32},{0,2,0, 46},{7366,8,0,32},{0,2,0,66},{7366,2,0,32},{0,2,0,66},{7366,8,0,32},{0,2,0,73}, {7366,2,0,32},{0,2,0,73},{7392,8,0,32},{0,2,0,48},{0,2,0,36},{7392,2,0,32},{0,2, 0,48},{0,2,0,36},{7413,8,0,32},{0,2,0,46},{7413,2,0,32},{0,2,0,46},{7413,8,0, 32},{0,2,0,66},{7413,2,0,32},{0,2,0,66},{7413,8,0,32},{0,2,0,73},{7413,2,0,32}, {0,2,0,73},{7413,8,0,32},{0,2,0,48},{7413,2,0,32},{0,2,0,48},{7413,8,0,32},{0,2, 0,70},{7413,2,0,32},{0,2,0,70},{7440,8,0,32},{0,2,0,50},{0,2,0,37},{7440,2,0, 32},{0,2,0,50},{0,2,0,37},{7440,8,0,32},{0,2,0,50},{0,2,0,36},{7440,2,0,32},{0, 2,0,50},{0,2,0,36},{7440,8,0,32},{0,2,0,70},{7440,2,0,32},{0,2,0,70},{7440,8,0, 32},{0,2,0,72},{7440,2,0,32},{0,2,0,72},{7440,8,0,32},{0,2,0,48},{0,2,0,38}, {7440,2,0,32},{0,2,0,48},{0,2,0,38},{7499,8,0,32},{0,2,0,46},{7499,2,0,32},{0,2, 0,46},{7514,8,0,32},{0,2,0,50},{7514,2,0,32},{0,2,0,50},{7550,8,0,32},{0,2,0, 46},{7550,2,0,32},{0,2,0,46},{7550,8,0,32},{0,2,0,66},{7550,2,0,32},{0,2,0,66}, {7550,8,0,32},{0,2,0,43},{7550,2,0,32},{0,2,0,43},{7550,8,0,32},{0,2,0,48}, {7550,2,0,32},{0,2,0,48},{7550,8,0,32},{0,2,0,71},{7550,2,0,32},{0,2,0,71}, {7576,8,0,32},{0,2,0,72},{7576,2,0,32},{0,2,0,72},{7576,8,0,32},{0,2,0,43},{0,2, 0,36},{7576,2,0,32},{0,2,0,43},{0,2,0,36},{7627,8,0,32},{0,2,0,36},{7627,2,0, 32},{0,2,0,36},{7627,8,0,32},{0,2,0,66},{7627,2,0,32},{0,2,0,66},{7627,8,0,32}, {0,2,0,73},{7627,2,0,32},{0,2,0,73},{7645,8,0,32},{0,2,0,66},{7645,2,0,32},{0,2, 0,66},{7645,8,0,32},{0,2,0,66},{0,2,0,50},{7645,2,0,32},{0,2,0,66},{0,2,0,50}, {7645,8,0,32},{0,2,0,73},{7645,2,0,32},{0,2,0,73},{7645,8,0,32},{0,2,0,70}, {7645,2,0,32},{0,2,0,70},{7696,8,0,32},{0,2,0,36},{7696,2,0,32},{0,2,0,36}, {7696,8,0,32},{0,2,0,46},{7696,2,0,32},{0,2,0,46},{7696,8,0,32},{0,2,0,66}, {7696,2,0,32},{0,2,0,66},{7711,8,0,32},{0,2,0,46},{7711,2,0,32},{0,2,0,46}, {7711,8,0,32},{0,2,0,66},{7711,2,0,32},{0,2,0,66},{7711,8,0,32},{0,2,0,73}, {7711,2,0,32},{0,2,0,73},{7711,8,0,32},{0,2,0,70},{7711,2,0,32},{0,2,0,70}, {7747,8,0,32},{0,2,0,45},{0,2,0,36},{7747,2,0,32},{0,2,0,45},{0,2,0,36},{7747,8, 0,32},{0,2,0,45},{0,2,0,43},{7747,2,0,32},{0,2,0,45},{0,2,0,43},{7747,8,0,32}, {0,2,0,50},{0,2,0,37},{7747,2,0,32},{0,2,0,50},{0,2,0,37},{7747,8,0,32},{0,2,0, 50},{0,2,0,36},{7747,2,0,32},{0,2,0,50},{0,2,0,36},{7794,8,0,32},{0,2,0,36}, {7794,2,0,32},{0,2,0,36},{7794,8,0,32},{0,2,0,46},{7794,2,0,32},{0,2,0,46}, {7833,8,0,32},{0,2,0,46},{7833,2,0,32},{0,2,0,46},{7833,8,0,32},{0,2,0,66}, {7833,2,0,32},{0,2,0,66},{7833,8,0,32},{0,2,0,66},{0,2,0,50},{7833,2,0,32},{0,2, 0,66},{0,2,0,50},{7833,8,0,32},{0,2,0,73},{7833,2,0,32},{0,2,0,73},{7895,8,0, 32},{0,2,0,46},{7895,2,0,32},{0,2,0,46},{7895,8,0,32},{0,2,0,66},{7895,2,0,32}, {0,2,0,66},{7895,8,0,32},{0,2,0,36},{0,2,0,46},{7895,2,0,32},{0,2,0,36},{0,2,0, 46},{7895,8,0,32},{0,2,0,40},{0,2,0,46},{7895,2,0,32},{0,2,0,40},{0,2,0,46}, {7895,8,0,32},{0,2,0,66},{0,2,0,46},{7895,2,0,32},{0,2,0,66},{0,2,0,46},{7931,8, 0,32},{0,2,0,46},{7931,2,0,32},{0,2,0,46},{7931,8,0,32},{0,2,0,66},{7931,2,0, 32},{0,2,0,66},{7931,8,0,32},{0,2,0,73},{7931,2,0,32},{0,2,0,73},{7931,8,0,32}, {0,2,0,70},{7931,2,0,32},{0,2,0,70},{7963,8,0,32},{0,2,0,67},{7963,2,0,32},{0,2, 0,67},{7963,8,0,32},{0,2,0,72},{7963,2,0,32},{0,2,0,72},{7963,8,0,32},{0,2,0, 70},{7963,2,0,32},{0,2,0,70},{7963,8,0,32},{0,2,0,45},{0,2,0,36},{7963,2,0,32}, {0,2,0,45},{0,2,0,36},{7963,8,0,32},{0,2,0,50},{0,2,0,43},{7963,2,0,32},{0,2,0, 50},{0,2,0,43},{8009,8,0,32},{0,2,0,45},{8009,2,0,32},{0,2,0,45},{8009,8,0,32}, {0,2,0,66},{8009,2,0,32},{0,2,0,66},{8027,8,0,32},{0,2,0,37},{8027,2,0,32},{0,2, 0,37},{8027,8,0,32},{0,2,0,36},{8027,2,0,32},{0,2,0,36},{8027,8,0,32},{0,2,0, 43},{8027,2,0,32},{0,2,0,43},{8027,8,0,32},{0,2,0,46},{8027,2,0,32},{0,2,0,46}, {8027,8,0,32},{0,2,0,66},{8027,2,0,32},{0,2,0,66},{8037,8,0,32},{0,2,0,46}, {8037,2,0,32},{0,2,0,46},{8037,8,0,32},{0,2,0,43},{8037,2,0,32},{0,2,0,43}, {8049,8,0,32},{0,2,0,46},{8049,2,0,32},{0,2,0,46},{8071,8,0,32},{0,2,0,39}, {8071,2,0,32},{0,2,0,39},{8071,8,0,32},{0,2,0,66},{8071,2,0,32},{0,2,0,66}, {8071,8,0,32},{0,2,0,73},{8071,2,0,32},{0,2,0,73},{7550,2,0,32},{0,2,0,73}, {7931,2,0,32},{0,2,0,43},{8027,2,0,32},{0,2,0,41},{8049,2,0,32},{0,2,0,41}, {7341,4,0,32},{8166,4,0,32},{7895,4,0,32},{0,4,0,274},{0,2,0,46},{7895,10,0,32}, {0,4,0,273},{7895,10,0,32},{7341,8,0,32},{0,2,0,66},{7341,2,0,32},{0,2,0,66}, {7341,8,0,32},{0,2,0,59},{7341,2,0,32},{0,2,0,59},{7341,8,0,32},{0,2,0,39},{0,2, 0,36},{7341,2,0,32},{0,2,0,39},{0,2,0,36},{7341,8,0,32},{0,2,0,39},{0,2,0,37}, {7341,2,0,32},{0,2,0,39},{0,2,0,37},{7341,8,0,32},{0,2,0,39},{0,2,0,59},{7341,2, 0,32},{0,2,0,39},{0,2,0,59},{7341,8,0,32},{0,2,0,39},{0,2,0,45},{7341,2,0,32}, {0,2,0,39},{0,2,0,45},{7341,8,0,32},{0,2,0,66},{0,2,0,39},{7341,2,0,32},{0,2,0, 66},{0,2,0,39},{7341,8,0,32},{0,2,0,38},{0,2,0,36},{7341,2,0,32},{0,2,0,38},{0, 2,0,36},{7341,8,0,32},{0,2,0,38},{0,2,0,37},{7341,2,0,32},{0,2,0,38},{0,2,0,37}, {7341,8,0,32},{0,2,0,38},{0,2,0,59},{7341,2,0,32},{0,2,0,38},{0,2,0,59},{7341,8, 0,32},{0,2,0,38},{0,2,0,45},{7341,2,0,32},{0,2,0,38},{0,2,0,45},{7341,8,0,32}, {0,2,0,66},{0,2,0,38},{7341,2,0,32},{0,2,0,66},{0,2,0,38},{7440,8,0,32},{0,2,0, 66},{7440,2,0,32},{0,2,0,66},{7440,8,0,32},{0,2,0,59},{7440,2,0,32},{0,2,0,59}, {7440,8,0,32},{0,2,0,45},{7440,2,0,32},{0,2,0,45},{7440,8,0,32},{0,2,0,39},{0,2, 0,36},{7440,2,0,32},{0,2,0,39},{0,2,0,36},{7440,8,0,32},{0,2,0,39},{0,2,0,37}, {7440,2,0,32},{0,2,0,39},{0,2,0,37},{7440,8,0,32},{0,2,0,39},{0,2,0,59},{7440,2, 0,32},{0,2,0,39},{0,2,0,59},{7440,8,0,32},{0,2,0,39},{0,2,0,45},{7440,2,0,32}, {0,2,0,39},{0,2,0,45},{7440,8,0,32},{0,2,0,66},{0,2,0,39},{7440,2,0,32},{0,2,0, 66},{0,2,0,39},{7576,8,0,32},{0,2,0,59},{7576,2,0,32},{0,2,0,59},{7576,8,0,32}, {0,2,0,66},{7576,2,0,32},{0,2,0,66},{7747,8,0,32},{0,2,0,66},{7747,2,0,32},{0,2, 0,66},{7747,8,0,32},{0,2,0,59},{7747,2,0,32},{0,2,0,59},{7747,8,0,32},{0,2,0, 39},{0,2,0,36},{7747,2,0,32},{0,2,0,39},{0,2,0,36},{7747,8,0,32},{0,2,0,39},{0, 2,0,37},{7747,2,0,32},{0,2,0,39},{0,2,0,37},{7747,8,0,32},{0,2,0,39},{0,2,0,59}, {7747,2,0,32},{0,2,0,39},{0,2,0,59},{7747,8,0,32},{0,2,0,39},{0,2,0,45},{7747,2, 0,32},{0,2,0,39},{0,2,0,45},{7747,8,0,32},{0,2,0,66},{0,2,0,39},{7747,2,0,32}, {0,2,0,66},{0,2,0,39},{7747,8,0,32},{0,2,0,63},{0,2,0,36},{7747,2,0,32},{0,2,0, 63},{0,2,0,36},{7747,8,0,32},{0,2,0,63},{0,2,0,37},{7747,2,0,32},{0,2,0,63},{0, 2,0,37},{7747,8,0,32},{0,2,0,63},{0,2,0,59},{7747,2,0,32},{0,2,0,63},{0,2,0,59}, {7747,8,0,32},{0,2,0,63},{0,2,0,45},{7747,2,0,32},{0,2,0,63},{0,2,0,45},{7747,8, 0,32},{0,2,0,63},{0,2,0,66},{7747,2,0,32},{0,2,0,63},{0,2,0,66},{7963,8,0,32}, {0,2,0,66},{7963,2,0,32},{0,2,0,66},{7963,8,0,32},{0,2,0,59},{7963,2,0,32},{0,2, 0,59},{7963,8,0,32},{0,2,0,63},{0,2,0,36},{7963,2,0,32},{0,2,0,63},{0,2,0,36}, {7963,8,0,32},{0,2,0,63},{0,2,0,37},{7963,2,0,32},{0,2,0,63},{0,2,0,37},{7963,8, 0,32},{0,2,0,63},{0,2,0,59},{7963,2,0,32},{0,2,0,63},{0,2,0,59},{7963,8,0,32}, {0,2,0,63},{0,2,0,45},{7963,2,0,32},{0,2,0,63},{0,2,0,45},{7963,8,0,32},{0,2,0, 63},{0,2,0,66},{7963,2,0,32},{0,2,0,63},{0,2,0,66},{8049,8,0,32},{0,2,0,37}, {8049,2,0,32},{0,2,0,37},{8049,8,0,32},{0,2,0,66},{8049,2,0,32},{0,2,0,66}, {8049,8,0,32},{0,2,0,59},{8049,2,0,32},{0,2,0,59},{8049,8,0,32},{0,2,0,45}, {8049,2,0,32},{0,2,0,45},{7645,10,0,32},{7645,10,0,32},{7645,4,0,32},{7645,4,0, 32},{8223,2,0,32},{0,2,0,34},{8223,2,0,32},{0,2,0,35},{8223,2,0,32},{0,2,0,34}, {0,2,0,37},{8223,2,0,32},{0,2,0,35},{0,2,0,37},{8223,2,0,32},{0,2,0,34},{0,2,0, 36},{8223,2,0,32},{0,2,0,35},{0,2,0,36},{8223,2,0,32},{0,2,0,34},{0,2,0,42}, {8223,2,0,32},{0,2,0,35},{0,2,0,42},{8223,8,0,32},{0,2,0,34},{8223,8,0,32},{0,2, 0,35},{8223,8,0,32},{0,2,0,34},{0,2,0,37},{8223,8,0,32},{0,2,0,35},{0,2,0,37}, {8223,8,0,32},{0,2,0,34},{0,2,0,36},{8223,8,0,32},{0,2,0,35},{0,2,0,36},{8223,8, 0,32},{0,2,0,34},{0,2,0,42},{8223,8,0,32},{0,2,0,35},{0,2,0,42},{8228,2,0,32}, {0,2,0,34},{8228,2,0,32},{0,2,0,35},{8228,2,0,32},{0,2,0,34},{0,2,0,37},{8228,2, 0,32},{0,2,0,35},{0,2,0,37},{8228,2,0,32},{0,2,0,34},{0,2,0,36},{8228,2,0,32}, {0,2,0,35},{0,2,0,36},{8228,8,0,32},{0,2,0,34},{8228,8,0,32},{0,2,0,35},{8228,8, 0,32},{0,2,0,34},{0,2,0,37},{8228,8,0,32},{0,2,0,35},{0,2,0,37},{8228,8,0,32}, {0,2,0,34},{0,2,0,36},{8228,8,0,32},{0,2,0,35},{0,2,0,36},{8234,2,0,32},{0,2,0, 34},{8234,2,0,32},{0,2,0,35},{8234,2,0,32},{0,2,0,34},{0,2,0,37},{8234,2,0,32}, {0,2,0,35},{0,2,0,37},{8234,2,0,32},{0,2,0,34},{0,2,0,36},{8234,2,0,32},{0,2,0, 35},{0,2,0,36},{8234,2,0,32},{0,2,0,34},{0,2,0,42},{8234,2,0,32},{0,2,0,35},{0, 2,0,42},{8234,8,0,32},{0,2,0,34},{8234,8,0,32},{0,2,0,35},{8234,8,0,32},{0,2,0, 34},{0,2,0,37},{8234,8,0,32},{0,2,0,35},{0,2,0,37},{8234,8,0,32},{0,2,0,34},{0, 2,0,36},{8234,8,0,32},{0,2,0,35},{0,2,0,36},{8234,8,0,32},{0,2,0,34},{0,2,0,42}, {8234,8,0,32},{0,2,0,35},{0,2,0,42},{8236,2,0,32},{0,2,0,34},{8236,2,0,32},{0,2, 0,35},{8236,2,0,32},{0,2,0,34},{0,2,0,37},{8236,2,0,32},{0,2,0,35},{0,2,0,37}, {8236,2,0,32},{0,2,0,34},{0,2,0,36},{8236,2,0,32},{0,2,0,35},{0,2,0,36},{8236,2, 0,32},{0,2,0,34},{0,2,0,42},{8236,2,0,32},{0,2,0,35},{0,2,0,42},{8236,8,0,32}, {0,2,0,34},{8236,8,0,32},{0,2,0,35},{8236,8,0,32},{0,2,0,34},{0,2,0,37},{8236,8, 0,32},{0,2,0,35},{0,2,0,37},{8236,8,0,32},{0,2,0,34},{0,2,0,36},{8236,8,0,32}, {0,2,0,35},{0,2,0,36},{8236,8,0,32},{0,2,0,34},{0,2,0,42},{8236,8,0,32},{0,2,0, 35},{0,2,0,42},{8244,2,0,32},{0,2,0,34},{8244,2,0,32},{0,2,0,35},{8244,2,0,32}, {0,2,0,34},{0,2,0,37},{8244,2,0,32},{0,2,0,35},{0,2,0,37},{8244,2,0,32},{0,2,0, 34},{0,2,0,36},{8244,2,0,32},{0,2,0,35},{0,2,0,36},{8244,8,0,32},{0,2,0,34}, {8244,8,0,32},{0,2,0,35},{8244,8,0,32},{0,2,0,34},{0,2,0,37},{8244,8,0,32},{0,2, 0,35},{0,2,0,37},{8244,8,0,32},{0,2,0,34},{0,2,0,36},{8244,8,0,32},{0,2,0,35}, {0,2,0,36},{8258,2,0,32},{0,2,0,34},{8258,2,0,32},{0,2,0,35},{8258,2,0,32},{0,2, 0,34},{0,2,0,37},{8258,2,0,32},{0,2,0,35},{0,2,0,37},{8258,2,0,32},{0,2,0,34}, {0,2,0,36},{8258,2,0,32},{0,2,0,35},{0,2,0,36},{8258,2,0,32},{0,2,0,34},{0,2,0, 42},{8258,2,0,32},{0,2,0,35},{0,2,0,42},{8258,8,0,32},{0,2,0,35},{8258,8,0,32}, {0,2,0,35},{0,2,0,37},{8258,8,0,32},{0,2,0,35},{0,2,0,36},{8258,8,0,32},{0,2,0, 35},{0,2,0,42},{8263,2,0,32},{0,2,0,34},{8263,2,0,32},{0,2,0,35},{8263,2,0,32}, {0,2,0,34},{0,2,0,37},{8263,2,0,32},{0,2,0,35},{0,2,0,37},{8263,2,0,32},{0,2,0, 34},{0,2,0,36},{8263,2,0,32},{0,2,0,35},{0,2,0,36},{8263,2,0,32},{0,2,0,34},{0, 2,0,42},{8263,2,0,32},{0,2,0,35},{0,2,0,42},{8263,8,0,32},{0,2,0,34},{8263,8,0, 32},{0,2,0,35},{8263,8,0,32},{0,2,0,34},{0,2,0,37},{8263,8,0,32},{0,2,0,35},{0, 2,0,37},{8263,8,0,32},{0,2,0,34},{0,2,0,36},{8263,8,0,32},{0,2,0,35},{0,2,0,36}, {8263,8,0,32},{0,2,0,34},{0,2,0,42},{8263,8,0,32},{0,2,0,35},{0,2,0,42},{8223,2, 0,32},{0,2,0,37},{8228,2,0,32},{0,2,0,37},{8234,2,0,32},{0,2,0,37},{8236,2,0, 32},{0,2,0,37},{8244,2,0,32},{0,2,0,37},{8258,2,0,32},{0,2,0,37},{8263,2,0,32}, {0,2,0,37},{8223,2,0,32},{0,2,0,34},{0,2,0,76},{8223,2,0,32},{0,2,0,35},{0,2,0, 76},{8223,2,0,32},{0,2,0,34},{0,2,0,37},{0,2,0,76},{8223,2,0,32},{0,2,0,35},{0, 2,0,37},{0,2,0,76},{8223,2,0,32},{0,2,0,34},{0,2,0,36},{0,2,0,76},{8223,2,0,32}, {0,2,0,35},{0,2,0,36},{0,2,0,76},{8223,2,0,32},{0,2,0,34},{0,2,0,42},{0,2,0,76}, {8223,2,0,32},{0,2,0,35},{0,2,0,42},{0,2,0,76},{8223,8,0,32},{0,2,0,34},{0,2,0, 76},{8223,8,0,32},{0,2,0,35},{0,2,0,76},{8223,8,0,32},{0,2,0,34},{0,2,0,37},{0, 2,0,76},{8223,8,0,32},{0,2,0,35},{0,2,0,37},{0,2,0,76},{8223,8,0,32},{0,2,0,34}, {0,2,0,36},{0,2,0,76},{8223,8,0,32},{0,2,0,35},{0,2,0,36},{0,2,0,76},{8223,8,0, 32},{0,2,0,34},{0,2,0,42},{0,2,0,76},{8223,8,0,32},{0,2,0,35},{0,2,0,42},{0,2,0, 76},{8234,2,0,32},{0,2,0,34},{0,2,0,76},{8234,2,0,32},{0,2,0,35},{0,2,0,76}, {8234,2,0,32},{0,2,0,34},{0,2,0,37},{0,2,0,76},{8234,2,0,32},{0,2,0,35},{0,2,0, 37},{0,2,0,76},{8234,2,0,32},{0,2,0,34},{0,2,0,36},{0,2,0,76},{8234,2,0,32},{0, 2,0,35},{0,2,0,36},{0,2,0,76},{8234,2,0,32},{0,2,0,34},{0,2,0,42},{0,2,0,76}, {8234,2,0,32},{0,2,0,35},{0,2,0,42},{0,2,0,76},{8234,8,0,32},{0,2,0,34},{0,2,0, 76},{8234,8,0,32},{0,2,0,35},{0,2,0,76},{8234,8,0,32},{0,2,0,34},{0,2,0,37},{0, 2,0,76},{8234,8,0,32},{0,2,0,35},{0,2,0,37},{0,2,0,76},{8234,8,0,32},{0,2,0,34}, {0,2,0,36},{0,2,0,76},{8234,8,0,32},{0,2,0,35},{0,2,0,36},{0,2,0,76},{8234,8,0, 32},{0,2,0,34},{0,2,0,42},{0,2,0,76},{8234,8,0,32},{0,2,0,35},{0,2,0,42},{0,2,0, 76},{8263,2,0,32},{0,2,0,34},{0,2,0,76},{8263,2,0,32},{0,2,0,35},{0,2,0,76}, {8263,2,0,32},{0,2,0,34},{0,2,0,37},{0,2,0,76},{8263,2,0,32},{0,2,0,35},{0,2,0, 37},{0,2,0,76},{8263,2,0,32},{0,2,0,34},{0,2,0,36},{0,2,0,76},{8263,2,0,32},{0, 2,0,35},{0,2,0,36},{0,2,0,76},{8263,2,0,32},{0,2,0,34},{0,2,0,42},{0,2,0,76}, {8263,2,0,32},{0,2,0,35},{0,2,0,42},{0,2,0,76},{8263,8,0,32},{0,2,0,34},{0,2,0, 76},{8263,8,0,32},{0,2,0,35},{0,2,0,76},{8263,8,0,32},{0,2,0,34},{0,2,0,37},{0, 2,0,76},{8263,8,0,32},{0,2,0,35},{0,2,0,37},{0,2,0,76},{8263,8,0,32},{0,2,0,34}, {0,2,0,36},{0,2,0,76},{8263,8,0,32},{0,2,0,35},{0,2,0,36},{0,2,0,76},{8263,8,0, 32},{0,2,0,34},{0,2,0,42},{0,2,0,76},{8263,8,0,32},{0,2,0,35},{0,2,0,42},{0,2,0, 76},{8223,2,0,32},{0,2,0,38},{8223,2,0,32},{0,2,0,50},{8223,2,0,32},{0,2,0,37}, {0,2,0,76},{8223,2,0,32},{0,2,0,76},{8223,2,0,32},{0,2,0,36},{0,2,0,76},{8223,2, 0,32},{0,2,0,42},{8223,2,0,32},{0,2,0,42},{0,2,0,76},{8223,8,0,32},{0,2,0,38}, {8223,8,0,32},{0,2,0,50},{8223,8,0,32},{0,2,0,37},{8223,8,0,32},{0,2,0,76}, {1183,2,1,32},{0,2,0,42},{8234,2,0,32},{0,2,0,37},{0,2,0,76},{8234,2,0,32},{0,2, 0,76},{8234,2,0,32},{0,2,0,36},{0,2,0,76},{8234,2,0,32},{0,2,0,42},{8234,2,0, 32},{0,2,0,42},{0,2,0,76},{8228,8,0,32},{0,2,0,37},{8234,8,0,32},{0,2,0,37}, {8234,8,0,32},{0,2,0,76},{1188,2,1,32},{0,2,0,37},{1188,2,1,32},{0,2,0,36}, {1188,2,1,32},{0,2,0,42},{8236,2,0,32},{0,2,0,38},{8236,2,0,32},{0,2,0,50}, {8236,2,0,32},{0,2,0,43},{0,2,0,37},{8236,2,0,32},{0,2,0,42},{8236,2,0,32},{0,2, 0,43},{0,2,0,42},{8236,8,0,32},{0,2,0,38},{8236,8,0,32},{0,2,0,50},{8236,8,0, 32},{0,2,0,37},{1189,2,1,32},{0,2,0,37},{1189,2,1,32},{0,2,0,36},{1189,2,1,32}, {0,2,0,42},{8258,2,0,32},{0,2,0,38},{8258,2,0,32},{0,2,0,50},{8258,2,0,32},{0,2, 0,43},{0,2,0,37},{8250,2,0,32},{0,2,0,34},{8250,2,0,32},{0,2,0,35},{8258,2,0, 32},{0,2,0,42},{8258,2,0,32},{0,2,0,43},{0,2,0,42},{8258,8,0,32},{0,2,0,38}, {8258,8,0,32},{0,2,0,50},{8258,8,0,32},{0,2,0,37},{8250,8,0,32},{0,2,0,35}, {1183,2,1,32},{0,2,0,37},{8263,2,0,32},{0,2,0,37},{0,2,0,76},{8263,2,0,32},{0,2, 0,76},{8263,2,0,32},{0,2,0,36},{0,2,0,76},{8263,2,0,32},{0,2,0,42},{8263,2,0, 32},{0,2,0,42},{0,2,0,76},{8244,8,0,32},{0,2,0,37},{8263,8,0,32},{0,2,0,37}, {8263,8,0,32},{0,2,0,76},{632,4,1,32},{632,4,1,32},{632,4,1,32},{632,4,1,32}, {632,4,1,32},{939,4,1,32},{939,4,1,32},{939,4,1,32},{939,4,1,32},{939,4,1,32}, {940,4,1,32},{940,4,1,32},{940,4,1,32},{940,4,1,32},{940,4,1,32},{609,4,1,32}, {609,4,1,32},{615,4,1,32},{615,4,1,32},{615,4,1,32},{609,4,1,32},{609,4,1,32}, {615,4,1,32},{939,4,1,32},{939,4,1,32},{939,4,1,32},{939,4,1,32},{7833,10,0,32}, {7895,4,0,32},{7341,4,0,32},{917,4,1,32},{7392,4,0,32},{7341,4,0,32},{917,4,1, 32},{7895,4,0,32},{1292,4,1,32},{7392,10,0,32},{7392,4,0,32},{917,4,1,32},{7747, 4,0,32},{7392,4,0,32},{917,4,1,32},{7963,4,0,32},{1292,4,1,32},{7499,10,0,32}, {7550,2,0,32},{0,2,0,57},{7711,10,0,32},{7747,4,0,32},{7895,20,0,32},{7696,20,0, 32},{7931,10,0,32},{7440,10,0,32},{7645,10,0,32},{7931,20,0,32},{7696,20,0,32}, {7499,10,0,32},{7341,10,0,32},{8037,10,0,32},{7341,10,0,32},{917,4,1,32},{7895, 10,0,32},{7332,30,0,32},{1596,30,1,32},{7338,30,0,32},{7332,30,0,32},{1596,30,1, 32},{7340,30,0,32},{7332,30,0,32},{1596,30,1,32},{7332,30,0,32},{7331,30,0,32}, {7332,30,0,32},{1596,30,1,32},{7334,30,0,32},{7333,30,0,32},{1596,30,1,32}, {7334,30,0,32},{7332,30,0,32},{1596,30,1,32},{7336,30,0,32},{7333,30,0,32}, {1596,30,1,32},{7336,30,0,32},{7334,30,0,32},{1596,30,1,32},{7336,30,0,32}, {7335,30,0,32},{1596,30,1,32},{7336,30,0,32},{7332,30,0,32},{1596,30,1,32}, {7337,30,0,32},{7336,30,0,32},{1596,30,1,32},{7337,30,0,32},{7332,30,0,32}, {1596,30,1,32},{7339,30,0,32},{7334,30,0,32},{1596,30,1,32},{7339,30,0,32}, {7336,30,0,32},{1596,30,1,32},{7339,30,0,32},{7338,30,0,32},{1596,30,1,32}, {7339,30,0,32},{7332,30,0,32},{1596,30,1,32},{7576,10,0,32},{7576,10,0,32}, {7576,10,0,32},{7576,10,0,32},{7576,10,0,32},{7576,10,0,32},{8009,10,0,32}, {8009,10,0,32},{7576,10,0,32},{8009,10,0,32},{7576,10,0,32},{7576,10,0,32}, {8009,10,0,32},{7576,10,0,32},{7576,10,0,32},{7576,10,0,32},{7576,10,0,32}, {8037,10,0,32},{8037,10,0,32},{7576,10,0,32},{8037,10,0,32},{7576,10,0,32}, {7576,10,0,32},{7576,4,0,32},{7576,4,0,32},{7576,4,0,32},{7576,4,0,32},{7576,4, 0,32},{7576,4,0,32},{8009,4,0,32},{8009,4,0,32},{7576,4,0,32},{8009,4,0,32}, {7576,4,0,32},{7576,4,0,32},{8009,4,0,32},{7576,4,0,32},{7576,4,0,32},{7576,4,0, 32},{7576,4,0,32},{8037,4,0,32},{8037,4,0,32},{7576,4,0,32},{8037,4,0,32},{7576, 4,0,32},{7576,4,0,32},{7331,30,0,32},{1596,30,1,32},{7334,30,0,32},{1458,2,1, 32},{0,2,0,47},{1459,2,1,32},{0,2,0,47},{1462,2,1,32},{0,2,0,47},{1516,2,1,32}, {0,2,0,47},{1520,2,1,32},{0,2,0,47},{1518,2,1,32},{0,2,0,47},{1567,2,1,32},{0,2, 0,47},{1571,2,1,32},{0,2,0,47},{1573,2,1,32},{0,2,0,47},{1612,2,1,32},{0,2,0, 47},{1613,2,1,32},{0,2,0,47},{1618,4,1,32},{1618,4,1,32},{1618,4,1,32},{1618,4, 1,32},{1618,4,1,32},{1619,4,1,32},{1619,4,1,32},{1619,4,1,32},{1619,4,1,32}, {1619,4,1,32},{1631,2,1,32},{0,2,0,47},{1637,2,1,32},{0,2,0,47},{1638,2,1,32}, {0,2,0,47},{1640,2,1,32},{0,2,0,47},{1585,2,1,32},{0,2,0,47},{1663,2,1,32},{0,2, 0,47},{1644,2,1,32},{0,2,0,47},{1584,2,1,32},{0,2,0,47},{1586,2,1,32},{0,2,0, 47},{1665,2,1,32},{0,2,0,47},{1666,2,1,32},{0,2,0,47},{1674,2,1,32},{0,2,0,47}, {1675,2,1,32},{0,2,0,47},{1676,2,1,32},{0,2,0,47},{1677,2,1,32},{0,2,0,47}, {1678,2,1,32},{0,2,0,47},{1679,2,1,32},{0,2,0,47},{1684,2,1,32},{0,2,0,47}, {1685,2,1,32},{0,2,0,47},{1686,2,1,32},{0,2,0,47},{1687,2,1,32},{0,2,0,47}, {1712,2,1,32},{0,2,0,47},{1718,2,1,32},{0,2,0,47},{1719,2,1,32},{0,2,0,47}, {1721,2,1,32},{0,2,0,47},{1680,2,1,32},{0,2,0,47},{1681,2,1,32},{0,2,0,47}, {1695,2,1,32},{0,2,0,47},{1696,2,1,32},{0,2,0,47},{1724,2,1,32},{0,2,0,47}, {1725,2,1,32},{0,2,0,47},{1726,2,1,32},{0,2,0,47},{1727,2,1,32},{0,2,0,47}, {7332,6,0,32},{7331,6,0,32},{7332,6,0,32},{7332,6,0,32},{7332,6,0,32},{7333,6,0, 32},{7332,6,0,32},{7334,6,0,32},{7332,6,0,32},{7335,6,0,32},{7332,6,0,32},{7336, 6,0,32},{7332,6,0,32},{7337,6,0,32},{7332,6,0,32},{7338,6,0,32},{7332,6,0,32}, {7339,6,0,32},{7332,6,0,32},{7340,6,0,32},{7333,6,0,32},{7331,6,0,32},{792,4,1, 32},{7332,4,0,32},{793,4,1,32},{792,4,1,32},{7333,4,0,32},{793,4,1,32},{792,4,1, 32},{7334,4,0,32},{793,4,1,32},{792,4,1,32},{7335,4,0,32},{793,4,1,32},{792,4,1, 32},{7336,4,0,32},{793,4,1,32},{792,4,1,32},{7337,4,0,32},{793,4,1,32},{792,4,1, 32},{7338,4,0,32},{793,4,1,32},{792,4,1,32},{7339,4,0,32},{793,4,1,32},{792,4,1, 32},{7340,4,0,32},{793,4,1,32},{792,4,1,32},{7332,4,0,32},{7331,4,0,32},{793,4, 1,32},{792,4,1,32},{7332,4,0,32},{7332,4,0,32},{793,4,1,32},{792,4,1,32},{7332, 4,0,32},{7333,4,0,32},{793,4,1,32},{792,4,1,32},{7332,4,0,32},{7334,4,0,32}, {793,4,1,32},{792,4,1,32},{7332,4,0,32},{7335,4,0,32},{793,4,1,32},{792,4,1,32}, {7332,4,0,32},{7336,4,0,32},{793,4,1,32},{792,4,1,32},{7332,4,0,32},{7337,4,0, 32},{793,4,1,32},{792,4,1,32},{7332,4,0,32},{7338,4,0,32},{793,4,1,32},{792,4,1, 32},{7332,4,0,32},{7339,4,0,32},{793,4,1,32},{792,4,1,32},{7332,4,0,32},{7340,4, 0,32},{793,4,1,32},{792,4,1,32},{7333,4,0,32},{7331,4,0,32},{793,4,1,32},{7332, 4,0,32},{632,4,1,32},{7333,4,0,32},{632,4,1,32},{7334,4,0,32},{632,4,1,32}, {7335,4,0,32},{632,4,1,32},{7336,4,0,32},{632,4,1,32},{7337,4,0,32},{632,4,1, 32},{7338,4,0,32},{632,4,1,32},{7339,4,0,32},{632,4,1,32},{7340,4,0,32},{632,4, 1,32},{7332,4,0,32},{7331,4,0,32},{632,4,1,32},{7332,4,0,32},{7332,4,0,32},{632, 4,1,32},{7332,4,0,32},{7333,4,0,32},{632,4,1,32},{7332,4,0,32},{7334,4,0,32}, {632,4,1,32},{7332,4,0,32},{7335,4,0,32},{632,4,1,32},{7332,4,0,32},{7336,4,0, 32},{632,4,1,32},{7332,4,0,32},{7337,4,0,32},{632,4,1,32},{7332,4,0,32},{7338,4, 0,32},{632,4,1,32},{7332,4,0,32},{7339,4,0,32},{632,4,1,32},{7332,4,0,32},{7340, 4,0,32},{632,4,1,32},{7333,4,0,32},{7331,4,0,32},{632,4,1,32},{792,4,1,32}, {7341,4,0,32},{793,4,1,32},{792,4,1,32},{7366,4,0,32},{793,4,1,32},{792,4,1,32}, {7392,4,0,32},{793,4,1,32},{792,4,1,32},{7413,4,0,32},{793,4,1,32},{792,4,1,32}, {7440,4,0,32},{793,4,1,32},{792,4,1,32},{7499,4,0,32},{793,4,1,32},{792,4,1,32}, {7514,4,0,32},{793,4,1,32},{792,4,1,32},{7550,4,0,32},{793,4,1,32},{792,4,1,32}, {7576,4,0,32},{793,4,1,32},{792,4,1,32},{7602,4,0,32},{793,4,1,32},{792,4,1,32}, {7627,4,0,32},{793,4,1,32},{792,4,1,32},{7645,4,0,32},{793,4,1,32},{792,4,1,32}, {7696,4,0,32},{793,4,1,32},{792,4,1,32},{7711,4,0,32},{793,4,1,32},{792,4,1,32}, {7747,4,0,32},{793,4,1,32},{792,4,1,32},{7794,4,0,32},{793,4,1,32},{792,4,1,32}, {7815,4,0,32},{793,4,1,32},{792,4,1,32},{7833,4,0,32},{793,4,1,32},{792,4,1,32}, {7895,4,0,32},{793,4,1,32},{792,4,1,32},{7931,4,0,32},{793,4,1,32},{792,4,1,32}, {7963,4,0,32},{793,4,1,32},{792,4,1,32},{8009,4,0,32},{793,4,1,32},{792,4,1,32}, {8027,4,0,32},{793,4,1,32},{792,4,1,32},{8037,4,0,32},{793,4,1,32},{792,4,1,32}, {8049,4,0,32},{793,4,1,32},{792,4,1,32},{8071,4,0,32},{793,4,1,32},{7332,6,0, 32},{7332,6,0,32},{7332,6,0,32},{7333,6,0,32},{7332,6,0,32},{7334,6,0,32},{7332, 6,0,32},{7335,6,0,32},{7332,6,0,32},{7336,6,0,32},{7332,6,0,32},{7337,6,0,32}, {7332,6,0,32},{7338,6,0,32},{7332,6,0,32},{7339,6,0,32},{7332,6,0,32},{7340,6,0, 32},{7333,6,0,32},{7331,6,0,32},{7332,6,0,32},{7331,6,0,32},{7332,6,0,32},{7331, 6,0,32},{7332,6,0,32},{7331,6,0,32},{7332,6,0,32},{7331,6,0,32},{1618,4,1,32}, {1618,4,1,32},{1618,4,1,32},{1618,4,1,32},{570,4,1,32},{570,4,1,32},{1585,4,1, 32},{1585,4,1,32},{1585,4,1,32},{1585,4,1,32},{1585,4,1,32},{1585,4,1,32},{3260, 2,1,32},{0,2,0,47},{8279,4,0,32},{8268,4,0,32},{8278,4,0,32},{8555,4,0,32}, {8564,4,0,32},{64320,4,0,32},{52790,0,0,0},{0,4,0,273},{64320,4,0,32},{54146,0, 0,0},{0,4,0,273},{64320,4,0,32},{52827,0,0,0},{64320,4,0,32},{52826,0,0,0}, {64320,4,0,32},{52825,0,0,0},{0,4,0,273},{64320,4,0,32},{52923,0,0,0},{64320,4, 0,32},{53634,0,0,0},{0,4,0,273},{64320,4,0,32},{53728,0,0,0},{0,4,0,273},{64320, 4,0,32},{53760,0,0,0},{0,4,0,273},{64320,4,0,32},{53762,0,0,0},{64320,4,0,32}, {54108,0,0,0},{0,4,0,273},{64320,4,0,32},{54121,0,0,0},{0,4,0,273},{64320,4,0, 32},{56335,0,0,0},{0,4,0,273},{64320,4,0,32},{56335,0,0,0},{0,4,0,274},{64320,4, 0,32},{56354,0,0,0},{0,4,0,273},{64320,4,0,32},{56355,0,0,0},{64320,4,0,32}, {56354,0,0,0},{64320,4,0,32},{56355,0,0,0},{0,4,0,273},{64320,4,0,32},{56819,0, 0,0},{64320,4,0,32},{56954,0,0,0},{64320,4,0,32},{57169,0,0,0},{64320,4,0,32}, {57168,0,0,0},{0,4,0,273},{64320,4,0,32},{57284,0,0,0},{64320,4,0,32},{57283,0, 0,0},{0,4,0,273},{64320,4,0,32},{57932,0,0,0},{64320,4,0,32},{58677,0,0,0}, {64320,4,0,32},{58849,0,0,0},{64320,4,0,32},{58853,0,0,0},{0,4,0,273},{64320,4, 0,32},{59144,0,0,0},{0,4,0,273},{64320,4,0,32},{60282,0,0,0},{0,4,0,273},{64320, 4,0,32},{60365,0,0,0},{64320,4,0,32},{60433,0,0,0},{64320,4,0,32},{60469,0,0,0}, {64320,4,0,32},{60474,0,0,0},{64320,4,0,32},{61548,0,0,0},{64320,4,0,32},{61995, 0,0,0},{64320,4,0,32},{61995,0,0,0},{0,4,0,273},{64320,4,0,32},{52780,0,0,0}, {64320,4,0,32},{62043,0,0,0},{0,4,0,273},{64320,4,0,32},{62125,0,0,0},{64320,4, 0,32},{62347,0,0,0},{0,4,0,273},{64320,4,0,32},{62859,0,0,0},{0,4,0,273},{64320, 4,0,32},{63214,0,0,0},{0,4,0,273},{64320,4,0,32},{63802,0,0,0},{0,4,0,273}, {64320,4,0,32},{63803,0,0,0},{64320,4,0,32},{64249,0,0,0},{0,4,0,273},{64320,4, 0,32},{64761,0,0,0},{64320,4,0,32},{65183,0,0,0},{64320,4,0,32},{65363,0,0,0}, {64320,4,0,32},{65362,0,0,0},{64320,4,0,32},{65363,0,0,0},{0,4,0,273},{64320,4, 0,32},{65363,0,0,0},{0,4,0,274},{64320,4,0,32},{65362,0,0,0},{0,4,0,273},{64320, 4,0,32},{65418,0,0,0},{0,4,0,273},{64320,4,0,32},{65418,0,0,0},{0,4,0,274}, {64320,4,0,32},{65419,0,0,0},{64321,4,0,32},{32770,0,0,0},{64321,4,0,32},{32896, 0,0,0},{64321,4,0,32},{32895,0,0,0},{0,4,0,273},{64321,4,0,32},{32905,0,0,0},{0, 4,0,273},{64321,4,0,32},{33276,0,0,0},{0,4,0,273},{64321,4,0,32},{33401,0,0,0}, {64321,4,0,32},{33401,0,0,0},{0,4,0,273},{64321,4,0,32},{33401,0,0,0},{0,4,0, 274},{64321,4,0,32},{34382,0,0,0},{64321,4,0,32},{34916,0,0,0},{64321,4,0,32}, {35200,0,0,0},{64321,4,0,32},{35199,0,0,0},{64321,4,0,32},{35265,0,0,0},{64321, 4,0,32},{35282,0,0,0},{64321,4,0,32},{35282,0,0,0},{0,4,0,273},{64321,4,0,32}, {35744,0,0,0},{64321,4,0,32},{36125,0,0,0},{64321,4,0,32},{36275,0,0,0},{0,4,0, 273},{64321,4,0,32},{36710,0,0,0},{64321,4,0,32},{36790,0,0,0},{64321,4,0,32}, {36790,0,0,0},{0,4,0,273},{64321,4,0,32},{36790,0,0,0},{0,4,0,274},{64321,4,0, 32},{37009,0,0,0},{0,4,0,273},{64321,4,0,32},{38021,0,0,0},{64321,4,0,32}, {38263,0,0,0},{64321,4,0,32},{38264,0,0,0},{64321,4,0,32},{38271,0,0,0},{64321, 4,0,32},{38376,0,0,0},{64321,4,0,32},{38428,0,0,0},{0,4,0,273},{64321,4,0,32}, {38429,0,0,0},{64321,4,0,32},{38632,0,0,0},{0,4,0,273},{64321,4,0,32},{38738,0, 0,0},{64321,4,0,32},{38886,0,0,0},{64321,4,0,32},{39029,0,0,0},{64321,4,0,32}, {39118,0,0,0},{64321,4,0,32},{39134,0,0,0},{64321,4,0,32},{39135,0,0,0},{64321, 4,0,32},{39136,0,0,0},{0,4,0,273},{64321,4,0,32},{39136,0,0,0},{64321,4,0,32}, {39267,0,0,0},{64321,4,0,32},{39318,0,0,0},{0,4,0,273},{64321,4,0,32},{39532,0, 0,0},{64321,4,0,32},{39592,0,0,0},{0,4,0,273},{64321,4,0,32},{39740,0,0,0},{0,4, 0,273},{64321,4,0,32},{40060,0,0,0},{64321,4,0,32},{40479,0,0,0},{64321,4,0,32}, {40565,0,0,0},{0,4,0,273},{64321,4,0,32},{40614,0,0,0},{64321,4,0,32},{40644,0, 0,0},{64321,4,0,32},{40702,0,0,0},{64321,4,0,32},{40778,0,0,0},{0,4,0,273}, {64321,4,0,32},{40784,0,0,0},{64321,4,0,32},{40786,0,0,0},{0,4,0,273},{64321,4, 0,32},{40831,0,0,0},{64321,4,0,32},{40845,0,0,0},{0,4,0,273},{64321,4,0,32}, {40857,0,0,0},{64321,4,0,32},{40860,0,0,0},{0,4,0,273},{64321,4,0,32},{40860,0, 0,0},{0,4,0,274},{64321,4,0,32},{40863,0,0,0},{64320,4,0,32},{52736,0,0,0}, {64320,4,0,32},{52776,0,0,0},{64320,4,0,32},{52790,0,0,0},{64320,4,0,32},{52799, 0,0,0},{64320,4,0,32},{52825,0,0,0},{64320,4,0,32},{52869,0,0,0},{64320,4,0,32}, {52876,0,0,0},{64320,4,0,32},{52896,0,0,0},{64320,4,0,32},{52922,0,0,0},{64320, 4,0,32},{53567,0,0,0},{64320,4,0,32},{53605,0,0,0},{64320,4,0,32},{53611,0,0,0}, {64320,4,0,32},{53634,0,0,0},{64320,4,0,32},{53654,0,0,0},{64320,4,0,32},{53675, 0,0,0},{64320,4,0,32},{53728,0,0,0},{64320,4,0,32},{53749,0,0,0},{64320,4,0,32}, {53760,0,0,0},{64320,4,0,32},{53915,0,0,0},{64320,4,0,32},{54009,0,0,0},{64320, 4,0,32},{54037,0,0,0},{64320,4,0,32},{54042,0,0,0},{64320,4,0,32},{54072,0,0,0}, {64320,4,0,32},{54081,0,0,0},{64320,4,0,32},{54108,0,0,0},{64320,4,0,32},{54121, 0,0,0},{64320,4,0,32},{54146,0,0,0},{64320,4,0,32},{54198,0,0,0},{64320,4,0,32}, {54216,0,0,0},{64320,4,0,32},{54243,0,0,0},{64320,4,0,32},{54999,0,0,0},{64320, 4,0,32},{55071,0,0,0},{64320,4,0,32},{55531,0,0,0},{64320,4,0,32},{55554,0,0,0}, {64320,4,0,32},{55562,0,0,0},{64320,4,0,32},{55573,0,0,0},{64320,4,0,32},{55591, 0,0,0},{64320,4,0,32},{55667,0,0,0},{64320,4,0,32},{56144,0,0,0},{64320,4,0,32}, {56192,0,0,0},{64320,4,0,32},{56312,0,0,0},{64320,4,0,32},{56335,0,0,0},{64320, 4,0,32},{56354,0,0,0},{64320,4,0,32},{56376,0,0,0},{64320,4,0,32},{56430,0,0,0}, {64320,4,0,32},{56433,0,0,0},{64320,4,0,32},{56795,0,0,0},{64320,4,0,32},{56805, 0,0,0},{64320,4,0,32},{56817,0,0,0},{64320,4,0,32},{56830,0,0,0},{64320,4,0,32}, {56946,0,0,0},{64320,4,0,32},{56954,0,0,0},{64320,4,0,32},{56959,0,0,0},{64320, 4,0,32},{57076,0,0,0},{64320,4,0,32},{57086,0,0,0},{64320,4,0,32},{57099,0,0,0}, {64320,4,0,32},{57107,0,0,0},{64320,4,0,32},{57168,0,0,0},{64320,4,0,32},{57185, 0,0,0},{64320,4,0,32},{57203,0,0,0},{64320,4,0,32},{57283,0,0,0},{64320,4,0,32}, {57864,0,0,0},{64320,4,0,32},{57910,0,0,0},{64320,4,0,32},{57931,0,0,0},{64320, 4,0,32},{58671,0,0,0},{64320,4,0,32},{58676,0,0,0},{64320,4,0,32},{58759,0,0,0}, {64320,4,0,32},{58775,0,0,0},{64320,4,0,32},{58788,0,0,0},{64320,4,0,32},{58809, 0,0,0},{64320,4,0,32},{58848,0,0,0},{64320,4,0,32},{58853,0,0,0},{64320,4,0,32}, {59120,0,0,0},{64320,4,0,32},{59144,0,0,0},{64320,4,0,32},{59176,0,0,0},{64320, 4,0,32},{60192,0,0,0},{64320,4,0,32},{60258,0,0,0},{64320,4,0,32},{60281,0,0,0}, {64320,4,0,32},{60339,0,0,0},{64320,4,0,32},{60363,0,0,0},{64320,4,0,32},{60372, 0,0,0},{64320,4,0,32},{60379,0,0,0},{64320,4,0,32},{60431,0,0,0},{64320,4,0,32}, {60436,0,0,0},{64320,4,0,32},{60468,0,0,0},{64320,4,0,32},{61547,0,0,0},{64320, 4,0,32},{61994,0,0,0},{64320,4,0,32},{62006,0,0,0},{64320,4,0,32},{62011,0,0,0}, {64320,4,0,32},{62015,0,0,0},{64320,4,0,32},{62023,0,0,0},{64320,4,0,32},{62041, 0,0,0},{64320,4,0,32},{62043,0,0,0},{64320,4,0,32},{62124,0,0,0},{64320,4,0,32}, {62340,0,0,0},{64320,4,0,32},{62345,0,0,0},{64320,4,0,32},{62684,0,0,0},{64320, 4,0,32},{62694,0,0,0},{64320,4,0,32},{62744,0,0,0},{64320,4,0,32},{62751,0,0,0}, {64320,4,0,32},{62760,0,0,0},{64320,4,0,32},{62768,0,0,0},{64320,4,0,32},{62859, 0,0,0},{64320,4,0,32},{62866,0,0,0},{64320,4,0,32},{63094,0,0,0},{64320,4,0,32}, {63101,0,0,0},{64320,4,0,32},{63150,0,0,0},{64320,4,0,32},{63167,0,0,0},{64320, 4,0,32},{63214,0,0,0},{64320,4,0,32},{63451,0,0,0},{64320,4,0,32},{63458,0,0,0}, {64320,4,0,32},{63475,0,0,0},{64320,4,0,32},{63802,0,0,0},{64320,4,0,32},{63928, 0,0,0},{64320,4,0,32},{63934,0,0,0},{64320,4,0,32},{64116,0,0,0},{64320,4,0,32}, {64203,0,0,0},{64320,4,0,32},{64249,0,0,0},{64320,4,0,32},{64627,0,0,0},{64320, 4,0,32},{64760,0,0,0},{64320,4,0,32},{65334,0,0,0},{64320,4,0,32},{65361,0,0,0}, {64320,4,0,32},{65418,0,0,0},{64320,4,0,32},{65469,0,0,0},{64321,4,0,32},{32769, 0,0,0},{64321,4,0,32},{32780,0,0,0},{64321,4,0,32},{32786,0,0,0},{64321,4,0,32}, {32819,0,0,0},{64321,4,0,32},{32895,0,0,0},{64321,4,0,32},{32905,0,0,0},{64321, 4,0,32},{33251,0,0,0},{64321,4,0,32},{33258,0,0,0},{64321,4,0,32},{33267,0,0,0}, {64321,4,0,32},{33276,0,0,0},{64321,4,0,32},{33292,0,0,0},{64321,4,0,32},{33307, 0,0,0},{64321,4,0,32},{33311,0,0,0},{64321,4,0,32},{33390,0,0,0},{64321,4,0,32}, {33394,0,0,0},{64321,4,0,32},{33400,0,0,0},{64321,4,0,32},{34381,0,0,0},{64321, 4,0,32},{34411,0,0,0},{64321,4,0,32},{34880,0,0,0},{64321,4,0,32},{34892,0,0,0}, {64321,4,0,32},{34915,0,0,0},{64321,4,0,32},{35198,0,0,0},{64321,4,0,32},{35211, 0,0,0},{64321,4,0,32},{35282,0,0,0},{64321,4,0,32},{35328,0,0,0},{64321,4,0,32}, {35895,0,0,0},{64321,4,0,32},{35910,0,0,0},{64321,4,0,32},{35925,0,0,0},{64321, 4,0,32},{35960,0,0,0},{64321,4,0,32},{35997,0,0,0},{64321,4,0,32},{36196,0,0,0}, {64321,4,0,32},{36208,0,0,0},{64321,4,0,32},{36275,0,0,0},{64321,4,0,32},{36523, 0,0,0},{64321,4,0,32},{36554,0,0,0},{64321,4,0,32},{36763,0,0,0},{64321,4,0,32}, {36784,0,0,0},{64321,4,0,32},{36789,0,0,0},{64321,4,0,32},{37009,0,0,0},{64321, 4,0,32},{37193,0,0,0},{64321,4,0,32},{37318,0,0,0},{64321,4,0,32},{37324,0,0,0}, {64321,4,0,32},{37329,0,0,0},{64321,4,0,32},{38263,0,0,0},{64321,4,0,32},{38272, 0,0,0},{64321,4,0,32},{38428,0,0,0},{64321,4,0,32},{38582,0,0,0},{64321,4,0,32}, {38585,0,0,0},{64321,4,0,32},{38632,0,0,0},{64321,4,0,32},{38737,0,0,0},{64321, 4,0,32},{38750,0,0,0},{64321,4,0,32},{38754,0,0,0},{64321,4,0,32},{38761,0,0,0}, {64321,4,0,32},{38859,0,0,0},{64321,4,0,32},{38893,0,0,0},{64321,4,0,32},{38899, 0,0,0},{64321,4,0,32},{38913,0,0,0},{64321,4,0,32},{39080,0,0,0},{64321,4,0,32}, {39131,0,0,0},{64321,4,0,32},{39135,0,0,0},{64321,4,0,32},{39318,0,0,0},{64321, 4,0,32},{39321,0,0,0},{64321,4,0,32},{39340,0,0,0},{64321,4,0,32},{39592,0,0,0}, {64321,4,0,32},{39640,0,0,0},{64321,4,0,32},{39647,0,0,0},{64321,4,0,32},{39717, 0,0,0},{64321,4,0,32},{39727,0,0,0},{64321,4,0,32},{39730,0,0,0},{64321,4,0,32}, {39740,0,0,0},{64321,4,0,32},{39770,0,0,0},{64321,4,0,32},{40165,0,0,0},{64321, 4,0,32},{40565,0,0,0},{64321,4,0,32},{40575,0,0,0},{64321,4,0,32},{40613,0,0,0}, {64321,4,0,32},{40635,0,0,0},{64321,4,0,32},{40643,0,0,0},{64321,4,0,32},{40653, 0,0,0},{64321,4,0,32},{40657,0,0,0},{64321,4,0,32},{40697,0,0,0},{64321,4,0,32}, {40701,0,0,0},{64321,4,0,32},{40718,0,0,0},{64321,4,0,32},{40723,0,0,0},{64321, 4,0,32},{40736,0,0,0},{64321,4,0,32},{40763,0,0,0},{64321,4,0,32},{40778,0,0,0}, {64321,4,0,32},{40786,0,0,0},{64321,4,0,32},{40845,0,0,0},{64321,4,0,32},{40860, 0,0,0},{64321,4,0,32},{40864,0,0,0},{15997,4,0,32},{16019,4,0,32},{7279,2,0,32}, {0,2,0,55},{7280,2,0,32},{0,2,0,55},{64320,4,0,32},{54081,0,0,0},{64320,4,0,32}, {54084,0,0,0},{64320,4,0,32},{54085,0,0,0},{16016,4,0,32},{15998,4,0,32},{15991, 14,0,32},{0,2,0,55},{15992,14,0,32},{0,2,0,55},{15993,14,0,32},{0,2,0,55}, {15994,14,0,32},{0,2,0,55},{15995,14,0,32},{0,2,0,55},{15996,14,0,32},{0,2,0, 55},{15997,14,0,32},{0,2,0,55},{15998,14,0,32},{0,2,0,55},{15999,14,0,32},{0,2, 0,55},{16000,14,0,32},{0,2,0,55},{16001,14,0,32},{0,2,0,55},{16002,14,0,32},{0, 2,0,55},{16003,14,0,32},{0,2,0,55},{16004,14,0,32},{0,2,0,55},{16005,14,0,32}, {0,2,0,55},{16011,14,0,32},{0,2,0,55},{16011,14,0,32},{0,2,0,56},{16012,14,0, 32},{0,2,0,55},{16012,14,0,32},{0,2,0,56},{16013,14,0,32},{0,2,0,55},{16013,14, 0,32},{0,2,0,56},{16014,14,0,32},{0,2,0,55},{16014,14,0,32},{0,2,0,56},{16015, 14,0,32},{0,2,0,55},{16015,14,0,32},{0,2,0,56},{15987,14,0,32},{0,2,0,55},{7282, 2,0,32},{0,2,0,55},{16023,22,0,32},{16025,22,0,32},{15991,17,0,32},{0,2,0,55}, {15992,17,0,32},{0,2,0,55},{15993,17,0,32},{0,2,0,55},{15994,17,0,32},{0,2,0, 55},{15995,17,0,32},{0,2,0,55},{15996,17,0,32},{0,2,0,55},{15997,17,0,32},{0,2, 0,55},{15998,17,0,32},{0,2,0,55},{15999,17,0,32},{0,2,0,55},{16000,17,0,32},{0, 2,0,55},{16001,17,0,32},{0,2,0,55},{16002,17,0,32},{0,2,0,55},{16003,17,0,32}, {0,2,0,55},{16004,17,0,32},{0,2,0,55},{16005,17,0,32},{0,2,0,55},{16011,17,0, 32},{0,2,0,55},{16011,17,0,32},{0,2,0,56},{16012,17,0,32},{0,2,0,55},{16012,17, 0,32},{0,2,0,56},{16013,17,0,32},{0,2,0,55},{16013,17,0,32},{0,2,0,56},{16014, 17,0,32},{0,2,0,55},{16014,17,0,32},{0,2,0,56},{16015,17,0,32},{0,2,0,55}, {16015,17,0,32},{0,2,0,56},{15987,17,0,32},{0,2,0,55},{16029,17,0,32},{0,2,0, 55},{16030,17,0,32},{0,2,0,55},{16031,17,0,32},{0,2,0,55},{16032,17,0,32},{0,2, 0,55},{7284,2,0,32},{0,2,0,55},{15995,22,0,32},{16005,22,0,32},{64320,20,0,32}, {52736,0,0,0},{64320,20,0,32},{52876,0,0,0},{64320,20,0,32},{52745,0,0,0}, {64320,20,0,32},{55003,0,0,0},{64320,20,0,32},{52746,0,0,0},{64320,20,0,32}, {52781,0,0,0},{64320,20,0,32},{52747,0,0,0},{64320,20,0,32},{62770,0,0,0}, {64320,20,0,32},{52825,0,0,0},{64320,20,0,32},{52761,0,0,0},{64320,20,0,32}, {52737,0,0,0},{64320,20,0,32},{55593,0,0,0},{64320,20,0,32},{55088,0,0,0}, {64320,20,0,32},{52922,0,0,0},{16320,4,0,32},{0,4,0,274},{16342,4,0,32},{0,4,0, 274},{16334,4,0,32},{0,4,0,274},{16329,4,0,32},{0,4,0,274},{16353,4,0,32},{0,4, 0,274},{16349,4,0,32},{0,4,0,274},{16368,4,0,32},{0,4,0,275},{16348,4,0,32},{0, 4,0,274},{16367,4,0,32},{0,4,0,274},{16368,4,0,32},{0,4,0,274},{16354,4,0,32}, {0,4,0,274},{16356,4,0,32},{0,4,0,274},{16367,22,0,32},{0,22,0,274},{792,4,1, 32},{15628,4,0,32},{793,4,1,32},{792,4,1,32},{15630,4,0,32},{793,4,1,32},{792,4, 1,32},{15631,4,0,32},{793,4,1,32},{792,4,1,32},{15633,4,0,32},{793,4,1,32},{792, 4,1,32},{15634,4,0,32},{793,4,1,32},{792,4,1,32},{15635,4,0,32},{793,4,1,32}, {792,4,1,32},{15637,4,0,32},{793,4,1,32},{792,4,1,32},{15639,4,0,32},{793,4,1, 32},{792,4,1,32},{15640,4,0,32},{793,4,1,32},{792,4,1,32},{15642,4,0,32},{793,4, 1,32},{792,4,1,32},{15643,4,0,32},{793,4,1,32},{792,4,1,32},{15644,4,0,32},{793, 4,1,32},{792,4,1,32},{15645,4,0,32},{793,4,1,32},{792,4,1,32},{15646,4,0,32}, {793,4,1,32},{792,4,1,32},{15628,4,0,32},{15754,4,0,32},{793,4,1,32},{792,4,1, 32},{15630,4,0,32},{15754,4,0,32},{793,4,1,32},{792,4,1,32},{15631,4,0,32}, {15754,4,0,32},{793,4,1,32},{792,4,1,32},{15633,4,0,32},{15754,4,0,32},{793,4,1, 32},{792,4,1,32},{15634,4,0,32},{15754,4,0,32},{793,4,1,32},{792,4,1,32},{15635, 4,0,32},{15754,4,0,32},{793,4,1,32},{792,4,1,32},{15637,4,0,32},{15754,4,0,32}, {793,4,1,32},{792,4,1,32},{15639,4,0,32},{15754,4,0,32},{793,4,1,32},{792,4,1, 32},{15640,4,0,32},{15754,4,0,32},{793,4,1,32},{792,4,1,32},{15642,4,0,32}, {15754,4,0,32},{793,4,1,32},{792,4,1,32},{15643,4,0,32},{15754,4,0,32},{793,4,1, 32},{792,4,1,32},{15644,4,0,32},{15754,4,0,32},{793,4,1,32},{792,4,1,32},{15645, 4,0,32},{15754,4,0,32},{793,4,1,32},{792,4,1,32},{15646,4,0,32},{15754,4,0,32}, {793,4,1,32},{792,4,1,32},{15640,4,0,32},{15767,4,0,32},{793,4,1,32},{792,4,1, 32},{15639,4,0,32},{15762,4,0,32},{15640,4,0,32},{15758,4,0,32},{15851,4,0,32}, {793,4,1,32},{792,4,1,32},{15639,4,0,32},{15762,4,0,32},{15646,4,0,32},{15767,4, 0,32},{793,4,1,32},{792,4,1,32},{64320,4,0,32},{52736,0,0,0},{793,4,1,32},{792, 4,1,32},{64320,4,0,32},{52876,0,0,0},{793,4,1,32},{792,4,1,32},{64320,4,0,32}, {52745,0,0,0},{793,4,1,32},{792,4,1,32},{64320,4,0,32},{55003,0,0,0},{793,4,1, 32},{792,4,1,32},{64320,4,0,32},{52884,0,0,0},{793,4,1,32},{792,4,1,32},{64320, 4,0,32},{53613,0,0,0},{793,4,1,32},{792,4,1,32},{64320,4,0,32},{52739,0,0,0}, {793,4,1,32},{792,4,1,32},{64320,4,0,32},{53611,0,0,0},{793,4,1,32},{792,4,1, 32},{64320,4,0,32},{52829,0,0,0},{793,4,1,32},{792,4,1,32},{64320,4,0,32}, {54081,0,0,0},{793,4,1,32},{792,4,1,32},{64320,4,0,32},{59144,0,0,0},{793,4,1, 32},{792,4,1,32},{64320,4,0,32},{61547,0,0,0},{793,4,1,32},{792,4,1,32},{64320, 4,0,32},{60468,0,0,0},{793,4,1,32},{792,4,1,32},{64320,4,0,32},{59176,0,0,0}, {793,4,1,32},{792,4,1,32},{64321,4,0,32},{37329,0,0,0},{793,4,1,32},{792,4,1, 32},{64320,4,0,32},{55071,0,0,0},{793,4,1,32},{792,4,1,32},{64320,4,0,32}, {58853,0,0,0},{793,4,1,32},{792,4,1,32},{64320,4,0,32},{59434,0,0,0},{793,4,1, 32},{792,4,1,32},{64320,4,0,32},{59145,0,0,0},{793,4,1,32},{792,4,1,32},{64320, 4,0,32},{63806,0,0,0},{793,4,1,32},{792,4,1,32},{64320,4,0,32},{54285,0,0,0}, {793,4,1,32},{792,4,1,32},{64320,4,0,32},{62073,0,0,0},{793,4,1,32},{792,4,1, 32},{64321,4,0,32},{36001,0,0,0},{793,4,1,32},{792,4,1,32},{64320,4,0,32}, {63837,0,0,0},{793,4,1,32},{792,4,1,32},{64320,4,0,32},{53940,0,0,0},{793,4,1, 32},{792,4,1,32},{64320,4,0,32},{52963,0,0,0},{793,4,1,32},{792,4,1,32},{64320, 4,0,32},{54396,0,0,0},{793,4,1,32},{792,4,1,32},{64320,4,0,32},{56166,0,0,0}, {793,4,1,32},{792,4,1,32},{64320,4,0,32},{63203,0,0,0},{793,4,1,32},{792,4,1, 32},{64320,4,0,32},{52993,0,0,0},{793,4,1,32},{792,4,1,32},{64321,4,0,32}, {36039,0,0,0},{793,4,1,32},{792,4,1,32},{64320,4,0,32},{54100,0,0,0},{793,4,1, 32},{792,4,1,32},{64320,4,0,32},{63853,0,0,0},{793,4,1,32},{792,4,1,32},{64320, 4,0,32},{53009,0,0,0},{793,4,1,32},{792,4,1,32},{64321,4,0,32},{33258,0,0,0}, {793,4,1,32},{792,4,1,32},{64321,4,0,32},{33267,0,0,0},{793,4,1,32},{64320,6,0, 32},{54607,0,0,0},{64320,6,0,32},{56956,0,0,0},{64320,6,0,32},{58759,0,0,0}, {64320,6,0,32},{64399,0,0,0},{7332,6,0,32},{7331,6,0,32},{7333,6,0,32},{7331,6, 0,32},{7334,6,0,32},{7331,6,0,32},{7335,6,0,32},{7331,6,0,32},{7336,6,0,32}, {7331,6,0,32},{7337,6,0,32},{7331,6,0,32},{7338,6,0,32},{7331,6,0,32},{7339,6,0, 32},{7331,6,0,32},{7794,29,0,32},{7931,29,0,32},{7440,29,0,32},{7333,6,0,32}, {7332,6,0,32},{7333,6,0,32},{7333,6,0,32},{7333,6,0,32},{7334,6,0,32},{7333,6,0, 32},{7335,6,0,32},{7333,6,0,32},{7336,6,0,32},{7333,6,0,32},{7337,6,0,32},{7333, 6,0,32},{7338,6,0,32},{7333,6,0,32},{7339,6,0,32},{7333,6,0,32},{7340,6,0,32}, {7334,6,0,32},{7331,6,0,32},{7334,6,0,32},{7332,6,0,32},{7334,6,0,32},{7333,6,0, 32},{7334,6,0,32},{7334,6,0,32},{7334,6,0,32},{7335,6,0,32},{7334,6,0,32},{7336, 6,0,32},{15628,6,0,32},{15754,6,0,32},{15630,6,0,32},{15754,6,0,32},{15631,6,0, 32},{15754,6,0,32},{15633,6,0,32},{15754,6,0,32},{15634,6,0,32},{15754,6,0,32}, {15635,6,0,32},{15754,6,0,32},{15637,6,0,32},{15754,6,0,32},{15639,6,0,32}, {15754,6,0,32},{15640,6,0,32},{15754,6,0,32},{15642,6,0,32},{15754,6,0,32}, {15643,6,0,32},{15754,6,0,32},{15644,6,0,32},{15754,6,0,32},{15645,6,0,32}, {15754,6,0,32},{15646,6,0,32},{15754,6,0,32},{15642,6,0,32},{15754,6,0,32}, {15863,6,0,32},{15628,6,0,32},{15762,6,0,32},{15640,6,0,32},{15767,6,0,32}, {15639,6,0,32},{15773,6,0,32},{15639,6,0,32},{15767,6,0,32},{64320,6,0,32}, {52736,0,0,0},{64320,6,0,32},{52876,0,0,0},{64320,6,0,32},{52745,0,0,0},{64320, 6,0,32},{55003,0,0,0},{64320,6,0,32},{52884,0,0,0},{64320,6,0,32},{53613,0,0,0}, {64320,6,0,32},{52739,0,0,0},{64320,6,0,32},{53611,0,0,0},{64320,6,0,32},{52829, 0,0,0},{64320,6,0,32},{54081,0,0,0},{64320,6,0,32},{59144,0,0,0},{64320,6,0,32}, {61547,0,0,0},{64320,6,0,32},{60468,0,0,0},{64320,6,0,32},{59176,0,0,0},{64321, 6,0,32},{37329,0,0,0},{64320,6,0,32},{55071,0,0,0},{64320,6,0,32},{58853,0,0,0}, {64320,6,0,32},{59434,0,0,0},{64320,6,0,32},{59145,0,0,0},{64320,6,0,32},{63806, 0,0,0},{64320,6,0,32},{54285,0,0,0},{64320,6,0,32},{62073,0,0,0},{64321,6,0,32}, {36001,0,0,0},{64320,6,0,32},{63837,0,0,0},{64320,6,0,32},{53940,0,0,0},{64320, 6,0,32},{63960,0,0,0},{64320,6,0,32},{62775,0,0,0},{64320,6,0,32},{55667,0,0,0}, {64321,6,0,32},{36969,0,0,0},{64320,6,0,32},{53546,0,0,0},{64320,6,0,32},{54128, 0,0,0},{64320,6,0,32},{60648,0,0,0},{64321,6,0,32},{38917,0,0,0},{64320,6,0,32}, {53009,0,0,0},{64320,6,0,32},{53657,0,0,0},{64320,6,0,32},{60259,0,0,0},{64320, 6,0,32},{52746,0,0,0},{64320,6,0,32},{52781,0,0,0},{64320,6,0,32},{52747,0,0,0}, {64320,6,0,32},{56806,0,0,0},{64320,6,0,32},{54259,0,0,0},{64320,6,0,32},{54075, 0,0,0},{64320,6,0,32},{56215,0,0,0},{64320,6,0,32},{56166,0,0,0},{64320,6,0,32}, {63203,0,0,0},{64320,6,0,32},{52993,0,0,0},{64321,6,0,32},{36039,0,0,0},{64320, 6,0,32},{54100,0,0,0},{64320,6,0,32},{55580,0,0,0},{7334,6,0,32},{7337,6,0,32}, {7334,6,0,32},{7338,6,0,32},{7334,6,0,32},{7339,6,0,32},{7334,6,0,32},{7340,6,0, 32},{7335,6,0,32},{7331,6,0,32},{7335,6,0,32},{7332,6,0,32},{7335,6,0,32},{7333, 6,0,32},{7335,6,0,32},{7334,6,0,32},{7335,6,0,32},{7335,6,0,32},{7335,6,0,32}, {7336,6,0,32},{7335,6,0,32},{7337,6,0,32},{7335,6,0,32},{7338,6,0,32},{7335,6,0, 32},{7339,6,0,32},{7335,6,0,32},{7340,6,0,32},{7336,6,0,32},{7331,6,0,32},{7332, 4,0,32},{64320,4,0,32},{59144,0,0,0},{7333,4,0,32},{64320,4,0,32},{59144,0,0,0}, {7334,4,0,32},{64320,4,0,32},{59144,0,0,0},{7335,4,0,32},{64320,4,0,32},{59144, 0,0,0},{7336,4,0,32},{64320,4,0,32},{59144,0,0,0},{7337,4,0,32},{64320,4,0,32}, {59144,0,0,0},{7338,4,0,32},{64320,4,0,32},{59144,0,0,0},{7339,4,0,32},{64320,4, 0,32},{59144,0,0,0},{7340,4,0,32},{64320,4,0,32},{59144,0,0,0},{7332,4,0,32}, {7331,4,0,32},{64320,4,0,32},{59144,0,0,0},{7332,4,0,32},{7332,4,0,32},{64320,4, 0,32},{59144,0,0,0},{7332,4,0,32},{7333,4,0,32},{64320,4,0,32},{59144,0,0,0}, {7550,29,0,32},{7514,28,0,32},{7440,28,0,32},{7833,28,0,32},{7514,28,0,32}, {7440,28,0,32},{8009,29,0,32},{7645,29,0,32},{7931,29,0,32},{7413,29,0,32}, {15985,28,0,32},{16011,28,0,32},{0,28,0,56},{7283,28,0,32},{16005,28,0,32}, {15985,28,0,32},{16026,28,0,32},{16013,28,0,32},{15985,28,0,32},{15985,28,0,32}, {16033,28,0,32},{16014,28,0,32},{0,28,0,56},{15985,28,0,32},{15985,28,0,32}, {7283,28,0,32},{16026,28,0,32},{15986,28,0,32},{16007,28,0,32},{16033,28,0,32}, {15993,28,0,32},{0,28,0,55},{15986,28,0,32},{16033,28,0,32},{16002,28,0,32}, {15987,28,0,32},{15990,28,0,32},{16033,28,0,32},{15989,28,0,32},{15998,28,0,32}, {15993,28,0,32},{7283,28,0,32},{16005,28,0,32},{0,28,0,55},{15989,28,0,32}, {7283,28,0,32},{15991,28,0,32},{7283,28,0,32},{15990,28,0,32},{16033,28,0,32}, {15998,28,0,32},{15990,28,0,32},{7283,28,0,32},{16018,28,0,32},{15991,28,0,32}, {15986,28,0,32},{16025,28,0,32},{15991,28,0,32},{16024,28,0,32},{16003,28,0,32}, {16005,28,0,32},{15991,28,0,32},{16028,28,0,32},{16025,28,0,32},{7283,28,0,32}, {15991,28,0,32},{0,28,0,55},{16028,28,0,32},{16033,28,0,32},{15991,28,0,32},{0, 28,0,55},{16033,28,0,32},{16016,28,0,32},{15992,28,0,32},{0,28,0,55},{15991,28, 0,32},{0,28,0,55},{15992,28,0,32},{0,28,0,55},{16007,28,0,32},{7283,28,0,32}, {15992,28,0,32},{16022,28,0,32},{16025,28,0,32},{7283,28,0,32},{15992,28,0,32}, {0,28,0,55},{16026,28,0,32},{16001,28,0,32},{0,28,0,55},{7283,28,0,32},{15992, 28,0,32},{16028,28,0,32},{15992,28,0,32},{16028,28,0,32},{15993,28,0,32},{0,28, 0,55},{16024,28,0,32},{16018,28,0,32},{15992,28,0,32},{16028,28,0,32},{16019,28, 0,32},{7283,28,0,32},{16005,28,0,32},{16026,28,0,32},{15992,28,0,32},{16028,28, 0,32},{16029,28,0,32},{16003,28,0,32},{16005,28,0,32},{15993,28,0,32},{0,28,0, 55},{16024,28,0,32},{16018,28,0,32},{15993,28,0,32},{0,28,0,55},{16024,28,0,32}, {16018,28,0,32},{16005,28,0,32},{16033,28,0,32},{15993,28,0,32},{16026,28,0,32}, {15999,28,0,32},{0,28,0,55},{15986,28,0,32},{16028,28,0,32},{15993,28,0,32}, {16028,28,0,32},{7283,28,0,32},{16009,28,0,32},{15994,28,0,32},{7283,28,0,32}, {15998,28,0,32},{15995,28,0,32},{16026,28,0,32},{16006,28,0,32},{15995,28,0,32}, {7283,28,0,32},{16015,28,0,32},{0,28,0,56},{15996,28,0,32},{15986,28,0,32}, {15993,28,0,32},{16026,28,0,32},{15996,28,0,32},{16033,28,0,32},{16002,28,0,32}, {7283,28,0,32},{16018,28,0,32},{15997,28,0,32},{16025,28,0,32},{16033,28,0,32}, {15993,28,0,32},{0,28,0,55},{15999,28,0,32},{16033,28,0,32},{16002,28,0,32}, {15999,28,0,32},{16033,28,0,32},{16005,28,0,32},{16001,28,0,32},{0,28,0,55}, {7283,28,0,32},{15998,28,0,32},{16004,28,0,32},{0,28,0,55},{15997,28,0,32}, {16005,28,0,32},{0,28,0,55},{16026,28,0,32},{16005,28,0,32},{16033,28,0,32}, {16006,28,0,32},{16010,28,0,32},{16010,28,0,32},{16003,28,0,32},{16005,28,0,32}, {16011,28,0,32},{15986,28,0,32},{16003,28,0,32},{16011,28,0,32},{0,28,0,56}, {7283,28,0,32},{15999,28,0,32},{16033,28,0,32},{16005,28,0,32},{16011,28,0,32}, {0,28,0,56},{7283,28,0,32},{16003,28,0,32},{16011,28,0,32},{0,28,0,55},{7283,28, 0,32},{16027,28,0,32},{16026,28,0,32},{16012,28,0,32},{0,28,0,56},{15985,28,0, 32},{15998,28,0,32},{16005,28,0,32},{16026,28,0,32},{16012,28,0,32},{0,28,0,56}, {15993,28,0,32},{16026,28,0,32},{16012,28,0,32},{0,28,0,56},{15995,28,0,32}, {16012,28,0,32},{0,28,0,55},{16026,28,0,32},{16013,28,0,32},{15985,28,0,32}, {16024,28,0,32},{16003,28,0,32},{16005,28,0,32},{0,28,0,55},{16013,28,0,32}, {15986,28,0,32},{7283,28,0,32},{16005,28,0,32},{16013,28,0,32},{0,28,0,55}, {16003,28,0,32},{15997,28,0,32},{15989,28,0,32},{16026,28,0,32},{16013,28,0,32}, {16024,28,0,32},{16033,28,0,32},{16014,28,0,32},{15993,28,0,32},{16001,28,0,32}, {7283,28,0,32},{16026,28,0,32},{16014,28,0,32},{0,28,0,56},{16000,28,0,32}, {16014,28,0,32},{0,28,0,56},{16007,28,0,32},{16012,28,0,32},{16014,28,0,32}, {16026,28,0,32},{16003,28,0,32},{16014,28,0,32},{0,28,0,56},{16033,28,0,32}, {15998,28,0,32},{16014,28,0,32},{0,28,0,56},{7283,28,0,32},{15997,28,0,32},{0, 28,0,55},{16014,28,0,32},{0,28,0,55},{7283,28,0,32},{16001,28,0,32},{16015,28,0, 32},{0,28,0,56},{15986,28,0,32},{16033,28,0,32},{16005,28,0,32},{16015,28,0,32}, {0,28,0,55},{16026,28,0,32},{16005,28,0,32},{16015,28,0,32},{16033,28,0,32}, {16015,28,0,32},{0,28,0,56},{16033,28,0,32},{16005,28,0,32},{0,28,0,55},{16015, 28,0,32},{7283,28,0,32},{16026,28,0,32},{16015,28,0,32},{7283,28,0,32},{16033, 28,0,32},{16016,28,0,32},{15986,28,0,32},{15993,28,0,32},{16028,28,0,32},{16016, 28,0,32},{15986,28,0,32},{16026,28,0,32},{16016,28,0,32},{16003,28,0,32},{16011, 28,0,32},{16016,28,0,32},{16026,28,0,32},{15993,28,0,32},{16016,28,0,32},{16033, 28,0,32},{15997,28,0,32},{16023,28,0,32},{16033,28,0,32},{16017,28,0,32},{15993, 28,0,32},{16028,28,0,32},{16033,28,0,32},{16017,28,0,32},{16025,28,0,32},{16017, 28,0,32},{16025,28,0,32},{16011,28,0,32},{0,28,0,55},{7283,28,0,32},{16026,28,0, 32},{16019,28,0,32},{15991,28,0,32},{0,28,0,55},{16019,28,0,32},{15991,28,0,32}, {0,28,0,55},{16005,28,0,32},{16033,28,0,32},{16019,28,0,32},{7283,28,0,32}, {16005,28,0,32},{16026,28,0,32},{16021,28,0,32},{7283,28,0,32},{16005,28,0,32}, {0,28,0,55},{16021,28,0,32},{7283,28,0,32},{16026,28,0,32},{16022,28,0,32}, {15985,28,0,32},{16033,28,0,32},{16025,28,0,32},{16003,28,0,32},{16005,28,0,32}, {16026,28,0,32},{16025,28,0,32},{16024,28,0,32},{16026,28,0,32},{16012,28,0,32}, {0,28,0,56},{7283,28,0,32},{16026,28,0,32},{7283,28,0,32},{16013,28,0,32},{0,28, 0,55},{16026,28,0,32},{16027,28,0,32},{16018,28,0,32},{16027,28,0,32},{16033,28, 0,32},{16005,28,0,32},{15994,28,0,32},{0,28,0,55},{16033,28,0,32},{16029,28,0, 32},{16003,28,0,32},{16005,28,0,32},{7331,4,0,32},{64320,4,0,32},{61625,0,0,0}, {7332,4,0,32},{64320,4,0,32},{61625,0,0,0},{7333,4,0,32},{64320,4,0,32},{61625, 0,0,0},{7334,4,0,32},{64320,4,0,32},{61625,0,0,0},{7335,4,0,32},{64320,4,0,32}, {61625,0,0,0},{7336,4,0,32},{64320,4,0,32},{61625,0,0,0},{7337,4,0,32},{64320,4, 0,32},{61625,0,0,0},{7338,4,0,32},{64320,4,0,32},{61625,0,0,0},{7339,4,0,32}, {64320,4,0,32},{61625,0,0,0},{7340,4,0,32},{64320,4,0,32},{61625,0,0,0},{7332,4, 0,32},{7331,4,0,32},{64320,4,0,32},{61625,0,0,0},{7332,4,0,32},{7332,4,0,32}, {64320,4,0,32},{61625,0,0,0},{7332,4,0,32},{7333,4,0,32},{64320,4,0,32},{61625, 0,0,0},{7332,4,0,32},{7334,4,0,32},{64320,4,0,32},{61625,0,0,0},{7332,4,0,32}, {7335,4,0,32},{64320,4,0,32},{61625,0,0,0},{7332,4,0,32},{7336,4,0,32},{64320,4, 0,32},{61625,0,0,0},{7332,4,0,32},{7337,4,0,32},{64320,4,0,32},{61625,0,0,0}, {7332,4,0,32},{7338,4,0,32},{64320,4,0,32},{61625,0,0,0},{7332,4,0,32},{7339,4, 0,32},{64320,4,0,32},{61625,0,0,0},{7332,4,0,32},{7340,4,0,32},{64320,4,0,32}, {61625,0,0,0},{7333,4,0,32},{7331,4,0,32},{64320,4,0,32},{61625,0,0,0},{7333,4, 0,32},{7332,4,0,32},{64320,4,0,32},{61625,0,0,0},{7333,4,0,32},{7333,4,0,32}, {64320,4,0,32},{61625,0,0,0},{7333,4,0,32},{7334,4,0,32},{64320,4,0,32},{61625, 0,0,0},{7333,4,0,32},{7335,4,0,32},{64320,4,0,32},{61625,0,0,0},{7550,28,0,32}, {7794,29,0,32},{7341,28,0,32},{7413,28,0,32},{7341,28,0,32},{7341,29,0,32}, {7963,29,0,32},{7366,28,0,32},{7341,28,0,32},{7833,28,0,32},{7747,28,0,32}, {8009,29,0,32},{7794,28,0,32},{7392,28,0,32},{7413,28,0,32},{7696,28,0,32}, {7413,28,0,32},{7696,28,0,32},{7333,28,0,32},{7413,28,0,32},{7696,28,0,32}, {7334,28,0,32},{7576,29,0,32},{7963,29,0,32},{64320,28,0,32},{56947,0,0,0}, {64320,28,0,32},{57872,0,0,0},{64320,28,0,32},{58925,0,0,0},{64320,28,0,32}, {54412,0,0,0},{64320,28,0,32},{55591,0,0,0},{64320,28,0,32},{60259,0,0,0}, {64320,28,0,32},{58894,0,0,0},{64320,28,0,32},{60603,0,0,0},{64320,28,0,32}, {59434,0,0,0},{64320,28,0,32},{57103,0,0,0},{64320,28,0,32},{53018,0,0,0}, {64320,28,0,32},{63806,0,0,0},{7794,28,0,32},{7341,29,0,32},{7711,28,0,32}, {7341,29,0,32},{8241,28,0,32},{7341,29,0,32},{7696,28,0,32},{7341,29,0,32}, {7627,28,0,32},{7341,29,0,32},{7627,29,0,32},{7366,29,0,32},{7696,29,0,32}, {7366,29,0,32},{7514,29,0,32},{7366,29,0,32},{7392,28,0,32},{7341,28,0,32}, {7645,28,0,32},{7627,28,0,32},{7392,28,0,32},{7341,28,0,32},{7645,28,0,32}, {7794,28,0,32},{7499,29,0,32},{7711,28,0,32},{7499,29,0,32},{8241,28,0,32}, {7499,29,0,32},{8241,28,0,32},{7514,28,0,32},{7696,28,0,32},{7514,28,0,32}, {7627,28,0,32},{7514,28,0,32},{7550,29,0,32},{8071,28,0,32},{7627,28,0,32}, {7550,29,0,32},{8071,28,0,32},{7696,29,0,32},{7550,29,0,32},{8071,28,0,32}, {7514,29,0,32},{7550,29,0,32},{8071,28,0,32},{7931,29,0,32},{7550,29,0,32}, {8071,28,0,32},{8241,28,0,32},{7645,28,0,32},{7696,28,0,32},{7645,28,0,32}, {7413,28,0,32},{7645,28,0,32},{7627,28,0,32},{7645,28,0,32},{7499,28,0,32}, {7696,28,0,32},{7711,28,0,32},{7696,28,0,32},{8241,28,0,32},{7696,28,0,32}, {7696,28,0,32},{7696,28,0,32},{7392,28,0,32},{7696,28,0,32},{7627,28,0,32}, {7696,28,0,32},{7696,28,0,32},{7696,28,0,32},{7333,28,0,32},{7392,28,0,32}, {7696,28,0,32},{7333,28,0,32},{7696,28,0,32},{7333,28,0,32},{7627,28,0,32}, {7696,28,0,32},{7333,28,0,32},{7696,28,0,32},{7696,28,0,32},{7334,28,0,32}, {7392,28,0,32},{7696,28,0,32},{7334,28,0,32},{7696,28,0,32},{7334,28,0,32}, {7627,28,0,32},{7696,28,0,32},{7334,28,0,32},{7696,28,0,32},{1595,28,1,32}, {7895,28,0,32},{7696,28,0,32},{1595,28,1,32},{7895,28,0,32},{7333,28,0,32}, {7794,29,0,32},{7341,28,0,32},{7627,28,0,32},{7794,29,0,32},{7341,28,0,32}, {7696,29,0,32},{7794,29,0,32},{7341,28,0,32},{7514,29,0,32},{7794,29,0,32}, {7341,28,0,32},{7833,28,0,32},{7341,28,0,32},{7413,28,0,32},{7833,28,0,32}, {7341,28,0,32},{7413,28,0,32},{1595,28,1,32},{7895,28,0,32},{7833,28,0,32}, {7341,28,0,32},{7413,28,0,32},{1595,28,1,32},{7895,28,0,32},{7333,28,0,32}, {7794,28,0,32},{7895,28,0,32},{7711,28,0,32},{7895,28,0,32},{8241,28,0,32}, {7895,28,0,32},{7696,28,0,32},{7895,28,0,32},{7794,28,0,32},{8009,29,0,32}, {7711,28,0,32},{8009,29,0,32},{8241,28,0,32},{8009,29,0,32},{7696,28,0,32}, {8009,29,0,32},{7627,28,0,32},{8009,29,0,32},{7696,29,0,32},{8009,29,0,32}, {7794,28,0,32},{8027,29,0,32},{7711,28,0,32},{8027,29,0,32},{8241,28,0,32}, {8027,29,0,32},{7696,28,0,32},{8027,29,0,32},{7627,28,0,32},{8027,29,0,32}, {7696,29,0,32},{8027,29,0,32},{7627,28,0,32},{8263,29,0,32},{7696,29,0,32}, {8263,29,0,32},{7341,28,0,32},{632,28,1,32},{7696,28,0,32},{632,28,1,32},{7366, 29,0,32},{7815,28,0,32},{7392,28,0,32},{7392,28,0,32},{7392,28,0,32},{7413,28,0, 32},{7392,29,0,32},{1595,28,1,32},{7627,28,0,32},{7514,28,0,32},{7392,29,0,32}, {7747,28,0,32},{632,28,1,32},{7413,28,0,32},{7366,29,0,32},{7514,29,0,32},{8049, 28,0,32},{7550,28,0,32},{7341,28,0,32},{7550,29,0,32},{7794,29,0,32},{7576,28,0, 32},{7711,28,0,32},{7627,29,0,32},{7627,29,0,32},{7627,29,0,32},{7696,29,0,32}, {7627,28,0,32},{7931,28,0,32},{7645,28,0,32},{7696,28,0,32},{7645,28,0,32}, {7711,28,0,32},{7645,28,0,32},{7747,28,0,32},{7514,28,0,32},{7645,28,0,32}, {8037,28,0,32},{7696,28,0,32},{7366,28,0,32},{7696,28,0,32},{7576,28,0,32}, {7645,28,0,32},{7696,28,0,32},{7747,28,0,32},{7645,28,0,32},{7794,29,0,32}, {7550,29,0,32},{7794,28,0,32},{632,28,1,32},{7696,28,0,32},{632,28,1,32},{7794, 29,0,32},{7794,29,0,32},{7696,29,0,32},{7794,29,0,32},{7833,29,0,32},{7895,28,0, 32},{7833,28,0,32},{7895,29,0,32},{8009,28,0,32},{8027,29,0,32},{7366,28,0,32}, {8009,29,0,32},{1595,28,1,32},{7696,28,0,32},{7341,29,0,32},{1595,28,1,32}, {7696,28,0,32},{7332,4,0,32},{64320,4,0,32},{58853,0,0,0},{7333,4,0,32},{64320, 4,0,32},{58853,0,0,0},{7334,4,0,32},{64320,4,0,32},{58853,0,0,0},{7335,4,0,32}, {64320,4,0,32},{58853,0,0,0},{7336,4,0,32},{64320,4,0,32},{58853,0,0,0},{7337,4, 0,32},{64320,4,0,32},{58853,0,0,0},{7338,4,0,32},{64320,4,0,32},{58853,0,0,0}, {7339,4,0,32},{64320,4,0,32},{58853,0,0,0},{7340,4,0,32},{64320,4,0,32},{58853, 0,0,0},{7332,4,0,32},{7331,4,0,32},{64320,4,0,32},{58853,0,0,0},{7332,4,0,32}, {7332,4,0,32},{64320,4,0,32},{58853,0,0,0},{7332,4,0,32},{7333,4,0,32},{64320,4, 0,32},{58853,0,0,0},{7332,4,0,32},{7334,4,0,32},{64320,4,0,32},{58853,0,0,0}, {7332,4,0,32},{7335,4,0,32},{64320,4,0,32},{58853,0,0,0},{7332,4,0,32},{7336,4, 0,32},{64320,4,0,32},{58853,0,0,0},{7332,4,0,32},{7337,4,0,32},{64320,4,0,32}, {58853,0,0,0},{7332,4,0,32},{7338,4,0,32},{64320,4,0,32},{58853,0,0,0},{7332,4, 0,32},{7339,4,0,32},{64320,4,0,32},{58853,0,0,0},{7332,4,0,32},{7340,4,0,32}, {64320,4,0,32},{58853,0,0,0},{7333,4,0,32},{7331,4,0,32},{64320,4,0,32},{58853, 0,0,0},{7333,4,0,32},{7332,4,0,32},{64320,4,0,32},{58853,0,0,0},{7333,4,0,32}, {7333,4,0,32},{64320,4,0,32},{58853,0,0,0},{7333,4,0,32},{7334,4,0,32},{64320,4, 0,32},{58853,0,0,0},{7333,4,0,32},{7335,4,0,32},{64320,4,0,32},{58853,0,0,0}, {7333,4,0,32},{7336,4,0,32},{64320,4,0,32},{58853,0,0,0},{7333,4,0,32},{7337,4, 0,32},{64320,4,0,32},{58853,0,0,0},{7333,4,0,32},{7338,4,0,32},{64320,4,0,32}, {58853,0,0,0},{7333,4,0,32},{7339,4,0,32},{64320,4,0,32},{58853,0,0,0},{7333,4, 0,32},{7340,4,0,32},{64320,4,0,32},{58853,0,0,0},{7334,4,0,32},{7331,4,0,32}, {64320,4,0,32},{58853,0,0,0},{7334,4,0,32},{7332,4,0,32},{64320,4,0,32},{58853, 0,0,0},{7514,28,0,32},{7341,28,0,32},{7645,28,0,32},{64384,2,0,32},{46238,0,0, 0},{64384,2,0,32},{46265,0,0,0},{64384,2,0,32},{46267,0,0,0},{64384,2,0,32}, {46303,0,0,0},{64384,2,0,32},{46357,0,0,0},{64384,2,0,32},{46830,0,0,0},{64384, 2,0,32},{46844,0,0,0},{64384,2,0,32},{46977,0,0,0},{64384,2,0,32},{47151,0,0,0}, {64384,2,0,32},{47202,0,0,0},{64384,2,0,32},{47228,0,0,0},{64384,2,0,32},{47303, 0,0,0},{64384,2,0,32},{47331,0,0,0},{64384,2,0,32},{47388,0,0,0},{64384,2,0,32}, {47418,0,0,0},{64384,2,0,32},{47662,0,0,0},{64384,2,0,32},{47724,0,0,0},{64384, 2,0,32},{47844,0,0,0},{64384,2,0,32},{47880,0,0,0},{64384,2,0,32},{47897,0,0,0}, {64384,2,0,32},{47945,0,0,0},{64384,2,0,32},{48029,0,0,0},{64384,2,0,32},{48152, 0,0,0},{64384,2,0,32},{48206,0,0,0},{64384,2,0,32},{48435,0,0,0},{64384,2,0,32}, {48534,0,0,0},{64384,2,0,32},{48812,0,0,0},{64384,2,0,32},{48824,0,0,0},{64384, 2,0,32},{48923,0,0,0},{64384,2,0,32},{49148,0,0,0},{64384,2,0,32},{49160,0,0,0}, {64384,2,0,32},{49176,0,0,0},{64384,2,0,32},{49209,0,0,0},{64384,2,0,32},{49222, 0,0,0},{64384,2,0,32},{49302,0,0,0},{64384,2,0,32},{49379,0,0,0},{64384,2,0,32}, {49455,0,0,0},{64384,2,0,32},{49666,0,0,0},{64384,2,0,32},{49703,0,0,0},{64384, 2,0,32},{49824,0,0,0},{64384,2,0,32},{49921,0,0,0},{64384,2,0,32},{49972,0,0,0}, {64384,2,0,32},{50009,0,0,0},{64384,2,0,32},{50133,0,0,0},{64384,2,0,32},{50137, 0,0,0},{64384,2,0,32},{50187,0,0,0},{64384,2,0,32},{50283,0,0,0},{64384,2,0,32}, {50475,0,0,0},{64384,2,0,32},{50525,0,0,0},{64384,2,0,32},{50529,0,0,0},{64384, 2,0,32},{50539,0,0,0},{64384,2,0,32},{50647,0,0,0},{64384,2,0,32},{50681,0,0,0}, {64384,2,0,32},{50741,0,0,0},{64384,2,0,32},{50878,0,0,0},{64384,2,0,32},{50887, 0,0,0},{64384,2,0,32},{51605,0,0,0},{64384,2,0,32},{51686,0,0,0},{64384,2,0,32}, {51822,0,0,0},{64384,2,0,32},{51830,0,0,0},{64384,2,0,32},{51890,0,0,0},{64384, 2,0,32},{52019,0,0,0},{64384,2,0,32},{52174,0,0,0},{64384,2,0,32},{52430,0,0,0}, {64384,2,0,32},{52461,0,0,0},{64384,2,0,32},{52472,0,0,0},{64384,2,0,32},{52566, 0,0,0},{64320,2,0,32},{52749,0,0,0},{64320,2,0,32},{52774,0,0,0},{64320,2,0,32}, {52786,0,0,0},{64320,2,0,32},{52792,0,0,0},{64320,2,0,32},{52793,0,0,0},{64320, 2,0,32},{52797,0,0,0},{64320,2,0,32},{52801,0,0,0},{64320,2,0,32},{52866,0,0,0}, {64320,2,0,32},{52870,0,0,0},{64320,2,0,32},{52910,0,0,0},{64320,2,0,32},{52928, 0,0,0},{64320,2,0,32},{52940,0,0,0},{64320,2,0,32},{52964,0,0,0},{64320,2,0,32}, {53088,0,0,0},{64320,2,0,32},{53120,0,0,0},{64320,2,0,32},{53126,0,0,0},{64320, 2,0,32},{53131,0,0,0},{64320,2,0,32},{53166,0,0,0},{64320,2,0,32},{53179,0,0,0}, {64320,2,0,32},{53183,0,0,0},{64320,2,0,32},{53250,0,0,0},{64320,2,0,32},{53291, 0,0,0},{64320,2,0,32},{53370,0,0,0},{64320,2,0,32},{53401,0,0,0},{64320,2,0,32}, {53455,0,0,0},{64320,2,0,32},{53466,0,0,0},{64320,2,0,32},{53479,0,0,0},{64320, 2,0,32},{53568,0,0,0},{64320,2,0,32},{53573,0,0,0},{64320,2,0,32},{53581,0,0,0}, {64320,2,0,32},{53588,0,0,0},{64320,2,0,32},{53604,0,0,0},{64320,2,0,32},{53607, 0,0,0},{64320,2,0,32},{53608,0,0,0},{64320,2,0,32},{53609,0,0,0},{64320,2,0,32}, {53613,0,0,0},{64320,2,0,32},{53623,0,0,0},{64320,2,0,32},{53632,0,0,0},{64320, 2,0,32},{53645,0,0,0},{64320,2,0,32},{53650,0,0,0},{64320,2,0,32},{53653,0,0,0}, {64320,2,0,32},{53655,0,0,0},{64320,2,0,32},{53668,0,0,0},{64320,2,0,32},{53676, 0,0,0},{64320,2,0,32},{53685,0,0,0},{64320,2,0,32},{53687,0,0,0},{64320,2,0,32}, {53705,0,0,0},{64320,2,0,32},{53708,0,0,0},{64320,2,0,32},{53724,0,0,0},{64320, 2,0,32},{53726,0,0,0},{64320,2,0,32},{53749,0,0,0},{64320,2,0,32},{53763,0,0,0}, {64320,2,0,32},{53767,0,0,0},{64320,2,0,32},{53783,0,0,0},{64320,2,0,32},{53801, 0,0,0},{64320,2,0,32},{53818,0,0,0},{64320,2,0,32},{53819,0,0,0},{64320,2,0,32}, {53830,0,0,0},{64320,2,0,32},{53874,0,0,0},{64320,2,0,32},{53879,0,0,0},{64320, 2,0,32},{53897,0,0,0},{64320,2,0,32},{53915,0,0,0},{64320,2,0,32},{53923,0,0,0}, {64320,2,0,32},{53939,0,0,0},{64320,2,0,32},{53959,0,0,0},{64320,2,0,32},{53961, 0,0,0},{64320,2,0,32},{53970,0,0,0},{64320,2,0,32},{53982,0,0,0},{64320,2,0,32}, {53988,0,0,0},{64320,2,0,32},{54005,0,0,0},{64320,2,0,32},{54010,0,0,0},{64320, 2,0,32},{54021,0,0,0},{64320,2,0,32},{54022,0,0,0},{64320,2,0,32},{54039,0,0,0}, {64320,2,0,32},{54079,0,0,0},{64320,2,0,32},{54089,0,0,0},{64320,2,0,32},{54097, 0,0,0},{64320,2,0,32},{54106,0,0,0},{64320,2,0,32},{54131,0,0,0},{64320,2,0,32}, {54133,0,0,0},{64320,2,0,32},{54141,0,0,0},{64320,2,0,32},{54143,0,0,0},{64320, 2,0,32},{54211,0,0,0},{64320,2,0,32},{54218,0,0,0},{64320,2,0,32},{54239,0,0,0}, {64320,2,0,32},{54245,0,0,0},{64320,2,0,32},{54251,0,0,0},{64320,2,0,32},{54257, 0,0,0},{64320,2,0,32},{54278,0,0,0},{64320,2,0,32},{54287,0,0,0},{64320,2,0,32}, {54301,0,0,0},{64320,2,0,32},{54328,0,0,0},{64320,2,0,32},{54338,0,0,0},{64320, 2,0,32},{54344,0,0,0},{64320,2,0,32},{54376,0,0,0},{64320,2,0,32},{54430,0,0,0}, {64320,2,0,32},{54434,0,0,0},{64320,2,0,32},{54461,0,0,0},{64320,2,0,32},{54518, 0,0,0},{64320,2,0,32},{54544,0,0,0},{64320,2,0,32},{54611,0,0,0},{64320,2,0,32}, {54613,0,0,0},{64320,2,0,32},{54627,0,0,0},{64320,2,0,32},{54660,0,0,0},{64320, 2,0,32},{54663,0,0,0},{64320,2,0,32},{54681,0,0,0},{64320,2,0,32},{54685,0,0,0}, {64320,2,0,32},{54699,0,0,0},{64320,2,0,32},{54707,0,0,0},{64320,2,0,32},{54720, 0,0,0},{64320,2,0,32},{54722,0,0,0},{64320,2,0,32},{54754,0,0,0},{64320,2,0,32}, {54790,0,0,0},{64320,2,0,32},{54865,0,0,0},{64320,2,0,32},{54888,0,0,0},{64320, 2,0,32},{54900,0,0,0},{64320,2,0,32},{55033,0,0,0},{64320,2,0,32},{55062,0,0,0}, {64320,2,0,32},{55063,0,0,0},{64320,2,0,32},{55179,0,0,0},{64320,2,0,32},{55246, 0,0,0},{64320,2,0,32},{55284,0,0,0},{64320,2,0,32},{55309,0,0,0},{64320,2,0,32}, {55345,0,0,0},{64320,2,0,32},{55346,0,0,0},{64320,2,0,32},{55360,0,0,0},{64320, 2,0,32},{55386,0,0,0},{64320,2,0,32},{55390,0,0,0},{64320,2,0,32},{55464,0,0,0}, {64320,2,0,32},{55468,0,0,0},{64320,2,0,32},{55475,0,0,0},{64320,2,0,32},{55512, 0,0,0},{64320,2,0,32},{55519,0,0,0},{64320,2,0,32},{55534,0,0,0},{64320,2,0,32}, {55538,0,0,0},{64320,2,0,32},{55543,0,0,0},{64320,2,0,32},{55558,0,0,0},{64320, 2,0,32},{55578,0,0,0},{64320,2,0,32},{55586,0,0,0},{64320,2,0,32},{55620,0,0,0}, {64320,2,0,32},{55624,0,0,0},{64320,2,0,32},{55633,0,0,0},{64320,2,0,32},{55636, 0,0,0},{64320,2,0,32},{55650,0,0,0},{64320,2,0,32},{55667,0,0,0},{64320,2,0,32}, {55768,0,0,0},{64320,2,0,32},{55788,0,0,0},{64320,2,0,32},{55835,0,0,0},{64320, 2,0,32},{55847,0,0,0},{64320,2,0,32},{55906,0,0,0},{64320,2,0,32},{55910,0,0,0}, {64320,2,0,32},{55989,0,0,0},{64320,2,0,32},{56072,0,0,0},{64320,2,0,32},{56104, 0,0,0},{64320,2,0,32},{56126,0,0,0},{64320,2,0,32},{56197,0,0,0},{64320,2,0,32}, {56259,0,0,0},{64320,2,0,32},{56280,0,0,0},{64320,2,0,32},{56295,0,0,0},{64320, 2,0,32},{56302,0,0,0},{64320,2,0,32},{56307,0,0,0},{64320,2,0,32},{56319,0,0,0}, {64320,2,0,32},{56326,0,0,0},{64320,2,0,32},{56354,0,0,0},{64320,2,0,32},{56383, 0,0,0},{64320,2,0,32},{56416,0,0,0},{64320,2,0,32},{56418,0,0,0},{64320,2,0,32}, {56420,0,0,0},{64320,2,0,32},{56421,0,0,0},{64320,2,0,32},{56430,0,0,0},{64320, 2,0,32},{56461,0,0,0},{64320,2,0,32},{56512,0,0,0},{64320,2,0,32},{56601,0,0,0}, {64320,2,0,32},{56643,0,0,0},{64320,2,0,32},{56656,0,0,0},{64320,2,0,32},{56683, 0,0,0},{64320,2,0,32},{56686,0,0,0},{64320,2,0,32},{56700,0,0,0},{64320,2,0,32}, {56754,0,0,0},{64320,2,0,32},{56762,0,0,0},{64320,2,0,32},{56801,0,0,0},{64320, 2,0,32},{56802,0,0,0},{64320,2,0,32},{56829,0,0,0},{64320,2,0,32},{56872,0,0,0}, {64320,2,0,32},{56893,0,0,0},{64320,2,0,32},{56937,0,0,0},{64320,2,0,32},{56948, 0,0,0},{64320,2,0,32},{56998,0,0,0},{64320,2,0,32},{57008,0,0,0},{64320,2,0,32}, {57011,0,0,0},{64320,2,0,32},{57014,0,0,0},{64320,2,0,32},{57033,0,0,0},{64320, 2,0,32},{57034,0,0,0},{64320,2,0,32},{57042,0,0,0},{64320,2,0,32},{57043,0,0,0}, {64320,2,0,32},{57049,0,0,0},{64320,2,0,32},{57068,0,0,0},{64320,2,0,32},{57086, 0,0,0},{64320,2,0,32},{57092,0,0,0},{64320,2,0,32},{57122,0,0,0},{64320,2,0,32}, {57171,0,0,0},{64320,2,0,32},{57186,0,0,0},{64320,2,0,32},{57193,0,0,0},{64320, 2,0,32},{57195,0,0,0},{64320,2,0,32},{57227,0,0,0},{64320,2,0,32},{57242,0,0,0}, {64320,2,0,32},{57257,0,0,0},{64320,2,0,32},{57261,0,0,0},{64320,2,0,32},{57293, 0,0,0},{64320,2,0,32},{57303,0,0,0},{64320,2,0,32},{57333,0,0,0},{64320,2,0,32}, {57337,0,0,0},{64320,2,0,32},{57362,0,0,0},{64320,2,0,32},{57372,0,0,0},{64320, 2,0,32},{57461,0,0,0},{64320,2,0,32},{57473,0,0,0},{64320,2,0,32},{57492,0,0,0}, {64320,2,0,32},{57543,0,0,0},{64320,2,0,32},{57560,0,0,0},{64320,2,0,32},{57569, 0,0,0},{64320,2,0,32},{57608,0,0,0},{64320,2,0,32},{57668,0,0,0},{64320,2,0,32}, {57672,0,0,0},{64320,2,0,32},{57676,0,0,0},{64320,2,0,32},{57678,0,0,0},{64320, 2,0,32},{57696,0,0,0},{64320,2,0,32},{57704,0,0,0},{64320,2,0,32},{57722,0,0,0}, {64320,2,0,32},{57742,0,0,0},{64320,2,0,32},{57744,0,0,0},{64320,2,0,32},{57764, 0,0,0},{64320,2,0,32},{57775,0,0,0},{64320,2,0,32},{57778,0,0,0},{64320,2,0,32}, {57822,0,0,0},{64320,2,0,32},{57842,0,0,0},{64320,2,0,32},{57846,0,0,0},{64320, 2,0,32},{57856,0,0,0},{64320,2,0,32},{57872,0,0,0},{64320,2,0,32},{57883,0,0,0}, {64320,2,0,32},{57902,0,0,0},{64320,2,0,32},{57908,0,0,0},{64320,2,0,32},{57949, 0,0,0},{64320,2,0,32},{58033,0,0,0},{64320,2,0,32},{58057,0,0,0},{64320,2,0,32}, {58063,0,0,0},{64320,2,0,32},{58067,0,0,0},{64320,2,0,32},{58068,0,0,0},{64320, 2,0,32},{58108,0,0,0},{64320,2,0,32},{58110,0,0,0},{64320,2,0,32},{58173,0,0,0}, {64320,2,0,32},{58192,0,0,0},{64320,2,0,32},{58216,0,0,0},{64320,2,0,32},{58235, 0,0,0},{64320,2,0,32},{58243,0,0,0},{64320,2,0,32},{58272,0,0,0},{64320,2,0,32}, {58281,0,0,0},{64320,2,0,32},{58308,0,0,0},{64320,2,0,32},{58309,0,0,0},{64320, 2,0,32},{58340,0,0,0},{64320,2,0,32},{58396,0,0,0},{64320,2,0,32},{58402,0,0,0}, {64320,2,0,32},{58450,0,0,0},{64320,2,0,32},{58473,0,0,0},{64320,2,0,32},{58487, 0,0,0},{64320,2,0,32},{58494,0,0,0},{64320,2,0,32},{58522,0,0,0},{64320,2,0,32}, {58525,0,0,0},{64320,2,0,32},{58564,0,0,0},{64320,2,0,32},{58703,0,0,0},{64320, 2,0,32},{58710,0,0,0},{64320,2,0,32},{58732,0,0,0},{64320,2,0,32},{58744,0,0,0}, {64320,2,0,32},{58777,0,0,0},{64320,2,0,32},{58821,0,0,0},{64320,2,0,32},{58850, 0,0,0},{64320,2,0,32},{58851,0,0,0},{64320,2,0,32},{58899,0,0,0},{64320,2,0,32}, {58953,0,0,0},{64320,2,0,32},{58996,0,0,0},{64320,2,0,32},{59016,0,0,0},{64320, 2,0,32},{59025,0,0,0},{64320,2,0,32},{59036,0,0,0},{64320,2,0,32},{59060,0,0,0}, {64320,2,0,32},{59078,0,0,0},{64320,2,0,32},{59124,0,0,0},{64320,2,0,32},{59128, 0,0,0},{64320,2,0,32},{59136,0,0,0},{64320,2,0,32},{59159,0,0,0},{64320,2,0,32}, {59163,0,0,0},{64320,2,0,32},{59169,0,0,0},{64320,2,0,32},{59214,0,0,0},{64320, 2,0,32},{59219,0,0,0},{64320,2,0,32},{59222,0,0,0},{64320,2,0,32},{59230,0,0,0}, {64320,2,0,32},{59259,0,0,0},{64320,2,0,32},{59269,0,0,0},{64320,2,0,32},{59287, 0,0,0},{64320,2,0,32},{59379,0,0,0},{64320,2,0,32},{59386,0,0,0},{64320,2,0,32}, {59415,0,0,0},{64320,2,0,32},{59423,0,0,0},{64320,2,0,32},{59474,0,0,0},{64320, 2,0,32},{59521,0,0,0},{64320,2,0,32},{59525,0,0,0},{64320,2,0,32},{59534,0,0,0}, {64320,2,0,32},{59560,0,0,0},{64320,2,0,32},{59668,0,0,0},{64320,2,0,32},{59714, 0,0,0},{64320,2,0,32},{59811,0,0,0},{64320,2,0,32},{59882,0,0,0},{64320,2,0,32}, {59906,0,0,0},{64320,2,0,32},{59923,0,0,0},{64320,2,0,32},{60072,0,0,0},{64320, 2,0,32},{60115,0,0,0},{64320,2,0,32},{60123,0,0,0},{64320,2,0,32},{60164,0,0,0}, {64320,2,0,32},{60193,0,0,0},{64320,2,0,32},{60244,0,0,0},{64320,2,0,32},{60274, 0,0,0},{64320,2,0,32},{60279,0,0,0},{64320,2,0,32},{60281,0,0,0},{64320,2,0,32}, {60319,0,0,0},{64320,2,0,32},{60334,0,0,0},{64320,2,0,32},{60346,0,0,0},{64320, 2,0,32},{60347,0,0,0},{64320,2,0,32},{60494,0,0,0},{64320,2,0,32},{60519,0,0,0}, {64320,2,0,32},{60552,0,0,0},{64320,2,0,32},{60607,0,0,0},{64320,2,0,32},{60620, 0,0,0},{64320,2,0,32},{60621,0,0,0},{64320,2,0,32},{60645,0,0,0},{64320,2,0,32}, {60694,0,0,0},{64320,2,0,32},{60699,0,0,0},{64320,2,0,32},{60702,0,0,0},{64320, 2,0,32},{60724,0,0,0},{64320,2,0,32},{60734,0,0,0},{64320,2,0,32},{60737,0,0,0}, {64320,2,0,32},{60777,0,0,0},{64320,2,0,32},{60778,0,0,0},{64320,2,0,32},{60791, 0,0,0},{64320,2,0,32},{60792,0,0,0},{64320,2,0,32},{60805,0,0,0},{64320,2,0,32}, {60875,0,0,0},{64320,2,0,32},{60890,0,0,0},{64320,2,0,32},{60906,0,0,0},{64320, 2,0,32},{60921,0,0,0},{64320,2,0,32},{60954,0,0,0},{64320,2,0,32},{60975,0,0,0}, {64320,2,0,32},{61038,0,0,0},{64320,2,0,32},{61084,0,0,0},{64320,2,0,32},{61114, 0,0,0},{64320,2,0,32},{61127,0,0,0},{64320,2,0,32},{61131,0,0,0},{64320,2,0,32}, {61137,0,0,0},{64320,2,0,32},{61147,0,0,0},{64320,2,0,32},{61199,0,0,0},{64320, 2,0,32},{61218,0,0,0},{64320,2,0,32},{61219,0,0,0},{64320,2,0,32},{61294,0,0,0}, {64320,2,0,32},{61382,0,0,0},{64320,2,0,32},{61419,0,0,0},{64320,2,0,32},{61438, 0,0,0},{64320,2,0,32},{61467,0,0,0},{64320,2,0,32},{61470,0,0,0},{64320,2,0,32}, {61497,0,0,0},{64320,2,0,32},{61514,0,0,0},{64320,2,0,32},{61552,0,0,0},{64320, 2,0,32},{61559,0,0,0},{64320,2,0,32},{61565,0,0,0},{64320,2,0,32},{61593,0,0,0}, {64320,2,0,32},{61613,0,0,0},{64320,2,0,32},{61640,0,0,0},{64320,2,0,32},{61657, 0,0,0},{64320,2,0,32},{61765,0,0,0},{64320,2,0,32},{61769,0,0,0},{64320,2,0,32}, {61806,0,0,0},{64320,2,0,32},{61852,0,0,0},{64320,2,0,32},{61902,0,0,0},{64320, 2,0,32},{61904,0,0,0},{64320,2,0,32},{61968,0,0,0},{64320,2,0,32},{61979,0,0,0}, {64320,2,0,32},{61992,0,0,0},{64320,2,0,32},{61995,0,0,0},{64320,2,0,32},{62005, 0,0,0},{64320,2,0,32},{62032,0,0,0},{64320,2,0,32},{62050,0,0,0},{64320,2,0,32}, {62080,0,0,0},{64320,2,0,32},{62101,0,0,0},{64320,2,0,32},{62127,0,0,0},{64320, 2,0,32},{62144,0,0,0},{64320,2,0,32},{62204,0,0,0},{64320,2,0,32},{62250,0,0,0}, {64320,2,0,32},{62325,0,0,0},{64320,2,0,32},{62330,0,0,0},{64320,2,0,32},{62343, 0,0,0},{64320,2,0,32},{62347,0,0,0},{64320,2,0,32},{62373,0,0,0},{64320,2,0,32}, {62386,0,0,0},{64320,2,0,32},{62430,0,0,0},{64320,2,0,32},{62470,0,0,0},{64320, 2,0,32},{62473,0,0,0},{64320,2,0,32},{62498,0,0,0},{64320,2,0,32},{62535,0,0,0}, {64320,2,0,32},{62556,0,0,0},{64320,2,0,32},{62569,0,0,0},{64320,2,0,32},{62577, 0,0,0},{64320,2,0,32},{62597,0,0,0},{64320,2,0,32},{62601,0,0,0},{64320,2,0,32}, {62616,0,0,0},{64320,2,0,32},{62666,0,0,0},{64320,2,0,32},{62726,0,0,0},{64320, 2,0,32},{62756,0,0,0},{64320,2,0,32},{62779,0,0,0},{64320,2,0,32},{62782,0,0,0}, {64320,2,0,32},{62809,0,0,0},{64320,2,0,32},{62821,0,0,0},{64320,2,0,32},{62832, 0,0,0},{64320,2,0,32},{62946,0,0,0},{64320,2,0,32},{62992,0,0,0},{64320,2,0,32}, {63005,0,0,0},{64320,2,0,32},{63007,0,0,0},{64320,2,0,32},{63042,0,0,0},{64320, 2,0,32},{63081,0,0,0},{64320,2,0,32},{63178,0,0,0},{64320,2,0,32},{63195,0,0,0}, {64320,2,0,32},{63207,0,0,0},{64320,2,0,32},{63220,0,0,0},{64320,2,0,32},{63233, 0,0,0},{64320,2,0,32},{63262,0,0,0},{64320,2,0,32},{63263,0,0,0},{64320,2,0,32}, {63296,0,0,0},{64320,2,0,32},{63306,0,0,0},{64320,2,0,32},{63371,0,0,0},{64320, 2,0,32},{63399,0,0,0},{64320,2,0,32},{63566,0,0,0},{64320,2,0,32},{63595,0,0,0}, {64320,2,0,32},{63628,0,0,0},{64320,2,0,32},{63633,0,0,0},{64320,2,0,32},{63690, 0,0,0},{64320,2,0,32},{63692,0,0,0},{64320,2,0,32},{63739,0,0,0},{64320,2,0,32}, {63786,0,0,0},{64320,2,0,32},{63804,0,0,0},{64320,2,0,32},{63806,0,0,0},{64320, 2,0,32},{63816,0,0,0},{64320,2,0,32},{63817,0,0,0},{64320,2,0,32},{63824,0,0,0}, {64320,2,0,32},{63830,0,0,0},{64320,2,0,32},{63837,0,0,0},{64320,2,0,32},{63838, 0,0,0},{64320,2,0,32},{63845,0,0,0},{64320,2,0,32},{63871,0,0,0},{64320,2,0,32}, {63885,0,0,0},{64320,2,0,32},{63886,0,0,0},{64320,2,0,32},{63887,0,0,0},{64320, 2,0,32},{63918,0,0,0},{64320,2,0,32},{63946,0,0,0},{64320,2,0,32},{63979,0,0,0}, {64320,2,0,32},{64028,0,0,0},{64320,2,0,32},{64064,0,0,0},{64320,2,0,32},{64074, 0,0,0},{64320,2,0,32},{64079,0,0,0},{64320,2,0,32},{64129,0,0,0},{64320,2,0,32}, {64177,0,0,0},{64320,2,0,32},{64203,0,0,0},{64320,2,0,32},{64238,0,0,0},{64320, 2,0,32},{64288,0,0,0},{64320,2,0,32},{64448,0,0,0},{64320,2,0,32},{64454,0,0,0}, {64320,2,0,32},{64457,0,0,0},{64320,2,0,32},{64574,0,0,0},{64320,2,0,32},{64608, 0,0,0},{64320,2,0,32},{64635,0,0,0},{64320,2,0,32},{64658,0,0,0},{64320,2,0,32}, {64702,0,0,0},{64320,2,0,32},{64722,0,0,0},{64320,2,0,32},{64726,0,0,0},{64320, 2,0,32},{64739,0,0,0},{64320,2,0,32},{64743,0,0,0},{64320,2,0,32},{64744,0,0,0}, {64320,2,0,32},{64768,0,0,0},{64320,2,0,32},{64784,0,0,0},{64320,2,0,32},{64802, 0,0,0},{64320,2,0,32},{64815,0,0,0},{64320,2,0,32},{64859,0,0,0},{64320,2,0,32}, {64867,0,0,0},{64320,2,0,32},{64928,0,0,0},{64320,2,0,32},{64958,0,0,0},{64320, 2,0,32},{64967,0,0,0},{64320,2,0,32},{65012,0,0,0},{64320,2,0,32},{65026,0,0,0}, {64320,2,0,32},{65033,0,0,0},{64320,2,0,32},{65079,0,0,0},{64320,2,0,32},{65089, 0,0,0},{64320,2,0,32},{65093,0,0,0},{64320,2,0,32},{65342,0,0,0},{64320,2,0,32}, {65394,0,0,0},{64320,2,0,32},{65401,0,0,0},{64320,2,0,32},{65402,0,0,0},{64320, 2,0,32},{65413,0,0,0},{64320,2,0,32},{65429,0,0,0},{64320,2,0,32},{65434,0,0,0}, {64320,2,0,32},{65469,0,0,0},{64320,2,0,32},{65530,0,0,0},{64321,2,0,32},{32769, 0,0,0},{64321,2,0,32},{32773,0,0,0},{64321,2,0,32},{32838,0,0,0},{64321,2,0,32}, {32864,0,0,0},{64321,2,0,32},{32879,0,0,0},{64321,2,0,32},{32880,0,0,0},{64321, 2,0,32},{32894,0,0,0},{64321,2,0,32},{32907,0,0,0},{64321,2,0,32},{32941,0,0,0}, {64321,2,0,32},{32946,0,0,0},{64321,2,0,32},{33027,0,0,0},{64321,2,0,32},{33086, 0,0,0},{64321,2,0,32},{33240,0,0,0},{64321,2,0,32},{33256,0,0,0},{64321,2,0,32}, {33261,0,0,0},{64321,2,0,32},{33281,0,0,0},{64321,2,0,32},{33284,0,0,0},{64321, 2,0,32},{33304,0,0,0},{64321,2,0,32},{33391,0,0,0},{64321,2,0,32},{33401,0,0,0}, {64321,2,0,32},{33419,0,0,0},{64321,2,0,32},{33425,0,0,0},{64321,2,0,32},{33437, 0,0,0},{64321,2,0,32},{33457,0,0,0},{64321,2,0,32},{33459,0,0,0},{64321,2,0,32}, {33469,0,0,0},{64321,2,0,32},{33509,0,0,0},{64321,2,0,32},{33510,0,0,0},{64321, 2,0,32},{33565,0,0,0},{64321,2,0,32},{33571,0,0,0},{64321,2,0,32},{33590,0,0,0}, {64321,2,0,32},{33618,0,0,0},{64321,2,0,32},{33619,0,0,0},{64321,2,0,32},{33635, 0,0,0},{64321,2,0,32},{33709,0,0,0},{64321,2,0,32},{33725,0,0,0},{64321,2,0,32}, {33737,0,0,0},{64321,2,0,32},{33738,0,0,0},{64321,2,0,32},{33740,0,0,0},{64321, 2,0,32},{33756,0,0,0},{64321,2,0,32},{33767,0,0,0},{64321,2,0,32},{33775,0,0,0}, {64321,2,0,32},{33777,0,0,0},{64321,2,0,32},{33853,0,0,0},{64321,2,0,32},{33865, 0,0,0},{64321,2,0,32},{33879,0,0,0},{64321,2,0,32},{34030,0,0,0},{64321,2,0,32}, {34033,0,0,0},{64321,2,0,32},{34035,0,0,0},{64321,2,0,32},{34044,0,0,0},{64321, 2,0,32},{34070,0,0,0},{64321,2,0,32},{34148,0,0,0},{64321,2,0,32},{34253,0,0,0}, {64321,2,0,32},{34298,0,0,0},{64321,2,0,32},{34310,0,0,0},{64321,2,0,32},{34322, 0,0,0},{64321,2,0,32},{34349,0,0,0},{64321,2,0,32},{34367,0,0,0},{64321,2,0,32}, {34384,0,0,0},{64321,2,0,32},{34396,0,0,0},{64321,2,0,32},{34407,0,0,0},{64321, 2,0,32},{34409,0,0,0},{64321,2,0,32},{34440,0,0,0},{64321,2,0,32},{34473,0,0,0}, {64321,2,0,32},{34530,0,0,0},{64321,2,0,32},{34574,0,0,0},{64321,2,0,32},{34600, 0,0,0},{64321,2,0,32},{34667,0,0,0},{64321,2,0,32},{34681,0,0,0},{64321,2,0,32}, {34694,0,0,0},{64321,2,0,32},{34746,0,0,0},{64321,2,0,32},{34785,0,0,0},{64321, 2,0,32},{34817,0,0,0},{64321,2,0,32},{34847,0,0,0},{64321,2,0,32},{34892,0,0,0}, {64321,2,0,32},{34912,0,0,0},{64321,2,0,32},{34915,0,0,0},{64321,2,0,32},{35010, 0,0,0},{64321,2,0,32},{35023,0,0,0},{64321,2,0,32},{35031,0,0,0},{64321,2,0,32}, {35038,0,0,0},{64321,2,0,32},{35041,0,0,0},{64321,2,0,32},{35064,0,0,0},{64321, 2,0,32},{35066,0,0,0},{64321,2,0,32},{35088,0,0,0},{64321,2,0,32},{35137,0,0,0}, {64321,2,0,32},{35172,0,0,0},{64321,2,0,32},{35206,0,0,0},{64321,2,0,32},{35211, 0,0,0},{64321,2,0,32},{35222,0,0,0},{64321,2,0,32},{35488,0,0,0},{64321,2,0,32}, {35498,0,0,0},{64321,2,0,32},{35519,0,0,0},{64321,2,0,32},{35531,0,0,0},{64321, 2,0,32},{35538,0,0,0},{64321,2,0,32},{35542,0,0,0},{64321,2,0,32},{35565,0,0,0}, {64321,2,0,32},{35576,0,0,0},{64321,2,0,32},{35582,0,0,0},{64321,2,0,32},{35585, 0,0,0},{64321,2,0,32},{35641,0,0,0},{64321,2,0,32},{35672,0,0,0},{64321,2,0,32}, {35712,0,0,0},{64321,2,0,32},{35722,0,0,0},{64321,2,0,32},{35912,0,0,0},{64321, 2,0,32},{35925,0,0,0},{64321,2,0,32},{36011,0,0,0},{64321,2,0,32},{36033,0,0,0}, {64321,2,0,32},{36034,0,0,0},{64321,2,0,32},{36040,0,0,0},{64321,2,0,32},{36051, 0,0,0},{64321,2,0,32},{36104,0,0,0},{64321,2,0,32},{36123,0,0,0},{64321,2,0,32}, {36215,0,0,0},{64321,2,0,32},{36284,0,0,0},{64321,2,0,32},{36299,0,0,0},{64321, 2,0,32},{36335,0,0,0},{64321,2,0,32},{36336,0,0,0},{64321,2,0,32},{36554,0,0,0}, {64321,2,0,32},{36564,0,0,0},{64321,2,0,32},{36646,0,0,0},{64321,2,0,32},{36650, 0,0,0},{64321,2,0,32},{36664,0,0,0},{64321,2,0,32},{36667,0,0,0},{64321,2,0,32}, {36706,0,0,0},{64321,2,0,32},{36766,0,0,0},{64321,2,0,32},{36784,0,0,0},{64321, 2,0,32},{36790,0,0,0},{64321,2,0,32},{36899,0,0,0},{64321,2,0,32},{36920,0,0,0}, {64321,2,0,32},{36978,0,0,0},{64321,2,0,32},{36988,0,0,0},{64321,2,0,32},{37007, 0,0,0},{64321,2,0,32},{37012,0,0,0},{64321,2,0,32},{37070,0,0,0},{64321,2,0,32}, {37086,0,0,0},{64321,2,0,32},{37105,0,0,0},{64321,2,0,32},{37117,0,0,0},{64321, 2,0,32},{37137,0,0,0},{64321,2,0,32},{37147,0,0,0},{64321,2,0,32},{37226,0,0,0}, {64321,2,0,32},{37273,0,0,0},{64321,2,0,32},{37300,0,0,0},{64321,2,0,32},{37324, 0,0,0},{64321,2,0,32},{37327,0,0,0},{64321,2,0,32},{37329,0,0,0},{64321,2,0,32}, {37428,0,0,0},{64321,2,0,32},{37432,0,0,0},{64321,2,0,32},{37494,0,0,0},{64321, 2,0,32},{37500,0,0,0},{64321,2,0,32},{37591,0,0,0},{64321,2,0,32},{37592,0,0,0}, {64321,2,0,32},{37636,0,0,0},{64321,2,0,32},{37706,0,0,0},{64321,2,0,32},{37881, 0,0,0},{64321,2,0,32},{37909,0,0,0},{64321,2,0,32},{38283,0,0,0},{64321,2,0,32}, {38317,0,0,0},{64321,2,0,32},{38327,0,0,0},{64321,2,0,32},{38446,0,0,0},{64321, 2,0,32},{38475,0,0,0},{64321,2,0,32},{38477,0,0,0},{64321,2,0,32},{38517,0,0,0}, {64321,2,0,32},{38520,0,0,0},{64321,2,0,32},{38524,0,0,0},{64321,2,0,32},{38534, 0,0,0},{64321,2,0,32},{38563,0,0,0},{64321,2,0,32},{38583,0,0,0},{64321,2,0,32}, {38584,0,0,0},{64321,2,0,32},{38595,0,0,0},{64321,2,0,32},{38626,0,0,0},{64321, 2,0,32},{38627,0,0,0},{64321,2,0,32},{38646,0,0,0},{64321,2,0,32},{38647,0,0,0}, {64321,2,0,32},{38691,0,0,0},{64321,2,0,32},{38706,0,0,0},{64321,2,0,32},{38728, 0,0,0},{64321,2,0,32},{38742,0,0,0},{64321,2,0,32},{38875,0,0,0},{64321,2,0,32}, {38880,0,0,0},{64321,2,0,32},{38911,0,0,0},{64321,2,0,32},{38923,0,0,0},{64321, 2,0,32},{38936,0,0,0},{64321,2,0,32},{38953,0,0,0},{64321,2,0,32},{38971,0,0,0}, {64321,2,0,32},{39006,0,0,0},{64321,2,0,32},{39138,0,0,0},{64321,2,0,32},{39151, 0,0,0},{64321,2,0,32},{39164,0,0,0},{64321,2,0,32},{39208,0,0,0},{64321,2,0,32}, {39209,0,0,0},{64321,2,0,32},{39335,0,0,0},{64321,2,0,32},{39362,0,0,0},{64321, 2,0,32},{39409,0,0,0},{64321,2,0,32},{39422,0,0,0},{64321,2,0,32},{39530,0,0,0}, {64321,2,0,32},{39698,0,0,0},{64321,2,0,32},{39791,0,0,0},{64321,2,0,32},{40000, 0,0,0},{64321,2,0,32},{40023,0,0,0},{64321,2,0,32},{40189,0,0,0},{64321,2,0,32}, {40295,0,0,0},{64321,2,0,32},{40372,0,0,0},{64321,2,0,32},{40442,0,0,0},{64321, 2,0,32},{40478,0,0,0},{64321,2,0,32},{40575,0,0,0},{64321,2,0,32},{40599,0,0,0}, {64321,2,0,32},{40607,0,0,0},{64321,2,0,32},{40635,0,0,0},{64321,2,0,32},{40654, 0,0,0},{64321,2,0,32},{40697,0,0,0},{64321,2,0,32},{40702,0,0,0},{64321,2,0,32}, {40709,0,0,0},{64321,2,0,32},{40719,0,0,0},{64321,2,0,32},{40726,0,0,0},{64321, 2,0,32},{40763,0,0,0},{64321,2,0,32},{40771,0,0,0},{64321,2,0,32},{40845,0,0,0}, {64321,2,0,32},{40846,0,0,0},{64321,2,0,32},{40860,0,0,0},{14461,4,0,32},{14716, 4,0,32},{14479,4,0,32},{14716,4,0,32},{14500,4,0,32},{14716,4,0,32},{14520,4,0, 32},{14717,4,0,32},{14531,4,0,32},{14716,4,0,32},{14537,4,0,32},{14717,4,0,32}, {14539,4,0,32},{14717,4,0,32},{14545,4,0,32},{14716,4,0,32},{14582,4,0,32}, {14716,4,0,32},{14629,4,0,32},{14716,4,0,32},{14652,4,0,32},{14716,4,0,32}, {14658,4,0,32},{14717,4,0,32},{14665,4,0,32},{14716,4,0,32},{8430,4,0,32},{0,4, 0,43},{7931,10,0,32},{8071,4,0,32},{7931,4,0,32},{8071,4,0,32},{7341,10,0,32}, {7341,10,0,32},{7341,4,0,32},{7341,4,0,32},{7341,10,0,32},{7747,10,0,32},{7341, 4,0,32},{7747,4,0,32},{7341,10,0,32},{7963,10,0,32},{7341,4,0,32},{7963,4,0,32}, {7341,10,0,32},{8009,10,0,32},{7341,4,0,32},{8009,4,0,32},{7341,10,0,32},{0,4,0, 273},{8009,10,0,32},{7341,4,0,32},{0,4,0,273},{8009,4,0,32},{7341,10,0,32}, {8049,10,0,32},{7341,4,0,32},{8049,4,0,32},{7747,10,0,32},{7747,10,0,32},{7747, 4,0,32},{7747,4,0,32},{8009,10,0,32},{8049,10,0,32},{8009,4,0,32},{8049,4,0,32}, {7413,10,0,32},{0,4,0,274},{7413,4,0,32},{0,4,0,274},{7499,10,0,32},{0,4,0,274}, {7499,4,0,32},{0,4,0,274},{7514,10,0,32},{0,4,0,274},{7833,10,0,32},{0,4,0,274}, {7833,4,0,32},{0,4,0,274},{7895,10,0,32},{0,4,0,274},{7895,4,0,32},{0,4,0,274}, {7931,10,0,32},{0,4,0,274},{7931,4,0,32},{0,4,0,274},{7341,10,0,32},{0,4,0,43}, {7341,4,0,32},{0,4,0,43},{7747,10,0,32},{0,4,0,43},{7747,4,0,32},{0,4,0,43}, {7963,10,0,32},{0,4,0,43},{7963,4,0,32},{0,4,0,43},{7514,10,0,32},{0,4,0,53}, {7514,4,0,32},{0,4,0,53},{7627,10,0,32},{0,4,0,53},{7627,4,0,32},{0,4,0,53}, {7711,10,0,32},{0,4,0,53},{7711,4,0,32},{0,4,0,53},{7833,10,0,32},{0,4,0,53}, {7833,4,0,32},{0,4,0,53},{7895,10,0,32},{0,4,0,53},{7895,4,0,32},{0,4,0,53}, {7550,20,0,32},{0,20,0,57},{7747,20,0,32},{0,20,0,273},{7440,20,0,32},{11920,2, 0,32},{11973,2,0,32},{11921,2,0,32},{11973,2,0,32},{11922,2,0,32},{11973,2,0, 32},{11923,2,0,32},{11973,2,0,32},{11924,2,0,32},{11973,2,0,32},{11925,2,0,32}, {11973,2,0,32},{11926,2,0,32},{11973,2,0,32},{11927,2,0,32},{11973,2,0,32}, {11928,2,0,32},{11973,2,0,32},{11929,2,0,32},{11973,2,0,32},{11930,2,0,32}, {11973,2,0,32},{11931,2,0,32},{11973,2,0,32},{11932,2,0,32},{11973,2,0,32}, {11933,2,0,32},{11973,2,0,32},{11934,2,0,32},{11973,2,0,32},{11935,2,0,32}, {11973,2,0,32},{11936,2,0,32},{11973,2,0,32},{11937,2,0,32},{11973,2,0,32}, {11938,2,0,32},{11973,2,0,32},{11939,2,0,32},{11973,2,0,32},{11940,2,0,32}, {11973,2,0,32},{11941,2,0,32},{11973,2,0,32},{11942,2,0,32},{11973,2,0,32}, {11943,2,0,32},{11973,2,0,32},{11944,2,0,32},{11973,2,0,32},{11945,2,0,32}, {11973,2,0,32},{11946,2,0,32},{11973,2,0,32},{11947,2,0,32},{11973,2,0,32}, {11948,2,0,32},{11973,2,0,32},{11949,2,0,32},{11973,2,0,32},{11950,2,0,32}, {11973,2,0,32},{11951,2,0,32},{11973,2,0,32},{11952,2,0,32},{11973,2,0,32}, {11953,2,0,32},{11973,2,0,32},{11954,2,0,32},{11973,2,0,32},{11955,2,0,32}, {11973,2,0,32},{11956,2,0,32},{11973,2,0,32},{11957,2,0,32},{11973,2,0,32}, {11958,2,0,32},{11973,2,0,32},{11959,2,0,32},{11973,2,0,32},{11960,2,0,32}, {11973,2,0,32},{11961,2,0,32},{11973,2,0,32},{11962,2,0,32},{11973,2,0,32}, {11963,2,0,32},{11973,2,0,32},{11964,2,0,32},{11973,2,0,32},{11965,2,0,32}, {11973,2,0,32},{11966,2,0,32},{11973,2,0,32},{11967,2,0,32},{11973,2,0,32}, {11920,2,0,32},{11974,2,0,32},{11921,2,0,32},{11974,2,0,32},{11922,2,0,32}, {11974,2,0,32},{11923,2,0,32},{11974,2,0,32},{11924,2,0,32},{11974,2,0,32}, {11925,2,0,32},{11974,2,0,32},{11926,2,0,32},{11974,2,0,32},{11927,2,0,32}, {11974,2,0,32},{11928,2,0,32},{11974,2,0,32},{11929,2,0,32},{11974,2,0,32}, {11930,2,0,32},{11974,2,0,32},{11931,2,0,32},{11974,2,0,32},{11932,2,0,32}, {11974,2,0,32},{11933,2,0,32},{11974,2,0,32},{11934,2,0,32},{11974,2,0,32}, {11935,2,0,32},{11974,2,0,32},{11936,2,0,32},{11974,2,0,32},{11937,2,0,32}, {11974,2,0,32},{11938,2,0,32},{11974,2,0,32},{11939,2,0,32},{11974,2,0,32}, {11940,2,0,32},{11974,2,0,32},{11941,2,0,32},{11974,2,0,32},{11942,2,0,32}, {11974,2,0,32},{11943,2,0,32},{11974,2,0,32},{11944,2,0,32},{11974,2,0,32}, {11945,2,0,32},{11974,2,0,32},{11946,2,0,32},{11974,2,0,32},{11947,2,0,32}, {11974,2,0,32},{11948,2,0,32},{11974,2,0,32},{11949,2,0,32},{11974,2,0,32}, {11950,2,0,32},{11974,2,0,32},{11951,2,0,32},{11974,2,0,32},{11952,2,0,32}, {11974,2,0,32},{11953,2,0,32},{11974,2,0,32},{11954,2,0,32},{11974,2,0,32}, {11955,2,0,32},{11974,2,0,32},{11956,2,0,32},{11974,2,0,32},{11957,2,0,32}, {11974,2,0,32},{11958,2,0,32},{11974,2,0,32},{11959,2,0,32},{11974,2,0,32}, {11960,2,0,32},{11974,2,0,32},{11961,2,0,32},{11974,2,0,32},{11962,2,0,32}, {11974,2,0,32},{11963,2,0,32},{11974,2,0,32},{11964,2,0,32},{11974,2,0,32}, {11965,2,0,32},{11974,2,0,32},{11966,2,0,32},{11974,2,0,32},{11967,2,0,32}, {11974,2,0,32},{11920,2,0,32},{11977,2,0,32},{11921,2,0,32},{11977,2,0,32}, {11922,2,0,32},{11977,2,0,32},{11923,2,0,32},{11977,2,0,32},{11924,2,0,32}, {11977,2,0,32},{11925,2,0,32},{11977,2,0,32},{11926,2,0,32},{11977,2,0,32}, {11927,2,0,32},{11977,2,0,32},{11928,2,0,32},{11977,2,0,32},{11929,2,0,32}, {11977,2,0,32},{11930,2,0,32},{11977,2,0,32},{11931,2,0,32},{11977,2,0,32}, {11932,2,0,32},{11977,2,0,32},{11933,2,0,32},{11977,2,0,32},{11934,2,0,32}, {11977,2,0,32},{11935,2,0,32},{11977,2,0,32},{11936,2,0,32},{11977,2,0,32}, {11937,2,0,32},{11977,2,0,32},{11938,2,0,32},{11977,2,0,32},{11939,2,0,32}, {11977,2,0,32},{11940,2,0,32},{11977,2,0,32},{11941,2,0,32},{11977,2,0,32}, {11942,2,0,32},{11977,2,0,32},{11943,2,0,32},{11977,2,0,32},{11944,2,0,32}, {11977,2,0,32},{11945,2,0,32},{11977,2,0,32},{11946,2,0,32},{11977,2,0,32}, {11947,2,0,32},{11977,2,0,32},{11948,2,0,32},{11977,2,0,32},{11949,2,0,32}, {11977,2,0,32},{11950,2,0,32},{11977,2,0,32},{11951,2,0,32},{11977,2,0,32}, {11952,2,0,32},{11977,2,0,32},{11953,2,0,32},{11977,2,0,32},{11954,2,0,32}, {11977,2,0,32},{11955,2,0,32},{11977,2,0,32},{11956,2,0,32},{11977,2,0,32}, {11957,2,0,32},{11977,2,0,32},{11958,2,0,32},{11977,2,0,32},{11959,2,0,32}, {11977,2,0,32},{11960,2,0,32},{11977,2,0,32},{11961,2,0,32},{11977,2,0,32}, {11962,2,0,32},{11977,2,0,32},{11963,2,0,32},{11977,2,0,32},{11964,2,0,32}, {11977,2,0,32},{11965,2,0,32},{11977,2,0,32},{11966,2,0,32},{11977,2,0,32}, {11967,2,0,32},{11977,2,0,32},{11920,2,0,32},{11979,2,0,32},{11921,2,0,32}, {11979,2,0,32},{11922,2,0,32},{11979,2,0,32},{11923,2,0,32},{11979,2,0,32}, {11924,2,0,32},{11979,2,0,32},{11925,2,0,32},{11979,2,0,32},{11926,2,0,32}, {11979,2,0,32},{11927,2,0,32},{11979,2,0,32},{11928,2,0,32},{11979,2,0,32}, {11929,2,0,32},{11979,2,0,32},{11930,2,0,32},{11979,2,0,32},{11931,2,0,32}, {11979,2,0,32},{11932,2,0,32},{11979,2,0,32},{11933,2,0,32},{11979,2,0,32}, {11934,2,0,32},{11979,2,0,32},{11935,2,0,32},{11979,2,0,32},{11936,2,0,32}, {11979,2,0,32},{11937,2,0,32},{11979,2,0,32},{11938,2,0,32},{11979,2,0,32}, {11939,2,0,32},{11979,2,0,32},{11940,2,0,32},{11979,2,0,32},{11941,2,0,32}, {11979,2,0,32},{11942,2,0,32},{11979,2,0,32},{11943,2,0,32},{11979,2,0,32}, {11944,2,0,32},{11979,2,0,32},{11945,2,0,32},{11979,2,0,32},{11946,2,0,32}, {11979,2,0,32},{11947,2,0,32},{11979,2,0,32},{11948,2,0,32},{11979,2,0,32}, {11949,2,0,32},{11979,2,0,32},{11950,2,0,32},{11979,2,0,32},{11951,2,0,32}, {11979,2,0,32},{11952,2,0,32},{11979,2,0,32},{11953,2,0,32},{11979,2,0,32}, {11954,2,0,32},{11979,2,0,32},{11955,2,0,32},{11979,2,0,32},{11956,2,0,32}, {11979,2,0,32},{11957,2,0,32},{11979,2,0,32},{11958,2,0,32},{11979,2,0,32}, {11959,2,0,32},{11979,2,0,32},{11960,2,0,32},{11979,2,0,32},{11961,2,0,32}, {11979,2,0,32},{11962,2,0,32},{11979,2,0,32},{11963,2,0,32},{11979,2,0,32}, {11964,2,0,32},{11979,2,0,32},{11965,2,0,32},{11979,2,0,32},{11966,2,0,32}, {11979,2,0,32},{11967,2,0,32},{11979,2,0,32},{11920,2,0,32},{11980,2,0,32}, {11921,2,0,32},{11980,2,0,32},{11922,2,0,32},{11980,2,0,32},{11923,2,0,32}, {11980,2,0,32},{11924,2,0,32},{11980,2,0,32},{11925,2,0,32},{11980,2,0,32}, {11926,2,0,32},{11980,2,0,32},{11927,2,0,32},{11980,2,0,32},{11928,2,0,32}, {11980,2,0,32},{11929,2,0,32},{11980,2,0,32},{11930,2,0,32},{11980,2,0,32}, {11931,2,0,32},{11980,2,0,32},{11932,2,0,32},{11980,2,0,32},{11933,2,0,32}, {11980,2,0,32},{11934,2,0,32},{11980,2,0,32},{11935,2,0,32},{11980,2,0,32}, {11936,2,0,32},{11980,2,0,32},{11937,2,0,32},{11980,2,0,32},{11938,2,0,32}, {11980,2,0,32},{11939,2,0,32},{11980,2,0,32},{11940,2,0,32},{11980,2,0,32}, {11941,2,0,32},{11980,2,0,32},{11942,2,0,32},{11980,2,0,32},{11943,2,0,32}, {11980,2,0,32},{11944,2,0,32},{11980,2,0,32},{11945,2,0,32},{11980,2,0,32}, {11946,2,0,32},{11980,2,0,32},{11947,2,0,32},{11980,2,0,32},{11948,2,0,32}, {11980,2,0,32},{11949,2,0,32},{11980,2,0,32},{11950,2,0,32},{11980,2,0,32}, {11951,2,0,32},{11980,2,0,32},{11952,2,0,32},{11980,2,0,32},{11953,2,0,32}, {11980,2,0,32},{11954,2,0,32},{11980,2,0,32},{11955,2,0,32},{11980,2,0,32}, {11956,2,0,32},{11980,2,0,32},{11957,2,0,32},{11980,2,0,32},{11958,2,0,32}, {11980,2,0,32},{11959,2,0,32},{11980,2,0,32},{11960,2,0,32},{11980,2,0,32}, {11961,2,0,32},{11980,2,0,32},{11962,2,0,32},{11980,2,0,32},{11963,2,0,32}, {11980,2,0,32},{11964,2,0,32},{11980,2,0,32},{11965,2,0,32},{11980,2,0,32}, {11966,2,0,32},{11980,2,0,32},{11967,2,0,32},{11980,2,0,32},{64321,2,0,32}, {64014,0,0,0},{64321,2,0,32},{64015,0,0,0},{64321,2,0,32},{64017,0,0,0},{64321, 2,0,32},{64019,0,0,0},{64321,2,0,32},{64020,0,0,0},{64321,2,0,32},{64031,0,0,0}, {64321,2,0,32},{64033,0,0,0},{64321,2,0,32},{64035,0,0,0},{64321,2,0,32},{64036, 0,0,0},{64321,2,0,32},{64039,0,0,0},{64321,2,0,32},{64040,0,0,0},{64321,2,0,32}, {64041,0,0,0},{7499,4,0,32},{7499,4,0,32},{7499,4,0,32},{7576,4,0,32},{7499,4,0, 32},{7645,4,0,32},{7499,4,0,32},{7499,4,0,32},{7576,4,0,32},{7499,4,0,32},{7499, 4,0,32},{7645,4,0,32},{7895,4,0,32},{0,4,0,274},{7931,4,0,32},{7895,4,0,32}, {7931,4,0,32},{8969,4,0,32},{8971,4,0,32},{8969,4,0,32},{8954,4,0,32},{8969,4,0, 32},{8960,4,0,32},{8979,4,0,32},{8971,4,0,32},{8969,4,0,32},{8962,4,0,32},{8989, 4,0,32},{9000,4,0,32},{9244,26,0,32},{0,26,0,131},{9244,25,0,32},{0,25,0,131}, {9274,26,0,32},{0,26,0,131},{9274,25,0,32},{0,25,0,131},{9249,26,0,32},{9059,26, 0,32},{9069,26,0,32},{9073,26,0,32},{9069,25,0,32},{9073,25,0,32},{9069,26,0, 32},{9244,26,0,32},{9069,25,0,32},{9244,25,0,32},{9069,26,0,32},{9245,26,0,32}, {9069,25,0,32},{9245,25,0,32},{9069,26,0,32},{9249,26,0,32},{9069,25,0,32}, {9249,25,0,32},{9069,26,0,32},{9248,26,0,32},{9069,25,0,32},{9248,25,0,32}, {9069,26,0,32},{9250,26,0,32},{9069,25,0,32},{9250,25,0,32},{9069,26,0,32}, {9264,26,0,32},{9069,25,0,32},{9264,25,0,32},{9069,23,0,32},{9264,23,0,32}, {9069,26,0,32},{9259,26,0,32},{9069,25,0,32},{9259,25,0,32},{9069,23,0,32}, {9259,23,0,32},{9069,26,0,32},{9099,26,0,32},{9069,26,0,32},{9106,26,0,32}, {9069,26,0,32},{9225,26,0,32},{9069,26,0,32},{9259,26,0,32},{9069,26,0,32}, {9260,26,0,32},{9075,26,0,32},{9099,26,0,32},{9075,26,0,32},{9106,26,0,32}, {9075,26,0,32},{9107,26,0,32},{9075,26,0,32},{9225,26,0,32},{9075,26,0,32}, {9259,26,0,32},{9075,26,0,32},{9260,26,0,32},{9091,26,0,32},{9099,26,0,32}, {9091,26,0,32},{9106,26,0,32},{9091,26,0,32},{9107,26,0,32},{9091,26,0,32}, {9225,26,0,32},{9091,26,0,32},{9259,26,0,32},{9091,26,0,32},{9260,26,0,32}, {9092,26,0,32},{9099,26,0,32},{9092,26,0,32},{9225,26,0,32},{9092,26,0,32}, {9259,26,0,32},{9092,26,0,32},{9260,26,0,32},{9099,26,0,32},{9106,26,0,32}, {9099,26,0,32},{9225,26,0,32},{9106,26,0,32},{9099,26,0,32},{9106,26,0,32}, {9225,26,0,32},{9107,26,0,32},{9099,26,0,32},{9107,26,0,32},{9106,26,0,32}, {9107,26,0,32},{9225,26,0,32},{9151,26,0,32},{9099,26,0,32},{9151,26,0,32}, {9106,26,0,32},{9151,26,0,32},{9107,26,0,32},{9151,26,0,32},{9225,26,0,32}, {9162,26,0,32},{9106,26,0,32},{9162,26,0,32},{9225,26,0,32},{9163,26,0,32}, {9099,26,0,32},{9163,26,0,32},{9106,26,0,32},{9163,26,0,32},{9107,26,0,32}, {9163,26,0,32},{9225,26,0,32},{9168,26,0,32},{9106,26,0,32},{9168,26,0,32}, {9225,26,0,32},{9169,26,0,32},{9225,26,0,32},{9172,26,0,32},{9099,26,0,32}, {9172,26,0,32},{9225,26,0,32},{9173,26,0,32},{9099,26,0,32},{9173,26,0,32}, {9225,26,0,32},{9180,26,0,32},{9099,26,0,32},{9180,26,0,32},{9106,26,0,32}, {9180,26,0,32},{9107,26,0,32},{9180,26,0,32},{9225,26,0,32},{9180,26,0,32}, {9259,26,0,32},{9180,26,0,32},{9260,26,0,32},{9192,26,0,32},{9106,26,0,32}, {9192,26,0,32},{9225,26,0,32},{9192,26,0,32},{9259,26,0,32},{9192,26,0,32}, {9260,26,0,32},{9197,26,0,32},{9073,26,0,32},{9197,26,0,32},{9099,26,0,32}, {9197,26,0,32},{9106,26,0,32},{9197,26,0,32},{9107,26,0,32},{9197,26,0,32}, {9218,26,0,32},{9197,26,0,32},{9225,26,0,32},{9197,26,0,32},{9259,26,0,32}, {9197,26,0,32},{9260,26,0,32},{9218,26,0,32},{9099,26,0,32},{9218,26,0,32}, {9106,26,0,32},{9218,26,0,32},{9107,26,0,32},{9218,26,0,32},{9225,26,0,32}, {9218,26,0,32},{9259,26,0,32},{9218,26,0,32},{9260,26,0,32},{9225,26,0,32}, {9099,26,0,32},{9225,26,0,32},{9106,26,0,32},{9225,26,0,32},{9107,26,0,32}, {9225,26,0,32},{9225,26,0,32},{9225,26,0,32},{9259,26,0,32},{9225,26,0,32}, {9260,26,0,32},{9229,26,0,32},{9099,26,0,32},{9229,26,0,32},{9106,26,0,32}, {9229,26,0,32},{9107,26,0,32},{9229,26,0,32},{9225,26,0,32},{9229,26,0,32}, {9259,26,0,32},{9229,26,0,32},{9260,26,0,32},{9239,26,0,32},{9099,26,0,32}, {9239,26,0,32},{9225,26,0,32},{9239,26,0,32},{9259,26,0,32},{9239,26,0,32}, {9260,26,0,32},{9260,26,0,32},{9099,26,0,32},{9260,26,0,32},{9106,26,0,32}, {9260,26,0,32},{9107,26,0,32},{9260,26,0,32},{9225,26,0,32},{9260,26,0,32}, {9259,26,0,32},{9260,26,0,32},{9260,26,0,32},{9118,26,0,32},{0,26,0,152},{9132, 26,0,32},{0,26,0,152},{9259,26,0,32},{0,26,0,152},{0,26,0,112},{0,26,0,128},{0, 26,0,115},{0,26,0,128},{0,26,0,118},{0,26,0,128},{0,26,0,122},{0,26,0,128},{0, 26,0,125},{0,26,0,128},{0,26,0,128},{0,26,0,152},{9069,25,0,32},{9132,25,0,32}, {9069,25,0,32},{9133,25,0,32},{9069,25,0,32},{9225,25,0,32},{9069,25,0,32}, {9229,25,0,32},{9069,25,0,32},{9259,25,0,32},{9069,25,0,32},{9260,25,0,32}, {9075,25,0,32},{9132,25,0,32},{9075,25,0,32},{9133,25,0,32},{9075,25,0,32}, {9225,25,0,32},{9075,25,0,32},{9229,25,0,32},{9075,25,0,32},{9259,25,0,32}, {9075,25,0,32},{9260,25,0,32},{9091,25,0,32},{9132,25,0,32},{9091,25,0,32}, {9133,25,0,32},{9091,25,0,32},{9225,25,0,32},{9091,25,0,32},{9229,25,0,32}, {9091,25,0,32},{9259,25,0,32},{9091,25,0,32},{9260,25,0,32},{9092,25,0,32}, {9132,25,0,32},{9092,25,0,32},{9133,25,0,32},{9092,25,0,32},{9225,25,0,32}, {9092,25,0,32},{9229,25,0,32},{9092,25,0,32},{9259,25,0,32},{9092,25,0,32}, {9260,25,0,32},{9180,25,0,32},{9259,25,0,32},{9180,25,0,32},{9260,25,0,32}, {9192,25,0,32},{9259,25,0,32},{9192,25,0,32},{9260,25,0,32},{9197,25,0,32}, {9073,25,0,32},{9197,25,0,32},{9218,25,0,32},{9197,25,0,32},{9225,25,0,32}, {9197,25,0,32},{9259,25,0,32},{9197,25,0,32},{9260,25,0,32},{9218,25,0,32}, {9225,25,0,32},{9218,25,0,32},{9259,25,0,32},{9218,25,0,32},{9260,25,0,32}, {9225,25,0,32},{9073,25,0,32},{9225,25,0,32},{9225,25,0,32},{9229,25,0,32}, {9132,25,0,32},{9229,25,0,32},{9133,25,0,32},{9229,25,0,32},{9225,25,0,32}, {9229,25,0,32},{9229,25,0,32},{9229,25,0,32},{9259,25,0,32},{9229,25,0,32}, {9260,25,0,32},{9259,25,0,32},{0,25,0,152},{9260,25,0,32},{9132,25,0,32},{9260, 25,0,32},{9133,25,0,32},{9260,25,0,32},{9225,25,0,32},{9260,25,0,32},{9229,25,0, 32},{9260,25,0,32},{9259,25,0,32},{9260,25,0,32},{9260,25,0,32},{9069,23,0,32}, {9099,23,0,32},{9069,23,0,32},{9106,23,0,32},{9069,23,0,32},{9107,23,0,32}, {9069,23,0,32},{9225,23,0,32},{9069,23,0,32},{9239,23,0,32},{9075,23,0,32}, {9099,23,0,32},{9075,23,0,32},{9106,23,0,32},{9075,23,0,32},{9107,23,0,32}, {9075,23,0,32},{9225,23,0,32},{9075,23,0,32},{9239,23,0,32},{9091,23,0,32}, {9099,23,0,32},{9091,23,0,32},{9106,23,0,32},{9091,23,0,32},{9107,23,0,32}, {9091,23,0,32},{9225,23,0,32},{9091,23,0,32},{9239,23,0,32},{9092,23,0,32}, {9225,23,0,32},{9099,23,0,32},{9106,23,0,32},{9099,23,0,32},{9225,23,0,32}, {9106,23,0,32},{9099,23,0,32},{9106,23,0,32},{9225,23,0,32},{9107,23,0,32}, {9099,23,0,32},{9107,23,0,32},{9225,23,0,32},{9151,23,0,32},{9099,23,0,32}, {9151,23,0,32},{9106,23,0,32},{9151,23,0,32},{9107,23,0,32},{9151,23,0,32}, {9225,23,0,32},{9162,23,0,32},{9106,23,0,32},{9162,23,0,32},{9107,23,0,32}, {9162,23,0,32},{9225,23,0,32},{9163,23,0,32},{9099,23,0,32},{9163,23,0,32}, {9106,23,0,32},{9163,23,0,32},{9107,23,0,32},{9163,23,0,32},{9225,23,0,32}, {9168,23,0,32},{9106,23,0,32},{9169,23,0,32},{9225,23,0,32},{9172,23,0,32}, {9099,23,0,32},{9172,23,0,32},{9225,23,0,32},{9173,23,0,32},{9099,23,0,32}, {9173,23,0,32},{9225,23,0,32},{9180,23,0,32},{9099,23,0,32},{9180,23,0,32}, {9106,23,0,32},{9180,23,0,32},{9107,23,0,32},{9180,23,0,32},{9225,23,0,32}, {9192,23,0,32},{9106,23,0,32},{9192,23,0,32},{9225,23,0,32},{9197,23,0,32}, {9099,23,0,32},{9197,23,0,32},{9106,23,0,32},{9197,23,0,32},{9107,23,0,32}, {9197,23,0,32},{9218,23,0,32},{9197,23,0,32},{9225,23,0,32},{9218,23,0,32}, {9099,23,0,32},{9218,23,0,32},{9106,23,0,32},{9218,23,0,32},{9107,23,0,32}, {9218,23,0,32},{9225,23,0,32},{9218,23,0,32},{9239,23,0,32},{9225,23,0,32}, {9099,23,0,32},{9225,23,0,32},{9106,23,0,32},{9225,23,0,32},{9107,23,0,32}, {9225,23,0,32},{9225,23,0,32},{9229,23,0,32},{9099,23,0,32},{9229,23,0,32}, {9106,23,0,32},{9229,23,0,32},{9107,23,0,32},{9229,23,0,32},{9225,23,0,32}, {9229,23,0,32},{9239,23,0,32},{9239,23,0,32},{9099,23,0,32},{9239,23,0,32}, {9225,23,0,32},{9239,23,0,32},{0,23,0,152},{9260,23,0,32},{9099,23,0,32},{9260, 23,0,32},{9106,23,0,32},{9260,23,0,32},{9107,23,0,32},{9260,23,0,32},{9225,23,0, 32},{9260,23,0,32},{9239,23,0,32},{9069,24,0,32},{9225,24,0,32},{9069,24,0,32}, {9239,24,0,32},{9075,24,0,32},{9225,24,0,32},{9075,24,0,32},{9239,24,0,32}, {9091,24,0,32},{9225,24,0,32},{9091,24,0,32},{9239,24,0,32},{9092,24,0,32}, {9225,24,0,32},{9092,24,0,32},{9239,24,0,32},{9151,24,0,32},{9225,24,0,32}, {9151,24,0,32},{9239,24,0,32},{9152,24,0,32},{9225,24,0,32},{9152,24,0,32}, {9239,24,0,32},{9197,24,0,32},{9218,24,0,32},{9197,24,0,32},{9225,24,0,32}, {9218,24,0,32},{9225,24,0,32},{9229,24,0,32},{9225,24,0,32},{9229,24,0,32}, {9239,24,0,32},{9260,24,0,32},{9225,24,0,32},{9260,24,0,32},{9239,24,0,32},{0, 24,0,118},{0,24,0,128},{0,24,0,122},{0,24,0,128},{0,24,0,125},{0,24,0,128}, {9168,26,0,32},{9259,26,0,32},{9168,26,0,32},{9260,26,0,32},{9172,26,0,32}, {9259,26,0,32},{9172,26,0,32},{9260,26,0,32},{9173,26,0,32},{9259,26,0,32}, {9173,26,0,32},{9260,26,0,32},{9151,26,0,32},{9259,26,0,32},{9151,26,0,32}, {9260,26,0,32},{9152,26,0,32},{9259,26,0,32},{9152,26,0,32},{9260,26,0,32}, {9106,26,0,32},{9259,26,0,32},{9106,26,0,32},{9260,26,0,32},{9099,26,0,32}, {9259,26,0,32},{9099,26,0,32},{9260,26,0,32},{9107,26,0,32},{9259,26,0,32}, {9107,26,0,32},{9260,26,0,32},{9162,26,0,32},{9259,26,0,32},{9162,26,0,32}, {9260,26,0,32},{9163,26,0,32},{9259,26,0,32},{9163,26,0,32},{9260,26,0,32}, {9152,26,0,32},{9099,26,0,32},{9152,26,0,32},{9106,26,0,32},{9152,26,0,32}, {9107,26,0,32},{9152,26,0,32},{9225,26,0,32},{9152,26,0,32},{9132,26,0,32}, {9151,26,0,32},{9132,26,0,32},{9162,26,0,32},{9132,26,0,32},{9163,26,0,32}, {9132,26,0,32},{9168,25,0,32},{9259,25,0,32},{9168,25,0,32},{9260,25,0,32}, {9172,25,0,32},{9259,25,0,32},{9172,25,0,32},{9260,25,0,32},{9173,25,0,32}, {9259,25,0,32},{9173,25,0,32},{9260,25,0,32},{9151,25,0,32},{9259,25,0,32}, {9151,25,0,32},{9260,25,0,32},{9152,25,0,32},{9259,25,0,32},{9152,25,0,32}, {9260,25,0,32},{9106,25,0,32},{9259,25,0,32},{9106,25,0,32},{9260,25,0,32}, {9099,25,0,32},{9259,25,0,32},{9099,25,0,32},{9260,25,0,32},{9107,25,0,32}, {9259,25,0,32},{9107,25,0,32},{9260,25,0,32},{9162,25,0,32},{9259,25,0,32}, {9162,25,0,32},{9260,25,0,32},{9163,25,0,32},{9259,25,0,32},{9163,25,0,32}, {9260,25,0,32},{9152,25,0,32},{9099,25,0,32},{9152,25,0,32},{9106,25,0,32}, {9152,25,0,32},{9107,25,0,32},{9152,25,0,32},{9225,25,0,32},{9152,25,0,32}, {9132,25,0,32},{9151,25,0,32},{9132,25,0,32},{9162,25,0,32},{9132,25,0,32}, {9163,25,0,32},{9132,25,0,32},{9152,23,0,32},{9099,23,0,32},{9152,23,0,32}, {9106,23,0,32},{9152,23,0,32},{9107,23,0,32},{9152,23,0,32},{9225,23,0,32}, {9151,23,0,32},{9239,23,0,32},{9152,23,0,32},{9239,23,0,32},{9168,23,0,32}, {9225,23,0,32},{9151,24,0,32},{9099,24,0,32},{9151,24,0,32},{9106,24,0,32}, {9151,24,0,32},{9107,24,0,32},{9152,24,0,32},{9099,24,0,32},{9152,24,0,32}, {9106,24,0,32},{9152,24,0,32},{9107,24,0,32},{9168,24,0,32},{9225,24,0,32}, {9169,24,0,32},{9225,24,0,32},{9073,25,0,32},{0,25,0,109},{9073,26,0,32},{0,26, 0,109},{9091,23,0,32},{9099,23,0,32},{9225,23,0,32},{9091,25,0,32},{9106,25,0, 32},{9099,25,0,32},{9091,23,0,32},{9106,23,0,32},{9099,23,0,32},{9091,23,0,32}, {9106,23,0,32},{9225,23,0,32},{9091,23,0,32},{9107,23,0,32},{9225,23,0,32}, {9091,23,0,32},{9225,23,0,32},{9099,23,0,32},{9091,23,0,32},{9225,23,0,32}, {9106,23,0,32},{9091,23,0,32},{9225,23,0,32},{9107,23,0,32},{9099,25,0,32}, {9225,25,0,32},{9106,25,0,32},{9099,23,0,32},{9225,23,0,32},{9106,23,0,32}, {9106,25,0,32},{9225,25,0,32},{9260,25,0,32},{9106,25,0,32},{9225,25,0,32}, {9259,25,0,32},{9151,23,0,32},{9106,23,0,32},{9099,23,0,32},{9151,23,0,32}, {9099,23,0,32},{9106,23,0,32},{9151,25,0,32},{9099,25,0,32},{9259,25,0,32}, {9151,25,0,32},{9225,25,0,32},{9106,25,0,32},{9151,23,0,32},{9225,23,0,32}, {9106,23,0,32},{9151,23,0,32},{9225,23,0,32},{9099,23,0,32},{9151,25,0,32}, {9225,25,0,32},{9225,25,0,32},{9151,23,0,32},{9225,23,0,32},{9225,23,0,32}, {9162,25,0,32},{9106,25,0,32},{9106,25,0,32},{9162,23,0,32},{9106,23,0,32}, {9106,23,0,32},{9162,25,0,32},{9225,25,0,32},{9225,25,0,32},{9152,25,0,32}, {9106,25,0,32},{9225,25,0,32},{9152,23,0,32},{9106,23,0,32},{9225,23,0,32}, {9152,25,0,32},{9099,25,0,32},{9260,25,0,32},{9152,25,0,32},{9225,25,0,32}, {9107,25,0,32},{9152,23,0,32},{9225,23,0,32},{9107,23,0,32},{9152,25,0,32}, {9225,25,0,32},{9225,25,0,32},{9152,23,0,32},{9225,23,0,32},{9225,23,0,32}, {9163,25,0,32},{9106,25,0,32},{9259,25,0,32},{9163,25,0,32},{9107,25,0,32}, {9225,25,0,32},{9163,23,0,32},{9107,23,0,32},{9225,23,0,32},{9168,25,0,32}, {9225,25,0,32},{9106,25,0,32},{9168,23,0,32},{9225,23,0,32},{9106,23,0,32}, {9168,23,0,32},{9225,23,0,32},{9225,23,0,32},{9168,25,0,32},{9225,25,0,32}, {9260,25,0,32},{9172,25,0,32},{9099,25,0,32},{9225,25,0,32},{9172,25,0,32}, {9225,25,0,32},{9225,25,0,32},{9172,23,0,32},{9225,23,0,32},{9225,23,0,32}, {9172,25,0,32},{9225,25,0,32},{9259,25,0,32},{9173,25,0,32},{9225,25,0,32}, {9225,25,0,32},{9173,25,0,32},{9225,25,0,32},{9260,25,0,32},{9173,25,0,32}, {9225,25,0,32},{9259,25,0,32},{9180,25,0,32},{9107,25,0,32},{9225,25,0,32}, {9180,23,0,32},{9107,23,0,32},{9225,23,0,32},{9192,25,0,32},{9225,25,0,32}, {9106,25,0,32},{9192,25,0,32},{9225,25,0,32},{9225,25,0,32},{9218,25,0,32}, {9106,25,0,32},{9225,25,0,32},{9218,25,0,32},{9106,25,0,32},{9260,25,0,32}, {9218,25,0,32},{9106,25,0,32},{9259,25,0,32},{9218,23,0,32},{9099,23,0,32}, {9099,23,0,32},{9218,25,0,32},{9099,25,0,32},{9099,25,0,32},{9218,25,0,32}, {9107,25,0,32},{9225,25,0,32},{9218,23,0,32},{9107,23,0,32},{9225,23,0,32}, {9218,25,0,32},{9225,25,0,32},{9106,25,0,32},{9218,23,0,32},{9225,23,0,32}, {9106,23,0,32},{9225,23,0,32},{9106,23,0,32},{9099,23,0,32},{9225,23,0,32}, {9106,23,0,32},{9225,23,0,32},{9225,25,0,32},{9106,25,0,32},{9260,25,0,32}, {9225,23,0,32},{9099,23,0,32},{9106,23,0,32},{9225,23,0,32},{9099,23,0,32}, {9225,23,0,32},{9225,23,0,32},{9107,23,0,32},{9099,23,0,32},{9225,23,0,32}, {9107,23,0,32},{9225,23,0,32},{9225,23,0,32},{9099,23,0,32},{9107,23,0,32}, {9239,23,0,32},{9225,23,0,32},{9099,23,0,32},{9239,23,0,32},{9225,23,0,32}, {9225,23,0,32},{9229,23,0,32},{9106,23,0,32},{9225,23,0,32},{9229,25,0,32}, {9106,25,0,32},{9259,25,0,32},{9229,25,0,32},{9099,25,0,32},{9225,25,0,32}, {9229,23,0,32},{9099,23,0,32},{9225,23,0,32},{9229,25,0,32},{9099,25,0,32}, {9259,25,0,32},{9229,25,0,32},{9225,25,0,32},{9260,25,0,32},{9229,25,0,32}, {9225,25,0,32},{9259,25,0,32},{9260,25,0,32},{9225,25,0,32},{9225,25,0,32}, {9260,23,0,32},{9225,23,0,32},{9225,23,0,32},{9075,25,0,32},{9107,25,0,32}, {9260,25,0,32},{9091,25,0,32},{9099,25,0,32},{9260,25,0,32},{9091,25,0,32}, {9099,25,0,32},{9259,25,0,32},{9091,25,0,32},{9107,25,0,32},{9260,25,0,32}, {9091,25,0,32},{9107,25,0,32},{9259,25,0,32},{9091,25,0,32},{9225,25,0,32}, {9260,25,0,32},{9091,25,0,32},{9225,25,0,32},{9259,25,0,32},{9099,25,0,32}, {9225,25,0,32},{9260,25,0,32},{9099,25,0,32},{9106,25,0,32},{9259,25,0,32}, {9099,25,0,32},{9225,25,0,32},{9259,25,0,32},{9151,25,0,32},{9107,25,0,32}, {9259,25,0,32},{9162,25,0,32},{9106,25,0,32},{9260,25,0,32},{9152,25,0,32}, {9106,25,0,32},{9260,25,0,32},{9163,25,0,32},{9106,25,0,32},{9260,25,0,32}, {9218,25,0,32},{9099,25,0,32},{9260,25,0,32},{9218,25,0,32},{9225,25,0,32}, {9260,25,0,32},{9260,25,0,32},{9106,25,0,32},{9260,25,0,32},{9260,25,0,32}, {9099,25,0,32},{9260,25,0,32},{9260,25,0,32},{9225,25,0,32},{9260,25,0,32}, {9225,25,0,32},{9225,25,0,32},{9260,25,0,32},{9192,25,0,32},{9225,25,0,32}, {9260,25,0,32},{9229,25,0,32},{9106,25,0,32},{9260,25,0,32},{9192,23,0,32}, {9225,23,0,32},{9106,23,0,32},{9218,23,0,32},{9106,23,0,32},{9225,23,0,32}, {9172,25,0,32},{9225,25,0,32},{9260,25,0,32},{9197,25,0,32},{9225,25,0,32}, {9260,25,0,32},{9229,23,0,32},{9099,23,0,32},{9106,23,0,32},{9225,25,0,32}, {9107,25,0,32},{9260,25,0,32},{9218,23,0,32},{9099,23,0,32},{9225,23,0,32}, {9197,25,0,32},{9225,25,0,32},{9225,25,0,32},{9218,25,0,32},{9099,25,0,32}, {9225,25,0,32},{9229,25,0,32},{9099,25,0,32},{9106,25,0,32},{9099,25,0,32}, {9106,25,0,32},{9260,25,0,32},{9106,25,0,32},{9099,25,0,32},{9260,25,0,32}, {9225,25,0,32},{9099,25,0,32},{9260,25,0,32},{9180,25,0,32},{9225,25,0,32}, {9260,25,0,32},{9075,25,0,32},{9106,25,0,32},{9260,25,0,32},{9197,23,0,32}, {9225,23,0,32},{9225,23,0,32},{9172,23,0,32},{9099,23,0,32},{9225,23,0,32}, {9162,23,0,32},{9225,23,0,32},{9225,23,0,32},{9151,25,0,32},{9107,25,0,32}, {9260,25,0,32},{9229,25,0,32},{9099,25,0,32},{9260,25,0,32},{9162,26,0,32}, {9218,26,0,32},{9274,26,0,32},{9192,26,0,32},{9218,26,0,32},{9274,26,0,32}, {9073,26,0,32},{9218,26,0,32},{9218,26,0,32},{9239,26,0,32},{9073,26,0,32}, {9197,26,0,32},{9075,26,0,32},{9132,26,0,32},{9225,26,0,32},{9106,26,0,32}, {9225,26,0,32},{9117,26,0,32},{9162,26,0,32},{9218,26,0,32},{9172,26,0,32}, {9225,26,0,32},{9132,26,0,32},{9151,26,0,32},{9245,26,0,32},{9218,26,0,32}, {9172,26,0,32},{9218,26,0,32},{9260,26,0,32},{9239,26,0,32},{9245,26,0,32}, {9151,26,0,32},{9218,26,0,32},{9225,26,0,32},{9162,26,0,32},{9218,26,0,32}, {9259,26,0,32},{9162,26,0,32},{9218,26,0,32},{9259,26,0,32},{521,26,1,32},{9073, 26,0,32},{9218,26,0,32},{9218,26,0,32},{9239,26,0,32},{521,26,1,32},{9172,26,0, 32},{9218,26,0,32},{9260,26,0,32},{9239,26,0,32},{521,26,1,32},{9245,26,0,32}, {9151,26,0,32},{9218,26,0,32},{9225,26,0,32},{9099,26,0,32},{9218,26,0,32},{521, 26,1,32},{9099,26,0,32},{9218,26,0,32},{9073,26,0,32},{9218,26,0,32},{9239,26,0, 32},{9132,26,0,32},{9261,26,0,32},{9073,26,0,32},{9218,26,0,32},{632,22,1,32}, {632,22,1,32},{632,22,1,32},{632,22,1,32},{632,22,1,32},{9218,26,0,32},{9060,26, 0,32},{9218,25,0,32},{9060,25,0,32},{9218,26,0,32},{9061,26,0,32},{9218,25,0, 32},{9061,25,0,32},{9218,26,0,32},{9065,26,0,32},{9218,25,0,32},{9065,25,0,32}, {9218,26,0,32},{9073,26,0,32},{9218,25,0,32},{9073,25,0,32},{21625,4,0,32},{0,4, 0,273},{21626,4,0,32},{0,4,0,273},{21627,4,0,32},{0,4,0,273},{21628,4,0,32},{0, 4,0,273},{21629,4,0,32},{0,4,0,273},{21630,4,0,32},{0,4,0,273},{21631,4,0,32}, {0,4,0,273},{21631,4,0,32},{0,4,0,274},{21632,4,0,32},{0,4,0,273},{21633,4,0, 32},{0,4,0,273},{21634,4,0,32},{0,4,0,273},{21634,4,0,32},{0,4,0,274},{21635,4, 0,32},{0,4,0,273},{21635,4,0,32},{0,4,0,274},{21636,4,0,32},{0,4,0,273},{21636, 4,0,32},{0,4,0,274},{21637,4,0,32},{0,4,0,273},{21638,4,0,32},{0,4,0,273}, {21639,4,0,32},{0,4,0,273},{21640,4,0,32},{0,4,0,274},{21640,4,0,32},{0,4,0, 275},{21641,4,0,32},{0,4,0,273},{21642,4,0,32},{0,4,0,273},{21643,4,0,32},{0,4, 0,273},{21644,4,0,32},{0,4,0,273},{21644,4,0,32},{0,4,0,274},{21645,4,0,32},{0, 4,0,273},{21645,4,0,32},{0,4,0,274},{21646,4,0,32},{0,4,0,273},{21647,4,0,32}, {0,4,0,273},{21640,4,0,32},{0,4,0,273},{19333,4,0,32},{0,4,0,274},{19172,4,0, 32},{0,4,0,273},{14404,4,0,32},{0,4,0,273},{14406,4,0,32},{0,4,0,273},{14409,4, 0,32},{0,4,0,273},{14410,4,0,32},{0,4,0,273},{14411,4,0,32},{0,4,0,273},{14412, 4,0,32},{0,4,0,273},{14413,4,0,32},{0,4,0,273},{14414,4,0,32},{0,4,0,273}, {14416,4,0,32},{0,4,0,273},{14417,4,0,32},{0,4,0,273},{14418,4,0,32},{0,4,0, 273},{14419,4,0,32},{0,4,0,273},{14420,4,0,32},{0,4,0,273},{14421,4,0,32},{0,4, 0,273},{14426,4,0,32},{0,4,0,273},{14427,4,0,32},{0,4,0,273},{14428,4,0,32},{0, 4,0,273},{14429,4,0,32},{0,4,0,273},{14431,4,0,32},{0,4,0,273},{14435,4,0,32}, {0,4,0,273},{14436,4,0,32},{0,4,0,273},{14437,4,0,32},{0,4,0,273},{14438,4,0, 32},{0,4,0,273},{14439,4,0,32},{0,4,0,273},{14443,4,0,32},{0,4,0,273},{14444,4, 0,32},{0,4,0,273},{14445,4,0,32},{0,4,0,273},{14446,4,0,32},{0,4,0,273},{14363, 10,0,32},{0,4,0,273},{14371,10,0,32},{0,4,0,273},{14371,10,0,32},{0,4,0,274}, {14376,10,0,32},{0,4,0,273},{14386,10,0,32},{0,4,0,273},{14387,10,0,32},{0,4,0, 273},{14387,10,0,32},{0,4,0,274},{14390,10,0,32},{0,4,0,273},{14397,10,0,32},{0, 4,0,273},{14398,10,0,32},{0,4,0,273},{14363,4,0,32},{0,4,0,273},{14371,4,0,32}, {0,4,0,273},{14371,4,0,32},{0,4,0,274},{14376,4,0,32},{0,4,0,273},{14386,4,0, 32},{0,4,0,273},{14387,4,0,32},{0,4,0,273},{14387,4,0,32},{0,4,0,274},{14390,4, 0,32},{0,4,0,273},{14397,4,0,32},{0,4,0,273},{14398,4,0,32},{0,4,0,273},{10830, 2,0,32},{0,2,0,194},{10831,2,0,32},{0,2,0,194},{10840,2,0,32},{0,2,0,194}, {11318,4,0,32},{0,4,0,273},{11318,4,0,32},{0,4,0,274},{11319,4,0,32},{0,4,0, 273},{11320,4,0,32},{0,4,0,273},{11366,4,0,32},{0,4,0,273},{11367,4,0,32},{0,4, 0,273},{11495,4,0,32},{0,4,0,273},{11511,4,0,32},{0,4,0,273},{4412,2,1,32},{0,0, 0,0},{4413,2,1,32},{0,0,0,0},{4413,2,1,32},{0,0,0,0},{0,0,0,0},{4413,2,1,32},{0, 0,0,0},{0,0,0,0},{4413,2,1,32},{0,0,0,0},{0,0,0,0},{4413,2,1,32},{0,0,0,0},{0,0, 0,0},{4413,2,1,32},{0,0,0,0},{0,0,0,0},{4465,2,1,32},{0,0,0,0},{4465,2,1,32},{0, 0,0,0},{0,0,0,0},{4465,2,1,32},{0,0,0,0},{0,0,0,0},{4466,2,1,32},{0,0,0,0}, {4466,2,1,32},{0,0,0,0},{0,0,0,0},{4466,2,1,32},{0,0,0,0},{0,0,0,0},{7331,4,0, 32},{632,4,1,32},{7331,4,0,32},{546,4,1,32},{7332,4,0,32},{546,4,1,32},{7333,4, 0,32},{546,4,1,32},{7334,4,0,32},{546,4,1,32},{7335,4,0,32},{546,4,1,32},{7336, 4,0,32},{546,4,1,32},{7337,4,0,32},{546,4,1,32},{7338,4,0,32},{546,4,1,32}, {7339,4,0,32},{546,4,1,32},{7340,4,0,32},{546,4,1,32},{792,4,1,32},{7341,10,0, 32},{793,4,1,32},{792,4,1,32},{7366,10,0,32},{793,4,1,32},{792,4,1,32},{7392,10, 0,32},{793,4,1,32},{792,4,1,32},{7413,10,0,32},{793,4,1,32},{792,4,1,32},{7440, 10,0,32},{793,4,1,32},{792,4,1,32},{7499,10,0,32},{793,4,1,32},{792,4,1,32}, {7514,10,0,32},{793,4,1,32},{792,4,1,32},{7550,10,0,32},{793,4,1,32},{792,4,1, 32},{7576,10,0,32},{793,4,1,32},{792,4,1,32},{7602,10,0,32},{793,4,1,32},{792,4, 1,32},{7627,10,0,32},{793,4,1,32},{792,4,1,32},{7645,10,0,32},{793,4,1,32},{792, 4,1,32},{7696,10,0,32},{793,4,1,32},{792,4,1,32},{7711,10,0,32},{793,4,1,32}, {792,4,1,32},{7747,10,0,32},{793,4,1,32},{792,4,1,32},{7794,10,0,32},{793,4,1, 32},{792,4,1,32},{7815,10,0,32},{793,4,1,32},{792,4,1,32},{7833,10,0,32},{793,4, 1,32},{792,4,1,32},{7895,10,0,32},{793,4,1,32},{792,4,1,32},{7931,10,0,32},{793, 4,1,32},{792,4,1,32},{7963,10,0,32},{793,4,1,32},{792,4,1,32},{8009,10,0,32}, {793,4,1,32},{792,4,1,32},{8027,10,0,32},{793,4,1,32},{792,4,1,32},{8037,10,0, 32},{793,4,1,32},{792,4,1,32},{8049,10,0,32},{793,4,1,32},{792,4,1,32},{8071,10, 0,32},{793,4,1,32},{890,4,1,32},{7895,10,0,32},{891,4,1,32},{7392,12,0,32}, {7413,12,0,32},{8027,12,0,32},{8071,12,0,32},{7550,29,0,32},{8009,29,0,32}, {7696,29,0,32},{8009,29,0,32},{7895,29,0,32},{7413,29,0,32},{7895,29,0,32}, {7895,29,0,32},{7794,29,0,32},{7794,29,0,32},{8009,29,0,32},{8027,29,0,32}, {7392,29,0,32},{7696,20,0,32},{7392,20,0,32},{7696,20,0,32},{7413,20,0,32}, {7576,29,0,32},{7392,29,0,32},{7794,29,0,32},{7341,29,0,32},{7895,29,0,32}, {7341,29,0,32},{7341,29,0,32},{7366,29,0,32},{8027,29,0,32},{7392,29,0,32}, {7413,29,0,32},{7602,29,0,32},{7392,29,0,32},{7645,29,0,32},{7392,29,0,32}, {7747,29,0,32},{7747,29,0,32},{7645,29,0,32},{7499,29,0,32},{7833,29,0,32}, {7440,29,0,32},{7440,29,0,32},{7576,29,0,32},{7413,29,0,32},{7711,29,0,32}, {7440,29,0,32},{8027,29,0,32},{7711,29,0,32},{7514,29,0,32},{7747,29,0,32}, {7627,29,0,32},{7895,29,0,32},{7747,29,0,32},{7895,29,0,32},{7963,29,0,32}, {7794,29,0,32},{609,28,1,32},{8009,29,0,32},{7895,29,0,32},{7334,28,0,32},{7413, 29,0,32},{7333,28,0,32},{7711,28,0,32},{7413,28,0,32},{521,28,1,32},{7895,29,0, 32},{7392,28,0,32},{7833,28,0,32},{7333,28,0,32},{7627,29,0,32},{7335,28,0,32}, {7627,29,0,32},{7339,28,0,32},{7627,29,0,32},{7336,28,0,32},{632,28,1,32},{7332, 28,0,32},{7338,28,0,32},{632,28,1,32},{7332,28,0,32},{7333,28,0,32},{7333,28,0, 32},{632,28,1,32},{7333,28,0,32},{7337,28,0,32},{7331,28,0,32},{7794,29,0,32}, {7332,28,0,32},{7333,28,0,32},{7331,28,0,32},{7794,29,0,32},{7550,29,0,32}, {7392,28,0,32},{7550,29,0,32},{7413,28,0,32},{7833,29,0,32},{7550,29,0,32}, {7576,28,0,32},{521,28,1,32},{7833,29,0,32},{7440,28,0,32},{7895,28,0,32},{7645, 29,0,32},{7747,28,0,32},{7895,28,0,32},{7895,28,0,32},{7645,28,0,32},{7440,28,0, 32},{7895,28,0,32},{7895,28,0,32},{7895,29,0,32},{7550,29,0,32},{8009,29,0,32}, {7963,29,0,32},{7550,29,0,32},{7413,29,0,32},{8009,29,0,32},{7747,29,0,32}, {7413,29,0,32},{16015,28,0,32},{15991,28,0,32},{15995,28,0,32},{15995,28,0,32}, {64320,28,0,32},{57931,0,0,0},{64320,28,0,32},{56151,0,0,0},{64320,28,0,32}, {54220,0,0,0},{16004,28,0,32},{0,28,0,55},{64320,28,0,32},{52876,0,0,0},{64320, 28,0,32},{55578,0,0,0},{64321,28,0,32},{35299,0,0,0},{64320,28,0,32},{55593,0,0, 0},{64320,28,0,32},{52900,0,0,0},{64320,28,0,32},{58912,0,0,0},{64320,28,0,32}, {61729,0,0,0},{64320,28,0,32},{58777,0,0,0},{64320,28,0,32},{53837,0,0,0}, {64320,28,0,32},{57228,0,0,0},{64320,28,0,32},{53645,0,0,0},{64320,28,0,32}, {58800,0,0,0},{64320,28,0,32},{53789,0,0,0},{64320,28,0,32},{64834,0,0,0}, {64320,28,0,32},{62751,0,0,0},{64321,28,0,32},{36009,0,0,0},{64320,28,0,32}, {55536,0,0,0},{64320,28,0,32},{54329,0,0,0},{64320,28,0,32},{61204,0,0,0}, {64320,28,0,32},{58005,0,0,0},{64320,28,0,32},{58197,0,0,0},{64320,28,0,32}, {52736,0,0,0},{64320,28,0,32},{52745,0,0,0},{64321,28,0,32},{36938,0,0,0}, {64320,28,0,32},{56806,0,0,0},{64320,28,0,32},{52781,0,0,0},{64320,28,0,32}, {54259,0,0,0},{64320,28,0,32},{58119,0,0,0},{64321,28,0,32},{36208,0,0,0}, {64320,28,0,32},{57939,0,0,0},{64320,28,0,32},{63873,0,0,0},{64320,28,0,32}, {64122,0,0,0},{64320,28,0,32},{54280,0,0,0},{64320,28,0,32},{61056,0,0,0}, {64320,28,0,32},{59145,0,0,0},{64320,28,0,32},{59144,0,0,0},{64320,28,0,32}, {62771,0,0,0},{64320,28,0,32},{53874,0,0,0},{64320,28,0,32},{54710,0,0,0}, {64321,28,0,32},{37197,0,0,0},{890,4,1,32},{64320,4,0,32},{59180,0,0,0},{891,4, 1,32},{890,4,1,32},{64320,4,0,32},{52745,0,0,0},{891,4,1,32},{890,4,1,32}, {64320,4,0,32},{52876,0,0,0},{891,4,1,32},{890,4,1,32},{64320,4,0,32},{56201,0, 0,0},{891,4,1,32},{890,4,1,32},{64320,4,0,32},{61625,0,0,0},{891,4,1,32},{890,4, 1,32},{64320,4,0,32},{57939,0,0,0},{891,4,1,32},{890,4,1,32},{64320,4,0,32}, {63191,0,0,0},{891,4,1,32},{890,4,1,32},{64320,4,0,32},{53981,0,0,0},{891,4,1, 32},{890,4,1,32},{64320,4,0,32},{58711,0,0,0},{891,4,1,32},{64320,6,0,32}, {57239,0,0,0},{64320,6,0,32},{54255,0,0,0},{64388,2,0,32},{33058,0,0,0},{64388, 2,0,32},{34076,0,0,0},{64388,2,0,32},{34085,0,0,0},{64388,2,0,32},{34123,0,0,0}, {64388,2,0,32},{34362,0,0,0},{64388,2,0,32},{34820,0,0,0},{64388,2,0,32},{35038, 0,0,0},{64388,2,0,32},{35372,0,0,0},{64388,2,0,32},{35683,0,0,0},{64388,2,0,32}, {38116,0,0,0},{64388,2,0,32},{38568,0,0,0},{64388,2,0,32},{38634,0,0,0},{64388, 2,0,32},{39368,0,0,0},{64388,2,0,32},{39704,0,0,0},{64388,2,0,32},{40203,0,0,0}, {64388,2,0,32},{40420,0,0,0},{64388,2,0,32},{40422,0,0,0},{64388,2,0,32},{41347, 0,0,0},{64388,2,0,32},{41375,0,0,0},{64388,2,0,32},{41777,0,0,0},{64388,2,0,32}, {42708,0,0,0},{64388,2,0,32},{43076,0,0,0},{64388,2,0,32},{43082,0,0,0},{64388, 2,0,32},{43788,0,0,0},{64388,2,0,32},{44017,0,0,0},{64388,2,0,32},{45066,0,0,0}, {64388,2,0,32},{45752,0,0,0},{64388,2,0,32},{45919,0,0,0},{64388,2,0,32},{45971, 0,0,0},{64388,2,0,32},{45980,0,0,0},{64388,2,0,32},{46019,0,0,0},{64388,2,0,32}, {46037,0,0,0},{64388,2,0,32},{46189,0,0,0},{64388,2,0,32},{46755,0,0,0},{64388, 2,0,32},{47271,0,0,0},{64388,2,0,32},{47757,0,0,0},{64388,2,0,32},{47866,0,0,0}, {64388,2,0,32},{48316,0,0,0},{64388,2,0,32},{48414,0,0,0},{64388,2,0,32},{48849, 0,0,0},{64388,2,0,32},{48990,0,0,0},{64388,2,0,32},{49038,0,0,0},{64388,2,0,32}, {49763,0,0,0},{64388,2,0,32},{49902,0,0,0},{64388,2,0,32},{50091,0,0,0},{64388, 2,0,32},{50696,0,0,0},{64388,2,0,32},{50997,0,0,0},{64388,2,0,32},{51220,0,0,0}, {64388,2,0,32},{52278,0,0,0},{64388,2,0,32},{52370,0,0,0},{64388,2,0,32},{53153, 0,0,0},{64388,2,0,32},{53176,0,0,0},{64388,2,0,32},{53316,0,0,0},{64388,2,0,32}, {53490,0,0,0},{64388,2,0,32},{53491,0,0,0},{64388,2,0,32},{53529,0,0,0},{64388, 2,0,32},{53555,0,0,0},{64388,2,0,32},{53833,0,0,0},{64388,2,0,32},{54301,0,0,0}, {64388,2,0,32},{54822,0,0,0},{64388,2,0,32},{54938,0,0,0},{64388,2,0,32},{54981, 0,0,0},{64388,2,0,32},{55676,0,0,0},{64388,2,0,32},{55975,0,0,0},{64388,2,0,32}, {56235,0,0,0},{64388,2,0,32},{56448,0,0,0},{64388,2,0,32},{56528,0,0,0},{64388, 2,0,32},{57222,0,0,0},{64388,2,0,32},{57818,0,0,0},{64388,2,0,32},{57896,0,0,0}, {64388,2,0,32},{57927,0,0,0},{64388,2,0,32},{58073,0,0,0},{64388,2,0,32},{58174, 0,0,0},{64388,2,0,32},{58586,0,0,0},{64388,2,0,32},{58659,0,0,0},{64388,2,0,32}, {58792,0,0,0},{64388,2,0,32},{59303,0,0,0},{64388,2,0,32},{59317,0,0,0},{64388, 2,0,32},{60220,0,0,0},{64388,2,0,32},{60470,0,0,0},{64388,2,0,32},{60629,0,0,0}, {64388,2,0,32},{60779,0,0,0},{64388,2,0,32},{61228,0,0,0},{64388,2,0,32},{61361, 0,0,0},{64388,2,0,32},{61650,0,0,0},{64388,2,0,32},{62410,0,0,0},{64388,2,0,32}, {63079,0,0,0},{64388,2,0,32},{63662,0,0,0},{64388,2,0,32},{63846,0,0,0},{64388, 2,0,32},{64680,0,0,0},{64388,2,0,32},{65235,0,0,0},{64388,2,0,32},{65327,0,0,0}, {64389,2,0,32},{34258,0,0,0},{64389,2,0,32},{34285,0,0,0},{64389,2,0,32},{34606, 0,0,0},{64389,2,0,32},{35834,0,0,0},{64389,2,0,32},{36215,0,0,0},{64389,2,0,32}, {37189,0,0,0},{64389,2,0,32},{37343,0,0,0},{64389,2,0,32},{37402,0,0,0},{64389, 2,0,32},{37898,0,0,0},{64389,2,0,32},{38038,0,0,0},{64389,2,0,32},{38326,0,0,0}, {64389,2,0,32},{39728,0,0,0},{64389,2,0,32},{41166,0,0,0},{64389,2,0,32},{41221, 0,0,0},{64389,2,0,32},{41486,0,0,0},{64389,2,0,32},{41617,0,0,0},{64389,2,0,32}, {41874,0,0,0},{64389,2,0,32},{42496,0,0,0}}; MoarVM-2018.03/src/strings/utf16.c0000644000175000017510000001457213237701240016604 0ustar samanthasamantha#include "moar.h" #define BOM_UTF16LE "\xff\xfe" #define BOM_UTF16BE "\xfe\xff" /* mostly from YAML-LibYAML */ /* Decodes the specified number of bytes of utf16 into an NFG string, creating * a result of the specified type. The type must have the MVMString REPR. */ MVMString * MVM_string_utf16_decode(MVMThreadContext *tc, const MVMObject *result_type, char *utf16_chars, size_t bytes) { MVMString *result = (MVMString *)REPR(result_type)->allocate(tc, STABLE(result_type)); size_t str_pos = 0; MVMuint8 *utf16 = (MVMuint8 *)utf16_chars; MVMuint8 *utf16_end; /* set the default byte order */ #ifdef MVM_BIGENDIAN int low = 1; int high = 0; #else int low = 0; int high = 1; #endif MVMNormalizer norm; MVMint32 ready; if (bytes % 2) { MVM_exception_throw_adhoc(tc, "Malformed UTF-16; odd number of bytes"); } /* set the byte order if there's a BOM */ if (bytes >= 2) { if (!memcmp(utf16, BOM_UTF16LE, 2)) { low = 0; high = 1; utf16 += 2; bytes -= 2; } else if (!memcmp(utf16, BOM_UTF16BE, 2)) { low = 1; high = 0; utf16 += 2; bytes -= 2; } } utf16_end = utf16 + bytes; /* possibly allocating extra space; oh well */ result->body.storage.blob_32 = MVM_malloc(sizeof(MVMGrapheme32) * bytes / 2); /* Need to normalize to NFG as we decode. */ MVM_unicode_normalizer_init(tc, &norm, MVM_NORMALIZE_NFG); for (; utf16 < utf16_end; utf16 += 2) { MVMuint32 value = (utf16[high] << 8) + utf16[low]; MVMuint32 value2; MVMGrapheme32 g; if ((value & 0xFC00) == 0xDC00) { MVM_unicode_normalizer_cleanup(tc, &norm); MVM_exception_throw_adhoc(tc, "Malformed UTF-16; unexpected low surrogate"); } if ((value & 0xFC00) == 0xD800) { /* high surrogate */ utf16 += 2; if (utf16 == utf16_end) { MVM_unicode_normalizer_cleanup(tc, &norm); MVM_exception_throw_adhoc(tc, "Malformed UTF-16; incomplete surrogate pair"); } value2 = (utf16[high] << 8) + utf16[low]; if ((value2 & 0xFC00) != 0xDC00) { MVM_unicode_normalizer_cleanup(tc, &norm); MVM_exception_throw_adhoc(tc, "Malformed UTF-16; incomplete surrogate pair"); } value = 0x10000 + ((value & 0x3FF) << 10) + (value2 & 0x3FF); } /* TODO: check for invalid values */ ready = MVM_unicode_normalizer_process_codepoint_to_grapheme(tc, &norm, value, &g); if (ready) { result->body.storage.blob_32[str_pos++] = g; while (--ready > 0) result->body.storage.blob_32[str_pos++] = MVM_unicode_normalizer_get_grapheme(tc, &norm); } } /* Get any final graphemes from the normalizer, and clean it up. */ MVM_unicode_normalizer_eof(tc, &norm); ready = MVM_unicode_normalizer_available(tc, &norm); while (ready--) result->body.storage.blob_32[str_pos++] = MVM_unicode_normalizer_get_grapheme(tc, &norm); MVM_unicode_normalizer_cleanup(tc, &norm); result->body.storage_type = MVM_STRING_GRAPHEME_32; result->body.num_graphs = str_pos; return result; } /* Encodes the specified substring to utf16. The result string is NULL terminated, but * the specified size is the non-null part. (This being UTF-16, there are 2 null bytes * on the end.) */ char * MVM_string_utf16_encode_substr(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint64 start, MVMint64 length, MVMString *replacement, MVMint32 translate_newlines) { MVMStringIndex strgraphs = MVM_string_graphs(tc, str); MVMuint32 lengthu = (MVMuint32)(length == -1 ? strgraphs - start : length); MVMuint16 *result; MVMuint16 *result_pos; MVMCodepointIter ci; MVMuint8 *repl_bytes = NULL; MVMuint64 repl_length = 0; MVMint32 alloc_size; MVMuint64 scratch_space = 0; /* must check start first since it's used in the length check */ if (start < 0 || start > strgraphs) MVM_exception_throw_adhoc(tc, "start out of range"); if (start + lengthu > strgraphs) MVM_exception_throw_adhoc(tc, "length out of range"); if (replacement) repl_bytes = (MVMuint8 *) MVM_string_utf16_encode_substr(tc, replacement, &repl_length, 0, -1, NULL, translate_newlines); alloc_size = lengthu * 2; result = MVM_malloc(alloc_size + 2); result_pos = result; MVM_string_ci_init(tc, &ci, str, translate_newlines, 0); while (MVM_string_ci_has_more(tc, &ci)) { int bytes_needed; MVMCodepoint value = MVM_string_ci_get_codepoint(tc, &ci); if (value < 0x10000) { bytes_needed = 2; } else if (value <= 0x1FFFFF) { bytes_needed = 4; } else { bytes_needed = repl_length; } while ((alloc_size - 2 * (result_pos - result)) < bytes_needed) { MVMuint16 *new_result; alloc_size *= 2; new_result = MVM_realloc(result, alloc_size + 2); result_pos = new_result + (result_pos - result); result = new_result; } if (value < 0x10000) { result_pos[0] = value; result_pos++; } else if (value <= 0x1FFFFF) { value -= 0x10000; result_pos[0] = 0xD800 + (value >> 10); result_pos[1] = 0xDC00 + (value & 0x3FF); result_pos += 2; } else if (replacement) { memcpy(result_pos, repl_bytes, repl_length); result_pos += repl_length/2; } else { MVM_free(result); MVM_free(repl_bytes); MVM_exception_throw_adhoc(tc, "Error encoding UTF-16 string: could not encode codepoint %d", value); } } result_pos[0] = 0; if (!output_size) output_size = &scratch_space; *output_size = (char *)result_pos - (char *)result; result = MVM_realloc(result, *output_size); MVM_free(repl_bytes); return (char *)result; } /* Encodes the whole string, double-NULL terminated. */ char * MVM_string_utf16_encode(MVMThreadContext *tc, MVMString *str, MVMint32 translate_newlines) { return MVM_string_utf16_encode_substr(tc, str, NULL, 0, -1, NULL, translate_newlines); } MoarVM-2018.03/src/strings/utf16.h0000644000175000017510000000062213237701241016601 0ustar samanthasamanthaMVMString * MVM_string_utf16_decode(MVMThreadContext *tc, const MVMObject *result_type, char *utf16, size_t bytes); char * MVM_string_utf16_encode_substr(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint64 start, MVMint64 length, MVMString *replacement, MVMint32 translate_newlines); char * MVM_string_utf16_encode(MVMThreadContext *tc, MVMString *str, MVMint32 translate_newlines); MoarVM-2018.03/src/strings/utf8.c0000644000175000017510000006125113237701241016522 0ustar samanthasamantha#include "moar.h" /* The below section has an MIT-style license, included here. // Copyright (c) 2008-2010 Bjoern Hoehrmann // See http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ for details. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject * to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #define UTF8_ACCEPT 0 #define UTF8_REJECT 12 static const MVMuint8 utf8d[] = { // The first part of the table maps bytes to character classes that // to reduce the size of the transition table and create bitmasks. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, // The second part is a transition table that maps a combination // of a state of the automaton and a character class to a state. 0,12,24,36,60,96,84,12,12,12,48,72, 12,12,12,12,12,12,12,12,12,12,12,12, 12, 0,12,12,12,12,12, 0,12, 0,12,12, 12,24,12,12,12,12,12,24,12,24,12,12, 12,12,12,12,12,12,12,24,12,12,12,12, 12,24,12,12,12,12,12,12,12,24,12,12, 12,12,12,12,12,12,12,36,12,36,12,12, 12,36,12,12,12,12,12,36,12,36,12,12, 12,36,12,12,12,12,12,12,12,12,12,12, }; static MVMint32 decode_utf8_byte(MVMint32 *state, MVMGrapheme32 *codep, MVMuint8 byte) { MVMint32 type = utf8d[byte]; *codep = (*state != UTF8_ACCEPT) ? (byte & 0x3fu) | (*codep << 6) : (0xff >> type) & (byte); *state = utf8d[256 + *state + type]; return *state; } /* end Bjoern Hoehrmann section (some things were changed from the original) */ /* begin not_gerd section (modified from original) // Copyright 2012 not_gerd // see http://irclog.perlgeek.de/perl6/2012-06-04#i_5681122 Permission is granted to use, modify, and / or redistribute at will. This includes removing authorship notices, re-use of code parts in other software (with or without giving credit), and / or creating a commercial product based on it. This permission is not revocable by the author. This software is provided as-is. Use it at your own risk. There is no warranty whatsoever, neither expressed nor implied, and by using this software you accept that the author(s) shall not be held liable for any loss of data, loss of service, or other damages, be they incidental or consequential. Your only option other than accepting this is not to use the software at all. */ enum { CP_CHAR = 1 << 0, CP_LOW_SURROGATE = 1 << 1, CP_HIGH_SURROGATE = 1 << 2, CP_NONCHAR = 1 << 3, CP_OVERFLOW = 1 << 4, U8_SINGLE = 1 << 5, U8_DOUBLE = 1 << 6, U8_TRIPLE = 1 << 7, U8_QUAD = 1 << 8 }; static unsigned classify(MVMCodepoint cp) { if(cp <= 0x7F) return CP_CHAR | U8_SINGLE; if(cp <= 0x07FF) return CP_CHAR | U8_DOUBLE; if(0xD800 <= cp && cp <= 0xDBFF) return CP_HIGH_SURROGATE | U8_TRIPLE; if(0xDC00 <= cp && cp <= 0xDFFF) return CP_LOW_SURROGATE | U8_TRIPLE; if(0xFDD0 <= cp && cp <= 0xFDEF) return CP_NONCHAR | U8_TRIPLE; if(cp <= 0xFFFD) return CP_CHAR | U8_TRIPLE; if(cp == 0xFFFE || cp == 0xFFFF) return CP_NONCHAR | U8_TRIPLE; if(cp <= 0x10FFFF && ((cp & 0xFFFF) == 0xFFFE || (cp & 0xFFFF) == 0xFFFF)) return CP_NONCHAR | U8_QUAD; if(cp <= 0x10FFFF) return CP_CHAR | U8_QUAD; if(cp <= 0x1FFFFF) return CP_OVERFLOW | U8_QUAD; return 0; } static MVMint32 utf8_encode(MVMuint8 *bp, MVMCodepoint cp) { unsigned cc = classify(cp); if (!(cc & (CP_CHAR | CP_NONCHAR))) return 0; if (cc & U8_SINGLE) { bp[0] = (MVMuint8)cp; return 1; } if (cc & U8_DOUBLE) { bp[0] = (MVMuint8)(( 6 << 5) | (cp >> 6)); bp[1] = (MVMuint8)(( 2 << 6) | (cp & 0x3F)); return 2; } if (cc & U8_TRIPLE) { bp[0] = (MVMuint8)((14 << 4) | (cp >> 12)); bp[1] = (MVMuint8)(( 2 << 6) | ((cp >> 6) & 0x3F)); bp[2] = (MVMuint8)(( 2 << 6) | ( cp & 0x3F)); return 3; } if (cc & U8_QUAD) { bp[0] = (MVMuint8)((30 << 3) | (cp >> 18)); bp[1] = (MVMuint8)(( 2 << 6) | ((cp >> 12) & 0x3F)); bp[2] = (MVMuint8)(( 2 << 6) | ((cp >> 6) & 0x3F)); bp[3] = (MVMuint8)(( 2 << 6) | ( cp & 0x3F)); return 4; } return 0; } /* end not_gerd section */ #define UTF8_MAXINC (32 * 1024 * 1024) /* Decodes the specified number of bytes of utf8 into an NFG string, creating * a result of the specified type. The type must have the MVMString REPR. */ MVMString * MVM_string_utf8_decode(MVMThreadContext *tc, const MVMObject *result_type, const char *utf8, size_t bytes) { MVMString *result = (MVMString *)REPR(result_type)->allocate(tc, STABLE(result_type)); MVMint32 count = 0; MVMCodepoint codepoint; MVMint32 line_ending = 0; MVMint32 state = 0; MVMint32 bufsize = bytes; MVMGrapheme32 lowest_graph = 0x7fffffff; MVMGrapheme32 highest_graph = -0x7fffffff; MVMGrapheme32 *buffer = MVM_malloc(sizeof(MVMGrapheme32) * bufsize); size_t orig_bytes; const char *orig_utf8; MVMint32 line; MVMint32 col; MVMint32 ready; /* Need to normalize to NFG as we decode. */ MVMNormalizer norm; MVM_unicode_normalizer_init(tc, &norm, MVM_NORMALIZE_NFG); orig_bytes = bytes; orig_utf8 = utf8; for (; bytes; ++utf8, --bytes) { switch(decode_utf8_byte(&state, &codepoint, (MVMuint8)*utf8)) { case UTF8_ACCEPT: { /* got a codepoint */ MVMGrapheme32 g; ready = MVM_unicode_normalizer_process_codepoint_to_grapheme(tc, &norm, codepoint, &g); if (ready) { while (count + ready > bufsize) { /* if the buffer's full make a bigger one */ buffer = MVM_realloc(buffer, sizeof(MVMGrapheme32) * ( bufsize >= UTF8_MAXINC ? (bufsize += UTF8_MAXINC) : (bufsize *= 2) )); } buffer[count++] = g; lowest_graph = g < lowest_graph ? g : lowest_graph; highest_graph = g > highest_graph ? g : highest_graph; while (--ready > 0) { g = MVM_unicode_normalizer_get_grapheme(tc, &norm); lowest_graph = g < lowest_graph ? g : lowest_graph; highest_graph = g > highest_graph ? g : highest_graph; buffer[count++] = g; } } break; } case UTF8_REJECT: /* found a malformed sequence; parse it again this time tracking * line and col numbers. */ MVM_unicode_normalizer_cleanup(tc, &norm); /* Since we'll throw. */ bytes = orig_bytes; utf8 = orig_utf8; state = 0; line = 1; col = 1; for (; bytes; ++utf8, --bytes) { switch(decode_utf8_byte(&state, &codepoint, (MVMuint8)*utf8)) { case UTF8_ACCEPT: /* this could be reorganized into several nested ugly if/else :/ */ if (!line_ending && (codepoint == 10 || codepoint == 13)) { /* Detect the style of line endings. * Select whichever comes first. * First or only part of first line ending. */ line_ending = codepoint; col = 1; line++; } else if (line_ending && codepoint == line_ending) { /* first or only part of next line ending */ col = 1; line++; } else if (codepoint == 10 || codepoint == 13) { /* second part of line ending; ignore */ } else /* non-line ending codepoint */ col++; break; case UTF8_REJECT: MVM_free(buffer); MVM_exception_throw_adhoc(tc, "Malformed UTF-8 at line %u col %u", line, col); } } MVM_free(buffer); MVM_exception_throw_adhoc(tc, "Concurrent modification of UTF-8 input buffer!"); break; } } if (state != UTF8_ACCEPT) { MVM_unicode_normalizer_cleanup(tc, &norm); MVM_free(buffer); MVM_exception_throw_adhoc(tc, "Malformed termination of UTF-8 string"); } /* Get any final graphemes from the normalizer, and clean it up. */ MVM_unicode_normalizer_eof(tc, &norm); ready = MVM_unicode_normalizer_available(tc, &norm); if (ready) { if (count + ready > bufsize) { buffer = MVM_realloc(buffer, sizeof(MVMGrapheme32) * (count + ready)); } while (ready--) { MVMGrapheme32 g; g = MVM_unicode_normalizer_get_grapheme(tc, &norm); lowest_graph = g < lowest_graph ? g : lowest_graph; highest_graph = g > highest_graph ? g : highest_graph; buffer[count++] = g; } } MVM_unicode_normalizer_cleanup(tc, &norm); /* If we're lucky, we can fit our string in 8 bits per grapheme. * That happens when our lowest value is bigger than -129 and our * highest value is lower than 128. */ if (-128 <= lowest_graph && highest_graph <= 127) { MVMGrapheme8 *new_buffer = MVM_malloc(sizeof(MVMGrapheme8) * count); for (ready = 0; ready < count; ready++) { new_buffer[ready] = buffer[ready]; } MVM_free(buffer); result->body.storage.blob_8 = new_buffer; result->body.storage_type = MVM_STRING_GRAPHEME_8; } else { /* just keep the same buffer as the MVMString's buffer. Later * we can add heuristics to resize it if we have enough free * memory */ if (bufsize - count > 4) { buffer = MVM_realloc(buffer, count * sizeof(MVMGrapheme32)); } result->body.storage.blob_32 = buffer; result->body.storage_type = MVM_STRING_GRAPHEME_32; } result->body.num_graphs = count; return result; } static MVMint32 its_the_bom(const char *utf8) { const MVMuint8 *uns_utf8 = (const MVMuint8 *)utf8; return uns_utf8[0] == 0xEF && uns_utf8[1] == 0xBB && uns_utf8[2] == 0xBF; } /* Same as MVM_string_utf8_decode, but strips a BOM if it finds one. */ MVMString * MVM_string_utf8_decode_strip_bom(MVMThreadContext *tc, const MVMObject *result_type, const char *utf8, size_t bytes) { if (bytes >= 3 && its_the_bom(utf8)) { utf8 += 3; bytes -= 3; } return MVM_string_utf8_decode(tc, result_type, utf8, bytes); } /* Decodes using a decodestream. Decodes as far as it can with the input * buffers, or until a stopper is reached. */ MVMuint32 MVM_string_utf8_decodestream(MVMThreadContext *tc, MVMDecodeStream *ds, const MVMint32 *stopper_chars, MVMDecodeStreamSeparators *seps) { MVMint32 count = 0, total = 0; MVMint32 state = 0; MVMCodepoint codepoint = 0; MVMCodepoint lag_codepoint = -1; MVMint32 bufsize; MVMGrapheme32 *buffer = NULL; MVMDecodeStreamBytes *cur_bytes = NULL; MVMDecodeStreamBytes *last_accept_bytes = ds->bytes_head; MVMDecodeStreamBytes *lag_last_accept_bytes = NULL; MVMint32 last_accept_pos, lag_last_accept_pos, ready, at_start; MVMuint32 reached_stopper; MVMuint32 can_fast_path; /* If there's no buffers, we're done. */ if (!ds->bytes_head) return 0; last_accept_pos = ds->bytes_head_pos; /* If we're asked for zero chars, also done. */ if (stopper_chars && *stopper_chars == 0) return 1; /* If there's nothing hanging around in the normalization buffer, we can * use the fast path. */ can_fast_path = MVM_unicode_normalizer_empty(tc, &(ds->norm)); bufsize = ds->result_size_guess; buffer = MVM_malloc(bufsize * sizeof(MVMGrapheme32)); /* Decode each of the buffers. */ cur_bytes = ds->bytes_head; at_start = ds->abs_byte_pos == 0; reached_stopper = 0; while (cur_bytes) { /* Process this buffer. */ MVMint32 pos = cur_bytes == ds->bytes_head ? ds->bytes_head_pos : 0; char *bytes = cur_bytes->bytes; if (at_start) { /* We're right at the start of the stream of things to decode. See * if we have a BOM, and skip over it if so. */ if (pos + 3 <= cur_bytes->length) { if (its_the_bom(bytes + pos)) { pos += 3; last_accept_bytes = cur_bytes; last_accept_pos = pos; } } at_start = 0; } /* We have both a fast path and a slow path for UTF-8 decoding. The * fast path covers the common case where we have no chars that are * significant to normalization, and so we can skip the normalizer. * This is true of the ASCII and Latin-1 ranges of UTF-8, with the * exception of \r. Note that since the following codepoint may be * the one that causes us to need to compose, we need a lag of 1 * codepoint. */ if (can_fast_path) { /* Lift the no lag codepoint case out of the hot loop below, * to save on a couple of branches. */ MVMCodepoint first_significant = ds->norm.first_significant; while (lag_codepoint == -1 && pos < cur_bytes->length) { switch(decode_utf8_byte(&state, &codepoint, bytes[pos++])) { case UTF8_ACCEPT: { if (codepoint == '\r' || codepoint >= first_significant) { can_fast_path = 0; last_accept_bytes = cur_bytes; last_accept_pos = pos; goto slow_path; } lag_codepoint = codepoint; lag_last_accept_bytes = cur_bytes; lag_last_accept_pos = pos; break; } case UTF8_REJECT: MVM_free(buffer); MVM_exception_throw_adhoc(tc, "Malformed UTF-8"); break; } } while (pos < cur_bytes->length) { switch(decode_utf8_byte(&state, &codepoint, bytes[pos++])) { case UTF8_ACCEPT: { /* If we hit something that needs the normalizer, we put * any lagging codepoint into its buffer and jump to it. */ if (codepoint == '\r' || codepoint >= first_significant) { MVM_unicode_normalizer_push_codepoints(tc, &(ds->norm), &lag_codepoint, 1); lag_codepoint = -1; /* Invalidate, we used it. */ can_fast_path = 0; last_accept_bytes = cur_bytes; last_accept_pos = pos; goto slow_path; } /* As we have a lagging codepoint, and this one does not * need normalization, then we know we can spit out the * lagging one. */ if (count == bufsize) { /* Valid character, but we filled the buffer. Attach this * one to the buffers linked list, and continue with a new * one. */ MVM_string_decodestream_add_chars(tc, ds, buffer, bufsize); buffer = MVM_malloc(bufsize * sizeof(MVMGrapheme32)); count = 0; } buffer[count++] = lag_codepoint; total++; if (MVM_string_decode_stream_maybe_sep(tc, seps, lag_codepoint) || stopper_chars && *stopper_chars == total) { reached_stopper = 1; last_accept_bytes = lag_last_accept_bytes; last_accept_pos = lag_last_accept_pos; goto done; } /* The current state becomes the lagged state. */ lag_codepoint = codepoint; lag_last_accept_bytes = cur_bytes; lag_last_accept_pos = pos; break; } case UTF8_REJECT: MVM_free(buffer); MVM_exception_throw_adhoc(tc, "Malformed UTF-8"); break; } } /* If we fall out of the loop and have a lagged codepoint, but * no next buffer, then we fall into the slow path to process it * correctly. */ if (lag_codepoint != -1 && !cur_bytes->next) { codepoint = lag_codepoint; lag_codepoint = -1; can_fast_path = 0; last_accept_bytes = lag_last_accept_bytes; last_accept_pos = lag_last_accept_pos; goto slow_path; } } else { while (pos < cur_bytes->length) { switch(decode_utf8_byte(&state, &codepoint, bytes[pos++])) { case UTF8_ACCEPT: { MVMGrapheme32 g; MVMint32 first; last_accept_bytes = cur_bytes; last_accept_pos = pos; slow_path: first = 1; ready = MVM_unicode_normalizer_process_codepoint_to_grapheme(tc, &(ds->norm), codepoint, &g); while (ready--) { if (first) first = 0; else g = MVM_unicode_normalizer_get_grapheme(tc, &(ds->norm)); if (count == bufsize) { /* Valid character, but we filled the buffer. Attach this * one to the buffers linked list, and continue with a new * one. */ MVM_string_decodestream_add_chars(tc, ds, buffer, bufsize); buffer = MVM_malloc(bufsize * sizeof(MVMGrapheme32)); count = 0; } buffer[count++] = g; total++; if (MVM_string_decode_stream_maybe_sep(tc, seps, g) || stopper_chars && *stopper_chars == total) { reached_stopper = 1; goto done; } } break; } case UTF8_REJECT: MVM_free(buffer); MVM_exception_throw_adhoc(tc, "Malformed UTF-8"); break; } } } cur_bytes = cur_bytes->next; } done: /* Attach what we successfully parsed as a result buffer, and trim away * what we chewed through. */ if (count) { MVM_string_decodestream_add_chars(tc, ds, buffer, count); } else { MVM_free(buffer); } MVM_string_decodestream_discard_to(tc, ds, last_accept_bytes, last_accept_pos); return reached_stopper; } /* Encodes the specified string to UTF-8. */ char * MVM_string_utf8_encode_substr(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint64 start, MVMint64 length, MVMString *replacement, MVMint32 translate_newlines) { MVMuint8 *result = NULL; size_t result_pos, result_limit; MVMCodepointIter ci; MVMStringIndex strgraphs = MVM_string_graphs(tc, str); MVMuint8 *repl_bytes = NULL; MVMuint64 repl_length; if (start < 0 || start > strgraphs) MVM_exception_throw_adhoc(tc, "start out of range"); if (length == -1) length = strgraphs; if (length < 0 || start + length > strgraphs) MVM_exception_throw_adhoc(tc, "length out of range"); if (replacement) repl_bytes = (MVMuint8 *) MVM_string_utf8_encode_substr(tc, replacement, &repl_length, 0, -1, NULL, translate_newlines); /* Guesstimate that we'll be within 2 bytes for most chars most of the * time, and give ourselves 4 bytes breathing space. */ result_limit = 2 * length; result = MVM_malloc(result_limit + 4); result_pos = 0; /* Iterate the codepoints and encode them. */ MVM_string_ci_init(tc, &ci, str, translate_newlines, 0); while (MVM_string_ci_has_more(tc, &ci)) { MVMint32 bytes; MVMCodepoint cp = MVM_string_ci_get_codepoint(tc, &ci); if (result_pos >= result_limit) { result_limit *= 2; result = MVM_realloc(result, result_limit + 4); } bytes = utf8_encode(result + result_pos, cp); if (bytes) result_pos += bytes; else if (replacement) { if (repl_length >= result_limit || result_pos >= result_limit - repl_length) { result_limit += repl_length; result = MVM_realloc(result, result_limit + 4); } memcpy(result + result_pos, repl_bytes, repl_length); result_pos += repl_length; } else { MVM_free(result); MVM_free(repl_bytes); MVM_string_utf8_throw_encoding_exception(tc, cp); } } if (output_size) *output_size = (MVMuint64)result_pos; MVM_free(repl_bytes); return (char *)result; } /* Encodes the specified string to UTF-8. */ char * MVM_string_utf8_encode(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint32 translate_newlines) { return MVM_string_utf8_encode_substr(tc, str, output_size, 0, -1, NULL, translate_newlines); } /* Encodes the specified string to a UTF-8 C string. */ char * MVM_string_utf8_encode_C_string(MVMThreadContext *tc, MVMString *str) { MVMuint64 output_size; char * result = NULL; char * utf8_string = MVM_string_utf8_encode(tc, str, &output_size, 0); /* this is almost always called from error-handling code. Don't care if it * contains embedded NULs. XXX TODO: Make sure all uses of this free what it returns */ result = MVM_malloc(output_size + 1); memcpy(result, utf8_string, output_size); MVM_free(utf8_string); result[output_size] = (char)0; return result; } /* Encodes the specified string to a UTF-8 C string if it is not NULL. */ char * MVM_string_utf8_maybe_encode_C_string(MVMThreadContext *tc, MVMString *str) { return str ? MVM_string_utf8_encode_C_string(tc, str) : NULL; } void MVM_string_utf8_throw_encoding_exception (MVMThreadContext *tc, MVMCodepoint cp) { const char *gencat = MVM_unicode_codepoint_get_property_cstr(tc, cp, MVM_UNICODE_PROPERTY_GENERAL_CATEGORY); if(cp > 0x10FFFF) { MVM_exception_throw_adhoc(tc, "Error encoding UTF-8 string: could not encode codepoint %d (0x%X), codepoint out of bounds. Cannot encode higher than %d (0x%X)", cp, cp, 0x10FFFF, 0x10FFFF); } else if (strcmp("Cs", gencat) == 0) { MVM_exception_throw_adhoc(tc, "Error encoding UTF-8 string: could not encode Unicode Surrogate codepoint %d (0x%X)", cp, cp); } else { MVM_exception_throw_adhoc(tc, "Error encoding UTF-8 string: could not encode codepoint %d (0x%X)", cp, cp); } } MoarVM-2018.03/src/strings/utf8.h0000644000175000017510000000200413237701241016516 0ustar samanthasamanthaMVM_PUBLIC MVMString * MVM_string_utf8_decode(MVMThreadContext *tc, const MVMObject *result_type, const char *utf8, size_t bytes); MVM_PUBLIC MVMString * MVM_string_utf8_decode_strip_bom(MVMThreadContext *tc, const MVMObject *result_type, const char *utf8, size_t bytes); MVM_PUBLIC MVMuint32 MVM_string_utf8_decodestream(MVMThreadContext *tc, MVMDecodeStream *ds, const MVMint32 *stopper_chars, MVMDecodeStreamSeparators *seps); MVM_PUBLIC char * MVM_string_utf8_encode_substr(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint64 start, MVMint64 length, MVMString *replacement, MVMint32 translate_newlines); MVM_PUBLIC char * MVM_string_utf8_encode(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint32 translate_newlines); MVM_PUBLIC char * MVM_string_utf8_encode_C_string(MVMThreadContext *tc, MVMString *str); char * MVM_string_utf8_maybe_encode_C_string(MVMThreadContext *tc, MVMString *str); void MVM_string_utf8_throw_encoding_exception (MVMThreadContext *tc, MVMCodepoint cp); MoarVM-2018.03/src/strings/utf8_c8.c0000644000175000017510000006523613237701241017123 0ustar samanthasamantha#include "moar.h" /* UTF-8 Clean-8 is an encoder/decoder that primarily works as the UTF-8 one. * However, upon encountering a byte sequence that will either not decode as * valid UTF-8, or that would not round-trip due to normalization, it will use * NFG synthetics to keep track of the original bytes involved. This means that * encoding back to UTF-8 Clean-8 will be able to recreate the bytes as they * originally existed. The synthetics contain 4 codepoints: * * * The codepoint 0x10FFFD (which is a private use codepoint) * * The codepoint 'x' * * The upper 4 bits of the non-decodable byte as a hex char (0..9A..F) * * The lower 4 bits as the non-decodable byte as a hex char (0..9A..F) * * Under normal UTF-8 encoding, this means the unrepresentable characters will * come out as something like `?xFF`. * * UTF-8 Clean-8 is used in places where MoarVM receives strings from the * environment, command line arguments, and file system queries. */ /* begin not_gerd section (modified from original) // Copyright 2012 not_gerd // see http://irclog.perlgeek.de/perl6/2012-06-04#i_5681122 Permission is granted to use, modify, and / or redistribute at will. This includes removing authorship notices, re-use of code parts in other software (with or without giving credit), and / or creating a commercial product based on it. This permission is not revocable by the author. This software is provided as-is. Use it at your own risk. There is no warranty whatsoever, neither expressed nor implied, and by using this software you accept that the author(s) shall not be held liable for any loss of data, loss of service, or other damages, be they incidental or consequential. Your only option other than accepting this is not to use the software at all. */ enum { CP_CHAR = 1 << 0, CP_LOW_SURROGATE = 1 << 1, CP_HIGH_SURROGATE = 1 << 2, CP_NONCHAR = 1 << 3, CP_OVERFLOW = 1 << 4, U8_SINGLE = 1 << 5, U8_DOUBLE = 1 << 6, U8_TRIPLE = 1 << 7, U8_QUAD = 1 << 8 }; static unsigned classify(MVMCodepoint cp) { if(cp <= 0x7F) return CP_CHAR | U8_SINGLE; if(cp <= 0x07FF) return CP_CHAR | U8_DOUBLE; if(0xD800 <= cp && cp <= 0xDBFF) return CP_HIGH_SURROGATE | U8_TRIPLE; if(0xDC00 <= cp && cp <= 0xDFFF) return CP_LOW_SURROGATE | U8_TRIPLE; if(0xFDD0 <= cp && cp <= 0xFDEF) return CP_NONCHAR | U8_TRIPLE; if(cp <= 0xFFFD) return CP_CHAR | U8_TRIPLE; if(cp == 0xFFFE || cp == 0xFFFF) return CP_NONCHAR | U8_TRIPLE; if(cp <= 0x10FFFF && ((cp & 0xFFFF) == 0xFFFE || (cp & 0xFFFF) == 0xFFFF)) return CP_NONCHAR | U8_QUAD; if(cp <= 0x10FFFF) return CP_CHAR | U8_QUAD; if(cp <= 0x1FFFFF) return CP_OVERFLOW | U8_QUAD; return 0; } static MVMint32 utf8_encode(MVMuint8 *bp, MVMCodepoint cp) { unsigned cc = classify(cp); if (!(cc & (CP_CHAR | CP_NONCHAR))) return 0; if (cc & U8_SINGLE) { bp[0] = (MVMuint8)cp; return 1; } if (cc & U8_DOUBLE) { bp[0] = (MVMuint8)(( 6 << 5) | (cp >> 6)); bp[1] = (MVMuint8)(( 2 << 6) | (cp & 0x3F)); return 2; } if (cc & U8_TRIPLE) { bp[0] = (MVMuint8)((14 << 4) | (cp >> 12)); bp[1] = (MVMuint8)(( 2 << 6) | ((cp >> 6) & 0x3F)); bp[2] = (MVMuint8)(( 2 << 6) | ( cp & 0x3F)); return 3; } if (cc & U8_QUAD) { bp[0] = (MVMuint8)((30 << 3) | (cp >> 18)); bp[1] = (MVMuint8)(( 2 << 6) | ((cp >> 12) & 0x3F)); bp[2] = (MVMuint8)(( 2 << 6) | ((cp >> 6) & 0x3F)); bp[3] = (MVMuint8)(( 2 << 6) | ( cp & 0x3F)); return 4; } return 0; } /* end not_gerd section */ #define UTF8_MAXINC (32 * 1024 * 1024) static void ensure_buffer(MVMGrapheme32 **buffer, MVMint32 *bufsize, MVMint32 needed) { while (needed >= *bufsize) *buffer = MVM_realloc(*buffer, sizeof(MVMGrapheme32) * ( *bufsize >= UTF8_MAXINC ? (*bufsize += UTF8_MAXINC) : (*bufsize *= 2) )); } static const MVMuint8 hex_chars[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; static MVMGrapheme32 synthetic_for(MVMThreadContext *tc, MVMuint8 invalid) { if (invalid > 0x7F) { /* A real invalid. */ MVMuint8 high = invalid >> 4; MVMuint8 low = invalid & 0x0F; MVMCodepoint cps[] = { 0x10FFFD, 'x', hex_chars[high], hex_chars[low] }; return MVM_nfg_codes_to_grapheme_utf8_c8(tc, cps, 4); } else { /* Was in things thrown out as invalid by the decoder, but has an * ASCII interpretation, so hand it back as is. */ return invalid; } } /* What the UTF-C8 decode process is expecting. */ typedef enum { EXPECT_START = 0, EXPECT_CONTINUATION = 1 } Expecting; /* Decode state for the UTF8-C8 decoder. */ typedef struct { /* The UTF-8 we're decoding. */ const MVMuint8 *utf8; /* The index of the current byte we're decoding. */ size_t cur_byte; /* The index of the first unaccepted byte. */ size_t unaccepted_start; /* What kind of byte we're expecting next. */ Expecting expecting; /* The current codepoint we're decoding. */ MVMCodepoint cur_codepoint; /* The result buffer we're decoding into. */ MVMGrapheme32 *result; /* The current position in the result buffer. */ size_t result_pos; /* Buffer of original codepoints, to ensure we will not spit out any * synthetics into the result that will re-order on round-trip. */ MVMCodepoint *orig_codes; /* Position we're at in inserting into orig_codes. */ size_t orig_codes_pos; /* First orig_codes index that did not yet go through the normalizer. */ size_t orig_codes_unnormalized; /* The normalizer we're using to make synthetics that will not cause an * order change on output. */ MVMNormalizer norm; /* Bad bytes from an earlier buffer, for the sake of streaming decode. */ MVMuint8 prev_bad_bytes[4]; MVMint32 num_prev_bad_bytes; } DecodeState; /* Appends a single grapheme to the buffer if it will not cause a mismatch * with the original codepoints upon encoding back to UTF-8. Returns non-zero * in this case. Otherwise, appends synthetics for the bytes the original code * points were encoded as. Since we can end up with index mis-matches, we just * spit out codepoints to catch the normalizer up to everything in the orig * codes buffer. */ static int append_grapheme(MVMThreadContext *tc, DecodeState *state, MVMGrapheme32 g) { if (g == state->orig_codes[state->orig_codes_unnormalized]) { /* Easy case: exact match. */ state->result[state->result_pos++] = g; state->orig_codes_unnormalized++; return 1; } else if (g < 0) { MVMNFGSynthetic *synth = MVM_nfg_get_synthetic_info(tc, g); int mismatch = 0; if (synth->codes[0] == state->orig_codes[state->orig_codes_unnormalized]) { MVMint32 i; for (i = 1; i < synth->num_codes; i++) { size_t orig_idx = state->orig_codes_unnormalized + i; if (state->orig_codes_pos <= orig_idx || state->orig_codes[orig_idx] != synth->codes[i]) { mismatch = 1; break; } } } else { mismatch = 1; } if (!mismatch) { state->result[state->result_pos++] = g; state->orig_codes_unnormalized += synth->num_codes; return 1; } } /* If we get here, then normalization would trash the original bytes. */ { /* Spit out synthetics to keep the bytes as is. */ size_t i, j; for (i = state->orig_codes_unnormalized; i < state->orig_codes_pos; i++) { MVMCodepoint to_encode = state->orig_codes[i]; MVMuint8 encoded[4]; MVMint32 bytes = utf8_encode(encoded, to_encode); for (j = 0; j < bytes; j++) state->result[state->result_pos++] = synthetic_for(tc, encoded[j]); } /* Consider all codes pushed now normalized. */ state->orig_codes_unnormalized = state->orig_codes_pos; /* Put a clean normalizer in place. */ MVM_unicode_normalizer_cleanup(tc, &(state->norm)); MVM_unicode_normalizer_init(tc, &(state->norm), MVM_NORMALIZE_NFG); return 0; } } /* Called when decoding has reached an acceptable codepoint. */ static void process_ok_codepoint(MVMThreadContext *tc, DecodeState *state) { MVMint32 ready; MVMGrapheme32 g; /* Consider the byte range accepted. */ state->unaccepted_start = state->cur_byte + 1; /* Insert into original codepoints list and hand it to the normalizer. */ state->orig_codes[state->orig_codes_pos++] = state->cur_codepoint; ready = MVM_unicode_normalizer_process_codepoint_to_grapheme(tc, &(state->norm), state->cur_codepoint, &g); /* If the normalizer produced some output... */ if (ready) { if (append_grapheme(tc, state, g)) { while (--ready > 0) { g = MVM_unicode_normalizer_get_grapheme(tc, &(state->norm)); if (!append_grapheme(tc, state, g)) break; } } } /* We've no longer any bad bytes to care about from earlier buffers; * they ended up making an acceptable codepoint. */ state->num_prev_bad_bytes = 0; } /* Called when a bad byte has been encountered, or at the end of output. */ static void process_bad_bytes(MVMThreadContext *tc, DecodeState *state) { size_t i; MVMint32 ready; /* Flush normalization buffer and take from that. */ MVM_unicode_normalizer_eof(tc, &(state->norm)); ready = MVM_unicode_normalizer_available(tc, &(state->norm)); while (ready-- > 0) { MVMGrapheme32 g = MVM_unicode_normalizer_get_grapheme(tc, &(state->norm)); if (!append_grapheme(tc, state, g)) break; } /* Now add in synthetics for bad bytes. */ for (i = 0; i < state->num_prev_bad_bytes; i++) state->result[state->result_pos++] = synthetic_for(tc, state->prev_bad_bytes[i]); state->num_prev_bad_bytes = 0; for (i = state->unaccepted_start; i <= state->cur_byte; i++) state->result[state->result_pos++] = synthetic_for(tc, state->utf8[i]); state->unaccepted_start = state->cur_byte + 1; } /* Check for if the codepoint is in range. Make sure it's not over 0x10FFFF * and make sure it isn't a Surrogate */ MVM_STATIC_INLINE int in_range (MVMCodepoint cp) { return ( 0 <= cp && cp <= 0x10FFFF) && (cp < 0xD800 || 0xDFFF < cp); /* Surrogates */ } /* Decodes the specified number of bytes of utf8 into an NFG string, creating * a result of the specified type. The type must have the MVMString REPR. */ MVMString * MVM_string_utf8_c8_decode(MVMThreadContext *tc, const MVMObject *result_type, const char *utf8, size_t bytes) { DecodeState state; /* Local state for decode loop. */ int expected_continuations = 0; int min_expected_codepoint; /* Don't do anything if empty. */ if (bytes == 0) return tc->instance->str_consts.empty; /* Decoding state, in a struct to easily pass to utility routines. * Result buffer is a maximum estimate to avoid realloc; we can shrink * it at the end. */ state.utf8 = (MVMuint8 *)utf8; state.cur_byte = 0; state.unaccepted_start = 0; state.expecting = EXPECT_START; state.cur_codepoint = 0; state.result = MVM_malloc(sizeof(MVMGrapheme32) * bytes); state.result_pos = 0; state.orig_codes = MVM_malloc(sizeof(MVMCodepoint) * bytes); state.orig_codes_pos = 0; state.orig_codes_unnormalized = 0; state.num_prev_bad_bytes = 0; MVM_unicode_normalizer_init(tc, &(state.norm), MVM_NORMALIZE_NFG); while (state.cur_byte < bytes) { MVMuint8 decode_byte = utf8[state.cur_byte]; switch (state.expecting) { case EXPECT_START: if ((decode_byte & 0x80) == 0) { /* Single byte sequence. */ state.cur_codepoint = decode_byte; process_ok_codepoint(tc, &state); } else if ((decode_byte & 0xE0) == 0xC0) { state.cur_codepoint = decode_byte & 0x1F; state.expecting = EXPECT_CONTINUATION; expected_continuations = 1; min_expected_codepoint = 0x80; } else if ((decode_byte & 0xF0) == 0xE0) { state.cur_codepoint = decode_byte & 0x0F; state.expecting = EXPECT_CONTINUATION; expected_continuations = 2; min_expected_codepoint = 0x800; } else if ((decode_byte & 0xF8) == 0xF0) { state.cur_codepoint = decode_byte & 0x07; state.expecting = EXPECT_CONTINUATION; expected_continuations = 3; min_expected_codepoint = 0x10000; } else { /* Invalid byte sequence. */ process_bad_bytes(tc, &state); } break; case EXPECT_CONTINUATION: if ((decode_byte & 0xC0) == 0x80) { state.cur_codepoint = (state.cur_codepoint << 6) | (decode_byte & 0x3F); expected_continuations--; if (expected_continuations == 0) { if (min_expected_codepoint <= state.cur_codepoint && in_range(state.cur_codepoint)) process_ok_codepoint(tc, &state); else process_bad_bytes(tc, &state); state.expecting = EXPECT_START; } } else { /* Invalid byte sequence. */ process_bad_bytes(tc, &state); state.expecting = EXPECT_START; } break; } state.cur_byte++; } /* Handle anything dangling off the end. */ state.cur_byte--; /* So we don't read 1 past the end. */ process_bad_bytes(tc, &state); MVM_free(state.orig_codes); MVM_unicode_normalizer_cleanup(tc, &(state.norm)); { MVMString *result = (MVMString *)REPR(result_type)->allocate(tc, STABLE(result_type)); result->body.storage.blob_32 = state.result; result->body.storage_type = MVM_STRING_GRAPHEME_32; result->body.num_graphs = state.result_pos; return result; } } /* Decodes using a decodestream. Decodes as far as it can with the input * buffers, or until a stopper is reached. */ MVMuint32 MVM_string_utf8_c8_decodestream(MVMThreadContext *tc, MVMDecodeStream *ds, const MVMint32 *stopper_chars, MVMDecodeStreamSeparators *seps, MVMint32 eof) { /* Local state for decode loop. */ MVMDecodeStreamBytes *cur_bytes; MVMDecodeStreamBytes *last_accept_bytes = ds->bytes_head; MVMint32 last_accept_pos = ds->bytes_head_pos; DecodeState state; int expected_continuations = 0; int min_expected_codepoint; MVMuint32 reached_stopper = 0; MVMint32 result_graphs = 0; /* If there's no buffers, we're done. */ if (!ds->bytes_head) return 0; last_accept_pos = ds->bytes_head_pos; /* If we're asked for zero chars, also done. */ if (stopper_chars && *stopper_chars == 0) return 1; /* Otherwise set up decode state, stealing normalizer of the decode * stream and re-instating any past orig_codes. */ state.expecting = EXPECT_START; state.cur_codepoint = 0; state.num_prev_bad_bytes = 0; memcpy(&(state.norm), &(ds->norm), sizeof(MVMNormalizer)); if (ds->decoder_state) { MVMCodepoint *saved = (MVMCodepoint *)ds->decoder_state; state.orig_codes = MVM_malloc( sizeof(MVMCodepoint) * (saved[0] + ds->bytes_head->length) ); state.orig_codes_pos = saved[0]; state.orig_codes_unnormalized = 0; memcpy(state.orig_codes, saved + 1, saved[0] * sizeof(MVMCodepoint)); MVM_free(ds->decoder_state); ds->decoder_state = NULL; } else { state.orig_codes = NULL; state.orig_codes_pos = 0; state.orig_codes_unnormalized = 0; } /* Decode each of the buffers. */ cur_bytes = ds->bytes_head; reached_stopper = 0; while (cur_bytes && !reached_stopper) { /* Set up decode state for this buffer. */ MVMint32 bytes = ds->bytes_head->length; state.result = MVM_malloc(bytes * sizeof(MVMGrapheme32)); state.orig_codes = MVM_realloc(state.orig_codes, sizeof(MVMCodepoint) * (state.orig_codes_pos + bytes)); state.result_pos = 0; state.utf8 = (const MVMuint8*)cur_bytes->bytes; state.cur_byte = cur_bytes == ds->bytes_head ? ds->bytes_head_pos : 0; state.unaccepted_start = state.cur_byte; /* Process this buffer. */ while (state.cur_byte < bytes) { /* Process a byte. */ MVMuint8 decode_byte = state.utf8[state.cur_byte]; MVMint32 maybe_new_graph = 0; switch (state.expecting) { case EXPECT_START: if ((decode_byte & 0x80) == 0) { /* Single byte sequence. */ state.cur_codepoint = decode_byte; process_ok_codepoint(tc, &state); maybe_new_graph = 1; } else if ((decode_byte & 0xE0) == 0xC0) { state.cur_codepoint = decode_byte & 0x1F; state.expecting = EXPECT_CONTINUATION; expected_continuations = 1; min_expected_codepoint = 0x80; } else if ((decode_byte & 0xF0) == 0xE0) { state.cur_codepoint = decode_byte & 0x0F; state.expecting = EXPECT_CONTINUATION; expected_continuations = 2; min_expected_codepoint = 0x800; } else if ((decode_byte & 0xF8) == 0xF0) { state.cur_codepoint = decode_byte & 0x07; state.expecting = EXPECT_CONTINUATION; expected_continuations = 3; min_expected_codepoint = 0x10000; } else { /* Invalid byte sequence. */ process_bad_bytes(tc, &state); maybe_new_graph = 1; } break; case EXPECT_CONTINUATION: if ((decode_byte & 0xC0) == 0x80) { state.cur_codepoint = (state.cur_codepoint << 6) | (decode_byte & 0x3F); expected_continuations--; if (expected_continuations == 0) { if (state.cur_codepoint >= min_expected_codepoint) process_ok_codepoint(tc, &state); else process_bad_bytes(tc, &state); maybe_new_graph = 1; state.expecting = EXPECT_START; } } else { /* Invalid byte sequence. */ process_bad_bytes(tc, &state); maybe_new_graph = 1; state.expecting = EXPECT_START; } break; } state.cur_byte++; /* See if we've reached a stopper. */ if (maybe_new_graph && state.result_pos > 0) { if (stopper_chars) { if (result_graphs + state.result_pos >= *stopper_chars) { reached_stopper = 1; break; } } if (MVM_string_decode_stream_maybe_sep(tc, seps, state.result[state.result_pos - 1])) { reached_stopper = 1; break; } } } /* If we're at EOF and this is the last buffer, force out last bytes. */ if (eof && !reached_stopper && !cur_bytes->next) { state.cur_byte--; /* So we don't read 1 past the end. */ process_bad_bytes(tc, &state); } /* Attach what we successfully parsed as a result buffer, and trim away * what we chewed through. */ if (state.result_pos) MVM_string_decodestream_add_chars(tc, ds, state.result, state.result_pos); else MVM_free(state.result); result_graphs += state.result_pos; /* Update our accepted position. */ if (state.unaccepted_start > 0) { last_accept_bytes = cur_bytes; last_accept_pos = state.unaccepted_start; } /* If there were bytes we didn't accept, hold on to them in case we * need to emit them as bad bytes. */ if (state.unaccepted_start != state.cur_byte && cur_bytes->next) { int i; for (i = state.unaccepted_start; i < state.cur_byte; i++) state.prev_bad_bytes[state.num_prev_bad_bytes++] = state.utf8[i]; } cur_bytes = cur_bytes->next; } /* Eat the bytes we decoded. */ MVM_string_decodestream_discard_to(tc, ds, last_accept_bytes, last_accept_pos); /* Persist current normalizer. */ memcpy(&(ds->norm), &(state.norm), sizeof(MVMNormalizer)); /* Stash away any leftover codepoints we'll need to examine. */ if (state.orig_codes_pos && state.orig_codes_pos != state.orig_codes_unnormalized) { size_t diff = state.orig_codes_pos - state.orig_codes_unnormalized; MVMCodepoint *saved = MVM_malloc(sizeof(MVMCodepoint) * (1 + diff)); saved[0] = diff; memcpy(saved + 1, state.orig_codes + state.orig_codes_unnormalized, diff * sizeof(MVMCodepoint)); ds->decoder_state = saved; } MVM_free(state.orig_codes); return reached_stopper; } /* Encodes the specified string to UTF-8. */ static void emit_cp(MVMThreadContext *tc, MVMCodepoint cp, MVMuint8 **result, size_t *result_pos, size_t *result_limit, MVMuint8 *repl_bytes, MVMuint64 repl_length) { MVMint32 bytes; if (*result_pos >= *result_limit) { *result_limit *= 2; *result = MVM_realloc(*result, *result_limit + 4); } bytes = utf8_encode(*result + *result_pos, cp); if (bytes) *result_pos += bytes; else if (repl_bytes) { if (repl_length >= *result_limit || *result_pos >= *result_limit - repl_length) { *result_limit += repl_length; *result = MVM_realloc(*result, *result_limit + 4); } memcpy(*result + *result_pos, repl_bytes, repl_length); *result_pos += repl_length; } else { MVM_free(*result); MVM_free(repl_bytes); MVM_string_utf8_throw_encoding_exception(tc, cp); } } static int hex2int(MVMThreadContext *tc, MVMCodepoint cp) { if (cp >= '0' && cp <= '9') return cp - '0'; else if (cp >= 'A' && cp <= 'F') return 10 + (cp - 'A'); else MVM_exception_throw_adhoc(tc, "UTF-8 C-8 encoding encountered corrupt synthetic"); } char * MVM_string_utf8_c8_encode_substr(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint64 start, MVMint64 length, MVMString *replacement) { MVMuint8 *result; size_t result_pos, result_limit; MVMGraphemeIter gi; MVMStringIndex strgraphs = MVM_string_graphs(tc, str); MVMuint8 *repl_bytes = NULL; MVMuint64 repl_length; if (start < 0 || start > strgraphs) MVM_exception_throw_adhoc(tc, "start out of range"); if (length == -1) length = strgraphs; if (length < 0 || start + length > strgraphs) MVM_exception_throw_adhoc(tc, "length out of range"); if (replacement) repl_bytes = (MVMuint8 *) MVM_string_utf8_c8_encode_substr(tc, replacement, &repl_length, 0, -1, NULL); /* Guesstimate that we'll be within 2 bytes for most chars most of the * time, and give ourselves 4 bytes breathing space. */ result_limit = 2 * length; result = MVM_malloc(result_limit + 4); result_pos = 0; /* We iterate graphemes, looking out for any synthetics. If we find a * UTF-8 C-8 synthetic, then we spit out the raw byte. If we find any * other synthetic, we iterate its codepoints. */ MVM_string_gi_init(tc, &gi, str); while (MVM_string_gi_has_more(tc, &gi)) { MVMGrapheme32 g = MVM_string_gi_get_grapheme(tc, &gi); if (g >= 0) { emit_cp(tc, g, &result, &result_pos, &result_limit, repl_bytes, repl_length); } else { MVMNFGSynthetic *synth = MVM_nfg_get_synthetic_info(tc, g); if (synth->is_utf8_c8) { /* UTF-8 C-8 synthetic; emit the byte. */ if (result_pos >= result_limit) { result_limit *= 2; result = MVM_realloc(result, result_limit + 1); } result[result_pos++] = (hex2int(tc, synth->codes[2]) << 4) + hex2int(tc, synth->codes[3]); } else { MVMint32 i; for (i = 0; i < synth->num_codes; i++) emit_cp(tc, synth->codes[i], &result, &result_pos, &result_limit, repl_bytes, repl_length); } } } if (output_size) *output_size = (MVMuint64)result_pos; MVM_free(repl_bytes); return (char *)result; } /* Encodes the specified string to UTF-8 C-8. */ char * MVM_string_utf8_c8_encode(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size) { return MVM_string_utf8_c8_encode_substr(tc, str, output_size, 0, MVM_string_graphs(tc, str), NULL); } /* Encodes the specified string to a UTF-8 C-8 C string. */ char * MVM_string_utf8_c8_encode_C_string(MVMThreadContext *tc, MVMString *str) { MVMuint64 output_size; char *result; char *utf8_string = MVM_string_utf8_c8_encode(tc, str, &output_size); result = MVM_malloc(output_size + 1); memcpy(result, utf8_string, output_size); MVM_free(utf8_string); result[output_size] = (char)0; return result; } MoarVM-2018.03/src/strings/utf8_c8.h0000644000175000017510000000125713237701241017121 0ustar samanthasamanthaMVM_PUBLIC MVMString * MVM_string_utf8_c8_decode(MVMThreadContext *tc, const MVMObject *result_type, const char *utf8, size_t bytes); MVM_PUBLIC MVMuint32 MVM_string_utf8_c8_decodestream(MVMThreadContext *tc, MVMDecodeStream *ds, const MVMint32 *stopper_chars, MVMDecodeStreamSeparators *seps, MVMint32 eof); MVM_PUBLIC char * MVM_string_utf8_c8_encode_substr(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint64 start, MVMint64 length, MVMString *replacement); MVM_PUBLIC char * MVM_string_utf8_c8_encode(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size); MVM_PUBLIC char * MVM_string_utf8_c8_encode_C_string(MVMThreadContext *tc, MVMString *str); MoarVM-2018.03/src/strings/windows1252.c0000644000175000017510000006677513252330426017660 0ustar samanthasamantha#include "moar.h" #define UNMAPPED 0xFFFF /* Windows-1252 Latin */ static const MVMuint16 windows1252_codepoints[] = { 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, 0x20AC,0xFFFF,0x201A,0x0192,0x201E,0x2026,0x2020,0x2021, 0x02C6,0x2030,0x0160,0x2039,0x0152,0xFFFF,0x017D,0xFFFF, 0xFFFF,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014, 0x02DC,0x2122,0x0161,0x203A,0x0153,0xFFFF,0x017E,0x0178, 0x00A0,0x00A1,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7, 0x00A8,0x00A9,0x00AA,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF, 0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7, 0x00B8,0x00B9,0x00BA,0x00BB,0x00BC,0x00BD,0x00BE,0x00BF, 0x00C0,0x00C1,0x00C2,0x00C3,0x00C4,0x00C5,0x00C6,0x00C7, 0x00C8,0x00C9,0x00CA,0x00CB,0x00CC,0x00CD,0x00CE,0x00CF, 0x00D0,0x00D1,0x00D2,0x00D3,0x00D4,0x00D5,0x00D6,0x00D7, 0x00D8,0x00D9,0x00DA,0x00DB,0x00DC,0x00DD,0x00DE,0x00DF, 0x00E0,0x00E1,0x00E2,0x00E3,0x00E4,0x00E5,0x00E6,0x00E7, 0x00E8,0x00E9,0x00EA,0x00EB,0x00EC,0x00ED,0x00EE,0x00EF, 0x00F0,0x00F1,0x00F2,0x00F3,0x00F4,0x00F5,0x00F6,0x00F7, 0x00F8,0x00F9,0x00FA,0x00FB,0x00FC,0x00FD,0x00FE,0x00FF }; /* Windows-1251 Cyrillic */ static const MVMuint16 windows1251_codepoints[] = { 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, 0x0402,0x0403,0x201A,0x0453,0x201E,0x2026,0x2020,0x2021, 0x20AC,0x2030,0x0409,0x2039,0x040A,0x040C,0x040B,0x040F, 0x0452,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014, 0xFFFF,0x2122,0x0459,0x203A,0x045A,0x045C,0x045B,0x045F, 0x00A0,0x040E,0x045E,0x0408,0x00A4,0x0490,0x00A6,0x00A7, 0x0401,0x00A9,0x0404,0x00AB,0x00AC,0x00AD,0x00AE,0x0407, 0x00B0,0x00B1,0x0406,0x0456,0x0491,0x00B5,0x00B6,0x00B7, 0x0451,0x2116,0x0454,0x00BB,0x0458,0x0405,0x0455,0x0457, 0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0416,0x0417, 0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E,0x041F, 0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426,0x0427, 0x0428,0x0429,0x042A,0x042B,0x042C,0x042D,0x042E,0x042F, 0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0436,0x0437, 0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E,0x043F, 0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446,0x0447, 0x0448,0x0449,0x044A,0x044B,0x044C,0x044D,0x044E,0x044F }; static MVMuint8 windows1252_cp_to_char(MVMint32 codepoint) { if (8482 < codepoint || codepoint < 0) return '\0'; switch (codepoint) { case 160: return 160; case 161: return 161; case 162: return 162; case 163: return 163; case 164: return 164; case 165: return 165; case 166: return 166; case 167: return 167; case 168: return 168; case 169: return 169; case 170: return 170; case 171: return 171; case 172: return 172; case 173: return 173; case 174: return 174; case 175: return 175; case 176: return 176; case 177: return 177; case 178: return 178; case 179: return 179; case 180: return 180; case 181: return 181; case 182: return 182; case 183: return 183; case 184: return 184; case 185: return 185; case 186: return 186; case 187: return 187; case 188: return 188; case 189: return 189; case 190: return 190; case 191: return 191; case 192: return 192; case 193: return 193; case 194: return 194; case 195: return 195; case 196: return 196; case 197: return 197; case 198: return 198; case 199: return 199; case 200: return 200; case 201: return 201; case 202: return 202; case 203: return 203; case 204: return 204; case 205: return 205; case 206: return 206; case 207: return 207; case 208: return 208; case 209: return 209; case 210: return 210; case 211: return 211; case 212: return 212; case 213: return 213; case 214: return 214; case 215: return 215; case 216: return 216; case 217: return 217; case 218: return 218; case 219: return 219; case 220: return 220; case 221: return 221; case 222: return 222; case 223: return 223; case 224: return 224; case 225: return 225; case 226: return 226; case 227: return 227; case 228: return 228; case 229: return 229; case 230: return 230; case 231: return 231; case 232: return 232; case 233: return 233; case 234: return 234; case 235: return 235; case 236: return 236; case 237: return 237; case 238: return 238; case 239: return 239; case 240: return 240; case 241: return 241; case 242: return 242; case 243: return 243; case 244: return 244; case 245: return 245; case 246: return 246; case 247: return 247; case 248: return 248; case 249: return 249; case 250: return 250; case 251: return 251; case 252: return 252; case 253: return 253; case 254: return 254; case 255: return 255; case 338: return 140; case 339: return 156; case 352: return 138; case 353: return 154; case 376: return 159; case 381: return 142; case 382: return 158; case 402: return 131; case 710: return 136; case 732: return 152; case 8211: return 150; case 8212: return 151; case 8216: return 145; case 8217: return 146; case 8218: return 130; case 8220: return 147; case 8221: return 148; case 8222: return 132; case 8224: return 134; case 8225: return 135; case 8226: return 149; case 8230: return 133; case 8240: return 137; case 8249: return 139; case 8250: return 155; case 8364: return 128; case 8482: return 153; default: return '\0'; }; } static MVMuint8 windows1251_cp_to_char(MVMint32 codepoint) { if (8482 < codepoint || codepoint < 0) return '\0'; switch (codepoint) { case 160: return 160; case 164: return 164; case 166: return 166; case 167: return 167; case 169: return 169; case 171: return 171; case 172: return 172; case 173: return 173; case 174: return 174; case 176: return 176; case 177: return 177; case 181: return 181; case 182: return 182; case 183: return 183; case 187: return 187; case 1025: return 168; case 1026: return 128; case 1027: return 129; case 1028: return 170; case 1029: return 189; case 1030: return 178; case 1031: return 175; case 1032: return 163; case 1033: return 138; case 1034: return 140; case 1035: return 142; case 1036: return 141; case 1038: return 161; case 1039: return 143; case 1040: return 192; case 1041: return 193; case 1042: return 194; case 1043: return 195; case 1044: return 196; case 1045: return 197; case 1046: return 198; case 1047: return 199; case 1048: return 200; case 1049: return 201; case 1050: return 202; case 1051: return 203; case 1052: return 204; case 1053: return 205; case 1054: return 206; case 1055: return 207; case 1056: return 208; case 1057: return 209; case 1058: return 210; case 1059: return 211; case 1060: return 212; case 1061: return 213; case 1062: return 214; case 1063: return 215; case 1064: return 216; case 1065: return 217; case 1066: return 218; case 1067: return 219; case 1068: return 220; case 1069: return 221; case 1070: return 222; case 1071: return 223; case 1072: return 224; case 1073: return 225; case 1074: return 226; case 1075: return 227; case 1076: return 228; case 1077: return 229; case 1078: return 230; case 1079: return 231; case 1080: return 232; case 1081: return 233; case 1082: return 234; case 1083: return 235; case 1084: return 236; case 1085: return 237; case 1086: return 238; case 1087: return 239; case 1088: return 240; case 1089: return 241; case 1090: return 242; case 1091: return 243; case 1092: return 244; case 1093: return 245; case 1094: return 246; case 1095: return 247; case 1096: return 248; case 1097: return 249; case 1098: return 250; case 1099: return 251; case 1100: return 252; case 1101: return 253; case 1102: return 254; case 1103: return 255; case 1105: return 184; case 1106: return 144; case 1107: return 131; case 1108: return 186; case 1109: return 190; case 1110: return 179; case 1111: return 191; case 1112: return 188; case 1113: return 154; case 1114: return 156; case 1115: return 158; case 1116: return 157; case 1118: return 162; case 1119: return 159; case 1168: return 165; case 1169: return 180; case 8211: return 150; case 8212: return 151; case 8216: return 145; case 8217: return 146; case 8218: return 130; case 8220: return 147; case 8221: return 148; case 8222: return 132; case 8224: return 134; case 8225: return 135; case 8226: return 149; case 8230: return 133; case 8240: return 137; case 8249: return 139; case 8250: return 155; case 8364: return 136; case 8470: return 185; case 8482: return 153; default: return '\0'; }; } /* Decodes using a decodestream. Decodes as far as it can with the input * buffers, or until a stopper is reached. */ MVMuint32 MVM_string_windows125X_decodestream(MVMThreadContext *tc, MVMDecodeStream *ds, const MVMint32 *stopper_chars, MVMDecodeStreamSeparators *seps, const MVMuint16 *codetable) { MVMint32 count = 0, total = 0; MVMint32 bufsize; MVMGrapheme32 *buffer = NULL; MVMDecodeStreamBytes *cur_bytes = NULL; MVMDecodeStreamBytes *last_accept_bytes = ds->bytes_head; MVMint32 last_accept_pos, last_was_cr; MVMuint32 reached_stopper; MVMStringIndex repl_length = ds->replacement ? MVM_string_graphs(tc, ds->replacement) : 0; MVMStringIndex repl_pos = 0; /* If there's no buffers, we're done. */ if (!ds->bytes_head) return 0; last_accept_pos = ds->bytes_head_pos; /* If we're asked for zero chars, also done. */ if (stopper_chars && *stopper_chars == 0) return 1; bufsize = ds->result_size_guess; buffer = MVM_malloc(bufsize * sizeof(MVMGrapheme32)); /* Decode each of the buffers. */ cur_bytes = ds->bytes_head; last_was_cr = 0; reached_stopper = 0; while (cur_bytes) { /* Process this buffer. */ MVMint32 pos = cur_bytes == ds->bytes_head ? ds->bytes_head_pos : 0; unsigned char *bytes = (unsigned char *)cur_bytes->bytes; while (pos < cur_bytes->length) { MVMGrapheme32 graph; MVMCodepoint codepoint = codetable[bytes[pos++]]; if (repl_pos) { graph = MVM_string_get_grapheme_at_nocheck(tc, ds->replacement, repl_pos++); if (repl_length <= repl_pos) repl_pos = 0; pos--; } else if (codepoint == UNMAPPED) { if (MVM_ENCODING_CONFIG_STRICT(ds->config)) { if (ds->replacement) { graph = MVM_string_get_grapheme_at_nocheck(tc, ds->replacement, repl_pos); /* If the replacement is more than one grapheme we need * to set repl_pos++ so we will grab the next grapheme on * the next loop */ if (1 < repl_length) repl_pos++; } else { /* Throw if it's unmapped */ char *enc_name = codetable == windows1252_codepoints ? "Windows-1252" : "Windows-1251"; MVM_free(buffer); MVM_exception_throw_adhoc(tc, "Error decoding %s string: could not decode codepoint %d", enc_name, bytes[pos - 1]); } } else { /* Set it without translating, even though it creates * standards uncompliant results */ graph = bytes[pos-1]; } } else if (last_was_cr) { if (codepoint == '\n') { graph = MVM_unicode_normalizer_translated_crlf(tc, &(ds->norm)); } else { graph = '\r'; pos--; } last_was_cr = 0; } else if (codepoint == '\r') { last_was_cr = 1; continue; } else { graph = codepoint; } if (count == bufsize) { /* We filled the buffer. Attach this one to the buffers * linked list, and continue with a new one. */ MVM_string_decodestream_add_chars(tc, ds, buffer, bufsize); buffer = MVM_malloc(bufsize * sizeof(MVMGrapheme32)); count = 0; } buffer[count++] = graph; last_accept_bytes = cur_bytes; last_accept_pos = pos; total++; if (MVM_string_decode_stream_maybe_sep(tc, seps, codepoint)) { reached_stopper = 1; goto done; } else if (stopper_chars && *stopper_chars == total) { reached_stopper = 1; goto done; } } cur_bytes = cur_bytes->next; } done: /* Attach what we successfully parsed as a result buffer, and trim away * what we chewed through. */ if (count) { MVM_string_decodestream_add_chars(tc, ds, buffer, count); } else { MVM_free(buffer); } MVM_string_decodestream_discard_to(tc, ds, last_accept_bytes, last_accept_pos); return reached_stopper; } /* Decodes using a decodestream. Decodes as far as it can with the input * buffers, or until a stopper is reached. */ MVMuint32 MVM_string_windows1252_decodestream(MVMThreadContext *tc, MVMDecodeStream *ds, const MVMint32 *stopper_chars, MVMDecodeStreamSeparators *seps) { return MVM_string_windows125X_decodestream(tc, ds, stopper_chars, seps, windows1252_codepoints); } /* Decodes using a decodestream. Decodes as far as it can with the input * buffers, or until a stopper is reached. */ MVMuint32 MVM_string_windows1251_decodestream(MVMThreadContext *tc, MVMDecodeStream *ds, const MVMint32 *stopper_chars, MVMDecodeStreamSeparators *seps) { return MVM_string_windows125X_decodestream(tc, ds, stopper_chars, seps, windows1251_codepoints); } /* Decodes the specified number of bytes of windows1252 into an NFG string, * creating a result of the specified type. The type must have the MVMString * REPR. */ MVMString * MVM_string_windows125X_decode(MVMThreadContext *tc, const MVMObject *result_type, char *windows125X_c, size_t bytes, MVMString *replacement, const MVMuint16 *codetable, MVMint64 config) { MVMuint8 *windows125X = (MVMuint8 *)windows125X_c; MVMString *result = (MVMString *)REPR(result_type)->allocate(tc, STABLE(result_type)); size_t pos, result_graphs, additional_bytes = 0; MVMStringIndex repl_length = replacement ? MVM_string_graphs(tc, replacement) : 0; result->body.storage_type = MVM_STRING_GRAPHEME_32; result->body.storage.blob_32 = MVM_malloc(sizeof(MVMGrapheme32) * bytes); result_graphs = 0; for (pos = 0; pos < bytes; pos++) { MVMGrapheme32 codepoint; if (windows125X[pos] == '\r' && pos + 1 < bytes && windows125X[pos + 1] == '\n') { codepoint = MVM_nfg_crlf_grapheme(tc); pos++; } else { codepoint = codetable[windows125X[pos]]; if (codepoint == UNMAPPED) { /* Since things we are decoding always fit into Unicode, if we are * using a replacement, it won't get used unless we use strict */ if (replacement && MVM_ENCODING_CONFIG_STRICT(config)) { int i = 0; /* Only triggered if repl_length > 1. Copies all but the last * grapheme in the replacement string */ if (1 < repl_length) { additional_bytes += repl_length - 1; result->body.storage.blob_32 = realloc(result->body.storage.blob_32, sizeof(MVMGrapheme32) * (additional_bytes + bytes)); for (; i < repl_length - 1; i++) { MVMGrapheme32 graph = MVM_string_get_grapheme_at(tc, replacement, i); result->body.storage.blob_32[result_graphs++] = graph; } } /* Now we set `codepoint` to the last grapheme in the replacement * and proceed normally from here. */ codepoint = MVM_string_get_grapheme_at(tc, replacement, i); } else if (MVM_ENCODING_CONFIG_STRICT(config)) { /* Throw an exception if that codepoint has no mapping */ char *enc_name = codetable == windows1252_codepoints ? "Windows-1252" : "Windows-1251"; MVM_exception_throw_adhoc(tc, "Error decoding %s string: could not decode codepoint %d", enc_name, windows125X[pos]); } else { /* Don't convert and just map to identical. This creates * standards uncompliant results, but will decode buggy * input */ codepoint = windows125X[pos]; } } } result->body.storage.blob_32[result_graphs++] = codepoint; } result->body.num_graphs = result_graphs; return result; } MVMString * MVM_string_windows1252_decode(MVMThreadContext *tc, const MVMObject *result_type, char *windows125X_c, size_t bytes) { return MVM_string_windows125X_decode(tc, result_type, windows125X_c, bytes, NULL, windows1252_codepoints, MVM_ENCODING_PERMISSIVE); } MVMString * MVM_string_windows1251_decode(MVMThreadContext *tc, const MVMObject *result_type, char *windows125X_c, size_t bytes) { return MVM_string_windows125X_decode(tc, result_type, windows125X_c, bytes, NULL, windows1251_codepoints, MVM_ENCODING_PERMISSIVE); } MVMString * MVM_string_windows1252_decode_config(MVMThreadContext *tc, const MVMObject *result_type, char *windows125X_c, size_t bytes, MVMString *replacement, MVMint64 config) { return MVM_string_windows125X_decode(tc, result_type, windows125X_c, bytes, replacement, windows1252_codepoints, config); } MVMString * MVM_string_windows1251_decode_config(MVMThreadContext *tc, const MVMObject *result_type, char *windows125X_c, size_t bytes, MVMString *replacement, MVMint64 config) { return MVM_string_windows125X_decode(tc, result_type, windows125X_c, bytes, replacement, windows1251_codepoints, config); } /* Encodes the specified substring to Windows-1252 or Windows-1251. It is passed * in the encoding, as well as the function that resolves Unicode to the result * encoding. Anything not in range will cause an exception unless a replacement * string is supplied. The result string is NULL terminated, but the specified * size is the non-null part. */ char * MVM_string_windows125X_encode_substr(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint64 start, MVMint64 length, MVMString *replacement, MVMint32 translate_newlines, MVMuint8(*cp_to_char)(MVMint32), MVMint64 config) { /* Windows-1252 and Windows-1251 are single byte encodings, so each grapheme * will just become a single byte. */ MVMuint32 startu = (MVMuint32)start; MVMStringIndex strgraphs = MVM_string_graphs(tc, str); MVMuint32 lengthu = (MVMuint32)(length == -1 ? strgraphs - startu : length); MVMuint8 *result; size_t result_alloc; MVMuint8 *repl_bytes = NULL; MVMuint64 repl_length; /* must check start first since it's used in the length check */ if (start < 0 || start > strgraphs) MVM_exception_throw_adhoc(tc, "start out of range"); if (length < -1 || start + lengthu > strgraphs) MVM_exception_throw_adhoc(tc, "length out of range"); if (replacement) repl_bytes = (MVMuint8 *) MVM_string_windows125X_encode_substr(tc, replacement, &repl_length, 0, -1, NULL, translate_newlines, cp_to_char, config); result_alloc = lengthu; result = MVM_malloc(result_alloc + 1); if (str->body.storage_type == MVM_STRING_GRAPHEME_ASCII) { /* No encoding needed; directly copy. */ memcpy(result, str->body.storage.blob_ascii, lengthu); result[lengthu] = 0; if (output_size) *output_size = lengthu; } else { MVMuint32 i = 0; MVMCodepointIter ci; MVM_string_ci_init(tc, &ci, str, translate_newlines, 0); while (MVM_string_ci_has_more(tc, &ci)) { MVMCodepoint codepoint = MVM_string_ci_get_codepoint(tc, &ci); if (i == result_alloc) { result_alloc += 8; result = MVM_realloc(result, result_alloc + 1); } /* If it's within ASCII just pass it through */ if (0 <= codepoint && codepoint <= 127) { result[i] = (MVMuint8)codepoint; i++; } else if ((result[i] = cp_to_char(codepoint)) != '\0') { i++; } /* If we have a replacement and are we either have it set to strict, * or the codepoint can't fit within one byte, insert a replacement */ else if (replacement && (MVM_ENCODING_CONFIG_STRICT(config) || codepoint < 0 || 255 < codepoint)) { if (repl_length >= result_alloc || i >= result_alloc - repl_length) { result_alloc += repl_length; result = MVM_realloc(result, result_alloc + 1); } memcpy(result + i, repl_bytes, repl_length); i += repl_length; } else { /* If we're decoding strictly or the codepoint cannot fit in * one byte, throw an exception */ if (MVM_ENCODING_CONFIG_STRICT(config) || codepoint < 0 || 255 < codepoint) { char *enc_name = cp_to_char == windows1252_cp_to_char ? "Windows-1252" : "Windows-1251"; MVM_free(result); MVM_free(repl_bytes); MVM_exception_throw_adhoc(tc, "Error encoding %s string: could not encode codepoint %d", enc_name, codepoint); } /* It fits in one byte and we're not decoding strictly, so pass * it through unchanged */ else { result[i++] = codepoint; } } } result[i] = 0; if (output_size) *output_size = i; } MVM_free(repl_bytes); return (char *)result; } char * MVM_string_windows1252_encode_substr(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint64 start, MVMint64 length, MVMString *replacement, MVMint32 translate_newlines) { return MVM_string_windows125X_encode_substr(tc, str, output_size, start, length, replacement, translate_newlines, windows1252_cp_to_char, MVM_ENCODING_PERMISSIVE); } char * MVM_string_windows1251_encode_substr(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint64 start, MVMint64 length, MVMString *replacement, MVMint32 translate_newlines) { return MVM_string_windows125X_encode_substr(tc, str, output_size, start, length, replacement, translate_newlines, windows1251_cp_to_char, MVM_ENCODING_PERMISSIVE); } char * MVM_string_windows1252_encode_substr_config(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint64 start, MVMint64 length, MVMString *replacement, MVMint32 translate_newlines, MVMint64 config) { return MVM_string_windows125X_encode_substr(tc, str, output_size, start, length, replacement, translate_newlines, windows1252_cp_to_char, config); } char * MVM_string_windows1251_encode_substr_config(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint64 start, MVMint64 length, MVMString *replacement, MVMint32 translate_newlines, MVMint64 config) { return MVM_string_windows125X_encode_substr(tc, str, output_size, start, length, replacement, translate_newlines, windows1251_cp_to_char, config); } MoarVM-2018.03/src/strings/windows1252.h0000644000175000017510000000421313243117024017635 0ustar samanthasamantha/* Bitmap controling whether we throw on codepoints which don't have mappings (yet still * fit in one byte). If use loose we we pass through the codepoint unchanged if it fits * in one byte. */ #define MVM_ENCODING_PERMISSIVE 1 #define MVM_ENCODING_CONFIG_STRICT(config) (!(config & MVM_ENCODING_PERMISSIVE)) #define MVM_ENCODING_CONFIG_PERMISSIVE(config) (config & MVM_ENCODING_PERMISSIVE) MVMString * MVM_string_windows1252_decode(MVMThreadContext *tc, const MVMObject *result_type, char *windows1252, size_t bytes); MVM_PUBLIC MVMuint32 MVM_string_windows1252_decodestream(MVMThreadContext *tc, MVMDecodeStream *ds, const MVMint32 *stopper_chars, MVMDecodeStreamSeparators *seps); char * MVM_string_windows1252_encode_substr(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint64 start, MVMint64 length, MVMString *replacement, MVMint32 translate_newlines); char * MVM_string_windows1252_encode_substr_config(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint64 start, MVMint64 length, MVMString *replacement, MVMint32 translate_newlines, MVMint64 bitmap); char * MVM_string_windows1251_encode_substr_config(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint64 start, MVMint64 length, MVMString *replacement, MVMint32 translate_newlines, MVMint64 bitmap); MVMString * MVM_string_windows1251_decode(MVMThreadContext *tc, const MVMObject *result_type, char *windows1252, size_t bytes); MVM_PUBLIC MVMuint32 MVM_string_windows1251_decodestream(MVMThreadContext *tc, MVMDecodeStream *ds, const MVMint32 *stopper_chars, MVMDecodeStreamSeparators *seps); char * MVM_string_windows1251_encode_substr(MVMThreadContext *tc, MVMString *str, MVMuint64 *output_size, MVMint64 start, MVMint64 length, MVMString *replacement, MVMint32 translate_newlines); MVMString * MVM_string_windows1252_decode_config(MVMThreadContext *tc, const MVMObject *result_type, char *windows125X_c, size_t bytes, MVMString *replacement, MVMint64 bitmap); MVMString * MVM_string_windows1251_decode_config(MVMThreadContext *tc, const MVMObject *result_type, char *windows125X_c, size_t bytes, MVMString *replacement, MVMint64 bitmap); MoarVM-2018.03/src/types.h0000644000175000017510000003360213252330426015313 0ustar samanthasamantha/* struct and union types are forward-declared for convenience */ typedef struct MVMActiveHandler MVMActiveHandler; typedef struct MVMArgInfo MVMArgInfo; typedef struct MVMArgProcContext MVMArgProcContext; typedef struct MVMArray MVMArray; typedef struct MVMArrayBody MVMArrayBody; typedef struct MVMArrayREPRData MVMArrayREPRData; typedef struct MVMAsyncTask MVMAsyncTask; typedef struct MVMAsyncTaskBody MVMAsyncTaskBody; typedef struct MVMAsyncTaskOps MVMAsyncTaskOps; typedef struct MVMAttributeIdentifier MVMAttributeIdentifier; typedef struct MVMBoolificationSpec MVMBoolificationSpec; typedef struct MVMBootTypes MVMBootTypes; typedef struct MVMBytecodeAnnotation MVMBytecodeAnnotation; typedef struct MVMCallCapture MVMCallCapture; typedef struct MVMCallCaptureBody MVMCallCaptureBody; typedef struct MVMCallsite MVMCallsite; typedef struct MVMCallsiteInterns MVMCallsiteInterns; typedef struct MVMCallStackRegion MVMCallStackRegion; typedef struct MVMCFunction MVMCFunction; typedef struct MVMCFunctionBody MVMCFunctionBody; typedef struct MVMCode MVMCode; typedef struct MVMCodeBody MVMCodeBody; typedef struct MVMCollectable MVMCollectable; typedef struct MVMCompUnit MVMCompUnit; typedef struct MVMCompUnitBody MVMCompUnitBody; typedef struct MVMConcatState MVMConcatState; typedef struct MVMContainerConfigurer MVMContainerConfigurer; typedef struct MVMContainerSpec MVMContainerSpec; typedef struct MVMContainerRegistry MVMContainerRegistry; typedef struct MVMContext MVMContext; typedef struct MVMContextBody MVMContextBody; typedef struct MVMContinuationTag MVMContinuationTag; typedef struct MVMDecoder MVMDecoder; typedef struct MVMDecoderBody MVMDecoderBody; typedef struct MVMDLLRegistry MVMDLLRegistry; typedef struct MVMDLLSym MVMDLLSym; typedef struct MVMDLLSymBody MVMDLLSymBody; typedef struct MVMException MVMException; typedef struct MVMExceptionBody MVMExceptionBody; typedef struct MVMExtOpRecord MVMExtOpRecord; typedef struct MVMExtOpRegistry MVMExtOpRegistry; typedef struct MVMExtRegistry MVMExtRegistry; typedef struct MVMRegionAlloc MVMRegionAlloc; typedef struct MVMRegionBlock MVMRegionBlock; typedef struct MVMFixedSizeAlloc MVMFixedSizeAlloc; typedef struct MVMFixedSizeAllocFreeListEntry MVMFixedSizeAllocFreeListEntry; typedef struct MVMFixedSizeAllocSafepointFreeListEntry MVMFixedSizeAllocSafepointFreeListEntry; typedef struct MVMFixedSizeAllocSizeClass MVMFixedSizeAllocSizeClass; typedef struct MVMFixedSizeAllocThread MVMFixedSizeAllocThread; typedef struct MVMFixedSizeAllocThreadSizeClass MVMFixedSizeAllocThreadSizeClass; typedef struct MVMFrame MVMFrame; typedef struct MVMFrameExtra MVMFrameExtra; typedef struct MVMFrameHandler MVMFrameHandler; typedef struct MVMGen2Allocator MVMGen2Allocator; typedef struct MVMGen2SizeClass MVMGen2SizeClass; typedef struct MVMGCPassedWork MVMGCPassedWork; typedef struct MVMGCWorklist MVMGCWorklist; typedef struct MVMHash MVMHash; typedef struct MVMHashAttrStore MVMHashAttrStore; typedef struct MVMHashAttrStoreBody MVMHashAttrStoreBody; typedef struct MVMHashBody MVMHashBody; typedef struct MVMHashEntry MVMHashEntry; typedef struct MVMHLLConfig MVMHLLConfig; typedef struct MVMIntConstCache MVMIntConstCache; typedef struct MVMInstance MVMInstance; typedef struct MVMInvocationSpec MVMInvocationSpec; typedef struct MVMIter MVMIter; typedef struct MVMIterBody MVMIterBody; typedef struct MVMKnowHOWAttributeREPR MVMKnowHOWAttributeREPR; typedef struct MVMKnowHOWAttributeREPRBody MVMKnowHOWAttributeREPRBody; typedef struct MVMKnowHOWREPR MVMKnowHOWREPR; typedef struct MVMKnowHOWREPRBody MVMKnowHOWREPRBody; typedef struct MVMLexicalRegistry MVMLexicalRegistry; typedef struct MVMLoadedCompUnitName MVMLoadedCompUnitName; typedef struct MVMNFA MVMNFA; typedef struct MVMNFABody MVMNFABody; typedef struct MVMNFAStateInfo MVMNFAStateInfo; typedef struct MVMNFGState MVMNFGState; typedef struct MVMNFGSynthetic MVMNFGSynthetic; typedef struct MVMNFGTrieNode MVMNFGTrieNode; typedef struct MVMNFGTrieNodeEntry MVMNFGTrieNodeEntry; typedef struct MVMNativeCall MVMNativeCall; typedef struct MVMNativeCallBody MVMNativeCallBody; typedef struct MVMNativeRef MVMNativeRef; typedef struct MVMNativeRefBody MVMNativeRefBody; typedef struct MVMNativeRefREPRData MVMNativeRefREPRData; typedef struct MVMNormalizer MVMNormalizer; typedef struct MVMNull MVMNull; typedef struct MVMNullBody MVMNullBody; typedef struct MVMCStr MVMCStr; typedef struct MVMCStrBody MVMCStrBody; typedef struct MVMCPointer MVMCPointer; typedef struct MVMCPointerBody MVMCPointerBody; typedef struct MVMCArray MVMCArray; typedef struct MVMCArrayBody MVMCArrayBody; typedef struct MVMCArrayREPRData MVMCArrayREPRData; typedef struct MVMCStruct MVMCStruct; typedef struct MVMCStructBody MVMCStructBody; typedef struct MVMCStructNameMap MVMCStructNameMap; typedef struct MVMCStructREPRData MVMCStructREPRData; typedef struct MVMCPPStruct MVMCPPStruct; typedef struct MVMCPPStructBody MVMCPPStructBody; typedef struct MVMCPPStructNameMap MVMCPPStructNameMap; typedef struct MVMCPPStructREPRData MVMCPPStructREPRData; typedef struct MVMCUnion MVMCUnion; typedef struct MVMCUnionBody MVMCUnionBody; typedef struct MVMCUnionNameMap MVMCUnionNameMap; typedef struct MVMCUnionREPRData MVMCUnionREPRData; typedef struct MVMMultiCache MVMMultiCache; typedef struct MVMMultiCacheBody MVMMultiCacheBody; typedef struct MVMMultiCacheNode MVMMultiCacheNode; typedef struct MVMMultiDimArray MVMMultiDimArray; typedef struct MVMMultiDimArrayBody MVMMultiDimArrayBody; typedef struct MVMMultiDimArrayREPRData MVMMultiDimArrayREPRData; typedef struct MVMContinuation MVMContinuation; typedef struct MVMContinuationBody MVMContinuationBody; typedef struct MVMReentrantMutex MVMReentrantMutex; typedef struct MVMReentrantMutexBody MVMReentrantMutexBody; typedef struct MVMConditionVariable MVMConditionVariable; typedef struct MVMConditionVariableBody MVMConditionVariableBody; typedef struct MVMSemaphore MVMSemaphore; typedef struct MVMSemaphoreBody MVMSemaphoreBody; typedef struct MVMConcBlockingQueue MVMConcBlockingQueue; typedef struct MVMConcBlockingQueueBody MVMConcBlockingQueueBody; typedef struct MVMConcBlockingQueueNode MVMConcBlockingQueueNode; typedef struct MVMConcBlockingQueueLocks MVMConcBlockingQueueLocks; typedef struct MVMObject MVMObject; typedef struct MVMObjectId MVMObjectId; typedef struct MVMObjectStooge MVMObjectStooge; typedef struct MVMOpInfo MVMOpInfo; typedef struct MVMOSHandle MVMOSHandle; typedef struct MVMOSHandleBody MVMOSHandleBody; typedef struct MVMP6bigint MVMP6bigint; typedef struct MVMP6bigintBody MVMP6bigintBody; typedef struct MVMP6int MVMP6int; typedef struct MVMP6intBody MVMP6intBody; typedef struct MVMP6intREPRData MVMP6intREPRData; typedef struct MVMP6num MVMP6num; typedef struct MVMP6numBody MVMP6numBody; typedef struct MVMP6numREPRData MVMP6numREPRData; typedef struct MVMP6opaque MVMP6opaque; typedef struct MVMP6opaqueBody MVMP6opaqueBody; typedef struct MVMP6opaqueBoxedTypeMap MVMP6opaqueBoxedTypeMap; typedef struct MVMP6opaqueNameMap MVMP6opaqueNameMap; typedef struct MVMP6opaqueREPRData MVMP6opaqueREPRData; typedef struct MVMP6str MVMP6str; typedef struct MVMP6strBody MVMP6strBody; typedef union MVMRegister MVMRegister; typedef struct MVMReprRegistry MVMReprRegistry; typedef struct MVMREPROps MVMREPROps; typedef struct MVMREPROps_Associative MVMREPROps_Associative; typedef struct MVMREPROps_Attribute MVMREPROps_Attribute; typedef struct MVMREPROps_Boxing MVMREPROps_Boxing; typedef struct MVMREPROps_Positional MVMREPROps_Positional; typedef struct MVMSerializationContext MVMSerializationContext; typedef struct MVMSerializationContextBody MVMSerializationContextBody; typedef struct MVMSerializationReader MVMSerializationReader; typedef struct MVMDeserializeWorklist MVMDeserializeWorklist; typedef struct MVMSerializationRoot MVMSerializationRoot; typedef struct MVMSerializationWriter MVMSerializationWriter; typedef struct MVMSpeshGraph MVMSpeshGraph; typedef struct MVMSpeshMemBlock MVMSpeshMemBlock; typedef struct MVMSpeshTemporary MVMSpeshTemporary; typedef struct MVMSpeshBB MVMSpeshBB; typedef struct MVMSpeshIns MVMSpeshIns; typedef union MVMSpeshOperand MVMSpeshOperand; typedef struct MVMSpeshAnn MVMSpeshAnn; typedef struct MVMSpeshFacts MVMSpeshFacts; typedef struct MVMSpeshCode MVMSpeshCode; typedef struct MVMSpeshCandidate MVMSpeshCandidate; typedef struct MVMSpeshLogGuard MVMSpeshLogGuard; typedef struct MVMSpeshCallInfo MVMSpeshCallInfo; typedef struct MVMSpeshInline MVMSpeshInline; typedef struct MVMSpeshIterator MVMSpeshIterator; typedef struct MVMSpeshLog MVMSpeshLog; typedef struct MVMSpeshLogBody MVMSpeshLogBody; typedef struct MVMSpeshLogEntry MVMSpeshLogEntry; typedef struct MVMSpeshStats MVMSpeshStats; typedef struct MVMSpeshStatsByCallsite MVMSpeshStatsByCallsite; typedef struct MVMSpeshStatsByType MVMSpeshStatsByType; typedef struct MVMSpeshStatsType MVMSpeshStatsType; typedef struct MVMSpeshStatsByOffset MVMSpeshStatsByOffset; typedef struct MVMSpeshStatsTypeCount MVMSpeshStatsTypeCount; typedef struct MVMSpeshStatsInvokeCount MVMSpeshStatsInvokeCount; typedef struct MVMSpeshStatsTypeTupleCount MVMSpeshStatsTypeTupleCount; typedef struct MVMSpeshStatsStatic MVMSpeshStatsStatic; typedef struct MVMSpeshSimStack MVMSpeshSimStack; typedef struct MVMSpeshSimStackFrame MVMSpeshSimStackFrame; typedef struct MVMSpeshSimCallType MVMSpeshSimCallType; typedef struct MVMSpeshPlan MVMSpeshPlan; typedef struct MVMSpeshPlanned MVMSpeshPlanned; typedef struct MVMSpeshArgGuard MVMSpeshArgGuard; typedef struct MVMSpeshArgGuardNode MVMSpeshArgGuardNode; typedef struct MVMSTable MVMSTable; typedef struct MVMStaticFrame MVMStaticFrame; typedef struct MVMStaticFrameBody MVMStaticFrameBody; typedef struct MVMStaticFrameInstrumentation MVMStaticFrameInstrumentation; typedef struct MVMStaticFrameSpesh MVMStaticFrameSpesh; typedef struct MVMStaticFrameSpeshBody MVMStaticFrameSpeshBody; typedef struct MVMStorageSpec MVMStorageSpec; typedef struct MVMString MVMString; typedef struct MVMStringBody MVMStringBody; typedef struct MVMStringConsts MVMStringConsts; typedef struct MVMStringStrand MVMStringStrand; typedef struct MVMGraphemeIter MVMGraphemeIter; typedef struct MVMCodepointIter MVMCodepointIter; typedef struct MVMThread MVMThread; typedef struct MVMThreadBody MVMThreadBody; typedef struct MVMThreadContext MVMThreadContext; typedef struct MVMUnicodeNamedValue MVMUnicodeNamedValue; typedef struct MVMUnicodeNameRegistry MVMUnicodeNameRegistry; typedef struct MVMUnicodeGraphemeNameRegistry MVMUnicodeGraphemeNameRegistry; typedef struct MVMUninstantiable MVMUninstantiable; typedef struct MVMWorkThread MVMWorkThread; typedef struct MVMIOOps MVMIOOps; typedef struct MVMIOClosable MVMIOClosable; typedef struct MVMIOSyncReadable MVMIOSyncReadable; typedef struct MVMIOSyncWritable MVMIOSyncWritable; typedef struct MVMIOAsyncReadable MVMIOAsyncReadable; typedef struct MVMIOAsyncWritable MVMIOAsyncWritable; typedef struct MVMIOAsyncWritableTo MVMIOAsyncWritableTo; typedef struct MVMIOSeekable MVMIOSeekable; typedef struct MVMIOSockety MVMIOSockety; typedef struct MVMIOIntrospection MVMIOIntrospection; typedef struct MVMIOLockable MVMIOLockable; typedef struct MVMDecodeStream MVMDecodeStream; typedef struct MVMDecodeStreamBytes MVMDecodeStreamBytes; typedef struct MVMDecodeStreamChars MVMDecodeStreamChars; typedef struct MVMDecodeStreamSeparators MVMDecodeStreamSeparators; typedef struct MVMNativeCallback MVMNativeCallback; typedef struct MVMNativeCallbackCacheHead MVMNativeCallbackCacheHead; typedef struct MVMJitGraph MVMJitGraph; typedef struct MVMJitNode MVMJitNode; typedef struct MVMJitDeopt MVMJitDeopt; typedef struct MVMJitInline MVMJitInline; typedef struct MVMJitHandler MVMJitHandler; typedef struct MVMJitPrimitive MVMJitPrimitive; typedef struct MVMJitBranch MVMJitBranch; typedef struct MVMJitCallC MVMJitCallC; typedef struct MVMJitCallArg MVMJitCallArg; typedef struct MVMJitLabel MVMJitLabel; typedef struct MVMJitGuard MVMJitGuard; typedef struct MVMJitInvoke MVMJitInvoke; typedef struct MVMJitJumpList MVMJitJumpList; typedef struct MVMJitControl MVMJitControl; typedef struct MVMJitData MVMJitData; typedef struct MVMJitStackSlot MVMJitStackSlot; typedef struct MVMJitCode MVMJitCode; typedef struct MVMJitExprTree MVMJitExprTree; typedef struct MVMJitTreeTraverser MVMJitTreeTraverser; typedef struct MVMJitCompiler MVMJitCompiler; typedef struct MVMJitExprTemplate MVMJitExprTemplate; typedef struct MVMJitExprOpInfo MVMJitExprOpInfo; typedef struct MVMJitExprNodeInfo MVMJitExprNodeInfo; typedef struct MVMJitTileTemplate MVMJitTileTemplate; typedef struct MVMJitTile MVMJitTile; typedef struct MVMJitTileList MVMJitTileList; typedef struct MVMProfileThreadData MVMProfileThreadData; typedef struct MVMProfileGC MVMProfileGC; typedef struct MVMProfileCallNode MVMProfileCallNode; typedef struct MVMProfileAllocationCount MVMProfileAllocationCount; typedef struct MVMProfileContinuationData MVMProfileContinuationData; typedef struct MVMHeapSnapshotCollection MVMHeapSnapshotCollection; typedef struct MVMHeapDumpIndex MVMHeapDumpIndex; typedef struct MVMHeapDumpIndexSnapshotEntry MVMHeapDumpIndexSnapshotEntry; typedef struct MVMHeapSnapshot MVMHeapSnapshot; typedef struct MVMHeapSnapshotType MVMHeapSnapshotType; typedef struct MVMHeapSnapshotStaticFrame MVMHeapSnapshotStaticFrame; typedef struct MVMHeapSnapshotCollectable MVMHeapSnapshotCollectable; typedef struct MVMHeapSnapshotReference MVMHeapSnapshotReference; typedef struct MVMHeapSnapshotState MVMHeapSnapshotState; typedef struct MVMHeapSnapshotWorkItem MVMHeapSnapshotWorkItem; typedef struct MVMHeapSnapshotSeen MVMHeapSnapshotSeen; typedef struct MVMDebugServerBreakpointInfo MVMDebugServerBreakpointInfo; typedef struct MVMDebugServerBreakpointFileTable MVMDebugServerBreakpointFileTable; typedef struct MVMDebugServerBreakpointTable MVMDebugServerBreakpointTable; typedef struct MVMDebugServerHandleTable MVMDebugServerHandleTable; typedef struct MVMDebugServerHandleTableEntry MVMDebugServerHandleTableEntry; typedef struct MVMDebugServerRequestEntry MVMDebugServerRequestEntry; typedef struct MVMDebugServerData MVMDebugServerData; MoarVM-2018.03/tools/Generate-Collation-Data.p60000755000175000017510000003100513237701105021136 0ustar samanthasamantha#!/usr/bin/env perl6 use lib ; use Collation-Gram; use ArrayCompose; my $my_debug = False; # Set this to only generate a partial run, for testing purposes my Int $less-than; my $out-file = "src/strings/unicode_uca.c"; class p6node { has Int $.cp; has @!collation_elements; has $!last; has %.next is rw; method next-cps { %!next.keys.map(*.Int).sort } method has-collation { @!collation_elements.Bool } method get-collation { @!collation_elements } method set-collation (Positional:D $list) { @!collation_elements = |$list; } method set-cp (Int:D $cp) { $!cp = $cp } } sub p6node-find-node (Int:D $cp, p6node $p6node is rw --> p6node) is rw { die unless $p6node.next{$cp}.VAR.^name eq 'Scalar'; die "can't find the node for $cp " unless $p6node.next{$cp}.isa(p6node); return-rw $p6node.next{$cp} orelse die "Can't find node"; } sub p6node-create-or-find-node (Int:D $cp, p6node:D $p6node is rw) is rw { my $hash := $p6node.next; #say "p6node-create-or-find-node called for cp $cp"; if $hash{$cp}:exists { return-rw $p6node.next{$cp}; } else { my $obj = p6node.new(cp => $cp, last => $hash); $obj.set-cp($cp); $hash{$cp} = $obj; return-rw $hash{$cp}; } } sub print-var ($var) { $var.gist } my Str $Unicode-Version; my @implicit-weights; my $max-cp = 0; sub int-bitwidth (Int:D $int) { $int.base(2).chars + 1; } sub uint-bitwidth (Int:D $int) { $int.base(2).chars; } my Int:D $codepoint_sequence_no_max = 0; sub parse-test-data (p6node:D $main-p6node) { my $data = "UNIDATA/UCA/allkeys.txt".IO; my $line-no; for $data.lines -> $line { $line-no++; last if $less-than and 10_000 < $less-than; #say $line-no; next if $line eq '' or $line.starts-with('#'); if $line.starts-with('@version') { $Unicode-Version = $line.subst('@version ', ''); next; } if $line.starts-with('@implicitweights') { @implicit-weights.push: $line.subst('@implicitweights ', ''); next; } my $var = Collation-Gram.new.parse($line, :actions(Collation-Gram::Action.new)).made; die $line unless $var; # skip them if it's not a sequence (only one codepoint), AND there # is only one collation element. These are picked up into the main MVM # UCD database next if $var.elems == 1 && $var.elems == 1; my $node = $main-p6node; say $line, "\n", $var if $my_debug; $codepoint_sequence_no_max = $var.elems if $codepoint_sequence_no_max < $var.elems; for $var.list -> $cp { $max-cp = $cp if $max-cp < $cp; $node = p6node-create-or-find-node($cp, $node); } $node.set-collation($var); } say "Done with parse-test-data"; } class sub_node { has Int $.codepoint; has Int $.sub_node_elems is rw ; has Int $.sub_node_link is rw; has Int $.collation_key_elems is rw = 0; has Int $.collation_key_link is rw = 0; has Int $.element is rw; method build { $!codepoint, $!sub_node_elems, # To save space, set to zero if it's -1 (-1 means there's no link) # we can determine there is no link by checking the collation_key_elems # or sub_node_elems # so we don't need to set these to -1 ($!sub_node_link == -1 ?? 0 !! $!sub_node_link), $!collation_key_elems, ($!collation_key_link == -1 ?? 0 !! $!collation_key_link), } method Str { "\{{$.codepoint.fmt("0x%X")}, $!sub_node_elems, $!sub_node_link, $!collation_key_elems, $!collation_key_link\}" } } #| Adds the initial codepoint nodes to @main-node sub add-main-node-to-c-data (p6node:D $p6node is rw, @main-node) is rw { for $p6node.next.keys.map(*.Int).sort -> $cp { my $thing := sub_node.new(codepoint => $cp, element => @main-node.elems); @main-node.push: $thing; } @main-node.elems; } #say Dump @main-node; #| Follows the codepoints already in @main-node and adds sub_nodes based on that sub sub_node-flesh-out-tree-from-main-node-elems (p6node:D $main-p6node is rw, @main-node, @collation-elements) { for ^@main-node -> $i { #say "Processing $sub_node.codepoint()"; sub_node-add-to-c-data-from-sub_node(@main-node[$i], p6node-find-node(@main-node[$i].codepoint, $main-p6node), @main-node, @collation-elements); } } sub sub_node-add-to-c-data-from-sub_node (sub_node:D $sub_node is rw, p6node:D $p6node is rw, @main-node, @collation-elements --> sub_node:D) is rw { die unless $sub_node.codepoint == $p6node.cp; if $p6node.has-collation { my $temp := sub_node-add-collation-elems-from-p6node($sub_node, $p6node, @collation-elements); die "\$temp !=== \$sub_node" unless $temp === $sub_node; } #if !$sub_node.sub_node_elems { $sub_node.sub_node_elems = $p6node.next.elems; #} #die "\$sub_node.sub_node_elems !== \$p6node.next.elems" unless $sub_node.sub_node_elems == $p6node.next.elems; my Int ($last-link, $first-link) = -1 xx 2; for $p6node.next-cps -> $cp { $last-link = sub_node-add-sub_node($cp, @main-node); sub_node-add-to-c-data-from-sub_node(@main-node[$last-link], p6node-find-node($cp, $p6node), @main-node, @collation-elements); $first-link = $last-link if $first-link == -1; } $sub_node.sub_node_link = $first-link; #say Dump $sub_node; $sub_node; } sub sub_node-add-sub_node (Int:D $cp, @main-node --> Int:D) { my $node := sub_node.new(codepoint => $cp, element => @main-node.elems); die "!\$node.element.defined || !\$node.codepoint.defined" unless $node.element.defined && $node.codepoint.defined; @main-node.push: $node; return @main-node.elems - 1; } my Int:D $max-collation-elems = 0; my Int:D $max-primary = 0; my Int:D $max-secondary = 0; my Int:D $max-tertiary = 0; my Int:D $max-special = 0; sub sub_node-add-collation-elems-from-p6node (sub_node:D $sub_node is rw, p6node:D $p6node is rw, @collation-elements --> sub_node:D) is rw { die "!\$p6node.has-collation" unless $p6node.has-collation; my Int:D $before-elems = @collation-elements.elems; for $p6node.get-collation <-> $element { $max-primary = $element[0] if $max-primary < $element[0]; $max-secondary = $element[1] if $max-secondary < $element[1]; $max-tertiary = $element[2] if $max-tertiary < $element[2]; $max-special = $element[3] if $max-special < $element[3]; @collation-elements.push: $element; } $max-collation-elems = $p6node.get-collation.elems if $max-collation-elems < $p6node.get-collation.elems; my Int:D $after-elems = @collation-elements.elems; $sub_node.collation_key_link = $before-elems; $sub_node.collation_key_elems = $after-elems - $before-elems; $sub_node; } my @main-node; my @collation-elements; my $main-p6node = p6node.new; sub debug-out-nodes { use JSON::Fast; spurt 'out_nodes', to-json(@main-node.map(*.build)); } sub process-block (Str:D $text) { if $text ~~ / ^ \s* $=( $=(<:AHex>+) ['..' $=(<:AHex>+)]? \s* ';' \s* $=(.*) ) \s* $ / { #.say; my Int:D $start = $.Str.parse-base(16); my Int:D $end = $ ?? $.Str.parse-base(16) !! $start; my Str:D $name = $.Str; my Str:D $fullname = $.Str; return $start, $end, $name, $fullname; } else { die; } } sub get-block-data (Str:D $file, @looking, $funcname) { die unless "UNIDATA/$file".IO.f; my $myfile = slurp "UNIDATA/$file"; my @out = "/* Data from $file */", "MVM_STATIC_INLINE MVMuint32 $funcname " ~ '(MVMCodepoint cp) {'; @out.push: 'return'.indent: 4; my Int:D $num = 0; for $myfile.lines { next if /^ \s* '#' /; next if /^ \s* $/; if ($file eq 'PropList.txt') { my @split = .split(/[\s+|';']/, :skip-empty); #say @split.perl; next unless @split[1].trim eq @looking.any; } if ($file eq 'Blocks.txt') { my $found = False; for @looking -> $looking { $found = True if m/^\s* <:AHex>+ '..' <:AHex>+ \s* ';' \s* $looking \s* $/; } next unless $found; } #100000..10FFFF; Supplementary Private Use Area-B #(0x3400 <= cp && cp <= 0x4DB5) /* 3400..4DB5 d*/ my ($start, $end, $name, $fullname) = process-block $_; my Str:D $or = $num++ ?? '||' !! ' '; #say $num; my Str:D $conditional = $start == $end ?? "0x%-22X == cp".sprintf($start) !! "0x%-5X <= cp && cp <= 0x%-5X".sprintf: $start, $end; @out.push: "%s (%s) /* %4X..%-4X %-34s */".sprintf($or, $conditional, $start, $end, $name).indent: 4; #say "start $start end $end name: “$nameâ€"; } @out.push: ';'.indent: 4; @out.push: '}'; @out.join("\n") ~ "\n"; } parse-test-data($main-p6node); my $main-node-elems = add-main-node-to-c-data($main-p6node, @main-node); sub_node-flesh-out-tree-from-main-node-elems($main-p6node, @main-node, @collation-elements); say now - INIT now; sub format-collation-Str ($a) { my Str $out; for $a -> $item is copy { my $thing = $item.pop; my Str:D $thing-str = $thing ?? '*' !! '.'; $out ~= "[%s%.4X.%.4X.%.4X]".sprintf($thing-str, |$item); } $out; } my @composed-arrays = "/* This file generated from tools/Generate-Collation-Data.p6 */"; sub make-struct (@names, @types, @collation-list-for-packing, $struct-name) { use lib 'lib'; use BitfieldPacking; my @order = compute-packing(@collation-list-for-packing); my @out-str = "struct $struct-name \{"; for @order -> $pair { @out-str.push: ([~] @types[$pair.key], " ", @names[$pair.key], " :", $pair.value, ";").indent(4); } @out-str.push: '};'; @out-str.join("\n"), @order; } my @collation-list-for-packing = 0 => uint-bitwidth($max-primary), 1 => uint-bitwidth($max-secondary), 2 => uint-bitwidth($max-tertiary), 3 => uint-bitwidth($max-special); my @collation_key_names = 'primary', 'secondary', 'tertiary', 'special'; my ($collation_key_struct, $collation_key_order) = make-struct( @collation_key_names, ("MVMuint32" xx 4), @collation-list-for-packing, 'collation_key'); @composed-arrays.push: $collation_key_struct; my @names2 = ; my @sub_node-list-for-packing2 = 0 => uint-bitwidth($max-cp), 1 => uint-bitwidth(@main-node.elems - 1), 2 => uint-bitwidth(@main-node.elems - 1), 3 => uint-bitwidth($max-collation-elems), 4 => uint-bitwidth(@collation-elements.elems - 1); my ($sub_node_struct, $order2) = make-struct( @names2, ('MVMuint32' xx 5), @sub_node-list-for-packing2, 'sub_node'); @composed-arrays.push: $sub_node_struct; @composed-arrays.push: "typedef struct sub_node sub_node;"; sub transform-array (@array, @order) { @array.map(-> $item { my @out; for ^$item.elems -> $i { @out[$i] = $item[@order[$i].key]; } @out; }); } @composed-arrays.push: "#define main_nodes_elems @main-node.elems()"; @composed-arrays.push: "#define starter_main_nodes_elems $main-node-elems"; @composed-arrays.push: "#define codepoint_sequence_no_max $codepoint_sequence_no_max"; @composed-arrays.push: "#define special_collation_keys_elems @collation-elements.elems()"; @composed-arrays.push: get-block-data("PropList.txt", ("Unified_Ideograph",), "is_unified_ideograph"); @composed-arrays.push: get-block-data("Blocks.txt", ("Nushu",), "is_Assigned_Block_Nushu"); @composed-arrays.push: get-block-data("Blocks.txt", ("Tangut","Tangut Components"), "is_Block_Tangut"); @composed-arrays.push: get-block-data("Blocks.txt", ("CJK Unified Ideographs","CJK Compatibility Ideographs"), "is_Block_CJK_Unified_Ideographs_OR_CJK_Compatibility_Ideographs"); @composed-arrays.push: compose-array('sub_node', 'main_nodes', transform-array(@main-node».build, $order2)); @composed-arrays.push: compose-array( 'struct collation_key', 'special_collation_keys', transform-array(@collation-elements, $collation_key_order)); spurt $out-file, @composed-arrays.join("\n"); print qq:to/END/; Done writing $out-file. {'=' x 70} MAKE SURE TO RUN `tools/CollationTest.t` to ensure there are ~74 failures only! END MoarVM-2018.03/tools/UCD-download.p60000755000175000017510000001123013242626641017040 0ustar samanthasamantha#!/usr/bin/env perl6 # Gets the latest Unicode Data files and extracts them. use v6; my $UCD-zip-lnk = "ftp://ftp.unicode.org/Public/UCD/latest/ucd/UCD.zip"; my $UCA-all-keys = "ftp://ftp.unicode.org/Public/UCA/latest/allkeys.txt"; my $UCA-collation-test = "ftp://ftp.unicode.org/Public/UCA/latest/CollationTest.zip"; my $MS_CODETABLES_URL = 'ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/'; my @MS_CODETABLES = 'CP1252.TXT', 'CP1251.TXT'; my IO::Path $unidata = "UNIDATA".IO.absolute.IO; sub MAIN { if ! so $unidata.d { say "Creating UNIDATA directory"; $unidata.mkdir; } else { die "$unidata directory already exists. Please delete it and run again."; } chdir $unidata; chdir $unidata; if ! so "./UCD.zip".IO.f { say "Downloading the latest UCD from $UCD-zip-lnk"; download-file($UCD-zip-lnk,"UCD.zip"); say "Unzipping UCD.zip"; unzip-file("UCD.zip"); } if ! so "UCA".IO.d { say "Creating the UCA directory"; mkdir "UCA"; download-set-file($UCA-collation-test, 'CollationTest.zip', "UCA"); } if ! so "./UCA/allkeys.txt".IO.f { say "Downloading allkeys.txt from $UCA-all-keys"; chdir "UCA".IO; download-file($UCA-all-keys, "allkeys.txt"); chdir $unidata; } if ! so $unidata.d { say "Creating UNIDATA directory"; $unidata.mkdir; } chdir $unidata; if ! so "UCD.zip".IO.f { say "Downloading the latest UCD from $UCD-zip-lnk"; download-file($UCD-zip-lnk,"UCD.zip"); say "Unzipping UCD.zip"; unzip-file("UCD.zip"); } if ! so "UCA".IO.d { say "Creating the UCA directory"; mkdir "UCA"; download-set-file($UCA-collation-test, 'CollationTest.zip', "UCA"); } if ! so "./UCA/allkeys.txt".IO.f { say "Downloading allkeys.txt from $UCA-all-keys"; chdir "UCA".IO; download-file($UCA-all-keys, "allkeys.txt"); chdir '..'; } if ! "CODETABLES".IO.d { say "Downloading codetables from $MS_CODETABLES_URL"; mkdir "CODETABLES"; chdir "CODETABLES"; for @MS_CODETABLES { say "dling $MS_CODETABLES_URL$_"; download-file("$MS_CODETABLES_URL$_", $_); } } get-emoji(); } sub download-file ( Str:D $url, Str:D $filename ) { qqx{curl "$url" -o "$filename"}; } sub download-set-file ( Str:D $url, Str:D $filename, Str:D $dir) { if ! so "$dir/$filename".IO.f { my $cwd = $*CWD; say "Downloading $filename from $url"; chdir $dir.IO; download-file($url, $filename); chdir $cwd; } if $filename.ends-with('.zip') { my $cwd = $*CWD; chdir $dir.IO; unzip-file($filename); chdir $cwd; } } sub unzip-file ( Str:D $zip ) { qqx{unzip "$zip"}; } sub get-emoji { chdir $unidata; # Since emoji sequence names are not cannonical and unchangeable, we get # all of them starting with the first the feature was added in my $first-emoji-ver = <4.0>; my $emoji-dir = "ftp://ftp.unicode.org/Public/emoji/"; my @emoji-vers; say "Getting a listing of the Emoji versions"; for qqx{curl -s "$emoji-dir"}.lines { push @emoji-vers, .split(/' '+/)[8]; } say "Emoji versions: ", @emoji-vers.join(', '); #exit; for @emoji-vers.grep($first-emoji-ver <= *).sort.reverse -> $version { say "See version $version of Emoji, checking to see if it's a draft"; my $readme = qqx{curl -s "ftp://ftp.unicode.org/Public/emoji/$version/ReadMe.txt"}.chomp; if $readme.match(/draft|PRELIMINARY/, :i) { say "Looks like $version is a draft. ReadMe.txt text: <<$readme>>"; next; } else { say "Found version $version. Don't see /:i draft|PRELIMINARY/ in the text."; my $emoji-data = "ftp://ftp.unicode.org/Public/emoji/$version/"; say $emoji-data; my $emoji-folder = "emoji-$version".IO; $emoji-folder.mkdir; chdir $emoji-folder; my @to-download = ; for @to-download -> $filename { download-file "$emoji-data/$filename", $filename; } #download-file("$emoji-data/ReadMe.txt", "ReadMe.txt"); #download-file("$emoji-data/emoji-data.txt", "emoji-data.txt"); #download-file("$emoji-data/emoji-sequences.txt", "emoji-sequences.txt"); #download-file("$emoji-data/emoji-zwj-sequences.txt", "emoji-zwj-sequences.txt"); chdir ".."; #last; } } } MoarVM-2018.03/tools/colorize_spesh.p60000644000175000017510000000057713237701105017652 0ustar samanthasamanthasub colorblock($num, $ver) { "\e[48;5;{ 0x10 + (($num + 1) * 31416) % 216 }m " ~ "\e[38;5;{ 0xE8 + 24 - ($num + $ver * 5) % 24 }m\c[ BLACK LEFT-POINTING TRIANGLE ]" ~ "\e[48;5;0m\c[ BLACK RIGHT-POINTING TRIANGLE ]" ~ "\e[m" } for lines() :eager -> $_ is copy { .subst( /r(<.digit>+) '(' (<.digit>+) ')' /, -> $/ { "r$0\($1\)" ~ colorblock($0, $1) }, :g ).say } MoarVM-2018.03/tools/count-jit-bail-ops.p60000755000175000017510000000045513237701105020240 0ustar samanthasamantha#!/usr/bin/env perl6-m use v6; my %counts; my $logfile = @*ARGS ?? shift @*ARGS !! %*ENV; for lines($logfile.IO) -> $line { if $line ~~ /'BAIL:'/ { $line ~~ /'<' (\w+) '>'/; %counts{$/[0].Str}++; } } for %counts.sort(*.value).reverse -> $pair { say $pair; } MoarVM-2018.03/tools/dynvarcost0000755000175000017510000000211013237701105016456 0ustar samanthasamantha#!/usr/bin/perl use v5.18; use strict; my $TRIES; my %tries; my $FCOST; my $ICOST; my $ECOST; my $XCOST; my %fcost; my %icost; my %ecost; my %xcost; while (<>) { my ($how, $name, $fcost, $icost, $ecost, $xcost) = split; $TRIES++; $tries{$name}++; $FCOST += $fcost; $ICOST += $icost; $ECOST += $ecost; $XCOST += $xcost; $fcost{$name} += $fcost; $icost{$name} += $icost; $ecost{$name} += $ecost; $xcost{$name} += $xcost; } say " TRIES FRAMES INLINES EMPTY TAKEN"; say " ======== =============== =============== =============== ==============="; output("TOTAL", $TRIES, $FCOST, $ICOST, $ECOST, $XCOST); say ""; for my $name (sort {$tries{$b} <=> $tries{$a}} keys %tries) { output($name, $tries{$name}, $fcost{$name}, $icost{$name}, $ecost{$name}, $xcost{$name}); } sub output { my ($name, $t, $f, $i, $e, $x) = @_; printf "%-22s %8d %9d %6.2f %9d %6.2f %9d %6.2f %9d %6.2f\n", $name, $t, $f, $f/$t, $i, $i/$t, $e, $e/$t, $x, $x/$t; } MoarVM-2018.03/tools/expr-template-compiler.pl0000644000175000017510000003223613252330426021305 0ustar samanthasamantha#!/usr/bin/env perl use strict; use warnings; # use very strict use warnings FATAL => 'all'; use Getopt::Long; use File::Spec; use Scalar::Util qw(looks_like_number); # use my libs use FindBin; use lib $FindBin::Bin; use sexpr; use expr_ops; # Input: # (load (addr pargs $1)) # Output # template: (MVM_JIT_ADDR, MVM_JIT_PARGS, 1, MVM_JIT_LOAD, 0) # length: 5, root: 3 "..f..l" # options to compile my %OPTIONS = ( prefix => 'MVM_JIT_', oplist => File::Spec->catfile($FindBin::Bin, File::Spec->updir, qw(src core oplist)), include => 1, ); GetOptions(\%OPTIONS, qw(prefix=s list=s input=s output=s include!)); my ($PREFIX, $OPLIST) = @OPTIONS{'prefix', 'oplist'}; if ($OPTIONS{output}) { close( STDOUT ) or die $!; open( STDOUT, '>', $OPTIONS{output} ) or die $!; } if ($OPTIONS{input} //= shift @ARGV) { close( STDIN ); open( STDIN, '<', $OPTIONS{input} ) or die $!; } # Wrapper for the recursive write_template sub compile_template { my $tree = shift; my ($templ, $desc, $env) = ([], [], {}); my ($root, $mode) = write_template($tree, $templ, $desc, $env); die "Invalid template!" unless $mode eq 'l'; # top should be a simple expression return { root => $root, template => $templ, desc => join('', @$desc) }; } my %EXPR_OP_TYPES = ( flagval => 'flag', all => 'flag', any => 'flag', do => 'void,reg', dov => 'void', when => 'flag,void', if => 'flag,reg,reg', ifv => 'flag,void,void', call => 'reg,c_args', callv => 'reg,c_args', arglist => 'void', guard => 'void', ); # which list item is the size my %OP_SIZE_ARG = ( load => 2, store => 3, call => 3, const => 2, cast => 2, ); sub validate_template { my $template = shift; my $node = $template->[0]; if ($node eq 'let:') { my $defs = $template->[1]; my @expr = @$template[2..$#$template]; for my $def (@$defs) { validate_template($def->[1]); } validate_template($_) for grep ref($_) eq 'ARRAY', @expr; return; } die "Unknown node type $node" unless exists $EXPR_OPS{$node}; # NB - this inserts the template length parameter into the list, # which is necessary for the template builder (runtime) my ($nchild, $narg) = @{$EXPR_OPS{$node}}{qw(num_childs num_args)};; my $offset = 1; if ($nchild < 0) { $nchild = @$template - 1; splice @$template, 1, 0, $nchild; $offset = 2; } unless (($offset+$nchild+$narg) == @$template) { my $txt = sexpr::encode($template); die "Node $txt is too short"; } my @types = split /,/, ($EXPR_OP_TYPES{$node} // 'reg'); if (@types < $nchild) { if (@types == 1) { @types = (@types) x $nchild; } elsif (@types == 2) { @types = (($types[0]) x ($nchild-1), $types[1]); } else { die "Can't match up types"; } } for (my $i = 0; $i < $nchild; $i++) { my $child = $template->[$offset+$i]; if (ref($child) eq 'ARRAY' and substr($child->[0], 0, 1) ne '&') { unless ((my $op = $child->[0]) eq 'let:') { my $type = lc $EXPR_OPS{$op}{type}; die sprintf('Expected %s but got %s in template %s child %d', $types[$i], $type, sexpr::encode($template), $i) unless $types[$i] eq $type; } validate_template($child); } elsif (substr($child, 0, 1) eq '$') { # OK! die sprintf('Expected type %s but got %s', $types[$i], $child) unless $types[$i] eq 'reg'; } else { my $txt = sexpr::encode($template); die "Child $i of $txt is not a expression"; } } for (my $i = 0; $i < $narg; $i++) { my $child = $template->[$offset+$nchild+$i]; if (ref($child) eq 'ARRAY' and substr($child->[0], 0, 1) eq '&') { # OK } elsif (substr($child, 0, 1) ne '$') { # Also OK } else { my $txt = sexpr::encode($template); die "Child $i of $txt is not an argument"; } } if (exists $OP_SIZE_ARG{$node}) { # does this look like a size argument? my $size_arg = $template->[$OP_SIZE_ARG{$node}]; if (ref($size_arg)) { warn sprintf("size argument '%s' for node '%s' is not a macro", sexpr::encode($size_arg), $node) if $size_arg->[0] !~ m/\A&\w+/ } elsif (!looks_like_number($size_arg) && $size_arg !~ m/_sz\z/) { warn sprintf("size argument '%s' for node '%s' may not be a size", $size_arg, $node); } } } sub apply_macros { my ($tree, $macros) = @_; return unless ref($tree) eq 'ARRAY'; my @result; for my $node (@$tree) { if (ref($node) eq 'ARRAY') { push @result, apply_macros($node, $macros); } else { push @result, $node; } } # empty lists can occur for instance with macros without arguments if (@result and $result[0] =~ m/^\^/) { # looks like a macro my $name = shift @result; if (my $macro = $macros->{$name}) { my ($params, $structure) = @$macro[0,1]; die sprintf("Macro %s needs %d params, got %d", $name, 0+@result, 0+@{$params}) unless @result == @{$params}; my %bind; @bind{@$params} = @result; return fill_macro($structure, \%bind); } else { die "Tried to instantiate undefined macro $result[0]"; } } return \@result; } sub fill_macro { my ($macro, $bind) = @_; my $result = []; for (my $i = 0; $i < @$macro; $i++) { if (ref($macro->[$i]) eq 'ARRAY') { push @$result, fill_macro($macro->[$i], $bind); } elsif (substr($macro->[$i], 0, 1) eq ',') { if (defined $bind->{$macro->[$i]}) { push @$result, $bind->{$macro->[$i]}; } else { die "Unmatched macro substitution: $macro->[$i]"; } } else { push @$result, $macro->[$i]; } } return $result; } sub write_template { my ($tree, $templ, $desc, $env) = @_; die "Can't deal with an empty tree" unless @$tree; # we need at least some nodes my $top = $tree->[0]; # get the first item, used for dispatch die "First parameter must be a bareword or macro" unless $top =~ m/^&?[a-z]\w*:?$/i; my (@items, @desc); # accumulate state if ($top eq 'let:') { # rewrite (let: (($name ($code))) ($code..)+) # into (do(v)?: $ndec + $ncode $decl+ $code+) my $env = { %$env }; # copy env and shadow it my $decl = $tree->[1]; my @expr = @$tree[2..$#$tree]; # depening on last node result, start with DO or DOV (void) my $type = $EXPR_OPS{$expr[-1][0]}{'type'}; my $list = [ $type eq 'VOID' ? 'DOV' : 'DO', @$decl + @expr ]; # add declarations to template and to DO list for my $stmt (@$decl) { die "Let statement should hold 2 expressions, holds ".@$stmt unless @$stmt == 2; die "Variable name {$stmt->[0]} is invalid" unless $stmt->[0] =~ m/\$[a-z]\w*/i; die "Let statement expects an expression" unless ref($stmt->[1]) eq 'ARRAY'; die "Redeclaration of '$stmt->[0]'" if defined($env->{$stmt->[0]}); my ($child, $mode) = write_template($stmt->[1], $templ, $desc, $env); die "Let can only be used with simple expresions" unless $mode eq 'l'; $env->{$stmt->[0]} = $child; # ensure the DO is compiled as I expect. push @$list, ['DISCARD', $stmt->[0]]; } push @$list, @expr; return write_template($list, $templ, $desc, $env); } elsif (substr($top, 0, 1) eq '&') { # Add macro or sizeof/offsetof expression. these are not # processed in at runtime! Must evaluate to constant # expression. return (sprintf('%s(%s)', substr($top, 1), join(', ', @$tree[1..$#$tree])), '.'); } # deal with a simple expression for my $item (@$tree) { if (ref($item) eq 'ARRAY') { # subexpression: get offset and template mode for this root my ($child, $mode) = write_template($item, $templ, $desc, $env); push @items, $child; push @desc, $mode; } elsif ($item =~ m/^\$\d+$/) { # numeric variable (an operand parameter) push @items, substr($item, 1)+0; # pass the operand nummer push @desc, 'f'; # at run time, fill this from operands } elsif ($item =~ m/^\$\w+$/) { # named variable (declared in let) die "Undefined variable '$item' used" unless exists $env->{$item}; push @items, $env->{$item}; push @desc, 'l'; # also needs to be linked in properly } elsif ($item =~ m/^\d+$/) { # integer numerics are passed literally push @items, $item; push @desc, '.'; } else { # barewords are passed as uppercased prefixed strings push @items, $PREFIX . uc($item); push @desc, '.'; } } my $root = @$templ; # current position is where we'll be writing the root template. # add to output array push @$templ, @items; push @$desc, @desc; # a simple expression should be linked in at runtime return ($root, 'l'); } # first read the correct order of opcodes my (@opcodes, %names); { open( my $oplist, '<', $OPLIST ) or die $!; while (<$oplist>) { next unless (m/^\w+/); my $opcode = substr $_, 0, $+[0]; push @opcodes, $opcode; $names{$opcode} = $#opcodes; } close( $oplist ) or die $!; } # read input, which should use the expresison-list # syntax. generate template info table and template array my %SEEN; sub parse_file { my ($fh, $macros) = @_; my (@templates, %info); my $parser = sexpr->parser($fh); while (my $raw = $parser->parse) { my $tree = apply_macros($raw, $macros); my $keyword = shift @$tree; if ($keyword eq 'macro:') { my $name = shift @$tree; $macros->{$name} = $tree; } elsif ($keyword eq 'template:') { my $opcode = shift @$tree; my $template = shift @$tree; my $flags = 0; if (substr($opcode, -1) eq '!') { # destructive template $opcode = substr $opcode, 0, -1; $flags |= 1; } die "Opcode '$opcode' unknown" unless defined $names{$opcode}; die "Opcode '$opcode' redefined" if defined $info{$opcode}; # Validate template for consistency with expr.h node definitions validate_template($template); my $compiled = compile_template($template); $info{$opcode} = { idx => scalar @templates, info => $compiled->{desc}, root => $compiled->{root}, len => length($compiled->{desc}), flags => $flags }; push @templates, @{$compiled->{template}}; } elsif ($keyword eq 'include:') { my $file = shift @$tree; $file =~ s/^"|"$//g; if ($SEEN{$file}++) { warn "$file already included"; next; } open( my $handle, '<', $file ) or die $!; my ($inc_templates, $inc_info) = parse_file($handle, $macros); close( $handle ) or die $!; die "Template redeclared in include" if grep $info{$_}, keys %$inc_info; # merge templates into including file $_->{idx} += @templates for values %$inc_info; $info{keys %$inc_info} = values %$inc_info; push @templates, @$inc_templates; } else { die "I don't know what to do with '$keyword' "; } } return \(@templates, %info); } my ($templates, $info) = parse_file(\*STDIN, {}); close( STDIN ) or die $!; # write a c output header file. print <<"HEADER"; /* FILE AUTOGENERATED BY $0. DO NOT EDIT. * Defines tables for expression templates. */ HEADER my $i = 0; print "static const MVMJitExprNode MVM_jit_expr_templates[] = {\n "; for (@$templates) { $i += length($_) + 2; if ($i > 75) { print "\n "; $i = length($_) + 2; } print "$_,"; } print "\n};\n"; print "static const MVMJitExprTemplate MVM_jit_expr_template_info[] = {\n"; for (@opcodes) { if (defined($info->{$_})) { my $td = $info->{$_}; printf ' { MVM_jit_expr_templates + %d, "%s", %d, %d, %d },%s', $td->{idx}, $td->{info}, $td->{len}, $td->{root}, $td->{flags}, "\n"; } else { print " { NULL, NULL, -1, 0 },\n"; } } print "};\n"; print <<'FOOTER'; static const MVMJitExprTemplate * MVM_jit_get_template_for_opcode(MVMuint16 opcode) { if (opcode >= MVM_OP_EXT_BASE) return NULL; if (MVM_jit_expr_template_info[opcode].len < 0) return NULL; return &MVM_jit_expr_template_info[opcode]; } FOOTER MoarVM-2018.03/tools/expr_ops.pm0000644000175000017510000000223313237701105016537 0ustar samanthasamanthapackage expr_ops; use strict; use warnings; use File::Spec; use constant EXPR_OPS_H => do { my ($path, $directory, $filename) = File::Spec->splitpath(__FILE__); File::Spec->catpath($path, File::Spec->catdir($directory, File::Spec->updir(), 'src','jit'), 'expr_ops.h'); }; sub parse_expr_ops { my ($file_name) = @_; open my $fh, '<', $file_name or die "Coulqd not open '$file_name': $!"; while (<$fh>) { last if m/#define MVM_JIT_EXPR_OPS/; } my @expr_ops; while (<$fh>) { next unless (m/\((\w+),\s*(-?\d+),\s*(\d+),\s*(\w+),\s*(\w+)\)/); push @expr_ops, [$1, $2, $3, $4, $5]; } close $fh; return @expr_ops; } sub import { my ($class, @args) = @_; my @keys = qw(name num_childs num_args type cast); my @expr_ops = parse_expr_ops(@args ? @args : EXPR_OPS_H); my %expr_ops = map { my ($i, $op) = ($_, $expr_ops[$_]); lc($op->[0]) => { map({ $keys[$_] => $op->[$_] } 1..$#$op), 'idx' => $i }; } 0..$#expr_ops; my ($caller) = caller(); { no strict 'refs'; *{$caller . '::EXPR_OPS'} = \@expr_ops; *{$caller . '::EXPR_OPS'} = \%expr_ops; } } 1; MoarVM-2018.03/tools/generate_encoding_codetables.p60000755000175000017510000000607013242626641022453 0ustar samanthasamantha#!/usr/bin/env perl6 # This code generates encoding tables for single byte encodings. # Currently Windows-1252 and Windows-1251 sub process-file (Str:D $filename, Str:D $encoding) { my %to-hex1252; for $filename.IO.slurp.lines -> $line { next if $line.starts-with: '#'; my ($cp1252_hex, $Unicode_hex, $comment) = $line.split: /\t/; if (!$cp1252_hex || !$Unicode_hex || !$comment) { die "'$cp1252_hex' '$Unicode_hex' '$comment'"; } # Map unmapped things to 0xFFFF, so we can throw if we see them if $Unicode_hex ~~ /^\s+/ { $Unicode_hex = "0xFFFF"; } $Unicode_hex ~~ s/^0x//; $cp1252_hex ~~ s/^0x//; %to-hex1252{$cp1252_hex.parse-base(16)} = $Unicode_hex.parse-base(16); } die unless elems %to-hex1252 == 256; %to-hex1252; } sub MAIN { my $DIR = "UNIDATA/CODETABLES"; my @info = %(encoding => 'windows1252', filename => "$DIR/CP1252.TXT", comment => "/* Windows-1252 Latin */"), %( encoding => 'windows1251', filename => "$DIR/CP1251.TXT", comment => "/* Windows-1251 Cyrillic */"); my %win1252 = process-file(@info[0], @info[0]); my %win1251 = process-file(@info[1], @info[1]); say create-windows1252_codepoints(%win1252, @info[0], @info[0]); say create-windows1252_codepoints(%win1251, @info[1], @info[1]); say create-windows1252_cp_to_char(%win1252, @info[0]); say create-windows1252_cp_to_char(%win1251, @info[1]); } sub create-windows1252_codepoints (%to-hex1252, $encoding, $comment) { sub make_line (@lines, @out) { if @lines { my Str:D $out = join(",", @lines); @out.push: $out; @lines = Empty; } } my @lines; my $count = 0; my @out; for 0..255 { push @lines, "0x%04X".sprintf(%to-hex1252{$_}); make_line @lines, @out if @lines %% 8; } make_line @lines, @out; my $out_str = "$comment\n" ~ "static const MVMuint16 {$encoding}_codepoints[] = \{\n" ~ @out.join(",\n").indent(4) ~ "\n\};"; $out_str; } sub create-windows1252_cp_to_char (%to-hex1252, $encoding) { my $max = %to-hex1252.values.grep({$_ != 0xFFFF}).max; my $out_str2 = "static MVMuint8 {$encoding}_cp_to_char(MVMint32 codepoint) \{\n"; my $out_str3 = qq:to/END/; if ($max < codepoint || codepoint < 0) return '\\0'; switch (codepoint) \{ END my @cases; for %to-hex1252.keys.sort({%to-hex1252{$^a} <=> %to-hex1252{$^b}}) -> $win_cp { next if %to-hex1252{$win_cp} == 0xFFFF; # Skip codepoints from 0..127 since those are in ASCII and don't need to # be in the switch next if $win_cp <= 127; @cases.push: make-case %to-hex1252{$win_cp}, $win_cp; } @cases.push: ‘default: return '\0';’; my $indent = ' ' x 4; $out_str2 ~= ($out_str3 ~ $indent ~ @cases.join("\n$indent") ~ "\n\};").indent(4) ~ "\n\}"; $out_str2; } sub make-case (Cool:D $from, Cool:D $to) { "case $from: return $to;" } MoarVM-2018.03/tools/gh-pages-deploy_key.enc0000644000175000017510000000626013237701105020672 0ustar samanthasamanthae^å›ûŽOy‰>$N-ŸU±ÒEˆóåƒb@™§gžÊ×KL~9ci‘‘®È¥ýÅ:JGü²!@Ѧ4‰aµY™S2¾ººîú‹ëåI¶[‚y·N½ô¢ ¹³bÓI䱋vb†“à'ÕðÚ´îëÂ6)]zd™õøiÚlo,ԩ󤓭“ƽœ¾Z`´è÷@"š731 °Ÿ1Ò üaö g‡PˆW˜Yr¨‚4ð€ÕûŽþÂ4]ŠM¯”rZý\¼yYlêbÞ(0'î× Y¹X)¹64yÍ&v(-7÷">øçÕ”‡]V<‰Œjþ={’êi”nš³é-Ü=£ÎìÍÀ¸å`¶Ž3HÍÄ‹^õ^ïà"€Gœ7ÿ} ÁL%ÔxÆ^Š" @A{ßsï¤ÉŸôtÉ÷L™<å‹u6èkØ~ã]çæoQÂ*}‚)`ì0æâˆW®PÖ÷ÿ¢øV¾ìV‚é»Ù3¯.Û5”ÔOL¤a÷ÔèÐÐ3íJ §!xqÝèÌ#%yÄ·¶¶º«šÖÛÊCuƒ–mµFA6JDHd@%ÑR‹vÊ4{ÿ3r: — Tž\ER”ã¼L'Sˆ.ÓL½!ÅH^Ê[Œ»4¶7A`ßâ5S¥4Mdùø- lÖ<£~VleŽcÊ:ÕÕ°¡mœs2FVâ›Rä˜È­BÉ›µCl¸zÆf+9Û0ö›ðáôêg²¤èmçC q0f×¹@¬îxùŒéÿ >Åã‘Î5žG¶èéßþÒåvdµ.ç¼ßFý-˜I”¼Ô£5¿}:…‡óüép»Üô=̿ܒl9ÙÔ&ÝWçYò/"¤ukÛ¥Wæk€~QêÁ·òÕÒ¼ñü?.ŸŸ7k•Ã"~þSE=†ZŸ5½iPS>(‡½Do y.TlÔc÷ƒ'³ ‚­î$äi˜j,p"õðÛ¨dn§æ…°®Í&·¸Pw ÚyÊW+lçÖ½í¹‘‘aØê‚žÀ:&åø½õCSc€ŠüW²|†á"¨[‹²_)}P~E ž…-s#Ñ쩺–§àÔBå £Ð7À8oõ›]Œ+ÞSÇÑQÏ‹±Ë¸¶#OQÌÉ:³;çc³˜F·òõŽæÎà^éþsBÙ>Öur3óY½Áo.ÁcoêG0›ºþ~ݦ«£÷IZÚw¿¶Ÿp"]±Ý×ÍÖfü•6Ŧ,/'ò2k$½V9Ý%šÐþúòÊñ2]{¾³Èú]‰»ÅÛÍ{ªÃ`"‹Ä¥Ã^29†˜)² ²\%¯fí¨o‘s×!Љr‡fTÊÒ¶’0&\®Y!Ê|Í^AL©Ž‡Êdí·æy¸UmÖC J!;Œk7㈀ÊyÞƒ€ d¼$x/ ïÀ¥cÜ –‹N±X§´²S-ÕSâc­Íü9]Á!Ÿ ÎÒ ÏJ~×þ?8l ZúƦwI§á6º`AwÉžñÇÂÀ|»{^à ƒæ‹’;XDæ$û#öx0bňܢ”<¬ÃmZ+éå˜8¸çgx¥ñ©×v¦ö à«™køÏ²Ù¸=ª ðêK#ű½®—á>ÔÊÏÁLËÆVƒk¶ì*8aW2Cë]©@‰¤{!YÎ 9‘ ï³^6$ÌÁCñ“2¥P#ù0fP.÷ýfxzeN×®PDêp8fB¹Êóí ÛúÐagùÖš8**¶VŠ|ã'Á‰jà[þ5™þЗ™ E“CxÃJ\!Ù ‰ôÈ“^Ä-˦Ìî¼4Çcl+”ÀÖ U/®)nô&MаG·ÛÃY>8NñõH ÑçÛ˜Ûè¶LÁxj0ßrP½dœ.ßÂ3 qÅô€ˆÅRûïpÛKbË(ˆâÄÃ|yGü«Vñ#„jD˜y“¾n´»CvøôÎ ÿ½Ïb$„¦^Œ™¦ù‡À…LªÄä«N²ù!µºr|s€ý%àæ}Q÷µ¬hÙ½Ël* Ð}Â2*aÆ KåsÁ~»"Ò£ÉöiõGYá“.bµ›®±y{¿,óÕf8}‰þ¥ëœ5éR¹ßAÅ ¥™6¨ DúéuϾUŒµì†™÷qƒûäZG¿¹mW¬ãô Za`â“}fšÓ†Vw$‰™ÏJĘ èÁµw„.Ì©ƒÂ*cߎþ+ꢥŸ¯-¥gwH^FJéüŽ;ÖÌãkùŒ°Ž…à—ïÆé€YÆËeŒëñjCÃ"gÈá1|ÌOB@7‚%¹U†Î½§kÐÅ&?^2…/Jáý,7V••Gl¡®8 a¶y¨jÉÒÙb“¥g‘Û\^ðωK© gtO•Û¹¢±—!w×Ò|óà„û1“‹À‘(ûBpo²ÐÒ§Ê<Œ…)UÏqK…½x±#‚Ù ApÆ©¦„¦žxm…#@½Ëq˜0çû%'­œOç‘èjaº;†½ëŸ“4ç¹j&YTUcAHZ¼ù bayšk<Ò02?œvJä‰Á›\ê#>é•`‡†ÜUŒ1è$¥ºØ9ú{zÍïã$SPè:ÛÖ¹¯ºÁÿqýêŠ=«ˆ{iöjhúòÖwèvÖüåZW?#½;ë¼4Ós`œÂ’%2lŒoй{ñ¤%0÷´õ•ÏK2…P:PÑÁò–õB"-§qùïœ~r"ÇÙ˜SþxLŸé•¤\eùOV†ë£ ›Èƒ~>o‚“,¸µë–ÍÛw­Vdß Language to stdout. Ideally, you'd use C to generate an image file from the result or have it display the result "interactively" in a window: =code perl6 graph_spesh.p6 a_nice_excerpt.txt | dot -Tsvg > helpful_graph.svg perl6 graph_spesh.p6 a_nice_excerpt.txt | dot -Tpng > huge_image.png perl6 graph_spesh.p6 a_nice_excerpt.txt | dot -Tx11 The -T flag for dot selects the output format. Using K<-Tx11> will open a window in which you can pan and zoom around in. If you get an error that MAST::Ops could not be found, please run C to generate that module. =end pod use lib ~$?FILE.path.parent.child("lib"); use MAST::Ops; my $current_bb; my %lit_real_serial; my %lit_str_serial; say 'digraph G {'; say ' graph [rankdir="TB"];'; say ' node [shape=record,style=filled,fillcolor=white];'; say " \"Control Flow Graph\";"; say " \"Dominance Tree\";"; my $insnum = 0; my $in_subgraph = 0; my $ann_num = 0; # if instruction-carrying lines appear before the first BB, we # shall gracefully invent a starting point. my $last_ins = "\"out of nowhere\""; my %bb_map; my @connections; my %bb_connections; my @dominance_conns; my @callsite_args; my %reg_writers; my @delayed_writer_connections; my @bb_overview; constant @bb_colors = ((((1 .. *) X* 0.618033988749895) X% 1.0) .map(*.fmt("%.5f ")) Z~ (((0, -1 ... *) X* 0.0618033988749895) X% 0.05 + 0.95) .map(*.fmt("%.5f "))) X~ "0.9900"; for lines() -> $_ is copy { when / ^ ' ' $=[<[a..z I 0..9 _]>+] \s+ [ $=[ | r \s* $=[<.digit>+] \s* '(' \s* $=[<.digit>+] \s* ')' | liti <.digit>+ '(' ~ ')' <-[)]>+ | litn <.digit>+ '(' ~ ')' <-[)]>+ | lits '(' .*? ')' | lex '(' .*? ')' | sslot '(' + ')' | BB '(' + ')' | coderef '(' ~ ')' <-[)]>+ | callsite '(' ~ ')' <-[)]>+ | '' | '' ] ]* % [',' \s*] [\s* '(' <-[)]>+ ')']? \s* $ / { say ""; say " \"{$}_{$insnum}\" "; print " ["; if $ eq "set" | "decont" { print "shape=Mrecord "; } my $previous_ins = $last_ins; my $current_ins = "\"{$}_{$insnum}\""; $last_ins = $current_ins ~ ":op"; my @back_connections; my @labelparts = qq[ $ ]; #note "---------------"; #note @.gist; #note "---------------"; my @props; my $opcode; my $arity; if %MAST::Ops::codes{$}:exists { $opcode = %MAST::Ops::codes{$}; $arity = @MAST::Ops::counts[$opcode]; my $offset = @MAST::Ops::offsets[$opcode]; @props = do for ^$arity { $%( flags => (my $flags = @MAST::Ops::values[$offset + $_]), rwmasked => (my $rwmasked = $flags +& %MAST::Ops::flags), type => ($flags +& %MAST::Ops::flags), is_sslot => ($flags +& %MAST::Ops::flags), targets_reg => ($rwmasked +& (%MAST::Ops::flags +| %MAST::Ops::flags)), writes_tgt => ($rwmasked +& (%MAST::Ops::flags +| %MAST::Ops::flags)), ) } } else { # we have an extop here. assume it writes to its first register and # has exactly as many arguments as it says in the spesh log. $arity = @.elems; @props = $%( flags => 0, rwmasked => (my $type = %MAST::Ops::flags), type => $type, targets_reg => 1, writes_tgt => 1 ), slip do for 1..^$arity { $%( flags => 0, rwmasked => (my $boringtype = %MAST::Ops::flags), type => $boringtype, targets_reg => @[$_].match(/r+'('+')'/) ?? 1 !! 0, writes_tgt => 0 ) }; } my @argument_names = @>>.Str>>.trans( "<" => "«", ">" => "»" ); if $arity && @props[0] { if @props[0] { %reg_writers{@argument_names[0]} = $current_ins ~ ":0"; } } my $first_read = @props[0] ?? 1 !! 0; for @argument_names.kv -> $k, $v { if $k >= $first_read and @props[$k] { if %reg_writers{$v}:exists { @back_connections.push: %reg_writers{$v} => $current_ins ~ ":$k"; } else { @delayed_writer_connections.push: $v => $current_ins ~ ":$k"; } } @labelparts.push: "<$k> $v"; } if $arity && @props[0] { @labelparts = flat @labelparts[1, 0], @labelparts[2..*]; } # find outgoing connections for @argument_names.kv -> $k, $_ { if m/ BB '(' $=[+] ')' / -> $/ { @connections.push: $%( source_block => $current_bb, target_block => $, source_ins => $current_ins ~ ":<$k>" ); } } print " label=\"{ @labelparts.join(" | ") }\" rank=$insnum"; $insnum++; say " ];"; say ""; if $previous_ins ~~ / entry / { say " $previous_ins -> $last_ins [style=dotted];"; } else { say " $previous_ins -> $last_ins [color=\"#999999\"];"; } say ""; for @back_connections { say " $_.key() -> $_.value();"; } say ""; say ""; } when / ^ ' BB ' $=[<.digit>+] ' (' ~ ')' $=<[0..9 a..f x]>+ ':' $ / { %bb_map{~$} = ~$; %bb_map{~$} = ~$; if $in_subgraph { say " \"exit_$current_bb\";"; say " $last_ins -> \"exit_$current_bb\" [style=dotted];"; say " }" if $in_subgraph; } say " subgraph "; say "\"cluster_{~$}\" \{"; say " style=filled;"; say " color=\"@bb_colors[+$]\";"; say " rankdir = TB;"; #say " label = \"$\";"; say " \"entry_$\" [label=\" entry of block $\"];"; $in_subgraph = True; $current_bb = ~$; $last_ins = "\"entry_$\""; @bb_overview.push: " \"bb_ov_$\" [fillcolor=\"@bb_colors[+$]\",color=black,style=filled,label=\"$\"];"; @bb_overview.push: " \"bb_ov_d_$\" [fillcolor=\"@bb_colors[+$]\",color=black,style=filled,label=\"$\"];"; } when / ^ ' ' 'Successors: ' [$=[<.digit>+]]* % ', ' $ / { %bb_connections{$current_bb} = @>>.Str; } when / ^ ' ' '[Annotation: ' $=[<[a..z A..Z 0..9 \ ]>+] $=<-[\]]>+ / { my $previous_ins = $last_ins; $last_ins = "\"annotation_{$current_bb}_{$}_{$ann_num++}\""; say " $last_ins [label=\"{$} {$}\" shape=cds];"; if $last_ins ~~ / entry / { say " $previous_ins -> $last_ins [style=dotted];"; } else { say " $previous_ins -> $last_ins [color=lightgrey];"; } } when / ^ 'Finished specialization of ' / { } when / ^ ' ' \s* r $=[<.digit>+] '(' $=[<.digit>+] ')' ':' / { } when / ^ ' ' 'Dominance children: ' [$=[<.digit>+]]* % [',' <.ws>] / { for $.list -> $child { @dominance_conns.push($current_bb => $child.Int); } } when / ^ ' ' [ 'Instructions' | 'Predecessors' ] / { } when /^ [ 'Facts' | '='+ ] / { } when /^ 'Spesh of \'' $=[<[a..z 0..9 _ ' -]>*] '\' (cuid: ' $=[<[a..z A..Z 0..9 _ . -]>+] ', file: ' $=[<-[:]>*] ':' $=[+] ')' $ / { say " file [shape=record label=\"\{ {$} | {$}:{$} | {$} \}\"];"; } when / ^ \s* $ / { } when /^ 'Callsite ' $=[<[a..f A..F 0..9 x]>+] ' (' $=[+] ' args, ' $=[+] ' pos)' $/ { say " callsite [shape=record label=\"\{ Callsite | {$} arguments, {$} of them positionals | {$} \}\"];"; } when / ^ ' - ' $=[<[a..z A..B 0..9 _ ' -]>+] $ / { @callsite_args.push: ~$; } when / ^ ' PHI' / { # we don't have a nice way to show PHI nodes yet, sadly. } when / ^ ['Stats:' | 'Logged values:'] / { } when / ^ ' ' \d+ [ 'spesh slots' | 'log values'] / { } when / ^ ' ' \s* [\d+]+ %% \s+ / { } default { say " unparsed_line_$((state $)++) [label=\"{$_}\"];"; } } say " }" if $in_subgraph; if @callsite_args { say @callsite_args.map({ "\"arg_$((state $)++)\" [label=\"$_\"]" }).join(';'); say "callsite -> " ~ (^@callsite_args).map({"\"arg_$_\""}).join(" -> ") ~ ";"; } for @connections { say "$_. -> \"entry_{ %bb_map{.} }\" [style=dotted];"; } for @dominance_conns { say "\"exit_$_.key()\" -> \"entry_%bb_map{$_.value}\" [style=tapered;penwidth=10;arrowhead=none;color=grey];"; say "\"bb_ov_d_$_.key()\" -> \"bb_ov_d_%bb_map{$_.value}\" [style=tapered;penwidth=10;arrowhead=none;color=grey];"; once say "\"Dominance Tree\" -> \"bb_ov_d_$_.key()\";"; } for @delayed_writer_connections -> $conn { my $from = $conn.key; my $to = $conn.value; if %reg_writers{$from}:exists { say " %reg_writers{$from} -> $to;"; note "found a connection for $from even after reading the whole file ..."; } else { note "Couldn't find a writer for $from anywhere! (harmless error)"; } } for %bb_connections.kv -> $k, $v { # bb 0 is special and has successors that it won't jump to. #note "marking successors for block $k"; #note $v.perl; #note ""; next unless @$v; my @candidates = do %bb_map{$k} == "0" ?? %bb_map{@$v} !! %bb_map{$v[*-1]}; for @candidates -> $cand { say " \"exit_$k\" -> \"entry_$cand\" [style=dotted];"; say " \"bb_ov_$k\" -> \"bb_ov_$cand\";"; } once say "\"Control Flow Graph\" -> \"bb_ov_$k\";"; } .say for @bb_overview; say '}'; MoarVM-2018.03/tools/interp_backtrace_enhancer.p60000644000175000017510000000116013237701105021752 0ustar samanthasamanthamy $interp_c_file = $*PROGRAM-NAME.IO.parent.parent.child('src').child('core').child('interp.c'); my $cur_op = 'before_dispatch'; my %lines_to_op; for $interp_c_file.lines.kv -> $lineno, $line { if $line ~~ / ^ \s* 'OP(' $=<[a..z A..Z \- \_ 0..9]>+ '):' / { $cur_op = $; } elsif $line ~~ / ^ \s* 'default:' / { $cur_op ~= "_or_after_dispatch"; } %lines_to_op{$lineno} = $cur_op; } for lines() -> $_ is copy { $_ .= subst(rx/'interp.c:' $=<[0..9]>+ /, -> $/ { "interp.c:{$} ({%lines_to_op{$}})" }, :g); .say; } MoarVM-2018.03/tools/jit-bisect.pl0000644000175000017510000001367413243116442016750 0ustar samanthasamantha#!/usr/bin/env perl use strict; use warnings; use Getopt::Long; use File::Spec; use FindBin; use lib $FindBin::Bin; use timeout qw(run_timeout); sub run_with { my ($command, $env, $timeout) = @_; my $status; { # simulate 'local' env vars, which doesn't really work with # child processes my %copy; while (my ($k,$v) = each %$env) { $copy{$k} = $ENV{$v}; $ENV{$k} = $v; } if (defined $timeout) { $status = run_timeout $command, $timeout; } else { $status = system @$command; } while (my ($k,$v) = each %copy) { if (defined $v) { $ENV{$k} = $v; } else { delete $ENV{$k}; } } } if ($status == -1) { local $" = ' '; die "Failed to start: `@$command`: $!"; } return $status; } sub quietly(&) { my ($code) = @_; my ($error, @result); my ($dupout, $duperr); open $dupout, '>&', \*STDOUT; open $duperr, '>&', \*STDERR; close STDOUT; close STDERR; open STDOUT, '>', File::Spec->devnull; open STDERR, '>', File::Spec->devnull; eval { if (!defined wantarray) { $code->(); } elsif (wantarray) { @result = $code->(); } else { $result[0] = scalar $code->(); } 1; } or do { $error = $@ || $!; }; close STDOUT; close STDERR; open STDOUT, '>&', $dupout; open STDERR, '>&', $duperr; close $dupout; close $duperr; die $error if $error; return wantarray ? @result : $result[0]; } sub noisily(&) { my ($code) = @_; $code->(); } sub bisect { my ($varname, $program, $env, $timeout) = @_; $env ||= {}; printf STDERR ("Bisecting %s\n", $varname); if (%$env) { printf STDERR "Given:\n"; printf STDERR " %s=%s\n", $_, $env->{$_} for keys %$env; } my ($low, $high, $mid) = (0,1,0); my $status; do { printf STDERR "%s=%d", $varname, $high; $status = quietly { run_with($program, { %$env, $varname => $high }, $timeout); }; if ($status == 0) { print STDERR "\tOK\n"; ($low, $high) = ($high, $high * 2); } else { print STDERR "\tNOT OK\n"; } } while ($status == 0); while (($high - $low) > 1) { $mid = int(($high + $low) / 2); printf STDERR "%s=%d", $varname, $mid; $status = quietly { run_with($program, { %$env, $varname => $mid }, $timeout); }; if ($status == 0) { $low = $mid; print STDERR "\tOK\n"; } else { $high = $mid; print STDERR "\tNOT OK\n"; } } return $status ? $low : $mid; } my %OPTS = ( verbose => 0, dump => 1, timeout => undef, spesh => 0, ); GetOptions(\%OPTS, qw(verbose dump! timeout=i spesh)) or die "Could not get options"; my @command = @ARGV; die 'Command is required' unless @command; if ($OPTS{verbose}) { no warnings 'redefine'; *quietly = \&noisily; } my $timeout = delete $OPTS{timeout}; # start with a clean slate delete @ENV{qw( MVM_JIT_EXPR_DISABLE MVM_JIT_EXPR_LAST_FRAME MVM_JTI_EXPR_LAST_BB MVM_JIT_DISABLE MVM_SPESH_LIMIT MVM_SPESH_DISABLE )}; # if we want to 'bisect' a spesh problem, also separate out the # inline/osr flags delete @ENV{qw( MVM_SPESH_INLINE_DISABLE MVM_SPESH_OSR_DISABLE )} if $OPTS{spesh}; $ENV{MVM_SPESH_BLOCKING} = 1; # I find that the addition of the MVM_SPESH_LOG / MVM_JIT_LOG # environment variable can sometimes change the spesh order of # frames. So let's add it always so that when we run it for logging # output, we don't accidentally log the wrong frame. $ENV{$_} = File::Spec->devnull for qw(MVM_SPESH_LOG MVM_JIT_LOG); quietly { run_with(\@command, {}, $timeout) } or do { die "This program is quite alright"; }; quietly { run_with(\@command, { ($OPTS{spesh} ? (MVM_SPESH_DISABLE => 1) : (MVM_JIT_EXPR_DISABLE => 1)) }, $timeout) } and do { die "This program cannot be bisected: $?"; }; printf STDERR "Checks OK, this program can be bisected\n"; if ($OPTS{spesh}) { # on the hypothesis that it is simpler to debug a spesh log # /without/ inlining or OSR, than with it, let's first try to # switch flags until we find a breaking combination my @flags = ({}); for my $flag (qw(MVM_SPESH_OSR_DISABLE MVM_SPESH_INLINE_DISABLE MVM_JIT_DISABLE)) { @flags = map { $_, { %$_, $flag => 1 } } @flags; } my $spesh_flags; for my $try_flags (reverse @flags) { quietly { run_with(\@command, $try_flags, $timeout); } and do { $spesh_flags = $try_flags; last; } } my $last_good_frame = bisect('MVM_SPESH_LIMIT', \@command, $spesh_flags, $timeout); printf STDERR ("SPESH Broken frame: %d.\n", $last_good_frame); # alright, get a spesh diff my $log_file = sprintf("spesh-%04d.txt", $last_good_frame+1); printf STDERR ("SPESH Acquiring log: %s\n", $log_file); run_with(\@command, { %$spesh_flags, MVM_SPESH_LOG => $log_file, MVM_SPESH_LIMIT => $last_good_frame + 1 }, $timeout); print STDERR "Done\n"; } else { my $last_good_frame = bisect('MVM_JIT_EXPR_LAST_FRAME', \@command, {}, $timeout); my $last_good_block = bisect('MVM_JIT_EXPR_LAST_BB', \@command, { MVM_JIT_EXPR_LAST_FRAME => $last_good_frame + 1 }, $timeout); printf STDERR ('JIT Broken Frame/BB: %d / %d'."\n", $last_good_frame + 1, $last_good_block + 1); my $dump_script = File::Spec->catfile($FindBin::Bin, 'jit-dump.pl'); my @dump_command = ( $^X, $dump_script, '--frame' => $last_good_frame + 1, '--block' => $last_good_block + 1, ($timeout ? ('--timeout' => $timeout) : ()), '--', @command ); run_with(\@dump_command, {}) if $OPTS{dump}; } __END__ MoarVM-2018.03/tools/jit-comparify-asm.pl0000644000175000017510000000357213237701105020241 0ustar samanthasamantha#!/usr/bin/env perl use strict; use Data::Dumper; my %names; my %labels; my @instructions; my $next_global = 0; my $riprel = undef; while (<>) { chomp; next unless m/^\s*([A-F0-9]+):\s+([A-F0-9]{2} ?)+\s+(\w+)\s+(.+)$/i; my ($addr, $opcode, $arg) = (hex($1), $3, $4); # remove lines with value bytes next if $opcode =~ m/^[0-9A-F]{2}$/i; # remove comments $arg =~ s/\s+(#.+)$//; # rip-relative labels are defined by their end position, hence # they are calculate from the address of the next instruction if (defined $riprel) { $labels{$addr+$riprel} = 1; $riprel = undef; } if ($opcode =~ m/^j\w+$/ && $arg =~ m/^0x/) { my $pos = hex($arg); $labels{$pos} = 1; } elsif ($arg =~ m/\[rip\+(0x[0-9a-f]+)/i) { $riprel = hex($1); } elsif ($opcode eq 'movabs') { my ($reg,$val) = split /,/, $arg; $names{$val} = sprintf('global_%03d', ++$next_global) unless exists $names{$val}; } push @instructions, [$addr, $opcode, $arg]; } sub sortn { sort { $a <=> $b } @_ } # assign labels in code order @labels{sortn keys %labels} = 1..(scalar keys %labels); for (my $i = 0; $i < @instructions; $i++) { my ($addr, $opcode, $arg) = @{$instructions[$i]}; if (exists $labels{$addr}) { # label_ is 6 char, 3 num, 1 colon, 2 space print sprintf("label_%03d: ", $labels{$addr}); } else { print ' ' x 12; } if ($opcode eq 'movabs') { my ($reg,$val) = split /,/, $arg; $arg = sprintf('%s,%s', $reg, $names{$val}); } elsif ($opcode =~ m/^\j\w+$/ && $arg =~ m/^0x/) { $arg = sprintf('label_%03d', $labels{hex($arg)}); } elsif ($arg =~ m/\[rip\+(0x[0-9a-f]+)\]/i) { my $pos = hex($1) + $instructions[$i+1]->[0]; $arg = substr($arg,0,$-[0]) . sprintf('label_%03d # rip', $labels{$pos}); } print "$opcode $arg\n"; } MoarVM-2018.03/tools/jit-dump.pl0000644000175000017510000000733213237701105016435 0ustar samanthasamantha#!/usr/bin/env perl use strict; use warnings; use FindBin; use lib $FindBin::Bin; use timeout qw(run_timeout); use File::Spec; use File::Temp qw(tempdir); use File::Copy qw(copy); use Getopt::Long; my %OPTIONS = ( dir => '.', arch => 'x64', timeout => undef ); GetOptions( \%OPTIONS, qw(frame=i@ block=i@ objdump=s directory=s arch=s timeout=i) ) or die "Could not parse options"; delete @ENV{qw( MVM_SPESH_DISABLE MVM_JIT_DISABLE MVM_JIT_EXPR_DISABLE )}; $ENV{MVM_SPESH_BLOCKING} = 1; die "--frame and --block required" unless $OPTIONS{frame} and $OPTIONS{block}; my @command = @ARGV; die "Command required" unless @command; my @binary; my $timeout = delete $OPTIONS{timeout}; push @{$OPTIONS{block}}, $OPTIONS{block}[0] - 1 if @{$OPTIONS{block}} == 1; my $dump_directory = delete $OPTIONS{directory} || '.'; for my $frame (@{$OPTIONS{frame}}) { $ENV{MVM_JIT_EXPR_LAST_FRAME} = $frame; for my $block (@{$OPTIONS{block}}) { $ENV{MVM_JIT_EXPR_LAST_BB} = $block; my $log_directory = tempdir; $ENV{MVM_JIT_BYTECODE_DIR} = $log_directory; $ENV{MVM_JIT_LOG} = File::Spec->catfile($log_directory, 'jit-log.txt'); printf("Logging to directory: %s (frame %d block %d)\n", $log_directory, $frame, $block); my $result = defined $timeout ? run_timeout(\@command, $timeout) : system @command; if ($result == -1) { local $" = " "; die "Could not start `@command`: $!"; } my $filename = File::Spec->catfile($log_directory, sprintf('moar-jit-%04d.bin', $frame)); printf("Want to copy: %s\n", $filename); my $bin_out = File::Spec->catfile($dump_directory, sprintf('moar-jit-%04d-%04d.bin', $frame, $block)); my $log_out = File::Spec->catfile($dump_directory, sprintf('moar-jit-%04d-%04d.log', $frame, $block)); copy ($filename, $bin_out) or die "Could not copy binary: $!"; copy ($ENV{MVM_JIT_LOG}, $log_out) or die "Could not base log: $!"; push @binary, $bin_out; } } my $objdump = $OPTIONS{objdump} || do { no warnings 'exec'; my $program; for (qw(objdump gobjdump)) { $program = $_ and last if system($_, '-v') == 0; } die "Cannot find objdump program" unless $program; $program; }; my %OBJDUMP_FLAGS = do { no warnings 'qw'; ( x64 => [qw(-b binary -m i386 -M x86-64,intel -D)], ); }; sub disassemble_and_comparify { local $" = " "; my ($binary) = @_; my @objdump_command = ($objdump, @{$OBJDUMP_FLAGS{$OPTIONS{arch}}}, $binary); my @comparify_command = ($^X, File::Spec->catfile($FindBin::Bin, 'jit-comparify-asm.pl')); my $out_file = $binary =~ s/\.bin$/.asm/ir; my ($in_pipe, $out_pipe); pipe $in_pipe, $out_pipe; my $objdump_pid = fork(); if ($objdump_pid == 0) { print STDERR "Starting `@objdump_command`\n"; close( STDOUT ) or die $!; open( STDOUT, '>&', $out_pipe) or die $!; exec @objdump_command or die "Could not exec objdump"; } my $comparify_pid = fork(); if ($comparify_pid == 0) { print STDERR "Starting `@comparify_command`\n"; close( STDIN ) or die $!; open( STDIN, '<&', $in_pipe ) or die $!; close( STDOUT ) or die $!; open( STDOUT, '>', $out_file ) or die $!; exec @comparify_command or die "Could not exec comparify"; } return ($objdump_pid, $comparify_pid); } if ($objdump && $OBJDUMP_FLAGS{$OPTIONS{arch}}) { my @pid; for my $binary (@binary) { push @pid, disassemble_and_comparify($binary); } my $child_id; do { $child_id = waitpid(-1, 0); } while ($child_id > 0); } else { printf STDERR "objdump not found, skipping\n"; } MoarVM-2018.03/tools/lib/ArrayCompose.pm60000644000175000017510000000557213237701105020151 0ustar samanthasamantha#| :partition-note option seperates them by line and adds comments so you can tell #| what element number each one of the items is #| #| :map-empty-as allows you to make undefined array items to a certain value. #| for example match all undefined items to -1 or 0 for example #| function compose-array2-debug was created for debugging the creation of the arrays #| and adding comments between each item for manual debugging multi compose-array2-debug ( Str:D $type, Str:D $name, @body, Bool :$header = False, Str:D :$delim = ',', Bool:D :$no-split = False, :$partition-note!, :$map-empty-as ) is export { @body .= map({ .defined ?? $_ !! $map-empty-as }) if $map-empty-as; say "============$name=========="; my $p-note-nl-delim = S/','/,\n/ given $partition-note; compose-array($type, $name, @body, :$header, :$delim, :$no-split) .split($partition-note) .map({$_ ~ "/*" ~ $++ ~ "*/" }) .join($p-note-nl-delim) } multi compose-array ( Str:D $type, Str:D $name, Cool:D $elems, Str:D $body, Bool:D :$header = False, Str:D :$delim = ',', Bool:D :$no-split = False ) is export { if $header { "#define {$name}_elems $elems" ~ "\n" ~ $type ~ " $name\[" ~ $elems ~ '];'; } else { ($type, " $name\[" ~ $elems ~ '] = {' ~ "\n", ($no-split ?? $body.join($delim) !! break-into-lines($body, $delim)), '};', "\n").join; } } multi compose-array ( Str:D $type, Str:D $name, @body where { all($_ Z~~ any(Str, Int), *) }, Bool :$header = False, Str:D :$delim = ',', Bool:D :$no-split = False, ) is export { #note "Composing array [$name] type: $type"; if $type.contains('char *') { return compose-array($type, $name, @body.elems, '"' ~ @body.join('","') ~ '"', :header($header), :$delim, :$no-split); } elsif $type.contains('char') { # Use a null char to denote empty items since you can't have an empty # char in C $_ = '\0' if $_ eq '' for @body; return compose-array($type, $name, @body.elems, ï½¢'ï½£ ~ @body.join(ï½¢','ï½£) ~ ï½¢'ï½£, :header($header), :$delim, :$no-split); } compose-array($type, $name, @body.elems, @body.join(','), :header($header), :$delim); } multi compose-array ( Str:D $type, Str:D $name, @body where { .all ~~ Positional }, Bool :$header = False, Str:D :$delim = ',', Bool:D :$no-quoting = False, Bool:D :$no-split = False ) is export { compose-array($type, $name, @body.map({ '{' ~ .map({ (!$no-quoting && $_ ~~ Str) ?? “"$_"†!! $_}).join(',') ~ '}' }), :$header, :$delim, :$no-split); } sub break-into-lines (Str $string, Str $breakpoint) { my $copy = $string; $copy ~~ s:g/(.**70..79 $breakpoint)/$0\n/; return $copy; } MoarVM-2018.03/tools/lib/BitfieldPacking.pm60000644000175000017510000001021113237701105020546 0ustar samanthasamanthaconstant $bs = 8; constant $debug = False; #| Gets the remaining number of items left to pack sub num-remain (%h) { [+] %h.values.».elems; } sub exists-and-elems ( %h, $key ) { %h{$key}:exists and %h{$key}.elems; } sub compute-packing ( @list where { .all ~~ Pair and $_.».value.all ~~ Int } ) is export { say "Received list: ", @list.perl if $debug; my @result; my $i = 0; my $visual; my %h{Int} = first-run(@list, @result); say %h.perl if $debug; say "before second run Packing:", @result.perl if $debug; second-run(%h, @result); say "before loopy Packing:", @result.perl if $debug; loopy(%h, @result); say "after loopy" if $debug; try say "packing:", @result.».value if $debug; push-remaining(%h, @result); die unless num-remain(%h) == 0; say "Final packing:", @result.».value if $debug; @result; } sub test-it { my @list = init(); say compute-packing(@list); } sub push-remaining (%h, @result) { for %h.keys.sort(-*) -> $key { while exists-and-elems(%h, $key) { @result.push(%h{$key}.pop => $key); } } } sub loopy (%h, @result) { my $left; my $i; repeat while $left != [+] %h.values.».elems { $left = [+] %h.values.».elems; say "left: ", $left if $debug; say "First final-run" if $debug; final-run(%h, @result); say "Remaining: ", %h.perl if $debug; say "Packing:", @result.perl if $debug; $i++; say "thing", "$left {[+] %h.values.».elems}" if $debug; last if $left == 0; } } sub init { my $i = 0; my @list; for ^10 { @list.push($i++ => (1..8).pick) for ^5; } @list.push($i++ => 1) for ^10; @list.push($i++ => 15); @list; } sub first-run (@list, @result) { # First categorize everything divisible by the bs sub mapper(Pair $i) returns List { $i.value %% $bs ?? 'div' !! 'not-div', } my $a = categorize &mapper, @list; say "first run \$a: ", $a.perl if $debug; unless $a
:!exists { for $a
.flat { @result.push($_); } } my %h{Int}; unless $a:!exists { my $b = $a; # Make a hash whose keys are the bitwidth and hold an array of which items they # represent for $b.flat -> $pair { my $value = $pair.value; my $item = $pair.key; push %h{$value}, $item ; } } %h; } sub get-remain ($piece) { abs(abs($bs - $piece) - ($piece.Int div $bs) * $bs); } sub second-run (%h, @result) { # Start with the largest items for %h.keys.sort(-*) -> $key { # Find ones which are complement 6 and 2 for example, 3 and 3 my $a2 = get-remain($key); say "1 key $key a2 $a2" if $debug; while (%h{$key}:exists and %h{$key}.elems) and (%h{$a2}:exists and %h{$a2}.elems) { # For the case of 4 and 4, make sure we have at least 2 elems last if $key == $a2 and %h{$key}.elems < 2; my $p1 = %h{$key}.pop => $key; my $p2 = %h{$a2}.pop => $a2; @result.push($p1); @result.push($p2); } } } sub final-run (%h, @result) { my $tot = 0; for %h.keys.sort(-*) -> $key { next unless %h{$key}:exists and %h{$key}.elems; my $temp_tot = $tot + $key; my $pushed-yet = False; for %h.keys.sort(-*) -> $key2 { next unless %h{$key2}:exists and %h{$key2}.elems; while $temp_tot + $key2 <= 8 { last if $key == $key2 and %h{$key}.elems < 2; last if %h{$key2}.elems < 1; say "key[$key] key2 [$key2] temp_tot[$temp_tot] tot[$tot] tot + key2[{$tot + $key2}]" if $debug; unless $pushed-yet { @result.push((%h{$key}.pop orelse die $_) => $key); say "Pushing key $key" if $debug; $pushed-yet = True } @result.push((%h{$key2}.pop orelse die $_) => $key2); say "Pushing key2 $key2" if $debug; $temp_tot += $key2; $tot = $temp_tot; } } } } MoarVM-2018.03/tools/lib/Collation-Gram.pm60000644000175000017510000000240513237701105020345 0ustar samanthasamantha# Grammar to parse the UCA collation data grammar Collation-Gram { token TOP { \s* ';' \s* + .* } token codepoints { + % \s+ } token codepoint { <:AHex>+ #[$=(<:AHex>)\s+] } token comment { \s* '#' \s* <( .* $ } token coll-key { '[' ~ ']' [ '.' '.' ] } token dot-star { <[.*]> } token primary { <:AHex>+ } token secondary { <:AHex>+ } token tertiary { <:AHex>+ } } class Collation-Gram::Action { has @!array; has $!comment; has $!dot-star; has @!codepoints; method TOP ($/) { @!codepoints = @!codepoints.chrs.ords; make %( array => @!array, comment => ~$, codepoints => @!codepoints.chrs.ords ) } method coll-key ($/) { my $a = ($, $, $).map(*.Str.parse-base(16)).Array; $a.push: ($ eq '.' ?? 0 !! $ eq '*' ?? 1 !! do { die $ }); @!array.push: $a; } method codepoints ($/) { @!codepoints.append: $.map(*.Str.parse-base(16)); } } MoarVM-2018.03/tools/lib/MAST/.empty0000644000175000017510000000000013237701105017001 0ustar samanthasamanthaMoarVM-2018.03/tools/make-index.sh0000755000175000017510000000130113237701105016716 0ustar samanthasamantha#!/bin/bash # Adapted from script by 'Peter van der Does' on website stackoverflow.com # CC-by-SA # https://stackoverflow.com/questions/21395159/shell-script-to-create-a-static-html-directory-listing root="." echo "
    " DEPTH=1 files="$(find $root -maxdepth $DEPTH)" for file in $files; do parentpath="${file#*/}" parent="${parentpath%/*}" filename="${file##*/}" if [[ -z $oldparent ]]; then echo "
  • $parent
  • " && oldparent="$parent" echo "
      " elif [[ $oldparent != $parent ]]; then echo "
    " echo "
  • $parent
  • " && oldparent="$parent" echo " " echo "
" MoarVM-2018.03/tools/moar-gdb.py0000644000175000017510000007545213237701105016421 0ustar samanthasamantha# -*- coding: utf-8 -*- # GDB will automatically load this module when you attach to the binary moar. # but first you'll have to tell gdb that it's okay to load it. gdb will instruct # you on how to do that. # If it doesn't, you may need to copy or symlink this script right next to the # moar binary in install/bin. # # cd /path/to/install/bin # ln -s path/to/moarvm/tools/moar-gdb.py # If you're developing/extending/changing this script, or if you're getting # python exception messages, this command will be very helpful: # # set python print-stack full # This script contains a few helpers to make debugging MoarVM a bit more pleasant. # # So far, there's: # # - A semi-functional pretty-printer for MVMString and MVMString* # - A non-working pretty-printer for MVMObject in general # - A command "moar-heap" that walks the nursery and gen2 and displays # statistics about the REPRs found in them, as well as a display of # the fragmentation of the gen2 pages. # - A command "diff-moar-heap" that diffs (so far only) the two last # snapshots of the nursery, or whatever snapshot number you supply # as the argument. # Here's the TODO list: # # - Figure out if the string pretty-printer is hosed wrt. ropes or if # it's something wrong with MaarVM's ropes in general. # - Implement diffing for the gen2 in some sensible manner # - The backtrace should also display a backtrace of the interpreter # state. That's relatively easy, as you can just dump_backtrace(tc). # - Give the object prety printer a children method that figures # stuff out about attributes of a P6opaque, or CStruct. # - Let VMArray and MVMHash be displayed with the right display_hint # and also give them values for the children method # - Pretty print P6bigint as their value # - Pretty print P6int and P6num as their value # Here's some wishlist items # # - Offer an HTML rendering of the stats, since gdb insists on printing # a pager header right in between our pretty gen2 graphs most of the time import gdb from collections import defaultdict from itertools import chain import math import random #import blessings import sys import traceback # debugging # These are the flags from MVMString's body.flags str_t_info = {0: 'blob_32', 1: 'blob_ascii', 2: 'blob_8', 3: 'strands'} # How big to make the histograms and such PRETTY_WIDTH=50 # This must be kept in sync with your MoarVM binary, otherwise we'll end up # reading bogus data from the gen2 pages. MVM_GEN2_PAGE_ITEMS = 256 MVM_GEN2_BIN_BITS = 3 MVM_GEN2_BINS = 32 # This ought to give the same results as the equivalent code in gen2. def bucket_index_to_size(idx): return (idx + 1) << MVM_GEN2_BIN_BITS # This is the size the gen2 pictures should have, just so we don't have to # calculate the same sqrt of a constant over and over again. MVM_GEN2_PAGE_CUBE_SIZE = int(math.sqrt(MVM_GEN2_PAGE_ITEMS)) # If you'd like more precision for the REPR histogram in the gen2, and have a # bit of extra patience, turn this up. EXTRA_SAMPLES = 2 # This corresponds to the defines in MVMArray.h for MVMArrayREPRData.slot_type. array_storage_types = [ 'obj', 'str', 'i64', 'i32', 'i16', 'i8', 'n64', 'n32', 'u64', 'u32', 'u16', 'u8' ] # These are used to display the hilbert curves extra-prettily. halfblocks = u"█▀▄ ░▒▓" def shade_block(u, d): if u == d == True: return halfblocks[0] elif u == True and d == False: return halfblocks[1] elif u == False and d == True: return halfblocks[2] elif u == d == False: return halfblocks[3] elif u == d == None: return halfblocks[4] elif u == None and d == False or u == False and d == None: return halfblocks[5] elif u == None and d == True or u == True and d == None: return halfblocks[6] # Precalculate which index into the gen2 page goes at which coordinates in # our super pretty hilbert curve. def generate_hilbert(amount): hilbert_coords = [] # adapted from the english wikipedia article on the Hilbert Curve n = int(math.sqrt(amount)) def rot(s, x, y, rx, ry): if ry == 0: if rx == 1: x = s - 1 - x y = s - 1 - y return (y, x) return (x, y) def xy2d(x, y): rx = 0 ry = 0 d = 0 s = int(n / 2) while s > 0: rx = (x & s) > 0 ry = (y & s) > 0 d += s * s * ((3 * rx) ^ ry) (x, y) = rot(s, x, y, rx, ry) s = s // 2 return d for y in range(n): hilbert_coords.append([]) for x in range(n): hilbert_coords[-1].append(xy2d(x, y)) return hilbert_coords hilbert_coords = generate_hilbert(MVM_GEN2_PAGE_ITEMS) # Sizes are easier to read if they have .s in them. def prettify_size(num): rest = str(num) result = "" while len(rest) > 3: result = rest[-3:] + "." + result rest = rest[:-3] if len(rest) >= 1: result = rest + "." + result return result[:-1] class MVMStringPPrinter(object): """Whenever gdb encounters an MVMString or an MVMString*, this class gets instantiated and its to_string method tries its best to print out the actual contents of the MVMString's storage.""" def __init__(self, val, pointer = False): self.val = val self.pointer = pointer def stringify(self): stringtyp = str_t_info[int(self.val['body']['storage_type']) & 0b11] if stringtyp in ("blob_32", "blob_ascii", "blob_8"): zero_reached = False data = self.val['body']['storage'][stringtyp] i = 0 pieces = [] graphs = int(self.val['body']['num_graphs']) # XXX are the strings actually null-terminated, or do we have to # XXX check the graphs attribute? for i in range(graphs): pdata = int((data + i).dereference()) try: # ugh, unicode woes ... pieces.append(chr(pdata)) except: pieces.append("\\x%x" % pdata) return "".join(pieces) elif stringtyp == "strands": # XXX here be dragons and/or wrong code # XXX This is still true now # i = 0 # pieces = [] # data = self.val['body']['storage']['strands'] # end_reached = False # previous_index = 0 # previous_string = None # while not end_reached: # strand_data = (data + i).dereference() # if strand_data['blob_string'] == 0: # end_reached = True # pieces.append(previous_string[1:-1]) # else: # the_string = strand_data['blob_string'].dereference() # if previous_string is not None: # pieces.append( # str(previous_string)[1:-1][ # int(strand_data['start']) : # int(strand_data['end']) - previous_index] # ) # previous_string = str(the_string) # previous_index = int(strand_data['end']) # i = i + 1 # return "r(" + ")(".join(pieces) + ")" return None else: return "string of type " + stringtyp def to_string(self): result = self.stringify() if result: if self.pointer: return "pointer to '" + self.stringify() + "'" else: return "'" + self.stringify() + "'" else: return None # currently nonfunctional class MVMObjectPPrinter(object): def __init__(self, val, pointer = False): self.val = val self.pointer = pointer def stringify(self): if self.pointer: as_mvmobject = self.val.cast("MVMObject *").dereference() else: as_mvmobject = self.val.cast("MVMObject") _repr = as_mvmobject['st']['REPR'] reprname = _repr['name'].string() debugname = as_mvmobject['st']['debug_name'] return str(self.val.type.name) + " (" + debugname + ") of repr " + reprname def to_string(self): if self.pointer: return "pointer to " + self.stringify() else: return self.stringify() def show_histogram(hist, sort="value", multiply=False): """In the context of this function, a histogram is a hash from an object that is to be counted to the number the object was found. sort takes "value" or "key" and gives you the ability to either sort by "order of buckets" or by "frequency of occurence". when giving multiply a value, you'll get a display of key * value on the right of the histogram, useful for a "size of object" to "count of objects" histogram so you'll get a sum of the taken space The histogram will not include values that are less than 2, because that may sometimes lead to "long tail" trouble and buttloads of pages of output to scroll through.""" if len(hist) == 0: print("(empty histogram)") return if sort == "value": items = sorted(list(hist.items()), key = lambda vals: -vals[1]) elif sort == "key": items = sorted(list(hist.items()), key = lambda vals: vals[0]) else: print("sorting mode", sort, "not implemented") maximum = max(hist.values()) keymax = min(max([len(str(key)) for key in hist.keys()]), 30) lines_so_far = 0 group = -1 num_in_group = 0 for key, val in items: if lines_so_far < 50: try: str(key) except TypeError: key = repr(key) if val < 2: continue appendix = prettify_size(int(key) * int(val)).rjust(10) if multiply else "" print(str(key).ljust(keymax + 1), ("[" + "=" * int((float(hist[key]) / maximum) * PRETTY_WIDTH)).ljust(PRETTY_WIDTH + 1), str(val).ljust(len(str(maximum)) + 2), appendix) else: if val == group: num_in_group += 1 else: if num_in_group > 1: print(num_in_group, " x ", group) group = val num_in_group = 1 lines_so_far += 1 print() def diff_histogram(hist_before, hist_after, sort="value", multiply=False): """Works almost exactly like show_histogram, but takes two histograms that should have matching keys and displays the difference both in graphical form and as numbers on the side.""" max_hist = defaultdict(int) min_hist = defaultdict(int) zip_hist = {} max_val = 0 max_key = 0 longest_key = "" for k,v in chain(hist_before.items(), hist_after.items()): max_hist[k] = max(max_hist[k], v) min_hist[k] = min(max_hist[k], v) max_val = max(max_val, v) max_key = max(max_key, k) longest_key = str(k) if len(str(k)) > len(longest_key) else longest_key for k in max_hist.keys(): zip_hist[k] = (hist_before[k], hist_after[k]) if sort == "value": items = sorted(list(zip_hist.items()), key = lambda vals: -max(vals[1][0], vals[1][1])) elif sort == "key": items = sorted(list(zip_hist.items()), key = lambda vals: vals[0]) else: print("sorting mode", sort, "not implemented") for key, (val1, val2) in items: lv, rv = min(val1, val2), max(val1, val2) lc, rc = ("+", "-") if val1 > val2 else ("-", "+") bars = "[" \ + lc * int((float(lv) / max_val) * PRETTY_WIDTH) \ + rc * int((float(rv - lv) / max_val) * PRETTY_WIDTH) values = str(val1).ljust(len(str(max_val)) + 1) \ + " -> " \ + str(val2).ljust(len(str(max_val)) + 1) appendix = prettify_size(int(key) * int(val1)).rjust(10) \ + " -> " \ + prettify_size(int(key) * int(val2)).rjust(10) \ if multiply else "" print(str(key).ljust(len(longest_key) + 2), bars.ljust(PRETTY_WIDTH), values, appendix) class CommonHeapData(object): """This base class holds a bunch of histograms and stuff that are interesting regardless of wether we are looking at nursery objects or gen2 objects.""" number_objects = None number_stables = None number_typeobs = None size_histogram = None repr_histogram = None opaq_histogram = None arrstr_hist = None arrusg_hist = None string_histogram = None generation = None def __init__(self, generation): self.generation = generation self.size_histogram = defaultdict(int) self.repr_histogram = defaultdict(int) self.opaq_histogram = defaultdict(int) self.arrstr_hist = defaultdict(int) self.arrusg_hist = defaultdict(int) self.string_histogram = defaultdict(int) self.number_objects = 0 self.number_stables = 0 self.number_typeobs = 0 def analyze_single_object(self, cursor): """Given a pointer into the nursery or gen2 that points at the beginning of a MVMObject of any sort, run a statistical analysis of what the object is and some extra info depending on its REPR. To make this scheme work well with the nursery analysis, it returns the size of the object analysed.""" stooge = cursor.cast(gdb.lookup_type("MVMObjectStooge").pointer()) size = int(stooge['common']['header']['size']) flags = int(stooge['common']['header']['flags']) is_typeobj = flags & 1 is_stable = flags & 2 STable = stooge['common']['st'].dereference() if not is_stable: REPR = STable["REPR"] REPRname = REPR["name"].string() try: debugname = STable['debug_name'].string() except gdb.MemoryError: debugname = "n/a" if is_typeobj: self.number_typeobs += 1 else: self.number_objects += 1 else: REPR = None REPRname = "STable" debugname = "n/a" self.number_stables += 1 self.size_histogram[int(size)] += 1 if debugname != "n/a": self.repr_histogram[debugname] += 1 else: self.repr_histogram[REPRname] += 1 if REPRname == "P6opaque": self.opaq_histogram[int(size)] += 1 elif REPRname == "VMArray": slot_type = int(STable['REPR_data'].cast(gdb.lookup_type("MVMArrayREPRData").pointer())['slot_type']) self.arrstr_hist[array_storage_types[slot_type]] += 1 array_body = cursor.cast(gdb.lookup_type("MVMArray").pointer())['body'] if array_body['ssize'] == 0: usage_perc = "N/A" else: usage_perc = (int(array_body['elems'] * 10) / int(array_body['ssize'])) * 10 if usage_perc < 0 or usage_perc > 100: usage_perc = "inv" self.arrusg_hist[usage_perc] += 1 elif REPRname == "MVMString": try: casted = cursor.cast(gdb.lookup_type('MVMString').pointer()) stringresult = MVMStringPPrinter(casted).stringify() if stringresult is not None: self.string_histogram[stringresult] += 1 else: self.string_histogram["mvmstr@" + hex(int(cursor.address.cast(gdb.lookup_type("int"))))] += 1 except gdb.MemoryError as e: print(e) print(e.traceback()) print(cursor.cast(gdb.lookup_type('MVMString').pointer())) pass return size class NurseryData(CommonHeapData): """The Nursery Data contains the current position where we allocate as well as the beginning and end of the given nursery.""" allocation_offs = None start_addr = None end_addr = None def __init__(self, generation, start_addr, end_addr, allocation_offs): super(NurseryData, self).__init__(generation) self.start_addr = gdb.Value(start_addr) self.end_addr = gdb.Value(end_addr) self.allocation_offs = allocation_offs def analyze(self, tc): cursor = gdb.Value(self.start_addr) info_step = int(self.allocation_offs - cursor) // 50 next_info = cursor + info_step print("_" * 50) while cursor < self.allocation_offs: try: size = self.analyze_single_object(cursor) except: print("while trying to analyze single object:"); traceback.print_exc() print(stooge) print(stooge.__repr__()) cursor += size if cursor > next_info: next_info += info_step sys.stdout.write("-") sys.stdout.flush() print() def summarize(self): print("nursery state:") sizes = (int(self.allocation_offs - self.start_addr), int(self.end_addr - self.allocation_offs)) relsizes = [1.0 * size / (float(int(self.end_addr - self.start_addr))) for size in sizes] print("[" + "=" * int(relsizes[0] * 20) + " " * int(relsizes[1] * 20) + "] ", int(relsizes[0] * 100),"%") print(self.number_objects, "objects;", self.number_typeobs, " type objects;", self.number_stables, " STables") print("sizes of objects/stables:") show_histogram(self.size_histogram, "key", True) print("sizes of P6opaques only:") show_histogram(self.opaq_histogram, "key", True) print("debugnames:") show_histogram(self.repr_histogram) print("VMArray storage types:") show_histogram(self.arrstr_hist) print("VMArray usage percentages:") show_histogram(self.arrusg_hist, "key") print("strings:") show_histogram(self.string_histogram) def diff(self, other): print("nursery state --DIFF--:") print("sizes of objects/stables:") diff_histogram(self.size_histogram, other.size_histogram, "key", True) print("sizes of P6opaques only:") diff_histogram(self.opaq_histogram, other.opaq_histogram, "key", True) print("debugnames:") diff_histogram(self.repr_histogram, other.repr_histogram) print("VMArray storage types:") diff_histogram(self.arrstr_hist, other.arrstr_hist) print("VMArray usage percentages:") diff_histogram(self.arrusg_hist, other.arrusg_hist, "key") class Gen2Data(CommonHeapData): """One Gen2Data instance gets created per size class. Thus, every instance corresponds to an exact size of object. The class also handles the free list that is chained through the gen2, so that fragmentation can be determined and stale objects not sampled for analysis.""" size_bucket = None length_freelist = None bucket_size = None g2sc = None page_addrs = None pagebuckets = None empty = False cur_page = 0 repr_histogram = None size_histogram = None def sizes(self): # XXX this ought to return a tuple with the sizes we # accept in this bucket return bucket_index_to_size(self.size_bucket), bucket_index_to_size(self.size_bucket + 1) - 1 def __init__(self, generation, gen2sizeclass, size_bucket): super(Gen2Data, self).__init__(generation) self.size_bucket = size_bucket self.g2sc = gen2sizeclass self.bucket_size = bucket_index_to_size(self.size_bucket) self.repr_histogram = defaultdict(int) self.size_histogram = defaultdict(int) def analyze(self, tc): if int(self.g2sc['pages'].cast(gdb.lookup_type("int"))) == 0: self.empty = True return pagebuckets = [[True for i in range(MVM_GEN2_PAGE_ITEMS)] for i in range(int(self.g2sc['num_pages']))] page_addrs = [] self.page_addrs = page_addrs self.pagebuckets = pagebuckets self.cur_page = int(self.g2sc['cur_page']) # we need to make sure we don't accidentally run into free_list'd slots # that's why we just collect addresses up front and sample them later on. sample_stooges = [] page_cursor = self.g2sc['pages'] for page_idx in range(int(self.g2sc['num_pages'])): # collect the page addresses so that we can match arbitrary # pointers to page index/bucket index pairs later on. page_addrs.append(page_cursor.dereference()) if page_idx == self.cur_page: # XXX cur_page is going to be removed from MoarVM, as it's only # XXX needed for this exact code here. # if the page we're looking at is the "current" page, we look # at the alloc_pos to find out where allocated objects stop. alloc_bucket_idx = int(int(self.g2sc['alloc_pos'] - page_cursor.dereference()) // self.bucket_size) pagebuckets[page_idx][alloc_bucket_idx:] = [False] * (MVM_GEN2_PAGE_ITEMS - alloc_bucket_idx) elif page_idx > self.cur_page: # if we're past the page we're currently allocating in, the # pages are empty by definition alloc_bucket_idx = 0 pagebuckets[page_idx] = [False] * MVM_GEN2_PAGE_ITEMS else: # otherwise, the whole page is potentially allocated objects. alloc_bucket_idx = MVM_GEN2_PAGE_ITEMS # sample a few objects for later analysis (after free list checking) samplecount = int(min(MVM_GEN2_PAGE_CUBE_SIZE * EXTRA_SAMPLES, alloc_bucket_idx // 4)) samples = sorted(random.sample(range(0, alloc_bucket_idx), samplecount)) for idx in samples: stooge = (page_cursor.dereference() + (idx * self.bucket_size)).cast(gdb.lookup_type("MVMObjectStooge").pointer()) sample_stooges.append((stooge, page_idx, idx)) page_cursor += 1 # now punch holes in our page_buckets free_cursor = self.g2sc['free_list'] def address_to_page_and_bucket(addr): for idx, base in enumerate(page_addrs): end = base + self.bucket_size * MVM_GEN2_PAGE_ITEMS if base <= addr < end: return idx, int((addr - base) // self.bucket_size) self.length_freelist = 0 while free_cursor.cast(gdb.lookup_type("int")) != 0: if free_cursor.dereference().cast(gdb.lookup_type("int")) != 0: result = address_to_page_and_bucket(free_cursor.dereference()) if result: page, bucket = result pagebuckets[page][bucket] = False self.length_freelist += 1 free_cursor = free_cursor.dereference().cast(gdb.lookup_type("char").pointer().pointer()) print("") #doubles = defaultdict(int) # now we can actually sample our objects for stooge, page, idx in sample_stooges: if pagebuckets[page][idx] != True: continue try: size = self.analyze_single_object(stooge) except Exception as e: print("while trying to analyze single object:"); traceback.print_exc() print(stooge) print(stooge.__repr__()) #if len(doubles) > 10: #show_histogram(doubles) def summarize(self): print("size bucket:", self.bucket_size) if self.empty: print("(unallocated)") return cols_per_block = int(math.sqrt(MVM_GEN2_PAGE_ITEMS)) lines_per_block = cols_per_block // 2 outlines = [[] for i in range(lines_per_block + 1)] break_step = PRETTY_WIDTH // (lines_per_block + 1) next_break = break_step pgct = 0 fullpages = 0 drawn = False for pgnum, page in enumerate(self.pagebuckets): if pgnum > self.cur_page: break if not all(page) and any(page): # hacky "take two at a time" for outline, (line, nextline) in enumerate(zip(*[iter(hilbert_coords)] * 2)): for idx, (upper, lower) in enumerate(zip(line, nextline)): upper, lower = page[upper], page[lower] outlines[-lines_per_block + outline].append(shade_block(upper, lower)) outlines[-lines_per_block - 1].append(str(str(pgnum + 1) + "st pg").center(cols_per_block) + " ") pgct += 1 drawn = True else: fullpages += 1 drawn = False if pgct > next_break: outlines.extend([[] for i in range(lines_per_block + 2)]) next_break += break_step elif pgnum != self.cur_page and drawn: for line_num in range(lines_per_block): outlines[-line_num - 1].append(" ") print((u"\n".join(map(lambda l: u"".join(l), outlines)))) if fullpages > 0: print("(and", fullpages, "completely filled pages)",) if self.cur_page < len(self.pagebuckets): print("(and", (len(self.pagebuckets) - self.cur_page + 1), "empty pages)",) if self.length_freelist > 0: print("(freelist with", self.length_freelist, "entries)",) print("") # does the allocator/copier set the size of the object to the exact bucket size # automatically? if len(self.size_histogram) > 1: print("sizes of objects/stables:") try: show_histogram(self.size_histogram, "key", True) except Exception as e: print("while trying to show the size histogram...") print(e) print(e.traceback()) if len(self.repr_histogram) >= 1: print("debugnames:") try: show_histogram(self.repr_histogram) except Exception as e: print("while trying to show the repr histogram...") print(e) print("strings:") show_histogram(self.string_histogram) class OverflowData(CommonHeapData): def analyze(self, tc): g2a = tc['gen2'] num_overflows = g2a["num_overflows"] print(num_overflows) try: for of_idx in range(num_overflows): of_obj = g2a["overflows"][of_idx] self.analyze_single_object(of_obj) except: print("error while analyze_single_object or something"); def summarize(self): print("overflows in the gen2") print(self.number_objects, "objects;", self.number_typeobs, " type objects;", self.number_stables, " STables") print("sizes of objects/stables:") show_histogram(self.size_histogram, "key", True) print("sizes of P6opaques only:") show_histogram(self.opaq_histogram, "key", True) print("debugnames:") show_histogram(self.repr_histogram) print("VMArray storage types:") show_histogram(self.arrstr_hist) print("VMArray usage percentages:") show_histogram(self.arrusg_hist, "key") print("strings:") show_histogram(self.string_histogram) class HeapData(object): run_nursery = None run_gen2 = None generation = None nursery_memory = [] class AnalyzeHeapCommand(gdb.Command): """Analyze the nursery and gen2 of MoarVM's garbage collector corresponding to the current tc, or the tc you pass as the first argument""" def __init__(self): super(AnalyzeHeapCommand, self).__init__("moar-heap", gdb.COMMAND_DATA) def invoke(self, arg, from_tty): tc = gdb.selected_frame().read_var(arg if arg else "tc") if not str(tc.type).startswith("MVMThreadContext"): raise ValueError("Please invoke the heap analyzer command on a MVMThreadContext, usually tc.") try: # find out the GC generation we're in (just a number increasing by 1 every time we GC) instance = tc['instance'] generation = instance['gc_seq_number'] nursery = NurseryData(generation, tc['nursery_tospace'], tc['nursery_alloc_limit'], tc['nursery_alloc']) nursery.analyze(tc) nursery_memory.append(nursery) print("the current generation of the gc is", generation) sizeclass_data = [] for sizeclass in range(MVM_GEN2_BINS): g2sc = Gen2Data(generation, tc['gen2']['size_classes'][sizeclass], sizeclass) sizeclass_data.append(g2sc) g2sc.analyze(tc) overflowdata = OverflowData(generation) overflowdata.analyze(tc) for g2sc in sizeclass_data: g2sc.summarize() nursery.summarize() overflowdata.summarize() except KeyboardInterrupt: print("aborted the analysis.") class DiffHeapCommand(gdb.Command): """Display the difference between two snapshots of the nursery.""" def __init__(self): super(DiffHeapCommand, self).__init__("diff-moar-heap", gdb.COMMAND_DATA) def invoke(self, arg, from_tty): if arg != "": if " " in arg: pos1, pos2 = map(int, arg.split(" ")) else: pos1, pos2 = int(arg), int(arg - 1) else: pos1 = -1 pos2 = -2 assert len(nursery_memory) > max(pos1, pos2) nursery_memory[pos2].diff(nursery_memory[pos1]) def str_lookup_function(val): if str(val.type) == "MVMString": return MVMStringPPrinter(val) elif str(val.type) == "MVMString *": return MVMStringPPrinter(val, True) return None def mvmobject_lookup_function(val): pointer = str(val.type).endswith("*") if str(val.type).startswith("MVM"): try: val.cast(gdb.lookup_type("MVMObject" + (" *" if pointer else ""))) return MVMObjectPPrinter(val, pointer) except Exception as e: print("couldn't cast this:", e) pass return None def register_printers(objfile): objfile.pretty_printers.append(str_lookup_function) print("MoarVM string pretty printer registered") # XXX since this is currently nonfunctional, just ignore it for now # objfile.pretty_printers.append(mvmobject_lookup_function) # print("MoarVM Object pretty printer registered") commands = [] def register_commands(objfile): commands.append(AnalyzeHeapCommand()) print("moar-heap registered") commands.append(DiffHeapCommand()) print("diff-moar-heap registered") # We have to introduce our classes to gdb so that they can be used if __name__ == "__main__": the_objfile = gdb.current_objfile() if the_objfile == None: the_objfile = gdb.lookup_objfile("libmoar.so") register_printers(the_objfile) register_commands(the_objfile) MoarVM-2018.03/tools/moarvm.org_releases.pl0000755000175000017510000001126613243116442020663 0ustar samanthasamantha#!/usr/bin/env perl use strict; use warnings; use utf8; use feature qw(unicode_strings say); use English '-no_match_vars'; binmode STDOUT, ':encoding(UTF-8)'; binmode STDERR, ':encoding(UTF-8)'; use Text::Markdown 'markdown'; sub slurp { my ($filename) = @_; local $INPUT_RECORD_SEPARATOR = undef; open my $fh, '<', $filename; binmode $fh, ':encoding(UTF-8)'; return <$fh>; } sub main { my $ChangeLog = slurp 'docs/ChangeLog'; $ChangeLog =~ s/(^\s*[^+].*?:\n[ ]*)([+])/$1\n$2/xmsg; say beginning_text() . process_changelog(html_escape($ChangeLog)) . end_text(); } main(); sub process_changelog { my ($in) = @_; my @release_html; # Extracts the text from the 'New in XXXX.XX' to the next 'New in XXXX.XX' # if there are no 'New in' left it extracts to the end of the document. while ($in =~ s/(New in ([\d.]+)(.*?))(New in [\d.]+|$)/$4/s) { my $sec = $3; my $release = $2; print STDERR "$release\n"; my $md_obj = Text::Markdown->new; my $mid = $md_obj->markdown($sec); my $start = <<"END";

$release

END my $end = <<"END";

Download

END my $html = start_enclosing_text($release) . $mid . end_enclosing_text($release); push @release_html, $html; } return join '', @release_html; } # Escapes &, < and > for html sub html_escape { my ($text) = @_; $text =~ s/[&]/&/g; $text =~ s/[<]/</g; $text =~ s/[>]/>/g; return $text; } # The text comes before every version sub start_enclosing_text { my ($release) = @_; my $start = <<"END";

$release

END return $start; } # This text comes after every version sub end_enclosing_text { my ($release) = @_; my $end = <<"END";

Download

END return $end; } # This text begins the html document (only used once). sub beginning_text { <<'END'; MoarVM - A VM for NQP and Rakudo Perl 6
Fork me on GitHub END } # This text ends the html document (only used once). sub end_text { <<'END';
END } MoarVM-2018.03/tools/parse_coverage_report.p60000644000175000017510000003347613237701105021206 0ustar samanthasamanthause v6; sub MAIN( Str $coverage where *.IO.e, # full-cover Str $source where *.IO.e, # gen/moar/CORE.setting Str :$annotations, # setting ) { my (%annotations, %covered-lines) := |await (start get-annotations-from $annotations), start get-coverage-from $coverage; my (%all, %stats is BagHash, $current-file, @lines, int $i); for $source.IO.lines -> $line { $i++; when $line.starts-with: '#line 1 SETTING::src' { $current-file andthen %all{$_} = process-stats %(|%stats), @lines andthen create-coverage-file $_, @lines; %stats = file => $current-file = $line.words.tail; @lines = (); $i = 0; } @lines.push: $_ => $line with do with $current-file { when so %covered-lines{$_}{~$i} { %stats++; 'c' } when so %annotations{$_}{~$i} { %stats++; 'u' } %stats++; 'i'; } } # also build a little overview page with "coverage/index.html".IO.open(:w) -> $outfile { LEAVE $outfile.close; $outfile.say: Q:c:to/TMPL/; coverage overview for {$source} {$*css} TMPL $outfile.say: Q:to/TMPL/; TMPL for %all.sort { my $name = .key; my $v = .value; $outfile.say: qq:to/TMPL/; TMPL } $outfile.say: Q:to/TMPL/;
Filename Covered Percentage Uncovered Ignored Total
$name $v $v% $v $v $v
TMPL } spurt 'coverage/tablesort.js', $*tablesort; spurt 'coverage/tablesort.number.js', $*tablesort-number; } sub process-stats ($_, @lines) { . = ..subst(:g, /\W/, '_') ~ ".coverage.html"; . = +@lines.grep: *.key eq 'c'; . = +@lines.grep: *.key eq 'u'; . = +@lines.grep: *.key eq 'i'; . = . + . + .; with . + . -> $all { . = ($all == 0 ?? 0 !! 100 * . / $all).round: .01 } $_ } sub create-coverage-file (%stats, @lines) { with "coverage/%stats".IO { .spurt: join "\n", Q:h:to/TMPL/, coverage report for %stats<file>
    TMPL @lines.map({ '
  1. ' ~ .value.trans: ['<'] => ['<'] }), '
'; note "Wrote $_"; } } multi get-annotations-from (Any:D $ann where .?IO.e) { note "Analyzing annotations file $ann"; my %annotations .= push: $ann.IO.lines.grep( *.starts-with: ' annotation: SETTING::' ).map(*.substr: chars ' annotation: ').map: { # filename => line number substr($_, 0, rindex($_, ':') ) => substr($_, rindex($_, ':')+1) } note "Done analyzing annotations file: { %annotations{*;}».elems.sum } lines found"; %annotations».Set } multi get-annotations-from ($ann) { note Q:c:to/END/; No annotations file { $ann ?? "found at $ann" !! "supplied" }. This tool relies on a file generated with moar --dump foobar.moarvm that contains annotations for every line that can potentially be hit END % } sub get-coverage-from($file) { note "Reading coverage report from $file"; my %coverage .= push: $file.IO.lines.grep(*.starts-with: 'HIT').map: { .[1] => .[2] with .words # filename => line number } note "Coverage report read: {%coverage{*;}».elems.sum} lines covered."; %coverage».Set } my $*css = q:to/CSS/; CSS my $*tablesort = q:to/TABLESORT/; /*! * tablesort v4.0.1 (2016-03-30) * http://tristen.ca/tablesort/demo/ * Copyright (c) 2016 ; Licensed MIT */! (function() { function Tablesort(el, options) { if (!(this instanceof Tablesort)) return new Tablesort(el, options); if (!el || el.tagName !== 'TABLE') { throw new Error('Element must be a table'); } this.init(el, options || {}); } var sortOptions = []; var createEvent = function(name) { var evt; if (!window.CustomEvent || typeof window.CustomEvent !== 'function') { evt = document.createEvent('CustomEvent'); evt.initCustomEvent(name, false, false, undefined); } else { evt = new CustomEvent(name); } return evt; }; var getInnerText = function(el) { return el.getAttribute('data-sort') || el.textContent || el.innerText || ''; }; // Default sort method if no better sort method is found var caseInsensitiveSort = function(a, b) { a = a.toLowerCase(); b = b.toLowerCase(); if (a === b) return 0; if (a < b) return 1; return -1; }; // Stable sort function // If two elements are equal under the original sort function, // then there relative order is reversed var stabilize = function(sort, antiStabilize) { return function(a, b) { var unstableResult = sort(a.td, b.td); if (unstableResult === 0) { if (antiStabilize) return b.index - a.index; return a.index - b.index; } return unstableResult; }; }; Tablesort.extend = function(name, pattern, sort) { if (typeof pattern !== 'function' || typeof sort !== 'function') { throw new Error('Pattern and sort must be a function'); } sortOptions.push({ name: name, pattern: pattern, sort: sort }); }; Tablesort.prototype = { init: function(el, options) { var that = this, firstRow, defaultSort, i, cell; that.table = el; that.thead = false; that.options = options; if (el.rows && el.rows.length > 0) { if (el.tHead && el.tHead.rows.length > 0) { firstRow = el.tHead.rows[el.tHead.rows.length - 1]; that.thead = true; } else { firstRow = el.rows[0]; } } if (!firstRow) return; var onClick = function() { if (that.current && that.current !== this) { that.current.classList.remove('sort-up'); that.current.classList.remove('sort-down'); } that.current = this; that.sortTable(this); }; // Assume first row is the header and attach a click handler to each. for (i = 0; i < firstRow.cells.length; i++) { cell = firstRow.cells[i]; if (!cell.classList.contains('no-sort')) { cell.classList.add('sort-header'); cell.tabindex = 0; cell.addEventListener('click', onClick, false); if (cell.classList.contains('sort-default')) { defaultSort = cell; } } } if (defaultSort) { that.current = defaultSort; that.sortTable(defaultSort); } }, sortTable: function(header, update) { var that = this, column = header.cellIndex, sortFunction = caseInsensitiveSort, item = '', items = [], i = that.thead ? 0 : 1, sortDir, sortMethod = header.getAttribute('data-sort-method'), sortOrder = header.getAttribute('data-sort-order'); that.table.dispatchEvent(createEvent('beforeSort')); // If updating an existing sort `sortDir` should remain unchanged. if (update) { sortDir = header.classList.contains('sort-up') ? 'sort-up' : 'sort-down'; } else { if (header.classList.contains('sort-up')) { sortDir = 'sort-down'; } else if (header.classList.contains('sort-down')) { sortDir = 'sort-up'; } else if (sortOrder === 'asc') { sortDir = 'sort-down'; } else if (sortOrder === 'desc') { sortDir = 'sort-up'; } else { sortDir = that.options.descending ? 'sort-up' : 'sort-down'; } header.classList.remove(sortDir === 'sort-down' ? 'sort-up' : 'sort-down'); header.classList.add(sortDir); } if (that.table.rows.length < 2) return; // If we force a sort method, it is not necessary to check rows if (!sortMethod) { while (items.length < 3 && i < that.table.tBodies[0].rows.length) { item = getInnerText(that.table.tBodies[0].rows[i].cells[column]); item = item.trim(); if (item.length > 0) { items.push(item); } i++; } if (!items) return; } for (i = 0; i < sortOptions.length; i++) { item = sortOptions[i]; if (sortMethod) { if (item.name === sortMethod) { sortFunction = item.sort; break; } } else if (items.every(item.pattern)) { sortFunction = item.sort; break; } } that.col = column; for (i = 0; i < that.table.tBodies.length; i++) { var newRows = [], noSorts = {}, j, totalRows = 0, noSortsSoFar = 0; if (that.table.tBodies[i].rows.length < 2) continue; for (j = 0; j < that.table.tBodies[i].rows.length; j++) { item = that.table.tBodies[i].rows[j]; if (item.classList.contains('no-sort')) { // keep no-sorts in separate list to be able to insert // them back at their original position later noSorts[totalRows] = item; } else { // Save the index for stable sorting newRows.push({ tr: item, td: getInnerText(item.cells[that.col]), index: totalRows }); } totalRows++; } // Before we append should we reverse the new array or not? // If we reverse, the sort needs to be `anti-stable` so that // the double negatives cancel out if (sortDir === 'sort-down') { newRows.sort(stabilize(sortFunction, true)); newRows.reverse(); } else { newRows.sort(stabilize(sortFunction, false)); } // append rows that already exist rather than creating new ones for (j = 0; j < totalRows; j++) { if (noSorts[j]) { // We have a no-sort row for this position, insert it here. item = noSorts[j]; noSortsSoFar++; } else { item = newRows[j - noSortsSoFar].tr; } // appendChild(x) moves x if already present somewhere else in the DOM that.table.tBodies[i].appendChild(item); } } that.table.dispatchEvent(createEvent('afterSort')); }, refresh: function() { if (this.current !== undefined) { this.sortTable(this.current, true); } } }; if (typeof module !== 'undefined' && module.exports) { module.exports = Tablesort; } else { window.Tablesort = Tablesort; } })(); TABLESORT my $*tablesort-number = q:to/TABLESORT-NUMBER/; (function(){ var cleanNumber = function(i) { return i.replace(/[^\-?0-9.]/g, ''); }, compareNumber = function(a, b) { a = parseFloat(a); b = parseFloat(b); a = isNaN(a) ? 0 : a; b = isNaN(b) ? 0 : b; return a - b; }; Tablesort.extend('number', function(item) { return item.match(/^-?[£\x24Û¢´€]?\d+\s*([,\.]\d{0,2})/) || // Prefixed currency item.match(/^-?\d+\s*([,\.]\d{0,2})?[£\x24Û¢´€]/) || // Suffixed currency item.match(/^-?(\d)*-?([,\.]){0,1}-?(\d)+([E,e][\-+][\d]+)?%?$/); // Number }, function(a, b) { a = cleanNumber(a); b = cleanNumber(b); return compareNumber(b, a); }); }()); TABLESORT-NUMBER # vim: ft=perl6 expandtab sw=4 MoarVM-2018.03/tools/parse_jitgraph.p60000644000175000017510000003064313242626641017630 0ustar samanthasamanthause lib $?FILE.IO.parent.child("lib"); use MAST::Ops; role CLanguageBase { regex ws { :r [ | \s+ | '//' \N* \n | [ '/*' [<-[*]>+ || '*']* '*/' ] ]* [ | $ ] } regex curly_block { '{' [ | \s+ | | <-[ { ]>+ ]* '}' } } # Easiest thing first: op_to_func sub parse_op_to_func($source) { grammar OpToFuncGrammar does CLanguageBase { rule TOP { op_to_func '(' MVMThreadContext '*' tc ',' MVMint16 ')' '{' # introduction 'switch(' $=[<[a..z A..Z 0..9 _]>+] ')' '{' + default ':' [\N*\n]*? '}' .* } rule entry { [ case MVM_OP_$=[<[a..z A..Z 0..9 _]>+ ] ':' ]+ return '&'? ';' { note "parsed an entry for $" } } } my $cut_off_source = $source.substr($source.index("op_to_func\(MVMThreadContext")); my $op_func_table = OpToFuncGrammar.parse($cut_off_source); note "parsed"; my %result; for $op_func_table.list -> $/ { %result{$>>.Str} = $.Str xx *; } return %result; } sub parse_consume_ins_reprops($source, %opcode_to_cfunc) { # first, we'll cut the relevant sections of the source out: # the part of jgb_consume_reprop after the type-specialized parts # and then all of jgb_consume_ins my @sourcelines = $source.lines; @sourcelines .= grep({ / "couldn't be devirtualized" | " jgb_consume_ins" / ^ff^ / "default:" / }); @sourcelines .= grep({ $_ !~~ / ^ \s* '/*' .*? '*/' \s* $ / }); @sourcelines .= grep({ $_ !~~ / ^ \s* $ / }); # chunkify based on case: and break; # we are a very simple parser so if we find a break that's not followed # by a new case (or a "}") we just skip ahead until we see the next case. my @chunks = gather loop { # find the first non-case line. my $until = @sourcelines.first({ $_ !~~ / "case MVM_".*?':' / }, :k); my @case-lines = @sourcelines[^$until]; @sourcelines.shift for ^$until; # we'll put all case statements into a single string for easier combing my $casestring = [~] @case-lines; my @ops = $casestring.comb(/ "case " \s* 'MVM_OP_'<( .*? )> \s* ':' /); # find the next case-line. $until = @sourcelines.first( / "case MVM_".*?':' /, :k ); $until = +@sourcelines unless $until; # may have to slurp until EOF. my @implementationlines = @sourcelines[^$until]; @sourcelines.shift for ^$until; take @ops => @implementationlines; last unless @sourcelines; } # collect everything we've bailed on my @skipped_opcodes; # also collect everything we've had success with my @success_opcodes; chunkloop: for @chunks.kv -> $chunkidx, $_ { my @ops = .key.list; my @lines = .value.list; # what C variable refers to what piece of the op in the code my %var_sources; # do we have something to read out of a register or a # constant or something like that? my %reg_types; # what arguments do we push to the C stack for this? my @c_arguments; # keep lines in case we abort somewhere. my @lines_so_far; # put this outside of the while loop for the report error sub my $line; sub report_unhandled($reason?) { note ""; note "============="; note "handling @ops.join(', ')"; if $reason { note ""; note $reason; note ""; } .note for @lines_so_far; note $line; note ""; @skipped_opcodes.push: @ops.join(", "); next chunkloop; } # we expect the chunk to begin with some setup: # initialise local variables with # register numbers # literal numbers, a string index, ... while @lines { last if @lines[0] !~~ / ^ \s+ [MVMint|MVMuint] /; while ($line = @lines.shift) ~~ m:s/^ [MVMint|MVMuint][16|32|64] '=' 'ins->operands[' $=[\d+] ']' [ | $=".reg.orig" | $=".lit_str_idx" | $=[".lit_i16"|".lit_i64"] ] / { @lines_so_far.push: "var_source: $line"; %var_sources{$.Str} = $.Int; %reg_types{$.Int} = ( $ ?? 'register' !! $ ?? 'str_idx' !! $ ?? 'literal' !! die "kind of operand source not defined: $/.perl()"); } unless $line ~~ m:s/ MVMJitCallArg / { report_unhandled "this line surprised us (expected MVMJitCallArg):"; } # since we consume the line in the condition for the coming # loop, but we want to handle this current line there as well, # we just unshift it into the lines array again ... @lines.unshift($line); while ($line = @lines.shift) ~~ m:s/ ^ [MVMJitCallArg args"[]" "=" '{']? [ | '{' ',' [ '{' '}' | ] | '{' $="MVM_JIT_LITERAL" ',' [ | '{' $=[\d+] '}' | '{' op '==' MVM_OP_ '}' ] ] [ '}' '}' ';' | '}' ',' ] $ / { #say $/; given $.Str { when "MVM_JIT_INTERP_VAR" { given $ { when "MVM_JIT_INTERP_TC" { @c_arguments.push: "(carg (tc) ptr)"; } when "MVM_JIT_INTERP_CU" { @c_arguments.push: "(carg (cu) ptr)"; } when "MVM_JIT_INTERP_FRAME" { @c_arguments.push: "(carg (frame) ptr)"; } when "MVM_JIT_INTERP_PARAMS" { @c_arguments.push: "(carg (^params) ptr)"; } when "MVM_JIT_INTERP_CALLER" { @c_arguments.push: "(carg (^caller) ptr)"; } default { report_unhandled "this kind of interp var ($_) isn't handled yet"; } } } when "MVM_JIT_REG_VAL" { # later on: figure out if it's a str/obj or an # int register that the op(s) take here. @c_arguments.push: '(carg $' ~ %var_sources{$.Str} ~ " int)"; } when "MVM_JIT_REG_VAL_F" { @c_arguments.push: '(carg $' ~ %var_sources{$.Str} ~ " num)"; } when "MVM_JIT_REG_ADDR" { my %result; my $operand_idx = %var_sources{$.Str}; for @ops -> $op { my $op_number = %codes{$op}; my $op_values_offset = @offsets[$op_number]; my $operand_flags = @values[$op_values_offset] + $operand_idx; my $operand_rw_flags = $operand_flags +& %flags; if $operand_rw_flags == %flags { %result{$op} = '(carg $' ~ $operand_idx ~ ' ptr)'; } else { report_unhandled "there's a MVM_JIT_REG_ADDR here, but the operand isn't a MVM_operand_write_reg (it's $operand_rw_flags instead)."; } } if [eq] %result.values { @c_arguments.push: %result.values[0]; } else { @c_arguments.push: %result; } } when "MVM_JIT_LITERAL" { if defined try $.Int { @c_arguments.push: '(carg (const ' ~ $.Int ~ ' int_sz) int)'; } elsif $ { my %result; for @ops -> $op { %result{$op} = +($op eq $); } @c_arguments.push: %result; } elsif $.Str ~~ %var_sources { my $source_register = %var_sources{$.Str}; if %reg_types{$source_register} eq 'literal' { @c_arguments.push: '(carg (copy $' ~ $source_register ~ ') int)'; } else { report_unhandled "expected $.Str() (from $source_register) to be declared as literal"; } } else { report_unhandled "didn't understand this kind of MVM_JIT_LITERAL."; } } default { report_unhandled "this line surprised us (expected jg_append_call_c):"; } } @lines_so_far.push: "c_args: $line"; } $line = $line ~ @lines.shift unless $line ~~ m/ ';' $ /; unless $line ~~ m:s/ jg_append_call_c '(' tc ',' jgb '->' graph ',' op_to_func '(' tc ',' op ')' ',' \d+ ',' args ',' $=[ MVM_JIT_RV_VOID | MVM_JIT_RV_INT | MVM_JIT_RV_PTR | MVM_JIT_RV_NUM ] ',' $=[ '-1' | <.ident> ] ')' ';' / { report_unhandled "this line surprised us (expected jg_append_call_c):"; } my %rv_to_returnkind = ( MVM_JIT_RV_VOID => 'void', MVM_JIT_RV_INT => 'int', MVM_JIT_RV_PTR => 'ptr', MVM_JIT_RV_NUM => 'num', ); for @ops -> $opname { note %opcode_to_cfunc{$opname} ~ " going to have a template built for it"; say "(template: $opname"; say " (call (^func {%opcode_to_cfunc{$opname}})"; say " (arglist {+@c_arguments}"; for @c_arguments -> $carg { if $carg ~~ Associative { say " $carg{$opname}"; } else { say " $carg"; } } say " )"; say " " ~ %rv_to_returnkind{$}; say " ) )"; say ""; @success_opcodes.push: $opname; } } } note "all successfully parsed opcodes:"; note " + $_" for @success_opcodes; note ""; note "all skipped operations:"; note " - $_" for @skipped_opcodes; } sub MAIN($graph_c_file? is copy) { $graph_c_file //= $?FILE.IO.parent.parent.child("src").child("jit").child("graph.c"); my $graph_c_source = slurp($graph_c_file); note "got the source"; my %opcode_to_cfunc = parse_op_to_func($graph_c_source); parse_consume_ins_reprops($graph_c_source, %opcode_to_cfunc); } MoarVM-2018.03/tools/release.sh0000755000175000017510000000065613253601110016321 0ustar samanthasamantha#!/bin/sh VERSION=$1 exec >MANIFEST echo MANIFEST git ls-files | perl -ne "print unless /^3rdparty\/\w+$/" for submod in 3rdparty/dyncall/ 3rdparty/libuv/ 3rdparty/dynasm/ 3rdparty/libtommath/ 3rdparty/cmp/; do cd $submod git ls-files | perl -pe "s{^}{$submod}" cd ../..; done [ -d MoarVM-$VERSION ] || ln -s . MoarVM-$VERSION perl -pe "s{^}{MoarVM-$VERSION/}" MANIFEST | tar zc -T - -f MoarVM-$VERSION.tar.gz rm MoarVM-$VERSION MoarVM-2018.03/tools/sexpr.pm0000644000175000017510000000500013237701105016034 0ustar samanthasamanthapackage sexpr; use strict; use warnings; # declare keyword syntax regex my $tokenize = qr/ \A (?\() | (?\)) | (?\s+) | (?\#.+) | (?\".*?") | (?[^\s\(\)\#"']+) /x; sub parser { my ($class, $input) = @_; return bless { input => $input, buffer => '', token => undef, match => undef, macros => {}, }, $class; } sub empty { my $self = shift; length($self->{buffer}) == 0 and eof($self->{input}); } sub current { my $self = shift; unless (length($self->{buffer}) or eof($self->{input})) { $self->{buffer} = readline($self->{input}); } $self->{buffer}; } sub token { my $self = shift; my $line = $self->current; # cache token return @$self{'token','match'} if $self->{token}; return unless length($line); return unless $line =~ $tokenize; @$self{'token','match'} = %+; } sub _shift { my ($self) = @_; my $length = length($self->{match}); @$self{'token','match'} = (undef,undef); substr($self->{buffer}, 0, $length, ''); } sub expect { my ($self, $expect) = @_; my ($token, $match) = $self->token; die "Got $token but expected $expect" unless $expect eq $token; $self->_shift; } sub peek { my ($self, $expect) = @_; my ($token, $match) = $self->token or return; return $match if $token eq $expect; } sub skip { my ($self, @possible) = @_; my %check = map { $_ => 1 } @possible; while (my ($token, $match) = $self->token) { last unless $check{$token}; $self->_shift; } } sub parse { my $self = shift; $self->skip('comment', 'space'); return if $self->empty; $self->expect('open'); my @expr; until ($self->peek('close')) { die "Could not continue reading" if $self->empty; my ($token, $what) = $self->token or die "Could not read a token"; if ($token eq 'word' or $token eq 'string') { push @expr, $self->_shift; } elsif ($token eq 'open') { push @expr, $self->parse; } else { $self->_shift; } } $self->_shift; return \@expr; } sub encode { my $list = shift; my $out = '('; for my $item (@$list) { if (ref($item) eq 'ARRAY') { $out .= encode($item); } else { $out .= "$item"; } $out .= " "; } $out = substr $out, 0, -1 if (substr $out, -1 eq ' '); $out .= ')'; return $out; } 1; MoarVM-2018.03/tools/spesh-bisect.pl0000755000175000017510000000053013242626641017300 0ustar samanthasamantha#!/usr/bin/perl use 5.10.0; chomp $prog; my $min = 1; my $max = 100000; my $l = 50000; while ($min < $l and $l < $max) { $ENV{MVM_SPESH_LIMIT} = $l; say "Trying $l"; if (system(@ARGV) != 0) { $max = $l - 1; } else { $min = $l + 1 }; $l = $min + int(($max - $min) / 2); }; say "MVM_SPESH_LIMIT=$l"; MoarVM-2018.03/tools/spesh-time.p60000644000175000017510000000077613237701105016701 0ustar samanthasamanthasub MAIN($spesh-log) { with slurp($spesh-log) { my $stats = [+] .match(/:r 'statistics updated in ' <( \d+ )> 'us'/, :g); my $plan = [+] .match(/:r 'planned in ' <( \d+ )> 'us'/, :g); my $spesh = [+] .match(/:r 'Specialization took ' <( \d+ )> 'us'/, :g); say qq:to/REPORT/ Total statistics time: {$stats / 1000}ms Total planning time: {$plan / 1000}ms Total specialization time: {$spesh / 1000}ms REPORT } } MoarVM-2018.03/tools/spesh_diff.p60000644000175000017510000001474013237701105016731 0ustar samanthasamanthause v6; multi sub MAIN() { say q:to/USAGE/; This tool can be used as followed: spesh_diff.p6 output_from_mvm.txt spesh_diff.p6 --matcher="'foobar'" output.txt spesh_diff.p6 --matcher="/^ to $/" output.txt spesh_diff.p6 --matcher="diff => / '+' .*? 'nyi' /" output.txt This tool takes the output MoarVM generates to a file when you call it with MVM_SPESH_LOG environment variable set to a filename and splits it into two folders, optionally selects a subset of the participating cuids and then diffs everything for you using git diff. It will output colors always, so if you want to use less to paginate, you will need to supply -r to less. You can supply any valid Perl 6 code for the matcher flag. If you don't supply a Pair, a Pair from name to your matcher will be generated for you. You can filter based on these properties: before all text in the "before" section after all text in the "after" section name the name of the method/sub/... cuid the cuid diff the output of the diff command (watch out, these contain ansi color codes) USAGE } class Spesh is rw { has @.beforelines; has @.afterlines; has $.before; has $.after; has Str $.name; has Str $.cuid; has Str $.diff; } enum Target ; sub supersmartmatch($thing) { given $thing { when Pair { say "making a supersmartmatcher for $thing.key() -> $thing.value().perl()"; return -> $to_match { $to_match."$thing.key()"() ~~ supersmartmatch($thing.value) } } when Str { return -> $to_match { $to_match ~~ / $($thing) / } } when Junction { return -> $to_match { $to_match ~~ supersmartmatch($thing) } } default { return $thing } } } multi sub MAIN($filename?, :$matcher?) { my %speshes; my Target $target; my $linecount; my Int $lines_total; if $filename { $lines_total = qqx/ wc -l '$filename' /.words[0].Int; $*ARGFILES = open($filename, :r); } else { $*ARGFILES = $*IN; } my $ssm = do if $matcher { my Mu $matcher_evald = EVAL $matcher; if $matcher_evald.WHAT ~~ Str | Regex | Junction { supersmartmatch (name => $matcher_evald); } else { supersmartmatch $matcher_evald; } } else { True } sub notegraph($kind) { state $printed = 0; state $few = 0; my $did_print = False; if $kind eq "." { if ++$few %% 50 { $*ERR.print("."); $did_print = True; } } else { $*ERR.print($kind); $did_print = True; } if $did_print and ++$printed %% 80 { if $lines_total { my $part = $linecount / $lines_total; $*ERR.print(($part * 100).fmt(" % 3.2f%%")); my $est_time_left = (1 - $part) * (now - INIT now) / $part; $*ERR.print(($est_time_left / 60).fmt(" %d") ~ ($est_time_left % 60).fmt(":%02ds")); } $*ERR.print("\n"); } } try mkdir "spesh_diffs_before"; try mkdir "spesh_diffs_after"; my Spesh $current; for lines(:eager) { my $line = $_; $linecount++; when /^' ' / { given $target { when Before { $current.beforelines.push: $line; notegraph("."); } when Specialized { $current.afterlines.push: $line; notegraph("."); } } } when /^ [$=I 'nserting logging for specialization of ' | $=F 'inished specialization of '] \' $=[<-[\']>*] \' ' (cuid: ' $=[<-[\)]>+] ')' / { my $cuid = $; if $ eq 'I' { # want to build a new one while %speshes{$cuid}:exists { $cuid ~= "_"; } $current .= new(name => $.Str, cuid => $.Str, diff => ""); %speshes{$current.cuid} = $current; } elsif $ eq 'F' { # want to find the last one added that exists. while %speshes{$cuid}:exists { $cuid ~= '_'; } # so we chop off a _ again $cuid = $cuid.substr(0, *-1); $current = %speshes{$cuid}; warn "couldn't find a before-image for cuid $cuid" unless $current; $target = Specialized; } notegraph($); } when /^ 'Before:'/ { $target = Before; } when /^ 'After:'/ { $current.before = $current.beforelines.join("\n"); $current.beforelines = @(); $target = Logged; } when /^ 'Facts:'/ { if $target ~~ Specialized { given $current { .after = .afterlines.join("\n"); .afterlines = @(); spurt "spesh_diffs_before/{.cuid}.txt", "{.name} (before)\n{.before}"; spurt "spesh_diffs_after/{.cuid}.txt", "{.name} (after)\n{.after}"; unless $matcher { .before = ""; .after = ""; } } } $target = Facts; } } say "we've parsed $linecount lines"; say "we have the following cuids:"; my @results; my @interesting; for %speshes.values { next if not .after.defined; @results.push: $_.diff = qq:x"git diff --patience --color=always --no-index spesh_diffs_before/{.cuid}.txt spesh_diffs_after/{.cuid}.txt"; my $matched = $matcher && $_ ~~ $ssm; @interesting.push: $_.diff if $matched; printf "%30s %s (%s)\n", .cuid, ($matched ?? "*" !! " "), .name; } for @interesting || @results { .say } if $matcher and 1 < @interesting < @results { note "matcher selected {+@interesting} out of {+@results} cuids"; } if $matcher and 0 == @interesting { note "matcher matched no cuids" } } MoarVM-2018.03/tools/tiler-table-generator.pl0000644000175000017510000004467413237701105021106 0ustar samanthasamantha#!/usr/bin/env perl package rule; use strict; use warnings; my $pseudosym = 0; sub register_spec { my ($symbol) = @_; if ($symbol =~ m/^reg/) { return "require($1)" if ($symbol =~ m/:(\w+)$/); return 'any'; } else { return 'none'; } } sub symbol_name { # remove annotation from symbol my $copy = $_[0]; $copy =~ s/:\w+$//; return $copy; } sub add { my ($name, $tree, $sym, $cost) = @_; my $ctx = { # lookup path for values path => [], # specifications of registers spec => [], # bitmap of referenced symbols (vs raw values) refs => 0, # number of arguments and refs num => 0, }; push @{$ctx->{'spec'}}, register_spec($sym); my @rules = decompose($ctx, $tree, $sym, $cost); my $head = $rules[$#rules]; $head->{name} = $name; $head->{path} = join('', @{$ctx->{path}}); $head->{spec} = $ctx->{spec}; $head->{refs} = $ctx->{refs}; $head->{text} = sexpr::encode($tree); return @rules; } sub new { # Build a new, fully decomposed rule my ($class, $pat, $sym, $cost) = @_; return { pat => $pat, sym => $sym, cost => $cost }; } sub decompose { my ($ctx, $tree, $sym, $cost, @trace) = @_; my $list = []; my @rules; # Recursively replace child nodes by pseudosymbols for (my $i = 0; $i < @$tree; $i++) { my $item = $tree->[$i]; if (ref $item eq 'ARRAY') { # subtree, which has to be replaced with a symbol my $newsym = sprintf("#%s", $pseudosym++); # divide cost by two $cost /= 2; # add rule and subrules to the list push @rules, decompose($ctx, $item, $newsym, $cost, @trace, $i); push @$list, $newsym; } elsif (substr($item, 0, 1) eq '$') { # argument symbol # add trace to path push @{$ctx->{path}}, @trace, $i, '.'; $ctx->{num}++; } else { if ($i > 0) { # value symbol push @{$ctx->{path}}, @trace, $i, '.'; # this is a value symbol, so add it to the bitmap $ctx->{refs} += (1 << $ctx->{num}); $ctx->{num}++; push @{$ctx->{spec}}, register_spec($item); } # else head push @$list, symbol_name($item); } } push @rules, rule->new($list, symbol_name($sym), $cost); return @rules; } sub combine { my @rules = @_; # %sets represents the symbols which can occur in combination (symsets) # %trie is the table that holds all combinations of rules and symsets my (%sets, %trie); # Initialize the symsets with just their own symbols $sets{$_->{sym}} = [$_->{sym}] for @rules; my ($added, $deleted, $iterations); do { $iterations++; # Generate a lookup table to translate symbols to the # combinations (symsets) they appear in my %lookup; while (my ($k, $v) = each %sets) { # Use a nested hash for set semantics $lookup{$_}{$k} = 1 for @$v; } # Reset trie %trie = (); # Translate symbols in rule patterns to symsets and use these to # build the combinations of matching rules for (my $rule_nr = 0; $rule_nr < @rules; $rule_nr++) { my $rule = $rules[$rule_nr]; # The head is significant because this represent the expression node we match my ($head, $sym1, $sym2) = @{$rule->{pat}}; if (defined $sym2) { # iterate over all symbols in the symsets for my $s_k1 (keys %{$lookup{$sym1}}) { for my $s_k2 (keys %{$lookup{$sym2}}) { # This rule could match all combinations of $s_k1 and $s_k2 that appear # here because their matching symbols are contained in these symsets. # Here we are interested in all the other rules that also match these # symsets and the symbols these rules generate in combination. Thus, # we generate a new table here. $trie{$head, $s_k1, $s_k2}{$rule_nr} = $rule->{sym}; } } } elsif (defined $sym1) { # Handle the one-item case for my $s_k1 (keys %{$lookup{$sym1}}) { $trie{$head, $s_k1, -1}{$rule_nr} = $rule->{sym}; } } else { $trie{$head, -1, -1}{$rule_nr} = $rule->{sym}; } } # Read the symsets from the generated table, generate a # key to identify them and replace the old %sets table my %new_sets; for my $gen (values %trie) { my @set = sort(main::uniq(values %$gen)); my $key = join(':', @set); $new_sets{$key} = [@set]; } # This loop converges the symsets to an unchanging and complete # set of symsets. That seems to be because a symsets is always # formed by the combination of other symsets that happen to be # applicable to the same rules. The combined symset is still # applicable to those rules (thus a symset is never lost, just # embedded into a larger symset). When symsets stop changing that # must be because they cannot be combined further, and thus the # set is complete. $deleted = 0; for my $k (keys %sets) { $deleted++ unless exists $new_sets{$k}; } $added = scalar(keys %new_sets) - scalar(keys %sets) + $deleted; # Continue with newly generated sets %sets = %new_sets; } while ($added || $deleted); # Given that all possible symsets are known, we can now read # the rulesets from the %trie as well. my (%seen, @rulesets); for my $symset (values %trie) { my @rule_nrs = main::sortn(keys %$symset); my $key = join $;, @rule_nrs; push @rulesets, [@rule_nrs] unless $seen{$key}++; } return @rulesets; } sub set_key { my @rule_nrs = @_; return join ":", main::sortn(@rule_nrs); } # end package rule package main; use strict; use warnings; use Getopt::Long; use FindBin; use lib $FindBin::Bin; use sexpr; use expr_ops; # Use a readable hash key separator local $; = ","; # This script takes the tiler grammar file (x64.tiles) # and produces tiler tables. my $PREFIX = "MVM_JIT_"; my $VARNAME = "MVM_jit_tile_"; my $EXPR_HEADER_FILE = 'src/jit/expr.h'; my $DEBUG = 0; my ($INFILE, $OUTFILE, $TESTING); # shorthand for numeric sorts sub sortn { sort { $a <=> $b } @_; } # Get unique items in tree sub uniq { my %h; $h{$_}++ for @_; return keys %h; } package main; sub generate_table { # Compute possible combination tables and minimum cost tables from # rulesets. Requires rules (pattern + symbol + cost) and rulesets # (indices into rules). my ($rules, $rulesets) = @_; my (%candidates, %trans); # map symbols to rulesets, rule set names to ruleset numbers for (my $ruleset_nr = 0; $ruleset_nr < @$rulesets; $ruleset_nr++) { my $ruleset = $rulesets->[$ruleset_nr]; for my $rule_nr (@$ruleset) { $candidates{$rules->[$rule_nr]{sym}}{$ruleset_nr} = 1; } my $key = rule::set_key(@$ruleset); $trans{$key} = $ruleset_nr; } # build flat table first my %flat; for (my $rule_nr = 0; $rule_nr < @$rules; $rule_nr++) { my $rule = $rules->[$rule_nr]; my ($head, $sym1, $sym2) = @{$rule->{pat}}; if (defined $sym2) { for my $rs1 (keys %{$candidates{$sym1}}) { for my $rs2 (keys %{$candidates{$sym2}}) { $flat{$head,$rs1,$rs2}{$rule_nr} = 1; } } } elsif (defined $sym1) { for my $rs1 (keys %{$candidates{$sym1}}) { $flat{$head,$rs1,-1}{$rule_nr} = 1; } } else { $flat{$head,-1,-1}{$rule_nr} = 1; } } # with the flat table, we can directly build the tiler table by expanding the keys my %table; while (my ($idx, $match) = each %flat) { my ($head, $rs1, $rs2) = split $;, $idx; my $key = rule::set_key(keys %$match); die "Cannot find key $key" unless defined $trans{$key}; $table{$head}{$rs1}{$rs2} = $trans{$key}; } return %table; } sub compute_costs { my ($rules, $rulesets, $table) = @_; my %reversed; for my $head (keys %$table) { for my $rs1 (keys %{$table->{$head}}) { for my $rs2 (keys %{$table->{$head}->{$rs1}}) { my $rsy = $table->{$head}{$rs1}{$rs2}; push @{$reversed{$rsy}}, [$rs1, $rs2]; } } } # converge at %min_cost. # # seed %rule_cost with the minimum-zero-order cost, %min_cost according to that # compute first order cost using the seeded zero-order cost, # compute minimum cost table again; while it remains changing, # compute again with updated costs my %rule_cost; my %min_cost; for (my $ruleset_nr = 0; $ruleset_nr < @$rulesets; $ruleset_nr++) { for my $rule_nr (@{$rulesets->[$ruleset_nr]}) { my $cost = $rules->[$rule_nr]{cost}; my $sym = $rules->[$rule_nr]{sym}; my $best = $min_cost{$ruleset_nr, $sym}; if (!defined($best) || $rule_cost{$ruleset_nr, $best} > $cost) { $min_cost{$ruleset_nr, $sym} = $rule_nr; } $rule_cost{$ruleset_nr, $rule_nr} = $cost; } } my $changed = 0; do { my %new_cost; my %new_min; for (my $ruleset_nr = 0; $ruleset_nr < @$rulesets; $ruleset_nr++) { for my $rule_nr (@{$rulesets->[$ruleset_nr]}) { my $cost = $rules->[$rule_nr]->{cost}; my ($head, $sym1, $sym2) = @{$rules->[$rule_nr]->{pat}}; # compute new cost of rule for my $rsg (@{$reversed{$ruleset_nr}}) { $cost += $rule_cost{$rsg->[0], $min_cost{$rsg->[0], $sym1}} if defined $sym1; $cost += $rule_cost{$rsg->[1], $min_cost{$rsg->[1], $sym2}} if defined $sym2; } $cost /= scalar @{$reversed{$ruleset_nr}}; # determine new minimum cost rule my $sym = $rules->[$rule_nr]->{sym}; my $best = $new_min{$ruleset_nr, $sym}; if (!defined ($best) || $new_cost{$ruleset_nr, $best} > $cost) { $new_min{$ruleset_nr, $sym} = $rule_nr; } $new_cost{$ruleset_nr, $rule_nr} = $cost; } } $changed = 0; # nb, i assume we've converged after the *relative* cost of rules doesn't change, # but i only compute whether the *top* rule hasn't changed, and that's actually # not sufficient in some cases for my $key (keys %min_cost) { die "huh $key" if !defined $new_min{$key}; $changed++ if $min_cost{$key} != $new_min{$key}; } %rule_cost = %new_cost; %min_cost = %new_min; } while($changed); return %min_cost; } # Collect rules -> form list, table; # list contains 'shallow' nodes, maps rulenr -> rule # indirectly create rulenr -> terminal GetOptions( 'debug' => \$DEBUG, 'testing' => \$TESTING, 'input=s' => \$INFILE, 'output=s' => \$OUTFILE, 'prefix=s' => \$PREFIX, 'header=s' => \$EXPR_HEADER_FILE, ); my @rules; my $input; if ($TESTING) { $input = \*DATA; } else { if (!defined $INFILE && @ARGV && -f $ARGV[0]) { $INFILE = shift @ARGV; } die "Please provide an input file" unless defined $INFILE; open $input, '<', $INFILE or die "Could not open $INFILE"; } # Collect rules from the grammar my $parser = sexpr->parser($input); while (my $tree = $parser->parse) { my $keyword = shift @$tree; if ($keyword eq 'tile:') { # (tile: name pattern symbol cost) push @rules, rule::add(@$tree); } elsif ($keyword eq 'define:') { # (define: pattern symbol) push @rules, rule::add(undef, @$tree, 0); } } close $input; my @rulesets = rule::combine(@rules); if ($DEBUG) { print "Rules:\n"; for (my $rule_nr = 0; $rule_nr < @rules; $rule_nr++) { print "$rule_nr => "; print sexpr::encode($rules[$rule_nr]{pat}), ": ", $rules[$rule_nr]{sym} , "\n"; } print "Rulesets:\n"; for (my $ruleset_nr = 0; $ruleset_nr < @rulesets; $ruleset_nr++) { print "$ruleset_nr => "; for my $rule_nr (@{$rulesets[$ruleset_nr]}) { print "$rule_nr, "; } print "\n"; } } my %table = generate_table(\@rules, \@rulesets); my %min_cost = compute_costs(\@rules, \@rulesets, \%table); sub bits { my $i = 0; my $n = shift; while ($n) { $i++ if $n & 1; $n >>= 1; } return $i; } # Write tables my $output; if (defined $OUTFILE) { open $output, '>', $OUTFILE or die "Could not open $OUTFILE"; } else { $output = \*STDOUT; } print $output <<"HEADER"; /* FILE AUTOGENERATED BY $0. DO NOT EDIT. * Define tables for tiler DFA. */ HEADER # Tiling works by selecting *possible* rules bottom-up and picking # the *optimum* rules top-down. So we need to know, starting from # a rule and it's children's rulesets, how to select the best rules. my @symbols = uniq(map { $_->{sym} } @rules); my %symnum; for (my $i = 0; $i < @symbols; $i++) { $symnum{$symbols[$i]} = $i; } print $output "static const MVMJitTileTemplate ${VARNAME}templates[] = {\n"; for (my $rule_nr = 0; $rule_nr < @rules; $rule_nr++) { my $rule = $rules[$rule_nr]; my ($head, $sym1, $sym2) = @{$rule->{pat}}; my $sn1 = defined $sym1 ? $symnum{$sym1} : -1; my $sn2 = defined $sym2 ? $symnum{$sym2} : -1; my ($func, $path, $text, $refs, $nval, $spec); if (exists $rule->{name}) { $func = defined $rule->{name} ? $VARNAME . $rule->{name} : "NULL"; $path = sprintf('"%s"', $rule->{path}); $text = sprintf('"%s"', $rule->{text}); $refs = $rule->{refs}; $nval = bits($refs); $spec = join('|', map sprintf('MVM_JIT_REGISTER_ENCODE(MVM_JIT_REGISTER_%s,%d)', uc $rule->{spec}[$_], $_), 0..$#{$rule->{spec}}); } else { $func = $path = $text = "NULL"; $refs = 0; $nval = 0; $spec = 0; } print $output qq( { $func, $path, $text, $sn1, $sn2, $nval, $refs, $spec },); } print $output "};\n\n"; print $output "static const MVMint32 ${VARNAME}select[][3] = {\n"; for (my $ruleset_nr = 0; $ruleset_nr < @rulesets; $ruleset_nr++) { for (my $sym_nr = 0; $sym_nr < @symbols; $sym_nr++) { my $rule = $min_cost{$ruleset_nr,$symbols[$sym_nr]}; next unless defined $rule; print $output " { $ruleset_nr, $sym_nr, $rule },\n"; } } print $output "};\n\n"; print $output <<"COMMENT"; /* Each table item consists of 5 integers: * 0..3 -> lookup key (nodenr, ruleset_1, ruleset_2) * 4 -> next state * 5 -> optimum rule if this were a root */ /* TODO - I think this table format can be, if we want it, much * smaller - for our current table sizes, keys could fit in 32 bits. * And we could add the terminals and minimum-cost table as * intermediates. */ COMMENT print $output "static MVMint32 ".$VARNAME."state[][6] = {\n"; for my $expr_op (@EXPR_OPS) { my $head = lc($expr_op->[0]); for my $rs1 (sortn keys %{$table{$head}}) { for my $rs2 (sortn keys %{$table{$head}{$rs1}}) { my $state = $table{$head}{$rs1}{$rs2}; my $best = $min_cost{$state,'reg'} // $min_cost{$state,'void'} // -1; printf $output ' { %s%s, %s, %s, %d, %d },' . "\n", $PREFIX, $expr_op->[0], $rs1, $rs2, $state, $best; } } } print $output "};\n\n"; print $output <<"LOOKUP"; /* Lookup routines. Implemented here so that we may change it * independently from tiler */ static MVMint32* ${VARNAME}state_lookup(MVMThreadContext *tc, MVMint32 node, MVMint32 c1, MVMint32 c2) { MVMint32 top = (sizeof(${VARNAME}state)/sizeof(${VARNAME}state[0])); MVMint32 bottom = 0; MVMint32 mid = (top + bottom) / 2; while (bottom < mid) { if (${VARNAME}state[mid][0] < node) { bottom = mid; mid = (top + bottom) / 2; } else if (${VARNAME}state[mid][0] > node) { top = mid; mid = (top + bottom) / 2; } else if (${VARNAME}state[mid][1] < c1) { bottom = mid; mid = (top + bottom) / 2; } else if (${VARNAME}state[mid][1] > c1) { top = mid; mid = (top + bottom) / 2; } else if (${VARNAME}state[mid][2] < c2) { bottom = mid; mid = (top + bottom) / 2; } else if (${VARNAME}state[mid][2] > c2) { top = mid; mid = (top + bottom) / 2; } else { break; } } if (${VARNAME}state[mid][0] != node || ${VARNAME}state[mid][1] != c1 || ${VARNAME}state[mid][2] != c2) return NULL; return ${VARNAME}state[mid]; } /* Same as above, maps tile state + nonterm -> child rule, used for * downward propagation of optimal rules */ static MVMint32 ${VARNAME}select_lookup(MVMThreadContext *tc, MVMint32 ts, MVMint32 nt) { MVMint32 top = (sizeof(${VARNAME}select)/sizeof(${VARNAME}select[0])); MVMint32 bottom = 0; MVMint32 mid = (top + bottom) / 2; while (bottom < mid) { if (${VARNAME}select[mid][0] < ts) { bottom = mid; mid = (top + bottom) / 2; } else if (${VARNAME}select[mid][0] > ts) { top = mid; mid = (top + bottom) / 2; } else if (${VARNAME}select[mid][1] < nt) { bottom = mid; mid = (top + bottom) / 2; } else if (${VARNAME}select[mid][1] > nt) { top = mid; mid = (top + bottom) / 2; } else { break; } } if (${VARNAME}select[mid][0] != ts || ${VARNAME}select[mid][1] != nt) return -1; return ${VARNAME}select[mid][2]; } LOOKUP close $output; __DATA__ # Minimal grammar to test tiler table generator (tile: a (stack) reg 1) (tile: c (addr reg $ofs) reg 2) (tile: d (const $val) reg 2) (tile: e (load reg $size) reg 5) (tile: g (add reg reg) reg 2) (tile: h (add reg (const $val)) reg 3) (tile: i (add reg (load reg $size)) reg 6) MoarVM-2018.03/tools/timeout.pm0000644000175000017510000000066013237701105016370 0ustar samanthasamanthapackage timeout; use strict; use warnings; use Exporter qw(import); our @EXPORT_OK = qw(run_timeout); sub run_timeout { my ($command, $timeout) = @_; my $status; if (my $pid = fork()) { local $SIG{ALRM} = sub { kill 'KILL', $pid; }; alarm $timeout; waitpid $pid, 0; $status = $?; alarm 0; } else { exec @$command; } return $status; } 1; MoarVM-2018.03/tools/trace_spesh_optimizer.gdb0000644000175000017510000000536413237701105021432 0ustar samanthasamanthadefine trace_spesh_optimize dont-repeat python # # This script lets you see a step-by-step listing of what spesh # does to one particular frame. # # How to use it # ============= # # source this from your ~/.gdbinit or directly from your gdb shell # # Reach the beginning of MVM_spesh_candidate_specialize (for example by setting # a breakpoint to that function) # # call trace_spesh_optimize from your gdb commandline # # Wait for a little bit. # import tempfile import os import gdb spesh_trace_target_folder = tempfile.mkdtemp("", "moar-spesh-trace") spesh_trace_target_file = os.path.join(spesh_trace_target_folder, "speshdump.txt") os.system("git init " + spesh_trace_target_folder) env_vars = "env GIT_DIR=" + os.path.join(spesh_trace_target_folder, ".git") + " GIT_WORK_TREE=" + spesh_trace_target_folder temp_breakpoints = [] class DumpingResumingBreakpoint(gdb.Breakpoint): def __init__(self, message, *args): gdb.Breakpoint.__init__(self, *args) self.message = message self.andthen = lambda self: "" def stop(self): dump_to_file_and_commit(self.message + self.andthen(self)) return False # don't actually stop def andthen(self, fn): self.andthen = fn def add_dump_breakpoint(spec, message = "."): bp = DumpingResumingBreakpoint(message, spec) temp_breakpoints.append(bp) return bp def cleanup_breakpoints(): global temp_breakpoints for bp in temp_breakpoints: bp.delete() temp_breakpoints = [] def dump_to_file_and_commit(message = "."): histnum = gdb.execute('''call MVM_spesh_dump(tc, g)''', True, True).split(" = ")[0].lstrip("$") dump_output = gdb.history(int(histnum)).string() with open(spesh_trace_target_file, "w") as f: f.write(dump_output) os.system(env_vars + " git add " + os.path.join(spesh_trace_target_folder, "speshdump.txt")) os.system(env_vars + " git commit -m '" + message + "'") add_dump_breakpoint("MVM_spesh_facts_discover", "before everything") add_dump_breakpoint("MVM_spesh_optimize", "after facts have been discovered") add_dump_breakpoint("eliminate_dead_bbs", "before eliminating dead BBs") add_dump_breakpoint("optimize_bb", "going to optimize a bb").andthen(lambda self: gdb.execute("print bb->idx", False, True)) add_dump_breakpoint("eliminate_unused_log_guards", "eliminating unused log guards") add_dump_breakpoint("eliminate_pointless_gotos", "eliminating pointless gotos") add_dump_breakpoint("eliminate_dead_ins", "eliminating dead instructions") add_dump_breakpoint("second_pass", "starting second pass") add_dump_breakpoint("MVM_spesh_codegen", "done!") gdb.execute("finish") os.system("env GIT_DIR=" + os.path.join(spesh_trace_target_folder, ".git") + " git log -u") cleanup_breakpoints() end end MoarVM-2018.03/tools/ucd2c.pl0000755000175000017510000024443713242626641015727 0ustar samanthasamantha#!/usr/bin/env perl use 5.014; use warnings; use strict; use utf8; use feature 'unicode_strings'; use Data::Dumper; use Carp qw(cluck croak carp); $Data::Dumper::Maxdepth = 1; # Make C versions of the Unicode tables. # Before running, downloading UNIDATA.zip from http://www.unicode.org/Public/zipped/ # and extract them into UNIDATA in the root of this repository. # Download allkeys.txt from http://www.unicode.org/Public/UCA/latest/ # and place into a folder named UCA under the UNIDATA directory. my $DEBUG = $ENV{UCD2CDEBUG} // 0; binmode STDOUT, ':encoding(UTF-8)'; binmode STDERR, ':encoding(UTF-8)'; my $LOG; # All globals should use UPPERCASE my $DB_SECTIONS = {}; my $H_SECTIONS = {}; my @POINTS_SORTED; my $POINTS_BY_CODE = {}; my $ALIASES = {}; my $ALIAS_TYPES = {}; my $PROP_NAMES = {}; my $BITFIELD_TABLE = []; my $ALL_PROPERTIES = {}; my $ENUMERATED_PROPERTIES = {}; my $BINARY_PROPERTIES = {}; my $GENERAL_CATEGORIES = {}; my $PROPERTY_INDEX = 0; # Estimated total bytes is only calculated for bitfield and names my $ESTIMATED_TOTAL_BYTES = 0; my $TOTAL_BYTES_SAVED = 0; # Constants my $WRAP_TO_COLUMNS = 120; my $COMPRESS_CODEPOINTS = 1; my $GAP_LENGTH_THRESHOLD = 1000; my $SPAN_LENGTH_THRESHOLD = 100; my $SKIP_MOST_MODE = 0; my $BITFIELD_CELL_BITWIDTH = 32; sub trim { my ($str) = @_; $str =~ s/ \s+ $ //xmsg; $str =~ s/ ^ \s+ //xmsg; return $str; } sub trim_trailing { my ($str) = @_; $str =~ s/ [ \t]+ $ //xmsg; return $str; } # Get the highest version number from the supplied array. Iterate and compare # each segment. Ensures if there ever are subversions like 5.0.5 then it will work. sub get_highest_version { my ($versions) = @_; my @highest_ver; for my $ver_str (@$versions) { my @ver = split / [.] /x, $ver_str; if (!@highest_ver) { @highest_ver = @ver; next; } for (my $i = 0; $i < @ver; $i++) { if ($highest_ver[$i] < $ver[$i]) { @highest_ver = @ver; } elsif ($highest_ver[$i] == $ver[$i]) { next; } last; } } return join '.', @highest_ver; } sub add_emoji_sequences { my ($named_sequences) = @_; my $directory = "UNIDATA"; # Find all the emoji dirs opendir my $UNIDATA_DIR, $directory or croak $!; my @versions; while (my $file = readdir $UNIDATA_DIR) { push @versions, $file if -d "$directory/$file" && $file =~ s/ ^ emoji- //x; } croak "Couldn't find any emoji folders. Please run UCD-download.p6 again" if !@versions; my $highest_emoji_version = get_highest_version(\@versions); say "Highest emoji version found is $highest_emoji_version"; for my $version (@versions) { add_unicode_sequence("emoji-$version/emoji-sequences", $named_sequences); add_unicode_sequence("emoji-$version/emoji-zwj-sequences", $named_sequences); } return $highest_emoji_version; } sub main { $DB_SECTIONS->{'AAA_header'} = header(); # For adding Emoji and standard sequences to my $named_sequences = {}; my $highest_emoji_version = add_emoji_sequences($named_sequences); add_unicode_sequence('NamedSequences', $named_sequences); my $hout = emit_unicode_sequence_keypairs($named_sequences); NameAliases(); $hout .= gen_name_alias_keypairs(); # Load all the things UnicodeData( derived_property('BidiClass', 'Bidi_Class', { L => 0 }, 0), derived_property('GeneralCategory', 'General_Category', { Cn => 0 }, 0), derived_property('CombiningClass', 'Canonical_Combining_Class', { Not_Reordered => 0 }, 1) ); enumerated_property('BidiMirroring', 'Bidi_Mirroring_Glyph', { 0 => 0 }, 1, 'int', 1); collation(); Jamo(); #BidiMirroring(); goto skip_most if $SKIP_MOST_MODE; binary_props('extracted/DerivedBinaryProperties'); binary_props("emoji-$highest_emoji_version/emoji-data"); enumerated_property('ArabicShaping', 'Joining_Group', {}, 3); enumerated_property('Blocks', 'Block', { No_Block => 0 }, 1); # sub Jamo sets names properly. Though at the moment Jamo_Short_Name likely # will not need to be a property since it's only used for programatically # creating Jamo's Codepoint Names #enumerated_property('Jamo', 'Jamo_Short_Name', { }, 1, 1); enumerated_property('extracted/DerivedDecompositionType', 'Decomposition_Type', { None => 0 }, 1); enumerated_property('extracted/DerivedEastAsianWidth', 'East_Asian_Width', { N => 0 }, 1); enumerated_property('ArabicShaping', 'Joining_Type', { U => 0 }, 2); CaseFolding(); SpecialCasing(); enumerated_property('DerivedAge', 'Age', { Unassigned => 0 }, 1); binary_props('DerivedCoreProperties'); DerivedNormalizationProps(); enumerated_property('extracted/DerivedNumericValues', 'Numeric_Value', { NaN => 0 }, 1); enumerated_property('extracted/DerivedNumericValues', 'Numeric_Value_Numerator', { NaN => 0 }, sub { my @fraction = split('/', (shift->[3])); return $fraction[0]; }); enumerated_property('extracted/DerivedNumericValues', 'Numeric_Value_Denominator', { NaN => 0 }, sub { my @fraction = split('/', (shift->[3])); return $fraction[1] || '1'; }); enumerated_property('extracted/DerivedNumericType', 'Numeric_Type', { None => 0 }, 1); enumerated_property('HangulSyllableType', 'Hangul_Syllable_Type', { Not_Applicable => 0 }, 1); enumerated_property('LineBreak', 'Line_Break', { XX => 0 }, 1); binary_props('PropList'); enumerated_property('Scripts', 'Script', { Unknown => 0 }, 1); # XXX StandardizedVariants.txt # no clue what this is grapheme_cluster_break('Grapheme', 'Grapheme_Cluster_Break'); break_property('Sentence', 'Sentence_Break'); skip_most: break_property('Word', 'Word_Break'); tweak_nfg_qc(); # Allocate all the things progress("done.\nsetting next_point for codepoints"); my $first_point = set_next_points(); progress("done.\nallocating bitfield..."); my $allocated_bitfield_properties = allocate_bitfield($first_point); # Compute all the things progress("done.\ncomputing all properties..."); compute_properties($allocated_bitfield_properties); # Make the things less progress("...done.\ncomputing collapsed properties table..."); compute_bitfield($first_point); # Emit all the things progress("...done.\nemitting unicode_db.c..."); emit_bitfield($first_point); my $extents = emit_codepoints_and_planes($first_point); $DB_SECTIONS->{BBB_case_changes} = emit_case_changes($first_point); $DB_SECTIONS->{codepoint_row_lookup} = emit_codepoint_row_lookup($extents); $hout .= emit_property_value_lookup($allocated_bitfield_properties); emit_names_hash_builder($extents); my $prop_codes = emit_unicode_property_keypairs(); $H_SECTIONS->{num_unicode_property_value_keypairs} = $hout . emit_unicode_property_value_keypairs($prop_codes); emit_block_lookup(); emit_composition_lookup(); print "done!"; write_file('src/strings/unicode_db.c', join_sections($DB_SECTIONS)); write_file('src/strings/unicode_gen.h', join_sections($H_SECTIONS)); print "\nEstimated bytes demand paged from disk: ". thousands($ESTIMATED_TOTAL_BYTES). ".\nEstimated bytes saved by various compressions: ". thousands($TOTAL_BYTES_SAVED).".\n"; if ($DEBUG) { write_file("ucd2c_extents.log", $LOG); } print "\nDONE!!!\n\n"; return 1; } sub thousands { my $in = shift; $in = reverse "$in"; # stringify or copy the string $in =~ s/ (\d\d\d) (?= \d) /$1,/xg; return reverse($in); } sub stack_lines { # interleave @$lines with separator $sep, using a different # separator $break every $num lines or when $wrap columns is reached my ($lines, $sep, $break, $num, $wrap) = @_; my $i = 1; my $out = ""; my $first = 1; my $length = 0; my $sep_length = length($sep); for (@$lines) { my $line_length = length($_); if ($first) { $first = 0; $length = $line_length; } else { if ($num && ($i++ % $num) || $wrap && $length + $sep_length + $line_length <= $wrap) { $out .= $sep; $length += $sep_length + $line_length; } else { $out .= $break; $length = $line_length; } } $out .= $_; } return $out; } sub join_sections { my ($sections) = @_; my $content = ""; $content .= "\n".$sections->{$_} for (sort keys %{$sections}); return $content; } sub set_next_points { my $previous; my $first_point = {}; for my $code (sort { $a <=> $b } keys %{$POINTS_BY_CODE}) { push @POINTS_SORTED, $POINTS_BY_CODE->{$code}; $POINTS_BY_CODE->{$previous}->{next_point} = $POINTS_BY_CODE->{$code} if defined $previous; # The first code we encounter will be the lowest, so set $first_point if (!defined $previous) { say "setting first point to $code"; $first_point = $POINTS_BY_CODE->{$code}; } $previous = $code; } return $first_point; } sub get_next_point { my ($code, $add_to_points_by_code) = @_; my $point = $POINTS_BY_CODE->{$code}; if (!$point) { $point = { code => $code, code_str => sprintf ("%.4X", $code), Any => 1, NFD_QC => 1, # these are defaults (inverted) NFC_QC => 1, # which will be unset as appropriate NFKD_QC => 1, NFKC_QC => 1, NFG_QC => 1, MVM_COLLATION_QC => 1, name => "", gencat_name => "Cn", General_Category => $GENERAL_CATEGORIES->{enum}->{Cn} }; croak "$code is already defined" if defined $POINTS_BY_CODE->{$code}; if ($add_to_points_by_code) { $POINTS_BY_CODE->{$code} = $point; } } return $point; } sub apply_to_range { # apply a function to a range of codepoints. The starting and # ending codepoint of the range need not exist; the function will # be applied to all/any in between. my ($range, $fn) = @_; chomp($range); if ( !defined $range ) { cluck "Did not get any range in apply_to_range"; } my ($first_str, $last_str) = split '\\.\\.', $range; $first_str ||= $range; $last_str ||= $first_str; my ($first_code, $last_code) = (hex $first_str, hex $last_str); my $curr_code = $first_code; my $point; while ($curr_code <= $last_code) { $point = get_next_point($curr_code); $fn->($point); $curr_code++; } return; } sub progress { my ($txt) = @_; local $| = 1; print $txt; return; } sub binary_props { # process a file, extracting binary properties and applying them to ranges my ($fname) = @_; # filename each_line($fname, sub { $_ = shift; my ($range, $pname) = split / \s* [;#] \s* /x; # range, property name register_binary_property($pname); # define the property apply_to_range($range, sub { my $point = shift; $point->{$pname} = 1; # set the property }); }); return; } sub break_property { my ($fname, $pname) = @_; enumerated_property("auxiliary/${fname}BreakProperty", $pname, { Other => 0 }, 1); return; } sub grapheme_cluster_break { my ($fname, $pname) = @_; enumerated_property("auxiliary/${fname}BreakProperty", $pname, { # Should not be set to Other for this one ? Other => 0, }, 1); return; } # Make sure we don't assign twice to the same pvalue code sub check_base_for_duplicates { my ($base) = @_; my %seen; for my $key (keys %{$base->{enum}}) { if ($seen{ $base->{enum}->{$key} }) { croak("\nError: assigned twice to the same property value code " . "(Property $base->{name} Both $key and $seen{ $base->{enum}->{$key} }" . " are assigned to pvalue code $base->{enum}->{$key}\n" . Dumper $base->{enum}); } $seen{ ($base->{enum}->{$key}) } = $key; } my $start = 0; for my $key (sort { $base->{enum}->{$a} <=> $base->{enum}->{$b} } keys %{$base->{enum}}) { croak("\nError: property value code is not sequential for property '$base->{name}'." . " Expected $start but saw $base->{enum}->{$key}\n" . Dumper $base->{enum}) if $base->{enum}->{$key} != $start; $start++; } return; } sub derived_property { # filename, property name, property object my ($fname, $pname, $base) = @_; # If we provided some property values already, add that number to the counter my $num_keys = scalar keys %{$base}; # wrap the provided object as the enum key in a new one $base = { enum => $base, name => $pname }; each_line("extracted/Derived$fname", sub { $_ = shift; my ($range, $class) = split / \s* [;#] \s* /x; unless (exists $base->{enum}->{$class}) { # haven't seen this property's value before # add it, and give it an index. print "\n adding derived property for $pname: $num_keys $class" if $DEBUG; $base->{enum}->{$class} = $num_keys++; } }); register_keys_and_set_bit_width($base, $num_keys); return register_enumerated_property($pname, $base); } sub register_keys { my ($base) = @_; my @keys = (); # stash the keys in an array so they can be put in a table later for my $key (keys %{$base->{enum}}) { $keys[$base->{enum}->{$key}] = $key; } print "\n keys = @keys" if $DEBUG; $base->{keys} = \@keys; return scalar(@keys); } sub register_keys_and_set_bit_width { my ($base, $num_keys) = @_; my $reg = register_keys($base); $base->{bit_width} = least_int_ge_lg2($reg); print "\n bitwidth: ", $base->{bit_width}, "\n" if $DEBUG; croak "The number of keys and the number of \$num_keys do not match. Keys: $reg \$num_keys: $num_keys" if (defined $num_keys and $reg != $num_keys); return; } sub enumerated_property { my ($fname, $pname, $base, $value_index, $type, $is_hex) = @_; my $num_keys = scalar keys %{$base}; $type = 'string' unless $type; $base = { enum => $base, name => $pname, type => $type }; each_line($fname, sub { $_ = shift; my @vals = split / \s* [#;] \s* /x; my $range = $vals[0]; my $value = ref $value_index ? $value_index->(\@vals) : $vals[$value_index]; $value = hex $value if $is_hex; my $index = $base->{enum}->{$value}; if (not defined $index) { # Haven't seen this property value before. Add it, and give it an index. print("\n adding enum property for $pname: $num_keys $value") if $DEBUG; ($base->{enum}->{$value} = $index = $num_keys++); } apply_to_range($range, sub { my $point = shift; $point->{$pname} = $index; # set the property's value index }); }); register_keys_and_set_bit_width($base, $num_keys); register_enumerated_property($pname, $base); return; } sub least_int_ge_lg2 { return int(log(shift)/log(2) - 0.00001) + 1; } sub each_line { my ($fname, $fn, $force) = @_; progress("done.\nprocessing $fname.txt..."); for my $line (@{read_file("UNIDATA/$fname.txt")}) { chomp $line; # If it's forced, or it is a proper line (line is not blank and doesn't start with a #) $fn->($line) if $force || $line !~ / ^ (?: [#] | \s* $ ) /x; } return; } sub allocate_bitfield { my ($first_point) = @_; my @biggest = map { $ENUMERATED_PROPERTIES->{$_} } sort { $ENUMERATED_PROPERTIES->{$b}->{bit_width} <=> $ENUMERATED_PROPERTIES->{$a}->{bit_width} } sort keys %$ENUMERATED_PROPERTIES; for (sort keys %$BINARY_PROPERTIES) { push @biggest, $BINARY_PROPERTIES->{$_}; } my $word_offset = 0; my $bit_offset = 0; my $allocated = []; my $index = 1; while (@biggest) { my $i = -1; for(;;) { my $prop = $biggest[++$i]; if (!$prop) { while (@biggest) { # ones bigger than 1 byte :(. Don't prefer these. $prop = shift @biggest; $prop->{word_offset} = $word_offset; $prop->{bit_offset} = $bit_offset; $bit_offset += $prop->{bit_width}; while ($BITFIELD_CELL_BITWIDTH <= $bit_offset) { $word_offset++; $bit_offset -= $BITFIELD_CELL_BITWIDTH; } push @$allocated, $prop; $prop->{field_index} = $index++; } last; } if ($bit_offset + $prop->{bit_width} <= $BITFIELD_CELL_BITWIDTH) { $prop->{word_offset} = $word_offset; $prop->{bit_offset} = $bit_offset; $bit_offset += $prop->{bit_width}; if ($bit_offset == $BITFIELD_CELL_BITWIDTH) { $word_offset++; $bit_offset = 0; } push @$allocated, $prop; splice(@biggest, $i, 1); $prop->{field_index} = $index++; last; } } } $first_point->{bitfield_width} = $word_offset + 1; $H_SECTIONS->{num_property_codes} = "#define MVM_NUM_PROPERTY_CODES $index\n"; return $allocated; } sub compute_properties { my ($fields) = @_; local $| = 1; for my $field (@$fields) { my $bit_offset = $field->{bit_offset}; my $bit_width = $field->{bit_width}; print "\n $field->{name} bit width:$bit_width"; my $i = 0; my $bit = 0; my $mask = 0; while ($bit < $BITFIELD_CELL_BITWIDTH) { $mask |= 2 ** $bit++; } for my $point (@POINTS_SORTED) { if (defined $point->{$field->{name}}) { my $word_offset = $field->{word_offset}; # $x is one less than the number of words required to hold the field my $x = int(($bit_width - 1) / $BITFIELD_CELL_BITWIDTH); # move us over to the last word $word_offset += $x; # loop until we fill all the words, starting with the most # significant byte portion. while ($x + 1) { $point->{bytes}->[ $word_offset - $x ] |= ( ( ($point->{$field->{name}} << ($BITFIELD_CELL_BITWIDTH - $bit_offset - $bit_width) ) #>> ($BITFIELD_CELL_BITWIDTH * $x) ) & $mask ); $x--; } } } } return; } sub emit_binary_search_algorithm { # $extents is arrayref to the heads of the gaps, spans, and # normal stretches of codepoints. $low and $high are the # indexes into $extents we're supposed to subdivide. # protocol: start output with a newline; don't end with a newline or indent my ($extents, $low, $mid, $high, $indent) = @_; #${indent} /* got $low $mid $high */\n"; return emit_extent_fate($extents->[$low], $indent) if $low == $high; $mid = $high if $low == $mid; my $new_mid_high = int(($high + $mid) / 2); my $new_mid_low = int(($mid - 1 + $low) / 2); my $high_str = emit_binary_search_algorithm($extents, $mid, $new_mid_high, $high, " $indent"); my $low_str = emit_binary_search_algorithm($extents, $low, $new_mid_low, $mid - 1, " $indent"); my $rtrn = sprintf( <<"END", $extents->[$mid]->{code}, ($extents->[$mid]->{name} || 'NULL')); ${indent}if (codepoint >= 0x%X) { /* %s */$high_str ${indent}} ${indent}else {$low_str ${indent}} END chomp $rtrn; return $rtrn; } # Constants my $FATE_NORMAL = 0; my $FATE_NULL = 1; my $FATE_SPAN = 2; sub emit_extent_fate { my ($fate, $indent) = @_; my $type = $fate->{fate_type}; return "\n${indent}return -1;" if $type == $FATE_NULL; return "\n${indent}return " . ($fate->{code} - $fate->{fate_offset}) . "; /* ". "$BITFIELD_TABLE->[$fate->{bitfield_index}]->{code_str}". " $BITFIELD_TABLE->[$fate->{bitfield_index}]->{name} */" if $type == $FATE_SPAN; return "\n${indent}return codepoint - $fate->{fate_offset};" . ($fate->{fate_offset} == 0 ? " /* the fast path */ " : ""); } sub add_extent { my ($extents, $extent) = @_; if ($DEBUG) { $LOG .= "\n" . join '', grep { / code | fate | name | bitfield /x } sort(split / ^ /xm, "EXTENT " . Dumper($extent)); } push @$extents, $extent; return; } # Used in emit_codepoints_and_planes to push the codepoints name onto bitfield_index_lines sub ecap_push_name_line { my ($name_lines, $name, $point, $bitfield_index_lines, $bytes, $index, $annotate_anyway) = @_; if (!defined $name) { push @$bitfield_index_lines, ($annotate_anyway ? "/*$$index*/$point->{bitfield_index}/*$point->{code_str} */" : "0" ); push @$name_lines, "NULL"; } else { $$bytes += length($point->{name}) + 1; # length + 1 for the NULL push @$bitfield_index_lines, "/*$$index*/$point->{bitfield_index}/* $point->{code_str} */"; push @$name_lines, "/*$$index*/\"$point->{name}\"/* $point->{code_str} */"; } $$bytes += 2; # hopefully these are compacted since they are trivially aligned being two bytes $$bytes += 8; # 8 for the pointer $$index++; return; } sub emit_codepoints_and_planes { my ($first_point) = @_; my @bitfield_index_lines; my $index = 0; my $bytes = 0; my $bytes_saved = 0; my $code_offset = 0; my $extents = []; my $last_code = -1; # trick my $last_point = undef; $first_point->{fate_type} = $FATE_NORMAL; $first_point->{fate_offset} = $code_offset; add_extent $extents, $first_point; my $span_length = 0; # a bunch of spaghetti code. Yes. my $toadd = undef; my @name_lines; for my $point (@POINTS_SORTED) { # extremely simplistic compression of identical neighbors and gaps # this point is identical to the previous point if ($COMPRESS_CODEPOINTS && $last_point && $last_code == $point->{code} - 1 && is_same($last_point, $point) && $last_point->{bitfield_index} == $point->{bitfield_index}) { # create a or extend the current span ++$last_code; if ($span_length) { ++$span_length; } else { $span_length = 2; } next; } # the span ended, either bridge it or skip it if ($span_length) { if ($SPAN_LENGTH_THRESHOLD <= $span_length) { $bytes_saved += 10 * ($span_length - 1); add_extent $extents, $last_point if !defined($last_point->{fate_type}); $code_offset = $last_point->{code} - @name_lines + 1; $last_point->{fate_type} = $FATE_SPAN; $last_point->{fate_offset} = $code_offset; $last_point->{fate_really} = $last_point->{code} - $code_offset; $code_offset += $span_length - 1; $toadd = $point; $span_length = 0; } my $usually = 1; # occasionally change NULL to the name to cut name search time for (; 1 < $span_length; $span_length--) { # catch up to last code $last_point = $last_point->{next_point}; # occasionally change NULL to the name to cut name search time if ($last_point->{name} =~ / ^ [<] /x && $usually++ % 25) { ecap_push_name_line(\@name_lines, undef, $last_point, \@bitfield_index_lines, \$bytes, \$index, 1); } else { ecap_push_name_line(\@name_lines, $last_point->{name}, $last_point, \@bitfield_index_lines, \$bytes, \$index); } } $span_length = 0; } if ($COMPRESS_CODEPOINTS && $last_code < $point->{code} - ($point->{code} % 0x10000 ? $GAP_LENGTH_THRESHOLD : 1)) { $bytes_saved += 10 * ($point->{code} - $last_code - 1); add_extent $extents, { fate_type => $FATE_NULL, code => $last_code + 1 }; $code_offset += ($point->{code} - $last_code - 1); $last_code = $point->{code} - 1; $toadd = $point; } for (; $last_code < $point->{code} - 1; $last_code++) { ecap_push_name_line(\@name_lines, undef, $point, \@bitfield_index_lines, \$bytes, \$index); } croak "$last_code " . Dumper($point) unless $last_code == $point->{code} - 1; if ($toadd && !exists($point->{fate_type})) { $point->{fate_type} = $FATE_NORMAL; $point->{fate_offset} = $code_offset; $point->{fate_really} = $point->{code} - $code_offset; add_extent $extents, $point; } $toadd = undef; # a normal codepoint that we don't want to compress ecap_push_name_line(\@name_lines, $point->{name}, $point, \@bitfield_index_lines, \$bytes, \$index); $last_code = $point->{code}; $point->{main_index} = $index; $last_point = $point; } print "\nSaved " . thousands($bytes_saved) . " bytes by compressing big gaps into a binary search lookup.\n"; $TOTAL_BYTES_SAVED += $bytes_saved; $ESTIMATED_TOTAL_BYTES += $bytes; # jnthn: Would it still use the same amount of memory to combine these tables? XXX $DB_SECTIONS->{BBB_codepoint_names} = "static const char *codepoint_names[$index] = {\n ". stack_lines(\@name_lines, ",", ",\n ", 0, $WRAP_TO_COLUMNS). "\n};"; $DB_SECTIONS->{BBB_codepoint_bitfield_indexes} = "static const MVMuint16 codepoint_bitfield_indexes[$index] = {\n ". stack_lines(\@bitfield_index_lines, ",", ",\n ", 0, $WRAP_TO_COLUMNS). "\n};"; $H_SECTIONS->{codepoint_names_count} = "#define MVM_CODEPOINT_NAMES_COUNT $index"; if ($DEBUG) { $LOG =~ s/ ( 'fate_really' \s => \s ) (\d+) /$1$name_lines[$2]/xg; } return $extents } sub emit_codepoint_row_lookup { my $extents = shift; my $SMP_start; my $i = 0; for (@$extents) { # handle the first recursion specially to optimize for most common BMP lookups if (0x10000 <= $_->{code}) { $SMP_start = $i; last; } $i++; } my $plane_0 = emit_binary_search_algorithm($extents, 0, 1, $SMP_start - 1, " "); my $other_planes = emit_binary_search_algorithm($extents, $SMP_start, int(($SMP_start + @$extents - 1)/2), @$extents - 1, " "); chomp(my $out = <<'END'); static MVMint32 MVM_codepoint_to_row_index(MVMThreadContext *tc, MVMint64 codepoint) { MVMint32 plane = codepoint >> 16; if (codepoint < 0) { MVM_exception_throw_adhoc(tc, "Internal Error: MVM_codepoint_to_row_index call requested a synthetic codepoint that does not exist.\n" "Requested synthetic %%"PRId64" when only %%"PRId32" have been created.", -codepoint, tc->instance->nfg->num_synthetics); } if (plane == 0) {%s } else { if (plane < 0 || plane > 16 || codepoint > 0x10FFFD) { return -1; } else {%s } } } END return sprintf $out, $plane_0, $other_planes; } sub emit_case_changes { my $point = shift; my @lines = (); my $out = ''; my $rows = 1; while ($point) { unless ($point->{Case_Change_Index}) { $point = $point->{next_point}; next; } push @lines, "/*$rows*/{0x".($point->{suc}||0).",0x".($point->{slc}||0).",0x".($point->{stc}||0)."}/* $point->{code_str} */"; $point = $point->{next_point}; $rows++; } $out = "static const MVMint32 case_changes[$rows][3] = {\n {0x0,0x0,0x0},\n ". stack_lines(\@lines, ",", ",\n ", 0, $WRAP_TO_COLUMNS)."\n};"; return $out; } sub emit_bitfield { my $point = shift; my $wide = $point->{bitfield_width}; my @lines = (); my $out = ''; my $rows = 1; my $line = "{"; my $first = 1; my $i = 0; for (; $i < $wide; ++$i) { $line .= "," unless $first; $first = '0'; $line .= '0'; } push @lines, "$line}"; while ($point) { $line = "/*$rows*/{"; $first = 1; for ($i = 0; $i < $wide; ++$i) { $_ = $point->{bytes}->[$i]; $line .= "," unless $first; $first = 0; $line .= (defined $_ ? $_."u" : 0); } push @$BITFIELD_TABLE, $point; push @lines, ($line . "}/* $point->{code_str} */"); $point = $point->{next_emit_point}; $rows++; } my $bytes_wide = 2; $bytes_wide *= 2 while $bytes_wide < $wide; # assume the worst $ESTIMATED_TOTAL_BYTES += $rows * $bytes_wide; # we hope it's all laid out with no gaps... my $val_type = ($BITFIELD_CELL_BITWIDTH == 8 || $BITFIELD_CELL_BITWIDTH == 16 || $BITFIELD_CELL_BITWIDTH == 32 || $BITFIELD_CELL_BITWIDTH == 64) ? ("MVMuint" . $BITFIELD_CELL_BITWIDTH) : croak("Unknown value of \$BITFIELD_CELL_BITWIDTH: $BITFIELD_CELL_BITWIDTH"); $out = "static const $val_type props_bitfield[$rows][$wide] = {\n ". stack_lines(\@lines, ",", ",\n ", 0, $WRAP_TO_COLUMNS)."\n};"; $DB_SECTIONS->{BBB_main_bitfield} = $out; return; } sub is_str_enum { my ($prop) = @_; return exists $prop->{keys} && (!defined $prop->{type} || $prop->{type} ne 'int'); } sub EPVL_gen_pvalue_defines { my ( $property_name_mvm, $property_name, $short_pval_name ) = @_; my $GCB_h; $GCB_h .= "\n\n/* $property_name_mvm */\n"; my %seen; foreach my $key (sort keys % {$ENUMERATED_PROPERTIES->{$property_name}->{'enum'} } ) { next if $seen{$key}; my $value = $ENUMERATED_PROPERTIES->{$property_name}->{'enum'}->{$key}; $key = 'MVM_UNICODE_PVALUE_' . $short_pval_name . '_' . uc $key; $key =~ tr/\./_/; $GCB_h .= "#define $key $value\n"; $seen{$key} = 1; } return $GCB_h; } sub emit_property_value_lookup { my $allocated = shift; my $enumtables = "\n\n"; my $hout = "typedef enum {\n"; chomp(my $int_out = <<'END'); static MVMint32 MVM_unicode_get_property_int(MVMThreadContext *tc, MVMint64 codepoint, MVMint64 property_code) { MVMuint32 switch_val = (MVMuint32)property_code; MVMint32 result_val = 0; /* we'll never have negatives, but so */ MVMuint32 codepoint_row = MVM_codepoint_to_row_index(tc, codepoint); MVMuint16 bitfield_row; /* If codepoint is not found in bitfield rows */ if (codepoint_row == -1) { /* Unassigned codepoints have General Category Cn. Since this returns 0 * for unknowns, unless we return 1 for property C then these unknows * won't match with <:C> */ if (property_code == MVM_UNICODE_PROPERTY_C) return 1; return 0; } bitfield_row = codepoint_bitfield_indexes[codepoint_row]; switch (switch_val) { case 0: return 0; END chomp(my $str_out = <<'END'); static MVMint32 MVM_codepoint_to_row_index(MVMThreadContext *tc, MVMint64 codepoint); static const char *bogus = ""; /* only for table too short; return null string for no mapping */ static const char* MVM_unicode_get_property_str(MVMThreadContext *tc, MVMint64 codepoint, MVMint64 property_code) { MVMuint32 switch_val = (MVMuint32)property_code; MVMint32 result_val = 0; /* we'll never have negatives, but so */ MVMuint32 codepoint_row = MVM_codepoint_to_row_index(tc, codepoint); MVMuint16 bitfield_row = 0; if (codepoint_row == -1) { /* non-existent codepoint; XXX should throw? */ if (0x10FFFF < codepoint) return ""; result_val = -1; } else { bitfield_row = codepoint_bitfield_indexes[codepoint_row]; } switch (switch_val) { case 0: return ""; END # Checks if it is a 'str' type enum for my $prop (@$allocated) { my $enum = exists $prop->{keys}; my $esize = 0; my $is_int = 0; $is_int = 1 if (defined $prop->{type} and ($prop->{type} eq 'int')); print("\n" . $prop->{name} . " is an integer enum property") if $is_int; if ($enum) { $enum = $prop->{name} . "_enums"; $esize = scalar @{$prop->{keys}}; $enumtables .= $is_int ? "static const int " : "static const char *"; $enumtables .= "$enum\[$esize] = {"; my $format = $is_int ? "\n %s," : "\n \"%s\","; for (@{$prop->{keys}}) { $enumtables .= sprintf($format, $_); } $enumtables .= "\n};\n\n"; } $hout .= " " . uc("MVM_unicode_property_$prop->{name}") . " = $prop->{field_index},\n"; $PROP_NAMES->{$prop->{name}} = $prop->{field_index}; my $case = "\n case " . uc("MVM_unicode_property_$prop->{name}") . ":"; $int_out .= $case; $str_out .= $case if is_str_enum($prop); my $bit_width = $prop->{bit_width}; my $bit_offset = $prop->{bit_offset} // 0; my $word_offset = $prop->{word_offset} // 0; $int_out .= " /* $prop->{name} bits:$bit_width offset:$bit_offset */"; $str_out .= " /* $prop->{name} bits:$bit_width offset:$bit_offset */" if is_str_enum($prop); my $one_word_only = $bit_offset + $bit_width <= $BITFIELD_CELL_BITWIDTH ? 1 : 0; while ($bit_width > 0) { my $original_bit_offset = $bit_offset; my $binary_mask = 0; my $binary_string = ""; my $pos = 0; while ($bit_offset--) { $binary_string .= "0"; $pos++; } while ($pos < $BITFIELD_CELL_BITWIDTH && $bit_width--) { $binary_string .= "1"; $binary_mask += 2 ** ($BITFIELD_CELL_BITWIDTH - 1 - $pos++); } my $shift = $BITFIELD_CELL_BITWIDTH - $pos; while ($pos++ < $BITFIELD_CELL_BITWIDTH) { $binary_string .= "0"; } my $hex_binary_mask = sprintf("%x", $binary_mask); my $props_bitfield_line = "((props_bitfield[bitfield_row][$word_offset] & 0x$hex_binary_mask) >> $shift); /* mask: $binary_string */"; # If it's an int based enum we use the same code as we do for strings # (the function just returns an int from the enum instead of a char *) if ($enum && defined($prop->{type}) && ($prop->{type} eq 'int')) { # XXX todo, remove unneeded variables and jank chomp($int_out .= <<"END"); result_val = $props_bitfield_line return result_val < $esize ? (result_val == -1 ? $enum\[0] : $enum\[result_val]) : 0; END next; } else { my $return_or_resultval = $one_word_only ? 'return' : 'result_val |='; $int_out .= "\n $return_or_resultval $props_bitfield_line"; } $str_out .= "\n result_val |= $props_bitfield_line" if is_str_enum($prop); $word_offset++; $bit_offset = 0; } $int_out .= "\n "; $str_out .= "\n " if is_str_enum($prop); $int_out .= "return result_val;" unless $one_word_only; $str_out .= "return result_val < $esize ? (result_val == -1\n" . " ? $enum\[0] : $enum\[result_val]) : bogus;" if is_str_enum($prop); } my $default_return = <<'END' default: return %s; } } END ; $int_out .= sprintf $default_return, 0; $str_out .= sprintf $default_return, q(""); $hout .= "} MVM_unicode_property_codes;"; $DB_SECTIONS->{MVM_unicode_get_property_int} = $enumtables . $str_out . $int_out; $H_SECTIONS->{property_code_definitions} = $hout; return EPVL_gen_pvalue_defines('MVM_UNICODE_PROPERTY_GENERAL_CATEGORY', 'General_Category', 'GC') . EPVL_gen_pvalue_defines('MVM_UNICODE_PROPERTY_GRAPHEME_CLUSTER_BREAK', 'Grapheme_Cluster_Break', 'GCB') . EPVL_gen_pvalue_defines('MVM_UNICODE_PROPERTY_DECOMPOSITION_TYPE', 'Decomposition_Type', 'DT') . EPVL_gen_pvalue_defines('MVM_UNICODE_PROPERTY_CANONICAL_COMBINING_CLASS', 'Canonical_Combining_Class', 'CCC') . EPVL_gen_pvalue_defines('MVM_UNICODE_PROPERTY_NUMERIC_TYPE', 'Numeric_Type', 'Numeric_Type'); } sub emit_block_lookup { my @blocks; each_line('Blocks', sub { my $line = shift; my ($from, $to, $block_name) = $line =~ / ^ (\w+) .. (\w+) ; \s (.+) /x; if ($from && $to && $block_name) { $block_name =~ s/ [-_\s] //xg; my $alias_name = lc $block_name; my $block_len = length $block_name; my $alias_len = length $alias_name; if ($block_len && $alias_len) { push @blocks, " { 0x$from, 0x$to, \"$block_name\", $block_len, \"$alias_name\", $alias_len }"; } } else { croak "Failed to parse Blocks.txt. Line:\n$line"; } }); my $out = <<'END'; struct UnicodeBlock { MVMGrapheme32 start; MVMGrapheme32 end; char *name; size_t name_len; char *alias; size_t alias_len; }; static struct UnicodeBlock unicode_blocks[] = { END $out .= join(",\n", @blocks) . "\n" . <<'END'; }; static int block_compare(const void *a, const void *b) { MVMGrapheme32 ord = *((MVMGrapheme32 *) a); struct UnicodeBlock *block = (struct UnicodeBlock *) b; if (ord < block->start) { return -1; } else if (ord > block->end) { return 1; } else { return 0; } } MVMint32 MVM_unicode_is_in_block(MVMThreadContext *tc, MVMString *str, MVMint64 pos, MVMString *block_name) { MVMGrapheme32 ord = MVM_string_get_grapheme_at_nocheck(tc, str, pos); MVMuint64 size; char *bname = MVM_string_ascii_encode(tc, block_name, &size, 0); MVMint32 in_block = 0; struct UnicodeBlock *block = bsearch(&ord, unicode_blocks, sizeof(unicode_blocks) / sizeof(struct UnicodeBlock), sizeof(struct UnicodeBlock), block_compare); if (block) { in_block = strncmp(block->name, bname, block->name_len) == 0 || strncmp(block->alias, bname, block->alias_len) == 0; } MVM_free(bname); return in_block; } END chomp $out; $DB_SECTIONS->{block_lookup} = $out; $H_SECTIONS->{block_lookup} = "MVMint32 MVM_unicode_is_in_block(MVMThreadContext *tc, MVMString *str, MVMint64 pos, MVMString *block_name);\n"; return; } sub emit_names_hash_builder { my ($extents) = @_; my $num_extents = scalar(@$extents); my $out = "\nstatic const MVMint32 codepoint_extents[".($num_extents + 1)."][3] = {\n"; $ESTIMATED_TOTAL_BYTES += 4 * 2 * ($num_extents + 1); for my $extent (@$extents) { $out .= sprintf(" {0x%04x,%d,%d},\n", $extent->{code}, $extent->{fate_type}, ($extent->{fate_really}//0)); } $H_SECTIONS->{MVM_NUM_UNICODE_EXTENTS} = "#define MVM_NUM_UNICODE_EXTENTS $num_extents\n"; $out .= <<"END"; {0x10FFFE,0} }; /* Lazily constructed hashtable of Unicode names to codepoints. Okay not to be threadsafe since its value is deterministic and I don't care about the tiny potential for a memory leak in the event of a race condition. */ static MVMUnicodeNameRegistry *codepoints_by_name = NULL; static void generate_codepoints_by_name(MVMThreadContext *tc) { MVMint32 extent_index = 0; MVMint32 codepoint = 0; MVMint32 codepoint_table_index = 0; MVMint16 i = num_unicode_namealias_keypairs - 1; MVMUnicodeNameRegistry *entry; for (; extent_index < MVM_NUM_UNICODE_EXTENTS; extent_index++) { MVMint32 length; codepoint = codepoint_extents[extent_index][0]; length = codepoint_extents[extent_index + 1][0] - codepoint_extents[extent_index][0]; if (codepoint_table_index >= MVM_CODEPOINT_NAMES_COUNT) continue; switch (codepoint_extents[extent_index][1]) { case $FATE_NORMAL: { MVMint32 extent_span_index = 0; codepoint_table_index = codepoint_extents[extent_index][2]; for (; extent_span_index < length && codepoint_table_index < MVM_CODEPOINT_NAMES_COUNT; extent_span_index++) { const char *name = codepoint_names[codepoint_table_index]; if (name) { MVMUnicodeNameRegistry *entry = MVM_malloc(sizeof(MVMUnicodeNameRegistry)); entry->name = (char *)name; entry->codepoint = codepoint; HASH_ADD_KEYPTR(hash_handle, codepoints_by_name, name, strlen(name), entry); } codepoint++; codepoint_table_index++; } break; } case $FATE_NULL: codepoint += length; break; case $FATE_SPAN: { const char *name = codepoint_names[codepoint_table_index]; if (name) { MVMUnicodeNameRegistry *entry = MVM_malloc(sizeof(MVMUnicodeNameRegistry)); entry->name = (char *)name; entry->codepoint = codepoint; HASH_ADD_KEYPTR(hash_handle, codepoints_by_name, name, strlen(name), entry); } codepoint += length; codepoint_table_index++; break; } } } for (; i >= 0; i--) { entry = MVM_malloc(sizeof(MVMUnicodeNameRegistry)); entry->name = uni_namealias_pairs[i].name; entry->codepoint = uni_namealias_pairs[i].codepoint; HASH_ADD_KEYPTR(hash_handle, codepoints_by_name, uni_namealias_pairs[i].name, uni_namealias_pairs[i].strlen, entry); } } END $DB_SECTIONS->{names_hash_builder} = $out; return; } sub emit_unicode_property_keypairs { my $prop_codes = {}; # Add property name aliases to $PROP_NAMES each_line('PropertyAliases', sub { $_ = shift; my @aliases = split / \s* [#;] \s* /x; for my $name (@aliases) { if (exists $PROP_NAMES->{$name}) { for my $al (@aliases) { $prop_codes->{$al} = $name; do_for_each_case($al, sub { $_ = shift; $PROP_NAMES->{$_} = $PROP_NAMES->{$name}; }); } last; } } }); my %aliases; my %lines_h; # Get the aliases to put into Property Name Keypairs each_line('PropertyValueAliases', sub { $_ = shift; # Capture heading lines: `# Bidi_Control (Bidi_C)` # TODO maybe best to get this data from PropertyAliases? # emit_unicode_property_keypairs() in general can be simplified more if (/ ^ [#] \s (\w+) \s [(] (\w+) [)] /x) { $aliases{$2} = [$1]; return; } return if / ^ (?: [#] | \s* $ ) /x; # Return if comment or empty line my @pv_alias_parts = split / \s* [#;] \s* /x; # Since it's the first field in the file, $propname is actually the short # property name. So 'sc' or 'gc' for example (Script, General_Category respectively). my $propname = shift @pv_alias_parts; if (exists $PROP_NAMES->{$propname}) { my $prop_val = $PROP_NAMES->{$propname}; if (($pv_alias_parts[0] eq 'Y' || $pv_alias_parts[0] eq 'N') && ($pv_alias_parts[1] eq 'Yes' || $pv_alias_parts[1] eq 'No')) { for my $name ($propname, @{$aliases{$propname} // []}) { do_for_each_case($name, sub { $_ = shift; return if exists $PROP_NAMES->{$_}; # return because we'll already add # the ones from $PROP_NAMES later $lines_h{$propname}->{$_} = "{\"$_\",$prop_val}"; }); } return } # Orig Line: `gc ; C ; Other # Cc | Cf | Cn | Co | Cs` if ($pv_alias_parts[-1] =~ / [|] /x) { # it's a union # Pop the part after the `#` in the original line off pop @pv_alias_parts; # i.e. `Cc | Cf | Cn | Co | Cs` my $unionname = $pv_alias_parts[0]; # i.e. `C` croak "Couldn't find Binary Property (union) `$unionname`" unless exists $BINARY_PROPERTIES->{$unionname}; $prop_val = $BINARY_PROPERTIES->{$unionname}->{field_index}; for my $alias_part (@pv_alias_parts) { do_for_each_case($alias_part, sub { $_ = shift; return if exists $PROP_NAMES->{$_}; $lines_h{$propname}->{$_} = "{\"$_\",$prop_val}"; }); } } else { for my $alias_part (@pv_alias_parts) { # If the property alias name conflicts with a Property Name # don't put it in %lines_h or it will cause conflicts next if exists $PROP_NAMES->{$alias_part}; $lines_h{$propname}->{$alias_part} = "{\"$alias_part\",$prop_val}"; push @{ $aliases{$propname} }, $alias_part; } } } }, 1); # Fix to ensure space has the same propcode as White_Space $PROP_NAMES->{space} = $PROP_NAMES->{White_Space}; my @lines; my %done; # Copy the keys in $PROP_NAMES first for my $key (sort keys %$PROP_NAMES) { do_for_each_case($key, sub { $_ = shift; $done{$_} ||= push @lines, "{\"$_\",$PROP_NAMES->{$key}}"; }); } # Then copy the rest. Because we use `$done{} ||= push @lines` it will only # push to @lines if it is not in %done already. for my $propname (qw(_custom_ gc sc), sort keys %lines_h) { for (sort keys %{$lines_h{$propname}}) { $done{$_} ||= push @lines, $lines_h{$propname}->{$_}; } } # Make sure General_Category and Script Property values are added first. # These are the only ones (iirc) that are guaranteed in Perl 6. for my $key (qw(gc sc), sort keys %$PROP_NAMES) { for (@{ $aliases{$key} }) { next if $PROP_NAMES->{$_}; do_for_each_case($_, sub { $_ = shift; $done{$_} ||= push @lines, "{\"$_\",$PROP_NAMES->{$key}}"; }); } } # Sort the @lines array so it always appears in the same order @lines = sort @lines; chomp(my $hout = <<'END'); struct MVMUnicodeNamedValue { const char *name; MVMint32 value; }; END $hout .= "#define num_unicode_property_keypairs " . scalar(@lines) . "\n"; my $out = "\nstatic const MVMUnicodeNamedValue unicode_property_keypairs[" . scalar(@lines) . "] = {\n" . " " . stack_lines(\@lines, ",", ",\n ", 0, $WRAP_TO_COLUMNS) . "\n" . "};"; $DB_SECTIONS->{BBB_unicode_property_keypairs} = $out; $H_SECTIONS->{MVMUnicodeNamedValue} = $hout; return $prop_codes; } sub add_unicode_sequence { my ($filename, $named_sequences) = @_; each_line($filename, sub { my $line = shift; return if $line =~ /^ [#] /x or $line =~ /^ \s* $/x; my (@list, $hex_ords, $type, $name); @list = split / ; | \s{3}[#] /x, $line; if ($filename =~ / emoji /x) { $hex_ords = trim shift @list; $type = trim shift @list; $name = trim shift @list; } else { $name = trim shift @list; $hex_ords = trim shift @list; $type = 'NamedSequences'; } #\x{23} => chr 0x24 # It's possible there could be hex unicode digits. In that case convert # to the actual codepoints while ($name =~ / \\x \{ (\d+) \} /x ) { my $chr = chr hex($1); $name =~ s/ \\x \{ $1 \} /$chr/xg; } # Make sure it's uppercase since the Emoji sequences are not all in # uppercase. $name = uc $name; # Emoji sequences have commas in some and these cannot be included # since they seperate seperate named items in ISO notation that P6 uses $name =~ s/,//xg; $named_sequences->{$name}->{'type'} = $type; # Only push if we haven't seen this already if (!$named_sequences->{$name}->{'ords'}) { for my $hex (split ' ', $hex_ords) { push @{$named_sequences->{$name}->{'ords'}}, hex $hex; } } } ); return $named_sequences; } sub emit_unicode_sequence_keypairs { my ($named_sequences) = @_; my $count = 0; my $seq_c_hash_str = ''; my @seq_c_hash_array; my $enum_table; my $string_seq = "/* Unicode sequences such as Emoji sequences */\n"; for my $thing ( sort keys %$named_sequences ) { my $seq_name = "uni_seq_$count"; $string_seq .= "static const MVMint32 $seq_name\[] = {"; $seq_c_hash_str .= '{"' . $thing . '",' . $count . '},'; my $ord_data; for my $ord ( @{$named_sequences->{$thing}->{'ords'}} ) { $ord_data .= sprintf "0x%X,", $ord; } $ord_data = scalar @{$named_sequences->{$thing}->{'ords'}} . ',' . $ord_data; $string_seq .= $ord_data; $ord_data =~ s/ , $ //x; $string_seq =~ s/ , $ //x; $string_seq = $string_seq . "}; " . "/* $thing */ /*" . $named_sequences->{$thing}->{'type'} . " */\n"; $enum_table = $enum_table . "$seq_name,\n"; $count++; if ( length $seq_c_hash_str > 80 ) { push @seq_c_hash_array, $seq_c_hash_str . "\n"; $seq_c_hash_str = ''; } } push @seq_c_hash_array, $seq_c_hash_str . "\n"; $seq_c_hash_str = join ' ', @seq_c_hash_array; $seq_c_hash_str =~ s/ \s* , \s* $ //x; $seq_c_hash_str .= "\n};"; $seq_c_hash_str = "static const MVMUnicodeNamedValue uni_seq_pairs[$count] = {\n $seq_c_hash_str"; $enum_table =~ s/ \s* , \s* $ /};/x; $enum_table = "static const MVMint32 * uni_seq_enum[$count] = {\n" . $enum_table; $DB_SECTIONS->{uni_seq} = $seq_c_hash_str . $string_seq . $enum_table; return "#define num_unicode_seq_keypairs $count \n"; } sub gen_name_alias_keypairs { my $count = 0; my $seq_c_hash_str; my @seq_c_hash_array; for my $thing ( sort keys %$ALIAS_TYPES ) { my $ord_data; my $ord = $ALIAS_TYPES->{$thing}->{'code'}; $ord_data .= sprintf '0x%X,', $ord; $seq_c_hash_str .= qq({"$thing",$ord_data) . length($thing) . '},'; $ord_data =~ s/ , $ //x; my $type = $ALIAS_TYPES->{$thing}->{'type'}; $count++; if ( length $seq_c_hash_str > 80 ) { push @seq_c_hash_array, $seq_c_hash_str . "\n"; $seq_c_hash_str = ''; } } push @seq_c_hash_array, "$seq_c_hash_str\n"; $seq_c_hash_str = join ' ', @seq_c_hash_array; $seq_c_hash_str =~ s/ \s* , \s* $ //x; chomp($DB_SECTIONS->{Auni_namealias} = <<"END"); /* Unicode Name Aliases */ static const MVMUnicodeNamedAlias uni_namealias_pairs[$count] = { $seq_c_hash_str }; END return <<"END" #define num_unicode_namealias_keypairs $count struct MVMUnicodeNamedAlias { char *name; MVMGrapheme32 codepoint; MVMint16 strlen; }; typedef struct MVMUnicodeNamedAlias MVMUnicodeNamedAlias; END } sub set_lines_for_each_case { my ($default, $propname, $prop_val, $hash, $maybe_propcode) = @_; my $propcode = $maybe_propcode // $PROP_NAMES->{$propname} // $PROP_NAMES->{$default} // croak; # Workaround to 'space' not getting added here $hash->{$propname}->{space} = "{\"$propcode-space\",$prop_val}" if $default eq 'White_Space' and $propname eq '_custom_'; do_for_each_case($default, sub { $_ = shift; $hash->{$propname}->{$_} = "{\"$propcode-$_\",$prop_val}"; }); return $propcode; } sub do_for_each_case { my ($str, $sub) = @_; my $str2 = $str; $sub->($str); # Foo_Bar (original) $sub->($str) if $str =~ s/_//xg; # FooBar $sub->($str) if $str =~ y/A-Z/a-z/; # foobar $sub->($str2) if $str2 =~ y/A-Z/a-z/; # foo_bar return $str; } sub emit_unicode_property_value_keypairs { my ($prop_codes) = @_; my @lines = (); my $property; my %lines; my %aliases; for my $property (sort keys %$BINARY_PROPERTIES) { my $prop_val = ($PROP_NAMES->{$property} << 24) + 1; my $propcode = set_lines_for_each_case($property, '_custom_', $prop_val, \%lines); my $lc_thing = lc $property; my %stuff = ( c => ['Other'], l => ['Letter'], m => ['Mark', 'Combining_Mark'], n => ['Number'], p => ['Punctuation', 'punct'], s => ['Symbol'], z => ['Separator'] ); if (defined $stuff{$lc_thing}) { for my $t (@{$stuff{$lc_thing}}) { set_lines_for_each_case($t, '_custom_', $prop_val, \%lines, $propcode) } } } for (sort keys %$ENUMERATED_PROPERTIES) { my $enum = $ENUMERATED_PROPERTIES->{$_}->{enum}; my $toadd = {}; for (sort keys %$enum) { my $key = lc $_; $key =~ s/[-_\s]/./xg; $toadd->{$key} = $enum->{$_}; } for (sort keys %$toadd) { $enum->{$_} = $toadd->{$_}; } } croak "lines didn't get anything in it" if !%lines; my %done; each_line('PropertyValueAliases', sub { $_ = shift; if (/ ^ [#] \s (\w+) \s [(] (\w+) [)] /x) { $aliases{$2} = $1; return } return if / ^ (?: [#] | \s* $ ) /x; my @pv_alias_parts = split(/ \s* [#;] \s* /x); for my $part (@pv_alias_parts) { $part = trim($part); croak if $part =~ / [;] /x; } my $propname = shift @pv_alias_parts; $propname = trim $propname; if (exists $PROP_NAMES->{$propname}) { my $prop_val = $PROP_NAMES->{$propname} << 24; # emit binary properties if (($pv_alias_parts[0] eq 'Y' || $pv_alias_parts[0] eq 'N') && ($pv_alias_parts[1] eq 'Yes' || $pv_alias_parts[1] eq 'No')) { $prop_val++; # one bit width for ($propname, ($aliases{$propname} // ())) { set_lines_for_each_case($_, $propname, $prop_val, \%lines); } return } if ($pv_alias_parts[-1] =~ /\|/x) { # it's a union pop @pv_alias_parts; my $unionname = $pv_alias_parts[0]; if (exists $BINARY_PROPERTIES->{$unionname}) { my $prop_val = $BINARY_PROPERTIES->{$unionname}->{field_index} << 24; my $value = $BINARY_PROPERTIES->{$unionname}->{bit_width}; for my $i (@pv_alias_parts) { set_lines_for_each_case($i, $propname, $prop_val + $value, \%lines); do_for_each_case($i, sub { $_ = shift; $done{"$propname$_"} = push @lines, $lines{$propname}->{$_}; }); $_ = $i; # For the conditional / ^ letter $ /x below } croak Dumper($propname) if / ^ letter $ /x; } return } my $key = $prop_codes->{$propname}; my $found = 0; my $enum = $ALL_PROPERTIES->{$key}->{'enum'}; croak $propname unless $enum; my $value; for (@pv_alias_parts) { my $alias = $_; $alias =~ s/[-_\s]/./xg; $alias = lc($alias); if (exists $enum->{$alias}) { $value = $enum->{$alias}; last; } } unless (defined $value) { print "\nNote: couldn't resolve property $propname property value alias (you can disregard this for now)."; return; } for (@pv_alias_parts) { s/[-\s]/./xg; next if /[.|]/x; set_lines_for_each_case($_, $propname, $prop_val + $value, \%lines); } } }, 1); # Aliases like L appear in several categories, but we prefere gc and sc. for my $propname (qw(_custom_ gc sc), sort keys %lines) { for (sort keys %{$lines{$propname}}) { $done{"$propname$_"} ||= push @lines, $lines{$propname}->{$_}; } } my $out = "\nstatic MVMUnicodeNameRegistry **unicode_property_values_hashes;\n" . "static const MVMUnicodeNamedValue unicode_property_value_keypairs[" . scalar(@lines) . "] = {\n" . " " . stack_lines(\@lines, ",", ",\n ", 0, $WRAP_TO_COLUMNS) . "\n" . "};"; $DB_SECTIONS->{BBB_unicode_property_value_keypairs} = $out; return "\n#define num_unicode_property_value_keypairs " . scalar(@lines) . "\n"; } sub emit_composition_lookup { # Build 3-level sparse array [plane][upper][lower] keyed on bits from the # first codepoint of the decomposition of a primary composite, mapped to # an array of [second codepoint, primary composite]. my @lookup; for my $point_code (sort { $a <=> $b } keys %$POINTS_BY_CODE) { # Not interested in anything in the set of full composition exclusions. my $point = $POINTS_BY_CODE->{$point_code}; next if $point->{Full_Composition_Exclusion}; # Only interested in things that have a decomposition spec. next unless defined $point->{Decomp_Spec}; my $decomp_spec = $ENUMERATED_PROPERTIES->{Decomp_Spec}->{keys}->[$point->{Decomp_Spec}]; # Only interested in canonical decompositions. my $decomp_type = $ENUMERATED_PROPERTIES->{Decomposition_Type}->{keys}->[$point->{Decomposition_Type}]; next unless $decomp_type eq 'Canonical'; # Make an entry. my @decomp = split / \s+ /x, $decomp_spec; croak "Canonical decomposition only supports two codepoints" unless @decomp == 2; my $plane = 0; if (length($decomp[0]) == 5) { $plane = hex(substr($decomp[0], 0, 1)); $decomp[0] = substr($decomp[0], 1); } elsif (length($decomp[0]) != 4) { croak "Invalid codepoint " . $decomp[0] } my ($upper, $lower) = (hex(substr($decomp[0], 0, 2)), hex(substr($decomp[0], 2, 2))); push @{$lookup[$plane]->[$upper]->[$lower]}, hex($decomp[1]), $point_code; } # Produce sparse lookup tables. my $entry_idx = 0; my $l_table_idx = 0; my $u_table_idx = 0; my $entries = ''; my $l_tables = 'static const MVMint32 *comp_l_empty[] = {' . ('NULL,' x 256) . "};\n"; my $u_tables = 'static const MVMint32 **comp_u_empty[] = {' . ('comp_l_empty,' x 256) . "};\n"; my $p_table = 'static const MVMint32 ***comp_p[] = {'; for (my $p = 0; $p < 17; $p++) { unless ($lookup[$p]) { $p_table .= 'comp_u_empty,'; next; } my $u_table_name = 'comp_u_' . $u_table_idx++; $u_tables .= 'static const MVMint32 **' . $u_table_name . '[] = {'; for (my $u = 0; $u < 256; $u++) { unless ($lookup[$p]->[$u]) { $u_tables .= 'comp_l_empty,'; next; } my $l_table_name = 'comp_l_' . $l_table_idx++; $l_tables .= 'static const MVMint32 *' . $l_table_name . '[] = {'; for (my $l = 0; $l < 256; $l++) { if ($lookup[$p]->[$u]->[$l]) { my @values = @{$lookup[$p]->[$u]->[$l]}; my $entry_name = 'comp_entry_' . $entry_idx++; $entries .= 'static const MVMint32 ' . $entry_name . '[] = {'; $entries .= join(',', scalar(@values), @values) . "};\n"; $l_tables .= $entry_name . ','; } else { $l_tables .= 'NULL,'; } } $l_tables .= "};\n"; $u_tables .= $l_table_name . ','; } $u_tables .= "};\n"; $p_table .= $u_table_name . ','; } $p_table .= "};\n"; # Put it all together and emit. my $tables = "$entries\n$l_tables\n$u_tables\n$p_table"; $DB_SECTIONS->{composition_lookup} = "\n/* Canonical composition lookup tables. */\n$tables"; return; } sub compute_bitfield { my $point = shift; my $index = 1; my $prophash = {}; my $last_point = undef; my $bytes_saved = 0; while ($point) { my $line = ''; $line .= '.'.(defined $_ ? $_ : 0) for @{$point->{bytes}}; my $refer; if (defined($refer = $prophash->{$line})) { $bytes_saved += 20; $point->{bitfield_index} = $refer->{bitfield_index}; } else { $point->{bitfield_index} = $index++; $prophash->{$line} = $point; $last_point->{next_emit_point} = $point if $last_point; $last_point = $point; } $point = $point->{next_point}; } $TOTAL_BYTES_SAVED += $bytes_saved; print "\nSaved ".thousands($bytes_saved)." bytes by uniquing the bitfield table.\n"; return; } sub header { my @readme = @{read_file("UNIDATA/ReadMe.txt")}; my $lines; for my $line (@readme) { last if $line !~ /^\s*[#]/; $lines .= $line; } my $header = <<'EOF'; /* DO NOT MODIFY THIS FILE! YOU WILL LOSE YOUR CHANGES! This file is generated by ucd2c.pl from the Unicode database. From ReadMe.txt in the Unicode Database Sources this file was generated from: %s From http://unicode.org/copyright.html#Exhibit1 on 2017-11-28: COPYRIGHT AND PERMISSION NOTICE Copyright © 1991-2017 Unicode, Inc. All rights reserved. Distributed under the Terms of Use in http://www.unicode.org/copyright.html. Permission is hereby granted, free of charge, to any person obtaining a copy of the Unicode data files and any associated documentation (the "Data Files") or Unicode software and any associated documentation (the "Software") to deal in the Data Files or Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, and/or sell copies of the Data Files or Software, and to permit persons to whom the Data Files or Software are furnished to do so, provided that either (a) this copyright and permission notice appear with all copies of the Data Files or Software, or (b) this copyright and permission notice appear in associated Documentation. THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA FILES OR SOFTWARE. Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in these Data Files or Software without prior written authorization of the copyright holder. */ #include "moar.h" EOF return sprintf($header, $lines); } sub read_file { my $fname = shift; open my $FILE, '<', $fname or croak "Couldn't open file '$fname': $!"; binmode $FILE, ':encoding(UTF-8)'; my @lines = (); while( <$FILE> ) { push @lines, $_; } close $FILE; return \@lines; } sub write_file { my ($fname, $contents) = @_; open my $FILE, '>', $fname or croak "Couldn't open file '$fname': $!"; binmode $FILE, ':encoding(UTF-8)'; print $FILE trim_trailing($contents); close $FILE; return; } sub register_union { my ($unionname, $unionof, $gc_alias_checkers) = @_; register_binary_property($unionname); push @$gc_alias_checkers, sub { return ((shift) =~ /^(?:$unionof)$/) ? "$unionname" : 0; }; return; } sub UnicodeData { my ($bidi_classes, $general_categories, $ccclasses) = @_; $GENERAL_CATEGORIES = $general_categories; register_binary_property('Any'); my @gc_alias_checkers; each_line('PropertyValueAliases', sub { $_ = shift; my @pv_alias_parts = split / \s* [#;] \s* /x; # Make sure everything is trimmed for my $part (@pv_alias_parts) { $part = trim $part; } my $propname = shift @pv_alias_parts; return if ($pv_alias_parts[0] eq 'Y' || $pv_alias_parts[0] eq 'N') && ($pv_alias_parts[1] eq 'Yes' || $pv_alias_parts[1] eq 'No'); if ($pv_alias_parts[-1] =~ /[|]/x) { # it's a union my $unionname = $pv_alias_parts[0]; my $unionof = pop @pv_alias_parts; $unionof =~ s/ \s+ //xg; register_union($unionname, $unionof, \@gc_alias_checkers); } }); register_union('Assigned', 'C[cfosn]|L[lmotu]|M[cen]|N[dlo]|P[cdefios]|S[ckmo]|Z[lps]', \@gc_alias_checkers); my $ideograph_start; my $case_count = 1; my $decomp_keys = [ '' ]; my $decomp_index = 1; my $s = sub { $_ = shift; my ($code_str, $name, $gencat, $ccclass, $bidiclass, $decmpspec, $num1, $num2, $num3, $bidimirrored, $u1name, $isocomment, $suc, $slc, $stc) = split ';'; my $code = hex $code_str; my $plane_num = $code >> 16; if ($name eq '' ) { $name = sprintf '', $code; } my $point = get_next_point($code, 1); my $hashy = { # Unicode_1_Name is not used yet. We should make sure it ends up # in some data structure eventually Unicode_1_Name => $u1name, name => $name, gencat_name => $gencat, General_Category => $general_categories->{enum}->{$gencat}, Canonical_Combining_Class => $ccclasses->{enum}->{$ccclass}, Bidi_Class => $bidi_classes->{enum}->{$bidiclass}, suc => $suc, slc => $slc, stc => $stc, }; for my $key (sort keys %$hashy) { $point->{$key} = $hashy->{$key}; } $point->{Bidi_Mirrored} = 1 if $bidimirrored eq 'Y'; if ($decmpspec) { $decmpspec =~ s/ [<] \w+ [>] \s+ //x; $point->{Decomp_Spec} = $decomp_index; $decomp_keys->[$decomp_index++] = $decmpspec; } if ($suc || $slc || $stc) { $point->{Case_Change_Index} = $case_count++; } for my $checker (@gc_alias_checkers) { my $res = $checker->($gencat); $point->{$res} = 1 if $res; } if ($name =~ /(Ideograph|Syllable|Private|Surrogate) (\s|.)*? First/x) { $ideograph_start = $point; $point->{name} =~ s/, First//; } elsif ($ideograph_start) { $point->{name} = $ideograph_start->{name}; my $current = $ideograph_start; for (my $count = $ideograph_start->{code} + 1; $count < $point->{code}; $count++) { $current = get_next_point($count, 1); for (sort keys %$ideograph_start) { next if $_ eq "code" || $_ eq "code_str"; $current->{$_} = $ideograph_start->{$_}; } } $ideograph_start = 0; } }; each_line('UnicodeData', $s); $s->("110000;Out of Range;Cn;0;L;;;;;N;;;;;"); register_enumerated_property('Case_Change_Index', { name => 'Case_Change_Index', bit_width => least_int_ge_lg2($case_count) }); register_enumerated_property('Decomp_Spec', { name => 'Decomp_Spec', 'keys' => $decomp_keys, bit_width => least_int_ge_lg2($decomp_index) }); return; } sub is_same { my ($point_1, $point_2) = @_; my %things; # Return early by simply checking the name. If the names match or don't # exist, we need to do more work to determine if the points are equal if (defined $point_1->{name} and defined $point_2->{name} and $point_1->{name} ne $point_2->{name}) { return 0; } for my $key (keys %$point_1, keys %$point_2) { $things{$key} = 1; } for my $key (keys %things) { next if $key eq 'code' || $key eq 'code_str' || $key eq 'next_point' || $key eq 'main_index' || $key eq 'next_emit_point' || $key eq 'bytes' || $key eq 'bitfield_index' || $key eq 'fate_type' || $key eq 'fate_really' || $key eq 'fate_offset'; unless (defined $point_1->{$key} && defined $point_2->{$key} && $point_1->{$key} eq $point_2->{$key}) { return 0; } } return 1; } sub CaseFolding { my $simple_count = 1; my $grows_count = 1; my @simple; my @grows; each_line('CaseFolding', sub { $_ = shift; my ($left_str, $type, $right) = split / \s* ; \s* /x; my $left_code = hex $left_str; return if $type eq 'S' || $type eq 'T'; if ($type eq 'C') { push @simple, $right; $POINTS_BY_CODE->{$left_code}->{Case_Folding} = $simple_count; $simple_count++; $POINTS_BY_CODE->{$left_code}->{Case_Folding_simple} = 1; } else { my @parts = split ' ', $right; push @grows, "{0x".($parts[0]).",0x".($parts[1] || 0).",0x".($parts[2] || 0)."}"; $POINTS_BY_CODE->{$left_code}->{Case_Folding} = $grows_count; $grows_count++; } }); my $simple_out = "static const MVMint32 CaseFolding_simple_table[$simple_count] = {\n 0x0,\n 0x" .stack_lines(\@simple, ",0x", ",\n 0x", 0, $WRAP_TO_COLUMNS)."\n};"; my $grows_out = "static const MVMint32 CaseFolding_grows_table[$grows_count][3] = {\n {0x0,0x0,0x0},\n " .stack_lines(\@grows, ",", ",\n ", 0, $WRAP_TO_COLUMNS)."\n};"; my $bit_width = least_int_ge_lg2($simple_count); # XXX surely this will always be greater? my $index_base = { name => 'Case_Folding', bit_width => $bit_width }; register_enumerated_property('Case_Folding', $index_base); register_binary_property('Case_Folding_simple'); $ESTIMATED_TOTAL_BYTES += $simple_count * 8 + $grows_count * 32; # XXX guessing 32 here? $DB_SECTIONS->{BBB_CaseFolding_simple} = $simple_out; $DB_SECTIONS->{BBB_CaseFolding_grows} = $grows_out; return; } sub SpecialCasing { my $count = 1; my @entries; each_line('SpecialCasing', sub { $_ = shift; s/ [#] .+ //x; my ($code_str, $lower, $title, $upper, $cond) = split / \s* ; \s* /x; my $code = hex $code_str; return if $cond; sub threesome { my @things = split ' ', shift; push @things, 0 while @things < 3; return join(", ", map { "0x$_" } @things); } push @entries, "{ { " . threesome($upper) . " }, { " . threesome($lower) . " }, { " . threesome($title) . " } }"; $POINTS_BY_CODE->{$code}->{Special_Casing} = $count; $count++; }); my $out = "static const MVMint32 SpecialCasing_table[$count][3][3] = {\n {0x0,0x0,0x0},\n " .stack_lines(\@entries, ",", ",\n ", 0, $WRAP_TO_COLUMNS)."\n};"; my $bit_width = least_int_ge_lg2($count); my $index_base = { name => 'Special_Casing', bit_width => $bit_width }; register_enumerated_property('Special_Casing', $index_base); $ESTIMATED_TOTAL_BYTES += $count * 4 * 3 * 3; $DB_SECTIONS->{BBB_SpecialCasing} = $out; return; } sub DerivedNormalizationProps { my $binary = { Full_Composition_Exclusion => 1, Changes_When_NFKC_Casefolded => 1 }; my $inverted_binary = { NFD_QC => 1, NFKD_QC => 1 }; register_binary_property($_) for ((sort keys %$binary),(sort keys %$inverted_binary)); my $trinary = { NFC_QC => 1, NFKC_QC => 1, NFG_QC => 1, }; my $trinary_values = { 'N' => 0, 'Y' => 1, 'M' => 2 }; register_enumerated_property($_, { enum => $trinary_values, bit_width => 2, 'keys' => ['N','Y','M'] }) for sort keys %$trinary; each_line('DerivedNormalizationProps', sub { $_ = shift; my ($range, $property_name, $value) = split / \s* [;#] \s* /x; if (exists $binary->{$property_name}) { $value = 1; } elsif (exists $inverted_binary->{$property_name}) { $value = undef; } elsif (exists $trinary->{$property_name}) { $value = $trinary_values->{$value}; } elsif ($property_name eq 'NFKC_Casefold') { # XXX see how this differs from CaseFolding.txt # my @parts = split ' ', $value; # $value = \@parts; } else { return; # deprecated } apply_to_range($range, sub { my $point = shift; $point->{$property_name} = $value; }); # If it's the NFC_QC property, then use this as the default value for # NFG_QC also. if ($property_name eq 'NFC_QC') { apply_to_range($range, sub { my $point = shift; $point->{'NFG_QC'} = $value; }); } }); return; } sub Jamo { my $propname = 'Jamo_Short_Name'; each_line('Jamo', sub { $_ = shift; my ($code_str, $name) = split / \s* [#;] \s* /x; apply_to_range($code_str, sub { my $point = shift; $point->{Jamo_Short_Name} = $name; }); }); my @hangul_syllables; for my $key (sort keys %{$POINTS_BY_CODE}) { if ($POINTS_BY_CODE->{$key}->{name} and $POINTS_BY_CODE->{$key}->{name} eq '') { push @hangul_syllables, $key; } } my $hs = join ',', @hangul_syllables; my $out = `perl6 -e 'my \@cps = $hs; for \@cps -> \$cp { \$cp.chr.NFD.list.join(",").say };'`; my @out_lines = split "\n", $out; my $i = 0; for my $line (@out_lines) { my $final_name = 'Hangul Syllable '; my $hs_cps = $hangul_syllables[$i++]; my @a = split ',', $line; for my $cp (@a) { if (exists %{$POINTS_BY_CODE}{$cp}->{Jamo_Short_Name}) { $final_name .= %{$POINTS_BY_CODE}{$cp}->{Jamo_Short_Name}; } } %{$POINTS_BY_CODE}{$hs_cps}->{name} = $final_name; } return; } sub collation_get_check_index { my ($index, $property, $base, $value) = @_; my $indexy = $base->{enum}->{$value}; # haven't seen this property value before # add it, and give it an index. print("\n adding enum property for property: $property j: " . $index->{$property}->{j} . "value: $value") if $DEBUG and not defined $indexy; ($base->{enum}->{$value} = $indexy = ($index->{$property}->{j}++)) unless defined $indexy; return $indexy; } sub collation { my ($index, $maxes, $bases) = ( {}, {}, {} ); my ($name_primary, $name_secondary, $name_tertiary) = ('MVM_COLLATION_PRIMARY', 'MVM_COLLATION_SECONDARY', 'MVM_COLLATION_TERTIARY'); for my $name ($name_primary, $name_secondary, $name_tertiary) { my $base = $bases->{$name} = { enum => { 0 => 0 }, name => $name, type => 'int' }; $index->{$base->{name}}->{j} = keys(%{$base->{enum}}); $maxes->{$base->{name}} = 0; } ## Sample line from allkeys.txt #1D4FF ; [.1EE3.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL V my $line_no = 0; each_line('UCA/allkeys', sub { $_ = shift; my $line = $_; $line_no++; my ($code, $temp); my $weights = {}; # implicit weights are handled in ./tools/Generate-Collation-Data.p6 return if $line =~ s/ ^ \@implicitweights \s+ //xms; return if $line =~ / ^ \s* [#@] /x or $line =~ / ^ \s* $ /x; # Blank/comment lines ($code, $temp) = split / [;#]+ /x, $line; $code = trim $code; my @codes = split ' ', $code; # We support collation for multiple codepoints in ./tools/Generate-Collation-Data.p6 if (1 < @codes) { # For now set MVM_COLLATION_QC = 0 for these cp apply_to_range($codes[0], sub { my $point = shift; $point->{'MVM_COLLATION_QC'} = 0; }); return; } # We capture the `.` or `*` before each weight. Currently we do # not use this information, but it may be of use later (we currently # don't put their values into the data structure. # When multiple tables are specified for a character, it is because those # are the composite values for the decomposed character. Since we compare # in NFC form not NFD, let's add these together. while ($temp =~ / (:? \[ ([.*]) (\p{AHex}+) ([.*]) (\p{AHex}+) ([.*]) (\p{AHex}+) \] ) /xmsg) { $weights->{$name_primary} += hex $3; $weights->{$name_secondary} += hex $5; $weights->{$name_tertiary} += hex $7; } if (!defined $code || !defined $weights->{$name_primary} || !defined $weights->{$name_secondary} || !defined $weights->{$name_tertiary}) { my $str; for my $name ($name_primary, $name_secondary, $name_tertiary) { $str .= "\$weights->{$name} = " . $weights->{$name} . ", "; } croak "Line no $line_no: \$line = $line, $str"; } apply_to_range($code, sub { my $point = shift; my $raws = {}; for my $base ($bases->{$name_primary}, $bases->{$name_secondary}, $bases->{$name_tertiary}) { my $name = $base->{name}; # Add one to the value so we can distinguish between specified values # of zero for collation weight and null values. $raws->{$name} = 1; if ($weights->{$name}) { $raws->{$name} += $weights->{$name}; $maxes->{$name} = $weights->{$name} if $weights->{$name} > $maxes->{$name}; } #$point->{$base->{name}} = collation_get_check_index($index, $base->{name}, $base, $raws->{$base->{name}}); # Uncomment to make it an int enum $point->{$base->{name}} = $raws->{$base->{name}}; # Comment to make it an int enum } }); }); # Add 0 to a non-character just to make sure it ends up assigned to some codepoint # (or it may not properly end up in the enum) apply_to_range("FFFF", sub { my $point = shift; $point->{$name_tertiary} = 0; }); for my $base ($bases->{$name_primary}, $bases->{$name_secondary}, $bases->{$name_tertiary}) { #register_enumerated_property($base->{name}, $base); # Uncomment to make an int enum #register_keys_and_set_bit_width($base, $index->{$base->{name}}->{j}); # Uncomment to make an int enum register_int_property($base->{name}, $maxes->{$base->{name}}); # Comment to make an int enum croak("Oh no! One of the highest collation numbers I saw is less than 1. Something is wrong" . "Primary max: " . $maxes->{$name_primary} . " secondary max: " . $maxes->{$name_secondary} . " tertiary_max: " . $maxes->{$name_tertiary}) if $maxes->{$base->{name}} < 1; } register_binary_property('MVM_COLLATION_QC'); return; } sub NameAliases { each_line('NameAliases', sub { $_ = shift; my ($code_str, $name, $type) = split / \s* [;#] \s* /x; $ALIASES->{$name} = hex $code_str; $ALIAS_TYPES->{$name}->{'code'} = hex $code_str; $ALIAS_TYPES->{$name}->{'type'} = $type; }); return; } sub tweak_nfg_qc { # See http://www.unicode.org/reports/tr29/tr29-27.html#Grapheme_Cluster_Boundary_Rules for my $point (values %$POINTS_BY_CODE) { my $code = $point->{'code'}; if ($code == 0x0D # \r || $point->{'Hangul_Syllable_Type'} # Hangul || ($code >= 0x1F1E6 && $code <= 0x1F1FF) # Regional indicators || $code == 0x200D # Zero Width Joiner || $point->{'Grapheme_Extend'} # Grapheme_Extend || $point->{'Grapheme_Cluster_Break'} # Grapheme_Cluster_Break || $point->{'Prepended_Concatenation_Mark'} # Prepended_Concatenation_Mark || $point->{'gencat_name'} && $point->{'gencat_name'} eq 'Mc' # Spacing_Mark || $code == 0x0E33 || $code == 0x0EB3 # Some specials ) { $point->{'NFG_QC'} = 0; } # For now set all Emoji to NFG_QC 0 # Eventually we will only want to set the ones that are NOT specified # as ZWJ sequences XXX elsif ($point->{'Emoji'}) { $point->{'NFG_QC'} = 0; } } return; } sub register_binary_property { my $name = shift; $ALL_PROPERTIES->{$name} = $BINARY_PROPERTIES->{$name} = { property_index => $PROPERTY_INDEX++, name => $name, bit_width => 1 } unless exists $BINARY_PROPERTIES->{$name}; return; } sub register_int_property { my ( $name, $elems ) = @_; # add to binary_properties for now $ALL_PROPERTIES->{$name} = $BINARY_PROPERTIES->{$name} = { property_index => $PROPERTY_INDEX++, name => $name, bit_width => least_int_ge_lg2($elems) } unless exists $BINARY_PROPERTIES->{$name}; return; } sub register_enumerated_property { my ($pname, $base) = @_; if (!defined $base->{name} || !$base->{name}) { $base->{name} = $pname; #croak("\n\$base->{name} not set for property '$pname'"); } elsif ($pname ne $base->{name}) { croak("name doesn't match. Argument was '$pname' but was already set to '" . $base->{name}); } check_base_for_duplicates($base); croak if exists $ENUMERATED_PROPERTIES->{$pname}; $ALL_PROPERTIES->{$pname} = $ENUMERATED_PROPERTIES->{$pname} = $base; $base->{property_index} = $PROPERTY_INDEX++; return $base } main(); # vim: ft=perl6 expandtab sw=4 MoarVM-2018.03/tools/update-gh-pages.sh0000755000175000017510000000575313237701105017666 0ustar samanthasamantha#!/usr/bin/env bash # Adapted from script by Domenic Denicola # Creative Commons Zero v1.0 Universal # https://github.com/domenic/zones/blob/master/ # and here # https://gist.github.com/domenic/ec8b0fc8ab45f39403dd TARGET_BRANCH="gh-pages" set -x if [ "$TRAVIS_PULL_REQUEST" != "false" ] || [ "$TRAVIS_BRANCH" != "$TARGET_BRANCH" ]; then printf "Starting to update %s\n" "$TARGET_BRANCH" # Save some useful information REPO=$(git config remote.origin.url) #SSH_REPO=${REPO/https:\/\/github.com\//git@github.com:} SSH_REPO='git@github.com:MoarVM/coverage.git' SHA=$(git rev-parse --verify HEAD) #copy data we're interested in to other place mkdir -p "$HOME/staging" # Do MoarVM specific code here # -------------------------------- if [ "$TRAVIS_BRANCH" = 'master' ]; then cp -R $TRAVIS_BUILD_DIR/html-cov/* "$HOME/staging" else mkdir -p "$HOME/staging/$TRAVIS_BRANCH" cp -R $TRAVIS_BUILD_DIR/html-cov/* "$HOME/staging/${TRAVIS_BRANCH}" fi COMMIT_MSG="$(printf "Travis №%s built from %s %s" "$TRAVIS_BUILD_NUMBER" "$TRAVIS_BRANCH" "$(cd $TRAVIS_BUILD_DIR >/dev/null && git describe)")" # END MoarVM specific code # ----------------------------- #go to home and setup git cd -- "$HOME" || echo "Couldn't cd into $HOME"; git config --global user.name "Travis CI" #git config user.email "$COMMIT_AUTHOR_EMAIL" git config --global user.email "travis@travis-ci.org" #git config --global user.name "Travis" git clone -v $SSH_REPO $TARGET_BRANCH mkdir -p gh-pages cd gh-pages git checkout $TARGET_BRANCH || git checkout --orphan $TARGET_BRANCH # Copy our files from staging to the repo cp -Rf $HOME/staging/* . #if [ -z `git diff --exit-code` ]; then # printf "No changes to the output on this push; exiting.\n" # exit 0 #fi #add, commit and push files ls -lh make_index () { $TRAVIS_BUILD_DIR/tools/make-index.sh > ./file-index.html ; } make_index sed -e 's|

Coverage Report

|

Coverage Report for libmoar, commit id '$SHA'

|' < libmoar/index.html > libmoar_index.html sed -e 's|

Coverage Report

|

Coverage Report for moar, commit id '$SHA'

|' < moar/index.html > moar_index.html sed -e 's|||' < libmoar_index.html > libmoar_index_head_and_content.html sed -e 's|.*||' < moar_index.html > moar_index_content_and_tail.html rm libmoar_index.html rm moar_index.html cp libmoar/style.css . sed --in-place -e "s|href='coverage/home/|href='libmoar/coverage/home/|g" libmoar_index_head_and_content.html sed --in-place -e "s|href='coverage/home/|href='moar/coverage/home/|g" moar_index_content_and_tail.html cat libmoar_index_head_and_content.html moar_index_content_and_tail.html > index.html rm libmoar_index_head_and_content.html rm moar_index_content_and_tail.html git add -fv . git commit -m "$COMMIT_MSG" && \ git pull --rebase --ff-only && \ git push -fv origin $TARGET_BRANCH echo "Done magic with push" fi MoarVM-2018.03/tools/update_ops.p60000755000175000017510000002342413242626641016773 0ustar samanthasamantha#!/usr/bin/env perl6 # This script processes the op list into a C header file that contains # info about the opcodes. constant $EXT_BASE = 1024; constant $EXT_CU_LIMIT = 1024; class Op { has $.code; has $.name; has $.mark; has @.operands; has %.adverbs; } sub MAIN($file = "src/core/oplist") { # Parse the ops file to get the various ops. my @ops = parse_ops($file); say "Parsed {+@ops} total ops from src/core/oplist"; # Generate header file. my $hf = open("src/core/ops.h", :w); $hf.say("/* This file is generated from $file by tools/update_ops.p6. */"); $hf.say(""); $hf.say(opcode_defines(@ops)); $hf.say("#define MVM_OP_EXT_BASE $EXT_BASE"); $hf.say("#define MVM_OP_EXT_CU_LIMIT $EXT_CU_LIMIT"); $hf.say(''); $hf.say('MVM_PUBLIC const MVMOpInfo * MVM_op_get_op(unsigned short op);'); $hf.close; # Generate C file my $cf = open("src/core/ops.c", :w); $cf.say('#include "moar.h"'); $cf.say("/* This file is generated from $file by tools/update_ops.p6. */"); $cf.say(opcode_details(@ops)); $cf.say('MVM_PUBLIC const MVMOpInfo * MVM_op_get_op(unsigned short op) {'); $cf.say(' if (op >= MVM_op_counts)'); $cf.say(' return NULL;'); $cf.say(' return &MVM_op_infos[op];'); $cf.say('}'); $cf.close; # Generate cgoto labels header. my $lf = open('src/core/oplabels.h', :w); $lf.say("/* This file is generated from $file by tools/update_ops.p6. */"); $lf.say(""); $lf.say(op_labels(@ops)); $lf.close; my %op_constants = op_constants(@ops); # Generate NQP Ops file. my $nf = open("lib/MAST/Ops.nqp", :w); $nf.say("# This file is generated from $file by tools/update_ops.p6."); $nf.say(""); $nf.say(%op_constants); $nf.close; # Generate a p6 Ops file into the tools directory my $pf = open("tools/lib/MAST/Ops.pm", :w); $pf.say("# This file is generated from $file by tools/update_ops.p6."); $pf.say(""); $pf.say(%op_constants); $pf.close; say "Wrote src/core/ops.h, src/core/ops.c, src/core/oplabels.h, tools/lib/MAST/Ops.pm, and lib/MAST/Ops.nqp"; } # Parses ops and produces a bunch of Op objects. sub parse_ops($file) { my @ops; my int $i = 0; for lines($file.IO) -> $line { if $line !~~ /^\s*['#'|$]/ { my ($name, $mark, @operands) = $line.split(/\s+/); # Look for validation mark. unless $mark && $mark ~~ /^ <[:.+*-]> \w $/ { @operands.unshift($mark) if $mark; $mark = ' '; } # Look for operands that are actually adverbs. my %adverbs; while @operands && @operands[*-1] ~~ /^ ':' (\w+) $/ { %adverbs{$0} = 1; @operands.pop; } @ops.push(Op.new( code => $i, name => $name, mark => $mark, operands => @operands, adverbs => %adverbs )); $i = $i + 1; } } return @ops; } my $value_map = { 'MVM_operand_literal' => 0, 'MVM_operand_read_reg' => 1, 'MVM_operand_write_reg' => 2, 'MVM_operand_read_lex' => 3, 'MVM_operand_write_lex' => 4, 'MVM_operand_rw_mask' => 7, 'MVM_reg_int8' => 1, 'MVM_reg_int16' => 2, 'MVM_reg_int32' => 3, 'MVM_reg_int64' => 4, 'MVM_reg_num32' => 5, 'MVM_reg_num64' => 6, 'MVM_reg_str' => 7, 'MVM_reg_obj' => 8, 'MVM_reg_uint8' => 17, 'MVM_reg_uint16' => 18, 'MVM_reg_uint32' => 19, 'MVM_reg_uint64' => 20, 'MVM_operand_int8' => 8, 'MVM_operand_int16' => 16, 'MVM_operand_int32' => 24, 'MVM_operand_int64' => 32, 'MVM_operand_num32' => 40, 'MVM_operand_num64' => 48, 'MVM_operand_str' => 56, 'MVM_operand_obj' => 64, 'MVM_operand_ins' => 72, 'MVM_operand_type_var' => 80, 'MVM_operand_lex_outer' => 88, 'MVM_operand_coderef' => 96, 'MVM_operand_callsite' => 104, 'MVM_operand_type_mask' => 120, 'MVM_operand_spesh_slot' => 128, 'MVM_operand_uint8' => 136, 'MVM_operand_uint16' => 144, 'MVM_operand_uint32' => 152, 'MVM_operand_uint64' => 160 }; # Generates MAST::Ops constants module. sub op_constants(@ops) { my @offsets; my @counts; my @values; my $values_idx = 0; for @ops -> $op { my $last_idx = $values_idx; @offsets.push($values_idx); for $op.operands.map(&operand_flags_values) -> $operand { @values.push($operand); $values_idx++; } @counts.push($values_idx - $last_idx); } return ( NQP => ' class MAST::Ops {} BEGIN { MAST::Ops.WHO<@offsets> := nqp::list_i('~ join(",\n ", @offsets)~'); MAST::Ops.WHO<@counts> := nqp::list_i('~ join(",\n ", @counts)~'); MAST::Ops.WHO<@values> := nqp::list_i('~ join(",\n ", @values)~'); MAST::Ops.WHO<%codes> := nqp::hash('~ join(",\n ", @ops.map({ "'$_.name()', $_.code()" }))~'); MAST::Ops.WHO<@names> := nqp::list_s('~ join(",\n ", @ops.map({ "'$_.name()'" }))~'); }', P6 => ' unit module MAST::Ops; our %flags is export = ('~ join(",\n ", $value_map.pairs.sort(*.value).map({ $_.perl }) )~'); our @offsets is export = '~ join(",\n ", @offsets)~'; our @counts = '~ join(",\n ", @counts)~'; our @values is export = '~ join(",\n ", @values)~'; our %codes is export = '~ join(",\n ", @ops.map({ "'$_.name()', $_.code()" }))~'; our @names is export = '~ join(",\n ", @ops.map({ "'$_.name()'" }))~'; ', ).hash; } # Generate labels for cgoto dispatch sub op_labels(@ops) { my @labels = @ops.map({ sprintf('&&OP_%s', $_.name) }); my @padding = 'NULL' xx $EXT_BASE - @ops; my @extlabels = '&&OP_CALL_EXTOP' xx $EXT_CU_LIMIT; return "static const void * const LABELS[] = \{\n { join(",\n ", @labels, @padding, @extlabels) }\n\};"; } # Creates the #defines for the ops. sub opcode_defines(@ops) { join "\n", gather { take "/* Op name defines. */"; for @ops -> $op { take "#define MVM_OP_$op.name() $op.code()"; } take ""; } } # Creates the static array of opcode info. sub opcode_details(@ops) { join "\n", gather { take "static const MVMOpInfo MVM_op_infos[] = \{"; for @ops -> $op { take " \{"; take " MVM_OP_$op.name(),"; take " \"$op.name()\","; take " \"$op.mark()\","; take " $op.operands.elems(),"; take " $($op.adverbs ?? '1' !! '0'),"; take " $( ($op.adverbs ?? 1 !! 0) + ($op.adverbs ?? 2 !! 0) + ($op.adverbs ?? 4 !! 0) + ($op.adverbs ?? 8 !! 0)),"; take " $($op.adverbs ?? '1' !! '0'),"; take " $($op.adverbs ?? '1' !! '0'),"; take " $(($op.adverbs ?? 1 !! 0) + ($op.adverbs ?? 2 !! 0)),"; take " $($op.adverbs ?? '1' !! '0'),"; if $op.operands { take " \{ $op.operands.map(&operand_flags).join(', ') }"; } #else { take " \{ }"; } take " }," } take "};\n"; take "static const unsigned short MVM_op_counts = {+@ops};\n"; } } # Figures out the various flags for an operand type. grammar OperandFlag { token TOP { | '(' [ | ] ')' | | } token rw { < rl wl r w > } token type { < int8 int16 int32 int64 num32 num64 str obj uint8 uint16 uint32 uint64 > } token type_var { '`1' } token special { < ins lo coderef callsite sslot > } } my %rwflags = ( r => 'MVM_operand_read_reg', w => 'MVM_operand_write_reg', rl => 'MVM_operand_read_lex', wl => 'MVM_operand_write_lex' ); sub operand_flags($operand) { if OperandFlag.parse($operand) -> (:$rw, :$type, :$type_var, :$special) { if $rw { %rwflags{$rw} ~ ' | ' ~ ($type ?? "MVM_operand_$type" !! 'MVM_operand_type_var') } elsif $type { "MVM_operand_$type" } elsif $special eq 'ins' { 'MVM_operand_ins' } elsif $special eq 'lo' { 'MVM_operand_lex_outer' } elsif $special eq 'coderef' { 'MVM_operand_coderef' } elsif $special eq 'callsite' { 'MVM_operand_callsite' } elsif $special eq 'sslot' { 'MVM_operand_spesh_slot' } else { die "Failed to process operand '$operand'"; } } else { die "Cannot parse operand '$operand'"; } } sub operand_flags_values($operand) { if OperandFlag.parse($operand) -> (:$rw, :$type, :$type_var, :$special) { if $rw { $value_map{%rwflags{$rw}} +| $value_map{($type ?? "MVM_operand_$type" !! 'MVM_operand_type_var')} } elsif $type { $value_map{"MVM_operand_$type"} } elsif $special eq 'ins' { $value_map{'MVM_operand_ins'} } elsif $special eq 'lo' { $value_map{'MVM_operand_lex_outer'} } elsif $special eq 'coderef' { $value_map{'MVM_operand_coderef'} } elsif $special eq 'callsite' { $value_map{'MVM_operand_callsite'} } elsif $special eq 'sslot' { $value_map{'MVM_operand_spesh_slot'} } else { die "Failed to process operand '$operand'"; } } else { die "Cannot parse operand '$operand'"; } } MoarVM-2018.03/3rdparty/dynasm/.gitignore0000644000175000017510000000004213237701103020227 0ustar samanthasamanthaminilua minilua.exe minilua.dSYM/ MoarVM-2018.03/3rdparty/dynasm/COPYRIGHT0000644000175000017510000000232413237701103017537 0ustar samanthasamanthaDynASM. A dynamic assembler for code generation engines. http://luajit.org/dynasm.html Copyright (C) 2005-2014 Mike Pall. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. [ MIT license: http://www.opensource.org/licenses/mit-license.php ]MoarVM-2018.03/3rdparty/dynasm/dasm_arm.h0000644000175000017510000003215713237701235020215 0ustar samanthasamantha/* ** DynASM ARM encoding engine. ** Copyright (C) 2005-2015 Mike Pall. All rights reserved. ** Released under the MIT license. See dynasm.lua for full copyright notice. */ #include #include #include #include #define DASM_ARCH "arm" #ifndef DASM_EXTERN #define DASM_EXTERN(a,b,c,d) 0 #endif /* Action definitions. */ enum { DASM_STOP, DASM_SECTION, DASM_ESC, DASM_REL_EXT, /* The following actions need a buffer position. */ DASM_ALIGN, DASM_REL_LG, DASM_LABEL_LG, /* The following actions also have an argument. */ DASM_REL_PC, DASM_LABEL_PC, DASM_IMM, DASM_IMM12, DASM_IMM16, DASM_IMML8, DASM_IMML12, DASM_IMMV8, DASM__MAX }; /* Maximum number of section buffer positions for a single dasm_put() call. */ #define DASM_MAXSECPOS 25 /* DynASM encoder status codes. Action list offset or number are or'ed in. */ #define DASM_S_OK 0x00000000 #define DASM_S_NOMEM 0x01000000 #define DASM_S_PHASE 0x02000000 #define DASM_S_MATCH_SEC 0x03000000 #define DASM_S_RANGE_I 0x11000000 #define DASM_S_RANGE_SEC 0x12000000 #define DASM_S_RANGE_LG 0x13000000 #define DASM_S_RANGE_PC 0x14000000 #define DASM_S_RANGE_REL 0x15000000 #define DASM_S_UNDEF_LG 0x21000000 #define DASM_S_UNDEF_PC 0x22000000 /* Macros to convert positions (8 bit section + 24 bit index). */ #define DASM_POS2IDX(pos) ((pos)&0x00ffffff) #define DASM_POS2BIAS(pos) ((pos)&0xff000000) #define DASM_SEC2POS(sec) ((sec)<<24) #define DASM_POS2SEC(pos) ((pos)>>24) #define DASM_POS2PTR(D, pos) (D->sections[DASM_POS2SEC(pos)].rbuf + (pos)) /* Action list type. */ typedef const unsigned int *dasm_ActList; /* Per-section structure. */ typedef struct dasm_Section { int *rbuf; /* Biased buffer pointer (negative section bias). */ int *buf; /* True buffer pointer. */ size_t bsize; /* Buffer size in bytes. */ int pos; /* Biased buffer position. */ int epos; /* End of biased buffer position - max single put. */ int ofs; /* Byte offset into section. */ } dasm_Section; /* Core structure holding the DynASM encoding state. */ struct dasm_State { size_t psize; /* Allocated size of this structure. */ dasm_ActList actionlist; /* Current actionlist pointer. */ int *lglabels; /* Local/global chain/pos ptrs. */ size_t lgsize; int *pclabels; /* PC label chains/pos ptrs. */ size_t pcsize; void **globals; /* Array of globals (bias -10). */ dasm_Section *section; /* Pointer to active section. */ size_t codesize; /* Total size of all code sections. */ int maxsection; /* 0 <= sectionidx < maxsection. */ int status; /* Status code. */ dasm_Section sections[1]; /* All sections. Alloc-extended. */ }; /* The size of the core structure depends on the max. number of sections. */ #define DASM_PSZ(ms) (sizeof(dasm_State)+(ms-1)*sizeof(dasm_Section)) /* Initialize DynASM state. */ void dasm_init(Dst_DECL, int maxsection) { dasm_State *D; size_t psz = 0; int i; Dst_REF = NULL; DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection)); D = Dst_REF; D->psize = psz; D->lglabels = NULL; D->lgsize = 0; D->pclabels = NULL; D->pcsize = 0; D->globals = NULL; D->maxsection = maxsection; for (i = 0; i < maxsection; i++) { D->sections[i].buf = NULL; /* Need this for pass3. */ D->sections[i].rbuf = D->sections[i].buf - DASM_SEC2POS(i); D->sections[i].bsize = 0; D->sections[i].epos = 0; /* Wrong, but is recalculated after resize. */ } } /* Free DynASM state. */ void dasm_free(Dst_DECL) { dasm_State *D = Dst_REF; int i; for (i = 0; i < D->maxsection; i++) if (D->sections[i].buf) DASM_M_FREE(Dst, D->sections[i].buf, D->sections[i].bsize); if (D->pclabels) DASM_M_FREE(Dst, D->pclabels, D->pcsize); if (D->lglabels) DASM_M_FREE(Dst, D->lglabels, D->lgsize); DASM_M_FREE(Dst, D, D->psize); } /* Setup global label array. Must be called before dasm_setup(). */ void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl) { dasm_State *D = Dst_REF; D->globals = gl - 10; /* Negative bias to compensate for locals. */ DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int)); } /* Grow PC label array. Can be called after dasm_setup(), too. */ void dasm_growpc(Dst_DECL, unsigned int maxpc) { dasm_State *D = Dst_REF; size_t osz = D->pcsize; DASM_M_GROW(Dst, int, D->pclabels, D->pcsize, maxpc*sizeof(int)); memset((void *)(((unsigned char *)D->pclabels)+osz), 0, D->pcsize-osz); } /* Setup encoder. */ void dasm_setup(Dst_DECL, const void *actionlist) { dasm_State *D = Dst_REF; int i; D->actionlist = (dasm_ActList)actionlist; D->status = DASM_S_OK; D->section = &D->sections[0]; memset((void *)D->lglabels, 0, D->lgsize); if (D->pclabels) memset((void *)D->pclabels, 0, D->pcsize); for (i = 0; i < D->maxsection; i++) { D->sections[i].pos = DASM_SEC2POS(i); D->sections[i].ofs = 0; } } #ifdef DASM_CHECKS #define CK(x, st) \ do { if (!(x)) { \ D->status = DASM_S_##st|(p-D->actionlist-1); return; } } while (0) #define CKPL(kind, st) \ do { if ((size_t)((char *)pl-(char *)D->kind##labels) >= D->kind##size) { \ D->status = DASM_S_RANGE_##st|(p-D->actionlist-1); return; } } while (0) #else #define CK(x, st) ((void)0) #define CKPL(kind, st) ((void)0) #endif static int dasm_imm12(unsigned int n) { int i; for (i = 0; i < 16; i++, n = (n << 2) | (n >> 30)) if (n <= 255) return (int)(n + (i << 8)); return -1; } /* Pass 1: Store actions and args, link branches/labels, estimate offsets. */ void dasm_put(Dst_DECL, int start, ...) { va_list ap; dasm_State *D = Dst_REF; dasm_ActList p = D->actionlist + start; dasm_Section *sec = D->section; int pos = sec->pos, ofs = sec->ofs; int *b; if (pos >= sec->epos) { DASM_M_GROW(Dst, int, sec->buf, sec->bsize, sec->bsize + 2*DASM_MAXSECPOS*sizeof(int)); sec->rbuf = sec->buf - DASM_POS2BIAS(pos); sec->epos = (int)sec->bsize/sizeof(int) - DASM_MAXSECPOS+DASM_POS2BIAS(pos); } b = sec->rbuf; b[pos++] = start; va_start(ap, start); while (1) { unsigned int ins = *p++; unsigned int action = (ins >> 16); if (action >= DASM__MAX) { ofs += 4; } else { int *pl, n = action >= DASM_REL_PC ? va_arg(ap, int) : 0; switch (action) { case DASM_STOP: goto stop; case DASM_SECTION: n = (ins & 255); CK(n < D->maxsection, RANGE_SEC); D->section = &D->sections[n]; goto stop; case DASM_ESC: p++; ofs += 4; break; case DASM_REL_EXT: break; case DASM_ALIGN: ofs += (ins & 255); b[pos++] = ofs; break; case DASM_REL_LG: n = (ins & 2047) - 10; pl = D->lglabels + n; /* Bkwd rel or global. */ if (n >= 0) { CK(n>=10||*pl<0, RANGE_LG); CKPL(lg, LG); goto putrel; } pl += 10; n = *pl; if (n < 0) n = 0; /* Start new chain for fwd rel if label exists. */ goto linkrel; case DASM_REL_PC: pl = D->pclabels + n; CKPL(pc, PC); putrel: n = *pl; if (n < 0) { /* Label exists. Get label pos and store it. */ b[pos] = -n; } else { linkrel: b[pos] = n; /* Else link to rel chain, anchored at label. */ *pl = pos; } pos++; break; case DASM_LABEL_LG: pl = D->lglabels + (ins & 2047) - 10; CKPL(lg, LG); goto putlabel; case DASM_LABEL_PC: pl = D->pclabels + n; CKPL(pc, PC); putlabel: n = *pl; /* n > 0: Collapse rel chain and replace with label pos. */ while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = pos; } *pl = -pos; /* Label exists now. */ b[pos++] = ofs; /* Store pass1 offset estimate. */ break; case DASM_IMM: case DASM_IMM16: #ifdef DASM_CHECKS CK((n & ((1<<((ins>>10)&31))-1)) == 0, RANGE_I); if ((ins & 0x8000)) CK(((n + (1<<(((ins>>5)&31)-1)))>>((ins>>5)&31)) == 0, RANGE_I); else CK((n>>((ins>>5)&31)) == 0, RANGE_I); #endif b[pos++] = n; break; case DASM_IMMV8: CK((n & 3) == 0, RANGE_I); n >>= 2; case DASM_IMML8: case DASM_IMML12: CK(n >= 0 ? ((n>>((ins>>5)&31)) == 0) : (((-n)>>((ins>>5)&31)) == 0), RANGE_I); b[pos++] = n; break; case DASM_IMM12: CK(dasm_imm12((unsigned int)n) != -1, RANGE_I); b[pos++] = n; break; } } } stop: va_end(ap); sec->pos = pos; sec->ofs = ofs; } #undef CK /* Pass 2: Link sections, shrink aligns, fix label offsets. */ int dasm_link(Dst_DECL, size_t *szp) { dasm_State *D = Dst_REF; int secnum; int ofs = 0; #ifdef DASM_CHECKS *szp = 0; if (D->status != DASM_S_OK) return D->status; { int pc; for (pc = 0; pc*sizeof(int) < D->pcsize; pc++) if (D->pclabels[pc] > 0) return DASM_S_UNDEF_PC|pc; } #endif { /* Handle globals not defined in this translation unit. */ int idx; for (idx = 20; idx*sizeof(int) < D->lgsize; idx++) { int n = D->lglabels[idx]; /* Undefined label: Collapse rel chain and replace with marker (< 0). */ while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = -idx; } } } /* Combine all code sections. No support for data sections (yet). */ for (secnum = 0; secnum < D->maxsection; secnum++) { dasm_Section *sec = D->sections + secnum; int *b = sec->rbuf; int pos = DASM_SEC2POS(secnum); int lastpos = sec->pos; while (pos != lastpos) { dasm_ActList p = D->actionlist + b[pos++]; while (1) { unsigned int ins = *p++; unsigned int action = (ins >> 16); switch (action) { case DASM_STOP: case DASM_SECTION: goto stop; case DASM_ESC: p++; break; case DASM_REL_EXT: break; case DASM_ALIGN: ofs -= (b[pos++] + ofs) & (ins & 255); break; case DASM_REL_LG: case DASM_REL_PC: pos++; break; case DASM_LABEL_LG: case DASM_LABEL_PC: b[pos++] += ofs; break; case DASM_IMM: case DASM_IMM12: case DASM_IMM16: case DASM_IMML8: case DASM_IMML12: case DASM_IMMV8: pos++; break; } } stop: (void)0; } ofs += sec->ofs; /* Next section starts right after current section. */ } D->codesize = ofs; /* Total size of all code sections */ *szp = ofs; return DASM_S_OK; } #ifdef DASM_CHECKS #define CK(x, st) \ do { if (!(x)) return DASM_S_##st|(p-D->actionlist-1); } while (0) #else #define CK(x, st) ((void)0) #endif /* Pass 3: Encode sections. */ int dasm_encode(Dst_DECL, void *buffer) { dasm_State *D = Dst_REF; char *base = (char *)buffer; unsigned int *cp = (unsigned int *)buffer; int secnum; /* Encode all code sections. No support for data sections (yet). */ for (secnum = 0; secnum < D->maxsection; secnum++) { dasm_Section *sec = D->sections + secnum; int *b = sec->buf; int *endb = sec->rbuf + sec->pos; while (b != endb) { dasm_ActList p = D->actionlist + *b++; while (1) { unsigned int ins = *p++; unsigned int action = (ins >> 16); int n = (action >= DASM_ALIGN && action < DASM__MAX) ? *b++ : 0; switch (action) { case DASM_STOP: case DASM_SECTION: goto stop; case DASM_ESC: *cp++ = *p++; break; case DASM_REL_EXT: n = DASM_EXTERN(Dst, (unsigned char *)cp, (ins&2047), !(ins&2048)); goto patchrel; case DASM_ALIGN: ins &= 255; while ((((char *)cp - base) & ins)) *cp++ = 0xe1a00000; break; case DASM_REL_LG: CK(n >= 0, UNDEF_LG); case DASM_REL_PC: CK(n >= 0, UNDEF_PC); n = *DASM_POS2PTR(D, n) - (int)((char *)cp - base) - 4; patchrel: if ((ins & 0x800) == 0) { CK((n & 3) == 0 && ((n+0x02000000) >> 26) == 0, RANGE_REL); cp[-1] |= ((n >> 2) & 0x00ffffff); } else if ((ins & 0x1000)) { CK((n & 3) == 0 && -256 <= n && n <= 256, RANGE_REL); goto patchimml8; } else if ((ins & 0x2000) == 0) { CK((n & 3) == 0 && -4096 <= n && n <= 4096, RANGE_REL); goto patchimml; } else { CK((n & 3) == 0 && -1020 <= n && n <= 1020, RANGE_REL); n >>= 2; goto patchimml; } break; case DASM_LABEL_LG: ins &= 2047; if (ins >= 20) D->globals[ins-10] = (void *)(base + n); break; case DASM_LABEL_PC: break; case DASM_IMM: cp[-1] |= ((n>>((ins>>10)&31)) & ((1<<((ins>>5)&31))-1)) << (ins&31); break; case DASM_IMM12: cp[-1] |= dasm_imm12((unsigned int)n); break; case DASM_IMM16: cp[-1] |= ((n & 0xf000) << 4) | (n & 0x0fff); break; case DASM_IMML8: patchimml8: cp[-1] |= n >= 0 ? (0x00800000 | (n & 0x0f) | ((n & 0xf0) << 4)) : ((-n & 0x0f) | ((-n & 0xf0) << 4)); break; case DASM_IMML12: case DASM_IMMV8: patchimml: cp[-1] |= n >= 0 ? (0x00800000 | n) : (-n); break; default: *cp++ = ins; break; } } stop: (void)0; } } if (base + D->codesize != (char *)cp) /* Check for phase errors. */ return DASM_S_PHASE; return DASM_S_OK; } #undef CK /* Get PC label offset. */ int dasm_getpclabel(Dst_DECL, unsigned int pc) { dasm_State *D = Dst_REF; if (pc*sizeof(int) < D->pcsize) { int pos = D->pclabels[pc]; if (pos < 0) return *DASM_POS2PTR(D, -pos); if (pos > 0) return -1; /* Undefined. */ } return -2; /* Unused or out of range. */ } #ifdef DASM_CHECKS /* Optional sanity checker to call between isolated encoding steps. */ int dasm_checkstep(Dst_DECL, int secmatch) { dasm_State *D = Dst_REF; if (D->status == DASM_S_OK) { int i; for (i = 1; i <= 9; i++) { if (D->lglabels[i] > 0) { D->status = DASM_S_UNDEF_LG|i; break; } D->lglabels[i] = 0; } } if (D->status == DASM_S_OK && secmatch >= 0 && D->section != &D->sections[secmatch]) D->status = DASM_S_MATCH_SEC|(D->section-D->sections); return D->status; } #endif MoarVM-2018.03/3rdparty/dynasm/dasm_arm.lua0000644000175000017510000010344613237701103020541 0ustar samanthasamantha------------------------------------------------------------------------------ -- DynASM ARM module. -- -- Copyright (C) 2005-2015 Mike Pall. All rights reserved. -- See dynasm.lua for full copyright notice. ------------------------------------------------------------------------------ -- Module information: local _info = { arch = "arm", description = "DynASM ARM module", version = "1.3.0", vernum = 10300, release = "2011-05-05", author = "Mike Pall", license = "MIT", } -- Exported glue functions for the arch-specific module. local _M = { _info = _info } -- Cache library functions. local type, tonumber, pairs, ipairs = type, tonumber, pairs, ipairs local assert, setmetatable, rawget = assert, setmetatable, rawget local _s = string local sub, format, byte, char = _s.sub, _s.format, _s.byte, _s.char local match, gmatch, gsub = _s.match, _s.gmatch, _s.gsub local concat, sort, insert = table.concat, table.sort, table.insert local bit = bit or require("bit") local band, shl, shr, sar = bit.band, bit.lshift, bit.rshift, bit.arshift local ror, tohex = bit.ror, bit.tohex -- Inherited tables and callbacks. local g_opt, g_arch local wline, werror, wfatal, wwarn -- Action name list. -- CHECK: Keep this in sync with the C code! local action_names = { "STOP", "SECTION", "ESC", "REL_EXT", "ALIGN", "REL_LG", "LABEL_LG", "REL_PC", "LABEL_PC", "IMM", "IMM12", "IMM16", "IMML8", "IMML12", "IMMV8", } -- Maximum number of section buffer positions for dasm_put(). -- CHECK: Keep this in sync with the C code! local maxsecpos = 25 -- Keep this low, to avoid excessively long C lines. -- Action name -> action number. local map_action = {} for n,name in ipairs(action_names) do map_action[name] = n-1 end -- Action list buffer. local actlist = {} -- Argument list for next dasm_put(). Start with offset 0 into action list. local actargs = { 0 } -- Current number of section buffer positions for dasm_put(). local secpos = 1 ------------------------------------------------------------------------------ -- Dump action names and numbers. local function dumpactions(out) out:write("DynASM encoding engine action codes:\n") for n,name in ipairs(action_names) do local num = map_action[name] out:write(format(" %-10s %02X %d\n", name, num, num)) end out:write("\n") end -- Write action list buffer as a huge static C array. local function writeactions(out, name) local nn = #actlist if nn == 0 then nn = 1; actlist[0] = map_action.STOP end out:write("static const unsigned int ", name, "[", nn, "] = {\n") for i = 1,nn-1 do assert(out:write("0x", tohex(actlist[i]), ",\n")) end assert(out:write("0x", tohex(actlist[nn]), "\n};\n\n")) end ------------------------------------------------------------------------------ -- Add word to action list. local function wputxw(n) assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range") actlist[#actlist+1] = n end -- Add action to list with optional arg. Advance buffer pos, too. local function waction(action, val, a, num) local w = assert(map_action[action], "bad action name `"..action.."'") wputxw(w * 0x10000 + (val or 0)) if a then actargs[#actargs+1] = a end if a or num then secpos = secpos + (num or 1) end end -- Flush action list (intervening C code or buffer pos overflow). local function wflush(term) if #actlist == actargs[1] then return end -- Nothing to flush. if not term then waction("STOP") end -- Terminate action list. wline(format("dasm_put(Dst, %s);", concat(actargs, ", ")), true) actargs = { #actlist } -- Actionlist offset is 1st arg to next dasm_put(). secpos = 1 -- The actionlist offset occupies a buffer position, too. end -- Put escaped word. local function wputw(n) if n <= 0x000fffff then waction("ESC") end wputxw(n) end -- Reserve position for word. local function wpos() local pos = #actlist+1 actlist[pos] = "" return pos end -- Store word to reserved position. local function wputpos(pos, n) assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range") if n <= 0x000fffff then insert(actlist, pos+1, n) n = map_action.ESC * 0x10000 end actlist[pos] = n end ------------------------------------------------------------------------------ -- Global label name -> global label number. With auto assignment on 1st use. local next_global = 20 local map_global = setmetatable({}, { __index = function(t, name) if not match(name, "^[%a_][%w_]*$") then werror("bad global label") end local n = next_global if n > 2047 then werror("too many global labels") end next_global = n + 1 t[name] = n return n end}) -- Dump global labels. local function dumpglobals(out, lvl) local t = {} for name, n in pairs(map_global) do t[n] = name end out:write("Global labels:\n") for i=20,next_global-1 do out:write(format(" %s\n", t[i])) end out:write("\n") end -- Write global label enum. local function writeglobals(out, prefix) local t = {} for name, n in pairs(map_global) do t[n] = name end out:write("enum {\n") for i=20,next_global-1 do out:write(" ", prefix, t[i], ",\n") end out:write(" ", prefix, "_MAX\n};\n") end -- Write global label names. local function writeglobalnames(out, name) local t = {} for name, n in pairs(map_global) do t[n] = name end out:write("static const char *const ", name, "[] = {\n") for i=20,next_global-1 do out:write(" \"", t[i], "\",\n") end out:write(" (const char *)0\n};\n") end ------------------------------------------------------------------------------ -- Extern label name -> extern label number. With auto assignment on 1st use. local next_extern = 0 local map_extern_ = {} local map_extern = setmetatable({}, { __index = function(t, name) -- No restrictions on the name for now. local n = next_extern if n > 2047 then werror("too many extern labels") end next_extern = n + 1 t[name] = n map_extern_[n] = name return n end}) -- Dump extern labels. local function dumpexterns(out, lvl) out:write("Extern labels:\n") for i=0,next_extern-1 do out:write(format(" %s\n", map_extern_[i])) end out:write("\n") end -- Write extern label names. local function writeexternnames(out, name) out:write("static const char *const ", name, "[] = {\n") for i=0,next_extern-1 do out:write(" \"", map_extern_[i], "\",\n") end out:write(" (const char *)0\n};\n") end ------------------------------------------------------------------------------ -- Arch-specific maps. -- Ext. register name -> int. name. local map_archdef = { sp = "r13", lr = "r14", pc = "r15", } -- Int. register name -> ext. name. local map_reg_rev = { r13 = "sp", r14 = "lr", r15 = "pc", } local map_type = {} -- Type name -> { ctype, reg } local ctypenum = 0 -- Type number (for Dt... macros). -- Reverse defines for registers. function _M.revdef(s) return map_reg_rev[s] or s end local map_shift = { lsl = 0, lsr = 1, asr = 2, ror = 3, } local map_cond = { eq = 0, ne = 1, cs = 2, cc = 3, mi = 4, pl = 5, vs = 6, vc = 7, hi = 8, ls = 9, ge = 10, lt = 11, gt = 12, le = 13, al = 14, hs = 2, lo = 3, } ------------------------------------------------------------------------------ -- Template strings for ARM instructions. local map_op = { -- Basic data processing instructions. and_3 = "e0000000DNPs", eor_3 = "e0200000DNPs", sub_3 = "e0400000DNPs", rsb_3 = "e0600000DNPs", add_3 = "e0800000DNPs", adc_3 = "e0a00000DNPs", sbc_3 = "e0c00000DNPs", rsc_3 = "e0e00000DNPs", tst_2 = "e1100000NP", teq_2 = "e1300000NP", cmp_2 = "e1500000NP", cmn_2 = "e1700000NP", orr_3 = "e1800000DNPs", mov_2 = "e1a00000DPs", bic_3 = "e1c00000DNPs", mvn_2 = "e1e00000DPs", and_4 = "e0000000DNMps", eor_4 = "e0200000DNMps", sub_4 = "e0400000DNMps", rsb_4 = "e0600000DNMps", add_4 = "e0800000DNMps", adc_4 = "e0a00000DNMps", sbc_4 = "e0c00000DNMps", rsc_4 = "e0e00000DNMps", tst_3 = "e1100000NMp", teq_3 = "e1300000NMp", cmp_3 = "e1500000NMp", cmn_3 = "e1700000NMp", orr_4 = "e1800000DNMps", mov_3 = "e1a00000DMps", bic_4 = "e1c00000DNMps", mvn_3 = "e1e00000DMps", lsl_3 = "e1a00000DMws", lsr_3 = "e1a00020DMws", asr_3 = "e1a00040DMws", ror_3 = "e1a00060DMws", rrx_2 = "e1a00060DMs", -- Multiply and multiply-accumulate. mul_3 = "e0000090NMSs", mla_4 = "e0200090NMSDs", umaal_4 = "e0400090DNMSs", -- v6 mls_4 = "e0600090DNMSs", -- v6T2 umull_4 = "e0800090DNMSs", umlal_4 = "e0a00090DNMSs", smull_4 = "e0c00090DNMSs", smlal_4 = "e0e00090DNMSs", -- Halfword multiply and multiply-accumulate. smlabb_4 = "e1000080NMSD", -- v5TE smlatb_4 = "e10000a0NMSD", -- v5TE smlabt_4 = "e10000c0NMSD", -- v5TE smlatt_4 = "e10000e0NMSD", -- v5TE smlawb_4 = "e1200080NMSD", -- v5TE smulwb_3 = "e12000a0NMS", -- v5TE smlawt_4 = "e12000c0NMSD", -- v5TE smulwt_3 = "e12000e0NMS", -- v5TE smlalbb_4 = "e1400080NMSD", -- v5TE smlaltb_4 = "e14000a0NMSD", -- v5TE smlalbt_4 = "e14000c0NMSD", -- v5TE smlaltt_4 = "e14000e0NMSD", -- v5TE smulbb_3 = "e1600080NMS", -- v5TE smultb_3 = "e16000a0NMS", -- v5TE smulbt_3 = "e16000c0NMS", -- v5TE smultt_3 = "e16000e0NMS", -- v5TE -- Miscellaneous data processing instructions. clz_2 = "e16f0f10DM", -- v5T rev_2 = "e6bf0f30DM", -- v6 rev16_2 = "e6bf0fb0DM", -- v6 revsh_2 = "e6ff0fb0DM", -- v6 sel_3 = "e6800fb0DNM", -- v6 usad8_3 = "e780f010NMS", -- v6 usada8_4 = "e7800010NMSD", -- v6 rbit_2 = "e6ff0f30DM", -- v6T2 movw_2 = "e3000000DW", -- v6T2 movt_2 = "e3400000DW", -- v6T2 -- Note: the X encodes width-1, not width. sbfx_4 = "e7a00050DMvX", -- v6T2 ubfx_4 = "e7e00050DMvX", -- v6T2 -- Note: the X encodes the msb field, not the width. bfc_3 = "e7c0001fDvX", -- v6T2 bfi_4 = "e7c00010DMvX", -- v6T2 -- Packing and unpacking instructions. pkhbt_3 = "e6800010DNM", pkhbt_4 = "e6800010DNMv", -- v6 pkhtb_3 = "e6800050DNM", pkhtb_4 = "e6800050DNMv", -- v6 sxtab_3 = "e6a00070DNM", sxtab_4 = "e6a00070DNMv", -- v6 sxtab16_3 = "e6800070DNM", sxtab16_4 = "e6800070DNMv", -- v6 sxtah_3 = "e6b00070DNM", sxtah_4 = "e6b00070DNMv", -- v6 sxtb_2 = "e6af0070DM", sxtb_3 = "e6af0070DMv", -- v6 sxtb16_2 = "e68f0070DM", sxtb16_3 = "e68f0070DMv", -- v6 sxth_2 = "e6bf0070DM", sxth_3 = "e6bf0070DMv", -- v6 uxtab_3 = "e6e00070DNM", uxtab_4 = "e6e00070DNMv", -- v6 uxtab16_3 = "e6c00070DNM", uxtab16_4 = "e6c00070DNMv", -- v6 uxtah_3 = "e6f00070DNM", uxtah_4 = "e6f00070DNMv", -- v6 uxtb_2 = "e6ef0070DM", uxtb_3 = "e6ef0070DMv", -- v6 uxtb16_2 = "e6cf0070DM", uxtb16_3 = "e6cf0070DMv", -- v6 uxth_2 = "e6ff0070DM", uxth_3 = "e6ff0070DMv", -- v6 -- Saturating instructions. qadd_3 = "e1000050DMN", -- v5TE qsub_3 = "e1200050DMN", -- v5TE qdadd_3 = "e1400050DMN", -- v5TE qdsub_3 = "e1600050DMN", -- v5TE -- Note: the X for ssat* encodes sat_imm-1, not sat_imm. ssat_3 = "e6a00010DXM", ssat_4 = "e6a00010DXMp", -- v6 usat_3 = "e6e00010DXM", usat_4 = "e6e00010DXMp", -- v6 ssat16_3 = "e6a00f30DXM", -- v6 usat16_3 = "e6e00f30DXM", -- v6 -- Parallel addition and subtraction. sadd16_3 = "e6100f10DNM", -- v6 sasx_3 = "e6100f30DNM", -- v6 ssax_3 = "e6100f50DNM", -- v6 ssub16_3 = "e6100f70DNM", -- v6 sadd8_3 = "e6100f90DNM", -- v6 ssub8_3 = "e6100ff0DNM", -- v6 qadd16_3 = "e6200f10DNM", -- v6 qasx_3 = "e6200f30DNM", -- v6 qsax_3 = "e6200f50DNM", -- v6 qsub16_3 = "e6200f70DNM", -- v6 qadd8_3 = "e6200f90DNM", -- v6 qsub8_3 = "e6200ff0DNM", -- v6 shadd16_3 = "e6300f10DNM", -- v6 shasx_3 = "e6300f30DNM", -- v6 shsax_3 = "e6300f50DNM", -- v6 shsub16_3 = "e6300f70DNM", -- v6 shadd8_3 = "e6300f90DNM", -- v6 shsub8_3 = "e6300ff0DNM", -- v6 uadd16_3 = "e6500f10DNM", -- v6 uasx_3 = "e6500f30DNM", -- v6 usax_3 = "e6500f50DNM", -- v6 usub16_3 = "e6500f70DNM", -- v6 uadd8_3 = "e6500f90DNM", -- v6 usub8_3 = "e6500ff0DNM", -- v6 uqadd16_3 = "e6600f10DNM", -- v6 uqasx_3 = "e6600f30DNM", -- v6 uqsax_3 = "e6600f50DNM", -- v6 uqsub16_3 = "e6600f70DNM", -- v6 uqadd8_3 = "e6600f90DNM", -- v6 uqsub8_3 = "e6600ff0DNM", -- v6 uhadd16_3 = "e6700f10DNM", -- v6 uhasx_3 = "e6700f30DNM", -- v6 uhsax_3 = "e6700f50DNM", -- v6 uhsub16_3 = "e6700f70DNM", -- v6 uhadd8_3 = "e6700f90DNM", -- v6 uhsub8_3 = "e6700ff0DNM", -- v6 -- Load/store instructions. str_2 = "e4000000DL", str_3 = "e4000000DL", str_4 = "e4000000DL", strb_2 = "e4400000DL", strb_3 = "e4400000DL", strb_4 = "e4400000DL", ldr_2 = "e4100000DL", ldr_3 = "e4100000DL", ldr_4 = "e4100000DL", ldrb_2 = "e4500000DL", ldrb_3 = "e4500000DL", ldrb_4 = "e4500000DL", strh_2 = "e00000b0DL", strh_3 = "e00000b0DL", ldrh_2 = "e01000b0DL", ldrh_3 = "e01000b0DL", ldrd_2 = "e00000d0DL", ldrd_3 = "e00000d0DL", -- v5TE ldrsb_2 = "e01000d0DL", ldrsb_3 = "e01000d0DL", strd_2 = "e00000f0DL", strd_3 = "e00000f0DL", -- v5TE ldrsh_2 = "e01000f0DL", ldrsh_3 = "e01000f0DL", ldm_2 = "e8900000oR", ldmia_2 = "e8900000oR", ldmfd_2 = "e8900000oR", ldmda_2 = "e8100000oR", ldmfa_2 = "e8100000oR", ldmdb_2 = "e9100000oR", ldmea_2 = "e9100000oR", ldmib_2 = "e9900000oR", ldmed_2 = "e9900000oR", stm_2 = "e8800000oR", stmia_2 = "e8800000oR", stmfd_2 = "e8800000oR", stmda_2 = "e8000000oR", stmfa_2 = "e8000000oR", stmdb_2 = "e9000000oR", stmea_2 = "e9000000oR", stmib_2 = "e9800000oR", stmed_2 = "e9800000oR", pop_1 = "e8bd0000R", push_1 = "e92d0000R", -- Branch instructions. b_1 = "ea000000B", bl_1 = "eb000000B", blx_1 = "e12fff30C", bx_1 = "e12fff10M", -- Miscellaneous instructions. nop_0 = "e1a00000", mrs_1 = "e10f0000D", bkpt_1 = "e1200070K", -- v5T svc_1 = "ef000000T", swi_1 = "ef000000T", ud_0 = "e7f001f0", -- VFP instructions. ["vadd.f32_3"] = "ee300a00dnm", ["vadd.f64_3"] = "ee300b00Gdnm", ["vsub.f32_3"] = "ee300a40dnm", ["vsub.f64_3"] = "ee300b40Gdnm", ["vmul.f32_3"] = "ee200a00dnm", ["vmul.f64_3"] = "ee200b00Gdnm", ["vnmul.f32_3"] = "ee200a40dnm", ["vnmul.f64_3"] = "ee200b40Gdnm", ["vmla.f32_3"] = "ee000a00dnm", ["vmla.f64_3"] = "ee000b00Gdnm", ["vmls.f32_3"] = "ee000a40dnm", ["vmls.f64_3"] = "ee000b40Gdnm", ["vnmla.f32_3"] = "ee100a40dnm", ["vnmla.f64_3"] = "ee100b40Gdnm", ["vnmls.f32_3"] = "ee100a00dnm", ["vnmls.f64_3"] = "ee100b00Gdnm", ["vdiv.f32_3"] = "ee800a00dnm", ["vdiv.f64_3"] = "ee800b00Gdnm", ["vabs.f32_2"] = "eeb00ac0dm", ["vabs.f64_2"] = "eeb00bc0Gdm", ["vneg.f32_2"] = "eeb10a40dm", ["vneg.f64_2"] = "eeb10b40Gdm", ["vsqrt.f32_2"] = "eeb10ac0dm", ["vsqrt.f64_2"] = "eeb10bc0Gdm", ["vcmp.f32_2"] = "eeb40a40dm", ["vcmp.f64_2"] = "eeb40b40Gdm", ["vcmpe.f32_2"] = "eeb40ac0dm", ["vcmpe.f64_2"] = "eeb40bc0Gdm", ["vcmpz.f32_1"] = "eeb50a40d", ["vcmpz.f64_1"] = "eeb50b40Gd", ["vcmpze.f32_1"] = "eeb50ac0d", ["vcmpze.f64_1"] = "eeb50bc0Gd", vldr_2 = "ed100a00dl|ed100b00Gdl", vstr_2 = "ed000a00dl|ed000b00Gdl", vldm_2 = "ec900a00or", vldmia_2 = "ec900a00or", vldmdb_2 = "ed100a00or", vpop_1 = "ecbd0a00r", vstm_2 = "ec800a00or", vstmia_2 = "ec800a00or", vstmdb_2 = "ed000a00or", vpush_1 = "ed2d0a00r", ["vmov.f32_2"] = "eeb00a40dm|eeb00a00dY", -- #imm is VFPv3 only ["vmov.f64_2"] = "eeb00b40Gdm|eeb00b00GdY", -- #imm is VFPv3 only vmov_2 = "ee100a10Dn|ee000a10nD", vmov_3 = "ec500a10DNm|ec400a10mDN|ec500b10GDNm|ec400b10GmDN", vmrs_0 = "eef1fa10", vmrs_1 = "eef10a10D", vmsr_1 = "eee10a10D", ["vcvt.s32.f32_2"] = "eebd0ac0dm", ["vcvt.s32.f64_2"] = "eebd0bc0dGm", ["vcvt.u32.f32_2"] = "eebc0ac0dm", ["vcvt.u32.f64_2"] = "eebc0bc0dGm", ["vcvtr.s32.f32_2"] = "eebd0a40dm", ["vcvtr.s32.f64_2"] = "eebd0b40dGm", ["vcvtr.u32.f32_2"] = "eebc0a40dm", ["vcvtr.u32.f64_2"] = "eebc0b40dGm", ["vcvt.f32.s32_2"] = "eeb80ac0dm", ["vcvt.f64.s32_2"] = "eeb80bc0GdFm", ["vcvt.f32.u32_2"] = "eeb80a40dm", ["vcvt.f64.u32_2"] = "eeb80b40GdFm", ["vcvt.f32.f64_2"] = "eeb70bc0dGm", ["vcvt.f64.f32_2"] = "eeb70ac0GdFm", -- VFPv4 only: ["vfma.f32_3"] = "eea00a00dnm", ["vfma.f64_3"] = "eea00b00Gdnm", ["vfms.f32_3"] = "eea00a40dnm", ["vfms.f64_3"] = "eea00b40Gdnm", ["vfnma.f32_3"] = "ee900a40dnm", ["vfnma.f64_3"] = "ee900b40Gdnm", ["vfnms.f32_3"] = "ee900a00dnm", ["vfnms.f64_3"] = "ee900b00Gdnm", -- NYI: Advanced SIMD instructions. -- NYI: I have no need for these instructions right now: -- swp, swpb, strex, ldrex, strexd, ldrexd, strexb, ldrexb, strexh, ldrexh -- msr, nopv6, yield, wfe, wfi, sev, dbg, bxj, smc, srs, rfe -- cps, setend, pli, pld, pldw, clrex, dsb, dmb, isb -- stc, ldc, mcr, mcr2, mrc, mrc2, mcrr, mcrr2, mrrc, mrrc2, cdp, cdp2 } -- Add mnemonics for "s" variants. do local t = {} for k,v in pairs(map_op) do if sub(v, -1) == "s" then local v2 = sub(v, 1, 2)..char(byte(v, 3)+1)..sub(v, 4, -2) t[sub(k, 1, -3).."s"..sub(k, -2)] = v2 end end for k,v in pairs(t) do map_op[k] = v end end ------------------------------------------------------------------------------ local function parse_gpr(expr) local tname, ovreg = match(expr, "^([%w_]+):(r1?[0-9])$") local tp = map_type[tname or expr] if tp then local reg = ovreg or tp.reg if not reg then werror("type `"..(tname or expr).."' needs a register override") end expr = reg end local r = match(expr, "^r(1?[0-9])$") if r then r = tonumber(r) if r <= 15 then return r, tp end end werror("bad register name `"..expr.."'") end local function parse_gpr_pm(expr) local pm, expr2 = match(expr, "^([+-]?)(.*)$") return parse_gpr(expr2), (pm == "-") end local function parse_vr(expr, tp) local t, r = match(expr, "^([sd])([0-9]+)$") if t == tp then r = tonumber(r) if r <= 31 then if t == "s" then return shr(r, 1), band(r, 1) end return band(r, 15), shr(r, 4) end end werror("bad register name `"..expr.."'") end local function parse_reglist(reglist) reglist = match(reglist, "^{%s*([^}]*)}$") if not reglist then werror("register list expected") end local rr = 0 for p in gmatch(reglist..",", "%s*([^,]*),") do local rbit = shl(1, parse_gpr(gsub(p, "%s+$", ""))) if band(rr, rbit) ~= 0 then werror("duplicate register `"..p.."'") end rr = rr + rbit end return rr end local function parse_vrlist(reglist) local ta, ra, tb, rb = match(reglist, "^{%s*([sd])([0-9]+)%s*%-%s*([sd])([0-9]+)%s*}$") ra, rb = tonumber(ra), tonumber(rb) if ta and ta == tb and ra and rb and ra <= 31 and rb <= 31 and ra <= rb then local nr = rb+1 - ra if ta == "s" then return shl(shr(ra,1),12)+shl(band(ra,1),22) + nr else return shl(band(ra,15),12)+shl(shr(ra,4),22) + nr*2 + 0x100 end end werror("register list expected") end local function parse_imm(imm, bits, shift, scale, signed) imm = match(imm, "^#(.*)$") if not imm then werror("expected immediate operand") end local n = tonumber(imm) if n then local m = sar(n, scale) if shl(m, scale) == n then if signed then local s = sar(m, bits-1) if s == 0 then return shl(m, shift) elseif s == -1 then return shl(m + shl(1, bits), shift) end else if sar(m, bits) == 0 then return shl(m, shift) end end end werror("out of range immediate `"..imm.."'") else waction("IMM", (signed and 32768 or 0)+scale*1024+bits*32+shift, imm) return 0 end end local function parse_imm12(imm) local n = tonumber(imm) if n then local m = band(n) for i=0,-15,-1 do if shr(m, 8) == 0 then return m + shl(band(i, 15), 8) end m = ror(m, 2) end werror("out of range immediate `"..imm.."'") else waction("IMM12", 0, imm) return 0 end end local function parse_imm16(imm) imm = match(imm, "^#(.*)$") if not imm then werror("expected immediate operand") end local n = tonumber(imm) if n then if shr(n, 16) == 0 then return band(n, 0x0fff) + shl(band(n, 0xf000), 4) end werror("out of range immediate `"..imm.."'") else waction("IMM16", 32*16, imm) return 0 end end local function parse_imm_load(imm, ext) local n = tonumber(imm) if n then if ext then if n >= -255 and n <= 255 then local up = 0x00800000 if n < 0 then n = -n; up = 0 end return shl(band(n, 0xf0), 4) + band(n, 0x0f) + up end else if n >= -4095 and n <= 4095 then if n >= 0 then return n+0x00800000 end return -n end end werror("out of range immediate `"..imm.."'") else waction(ext and "IMML8" or "IMML12", 32768 + shl(ext and 8 or 12, 5), imm) return 0 end end local function parse_shift(shift, gprok) if shift == "rrx" then return 3 * 32 else local s, s2 = match(shift, "^(%S+)%s*(.*)$") s = map_shift[s] if not s then werror("expected shift operand") end if sub(s2, 1, 1) == "#" then return parse_imm(s2, 5, 7, 0, false) + shl(s, 5) else if not gprok then werror("expected immediate shift operand") end return shl(parse_gpr(s2), 8) + shl(s, 5) + 16 end end end local function parse_label(label, def) local prefix = sub(label, 1, 2) -- =>label (pc label reference) if prefix == "=>" then return "PC", 0, sub(label, 3) end -- ->name (global label reference) if prefix == "->" then return "LG", map_global[sub(label, 3)] end if def then -- [1-9] (local label definition) if match(label, "^[1-9]$") then return "LG", 10+tonumber(label) end else -- [<>][1-9] (local label reference) local dir, lnum = match(label, "^([<>])([1-9])$") if dir then -- Fwd: 1-9, Bkwd: 11-19. return "LG", lnum + (dir == ">" and 0 or 10) end -- extern label (extern label reference) local extname = match(label, "^extern%s+(%S+)$") if extname then return "EXT", map_extern[extname] end end werror("bad label `"..label.."'") end local function parse_load(params, nparams, n, op) local oplo = band(op, 255) local ext, ldrd = (oplo ~= 0), (oplo == 208) local d if (ldrd or oplo == 240) then d = band(shr(op, 12), 15) if band(d, 1) ~= 0 then werror("odd destination register") end end local pn = params[n] local p1, wb = match(pn, "^%[%s*(.-)%s*%](!?)$") local p2 = params[n+1] if not p1 then if not p2 then if match(pn, "^[<>=%-]") or match(pn, "^extern%s+") then local mode, n, s = parse_label(pn, false) waction("REL_"..mode, n + (ext and 0x1800 or 0x0800), s, 1) return op + 15 * 65536 + 0x01000000 + (ext and 0x00400000 or 0) end local reg, tailr = match(pn, "^([%w_:]+)%s*(.*)$") if reg and tailr ~= "" then local d, tp = parse_gpr(reg) if tp then waction(ext and "IMML8" or "IMML12", 32768 + 32*(ext and 8 or 12), format(tp.ctypefmt, tailr)) return op + shl(d, 16) + 0x01000000 + (ext and 0x00400000 or 0) end end end werror("expected address operand") end if wb == "!" then op = op + 0x00200000 end if p2 then if wb == "!" then werror("bad use of '!'") end local p3 = params[n+2] op = op + shl(parse_gpr(p1), 16) local imm = match(p2, "^#(.*)$") if imm then local m = parse_imm_load(imm, ext) if p3 then werror("too many parameters") end op = op + m + (ext and 0x00400000 or 0) else local m, neg = parse_gpr_pm(p2) if ldrd and (m == d or m-1 == d) then werror("register conflict") end op = op + m + (neg and 0 or 0x00800000) + (ext and 0 or 0x02000000) if p3 then op = op + parse_shift(p3) end end else local p1a, p2 = match(p1, "^([^,%s]*)%s*(.*)$") op = op + shl(parse_gpr(p1a), 16) + 0x01000000 if p2 ~= "" then local imm = match(p2, "^,%s*#(.*)$") if imm then local m = parse_imm_load(imm, ext) op = op + m + (ext and 0x00400000 or 0) else local p2a, p3 = match(p2, "^,%s*([^,%s]*)%s*,?%s*(.*)$") local m, neg = parse_gpr_pm(p2a) if ldrd and (m == d or m-1 == d) then werror("register conflict") end op = op + m + (neg and 0 or 0x00800000) + (ext and 0 or 0x02000000) if p3 ~= "" then if ext then werror("too many parameters") end op = op + parse_shift(p3) end end else if wb == "!" then werror("bad use of '!'") end op = op + (ext and 0x00c00000 or 0x00800000) end end return op end local function parse_vload(q) local reg, imm = match(q, "^%[%s*([^,%s]*)%s*(.*)%]$") if reg then local d = shl(parse_gpr(reg), 16) if imm == "" then return d end imm = match(imm, "^,%s*#(.*)$") if imm then local n = tonumber(imm) if n then if n >= -1020 and n <= 1020 and n%4 == 0 then return d + (n >= 0 and n/4+0x00800000 or -n/4) end werror("out of range immediate `"..imm.."'") else waction("IMMV8", 32768 + 32*8, imm) return d end end else if match(q, "^[<>=%-]") or match(q, "^extern%s+") then local mode, n, s = parse_label(q, false) waction("REL_"..mode, n + 0x2800, s, 1) return 15 * 65536 end local reg, tailr = match(q, "^([%w_:]+)%s*(.*)$") if reg and tailr ~= "" then local d, tp = parse_gpr(reg) if tp then waction("IMMV8", 32768 + 32*8, format(tp.ctypefmt, tailr)) return shl(d, 16) end end end werror("expected address operand") end ------------------------------------------------------------------------------ -- Handle opcodes defined with template strings. local function parse_template(params, template, nparams, pos) local op = tonumber(sub(template, 1, 8), 16) local n = 1 local vr = "s" -- Process each character. for p in gmatch(sub(template, 9), ".") do local q = params[n] if p == "D" then op = op + shl(parse_gpr(q), 12); n = n + 1 elseif p == "N" then op = op + shl(parse_gpr(q), 16); n = n + 1 elseif p == "S" then op = op + shl(parse_gpr(q), 8); n = n + 1 elseif p == "M" then op = op + parse_gpr(q); n = n + 1 elseif p == "d" then local r,h = parse_vr(q, vr); op = op+shl(r,12)+shl(h,22); n = n + 1 elseif p == "n" then local r,h = parse_vr(q, vr); op = op+shl(r,16)+shl(h,7); n = n + 1 elseif p == "m" then local r,h = parse_vr(q, vr); op = op+r+shl(h,5); n = n + 1 elseif p == "P" then local imm = match(q, "^#(.*)$") if imm then op = op + parse_imm12(imm) + 0x02000000 else op = op + parse_gpr(q) end n = n + 1 elseif p == "p" then op = op + parse_shift(q, true); n = n + 1 elseif p == "L" then op = parse_load(params, nparams, n, op) elseif p == "l" then op = op + parse_vload(q) elseif p == "B" then local mode, n, s = parse_label(q, false) waction("REL_"..mode, n, s, 1) elseif p == "C" then -- blx gpr vs. blx label. if match(q, "^([%w_]+):(r1?[0-9])$") or match(q, "^r(1?[0-9])$") then op = op + parse_gpr(q) else if op < 0xe0000000 then werror("unconditional instruction") end local mode, n, s = parse_label(q, false) waction("REL_"..mode, n, s, 1) op = 0xfa000000 end elseif p == "F" then vr = "s" elseif p == "G" then vr = "d" elseif p == "o" then local r, wb = match(q, "^([^!]*)(!?)$") op = op + shl(parse_gpr(r), 16) + (wb == "!" and 0x00200000 or 0) n = n + 1 elseif p == "R" then op = op + parse_reglist(q); n = n + 1 elseif p == "r" then op = op + parse_vrlist(q); n = n + 1 elseif p == "W" then op = op + parse_imm16(q); n = n + 1 elseif p == "v" then op = op + parse_imm(q, 5, 7, 0, false); n = n + 1 elseif p == "w" then local imm = match(q, "^#(.*)$") if imm then op = op + parse_imm(q, 5, 7, 0, false); n = n + 1 else op = op + shl(parse_gpr(q), 8) + 16 end elseif p == "X" then op = op + parse_imm(q, 5, 16, 0, false); n = n + 1 elseif p == "Y" then local imm = tonumber(match(q, "^#(.*)$")); n = n + 1 if not imm or shr(imm, 8) ~= 0 then werror("bad immediate operand") end op = op + shl(band(imm, 0xf0), 12) + band(imm, 0x0f) elseif p == "K" then local imm = tonumber(match(q, "^#(.*)$")); n = n + 1 if not imm or shr(imm, 16) ~= 0 then werror("bad immediate operand") end op = op + shl(band(imm, 0xfff0), 4) + band(imm, 0x000f) elseif p == "T" then op = op + parse_imm(q, 24, 0, 0, false); n = n + 1 elseif p == "s" then -- Ignored. else assert(false) end end wputpos(pos, op) end map_op[".template__"] = function(params, template, nparams) if not params then return template:gsub("%x%x%x%x%x%x%x%x", "") end -- Limit number of section buffer positions used by a single dasm_put(). -- A single opcode needs a maximum of 3 positions. if secpos+3 > maxsecpos then wflush() end local pos = wpos() local lpos, apos, spos = #actlist, #actargs, secpos local ok, err for t in gmatch(template, "[^|]+") do ok, err = pcall(parse_template, params, t, nparams, pos) if ok then return end secpos = spos actlist[lpos+1] = nil actlist[lpos+2] = nil actlist[lpos+3] = nil actargs[apos+1] = nil actargs[apos+2] = nil actargs[apos+3] = nil end error(err, 0) end ------------------------------------------------------------------------------ -- Pseudo-opcode to mark the position where the action list is to be emitted. map_op[".actionlist_1"] = function(params) if not params then return "cvar" end local name = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeactions(out, name) end) end -- Pseudo-opcode to mark the position where the global enum is to be emitted. map_op[".globals_1"] = function(params) if not params then return "prefix" end local prefix = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeglobals(out, prefix) end) end -- Pseudo-opcode to mark the position where the global names are to be emitted. map_op[".globalnames_1"] = function(params) if not params then return "cvar" end local name = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeglobalnames(out, name) end) end -- Pseudo-opcode to mark the position where the extern names are to be emitted. map_op[".externnames_1"] = function(params) if not params then return "cvar" end local name = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeexternnames(out, name) end) end ------------------------------------------------------------------------------ -- Label pseudo-opcode (converted from trailing colon form). map_op[".label_1"] = function(params) if not params then return "[1-9] | ->global | =>pcexpr" end if secpos+1 > maxsecpos then wflush() end local mode, n, s = parse_label(params[1], true) if mode == "EXT" then werror("bad label definition") end waction("LABEL_"..mode, n, s, 1) end ------------------------------------------------------------------------------ -- Pseudo-opcodes for data storage. map_op[".long_*"] = function(params) if not params then return "imm..." end for _,p in ipairs(params) do local n = tonumber(p) if not n then werror("bad immediate `"..p.."'") end if n < 0 then n = n + 2^32 end wputw(n) if secpos+2 > maxsecpos then wflush() end end end -- Alignment pseudo-opcode. map_op[".align_1"] = function(params) if not params then return "numpow2" end if secpos+1 > maxsecpos then wflush() end local align = tonumber(params[1]) if align then local x = align -- Must be a power of 2 in the range (2 ... 256). for i=1,8 do x = x / 2 if x == 1 then waction("ALIGN", align-1, nil, 1) -- Action byte is 2**n-1. return end end end werror("bad alignment") end ------------------------------------------------------------------------------ -- Pseudo-opcode for (primitive) type definitions (map to C types). map_op[".type_3"] = function(params, nparams) if not params then return nparams == 2 and "name, ctype" or "name, ctype, reg" end local name, ctype, reg = params[1], params[2], params[3] if not match(name, "^[%a_][%w_]*$") then werror("bad type name `"..name.."'") end local tp = map_type[name] if tp then werror("duplicate type `"..name.."'") end -- Add #type to defines. A bit unclean to put it in map_archdef. map_archdef["#"..name] = "sizeof("..ctype..")" -- Add new type and emit shortcut define. local num = ctypenum + 1 map_type[name] = { ctype = ctype, ctypefmt = format("Dt%X(%%s)", num), reg = reg, } wline(format("#define Dt%X(_V) (int)(ptrdiff_t)&(((%s *)0)_V)", num, ctype)) ctypenum = num end map_op[".type_2"] = map_op[".type_3"] -- Dump type definitions. local function dumptypes(out, lvl) local t = {} for name in pairs(map_type) do t[#t+1] = name end sort(t) out:write("Type definitions:\n") for _,name in ipairs(t) do local tp = map_type[name] local reg = tp.reg or "" out:write(format(" %-20s %-20s %s\n", name, tp.ctype, reg)) end out:write("\n") end ------------------------------------------------------------------------------ -- Set the current section. function _M.section(num) waction("SECTION", num) wflush(true) -- SECTION is a terminal action. end ------------------------------------------------------------------------------ -- Dump architecture description. function _M.dumparch(out) out:write(format("DynASM %s version %s, released %s\n\n", _info.arch, _info.version, _info.release)) dumpactions(out) end -- Dump all user defined elements. function _M.dumpdef(out, lvl) dumptypes(out, lvl) dumpglobals(out, lvl) dumpexterns(out, lvl) end ------------------------------------------------------------------------------ -- Pass callbacks from/to the DynASM core. function _M.passcb(wl, we, wf, ww) wline, werror, wfatal, wwarn = wl, we, wf, ww return wflush end -- Setup the arch-specific module. function _M.setup(arch, opt) g_arch, g_opt = arch, opt end -- Merge the core maps and the arch-specific maps. function _M.mergemaps(map_coreop, map_def) setmetatable(map_op, { __index = function(t, k) local v = map_coreop[k] if v then return v end local k1, cc, k2 = match(k, "^(.-)(..)([._].*)$") local cv = map_cond[cc] if cv then local v = rawget(t, k1..k2) if type(v) == "string" then local scv = format("%x", cv) return gsub(scv..sub(v, 2), "|e", "|"..scv) end end end }) setmetatable(map_def, { __index = map_archdef }) return map_op, map_def end return _M ------------------------------------------------------------------------------ MoarVM-2018.03/3rdparty/dynasm/dasm_mips.h0000644000175000017510000002765013237701235020410 0ustar samanthasamantha/* ** DynASM MIPS encoding engine. ** Copyright (C) 2005-2015 Mike Pall. All rights reserved. ** Released under the MIT license. See dynasm.lua for full copyright notice. */ #include #include #include #include #define DASM_ARCH "mips" #ifndef DASM_EXTERN #define DASM_EXTERN(a,b,c,d) 0 #endif /* Action definitions. */ enum { DASM_STOP, DASM_SECTION, DASM_ESC, DASM_REL_EXT, /* The following actions need a buffer position. */ DASM_ALIGN, DASM_REL_LG, DASM_LABEL_LG, /* The following actions also have an argument. */ DASM_REL_PC, DASM_LABEL_PC, DASM_IMM, DASM__MAX }; /* Maximum number of section buffer positions for a single dasm_put() call. */ #define DASM_MAXSECPOS 25 /* DynASM encoder status codes. Action list offset or number are or'ed in. */ #define DASM_S_OK 0x00000000 #define DASM_S_NOMEM 0x01000000 #define DASM_S_PHASE 0x02000000 #define DASM_S_MATCH_SEC 0x03000000 #define DASM_S_RANGE_I 0x11000000 #define DASM_S_RANGE_SEC 0x12000000 #define DASM_S_RANGE_LG 0x13000000 #define DASM_S_RANGE_PC 0x14000000 #define DASM_S_RANGE_REL 0x15000000 #define DASM_S_UNDEF_LG 0x21000000 #define DASM_S_UNDEF_PC 0x22000000 /* Macros to convert positions (8 bit section + 24 bit index). */ #define DASM_POS2IDX(pos) ((pos)&0x00ffffff) #define DASM_POS2BIAS(pos) ((pos)&0xff000000) #define DASM_SEC2POS(sec) ((sec)<<24) #define DASM_POS2SEC(pos) ((pos)>>24) #define DASM_POS2PTR(D, pos) (D->sections[DASM_POS2SEC(pos)].rbuf + (pos)) /* Action list type. */ typedef const unsigned int *dasm_ActList; /* Per-section structure. */ typedef struct dasm_Section { int *rbuf; /* Biased buffer pointer (negative section bias). */ int *buf; /* True buffer pointer. */ size_t bsize; /* Buffer size in bytes. */ int pos; /* Biased buffer position. */ int epos; /* End of biased buffer position - max single put. */ int ofs; /* Byte offset into section. */ } dasm_Section; /* Core structure holding the DynASM encoding state. */ struct dasm_State { size_t psize; /* Allocated size of this structure. */ dasm_ActList actionlist; /* Current actionlist pointer. */ int *lglabels; /* Local/global chain/pos ptrs. */ size_t lgsize; int *pclabels; /* PC label chains/pos ptrs. */ size_t pcsize; void **globals; /* Array of globals (bias -10). */ dasm_Section *section; /* Pointer to active section. */ size_t codesize; /* Total size of all code sections. */ int maxsection; /* 0 <= sectionidx < maxsection. */ int status; /* Status code. */ dasm_Section sections[1]; /* All sections. Alloc-extended. */ }; /* The size of the core structure depends on the max. number of sections. */ #define DASM_PSZ(ms) (sizeof(dasm_State)+(ms-1)*sizeof(dasm_Section)) /* Initialize DynASM state. */ void dasm_init(Dst_DECL, int maxsection) { dasm_State *D; size_t psz = 0; int i; Dst_REF = NULL; DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection)); D = Dst_REF; D->psize = psz; D->lglabels = NULL; D->lgsize = 0; D->pclabels = NULL; D->pcsize = 0; D->globals = NULL; D->maxsection = maxsection; for (i = 0; i < maxsection; i++) { D->sections[i].buf = NULL; /* Need this for pass3. */ D->sections[i].rbuf = D->sections[i].buf - DASM_SEC2POS(i); D->sections[i].bsize = 0; D->sections[i].epos = 0; /* Wrong, but is recalculated after resize. */ } } /* Free DynASM state. */ void dasm_free(Dst_DECL) { dasm_State *D = Dst_REF; int i; for (i = 0; i < D->maxsection; i++) if (D->sections[i].buf) DASM_M_FREE(Dst, D->sections[i].buf, D->sections[i].bsize); if (D->pclabels) DASM_M_FREE(Dst, D->pclabels, D->pcsize); if (D->lglabels) DASM_M_FREE(Dst, D->lglabels, D->lgsize); DASM_M_FREE(Dst, D, D->psize); } /* Setup global label array. Must be called before dasm_setup(). */ void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl) { dasm_State *D = Dst_REF; D->globals = gl - 10; /* Negative bias to compensate for locals. */ DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int)); } /* Grow PC label array. Can be called after dasm_setup(), too. */ void dasm_growpc(Dst_DECL, unsigned int maxpc) { dasm_State *D = Dst_REF; size_t osz = D->pcsize; DASM_M_GROW(Dst, int, D->pclabels, D->pcsize, maxpc*sizeof(int)); memset((void *)(((unsigned char *)D->pclabels)+osz), 0, D->pcsize-osz); } /* Setup encoder. */ void dasm_setup(Dst_DECL, const void *actionlist) { dasm_State *D = Dst_REF; int i; D->actionlist = (dasm_ActList)actionlist; D->status = DASM_S_OK; D->section = &D->sections[0]; memset((void *)D->lglabels, 0, D->lgsize); if (D->pclabels) memset((void *)D->pclabels, 0, D->pcsize); for (i = 0; i < D->maxsection; i++) { D->sections[i].pos = DASM_SEC2POS(i); D->sections[i].ofs = 0; } } #ifdef DASM_CHECKS #define CK(x, st) \ do { if (!(x)) { \ D->status = DASM_S_##st|(p-D->actionlist-1); return; } } while (0) #define CKPL(kind, st) \ do { if ((size_t)((char *)pl-(char *)D->kind##labels) >= D->kind##size) { \ D->status = DASM_S_RANGE_##st|(p-D->actionlist-1); return; } } while (0) #else #define CK(x, st) ((void)0) #define CKPL(kind, st) ((void)0) #endif /* Pass 1: Store actions and args, link branches/labels, estimate offsets. */ void dasm_put(Dst_DECL, int start, ...) { va_list ap; dasm_State *D = Dst_REF; dasm_ActList p = D->actionlist + start; dasm_Section *sec = D->section; int pos = sec->pos, ofs = sec->ofs; int *b; if (pos >= sec->epos) { DASM_M_GROW(Dst, int, sec->buf, sec->bsize, sec->bsize + 2*DASM_MAXSECPOS*sizeof(int)); sec->rbuf = sec->buf - DASM_POS2BIAS(pos); sec->epos = (int)sec->bsize/sizeof(int) - DASM_MAXSECPOS+DASM_POS2BIAS(pos); } b = sec->rbuf; b[pos++] = start; va_start(ap, start); while (1) { unsigned int ins = *p++; unsigned int action = (ins >> 16) - 0xff00; if (action >= DASM__MAX) { ofs += 4; } else { int *pl, n = action >= DASM_REL_PC ? va_arg(ap, int) : 0; switch (action) { case DASM_STOP: goto stop; case DASM_SECTION: n = (ins & 255); CK(n < D->maxsection, RANGE_SEC); D->section = &D->sections[n]; goto stop; case DASM_ESC: p++; ofs += 4; break; case DASM_REL_EXT: break; case DASM_ALIGN: ofs += (ins & 255); b[pos++] = ofs; break; case DASM_REL_LG: n = (ins & 2047) - 10; pl = D->lglabels + n; /* Bkwd rel or global. */ if (n >= 0) { CK(n>=10||*pl<0, RANGE_LG); CKPL(lg, LG); goto putrel; } pl += 10; n = *pl; if (n < 0) n = 0; /* Start new chain for fwd rel if label exists. */ goto linkrel; case DASM_REL_PC: pl = D->pclabels + n; CKPL(pc, PC); putrel: n = *pl; if (n < 0) { /* Label exists. Get label pos and store it. */ b[pos] = -n; } else { linkrel: b[pos] = n; /* Else link to rel chain, anchored at label. */ *pl = pos; } pos++; break; case DASM_LABEL_LG: pl = D->lglabels + (ins & 2047) - 10; CKPL(lg, LG); goto putlabel; case DASM_LABEL_PC: pl = D->pclabels + n; CKPL(pc, PC); putlabel: n = *pl; /* n > 0: Collapse rel chain and replace with label pos. */ while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = pos; } *pl = -pos; /* Label exists now. */ b[pos++] = ofs; /* Store pass1 offset estimate. */ break; case DASM_IMM: #ifdef DASM_CHECKS CK((n & ((1<<((ins>>10)&31))-1)) == 0, RANGE_I); #endif n >>= ((ins>>10)&31); #ifdef DASM_CHECKS if (ins & 0x8000) CK(((n + (1<<(((ins>>5)&31)-1)))>>((ins>>5)&31)) == 0, RANGE_I); else CK((n>>((ins>>5)&31)) == 0, RANGE_I); #endif b[pos++] = n; break; } } } stop: va_end(ap); sec->pos = pos; sec->ofs = ofs; } #undef CK /* Pass 2: Link sections, shrink aligns, fix label offsets. */ int dasm_link(Dst_DECL, size_t *szp) { dasm_State *D = Dst_REF; int secnum; int ofs = 0; #ifdef DASM_CHECKS *szp = 0; if (D->status != DASM_S_OK) return D->status; { int pc; for (pc = 0; pc*sizeof(int) < D->pcsize; pc++) if (D->pclabels[pc] > 0) return DASM_S_UNDEF_PC|pc; } #endif { /* Handle globals not defined in this translation unit. */ int idx; for (idx = 20; idx*sizeof(int) < D->lgsize; idx++) { int n = D->lglabels[idx]; /* Undefined label: Collapse rel chain and replace with marker (< 0). */ while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = -idx; } } } /* Combine all code sections. No support for data sections (yet). */ for (secnum = 0; secnum < D->maxsection; secnum++) { dasm_Section *sec = D->sections + secnum; int *b = sec->rbuf; int pos = DASM_SEC2POS(secnum); int lastpos = sec->pos; while (pos != lastpos) { dasm_ActList p = D->actionlist + b[pos++]; while (1) { unsigned int ins = *p++; unsigned int action = (ins >> 16) - 0xff00; switch (action) { case DASM_STOP: case DASM_SECTION: goto stop; case DASM_ESC: p++; break; case DASM_REL_EXT: break; case DASM_ALIGN: ofs -= (b[pos++] + ofs) & (ins & 255); break; case DASM_REL_LG: case DASM_REL_PC: pos++; break; case DASM_LABEL_LG: case DASM_LABEL_PC: b[pos++] += ofs; break; case DASM_IMM: pos++; break; } } stop: (void)0; } ofs += sec->ofs; /* Next section starts right after current section. */ } D->codesize = ofs; /* Total size of all code sections */ *szp = ofs; return DASM_S_OK; } #ifdef DASM_CHECKS #define CK(x, st) \ do { if (!(x)) return DASM_S_##st|(p-D->actionlist-1); } while (0) #else #define CK(x, st) ((void)0) #endif /* Pass 3: Encode sections. */ int dasm_encode(Dst_DECL, void *buffer) { dasm_State *D = Dst_REF; char *base = (char *)buffer; unsigned int *cp = (unsigned int *)buffer; int secnum; /* Encode all code sections. No support for data sections (yet). */ for (secnum = 0; secnum < D->maxsection; secnum++) { dasm_Section *sec = D->sections + secnum; int *b = sec->buf; int *endb = sec->rbuf + sec->pos; while (b != endb) { dasm_ActList p = D->actionlist + *b++; while (1) { unsigned int ins = *p++; unsigned int action = (ins >> 16) - 0xff00; int n = (action >= DASM_ALIGN && action < DASM__MAX) ? *b++ : 0; switch (action) { case DASM_STOP: case DASM_SECTION: goto stop; case DASM_ESC: *cp++ = *p++; break; case DASM_REL_EXT: n = DASM_EXTERN(Dst, (unsigned char *)cp, (ins & 2047), 1); goto patchrel; case DASM_ALIGN: ins &= 255; while ((((char *)cp - base) & ins)) *cp++ = 0x60000000; break; case DASM_REL_LG: CK(n >= 0, UNDEF_LG); case DASM_REL_PC: CK(n >= 0, UNDEF_PC); n = *DASM_POS2PTR(D, n); if (ins & 2048) n = n - (int)((char *)cp - base); else n = (n + (int)base) & 0x0fffffff; patchrel: CK((n & 3) == 0 && ((n + ((ins & 2048) ? 0x00020000 : 0)) >> ((ins & 2048) ? 18 : 28)) == 0, RANGE_REL); cp[-1] |= ((n>>2) & ((ins & 2048) ? 0x0000ffff: 0x03ffffff)); break; case DASM_LABEL_LG: ins &= 2047; if (ins >= 20) D->globals[ins-10] = (void *)(base + n); break; case DASM_LABEL_PC: break; case DASM_IMM: cp[-1] |= (n & ((1<<((ins>>5)&31))-1)) << (ins&31); break; default: *cp++ = ins; break; } } stop: (void)0; } } if (base + D->codesize != (char *)cp) /* Check for phase errors. */ return DASM_S_PHASE; return DASM_S_OK; } #undef CK /* Get PC label offset. */ int dasm_getpclabel(Dst_DECL, unsigned int pc) { dasm_State *D = Dst_REF; if (pc*sizeof(int) < D->pcsize) { int pos = D->pclabels[pc]; if (pos < 0) return *DASM_POS2PTR(D, -pos); if (pos > 0) return -1; /* Undefined. */ } return -2; /* Unused or out of range. */ } #ifdef DASM_CHECKS /* Optional sanity checker to call between isolated encoding steps. */ int dasm_checkstep(Dst_DECL, int secmatch) { dasm_State *D = Dst_REF; if (D->status == DASM_S_OK) { int i; for (i = 1; i <= 9; i++) { if (D->lglabels[i] > 0) { D->status = DASM_S_UNDEF_LG|i; break; } D->lglabels[i] = 0; } } if (D->status == DASM_S_OK && secmatch >= 0 && D->section != &D->sections[secmatch]) D->status = DASM_S_MATCH_SEC|(D->section-D->sections); return D->status; } #endif MoarVM-2018.03/3rdparty/dynasm/dasm_mips.lua0000644000175000017510000006666013237701103020740 0ustar samanthasamantha------------------------------------------------------------------------------ -- DynASM MIPS module. -- -- Copyright (C) 2005-2015 Mike Pall. All rights reserved. -- See dynasm.lua for full copyright notice. ------------------------------------------------------------------------------ -- Module information: local _info = { arch = "mips", description = "DynASM MIPS module", version = "1.3.0", vernum = 10300, release = "2012-01-23", author = "Mike Pall", license = "MIT", } -- Exported glue functions for the arch-specific module. local _M = { _info = _info } -- Cache library functions. local type, tonumber, pairs, ipairs = type, tonumber, pairs, ipairs local assert, setmetatable = assert, setmetatable local _s = string local sub, format, byte, char = _s.sub, _s.format, _s.byte, _s.char local match, gmatch = _s.match, _s.gmatch local concat, sort = table.concat, table.sort local bit = bit or require("bit") local band, shl, sar, tohex = bit.band, bit.lshift, bit.arshift, bit.tohex -- Inherited tables and callbacks. local g_opt, g_arch local wline, werror, wfatal, wwarn -- Action name list. -- CHECK: Keep this in sync with the C code! local action_names = { "STOP", "SECTION", "ESC", "REL_EXT", "ALIGN", "REL_LG", "LABEL_LG", "REL_PC", "LABEL_PC", "IMM", } -- Maximum number of section buffer positions for dasm_put(). -- CHECK: Keep this in sync with the C code! local maxsecpos = 25 -- Keep this low, to avoid excessively long C lines. -- Action name -> action number. local map_action = {} for n,name in ipairs(action_names) do map_action[name] = n-1 end -- Action list buffer. local actlist = {} -- Argument list for next dasm_put(). Start with offset 0 into action list. local actargs = { 0 } -- Current number of section buffer positions for dasm_put(). local secpos = 1 ------------------------------------------------------------------------------ -- Dump action names and numbers. local function dumpactions(out) out:write("DynASM encoding engine action codes:\n") for n,name in ipairs(action_names) do local num = map_action[name] out:write(format(" %-10s %02X %d\n", name, num, num)) end out:write("\n") end -- Write action list buffer as a huge static C array. local function writeactions(out, name) local nn = #actlist if nn == 0 then nn = 1; actlist[0] = map_action.STOP end out:write("static const unsigned int ", name, "[", nn, "] = {\n") for i = 1,nn-1 do assert(out:write("0x", tohex(actlist[i]), ",\n")) end assert(out:write("0x", tohex(actlist[nn]), "\n};\n\n")) end ------------------------------------------------------------------------------ -- Add word to action list. local function wputxw(n) assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range") actlist[#actlist+1] = n end -- Add action to list with optional arg. Advance buffer pos, too. local function waction(action, val, a, num) local w = assert(map_action[action], "bad action name `"..action.."'") wputxw(0xff000000 + w * 0x10000 + (val or 0)) if a then actargs[#actargs+1] = a end if a or num then secpos = secpos + (num or 1) end end -- Flush action list (intervening C code or buffer pos overflow). local function wflush(term) if #actlist == actargs[1] then return end -- Nothing to flush. if not term then waction("STOP") end -- Terminate action list. wline(format("dasm_put(Dst, %s);", concat(actargs, ", ")), true) actargs = { #actlist } -- Actionlist offset is 1st arg to next dasm_put(). secpos = 1 -- The actionlist offset occupies a buffer position, too. end -- Put escaped word. local function wputw(n) if n >= 0xff000000 then waction("ESC") end wputxw(n) end -- Reserve position for word. local function wpos() local pos = #actlist+1 actlist[pos] = "" return pos end -- Store word to reserved position. local function wputpos(pos, n) assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range") actlist[pos] = n end ------------------------------------------------------------------------------ -- Global label name -> global label number. With auto assignment on 1st use. local next_global = 20 local map_global = setmetatable({}, { __index = function(t, name) if not match(name, "^[%a_][%w_]*$") then werror("bad global label") end local n = next_global if n > 2047 then werror("too many global labels") end next_global = n + 1 t[name] = n return n end}) -- Dump global labels. local function dumpglobals(out, lvl) local t = {} for name, n in pairs(map_global) do t[n] = name end out:write("Global labels:\n") for i=20,next_global-1 do out:write(format(" %s\n", t[i])) end out:write("\n") end -- Write global label enum. local function writeglobals(out, prefix) local t = {} for name, n in pairs(map_global) do t[n] = name end out:write("enum {\n") for i=20,next_global-1 do out:write(" ", prefix, t[i], ",\n") end out:write(" ", prefix, "_MAX\n};\n") end -- Write global label names. local function writeglobalnames(out, name) local t = {} for name, n in pairs(map_global) do t[n] = name end out:write("static const char *const ", name, "[] = {\n") for i=20,next_global-1 do out:write(" \"", t[i], "\",\n") end out:write(" (const char *)0\n};\n") end ------------------------------------------------------------------------------ -- Extern label name -> extern label number. With auto assignment on 1st use. local next_extern = 0 local map_extern_ = {} local map_extern = setmetatable({}, { __index = function(t, name) -- No restrictions on the name for now. local n = next_extern if n > 2047 then werror("too many extern labels") end next_extern = n + 1 t[name] = n map_extern_[n] = name return n end}) -- Dump extern labels. local function dumpexterns(out, lvl) out:write("Extern labels:\n") for i=0,next_extern-1 do out:write(format(" %s\n", map_extern_[i])) end out:write("\n") end -- Write extern label names. local function writeexternnames(out, name) out:write("static const char *const ", name, "[] = {\n") for i=0,next_extern-1 do out:write(" \"", map_extern_[i], "\",\n") end out:write(" (const char *)0\n};\n") end ------------------------------------------------------------------------------ -- Arch-specific maps. local map_archdef = { sp="r29", ra="r31" } -- Ext. register name -> int. name. local map_type = {} -- Type name -> { ctype, reg } local ctypenum = 0 -- Type number (for Dt... macros). -- Reverse defines for registers. function _M.revdef(s) if s == "r29" then return "sp" elseif s == "r31" then return "ra" end return s end ------------------------------------------------------------------------------ -- Template strings for MIPS instructions. local map_op = { -- First-level opcodes. j_1 = "08000000J", jal_1 = "0c000000J", b_1 = "10000000B", beqz_2 = "10000000SB", beq_3 = "10000000STB", bnez_2 = "14000000SB", bne_3 = "14000000STB", blez_2 = "18000000SB", bgtz_2 = "1c000000SB", addi_3 = "20000000TSI", li_2 = "24000000TI", addiu_3 = "24000000TSI", slti_3 = "28000000TSI", sltiu_3 = "2c000000TSI", andi_3 = "30000000TSU", lu_2 = "34000000TU", ori_3 = "34000000TSU", xori_3 = "38000000TSU", lui_2 = "3c000000TU", beqzl_2 = "50000000SB", beql_3 = "50000000STB", bnezl_2 = "54000000SB", bnel_3 = "54000000STB", blezl_2 = "58000000SB", bgtzl_2 = "5c000000SB", lb_2 = "80000000TO", lh_2 = "84000000TO", lwl_2 = "88000000TO", lw_2 = "8c000000TO", lbu_2 = "90000000TO", lhu_2 = "94000000TO", lwr_2 = "98000000TO", sb_2 = "a0000000TO", sh_2 = "a4000000TO", swl_2 = "a8000000TO", sw_2 = "ac000000TO", swr_2 = "b8000000TO", cache_2 = "bc000000NO", ll_2 = "c0000000TO", lwc1_2 = "c4000000HO", pref_2 = "cc000000NO", ldc1_2 = "d4000000HO", sc_2 = "e0000000TO", swc1_2 = "e4000000HO", sdc1_2 = "f4000000HO", -- Opcode SPECIAL. nop_0 = "00000000", sll_3 = "00000000DTA", movf_2 = "00000001DS", movf_3 = "00000001DSC", movt_2 = "00010001DS", movt_3 = "00010001DSC", srl_3 = "00000002DTA", rotr_3 = "00200002DTA", sra_3 = "00000003DTA", sllv_3 = "00000004DTS", srlv_3 = "00000006DTS", rotrv_3 = "00000046DTS", srav_3 = "00000007DTS", jr_1 = "00000008S", jalr_1 = "0000f809S", jalr_2 = "00000009DS", movz_3 = "0000000aDST", movn_3 = "0000000bDST", syscall_0 = "0000000c", syscall_1 = "0000000cY", break_0 = "0000000d", break_1 = "0000000dY", sync_0 = "0000000f", mfhi_1 = "00000010D", mthi_1 = "00000011S", mflo_1 = "00000012D", mtlo_1 = "00000013S", mult_2 = "00000018ST", multu_2 = "00000019ST", div_2 = "0000001aST", divu_2 = "0000001bST", add_3 = "00000020DST", move_2 = "00000021DS", addu_3 = "00000021DST", sub_3 = "00000022DST", negu_2 = "00000023DT", subu_3 = "00000023DST", and_3 = "00000024DST", or_3 = "00000025DST", xor_3 = "00000026DST", not_2 = "00000027DS", nor_3 = "00000027DST", slt_3 = "0000002aDST", sltu_3 = "0000002bDST", tge_2 = "00000030ST", tge_3 = "00000030STZ", tgeu_2 = "00000031ST", tgeu_3 = "00000031STZ", tlt_2 = "00000032ST", tlt_3 = "00000032STZ", tltu_2 = "00000033ST", tltu_3 = "00000033STZ", teq_2 = "00000034ST", teq_3 = "00000034STZ", tne_2 = "00000036ST", tne_3 = "00000036STZ", -- Opcode REGIMM. bltz_2 = "04000000SB", bgez_2 = "04010000SB", bltzl_2 = "04020000SB", bgezl_2 = "04030000SB", tgei_2 = "04080000SI", tgeiu_2 = "04090000SI", tlti_2 = "040a0000SI", tltiu_2 = "040b0000SI", teqi_2 = "040c0000SI", tnei_2 = "040e0000SI", bltzal_2 = "04100000SB", bal_1 = "04110000B", bgezal_2 = "04110000SB", bltzall_2 = "04120000SB", bgezall_2 = "04130000SB", synci_1 = "041f0000O", -- Opcode SPECIAL2. madd_2 = "70000000ST", maddu_2 = "70000001ST", mul_3 = "70000002DST", msub_2 = "70000004ST", msubu_2 = "70000005ST", clz_2 = "70000020DS=", clo_2 = "70000021DS=", sdbbp_0 = "7000003f", sdbbp_1 = "7000003fY", -- Opcode SPECIAL3. ext_4 = "7c000000TSAM", -- Note: last arg is msbd = size-1 ins_4 = "7c000004TSAM", -- Note: last arg is msb = pos+size-1 wsbh_2 = "7c0000a0DT", seb_2 = "7c000420DT", seh_2 = "7c000620DT", rdhwr_2 = "7c00003bTD", -- Opcode COP0. mfc0_2 = "40000000TD", mfc0_3 = "40000000TDW", mtc0_2 = "40800000TD", mtc0_3 = "40800000TDW", rdpgpr_2 = "41400000DT", di_0 = "41606000", di_1 = "41606000T", ei_0 = "41606020", ei_1 = "41606020T", wrpgpr_2 = "41c00000DT", tlbr_0 = "42000001", tlbwi_0 = "42000002", tlbwr_0 = "42000006", tlbp_0 = "42000008", eret_0 = "42000018", deret_0 = "4200001f", wait_0 = "42000020", -- Opcode COP1. mfc1_2 = "44000000TG", cfc1_2 = "44400000TG", mfhc1_2 = "44600000TG", mtc1_2 = "44800000TG", ctc1_2 = "44c00000TG", mthc1_2 = "44e00000TG", bc1f_1 = "45000000B", bc1f_2 = "45000000CB", bc1t_1 = "45010000B", bc1t_2 = "45010000CB", bc1fl_1 = "45020000B", bc1fl_2 = "45020000CB", bc1tl_1 = "45030000B", bc1tl_2 = "45030000CB", ["add.s_3"] = "46000000FGH", ["sub.s_3"] = "46000001FGH", ["mul.s_3"] = "46000002FGH", ["div.s_3"] = "46000003FGH", ["sqrt.s_2"] = "46000004FG", ["abs.s_2"] = "46000005FG", ["mov.s_2"] = "46000006FG", ["neg.s_2"] = "46000007FG", ["round.l.s_2"] = "46000008FG", ["trunc.l.s_2"] = "46000009FG", ["ceil.l.s_2"] = "4600000aFG", ["floor.l.s_2"] = "4600000bFG", ["round.w.s_2"] = "4600000cFG", ["trunc.w.s_2"] = "4600000dFG", ["ceil.w.s_2"] = "4600000eFG", ["floor.w.s_2"] = "4600000fFG", ["movf.s_2"] = "46000011FG", ["movf.s_3"] = "46000011FGC", ["movt.s_2"] = "46010011FG", ["movt.s_3"] = "46010011FGC", ["movz.s_3"] = "46000012FGT", ["movn.s_3"] = "46000013FGT", ["recip.s_2"] = "46000015FG", ["rsqrt.s_2"] = "46000016FG", ["cvt.d.s_2"] = "46000021FG", ["cvt.w.s_2"] = "46000024FG", ["cvt.l.s_2"] = "46000025FG", ["cvt.ps.s_3"] = "46000026FGH", ["c.f.s_2"] = "46000030GH", ["c.f.s_3"] = "46000030VGH", ["c.un.s_2"] = "46000031GH", ["c.un.s_3"] = "46000031VGH", ["c.eq.s_2"] = "46000032GH", ["c.eq.s_3"] = "46000032VGH", ["c.ueq.s_2"] = "46000033GH", ["c.ueq.s_3"] = "46000033VGH", ["c.olt.s_2"] = "46000034GH", ["c.olt.s_3"] = "46000034VGH", ["c.ult.s_2"] = "46000035GH", ["c.ult.s_3"] = "46000035VGH", ["c.ole.s_2"] = "46000036GH", ["c.ole.s_3"] = "46000036VGH", ["c.ule.s_2"] = "46000037GH", ["c.ule.s_3"] = "46000037VGH", ["c.sf.s_2"] = "46000038GH", ["c.sf.s_3"] = "46000038VGH", ["c.ngle.s_2"] = "46000039GH", ["c.ngle.s_3"] = "46000039VGH", ["c.seq.s_2"] = "4600003aGH", ["c.seq.s_3"] = "4600003aVGH", ["c.ngl.s_2"] = "4600003bGH", ["c.ngl.s_3"] = "4600003bVGH", ["c.lt.s_2"] = "4600003cGH", ["c.lt.s_3"] = "4600003cVGH", ["c.nge.s_2"] = "4600003dGH", ["c.nge.s_3"] = "4600003dVGH", ["c.le.s_2"] = "4600003eGH", ["c.le.s_3"] = "4600003eVGH", ["c.ngt.s_2"] = "4600003fGH", ["c.ngt.s_3"] = "4600003fVGH", ["add.d_3"] = "46200000FGH", ["sub.d_3"] = "46200001FGH", ["mul.d_3"] = "46200002FGH", ["div.d_3"] = "46200003FGH", ["sqrt.d_2"] = "46200004FG", ["abs.d_2"] = "46200005FG", ["mov.d_2"] = "46200006FG", ["neg.d_2"] = "46200007FG", ["round.l.d_2"] = "46200008FG", ["trunc.l.d_2"] = "46200009FG", ["ceil.l.d_2"] = "4620000aFG", ["floor.l.d_2"] = "4620000bFG", ["round.w.d_2"] = "4620000cFG", ["trunc.w.d_2"] = "4620000dFG", ["ceil.w.d_2"] = "4620000eFG", ["floor.w.d_2"] = "4620000fFG", ["movf.d_2"] = "46200011FG", ["movf.d_3"] = "46200011FGC", ["movt.d_2"] = "46210011FG", ["movt.d_3"] = "46210011FGC", ["movz.d_3"] = "46200012FGT", ["movn.d_3"] = "46200013FGT", ["recip.d_2"] = "46200015FG", ["rsqrt.d_2"] = "46200016FG", ["cvt.s.d_2"] = "46200020FG", ["cvt.w.d_2"] = "46200024FG", ["cvt.l.d_2"] = "46200025FG", ["c.f.d_2"] = "46200030GH", ["c.f.d_3"] = "46200030VGH", ["c.un.d_2"] = "46200031GH", ["c.un.d_3"] = "46200031VGH", ["c.eq.d_2"] = "46200032GH", ["c.eq.d_3"] = "46200032VGH", ["c.ueq.d_2"] = "46200033GH", ["c.ueq.d_3"] = "46200033VGH", ["c.olt.d_2"] = "46200034GH", ["c.olt.d_3"] = "46200034VGH", ["c.ult.d_2"] = "46200035GH", ["c.ult.d_3"] = "46200035VGH", ["c.ole.d_2"] = "46200036GH", ["c.ole.d_3"] = "46200036VGH", ["c.ule.d_2"] = "46200037GH", ["c.ule.d_3"] = "46200037VGH", ["c.sf.d_2"] = "46200038GH", ["c.sf.d_3"] = "46200038VGH", ["c.ngle.d_2"] = "46200039GH", ["c.ngle.d_3"] = "46200039VGH", ["c.seq.d_2"] = "4620003aGH", ["c.seq.d_3"] = "4620003aVGH", ["c.ngl.d_2"] = "4620003bGH", ["c.ngl.d_3"] = "4620003bVGH", ["c.lt.d_2"] = "4620003cGH", ["c.lt.d_3"] = "4620003cVGH", ["c.nge.d_2"] = "4620003dGH", ["c.nge.d_3"] = "4620003dVGH", ["c.le.d_2"] = "4620003eGH", ["c.le.d_3"] = "4620003eVGH", ["c.ngt.d_2"] = "4620003fGH", ["c.ngt.d_3"] = "4620003fVGH", ["add.ps_3"] = "46c00000FGH", ["sub.ps_3"] = "46c00001FGH", ["mul.ps_3"] = "46c00002FGH", ["abs.ps_2"] = "46c00005FG", ["mov.ps_2"] = "46c00006FG", ["neg.ps_2"] = "46c00007FG", ["movf.ps_2"] = "46c00011FG", ["movf.ps_3"] = "46c00011FGC", ["movt.ps_2"] = "46c10011FG", ["movt.ps_3"] = "46c10011FGC", ["movz.ps_3"] = "46c00012FGT", ["movn.ps_3"] = "46c00013FGT", ["cvt.s.pu_2"] = "46c00020FG", ["cvt.s.pl_2"] = "46c00028FG", ["pll.ps_3"] = "46c0002cFGH", ["plu.ps_3"] = "46c0002dFGH", ["pul.ps_3"] = "46c0002eFGH", ["puu.ps_3"] = "46c0002fFGH", ["c.f.ps_2"] = "46c00030GH", ["c.f.ps_3"] = "46c00030VGH", ["c.un.ps_2"] = "46c00031GH", ["c.un.ps_3"] = "46c00031VGH", ["c.eq.ps_2"] = "46c00032GH", ["c.eq.ps_3"] = "46c00032VGH", ["c.ueq.ps_2"] = "46c00033GH", ["c.ueq.ps_3"] = "46c00033VGH", ["c.olt.ps_2"] = "46c00034GH", ["c.olt.ps_3"] = "46c00034VGH", ["c.ult.ps_2"] = "46c00035GH", ["c.ult.ps_3"] = "46c00035VGH", ["c.ole.ps_2"] = "46c00036GH", ["c.ole.ps_3"] = "46c00036VGH", ["c.ule.ps_2"] = "46c00037GH", ["c.ule.ps_3"] = "46c00037VGH", ["c.sf.ps_2"] = "46c00038GH", ["c.sf.ps_3"] = "46c00038VGH", ["c.ngle.ps_2"] = "46c00039GH", ["c.ngle.ps_3"] = "46c00039VGH", ["c.seq.ps_2"] = "46c0003aGH", ["c.seq.ps_3"] = "46c0003aVGH", ["c.ngl.ps_2"] = "46c0003bGH", ["c.ngl.ps_3"] = "46c0003bVGH", ["c.lt.ps_2"] = "46c0003cGH", ["c.lt.ps_3"] = "46c0003cVGH", ["c.nge.ps_2"] = "46c0003dGH", ["c.nge.ps_3"] = "46c0003dVGH", ["c.le.ps_2"] = "46c0003eGH", ["c.le.ps_3"] = "46c0003eVGH", ["c.ngt.ps_2"] = "46c0003fGH", ["c.ngt.ps_3"] = "46c0003fVGH", ["cvt.s.w_2"] = "46800020FG", ["cvt.d.w_2"] = "46800021FG", ["cvt.s.l_2"] = "46a00020FG", ["cvt.d.l_2"] = "46a00021FG", -- Opcode COP1X. lwxc1_2 = "4c000000FX", ldxc1_2 = "4c000001FX", luxc1_2 = "4c000005FX", swxc1_2 = "4c000008FX", sdxc1_2 = "4c000009FX", suxc1_2 = "4c00000dFX", prefx_2 = "4c00000fMX", ["alnv.ps_4"] = "4c00001eFGHS", ["madd.s_4"] = "4c000020FRGH", ["madd.d_4"] = "4c000021FRGH", ["madd.ps_4"] = "4c000026FRGH", ["msub.s_4"] = "4c000028FRGH", ["msub.d_4"] = "4c000029FRGH", ["msub.ps_4"] = "4c00002eFRGH", ["nmadd.s_4"] = "4c000030FRGH", ["nmadd.d_4"] = "4c000031FRGH", ["nmadd.ps_4"] = "4c000036FRGH", ["nmsub.s_4"] = "4c000038FRGH", ["nmsub.d_4"] = "4c000039FRGH", ["nmsub.ps_4"] = "4c00003eFRGH", } ------------------------------------------------------------------------------ local function parse_gpr(expr) local tname, ovreg = match(expr, "^([%w_]+):(r[1-3]?[0-9])$") local tp = map_type[tname or expr] if tp then local reg = ovreg or tp.reg if not reg then werror("type `"..(tname or expr).."' needs a register override") end expr = reg end local r = match(expr, "^r([1-3]?[0-9])$") if r then r = tonumber(r) if r <= 31 then return r, tp end end werror("bad register name `"..expr.."'") end local function parse_fpr(expr) local r = match(expr, "^f([1-3]?[0-9])$") if r then r = tonumber(r) if r <= 31 then return r end end werror("bad register name `"..expr.."'") end local function parse_imm(imm, bits, shift, scale, signed) local n = tonumber(imm) if n then local m = sar(n, scale) if shl(m, scale) == n then if signed then local s = sar(m, bits-1) if s == 0 then return shl(m, shift) elseif s == -1 then return shl(m + shl(1, bits), shift) end else if sar(m, bits) == 0 then return shl(m, shift) end end end werror("out of range immediate `"..imm.."'") elseif match(imm, "^[rf]([1-3]?[0-9])$") or match(imm, "^([%w_]+):([rf][1-3]?[0-9])$") then werror("expected immediate operand, got register") else waction("IMM", (signed and 32768 or 0)+scale*1024+bits*32+shift, imm) return 0 end end local function parse_disp(disp) local imm, reg = match(disp, "^(.*)%(([%w_:]+)%)$") if imm then local r = shl(parse_gpr(reg), 21) local extname = match(imm, "^extern%s+(%S+)$") if extname then waction("REL_EXT", map_extern[extname], nil, 1) return r else return r + parse_imm(imm, 16, 0, 0, true) end end local reg, tailr = match(disp, "^([%w_:]+)%s*(.*)$") if reg and tailr ~= "" then local r, tp = parse_gpr(reg) if tp then waction("IMM", 32768+16*32, format(tp.ctypefmt, tailr)) return shl(r, 21) end end werror("bad displacement `"..disp.."'") end local function parse_index(idx) local rt, rs = match(idx, "^(.*)%(([%w_:]+)%)$") if rt then rt = parse_gpr(rt) rs = parse_gpr(rs) return shl(rt, 16) + shl(rs, 21) end werror("bad index `"..idx.."'") end local function parse_label(label, def) local prefix = sub(label, 1, 2) -- =>label (pc label reference) if prefix == "=>" then return "PC", 0, sub(label, 3) end -- ->name (global label reference) if prefix == "->" then return "LG", map_global[sub(label, 3)] end if def then -- [1-9] (local label definition) if match(label, "^[1-9]$") then return "LG", 10+tonumber(label) end else -- [<>][1-9] (local label reference) local dir, lnum = match(label, "^([<>])([1-9])$") if dir then -- Fwd: 1-9, Bkwd: 11-19. return "LG", lnum + (dir == ">" and 0 or 10) end -- extern label (extern label reference) local extname = match(label, "^extern%s+(%S+)$") if extname then return "EXT", map_extern[extname] end end werror("bad label `"..label.."'") end ------------------------------------------------------------------------------ -- Handle opcodes defined with template strings. map_op[".template__"] = function(params, template, nparams) if not params then return sub(template, 9) end local op = tonumber(sub(template, 1, 8), 16) local n = 1 -- Limit number of section buffer positions used by a single dasm_put(). -- A single opcode needs a maximum of 2 positions (ins/ext). if secpos+2 > maxsecpos then wflush() end local pos = wpos() -- Process each character. for p in gmatch(sub(template, 9), ".") do if p == "D" then op = op + shl(parse_gpr(params[n]), 11); n = n + 1 elseif p == "T" then op = op + shl(parse_gpr(params[n]), 16); n = n + 1 elseif p == "S" then op = op + shl(parse_gpr(params[n]), 21); n = n + 1 elseif p == "F" then op = op + shl(parse_fpr(params[n]), 6); n = n + 1 elseif p == "G" then op = op + shl(parse_fpr(params[n]), 11); n = n + 1 elseif p == "H" then op = op + shl(parse_fpr(params[n]), 16); n = n + 1 elseif p == "R" then op = op + shl(parse_fpr(params[n]), 21); n = n + 1 elseif p == "I" then op = op + parse_imm(params[n], 16, 0, 0, true); n = n + 1 elseif p == "U" then op = op + parse_imm(params[n], 16, 0, 0, false); n = n + 1 elseif p == "O" then op = op + parse_disp(params[n]); n = n + 1 elseif p == "X" then op = op + parse_index(params[n]); n = n + 1 elseif p == "B" or p == "J" then local mode, n, s = parse_label(params[n], false) if p == "B" then n = n + 2048 end waction("REL_"..mode, n, s, 1) n = n + 1 elseif p == "A" then op = op + parse_imm(params[n], 5, 6, 0, false); n = n + 1 elseif p == "M" then op = op + parse_imm(params[n], 5, 11, 0, false); n = n + 1 elseif p == "N" then op = op + parse_imm(params[n], 5, 16, 0, false); n = n + 1 elseif p == "C" then op = op + parse_imm(params[n], 3, 18, 0, false); n = n + 1 elseif p == "V" then op = op + parse_imm(params[n], 3, 8, 0, false); n = n + 1 elseif p == "W" then op = op + parse_imm(params[n], 3, 0, 0, false); n = n + 1 elseif p == "Y" then op = op + parse_imm(params[n], 20, 6, 0, false); n = n + 1 elseif p == "Z" then op = op + parse_imm(params[n], 10, 6, 0, false); n = n + 1 elseif p == "=" then op = op + shl(band(op, 0xf800), 5) -- Copy D to T for clz, clo. else assert(false) end end wputpos(pos, op) end ------------------------------------------------------------------------------ -- Pseudo-opcode to mark the position where the action list is to be emitted. map_op[".actionlist_1"] = function(params) if not params then return "cvar" end local name = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeactions(out, name) end) end -- Pseudo-opcode to mark the position where the global enum is to be emitted. map_op[".globals_1"] = function(params) if not params then return "prefix" end local prefix = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeglobals(out, prefix) end) end -- Pseudo-opcode to mark the position where the global names are to be emitted. map_op[".globalnames_1"] = function(params) if not params then return "cvar" end local name = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeglobalnames(out, name) end) end -- Pseudo-opcode to mark the position where the extern names are to be emitted. map_op[".externnames_1"] = function(params) if not params then return "cvar" end local name = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeexternnames(out, name) end) end ------------------------------------------------------------------------------ -- Label pseudo-opcode (converted from trailing colon form). map_op[".label_1"] = function(params) if not params then return "[1-9] | ->global | =>pcexpr" end if secpos+1 > maxsecpos then wflush() end local mode, n, s = parse_label(params[1], true) if mode == "EXT" then werror("bad label definition") end waction("LABEL_"..mode, n, s, 1) end ------------------------------------------------------------------------------ -- Pseudo-opcodes for data storage. map_op[".long_*"] = function(params) if not params then return "imm..." end for _,p in ipairs(params) do local n = tonumber(p) if not n then werror("bad immediate `"..p.."'") end if n < 0 then n = n + 2^32 end wputw(n) if secpos+2 > maxsecpos then wflush() end end end -- Alignment pseudo-opcode. map_op[".align_1"] = function(params) if not params then return "numpow2" end if secpos+1 > maxsecpos then wflush() end local align = tonumber(params[1]) if align then local x = align -- Must be a power of 2 in the range (2 ... 256). for i=1,8 do x = x / 2 if x == 1 then waction("ALIGN", align-1, nil, 1) -- Action byte is 2**n-1. return end end end werror("bad alignment") end ------------------------------------------------------------------------------ -- Pseudo-opcode for (primitive) type definitions (map to C types). map_op[".type_3"] = function(params, nparams) if not params then return nparams == 2 and "name, ctype" or "name, ctype, reg" end local name, ctype, reg = params[1], params[2], params[3] if not match(name, "^[%a_][%w_]*$") then werror("bad type name `"..name.."'") end local tp = map_type[name] if tp then werror("duplicate type `"..name.."'") end -- Add #type to defines. A bit unclean to put it in map_archdef. map_archdef["#"..name] = "sizeof("..ctype..")" -- Add new type and emit shortcut define. local num = ctypenum + 1 map_type[name] = { ctype = ctype, ctypefmt = format("Dt%X(%%s)", num), reg = reg, } wline(format("#define Dt%X(_V) (int)(ptrdiff_t)&(((%s *)0)_V)", num, ctype)) ctypenum = num end map_op[".type_2"] = map_op[".type_3"] -- Dump type definitions. local function dumptypes(out, lvl) local t = {} for name in pairs(map_type) do t[#t+1] = name end sort(t) out:write("Type definitions:\n") for _,name in ipairs(t) do local tp = map_type[name] local reg = tp.reg or "" out:write(format(" %-20s %-20s %s\n", name, tp.ctype, reg)) end out:write("\n") end ------------------------------------------------------------------------------ -- Set the current section. function _M.section(num) waction("SECTION", num) wflush(true) -- SECTION is a terminal action. end ------------------------------------------------------------------------------ -- Dump architecture description. function _M.dumparch(out) out:write(format("DynASM %s version %s, released %s\n\n", _info.arch, _info.version, _info.release)) dumpactions(out) end -- Dump all user defined elements. function _M.dumpdef(out, lvl) dumptypes(out, lvl) dumpglobals(out, lvl) dumpexterns(out, lvl) end ------------------------------------------------------------------------------ -- Pass callbacks from/to the DynASM core. function _M.passcb(wl, we, wf, ww) wline, werror, wfatal, wwarn = wl, we, wf, ww return wflush end -- Setup the arch-specific module. function _M.setup(arch, opt) g_arch, g_opt = arch, opt end -- Merge the core maps and the arch-specific maps. function _M.mergemaps(map_coreop, map_def) setmetatable(map_op, { __index = map_coreop }) setmetatable(map_def, { __index = map_archdef }) return map_op, map_def end return _M ------------------------------------------------------------------------------ MoarVM-2018.03/3rdparty/dynasm/dasm_ppc.h0000644000175000017510000002751613237701235020223 0ustar samanthasamantha/* ** DynASM PPC encoding engine. ** Copyright (C) 2005-2015 Mike Pall. All rights reserved. ** Released under the MIT license. See dynasm.lua for full copyright notice. */ #include #include #include #include #define DASM_ARCH "ppc" #ifndef DASM_EXTERN #define DASM_EXTERN(a,b,c,d) 0 #endif /* Action definitions. */ enum { DASM_STOP, DASM_SECTION, DASM_ESC, DASM_REL_EXT, /* The following actions need a buffer position. */ DASM_ALIGN, DASM_REL_LG, DASM_LABEL_LG, /* The following actions also have an argument. */ DASM_REL_PC, DASM_LABEL_PC, DASM_IMM, DASM__MAX }; /* Maximum number of section buffer positions for a single dasm_put() call. */ #define DASM_MAXSECPOS 25 /* DynASM encoder status codes. Action list offset or number are or'ed in. */ #define DASM_S_OK 0x00000000 #define DASM_S_NOMEM 0x01000000 #define DASM_S_PHASE 0x02000000 #define DASM_S_MATCH_SEC 0x03000000 #define DASM_S_RANGE_I 0x11000000 #define DASM_S_RANGE_SEC 0x12000000 #define DASM_S_RANGE_LG 0x13000000 #define DASM_S_RANGE_PC 0x14000000 #define DASM_S_RANGE_REL 0x15000000 #define DASM_S_UNDEF_LG 0x21000000 #define DASM_S_UNDEF_PC 0x22000000 /* Macros to convert positions (8 bit section + 24 bit index). */ #define DASM_POS2IDX(pos) ((pos)&0x00ffffff) #define DASM_POS2BIAS(pos) ((pos)&0xff000000) #define DASM_SEC2POS(sec) ((sec)<<24) #define DASM_POS2SEC(pos) ((pos)>>24) #define DASM_POS2PTR(D, pos) (D->sections[DASM_POS2SEC(pos)].rbuf + (pos)) /* Action list type. */ typedef const unsigned int *dasm_ActList; /* Per-section structure. */ typedef struct dasm_Section { int *rbuf; /* Biased buffer pointer (negative section bias). */ int *buf; /* True buffer pointer. */ size_t bsize; /* Buffer size in bytes. */ int pos; /* Biased buffer position. */ int epos; /* End of biased buffer position - max single put. */ int ofs; /* Byte offset into section. */ } dasm_Section; /* Core structure holding the DynASM encoding state. */ struct dasm_State { size_t psize; /* Allocated size of this structure. */ dasm_ActList actionlist; /* Current actionlist pointer. */ int *lglabels; /* Local/global chain/pos ptrs. */ size_t lgsize; int *pclabels; /* PC label chains/pos ptrs. */ size_t pcsize; void **globals; /* Array of globals (bias -10). */ dasm_Section *section; /* Pointer to active section. */ size_t codesize; /* Total size of all code sections. */ int maxsection; /* 0 <= sectionidx < maxsection. */ int status; /* Status code. */ dasm_Section sections[1]; /* All sections. Alloc-extended. */ }; /* The size of the core structure depends on the max. number of sections. */ #define DASM_PSZ(ms) (sizeof(dasm_State)+(ms-1)*sizeof(dasm_Section)) /* Initialize DynASM state. */ void dasm_init(Dst_DECL, int maxsection) { dasm_State *D; size_t psz = 0; int i; Dst_REF = NULL; DASM_M_GROW(Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ(maxsection)); D = Dst_REF; D->psize = psz; D->lglabels = NULL; D->lgsize = 0; D->pclabels = NULL; D->pcsize = 0; D->globals = NULL; D->maxsection = maxsection; for (i = 0; i < maxsection; i++) { D->sections[i].buf = NULL; /* Need this for pass3. */ D->sections[i].rbuf = D->sections[i].buf - DASM_SEC2POS(i); D->sections[i].bsize = 0; D->sections[i].epos = 0; /* Wrong, but is recalculated after resize. */ } } /* Free DynASM state. */ void dasm_free(Dst_DECL) { dasm_State *D = Dst_REF; int i; for (i = 0; i < D->maxsection; i++) if (D->sections[i].buf) DASM_M_FREE(Dst, D->sections[i].buf, D->sections[i].bsize); if (D->pclabels) DASM_M_FREE(Dst, D->pclabels, D->pcsize); if (D->lglabels) DASM_M_FREE(Dst, D->lglabels, D->lgsize); DASM_M_FREE(Dst, D, D->psize); } /* Setup global label array. Must be called before dasm_setup(). */ void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl) { dasm_State *D = Dst_REF; D->globals = gl - 10; /* Negative bias to compensate for locals. */ DASM_M_GROW(Dst, int, D->lglabels, D->lgsize, (10+maxgl)*sizeof(int)); } /* Grow PC label array. Can be called after dasm_setup(), too. */ void dasm_growpc(Dst_DECL, unsigned int maxpc) { dasm_State *D = Dst_REF; size_t osz = D->pcsize; DASM_M_GROW(Dst, int, D->pclabels, D->pcsize, maxpc*sizeof(int)); memset((void *)(((unsigned char *)D->pclabels)+osz), 0, D->pcsize-osz); } /* Setup encoder. */ void dasm_setup(Dst_DECL, const void *actionlist) { dasm_State *D = Dst_REF; int i; D->actionlist = (dasm_ActList)actionlist; D->status = DASM_S_OK; D->section = &D->sections[0]; memset((void *)D->lglabels, 0, D->lgsize); if (D->pclabels) memset((void *)D->pclabels, 0, D->pcsize); for (i = 0; i < D->maxsection; i++) { D->sections[i].pos = DASM_SEC2POS(i); D->sections[i].ofs = 0; } } #ifdef DASM_CHECKS #define CK(x, st) \ do { if (!(x)) { \ D->status = DASM_S_##st|(p-D->actionlist-1); return; } } while (0) #define CKPL(kind, st) \ do { if ((size_t)((char *)pl-(char *)D->kind##labels) >= D->kind##size) { \ D->status = DASM_S_RANGE_##st|(p-D->actionlist-1); return; } } while (0) #else #define CK(x, st) ((void)0) #define CKPL(kind, st) ((void)0) #endif /* Pass 1: Store actions and args, link branches/labels, estimate offsets. */ void dasm_put(Dst_DECL, int start, ...) { va_list ap; dasm_State *D = Dst_REF; dasm_ActList p = D->actionlist + start; dasm_Section *sec = D->section; int pos = sec->pos, ofs = sec->ofs; int *b; if (pos >= sec->epos) { DASM_M_GROW(Dst, int, sec->buf, sec->bsize, sec->bsize + 2*DASM_MAXSECPOS*sizeof(int)); sec->rbuf = sec->buf - DASM_POS2BIAS(pos); sec->epos = (int)sec->bsize/sizeof(int) - DASM_MAXSECPOS+DASM_POS2BIAS(pos); } b = sec->rbuf; b[pos++] = start; va_start(ap, start); while (1) { unsigned int ins = *p++; unsigned int action = (ins >> 16); if (action >= DASM__MAX) { ofs += 4; } else { int *pl, n = action >= DASM_REL_PC ? va_arg(ap, int) : 0; switch (action) { case DASM_STOP: goto stop; case DASM_SECTION: n = (ins & 255); CK(n < D->maxsection, RANGE_SEC); D->section = &D->sections[n]; goto stop; case DASM_ESC: p++; ofs += 4; break; case DASM_REL_EXT: break; case DASM_ALIGN: ofs += (ins & 255); b[pos++] = ofs; break; case DASM_REL_LG: n = (ins & 2047) - 10; pl = D->lglabels + n; /* Bkwd rel or global. */ if (n >= 0) { CK(n>=10||*pl<0, RANGE_LG); CKPL(lg, LG); goto putrel; } pl += 10; n = *pl; if (n < 0) n = 0; /* Start new chain for fwd rel if label exists. */ goto linkrel; case DASM_REL_PC: pl = D->pclabels + n; CKPL(pc, PC); putrel: n = *pl; if (n < 0) { /* Label exists. Get label pos and store it. */ b[pos] = -n; } else { linkrel: b[pos] = n; /* Else link to rel chain, anchored at label. */ *pl = pos; } pos++; break; case DASM_LABEL_LG: pl = D->lglabels + (ins & 2047) - 10; CKPL(lg, LG); goto putlabel; case DASM_LABEL_PC: pl = D->pclabels + n; CKPL(pc, PC); putlabel: n = *pl; /* n > 0: Collapse rel chain and replace with label pos. */ while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = pos; } *pl = -pos; /* Label exists now. */ b[pos++] = ofs; /* Store pass1 offset estimate. */ break; case DASM_IMM: #ifdef DASM_CHECKS CK((n & ((1<<((ins>>10)&31))-1)) == 0, RANGE_I); #endif n >>= ((ins>>10)&31); #ifdef DASM_CHECKS if (ins & 0x8000) CK(((n + (1<<(((ins>>5)&31)-1)))>>((ins>>5)&31)) == 0, RANGE_I); else CK((n>>((ins>>5)&31)) == 0, RANGE_I); #endif b[pos++] = n; break; } } } stop: va_end(ap); sec->pos = pos; sec->ofs = ofs; } #undef CK /* Pass 2: Link sections, shrink aligns, fix label offsets. */ int dasm_link(Dst_DECL, size_t *szp) { dasm_State *D = Dst_REF; int secnum; int ofs = 0; #ifdef DASM_CHECKS *szp = 0; if (D->status != DASM_S_OK) return D->status; { int pc; for (pc = 0; pc*sizeof(int) < D->pcsize; pc++) if (D->pclabels[pc] > 0) return DASM_S_UNDEF_PC|pc; } #endif { /* Handle globals not defined in this translation unit. */ int idx; for (idx = 20; idx*sizeof(int) < D->lgsize; idx++) { int n = D->lglabels[idx]; /* Undefined label: Collapse rel chain and replace with marker (< 0). */ while (n > 0) { int *pb = DASM_POS2PTR(D, n); n = *pb; *pb = -idx; } } } /* Combine all code sections. No support for data sections (yet). */ for (secnum = 0; secnum < D->maxsection; secnum++) { dasm_Section *sec = D->sections + secnum; int *b = sec->rbuf; int pos = DASM_SEC2POS(secnum); int lastpos = sec->pos; while (pos != lastpos) { dasm_ActList p = D->actionlist + b[pos++]; while (1) { unsigned int ins = *p++; unsigned int action = (ins >> 16); switch (action) { case DASM_STOP: case DASM_SECTION: goto stop; case DASM_ESC: p++; break; case DASM_REL_EXT: break; case DASM_ALIGN: ofs -= (b[pos++] + ofs) & (ins & 255); break; case DASM_REL_LG: case DASM_REL_PC: pos++; break; case DASM_LABEL_LG: case DASM_LABEL_PC: b[pos++] += ofs; break; case DASM_IMM: pos++; break; } } stop: (void)0; } ofs += sec->ofs; /* Next section starts right after current section. */ } D->codesize = ofs; /* Total size of all code sections */ *szp = ofs; return DASM_S_OK; } #ifdef DASM_CHECKS #define CK(x, st) \ do { if (!(x)) return DASM_S_##st|(p-D->actionlist-1); } while (0) #else #define CK(x, st) ((void)0) #endif /* Pass 3: Encode sections. */ int dasm_encode(Dst_DECL, void *buffer) { dasm_State *D = Dst_REF; char *base = (char *)buffer; unsigned int *cp = (unsigned int *)buffer; int secnum; /* Encode all code sections. No support for data sections (yet). */ for (secnum = 0; secnum < D->maxsection; secnum++) { dasm_Section *sec = D->sections + secnum; int *b = sec->buf; int *endb = sec->rbuf + sec->pos; while (b != endb) { dasm_ActList p = D->actionlist + *b++; while (1) { unsigned int ins = *p++; unsigned int action = (ins >> 16); int n = (action >= DASM_ALIGN && action < DASM__MAX) ? *b++ : 0; switch (action) { case DASM_STOP: case DASM_SECTION: goto stop; case DASM_ESC: *cp++ = *p++; break; case DASM_REL_EXT: n = DASM_EXTERN(Dst, (unsigned char *)cp, (ins & 2047), 1) - 4; goto patchrel; case DASM_ALIGN: ins &= 255; while ((((char *)cp - base) & ins)) *cp++ = 0x60000000; break; case DASM_REL_LG: CK(n >= 0, UNDEF_LG); case DASM_REL_PC: CK(n >= 0, UNDEF_PC); n = *DASM_POS2PTR(D, n) - (int)((char *)cp - base); patchrel: CK((n & 3) == 0 && (((n+4) + ((ins & 2048) ? 0x00008000 : 0x02000000)) >> ((ins & 2048) ? 16 : 26)) == 0, RANGE_REL); cp[-1] |= ((n+4) & ((ins & 2048) ? 0x0000fffc: 0x03fffffc)); break; case DASM_LABEL_LG: ins &= 2047; if (ins >= 20) D->globals[ins-10] = (void *)(base + n); break; case DASM_LABEL_PC: break; case DASM_IMM: cp[-1] |= (n & ((1<<((ins>>5)&31))-1)) << (ins&31); break; default: *cp++ = ins; break; } } stop: (void)0; } } if (base + D->codesize != (char *)cp) /* Check for phase errors. */ return DASM_S_PHASE; return DASM_S_OK; } #undef CK /* Get PC label offset. */ int dasm_getpclabel(Dst_DECL, unsigned int pc) { dasm_State *D = Dst_REF; if (pc*sizeof(int) < D->pcsize) { int pos = D->pclabels[pc]; if (pos < 0) return *DASM_POS2PTR(D, -pos); if (pos > 0) return -1; /* Undefined. */ } return -2; /* Unused or out of range. */ } #ifdef DASM_CHECKS /* Optional sanity checker to call between isolated encoding steps. */ int dasm_checkstep(Dst_DECL, int secmatch) { dasm_State *D = Dst_REF; if (D->status == DASM_S_OK) { int i; for (i = 1; i <= 9; i++) { if (D->lglabels[i] > 0) { D->status = DASM_S_UNDEF_LG|i; break; } D->lglabels[i] = 0; } } if (D->status == DASM_S_OK && secmatch >= 0 && D->section != &D->sections[secmatch]) D->status = DASM_S_MATCH_SEC|(D->section-D->sections); return D->status; } #endif MoarVM-2018.03/3rdparty/dynasm/dasm_ppc.lua0000644000175000017510000011031013237701103020530 0ustar samanthasamantha------------------------------------------------------------------------------ -- DynASM PPC module. -- -- Copyright (C) 2005-2015 Mike Pall. All rights reserved. -- See dynasm.lua for full copyright notice. ------------------------------------------------------------------------------ -- Module information: local _info = { arch = "ppc", description = "DynASM PPC module", version = "1.3.0", vernum = 10300, release = "2011-05-05", author = "Mike Pall", license = "MIT", } -- Exported glue functions for the arch-specific module. local _M = { _info = _info } -- Cache library functions. local type, tonumber, pairs, ipairs = type, tonumber, pairs, ipairs local assert, setmetatable = assert, setmetatable local _s = string local sub, format, byte, char = _s.sub, _s.format, _s.byte, _s.char local match, gmatch = _s.match, _s.gmatch local concat, sort = table.concat, table.sort local bit = bit or require("bit") local band, shl, shr, sar = bit.band, bit.lshift, bit.rshift, bit.arshift local tohex = bit.tohex -- Inherited tables and callbacks. local g_opt, g_arch local wline, werror, wfatal, wwarn -- Action name list. -- CHECK: Keep this in sync with the C code! local action_names = { "STOP", "SECTION", "ESC", "REL_EXT", "ALIGN", "REL_LG", "LABEL_LG", "REL_PC", "LABEL_PC", "IMM", } -- Maximum number of section buffer positions for dasm_put(). -- CHECK: Keep this in sync with the C code! local maxsecpos = 25 -- Keep this low, to avoid excessively long C lines. -- Action name -> action number. local map_action = {} for n,name in ipairs(action_names) do map_action[name] = n-1 end -- Action list buffer. local actlist = {} -- Argument list for next dasm_put(). Start with offset 0 into action list. local actargs = { 0 } -- Current number of section buffer positions for dasm_put(). local secpos = 1 ------------------------------------------------------------------------------ -- Dump action names and numbers. local function dumpactions(out) out:write("DynASM encoding engine action codes:\n") for n,name in ipairs(action_names) do local num = map_action[name] out:write(format(" %-10s %02X %d\n", name, num, num)) end out:write("\n") end -- Write action list buffer as a huge static C array. local function writeactions(out, name) local nn = #actlist if nn == 0 then nn = 1; actlist[0] = map_action.STOP end out:write("static const unsigned int ", name, "[", nn, "] = {\n") for i = 1,nn-1 do assert(out:write("0x", tohex(actlist[i]), ",\n")) end assert(out:write("0x", tohex(actlist[nn]), "\n};\n\n")) end ------------------------------------------------------------------------------ -- Add word to action list. local function wputxw(n) assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range") actlist[#actlist+1] = n end -- Add action to list with optional arg. Advance buffer pos, too. local function waction(action, val, a, num) local w = assert(map_action[action], "bad action name `"..action.."'") wputxw(w * 0x10000 + (val or 0)) if a then actargs[#actargs+1] = a end if a or num then secpos = secpos + (num or 1) end end -- Flush action list (intervening C code or buffer pos overflow). local function wflush(term) if #actlist == actargs[1] then return end -- Nothing to flush. if not term then waction("STOP") end -- Terminate action list. wline(format("dasm_put(Dst, %s);", concat(actargs, ", ")), true) actargs = { #actlist } -- Actionlist offset is 1st arg to next dasm_put(). secpos = 1 -- The actionlist offset occupies a buffer position, too. end -- Put escaped word. local function wputw(n) if n <= 0xffffff then waction("ESC") end wputxw(n) end -- Reserve position for word. local function wpos() local pos = #actlist+1 actlist[pos] = "" return pos end -- Store word to reserved position. local function wputpos(pos, n) assert(n >= 0 and n <= 0xffffffff and n % 1 == 0, "word out of range") actlist[pos] = n end ------------------------------------------------------------------------------ -- Global label name -> global label number. With auto assignment on 1st use. local next_global = 20 local map_global = setmetatable({}, { __index = function(t, name) if not match(name, "^[%a_][%w_]*$") then werror("bad global label") end local n = next_global if n > 2047 then werror("too many global labels") end next_global = n + 1 t[name] = n return n end}) -- Dump global labels. local function dumpglobals(out, lvl) local t = {} for name, n in pairs(map_global) do t[n] = name end out:write("Global labels:\n") for i=20,next_global-1 do out:write(format(" %s\n", t[i])) end out:write("\n") end -- Write global label enum. local function writeglobals(out, prefix) local t = {} for name, n in pairs(map_global) do t[n] = name end out:write("enum {\n") for i=20,next_global-1 do out:write(" ", prefix, t[i], ",\n") end out:write(" ", prefix, "_MAX\n};\n") end -- Write global label names. local function writeglobalnames(out, name) local t = {} for name, n in pairs(map_global) do t[n] = name end out:write("static const char *const ", name, "[] = {\n") for i=20,next_global-1 do out:write(" \"", t[i], "\",\n") end out:write(" (const char *)0\n};\n") end ------------------------------------------------------------------------------ -- Extern label name -> extern label number. With auto assignment on 1st use. local next_extern = 0 local map_extern_ = {} local map_extern = setmetatable({}, { __index = function(t, name) -- No restrictions on the name for now. local n = next_extern if n > 2047 then werror("too many extern labels") end next_extern = n + 1 t[name] = n map_extern_[n] = name return n end}) -- Dump extern labels. local function dumpexterns(out, lvl) out:write("Extern labels:\n") for i=0,next_extern-1 do out:write(format(" %s\n", map_extern_[i])) end out:write("\n") end -- Write extern label names. local function writeexternnames(out, name) out:write("static const char *const ", name, "[] = {\n") for i=0,next_extern-1 do out:write(" \"", map_extern_[i], "\",\n") end out:write(" (const char *)0\n};\n") end ------------------------------------------------------------------------------ -- Arch-specific maps. local map_archdef = { sp = "r1" } -- Ext. register name -> int. name. local map_type = {} -- Type name -> { ctype, reg } local ctypenum = 0 -- Type number (for Dt... macros). -- Reverse defines for registers. function _M.revdef(s) if s == "r1" then return "sp" end return s end local map_cond = { lt = 0, gt = 1, eq = 2, so = 3, ge = 4, le = 5, ne = 6, ns = 7, } ------------------------------------------------------------------------------ -- Template strings for PPC instructions. local map_op = { tdi_3 = "08000000ARI", twi_3 = "0c000000ARI", mulli_3 = "1c000000RRI", subfic_3 = "20000000RRI", cmplwi_3 = "28000000XRU", cmplwi_2 = "28000000-RU", cmpldi_3 = "28200000XRU", cmpldi_2 = "28200000-RU", cmpwi_3 = "2c000000XRI", cmpwi_2 = "2c000000-RI", cmpdi_3 = "2c200000XRI", cmpdi_2 = "2c200000-RI", addic_3 = "30000000RRI", ["addic._3"] = "34000000RRI", addi_3 = "38000000RR0I", li_2 = "38000000RI", la_2 = "38000000RD", addis_3 = "3c000000RR0I", lis_2 = "3c000000RI", lus_2 = "3c000000RU", bc_3 = "40000000AAK", bcl_3 = "40000001AAK", bdnz_1 = "42000000K", bdz_1 = "42400000K", sc_0 = "44000000", b_1 = "48000000J", bl_1 = "48000001J", rlwimi_5 = "50000000RR~AAA.", rlwinm_5 = "54000000RR~AAA.", rlwnm_5 = "5c000000RR~RAA.", ori_3 = "60000000RR~U", nop_0 = "60000000", oris_3 = "64000000RR~U", xori_3 = "68000000RR~U", xoris_3 = "6c000000RR~U", ["andi._3"] = "70000000RR~U", ["andis._3"] = "74000000RR~U", lwz_2 = "80000000RD", lwzu_2 = "84000000RD", lbz_2 = "88000000RD", lbzu_2 = "8c000000RD", stw_2 = "90000000RD", stwu_2 = "94000000RD", stb_2 = "98000000RD", stbu_2 = "9c000000RD", lhz_2 = "a0000000RD", lhzu_2 = "a4000000RD", lha_2 = "a8000000RD", lhau_2 = "ac000000RD", sth_2 = "b0000000RD", sthu_2 = "b4000000RD", lmw_2 = "b8000000RD", stmw_2 = "bc000000RD", lfs_2 = "c0000000FD", lfsu_2 = "c4000000FD", lfd_2 = "c8000000FD", lfdu_2 = "cc000000FD", stfs_2 = "d0000000FD", stfsu_2 = "d4000000FD", stfd_2 = "d8000000FD", stfdu_2 = "dc000000FD", ld_2 = "e8000000RD", -- NYI: displacement must be divisible by 4. ldu_2 = "e8000001RD", lwa_2 = "e8000002RD", std_2 = "f8000000RD", stdu_2 = "f8000001RD", -- Primary opcode 19: mcrf_2 = "4c000000XX", isync_0 = "4c00012c", crnor_3 = "4c000042CCC", crnot_2 = "4c000042CC=", crandc_3 = "4c000102CCC", crxor_3 = "4c000182CCC", crclr_1 = "4c000182C==", crnand_3 = "4c0001c2CCC", crand_3 = "4c000202CCC", creqv_3 = "4c000242CCC", crset_1 = "4c000242C==", crorc_3 = "4c000342CCC", cror_3 = "4c000382CCC", crmove_2 = "4c000382CC=", bclr_2 = "4c000020AA", bclrl_2 = "4c000021AA", bcctr_2 = "4c000420AA", bcctrl_2 = "4c000421AA", blr_0 = "4e800020", blrl_0 = "4e800021", bctr_0 = "4e800420", bctrl_0 = "4e800421", -- Primary opcode 31: cmpw_3 = "7c000000XRR", cmpw_2 = "7c000000-RR", cmpd_3 = "7c200000XRR", cmpd_2 = "7c200000-RR", tw_3 = "7c000008ARR", subfc_3 = "7c000010RRR.", subc_3 = "7c000010RRR~.", mulhdu_3 = "7c000012RRR.", addc_3 = "7c000014RRR.", mulhwu_3 = "7c000016RRR.", isel_4 = "7c00001eRRRC", isellt_3 = "7c00001eRRR", iselgt_3 = "7c00005eRRR", iseleq_3 = "7c00009eRRR", mfcr_1 = "7c000026R", mfocrf_2 = "7c100026RG", mtcrf_2 = "7c000120GR", mtocrf_2 = "7c100120GR", lwarx_3 = "7c000028RR0R", ldx_3 = "7c00002aRR0R", lwzx_3 = "7c00002eRR0R", slw_3 = "7c000030RR~R.", cntlzw_2 = "7c000034RR~", sld_3 = "7c000036RR~R.", and_3 = "7c000038RR~R.", cmplw_3 = "7c000040XRR", cmplw_2 = "7c000040-RR", cmpld_3 = "7c200040XRR", cmpld_2 = "7c200040-RR", subf_3 = "7c000050RRR.", sub_3 = "7c000050RRR~.", ldux_3 = "7c00006aRR0R", dcbst_2 = "7c00006c-RR", lwzux_3 = "7c00006eRR0R", cntlzd_2 = "7c000074RR~", andc_3 = "7c000078RR~R.", td_3 = "7c000088ARR", mulhd_3 = "7c000092RRR.", mulhw_3 = "7c000096RRR.", ldarx_3 = "7c0000a8RR0R", dcbf_2 = "7c0000ac-RR", lbzx_3 = "7c0000aeRR0R", neg_2 = "7c0000d0RR.", lbzux_3 = "7c0000eeRR0R", popcntb_2 = "7c0000f4RR~", not_2 = "7c0000f8RR~%.", nor_3 = "7c0000f8RR~R.", subfe_3 = "7c000110RRR.", sube_3 = "7c000110RRR~.", adde_3 = "7c000114RRR.", stdx_3 = "7c00012aRR0R", stwcx_3 = "7c00012cRR0R.", stwx_3 = "7c00012eRR0R", prtyw_2 = "7c000134RR~", stdux_3 = "7c00016aRR0R", stwux_3 = "7c00016eRR0R", prtyd_2 = "7c000174RR~", subfze_2 = "7c000190RR.", addze_2 = "7c000194RR.", stdcx_3 = "7c0001acRR0R.", stbx_3 = "7c0001aeRR0R", subfme_2 = "7c0001d0RR.", mulld_3 = "7c0001d2RRR.", addme_2 = "7c0001d4RR.", mullw_3 = "7c0001d6RRR.", dcbtst_2 = "7c0001ec-RR", stbux_3 = "7c0001eeRR0R", add_3 = "7c000214RRR.", dcbt_2 = "7c00022c-RR", lhzx_3 = "7c00022eRR0R", eqv_3 = "7c000238RR~R.", eciwx_3 = "7c00026cRR0R", lhzux_3 = "7c00026eRR0R", xor_3 = "7c000278RR~R.", mfspefscr_1 = "7c0082a6R", mfxer_1 = "7c0102a6R", mflr_1 = "7c0802a6R", mfctr_1 = "7c0902a6R", lwax_3 = "7c0002aaRR0R", lhax_3 = "7c0002aeRR0R", mftb_1 = "7c0c42e6R", mftbu_1 = "7c0d42e6R", lwaux_3 = "7c0002eaRR0R", lhaux_3 = "7c0002eeRR0R", sthx_3 = "7c00032eRR0R", orc_3 = "7c000338RR~R.", ecowx_3 = "7c00036cRR0R", sthux_3 = "7c00036eRR0R", or_3 = "7c000378RR~R.", mr_2 = "7c000378RR~%.", divdu_3 = "7c000392RRR.", divwu_3 = "7c000396RRR.", mtspefscr_1 = "7c0083a6R", mtxer_1 = "7c0103a6R", mtlr_1 = "7c0803a6R", mtctr_1 = "7c0903a6R", dcbi_2 = "7c0003ac-RR", nand_3 = "7c0003b8RR~R.", divd_3 = "7c0003d2RRR.", divw_3 = "7c0003d6RRR.", cmpb_3 = "7c0003f8RR~R.", mcrxr_1 = "7c000400X", subfco_3 = "7c000410RRR.", subco_3 = "7c000410RRR~.", addco_3 = "7c000414RRR.", ldbrx_3 = "7c000428RR0R", lswx_3 = "7c00042aRR0R", lwbrx_3 = "7c00042cRR0R", lfsx_3 = "7c00042eFR0R", srw_3 = "7c000430RR~R.", srd_3 = "7c000436RR~R.", subfo_3 = "7c000450RRR.", subo_3 = "7c000450RRR~.", lfsux_3 = "7c00046eFR0R", lswi_3 = "7c0004aaRR0A", sync_0 = "7c0004ac", lwsync_0 = "7c2004ac", ptesync_0 = "7c4004ac", lfdx_3 = "7c0004aeFR0R", nego_2 = "7c0004d0RR.", lfdux_3 = "7c0004eeFR0R", subfeo_3 = "7c000510RRR.", subeo_3 = "7c000510RRR~.", addeo_3 = "7c000514RRR.", stdbrx_3 = "7c000528RR0R", stswx_3 = "7c00052aRR0R", stwbrx_3 = "7c00052cRR0R", stfsx_3 = "7c00052eFR0R", stfsux_3 = "7c00056eFR0R", subfzeo_2 = "7c000590RR.", addzeo_2 = "7c000594RR.", stswi_3 = "7c0005aaRR0A", stfdx_3 = "7c0005aeFR0R", subfmeo_2 = "7c0005d0RR.", mulldo_3 = "7c0005d2RRR.", addmeo_2 = "7c0005d4RR.", mullwo_3 = "7c0005d6RRR.", dcba_2 = "7c0005ec-RR", stfdux_3 = "7c0005eeFR0R", addo_3 = "7c000614RRR.", lhbrx_3 = "7c00062cRR0R", sraw_3 = "7c000630RR~R.", srad_3 = "7c000634RR~R.", srawi_3 = "7c000670RR~A.", sradi_3 = "7c000674RR~H.", eieio_0 = "7c0006ac", lfiwax_3 = "7c0006aeFR0R", sthbrx_3 = "7c00072cRR0R", extsh_2 = "7c000734RR~.", extsb_2 = "7c000774RR~.", divduo_3 = "7c000792RRR.", divwou_3 = "7c000796RRR.", icbi_2 = "7c0007ac-RR", stfiwx_3 = "7c0007aeFR0R", extsw_2 = "7c0007b4RR~.", divdo_3 = "7c0007d2RRR.", divwo_3 = "7c0007d6RRR.", dcbz_2 = "7c0007ec-RR", -- Primary opcode 30: rldicl_4 = "78000000RR~HM.", rldicr_4 = "78000004RR~HM.", rldic_4 = "78000008RR~HM.", rldimi_4 = "7800000cRR~HM.", rldcl_4 = "78000010RR~RM.", rldcr_4 = "78000012RR~RM.", -- Primary opcode 59: fdivs_3 = "ec000024FFF.", fsubs_3 = "ec000028FFF.", fadds_3 = "ec00002aFFF.", fsqrts_2 = "ec00002cF-F.", fres_2 = "ec000030F-F.", fmuls_3 = "ec000032FF-F.", frsqrtes_2 = "ec000034F-F.", fmsubs_4 = "ec000038FFFF~.", fmadds_4 = "ec00003aFFFF~.", fnmsubs_4 = "ec00003cFFFF~.", fnmadds_4 = "ec00003eFFFF~.", -- Primary opcode 63: fdiv_3 = "fc000024FFF.", fsub_3 = "fc000028FFF.", fadd_3 = "fc00002aFFF.", fsqrt_2 = "fc00002cF-F.", fsel_4 = "fc00002eFFFF~.", fre_2 = "fc000030F-F.", fmul_3 = "fc000032FF-F.", frsqrte_2 = "fc000034F-F.", fmsub_4 = "fc000038FFFF~.", fmadd_4 = "fc00003aFFFF~.", fnmsub_4 = "fc00003cFFFF~.", fnmadd_4 = "fc00003eFFFF~.", fcmpu_3 = "fc000000XFF", fcpsgn_3 = "fc000010FFF.", fcmpo_3 = "fc000040XFF", mtfsb1_1 = "fc00004cA", fneg_2 = "fc000050F-F.", mcrfs_2 = "fc000080XX", mtfsb0_1 = "fc00008cA", fmr_2 = "fc000090F-F.", frsp_2 = "fc000018F-F.", fctiw_2 = "fc00001cF-F.", fctiwz_2 = "fc00001eF-F.", mtfsfi_2 = "fc00010cAA", -- NYI: upshift. fnabs_2 = "fc000110F-F.", fabs_2 = "fc000210F-F.", frin_2 = "fc000310F-F.", friz_2 = "fc000350F-F.", frip_2 = "fc000390F-F.", frim_2 = "fc0003d0F-F.", mffs_1 = "fc00048eF.", -- NYI: mtfsf, mtfsb0, mtfsb1. fctid_2 = "fc00065cF-F.", fctidz_2 = "fc00065eF-F.", fcfid_2 = "fc00069cF-F.", -- Primary opcode 4, SPE APU extension: evaddw_3 = "10000200RRR", evaddiw_3 = "10000202RAR~", evsubw_3 = "10000204RRR~", evsubiw_3 = "10000206RAR~", evabs_2 = "10000208RR", evneg_2 = "10000209RR", evextsb_2 = "1000020aRR", evextsh_2 = "1000020bRR", evrndw_2 = "1000020cRR", evcntlzw_2 = "1000020dRR", evcntlsw_2 = "1000020eRR", brinc_3 = "1000020fRRR", evand_3 = "10000211RRR", evandc_3 = "10000212RRR", evxor_3 = "10000216RRR", evor_3 = "10000217RRR", evmr_2 = "10000217RR=", evnor_3 = "10000218RRR", evnot_2 = "10000218RR=", eveqv_3 = "10000219RRR", evorc_3 = "1000021bRRR", evnand_3 = "1000021eRRR", evsrwu_3 = "10000220RRR", evsrws_3 = "10000221RRR", evsrwiu_3 = "10000222RRA", evsrwis_3 = "10000223RRA", evslw_3 = "10000224RRR", evslwi_3 = "10000226RRA", evrlw_3 = "10000228RRR", evsplati_2 = "10000229RS", evrlwi_3 = "1000022aRRA", evsplatfi_2 = "1000022bRS", evmergehi_3 = "1000022cRRR", evmergelo_3 = "1000022dRRR", evcmpgtu_3 = "10000230XRR", evcmpgtu_2 = "10000230-RR", evcmpgts_3 = "10000231XRR", evcmpgts_2 = "10000231-RR", evcmpltu_3 = "10000232XRR", evcmpltu_2 = "10000232-RR", evcmplts_3 = "10000233XRR", evcmplts_2 = "10000233-RR", evcmpeq_3 = "10000234XRR", evcmpeq_2 = "10000234-RR", evsel_4 = "10000278RRRW", evsel_3 = "10000278RRR", evfsadd_3 = "10000280RRR", evfssub_3 = "10000281RRR", evfsabs_2 = "10000284RR", evfsnabs_2 = "10000285RR", evfsneg_2 = "10000286RR", evfsmul_3 = "10000288RRR", evfsdiv_3 = "10000289RRR", evfscmpgt_3 = "1000028cXRR", evfscmpgt_2 = "1000028c-RR", evfscmplt_3 = "1000028dXRR", evfscmplt_2 = "1000028d-RR", evfscmpeq_3 = "1000028eXRR", evfscmpeq_2 = "1000028e-RR", evfscfui_2 = "10000290R-R", evfscfsi_2 = "10000291R-R", evfscfuf_2 = "10000292R-R", evfscfsf_2 = "10000293R-R", evfsctui_2 = "10000294R-R", evfsctsi_2 = "10000295R-R", evfsctuf_2 = "10000296R-R", evfsctsf_2 = "10000297R-R", evfsctuiz_2 = "10000298R-R", evfsctsiz_2 = "1000029aR-R", evfststgt_3 = "1000029cXRR", evfststgt_2 = "1000029c-RR", evfststlt_3 = "1000029dXRR", evfststlt_2 = "1000029d-RR", evfststeq_3 = "1000029eXRR", evfststeq_2 = "1000029e-RR", efsadd_3 = "100002c0RRR", efssub_3 = "100002c1RRR", efsabs_2 = "100002c4RR", efsnabs_2 = "100002c5RR", efsneg_2 = "100002c6RR", efsmul_3 = "100002c8RRR", efsdiv_3 = "100002c9RRR", efscmpgt_3 = "100002ccXRR", efscmpgt_2 = "100002cc-RR", efscmplt_3 = "100002cdXRR", efscmplt_2 = "100002cd-RR", efscmpeq_3 = "100002ceXRR", efscmpeq_2 = "100002ce-RR", efscfd_2 = "100002cfR-R", efscfui_2 = "100002d0R-R", efscfsi_2 = "100002d1R-R", efscfuf_2 = "100002d2R-R", efscfsf_2 = "100002d3R-R", efsctui_2 = "100002d4R-R", efsctsi_2 = "100002d5R-R", efsctuf_2 = "100002d6R-R", efsctsf_2 = "100002d7R-R", efsctuiz_2 = "100002d8R-R", efsctsiz_2 = "100002daR-R", efststgt_3 = "100002dcXRR", efststgt_2 = "100002dc-RR", efststlt_3 = "100002ddXRR", efststlt_2 = "100002dd-RR", efststeq_3 = "100002deXRR", efststeq_2 = "100002de-RR", efdadd_3 = "100002e0RRR", efdsub_3 = "100002e1RRR", efdcfuid_2 = "100002e2R-R", efdcfsid_2 = "100002e3R-R", efdabs_2 = "100002e4RR", efdnabs_2 = "100002e5RR", efdneg_2 = "100002e6RR", efdmul_3 = "100002e8RRR", efddiv_3 = "100002e9RRR", efdctuidz_2 = "100002eaR-R", efdctsidz_2 = "100002ebR-R", efdcmpgt_3 = "100002ecXRR", efdcmpgt_2 = "100002ec-RR", efdcmplt_3 = "100002edXRR", efdcmplt_2 = "100002ed-RR", efdcmpeq_3 = "100002eeXRR", efdcmpeq_2 = "100002ee-RR", efdcfs_2 = "100002efR-R", efdcfui_2 = "100002f0R-R", efdcfsi_2 = "100002f1R-R", efdcfuf_2 = "100002f2R-R", efdcfsf_2 = "100002f3R-R", efdctui_2 = "100002f4R-R", efdctsi_2 = "100002f5R-R", efdctuf_2 = "100002f6R-R", efdctsf_2 = "100002f7R-R", efdctuiz_2 = "100002f8R-R", efdctsiz_2 = "100002faR-R", efdtstgt_3 = "100002fcXRR", efdtstgt_2 = "100002fc-RR", efdtstlt_3 = "100002fdXRR", efdtstlt_2 = "100002fd-RR", efdtsteq_3 = "100002feXRR", efdtsteq_2 = "100002fe-RR", evlddx_3 = "10000300RR0R", evldd_2 = "10000301R8", evldwx_3 = "10000302RR0R", evldw_2 = "10000303R8", evldhx_3 = "10000304RR0R", evldh_2 = "10000305R8", evlwhex_3 = "10000310RR0R", evlwhe_2 = "10000311R4", evlwhoux_3 = "10000314RR0R", evlwhou_2 = "10000315R4", evlwhosx_3 = "10000316RR0R", evlwhos_2 = "10000317R4", evstddx_3 = "10000320RR0R", evstdd_2 = "10000321R8", evstdwx_3 = "10000322RR0R", evstdw_2 = "10000323R8", evstdhx_3 = "10000324RR0R", evstdh_2 = "10000325R8", evstwhex_3 = "10000330RR0R", evstwhe_2 = "10000331R4", evstwhox_3 = "10000334RR0R", evstwho_2 = "10000335R4", evstwwex_3 = "10000338RR0R", evstwwe_2 = "10000339R4", evstwwox_3 = "1000033cRR0R", evstwwo_2 = "1000033dR4", evmhessf_3 = "10000403RRR", evmhossf_3 = "10000407RRR", evmheumi_3 = "10000408RRR", evmhesmi_3 = "10000409RRR", evmhesmf_3 = "1000040bRRR", evmhoumi_3 = "1000040cRRR", evmhosmi_3 = "1000040dRRR", evmhosmf_3 = "1000040fRRR", evmhessfa_3 = "10000423RRR", evmhossfa_3 = "10000427RRR", evmheumia_3 = "10000428RRR", evmhesmia_3 = "10000429RRR", evmhesmfa_3 = "1000042bRRR", evmhoumia_3 = "1000042cRRR", evmhosmia_3 = "1000042dRRR", evmhosmfa_3 = "1000042fRRR", evmwhssf_3 = "10000447RRR", evmwlumi_3 = "10000448RRR", evmwhumi_3 = "1000044cRRR", evmwhsmi_3 = "1000044dRRR", evmwhsmf_3 = "1000044fRRR", evmwssf_3 = "10000453RRR", evmwumi_3 = "10000458RRR", evmwsmi_3 = "10000459RRR", evmwsmf_3 = "1000045bRRR", evmwhssfa_3 = "10000467RRR", evmwlumia_3 = "10000468RRR", evmwhumia_3 = "1000046cRRR", evmwhsmia_3 = "1000046dRRR", evmwhsmfa_3 = "1000046fRRR", evmwssfa_3 = "10000473RRR", evmwumia_3 = "10000478RRR", evmwsmia_3 = "10000479RRR", evmwsmfa_3 = "1000047bRRR", evmra_2 = "100004c4RR", evdivws_3 = "100004c6RRR", evdivwu_3 = "100004c7RRR", evmwssfaa_3 = "10000553RRR", evmwumiaa_3 = "10000558RRR", evmwsmiaa_3 = "10000559RRR", evmwsmfaa_3 = "1000055bRRR", evmwssfan_3 = "100005d3RRR", evmwumian_3 = "100005d8RRR", evmwsmian_3 = "100005d9RRR", evmwsmfan_3 = "100005dbRRR", evmergehilo_3 = "1000022eRRR", evmergelohi_3 = "1000022fRRR", evlhhesplatx_3 = "10000308RR0R", evlhhesplat_2 = "10000309R2", evlhhousplatx_3 = "1000030cRR0R", evlhhousplat_2 = "1000030dR2", evlhhossplatx_3 = "1000030eRR0R", evlhhossplat_2 = "1000030fR2", evlwwsplatx_3 = "10000318RR0R", evlwwsplat_2 = "10000319R4", evlwhsplatx_3 = "1000031cRR0R", evlwhsplat_2 = "1000031dR4", evaddusiaaw_2 = "100004c0RR", evaddssiaaw_2 = "100004c1RR", evsubfusiaaw_2 = "100004c2RR", evsubfssiaaw_2 = "100004c3RR", evaddumiaaw_2 = "100004c8RR", evaddsmiaaw_2 = "100004c9RR", evsubfumiaaw_2 = "100004caRR", evsubfsmiaaw_2 = "100004cbRR", evmheusiaaw_3 = "10000500RRR", evmhessiaaw_3 = "10000501RRR", evmhessfaaw_3 = "10000503RRR", evmhousiaaw_3 = "10000504RRR", evmhossiaaw_3 = "10000505RRR", evmhossfaaw_3 = "10000507RRR", evmheumiaaw_3 = "10000508RRR", evmhesmiaaw_3 = "10000509RRR", evmhesmfaaw_3 = "1000050bRRR", evmhoumiaaw_3 = "1000050cRRR", evmhosmiaaw_3 = "1000050dRRR", evmhosmfaaw_3 = "1000050fRRR", evmhegumiaa_3 = "10000528RRR", evmhegsmiaa_3 = "10000529RRR", evmhegsmfaa_3 = "1000052bRRR", evmhogumiaa_3 = "1000052cRRR", evmhogsmiaa_3 = "1000052dRRR", evmhogsmfaa_3 = "1000052fRRR", evmwlusiaaw_3 = "10000540RRR", evmwlssiaaw_3 = "10000541RRR", evmwlumiaaw_3 = "10000548RRR", evmwlsmiaaw_3 = "10000549RRR", evmheusianw_3 = "10000580RRR", evmhessianw_3 = "10000581RRR", evmhessfanw_3 = "10000583RRR", evmhousianw_3 = "10000584RRR", evmhossianw_3 = "10000585RRR", evmhossfanw_3 = "10000587RRR", evmheumianw_3 = "10000588RRR", evmhesmianw_3 = "10000589RRR", evmhesmfanw_3 = "1000058bRRR", evmhoumianw_3 = "1000058cRRR", evmhosmianw_3 = "1000058dRRR", evmhosmfanw_3 = "1000058fRRR", evmhegumian_3 = "100005a8RRR", evmhegsmian_3 = "100005a9RRR", evmhegsmfan_3 = "100005abRRR", evmhogumian_3 = "100005acRRR", evmhogsmian_3 = "100005adRRR", evmhogsmfan_3 = "100005afRRR", evmwlusianw_3 = "100005c0RRR", evmwlssianw_3 = "100005c1RRR", evmwlumianw_3 = "100005c8RRR", evmwlsmianw_3 = "100005c9RRR", -- NYI: Book E instructions. } -- Add mnemonics for "." variants. do local t = {} for k,v in pairs(map_op) do if sub(v, -1) == "." then local v2 = sub(v, 1, 7)..char(byte(v, 8)+1)..sub(v, 9, -2) t[sub(k, 1, -3).."."..sub(k, -2)] = v2 end end for k,v in pairs(t) do map_op[k] = v end end -- Add more branch mnemonics. for cond,c in pairs(map_cond) do local b1 = "b"..cond local c1 = shl(band(c, 3), 16) + (c < 4 and 0x01000000 or 0) -- bX[l] map_op[b1.."_1"] = tohex(0x40800000 + c1).."K" map_op[b1.."y_1"] = tohex(0x40a00000 + c1).."K" map_op[b1.."l_1"] = tohex(0x40800001 + c1).."K" map_op[b1.."_2"] = tohex(0x40800000 + c1).."-XK" map_op[b1.."y_2"] = tohex(0x40a00000 + c1).."-XK" map_op[b1.."l_2"] = tohex(0x40800001 + c1).."-XK" -- bXlr[l] map_op[b1.."lr_0"] = tohex(0x4c800020 + c1) map_op[b1.."lrl_0"] = tohex(0x4c800021 + c1) map_op[b1.."ctr_0"] = tohex(0x4c800420 + c1) map_op[b1.."ctrl_0"] = tohex(0x4c800421 + c1) -- bXctr[l] map_op[b1.."lr_1"] = tohex(0x4c800020 + c1).."-X" map_op[b1.."lrl_1"] = tohex(0x4c800021 + c1).."-X" map_op[b1.."ctr_1"] = tohex(0x4c800420 + c1).."-X" map_op[b1.."ctrl_1"] = tohex(0x4c800421 + c1).."-X" end ------------------------------------------------------------------------------ local function parse_gpr(expr) local tname, ovreg = match(expr, "^([%w_]+):(r[1-3]?[0-9])$") local tp = map_type[tname or expr] if tp then local reg = ovreg or tp.reg if not reg then werror("type `"..(tname or expr).."' needs a register override") end expr = reg end local r = match(expr, "^r([1-3]?[0-9])$") if r then r = tonumber(r) if r <= 31 then return r, tp end end werror("bad register name `"..expr.."'") end local function parse_fpr(expr) local r = match(expr, "^f([1-3]?[0-9])$") if r then r = tonumber(r) if r <= 31 then return r end end werror("bad register name `"..expr.."'") end local function parse_cr(expr) local r = match(expr, "^cr([0-7])$") if r then return tonumber(r) end werror("bad condition register name `"..expr.."'") end local function parse_cond(expr) local r, cond = match(expr, "^4%*cr([0-7])%+(%w%w)$") if r then r = tonumber(r) local c = map_cond[cond] if c and c < 4 then return r*4+c end end werror("bad condition bit name `"..expr.."'") end local function parse_imm(imm, bits, shift, scale, signed) local n = tonumber(imm) if n then local m = sar(n, scale) if shl(m, scale) == n then if signed then local s = sar(m, bits-1) if s == 0 then return shl(m, shift) elseif s == -1 then return shl(m + shl(1, bits), shift) end else if sar(m, bits) == 0 then return shl(m, shift) end end end werror("out of range immediate `"..imm.."'") elseif match(imm, "^r([1-3]?[0-9])$") or match(imm, "^([%w_]+):(r[1-3]?[0-9])$") then werror("expected immediate operand, got register") else waction("IMM", (signed and 32768 or 0)+scale*1024+bits*32+shift, imm) return 0 end end local function parse_shiftmask(imm, isshift) local n = tonumber(imm) if n then if shr(n, 6) == 0 then local lsb = band(imm, 31) local msb = imm - lsb return isshift and (shl(lsb, 11)+shr(msb, 4)) or (shl(lsb, 6)+msb) end werror("out of range immediate `"..imm.."'") elseif match(imm, "^r([1-3]?[0-9])$") or match(imm, "^([%w_]+):(r[1-3]?[0-9])$") then werror("expected immediate operand, got register") else werror("NYI: parameterized 64 bit shift/mask") end end local function parse_disp(disp) local imm, reg = match(disp, "^(.*)%(([%w_:]+)%)$") if imm then local r = parse_gpr(reg) if r == 0 then werror("cannot use r0 in displacement") end return shl(r, 16) + parse_imm(imm, 16, 0, 0, true) end local reg, tailr = match(disp, "^([%w_:]+)%s*(.*)$") if reg and tailr ~= "" then local r, tp = parse_gpr(reg) if r == 0 then werror("cannot use r0 in displacement") end if tp then waction("IMM", 32768+16*32, format(tp.ctypefmt, tailr)) return shl(r, 16) end end werror("bad displacement `"..disp.."'") end local function parse_u5disp(disp, scale) local imm, reg = match(disp, "^(.*)%(([%w_:]+)%)$") if imm then local r = parse_gpr(reg) if r == 0 then werror("cannot use r0 in displacement") end return shl(r, 16) + parse_imm(imm, 5, 11, scale, false) end local reg, tailr = match(disp, "^([%w_:]+)%s*(.*)$") if reg and tailr ~= "" then local r, tp = parse_gpr(reg) if r == 0 then werror("cannot use r0 in displacement") end if tp then waction("IMM", scale*1024+5*32+11, format(tp.ctypefmt, tailr)) return shl(r, 16) end end werror("bad displacement `"..disp.."'") end local function parse_label(label, def) local prefix = sub(label, 1, 2) -- =>label (pc label reference) if prefix == "=>" then return "PC", 0, sub(label, 3) end -- ->name (global label reference) if prefix == "->" then return "LG", map_global[sub(label, 3)] end if def then -- [1-9] (local label definition) if match(label, "^[1-9]$") then return "LG", 10+tonumber(label) end else -- [<>][1-9] (local label reference) local dir, lnum = match(label, "^([<>])([1-9])$") if dir then -- Fwd: 1-9, Bkwd: 11-19. return "LG", lnum + (dir == ">" and 0 or 10) end -- extern label (extern label reference) local extname = match(label, "^extern%s+(%S+)$") if extname then return "EXT", map_extern[extname] end end werror("bad label `"..label.."'") end ------------------------------------------------------------------------------ -- Handle opcodes defined with template strings. map_op[".template__"] = function(params, template, nparams) if not params then return sub(template, 9) end local op = tonumber(sub(template, 1, 8), 16) local n, rs = 1, 26 -- Limit number of section buffer positions used by a single dasm_put(). -- A single opcode needs a maximum of 3 positions (rlwinm). if secpos+3 > maxsecpos then wflush() end local pos = wpos() -- Process each character. for p in gmatch(sub(template, 9), ".") do if p == "R" then rs = rs - 5; op = op + shl(parse_gpr(params[n]), rs); n = n + 1 elseif p == "F" then rs = rs - 5; op = op + shl(parse_fpr(params[n]), rs); n = n + 1 elseif p == "A" then rs = rs - 5; op = op + parse_imm(params[n], 5, rs, 0, false); n = n + 1 elseif p == "S" then rs = rs - 5; op = op + parse_imm(params[n], 5, rs, 0, true); n = n + 1 elseif p == "I" then op = op + parse_imm(params[n], 16, 0, 0, true); n = n + 1 elseif p == "U" then op = op + parse_imm(params[n], 16, 0, 0, false); n = n + 1 elseif p == "D" then op = op + parse_disp(params[n]); n = n + 1 elseif p == "2" then op = op + parse_u5disp(params[n], 1); n = n + 1 elseif p == "4" then op = op + parse_u5disp(params[n], 2); n = n + 1 elseif p == "8" then op = op + parse_u5disp(params[n], 3); n = n + 1 elseif p == "C" then rs = rs - 5; op = op + shl(parse_cond(params[n]), rs); n = n + 1 elseif p == "X" then rs = rs - 5; op = op + shl(parse_cr(params[n]), rs+2); n = n + 1 elseif p == "W" then op = op + parse_cr(params[n]); n = n + 1 elseif p == "G" then op = op + parse_imm(params[n], 8, 12, 0, false); n = n + 1 elseif p == "H" then op = op + parse_shiftmask(params[n], true); n = n + 1 elseif p == "M" then op = op + parse_shiftmask(params[n], false); n = n + 1 elseif p == "J" or p == "K" then local mode, n, s = parse_label(params[n], false) if p == "K" then n = n + 2048 end waction("REL_"..mode, n, s, 1) n = n + 1 elseif p == "0" then if band(shr(op, rs), 31) == 0 then werror("cannot use r0") end elseif p == "=" or p == "%" then local t = band(shr(op, p == "%" and rs+5 or rs), 31) rs = rs - 5 op = op + shl(t, rs) elseif p == "~" then local mm = shl(31, rs) local lo = band(op, mm) local hi = band(op, shl(mm, 5)) op = op - lo - hi + shl(lo, 5) + shr(hi, 5) elseif p == "-" then rs = rs - 5 elseif p == "." then -- Ignored. else assert(false) end end wputpos(pos, op) end ------------------------------------------------------------------------------ -- Pseudo-opcode to mark the position where the action list is to be emitted. map_op[".actionlist_1"] = function(params) if not params then return "cvar" end local name = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeactions(out, name) end) end -- Pseudo-opcode to mark the position where the global enum is to be emitted. map_op[".globals_1"] = function(params) if not params then return "prefix" end local prefix = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeglobals(out, prefix) end) end -- Pseudo-opcode to mark the position where the global names are to be emitted. map_op[".globalnames_1"] = function(params) if not params then return "cvar" end local name = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeglobalnames(out, name) end) end -- Pseudo-opcode to mark the position where the extern names are to be emitted. map_op[".externnames_1"] = function(params) if not params then return "cvar" end local name = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeexternnames(out, name) end) end ------------------------------------------------------------------------------ -- Label pseudo-opcode (converted from trailing colon form). map_op[".label_1"] = function(params) if not params then return "[1-9] | ->global | =>pcexpr" end if secpos+1 > maxsecpos then wflush() end local mode, n, s = parse_label(params[1], true) if mode == "EXT" then werror("bad label definition") end waction("LABEL_"..mode, n, s, 1) end ------------------------------------------------------------------------------ -- Pseudo-opcodes for data storage. map_op[".long_*"] = function(params) if not params then return "imm..." end for _,p in ipairs(params) do local n = tonumber(p) if not n then werror("bad immediate `"..p.."'") end if n < 0 then n = n + 2^32 end wputw(n) if secpos+2 > maxsecpos then wflush() end end end -- Alignment pseudo-opcode. map_op[".align_1"] = function(params) if not params then return "numpow2" end if secpos+1 > maxsecpos then wflush() end local align = tonumber(params[1]) if align then local x = align -- Must be a power of 2 in the range (2 ... 256). for i=1,8 do x = x / 2 if x == 1 then waction("ALIGN", align-1, nil, 1) -- Action byte is 2**n-1. return end end end werror("bad alignment") end ------------------------------------------------------------------------------ -- Pseudo-opcode for (primitive) type definitions (map to C types). map_op[".type_3"] = function(params, nparams) if not params then return nparams == 2 and "name, ctype" or "name, ctype, reg" end local name, ctype, reg = params[1], params[2], params[3] if not match(name, "^[%a_][%w_]*$") then werror("bad type name `"..name.."'") end local tp = map_type[name] if tp then werror("duplicate type `"..name.."'") end -- Add #type to defines. A bit unclean to put it in map_archdef. map_archdef["#"..name] = "sizeof("..ctype..")" -- Add new type and emit shortcut define. local num = ctypenum + 1 map_type[name] = { ctype = ctype, ctypefmt = format("Dt%X(%%s)", num), reg = reg, } wline(format("#define Dt%X(_V) (int)(ptrdiff_t)&(((%s *)0)_V)", num, ctype)) ctypenum = num end map_op[".type_2"] = map_op[".type_3"] -- Dump type definitions. local function dumptypes(out, lvl) local t = {} for name in pairs(map_type) do t[#t+1] = name end sort(t) out:write("Type definitions:\n") for _,name in ipairs(t) do local tp = map_type[name] local reg = tp.reg or "" out:write(format(" %-20s %-20s %s\n", name, tp.ctype, reg)) end out:write("\n") end ------------------------------------------------------------------------------ -- Set the current section. function _M.section(num) waction("SECTION", num) wflush(true) -- SECTION is a terminal action. end ------------------------------------------------------------------------------ -- Dump architecture description. function _M.dumparch(out) out:write(format("DynASM %s version %s, released %s\n\n", _info.arch, _info.version, _info.release)) dumpactions(out) end -- Dump all user defined elements. function _M.dumpdef(out, lvl) dumptypes(out, lvl) dumpglobals(out, lvl) dumpexterns(out, lvl) end ------------------------------------------------------------------------------ -- Pass callbacks from/to the DynASM core. function _M.passcb(wl, we, wf, ww) wline, werror, wfatal, wwarn = wl, we, wf, ww return wflush end -- Setup the arch-specific module. function _M.setup(arch, opt) g_arch, g_opt = arch, opt end -- Merge the core maps and the arch-specific maps. function _M.mergemaps(map_coreop, map_def) setmetatable(map_op, { __index = map_coreop }) setmetatable(map_def, { __index = map_archdef }) return map_op, map_def end return _M ------------------------------------------------------------------------------ MoarVM-2018.03/3rdparty/dynasm/dasm_proto.h0000644000175000017510000000401613237701235020572 0ustar samanthasamantha/* ** DynASM encoding engine prototypes. ** Copyright (C) 2005-2015 Mike Pall. All rights reserved. ** Released under the MIT license. See dynasm.lua for full copyright notice. */ #ifndef _DASM_PROTO_H #define _DASM_PROTO_H #include #include #define DASM_IDENT "DynASM 1.3.0" #define DASM_VERSION 10300 /* 1.3.0 */ #ifndef Dst_DECL #define Dst_DECL dasm_State **Dst #endif #ifndef Dst_REF #define Dst_REF (*Dst) #endif #ifndef DASM_FDEF #define DASM_FDEF extern #endif #ifndef DASM_M_GROW #define DASM_M_GROW(ctx, t, p, sz, need) \ do { \ size_t _sz = (sz), _need = (need); \ if (_sz < _need) { \ if (_sz < 16) _sz = 16; \ while (_sz < _need) _sz += _sz; \ (p) = (t *)realloc((p), _sz); \ if ((p) == NULL) exit(1); \ (sz) = _sz; \ } \ } while(0) #endif #ifndef DASM_M_FREE #define DASM_M_FREE(ctx, p, sz) free(p) #endif /* Internal DynASM encoder state. */ typedef struct dasm_State dasm_State; /* Initialize and free DynASM state. */ DASM_FDEF void dasm_init(Dst_DECL, int maxsection); DASM_FDEF void dasm_free(Dst_DECL); /* Setup global array. Must be called before dasm_setup(). */ DASM_FDEF void dasm_setupglobal(Dst_DECL, void **gl, unsigned int maxgl); /* Grow PC label array. Can be called after dasm_setup(), too. */ DASM_FDEF void dasm_growpc(Dst_DECL, unsigned int maxpc); /* Setup encoder. */ DASM_FDEF void dasm_setup(Dst_DECL, const void *actionlist); /* Feed encoder with actions. Calls are generated by pre-processor. */ DASM_FDEF void dasm_put(Dst_DECL, int start, ...); /* Link sections and return the resulting size. */ DASM_FDEF int dasm_link(Dst_DECL, size_t *szp); /* Encode sections into buffer. */ DASM_FDEF int dasm_encode(Dst_DECL, void *buffer); /* Get PC label offset. */ DASM_FDEF int dasm_getpclabel(Dst_DECL, unsigned int pc); #ifdef DASM_CHECKS /* Optional sanity checker to call between isolated encoding steps. */ DASM_FDEF int dasm_checkstep(Dst_DECL, int secmatch); #else #define dasm_checkstep(a, b) 0 #endif #endif /* _DASM_PROTO_H */ MoarVM-2018.03/3rdparty/dynasm/dasm_x64.lua0000644000175000017510000000107013237701103020371 0ustar samanthasamantha------------------------------------------------------------------------------ -- DynASM x64 module. -- -- Copyright (C) 2005-2015 Mike Pall. All rights reserved. -- See dynasm.lua for full copyright notice. ------------------------------------------------------------------------------ -- This module just sets 64 bit mode for the combined x86/x64 module. -- All the interesting stuff is there. ------------------------------------------------------------------------------ x64 = true -- Using a global is an ugly, but effective solution. return require("dasm_x86") MoarVM-2018.03/3rdparty/dynasm/dasm_x86.h0000644000175000017510000004477613237701235020075 0ustar samanthasamantha/* ** DynASM x86 encoding engine. ** Copyright (C) 2005-2015 Mike Pall. All rights reserved. ** Released under the MIT license. See dynasm.lua for full copyright notice. */ #include #include #include #include #define DASM_ARCH "x86" #ifndef DASM_EXTERN #define DASM_EXTERN(a,b,c,d) 0 #endif /* Action definitions. DASM_STOP must be 255. */ enum { DASM_DISP = 231, DASM_IMM_S, DASM_IMM_B, DASM_IMM_W, DASM_IMM_D, DASM_IMM_WB, DASM_IMM_DB, DASM_VREG, DASM_SPACE, DASM_SETLABEL, DASM_REL_A, DASM_REL_LG, DASM_REL_PC, DASM_IMM_LG, DASM_IMM_PC, DASM_LABEL_LG, DASM_LABEL_PC, DASM_ALIGN, DASM_EXTERN, DASM_ESC, DASM_MARK, DASM_MARKREX, DASM_OPTREX, DASM_SECTION, DASM_STOP }; /* Maximum number of section buffer positions for a single dasm_put() call. */ #define DASM_MAXSECPOS 25 /* DynASM encoder status codes. Action list offset or number are or'ed in. */ #define DASM_S_OK 0x00000000 #define DASM_S_NOMEM 0x01000000 #define DASM_S_PHASE 0x02000000 #define DASM_S_MATCH_SEC 0x03000000 #define DASM_S_RANGE_I 0x11000000 #define DASM_S_RANGE_SEC 0x12000000 #define DASM_S_RANGE_LG 0x13000000 #define DASM_S_RANGE_PC 0x14000000 #define DASM_S_RANGE_VREG 0x15000000 #define DASM_S_UNDEF_L 0x21000000 #define DASM_S_UNDEF_PC 0x22000000 #define DASM_S_RSP_SIB_IDX 0x23000000 /* Macros to convert positions (8 bit section + 24 bit index). */ #define DASM_POS2IDX(pos) ((pos)&0x00ffffff) #define DASM_POS2BIAS(pos) ((pos)&0xff000000) #define DASM_SEC2POS(sec) ((sec)<<24) #define DASM_POS2SEC(pos) ((pos)>>24) #define DASM_POS2PTR(D, pos) (D->sections[DASM_POS2SEC(pos)].rbuf + (pos)) /* Action list type. */ typedef const unsigned char *dasm_ActList; /* Per-section structure. */ typedef struct dasm_Section { int *rbuf; /* Biased buffer pointer (negative section bias). */ int *buf; /* True buffer pointer. */ size_t bsize; /* Buffer size in bytes. */ int pos; /* Biased buffer position. */ int epos; /* End of biased buffer position - max single put. */ int ofs; /* Byte offset into section. */ } dasm_Section; /* Core structure holding the DynASM encoding state. */ struct dasm_State { size_t psize; /* Allocated size of this structure. */ dasm_ActList actionlist; /* Current actionlist pointer. */ int *lglabels; /* Local/global chain/pos ptrs. */ size_t lgsize; int *pclabels; /* PC label chains/pos ptrs. */ size_t pcsize; void **globals; /* Array of globals (bias -10). */ dasm_Section *section; /* Pointer to active section. */ size_t codesize; /* Total size of all code sections. */ int maxsection; /* 0 <= sectionidx < maxsection. */ int status; /* Status code. */ dasm_Section sections[1]; /* All sections. Alloc-extended. */ }; /* The size of the core structure depends on the max. number of sections. */ #define DASM_PSZ(ms) (sizeof(dasm_State)+(ms-1)*sizeof(dasm_Section)) /* Initialize DynASM state. */ void dasm_init (Dst_DECL, int maxsection) { dasm_State *D; size_t psz = 0; int i; Dst_REF = NULL; DASM_M_GROW (Dst, struct dasm_State, Dst_REF, psz, DASM_PSZ (maxsection)); D = Dst_REF; D->psize = psz; D->lglabels = NULL; D->lgsize = 0; D->pclabels = NULL; D->pcsize = 0; D->globals = NULL; D->maxsection = maxsection; for (i = 0; i < maxsection; i++) { D->sections[i].buf = NULL; /* Need this for pass3. */ D->sections[i].rbuf = D->sections[i].buf - DASM_SEC2POS (i); D->sections[i].bsize = 0; D->sections[i].epos = 0; /* Wrong, but is recalculated after resize. */ } } /* Free DynASM state. */ void dasm_free (Dst_DECL) { dasm_State *D = Dst_REF; int i; for (i = 0; i < D->maxsection; i++) if (D->sections[i].buf) DASM_M_FREE (Dst, D->sections[i].buf, D->sections[i].bsize); if (D->pclabels) DASM_M_FREE (Dst, D->pclabels, D->pcsize); if (D->lglabels) DASM_M_FREE (Dst, D->lglabels, D->lgsize); DASM_M_FREE (Dst, D, D->psize); } /* Setup global label array. Must be called before dasm_setup(). */ void dasm_setupglobal (Dst_DECL, void **gl, unsigned int maxgl) { dasm_State *D = Dst_REF; D->globals = gl - 10; /* Negative bias to compensate for locals. */ DASM_M_GROW (Dst, int, D->lglabels, D->lgsize, (10 + maxgl) * sizeof (int)); } /* Grow PC label array. Can be called after dasm_setup(), too. */ void dasm_growpc (Dst_DECL, unsigned int maxpc) { dasm_State *D = Dst_REF; size_t osz = D->pcsize; DASM_M_GROW (Dst, int, D->pclabels, D->pcsize, maxpc * sizeof (int)); memset ((void *) (((unsigned char *) D->pclabels) + osz), 0, D->pcsize - osz); } /* Setup encoder. */ void dasm_setup (Dst_DECL, const void *actionlist) { dasm_State *D = Dst_REF; int i; D->actionlist = (dasm_ActList) actionlist; D->status = DASM_S_OK; D->section = &D->sections[0]; memset ((void *) D->lglabels, 0, D->lgsize); if (D->pclabels) memset ((void *) D->pclabels, 0, D->pcsize); for (i = 0; i < D->maxsection; i++) { D->sections[i].pos = DASM_SEC2POS (i); D->sections[i].ofs = 0; } } #ifdef DASM_CHECKS #define CK(x, st) \ do { if (!(x)) { \ D->status = DASM_S_##st|(int)(p-D->actionlist-1); return; } } while (0) #define CKPL(kind, st) \ do { if ((size_t)((char *)pl-(char *)D->kind##labels) >= D->kind##size) { \ D->status=DASM_S_RANGE_##st|(int)(p-D->actionlist-1); return; } } while (0) #else #define CK(x, st) ((void)0) #define CKPL(kind, st) ((void)0) #endif /* Pass 1: Store actions and args, link branches/labels, estimate offsets. */ void dasm_put (Dst_DECL, int start, ...) { va_list ap; dasm_State *D = Dst_REF; dasm_ActList p = D->actionlist + start; dasm_Section *sec = D->section; int pos = sec->pos, ofs = sec->ofs, mrm = 4, optrex = -1; int *b; if (pos >= sec->epos) { DASM_M_GROW (Dst, int, sec->buf, sec->bsize, sec->bsize + 2 * DASM_MAXSECPOS * sizeof (int)); sec->rbuf = sec->buf - DASM_POS2BIAS (pos); sec->epos = (int) sec->bsize / sizeof (int) - DASM_MAXSECPOS + DASM_POS2BIAS (pos); } b = sec->rbuf; b[pos++] = start; va_start (ap, start); while (1) { int action = *p++; if (action < DASM_DISP) { ofs++; } else if (action <= DASM_REL_A) { int n = va_arg (ap, int); b[pos++] = n; switch (action) { case DASM_DISP: if (n == 0) break; case DASM_IMM_DB: if (((n + 128) & -256) == 0) goto ob; case DASM_REL_A: /* Assumes ptrdiff_t is int. !x64 */ case DASM_IMM_D: ofs += 4; break; case DASM_IMM_S: CK (((n + 128) & -256) == 0, RANGE_I); goto ob; case DASM_IMM_B: CK ((n & -256) == 0, RANGE_I); ob:ofs++; break; case DASM_IMM_WB: if (((n + 128) & -256) == 0) goto ob; case DASM_IMM_W: CK ((n & -65536) == 0, RANGE_I); ofs += 2; break; case DASM_SPACE: p++; ofs += n; break; case DASM_SETLABEL: b[pos - 2] = -0x40000000; break; /* Neg. label ofs. */ case DASM_VREG: CK ((n & -16) == 0 && (n != 4 || (*p & 1) == 0), RANGE_VREG); if ((*p++ & 3) == 1 && *p == DASM_DISP) mrm = n; if (optrex > 0) b[optrex] |= n; continue; } mrm = 4; } else { int *pl, n; switch (action) { case DASM_REL_LG: case DASM_IMM_LG: n = *p++; pl = D->lglabels + n; /* Bkwd rel or global. */ if (n <= 246) { CK (n >= 10 || *pl < 0, RANGE_LG); CKPL (lg, LG); goto putrel; } pl -= 246; n = *pl; if (n < 0) n = 0; /* Start new chain for fwd rel if label exists. */ goto linkrel; case DASM_REL_PC: case DASM_IMM_PC: pl = D->pclabels + va_arg (ap, int); CKPL (pc, PC); putrel: n = *pl; if (n < 0) { /* Label exists. Get label pos and store it. */ b[pos] = -n; } else { linkrel: b[pos] = n; /* Else link to rel chain, anchored at label. */ *pl = pos; } pos++; ofs += 4; /* Maximum offset needed. */ if (action == DASM_REL_LG || action == DASM_REL_PC) b[pos++] = ofs; /* Store pass1 offset estimate. */ break; case DASM_LABEL_LG: pl = D->lglabels + *p++; CKPL (lg, LG); goto putlabel; case DASM_LABEL_PC: pl = D->pclabels + va_arg (ap, int); CKPL (pc, PC); putlabel: n = *pl; /* n > 0: Collapse rel chain and replace with label pos. */ while (n > 0) { int *pb = DASM_POS2PTR (D, n); n = *pb; *pb = pos; } *pl = -pos; /* Label exists now. */ b[pos++] = ofs; /* Store pass1 offset estimate. */ break; case DASM_ALIGN: ofs += *p++; /* Maximum alignment needed (arg is 2**n-1). */ b[pos++] = ofs; /* Store pass1 offset estimate. */ break; case DASM_EXTERN: p += 2; ofs += 4; break; case DASM_ESC: p++; ofs++; break; case DASM_MARK: mrm = p[-2]; break; case DASM_MARKREX: optrex = -1; break; case DASM_OPTREX: /* Add space for arguments */ optrex = pos; b[pos++] = 0; ofs++; break; case DASM_SECTION: n = *p; CK (n < D->maxsection, RANGE_SEC); D->section = &D->sections[n]; case DASM_STOP: goto stop; } } } stop: va_end (ap); sec->pos = pos; sec->ofs = ofs; } #undef CK /* Pass 2: Link sections, shrink branches/aligns, fix label offsets. */ int dasm_link (Dst_DECL, size_t * szp) { dasm_State *D = Dst_REF; int secnum; int ofs = 0; #ifdef DASM_CHECKS *szp = 0; if (D->status != DASM_S_OK) return D->status; { int pc; for (pc = 0; pc * sizeof (int) < D->pcsize; pc++) if (D->pclabels[pc] > 0) return DASM_S_UNDEF_PC | pc; } #endif { /* Handle globals not defined in this translation unit. */ int idx; for (idx = 10; idx * sizeof (int) < D->lgsize; idx++) { int n = D->lglabels[idx]; /* Undefined label: Collapse rel chain and replace with marker (< 0). */ while (n > 0) { int *pb = DASM_POS2PTR (D, n); n = *pb; *pb = -idx; } } } /* Combine all code sections. No support for data sections (yet). */ for (secnum = 0; secnum < D->maxsection; secnum++) { dasm_Section *sec = D->sections + secnum; int *b = sec->rbuf; int pos = DASM_SEC2POS (secnum); int lastpos = sec->pos; while (pos != lastpos) { dasm_ActList p = D->actionlist + b[pos++]; while (1) { int op, action = *p++; switch (action) { case DASM_REL_LG: p++; op = p[-3]; goto rel_pc; case DASM_REL_PC: op = p[-2]; rel_pc:{ int shrink = op == 0xe9 ? 3 : ((op & 0xf0) == 0x80 ? 4 : 0); if (shrink) { /* Shrinkable branch opcode? */ int lofs, lpos = b[pos]; if (lpos < 0) goto noshrink; /* Ext global? */ lofs = *DASM_POS2PTR (D, lpos); if (lpos > pos) { /* Fwd label: add cumulative section offsets. */ int i; for (i = secnum; i < DASM_POS2SEC (lpos); i++) lofs += D->sections[i].ofs; } else { lofs -= ofs; /* Bkwd label: unfix offset. */ } lofs -= b[pos + 1]; /* Short branch ok? */ if (lofs >= -128 - shrink && lofs <= 127) ofs -= shrink; /* Yes. */ else { noshrink:shrink = 0; } /* No, cannot shrink op. */ } b[pos + 1] = shrink; pos += 2; break; } case DASM_VREG: { int val = b[pos++]; int flag = *p++; int type = (flag & 3); int mode = ((flag >> 2) & 3); /* fprintf(stderr, "VREG: mode = %d, type = %d, val=%d\n", mode, type, val); */ if (mode != 3 && type == 0 && (val&7) == 4) { ofs++; } else if ((val&7) == 5 && (type < 2) && *p == DASM_DISP && b[pos] == 0) { /* extra byte is necessary for rbp encoding, which is weird again */ ofs++; } break; } case DASM_SPACE: case DASM_IMM_LG: p++; case DASM_DISP: case DASM_IMM_S: case DASM_IMM_B: case DASM_IMM_W: case DASM_IMM_D: case DASM_IMM_WB: case DASM_IMM_DB: case DASM_SETLABEL: case DASM_REL_A: case DASM_IMM_PC: pos++; break; case DASM_LABEL_LG: p++; case DASM_LABEL_PC: b[pos++] += ofs; break; /* Fix label offset. */ case DASM_ALIGN: ofs -= (b[pos++] + ofs) & *p++; break; /* Adjust ofs. */ case DASM_EXTERN: p += 2; break; case DASM_ESC: p++; break; case DASM_MARK: break; case DASM_MARKREX: break; case DASM_OPTREX: if (~b[pos] & 8) { ofs--; /* ofs should only decrease */ } pos++; break; case DASM_SECTION: case DASM_STOP: goto stop; } } stop:(void) 0; } ofs += sec->ofs; /* Next section starts right after current section. */ } D->codesize = ofs; /* Total size of all code sections */ *szp = ofs; return DASM_S_OK; } #define dasmb(x) *cp++ = (unsigned char)(x) #ifndef DASM_ALIGNED_WRITES #define dasmw(x) \ do { *((unsigned short *)cp) = (unsigned short)(x); cp+=2; } while (0) #define dasmd(x) \ do { *((unsigned int *)cp) = (unsigned int)(x); cp+=4; } while (0) #else #define dasmw(x) do { dasmb(x); dasmb((x)>>8); } while (0) #define dasmd(x) do { dasmw(x); dasmw((x)>>16); } while (0) #endif /* Pass 3: Encode sections. */ int dasm_encode (Dst_DECL, void *buffer) { dasm_State *D = Dst_REF; unsigned char *base = (unsigned char *) buffer; unsigned char *cp = base; int secnum; /* Encode all code sections. No support for data sections (yet). */ for (secnum = 0; secnum < D->maxsection; secnum++) { dasm_Section *sec = D->sections + secnum; int *b = sec->buf; int *endb = sec->rbuf + sec->pos; while (b != endb) { dasm_ActList p = D->actionlist + *b++; unsigned char *mark = NULL, *rex = NULL; while (1) { int action = *p++; int n = (action >= DASM_DISP && action <= DASM_ALIGN) ? *b++ : 0; switch (action) { case DASM_DISP: if (!mark) mark = cp; { unsigned char *mm = mark; if (*p != DASM_IMM_DB && *p != DASM_IMM_WB) mark = NULL; if (n == 0) { int mrm = mm[-1] & 7; if (mrm == 4) mrm = mm[0] & 7; if (mrm != 5) { mm[-1] -= 0x80; break; } } if (((n + 128) & -256) != 0) goto wd; else mm[-1] -= 0x40; } case DASM_IMM_S: case DASM_IMM_B: wb:dasmb (n); break; case DASM_IMM_DB: if (((n + 128) & -256) == 0) { db:if (!mark) mark = cp; mark[-2] += 2; mark = NULL; goto wb; } else mark = NULL; case DASM_IMM_D: wd:dasmd (n); break; case DASM_IMM_WB: if (((n + 128) & -256) == 0) goto db; else mark = NULL; case DASM_IMM_W: dasmw (n); break; case DASM_VREG: { int flag = *p++; int type = flag & 3; /* 0 = ModRM.RM, 1 = SIB.base, 2 = ModRM.reg, 3 = SIB.idx */ int mode = (flag >> 2) & 3; int addr = (n & 7); /* only the three LSB go into the address */ /* fprintf(stderr, "mode: %d addr %d type %d\n", mode, n, type); */ if (addr == 4 && mode != 3 && type == 0) { /* RSP/R12 byte encoding is irregular */ cp[-1] |= 4; *cp++ = 0x24; } else if (n == 4 && type == 3) { /* fprintf(stderr, "FAIL! cannot encode rsp as SIB.idx\n"); */ return DASM_S_RSP_SIB_IDX; } else { /* Normal happy case */ if (type >= 2) addr <<= 3; cp[-1] |= addr; /* add in the address bits */ } if (rex && (n & 8)==8) { *rex |= ((type < 2) ? 1 : /* rex.b */ (type == 2) ? 4 /* rex.r */ : 2 /* rex.x */); } /* we reuse the same REX byte for multiple operands */ break; } case DASM_REL_LG: p++; if (n >= 0) goto rel_pc; b++; n = (int) (ptrdiff_t) D->globals[-n]; case DASM_REL_A: rel_a:n -= (int) (ptrdiff_t) (cp + 4); goto wd; /* !x64 */ case DASM_REL_PC: rel_pc:{ int shrink = *b++; int *pb = DASM_POS2PTR (D, n); if (*pb < 0) { n = pb[1]; goto rel_a; } n = *pb - ((int) (cp - base) + 4 - shrink); if (shrink == 0) goto wd; if (shrink == 4) { cp--; cp[-1] = *cp - 0x10; } else cp[-1] = 0xeb; goto wb; } case DASM_IMM_LG: p++; if (n < 0) { n = (int) (ptrdiff_t) D->globals[-n]; goto wd; } case DASM_IMM_PC: { int *pb = DASM_POS2PTR (D, n); n = *pb < 0 ? pb[1] : (*pb + (int) (ptrdiff_t) base); goto wd; } case DASM_LABEL_LG: { int idx = *p++; if (idx >= 10) D->globals[idx] = (void *) (base + (*p == DASM_SETLABEL ? *b : n)); break; } case DASM_LABEL_PC: case DASM_SETLABEL: break; case DASM_SPACE: { int fill = *p++; while (n--) *cp++ = fill; break; } case DASM_ALIGN: n = *p++; while (((cp - base) & n)) *cp++ = 0x90; /* nop */ break; case DASM_EXTERN: n = DASM_EXTERN (Dst, cp, p[1], *p); p += 2; goto wd; case DASM_MARK: mark = cp; break; case DASM_MARKREX: rex = cp-1; break; case DASM_OPTREX: if (*b++ & 8) { rex = cp; *cp++ = 64; } break; case DASM_ESC: action = *p++; default: *cp++ = action; break; case DASM_SECTION: case DASM_STOP: goto stop; } } stop:(void) 0; } } if (base + D->codesize != cp) { /* Check for phase errors. */ /* fprintf(stderr, "Overshoot of %d bytes\n", cp - (base + D->codesize)); */ return DASM_S_PHASE; } return DASM_S_OK; } /* Get PC label offset. */ int dasm_getpclabel (Dst_DECL, unsigned int pc) { dasm_State *D = Dst_REF; if (pc * sizeof (int) < D->pcsize) { int pos = D->pclabels[pc]; if (pos < 0) return *DASM_POS2PTR (D, -pos); if (pos > 0) return -1; /* Undefined. */ } return -2; /* Unused or out of range. */ } #ifdef DASM_CHECKS /* Optional sanity checker to call between isolated encoding steps. */ int dasm_checkstep (Dst_DECL, int secmatch) { dasm_State *D = Dst_REF; if (D->status == DASM_S_OK) { int i; for (i = 1; i <= 9; i++) { if (D->lglabels[i] > 0) { D->status = DASM_S_UNDEF_L | i; break; } D->lglabels[i] = 0; } } if (D->status == DASM_S_OK && secmatch >= 0 && D->section != &D->sections[secmatch]) D->status = DASM_S_MATCH_SEC | (int) (D->section - D->sections); return D->status; } #endif MoarVM-2018.03/3rdparty/dynasm/dasm_x86.lua0000644000175000017510000016531313237701103020410 0ustar samanthasamantha------------------------------------------------------------------------------ -- DynASM x86/x64 module. -- -- Copyright (C) 2005-2015 Mike Pall. All rights reserved. -- See dynasm.lua for full copyright notice. ------------------------------------------------------------------------------ local x64 = x64 -- Module information: local _info = { arch = x64 and "x64" or "x86", description = "DynASM x86/x64 module", version = "1.3.0", vernum = 10300, release = "2011-05-05", author = "Mike Pall", license = "MIT", } -- Exported glue functions for the arch-specific module. local _M = { _info = _info } -- Cache library functions. local type, tonumber, pairs, ipairs = type, tonumber, pairs, ipairs local assert, unpack, setmetatable = assert, unpack or table.unpack, setmetatable local _s = string local sub, format, byte, char = _s.sub, _s.format, _s.byte, _s.char local find, match, gmatch, gsub = _s.find, _s.match, _s.gmatch, _s.gsub local concat, sort = table.concat, table.sort local bit = bit or require("bit") local band, shl, shr = bit.band, bit.lshift, bit.rshift -- Inherited tables and callbacks. local g_opt, g_arch local wline, werror, wfatal, wwarn -- Action name list. -- CHECK: Keep this in sync with the C code! local action_names = { -- int arg, 1 buffer pos: "DISP", "IMM_S", "IMM_B", "IMM_W", "IMM_D", "IMM_WB", "IMM_DB", -- action arg (1 byte), int arg, 1 buffer pos (reg/num): "VREG", "SPACE", -- !x64: VREG support NYI. -- ptrdiff_t arg, 1 buffer pos (address): !x64 "SETLABEL", "REL_A", -- action arg (1 byte) or int arg, 2 buffer pos (link, offset): "REL_LG", "REL_PC", -- action arg (1 byte) or int arg, 1 buffer pos (link): "IMM_LG", "IMM_PC", -- action arg (1 byte) or int arg, 1 buffer pos (offset): "LABEL_LG", "LABEL_PC", -- action arg (1 byte), 1 buffer pos (offset): "ALIGN", -- action args (2 bytes), no buffer pos. "EXTERN", -- action arg (1 byte), no buffer pos. "ESC", -- no action arg, no buffer pos. "MARK", "MARKREX", -- no action arg, 1 buffer pos "OPTREX", -- action arg (1 byte), no buffer pos, terminal action: "SECTION", -- no args, no buffer pos, terminal action: "STOP" } -- Maximum number of section buffer positions for dasm_put(). -- CHECK: Keep this in sync with the C code! local maxsecpos = 25 -- Keep this low, to avoid excessively long C lines. -- Action name -> action number (dynamically generated below). local map_action = {} -- First action number. Everything below does not need to be escaped. local actfirst = 256-#action_names -- Action list buffer and string (only used to remove dupes). local actlist = {} local actstr = "" -- Argument list for next dasm_put(). Start with offset 0 into action list. local actargs = { 0 } -- Current number of section buffer positions for dasm_put(). local secpos = 1 ------------------------------------------------------------------------------ -- Compute action numbers for action names. for n,name in ipairs(action_names) do local num = actfirst + n - 1 map_action[name] = num end -- Dump action names and numbers. local function dumpactions(out) out:write("DynASM encoding engine action codes:\n") for n,name in ipairs(action_names) do local num = map_action[name] out:write(format(" %-10s %02X %d\n", name, num, num)) end out:write("\n") end -- Write action list buffer as a huge static C array. local function writeactions(out, name) local nn = #actlist local last = actlist[nn] or 255 actlist[nn] = nil -- Remove last byte. if nn == 0 then nn = 1 end out:write("static const unsigned char ", name, "[", nn, "] = {\n") local s = " " for n,b in ipairs(actlist) do s = s..b.."," if #s >= 75 then assert(out:write(s, "\n")) s = " " end end out:write(s, last, "\n};\n\n") -- Add last byte back. end ------------------------------------------------------------------------------ -- Add byte to action list. local function wputxb(n) assert(n >= 0 and n <= 255 and n % 1 == 0, "byte out of range") actlist[#actlist+1] = n end -- Add action to list with optional arg. Advance buffer pos, too. local function waction(action, a, num) wputxb(assert(map_action[action], "bad action name `"..action.."'")) if a then actargs[#actargs+1] = a end if a or num then secpos = secpos + (num or 1) end end -- Add call to embedded DynASM C code. local function wcall(func, args) wline(format("dasm_%s(Dst, %s);", func, concat(args, ", ")), true) end -- Delete duplicate action list chunks. A tad slow, but so what. local function dedupechunk(offset) local al, as = actlist, actstr local chunk = char(unpack(al, offset+1, #al)) local orig = find(as, chunk, 1, true) if orig then actargs[1] = orig-1 -- Replace with original offset. for i=offset+1,#al do al[i] = nil end -- Kill dupe. else actstr = as..chunk end end -- Flush action list (intervening C code or buffer pos overflow). local function wflush(term) local offset = actargs[1] if #actlist == offset then return end -- Nothing to flush. if not term then waction("STOP") end -- Terminate action list. dedupechunk(offset) wcall("put", actargs) -- Add call to dasm_put(). actargs = { #actlist } -- Actionlist offset is 1st arg to next dasm_put(). secpos = 1 -- The actionlist offset occupies a buffer position, too. end -- Put escaped byte. local function wputb(n) if n >= actfirst then waction("ESC") end -- Need to escape byte. wputxb(n) end ------------------------------------------------------------------------------ -- Global label name -> global label number. With auto assignment on 1st use. local next_global = 10 local map_global = setmetatable({}, { __index = function(t, name) if not match(name, "^[%a_][%w_@]*$") then werror("bad global label") end local n = next_global if n > 246 then werror("too many global labels") end next_global = n + 1 t[name] = n return n end}) -- Dump global labels. local function dumpglobals(out, lvl) local t = {} for name, n in pairs(map_global) do t[n] = name end out:write("Global labels:\n") for i=10,next_global-1 do out:write(format(" %s\n", t[i])) end out:write("\n") end -- Write global label enum. local function writeglobals(out, prefix) local t = {} for name, n in pairs(map_global) do t[n] = name end out:write("enum {\n") for i=10,next_global-1 do out:write(" ", prefix, gsub(t[i], "@.*", ""), ",\n") end out:write(" ", prefix, "_MAX\n};\n") end -- Write global label names. local function writeglobalnames(out, name) local t = {} for name, n in pairs(map_global) do t[n] = name end out:write("static const char *const ", name, "[] = {\n") for i=10,next_global-1 do out:write(" \"", t[i], "\",\n") end out:write(" (const char *)0\n};\n") end ------------------------------------------------------------------------------ -- Extern label name -> extern label number. With auto assignment on 1st use. local next_extern = -1 local map_extern = setmetatable({}, { __index = function(t, name) -- No restrictions on the name for now. local n = next_extern if n < -256 then werror("too many extern labels") end next_extern = n - 1 t[name] = n return n end}) -- Dump extern labels. local function dumpexterns(out, lvl) local t = {} for name, n in pairs(map_extern) do t[-n] = name end out:write("Extern labels:\n") for i=1,-next_extern-1 do out:write(format(" %s\n", t[i])) end out:write("\n") end -- Write extern label names. local function writeexternnames(out, name) local t = {} for name, n in pairs(map_extern) do t[-n] = name end out:write("static const char *const ", name, "[] = {\n") for i=1,-next_extern-1 do out:write(" \"", t[i], "\",\n") end out:write(" (const char *)0\n};\n") end ------------------------------------------------------------------------------ -- Arch-specific maps. local map_archdef = {} -- Ext. register name -> int. name. local map_reg_rev = {} -- Int. register name -> ext. name. local map_reg_num = {} -- Int. register name -> register number. local map_reg_opsize = {} -- Int. register name -> operand size. local map_reg_valid_base = {} -- Int. register name -> valid base register? local map_reg_valid_index = {} -- Int. register name -> valid index register? local map_reg_needrex = {} -- Int. register name -> need rex vs. no rex. local reg_list = {} -- Canonical list of int. register names. local map_type = {} -- Type name -> { ctype, reg } local ctypenum = 0 -- Type number (for _PTx macros). local addrsize = x64 and "q" or "d" -- Size for address operands. -- Helper functions to fill register maps. local function mkrmap(sz, cl, names) local cname = format("@%s", sz) reg_list[#reg_list+1] = cname map_archdef[cl] = cname map_reg_rev[cname] = cl map_reg_num[cname] = -1 map_reg_opsize[cname] = sz if sz == addrsize or sz == "d" then map_reg_valid_base[cname] = true map_reg_valid_index[cname] = true end if names then for n,name in ipairs(names) do local iname = format("@%s%x", sz, n-1) reg_list[#reg_list+1] = iname map_archdef[name] = iname map_reg_rev[iname] = name map_reg_num[iname] = n-1 map_reg_opsize[iname] = sz if sz == "b" and n > 4 then map_reg_needrex[iname] = false end if sz == addrsize or sz == "d" then map_reg_valid_base[iname] = true map_reg_valid_index[iname] = true end end end for i=0,(x64 and sz ~= "f") and 15 or 7 do local needrex = sz == "b" and i > 3 local iname = format("@%s%x%s", sz, i, needrex and "R" or "") if needrex then map_reg_needrex[iname] = true end local name if sz == "o" then name = format("xmm%d", i) elseif sz == "f" then name = format("st%d", i) else name = format("r%d%s", i, sz == addrsize and "" or sz) end map_archdef[name] = iname if not map_reg_rev[iname] then reg_list[#reg_list+1] = iname map_reg_rev[iname] = name map_reg_num[iname] = i map_reg_opsize[iname] = sz if sz == addrsize or sz == "d" then map_reg_valid_base[iname] = true map_reg_valid_index[iname] = true end end end reg_list[#reg_list+1] = "" end -- Integer registers (qword, dword, word and byte sized). if x64 then mkrmap("q", "Rq", {"rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi"}) end mkrmap("d", "Rd", {"eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"}) mkrmap("w", "Rw", {"ax", "cx", "dx", "bx", "sp", "bp", "si", "di"}) mkrmap("b", "Rb", {"al", "cl", "dl", "bl", "ah", "ch", "dh", "bh"}) map_reg_valid_index[map_archdef.esp] = false if x64 then map_reg_valid_index[map_archdef.rsp] = false end map_archdef["Ra"] = "@"..addrsize -- FP registers (internally tword sized, but use "f" as operand size). mkrmap("f", "Rf") -- SSE registers (oword sized, but qword and dword accessible). mkrmap("o", "xmm") -- Operand size prefixes to codes. local map_opsize = { byte = "b", word = "w", dword = "d", qword = "q", oword = "o", tword = "t", aword = addrsize, } -- Operand size code to number. local map_opsizenum = { b = 1, w = 2, d = 4, q = 8, o = 16, t = 10, } -- Operand size code to name. local map_opsizename = { b = "byte", w = "word", d = "dword", q = "qword", o = "oword", t = "tword", f = "fpword", } -- Valid index register scale factors. local map_xsc = { ["1"] = 0, ["2"] = 1, ["4"] = 2, ["8"] = 3, } -- Condition codes. local map_cc = { o = 0, no = 1, b = 2, nb = 3, e = 4, ne = 5, be = 6, nbe = 7, s = 8, ns = 9, p = 10, np = 11, l = 12, nl = 13, le = 14, nle = 15, c = 2, nae = 2, nc = 3, ae = 3, z = 4, nz = 5, na = 6, a = 7, pe = 10, po = 11, nge = 12, ge = 13, ng = 14, g = 15, } -- Reverse defines for registers. function _M.revdef(s) return gsub(s, "@%w+", map_reg_rev) end -- Dump register names and numbers local function dumpregs(out) out:write("Register names, sizes and internal numbers:\n") for _,reg in ipairs(reg_list) do if reg == "" then out:write("\n") else local name = map_reg_rev[reg] local num = map_reg_num[reg] local opsize = map_opsizename[map_reg_opsize[reg]] out:write(format(" %-5s %-8s %s\n", name, opsize, num < 0 and "(variable)" or num)) end end end ------------------------------------------------------------------------------ -- Put action for label arg (IMM_LG, IMM_PC, REL_LG, REL_PC). local function wputlabel(aprefix, imm, num) if type(imm) == "number" then if imm < 0 then waction("EXTERN") wputxb(aprefix == "IMM_" and 0 or 1) imm = -imm-1 else waction(aprefix.."LG", nil, num); end wputxb(imm) else waction(aprefix.."PC", imm, num) end end -- Put signed byte or arg. local function wputsbarg(n) if type(n) == "number" then if n < -128 or n > 127 then werror("signed immediate byte out of range") end if n < 0 then n = n + 256 end wputb(n) else waction("IMM_S", n) end end -- Put unsigned byte or arg. local function wputbarg(n) if type(n) == "number" then if n < 0 or n > 255 then werror("unsigned immediate byte out of range") end wputb(n) else waction("IMM_B", n) end end -- Put unsigned word or arg. local function wputwarg(n) if type(n) == "number" then if shr(n, 16) ~= 0 then werror("unsigned immediate word out of range") end wputb(band(n, 255)); wputb(shr(n, 8)); else waction("IMM_W", n) end end -- Put signed or unsigned dword or arg. local function wputdarg(n) local tn = type(n) if tn == "number" then wputb(band(n, 255)) wputb(band(shr(n, 8), 255)) wputb(band(shr(n, 16), 255)) wputb(shr(n, 24)) elseif tn == "table" then wputlabel("IMM_", n[1], 1) else waction("IMM_D", n) end end -- Put operand-size dependent number or arg (defaults to dword). local function wputszarg(sz, n) if not sz or sz == "d" or sz == "q" then wputdarg(n) elseif sz == "w" then wputwarg(n) elseif sz == "b" then wputbarg(n) elseif sz == "s" then wputsbarg(n) else werror("bad operand size") end end -- Put multi-byte opcode with operand-size dependent modifications. local function wputop(sz, op, rex, mark_rex) local r if rex ~= 0 and not x64 then werror("bad operand size") end if sz == "w" then wputb(102) end -- Needs >32 bit numbers, but only for crc32 eax, word [ebx] if op >= 4294967296 then r = op%4294967296 wputb((op-r)/4294967296) op = r end if op >= 16777216 then wputb(shr(op, 24)); op = band(op, 0xffffff) end if op >= 65536 then if rex ~= 0 then local opc3 = band(op, 0xffff00) if opc3 == 0x0f3a00 or opc3 == 0x0f3800 then wputb(64 + band(rex, 15)); rex = 0 if mark_rex then waction("MARKREX"); mark_rex = false end end elseif mark_rex then waction("OPTREX"); mark_rex = false end wputb(shr(op, 16)); op = band(op, 0xffff) end if op >= 256 then local b = shr(op, 8) if b == 15 and rex ~= 0 then wputb(64 + band(rex, 15)); rex = 0 if mark_rex then waction("MARKREX"); mark_rex = false end elseif mark_rex then waction("OPTREX"); mark_rex = false end wputb(b) op = band(op, 255) end if rex ~= 0 then wputb(64 + band(rex, 15)) if mark_rex then waction("MARKREX") end elseif mark_rex then waction("OPTREX") end if sz == "b" then op = op - 1 end wputb(op) end -- Put ModRM or SIB formatted byte. local function wputmodrm(m, s, rm, vs, vrm) assert(m < 4 and s < 16 and rm < 16, "bad modrm operands") wputb(shl(m, 6) + shl(band(s, 7), 3) + band(rm, 7)) end -- Put ModRM/SIB plus optional displacement. local function wputmrmsib(t, imark, s, vsreg) local vreg, vxreg local reg, xreg = t.reg, t.xreg if reg and reg < 0 then reg = 0; vreg = t.vreg end if xreg and xreg < 0 then xreg = 0; vxreg = t.vxreg end if s < 0 then s = 0 end -- Register mode. if sub(t.mode, 1, 1) == "r" then wputmodrm(3, s, reg) if vsreg then waction("VREG", vsreg); wputxb(14) end -- 3 << 2 + 2 if vreg then waction("VREG", vreg); wputxb(12) end -- 3 << 2 + 0 return end local disp = t.disp local tdisp = type(disp) -- No base register? if not reg then local riprel = false if xreg then -- Indexed mode with index register only. -- [xreg*xsc+disp] -> (0, s, esp) (xsc, xreg, ebp) wputmodrm(0, s, 4) if imark == "I" then waction("MARK") end if vsreg then waction("VREG", vsreg); wputxb(2) end -- 0 << 2 + 2 wputmodrm(t.xsc, xreg, 5) if vxreg then waction("VREG", vxreg); wputxb(shl(t.xsc, 2) + 3) end -- t.xsc << 2 + 2 else -- Pure 32 bit displacement. if x64 and tdisp ~= "table" then wputmodrm(0, s, 4) -- [disp] -> (0, s, esp) (0, esp, ebp) if imark == "I" then waction("MARK") end wputmodrm(0, 4, 5) else riprel = x64 wputmodrm(0, s, 5) -- [disp|rip-label] -> (0, s, ebp) if imark == "I" then waction("MARK") end end if vsreg then waction("VREG", vsreg); wputxb(2) end -- 0 << 2 + 2 end if riprel then -- Emit rip-relative displacement. if match("UWSiI", imark) then werror("NYI: rip-relative displacement followed by immediate") end -- The previous byte in the action buffer cannot be 0xe9 or 0x80-0x8f. wputlabel("REL_", disp[1], 2) else wputdarg(disp) end return end local m if tdisp == "number" then -- Check displacement size at assembly time. if disp == 0 and band(reg, 7) ~= 5 then -- [ebp] -> [ebp+0] (in SIB, too) if not vreg then m = 0 end -- Force DISP to allow [Rd(5)] -> [ebp+0] elseif disp >= -128 and disp <= 127 then m = 1 else m = 2 end elseif tdisp == "table" then m = 2 end -- Index register present or esp as base register: need SIB encoding. if xreg or band(reg, 7) == 4 then wputmodrm(m or 2, s, 4) -- ModRM. if m == nil or imark == "I" then waction("MARK") end if vsreg then waction("VREG", vsreg); wputxb(shl(m or 2, 2) + 2) end wputmodrm(t.xsc or 0, xreg or 4, reg) -- SIB. if vxreg then waction("VREG", vxreg); wputxb(shl(t.xsc or 0, 2) + 3) end if vreg then waction("VREG", vreg); wputxb(shl(t.xsc or 2, 2) + 1) end else wputmodrm(m or 2, s, reg) -- ModRM. if (imark == "I" and (m == 1 or m == 2)) or (m == nil and (vsreg or vreg)) then waction("MARK") end if vsreg then waction("VREG", vsreg); wputxb(shl(m or 2, 2) + 2) end if vreg then waction("VREG", vreg); wputxb(shl(m or 2, 2) + 0) end end -- Put displacement. if m == 1 then wputsbarg(disp) elseif m == 2 then wputdarg(disp) elseif m == nil then waction("DISP", disp) end end ------------------------------------------------------------------------------ -- Return human-readable operand mode string. local function opmodestr(op, args) local m = {} for i=1,#args do local a = args[i] m[#m+1] = sub(a.mode, 1, 1)..(a.opsize or "?") end return op.." "..concat(m, ",") end -- Convert number to valid integer or nil. local function toint(expr) local n = tonumber(expr) if n then if n % 1 ~= 0 or n < -2147483648 or n > 4294967295 then werror("bad integer number `"..expr.."'") end return n end end -- Parse immediate expression. local function immexpr(expr) -- &expr (pointer) if sub(expr, 1, 1) == "&" then return "iPJ", format("(ptrdiff_t)(%s)", sub(expr,2)) end local prefix = sub(expr, 1, 2) -- =>expr (pc label reference) if prefix == "=>" then return "iJ", sub(expr, 3) end -- ->name (global label reference) if prefix == "->" then return "iJ", map_global[sub(expr, 3)] end -- [<>][1-9] (local label reference) local dir, lnum = match(expr, "^([<>])([1-9])$") if dir then -- Fwd: 247-255, Bkwd: 1-9. return "iJ", lnum + (dir == ">" and 246 or 0) end local extname = match(expr, "^extern%s+(%S+)$") if extname then return "iJ", map_extern[extname] end -- expr (interpreted as immediate) return "iI", expr end -- Parse displacement expression: +-num, +-expr, +-opsize*num local function dispexpr(expr) local disp = expr == "" and 0 or toint(expr) if disp then return disp end local c, dispt = match(expr, "^([+-])%s*(.+)$") if c == "+" then expr = dispt elseif not c then werror("bad displacement expression `"..expr.."'") end local opsize, tailops = match(dispt, "^(%w+)%s*%*%s*(.+)$") local ops, imm = map_opsize[opsize], toint(tailops) if ops and imm then if c == "-" then imm = -imm end return imm*map_opsizenum[ops] end local mode, iexpr = immexpr(dispt) if mode == "iJ" then if c == "-" then werror("cannot invert label reference") end return { iexpr } end return expr -- Need to return original signed expression. end -- Parse register or type expression. local function rtexpr(expr) if not expr then return end local tname, ovreg = match(expr, "^([%w_]+):(@[%w_]+)$") local tp = map_type[tname or expr] if tp then local reg = ovreg or tp.reg local rnum = map_reg_num[reg] if not rnum then werror("type `"..(tname or expr).."' needs a register override") end if not map_reg_valid_base[reg] then werror("bad base register override `"..(map_reg_rev[reg] or reg).."'") end return reg, rnum, tp end return expr, map_reg_num[expr] end -- Parse operand and return { mode, opsize, reg, xreg, xsc, disp, imm }. local function parseoperand(param) local t = {} local expr = param local opsize, tailops = match(param, "^(%w+)%s*(.+)$") if opsize then t.opsize = map_opsize[opsize] if t.opsize then expr = tailops end end local br = match(expr, "^%[%s*(.-)%s*%]$") repeat if br then t.mode = "xm" -- [disp] t.disp = toint(br) if t.disp then t.mode = x64 and "xm" or "xmO" break end -- [reg...] local tp local reg, tailr = match(br, "^([@%w_:]+)%s*(.*)$") reg, t.reg, tp = rtexpr(reg) if not t.reg then -- [expr] t.mode = x64 and "xm" or "xmO" t.disp = dispexpr("+"..br) break end if t.reg == -1 then t.vreg, tailr = match(tailr, "^(%b())(.*)$") if not t.vreg then werror("bad variable register expression") end end -- [xreg*xsc] or [xreg*xsc+-disp] or [xreg*xsc+-expr] local xsc, tailsc = match(tailr, "^%*%s*([1248])%s*(.*)$") if xsc then if not map_reg_valid_index[reg] then werror("bad index register `"..map_reg_rev[reg].."'") end t.xsc = map_xsc[xsc] t.xreg = t.reg t.vxreg = t.vreg t.reg = nil t.vreg = nil t.disp = dispexpr(tailsc) break end if not map_reg_valid_base[reg] then werror("bad base register `"..map_reg_rev[reg].."'") end -- [reg] or [reg+-disp] t.disp = toint(tailr) or (tailr == "" and 0) if t.disp then break end -- [reg+xreg...] local xreg, tailx = match(tailr, "^+%s*([@%w_:]+)%s*(.*)$") xreg, t.xreg, tp = rtexpr(xreg) if not t.xreg then -- [reg+-expr] t.disp = dispexpr(tailr) break end if not map_reg_valid_index[xreg] then werror("bad index register `"..map_reg_rev[xreg].."'") end if t.xreg == -1 then t.vxreg, tailx = match(tailx, "^(%b())(.*)$") if not t.vxreg then werror("bad variable register expression") end end -- [reg+xreg*xsc...] local xsc, tailsc = match(tailx, "^%*%s*([1248])%s*(.*)$") if xsc then t.xsc = map_xsc[xsc] tailx = tailsc end -- [...] or [...+-disp] or [...+-expr] t.disp = dispexpr(tailx) else -- imm or opsize*imm local imm = toint(expr) if not imm and sub(expr, 1, 1) == "*" and t.opsize then imm = toint(sub(expr, 2)) if imm then imm = imm * map_opsizenum[t.opsize] t.opsize = nil end end if imm then if t.opsize then werror("bad operand size override") end local m = "i" if imm == 1 then m = m.."1" end if imm >= 4294967168 and imm <= 4294967295 then imm = imm-4294967296 end if imm >= -128 and imm <= 127 then m = m.."S" end t.imm = imm t.mode = m break end local tp local reg, tailr = match(expr, "^([@%w_:]+)%s*(.*)$") reg, t.reg, tp = rtexpr(reg) if t.reg then if t.reg == -1 then t.vreg, tailr = match(tailr, "^(%b())(.*)$") if not t.vreg then werror("bad variable register expression") end end -- reg if tailr == "" then if t.opsize then werror("bad operand size override") end t.opsize = map_reg_opsize[reg] if t.opsize == "f" then t.mode = t.reg == 0 and "fF" or "f" else if reg == "@w4" or (x64 and reg == "@d4") then wwarn("bad idea, try again with `"..(x64 and "rsp'" or "esp'")) end t.mode = t.reg == 0 and "rmR" or (reg == "@b1" and "rmC" or "rm") end t.needrex = map_reg_needrex[reg] break end -- type[idx], type[idx].field, type->field -> [reg+offset_expr] if not tp then werror("bad operand `"..param.."'") end t.mode = "xm" t.disp = format(tp.ctypefmt, tailr) else t.mode, t.imm = immexpr(expr) if sub(t.mode, -1) == "J" then if t.opsize and t.opsize ~= addrsize then werror("bad operand size override") end t.opsize = addrsize end end end until true return t end ------------------------------------------------------------------------------ -- x86 Template String Description -- =============================== -- -- Each template string is a list of [match:]pattern pairs, -- separated by "|". The first match wins. No match means a -- bad or unsupported combination of operand modes or sizes. -- -- The match part and the ":" is omitted if the operation has -- no operands. Otherwise the first N characters are matched -- against the mode strings of each of the N operands. -- -- The mode string for each operand type is (see parseoperand()): -- Integer register: "rm", +"R" for eax, ax, al, +"C" for cl -- FP register: "f", +"F" for st0 -- Index operand: "xm", +"O" for [disp] (pure offset) -- Immediate: "i", +"S" for signed 8 bit, +"1" for 1, -- +"I" for arg, +"P" for pointer -- Any: +"J" for valid jump targets -- -- So a match character "m" (mixed) matches both an integer register -- and an index operand (to be encoded with the ModRM/SIB scheme). -- But "r" matches only a register and "x" only an index operand -- (e.g. for FP memory access operations). -- -- The operand size match string starts right after the mode match -- characters and ends before the ":". "dwb" or "qdwb" is assumed, if empty. -- The effective data size of the operation is matched against this list. -- -- If only the regular "b", "w", "d", "q", "t" operand sizes are -- present, then all operands must be the same size. Unspecified sizes -- are ignored, but at least one operand must have a size or the pattern -- won't match (use the "byte", "word", "dword", "qword", "tword" -- operand size overrides. E.g.: mov dword [eax], 1). -- -- If the list has a "1" or "2" prefix, the operand size is taken -- from the respective operand and any other operand sizes are ignored. -- If the list contains only ".", all operand sizes are ignored. -- If the list has a "/" prefix, the concatenated (mixed) operand sizes -- are compared to the match. -- -- E.g. "rrdw" matches for either two dword registers or two word -- registers. "Fx2dq" matches an st0 operand plus an index operand -- pointing to a dword (float) or qword (double). -- -- Every character after the ":" is part of the pattern string: -- Hex chars are accumulated to form the opcode (left to right). -- "n" disables the standard opcode mods -- (otherwise: -1 for "b", o16 prefix for "w", rex.w for "q") -- "X" Force REX.W. -- "r"/"R" adds the reg. number from the 1st/2nd operand to the opcode. -- "m"/"M" generates ModRM/SIB from the 1st/2nd operand. -- The spare 3 bits are either filled with the last hex digit or -- the result from a previous "r"/"R". The opcode is restored. -- -- All of the following characters force a flush of the opcode: -- "o"/"O" stores a pure 32 bit disp (offset) from the 1st/2nd operand. -- "S" stores a signed 8 bit immediate from the last operand. -- "U" stores an unsigned 8 bit immediate from the last operand. -- "W" stores an unsigned 16 bit immediate from the last operand. -- "i" stores an operand sized immediate from the last operand. -- "I" dito, but generates an action code to optionally modify -- the opcode (+2) for a signed 8 bit immediate. -- "J" generates one of the REL action codes from the last operand. -- ------------------------------------------------------------------------------ -- Template strings for x86 instructions. Ordered by first opcode byte. -- Unimplemented opcodes (deliberate omissions) are marked with *. local map_op = { -- 00-05: add... -- 06: *push es -- 07: *pop es -- 08-0D: or... -- 0E: *push cs -- 0F: two byte opcode prefix -- 10-15: adc... -- 16: *push ss -- 17: *pop ss -- 18-1D: sbb... -- 1E: *push ds -- 1F: *pop ds -- 20-25: and... es_0 = "26", -- 27: *daa -- 28-2D: sub... cs_0 = "2E", -- 2F: *das -- 30-35: xor... ss_0 = "36", -- 37: *aaa -- 38-3D: cmp... ds_0 = "3E", -- 3F: *aas inc_1 = x64 and "m:FF0m" or "rdw:40r|m:FF0m", dec_1 = x64 and "m:FF1m" or "rdw:48r|m:FF1m", push_1 = (x64 and "rq:n50r|rw:50r|mq:nFF6m|mw:FF6m" or "rdw:50r|mdw:FF6m").."|S.:6AS|ib:n6Ai|i.:68i", pop_1 = x64 and "rq:n58r|rw:58r|mq:n8F0m|mw:8F0m" or "rdw:58r|mdw:8F0m", -- 60: *pusha, *pushad, *pushaw -- 61: *popa, *popad, *popaw -- 62: *bound rdw,x -- 63: x86: *arpl mw,rw movsxd_2 = x64 and "rm/qd:63rM", fs_0 = "64", gs_0 = "65", o16_0 = "66", a16_0 = not x64 and "67" or nil, a32_0 = x64 and "67", -- 68: push idw -- 69: imul rdw,mdw,idw -- 6A: push ib -- 6B: imul rdw,mdw,S -- 6C: *insb -- 6D: *insd, *insw -- 6E: *outsb -- 6F: *outsd, *outsw -- 70-7F: jcc lb -- 80: add... mb,i -- 81: add... mdw,i -- 82: *undefined -- 83: add... mdw,S test_2 = "mr:85Rm|rm:85rM|Ri:A9ri|mi:F70mi", -- 86: xchg rb,mb -- 87: xchg rdw,mdw -- 88: mov mb,r -- 89: mov mdw,r -- 8A: mov r,mb -- 8B: mov r,mdw -- 8C: *mov mdw,seg lea_2 = "rx1dq:8DrM", -- 8E: *mov seg,mdw -- 8F: pop mdw nop_0 = "90", xchg_2 = "Rrqdw:90R|rRqdw:90r|rm:87rM|mr:87Rm", cbw_0 = "6698", cwde_0 = "98", cdqe_0 = "4898", cwd_0 = "6699", cdq_0 = "99", cqo_0 = "4899", -- 9A: *call iw:idw wait_0 = "9B", fwait_0 = "9B", pushf_0 = "9C", pushfd_0 = not x64 and "9C", pushfq_0 = x64 and "9C", popf_0 = "9D", popfd_0 = not x64 and "9D", popfq_0 = x64 and "9D", sahf_0 = "9E", lahf_0 = "9F", mov_2 = "OR:A3o|RO:A1O|mr:89Rm|rm:8BrM|rib:nB0ri|ridw:B8ri|mi:C70mi", movsb_0 = "A4", movsw_0 = "66A5", movsd_0 = "A5", cmpsb_0 = "A6", cmpsw_0 = "66A7", cmpsd_0 = "A7", -- A8: test Rb,i -- A9: test Rdw,i stosb_0 = "AA", stosw_0 = "66AB", stosd_0 = "AB", lodsb_0 = "AC", lodsw_0 = "66AD", lodsd_0 = "AD", scasb_0 = "AE", scasw_0 = "66AF", scasd_0 = "AF", -- B0-B7: mov rb,i -- B8-BF: mov rdw,i -- C0: rol... mb,i -- C1: rol... mdw,i ret_1 = "i.:nC2W", ret_0 = "C3", -- C4: *les rdw,mq -- C5: *lds rdw,mq -- C6: mov mb,i -- C7: mov mdw,i -- C8: *enter iw,ib leave_0 = "C9", -- CA: *retf iw -- CB: *retf int3_0 = "CC", int_1 = "i.:nCDU", into_0 = "CE", -- CF: *iret -- D0: rol... mb,1 -- D1: rol... mdw,1 -- D2: rol... mb,cl -- D3: rol... mb,cl -- D4: *aam ib -- D5: *aad ib -- D6: *salc -- D7: *xlat -- D8-DF: floating point ops -- E0: *loopne -- E1: *loope -- E2: *loop -- E3: *jcxz, *jecxz -- E4: *in Rb,ib -- E5: *in Rdw,ib -- E6: *out ib,Rb -- E7: *out ib,Rdw call_1 = x64 and "mq:nFF2m|J.:E8nJ" or "md:FF2m|J.:E8J", jmp_1 = x64 and "mq:nFF4m|J.:E9nJ" or "md:FF4m|J.:E9J", -- short: EB -- EA: *jmp iw:idw -- EB: jmp ib -- EC: *in Rb,dx -- ED: *in Rdw,dx -- EE: *out dx,Rb -- EF: *out dx,Rdw lock_0 = "F0", int1_0 = "F1", repne_0 = "F2", repnz_0 = "F2", rep_0 = "F3", repe_0 = "F3", repz_0 = "F3", -- F4: *hlt cmc_0 = "F5", -- F6: test... mb,i; div... mb -- F7: test... mdw,i; div... mdw clc_0 = "F8", stc_0 = "F9", -- FA: *cli cld_0 = "FC", std_0 = "FD", -- FE: inc... mb -- FF: inc... mdw -- misc ops not_1 = "m:F72m", neg_1 = "m:F73m", mul_1 = "m:F74m", imul_1 = "m:F75m", div_1 = "m:F76m", idiv_1 = "m:F77m", imul_2 = "rmqdw:0FAFrM|rIqdw:69rmI|rSqdw:6BrmS|riqdw:69rmi", imul_3 = "rmIqdw:69rMI|rmSqdw:6BrMS|rmiqdw:69rMi", movzx_2 = "rm/db:0FB6rM|rm/qb:|rm/wb:0FB6rM|rm/dw:0FB7rM|rm/qw:", movsx_2 = "rm/db:0FBErM|rm/qb:|rm/wb:0FBErM|rm/dw:0FBFrM|rm/qw:", bswap_1 = "rqd:0FC8r", bsf_2 = "rmqdw:0FBCrM", bsr_2 = "rmqdw:0FBDrM", bt_2 = "mrqdw:0FA3Rm|miqdw:0FBA4mU", btc_2 = "mrqdw:0FBBRm|miqdw:0FBA7mU", btr_2 = "mrqdw:0FB3Rm|miqdw:0FBA6mU", bts_2 = "mrqdw:0FABRm|miqdw:0FBA5mU", shld_3 = "mriqdw:0FA4RmU|mrCqdw:0FA5Rm", shrd_3 = "mriqdw:0FACRmU|mrCqdw:0FADRm", rdtsc_0 = "0F31", -- P1+ cpuid_0 = "0FA2", -- P1+ -- floating point ops fst_1 = "ff:DDD0r|xd:D92m|xq:nDD2m", fstp_1 = "ff:DDD8r|xd:D93m|xq:nDD3m|xt:DB7m", fld_1 = "ff:D9C0r|xd:D90m|xq:nDD0m|xt:DB5m", fpop_0 = "DDD8", -- Alias for fstp st0. fist_1 = "xw:nDF2m|xd:DB2m", fistp_1 = "xw:nDF3m|xd:DB3m|xq:nDF7m", fild_1 = "xw:nDF0m|xd:DB0m|xq:nDF5m", fxch_0 = "D9C9", fxch_1 = "ff:D9C8r", fxch_2 = "fFf:D9C8r|Fff:D9C8R", fucom_1 = "ff:DDE0r", fucom_2 = "Fff:DDE0R", fucomp_1 = "ff:DDE8r", fucomp_2 = "Fff:DDE8R", fucomi_1 = "ff:DBE8r", -- P6+ fucomi_2 = "Fff:DBE8R", -- P6+ fucomip_1 = "ff:DFE8r", -- P6+ fucomip_2 = "Fff:DFE8R", -- P6+ fcomi_1 = "ff:DBF0r", -- P6+ fcomi_2 = "Fff:DBF0R", -- P6+ fcomip_1 = "ff:DFF0r", -- P6+ fcomip_2 = "Fff:DFF0R", -- P6+ fucompp_0 = "DAE9", fcompp_0 = "DED9", fldenv_1 = "x.:D94m", fnstenv_1 = "x.:D96m", fstenv_1 = "x.:9BD96m", fldcw_1 = "xw:nD95m", fstcw_1 = "xw:n9BD97m", fnstcw_1 = "xw:nD97m", fstsw_1 = "Rw:n9BDFE0|xw:n9BDD7m", fnstsw_1 = "Rw:nDFE0|xw:nDD7m", fclex_0 = "9BDBE2", fnclex_0 = "DBE2", fnop_0 = "D9D0", -- D9D1-D9DF: unassigned fchs_0 = "D9E0", fabs_0 = "D9E1", -- D9E2: unassigned -- D9E3: unassigned ftst_0 = "D9E4", fxam_0 = "D9E5", -- D9E6: unassigned -- D9E7: unassigned fld1_0 = "D9E8", fldl2t_0 = "D9E9", fldl2e_0 = "D9EA", fldpi_0 = "D9EB", fldlg2_0 = "D9EC", fldln2_0 = "D9ED", fldz_0 = "D9EE", -- D9EF: unassigned f2xm1_0 = "D9F0", fyl2x_0 = "D9F1", fptan_0 = "D9F2", fpatan_0 = "D9F3", fxtract_0 = "D9F4", fprem1_0 = "D9F5", fdecstp_0 = "D9F6", fincstp_0 = "D9F7", fprem_0 = "D9F8", fyl2xp1_0 = "D9F9", fsqrt_0 = "D9FA", fsincos_0 = "D9FB", frndint_0 = "D9FC", fscale_0 = "D9FD", fsin_0 = "D9FE", fcos_0 = "D9FF", -- SSE, SSE2 andnpd_2 = "rmo:660F55rM", andnps_2 = "rmo:0F55rM", andpd_2 = "rmo:660F54rM", andps_2 = "rmo:0F54rM", clflush_1 = "x.:0FAE7m", cmppd_3 = "rmio:660FC2rMU", cmpps_3 = "rmio:0FC2rMU", cmpsd_3 = "rrio:F20FC2rMU|rxi/oq:", cmpss_3 = "rrio:F30FC2rMU|rxi/od:", comisd_2 = "rro:660F2FrM|rx/oq:", comiss_2 = "rro:0F2FrM|rx/od:", cvtdq2pd_2 = "rro:F30FE6rM|rx/oq:", cvtdq2ps_2 = "rmo:0F5BrM", cvtpd2dq_2 = "rmo:F20FE6rM", cvtpd2ps_2 = "rmo:660F5ArM", cvtpi2pd_2 = "rx/oq:660F2ArM", cvtpi2ps_2 = "rx/oq:0F2ArM", cvtps2dq_2 = "rmo:660F5BrM", cvtps2pd_2 = "rro:0F5ArM|rx/oq:", cvtsd2si_2 = "rr/do:F20F2DrM|rr/qo:|rx/dq:|rxq:", cvtsd2ss_2 = "rro:F20F5ArM|rx/oq:", cvtsi2sd_2 = "rm/od:F20F2ArM|rm/oq:F20F2ArXM", cvtsi2ss_2 = "rm/od:F30F2ArM|rm/oq:F30F2ArXM", cvtss2sd_2 = "rro:F30F5ArM|rx/od:", cvtss2si_2 = "rr/do:F20F2CrM|rr/qo:|rxd:|rx/qd:", cvttpd2dq_2 = "rmo:660FE6rM", cvttps2dq_2 = "rmo:F30F5BrM", cvttsd2si_2 = "rr/do:F20F2CrM|rr/qo:|rx/dq:|rxq:", cvttss2si_2 = "rr/do:F30F2CrM|rr/qo:|rxd:|rx/qd:", fxsave_1 = "x.:0FAE0m", fxrstor_1 = "x.:0FAE1m", ldmxcsr_1 = "xd:0FAE2m", lfence_0 = "0FAEE8", maskmovdqu_2 = "rro:660FF7rM", mfence_0 = "0FAEF0", movapd_2 = "rmo:660F28rM|mro:660F29Rm", movaps_2 = "rmo:0F28rM|mro:0F29Rm", movd_2 = "rm/od:660F6ErM|rm/oq:660F6ErXM|mr/do:660F7ERm|mr/qo:", movdqa_2 = "rmo:660F6FrM|mro:660F7FRm", movdqu_2 = "rmo:F30F6FrM|mro:F30F7FRm", movhlps_2 = "rro:0F12rM", movhpd_2 = "rx/oq:660F16rM|xr/qo:n660F17Rm", movhps_2 = "rx/oq:0F16rM|xr/qo:n0F17Rm", movlhps_2 = "rro:0F16rM", movlpd_2 = "rx/oq:660F12rM|xr/qo:n660F13Rm", movlps_2 = "rx/oq:0F12rM|xr/qo:n0F13Rm", movmskpd_2 = "rr/do:660F50rM", movmskps_2 = "rr/do:0F50rM", movntdq_2 = "xro:660FE7Rm", movnti_2 = "xrqd:0FC3Rm", movntpd_2 = "xro:660F2BRm", movntps_2 = "xro:0F2BRm", movq_2 = "rro:F30F7ErM|rx/oq:|xr/qo:n660FD6Rm", movsd_2 = "rro:F20F10rM|rx/oq:|xr/qo:nF20F11Rm", movss_2 = "rro:F30F10rM|rx/od:|xr/do:F30F11Rm", movupd_2 = "rmo:660F10rM|mro:660F11Rm", movups_2 = "rmo:0F10rM|mro:0F11Rm", orpd_2 = "rmo:660F56rM", orps_2 = "rmo:0F56rM", packssdw_2 = "rmo:660F6BrM", packsswb_2 = "rmo:660F63rM", packuswb_2 = "rmo:660F67rM", paddb_2 = "rmo:660FFCrM", paddd_2 = "rmo:660FFErM", paddq_2 = "rmo:660FD4rM", paddsb_2 = "rmo:660FECrM", paddsw_2 = "rmo:660FEDrM", paddusb_2 = "rmo:660FDCrM", paddusw_2 = "rmo:660FDDrM", paddw_2 = "rmo:660FFDrM", pand_2 = "rmo:660FDBrM", pandn_2 = "rmo:660FDFrM", pause_0 = "F390", pavgb_2 = "rmo:660FE0rM", pavgw_2 = "rmo:660FE3rM", pcmpeqb_2 = "rmo:660F74rM", pcmpeqd_2 = "rmo:660F76rM", pcmpeqw_2 = "rmo:660F75rM", pcmpgtb_2 = "rmo:660F64rM", pcmpgtd_2 = "rmo:660F66rM", pcmpgtw_2 = "rmo:660F65rM", pextrw_3 = "rri/do:660FC5rMU|xri/wo:660F3A15nrMU", -- Mem op: SSE4.1 only. pinsrw_3 = "rri/od:660FC4rMU|rxi/ow:", pmaddwd_2 = "rmo:660FF5rM", pmaxsw_2 = "rmo:660FEErM", pmaxub_2 = "rmo:660FDErM", pminsw_2 = "rmo:660FEArM", pminub_2 = "rmo:660FDArM", pmovmskb_2 = "rr/do:660FD7rM", pmulhuw_2 = "rmo:660FE4rM", pmulhw_2 = "rmo:660FE5rM", pmullw_2 = "rmo:660FD5rM", pmuludq_2 = "rmo:660FF4rM", por_2 = "rmo:660FEBrM", prefetchnta_1 = "xb:n0F180m", prefetcht0_1 = "xb:n0F181m", prefetcht1_1 = "xb:n0F182m", prefetcht2_1 = "xb:n0F183m", psadbw_2 = "rmo:660FF6rM", pshufd_3 = "rmio:660F70rMU", pshufhw_3 = "rmio:F30F70rMU", pshuflw_3 = "rmio:F20F70rMU", pslld_2 = "rmo:660FF2rM|rio:660F726mU", pslldq_2 = "rio:660F737mU", psllq_2 = "rmo:660FF3rM|rio:660F736mU", psllw_2 = "rmo:660FF1rM|rio:660F716mU", psrad_2 = "rmo:660FE2rM|rio:660F724mU", psraw_2 = "rmo:660FE1rM|rio:660F714mU", psrld_2 = "rmo:660FD2rM|rio:660F722mU", psrldq_2 = "rio:660F733mU", psrlq_2 = "rmo:660FD3rM|rio:660F732mU", psrlw_2 = "rmo:660FD1rM|rio:660F712mU", psubb_2 = "rmo:660FF8rM", psubd_2 = "rmo:660FFArM", psubq_2 = "rmo:660FFBrM", psubsb_2 = "rmo:660FE8rM", psubsw_2 = "rmo:660FE9rM", psubusb_2 = "rmo:660FD8rM", psubusw_2 = "rmo:660FD9rM", psubw_2 = "rmo:660FF9rM", punpckhbw_2 = "rmo:660F68rM", punpckhdq_2 = "rmo:660F6ArM", punpckhqdq_2 = "rmo:660F6DrM", punpckhwd_2 = "rmo:660F69rM", punpcklbw_2 = "rmo:660F60rM", punpckldq_2 = "rmo:660F62rM", punpcklqdq_2 = "rmo:660F6CrM", punpcklwd_2 = "rmo:660F61rM", pxor_2 = "rmo:660FEFrM", rcpps_2 = "rmo:0F53rM", rcpss_2 = "rro:F30F53rM|rx/od:", rsqrtps_2 = "rmo:0F52rM", rsqrtss_2 = "rmo:F30F52rM", sfence_0 = "0FAEF8", shufpd_3 = "rmio:660FC6rMU", shufps_3 = "rmio:0FC6rMU", stmxcsr_1 = "xd:0FAE3m", ucomisd_2 = "rro:660F2ErM|rx/oq:", ucomiss_2 = "rro:0F2ErM|rx/od:", unpckhpd_2 = "rmo:660F15rM", unpckhps_2 = "rmo:0F15rM", unpcklpd_2 = "rmo:660F14rM", unpcklps_2 = "rmo:0F14rM", xorpd_2 = "rmo:660F57rM", xorps_2 = "rmo:0F57rM", -- SSE3 ops fisttp_1 = "xw:nDF1m|xd:DB1m|xq:nDD1m", addsubpd_2 = "rmo:660FD0rM", addsubps_2 = "rmo:F20FD0rM", haddpd_2 = "rmo:660F7CrM", haddps_2 = "rmo:F20F7CrM", hsubpd_2 = "rmo:660F7DrM", hsubps_2 = "rmo:F20F7DrM", lddqu_2 = "rxo:F20FF0rM", movddup_2 = "rmo:F20F12rM", movshdup_2 = "rmo:F30F16rM", movsldup_2 = "rmo:F30F12rM", -- SSSE3 ops pabsb_2 = "rmo:660F381CrM", pabsd_2 = "rmo:660F381ErM", pabsw_2 = "rmo:660F381DrM", palignr_3 = "rmio:660F3A0FrMU", phaddd_2 = "rmo:660F3802rM", phaddsw_2 = "rmo:660F3803rM", phaddw_2 = "rmo:660F3801rM", phsubd_2 = "rmo:660F3806rM", phsubsw_2 = "rmo:660F3807rM", phsubw_2 = "rmo:660F3805rM", pmaddubsw_2 = "rmo:660F3804rM", pmulhrsw_2 = "rmo:660F380BrM", pshufb_2 = "rmo:660F3800rM", psignb_2 = "rmo:660F3808rM", psignd_2 = "rmo:660F380ArM", psignw_2 = "rmo:660F3809rM", -- SSE4.1 ops blendpd_3 = "rmio:660F3A0DrMU", blendps_3 = "rmio:660F3A0CrMU", blendvpd_3 = "rmRo:660F3815rM", blendvps_3 = "rmRo:660F3814rM", dppd_3 = "rmio:660F3A41rMU", dpps_3 = "rmio:660F3A40rMU", extractps_3 = "mri/do:660F3A17RmU|rri/qo:660F3A17RXmU", insertps_3 = "rrio:660F3A41rMU|rxi/od:", movntdqa_2 = "rmo:660F382ArM", mpsadbw_3 = "rmio:660F3A42rMU", packusdw_2 = "rmo:660F382BrM", pblendvb_3 = "rmRo:660F3810rM", pblendw_3 = "rmio:660F3A0ErMU", pcmpeqq_2 = "rmo:660F3829rM", pextrb_3 = "rri/do:660F3A14nRmU|rri/qo:|xri/bo:", pextrd_3 = "mri/do:660F3A16RmU", pextrq_3 = "mri/qo:660F3A16RmU", -- pextrw is SSE2, mem operand is SSE4.1 only phminposuw_2 = "rmo:660F3841rM", pinsrb_3 = "rri/od:660F3A20nrMU|rxi/ob:", pinsrd_3 = "rmi/od:660F3A22rMU", pinsrq_3 = "rmi/oq:660F3A22rXMU", pmaxsb_2 = "rmo:660F383CrM", pmaxsd_2 = "rmo:660F383DrM", pmaxud_2 = "rmo:660F383FrM", pmaxuw_2 = "rmo:660F383ErM", pminsb_2 = "rmo:660F3838rM", pminsd_2 = "rmo:660F3839rM", pminud_2 = "rmo:660F383BrM", pminuw_2 = "rmo:660F383ArM", pmovsxbd_2 = "rro:660F3821rM|rx/od:", pmovsxbq_2 = "rro:660F3822rM|rx/ow:", pmovsxbw_2 = "rro:660F3820rM|rx/oq:", pmovsxdq_2 = "rro:660F3825rM|rx/oq:", pmovsxwd_2 = "rro:660F3823rM|rx/oq:", pmovsxwq_2 = "rro:660F3824rM|rx/od:", pmovzxbd_2 = "rro:660F3831rM|rx/od:", pmovzxbq_2 = "rro:660F3832rM|rx/ow:", pmovzxbw_2 = "rro:660F3830rM|rx/oq:", pmovzxdq_2 = "rro:660F3835rM|rx/oq:", pmovzxwd_2 = "rro:660F3833rM|rx/oq:", pmovzxwq_2 = "rro:660F3834rM|rx/od:", pmuldq_2 = "rmo:660F3828rM", pmulld_2 = "rmo:660F3840rM", ptest_2 = "rmo:660F3817rM", roundpd_3 = "rmio:660F3A09rMU", roundps_3 = "rmio:660F3A08rMU", roundsd_3 = "rrio:660F3A0BrMU|rxi/oq:", roundss_3 = "rrio:660F3A0ArMU|rxi/od:", -- SSE4.2 ops crc32_2 = "rmqd:F20F38F1rM|rm/dw:66F20F38F1rM|rm/db:F20F38F0rM|rm/qb:", pcmpestri_3 = "rmio:660F3A61rMU", pcmpestrm_3 = "rmio:660F3A60rMU", pcmpgtq_2 = "rmo:660F3837rM", pcmpistri_3 = "rmio:660F3A63rMU", pcmpistrm_3 = "rmio:660F3A62rMU", popcnt_2 = "rmqdw:F30FB8rM", -- SSE4a extrq_2 = "rro:660F79rM", extrq_3 = "riio:660F780mUU", insertq_2 = "rro:F20F79rM", insertq_4 = "rriio:F20F78rMUU", lzcnt_2 = "rmqdw:F30FBDrM", movntsd_2 = "xr/qo:nF20F2BRm", movntss_2 = "xr/do:F30F2BRm", -- popcnt is also in SSE4.2 } ------------------------------------------------------------------------------ -- Arithmetic ops. for name,n in pairs{ add = 0, ["or"] = 1, adc = 2, sbb = 3, ["and"] = 4, sub = 5, xor = 6, cmp = 7 } do local n8 = shl(n, 3) map_op[name.."_2"] = format( "mr:%02XRm|rm:%02XrM|mI1qdw:81%XmI|mS1qdw:83%XmS|Ri1qdwb:%02Xri|mi1qdwb:81%Xmi", 1+n8, 3+n8, n, n, 5+n8, n) end -- Shift ops. for name,n in pairs{ rol = 0, ror = 1, rcl = 2, rcr = 3, shl = 4, shr = 5, sar = 7, sal = 4 } do map_op[name.."_2"] = format("m1:D1%Xm|mC1qdwb:D3%Xm|mi:C1%XmU", n, n, n) end -- Conditional ops. for cc,n in pairs(map_cc) do map_op["j"..cc.."_1"] = format("J.:n0F8%XJ", n) -- short: 7%X map_op["set"..cc.."_1"] = format("mb:n0F9%X2m", n) map_op["cmov"..cc.."_2"] = format("rmqdw:0F4%XrM", n) -- P6+ end -- FP arithmetic ops. for name,n in pairs{ add = 0, mul = 1, com = 2, comp = 3, sub = 4, subr = 5, div = 6, divr = 7 } do local nc = 0xc0 + shl(n, 3) local nr = nc + (n < 4 and 0 or (n % 2 == 0 and 8 or -8)) local fn = "f"..name map_op[fn.."_1"] = format("ff:D8%02Xr|xd:D8%Xm|xq:nDC%Xm", nc, n, n) if n == 2 or n == 3 then map_op[fn.."_2"] = format("Fff:D8%02XR|Fx2d:D8%XM|Fx2q:nDC%XM", nc, n, n) else map_op[fn.."_2"] = format("Fff:D8%02XR|fFf:DC%02Xr|Fx2d:D8%XM|Fx2q:nDC%XM", nc, nr, n, n) map_op[fn.."p_1"] = format("ff:DE%02Xr", nr) map_op[fn.."p_2"] = format("fFf:DE%02Xr", nr) end map_op["fi"..name.."_1"] = format("xd:DA%Xm|xw:nDE%Xm", n, n) end -- FP conditional moves. for cc,n in pairs{ b=0, e=1, be=2, u=3, nb=4, ne=5, nbe=6, nu=7 } do local nc = 0xdac0 + shl(band(n, 3), 3) + shl(band(n, 4), 6) map_op["fcmov"..cc.."_1"] = format("ff:%04Xr", nc) -- P6+ map_op["fcmov"..cc.."_2"] = format("Fff:%04XR", nc) -- P6+ end -- SSE FP arithmetic ops. for name,n in pairs{ sqrt = 1, add = 8, mul = 9, sub = 12, min = 13, div = 14, max = 15 } do map_op[name.."ps_2"] = format("rmo:0F5%XrM", n) map_op[name.."ss_2"] = format("rro:F30F5%XrM|rx/od:", n) map_op[name.."pd_2"] = format("rmo:660F5%XrM", n) map_op[name.."sd_2"] = format("rro:F20F5%XrM|rx/oq:", n) end ------------------------------------------------------------------------------ -- Process pattern string. local function dopattern(pat, args, sz, op, needrex) local digit, addin local opcode = 0 local szov = sz local narg = 1 local rex = 0 -- Limit number of section buffer positions used by a single dasm_put(). -- A single opcode needs a maximum of 5 positions. if secpos+5 > maxsecpos then wflush() end -- Process each character. for c in gmatch(pat.."|", ".") do if match(c, "%x") then -- Hex digit. digit = byte(c) - 48 if digit > 48 then digit = digit - 39 elseif digit > 16 then digit = digit - 7 end opcode = opcode*16 + digit addin = nil elseif c == "n" then -- Disable operand size mods for opcode. szov = nil elseif c == "X" then -- Force REX.W. rex = 8 elseif c == "r" then -- Merge 1st operand regno. into opcode. addin = args[1]; opcode = opcode + (addin.reg % 8) if narg < 2 then narg = 2 end elseif c == "R" then -- Merge 2nd operand regno. into opcode. addin = args[2]; opcode = opcode + (addin.reg % 8) narg = 3 elseif c == "m" or c == "M" then -- Encode ModRM/SIB. local s, mark_rex = false if addin then s = addin.reg opcode = opcode - band(s, 7) -- Undo regno opcode merge. else s = band(opcode, 15) -- Undo last digit. opcode = shr(opcode, 4) end for i, arg in ipairs(args) do mark_rex = mark_rex or x64 and (arg.vreg or arg.vxreg) end local nn = c == "m" and 1 or 2 local t = args[nn] if narg <= nn then narg = nn + 1 end if szov == "q" and rex == 0 then rex = rex + 8 end if t.reg and t.reg > 7 then rex = rex + 1 end if t.xreg and t.xreg > 7 then rex = rex + 2 end if s > 7 then rex = rex + 4 end if args[1].vreg or (#args > 1 and args[2].vreg) then if t.opsize == "b" then -- vregs with bytes always need a rex to signify that they -- use full registers rather than upper parts of lower -- registers... rex = rex + 64 end end if needrex then rex = rex + 16 end wputop(szov, opcode, rex, mark_rex); opcode = nil -- mark rex if vreg given local imark = sub(pat, -1) -- Force a mark (ugly). -- Put ModRM/SIB with regno/last digit as spare. wputmrmsib(t, imark, s, addin and addin.vreg) addin = nil else if opcode then -- Flush opcode. if szov == "q" and rex == 0 then rex = rex + 8 end if needrex then rex = rex + 16 end if addin and addin.reg == -1 then wputop(szov, opcode - 7, rex, true) waction("VREG", addin.vreg); wputxb(0) else if addin and addin.reg > 7 then rex = rex + 1 end wputop(szov, opcode, rex, false) end opcode = nil end if c == "|" then break end if c == "o" then -- Offset (pure 32 bit displacement). wputdarg(args[1].disp); if narg < 2 then narg = 2 end elseif c == "O" then wputdarg(args[2].disp); narg = 3 else -- Anything else is an immediate operand. local a = args[narg] narg = narg + 1 local mode, imm = a.mode, a.imm if mode == "iJ" and not match("iIJ", c) then werror("bad operand size for label") end if c == "S" then wputsbarg(imm) elseif c == "U" then wputbarg(imm) elseif c == "W" then wputwarg(imm) elseif c == "i" or c == "I" then if mode == "iJ" then wputlabel("IMM_", imm, 1) elseif mode == "iI" and c == "I" then waction(sz == "w" and "IMM_WB" or "IMM_DB", imm) else wputszarg(sz, imm) end elseif c == "J" then if mode == "iPJ" then waction("REL_A", imm) -- !x64 (secpos) else wputlabel("REL_", imm, 2) end else werror("bad char `"..c.."' in pattern `"..pat.."' for `"..op.."'") end end end end end ------------------------------------------------------------------------------ -- Mapping of operand modes to short names. Suppress output with '#'. local map_modename = { r = "reg", R = "eax", C = "cl", x = "mem", m = "mrm", i = "imm", f = "stx", F = "st0", J = "lbl", ["1"] = "1", I = "#", S = "#", O = "#", } -- Return a table/string showing all possible operand modes. local function templatehelp(template, nparams) if nparams == 0 then return "" end local t = {} for tm in gmatch(template, "[^%|]+") do local s = map_modename[sub(tm, 1, 1)] s = s..gsub(sub(tm, 2, nparams), ".", function(c) return ", "..map_modename[c] end) if not match(s, "#") then t[#t+1] = s end end return t end -- Match operand modes against mode match part of template. local function matchtm(tm, args) for i=1,#args do if not match(args[i].mode, sub(tm, i, i)) then return end end return true end -- Handle opcodes defined with template strings. map_op[".template__"] = function(params, template, nparams) if not params then return templatehelp(template, nparams) end local args = {} -- Zero-operand opcodes have no match part. if #params == 0 then dopattern(template, args, "d", params.op, nil) return end -- Determine common operand size (coerce undefined size) or flag as mixed. local sz, szmix, needrex for i,p in ipairs(params) do args[i] = parseoperand(p) local nsz = args[i].opsize if nsz then if sz and sz ~= nsz then szmix = true else sz = nsz end end local nrex = args[i].needrex if nrex ~= nil then if needrex == nil then needrex = nrex elseif needrex ~= nrex then werror("bad mix of byte-addressable registers") end end end -- Try all match:pattern pairs (separated by '|'). local gotmatch, lastpat for tm in gmatch(template, "[^%|]+") do -- Split off size match (starts after mode match) and pattern string. local szm, pat = match(tm, "^(.-):(.*)$", #args+1) if pat == "" then pat = lastpat else lastpat = pat end if matchtm(tm, args) then local prefix = sub(szm, 1, 1) if prefix == "/" then -- Match both operand sizes. if args[1].opsize == sub(szm, 2, 2) and args[2].opsize == sub(szm, 3, 3) then dopattern(pat, args, sz, params.op, needrex) -- Process pattern. return end else -- Match common operand size. local szp = sz if szm == "" then szm = x64 and "qdwb" or "dwb" end -- Default sizes. if prefix == "1" then szp = args[1].opsize; szmix = nil elseif prefix == "2" then szp = args[2].opsize; szmix = nil end if not szmix and (prefix == "." or match(szm, szp or "#")) then dopattern(pat, args, szp, params.op, needrex) -- Process pattern. return end end gotmatch = true end end local msg = "bad operand mode" if gotmatch then if szmix then msg = "mixed operand size" else msg = sz and "bad operand size" or "missing operand size" end end werror(msg.." in `"..opmodestr(params.op, args).."'") end ------------------------------------------------------------------------------ -- x64-specific opcode for 64 bit immediates and displacements. if x64 then function map_op.mov64_2(params) if not params then return { "reg, imm", "reg, [disp]", "[disp], reg" } end if secpos+2 > maxsecpos then wflush() end local opcode, op64, sz, rex, vreg local op64 = match(params[1], "^%[%s*(.-)%s*%]$") if op64 then local a = parseoperand(params[2]) if a.mode ~= "rmR" then werror("bad operand mode") end sz = a.opsize rex = sz == "q" and 8 or 0 opcode = 0xa3 else op64 = match(params[2], "^%[%s*(.-)%s*%]$") local a = parseoperand(params[1]) if op64 then if a.mode ~= "rmR" then werror("bad operand mode") end sz = a.opsize rex = sz == "q" and 8 or 0 opcode = 0xa1 else if sub(a.mode, 1, 1) ~= "r" or a.opsize ~= "q" then werror("bad operand mode") end op64 = params[2] if a.reg == -1 then vreg = a.vreg opcode = 0xb8 else opcode = 0xb8 + band(a.reg, 7) end rex = a.reg > 7 and 9 or 8 end end wputop(sz, opcode, rex, vreg) if vreg then waction("VREG", vreg); wputxb(0) end waction("IMM_D", format("(unsigned int)(%s)", op64)) waction("IMM_D", format("(unsigned int)((%s)>>32)", op64)) end end ------------------------------------------------------------------------------ -- Pseudo-opcodes for data storage. local function op_data(params) if not params then return "imm..." end local sz = sub(params.op, 2, 2) if sz == "a" then sz = addrsize end for _,p in ipairs(params) do local a = parseoperand(p) if sub(a.mode, 1, 1) ~= "i" or (a.opsize and a.opsize ~= sz) then werror("bad mode or size in `"..p.."'") end if a.mode == "iJ" then wputlabel("IMM_", a.imm, 1) else wputszarg(sz, a.imm) end if secpos+2 > maxsecpos then wflush() end end end map_op[".byte_*"] = op_data map_op[".sbyte_*"] = op_data map_op[".word_*"] = op_data map_op[".dword_*"] = op_data map_op[".aword_*"] = op_data ------------------------------------------------------------------------------ -- Pseudo-opcode to mark the position where the action list is to be emitted. map_op[".actionlist_1"] = function(params) if not params then return "cvar" end local name = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeactions(out, name) end) end -- Pseudo-opcode to mark the position where the global enum is to be emitted. map_op[".globals_1"] = function(params) if not params then return "prefix" end local prefix = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeglobals(out, prefix) end) end -- Pseudo-opcode to mark the position where the global names are to be emitted. map_op[".globalnames_1"] = function(params) if not params then return "cvar" end local name = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeglobalnames(out, name) end) end -- Pseudo-opcode to mark the position where the extern names are to be emitted. map_op[".externnames_1"] = function(params) if not params then return "cvar" end local name = params[1] -- No syntax check. You get to keep the pieces. wline(function(out) writeexternnames(out, name) end) end ------------------------------------------------------------------------------ -- Label pseudo-opcode (converted from trailing colon form). map_op[".label_2"] = function(params) if not params then return "[1-9] | ->global | =>pcexpr [, addr]" end if secpos+2 > maxsecpos then wflush() end local a = parseoperand(params[1]) local mode, imm = a.mode, a.imm if type(imm) == "number" and (mode == "iJ" or (imm >= 1 and imm <= 9)) then -- Local label (1: ... 9:) or global label (->global:). waction("LABEL_LG", nil, 1) wputxb(imm) elseif mode == "iJ" then -- PC label (=>pcexpr:). waction("LABEL_PC", imm) else werror("bad label definition") end -- SETLABEL must immediately follow LABEL_LG/LABEL_PC. local addr = params[2] if addr then local a = parseoperand(addr) if a.mode == "iPJ" then waction("SETLABEL", a.imm) else werror("bad label assignment") end end end map_op[".label_1"] = map_op[".label_2"] ------------------------------------------------------------------------------ -- Alignment pseudo-opcode. map_op[".align_1"] = function(params) if not params then return "numpow2" end if secpos+1 > maxsecpos then wflush() end local align = tonumber(params[1]) or map_opsizenum[map_opsize[params[1]]] if align then local x = align -- Must be a power of 2 in the range (2 ... 256). for i=1,8 do x = x / 2 if x == 1 then waction("ALIGN", nil, 1) wputxb(align-1) -- Action byte is 2**n-1. return end end end werror("bad alignment") end -- Spacing pseudo-opcode. map_op[".space_2"] = function(params) if not params then return "num [, filler]" end if secpos+1 > maxsecpos then wflush() end waction("SPACE", params[1]) local fill = params[2] if fill then fill = tonumber(fill) if not fill or fill < 0 or fill > 255 then werror("bad filler") end end wputxb(fill or 0) end map_op[".space_1"] = map_op[".space_2"] ------------------------------------------------------------------------------ -- Pseudo-opcode for (primitive) type definitions (map to C types). map_op[".type_3"] = function(params, nparams) if not params then return nparams == 2 and "name, ctype" or "name, ctype, reg" end local name, ctype, reg = params[1], params[2], params[3] if not match(name, "^[%a_][%w_]*$") then werror("bad type name `"..name.."'") end local tp = map_type[name] if tp then werror("duplicate type `"..name.."'") end if reg and not map_reg_valid_base[reg] then werror("bad base register `"..(map_reg_rev[reg] or reg).."'") end -- Add #type to defines. A bit unclean to put it in map_archdef. map_archdef["#"..name] = "sizeof("..ctype..")" -- Add new type and emit shortcut define. local num = ctypenum + 1 map_type[name] = { ctype = ctype, ctypefmt = format("Dt%X(%%s)", num), reg = reg, } wline(format("#define Dt%X(_V) (int)(ptrdiff_t)&(((%s *)0)_V)", num, ctype)) ctypenum = num end map_op[".type_2"] = map_op[".type_3"] -- Dump type definitions. local function dumptypes(out, lvl) local t = {} for name in pairs(map_type) do t[#t+1] = name end sort(t) out:write("Type definitions:\n") for _,name in ipairs(t) do local tp = map_type[name] local reg = tp.reg and map_reg_rev[tp.reg] or "" out:write(format(" %-20s %-20s %s\n", name, tp.ctype, reg)) end out:write("\n") end ------------------------------------------------------------------------------ -- Set the current section. function _M.section(num) waction("SECTION") wputxb(num) wflush(true) -- SECTION is a terminal action. end ------------------------------------------------------------------------------ -- Dump architecture description. function _M.dumparch(out) out:write(format("DynASM %s version %s, released %s\n\n", _info.arch, _info.version, _info.release)) dumpregs(out) dumpactions(out) end -- Dump all user defined elements. function _M.dumpdef(out, lvl) dumptypes(out, lvl) dumpglobals(out, lvl) dumpexterns(out, lvl) end ------------------------------------------------------------------------------ -- Pass callbacks from/to the DynASM core. function _M.passcb(wl, we, wf, ww) wline, werror, wfatal, wwarn = wl, we, wf, ww return wflush end -- Setup the arch-specific module. function _M.setup(arch, opt) g_arch, g_opt = arch, opt end -- Merge the core maps and the arch-specific maps. function _M.mergemaps(map_coreop, map_def) setmetatable(map_op, { __index = map_coreop }) setmetatable(map_def, { __index = map_archdef }) return map_op, map_def end return _M ------------------------------------------------------------------------------ MoarVM-2018.03/3rdparty/dynasm/dynasm.lua0000644000175000017510000007441513237701103020254 0ustar samanthasamantha------------------------------------------------------------------------------ -- DynASM. A dynamic assembler for code generation engines. -- Originally designed and implemented for LuaJIT. -- -- Copyright (C) 2005-2015 Mike Pall. All rights reserved. -- See below for full copyright notice. ------------------------------------------------------------------------------ -- Application information. local _info = { name = "DynASM", description = "A dynamic assembler for code generation engines", version = "1.3.0", vernum = 10300, release = "2011-05-05", author = "Mike Pall", url = "http://luajit.org/dynasm.html", license = "MIT", copyright = [[ Copyright (C) 2005-2015 Mike Pall. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. [ MIT license: http://www.opensource.org/licenses/mit-license.php ] ]], } -- Cache library functions. local type, pairs, ipairs = type, pairs, ipairs local pcall, error, assert = pcall, error, assert local _s = string local sub, match, gmatch, gsub = _s.sub, _s.match, _s.gmatch, _s.gsub local format, rep, upper = _s.format, _s.rep, _s.upper local _t = table local insert, remove, concat, sort = _t.insert, _t.remove, _t.concat, _t.sort local exit = os.exit local io = io local stdin, stdout, stderr = io.stdin, io.stdout, io.stderr ------------------------------------------------------------------------------ -- Program options. local g_opt = {} -- Global state for current file. local g_fname, g_curline, g_indent, g_lineno, g_synclineno, g_arch local g_errcount = 0 -- Write buffer for output file. local g_wbuffer, g_capbuffer ------------------------------------------------------------------------------ -- Write an output line (or callback function) to the buffer. local function wline(line, needindent) local buf = g_capbuffer or g_wbuffer buf[#buf+1] = needindent and g_indent..line or line g_synclineno = g_synclineno + 1 end -- Write assembler line as a comment, if requestd. local function wcomment(aline) if g_opt.comment then wline(g_opt.comment..aline..g_opt.endcomment, true) end end -- Resync CPP line numbers. local function wsync() if g_synclineno ~= g_lineno and g_opt.cpp then wline("#line "..g_lineno..' "'..g_fname..'"') g_synclineno = g_lineno end end -- Dummy action flush function. Replaced with arch-specific function later. local function wflush(term) end -- Dump all buffered output lines. local function wdumplines(out, buf) for _,line in ipairs(buf) do if type(line) == "string" then assert(out:write(line, "\n")) else -- Special callback to dynamically insert lines after end of processing. line(out) end end end ------------------------------------------------------------------------------ -- Emit an error. Processing continues with next statement. local function werror(msg) error(format("%s:%s: error: %s:\n%s", g_fname, g_lineno, msg, g_curline), 0) end -- Emit a fatal error. Processing stops. local function wfatal(msg) g_errcount = "fatal" werror(msg) end -- Print a warning. Processing continues. local function wwarn(msg) stderr:write(format("%s:%s: warning: %s:\n%s\n", g_fname, g_lineno, msg, g_curline)) end -- Print caught error message. But suppress excessive errors. local function wprinterr(...) if type(g_errcount) == "number" then -- Regular error. g_errcount = g_errcount + 1 if g_errcount < 21 then -- Seems to be a reasonable limit. stderr:write(...) elseif g_errcount == 21 then stderr:write(g_fname, ":*: warning: too many errors (suppressed further messages).\n") end else -- Fatal error. stderr:write(...) return true -- Stop processing. end end ------------------------------------------------------------------------------ -- Map holding all option handlers. local opt_map = {} local opt_current -- Print error and exit with error status. local function opterror(...) stderr:write("dynasm.lua: ERROR: ", ...) stderr:write("\n") exit(1) end -- Get option parameter. local function optparam(args) local argn = args.argn local p = args[argn] if not p then opterror("missing parameter for option `", opt_current, "'.") end args.argn = argn + 1 return p end ------------------------------------------------------------------------------ -- Core pseudo-opcodes. local map_coreop = {} -- Dummy opcode map. Replaced by arch-specific map. local map_op = {} -- Forward declarations. local dostmt local readfile ------------------------------------------------------------------------------ -- Map for defines (initially empty, chains to arch-specific map). local map_def = {} -- Pseudo-opcode to define a substitution. map_coreop[".define_2"] = function(params, nparams) if not params then return nparams == 1 and "name" or "name, subst" end local name, def = params[1], params[2] or "1" if not match(name, "^[%a_][%w_]*$") then werror("bad or duplicate define") end map_def[name] = def end map_coreop[".define_1"] = map_coreop[".define_2"] -- Define a substitution on the command line. function opt_map.D(args) local namesubst = optparam(args) local name, subst = match(namesubst, "^([%a_][%w_]*)=(.*)$") if name then map_def[name] = subst elseif match(namesubst, "^[%a_][%w_]*$") then map_def[namesubst] = "1" else opterror("bad define") end end -- Undefine a substitution on the command line. function opt_map.U(args) local name = optparam(args) if match(name, "^[%a_][%w_]*$") then map_def[name] = nil else opterror("bad define") end end -- Helper for definesubst. local gotsubst local function definesubst_one(word) local subst = map_def[word] if subst then gotsubst = word; return subst else return word end end -- Iteratively substitute defines. local function definesubst(stmt) -- Limit number of iterations. for i=1,100 do gotsubst = false stmt = gsub(stmt, "#?[%w_]+", definesubst_one) if not gotsubst then break end end if gotsubst then wfatal("recursive define involving `"..gotsubst.."'") end return stmt end -- Dump all defines. local function dumpdefines(out, lvl) local t = {} for name in pairs(map_def) do t[#t+1] = name end sort(t) out:write("Defines:\n") for _,name in ipairs(t) do local subst = map_def[name] if g_arch then subst = g_arch.revdef(subst) end out:write(format(" %-20s %s\n", name, subst)) end out:write("\n") end ------------------------------------------------------------------------------ -- Support variables for conditional assembly. local condlevel = 0 local condstack = {} -- Evaluate condition with a Lua expression. Substitutions already performed. local function cond_eval(cond) local func, err if setfenv then func, err = loadstring("return "..cond, "=expr") else -- No globals. All unknown identifiers evaluate to nil. func, err = load("return "..cond, "=expr", "t", {}) end if func then if setfenv then setfenv(func, {}) -- No globals. All unknown identifiers evaluate to nil. end local ok, res = pcall(func) if ok then if res == 0 then return false end -- Oh well. return not not res end err = res end wfatal("bad condition: "..err) end -- Skip statements until next conditional pseudo-opcode at the same level. local function stmtskip() local dostmt_save = dostmt local lvl = 0 dostmt = function(stmt) local op = match(stmt, "^%s*(%S+)") if op == ".if" then lvl = lvl + 1 elseif lvl ~= 0 then if op == ".endif" then lvl = lvl - 1 end elseif op == ".elif" or op == ".else" or op == ".endif" then dostmt = dostmt_save dostmt(stmt) end end end -- Pseudo-opcodes for conditional assembly. map_coreop[".if_1"] = function(params) if not params then return "condition" end local lvl = condlevel + 1 local res = cond_eval(params[1]) condlevel = lvl condstack[lvl] = res if not res then stmtskip() end end map_coreop[".elif_1"] = function(params) if not params then return "condition" end if condlevel == 0 then wfatal(".elif without .if") end local lvl = condlevel local res = condstack[lvl] if res then if res == "else" then wfatal(".elif after .else") end else res = cond_eval(params[1]) if res then condstack[lvl] = res return end end stmtskip() end map_coreop[".else_0"] = function(params) if condlevel == 0 then wfatal(".else without .if") end local lvl = condlevel local res = condstack[lvl] condstack[lvl] = "else" if res then if res == "else" then wfatal(".else after .else") end stmtskip() end end map_coreop[".endif_0"] = function(params) local lvl = condlevel if lvl == 0 then wfatal(".endif without .if") end condlevel = lvl - 1 end -- Check for unfinished conditionals. local function checkconds() if g_errcount ~= "fatal" and condlevel ~= 0 then wprinterr(g_fname, ":*: error: unbalanced conditional\n") end end ------------------------------------------------------------------------------ -- Search for a file in the given path and open it for reading. local function pathopen(path, name) local dirsep = package and match(package.path, "\\") and "\\" or "/" for _,p in ipairs(path) do local fullname = p == "" and name or p..dirsep..name local fin = io.open(fullname, "r") if fin then g_fname = fullname return fin end end end -- Include a file. map_coreop[".include_1"] = function(params) if not params then return "filename" end local name = params[1] -- Save state. Ugly, I know. but upvalues are fast. local gf, gl, gcl, gi = g_fname, g_lineno, g_curline, g_indent -- Read the included file. local fatal = readfile(pathopen(g_opt.include, name) or wfatal("include file `"..name.."' not found")) -- Restore state. g_synclineno = -1 g_fname, g_lineno, g_curline, g_indent = gf, gl, gcl, gi if fatal then wfatal("in include file") end end -- Make .include and conditionals initially available, too. map_op[".include_1"] = map_coreop[".include_1"] map_op[".if_1"] = map_coreop[".if_1"] map_op[".elif_1"] = map_coreop[".elif_1"] map_op[".else_0"] = map_coreop[".else_0"] map_op[".endif_0"] = map_coreop[".endif_0"] ------------------------------------------------------------------------------ -- Support variables for macros. local mac_capture, mac_lineno, mac_name local mac_active = {} local mac_list = {} -- Pseudo-opcode to define a macro. map_coreop[".macro_*"] = function(mparams) if not mparams then return "name [, params...]" end -- Split off and validate macro name. local name = remove(mparams, 1) if not name then werror("missing macro name") end if not (match(name, "^[%a_][%w_%.]*$") or match(name, "^%.[%w_%.]*$")) then wfatal("bad macro name `"..name.."'") end -- Validate macro parameter names. local mdup = {} for _,mp in ipairs(mparams) do if not match(mp, "^[%a_][%w_]*$") then wfatal("bad macro parameter name `"..mp.."'") end if mdup[mp] then wfatal("duplicate macro parameter name `"..mp.."'") end mdup[mp] = true end -- Check for duplicate or recursive macro definitions. local opname = name.."_"..#mparams if map_op[opname] or map_op[name.."_*"] then wfatal("duplicate macro `"..name.."' ("..#mparams.." parameters)") end if mac_capture then wfatal("recursive macro definition") end -- Enable statement capture. local lines = {} mac_lineno = g_lineno mac_name = name mac_capture = function(stmt) -- Statement capture function. -- Stop macro definition with .endmacro pseudo-opcode. if not match(stmt, "^%s*.endmacro%s*$") then lines[#lines+1] = stmt return end mac_capture = nil mac_lineno = nil mac_name = nil mac_list[#mac_list+1] = opname -- Add macro-op definition. map_op[opname] = function(params) if not params then return mparams, lines end -- Protect against recursive macro invocation. if mac_active[opname] then wfatal("recursive macro invocation") end mac_active[opname] = true -- Setup substitution map. local subst = {} for i,mp in ipairs(mparams) do subst[mp] = params[i] end local mcom if g_opt.maccomment and g_opt.comment then mcom = " MACRO "..name.." ("..#mparams..")" wcomment("{"..mcom) end -- Loop through all captured statements for _,stmt in ipairs(lines) do -- Substitute macro parameters. local st = gsub(stmt, "[%w_]+", subst) st = definesubst(st) st = gsub(st, "%s*%.%.%s*", "") -- Token paste a..b. if mcom and sub(st, 1, 1) ~= "|" then wcomment(st) end -- Emit statement. Use a protected call for better diagnostics. local ok, err = pcall(dostmt, st) if not ok then -- Add the captured statement to the error. wprinterr(err, "\n", g_indent, "| ", stmt, "\t[MACRO ", name, " (", #mparams, ")]\n") end end if mcom then wcomment("}"..mcom) end mac_active[opname] = nil end end end -- An .endmacro pseudo-opcode outside of a macro definition is an error. map_coreop[".endmacro_0"] = function(params) wfatal(".endmacro without .macro") end -- Dump all macros and their contents (with -PP only). local function dumpmacros(out, lvl) sort(mac_list) out:write("Macros:\n") for _,opname in ipairs(mac_list) do local name = sub(opname, 1, -3) local params, lines = map_op[opname]() out:write(format(" %-20s %s\n", name, concat(params, ", "))) if lvl > 1 then for _,line in ipairs(lines) do out:write(" |", line, "\n") end out:write("\n") end end out:write("\n") end -- Check for unfinished macro definitions. local function checkmacros() if mac_capture then wprinterr(g_fname, ":", mac_lineno, ": error: unfinished .macro `", mac_name ,"'\n") end end ------------------------------------------------------------------------------ -- Support variables for captures. local cap_lineno, cap_name local cap_buffers = {} local cap_used = {} -- Start a capture. map_coreop[".capture_1"] = function(params) if not params then return "name" end wflush() local name = params[1] if not match(name, "^[%a_][%w_]*$") then wfatal("bad capture name `"..name.."'") end if cap_name then wfatal("already capturing to `"..cap_name.."' since line "..cap_lineno) end cap_name = name cap_lineno = g_lineno -- Create or continue a capture buffer and start the output line capture. local buf = cap_buffers[name] if not buf then buf = {}; cap_buffers[name] = buf end g_capbuffer = buf g_synclineno = 0 end -- Stop a capture. map_coreop[".endcapture_0"] = function(params) wflush() if not cap_name then wfatal(".endcapture without a valid .capture") end cap_name = nil cap_lineno = nil g_capbuffer = nil g_synclineno = 0 end -- Dump a capture buffer. map_coreop[".dumpcapture_1"] = function(params) if not params then return "name" end wflush() local name = params[1] if not match(name, "^[%a_][%w_]*$") then wfatal("bad capture name `"..name.."'") end cap_used[name] = true wline(function(out) local buf = cap_buffers[name] if buf then wdumplines(out, buf) end end) g_synclineno = 0 end -- Dump all captures and their buffers (with -PP only). local function dumpcaptures(out, lvl) out:write("Captures:\n") for name,buf in pairs(cap_buffers) do out:write(format(" %-20s %4s)\n", name, "("..#buf)) if lvl > 1 then local bar = rep("=", 76) out:write(" ", bar, "\n") for _,line in ipairs(buf) do out:write(" ", line, "\n") end out:write(" ", bar, "\n\n") end end out:write("\n") end -- Check for unfinished or unused captures. local function checkcaptures() if cap_name then wprinterr(g_fname, ":", cap_lineno, ": error: unfinished .capture `", cap_name,"'\n") return end for name in pairs(cap_buffers) do if not cap_used[name] then wprinterr(g_fname, ":*: error: missing .dumpcapture ", name ,"\n") end end end ------------------------------------------------------------------------------ -- Sections names. local map_sections = {} -- Pseudo-opcode to define code sections. -- TODO: Data sections, BSS sections. Needs extra C code and API. map_coreop[".section_*"] = function(params) if not params then return "name..." end if #map_sections > 0 then werror("duplicate section definition") end wflush() for sn,name in ipairs(params) do local opname = "."..name.."_0" if not match(name, "^[%a][%w_]*$") or map_op[opname] or map_op["."..name.."_*"] then werror("bad section name `"..name.."'") end map_sections[#map_sections+1] = name wline(format("#define DASM_SECTION_%s\t%d", upper(name), sn-1)) map_op[opname] = function(params) g_arch.section(sn-1) end end wline(format("#define DASM_MAXSECTION\t\t%d", #map_sections)) end -- Dump all sections. local function dumpsections(out, lvl) out:write("Sections:\n") for _,name in ipairs(map_sections) do out:write(format(" %s\n", name)) end out:write("\n") end ------------------------------------------------------------------------------ -- Replacement for customized Lua, which lacks the package library. local prefix = "" if not require then function require(name) local fp = assert(io.open(prefix..name..".lua")) local s = fp:read("*a") assert(fp:close()) return assert(loadstring(s, "@"..name..".lua"))() end end -- Load architecture-specific module. local function loadarch(arch) if not match(arch, "^[%w_]+$") then return "bad arch name" end local ok, m_arch = pcall(require, "dasm_"..arch) if not ok then return "cannot load module: "..m_arch end g_arch = m_arch wflush = m_arch.passcb(wline, werror, wfatal, wwarn) m_arch.setup(arch, g_opt) map_op, map_def = m_arch.mergemaps(map_coreop, map_def) end -- Dump architecture description. function opt_map.dumparch(args) local name = optparam(args) if not g_arch then local err = loadarch(name) if err then opterror(err) end end local t = {} for name in pairs(map_coreop) do t[#t+1] = name end for name in pairs(map_op) do t[#t+1] = name end sort(t) local out = stdout local _arch = g_arch._info out:write(format("%s version %s, released %s, %s\n", _info.name, _info.version, _info.release, _info.url)) g_arch.dumparch(out) local pseudo = true out:write("Pseudo-Opcodes:\n") for _,sname in ipairs(t) do local name, nparam = match(sname, "^(.+)_([0-9%*])$") if name then if pseudo and sub(name, 1, 1) ~= "." then out:write("\nOpcodes:\n") pseudo = false end local f = map_op[sname] local s if nparam ~= "*" then nparam = nparam + 0 end if nparam == 0 then s = "" elseif type(f) == "string" then s = map_op[".template__"](nil, f, nparam) else s = f(nil, nparam) end if type(s) == "table" then for _,s2 in ipairs(s) do out:write(format(" %-12s %s\n", name, s2)) end else out:write(format(" %-12s %s\n", name, s)) end end end out:write("\n") exit(0) end -- Pseudo-opcode to set the architecture. -- Only initially available (map_op is replaced when called). map_op[".arch_1"] = function(params) if not params then return "name" end local err = loadarch(params[1]) if err then wfatal(err) end wline(format("#if DASM_VERSION != %d", _info.vernum)) wline('#error "Version mismatch between DynASM and included encoding engine"') wline("#endif") end -- Dummy .arch pseudo-opcode to improve the error report. map_coreop[".arch_1"] = function(params) if not params then return "name" end wfatal("duplicate .arch statement") end ------------------------------------------------------------------------------ -- Dummy pseudo-opcode. Don't confuse '.nop' with 'nop'. map_coreop[".nop_*"] = function(params) if not params then return "[ignored...]" end end -- Pseudo-opcodes to raise errors. map_coreop[".error_1"] = function(params) if not params then return "message" end werror(params[1]) end map_coreop[".fatal_1"] = function(params) if not params then return "message" end wfatal(params[1]) end -- Dump all user defined elements. local function dumpdef(out) local lvl = g_opt.dumpdef if lvl == 0 then return end dumpsections(out, lvl) dumpdefines(out, lvl) if g_arch then g_arch.dumpdef(out, lvl) end dumpmacros(out, lvl) dumpcaptures(out, lvl) end ------------------------------------------------------------------------------ -- Helper for splitstmt. local splitlvl local function splitstmt_one(c) if c == "(" then splitlvl = ")"..splitlvl elseif c == "[" then splitlvl = "]"..splitlvl elseif c == "{" then splitlvl = "}"..splitlvl elseif c == ")" or c == "]" or c == "}" then if sub(splitlvl, 1, 1) ~= c then werror("unbalanced (), [] or {}") end splitlvl = sub(splitlvl, 2) elseif splitlvl == "" then return " \0 " end return c end -- Split statement into (pseudo-)opcode and params. local function splitstmt(stmt) -- Convert label with trailing-colon into .label statement. local label = match(stmt, "^%s*(.+):%s*$") if label then return ".label", {label} end -- Split at commas and equal signs, but obey parentheses and brackets. splitlvl = "" stmt = gsub(stmt, "[,%(%)%[%]{}]", splitstmt_one) if splitlvl ~= "" then werror("unbalanced () or []") end -- Split off opcode. local op, other = match(stmt, "^%s*([^%s%z]+)%s*(.*)$") if not op then werror("bad statement syntax") end -- Split parameters. local params = {} for p in gmatch(other, "%s*(%Z+)%z?") do params[#params+1] = gsub(p, "%s+$", "") end if #params > 16 then werror("too many parameters") end params.op = op return op, params end -- Process a single statement. dostmt = function(stmt) -- Ignore empty statements. if match(stmt, "^%s*$") then return end -- Capture macro defs before substitution. if mac_capture then return mac_capture(stmt) end stmt = definesubst(stmt) -- Emit C code without parsing the line. if sub(stmt, 1, 1) == "|" then local tail = sub(stmt, 2) wflush() if sub(tail, 1, 2) == "//" then wcomment(tail) else wline(tail, true) end return end -- Split into (pseudo-)opcode and params. local op, params = splitstmt(stmt) -- Get opcode handler (matching # of parameters or generic handler). local f = map_op[op.."_"..#params] or map_op[op.."_*"] if not f then if not g_arch then wfatal("first statement must be .arch") end -- Improve error report. for i=0,9 do if map_op[op.."_"..i] then werror("wrong number of parameters for `"..op.."'") end end werror("unknown statement `"..op.."'") end -- Call opcode handler or special handler for template strings. if type(f) == "string" then map_op[".template__"](params, f) else f(params) end end -- Process a single line. local function doline(line) if g_opt.flushline then wflush() end -- Assembler line? local indent, aline = match(line, "^(%s*)%|(.*)$") if not aline then -- No, plain C code line, need to flush first. wflush() wsync() wline(line, false) return end g_indent = indent -- Remember current line indentation. -- Emit C code (even from macros). Avoids echo and line parsing. if sub(aline, 1, 1) == "|" then if not mac_capture then wsync() elseif g_opt.comment then wsync() wcomment(aline) end dostmt(aline) return end -- Echo assembler line as a comment. if g_opt.comment then wsync() wcomment(aline) end -- Strip assembler comments. aline = gsub(aline, "//.*$", "") -- Split line into statements at semicolons. if match(aline, ";") then for stmt in gmatch(aline, "[^;]+") do dostmt(stmt) end else dostmt(aline) end end ------------------------------------------------------------------------------ -- Write DynASM header. local function dasmhead(out) out:write(format([[ /* ** This file has been pre-processed with DynASM. ** %s ** DynASM version %s, DynASM %s version %s ** DO NOT EDIT! The original file is in "%s". */ ]], _info.url, _info.version, g_arch._info.arch, g_arch._info.version, g_fname)) end -- Read input file. readfile = function(fin) g_indent = "" g_lineno = 0 g_synclineno = -1 -- Process all lines. for line in fin:lines() do g_lineno = g_lineno + 1 g_curline = line local ok, err = pcall(doline, line) if not ok and wprinterr(err, "\n") then return true end end wflush() -- Close input file. assert(fin == stdin or fin:close()) end -- Write output file. local function writefile(outfile) local fout -- Open output file. if outfile == nil or outfile == "-" then fout = stdout else fout = assert(io.open(outfile, "w")) end -- Write all buffered lines wdumplines(fout, g_wbuffer) -- Close output file. assert(fout == stdout or fout:close()) -- Optionally dump definitions. dumpdef(fout == stdout and stderr or stdout) end -- Translate an input file to an output file. local function translate(infile, outfile) g_wbuffer = {} g_indent = "" g_lineno = 0 g_synclineno = -1 -- Put header. wline(dasmhead) -- Read input file. local fin if infile == "-" then g_fname = "(stdin)" fin = stdin else g_fname = infile fin = assert(io.open(infile, "r")) end readfile(fin) -- Check for errors. if not g_arch then wprinterr(g_fname, ":*: error: missing .arch directive\n") end checkconds() checkmacros() checkcaptures() if g_errcount ~= 0 then stderr:write(g_fname, ":*: info: ", g_errcount, " error", (type(g_errcount) == "number" and g_errcount > 1) and "s" or "", " in input file -- no output file generated.\n") dumpdef(stderr) exit(1) end -- Write output file. writefile(outfile) end ------------------------------------------------------------------------------ -- Print help text. function opt_map.help() stdout:write("DynASM -- ", _info.description, ".\n") stdout:write("DynASM ", _info.version, " ", _info.release, " ", _info.url, "\n") stdout:write[[ Usage: dynasm [OPTION]... INFILE.dasc|- -h, --help Display this help text. -V, --version Display version and copyright information. -o, --outfile FILE Output file name (default is stdout). -I, --include DIR Add directory to the include search path. -c, --ccomment Use /* */ comments for assembler lines. -C, --cppcomment Use // comments for assembler lines (default). -N, --nocomment Suppress assembler lines in output. -M, --maccomment Show macro expansions as comments (default off). -L, --nolineno Suppress CPP line number information in output. -F, --flushline Flush action list for every line. -D NAME[=SUBST] Define a substitution. -U NAME Undefine a substitution. -P, --dumpdef Dump defines, macros, etc. Repeat for more output. -A, --dumparch ARCH Load architecture ARCH and dump description. ]] exit(0) end -- Print version information. function opt_map.version() stdout:write(format("%s version %s, released %s\n%s\n\n%s", _info.name, _info.version, _info.release, _info.url, _info.copyright)) exit(0) end -- Misc. options. function opt_map.outfile(args) g_opt.outfile = optparam(args) end function opt_map.include(args) insert(g_opt.include, 1, optparam(args)) end function opt_map.ccomment() g_opt.comment = "/*|"; g_opt.endcomment = " */" end function opt_map.cppcomment() g_opt.comment = "//|"; g_opt.endcomment = "" end function opt_map.nocomment() g_opt.comment = false end function opt_map.maccomment() g_opt.maccomment = true end function opt_map.nolineno() g_opt.cpp = false end function opt_map.flushline() g_opt.flushline = true end function opt_map.dumpdef() g_opt.dumpdef = g_opt.dumpdef + 1 end ------------------------------------------------------------------------------ -- Short aliases for long options. local opt_alias = { h = "help", ["?"] = "help", V = "version", o = "outfile", I = "include", c = "ccomment", C = "cppcomment", N = "nocomment", M = "maccomment", L = "nolineno", F = "flushline", P = "dumpdef", A = "dumparch", } -- Parse single option. local function parseopt(opt, args) opt_current = #opt == 1 and "-"..opt or "--"..opt local f = opt_map[opt] or opt_map[opt_alias[opt]] if not f then opterror("unrecognized option `", opt_current, "'. Try `--help'.\n") end f(args) end -- Parse arguments. local function parseargs(args) -- Default options. g_opt.comment = "//|" g_opt.endcomment = "" g_opt.cpp = true g_opt.dumpdef = 0 g_opt.include = { "" } -- Process all option arguments. args.argn = 1 repeat local a = args[args.argn] if not a then break end local lopt, opt = match(a, "^%-(%-?)(.+)") if not opt then break end args.argn = args.argn + 1 if lopt == "" then -- Loop through short options. for o in gmatch(opt, ".") do parseopt(o, args) end else -- Long option. parseopt(opt, args) end until false -- Check for proper number of arguments. local nargs = #args - args.argn + 1 if nargs ~= 1 then if nargs == 0 then if g_opt.dumpdef > 0 then return dumpdef(stdout) end end opt_map.help() end -- Translate a single input file to a single output file -- TODO: Handle multiple files? translate(args[args.argn], g_opt.outfile) end ------------------------------------------------------------------------------ -- Add the directory dynasm.lua resides in to the Lua module search path. local arg = arg if arg and arg[0] then prefix = match(arg[0], "^(.*[/\\])") if package and prefix then package.path = prefix.."?.lua;"..package.path end end -- Start DynASM. parseargs{...} ------------------------------------------------------------------------------ MoarVM-2018.03/3rdparty/dynasm/minilua.c0000644000175000017510000052443413237701235020067 0ustar samanthasamantha/* This is a heavily customized and minimized copy of Lua 5.1.5. */ /* It's only used to build LuaJIT. It does NOT have all standard functions! */ /****************************************************************************** * Copyright (C) 1994-2012 Lua.org, PUC-Rio. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ******************************************************************************/ #ifdef _MSC_VER typedef unsigned __int64 U64; #else typedef unsigned long long U64; #endif int _CRT_glob = 0; #include #include #include #include #include #include #include #include #include #include #include typedef enum{ TM_INDEX, TM_NEWINDEX, TM_GC, TM_MODE, TM_EQ, TM_ADD, TM_SUB, TM_MUL, TM_DIV, TM_MOD, TM_POW, TM_UNM, TM_LEN, TM_LT, TM_LE, TM_CONCAT, TM_CALL, TM_N }TMS; enum OpMode{iABC,iABx,iAsBx}; typedef enum{ OP_MOVE, OP_LOADK, OP_LOADBOOL, OP_LOADNIL, OP_GETUPVAL, OP_GETGLOBAL, OP_GETTABLE, OP_SETGLOBAL, OP_SETUPVAL, OP_SETTABLE, OP_NEWTABLE, OP_SELF, OP_ADD, OP_SUB, OP_MUL, OP_DIV, OP_MOD, OP_POW, OP_UNM, OP_NOT, OP_LEN, OP_CONCAT, OP_JMP, OP_EQ, OP_LT, OP_LE, OP_TEST, OP_TESTSET, OP_CALL, OP_TAILCALL, OP_RETURN, OP_FORLOOP, OP_FORPREP, OP_TFORLOOP, OP_SETLIST, OP_CLOSE, OP_CLOSURE, OP_VARARG }OpCode; enum OpArgMask{ OpArgN, OpArgU, OpArgR, OpArgK }; typedef enum{ VVOID, VNIL, VTRUE, VFALSE, VK, VKNUM, VLOCAL, VUPVAL, VGLOBAL, VINDEXED, VJMP, VRELOCABLE, VNONRELOC, VCALL, VVARARG }expkind; enum RESERVED{ TK_AND=257,TK_BREAK, TK_DO,TK_ELSE,TK_ELSEIF,TK_END,TK_FALSE,TK_FOR,TK_FUNCTION, TK_IF,TK_IN,TK_LOCAL,TK_NIL,TK_NOT,TK_OR,TK_REPEAT, TK_RETURN,TK_THEN,TK_TRUE,TK_UNTIL,TK_WHILE, TK_CONCAT,TK_DOTS,TK_EQ,TK_GE,TK_LE,TK_NE,TK_NUMBER, TK_NAME,TK_STRING,TK_EOS }; typedef enum BinOpr{ OPR_ADD,OPR_SUB,OPR_MUL,OPR_DIV,OPR_MOD,OPR_POW, OPR_CONCAT, OPR_NE,OPR_EQ, OPR_LT,OPR_LE,OPR_GT,OPR_GE, OPR_AND,OPR_OR, OPR_NOBINOPR }BinOpr; typedef enum UnOpr{OPR_MINUS,OPR_NOT,OPR_LEN,OPR_NOUNOPR}UnOpr; #define LUA_QL(x)"'"x"'" #define luai_apicheck(L,o){(void)L;} #define lua_number2str(s,n)sprintf((s),"%.14g",(n)) #define lua_str2number(s,p)strtod((s),(p)) #define luai_numadd(a,b)((a)+(b)) #define luai_numsub(a,b)((a)-(b)) #define luai_nummul(a,b)((a)*(b)) #define luai_numdiv(a,b)((a)/(b)) #define luai_nummod(a,b)((a)-floor((a)/(b))*(b)) #define luai_numpow(a,b)(pow(a,b)) #define luai_numunm(a)(-(a)) #define luai_numeq(a,b)((a)==(b)) #define luai_numlt(a,b)((a)<(b)) #define luai_numle(a,b)((a)<=(b)) #define luai_numisnan(a)(!luai_numeq((a),(a))) #define lua_number2int(i,d)((i)=(int)(d)) #define lua_number2integer(i,d)((i)=(lua_Integer)(d)) #define LUAI_THROW(L,c)longjmp((c)->b,1) #define LUAI_TRY(L,c,a)if(setjmp((c)->b)==0){a} #define lua_pclose(L,file)((void)((void)L,file),0) #define lua_upvalueindex(i)((-10002)-(i)) typedef struct lua_State lua_State; typedef int(*lua_CFunction)(lua_State*L); typedef const char*(*lua_Reader)(lua_State*L,void*ud,size_t*sz); typedef void*(*lua_Alloc)(void*ud,void*ptr,size_t osize,size_t nsize); typedef double lua_Number; typedef ptrdiff_t lua_Integer; static void lua_settop(lua_State*L,int idx); static int lua_type(lua_State*L,int idx); static const char* lua_tolstring(lua_State*L,int idx,size_t*len); static size_t lua_objlen(lua_State*L,int idx); static void lua_pushlstring(lua_State*L,const char*s,size_t l); static void lua_pushcclosure(lua_State*L,lua_CFunction fn,int n); static void lua_createtable(lua_State*L,int narr,int nrec); static void lua_setfield(lua_State*L,int idx,const char*k); #define lua_pop(L,n)lua_settop(L,-(n)-1) #define lua_newtable(L)lua_createtable(L,0,0) #define lua_pushcfunction(L,f)lua_pushcclosure(L,(f),0) #define lua_strlen(L,i)lua_objlen(L,(i)) #define lua_isfunction(L,n)(lua_type(L,(n))==6) #define lua_istable(L,n)(lua_type(L,(n))==5) #define lua_isnil(L,n)(lua_type(L,(n))==0) #define lua_isboolean(L,n)(lua_type(L,(n))==1) #define lua_isnone(L,n)(lua_type(L,(n))==(-1)) #define lua_isnoneornil(L,n)(lua_type(L,(n))<=0) #define lua_pushliteral(L,s)lua_pushlstring(L,""s,(sizeof(s)/sizeof(char))-1) #define lua_setglobal(L,s)lua_setfield(L,(-10002),(s)) #define lua_tostring(L,i)lua_tolstring(L,(i),NULL) typedef struct lua_Debug lua_Debug; typedef void(*lua_Hook)(lua_State*L,lua_Debug*ar); struct lua_Debug{ int event; const char*name; const char*namewhat; const char*what; const char*source; int currentline; int nups; int linedefined; int lastlinedefined; char short_src[60]; int i_ci; }; typedef unsigned int lu_int32; typedef size_t lu_mem; typedef ptrdiff_t l_mem; typedef unsigned char lu_byte; #define IntPoint(p)((unsigned int)(lu_mem)(p)) typedef union{double u;void*s;long l;}L_Umaxalign; typedef double l_uacNumber; #define check_exp(c,e)(e) #define UNUSED(x)((void)(x)) #define cast(t,exp)((t)(exp)) #define cast_byte(i)cast(lu_byte,(i)) #define cast_num(i)cast(lua_Number,(i)) #define cast_int(i)cast(int,(i)) typedef lu_int32 Instruction; #define condhardstacktests(x)((void)0) typedef union GCObject GCObject; typedef struct GCheader{ GCObject*next;lu_byte tt;lu_byte marked; }GCheader; typedef union{ GCObject*gc; void*p; lua_Number n; int b; }Value; typedef struct lua_TValue{ Value value;int tt; }TValue; #define ttisnil(o)(ttype(o)==0) #define ttisnumber(o)(ttype(o)==3) #define ttisstring(o)(ttype(o)==4) #define ttistable(o)(ttype(o)==5) #define ttisfunction(o)(ttype(o)==6) #define ttisboolean(o)(ttype(o)==1) #define ttisuserdata(o)(ttype(o)==7) #define ttisthread(o)(ttype(o)==8) #define ttislightuserdata(o)(ttype(o)==2) #define ttype(o)((o)->tt) #define gcvalue(o)check_exp(iscollectable(o),(o)->value.gc) #define pvalue(o)check_exp(ttislightuserdata(o),(o)->value.p) #define nvalue(o)check_exp(ttisnumber(o),(o)->value.n) #define rawtsvalue(o)check_exp(ttisstring(o),&(o)->value.gc->ts) #define tsvalue(o)(&rawtsvalue(o)->tsv) #define rawuvalue(o)check_exp(ttisuserdata(o),&(o)->value.gc->u) #define uvalue(o)(&rawuvalue(o)->uv) #define clvalue(o)check_exp(ttisfunction(o),&(o)->value.gc->cl) #define hvalue(o)check_exp(ttistable(o),&(o)->value.gc->h) #define bvalue(o)check_exp(ttisboolean(o),(o)->value.b) #define thvalue(o)check_exp(ttisthread(o),&(o)->value.gc->th) #define l_isfalse(o)(ttisnil(o)||(ttisboolean(o)&&bvalue(o)==0)) #define checkconsistency(obj) #define checkliveness(g,obj) #define setnilvalue(obj)((obj)->tt=0) #define setnvalue(obj,x){TValue*i_o=(obj);i_o->value.n=(x);i_o->tt=3;} #define setbvalue(obj,x){TValue*i_o=(obj);i_o->value.b=(x);i_o->tt=1;} #define setsvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=4;checkliveness(G(L),i_o);} #define setuvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=7;checkliveness(G(L),i_o);} #define setthvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=8;checkliveness(G(L),i_o);} #define setclvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=6;checkliveness(G(L),i_o);} #define sethvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=5;checkliveness(G(L),i_o);} #define setptvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=(8+1);checkliveness(G(L),i_o);} #define setobj(L,obj1,obj2){const TValue*o2=(obj2);TValue*o1=(obj1);o1->value=o2->value;o1->tt=o2->tt;checkliveness(G(L),o1);} #define setttype(obj,tt)(ttype(obj)=(tt)) #define iscollectable(o)(ttype(o)>=4) typedef TValue*StkId; typedef union TString{ L_Umaxalign dummy; struct{ GCObject*next;lu_byte tt;lu_byte marked; lu_byte reserved; unsigned int hash; size_t len; }tsv; }TString; #define getstr(ts)cast(const char*,(ts)+1) #define svalue(o)getstr(rawtsvalue(o)) typedef union Udata{ L_Umaxalign dummy; struct{ GCObject*next;lu_byte tt;lu_byte marked; struct Table*metatable; struct Table*env; size_t len; }uv; }Udata; typedef struct Proto{ GCObject*next;lu_byte tt;lu_byte marked; TValue*k; Instruction*code; struct Proto**p; int*lineinfo; struct LocVar*locvars; TString**upvalues; TString*source; int sizeupvalues; int sizek; int sizecode; int sizelineinfo; int sizep; int sizelocvars; int linedefined; int lastlinedefined; GCObject*gclist; lu_byte nups; lu_byte numparams; lu_byte is_vararg; lu_byte maxstacksize; }Proto; typedef struct LocVar{ TString*varname; int startpc; int endpc; }LocVar; typedef struct UpVal{ GCObject*next;lu_byte tt;lu_byte marked; TValue*v; union{ TValue value; struct{ struct UpVal*prev; struct UpVal*next; }l; }u; }UpVal; typedef struct CClosure{ GCObject*next;lu_byte tt;lu_byte marked;lu_byte isC;lu_byte nupvalues;GCObject*gclist;struct Table*env; lua_CFunction f; TValue upvalue[1]; }CClosure; typedef struct LClosure{ GCObject*next;lu_byte tt;lu_byte marked;lu_byte isC;lu_byte nupvalues;GCObject*gclist;struct Table*env; struct Proto*p; UpVal*upvals[1]; }LClosure; typedef union Closure{ CClosure c; LClosure l; }Closure; #define iscfunction(o)(ttype(o)==6&&clvalue(o)->c.isC) typedef union TKey{ struct{ Value value;int tt; struct Node*next; }nk; TValue tvk; }TKey; typedef struct Node{ TValue i_val; TKey i_key; }Node; typedef struct Table{ GCObject*next;lu_byte tt;lu_byte marked; lu_byte flags; lu_byte lsizenode; struct Table*metatable; TValue*array; Node*node; Node*lastfree; GCObject*gclist; int sizearray; }Table; #define lmod(s,size)(check_exp((size&(size-1))==0,(cast(int,(s)&((size)-1))))) #define twoto(x)((size_t)1<<(x)) #define sizenode(t)(twoto((t)->lsizenode)) static const TValue luaO_nilobject_; #define ceillog2(x)(luaO_log2((x)-1)+1) static int luaO_log2(unsigned int x); #define gfasttm(g,et,e)((et)==NULL?NULL:((et)->flags&(1u<<(e)))?NULL:luaT_gettm(et,e,(g)->tmname[e])) #define fasttm(l,et,e)gfasttm(G(l),et,e) static const TValue*luaT_gettm(Table*events,TMS event,TString*ename); #define luaM_reallocv(L,b,on,n,e)((cast(size_t,(n)+1)<=((size_t)(~(size_t)0)-2)/(e))?luaM_realloc_(L,(b),(on)*(e),(n)*(e)):luaM_toobig(L)) #define luaM_freemem(L,b,s)luaM_realloc_(L,(b),(s),0) #define luaM_free(L,b)luaM_realloc_(L,(b),sizeof(*(b)),0) #define luaM_freearray(L,b,n,t)luaM_reallocv(L,(b),n,0,sizeof(t)) #define luaM_malloc(L,t)luaM_realloc_(L,NULL,0,(t)) #define luaM_new(L,t)cast(t*,luaM_malloc(L,sizeof(t))) #define luaM_newvector(L,n,t)cast(t*,luaM_reallocv(L,NULL,0,n,sizeof(t))) #define luaM_growvector(L,v,nelems,size,t,limit,e)if((nelems)+1>(size))((v)=cast(t*,luaM_growaux_(L,v,&(size),sizeof(t),limit,e))) #define luaM_reallocvector(L,v,oldn,n,t)((v)=cast(t*,luaM_reallocv(L,v,oldn,n,sizeof(t)))) static void*luaM_realloc_(lua_State*L,void*block,size_t oldsize, size_t size); static void*luaM_toobig(lua_State*L); static void*luaM_growaux_(lua_State*L,void*block,int*size, size_t size_elem,int limit, const char*errormsg); typedef struct Zio ZIO; #define char2int(c)cast(int,cast(unsigned char,(c))) #define zgetc(z)(((z)->n--)>0?char2int(*(z)->p++):luaZ_fill(z)) typedef struct Mbuffer{ char*buffer; size_t n; size_t buffsize; }Mbuffer; #define luaZ_initbuffer(L,buff)((buff)->buffer=NULL,(buff)->buffsize=0) #define luaZ_buffer(buff)((buff)->buffer) #define luaZ_sizebuffer(buff)((buff)->buffsize) #define luaZ_bufflen(buff)((buff)->n) #define luaZ_resetbuffer(buff)((buff)->n=0) #define luaZ_resizebuffer(L,buff,size)(luaM_reallocvector(L,(buff)->buffer,(buff)->buffsize,size,char),(buff)->buffsize=size) #define luaZ_freebuffer(L,buff)luaZ_resizebuffer(L,buff,0) struct Zio{ size_t n; const char*p; lua_Reader reader; void*data; lua_State*L; }; static int luaZ_fill(ZIO*z); struct lua_longjmp; #define gt(L)(&L->l_gt) #define registry(L)(&G(L)->l_registry) typedef struct stringtable{ GCObject**hash; lu_int32 nuse; int size; }stringtable; typedef struct CallInfo{ StkId base; StkId func; StkId top; const Instruction*savedpc; int nresults; int tailcalls; }CallInfo; #define curr_func(L)(clvalue(L->ci->func)) #define ci_func(ci)(clvalue((ci)->func)) #define f_isLua(ci)(!ci_func(ci)->c.isC) #define isLua(ci)(ttisfunction((ci)->func)&&f_isLua(ci)) typedef struct global_State{ stringtable strt; lua_Alloc frealloc; void*ud; lu_byte currentwhite; lu_byte gcstate; int sweepstrgc; GCObject*rootgc; GCObject**sweepgc; GCObject*gray; GCObject*grayagain; GCObject*weak; GCObject*tmudata; Mbuffer buff; lu_mem GCthreshold; lu_mem totalbytes; lu_mem estimate; lu_mem gcdept; int gcpause; int gcstepmul; lua_CFunction panic; TValue l_registry; struct lua_State*mainthread; UpVal uvhead; struct Table*mt[(8+1)]; TString*tmname[TM_N]; }global_State; struct lua_State{ GCObject*next;lu_byte tt;lu_byte marked; lu_byte status; StkId top; StkId base; global_State*l_G; CallInfo*ci; const Instruction*savedpc; StkId stack_last; StkId stack; CallInfo*end_ci; CallInfo*base_ci; int stacksize; int size_ci; unsigned short nCcalls; unsigned short baseCcalls; lu_byte hookmask; lu_byte allowhook; int basehookcount; int hookcount; lua_Hook hook; TValue l_gt; TValue env; GCObject*openupval; GCObject*gclist; struct lua_longjmp*errorJmp; ptrdiff_t errfunc; }; #define G(L)(L->l_G) union GCObject{ GCheader gch; union TString ts; union Udata u; union Closure cl; struct Table h; struct Proto p; struct UpVal uv; struct lua_State th; }; #define rawgco2ts(o)check_exp((o)->gch.tt==4,&((o)->ts)) #define gco2ts(o)(&rawgco2ts(o)->tsv) #define rawgco2u(o)check_exp((o)->gch.tt==7,&((o)->u)) #define gco2u(o)(&rawgco2u(o)->uv) #define gco2cl(o)check_exp((o)->gch.tt==6,&((o)->cl)) #define gco2h(o)check_exp((o)->gch.tt==5,&((o)->h)) #define gco2p(o)check_exp((o)->gch.tt==(8+1),&((o)->p)) #define gco2uv(o)check_exp((o)->gch.tt==(8+2),&((o)->uv)) #define ngcotouv(o)check_exp((o)==NULL||(o)->gch.tt==(8+2),&((o)->uv)) #define gco2th(o)check_exp((o)->gch.tt==8,&((o)->th)) #define obj2gco(v)(cast(GCObject*,(v))) static void luaE_freethread(lua_State*L,lua_State*L1); #define pcRel(pc,p)(cast(int,(pc)-(p)->code)-1) #define getline_(f,pc)(((f)->lineinfo)?(f)->lineinfo[pc]:0) #define resethookcount(L)(L->hookcount=L->basehookcount) static void luaG_typeerror(lua_State*L,const TValue*o, const char*opname); static void luaG_runerror(lua_State*L,const char*fmt,...); #define luaD_checkstack(L,n)if((char*)L->stack_last-(char*)L->top<=(n)*(int)sizeof(TValue))luaD_growstack(L,n);else condhardstacktests(luaD_reallocstack(L,L->stacksize-5-1)); #define incr_top(L){luaD_checkstack(L,1);L->top++;} #define savestack(L,p)((char*)(p)-(char*)L->stack) #define restorestack(L,n)((TValue*)((char*)L->stack+(n))) #define saveci(L,p)((char*)(p)-(char*)L->base_ci) #define restoreci(L,n)((CallInfo*)((char*)L->base_ci+(n))) typedef void(*Pfunc)(lua_State*L,void*ud); static int luaD_poscall(lua_State*L,StkId firstResult); static void luaD_reallocCI(lua_State*L,int newsize); static void luaD_reallocstack(lua_State*L,int newsize); static void luaD_growstack(lua_State*L,int n); static void luaD_throw(lua_State*L,int errcode); static void*luaM_growaux_(lua_State*L,void*block,int*size,size_t size_elems, int limit,const char*errormsg){ void*newblock; int newsize; if(*size>=limit/2){ if(*size>=limit) luaG_runerror(L,errormsg); newsize=limit; } else{ newsize=(*size)*2; if(newsize<4) newsize=4; } newblock=luaM_reallocv(L,block,*size,newsize,size_elems); *size=newsize; return newblock; } static void*luaM_toobig(lua_State*L){ luaG_runerror(L,"memory allocation error: block too big"); return NULL; } static void*luaM_realloc_(lua_State*L,void*block,size_t osize,size_t nsize){ global_State*g=G(L); block=(*g->frealloc)(g->ud,block,osize,nsize); if(block==NULL&&nsize>0) luaD_throw(L,4); g->totalbytes=(g->totalbytes-osize)+nsize; return block; } #define resetbits(x,m)((x)&=cast(lu_byte,~(m))) #define setbits(x,m)((x)|=(m)) #define testbits(x,m)((x)&(m)) #define bitmask(b)(1<<(b)) #define bit2mask(b1,b2)(bitmask(b1)|bitmask(b2)) #define l_setbit(x,b)setbits(x,bitmask(b)) #define resetbit(x,b)resetbits(x,bitmask(b)) #define testbit(x,b)testbits(x,bitmask(b)) #define set2bits(x,b1,b2)setbits(x,(bit2mask(b1,b2))) #define reset2bits(x,b1,b2)resetbits(x,(bit2mask(b1,b2))) #define test2bits(x,b1,b2)testbits(x,(bit2mask(b1,b2))) #define iswhite(x)test2bits((x)->gch.marked,0,1) #define isblack(x)testbit((x)->gch.marked,2) #define isgray(x)(!isblack(x)&&!iswhite(x)) #define otherwhite(g)(g->currentwhite^bit2mask(0,1)) #define isdead(g,v)((v)->gch.marked&otherwhite(g)&bit2mask(0,1)) #define changewhite(x)((x)->gch.marked^=bit2mask(0,1)) #define gray2black(x)l_setbit((x)->gch.marked,2) #define valiswhite(x)(iscollectable(x)&&iswhite(gcvalue(x))) #define luaC_white(g)cast(lu_byte,(g)->currentwhite&bit2mask(0,1)) #define luaC_checkGC(L){condhardstacktests(luaD_reallocstack(L,L->stacksize-5-1));if(G(L)->totalbytes>=G(L)->GCthreshold)luaC_step(L);} #define luaC_barrier(L,p,v){if(valiswhite(v)&&isblack(obj2gco(p)))luaC_barrierf(L,obj2gco(p),gcvalue(v));} #define luaC_barriert(L,t,v){if(valiswhite(v)&&isblack(obj2gco(t)))luaC_barrierback(L,t);} #define luaC_objbarrier(L,p,o){if(iswhite(obj2gco(o))&&isblack(obj2gco(p)))luaC_barrierf(L,obj2gco(p),obj2gco(o));} #define luaC_objbarriert(L,t,o){if(iswhite(obj2gco(o))&&isblack(obj2gco(t)))luaC_barrierback(L,t);} static void luaC_step(lua_State*L); static void luaC_link(lua_State*L,GCObject*o,lu_byte tt); static void luaC_linkupval(lua_State*L,UpVal*uv); static void luaC_barrierf(lua_State*L,GCObject*o,GCObject*v); static void luaC_barrierback(lua_State*L,Table*t); #define sizestring(s)(sizeof(union TString)+((s)->len+1)*sizeof(char)) #define sizeudata(u)(sizeof(union Udata)+(u)->len) #define luaS_new(L,s)(luaS_newlstr(L,s,strlen(s))) #define luaS_newliteral(L,s)(luaS_newlstr(L,""s,(sizeof(s)/sizeof(char))-1)) #define luaS_fix(s)l_setbit((s)->tsv.marked,5) static TString*luaS_newlstr(lua_State*L,const char*str,size_t l); #define tostring(L,o)((ttype(o)==4)||(luaV_tostring(L,o))) #define tonumber(o,n)(ttype(o)==3||(((o)=luaV_tonumber(o,n))!=NULL)) #define equalobj(L,o1,o2)(ttype(o1)==ttype(o2)&&luaV_equalval(L,o1,o2)) static int luaV_equalval(lua_State*L,const TValue*t1,const TValue*t2); static const TValue*luaV_tonumber(const TValue*obj,TValue*n); static int luaV_tostring(lua_State*L,StkId obj); static void luaV_execute(lua_State*L,int nexeccalls); static void luaV_concat(lua_State*L,int total,int last); static const TValue luaO_nilobject_={{NULL},0}; static int luaO_int2fb(unsigned int x){ int e=0; while(x>=16){ x=(x+1)>>1; e++; } if(x<8)return x; else return((e+1)<<3)|(cast_int(x)-8); } static int luaO_fb2int(int x){ int e=(x>>3)&31; if(e==0)return x; else return((x&7)+8)<<(e-1); } static int luaO_log2(unsigned int x){ static const lu_byte log_2[256]={ 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 }; int l=-1; while(x>=256){l+=8;x>>=8;} return l+log_2[x]; } static int luaO_rawequalObj(const TValue*t1,const TValue*t2){ if(ttype(t1)!=ttype(t2))return 0; else switch(ttype(t1)){ case 0: return 1; case 3: return luai_numeq(nvalue(t1),nvalue(t2)); case 1: return bvalue(t1)==bvalue(t2); case 2: return pvalue(t1)==pvalue(t2); default: return gcvalue(t1)==gcvalue(t2); } } static int luaO_str2d(const char*s,lua_Number*result){ char*endptr; *result=lua_str2number(s,&endptr); if(endptr==s)return 0; if(*endptr=='x'||*endptr=='X') *result=cast_num(strtoul(s,&endptr,16)); if(*endptr=='\0')return 1; while(isspace(cast(unsigned char,*endptr)))endptr++; if(*endptr!='\0')return 0; return 1; } static void pushstr(lua_State*L,const char*str){ setsvalue(L,L->top,luaS_new(L,str)); incr_top(L); } static const char*luaO_pushvfstring(lua_State*L,const char*fmt,va_list argp){ int n=1; pushstr(L,""); for(;;){ const char*e=strchr(fmt,'%'); if(e==NULL)break; setsvalue(L,L->top,luaS_newlstr(L,fmt,e-fmt)); incr_top(L); switch(*(e+1)){ case's':{ const char*s=va_arg(argp,char*); if(s==NULL)s="(null)"; pushstr(L,s); break; } case'c':{ char buff[2]; buff[0]=cast(char,va_arg(argp,int)); buff[1]='\0'; pushstr(L,buff); break; } case'd':{ setnvalue(L->top,cast_num(va_arg(argp,int))); incr_top(L); break; } case'f':{ setnvalue(L->top,cast_num(va_arg(argp,l_uacNumber))); incr_top(L); break; } case'p':{ char buff[4*sizeof(void*)+8]; sprintf(buff,"%p",va_arg(argp,void*)); pushstr(L,buff); break; } case'%':{ pushstr(L,"%"); break; } default:{ char buff[3]; buff[0]='%'; buff[1]=*(e+1); buff[2]='\0'; pushstr(L,buff); break; } } n+=2; fmt=e+2; } pushstr(L,fmt); luaV_concat(L,n+1,cast_int(L->top-L->base)-1); L->top-=n; return svalue(L->top-1); } static const char*luaO_pushfstring(lua_State*L,const char*fmt,...){ const char*msg; va_list argp; va_start(argp,fmt); msg=luaO_pushvfstring(L,fmt,argp); va_end(argp); return msg; } static void luaO_chunkid(char*out,const char*source,size_t bufflen){ if(*source=='='){ strncpy(out,source+1,bufflen); out[bufflen-1]='\0'; } else{ if(*source=='@'){ size_t l; source++; bufflen-=sizeof(" '...' "); l=strlen(source); strcpy(out,""); if(l>bufflen){ source+=(l-bufflen); strcat(out,"..."); } strcat(out,source); } else{ size_t len=strcspn(source,"\n\r"); bufflen-=sizeof(" [string \"...\"] "); if(len>bufflen)len=bufflen; strcpy(out,"[string \""); if(source[len]!='\0'){ strncat(out,source,len); strcat(out,"..."); } else strcat(out,source); strcat(out,"\"]"); } } } #define gnode(t,i)(&(t)->node[i]) #define gkey(n)(&(n)->i_key.nk) #define gval(n)(&(n)->i_val) #define gnext(n)((n)->i_key.nk.next) #define key2tval(n)(&(n)->i_key.tvk) static TValue*luaH_setnum(lua_State*L,Table*t,int key); static const TValue*luaH_getstr(Table*t,TString*key); static TValue*luaH_set(lua_State*L,Table*t,const TValue*key); static const char*const luaT_typenames[]={ "nil","boolean","userdata","number", "string","table","function","userdata","thread", "proto","upval" }; static void luaT_init(lua_State*L){ static const char*const luaT_eventname[]={ "__index","__newindex", "__gc","__mode","__eq", "__add","__sub","__mul","__div","__mod", "__pow","__unm","__len","__lt","__le", "__concat","__call" }; int i; for(i=0;itmname[i]=luaS_new(L,luaT_eventname[i]); luaS_fix(G(L)->tmname[i]); } } static const TValue*luaT_gettm(Table*events,TMS event,TString*ename){ const TValue*tm=luaH_getstr(events,ename); if(ttisnil(tm)){ events->flags|=cast_byte(1u<metatable; break; case 7: mt=uvalue(o)->metatable; break; default: mt=G(L)->mt[ttype(o)]; } return(mt?luaH_getstr(mt,G(L)->tmname[event]):(&luaO_nilobject_)); } #define sizeCclosure(n)(cast(int,sizeof(CClosure))+cast(int,sizeof(TValue)*((n)-1))) #define sizeLclosure(n)(cast(int,sizeof(LClosure))+cast(int,sizeof(TValue*)*((n)-1))) static Closure*luaF_newCclosure(lua_State*L,int nelems,Table*e){ Closure*c=cast(Closure*,luaM_malloc(L,sizeCclosure(nelems))); luaC_link(L,obj2gco(c),6); c->c.isC=1; c->c.env=e; c->c.nupvalues=cast_byte(nelems); return c; } static Closure*luaF_newLclosure(lua_State*L,int nelems,Table*e){ Closure*c=cast(Closure*,luaM_malloc(L,sizeLclosure(nelems))); luaC_link(L,obj2gco(c),6); c->l.isC=0; c->l.env=e; c->l.nupvalues=cast_byte(nelems); while(nelems--)c->l.upvals[nelems]=NULL; return c; } static UpVal*luaF_newupval(lua_State*L){ UpVal*uv=luaM_new(L,UpVal); luaC_link(L,obj2gco(uv),(8+2)); uv->v=&uv->u.value; setnilvalue(uv->v); return uv; } static UpVal*luaF_findupval(lua_State*L,StkId level){ global_State*g=G(L); GCObject**pp=&L->openupval; UpVal*p; UpVal*uv; while(*pp!=NULL&&(p=ngcotouv(*pp))->v>=level){ if(p->v==level){ if(isdead(g,obj2gco(p))) changewhite(obj2gco(p)); return p; } pp=&p->next; } uv=luaM_new(L,UpVal); uv->tt=(8+2); uv->marked=luaC_white(g); uv->v=level; uv->next=*pp; *pp=obj2gco(uv); uv->u.l.prev=&g->uvhead; uv->u.l.next=g->uvhead.u.l.next; uv->u.l.next->u.l.prev=uv; g->uvhead.u.l.next=uv; return uv; } static void unlinkupval(UpVal*uv){ uv->u.l.next->u.l.prev=uv->u.l.prev; uv->u.l.prev->u.l.next=uv->u.l.next; } static void luaF_freeupval(lua_State*L,UpVal*uv){ if(uv->v!=&uv->u.value) unlinkupval(uv); luaM_free(L,uv); } static void luaF_close(lua_State*L,StkId level){ UpVal*uv; global_State*g=G(L); while(L->openupval!=NULL&&(uv=ngcotouv(L->openupval))->v>=level){ GCObject*o=obj2gco(uv); L->openupval=uv->next; if(isdead(g,o)) luaF_freeupval(L,uv); else{ unlinkupval(uv); setobj(L,&uv->u.value,uv->v); uv->v=&uv->u.value; luaC_linkupval(L,uv); } } } static Proto*luaF_newproto(lua_State*L){ Proto*f=luaM_new(L,Proto); luaC_link(L,obj2gco(f),(8+1)); f->k=NULL; f->sizek=0; f->p=NULL; f->sizep=0; f->code=NULL; f->sizecode=0; f->sizelineinfo=0; f->sizeupvalues=0; f->nups=0; f->upvalues=NULL; f->numparams=0; f->is_vararg=0; f->maxstacksize=0; f->lineinfo=NULL; f->sizelocvars=0; f->locvars=NULL; f->linedefined=0; f->lastlinedefined=0; f->source=NULL; return f; } static void luaF_freeproto(lua_State*L,Proto*f){ luaM_freearray(L,f->code,f->sizecode,Instruction); luaM_freearray(L,f->p,f->sizep,Proto*); luaM_freearray(L,f->k,f->sizek,TValue); luaM_freearray(L,f->lineinfo,f->sizelineinfo,int); luaM_freearray(L,f->locvars,f->sizelocvars,struct LocVar); luaM_freearray(L,f->upvalues,f->sizeupvalues,TString*); luaM_free(L,f); } static void luaF_freeclosure(lua_State*L,Closure*c){ int size=(c->c.isC)?sizeCclosure(c->c.nupvalues): sizeLclosure(c->l.nupvalues); luaM_freemem(L,c,size); } #define MASK1(n,p)((~((~(Instruction)0)<>0)&MASK1(6,0))) #define SET_OPCODE(i,o)((i)=(((i)&MASK0(6,0))|((cast(Instruction,o)<<0)&MASK1(6,0)))) #define GETARG_A(i)(cast(int,((i)>>(0+6))&MASK1(8,0))) #define SETARG_A(i,u)((i)=(((i)&MASK0(8,(0+6)))|((cast(Instruction,u)<<(0+6))&MASK1(8,(0+6))))) #define GETARG_B(i)(cast(int,((i)>>(((0+6)+8)+9))&MASK1(9,0))) #define SETARG_B(i,b)((i)=(((i)&MASK0(9,(((0+6)+8)+9)))|((cast(Instruction,b)<<(((0+6)+8)+9))&MASK1(9,(((0+6)+8)+9))))) #define GETARG_C(i)(cast(int,((i)>>((0+6)+8))&MASK1(9,0))) #define SETARG_C(i,b)((i)=(((i)&MASK0(9,((0+6)+8)))|((cast(Instruction,b)<<((0+6)+8))&MASK1(9,((0+6)+8))))) #define GETARG_Bx(i)(cast(int,((i)>>((0+6)+8))&MASK1((9+9),0))) #define SETARG_Bx(i,b)((i)=(((i)&MASK0((9+9),((0+6)+8)))|((cast(Instruction,b)<<((0+6)+8))&MASK1((9+9),((0+6)+8))))) #define GETARG_sBx(i)(GETARG_Bx(i)-(((1<<(9+9))-1)>>1)) #define SETARG_sBx(i,b)SETARG_Bx((i),cast(unsigned int,(b)+(((1<<(9+9))-1)>>1))) #define CREATE_ABC(o,a,b,c)((cast(Instruction,o)<<0)|(cast(Instruction,a)<<(0+6))|(cast(Instruction,b)<<(((0+6)+8)+9))|(cast(Instruction,c)<<((0+6)+8))) #define CREATE_ABx(o,a,bc)((cast(Instruction,o)<<0)|(cast(Instruction,a)<<(0+6))|(cast(Instruction,bc)<<((0+6)+8))) #define ISK(x)((x)&(1<<(9-1))) #define INDEXK(r)((int)(r)&~(1<<(9-1))) #define RKASK(x)((x)|(1<<(9-1))) static const lu_byte luaP_opmodes[(cast(int,OP_VARARG)+1)]; #define getBMode(m)(cast(enum OpArgMask,(luaP_opmodes[m]>>4)&3)) #define getCMode(m)(cast(enum OpArgMask,(luaP_opmodes[m]>>2)&3)) #define testTMode(m)(luaP_opmodes[m]&(1<<7)) typedef struct expdesc{ expkind k; union{ struct{int info,aux;}s; lua_Number nval; }u; int t; int f; }expdesc; typedef struct upvaldesc{ lu_byte k; lu_byte info; }upvaldesc; struct BlockCnt; typedef struct FuncState{ Proto*f; Table*h; struct FuncState*prev; struct LexState*ls; struct lua_State*L; struct BlockCnt*bl; int pc; int lasttarget; int jpc; int freereg; int nk; int np; short nlocvars; lu_byte nactvar; upvaldesc upvalues[60]; unsigned short actvar[200]; }FuncState; static Proto*luaY_parser(lua_State*L,ZIO*z,Mbuffer*buff, const char*name); struct lua_longjmp{ struct lua_longjmp*previous; jmp_buf b; volatile int status; }; static void luaD_seterrorobj(lua_State*L,int errcode,StkId oldtop){ switch(errcode){ case 4:{ setsvalue(L,oldtop,luaS_newliteral(L,"not enough memory")); break; } case 5:{ setsvalue(L,oldtop,luaS_newliteral(L,"error in error handling")); break; } case 3: case 2:{ setobj(L,oldtop,L->top-1); break; } } L->top=oldtop+1; } static void restore_stack_limit(lua_State*L){ if(L->size_ci>20000){ int inuse=cast_int(L->ci-L->base_ci); if(inuse+1<20000) luaD_reallocCI(L,20000); } } static void resetstack(lua_State*L,int status){ L->ci=L->base_ci; L->base=L->ci->base; luaF_close(L,L->base); luaD_seterrorobj(L,status,L->base); L->nCcalls=L->baseCcalls; L->allowhook=1; restore_stack_limit(L); L->errfunc=0; L->errorJmp=NULL; } static void luaD_throw(lua_State*L,int errcode){ if(L->errorJmp){ L->errorJmp->status=errcode; LUAI_THROW(L,L->errorJmp); } else{ L->status=cast_byte(errcode); if(G(L)->panic){ resetstack(L,errcode); G(L)->panic(L); } exit(EXIT_FAILURE); } } static int luaD_rawrunprotected(lua_State*L,Pfunc f,void*ud){ struct lua_longjmp lj; lj.status=0; lj.previous=L->errorJmp; L->errorJmp=&lj; LUAI_TRY(L,&lj, (*f)(L,ud); ); L->errorJmp=lj.previous; return lj.status; } static void correctstack(lua_State*L,TValue*oldstack){ CallInfo*ci; GCObject*up; L->top=(L->top-oldstack)+L->stack; for(up=L->openupval;up!=NULL;up=up->gch.next) gco2uv(up)->v=(gco2uv(up)->v-oldstack)+L->stack; for(ci=L->base_ci;ci<=L->ci;ci++){ ci->top=(ci->top-oldstack)+L->stack; ci->base=(ci->base-oldstack)+L->stack; ci->func=(ci->func-oldstack)+L->stack; } L->base=(L->base-oldstack)+L->stack; } static void luaD_reallocstack(lua_State*L,int newsize){ TValue*oldstack=L->stack; int realsize=newsize+1+5; luaM_reallocvector(L,L->stack,L->stacksize,realsize,TValue); L->stacksize=realsize; L->stack_last=L->stack+newsize; correctstack(L,oldstack); } static void luaD_reallocCI(lua_State*L,int newsize){ CallInfo*oldci=L->base_ci; luaM_reallocvector(L,L->base_ci,L->size_ci,newsize,CallInfo); L->size_ci=newsize; L->ci=(L->ci-oldci)+L->base_ci; L->end_ci=L->base_ci+L->size_ci-1; } static void luaD_growstack(lua_State*L,int n){ if(n<=L->stacksize) luaD_reallocstack(L,2*L->stacksize); else luaD_reallocstack(L,L->stacksize+n); } static CallInfo*growCI(lua_State*L){ if(L->size_ci>20000) luaD_throw(L,5); else{ luaD_reallocCI(L,2*L->size_ci); if(L->size_ci>20000) luaG_runerror(L,"stack overflow"); } return++L->ci; } static StkId adjust_varargs(lua_State*L,Proto*p,int actual){ int i; int nfixargs=p->numparams; Table*htab=NULL; StkId base,fixed; for(;actualtop++); fixed=L->top-actual; base=L->top; for(i=0;itop++,fixed+i); setnilvalue(fixed+i); } if(htab){ sethvalue(L,L->top++,htab); } return base; } static StkId tryfuncTM(lua_State*L,StkId func){ const TValue*tm=luaT_gettmbyobj(L,func,TM_CALL); StkId p; ptrdiff_t funcr=savestack(L,func); if(!ttisfunction(tm)) luaG_typeerror(L,func,"call"); for(p=L->top;p>func;p--)setobj(L,p,p-1); incr_top(L); func=restorestack(L,funcr); setobj(L,func,tm); return func; } #define inc_ci(L)((L->ci==L->end_ci)?growCI(L):(condhardstacktests(luaD_reallocCI(L,L->size_ci)),++L->ci)) static int luaD_precall(lua_State*L,StkId func,int nresults){ LClosure*cl; ptrdiff_t funcr; if(!ttisfunction(func)) func=tryfuncTM(L,func); funcr=savestack(L,func); cl=&clvalue(func)->l; L->ci->savedpc=L->savedpc; if(!cl->isC){ CallInfo*ci; StkId st,base; Proto*p=cl->p; luaD_checkstack(L,p->maxstacksize); func=restorestack(L,funcr); if(!p->is_vararg){ base=func+1; if(L->top>base+p->numparams) L->top=base+p->numparams; } else{ int nargs=cast_int(L->top-func)-1; base=adjust_varargs(L,p,nargs); func=restorestack(L,funcr); } ci=inc_ci(L); ci->func=func; L->base=ci->base=base; ci->top=L->base+p->maxstacksize; L->savedpc=p->code; ci->tailcalls=0; ci->nresults=nresults; for(st=L->top;sttop;st++) setnilvalue(st); L->top=ci->top; return 0; } else{ CallInfo*ci; int n; luaD_checkstack(L,20); ci=inc_ci(L); ci->func=restorestack(L,funcr); L->base=ci->base=ci->func+1; ci->top=L->top+20; ci->nresults=nresults; n=(*curr_func(L)->c.f)(L); if(n<0) return 2; else{ luaD_poscall(L,L->top-n); return 1; } } } static int luaD_poscall(lua_State*L,StkId firstResult){ StkId res; int wanted,i; CallInfo*ci; ci=L->ci--; res=ci->func; wanted=ci->nresults; L->base=(ci-1)->base; L->savedpc=(ci-1)->savedpc; for(i=wanted;i!=0&&firstResulttop;i--) setobj(L,res++,firstResult++); while(i-->0) setnilvalue(res++); L->top=res; return(wanted-(-1)); } static void luaD_call(lua_State*L,StkId func,int nResults){ if(++L->nCcalls>=200){ if(L->nCcalls==200) luaG_runerror(L,"C stack overflow"); else if(L->nCcalls>=(200+(200>>3))) luaD_throw(L,5); } if(luaD_precall(L,func,nResults)==0) luaV_execute(L,1); L->nCcalls--; luaC_checkGC(L); } static int luaD_pcall(lua_State*L,Pfunc func,void*u, ptrdiff_t old_top,ptrdiff_t ef){ int status; unsigned short oldnCcalls=L->nCcalls; ptrdiff_t old_ci=saveci(L,L->ci); lu_byte old_allowhooks=L->allowhook; ptrdiff_t old_errfunc=L->errfunc; L->errfunc=ef; status=luaD_rawrunprotected(L,func,u); if(status!=0){ StkId oldtop=restorestack(L,old_top); luaF_close(L,oldtop); luaD_seterrorobj(L,status,oldtop); L->nCcalls=oldnCcalls; L->ci=restoreci(L,old_ci); L->base=L->ci->base; L->savedpc=L->ci->savedpc; L->allowhook=old_allowhooks; restore_stack_limit(L); } L->errfunc=old_errfunc; return status; } struct SParser{ ZIO*z; Mbuffer buff; const char*name; }; static void f_parser(lua_State*L,void*ud){ int i; Proto*tf; Closure*cl; struct SParser*p=cast(struct SParser*,ud); luaC_checkGC(L); tf=luaY_parser(L,p->z, &p->buff,p->name); cl=luaF_newLclosure(L,tf->nups,hvalue(gt(L))); cl->l.p=tf; for(i=0;inups;i++) cl->l.upvals[i]=luaF_newupval(L); setclvalue(L,L->top,cl); incr_top(L); } static int luaD_protectedparser(lua_State*L,ZIO*z,const char*name){ struct SParser p; int status; p.z=z;p.name=name; luaZ_initbuffer(L,&p.buff); status=luaD_pcall(L,f_parser,&p,savestack(L,L->top),L->errfunc); luaZ_freebuffer(L,&p.buff); return status; } static void luaS_resize(lua_State*L,int newsize){ GCObject**newhash; stringtable*tb; int i; if(G(L)->gcstate==2) return; newhash=luaM_newvector(L,newsize,GCObject*); tb=&G(L)->strt; for(i=0;isize;i++){ GCObject*p=tb->hash[i]; while(p){ GCObject*next=p->gch.next; unsigned int h=gco2ts(p)->hash; int h1=lmod(h,newsize); p->gch.next=newhash[h1]; newhash[h1]=p; p=next; } } luaM_freearray(L,tb->hash,tb->size,TString*); tb->size=newsize; tb->hash=newhash; } static TString*newlstr(lua_State*L,const char*str,size_t l, unsigned int h){ TString*ts; stringtable*tb; if(l+1>(((size_t)(~(size_t)0)-2)-sizeof(TString))/sizeof(char)) luaM_toobig(L); ts=cast(TString*,luaM_malloc(L,(l+1)*sizeof(char)+sizeof(TString))); ts->tsv.len=l; ts->tsv.hash=h; ts->tsv.marked=luaC_white(G(L)); ts->tsv.tt=4; ts->tsv.reserved=0; memcpy(ts+1,str,l*sizeof(char)); ((char*)(ts+1))[l]='\0'; tb=&G(L)->strt; h=lmod(h,tb->size); ts->tsv.next=tb->hash[h]; tb->hash[h]=obj2gco(ts); tb->nuse++; if(tb->nuse>cast(lu_int32,tb->size)&&tb->size<=(INT_MAX-2)/2) luaS_resize(L,tb->size*2); return ts; } static TString*luaS_newlstr(lua_State*L,const char*str,size_t l){ GCObject*o; unsigned int h=cast(unsigned int,l); size_t step=(l>>5)+1; size_t l1; for(l1=l;l1>=step;l1-=step) h=h^((h<<5)+(h>>2)+cast(unsigned char,str[l1-1])); for(o=G(L)->strt.hash[lmod(h,G(L)->strt.size)]; o!=NULL; o=o->gch.next){ TString*ts=rawgco2ts(o); if(ts->tsv.len==l&&(memcmp(str,getstr(ts),l)==0)){ if(isdead(G(L),o))changewhite(o); return ts; } } return newlstr(L,str,l,h); } static Udata*luaS_newudata(lua_State*L,size_t s,Table*e){ Udata*u; if(s>((size_t)(~(size_t)0)-2)-sizeof(Udata)) luaM_toobig(L); u=cast(Udata*,luaM_malloc(L,s+sizeof(Udata))); u->uv.marked=luaC_white(G(L)); u->uv.tt=7; u->uv.len=s; u->uv.metatable=NULL; u->uv.env=e; u->uv.next=G(L)->mainthread->next; G(L)->mainthread->next=obj2gco(u); return u; } #define hashpow2(t,n)(gnode(t,lmod((n),sizenode(t)))) #define hashstr(t,str)hashpow2(t,(str)->tsv.hash) #define hashboolean(t,p)hashpow2(t,p) #define hashmod(t,n)(gnode(t,((n)%((sizenode(t)-1)|1)))) #define hashpointer(t,p)hashmod(t,IntPoint(p)) static const Node dummynode_={ {{NULL},0}, {{{NULL},0,NULL}} }; static Node*hashnum(const Table*t,lua_Number n){ unsigned int a[cast_int(sizeof(lua_Number)/sizeof(int))]; int i; if(luai_numeq(n,0)) return gnode(t,0); memcpy(a,&n,sizeof(a)); for(i=1;isizearray) return i-1; else{ Node*n=mainposition(t,key); do{ if(luaO_rawequalObj(key2tval(n),key)|| (ttype(gkey(n))==(8+3)&&iscollectable(key)&& gcvalue(gkey(n))==gcvalue(key))){ i=cast_int(n-gnode(t,0)); return i+t->sizearray; } else n=gnext(n); }while(n); luaG_runerror(L,"invalid key to "LUA_QL("next")); return 0; } } static int luaH_next(lua_State*L,Table*t,StkId key){ int i=findindex(L,t,key); for(i++;isizearray;i++){ if(!ttisnil(&t->array[i])){ setnvalue(key,cast_num(i+1)); setobj(L,key+1,&t->array[i]); return 1; } } for(i-=t->sizearray;i<(int)sizenode(t);i++){ if(!ttisnil(gval(gnode(t,i)))){ setobj(L,key,key2tval(gnode(t,i))); setobj(L,key+1,gval(gnode(t,i))); return 1; } } return 0; } static int computesizes(int nums[],int*narray){ int i; int twotoi; int a=0; int na=0; int n=0; for(i=0,twotoi=1;twotoi/2<*narray;i++,twotoi*=2){ if(nums[i]>0){ a+=nums[i]; if(a>twotoi/2){ n=twotoi; na=a; } } if(a==*narray)break; } *narray=n; return na; } static int countint(const TValue*key,int*nums){ int k=arrayindex(key); if(0t->sizearray){ lim=t->sizearray; if(i>lim) break; } for(;i<=lim;i++){ if(!ttisnil(&t->array[i-1])) lc++; } nums[lg]+=lc; ause+=lc; } return ause; } static int numusehash(const Table*t,int*nums,int*pnasize){ int totaluse=0; int ause=0; int i=sizenode(t); while(i--){ Node*n=&t->node[i]; if(!ttisnil(gval(n))){ ause+=countint(key2tval(n),nums); totaluse++; } } *pnasize+=ause; return totaluse; } static void setarrayvector(lua_State*L,Table*t,int size){ int i; luaM_reallocvector(L,t->array,t->sizearray,size,TValue); for(i=t->sizearray;iarray[i]); t->sizearray=size; } static void setnodevector(lua_State*L,Table*t,int size){ int lsize; if(size==0){ t->node=cast(Node*,(&dummynode_)); lsize=0; } else{ int i; lsize=ceillog2(size); if(lsize>(32-2)) luaG_runerror(L,"table overflow"); size=twoto(lsize); t->node=luaM_newvector(L,size,Node); for(i=0;ilsizenode=cast_byte(lsize); t->lastfree=gnode(t,size); } static void resize(lua_State*L,Table*t,int nasize,int nhsize){ int i; int oldasize=t->sizearray; int oldhsize=t->lsizenode; Node*nold=t->node; if(nasize>oldasize) setarrayvector(L,t,nasize); setnodevector(L,t,nhsize); if(nasizesizearray=nasize; for(i=nasize;iarray[i])) setobj(L,luaH_setnum(L,t,i+1),&t->array[i]); } luaM_reallocvector(L,t->array,oldasize,nasize,TValue); } for(i=twoto(oldhsize)-1;i>=0;i--){ Node*old=nold+i; if(!ttisnil(gval(old))) setobj(L,luaH_set(L,t,key2tval(old)),gval(old)); } if(nold!=(&dummynode_)) luaM_freearray(L,nold,twoto(oldhsize),Node); } static void luaH_resizearray(lua_State*L,Table*t,int nasize){ int nsize=(t->node==(&dummynode_))?0:sizenode(t); resize(L,t,nasize,nsize); } static void rehash(lua_State*L,Table*t,const TValue*ek){ int nasize,na; int nums[(32-2)+1]; int i; int totaluse; for(i=0;i<=(32-2);i++)nums[i]=0; nasize=numusearray(t,nums); totaluse=nasize; totaluse+=numusehash(t,nums,&nasize); nasize+=countint(ek,nums); totaluse++; na=computesizes(nums,&nasize); resize(L,t,nasize,totaluse-na); } static Table*luaH_new(lua_State*L,int narray,int nhash){ Table*t=luaM_new(L,Table); luaC_link(L,obj2gco(t),5); t->metatable=NULL; t->flags=cast_byte(~0); t->array=NULL; t->sizearray=0; t->lsizenode=0; t->node=cast(Node*,(&dummynode_)); setarrayvector(L,t,narray); setnodevector(L,t,nhash); return t; } static void luaH_free(lua_State*L,Table*t){ if(t->node!=(&dummynode_)) luaM_freearray(L,t->node,sizenode(t),Node); luaM_freearray(L,t->array,t->sizearray,TValue); luaM_free(L,t); } static Node*getfreepos(Table*t){ while(t->lastfree-->t->node){ if(ttisnil(gkey(t->lastfree))) return t->lastfree; } return NULL; } static TValue*newkey(lua_State*L,Table*t,const TValue*key){ Node*mp=mainposition(t,key); if(!ttisnil(gval(mp))||mp==(&dummynode_)){ Node*othern; Node*n=getfreepos(t); if(n==NULL){ rehash(L,t,key); return luaH_set(L,t,key); } othern=mainposition(t,key2tval(mp)); if(othern!=mp){ while(gnext(othern)!=mp)othern=gnext(othern); gnext(othern)=n; *n=*mp; gnext(mp)=NULL; setnilvalue(gval(mp)); } else{ gnext(n)=gnext(mp); gnext(mp)=n; mp=n; } } gkey(mp)->value=key->value;gkey(mp)->tt=key->tt; luaC_barriert(L,t,key); return gval(mp); } static const TValue*luaH_getnum(Table*t,int key){ if(cast(unsigned int,key-1)sizearray)) return&t->array[key-1]; else{ lua_Number nk=cast_num(key); Node*n=hashnum(t,nk); do{ if(ttisnumber(gkey(n))&&luai_numeq(nvalue(gkey(n)),nk)) return gval(n); else n=gnext(n); }while(n); return(&luaO_nilobject_); } } static const TValue*luaH_getstr(Table*t,TString*key){ Node*n=hashstr(t,key); do{ if(ttisstring(gkey(n))&&rawtsvalue(gkey(n))==key) return gval(n); else n=gnext(n); }while(n); return(&luaO_nilobject_); } static const TValue*luaH_get(Table*t,const TValue*key){ switch(ttype(key)){ case 0:return(&luaO_nilobject_); case 4:return luaH_getstr(t,rawtsvalue(key)); case 3:{ int k; lua_Number n=nvalue(key); lua_number2int(k,n); if(luai_numeq(cast_num(k),nvalue(key))) return luaH_getnum(t,k); } default:{ Node*n=mainposition(t,key); do{ if(luaO_rawequalObj(key2tval(n),key)) return gval(n); else n=gnext(n); }while(n); return(&luaO_nilobject_); } } } static TValue*luaH_set(lua_State*L,Table*t,const TValue*key){ const TValue*p=luaH_get(t,key); t->flags=0; if(p!=(&luaO_nilobject_)) return cast(TValue*,p); else{ if(ttisnil(key))luaG_runerror(L,"table index is nil"); else if(ttisnumber(key)&&luai_numisnan(nvalue(key))) luaG_runerror(L,"table index is NaN"); return newkey(L,t,key); } } static TValue*luaH_setnum(lua_State*L,Table*t,int key){ const TValue*p=luaH_getnum(t,key); if(p!=(&luaO_nilobject_)) return cast(TValue*,p); else{ TValue k; setnvalue(&k,cast_num(key)); return newkey(L,t,&k); } } static TValue*luaH_setstr(lua_State*L,Table*t,TString*key){ const TValue*p=luaH_getstr(t,key); if(p!=(&luaO_nilobject_)) return cast(TValue*,p); else{ TValue k; setsvalue(L,&k,key); return newkey(L,t,&k); } } static int unbound_search(Table*t,unsigned int j){ unsigned int i=j; j++; while(!ttisnil(luaH_getnum(t,j))){ i=j; j*=2; if(j>cast(unsigned int,(INT_MAX-2))){ i=1; while(!ttisnil(luaH_getnum(t,i)))i++; return i-1; } } while(j-i>1){ unsigned int m=(i+j)/2; if(ttisnil(luaH_getnum(t,m)))j=m; else i=m; } return i; } static int luaH_getn(Table*t){ unsigned int j=t->sizearray; if(j>0&&ttisnil(&t->array[j-1])){ unsigned int i=0; while(j-i>1){ unsigned int m=(i+j)/2; if(ttisnil(&t->array[m-1]))j=m; else i=m; } return i; } else if(t->node==(&dummynode_)) return j; else return unbound_search(t,j); } #define makewhite(g,x)((x)->gch.marked=cast_byte(((x)->gch.marked&cast_byte(~(bitmask(2)|bit2mask(0,1))))|luaC_white(g))) #define white2gray(x)reset2bits((x)->gch.marked,0,1) #define black2gray(x)resetbit((x)->gch.marked,2) #define stringmark(s)reset2bits((s)->tsv.marked,0,1) #define isfinalized(u)testbit((u)->marked,3) #define markfinalized(u)l_setbit((u)->marked,3) #define markvalue(g,o){checkconsistency(o);if(iscollectable(o)&&iswhite(gcvalue(o)))reallymarkobject(g,gcvalue(o));} #define markobject(g,t){if(iswhite(obj2gco(t)))reallymarkobject(g,obj2gco(t));} #define setthreshold(g)(g->GCthreshold=(g->estimate/100)*g->gcpause) static void removeentry(Node*n){ if(iscollectable(gkey(n))) setttype(gkey(n),(8+3)); } static void reallymarkobject(global_State*g,GCObject*o){ white2gray(o); switch(o->gch.tt){ case 4:{ return; } case 7:{ Table*mt=gco2u(o)->metatable; gray2black(o); if(mt)markobject(g,mt); markobject(g,gco2u(o)->env); return; } case(8+2):{ UpVal*uv=gco2uv(o); markvalue(g,uv->v); if(uv->v==&uv->u.value) gray2black(o); return; } case 6:{ gco2cl(o)->c.gclist=g->gray; g->gray=o; break; } case 5:{ gco2h(o)->gclist=g->gray; g->gray=o; break; } case 8:{ gco2th(o)->gclist=g->gray; g->gray=o; break; } case(8+1):{ gco2p(o)->gclist=g->gray; g->gray=o; break; } default:; } } static void marktmu(global_State*g){ GCObject*u=g->tmudata; if(u){ do{ u=u->gch.next; makewhite(g,u); reallymarkobject(g,u); }while(u!=g->tmudata); } } static size_t luaC_separateudata(lua_State*L,int all){ global_State*g=G(L); size_t deadmem=0; GCObject**p=&g->mainthread->next; GCObject*curr; while((curr=*p)!=NULL){ if(!(iswhite(curr)||all)||isfinalized(gco2u(curr))) p=&curr->gch.next; else if(fasttm(L,gco2u(curr)->metatable,TM_GC)==NULL){ markfinalized(gco2u(curr)); p=&curr->gch.next; } else{ deadmem+=sizeudata(gco2u(curr)); markfinalized(gco2u(curr)); *p=curr->gch.next; if(g->tmudata==NULL) g->tmudata=curr->gch.next=curr; else{ curr->gch.next=g->tmudata->gch.next; g->tmudata->gch.next=curr; g->tmudata=curr; } } } return deadmem; } static int traversetable(global_State*g,Table*h){ int i; int weakkey=0; int weakvalue=0; const TValue*mode; if(h->metatable) markobject(g,h->metatable); mode=gfasttm(g,h->metatable,TM_MODE); if(mode&&ttisstring(mode)){ weakkey=(strchr(svalue(mode),'k')!=NULL); weakvalue=(strchr(svalue(mode),'v')!=NULL); if(weakkey||weakvalue){ h->marked&=~(bitmask(3)|bitmask(4)); h->marked|=cast_byte((weakkey<<3)| (weakvalue<<4)); h->gclist=g->weak; g->weak=obj2gco(h); } } if(weakkey&&weakvalue)return 1; if(!weakvalue){ i=h->sizearray; while(i--) markvalue(g,&h->array[i]); } i=sizenode(h); while(i--){ Node*n=gnode(h,i); if(ttisnil(gval(n))) removeentry(n); else{ if(!weakkey)markvalue(g,gkey(n)); if(!weakvalue)markvalue(g,gval(n)); } } return weakkey||weakvalue; } static void traverseproto(global_State*g,Proto*f){ int i; if(f->source)stringmark(f->source); for(i=0;isizek;i++) markvalue(g,&f->k[i]); for(i=0;isizeupvalues;i++){ if(f->upvalues[i]) stringmark(f->upvalues[i]); } for(i=0;isizep;i++){ if(f->p[i]) markobject(g,f->p[i]); } for(i=0;isizelocvars;i++){ if(f->locvars[i].varname) stringmark(f->locvars[i].varname); } } static void traverseclosure(global_State*g,Closure*cl){ markobject(g,cl->c.env); if(cl->c.isC){ int i; for(i=0;ic.nupvalues;i++) markvalue(g,&cl->c.upvalue[i]); } else{ int i; markobject(g,cl->l.p); for(i=0;il.nupvalues;i++) markobject(g,cl->l.upvals[i]); } } static void checkstacksizes(lua_State*L,StkId max){ int ci_used=cast_int(L->ci-L->base_ci); int s_used=cast_int(max-L->stack); if(L->size_ci>20000) return; if(4*ci_usedsize_ci&&2*8size_ci) luaD_reallocCI(L,L->size_ci/2); condhardstacktests(luaD_reallocCI(L,ci_used+1)); if(4*s_usedstacksize&& 2*((2*20)+5)stacksize) luaD_reallocstack(L,L->stacksize/2); condhardstacktests(luaD_reallocstack(L,s_used)); } static void traversestack(global_State*g,lua_State*l){ StkId o,lim; CallInfo*ci; markvalue(g,gt(l)); lim=l->top; for(ci=l->base_ci;ci<=l->ci;ci++){ if(limtop)lim=ci->top; } for(o=l->stack;otop;o++) markvalue(g,o); for(;o<=lim;o++) setnilvalue(o); checkstacksizes(l,lim); } static l_mem propagatemark(global_State*g){ GCObject*o=g->gray; gray2black(o); switch(o->gch.tt){ case 5:{ Table*h=gco2h(o); g->gray=h->gclist; if(traversetable(g,h)) black2gray(o); return sizeof(Table)+sizeof(TValue)*h->sizearray+ sizeof(Node)*sizenode(h); } case 6:{ Closure*cl=gco2cl(o); g->gray=cl->c.gclist; traverseclosure(g,cl); return(cl->c.isC)?sizeCclosure(cl->c.nupvalues): sizeLclosure(cl->l.nupvalues); } case 8:{ lua_State*th=gco2th(o); g->gray=th->gclist; th->gclist=g->grayagain; g->grayagain=o; black2gray(o); traversestack(g,th); return sizeof(lua_State)+sizeof(TValue)*th->stacksize+ sizeof(CallInfo)*th->size_ci; } case(8+1):{ Proto*p=gco2p(o); g->gray=p->gclist; traverseproto(g,p); return sizeof(Proto)+sizeof(Instruction)*p->sizecode+ sizeof(Proto*)*p->sizep+ sizeof(TValue)*p->sizek+ sizeof(int)*p->sizelineinfo+ sizeof(LocVar)*p->sizelocvars+ sizeof(TString*)*p->sizeupvalues; } default:return 0; } } static size_t propagateall(global_State*g){ size_t m=0; while(g->gray)m+=propagatemark(g); return m; } static int iscleared(const TValue*o,int iskey){ if(!iscollectable(o))return 0; if(ttisstring(o)){ stringmark(rawtsvalue(o)); return 0; } return iswhite(gcvalue(o))|| (ttisuserdata(o)&&(!iskey&&isfinalized(uvalue(o)))); } static void cleartable(GCObject*l){ while(l){ Table*h=gco2h(l); int i=h->sizearray; if(testbit(h->marked,4)){ while(i--){ TValue*o=&h->array[i]; if(iscleared(o,0)) setnilvalue(o); } } i=sizenode(h); while(i--){ Node*n=gnode(h,i); if(!ttisnil(gval(n))&& (iscleared(key2tval(n),1)||iscleared(gval(n),0))){ setnilvalue(gval(n)); removeentry(n); } } l=h->gclist; } } static void freeobj(lua_State*L,GCObject*o){ switch(o->gch.tt){ case(8+1):luaF_freeproto(L,gco2p(o));break; case 6:luaF_freeclosure(L,gco2cl(o));break; case(8+2):luaF_freeupval(L,gco2uv(o));break; case 5:luaH_free(L,gco2h(o));break; case 8:{ luaE_freethread(L,gco2th(o)); break; } case 4:{ G(L)->strt.nuse--; luaM_freemem(L,o,sizestring(gco2ts(o))); break; } case 7:{ luaM_freemem(L,o,sizeudata(gco2u(o))); break; } default:; } } #define sweepwholelist(L,p)sweeplist(L,p,((lu_mem)(~(lu_mem)0)-2)) static GCObject**sweeplist(lua_State*L,GCObject**p,lu_mem count){ GCObject*curr; global_State*g=G(L); int deadmask=otherwhite(g); while((curr=*p)!=NULL&&count-->0){ if(curr->gch.tt==8) sweepwholelist(L,&gco2th(curr)->openupval); if((curr->gch.marked^bit2mask(0,1))&deadmask){ makewhite(g,curr); p=&curr->gch.next; } else{ *p=curr->gch.next; if(curr==g->rootgc) g->rootgc=curr->gch.next; freeobj(L,curr); } } return p; } static void checkSizes(lua_State*L){ global_State*g=G(L); if(g->strt.nusestrt.size/4)&& g->strt.size>32*2) luaS_resize(L,g->strt.size/2); if(luaZ_sizebuffer(&g->buff)>32*2){ size_t newsize=luaZ_sizebuffer(&g->buff)/2; luaZ_resizebuffer(L,&g->buff,newsize); } } static void GCTM(lua_State*L){ global_State*g=G(L); GCObject*o=g->tmudata->gch.next; Udata*udata=rawgco2u(o); const TValue*tm; if(o==g->tmudata) g->tmudata=NULL; else g->tmudata->gch.next=udata->uv.next; udata->uv.next=g->mainthread->next; g->mainthread->next=o; makewhite(g,o); tm=fasttm(L,udata->uv.metatable,TM_GC); if(tm!=NULL){ lu_byte oldah=L->allowhook; lu_mem oldt=g->GCthreshold; L->allowhook=0; g->GCthreshold=2*g->totalbytes; setobj(L,L->top,tm); setuvalue(L,L->top+1,udata); L->top+=2; luaD_call(L,L->top-2,0); L->allowhook=oldah; g->GCthreshold=oldt; } } static void luaC_callGCTM(lua_State*L){ while(G(L)->tmudata) GCTM(L); } static void luaC_freeall(lua_State*L){ global_State*g=G(L); int i; g->currentwhite=bit2mask(0,1)|bitmask(6); sweepwholelist(L,&g->rootgc); for(i=0;istrt.size;i++) sweepwholelist(L,&g->strt.hash[i]); } static void markmt(global_State*g){ int i; for(i=0;i<(8+1);i++) if(g->mt[i])markobject(g,g->mt[i]); } static void markroot(lua_State*L){ global_State*g=G(L); g->gray=NULL; g->grayagain=NULL; g->weak=NULL; markobject(g,g->mainthread); markvalue(g,gt(g->mainthread)); markvalue(g,registry(L)); markmt(g); g->gcstate=1; } static void remarkupvals(global_State*g){ UpVal*uv; for(uv=g->uvhead.u.l.next;uv!=&g->uvhead;uv=uv->u.l.next){ if(isgray(obj2gco(uv))) markvalue(g,uv->v); } } static void atomic(lua_State*L){ global_State*g=G(L); size_t udsize; remarkupvals(g); propagateall(g); g->gray=g->weak; g->weak=NULL; markobject(g,L); markmt(g); propagateall(g); g->gray=g->grayagain; g->grayagain=NULL; propagateall(g); udsize=luaC_separateudata(L,0); marktmu(g); udsize+=propagateall(g); cleartable(g->weak); g->currentwhite=cast_byte(otherwhite(g)); g->sweepstrgc=0; g->sweepgc=&g->rootgc; g->gcstate=2; g->estimate=g->totalbytes-udsize; } static l_mem singlestep(lua_State*L){ global_State*g=G(L); switch(g->gcstate){ case 0:{ markroot(L); return 0; } case 1:{ if(g->gray) return propagatemark(g); else{ atomic(L); return 0; } } case 2:{ lu_mem old=g->totalbytes; sweepwholelist(L,&g->strt.hash[g->sweepstrgc++]); if(g->sweepstrgc>=g->strt.size) g->gcstate=3; g->estimate-=old-g->totalbytes; return 10; } case 3:{ lu_mem old=g->totalbytes; g->sweepgc=sweeplist(L,g->sweepgc,40); if(*g->sweepgc==NULL){ checkSizes(L); g->gcstate=4; } g->estimate-=old-g->totalbytes; return 40*10; } case 4:{ if(g->tmudata){ GCTM(L); if(g->estimate>100) g->estimate-=100; return 100; } else{ g->gcstate=0; g->gcdept=0; return 0; } } default:return 0; } } static void luaC_step(lua_State*L){ global_State*g=G(L); l_mem lim=(1024u/100)*g->gcstepmul; if(lim==0) lim=(((lu_mem)(~(lu_mem)0)-2)-1)/2; g->gcdept+=g->totalbytes-g->GCthreshold; do{ lim-=singlestep(L); if(g->gcstate==0) break; }while(lim>0); if(g->gcstate!=0){ if(g->gcdept<1024u) g->GCthreshold=g->totalbytes+1024u; else{ g->gcdept-=1024u; g->GCthreshold=g->totalbytes; } } else{ setthreshold(g); } } static void luaC_barrierf(lua_State*L,GCObject*o,GCObject*v){ global_State*g=G(L); if(g->gcstate==1) reallymarkobject(g,v); else makewhite(g,o); } static void luaC_barrierback(lua_State*L,Table*t){ global_State*g=G(L); GCObject*o=obj2gco(t); black2gray(o); t->gclist=g->grayagain; g->grayagain=o; } static void luaC_link(lua_State*L,GCObject*o,lu_byte tt){ global_State*g=G(L); o->gch.next=g->rootgc; g->rootgc=o; o->gch.marked=luaC_white(g); o->gch.tt=tt; } static void luaC_linkupval(lua_State*L,UpVal*uv){ global_State*g=G(L); GCObject*o=obj2gco(uv); o->gch.next=g->rootgc; g->rootgc=o; if(isgray(o)){ if(g->gcstate==1){ gray2black(o); luaC_barrier(L,uv,uv->v); } else{ makewhite(g,o); } } } typedef union{ lua_Number r; TString*ts; }SemInfo; typedef struct Token{ int token; SemInfo seminfo; }Token; typedef struct LexState{ int current; int linenumber; int lastline; Token t; Token lookahead; struct FuncState*fs; struct lua_State*L; ZIO*z; Mbuffer*buff; TString*source; char decpoint; }LexState; static void luaX_init(lua_State*L); static void luaX_lexerror(LexState*ls,const char*msg,int token); #define state_size(x)(sizeof(x)+0) #define fromstate(l)(cast(lu_byte*,(l))-0) #define tostate(l)(cast(lua_State*,cast(lu_byte*,l)+0)) typedef struct LG{ lua_State l; global_State g; }LG; static void stack_init(lua_State*L1,lua_State*L){ L1->base_ci=luaM_newvector(L,8,CallInfo); L1->ci=L1->base_ci; L1->size_ci=8; L1->end_ci=L1->base_ci+L1->size_ci-1; L1->stack=luaM_newvector(L,(2*20)+5,TValue); L1->stacksize=(2*20)+5; L1->top=L1->stack; L1->stack_last=L1->stack+(L1->stacksize-5)-1; L1->ci->func=L1->top; setnilvalue(L1->top++); L1->base=L1->ci->base=L1->top; L1->ci->top=L1->top+20; } static void freestack(lua_State*L,lua_State*L1){ luaM_freearray(L,L1->base_ci,L1->size_ci,CallInfo); luaM_freearray(L,L1->stack,L1->stacksize,TValue); } static void f_luaopen(lua_State*L,void*ud){ global_State*g=G(L); UNUSED(ud); stack_init(L,L); sethvalue(L,gt(L),luaH_new(L,0,2)); sethvalue(L,registry(L),luaH_new(L,0,2)); luaS_resize(L,32); luaT_init(L); luaX_init(L); luaS_fix(luaS_newliteral(L,"not enough memory")); g->GCthreshold=4*g->totalbytes; } static void preinit_state(lua_State*L,global_State*g){ G(L)=g; L->stack=NULL; L->stacksize=0; L->errorJmp=NULL; L->hook=NULL; L->hookmask=0; L->basehookcount=0; L->allowhook=1; resethookcount(L); L->openupval=NULL; L->size_ci=0; L->nCcalls=L->baseCcalls=0; L->status=0; L->base_ci=L->ci=NULL; L->savedpc=NULL; L->errfunc=0; setnilvalue(gt(L)); } static void close_state(lua_State*L){ global_State*g=G(L); luaF_close(L,L->stack); luaC_freeall(L); luaM_freearray(L,G(L)->strt.hash,G(L)->strt.size,TString*); luaZ_freebuffer(L,&g->buff); freestack(L,L); (*g->frealloc)(g->ud,fromstate(L),state_size(LG),0); } static void luaE_freethread(lua_State*L,lua_State*L1){ luaF_close(L1,L1->stack); freestack(L,L1); luaM_freemem(L,fromstate(L1),state_size(lua_State)); } static lua_State*lua_newstate(lua_Alloc f,void*ud){ int i; lua_State*L; global_State*g; void*l=(*f)(ud,NULL,0,state_size(LG)); if(l==NULL)return NULL; L=tostate(l); g=&((LG*)L)->g; L->next=NULL; L->tt=8; g->currentwhite=bit2mask(0,5); L->marked=luaC_white(g); set2bits(L->marked,5,6); preinit_state(L,g); g->frealloc=f; g->ud=ud; g->mainthread=L; g->uvhead.u.l.prev=&g->uvhead; g->uvhead.u.l.next=&g->uvhead; g->GCthreshold=0; g->strt.size=0; g->strt.nuse=0; g->strt.hash=NULL; setnilvalue(registry(L)); luaZ_initbuffer(L,&g->buff); g->panic=NULL; g->gcstate=0; g->rootgc=obj2gco(L); g->sweepstrgc=0; g->sweepgc=&g->rootgc; g->gray=NULL; g->grayagain=NULL; g->weak=NULL; g->tmudata=NULL; g->totalbytes=sizeof(LG); g->gcpause=200; g->gcstepmul=200; g->gcdept=0; for(i=0;i<(8+1);i++)g->mt[i]=NULL; if(luaD_rawrunprotected(L,f_luaopen,NULL)!=0){ close_state(L); L=NULL; } else {} return L; } static void callallgcTM(lua_State*L,void*ud){ UNUSED(ud); luaC_callGCTM(L); } static void lua_close(lua_State*L){ L=G(L)->mainthread; luaF_close(L,L->stack); luaC_separateudata(L,1); L->errfunc=0; do{ L->ci=L->base_ci; L->base=L->top=L->ci->base; L->nCcalls=L->baseCcalls=0; }while(luaD_rawrunprotected(L,callallgcTM,NULL)!=0); close_state(L); } #define getcode(fs,e)((fs)->f->code[(e)->u.s.info]) #define luaK_codeAsBx(fs,o,A,sBx)luaK_codeABx(fs,o,A,(sBx)+(((1<<(9+9))-1)>>1)) #define luaK_setmultret(fs,e)luaK_setreturns(fs,e,(-1)) static int luaK_codeABx(FuncState*fs,OpCode o,int A,unsigned int Bx); static int luaK_codeABC(FuncState*fs,OpCode o,int A,int B,int C); static void luaK_setreturns(FuncState*fs,expdesc*e,int nresults); static void luaK_patchtohere(FuncState*fs,int list); static void luaK_concat(FuncState*fs,int*l1,int l2); static int currentpc(lua_State*L,CallInfo*ci){ if(!isLua(ci))return-1; if(ci==L->ci) ci->savedpc=L->savedpc; return pcRel(ci->savedpc,ci_func(ci)->l.p); } static int currentline(lua_State*L,CallInfo*ci){ int pc=currentpc(L,ci); if(pc<0) return-1; else return getline_(ci_func(ci)->l.p,pc); } static int lua_getstack(lua_State*L,int level,lua_Debug*ar){ int status; CallInfo*ci; for(ci=L->ci;level>0&&ci>L->base_ci;ci--){ level--; if(f_isLua(ci)) level-=ci->tailcalls; } if(level==0&&ci>L->base_ci){ status=1; ar->i_ci=cast_int(ci-L->base_ci); } else if(level<0){ status=1; ar->i_ci=0; } else status=0; return status; } static Proto*getluaproto(CallInfo*ci){ return(isLua(ci)?ci_func(ci)->l.p:NULL); } static void funcinfo(lua_Debug*ar,Closure*cl){ if(cl->c.isC){ ar->source="=[C]"; ar->linedefined=-1; ar->lastlinedefined=-1; ar->what="C"; } else{ ar->source=getstr(cl->l.p->source); ar->linedefined=cl->l.p->linedefined; ar->lastlinedefined=cl->l.p->lastlinedefined; ar->what=(ar->linedefined==0)?"main":"Lua"; } luaO_chunkid(ar->short_src,ar->source,60); } static void info_tailcall(lua_Debug*ar){ ar->name=ar->namewhat=""; ar->what="tail"; ar->lastlinedefined=ar->linedefined=ar->currentline=-1; ar->source="=(tail call)"; luaO_chunkid(ar->short_src,ar->source,60); ar->nups=0; } static void collectvalidlines(lua_State*L,Closure*f){ if(f==NULL||f->c.isC){ setnilvalue(L->top); } else{ Table*t=luaH_new(L,0,0); int*lineinfo=f->l.p->lineinfo; int i; for(i=0;il.p->sizelineinfo;i++) setbvalue(luaH_setnum(L,t,lineinfo[i]),1); sethvalue(L,L->top,t); } incr_top(L); } static int auxgetinfo(lua_State*L,const char*what,lua_Debug*ar, Closure*f,CallInfo*ci){ int status=1; if(f==NULL){ info_tailcall(ar); return status; } for(;*what;what++){ switch(*what){ case'S':{ funcinfo(ar,f); break; } case'l':{ ar->currentline=(ci)?currentline(L,ci):-1; break; } case'u':{ ar->nups=f->c.nupvalues; break; } case'n':{ ar->namewhat=(ci)?NULL:NULL; if(ar->namewhat==NULL){ ar->namewhat=""; ar->name=NULL; } break; } case'L': case'f': break; default:status=0; } } return status; } static int lua_getinfo(lua_State*L,const char*what,lua_Debug*ar){ int status; Closure*f=NULL; CallInfo*ci=NULL; if(*what=='>'){ StkId func=L->top-1; luai_apicheck(L,ttisfunction(func)); what++; f=clvalue(func); L->top--; } else if(ar->i_ci!=0){ ci=L->base_ci+ar->i_ci; f=clvalue(ci->func); } status=auxgetinfo(L,what,ar,f,ci); if(strchr(what,'f')){ if(f==NULL)setnilvalue(L->top); else setclvalue(L,L->top,f); incr_top(L); } if(strchr(what,'L')) collectvalidlines(L,f); return status; } static int isinstack(CallInfo*ci,const TValue*o){ StkId p; for(p=ci->base;ptop;p++) if(o==p)return 1; return 0; } static void luaG_typeerror(lua_State*L,const TValue*o,const char*op){ const char*name=NULL; const char*t=luaT_typenames[ttype(o)]; const char*kind=(isinstack(L->ci,o))? NULL: NULL; if(kind) luaG_runerror(L,"attempt to %s %s "LUA_QL("%s")" (a %s value)", op,kind,name,t); else luaG_runerror(L,"attempt to %s a %s value",op,t); } static void luaG_concaterror(lua_State*L,StkId p1,StkId p2){ if(ttisstring(p1)||ttisnumber(p1))p1=p2; luaG_typeerror(L,p1,"concatenate"); } static void luaG_aritherror(lua_State*L,const TValue*p1,const TValue*p2){ TValue temp; if(luaV_tonumber(p1,&temp)==NULL) p2=p1; luaG_typeerror(L,p2,"perform arithmetic on"); } static int luaG_ordererror(lua_State*L,const TValue*p1,const TValue*p2){ const char*t1=luaT_typenames[ttype(p1)]; const char*t2=luaT_typenames[ttype(p2)]; if(t1[2]==t2[2]) luaG_runerror(L,"attempt to compare two %s values",t1); else luaG_runerror(L,"attempt to compare %s with %s",t1,t2); return 0; } static void addinfo(lua_State*L,const char*msg){ CallInfo*ci=L->ci; if(isLua(ci)){ char buff[60]; int line=currentline(L,ci); luaO_chunkid(buff,getstr(getluaproto(ci)->source),60); luaO_pushfstring(L,"%s:%d: %s",buff,line,msg); } } static void luaG_errormsg(lua_State*L){ if(L->errfunc!=0){ StkId errfunc=restorestack(L,L->errfunc); if(!ttisfunction(errfunc))luaD_throw(L,5); setobj(L,L->top,L->top-1); setobj(L,L->top-1,errfunc); incr_top(L); luaD_call(L,L->top-2,1); } luaD_throw(L,2); } static void luaG_runerror(lua_State*L,const char*fmt,...){ va_list argp; va_start(argp,fmt); addinfo(L,luaO_pushvfstring(L,fmt,argp)); va_end(argp); luaG_errormsg(L); } static int luaZ_fill(ZIO*z){ size_t size; lua_State*L=z->L; const char*buff; buff=z->reader(L,z->data,&size); if(buff==NULL||size==0)return(-1); z->n=size-1; z->p=buff; return char2int(*(z->p++)); } static void luaZ_init(lua_State*L,ZIO*z,lua_Reader reader,void*data){ z->L=L; z->reader=reader; z->data=data; z->n=0; z->p=NULL; } static char*luaZ_openspace(lua_State*L,Mbuffer*buff,size_t n){ if(n>buff->buffsize){ if(n<32)n=32; luaZ_resizebuffer(L,buff,n); } return buff->buffer; } #define opmode(t,a,b,c,m)(((t)<<7)|((a)<<6)|((b)<<4)|((c)<<2)|(m)) static const lu_byte luaP_opmodes[(cast(int,OP_VARARG)+1)]={ opmode(0,1,OpArgR,OpArgN,iABC) ,opmode(0,1,OpArgK,OpArgN,iABx) ,opmode(0,1,OpArgU,OpArgU,iABC) ,opmode(0,1,OpArgR,OpArgN,iABC) ,opmode(0,1,OpArgU,OpArgN,iABC) ,opmode(0,1,OpArgK,OpArgN,iABx) ,opmode(0,1,OpArgR,OpArgK,iABC) ,opmode(0,0,OpArgK,OpArgN,iABx) ,opmode(0,0,OpArgU,OpArgN,iABC) ,opmode(0,0,OpArgK,OpArgK,iABC) ,opmode(0,1,OpArgU,OpArgU,iABC) ,opmode(0,1,OpArgR,OpArgK,iABC) ,opmode(0,1,OpArgK,OpArgK,iABC) ,opmode(0,1,OpArgK,OpArgK,iABC) ,opmode(0,1,OpArgK,OpArgK,iABC) ,opmode(0,1,OpArgK,OpArgK,iABC) ,opmode(0,1,OpArgK,OpArgK,iABC) ,opmode(0,1,OpArgK,OpArgK,iABC) ,opmode(0,1,OpArgR,OpArgN,iABC) ,opmode(0,1,OpArgR,OpArgN,iABC) ,opmode(0,1,OpArgR,OpArgN,iABC) ,opmode(0,1,OpArgR,OpArgR,iABC) ,opmode(0,0,OpArgR,OpArgN,iAsBx) ,opmode(1,0,OpArgK,OpArgK,iABC) ,opmode(1,0,OpArgK,OpArgK,iABC) ,opmode(1,0,OpArgK,OpArgK,iABC) ,opmode(1,1,OpArgR,OpArgU,iABC) ,opmode(1,1,OpArgR,OpArgU,iABC) ,opmode(0,1,OpArgU,OpArgU,iABC) ,opmode(0,1,OpArgU,OpArgU,iABC) ,opmode(0,0,OpArgU,OpArgN,iABC) ,opmode(0,1,OpArgR,OpArgN,iAsBx) ,opmode(0,1,OpArgR,OpArgN,iAsBx) ,opmode(1,0,OpArgN,OpArgU,iABC) ,opmode(0,0,OpArgU,OpArgU,iABC) ,opmode(0,0,OpArgN,OpArgN,iABC) ,opmode(0,1,OpArgU,OpArgN,iABx) ,opmode(0,1,OpArgU,OpArgN,iABC) }; #define next(ls)(ls->current=zgetc(ls->z)) #define currIsNewline(ls)(ls->current=='\n'||ls->current=='\r') static const char*const luaX_tokens[]={ "and","break","do","else","elseif", "end","false","for","function","if", "in","local","nil","not","or","repeat", "return","then","true","until","while", "..","...","==",">=","<=","~=", "","","","", NULL }; #define save_and_next(ls)(save(ls,ls->current),next(ls)) static void save(LexState*ls,int c){ Mbuffer*b=ls->buff; if(b->n+1>b->buffsize){ size_t newsize; if(b->buffsize>=((size_t)(~(size_t)0)-2)/2) luaX_lexerror(ls,"lexical element too long",0); newsize=b->buffsize*2; luaZ_resizebuffer(ls->L,b,newsize); } b->buffer[b->n++]=cast(char,c); } static void luaX_init(lua_State*L){ int i; for(i=0;i<(cast(int,TK_WHILE-257+1));i++){ TString*ts=luaS_new(L,luaX_tokens[i]); luaS_fix(ts); ts->tsv.reserved=cast_byte(i+1); } } static const char*luaX_token2str(LexState*ls,int token){ if(token<257){ return(iscntrl(token))?luaO_pushfstring(ls->L,"char(%d)",token): luaO_pushfstring(ls->L,"%c",token); } else return luaX_tokens[token-257]; } static const char*txtToken(LexState*ls,int token){ switch(token){ case TK_NAME: case TK_STRING: case TK_NUMBER: save(ls,'\0'); return luaZ_buffer(ls->buff); default: return luaX_token2str(ls,token); } } static void luaX_lexerror(LexState*ls,const char*msg,int token){ char buff[80]; luaO_chunkid(buff,getstr(ls->source),80); msg=luaO_pushfstring(ls->L,"%s:%d: %s",buff,ls->linenumber,msg); if(token) luaO_pushfstring(ls->L,"%s near "LUA_QL("%s"),msg,txtToken(ls,token)); luaD_throw(ls->L,3); } static void luaX_syntaxerror(LexState*ls,const char*msg){ luaX_lexerror(ls,msg,ls->t.token); } static TString*luaX_newstring(LexState*ls,const char*str,size_t l){ lua_State*L=ls->L; TString*ts=luaS_newlstr(L,str,l); TValue*o=luaH_setstr(L,ls->fs->h,ts); if(ttisnil(o)){ setbvalue(o,1); luaC_checkGC(L); } return ts; } static void inclinenumber(LexState*ls){ int old=ls->current; next(ls); if(currIsNewline(ls)&&ls->current!=old) next(ls); if(++ls->linenumber>=(INT_MAX-2)) luaX_syntaxerror(ls,"chunk has too many lines"); } static void luaX_setinput(lua_State*L,LexState*ls,ZIO*z,TString*source){ ls->decpoint='.'; ls->L=L; ls->lookahead.token=TK_EOS; ls->z=z; ls->fs=NULL; ls->linenumber=1; ls->lastline=1; ls->source=source; luaZ_resizebuffer(ls->L,ls->buff,32); next(ls); } static int check_next(LexState*ls,const char*set){ if(!strchr(set,ls->current)) return 0; save_and_next(ls); return 1; } static void buffreplace(LexState*ls,char from,char to){ size_t n=luaZ_bufflen(ls->buff); char*p=luaZ_buffer(ls->buff); while(n--) if(p[n]==from)p[n]=to; } static void read_numeral(LexState*ls,SemInfo*seminfo){ do{ save_and_next(ls); }while(isdigit(ls->current)||ls->current=='.'); if(check_next(ls,"Ee")) check_next(ls,"+-"); while(isalnum(ls->current)||ls->current=='_') save_and_next(ls); save(ls,'\0'); buffreplace(ls,'.',ls->decpoint); if(!luaO_str2d(luaZ_buffer(ls->buff),&seminfo->r)) luaX_lexerror(ls,"malformed number",TK_NUMBER); } static int skip_sep(LexState*ls){ int count=0; int s=ls->current; save_and_next(ls); while(ls->current=='='){ save_and_next(ls); count++; } return(ls->current==s)?count:(-count)-1; } static void read_long_string(LexState*ls,SemInfo*seminfo,int sep){ int cont=0; (void)(cont); save_and_next(ls); if(currIsNewline(ls)) inclinenumber(ls); for(;;){ switch(ls->current){ case(-1): luaX_lexerror(ls,(seminfo)?"unfinished long string": "unfinished long comment",TK_EOS); break; case']':{ if(skip_sep(ls)==sep){ save_and_next(ls); goto endloop; } break; } case'\n': case'\r':{ save(ls,'\n'); inclinenumber(ls); if(!seminfo)luaZ_resetbuffer(ls->buff); break; } default:{ if(seminfo)save_and_next(ls); else next(ls); } } }endloop: if(seminfo) seminfo->ts=luaX_newstring(ls,luaZ_buffer(ls->buff)+(2+sep), luaZ_bufflen(ls->buff)-2*(2+sep)); } static void read_string(LexState*ls,int del,SemInfo*seminfo){ save_and_next(ls); while(ls->current!=del){ switch(ls->current){ case(-1): luaX_lexerror(ls,"unfinished string",TK_EOS); continue; case'\n': case'\r': luaX_lexerror(ls,"unfinished string",TK_STRING); continue; case'\\':{ int c; next(ls); switch(ls->current){ case'a':c='\a';break; case'b':c='\b';break; case'f':c='\f';break; case'n':c='\n';break; case'r':c='\r';break; case't':c='\t';break; case'v':c='\v';break; case'\n': case'\r':save(ls,'\n');inclinenumber(ls);continue; case(-1):continue; default:{ if(!isdigit(ls->current)) save_and_next(ls); else{ int i=0; c=0; do{ c=10*c+(ls->current-'0'); next(ls); }while(++i<3&&isdigit(ls->current)); if(c>UCHAR_MAX) luaX_lexerror(ls,"escape sequence too large",TK_STRING); save(ls,c); } continue; } } save(ls,c); next(ls); continue; } default: save_and_next(ls); } } save_and_next(ls); seminfo->ts=luaX_newstring(ls,luaZ_buffer(ls->buff)+1, luaZ_bufflen(ls->buff)-2); } static int llex(LexState*ls,SemInfo*seminfo){ luaZ_resetbuffer(ls->buff); for(;;){ switch(ls->current){ case'\n': case'\r':{ inclinenumber(ls); continue; } case'-':{ next(ls); if(ls->current!='-')return'-'; next(ls); if(ls->current=='['){ int sep=skip_sep(ls); luaZ_resetbuffer(ls->buff); if(sep>=0){ read_long_string(ls,NULL,sep); luaZ_resetbuffer(ls->buff); continue; } } while(!currIsNewline(ls)&&ls->current!=(-1)) next(ls); continue; } case'[':{ int sep=skip_sep(ls); if(sep>=0){ read_long_string(ls,seminfo,sep); return TK_STRING; } else if(sep==-1)return'['; else luaX_lexerror(ls,"invalid long string delimiter",TK_STRING); } case'=':{ next(ls); if(ls->current!='=')return'='; else{next(ls);return TK_EQ;} } case'<':{ next(ls); if(ls->current!='=')return'<'; else{next(ls);return TK_LE;} } case'>':{ next(ls); if(ls->current!='=')return'>'; else{next(ls);return TK_GE;} } case'~':{ next(ls); if(ls->current!='=')return'~'; else{next(ls);return TK_NE;} } case'"': case'\'':{ read_string(ls,ls->current,seminfo); return TK_STRING; } case'.':{ save_and_next(ls); if(check_next(ls,".")){ if(check_next(ls,".")) return TK_DOTS; else return TK_CONCAT; } else if(!isdigit(ls->current))return'.'; else{ read_numeral(ls,seminfo); return TK_NUMBER; } } case(-1):{ return TK_EOS; } default:{ if(isspace(ls->current)){ next(ls); continue; } else if(isdigit(ls->current)){ read_numeral(ls,seminfo); return TK_NUMBER; } else if(isalpha(ls->current)||ls->current=='_'){ TString*ts; do{ save_and_next(ls); }while(isalnum(ls->current)||ls->current=='_'); ts=luaX_newstring(ls,luaZ_buffer(ls->buff), luaZ_bufflen(ls->buff)); if(ts->tsv.reserved>0) return ts->tsv.reserved-1+257; else{ seminfo->ts=ts; return TK_NAME; } } else{ int c=ls->current; next(ls); return c; } } } } } static void luaX_next(LexState*ls){ ls->lastline=ls->linenumber; if(ls->lookahead.token!=TK_EOS){ ls->t=ls->lookahead; ls->lookahead.token=TK_EOS; } else ls->t.token=llex(ls,&ls->t.seminfo); } static void luaX_lookahead(LexState*ls){ ls->lookahead.token=llex(ls,&ls->lookahead.seminfo); } #define hasjumps(e)((e)->t!=(e)->f) static int isnumeral(expdesc*e){ return(e->k==VKNUM&&e->t==(-1)&&e->f==(-1)); } static void luaK_nil(FuncState*fs,int from,int n){ Instruction*previous; if(fs->pc>fs->lasttarget){ if(fs->pc==0){ if(from>=fs->nactvar) return; } else{ previous=&fs->f->code[fs->pc-1]; if(GET_OPCODE(*previous)==OP_LOADNIL){ int pfrom=GETARG_A(*previous); int pto=GETARG_B(*previous); if(pfrom<=from&&from<=pto+1){ if(from+n-1>pto) SETARG_B(*previous,from+n-1); return; } } } } luaK_codeABC(fs,OP_LOADNIL,from,from+n-1,0); } static int luaK_jump(FuncState*fs){ int jpc=fs->jpc; int j; fs->jpc=(-1); j=luaK_codeAsBx(fs,OP_JMP,0,(-1)); luaK_concat(fs,&j,jpc); return j; } static void luaK_ret(FuncState*fs,int first,int nret){ luaK_codeABC(fs,OP_RETURN,first,nret+1,0); } static int condjump(FuncState*fs,OpCode op,int A,int B,int C){ luaK_codeABC(fs,op,A,B,C); return luaK_jump(fs); } static void fixjump(FuncState*fs,int pc,int dest){ Instruction*jmp=&fs->f->code[pc]; int offset=dest-(pc+1); if(abs(offset)>(((1<<(9+9))-1)>>1)) luaX_syntaxerror(fs->ls,"control structure too long"); SETARG_sBx(*jmp,offset); } static int luaK_getlabel(FuncState*fs){ fs->lasttarget=fs->pc; return fs->pc; } static int getjump(FuncState*fs,int pc){ int offset=GETARG_sBx(fs->f->code[pc]); if(offset==(-1)) return(-1); else return(pc+1)+offset; } static Instruction*getjumpcontrol(FuncState*fs,int pc){ Instruction*pi=&fs->f->code[pc]; if(pc>=1&&testTMode(GET_OPCODE(*(pi-1)))) return pi-1; else return pi; } static int need_value(FuncState*fs,int list){ for(;list!=(-1);list=getjump(fs,list)){ Instruction i=*getjumpcontrol(fs,list); if(GET_OPCODE(i)!=OP_TESTSET)return 1; } return 0; } static int patchtestreg(FuncState*fs,int node,int reg){ Instruction*i=getjumpcontrol(fs,node); if(GET_OPCODE(*i)!=OP_TESTSET) return 0; if(reg!=((1<<8)-1)&®!=GETARG_B(*i)) SETARG_A(*i,reg); else *i=CREATE_ABC(OP_TEST,GETARG_B(*i),0,GETARG_C(*i)); return 1; } static void removevalues(FuncState*fs,int list){ for(;list!=(-1);list=getjump(fs,list)) patchtestreg(fs,list,((1<<8)-1)); } static void patchlistaux(FuncState*fs,int list,int vtarget,int reg, int dtarget){ while(list!=(-1)){ int next=getjump(fs,list); if(patchtestreg(fs,list,reg)) fixjump(fs,list,vtarget); else fixjump(fs,list,dtarget); list=next; } } static void dischargejpc(FuncState*fs){ patchlistaux(fs,fs->jpc,fs->pc,((1<<8)-1),fs->pc); fs->jpc=(-1); } static void luaK_patchlist(FuncState*fs,int list,int target){ if(target==fs->pc) luaK_patchtohere(fs,list); else{ patchlistaux(fs,list,target,((1<<8)-1),target); } } static void luaK_patchtohere(FuncState*fs,int list){ luaK_getlabel(fs); luaK_concat(fs,&fs->jpc,list); } static void luaK_concat(FuncState*fs,int*l1,int l2){ if(l2==(-1))return; else if(*l1==(-1)) *l1=l2; else{ int list=*l1; int next; while((next=getjump(fs,list))!=(-1)) list=next; fixjump(fs,list,l2); } } static void luaK_checkstack(FuncState*fs,int n){ int newstack=fs->freereg+n; if(newstack>fs->f->maxstacksize){ if(newstack>=250) luaX_syntaxerror(fs->ls,"function or expression too complex"); fs->f->maxstacksize=cast_byte(newstack); } } static void luaK_reserveregs(FuncState*fs,int n){ luaK_checkstack(fs,n); fs->freereg+=n; } static void freereg(FuncState*fs,int reg){ if(!ISK(reg)&®>=fs->nactvar){ fs->freereg--; } } static void freeexp(FuncState*fs,expdesc*e){ if(e->k==VNONRELOC) freereg(fs,e->u.s.info); } static int addk(FuncState*fs,TValue*k,TValue*v){ lua_State*L=fs->L; TValue*idx=luaH_set(L,fs->h,k); Proto*f=fs->f; int oldsize=f->sizek; if(ttisnumber(idx)){ return cast_int(nvalue(idx)); } else{ setnvalue(idx,cast_num(fs->nk)); luaM_growvector(L,f->k,fs->nk,f->sizek,TValue, ((1<<(9+9))-1),"constant table overflow"); while(oldsizesizek)setnilvalue(&f->k[oldsize++]); setobj(L,&f->k[fs->nk],v); luaC_barrier(L,f,v); return fs->nk++; } } static int luaK_stringK(FuncState*fs,TString*s){ TValue o; setsvalue(fs->L,&o,s); return addk(fs,&o,&o); } static int luaK_numberK(FuncState*fs,lua_Number r){ TValue o; setnvalue(&o,r); return addk(fs,&o,&o); } static int boolK(FuncState*fs,int b){ TValue o; setbvalue(&o,b); return addk(fs,&o,&o); } static int nilK(FuncState*fs){ TValue k,v; setnilvalue(&v); sethvalue(fs->L,&k,fs->h); return addk(fs,&k,&v); } static void luaK_setreturns(FuncState*fs,expdesc*e,int nresults){ if(e->k==VCALL){ SETARG_C(getcode(fs,e),nresults+1); } else if(e->k==VVARARG){ SETARG_B(getcode(fs,e),nresults+1); SETARG_A(getcode(fs,e),fs->freereg); luaK_reserveregs(fs,1); } } static void luaK_setoneret(FuncState*fs,expdesc*e){ if(e->k==VCALL){ e->k=VNONRELOC; e->u.s.info=GETARG_A(getcode(fs,e)); } else if(e->k==VVARARG){ SETARG_B(getcode(fs,e),2); e->k=VRELOCABLE; } } static void luaK_dischargevars(FuncState*fs,expdesc*e){ switch(e->k){ case VLOCAL:{ e->k=VNONRELOC; break; } case VUPVAL:{ e->u.s.info=luaK_codeABC(fs,OP_GETUPVAL,0,e->u.s.info,0); e->k=VRELOCABLE; break; } case VGLOBAL:{ e->u.s.info=luaK_codeABx(fs,OP_GETGLOBAL,0,e->u.s.info); e->k=VRELOCABLE; break; } case VINDEXED:{ freereg(fs,e->u.s.aux); freereg(fs,e->u.s.info); e->u.s.info=luaK_codeABC(fs,OP_GETTABLE,0,e->u.s.info,e->u.s.aux); e->k=VRELOCABLE; break; } case VVARARG: case VCALL:{ luaK_setoneret(fs,e); break; } default:break; } } static int code_label(FuncState*fs,int A,int b,int jump){ luaK_getlabel(fs); return luaK_codeABC(fs,OP_LOADBOOL,A,b,jump); } static void discharge2reg(FuncState*fs,expdesc*e,int reg){ luaK_dischargevars(fs,e); switch(e->k){ case VNIL:{ luaK_nil(fs,reg,1); break; } case VFALSE:case VTRUE:{ luaK_codeABC(fs,OP_LOADBOOL,reg,e->k==VTRUE,0); break; } case VK:{ luaK_codeABx(fs,OP_LOADK,reg,e->u.s.info); break; } case VKNUM:{ luaK_codeABx(fs,OP_LOADK,reg,luaK_numberK(fs,e->u.nval)); break; } case VRELOCABLE:{ Instruction*pc=&getcode(fs,e); SETARG_A(*pc,reg); break; } case VNONRELOC:{ if(reg!=e->u.s.info) luaK_codeABC(fs,OP_MOVE,reg,e->u.s.info,0); break; } default:{ return; } } e->u.s.info=reg; e->k=VNONRELOC; } static void discharge2anyreg(FuncState*fs,expdesc*e){ if(e->k!=VNONRELOC){ luaK_reserveregs(fs,1); discharge2reg(fs,e,fs->freereg-1); } } static void exp2reg(FuncState*fs,expdesc*e,int reg){ discharge2reg(fs,e,reg); if(e->k==VJMP) luaK_concat(fs,&e->t,e->u.s.info); if(hasjumps(e)){ int final; int p_f=(-1); int p_t=(-1); if(need_value(fs,e->t)||need_value(fs,e->f)){ int fj=(e->k==VJMP)?(-1):luaK_jump(fs); p_f=code_label(fs,reg,0,1); p_t=code_label(fs,reg,1,0); luaK_patchtohere(fs,fj); } final=luaK_getlabel(fs); patchlistaux(fs,e->f,final,reg,p_f); patchlistaux(fs,e->t,final,reg,p_t); } e->f=e->t=(-1); e->u.s.info=reg; e->k=VNONRELOC; } static void luaK_exp2nextreg(FuncState*fs,expdesc*e){ luaK_dischargevars(fs,e); freeexp(fs,e); luaK_reserveregs(fs,1); exp2reg(fs,e,fs->freereg-1); } static int luaK_exp2anyreg(FuncState*fs,expdesc*e){ luaK_dischargevars(fs,e); if(e->k==VNONRELOC){ if(!hasjumps(e))return e->u.s.info; if(e->u.s.info>=fs->nactvar){ exp2reg(fs,e,e->u.s.info); return e->u.s.info; } } luaK_exp2nextreg(fs,e); return e->u.s.info; } static void luaK_exp2val(FuncState*fs,expdesc*e){ if(hasjumps(e)) luaK_exp2anyreg(fs,e); else luaK_dischargevars(fs,e); } static int luaK_exp2RK(FuncState*fs,expdesc*e){ luaK_exp2val(fs,e); switch(e->k){ case VKNUM: case VTRUE: case VFALSE: case VNIL:{ if(fs->nk<=((1<<(9-1))-1)){ e->u.s.info=(e->k==VNIL)?nilK(fs): (e->k==VKNUM)?luaK_numberK(fs,e->u.nval): boolK(fs,(e->k==VTRUE)); e->k=VK; return RKASK(e->u.s.info); } else break; } case VK:{ if(e->u.s.info<=((1<<(9-1))-1)) return RKASK(e->u.s.info); else break; } default:break; } return luaK_exp2anyreg(fs,e); } static void luaK_storevar(FuncState*fs,expdesc*var,expdesc*ex){ switch(var->k){ case VLOCAL:{ freeexp(fs,ex); exp2reg(fs,ex,var->u.s.info); return; } case VUPVAL:{ int e=luaK_exp2anyreg(fs,ex); luaK_codeABC(fs,OP_SETUPVAL,e,var->u.s.info,0); break; } case VGLOBAL:{ int e=luaK_exp2anyreg(fs,ex); luaK_codeABx(fs,OP_SETGLOBAL,e,var->u.s.info); break; } case VINDEXED:{ int e=luaK_exp2RK(fs,ex); luaK_codeABC(fs,OP_SETTABLE,var->u.s.info,var->u.s.aux,e); break; } default:{ break; } } freeexp(fs,ex); } static void luaK_self(FuncState*fs,expdesc*e,expdesc*key){ int func; luaK_exp2anyreg(fs,e); freeexp(fs,e); func=fs->freereg; luaK_reserveregs(fs,2); luaK_codeABC(fs,OP_SELF,func,e->u.s.info,luaK_exp2RK(fs,key)); freeexp(fs,key); e->u.s.info=func; e->k=VNONRELOC; } static void invertjump(FuncState*fs,expdesc*e){ Instruction*pc=getjumpcontrol(fs,e->u.s.info); SETARG_A(*pc,!(GETARG_A(*pc))); } static int jumponcond(FuncState*fs,expdesc*e,int cond){ if(e->k==VRELOCABLE){ Instruction ie=getcode(fs,e); if(GET_OPCODE(ie)==OP_NOT){ fs->pc--; return condjump(fs,OP_TEST,GETARG_B(ie),0,!cond); } } discharge2anyreg(fs,e); freeexp(fs,e); return condjump(fs,OP_TESTSET,((1<<8)-1),e->u.s.info,cond); } static void luaK_goiftrue(FuncState*fs,expdesc*e){ int pc; luaK_dischargevars(fs,e); switch(e->k){ case VK:case VKNUM:case VTRUE:{ pc=(-1); break; } case VJMP:{ invertjump(fs,e); pc=e->u.s.info; break; } default:{ pc=jumponcond(fs,e,0); break; } } luaK_concat(fs,&e->f,pc); luaK_patchtohere(fs,e->t); e->t=(-1); } static void luaK_goiffalse(FuncState*fs,expdesc*e){ int pc; luaK_dischargevars(fs,e); switch(e->k){ case VNIL:case VFALSE:{ pc=(-1); break; } case VJMP:{ pc=e->u.s.info; break; } default:{ pc=jumponcond(fs,e,1); break; } } luaK_concat(fs,&e->t,pc); luaK_patchtohere(fs,e->f); e->f=(-1); } static void codenot(FuncState*fs,expdesc*e){ luaK_dischargevars(fs,e); switch(e->k){ case VNIL:case VFALSE:{ e->k=VTRUE; break; } case VK:case VKNUM:case VTRUE:{ e->k=VFALSE; break; } case VJMP:{ invertjump(fs,e); break; } case VRELOCABLE: case VNONRELOC:{ discharge2anyreg(fs,e); freeexp(fs,e); e->u.s.info=luaK_codeABC(fs,OP_NOT,0,e->u.s.info,0); e->k=VRELOCABLE; break; } default:{ break; } } {int temp=e->f;e->f=e->t;e->t=temp;} removevalues(fs,e->f); removevalues(fs,e->t); } static void luaK_indexed(FuncState*fs,expdesc*t,expdesc*k){ t->u.s.aux=luaK_exp2RK(fs,k); t->k=VINDEXED; } static int constfolding(OpCode op,expdesc*e1,expdesc*e2){ lua_Number v1,v2,r; if(!isnumeral(e1)||!isnumeral(e2))return 0; v1=e1->u.nval; v2=e2->u.nval; switch(op){ case OP_ADD:r=luai_numadd(v1,v2);break; case OP_SUB:r=luai_numsub(v1,v2);break; case OP_MUL:r=luai_nummul(v1,v2);break; case OP_DIV: if(v2==0)return 0; r=luai_numdiv(v1,v2);break; case OP_MOD: if(v2==0)return 0; r=luai_nummod(v1,v2);break; case OP_POW:r=luai_numpow(v1,v2);break; case OP_UNM:r=luai_numunm(v1);break; case OP_LEN:return 0; default:r=0;break; } if(luai_numisnan(r))return 0; e1->u.nval=r; return 1; } static void codearith(FuncState*fs,OpCode op,expdesc*e1,expdesc*e2){ if(constfolding(op,e1,e2)) return; else{ int o2=(op!=OP_UNM&&op!=OP_LEN)?luaK_exp2RK(fs,e2):0; int o1=luaK_exp2RK(fs,e1); if(o1>o2){ freeexp(fs,e1); freeexp(fs,e2); } else{ freeexp(fs,e2); freeexp(fs,e1); } e1->u.s.info=luaK_codeABC(fs,op,0,o1,o2); e1->k=VRELOCABLE; } } static void codecomp(FuncState*fs,OpCode op,int cond,expdesc*e1, expdesc*e2){ int o1=luaK_exp2RK(fs,e1); int o2=luaK_exp2RK(fs,e2); freeexp(fs,e2); freeexp(fs,e1); if(cond==0&&op!=OP_EQ){ int temp; temp=o1;o1=o2;o2=temp; cond=1; } e1->u.s.info=condjump(fs,op,cond,o1,o2); e1->k=VJMP; } static void luaK_prefix(FuncState*fs,UnOpr op,expdesc*e){ expdesc e2; e2.t=e2.f=(-1);e2.k=VKNUM;e2.u.nval=0; switch(op){ case OPR_MINUS:{ if(!isnumeral(e)) luaK_exp2anyreg(fs,e); codearith(fs,OP_UNM,e,&e2); break; } case OPR_NOT:codenot(fs,e);break; case OPR_LEN:{ luaK_exp2anyreg(fs,e); codearith(fs,OP_LEN,e,&e2); break; } default:; } } static void luaK_infix(FuncState*fs,BinOpr op,expdesc*v){ switch(op){ case OPR_AND:{ luaK_goiftrue(fs,v); break; } case OPR_OR:{ luaK_goiffalse(fs,v); break; } case OPR_CONCAT:{ luaK_exp2nextreg(fs,v); break; } case OPR_ADD:case OPR_SUB:case OPR_MUL:case OPR_DIV: case OPR_MOD:case OPR_POW:{ if(!isnumeral(v))luaK_exp2RK(fs,v); break; } default:{ luaK_exp2RK(fs,v); break; } } } static void luaK_posfix(FuncState*fs,BinOpr op,expdesc*e1,expdesc*e2){ switch(op){ case OPR_AND:{ luaK_dischargevars(fs,e2); luaK_concat(fs,&e2->f,e1->f); *e1=*e2; break; } case OPR_OR:{ luaK_dischargevars(fs,e2); luaK_concat(fs,&e2->t,e1->t); *e1=*e2; break; } case OPR_CONCAT:{ luaK_exp2val(fs,e2); if(e2->k==VRELOCABLE&&GET_OPCODE(getcode(fs,e2))==OP_CONCAT){ freeexp(fs,e1); SETARG_B(getcode(fs,e2),e1->u.s.info); e1->k=VRELOCABLE;e1->u.s.info=e2->u.s.info; } else{ luaK_exp2nextreg(fs,e2); codearith(fs,OP_CONCAT,e1,e2); } break; } case OPR_ADD:codearith(fs,OP_ADD,e1,e2);break; case OPR_SUB:codearith(fs,OP_SUB,e1,e2);break; case OPR_MUL:codearith(fs,OP_MUL,e1,e2);break; case OPR_DIV:codearith(fs,OP_DIV,e1,e2);break; case OPR_MOD:codearith(fs,OP_MOD,e1,e2);break; case OPR_POW:codearith(fs,OP_POW,e1,e2);break; case OPR_EQ:codecomp(fs,OP_EQ,1,e1,e2);break; case OPR_NE:codecomp(fs,OP_EQ,0,e1,e2);break; case OPR_LT:codecomp(fs,OP_LT,1,e1,e2);break; case OPR_LE:codecomp(fs,OP_LE,1,e1,e2);break; case OPR_GT:codecomp(fs,OP_LT,0,e1,e2);break; case OPR_GE:codecomp(fs,OP_LE,0,e1,e2);break; default:; } } static void luaK_fixline(FuncState*fs,int line){ fs->f->lineinfo[fs->pc-1]=line; } static int luaK_code(FuncState*fs,Instruction i,int line){ Proto*f=fs->f; dischargejpc(fs); luaM_growvector(fs->L,f->code,fs->pc,f->sizecode,Instruction, (INT_MAX-2),"code size overflow"); f->code[fs->pc]=i; luaM_growvector(fs->L,f->lineinfo,fs->pc,f->sizelineinfo,int, (INT_MAX-2),"code size overflow"); f->lineinfo[fs->pc]=line; return fs->pc++; } static int luaK_codeABC(FuncState*fs,OpCode o,int a,int b,int c){ return luaK_code(fs,CREATE_ABC(o,a,b,c),fs->ls->lastline); } static int luaK_codeABx(FuncState*fs,OpCode o,int a,unsigned int bc){ return luaK_code(fs,CREATE_ABx(o,a,bc),fs->ls->lastline); } static void luaK_setlist(FuncState*fs,int base,int nelems,int tostore){ int c=(nelems-1)/50+1; int b=(tostore==(-1))?0:tostore; if(c<=((1<<9)-1)) luaK_codeABC(fs,OP_SETLIST,base,b,c); else{ luaK_codeABC(fs,OP_SETLIST,base,b,0); luaK_code(fs,cast(Instruction,c),fs->ls->lastline); } fs->freereg=base+1; } #define hasmultret(k)((k)==VCALL||(k)==VVARARG) #define getlocvar(fs,i)((fs)->f->locvars[(fs)->actvar[i]]) #define luaY_checklimit(fs,v,l,m)if((v)>(l))errorlimit(fs,l,m) typedef struct BlockCnt{ struct BlockCnt*previous; int breaklist; lu_byte nactvar; lu_byte upval; lu_byte isbreakable; }BlockCnt; static void chunk(LexState*ls); static void expr(LexState*ls,expdesc*v); static void anchor_token(LexState*ls){ if(ls->t.token==TK_NAME||ls->t.token==TK_STRING){ TString*ts=ls->t.seminfo.ts; luaX_newstring(ls,getstr(ts),ts->tsv.len); } } static void error_expected(LexState*ls,int token){ luaX_syntaxerror(ls, luaO_pushfstring(ls->L,LUA_QL("%s")" expected",luaX_token2str(ls,token))); } static void errorlimit(FuncState*fs,int limit,const char*what){ const char*msg=(fs->f->linedefined==0)? luaO_pushfstring(fs->L,"main function has more than %d %s",limit,what): luaO_pushfstring(fs->L,"function at line %d has more than %d %s", fs->f->linedefined,limit,what); luaX_lexerror(fs->ls,msg,0); } static int testnext(LexState*ls,int c){ if(ls->t.token==c){ luaX_next(ls); return 1; } else return 0; } static void check(LexState*ls,int c){ if(ls->t.token!=c) error_expected(ls,c); } static void checknext(LexState*ls,int c){ check(ls,c); luaX_next(ls); } #define check_condition(ls,c,msg){if(!(c))luaX_syntaxerror(ls,msg);} static void check_match(LexState*ls,int what,int who,int where){ if(!testnext(ls,what)){ if(where==ls->linenumber) error_expected(ls,what); else{ luaX_syntaxerror(ls,luaO_pushfstring(ls->L, LUA_QL("%s")" expected (to close "LUA_QL("%s")" at line %d)", luaX_token2str(ls,what),luaX_token2str(ls,who),where)); } } } static TString*str_checkname(LexState*ls){ TString*ts; check(ls,TK_NAME); ts=ls->t.seminfo.ts; luaX_next(ls); return ts; } static void init_exp(expdesc*e,expkind k,int i){ e->f=e->t=(-1); e->k=k; e->u.s.info=i; } static void codestring(LexState*ls,expdesc*e,TString*s){ init_exp(e,VK,luaK_stringK(ls->fs,s)); } static void checkname(LexState*ls,expdesc*e){ codestring(ls,e,str_checkname(ls)); } static int registerlocalvar(LexState*ls,TString*varname){ FuncState*fs=ls->fs; Proto*f=fs->f; int oldsize=f->sizelocvars; luaM_growvector(ls->L,f->locvars,fs->nlocvars,f->sizelocvars, LocVar,SHRT_MAX,"too many local variables"); while(oldsizesizelocvars)f->locvars[oldsize++].varname=NULL; f->locvars[fs->nlocvars].varname=varname; luaC_objbarrier(ls->L,f,varname); return fs->nlocvars++; } #define new_localvarliteral(ls,v,n)new_localvar(ls,luaX_newstring(ls,""v,(sizeof(v)/sizeof(char))-1),n) static void new_localvar(LexState*ls,TString*name,int n){ FuncState*fs=ls->fs; luaY_checklimit(fs,fs->nactvar+n+1,200,"local variables"); fs->actvar[fs->nactvar+n]=cast(unsigned short,registerlocalvar(ls,name)); } static void adjustlocalvars(LexState*ls,int nvars){ FuncState*fs=ls->fs; fs->nactvar=cast_byte(fs->nactvar+nvars); for(;nvars;nvars--){ getlocvar(fs,fs->nactvar-nvars).startpc=fs->pc; } } static void removevars(LexState*ls,int tolevel){ FuncState*fs=ls->fs; while(fs->nactvar>tolevel) getlocvar(fs,--fs->nactvar).endpc=fs->pc; } static int indexupvalue(FuncState*fs,TString*name,expdesc*v){ int i; Proto*f=fs->f; int oldsize=f->sizeupvalues; for(i=0;inups;i++){ if(fs->upvalues[i].k==v->k&&fs->upvalues[i].info==v->u.s.info){ return i; } } luaY_checklimit(fs,f->nups+1,60,"upvalues"); luaM_growvector(fs->L,f->upvalues,f->nups,f->sizeupvalues, TString*,(INT_MAX-2),""); while(oldsizesizeupvalues)f->upvalues[oldsize++]=NULL; f->upvalues[f->nups]=name; luaC_objbarrier(fs->L,f,name); fs->upvalues[f->nups].k=cast_byte(v->k); fs->upvalues[f->nups].info=cast_byte(v->u.s.info); return f->nups++; } static int searchvar(FuncState*fs,TString*n){ int i; for(i=fs->nactvar-1;i>=0;i--){ if(n==getlocvar(fs,i).varname) return i; } return-1; } static void markupval(FuncState*fs,int level){ BlockCnt*bl=fs->bl; while(bl&&bl->nactvar>level)bl=bl->previous; if(bl)bl->upval=1; } static int singlevaraux(FuncState*fs,TString*n,expdesc*var,int base){ if(fs==NULL){ init_exp(var,VGLOBAL,((1<<8)-1)); return VGLOBAL; } else{ int v=searchvar(fs,n); if(v>=0){ init_exp(var,VLOCAL,v); if(!base) markupval(fs,v); return VLOCAL; } else{ if(singlevaraux(fs->prev,n,var,0)==VGLOBAL) return VGLOBAL; var->u.s.info=indexupvalue(fs,n,var); var->k=VUPVAL; return VUPVAL; } } } static void singlevar(LexState*ls,expdesc*var){ TString*varname=str_checkname(ls); FuncState*fs=ls->fs; if(singlevaraux(fs,varname,var,1)==VGLOBAL) var->u.s.info=luaK_stringK(fs,varname); } static void adjust_assign(LexState*ls,int nvars,int nexps,expdesc*e){ FuncState*fs=ls->fs; int extra=nvars-nexps; if(hasmultret(e->k)){ extra++; if(extra<0)extra=0; luaK_setreturns(fs,e,extra); if(extra>1)luaK_reserveregs(fs,extra-1); } else{ if(e->k!=VVOID)luaK_exp2nextreg(fs,e); if(extra>0){ int reg=fs->freereg; luaK_reserveregs(fs,extra); luaK_nil(fs,reg,extra); } } } static void enterlevel(LexState*ls){ if(++ls->L->nCcalls>200) luaX_lexerror(ls,"chunk has too many syntax levels",0); } #define leavelevel(ls)((ls)->L->nCcalls--) static void enterblock(FuncState*fs,BlockCnt*bl,lu_byte isbreakable){ bl->breaklist=(-1); bl->isbreakable=isbreakable; bl->nactvar=fs->nactvar; bl->upval=0; bl->previous=fs->bl; fs->bl=bl; } static void leaveblock(FuncState*fs){ BlockCnt*bl=fs->bl; fs->bl=bl->previous; removevars(fs->ls,bl->nactvar); if(bl->upval) luaK_codeABC(fs,OP_CLOSE,bl->nactvar,0,0); fs->freereg=fs->nactvar; luaK_patchtohere(fs,bl->breaklist); } static void pushclosure(LexState*ls,FuncState*func,expdesc*v){ FuncState*fs=ls->fs; Proto*f=fs->f; int oldsize=f->sizep; int i; luaM_growvector(ls->L,f->p,fs->np,f->sizep,Proto*, ((1<<(9+9))-1),"constant table overflow"); while(oldsizesizep)f->p[oldsize++]=NULL; f->p[fs->np++]=func->f; luaC_objbarrier(ls->L,f,func->f); init_exp(v,VRELOCABLE,luaK_codeABx(fs,OP_CLOSURE,0,fs->np-1)); for(i=0;if->nups;i++){ OpCode o=(func->upvalues[i].k==VLOCAL)?OP_MOVE:OP_GETUPVAL; luaK_codeABC(fs,o,0,func->upvalues[i].info,0); } } static void open_func(LexState*ls,FuncState*fs){ lua_State*L=ls->L; Proto*f=luaF_newproto(L); fs->f=f; fs->prev=ls->fs; fs->ls=ls; fs->L=L; ls->fs=fs; fs->pc=0; fs->lasttarget=-1; fs->jpc=(-1); fs->freereg=0; fs->nk=0; fs->np=0; fs->nlocvars=0; fs->nactvar=0; fs->bl=NULL; f->source=ls->source; f->maxstacksize=2; fs->h=luaH_new(L,0,0); sethvalue(L,L->top,fs->h); incr_top(L); setptvalue(L,L->top,f); incr_top(L); } static void close_func(LexState*ls){ lua_State*L=ls->L; FuncState*fs=ls->fs; Proto*f=fs->f; removevars(ls,0); luaK_ret(fs,0,0); luaM_reallocvector(L,f->code,f->sizecode,fs->pc,Instruction); f->sizecode=fs->pc; luaM_reallocvector(L,f->lineinfo,f->sizelineinfo,fs->pc,int); f->sizelineinfo=fs->pc; luaM_reallocvector(L,f->k,f->sizek,fs->nk,TValue); f->sizek=fs->nk; luaM_reallocvector(L,f->p,f->sizep,fs->np,Proto*); f->sizep=fs->np; luaM_reallocvector(L,f->locvars,f->sizelocvars,fs->nlocvars,LocVar); f->sizelocvars=fs->nlocvars; luaM_reallocvector(L,f->upvalues,f->sizeupvalues,f->nups,TString*); f->sizeupvalues=f->nups; ls->fs=fs->prev; if(fs)anchor_token(ls); L->top-=2; } static Proto*luaY_parser(lua_State*L,ZIO*z,Mbuffer*buff,const char*name){ struct LexState lexstate; struct FuncState funcstate; lexstate.buff=buff; luaX_setinput(L,&lexstate,z,luaS_new(L,name)); open_func(&lexstate,&funcstate); funcstate.f->is_vararg=2; luaX_next(&lexstate); chunk(&lexstate); check(&lexstate,TK_EOS); close_func(&lexstate); return funcstate.f; } static void field(LexState*ls,expdesc*v){ FuncState*fs=ls->fs; expdesc key; luaK_exp2anyreg(fs,v); luaX_next(ls); checkname(ls,&key); luaK_indexed(fs,v,&key); } static void yindex(LexState*ls,expdesc*v){ luaX_next(ls); expr(ls,v); luaK_exp2val(ls->fs,v); checknext(ls,']'); } struct ConsControl{ expdesc v; expdesc*t; int nh; int na; int tostore; }; static void recfield(LexState*ls,struct ConsControl*cc){ FuncState*fs=ls->fs; int reg=ls->fs->freereg; expdesc key,val; int rkkey; if(ls->t.token==TK_NAME){ luaY_checklimit(fs,cc->nh,(INT_MAX-2),"items in a constructor"); checkname(ls,&key); } else yindex(ls,&key); cc->nh++; checknext(ls,'='); rkkey=luaK_exp2RK(fs,&key); expr(ls,&val); luaK_codeABC(fs,OP_SETTABLE,cc->t->u.s.info,rkkey,luaK_exp2RK(fs,&val)); fs->freereg=reg; } static void closelistfield(FuncState*fs,struct ConsControl*cc){ if(cc->v.k==VVOID)return; luaK_exp2nextreg(fs,&cc->v); cc->v.k=VVOID; if(cc->tostore==50){ luaK_setlist(fs,cc->t->u.s.info,cc->na,cc->tostore); cc->tostore=0; } } static void lastlistfield(FuncState*fs,struct ConsControl*cc){ if(cc->tostore==0)return; if(hasmultret(cc->v.k)){ luaK_setmultret(fs,&cc->v); luaK_setlist(fs,cc->t->u.s.info,cc->na,(-1)); cc->na--; } else{ if(cc->v.k!=VVOID) luaK_exp2nextreg(fs,&cc->v); luaK_setlist(fs,cc->t->u.s.info,cc->na,cc->tostore); } } static void listfield(LexState*ls,struct ConsControl*cc){ expr(ls,&cc->v); luaY_checklimit(ls->fs,cc->na,(INT_MAX-2),"items in a constructor"); cc->na++; cc->tostore++; } static void constructor(LexState*ls,expdesc*t){ FuncState*fs=ls->fs; int line=ls->linenumber; int pc=luaK_codeABC(fs,OP_NEWTABLE,0,0,0); struct ConsControl cc; cc.na=cc.nh=cc.tostore=0; cc.t=t; init_exp(t,VRELOCABLE,pc); init_exp(&cc.v,VVOID,0); luaK_exp2nextreg(ls->fs,t); checknext(ls,'{'); do{ if(ls->t.token=='}')break; closelistfield(fs,&cc); switch(ls->t.token){ case TK_NAME:{ luaX_lookahead(ls); if(ls->lookahead.token!='=') listfield(ls,&cc); else recfield(ls,&cc); break; } case'[':{ recfield(ls,&cc); break; } default:{ listfield(ls,&cc); break; } } }while(testnext(ls,',')||testnext(ls,';')); check_match(ls,'}','{',line); lastlistfield(fs,&cc); SETARG_B(fs->f->code[pc],luaO_int2fb(cc.na)); SETARG_C(fs->f->code[pc],luaO_int2fb(cc.nh)); } static void parlist(LexState*ls){ FuncState*fs=ls->fs; Proto*f=fs->f; int nparams=0; f->is_vararg=0; if(ls->t.token!=')'){ do{ switch(ls->t.token){ case TK_NAME:{ new_localvar(ls,str_checkname(ls),nparams++); break; } case TK_DOTS:{ luaX_next(ls); f->is_vararg|=2; break; } default:luaX_syntaxerror(ls," or "LUA_QL("...")" expected"); } }while(!f->is_vararg&&testnext(ls,',')); } adjustlocalvars(ls,nparams); f->numparams=cast_byte(fs->nactvar-(f->is_vararg&1)); luaK_reserveregs(fs,fs->nactvar); } static void body(LexState*ls,expdesc*e,int needself,int line){ FuncState new_fs; open_func(ls,&new_fs); new_fs.f->linedefined=line; checknext(ls,'('); if(needself){ new_localvarliteral(ls,"self",0); adjustlocalvars(ls,1); } parlist(ls); checknext(ls,')'); chunk(ls); new_fs.f->lastlinedefined=ls->linenumber; check_match(ls,TK_END,TK_FUNCTION,line); close_func(ls); pushclosure(ls,&new_fs,e); } static int explist1(LexState*ls,expdesc*v){ int n=1; expr(ls,v); while(testnext(ls,',')){ luaK_exp2nextreg(ls->fs,v); expr(ls,v); n++; } return n; } static void funcargs(LexState*ls,expdesc*f){ FuncState*fs=ls->fs; expdesc args; int base,nparams; int line=ls->linenumber; switch(ls->t.token){ case'(':{ if(line!=ls->lastline) luaX_syntaxerror(ls,"ambiguous syntax (function call x new statement)"); luaX_next(ls); if(ls->t.token==')') args.k=VVOID; else{ explist1(ls,&args); luaK_setmultret(fs,&args); } check_match(ls,')','(',line); break; } case'{':{ constructor(ls,&args); break; } case TK_STRING:{ codestring(ls,&args,ls->t.seminfo.ts); luaX_next(ls); break; } default:{ luaX_syntaxerror(ls,"function arguments expected"); return; } } base=f->u.s.info; if(hasmultret(args.k)) nparams=(-1); else{ if(args.k!=VVOID) luaK_exp2nextreg(fs,&args); nparams=fs->freereg-(base+1); } init_exp(f,VCALL,luaK_codeABC(fs,OP_CALL,base,nparams+1,2)); luaK_fixline(fs,line); fs->freereg=base+1; } static void prefixexp(LexState*ls,expdesc*v){ switch(ls->t.token){ case'(':{ int line=ls->linenumber; luaX_next(ls); expr(ls,v); check_match(ls,')','(',line); luaK_dischargevars(ls->fs,v); return; } case TK_NAME:{ singlevar(ls,v); return; } default:{ luaX_syntaxerror(ls,"unexpected symbol"); return; } } } static void primaryexp(LexState*ls,expdesc*v){ FuncState*fs=ls->fs; prefixexp(ls,v); for(;;){ switch(ls->t.token){ case'.':{ field(ls,v); break; } case'[':{ expdesc key; luaK_exp2anyreg(fs,v); yindex(ls,&key); luaK_indexed(fs,v,&key); break; } case':':{ expdesc key; luaX_next(ls); checkname(ls,&key); luaK_self(fs,v,&key); funcargs(ls,v); break; } case'(':case TK_STRING:case'{':{ luaK_exp2nextreg(fs,v); funcargs(ls,v); break; } default:return; } } } static void simpleexp(LexState*ls,expdesc*v){ switch(ls->t.token){ case TK_NUMBER:{ init_exp(v,VKNUM,0); v->u.nval=ls->t.seminfo.r; break; } case TK_STRING:{ codestring(ls,v,ls->t.seminfo.ts); break; } case TK_NIL:{ init_exp(v,VNIL,0); break; } case TK_TRUE:{ init_exp(v,VTRUE,0); break; } case TK_FALSE:{ init_exp(v,VFALSE,0); break; } case TK_DOTS:{ FuncState*fs=ls->fs; check_condition(ls,fs->f->is_vararg, "cannot use "LUA_QL("...")" outside a vararg function"); fs->f->is_vararg&=~4; init_exp(v,VVARARG,luaK_codeABC(fs,OP_VARARG,0,1,0)); break; } case'{':{ constructor(ls,v); return; } case TK_FUNCTION:{ luaX_next(ls); body(ls,v,0,ls->linenumber); return; } default:{ primaryexp(ls,v); return; } } luaX_next(ls); } static UnOpr getunopr(int op){ switch(op){ case TK_NOT:return OPR_NOT; case'-':return OPR_MINUS; case'#':return OPR_LEN; default:return OPR_NOUNOPR; } } static BinOpr getbinopr(int op){ switch(op){ case'+':return OPR_ADD; case'-':return OPR_SUB; case'*':return OPR_MUL; case'/':return OPR_DIV; case'%':return OPR_MOD; case'^':return OPR_POW; case TK_CONCAT:return OPR_CONCAT; case TK_NE:return OPR_NE; case TK_EQ:return OPR_EQ; case'<':return OPR_LT; case TK_LE:return OPR_LE; case'>':return OPR_GT; case TK_GE:return OPR_GE; case TK_AND:return OPR_AND; case TK_OR:return OPR_OR; default:return OPR_NOBINOPR; } } static const struct{ lu_byte left; lu_byte right; }priority[]={ {6,6},{6,6},{7,7},{7,7},{7,7}, {10,9},{5,4}, {3,3},{3,3}, {3,3},{3,3},{3,3},{3,3}, {2,2},{1,1} }; static BinOpr subexpr(LexState*ls,expdesc*v,unsigned int limit){ BinOpr op; UnOpr uop; enterlevel(ls); uop=getunopr(ls->t.token); if(uop!=OPR_NOUNOPR){ luaX_next(ls); subexpr(ls,v,8); luaK_prefix(ls->fs,uop,v); } else simpleexp(ls,v); op=getbinopr(ls->t.token); while(op!=OPR_NOBINOPR&&priority[op].left>limit){ expdesc v2; BinOpr nextop; luaX_next(ls); luaK_infix(ls->fs,op,v); nextop=subexpr(ls,&v2,priority[op].right); luaK_posfix(ls->fs,op,v,&v2); op=nextop; } leavelevel(ls); return op; } static void expr(LexState*ls,expdesc*v){ subexpr(ls,v,0); } static int block_follow(int token){ switch(token){ case TK_ELSE:case TK_ELSEIF:case TK_END: case TK_UNTIL:case TK_EOS: return 1; default:return 0; } } static void block(LexState*ls){ FuncState*fs=ls->fs; BlockCnt bl; enterblock(fs,&bl,0); chunk(ls); leaveblock(fs); } struct LHS_assign{ struct LHS_assign*prev; expdesc v; }; static void check_conflict(LexState*ls,struct LHS_assign*lh,expdesc*v){ FuncState*fs=ls->fs; int extra=fs->freereg; int conflict=0; for(;lh;lh=lh->prev){ if(lh->v.k==VINDEXED){ if(lh->v.u.s.info==v->u.s.info){ conflict=1; lh->v.u.s.info=extra; } if(lh->v.u.s.aux==v->u.s.info){ conflict=1; lh->v.u.s.aux=extra; } } } if(conflict){ luaK_codeABC(fs,OP_MOVE,fs->freereg,v->u.s.info,0); luaK_reserveregs(fs,1); } } static void assignment(LexState*ls,struct LHS_assign*lh,int nvars){ expdesc e; check_condition(ls,VLOCAL<=lh->v.k&&lh->v.k<=VINDEXED, "syntax error"); if(testnext(ls,',')){ struct LHS_assign nv; nv.prev=lh; primaryexp(ls,&nv.v); if(nv.v.k==VLOCAL) check_conflict(ls,lh,&nv.v); luaY_checklimit(ls->fs,nvars,200-ls->L->nCcalls, "variables in assignment"); assignment(ls,&nv,nvars+1); } else{ int nexps; checknext(ls,'='); nexps=explist1(ls,&e); if(nexps!=nvars){ adjust_assign(ls,nvars,nexps,&e); if(nexps>nvars) ls->fs->freereg-=nexps-nvars; } else{ luaK_setoneret(ls->fs,&e); luaK_storevar(ls->fs,&lh->v,&e); return; } } init_exp(&e,VNONRELOC,ls->fs->freereg-1); luaK_storevar(ls->fs,&lh->v,&e); } static int cond(LexState*ls){ expdesc v; expr(ls,&v); if(v.k==VNIL)v.k=VFALSE; luaK_goiftrue(ls->fs,&v); return v.f; } static void breakstat(LexState*ls){ FuncState*fs=ls->fs; BlockCnt*bl=fs->bl; int upval=0; while(bl&&!bl->isbreakable){ upval|=bl->upval; bl=bl->previous; } if(!bl) luaX_syntaxerror(ls,"no loop to break"); if(upval) luaK_codeABC(fs,OP_CLOSE,bl->nactvar,0,0); luaK_concat(fs,&bl->breaklist,luaK_jump(fs)); } static void whilestat(LexState*ls,int line){ FuncState*fs=ls->fs; int whileinit; int condexit; BlockCnt bl; luaX_next(ls); whileinit=luaK_getlabel(fs); condexit=cond(ls); enterblock(fs,&bl,1); checknext(ls,TK_DO); block(ls); luaK_patchlist(fs,luaK_jump(fs),whileinit); check_match(ls,TK_END,TK_WHILE,line); leaveblock(fs); luaK_patchtohere(fs,condexit); } static void repeatstat(LexState*ls,int line){ int condexit; FuncState*fs=ls->fs; int repeat_init=luaK_getlabel(fs); BlockCnt bl1,bl2; enterblock(fs,&bl1,1); enterblock(fs,&bl2,0); luaX_next(ls); chunk(ls); check_match(ls,TK_UNTIL,TK_REPEAT,line); condexit=cond(ls); if(!bl2.upval){ leaveblock(fs); luaK_patchlist(ls->fs,condexit,repeat_init); } else{ breakstat(ls); luaK_patchtohere(ls->fs,condexit); leaveblock(fs); luaK_patchlist(ls->fs,luaK_jump(fs),repeat_init); } leaveblock(fs); } static int exp1(LexState*ls){ expdesc e; int k; expr(ls,&e); k=e.k; luaK_exp2nextreg(ls->fs,&e); return k; } static void forbody(LexState*ls,int base,int line,int nvars,int isnum){ BlockCnt bl; FuncState*fs=ls->fs; int prep,endfor; adjustlocalvars(ls,3); checknext(ls,TK_DO); prep=isnum?luaK_codeAsBx(fs,OP_FORPREP,base,(-1)):luaK_jump(fs); enterblock(fs,&bl,0); adjustlocalvars(ls,nvars); luaK_reserveregs(fs,nvars); block(ls); leaveblock(fs); luaK_patchtohere(fs,prep); endfor=(isnum)?luaK_codeAsBx(fs,OP_FORLOOP,base,(-1)): luaK_codeABC(fs,OP_TFORLOOP,base,0,nvars); luaK_fixline(fs,line); luaK_patchlist(fs,(isnum?endfor:luaK_jump(fs)),prep+1); } static void fornum(LexState*ls,TString*varname,int line){ FuncState*fs=ls->fs; int base=fs->freereg; new_localvarliteral(ls,"(for index)",0); new_localvarliteral(ls,"(for limit)",1); new_localvarliteral(ls,"(for step)",2); new_localvar(ls,varname,3); checknext(ls,'='); exp1(ls); checknext(ls,','); exp1(ls); if(testnext(ls,',')) exp1(ls); else{ luaK_codeABx(fs,OP_LOADK,fs->freereg,luaK_numberK(fs,1)); luaK_reserveregs(fs,1); } forbody(ls,base,line,1,1); } static void forlist(LexState*ls,TString*indexname){ FuncState*fs=ls->fs; expdesc e; int nvars=0; int line; int base=fs->freereg; new_localvarliteral(ls,"(for generator)",nvars++); new_localvarliteral(ls,"(for state)",nvars++); new_localvarliteral(ls,"(for control)",nvars++); new_localvar(ls,indexname,nvars++); while(testnext(ls,',')) new_localvar(ls,str_checkname(ls),nvars++); checknext(ls,TK_IN); line=ls->linenumber; adjust_assign(ls,3,explist1(ls,&e),&e); luaK_checkstack(fs,3); forbody(ls,base,line,nvars-3,0); } static void forstat(LexState*ls,int line){ FuncState*fs=ls->fs; TString*varname; BlockCnt bl; enterblock(fs,&bl,1); luaX_next(ls); varname=str_checkname(ls); switch(ls->t.token){ case'=':fornum(ls,varname,line);break; case',':case TK_IN:forlist(ls,varname);break; default:luaX_syntaxerror(ls,LUA_QL("=")" or "LUA_QL("in")" expected"); } check_match(ls,TK_END,TK_FOR,line); leaveblock(fs); } static int test_then_block(LexState*ls){ int condexit; luaX_next(ls); condexit=cond(ls); checknext(ls,TK_THEN); block(ls); return condexit; } static void ifstat(LexState*ls,int line){ FuncState*fs=ls->fs; int flist; int escapelist=(-1); flist=test_then_block(ls); while(ls->t.token==TK_ELSEIF){ luaK_concat(fs,&escapelist,luaK_jump(fs)); luaK_patchtohere(fs,flist); flist=test_then_block(ls); } if(ls->t.token==TK_ELSE){ luaK_concat(fs,&escapelist,luaK_jump(fs)); luaK_patchtohere(fs,flist); luaX_next(ls); block(ls); } else luaK_concat(fs,&escapelist,flist); luaK_patchtohere(fs,escapelist); check_match(ls,TK_END,TK_IF,line); } static void localfunc(LexState*ls){ expdesc v,b; FuncState*fs=ls->fs; new_localvar(ls,str_checkname(ls),0); init_exp(&v,VLOCAL,fs->freereg); luaK_reserveregs(fs,1); adjustlocalvars(ls,1); body(ls,&b,0,ls->linenumber); luaK_storevar(fs,&v,&b); getlocvar(fs,fs->nactvar-1).startpc=fs->pc; } static void localstat(LexState*ls){ int nvars=0; int nexps; expdesc e; do{ new_localvar(ls,str_checkname(ls),nvars++); }while(testnext(ls,',')); if(testnext(ls,'=')) nexps=explist1(ls,&e); else{ e.k=VVOID; nexps=0; } adjust_assign(ls,nvars,nexps,&e); adjustlocalvars(ls,nvars); } static int funcname(LexState*ls,expdesc*v){ int needself=0; singlevar(ls,v); while(ls->t.token=='.') field(ls,v); if(ls->t.token==':'){ needself=1; field(ls,v); } return needself; } static void funcstat(LexState*ls,int line){ int needself; expdesc v,b; luaX_next(ls); needself=funcname(ls,&v); body(ls,&b,needself,line); luaK_storevar(ls->fs,&v,&b); luaK_fixline(ls->fs,line); } static void exprstat(LexState*ls){ FuncState*fs=ls->fs; struct LHS_assign v; primaryexp(ls,&v.v); if(v.v.k==VCALL) SETARG_C(getcode(fs,&v.v),1); else{ v.prev=NULL; assignment(ls,&v,1); } } static void retstat(LexState*ls){ FuncState*fs=ls->fs; expdesc e; int first,nret; luaX_next(ls); if(block_follow(ls->t.token)||ls->t.token==';') first=nret=0; else{ nret=explist1(ls,&e); if(hasmultret(e.k)){ luaK_setmultret(fs,&e); if(e.k==VCALL&&nret==1){ SET_OPCODE(getcode(fs,&e),OP_TAILCALL); } first=fs->nactvar; nret=(-1); } else{ if(nret==1) first=luaK_exp2anyreg(fs,&e); else{ luaK_exp2nextreg(fs,&e); first=fs->nactvar; } } } luaK_ret(fs,first,nret); } static int statement(LexState*ls){ int line=ls->linenumber; switch(ls->t.token){ case TK_IF:{ ifstat(ls,line); return 0; } case TK_WHILE:{ whilestat(ls,line); return 0; } case TK_DO:{ luaX_next(ls); block(ls); check_match(ls,TK_END,TK_DO,line); return 0; } case TK_FOR:{ forstat(ls,line); return 0; } case TK_REPEAT:{ repeatstat(ls,line); return 0; } case TK_FUNCTION:{ funcstat(ls,line); return 0; } case TK_LOCAL:{ luaX_next(ls); if(testnext(ls,TK_FUNCTION)) localfunc(ls); else localstat(ls); return 0; } case TK_RETURN:{ retstat(ls); return 1; } case TK_BREAK:{ luaX_next(ls); breakstat(ls); return 1; } default:{ exprstat(ls); return 0; } } } static void chunk(LexState*ls){ int islast=0; enterlevel(ls); while(!islast&&!block_follow(ls->t.token)){ islast=statement(ls); testnext(ls,';'); ls->fs->freereg=ls->fs->nactvar; } leavelevel(ls); } static const TValue*luaV_tonumber(const TValue*obj,TValue*n){ lua_Number num; if(ttisnumber(obj))return obj; if(ttisstring(obj)&&luaO_str2d(svalue(obj),&num)){ setnvalue(n,num); return n; } else return NULL; } static int luaV_tostring(lua_State*L,StkId obj){ if(!ttisnumber(obj)) return 0; else{ char s[32]; lua_Number n=nvalue(obj); lua_number2str(s,n); setsvalue(L,obj,luaS_new(L,s)); return 1; } } static void callTMres(lua_State*L,StkId res,const TValue*f, const TValue*p1,const TValue*p2){ ptrdiff_t result=savestack(L,res); setobj(L,L->top,f); setobj(L,L->top+1,p1); setobj(L,L->top+2,p2); luaD_checkstack(L,3); L->top+=3; luaD_call(L,L->top-3,1); res=restorestack(L,result); L->top--; setobj(L,res,L->top); } static void callTM(lua_State*L,const TValue*f,const TValue*p1, const TValue*p2,const TValue*p3){ setobj(L,L->top,f); setobj(L,L->top+1,p1); setobj(L,L->top+2,p2); setobj(L,L->top+3,p3); luaD_checkstack(L,4); L->top+=4; luaD_call(L,L->top-4,0); } static void luaV_gettable(lua_State*L,const TValue*t,TValue*key,StkId val){ int loop; for(loop=0;loop<100;loop++){ const TValue*tm; if(ttistable(t)){ Table*h=hvalue(t); const TValue*res=luaH_get(h,key); if(!ttisnil(res)|| (tm=fasttm(L,h->metatable,TM_INDEX))==NULL){ setobj(L,val,res); return; } } else if(ttisnil(tm=luaT_gettmbyobj(L,t,TM_INDEX))) luaG_typeerror(L,t,"index"); if(ttisfunction(tm)){ callTMres(L,val,tm,t,key); return; } t=tm; } luaG_runerror(L,"loop in gettable"); } static void luaV_settable(lua_State*L,const TValue*t,TValue*key,StkId val){ int loop; TValue temp; for(loop=0;loop<100;loop++){ const TValue*tm; if(ttistable(t)){ Table*h=hvalue(t); TValue*oldval=luaH_set(L,h,key); if(!ttisnil(oldval)|| (tm=fasttm(L,h->metatable,TM_NEWINDEX))==NULL){ setobj(L,oldval,val); h->flags=0; luaC_barriert(L,h,val); return; } } else if(ttisnil(tm=luaT_gettmbyobj(L,t,TM_NEWINDEX))) luaG_typeerror(L,t,"index"); if(ttisfunction(tm)){ callTM(L,tm,t,key,val); return; } setobj(L,&temp,tm); t=&temp; } luaG_runerror(L,"loop in settable"); } static int call_binTM(lua_State*L,const TValue*p1,const TValue*p2, StkId res,TMS event){ const TValue*tm=luaT_gettmbyobj(L,p1,event); if(ttisnil(tm)) tm=luaT_gettmbyobj(L,p2,event); if(ttisnil(tm))return 0; callTMres(L,res,tm,p1,p2); return 1; } static const TValue*get_compTM(lua_State*L,Table*mt1,Table*mt2, TMS event){ const TValue*tm1=fasttm(L,mt1,event); const TValue*tm2; if(tm1==NULL)return NULL; if(mt1==mt2)return tm1; tm2=fasttm(L,mt2,event); if(tm2==NULL)return NULL; if(luaO_rawequalObj(tm1,tm2)) return tm1; return NULL; } static int call_orderTM(lua_State*L,const TValue*p1,const TValue*p2, TMS event){ const TValue*tm1=luaT_gettmbyobj(L,p1,event); const TValue*tm2; if(ttisnil(tm1))return-1; tm2=luaT_gettmbyobj(L,p2,event); if(!luaO_rawequalObj(tm1,tm2)) return-1; callTMres(L,L->top,tm1,p1,p2); return!l_isfalse(L->top); } static int l_strcmp(const TString*ls,const TString*rs){ const char*l=getstr(ls); size_t ll=ls->tsv.len; const char*r=getstr(rs); size_t lr=rs->tsv.len; for(;;){ int temp=strcoll(l,r); if(temp!=0)return temp; else{ size_t len=strlen(l); if(len==lr) return(len==ll)?0:1; else if(len==ll) return-1; len++; l+=len;ll-=len;r+=len;lr-=len; } } } static int luaV_lessthan(lua_State*L,const TValue*l,const TValue*r){ int res; if(ttype(l)!=ttype(r)) return luaG_ordererror(L,l,r); else if(ttisnumber(l)) return luai_numlt(nvalue(l),nvalue(r)); else if(ttisstring(l)) return l_strcmp(rawtsvalue(l),rawtsvalue(r))<0; else if((res=call_orderTM(L,l,r,TM_LT))!=-1) return res; return luaG_ordererror(L,l,r); } static int lessequal(lua_State*L,const TValue*l,const TValue*r){ int res; if(ttype(l)!=ttype(r)) return luaG_ordererror(L,l,r); else if(ttisnumber(l)) return luai_numle(nvalue(l),nvalue(r)); else if(ttisstring(l)) return l_strcmp(rawtsvalue(l),rawtsvalue(r))<=0; else if((res=call_orderTM(L,l,r,TM_LE))!=-1) return res; else if((res=call_orderTM(L,r,l,TM_LT))!=-1) return!res; return luaG_ordererror(L,l,r); } static int luaV_equalval(lua_State*L,const TValue*t1,const TValue*t2){ const TValue*tm; switch(ttype(t1)){ case 0:return 1; case 3:return luai_numeq(nvalue(t1),nvalue(t2)); case 1:return bvalue(t1)==bvalue(t2); case 2:return pvalue(t1)==pvalue(t2); case 7:{ if(uvalue(t1)==uvalue(t2))return 1; tm=get_compTM(L,uvalue(t1)->metatable,uvalue(t2)->metatable, TM_EQ); break; } case 5:{ if(hvalue(t1)==hvalue(t2))return 1; tm=get_compTM(L,hvalue(t1)->metatable,hvalue(t2)->metatable,TM_EQ); break; } default:return gcvalue(t1)==gcvalue(t2); } if(tm==NULL)return 0; callTMres(L,L->top,tm,t1,t2); return!l_isfalse(L->top); } static void luaV_concat(lua_State*L,int total,int last){ do{ StkId top=L->base+last+1; int n=2; if(!(ttisstring(top-2)||ttisnumber(top-2))||!tostring(L,top-1)){ if(!call_binTM(L,top-2,top-1,top-2,TM_CONCAT)) luaG_concaterror(L,top-2,top-1); }else if(tsvalue(top-1)->len==0) (void)tostring(L,top-2); else{ size_t tl=tsvalue(top-1)->len; char*buffer; int i; for(n=1;nlen; if(l>=((size_t)(~(size_t)0)-2)-tl)luaG_runerror(L,"string length overflow"); tl+=l; } buffer=luaZ_openspace(L,&G(L)->buff,tl); tl=0; for(i=n;i>0;i--){ size_t l=tsvalue(top-i)->len; memcpy(buffer+tl,svalue(top-i),l); tl+=l; } setsvalue(L,top-n,luaS_newlstr(L,buffer,tl)); } total-=n-1; last-=n-1; }while(total>1); } static void Arith(lua_State*L,StkId ra,const TValue*rb, const TValue*rc,TMS op){ TValue tempb,tempc; const TValue*b,*c; if((b=luaV_tonumber(rb,&tempb))!=NULL&& (c=luaV_tonumber(rc,&tempc))!=NULL){ lua_Number nb=nvalue(b),nc=nvalue(c); switch(op){ case TM_ADD:setnvalue(ra,luai_numadd(nb,nc));break; case TM_SUB:setnvalue(ra,luai_numsub(nb,nc));break; case TM_MUL:setnvalue(ra,luai_nummul(nb,nc));break; case TM_DIV:setnvalue(ra,luai_numdiv(nb,nc));break; case TM_MOD:setnvalue(ra,luai_nummod(nb,nc));break; case TM_POW:setnvalue(ra,luai_numpow(nb,nc));break; case TM_UNM:setnvalue(ra,luai_numunm(nb));break; default:break; } } else if(!call_binTM(L,rb,rc,ra,op)) luaG_aritherror(L,rb,rc); } #define runtime_check(L,c){if(!(c))break;} #define RA(i)(base+GETARG_A(i)) #define RB(i)check_exp(getBMode(GET_OPCODE(i))==OpArgR,base+GETARG_B(i)) #define RKB(i)check_exp(getBMode(GET_OPCODE(i))==OpArgK,ISK(GETARG_B(i))?k+INDEXK(GETARG_B(i)):base+GETARG_B(i)) #define RKC(i)check_exp(getCMode(GET_OPCODE(i))==OpArgK,ISK(GETARG_C(i))?k+INDEXK(GETARG_C(i)):base+GETARG_C(i)) #define KBx(i)check_exp(getBMode(GET_OPCODE(i))==OpArgK,k+GETARG_Bx(i)) #define dojump(L,pc,i){(pc)+=(i);} #define Protect(x){L->savedpc=pc;{x;};base=L->base;} #define arith_op(op,tm){TValue*rb=RKB(i);TValue*rc=RKC(i);if(ttisnumber(rb)&&ttisnumber(rc)){lua_Number nb=nvalue(rb),nc=nvalue(rc);setnvalue(ra,op(nb,nc));}else Protect(Arith(L,ra,rb,rc,tm));} static void luaV_execute(lua_State*L,int nexeccalls){ LClosure*cl; StkId base; TValue*k; const Instruction*pc; reentry: pc=L->savedpc; cl=&clvalue(L->ci->func)->l; base=L->base; k=cl->p->k; for(;;){ const Instruction i=*pc++; StkId ra; ra=RA(i); switch(GET_OPCODE(i)){ case OP_MOVE:{ setobj(L,ra,RB(i)); continue; } case OP_LOADK:{ setobj(L,ra,KBx(i)); continue; } case OP_LOADBOOL:{ setbvalue(ra,GETARG_B(i)); if(GETARG_C(i))pc++; continue; } case OP_LOADNIL:{ TValue*rb=RB(i); do{ setnilvalue(rb--); }while(rb>=ra); continue; } case OP_GETUPVAL:{ int b=GETARG_B(i); setobj(L,ra,cl->upvals[b]->v); continue; } case OP_GETGLOBAL:{ TValue g; TValue*rb=KBx(i); sethvalue(L,&g,cl->env); Protect(luaV_gettable(L,&g,rb,ra)); continue; } case OP_GETTABLE:{ Protect(luaV_gettable(L,RB(i),RKC(i),ra)); continue; } case OP_SETGLOBAL:{ TValue g; sethvalue(L,&g,cl->env); Protect(luaV_settable(L,&g,KBx(i),ra)); continue; } case OP_SETUPVAL:{ UpVal*uv=cl->upvals[GETARG_B(i)]; setobj(L,uv->v,ra); luaC_barrier(L,uv,ra); continue; } case OP_SETTABLE:{ Protect(luaV_settable(L,ra,RKB(i),RKC(i))); continue; } case OP_NEWTABLE:{ int b=GETARG_B(i); int c=GETARG_C(i); sethvalue(L,ra,luaH_new(L,luaO_fb2int(b),luaO_fb2int(c))); Protect(luaC_checkGC(L)); continue; } case OP_SELF:{ StkId rb=RB(i); setobj(L,ra+1,rb); Protect(luaV_gettable(L,rb,RKC(i),ra)); continue; } case OP_ADD:{ arith_op(luai_numadd,TM_ADD); continue; } case OP_SUB:{ arith_op(luai_numsub,TM_SUB); continue; } case OP_MUL:{ arith_op(luai_nummul,TM_MUL); continue; } case OP_DIV:{ arith_op(luai_numdiv,TM_DIV); continue; } case OP_MOD:{ arith_op(luai_nummod,TM_MOD); continue; } case OP_POW:{ arith_op(luai_numpow,TM_POW); continue; } case OP_UNM:{ TValue*rb=RB(i); if(ttisnumber(rb)){ lua_Number nb=nvalue(rb); setnvalue(ra,luai_numunm(nb)); } else{ Protect(Arith(L,ra,rb,rb,TM_UNM)); } continue; } case OP_NOT:{ int res=l_isfalse(RB(i)); setbvalue(ra,res); continue; } case OP_LEN:{ const TValue*rb=RB(i); switch(ttype(rb)){ case 5:{ setnvalue(ra,cast_num(luaH_getn(hvalue(rb)))); break; } case 4:{ setnvalue(ra,cast_num(tsvalue(rb)->len)); break; } default:{ Protect( if(!call_binTM(L,rb,(&luaO_nilobject_),ra,TM_LEN)) luaG_typeerror(L,rb,"get length of"); ) } } continue; } case OP_CONCAT:{ int b=GETARG_B(i); int c=GETARG_C(i); Protect(luaV_concat(L,c-b+1,c);luaC_checkGC(L)); setobj(L,RA(i),base+b); continue; } case OP_JMP:{ dojump(L,pc,GETARG_sBx(i)); continue; } case OP_EQ:{ TValue*rb=RKB(i); TValue*rc=RKC(i); Protect( if(equalobj(L,rb,rc)==GETARG_A(i)) dojump(L,pc,GETARG_sBx(*pc)); ) pc++; continue; } case OP_LT:{ Protect( if(luaV_lessthan(L,RKB(i),RKC(i))==GETARG_A(i)) dojump(L,pc,GETARG_sBx(*pc)); ) pc++; continue; } case OP_LE:{ Protect( if(lessequal(L,RKB(i),RKC(i))==GETARG_A(i)) dojump(L,pc,GETARG_sBx(*pc)); ) pc++; continue; } case OP_TEST:{ if(l_isfalse(ra)!=GETARG_C(i)) dojump(L,pc,GETARG_sBx(*pc)); pc++; continue; } case OP_TESTSET:{ TValue*rb=RB(i); if(l_isfalse(rb)!=GETARG_C(i)){ setobj(L,ra,rb); dojump(L,pc,GETARG_sBx(*pc)); } pc++; continue; } case OP_CALL:{ int b=GETARG_B(i); int nresults=GETARG_C(i)-1; if(b!=0)L->top=ra+b; L->savedpc=pc; switch(luaD_precall(L,ra,nresults)){ case 0:{ nexeccalls++; goto reentry; } case 1:{ if(nresults>=0)L->top=L->ci->top; base=L->base; continue; } default:{ return; } } } case OP_TAILCALL:{ int b=GETARG_B(i); if(b!=0)L->top=ra+b; L->savedpc=pc; switch(luaD_precall(L,ra,(-1))){ case 0:{ CallInfo*ci=L->ci-1; int aux; StkId func=ci->func; StkId pfunc=(ci+1)->func; if(L->openupval)luaF_close(L,ci->base); L->base=ci->base=ci->func+((ci+1)->base-pfunc); for(aux=0;pfunc+auxtop;aux++) setobj(L,func+aux,pfunc+aux); ci->top=L->top=func+aux; ci->savedpc=L->savedpc; ci->tailcalls++; L->ci--; goto reentry; } case 1:{ base=L->base; continue; } default:{ return; } } } case OP_RETURN:{ int b=GETARG_B(i); if(b!=0)L->top=ra+b-1; if(L->openupval)luaF_close(L,base); L->savedpc=pc; b=luaD_poscall(L,ra); if(--nexeccalls==0) return; else{ if(b)L->top=L->ci->top; goto reentry; } } case OP_FORLOOP:{ lua_Number step=nvalue(ra+2); lua_Number idx=luai_numadd(nvalue(ra),step); lua_Number limit=nvalue(ra+1); if(luai_numlt(0,step)?luai_numle(idx,limit) :luai_numle(limit,idx)){ dojump(L,pc,GETARG_sBx(i)); setnvalue(ra,idx); setnvalue(ra+3,idx); } continue; } case OP_FORPREP:{ const TValue*init=ra; const TValue*plimit=ra+1; const TValue*pstep=ra+2; L->savedpc=pc; if(!tonumber(init,ra)) luaG_runerror(L,LUA_QL("for")" initial value must be a number"); else if(!tonumber(plimit,ra+1)) luaG_runerror(L,LUA_QL("for")" limit must be a number"); else if(!tonumber(pstep,ra+2)) luaG_runerror(L,LUA_QL("for")" step must be a number"); setnvalue(ra,luai_numsub(nvalue(ra),nvalue(pstep))); dojump(L,pc,GETARG_sBx(i)); continue; } case OP_TFORLOOP:{ StkId cb=ra+3; setobj(L,cb+2,ra+2); setobj(L,cb+1,ra+1); setobj(L,cb,ra); L->top=cb+3; Protect(luaD_call(L,cb,GETARG_C(i))); L->top=L->ci->top; cb=RA(i)+3; if(!ttisnil(cb)){ setobj(L,cb-1,cb); dojump(L,pc,GETARG_sBx(*pc)); } pc++; continue; } case OP_SETLIST:{ int n=GETARG_B(i); int c=GETARG_C(i); int last; Table*h; if(n==0){ n=cast_int(L->top-ra)-1; L->top=L->ci->top; } if(c==0)c=cast_int(*pc++); runtime_check(L,ttistable(ra)); h=hvalue(ra); last=((c-1)*50)+n; if(last>h->sizearray) luaH_resizearray(L,h,last); for(;n>0;n--){ TValue*val=ra+n; setobj(L,luaH_setnum(L,h,last--),val); luaC_barriert(L,h,val); } continue; } case OP_CLOSE:{ luaF_close(L,ra); continue; } case OP_CLOSURE:{ Proto*p; Closure*ncl; int nup,j; p=cl->p->p[GETARG_Bx(i)]; nup=p->nups; ncl=luaF_newLclosure(L,nup,cl->env); ncl->l.p=p; for(j=0;jl.upvals[j]=cl->upvals[GETARG_B(*pc)]; else{ ncl->l.upvals[j]=luaF_findupval(L,base+GETARG_B(*pc)); } } setclvalue(L,ra,ncl); Protect(luaC_checkGC(L)); continue; } case OP_VARARG:{ int b=GETARG_B(i)-1; int j; CallInfo*ci=L->ci; int n=cast_int(ci->base-ci->func)-cl->p->numparams-1; if(b==(-1)){ Protect(luaD_checkstack(L,n)); ra=RA(i); b=n; L->top=ra+n; } for(j=0;jbase-n+j); } else{ setnilvalue(ra+j); } } continue; } } } } #define api_checknelems(L,n)luai_apicheck(L,(n)<=(L->top-L->base)) #define api_checkvalidindex(L,i)luai_apicheck(L,(i)!=(&luaO_nilobject_)) #define api_incr_top(L){luai_apicheck(L,L->topci->top);L->top++;} static TValue*index2adr(lua_State*L,int idx){ if(idx>0){ TValue*o=L->base+(idx-1); luai_apicheck(L,idx<=L->ci->top-L->base); if(o>=L->top)return cast(TValue*,(&luaO_nilobject_)); else return o; } else if(idx>(-10000)){ luai_apicheck(L,idx!=0&&-idx<=L->top-L->base); return L->top+idx; } else switch(idx){ case(-10000):return registry(L); case(-10001):{ Closure*func=curr_func(L); sethvalue(L,&L->env,func->c.env); return&L->env; } case(-10002):return gt(L); default:{ Closure*func=curr_func(L); idx=(-10002)-idx; return(idx<=func->c.nupvalues) ?&func->c.upvalue[idx-1] :cast(TValue*,(&luaO_nilobject_)); } } } static Table*getcurrenv(lua_State*L){ if(L->ci==L->base_ci) return hvalue(gt(L)); else{ Closure*func=curr_func(L); return func->c.env; } } static int lua_checkstack(lua_State*L,int size){ int res=1; if(size>8000||(L->top-L->base+size)>8000) res=0; else if(size>0){ luaD_checkstack(L,size); if(L->ci->toptop+size) L->ci->top=L->top+size; } return res; } static lua_CFunction lua_atpanic(lua_State*L,lua_CFunction panicf){ lua_CFunction old; old=G(L)->panic; G(L)->panic=panicf; return old; } static int lua_gettop(lua_State*L){ return cast_int(L->top-L->base); } static void lua_settop(lua_State*L,int idx){ if(idx>=0){ luai_apicheck(L,idx<=L->stack_last-L->base); while(L->topbase+idx) setnilvalue(L->top++); L->top=L->base+idx; } else{ luai_apicheck(L,-(idx+1)<=(L->top-L->base)); L->top+=idx+1; } } static void lua_remove(lua_State*L,int idx){ StkId p; p=index2adr(L,idx); api_checkvalidindex(L,p); while(++ptop)setobj(L,p-1,p); L->top--; } static void lua_insert(lua_State*L,int idx){ StkId p; StkId q; p=index2adr(L,idx); api_checkvalidindex(L,p); for(q=L->top;q>p;q--)setobj(L,q,q-1); setobj(L,p,L->top); } static void lua_replace(lua_State*L,int idx){ StkId o; if(idx==(-10001)&&L->ci==L->base_ci) luaG_runerror(L,"no calling environment"); api_checknelems(L,1); o=index2adr(L,idx); api_checkvalidindex(L,o); if(idx==(-10001)){ Closure*func=curr_func(L); luai_apicheck(L,ttistable(L->top-1)); func->c.env=hvalue(L->top-1); luaC_barrier(L,func,L->top-1); } else{ setobj(L,o,L->top-1); if(idx<(-10002)) luaC_barrier(L,curr_func(L),L->top-1); } L->top--; } static void lua_pushvalue(lua_State*L,int idx){ setobj(L,L->top,index2adr(L,idx)); api_incr_top(L); } static int lua_type(lua_State*L,int idx){ StkId o=index2adr(L,idx); return(o==(&luaO_nilobject_))?(-1):ttype(o); } static const char*lua_typename(lua_State*L,int t){ UNUSED(L); return(t==(-1))?"no value":luaT_typenames[t]; } static int lua_iscfunction(lua_State*L,int idx){ StkId o=index2adr(L,idx); return iscfunction(o); } static int lua_isnumber(lua_State*L,int idx){ TValue n; const TValue*o=index2adr(L,idx); return tonumber(o,&n); } static int lua_isstring(lua_State*L,int idx){ int t=lua_type(L,idx); return(t==4||t==3); } static int lua_rawequal(lua_State*L,int index1,int index2){ StkId o1=index2adr(L,index1); StkId o2=index2adr(L,index2); return(o1==(&luaO_nilobject_)||o2==(&luaO_nilobject_))?0 :luaO_rawequalObj(o1,o2); } static int lua_lessthan(lua_State*L,int index1,int index2){ StkId o1,o2; int i; o1=index2adr(L,index1); o2=index2adr(L,index2); i=(o1==(&luaO_nilobject_)||o2==(&luaO_nilobject_))?0 :luaV_lessthan(L,o1,o2); return i; } static lua_Number lua_tonumber(lua_State*L,int idx){ TValue n; const TValue*o=index2adr(L,idx); if(tonumber(o,&n)) return nvalue(o); else return 0; } static lua_Integer lua_tointeger(lua_State*L,int idx){ TValue n; const TValue*o=index2adr(L,idx); if(tonumber(o,&n)){ lua_Integer res; lua_Number num=nvalue(o); lua_number2integer(res,num); return res; } else return 0; } static int lua_toboolean(lua_State*L,int idx){ const TValue*o=index2adr(L,idx); return!l_isfalse(o); } static const char*lua_tolstring(lua_State*L,int idx,size_t*len){ StkId o=index2adr(L,idx); if(!ttisstring(o)){ if(!luaV_tostring(L,o)){ if(len!=NULL)*len=0; return NULL; } luaC_checkGC(L); o=index2adr(L,idx); } if(len!=NULL)*len=tsvalue(o)->len; return svalue(o); } static size_t lua_objlen(lua_State*L,int idx){ StkId o=index2adr(L,idx); switch(ttype(o)){ case 4:return tsvalue(o)->len; case 7:return uvalue(o)->len; case 5:return luaH_getn(hvalue(o)); case 3:{ size_t l; l=(luaV_tostring(L,o)?tsvalue(o)->len:0); return l; } default:return 0; } } static lua_CFunction lua_tocfunction(lua_State*L,int idx){ StkId o=index2adr(L,idx); return(!iscfunction(o))?NULL:clvalue(o)->c.f; } static void*lua_touserdata(lua_State*L,int idx){ StkId o=index2adr(L,idx); switch(ttype(o)){ case 7:return(rawuvalue(o)+1); case 2:return pvalue(o); default:return NULL; } } static void lua_pushnil(lua_State*L){ setnilvalue(L->top); api_incr_top(L); } static void lua_pushnumber(lua_State*L,lua_Number n){ setnvalue(L->top,n); api_incr_top(L); } static void lua_pushinteger(lua_State*L,lua_Integer n){ setnvalue(L->top,cast_num(n)); api_incr_top(L); } static void lua_pushlstring(lua_State*L,const char*s,size_t len){ luaC_checkGC(L); setsvalue(L,L->top,luaS_newlstr(L,s,len)); api_incr_top(L); } static void lua_pushstring(lua_State*L,const char*s){ if(s==NULL) lua_pushnil(L); else lua_pushlstring(L,s,strlen(s)); } static const char*lua_pushvfstring(lua_State*L,const char*fmt, va_list argp){ const char*ret; luaC_checkGC(L); ret=luaO_pushvfstring(L,fmt,argp); return ret; } static const char*lua_pushfstring(lua_State*L,const char*fmt,...){ const char*ret; va_list argp; luaC_checkGC(L); va_start(argp,fmt); ret=luaO_pushvfstring(L,fmt,argp); va_end(argp); return ret; } static void lua_pushcclosure(lua_State*L,lua_CFunction fn,int n){ Closure*cl; luaC_checkGC(L); api_checknelems(L,n); cl=luaF_newCclosure(L,n,getcurrenv(L)); cl->c.f=fn; L->top-=n; while(n--) setobj(L,&cl->c.upvalue[n],L->top+n); setclvalue(L,L->top,cl); api_incr_top(L); } static void lua_pushboolean(lua_State*L,int b){ setbvalue(L->top,(b!=0)); api_incr_top(L); } static int lua_pushthread(lua_State*L){ setthvalue(L,L->top,L); api_incr_top(L); return(G(L)->mainthread==L); } static void lua_gettable(lua_State*L,int idx){ StkId t; t=index2adr(L,idx); api_checkvalidindex(L,t); luaV_gettable(L,t,L->top-1,L->top-1); } static void lua_getfield(lua_State*L,int idx,const char*k){ StkId t; TValue key; t=index2adr(L,idx); api_checkvalidindex(L,t); setsvalue(L,&key,luaS_new(L,k)); luaV_gettable(L,t,&key,L->top); api_incr_top(L); } static void lua_rawget(lua_State*L,int idx){ StkId t; t=index2adr(L,idx); luai_apicheck(L,ttistable(t)); setobj(L,L->top-1,luaH_get(hvalue(t),L->top-1)); } static void lua_rawgeti(lua_State*L,int idx,int n){ StkId o; o=index2adr(L,idx); luai_apicheck(L,ttistable(o)); setobj(L,L->top,luaH_getnum(hvalue(o),n)); api_incr_top(L); } static void lua_createtable(lua_State*L,int narray,int nrec){ luaC_checkGC(L); sethvalue(L,L->top,luaH_new(L,narray,nrec)); api_incr_top(L); } static int lua_getmetatable(lua_State*L,int objindex){ const TValue*obj; Table*mt=NULL; int res; obj=index2adr(L,objindex); switch(ttype(obj)){ case 5: mt=hvalue(obj)->metatable; break; case 7: mt=uvalue(obj)->metatable; break; default: mt=G(L)->mt[ttype(obj)]; break; } if(mt==NULL) res=0; else{ sethvalue(L,L->top,mt); api_incr_top(L); res=1; } return res; } static void lua_getfenv(lua_State*L,int idx){ StkId o; o=index2adr(L,idx); api_checkvalidindex(L,o); switch(ttype(o)){ case 6: sethvalue(L,L->top,clvalue(o)->c.env); break; case 7: sethvalue(L,L->top,uvalue(o)->env); break; case 8: setobj(L,L->top,gt(thvalue(o))); break; default: setnilvalue(L->top); break; } api_incr_top(L); } static void lua_settable(lua_State*L,int idx){ StkId t; api_checknelems(L,2); t=index2adr(L,idx); api_checkvalidindex(L,t); luaV_settable(L,t,L->top-2,L->top-1); L->top-=2; } static void lua_setfield(lua_State*L,int idx,const char*k){ StkId t; TValue key; api_checknelems(L,1); t=index2adr(L,idx); api_checkvalidindex(L,t); setsvalue(L,&key,luaS_new(L,k)); luaV_settable(L,t,&key,L->top-1); L->top--; } static void lua_rawset(lua_State*L,int idx){ StkId t; api_checknelems(L,2); t=index2adr(L,idx); luai_apicheck(L,ttistable(t)); setobj(L,luaH_set(L,hvalue(t),L->top-2),L->top-1); luaC_barriert(L,hvalue(t),L->top-1); L->top-=2; } static void lua_rawseti(lua_State*L,int idx,int n){ StkId o; api_checknelems(L,1); o=index2adr(L,idx); luai_apicheck(L,ttistable(o)); setobj(L,luaH_setnum(L,hvalue(o),n),L->top-1); luaC_barriert(L,hvalue(o),L->top-1); L->top--; } static int lua_setmetatable(lua_State*L,int objindex){ TValue*obj; Table*mt; api_checknelems(L,1); obj=index2adr(L,objindex); api_checkvalidindex(L,obj); if(ttisnil(L->top-1)) mt=NULL; else{ luai_apicheck(L,ttistable(L->top-1)); mt=hvalue(L->top-1); } switch(ttype(obj)){ case 5:{ hvalue(obj)->metatable=mt; if(mt) luaC_objbarriert(L,hvalue(obj),mt); break; } case 7:{ uvalue(obj)->metatable=mt; if(mt) luaC_objbarrier(L,rawuvalue(obj),mt); break; } default:{ G(L)->mt[ttype(obj)]=mt; break; } } L->top--; return 1; } static int lua_setfenv(lua_State*L,int idx){ StkId o; int res=1; api_checknelems(L,1); o=index2adr(L,idx); api_checkvalidindex(L,o); luai_apicheck(L,ttistable(L->top-1)); switch(ttype(o)){ case 6: clvalue(o)->c.env=hvalue(L->top-1); break; case 7: uvalue(o)->env=hvalue(L->top-1); break; case 8: sethvalue(L,gt(thvalue(o)),hvalue(L->top-1)); break; default: res=0; break; } if(res)luaC_objbarrier(L,gcvalue(o),hvalue(L->top-1)); L->top--; return res; } #define adjustresults(L,nres){if(nres==(-1)&&L->top>=L->ci->top)L->ci->top=L->top;} #define checkresults(L,na,nr)luai_apicheck(L,(nr)==(-1)||(L->ci->top-L->top>=(nr)-(na))) static void lua_call(lua_State*L,int nargs,int nresults){ StkId func; api_checknelems(L,nargs+1); checkresults(L,nargs,nresults); func=L->top-(nargs+1); luaD_call(L,func,nresults); adjustresults(L,nresults); } struct CallS{ StkId func; int nresults; }; static void f_call(lua_State*L,void*ud){ struct CallS*c=cast(struct CallS*,ud); luaD_call(L,c->func,c->nresults); } static int lua_pcall(lua_State*L,int nargs,int nresults,int errfunc){ struct CallS c; int status; ptrdiff_t func; api_checknelems(L,nargs+1); checkresults(L,nargs,nresults); if(errfunc==0) func=0; else{ StkId o=index2adr(L,errfunc); api_checkvalidindex(L,o); func=savestack(L,o); } c.func=L->top-(nargs+1); c.nresults=nresults; status=luaD_pcall(L,f_call,&c,savestack(L,c.func),func); adjustresults(L,nresults); return status; } static int lua_load(lua_State*L,lua_Reader reader,void*data, const char*chunkname){ ZIO z; int status; if(!chunkname)chunkname="?"; luaZ_init(L,&z,reader,data); status=luaD_protectedparser(L,&z,chunkname); return status; } static int lua_error(lua_State*L){ api_checknelems(L,1); luaG_errormsg(L); return 0; } static int lua_next(lua_State*L,int idx){ StkId t; int more; t=index2adr(L,idx); luai_apicheck(L,ttistable(t)); more=luaH_next(L,hvalue(t),L->top-1); if(more){ api_incr_top(L); } else L->top-=1; return more; } static void lua_concat(lua_State*L,int n){ api_checknelems(L,n); if(n>=2){ luaC_checkGC(L); luaV_concat(L,n,cast_int(L->top-L->base)-1); L->top-=(n-1); } else if(n==0){ setsvalue(L,L->top,luaS_newlstr(L,"",0)); api_incr_top(L); } } static void*lua_newuserdata(lua_State*L,size_t size){ Udata*u; luaC_checkGC(L); u=luaS_newudata(L,size,getcurrenv(L)); setuvalue(L,L->top,u); api_incr_top(L); return u+1; } #define luaL_getn(L,i)((int)lua_objlen(L,i)) #define luaL_setn(L,i,j)((void)0) typedef struct luaL_Reg{ const char*name; lua_CFunction func; }luaL_Reg; static void luaI_openlib(lua_State*L,const char*libname, const luaL_Reg*l,int nup); static int luaL_argerror(lua_State*L,int numarg,const char*extramsg); static const char* luaL_checklstring(lua_State*L,int numArg, size_t*l); static const char* luaL_optlstring(lua_State*L,int numArg, const char*def,size_t*l); static lua_Integer luaL_checkinteger(lua_State*L,int numArg); static lua_Integer luaL_optinteger(lua_State*L,int nArg, lua_Integer def); static int luaL_error(lua_State*L,const char*fmt,...); static const char* luaL_findtable(lua_State*L,int idx, const char*fname,int szhint); #define luaL_argcheck(L,cond,numarg,extramsg)((void)((cond)||luaL_argerror(L,(numarg),(extramsg)))) #define luaL_checkstring(L,n)(luaL_checklstring(L,(n),NULL)) #define luaL_optstring(L,n,d)(luaL_optlstring(L,(n),(d),NULL)) #define luaL_checkint(L,n)((int)luaL_checkinteger(L,(n))) #define luaL_optint(L,n,d)((int)luaL_optinteger(L,(n),(d))) #define luaL_typename(L,i)lua_typename(L,lua_type(L,(i))) #define luaL_getmetatable(L,n)(lua_getfield(L,(-10000),(n))) #define luaL_opt(L,f,n,d)(lua_isnoneornil(L,(n))?(d):f(L,(n))) typedef struct luaL_Buffer{ char*p; int lvl; lua_State*L; char buffer[BUFSIZ]; }luaL_Buffer; #define luaL_addchar(B,c)((void)((B)->p<((B)->buffer+BUFSIZ)||luaL_prepbuffer(B)),(*(B)->p++=(char)(c))) #define luaL_addsize(B,n)((B)->p+=(n)) static char* luaL_prepbuffer(luaL_Buffer*B); static int luaL_argerror(lua_State*L,int narg,const char*extramsg){ lua_Debug ar; if(!lua_getstack(L,0,&ar)) return luaL_error(L,"bad argument #%d (%s)",narg,extramsg); lua_getinfo(L,"n",&ar); if(strcmp(ar.namewhat,"method")==0){ narg--; if(narg==0) return luaL_error(L,"calling "LUA_QL("%s")" on bad self (%s)", ar.name,extramsg); } if(ar.name==NULL) ar.name="?"; return luaL_error(L,"bad argument #%d to "LUA_QL("%s")" (%s)", narg,ar.name,extramsg); } static int luaL_typerror(lua_State*L,int narg,const char*tname){ const char*msg=lua_pushfstring(L,"%s expected, got %s", tname,luaL_typename(L,narg)); return luaL_argerror(L,narg,msg); } static void tag_error(lua_State*L,int narg,int tag){ luaL_typerror(L,narg,lua_typename(L,tag)); } static void luaL_where(lua_State*L,int level){ lua_Debug ar; if(lua_getstack(L,level,&ar)){ lua_getinfo(L,"Sl",&ar); if(ar.currentline>0){ lua_pushfstring(L,"%s:%d: ",ar.short_src,ar.currentline); return; } } lua_pushliteral(L,""); } static int luaL_error(lua_State*L,const char*fmt,...){ va_list argp; va_start(argp,fmt); luaL_where(L,1); lua_pushvfstring(L,fmt,argp); va_end(argp); lua_concat(L,2); return lua_error(L); } static int luaL_newmetatable(lua_State*L,const char*tname){ lua_getfield(L,(-10000),tname); if(!lua_isnil(L,-1)) return 0; lua_pop(L,1); lua_newtable(L); lua_pushvalue(L,-1); lua_setfield(L,(-10000),tname); return 1; } static void*luaL_checkudata(lua_State*L,int ud,const char*tname){ void*p=lua_touserdata(L,ud); if(p!=NULL){ if(lua_getmetatable(L,ud)){ lua_getfield(L,(-10000),tname); if(lua_rawequal(L,-1,-2)){ lua_pop(L,2); return p; } } } luaL_typerror(L,ud,tname); return NULL; } static void luaL_checkstack(lua_State*L,int space,const char*mes){ if(!lua_checkstack(L,space)) luaL_error(L,"stack overflow (%s)",mes); } static void luaL_checktype(lua_State*L,int narg,int t){ if(lua_type(L,narg)!=t) tag_error(L,narg,t); } static void luaL_checkany(lua_State*L,int narg){ if(lua_type(L,narg)==(-1)) luaL_argerror(L,narg,"value expected"); } static const char*luaL_checklstring(lua_State*L,int narg,size_t*len){ const char*s=lua_tolstring(L,narg,len); if(!s)tag_error(L,narg,4); return s; } static const char*luaL_optlstring(lua_State*L,int narg, const char*def,size_t*len){ if(lua_isnoneornil(L,narg)){ if(len) *len=(def?strlen(def):0); return def; } else return luaL_checklstring(L,narg,len); } static lua_Number luaL_checknumber(lua_State*L,int narg){ lua_Number d=lua_tonumber(L,narg); if(d==0&&!lua_isnumber(L,narg)) tag_error(L,narg,3); return d; } static lua_Integer luaL_checkinteger(lua_State*L,int narg){ lua_Integer d=lua_tointeger(L,narg); if(d==0&&!lua_isnumber(L,narg)) tag_error(L,narg,3); return d; } static lua_Integer luaL_optinteger(lua_State*L,int narg, lua_Integer def){ return luaL_opt(L,luaL_checkinteger,narg,def); } static int luaL_getmetafield(lua_State*L,int obj,const char*event){ if(!lua_getmetatable(L,obj)) return 0; lua_pushstring(L,event); lua_rawget(L,-2); if(lua_isnil(L,-1)){ lua_pop(L,2); return 0; } else{ lua_remove(L,-2); return 1; } } static void luaL_register(lua_State*L,const char*libname, const luaL_Reg*l){ luaI_openlib(L,libname,l,0); } static int libsize(const luaL_Reg*l){ int size=0; for(;l->name;l++)size++; return size; } static void luaI_openlib(lua_State*L,const char*libname, const luaL_Reg*l,int nup){ if(libname){ int size=libsize(l); luaL_findtable(L,(-10000),"_LOADED",1); lua_getfield(L,-1,libname); if(!lua_istable(L,-1)){ lua_pop(L,1); if(luaL_findtable(L,(-10002),libname,size)!=NULL) luaL_error(L,"name conflict for module "LUA_QL("%s"),libname); lua_pushvalue(L,-1); lua_setfield(L,-3,libname); } lua_remove(L,-2); lua_insert(L,-(nup+1)); } for(;l->name;l++){ int i; for(i=0;ifunc,nup); lua_setfield(L,-(nup+2),l->name); } lua_pop(L,nup); } static const char*luaL_findtable(lua_State*L,int idx, const char*fname,int szhint){ const char*e; lua_pushvalue(L,idx); do{ e=strchr(fname,'.'); if(e==NULL)e=fname+strlen(fname); lua_pushlstring(L,fname,e-fname); lua_rawget(L,-2); if(lua_isnil(L,-1)){ lua_pop(L,1); lua_createtable(L,0,(*e=='.'?1:szhint)); lua_pushlstring(L,fname,e-fname); lua_pushvalue(L,-2); lua_settable(L,-4); } else if(!lua_istable(L,-1)){ lua_pop(L,2); return fname; } lua_remove(L,-2); fname=e+1; }while(*e=='.'); return NULL; } #define bufflen(B)((B)->p-(B)->buffer) #define bufffree(B)((size_t)(BUFSIZ-bufflen(B))) static int emptybuffer(luaL_Buffer*B){ size_t l=bufflen(B); if(l==0)return 0; else{ lua_pushlstring(B->L,B->buffer,l); B->p=B->buffer; B->lvl++; return 1; } } static void adjuststack(luaL_Buffer*B){ if(B->lvl>1){ lua_State*L=B->L; int toget=1; size_t toplen=lua_strlen(L,-1); do{ size_t l=lua_strlen(L,-(toget+1)); if(B->lvl-toget+1>=(20/2)||toplen>l){ toplen+=l; toget++; } else break; }while(togetlvl); lua_concat(L,toget); B->lvl=B->lvl-toget+1; } } static char*luaL_prepbuffer(luaL_Buffer*B){ if(emptybuffer(B)) adjuststack(B); return B->buffer; } static void luaL_addlstring(luaL_Buffer*B,const char*s,size_t l){ while(l--) luaL_addchar(B,*s++); } static void luaL_pushresult(luaL_Buffer*B){ emptybuffer(B); lua_concat(B->L,B->lvl); B->lvl=1; } static void luaL_addvalue(luaL_Buffer*B){ lua_State*L=B->L; size_t vl; const char*s=lua_tolstring(L,-1,&vl); if(vl<=bufffree(B)){ memcpy(B->p,s,vl); B->p+=vl; lua_pop(L,1); } else{ if(emptybuffer(B)) lua_insert(L,-2); B->lvl++; adjuststack(B); } } static void luaL_buffinit(lua_State*L,luaL_Buffer*B){ B->L=L; B->p=B->buffer; B->lvl=0; } typedef struct LoadF{ int extraline; FILE*f; char buff[BUFSIZ]; }LoadF; static const char*getF(lua_State*L,void*ud,size_t*size){ LoadF*lf=(LoadF*)ud; (void)L; if(lf->extraline){ lf->extraline=0; *size=1; return"\n"; } if(feof(lf->f))return NULL; *size=fread(lf->buff,1,sizeof(lf->buff),lf->f); return(*size>0)?lf->buff:NULL; } static int errfile(lua_State*L,const char*what,int fnameindex){ const char*serr=strerror(errno); const char*filename=lua_tostring(L,fnameindex)+1; lua_pushfstring(L,"cannot %s %s: %s",what,filename,serr); lua_remove(L,fnameindex); return(5+1); } static int luaL_loadfile(lua_State*L,const char*filename){ LoadF lf; int status,readstatus; int c; int fnameindex=lua_gettop(L)+1; lf.extraline=0; if(filename==NULL){ lua_pushliteral(L,"=stdin"); lf.f=stdin; } else{ lua_pushfstring(L,"@%s",filename); lf.f=fopen(filename,"r"); if(lf.f==NULL)return errfile(L,"open",fnameindex); } c=getc(lf.f); if(c=='#'){ lf.extraline=1; while((c=getc(lf.f))!=EOF&&c!='\n'); if(c=='\n')c=getc(lf.f); } if(c=="\033Lua"[0]&&filename){ lf.f=freopen(filename,"rb",lf.f); if(lf.f==NULL)return errfile(L,"reopen",fnameindex); while((c=getc(lf.f))!=EOF&&c!="\033Lua"[0]); lf.extraline=0; } ungetc(c,lf.f); status=lua_load(L,getF,&lf,lua_tostring(L,-1)); readstatus=ferror(lf.f); if(filename)fclose(lf.f); if(readstatus){ lua_settop(L,fnameindex); return errfile(L,"read",fnameindex); } lua_remove(L,fnameindex); return status; } typedef struct LoadS{ const char*s; size_t size; }LoadS; static const char*getS(lua_State*L,void*ud,size_t*size){ LoadS*ls=(LoadS*)ud; (void)L; if(ls->size==0)return NULL; *size=ls->size; ls->size=0; return ls->s; } static int luaL_loadbuffer(lua_State*L,const char*buff,size_t size, const char*name){ LoadS ls; ls.s=buff; ls.size=size; return lua_load(L,getS,&ls,name); } static void*l_alloc(void*ud,void*ptr,size_t osize,size_t nsize){ (void)ud; (void)osize; if(nsize==0){ free(ptr); return NULL; } else return realloc(ptr,nsize); } static int panic(lua_State*L){ (void)L; fprintf(stderr,"PANIC: unprotected error in call to Lua API (%s)\n", lua_tostring(L,-1)); return 0; } static lua_State*luaL_newstate(void){ lua_State*L=lua_newstate(l_alloc,NULL); if(L)lua_atpanic(L,&panic); return L; } static int luaB_tonumber(lua_State*L){ int base=luaL_optint(L,2,10); if(base==10){ luaL_checkany(L,1); if(lua_isnumber(L,1)){ lua_pushnumber(L,lua_tonumber(L,1)); return 1; } } else{ const char*s1=luaL_checkstring(L,1); char*s2; unsigned long n; luaL_argcheck(L,2<=base&&base<=36,2,"base out of range"); n=strtoul(s1,&s2,base); if(s1!=s2){ while(isspace((unsigned char)(*s2)))s2++; if(*s2=='\0'){ lua_pushnumber(L,(lua_Number)n); return 1; } } } lua_pushnil(L); return 1; } static int luaB_error(lua_State*L){ int level=luaL_optint(L,2,1); lua_settop(L,1); if(lua_isstring(L,1)&&level>0){ luaL_where(L,level); lua_pushvalue(L,1); lua_concat(L,2); } return lua_error(L); } static int luaB_setmetatable(lua_State*L){ int t=lua_type(L,2); luaL_checktype(L,1,5); luaL_argcheck(L,t==0||t==5,2, "nil or table expected"); if(luaL_getmetafield(L,1,"__metatable")) luaL_error(L,"cannot change a protected metatable"); lua_settop(L,2); lua_setmetatable(L,1); return 1; } static void getfunc(lua_State*L,int opt){ if(lua_isfunction(L,1))lua_pushvalue(L,1); else{ lua_Debug ar; int level=opt?luaL_optint(L,1,1):luaL_checkint(L,1); luaL_argcheck(L,level>=0,1,"level must be non-negative"); if(lua_getstack(L,level,&ar)==0) luaL_argerror(L,1,"invalid level"); lua_getinfo(L,"f",&ar); if(lua_isnil(L,-1)) luaL_error(L,"no function environment for tail call at level %d", level); } } static int luaB_setfenv(lua_State*L){ luaL_checktype(L,2,5); getfunc(L,0); lua_pushvalue(L,2); if(lua_isnumber(L,1)&&lua_tonumber(L,1)==0){ lua_pushthread(L); lua_insert(L,-2); lua_setfenv(L,-2); return 0; } else if(lua_iscfunction(L,-2)||lua_setfenv(L,-2)==0) luaL_error(L, LUA_QL("setfenv")" cannot change environment of given object"); return 1; } static int luaB_rawget(lua_State*L){ luaL_checktype(L,1,5); luaL_checkany(L,2); lua_settop(L,2); lua_rawget(L,1); return 1; } static int luaB_type(lua_State*L){ luaL_checkany(L,1); lua_pushstring(L,luaL_typename(L,1)); return 1; } static int luaB_next(lua_State*L){ luaL_checktype(L,1,5); lua_settop(L,2); if(lua_next(L,1)) return 2; else{ lua_pushnil(L); return 1; } } static int luaB_pairs(lua_State*L){ luaL_checktype(L,1,5); lua_pushvalue(L,lua_upvalueindex(1)); lua_pushvalue(L,1); lua_pushnil(L); return 3; } static int ipairsaux(lua_State*L){ int i=luaL_checkint(L,2); luaL_checktype(L,1,5); i++; lua_pushinteger(L,i); lua_rawgeti(L,1,i); return(lua_isnil(L,-1))?0:2; } static int luaB_ipairs(lua_State*L){ luaL_checktype(L,1,5); lua_pushvalue(L,lua_upvalueindex(1)); lua_pushvalue(L,1); lua_pushinteger(L,0); return 3; } static int load_aux(lua_State*L,int status){ if(status==0) return 1; else{ lua_pushnil(L); lua_insert(L,-2); return 2; } } static int luaB_loadstring(lua_State*L){ size_t l; const char*s=luaL_checklstring(L,1,&l); const char*chunkname=luaL_optstring(L,2,s); return load_aux(L,luaL_loadbuffer(L,s,l,chunkname)); } static int luaB_loadfile(lua_State*L){ const char*fname=luaL_optstring(L,1,NULL); return load_aux(L,luaL_loadfile(L,fname)); } static int luaB_assert(lua_State*L){ luaL_checkany(L,1); if(!lua_toboolean(L,1)) return luaL_error(L,"%s",luaL_optstring(L,2,"assertion failed!")); return lua_gettop(L); } static int luaB_unpack(lua_State*L){ int i,e,n; luaL_checktype(L,1,5); i=luaL_optint(L,2,1); e=luaL_opt(L,luaL_checkint,3,luaL_getn(L,1)); if(i>e)return 0; n=e-i+1; if(n<=0||!lua_checkstack(L,n)) return luaL_error(L,"too many results to unpack"); lua_rawgeti(L,1,i); while(i++e)e=pos; for(i=e;i>pos;i--){ lua_rawgeti(L,1,i-1); lua_rawseti(L,1,i); } break; } default:{ return luaL_error(L,"wrong number of arguments to "LUA_QL("insert")); } } luaL_setn(L,1,e); lua_rawseti(L,1,pos); return 0; } static int tremove(lua_State*L){ int e=aux_getn(L,1); int pos=luaL_optint(L,2,e); if(!(1<=pos&&pos<=e)) return 0; luaL_setn(L,1,e-1); lua_rawgeti(L,1,pos); for(;posu)luaL_error(L,"invalid order function for sorting"); lua_pop(L,1); } while(lua_rawgeti(L,1,--j),sort_comp(L,-3,-1)){ if(j0); } l=strlen(p); if(l==0||p[l-1]!='\n') luaL_addsize(&b,l); else{ luaL_addsize(&b,l-1); luaL_pushresult(&b); return 1; } } } static int read_chars(lua_State*L,FILE*f,size_t n){ size_t rlen; size_t nr; luaL_Buffer b; luaL_buffinit(L,&b); rlen=BUFSIZ; do{ char*p=luaL_prepbuffer(&b); if(rlen>n)rlen=n; nr=fread(p,sizeof(char),rlen,f); luaL_addsize(&b,nr); n-=nr; }while(n>0&&nr==rlen); luaL_pushresult(&b); return(n==0||lua_objlen(L,-1)>0); } static int g_read(lua_State*L,FILE*f,int first){ int nargs=lua_gettop(L)-1; int success; int n; clearerr(f); if(nargs==0){ success=read_line(L,f); n=first+1; } else{ luaL_checkstack(L,nargs+20,"too many arguments"); success=1; for(n=first;nargs--&&success;n++){ if(lua_type(L,n)==3){ size_t l=(size_t)lua_tointeger(L,n); success=(l==0)?test_eof(L,f):read_chars(L,f,l); } else{ const char*p=lua_tostring(L,n); luaL_argcheck(L,p&&p[0]=='*',n,"invalid option"); switch(p[1]){ case'n': success=read_number(L,f); break; case'l': success=read_line(L,f); break; case'a': read_chars(L,f,~((size_t)0)); success=1; break; default: return luaL_argerror(L,n,"invalid format"); } } } } if(ferror(f)) return pushresult(L,0,NULL); if(!success){ lua_pop(L,1); lua_pushnil(L); } return n-first; } static int io_read(lua_State*L){ return g_read(L,getiofile(L,1),1); } static int f_read(lua_State*L){ return g_read(L,tofile(L),2); } static int io_readline(lua_State*L){ FILE*f=*(FILE**)lua_touserdata(L,lua_upvalueindex(1)); int sucess; if(f==NULL) luaL_error(L,"file is already closed"); sucess=read_line(L,f); if(ferror(f)) return luaL_error(L,"%s",strerror(errno)); if(sucess)return 1; else{ if(lua_toboolean(L,lua_upvalueindex(2))){ lua_settop(L,0); lua_pushvalue(L,lua_upvalueindex(1)); aux_close(L); } return 0; } } static int g_write(lua_State*L,FILE*f,int arg){ int nargs=lua_gettop(L)-1; int status=1; for(;nargs--;arg++){ if(lua_type(L,arg)==3){ status=status&& fprintf(f,"%.14g",lua_tonumber(L,arg))>0; } else{ size_t l; const char*s=luaL_checklstring(L,arg,&l); status=status&&(fwrite(s,sizeof(char),l,f)==l); } } return pushresult(L,status,NULL); } static int io_write(lua_State*L){ return g_write(L,getiofile(L,2),1); } static int f_write(lua_State*L){ return g_write(L,tofile(L),2); } static int io_flush(lua_State*L){ return pushresult(L,fflush(getiofile(L,2))==0,NULL); } static int f_flush(lua_State*L){ return pushresult(L,fflush(tofile(L))==0,NULL); } static const luaL_Reg iolib[]={ {"close",io_close}, {"flush",io_flush}, {"input",io_input}, {"lines",io_lines}, {"open",io_open}, {"output",io_output}, {"read",io_read}, {"type",io_type}, {"write",io_write}, {NULL,NULL} }; static const luaL_Reg flib[]={ {"close",io_close}, {"flush",f_flush}, {"lines",f_lines}, {"read",f_read}, {"write",f_write}, {"__gc",io_gc}, {NULL,NULL} }; static void createmeta(lua_State*L){ luaL_newmetatable(L,"FILE*"); lua_pushvalue(L,-1); lua_setfield(L,-2,"__index"); luaL_register(L,NULL,flib); } static void createstdfile(lua_State*L,FILE*f,int k,const char*fname){ *newfile(L)=f; if(k>0){ lua_pushvalue(L,-1); lua_rawseti(L,(-10001),k); } lua_pushvalue(L,-2); lua_setfenv(L,-2); lua_setfield(L,-3,fname); } static void newfenv(lua_State*L,lua_CFunction cls){ lua_createtable(L,0,1); lua_pushcfunction(L,cls); lua_setfield(L,-2,"__close"); } static int luaopen_io(lua_State*L){ createmeta(L); newfenv(L,io_fclose); lua_replace(L,(-10001)); luaL_register(L,"io",iolib); newfenv(L,io_noclose); createstdfile(L,stdin,1,"stdin"); createstdfile(L,stdout,2,"stdout"); createstdfile(L,stderr,0,"stderr"); lua_pop(L,1); lua_getfield(L,-1,"popen"); newfenv(L,io_pclose); lua_setfenv(L,-2); lua_pop(L,1); return 1; } static int os_pushresult(lua_State*L,int i,const char*filename){ int en=errno; if(i){ lua_pushboolean(L,1); return 1; } else{ lua_pushnil(L); lua_pushfstring(L,"%s: %s",filename,strerror(en)); lua_pushinteger(L,en); return 3; } } static int os_remove(lua_State*L){ const char*filename=luaL_checkstring(L,1); return os_pushresult(L,remove(filename)==0,filename); } static int os_exit(lua_State*L){ exit(luaL_optint(L,1,EXIT_SUCCESS)); } static const luaL_Reg syslib[]={ {"exit",os_exit}, {"remove",os_remove}, {NULL,NULL} }; static int luaopen_os(lua_State*L){ luaL_register(L,"os",syslib); return 1; } #define uchar(c)((unsigned char)(c)) static ptrdiff_t posrelat(ptrdiff_t pos,size_t len){ if(pos<0)pos+=(ptrdiff_t)len+1; return(pos>=0)?pos:0; } static int str_sub(lua_State*L){ size_t l; const char*s=luaL_checklstring(L,1,&l); ptrdiff_t start=posrelat(luaL_checkinteger(L,2),l); ptrdiff_t end=posrelat(luaL_optinteger(L,3,-1),l); if(start<1)start=1; if(end>(ptrdiff_t)l)end=(ptrdiff_t)l; if(start<=end) lua_pushlstring(L,s+start-1,end-start+1); else lua_pushliteral(L,""); return 1; } static int str_lower(lua_State*L){ size_t l; size_t i; luaL_Buffer b; const char*s=luaL_checklstring(L,1,&l); luaL_buffinit(L,&b); for(i=0;i0) luaL_addlstring(&b,s,l); luaL_pushresult(&b); return 1; } static int str_byte(lua_State*L){ size_t l; const char*s=luaL_checklstring(L,1,&l); ptrdiff_t posi=posrelat(luaL_optinteger(L,2,1),l); ptrdiff_t pose=posrelat(luaL_optinteger(L,3,posi),l); int n,i; if(posi<=0)posi=1; if((size_t)pose>l)pose=l; if(posi>pose)return 0; n=(int)(pose-posi+1); if(posi+n<=pose) luaL_error(L,"string slice too long"); luaL_checkstack(L,n,"string slice too long"); for(i=0;i=ms->level||ms->capture[l].len==(-1)) return luaL_error(ms->L,"invalid capture index"); return l; } static int capture_to_close(MatchState*ms){ int level=ms->level; for(level--;level>=0;level--) if(ms->capture[level].len==(-1))return level; return luaL_error(ms->L,"invalid pattern capture"); } static const char*classend(MatchState*ms,const char*p){ switch(*p++){ case'%':{ if(*p=='\0') luaL_error(ms->L,"malformed pattern (ends with "LUA_QL("%%")")"); return p+1; } case'[':{ if(*p=='^')p++; do{ if(*p=='\0') luaL_error(ms->L,"malformed pattern (missing "LUA_QL("]")")"); if(*(p++)=='%'&&*p!='\0') p++; }while(*p!=']'); return p+1; } default:{ return p; } } } static int match_class(int c,int cl){ int res; switch(tolower(cl)){ case'a':res=isalpha(c);break; case'c':res=iscntrl(c);break; case'd':res=isdigit(c);break; case'l':res=islower(c);break; case'p':res=ispunct(c);break; case's':res=isspace(c);break; case'u':res=isupper(c);break; case'w':res=isalnum(c);break; case'x':res=isxdigit(c);break; case'z':res=(c==0);break; default:return(cl==c); } return(islower(cl)?res:!res); } static int matchbracketclass(int c,const char*p,const char*ec){ int sig=1; if(*(p+1)=='^'){ sig=0; p++; } while(++pL,"unbalanced pattern"); if(*s!=*p)return NULL; else{ int b=*p; int e=*(p+1); int cont=1; while(++ssrc_end){ if(*s==e){ if(--cont==0)return s+1; } else if(*s==b)cont++; } } return NULL; } static const char*max_expand(MatchState*ms,const char*s, const char*p,const char*ep){ ptrdiff_t i=0; while((s+i)src_end&&singlematch(uchar(*(s+i)),p,ep)) i++; while(i>=0){ const char*res=match(ms,(s+i),ep+1); if(res)return res; i--; } return NULL; } static const char*min_expand(MatchState*ms,const char*s, const char*p,const char*ep){ for(;;){ const char*res=match(ms,s,ep+1); if(res!=NULL) return res; else if(ssrc_end&&singlematch(uchar(*s),p,ep)) s++; else return NULL; } } static const char*start_capture(MatchState*ms,const char*s, const char*p,int what){ const char*res; int level=ms->level; if(level>=32)luaL_error(ms->L,"too many captures"); ms->capture[level].init=s; ms->capture[level].len=what; ms->level=level+1; if((res=match(ms,s,p))==NULL) ms->level--; return res; } static const char*end_capture(MatchState*ms,const char*s, const char*p){ int l=capture_to_close(ms); const char*res; ms->capture[l].len=s-ms->capture[l].init; if((res=match(ms,s,p))==NULL) ms->capture[l].len=(-1); return res; } static const char*match_capture(MatchState*ms,const char*s,int l){ size_t len; l=check_capture(ms,l); len=ms->capture[l].len; if((size_t)(ms->src_end-s)>=len&& memcmp(ms->capture[l].init,s,len)==0) return s+len; else return NULL; } static const char*match(MatchState*ms,const char*s,const char*p){ init: switch(*p){ case'(':{ if(*(p+1)==')') return start_capture(ms,s,p+2,(-2)); else return start_capture(ms,s,p+1,(-1)); } case')':{ return end_capture(ms,s,p+1); } case'%':{ switch(*(p+1)){ case'b':{ s=matchbalance(ms,s,p+2); if(s==NULL)return NULL; p+=4;goto init; } case'f':{ const char*ep;char previous; p+=2; if(*p!='[') luaL_error(ms->L,"missing "LUA_QL("[")" after " LUA_QL("%%f")" in pattern"); ep=classend(ms,p); previous=(s==ms->src_init)?'\0':*(s-1); if(matchbracketclass(uchar(previous),p,ep-1)|| !matchbracketclass(uchar(*s),p,ep-1))return NULL; p=ep;goto init; } default:{ if(isdigit(uchar(*(p+1)))){ s=match_capture(ms,s,uchar(*(p+1))); if(s==NULL)return NULL; p+=2;goto init; } goto dflt; } } } case'\0':{ return s; } case'$':{ if(*(p+1)=='\0') return(s==ms->src_end)?s:NULL; else goto dflt; } default:dflt:{ const char*ep=classend(ms,p); int m=ssrc_end&&singlematch(uchar(*s),p,ep); switch(*ep){ case'?':{ const char*res; if(m&&((res=match(ms,s+1,ep+1))!=NULL)) return res; p=ep+1;goto init; } case'*':{ return max_expand(ms,s,p,ep); } case'+':{ return(m?max_expand(ms,s+1,p,ep):NULL); } case'-':{ return min_expand(ms,s,p,ep); } default:{ if(!m)return NULL; s++;p=ep;goto init; } } } } } static const char*lmemfind(const char*s1,size_t l1, const char*s2,size_t l2){ if(l2==0)return s1; else if(l2>l1)return NULL; else{ const char*init; l2--; l1=l1-l2; while(l1>0&&(init=(const char*)memchr(s1,*s2,l1))!=NULL){ init++; if(memcmp(init,s2+1,l2)==0) return init-1; else{ l1-=init-s1; s1=init; } } return NULL; } } static void push_onecapture(MatchState*ms,int i,const char*s, const char*e){ if(i>=ms->level){ if(i==0) lua_pushlstring(ms->L,s,e-s); else luaL_error(ms->L,"invalid capture index"); } else{ ptrdiff_t l=ms->capture[i].len; if(l==(-1))luaL_error(ms->L,"unfinished capture"); if(l==(-2)) lua_pushinteger(ms->L,ms->capture[i].init-ms->src_init+1); else lua_pushlstring(ms->L,ms->capture[i].init,l); } } static int push_captures(MatchState*ms,const char*s,const char*e){ int i; int nlevels=(ms->level==0&&s)?1:ms->level; luaL_checkstack(ms->L,nlevels,"too many captures"); for(i=0;il1)init=(ptrdiff_t)l1; if(find&&(lua_toboolean(L,4)|| strpbrk(p,"^$*+?.([%-")==NULL)){ const char*s2=lmemfind(s+init,l1-init,p,l2); if(s2){ lua_pushinteger(L,s2-s+1); lua_pushinteger(L,s2-s+l2); return 2; } } else{ MatchState ms; int anchor=(*p=='^')?(p++,1):0; const char*s1=s+init; ms.L=L; ms.src_init=s; ms.src_end=s+l1; do{ const char*res; ms.level=0; if((res=match(&ms,s1,p))!=NULL){ if(find){ lua_pushinteger(L,s1-s+1); lua_pushinteger(L,res-s); return push_captures(&ms,NULL,0)+2; } else return push_captures(&ms,s1,res); } }while(s1++L,3,&l); for(i=0;iL; switch(lua_type(L,3)){ case 3: case 4:{ add_s(ms,b,s,e); return; } case 6:{ int n; lua_pushvalue(L,3); n=push_captures(ms,s,e); lua_call(L,n,1); break; } case 5:{ push_onecapture(ms,0,s,e); lua_gettable(L,3); break; } } if(!lua_toboolean(L,-1)){ lua_pop(L,1); lua_pushlstring(L,s,e-s); } else if(!lua_isstring(L,-1)) luaL_error(L,"invalid replacement value (a %s)",luaL_typename(L,-1)); luaL_addvalue(b); } static int str_gsub(lua_State*L){ size_t srcl; const char*src=luaL_checklstring(L,1,&srcl); const char*p=luaL_checkstring(L,2); int tr=lua_type(L,3); int max_s=luaL_optint(L,4,srcl+1); int anchor=(*p=='^')?(p++,1):0; int n=0; MatchState ms; luaL_Buffer b; luaL_argcheck(L,tr==3||tr==4|| tr==6||tr==5,3, "string/function/table expected"); luaL_buffinit(L,&b); ms.L=L; ms.src_init=src; ms.src_end=src+srcl; while(nsrc) src=e; else if(src=sizeof("-+ #0")) luaL_error(L,"invalid format (repeated flags)"); if(isdigit(uchar(*p)))p++; if(isdigit(uchar(*p)))p++; if(*p=='.'){ p++; if(isdigit(uchar(*p)))p++; if(isdigit(uchar(*p)))p++; } if(isdigit(uchar(*p))) luaL_error(L,"invalid format (width or precision too long)"); *(form++)='%'; strncpy(form,strfrmt,p-strfrmt+1); form+=p-strfrmt+1; *form='\0'; return p; } static void addintlen(char*form){ size_t l=strlen(form); char spec=form[l-1]; strcpy(form+l-1,"l"); form[l+sizeof("l")-2]=spec; form[l+sizeof("l")-1]='\0'; } static int str_format(lua_State*L){ int top=lua_gettop(L); int arg=1; size_t sfl; const char*strfrmt=luaL_checklstring(L,arg,&sfl); const char*strfrmt_end=strfrmt+sfl; luaL_Buffer b; luaL_buffinit(L,&b); while(strfrmttop) luaL_argerror(L,arg,"no value"); strfrmt=scanformat(L,strfrmt,form); switch(*strfrmt++){ case'c':{ sprintf(buff,form,(int)luaL_checknumber(L,arg)); break; } case'd':case'i':{ addintlen(form); sprintf(buff,form,(long)luaL_checknumber(L,arg)); break; } case'o':case'u':case'x':case'X':{ addintlen(form); sprintf(buff,form,(unsigned long)luaL_checknumber(L,arg)); break; } case'e':case'E':case'f': case'g':case'G':{ sprintf(buff,form,(double)luaL_checknumber(L,arg)); break; } case'q':{ addquoted(L,&b,arg); continue; } case's':{ size_t l; const char*s=luaL_checklstring(L,arg,&l); if(!strchr(form,'.')&&l>=100){ lua_pushvalue(L,arg); luaL_addvalue(&b); continue; } else{ sprintf(buff,form,s); break; } } default:{ return luaL_error(L,"invalid option "LUA_QL("%%%c")" to " LUA_QL("format"),*(strfrmt-1)); } } luaL_addlstring(&b,buff,strlen(buff)); } } luaL_pushresult(&b); return 1; } static const luaL_Reg strlib[]={ {"byte",str_byte}, {"char",str_char}, {"find",str_find}, {"format",str_format}, {"gmatch",gmatch}, {"gsub",str_gsub}, {"lower",str_lower}, {"match",str_match}, {"rep",str_rep}, {"sub",str_sub}, {"upper",str_upper}, {NULL,NULL} }; static void createmetatable(lua_State*L){ lua_createtable(L,0,1); lua_pushliteral(L,""); lua_pushvalue(L,-2); lua_setmetatable(L,-2); lua_pop(L,1); lua_pushvalue(L,-2); lua_setfield(L,-2,"__index"); lua_pop(L,1); } static int luaopen_string(lua_State*L){ luaL_register(L,"string",strlib); createmetatable(L); return 1; } static const luaL_Reg lualibs[]={ {"",luaopen_base}, {"table",luaopen_table}, {"io",luaopen_io}, {"os",luaopen_os}, {"string",luaopen_string}, {NULL,NULL} }; static void luaL_openlibs(lua_State*L){ const luaL_Reg*lib=lualibs; for(;lib->func;lib++){ lua_pushcfunction(L,lib->func); lua_pushstring(L,lib->name); lua_call(L,1,0); } } typedef unsigned int UB; static UB barg(lua_State*L,int idx){ union{lua_Number n;U64 b;}bn; bn.n=lua_tonumber(L,idx)+6755399441055744.0; if(bn.n==0.0&&!lua_isnumber(L,idx))luaL_typerror(L,idx,"number"); return(UB)bn.b; } #define BRET(b)lua_pushnumber(L,(lua_Number)(int)(b));return 1; static int tobit(lua_State*L){ BRET(barg(L,1))} static int bnot(lua_State*L){ BRET(~barg(L,1))} static int band(lua_State*L){ int i;UB b=barg(L,1);for(i=lua_gettop(L);i>1;i--)b&=barg(L,i);BRET(b)} static int bor(lua_State*L){ int i;UB b=barg(L,1);for(i=lua_gettop(L);i>1;i--)b|=barg(L,i);BRET(b)} static int bxor(lua_State*L){ int i;UB b=barg(L,1);for(i=lua_gettop(L);i>1;i--)b^=barg(L,i);BRET(b)} static int lshift(lua_State*L){ UB b=barg(L,1),n=barg(L,2)&31;BRET(b<>n)} static int arshift(lua_State*L){ UB b=barg(L,1),n=barg(L,2)&31;BRET((int)b>>n)} static int rol(lua_State*L){ UB b=barg(L,1),n=barg(L,2)&31;BRET((b<>(32-n)))} static int ror(lua_State*L){ UB b=barg(L,1),n=barg(L,2)&31;BRET((b>>n)|(b<<(32-n)))} static int bswap(lua_State*L){ UB b=barg(L,1);b=(b>>24)|((b>>8)&0xff00)|((b&0xff00)<<8)|(b<<24);BRET(b)} static int tohex(lua_State*L){ UB b=barg(L,1); int n=lua_isnone(L,2)?8:(int)barg(L,2); const char*hexdigits="0123456789abcdef"; char buf[8]; int i; if(n<0){n=-n;hexdigits="0123456789ABCDEF";} if(n>8)n=8; for(i=(int)n;--i>=0;){buf[i]=hexdigits[b&15];b>>=4;} lua_pushlstring(L,buf,(size_t)n); return 1; } static const struct luaL_Reg bitlib[]={ {"tobit",tobit}, {"bnot",bnot}, {"band",band}, {"bor",bor}, {"bxor",bxor}, {"lshift",lshift}, {"rshift",rshift}, {"arshift",arshift}, {"rol",rol}, {"ror",ror}, {"bswap",bswap}, {"tohex",tohex}, {NULL,NULL} }; int main(int argc,char**argv){ lua_State*L=luaL_newstate(); int i; luaL_openlibs(L); luaL_register(L,"bit",bitlib); if(argc<2)return sizeof(void*); lua_createtable(L,0,1); lua_pushstring(L,argv[1]); lua_rawseti(L,-2,0); lua_setglobal(L,"arg"); if(luaL_loadfile(L,argv[1])) goto err; for(i=2;i #include #include #include #include "cmp.h" static bool read_bytes(void *data, size_t sz, FILE *fh) { return fread(data, sizeof(uint8_t), sz, fh) == (sz * sizeof(uint8_t)); } static bool file_reader(cmp_ctx_t *ctx, void *data, size_t limit) { return read_bytes(data, limit, (FILE *)ctx->buf); } static bool file_skipper(cmp_ctx_t *ctx, size_t count) { return fseek((FILE *)ctx->buf, count, SEEK_CUR); } static size_t file_writer(cmp_ctx_t *ctx, const void *data, size_t count) { return fwrite(data, sizeof(uint8_t), count, (FILE *)ctx->buf); } void error_and_exit(const char *msg) { fprintf(stderr, "%s\n\n", msg); exit(EXIT_FAILURE); } int main(void) { FILE *fh = NULL; cmp_ctx_t cmp; uint32_t array_size = 0; uint32_t str_size = 0; char hello[6] = {0, 0, 0, 0, 0, 0}; char message_pack[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; fh = fopen("cmp_data.dat", "w+b"); if (fh == NULL) error_and_exit("Error opening data.dat"); cmp_init(&cmp, fh, file_reader, file_skipper, file_writer); if (!cmp_write_array(&cmp, 2)) error_and_exit(cmp_strerror(&cmp)); if (!cmp_write_str(&cmp, "Hello", 5)) error_and_exit(cmp_strerror(&cmp)); if (!cmp_write_str(&cmp, "MessagePack", 11)) error_and_exit(cmp_strerror(&cmp)); rewind(fh); if (!cmp_read_array(&cmp, &array_size)) error_and_exit(cmp_strerror(&cmp)); /* You can read the str byte size and then read str bytes... */ if (!cmp_read_str_size(&cmp, &str_size)) error_and_exit(cmp_strerror(&cmp)); if (str_size > (sizeof(hello) - 1)) error_and_exit("Packed 'hello' length too long\n"); if (!read_bytes(hello, str_size, fh)) error_and_exit(cmp_strerror(&cmp)); /* * ...or you can set the maximum number of bytes to read and do it all in * one call */ str_size = sizeof(message_pack); if (!cmp_read_str(&cmp, message_pack, &str_size)) error_and_exit(cmp_strerror(&cmp)); printf("Array Length: %u.\n", array_size); printf("[\"%s\", \"%s\"]\n", hello, message_pack); fclose(fh); return EXIT_SUCCESS; } ``` ## Advanced Usage See the `examples` folder. ## Fast, Lightweight, Flexible, and Robust CMP uses no internal buffers; conversions, encoding and decoding are done on the fly. CMP's source and header file together are ~4k LOC. CMP makes no heap allocations. CMP uses standardized types rather than declaring its own, and it depends only on `stdbool.h`, `stdint.h` and `string.h`. CMP is written using C89 (ANSI C), aside, of course, from its use of fixed-width integer types and `bool`. On the other hand, CMP's test suite requires C99. CMP only requires the programmer supply a read function, a write function, and an optional skip function. In this way, the programmer can use CMP on memory, files, sockets, etc. CMP is portable. It uses fixed-width integer types, and checks the endianness of the machine at runtime before swapping bytes (MessagePack is big-endian). CMP provides a fairly comprehensive error reporting mechanism modeled after `errno` and `strerror`. CMP is thread aware; while contexts cannot be shared between threads, each thread may use its own context freely. CMP is tested using the MessagePack test suite as well as a large set of custom test cases. Its small test program is compiled with clang using `-Wall -Werror -Wextra ...` along with several other flags, and generates no compilation errors in either clang or GCC. CMP's source is written as readably as possible, using explicit, descriptive variable names and a consistent, clear style. CMP's source is written to be as secure as possible. Its testing suite checks for invalid values, and data is always treated as suspect before it passes validation. CMP's API is designed to be clear, convenient and unsurprising. Strings are null-terminated, binary data is not, error codes are clear, and so on. CMP provides optional backwards compatibility for use with other MessagePack implementations that only implement version 4 of the spec. ## Building There is no build system for CMP. The programmer can drop `cmp.c` and `cmp.h` in their source tree and modify as necessary. No special compiler settings are required to build it, and it generates no compilation errors in either clang or gcc. ## Versioning CMP's versions are single integers. I don't use semantic versioning because I don't guarantee that any version is completely compatible with any other. In general, semantic versioning provides a false sense of security. You should be evaluating compatibility yourself, not relying on some stranger's versioning convention. ## Stability I only guarantee stability for versions released on [the releases page](../../releases). While rare, both `master` and `develop` branches may have errors or mismatched versions. ## Backwards Compatibility Version 4 of the MessagePack spec has no `BIN` type, and provides no `STR8` marker. In order to remain backwards compatible with version 4 of MessagePack, do the following: Avoid these functions: - `cmp_write_bin` - `cmp_write_bin_marker` - `cmp_write_str8_marker` - `cmp_write_str8` - `cmp_write_bin8_marker` - `cmp_write_bin8` - `cmp_write_bin16_marker` - `cmp_write_bin16` - `cmp_write_bin32_marker` - `cmp_write_bin32` Use these functions in lieu of their v5 counterparts: - `cmp_write_str_marker_v4` instead of `cmp_write_str_marker` - `cmp_write_str_v4` instead of `cmp_write_str` - `cmp_write_object_v4` instead of `cmp_write_object` MoarVM-2018.03/3rdparty/cmp/TODO.md0000644000175000017510000000120213252357721016623 0ustar samanthasamantha# To Do - Work on fixing double-copy issue - Essentially everything is written to a `cmp_object_t` before it's written out to the caller, which is inefficient. The reasoning for this is to not pollute the caller's environment should an error occur, but in practice it's probably better to say, "you can't trust the contents of output arguments you pass to CMP if the call fails". - Build real docs - Probably still just a Markdown file, but still, things have gotten complex enough that `cmp.h` and `README.md` don't really cover it anymore. - Prevent users from using extended types < 0 (reserved by MessagePack) MoarVM-2018.03/3rdparty/cmp/cmp.c0000644000175000017510000022507513252357721016477 0ustar samanthasamantha/* The MIT License (MIT) Copyright (c) 2017 Charles Gunyon Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #define bool int #define true 1 #define false 0 #include "cmp.h" static const uint32_t version = 18; static const uint32_t mp_version = 5; enum { POSITIVE_FIXNUM_MARKER = 0x00, FIXMAP_MARKER = 0x80, FIXARRAY_MARKER = 0x90, FIXSTR_MARKER = 0xA0, NIL_MARKER = 0xC0, FALSE_MARKER = 0xC2, TRUE_MARKER = 0xC3, BIN8_MARKER = 0xC4, BIN16_MARKER = 0xC5, BIN32_MARKER = 0xC6, EXT8_MARKER = 0xC7, EXT16_MARKER = 0xC8, EXT32_MARKER = 0xC9, FLOAT_MARKER = 0xCA, DOUBLE_MARKER = 0xCB, U8_MARKER = 0xCC, U16_MARKER = 0xCD, U32_MARKER = 0xCE, U64_MARKER = 0xCF, S8_MARKER = 0xD0, S16_MARKER = 0xD1, S32_MARKER = 0xD2, S64_MARKER = 0xD3, FIXEXT1_MARKER = 0xD4, FIXEXT2_MARKER = 0xD5, FIXEXT4_MARKER = 0xD6, FIXEXT8_MARKER = 0xD7, FIXEXT16_MARKER = 0xD8, STR8_MARKER = 0xD9, STR16_MARKER = 0xDA, STR32_MARKER = 0xDB, ARRAY16_MARKER = 0xDC, ARRAY32_MARKER = 0xDD, MAP16_MARKER = 0xDE, MAP32_MARKER = 0xDF, NEGATIVE_FIXNUM_MARKER = 0xE0 }; enum { FIXARRAY_SIZE = 0xF, FIXMAP_SIZE = 0xF, FIXSTR_SIZE = 0x1F }; enum { ERROR_NONE, STR_DATA_LENGTH_TOO_LONG_ERROR, BIN_DATA_LENGTH_TOO_LONG_ERROR, ARRAY_LENGTH_TOO_LONG_ERROR, MAP_LENGTH_TOO_LONG_ERROR, INPUT_VALUE_TOO_LARGE_ERROR, FIXED_VALUE_WRITING_ERROR, TYPE_MARKER_READING_ERROR, TYPE_MARKER_WRITING_ERROR, DATA_READING_ERROR, DATA_WRITING_ERROR, EXT_TYPE_READING_ERROR, EXT_TYPE_WRITING_ERROR, INVALID_TYPE_ERROR, LENGTH_READING_ERROR, LENGTH_WRITING_ERROR, SKIP_DEPTH_LIMIT_EXCEEDED_ERROR, INTERNAL_ERROR, ERROR_MAX }; const char *cmp_error_messages[ERROR_MAX + 1] = { "No Error", "Specified string data length is too long (> 0xFFFFFFFF)", "Specified binary data length is too long (> 0xFFFFFFFF)", "Specified array length is too long (> 0xFFFFFFFF)", "Specified map length is too long (> 0xFFFFFFFF)", "Input value is too large", "Error writing fixed value", "Error reading type marker", "Error writing type marker", "Error reading packed data", "Error writing packed data", "Error reading ext type", "Error writing ext type", "Invalid type", "Error reading size", "Error writing size", "Depth limit exceeded while skipping", "Internal error", "Max Error" }; static const int32_t _i = 1; #define is_bigendian() ((*(char *)&_i) == 0) static uint16_t be16(uint16_t x) { char *b = (char *)&x; if (!is_bigendian()) { char swap = 0; swap = b[0]; b[0] = b[1]; b[1] = swap; } return x; } static uint32_t be32(uint32_t x) { char *b = (char *)&x; if (!is_bigendian()) { char swap = 0; swap = b[0]; b[0] = b[3]; b[3] = swap; swap = b[1]; b[1] = b[2]; b[2] = swap; } return x; } static uint64_t be64(uint64_t x) { char *b = (char *)&x; if (!is_bigendian()) { char swap = 0; swap = b[0]; b[0] = b[7]; b[7] = swap; swap = b[1]; b[1] = b[6]; b[6] = swap; swap = b[2]; b[2] = b[5]; b[5] = swap; swap = b[3]; b[3] = b[4]; b[4] = swap; } return x; } static float decode_befloat(char *b) { float f = 0.; char *fb = (char *)&f; if (!is_bigendian()) { fb[0] = b[3]; fb[1] = b[2]; fb[2] = b[1]; fb[3] = b[0]; } return f; } static double decode_bedouble(char *b) { double d = 0.; char *db = (char *)&d; if (!is_bigendian()) { db[0] = b[7]; db[1] = b[6]; db[2] = b[5]; db[3] = b[4]; db[4] = b[3]; db[5] = b[2]; db[6] = b[1]; db[7] = b[0]; } return d; } static bool read_byte(cmp_ctx_t *ctx, uint8_t *x) { return ctx->read(ctx, x, sizeof(uint8_t)); } static bool write_byte(cmp_ctx_t *ctx, uint8_t x) { return (ctx->write(ctx, &x, sizeof(uint8_t)) == (sizeof(uint8_t))); } static bool skip_bytes(cmp_ctx_t *ctx, size_t count) { if (ctx->skip) { return ctx->skip(ctx, count); } else { uint8_t floor; size_t i; for (i = 0; i < count; i++) { if (!ctx->read(ctx, &floor, sizeof(uint8_t))) { return false; } } return true; } } static bool read_type_marker(cmp_ctx_t *ctx, uint8_t *marker) { if (read_byte(ctx, marker)) { return true; } ctx->error = TYPE_MARKER_READING_ERROR; return false; } static bool write_type_marker(cmp_ctx_t *ctx, uint8_t marker) { if (write_byte(ctx, marker)) return true; ctx->error = TYPE_MARKER_WRITING_ERROR; return false; } static bool write_fixed_value(cmp_ctx_t *ctx, uint8_t value) { if (write_byte(ctx, value)) return true; ctx->error = FIXED_VALUE_WRITING_ERROR; return false; } static bool type_marker_to_cmp_type(uint8_t type_marker, uint8_t *cmp_type) { if (type_marker <= 0x7F) { *cmp_type = CMP_TYPE_POSITIVE_FIXNUM; return true; } if (type_marker <= 0x8F) { *cmp_type = CMP_TYPE_FIXMAP; return true; } if (type_marker <= 0x9F) { *cmp_type = CMP_TYPE_FIXARRAY; return true; } if (type_marker <= 0xBF) { *cmp_type = CMP_TYPE_FIXSTR; return true; } if (type_marker >= 0xE0) { *cmp_type = CMP_TYPE_NEGATIVE_FIXNUM; return true; } switch (type_marker) { case NIL_MARKER: *cmp_type = CMP_TYPE_NIL; return true; case FALSE_MARKER: *cmp_type = CMP_TYPE_BOOLEAN; return true; case TRUE_MARKER: *cmp_type = CMP_TYPE_BOOLEAN; return true; case BIN8_MARKER: *cmp_type = CMP_TYPE_BIN8; return true; case BIN16_MARKER: *cmp_type = CMP_TYPE_BIN16; return true; case BIN32_MARKER: *cmp_type = CMP_TYPE_BIN32; return true; case EXT8_MARKER: *cmp_type = CMP_TYPE_EXT8; return true; case EXT16_MARKER: *cmp_type = CMP_TYPE_EXT16; return true; case EXT32_MARKER: *cmp_type = CMP_TYPE_EXT32; return true; case FLOAT_MARKER: *cmp_type = CMP_TYPE_FLOAT; return true; case DOUBLE_MARKER: *cmp_type = CMP_TYPE_DOUBLE; return true; case U8_MARKER: *cmp_type = CMP_TYPE_UINT8; return true; case U16_MARKER: *cmp_type = CMP_TYPE_UINT16; return true; case U32_MARKER: *cmp_type = CMP_TYPE_UINT32; return true; case U64_MARKER: *cmp_type = CMP_TYPE_UINT64; return true; case S8_MARKER: *cmp_type = CMP_TYPE_SINT8; return true; case S16_MARKER: *cmp_type = CMP_TYPE_SINT16; return true; case S32_MARKER: *cmp_type = CMP_TYPE_SINT32; return true; case S64_MARKER: *cmp_type = CMP_TYPE_SINT64; return true; case FIXEXT1_MARKER: *cmp_type = CMP_TYPE_FIXEXT1; return true; case FIXEXT2_MARKER: *cmp_type = CMP_TYPE_FIXEXT2; return true; case FIXEXT4_MARKER: *cmp_type = CMP_TYPE_FIXEXT4; return true; case FIXEXT8_MARKER: *cmp_type = CMP_TYPE_FIXEXT8; return true; case FIXEXT16_MARKER: *cmp_type = CMP_TYPE_FIXEXT16; return true; case STR8_MARKER: *cmp_type = CMP_TYPE_STR8; return true; case STR16_MARKER: *cmp_type = CMP_TYPE_STR16; return true; case STR32_MARKER: *cmp_type = CMP_TYPE_STR32; return true; case ARRAY16_MARKER: *cmp_type = CMP_TYPE_ARRAY16; return true; case ARRAY32_MARKER: *cmp_type = CMP_TYPE_ARRAY32; return true; case MAP16_MARKER: *cmp_type = CMP_TYPE_MAP16; return true; case MAP32_MARKER: *cmp_type = CMP_TYPE_MAP32; return true; default: return false; } } static bool read_type_size(cmp_ctx_t *ctx, uint8_t type_marker, uint8_t cmp_type, uint32_t *size) { uint8_t u8temp = 0; uint16_t u16temp = 0; uint32_t u32temp = 0; switch (cmp_type) { case CMP_TYPE_POSITIVE_FIXNUM: *size = 0; return true; case CMP_TYPE_FIXMAP: *size = (type_marker & FIXMAP_SIZE); return true; case CMP_TYPE_FIXARRAY: *size = (type_marker & FIXARRAY_SIZE); return true; case CMP_TYPE_FIXSTR: *size = (type_marker & FIXSTR_SIZE); return true; case CMP_TYPE_NIL: *size = 0; return true; case CMP_TYPE_BOOLEAN: *size = 0; return true; case CMP_TYPE_BIN8: if (!ctx->read(ctx, &u8temp, sizeof(uint8_t))) { ctx->error = LENGTH_READING_ERROR; return false; } *size = u8temp; return true; case CMP_TYPE_BIN16: if (!ctx->read(ctx, &u16temp, sizeof(uint16_t))) { ctx->error = LENGTH_READING_ERROR; return false; } *size = be16(u16temp); return true; case CMP_TYPE_BIN32: if (!ctx->read(ctx, &u32temp, sizeof(uint32_t))) { ctx->error = LENGTH_READING_ERROR; return false; } *size = be32(u32temp); return true; case CMP_TYPE_EXT8: if (!ctx->read(ctx, &u8temp, sizeof(uint8_t))) { ctx->error = LENGTH_READING_ERROR; return false; } *size = u8temp; return true; case CMP_TYPE_EXT16: if (!ctx->read(ctx, &u16temp, sizeof(uint16_t))) { ctx->error = LENGTH_READING_ERROR; return false; } *size = be16(u16temp); return true; case CMP_TYPE_EXT32: if (!ctx->read(ctx, &u32temp, sizeof(uint32_t))) { ctx->error = LENGTH_READING_ERROR; return false; } *size = be32(u32temp); return true; case CMP_TYPE_FLOAT: *size = 4; return true; case CMP_TYPE_DOUBLE: *size = 8; return true; case CMP_TYPE_UINT8: *size = 1; return true; case CMP_TYPE_UINT16: *size = 2; return true; case CMP_TYPE_UINT32: *size = 4; return true; case CMP_TYPE_UINT64: *size = 8; return true; case CMP_TYPE_SINT8: *size = 1; return true; case CMP_TYPE_SINT16: *size = 2; return true; case CMP_TYPE_SINT32: *size = 4; return true; case CMP_TYPE_SINT64: *size = 8; return true; case CMP_TYPE_FIXEXT1: *size = 1; return true; case CMP_TYPE_FIXEXT2: *size = 2; return true; case CMP_TYPE_FIXEXT4: *size = 4; return true; case CMP_TYPE_FIXEXT8: *size = 8; return true; case CMP_TYPE_FIXEXT16: *size = 16; return true; case CMP_TYPE_STR8: if (!ctx->read(ctx, &u8temp, sizeof(uint8_t))) { ctx->error = DATA_READING_ERROR; return false; } *size = u8temp; return true; case CMP_TYPE_STR16: if (!ctx->read(ctx, &u16temp, sizeof(uint16_t))) { ctx->error = DATA_READING_ERROR; return false; } *size = be16(u16temp); return true; case CMP_TYPE_STR32: if (!ctx->read(ctx, &u32temp, sizeof(uint32_t))) { ctx->error = DATA_READING_ERROR; return false; } *size = be32(u32temp); return true; case CMP_TYPE_ARRAY16: if (!ctx->read(ctx, &u16temp, sizeof(uint16_t))) { ctx->error = DATA_READING_ERROR; return false; } *size = be16(u16temp); return true; case CMP_TYPE_ARRAY32: if (!ctx->read(ctx, &u32temp, sizeof(uint32_t))) { ctx->error = DATA_READING_ERROR; return false; } *size = be32(u32temp); return true; case CMP_TYPE_MAP16: if (!ctx->read(ctx, &u16temp, sizeof(uint16_t))) { ctx->error = DATA_READING_ERROR; return false; } *size = be16(u16temp); return true; case CMP_TYPE_MAP32: if (!ctx->read(ctx, &u32temp, sizeof(uint32_t))) { ctx->error = DATA_READING_ERROR; return false; } *size = be32(u32temp); return true; case CMP_TYPE_NEGATIVE_FIXNUM: *size = 0; return true; default: ctx->error = INVALID_TYPE_ERROR; return false; } } static bool read_obj_data(cmp_ctx_t *ctx, uint8_t type_marker, cmp_object_t *obj) { switch (obj->type) { case CMP_TYPE_POSITIVE_FIXNUM: obj->as.u8 = type_marker; return true; case CMP_TYPE_NEGATIVE_FIXNUM: obj->as.s8 = type_marker; return true; case CMP_TYPE_NIL: obj->as.u8 = 0; return true; case CMP_TYPE_BOOLEAN: switch (type_marker) { case TRUE_MARKER: obj->as.boolean = true; return true; case FALSE_MARKER: obj->as.boolean = false; return true; default: break; } ctx->error = INTERNAL_ERROR; return false; case CMP_TYPE_UINT8: if (!ctx->read(ctx, &obj->as.u8, sizeof(uint8_t))) { ctx->error = DATA_READING_ERROR; return false; } return true; case CMP_TYPE_UINT16: if (!ctx->read(ctx, &obj->as.u16, sizeof(uint16_t))) { ctx->error = DATA_READING_ERROR; return false; } obj->as.u16 = be16(obj->as.u16); return true; case CMP_TYPE_UINT32: if (!ctx->read(ctx, &obj->as.u32, sizeof(uint32_t))) { ctx->error = DATA_READING_ERROR; return false; } obj->as.u32 = be32(obj->as.u32); return true; case CMP_TYPE_UINT64: if (!ctx->read(ctx, &obj->as.u64, sizeof(uint64_t))) { ctx->error = DATA_READING_ERROR; return false; } obj->as.u64 = be64(obj->as.u64); return true; case CMP_TYPE_SINT8: if (!ctx->read(ctx, &obj->as.s8, sizeof(int8_t))) { ctx->error = DATA_READING_ERROR; return false; } return true; case CMP_TYPE_SINT16: if (!ctx->read(ctx, &obj->as.s16, sizeof(int16_t))) { ctx->error = DATA_READING_ERROR; return false; } obj->as.s16 = be16(obj->as.s16); return true; case CMP_TYPE_SINT32: if (!ctx->read(ctx, &obj->as.s32, sizeof(int32_t))) { ctx->error = DATA_READING_ERROR; return false; } obj->as.s32 = be32(obj->as.s32); return true; case CMP_TYPE_SINT64: if (!ctx->read(ctx, &obj->as.s64, sizeof(int64_t))) { ctx->error = DATA_READING_ERROR; return false; } obj->as.s64 = be64(obj->as.s64); return true; case CMP_TYPE_FLOAT: { char bytes[4]; if (!ctx->read(ctx, bytes, 4)) { ctx->error = DATA_READING_ERROR; return false; } obj->as.flt = decode_befloat(bytes); return true; } case CMP_TYPE_DOUBLE: { char bytes[8]; if (!ctx->read(ctx, bytes, 8)) { ctx->error = DATA_READING_ERROR; return false; } obj->as.dbl = decode_bedouble(bytes); return true; } case CMP_TYPE_BIN8: case CMP_TYPE_BIN16: case CMP_TYPE_BIN32: return read_type_size(ctx, type_marker, obj->type, &obj->as.bin_size); case CMP_TYPE_FIXSTR: case CMP_TYPE_STR8: case CMP_TYPE_STR16: case CMP_TYPE_STR32: return read_type_size(ctx, type_marker, obj->type, &obj->as.str_size); case CMP_TYPE_FIXARRAY: case CMP_TYPE_ARRAY16: case CMP_TYPE_ARRAY32: return read_type_size(ctx, type_marker, obj->type, &obj->as.array_size); case CMP_TYPE_FIXMAP: case CMP_TYPE_MAP16: case CMP_TYPE_MAP32: return read_type_size(ctx, type_marker, obj->type, &obj->as.map_size); case CMP_TYPE_FIXEXT1: if (!ctx->read(ctx, &obj->as.ext.type, sizeof(int8_t))) { ctx->error = EXT_TYPE_READING_ERROR; return false; } obj->as.ext.size = 1; return true; case CMP_TYPE_FIXEXT2: if (!ctx->read(ctx, &obj->as.ext.type, sizeof(int8_t))) { ctx->error = EXT_TYPE_READING_ERROR; return false; } obj->as.ext.size = 2; return true; case CMP_TYPE_FIXEXT4: if (!ctx->read(ctx, &obj->as.ext.type, sizeof(int8_t))) { ctx->error = EXT_TYPE_READING_ERROR; return false; } obj->as.ext.size = 4; return true; case CMP_TYPE_FIXEXT8: if (!ctx->read(ctx, &obj->as.ext.type, sizeof(int8_t))) { ctx->error = EXT_TYPE_READING_ERROR; return false; } obj->as.ext.size = 8; return true; case CMP_TYPE_FIXEXT16: if (!ctx->read(ctx, &obj->as.ext.type, sizeof(int8_t))) { ctx->error = EXT_TYPE_READING_ERROR; return false; } obj->as.ext.size = 16; return true; case CMP_TYPE_EXT8: if (!read_type_size(ctx, type_marker, obj->type, &obj->as.ext.size)) { return false; } if (!ctx->read(ctx, &obj->as.ext.type, sizeof(int8_t))) { ctx->error = EXT_TYPE_READING_ERROR; return false; } return true; case CMP_TYPE_EXT16: if (!read_type_size(ctx, type_marker, obj->type, &obj->as.ext.size)) { return false; } if (!ctx->read(ctx, &obj->as.ext.type, sizeof(int8_t))) { ctx->error = EXT_TYPE_READING_ERROR; return false; } obj->as.ext.type = obj->as.ext.type; return true; case CMP_TYPE_EXT32: if (!read_type_size(ctx, type_marker, obj->type, &obj->as.ext.size)) { return false; } if (!ctx->read(ctx, &obj->as.ext.type, sizeof(int8_t))) { ctx->error = EXT_TYPE_READING_ERROR; return false; } obj->as.ext.type = obj->as.ext.type; return true; default: break; } ctx->error = INVALID_TYPE_ERROR; return false; } void cmp_init(cmp_ctx_t *ctx, void *buf, cmp_reader read, cmp_skipper skip, cmp_writer write) { ctx->error = ERROR_NONE; ctx->buf = buf; ctx->read = read; ctx->skip = skip; ctx->write = write; } uint32_t cmp_version(void) { return version; } uint32_t cmp_mp_version(void) { return mp_version; } const char* cmp_strerror(cmp_ctx_t *ctx) { if (ctx->error > ERROR_NONE && ctx->error < ERROR_MAX) return cmp_error_messages[ctx->error]; return ""; } bool cmp_write_pfix(cmp_ctx_t *ctx, uint8_t c) { if (c <= 0x7F) return write_fixed_value(ctx, c); ctx->error = INPUT_VALUE_TOO_LARGE_ERROR; return false; } bool cmp_write_nfix(cmp_ctx_t *ctx, int8_t c) { if (c >= -32 && c <= -1) return write_fixed_value(ctx, c); ctx->error = INPUT_VALUE_TOO_LARGE_ERROR; return false; } bool cmp_write_sfix(cmp_ctx_t *ctx, int8_t c) { if (c >= 0) return cmp_write_pfix(ctx, c); if (c >= -32 && c <= -1) return cmp_write_nfix(ctx, c); ctx->error = INPUT_VALUE_TOO_LARGE_ERROR; return false; } bool cmp_write_s8(cmp_ctx_t *ctx, int8_t c) { if (!write_type_marker(ctx, S8_MARKER)) return false; return ctx->write(ctx, &c, sizeof(int8_t)); } bool cmp_write_s16(cmp_ctx_t *ctx, int16_t s) { if (!write_type_marker(ctx, S16_MARKER)) return false; s = be16(s); return ctx->write(ctx, &s, sizeof(int16_t)); } bool cmp_write_s32(cmp_ctx_t *ctx, int32_t i) { if (!write_type_marker(ctx, S32_MARKER)) return false; i = be32(i); return ctx->write(ctx, &i, sizeof(int32_t)); } bool cmp_write_s64(cmp_ctx_t *ctx, int64_t l) { if (!write_type_marker(ctx, S64_MARKER)) return false; l = be64(l); return ctx->write(ctx, &l, sizeof(int64_t)); } bool cmp_write_integer(cmp_ctx_t *ctx, int64_t d) { if (d >= 0) return cmp_write_uinteger(ctx, d); if (d >= -32) return cmp_write_nfix(ctx, (int8_t)d); if (d >= -128) return cmp_write_s8(ctx, (int8_t)d); if (d >= -32768) return cmp_write_s16(ctx, (int16_t)d); if (d >= (-2147483647 - 1)) return cmp_write_s32(ctx, (int32_t)d); return cmp_write_s64(ctx, d); } bool cmp_write_ufix(cmp_ctx_t *ctx, uint8_t c) { return cmp_write_pfix(ctx, c); } bool cmp_write_u8(cmp_ctx_t *ctx, uint8_t c) { if (!write_type_marker(ctx, U8_MARKER)) return false; return ctx->write(ctx, &c, sizeof(uint8_t)); } bool cmp_write_u16(cmp_ctx_t *ctx, uint16_t s) { if (!write_type_marker(ctx, U16_MARKER)) return false; s = be16(s); return ctx->write(ctx, &s, sizeof(uint16_t)); } bool cmp_write_u32(cmp_ctx_t *ctx, uint32_t i) { if (!write_type_marker(ctx, U32_MARKER)) return false; i = be32(i); return ctx->write(ctx, &i, sizeof(uint32_t)); } bool cmp_write_u64(cmp_ctx_t *ctx, uint64_t l) { if (!write_type_marker(ctx, U64_MARKER)) return false; l = be64(l); return ctx->write(ctx, &l, sizeof(uint64_t)); } bool cmp_write_uinteger(cmp_ctx_t *ctx, uint64_t u) { if (u <= 0x7F) return cmp_write_pfix(ctx, (uint8_t)u); if (u <= 0xFF) return cmp_write_u8(ctx, (uint8_t)u); if (u <= 0xFFFF) return cmp_write_u16(ctx, (uint16_t)u); if (u <= 0xFFFFFFFF) return cmp_write_u32(ctx, (uint32_t)u); return cmp_write_u64(ctx, u); } bool cmp_write_float(cmp_ctx_t *ctx, float f) { if (!write_type_marker(ctx, FLOAT_MARKER)) return false; /* * We may need to swap the float's bytes, but we can't just swap them inside * the float because the swapped bytes may not constitute a valid float. * Therefore, we have to create a buffer and swap the bytes there. */ if (!is_bigendian()) { char swapped[sizeof(float)]; char *fbuf = (char *)&f; size_t i; for (i = 0; i < sizeof(float); i++) swapped[i] = fbuf[sizeof(float) - i - 1]; return ctx->write(ctx, swapped, sizeof(float)); } return ctx->write(ctx, &f, sizeof(float)); } bool cmp_write_double(cmp_ctx_t *ctx, double d) { if (!write_type_marker(ctx, DOUBLE_MARKER)) return false; /* Same deal for doubles */ if (!is_bigendian()) { char swapped[sizeof(double)]; char *dbuf = (char *)&d; size_t i; for (i = 0; i < sizeof(double); i++) swapped[i] = dbuf[sizeof(double) - i - 1]; return ctx->write(ctx, swapped, sizeof(double)); } return ctx->write(ctx, &d, sizeof(double)); } bool cmp_write_decimal(cmp_ctx_t *ctx, double d) { float f = (float)d; double df = (double)f; if (df == d) return cmp_write_float(ctx, f); else return cmp_write_double(ctx, d); } bool cmp_write_nil(cmp_ctx_t *ctx) { return write_type_marker(ctx, NIL_MARKER); } bool cmp_write_true(cmp_ctx_t *ctx) { return write_type_marker(ctx, TRUE_MARKER); } bool cmp_write_false(cmp_ctx_t *ctx) { return write_type_marker(ctx, FALSE_MARKER); } bool cmp_write_bool(cmp_ctx_t *ctx, bool b) { if (b) return cmp_write_true(ctx); return cmp_write_false(ctx); } bool cmp_write_u8_as_bool(cmp_ctx_t *ctx, uint8_t b) { if (b) return cmp_write_true(ctx); return cmp_write_false(ctx); } bool cmp_write_fixstr_marker(cmp_ctx_t *ctx, uint8_t size) { if (size <= FIXSTR_SIZE) return write_fixed_value(ctx, FIXSTR_MARKER | size); ctx->error = INPUT_VALUE_TOO_LARGE_ERROR; return false; } bool cmp_write_fixstr(cmp_ctx_t *ctx, const char *data, uint8_t size) { if (!cmp_write_fixstr_marker(ctx, size)) return false; if (size == 0) return true; if (ctx->write(ctx, data, size)) return true; ctx->error = DATA_WRITING_ERROR; return false; } bool cmp_write_str8_marker(cmp_ctx_t *ctx, uint8_t size) { if (!write_type_marker(ctx, STR8_MARKER)) return false; if (ctx->write(ctx, &size, sizeof(uint8_t))) return true; ctx->error = LENGTH_WRITING_ERROR; return false; } bool cmp_write_str8(cmp_ctx_t *ctx, const char *data, uint8_t size) { if (!cmp_write_str8_marker(ctx, size)) return false; if (size == 0) return true; if (ctx->write(ctx, data, size)) return true; ctx->error = DATA_WRITING_ERROR; return false; } bool cmp_write_str16_marker(cmp_ctx_t *ctx, uint16_t size) { if (!write_type_marker(ctx, STR16_MARKER)) return false; size = be16(size); if (ctx->write(ctx, &size, sizeof(uint16_t))) return true; ctx->error = LENGTH_WRITING_ERROR; return false; } bool cmp_write_str16(cmp_ctx_t *ctx, const char *data, uint16_t size) { if (!cmp_write_str16_marker(ctx, size)) return false; if (size == 0) return true; if (ctx->write(ctx, data, size)) return true; ctx->error = DATA_WRITING_ERROR; return false; } bool cmp_write_str32_marker(cmp_ctx_t *ctx, uint32_t size) { if (!write_type_marker(ctx, STR32_MARKER)) return false; size = be32(size); if (ctx->write(ctx, &size, sizeof(uint32_t))) return true; ctx->error = LENGTH_WRITING_ERROR; return false; } bool cmp_write_str32(cmp_ctx_t *ctx, const char *data, uint32_t size) { if (!cmp_write_str32_marker(ctx, size)) return false; if (size == 0) return true; if (ctx->write(ctx, data, size)) return true; ctx->error = DATA_WRITING_ERROR; return false; } bool cmp_write_str_marker(cmp_ctx_t *ctx, uint32_t size) { if (size <= FIXSTR_SIZE) return cmp_write_fixstr_marker(ctx, (uint8_t)size); if (size <= 0xFF) return cmp_write_str8_marker(ctx, (uint8_t)size); if (size <= 0xFFFF) return cmp_write_str16_marker(ctx, (uint16_t)size); return cmp_write_str32_marker(ctx, size); } bool cmp_write_str_marker_v4(cmp_ctx_t *ctx, uint32_t size) { if (size <= FIXSTR_SIZE) return cmp_write_fixstr_marker(ctx, (uint8_t)size); if (size <= 0xFFFF) return cmp_write_str16_marker(ctx, (uint16_t)size); return cmp_write_str32_marker(ctx, size); } bool cmp_write_str(cmp_ctx_t *ctx, const char *data, uint32_t size) { if (size <= FIXSTR_SIZE) return cmp_write_fixstr(ctx, data, (uint8_t)size); if (size <= 0xFF) return cmp_write_str8(ctx, data, (uint8_t)size); if (size <= 0xFFFF) return cmp_write_str16(ctx, data, (uint16_t)size); return cmp_write_str32(ctx, data, size); } bool cmp_write_str_v4(cmp_ctx_t *ctx, const char *data, uint32_t size) { if (size <= FIXSTR_SIZE) return cmp_write_fixstr(ctx, data, (uint8_t)size); if (size <= 0xFFFF) return cmp_write_str16(ctx, data, (uint16_t)size); return cmp_write_str32(ctx, data, size); } bool cmp_write_bin8_marker(cmp_ctx_t *ctx, uint8_t size) { if (!write_type_marker(ctx, BIN8_MARKER)) return false; if (ctx->write(ctx, &size, sizeof(uint8_t))) return true; ctx->error = LENGTH_WRITING_ERROR; return false; } bool cmp_write_bin8(cmp_ctx_t *ctx, const void *data, uint8_t size) { if (!cmp_write_bin8_marker(ctx, size)) return false; if (size == 0) return true; if (ctx->write(ctx, data, size)) return true; ctx->error = DATA_WRITING_ERROR; return false; } bool cmp_write_bin16_marker(cmp_ctx_t *ctx, uint16_t size) { if (!write_type_marker(ctx, BIN16_MARKER)) return false; size = be16(size); if (ctx->write(ctx, &size, sizeof(uint16_t))) return true; ctx->error = LENGTH_WRITING_ERROR; return false; } bool cmp_write_bin16(cmp_ctx_t *ctx, const void *data, uint16_t size) { if (!cmp_write_bin16_marker(ctx, size)) return false; if (size == 0) return true; if (ctx->write(ctx, data, size)) return true; ctx->error = DATA_WRITING_ERROR; return false; } bool cmp_write_bin32_marker(cmp_ctx_t *ctx, uint32_t size) { if (!write_type_marker(ctx, BIN32_MARKER)) return false; size = be32(size); if (ctx->write(ctx, &size, sizeof(uint32_t))) return true; ctx->error = LENGTH_WRITING_ERROR; return false; } bool cmp_write_bin32(cmp_ctx_t *ctx, const void *data, uint32_t size) { if (!cmp_write_bin32_marker(ctx, size)) return false; if (size == 0) return true; if (ctx->write(ctx, data, size)) return true; ctx->error = DATA_WRITING_ERROR; return false; } bool cmp_write_bin_marker(cmp_ctx_t *ctx, uint32_t size) { if (size <= 0xFF) return cmp_write_bin8_marker(ctx, (uint8_t)size); if (size <= 0xFFFF) return cmp_write_bin16_marker(ctx, (uint16_t)size); return cmp_write_bin32_marker(ctx, size); } bool cmp_write_bin(cmp_ctx_t *ctx, const void *data, uint32_t size) { if (size <= 0xFF) return cmp_write_bin8(ctx, data, (uint8_t)size); if (size <= 0xFFFF) return cmp_write_bin16(ctx, data, (uint16_t)size); return cmp_write_bin32(ctx, data, size); } bool cmp_write_fixarray(cmp_ctx_t *ctx, uint8_t size) { if (size <= FIXARRAY_SIZE) return write_fixed_value(ctx, FIXARRAY_MARKER | size); ctx->error = INPUT_VALUE_TOO_LARGE_ERROR; return false; } bool cmp_write_array16(cmp_ctx_t *ctx, uint16_t size) { if (!write_type_marker(ctx, ARRAY16_MARKER)) return false; size = be16(size); if (ctx->write(ctx, &size, sizeof(uint16_t))) return true; ctx->error = LENGTH_WRITING_ERROR; return false; } bool cmp_write_array32(cmp_ctx_t *ctx, uint32_t size) { if (!write_type_marker(ctx, ARRAY32_MARKER)) return false; size = be32(size); if (ctx->write(ctx, &size, sizeof(uint32_t))) return true; ctx->error = LENGTH_WRITING_ERROR; return false; } bool cmp_write_array(cmp_ctx_t *ctx, uint32_t size) { if (size <= FIXARRAY_SIZE) return cmp_write_fixarray(ctx, (uint8_t)size); if (size <= 0xFFFF) return cmp_write_array16(ctx, (uint16_t)size); return cmp_write_array32(ctx, size); } bool cmp_write_fixmap(cmp_ctx_t *ctx, uint8_t size) { if (size <= FIXMAP_SIZE) return write_fixed_value(ctx, FIXMAP_MARKER | size); ctx->error = INPUT_VALUE_TOO_LARGE_ERROR; return false; } bool cmp_write_map16(cmp_ctx_t *ctx, uint16_t size) { if (!write_type_marker(ctx, MAP16_MARKER)) return false; size = be16(size); if (ctx->write(ctx, &size, sizeof(uint16_t))) return true; ctx->error = LENGTH_WRITING_ERROR; return false; } bool cmp_write_map32(cmp_ctx_t *ctx, uint32_t size) { if (!write_type_marker(ctx, MAP32_MARKER)) return false; size = be32(size); if (ctx->write(ctx, &size, sizeof(uint32_t))) return true; ctx->error = LENGTH_WRITING_ERROR; return false; } bool cmp_write_map(cmp_ctx_t *ctx, uint32_t size) { if (size <= FIXMAP_SIZE) return cmp_write_fixmap(ctx, (uint8_t)size); if (size <= 0xFFFF) return cmp_write_map16(ctx, (uint16_t)size); return cmp_write_map32(ctx, size); } bool cmp_write_fixext1_marker(cmp_ctx_t *ctx, int8_t type) { if (!write_type_marker(ctx, FIXEXT1_MARKER)) return false; if (ctx->write(ctx, &type, sizeof(int8_t))) return true; ctx->error = EXT_TYPE_WRITING_ERROR; return false; } bool cmp_write_fixext1(cmp_ctx_t *ctx, int8_t type, const void *data) { if (!cmp_write_fixext1_marker(ctx, type)) return false; if (ctx->write(ctx, data, 1)) return true; ctx->error = DATA_WRITING_ERROR; return false; } bool cmp_write_fixext2_marker(cmp_ctx_t *ctx, int8_t type) { if (!write_type_marker(ctx, FIXEXT2_MARKER)) return false; if (ctx->write(ctx, &type, sizeof(int8_t))) return true; ctx->error = EXT_TYPE_WRITING_ERROR; return false; } bool cmp_write_fixext2(cmp_ctx_t *ctx, int8_t type, const void *data) { if (!cmp_write_fixext2_marker(ctx, type)) return false; if (ctx->write(ctx, data, 2)) return true; ctx->error = DATA_WRITING_ERROR; return false; } bool cmp_write_fixext4_marker(cmp_ctx_t *ctx, int8_t type) { if (!write_type_marker(ctx, FIXEXT4_MARKER)) return false; if (ctx->write(ctx, &type, sizeof(int8_t))) return true; ctx->error = EXT_TYPE_WRITING_ERROR; return false; } bool cmp_write_fixext4(cmp_ctx_t *ctx, int8_t type, const void *data) { if (!cmp_write_fixext4_marker(ctx, type)) return false; if (ctx->write(ctx, data, 4)) return true; ctx->error = DATA_WRITING_ERROR; return false; } bool cmp_write_fixext8_marker(cmp_ctx_t *ctx, int8_t type) { if (!write_type_marker(ctx, FIXEXT8_MARKER)) return false; if (ctx->write(ctx, &type, sizeof(int8_t))) return true; ctx->error = EXT_TYPE_WRITING_ERROR; return false; } bool cmp_write_fixext8(cmp_ctx_t *ctx, int8_t type, const void *data) { if (!cmp_write_fixext8_marker(ctx, type)) return false; if (ctx->write(ctx, data, 8)) return true; ctx->error = DATA_WRITING_ERROR; return false; } bool cmp_write_fixext16_marker(cmp_ctx_t *ctx, int8_t type) { if (!write_type_marker(ctx, FIXEXT16_MARKER)) return false; if (ctx->write(ctx, &type, sizeof(int8_t))) return true; ctx->error = EXT_TYPE_WRITING_ERROR; return false; } bool cmp_write_fixext16(cmp_ctx_t *ctx, int8_t type, const void *data) { if (!cmp_write_fixext16_marker(ctx, type)) return false; if (ctx->write(ctx, data, 16)) return true; ctx->error = DATA_WRITING_ERROR; return false; } bool cmp_write_ext8_marker(cmp_ctx_t *ctx, int8_t type, uint8_t size) { if (!write_type_marker(ctx, EXT8_MARKER)) return false; if (!ctx->write(ctx, &size, sizeof(uint8_t))) { ctx->error = LENGTH_WRITING_ERROR; return false; } if (ctx->write(ctx, &type, sizeof(int8_t))) return true; ctx->error = EXT_TYPE_WRITING_ERROR; return false; } bool cmp_write_ext8(cmp_ctx_t *ctx, int8_t tp, uint8_t sz, const void *data) { if (!cmp_write_ext8_marker(ctx, tp, sz)) return false; if (ctx->write(ctx, data, sz)) return true; ctx->error = DATA_WRITING_ERROR; return false; } bool cmp_write_ext16_marker(cmp_ctx_t *ctx, int8_t type, uint16_t size) { if (!write_type_marker(ctx, EXT16_MARKER)) return false; size = be16(size); if (!ctx->write(ctx, &size, sizeof(uint16_t))) { ctx->error = LENGTH_WRITING_ERROR; return false; } if (ctx->write(ctx, &type, sizeof(int8_t))) return true; ctx->error = EXT_TYPE_WRITING_ERROR; return false; } bool cmp_write_ext16(cmp_ctx_t *ctx, int8_t tp, uint16_t sz, const void *data) { if (!cmp_write_ext16_marker(ctx, tp, sz)) return false; if (ctx->write(ctx, data, sz)) return true; ctx->error = DATA_WRITING_ERROR; return false; } bool cmp_write_ext32_marker(cmp_ctx_t *ctx, int8_t type, uint32_t size) { if (!write_type_marker(ctx, EXT32_MARKER)) return false; size = be32(size); if (!ctx->write(ctx, &size, sizeof(uint32_t))) { ctx->error = LENGTH_WRITING_ERROR; return false; } if (ctx->write(ctx, &type, sizeof(int8_t))) return true; ctx->error = EXT_TYPE_WRITING_ERROR; return false; } bool cmp_write_ext32(cmp_ctx_t *ctx, int8_t tp, uint32_t sz, const void *data) { if (!cmp_write_ext32_marker(ctx, tp, sz)) return false; if (ctx->write(ctx, data, sz)) return true; ctx->error = DATA_WRITING_ERROR; return false; } bool cmp_write_ext_marker(cmp_ctx_t *ctx, int8_t tp, uint32_t sz) { if (sz == 1) return cmp_write_fixext1_marker(ctx, tp); if (sz == 2) return cmp_write_fixext2_marker(ctx, tp); if (sz == 4) return cmp_write_fixext4_marker(ctx, tp); if (sz == 8) return cmp_write_fixext8_marker(ctx, tp); if (sz == 16) return cmp_write_fixext16_marker(ctx, tp); if (sz <= 0xFF) return cmp_write_ext8_marker(ctx, tp, (uint8_t)sz); if (sz <= 0xFFFF) return cmp_write_ext16_marker(ctx, tp, (uint16_t)sz); return cmp_write_ext32_marker(ctx, tp, sz); } bool cmp_write_ext(cmp_ctx_t *ctx, int8_t tp, uint32_t sz, const void *data) { if (sz == 1) return cmp_write_fixext1(ctx, tp, data); if (sz == 2) return cmp_write_fixext2(ctx, tp, data); if (sz == 4) return cmp_write_fixext4(ctx, tp, data); if (sz == 8) return cmp_write_fixext8(ctx, tp, data); if (sz == 16) return cmp_write_fixext16(ctx, tp, data); if (sz <= 0xFF) return cmp_write_ext8(ctx, tp, (uint8_t)sz, data); if (sz <= 0xFFFF) return cmp_write_ext16(ctx, tp, (uint16_t)sz, data); return cmp_write_ext32(ctx, tp, sz, data); } bool cmp_write_object(cmp_ctx_t *ctx, cmp_object_t *obj) { switch(obj->type) { case CMP_TYPE_POSITIVE_FIXNUM: return cmp_write_pfix(ctx, obj->as.u8); case CMP_TYPE_FIXMAP: return cmp_write_fixmap(ctx, (uint8_t)obj->as.map_size); case CMP_TYPE_FIXARRAY: return cmp_write_fixarray(ctx, (uint8_t)obj->as.array_size); case CMP_TYPE_FIXSTR: return cmp_write_fixstr_marker(ctx, (uint8_t)obj->as.str_size); case CMP_TYPE_NIL: return cmp_write_nil(ctx); case CMP_TYPE_BOOLEAN: if (obj->as.boolean) return cmp_write_true(ctx); return cmp_write_false(ctx); case CMP_TYPE_BIN8: return cmp_write_bin8_marker(ctx, (uint8_t)obj->as.bin_size); case CMP_TYPE_BIN16: return cmp_write_bin16_marker(ctx, (uint16_t)obj->as.bin_size); case CMP_TYPE_BIN32: return cmp_write_bin32_marker(ctx, obj->as.bin_size); case CMP_TYPE_EXT8: return cmp_write_ext8_marker( ctx, obj->as.ext.type, (uint8_t)obj->as.ext.size ); case CMP_TYPE_EXT16: return cmp_write_ext16_marker( ctx, obj->as.ext.type, (uint16_t)obj->as.ext.size ); case CMP_TYPE_EXT32: return cmp_write_ext32_marker(ctx, obj->as.ext.type, obj->as.ext.size); case CMP_TYPE_FLOAT: return cmp_write_float(ctx, obj->as.flt); case CMP_TYPE_DOUBLE: return cmp_write_double(ctx, obj->as.dbl); case CMP_TYPE_UINT8: return cmp_write_u8(ctx, obj->as.u8); case CMP_TYPE_UINT16: return cmp_write_u16(ctx, obj->as.u16); case CMP_TYPE_UINT32: return cmp_write_u32(ctx, obj->as.u32); case CMP_TYPE_UINT64: return cmp_write_u64(ctx, obj->as.u64); case CMP_TYPE_SINT8: return cmp_write_s8(ctx, obj->as.s8); case CMP_TYPE_SINT16: return cmp_write_s16(ctx, obj->as.s16); case CMP_TYPE_SINT32: return cmp_write_s32(ctx, obj->as.s32); case CMP_TYPE_SINT64: return cmp_write_s64(ctx, obj->as.s64); case CMP_TYPE_FIXEXT1: return cmp_write_fixext1_marker(ctx, obj->as.ext.type); case CMP_TYPE_FIXEXT2: return cmp_write_fixext2_marker(ctx, obj->as.ext.type); case CMP_TYPE_FIXEXT4: return cmp_write_fixext4_marker(ctx, obj->as.ext.type); case CMP_TYPE_FIXEXT8: return cmp_write_fixext8_marker(ctx, obj->as.ext.type); case CMP_TYPE_FIXEXT16: return cmp_write_fixext16_marker(ctx, obj->as.ext.type); case CMP_TYPE_STR8: return cmp_write_str8_marker(ctx, (uint8_t)obj->as.str_size); case CMP_TYPE_STR16: return cmp_write_str16_marker(ctx, (uint16_t)obj->as.str_size); case CMP_TYPE_STR32: return cmp_write_str32_marker(ctx, obj->as.str_size); case CMP_TYPE_ARRAY16: return cmp_write_array16(ctx, (uint16_t)obj->as.array_size); case CMP_TYPE_ARRAY32: return cmp_write_array32(ctx, obj->as.array_size); case CMP_TYPE_MAP16: return cmp_write_map16(ctx, (uint16_t)obj->as.map_size); case CMP_TYPE_MAP32: return cmp_write_map32(ctx, obj->as.map_size); case CMP_TYPE_NEGATIVE_FIXNUM: return cmp_write_nfix(ctx, obj->as.s8); default: ctx->error = INVALID_TYPE_ERROR; return false; } } bool cmp_write_object_v4(cmp_ctx_t *ctx, cmp_object_t *obj) { switch(obj->type) { case CMP_TYPE_POSITIVE_FIXNUM: return cmp_write_pfix(ctx, obj->as.u8); case CMP_TYPE_FIXMAP: return cmp_write_fixmap(ctx, (uint8_t)obj->as.map_size); case CMP_TYPE_FIXARRAY: return cmp_write_fixarray(ctx, (uint8_t)obj->as.array_size); case CMP_TYPE_FIXSTR: return cmp_write_fixstr_marker(ctx, (uint8_t)obj->as.str_size); case CMP_TYPE_NIL: return cmp_write_nil(ctx); case CMP_TYPE_BOOLEAN: if (obj->as.boolean) return cmp_write_true(ctx); return cmp_write_false(ctx); case CMP_TYPE_EXT8: return cmp_write_ext8_marker(ctx, obj->as.ext.type, (uint8_t)obj->as.ext.size); case CMP_TYPE_EXT16: return cmp_write_ext16_marker( ctx, obj->as.ext.type, (uint16_t)obj->as.ext.size ); case CMP_TYPE_EXT32: return cmp_write_ext32_marker(ctx, obj->as.ext.type, obj->as.ext.size); case CMP_TYPE_FLOAT: return cmp_write_float(ctx, obj->as.flt); case CMP_TYPE_DOUBLE: return cmp_write_double(ctx, obj->as.dbl); case CMP_TYPE_UINT8: return cmp_write_u8(ctx, obj->as.u8); case CMP_TYPE_UINT16: return cmp_write_u16(ctx, obj->as.u16); case CMP_TYPE_UINT32: return cmp_write_u32(ctx, obj->as.u32); case CMP_TYPE_UINT64: return cmp_write_u64(ctx, obj->as.u64); case CMP_TYPE_SINT8: return cmp_write_s8(ctx, obj->as.s8); case CMP_TYPE_SINT16: return cmp_write_s16(ctx, obj->as.s16); case CMP_TYPE_SINT32: return cmp_write_s32(ctx, obj->as.s32); case CMP_TYPE_SINT64: return cmp_write_s64(ctx, obj->as.s64); case CMP_TYPE_FIXEXT1: return cmp_write_fixext1_marker(ctx, obj->as.ext.type); case CMP_TYPE_FIXEXT2: return cmp_write_fixext2_marker(ctx, obj->as.ext.type); case CMP_TYPE_FIXEXT4: return cmp_write_fixext4_marker(ctx, obj->as.ext.type); case CMP_TYPE_FIXEXT8: return cmp_write_fixext8_marker(ctx, obj->as.ext.type); case CMP_TYPE_FIXEXT16: return cmp_write_fixext16_marker(ctx, obj->as.ext.type); case CMP_TYPE_STR16: return cmp_write_str16_marker(ctx, (uint16_t)obj->as.str_size); case CMP_TYPE_STR32: return cmp_write_str32_marker(ctx, obj->as.str_size); case CMP_TYPE_ARRAY16: return cmp_write_array16(ctx, (uint16_t)obj->as.array_size); case CMP_TYPE_ARRAY32: return cmp_write_array32(ctx, obj->as.array_size); case CMP_TYPE_MAP16: return cmp_write_map16(ctx, (uint16_t)obj->as.map_size); case CMP_TYPE_MAP32: return cmp_write_map32(ctx, obj->as.map_size); case CMP_TYPE_NEGATIVE_FIXNUM: return cmp_write_nfix(ctx, obj->as.s8); default: ctx->error = INVALID_TYPE_ERROR; return false; } } bool cmp_read_pfix(cmp_ctx_t *ctx, uint8_t *c) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; if (obj.type != CMP_TYPE_POSITIVE_FIXNUM) { ctx->error = INVALID_TYPE_ERROR; return false; } *c = obj.as.u8; return true; } bool cmp_read_nfix(cmp_ctx_t *ctx, int8_t *c) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; if (obj.type != CMP_TYPE_NEGATIVE_FIXNUM) { ctx->error = INVALID_TYPE_ERROR; return false; } *c = obj.as.s8; return true; } bool cmp_read_sfix(cmp_ctx_t *ctx, int8_t *c) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; switch (obj.type) { case CMP_TYPE_POSITIVE_FIXNUM: case CMP_TYPE_NEGATIVE_FIXNUM: *c = obj.as.s8; return true; default: ctx->error = INVALID_TYPE_ERROR; return false; } } bool cmp_read_s8(cmp_ctx_t *ctx, int8_t *c) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; if (obj.type != CMP_TYPE_SINT8) { ctx->error = INVALID_TYPE_ERROR; return false; } *c = obj.as.s8; return true; } bool cmp_read_s16(cmp_ctx_t *ctx, int16_t *s) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; if (obj.type != CMP_TYPE_SINT16) { ctx->error = INVALID_TYPE_ERROR; return false; } *s = obj.as.s16; return true; } bool cmp_read_s32(cmp_ctx_t *ctx, int32_t *i) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; if (obj.type != CMP_TYPE_SINT32) { ctx->error = INVALID_TYPE_ERROR; return false; } *i = obj.as.s32; return true; } bool cmp_read_s64(cmp_ctx_t *ctx, int64_t *l) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; if (obj.type != CMP_TYPE_SINT64) { ctx->error = INVALID_TYPE_ERROR; return false; } *l = obj.as.s64; return true; } bool cmp_read_char(cmp_ctx_t *ctx, int8_t *c) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; switch (obj.type) { case CMP_TYPE_POSITIVE_FIXNUM: case CMP_TYPE_NEGATIVE_FIXNUM: case CMP_TYPE_SINT8: *c = obj.as.s8; return true; case CMP_TYPE_UINT8: if (obj.as.u8 <= 127) { *c = obj.as.u8; return true; } break; default: break; } ctx->error = INVALID_TYPE_ERROR; return false; } bool cmp_read_short(cmp_ctx_t *ctx, int16_t *s) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; switch (obj.type) { case CMP_TYPE_POSITIVE_FIXNUM: case CMP_TYPE_NEGATIVE_FIXNUM: case CMP_TYPE_SINT8: *s = obj.as.s8; return true; case CMP_TYPE_UINT8: *s = obj.as.u8; return true; case CMP_TYPE_SINT16: *s = obj.as.s16; return true; case CMP_TYPE_UINT16: if (obj.as.u16 <= 32767) { *s = obj.as.u16; return true; } break; default: break; } ctx->error = INVALID_TYPE_ERROR; return false; } bool cmp_read_int(cmp_ctx_t *ctx, int32_t *i) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; switch (obj.type) { case CMP_TYPE_POSITIVE_FIXNUM: case CMP_TYPE_NEGATIVE_FIXNUM: case CMP_TYPE_SINT8: *i = obj.as.s8; return true; case CMP_TYPE_UINT8: *i = obj.as.u8; return true; case CMP_TYPE_SINT16: *i = obj.as.s16; return true; case CMP_TYPE_UINT16: *i = obj.as.u16; return true; case CMP_TYPE_SINT32: *i = obj.as.s32; return true; case CMP_TYPE_UINT32: if (obj.as.u32 <= 2147483647) { *i = obj.as.u32; return true; } break; default: break; } ctx->error = INVALID_TYPE_ERROR; return false; } bool cmp_read_long(cmp_ctx_t *ctx, int64_t *d) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; switch (obj.type) { case CMP_TYPE_POSITIVE_FIXNUM: case CMP_TYPE_NEGATIVE_FIXNUM: case CMP_TYPE_SINT8: *d = obj.as.s8; return true; case CMP_TYPE_UINT8: *d = obj.as.u8; return true; case CMP_TYPE_SINT16: *d = obj.as.s16; return true; case CMP_TYPE_UINT16: *d = obj.as.u16; return true; case CMP_TYPE_SINT32: *d = obj.as.s32; return true; case CMP_TYPE_UINT32: *d = obj.as.u32; return true; case CMP_TYPE_SINT64: *d = obj.as.s64; return true; case CMP_TYPE_UINT64: if (obj.as.u64 <= 9223372036854775807) { *d = obj.as.u64; return true; } break; default: break; } ctx->error = INVALID_TYPE_ERROR; return false; } bool cmp_read_integer(cmp_ctx_t *ctx, int64_t *d) { return cmp_read_long(ctx, d); } bool cmp_read_ufix(cmp_ctx_t *ctx, uint8_t *c) { return cmp_read_pfix(ctx, c); } bool cmp_read_u8(cmp_ctx_t *ctx, uint8_t *c) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; if (obj.type != CMP_TYPE_UINT8) { ctx->error = INVALID_TYPE_ERROR; return false; } *c = obj.as.u8; return true; } bool cmp_read_u16(cmp_ctx_t *ctx, uint16_t *s) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; if (obj.type != CMP_TYPE_UINT16) { ctx->error = INVALID_TYPE_ERROR; return false; } *s = obj.as.u16; return true; } bool cmp_read_u32(cmp_ctx_t *ctx, uint32_t *i) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; if (obj.type != CMP_TYPE_UINT32) { ctx->error = INVALID_TYPE_ERROR; return false; } *i = obj.as.u32; return true; } bool cmp_read_u64(cmp_ctx_t *ctx, uint64_t *l) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; if (obj.type != CMP_TYPE_UINT64) { ctx->error = INVALID_TYPE_ERROR; return false; } *l = obj.as.u64; return true; } bool cmp_read_uchar(cmp_ctx_t *ctx, uint8_t *c) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; switch (obj.type) { case CMP_TYPE_POSITIVE_FIXNUM: case CMP_TYPE_UINT8: *c = obj.as.u8; return true; case CMP_TYPE_NEGATIVE_FIXNUM: case CMP_TYPE_SINT8: if (obj.as.s8 >= 0) { *c = obj.as.s8; return true; } break; default: break; } ctx->error = INVALID_TYPE_ERROR; return false; } bool cmp_read_ushort(cmp_ctx_t *ctx, uint16_t *s) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; switch (obj.type) { case CMP_TYPE_POSITIVE_FIXNUM: case CMP_TYPE_UINT8: *s = obj.as.u8; return true; case CMP_TYPE_UINT16: *s = obj.as.u16; return true; case CMP_TYPE_NEGATIVE_FIXNUM: case CMP_TYPE_SINT8: if (obj.as.s8 >= 0) { *s = obj.as.s8; return true; } break; case CMP_TYPE_SINT16: if (obj.as.s16 >= 0) { *s = obj.as.s16; return true; } break; default: break; } ctx->error = INVALID_TYPE_ERROR; return false; } bool cmp_read_uint(cmp_ctx_t *ctx, uint32_t *i) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; switch (obj.type) { case CMP_TYPE_POSITIVE_FIXNUM: case CMP_TYPE_UINT8: *i = obj.as.u8; return true; case CMP_TYPE_UINT16: *i = obj.as.u16; return true; case CMP_TYPE_UINT32: *i = obj.as.u32; return true; case CMP_TYPE_NEGATIVE_FIXNUM: case CMP_TYPE_SINT8: if (obj.as.s8 >= 0) { *i = obj.as.s8; return true; } break; case CMP_TYPE_SINT16: if (obj.as.s16 >= 0) { *i = obj.as.s16; return true; } break; case CMP_TYPE_SINT32: if (obj.as.s32 >= 0) { *i = obj.as.s32; return true; } break; default: break; } ctx->error = INVALID_TYPE_ERROR; return false; } bool cmp_read_ulong(cmp_ctx_t *ctx, uint64_t *u) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; switch (obj.type) { case CMP_TYPE_POSITIVE_FIXNUM: case CMP_TYPE_UINT8: *u = obj.as.u8; return true; case CMP_TYPE_UINT16: *u = obj.as.u16; return true; case CMP_TYPE_UINT32: *u = obj.as.u32; return true; case CMP_TYPE_UINT64: *u = obj.as.u64; return true; case CMP_TYPE_NEGATIVE_FIXNUM: case CMP_TYPE_SINT8: if (obj.as.s8 >= 0) { *u = obj.as.s8; return true; } break; case CMP_TYPE_SINT16: if (obj.as.s16 >= 0) { *u = obj.as.s16; return true; } break; case CMP_TYPE_SINT32: if (obj.as.s32 >= 0) { *u = obj.as.s32; return true; } break; case CMP_TYPE_SINT64: if (obj.as.s64 >= 0) { *u = obj.as.s64; return true; } break; default: break; } ctx->error = INVALID_TYPE_ERROR; return false; } bool cmp_read_uinteger(cmp_ctx_t *ctx, uint64_t *d) { return cmp_read_ulong(ctx, d); } bool cmp_read_float(cmp_ctx_t *ctx, float *f) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; if (obj.type != CMP_TYPE_FLOAT) { ctx->error = INVALID_TYPE_ERROR; return false; } *f = obj.as.flt; return true; } bool cmp_read_double(cmp_ctx_t *ctx, double *d) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; if (obj.type != CMP_TYPE_DOUBLE) { ctx->error = INVALID_TYPE_ERROR; return false; } *d = obj.as.dbl; return true; } bool cmp_read_decimal(cmp_ctx_t *ctx, double *d) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; switch (obj.type) { case CMP_TYPE_FLOAT: *d = (double)obj.as.flt; return true; case CMP_TYPE_DOUBLE: *d = obj.as.dbl; return true; default: ctx->error = INVALID_TYPE_ERROR; return false; } } bool cmp_read_nil(cmp_ctx_t *ctx) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; if (obj.type == CMP_TYPE_NIL) return true; ctx->error = INVALID_TYPE_ERROR; return false; } bool cmp_read_bool(cmp_ctx_t *ctx, bool *b) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; if (obj.type != CMP_TYPE_BOOLEAN) { ctx->error = INVALID_TYPE_ERROR; return false; } if (obj.as.boolean) *b = true; else *b = false; return true; } bool cmp_read_bool_as_u8(cmp_ctx_t *ctx, uint8_t *b) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; if (obj.type != CMP_TYPE_BOOLEAN) { ctx->error = INVALID_TYPE_ERROR; return false; } if (obj.as.boolean) *b = 1; else *b = 0; return true; } bool cmp_read_str_size(cmp_ctx_t *ctx, uint32_t *size) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; switch (obj.type) { case CMP_TYPE_FIXSTR: case CMP_TYPE_STR8: case CMP_TYPE_STR16: case CMP_TYPE_STR32: *size = obj.as.str_size; return true; default: ctx->error = INVALID_TYPE_ERROR; return false; } } bool cmp_read_str(cmp_ctx_t *ctx, char *data, uint32_t *size) { uint32_t str_size = 0; if (!cmp_read_str_size(ctx, &str_size)) return false; if ((str_size + 1) > *size) { *size = str_size; ctx->error = STR_DATA_LENGTH_TOO_LONG_ERROR; return false; } if (!ctx->read(ctx, data, str_size)) { ctx->error = DATA_READING_ERROR; return false; } data[str_size] = 0; *size = str_size; return true; } bool cmp_read_bin_size(cmp_ctx_t *ctx, uint32_t *size) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; switch (obj.type) { case CMP_TYPE_BIN8: case CMP_TYPE_BIN16: case CMP_TYPE_BIN32: *size = obj.as.bin_size; return true; default: ctx->error = INVALID_TYPE_ERROR; return false; } } bool cmp_read_bin(cmp_ctx_t *ctx, void *data, uint32_t *size) { uint32_t bin_size = 0; if (!cmp_read_bin_size(ctx, &bin_size)) return false; if (bin_size > *size) { ctx->error = BIN_DATA_LENGTH_TOO_LONG_ERROR; return false; } if (!ctx->read(ctx, data, bin_size)) { ctx->error = DATA_READING_ERROR; return false; } *size = bin_size; return true; } bool cmp_read_array(cmp_ctx_t *ctx, uint32_t *size) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; switch (obj.type) { case CMP_TYPE_FIXARRAY: case CMP_TYPE_ARRAY16: case CMP_TYPE_ARRAY32: *size = obj.as.array_size; return true; default: ctx->error = INVALID_TYPE_ERROR; return false; } } bool cmp_read_map(cmp_ctx_t *ctx, uint32_t *size) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; switch (obj.type) { case CMP_TYPE_FIXMAP: case CMP_TYPE_MAP16: case CMP_TYPE_MAP32: *size = obj.as.map_size; return true; default: ctx->error = INVALID_TYPE_ERROR; return false; } } bool cmp_read_fixext1_marker(cmp_ctx_t *ctx, int8_t *type) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; if (obj.type != CMP_TYPE_FIXEXT1) { ctx->error = INVALID_TYPE_ERROR; return false; } *type = obj.as.ext.type; return true; } bool cmp_read_fixext1(cmp_ctx_t *ctx, int8_t *type, void *data) { if (!cmp_read_fixext1_marker(ctx, type)) return false; if (ctx->read(ctx, data, 1)) return true; ctx->error = DATA_READING_ERROR; return false; } bool cmp_read_fixext2_marker(cmp_ctx_t *ctx, int8_t *type) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; if (obj.type != CMP_TYPE_FIXEXT2) { ctx->error = INVALID_TYPE_ERROR; return false; } *type = obj.as.ext.type; return true; } bool cmp_read_fixext2(cmp_ctx_t *ctx, int8_t *type, void *data) { if (!cmp_read_fixext2_marker(ctx, type)) return false; if (ctx->read(ctx, data, 2)) return true; ctx->error = DATA_READING_ERROR; return false; } bool cmp_read_fixext4_marker(cmp_ctx_t *ctx, int8_t *type) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; if (obj.type != CMP_TYPE_FIXEXT4) { ctx->error = INVALID_TYPE_ERROR; return false; } *type = obj.as.ext.type; return true; } bool cmp_read_fixext4(cmp_ctx_t *ctx, int8_t *type, void *data) { if (!cmp_read_fixext4_marker(ctx, type)) return false; if (ctx->read(ctx, data, 4)) return true; ctx->error = DATA_READING_ERROR; return false; } bool cmp_read_fixext8_marker(cmp_ctx_t *ctx, int8_t *type) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; if (obj.type != CMP_TYPE_FIXEXT8) { ctx->error = INVALID_TYPE_ERROR; return false; } *type = obj.as.ext.type; return true; } bool cmp_read_fixext8(cmp_ctx_t *ctx, int8_t *type, void *data) { if (!cmp_read_fixext8_marker(ctx, type)) return false; if (ctx->read(ctx, data, 8)) return true; ctx->error = DATA_READING_ERROR; return false; } bool cmp_read_fixext16_marker(cmp_ctx_t *ctx, int8_t *type) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; if (obj.type != CMP_TYPE_FIXEXT16) { ctx->error = INVALID_TYPE_ERROR; return false; } *type = obj.as.ext.type; return true; } bool cmp_read_fixext16(cmp_ctx_t *ctx, int8_t *type, void *data) { if (!cmp_read_fixext16_marker(ctx, type)) return false; if (ctx->read(ctx, data, 16)) return true; ctx->error = DATA_READING_ERROR; return false; } bool cmp_read_ext8_marker(cmp_ctx_t *ctx, int8_t *type, uint8_t *size) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; if (obj.type != CMP_TYPE_EXT8) { ctx->error = INVALID_TYPE_ERROR; return false; } *type = obj.as.ext.type; *size = (uint8_t)obj.as.ext.size; return true; } bool cmp_read_ext8(cmp_ctx_t *ctx, int8_t *type, uint8_t *size, void *data) { if (!cmp_read_ext8_marker(ctx, type, size)) return false; if (ctx->read(ctx, data, *size)) return true; ctx->error = DATA_READING_ERROR; return false; } bool cmp_read_ext16_marker(cmp_ctx_t *ctx, int8_t *type, uint16_t *size) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; if (obj.type != CMP_TYPE_EXT16) { ctx->error = INVALID_TYPE_ERROR; return false; } *type = obj.as.ext.type; *size = (uint16_t)obj.as.ext.size; return true; } bool cmp_read_ext16(cmp_ctx_t *ctx, int8_t *type, uint16_t *size, void *data) { if (!cmp_read_ext16_marker(ctx, type, size)) return false; if (ctx->read(ctx, data, *size)) return true; ctx->error = DATA_READING_ERROR; return false; } bool cmp_read_ext32_marker(cmp_ctx_t *ctx, int8_t *type, uint32_t *size) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; if (obj.type != CMP_TYPE_EXT32) { ctx->error = INVALID_TYPE_ERROR; return false; } *type = obj.as.ext.type; *size = obj.as.ext.size; return true; } bool cmp_read_ext32(cmp_ctx_t *ctx, int8_t *type, uint32_t *size, void *data) { if (!cmp_read_ext32_marker(ctx, type, size)) return false; if (ctx->read(ctx, data, *size)) return true; ctx->error = DATA_READING_ERROR; return false; } bool cmp_read_ext_marker(cmp_ctx_t *ctx, int8_t *type, uint32_t *size) { cmp_object_t obj; if (!cmp_read_object(ctx, &obj)) return false; switch (obj.type) { case CMP_TYPE_FIXEXT1: case CMP_TYPE_FIXEXT2: case CMP_TYPE_FIXEXT4: case CMP_TYPE_FIXEXT8: case CMP_TYPE_FIXEXT16: case CMP_TYPE_EXT8: case CMP_TYPE_EXT16: case CMP_TYPE_EXT32: *type = obj.as.ext.type; *size = obj.as.ext.size; return true; default: ctx->error = INVALID_TYPE_ERROR; return false; } } bool cmp_read_ext(cmp_ctx_t *ctx, int8_t *type, uint32_t *size, void *data) { if (!cmp_read_ext_marker(ctx, type, size)) return false; if (ctx->read(ctx, data, *size)) return true; ctx->error = DATA_READING_ERROR; return false; } bool cmp_read_object(cmp_ctx_t *ctx, cmp_object_t *obj) { uint8_t type_marker = 0; if (!read_type_marker(ctx, &type_marker)) return false; if (!type_marker_to_cmp_type(type_marker, &obj->type)) { ctx->error = INVALID_TYPE_ERROR; return false; } return read_obj_data(ctx, type_marker, obj); } bool cmp_skip_object(cmp_ctx_t *ctx, cmp_object_t *obj) { return cmp_skip_object_limit(ctx, obj, 0); } bool cmp_skip_object_limit(cmp_ctx_t *ctx, cmp_object_t *obj, uint32_t limit) { size_t element_count = 1; uint32_t depth = 0; while (element_count) { uint8_t type_marker = 0; uint8_t cmp_type; uint32_t size = 0; if (!read_type_marker(ctx, &type_marker)) { return false; } if (!type_marker_to_cmp_type(type_marker, &cmp_type)) { ctx->error = INVALID_TYPE_ERROR; return false; } switch (cmp_type) { case CMP_TYPE_FIXARRAY: case CMP_TYPE_ARRAY16: case CMP_TYPE_ARRAY32: case CMP_TYPE_FIXMAP: case CMP_TYPE_MAP16: case CMP_TYPE_MAP32: depth++; if (depth > limit) { obj->type = cmp_type; if (!read_obj_data(ctx, type_marker, obj)) { return false; } ctx->error = SKIP_DEPTH_LIMIT_EXCEEDED_ERROR; return false; } break; default: if (!read_type_size(ctx, type_marker, cmp_type, &size)) { return false; } if (size) { switch (cmp_type) { case CMP_TYPE_FIXEXT1: case CMP_TYPE_FIXEXT2: case CMP_TYPE_FIXEXT4: case CMP_TYPE_FIXEXT8: case CMP_TYPE_FIXEXT16: case CMP_TYPE_EXT8: case CMP_TYPE_EXT16: case CMP_TYPE_EXT32: size++; default: break; } skip_bytes(ctx, size); } } element_count--; switch (cmp_type) { case CMP_TYPE_FIXARRAY: case CMP_TYPE_ARRAY16: case CMP_TYPE_ARRAY32: if (!read_type_size(ctx, type_marker, cmp_type, &size)) { return false; } element_count += size; break; case CMP_TYPE_FIXMAP: case CMP_TYPE_MAP16: case CMP_TYPE_MAP32: if (!read_type_size(ctx, type_marker, cmp_type, &size)) { return false; } element_count += ((size_t)size) * 2; break; default: break; } } return true; } bool cmp_skip_object_no_limit(cmp_ctx_t *ctx) { size_t element_count = 1; while (element_count) { uint8_t type_marker = 0; uint8_t cmp_type = 0; uint32_t size = 0; if (!read_type_marker(ctx, &type_marker)) { return false; } if (!type_marker_to_cmp_type(type_marker, &cmp_type)) { ctx->error = INVALID_TYPE_ERROR; return false; } switch (cmp_type) { case CMP_TYPE_FIXARRAY: case CMP_TYPE_ARRAY16: case CMP_TYPE_ARRAY32: case CMP_TYPE_FIXMAP: case CMP_TYPE_MAP16: case CMP_TYPE_MAP32: break; default: if (!read_type_size(ctx, type_marker, cmp_type, &size)) { return false; } if (size) { switch (cmp_type) { case CMP_TYPE_FIXEXT1: case CMP_TYPE_FIXEXT2: case CMP_TYPE_FIXEXT4: case CMP_TYPE_FIXEXT8: case CMP_TYPE_FIXEXT16: case CMP_TYPE_EXT8: case CMP_TYPE_EXT16: case CMP_TYPE_EXT32: size++; default: break; } skip_bytes(ctx, size); } } element_count--; switch (cmp_type) { case CMP_TYPE_FIXARRAY: case CMP_TYPE_ARRAY16: case CMP_TYPE_ARRAY32: if (!read_type_size(ctx, type_marker, cmp_type, &size)) { return false; } element_count += size; break; case CMP_TYPE_FIXMAP: case CMP_TYPE_MAP16: case CMP_TYPE_MAP32: if (!read_type_size(ctx, type_marker, cmp_type, &size)) { return false; } element_count += ((size_t)size) * 2; break; default: break; } } return true; } bool cmp_object_is_char(cmp_object_t *obj) { switch (obj->type) { case CMP_TYPE_NEGATIVE_FIXNUM: case CMP_TYPE_SINT8: return true; default: return false; } } bool cmp_object_is_short(cmp_object_t *obj) { switch (obj->type) { case CMP_TYPE_NEGATIVE_FIXNUM: case CMP_TYPE_SINT8: case CMP_TYPE_SINT16: return true; default: return false; } } bool cmp_object_is_int(cmp_object_t *obj) { switch (obj->type) { case CMP_TYPE_NEGATIVE_FIXNUM: case CMP_TYPE_SINT8: case CMP_TYPE_SINT16: case CMP_TYPE_SINT32: return true; default: return false; } } bool cmp_object_is_long(cmp_object_t *obj) { switch (obj->type) { case CMP_TYPE_NEGATIVE_FIXNUM: case CMP_TYPE_SINT8: case CMP_TYPE_SINT16: case CMP_TYPE_SINT32: case CMP_TYPE_SINT64: return true; default: return false; } } bool cmp_object_is_sinteger(cmp_object_t *obj) { return cmp_object_is_long(obj); } bool cmp_object_is_uchar(cmp_object_t *obj) { switch (obj->type) { case CMP_TYPE_POSITIVE_FIXNUM: case CMP_TYPE_UINT8: return true; default: return false; } } bool cmp_object_is_ushort(cmp_object_t *obj) { switch (obj->type) { case CMP_TYPE_POSITIVE_FIXNUM: case CMP_TYPE_UINT8: return true; case CMP_TYPE_UINT16: return true; default: return false; } } bool cmp_object_is_uint(cmp_object_t *obj) { switch (obj->type) { case CMP_TYPE_POSITIVE_FIXNUM: case CMP_TYPE_UINT8: case CMP_TYPE_UINT16: case CMP_TYPE_UINT32: return true; default: return false; } } bool cmp_object_is_ulong(cmp_object_t *obj) { switch (obj->type) { case CMP_TYPE_POSITIVE_FIXNUM: case CMP_TYPE_UINT8: case CMP_TYPE_UINT16: case CMP_TYPE_UINT32: case CMP_TYPE_UINT64: return true; default: return false; } } bool cmp_object_is_uinteger(cmp_object_t *obj) { return cmp_object_is_ulong(obj); } bool cmp_object_is_float(cmp_object_t *obj) { if (obj->type == CMP_TYPE_FLOAT) return true; return false; } bool cmp_object_is_double(cmp_object_t *obj) { if (obj->type == CMP_TYPE_DOUBLE) return true; return false; } bool cmp_object_is_nil(cmp_object_t *obj) { if (obj->type == CMP_TYPE_NIL) return true; return false; } bool cmp_object_is_bool(cmp_object_t *obj) { if (obj->type == CMP_TYPE_BOOLEAN) return true; return false; } bool cmp_object_is_str(cmp_object_t *obj) { switch (obj->type) { case CMP_TYPE_FIXSTR: case CMP_TYPE_STR8: case CMP_TYPE_STR16: case CMP_TYPE_STR32: return true; default: return false; } } bool cmp_object_is_bin(cmp_object_t *obj) { switch (obj->type) { case CMP_TYPE_BIN8: case CMP_TYPE_BIN16: case CMP_TYPE_BIN32: return true; default: return false; } } bool cmp_object_is_array(cmp_object_t *obj) { switch (obj->type) { case CMP_TYPE_FIXARRAY: case CMP_TYPE_ARRAY16: case CMP_TYPE_ARRAY32: return true; default: return false; } } bool cmp_object_is_map(cmp_object_t *obj) { switch (obj->type) { case CMP_TYPE_FIXMAP: case CMP_TYPE_MAP16: case CMP_TYPE_MAP32: return true; default: return false; } } bool cmp_object_is_ext(cmp_object_t *obj) { switch (obj->type) { case CMP_TYPE_FIXEXT1: case CMP_TYPE_FIXEXT2: case CMP_TYPE_FIXEXT4: case CMP_TYPE_FIXEXT8: case CMP_TYPE_FIXEXT16: case CMP_TYPE_EXT8: case CMP_TYPE_EXT16: case CMP_TYPE_EXT32: return true; default: return false; } } bool cmp_object_as_char(cmp_object_t *obj, int8_t *c) { switch (obj->type) { case CMP_TYPE_POSITIVE_FIXNUM: case CMP_TYPE_NEGATIVE_FIXNUM: case CMP_TYPE_SINT8: *c = obj->as.s8; return true; case CMP_TYPE_UINT8: if (obj->as.u8 <= 127) { *c = obj->as.s8; return true; } else { return false; } default: return false; } } bool cmp_object_as_short(cmp_object_t *obj, int16_t *s) { switch (obj->type) { case CMP_TYPE_POSITIVE_FIXNUM: case CMP_TYPE_NEGATIVE_FIXNUM: case CMP_TYPE_SINT8: *s = obj->as.s8; return true; case CMP_TYPE_UINT8: *s = obj->as.u8; return true; case CMP_TYPE_SINT16: *s = obj->as.s16; return true; case CMP_TYPE_UINT16: if (obj->as.u16 <= 32767) { *s = obj->as.u16; return true; } else { return false; } default: return false; } } bool cmp_object_as_int(cmp_object_t *obj, int32_t *i) { switch (obj->type) { case CMP_TYPE_POSITIVE_FIXNUM: case CMP_TYPE_NEGATIVE_FIXNUM: case CMP_TYPE_SINT8: *i = obj->as.s8; return true; case CMP_TYPE_UINT8: *i = obj->as.u8; return true; case CMP_TYPE_SINT16: *i = obj->as.s16; return true; case CMP_TYPE_UINT16: *i = obj->as.u16; return true; case CMP_TYPE_SINT32: *i = obj->as.s32; return true; case CMP_TYPE_UINT32: if (obj->as.u32 <= 2147483647) { *i = obj->as.u32; return true; } else { return false; } default: return false; } } bool cmp_object_as_long(cmp_object_t *obj, int64_t *d) { switch (obj->type) { case CMP_TYPE_POSITIVE_FIXNUM: case CMP_TYPE_NEGATIVE_FIXNUM: case CMP_TYPE_SINT8: *d = obj->as.s8; return true; case CMP_TYPE_UINT8: *d = obj->as.u8; return true; case CMP_TYPE_SINT16: *d = obj->as.s16; return true; case CMP_TYPE_UINT16: *d = obj->as.u16; return true; case CMP_TYPE_SINT32: *d = obj->as.s32; return true; case CMP_TYPE_UINT32: *d = obj->as.u32; return true; case CMP_TYPE_SINT64: *d = obj->as.s64; return true; case CMP_TYPE_UINT64: if (obj->as.u64 <= 9223372036854775807) { *d = obj->as.u64; return true; } else { return false; } default: return false; } } bool cmp_object_as_sinteger(cmp_object_t *obj, int64_t *d) { return cmp_object_as_long(obj, d); } bool cmp_object_as_uchar(cmp_object_t *obj, uint8_t *c) { switch (obj->type) { case CMP_TYPE_POSITIVE_FIXNUM: case CMP_TYPE_UINT8: *c = obj->as.u8; return true; default: return false; } } bool cmp_object_as_ushort(cmp_object_t *obj, uint16_t *s) { switch (obj->type) { case CMP_TYPE_POSITIVE_FIXNUM: case CMP_TYPE_UINT8: *s = obj->as.u8; return true; case CMP_TYPE_UINT16: *s = obj->as.u16; return true; default: return false; } } bool cmp_object_as_uint(cmp_object_t *obj, uint32_t *i) { switch (obj->type) { case CMP_TYPE_POSITIVE_FIXNUM: case CMP_TYPE_UINT8: *i = obj->as.u8; return true; case CMP_TYPE_UINT16: *i = obj->as.u16; return true; case CMP_TYPE_UINT32: *i = obj->as.u32; return true; default: return false; } } bool cmp_object_as_ulong(cmp_object_t *obj, uint64_t *u) { switch (obj->type) { case CMP_TYPE_POSITIVE_FIXNUM: case CMP_TYPE_UINT8: *u = obj->as.u8; return true; case CMP_TYPE_UINT16: *u = obj->as.u16; return true; case CMP_TYPE_UINT32: *u = obj->as.u32; return true; case CMP_TYPE_UINT64: *u = obj->as.u64; return true; default: return false; } } bool cmp_object_as_uinteger(cmp_object_t *obj, uint64_t *d) { return cmp_object_as_ulong(obj, d); } bool cmp_object_as_float(cmp_object_t *obj, float *f) { if (obj->type == CMP_TYPE_FLOAT) { *f = obj->as.flt; return true; } return false; } bool cmp_object_as_double(cmp_object_t *obj, double *d) { if (obj->type == CMP_TYPE_DOUBLE) { *d = obj->as.dbl; return true; } return false; } bool cmp_object_as_bool(cmp_object_t *obj, bool *b) { if (obj->type == CMP_TYPE_BOOLEAN) { if (obj->as.boolean) *b = true; else *b = false; return true; } return false; } bool cmp_object_as_str(cmp_object_t *obj, uint32_t *size) { switch (obj->type) { case CMP_TYPE_FIXSTR: case CMP_TYPE_STR8: case CMP_TYPE_STR16: case CMP_TYPE_STR32: *size = obj->as.str_size; return true; default: return false; } } bool cmp_object_as_bin(cmp_object_t *obj, uint32_t *size) { switch (obj->type) { case CMP_TYPE_BIN8: case CMP_TYPE_BIN16: case CMP_TYPE_BIN32: *size = obj->as.bin_size; return true; default: return false; } } bool cmp_object_as_array(cmp_object_t *obj, uint32_t *size) { switch (obj->type) { case CMP_TYPE_FIXARRAY: case CMP_TYPE_ARRAY16: case CMP_TYPE_ARRAY32: *size = obj->as.array_size; return true; default: return false; } } bool cmp_object_as_map(cmp_object_t *obj, uint32_t *size) { switch (obj->type) { case CMP_TYPE_FIXMAP: case CMP_TYPE_MAP16: case CMP_TYPE_MAP32: *size = obj->as.map_size; return true; default: return false; } } bool cmp_object_as_ext(cmp_object_t *obj, int8_t *type, uint32_t *size) { switch (obj->type) { case CMP_TYPE_FIXEXT1: case CMP_TYPE_FIXEXT2: case CMP_TYPE_FIXEXT4: case CMP_TYPE_FIXEXT8: case CMP_TYPE_FIXEXT16: case CMP_TYPE_EXT8: case CMP_TYPE_EXT16: case CMP_TYPE_EXT32: *type = obj->as.ext.type; *size = obj->as.ext.size; return true; default: return false; } } bool cmp_object_to_str(cmp_ctx_t *ctx, cmp_object_t *obj, char *data, uint32_t buf_size) { uint32_t str_size = 0; switch (obj->type) { case CMP_TYPE_FIXSTR: case CMP_TYPE_STR8: case CMP_TYPE_STR16: case CMP_TYPE_STR32: str_size = obj->as.str_size; if ((str_size + 1) > buf_size) { ctx->error = STR_DATA_LENGTH_TOO_LONG_ERROR; return false; } if (!ctx->read(ctx, data, str_size)) { ctx->error = DATA_READING_ERROR; return false; } data[str_size] = 0; return true; default: return false; } } bool cmp_object_to_bin(cmp_ctx_t *ctx, cmp_object_t *obj, void *data, uint32_t buf_size) { uint32_t bin_size = 0; switch (obj->type) { case CMP_TYPE_BIN8: case CMP_TYPE_BIN16: case CMP_TYPE_BIN32: bin_size = obj->as.bin_size; if (bin_size > buf_size) { ctx->error = BIN_DATA_LENGTH_TOO_LONG_ERROR; return false; } if (!ctx->read(ctx, data, bin_size)) { ctx->error = DATA_READING_ERROR; return false; } return true; default: return false; } } /* vi: set et ts=2 sw=2: */ MoarVM-2018.03/3rdparty/cmp/cmp.h0000644000175000017510000004626113252357721016502 0ustar samanthasamantha/* The MIT License (MIT) Copyright (c) 2017 Charles Gunyon Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef CMP_H__ #define CMP_H__ struct cmp_ctx_s; typedef bool (*cmp_reader)(struct cmp_ctx_s *ctx, void *data, size_t limit); typedef bool (*cmp_skipper)(struct cmp_ctx_s *ctx, size_t count); typedef size_t (*cmp_writer)(struct cmp_ctx_s *ctx, const void *data, size_t count); enum { CMP_TYPE_POSITIVE_FIXNUM, /* 0 */ CMP_TYPE_FIXMAP, /* 1 */ CMP_TYPE_FIXARRAY, /* 2 */ CMP_TYPE_FIXSTR, /* 3 */ CMP_TYPE_NIL, /* 4 */ CMP_TYPE_BOOLEAN, /* 5 */ CMP_TYPE_BIN8, /* 6 */ CMP_TYPE_BIN16, /* 7 */ CMP_TYPE_BIN32, /* 8 */ CMP_TYPE_EXT8, /* 9 */ CMP_TYPE_EXT16, /* 10 */ CMP_TYPE_EXT32, /* 11 */ CMP_TYPE_FLOAT, /* 12 */ CMP_TYPE_DOUBLE, /* 13 */ CMP_TYPE_UINT8, /* 14 */ CMP_TYPE_UINT16, /* 15 */ CMP_TYPE_UINT32, /* 16 */ CMP_TYPE_UINT64, /* 17 */ CMP_TYPE_SINT8, /* 18 */ CMP_TYPE_SINT16, /* 19 */ CMP_TYPE_SINT32, /* 20 */ CMP_TYPE_SINT64, /* 21 */ CMP_TYPE_FIXEXT1, /* 22 */ CMP_TYPE_FIXEXT2, /* 23 */ CMP_TYPE_FIXEXT4, /* 24 */ CMP_TYPE_FIXEXT8, /* 25 */ CMP_TYPE_FIXEXT16, /* 26 */ CMP_TYPE_STR8, /* 27 */ CMP_TYPE_STR16, /* 28 */ CMP_TYPE_STR32, /* 29 */ CMP_TYPE_ARRAY16, /* 30 */ CMP_TYPE_ARRAY32, /* 31 */ CMP_TYPE_MAP16, /* 32 */ CMP_TYPE_MAP32, /* 33 */ CMP_TYPE_NEGATIVE_FIXNUM /* 34 */ }; typedef struct cmp_ext_s { int8_t type; uint32_t size; } cmp_ext_t; union cmp_object_data_u { bool boolean; uint8_t u8; uint16_t u16; uint32_t u32; uint64_t u64; int8_t s8; int16_t s16; int32_t s32; int64_t s64; float flt; double dbl; uint32_t array_size; uint32_t map_size; uint32_t str_size; uint32_t bin_size; cmp_ext_t ext; }; typedef struct cmp_ctx_s { uint8_t error; void *buf; cmp_reader read; cmp_skipper skip; cmp_writer write; } cmp_ctx_t; typedef struct cmp_object_s { uint8_t type; union cmp_object_data_u as; } cmp_object_t; #ifdef __cplusplus extern "C" { #endif /* * ============================================================================ * === Main API * ============================================================================ */ /* * Initializes a CMP context * * If you don't intend to read, `read` may be NULL, but calling `*read*` * functions will crash; there is no check. * * `skip` may be NULL, in which case skipping functions will use `read`. * * If you don't intend to write, `write` may be NULL, but calling `*write*` * functions will crash; there is no check. */ void cmp_init(cmp_ctx_t *ctx, void *buf, cmp_reader read, cmp_skipper skip, cmp_writer write); /* Returns CMP's version */ uint32_t cmp_version(void); /* Returns the MessagePack version employed by CMP */ uint32_t cmp_mp_version(void); /* Returns a string description of a CMP context's error */ const char* cmp_strerror(cmp_ctx_t *ctx); /* Writes a signed integer to the backend */ bool cmp_write_integer(cmp_ctx_t *ctx, int64_t d); /* Writes an unsigned integer to the backend */ bool cmp_write_uinteger(cmp_ctx_t *ctx, uint64_t u); /* * Writes a floating-point value (either single or double-precision) to the * backend */ bool cmp_write_decimal(cmp_ctx_t *ctx, double d); /* Writes NULL to the backend */ bool cmp_write_nil(cmp_ctx_t *ctx); /* Writes true to the backend */ bool cmp_write_true(cmp_ctx_t *ctx); /* Writes false to the backend */ bool cmp_write_false(cmp_ctx_t *ctx); /* Writes a boolean value to the backend */ bool cmp_write_bool(cmp_ctx_t *ctx, bool b); /* * Writes an unsigned char's value to the backend as a boolean. This is useful * if you are using a different boolean type in your application. */ bool cmp_write_u8_as_bool(cmp_ctx_t *ctx, uint8_t b); /* * Writes a string to the backend; according to the MessagePack spec, this must * be encoded using UTF-8, but CMP leaves that job up to the programmer. */ bool cmp_write_str(cmp_ctx_t *ctx, const char *data, uint32_t size); /* * Writes a string to the backend. This avoids using the STR8 marker, which * is unsupported by MessagePack v4, the version implemented by many other * MessagePack libraries. No encoding is assumed in this case, not that it * matters. */ bool cmp_write_str_v4(cmp_ctx_t *ctx, const char *data, uint32_t size); /* * Writes the string marker to the backend. This is useful if you are writing * data in chunks instead of a single shot. */ bool cmp_write_str_marker(cmp_ctx_t *ctx, uint32_t size); /* * Writes the string marker to the backend. This is useful if you are writing * data in chunks instead of a single shot. This avoids using the STR8 * marker, which is unsupported by MessagePack v4, the version implemented by * many other MessagePack libraries. No encoding is assumed in this case, not * that it matters. */ bool cmp_write_str_marker_v4(cmp_ctx_t *ctx, uint32_t size); /* Writes binary data to the backend */ bool cmp_write_bin(cmp_ctx_t *ctx, const void *data, uint32_t size); /* * Writes the binary data marker to the backend. This is useful if you are * writing data in chunks instead of a single shot. */ bool cmp_write_bin_marker(cmp_ctx_t *ctx, uint32_t size); /* Writes an array to the backend. */ bool cmp_write_array(cmp_ctx_t *ctx, uint32_t size); /* Writes a map to the backend. */ bool cmp_write_map(cmp_ctx_t *ctx, uint32_t size); /* Writes an extended type to the backend */ bool cmp_write_ext(cmp_ctx_t *ctx, int8_t type, uint32_t size, const void *data); /* * Writes the extended type marker to the backend. This is useful if you want * to write the type's data in chunks instead of a single shot. */ bool cmp_write_ext_marker(cmp_ctx_t *ctx, int8_t type, uint32_t size); /* Writes an object to the backend */ bool cmp_write_object(cmp_ctx_t *ctx, cmp_object_t *obj); /* * Writes an object to the backend. This avoids using the STR8 marker, which * is unsupported by MessagePack v4, the version implemented by many other * MessagePack libraries. */ bool cmp_write_object_v4(cmp_ctx_t *ctx, cmp_object_t *obj); /* Reads a signed integer that fits inside a signed char */ bool cmp_read_char(cmp_ctx_t *ctx, int8_t *c); /* Reads a signed integer that fits inside a signed short */ bool cmp_read_short(cmp_ctx_t *ctx, int16_t *s); /* Reads a signed integer that fits inside a signed int */ bool cmp_read_int(cmp_ctx_t *ctx, int32_t *i); /* Reads a signed integer that fits inside a signed long */ bool cmp_read_long(cmp_ctx_t *ctx, int64_t *d); /* Reads a signed integer */ bool cmp_read_integer(cmp_ctx_t *ctx, int64_t *d); /* Reads an unsigned integer that fits inside an unsigned char */ bool cmp_read_uchar(cmp_ctx_t *ctx, uint8_t *c); /* Reads an unsigned integer that fits inside an unsigned short */ bool cmp_read_ushort(cmp_ctx_t *ctx, uint16_t *s); /* Reads an unsigned integer that fits inside an unsigned int */ bool cmp_read_uint(cmp_ctx_t *ctx, uint32_t *i); /* Reads an unsigned integer that fits inside an unsigned long */ bool cmp_read_ulong(cmp_ctx_t *ctx, uint64_t *u); /* Reads an unsigned integer */ bool cmp_read_uinteger(cmp_ctx_t *ctx, uint64_t *u); /* * Reads a floating point value (either single or double-precision) from the * backend */ bool cmp_read_decimal(cmp_ctx_t *ctx, double *d); /* "Reads" (more like "skips") a NULL value from the backend */ bool cmp_read_nil(cmp_ctx_t *ctx); /* Reads a boolean from the backend */ bool cmp_read_bool(cmp_ctx_t *ctx, bool *b); /* * Reads a boolean as an unsigned char from the backend; this is useful if your * application uses a different boolean type. */ bool cmp_read_bool_as_u8(cmp_ctx_t *ctx, uint8_t *b); /* Reads a string's size from the backend */ bool cmp_read_str_size(cmp_ctx_t *ctx, uint32_t *size); /* * Reads a string from the backend; according to the spec, the string's data * ought to be encoded using UTF-8, */ bool cmp_read_str(cmp_ctx_t *ctx, char *data, uint32_t *size); /* Reads the size of packed binary data from the backend */ bool cmp_read_bin_size(cmp_ctx_t *ctx, uint32_t *size); /* Reads packed binary data from the backend */ bool cmp_read_bin(cmp_ctx_t *ctx, void *data, uint32_t *size); /* Reads an array from the backend */ bool cmp_read_array(cmp_ctx_t *ctx, uint32_t *size); /* Reads a map from the backend */ bool cmp_read_map(cmp_ctx_t *ctx, uint32_t *size); /* Reads the extended type's marker from the backend */ bool cmp_read_ext_marker(cmp_ctx_t *ctx, int8_t *type, uint32_t *size); /* Reads an extended type from the backend */ bool cmp_read_ext(cmp_ctx_t *ctx, int8_t *type, uint32_t *size, void *data); /* Reads an object from the backend */ bool cmp_read_object(cmp_ctx_t *ctx, cmp_object_t *obj); /* * Skips the next object from the backend. If that object is an array or map, * this function will: * - If `obj` is not `NULL`, fill in `obj` with that object * - Set `ctx->error` to `SKIP_DEPTH_LIMIT_EXCEEDED_ERROR` * - Return `false` * Otherwise: * - (Don't touch `obj`) * - Return `true` */ bool cmp_skip_object(cmp_ctx_t *ctx, cmp_object_t *obj); /* * This is similar to `cmp_skip_object`, except it tolerates up to `limit` * levels of nesting. For example, in order to skip an array that contains a * map, call `cmp_skip_object_limit(ctx, &obj, 2)`. Or in other words, * `cmp_skip_object(ctx, &obj)` acts similarly to `cmp_skip_object_limit(ctx, * &obj, 0)` * * Specifically, `limit` refers to depth, not breadth. So in order to skip an * array that contains two arrays that each contain 3 strings, you would call * `cmp_skip_object_limit(ctx, &obj, 2). In order to skip an array that * contains 4 arrays that each contain 1 string, you would still call * `cmp_skip_object_limit(ctx, &obj, 2). */ bool cmp_skip_object_limit(cmp_ctx_t *ctx, cmp_object_t *obj, uint32_t limit); /* * This is similar to `cmp_skip_object`, except it will continually skip * nested data structures. * * WARNING: This can cause your application to spend an unbounded amount of * time reading nested data structures. Unless you completely trust * the data source, you should strongly consider `cmp_skip_object` or * `cmp_skip_object_limit`. */ bool cmp_skip_object_no_limit(cmp_ctx_t *ctx); /* * ============================================================================ * === Specific API * ============================================================================ */ bool cmp_write_pfix(cmp_ctx_t *ctx, uint8_t c); bool cmp_write_nfix(cmp_ctx_t *ctx, int8_t c); bool cmp_write_sfix(cmp_ctx_t *ctx, int8_t c); bool cmp_write_s8(cmp_ctx_t *ctx, int8_t c); bool cmp_write_s16(cmp_ctx_t *ctx, int16_t s); bool cmp_write_s32(cmp_ctx_t *ctx, int32_t i); bool cmp_write_s64(cmp_ctx_t *ctx, int64_t l); bool cmp_write_ufix(cmp_ctx_t *ctx, uint8_t c); bool cmp_write_u8(cmp_ctx_t *ctx, uint8_t c); bool cmp_write_u16(cmp_ctx_t *ctx, uint16_t s); bool cmp_write_u32(cmp_ctx_t *ctx, uint32_t i); bool cmp_write_u64(cmp_ctx_t *ctx, uint64_t l); bool cmp_write_float(cmp_ctx_t *ctx, float f); bool cmp_write_double(cmp_ctx_t *ctx, double d); bool cmp_write_fixstr_marker(cmp_ctx_t *ctx, uint8_t size); bool cmp_write_fixstr(cmp_ctx_t *ctx, const char *data, uint8_t size); bool cmp_write_str8_marker(cmp_ctx_t *ctx, uint8_t size); bool cmp_write_str8(cmp_ctx_t *ctx, const char *data, uint8_t size); bool cmp_write_str16_marker(cmp_ctx_t *ctx, uint16_t size); bool cmp_write_str16(cmp_ctx_t *ctx, const char *data, uint16_t size); bool cmp_write_str32_marker(cmp_ctx_t *ctx, uint32_t size); bool cmp_write_str32(cmp_ctx_t *ctx, const char *data, uint32_t size); bool cmp_write_bin8_marker(cmp_ctx_t *ctx, uint8_t size); bool cmp_write_bin8(cmp_ctx_t *ctx, const void *data, uint8_t size); bool cmp_write_bin16_marker(cmp_ctx_t *ctx, uint16_t size); bool cmp_write_bin16(cmp_ctx_t *ctx, const void *data, uint16_t size); bool cmp_write_bin32_marker(cmp_ctx_t *ctx, uint32_t size); bool cmp_write_bin32(cmp_ctx_t *ctx, const void *data, uint32_t size); bool cmp_write_fixarray(cmp_ctx_t *ctx, uint8_t size); bool cmp_write_array16(cmp_ctx_t *ctx, uint16_t size); bool cmp_write_array32(cmp_ctx_t *ctx, uint32_t size); bool cmp_write_fixmap(cmp_ctx_t *ctx, uint8_t size); bool cmp_write_map16(cmp_ctx_t *ctx, uint16_t size); bool cmp_write_map32(cmp_ctx_t *ctx, uint32_t size); bool cmp_write_fixext1_marker(cmp_ctx_t *ctx, int8_t type); bool cmp_write_fixext1(cmp_ctx_t *ctx, int8_t type, const void *data); bool cmp_write_fixext2_marker(cmp_ctx_t *ctx, int8_t type); bool cmp_write_fixext2(cmp_ctx_t *ctx, int8_t type, const void *data); bool cmp_write_fixext4_marker(cmp_ctx_t *ctx, int8_t type); bool cmp_write_fixext4(cmp_ctx_t *ctx, int8_t type, const void *data); bool cmp_write_fixext8_marker(cmp_ctx_t *ctx, int8_t type); bool cmp_write_fixext8(cmp_ctx_t *ctx, int8_t type, const void *data); bool cmp_write_fixext16_marker(cmp_ctx_t *ctx, int8_t type); bool cmp_write_fixext16(cmp_ctx_t *ctx, int8_t type, const void *data); bool cmp_write_ext8_marker(cmp_ctx_t *ctx, int8_t type, uint8_t size); bool cmp_write_ext8(cmp_ctx_t *ctx, int8_t type, uint8_t size, const void *data); bool cmp_write_ext16_marker(cmp_ctx_t *ctx, int8_t type, uint16_t size); bool cmp_write_ext16(cmp_ctx_t *ctx, int8_t type, uint16_t size, const void *data); bool cmp_write_ext32_marker(cmp_ctx_t *ctx, int8_t type, uint32_t size); bool cmp_write_ext32(cmp_ctx_t *ctx, int8_t type, uint32_t size, const void *data); bool cmp_read_pfix(cmp_ctx_t *ctx, uint8_t *c); bool cmp_read_nfix(cmp_ctx_t *ctx, int8_t *c); bool cmp_read_sfix(cmp_ctx_t *ctx, int8_t *c); bool cmp_read_s8(cmp_ctx_t *ctx, int8_t *c); bool cmp_read_s16(cmp_ctx_t *ctx, int16_t *s); bool cmp_read_s32(cmp_ctx_t *ctx, int32_t *i); bool cmp_read_s64(cmp_ctx_t *ctx, int64_t *l); bool cmp_read_ufix(cmp_ctx_t *ctx, uint8_t *c); bool cmp_read_u8(cmp_ctx_t *ctx, uint8_t *c); bool cmp_read_u16(cmp_ctx_t *ctx, uint16_t *s); bool cmp_read_u32(cmp_ctx_t *ctx, uint32_t *i); bool cmp_read_u64(cmp_ctx_t *ctx, uint64_t *l); bool cmp_read_float(cmp_ctx_t *ctx, float *f); bool cmp_read_double(cmp_ctx_t *ctx, double *d); bool cmp_read_fixext1_marker(cmp_ctx_t *ctx, int8_t *type); bool cmp_read_fixext1(cmp_ctx_t *ctx, int8_t *type, void *data); bool cmp_read_fixext2_marker(cmp_ctx_t *ctx, int8_t *type); bool cmp_read_fixext2(cmp_ctx_t *ctx, int8_t *type, void *data); bool cmp_read_fixext4_marker(cmp_ctx_t *ctx, int8_t *type); bool cmp_read_fixext4(cmp_ctx_t *ctx, int8_t *type, void *data); bool cmp_read_fixext8_marker(cmp_ctx_t *ctx, int8_t *type); bool cmp_read_fixext8(cmp_ctx_t *ctx, int8_t *type, void *data); bool cmp_read_fixext16_marker(cmp_ctx_t *ctx, int8_t *type); bool cmp_read_fixext16(cmp_ctx_t *ctx, int8_t *type, void *data); bool cmp_read_ext8_marker(cmp_ctx_t *ctx, int8_t *type, uint8_t *size); bool cmp_read_ext8(cmp_ctx_t *ctx, int8_t *type, uint8_t *size, void *data); bool cmp_read_ext16_marker(cmp_ctx_t *ctx, int8_t *type, uint16_t *size); bool cmp_read_ext16(cmp_ctx_t *ctx, int8_t *type, uint16_t *size, void *data); bool cmp_read_ext32_marker(cmp_ctx_t *ctx, int8_t *type, uint32_t *size); bool cmp_read_ext32(cmp_ctx_t *ctx, int8_t *type, uint32_t *size, void *data); /* * ============================================================================ * === Object API * ============================================================================ */ bool cmp_object_is_char(cmp_object_t *obj); bool cmp_object_is_short(cmp_object_t *obj); bool cmp_object_is_int(cmp_object_t *obj); bool cmp_object_is_long(cmp_object_t *obj); bool cmp_object_is_sinteger(cmp_object_t *obj); bool cmp_object_is_uchar(cmp_object_t *obj); bool cmp_object_is_ushort(cmp_object_t *obj); bool cmp_object_is_uint(cmp_object_t *obj); bool cmp_object_is_ulong(cmp_object_t *obj); bool cmp_object_is_uinteger(cmp_object_t *obj); bool cmp_object_is_float(cmp_object_t *obj); bool cmp_object_is_double(cmp_object_t *obj); bool cmp_object_is_nil(cmp_object_t *obj); bool cmp_object_is_bool(cmp_object_t *obj); bool cmp_object_is_str(cmp_object_t *obj); bool cmp_object_is_bin(cmp_object_t *obj); bool cmp_object_is_array(cmp_object_t *obj); bool cmp_object_is_map(cmp_object_t *obj); bool cmp_object_is_ext(cmp_object_t *obj); bool cmp_object_as_char(cmp_object_t *obj, int8_t *c); bool cmp_object_as_short(cmp_object_t *obj, int16_t *s); bool cmp_object_as_int(cmp_object_t *obj, int32_t *i); bool cmp_object_as_long(cmp_object_t *obj, int64_t *d); bool cmp_object_as_sinteger(cmp_object_t *obj, int64_t *d); bool cmp_object_as_uchar(cmp_object_t *obj, uint8_t *c); bool cmp_object_as_ushort(cmp_object_t *obj, uint16_t *s); bool cmp_object_as_uint(cmp_object_t *obj, uint32_t *i); bool cmp_object_as_ulong(cmp_object_t *obj, uint64_t *u); bool cmp_object_as_uinteger(cmp_object_t *obj, uint64_t *u); bool cmp_object_as_float(cmp_object_t *obj, float *f); bool cmp_object_as_double(cmp_object_t *obj, double *d); bool cmp_object_as_bool(cmp_object_t *obj, bool *b); bool cmp_object_as_str(cmp_object_t *obj, uint32_t *size); bool cmp_object_as_bin(cmp_object_t *obj, uint32_t *size); bool cmp_object_as_array(cmp_object_t *obj, uint32_t *size); bool cmp_object_as_map(cmp_object_t *obj, uint32_t *size); bool cmp_object_as_ext(cmp_object_t *obj, int8_t *type, uint32_t *size); bool cmp_object_to_str(cmp_ctx_t *ctx, cmp_object_t *obj, char *data, uint32_t buf_size); bool cmp_object_to_bin(cmp_ctx_t *ctx, cmp_object_t *obj, void *data, uint32_t buf_size); #ifdef __cplusplus } /* extern "C" */ #endif /* * ============================================================================ * === Backwards compatibility defines * ============================================================================ */ #define cmp_write_int cmp_write_integer #define cmp_write_sint cmp_write_integer #define cmp_write_sinteger cmp_write_integer #define cmp_write_uint cmp_write_uinteger #define cmp_read_sinteger cmp_read_integer #endif /* CMP_H__ */ /* vi: set et ts=2 sw=2: */ MoarVM-2018.03/3rdparty/cmp/examples/cmp_data.dat0000644000175000017510000000011613252357721021617 0ustar samanthasamantha™ò&Ê?æffË@rÆfffffÀèGreeting¥Hello¤Name¥LinusÄ MessagePackÄis greatÖ¿MoarVM-2018.03/3rdparty/cmp/examples/example1.c0000644000175000017510000000636113252357721021245 0ustar samanthasamantha/* The MIT License (MIT) Copyright (c) 2017 Charles Gunyon Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include #include #include "cmp.h" static bool read_bytes(void *data, size_t sz, FILE *fh) { return fread(data, sizeof(uint8_t), sz, fh) == (sz * sizeof(uint8_t)); } static bool file_reader(cmp_ctx_t *ctx, void *data, size_t limit) { return read_bytes(data, limit, (FILE *)ctx->buf); } static bool file_skipper(cmp_ctx_t *ctx, size_t count) { return fseek((FILE *)ctx->buf, count, SEEK_CUR); } static size_t file_writer(cmp_ctx_t *ctx, const void *data, size_t count) { return fwrite(data, sizeof(uint8_t), count, (FILE *)ctx->buf); } void error_and_exit(const char *msg) { fprintf(stderr, "%s\n\n", msg); exit(EXIT_FAILURE); } int main(void) { FILE *fh = NULL; cmp_ctx_t cmp; uint32_t array_size = 0; uint32_t str_size = 0; char hello[6] = {0, 0, 0, 0, 0, 0}; char message_pack[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; fh = fopen("cmp_data.dat", "w+b"); if (fh == NULL) error_and_exit("Error opening data.dat"); cmp_init(&cmp, fh, file_reader, file_skipper, file_writer); if (!cmp_write_array(&cmp, 2)) error_and_exit(cmp_strerror(&cmp)); if (!cmp_write_str(&cmp, "Hello", 5)) error_and_exit(cmp_strerror(&cmp)); if (!cmp_write_str(&cmp, "MessagePack", 11)) error_and_exit(cmp_strerror(&cmp)); rewind(fh); if (!cmp_read_array(&cmp, &array_size)) error_and_exit(cmp_strerror(&cmp)); /* You can read the str byte size and then read str bytes... */ if (!cmp_read_str_size(&cmp, &str_size)) error_and_exit(cmp_strerror(&cmp)); if (str_size > (sizeof(hello) - 1)) error_and_exit("Packed 'hello' length too long\n"); if (!read_bytes(hello, str_size, fh)) error_and_exit(cmp_strerror(&cmp)); /* * ...or you can set the maximum number of bytes to read and do it all in * one call */ str_size = sizeof(message_pack); if (!cmp_read_str(&cmp, message_pack, &str_size)) error_and_exit(cmp_strerror(&cmp)); printf("Array Length: %u.\n", array_size); printf("[\"%s\", \"%s\"]\n", hello, message_pack); fclose(fh); return EXIT_SUCCESS; } MoarVM-2018.03/3rdparty/cmp/examples/example2.c0000644000175000017510000003405013252357721021242 0ustar samanthasamantha/* The MIT License (MIT) Copyright (c) 2017 Charles Gunyon Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include #include #include #include #include #include "cmp.h" static bool read_bytes(void *data, size_t sz, FILE *fh) { return fread(data, sizeof(uint8_t), sz, fh) == (sz * sizeof(uint8_t)); } static bool file_reader(cmp_ctx_t *ctx, void *data, size_t limit) { return read_bytes(data, limit, (FILE *)ctx->buf); } static bool file_skipper(cmp_ctx_t *ctx, size_t count) { return fseek((FILE *)ctx->buf, count, SEEK_CUR); } static size_t file_writer(cmp_ctx_t *ctx, const void *data, size_t count) { return fwrite(data, sizeof(uint8_t), count, (FILE *)ctx->buf); } void error_and_exit(const char *msg) { fprintf(stderr, "%s\n\n", msg); exit(EXIT_FAILURE); } int main(void) { FILE *fh = NULL; cmp_ctx_t cmp; uint16_t year = 1983; uint8_t month = 5; uint8_t day = 28; int64_t sint = 0; uint64_t uint = 0; float flt = 0.0f; double dbl = 0.0; bool boolean = false; uint8_t fake_bool = 0; uint32_t string_size = 0; uint32_t array_size = 0; uint32_t binary_size = 0; uint32_t map_size = 0; int8_t ext_type = 0; uint32_t ext_size = 0; char sbuf[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; fh = fopen("cmp_data.dat", "w+b"); if (fh == NULL) error_and_exit("Error opening data.dat"); cmp_init(&cmp, fh, file_reader, file_skipper, file_writer); /* * When you write an array, you first specify the number of array * elements, then you write that many elements. */ if (!cmp_write_array(&cmp, 9)) error_and_exit(cmp_strerror(&cmp)); if (!cmp_write_sint(&cmp, -14)) error_and_exit(cmp_strerror(&cmp)); if (!cmp_write_uint(&cmp, 38)) error_and_exit(cmp_strerror(&cmp)); if (!cmp_write_float(&cmp, 1.8f)) error_and_exit(cmp_strerror(&cmp)); if (!cmp_write_double(&cmp, 300.4)) error_and_exit(cmp_strerror(&cmp)); if (!cmp_write_nil(&cmp)) error_and_exit(cmp_strerror(&cmp)); if (!cmp_write_true(&cmp)) error_and_exit(cmp_strerror(&cmp)); if (!cmp_write_false(&cmp)) error_and_exit(cmp_strerror(&cmp)); if (!cmp_write_bool(&cmp, false)) error_and_exit(cmp_strerror(&cmp)); if (!cmp_write_u8_as_bool(&cmp, 1)) error_and_exit(cmp_strerror(&cmp)); /* Array full */ /* * Maps work similar to arrays, but the length is in "pairs", so this * writes 2 pairs to the map. Subsequently, pairs are written in key, * value order. */ if (!cmp_write_map(&cmp, 2)) error_and_exit(cmp_strerror(&cmp)); /* You can write string data all at once... */ if (!cmp_write_str(&cmp, "Greeting", 8)) error_and_exit(cmp_strerror(&cmp)); if (!cmp_write_str(&cmp, "Hello", 5)) error_and_exit(cmp_strerror(&cmp)); if (!cmp_write_str(&cmp, "Name", 4)) error_and_exit(cmp_strerror(&cmp)); /* ...or in chunks */ if (!cmp_write_str_marker(&cmp, 5)) error_and_exit(cmp_strerror(&cmp)); if (file_writer(&cmp, "Li", 2) != 2) error_and_exit(strerror(errno)); if (file_writer(&cmp, "nus", 3) != 3) error_and_exit(strerror(errno)); /* Map full */ /* Binary data functions the same as string data */ if (!cmp_write_bin(&cmp, "MessagePack", 11)) error_and_exit(cmp_strerror(&cmp)); if (!cmp_write_bin_marker(&cmp, 8)) error_and_exit(cmp_strerror(&cmp)); if (file_writer(&cmp, "is ", 3) != 3) error_and_exit(strerror(errno)); if (file_writer(&cmp, "great", 5) != 5) error_and_exit(strerror(errno)); /* * With extended types, you can create your own custom types. Here we * create a simple date type. */ /* cmp_write_ext_marker(type, size) */ if (!cmp_write_ext_marker(&cmp, 1, 4)) error_and_exit(cmp_strerror(&cmp)); file_writer(&cmp, &year, sizeof(uint16_t)); file_writer(&cmp, &month, sizeof(uint8_t)); file_writer(&cmp, &day, sizeof(uint8_t)); /* Now we can read the data back just as easily */ rewind(fh); if (!cmp_read_array(&cmp, &array_size)) error_and_exit(cmp_strerror(&cmp)); if (array_size != 9) error_and_exit("Array size was not 9"); if (!cmp_read_sinteger(&cmp, &sint)) error_and_exit(cmp_strerror(&cmp)); if (sint != -14) error_and_exit("Signed int was not -14"); if (!cmp_read_uinteger(&cmp, &uint)) error_and_exit(cmp_strerror(&cmp)); if (uint != 38) error_and_exit("Unsigned int was not 38"); if (!cmp_read_float(&cmp, &flt)) error_and_exit(cmp_strerror(&cmp)); if (flt != 1.8f) error_and_exit("Float was not 1.8f"); if (!cmp_read_double(&cmp, &dbl)) error_and_exit(cmp_strerror(&cmp)); if (dbl != 300.4) error_and_exit("Double was not 300.f"); if (!cmp_read_nil(&cmp)) error_and_exit(cmp_strerror(&cmp)); if (!cmp_read_bool(&cmp, &boolean)) error_and_exit(cmp_strerror(&cmp)); if (boolean != true) error_and_exit("First boolean was not true"); if (!cmp_read_bool(&cmp, &boolean)) error_and_exit(cmp_strerror(&cmp)); if (boolean != false) error_and_exit("Second boolean was not false"); if (!cmp_read_bool(&cmp, &boolean)) error_and_exit(cmp_strerror(&cmp)); if (boolean != false) error_and_exit("Third boolean was not false"); if (!cmp_read_bool_as_u8(&cmp, &fake_bool)) error_and_exit(cmp_strerror(&cmp)); if (fake_bool != 1) { fprintf(stderr, "%u.\n", fake_bool); error_and_exit("Third boolean (u8) was not 1"); } if (!cmp_read_map(&cmp, &map_size)) error_and_exit(cmp_strerror(&cmp)); if (map_size != 2) error_and_exit("Map size was not 2"); /* * String reading here. Note that normally strings are encoded using * UTF-8. I have cleverly restricted this example to ASCII, which overlaps * UTF-8 encoding, but this must not be assumed in real-world code. * * You can read strings in two ways. Either you can read the string's size * in bytes and then read the bytes manually... */ if (!cmp_read_str_size(&cmp, &string_size)) error_and_exit(cmp_strerror(&cmp)); if (string_size != 8) error_and_exit("Greeting string key size was not 8"); if (!read_bytes(sbuf, 8, fh)) error_and_exit(strerror(errno)); sbuf[string_size] = 0; if (strncmp(sbuf, "Greeting", 8) != 0) error_and_exit("Greeting string key name was not 'Greeting'"); /* * ...or you can set the maximum number of bytes to read and do it all in * one call. cmp_read_str will write no more than "size" bytes, including * the terminating NULL, to the passed buffer. If the string's size * exceeds the passed buffer size, the "size" input is set to the number of * bytes necessary, not including the terminating NULL. Otherwise, the * "size" input is set to the number of bytes written, not including the * terminating NULL. */ string_size = sizeof(sbuf); if (!cmp_read_str(&cmp, sbuf, &string_size)) error_and_exit(cmp_strerror(&cmp)); if (strncmp(sbuf, "Hello", 5) != 0) error_and_exit("Greeting string value was not 'Hello'"); string_size = sizeof(sbuf); if (!cmp_read_str(&cmp, sbuf, &string_size)) error_and_exit(cmp_strerror(&cmp)); if (strncmp(sbuf, "Name", 4) != 0) error_and_exit("Name key name was not 'Name'"); string_size = sizeof(sbuf); if (!cmp_read_str(&cmp, sbuf, &string_size)) error_and_exit(cmp_strerror(&cmp)); if (strncmp(sbuf, "Linus", 5) != 0) error_and_exit("Name key value was not 'Linus'"); memset(sbuf, 0, sizeof(sbuf)); binary_size = sizeof(sbuf); if (!cmp_read_bin(&cmp, &sbuf, &binary_size)) error_and_exit(cmp_strerror(&cmp)); if (memcmp(sbuf, "MessagePack", 11) != 0) error_and_exit("1st binary value was not 'MessagePack'"); memset(sbuf, 0, sizeof(sbuf)); binary_size = sizeof(sbuf); if (!cmp_read_bin(&cmp, &sbuf, &binary_size)) error_and_exit(cmp_strerror(&cmp)); if (memcmp(sbuf, "is great", 8) != 0) error_and_exit("2nd binary value was not 'is great'"); if (!cmp_read_ext_marker(&cmp, &ext_type, &ext_size)) error_and_exit(cmp_strerror(&cmp)); if (!read_bytes(&year, sizeof(uint16_t), fh)) error_and_exit(strerror(errno)); if (!read_bytes(&month, sizeof(uint8_t), fh)) error_and_exit(strerror(errno)); if (!read_bytes(&day, sizeof(uint8_t), fh)) error_and_exit(strerror(errno)); if (year != 1983) error_and_exit("Year was not 1983"); if (month != 5) error_and_exit("Month was not 5"); if (day != 28) error_and_exit("Day was not 28"); rewind(fh); /* Alternately, you can read objects until the stream is empty */ while (1) { cmp_object_t obj; if (!cmp_read_object(&cmp, &obj)) { if (feof(fh)) break; error_and_exit(cmp_strerror(&cmp)); } switch (obj.type) { case CMP_TYPE_POSITIVE_FIXNUM: case CMP_TYPE_UINT8: printf("Unsigned Integer: %u\n", obj.as.u8); break; case CMP_TYPE_FIXMAP: case CMP_TYPE_MAP16: case CMP_TYPE_MAP32: printf("Map: %u\n", obj.as.map_size); break; case CMP_TYPE_FIXARRAY: case CMP_TYPE_ARRAY16: case CMP_TYPE_ARRAY32: printf("Array: %u\n", obj.as.array_size); break; case CMP_TYPE_FIXSTR: case CMP_TYPE_STR8: case CMP_TYPE_STR16: case CMP_TYPE_STR32: if (!read_bytes(sbuf, obj.as.str_size, fh)) error_and_exit(strerror(errno)); sbuf[obj.as.str_size] = 0; printf("String: %s\n", sbuf); break; case CMP_TYPE_BIN8: case CMP_TYPE_BIN16: case CMP_TYPE_BIN32: memset(sbuf, 0, sizeof(sbuf)); if (!read_bytes(sbuf, obj.as.bin_size, fh)) error_and_exit(strerror(errno)); printf("Binary: %s\n", sbuf); break; case CMP_TYPE_NIL: printf("NULL\n"); break; case CMP_TYPE_BOOLEAN: if (obj.as.boolean) printf("Boolean: true\n"); else printf("Boolean: false\n"); break; case CMP_TYPE_EXT8: case CMP_TYPE_EXT16: case CMP_TYPE_EXT32: case CMP_TYPE_FIXEXT1: case CMP_TYPE_FIXEXT2: case CMP_TYPE_FIXEXT4: case CMP_TYPE_FIXEXT8: case CMP_TYPE_FIXEXT16: if (obj.as.ext.type == 1) { /* Date object */ if (!read_bytes(&year, sizeof(uint16_t), fh)) error_and_exit(strerror(errno)); if (!read_bytes(&month, sizeof(uint8_t), fh)) error_and_exit(strerror(errno)); if (!read_bytes(&day, sizeof(uint8_t), fh)) error_and_exit(strerror(errno)); printf("Date: %u/%u/%u\n", year, month, day); } else { printf("Extended type {%d, %u}: ", obj.as.ext.type, obj.as.ext.size ); while (obj.as.ext.size--) { read_bytes(sbuf, sizeof(uint8_t), fh); printf("%02x ", sbuf[0]); } printf("\n"); } break; case CMP_TYPE_FLOAT: printf("Float: %f\n", obj.as.flt); break; case CMP_TYPE_DOUBLE: printf("Double: %f\n", obj.as.dbl); break; case CMP_TYPE_UINT16: printf("Unsigned Integer: %u\n", obj.as.u16); break; case CMP_TYPE_UINT32: printf("Unsigned Integer: %u\n", obj.as.u32); break; case CMP_TYPE_UINT64: printf("Unsigned Integer: %" PRIu64 "\n", obj.as.u64); break; case CMP_TYPE_NEGATIVE_FIXNUM: case CMP_TYPE_SINT8: printf("Signed Integer: %d\n", obj.as.s8); break; case CMP_TYPE_SINT16: printf("Signed Integer: %d\n", obj.as.s16); break; case CMP_TYPE_SINT32: printf("Signed Integer: %d\n", obj.as.s32); break; case CMP_TYPE_SINT64: printf("Signed Integer: %" PRId64 "\n", obj.as.s64); break; default: printf("Unrecognized object type %u\n", obj.type); break; } } fclose(fh); return EXIT_SUCCESS; } MoarVM-2018.03/3rdparty/cmp/test/buf.c0000644000175000017510000003362113252357721017445 0ustar samanthasamantha/* The MIT License (MIT) Copyright (c) 2017 Charles Gunyon Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include #include #include #include #include #include "utils.h" #include "buf.h" static void check_cursor(buf_t *buf) { if (buf->cursor > buf->size) buf->size = buf->cursor; } buf_t* M_BufferNew(void) { buf_t *buf = calloc(1, sizeof(buf_t)); if (buf == NULL) error_and_exit("M_BufferNew: Calloc returned NULL."); M_BufferInit(buf); return buf; } buf_t* M_BufferNewWithCapacity(size_t capacity) { buf_t *buf = calloc(1, sizeof(buf_t)); if (buf == NULL) error_and_exit("M_BufferNew: calloc returned NULL"); M_BufferInitWithCapacity(buf, capacity); return buf; } void M_BufferInit(buf_t *buf) { buf->size = 0; buf->capacity = 0; buf->cursor = 0; buf->data = NULL; } void M_BufferInitWithCapacity(buf_t *buf, size_t capacity) { M_BufferInit(buf); M_BufferEnsureTotalCapacity(buf, capacity); } size_t M_BufferGetCapacity(buf_t *buf) { return buf->capacity; } size_t M_BufferGetSize(buf_t *buf) { return buf->size; } size_t M_BufferGetCursor(buf_t *buf) { return buf->cursor; } char* M_BufferGetData(buf_t *buf) { return buf->data; } char* M_BufferGetDataAtCursor(buf_t *buf) { return buf->data + buf->cursor; } void M_BufferEnsureCapacity(buf_t *buf, size_t capacity) { size_t needed_capacity = buf->cursor + capacity; if (buf->capacity < needed_capacity) { buf->data = realloc(buf->data, needed_capacity * sizeof(uint8_t)); if (buf->data == NULL) { error_and_exit( "M_BufferEnsureCapacity: Reallocating buffer data failed" ); } memset(buf->data + buf->capacity, 0, needed_capacity - buf->capacity); buf->capacity = needed_capacity; } } void M_BufferEnsureTotalCapacity(buf_t *buf, size_t capacity) { if (buf->capacity < capacity) { size_t old_capacity = buf->capacity; buf->capacity = capacity; buf->data = realloc(buf->data, buf->capacity * sizeof(uint8_t)); if (buf->data == NULL) error_and_exit("M_BufferEnsureCapacity: Allocating buffer data failed"); memset(buf->data + old_capacity, 0, buf->capacity - old_capacity); } } void M_BufferCopy(buf_t *dst, buf_t *src) { M_BufferSetData(dst, M_BufferGetData(src), M_BufferGetSize(src)); } void M_BufferCursorCopy(buf_t *dst, buf_t *src) { M_BufferWrite( dst, M_BufferGetDataAtCursor(src), M_BufferGetSize(src) - (M_BufferGetCursor(src) - 1) ); } bool M_BufferMove(buf_t *buf, size_t dpos, size_t spos, size_t count) { if ((spos + count) > M_BufferGetSize(buf)) return false; M_BufferEnsureTotalCapacity(buf, dpos + count); memmove(M_BufferGetData(buf) + dpos, M_BufferGetData(buf) + spos, count); return true; } void M_BufferSetData(buf_t *buf, const void *data, size_t size) { M_BufferClear(buf); M_BufferEnsureTotalCapacity(buf, size); M_BufferWrite(buf, data, size); } void M_BufferSetString(buf_t *buf, const char *data, size_t length) { M_BufferClear(buf); M_BufferWriteString(buf, data, length); } bool M_BufferSetFile(buf_t *buf, const char *filename) { FILE *fp = NULL; size_t length = 0; bool out = false; if ((fp = fopen(filename, "rb")) == NULL) return false; fseek(fp, 0, SEEK_END); length = ftell(fp); fseek(fp, 0, SEEK_SET); M_BufferClear(buf); M_BufferEnsureTotalCapacity(buf, length); if (fread(buf->data, sizeof(uint8_t), length, fp) == length) { buf->cursor = length; buf->size = length; out = true; } else { M_BufferClear(buf); out = false; } fclose(fp); return out; } bool M_BufferSeek(buf_t *buf, size_t pos) { if (pos > buf->size) return false; buf->cursor = pos; return true; } bool M_BufferSeekBackward(buf_t *buf, size_t count) { if (count > buf->cursor) return false; buf->cursor -= count; return true; } bool M_BufferSeekForward(buf_t *buf, size_t count) { if (buf->cursor + count > buf->size) return false; buf->cursor += count; return true; } uint8_t M_BufferPeek(buf_t *buf) { return *(buf->data + buf->cursor); } void M_BufferWrite(buf_t *buf, const void *data, size_t size) { M_BufferEnsureCapacity(buf, size); memcpy(buf->data + buf->cursor, data, size); buf->cursor += size; check_cursor(buf); } void M_BufferWriteBool(buf_t *buf, bool b) { M_BufferWriteBools(buf, &b, 1); } void M_BufferWriteBools(buf_t *buf, const bool *bools, size_t count) { M_BufferEnsureCapacity(buf, count * sizeof(bool)); M_BufferWriteChars(buf, (char *)bools, count * sizeof(bool)); } void M_BufferWriteChar(buf_t *buf, char c) { M_BufferWriteChars(buf, &c, 1); } void M_BufferWriteChars(buf_t *buf, const char *chars, size_t count) { M_BufferWrite(buf, chars, count * sizeof(char)); } void M_BufferWriteUChar(buf_t *buf, unsigned char c) { M_BufferWriteUChars(buf, &c, 1); } void M_BufferWriteUChars(buf_t *buf, const unsigned char *uchars, size_t count) { M_BufferWrite(buf, uchars, count * sizeof(unsigned char)); } void M_BufferWriteShort(buf_t *buf, short s) { M_BufferWriteShorts(buf, &s, 1); } void M_BufferWriteShorts(buf_t *buf, const short *shorts, size_t count) { M_BufferEnsureCapacity(buf, count * sizeof(short)); M_BufferWriteChars(buf, (char *)shorts, count * sizeof(short)); } void M_BufferWriteUShort(buf_t *buf, unsigned short s) { M_BufferWriteUShorts(buf, &s, 1); } void M_BufferWriteUShorts(buf_t *buf, const unsigned short *ushorts, size_t count) { M_BufferEnsureCapacity(buf, count * sizeof(unsigned short)); M_BufferWriteChars(buf, (char *)ushorts, count * sizeof(unsigned short)); } void M_BufferWriteInt(buf_t *buf, int i) { M_BufferWriteInts(buf, &i, 1); } void M_BufferWriteInts(buf_t *buf, const int *ints, size_t count) { M_BufferEnsureCapacity(buf, count * sizeof(int)); M_BufferWriteChars(buf, (char *)ints, count * sizeof(int)); } void M_BufferWriteUInt(buf_t *buf, unsigned int s) { M_BufferWriteUInts(buf, &s, 1); } void M_BufferWriteUInts(buf_t *buf, const unsigned int *uints, size_t count) { M_BufferEnsureCapacity(buf, count * sizeof(unsigned int)); M_BufferWriteChars(buf, (char *)uints, count * sizeof(unsigned int)); } void M_BufferWriteLong(buf_t *buf, int64_t l) { M_BufferWriteLongs(buf, &l, 1); } void M_BufferWriteLongs(buf_t *buf, const int64_t *longs, size_t count) { M_BufferEnsureCapacity(buf, count * sizeof(int64_t)); M_BufferWriteChars(buf, (char *)longs, count * sizeof(int64_t)); } void M_BufferWriteULong(buf_t *buf, uint64_t l) { M_BufferWriteULongs(buf, &l, 1); } void M_BufferWriteULongs(buf_t *buf, const uint64_t *ulongs, size_t count) { M_BufferEnsureCapacity(buf, count * sizeof(int64_t)); M_BufferWriteChars(buf, (char *)ulongs, count * sizeof(uint64_t)); } void M_BufferWriteFloat(buf_t *buf, float f) { M_BufferWriteFloats(buf, &f, 1); } void M_BufferWriteFloats(buf_t *buf, const float *floats, size_t count) { M_BufferEnsureCapacity(buf, count * sizeof(float)); M_BufferWriteChars(buf, (char *)floats, count * sizeof(floats)); } void M_BufferWriteDouble(buf_t *buf, double d) { M_BufferWriteDoubles(buf, &d, 1); } void M_BufferWriteDoubles(buf_t *buf, const double *doubles, size_t count) { M_BufferEnsureCapacity(buf, count * sizeof(double)); M_BufferWriteChars(buf, (char *)doubles, count * sizeof(doubles)); } void M_BufferWriteString(buf_t *buf, const char *string, size_t length) { M_BufferEnsureCapacity(buf, length + 1); strncpy(buf->data + buf->cursor, string, length + 1); buf->cursor += (length + 1); check_cursor(buf); } void M_BufferWriteZeros(buf_t *buf, size_t count) { M_BufferEnsureCapacity(buf, count); for (size_t i = 0; i < count; i++) buf->data[buf->cursor++] = 0; check_cursor(buf); } bool M_BufferEqualsString(buf_t *buf, const char *s) { if (strncmp(buf->data + buf->cursor, s, buf->size - buf->cursor) == 0) return true; return false; } bool M_BufferEqualsData(buf_t *buf, const void *d, size_t size) { if (buf->cursor + size > buf->size) return false; if (memcmp(buf->data + buf->cursor, d, size) == 0) return true; return false; } bool M_BufferRead(buf_t *buf, void *data, size_t size) { if (buf->cursor + size > buf->size) return false; if (size == 1) *((char *)data) = *(buf->data + buf->cursor); else memcpy(data, buf->data + buf->cursor, size); buf->cursor += size; return true; } bool M_BufferReadBool(buf_t *buf, bool *b) { return M_BufferReadBools(buf, b, 1); } bool M_BufferReadBools(buf_t *buf, bool *b, size_t count) { return M_BufferRead(buf, b, count * sizeof(bool)); } bool M_BufferReadChar(buf_t *buf, char *c) { return M_BufferReadChars(buf, c, 1); } bool M_BufferReadChars(buf_t *buf, char *c, size_t count) { return M_BufferRead(buf, c, count * sizeof(char)); } bool M_BufferReadUChar(buf_t *buf, unsigned char *c) { return M_BufferReadUChars(buf, c, 1); } bool M_BufferReadUChars(buf_t *buf, unsigned char *c, size_t count) { return M_BufferRead(buf, c, count * sizeof(unsigned char)); } bool M_BufferReadShort(buf_t *buf, short *s) { return M_BufferReadShorts(buf, s, 1); } bool M_BufferReadShorts(buf_t *buf, short *s, size_t count) { return M_BufferRead(buf, s, count * sizeof(short)); } bool M_BufferReadUShort(buf_t *buf, unsigned short *s) { return M_BufferReadUShorts(buf, s, 1); } bool M_BufferReadUShorts(buf_t *buf, unsigned short *s, size_t count) { return M_BufferRead(buf, s, count * sizeof(unsigned short)); } bool M_BufferReadInt(buf_t *buf, int *i) { return M_BufferReadInts(buf, i, 1); } bool M_BufferReadInts(buf_t *buf, int *i, size_t count) { return M_BufferRead(buf, i, count * sizeof(int)); } bool M_BufferReadUInt(buf_t *buf, unsigned int *i) { return M_BufferReadUInts(buf, i, 1); } bool M_BufferReadUInts(buf_t *buf, unsigned int *i, size_t count) { return M_BufferRead(buf, i, count * sizeof(unsigned int)); } bool M_BufferReadLong(buf_t *buf, int64_t *l) { return M_BufferReadLongs(buf, l, 1); } bool M_BufferReadLongs(buf_t *buf, int64_t *l, size_t count) { return M_BufferRead(buf, l, count * sizeof(int64_t)); } bool M_BufferReadULong(buf_t *buf, uint64_t *l) { return M_BufferReadULongs(buf, l, 1); } bool M_BufferReadULongs(buf_t *buf, uint64_t *l, size_t count) { return M_BufferRead(buf, l, count * sizeof(uint64_t)); } bool M_BufferReadFloat(buf_t *buf, float *f) { return M_BufferReadFloats(buf, f, 1); } bool M_BufferReadFloats(buf_t *buf, float *f, size_t count) { return M_BufferRead(buf, f, count * sizeof(float)); } bool M_BufferReadDouble(buf_t *buf, double *d) { return M_BufferReadDoubles(buf, d, 1); } bool M_BufferReadDoubles(buf_t *buf, double *d, size_t count) { return M_BufferRead(buf, d, count * sizeof(double)); } bool M_BufferReadString(buf_t *buf, char *s, size_t length) { return M_BufferRead(buf, s, length); } bool M_BufferReadStringDup(buf_t *buf, char **s) { char *d = buf->data + buf->cursor; size_t length = strlen(d); if (buf->cursor + length > buf->size) return false; (*s) = strdup(buf->data + buf->cursor); return true; } bool M_BufferCopyString(buf_t *dst, buf_t *src) { char *s = src->data + src->cursor; size_t length = strlen(s); if (src->cursor + length >= src->size) return false; M_BufferWriteString(dst, s, length); return true; } void M_BufferCompact(buf_t *buf) { if (buf->size < buf->capacity) { char *new_buf = calloc(buf->size, sizeof(uint8_t)); if (buf->data == NULL) error_and_exit("M_BufferCompact: Allocating new buffer data failed"); memcpy(new_buf, buf->data, buf->size); free(buf->data); buf->data = new_buf; buf->capacity = buf->size; if (buf->cursor > buf->size) buf->cursor = buf->size; } } void M_BufferTruncate(buf_t *buf, size_t new_size) { size_t old_size = buf->size; if (new_size >= buf->size) errorf_and_exit("M_BufferTruncate: %zu >= %zu.", new_size, buf->size); memset(buf->data + new_size, 0, old_size - new_size); buf->size = new_size; if (buf->cursor >= buf->size) buf->cursor = buf->size - 1; } void M_BufferZero(buf_t *buf) { memset(buf->data, 0, buf->capacity); } void M_BufferClear(buf_t *buf) { buf->size = 0; buf->cursor = 0; M_BufferZero(buf); } void M_BufferFree(buf_t *buf) { free(buf->data); memset(buf, 0, sizeof(buf_t)); buf->data = NULL; } void M_BufferPrint(buf_t *buf) { printf("Buffer capacity, size and cursor: [%zu, %zu, %zu].\n", buf->capacity, buf->size, buf->cursor ); for (size_t i = 0; i < MIN(64, buf->size); i++) { printf("%02X ", (unsigned char)buf->data[i]); if ((i > 0) && (((i + 1) % 25) == 0)) printf("\n"); } printf("\n"); } void M_BufferPrintAll(buf_t *buf) { printf("Buffer capacity, size and cursor: [%zu, %zu, %zu].\n", buf->capacity, buf->size, buf->cursor ); for (size_t i = 0; i < buf->size; i++) { printf("%02X ", (unsigned char)buf->data[i]); if ((i > 0) && (((i + 1) % 25) == 0)) printf("\n"); } printf("\n"); } /* vi: set et ts=2 sw=2: */ MoarVM-2018.03/3rdparty/cmp/test/buf.h0000644000175000017510000001317513252357721017454 0ustar samanthasamantha/* The MIT License (MIT) Copyright (c) 2017 Charles Gunyon Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef M_BUF_H__ #define M_BUF_H__ typedef struct buf_s { size_t capacity; size_t size; size_t cursor; char *data; } buf_t; buf_t* M_BufferNew(void); buf_t* M_BufferNewWithCapacity(size_t capacity); void M_BufferInit(buf_t *buf); void M_BufferInitWithCapacity(buf_t *buf, size_t capacity); size_t M_BufferGetCapacity(buf_t *buf); size_t M_BufferGetSize(buf_t *buf); size_t M_BufferGetCursor(buf_t *buf); char* M_BufferGetData(buf_t *buf); char* M_BufferGetDataAtCursor(buf_t *buf); void M_BufferEnsureCapacity(buf_t *buf, size_t capacity); void M_BufferEnsureTotalCapacity(buf_t *buf, size_t capacity); void M_BufferCopy(buf_t *dst, buf_t *src); void M_BufferCursorCopy(buf_t *dst, buf_t *src); bool M_BufferMove(buf_t *buf, size_t dpos, size_t spos, size_t count); void M_BufferSetData(buf_t *buf, const void *data, size_t size); void M_BufferSetString(buf_t *buf, const char *data, size_t length); bool M_BufferSetFile(buf_t *buf, const char *filename); bool M_BufferSeek(buf_t *buf, size_t pos); bool M_BufferSeekBackward(buf_t *buf, size_t count); bool M_BufferSeekForward(buf_t *buf, size_t count); uint8_t M_BufferPeek(buf_t *buf); void M_BufferWrite(buf_t *buf, const void *data, size_t size); void M_BufferWriteBool(buf_t *buf, bool b); void M_BufferWriteBools(buf_t *buf, const bool *bools, size_t count); void M_BufferWriteChar(buf_t *buf, char c); void M_BufferWriteChars(buf_t *buf, const char *chars, size_t count); void M_BufferWriteUChar(buf_t *buf, unsigned char c); void M_BufferWriteUChars(buf_t *buf, const unsigned char *uchars, size_t count); void M_BufferWriteShort(buf_t *buf, short s); void M_BufferWriteShorts(buf_t *buf, const short *shorts, size_t count); void M_BufferWriteUShort(buf_t *buf, unsigned short s); void M_BufferWriteUShorts(buf_t *buf, const unsigned short *ushorts, size_t count); void M_BufferWriteInt(buf_t *buf, int i); void M_BufferWriteInts(buf_t *buf, const int *ints, size_t count); void M_BufferWriteUInt(buf_t *buf, unsigned int i); void M_BufferWriteUInts(buf_t *buf, const unsigned int *ints, size_t count); void M_BufferWriteLong(buf_t *buf, int64_t l); void M_BufferWriteLongs(buf_t *buf, const int64_t *longs, size_t count); void M_BufferWriteULong(buf_t *buf, uint64_t l); void M_BufferWriteULongs(buf_t *buf, const uint64_t *longs, size_t count); void M_BufferWriteFloat(buf_t *buf, float f); void M_BufferWriteFloats(buf_t *buf, const float *floats, size_t count); void M_BufferWriteDouble(buf_t *buf, double d); void M_BufferWriteDoubles(buf_t *buf, const double *doubles, size_t count); void M_BufferWriteString(buf_t *buf, const char *string, size_t length); void M_BufferWriteZeros(buf_t *buf, size_t count); bool M_BufferEqualsString(buf_t *buf, const char *s); bool M_BufferEqualsData(buf_t *buf, const void *d, size_t size); bool M_BufferRead(buf_t *buf, void *data, size_t size); bool M_BufferReadBool(buf_t *buf, bool *b); bool M_BufferReadBools(buf_t *buf, bool *b, size_t count); bool M_BufferReadChar(buf_t *buf, char *c); bool M_BufferReadChars(buf_t *buf, char *c, size_t count); bool M_BufferReadUChar(buf_t *buf, unsigned char *c); bool M_BufferReadUChars(buf_t *buf, unsigned char *c, size_t count); bool M_BufferReadShort(buf_t *buf, short *s); bool M_BufferReadShorts(buf_t *buf, short *shorts, size_t count); bool M_BufferReadUShort(buf_t *buf, unsigned short *s); bool M_BufferReadUShorts(buf_t *buf, unsigned short *s, size_t count); bool M_BufferReadInt(buf_t *buf, int *i); bool M_BufferReadInts(buf_t *buf, int *i, size_t count); bool M_BufferReadUInt(buf_t *buf, unsigned int *i); bool M_BufferReadUInts(buf_t *buf, unsigned int *i, size_t count); bool M_BufferReadLong(buf_t *buf, int64_t *l); bool M_BufferReadLongs(buf_t *buf, int64_t *l, size_t count); bool M_BufferReadULong(buf_t *buf, uint64_t *l); bool M_BufferReadULongs(buf_t *buf, uint64_t *l, size_t count); bool M_BufferReadFloat(buf_t *buf, float *f); bool M_BufferReadFloats(buf_t *buf, float *f, size_t count); bool M_BufferReadDouble(buf_t *buf, double *d); bool M_BufferReadDoubles(buf_t *buf, double *d, size_t count); bool M_BufferReadString(buf_t *buf, char *s, size_t length); bool M_BufferReadStringDup(buf_t *buf, char **s); bool M_BufferCopyString(buf_t *dst, buf_t *src); void M_BufferCompact(buf_t *buf); void M_BufferTruncate(buf_t *buf, size_t new_size); void M_BufferZero(buf_t *buf); void M_BufferClear(buf_t *buf); void M_BufferFree(buf_t *buf); void M_BufferPrint(buf_t *buf); void M_BufferPrintAll(buf_t *buf); #endif /* vi: set et ts=2 sw=2: */ MoarVM-2018.03/3rdparty/cmp/test/cases.mpac0000644000175000017510000000032513252357721020460 0ustar samanthasamanthaÂÃÀÌÍÎÏÐÑÒÓÿÐÿÑÿÿÒÿÿÿÿÓÿÿÿÿÿÿÿÿÌÍÿÎÿÿÏÿÿÿÿàÐàÑÿ€Òÿÿ€Óÿÿÿÿ€ËË€Ë?ðË¿ð¡aÚaÛa ÚÛ‘ÜÝÜÝ€Þß¡aaÞ¡aaß¡aa‘‘‘¡aMoarVM-2018.03/3rdparty/cmp/test/test.c0000644000175000017510000046640513252357721017662 0ustar samanthasamantha/* The MIT License (MIT) Copyright (c) 2017 Charles Gunyon Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include #include #include #include #include #include #include #include "buf.h" #include "cmp.h" static int reader_successes = -1; static int writer_successes = -1; static int skipper_successes = -1; #define assert_float_equal(f1, f2) \ assert_memory_equal(&(f1), &(f2), sizeof(float)) #define assert_double_equal(d1, d2) \ assert_memory_equal(&(d1), &(d2), sizeof(double)) #define test_format(wfunc, rfunc, otype, ctype, in, fmt, dlen) do { \ M_BufferClear(&buf); \ assert_true(wfunc(&cmp, in)); \ M_BufferSeek(&buf, 0); \ assert_memory_equal(buf.data, fmt, dlen); \ M_BufferSeek(&buf, 0); \ assert_true(cmp_read_object(&cmp, &obj)); \ assert_true(obj.as.otype == in); \ M_BufferSeek(&buf, 0); \ do { \ ctype value; \ assert_true(rfunc(&cmp, (ctype *)&value)); \ assert_true(in == value); \ } while (0); \ } while (0) #define test_format_with_length(wfunc, rfunc, otype, in, len, fmt, dlen) \ M_BufferClear(&buf); \ assert_true(wfunc(&cmp, in, len)); \ M_BufferSeek(&buf, 0); \ assert_memory_equal(buf.data, fmt, dlen); \ M_BufferSeek(&buf, 0); \ assert_true(cmp_read_object(&cmp, &obj)); \ assert_true(obj.as.otype == len); \ M_BufferSeek(&buf, 0); \ do { \ char ldata[len + 1]; \ uint32_t data_length = len + 1; \ memset(ldata, 0, sizeof(ldata)); \ assert_true(rfunc(&cmp, ldata, &data_length)); \ assert_int_equal(data_length, len); \ assert_memory_equal(ldata, in, len); \ } while (0); #define test_int_format(wfunc, rfunc, otype, ctype, in, fmt, len) do { \ ctype value; \ M_BufferSeek(&buf, 0); \ assert_true(wfunc(&cmp, in)); \ assert_memory_equal(buf.data, fmt, len); \ M_BufferSeek(&buf, 0); \ assert_true(cmp_read_object(&cmp, &obj)); \ assert_int_equal(obj.as.otype, in); \ M_BufferSeek(&buf, 0); \ assert_true(rfunc(&cmp, &value)); \ assert_int_equal(in, value); \ } while (0) #define test_float_format(wfunc, rfunc, otype, ctype, in, fmt, len) do { \ ctype value; \ M_BufferSeek(&buf, 0); \ assert_true(wfunc(&cmp, in)); \ assert_memory_equal(buf.data, fmt, len); \ M_BufferSeek(&buf, 0); \ assert_true(cmp_read_object(&cmp, &obj)); \ assert_true(in == obj.as.otype); \ M_BufferSeek(&buf, 0); \ assert_true(rfunc(&cmp, &value)); \ assert_true(in == value); \ } while (0) #define test_double_format(wfunc, rfunc, otype, ctype, in, fmt, len) do { \ ctype value; \ M_BufferSeek(&buf, 0); \ assert_true(wfunc(&cmp, in)); \ assert_memory_equal(buf.data, fmt, len); \ M_BufferSeek(&buf, 0); \ assert_true(cmp_read_object(&cmp, &obj)); \ assert_true(in == obj.as.otype); \ M_BufferSeek(&buf, 0); \ assert_true(rfunc(&cmp, &value)); \ assert_true(in == value); \ } while (0) #define test_format_no_input(wfunc, otype, fmt, dlen, out) do { \ M_BufferClear(&buf); \ assert_true(wfunc(&cmp)); \ M_BufferSeek(&buf, 0); \ assert_memory_equal(buf.data, fmt, dlen); \ M_BufferSeek(&buf, 0); \ assert_true(cmp_read_object(&cmp, &obj)); \ assert_int_equal(obj.as.otype, out); \ } while (0) #define obj_write(func, val) \ M_BufferSeek(&buf, 0); \ func(&cmp, val); \ M_BufferSeek(&buf, 0); \ cmp_read_object(&cmp, &obj); #define obj_write_no_val(func) \ M_BufferSeek(&buf, 0); \ func(&cmp); \ M_BufferSeek(&buf, 0); \ cmp_read_object(&cmp, &obj); #define obj_write_len(func, val, len) \ M_BufferSeek(&buf, 0); \ func(&cmp, val, len); \ M_BufferSeek(&buf, 0); \ cmp_read_object(&cmp, &obj); #define obj_test(func, as_func, type, ctype, val) do { \ ctype var; \ assert_true(func(&obj)); \ assert_true(as_func(&obj, &var)); \ assert_true(var == val); \ } while (0); #define obj_str_test(val) do { \ uint32_t length; \ assert_true(cmp_object_is_str(&obj)); \ assert_true(cmp_object_as_str(&obj, &length)); \ assert_string_equal(M_BufferGetDataAtCursor(&buf), val); \ } while (0); #define obj_to_str_test(val) do { \ uint32_t length; \ char data[255]; \ assert_true(cmp_object_is_str(&obj)); \ assert_true(cmp_object_as_str(&obj, &length)); \ assert_true(cmp_object_to_str(&cmp, &obj, data, 255)); \ assert_string_equal(data, val); \ } while (0); #define obj_bin_test(val, inlength) do { \ uint32_t length; \ assert_true(cmp_object_is_bin(&obj)); \ assert_true(cmp_object_as_bin(&obj, &length)); \ assert_int_equal(length, inlength); \ assert_memory_equal(M_BufferGetDataAtCursor(&buf), val, inlength); \ } while (0); #define obj_to_bin_test(val, inlength) do { \ uint32_t length; \ unsigned char data[255]; \ assert_true(cmp_object_is_bin(&obj)); \ assert_true(cmp_object_as_bin(&obj, &length)); \ assert_int_equal(length, inlength); \ assert_true(cmp_object_to_bin(&cmp, &obj, data, 255)); \ assert_memory_equal(data, val, length); \ } while (0); #define obj_array_test(val1, val2) do { \ uint32_t length; \ uint64_t var1; \ uint64_t var2; \ assert_true(cmp_object_is_array(&obj)); \ assert_true(cmp_object_as_array(&obj, &length)); \ assert_int_equal(length, 2); \ assert_true(cmp_read_uinteger(&cmp, &var1)); \ assert_true(cmp_read_uinteger(&cmp, &var2)); \ assert_true(var1 == val1); \ assert_true(var2 == val2); \ } while (0); #define obj_map_test(inkey, invalue) do { \ uint32_t length; \ uint64_t key; \ uint64_t value; \ assert_true(cmp_object_is_map(&obj)); \ assert_true(cmp_object_as_map(&obj, &length)); \ assert_int_equal(length, 1); \ assert_true(cmp_read_uinteger(&cmp, &key)); \ assert_true(cmp_read_uinteger(&cmp, &value)); \ assert_true(key == inkey); \ assert_true(value == invalue); \ } while (0); #define obj_ext_test(func, as_func, type, ctype, inkey, invalue) \ do { \ uint32_t length; \ uint32_t key; \ uint32_t value; \ assert_true(cmp_object_is_map(&obj)); \ assert_true(cmp_object_as_map(&obj, &length)); \ assert_int_equal(length, 1); \ assert_true(cmp_read_uinteger(&cmp, &key)); \ assert_true(cmp_read_uinteger(&cmp, &value)); \ assert_true(key == inkey); \ assert_true(value == invalue); \ } while (0); #define obj_test_no_read(func, type) \ assert_true(func(&obj)); #define obj_test_not(func, type) \ assert_false(func(&obj)); #define test_fixext_format(wfunc, etype, esize, in, fmt, dlen) \ M_BufferClear(&buf); \ assert_true(wfunc(&cmp, etype, in)); \ M_BufferSeek(&buf, 0); \ assert_memory_equal(buf.data, fmt, dlen); \ M_BufferSeek(&buf, 0); \ assert_true(cmp_read_object(&cmp, &obj)); \ assert_true(obj.as.ext.type == etype); \ assert_true(obj.as.ext.size == esize); \ M_BufferSeek(&buf, 0); \ do { \ char edata[esize]; \ int8_t dummy_type = etype; \ uint32_t dummy_size = esize; \ memset(edata, 0, sizeof(edata)); \ assert_true(cmp_read_ext(&cmp, &dummy_type, &dummy_size, edata)); \ assert_true(dummy_type == etype); \ assert_true(dummy_size == esize); \ assert_memory_equal(edata, in, esize); \ } while (0) #define test_ext_format(wfunc, etype, esize, in, fmt, dlen) \ M_BufferClear(&buf); \ assert_true(wfunc(&cmp, etype, esize, in)); \ M_BufferSeek(&buf, 0); \ assert_memory_equal(buf.data, fmt, dlen); \ M_BufferSeek(&buf, 0); \ assert_true(cmp_read_object(&cmp, &obj)); \ assert_int_equal(obj.as.ext.type, etype); \ assert_int_equal(obj.as.ext.size, esize); \ M_BufferSeek(&buf, 0); \ do { \ char edata[esize]; \ int8_t dummy_type = 0; \ uint32_t dummy_size = 0; \ assert_true(cmp_read_ext(&cmp, &dummy_type, &dummy_size, edata)); \ assert_int_equal(dummy_type, etype); \ assert_int_equal(dummy_size, esize); \ assert_memory_equal(edata, in, esize); \ } while (0) static bool buf_reader(cmp_ctx_t *ctx, void *data, size_t limit) { if (!reader_successes) { return false; } if (reader_successes > 0) { reader_successes--; } buf_t *buf = (buf_t *)ctx->buf; return M_BufferRead(buf, data, limit); } static size_t buf_writer(cmp_ctx_t *ctx, const void *data, size_t sz) { if (!writer_successes) { return false; } if (writer_successes > 0) { writer_successes--; } buf_t *buf = (buf_t *)ctx->buf; size_t pos = M_BufferGetCursor(buf); M_BufferWrite(buf, (void *)data, sz); return M_BufferGetCursor(buf) - pos; } static bool buf_skipper(cmp_ctx_t *ctx, size_t count) { if (!skipper_successes) { return false; } if (skipper_successes > 0) { skipper_successes--; } buf_t *buf = (buf_t *)ctx->buf; return M_BufferSeekForward(buf, count); } static void setup_cmp_and_buf(cmp_ctx_t *cmp, buf_t *buf) { reader_successes = -1; writer_successes = -1; skipper_successes = -1; M_BufferInitWithCapacity(buf, 32); cmp_init(cmp, buf, buf_reader, buf_skipper, buf_writer); } static void teardown_cmp_and_buf(cmp_ctx_t *cmp, buf_t *buf) { reader_successes = -1; writer_successes = -1; skipper_successes = -1; M_BufferFree(buf); cmp->error = 0; cmp->buf = NULL; cmp->read = NULL; cmp->skip = NULL; cmp->write = NULL; } static void test_msgpack(void **state) { buf_t in_buf; buf_t out_buf; cmp_ctx_t in_cmp; cmp_ctx_t out_cmp; cmp_object_t obj; (void)state; setup_cmp_and_buf(&in_cmp, &in_buf); M_BufferSetFile(&in_buf, "cases.mpac"); M_BufferSeek(&in_buf, 0); setup_cmp_and_buf(&out_cmp, &out_buf); M_BufferEnsureCapacity(&out_buf, M_BufferGetSize(&in_buf)); while (M_BufferGetCursor(&in_buf) < (M_BufferGetSize(&in_buf))) { assert_true(cmp_read_object(&in_cmp, &obj)); assert_true(cmp_write_object(&out_cmp, &obj)); } assert_memory_equal(in_buf.data, out_buf.data, out_buf.size); teardown_cmp_and_buf(&in_cmp, &in_buf); teardown_cmp_and_buf(&out_cmp, &out_buf); } static void test_fixedint(void **state) { buf_t buf; cmp_ctx_t cmp; cmp_object_t obj; (void)state; setup_cmp_and_buf(&cmp, &buf); assert_false(cmp_write_pfix(&cmp, 128)); cmp.error = 0; assert_false(cmp_write_pfix(&cmp, 200)); cmp.error = 0; assert_false(cmp_write_pfix(&cmp, -1)); cmp.error = 0; assert_false(cmp_write_pfix(&cmp, -31)); cmp.error = 0; assert_false(cmp_write_pfix(&cmp, -32)); cmp.error = 0; assert_false(cmp_write_pfix(&cmp, -127)); cmp.error = 0; assert_false(cmp_write_pfix(&cmp, -128)); cmp.error = 0; assert_false(cmp_write_ufix(&cmp, -128)); cmp.error = 0; assert_false(cmp_write_ufix(&cmp, -1)); cmp.error = 0; assert_false(cmp_write_ufix(&cmp, -128)); cmp.error = 0; assert_false(cmp_write_sfix(&cmp, -33)); cmp.error = 0; assert_false(cmp_write_nfix(&cmp, 0)); cmp.error = 0; assert_false(cmp_write_nfix(&cmp, 1)); cmp.error = 0; assert_false(cmp_write_nfix(&cmp, -33)); cmp.error = 0; test_int_format( cmp_write_ufix, cmp_read_uinteger, u8, uint64_t, 0, "\x00", 1 ); test_int_format( cmp_write_ufix, cmp_read_uinteger, u8, uint64_t, -0, "\x00", 1 ); test_int_format( cmp_write_sfix, cmp_read_uinteger, u8, uint64_t, 0, "\x00", 1 ); test_int_format( cmp_write_sfix, cmp_read_sinteger, s8, int64_t, -0, "\x00", 1 ); test_int_format( cmp_write_sfix, cmp_read_uinteger, u8, uint64_t, 127, "\x7f", 1 ); test_int_format( cmp_write_sfix, cmp_read_sinteger, s8, int64_t, -32, "\xe0", 1 ); test_int_format( cmp_write_pfix, cmp_read_uinteger, u8, uint64_t, 0, "\x00", 1 ); test_int_format( cmp_write_pfix, cmp_read_uinteger, u8, uint64_t, 1, "\x01", 1 ); test_int_format( cmp_write_pfix, cmp_read_uinteger, u8, uint64_t, 127, "\x7f", 1 ); test_int_format( cmp_write_nfix, cmp_read_sinteger, s8, int64_t, -1, "\xff", 1 ); test_int_format( cmp_write_nfix, cmp_read_sinteger, s8, int64_t, -32, "\xe0", 1 ); teardown_cmp_and_buf(&cmp, &buf); } static void test_numbers(void **state) { buf_t buf; cmp_ctx_t cmp; cmp_object_t obj; uint8_t u8; uint16_t u16; uint32_t u32; uint64_t u64; int8_t s8; int16_t s16; int32_t s32; int64_t s64; float f; double d; (void)state; setup_cmp_and_buf(&cmp, &buf); test_int_format( cmp_write_s8, cmp_read_sinteger, s8, int64_t, 0, "\xd0\x00", 2 ); test_int_format( cmp_write_s8, cmp_read_sinteger, s8, int64_t, 1, "\xd0\x01", 2 ); test_int_format( cmp_write_s8, cmp_read_sinteger, s8, int64_t, -1, "\xd0\xff", 2 ); test_int_format( cmp_write_s8, cmp_read_sinteger, s8, int64_t, 127, "\xd0\x7f", 2 ); test_int_format( cmp_write_s8, cmp_read_sinteger, s8, int64_t, -128, "\xd0\x80", 2 ); test_int_format( cmp_write_s16, cmp_read_sinteger, s16, int64_t, 0, "\xd1\x00\x00", 3 ); test_int_format( cmp_write_s16, cmp_read_sinteger, s16, int64_t, 1, "\xd1\x00\x01", 3 ); test_int_format( cmp_write_s16, cmp_read_sinteger, s16, int64_t, -1, "\xd1\xff\xff", 3 ); test_int_format( cmp_write_s16, cmp_read_sinteger, s16, int64_t, 127, "\xd1\x00\x7f", 3 ); test_int_format( cmp_write_s16, cmp_read_sinteger, s16, int64_t, -128, "\xd1\xff\x80", 3 ); test_int_format( cmp_write_s16, cmp_read_sinteger, s16, int64_t, 256, "\xd1\x01\x00", 3 ); test_int_format( cmp_write_s16, cmp_read_sinteger, s16, int64_t, 32767, "\xd1\x7f\xff", 3 ); test_int_format( cmp_write_s16, cmp_read_sinteger, s16, int64_t, -32768, "\xd1\x80\x00", 3 ); test_int_format( cmp_write_s32, cmp_read_sinteger, s32, int64_t, 0, "\xd2\x00\x00\x00\x00", 5 ); test_int_format( cmp_write_s32, cmp_read_sinteger, s32, int64_t, 1, "\xd2\x00\x00\x00\x01", 5 ); test_int_format( cmp_write_s32, cmp_read_sinteger, s32, int64_t, -1, "\xd2\xff\xff\xff\xff", 5 ); test_int_format( cmp_write_s32, cmp_read_sinteger, s32, int64_t, 127, "\xd2\x00\x00\x00\x7f", 5 ); test_int_format( cmp_write_s32, cmp_read_sinteger, s32, int64_t, -128, "\xd2\xff\xff\xff\x80", 5 ); test_int_format( cmp_write_s32, cmp_read_sinteger, s32, int64_t, 256, "\xd2\x00\x00\x01\x00", 5 ); test_int_format( cmp_write_s32, cmp_read_sinteger, s32, int64_t, 32767, "\xd2\x00\x00\x7f\xff", 5 ); test_int_format( cmp_write_s32, cmp_read_sinteger, s32, int64_t, -32768, "\xd2\xff\xff\x80\x00", 5 ); test_int_format( cmp_write_s32, cmp_read_sinteger, s32, int64_t, 65535, "\xd2\x00\x00\xff\xff", 5 ); test_int_format( cmp_write_s32, cmp_read_sinteger, s32, int64_t, -65536, "\xd2\xff\xff\x00\x00", 5 ); test_int_format( cmp_write_s32, cmp_read_sinteger, s32, int64_t, 8388607, "\xd2\x00\x7f\xff\xff", 5 ); test_int_format( cmp_write_s32, cmp_read_sinteger, s32, int64_t, -8388608, "\xd2\xff\x80\x00\x00", 5 ); test_int_format( cmp_write_s32, cmp_read_sinteger, s32, int64_t, 16777215, "\xd2\x00\xff\xff\xff", 5 ); test_int_format( cmp_write_s32, cmp_read_sinteger, s32, int64_t, -16777216, "\xd2\xff\x00\x00\x00", 5 ); test_int_format( cmp_write_s32, cmp_read_sinteger, s32, int64_t, 2147483647, "\xd2\x7f\xff\xff\xff", 5 ); test_int_format( cmp_write_s32, cmp_read_sinteger, s32, int64_t, -2147483648, "\xd2\x80\x00\x00\x00", 5 ); test_int_format( cmp_write_s64, cmp_read_sinteger, s64, int64_t, 0, "\xd3\x00\x00\x00\x00\x00\x00\x00\x00", 9 ); test_int_format( cmp_write_s64, cmp_read_sinteger, s64, int64_t, 1, "\xd3\x00\x00\x00\x00\x00\x00\x00\x01", 9 ); test_int_format( cmp_write_s64, cmp_read_sinteger, s64, int64_t, -1, "\xd3\xff\xff\xff\xff\xff\xff\xff\xff", 9 ); test_int_format( cmp_write_s64, cmp_read_sinteger, s64, int64_t, 127, "\xd3\x00\x00\x00\x00\x00\x00\x00\x7f", 9 ); test_int_format( cmp_write_s64, cmp_read_sinteger, s64, int64_t, -128, "\xd3\xff\xff\xff\xff\xff\xff\xff\x80", 9 ); test_int_format( cmp_write_s64, cmp_read_sinteger, s64, int64_t, 256, "\xd3\x00\x00\x00\x00\x00\x00\x01\x00", 9 ); test_int_format( cmp_write_s64, cmp_read_sinteger, s64, int64_t, 32767, "\xd3\x00\x00\x00\x00\x00\x00\x7f\xff", 9 ); test_int_format( cmp_write_s64, cmp_read_sinteger, s64, int64_t, -32768, "\xd3\xff\xff\xff\xff\xff\xff\x80\x00", 9 ); test_int_format( cmp_write_s64, cmp_read_sinteger, s64, int64_t, 65535, "\xd3\x00\x00\x00\x00\x00\x00\xff\xff", 9 ); test_int_format( cmp_write_s64, cmp_read_sinteger, s64, int64_t, -65536, "\xd3\xff\xff\xff\xff\xff\xff\x00\x00", 9 ); test_int_format( cmp_write_s64, cmp_read_sinteger, s64, int64_t, 8388607, "\xd3\x00\x00\x00\x00\x00\x7f\xff\xff", 9 ); test_int_format( cmp_write_s64, cmp_read_sinteger, s64, int64_t, -8388608, "\xd3\xff\xff\xff\xff\xff\x80\x00\x00", 9 ); test_int_format( cmp_write_s64, cmp_read_sinteger, s64, int64_t, 16777215, "\xd3\x00\x00\x00\x00\x00\xff\xff\xff", 9 ); test_int_format( cmp_write_s64, cmp_read_sinteger, s64, int64_t, -16777216, "\xd3\xff\xff\xff\xff\xff\x00\x00\x00", 9 ); test_int_format( cmp_write_s64, cmp_read_sinteger, s64, int64_t, 2147483647, "\xd3\x00\x00\x00\x00\x7f\xff\xff\xff", 9 ); test_int_format( cmp_write_s64, cmp_read_sinteger, s64, int64_t, -2147483648, "\xd3\xff\xff\xff\xff\x80\x00\x00\x00", 9 ); test_int_format( cmp_write_s64, cmp_read_sinteger, s64, int64_t, 4294967295, "\xd3\x00\x00\x00\x00\xff\xff\xff\xff", 9 ); test_int_format( cmp_write_s64, cmp_read_sinteger, s64, int64_t, -4294967296, "\xd3\xff\xff\xff\xff\x00\x00\x00\x00", 9 ); test_int_format( cmp_write_sint, cmp_read_uinteger, u8, uint64_t, 0, "\x00", 1 ); test_int_format( cmp_write_sint, cmp_read_uinteger, u8, uint64_t, 1, "\x01", 1 ); test_int_format( cmp_write_sint, cmp_read_uinteger, u8, uint64_t, 127, "\x7f", 1 ); test_int_format( cmp_write_sint, cmp_read_uinteger, u8, uint64_t, 128, "\xcc\x80", 2 ); test_int_format( cmp_write_sint, cmp_read_uinteger, u8, uint64_t, 255, "\xcc\xff", 2 ); test_int_format( cmp_write_sint, cmp_read_uinteger, u16, uint64_t, 256, "\xcd\x01\x00", 3 ); test_int_format( cmp_write_sint, cmp_read_uinteger, u16, uint64_t, 32767, "\xcd\x7f\xff", 3 ); test_int_format( cmp_write_sint, cmp_read_uinteger, u16, uint64_t, 32768, "\xcd\x80\x00", 3 ); test_int_format( cmp_write_sint, cmp_read_uinteger, u16, uint64_t, 65535, "\xcd\xff\xff", 3 ); test_int_format( cmp_write_sint, cmp_read_uinteger, u32, uint64_t, 65536, "\xce\x00\x01\x00\x00", 5 ); test_int_format( cmp_write_sint, cmp_read_uinteger, u32, uint64_t, 8388607, "\xce\x00\x7f\xff\xff", 5 ); test_int_format( cmp_write_sint, cmp_read_uinteger, u32, uint64_t, 8388608, "\xce\x00\x80\x00\x00", 5 ); test_int_format( cmp_write_sint, cmp_read_uinteger, u32, uint64_t, 16777215, "\xce\x00\xff\xff\xff", 5 ); test_int_format( cmp_write_sint, cmp_read_uinteger, u32, uint64_t, 16777216, "\xce\x01\x00\x00\x00", 5 ); test_int_format( cmp_write_sint, cmp_read_uinteger, u32, uint64_t, 2147483647, "\xce\x7f\xff\xff\xff", 5 ); test_int_format( cmp_write_sint, cmp_read_uinteger, u64, uint64_t, 4294967296, "\xcf\x00\x00\x00\x01\x00\x00\x00\x00", 9 ); test_int_format( cmp_write_sint, cmp_read_uinteger, u64, uint64_t, 549755813887, "\xcf\x00\x00\x00\x7f\xff\xff\xff\xff", 9 ); test_int_format( cmp_write_sint, cmp_read_uinteger, u64, uint64_t, 549755813888, "\xcf\x00\x00\x00\x80\x00\x00\x00\x00", 9 ); test_int_format( cmp_write_sint, cmp_read_uinteger, u64, uint64_t, 1099511627775, "\xcf\x00\x00\x00\xff\xff\xff\xff\xff", 9 ); test_int_format( cmp_write_sint, cmp_read_uinteger, u64, uint64_t, 1099511627776, "\xcf\x00\x00\x01\x00\x00\x00\x00\x00", 9 ); test_int_format( cmp_write_sint, cmp_read_uinteger, u64, uint64_t, 140737488355327, "\xcf\x00\x00\x7f\xff\xff\xff\xff\xff", 9 ); test_int_format( cmp_write_sint, cmp_read_uinteger, u64, uint64_t, 140737488355328, "\xcf\x00\x00\x80\x00\x00\x00\x00\x00", 9 ); test_int_format( cmp_write_sint, cmp_read_uinteger, u64, uint64_t, 281474976710655, "\xcf\x00\x00\xff\xff\xff\xff\xff\xff", 9 ); test_int_format( cmp_write_sint, cmp_read_uinteger, u64, uint64_t, 281474976710656, "\xcf\x00\x01\x00\x00\x00\x00\x00\x00", 9 ); test_int_format( cmp_write_sint, cmp_read_uinteger, u64, uint64_t, 36028797018963967, "\xcf\x00\x7f\xff\xff\xff\xff\xff\xff", 9 ); test_int_format( cmp_write_sint, cmp_read_uinteger, u64, uint64_t, 36028797018963968, "\xcf\x00\x80\x00\x00\x00\x00\x00\x00", 9 ); test_int_format( cmp_write_sint, cmp_read_uinteger, u64, uint64_t, 72057594037927935, "\xcf\x00\xff\xff\xff\xff\xff\xff\xff", 9 ); test_int_format( cmp_write_sint, cmp_read_uinteger, u64, uint64_t, 72057594037927936, "\xcf\x01\x00\x00\x00\x00\x00\x00\x00", 9 ); test_int_format( cmp_write_sint, cmp_read_uinteger, u64, uint64_t, 9223372036854775807, "\xcf\x7f\xff\xff\xff\xff\xff\xff\xff", 9 ); test_int_format( cmp_write_sint, cmp_read_sinteger, s8, int64_t, -1, "\xff", 1 ); test_int_format( cmp_write_sint, cmp_read_sinteger, s8, int64_t, -32, "\xe0", 1 ); test_int_format( cmp_write_sint, cmp_read_sinteger, s8, int64_t, -127, "\xd0\x81", 2 ); test_int_format( cmp_write_sint, cmp_read_sinteger, s8, int64_t, -128, "\xd0\x80", 2 ); test_int_format( cmp_write_sint, cmp_read_sinteger, s16, int64_t, -255, "\xd1\xff\x01", 3 ); test_int_format( cmp_write_sint, cmp_read_sinteger, s16, int64_t, -256, "\xd1\xff\x00", 3 ); test_int_format( cmp_write_sint, cmp_read_sinteger, s16, int64_t, -32767, "\xd1\x80\x01", 3 ); test_int_format( cmp_write_sint, cmp_read_sinteger, s16, int64_t, -32768, "\xd1\x80\x00", 3 ); test_int_format( cmp_write_sint, cmp_read_sinteger, s32, int64_t, -65535, "\xd2\xff\xff\x00\x01", 5 ); test_int_format( cmp_write_sint, cmp_read_sinteger, s32, int64_t, -65536, "\xd2\xff\xff\x00\x00", 5 ); test_int_format( cmp_write_sint, cmp_read_sinteger, s32, int64_t, -8388607, "\xd2\xff\x80\x00\x01", 5 ); test_int_format( cmp_write_sint, cmp_read_sinteger, s32, int64_t, -8388608, "\xd2\xff\x80\x00\x00", 5 ); test_int_format( cmp_write_sint, cmp_read_sinteger, s32, int64_t, -16777215, "\xd2\xff\x00\x00\x01", 5 ); test_int_format( cmp_write_sint, cmp_read_sinteger, s32, int64_t, -16777216, "\xd2\xff\x00\x00\x00", 5 ); test_int_format( cmp_write_sint, cmp_read_sinteger, s32, int64_t, -2147483647, "\xd2\x80\x00\x00\x01", 5 ); test_int_format( cmp_write_sint, cmp_read_sinteger, s32, int64_t, -2147483648, "\xd2\x80\x00\x00\x00", 5 ); test_int_format( cmp_write_sint, cmp_read_sinteger, s64, int64_t, -4294967295, "\xd3\xff\xff\xff\xff\x00\x00\x00\x01", 9 ); test_int_format( cmp_write_sint, cmp_read_sinteger, s64, int64_t, -4294967296, "\xd3\xff\xff\xff\xff\x00\x00\x00\x00", 9 ); test_int_format( cmp_write_sint, cmp_read_sinteger, s64, int64_t, -549755813887, "\xd3\xff\xff\xff\x80\x00\x00\x00\x01", 9 ); test_int_format( cmp_write_sint, cmp_read_sinteger, s64, int64_t, -549755813888, "\xd3\xff\xff\xff\x80\x00\x00\x00\x00", 9 ); test_int_format( cmp_write_sint, cmp_read_sinteger, s64, int64_t, -1099511627775, "\xd3\xff\xff\xff\x00\x00\x00\x00\x01", 9 ); test_int_format( cmp_write_sint, cmp_read_sinteger, s64, int64_t, -1099511627776, "\xd3\xff\xff\xff\x00\x00\x00\x00\x00", 9 ); test_int_format( cmp_write_sint, cmp_read_sinteger, s64, int64_t, -140737488355327, "\xd3\xff\xff\x80\x00\x00\x00\x00\x01", 9 ); test_int_format( cmp_write_sint, cmp_read_sinteger, s64, int64_t, -140737488355328, "\xd3\xff\xff\x80\x00\x00\x00\x00\x00", 9 ); test_int_format( cmp_write_sint, cmp_read_sinteger, s64, int64_t, -281474976710655, "\xd3\xff\xff\x00\x00\x00\x00\x00\x01", 9 ); test_int_format( cmp_write_sint, cmp_read_sinteger, s64, int64_t, -281474976710656, "\xd3\xff\xff\x00\x00\x00\x00\x00\x00", 9 ); test_int_format( cmp_write_sint, cmp_read_sinteger, s64, int64_t, -36028797018963967, "\xd3\xff\x80\x00\x00\x00\x00\x00\x01", 9 ); test_int_format( cmp_write_sint, cmp_read_sinteger, s64, int64_t, -36028797018963968, "\xd3\xff\x80\x00\x00\x00\x00\x00\x00", 9 ); test_int_format( cmp_write_sint, cmp_read_sinteger, s64, int64_t, -72057594037927935, "\xd3\xff\x00\x00\x00\x00\x00\x00\x01", 9 ); test_int_format( cmp_write_sint, cmp_read_sinteger, s64, int64_t, -72057594037927936, "\xd3\xff\x00\x00\x00\x00\x00\x00\x00", 9 ); test_int_format( cmp_write_sint, cmp_read_sinteger, s64, int64_t, -9223372036854775807, "\xd3\x80\x00\x00\x00\x00\x00\x00\x01", 9 ); test_int_format(cmp_write_u8, cmp_read_uinteger, u8, uint64_t, 0, "\xcc\x00", 1); test_int_format(cmp_write_u8, cmp_read_uinteger, u8, uint64_t, 1, "\xcc\x01", 1); test_int_format( cmp_write_u8, cmp_read_uinteger, u8, uint64_t, 127, "\xcc\x7f", 1 ); test_int_format( cmp_write_u8, cmp_read_uinteger, u8, uint64_t, 255, "\xcc\xff", 1 ); test_int_format( cmp_write_u16, cmp_read_uinteger, u16, uint64_t, 0, "\xcd\x00\x00", 2 ); test_int_format( cmp_write_u16, cmp_read_uinteger, u16, uint64_t, 1, "\xcd\x00\x01", 2 ); test_int_format( cmp_write_u16, cmp_read_uinteger, u16, uint64_t, 127, "\xcd\x00\x7f", 2 ); test_int_format( cmp_write_u16, cmp_read_uinteger, u16, uint64_t, 256, "\xcd\x01\x00", 2 ); test_int_format( cmp_write_u16, cmp_read_uinteger, u16, uint64_t, 32767, "\xcd\x7f\xff", 2 ); test_int_format( cmp_write_u16, cmp_read_uinteger, u16, uint64_t, 65535, "\xcd\xff\xff", 2 ); test_int_format( cmp_write_u32, cmp_read_uinteger, u32, uint64_t, 0, "\xce\x00\x00\x00\x00", 5 ); test_int_format( cmp_write_u32, cmp_read_uinteger, u32, uint64_t, 1, "\xce\x00\x00\x00\x01", 5 ); test_int_format( cmp_write_u32, cmp_read_uinteger, u32, uint64_t, 127, "\xce\x00\x00\x00\x7f", 5 ); test_int_format( cmp_write_u32, cmp_read_uinteger, u32, uint64_t, 256, "\xce\x00\x00\x01\x00", 5 ); test_int_format( cmp_write_u32, cmp_read_uinteger, u32, uint64_t, 32767, "\xce\x00\x00\x7f\xff", 5 ); test_int_format( cmp_write_u32, cmp_read_uinteger, u32, uint64_t, 65535, "\xce\x00\x00\xff\xff", 5 ); test_int_format( cmp_write_u32, cmp_read_uinteger, u32, uint64_t, 8388607, "\xce\x00\x7f\xff\xff", 5 ); test_int_format( cmp_write_u32, cmp_read_uinteger, u32, uint64_t, 16777215, "\xce\x00\xff\xff\xff", 5 ); test_int_format( cmp_write_u32, cmp_read_uinteger, u32, uint64_t, 2147483647, "\xce\x7f\xff\xff\xff", 5 ); test_int_format( cmp_write_u32, cmp_read_uinteger, u32, uint64_t, 4294967295, "\xce\xff\xff\xff\xff", 5 ); test_int_format( cmp_write_u64, cmp_read_uinteger, u64, uint64_t, 0, "\xcf\x00\x00\x00\x00\x00\x00\x00\x00", 9 ); test_int_format( cmp_write_u64, cmp_read_uinteger, u64, uint64_t, 1, "\xcf\x00\x00\x00\x00\x00\x00\x00\x01", 9 ); test_int_format( cmp_write_u64, cmp_read_uinteger, u64, uint64_t, 127, "\xcf\x00\x00\x00\x00\x00\x00\x00\x7f", 9 ); test_int_format( cmp_write_u64, cmp_read_uinteger, u64, uint64_t, 256, "\xcf\x00\x00\x00\x00\x00\x00\x01\x00", 9 ); test_int_format( cmp_write_u64, cmp_read_uinteger, u64, uint64_t, 32767, "\xcf\x00\x00\x00\x00\x00\x00\x7f\xff", 9 ); test_int_format( cmp_write_u64, cmp_read_uinteger, u64, uint64_t, 65535, "\xcf\x00\x00\x00\x00\x00\x00\xff\xff", 9 ); test_int_format( cmp_write_u64, cmp_read_uinteger, u64, uint64_t, 8388607, "\xcf\x00\x00\x00\x00\x00\x7f\xff\xff", 9 ); test_int_format( cmp_write_u64, cmp_read_uinteger, u64, uint64_t, 16777215, "\xcf\x00\x00\x00\x00\x00\xff\xff\xff", 9 ); test_int_format( cmp_write_u64, cmp_read_uinteger, u64, uint64_t, 2147483647, "\xcf\x00\x00\x00\x00\x7f\xff\xff\xff", 9 ); test_int_format( cmp_write_u64, cmp_read_uinteger, u64, uint64_t, 4294967295, "\xcf\x00\x00\x00\x00\xff\xff\xff\xff", 9 ); test_int_format( cmp_write_u64, cmp_read_uinteger, u64, uint64_t, 0xFFFFFFFFFFFFFFFE, "\xcf\xff\xff\xff\xff\xff\xff\xff\xfe", 9 ); test_int_format( cmp_write_u64, cmp_read_uinteger, u64, uint64_t, 0xFFFFFFFFFFFFFFFF, "\xcf\xff\xff\xff\xff\xff\xff\xff\xff", 9 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u8, uint64_t, 0, "\x00", 1 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u8, uint64_t, 1, "\x01", 1 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u8, uint64_t, 127, "\x7f", 1 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u8, uint64_t, 128, "\xcc\x80", 2 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u8, uint64_t, 255, "\xcc\xff", 2 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u16, uint64_t, 256, "\xcd\x01\x00", 3 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u16, uint64_t, 32767, "\xcd\x7f\xff", 3 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u16, uint64_t, 32768, "\xcd\x80\x00", 3 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u16, uint64_t, 65535, "\xcd\xff\xff", 3 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u32, uint64_t, 65536, "\xce\x00\x01\x00\x00", 5 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u32, uint64_t, 8388607, "\xce\x00\x7f\xff\xff", 5 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u32, uint64_t, 8388608, "\xce\x00\x80\x00\x00", 5 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u32, uint64_t, 16777215, "\xce\x00\xff\xff\xff", 5 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u32, uint64_t, 16777216, "\xce\x01\x00\x00\x00", 5 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u32, uint64_t, 2147483647, "\xce\x7f\xff\xff\xff", 5 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u32, uint64_t, 2147483648, "\xce\x80\x00\x00\x00", 5 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u32, uint64_t, 4294967295, "\xce\xff\xff\xff\xff", 5 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u64, uint64_t, 4294967296, "\xcf\x00\x00\x00\x01\x00\x00\x00\x00", 9 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u64, uint64_t, 549755813887, "\xcf\x00\x00\x00\x7f\xff\xff\xff\xff", 9 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u64, uint64_t, 549755813888, "\xcf\x00\x00\x00\x80\x00\x00\x00\x00", 9 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u64, uint64_t, 1099511627775, "\xcf\x00\x00\x00\xff\xff\xff\xff\xff", 9 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u64, uint64_t, 1099511627776, "\xcf\x00\x00\x01\x00\x00\x00\x00\x00", 9 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u64, uint64_t, 140737488355327, "\xcf\x00\x00\x7f\xff\xff\xff\xff\xff", 9 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u64, uint64_t, 140737488355328, "\xcf\x00\x00\x80\x00\x00\x00\x00\x00", 9 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u64, uint64_t, 281474976710655, "\xcf\x00\x00\xff\xff\xff\xff\xff\xff", 9 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u64, uint64_t, 281474976710656, "\xcf\x00\x01\x00\x00\x00\x00\x00\x00", 9 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u64, uint64_t, 36028797018963967, "\xcf\x00\x7f\xff\xff\xff\xff\xff\xff", 9 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u64, uint64_t, 36028797018963968, "\xcf\x00\x80\x00\x00\x00\x00\x00\x00", 9 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u64, uint64_t, 72057594037927935, "\xcf\x00\xff\xff\xff\xff\xff\xff\xff", 9 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u64, uint64_t, 72057594037927936, "\xcf\x01\x00\x00\x00\x00\x00\x00\x00", 9 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u64, uint64_t, 9223372036854775807, "\xcf\x7f\xff\xff\xff\xff\xff\xff\xff", 9 ); test_int_format( cmp_write_uint, cmp_read_uinteger, u64, uint64_t, 0xFFFFFFFFFFFFFFFF, "\xcf\xff\xff\xff\xff\xff\xff\xff\xff", 9 ); test_float_format( cmp_write_float, cmp_read_float, flt, float, 0.0f, "\xca\x00\x00\x00\x00", 5 ); test_float_format( cmp_write_float, cmp_read_float, flt, float, -0.0f, "\xca\x80\x00\x00\x00", 5 ); test_float_format( cmp_write_float, cmp_read_float, flt, float, 1.0f, "\xca\x3f\x80\x00\x00", 5 ); test_float_format( cmp_write_float, cmp_read_float, flt, float, -1.0f, "\xca\xbf\x80\x00\x00", 5 ); test_float_format( cmp_write_float, cmp_read_float, flt, float, 65535.0f, "\xca\x47\x7f\xff\x00", 5 ); test_float_format( cmp_write_float, cmp_read_float, flt, float, -65535.0f, "\xca\xc7\x7f\xff\x00", 5 ); test_float_format( cmp_write_float, cmp_read_float, flt, float, 32767.0f, "\xca\x46\xff\xfe\x00", 5 ); test_float_format( cmp_write_float, cmp_read_float, flt, float, -32767.0f, "\xca\xc6\xff\xfe\x00", 5 ); test_double_format( cmp_write_double, cmp_read_double, dbl, double, 0.0, "\xcb\x00\x00\x00\x00\x00\x00\x00\x00", 9 ); test_double_format( cmp_write_double, cmp_read_double, dbl, double, -0.0, "\xcb\x80\x00\x00\x00\x00\x00\x00\x00", 9 ); test_double_format( cmp_write_double, cmp_read_double, dbl, double, 1.0, "\xcb\x3f\xf0\x00\x00\x00\x00\x00\x00", 9 ); test_double_format( cmp_write_double, cmp_read_double, dbl, double, -1.0, "\xcb\xbf\xf0\x00\x00\x00\x00\x00\x00", 9 ); test_double_format( cmp_write_double, cmp_read_double, dbl, double, 2147483647.0, "\xcb\x41\xdf\xff\xff\xff\xc0\x00\x00", 9 ); test_double_format( cmp_write_double, cmp_read_double, dbl, double, -2147483647.0, "\xcb\xc1\xdf\xff\xff\xff\xc0\x00\x00", 9 ); test_double_format( cmp_write_double, cmp_read_double, dbl, double, 4294967295.0, "\xcb\x41\xef\xff\xff\xff\xe0\x00\x00", 9 ); test_double_format( cmp_write_double, cmp_read_double, dbl, double, -4294967295.0, "\xcb\xc1\xef\xff\xff\xff\xe0\x00\x00", 9 ); test_double_format( cmp_write_decimal, cmp_read_decimal, flt, double, 2.0f, "\xca\x40\x00\x00\x00", 5 ); test_double_format( cmp_write_decimal, cmp_read_decimal, dbl, double, 1111111111111111.125000, "\xcb\x43\x0f\x94\x65\xb8\xab\x8e\x39", 9 ); M_BufferSeek(&buf, 0); assert_true(cmp_write_sfix(&cmp, 1)); M_BufferSeek(&buf, 0); assert_true(cmp_read_sfix(&cmp, &s8)); M_BufferSeek(&buf, 0); assert_true(cmp_write_sfix(&cmp, -1)); M_BufferSeek(&buf, 0); assert_true(cmp_read_sfix(&cmp, &s8)); M_BufferSeek(&buf, 0); assert_true(cmp_write_pfix(&cmp, 1)); M_BufferSeek(&buf, 0); assert_true(cmp_read_pfix(&cmp, &u8)); M_BufferSeek(&buf, 0); assert_true(cmp_read_ufix(&cmp, &u8)); M_BufferSeek(&buf, 0); assert_true(cmp_write_u8(&cmp, 200)); M_BufferSeek(&buf, 0); assert_true(cmp_read_u8(&cmp, &u8)); M_BufferSeek(&buf, 0); assert_true(cmp_write_u16(&cmp, 300)); M_BufferSeek(&buf, 0); assert_true(cmp_read_u16(&cmp, &u16)); M_BufferSeek(&buf, 0); assert_true(cmp_write_u32(&cmp, 70000)); M_BufferSeek(&buf, 0); assert_true(cmp_read_u32(&cmp, &u32)); M_BufferSeek(&buf, 0); assert_true(cmp_write_u64(&cmp, 0x100000002)); M_BufferSeek(&buf, 0); assert_true(cmp_read_u64(&cmp, &u64)); M_BufferSeek(&buf, 0); assert_true(cmp_write_nfix(&cmp, -1)); M_BufferSeek(&buf, 0); assert_true(cmp_read_nfix(&cmp, &s8)); M_BufferSeek(&buf, 0); assert_true(cmp_write_s8(&cmp, -100)); M_BufferSeek(&buf, 0); assert_true(cmp_read_s8(&cmp, &s8)); M_BufferSeek(&buf, 0); assert_true(cmp_write_s16(&cmp, -200)); M_BufferSeek(&buf, 0); assert_true(cmp_read_s16(&cmp, &s16)); M_BufferSeek(&buf, 0); assert_true(cmp_write_s32(&cmp, -33000)); M_BufferSeek(&buf, 0); assert_true(cmp_read_s32(&cmp, &s32)); M_BufferSeek(&buf, 0); assert_true(cmp_write_s64(&cmp, 0x80000002)); M_BufferSeek(&buf, 0); assert_true(cmp_read_s64(&cmp, &s64)); M_BufferSeek(&buf, 0); assert_true(cmp_write_float(&cmp, 1.1f)); M_BufferSeek(&buf, 0); assert_true(cmp_read_float(&cmp, &f)); M_BufferSeek(&buf, 0); assert_true(cmp_write_double(&cmp, 1.1)); M_BufferSeek(&buf, 0); assert_true(cmp_read_double(&cmp, &d)); M_BufferClear(&buf); assert_true(cmp_write_s8(&cmp, -1)); assert_true(cmp_write_s8(&cmp, 1)); assert_true(cmp_write_u8(&cmp, 1)); assert_true(cmp_write_u8(&cmp, 1)); assert_true(cmp_write_s8(&cmp, -100)); assert_true(cmp_write_s8(&cmp, 100)); assert_true(cmp_write_u8(&cmp, 100)); assert_true(cmp_write_u8(&cmp, 200)); assert_true(cmp_write_s16(&cmp, -200)); assert_true(cmp_write_s16(&cmp, 300)); assert_true(cmp_write_u16(&cmp, 300)); assert_true(cmp_write_u16(&cmp, 33000)); assert_true(cmp_write_s32(&cmp, -33000)); assert_true(cmp_write_s32(&cmp, 33000)); assert_true(cmp_write_u32(&cmp, 33000)); assert_true(cmp_write_u32(&cmp, 0x81000000)); assert_true(cmp_write_s64(&cmp, 0xFFFFFFFFFFFFFFFC)); assert_true(cmp_write_s64(&cmp, 0x7FFFFFFFFFFFFFFC)); assert_true(cmp_write_u64(&cmp, 0x7FFFFFFFFFFFFFFC)); assert_true(cmp_write_u64(&cmp, 0x800000000000000C)); assert_true(cmp_write_decimal(&cmp, 1.1f)); assert_true(cmp_write_decimal(&cmp, 1.1)); M_BufferSeek(&buf, 0); assert_true(cmp_read_char(&cmp, &s8)); assert_true(cmp_read_char(&cmp, &s8)); assert_true(cmp_read_char(&cmp, &s8)); assert_true(cmp_read_char(&cmp, &s8)); M_BufferSeek(&buf, 0); assert_true(cmp_read_char(&cmp, &s8)); assert_true(cmp_read_char(&cmp, &s8)); assert_true(cmp_read_uchar(&cmp, &u8)); assert_true(cmp_read_uchar(&cmp, &u8)); M_BufferSeek(&buf, 0); assert_true(cmp_read_char(&cmp, &s8)); assert_true(cmp_read_char(&cmp, &s8)); assert_true(cmp_read_char(&cmp, &s8)); assert_true(cmp_read_char(&cmp, &s8)); assert_true(cmp_read_char(&cmp, &s8)); assert_true(cmp_read_char(&cmp, &s8)); assert_true(cmp_read_char(&cmp, &s8)); M_BufferSeek(&buf, 0); assert_true(cmp_read_char(&cmp, &s8)); assert_true(cmp_read_char(&cmp, &s8)); assert_true(cmp_read_uchar(&cmp, &u8)); assert_true(cmp_read_uchar(&cmp, &u8)); assert_true(cmp_read_char(&cmp, &s8)); assert_true(cmp_read_char(&cmp, &s8)); assert_true(cmp_read_uchar(&cmp, &u8)); assert_true(cmp_read_uchar(&cmp, &u8)); M_BufferSeek(&buf, 0); assert_true(cmp_read_short(&cmp, &s16)); assert_true(cmp_read_short(&cmp, &s16)); assert_true(cmp_read_short(&cmp, &s16)); assert_true(cmp_read_short(&cmp, &s16)); assert_true(cmp_read_short(&cmp, &s16)); assert_true(cmp_read_short(&cmp, &s16)); assert_true(cmp_read_short(&cmp, &s16)); assert_true(cmp_read_short(&cmp, &s16)); assert_true(cmp_read_short(&cmp, &s16)); assert_true(cmp_read_short(&cmp, &s16)); assert_true(cmp_read_short(&cmp, &s16)); M_BufferSeek(&buf, 0); assert_true(cmp_read_short(&cmp, &s16)); assert_true(cmp_read_short(&cmp, &s16)); assert_true(cmp_read_ushort(&cmp, &u16)); assert_true(cmp_read_ushort(&cmp, &u16)); assert_true(cmp_read_short(&cmp, &s16)); assert_true(cmp_read_short(&cmp, &s16)); assert_true(cmp_read_ushort(&cmp, &u16)); assert_true(cmp_read_ushort(&cmp, &u16)); assert_true(cmp_read_short(&cmp, &s16)); assert_true(cmp_read_short(&cmp, &s16)); assert_true(cmp_read_ushort(&cmp, &u16)); assert_true(cmp_read_ushort(&cmp, &u16)); M_BufferSeek(&buf, 0); assert_true(cmp_read_int(&cmp, &s32)); assert_true(cmp_read_int(&cmp, &s32)); assert_true(cmp_read_int(&cmp, &s32)); assert_true(cmp_read_int(&cmp, &s32)); assert_true(cmp_read_int(&cmp, &s32)); assert_true(cmp_read_int(&cmp, &s32)); assert_true(cmp_read_int(&cmp, &s32)); assert_true(cmp_read_int(&cmp, &s32)); assert_true(cmp_read_int(&cmp, &s32)); assert_true(cmp_read_int(&cmp, &s32)); assert_true(cmp_read_int(&cmp, &s32)); assert_true(cmp_read_int(&cmp, &s32)); assert_true(cmp_read_int(&cmp, &s32)); assert_true(cmp_read_int(&cmp, &s32)); assert_true(cmp_read_int(&cmp, &s32)); M_BufferSeek(&buf, 0); assert_true(cmp_read_int(&cmp, &s32)); assert_true(cmp_read_int(&cmp, &s32)); assert_true(cmp_read_uint(&cmp, &u32)); assert_true(cmp_read_uint(&cmp, &u32)); assert_true(cmp_read_int(&cmp, &s32)); assert_true(cmp_read_int(&cmp, &s32)); assert_true(cmp_read_uint(&cmp, &u32)); assert_true(cmp_read_uint(&cmp, &u32)); assert_true(cmp_read_int(&cmp, &s32)); assert_true(cmp_read_int(&cmp, &s32)); assert_true(cmp_read_uint(&cmp, &u32)); assert_true(cmp_read_uint(&cmp, &u32)); assert_true(cmp_read_int(&cmp, &s32)); assert_true(cmp_read_int(&cmp, &s32)); assert_true(cmp_read_uint(&cmp, &u32)); assert_true(cmp_read_uint(&cmp, &u32)); M_BufferSeek(&buf, 0); assert_true(cmp_read_long(&cmp, &s64)); assert_true(cmp_read_long(&cmp, &s64)); assert_true(cmp_read_long(&cmp, &s64)); assert_true(cmp_read_long(&cmp, &s64)); assert_true(cmp_read_long(&cmp, &s64)); assert_true(cmp_read_long(&cmp, &s64)); assert_true(cmp_read_long(&cmp, &s64)); assert_true(cmp_read_long(&cmp, &s64)); assert_true(cmp_read_long(&cmp, &s64)); assert_true(cmp_read_long(&cmp, &s64)); assert_true(cmp_read_long(&cmp, &s64)); assert_true(cmp_read_long(&cmp, &s64)); assert_true(cmp_read_long(&cmp, &s64)); assert_true(cmp_read_long(&cmp, &s64)); assert_true(cmp_read_long(&cmp, &s64)); assert_true(cmp_read_long(&cmp, &s64)); assert_true(cmp_read_long(&cmp, &s64)); assert_true(cmp_read_long(&cmp, &s64)); assert_true(cmp_read_long(&cmp, &s64)); M_BufferSeek(&buf, 0); assert_true(cmp_read_long(&cmp, &s64)); assert_true(cmp_read_long(&cmp, &s64)); assert_true(cmp_read_ulong(&cmp, &u64)); assert_true(cmp_read_ulong(&cmp, &u64)); assert_true(cmp_read_long(&cmp, &s64)); assert_true(cmp_read_long(&cmp, &s64)); assert_true(cmp_read_ulong(&cmp, &u64)); assert_true(cmp_read_ulong(&cmp, &u64)); assert_true(cmp_read_long(&cmp, &s64)); assert_true(cmp_read_long(&cmp, &s64)); assert_true(cmp_read_ulong(&cmp, &u64)); assert_true(cmp_read_ulong(&cmp, &u64)); assert_true(cmp_read_long(&cmp, &s64)); assert_true(cmp_read_long(&cmp, &s64)); assert_true(cmp_read_ulong(&cmp, &u64)); assert_true(cmp_read_ulong(&cmp, &u64)); assert_true(cmp_read_long(&cmp, &s64)); assert_true(cmp_read_long(&cmp, &s64)); assert_true(cmp_read_ulong(&cmp, &u64)); assert_true(cmp_read_ulong(&cmp, &u64)); assert_true(cmp_read_decimal(&cmp, &d)); assert_true(cmp_read_decimal(&cmp, &d)); reader_successes = 0; M_BufferSeek(&buf, 0); assert_false(cmp_read_char(&cmp, &s8)); M_BufferSeek(&buf, 0); assert_false(cmp_read_uchar(&cmp, &u8)); M_BufferSeek(&buf, 0); assert_false(cmp_read_short(&cmp, &s16)); M_BufferSeek(&buf, 0); assert_false(cmp_read_ushort(&cmp, &u16)); M_BufferSeek(&buf, 0); assert_false(cmp_read_int(&cmp, &s32)); M_BufferSeek(&buf, 0); assert_false(cmp_read_uint(&cmp, &u32)); M_BufferSeek(&buf, 0); assert_false(cmp_read_long(&cmp, &s64)); M_BufferSeek(&buf, 0); assert_false(cmp_read_ulong(&cmp, &u64)); M_BufferSeek(&buf, 0); assert_false(cmp_read_decimal(&cmp, &d)); M_BufferSeek(&buf, 0); assert_false(cmp_read_decimal(&cmp, &d)); reader_successes = -1; M_BufferClear(&buf); assert_true(cmp_write_u8(&cmp, 200)); M_BufferSeek(&buf, 0); assert_false(cmp_read_char(&cmp, &s8)); M_BufferClear(&buf); assert_true(cmp_write_u64(&cmp, 0xFFFFFFFFFFFFFFFE)); assert_true(cmp_write_s64(&cmp, 0xFFFFFFFFFFFFFFFE)); M_BufferSeek(&buf, 0); assert_false(cmp_read_char(&cmp, &s8)); M_BufferSeek(&buf, 0); assert_false(cmp_read_uchar(&cmp, &u8)); M_BufferSeek(&buf, 0); assert_false(cmp_read_short(&cmp, &s16)); M_BufferSeek(&buf, 0); assert_false(cmp_read_ushort(&cmp, &u16)); M_BufferSeek(&buf, 0); assert_false(cmp_read_int(&cmp, &s32)); M_BufferSeek(&buf, 0); assert_false(cmp_read_uint(&cmp, &u32)); M_BufferSeek(&buf, 0); assert_false(cmp_read_long(&cmp, &s64)); M_BufferSeek(&buf, 0); assert_false(cmp_read_decimal(&cmp, &d)); M_BufferSeek(&buf, 0); assert_true(cmp_read_ulong(&cmp, &u64)); assert_false(cmp_read_ulong(&cmp, &u64)); M_BufferClear(&buf); assert_true(cmp_write_s8(&cmp, 100)); M_BufferSeek(&buf, 0); assert_true(cmp_read_uchar(&cmp, &u8)); M_BufferSeek(&buf, 0); assert_true(cmp_read_ushort(&cmp, &u16)); M_BufferSeek(&buf, 0); assert_true(cmp_read_uint(&cmp, &u32)); M_BufferSeek(&buf, 0); assert_true(cmp_read_ulong(&cmp, &u64)); M_BufferClear(&buf); assert_true(cmp_write_s16(&cmp, 300)); M_BufferSeek(&buf, 0); assert_true(cmp_read_ushort(&cmp, &u16)); M_BufferSeek(&buf, 0); assert_true(cmp_read_uint(&cmp, &u32)); M_BufferSeek(&buf, 0); assert_true(cmp_read_ulong(&cmp, &u64)); M_BufferClear(&buf); assert_true(cmp_write_s32(&cmp, 40000)); M_BufferSeek(&buf, 0); assert_true(cmp_read_uint(&cmp, &u32)); M_BufferSeek(&buf, 0); assert_true(cmp_read_ulong(&cmp, &u64)); M_BufferClear(&buf); assert_true(cmp_write_s64(&cmp, 0x6FFFFFFFFFFFFFFE)); M_BufferSeek(&buf, 0); assert_true(cmp_read_ulong(&cmp, &u64)); M_BufferClear(&buf); assert_true(cmp_write_s8(&cmp, -100)); M_BufferSeek(&buf, 0); assert_false(cmp_read_uchar(&cmp, &u8)); M_BufferSeek(&buf, 0); assert_false(cmp_read_ushort(&cmp, &u16)); M_BufferSeek(&buf, 0); assert_false(cmp_read_uint(&cmp, &u32)); M_BufferSeek(&buf, 0); assert_false(cmp_read_ulong(&cmp, &u64)); M_BufferClear(&buf); assert_true(cmp_write_u8(&cmp, 4)); M_BufferSeek(&buf, 0); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_UINT8); assert_true(cmp_object_as_char(&obj, &s8)); assert_true(cmp_object_as_short(&obj, &s16)); assert_true(cmp_object_as_int(&obj, &s32)); assert_true(cmp_object_as_long(&obj, &s64)); M_BufferClear(&buf); assert_true(cmp_write_u8(&cmp, 200)); M_BufferSeek(&buf, 0); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_UINT8); assert_false(cmp_object_as_char(&obj, &s8)); assert_true(cmp_object_as_short(&obj, &s16)); assert_true(cmp_object_as_int(&obj, &s32)); assert_true(cmp_object_as_long(&obj, &s64)); M_BufferClear(&buf); assert_true(cmp_write_u16(&cmp, 30000)); M_BufferSeek(&buf, 0); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_UINT16); assert_false(cmp_object_as_char(&obj, &s8)); assert_true(cmp_object_as_short(&obj, &s16)); assert_true(cmp_object_as_int(&obj, &s32)); assert_true(cmp_object_as_long(&obj, &s64)); M_BufferClear(&buf); assert_true(cmp_write_u16(&cmp, 60000)); M_BufferSeek(&buf, 0); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_UINT16); assert_false(cmp_object_as_char(&obj, &s8)); assert_false(cmp_object_as_short(&obj, &s16)); assert_true(cmp_object_as_int(&obj, &s32)); assert_true(cmp_object_as_long(&obj, &s64)); M_BufferClear(&buf); assert_true(cmp_write_u32(&cmp, 2000000000)); M_BufferSeek(&buf, 0); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_UINT32); assert_false(cmp_object_as_char(&obj, &s8)); assert_false(cmp_object_as_short(&obj, &s16)); assert_true(cmp_object_as_int(&obj, &s32)); assert_true(cmp_object_as_long(&obj, &s64)); M_BufferClear(&buf); assert_true(cmp_write_u32(&cmp, 3000000000)); M_BufferSeek(&buf, 0); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_UINT32); assert_false(cmp_object_as_char(&obj, &s8)); assert_false(cmp_object_as_short(&obj, &s16)); assert_false(cmp_object_as_int(&obj, &s32)); assert_true(cmp_object_as_long(&obj, &s64)); M_BufferClear(&buf); assert_true(cmp_write_u64(&cmp, LONG_MAX - 10)); M_BufferSeek(&buf, 0); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_UINT64); assert_false(cmp_object_as_char(&obj, &s8)); assert_false(cmp_object_as_short(&obj, &s16)); assert_false(cmp_object_as_int(&obj, &s32)); assert_true(cmp_object_as_long(&obj, &s64)); M_BufferClear(&buf); assert_true(cmp_write_u64(&cmp, ((uint64_t)LONG_MAX) + 10)); M_BufferSeek(&buf, 0); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_UINT64); assert_false(cmp_object_as_char(&obj, &s8)); assert_false(cmp_object_as_short(&obj, &s16)); assert_false(cmp_object_as_int(&obj, &s32)); assert_false(cmp_object_as_long(&obj, &s64)); teardown_cmp_and_buf(&cmp, &buf); } static void test_conversions(void **state) { buf_t buf; cmp_ctx_t cmp; cmp_object_t obj; int8_t s8; uint8_t u8; uint16_t u16; uint32_t u32; uint64_t u64; bool b; float f; double d; (void)state; setup_cmp_and_buf(&cmp, &buf); M_BufferClear(&buf); assert_true(cmp_write_nil(&cmp)); M_BufferSeek(&buf, 0); assert_true(cmp_read_object(&cmp, &obj)); assert_false(cmp_object_as_uchar(&obj, &u8)); assert_false(cmp_object_as_ushort(&obj, &u16)); assert_false(cmp_object_as_uint(&obj, &u32)); assert_false(cmp_object_as_ulong(&obj, &u64)); assert_false(cmp_object_as_float(&obj, &f)); assert_false(cmp_object_as_double(&obj, &d)); assert_false(cmp_object_as_bool(&obj, &b)); assert_false(cmp_object_as_str(&obj, &u32)); assert_false(cmp_object_as_bin(&obj, &u32)); assert_false(cmp_object_as_array(&obj, &u32)); assert_false(cmp_object_as_map(&obj, &u32)); assert_false(cmp_object_as_ext(&obj, &s8, &u32)); assert_false(cmp_object_to_str(&cmp, &obj, NULL, 0)); assert_false(cmp_object_to_bin(&cmp, &obj, NULL, 0)); teardown_cmp_and_buf(&cmp, &buf); } static void test_nil(void **state) { buf_t buf; cmp_ctx_t cmp; cmp_object_t obj; (void)state; setup_cmp_and_buf(&cmp, &buf); test_format_no_input(cmp_write_nil, u8, "\xc0", 1, 0); M_BufferSeek(&buf, 0); assert_true(cmp_write_nil(&cmp)); M_BufferSeek(&buf, 0); assert_true(cmp_read_nil(&cmp)); reader_successes = 0; M_BufferSeek(&buf, 0); assert_false(cmp_read_nil(&cmp)); reader_successes = -1; M_BufferClear(&buf); assert_true(cmp_write_true(&cmp)); M_BufferSeek(&buf, 0); assert_false(cmp_read_nil(&cmp)); teardown_cmp_and_buf(&cmp, &buf); } static void test_boolean(void **state) { buf_t buf; cmp_ctx_t cmp; cmp_object_t obj; bool b; uint8_t u8; (void)state; setup_cmp_and_buf(&cmp, &buf); test_format_no_input(cmp_write_false, boolean, "\xc2", 1, false); test_format_no_input(cmp_write_true, boolean, "\xc3", 1, true); test_format(cmp_write_bool, cmp_read_bool, boolean, bool, false, "\xc2", 1); test_format(cmp_write_bool, cmp_read_bool, boolean, bool, true, "\xc3", 1); test_format( cmp_write_u8_as_bool, cmp_read_bool_as_u8, boolean, uint8_t, 0, "\xc2", 1 ); test_format( cmp_write_u8_as_bool, cmp_read_bool_as_u8, boolean, uint8_t, 1, "\xc3", 1 ); M_BufferClear(&buf); assert_true(cmp_write_true(&cmp)); reader_successes = 0; M_BufferSeek(&buf, 0); assert_false(cmp_read_bool(&cmp, &b)); M_BufferSeek(&buf, 0); assert_false(cmp_read_bool_as_u8(&cmp, &u8)); reader_successes = -1; M_BufferClear(&buf); assert_true(cmp_write_nil(&cmp)); M_BufferSeek(&buf, 0); assert_false(cmp_read_bool(&cmp, &b)); M_BufferSeek(&buf, 0); assert_false(cmp_read_bool_as_u8(&cmp, &u8)); teardown_cmp_and_buf(&cmp, &buf); } static void test_bin(void **state) { buf_t buf; cmp_ctx_t cmp; cmp_object_t obj; uint32_t size; (void)state; setup_cmp_and_buf(&cmp, &buf); test_format_with_length( cmp_write_bin8, cmp_read_bin, bin_size, "", 0, "\xc4\x00", 2 ); test_format_with_length( cmp_write_bin8, cmp_read_bin, bin_size, "Hey there\n", 10, "\xc4\x0aHey there\n", 12 ); test_format_with_length( cmp_write_bin16, cmp_read_bin, bin_size, "", 0, "\xc5\x00\x00", 3 ); test_format_with_length( cmp_write_bin16, cmp_read_bin, bin_size, "Hey there\n", 10, "\xc5\x00\x0aHey there\n", 13 ); test_format_with_length( cmp_write_bin32, cmp_read_bin, bin_size, "", 0, "\xc6\x00\x00\x00\x00", 5 ); test_format_with_length( cmp_write_bin32, cmp_read_bin, bin_size, "Hey there\n", 10, "\xc6\x00\x00\x00\x0aHey there\n", 15 ); test_format_with_length( cmp_write_bin, cmp_read_bin, bin_size, "", 0, "\xc4\x00", 2 ); test_format_with_length( cmp_write_bin, cmp_read_bin, bin_size, "Hey there\n", 10, "\xc4\x0aHey there\n", 12 ); M_BufferSeek(&buf, 0); assert_true(cmp_write_bin_marker(&cmp, 100)); for (size_t i = 0; i < 100; i++) { M_BufferWrite(&buf, "C", 1); } assert_true(cmp_write_bin_marker(&cmp, 300)); for (size_t i = 0; i < 300; i++) { M_BufferWrite(&buf, "C", 1); } assert_true(cmp_write_bin_marker(&cmp, 70000)); for(size_t i = 0; i < 70000; i++) { M_BufferWrite(&buf, "C", 1); } M_BufferSeek(&buf, 0); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_BIN8); assert_int_equal(obj.as.bin_size, 100); M_BufferSeekForward(&buf, 100); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_BIN16); assert_int_equal(obj.as.bin_size, 300); M_BufferSeekForward(&buf, 300); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_BIN32); assert_int_equal(obj.as.bin_size, 70000); M_BufferSeekForward(&buf, 70000); M_BufferSeek(&buf, 0); char *bin8 = malloc(200); char *bin16 = malloc(300); char *bin32 = malloc(70000); assert_true(cmp_write_bin(&cmp, bin8, 200)); assert_true(cmp_write_bin(&cmp, bin16, 300)); assert_true(cmp_write_bin(&cmp, bin32, 70000)); M_BufferClear(&buf); assert_true(cmp_write_bin(&cmp, "Hello", 5)); M_BufferSeek(&buf, 0); size = 5; assert_true(cmp_read_bin(&cmp, bin8, &size)); M_BufferSeek(&buf, 0); size = 4; assert_false(cmp_read_bin(&cmp, bin8, &size)); reader_successes = 1; M_BufferSeek(&buf, 0); size = 5; assert_false(cmp_read_bin(&cmp, bin8, &size)); reader_successes = 2; M_BufferSeek(&buf, 0); size = 5; assert_false(cmp_read_bin(&cmp, bin8, &size)); reader_successes = 2; M_BufferClear(&buf); assert_true(cmp_write_bin(&cmp, "Hello", 5)); M_BufferSeek(&buf, 0); assert_true(cmp_read_object(&cmp, &obj)); assert_false(cmp_object_to_bin(&cmp, &obj, bin8, 5)); reader_successes = -1; M_BufferClear(&buf); assert_true(cmp_write_bin(&cmp, "Hello", 5)); M_BufferSeek(&buf, 0); assert_true(cmp_read_object(&cmp, &obj)); assert_false(cmp_object_to_bin(&cmp, &obj, bin8, 4)); assert_true(cmp_object_to_bin(&cmp, &obj, bin8, 5)); free(bin8); free(bin16); free(bin32); teardown_cmp_and_buf(&cmp, &buf); } static void test_string(void **state) { buf_t buf; cmp_ctx_t cmp; cmp_object_t obj; uint32_t size; (void)state; setup_cmp_and_buf(&cmp, &buf); test_format_with_length( cmp_write_fixstr, cmp_read_str, str_size, "", 0, "\xa0", 1 ); test_format_with_length( cmp_write_fixstr, cmp_read_str, str_size, "Hey there\n", 10, "\xaaHey there\n", 11 ); test_format_with_length( cmp_write_str8, cmp_read_str, str_size, "", 0, "\xd9\x00", 2 ); test_format_with_length( cmp_write_str8, cmp_read_str, str_size, "Hey there\n", 10, "\xd9\x0aHey there\n", 12 ); test_format_with_length( cmp_write_str16, cmp_read_str, str_size, "", 0, "\xda\x00\x00", 3 ); test_format_with_length( cmp_write_str16, cmp_read_str, str_size, "Hey there\n", 10, "\xda\x00\x0aHey there\n", 13 ); test_format_with_length( cmp_write_str32, cmp_read_str, str_size, "", 0, "\xdb\x00\x00\x00\x00", 5 ); test_format_with_length( cmp_write_str32, cmp_read_str, str_size, "Hey there\n", 10, "\xdb\x00\x00\x00\x0aHey there\n", 15 ); test_format_with_length( cmp_write_str, cmp_read_str, str_size, "", 0, "\xa0", 1 ); test_format_with_length( cmp_write_str, cmp_read_str, str_size, "Hey there\n", 10, "\xaaHey there\n", 11 ); test_format_with_length( cmp_write_str_v4, cmp_read_str, str_size, "With your feet on the air and your head on the ground\n", 54, "\xda\x00\x36With your feet on the air and your head on the ground\n", 57 ); M_BufferSeek(&buf, 0); assert_true(cmp_write_str_marker(&cmp, 7)); M_BufferWrite(&buf, "bananas", 7); assert_true(cmp_write_str_marker(&cmp, 100)); for (size_t i = 0; i < 100; i++) { M_BufferWrite(&buf, "C", 1); } assert_true(cmp_write_str_marker(&cmp, 300)); for (size_t i = 0; i < 300; i++) { M_BufferWrite(&buf, "C", 1); } assert_true(cmp_write_str_marker(&cmp, 70000)); for(size_t i = 0; i < 70000; i++) { M_BufferWrite(&buf, "C", 1); } M_BufferSeek(&buf, 0); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_FIXSTR); assert_int_equal(obj.as.str_size, 7); M_BufferSeekForward(&buf, 7); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_STR8); assert_int_equal(obj.as.str_size, 100); M_BufferSeekForward(&buf, 100); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_STR16); assert_int_equal(obj.as.str_size, 300); M_BufferSeekForward(&buf, 300); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_STR32); assert_int_equal(obj.as.str_size, 70000); M_BufferSeekForward(&buf, 70000); M_BufferSeek(&buf, 0); assert_true(cmp_write_str_marker_v4(&cmp, 7)); M_BufferWrite(&buf, "bananas", 7); assert_true(cmp_write_str_marker_v4(&cmp, 100)); for (size_t i = 0; i < 100; i++) { M_BufferWrite(&buf, "C", 1); } assert_true(cmp_write_str_marker_v4(&cmp, 300)); for (size_t i = 0; i < 300; i++) { M_BufferWrite(&buf, "C", 1); } assert_true(cmp_write_str_marker_v4(&cmp, 70000)); for(size_t i = 0; i < 70000; i++) { M_BufferWrite(&buf, "C", 1); } M_BufferSeek(&buf, 0); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_FIXSTR); assert_int_equal(obj.as.str_size, 7); M_BufferSeekForward(&buf, 7); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_STR16); assert_int_equal(obj.as.str_size, 100); M_BufferSeekForward(&buf, 100); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_STR16); assert_int_equal(obj.as.str_size, 300); M_BufferSeekForward(&buf, 300); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_STR32); assert_int_equal(obj.as.str_size, 70000); M_BufferSeekForward(&buf, 70000); M_BufferSeek(&buf, 0); char *str8 = malloc(201); char *str16 = malloc(301); char *str32 = malloc(70001); *(str8 + 200) = '\0'; *(str16 + 300) = '\0'; *(str32 + 70000) = '\0'; assert_true(cmp_write_str(&cmp, str8, 200)); assert_true(cmp_write_str(&cmp, str16, 300)); assert_true(cmp_write_str(&cmp, str32, 70000)); assert_true(cmp_write_str_v4(&cmp, "C", 1)); assert_true(cmp_write_str_v4(&cmp, str8, 200)); assert_true(cmp_write_str_v4(&cmp, str16, 300)); assert_true(cmp_write_str_v4(&cmp, str32, 70000)); free(str16); free(str32); assert_false(cmp_write_fixstr_marker(&cmp, 200)); M_BufferClear(&buf); assert_true(cmp_write_str(&cmp, "Hello", 5)); M_BufferSeek(&buf, 0); size = 6; assert_true(cmp_read_str(&cmp, str8, &size)); M_BufferSeek(&buf, 0); size = 5; assert_false(cmp_read_str(&cmp, str8, &size)); reader_successes = 1; M_BufferSeek(&buf, 0); size = 6; assert_false(cmp_read_str(&cmp, str8, &size)); reader_successes = 1; M_BufferClear(&buf); assert_true(cmp_write_str(&cmp, "Hello", 5)); M_BufferSeek(&buf, 0); assert_true(cmp_read_object(&cmp, &obj)); assert_false(cmp_object_to_str(&cmp, &obj, str8, 6)); reader_successes = -1; M_BufferClear(&buf); assert_true(cmp_write_str(&cmp, "Hello", 5)); M_BufferSeek(&buf, 0); assert_true(cmp_read_object(&cmp, &obj)); assert_false(cmp_object_to_str(&cmp, &obj, str8, 5)); assert_true(cmp_object_to_str(&cmp, &obj, str8, 6)); free(str8); teardown_cmp_and_buf(&cmp, &buf); } static void test_array(void **state) { buf_t buf; cmp_ctx_t cmp; cmp_object_t obj; (void)state; setup_cmp_and_buf(&cmp, &buf); test_format( cmp_write_fixarray, cmp_read_array, array_size, uint32_t, 0, "\x90", 1 ); test_format( cmp_write_fixarray, cmp_read_array, array_size, uint32_t, 10, "\x9a", 1 ); test_format( cmp_write_array16, cmp_read_array, array_size, uint32_t, 0, "\xdc\x00\x00", 3 ); test_format( cmp_write_array16, cmp_read_array, array_size, uint32_t, 10, "\xdc\x00\x0a", 3 ); test_format( cmp_write_array32, cmp_read_array, array_size, uint32_t, 0, "\xdd\x00\x00\x00\x00", 5 ); test_format( cmp_write_array32, cmp_read_array, array_size, uint32_t, 10, "\xdd\x00\x00\x00\x0a", 5 ); test_format( cmp_write_array, cmp_read_array, array_size, uint32_t, 0, "\x90", 1 ); test_format( cmp_write_array, cmp_read_array, array_size, uint32_t, 10, "\x9a", 1 ); M_BufferSeek(&buf, 0); assert_string_equal(cmp_strerror(&cmp), ""); assert_false(cmp_write_fixarray(&cmp, 200)); assert_string_equal(cmp_strerror(&cmp), "Input value is too large"); assert_true(cmp_write_array(&cmp, 0xFFFE)); for (size_t i = 0; i < 0xFFFE; i++) { assert_true(cmp_write_uinteger(&cmp, 1)); } assert_true(cmp_write_array(&cmp, 0x10000)); for (size_t i = 0; i < 0x10000; i++) { assert_true(cmp_write_uinteger(&cmp, 1)); } M_BufferSeek(&buf, 0); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_ARRAY16); assert_int_equal(obj.as.array_size, 0xFFFE); for (size_t i = 0; i < 0xFFFE; i++) { uint64_t n; assert_true(cmp_read_uinteger(&cmp, &n)); } assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_ARRAY32); assert_int_equal(obj.as.array_size, 0x10000); for (size_t i = 0; i < 0x10000; i++) { uint64_t n; assert_true(cmp_read_uinteger(&cmp, &n)); } teardown_cmp_and_buf(&cmp, &buf); } static void test_map(void **state) { buf_t buf; cmp_ctx_t cmp; cmp_object_t obj; (void)state; setup_cmp_and_buf(&cmp, &buf); test_format( cmp_write_fixmap, cmp_read_map, map_size, uint32_t, 0, "\x80", 1 ); test_format( cmp_write_fixmap, cmp_read_map, map_size, uint32_t, 10, "\x8a", 1 ); test_format( cmp_write_map16, cmp_read_map, map_size, uint32_t, 0, "\xde\x00\x00", 3 ); test_format( cmp_write_map16, cmp_read_map, map_size, uint32_t, 10, "\xde\x00\x0a", 3 ); test_format( cmp_write_map32, cmp_read_map, map_size, uint32_t, 0, "\xdf\x00\x00\x00\x00", 5 ); test_format( cmp_write_map32, cmp_read_map, map_size, uint32_t, 10, "\xdf\x00\x00\x00\x0a", 5 ); test_format( cmp_write_map, cmp_read_map, map_size, uint32_t, 0, "\x80", 1 ); test_format( cmp_write_map, cmp_read_map, map_size, uint32_t, 10, "\x8a", 1 ); M_BufferSeek(&buf, 0); assert_true(cmp_write_map(&cmp, 3)); assert_true(cmp_write_str(&cmp, "a", 1)); assert_true(cmp_write_str(&cmp, "apple", 5)); assert_true(cmp_write_str(&cmp, "b", 1)); assert_true(cmp_write_str(&cmp, "banana", 6)); assert_true(cmp_write_str(&cmp, "c", 1)); assert_true(cmp_write_str(&cmp, "coconut", 7)); M_BufferSeek(&buf, 0); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_FIXMAP); assert_int_equal(obj.as.map_size, 3); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_FIXSTR); assert_int_equal(obj.as.str_size, 1); assert_memory_equal(M_BufferGetDataAtCursor(&buf), "a", 1); M_BufferSeekForward(&buf, 1); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_FIXSTR); assert_int_equal(obj.as.str_size, 5); assert_memory_equal(M_BufferGetDataAtCursor(&buf), "apple", 5); M_BufferSeekForward(&buf, 5); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_FIXSTR); assert_int_equal(obj.as.str_size, 1); assert_memory_equal(M_BufferGetDataAtCursor(&buf), "b", 1); M_BufferSeekForward(&buf, 1); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_FIXSTR); assert_int_equal(obj.as.str_size, 6); assert_memory_equal(M_BufferGetDataAtCursor(&buf), "banana", 6); M_BufferSeekForward(&buf, 6); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_FIXSTR); assert_int_equal(obj.as.str_size, 1); assert_memory_equal(M_BufferGetDataAtCursor(&buf), "c", 1); M_BufferSeekForward(&buf, 1); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_FIXSTR); assert_int_equal(obj.as.str_size, 7); assert_memory_equal(M_BufferGetDataAtCursor(&buf), "coconut", 7); M_BufferSeekForward(&buf, 7); M_BufferSeek(&buf, 0); assert_false(cmp_write_fixmap(&cmp, 200)); assert_string_equal(cmp_strerror(&cmp), "Input value is too large"); assert_true(cmp_write_map(&cmp, 0xFFFE)); for (size_t i = 0; i < 0xFFFE; i++) { assert_true(cmp_write_uinteger(&cmp, 1)); assert_true(cmp_write_uinteger(&cmp, 1)); } assert_true(cmp_write_map(&cmp, 0x10000)); for (size_t i = 0; i < 0x10000; i++) { assert_true(cmp_write_uinteger(&cmp, 1)); assert_true(cmp_write_uinteger(&cmp, 1)); } M_BufferSeek(&buf, 0); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_MAP16); assert_int_equal(obj.as.map_size, 0xFFFE); for (size_t i = 0; i < 0xFFFE; i++) { uint64_t n; assert_true(cmp_read_uinteger(&cmp, &n)); assert_true(cmp_read_uinteger(&cmp, &n)); } assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_MAP32); assert_int_equal(obj.as.map_size, 0x10000); for (size_t i = 0; i < 0x10000; i++) { uint64_t n; assert_true(cmp_read_uinteger(&cmp, &n)); assert_true(cmp_read_uinteger(&cmp, &n)); } teardown_cmp_and_buf(&cmp, &buf); } static void test_ext(void **state) { buf_t buf; cmp_ctx_t cmp; cmp_object_t obj; int8_t etype; uint8_t esize8; uint16_t esize16; uint32_t esize32; char outfixedbuf1[1]; char outfixedbuf2[2]; char outfixedbuf4[4]; char outfixedbuf8[8]; char outfixedbuf16[16]; char *buf8 = malloc(0x7F); char *outbuf8 = malloc(0x7F); char *buf16 = malloc(0x7FFF); char *outbuf16 = malloc(0x7FFF); char *buf32 = malloc(0x10000); char *outbuf32 = malloc(0x10000); memset(buf8, 'C', 0x7F); memset(buf16, 'C', 0x7FFF); memset(buf32, 'C', 0x10000); (void)state; setup_cmp_and_buf(&cmp, &buf); test_fixext_format(cmp_write_fixext1, 1, 1, "C", "\xd4\x01\x43", 3); test_fixext_format(cmp_write_fixext2, 2, 2, "CC", "\xd5\x02\x43\x43", 4); test_fixext_format( cmp_write_fixext4, 3, 4, "CCCC", "\xd6\x03\x43\x43\x43\x43", 6 ); test_fixext_format( cmp_write_fixext8, 4, 8, "CCCCCCCC", "\xd7\x04\x43\x43\x43\x43\x43\x43\x43\x43", 10 ); test_fixext_format( cmp_write_fixext16, 5, 16, "CCCCCCCCCCCCCCCC", "\xd8\x05\x43\x43\x43\x43\x43\x43\x43\x43\x43\x43\x43\x43\x43\x43\x43\x43", 18 ); test_ext_format(cmp_write_ext8, 1, 1, "C", "\xc7\x01\x01\x43", 4); test_ext_format( cmp_write_ext8, 2, 3, "CCC", "\xc7\x03\x02\x43\x43\x43", 6 ); test_ext_format(cmp_write_ext16, 1, 1, "C", "\xc8\x00\x01\x01\x43", 5); test_ext_format( cmp_write_ext16, 2, 3, "CCC", "\xc8\x00\x03\x02\x43\x43\x43", 7 ); test_ext_format( cmp_write_ext32, 1, 1, "C", "\xc9\x00\x00\x00\x01\x01\x43", 7 ); test_ext_format( cmp_write_ext32, 2, 3, "CCC", "\xc9\x00\x00\x00\x03\x02\x43\x43\x43", 9 ); test_ext_format(cmp_write_ext, 1, 1, "C", "\xd4\x01\x43", 3); test_ext_format( cmp_write_ext, 2, 3, "CCC", "\xc7\x03\x02\x43\x43\x43", 6 ); M_BufferSeek(&buf, 0); writer_successes = 0; assert_false(cmp_write_ext(&cmp, 7, 0x7F, buf8)); M_BufferSeek(&buf, 0); writer_successes = 1; assert_false(cmp_write_ext(&cmp, 7, 0x7F, buf8)); M_BufferSeek(&buf, 0); writer_successes = 2; assert_false(cmp_write_ext(&cmp, 7, 0x7F, buf8)); M_BufferSeek(&buf, 0); writer_successes = 3; assert_false(cmp_write_ext(&cmp, 7, 0x7F, buf8)); M_BufferSeek(&buf, 0); writer_successes = 4; assert_true(cmp_write_ext(&cmp, 7, 0x7F, buf8)); M_BufferSeek(&buf, 0); writer_successes = 0; assert_false(cmp_write_ext8(&cmp, 7, 0x7F, buf8)); M_BufferSeek(&buf, 0); writer_successes = 1; assert_false(cmp_write_ext8(&cmp, 7, 0x7F, buf8)); M_BufferSeek(&buf, 0); writer_successes = 2; assert_false(cmp_write_ext8(&cmp, 7, 0x7F, buf8)); M_BufferSeek(&buf, 0); writer_successes = 3; assert_false(cmp_write_ext8(&cmp, 7, 0x7F, buf8)); M_BufferSeek(&buf, 0); writer_successes = 4; assert_true(cmp_write_ext8(&cmp, 7, 0x7F, buf8)); M_BufferSeek(&buf, 0); writer_successes = 0; assert_false(cmp_write_ext16(&cmp, 7, 0x7FFF, buf16)); M_BufferSeek(&buf, 0); writer_successes = 1; assert_false(cmp_write_ext16(&cmp, 7, 0x7FFF, buf16)); M_BufferSeek(&buf, 0); writer_successes = 2; assert_false(cmp_write_ext16(&cmp, 7, 0x7FFF, buf16)); M_BufferSeek(&buf, 0); writer_successes = 3; assert_false(cmp_write_ext16(&cmp, 7, 0x7FFF, buf16)); M_BufferSeek(&buf, 0); writer_successes = 4; assert_true(cmp_write_ext16(&cmp, 7, 0x7FFF, buf16)); M_BufferSeek(&buf, 0); writer_successes = 0; assert_false(cmp_write_ext32(&cmp, 7, 0x10000, buf32)); M_BufferSeek(&buf, 0); writer_successes = 1; assert_false(cmp_write_ext32(&cmp, 7, 0x10000, buf32)); M_BufferSeek(&buf, 0); writer_successes = 2; assert_false(cmp_write_ext32(&cmp, 7, 0x10000, buf32)); M_BufferSeek(&buf, 0); writer_successes = 3; assert_false(cmp_write_ext32(&cmp, 7, 0x10000, buf32)); M_BufferSeek(&buf, 0); writer_successes = 4; assert_true(cmp_write_ext32(&cmp, 7, 0x10000, buf32)); writer_successes = -1; M_BufferSeek(&buf, 0); assert_true(cmp_write_ext(&cmp, 2, 1, "C")); assert_true(cmp_write_ext(&cmp, 3, 2, "CC")); assert_true(cmp_write_ext(&cmp, 4, 4, "CCCC")); assert_true(cmp_write_ext(&cmp, 5, 8, "CCCCCCCC")); assert_true(cmp_write_ext(&cmp, 6, 16, "CCCCCCCCCCCCCCCC")); assert_true(cmp_write_ext(&cmp, 7, 0x7F, buf8)); assert_true(cmp_write_ext(&cmp, 8, 0x7FFF, buf16)); assert_true(cmp_write_ext(&cmp, 9, 0x10000, buf32)); M_BufferClear(&buf); assert_true(cmp_write_ext(&cmp, 2, 1, "C")); assert_true(cmp_write_ext(&cmp, 3, 2, "CC")); assert_true(cmp_write_ext(&cmp, 4, 4, "CCCC")); assert_true(cmp_write_ext(&cmp, 5, 8, "CCCCCCCC")); assert_true(cmp_write_ext(&cmp, 6, 16, "CCCCCCCCCCCCCCCC")); assert_true(cmp_write_ext(&cmp, 7, 0x7F, buf8)); assert_true(cmp_write_ext(&cmp, 8, 0x7FFF, buf16)); assert_true(cmp_write_ext(&cmp, 9, 0x10000, buf32)); assert_true(cmp_write_nil(&cmp)); M_BufferSeek(&buf, 0); assert_true(cmp_read_object(&cmp, &obj)); assert_true(cmp_object_is_ext(&obj)); M_BufferSeekForward(&buf, obj.as.ext.size); assert_true(cmp_read_object(&cmp, &obj)); assert_true(cmp_object_is_ext(&obj)); M_BufferSeekForward(&buf, obj.as.ext.size); assert_true(cmp_read_object(&cmp, &obj)); assert_true(cmp_object_is_ext(&obj)); M_BufferSeekForward(&buf, obj.as.ext.size); assert_true(cmp_read_object(&cmp, &obj)); assert_true(cmp_object_is_ext(&obj)); M_BufferSeekForward(&buf, obj.as.ext.size); assert_true(cmp_read_object(&cmp, &obj)); assert_true(cmp_object_is_ext(&obj)); M_BufferSeekForward(&buf, obj.as.ext.size); assert_true(cmp_read_object(&cmp, &obj)); assert_true(cmp_object_is_ext(&obj)); M_BufferSeekForward(&buf, obj.as.ext.size); assert_true(cmp_read_object(&cmp, &obj)); assert_true(cmp_object_is_ext(&obj)); M_BufferSeekForward(&buf, obj.as.ext.size); assert_true(cmp_read_object(&cmp, &obj)); assert_true(cmp_object_is_ext(&obj)); M_BufferSeekForward(&buf, obj.as.ext.size); assert_true(cmp_read_object(&cmp, &obj)); assert_false(cmp_object_is_ext(&obj)); M_BufferSeek(&buf, 0); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_FIXEXT1); assert_int_equal(obj.as.ext.type, 2); assert_int_equal(obj.as.ext.size, 1); assert_memory_equal(M_BufferGetDataAtCursor(&buf), "C", 1); M_BufferSeekForward(&buf, 1); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_FIXEXT2); assert_int_equal(obj.as.ext.type, 3); assert_int_equal(obj.as.ext.size, 2); assert_memory_equal(M_BufferGetDataAtCursor(&buf), "CC", 2); M_BufferSeekForward(&buf, 2); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_FIXEXT4); assert_int_equal(obj.as.ext.type, 4); assert_int_equal(obj.as.ext.size, 4); assert_memory_equal(M_BufferGetDataAtCursor(&buf), "CCCC", 4); M_BufferSeekForward(&buf, 4); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_FIXEXT8); assert_int_equal(obj.as.ext.type, 5); assert_int_equal(obj.as.ext.size, 8); assert_memory_equal(M_BufferGetDataAtCursor(&buf), "CCCCCCCC", 8); M_BufferSeekForward(&buf, 8); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_FIXEXT16); assert_int_equal(obj.as.ext.type, 6); assert_int_equal(obj.as.ext.size, 16); assert_memory_equal(M_BufferGetDataAtCursor(&buf), "CCCCCCCCCCCCCCCC", 16); M_BufferSeekForward(&buf, 16); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_EXT8); assert_int_equal(obj.as.ext.type, 7); assert_int_equal(obj.as.ext.size, 0x7F); assert_memory_equal(M_BufferGetDataAtCursor(&buf), buf8, 0x7F); M_BufferSeekForward(&buf, 0x7F); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_EXT16); assert_int_equal(obj.as.ext.type, 8); assert_int_equal(obj.as.ext.size, 0x7FFF); assert_memory_equal(M_BufferGetDataAtCursor(&buf), buf16, 0x7FFF); M_BufferSeekForward(&buf, 0x7FFF); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_EXT32); assert_int_equal(obj.as.ext.type, 9); assert_int_equal(obj.as.ext.size, 0x10000); assert_memory_equal(M_BufferGetDataAtCursor(&buf), buf32, 0x10000); M_BufferSeekForward(&buf, 0x100000); M_BufferSeek(&buf, 0); assert_true(cmp_read_fixext1(&cmp, &etype, outfixedbuf1)); assert_int_equal(etype, 2); assert_memory_equal(outfixedbuf1, "C", 1); assert_true(cmp_read_fixext2(&cmp, &etype, outfixedbuf2)); assert_int_equal(etype, 3); assert_memory_equal(outfixedbuf2, "CC", 2); assert_true(cmp_read_fixext4(&cmp, &etype, outfixedbuf4)); assert_int_equal(etype, 4); assert_memory_equal(outfixedbuf4, "CCCC", 4); assert_true(cmp_read_fixext8(&cmp, &etype, outfixedbuf8)); assert_int_equal(etype, 5); assert_memory_equal(outfixedbuf8, "CCCCCCCC", 8); assert_true(cmp_read_fixext16(&cmp, &etype, outfixedbuf16)); assert_int_equal(etype, 6); assert_memory_equal(outfixedbuf16, "CCCCCCCCCCCCCCCC", 16); assert_true(cmp_read_ext8(&cmp, &etype, &esize8, outbuf8)); assert_int_equal(etype, 7); assert_int_equal(esize8, 0x7F); assert_memory_equal(outbuf8, buf8, 0x7F); assert_true(cmp_read_ext16(&cmp, &etype, &esize16, outbuf16)); assert_int_equal(etype, 8); assert_int_equal(esize16, 0x7FFF); assert_memory_equal(outbuf16, buf16, 0x7FFF); assert_true(cmp_read_ext32(&cmp, &etype, &esize32, outbuf32)); assert_int_equal(etype, 9); assert_int_equal(esize32, 0x10000); assert_memory_equal(outbuf32, buf32, 16); M_BufferSeek(&buf, 0); assert_true(cmp_read_object(&cmp, &obj)); assert_true(cmp_object_as_ext(&obj, &etype, &esize32)); M_BufferSeek(&buf, 0); assert_true(cmp_write_ext_marker(&cmp, 2, 1)); assert_true(cmp_write_ext_marker(&cmp, 3, 2)); assert_true(cmp_write_ext_marker(&cmp, 4, 4)); assert_true(cmp_write_ext_marker(&cmp, 5, 8)); assert_true(cmp_write_ext_marker(&cmp, 6, 16)); assert_true(cmp_write_ext_marker(&cmp, 7, 0x7F)); assert_true(cmp_write_ext_marker(&cmp, 8, 0x7FFF)); assert_true(cmp_write_ext_marker(&cmp, 9, 0x10000)); free(buf8); free(outbuf8); free(buf16); free(outbuf16); free(buf32); free(outbuf32); teardown_cmp_and_buf(&cmp, &buf); } static void test_obj(void **state) { buf_t buf; cmp_ctx_t cmp; cmp_object_t obj; (void)state; setup_cmp_and_buf(&cmp, &buf); obj_write(cmp_write_sint, -1); obj_test(cmp_object_is_char, cmp_object_as_char, "char", int8_t, -1); obj_test(cmp_object_is_short, cmp_object_as_short, "short", int16_t, -1); obj_test(cmp_object_is_int, cmp_object_as_int, "int", int32_t, -1); obj_test(cmp_object_is_long, cmp_object_as_long, "long", int64_t, -1); obj_test( cmp_object_is_sinteger, cmp_object_as_sinteger, "sinteger", int64_t, -1 ); obj_test_not(cmp_object_is_uchar, "uchar"); obj_test_not(cmp_object_is_ushort, "ushort"); obj_test_not(cmp_object_is_uint, "uint"); obj_test_not(cmp_object_is_ulong, "ulong"); obj_test_not(cmp_object_is_uinteger, "uinteger"); obj_test_not(cmp_object_is_float, "float"); obj_test_not(cmp_object_is_double, "double"); obj_test_not(cmp_object_is_nil, "nil"); obj_test_not(cmp_object_is_bool, "bool"); obj_test_not(cmp_object_is_str, "str"); obj_test_not(cmp_object_is_bin, "bin"); obj_test_not(cmp_object_is_array, "array"); obj_test_not(cmp_object_is_map, "map"); obj_test_not(cmp_object_is_ext, "ext"); obj_write(cmp_write_sint, -129); obj_test(cmp_object_is_short, cmp_object_as_short, "short", int16_t, -129); obj_test(cmp_object_is_int, cmp_object_as_int, "int", int32_t, -129); obj_test(cmp_object_is_long, cmp_object_as_long, "long", int64_t, -129); obj_test( cmp_object_is_sinteger, cmp_object_as_sinteger, "sinteger", int64_t, -129 ); obj_test_not(cmp_object_is_char, "char"); obj_test_not(cmp_object_is_uchar, "uchar"); obj_test_not(cmp_object_is_ushort, "ushort"); obj_test_not(cmp_object_is_uint, "uint"); obj_test_not(cmp_object_is_ulong, "ulong"); obj_test_not(cmp_object_is_uinteger, "uinteger"); obj_test_not(cmp_object_is_float, "float"); obj_test_not(cmp_object_is_double, "double"); obj_test_not(cmp_object_is_nil, "nil"); obj_test_not(cmp_object_is_bool, "bool"); obj_test_not(cmp_object_is_str, "str"); obj_test_not(cmp_object_is_bin, "bin"); obj_test_not(cmp_object_is_array, "array"); obj_test_not(cmp_object_is_map, "map"); obj_test_not(cmp_object_is_ext, "ext"); obj_write(cmp_write_sint, -32769); obj_test(cmp_object_is_int, cmp_object_as_int, "int", int32_t, -32769); obj_test(cmp_object_is_long, cmp_object_as_long, "long", int64_t, -32769); obj_test( cmp_object_is_sinteger, cmp_object_as_sinteger, "sinteger", int64_t, -32769 ); obj_test_not(cmp_object_is_char, "char"); obj_test_not(cmp_object_is_short, "short"); obj_test_not(cmp_object_is_uchar, "uchar"); obj_test_not(cmp_object_is_ushort, "ushort"); obj_test_not(cmp_object_is_uint, "uint"); obj_test_not(cmp_object_is_ulong, "ulong"); obj_test_not(cmp_object_is_uinteger, "uinteger"); obj_test_not(cmp_object_is_float, "float"); obj_test_not(cmp_object_is_double, "double"); obj_test_not(cmp_object_is_nil, "nil"); obj_test_not(cmp_object_is_bool, "bool"); obj_test_not(cmp_object_is_str, "str"); obj_test_not(cmp_object_is_bin, "bin"); obj_test_not(cmp_object_is_array, "array"); obj_test_not(cmp_object_is_map, "map"); obj_test_not(cmp_object_is_ext, "ext"); obj_write(cmp_write_sint, -2147483649); obj_test( cmp_object_is_long, cmp_object_as_long, "long", int64_t, -2147483649 ); obj_test( cmp_object_is_sinteger, cmp_object_as_sinteger, "sinteger", int64_t, -2147483649 ); obj_test_not(cmp_object_is_char, "char"); obj_test_not(cmp_object_is_short, "short"); obj_test_not(cmp_object_is_int, "int"); obj_test_not(cmp_object_is_uchar, "uchar"); obj_test_not(cmp_object_is_ushort, "ushort"); obj_test_not(cmp_object_is_uint, "uint"); obj_test_not(cmp_object_is_ulong, "ulong"); obj_test_not(cmp_object_is_uinteger, "uinteger"); obj_test_not(cmp_object_is_float, "float"); obj_test_not(cmp_object_is_double, "double"); obj_test_not(cmp_object_is_nil, "nil"); obj_test_not(cmp_object_is_bool, "bool"); obj_test_not(cmp_object_is_str, "str"); obj_test_not(cmp_object_is_bin, "bin"); obj_test_not(cmp_object_is_array, "array"); obj_test_not(cmp_object_is_map, "map"); obj_test_not(cmp_object_is_ext, "ext"); obj_write(cmp_write_uint, 1); obj_test(cmp_object_is_uchar, cmp_object_as_uchar, "uchar", uint8_t, 1); obj_test(cmp_object_is_ushort, cmp_object_as_ushort, "ushort", uint16_t, 1); obj_test(cmp_object_is_uint, cmp_object_as_uint, "uint", uint32_t, 1); obj_test(cmp_object_is_ulong, cmp_object_as_ulong, "ulong", uint64_t, 1); obj_test( cmp_object_is_uinteger, cmp_object_as_uinteger, "uinteger", uint64_t, 1 ); obj_test_not(cmp_object_is_char, "char"); obj_test_not(cmp_object_is_short, "short"); obj_test_not(cmp_object_is_int, "int"); obj_test_not(cmp_object_is_long, "long"); obj_test_not(cmp_object_is_sinteger, "sinteger"); obj_test_not(cmp_object_is_float, "float"); obj_test_not(cmp_object_is_double, "double"); obj_test_not(cmp_object_is_nil, "nil"); obj_test_not(cmp_object_is_bool, "bool"); obj_test_not(cmp_object_is_str, "str"); obj_test_not(cmp_object_is_bin, "bin"); obj_test_not(cmp_object_is_array, "array"); obj_test_not(cmp_object_is_map, "map"); obj_test_not(cmp_object_is_ext, "ext"); obj_write(cmp_write_uint, 255); obj_test(cmp_object_is_uchar, cmp_object_as_uchar, "uchar", uint8_t, 255); obj_test( cmp_object_is_ushort, cmp_object_as_ushort, "ushort", uint16_t, 255 ); obj_test(cmp_object_is_uint, cmp_object_as_uint, "uint", uint32_t, 255); obj_test(cmp_object_is_ulong, cmp_object_as_ulong, "ulong", uint64_t, 255); obj_test( cmp_object_is_uinteger, cmp_object_as_uinteger, "uinteger", uint64_t, 255 ); obj_test_not(cmp_object_is_char, "char"); obj_test_not(cmp_object_is_short, "short"); obj_test_not(cmp_object_is_int, "int"); obj_test_not(cmp_object_is_long, "long"); obj_test_not(cmp_object_is_sinteger, "sinteger"); obj_test_not(cmp_object_is_float, "float"); obj_test_not(cmp_object_is_double, "double"); obj_test_not(cmp_object_is_nil, "nil"); obj_test_not(cmp_object_is_bool, "bool"); obj_test_not(cmp_object_is_str, "str"); obj_test_not(cmp_object_is_bin, "bin"); obj_test_not(cmp_object_is_array, "array"); obj_test_not(cmp_object_is_map, "map"); obj_test_not(cmp_object_is_ext, "ext"); obj_write(cmp_write_uint, 256); obj_test( cmp_object_is_ushort, cmp_object_as_ushort, "ushort", uint16_t, 256 ); obj_test(cmp_object_is_uint, cmp_object_as_uint, "uint", uint32_t, 256); obj_test(cmp_object_is_ulong, cmp_object_as_ulong, "ulong", uint64_t, 256); obj_test( cmp_object_is_uinteger, cmp_object_as_uinteger, "uinteger", uint64_t, 256 ); obj_test_not(cmp_object_is_char, "char"); obj_test_not(cmp_object_is_short, "short"); obj_test_not(cmp_object_is_int, "int"); obj_test_not(cmp_object_is_long, "long"); obj_test_not(cmp_object_is_sinteger, "sinteger"); obj_test_not(cmp_object_is_uchar, "uchar"); obj_test_not(cmp_object_is_float, "float"); obj_test_not(cmp_object_is_double, "double"); obj_test_not(cmp_object_is_nil, "nil"); obj_test_not(cmp_object_is_bool, "bool"); obj_test_not(cmp_object_is_str, "str"); obj_test_not(cmp_object_is_bin, "bin"); obj_test_not(cmp_object_is_array, "array"); obj_test_not(cmp_object_is_map, "map"); obj_test_not(cmp_object_is_ext, "ext"); obj_write(cmp_write_uint, 65535); obj_test( cmp_object_is_ushort, cmp_object_as_ushort, "ushort", uint16_t, 65535 ); obj_test(cmp_object_is_uint, cmp_object_as_uint, "uint", uint32_t, 65535); obj_test(cmp_object_is_ulong, cmp_object_as_ulong, "ulong", uint64_t, 65535); obj_test( cmp_object_is_uinteger, cmp_object_as_uinteger, "uinteger", uint64_t, 65535 ); obj_test_not(cmp_object_is_char, "char"); obj_test_not(cmp_object_is_int, "int"); obj_test_not(cmp_object_is_long, "long"); obj_test_not(cmp_object_is_sinteger, "sinteger"); obj_test_not(cmp_object_is_uchar, "uchar"); obj_test_not(cmp_object_is_float, "float"); obj_test_not(cmp_object_is_double, "double"); obj_test_not(cmp_object_is_nil, "nil"); obj_test_not(cmp_object_is_bool, "bool"); obj_test_not(cmp_object_is_str, "str"); obj_test_not(cmp_object_is_bin, "bin"); obj_test_not(cmp_object_is_array, "array"); obj_test_not(cmp_object_is_map, "map"); obj_test_not(cmp_object_is_ext, "ext"); obj_write(cmp_write_uint, 65536); obj_test(cmp_object_is_uint, cmp_object_as_uint, "uint", uint32_t, 65536); obj_test(cmp_object_is_ulong, cmp_object_as_ulong, "ulong", uint64_t, 65536); obj_test( cmp_object_is_uinteger, cmp_object_as_uinteger, "uinteger", uint64_t, 65536 ); obj_test_not(cmp_object_is_char, "char"); obj_test_not(cmp_object_is_short, "short"); obj_test_not(cmp_object_is_int, "int"); obj_test_not(cmp_object_is_long, "long"); obj_test_not(cmp_object_is_sinteger, "sinteger"); obj_test_not(cmp_object_is_uchar, "uchar"); obj_test_not(cmp_object_is_ushort, "ushort"); obj_test_not(cmp_object_is_float, "float"); obj_test_not(cmp_object_is_double, "double"); obj_test_not(cmp_object_is_nil, "nil"); obj_test_not(cmp_object_is_bool, "bool"); obj_test_not(cmp_object_is_str, "str"); obj_test_not(cmp_object_is_bin, "bin"); obj_test_not(cmp_object_is_array, "array"); obj_test_not(cmp_object_is_map, "map"); obj_test_not(cmp_object_is_ext, "ext"); obj_write(cmp_write_uint, 4294967295); obj_test( cmp_object_is_uint, cmp_object_as_uint, "uint", uint32_t, 4294967295 ); obj_test( cmp_object_is_ulong, cmp_object_as_ulong, "ulong", uint64_t, 4294967295 ); obj_test( cmp_object_is_uinteger, cmp_object_as_uinteger, "uinteger", uint64_t, 4294967295 ); obj_test_not(cmp_object_is_char, "char"); obj_test_not(cmp_object_is_short, "short"); obj_test_not(cmp_object_is_int, "int"); obj_test_not(cmp_object_is_long, "long"); obj_test_not(cmp_object_is_sinteger, "sinteger"); obj_test_not(cmp_object_is_uchar, "uchar"); obj_test_not(cmp_object_is_ushort, "ushort"); obj_test_not(cmp_object_is_float, "float"); obj_test_not(cmp_object_is_double, "double"); obj_test_not(cmp_object_is_nil, "nil"); obj_test_not(cmp_object_is_bool, "bool"); obj_test_not(cmp_object_is_str, "str"); obj_test_not(cmp_object_is_bin, "bin"); obj_test_not(cmp_object_is_array, "array"); obj_test_not(cmp_object_is_map, "map"); obj_test_not(cmp_object_is_ext, "ext"); obj_write(cmp_write_uint, 4294967296); obj_test( cmp_object_is_ulong, cmp_object_as_ulong, "ulong", uint64_t, 4294967296 ); obj_test( cmp_object_is_uinteger, cmp_object_as_uinteger, "uinteger", uint64_t, 4294967296 ); obj_test_not(cmp_object_is_char, "char"); obj_test_not(cmp_object_is_short, "short"); obj_test_not(cmp_object_is_int, "int"); obj_test_not(cmp_object_is_long, "long"); obj_test_not(cmp_object_is_sinteger, "sinteger"); obj_test_not(cmp_object_is_uchar, "uchar"); obj_test_not(cmp_object_is_ushort, "ushort"); obj_test_not(cmp_object_is_uint, "uint"); obj_test_not(cmp_object_is_float, "float"); obj_test_not(cmp_object_is_double, "double"); obj_test_not(cmp_object_is_nil, "nil"); obj_test_not(cmp_object_is_bool, "bool"); obj_test_not(cmp_object_is_str, "str"); obj_test_not(cmp_object_is_bin, "bin"); obj_test_not(cmp_object_is_array, "array"); obj_test_not(cmp_object_is_map, "map"); obj_test_not(cmp_object_is_ext, "ext"); obj_write(cmp_write_float, 1.f); obj_test(cmp_object_is_float, cmp_object_as_float, "float", float, 1.f); obj_test_not(cmp_object_is_char, "char"); obj_test_not(cmp_object_is_short, "short"); obj_test_not(cmp_object_is_int, "int"); obj_test_not(cmp_object_is_long, "long"); obj_test_not(cmp_object_is_sinteger, "sinteger"); obj_test_not(cmp_object_is_uchar, "uchar"); obj_test_not(cmp_object_is_ushort, "ushort"); obj_test_not(cmp_object_is_uint, "uint"); obj_test_not(cmp_object_is_ulong, "ulong"); obj_test_not(cmp_object_is_uinteger, "uinteger"); obj_test_not(cmp_object_is_double, "double"); obj_test_not(cmp_object_is_nil, "nil"); obj_test_not(cmp_object_is_bool, "bool"); obj_test_not(cmp_object_is_str, "str"); obj_test_not(cmp_object_is_bin, "bin"); obj_test_not(cmp_object_is_array, "array"); obj_test_not(cmp_object_is_map, "map"); obj_test_not(cmp_object_is_ext, "ext"); obj_write(cmp_write_double, 1.0); obj_test(cmp_object_is_double, cmp_object_as_double, "double", double, 1.0); obj_test_not(cmp_object_is_char, "char"); obj_test_not(cmp_object_is_short, "short"); obj_test_not(cmp_object_is_int, "int"); obj_test_not(cmp_object_is_long, "long"); obj_test_not(cmp_object_is_sinteger, "sinteger"); obj_test_not(cmp_object_is_uchar, "uchar"); obj_test_not(cmp_object_is_ushort, "ushort"); obj_test_not(cmp_object_is_uint, "uint"); obj_test_not(cmp_object_is_ulong, "ulong"); obj_test_not(cmp_object_is_uinteger, "uinteger"); obj_test_not(cmp_object_is_float, "float"); obj_test_not(cmp_object_is_nil, "nil"); obj_test_not(cmp_object_is_bool, "bool"); obj_test_not(cmp_object_is_str, "str"); obj_test_not(cmp_object_is_bin, "bin"); obj_test_not(cmp_object_is_array, "array"); obj_test_not(cmp_object_is_map, "map"); obj_test_not(cmp_object_is_ext, "ext"); obj_write_no_val(cmp_write_nil); obj_test_no_read(cmp_object_is_nil, "nil"); obj_test_not(cmp_object_is_char, "char"); obj_test_not(cmp_object_is_short, "short"); obj_test_not(cmp_object_is_int, "int"); obj_test_not(cmp_object_is_long, "long"); obj_test_not(cmp_object_is_sinteger, "sinteger"); obj_test_not(cmp_object_is_uchar, "uchar"); obj_test_not(cmp_object_is_ushort, "ushort"); obj_test_not(cmp_object_is_uint, "uint"); obj_test_not(cmp_object_is_ulong, "ulong"); obj_test_not(cmp_object_is_uinteger, "uinteger"); obj_test_not(cmp_object_is_float, "float"); obj_test_not(cmp_object_is_double, "double"); obj_test_not(cmp_object_is_bool, "bool"); obj_test_not(cmp_object_is_str, "str"); obj_test_not(cmp_object_is_bin, "bin"); obj_test_not(cmp_object_is_array, "array"); obj_test_not(cmp_object_is_map, "map"); obj_test_not(cmp_object_is_ext, "ext"); obj_write_no_val(cmp_write_true); obj_test(cmp_object_is_bool, cmp_object_as_bool, "bool", bool, true); obj_test_not(cmp_object_is_char, "char"); obj_test_not(cmp_object_is_short, "short"); obj_test_not(cmp_object_is_int, "int"); obj_test_not(cmp_object_is_long, "long"); obj_test_not(cmp_object_is_sinteger, "sinteger"); obj_test_not(cmp_object_is_uchar, "uchar"); obj_test_not(cmp_object_is_ushort, "ushort"); obj_test_not(cmp_object_is_uint, "uint"); obj_test_not(cmp_object_is_ulong, "ulong"); obj_test_not(cmp_object_is_uinteger, "uinteger"); obj_test_not(cmp_object_is_float, "float"); obj_test_not(cmp_object_is_double, "double"); obj_test_not(cmp_object_is_nil, "nil"); obj_test_not(cmp_object_is_str, "str"); obj_test_not(cmp_object_is_bin, "bin"); obj_test_not(cmp_object_is_array, "array"); obj_test_not(cmp_object_is_map, "map"); obj_test_not(cmp_object_is_ext, "ext"); obj_write_no_val(cmp_write_false); obj_test(cmp_object_is_bool, cmp_object_as_bool, "bool", bool, false); obj_test_not(cmp_object_is_char, "char"); obj_test_not(cmp_object_is_short, "short"); obj_test_not(cmp_object_is_int, "int"); obj_test_not(cmp_object_is_long, "long"); obj_test_not(cmp_object_is_sinteger, "sinteger"); obj_test_not(cmp_object_is_uchar, "uchar"); obj_test_not(cmp_object_is_ushort, "ushort"); obj_test_not(cmp_object_is_uint, "uint"); obj_test_not(cmp_object_is_ulong, "ulong"); obj_test_not(cmp_object_is_uinteger, "uinteger"); obj_test_not(cmp_object_is_float, "float"); obj_test_not(cmp_object_is_double, "double"); obj_test_not(cmp_object_is_nil, "nil"); obj_test_not(cmp_object_is_str, "str"); obj_test_not(cmp_object_is_bin, "bin"); obj_test_not(cmp_object_is_array, "array"); obj_test_not(cmp_object_is_map, "map"); obj_test_not(cmp_object_is_ext, "ext"); obj_write(cmp_write_bool, true); obj_test(cmp_object_is_bool, cmp_object_as_bool, "bool", bool, true); obj_test_not(cmp_object_is_char, "char"); obj_test_not(cmp_object_is_short, "short"); obj_test_not(cmp_object_is_int, "int"); obj_test_not(cmp_object_is_long, "long"); obj_test_not(cmp_object_is_sinteger, "sinteger"); obj_test_not(cmp_object_is_uchar, "uchar"); obj_test_not(cmp_object_is_ushort, "ushort"); obj_test_not(cmp_object_is_uint, "uint"); obj_test_not(cmp_object_is_ulong, "ulong"); obj_test_not(cmp_object_is_uinteger, "uinteger"); obj_test_not(cmp_object_is_float, "float"); obj_test_not(cmp_object_is_double, "double"); obj_test_not(cmp_object_is_nil, "nil"); obj_test_not(cmp_object_is_str, "str"); obj_test_not(cmp_object_is_bin, "bin"); obj_test_not(cmp_object_is_array, "array"); obj_test_not(cmp_object_is_map, "map"); obj_test_not(cmp_object_is_ext, "ext"); obj_write(cmp_write_bool, false); obj_test(cmp_object_is_bool, cmp_object_as_bool, "bool", bool, false); obj_test_not(cmp_object_is_char, "char"); obj_test_not(cmp_object_is_short, "short"); obj_test_not(cmp_object_is_int, "int"); obj_test_not(cmp_object_is_long, "long"); obj_test_not(cmp_object_is_sinteger, "sinteger"); obj_test_not(cmp_object_is_uchar, "uchar"); obj_test_not(cmp_object_is_ushort, "ushort"); obj_test_not(cmp_object_is_uint, "uint"); obj_test_not(cmp_object_is_ulong, "ulong"); obj_test_not(cmp_object_is_uinteger, "uinteger"); obj_test_not(cmp_object_is_float, "float"); obj_test_not(cmp_object_is_double, "double"); obj_test_not(cmp_object_is_nil, "nil"); obj_test_not(cmp_object_is_str, "str"); obj_test_not(cmp_object_is_bin, "bin"); obj_test_not(cmp_object_is_array, "array"); obj_test_not(cmp_object_is_map, "map"); obj_test_not(cmp_object_is_ext, "ext"); obj_write_len(cmp_write_str, "Hey there", 9); obj_str_test("Hey there"); obj_test_not(cmp_object_is_char, "char"); obj_test_not(cmp_object_is_short, "short"); obj_test_not(cmp_object_is_int, "int"); obj_test_not(cmp_object_is_long, "long"); obj_test_not(cmp_object_is_sinteger, "sinteger"); obj_test_not(cmp_object_is_uchar, "uchar"); obj_test_not(cmp_object_is_ushort, "ushort"); obj_test_not(cmp_object_is_uint, "uint"); obj_test_not(cmp_object_is_ulong, "ulong"); obj_test_not(cmp_object_is_uinteger, "uinteger"); obj_test_not(cmp_object_is_float, "float"); obj_test_not(cmp_object_is_double, "double"); obj_test_not(cmp_object_is_nil, "nil"); obj_test_not(cmp_object_is_bool, "bool"); obj_test_not(cmp_object_is_bin, "bin"); obj_test_not(cmp_object_is_array, "array"); obj_test_not(cmp_object_is_map, "map"); obj_test_not(cmp_object_is_ext, "ext"); // Test new cmp_object_to_str obj_write_len(cmp_write_str, "Hey there", 9); obj_to_str_test("Hey there"); obj_test_not(cmp_object_is_char, "char"); obj_test_not(cmp_object_is_short, "short"); obj_test_not(cmp_object_is_int, "int"); obj_test_not(cmp_object_is_long, "long"); obj_test_not(cmp_object_is_sinteger, "sinteger"); obj_test_not(cmp_object_is_uchar, "uchar"); obj_test_not(cmp_object_is_ushort, "ushort"); obj_test_not(cmp_object_is_uint, "uint"); obj_test_not(cmp_object_is_ulong, "ulong"); obj_test_not(cmp_object_is_uinteger, "uinteger"); obj_test_not(cmp_object_is_float, "float"); obj_test_not(cmp_object_is_double, "double"); obj_test_not(cmp_object_is_nil, "nil"); obj_test_not(cmp_object_is_bool, "bool"); obj_test_not(cmp_object_is_bin, "bin"); obj_test_not(cmp_object_is_array, "array"); obj_test_not(cmp_object_is_map, "map"); obj_test_not(cmp_object_is_ext, "ext"); obj_write_len(cmp_write_bin, "Hey there", 9); obj_bin_test("Hey there", 9); obj_test_not(cmp_object_is_char, "char"); obj_test_not(cmp_object_is_short, "short"); obj_test_not(cmp_object_is_int, "int"); obj_test_not(cmp_object_is_long, "long"); obj_test_not(cmp_object_is_sinteger, "sinteger"); obj_test_not(cmp_object_is_uchar, "uchar"); obj_test_not(cmp_object_is_ushort, "ushort"); obj_test_not(cmp_object_is_uint, "uint"); obj_test_not(cmp_object_is_ulong, "ulong"); obj_test_not(cmp_object_is_uinteger, "uinteger"); obj_test_not(cmp_object_is_float, "float"); obj_test_not(cmp_object_is_double, "double"); obj_test_not(cmp_object_is_nil, "nil"); obj_test_not(cmp_object_is_bool, "bool"); obj_test_not(cmp_object_is_str, "string"); obj_test_not(cmp_object_is_array, "array"); obj_test_not(cmp_object_is_map, "map"); obj_test_not(cmp_object_is_ext, "ext"); obj_write_len(cmp_write_bin, "Hey there", 9); obj_to_bin_test("Hey there", 9); obj_test_not(cmp_object_is_char, "char"); obj_test_not(cmp_object_is_short, "short"); obj_test_not(cmp_object_is_int, "int"); obj_test_not(cmp_object_is_long, "long"); obj_test_not(cmp_object_is_sinteger, "sinteger"); obj_test_not(cmp_object_is_uchar, "uchar"); obj_test_not(cmp_object_is_ushort, "ushort"); obj_test_not(cmp_object_is_uint, "uint"); obj_test_not(cmp_object_is_ulong, "ulong"); obj_test_not(cmp_object_is_uinteger, "uinteger"); obj_test_not(cmp_object_is_float, "float"); obj_test_not(cmp_object_is_double, "double"); obj_test_not(cmp_object_is_nil, "nil"); obj_test_not(cmp_object_is_bool, "bool"); obj_test_not(cmp_object_is_str, "string"); obj_test_not(cmp_object_is_array, "array"); obj_test_not(cmp_object_is_map, "map"); obj_test_not(cmp_object_is_ext, "ext"); M_BufferSeek(&buf, 0); cmp_write_array(&cmp, 2); cmp_write_uint(&cmp, 1); cmp_write_uint(&cmp, 2); M_BufferSeek(&buf, 0); cmp_read_object(&cmp, &obj); obj_array_test(1, 2); obj_test_not(cmp_object_is_char, "char"); obj_test_not(cmp_object_is_short, "short"); obj_test_not(cmp_object_is_int, "int"); obj_test_not(cmp_object_is_long, "long"); obj_test_not(cmp_object_is_sinteger, "sinteger"); obj_test_not(cmp_object_is_uchar, "uchar"); obj_test_not(cmp_object_is_ushort, "ushort"); obj_test_not(cmp_object_is_uint, "uint"); obj_test_not(cmp_object_is_ulong, "ulong"); obj_test_not(cmp_object_is_uinteger, "uinteger"); obj_test_not(cmp_object_is_float, "float"); obj_test_not(cmp_object_is_double, "double"); obj_test_not(cmp_object_is_nil, "nil"); obj_test_not(cmp_object_is_bool, "bool"); obj_test_not(cmp_object_is_str, "string"); obj_test_not(cmp_object_is_bin, "bin"); obj_test_not(cmp_object_is_map, "map"); obj_test_not(cmp_object_is_ext, "ext"); M_BufferSeek(&buf, 0); cmp_write_map(&cmp, 1); cmp_write_uint(&cmp, 1); cmp_write_uint(&cmp, 2); M_BufferSeek(&buf, 0); cmp_read_object(&cmp, &obj); obj_map_test(1, 2); obj_test_not(cmp_object_is_char, "char"); obj_test_not(cmp_object_is_short, "short"); obj_test_not(cmp_object_is_int, "int"); obj_test_not(cmp_object_is_long, "long"); obj_test_not(cmp_object_is_sinteger, "sinteger"); obj_test_not(cmp_object_is_uchar, "uchar"); obj_test_not(cmp_object_is_ushort, "ushort"); obj_test_not(cmp_object_is_uint, "uint"); obj_test_not(cmp_object_is_ulong, "ulong"); obj_test_not(cmp_object_is_uinteger, "uinteger"); obj_test_not(cmp_object_is_float, "float"); obj_test_not(cmp_object_is_double, "double"); obj_test_not(cmp_object_is_nil, "nil"); obj_test_not(cmp_object_is_bool, "bool"); obj_test_not(cmp_object_is_str, "string"); obj_test_not(cmp_object_is_bin, "bin"); obj_test_not(cmp_object_is_array, "array"); obj_test_not(cmp_object_is_ext, "ext"); obj.type = CMP_TYPE_NIL; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = CMP_TYPE_BOOLEAN; obj.as.boolean = true; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = CMP_TYPE_BOOLEAN; obj.as.boolean = false; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = CMP_TYPE_POSITIVE_FIXNUM; obj.as.u8 = 1; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = CMP_TYPE_POSITIVE_FIXNUM; obj.as.u8 = 1; assert_true(cmp_write_object(&cmp, &obj)); obj.type = CMP_TYPE_UINT8; obj.as.u8 = 200; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = CMP_TYPE_UINT16; obj.as.u16 = 300; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = CMP_TYPE_UINT32; obj.as.u32 = 70000; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = CMP_TYPE_UINT64; obj.as.u64 = 0x100000002; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = CMP_TYPE_NEGATIVE_FIXNUM; obj.as.s8 = -1; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = CMP_TYPE_SINT8; obj.as.s8 = -100; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = CMP_TYPE_SINT16; obj.as.s16 = -200; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = CMP_TYPE_SINT32; obj.as.s32 = -33000; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = CMP_TYPE_SINT64; obj.as.s64 = 0x100000002; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = CMP_TYPE_FLOAT; obj.as.flt = 1.1f; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = CMP_TYPE_DOUBLE; obj.as.dbl = 1.1; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = CMP_TYPE_BIN8; obj.as.bin_size = 1; assert_true(cmp_write_object(&cmp, &obj)); obj.type = CMP_TYPE_BIN16; obj.as.bin_size = 1; assert_true(cmp_write_object(&cmp, &obj)); obj.type = CMP_TYPE_BIN32; obj.as.bin_size = 1; assert_true(cmp_write_object(&cmp, &obj)); obj.type = CMP_TYPE_EXT8; obj.as.ext.type = 2; obj.as.ext.size = 2; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = CMP_TYPE_EXT16; obj.as.ext.type = 2; obj.as.ext.size = 2; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = CMP_TYPE_EXT32; obj.as.ext.type = 2; obj.as.ext.size = 2; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = CMP_TYPE_FIXEXT1; obj.as.ext.type = 2; obj.as.ext.size = 1; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = CMP_TYPE_FIXEXT2; obj.as.ext.type = 2; obj.as.ext.size = 1; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = CMP_TYPE_FIXEXT4; obj.as.ext.type = 2; obj.as.ext.size = 1; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = CMP_TYPE_FIXEXT8; obj.as.ext.type = 2; obj.as.ext.size = 1; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = CMP_TYPE_FIXEXT16; obj.as.ext.type = 2; obj.as.ext.size = 1; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = CMP_TYPE_FIXSTR; obj.as.str_size = 1; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = CMP_TYPE_STR8; obj.as.str_size = 1; assert_true(cmp_write_object(&cmp, &obj)); obj.type = CMP_TYPE_STR16; obj.as.str_size = 1; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = CMP_TYPE_STR32; obj.as.str_size = 1; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = CMP_TYPE_FIXARRAY; obj.as.array_size = 1; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = CMP_TYPE_ARRAY16; obj.as.array_size = 1; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = CMP_TYPE_ARRAY32; obj.as.array_size = 1; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = CMP_TYPE_FIXMAP; obj.as.map_size = 1; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = CMP_TYPE_MAP16; obj.as.map_size = 1; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = CMP_TYPE_MAP32; obj.as.map_size = 1; assert_true(cmp_write_object(&cmp, &obj)); assert_true(cmp_write_object_v4(&cmp, &obj)); obj.type = 100; assert_false(cmp_write_object(&cmp, &obj)); assert_false(cmp_write_object_v4(&cmp, &obj)); teardown_cmp_and_buf(&cmp, &buf); } /* Thanks to andreyvps for this test */ void test_float_flip(void **state) { buf_t buf; cmp_ctx_t cmp; float in; float out; char init[4]; char outnit[4]; (void)state; setup_cmp_and_buf(&cmp, &buf); /* * Writing and reading a float's bytes using cmp mangles one of the bytes for * certain floats. This is one of them. */ /* Specify the binary representation of a problematic float */ init[0] = -1; init[1] = -121; init[2] = -95; init[3] = -66; /* construct the float from the memory, should be -0.315490693 */ memcpy(&in, init, sizeof(in)); assert_true(cmp_write_float(&cmp, in)); /* * cmp writes the float header, then the bytes of the float in reversed order * (endianness) */ assert_int_equal(buf.data[1], init[3]); assert_int_equal(buf.data[2], init[2]); assert_int_equal(buf.data[3], init[1]); assert_int_equal(buf.data[4], init[0]); M_BufferSeek(&buf, 0); /* read in the float using cmp. */ assert_true(cmp_read_float(&cmp, &out)); memcpy(outnit, &out, sizeof(out)); /* The reader reads in exactly what was in the buffer */ assert_int_equal(buf.data[1], outnit[3]); assert_int_equal(buf.data[2], outnit[2]); assert_int_equal(buf.data[3], outnit[1]); assert_int_equal(buf.data[4], outnit[0]); /* * The reader only seems ok. The issue happens when you fiddle with the * float's bits in the first place. By the time you write, it's a "valid" * float (though has the wrong contents), so when you read it, you're reading * a seemingly ok float. When you fix the writer to write out the correct * bytes, the reader then makes the same mistake. The fix is to write the * flipped bytes to a buffer and then write that buffer out. On the read * end, you read into a buffer, then write the flipped bytes into a float. * This way, the float is never populated with invalid bytes. */ assert_true(in == out); teardown_cmp_and_buf(&cmp, &buf); } void test_skipping(void **state) { buf_t buf; cmp_ctx_t cmp; cmp_object_t obj; cmp_skipper skip; (void)state; setup_cmp_and_buf(&cmp, &buf); skip = cmp.skip; M_BufferEnsureCapacity(&buf, (66000 * 2) + 32); assert_true(cmp_write_true(&cmp)); assert_true(cmp_write_nil(&cmp)); assert_true(cmp_write_integer(&cmp, -8)); assert_true(cmp_write_array(&cmp, 10)); assert_true(cmp_write_uinteger(&cmp, 8)); assert_true(cmp_write_integer(&cmp, -120)); assert_true(cmp_write_uinteger(&cmp, 200)); assert_true(cmp_write_integer(&cmp, -32000)); assert_true(cmp_write_uinteger(&cmp, 64000)); assert_true(cmp_write_integer(&cmp, -33000)); assert_true(cmp_write_uinteger(&cmp, 66000)); assert_true(cmp_write_integer(&cmp, -2150000000)); assert_true(cmp_write_uinteger(&cmp, 4300000000)); assert_true(cmp_write_map(&cmp, 3)); assert_true(cmp_write_str(&cmp, "a", 1)); assert_true(cmp_write_str(&cmp, "apple", 5)); assert_true(cmp_write_str(&cmp, "b", 1)); assert_true(cmp_write_array(&cmp, 2)); assert_true(cmp_write_str(&cmp, "banana", 6)); assert_true(cmp_write_str(&cmp, "blackberry", 10)); assert_true(cmp_write_str(&cmp, "c", 1)); assert_true(cmp_write_str(&cmp, "coconut", 7)); assert_true(cmp_write_map(&cmp, 66000)); for (uint32_t i = 0; i < 66000; i++) { assert_true(cmp_write_integer(&cmp, 1)); assert_true(cmp_write_integer(&cmp, 1)); } assert_true(cmp_write_nil(&cmp)); M_BufferSeek(&buf, 0); assert_true(cmp_skip_object(&cmp, &obj)); cmp.skip = NULL; M_BufferSeek(&buf, 0); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); cmp.skip = skip; M_BufferSeek(&buf, 0); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); M_BufferSeek(&buf, 0); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_false(cmp_skip_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_false(cmp_skip_object_limit(&cmp, &obj, 1)); M_BufferSeek(&buf, 0); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_false(cmp_skip_object_limit(&cmp, &obj, 2)); M_BufferSeek(&buf, 0); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_limit(&cmp, &obj, 3)); M_BufferSeek(&buf, 0); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_BOOLEAN); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_NIL); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_NEGATIVE_FIXNUM); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_FIXARRAY); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_POSITIVE_FIXNUM); /* 8 */ assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_SINT8); /* -120 */ assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_UINT8); /* 200 */ assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_SINT16); /* -32000 */ assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_UINT16); /* 64000 */ assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_SINT32); /* -33000 */ assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_UINT32); /* 66000 */ assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_SINT64); /* -2150000000 */ assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_UINT64); /* 41300000000 */ assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_FIXMAP); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_FIXSTR); /* "a" */ M_BufferSeekForward(&buf, 1); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_FIXSTR); /* "apple" */ M_BufferSeekForward(&buf, 5); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_FIXSTR); /* "b" */ M_BufferSeekForward(&buf, 1); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_FIXARRAY); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_FIXSTR); /* "banana" */ M_BufferSeekForward(&buf, 6); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_FIXSTR); /* "blackberry" */ M_BufferSeekForward(&buf, 10); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_FIXSTR); /* "c" */ M_BufferSeekForward(&buf, 1); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_FIXSTR); /* "coconut" */ M_BufferSeekForward(&buf, 7); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_MAP32); M_BufferClear(&buf); assert_true(cmp_write_float(&cmp, 1.1f)); assert_true(cmp_write_double(&cmp, 1.1)); assert_true(cmp_write_fixext1(&cmp, 1, "C")); assert_true(cmp_write_fixext2(&cmp, 2, "CC")); assert_true(cmp_write_fixext4(&cmp, 3, "CCCC")); assert_true(cmp_write_fixext8(&cmp, 4, "CCCCCCCC")); assert_true(cmp_write_fixext16(&cmp, 5, "CCCCCCCCCCCCCCCC")); assert_true(cmp_write_ext8(&cmp, 6, 2, "CC")); assert_true(cmp_write_ext16(&cmp, 7, 2, "CC")); assert_true(cmp_write_ext32(&cmp, 8, 2, "CC")); assert_true(cmp_write_nil(&cmp)); assert_true(cmp_write_array32(&cmp, 4)); M_BufferSeek(&buf, 0); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_FLOAT); M_BufferSeek(&buf, 0); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_DOUBLE); M_BufferSeek(&buf, 0); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_FIXEXT1); M_BufferSeek(&buf, 0); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_FIXEXT2); M_BufferSeek(&buf, 0); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_FIXEXT4); M_BufferSeek(&buf, 0); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_FIXEXT8); M_BufferSeek(&buf, 0); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_FIXEXT16); M_BufferSeek(&buf, 0); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_FIXEXT16); M_BufferSeek(&buf, 0); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_EXT8); M_BufferSeek(&buf, 0); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_EXT16); M_BufferSeek(&buf, 0); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_EXT32); M_BufferSeek(&buf, 0); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_NIL); M_BufferSeek(&buf, 0); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_skip_object_no_limit(&cmp)); assert_true(cmp_read_object(&cmp, &obj)); assert_int_equal(obj.type, CMP_TYPE_ARRAY32); teardown_cmp_and_buf(&cmp, &buf); } void test_errors(void **state) { buf_t buf; cmp_ctx_t cmp; cmp_object_t obj; uint8_t u8; uint16_t u16; uint32_t u32; uint64_t u64; int8_t s8; int16_t s16; int32_t s32; int64_t s64; float f; double d; uint32_t size; int8_t type; char *bin8 = malloc(200); char *bin16 = malloc(300); char *bin32 = malloc(70000); char *str8 = malloc(201); char *str16 = malloc(301); char *str32 = malloc(70001); char *ext8 = malloc(0x7F); char *ext16 = malloc(0x7FFF); char *ext32 = malloc(0x10000); (void)state; setup_cmp_and_buf(&cmp, &buf); *(str8 + 200) = '\0'; *(str16 + 300) = '\0'; *(str32 + 70000) = '\0'; assert_true(cmp_write_nil(&cmp)); assert_true(cmp_write_true(&cmp)); assert_true(cmp_write_false(&cmp)); assert_true(cmp_write_uinteger(&cmp, 1)); assert_true(cmp_write_uinteger(&cmp, 200)); assert_true(cmp_write_uinteger(&cmp, 300)); assert_true(cmp_write_uinteger(&cmp, 70000)); assert_true(cmp_write_uinteger(&cmp, 0x100000002)); assert_true(cmp_write_integer(&cmp, -1)); assert_true(cmp_write_integer(&cmp, -100)); assert_true(cmp_write_integer(&cmp, -200)); assert_true(cmp_write_integer(&cmp, -33000)); assert_true(cmp_write_integer(&cmp, 0x80000002)); assert_true(cmp_write_float(&cmp, 1.1f)); assert_true(cmp_write_double(&cmp, 1.1)); assert_true(cmp_write_map(&cmp, 1)); assert_true(cmp_write_str(&cmp, "a", 1)); assert_true(cmp_write_str(&cmp, "apple", 5)); assert_true(cmp_write_map(&cmp, 0x100)); for (size_t i = 0; i < 0x100; i++) { assert_true(cmp_write_integer(&cmp, 1)); assert_true(cmp_write_integer(&cmp, 1)); } assert_true(cmp_write_map(&cmp, 0x10000)); for (size_t i = 0; i < 0x10000; i++) { assert_true(cmp_write_integer(&cmp, 1)); assert_true(cmp_write_integer(&cmp, 1)); } assert_true(cmp_write_array(&cmp, 2)); assert_true(cmp_write_str(&cmp, "banana", 6)); assert_true(cmp_write_str(&cmp, "blackberry", 10)); assert_true(cmp_write_array(&cmp, 0x100)); for (size_t i = 0; i < 0x100; i++) { assert_true(cmp_write_integer(&cmp, 1)); } assert_true(cmp_write_array(&cmp, 0x10000)); for (size_t i = 0; i < 0x10000; i++) { assert_true(cmp_write_integer(&cmp, 1)); } assert_true(cmp_write_bin(&cmp, bin8, 200)); assert_true(cmp_write_bin(&cmp, bin16, 300)); assert_true(cmp_write_bin(&cmp, bin32, 70000)); assert_true(cmp_write_str(&cmp, str8, 200)); assert_true(cmp_write_str(&cmp, str16, 300)); assert_true(cmp_write_str(&cmp, str32, 70000)); assert_true(cmp_write_ext(&cmp, 2, 1, "C")); assert_true(cmp_write_ext(&cmp, 3, 2, "CC")); assert_true(cmp_write_ext(&cmp, 4, 4, "CCCC")); assert_true(cmp_write_ext(&cmp, 5, 8, "CCCCCCCC")); assert_true(cmp_write_ext(&cmp, 6, 16, "CCCCCCCCCCCCCCCC")); assert_true(cmp_write_ext(&cmp, 7, 0x7F, ext8)); assert_true(cmp_write_ext(&cmp, 8, 0x7FFF, ext16)); assert_true(cmp_write_ext(&cmp, 9, 0x10000, ext32)); M_BufferClear(&buf); writer_successes = 0; assert_false(cmp_write_nil(&cmp)); assert_false(cmp_write_true(&cmp)); assert_false(cmp_write_false(&cmp)); assert_false(cmp_write_uinteger(&cmp, 1)); assert_false(cmp_write_uinteger(&cmp, 200)); assert_false(cmp_write_uinteger(&cmp, 300)); assert_false(cmp_write_uinteger(&cmp, 70000)); assert_false(cmp_write_uinteger(&cmp, 0x100000002)); assert_false(cmp_write_integer(&cmp, -1)); assert_false(cmp_write_integer(&cmp, -100)); assert_false(cmp_write_integer(&cmp, -200)); assert_false(cmp_write_integer(&cmp, -33000)); assert_false(cmp_write_integer(&cmp, 0x80000002)); assert_false(cmp_write_float(&cmp, 1.1f)); assert_false(cmp_write_double(&cmp, 1.1)); assert_false(cmp_write_map(&cmp, 1)); assert_false(cmp_write_str(&cmp, "a", 1)); assert_false(cmp_write_str(&cmp, "apple", 5)); assert_false(cmp_write_map(&cmp, 0x100)); for (size_t i = 0; i < 0x100; i++) { assert_false(cmp_write_integer(&cmp, 1)); assert_false(cmp_write_integer(&cmp, 1)); } assert_false(cmp_write_map(&cmp, 0x10000)); for (size_t i = 0; i < 0x10000; i++) { assert_false(cmp_write_integer(&cmp, 1)); assert_false(cmp_write_integer(&cmp, 1)); } assert_false(cmp_write_array(&cmp, 2)); assert_false(cmp_write_str(&cmp, "banana", 6)); assert_false(cmp_write_str(&cmp, "blackberry", 10)); assert_false(cmp_write_array(&cmp, 0x100)); for (size_t i = 0; i < 0x100; i++) { assert_false(cmp_write_integer(&cmp, 1)); } assert_false(cmp_write_array(&cmp, 0x10000)); for (size_t i = 0; i < 0x10000; i++) { assert_false(cmp_write_integer(&cmp, 1)); } assert_false(cmp_write_bin(&cmp, bin8, 200)); assert_false(cmp_write_bin(&cmp, bin16, 300)); assert_false(cmp_write_bin(&cmp, bin32, 70000)); assert_false(cmp_write_str(&cmp, str8, 200)); assert_false(cmp_write_str(&cmp, str16, 300)); assert_false(cmp_write_str(&cmp, str32, 70000)); assert_false(cmp_write_ext(&cmp, 2, 1, "C")); assert_false(cmp_write_ext(&cmp, 3, 2, "CC")); assert_false(cmp_write_ext(&cmp, 4, 4, "CCCC")); assert_false(cmp_write_ext(&cmp, 5, 8, "CCCCCCCC")); assert_false(cmp_write_ext(&cmp, 6, 16, "CCCCCCCCCCCCCCCC")); assert_false(cmp_write_ext(&cmp, 7, 0x7F, ext8)); assert_false(cmp_write_ext(&cmp, 8, 0x7FFF, ext16)); assert_false(cmp_write_ext(&cmp, 9, 0x10000, ext32)); M_BufferClear(&buf); writer_successes = 1; assert_false(cmp_write_uinteger(&cmp, 200)); writer_successes = 1; assert_false(cmp_write_uinteger(&cmp, 300)); writer_successes = 1; assert_false(cmp_write_uinteger(&cmp, 70000)); writer_successes = 1; assert_false(cmp_write_uinteger(&cmp, 0x100000002)); writer_successes = 1; assert_false(cmp_write_integer(&cmp, -100)); writer_successes = 1; assert_false(cmp_write_integer(&cmp, -200)); writer_successes = 1; assert_false(cmp_write_integer(&cmp, -33000)); writer_successes = 1; assert_false(cmp_write_integer(&cmp, 0xFFFFFFFF2)); writer_successes = 1; assert_false(cmp_write_float(&cmp, 1.1f)); writer_successes = 1; assert_false(cmp_write_double(&cmp, 1.1)); writer_successes = 1; assert_false(cmp_write_str(&cmp, "a", 1)); writer_successes = 1; assert_false(cmp_write_str(&cmp, "apple", 5)); writer_successes = 1; assert_false(cmp_write_map(&cmp, 0x100)); writer_successes = 1; assert_false(cmp_write_map(&cmp, 0x10000)); writer_successes = 1; assert_false(cmp_write_str(&cmp, "banana", 6)); writer_successes = 1; assert_false(cmp_write_str(&cmp, "blackberry", 10)); writer_successes = 1; assert_false(cmp_write_array(&cmp, 0x100)); writer_successes = 1; assert_false(cmp_write_array(&cmp, 0x10000)); writer_successes = 1; assert_false(cmp_write_bin(&cmp, bin8, 200)); writer_successes = 1; assert_false(cmp_write_bin(&cmp, bin16, 300)); writer_successes = 1; assert_false(cmp_write_bin(&cmp, bin32, 70000)); writer_successes = 1; assert_false(cmp_write_str(&cmp, str8, 200)); writer_successes = 1; assert_false(cmp_write_str(&cmp, str16, 300)); writer_successes = 1; assert_false(cmp_write_str(&cmp, str32, 70000)); writer_successes = 1; assert_false(cmp_write_ext(&cmp, 2, 1, "C")); writer_successes = 1; assert_false(cmp_write_ext(&cmp, 3, 2, "CC")); writer_successes = 1; assert_false(cmp_write_ext(&cmp, 4, 4, "CCCC")); writer_successes = 1; assert_false(cmp_write_ext(&cmp, 5, 8, "CCCCCCCC")); writer_successes = 1; assert_false(cmp_write_ext(&cmp, 6, 16, "CCCCCCCCCCCCCCCC")); writer_successes = 1; assert_false(cmp_write_ext(&cmp, 7, 0x7F, ext8)); writer_successes = 1; assert_false(cmp_write_ext(&cmp, 8, 0x7FFF, ext16)); writer_successes = 1; assert_false(cmp_write_ext(&cmp, 9, 0x10000, ext32)); M_BufferClear(&buf); writer_successes = 2; assert_false(cmp_write_bin(&cmp, bin8, 200)); writer_successes = 2; assert_false(cmp_write_bin(&cmp, bin16, 300)); writer_successes = 2; assert_false(cmp_write_bin(&cmp, bin32, 70000)); writer_successes = 2; assert_false(cmp_write_str(&cmp, str8, 200)); writer_successes = 2; assert_false(cmp_write_str(&cmp, str16, 300)); writer_successes = 2; assert_false(cmp_write_str(&cmp, str32, 70000)); writer_successes = 2; assert_false(cmp_write_ext(&cmp, 2, 1, "C")); writer_successes = 2; assert_false(cmp_write_ext(&cmp, 3, 2, "CC")); writer_successes = 2; assert_false(cmp_write_ext(&cmp, 4, 4, "CCCC")); writer_successes = 2; assert_false(cmp_write_ext(&cmp, 5, 8, "CCCCCCCC")); writer_successes = 2; assert_false(cmp_write_ext(&cmp, 6, 16, "CCCCCCCCCCCCCCCC")); writer_successes = 2; assert_false(cmp_write_ext(&cmp, 7, 0x7F, ext8)); writer_successes = 2; assert_false(cmp_write_ext(&cmp, 8, 0x7FFF, ext16)); writer_successes = 2; assert_false(cmp_write_ext(&cmp, 9, 0x10000, ext32)); writer_successes = -1; reader_successes = 0; M_BufferSeek(&buf, 0); assert_true(cmp_write_nil(&cmp)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_true(&cmp)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_false(&cmp)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_uinteger(&cmp, 1)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_uinteger(&cmp, 200)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_uinteger(&cmp, 300)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_uinteger(&cmp, 70000)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_uinteger(&cmp, 0x100000002)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_integer(&cmp, -1)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_integer(&cmp, -100)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_integer(&cmp, -200)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_integer(&cmp, -33000)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_integer(&cmp, 0x80000002)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_float(&cmp, 1.1f)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_double(&cmp, 1.1)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_map(&cmp, 1)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_str(&cmp, "a", 1)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_str(&cmp, "apple", 5)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_map(&cmp, 0x100)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_map(&cmp, 0x10000)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_array(&cmp, 2)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_str(&cmp, "banana", 6)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_str(&cmp, "blackberry", 10)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_array(&cmp, 0x100)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_bin(&cmp, bin8, 200)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_bin(&cmp, bin16, 300)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_bin(&cmp, bin32, 70000)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_str(&cmp, str8, 200)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_str(&cmp, str16, 300)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_str(&cmp, str32, 70000)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_ext(&cmp, 2, 1, "C")); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_ext(&cmp, 3, 2, "CC")); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_ext(&cmp, 4, 4, "CCCC")); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_ext(&cmp, 5, 8, "CCCCCCCC")); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_ext(&cmp, 6, 16, "CCCCCCCCCCCCCCCC")); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_ext(&cmp, 7, 0x7F, ext8)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_ext(&cmp, 8, 0x7FFF, ext16)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_ext(&cmp, 9, 0x10000, ext32)); M_BufferSeek(&buf, 0); assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_uinteger(&cmp, 200)); M_BufferSeek(&buf, 0); reader_successes = 1; assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_uinteger(&cmp, 300)); M_BufferSeek(&buf, 0); reader_successes = 1; assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_uinteger(&cmp, 70000)); M_BufferSeek(&buf, 0); reader_successes = 1; assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_uinteger(&cmp, 0x100000002)); M_BufferSeek(&buf, 0); reader_successes = 1; assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_integer(&cmp, -100)); M_BufferSeek(&buf, 0); reader_successes = 1; assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_integer(&cmp, -200)); M_BufferSeek(&buf, 0); reader_successes = 1; assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_integer(&cmp, -33000)); M_BufferSeek(&buf, 0); reader_successes = 1; assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_integer(&cmp, 0x80000002)); M_BufferSeek(&buf, 0); reader_successes = 1; assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_float(&cmp, 1.1f)); M_BufferSeek(&buf, 0); reader_successes = 1; assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_double(&cmp, 1.1)); M_BufferSeek(&buf, 0); reader_successes = 1; assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_map(&cmp, 0x100)); M_BufferSeek(&buf, 0); reader_successes = 1; assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_map(&cmp, 0x10000)); M_BufferSeek(&buf, 0); reader_successes = 1; assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_array(&cmp, 0x100)); M_BufferSeek(&buf, 0); reader_successes = 1; assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_bin(&cmp, bin8, 200)); M_BufferSeek(&buf, 0); reader_successes = 1; assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_bin(&cmp, bin16, 300)); M_BufferSeek(&buf, 0); reader_successes = 1; assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_bin(&cmp, bin32, 70000)); M_BufferSeek(&buf, 0); reader_successes = 1; assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_str(&cmp, str8, 200)); M_BufferSeek(&buf, 0); reader_successes = 1; assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_str(&cmp, str16, 300)); M_BufferSeek(&buf, 0); reader_successes = 1; assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_str(&cmp, str32, 70000)); M_BufferSeek(&buf, 0); reader_successes = 1; assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_ext(&cmp, 2, 1, "C")); M_BufferSeek(&buf, 0); reader_successes = 1; assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_ext(&cmp, 3, 2, "CC")); M_BufferSeek(&buf, 0); reader_successes = 1; assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_ext(&cmp, 4, 4, "CCCC")); M_BufferSeek(&buf, 0); reader_successes = 1; assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_ext(&cmp, 5, 8, "CCCCCCCC")); M_BufferSeek(&buf, 0); reader_successes = 1; assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_ext(&cmp, 6, 16, "CCCCCCCCCCCCCCCC")); M_BufferSeek(&buf, 0); reader_successes = 1; assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_ext(&cmp, 7, 0x7F, ext8)); M_BufferSeek(&buf, 0); reader_successes = 1; assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_ext(&cmp, 8, 0x7FFF, ext16)); M_BufferSeek(&buf, 0); reader_successes = 1; assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_ext(&cmp, 9, 0x10000, ext32)); M_BufferSeek(&buf, 0); reader_successes = 1; assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_ext(&cmp, 7, 0x7F, ext8)); M_BufferSeek(&buf, 0); reader_successes = 2; assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_ext(&cmp, 8, 0x7FFF, ext16)); M_BufferSeek(&buf, 0); reader_successes = 2; assert_false(cmp_read_object(&cmp, &obj)); M_BufferSeek(&buf, 0); assert_true(cmp_write_ext(&cmp, 9, 0x10000, ext32)); M_BufferSeek(&buf, 0); reader_successes = 2; assert_false(cmp_read_object(&cmp, &obj)); writer_successes = -1; reader_successes = 0; M_BufferSeek(&buf, 0); assert_true(cmp_write_sfix(&cmp, 1)); M_BufferSeek(&buf, 0); assert_false(cmp_read_sfix(&cmp, &s8)); M_BufferSeek(&buf, 0); assert_true(cmp_write_sfix(&cmp, -1)); M_BufferSeek(&buf, 0); assert_false(cmp_read_sfix(&cmp, &s8)); M_BufferSeek(&buf, 0); assert_true(cmp_write_pfix(&cmp, 1)); M_BufferSeek(&buf, 0); assert_false(cmp_read_pfix(&cmp, &u8)); M_BufferSeek(&buf, 0); assert_true(cmp_write_u8(&cmp, 200)); M_BufferSeek(&buf, 0); assert_false(cmp_read_u8(&cmp, &u8)); M_BufferSeek(&buf, 0); assert_true(cmp_write_u16(&cmp, 300)); M_BufferSeek(&buf, 0); assert_false(cmp_read_u16(&cmp, &u16)); M_BufferSeek(&buf, 0); assert_true(cmp_write_u32(&cmp, 70000)); M_BufferSeek(&buf, 0); assert_false(cmp_read_u32(&cmp, &u32)); M_BufferSeek(&buf, 0); assert_true(cmp_write_u64(&cmp, 0x100000002)); M_BufferSeek(&buf, 0); assert_false(cmp_read_u64(&cmp, &u64)); M_BufferSeek(&buf, 0); assert_true(cmp_write_nfix(&cmp, -1)); M_BufferSeek(&buf, 0); assert_false(cmp_read_nfix(&cmp, &s8)); M_BufferSeek(&buf, 0); assert_true(cmp_write_s8(&cmp, -100)); M_BufferSeek(&buf, 0); assert_false(cmp_read_s8(&cmp, &s8)); M_BufferSeek(&buf, 0); assert_true(cmp_write_s16(&cmp, -200)); M_BufferSeek(&buf, 0); assert_false(cmp_read_s16(&cmp, &s16)); M_BufferSeek(&buf, 0); assert_true(cmp_write_s32(&cmp, -33000)); M_BufferSeek(&buf, 0); assert_false(cmp_read_s32(&cmp, &s32)); M_BufferSeek(&buf, 0); assert_true(cmp_write_s64(&cmp, 0x80000002)); M_BufferSeek(&buf, 0); assert_false(cmp_read_s64(&cmp, &s64)); M_BufferSeek(&buf, 0); assert_true(cmp_write_float(&cmp, 1.1f)); M_BufferSeek(&buf, 0); assert_false(cmp_read_float(&cmp, &f)); M_BufferSeek(&buf, 0); assert_true(cmp_write_double(&cmp, 1.1)); M_BufferSeek(&buf, 0); assert_false(cmp_read_double(&cmp, &d)); writer_successes = 1; M_BufferSeek(&buf, 0); assert_false(cmp_write_u8(&cmp, 200)); M_BufferSeek(&buf, 0); assert_false(cmp_write_u16(&cmp, 300)); M_BufferSeek(&buf, 0); assert_false(cmp_write_u32(&cmp, 70000)); M_BufferSeek(&buf, 0); assert_false(cmp_write_u64(&cmp, 0x100000002)); M_BufferSeek(&buf, 0); assert_false(cmp_write_nfix(&cmp, -1)); M_BufferSeek(&buf, 0); assert_false(cmp_write_s8(&cmp, -100)); M_BufferSeek(&buf, 0); assert_false(cmp_write_s16(&cmp, -200)); M_BufferSeek(&buf, 0); assert_false(cmp_write_s32(&cmp, -33000)); M_BufferSeek(&buf, 0); assert_false(cmp_write_s64(&cmp, 0x80000002)); M_BufferSeek(&buf, 0); assert_false(cmp_write_float(&cmp, 1.1f)); M_BufferSeek(&buf, 0); assert_false(cmp_write_double(&cmp, 1.1)); reader_successes = -1; M_BufferClear(&buf); writer_successes = 1; assert_false(cmp_write_u8(&cmp, 200)); M_BufferSeek(&buf, 0); assert_false(cmp_read_u8(&cmp, &u8)); M_BufferClear(&buf); writer_successes = 1; assert_false(cmp_write_u16(&cmp, 300)); M_BufferSeek(&buf, 0); assert_false(cmp_read_u16(&cmp, &u16)); M_BufferClear(&buf); writer_successes = 1; assert_false(cmp_write_u32(&cmp, 70000)); M_BufferSeek(&buf, 0); assert_false(cmp_read_u32(&cmp, &u32)); M_BufferClear(&buf); writer_successes = 1; assert_false(cmp_write_u64(&cmp, 0x100000002)); M_BufferSeek(&buf, 0); assert_false(cmp_read_u64(&cmp, &u64)); M_BufferClear(&buf); writer_successes = 1; assert_false(cmp_write_s8(&cmp, -100)); M_BufferSeek(&buf, 0); assert_false(cmp_read_s8(&cmp, &s8)); M_BufferClear(&buf); writer_successes = 1; assert_false(cmp_write_s16(&cmp, -200)); M_BufferSeek(&buf, 0); assert_false(cmp_read_s16(&cmp, &s16)); M_BufferClear(&buf); writer_successes = 1; assert_false(cmp_write_s32(&cmp, -33000)); M_BufferSeek(&buf, 0); assert_false(cmp_read_s32(&cmp, &s32)); M_BufferClear(&buf); writer_successes = 1; assert_false(cmp_write_s64(&cmp, 0x80000002)); M_BufferSeek(&buf, 0); assert_false(cmp_read_s64(&cmp, &s64)); M_BufferClear(&buf); writer_successes = 1; assert_false(cmp_write_float(&cmp, 1.1f)); M_BufferSeek(&buf, 0); assert_false(cmp_read_float(&cmp, &f)); M_BufferClear(&buf); writer_successes = 1; assert_false(cmp_write_double(&cmp, 1.1)); M_BufferSeek(&buf, 0); assert_false(cmp_read_double(&cmp, &d)); writer_successes = -1; reader_successes = -1; M_BufferClear(&buf); assert_true(cmp_write_u16(&cmp, 300)); M_BufferSeek(&buf, 0); assert_false(cmp_read_sfix(&cmp, &s8)); M_BufferClear(&buf); assert_true(cmp_write_pfix(&cmp, 1)); M_BufferSeek(&buf, 0); assert_true(cmp_read_pfix(&cmp, &u8)); M_BufferSeek(&buf, 0); assert_false(cmp_read_u8(&cmp, &u8)); M_BufferSeek(&buf, 0); assert_false(cmp_read_u16(&cmp, &u16)); M_BufferSeek(&buf, 0); assert_false(cmp_read_u32(&cmp, &u32)); M_BufferSeek(&buf, 0); assert_false(cmp_read_u64(&cmp, &u64)); M_BufferSeek(&buf, 0); assert_false(cmp_read_nfix(&cmp, &s8)); M_BufferSeek(&buf, 0); assert_false(cmp_read_s8(&cmp, &s8)); M_BufferSeek(&buf, 0); assert_false(cmp_read_s16(&cmp, &s16)); M_BufferSeek(&buf, 0); assert_false(cmp_read_s32(&cmp, &s32)); M_BufferSeek(&buf, 0); assert_false(cmp_read_s64(&cmp, &s64)); M_BufferSeek(&buf, 0); assert_false(cmp_read_float(&cmp, &f)); M_BufferSeek(&buf, 0); assert_false(cmp_read_double(&cmp, &d)); M_BufferSeek(&buf, 0); assert_false(cmp_read_str_size(&cmp, &size)); M_BufferSeek(&buf, 0); assert_false(cmp_read_str(&cmp, NULL, &size)); M_BufferSeek(&buf, 0); assert_false(cmp_read_bin_size(&cmp, &size)); M_BufferSeek(&buf, 0); assert_false(cmp_read_bin(&cmp, NULL, &size)); M_BufferSeek(&buf, 0); assert_false(cmp_read_array(&cmp, &size)); M_BufferSeek(&buf, 0); assert_false(cmp_read_map(&cmp, &size)); M_BufferSeek(&buf, 0); assert_false(cmp_read_ext_marker(&cmp, &type, &size)); M_BufferSeek(&buf, 0); assert_false(cmp_read_ext(&cmp, &type, &size, NULL)); M_BufferClear(&buf); assert_true(cmp_write_s8(&cmp, -1)); assert_true(cmp_write_s8(&cmp, -100)); assert_true(cmp_write_s8(&cmp, 100)); assert_true(cmp_write_s16(&cmp, -200)); assert_true(cmp_write_s32(&cmp, -33000)); assert_true(cmp_write_s64(&cmp, 0xFFFFFFFFF)); assert_true(cmp_write_u8(&cmp, 1)); assert_true(cmp_write_u8(&cmp, 200)); assert_true(cmp_write_u16(&cmp, 300)); assert_true(cmp_write_u32(&cmp, 70000)); assert_true(cmp_write_u64(&cmp, 0xFFFFFFFFF)); assert_true(cmp_write_decimal(&cmp, 1.1f)); assert_true(cmp_write_decimal(&cmp, 1.1)); M_BufferSeek(&buf, 0); assert_true(cmp_read_char(&cmp, &s8)); assert_true(cmp_read_char(&cmp, &s8)); assert_true(cmp_read_char(&cmp, &s8)); assert_true(cmp_read_short(&cmp, &s16)); assert_true(cmp_read_int(&cmp, &s32)); assert_true(cmp_read_long(&cmp, &s64)); assert_true(cmp_read_uchar(&cmp, &u8)); assert_true(cmp_read_uchar(&cmp, &u8)); assert_true(cmp_read_ushort(&cmp, &u16)); assert_true(cmp_read_uint(&cmp, &u32)); assert_true(cmp_read_ulong(&cmp, &u64)); assert_true(cmp_read_decimal(&cmp, &d)); assert_true(cmp_read_decimal(&cmp, &d)); M_BufferClear(&buf); assert_true(cmp_write_nfix(&cmp, -1)); M_BufferSeek(&buf, 0); assert_true(cmp_read_nfix(&cmp, &s8)); M_BufferSeek(&buf, 0); assert_false(cmp_read_pfix(&cmp, &u8)); free(bin8); free(bin16); free(bin32); free(str8); free(str16); free(str32); free(ext8); free(ext16); free(ext32); teardown_cmp_and_buf(&cmp, &buf); } void test_version(void **state) { uint32_t version = cmp_version(); uint32_t mp_version = cmp_mp_version(); (void)state; (void)version; (void)mp_version; } int main(void) { /* Use the old CMocka API because Travis' latest Ubuntu is Trusty */ const UnitTest tests[16] = { unit_test(test_msgpack), unit_test(test_fixedint), unit_test(test_numbers), unit_test(test_nil), unit_test(test_boolean), unit_test(test_bin), unit_test(test_string), unit_test(test_array), unit_test(test_map), unit_test(test_ext), unit_test(test_obj), unit_test(test_float_flip), unit_test(test_skipping), unit_test(test_errors), unit_test(test_version), unit_test(test_conversions), }; if (run_tests(tests)) { return EXIT_FAILURE; } return EXIT_SUCCESS; } /* vi: set et ts=2 sw=2: */ MoarVM-2018.03/3rdparty/cmp/test/utils.c0000644000175000017510000000316513252357721020031 0ustar samanthasamantha/* The MIT License (MIT) Copyright (c) 2017 Charles Gunyon Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include #include #include #include #include #include "utils.h" void error_and_exit(const char *msg) { fprintf(stderr, "%s\n", msg); exit(EXIT_FAILURE); } void errorf_and_exit(const char *msg, ...) { va_list args; va_start(args, msg); vfprintf(stderr, msg, args); va_end(args); exit(EXIT_FAILURE); } char* _strdup(const char *s) { char *out = calloc(strlen(s) + 1, sizeof(char)); strcpy(out, s); return out; } /* vi: set et ts=2 sw=2: */ MoarVM-2018.03/3rdparty/cmp/test/utils.h0000644000175000017510000000276113252357721020037 0ustar samanthasamantha/* The MIT License (MIT) Copyright (c) 2017 Charles Gunyon Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef UTILS_H__ #define UTILS_H__ void error_and_exit(const char *msg); #ifdef __GNUC__ void errorf_and_exit(const char *msg, ...) __attribute__ ((format (printf, 1, 2))); #else void errorf_and_exit(const char *msg, ...); #endif char* _strdup(const char *s); #ifndef strdup #define strdup _strdup #endif #ifndef MAX #define MAX(a,b) ((a)>(b)?(a):(b)) #endif #ifndef MIN #define MIN(a,b) ((a)<(b)?(a):(b)) #endif #endif